From 870fdf9824fd92ad82672b14c51a20117d42dbd2 Mon Sep 17 00:00:00 2001 From: changfubai Date: Thu, 28 Oct 2021 17:52:04 +0800 Subject: [PATCH 0001/3019] =?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 --- ...03\345\221\250\346\234\253\346\200\273\347\273\223.md" | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20201224\350\264\252\345\277\203\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20201224\350\264\252\345\277\203\345\221\250\346\234\253\346\200\273\347\273\223.md" index 097ae9edd7..1bc3924751 100644 --- "a/problems/\345\221\250\346\200\273\347\273\223/20201224\350\264\252\345\277\203\345\221\250\346\234\253\346\200\273\347\273\223.md" +++ "b/problems/\345\221\250\346\200\273\347\273\223/20201224\350\264\252\345\277\203\345\221\250\346\234\253\346\200\273\347\273\223.md" @@ -6,7 +6,7 @@ 在[贪心算法:用最少数量的箭引爆气球](https://programmercarl.com/0452.用最少数量的箭引爆气球.html)中,我们开始讲解了重叠区间问题,用最少的弓箭射爆所有气球,其本质就是找到最大的重叠区间。 -按照左边界经行排序后,如果气球重叠了,重叠气球中右边边界的最小值 之前的区间一定需要一个弓箭 +按照左边界进行排序后,如果气球重叠了,重叠气球中右边边界的最小值 之前的区间一定需要一个弓箭 如图: @@ -28,7 +28,7 @@ 弓箭的数量就相当于是非交叉区间的数量,只要把弓箭那道题目代码里射爆气球的判断条件加个等号(认为[0,1][1,2]不是相邻区间),然后用总区间数减去弓箭数量 就是要移除的区间数量了。 -把[贪心算法:用最少数量的箭引爆气球](https://programmercarl.com/0452.用最少数量的箭引爆气球.html)代码稍做修改,别可以AC本题。 +把[贪心算法:用最少数量的箭引爆气球](https://programmercarl.com/0452.用最少数量的箭引爆气球.html)代码稍做修改,就可以AC本题。 修改后的C++代码如下: ```CPP @@ -60,7 +60,7 @@ public: [贪心算法:划分字母区间](https://programmercarl.com/0763.划分字母区间.html)中我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。 -这道题目leetcode上标的是贪心,其实我不认识是贪心,因为没感受到局部最优和全局最优的关系。 +这道题目leetcode上标的是贪心,其实我不认为是贪心,因为没感受到局部最优和全局最优的关系。 但不影响这是一道好题,思路很不错,**通过字符出现最远距离取并集的方法,把出现过的字符都圈到一个区间里**。 @@ -91,7 +91,7 @@ public: ## 总结 -本周的主题就是用贪心算法来解决区间问题,进过本周的学习,大家应该对区间的各种合并分割有一定程度的了解了。 +本周的主题就是用贪心算法来解决区间问题,经过本周的学习,大家应该对区间的各种合并分割有一定程度的了解了。 其实很多区间的合并操作看起来都是常识,其实贪心算法有时候就是常识,哈哈,但也别小看了贪心算法。 From a8ef4fe6eeea4869dac2361566e3ed11e3d8d6a6 Mon Sep 17 00:00:00 2001 From: hailincai Date: Fri, 29 Oct 2021 08:16:18 -0400 Subject: [PATCH 0002/3019] =?UTF-8?q?Update=200104.=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=A0=91=E7=9A=84=E6=9C=80=E5=A4=A7=E6=B7=B1=E5=BA=A6.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 增加559N Java 递归方法 --- ...200\345\244\247\346\267\261\345\272\246.md" | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git "a/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" "b/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" index e20f147fe7..ff7cbfd1bf 100644 --- "a/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" +++ "b/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" @@ -312,6 +312,24 @@ class solution { ``` ### 559.n叉树的最大深度 +```java +class Solution { + /*递归法,后序遍历求root节点的高度*/ + public int maxDepth(Node root) { + if (root == null) return 0; + + int depth = 0; + if (root.children != null){ + for (Node child : root.children){ + depth = Math.max(depth, maxDepth(child)); + } + } + + return depth + 1; //中节点 + } +} +``` + ```java class solution { /** From 50b63f844131e703e2191cfa0442394079092708 Mon Sep 17 00:00:00 2001 From: konng Date: Sun, 31 Oct 2021 13:19:47 +0800 Subject: [PATCH 0003/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20golang=20?= =?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=A0=91=E9=81=8D=E5=8E=86=E7=9A=84=E6=89=80?= =?UTF-8?q?=E6=9C=89=E4=BB=A3=E7=A0=81=EF=BC=8C=E7=BD=AE=E6=8D=A2=E4=B8=BA?= =?UTF-8?q?=E5=92=8C=20c++=20=E6=A8=A1=E6=9D=BF=E7=9B=B8=E5=90=8C=E7=9A=84?= =?UTF-8?q?=E9=80=BB=E8=BE=91=EF=BC=8C=E8=80=8C=E4=B8=8D=E6=98=AF=E6=96=B0?= =?UTF-8?q?=E7=9A=84=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 之前的 golang 代码很不美观,并且他的逻辑和 c++ 的不一样,谁还专门记两个模板啊, 并且连缩进也没有,所以我就重写了一份 现在的 golang 逻辑和 c++ 相同 并且也有缩进,也没有废话代码,舒服多了 --- ...55\344\273\243\351\201\215\345\216\206.md" | 132 ++++++++---------- 1 file changed, 60 insertions(+), 72 deletions(-) diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" index 6889ecc05f..7aff05413e 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" @@ -299,108 +299,96 @@ class Solution: Go: + > 迭代法前序遍历 ```go -//迭代法前序遍历 -/** - type Element struct { - // 元素保管的值 - Value interface{} - // 内含隐藏或非导出字段 -} - -func (l *List) Back() *Element -前序遍历:中左右 -压栈顺序:右左中 - **/ func preorderTraversal(root *TreeNode) []int { + ans := []int{} + if root == nil { - return nil + return ans } - var stack = list.New() - stack.PushBack(root.Right) - stack.PushBack(root.Left) - res:=[]int{} - res=append(res,root.Val) - for stack.Len()>0 { - e:=stack.Back() - stack.Remove(e) - node := e.Value.(*TreeNode)//e是Element类型,其值为e.Value.由于Value为接口,所以要断言 - if node==nil{ - continue + + st := list.New() + st.PushBack(root) + + for st.Len() > 0 { + node := st.Remove(st.Back()).(*TreeNode) + + ans = append(ans, node.Val) + if node.Right != nil { + st.PushBack(node.Right) + } + if node.Left != nil { + st.PushBack(node.Left) } - res=append(res,node.Val) - stack.PushBack(node.Right) - stack.PushBack(node.Left) } - return res + return ans } ``` > 迭代法后序遍历 ```go -//迭代法后序遍历 -//后续遍历:左右中 -//压栈顺序:中右左(按照前序遍历思路),再反转结果数组 func postorderTraversal(root *TreeNode) []int { + ans := []int{} + if root == nil { - return nil + return ans } - var stack = list.New() - stack.PushBack(root.Left) - stack.PushBack(root.Right) - res:=[]int{} - res=append(res,root.Val) - for stack.Len()>0 { - e:=stack.Back() - stack.Remove(e) - node := e.Value.(*TreeNode)//e是Element类型,其值为e.Value.由于Value为接口,所以要断言 - if node==nil{ - continue + + st := list.New() + st.PushBack(root) + + for st.Len() > 0 { + node := st.Remove(st.Back()).(*TreeNode) + + ans = append(ans, node.Val) + if node.Left != nil { + st.PushBack(node.Left) + } + if node.Right != nil { + st.PushBack(node.Right) } - res=append(res,node.Val) - stack.PushBack(node.Left) - stack.PushBack(node.Right) } - for i:=0;i 迭代法中序遍历 ```go -//迭代法中序遍历 func inorderTraversal(root *TreeNode) []int { - rootRes:=[]int{} - if root==nil{ - return nil + ans := []int{} + if root == nil { + return ans } - stack:=list.New() - node:=root - //先将所有左节点找到,加入栈中 - for node!=nil{ - stack.PushBack(node) - node=node.Left - } - //其次对栈中的每个节点先弹出加入到结果集中,再找到该节点的右节点的所有左节点加入栈中 - for stack.Len()>0{ - e:=stack.Back() - node:=e.Value.(*TreeNode) - stack.Remove(e) - //找到该节点的右节点,再搜索他的所有左节点加入栈中 - rootRes=append(rootRes,node.Val) - node=node.Right - for node!=nil{ - stack.PushBack(node) - node=node.Left + + st := list.New() + cur := root + + for cur != nil || st.Len() > 0 { + if cur != nil { + st.PushBack(cur) + cur = cur.Left + } else { + cur = st.Remove(st.Back()).(*TreeNode) + ans = append(ans, cur.Val) + cur = cur.Right } } - return rootRes + + return ans } ``` From b87d3266b6604aaaac139b03f7e28e3943d92f5f Mon Sep 17 00:00:00 2001 From: CJ-cooper6 <71270517+CJ-cooper6@users.noreply.github.com> Date: Sun, 31 Oct 2021 16:37:04 +0800 Subject: [PATCH 0004/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0225.=20=E7=94=A8?= =?UTF-8?q?=E9=98=9F=E5=88=97=E5=AE=9E=E7=8E=B0=E6=A0=88=20=20Go=20?= =?UTF-8?q?=E4=B8=A4=E4=B8=AA=E9=98=9F=E5=88=97=E5=AE=9E=E7=8E=B0=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加225. 用队列实现栈 Go 两个队列实现版本 --- ...27\345\256\236\347\216\260\346\240\210.md" | 66 +++++++++++++++++++ 1 file changed, 66 insertions(+) diff --git "a/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" "b/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" index d981962698..c3a6ef8e78 100644 --- "a/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" +++ "b/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" @@ -359,6 +359,72 @@ class MyStack: Go: +使用两个队列实现 +```go +type MyStack struct { + //创建两个队列 + queue1 []int + queue2 []int +} + + +func Constructor() MyStack { + return MyStack{ //初始化 + queue1:make([]int,0), + queue2:make([]int,0), + } +} + + +func (this *MyStack) Push(x int) { + //先将数据存在queue2中 + this.queue2 = append(this.queue2,x) + //将queue1中所有元素移到queue2中,再将两个队列进行交换 + this.Move() +} + + +func (this *MyStack) Move(){ + if len(this.queue1) == 0{ + //交换,queue1置为queue2,queue2置为空 + this.queue1,this.queue2 = this.queue2,this.queue1 + }else{ + //queue1元素从头开始一个一个追加到queue2中 + this.queue2 = append(this.queue2,this.queue1[0]) + this.queue1 = this.queue1[1:] //去除第一个元素 + this.Move() //重复 + } +} + +func (this *MyStack) Pop() int { + val := this.queue1[0] + this.queue1 = this.queue1[1:] //去除第一个元素 + return val + +} + + +func (this *MyStack) Top() int { + return this.queue1[0] //直接返回 +} + + +func (this *MyStack) Empty() bool { +return len(this.queue1) == 0 +} + + +/** + * Your MyStack object will be instantiated and called as such: + * obj := Constructor(); + * obj.Push(x); + * param_2 := obj.Pop(); + * param_3 := obj.Top(); + * param_4 := obj.Empty(); + */ +``` + +使用一个队列实现 ```go type MyStack struct { queue []int//创建一个队列 From 5397b5e252868c7ebd9df6c877229dc14fdd775b Mon Sep 17 00:00:00 2001 From: CJ-cooper6 <71270517+CJ-cooper6@users.noreply.github.com> Date: Sun, 31 Oct 2021 16:37:29 +0800 Subject: [PATCH 0005/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0225.=20=E7=94=A8?= =?UTF-8?q?=E9=98=9F=E5=88=97=E5=AE=9E=E7=8E=B0=E6=A0=88=20=20Go=20?= =?UTF-8?q?=E4=B8=A4=E4=B8=AA=E9=98=9F=E5=88=97=E5=AE=9E=E7=8E=B0=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加225. 用队列实现栈 Go 两个队列实现版本 From 20976616179c3960eb14dd3661b5dd8469cda481 Mon Sep 17 00:00:00 2001 From: Arthur Date: Sun, 31 Oct 2021 17:04:12 +0100 Subject: [PATCH 0006/3019] =?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=20C=E8=AF=AD?= =?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 --- ...70\347\224\250\345\255\227\347\254\246.md" | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git "a/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md" "b/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md" index 44a02ceb54..a8450f2956 100644 --- "a/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md" +++ "b/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md" @@ -331,6 +331,58 @@ func commonChars(_ words: [String]) -> [String] { } ``` +C: +```c +void updateHashTable(int* hashTableOne, int* hashTableTwo) { + int i; + for(i = 0; i < 26; i++) { + hashTableOne[i] = hashTableOne[i] < hashTableTwo[i] ? hashTableOne[i] : hashTableTwo[i]; + } +} + +char ** commonChars(char ** words, int wordsSize, int* returnSize){ + //用来统计所有字母出现的最小频率 + int hashTable[26] = { 0 }; + //初始化返回的char**数组以及返回数组长度 + *returnSize = 0; + char** ret = (char**)malloc(sizeof(char*) * 100); + + //如果输入数组长度为0,则返回NULL + if(!wordsSize) + return NULL; + + int i; + //更新第一个单词的字母频率 + for(i = 0; i < strlen(words[0]); i++) + hashTable[words[0][i] - 'a']++; + //更新从第二个单词开始的字母频率 + for(i = 1; i < wordsSize; i++) { + //创建新的哈希表,记录新的单词的字母频率 + int newHashTable[26] = { 0 }; + int j; + for(j = 0; j < strlen(words[i]); j++) { + newHashTable[words[i][j] - 'a']++; + } + //更新原哈希表 + updateHashTable(hashTable, newHashTable); + } + + //将哈希表中的字符变为字符串放入ret中 + for(i = 0; i < 26; i++) { + if(hashTable[i]) { + int j; + for(j = 0; j < hashTable[i]; j++) { + char* tempString = (char*)malloc(sizeof(char) * 2); + tempString[0] = i + 'a'; + tempString[1] = '\0'; + ret[(*returnSize)++] = tempString; + } + } + } + return ret; +} +``` + ----------------------- * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) From d47af5291680d2b2ef0604e5780089c4c9a817b2 Mon Sep 17 00:00:00 2001 From: Arthur Date: Sun, 31 Oct 2021 17:09:17 +0100 Subject: [PATCH 0007/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=201002.=E6=9F=A5?= =?UTF-8?q?=E6=89=BE=E5=B8=B8=E7=94=A8=E5=AD=97=E7=AC=A6.md=20C=E8=AF=AD?= =?UTF-8?q?=E8=A8=80=E7=89=88=E6=9C=AC=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...6\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md" | 1 + 1 file changed, 1 insertion(+) diff --git "a/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md" "b/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md" index a8450f2956..5a8d1093a0 100644 --- "a/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md" +++ "b/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md" @@ -333,6 +333,7 @@ func commonChars(_ words: [String]) -> [String] { C: ```c +//若两个哈希表定义为char数组(每个单词的最大长度不会超过100,因此可以用char表示),可以提高时间和空间效率 void updateHashTable(int* hashTableOne, int* hashTableTwo) { int i; for(i = 0; i < 26; i++) { From 60442907e8ebf10f507b39e0c4ac8f928bb3f8cc Mon Sep 17 00:00:00 2001 From: hailincai Date: Mon, 1 Nov 2021 07:41:14 -0400 Subject: [PATCH 0008/3019] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BA=86Java=20dp?= =?UTF-8?q?=E6=96=B9=E6=B3=95=E7=9A=84=E6=B3=A8=E9=87=8A=20bad=20data=20--?= =?UTF-8?q?>=20base=20data?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修改了Java dp方法的注释 bad data --> base data --- ...32\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" index 41d8384746..130bb51f7c 100644 --- "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" +++ "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" @@ -154,7 +154,7 @@ class Solution { // 动态规划 // [天数][是否持有股票] int[][] dp = new int[prices.length][2]; - // bad case + // base case dp[0][0] = 0; dp[0][1] = -prices[0]; From 22b77d6ce256830db00717ea8c58240fcec5a889 Mon Sep 17 00:00:00 2001 From: hailincai Date: Mon, 1 Nov 2021 07:51:12 -0400 Subject: [PATCH 0009/3019] =?UTF-8?q?0055=20=E4=BF=AE=E6=94=B9=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E5=88=9D=E5=A7=8B=E8=A6=86=E7=9B=96=E8=8C=83=E5=9B=B4?= =?UTF-8?q?=E7=9A=84=E5=80=BC=E5=92=8C=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 0055 修改代码初始覆盖范围的值和注释 --- .../0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" "b/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" index 816eb64b42..29e09a64d4 100644 --- "a/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" +++ "b/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" @@ -92,8 +92,8 @@ class Solution { if (nums.length == 1) { return true; } - //覆盖范围 - int coverRange = nums[0]; + //覆盖范围, 初始覆盖范围应该是0,因为下面的迭代是从下标0开始的 + int coverRange = 0; //在覆盖范围内更新最大的覆盖范围 for (int i = 0; i <= coverRange; i++) { coverRange = Math.max(coverRange, i + nums[i]); From 250dd8b8f3dc0fbf5925588eac09ed352b5616cc Mon Sep 17 00:00:00 2001 From: a1045520 Date: Tue, 2 Nov 2021 15:35:16 +0800 Subject: [PATCH 0010/3019] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=200203.=E7=A7=BB?= =?UTF-8?q?=E9=99=A4=E9=93=BE=E8=A1=A8=E5=85=83=E7=B4=A0=20Rust=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...76\350\241\250\345\205\203\347\264\240.md" | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git "a/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" "b/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" index 6c52886a9e..188edc2ecd 100644 --- "a/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" +++ "b/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" @@ -358,6 +358,41 @@ func removeElements(head *ListNode, val int) *ListNode { } ``` +RUST: +```rust +// Definition for singly-linked list. +// #[derive(PartialEq, Eq, Clone, Debug)] +// pub struct ListNode { +// pub val: i32, +// pub next: Option> +// } +// +// impl ListNode { +// #[inline] +// fn new(val: i32) -> Self { +// ListNode { +// next: None, +// val +// } +// } +// } +impl Solution { + pub fn remove_elements(head: Option>, val: i32) -> Option> { + let mut head = head; + let mut dummy_head = ListNode::new(0); + let mut cur = &mut dummy_head; + while let Some(mut node) = head { + head = std::mem::replace(&mut node.next, None); + if node.val != val { + cur.next = Some(node); + cur = cur.next.as_mut().unwrap(); + } + } + dummy_head.next + } +} +``` + ----------------------- * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) From fe730eab542a78d4eeda56f2a9cf69abdac6a46a Mon Sep 17 00:00:00 2001 From: hailincai Date: Tue, 2 Nov 2021 08:00:36 -0400 Subject: [PATCH 0011/3019] =?UTF-8?q?0063.=E4=B8=8D=E5=90=8C=E8=B7=AF?= =?UTF-8?q?=E5=BE=84II.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修改Java代码,更容易让人理解 --- ...215\345\220\214\350\267\257\345\276\204II.md" | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git "a/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" "b/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" index c2f8ec204d..e25eb43af6 100644 --- "a/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" +++ "b/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" @@ -179,16 +179,14 @@ class Solution { public int uniquePathsWithObstacles(int[][] obstacleGrid) { int n = obstacleGrid.length, m = obstacleGrid[0].length; int[][] dp = new int[n][m]; - dp[0][0] = 1 - obstacleGrid[0][0]; - for (int i = 1; i < m; i++) { - if (obstacleGrid[0][i] == 0 && dp[0][i - 1] == 1) { - dp[0][i] = 1; - } + + for (int i = 0; i < m; i++) { + if (obstacleGrid[0][i] == 1) break; //一旦遇到障碍,后续都到不了 + dp[0][i] = 1; } - for (int i = 1; i < n; i++) { - if (obstacleGrid[i][0] == 0 && dp[i - 1][0] == 1) { - dp[i][0] = 1; - } + for (int i = 0; i < n; i++) { + if (obstacleGrid[i][0] == 1) break; ////一旦遇到障碍,后续都到不了 + dp[i][0] = 1; } for (int i = 1; i < n; i++) { for (int j = 1; j < m; j++) { From fe2362a97e0dd56ce76c8550c3d9007d53f779d3 Mon Sep 17 00:00:00 2001 From: baici1 <249337001@qq.com> Date: Wed, 3 Nov 2021 10:37:08 +0800 Subject: [PATCH 0012/3019] =?UTF-8?q?=E5=A2=9E=E5=8A=A042=E6=8E=A5?= =?UTF-8?q?=E9=9B=A8=E6=B0=B4=20go=E7=89=88=E6=9C=AC=E7=9A=84=E5=8A=A8?= =?UTF-8?q?=E6=80=81=E8=A7=84=E5=88=92=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...2.\346\216\245\351\233\250\346\260\264.md" | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git "a/problems/0042.\346\216\245\351\233\250\346\260\264.md" "b/problems/0042.\346\216\245\351\233\250\346\260\264.md" index 9b26bc6b01..ca2c99333b 100644 --- "a/problems/0042.\346\216\245\351\233\250\346\260\264.md" +++ "b/problems/0042.\346\216\245\351\233\250\346\260\264.md" @@ -604,7 +604,48 @@ func trap(height []int) int { } ``` +动态规划解法: + +```go +func trap(height []int) int { + sum:=0 + n:=len(height) + lh:=make([]int,n) + rh:=make([]int,n) + lh[0]=height[0] + rh[n-1]=height[n-1] + for i:=1;i=0;i--{ + rh[i]=max(rh[i+1],height[i]) + } + for i:=1;i0{ + sum+=h + } + } + return sum +} +func max(a,b int)int{ + if a>b{ + return a + } + return b +} +func min(a,b int)int{ + if a Date: Wed, 3 Nov 2021 23:20:18 +0100 Subject: [PATCH 0013/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200110.=E5=B9=B3?= =?UTF-8?q?=E8=A1=A1=E4=BA=8C=E5=8F=89=E6=A0=91.md=20C=E8=AF=AD=E8=A8=80?= =?UTF-8?q?=E9=80=92=E5=BD=92=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...41\344\272\214\345\217\211\346\240\221.md" | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git "a/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" "b/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" index 43a4975822..e22a12b374 100644 --- "a/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" @@ -619,6 +619,36 @@ var isBalanced = function(root) { }; ``` +##C +递归法: +```c +int getDepth(struct TreeNode* node) { + //如果结点不存在,返回0 + if(!node) + return 0; + //求出右子树深度 + int rightDepth = getDepth(node->right); + //求出左子树深度 + int leftDepth = getDepth(node->left); + //返回左右子树中的较大值+1 + return rightDepth > leftDepth ? rightDepth + 1 : leftDepth + 1; +} + +bool isBalanced(struct TreeNode* root) { + //递归结束条件为:传入结点为NULL,返回True + if(!root) + return 1; + //求出左右子树的深度 + int leftDepth = getDepth(root->left); + int rightDepth = getDepth(root->right); + int diff; + //若左右子树绝对值差距大于1,返回False + if((diff = leftDepth - rightDepth) > 1 || diff < -1) + return 0; + //检查左右子树是否为平衡二叉树 + return isBalanced(root->right) && isBalanced(root->left); +} +``` ----------------------- * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) From ad19a88ecf7559b2634f236c3a88a3ed15e37388 Mon Sep 17 00:00:00 2001 From: Arthur Date: Thu, 4 Nov 2021 10:21:03 +0000 Subject: [PATCH 0014/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200110.=E5=B9=B3?= =?UTF-8?q?=E8=A1=A1=E4=BA=8C=E5=8F=89=E6=A0=91.md=20=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" "b/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" index 677fbc32d5..2e8c239fa3 100644 --- "a/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" @@ -635,7 +635,7 @@ var isBalanced = function(root) { }; ``` -##C +## C 递归法: ```c int getDepth(struct TreeNode* node) { From 18ba70884914ed10944da16d60bba1fda610262f Mon Sep 17 00:00:00 2001 From: Arthur Date: Thu, 4 Nov 2021 10:56:41 +0000 Subject: [PATCH 0015/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200110.=E5=B9=B3?= =?UTF-8?q?=E8=A1=A1=E4=BA=8C=E5=8F=89=E6=A0=91.md=20C=E8=AF=AD=E8=A8=80?= =?UTF-8?q?=E8=BF=AD=E4=BB=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...41\344\272\214\345\217\211\346\240\221.md" | 63 +++++++++++++++++++ 1 file changed, 63 insertions(+) diff --git "a/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" "b/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" index 2e8c239fa3..f3d70a5ca2 100644 --- "a/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" @@ -666,6 +666,69 @@ bool isBalanced(struct TreeNode* root) { } ``` +迭代法: +```c +//计算结点深度 +int getDepth(struct TreeNode* node) { + struct TreeNode** stack = (struct TreeNode**)malloc(sizeof(struct TreeNode*) * 10000); + int stackTop = 0; + if(node) + stack[stackTop++] = node; + int result = 0; + int depth = 0; + + while(stackTop) { + struct TreeNode* tempNode = stack[--stackTop]; + if(tempNode) { + depth++; + stack[stackTop++] = tempNode; + stack[stackTop++] = NULL; + if(tempNode->left) + stack[stackTop++] = tempNode->left; + if(tempNode->right) + stack[stackTop++] = tempNode->right; + result = result > depth ? result : depth; + } + else { + tempNode = stack[--stackTop]; + depth--; + } + } + + return result; +} + +bool isBalanced(struct TreeNode* root){ + //开辟栈空间 + struct TreeNode** stack = (struct TreeNode**)malloc(sizeof(struct TreeNode*) * 10000); + int stackTop = 0; + + //若根节点不存在,返回True + if(!root) + return 1; + + //将根节点入栈 + stack[stackTop++] = root; + //当栈中有元素时,进行遍历 + while(stackTop) { + //将栈顶元素出栈 + struct TreeNode* node = stack[--stackTop]; + //计算左右子树的深度 + int diff = getDepth(node->right) - getDepth(node->left); + //若深度的绝对值大于1,返回False + if(diff > 1 || diff < -1) + return 0; + //如果栈顶结点有左右结点,将左右结点入栈 + if(node->left) + stack[stackTop++] = node->left; + if(node->right) + stack[stackTop++] = node->right; + } + //若二叉树遍历结束后没有返回False,则返回True + return 1; +} +``` + ----------------------- * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) From 70ac62e84d686215cd91803c7c66cf92e244f0e0 Mon Sep 17 00:00:00 2001 From: hailincai Date: Thu, 4 Nov 2021 16:42:56 -0400 Subject: [PATCH 0016/3019] =?UTF-8?q?0028.=20=E5=AE=9E=E7=8E=B0strstr.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修改错别字 --- "problems/0028.\345\256\236\347\216\260strStr.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/problems/0028.\345\256\236\347\216\260strStr.md" "b/problems/0028.\345\256\236\347\216\260strStr.md" index 1c200a7108..f8eb0aceb0 100644 --- "a/problems/0028.\345\256\236\347\216\260strStr.md" +++ "b/problems/0028.\345\256\236\347\216\260strStr.md" @@ -120,7 +120,7 @@ next数组就是一个前缀表(prefix table)。 此时就要问了**前缀表是如何记录的呢?** -首先要知道前缀表的任务是当前位置匹配失败,找到之前已经匹配上的位置,在重新匹配,此也意味着在某个字符失配时,前缀表会告诉你下一步匹配中,模式串应该跳到哪个位置。 +首先要知道前缀表的任务是当前位置匹配失败,找到之前已经匹配上的位置,再重新匹配,此也意味着在某个字符失配时,前缀表会告诉你下一步匹配中,模式串应该跳到哪个位置。 那么什么是前缀表:**记录下标i之前(包括i)的字符串中,有多大长度的相同前缀后缀。** @@ -148,7 +148,7 @@ next数组就是一个前缀表(prefix table)。 # 为什么一定要用前缀表 -这就是前缀表那为啥就能告诉我们 上次匹配的位置,并跳过去呢? +这就是前缀表,那为啥就能告诉我们 上次匹配的位置,并跳过去呢? 回顾一下,刚刚匹配的过程在下标5的地方遇到不匹配,模式串是指向f,如图: KMP精讲1 From a1004808796f6b97bd86753e1b9d859ebab4ff09 Mon Sep 17 00:00:00 2001 From: ArthurP Date: Sat, 6 Nov 2021 10:51:37 +0100 Subject: [PATCH 0017/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200110.=E5=B9=B3?= =?UTF-8?q?=E8=A1=A1=E4=BA=8C=E5=8F=89=E6=A0=91.md=20C=E8=AF=AD=E8=A8=80?= =?UTF-8?q?=E8=BF=AD=E4=BB=A3=E6=B3=95=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...3\350\241\241\344\272\214\345\217\211\346\240\221.md" | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git "a/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" "b/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" index f3d70a5ca2..b0ecf44a72 100644 --- "a/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" @@ -670,26 +670,35 @@ bool isBalanced(struct TreeNode* root) { ```c //计算结点深度 int getDepth(struct TreeNode* node) { + //开辟栈空间 struct TreeNode** stack = (struct TreeNode**)malloc(sizeof(struct TreeNode*) * 10000); int stackTop = 0; + //若传入结点存在,将其入栈。若不存在,函数直接返回0 if(node) stack[stackTop++] = node; int result = 0; int depth = 0; + //当栈中有元素时,进行迭代遍历 while(stackTop) { + //取出栈顶元素 struct TreeNode* tempNode = stack[--stackTop]; + //若栈顶元素非NULL,则将深度+1 if(tempNode) { depth++; + //将栈顶元素再次入栈,添加NULL表示此结点已被遍历 stack[stackTop++] = tempNode; stack[stackTop++] = NULL; + //若栈顶元素有左右孩子,则将孩子结点入栈 if(tempNode->left) stack[stackTop++] = tempNode->left; if(tempNode->right) stack[stackTop++] = tempNode->right; + //更新结果 result = result > depth ? result : depth; } else { + //若为NULL,则代表当前结点已被遍历,深度-1 tempNode = stack[--stackTop]; depth--; } From 36a4a909928c08d40d997a0f493372fb2d039c6b Mon Sep 17 00:00:00 2001 From: Wen Date: Sat, 6 Nov 2021 20:14:43 +0800 Subject: [PATCH 0018/3019] =?UTF-8?q?=E6=96=B0=E5=A2=9E=200122.=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=BAII=EF=BC=88=E5=8A=A8=E6=80=81=E8=A7=84=E5=88=92?= =?UTF-8?q?=EF=BC=89.md=20Go=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...01\350\247\204\345\210\222\357\274\211.md" | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" index 5dfe3f0e3b..5a39c8b1b5 100644 --- "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" +++ "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" @@ -199,6 +199,33 @@ class Solution: ``` Go: +```go +// 买卖股票的最佳时机Ⅱ 动态规划 +// 时间复杂度O(n) 空间复杂度O(n) +func maxProfit(prices []int) int { + dp := make([][]int, len(prices)) + status := make([]int, len(prices) * 2) + for i := range dp { + dp[i] = status[:2] + status = status[2:] + } + dp[0][0] = -prices[0] + + for i := 1; i < len(prices); i++ { + dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] - prices[i]) + dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] + prices[i]) + } + + return dp[len(prices) - 1][1] +} + +func max(a, b int) int { + if a > b { + return a + } + return b +} +``` Javascript: ```javascript From 5483a714e7a3386467c50f49e7e543e04f51b3e5 Mon Sep 17 00:00:00 2001 From: Wen Date: Sat, 6 Nov 2021 20:17:16 +0800 Subject: [PATCH 0019/3019] =?UTF-8?q?=E6=96=B0=E5=A2=9E=200123.=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=BAIII.md=20Go=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...344\275\263\346\227\266\346\234\272III.md" | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git "a/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" "b/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" index 6a849c802f..81f8e82d62 100644 --- "a/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" +++ "b/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" @@ -317,7 +317,38 @@ const maxProfit = prices => { }; ``` +Go: +> 版本一: +```go +// 买卖股票的最佳时机III 动态规划 +// 时间复杂度O(n) 空间复杂度O(n) +func maxProfit(prices []int) int { + dp := make([][]int, len(prices)) + status := make([]int, len(prices) * 4) + for i := range dp { + dp[i] = status[:4] + status = status[4:] + } + dp[0][0], dp[0][2] = -prices[0], -prices[0] + + for i := 1; i < len(prices); i++ { + dp[i][0] = max(dp[i - 1][0], -prices[i]) + dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] + prices[i]) + dp[i][2] = max(dp[i - 1][2], dp[i - 1][1] - prices[i]) + dp[i][3] = max(dp[i - 1][3], dp[i - 1][2] + prices[i]) + } + + return dp[len(prices) - 1][3] +} + +func max(a, b int) int { + if a > b { + return a + } + return b +} +``` ----------------------- From bc77968c31186313bfd94627e09a49153aace468 Mon Sep 17 00:00:00 2001 From: Wen Date: Sat, 6 Nov 2021 20:21:23 +0800 Subject: [PATCH 0020/3019] =?UTF-8?q?=E6=96=B0=E5=A2=9E=200188.=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=BAIV.md=20Go=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\344\275\263\346\227\266\346\234\272IV.md" | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git "a/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" "b/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" index bcb8a1ab72..9e3ca11211 100644 --- "a/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" +++ "b/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" @@ -275,6 +275,41 @@ class Solution: return dp[2*k] ``` Go: +版本一: +```go +// 买卖股票的最佳时机IV 动态规划 +// 时间复杂度O(kn) 空间复杂度O(kn) +func maxProfit(k int, prices []int) int { + if k == 0 || len(prices) == 0 { + return 0 + } + + dp := make([][]int, len(prices)) + status := make([]int, (2 * k + 1) * len(prices)) + for i := range dp { + dp[i] = status[:2 * k + 1] + status = status[2 * k + 1:] + } + for j := 1; j < 2 * k; j += 2 { + dp[0][j] = -prices[0] + } + + for i := 1; i < len(prices); i++ { + for j := 0; j < 2 * k; j += 2 { + dp[i][j + 1] = max(dp[i - 1][j + 1], dp[i - 1][j] - prices[i]) + dp[i][j + 2] = max(dp[i - 1][j + 2], dp[i - 1][j + 1] + prices[i]) + } + } + return dp[len(prices) - 1][2 * k] +} + +func max(a, b int) int { + if a > b { + return a + } + return b +} +``` Javascript: From e1e3b38eef494c4c7840264ea66a06802de4c1f9 Mon Sep 17 00:00:00 2001 From: Wen Date: Sat, 6 Nov 2021 20:29:00 +0800 Subject: [PATCH 0021/3019] =?UTF-8?q?=E6=96=B0=E5=A2=9E=200309.=E6=9C=80?= =?UTF-8?q?=E4=BD=B3=E4=B9=B0=E5=8D=96=E8=82=A1=E7=A5=A8=E6=97=B6=E6=9C=BA?= =?UTF-8?q?=E5=90=AB=E5=86=B7=E5=86=BB=E6=9C=9F.md=20Go=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...53\345\206\267\345\206\273\346\234\237.md" | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git "a/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" "b/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" index 59178c6454..f5665a5eae 100644 --- "a/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" +++ "b/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" @@ -208,6 +208,40 @@ class Solution: ``` Go: +```go +// 最佳买卖股票时机含冷冻期 动态规划 +// 时间复杂度O(n) 空间复杂度O(n) +func maxProfit(prices []int) int { + n := len(prices) + if n < 2 { + return 0 + } + + dp := make([][]int, n) + status := make([]int, n * 4) + for i := range dp { + dp[i] = status[:4] + status = status[4:] + } + dp[0][0] = -prices[0] + + for i := 1; i < n; i++ { + dp[i][0] = max(dp[i - 1][0], max(dp[i - 1][1] - prices[i], dp[i - 1][3] - prices[i])) + dp[i][1] = max(dp[i - 1][1], dp[i - 1][3]) + dp[i][2] = dp[i - 1][0] + prices[i] + dp[i][3] = dp[i - 1][2] + } + + return max(dp[n - 1][1], max(dp[n - 1][2], dp[n - 1][3])) +} + +func max(a, b int) int { + if a > b { + return a + } + return b +} +``` Javascript: From 5c7addcf0ea688a8c1da3ef875f4c2d379a87da5 Mon Sep 17 00:00:00 2001 From: Yu Date: Sat, 6 Nov 2021 17:28:50 -0700 Subject: [PATCH 0022/3019] Add python3 solution for the quesiton 0463. Thanks! -Kai --- ...77\347\232\204\345\221\250\351\225\277.md" | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git "a/problems/0463.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" "b/problems/0463.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" index 3b0278a64d..4aa2246057 100644 --- "a/problems/0463.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" +++ "b/problems/0463.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" @@ -123,6 +123,41 @@ class Solution { ``` Python: +### 解法1: +扫描每个cell,如果当前位置为岛屿 grid[i][j] == 1, 从当前位置判断四边方向,如果边界或者是水域,证明有边界存在,res矩阵的对应cell加一。 + +```python3 +class Solution: + def islandPerimeter(self, grid: List[List[int]]) -> int: + + m = len(grid) + n = len(grid[0]) + + # 创建res二维素组记录答案 + res = [[0] * n for j in range(m)] + + for i in range(m): + for j in range(len(grid[i])): + # 如果当前位置为水域,不做修改或reset res[i][j] = 0 + if grid[i][j] == 0: + res[i][j] = 0 + # 如果当前位置为陆地,往四个方向判断,update res[i][j] + elif grid[i][j] == 1: + if i == 0 or (i > 0 and grid[i-1][j] == 0): + res[i][j] += 1 + if j == 0 or (j >0 and grid[i][j-1] == 0): + res[i][j] += 1 + if i == m-1 or (i < m-1 and grid[i+1][j] == 0): + res[i][j] += 1 + if j == n-1 or (j < n-1 and grid[i][j+1] == 0): + res[i][j] += 1 + + # 最后求和res矩阵,这里其实不一定需要矩阵记录,可以设置一个variable res 记录边长,舍矩阵无非是更加形象而已 + ans = sum([sum(row) for row in res]) + + return ans + +``` Go: From f8fbdd4ed1d66bf03578728650310bddc8a5fc7a Mon Sep 17 00:00:00 2001 From: Wen Date: Sun, 7 Nov 2021 12:53:27 +0800 Subject: [PATCH 0023/3019] =?UTF-8?q?=E6=96=B0=E5=A2=9E=200714.=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=E5=90=AB=E6=89=8B=E7=BB=AD=E8=B4=B9=EF=BC=88=E5=8A=A8?= =?UTF-8?q?=E6=80=81=E8=A7=84=E5=88=92=EF=BC=89.md=20Go=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...01\350\247\204\345\210\222\357\274\211.md" | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git "a/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" "b/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" index 50db8868cd..42afd777aa 100644 --- "a/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" +++ "b/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" @@ -152,6 +152,37 @@ class Solution: ``` Go: +```go +// 买卖股票的最佳时机含手续费 动态规划 +// 时间复杂度O(n) 空间复杂度O(n) +func maxProfit(prices []int, fee int) int { + if len(prices) == 1 { + return 0 + } + + dp := make([][]int, len(prices)) + status := make([]int, len(prices) * 2) + for i := range dp { + dp[i] = status[:2] + status = status[2:] + } + dp[0][0] = -prices[0] + + for i := 1; i < len(dp); i++ { + dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] - prices[i]) + dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] + prices[i] - fee) + } + + return dp[len(dp) - 1][1] +} + +func max(a, b int) int { + if a > b { + return a + } + return b +} +``` Javascript: ```javascript From 766e9729243cd16357555ff4d1e8ece8166337f7 Mon Sep 17 00:00:00 2001 From: bourne-3 <595962708@qq.com> Date: Sun, 7 Nov 2021 18:59:14 +0800 Subject: [PATCH 0024/3019] =?UTF-8?q?=E6=9C=80=E9=95=BF=E5=9B=9E=E6=96=87?= =?UTF-8?q?=E5=AD=97=E4=B8=B2Java=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...36\346\226\207\345\255\220\344\270\262.md" | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git "a/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" "b/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" index c78b827c80..bd57206025 100644 --- "a/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" +++ "b/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" @@ -265,6 +265,32 @@ public: ## Java ```java +// 双指针 中心扩散法 +class Solution { + public String longestPalindrome(String s) { + String s1 = ""; + String s2 = ""; + String res = ""; + for (int i = 0; i < s.length(); i++) { + // 分两种情况:即一个元素作为中心点,两个元素作为中心点 + s1 = extend(s, i, i); // 情况1 + res = s1.length() > res.length() ? s1 : res; + s2 = extend(s, i, i + 1); // 情况2 + res = s2.length() > res.length() ? s2 : res; + } + return res; // 返回最长的 + } + public String extend(String s, int start, int end){ + String tmp = ""; + while (start >= 0 && end < s.length() && s.charAt(start) == s.charAt(end)){ + tmp = s.substring(start, end + 1); // Java中substring是左闭右开的,所以要+1 + // 向两边扩散 + start--; + end++; + } + return tmp; + } +} ``` ## Python @@ -292,11 +318,13 @@ class Solution: ## Go ```go + ``` ## JavaScript ```js + ``` ----------------------- From bb1dd8d8c33674cacf08ecd77a50ebf072210b8e Mon Sep 17 00:00:00 2001 From: Hugh <34978586+nanqic@users.noreply.github.com> Date: Mon, 8 Nov 2021 15:09:06 +0800 Subject: [PATCH 0025/3019] =?UTF-8?q?Update=201365.=E6=9C=89=E5=A4=9A?= =?UTF-8?q?=E5=B0=91=E5=B0=8F=E4=BA=8E=E5=BD=93=E5=89=8D=E6=95=B0=E5=AD=97?= =?UTF-8?q?=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 Go语言版本 --- ...27\347\232\204\346\225\260\345\255\227.md" | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git "a/problems/1365.\346\234\211\345\244\232\345\260\221\345\260\217\344\272\216\345\275\223\345\211\215\346\225\260\345\255\227\347\232\204\346\225\260\345\255\227.md" "b/problems/1365.\346\234\211\345\244\232\345\260\221\345\260\217\344\272\216\345\275\223\345\211\215\346\225\260\345\255\227\347\232\204\346\225\260\345\255\227.md" index 9f28220922..09d41e7088 100644 --- "a/problems/1365.\346\234\211\345\244\232\345\260\221\345\260\217\344\272\216\345\275\223\345\211\215\346\225\260\345\255\227\347\232\204\346\225\260\345\255\227.md" +++ "b/problems/1365.\346\234\211\345\244\232\345\260\221\345\260\217\344\272\216\345\275\223\345\211\215\346\225\260\345\255\227\347\232\204\346\225\260\345\255\227.md" @@ -152,7 +152,35 @@ class Solution: res[i] = hash[num] return res ``` + Go: +```go +func smallerNumbersThanCurrent(nums []int) []int { + // map,key[数组中出现的数] value[比这个数小的个数] + m := make(map[int]int) + // 拷贝一份原始数组 + rawNums := make([]int,len(nums)) + copy(rawNums,nums) + // 将数组排序 + sort.Ints(nums) + // 循环遍历排序后的数组,值为map的key,索引为value + for i,v := range nums { + _,contains := m[v] + if !contains { + m[v] = i + } + + } + // 返回值结果 + result := make([]int,len(nums)) + // 根据原始数组的位置,存放对应的比它小的数 + for i,v := range rawNums { + result[i] = m[v] + } + + return result +} +``` JavaScript: ```javascript From 214b60cc6945fea8d1b22f83f6f67b6ff82cf4c8 Mon Sep 17 00:00:00 2001 From: Hugh <34978586+nanqic@users.noreply.github.com> Date: Mon, 8 Nov 2021 15:09:45 +0800 Subject: [PATCH 0026/3019] =?UTF-8?q?Create=201365.=E6=9C=89=E5=A4=9A?= =?UTF-8?q?=E5=B0=91=E5=B0=8F=E4=BA=8E=E5=BD=93=E5=89=8D=E6=95=B0=E5=AD=97?= =?UTF-8?q?=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 Go语言版本 From 808bdbb8604de47f9e75412d0ebb85f92e33fedf Mon Sep 17 00:00:00 2001 From: Arthur Date: Mon, 8 Nov 2021 11:50:39 +0000 Subject: [PATCH 0027/3019] =?UTF-8?q?=E6=9B=B4=E6=94=B9=200226.=E7=BF=BB?= =?UTF-8?q?=E8=BD=AC=E4=BA=8C=E5=8F=89=E6=A0=91.md=20C=E8=AF=AD=E8=A8=80?= =?UTF-8?q?=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git "a/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" "b/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" index 36083dcd62..f9185959e8 100644 --- "a/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" @@ -565,7 +565,7 @@ var invertTree = function(root) { }; ``` -C: +### C: 递归法 ```c struct TreeNode* invertTree(struct TreeNode* root){ @@ -582,6 +582,7 @@ struct TreeNode* invertTree(struct TreeNode* root){ return root; } ``` + 迭代法:深度优先遍历 ```c struct TreeNode* invertTree(struct TreeNode* root){ From 61044a1f94583e817dbf799e8d5c9b59da800e8b Mon Sep 17 00:00:00 2001 From: Arthur Date: Mon, 8 Nov 2021 12:20:52 +0000 Subject: [PATCH 0028/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200222.=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.md=20C=E8=AF=AD=E8=A8=80=E8=BF=AD=E4=BB=A3?= =?UTF-8?q?=E6=B3=95=E3=80=81=E9=80=92=E5=BD=92=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...02\347\202\271\344\270\252\346\225\260.md" | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git "a/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" "b/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" index dc09985d47..0826110f81 100644 --- "a/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" +++ "b/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" @@ -449,7 +449,51 @@ var countNodes = function(root) { }; ``` +## C: +递归法 +```c +int countNodes(struct TreeNode* root) { + //若传入结点不存在,返回0 + if(!root) + return 0; + //算出左右子树的结点总数 + int leftCount = countNodes(root->left); + int rightCount = countNodes(root->right); + //返回左右子树结点总数+1 + return leftCount + rightCount + 1; +} + +int countNodes(struct TreeNode* root){ + return getNodes(root); +} +``` +迭代法 +```c +int countNodes(struct TreeNode* root){ + //记录结点总数 + int totalNum = 0; + //开辟栈空间 + struct TreeNode** stack = (struct TreeNode**)malloc(sizeof(struct TreeNode*) * 100); + int stackTop = 0; + //如果root结点不为NULL,则将其入栈。若为NULL,则不会进入遍历,返回0 + if(root) + stack[stackTop++] = root; + //若栈中有结点存在,则进行遍历 + while(stackTop) { + //取出栈顶元素 + struct TreeNode* tempNode = stack[--stackTop]; + //结点总数+1 + totalNum++; + //若栈顶结点有左右孩子,将它们入栈 + if(tempNode->left) + stack[stackTop++] = tempNode->left; + if(tempNode->right) + stack[stackTop++] = tempNode->right; + } + return totalNum; +} +``` ----------------------- * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) From f3b140591b67b524e322a0dc31e3043488ea422b Mon Sep 17 00:00:00 2001 From: Arthur Date: Mon, 8 Nov 2021 14:07:24 +0000 Subject: [PATCH 0029/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200222.=E5=AE=8C?= =?UTF-8?q?=E5=85=A8=E4=BA=8C=E5=8F=89=E6=A0=91=E7=9A=84=E7=BB=93=E7=82=B9?= =?UTF-8?q?=E4=B8=AA=E6=95=B0.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...02\347\202\271\344\270\252\346\225\260.md" | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git "a/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" "b/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" index 0826110f81..14e1537a84 100644 --- "a/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" +++ "b/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" @@ -495,6 +495,35 @@ int countNodes(struct TreeNode* root){ } ``` +满二叉树 +```c +int countNodes(struct TreeNode* root){ + if(!root) + return 0; + int leftHeight = 0; + int rightHeight = 0; + struct TreeNode* rightNode = root->right; + struct TreeNode* leftNode = root->left; + //求出左子树深度 + while(leftNode) { + leftNode = leftNode->left; + leftHeight++; + } + + //求出右子树深度 + while(rightNode) { + rightNode = rightNode->right; + rightHeight++; + } + //若左右子树深度相同,为满二叉树。结点个数为2^height-1 + if(rightHeight == leftHeight) { + return (2 << leftHeight) - 1; + } + //否则返回左右子树的结点个数+1 + return countNodes(root->right) + countNodes(root->left) + 1; +} +``` + ----------------------- * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) From 2b0788cdb7d46b39dbb3b54a5797322cc6dc6e51 Mon Sep 17 00:00:00 2001 From: mengyuan Date: Tue, 9 Nov 2021 10:39:04 +0800 Subject: [PATCH 0030/3019] =?UTF-8?q?feat:=20=E4=BF=AE=E6=94=B90239.?= =?UTF-8?q?=E6=BB=91=E5=8A=A8=E7=AA=97=E5=8F=A3=E6=9C=80=E5=A4=A7=E5=80=BC?= =?UTF-8?q?js=E7=89=88=E6=9C=AC=EF=BC=8C=E5=88=A4=E6=96=AD=E5=BD=93?= =?UTF-8?q?=E5=89=8D=E6=9C=80=E5=A4=A7=E5=80=BC=E6=98=AF=E5=90=A6=E5=9C=A8?= =?UTF-8?q?=E7=AA=97=E5=8F=A3=E4=B8=AD=E7=94=A8if=E5=8D=B3=E5=8F=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" "b/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" index be46bd05e9..21dbaf4dc8 100644 --- "a/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" +++ "b/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" @@ -410,7 +410,7 @@ var maxSlidingWindow = function (nums, k) { // 入队当前元素下标 q.push(i); // 判断当前最大值(即队首元素)是否在窗口中,若不在便将其出队 - while (q[0] <= i - k) { + if (q[0] <= i - k) { q.shift(); } // 当达到窗口大小时便开始向结果中添加数据 From 912e27442fa5d71c4848d345dc56e1042a666032 Mon Sep 17 00:00:00 2001 From: Carol Date: Tue, 9 Nov 2021 12:03:32 +0800 Subject: [PATCH 0031/3019] =?UTF-8?q?Update=200031.=E4=B8=8B=E4=B8=80?= =?UTF-8?q?=E4=B8=AA=E6=8E=92=E5=88=97.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...00\344\270\252\346\216\222\345\210\227.md" | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git "a/problems/0031.\344\270\213\344\270\200\344\270\252\346\216\222\345\210\227.md" "b/problems/0031.\344\270\213\344\270\200\344\270\252\346\216\222\345\210\227.md" index 9999486ec9..a6aa8a916d 100644 --- "a/problems/0031.\344\270\213\344\270\200\344\270\252\346\216\222\345\210\227.md" +++ "b/problems/0031.\344\270\213\344\270\200\344\270\252\346\216\222\345\210\227.md" @@ -165,6 +165,29 @@ class Solution: low += 1 high -= 1 ``` +>上一版本简化版 +'''python +class Solution(object): + def nextPermutation(self, nums: List[int]) -> None: + n = len(nums) + i = n-2 + while i >= 0 and nums[i] >= nums[i+1]: + i -= 1 + + if i > -1: // i==-1,不存在下一个更大的排列 + j = n-1 + while j >= 0 and nums[j] <= nums[i]: + j -= 1 + nums[i], nums[j] = nums[j], nums[i] + + start, end = i+1, n-1 + while start < end: + nums[start], nums[end] = nums[end], nums[start] + start += 1 + end -= 1 + + return nums +''' ## Go From 124924dee22463cd40501266cb5d1b7ff1ae7d8e Mon Sep 17 00:00:00 2001 From: youngyangyang04 <826123027@qq.com> Date: Thu, 11 Nov 2021 01:32:28 +0800 Subject: [PATCH 0032/3019] Update --- README.md | 20 +++++--------------- 1 file changed, 5 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index 217d7e81aa..69de320e1b 100644 --- a/README.md +++ b/README.md @@ -1,30 +1,20 @@ + + 👉 推荐 [在线阅读](http://programmercarl.com/) (Github在国内访问经常不稳定) 👉 推荐 [Gitee同步](https://gitee.com/programmercarl/leetcode-master) > 1. **介绍**:本项目是一套完整的刷题计划,旨在帮助大家少走弯路,循序渐进学算法,[关注作者](#关于作者) -> 2. **PDF版本** : [「代码随想录」算法精讲 PDF 版本](https://mp.weixin.qq.com/s/RsdcQ9umo09R6cfnwXZlrQ) 。 +> 2. **PDF版本** : [「代码随想录」算法精讲 PDF 版本](https://mp.weixin.qq.com/s/NF7NqTD9DU505S6nvR_5Wg) 。 > 3. **刷题顺序** : README已经将刷题顺序排好了,按照顺序一道一道刷就可以。 > 3. **学习社区** : 一起学习打卡/面试技巧/如何选择offer/大厂内推/职场规则/简历修改/技术分享/程序人生。欢迎加入[「代码随想录」知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) 。 > 4. **提交代码**:本项目统一使用C++语言进行讲解,但已经有Java、Python、Go、JavaScript等等多语言版本,感谢[这里的每一位贡献者](https://github.com/youngyangyang04/leetcode-master/graphs/contributors),如果你也想贡献代码点亮你的头像,[点击这里](https://mp.weixin.qq.com/s/tqCxrMEU-ajQumL1i8im9A)了解提交代码的方式。 > 5. **转载须知** :以下所有文章皆为我([程序员Carl](https://github.com/youngyangyang04))的原创。引用本项目文章请注明出处,发现恶意抄袭或搬运,会动用法律武器维护自己的权益。让我们一起维护一个良好的技术创作环境!

- - + + -

- - - - -

-

- - - - - # LeetCode 刷题攻略 ## 刷题攻略的背景 From a0de1660f690f287c19dc2190b5cf17f97263ba5 Mon Sep 17 00:00:00 2001 From: youngyangyang04 <826123027@qq.com> Date: Thu, 11 Nov 2021 01:34:12 +0800 Subject: [PATCH 0033/3019] Update --- ...00\344\270\252\344\275\215\347\275\256.md" | 20 ++-- ...6.\345\205\250\346\216\222\345\210\227.md" | 4 +- ...57\345\275\242\351\223\276\350\241\250.md" | 15 ++- ...15\346\216\222\351\223\276\350\241\250.md" | 108 +++++++++--------- ...36\346\226\207\351\223\276\350\241\250.md" | 16 +-- ...06\345\212\250\345\272\217\345\210\227.md" | 26 ++--- ...06\345\217\221\351\245\274\345\271\262.md" | 30 ++--- ...21\346\200\273\347\273\223\347\257\207.md" | 6 + ...36\346\272\257\346\200\273\347\273\223.md" | 4 +- ...25\346\200\273\347\273\223\347\257\207.md" | 8 ++ 10 files changed, 123 insertions(+), 114 deletions(-) diff --git "a/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" "b/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" index d70dcba531..f8299ea866 100644 --- "a/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" +++ "b/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" @@ -29,7 +29,7 @@ * 输出:[-1,-1] -# 思路 +## 思路 这道题目如果基础不是很好,不建议大家看简短的代码,简短的代码隐藏了太多逻辑,结果就是稀里糊涂把题AC了,但是没有想清楚具体细节! @@ -54,7 +54,7 @@ **刚刚接触二分搜索的同学不建议上来就像如果用一个二分来查找左右边界,很容易把自己绕进去,建议扎扎实实的写两个二分分别找左边界和右边界** -## 寻找右边界 +### 寻找右边界 先来寻找右边界,至于二分查找,如果看过[704.二分查找](https://programmercarl.com/0704.二分查找.html)就会知道,二分查找中什么时候用while (left <= right),有什么时候用while (left < right),其实只要清楚**循环不变量**,很容易区分两种写法。 @@ -84,7 +84,7 @@ int getRightBorder(vector& nums, int target) { } ``` -## 寻找左边界 +### 寻找左边界 ```CPP // 二分查找,寻找target的左边界leftBorder(不包括target) @@ -106,7 +106,7 @@ int getLeftBorder(vector& nums, int target) { } ``` -## 处理三种情况 +### 处理三种情况 左右边界计算完之后,看一下主体代码,这里把上面讨论的三种情况,都覆盖了 @@ -161,16 +161,16 @@ private: 但拆开更清晰一些,而且把三种情况以及对应的处理逻辑完整的展现出来了。 -# 总结 +## 总结 初学者建议大家一块一块的去分拆这道题目,正如本题解描述,想清楚三种情况之后,先专注于寻找右区间,然后专注于寻找左区间,左右根据左右区间做最后判断。 不要上来就想如果一起寻找左右区间,搞着搞着就会顾此失彼,绕进去拔不出来了。 -# 其他语言版本 +## 其他语言版本 -## Java +### Java ```java class Solution { @@ -272,7 +272,7 @@ class Solution { -## Python +### Python ```python class Solution: @@ -388,12 +388,12 @@ class Solution: return [leftBorder, rightBorder] ``` -## Go +### Go ```go ``` -## JavaScript +### JavaScript ```js var searchRange = function(nums, target) { diff --git "a/problems/0046.\345\205\250\346\216\222\345\210\227.md" "b/problems/0046.\345\205\250\346\216\222\345\210\227.md" index 2743a66722..7c9a854944 100644 --- "a/problems/0046.\345\205\250\346\216\222\345\210\227.md" +++ "b/problems/0046.\345\205\250\346\216\222\345\210\227.md" @@ -40,7 +40,7 @@ 我以[1,2,3]为例,抽象成树形结构如下: -![46.全排列](https://img-blog.csdnimg.cn/20201209174225145.png) +![46.全排列](https://code-thinking-1253855093.file.myqcloud.com/pics/20211027181706.png) ### 回溯三部曲 @@ -52,7 +52,7 @@ 但排列问题需要一个used数组,标记已经选择的元素,如图橘黄色部分所示: -![46.全排列](https://img-blog.csdnimg.cn/20201209174225145.png) +![46.全排列](https://code-thinking-1253855093.file.myqcloud.com/pics/20211027181706.png) 代码如下: diff --git "a/problems/0141.\347\216\257\345\275\242\351\223\276\350\241\250.md" "b/problems/0141.\347\216\257\345\275\242\351\223\276\350\241\250.md" index 559ded410b..dec066cfbd 100644 --- "a/problems/0141.\347\216\257\345\275\242\351\223\276\350\241\250.md" +++ "b/problems/0141.\347\216\257\345\275\242\351\223\276\350\241\250.md" @@ -17,7 +17,7 @@ ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210727173600.png) -# 思路 +## 思路 可以使用快慢指针法, 分别定义 fast 和 slow指针,从头结点出发,fast指针每次移动两个节点,slow指针每次移动一个节点,如果 fast 和 slow指针在途中相遇 ,说明这个链表有环。 @@ -62,16 +62,15 @@ public: }; ``` -# 扩展 +## 扩展 -做完这道题目,可以在做做142.环形链表II,不仅仅要找环,还要找环的入口。 +做完这道题目,可以在做做[142.环形链表II](https://mp.weixin.qq.com/s/gt_VH3hQTqNxyWcl1ECSbQ),不仅仅要找环,还要找环的入口。 -142.环形链表II题解:[链表:环找到了,那入口呢?](https://programmercarl.com/0142.环形链表II.html) -# 其他语言版本 +## 其他语言版本 -## Java +### Java ```java public class Solution { @@ -91,7 +90,7 @@ public class Solution { } ``` -## Python +### Python ```python class Solution: @@ -111,7 +110,7 @@ class Solution: ```go ``` -## JavaScript +### JavaScript ```js var hasCycle = function(head) { diff --git "a/problems/0143.\351\207\215\346\216\222\351\223\276\350\241\250.md" "b/problems/0143.\351\207\215\346\216\222\351\223\276\350\241\250.md" index a6412d2ee2..f072ec8f64 100644 --- "a/problems/0143.\351\207\215\346\216\222\351\223\276\350\241\250.md" +++ "b/problems/0143.\351\207\215\346\216\222\351\223\276\350\241\250.md" @@ -10,7 +10,7 @@ ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210726160122.png) -# 思路 +## 思路 本篇将给出三种C++实现的方法 @@ -18,7 +18,7 @@ * 双向队列模拟 * 直接分割链表 -## 方法一 +### 方法一 把链表放进数组中,然后通过双指针法,一前一后,来遍历数组,构造链表。 @@ -55,7 +55,7 @@ public: }; ``` -## 方法二 +### 方法二 把链表放进双向队列,然后通过双向队列一前一后弹出数据,来构造新的链表。这种方法比操作数组容易一些,不用双指针模拟一前一后了 @@ -92,7 +92,7 @@ public: }; ``` -## 方法三 +### 方法三 将链表分割成两个链表,然后把第二个链表反转,之后在通过两个链表拼接成新的链表。 @@ -168,54 +168,11 @@ public: }; ``` -# 其他语言版本 +## 其他语言版本 -Java: +### Java ```java -// 方法三 -public class ReorderList { - public void reorderList(ListNode head) { - ListNode fast = head, slow = head; - //求出中点 - while (fast.next != null && fast.next.next != null) { - slow = slow.next; - fast = fast.next.next; - } - //right就是右半部分 12345 就是45 1234 就是34 - ListNode right = slow.next; - //断开左部分和右部分 - slow.next = null; - //反转右部分 right就是反转后右部分的起点 - right = reverseList(right); - //左部分的起点 - ListNode left = head; - //进行左右部分来回连接 - //这里左部分的节点个数一定大于等于右部分的节点个数 因此只判断right即可 - while (right != null) { - ListNode curLeft = left.next; - left.next = right; - left = curLeft; - - ListNode curRight = right.next; - right.next = left; - right = curRight; - } - } - - public ListNode reverseList(ListNode head) { - ListNode headNode = new ListNode(0); - ListNode cur = head; - ListNode next = null; - while (cur != null) { - next = cur.next; - cur.next = headNode.next; - headNode.next = cur; - cur = next; - } - return headNode.next; - } -} // 方法一 Java实现,使用数组存储节点 class Solution { @@ -278,10 +235,54 @@ class Solution { } } +// 方法三 +public class ReorderList { + public void reorderList(ListNode head) { + ListNode fast = head, slow = head; + //求出中点 + while (fast.next != null && fast.next.next != null) { + slow = slow.next; + fast = fast.next.next; + } + //right就是右半部分 12345 就是45 1234 就是34 + ListNode right = slow.next; + //断开左部分和右部分 + slow.next = null; + //反转右部分 right就是反转后右部分的起点 + right = reverseList(right); + //左部分的起点 + ListNode left = head; + //进行左右部分来回连接 + //这里左部分的节点个数一定大于等于右部分的节点个数 因此只判断right即可 + while (right != null) { + ListNode curLeft = left.next; + left.next = right; + left = curLeft; + + ListNode curRight = right.next; + right.next = left; + right = curRight; + } + } + + public ListNode reverseList(ListNode head) { + ListNode headNode = new ListNode(0); + ListNode cur = head; + ListNode next = null; + while (cur != null) { + next = cur.next; + cur.next = headNode.next; + headNode.next = cur; + cur = next; + } + return headNode.next; + } +} + ``` -Python: -```python3 +### Python +```python # 方法二 双向队列 class Solution: def reorderList(self, head: ListNode) -> None: @@ -336,9 +337,10 @@ class Solution: cur = temp return pre ``` -Go: +### Go + +### JavaScript -JavaScript: ```javascript // 方法一 使用数组存储节点 var reorderList = function(head, s = [], tmp) { diff --git "a/problems/0234.\345\233\236\346\226\207\351\223\276\350\241\250.md" "b/problems/0234.\345\233\236\346\226\207\351\223\276\350\241\250.md" index db02a6babb..b47718e2dc 100644 --- "a/problems/0234.\345\233\236\346\226\207\351\223\276\350\241\250.md" +++ "b/problems/0234.\345\233\236\346\226\207\351\223\276\350\241\250.md" @@ -22,9 +22,9 @@ * 输出: true -# 思路 +## 思路 -## 数组模拟 +### 数组模拟 最直接的想法,就是把链表装成数组,然后再判断是否回文。 @@ -79,7 +79,7 @@ public: ``` -## 反转后半部分链表 +### 反转后半部分链表 分为如下几步: @@ -139,9 +139,9 @@ public: ``` -# 其他语言版本 +## 其他语言版本 -## Java +### Java ```java // 方法一,使用数组 @@ -215,9 +215,9 @@ class Solution { } ``` -## Python +### Python -```python3 +```python #数组模拟 class Solution: def isPalindrome(self, head: ListNode) -> bool: @@ -281,7 +281,7 @@ class Solution: ``` -## JavaScript +### JavaScript ```js var isPalindrome = function(head) { diff --git "a/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" "b/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" index 5587a8c725..a5c6f73b34 100644 --- "a/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" +++ "b/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" @@ -9,7 +9,7 @@ > 本周讲解了[贪心理论基础](https://programmercarl.com/贪心算法理论基础.html),以及第一道贪心的题目:[贪心算法:分发饼干](https://programmercarl.com/0455.分发饼干.html),可能会给大家一种贪心算法比较简单的错觉,好了,接下来几天的题目难度要上来了,哈哈。 -## 376. 摆动序列 +# 376. 摆动序列 [力扣题目链接](https://leetcode-cn.com/problems/wiggle-subsequence/) @@ -20,18 +20,18 @@ 给定一个整数序列,返回作为摆动序列的最长子序列的长度。 通过从原始序列中删除一些(也可以不删除)元素来获得子序列,剩下的元素保持其原始顺序。 示例 1: -输入: [1,7,4,9,2,5] -输出: 6 -解释: 整个序列均为摆动序列。 +* 输入: [1,7,4,9,2,5] +* 输出: 6 +* 解释: 整个序列均为摆动序列。 示例 2: -输入: [1,17,5,10,13,15,10,5,16,8] -输出: 7 -解释: 这个序列包含几个长度为 7 摆动序列,其中一个可为[1,17,10,13,10,16,8]。 +* 输入: [1,17,5,10,13,15,10,5,16,8] +* 输出: 7 +* 解释: 这个序列包含几个长度为 7 摆动序列,其中一个可为[1,17,10,13,10,16,8]。 示例 3: -输入: [1,2,3,4,5,6,7,8,9] -输出: 2 +* 输入: [1,2,3,4,5,6,7,8,9] +* 输出: 2 ## 思路1(贪心解法) @@ -172,7 +172,7 @@ public: ## 其他语言版本 -Java: +### Java ```Java class Solution { public int wiggleMaxLength(int[] nums) { @@ -199,7 +199,7 @@ class Solution { } ``` -Python: +### Python ```python3 class Solution: def wiggleMaxLength(self, nums: List[int]) -> int: @@ -212,7 +212,7 @@ class Solution: return res ``` -Go: +### Go ```golang func wiggleMaxLength(nums []int) int { var count,preDiff,curDiff int @@ -232,7 +232,7 @@ func wiggleMaxLength(nums []int) int { } ``` -Javascript: +### Javascript ```Javascript var wiggleMaxLength = function(nums) { if(nums.length <= 1) return nums.length diff --git "a/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" "b/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" index 2dc5126540..c992b9a52a 100644 --- "a/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" +++ "b/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" @@ -7,7 +7,7 @@

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

-## 455.分发饼干 +# 455.分发饼干 [力扣题目链接](https://leetcode-cn.com/problems/assign-cookies/) @@ -16,20 +16,14 @@ 对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j,都有一个尺寸 s[j] 。如果 s[j] >= g[i],我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。 示例 1: -输入: g = [1,2,3], s = [1,1] -输出: 1 -解释: -你有三个孩子和两块小饼干,3个孩子的胃口值分别是:1,2,3。 -虽然你有两块小饼干,由于他们的尺寸都是1,你只能让胃口值是1的孩子满足。 -所以你应该输出1。 +* 输入: g = [1,2,3], s = [1,1] +* 输出: 1 +解释:你有三个孩子和两块小饼干,3个孩子的胃口值分别是:1,2,3。虽然你有两块小饼干,由于他们的尺寸都是1,你只能让胃口值是1的孩子满足。所以你应该输出1。 示例 2: -输入: g = [1,2], s = [1,2,3] -输出: 2 -解释: -你有两个孩子和三块小饼干,2个孩子的胃口值分别是1,2。 -你拥有的饼干数量和尺寸都足以让所有孩子满足。 -所以你应该输出2. +* 输入: g = [1,2], s = [1,2,3] +* 输出: 2 +* 解释:你有两个孩子和三块小饼干,2个孩子的胃口值分别是1,2。你拥有的饼干数量和尺寸都足以让所有孩子满足。所以你应该输出2. 提示: @@ -114,7 +108,7 @@ public: ## 其他语言版本 -Java: +### Java ```java class Solution { // 思路1:优先考虑饼干,小饼干先喂饱小胃口 @@ -153,7 +147,7 @@ class Solution { } ``` -Python: +### Python ```python3 class Solution: # 思路1:优先考虑胃饼干 @@ -180,7 +174,7 @@ class Solution: return count ``` -Go: +### Go ```golang //排序后,局部最优 func findContentChildren(g []int, s []int) int { @@ -199,7 +193,7 @@ func findContentChildren(g []int, s []int) int { } ``` -Javascript: +### Javascript ```js var findContentChildren = function(g, s) { g = g.sort((a, b) => a - b) @@ -217,7 +211,7 @@ var findContentChildren = function(g, s) { ``` -C: +### C ```c int cmp(int* a, int* b) { return *a - *b; diff --git "a/problems/\344\272\214\345\217\211\346\240\221\346\200\273\347\273\223\347\257\207.md" "b/problems/\344\272\214\345\217\211\346\240\221\346\200\273\347\273\223\347\257\207.md" index 37696fc053..322670e037 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\346\200\273\347\273\223\347\257\207.md" @@ -150,6 +150,12 @@ 所以求普通二叉树的属性还是要具体问题具体分析。 +二叉树专题汇聚为一张图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211030125421.png) + +这个图是 [代码随想录知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) 成员:[青](https://wx.zsxq.com/dweb2/index/footprint/185251215558842),所画,总结的非常好,分享给大家。 + **最后,二叉树系列就这么完美结束了,估计这应该是最长的系列了,感谢大家33天的坚持与陪伴,接下来我们又要开始新的系列了「回溯算法」!** diff --git "a/problems/\345\233\236\346\272\257\346\200\273\347\273\223.md" "b/problems/\345\233\236\346\272\257\346\200\273\347\273\223.md" index 50a61b9e8e..b12b88e14a 100644 --- "a/problems/\345\233\236\346\272\257\346\200\273\347\273\223.md" +++ "b/problems/\345\233\236\346\272\257\346\200\273\347\273\223.md" @@ -432,9 +432,9 @@ N皇后问题分析: 回溯专题汇聚为一张图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211025180652.png) +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211030124742.png) -这个图是 [代码随想录知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) 成员:莫非毛,所画,总结的非常好,分享给大家。 +这个图是 [代码随想录知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) 成员:[莫非毛](https://wx.zsxq.com/dweb2/index/footprint/828844212542),所画,总结的非常好,分享给大家。 **回溯算法系列正式结束,新的系列终将开始,录友们准备开启新的征程!** diff --git "a/problems/\350\264\252\345\277\203\347\256\227\346\263\225\346\200\273\347\273\223\347\257\207.md" "b/problems/\350\264\252\345\277\203\347\256\227\346\263\225\346\200\273\347\273\223\347\257\207.md" index 09d22da16b..9d506f758a 100644 --- "a/problems/\350\264\252\345\277\203\347\256\227\346\263\225\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/\350\264\252\345\277\203\347\256\227\346\263\225\346\200\273\347\273\223\347\257\207.md" @@ -126,6 +126,14 @@ Carl个人认为:如果找出局部最优并可以推出全局最优,就是 ## 总结 + +贪心专题汇聚为一张图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211110121605.png) + +这个图是 [代码随想录知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) 成员:[青](https://wx.zsxq.com/dweb2/index/footprint/185251215558842)所画,总结的非常好,分享给大家。 + + 很多没有接触过贪心的同学都会感觉贪心有啥可学的,但只要跟着「代码随想录」坚持下来之后,就会发现,贪心是一种很重要的算法思维而且并不简单,贪心往往妙的出其不意,触不及防! **回想一下我们刚刚开始讲解贪心的时候,大家会发现自己在坚持中进步了很多!** From e2bfff837d1e89411f666abdb19ebf47be14d78a Mon Sep 17 00:00:00 2001 From: youngyangyang04 <826123027@qq.com> Date: Thu, 11 Nov 2021 01:40:57 +0800 Subject: [PATCH 0034/3019] Update --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 69de320e1b..6ca09467d2 100644 --- a/README.md +++ b/README.md @@ -10,9 +10,11 @@ > 4. **提交代码**:本项目统一使用C++语言进行讲解,但已经有Java、Python、Go、JavaScript等等多语言版本,感谢[这里的每一位贡献者](https://github.com/youngyangyang04/leetcode-master/graphs/contributors),如果你也想贡献代码点亮你的头像,[点击这里](https://mp.weixin.qq.com/s/tqCxrMEU-ajQumL1i8im9A)了解提交代码的方式。 > 5. **转载须知** :以下所有文章皆为我([程序员Carl](https://github.com/youngyangyang04))的原创。引用本项目文章请注明出处,发现恶意抄袭或搬运,会动用法律武器维护自己的权益。让我们一起维护一个良好的技术创作环境! +

阿里云服务器,双11特价活动🔥🔥🔥🔥

+

- + # LeetCode 刷题攻略 From fb8c50c73fb44310697d8475fb11c26c148313c1 Mon Sep 17 00:00:00 2001 From: youngyangyang04 <826123027@qq.com> Date: Thu, 11 Nov 2021 01:46:14 +0800 Subject: [PATCH 0035/3019] Update --- README.md | 2 +- .../\351\230\277\351\207\214\344\272\221.png" | Bin 0 -> 341267 bytes 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 "pics/\351\230\277\351\207\214\344\272\221.png" diff --git a/README.md b/README.md index 6ca09467d2..7d56f9d7b9 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@

- + # LeetCode 刷题攻略 diff --git "a/pics/\351\230\277\351\207\214\344\272\221.png" "b/pics/\351\230\277\351\207\214\344\272\221.png" new file mode 100644 index 0000000000000000000000000000000000000000..79f41d6beb9983c5945aec7cfd65bb98e1e448d6 GIT binary patch literal 341267 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%0D2;H;P>vk?D7C}k_p!lceL|*9WpNS;<1g6sH}Ty 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

n#`kpU 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 z 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 bJpkE!5ejt0UUOjqK8E^tu3@h}3i*EkiC|i& literal 0 HcmV?d00001 From 980a3cf767adbe1e24e469b204d2e78b2485ef7f Mon Sep 17 00:00:00 2001 From: youngyangyang04 <826123027@qq.com> Date: Thu, 11 Nov 2021 11:01:13 +0800 Subject: [PATCH 0036/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=B4=BB=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...244\346\225\260\344\271\213\345\222\214.md" | 17 +++++++---------- ...236\346\226\207\345\255\220\344\270\262.md" | 17 +++++++---------- ...211\346\225\260\344\271\213\345\222\214.md" | 17 +++++++---------- ...227\346\257\215\347\273\204\345\220\210.md" | 17 +++++++---------- ...233\346\225\260\344\271\213\345\222\214.md" | 17 +++++++---------- ...54N\344\270\252\350\212\202\347\202\271.md" | 17 +++++++---------- ...210\347\232\204\346\213\254\345\217\267.md" | 17 +++++++---------- ...255\347\232\204\350\212\202\347\202\271.md" | 17 +++++++---------- ...273\351\231\244\345\205\203\347\264\240.md" | 17 +++++++---------- .../0028.\345\256\236\347\216\260strStr.md" | 17 +++++++---------- ...200\344\270\252\346\216\222\345\210\227.md" | 17 +++++++---------- ...200\344\270\252\344\275\215\347\275\256.md" | 17 +++++++---------- ...222\345\205\245\344\275\215\347\275\256.md" | 17 +++++++---------- ...37.\350\247\243\346\225\260\347\213\254.md" | 17 +++++++---------- ...204\345\220\210\346\200\273\345\222\214.md" | 17 +++++++---------- ...4\345\220\210\346\200\273\345\222\214II.md" | 17 +++++++---------- ...42.\346\216\245\351\233\250\346\260\264.md" | 17 +++++++---------- ...3\350\267\203\346\270\270\346\210\217II.md" | 17 +++++++---------- ...46.\345\205\250\346\216\222\345\210\227.md" | 17 +++++++---------- ....\345\205\250\346\216\222\345\210\227II.md" | 17 +++++++---------- "problems/0051.N\347\232\207\345\220\216.md" | 17 +++++++---------- "problems/0052.N\347\232\207\345\220\216II.md" | 17 +++++++---------- ...247\345\255\220\345\272\217\345\222\214.md" | 17 +++++++---------- ...201\350\247\204\345\210\222\357\274\211.md" | 17 +++++++---------- ...263\350\267\203\346\270\270\346\210\217.md" | 17 +++++++---------- ...210\345\271\266\345\214\272\351\227\264.md" | 17 +++++++---------- ...2\346\227\213\347\237\251\351\230\265II.md" | 17 +++++++---------- ...215\345\220\214\350\267\257\345\276\204.md" | 17 +++++++---------- ...5\345\220\214\350\267\257\345\276\204II.md" | 17 +++++++---------- ...70.\347\210\254\346\245\274\346\242\257.md" | 17 +++++++---------- ...214\345\214\205\347\211\210\346\234\254.md" | 17 +++++++---------- ...226\350\276\221\350\267\235\347\246\273.md" | 17 +++++++---------- "problems/0077.\347\273\204\345\220\210.md" | 17 +++++++---------- ...204\345\220\210\344\274\230\345\214\226.md" | 17 +++++++---------- "problems/0078.\345\255\220\351\233\206.md" | 17 +++++++---------- ...247\347\232\204\347\237\251\345\275\242.md" | 17 +++++++---------- "problems/0090.\345\255\220\351\233\206II.md" | 17 +++++++---------- ...5\345\216\237IP\345\234\260\345\235\200.md" | 17 +++++++---------- ...211\346\220\234\347\264\242\346\240\221.md" | 17 +++++++---------- ...211\346\220\234\347\264\242\346\240\221.md" | 17 +++++++---------- ...270\345\220\214\347\232\204\346\240\221.md" | 17 +++++++---------- ...260\344\272\214\345\217\211\346\240\221.md" | 17 +++++++---------- ...202\345\272\217\351\201\215\345\216\206.md" | 17 +++++++---------- ...200\345\244\247\346\267\261\345\272\246.md" | 17 +++++++---------- ...240\344\272\214\345\217\211\346\240\221.md" | 17 +++++++---------- ...211\346\220\234\347\264\242\346\240\221.md" | 17 +++++++---------- ...241\344\272\214\345\217\211\346\240\221.md" | 17 +++++++---------- ...200\345\260\217\346\267\261\345\272\246.md" | 17 +++++++---------- ...257\345\276\204\346\200\273\345\222\214.md" | 17 +++++++---------- ...204\345\255\220\345\272\217\345\210\227.md" | 17 +++++++---------- ...202\347\202\271\346\214\207\351\222\210.md" | 17 +++++++---------- ...200\344\275\263\346\227\266\346\234\272.md" | 17 +++++++---------- ...0\344\275\263\346\227\266\346\234\272II.md" | 17 +++++++---------- ...201\350\247\204\345\210\222\357\274\211.md" | 17 +++++++---------- ...\344\275\263\346\227\266\346\234\272III.md" | 17 +++++++---------- ...225\350\257\215\346\216\245\351\276\231.md" | 17 +++++++---------- ...260\345\255\227\344\271\213\345\222\214.md" | 17 +++++++---------- ...262\345\233\236\346\226\207\344\270\262.md" | 17 +++++++---------- ...2\345\233\236\346\226\207\344\270\262II.md" | 17 +++++++---------- ...34.\345\212\240\346\262\271\347\253\231.md" | 17 +++++++---------- ...206\345\217\221\347\263\226\346\236\234.md" | 17 +++++++---------- ...225\350\257\215\346\213\206\345\210\206.md" | 17 +++++++---------- ...257\345\275\242\351\223\276\350\241\250.md" | 17 +++++++---------- ...7\345\275\242\351\223\276\350\241\250II.md" | 17 +++++++---------- ...215\346\216\222\351\223\276\350\241\250.md" | 17 +++++++---------- ...276\345\274\217\346\261\202\345\200\274.md" | 17 +++++++---------- ...214\347\232\204\345\215\225\350\257\215.md" | 17 +++++++---------- ...270\344\272\244\351\223\276\350\241\250.md" | 17 +++++++---------- ...0\344\275\263\346\227\266\346\234\272IV.md" | 17 +++++++---------- ...213\350\275\254\346\225\260\347\273\204.md" | 17 +++++++---------- ...223\345\256\266\345\212\253\350\210\215.md" | 17 +++++++---------- ...02.\345\277\253\344\271\220\346\225\260.md" | 17 +++++++---------- ...276\350\241\250\345\205\203\347\264\240.md" | 17 +++++++---------- ...204\345\255\227\347\254\246\344\270\262.md" | 17 +++++++---------- ...273\350\275\254\351\223\276\350\241\250.md" | 17 +++++++---------- ...204\345\255\220\346\225\260\347\273\204.md" | 17 +++++++---------- ...3\345\256\266\345\212\253\350\210\215II.md" | 17 +++++++---------- ...\345\220\210\346\200\273\345\222\214III.md" | 17 +++++++---------- ...202\347\202\271\344\270\252\346\225\260.md" | 17 +++++++---------- ...227\345\256\236\347\216\260\346\240\210.md" | 17 +++++++---------- ...254\344\272\214\345\217\211\346\240\221.md" | 17 +++++++---------- ...236\347\216\260\351\230\237\345\210\227.md" | 17 +++++++---------- ...236\346\226\207\351\223\276\350\241\250.md" | 17 +++++++---------- ...254\345\205\261\347\245\226\345\205\210.md" | 17 +++++++---------- ...254\345\205\261\347\245\226\345\205\210.md" | 17 +++++++---------- ...243\346\234\200\345\244\247\345\200\274.md" | 17 +++++++---------- ...215\345\274\202\344\275\215\350\257\215.md" | 17 +++++++---------- ...200\346\234\211\350\267\257\345\276\204.md" | 17 +++++++---------- ...250\345\271\263\346\226\271\346\225\260.md" | 17 +++++++---------- ...83.\347\247\273\345\212\250\351\233\266.md" | 17 +++++++---------- ...207\345\255\220\345\272\217\345\210\227.md" | 17 +++++++---------- ...253\345\206\267\345\206\273\346\234\237.md" | 17 +++++++---------- ...266\351\222\261\345\205\221\346\215\242.md" | 17 +++++++---------- ...211\346\216\222\350\241\214\347\250\213.md" | 17 +++++++---------- ...\345\256\266\345\212\253\350\210\215III.md" | 17 +++++++---------- ...264\346\225\260\346\213\206\345\210\206.md" | 17 +++++++---------- ...254\345\255\227\347\254\246\344\270\262.md" | 17 +++++++---------- ...230\351\242\221\345\205\203\347\264\240.md" | 17 +++++++---------- ...204\347\232\204\344\272\244\351\233\206.md" | 17 +++++++---------- ...206\345\212\250\345\272\217\345\210\227.md" | 17 +++++++---------- ...210\346\200\273\345\222\214\342\205\243.md" | 17 +++++++---------- ...83.\350\265\216\351\207\221\344\277\241.md" | 17 +++++++---------- ...255\345\255\220\345\272\217\345\210\227.md" | 17 +++++++---------- ...266\345\255\220\344\271\213\345\222\214.md" | 17 +++++++---------- ...215\345\273\272\351\230\237\345\210\227.md" | 17 +++++++---------- ...211\345\222\214\345\255\220\351\233\206.md" | 17 +++++++---------- ...215\345\217\240\345\214\272\351\227\264.md" | 17 +++++++---------- ...255\347\232\204\350\212\202\347\202\271.md" | 17 +++++++---------- ...225\347\210\206\346\260\224\347\220\203.md" | 17 +++++++---------- ...3\346\225\260\347\233\270\345\212\240II.md" | 17 +++++++---------- ...206\345\217\221\351\245\274\345\271\262.md" | 17 +++++++---------- ...220\345\255\227\347\254\246\344\270\262.md" | 17 +++++++---------- ...277\347\232\204\345\221\250\351\225\277.md" | 17 +++++++---------- ...74.\344\270\200\345\222\214\351\233\266.md" | 17 +++++++---------- ...236\345\255\220\345\272\217\345\210\227.md" | 17 +++++++---------- ...94.\347\233\256\346\240\207\345\222\214.md" | 17 +++++++---------- ...64\345\244\247\345\205\203\347\264\240I.md" | 17 +++++++---------- ...255\347\232\204\344\274\227\346\225\260.md" | 17 +++++++---------- ...4\345\244\247\345\205\203\347\264\240II.md" | 17 +++++++---------- ...242\351\202\243\345\245\221\346\225\260.md" | 17 +++++++---------- ...213\350\247\222\347\232\204\345\200\274.md" | 17 +++++++---------- ...207\345\255\220\345\272\217\345\210\227.md" | 17 +++++++---------- ...6\351\222\261\345\205\221\346\215\242II.md" | 17 +++++++---------- ...217\347\273\235\345\257\271\345\267\256.md" | 17 +++++++---------- ...272\347\264\257\345\212\240\346\240\221.md" | 17 +++++++---------- ...4\345\255\227\347\254\246\344\270\262II.md" | 17 +++++++---------- ...240\351\231\244\346\223\215\344\275\234.md" | 17 +++++++---------- ...266\344\272\214\345\217\211\346\240\221.md" | 17 +++++++---------- ...236\346\226\207\345\255\220\344\270\262.md" | 17 +++++++---------- ...ta2\345\217\202\350\256\256\351\231\242.md" | 17 +++++++---------- ...247\344\272\214\345\217\211\346\240\221.md" | 17 +++++++---------- ...224\345\233\236\345\216\237\347\202\271.md" | 17 +++++++---------- ...211\346\220\234\347\264\242\346\240\221.md" | 17 +++++++---------- ...227\347\232\204\344\270\252\346\225\260.md" | 17 +++++++---------- ...222\345\242\236\345\272\217\345\210\227.md" | 17 +++++++---------- ...227\344\275\231\350\277\236\346\216\245.md" | 17 +++++++---------- ...7\344\275\231\350\277\236\346\216\245II.md" | 17 +++++++---------- ...255\347\232\204\346\220\234\347\264\242.md" | 17 +++++++---------- ...222\345\205\245\346\223\215\344\275\234.md" | 17 +++++++---------- ...214\345\210\206\346\237\245\346\211\276.md" | 17 +++++++---------- ...276\350\256\241\351\223\276\350\241\250.md" | 17 +++++++---------- ...253\346\211\213\347\273\255\350\264\271.md" | 17 +++++++---------- ...201\350\247\204\345\210\222\357\274\211.md" | 17 +++++++---------- ...215\345\255\220\346\225\260\347\273\204.md" | 17 +++++++---------- ...255\345\277\203\347\264\242\345\274\225.md" | 17 +++++++---------- ...236\347\232\204\346\225\260\345\255\227.md" | 17 +++++++---------- ...217\346\227\245\346\270\251\345\272\246.md" | 17 +++++++---------- ...271\347\210\254\346\245\274\346\242\257.md" | 17 +++++++---------- ...227\346\257\215\345\214\272\351\227\264.md" | 17 +++++++---------- ...231\345\222\214\346\210\277\351\227\264.md" | 17 +++++++---------- ...204\345\255\227\347\254\246\344\270\262.md" | 17 +++++++---------- ...254\346\260\264\346\211\276\351\233\266.md" | 17 +++++++---------- ...2\345\272\217\346\225\260\347\273\204II.md" | 17 +++++++---------- ...277\346\214\211\351\224\256\345\205\245.md" | 17 +++++++---------- ...261\350\204\211\346\225\260\347\273\204.md" | 17 +++++++---------- ...247\344\272\214\345\217\211\346\240\221.md" | 17 +++++++---------- ...204\347\232\204\345\271\263\346\226\271.md" | 17 +++++++---------- ...270\347\224\250\345\255\227\347\254\246.md" | 17 +++++++---------- ...204\346\225\260\347\273\204\345\222\214.md" | 17 +++++++---------- ...270\344\272\244\347\232\204\347\272\277.md" | 17 +++++++---------- ...273\351\207\215\345\244\215\351\241\271.md" | 17 +++++++---------- ...4\347\232\204\351\207\215\351\207\217II.md" | 17 +++++++---------- ...261\345\255\220\345\272\217\345\210\227.md" | 17 +++++++---------- ...272\347\216\260\346\254\241\346\225\260.md" | 17 +++++++---------- ...241\345\255\227\347\254\246\344\270\262.md" | 17 +++++++---------- ...260\347\233\256\346\216\222\345\272\217.md" | 17 +++++++---------- ...227\347\232\204\346\225\260\345\255\227.md" | 17 +++++++---------- ...221\345\217\230\345\271\263\350\241\241.md" | 17 +++++++---------- ...257\345\244\232\345\244\247\357\274\237.md" | 17 +++++++---------- ...211\346\255\245\351\223\272\345\236\253.md" | 17 +++++++---------- ...246\347\235\200\345\233\236\346\272\257.md" | 17 +++++++---------- ...221\346\200\273\347\273\223\347\257\207.md" | 18 +++++++----------- ...206\350\256\272\345\237\272\347\241\200.md" | 17 +++++++---------- ...200\350\277\255\344\273\243\346\263\225.md" | 17 +++++++---------- ...255\344\273\243\351\201\215\345\216\206.md" | 17 +++++++---------- ...222\345\275\222\351\201\215\345\216\206.md" | 17 +++++++---------- ...250\350\277\231\351\207\214\357\274\201.md" | 17 +++++++---------- ...277\346\215\242\347\251\272\346\240\274.md" | 17 +++++++---------- ...254\345\255\227\347\254\246\344\270\262.md" | 17 +++++++---------- ...230\346\200\273\347\273\223\347\257\207.md" | 17 +++++++---------- ...222\346\200\273\347\273\223\347\257\207.md" | 17 +++++++---------- ...206\350\256\272\345\237\272\347\241\200.md" | 17 +++++++---------- ...207\351\222\210\346\200\273\347\273\223.md" | 17 +++++++---------- ...214\350\241\250\346\200\273\347\273\223.md" | 17 +++++++---------- ...206\350\256\272\345\237\272\347\241\200.md" | 17 +++++++---------- ...236\346\272\257\346\200\273\347\273\223.md" | 18 +++++++----------- ...200\347\247\215\345\206\231\346\263\225.md" | 17 +++++++---------- ...206\350\256\272\345\237\272\347\241\200.md" | 17 +++++++---------- ...246\344\270\262\346\200\273\347\273\223.md" | 17 +++++++---------- ...204\346\200\273\347\273\223\347\257\207.md" | 17 +++++++---------- ...206\350\256\272\345\237\272\347\241\200.md" | 17 +++++++---------- ...237\345\210\227\346\200\273\347\273\223.md" | 17 +++++++---------- ...206\350\256\272\345\237\272\347\241\200.md" | 17 +++++++---------- ...206\350\256\262\350\247\243\357\274\211.md" | 17 +++++++---------- ...227\346\263\225\346\250\241\346\235\277.md" | 17 +++++++---------- ...205\346\200\273\347\273\223\347\257\207.md" | 17 +++++++---------- ...347\241\20001\350\203\214\345\214\205-1.md" | 17 +++++++---------- ...347\241\20001\350\203\214\345\214\205-2.md" | 17 +++++++---------- ...232\351\207\215\350\203\214\345\214\205.md" | 17 +++++++---------- ...214\345\205\250\350\203\214\345\214\205.md" | 17 +++++++---------- ...225\346\200\273\347\273\223\347\257\207.md" | 18 +++++++----------- ...206\350\256\272\345\237\272\347\241\200.md" | 17 +++++++---------- ...250\346\200\273\347\273\223\347\257\207.md" | 17 +++++++---------- ...206\350\256\272\345\237\272\347\241\200.md" | 17 +++++++---------- ...276\350\241\250\347\233\270\344\272\244.md" | 17 +++++++---------- 205 files changed, 1435 insertions(+), 2053 deletions(-) diff --git "a/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" "b/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" index 949e52a718..208f310e43 100644 --- "a/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + ## 1. 两数之和 @@ -250,7 +247,7 @@ 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.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" "b/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" index 82d9edae99..c75a74f6d4 100644 --- "a/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" +++ "b/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + @@ -440,7 +437,7 @@ 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.\344\270\211\346\225\260\344\271\213\345\222\214.md" "b/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" index 5c9a240b50..983e4d8410 100644 --- "a/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + @@ -438,7 +435,7 @@ 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.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" "b/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" index 270398fb3b..003aeb9a63 100644 --- "a/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" +++ "b/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + # 17.电话号码的字母组合 @@ -485,7 +482,7 @@ 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.\345\233\233\346\225\260\344\271\213\345\222\214.md" "b/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" index e1d0d03cf3..5b2cf122d2 100644 --- "a/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + > 一样的道理,能解决四数之和 @@ -404,7 +401,7 @@ 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.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" "b/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" index fe68d99939..51e4e4adce 100644 --- "a/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" +++ "b/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + @@ -230,7 +227,7 @@ 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.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" "b/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" index bf0884b38e..587c07a70b 100644 --- "a/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" +++ "b/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + @@ -287,7 +284,7 @@ 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.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" "b/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" index 11828ca08f..c030a62e4c 100644 --- "a/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" +++ "b/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + ## 24. 两两交换链表中的节点 @@ -280,7 +277,7 @@ 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.\347\247\273\351\231\244\345\205\203\347\264\240.md" "b/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" index 842b3c78ef..2cf9c169c4 100644 --- "a/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" +++ "b/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + ## 27. 移除元素 @@ -287,7 +284,7 @@ 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.\345\256\236\347\216\260strStr.md" "b/problems/0028.\345\256\236\347\216\260strStr.md" index 1c200a7108..4f7c3c2fb3 100644 --- "a/problems/0028.\345\256\236\347\216\260strStr.md" +++ "b/problems/0028.\345\256\236\347\216\260strStr.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + > 在一个串中查找是否出现过另一个串,这是KMP的看家本领。 @@ -899,7 +896,7 @@ 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.\344\270\213\344\270\200\344\270\252\346\216\222\345\210\227.md" "b/problems/0031.\344\270\213\344\270\200\344\270\252\346\216\222\345\210\227.md" index 9999486ec9..9d951d1bc4 100644 --- "a/problems/0031.\344\270\213\344\270\200\344\270\252\346\216\222\345\210\227.md" +++ "b/problems/0031.\344\270\213\344\270\200\344\270\252\346\216\222\345\210\227.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + @@ -224,7 +221,7 @@ 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.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" "b/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" index f8299ea866..028afd3dd4 100644 --- "a/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" +++ "b/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + # 34. 在排序数组中查找元素的第一个和最后一个位置 @@ -440,7 +437,7 @@ 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.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" "b/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" index 274e741f0c..6d86a52839 100644 --- "a/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" +++ "b/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + @@ -322,7 +319,7 @@ 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.\350\247\243\346\225\260\347\213\254.md" "b/problems/0037.\350\247\243\346\225\260\347\213\254.md" index b7255a2a65..93bfca7cd6 100644 --- "a/problems/0037.\350\247\243\346\225\260\347\213\254.md" +++ "b/problems/0037.\350\247\243\346\225\260\347\213\254.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + 如果对回溯法理论还不清楚的同学,可以先看这个视频[视频来了!!带你学透回溯算法(理论篇)](https://mp.weixin.qq.com/s/wDd5azGIYWjbU0fdua_qBg) @@ -507,7 +504,7 @@ 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.\347\273\204\345\220\210\346\200\273\345\222\214.md" "b/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" index 4470c79ec0..a96efa215c 100644 --- "a/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" +++ "b/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + # 39. 组合总和 @@ -450,7 +447,7 @@ 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.\347\273\204\345\220\210\346\200\273\345\222\214II.md" "b/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" index bf2685fb38..0fd8f2db34 100644 --- "a/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" +++ "b/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + > 这篇可以说是全网把组合问题如何去重,讲的最清晰的了! @@ -522,7 +519,7 @@ 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.\346\216\245\351\233\250\346\260\264.md" "b/problems/0042.\346\216\245\351\233\250\346\260\264.md" index 9b26bc6b01..6fbf705526 100644 --- "a/problems/0042.\346\216\245\351\233\250\346\260\264.md" +++ "b/problems/0042.\346\216\245\351\233\250\346\260\264.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + > 这个图就是大厂面试经典题目,接雨水! 最常青藤的一道题,面试官百出不厌! @@ -744,7 +741,7 @@ 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.\350\267\263\350\267\203\346\270\270\346\210\217II.md" "b/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" index 43c2f019de..02d3839475 100644 --- "a/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" +++ "b/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + > 相对于[贪心算法:跳跃游戏](https://mp.weixin.qq.com/s/606_N9j8ACKCODoCbV1lSA)难了不少,做好心里准备! @@ -233,7 +230,7 @@ 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.\345\205\250\346\216\222\345\210\227.md" "b/problems/0046.\345\205\250\346\216\222\345\210\227.md" index 7c9a854944..6d41cd4a79 100644 --- "a/problems/0046.\345\205\250\346\216\222\345\210\227.md" +++ "b/problems/0046.\345\205\250\346\216\222\345\210\227.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + # 46.全排列 @@ -402,7 +399,7 @@ int** permute(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/0047.\345\205\250\346\216\222\345\210\227II.md" "b/problems/0047.\345\205\250\346\216\222\345\210\227II.md" index e4aca30c99..2d2cfa6670 100644 --- "a/problems/0047.\345\205\250\346\216\222\345\210\227II.md" +++ "b/problems/0047.\345\205\250\346\216\222\345\210\227II.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + # 排列问题(二) @@ -296,7 +293,7 @@ var permuteUnique = 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/0051.N\347\232\207\345\220\216.md" "b/problems/0051.N\347\232\207\345\220\216.md" index 71f0409705..31d5a18db1 100644 --- "a/problems/0051.N\347\232\207\345\220\216.md" +++ "b/problems/0051.N\347\232\207\345\220\216.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + # 第51题. N皇后 @@ -475,7 +472,7 @@ 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\347\232\207\345\220\216II.md" "b/problems/0052.N\347\232\207\345\220\216II.md" index 6d7a5bac77..98915a01a5 100644 --- "a/problems/0052.N\347\232\207\345\220\216II.md" +++ "b/problems/0052.N\347\232\207\345\220\216II.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + @@ -146,7 +143,7 @@ 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.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" "b/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" index 5c45aa0a74..2f7af69dd8 100644 --- "a/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" +++ "b/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + ## 53. 最大子序和 @@ -232,7 +229,7 @@ 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.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" "b/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" index 2c3ccc1553..583011fb32 100644 --- "a/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" +++ "b/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + ## 53. 最大子序和 @@ -189,7 +186,7 @@ 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.\350\267\263\350\267\203\346\270\270\346\210\217.md" "b/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" index 29e09a64d4..73659064e3 100644 --- "a/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" +++ "b/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + ## 55. 跳跃游戏 @@ -158,7 +155,7 @@ 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.\345\220\210\345\271\266\345\214\272\351\227\264.md" "b/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" index fd914497ad..634d3462b7 100644 --- "a/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" +++ "b/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + ## 56. 合并区间 @@ -271,7 +268,7 @@ 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.\350\236\272\346\227\213\347\237\251\351\230\265II.md" "b/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" index 994bd83946..06f8993d10 100644 --- "a/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" +++ "b/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + @@ -539,7 +536,7 @@ 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.\344\270\215\345\220\214\350\267\257\345\276\204.md" "b/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" index 31896fd13e..322a43789c 100644 --- "a/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" +++ "b/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + ## 62.不同路径 @@ -349,7 +346,7 @@ 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.\344\270\215\345\220\214\350\267\257\345\276\204II.md" "b/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" index c2f8ec204d..8f240bd664 100644 --- "a/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" +++ "b/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + ## 63. 不同路径 II @@ -338,7 +335,7 @@ 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.\347\210\254\346\245\274\346\242\257.md" "b/problems/0070.\347\210\254\346\245\274\346\242\257.md" index 97926e7ac1..a74f683cbd 100644 --- "a/problems/0070.\347\210\254\346\245\274\346\242\257.md" +++ "b/problems/0070.\347\210\254\346\245\274\346\242\257.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + ## 70. 爬楼梯 [力扣题目链接](https://leetcode-cn.com/problems/climbing-stairs/) @@ -298,7 +295,7 @@ 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.\347\210\254\346\245\274\346\242\257\345\256\214\345\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md" "b/problems/0070.\347\210\254\346\245\274\346\242\257\345\256\214\345\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md" index 02c995c3ee..cd6b9be858 100644 --- "a/problems/0070.\347\210\254\346\245\274\346\242\257\345\256\214\345\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md" +++ "b/problems/0070.\347\210\254\346\245\274\346\242\257\345\256\214\345\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + # 动态规划:以前我没得选,现在我选择再爬一次! 之前讲这道题目的时候,因为还没有讲背包问题,所以就只是讲了一下爬楼梯最直接的动规方法(斐波那契)。 @@ -203,7 +200,7 @@ 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.\347\274\226\350\276\221\350\267\235\347\246\273.md" "b/problems/0072.\347\274\226\350\276\221\350\267\235\347\246\273.md" index 8096c0ad9f..d01dc726d0 100644 --- "a/problems/0072.\347\274\226\350\276\221\350\267\235\347\246\273.md" +++ "b/problems/0072.\347\274\226\350\276\221\350\267\235\347\246\273.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + ## 72. 编辑距离 @@ -330,7 +327,7 @@ 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.\347\273\204\345\220\210.md" "b/problems/0077.\347\273\204\345\220\210.md" index ee2a4cb659..6d87251cd1 100644 --- "a/problems/0077.\347\273\204\345\220\210.md" +++ "b/problems/0077.\347\273\204\345\220\210.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + @@ -624,7 +621,7 @@ 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.\347\273\204\345\220\210\344\274\230\345\214\226.md" "b/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" index af92318216..0ed041c9d4 100644 --- "a/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" +++ "b/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + @@ -297,7 +294,7 @@ 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.\345\255\220\351\233\206.md" "b/problems/0078.\345\255\220\351\233\206.md" index 1ffc51ea9f..14c24a1e43 100644 --- "a/problems/0078.\345\255\220\351\233\206.md" +++ "b/problems/0078.\345\255\220\351\233\206.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + # 78.子集 @@ -333,7 +330,7 @@ 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.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" "b/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" index 427c23b9e3..f1109afc02 100644 --- "a/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" +++ "b/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + # 84.柱状图中最大的矩形 @@ -489,7 +486,7 @@ 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.\345\255\220\351\233\206II.md" "b/problems/0090.\345\255\220\351\233\206II.md" index c490914b1f..b9e2efe993 100644 --- "a/problems/0090.\345\255\220\351\233\206II.md" +++ "b/problems/0090.\345\255\220\351\233\206II.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + # 子集问题(二) @@ -363,7 +360,7 @@ 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.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" "b/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" index 5a5952bdd7..e18dff4e39 100644 --- "a/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" +++ "b/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + @@ -535,7 +532,7 @@ 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.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0096.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" index 38a4ad884e..08fabf933a 100644 --- "a/problems/0096.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" +++ "b/problems/0096.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + ## 96.不同的二叉搜索树 @@ -231,7 +228,7 @@ 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.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" index fcd928626e..d931774b76 100644 --- "a/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" +++ "b/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + # 98.验证二叉搜索树 @@ -526,7 +523,7 @@ 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.\347\233\270\345\220\214\347\232\204\346\240\221.md" "b/problems/0100.\347\233\270\345\220\214\347\232\204\346\240\221.md" index f5672b72d3..c2b527f48a 100644 --- "a/problems/0100.\347\233\270\345\220\214\347\232\204\346\240\221.md" +++ "b/problems/0100.\347\233\270\345\220\214\347\232\204\346\240\221.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + @@ -244,7 +241,7 @@ 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.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" "b/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" index fe3321ecfe..8e6b981c9e 100644 --- "a/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + # 101. 对称二叉树 @@ -579,7 +576,7 @@ 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.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" index 37f4f5269c..d82c16843a 100644 --- "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" +++ "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + # 二叉树层序遍历登场! @@ -1903,7 +1900,7 @@ 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.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" "b/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" index ff7cbfd1bf..5579a2d49f 100644 --- "a/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" +++ "b/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + 看完本篇可以一起做了如下两道题目: @@ -601,7 +598,7 @@ 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.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" "b/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" index 3ed16c97b2..389a546500 100644 --- "a/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + 看完本文,可以一起解决如下两道题目 @@ -892,7 +889,7 @@ struct TreeNode* buildTree(int* preorder, int preorderSize, int* inorder, int in ``` ----------------------- -* 作者微信:[程序员Carl](https://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.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" index 213eb2b970..8157df601f 100644 --- "a/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" +++ "b/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + > 构造二叉搜索树,一不小心就平衡了 @@ -396,7 +393,7 @@ struct TreeNode* sortedArrayToBST(int* nums, int numsSize) { ``` ----------------------- -* 作者微信:[程序员Carl](https://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.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" "b/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" index 640a18a7a6..9493520dbd 100644 --- "a/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + > 求高度还是求深度,你搞懂了不? @@ -739,7 +736,7 @@ bool isBalanced(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/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" "b/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" index 7fc6906528..14660a7def 100644 --- "a/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" +++ "b/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + > 和求最大深度一个套路? @@ -410,7 +407,7 @@ 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.\350\267\257\345\276\204\346\200\273\345\222\214.md" "b/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" index bfb03424ff..4e01e99f07 100644 --- "a/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" +++ "b/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + > 递归函数什么时候需要返回值 @@ -708,7 +705,7 @@ 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.\344\270\215\345\220\214\347\232\204\345\255\220\345\272\217\345\210\227.md" "b/problems/0115.\344\270\215\345\220\214\347\232\204\345\255\220\345\272\217\345\210\227.md" index 5fe69b9679..10e90c29e9 100644 --- "a/problems/0115.\344\270\215\345\220\214\347\232\204\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0115.\344\270\215\345\220\214\347\232\204\345\255\220\345\272\217\345\210\227.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + ## 115.不同的子序列 @@ -271,7 +268,7 @@ 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.\345\241\253\345\205\205\346\257\217\344\270\252\350\212\202\347\202\271\347\232\204\344\270\213\344\270\200\344\270\252\345\217\263\344\276\247\350\212\202\347\202\271\346\214\207\351\222\210.md" "b/problems/0116.\345\241\253\345\205\205\346\257\217\344\270\252\350\212\202\347\202\271\347\232\204\344\270\213\344\270\200\344\270\252\345\217\263\344\276\247\350\212\202\347\202\271\346\214\207\351\222\210.md" index 5aca82e1d2..e757cde915 100644 --- "a/problems/0116.\345\241\253\345\205\205\346\257\217\344\270\252\350\212\202\347\202\271\347\232\204\344\270\213\344\270\200\344\270\252\345\217\263\344\276\247\350\212\202\347\202\271\346\214\207\351\222\210.md" +++ "b/problems/0116.\345\241\253\345\205\205\346\257\217\344\270\252\350\212\202\347\202\271\347\232\204\344\270\213\344\270\200\344\270\252\345\217\263\344\276\247\350\212\202\347\202\271\346\214\207\351\222\210.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + # 116. 填充每个节点的下一个右侧节点指针 @@ -257,7 +254,7 @@ 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.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" "b/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" index 2f28cf1f4d..1bee632625 100644 --- "a/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" +++ "b/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + ## 121. 买卖股票的最佳时机 @@ -371,7 +368,7 @@ var maxProfit = function(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.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" index 130bb51f7c..31b267736e 100644 --- "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" +++ "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + ## 122.买卖股票的最佳时机II @@ -283,7 +280,7 @@ 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.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" index 30c56c2552..477430c672 100644 --- "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" +++ "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + ## 122.买卖股票的最佳时机II @@ -268,7 +265,7 @@ 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.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" "b/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" index da5d7a3c8f..78f6dde06c 100644 --- "a/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" +++ "b/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + ## 123.买卖股票的最佳时机III @@ -353,7 +350,7 @@ 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.\345\215\225\350\257\215\346\216\245\351\276\231.md" "b/problems/0127.\345\215\225\350\257\215\346\216\245\351\276\231.md" index ad8467b5e8..8467519485 100644 --- "a/problems/0127.\345\215\225\350\257\215\346\216\245\351\276\231.md" +++ "b/problems/0127.\345\215\225\350\257\215\346\216\245\351\276\231.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + # 127. 单词接龙 @@ -178,7 +175,7 @@ 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.\346\261\202\346\240\271\345\210\260\345\217\266\345\255\220\350\212\202\347\202\271\346\225\260\345\255\227\344\271\213\345\222\214.md" "b/problems/0129.\346\261\202\346\240\271\345\210\260\345\217\266\345\255\220\350\212\202\347\202\271\346\225\260\345\255\227\344\271\213\345\222\214.md" index 54b7e44de7..14c700ac44 100644 --- "a/problems/0129.\346\261\202\346\240\271\345\210\260\345\217\266\345\255\220\350\212\202\347\202\271\346\225\260\345\255\227\344\271\213\345\222\214.md" +++ "b/problems/0129.\346\261\202\346\240\271\345\210\260\345\217\266\345\255\220\350\212\202\347\202\271\346\225\260\345\255\227\344\271\213\345\222\214.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + # 129. 求根节点到叶节点数字之和 [力扣题目链接](https://leetcode-cn.com/problems/sum-root-to-leaf-numbers/) @@ -294,7 +291,7 @@ 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.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" "b/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" index 2070b8c3fc..8b1462747b 100644 --- "a/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" +++ "b/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + > 切割问题其实是一种组合问题! @@ -454,7 +451,7 @@ 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.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262II.md" "b/problems/0132.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262II.md" index dfb0ea9301..5db7eabfb8 100644 --- "a/problems/0132.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262II.md" +++ "b/problems/0132.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262II.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + @@ -287,7 +284,7 @@ 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.\345\212\240\346\262\271\347\253\231.md" "b/problems/0134.\345\212\240\346\262\271\347\253\231.md" index 7674c0002f..ab896e4a11 100644 --- "a/problems/0134.\345\212\240\346\262\271\347\253\231.md" +++ "b/problems/0134.\345\212\240\346\262\271\347\253\231.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + ## 134. 加油站 @@ -376,7 +373,7 @@ 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.\345\210\206\345\217\221\347\263\226\346\236\234.md" "b/problems/0135.\345\210\206\345\217\221\347\263\226\346\236\234.md" index f3c005367e..1005a86f4e 100644 --- "a/problems/0135.\345\210\206\345\217\221\347\263\226\346\236\234.md" +++ "b/problems/0135.\345\210\206\345\217\221\347\263\226\346\236\234.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + ## 135. 分发糖果 @@ -242,7 +239,7 @@ 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.\345\215\225\350\257\215\346\213\206\345\210\206.md" "b/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" index 4af116a4f8..4e36777e07 100644 --- "a/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" +++ "b/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + @@ -316,7 +313,7 @@ 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.\347\216\257\345\275\242\351\223\276\350\241\250.md" "b/problems/0141.\347\216\257\345\275\242\351\223\276\350\241\250.md" index dec066cfbd..41f6c18c3f 100644 --- "a/problems/0141.\347\216\257\345\275\242\351\223\276\350\241\250.md" +++ "b/problems/0141.\347\216\257\345\275\242\351\223\276\350\241\250.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + # 141. 环形链表 @@ -128,7 +125,7 @@ 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.\347\216\257\345\275\242\351\223\276\350\241\250II.md" "b/problems/0142.\347\216\257\345\275\242\351\223\276\350\241\250II.md" index 2e20e17e74..856713c28b 100644 --- "a/problems/0142.\347\216\257\345\275\242\351\223\276\350\241\250II.md" +++ "b/problems/0142.\347\216\257\345\275\242\351\223\276\350\241\250II.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + @@ -331,7 +328,7 @@ 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.\351\207\215\346\216\222\351\223\276\350\241\250.md" "b/problems/0143.\351\207\215\346\216\222\351\223\276\350\241\250.md" index f072ec8f64..af4e8061a9 100644 --- "a/problems/0143.\351\207\215\346\216\222\351\223\276\350\241\250.md" +++ "b/problems/0143.\351\207\215\346\216\222\351\223\276\350\241\250.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + # 143.重排链表 @@ -445,7 +442,7 @@ 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.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" "b/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" index 0711803cc0..da65381676 100644 --- "a/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" +++ "b/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + @@ -245,7 +242,7 @@ 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.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" "b/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" index bf274263c3..466d394e5a 100644 --- "a/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" +++ "b/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + @@ -638,7 +635,7 @@ 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.\347\233\270\344\272\244\351\223\276\350\241\250.md" "b/problems/0160.\347\233\270\344\272\244\351\223\276\350\241\250.md" index 1c513180d0..c313e05581 100644 --- "a/problems/0160.\347\233\270\344\272\244\351\223\276\350\241\250.md" +++ "b/problems/0160.\347\233\270\344\272\244\351\223\276\350\241\250.md" @@ -1,14 +1,11 @@

- - - - -

-

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

+ + + 同:[链表:链表相交](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.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" "b/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" index a97f293af7..caff925756 100644 --- "a/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" +++ "b/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + ## 188.买卖股票的最佳时机IV @@ -364,7 +361,7 @@ 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.\346\227\213\350\275\254\346\225\260\347\273\204.md" "b/problems/0189.\346\227\213\350\275\254\346\225\260\347\273\204.md" index c876a27aa3..6159fb8de6 100644 --- "a/problems/0189.\346\227\213\350\275\254\346\225\260\347\273\204.md" +++ "b/problems/0189.\346\227\213\350\275\254\346\225\260\347\273\204.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + # 189. 旋转数组 @@ -152,7 +149,7 @@ 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.\346\211\223\345\256\266\345\212\253\350\210\215.md" "b/problems/0198.\346\211\223\345\256\266\345\212\253\350\210\215.md" index 66e95f2847..00a57c27e3 100644 --- "a/problems/0198.\346\211\223\345\256\266\345\212\253\350\210\215.md" +++ "b/problems/0198.\346\211\223\345\256\266\345\212\253\350\210\215.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + ## 198.打家劫舍 @@ -195,7 +192,7 @@ 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.\345\277\253\344\271\220\346\225\260.md" "b/problems/0202.\345\277\253\344\271\220\346\225\260.md" index d7a6b4e99e..864447f5a3 100644 --- "a/problems/0202.\345\277\253\344\271\220\346\225\260.md" +++ "b/problems/0202.\345\277\253\344\271\220\346\225\260.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + @@ -298,7 +295,7 @@ 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.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" "b/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" index 188edc2ecd..aa8f859c36 100644 --- "a/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" +++ "b/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + > 链表操作中,可以使用原链表来直接进行删除操作,也可以设置一个虚拟头结点在进行删除操作,接下来看一看哪种方式更方便。 @@ -394,7 +391,7 @@ 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/0205.\345\220\214\346\236\204\345\255\227\347\254\246\344\270\262.md" "b/problems/0205.\345\220\214\346\236\204\345\255\227\347\254\246\344\270\262.md" index 1eebd19dff..7f55ae047f 100644 --- "a/problems/0205.\345\220\214\346\236\204\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/0205.\345\220\214\346\236\204\345\255\227\347\254\246\344\270\262.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + # 205. 同构字符串 @@ -142,7 +139,7 @@ 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.\347\277\273\350\275\254\351\223\276\350\241\250.md" "b/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md" index 946a0377d1..6e853e01cd 100644 --- "a/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md" +++ "b/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + > 反转链表的写法很简单,一些同学甚至可以背下来但过一阵就忘了该咋写,主要是因为没有理解真正的反转过程。 @@ -452,7 +449,7 @@ struct ListNode* reverseList(struct ListNode* 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/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" "b/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" index cc6b3bba33..b44a63a3d6 100644 --- "a/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" +++ "b/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + ## 209.长度最小的子数组 @@ -294,7 +291,7 @@ 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.\346\211\223\345\256\266\345\212\253\350\210\215II.md" "b/problems/0213.\346\211\223\345\256\266\345\212\253\350\210\215II.md" index 3d7470f746..88b6f0d4de 100644 --- "a/problems/0213.\346\211\223\345\256\266\345\212\253\350\210\215II.md" +++ "b/problems/0213.\346\211\223\345\256\266\345\212\253\350\210\215II.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + ## 213.打家劫舍II @@ -205,7 +202,7 @@ func max(a, b 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/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" "b/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" index 8c9dcac2c9..c16b3de32f 100644 --- "a/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" +++ "b/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + @@ -451,7 +448,7 @@ 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.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" "b/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" index dc09985d47..96559e32e9 100644 --- "a/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" +++ "b/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + # 222.完全二叉树的节点个数 @@ -452,7 +449,7 @@ 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.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" "b/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" index c3a6ef8e78..b32ef61c65 100644 --- "a/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" +++ "b/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + @@ -601,7 +598,7 @@ 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.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" "b/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" index 36083dcd62..4cfb261bfa 100644 --- "a/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + # 226.翻转二叉树 @@ -611,7 +608,7 @@ struct TreeNode* invertTree(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/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" "b/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" index 40406f5119..28a57f18e8 100644 --- "a/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" +++ "b/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + > 工作上一定没人这么搞,但是考察对栈、队列理解程度的好题 @@ -353,7 +350,7 @@ 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.\345\233\236\346\226\207\351\223\276\350\241\250.md" "b/problems/0234.\345\233\236\346\226\207\351\223\276\350\241\250.md" index b47718e2dc..ad7c744834 100644 --- "a/problems/0234.\345\233\236\346\226\207\351\223\276\350\241\250.md" +++ "b/problems/0234.\345\233\236\346\226\207\351\223\276\350\241\250.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + # 234.回文链表 @@ -324,7 +321,7 @@ 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.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" "b/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" index fb1bd42c7a..7a3ab9c9b4 100644 --- "a/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" +++ "b/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + # 235. 二叉搜索树的最近公共祖先 @@ -354,7 +351,7 @@ 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.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" "b/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" index a469869a54..5e7a2134c8 100644 --- "a/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" +++ "b/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + > 本来是打算将二叉树和二叉搜索树的公共祖先问题一起讲,后来发现篇幅过长了,只能先说一说二叉树的公共祖先问题。 @@ -342,7 +339,7 @@ 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.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" "b/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" index be46bd05e9..c1b16502cb 100644 --- "a/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" +++ "b/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + @@ -422,7 +419,7 @@ 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.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" "b/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" index b0475a2604..e941a011f0 100644 --- "a/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" +++ "b/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + > 数组就是简单的哈希表,但是数组的大小可不是无限开辟的 @@ -283,7 +280,7 @@ 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.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" "b/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" index b15fa1bebe..5029165f7c 100644 --- "a/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" +++ "b/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + > 以为只用了递归,其实还用了回溯 @@ -586,7 +583,7 @@ 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.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" "b/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" index b1af7e950b..049ca070ff 100644 --- "a/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" +++ "b/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + # 动态规划:一样的套路,再求一次完全平方数 ## 279.完全平方数 @@ -358,7 +355,7 @@ 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.\347\247\273\345\212\250\351\233\266.md" "b/problems/0283.\347\247\273\345\212\250\351\233\266.md" index 2e8743e308..e6bba0c922 100644 --- "a/problems/0283.\347\247\273\345\212\250\351\233\266.md" +++ "b/problems/0283.\347\247\273\345\212\250\351\233\266.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + # 动态规划:一样的套路,再求一次完全平方数 @@ -113,7 +110,7 @@ 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.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" "b/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" index fe95cfed82..650be4eb24 100644 --- "a/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + ## 300.最长递增子序列 @@ -199,7 +196,7 @@ 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.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" "b/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" index 2d0ee1054b..e0b0fb21e3 100644 --- "a/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" +++ "b/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + ## 309.最佳买卖股票时机含冷冻期 @@ -234,7 +231,7 @@ 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.\351\233\266\351\222\261\345\205\221\346\215\242.md" "b/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" index 63bde6550f..e06f811b1b 100644 --- "a/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" +++ "b/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + # 动态规划: 给我个机会,我再兑换一次零钱 ## 322. 零钱兑换 @@ -327,7 +324,7 @@ 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.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" "b/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" index d3047e9485..4d59a9a0eb 100644 --- "a/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" +++ "b/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + > 这也可以用回溯法? 其实深搜和回溯也是相辅相成的,毕竟都用递归。 @@ -448,7 +445,7 @@ 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.\346\211\223\345\256\266\345\212\253\350\210\215III.md" "b/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" index d04d19d16d..e54ce40ad0 100644 --- "a/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" +++ "b/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + ## 337.打家劫舍 III @@ -463,7 +460,7 @@ func max(a, b 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/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" "b/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" index 78c94f2a61..65eb83de23 100644 --- "a/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" +++ "b/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + ## 343. 整数拆分 @@ -273,7 +270,7 @@ 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.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" "b/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" index 1f41a55d87..54165f228e 100644 --- "a/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + @@ -237,7 +234,7 @@ void reverseString(char* 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/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" "b/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" index 941878d401..94e7a86b84 100644 --- "a/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" +++ "b/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + @@ -361,7 +358,7 @@ 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.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" "b/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" index 3f39f889da..09436f02e0 100644 --- "a/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" +++ "b/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + @@ -263,7 +260,7 @@ 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.\346\221\206\345\212\250\345\272\217\345\210\227.md" "b/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" index afe659eaee..799f0de6ec 100644 --- "a/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" +++ "b/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + > 本周讲解了[贪心理论基础](https://programmercarl.com/贪心算法理论基础.html),以及第一道贪心的题目:[贪心算法:分发饼干](https://programmercarl.com/0455.分发饼干.html),可能会给大家一种贪心算法比较简单的错觉,好了,接下来几天的题目难度要上来了,哈哈。 @@ -281,7 +278,7 @@ 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.\347\273\204\345\220\210\346\200\273\345\222\214\342\205\243.md" "b/problems/0377.\347\273\204\345\220\210\346\200\273\345\222\214\342\205\243.md" index 2a507c4296..5db2f972d3 100644 --- "a/problems/0377.\347\273\204\345\220\210\346\200\273\345\222\214\342\205\243.md" +++ "b/problems/0377.\347\273\204\345\220\210\346\200\273\345\222\214\342\205\243.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + # 动态规划:Carl称它为排列总和! @@ -243,7 +240,7 @@ 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.\350\265\216\351\207\221\344\277\241.md" "b/problems/0383.\350\265\216\351\207\221\344\277\241.md" index d227dde044..7f2d96fef9 100644 --- "a/problems/0383.\350\265\216\351\207\221\344\277\241.md" +++ "b/problems/0383.\350\265\216\351\207\221\344\277\241.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + @@ -339,7 +336,7 @@ 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.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" "b/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" index 1a8e55fa83..efc682d5bd 100644 --- "a/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + ## 392.判断子序列 @@ -228,7 +225,7 @@ 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.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" "b/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" index ffcd2c8c9f..db50c2685f 100644 --- "a/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" +++ "b/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + # 404.左叶子之和 @@ -379,7 +376,7 @@ 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.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" "b/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" index f7d9d805a2..e218fc5bb4 100644 --- "a/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" +++ "b/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + ## 406.根据身高重建队列 @@ -294,7 +291,7 @@ 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.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" "b/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" index e5750ff742..19fd0150b7 100644 --- "a/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" +++ "b/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + ## 416. 分割等和子集 @@ -316,7 +313,7 @@ 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.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" "b/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" index 2bf1f4b0d3..d3f05f8559 100644 --- "a/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" +++ "b/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + ## 435. 无重叠区间 @@ -316,7 +313,7 @@ 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.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" "b/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" index 23e710adf6..5f899e97ad 100644 --- "a/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" +++ "b/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + > 二叉搜索树删除节点就涉及到结构调整了 @@ -523,7 +520,7 @@ 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.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" "b/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" index c3c9b827cc..ddf90169e0 100644 --- "a/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" +++ "b/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + ## 452. 用最少数量的箭引爆气球 @@ -244,7 +241,7 @@ 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.\345\233\233\346\225\260\347\233\270\345\212\240II.md" "b/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" index d12f02331b..1a1c4f795a 100644 --- "a/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" +++ "b/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + > 需要哈希的地方都能找到map的身影 @@ -283,7 +280,7 @@ 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.\345\210\206\345\217\221\351\245\274\345\271\262.md" "b/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" index c992b9a52a..ee41b8f634 100644 --- "a/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" +++ "b/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + # 455.分发饼干 @@ -236,7 +233,7 @@ 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.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" "b/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" index b193acdcbd..e89594ec5d 100644 --- "a/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + @@ -366,7 +363,7 @@ 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.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" "b/problems/0463.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" index 3b0278a64d..b73ec1aa88 100644 --- "a/problems/0463.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" +++ "b/problems/0463.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + # 463. 岛屿的周长 [力扣题目链接](https://leetcode-cn.com/problems/island-perimeter/) @@ -179,7 +176,7 @@ 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.\344\270\200\345\222\214\351\233\266.md" "b/problems/0474.\344\270\200\345\222\214\351\233\266.md" index c8715b3951..6dd9d2e954 100644 --- "a/problems/0474.\344\270\200\345\222\214\351\233\266.md" +++ "b/problems/0474.\344\270\200\345\222\214\351\233\266.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + # 动态规划:一和零! ## 474.一和零 @@ -328,7 +325,7 @@ 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.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" "b/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" index f2b6537322..00e8f764f6 100644 --- "a/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + > 和子集问题有点像,但又处处是陷阱 @@ -436,7 +433,7 @@ 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.\347\233\256\346\240\207\345\222\214.md" "b/problems/0494.\347\233\256\346\240\207\345\222\214.md" index 00771c22e0..dd3bf30e70 100644 --- "a/problems/0494.\347\233\256\346\240\207\345\222\214.md" +++ "b/problems/0494.\347\233\256\346\240\207\345\222\214.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + # 动态规划:目标和! ## 494. 目标和 @@ -388,7 +385,7 @@ 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.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240I.md" "b/problems/0496.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240I.md" index 89549924f7..570db940f9 100644 --- "a/problems/0496.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240I.md" +++ "b/problems/0496.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240I.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + # 496.下一个更大元素 I @@ -302,7 +299,7 @@ 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.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" "b/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" index 18d9b29056..200e59932e 100644 --- "a/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" +++ "b/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + > 二叉树上应该怎么求,二叉搜索树上又应该怎么求? @@ -703,7 +700,7 @@ 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.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" "b/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" index 10b6edea0d..4d8b78a97f 100644 --- "a/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" +++ "b/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + # 503.下一个更大元素II @@ -186,7 +183,7 @@ 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.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" "b/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" index cb54a0f9bb..906aa491f7 100644 --- "a/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" +++ "b/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + ## 509. 斐波那契数 @@ -255,7 +252,7 @@ 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.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" "b/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" index d09ec94dab..8a5b8fb26c 100644 --- "a/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" +++ "b/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + # 513.找树左下角的值 @@ -438,7 +435,7 @@ 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.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\345\272\217\345\210\227.md" "b/problems/0516.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\345\272\217\345\210\227.md" index e413ea70a6..a20e583e7f 100644 --- "a/problems/0516.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0516.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\345\272\217\345\210\227.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + ## 516.最长回文子序列 [力扣题目链接](https://leetcode-cn.com/problems/longest-palindromic-subsequence/) @@ -240,7 +237,7 @@ 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.\351\233\266\351\222\261\345\205\221\346\215\242II.md" "b/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" index 52ec914965..aea49d8acc 100644 --- "a/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" +++ "b/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + # 动态规划:给你一些零钱,你要怎么凑? ## 518. 零钱兑换 II @@ -263,7 +260,7 @@ 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.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" "b/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" index 67a8193092..ff6103a42f 100644 --- "a/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" +++ "b/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + > 利用二叉搜索树的特性搞起! @@ -367,7 +364,7 @@ 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.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md" "b/problems/0538.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md" index 16b00817ac..c1454f0837 100644 --- "a/problems/0538.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md" +++ "b/problems/0538.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + # 538.把二叉搜索树转换为累加树 @@ -315,7 +312,7 @@ struct TreeNode* convertBST(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/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" "b/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" index 26e6e84704..1de1b7369b 100644 --- "a/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" +++ "b/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + @@ -279,7 +276,7 @@ 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.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" "b/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" index fa47306204..bb28e87775 100644 --- "a/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" +++ "b/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + ## 583. 两个字符串的删除操作 @@ -208,7 +205,7 @@ 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.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md" "b/problems/0617.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md" index 8645cbc246..0cc10400ce 100644 --- "a/problems/0617.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0617.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + # 617.合并二叉树 @@ -587,7 +584,7 @@ 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.\345\233\236\346\226\207\345\255\220\344\270\262.md" "b/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" index cdc6b2e35b..a4c38e132d 100644 --- "a/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" +++ "b/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + ## 647. 回文子串 @@ -409,7 +406,7 @@ 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\345\217\202\350\256\256\351\231\242.md" "b/problems/0649.Dota2\345\217\202\350\256\256\351\231\242.md" index 41b2b361b9..34270b54f3 100644 --- "a/problems/0649.Dota2\345\217\202\350\256\256\351\231\242.md" +++ "b/problems/0649.Dota2\345\217\202\350\256\256\351\231\242.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + @@ -248,7 +245,7 @@ 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.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" "b/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" index a4ae868af5..f428a52a04 100644 --- "a/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + # 654.最大二叉树 @@ -359,7 +356,7 @@ 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.\346\234\272\345\231\250\344\272\272\350\203\275\345\220\246\350\277\224\345\233\236\345\216\237\347\202\271.md" "b/problems/0657.\346\234\272\345\231\250\344\272\272\350\203\275\345\220\246\350\277\224\345\233\236\345\216\237\347\202\271.md" index fb35c15b64..6576f765b2 100644 --- "a/problems/0657.\346\234\272\345\231\250\344\272\272\350\203\275\345\220\246\350\277\224\345\233\236\345\216\237\347\202\271.md" +++ "b/problems/0657.\346\234\272\345\231\250\344\272\272\350\203\275\345\220\246\350\277\224\345\233\236\345\216\237\347\202\271.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + # 657. 机器人能否返回原点 @@ -153,7 +150,7 @@ 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.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0669.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" index 09a512c41d..2c5c2f82c3 100644 --- "a/problems/0669.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" +++ "b/problems/0669.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + > 如果不对递归有深刻的理解,本题有点难 @@ -409,7 +406,7 @@ 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.\346\234\200\351\225\277\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227\347\232\204\344\270\252\346\225\260.md" "b/problems/0673.\346\234\200\351\225\277\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227\347\232\204\344\270\252\346\225\260.md" index 4be91db117..aa3b5c363a 100644 --- "a/problems/0673.\346\234\200\351\225\277\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227\347\232\204\344\270\252\346\225\260.md" +++ "b/problems/0673.\346\234\200\351\225\277\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227\347\232\204\344\270\252\346\225\260.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + # 673.最长递增子序列的个数 @@ -363,7 +360,7 @@ 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.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" "b/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" index c81155cb23..c36a42d09b 100644 --- "a/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" +++ "b/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + ## 674. 最长连续递增序列 @@ -265,7 +262,7 @@ 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.\345\206\227\344\275\231\350\277\236\346\216\245.md" "b/problems/0684.\345\206\227\344\275\231\350\277\236\346\216\245.md" index 48ee6011ed..65f79d0e0e 100644 --- "a/problems/0684.\345\206\227\344\275\231\350\277\236\346\216\245.md" +++ "b/problems/0684.\345\206\227\344\275\231\350\277\236\346\216\245.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + @@ -350,7 +347,7 @@ 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.\345\206\227\344\275\231\350\277\236\346\216\245II.md" "b/problems/0685.\345\206\227\344\275\231\350\277\236\346\216\245II.md" index cbd6cc2d67..92d10a56af 100644 --- "a/problems/0685.\345\206\227\344\275\231\350\277\236\346\216\245II.md" +++ "b/problems/0685.\345\206\227\344\275\231\350\277\236\346\216\245II.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + # 685.冗余连接II @@ -603,7 +600,7 @@ 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.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\220\234\347\264\242.md" "b/problems/0700.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\220\234\347\264\242.md" index bf67ce0e31..12c243b4a2 100644 --- "a/problems/0700.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\220\234\347\264\242.md" +++ "b/problems/0700.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\220\234\347\264\242.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + # 700.二叉搜索树中的搜索 @@ -339,7 +336,7 @@ 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.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" "b/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" index 2dca140a91..ea29256d34 100644 --- "a/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" +++ "b/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + # 701.二叉搜索树中的插入操作 @@ -506,7 +503,7 @@ 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.\344\272\214\345\210\206\346\237\245\346\211\276.md" "b/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" index 1cdc589690..882086f186 100644 --- "a/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" +++ "b/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + ## 704. 二分查找 @@ -527,7 +524,7 @@ 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.\350\256\276\350\256\241\351\223\276\350\241\250.md" "b/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" index ba0e7e3b99..d4dde2e86d 100644 --- "a/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" +++ "b/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + > 听说这道题目把链表常见的五个操作都覆盖了? @@ -1149,7 +1146,7 @@ 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.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271.md" "b/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271.md" index 576f5f852f..3fa1ea329b 100644 --- "a/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271.md" +++ "b/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + ## 714. 买卖股票的最佳时机含手续费 @@ -294,7 +291,7 @@ 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.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" "b/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" index 8dd0894ed2..6e48b85216 100644 --- "a/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" +++ "b/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + ## 714.买卖股票的最佳时机含手续费 @@ -187,7 +184,7 @@ 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.\346\234\200\351\225\277\351\207\215\345\244\215\345\255\220\346\225\260\347\273\204.md" "b/problems/0718.\346\234\200\351\225\277\351\207\215\345\244\215\345\255\220\346\225\260\347\273\204.md" index 54d1b07e8c..4f18716abe 100644 --- "a/problems/0718.\346\234\200\351\225\277\351\207\215\345\244\215\345\255\220\346\225\260\347\273\204.md" +++ "b/problems/0718.\346\234\200\351\225\277\351\207\215\345\244\215\345\255\220\346\225\260\347\273\204.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + ## 718. 最长重复子数组 @@ -301,7 +298,7 @@ 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.\345\257\273\346\211\276\346\225\260\347\273\204\347\232\204\344\270\255\345\277\203\347\264\242\345\274\225.md" "b/problems/0724.\345\257\273\346\211\276\346\225\260\347\273\204\347\232\204\344\270\255\345\277\203\347\264\242\345\274\225.md" index d05d55b834..6f4d4eff7a 100644 --- "a/problems/0724.\345\257\273\346\211\276\346\225\260\347\273\204\347\232\204\344\270\255\345\277\203\347\264\242\345\274\225.md" +++ "b/problems/0724.\345\257\273\346\211\276\346\225\260\347\273\204\347\232\204\344\270\255\345\277\203\347\264\242\345\274\225.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + # 724.寻找数组的中心下标 @@ -144,7 +141,7 @@ 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.\345\215\225\350\260\203\351\200\222\345\242\236\347\232\204\346\225\260\345\255\227.md" "b/problems/0738.\345\215\225\350\260\203\351\200\222\345\242\236\347\232\204\346\225\260\345\255\227.md" index 611755210b..f84736191f 100644 --- "a/problems/0738.\345\215\225\350\260\203\351\200\222\345\242\236\347\232\204\346\225\260\345\255\227.md" +++ "b/problems/0738.\345\215\225\350\260\203\351\200\222\345\242\236\347\232\204\346\225\260\345\255\227.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + ## 738.单调递增的数字 @@ -232,7 +229,7 @@ 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.\346\257\217\346\227\245\346\270\251\345\272\246.md" "b/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" index 612b3c757c..affdf99ce2 100644 --- "a/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" +++ "b/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + # 739. 每日温度 @@ -310,7 +307,7 @@ 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.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" "b/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" index 96bfbb7c66..2fb2a50d60 100644 --- "a/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" +++ "b/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + ## 746. 使用最小花费爬楼梯 @@ -269,7 +266,7 @@ 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.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" "b/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" index c64ff3c888..d108b8c00a 100644 --- "a/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" +++ "b/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + ## 763.划分字母区间 @@ -178,7 +175,7 @@ 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.\351\222\245\345\214\231\345\222\214\346\210\277\351\227\264.md" "b/problems/0841.\351\222\245\345\214\231\345\222\214\346\210\277\351\227\264.md" index 42e6337f2d..c20c411a48 100644 --- "a/problems/0841.\351\222\245\345\214\231\345\222\214\346\210\277\351\227\264.md" +++ "b/problems/0841.\351\222\245\345\214\231\345\222\214\346\210\277\351\227\264.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + @@ -272,7 +269,7 @@ 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.\346\257\224\350\276\203\345\220\253\351\200\200\346\240\274\347\232\204\345\255\227\347\254\246\344\270\262.md" "b/problems/0844.\346\257\224\350\276\203\345\220\253\351\200\200\346\240\274\347\232\204\345\255\227\347\254\246\344\270\262.md" index a60fca22bc..580155d3ee 100644 --- "a/problems/0844.\346\257\224\350\276\203\345\220\253\351\200\200\346\240\274\347\232\204\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/0844.\346\257\224\350\276\203\345\220\253\351\200\200\346\240\274\347\232\204\345\255\227\347\254\246\344\270\262.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + # 844.比较含退格的字符串 @@ -293,7 +290,7 @@ 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.\346\237\240\346\252\254\346\260\264\346\211\276\351\233\266.md" "b/problems/0860.\346\237\240\346\252\254\346\260\264\346\211\276\351\233\266.md" index 2e6065b45a..1990331c7f 100644 --- "a/problems/0860.\346\237\240\346\252\254\346\260\264\346\211\276\351\233\266.md" +++ "b/problems/0860.\346\237\240\346\252\254\346\260\264\346\211\276\351\233\266.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + ## 860.柠檬水找零 @@ -257,7 +254,7 @@ 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.\346\214\211\345\245\207\345\201\266\346\216\222\345\272\217\346\225\260\347\273\204II.md" "b/problems/0922.\346\214\211\345\245\207\345\201\266\346\216\222\345\272\217\346\225\260\347\273\204II.md" index 4f60666f8f..4e10038a64 100644 --- "a/problems/0922.\346\214\211\345\245\207\345\201\266\346\216\222\345\272\217\346\225\260\347\273\204II.md" +++ "b/problems/0922.\346\214\211\345\245\207\345\201\266\346\216\222\345\272\217\346\225\260\347\273\204II.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + @@ -264,7 +261,7 @@ 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.\351\225\277\346\214\211\351\224\256\345\205\245.md" "b/problems/0925.\351\225\277\346\214\211\351\224\256\345\205\245.md" index d40f619b6e..7e66a390b7 100644 --- "a/problems/0925.\351\225\277\346\214\211\351\224\256\345\205\245.md" +++ "b/problems/0925.\351\225\277\346\214\211\351\224\256\345\205\245.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + # 925.长按键入 @@ -213,7 +210,7 @@ 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.\346\234\211\346\225\210\347\232\204\345\261\261\350\204\211\346\225\260\347\273\204.md" "b/problems/0941.\346\234\211\346\225\210\347\232\204\345\261\261\350\204\211\346\225\260\347\273\204.md" index 9416b3091c..0d87f2470a 100644 --- "a/problems/0941.\346\234\211\346\225\210\347\232\204\345\261\261\350\204\211\346\225\260\347\273\204.md" +++ "b/problems/0941.\346\234\211\346\225\210\347\232\204\345\261\261\350\204\211\346\225\260\347\273\204.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + # 941.有效的山脉数组 @@ -170,7 +167,7 @@ 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.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" "b/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" index 3d6981645e..902b0990aa 100644 --- "a/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + ## 968.监控二叉树 @@ -507,7 +504,7 @@ 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.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" "b/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" index 883b2f16f5..f6dc846643 100644 --- "a/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" +++ "b/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + > 双指针风骚起来,也是无敌 @@ -336,7 +333,7 @@ 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.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md" "b/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md" index 5a8d1093a0..caea5a5a12 100644 --- "a/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md" +++ "b/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + @@ -385,7 +382,7 @@ char ** commonChars(char ** words, int wordsSize, 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/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" "b/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" index 1b5386fd70..dd3fe9d86a 100644 --- "a/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" +++ "b/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + ## 1005.K次取反后最大化的数组和 @@ -214,7 +211,7 @@ 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.\344\270\215\347\233\270\344\272\244\347\232\204\347\272\277.md" "b/problems/1035.\344\270\215\347\233\270\344\272\244\347\232\204\347\272\277.md" index f4e8f70259..d5e8b0a91c 100644 --- "a/problems/1035.\344\270\215\347\233\270\344\272\244\347\232\204\347\272\277.md" +++ "b/problems/1035.\344\270\215\347\233\270\344\272\244\347\232\204\347\272\277.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + ## 1035.不相交的线 @@ -171,7 +168,7 @@ 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.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" "b/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" index f70f39f3d4..1a47072d9f 100644 --- "a/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" +++ "b/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + @@ -272,7 +269,7 @@ 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.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" "b/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" index 4ac804094c..a102fb1ee3 100644 --- "a/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" +++ "b/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + # 动态规划:最后一块石头的重量 II ## 1049. 最后一块石头的重量 II @@ -243,7 +240,7 @@ 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.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" "b/problems/1143.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" index 55083d8905..6608a67a14 100644 --- "a/problems/1143.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/1143.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + ## 1143.最长公共子序列 @@ -218,7 +215,7 @@ 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.\347\213\254\344\270\200\346\227\240\344\272\214\347\232\204\345\207\272\347\216\260\346\254\241\346\225\260.md" "b/problems/1207.\347\213\254\344\270\200\346\227\240\344\272\214\347\232\204\345\207\272\347\216\260\346\254\241\346\225\260.md" index 808ff9f849..0f0b65a981 100644 --- "a/problems/1207.\347\213\254\344\270\200\346\227\240\344\272\214\347\232\204\345\207\272\347\216\260\346\254\241\346\225\260.md" +++ "b/problems/1207.\347\213\254\344\270\200\346\227\240\344\272\214\347\232\204\345\207\272\347\216\260\346\254\241\346\225\260.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + # 1207.独一无二的出现次数 @@ -153,7 +150,7 @@ 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.\345\210\206\345\211\262\345\271\263\350\241\241\345\255\227\347\254\246\344\270\262.md" "b/problems/1221.\345\210\206\345\211\262\345\271\263\350\241\241\345\255\227\347\254\246\344\270\262.md" index bc1f1fc478..d3e7f7fd0a 100644 --- "a/problems/1221.\345\210\206\345\211\262\345\271\263\350\241\241\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/1221.\345\210\206\345\211\262\345\271\263\350\241\241\345\255\227\347\254\246\344\270\262.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + # 1221. 分割平衡字符串 @@ -133,7 +130,7 @@ 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.\346\240\271\346\215\256\346\225\260\345\255\227\344\272\214\350\277\233\345\210\266\344\270\2131\347\232\204\346\225\260\347\233\256\346\216\222\345\272\217.md" "b/problems/1356.\346\240\271\346\215\256\346\225\260\345\255\227\344\272\214\350\277\233\345\210\266\344\270\2131\347\232\204\346\225\260\347\233\256\346\216\222\345\272\217.md" index b8b0245d6a..cbe918c653 100644 --- "a/problems/1356.\346\240\271\346\215\256\346\225\260\345\255\227\344\272\214\350\277\233\345\210\266\344\270\2131\347\232\204\346\225\260\347\233\256\346\216\222\345\272\217.md" +++ "b/problems/1356.\346\240\271\346\215\256\346\225\260\345\255\227\344\272\214\350\277\233\345\210\266\344\270\2131\347\232\204\346\225\260\347\233\256\346\216\222\345\272\217.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + @@ -193,7 +190,7 @@ 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.\346\234\211\345\244\232\345\260\221\345\260\217\344\272\216\345\275\223\345\211\215\346\225\260\345\255\227\347\232\204\346\225\260\345\255\227.md" "b/problems/1365.\346\234\211\345\244\232\345\260\221\345\260\217\344\272\216\345\275\223\345\211\215\346\225\260\345\255\227\347\232\204\346\225\260\345\255\227.md" index 9f28220922..a249d53c68 100644 --- "a/problems/1365.\346\234\211\345\244\232\345\260\221\345\260\217\344\272\216\345\275\223\345\211\215\346\225\260\345\255\227\347\232\204\346\225\260\345\255\227.md" +++ "b/problems/1365.\346\234\211\345\244\232\345\260\221\345\260\217\344\272\216\345\275\223\345\211\215\346\225\260\345\255\227\347\232\204\346\225\260\345\255\227.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + @@ -194,7 +191,7 @@ 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.\345\260\206\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\345\217\230\345\271\263\350\241\241.md" "b/problems/1382.\345\260\206\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\345\217\230\345\271\263\350\241\241.md" index b7c1bec4b7..87ff8b8a4a 100644 --- "a/problems/1382.\345\260\206\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\345\217\230\345\271\263\350\241\241.md" +++ "b/problems/1382.\345\260\206\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\345\217\230\345\271\263\350\241\241.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + # 1382.将二叉搜索树变平衡 @@ -153,7 +150,7 @@ 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)\347\232\204\347\256\227\346\263\225\345\261\205\347\204\266\350\266\205\346\227\266\344\272\206\357\274\214\346\255\244\346\227\266\347\232\204n\347\251\266\347\253\237\346\230\257\345\244\232\345\244\247\357\274\237.md" "b/problems/O(n)\347\232\204\347\256\227\346\263\225\345\261\205\347\204\266\350\266\205\346\227\266\344\272\206\357\274\214\346\255\244\346\227\266\347\232\204n\347\251\266\347\253\237\346\230\257\345\244\232\345\244\247\357\274\237.md" index f9aee37f87..098ac622ff 100644 --- "a/problems/O(n)\347\232\204\347\256\227\346\263\225\345\261\205\347\204\266\350\266\205\346\227\266\344\272\206\357\274\214\346\255\244\346\227\266\347\232\204n\347\251\266\347\253\237\346\230\257\345\244\232\345\244\247\357\274\237.md" +++ "b/problems/O(n)\347\232\204\347\256\227\346\263\225\345\261\205\347\204\266\350\266\205\346\227\266\344\272\206\357\274\214\346\255\244\346\227\266\347\232\204n\347\251\266\347\253\237\346\230\257\345\244\232\345\244\247\357\274\237.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + # 程序提交之后为什么会超时?O(n)的算法会超时,n究竟是多大? @@ -232,7 +229,7 @@ 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/\344\270\272\344\272\206\347\273\235\346\235\200\347\274\226\350\276\221\350\267\235\347\246\273\357\274\214\345\215\241\345\260\224\345\201\232\344\272\206\344\270\211\346\255\245\351\223\272\345\236\253.md" "b/problems/\344\270\272\344\272\206\347\273\235\346\235\200\347\274\226\350\276\221\350\267\235\347\246\273\357\274\214\345\215\241\345\260\224\345\201\232\344\272\206\344\270\211\346\255\245\351\223\272\345\236\253.md" index af2b66aec6..30dc8a1224 100644 --- "a/problems/\344\270\272\344\272\206\347\273\235\346\235\200\347\274\226\350\276\221\350\267\235\347\246\273\357\274\214\345\215\241\345\260\224\345\201\232\344\272\206\344\270\211\346\255\245\351\223\272\345\236\253.md" +++ "b/problems/\344\270\272\344\272\206\347\273\235\346\235\200\347\274\226\350\276\221\350\267\235\347\246\273\357\274\214\345\215\241\345\260\224\345\201\232\344\272\206\344\270\211\346\255\245\351\223\272\345\236\253.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + # 动态规划之编辑距离总结篇 @@ -204,7 +201,7 @@ 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/\344\272\214\345\217\211\346\240\221\344\270\255\351\200\222\345\275\222\345\270\246\347\235\200\345\233\236\346\272\257.md" "b/problems/\344\272\214\345\217\211\346\240\221\344\270\255\351\200\222\345\275\222\345\270\246\347\235\200\345\233\236\346\272\257.md" index 0a386fe1af..1884e1ea91 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\344\270\255\351\200\222\345\275\222\345\270\246\347\235\200\345\233\236\346\272\257.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\344\270\255\351\200\222\345\275\222\345\270\246\347\235\200\345\233\236\346\272\257.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + # 二叉树:以为使用了递归,其实还隐藏着回溯 @@ -520,7 +517,7 @@ 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/\344\272\214\345\217\211\346\240\221\346\200\273\347\273\223\347\257\207.md" "b/problems/\344\272\214\345\217\211\346\240\221\346\200\273\347\273\223\347\257\207.md" index 322670e037..eae15c91ad 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\346\200\273\347\273\223\347\257\207.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + # 二叉树:总结篇!(需要掌握的二叉树技能都在这里了) @@ -154,7 +151,6 @@ ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211030125421.png) -这个图是 [代码随想录知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) 成员:[青](https://wx.zsxq.com/dweb2/index/footprint/185251215558842),所画,总结的非常好,分享给大家。 **最后,二叉树系列就这么完美结束了,估计这应该是最长的系列了,感谢大家33天的坚持与陪伴,接下来我们又要开始新的系列了「回溯算法」!** @@ -178,7 +174,7 @@ 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/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" index b473861de3..35b0245f84 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + # 二叉树理论基础篇 @@ -231,7 +228,7 @@ 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/\344\272\214\345\217\211\346\240\221\347\232\204\347\273\237\344\270\200\350\277\255\344\273\243\346\263\225.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\347\273\237\344\270\200\350\277\255\344\273\243\346\263\225.md" index 19962cba06..1aafa7ea54 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\347\273\237\344\270\200\350\277\255\344\273\243\346\263\225.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\347\273\237\344\270\200\350\277\255\344\273\243\346\263\225.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + @@ -527,7 +524,7 @@ 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/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" index 7aff05413e..fba0b238bd 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + # 二叉树的迭代遍历 @@ -458,7 +455,7 @@ 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/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" index 209cbcb7fa..8856a477d2 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + @@ -412,7 +409,7 @@ 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/\345\205\263\344\272\216\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\214\344\275\240\344\270\215\347\237\245\351\201\223\347\232\204\351\203\275\345\234\250\350\277\231\351\207\214\357\274\201.md" "b/problems/\345\205\263\344\272\216\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\214\344\275\240\344\270\215\347\237\245\351\201\223\347\232\204\351\203\275\345\234\250\350\277\231\351\207\214\357\274\201.md" index 105c2b24fb..6052fbe73d 100644 --- "a/problems/\345\205\263\344\272\216\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\214\344\275\240\344\270\215\347\237\245\351\201\223\347\232\204\351\203\275\345\234\250\350\277\231\351\207\214\357\274\201.md" +++ "b/problems/\345\205\263\344\272\216\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\214\344\275\240\344\270\215\347\237\245\351\201\223\347\232\204\351\203\275\345\234\250\350\277\231\351\207\214\357\274\201.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + 相信每一位录友都接触过时间复杂度,「代码随想录」已经也讲了一百多道经典题目了,是时候对时间复杂度来一个深度的剖析了,很早之前就写过一篇,当时文章还没有人看,Carl感觉有价值的东西值得让更多的人看到,哈哈。 @@ -174,7 +171,7 @@ 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/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" "b/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" index 22789450ff..a20cd01ae0 100644 --- "a/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" +++ "b/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + # 题目:剑指Offer 05.替换空格 @@ -345,7 +342,7 @@ 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/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" "b/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" index 60f7115d47..a70ecd4c6b 100644 --- "a/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + > 反转个字符串还有这么多用处? @@ -243,7 +240,7 @@ 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/\345\212\250\346\200\201\350\247\204\345\210\222-\350\202\241\347\245\250\351\227\256\351\242\230\346\200\273\347\273\223\347\257\207.md" "b/problems/\345\212\250\346\200\201\350\247\204\345\210\222-\350\202\241\347\245\250\351\227\256\351\242\230\346\200\273\347\273\223\347\257\207.md" index 899b9f6e61..6ea4a78e0b 100644 --- "a/problems/\345\212\250\346\200\201\350\247\204\345\210\222-\350\202\241\347\245\250\351\227\256\351\242\230\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/\345\212\250\346\200\201\350\247\204\345\210\222-\350\202\241\347\245\250\351\227\256\351\242\230\346\200\273\347\273\223\347\257\207.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + 之前我们已经把力扣上股票系列的题目都讲过的,但没有来一篇股票总结,来帮大家高屋建瓴,所以总结篇这就来了! @@ -483,7 +480,7 @@ 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/\345\212\250\346\200\201\350\247\204\345\210\222\346\200\273\347\273\223\347\257\207.md" "b/problems/\345\212\250\346\200\201\350\247\204\345\210\222\346\200\273\347\273\223\347\257\207.md" index 1f62b9df3f..fc9231ada6 100644 --- "a/problems/\345\212\250\346\200\201\350\247\204\345\210\222\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/\345\212\250\346\200\201\350\247\204\345\210\222\346\200\273\347\273\223\347\257\207.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + @@ -134,7 +131,7 @@ ----------------------- -* 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) -* B站视频:[代码随想录](https://space.bilibili.com/525438321) -* 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+

+ + + diff --git "a/problems/\345\212\250\346\200\201\350\247\204\345\210\222\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\345\212\250\346\200\201\350\247\204\345\210\222\347\220\206\350\256\272\345\237\272\347\241\200.md" index 728f0d7edb..270357ea3a 100644 --- "a/problems/\345\212\250\346\200\201\350\247\204\345\210\222\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\345\212\250\346\200\201\350\247\204\345\210\222\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + # 动态规划理论基础 @@ -129,7 +126,7 @@ ----------------------- -* 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) -* B站视频:[代码随想录](https://space.bilibili.com/525438321) -* 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+

+ + + diff --git "a/problems/\345\217\214\346\214\207\351\222\210\346\200\273\347\273\223.md" "b/problems/\345\217\214\346\214\207\351\222\210\346\200\273\347\273\223.md" index bea1359cfd..f4a01c1ec0 100644 --- "a/problems/\345\217\214\346\214\207\351\222\210\346\200\273\347\273\223.md" +++ "b/problems/\345\217\214\346\214\207\351\222\210\346\200\273\347\273\223.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + > 又是一波总结 @@ -97,7 +94,7 @@ 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/\345\223\210\345\270\214\350\241\250\346\200\273\347\273\223.md" "b/problems/\345\223\210\345\270\214\350\241\250\346\200\273\347\273\223.md" index 99a60585e9..ad329c8b30 100644 --- "a/problems/\345\223\210\345\270\214\350\241\250\346\200\273\347\273\223.md" +++ "b/problems/\345\223\210\345\270\214\350\241\250\346\200\273\347\273\223.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + > 哈希表总结篇如约而至 @@ -128,7 +125,7 @@ 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/\345\223\210\345\270\214\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\345\223\210\345\270\214\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" index 05fb2a3246..5339d2868c 100644 --- "a/problems/\345\223\210\345\270\214\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\345\223\210\345\270\214\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + @@ -130,7 +127,7 @@ 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/\345\233\236\346\272\257\346\200\273\347\273\223.md" "b/problems/\345\233\236\346\272\257\346\200\273\347\273\223.md" index b12b88e14a..3536562442 100644 --- "a/problems/\345\233\236\346\272\257\346\200\273\347\273\223.md" +++ "b/problems/\345\233\236\346\272\257\346\200\273\347\273\223.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + > 20张树形结构图、14道精选回溯题目,21篇回溯法精讲文章,由浅入深,一气呵成,这是全网最强回溯算法总结! @@ -434,7 +431,6 @@ N皇后问题分析: ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211030124742.png) -这个图是 [代码随想录知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) 成员:[莫非毛](https://wx.zsxq.com/dweb2/index/footprint/828844212542),所画,总结的非常好,分享给大家。 **回溯算法系列正式结束,新的系列终将开始,录友们准备开启新的征程!** @@ -455,7 +451,7 @@ 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/\345\233\236\346\272\257\347\256\227\346\263\225\345\216\273\351\207\215\351\227\256\351\242\230\347\232\204\345\217\246\344\270\200\347\247\215\345\206\231\346\263\225.md" "b/problems/\345\233\236\346\272\257\347\256\227\346\263\225\345\216\273\351\207\215\351\227\256\351\242\230\347\232\204\345\217\246\344\270\200\347\247\215\345\206\231\346\263\225.md" index 8f5744b55f..cc06d1cab1 100644 --- "a/problems/\345\233\236\346\272\257\347\256\227\346\263\225\345\216\273\351\207\215\351\227\256\351\242\230\347\232\204\345\217\246\344\270\200\347\247\215\345\206\231\346\263\225.md" +++ "b/problems/\345\233\236\346\272\257\347\256\227\346\263\225\345\216\273\351\207\215\351\227\256\351\242\230\347\232\204\345\217\246\344\270\200\347\247\215\345\206\231\346\263\225.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + # 回溯算法去重问题的另一种写法 @@ -374,7 +371,7 @@ 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/\345\233\236\346\272\257\347\256\227\346\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\345\233\236\346\272\257\347\256\227\346\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md" index c11200a287..44629cd58a 100644 --- "a/problems/\345\233\236\346\272\257\347\256\227\346\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\345\233\236\346\272\257\347\256\227\346\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + # 回溯算法理论基础 @@ -172,7 +169,7 @@ 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/\345\255\227\347\254\246\344\270\262\346\200\273\347\273\223.md" "b/problems/\345\255\227\347\254\246\344\270\262\346\200\273\347\273\223.md" index 5ac415a988..4a61d6ea2a 100644 --- "a/problems/\345\255\227\347\254\246\344\270\262\346\200\273\347\273\223.md" +++ "b/problems/\345\255\227\347\254\246\344\270\262\346\200\273\347\273\223.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + # 字符串:总结篇 @@ -127,7 +124,7 @@ 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/\346\225\260\347\273\204\346\200\273\347\273\223\347\257\207.md" "b/problems/\346\225\260\347\273\204\346\200\273\347\273\223\347\257\207.md" index 42e3323a07..d1aea1fd53 100644 --- "a/problems/\346\225\260\347\273\204\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/\346\225\260\347\273\204\346\200\273\347\273\223\347\257\207.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + @@ -146,7 +143,7 @@ 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/\346\225\260\347\273\204\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\346\225\260\347\273\204\347\220\206\350\256\272\345\237\272\347\241\200.md" index 15fbe9e487..66527ef03f 100644 --- "a/problems/\346\225\260\347\273\204\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\346\225\260\347\273\204\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + @@ -121,7 +118,7 @@ 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/\346\240\210\344\270\216\351\230\237\345\210\227\346\200\273\347\273\223.md" "b/problems/\346\240\210\344\270\216\351\230\237\345\210\227\346\200\273\347\273\223.md" index b745ea1988..7fa63bc595 100644 --- "a/problems/\346\240\210\344\270\216\351\230\237\345\210\227\346\200\273\347\273\223.md" +++ "b/problems/\346\240\210\344\270\216\351\230\237\345\210\227\346\200\273\347\273\223.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + # 栈与队列的理论基础 @@ -178,7 +175,7 @@ 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/\346\240\210\344\270\216\351\230\237\345\210\227\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\346\240\210\344\270\216\351\230\237\345\210\227\347\220\206\350\256\272\345\237\272\347\241\200.md" index 3889b7bad0..0721119dbb 100644 --- "a/problems/\346\240\210\344\270\216\351\230\237\345\210\227\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\346\240\210\344\270\216\351\230\237\345\210\227\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + > 来看看栈和队列不为人知的一面 @@ -91,7 +88,7 @@ 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/\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227\357\274\210vector\345\216\237\347\220\206\350\256\262\350\247\243\357\274\211.md" "b/problems/\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227\357\274\210vector\345\216\237\347\220\206\350\256\262\350\247\243\357\274\211.md" index 6d11fcbe9e..3425259197 100644 --- "a/problems/\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227\357\274\210vector\345\216\237\347\220\206\350\256\262\350\247\243\357\274\211.md" +++ "b/problems/\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227\357\274\210vector\345\216\237\347\220\206\350\256\262\350\247\243\357\274\211.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + # 贪心算法:根据身高重建队列(续集) 在讲解[贪心算法:根据身高重建队列](https://programmercarl.com/0406.根据身高重建队列.html)中,我们提到了使用vector(C++中的动态数组)来进行insert操作是费时的。 @@ -177,7 +174,7 @@ 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/\347\256\227\346\263\225\346\250\241\346\235\277.md" "b/problems/\347\256\227\346\263\225\346\250\241\346\235\277.md" index 9fa4f1a84a..2a310c0bc3 100644 --- "a/problems/\347\256\227\346\263\225\346\250\241\346\235\277.md" +++ "b/problems/\347\256\227\346\263\225\346\250\241\346\235\277.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + ## 二分查找法 @@ -550,7 +547,7 @@ 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/\350\203\214\345\214\205\346\200\273\347\273\223\347\257\207.md" "b/problems/\350\203\214\345\214\205\346\200\273\347\273\223\347\257\207.md" index 784f8441e0..e49b1991aa 100644 --- "a/problems/\350\203\214\345\214\205\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/\350\203\214\345\214\205\346\200\273\347\273\223\347\257\207.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + # 听说背包问题很难? 这篇总结篇来拯救你了 年前我们已经把背包问题都讲完了,那么现在我们要对背包问题进行总结一番。 @@ -98,7 +95,7 @@ ----------------------- -* 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) -* B站视频:[代码随想录](https://space.bilibili.com/525438321) -* 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+

+ + + diff --git "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" index a10f92a13a..e353e58190 100644 --- "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" +++ "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + # 动态规划:关于01背包问题,你该了解这些! 这周我们正式开始讲解背包问题! @@ -428,7 +425,7 @@ 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/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" index 9bdbe8bc23..c7dab994c7 100644 --- "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" +++ "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + # 动态规划:关于01背包问题,你该了解这些!(滚动数组) @@ -320,7 +317,7 @@ 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/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\244\232\351\207\215\350\203\214\345\214\205.md" "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\244\232\351\207\215\350\203\214\345\214\205.md" index e5eb222d0e..85d4200bf9 100644 --- "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\244\232\351\207\215\350\203\214\345\214\205.md" +++ "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\244\232\351\207\215\350\203\214\345\214\205.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + # 动态规划:关于多重背包,你该了解这些! @@ -206,7 +203,7 @@ 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/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" index 3420f822b1..f006c49f9c 100644 --- "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" +++ "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + # 动态规划:关于完全背包,你该了解这些! ## 完全背包 @@ -346,7 +343,7 @@ 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/\350\264\252\345\277\203\347\256\227\346\263\225\346\200\273\347\273\223\347\257\207.md" "b/problems/\350\264\252\345\277\203\347\256\227\346\263\225\346\200\273\347\273\223\347\257\207.md" index 9d506f758a..1a7b91a63b 100644 --- "a/problems/\350\264\252\345\277\203\347\256\227\346\263\225\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/\350\264\252\345\277\203\347\256\227\346\263\225\346\200\273\347\273\223\347\257\207.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + 我刚刚开始讲解贪心系列的时候就说了,贪心系列并不打算严格的从简单到困难这么个顺序来讲解。 @@ -131,7 +128,6 @@ Carl个人认为:如果找出局部最优并可以推出全局最优,就是 ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211110121605.png) -这个图是 [代码随想录知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) 成员:[青](https://wx.zsxq.com/dweb2/index/footprint/185251215558842)所画,总结的非常好,分享给大家。 很多没有接触过贪心的同学都会感觉贪心有啥可学的,但只要跟着「代码随想录」坚持下来之后,就会发现,贪心是一种很重要的算法思维而且并不简单,贪心往往妙的出其不意,触不及防! @@ -163,7 +159,7 @@ 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/\350\264\252\345\277\203\347\256\227\346\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\350\264\252\345\277\203\347\256\227\346\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md" index f851d66b28..98e9fa2cae 100644 --- "a/problems/\350\264\252\345\277\203\347\256\227\346\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\350\264\252\345\277\203\347\256\227\346\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + # 关于贪心算法,你该了解这些! @@ -91,7 +88,7 @@ ----------------------- -* 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) -* B站视频:[代码随想录](https://space.bilibili.com/525438321) -* 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+

+ + + diff --git "a/problems/\351\223\276\350\241\250\346\200\273\347\273\223\347\257\207.md" "b/problems/\351\223\276\350\241\250\346\200\273\347\273\223\347\257\207.md" index c0bc197bbe..33ce31d5dd 100644 --- "a/problems/\351\223\276\350\241\250\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/\351\223\276\350\241\250\346\200\273\347\273\223\347\257\207.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + @@ -95,7 +92,7 @@ ----------------------- -* 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) -* B站视频:[代码随想录](https://space.bilibili.com/525438321) -* 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+

+ + + diff --git "a/problems/\351\223\276\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\351\223\276\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" index 0eb61add19..fc0f3c36ba 100644 --- "a/problems/\351\223\276\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\351\223\276\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + # 关于链表,你该了解这些! @@ -156,7 +153,7 @@ 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/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" "b/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" index c5b8ed6fa4..8d53bda62f 100644 --- "a/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" +++ "b/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" @@ -1,10 +1,7 @@

- - - - -

-

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

+ + + ## 面试题 02.07. 链表相交 @@ -255,7 +252,7 @@ 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 d2c33f0764207de9c9c743fe25c2b41ae1a7ec06 Mon Sep 17 00:00:00 2001 From: youngyangyang04 <826123027@qq.com> Date: Thu, 11 Nov 2021 11:12:52 +0800 Subject: [PATCH 0037/3019] Update --- ...\223\276\350\241\250\346\200\273\347\273\223\347\257\207.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/\351\223\276\350\241\250\346\200\273\347\273\223\347\257\207.md" "b/problems/\351\223\276\350\241\250\346\200\273\347\273\223\347\257\207.md" index 33ce31d5dd..a6b6228bab 100644 --- "a/problems/\351\223\276\350\241\250\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/\351\223\276\350\241\250\346\200\273\347\273\223\347\257\207.md" @@ -1,6 +1,6 @@

- + From 2a9eebde1afd8cc1a2f928d78e0a6e0eaeb390bb Mon Sep 17 00:00:00 2001 From: youngyangyang04 <826123027@qq.com> Date: Thu, 11 Nov 2021 11:14:04 +0800 Subject: [PATCH 0038/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=B4=BB=E5=8A=A81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" | 2 +- ...\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" | 2 +- .../0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" | 2 +- ...\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" | 2 +- .../0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" | 2 +- ...225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" | 2 +- ...\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" | 2 +- ...\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" | 2 +- .../0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" | 2 +- "problems/0028.\345\256\236\347\216\260strStr.md" | 2 +- ...\270\213\344\270\200\344\270\252\346\216\222\345\210\227.md" | 2 +- ...\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" | 2 +- ...\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" | 2 +- "problems/0037.\350\247\243\346\225\260\347\213\254.md" | 2 +- .../0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" | 2 +- .../0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" | 2 +- "problems/0042.\346\216\245\351\233\250\346\260\264.md" | 2 +- .../0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" | 2 +- "problems/0046.\345\205\250\346\216\222\345\210\227.md" | 2 +- "problems/0047.\345\205\250\346\216\222\345\210\227II.md" | 2 +- "problems/0051.N\347\232\207\345\220\216.md" | 2 +- "problems/0052.N\347\232\207\345\220\216II.md" | 2 +- ...\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" | 2 +- ...\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" | 2 +- .../0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" | 2 +- .../0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" | 2 +- .../0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" | 2 +- .../0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" | 2 +- .../0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" | 2 +- "problems/0070.\347\210\254\346\245\274\346\242\257.md" | 2 +- ...\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md" | 2 +- .../0072.\347\274\226\350\276\221\350\267\235\347\246\273.md" | 2 +- "problems/0077.\347\273\204\345\220\210.md" | 2 +- .../0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" | 2 +- "problems/0078.\345\255\220\351\233\206.md" | 2 +- ...\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" | 2 +- "problems/0090.\345\255\220\351\233\206II.md" | 2 +- .../0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" | 2 +- ...\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" | 2 +- ...\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" | 2 +- .../0100.\347\233\270\345\220\214\347\232\204\346\240\221.md" | 2 +- ...\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" | 2 +- ...\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" | 2 +- ...\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" | 2 +- ...\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" | 2 +- ...\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" | 2 +- ...\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" | 2 +- ...\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" | 2 +- .../0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" | 2 +- ...\220\214\347\232\204\345\255\220\345\272\217\345\210\227.md" | 2 +- ...\276\247\350\212\202\347\202\271\346\214\207\351\222\210.md" | 2 +- ...\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" | 2 +- ...32\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" | 2 +- ...\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" | 2 +- ...2\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" | 2 +- .../0127.\345\215\225\350\257\215\346\216\245\351\276\231.md" | 2 +- ...\202\271\346\225\260\345\255\227\344\271\213\345\222\214.md" | 2 +- ...\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" | 2 +- ...10\206\345\211\262\345\233\236\346\226\207\344\270\262II.md" | 2 +- "problems/0134.\345\212\240\346\262\271\347\253\231.md" | 2 +- .../0135.\345\210\206\345\217\221\347\263\226\346\236\234.md" | 2 +- .../0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" | 2 +- .../0141.\347\216\257\345\275\242\351\223\276\350\241\250.md" | 2 +- .../0142.\347\216\257\345\275\242\351\223\276\350\241\250II.md" | 2 +- .../0143.\351\207\215\346\216\222\351\223\276\350\241\250.md" | 2 +- ...\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" | 2 +- ...\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" | 2 +- .../0160.\347\233\270\344\272\244\351\223\276\350\241\250.md" | 2 +- ...32\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" | 2 +- .../0189.\346\227\213\350\275\254\346\225\260\347\273\204.md" | 2 +- .../0198.\346\211\223\345\256\266\345\212\253\350\210\215.md" | 2 +- "problems/0202.\345\277\253\344\271\220\346\225\260.md" | 2 +- ...\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" | 2 +- ...\220\214\346\236\204\345\255\227\347\254\246\344\270\262.md" | 2 +- .../0206.\347\277\273\350\275\254\351\223\276\350\241\250.md" | 2 +- ...\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" | 2 +- .../0213.\346\211\223\345\256\266\345\212\253\350\210\215II.md" | 2 +- ...0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" | 2 +- ...\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" | 2 +- ...\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" | 2 +- ...\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" | 2 +- ...\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" | 2 +- .../0234.\345\233\236\346\226\207\351\223\276\350\241\250.md" | 2 +- ...\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" | 2 +- ...\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" | 2 +- ...\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" | 2 +- ...\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" | 2 +- ...\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" | 2 +- ...\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" | 2 +- "problems/0283.\347\247\273\345\212\250\351\233\266.md" | 2 +- ...\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" | 2 +- ...\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" | 2 +- .../0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" | 2 +- ...\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" | 2 +- ...0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" | 2 +- .../0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" | 2 +- ...\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" | 2 +- ...\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" | 2 +- ...\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" | 2 +- .../0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" | 2 +- ...\273\204\345\220\210\346\200\273\345\222\214\342\205\243.md" | 2 +- "problems/0383.\350\265\216\351\207\221\344\277\241.md" | 2 +- ...\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" | 2 +- ...\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" | 2 +- ...\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" | 2 +- ...\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" | 2 +- ...\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" | 2 +- ...\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" | 2 +- ...\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" | 2 +- .../0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" | 2 +- .../0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" | 2 +- ...\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" | 2 +- ...\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" | 2 +- "problems/0474.\344\270\200\345\222\214\351\233\266.md" | 2 +- ...\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" | 2 +- "problems/0494.\347\233\256\346\240\207\345\222\214.md" | 2 +- ...270\252\346\233\264\345\244\247\345\205\203\347\264\240I.md" | 2 +- ...\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" | 2 +- ...70\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" | 2 +- ...\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" | 2 +- ...\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" | 2 +- ...\233\236\346\226\207\345\255\220\345\272\217\345\210\227.md" | 2 +- .../0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" | 2 +- ...\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" | 2 +- ...\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md" | 2 +- ...17\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" | 2 +- ...\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" | 2 +- ...\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md" | 2 +- .../0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" | 2 +- "problems/0649.Dota2\345\217\202\350\256\256\351\231\242.md" | 2 +- ...\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" | 2 +- ...\220\246\350\277\224\345\233\236\345\216\237\347\202\271.md" | 2 +- ...\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" | 2 +- ...\272\217\345\210\227\347\232\204\344\270\252\346\225\260.md" | 2 +- ...\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" | 2 +- .../0684.\345\206\227\344\275\231\350\277\236\346\216\245.md" | 2 +- .../0685.\345\206\227\344\275\231\350\277\236\346\216\245II.md" | 2 +- ...\240\221\344\270\255\347\232\204\346\220\234\347\264\242.md" | 2 +- ...\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" | 2 +- .../0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" | 2 +- .../0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" | 2 +- ...\234\272\345\220\253\346\211\213\347\273\255\350\264\271.md" | 2 +- ...\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" | 2 +- ...\207\215\345\244\215\345\255\220\346\225\260\347\273\204.md" | 2 +- ...\232\204\344\270\255\345\277\203\347\264\242\345\274\225.md" | 2 +- ...\200\222\345\242\236\347\232\204\346\225\260\345\255\227.md" | 2 +- .../0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" | 2 +- ...\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" | 2 +- ...\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" | 2 +- ...\222\245\345\214\231\345\222\214\346\210\277\351\227\264.md" | 2 +- ...\240\274\347\232\204\345\255\227\347\254\246\344\270\262.md" | 2 +- ...\237\240\346\252\254\346\260\264\346\211\276\351\233\266.md" | 2 +- ...01\266\346\216\222\345\272\217\346\225\260\347\273\204II.md" | 2 +- .../0925.\351\225\277\346\214\211\351\224\256\345\205\245.md" | 2 +- ...\232\204\345\261\261\350\204\211\346\225\260\347\273\204.md" | 2 +- ...\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" | 2 +- ...\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" | 2 +- ...\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md" | 2 +- ...\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" | 2 +- ...\270\215\347\233\270\344\272\244\347\232\204\347\272\277.md" | 2 +- ...\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" | 2 +- ...37\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" | 2 +- ...\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" | 2 +- ...\232\204\345\207\272\347\216\260\346\254\241\346\225\260.md" | 2 +- ...\271\263\350\241\241\345\255\227\347\254\246\344\270\262.md" | 2 +- ...\232\204\346\225\260\347\233\256\346\216\222\345\272\217.md" | 2 +- ...\225\260\345\255\227\347\232\204\346\225\260\345\255\227.md" | 2 +- ...\264\242\346\240\221\345\217\230\345\271\263\350\241\241.md" | 2 +- ...\253\237\346\230\257\345\244\232\345\244\247\357\274\237.md" | 2 +- ...\272\206\344\270\211\346\255\245\351\223\272\345\236\253.md" | 2 +- ...\275\222\345\270\246\347\235\200\345\233\236\346\272\257.md" | 2 +- ...\217\211\346\240\221\346\200\273\347\273\223\347\257\207.md" | 2 +- ...\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" | 2 +- ...\273\237\344\270\200\350\277\255\344\273\243\346\263\225.md" | 2 +- ...\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" | 2 +- ...\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" | 2 +- ...\203\275\345\234\250\350\277\231\351\207\214\357\274\201.md" | 2 +- ...Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" | 2 +- ...\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" | 2 +- ...\227\256\351\242\230\346\200\273\347\273\223\347\257\207.md" | 2 +- ...\247\204\345\210\222\346\200\273\347\273\223\347\257\207.md" | 2 +- ...\210\222\347\220\206\350\256\272\345\237\272\347\241\200.md" | 2 +- ...\217\214\346\214\207\351\222\210\346\200\273\347\273\223.md" | 2 +- ...\223\210\345\270\214\350\241\250\346\200\273\347\273\223.md" | 2 +- ...\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" | 2 +- "problems/\345\233\236\346\272\257\346\200\273\347\273\223.md" | 2 +- ...\217\246\344\270\200\347\247\215\345\206\231\346\263\225.md" | 2 +- ...\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md" | 2 +- ...\255\227\347\254\246\344\270\262\346\200\273\347\273\223.md" | 2 +- ...\225\260\347\273\204\346\200\273\347\273\223\347\257\207.md" | 2 +- ...\273\204\347\220\206\350\256\272\345\237\272\347\241\200.md" | 2 +- ...\270\216\351\230\237\345\210\227\346\200\273\347\273\223.md" | 2 +- ...\210\227\347\220\206\350\256\272\345\237\272\347\241\200.md" | 2 +- ...\216\237\347\220\206\350\256\262\350\247\243\357\274\211.md" | 2 +- "problems/\347\256\227\346\263\225\346\250\241\346\235\277.md" | 2 +- ...\203\214\345\214\205\346\200\273\347\273\223\347\257\207.md" | 2 +- ...\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" | 2 +- ...\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" | 2 +- ...\241\200\345\244\232\351\207\215\350\203\214\345\214\205.md" | 2 +- ...\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" | 2 +- ...\256\227\346\263\225\346\200\273\347\273\223\347\257\207.md" | 2 +- ...\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md" | 2 +- ...\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" | 2 +- ...3002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" | 2 +- 204 files changed, 204 insertions(+), 204 deletions(-) diff --git "a/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" "b/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" index 208f310e43..711b3c0d3e 100644 --- "a/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" "b/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" index c75a74f6d4..a49e55a708 100644 --- "a/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" +++ "b/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" "b/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" index 983e4d8410..57bb4c3766 100644 --- "a/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" "b/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" index 003aeb9a63..6e0cc244d8 100644 --- "a/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" +++ "b/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" "b/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" index 5b2cf122d2..abff3fe065 100644 --- "a/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" "b/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" index 51e4e4adce..4f91692288 100644 --- "a/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" +++ "b/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" "b/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" index 587c07a70b..5fd8b9572b 100644 --- "a/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" +++ "b/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" "b/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" index c030a62e4c..538c60a11c 100644 --- "a/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" +++ "b/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" "b/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" index 2cf9c169c4..1f098fa082 100644 --- "a/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" +++ "b/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0028.\345\256\236\347\216\260strStr.md" "b/problems/0028.\345\256\236\347\216\260strStr.md" index 4f7c3c2fb3..4b9263d85c 100644 --- "a/problems/0028.\345\256\236\347\216\260strStr.md" +++ "b/problems/0028.\345\256\236\347\216\260strStr.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0031.\344\270\213\344\270\200\344\270\252\346\216\222\345\210\227.md" "b/problems/0031.\344\270\213\344\270\200\344\270\252\346\216\222\345\210\227.md" index 9d951d1bc4..e0981b6132 100644 --- "a/problems/0031.\344\270\213\344\270\200\344\270\252\346\216\222\345\210\227.md" +++ "b/problems/0031.\344\270\213\344\270\200\344\270\252\346\216\222\345\210\227.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" "b/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" index 028afd3dd4..72deaf866a 100644 --- "a/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" +++ "b/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" "b/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" index 6d86a52839..6e6756ecd7 100644 --- "a/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" +++ "b/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0037.\350\247\243\346\225\260\347\213\254.md" "b/problems/0037.\350\247\243\346\225\260\347\213\254.md" index 93bfca7cd6..47008b490e 100644 --- "a/problems/0037.\350\247\243\346\225\260\347\213\254.md" +++ "b/problems/0037.\350\247\243\346\225\260\347\213\254.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" "b/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" index a96efa215c..c622b97a80 100644 --- "a/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" +++ "b/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" "b/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" index 0fd8f2db34..95f25bf0ca 100644 --- "a/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" +++ "b/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0042.\346\216\245\351\233\250\346\260\264.md" "b/problems/0042.\346\216\245\351\233\250\346\260\264.md" index 6fbf705526..95ee75931c 100644 --- "a/problems/0042.\346\216\245\351\233\250\346\260\264.md" +++ "b/problems/0042.\346\216\245\351\233\250\346\260\264.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" "b/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" index 02d3839475..bd15ef85a9 100644 --- "a/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" +++ "b/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0046.\345\205\250\346\216\222\345\210\227.md" "b/problems/0046.\345\205\250\346\216\222\345\210\227.md" index 6d41cd4a79..dc5f17cf15 100644 --- "a/problems/0046.\345\205\250\346\216\222\345\210\227.md" +++ "b/problems/0046.\345\205\250\346\216\222\345\210\227.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0047.\345\205\250\346\216\222\345\210\227II.md" "b/problems/0047.\345\205\250\346\216\222\345\210\227II.md" index 2d2cfa6670..b910583388 100644 --- "a/problems/0047.\345\205\250\346\216\222\345\210\227II.md" +++ "b/problems/0047.\345\205\250\346\216\222\345\210\227II.md" @@ -1,6 +1,6 @@

- + # 排列问题(二) diff --git "a/problems/0051.N\347\232\207\345\220\216.md" "b/problems/0051.N\347\232\207\345\220\216.md" index 31d5a18db1..1885ab550f 100644 --- "a/problems/0051.N\347\232\207\345\220\216.md" +++ "b/problems/0051.N\347\232\207\345\220\216.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0052.N\347\232\207\345\220\216II.md" "b/problems/0052.N\347\232\207\345\220\216II.md" index 98915a01a5..03c11634a0 100644 --- "a/problems/0052.N\347\232\207\345\220\216II.md" +++ "b/problems/0052.N\347\232\207\345\220\216II.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" "b/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" index 2f7af69dd8..0037229ae2 100644 --- "a/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" +++ "b/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" "b/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" index 583011fb32..914095b984 100644 --- "a/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" +++ "b/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" @@ -1,6 +1,6 @@

- + ## 53. 最大子序和 diff --git "a/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" "b/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" index 73659064e3..66d672d999 100644 --- "a/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" +++ "b/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" "b/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" index 634d3462b7..92a75cd747 100644 --- "a/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" +++ "b/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" "b/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" index 06f8993d10..906a5dbd3f 100644 --- "a/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" +++ "b/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" "b/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" index 322a43789c..a6061ed6cc 100644 --- "a/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" +++ "b/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" @@ -1,6 +1,6 @@

- + ## 62.不同路径 diff --git "a/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" "b/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" index 8f240bd664..22a099c6e2 100644 --- "a/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" +++ "b/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" @@ -1,6 +1,6 @@

- + ## 63. 不同路径 II diff --git "a/problems/0070.\347\210\254\346\245\274\346\242\257.md" "b/problems/0070.\347\210\254\346\245\274\346\242\257.md" index a74f683cbd..e2e84152ee 100644 --- "a/problems/0070.\347\210\254\346\245\274\346\242\257.md" +++ "b/problems/0070.\347\210\254\346\245\274\346\242\257.md" @@ -1,6 +1,6 @@

- + ## 70. 爬楼梯 diff --git "a/problems/0070.\347\210\254\346\245\274\346\242\257\345\256\214\345\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md" "b/problems/0070.\347\210\254\346\245\274\346\242\257\345\256\214\345\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md" index cd6b9be858..cc73543cfb 100644 --- "a/problems/0070.\347\210\254\346\245\274\346\242\257\345\256\214\345\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md" +++ "b/problems/0070.\347\210\254\346\245\274\346\242\257\345\256\214\345\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md" @@ -1,6 +1,6 @@

- + # 动态规划:以前我没得选,现在我选择再爬一次! diff --git "a/problems/0072.\347\274\226\350\276\221\350\267\235\347\246\273.md" "b/problems/0072.\347\274\226\350\276\221\350\267\235\347\246\273.md" index d01dc726d0..5928bb98df 100644 --- "a/problems/0072.\347\274\226\350\276\221\350\267\235\347\246\273.md" +++ "b/problems/0072.\347\274\226\350\276\221\350\267\235\347\246\273.md" @@ -1,6 +1,6 @@

- + ## 72. 编辑距离 diff --git "a/problems/0077.\347\273\204\345\220\210.md" "b/problems/0077.\347\273\204\345\220\210.md" index 6d87251cd1..e54d89145e 100644 --- "a/problems/0077.\347\273\204\345\220\210.md" +++ "b/problems/0077.\347\273\204\345\220\210.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" "b/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" index 0ed041c9d4..8af57aa99d 100644 --- "a/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" +++ "b/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0078.\345\255\220\351\233\206.md" "b/problems/0078.\345\255\220\351\233\206.md" index 14c24a1e43..7acd9d6db3 100644 --- "a/problems/0078.\345\255\220\351\233\206.md" +++ "b/problems/0078.\345\255\220\351\233\206.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" "b/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" index f1109afc02..ee75c6c8f3 100644 --- "a/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" +++ "b/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0090.\345\255\220\351\233\206II.md" "b/problems/0090.\345\255\220\351\233\206II.md" index b9e2efe993..1988c1688f 100644 --- "a/problems/0090.\345\255\220\351\233\206II.md" +++ "b/problems/0090.\345\255\220\351\233\206II.md" @@ -1,6 +1,6 @@

- + # 子集问题(二) diff --git "a/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" "b/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" index e18dff4e39..a7c02a99ac 100644 --- "a/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" +++ "b/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0096.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0096.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" index 08fabf933a..c68b4bb8b0 100644 --- "a/problems/0096.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" +++ "b/problems/0096.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" @@ -1,6 +1,6 @@

- + ## 96.不同的二叉搜索树 diff --git "a/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" index d931774b76..7fbfae6adc 100644 --- "a/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" +++ "b/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0100.\347\233\270\345\220\214\347\232\204\346\240\221.md" "b/problems/0100.\347\233\270\345\220\214\347\232\204\346\240\221.md" index c2b527f48a..73dcadefbc 100644 --- "a/problems/0100.\347\233\270\345\220\214\347\232\204\346\240\221.md" +++ "b/problems/0100.\347\233\270\345\220\214\347\232\204\346\240\221.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" "b/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" index 8e6b981c9e..2db36b6a47 100644 --- "a/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" index d82c16843a..bfc9c0545c 100644 --- "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" +++ "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" @@ -1,6 +1,6 @@

- + # 二叉树层序遍历登场! diff --git "a/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" "b/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" index 5579a2d49f..46bbbc074a 100644 --- "a/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" +++ "b/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" "b/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" index 389a546500..8089cdb2b7 100644 --- "a/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" index 8157df601f..8c617f4b6c 100644 --- "a/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" +++ "b/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" "b/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" index 9493520dbd..a06bff0e8e 100644 --- "a/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" "b/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" index 14660a7def..1ec82fc98c 100644 --- "a/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" +++ "b/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" "b/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" index 4e01e99f07..55c6213d02 100644 --- "a/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" +++ "b/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0115.\344\270\215\345\220\214\347\232\204\345\255\220\345\272\217\345\210\227.md" "b/problems/0115.\344\270\215\345\220\214\347\232\204\345\255\220\345\272\217\345\210\227.md" index 10e90c29e9..278426f4bf 100644 --- "a/problems/0115.\344\270\215\345\220\214\347\232\204\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0115.\344\270\215\345\220\214\347\232\204\345\255\220\345\272\217\345\210\227.md" @@ -1,6 +1,6 @@

- + ## 115.不同的子序列 diff --git "a/problems/0116.\345\241\253\345\205\205\346\257\217\344\270\252\350\212\202\347\202\271\347\232\204\344\270\213\344\270\200\344\270\252\345\217\263\344\276\247\350\212\202\347\202\271\346\214\207\351\222\210.md" "b/problems/0116.\345\241\253\345\205\205\346\257\217\344\270\252\350\212\202\347\202\271\347\232\204\344\270\213\344\270\200\344\270\252\345\217\263\344\276\247\350\212\202\347\202\271\346\214\207\351\222\210.md" index e757cde915..9c234ffa97 100644 --- "a/problems/0116.\345\241\253\345\205\205\346\257\217\344\270\252\350\212\202\347\202\271\347\232\204\344\270\213\344\270\200\344\270\252\345\217\263\344\276\247\350\212\202\347\202\271\346\214\207\351\222\210.md" +++ "b/problems/0116.\345\241\253\345\205\205\346\257\217\344\270\252\350\212\202\347\202\271\347\232\204\344\270\213\344\270\200\344\270\252\345\217\263\344\276\247\350\212\202\347\202\271\346\214\207\351\222\210.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" "b/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" index 1bee632625..761479f042 100644 --- "a/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" +++ "b/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" @@ -1,6 +1,6 @@

- + ## 121. 买卖股票的最佳时机 diff --git "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" index 31b267736e..88d4654a03 100644 --- "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" +++ "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" index 477430c672..b875ed8a9e 100644 --- "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" +++ "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" @@ -1,6 +1,6 @@

- + ## 122.买卖股票的最佳时机II diff --git "a/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" "b/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" index 78f6dde06c..bce7b83c8f 100644 --- "a/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" +++ "b/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" @@ -1,6 +1,6 @@

- + ## 123.买卖股票的最佳时机III diff --git "a/problems/0127.\345\215\225\350\257\215\346\216\245\351\276\231.md" "b/problems/0127.\345\215\225\350\257\215\346\216\245\351\276\231.md" index 8467519485..c7eb4b39d4 100644 --- "a/problems/0127.\345\215\225\350\257\215\346\216\245\351\276\231.md" +++ "b/problems/0127.\345\215\225\350\257\215\346\216\245\351\276\231.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0129.\346\261\202\346\240\271\345\210\260\345\217\266\345\255\220\350\212\202\347\202\271\346\225\260\345\255\227\344\271\213\345\222\214.md" "b/problems/0129.\346\261\202\346\240\271\345\210\260\345\217\266\345\255\220\350\212\202\347\202\271\346\225\260\345\255\227\344\271\213\345\222\214.md" index 14c700ac44..89ec63d5c4 100644 --- "a/problems/0129.\346\261\202\346\240\271\345\210\260\345\217\266\345\255\220\350\212\202\347\202\271\346\225\260\345\255\227\344\271\213\345\222\214.md" +++ "b/problems/0129.\346\261\202\346\240\271\345\210\260\345\217\266\345\255\220\350\212\202\347\202\271\346\225\260\345\255\227\344\271\213\345\222\214.md" @@ -1,6 +1,6 @@

- + # 129. 求根节点到叶节点数字之和 diff --git "a/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" "b/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" index 8b1462747b..aeee36714e 100644 --- "a/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" +++ "b/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0132.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262II.md" "b/problems/0132.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262II.md" index 5db7eabfb8..cd18b65ac2 100644 --- "a/problems/0132.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262II.md" +++ "b/problems/0132.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262II.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0134.\345\212\240\346\262\271\347\253\231.md" "b/problems/0134.\345\212\240\346\262\271\347\253\231.md" index ab896e4a11..17e750c144 100644 --- "a/problems/0134.\345\212\240\346\262\271\347\253\231.md" +++ "b/problems/0134.\345\212\240\346\262\271\347\253\231.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0135.\345\210\206\345\217\221\347\263\226\346\236\234.md" "b/problems/0135.\345\210\206\345\217\221\347\263\226\346\236\234.md" index 1005a86f4e..f20e0ee0b5 100644 --- "a/problems/0135.\345\210\206\345\217\221\347\263\226\346\236\234.md" +++ "b/problems/0135.\345\210\206\345\217\221\347\263\226\346\236\234.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" "b/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" index 4e36777e07..c82869545a 100644 --- "a/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" +++ "b/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0141.\347\216\257\345\275\242\351\223\276\350\241\250.md" "b/problems/0141.\347\216\257\345\275\242\351\223\276\350\241\250.md" index 41f6c18c3f..a2b45eaee5 100644 --- "a/problems/0141.\347\216\257\345\275\242\351\223\276\350\241\250.md" +++ "b/problems/0141.\347\216\257\345\275\242\351\223\276\350\241\250.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0142.\347\216\257\345\275\242\351\223\276\350\241\250II.md" "b/problems/0142.\347\216\257\345\275\242\351\223\276\350\241\250II.md" index 856713c28b..865504095e 100644 --- "a/problems/0142.\347\216\257\345\275\242\351\223\276\350\241\250II.md" +++ "b/problems/0142.\347\216\257\345\275\242\351\223\276\350\241\250II.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0143.\351\207\215\346\216\222\351\223\276\350\241\250.md" "b/problems/0143.\351\207\215\346\216\222\351\223\276\350\241\250.md" index af4e8061a9..e740692b7b 100644 --- "a/problems/0143.\351\207\215\346\216\222\351\223\276\350\241\250.md" +++ "b/problems/0143.\351\207\215\346\216\222\351\223\276\350\241\250.md" @@ -1,6 +1,6 @@

- + # 143.重排链表 diff --git "a/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" "b/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" index da65381676..cc2322adca 100644 --- "a/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" +++ "b/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" "b/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" index 466d394e5a..0a06e02472 100644 --- "a/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" +++ "b/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0160.\347\233\270\344\272\244\351\223\276\350\241\250.md" "b/problems/0160.\347\233\270\344\272\244\351\223\276\350\241\250.md" index c313e05581..8d71bca514 100644 --- "a/problems/0160.\347\233\270\344\272\244\351\223\276\350\241\250.md" +++ "b/problems/0160.\347\233\270\344\272\244\351\223\276\350\241\250.md" @@ -1,6 +1,6 @@

- + 同:[链表:链表相交](https://programmercarl.com/面试题02.07.链表相交.html) diff --git "a/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" "b/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" index caff925756..a069fbe6ac 100644 --- "a/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" +++ "b/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" @@ -1,6 +1,6 @@

- + ## 188.买卖股票的最佳时机IV diff --git "a/problems/0189.\346\227\213\350\275\254\346\225\260\347\273\204.md" "b/problems/0189.\346\227\213\350\275\254\346\225\260\347\273\204.md" index 6159fb8de6..356cbe301a 100644 --- "a/problems/0189.\346\227\213\350\275\254\346\225\260\347\273\204.md" +++ "b/problems/0189.\346\227\213\350\275\254\346\225\260\347\273\204.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0198.\346\211\223\345\256\266\345\212\253\350\210\215.md" "b/problems/0198.\346\211\223\345\256\266\345\212\253\350\210\215.md" index 00a57c27e3..dd8b067fe5 100644 --- "a/problems/0198.\346\211\223\345\256\266\345\212\253\350\210\215.md" +++ "b/problems/0198.\346\211\223\345\256\266\345\212\253\350\210\215.md" @@ -1,6 +1,6 @@

- + ## 198.打家劫舍 diff --git "a/problems/0202.\345\277\253\344\271\220\346\225\260.md" "b/problems/0202.\345\277\253\344\271\220\346\225\260.md" index 864447f5a3..bda75636f2 100644 --- "a/problems/0202.\345\277\253\344\271\220\346\225\260.md" +++ "b/problems/0202.\345\277\253\344\271\220\346\225\260.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" "b/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" index aa8f859c36..b679084a27 100644 --- "a/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" +++ "b/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0205.\345\220\214\346\236\204\345\255\227\347\254\246\344\270\262.md" "b/problems/0205.\345\220\214\346\236\204\345\255\227\347\254\246\344\270\262.md" index 7f55ae047f..e31f5edcb8 100644 --- "a/problems/0205.\345\220\214\346\236\204\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/0205.\345\220\214\346\236\204\345\255\227\347\254\246\344\270\262.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md" "b/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md" index 6e853e01cd..717c17f70e 100644 --- "a/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md" +++ "b/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" "b/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" index b44a63a3d6..c9f62059c1 100644 --- "a/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" +++ "b/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0213.\346\211\223\345\256\266\345\212\253\350\210\215II.md" "b/problems/0213.\346\211\223\345\256\266\345\212\253\350\210\215II.md" index 88b6f0d4de..b37a72153c 100644 --- "a/problems/0213.\346\211\223\345\256\266\345\212\253\350\210\215II.md" +++ "b/problems/0213.\346\211\223\345\256\266\345\212\253\350\210\215II.md" @@ -1,6 +1,6 @@

- + ## 213.打家劫舍II diff --git "a/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" "b/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" index c16b3de32f..5baaffa2eb 100644 --- "a/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" +++ "b/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" "b/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" index 96559e32e9..416b1dba19 100644 --- "a/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" +++ "b/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" "b/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" index b32ef61c65..0f7c187758 100644 --- "a/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" +++ "b/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" "b/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" index 4cfb261bfa..6e7c6eae0e 100644 --- "a/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" "b/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" index 28a57f18e8..9d97654223 100644 --- "a/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" +++ "b/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0234.\345\233\236\346\226\207\351\223\276\350\241\250.md" "b/problems/0234.\345\233\236\346\226\207\351\223\276\350\241\250.md" index ad7c744834..291567d75c 100644 --- "a/problems/0234.\345\233\236\346\226\207\351\223\276\350\241\250.md" +++ "b/problems/0234.\345\233\236\346\226\207\351\223\276\350\241\250.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" "b/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" index 7a3ab9c9b4..215646dc2f 100644 --- "a/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" +++ "b/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" "b/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" index 5e7a2134c8..76c9d3b194 100644 --- "a/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" +++ "b/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" "b/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" index c1b16502cb..a7d763ce2e 100644 --- "a/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" +++ "b/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" "b/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" index e941a011f0..370b14bb57 100644 --- "a/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" +++ "b/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" "b/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" index 5029165f7c..c117f10715 100644 --- "a/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" +++ "b/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" "b/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" index 049ca070ff..a24353e13c 100644 --- "a/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" +++ "b/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" @@ -1,6 +1,6 @@

- + # 动态规划:一样的套路,再求一次完全平方数 diff --git "a/problems/0283.\347\247\273\345\212\250\351\233\266.md" "b/problems/0283.\347\247\273\345\212\250\351\233\266.md" index e6bba0c922..337a0bd872 100644 --- "a/problems/0283.\347\247\273\345\212\250\351\233\266.md" +++ "b/problems/0283.\347\247\273\345\212\250\351\233\266.md" @@ -1,6 +1,6 @@

- + # 动态规划:一样的套路,再求一次完全平方数 diff --git "a/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" "b/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" index 650be4eb24..7f15bf359d 100644 --- "a/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" @@ -1,6 +1,6 @@

- + ## 300.最长递增子序列 diff --git "a/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" "b/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" index e0b0fb21e3..525f8ceff9 100644 --- "a/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" +++ "b/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" @@ -1,6 +1,6 @@

- + ## 309.最佳买卖股票时机含冷冻期 diff --git "a/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" "b/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" index e06f811b1b..77e66c0d4c 100644 --- "a/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" +++ "b/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" @@ -1,6 +1,6 @@

- + # 动态规划: 给我个机会,我再兑换一次零钱 diff --git "a/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" "b/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" index 4d59a9a0eb..30ff3f0a48 100644 --- "a/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" +++ "b/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" "b/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" index e54ce40ad0..43ba720bf1 100644 --- "a/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" +++ "b/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" "b/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" index 65eb83de23..b6f8fd42ce 100644 --- "a/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" +++ "b/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" @@ -1,6 +1,6 @@

- + ## 343. 整数拆分 diff --git "a/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" "b/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" index 54165f228e..179aa25ffb 100644 --- "a/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" "b/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" index 94e7a86b84..165c159439 100644 --- "a/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" +++ "b/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" "b/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" index 09436f02e0..a6d152512c 100644 --- "a/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" +++ "b/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" "b/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" index 799f0de6ec..98e8fbea4e 100644 --- "a/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" +++ "b/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0377.\347\273\204\345\220\210\346\200\273\345\222\214\342\205\243.md" "b/problems/0377.\347\273\204\345\220\210\346\200\273\345\222\214\342\205\243.md" index 5db2f972d3..6de0074101 100644 --- "a/problems/0377.\347\273\204\345\220\210\346\200\273\345\222\214\342\205\243.md" +++ "b/problems/0377.\347\273\204\345\220\210\346\200\273\345\222\214\342\205\243.md" @@ -1,6 +1,6 @@

- + # 动态规划:Carl称它为排列总和! diff --git "a/problems/0383.\350\265\216\351\207\221\344\277\241.md" "b/problems/0383.\350\265\216\351\207\221\344\277\241.md" index 7f2d96fef9..55b6ad8b78 100644 --- "a/problems/0383.\350\265\216\351\207\221\344\277\241.md" +++ "b/problems/0383.\350\265\216\351\207\221\344\277\241.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" "b/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" index efc682d5bd..f097f25cb0 100644 --- "a/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" "b/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" index db50c2685f..0b25cf304c 100644 --- "a/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" +++ "b/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" "b/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" index e218fc5bb4..be76603360 100644 --- "a/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" +++ "b/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" "b/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" index 19fd0150b7..e785d99990 100644 --- "a/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" +++ "b/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" @@ -1,6 +1,6 @@

- + ## 416. 分割等和子集 diff --git "a/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" "b/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" index d3f05f8559..c296a4c489 100644 --- "a/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" +++ "b/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" "b/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" index 5f899e97ad..d17dd99266 100644 --- "a/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" +++ "b/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" "b/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" index ddf90169e0..3a836011f2 100644 --- "a/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" +++ "b/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" "b/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" index 1a1c4f795a..4db26ae443 100644 --- "a/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" +++ "b/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" "b/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" index ee41b8f634..b2970deb83 100644 --- "a/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" +++ "b/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" "b/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" index e89594ec5d..c3fd7edbfd 100644 --- "a/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0463.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" "b/problems/0463.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" index b73ec1aa88..ddd43d8c8f 100644 --- "a/problems/0463.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" +++ "b/problems/0463.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" @@ -1,6 +1,6 @@

- + # 463. 岛屿的周长 diff --git "a/problems/0474.\344\270\200\345\222\214\351\233\266.md" "b/problems/0474.\344\270\200\345\222\214\351\233\266.md" index 6dd9d2e954..0c5665da52 100644 --- "a/problems/0474.\344\270\200\345\222\214\351\233\266.md" +++ "b/problems/0474.\344\270\200\345\222\214\351\233\266.md" @@ -1,6 +1,6 @@

- + # 动态规划:一和零! diff --git "a/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" "b/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" index 00e8f764f6..26e727e6df 100644 --- "a/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0494.\347\233\256\346\240\207\345\222\214.md" "b/problems/0494.\347\233\256\346\240\207\345\222\214.md" index dd3bf30e70..087d030c1d 100644 --- "a/problems/0494.\347\233\256\346\240\207\345\222\214.md" +++ "b/problems/0494.\347\233\256\346\240\207\345\222\214.md" @@ -1,6 +1,6 @@

- + # 动态规划:目标和! diff --git "a/problems/0496.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240I.md" "b/problems/0496.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240I.md" index 570db940f9..dfcbe6c4b3 100644 --- "a/problems/0496.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240I.md" +++ "b/problems/0496.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240I.md" @@ -1,6 +1,6 @@

- + # 496.下一个更大元素 I diff --git "a/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" "b/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" index 200e59932e..01a6831938 100644 --- "a/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" +++ "b/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" "b/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" index 4d8b78a97f..d4e8553bc7 100644 --- "a/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" +++ "b/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" @@ -1,6 +1,6 @@

- + # 503.下一个更大元素II diff --git "a/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" "b/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" index 906aa491f7..fb7aab2d8a 100644 --- "a/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" +++ "b/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" @@ -1,6 +1,6 @@

- + ## 509. 斐波那契数 diff --git "a/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" "b/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" index 8a5b8fb26c..2991ffb33a 100644 --- "a/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" +++ "b/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0516.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\345\272\217\345\210\227.md" "b/problems/0516.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\345\272\217\345\210\227.md" index a20e583e7f..0fa1f36114 100644 --- "a/problems/0516.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0516.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\345\272\217\345\210\227.md" @@ -1,6 +1,6 @@

- + ## 516.最长回文子序列 diff --git "a/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" "b/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" index aea49d8acc..6780503497 100644 --- "a/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" +++ "b/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" @@ -1,6 +1,6 @@

- + # 动态规划:给你一些零钱,你要怎么凑? diff --git "a/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" "b/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" index ff6103a42f..c35ee67516 100644 --- "a/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" +++ "b/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0538.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md" "b/problems/0538.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md" index c1454f0837..0b3cbf2da3 100644 --- "a/problems/0538.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md" +++ "b/problems/0538.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" "b/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" index 1de1b7369b..7d6c9253bf 100644 --- "a/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" +++ "b/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" "b/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" index bb28e87775..a7189656bb 100644 --- "a/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" +++ "b/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" @@ -1,6 +1,6 @@

- + ## 583. 两个字符串的删除操作 diff --git "a/problems/0617.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md" "b/problems/0617.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md" index 0cc10400ce..bdae549cf2 100644 --- "a/problems/0617.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0617.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" "b/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" index a4c38e132d..b8e1f88749 100644 --- "a/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" +++ "b/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" @@ -1,6 +1,6 @@

- + ## 647. 回文子串 diff --git "a/problems/0649.Dota2\345\217\202\350\256\256\351\231\242.md" "b/problems/0649.Dota2\345\217\202\350\256\256\351\231\242.md" index 34270b54f3..9d94050e92 100644 --- "a/problems/0649.Dota2\345\217\202\350\256\256\351\231\242.md" +++ "b/problems/0649.Dota2\345\217\202\350\256\256\351\231\242.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" "b/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" index f428a52a04..42e6d2c3c7 100644 --- "a/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0657.\346\234\272\345\231\250\344\272\272\350\203\275\345\220\246\350\277\224\345\233\236\345\216\237\347\202\271.md" "b/problems/0657.\346\234\272\345\231\250\344\272\272\350\203\275\345\220\246\350\277\224\345\233\236\345\216\237\347\202\271.md" index 6576f765b2..590e3ee0e4 100644 --- "a/problems/0657.\346\234\272\345\231\250\344\272\272\350\203\275\345\220\246\350\277\224\345\233\236\345\216\237\347\202\271.md" +++ "b/problems/0657.\346\234\272\345\231\250\344\272\272\350\203\275\345\220\246\350\277\224\345\233\236\345\216\237\347\202\271.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0669.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0669.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" index 2c5c2f82c3..98fb9dd0fc 100644 --- "a/problems/0669.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" +++ "b/problems/0669.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0673.\346\234\200\351\225\277\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227\347\232\204\344\270\252\346\225\260.md" "b/problems/0673.\346\234\200\351\225\277\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227\347\232\204\344\270\252\346\225\260.md" index aa3b5c363a..4143276bc7 100644 --- "a/problems/0673.\346\234\200\351\225\277\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227\347\232\204\344\270\252\346\225\260.md" +++ "b/problems/0673.\346\234\200\351\225\277\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227\347\232\204\344\270\252\346\225\260.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" "b/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" index c36a42d09b..afdfdfec8b 100644 --- "a/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" +++ "b/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" @@ -1,6 +1,6 @@

- + ## 674. 最长连续递增序列 diff --git "a/problems/0684.\345\206\227\344\275\231\350\277\236\346\216\245.md" "b/problems/0684.\345\206\227\344\275\231\350\277\236\346\216\245.md" index 65f79d0e0e..e5cd416c90 100644 --- "a/problems/0684.\345\206\227\344\275\231\350\277\236\346\216\245.md" +++ "b/problems/0684.\345\206\227\344\275\231\350\277\236\346\216\245.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0685.\345\206\227\344\275\231\350\277\236\346\216\245II.md" "b/problems/0685.\345\206\227\344\275\231\350\277\236\346\216\245II.md" index 92d10a56af..c7af6484a5 100644 --- "a/problems/0685.\345\206\227\344\275\231\350\277\236\346\216\245II.md" +++ "b/problems/0685.\345\206\227\344\275\231\350\277\236\346\216\245II.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0700.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\220\234\347\264\242.md" "b/problems/0700.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\220\234\347\264\242.md" index 12c243b4a2..3ebdaa493f 100644 --- "a/problems/0700.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\220\234\347\264\242.md" +++ "b/problems/0700.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\220\234\347\264\242.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" "b/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" index ea29256d34..536e0778a1 100644 --- "a/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" +++ "b/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" "b/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" index 882086f186..ac5cacdfc8 100644 --- "a/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" +++ "b/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" "b/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" index d4dde2e86d..e8711723a5 100644 --- "a/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" +++ "b/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271.md" "b/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271.md" index 3fa1ea329b..fbaf635e3c 100644 --- "a/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271.md" +++ "b/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" "b/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" index 6e48b85216..b598195095 100644 --- "a/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" +++ "b/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" @@ -1,6 +1,6 @@

- + ## 714.买卖股票的最佳时机含手续费 diff --git "a/problems/0718.\346\234\200\351\225\277\351\207\215\345\244\215\345\255\220\346\225\260\347\273\204.md" "b/problems/0718.\346\234\200\351\225\277\351\207\215\345\244\215\345\255\220\346\225\260\347\273\204.md" index 4f18716abe..adbd1dee4b 100644 --- "a/problems/0718.\346\234\200\351\225\277\351\207\215\345\244\215\345\255\220\346\225\260\347\273\204.md" +++ "b/problems/0718.\346\234\200\351\225\277\351\207\215\345\244\215\345\255\220\346\225\260\347\273\204.md" @@ -1,6 +1,6 @@

- + ## 718. 最长重复子数组 diff --git "a/problems/0724.\345\257\273\346\211\276\346\225\260\347\273\204\347\232\204\344\270\255\345\277\203\347\264\242\345\274\225.md" "b/problems/0724.\345\257\273\346\211\276\346\225\260\347\273\204\347\232\204\344\270\255\345\277\203\347\264\242\345\274\225.md" index 6f4d4eff7a..a3b9c8f158 100644 --- "a/problems/0724.\345\257\273\346\211\276\346\225\260\347\273\204\347\232\204\344\270\255\345\277\203\347\264\242\345\274\225.md" +++ "b/problems/0724.\345\257\273\346\211\276\346\225\260\347\273\204\347\232\204\344\270\255\345\277\203\347\264\242\345\274\225.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0738.\345\215\225\350\260\203\351\200\222\345\242\236\347\232\204\346\225\260\345\255\227.md" "b/problems/0738.\345\215\225\350\260\203\351\200\222\345\242\236\347\232\204\346\225\260\345\255\227.md" index f84736191f..1733284a44 100644 --- "a/problems/0738.\345\215\225\350\260\203\351\200\222\345\242\236\347\232\204\346\225\260\345\255\227.md" +++ "b/problems/0738.\345\215\225\350\260\203\351\200\222\345\242\236\347\232\204\346\225\260\345\255\227.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" "b/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" index affdf99ce2..2cd42e6969 100644 --- "a/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" +++ "b/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" "b/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" index 2fb2a50d60..5f9ae3adf4 100644 --- "a/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" +++ "b/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" @@ -1,6 +1,6 @@

- + ## 746. 使用最小花费爬楼梯 diff --git "a/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" "b/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" index d108b8c00a..3087fe18a5 100644 --- "a/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" +++ "b/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0841.\351\222\245\345\214\231\345\222\214\346\210\277\351\227\264.md" "b/problems/0841.\351\222\245\345\214\231\345\222\214\346\210\277\351\227\264.md" index c20c411a48..52f574ea20 100644 --- "a/problems/0841.\351\222\245\345\214\231\345\222\214\346\210\277\351\227\264.md" +++ "b/problems/0841.\351\222\245\345\214\231\345\222\214\346\210\277\351\227\264.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0844.\346\257\224\350\276\203\345\220\253\351\200\200\346\240\274\347\232\204\345\255\227\347\254\246\344\270\262.md" "b/problems/0844.\346\257\224\350\276\203\345\220\253\351\200\200\346\240\274\347\232\204\345\255\227\347\254\246\344\270\262.md" index 580155d3ee..012fea91ba 100644 --- "a/problems/0844.\346\257\224\350\276\203\345\220\253\351\200\200\346\240\274\347\232\204\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/0844.\346\257\224\350\276\203\345\220\253\351\200\200\346\240\274\347\232\204\345\255\227\347\254\246\344\270\262.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0860.\346\237\240\346\252\254\346\260\264\346\211\276\351\233\266.md" "b/problems/0860.\346\237\240\346\252\254\346\260\264\346\211\276\351\233\266.md" index 1990331c7f..f265f21df5 100644 --- "a/problems/0860.\346\237\240\346\252\254\346\260\264\346\211\276\351\233\266.md" +++ "b/problems/0860.\346\237\240\346\252\254\346\260\264\346\211\276\351\233\266.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0922.\346\214\211\345\245\207\345\201\266\346\216\222\345\272\217\346\225\260\347\273\204II.md" "b/problems/0922.\346\214\211\345\245\207\345\201\266\346\216\222\345\272\217\346\225\260\347\273\204II.md" index 4e10038a64..8e13f610a2 100644 --- "a/problems/0922.\346\214\211\345\245\207\345\201\266\346\216\222\345\272\217\346\225\260\347\273\204II.md" +++ "b/problems/0922.\346\214\211\345\245\207\345\201\266\346\216\222\345\272\217\346\225\260\347\273\204II.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0925.\351\225\277\346\214\211\351\224\256\345\205\245.md" "b/problems/0925.\351\225\277\346\214\211\351\224\256\345\205\245.md" index 7e66a390b7..59056f091f 100644 --- "a/problems/0925.\351\225\277\346\214\211\351\224\256\345\205\245.md" +++ "b/problems/0925.\351\225\277\346\214\211\351\224\256\345\205\245.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0941.\346\234\211\346\225\210\347\232\204\345\261\261\350\204\211\346\225\260\347\273\204.md" "b/problems/0941.\346\234\211\346\225\210\347\232\204\345\261\261\350\204\211\346\225\260\347\273\204.md" index 0d87f2470a..616ee8bc14 100644 --- "a/problems/0941.\346\234\211\346\225\210\347\232\204\345\261\261\350\204\211\346\225\260\347\273\204.md" +++ "b/problems/0941.\346\234\211\346\225\210\347\232\204\345\261\261\350\204\211\346\225\260\347\273\204.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" "b/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" index 902b0990aa..fea9eb0d21 100644 --- "a/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" "b/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" index f6dc846643..f629cd1c7f 100644 --- "a/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" +++ "b/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" @@ -1,6 +1,6 @@

- + > 双指针风骚起来,也是无敌 diff --git "a/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md" "b/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md" index caea5a5a12..9f6437fecd 100644 --- "a/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md" +++ "b/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" "b/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" index dd3fe9d86a..2a98f29eb5 100644 --- "a/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" +++ "b/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/1035.\344\270\215\347\233\270\344\272\244\347\232\204\347\272\277.md" "b/problems/1035.\344\270\215\347\233\270\344\272\244\347\232\204\347\272\277.md" index d5e8b0a91c..8b004d18a0 100644 --- "a/problems/1035.\344\270\215\347\233\270\344\272\244\347\232\204\347\272\277.md" +++ "b/problems/1035.\344\270\215\347\233\270\344\272\244\347\232\204\347\272\277.md" @@ -1,6 +1,6 @@

- + ## 1035.不相交的线 diff --git "a/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" "b/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" index 1a47072d9f..62bf2adb47 100644 --- "a/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" +++ "b/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" "b/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" index a102fb1ee3..1bb29823e5 100644 --- "a/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" +++ "b/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" @@ -1,6 +1,6 @@

- + # 动态规划:最后一块石头的重量 II diff --git "a/problems/1143.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" "b/problems/1143.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" index 6608a67a14..e4255cc247 100644 --- "a/problems/1143.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/1143.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" @@ -1,6 +1,6 @@

- + ## 1143.最长公共子序列 diff --git "a/problems/1207.\347\213\254\344\270\200\346\227\240\344\272\214\347\232\204\345\207\272\347\216\260\346\254\241\346\225\260.md" "b/problems/1207.\347\213\254\344\270\200\346\227\240\344\272\214\347\232\204\345\207\272\347\216\260\346\254\241\346\225\260.md" index 0f0b65a981..3bae222f1b 100644 --- "a/problems/1207.\347\213\254\344\270\200\346\227\240\344\272\214\347\232\204\345\207\272\347\216\260\346\254\241\346\225\260.md" +++ "b/problems/1207.\347\213\254\344\270\200\346\227\240\344\272\214\347\232\204\345\207\272\347\216\260\346\254\241\346\225\260.md" @@ -1,6 +1,6 @@

- + # 1207.独一无二的出现次数 diff --git "a/problems/1221.\345\210\206\345\211\262\345\271\263\350\241\241\345\255\227\347\254\246\344\270\262.md" "b/problems/1221.\345\210\206\345\211\262\345\271\263\350\241\241\345\255\227\347\254\246\344\270\262.md" index d3e7f7fd0a..f1f01e0fa7 100644 --- "a/problems/1221.\345\210\206\345\211\262\345\271\263\350\241\241\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/1221.\345\210\206\345\211\262\345\271\263\350\241\241\345\255\227\347\254\246\344\270\262.md" @@ -1,6 +1,6 @@

- + # 1221. 分割平衡字符串 diff --git "a/problems/1356.\346\240\271\346\215\256\346\225\260\345\255\227\344\272\214\350\277\233\345\210\266\344\270\2131\347\232\204\346\225\260\347\233\256\346\216\222\345\272\217.md" "b/problems/1356.\346\240\271\346\215\256\346\225\260\345\255\227\344\272\214\350\277\233\345\210\266\344\270\2131\347\232\204\346\225\260\347\233\256\346\216\222\345\272\217.md" index cbe918c653..3bc1fb28bb 100644 --- "a/problems/1356.\346\240\271\346\215\256\346\225\260\345\255\227\344\272\214\350\277\233\345\210\266\344\270\2131\347\232\204\346\225\260\347\233\256\346\216\222\345\272\217.md" +++ "b/problems/1356.\346\240\271\346\215\256\346\225\260\345\255\227\344\272\214\350\277\233\345\210\266\344\270\2131\347\232\204\346\225\260\347\233\256\346\216\222\345\272\217.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/1365.\346\234\211\345\244\232\345\260\221\345\260\217\344\272\216\345\275\223\345\211\215\346\225\260\345\255\227\347\232\204\346\225\260\345\255\227.md" "b/problems/1365.\346\234\211\345\244\232\345\260\221\345\260\217\344\272\216\345\275\223\345\211\215\346\225\260\345\255\227\347\232\204\346\225\260\345\255\227.md" index a249d53c68..76eb3d36ae 100644 --- "a/problems/1365.\346\234\211\345\244\232\345\260\221\345\260\217\344\272\216\345\275\223\345\211\215\346\225\260\345\255\227\347\232\204\346\225\260\345\255\227.md" +++ "b/problems/1365.\346\234\211\345\244\232\345\260\221\345\260\217\344\272\216\345\275\223\345\211\215\346\225\260\345\255\227\347\232\204\346\225\260\345\255\227.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/1382.\345\260\206\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\345\217\230\345\271\263\350\241\241.md" "b/problems/1382.\345\260\206\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\345\217\230\345\271\263\350\241\241.md" index 87ff8b8a4a..b3926933b7 100644 --- "a/problems/1382.\345\260\206\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\345\217\230\345\271\263\350\241\241.md" +++ "b/problems/1382.\345\260\206\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\345\217\230\345\271\263\350\241\241.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/O(n)\347\232\204\347\256\227\346\263\225\345\261\205\347\204\266\350\266\205\346\227\266\344\272\206\357\274\214\346\255\244\346\227\266\347\232\204n\347\251\266\347\253\237\346\230\257\345\244\232\345\244\247\357\274\237.md" "b/problems/O(n)\347\232\204\347\256\227\346\263\225\345\261\205\347\204\266\350\266\205\346\227\266\344\272\206\357\274\214\346\255\244\346\227\266\347\232\204n\347\251\266\347\253\237\346\230\257\345\244\232\345\244\247\357\274\237.md" index 098ac622ff..2e9292e95a 100644 --- "a/problems/O(n)\347\232\204\347\256\227\346\263\225\345\261\205\347\204\266\350\266\205\346\227\266\344\272\206\357\274\214\346\255\244\346\227\266\347\232\204n\347\251\266\347\253\237\346\230\257\345\244\232\345\244\247\357\274\237.md" +++ "b/problems/O(n)\347\232\204\347\256\227\346\263\225\345\261\205\347\204\266\350\266\205\346\227\266\344\272\206\357\274\214\346\255\244\346\227\266\347\232\204n\347\251\266\347\253\237\346\230\257\345\244\232\345\244\247\357\274\237.md" @@ -1,6 +1,6 @@

- + # 程序提交之后为什么会超时?O(n)的算法会超时,n究竟是多大? diff --git "a/problems/\344\270\272\344\272\206\347\273\235\346\235\200\347\274\226\350\276\221\350\267\235\347\246\273\357\274\214\345\215\241\345\260\224\345\201\232\344\272\206\344\270\211\346\255\245\351\223\272\345\236\253.md" "b/problems/\344\270\272\344\272\206\347\273\235\346\235\200\347\274\226\350\276\221\350\267\235\347\246\273\357\274\214\345\215\241\345\260\224\345\201\232\344\272\206\344\270\211\346\255\245\351\223\272\345\236\253.md" index 30dc8a1224..76b23b1586 100644 --- "a/problems/\344\270\272\344\272\206\347\273\235\346\235\200\347\274\226\350\276\221\350\267\235\347\246\273\357\274\214\345\215\241\345\260\224\345\201\232\344\272\206\344\270\211\346\255\245\351\223\272\345\236\253.md" +++ "b/problems/\344\270\272\344\272\206\347\273\235\346\235\200\347\274\226\350\276\221\350\267\235\347\246\273\357\274\214\345\215\241\345\260\224\345\201\232\344\272\206\344\270\211\346\255\245\351\223\272\345\236\253.md" @@ -1,6 +1,6 @@

- + # 动态规划之编辑距离总结篇 diff --git "a/problems/\344\272\214\345\217\211\346\240\221\344\270\255\351\200\222\345\275\222\345\270\246\347\235\200\345\233\236\346\272\257.md" "b/problems/\344\272\214\345\217\211\346\240\221\344\270\255\351\200\222\345\275\222\345\270\246\347\235\200\345\233\236\346\272\257.md" index 1884e1ea91..79f231af72 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\344\270\255\351\200\222\345\275\222\345\270\246\347\235\200\345\233\236\346\272\257.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\344\270\255\351\200\222\345\275\222\345\270\246\347\235\200\345\233\236\346\272\257.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/\344\272\214\345\217\211\346\240\221\346\200\273\347\273\223\347\257\207.md" "b/problems/\344\272\214\345\217\211\346\240\221\346\200\273\347\273\223\347\257\207.md" index eae15c91ad..9e25302fec 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\346\200\273\347\273\223\347\257\207.md" @@ -1,6 +1,6 @@

- + # 二叉树:总结篇!(需要掌握的二叉树技能都在这里了) diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" index 35b0245f84..47c162c174 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -1,6 +1,6 @@

- + # 二叉树理论基础篇 diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\347\273\237\344\270\200\350\277\255\344\273\243\346\263\225.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\347\273\237\344\270\200\350\277\255\344\273\243\346\263\225.md" index 1aafa7ea54..486a101e04 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\347\273\237\344\270\200\350\277\255\344\273\243\346\263\225.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\347\273\237\344\270\200\350\277\255\344\273\243\346\263\225.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" index fba0b238bd..c5c920723c 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" index 8856a477d2..49851f3997 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/\345\205\263\344\272\216\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\214\344\275\240\344\270\215\347\237\245\351\201\223\347\232\204\351\203\275\345\234\250\350\277\231\351\207\214\357\274\201.md" "b/problems/\345\205\263\344\272\216\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\214\344\275\240\344\270\215\347\237\245\351\201\223\347\232\204\351\203\275\345\234\250\350\277\231\351\207\214\357\274\201.md" index 6052fbe73d..eb8383df7b 100644 --- "a/problems/\345\205\263\344\272\216\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\214\344\275\240\344\270\215\347\237\245\351\201\223\347\232\204\351\203\275\345\234\250\350\277\231\351\207\214\357\274\201.md" +++ "b/problems/\345\205\263\344\272\216\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\214\344\275\240\344\270\215\347\237\245\351\201\223\347\232\204\351\203\275\345\234\250\350\277\231\351\207\214\357\274\201.md" @@ -1,6 +1,6 @@

- + 相信每一位录友都接触过时间复杂度,「代码随想录」已经也讲了一百多道经典题目了,是时候对时间复杂度来一个深度的剖析了,很早之前就写过一篇,当时文章还没有人看,Carl感觉有价值的东西值得让更多的人看到,哈哈。 diff --git "a/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" "b/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" index a20cd01ae0..129cd249b8 100644 --- "a/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" +++ "b/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" "b/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" index a70ecd4c6b..ad269c675c 100644 --- "a/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/\345\212\250\346\200\201\350\247\204\345\210\222-\350\202\241\347\245\250\351\227\256\351\242\230\346\200\273\347\273\223\347\257\207.md" "b/problems/\345\212\250\346\200\201\350\247\204\345\210\222-\350\202\241\347\245\250\351\227\256\351\242\230\346\200\273\347\273\223\347\257\207.md" index 6ea4a78e0b..7347048543 100644 --- "a/problems/\345\212\250\346\200\201\350\247\204\345\210\222-\350\202\241\347\245\250\351\227\256\351\242\230\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/\345\212\250\346\200\201\350\247\204\345\210\222-\350\202\241\347\245\250\351\227\256\351\242\230\346\200\273\347\273\223\347\257\207.md" @@ -1,6 +1,6 @@

- + 之前我们已经把力扣上股票系列的题目都讲过的,但没有来一篇股票总结,来帮大家高屋建瓴,所以总结篇这就来了! diff --git "a/problems/\345\212\250\346\200\201\350\247\204\345\210\222\346\200\273\347\273\223\347\257\207.md" "b/problems/\345\212\250\346\200\201\350\247\204\345\210\222\346\200\273\347\273\223\347\257\207.md" index fc9231ada6..b1331a6b47 100644 --- "a/problems/\345\212\250\346\200\201\350\247\204\345\210\222\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/\345\212\250\346\200\201\350\247\204\345\210\222\346\200\273\347\273\223\347\257\207.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/\345\212\250\346\200\201\350\247\204\345\210\222\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\345\212\250\346\200\201\350\247\204\345\210\222\347\220\206\350\256\272\345\237\272\347\241\200.md" index 270357ea3a..70c57a48c2 100644 --- "a/problems/\345\212\250\346\200\201\350\247\204\345\210\222\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\345\212\250\346\200\201\350\247\204\345\210\222\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -1,6 +1,6 @@

- + # 动态规划理论基础 diff --git "a/problems/\345\217\214\346\214\207\351\222\210\346\200\273\347\273\223.md" "b/problems/\345\217\214\346\214\207\351\222\210\346\200\273\347\273\223.md" index f4a01c1ec0..c3a7d928b9 100644 --- "a/problems/\345\217\214\346\214\207\351\222\210\346\200\273\347\273\223.md" +++ "b/problems/\345\217\214\346\214\207\351\222\210\346\200\273\347\273\223.md" @@ -1,6 +1,6 @@

- + > 又是一波总结 diff --git "a/problems/\345\223\210\345\270\214\350\241\250\346\200\273\347\273\223.md" "b/problems/\345\223\210\345\270\214\350\241\250\346\200\273\347\273\223.md" index ad329c8b30..c16d2b62b3 100644 --- "a/problems/\345\223\210\345\270\214\350\241\250\346\200\273\347\273\223.md" +++ "b/problems/\345\223\210\345\270\214\350\241\250\346\200\273\347\273\223.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/\345\223\210\345\270\214\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\345\223\210\345\270\214\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" index 5339d2868c..f565246410 100644 --- "a/problems/\345\223\210\345\270\214\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\345\223\210\345\270\214\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/\345\233\236\346\272\257\346\200\273\347\273\223.md" "b/problems/\345\233\236\346\272\257\346\200\273\347\273\223.md" index 3536562442..403ec7e725 100644 --- "a/problems/\345\233\236\346\272\257\346\200\273\347\273\223.md" +++ "b/problems/\345\233\236\346\272\257\346\200\273\347\273\223.md" @@ -1,6 +1,6 @@

- + > 20张树形结构图、14道精选回溯题目,21篇回溯法精讲文章,由浅入深,一气呵成,这是全网最强回溯算法总结! diff --git "a/problems/\345\233\236\346\272\257\347\256\227\346\263\225\345\216\273\351\207\215\351\227\256\351\242\230\347\232\204\345\217\246\344\270\200\347\247\215\345\206\231\346\263\225.md" "b/problems/\345\233\236\346\272\257\347\256\227\346\263\225\345\216\273\351\207\215\351\227\256\351\242\230\347\232\204\345\217\246\344\270\200\347\247\215\345\206\231\346\263\225.md" index cc06d1cab1..b397b61ab8 100644 --- "a/problems/\345\233\236\346\272\257\347\256\227\346\263\225\345\216\273\351\207\215\351\227\256\351\242\230\347\232\204\345\217\246\344\270\200\347\247\215\345\206\231\346\263\225.md" +++ "b/problems/\345\233\236\346\272\257\347\256\227\346\263\225\345\216\273\351\207\215\351\227\256\351\242\230\347\232\204\345\217\246\344\270\200\347\247\215\345\206\231\346\263\225.md" @@ -1,6 +1,6 @@

- + # 回溯算法去重问题的另一种写法 diff --git "a/problems/\345\233\236\346\272\257\347\256\227\346\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\345\233\236\346\272\257\347\256\227\346\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md" index 44629cd58a..d8a04582ae 100644 --- "a/problems/\345\233\236\346\272\257\347\256\227\346\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\345\233\236\346\272\257\347\256\227\346\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -1,6 +1,6 @@

- + # 回溯算法理论基础 diff --git "a/problems/\345\255\227\347\254\246\344\270\262\346\200\273\347\273\223.md" "b/problems/\345\255\227\347\254\246\344\270\262\346\200\273\347\273\223.md" index 4a61d6ea2a..f8fc148d57 100644 --- "a/problems/\345\255\227\347\254\246\344\270\262\346\200\273\347\273\223.md" +++ "b/problems/\345\255\227\347\254\246\344\270\262\346\200\273\347\273\223.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/\346\225\260\347\273\204\346\200\273\347\273\223\347\257\207.md" "b/problems/\346\225\260\347\273\204\346\200\273\347\273\223\347\257\207.md" index d1aea1fd53..85ab718b87 100644 --- "a/problems/\346\225\260\347\273\204\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/\346\225\260\347\273\204\346\200\273\347\273\223\347\257\207.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/\346\225\260\347\273\204\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\346\225\260\347\273\204\347\220\206\350\256\272\345\237\272\347\241\200.md" index 66527ef03f..6777a8dd15 100644 --- "a/problems/\346\225\260\347\273\204\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\346\225\260\347\273\204\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/\346\240\210\344\270\216\351\230\237\345\210\227\346\200\273\347\273\223.md" "b/problems/\346\240\210\344\270\216\351\230\237\345\210\227\346\200\273\347\273\223.md" index 7fa63bc595..2526d75c4b 100644 --- "a/problems/\346\240\210\344\270\216\351\230\237\345\210\227\346\200\273\347\273\223.md" +++ "b/problems/\346\240\210\344\270\216\351\230\237\345\210\227\346\200\273\347\273\223.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/\346\240\210\344\270\216\351\230\237\345\210\227\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\346\240\210\344\270\216\351\230\237\345\210\227\347\220\206\350\256\272\345\237\272\347\241\200.md" index 0721119dbb..2acd1d153b 100644 --- "a/problems/\346\240\210\344\270\216\351\230\237\345\210\227\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\346\240\210\344\270\216\351\230\237\345\210\227\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -1,6 +1,6 @@

- + > 来看看栈和队列不为人知的一面 diff --git "a/problems/\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227\357\274\210vector\345\216\237\347\220\206\350\256\262\350\247\243\357\274\211.md" "b/problems/\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227\357\274\210vector\345\216\237\347\220\206\350\256\262\350\247\243\357\274\211.md" index 3425259197..c406076e51 100644 --- "a/problems/\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227\357\274\210vector\345\216\237\347\220\206\350\256\262\350\247\243\357\274\211.md" +++ "b/problems/\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227\357\274\210vector\345\216\237\347\220\206\350\256\262\350\247\243\357\274\211.md" @@ -1,6 +1,6 @@

- + # 贪心算法:根据身高重建队列(续集) diff --git "a/problems/\347\256\227\346\263\225\346\250\241\346\235\277.md" "b/problems/\347\256\227\346\263\225\346\250\241\346\235\277.md" index 2a310c0bc3..30c626bb4c 100644 --- "a/problems/\347\256\227\346\263\225\346\250\241\346\235\277.md" +++ "b/problems/\347\256\227\346\263\225\346\250\241\346\235\277.md" @@ -1,6 +1,6 @@

- + ## 二分查找法 diff --git "a/problems/\350\203\214\345\214\205\346\200\273\347\273\223\347\257\207.md" "b/problems/\350\203\214\345\214\205\346\200\273\347\273\223\347\257\207.md" index e49b1991aa..01803bbcd1 100644 --- "a/problems/\350\203\214\345\214\205\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/\350\203\214\345\214\205\346\200\273\347\273\223\347\257\207.md" @@ -1,6 +1,6 @@

- + # 听说背包问题很难? 这篇总结篇来拯救你了 diff --git "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" index e353e58190..9f1136dc75 100644 --- "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" +++ "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" @@ -1,6 +1,6 @@

- + # 动态规划:关于01背包问题,你该了解这些! diff --git "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" index c7dab994c7..3296f604e6 100644 --- "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" +++ "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" @@ -1,6 +1,6 @@

- + # 动态规划:关于01背包问题,你该了解这些!(滚动数组) diff --git "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\244\232\351\207\215\350\203\214\345\214\205.md" "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\244\232\351\207\215\350\203\214\345\214\205.md" index 85d4200bf9..39deb489a6 100644 --- "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\244\232\351\207\215\350\203\214\345\214\205.md" +++ "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\244\232\351\207\215\350\203\214\345\214\205.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" index f006c49f9c..d4e71b8992 100644 --- "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" +++ "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" @@ -1,6 +1,6 @@

- + # 动态规划:关于完全背包,你该了解这些! diff --git "a/problems/\350\264\252\345\277\203\347\256\227\346\263\225\346\200\273\347\273\223\347\257\207.md" "b/problems/\350\264\252\345\277\203\347\256\227\346\263\225\346\200\273\347\273\223\347\257\207.md" index 1a7b91a63b..ba9f753d6d 100644 --- "a/problems/\350\264\252\345\277\203\347\256\227\346\263\225\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/\350\264\252\345\277\203\347\256\227\346\263\225\346\200\273\347\273\223\347\257\207.md" @@ -1,6 +1,6 @@

- + 我刚刚开始讲解贪心系列的时候就说了,贪心系列并不打算严格的从简单到困难这么个顺序来讲解。 diff --git "a/problems/\350\264\252\345\277\203\347\256\227\346\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\350\264\252\345\277\203\347\256\227\346\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md" index 98e9fa2cae..17fab5a97f 100644 --- "a/problems/\350\264\252\345\277\203\347\256\227\346\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\350\264\252\345\277\203\347\256\227\346\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/\351\223\276\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\351\223\276\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" index fc0f3c36ba..7e393ff25f 100644 --- "a/problems/\351\223\276\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\351\223\276\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -1,6 +1,6 @@

- + diff --git "a/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" "b/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" index 8d53bda62f..54742cb397 100644 --- "a/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" +++ "b/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" @@ -1,6 +1,6 @@

- + From d745cfbc942a14c511518b87d76bf8348207f8a2 Mon Sep 17 00:00:00 2001 From: youngyangyang04 <826123027@qq.com> Date: Thu, 11 Nov 2021 15:28:37 +0800 Subject: [PATCH 0039/3019] Update --- README.md | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 7d56f9d7b9..40b2785742 100644 --- a/README.md +++ b/README.md @@ -6,11 +6,9 @@ > 1. **介绍**:本项目是一套完整的刷题计划,旨在帮助大家少走弯路,循序渐进学算法,[关注作者](#关于作者) > 2. **PDF版本** : [「代码随想录」算法精讲 PDF 版本](https://mp.weixin.qq.com/s/NF7NqTD9DU505S6nvR_5Wg) 。 > 3. **刷题顺序** : README已经将刷题顺序排好了,按照顺序一道一道刷就可以。 -> 3. **学习社区** : 一起学习打卡/面试技巧/如何选择offer/大厂内推/职场规则/简历修改/技术分享/程序人生。欢迎加入[「代码随想录」知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) 。 -> 4. **提交代码**:本项目统一使用C++语言进行讲解,但已经有Java、Python、Go、JavaScript等等多语言版本,感谢[这里的每一位贡献者](https://github.com/youngyangyang04/leetcode-master/graphs/contributors),如果你也想贡献代码点亮你的头像,[点击这里](https://mp.weixin.qq.com/s/tqCxrMEU-ajQumL1i8im9A)了解提交代码的方式。 -> 5. **转载须知** :以下所有文章皆为我([程序员Carl](https://github.com/youngyangyang04))的原创。引用本项目文章请注明出处,发现恶意抄袭或搬运,会动用法律武器维护自己的权益。让我们一起维护一个良好的技术创作环境! - -

阿里云服务器,双11特价活动🔥🔥🔥🔥

+> 4. **学习社区** : 一起学习打卡/面试技巧/如何选择offer/大厂内推/职场规则/简历修改/技术分享/程序人生。欢迎加入[「代码随想录」知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) 。 +> 5. **提交代码**:本项目统一使用C++语言进行讲解,但已经有Java、Python、Go、JavaScript等等多语言版本,感谢[这里的每一位贡献者](https://github.com/youngyangyang04/leetcode-master/graphs/contributors),如果你也想贡献代码点亮你的头像,[点击这里](https://mp.weixin.qq.com/s/tqCxrMEU-ajQumL1i8im9A)了解提交代码的方式。 +> 6. **转载须知** :以下所有文章皆为我([程序员Carl](https://github.com/youngyangyang04))的原创。引用本项目文章请注明出处,发现恶意抄袭或搬运,会动用法律武器维护自己的权益。让我们一起维护一个良好的技术创作环境!

From 6d01869bbc4cdbd0034ffb1314556d9147caa132 Mon Sep 17 00:00:00 2001 From: ArthurP Date: Thu, 11 Nov 2021 22:09:25 +0000 Subject: [PATCH 0040/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200654.=E6=9C=80?= =?UTF-8?q?=E5=A4=A7=E4=BA=8C=E5=8F=89=E6=A0=91.md=20C=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 --- ...47\344\272\214\345\217\211\346\240\221.md" | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git "a/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" "b/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" index a4ae868af5..5f01286146 100644 --- "a/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" @@ -356,6 +356,35 @@ var constructMaximumBinaryTree = function (nums) { }; ``` +## C +```c +struct TreeNode* traversal(int* nums, int left, int right) { + //若左边界大于右边界,返回NULL + if(left >= right) + return NULL; + + //找出数组中最大数坐标 + int maxIndex = left; + int i; + for(i = left + 1; i < right; i++) { + if(nums[i] > nums[maxIndex]) + maxIndex = i; + } + + //开辟结点 + struct TreeNode* node = (struct TreeNode*)malloc(sizeof(struct TreeNode)); + //将结点的值设为最大数组数组元素 + node->val = nums[maxIndex]; + //递归定义左孩子结点和右孩子结点 + node->left = traversal(nums, left, maxIndex); + node->right = traversal(nums, maxIndex + 1, right); + return node; +} + +struct TreeNode* constructMaximumBinaryTree(int* nums, int numsSize){ + return traversal(nums, 0, numsSize); +} +``` ----------------------- From c249f3a0f1aff16db83a07322e0c2ef481f466fb Mon Sep 17 00:00:00 2001 From: ArthurP Date: Thu, 11 Nov 2021 22:32:25 +0000 Subject: [PATCH 0041/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200104.=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?.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 --- ...00\345\244\247\346\267\261\345\272\246.md" | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git "a/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" "b/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" index e20f147fe7..1c94994f79 100644 --- "a/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" +++ "b/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" @@ -582,6 +582,61 @@ var maxDepth = function(root) { }; ``` +## C +二叉树最大深度递归 +```c +int maxDepth(struct TreeNode* root){ + //若传入结点为NULL,返回0 + if(!root) + return 0; + + //求出左子树深度 + int left = maxDepth(root->left); + //求出右子树深度 + int right = maxDepth(root->right); + //求出左子树深度和右子树深度的较大值 + int max = left > right ? left : right; + //返回较大值+1(1为当前层数) + return max + 1; +} +``` +二叉树最大深度迭代 +```c +int maxDepth(struct TreeNode* root){ + //若传入根节点为NULL,返回0 + if(!root) + return 0; + + int depth = 0; + //开辟队列空间 + struct TreeNode** queue = (struct TreeNode**)malloc(sizeof(struct TreeNode*) * 6000); + int queueFront = 0; + int queueEnd = 0; + + //将根结点入队 + queue[queueEnd++] = root; + + int queueSize; + //求出当前队列中元素个数 + while(queueSize = queueEnd - queueFront) { + int i; + //若当前队列中结点有左右子树,则将它们的左右子树入队 + for(i = 0; i < queueSize; i++) { + struct TreeNode* tempNode = queue[queueFront + i]; + if(tempNode->left) + queue[queueEnd++] = tempNode->left; + if(tempNode->right) + queue[queueEnd++] = tempNode->right; + } + //更新队头下标 + queueFront += queueSize; + //深度+1 + depth++; + } + return depth; +} +``` + ----------------------- * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) From 0c4aed8cf112e7ef04062dada0a531661e920502 Mon Sep 17 00:00:00 2001 From: youngyangyang04 <826123027@qq.com> Date: Sat, 13 Nov 2021 17:20:16 +0800 Subject: [PATCH 0042/3019] Update --- ...45\244\247\345\255\220\345\272\217\345\222\214.md" | 11 ++++++----- ...46\240\221\346\200\273\347\273\223\347\257\207.md" | 2 ++ ...45\233\236\346\272\257\346\200\273\347\273\223.md" | 1 + ...46\263\225\346\200\273\347\273\223\347\257\207.md" | 2 +- 4 files changed, 10 insertions(+), 6 deletions(-) diff --git "a/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" "b/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" index 0037229ae2..4502d9a1bf 100644 --- "a/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" +++ "b/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" @@ -4,7 +4,7 @@ -## 53. 最大子序和 +# 53. 最大子序和 [力扣题目链接](https://leetcode-cn.com/problems/maximum-subarray/) @@ -137,7 +137,7 @@ public: ## 其他语言版本 -Java: +### Java ```java class Solution { public int maxSubArray(int[] nums) { @@ -177,7 +177,7 @@ class Solution { } ``` -Python: +### Python ```python class Solution: def maxSubArray(self, nums: List[int]) -> int: @@ -192,7 +192,7 @@ class Solution: return result ``` -Go: +### Go ```go func maxSubArray(nums []int) int { @@ -208,7 +208,8 @@ func maxSubArray(nums []int) int { return maxSum } ``` -Javascript: + +### Javascript: ```Javascript var maxSubArray = function(nums) { let result = -Infinity diff --git "a/problems/\344\272\214\345\217\211\346\240\221\346\200\273\347\273\223\347\257\207.md" "b/problems/\344\272\214\345\217\211\346\240\221\346\200\273\347\273\223\347\257\207.md" index 9e25302fec..5d3a74f320 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\346\200\273\347\273\223\347\257\207.md" @@ -151,6 +151,8 @@ ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211030125421.png) +这个图是 [代码随想录知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) 成员:[青](https://wx.zsxq.com/dweb2/index/footprint/185251215558842),所画,总结的非常好,分享给大家。 + **最后,二叉树系列就这么完美结束了,估计这应该是最长的系列了,感谢大家33天的坚持与陪伴,接下来我们又要开始新的系列了「回溯算法」!** diff --git "a/problems/\345\233\236\346\272\257\346\200\273\347\273\223.md" "b/problems/\345\233\236\346\272\257\346\200\273\347\273\223.md" index 403ec7e725..8f4cba198d 100644 --- "a/problems/\345\233\236\346\272\257\346\200\273\347\273\223.md" +++ "b/problems/\345\233\236\346\272\257\346\200\273\347\273\223.md" @@ -431,6 +431,7 @@ N皇后问题分析: ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211030124742.png) +这个图是 [代码随想录知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) 成员:[莫非毛](https://wx.zsxq.com/dweb2/index/footprint/828844212542),所画,总结的非常好,分享给大家。 **回溯算法系列正式结束,新的系列终将开始,录友们准备开启新的征程!** diff --git "a/problems/\350\264\252\345\277\203\347\256\227\346\263\225\346\200\273\347\273\223\347\257\207.md" "b/problems/\350\264\252\345\277\203\347\256\227\346\263\225\346\200\273\347\273\223\347\257\207.md" index ba9f753d6d..6476b9eed7 100644 --- "a/problems/\350\264\252\345\277\203\347\256\227\346\263\225\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/\350\264\252\345\277\203\347\256\227\346\263\225\346\200\273\347\273\223\347\257\207.md" @@ -128,7 +128,7 @@ Carl个人认为:如果找出局部最优并可以推出全局最优,就是 ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211110121605.png) - +这个图是 [代码随想录知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) 成员:[青](https://wx.zsxq.com/dweb2/index/footprint/185251215558842)所画,总结的非常好,分享给大家。 很多没有接触过贪心的同学都会感觉贪心有啥可学的,但只要跟着「代码随想录」坚持下来之后,就会发现,贪心是一种很重要的算法思维而且并不简单,贪心往往妙的出其不意,触不及防! From 6ea7ce9cd89bba28d5512f6df6dd790f78be5314 Mon Sep 17 00:00:00 2001 From: qq240814476 <240814476@qq.com> Date: Sat, 13 Nov 2021 17:43:05 +0800 Subject: [PATCH 0043/3019] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=2047=20?= =?UTF-8?q?=E5=85=A8=E6=8E=92=E5=88=97=20=E7=9A=84=E6=8B=BC=E5=86=99?= =?UTF-8?q?=E9=94=99=E8=AF=AF=20typo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "problems/0047.\345\205\250\346\216\222\345\210\227II.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0047.\345\205\250\346\216\222\345\210\227II.md" "b/problems/0047.\345\205\250\346\216\222\345\210\227II.md" index b910583388..c169d91314 100644 --- "a/problems/0047.\345\205\250\346\216\222\345\210\227II.md" +++ "b/problems/0047.\345\205\250\346\216\222\345\210\227II.md" @@ -38,7 +38,7 @@ 那么排列问题其实也是一样的套路。 -**还要强调的是去重一定要对元素经行排序,这样我们才方便通过相邻的节点来判断是否重复使用了**。 +**还要强调的是去重一定要对元素进行排序,这样我们才方便通过相邻的节点来判断是否重复使用了**。 我以示例中的 [1,1,2]为例 (为了方便举例,已经排序)抽象为一棵树,去重过程如图: From c46acca1e4ceaddbda6b4975afe0c4d061ab11fc Mon Sep 17 00:00:00 2001 From: ArthurP Date: Sun, 14 Nov 2021 10:05:29 +0000 Subject: [PATCH 0044/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=201047.=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E5=AD=97=E7=AC=A6=E4=B8=B2=E4=B8=AD=E7=9A=84=E6=89=80?= =?UTF-8?q?=E6=9C=89=E7=9B=B8=E9=82=BB=E9=87=8D=E5=A4=8D=E9=A1=B9.md=20C?= =?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 --- ...73\351\207\215\345\244\215\351\241\271.md" | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git "a/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" "b/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" index f70f39f3d4..ef93ced815 100644 --- "a/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" +++ "b/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" @@ -269,6 +269,57 @@ var removeDuplicates = function(s) { }; ``` +C: +方法一:使用栈 +```c +char * removeDuplicates(char * s){ + //求出字符串长度 + int strLength = strlen(s); + //开辟栈空间。栈空间长度应为字符串长度+1(为了存放字符串结束标志'\0') + char* stack = (char*)malloc(sizeof(char) * strLength + 1); + int stackTop = 0; + + int index = 0; + //遍历整个字符串 + while(index < strLength) { + //取出当前index对应字母,之后index+1 + char letter = s[index++]; + //若栈中有元素,且栈顶字母等于当前字母(两字母相邻)。将栈顶元素弹出 + if(stackTop > 0 && letter == stack[stackTop - 1]) + stackTop--; + //否则将字母入栈 + else + stack[stackTop++] = letter; + } + //存放字符串结束标志'\0' + stack[stackTop] = '\0'; + //返回栈本身作为字符串 + return stack; +} +``` +方法二:双指针法 +```c +char * removeDuplicates(char * s){ + //创建快慢指针 + int fast = 0; + int slow = 0; + //求出字符串长度 + int strLength = strlen(s); + //遍历字符串 + while(fast < strLength) { + //将当前slow指向字符改为fast指向字符。fast指针+1 + char letter = s[slow] = s[fast++]; + //若慢指针大于0,且慢指针指向元素等于字符串中前一位元素,删除慢指针指向当前元素 + if(slow > 0 && letter == s[slow - 1]) + slow--; + else + slow++; + } + //在字符串结束加入字符串结束标志'\0' + s[slow] = 0; + return s; +} +``` ----------------------- From 0a31eaa9d3790f86d9be2c7ad9dde601a2d2b67f Mon Sep 17 00:00:00 2001 From: ccqstark <54167233+ccqstark@users.noreply.github.com> Date: Tue, 16 Nov 2021 11:52:38 +0800 Subject: [PATCH 0045/3019] =?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 更正一个小错误 --- ...\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0669.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0669.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" index 98fb9dd0fc..995db555c2 100644 --- "a/problems/0669.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" +++ "b/problems/0669.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" @@ -138,7 +138,7 @@ if (root->val < low) { root->left = trimBST(root->left, low, high); ``` -此时节点3的右孩子就变成了节点2,将节点0从二叉树中移除了。 +此时节点3的左孩子就变成了节点2,将节点0从二叉树中移除了。 最后整体代码如下: From 0833024aa3f850d4128c46b3dc919f398b444a1e Mon Sep 17 00:00:00 2001 From: youngyangyang04 <826123027@qq.com> Date: Sun, 21 Nov 2021 15:47:10 +0800 Subject: [PATCH 0046/3019] Update --- ...\344\275\263\346\227\266\346\234\272II.md" | 36 +++++++++---------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" index 88d4654a03..44157bac92 100644 --- "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" +++ "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" @@ -4,7 +4,7 @@ -## 122.买卖股票的最佳时机II +# 122.买卖股票的最佳时机II [力扣题目链接](https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-ii/) @@ -16,19 +16,19 @@ 示例 1: -输入: [7,1,5,3,6,4] -输出: 7 -解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4。随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6-3 = 3 。 +* 输入: [7,1,5,3,6,4] +* 输出: 7 +* 解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4。随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6-3 = 3 。 示例 2: -输入: [1,2,3,4,5] -输出: 4 -解释: 在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。注意你不能在第 1 天和第 2 天接连购买股票,之后再将它们卖出。因为这样属于同时参与了多笔交易,你必须在再次购买前出售掉之前的股票。 +* 输入: [1,2,3,4,5] +* 输出: 4 +* 解释: 在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。注意你不能在第 1 天和第 2 天接连购买股票,之后再将它们卖出。因为这样属于同时参与了多笔交易,你必须在再次购买前出售掉之前的股票。 示例 3: -输入: [7,6,4,3,1] -输出: 0 -解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。 +* 输入: [7,6,4,3,1] +* 输出: 0 +* 解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。 提示: * 1 <= prices.length <= 3 * 10 ^ 4 @@ -43,7 +43,7 @@ 想获得利润至少要两天为一个交易单元。 -## 贪心算法 +### 贪心算法 这道题目可能我们只会想,选一个低的买入,在选个高的卖,在选一个低的买入.....循环反复。 @@ -92,7 +92,7 @@ public: * 时间复杂度O(n) * 空间复杂度O(1) -## 动态规划 +### 动态规划 动态规划将在下一个系列详细讲解,本题解先给出我的C++代码(带详细注释),感兴趣的同学可以自己先学习一下。 @@ -128,9 +128,9 @@ public: 一旦想到这里了,很自然就会想到贪心了,即:只收集每天的正利润,最后稳稳的就是最大利润了。 -# 其他语言版本 +## 其他语言版本 -## Java +### Java ```java // 贪心思路 @@ -168,7 +168,7 @@ class Solution { // 动态规划 -## Python +### Python ```python class Solution: def maxProfit(self, prices: List[int]) -> int: @@ -192,7 +192,7 @@ class Solution: return dp[-1][1] ``` -## Go +### Go ```golang //贪心算法 func maxProfit(prices []int) int { @@ -228,7 +228,7 @@ func maxProfit(prices []int) int { } ``` -## Javascript +### Javascript 贪心 ```Javascript var maxProfit = function(prices) { @@ -264,7 +264,7 @@ const maxProfit = (prices) => { }; ``` -## C +### C ```c int maxProfit(int* prices, int pricesSize){ int result = 0; From e836f07ac69738301e13d6c626dc2f23e159deea Mon Sep 17 00:00:00 2001 From: youngyangyang04 <826123027@qq.com> Date: Sun, 21 Nov 2021 15:56:19 +0800 Subject: [PATCH 0047/3019] Update --- ...\350\267\203\346\270\270\346\210\217II.md" | 16 +++++------ ...63\350\267\203\346\270\270\346\210\217.md" | 22 +++++++-------- ...04\346\225\260\347\273\204\345\222\214.md" | 28 +++++++++---------- 3 files changed, 33 insertions(+), 33 deletions(-) diff --git "a/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" "b/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" index bd15ef85a9..b24abd4377 100644 --- "a/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" +++ "b/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" @@ -6,7 +6,7 @@ > 相对于[贪心算法:跳跃游戏](https://mp.weixin.qq.com/s/606_N9j8ACKCODoCbV1lSA)难了不少,做好心里准备! -## 45.跳跃游戏II +# 45.跳跃游戏II [力扣题目链接](https://leetcode-cn.com/problems/jump-game-ii/) @@ -17,9 +17,9 @@ 你的目标是使用最少的跳跃次数到达数组的最后一个位置。 示例: -输入: [2,3,1,1,4] -输出: 2 -解释: 跳到最后一个位置的最小跳跃数是 2。从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。 +* 输入: [2,3,1,1,4] +* 输出: 2 +* 解释: 跳到最后一个位置的最小跳跃数是 2。从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。 说明: 假设你总是可以到达数组的最后一个位置。 @@ -139,7 +139,7 @@ public: ## 其他语言版本 -Java: +### Java ```Java class Solution { public int jump(int[] nums) { @@ -171,7 +171,7 @@ class Solution { } ``` -Python: +### Python ```python class Solution: def jump(self, nums: List[int]) -> int: @@ -189,7 +189,7 @@ class Solution: return ans ``` -Go: +### Go ```Go func jump(nums []int) int { dp:=make([]int ,len(nums)) @@ -207,7 +207,7 @@ func jump(nums []int) int { } ``` -Javascript: +### Javascript ```Javascript var jump = function(nums) { let curIndex = 0 diff --git "a/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" "b/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" index 66d672d999..70a152fca9 100644 --- "a/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" +++ "b/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" @@ -4,7 +4,7 @@ -## 55. 跳跃游戏 +# 55. 跳跃游戏 [力扣题目链接](https://leetcode-cn.com/problems/jump-game/) @@ -15,14 +15,14 @@ 判断你是否能够到达最后一个位置。 示例 1: -输入: [2,3,1,1,4] -输出: true -解释: 我们可以先跳 1 步,从位置 0 到达 位置 1, 然后再从位置 1 跳 3 步到达最后一个位置。 +* 输入: [2,3,1,1,4] +* 输出: true +* 解释: 我们可以先跳 1 步,从位置 0 到达 位置 1, 然后再从位置 1 跳 3 步到达最后一个位置。 示例 2: -输入: [3,2,1,0,4] -输出: false -解释: 无论怎样,你总会到达索引为 3 的位置。但该位置的最大跳跃长度是 0 , 所以你永远不可能到达最后一个位置。 +* 输入: [3,2,1,0,4] +* 输出: false +* 解释: 无论怎样,你总会到达索引为 3 的位置。但该位置的最大跳跃长度是 0 , 所以你永远不可能到达最后一个位置。 ## 思路 @@ -82,7 +82,7 @@ public: ## 其他语言版本 -Java: +### Java ```Java class Solution { public boolean canJump(int[] nums) { @@ -103,7 +103,7 @@ class Solution { } ``` -Python: +### Python ```python class Solution: def canJump(self, nums: List[int]) -> bool: @@ -118,7 +118,7 @@ class Solution: return False ``` -Go: +### Go ```Go func canJUmp(nums []int) bool { if len(nums)<=1{ @@ -138,7 +138,7 @@ func canJUmp(nums []int) bool { } ``` -Javascript: +### Javascript ```Javascript var canJump = function(nums) { if(nums.length === 1) return true diff --git "a/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" "b/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" index 2a98f29eb5..56407e46fc 100644 --- "a/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" +++ "b/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" @@ -4,7 +4,7 @@ -## 1005.K次取反后最大化的数组和 +# 1005.K次取反后最大化的数组和 [力扣题目链接](https://leetcode-cn.com/problems/maximize-sum-of-array-after-k-negations/) @@ -13,19 +13,19 @@ 以这种方式修改数组后,返回数组可能的最大和。 示例 1: -输入:A = [4,2,3], K = 1 -输出:5 -解释:选择索引 (1,) ,然后 A 变为 [4,-2,3]。 +* 输入:A = [4,2,3], K = 1 +* 输出:5 +* 解释:选择索引 (1,) ,然后 A 变为 [4,-2,3]。 示例 2: -输入:A = [3,-1,0,2], K = 3 -输出:6 -解释:选择索引 (1, 2, 2) ,然后 A 变为 [3,1,0,2]。 +* 输入:A = [3,-1,0,2], K = 3 +* 输出:6 +* 解释:选择索引 (1, 2, 2) ,然后 A 变为 [3,1,0,2]。 示例 3: -输入:A = [2,-3,-1,5,-4], K = 2 -输出:13 -解释:选择索引 (1, 4) ,然后 A 变为 [2,3,-1,5,4]。 +* 输入:A = [2,-3,-1,5,-4], K = 2 +* 输出:13 +* 解释:选择索引 (1, 4) ,然后 A 变为 [2,3,-1,5,4]。 提示: @@ -95,7 +95,7 @@ public: ## 其他语言版本 -Java: +### Java ```java class Solution { public int largestSumAfterKNegations(int[] nums, int K) { @@ -145,7 +145,7 @@ class Solution { } ``` -Python: +### Python ```python class Solution: def largestSumAfterKNegations(self, A: List[int], K: int) -> int: @@ -159,7 +159,7 @@ class Solution: return sum(A) ``` -Go: +### Go ```Go func largestSumAfterKNegations(nums []int, K int) int { sort.Slice(nums, func(i, j int) bool { @@ -186,7 +186,7 @@ func largestSumAfterKNegations(nums []int, K int) int { ``` -Javascript: +### Javascript ```Javascript var largestSumAfterKNegations = function(nums, k) { nums.sort((a, b) => { From 39fbb593466ce11be6e8d258205d6d8a5b177500 Mon Sep 17 00:00:00 2001 From: youngyangyang04 <826123027@qq.com> Date: Sun, 21 Nov 2021 16:19:58 +0800 Subject: [PATCH 0048/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=A4=B4=E9=83=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...344\270\244\346\225\260\344\271\213\345\222\214.md" | 10 ++++------ ...345\233\236\346\226\207\345\255\220\344\270\262.md" | 10 ++++------ ...344\270\211\346\225\260\344\271\213\345\222\214.md" | 10 ++++------ ...345\255\227\346\257\215\347\273\204\345\220\210.md" | 10 ++++------ ...345\233\233\346\225\260\344\271\213\345\222\214.md" | 10 ++++------ ...47\254\254N\344\270\252\350\212\202\347\202\271.md" | 10 ++++------ ...346\225\210\347\232\204\346\213\254\345\217\267.md" | 10 ++++------ ...344\270\255\347\232\204\350\212\202\347\202\271.md" | 10 ++++------ ...347\247\273\351\231\244\345\205\203\347\264\240.md" | 10 ++++------ "problems/0028.\345\256\236\347\216\260strStr.md" | 10 ++++------ ...344\270\200\344\270\252\346\216\222\345\210\227.md" | 10 ++++------ ...344\270\200\344\270\252\344\275\215\347\275\256.md" | 10 ++++------ ...346\217\222\345\205\245\344\275\215\347\275\256.md" | 10 ++++------ .../0037.\350\247\243\346\225\260\347\213\254.md" | 10 ++++------ ...347\273\204\345\220\210\346\200\273\345\222\214.md" | 10 ++++------ ...7\273\204\345\220\210\346\200\273\345\222\214II.md" | 10 ++++------ .../0042.\346\216\245\351\233\250\346\260\264.md" | 10 ++++------ ...0\267\263\350\267\203\346\270\270\346\210\217II.md" | 10 ++++------ .../0046.\345\205\250\346\216\222\345\210\227.md" | 10 ++++------ .../0047.\345\205\250\346\216\222\345\210\227II.md" | 10 ++++------ "problems/0051.N\347\232\207\345\220\216.md" | 10 ++++------ "problems/0052.N\347\232\207\345\220\216II.md" | 10 ++++------ ...345\244\247\345\255\220\345\272\217\345\222\214.md" | 10 ++++------ ...346\200\201\350\247\204\345\210\222\357\274\211.md" | 10 ++++------ ...350\267\263\350\267\203\346\270\270\346\210\217.md" | 10 ++++------ ...345\220\210\345\271\266\345\214\272\351\227\264.md" | 10 ++++------ ...0\236\272\346\227\213\347\237\251\351\230\265II.md" | 10 ++++------ ...344\270\215\345\220\214\350\267\257\345\276\204.md" | 10 ++++------ ...4\270\215\345\220\214\350\267\257\345\276\204II.md" | 10 ++++------ .../0070.\347\210\254\346\245\274\346\242\257.md" | 10 ++++------ ...350\203\214\345\214\205\347\211\210\346\234\254.md" | 10 ++++------ ...347\274\226\350\276\221\350\267\235\347\246\273.md" | 10 ++++------ "problems/0077.\347\273\204\345\220\210.md" | 10 ++++------ ...347\273\204\345\220\210\344\274\230\345\214\226.md" | 10 ++++------ "problems/0078.\345\255\220\351\233\206.md" | 10 ++++------ ...345\244\247\347\232\204\347\237\251\345\275\242.md" | 10 ++++------ "problems/0090.\345\255\220\351\233\206II.md" | 10 ++++------ ...5\244\215\345\216\237IP\345\234\260\345\235\200.md" | 10 ++++------ ...345\217\211\346\220\234\347\264\242\346\240\221.md" | 10 ++++------ ...345\217\211\346\220\234\347\264\242\346\240\221.md" | 10 ++++------ ...347\233\270\345\220\214\347\232\204\346\240\221.md" | 10 ++++------ ...347\247\260\344\272\214\345\217\211\346\240\221.md" | 10 ++++------ ...345\261\202\345\272\217\351\201\215\345\216\206.md" | 10 ++++------ ...346\234\200\345\244\247\346\267\261\345\272\246.md" | 10 ++++------ ...351\200\240\344\272\214\345\217\211\346\240\221.md" | 10 ++++------ ...345\217\211\346\220\234\347\264\242\346\240\221.md" | 10 ++++------ ...350\241\241\344\272\214\345\217\211\346\240\221.md" | 10 ++++------ ...346\234\200\345\260\217\346\267\261\345\272\246.md" | 10 ++++------ ...350\267\257\345\276\204\346\200\273\345\222\214.md" | 10 ++++------ ...347\232\204\345\255\220\345\272\217\345\210\227.md" | 10 ++++------ ...350\212\202\347\202\271\346\214\207\351\222\210.md" | 10 ++++------ ...346\234\200\344\275\263\346\227\266\346\234\272.md" | 10 ++++------ ...6\234\200\344\275\263\346\227\266\346\234\272II.md" | 10 ++++------ ...346\200\201\350\247\204\345\210\222\357\274\211.md" | 10 ++++------ ...\234\200\344\275\263\346\227\266\346\234\272III.md" | 10 ++++------ ...345\215\225\350\257\215\346\216\245\351\276\231.md" | 10 ++++------ ...346\225\260\345\255\227\344\271\213\345\222\214.md" | 10 ++++------ ...345\211\262\345\233\236\346\226\207\344\270\262.md" | 10 ++++------ ...5\211\262\345\233\236\346\226\207\344\270\262II.md" | 10 ++++------ .../0134.\345\212\240\346\262\271\347\253\231.md" | 10 ++++------ ...345\210\206\345\217\221\347\263\226\346\236\234.md" | 10 ++++------ ...345\215\225\350\257\215\346\213\206\345\210\206.md" | 10 ++++------ ...347\216\257\345\275\242\351\223\276\350\241\250.md" | 10 ++++------ ...7\216\257\345\275\242\351\223\276\350\241\250II.md" | 10 ++++------ ...351\207\215\346\216\222\351\223\276\350\241\250.md" | 10 ++++------ ...350\276\276\345\274\217\346\261\202\345\200\274.md" | 10 ++++------ ...351\207\214\347\232\204\345\215\225\350\257\215.md" | 10 ++++------ ...347\233\270\344\272\244\351\223\276\350\241\250.md" | 10 ++++------ ...6\234\200\344\275\263\346\227\266\346\234\272IV.md" | 10 ++++------ ...346\227\213\350\275\254\346\225\260\347\273\204.md" | 10 ++++------ ...346\211\223\345\256\266\345\212\253\350\210\215.md" | 10 ++++------ .../0202.\345\277\253\344\271\220\346\225\260.md" | 10 ++++------ ...351\223\276\350\241\250\345\205\203\347\264\240.md" | 10 ++++------ ...346\236\204\345\255\227\347\254\246\344\270\262.md" | 10 ++++------ ...347\277\273\350\275\254\351\223\276\350\241\250.md" | 10 ++++------ ...347\232\204\345\255\220\346\225\260\347\273\204.md" | 10 ++++------ ...6\211\223\345\256\266\345\212\253\350\210\215II.md" | 10 ++++------ ...\273\204\345\220\210\346\200\273\345\222\214III.md" | 10 ++++------ ...350\212\202\347\202\271\344\270\252\346\225\260.md" | 10 ++++------ ...345\210\227\345\256\236\347\216\260\346\240\210.md" | 10 ++++------ ...350\275\254\344\272\214\345\217\211\346\240\221.md" | 10 ++++------ ...345\256\236\347\216\260\351\230\237\345\210\227.md" | 10 ++++------ ...345\233\236\346\226\207\351\223\276\350\241\250.md" | 10 ++++------ ...345\205\254\345\205\261\347\245\226\345\205\210.md" | 10 ++++------ ...345\205\254\345\205\261\347\245\226\345\205\210.md" | 10 ++++------ ...345\217\243\346\234\200\345\244\247\345\200\274.md" | 10 ++++------ ...346\257\215\345\274\202\344\275\215\350\257\215.md" | 10 ++++------ ...346\211\200\346\234\211\350\267\257\345\276\204.md" | 10 ++++------ ...345\205\250\345\271\263\346\226\271\346\225\260.md" | 10 ++++------ .../0283.\347\247\273\345\212\250\351\233\266.md" | 10 ++++------ ...345\215\207\345\255\220\345\272\217\345\210\227.md" | 10 ++++------ ...345\220\253\345\206\267\345\206\273\346\234\237.md" | 10 ++++------ ...351\233\266\351\222\261\345\205\221\346\215\242.md" | 10 ++++------ ...345\256\211\346\216\222\350\241\214\347\250\213.md" | 10 ++++------ ...\211\223\345\256\266\345\212\253\350\210\215III.md" | 10 ++++------ ...346\225\264\346\225\260\346\213\206\345\210\206.md" | 10 ++++------ ...350\275\254\345\255\227\347\254\246\344\270\262.md" | 10 ++++------ ...351\253\230\351\242\221\345\205\203\347\264\240.md" | 10 ++++------ ...347\273\204\347\232\204\344\272\244\351\233\206.md" | 10 ++++------ ...346\221\206\345\212\250\345\272\217\345\210\227.md" | 10 ++++------ ...345\220\210\346\200\273\345\222\214\342\205\243.md" | 10 ++++------ .../0383.\350\265\216\351\207\221\344\277\241.md" | 10 ++++------ ...346\226\255\345\255\220\345\272\217\345\210\227.md" | 10 ++++------ ...345\217\266\345\255\220\344\271\213\345\222\214.md" | 10 ++++------ ...351\207\215\345\273\272\351\230\237\345\210\227.md" | 10 ++++------ ...347\255\211\345\222\214\345\255\220\351\233\206.md" | 10 ++++------ ...351\207\215\345\217\240\345\214\272\351\227\264.md" | 10 ++++------ ...344\270\255\347\232\204\350\212\202\347\202\271.md" | 10 ++++------ ...345\274\225\347\210\206\346\260\224\347\220\203.md" | 10 ++++------ ...5\233\233\346\225\260\347\233\270\345\212\240II.md" | 10 ++++------ ...345\210\206\345\217\221\351\245\274\345\271\262.md" | 10 ++++------ ...345\255\220\345\255\227\347\254\246\344\270\262.md" | 10 ++++------ ...345\261\277\347\232\204\345\221\250\351\225\277.md" | 10 ++++------ .../0474.\344\270\200\345\222\214\351\233\266.md" | 10 ++++------ ...345\242\236\345\255\220\345\272\217\345\210\227.md" | 10 ++++------ .../0494.\347\233\256\346\240\207\345\222\214.md" | 10 ++++------ ...46\233\264\345\244\247\345\205\203\347\264\240I.md" | 10 ++++------ ...344\270\255\347\232\204\344\274\227\346\225\260.md" | 10 ++++------ ...6\233\264\345\244\247\345\205\203\347\264\240II.md" | 10 ++++------ ...346\263\242\351\202\243\345\245\221\346\225\260.md" | 10 ++++------ ...344\270\213\350\247\222\347\232\204\345\200\274.md" | 10 ++++------ ...346\226\207\345\255\220\345\272\217\345\210\227.md" | 10 ++++------ ...1\233\266\351\222\261\345\205\221\346\215\242II.md" | 10 ++++------ ...345\260\217\347\273\235\345\257\271\345\267\256.md" | 10 ++++------ ...344\270\272\347\264\257\345\212\240\346\240\221.md" | 10 ++++------ ...0\275\254\345\255\227\347\254\246\344\270\262II.md" | 10 ++++------ ...345\210\240\351\231\244\346\223\215\344\275\234.md" | 10 ++++------ ...345\271\266\344\272\214\345\217\211\346\240\221.md" | 10 ++++------ ...345\233\236\346\226\207\345\255\220\344\270\262.md" | 10 ++++------ .../0649.Dota2\345\217\202\350\256\256\351\231\242.md" | 10 ++++------ ...345\244\247\344\272\214\345\217\211\346\240\221.md" | 10 ++++------ ...350\277\224\345\233\236\345\216\237\347\202\271.md" | 10 ++++------ ...345\217\211\346\220\234\347\264\242\346\240\221.md" | 10 ++++------ ...345\210\227\347\232\204\344\270\252\346\225\260.md" | 10 ++++------ ...351\200\222\345\242\236\345\272\217\345\210\227.md" | 10 ++++------ ...345\206\227\344\275\231\350\277\236\346\216\245.md" | 10 ++++------ ...5\206\227\344\275\231\350\277\236\346\216\245II.md" | 10 ++++------ ...344\270\255\347\232\204\346\220\234\347\264\242.md" | 10 ++++------ ...346\217\222\345\205\245\346\223\215\344\275\234.md" | 10 ++++------ ...344\272\214\345\210\206\346\237\245\346\211\276.md" | 10 ++++------ ...350\256\276\350\256\241\351\223\276\350\241\250.md" | 10 ++++------ ...345\220\253\346\211\213\347\273\255\350\264\271.md" | 10 ++++------ ...346\200\201\350\247\204\345\210\222\357\274\211.md" | 10 ++++------ ...345\244\215\345\255\220\346\225\260\347\273\204.md" | 10 ++++------ ...344\270\255\345\277\203\347\264\242\345\274\225.md" | 10 ++++------ ...345\242\236\347\232\204\346\225\260\345\255\227.md" | 10 ++++------ ...346\257\217\346\227\245\346\270\251\345\272\246.md" | 10 ++++------ ...350\264\271\347\210\254\346\245\274\346\242\257.md" | 10 ++++------ ...345\255\227\346\257\215\345\214\272\351\227\264.md" | 10 ++++------ ...345\214\231\345\222\214\346\210\277\351\227\264.md" | 10 ++++------ ...347\232\204\345\255\227\347\254\246\344\270\262.md" | 10 ++++------ ...346\252\254\346\260\264\346\211\276\351\233\266.md" | 10 ++++------ ...6\216\222\345\272\217\346\225\260\347\273\204II.md" | 10 ++++------ ...351\225\277\346\214\211\351\224\256\345\205\245.md" | 10 ++++------ ...345\261\261\350\204\211\346\225\260\347\273\204.md" | 10 ++++------ ...346\216\247\344\272\214\345\217\211\346\240\221.md" | 10 ++++------ ...347\273\204\347\232\204\345\271\263\346\226\271.md" | 10 ++++------ ...345\270\270\347\224\250\345\255\227\347\254\246.md" | 10 ++++------ ...347\232\204\346\225\260\347\273\204\345\222\214.md" | 10 ++++------ ...347\233\270\344\272\244\347\232\204\347\272\277.md" | 10 ++++------ ...351\202\273\351\207\215\345\244\215\351\241\271.md" | 10 ++++------ ...5\244\264\347\232\204\351\207\215\351\207\217II.md" | 10 ++++------ ...345\205\261\345\255\220\345\272\217\345\210\227.md" | 10 ++++------ ...345\207\272\347\216\260\346\254\241\346\225\260.md" | 10 ++++------ ...350\241\241\345\255\227\347\254\246\344\270\262.md" | 10 ++++------ ...346\225\260\347\233\256\346\216\222\345\272\217.md" | 10 ++++------ ...345\255\227\347\232\204\346\225\260\345\255\227.md" | 10 ++++------ ...346\240\221\345\217\230\345\271\263\350\241\241.md" | 10 ++++------ ...346\230\257\345\244\232\345\244\247\357\274\237.md" | 10 ++++------ ...344\270\211\346\255\245\351\223\272\345\236\253.md" | 10 ++++------ ...345\270\246\347\235\200\345\233\236\346\272\257.md" | 10 ++++------ ...346\240\221\346\200\273\347\273\223\347\257\207.md" | 10 ++++------ ...347\220\206\350\256\272\345\237\272\347\241\200.md" | 10 ++++------ ...344\270\200\350\277\255\344\273\243\346\263\225.md" | 10 ++++------ ...350\277\255\344\273\243\351\201\215\345\216\206.md" | 10 ++++------ ...351\200\222\345\275\222\351\201\215\345\216\206.md" | 10 ++++------ ...345\234\250\350\277\231\351\207\214\357\274\201.md" | 10 ++++------ ...346\233\277\346\215\242\347\251\272\346\240\274.md" | 10 ++++------ ...350\275\254\345\255\227\347\254\246\344\270\262.md" | 10 ++++------ ...351\242\230\346\200\273\347\273\223\347\257\207.md" | 10 ++++------ ...345\210\222\346\200\273\347\273\223\347\257\207.md" | 10 ++++------ ...347\220\206\350\256\272\345\237\272\347\241\200.md" | 10 ++++------ ...346\214\207\351\222\210\346\200\273\347\273\223.md" | 10 ++++------ ...345\270\214\350\241\250\346\200\273\347\273\223.md" | 10 ++++------ ...347\220\206\350\256\272\345\237\272\347\241\200.md" | 10 ++++------ ...345\233\236\346\272\257\346\200\273\347\273\223.md" | 10 ++++------ ...344\270\200\347\247\215\345\206\231\346\263\225.md" | 10 ++++------ ...347\220\206\350\256\272\345\237\272\347\241\200.md" | 10 ++++------ ...347\254\246\344\270\262\346\200\273\347\273\223.md" | 10 ++++------ ...347\273\204\346\200\273\347\273\223\347\257\207.md" | 10 ++++------ ...347\220\206\350\256\272\345\237\272\347\241\200.md" | 10 ++++------ ...351\230\237\345\210\227\346\200\273\347\273\223.md" | 10 ++++------ ...347\220\206\350\256\272\345\237\272\347\241\200.md" | 10 ++++------ ...347\220\206\350\256\262\350\247\243\357\274\211.md" | 10 ++++------ ...347\256\227\346\263\225\346\250\241\346\235\277.md" | 10 ++++------ ...345\214\205\346\200\273\347\273\223\347\257\207.md" | 10 ++++------ ...237\272\347\241\20001\350\203\214\345\214\205-1.md" | 10 ++++------ ...237\272\347\241\20001\350\203\214\345\214\205-2.md" | 10 ++++------ ...345\244\232\351\207\215\350\203\214\345\214\205.md" | 10 ++++------ ...345\256\214\345\205\250\350\203\214\345\214\205.md" | 10 ++++------ ...346\263\225\346\200\273\347\273\223\347\257\207.md" | 10 ++++------ ...347\220\206\350\256\272\345\237\272\347\241\200.md" | 10 ++++------ ...350\241\250\346\200\273\347\273\223\347\257\207.md" | 10 ++++------ ...347\220\206\350\256\272\345\237\272\347\241\200.md" | 10 ++++------ ...351\223\276\350\241\250\347\233\270\344\272\244.md" | 10 ++++------ 205 files changed, 820 insertions(+), 1230 deletions(-) diff --git "a/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" "b/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" index 711b3c0d3e..4f9dbbadac 100644 --- "a/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" @@ -1,7 +1,8 @@

- - + + +

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

## 1. 两数之和 @@ -247,7 +248,4 @@ class Solution { ``` ----------------------- -

- - - +

diff --git "a/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" "b/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" index a49e55a708..30851a46f6 100644 --- "a/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" +++ "b/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" @@ -1,7 +1,8 @@

- - + + +

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

@@ -437,7 +438,4 @@ var longestPalindrome = function(s) { ----------------------- -

- - - +

diff --git "a/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" "b/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" index 57bb4c3766..dec8a7c681 100644 --- "a/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" @@ -1,7 +1,8 @@

- - + + +

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

@@ -435,7 +436,4 @@ func threeSum(_ nums: [Int]) -> [[Int]] { ``` ----------------------- -

- - - +

diff --git "a/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" "b/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" index 6e0cc244d8..0f99c87972 100644 --- "a/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" +++ "b/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" @@ -1,7 +1,8 @@

- - + + +

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

# 17.电话号码的字母组合 @@ -482,7 +483,4 @@ char ** letterCombinations(char * digits, int* returnSize){ ----------------------- -

- - - +

diff --git "a/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" "b/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" index abff3fe065..cf9ba9c10b 100644 --- "a/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" @@ -1,7 +1,8 @@

- - + + +

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

> 一样的道理,能解决四数之和 @@ -401,7 +402,4 @@ func fourSum(_ nums: [Int], _ target: Int) -> [[Int]] { ``` ----------------------- -

- - - +

diff --git "a/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" "b/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" index 4f91692288..e05b9d0324 100644 --- "a/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" +++ "b/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" @@ -1,7 +1,8 @@

- - + + +

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

@@ -227,7 +228,4 @@ func removeNthFromEnd(_ head: ListNode?, _ n: Int) -> ListNode? { ``` ----------------------- -

- - - +

diff --git "a/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" "b/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" index 5fd8b9572b..57aa5a01ec 100644 --- "a/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" +++ "b/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" @@ -1,7 +1,8 @@

- - + + +

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

@@ -284,7 +285,4 @@ var isValid = function(s) { ----------------------- -

- - - +

diff --git "a/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" "b/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" index 538c60a11c..4f1f79564d 100644 --- "a/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" +++ "b/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" @@ -1,7 +1,8 @@

- - + + +

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

## 24. 两两交换链表中的节点 @@ -277,7 +278,4 @@ func swapPairs(_ head: ListNode?) -> ListNode? { ----------------------- -

- - - +

diff --git "a/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" "b/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" index 1f098fa082..9e8e2c3367 100644 --- "a/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" +++ "b/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" @@ -1,7 +1,8 @@

- - + + +

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

## 27. 移除元素 @@ -284,7 +285,4 @@ int removeElement(int* nums, int numsSize, int val){ ``` ----------------------- -

- - - +

diff --git "a/problems/0028.\345\256\236\347\216\260strStr.md" "b/problems/0028.\345\256\236\347\216\260strStr.md" index 4b9263d85c..c70d522ebf 100644 --- "a/problems/0028.\345\256\236\347\216\260strStr.md" +++ "b/problems/0028.\345\256\236\347\216\260strStr.md" @@ -1,7 +1,8 @@

- - + + +

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

> 在一个串中查找是否出现过另一个串,这是KMP的看家本领。 @@ -896,7 +897,4 @@ var strStr = function (haystack, needle) { ----------------------- -

- - - +

diff --git "a/problems/0031.\344\270\213\344\270\200\344\270\252\346\216\222\345\210\227.md" "b/problems/0031.\344\270\213\344\270\200\344\270\252\346\216\222\345\210\227.md" index e0981b6132..3db099fef8 100644 --- "a/problems/0031.\344\270\213\344\270\200\344\270\252\346\216\222\345\210\227.md" +++ "b/problems/0031.\344\270\213\344\270\200\344\270\252\346\216\222\345\210\227.md" @@ -1,7 +1,8 @@

- - + + +

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

@@ -221,7 +222,4 @@ var nextPermutation = function(nums) { ----------------------- -

- - - +

diff --git "a/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" "b/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" index 72deaf866a..f39672533e 100644 --- "a/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" +++ "b/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" @@ -1,7 +1,8 @@

- - + + +

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

# 34. 在排序数组中查找元素的第一个和最后一个位置 @@ -437,7 +438,4 @@ var searchRange = function(nums, target) { ----------------------- -

- - - +

diff --git "a/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" "b/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" index 6e6756ecd7..0b902c5beb 100644 --- "a/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" +++ "b/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" @@ -1,7 +1,8 @@

- - + + +

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

@@ -319,7 +320,4 @@ func searchInsert(_ nums: [Int], _ target: Int) -> Int { ----------------------- -

- - - +

diff --git "a/problems/0037.\350\247\243\346\225\260\347\213\254.md" "b/problems/0037.\350\247\243\346\225\260\347\213\254.md" index 47008b490e..a580f27014 100644 --- "a/problems/0037.\350\247\243\346\225\260\347\213\254.md" +++ "b/problems/0037.\350\247\243\346\225\260\347\213\254.md" @@ -1,7 +1,8 @@

- - + + +

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

如果对回溯法理论还不清楚的同学,可以先看这个视频[视频来了!!带你学透回溯算法(理论篇)](https://mp.weixin.qq.com/s/wDd5azGIYWjbU0fdua_qBg) @@ -504,7 +505,4 @@ void solveSudoku(char** board, int boardSize, int* boardColSize) { ``` ----------------------- -

- - - +

diff --git "a/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" "b/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" index c622b97a80..c2c7530d20 100644 --- "a/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" +++ "b/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" @@ -1,7 +1,8 @@

- - + + +

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

# 39. 组合总和 @@ -447,7 +448,4 @@ int** combinationSum(int* candidates, int candidatesSize, int target, int* retur ``` ----------------------- -

- - - +

diff --git "a/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" "b/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" index 95f25bf0ca..bab4bd6a6d 100644 --- "a/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" +++ "b/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" @@ -1,7 +1,8 @@

- - + + +

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

> 这篇可以说是全网把组合问题如何去重,讲的最清晰的了! @@ -519,7 +520,4 @@ int** combinationSum2(int* candidates, int candidatesSize, int target, int* retu ``` ----------------------- -

- - - +

diff --git "a/problems/0042.\346\216\245\351\233\250\346\260\264.md" "b/problems/0042.\346\216\245\351\233\250\346\260\264.md" index 95ee75931c..5caddfaa6c 100644 --- "a/problems/0042.\346\216\245\351\233\250\346\260\264.md" +++ "b/problems/0042.\346\216\245\351\233\250\346\260\264.md" @@ -1,7 +1,8 @@

- - + + +

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

> 这个图就是大厂面试经典题目,接雨水! 最常青藤的一道题,面试官百出不厌! @@ -741,7 +742,4 @@ int trap(int* height, int heightSize) { ----------------------- -

- - - +

diff --git "a/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" "b/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" index b24abd4377..55634b5565 100644 --- "a/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" +++ "b/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" @@ -1,7 +1,8 @@

- - + + +

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

> 相对于[贪心算法:跳跃游戏](https://mp.weixin.qq.com/s/606_N9j8ACKCODoCbV1lSA)难了不少,做好心里准备! @@ -230,7 +231,4 @@ var jump = function(nums) { ----------------------- -

- - - +

diff --git "a/problems/0046.\345\205\250\346\216\222\345\210\227.md" "b/problems/0046.\345\205\250\346\216\222\345\210\227.md" index dc5f17cf15..180059615e 100644 --- "a/problems/0046.\345\205\250\346\216\222\345\210\227.md" +++ "b/problems/0046.\345\205\250\346\216\222\345\210\227.md" @@ -1,7 +1,8 @@

- - + + +

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

# 46.全排列 @@ -399,7 +400,4 @@ int** permute(int* nums, int numsSize, int* returnSize, int** returnColumnSizes) ----------------------- -

- - - +

diff --git "a/problems/0047.\345\205\250\346\216\222\345\210\227II.md" "b/problems/0047.\345\205\250\346\216\222\345\210\227II.md" index b910583388..4d3b97718a 100644 --- "a/problems/0047.\345\205\250\346\216\222\345\210\227II.md" +++ "b/problems/0047.\345\205\250\346\216\222\345\210\227II.md" @@ -1,7 +1,8 @@

- - + + +

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

# 排列问题(二) @@ -293,7 +294,4 @@ var permuteUnique = function (nums) { ----------------------- -

- - - +

diff --git "a/problems/0051.N\347\232\207\345\220\216.md" "b/problems/0051.N\347\232\207\345\220\216.md" index 1885ab550f..d36ac5430f 100644 --- "a/problems/0051.N\347\232\207\345\220\216.md" +++ "b/problems/0051.N\347\232\207\345\220\216.md" @@ -1,7 +1,8 @@

- - + + +

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

# 第51题. N皇后 @@ -472,7 +473,4 @@ var solveNQueens = function(n) { ----------------------- -

- - - +

diff --git "a/problems/0052.N\347\232\207\345\220\216II.md" "b/problems/0052.N\347\232\207\345\220\216II.md" index 03c11634a0..68343e0cc1 100644 --- "a/problems/0052.N\347\232\207\345\220\216II.md" +++ "b/problems/0052.N\347\232\207\345\220\216II.md" @@ -1,7 +1,8 @@

- - + + +

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

@@ -143,7 +144,4 @@ var totalNQueens = function(n) { }; ``` ----------------------- -

- - - +

diff --git "a/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" "b/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" index 4502d9a1bf..6f75935c8f 100644 --- "a/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" +++ "b/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" @@ -1,7 +1,8 @@

- - + + +

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

# 53. 最大子序和 @@ -230,7 +231,4 @@ var maxSubArray = function(nums) { ----------------------- -

- - - +

diff --git "a/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" "b/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" index 914095b984..9e9f5511c9 100644 --- "a/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" +++ "b/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" @@ -1,7 +1,8 @@

- - + + +

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

## 53. 最大子序和 @@ -186,7 +187,4 @@ const maxSubArray = nums => { ----------------------- -

- - - +

diff --git "a/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" "b/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" index 70a152fca9..25d5f0bd66 100644 --- "a/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" +++ "b/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" @@ -1,7 +1,8 @@

- - + + +

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

# 55. 跳跃游戏 @@ -155,7 +156,4 @@ var canJump = function(nums) { ----------------------- -

- - - +

diff --git "a/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" "b/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" index 92a75cd747..2732f5ee74 100644 --- "a/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" +++ "b/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" @@ -1,7 +1,8 @@

- - + + +

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

## 56. 合并区间 @@ -268,7 +269,4 @@ var merge = function(intervals) { ----------------------- -

- - - +

diff --git "a/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" "b/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" index 906a5dbd3f..f90fce1a0c 100644 --- "a/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" +++ "b/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" @@ -1,7 +1,8 @@

- - + + +

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

@@ -536,7 +537,4 @@ int** generateMatrix(int n, int* returnSize, int** returnColumnSizes){ ``` ----------------------- -

- - - +

diff --git "a/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" "b/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" index a6061ed6cc..5d78933282 100644 --- "a/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" +++ "b/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" @@ -1,7 +1,8 @@

- - + + +

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

## 62.不同路径 @@ -346,7 +347,4 @@ var uniquePaths = function(m, n) { ----------------------- -

- - - +

diff --git "a/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" "b/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" index b870114876..0f0d10b365 100644 --- "a/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" +++ "b/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" @@ -1,7 +1,8 @@

- - + + +

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

## 63. 不同路径 II @@ -333,7 +334,4 @@ var uniquePathsWithObstacles = function(obstacleGrid) { ----------------------- -

- - - +

diff --git "a/problems/0070.\347\210\254\346\245\274\346\242\257.md" "b/problems/0070.\347\210\254\346\245\274\346\242\257.md" index e2e84152ee..4b7f60f47a 100644 --- "a/problems/0070.\347\210\254\346\245\274\346\242\257.md" +++ "b/problems/0070.\347\210\254\346\245\274\346\242\257.md" @@ -1,7 +1,8 @@

- - + + +

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

## 70. 爬楼梯 [力扣题目链接](https://leetcode-cn.com/problems/climbing-stairs/) @@ -295,7 +296,4 @@ var climbStairs = function(n) { ----------------------- -

- - - +

diff --git "a/problems/0070.\347\210\254\346\245\274\346\242\257\345\256\214\345\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md" "b/problems/0070.\347\210\254\346\245\274\346\242\257\345\256\214\345\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md" index cc73543cfb..20b49a114d 100644 --- "a/problems/0070.\347\210\254\346\245\274\346\242\257\345\256\214\345\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md" +++ "b/problems/0070.\347\210\254\346\245\274\346\242\257\345\256\214\345\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md" @@ -1,7 +1,8 @@

- - + + +

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

# 动态规划:以前我没得选,现在我选择再爬一次! 之前讲这道题目的时候,因为还没有讲背包问题,所以就只是讲了一下爬楼梯最直接的动规方法(斐波那契)。 @@ -200,7 +201,4 @@ var climbStairs = function(n) { ----------------------- -

- - - +

diff --git "a/problems/0072.\347\274\226\350\276\221\350\267\235\347\246\273.md" "b/problems/0072.\347\274\226\350\276\221\350\267\235\347\246\273.md" index 5928bb98df..eeb9d40204 100644 --- "a/problems/0072.\347\274\226\350\276\221\350\267\235\347\246\273.md" +++ "b/problems/0072.\347\274\226\350\276\221\350\267\235\347\246\273.md" @@ -1,7 +1,8 @@

- - + + +

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

## 72. 编辑距离 @@ -327,7 +328,4 @@ const minDistance = (word1, word2) => { ``` ----------------------- -

- - - +

diff --git "a/problems/0077.\347\273\204\345\220\210.md" "b/problems/0077.\347\273\204\345\220\210.md" index e54d89145e..16313cb880 100644 --- "a/problems/0077.\347\273\204\345\220\210.md" +++ "b/problems/0077.\347\273\204\345\220\210.md" @@ -1,7 +1,8 @@

- - + + +

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

@@ -621,7 +622,4 @@ int** combine(int n, int k, int* returnSize, int** returnColumnSizes){ ``` ----------------------- -

- - - +

diff --git "a/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" "b/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" index 8af57aa99d..1d725bc529 100644 --- "a/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" +++ "b/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" @@ -1,7 +1,8 @@

- - + + +

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

@@ -294,7 +295,4 @@ int** combine(int n, int k, int* returnSize, int** returnColumnSizes){ ``` ----------------------- -

- - - +

diff --git "a/problems/0078.\345\255\220\351\233\206.md" "b/problems/0078.\345\255\220\351\233\206.md" index 7acd9d6db3..c5dec79564 100644 --- "a/problems/0078.\345\255\220\351\233\206.md" +++ "b/problems/0078.\345\255\220\351\233\206.md" @@ -1,7 +1,8 @@

- - + + +

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

# 78.子集 @@ -330,7 +331,4 @@ int** subsets(int* nums, int numsSize, int* returnSize, int** returnColumnSizes) ----------------------- -

- - - +

diff --git "a/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" "b/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" index ee75c6c8f3..0c49c58174 100644 --- "a/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" +++ "b/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" @@ -1,7 +1,8 @@

- - + + +

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

# 84.柱状图中最大的矩形 @@ -486,7 +487,4 @@ var largestRectangleArea = function(heights) { }; ``` ----------------------- -

- - - +

diff --git "a/problems/0090.\345\255\220\351\233\206II.md" "b/problems/0090.\345\255\220\351\233\206II.md" index 1988c1688f..95b6080bf7 100644 --- "a/problems/0090.\345\255\220\351\233\206II.md" +++ "b/problems/0090.\345\255\220\351\233\206II.md" @@ -1,7 +1,8 @@

- - + + +

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

# 子集问题(二) @@ -360,7 +361,4 @@ int** subsetsWithDup(int* nums, int numsSize, int* returnSize, int** returnColum ----------------------- -

- - - +

diff --git "a/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" "b/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" index a7c02a99ac..2277aa60b3 100644 --- "a/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" +++ "b/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" @@ -1,7 +1,8 @@

- - + + +

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

@@ -532,7 +533,4 @@ char ** restoreIpAddresses(char * s, int* returnSize){ ----------------------- -

- - - +

diff --git "a/problems/0096.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0096.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" index c68b4bb8b0..0567beda0f 100644 --- "a/problems/0096.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" +++ "b/problems/0096.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" @@ -1,7 +1,8 @@

- - + + +

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

## 96.不同的二叉搜索树 @@ -228,7 +229,4 @@ const numTrees =(n) => { ----------------------- -

- - - +

diff --git "a/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" index 7fbfae6adc..ec265615bd 100644 --- "a/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" +++ "b/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" @@ -1,7 +1,8 @@

- - + + +

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

# 98.验证二叉搜索树 @@ -523,7 +524,4 @@ var isValidBST = function (root) { ----------------------- -

- - - +

diff --git "a/problems/0100.\347\233\270\345\220\214\347\232\204\346\240\221.md" "b/problems/0100.\347\233\270\345\220\214\347\232\204\346\240\221.md" index 73dcadefbc..ef5db23ae2 100644 --- "a/problems/0100.\347\233\270\345\220\214\347\232\204\346\240\221.md" +++ "b/problems/0100.\347\233\270\345\220\214\347\232\204\346\240\221.md" @@ -1,7 +1,8 @@

- - + + +

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

@@ -241,7 +242,4 @@ JavaScript: ----------------------- -

- - - +

diff --git "a/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" "b/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" index 2db36b6a47..3dfe863070 100644 --- "a/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" @@ -1,7 +1,8 @@

- - + + +

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

# 101. 对称二叉树 @@ -576,7 +577,4 @@ var isSymmetric = function(root) { ----------------------- -

- - - +

diff --git "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" index bfc9c0545c..04b980c641 100644 --- "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" +++ "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" @@ -1,7 +1,8 @@

- - + + +

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

# 二叉树层序遍历登场! @@ -1900,7 +1901,4 @@ var minDepth = function(root) { ----------------------- -

- - - +

diff --git "a/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" "b/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" index 46bbbc074a..19878b95d7 100644 --- "a/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" +++ "b/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" @@ -1,7 +1,8 @@

- - + + +

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

看完本篇可以一起做了如下两道题目: @@ -598,7 +599,4 @@ var maxDepth = function(root) { ``` ----------------------- -

- - - +

diff --git "a/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" "b/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" index 8089cdb2b7..6b55b10e5f 100644 --- "a/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" @@ -1,7 +1,8 @@

- - + + +

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

看完本文,可以一起解决如下两道题目 @@ -889,7 +890,4 @@ struct TreeNode* buildTree(int* preorder, int preorderSize, int* inorder, int in ``` ----------------------- -

- - - +

diff --git "a/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" index 8c617f4b6c..04f62e6062 100644 --- "a/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" +++ "b/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" @@ -1,7 +1,8 @@

- - + + +

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

> 构造二叉搜索树,一不小心就平衡了 @@ -393,7 +394,4 @@ struct TreeNode* sortedArrayToBST(int* nums, int numsSize) { ``` ----------------------- -

- - - +

diff --git "a/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" "b/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" index a06bff0e8e..dc8167c44f 100644 --- "a/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" @@ -1,7 +1,8 @@

- - + + +

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

> 求高度还是求深度,你搞懂了不? @@ -736,7 +737,4 @@ bool isBalanced(struct TreeNode* root){ ``` ----------------------- -

- - - +

diff --git "a/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" "b/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" index 1ec82fc98c..20914b5a95 100644 --- "a/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" +++ "b/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" @@ -1,7 +1,8 @@

- - + + +

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

> 和求最大深度一个套路? @@ -407,7 +408,4 @@ var minDepth = function(root) { ----------------------- -

- - - +

diff --git "a/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" "b/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" index 55c6213d02..054b23405e 100644 --- "a/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" +++ "b/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" @@ -1,7 +1,8 @@

- - + + +

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

> 递归函数什么时候需要返回值 @@ -705,7 +706,4 @@ var pathsum = function(root, targetsum) { ----------------------- -

- - - +

diff --git "a/problems/0115.\344\270\215\345\220\214\347\232\204\345\255\220\345\272\217\345\210\227.md" "b/problems/0115.\344\270\215\345\220\214\347\232\204\345\255\220\345\272\217\345\210\227.md" index 278426f4bf..9a011378e0 100644 --- "a/problems/0115.\344\270\215\345\220\214\347\232\204\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0115.\344\270\215\345\220\214\347\232\204\345\255\220\345\272\217\345\210\227.md" @@ -1,7 +1,8 @@

- - + + +

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

## 115.不同的子序列 @@ -268,7 +269,4 @@ const numDistinct = (s, t) => { ----------------------- -

- - - +

diff --git "a/problems/0116.\345\241\253\345\205\205\346\257\217\344\270\252\350\212\202\347\202\271\347\232\204\344\270\213\344\270\200\344\270\252\345\217\263\344\276\247\350\212\202\347\202\271\346\214\207\351\222\210.md" "b/problems/0116.\345\241\253\345\205\205\346\257\217\344\270\252\350\212\202\347\202\271\347\232\204\344\270\213\344\270\200\344\270\252\345\217\263\344\276\247\350\212\202\347\202\271\346\214\207\351\222\210.md" index 9c234ffa97..b6b723c93d 100644 --- "a/problems/0116.\345\241\253\345\205\205\346\257\217\344\270\252\350\212\202\347\202\271\347\232\204\344\270\213\344\270\200\344\270\252\345\217\263\344\276\247\350\212\202\347\202\271\346\214\207\351\222\210.md" +++ "b/problems/0116.\345\241\253\345\205\205\346\257\217\344\270\252\350\212\202\347\202\271\347\232\204\344\270\213\344\270\200\344\270\252\345\217\263\344\276\247\350\212\202\347\202\271\346\214\207\351\222\210.md" @@ -1,7 +1,8 @@

- - + + +

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

# 116. 填充每个节点的下一个右侧节点指针 @@ -254,7 +255,4 @@ const connect = root => { ----------------------- -

- - - +

diff --git "a/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" "b/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" index 761479f042..3aff6b891c 100644 --- "a/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" +++ "b/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" @@ -1,7 +1,8 @@

- - + + +

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

## 121. 买卖股票的最佳时机 @@ -368,7 +369,4 @@ var maxProfit = function(prices) { ----------------------- -

- - - +

diff --git "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" index 44157bac92..d4575bd6ec 100644 --- "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" +++ "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" @@ -1,7 +1,8 @@

- - + + +

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

# 122.买卖股票的最佳时机II @@ -280,7 +281,4 @@ int maxProfit(int* prices, int pricesSize){ ``` ----------------------- -

- - - +

diff --git "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" index b875ed8a9e..7cd6c0ada6 100644 --- "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" +++ "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" @@ -1,7 +1,8 @@

- - + + +

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

## 122.买卖股票的最佳时机II @@ -265,7 +266,4 @@ const maxProfit = (prices) => { ----------------------- -

- - - +

diff --git "a/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" "b/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" index bce7b83c8f..47a30ab904 100644 --- "a/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" +++ "b/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" @@ -1,7 +1,8 @@

- - + + +

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

## 123.买卖股票的最佳时机III @@ -350,7 +351,4 @@ const maxProfit = prices => { ----------------------- -

- - - +

diff --git "a/problems/0127.\345\215\225\350\257\215\346\216\245\351\276\231.md" "b/problems/0127.\345\215\225\350\257\215\346\216\245\351\276\231.md" index c7eb4b39d4..0063c97cf5 100644 --- "a/problems/0127.\345\215\225\350\257\215\346\216\245\351\276\231.md" +++ "b/problems/0127.\345\215\225\350\257\215\346\216\245\351\276\231.md" @@ -1,7 +1,8 @@

- - + + +

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

# 127. 单词接龙 @@ -175,7 +176,4 @@ var ladderLength = function(beginWord, endWord, wordList) { ----------------------- -

- - - +

diff --git "a/problems/0129.\346\261\202\346\240\271\345\210\260\345\217\266\345\255\220\350\212\202\347\202\271\346\225\260\345\255\227\344\271\213\345\222\214.md" "b/problems/0129.\346\261\202\346\240\271\345\210\260\345\217\266\345\255\220\350\212\202\347\202\271\346\225\260\345\255\227\344\271\213\345\222\214.md" index 89ec63d5c4..1f10926512 100644 --- "a/problems/0129.\346\261\202\346\240\271\345\210\260\345\217\266\345\255\220\350\212\202\347\202\271\346\225\260\345\255\227\344\271\213\345\222\214.md" +++ "b/problems/0129.\346\261\202\346\240\271\345\210\260\345\217\266\345\255\220\350\212\202\347\202\271\346\225\260\345\255\227\344\271\213\345\222\214.md" @@ -1,7 +1,8 @@

- - + + +

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

# 129. 求根节点到叶节点数字之和 [力扣题目链接](https://leetcode-cn.com/problems/sum-root-to-leaf-numbers/) @@ -291,7 +292,4 @@ var sumNumbers = function(root) { ----------------------- -

- - - +

diff --git "a/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" "b/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" index aeee36714e..f674835d5e 100644 --- "a/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" +++ "b/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" @@ -1,7 +1,8 @@

- - + + +

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

> 切割问题其实是一种组合问题! @@ -451,7 +452,4 @@ var partition = function(s) { ----------------------- -

- - - +

diff --git "a/problems/0132.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262II.md" "b/problems/0132.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262II.md" index cd18b65ac2..3325578b6d 100644 --- "a/problems/0132.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262II.md" +++ "b/problems/0132.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262II.md" @@ -1,7 +1,8 @@

- - + + +

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

@@ -284,7 +285,4 @@ var minCut = function(s) { ----------------------- -

- - - +

diff --git "a/problems/0134.\345\212\240\346\262\271\347\253\231.md" "b/problems/0134.\345\212\240\346\262\271\347\253\231.md" index 17e750c144..7d702f420d 100644 --- "a/problems/0134.\345\212\240\346\262\271\347\253\231.md" +++ "b/problems/0134.\345\212\240\346\262\271\347\253\231.md" @@ -1,7 +1,8 @@

- - + + +

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

## 134. 加油站 @@ -373,7 +374,4 @@ int canCompleteCircuit(int* gas, int gasSize, int* cost, int costSize){ ``` ----------------------- -

- - - +

diff --git "a/problems/0135.\345\210\206\345\217\221\347\263\226\346\236\234.md" "b/problems/0135.\345\210\206\345\217\221\347\263\226\346\236\234.md" index f20e0ee0b5..76453c6255 100644 --- "a/problems/0135.\345\210\206\345\217\221\347\263\226\346\236\234.md" +++ "b/problems/0135.\345\210\206\345\217\221\347\263\226\346\236\234.md" @@ -1,7 +1,8 @@

- - + + +

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

## 135. 分发糖果 @@ -239,7 +240,4 @@ var candy = function(ratings) { ----------------------- -

- - - +

diff --git "a/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" "b/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" index c82869545a..0ae5c5f2e5 100644 --- "a/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" +++ "b/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" @@ -1,7 +1,8 @@

- - + + +

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

@@ -313,7 +314,4 @@ const wordBreak = (s, wordDict) => { ----------------------- -

- - - +

diff --git "a/problems/0141.\347\216\257\345\275\242\351\223\276\350\241\250.md" "b/problems/0141.\347\216\257\345\275\242\351\223\276\350\241\250.md" index a2b45eaee5..137c429f70 100644 --- "a/problems/0141.\347\216\257\345\275\242\351\223\276\350\241\250.md" +++ "b/problems/0141.\347\216\257\345\275\242\351\223\276\350\241\250.md" @@ -1,7 +1,8 @@

- - + + +

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

# 141. 环形链表 @@ -125,7 +126,4 @@ var hasCycle = function(head) { ----------------------- -

- - - +

diff --git "a/problems/0142.\347\216\257\345\275\242\351\223\276\350\241\250II.md" "b/problems/0142.\347\216\257\345\275\242\351\223\276\350\241\250II.md" index 865504095e..60bb10b706 100644 --- "a/problems/0142.\347\216\257\345\275\242\351\223\276\350\241\250II.md" +++ "b/problems/0142.\347\216\257\345\275\242\351\223\276\350\241\250II.md" @@ -1,7 +1,8 @@

- - + + +

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

@@ -328,7 +329,4 @@ extension ListNode: Equatable { ``` ----------------------- -

- - - +

diff --git "a/problems/0143.\351\207\215\346\216\222\351\223\276\350\241\250.md" "b/problems/0143.\351\207\215\346\216\222\351\223\276\350\241\250.md" index e740692b7b..dff1fb74dd 100644 --- "a/problems/0143.\351\207\215\346\216\222\351\223\276\350\241\250.md" +++ "b/problems/0143.\351\207\215\346\216\222\351\223\276\350\241\250.md" @@ -1,7 +1,8 @@

- - + + +

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

# 143.重排链表 @@ -442,7 +443,4 @@ var reorderList = function(head, s = [], tmp) { ----------------------- -

- - - +

diff --git "a/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" "b/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" index cc2322adca..ef91330d0b 100644 --- "a/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" +++ "b/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" @@ -1,7 +1,8 @@

- - + + +

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

@@ -242,7 +243,4 @@ class Solution: ----------------------- -

- - - +

diff --git "a/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" "b/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" index 0a06e02472..a6669147a7 100644 --- "a/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" +++ "b/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" @@ -1,7 +1,8 @@

- - + + +

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

@@ -635,7 +636,4 @@ func reverseWord(_ s: inout [Character]) { ----------------------- -

- - - +

diff --git "a/problems/0160.\347\233\270\344\272\244\351\223\276\350\241\250.md" "b/problems/0160.\347\233\270\344\272\244\351\223\276\350\241\250.md" index 8d71bca514..dd1afe4a10 100644 --- "a/problems/0160.\347\233\270\344\272\244\351\223\276\350\241\250.md" +++ "b/problems/0160.\347\233\270\344\272\244\351\223\276\350\241\250.md" @@ -1,11 +1,9 @@

- - + + +

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

同:[链表:链表相交](https://programmercarl.com/面试题02.07.链表相交.html) ----------------------- -

- - - +

diff --git "a/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" "b/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" index a069fbe6ac..22a1a141a3 100644 --- "a/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" +++ "b/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" @@ -1,7 +1,8 @@

- - + + +

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

## 188.买卖股票的最佳时机IV @@ -361,7 +362,4 @@ var maxProfit = function(k, prices) { ``` ----------------------- -

- - - +

diff --git "a/problems/0189.\346\227\213\350\275\254\346\225\260\347\273\204.md" "b/problems/0189.\346\227\213\350\275\254\346\225\260\347\273\204.md" index 356cbe301a..2a60d245e0 100644 --- "a/problems/0189.\346\227\213\350\275\254\346\225\260\347\273\204.md" +++ "b/problems/0189.\346\227\213\350\275\254\346\225\260\347\273\204.md" @@ -1,7 +1,8 @@

- - + + +

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

# 189. 旋转数组 @@ -149,7 +150,4 @@ var rotate = function (nums, k) { ----------------------- -

- - - +

diff --git "a/problems/0198.\346\211\223\345\256\266\345\212\253\350\210\215.md" "b/problems/0198.\346\211\223\345\256\266\345\212\253\350\210\215.md" index dd8b067fe5..20cf3d2038 100644 --- "a/problems/0198.\346\211\223\345\256\266\345\212\253\350\210\215.md" +++ "b/problems/0198.\346\211\223\345\256\266\345\212\253\350\210\215.md" @@ -1,7 +1,8 @@

- - + + +

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

## 198.打家劫舍 @@ -192,7 +193,4 @@ const rob = nums => { ----------------------- -

- - - +

diff --git "a/problems/0202.\345\277\253\344\271\220\346\225\260.md" "b/problems/0202.\345\277\253\344\271\220\346\225\260.md" index bda75636f2..a5a6f19976 100644 --- "a/problems/0202.\345\277\253\344\271\220\346\225\260.md" +++ "b/problems/0202.\345\277\253\344\271\220\346\225\260.md" @@ -1,7 +1,8 @@

- - + + +

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

@@ -295,7 +296,4 @@ class Solution { ``` ----------------------- -

- - - +

diff --git "a/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" "b/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" index b679084a27..eff2812c7c 100644 --- "a/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" +++ "b/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" @@ -1,7 +1,8 @@

- - + + +

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

> 链表操作中,可以使用原链表来直接进行删除操作,也可以设置一个虚拟头结点在进行删除操作,接下来看一看哪种方式更方便。 @@ -391,7 +392,4 @@ impl Solution { ``` ----------------------- -

- - - +

diff --git "a/problems/0205.\345\220\214\346\236\204\345\255\227\347\254\246\344\270\262.md" "b/problems/0205.\345\220\214\346\236\204\345\255\227\347\254\246\344\270\262.md" index e31f5edcb8..a296314981 100644 --- "a/problems/0205.\345\220\214\346\236\204\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/0205.\345\220\214\346\236\204\345\255\227\347\254\246\344\270\262.md" @@ -1,7 +1,8 @@

- - + + +

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

# 205. 同构字符串 @@ -139,7 +140,4 @@ var isIsomorphic = function(s, t) { ----------------------- -

- - - +

diff --git "a/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md" "b/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md" index 717c17f70e..c1d7bcfe1d 100644 --- "a/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md" +++ "b/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md" @@ -1,7 +1,8 @@

- - + + +

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

> 反转链表的写法很简单,一些同学甚至可以背下来但过一阵就忘了该咋写,主要是因为没有理解真正的反转过程。 @@ -449,7 +450,4 @@ struct ListNode* reverseList(struct ListNode* head){ ``` ----------------------- -

- - - +

diff --git "a/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" "b/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" index c9f62059c1..8c539ff72d 100644 --- "a/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" +++ "b/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" @@ -1,7 +1,8 @@

- - + + +

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

## 209.长度最小的子数组 @@ -291,7 +292,4 @@ class Solution { ``` ----------------------- -

- - - +

diff --git "a/problems/0213.\346\211\223\345\256\266\345\212\253\350\210\215II.md" "b/problems/0213.\346\211\223\345\256\266\345\212\253\350\210\215II.md" index b37a72153c..bfc3b69bf5 100644 --- "a/problems/0213.\346\211\223\345\256\266\345\212\253\350\210\215II.md" +++ "b/problems/0213.\346\211\223\345\256\266\345\212\253\350\210\215II.md" @@ -1,7 +1,8 @@

- - + + +

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

## 213.打家劫舍II @@ -202,7 +203,4 @@ func max(a, b int) int { ----------------------- -

- - - +

diff --git "a/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" "b/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" index 5baaffa2eb..fa2ce37f65 100644 --- "a/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" +++ "b/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" @@ -1,7 +1,8 @@

- - + + +

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

@@ -448,7 +449,4 @@ int** combinationSum3(int k, int n, int* returnSize, int** returnColumnSizes){ ``` ----------------------- -

- - - +

diff --git "a/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" "b/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" index 416b1dba19..56052b52d6 100644 --- "a/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" +++ "b/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" @@ -1,7 +1,8 @@

- - + + +

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

# 222.完全二叉树的节点个数 @@ -449,7 +450,4 @@ var countNodes = function(root) { ----------------------- -

- - - +

diff --git "a/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" "b/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" index 0f7c187758..edb88f3643 100644 --- "a/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" +++ "b/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" @@ -1,7 +1,8 @@

- - + + +

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

@@ -598,7 +599,4 @@ MyStack.prototype.empty = function() { ``` ----------------------- -

- - - +

diff --git "a/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" "b/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" index 6e7c6eae0e..00f0e1c090 100644 --- "a/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" @@ -1,7 +1,8 @@

- - + + +

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

# 226.翻转二叉树 @@ -608,7 +609,4 @@ struct TreeNode* invertTree(struct TreeNode* root){ ``` ----------------------- -

- - - +

diff --git "a/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" "b/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" index 9d97654223..0e4a5d6dd7 100644 --- "a/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" +++ "b/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" @@ -1,7 +1,8 @@

- - + + +

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

> 工作上一定没人这么搞,但是考察对栈、队列理解程度的好题 @@ -350,7 +351,4 @@ MyQueue.prototype.empty = function() { ----------------------- -

- - - +

diff --git "a/problems/0234.\345\233\236\346\226\207\351\223\276\350\241\250.md" "b/problems/0234.\345\233\236\346\226\207\351\223\276\350\241\250.md" index 291567d75c..5e92959456 100644 --- "a/problems/0234.\345\233\236\346\226\207\351\223\276\350\241\250.md" +++ "b/problems/0234.\345\233\236\346\226\207\351\223\276\350\241\250.md" @@ -1,7 +1,8 @@

- - + + +

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

# 234.回文链表 @@ -321,7 +322,4 @@ var isPalindrome = function(head) { ----------------------- -

- - - +

diff --git "a/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" "b/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" index 215646dc2f..5bde557b15 100644 --- "a/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" +++ "b/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" @@ -1,7 +1,8 @@

- - + + +

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

# 235. 二叉搜索树的最近公共祖先 @@ -351,7 +352,4 @@ var lowestCommonAncestor = function(root, p, q) { ----------------------- -

- - - +

diff --git "a/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" "b/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" index 76c9d3b194..4182999f63 100644 --- "a/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" +++ "b/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" @@ -1,7 +1,8 @@

- - + + +

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

> 本来是打算将二叉树和二叉搜索树的公共祖先问题一起讲,后来发现篇幅过长了,只能先说一说二叉树的公共祖先问题。 @@ -339,7 +340,4 @@ var lowestCommonAncestor = function(root, p, q) { ----------------------- -

- - - +

diff --git "a/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" "b/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" index a7d763ce2e..5a910908cc 100644 --- "a/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" +++ "b/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" @@ -1,7 +1,8 @@

- - + + +

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

@@ -419,7 +420,4 @@ var maxSlidingWindow = function (nums, k) { ----------------------- -

- - - +

diff --git "a/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" "b/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" index 370b14bb57..611827586c 100644 --- "a/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" +++ "b/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" @@ -1,7 +1,8 @@

- - + + +

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

> 数组就是简单的哈希表,但是数组的大小可不是无限开辟的 @@ -280,7 +281,4 @@ impl Solution { ----------------------- -

- - - +

diff --git "a/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" "b/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" index c117f10715..62c720dd47 100644 --- "a/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" +++ "b/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" @@ -1,7 +1,8 @@

- - + + +

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

> 以为只用了递归,其实还用了回溯 @@ -583,7 +584,4 @@ var binaryTreePaths = function(root) { ----------------------- -

- - - +

diff --git "a/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" "b/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" index a24353e13c..78effc2a82 100644 --- "a/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" +++ "b/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" @@ -1,7 +1,8 @@

- - + + +

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

# 动态规划:一样的套路,再求一次完全平方数 ## 279.完全平方数 @@ -355,7 +356,4 @@ var numSquares2 = function(n) { ``` ----------------------- -

- - - +

diff --git "a/problems/0283.\347\247\273\345\212\250\351\233\266.md" "b/problems/0283.\347\247\273\345\212\250\351\233\266.md" index 337a0bd872..8ba3ff3b4e 100644 --- "a/problems/0283.\347\247\273\345\212\250\351\233\266.md" +++ "b/problems/0283.\347\247\273\345\212\250\351\233\266.md" @@ -1,7 +1,8 @@

- - + + +

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

# 动态规划:一样的套路,再求一次完全平方数 @@ -110,7 +111,4 @@ var moveZeroes = function(nums) { ----------------------- -

- - - +

diff --git "a/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" "b/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" index 7f15bf359d..ee8dc79ba2 100644 --- "a/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" @@ -1,7 +1,8 @@

- - + + +

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

## 300.最长递增子序列 @@ -196,7 +197,4 @@ const lengthOfLIS = (nums) => { ----------------------- -

- - - +

diff --git "a/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" "b/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" index 525f8ceff9..e6c6839a01 100644 --- "a/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" +++ "b/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" @@ -1,7 +1,8 @@

- - + + +

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

## 309.最佳买卖股票时机含冷冻期 @@ -231,7 +232,4 @@ const maxProfit = (prices) => { ----------------------- -

- - - +

diff --git "a/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" "b/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" index 77e66c0d4c..380402b1a4 100644 --- "a/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" +++ "b/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" @@ -1,7 +1,8 @@

- - + + +

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

# 动态规划: 给我个机会,我再兑换一次零钱 ## 322. 零钱兑换 @@ -324,7 +325,4 @@ const coinChange = (coins, amount) => { ----------------------- -

- - - +

diff --git "a/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" "b/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" index 30ff3f0a48..cfdea23727 100644 --- "a/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" +++ "b/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" @@ -1,7 +1,8 @@

- - + + +

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

> 这也可以用回溯法? 其实深搜和回溯也是相辅相成的,毕竟都用递归。 @@ -445,7 +446,4 @@ var findItinerary = function(tickets) { ``` ----------------------- -

- - - +

diff --git "a/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" "b/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" index 43ba720bf1..e8e95cc411 100644 --- "a/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" +++ "b/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" @@ -1,7 +1,8 @@

- - + + +

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

## 337.打家劫舍 III @@ -460,7 +461,4 @@ func max(a, b int) int { ----------------------- -

- - - +

diff --git "a/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" "b/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" index b6f8fd42ce..9f070e242b 100644 --- "a/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" +++ "b/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" @@ -1,7 +1,8 @@

- - + + +

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

## 343. 整数拆分 @@ -270,7 +271,4 @@ var integerBreak = function(n) { ``` ----------------------- -

- - - +

diff --git "a/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" "b/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" index 179aa25ffb..cfd536de24 100644 --- "a/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" @@ -1,7 +1,8 @@

- - + + +

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

@@ -234,7 +235,4 @@ void reverseString(char* s, int sSize){ ----------------------- -

- - - +

diff --git "a/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" "b/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" index 165c159439..c0f194fa44 100644 --- "a/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" +++ "b/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" @@ -1,7 +1,8 @@

- - + + +

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

@@ -358,7 +359,4 @@ PriorityQueue.prototype.compare = function(index1, index2) { ----------------------- -

- - - +

diff --git "a/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" "b/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" index a6d152512c..35d0cb7f2c 100644 --- "a/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" +++ "b/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" @@ -1,7 +1,8 @@

- - + + +

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

@@ -260,7 +261,4 @@ impl Solution { ----------------------- -

- - - +

diff --git "a/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" "b/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" index 98e8fbea4e..3432ca53fc 100644 --- "a/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" +++ "b/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" @@ -1,7 +1,8 @@

- - + + +

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

> 本周讲解了[贪心理论基础](https://programmercarl.com/贪心算法理论基础.html),以及第一道贪心的题目:[贪心算法:分发饼干](https://programmercarl.com/0455.分发饼干.html),可能会给大家一种贪心算法比较简单的错觉,好了,接下来几天的题目难度要上来了,哈哈。 @@ -278,7 +279,4 @@ var wiggleMaxLength = function(nums) { ``` ----------------------- -

- - - +

diff --git "a/problems/0377.\347\273\204\345\220\210\346\200\273\345\222\214\342\205\243.md" "b/problems/0377.\347\273\204\345\220\210\346\200\273\345\222\214\342\205\243.md" index 6de0074101..012a603f07 100644 --- "a/problems/0377.\347\273\204\345\220\210\346\200\273\345\222\214\342\205\243.md" +++ "b/problems/0377.\347\273\204\345\220\210\346\200\273\345\222\214\342\205\243.md" @@ -1,7 +1,8 @@

- - + + +

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

# 动态规划:Carl称它为排列总和! @@ -240,7 +241,4 @@ impl Solution { ----------------------- -

- - - +

diff --git "a/problems/0383.\350\265\216\351\207\221\344\277\241.md" "b/problems/0383.\350\265\216\351\207\221\344\277\241.md" index 55b6ad8b78..034f681d11 100644 --- "a/problems/0383.\350\265\216\351\207\221\344\277\241.md" +++ "b/problems/0383.\350\265\216\351\207\221\344\277\241.md" @@ -1,7 +1,8 @@

- - + + +

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

@@ -336,7 +337,4 @@ impl Solution { ``` ----------------------- -

- - - +

diff --git "a/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" "b/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" index f097f25cb0..f71940f65e 100644 --- "a/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" @@ -1,7 +1,8 @@

- - + + +

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

## 392.判断子序列 @@ -225,7 +226,4 @@ func isSubsequence(s string, t string) bool { ----------------------- -

- - - +

diff --git "a/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" "b/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" index 0b25cf304c..828ee2583a 100644 --- "a/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" +++ "b/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" @@ -1,7 +1,8 @@

- - + + +

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

# 404.左叶子之和 @@ -376,7 +377,4 @@ var sumOfLeftLeaves = function(root) { ----------------------- -

- - - +

diff --git "a/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" "b/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" index be76603360..417fdf466d 100644 --- "a/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" +++ "b/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" @@ -1,7 +1,8 @@

- - + + +

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

## 406.根据身高重建队列 @@ -291,7 +292,4 @@ var reconstructQueue = function(people) { ----------------------- -

- - - +

diff --git "a/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" "b/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" index e785d99990..b661a76663 100644 --- "a/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" +++ "b/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" @@ -1,7 +1,8 @@

- - + + +

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

## 416. 分割等和子集 @@ -313,7 +314,4 @@ var canPartition = function(nums) { ----------------------- -

- - - +

diff --git "a/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" "b/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" index c296a4c489..9b8435812f 100644 --- "a/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" +++ "b/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" @@ -1,7 +1,8 @@

- - + + +

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

## 435. 无重叠区间 @@ -313,7 +314,4 @@ var eraseOverlapIntervals = function(intervals) { ----------------------- -

- - - +

diff --git "a/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" "b/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" index d17dd99266..4c43389979 100644 --- "a/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" +++ "b/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" @@ -1,7 +1,8 @@

- - + + +

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

> 二叉搜索树删除节点就涉及到结构调整了 @@ -520,7 +521,4 @@ var deleteNode = function (root, key) { ----------------------- -

- - - +

diff --git "a/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" "b/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" index 3a836011f2..18b3344821 100644 --- "a/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" +++ "b/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" @@ -1,7 +1,8 @@

- - + + +

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

## 452. 用最少数量的箭引爆气球 @@ -241,7 +242,4 @@ int findMinArrowShots(int** points, int pointsSize, int* pointsColSize){ ``` ----------------------- -

- - - +

diff --git "a/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" "b/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" index 4db26ae443..97118ae453 100644 --- "a/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" +++ "b/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" @@ -1,7 +1,8 @@

- - + + +

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

> 需要哈希的地方都能找到map的身影 @@ -280,7 +281,4 @@ impl Solution { ``` ----------------------- -

- - - +

diff --git "a/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" "b/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" index b2970deb83..4c7c817aec 100644 --- "a/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" +++ "b/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" @@ -1,7 +1,8 @@

- - + + +

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

# 455.分发饼干 @@ -233,7 +234,4 @@ int findContentChildren(int* g, int gSize, int* s, int sSize){ ``` ----------------------- -

- - - +

diff --git "a/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" "b/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" index c3fd7edbfd..3d4eac5888 100644 --- "a/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" @@ -1,7 +1,8 @@

- - + + +

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

@@ -363,7 +364,4 @@ var repeatedSubstringPattern = function (s) { ----------------------- -

- - - +

diff --git "a/problems/0463.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" "b/problems/0463.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" index ddd43d8c8f..65783cc357 100644 --- "a/problems/0463.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" +++ "b/problems/0463.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" @@ -1,7 +1,8 @@

- - + + +

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

# 463. 岛屿的周长 [力扣题目链接](https://leetcode-cn.com/problems/island-perimeter/) @@ -176,7 +177,4 @@ var islandPerimeter = function(grid) { ----------------------- -

- - - +

diff --git "a/problems/0474.\344\270\200\345\222\214\351\233\266.md" "b/problems/0474.\344\270\200\345\222\214\351\233\266.md" index 0c5665da52..8c72eedfb6 100644 --- "a/problems/0474.\344\270\200\345\222\214\351\233\266.md" +++ "b/problems/0474.\344\270\200\345\222\214\351\233\266.md" @@ -1,7 +1,8 @@

- - + + +

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

# 动态规划:一和零! ## 474.一和零 @@ -325,7 +326,4 @@ const findMaxForm = (strs, m, n) => { ----------------------- -

- - - +

diff --git "a/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" "b/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" index 26e727e6df..c5ffdd4160 100644 --- "a/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" @@ -1,7 +1,8 @@

- - + + +

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

> 和子集问题有点像,但又处处是陷阱 @@ -433,7 +434,4 @@ int** findSubsequences(int* nums, int numsSize, int* returnSize, int** returnCol ----------------------- -

- - - +

diff --git "a/problems/0494.\347\233\256\346\240\207\345\222\214.md" "b/problems/0494.\347\233\256\346\240\207\345\222\214.md" index 087d030c1d..01554b028e 100644 --- "a/problems/0494.\347\233\256\346\240\207\345\222\214.md" +++ "b/problems/0494.\347\233\256\346\240\207\345\222\214.md" @@ -1,7 +1,8 @@

- - + + +

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

# 动态规划:目标和! ## 494. 目标和 @@ -385,7 +386,4 @@ const findTargetSumWays = (nums, target) => { ----------------------- -

- - - +

diff --git "a/problems/0496.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240I.md" "b/problems/0496.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240I.md" index dfcbe6c4b3..deeae2a691 100644 --- "a/problems/0496.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240I.md" +++ "b/problems/0496.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240I.md" @@ -1,7 +1,8 @@

- - + + +

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

# 496.下一个更大元素 I @@ -299,7 +300,4 @@ var nextGreaterElement = function (nums1, nums2) { ``` ----------------------- -

- - - +

diff --git "a/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" "b/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" index 01a6831938..6f2a29227e 100644 --- "a/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" +++ "b/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" @@ -1,7 +1,8 @@

- - + + +

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

> 二叉树上应该怎么求,二叉搜索树上又应该怎么求? @@ -700,7 +701,4 @@ var findMode = function(root) { ----------------------- -

- - - +

diff --git "a/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" "b/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" index d4e8553bc7..0634e932c6 100644 --- "a/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" +++ "b/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" @@ -1,7 +1,8 @@

- - + + +

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

# 503.下一个更大元素II @@ -183,7 +184,4 @@ var nextGreaterElements = function (nums) { }; ``` ----------------------- -

- - - +

diff --git "a/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" "b/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" index fb7aab2d8a..3cdd2c52f3 100644 --- "a/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" +++ "b/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" @@ -1,7 +1,8 @@

- - + + +

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

## 509. 斐波那契数 @@ -252,7 +253,4 @@ var fib = function(n) { ----------------------- -

- - - +

diff --git "a/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" "b/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" index 2991ffb33a..5be99390f3 100644 --- "a/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" +++ "b/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" @@ -1,7 +1,8 @@

- - + + +

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

# 513.找树左下角的值 @@ -435,7 +436,4 @@ var findBottomLeftValue = function(root) { ----------------------- -

- - - +

diff --git "a/problems/0516.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\345\272\217\345\210\227.md" "b/problems/0516.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\345\272\217\345\210\227.md" index 0fa1f36114..d6adc11ba0 100644 --- "a/problems/0516.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0516.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\345\272\217\345\210\227.md" @@ -1,7 +1,8 @@

- - + + +

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

## 516.最长回文子序列 [力扣题目链接](https://leetcode-cn.com/problems/longest-palindromic-subsequence/) @@ -237,7 +238,4 @@ const longestPalindromeSubseq = (s) => { ----------------------- -

- - - +

diff --git "a/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" "b/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" index 6780503497..9c77a916d8 100644 --- "a/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" +++ "b/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" @@ -1,7 +1,8 @@

- - + + +

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

# 动态规划:给你一些零钱,你要怎么凑? ## 518. 零钱兑换 II @@ -260,7 +261,4 @@ const change = (amount, coins) => { ----------------------- -

- - - +

diff --git "a/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" "b/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" index c35ee67516..e1f5f8a60b 100644 --- "a/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" +++ "b/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" @@ -1,7 +1,8 @@

- - + + +

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

> 利用二叉搜索树的特性搞起! @@ -364,7 +365,4 @@ var getMinimumDifference = function(root) { ``` ----------------------- -

- - - +

diff --git "a/problems/0538.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md" "b/problems/0538.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md" index 0b3cbf2da3..0ad9326b44 100644 --- "a/problems/0538.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md" +++ "b/problems/0538.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md" @@ -1,7 +1,8 @@

- - + + +

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

# 538.把二叉搜索树转换为累加树 @@ -312,7 +313,4 @@ struct TreeNode* convertBST(struct TreeNode* root){ ``` ----------------------- -

- - - +

diff --git "a/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" "b/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" index 7d6c9253bf..c5c729bf4b 100644 --- "a/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" +++ "b/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" @@ -1,7 +1,8 @@

- - + + +

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

@@ -276,7 +277,4 @@ func reverseStr(_ s: String, _ k: Int) -> String { ----------------------- -

- - - +

diff --git "a/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" "b/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" index a7189656bb..e6b932aca0 100644 --- "a/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" +++ "b/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" @@ -1,7 +1,8 @@

- - + + +

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

## 583. 两个字符串的删除操作 @@ -205,7 +206,4 @@ const minDistance = (word1, word2) => { ----------------------- -

- - - +

diff --git "a/problems/0617.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md" "b/problems/0617.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md" index bdae549cf2..e6f350fd0d 100644 --- "a/problems/0617.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0617.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md" @@ -1,7 +1,8 @@

- - + + +

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

# 617.合并二叉树 @@ -584,7 +585,4 @@ var mergeTrees = function(root1, root2) { ----------------------- -

- - - +

diff --git "a/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" "b/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" index b8e1f88749..89046eed95 100644 --- "a/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" +++ "b/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" @@ -1,7 +1,8 @@

- - + + +

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

## 647. 回文子串 @@ -406,7 +407,4 @@ const countSubstrings = (s) => { ----------------------- -

- - - +

diff --git "a/problems/0649.Dota2\345\217\202\350\256\256\351\231\242.md" "b/problems/0649.Dota2\345\217\202\350\256\256\351\231\242.md" index 9d94050e92..1fd931c16c 100644 --- "a/problems/0649.Dota2\345\217\202\350\256\256\351\231\242.md" +++ "b/problems/0649.Dota2\345\217\202\350\256\256\351\231\242.md" @@ -1,7 +1,8 @@

- - + + +

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

@@ -245,7 +246,4 @@ var predictPartyVictory = function(senateStr) { ----------------------- -

- - - +

diff --git "a/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" "b/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" index 42e6d2c3c7..89cc492754 100644 --- "a/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" @@ -1,7 +1,8 @@

- - + + +

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

# 654.最大二叉树 @@ -356,7 +357,4 @@ var constructMaximumBinaryTree = function (nums) { ----------------------- -

- - - +

diff --git "a/problems/0657.\346\234\272\345\231\250\344\272\272\350\203\275\345\220\246\350\277\224\345\233\236\345\216\237\347\202\271.md" "b/problems/0657.\346\234\272\345\231\250\344\272\272\350\203\275\345\220\246\350\277\224\345\233\236\345\216\237\347\202\271.md" index 590e3ee0e4..841b355d05 100644 --- "a/problems/0657.\346\234\272\345\231\250\344\272\272\350\203\275\345\220\246\350\277\224\345\233\236\345\216\237\347\202\271.md" +++ "b/problems/0657.\346\234\272\345\231\250\344\272\272\350\203\275\345\220\246\350\277\224\345\233\236\345\216\237\347\202\271.md" @@ -1,7 +1,8 @@

- - + + +

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

# 657. 机器人能否返回原点 @@ -150,7 +151,4 @@ var judgeCircle = function(moves) { ----------------------- -

- - - +

diff --git "a/problems/0669.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0669.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" index 98fb9dd0fc..f6ae146a50 100644 --- "a/problems/0669.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" +++ "b/problems/0669.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" @@ -1,7 +1,8 @@

- - + + +

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

> 如果不对递归有深刻的理解,本题有点难 @@ -406,7 +407,4 @@ var trimBST = function (root,low,high) { ----------------------- -

- - - +

diff --git "a/problems/0673.\346\234\200\351\225\277\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227\347\232\204\344\270\252\346\225\260.md" "b/problems/0673.\346\234\200\351\225\277\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227\347\232\204\344\270\252\346\225\260.md" index 4143276bc7..d15ecbb91b 100644 --- "a/problems/0673.\346\234\200\351\225\277\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227\347\232\204\344\270\252\346\225\260.md" +++ "b/problems/0673.\346\234\200\351\225\277\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227\347\232\204\344\270\252\346\225\260.md" @@ -1,7 +1,8 @@

- - + + +

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

# 673.最长递增子序列的个数 @@ -360,7 +361,4 @@ var findNumberOfLIS = function(nums) { ----------------------- -

- - - +

diff --git "a/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" "b/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" index afdfdfec8b..740b0ce70e 100644 --- "a/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" +++ "b/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" @@ -1,7 +1,8 @@

- - + + +

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

## 674. 最长连续递增序列 @@ -262,7 +263,4 @@ const findLengthOfLCIS = (nums) => { ----------------------- -

- - - +

diff --git "a/problems/0684.\345\206\227\344\275\231\350\277\236\346\216\245.md" "b/problems/0684.\345\206\227\344\275\231\350\277\236\346\216\245.md" index e5cd416c90..bc8b22f5fc 100644 --- "a/problems/0684.\345\206\227\344\275\231\350\277\236\346\216\245.md" +++ "b/problems/0684.\345\206\227\344\275\231\350\277\236\346\216\245.md" @@ -1,7 +1,8 @@

- - + + +

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

@@ -347,7 +348,4 @@ var findRedundantConnection = function(edges) { ----------------------- -

- - - +

diff --git "a/problems/0685.\345\206\227\344\275\231\350\277\236\346\216\245II.md" "b/problems/0685.\345\206\227\344\275\231\350\277\236\346\216\245II.md" index c7af6484a5..184c3caa97 100644 --- "a/problems/0685.\345\206\227\344\275\231\350\277\236\346\216\245II.md" +++ "b/problems/0685.\345\206\227\344\275\231\350\277\236\346\216\245II.md" @@ -1,7 +1,8 @@

- - + + +

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

# 685.冗余连接II @@ -600,7 +601,4 @@ var findRedundantDirectedConnection = function(edges) { ----------------------- -

- - - +

diff --git "a/problems/0700.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\220\234\347\264\242.md" "b/problems/0700.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\220\234\347\264\242.md" index 3ebdaa493f..f8d99c81f0 100644 --- "a/problems/0700.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\220\234\347\264\242.md" +++ "b/problems/0700.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\220\234\347\264\242.md" @@ -1,7 +1,8 @@

- - + + +

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

# 700.二叉搜索树中的搜索 @@ -336,7 +337,4 @@ var searchBST = function (root, val) { ----------------------- -

- - - +

diff --git "a/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" "b/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" index 536e0778a1..5d63ce58e3 100644 --- "a/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" +++ "b/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" @@ -1,7 +1,8 @@

- - + + +

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

# 701.二叉搜索树中的插入操作 @@ -503,7 +504,4 @@ var insertIntoBST = function (root, val) { ``` ----------------------- -

- - - +

diff --git "a/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" "b/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" index ac5cacdfc8..bb10143f7d 100644 --- "a/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" +++ "b/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" @@ -1,7 +1,8 @@

- - + + +

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

## 704. 二分查找 @@ -524,7 +525,4 @@ class Solution { ``` ----------------------- -

- - - +

diff --git "a/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" "b/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" index e8711723a5..145efa18de 100644 --- "a/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" +++ "b/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" @@ -1,7 +1,8 @@

- - + + +

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

> 听说这道题目把链表常见的五个操作都覆盖了? @@ -1146,7 +1147,4 @@ class MyLinkedList { ----------------------- -

- - - +

diff --git "a/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271.md" "b/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271.md" index fbaf635e3c..afa2e2f6a0 100644 --- "a/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271.md" +++ "b/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271.md" @@ -1,7 +1,8 @@

- - + + +

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

## 714. 买卖股票的最佳时机含手续费 @@ -291,7 +292,4 @@ var maxProfit = function(prices, fee) { ----------------------- -

- - - +

diff --git "a/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" "b/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" index b598195095..b64d91d29c 100644 --- "a/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" +++ "b/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" @@ -1,7 +1,8 @@

- - + + +

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

## 714.买卖股票的最佳时机含手续费 @@ -184,7 +185,4 @@ const maxProfit = (prices,fee) => { ----------------------- -

- - - +

diff --git "a/problems/0718.\346\234\200\351\225\277\351\207\215\345\244\215\345\255\220\346\225\260\347\273\204.md" "b/problems/0718.\346\234\200\351\225\277\351\207\215\345\244\215\345\255\220\346\225\260\347\273\204.md" index adbd1dee4b..ec2a436632 100644 --- "a/problems/0718.\346\234\200\351\225\277\351\207\215\345\244\215\345\255\220\346\225\260\347\273\204.md" +++ "b/problems/0718.\346\234\200\351\225\277\351\207\215\345\244\215\345\255\220\346\225\260\347\273\204.md" @@ -1,7 +1,8 @@

- - + + +

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

## 718. 最长重复子数组 @@ -298,7 +299,4 @@ const findLength = (nums1, nums2) => { ----------------------- -

- - - +

diff --git "a/problems/0724.\345\257\273\346\211\276\346\225\260\347\273\204\347\232\204\344\270\255\345\277\203\347\264\242\345\274\225.md" "b/problems/0724.\345\257\273\346\211\276\346\225\260\347\273\204\347\232\204\344\270\255\345\277\203\347\264\242\345\274\225.md" index a3b9c8f158..c347acc552 100644 --- "a/problems/0724.\345\257\273\346\211\276\346\225\260\347\273\204\347\232\204\344\270\255\345\277\203\347\264\242\345\274\225.md" +++ "b/problems/0724.\345\257\273\346\211\276\346\225\260\347\273\204\347\232\204\344\270\255\345\277\203\347\264\242\345\274\225.md" @@ -1,7 +1,8 @@

- - + + +

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

# 724.寻找数组的中心下标 @@ -141,7 +142,4 @@ var pivotIndex = function(nums) { ----------------------- -

- - - +

diff --git "a/problems/0738.\345\215\225\350\260\203\351\200\222\345\242\236\347\232\204\346\225\260\345\255\227.md" "b/problems/0738.\345\215\225\350\260\203\351\200\222\345\242\236\347\232\204\346\225\260\345\255\227.md" index 1733284a44..6baaa82761 100644 --- "a/problems/0738.\345\215\225\350\260\203\351\200\222\345\242\236\347\232\204\346\225\260\345\255\227.md" +++ "b/problems/0738.\345\215\225\350\260\203\351\200\222\345\242\236\347\232\204\346\225\260\345\255\227.md" @@ -1,7 +1,8 @@

- - + + +

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

## 738.单调递增的数字 @@ -229,7 +230,4 @@ var monotoneIncreasingDigits = function(n) { ----------------------- -

- - - +

diff --git "a/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" "b/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" index 2cd42e6969..fe9f9f7a85 100644 --- "a/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" +++ "b/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" @@ -1,7 +1,8 @@

- - + + +

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

# 739. 每日温度 @@ -307,7 +308,4 @@ var dailyTemperatures = function(temperatures) { ----------------------- -

- - - +

diff --git "a/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" "b/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" index 5f9ae3adf4..ce7b310c2e 100644 --- "a/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" +++ "b/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" @@ -1,7 +1,8 @@

- - + + +

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

## 746. 使用最小花费爬楼梯 @@ -266,7 +267,4 @@ var minCostClimbingStairs = function(cost) { ``` ----------------------- -

- - - +

diff --git "a/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" "b/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" index 3087fe18a5..40318726ff 100644 --- "a/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" +++ "b/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" @@ -1,7 +1,8 @@

- - + + +

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

## 763.划分字母区间 @@ -175,7 +176,4 @@ var partitionLabels = function(s) { ----------------------- -

- - - +

diff --git "a/problems/0841.\351\222\245\345\214\231\345\222\214\346\210\277\351\227\264.md" "b/problems/0841.\351\222\245\345\214\231\345\222\214\346\210\277\351\227\264.md" index 52f574ea20..406a116d58 100644 --- "a/problems/0841.\351\222\245\345\214\231\345\222\214\346\210\277\351\227\264.md" +++ "b/problems/0841.\351\222\245\345\214\231\345\222\214\346\210\277\351\227\264.md" @@ -1,7 +1,8 @@

- - + + +

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

@@ -269,7 +270,4 @@ var canVisitAllRooms = function(rooms) { ----------------------- -

- - - +

diff --git "a/problems/0844.\346\257\224\350\276\203\345\220\253\351\200\200\346\240\274\347\232\204\345\255\227\347\254\246\344\270\262.md" "b/problems/0844.\346\257\224\350\276\203\345\220\253\351\200\200\346\240\274\347\232\204\345\255\227\347\254\246\344\270\262.md" index 012fea91ba..95cf69c864 100644 --- "a/problems/0844.\346\257\224\350\276\203\345\220\253\351\200\200\346\240\274\347\232\204\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/0844.\346\257\224\350\276\203\345\220\253\351\200\200\346\240\274\347\232\204\345\255\227\347\254\246\344\270\262.md" @@ -1,7 +1,8 @@

- - + + +

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

# 844.比较含退格的字符串 @@ -290,7 +291,4 @@ var backspaceCompare = function(s, t) { ----------------------- -

- - - +

diff --git "a/problems/0860.\346\237\240\346\252\254\346\260\264\346\211\276\351\233\266.md" "b/problems/0860.\346\237\240\346\252\254\346\260\264\346\211\276\351\233\266.md" index f265f21df5..3a36d12801 100644 --- "a/problems/0860.\346\237\240\346\252\254\346\260\264\346\211\276\351\233\266.md" +++ "b/problems/0860.\346\237\240\346\252\254\346\260\264\346\211\276\351\233\266.md" @@ -1,7 +1,8 @@

- - + + +

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

## 860.柠檬水找零 @@ -254,7 +255,4 @@ var lemonadeChange = function(bills) { ``` ----------------------- -

- - - +

diff --git "a/problems/0922.\346\214\211\345\245\207\345\201\266\346\216\222\345\272\217\346\225\260\347\273\204II.md" "b/problems/0922.\346\214\211\345\245\207\345\201\266\346\216\222\345\272\217\346\225\260\347\273\204II.md" index 8e13f610a2..71b13de1d1 100644 --- "a/problems/0922.\346\214\211\345\245\207\345\201\266\346\216\222\345\272\217\346\225\260\347\273\204II.md" +++ "b/problems/0922.\346\214\211\345\245\207\345\201\266\346\216\222\345\272\217\346\225\260\347\273\204II.md" @@ -1,7 +1,8 @@

- - + + +

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

@@ -261,7 +262,4 @@ var sortArrayByParityII = function(nums) { ----------------------- -

- - - +

diff --git "a/problems/0925.\351\225\277\346\214\211\351\224\256\345\205\245.md" "b/problems/0925.\351\225\277\346\214\211\351\224\256\345\205\245.md" index 59056f091f..603040e624 100644 --- "a/problems/0925.\351\225\277\346\214\211\351\224\256\345\205\245.md" +++ "b/problems/0925.\351\225\277\346\214\211\351\224\256\345\205\245.md" @@ -1,7 +1,8 @@

- - + + +

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

# 925.长按键入 @@ -210,7 +211,4 @@ var isLongPressedName = function(name, typed) { ----------------------- -

- - - +

diff --git "a/problems/0941.\346\234\211\346\225\210\347\232\204\345\261\261\350\204\211\346\225\260\347\273\204.md" "b/problems/0941.\346\234\211\346\225\210\347\232\204\345\261\261\350\204\211\346\225\260\347\273\204.md" index 616ee8bc14..24a2906b1b 100644 --- "a/problems/0941.\346\234\211\346\225\210\347\232\204\345\261\261\350\204\211\346\225\260\347\273\204.md" +++ "b/problems/0941.\346\234\211\346\225\210\347\232\204\345\261\261\350\204\211\346\225\260\347\273\204.md" @@ -1,7 +1,8 @@

- - + + +

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

# 941.有效的山脉数组 @@ -167,7 +168,4 @@ var validMountainArray = function(arr) { ----------------------- -

- - - +

diff --git "a/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" "b/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" index fea9eb0d21..d777920535 100644 --- "a/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" @@ -1,7 +1,8 @@

- - + + +

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

## 968.监控二叉树 @@ -504,7 +505,4 @@ int minCameraCover(struct TreeNode* root){ ``` ----------------------- -

- - - +

diff --git "a/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" "b/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" index f629cd1c7f..b1e04c4edc 100644 --- "a/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" +++ "b/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" @@ -1,7 +1,8 @@

- - + + +

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

> 双指针风骚起来,也是无敌 @@ -333,7 +334,4 @@ class Solution { ----------------------- -

- - - +

diff --git "a/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md" "b/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md" index 9f6437fecd..093bfdde71 100644 --- "a/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md" +++ "b/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md" @@ -1,7 +1,8 @@

- - + + +

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

@@ -382,7 +383,4 @@ char ** commonChars(char ** words, int wordsSize, int* returnSize){ ``` ----------------------- -

- - - +

diff --git "a/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" "b/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" index 56407e46fc..45208b0ac8 100644 --- "a/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" +++ "b/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" @@ -1,7 +1,8 @@

- - + + +

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

# 1005.K次取反后最大化的数组和 @@ -211,7 +212,4 @@ var largestSumAfterKNegations = function(nums, k) { ``` ----------------------- -

- - - +

diff --git "a/problems/1035.\344\270\215\347\233\270\344\272\244\347\232\204\347\272\277.md" "b/problems/1035.\344\270\215\347\233\270\344\272\244\347\232\204\347\272\277.md" index 8b004d18a0..5896c6fb93 100644 --- "a/problems/1035.\344\270\215\347\233\270\344\272\244\347\232\204\347\272\277.md" +++ "b/problems/1035.\344\270\215\347\233\270\344\272\244\347\232\204\347\272\277.md" @@ -1,7 +1,8 @@

- - + + +

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

## 1035.不相交的线 @@ -168,7 +169,4 @@ const maxUncrossedLines = (nums1, nums2) => { ----------------------- -

- - - +

diff --git "a/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" "b/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" index 62bf2adb47..91885f8dbd 100644 --- "a/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" +++ "b/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" @@ -1,7 +1,8 @@

- - + + +

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

@@ -269,7 +270,4 @@ var removeDuplicates = function(s) { ----------------------- -

- - - +

diff --git "a/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" "b/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" index 1bb29823e5..842e63aa76 100644 --- "a/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" +++ "b/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" @@ -1,7 +1,8 @@

- - + + +

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

# 动态规划:最后一块石头的重量 II ## 1049. 最后一块石头的重量 II @@ -240,7 +241,4 @@ var lastStoneWeightII = function (stones) { ``` ----------------------- -

- - - +

diff --git "a/problems/1143.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" "b/problems/1143.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" index e4255cc247..39bca419cd 100644 --- "a/problems/1143.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/1143.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" @@ -1,7 +1,8 @@

- - + + +

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

## 1143.最长公共子序列 @@ -215,7 +216,4 @@ const longestCommonSubsequence = (text1, text2) => { ----------------------- -

- - - +

diff --git "a/problems/1207.\347\213\254\344\270\200\346\227\240\344\272\214\347\232\204\345\207\272\347\216\260\346\254\241\346\225\260.md" "b/problems/1207.\347\213\254\344\270\200\346\227\240\344\272\214\347\232\204\345\207\272\347\216\260\346\254\241\346\225\260.md" index 3bae222f1b..e8f0738357 100644 --- "a/problems/1207.\347\213\254\344\270\200\346\227\240\344\272\214\347\232\204\345\207\272\347\216\260\346\254\241\346\225\260.md" +++ "b/problems/1207.\347\213\254\344\270\200\346\227\240\344\272\214\347\232\204\345\207\272\347\216\260\346\254\241\346\225\260.md" @@ -1,7 +1,8 @@

- - + + +

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

# 1207.独一无二的出现次数 @@ -150,7 +151,4 @@ var uniqueOccurrences = function(arr) { ``` ----------------------- -

- - - +

diff --git "a/problems/1221.\345\210\206\345\211\262\345\271\263\350\241\241\345\255\227\347\254\246\344\270\262.md" "b/problems/1221.\345\210\206\345\211\262\345\271\263\350\241\241\345\255\227\347\254\246\344\270\262.md" index f1f01e0fa7..c5f4463f4a 100644 --- "a/problems/1221.\345\210\206\345\211\262\345\271\263\350\241\241\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/1221.\345\210\206\345\211\262\345\271\263\350\241\241\345\255\227\347\254\246\344\270\262.md" @@ -1,7 +1,8 @@

- - + + +

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

# 1221. 分割平衡字符串 @@ -130,7 +131,4 @@ var balancedStringSplit = function(s) { ----------------------- -

- - - +

diff --git "a/problems/1356.\346\240\271\346\215\256\346\225\260\345\255\227\344\272\214\350\277\233\345\210\266\344\270\2131\347\232\204\346\225\260\347\233\256\346\216\222\345\272\217.md" "b/problems/1356.\346\240\271\346\215\256\346\225\260\345\255\227\344\272\214\350\277\233\345\210\266\344\270\2131\347\232\204\346\225\260\347\233\256\346\216\222\345\272\217.md" index 3bc1fb28bb..c721cc0226 100644 --- "a/problems/1356.\346\240\271\346\215\256\346\225\260\345\255\227\344\272\214\350\277\233\345\210\266\344\270\2131\347\232\204\346\225\260\347\233\256\346\216\222\345\272\217.md" +++ "b/problems/1356.\346\240\271\346\215\256\346\225\260\345\255\227\344\272\214\350\277\233\345\210\266\344\270\2131\347\232\204\346\225\260\347\233\256\346\216\222\345\272\217.md" @@ -1,7 +1,8 @@

- - + + +

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

@@ -190,7 +191,4 @@ var sortByBits = function(arr) { ----------------------- -

- - - +

diff --git "a/problems/1365.\346\234\211\345\244\232\345\260\221\345\260\217\344\272\216\345\275\223\345\211\215\346\225\260\345\255\227\347\232\204\346\225\260\345\255\227.md" "b/problems/1365.\346\234\211\345\244\232\345\260\221\345\260\217\344\272\216\345\275\223\345\211\215\346\225\260\345\255\227\347\232\204\346\225\260\345\255\227.md" index 76eb3d36ae..a2592957ce 100644 --- "a/problems/1365.\346\234\211\345\244\232\345\260\221\345\260\217\344\272\216\345\275\223\345\211\215\346\225\260\345\255\227\347\232\204\346\225\260\345\255\227.md" +++ "b/problems/1365.\346\234\211\345\244\232\345\260\221\345\260\217\344\272\216\345\275\223\345\211\215\346\225\260\345\255\227\347\232\204\346\225\260\345\255\227.md" @@ -1,7 +1,8 @@

- - + + +

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

@@ -191,7 +192,4 @@ var smallerNumbersThanCurrent = function(nums) { ----------------------- -

- - - +

diff --git "a/problems/1382.\345\260\206\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\345\217\230\345\271\263\350\241\241.md" "b/problems/1382.\345\260\206\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\345\217\230\345\271\263\350\241\241.md" index b3926933b7..d5b25f84b7 100644 --- "a/problems/1382.\345\260\206\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\345\217\230\345\271\263\350\241\241.md" +++ "b/problems/1382.\345\260\206\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\345\217\230\345\271\263\350\241\241.md" @@ -1,7 +1,8 @@

- - + + +

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

# 1382.将二叉搜索树变平衡 @@ -150,7 +151,4 @@ var balanceBST = function(root) { ----------------------- -

- - - +

diff --git "a/problems/O(n)\347\232\204\347\256\227\346\263\225\345\261\205\347\204\266\350\266\205\346\227\266\344\272\206\357\274\214\346\255\244\346\227\266\347\232\204n\347\251\266\347\253\237\346\230\257\345\244\232\345\244\247\357\274\237.md" "b/problems/O(n)\347\232\204\347\256\227\346\263\225\345\261\205\347\204\266\350\266\205\346\227\266\344\272\206\357\274\214\346\255\244\346\227\266\347\232\204n\347\251\266\347\253\237\346\230\257\345\244\232\345\244\247\357\274\237.md" index 2e9292e95a..4c368ef859 100644 --- "a/problems/O(n)\347\232\204\347\256\227\346\263\225\345\261\205\347\204\266\350\266\205\346\227\266\344\272\206\357\274\214\346\255\244\346\227\266\347\232\204n\347\251\266\347\253\237\346\230\257\345\244\232\345\244\247\357\274\237.md" +++ "b/problems/O(n)\347\232\204\347\256\227\346\263\225\345\261\205\347\204\266\350\266\205\346\227\266\344\272\206\357\274\214\346\255\244\346\227\266\347\232\204n\347\251\266\347\253\237\346\230\257\345\244\232\345\244\247\357\274\237.md" @@ -1,7 +1,8 @@

- - + + +

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

# 程序提交之后为什么会超时?O(n)的算法会超时,n究竟是多大? @@ -229,7 +230,4 @@ Go: ----------------------- -

- - - +

diff --git "a/problems/\344\270\272\344\272\206\347\273\235\346\235\200\347\274\226\350\276\221\350\267\235\347\246\273\357\274\214\345\215\241\345\260\224\345\201\232\344\272\206\344\270\211\346\255\245\351\223\272\345\236\253.md" "b/problems/\344\270\272\344\272\206\347\273\235\346\235\200\347\274\226\350\276\221\350\267\235\347\246\273\357\274\214\345\215\241\345\260\224\345\201\232\344\272\206\344\270\211\346\255\245\351\223\272\345\236\253.md" index 76b23b1586..ae62ec2ccc 100644 --- "a/problems/\344\270\272\344\272\206\347\273\235\346\235\200\347\274\226\350\276\221\350\267\235\347\246\273\357\274\214\345\215\241\345\260\224\345\201\232\344\272\206\344\270\211\346\255\245\351\223\272\345\236\253.md" +++ "b/problems/\344\270\272\344\272\206\347\273\235\346\235\200\347\274\226\350\276\221\350\267\235\347\246\273\357\274\214\345\215\241\345\260\224\345\201\232\344\272\206\344\270\211\346\255\245\351\223\272\345\236\253.md" @@ -1,7 +1,8 @@

- - + + +

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

# 动态规划之编辑距离总结篇 @@ -201,7 +202,4 @@ Go: ----------------------- -

- - - +

diff --git "a/problems/\344\272\214\345\217\211\346\240\221\344\270\255\351\200\222\345\275\222\345\270\246\347\235\200\345\233\236\346\272\257.md" "b/problems/\344\272\214\345\217\211\346\240\221\344\270\255\351\200\222\345\275\222\345\270\246\347\235\200\345\233\236\346\272\257.md" index 79f231af72..b21c7cfe7b 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\344\270\255\351\200\222\345\275\222\345\270\246\347\235\200\345\233\236\346\272\257.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\344\270\255\351\200\222\345\275\222\345\270\246\347\235\200\345\233\236\346\272\257.md" @@ -1,7 +1,8 @@

- - + + +

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

# 二叉树:以为使用了递归,其实还隐藏着回溯 @@ -517,7 +518,4 @@ var binaryTreePaths = function(root) { ----------------------- -

- - - +

diff --git "a/problems/\344\272\214\345\217\211\346\240\221\346\200\273\347\273\223\347\257\207.md" "b/problems/\344\272\214\345\217\211\346\240\221\346\200\273\347\273\223\347\257\207.md" index 5d3a74f320..26a55a58f9 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\346\200\273\347\273\223\347\257\207.md" @@ -1,7 +1,8 @@

- - + + +

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

# 二叉树:总结篇!(需要掌握的二叉树技能都在这里了) @@ -176,7 +177,4 @@ Go: ----------------------- -

- - - +

diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" index 47c162c174..dab434e69c 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -1,7 +1,8 @@

- - + + +

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

# 二叉树理论基础篇 @@ -228,7 +229,4 @@ function TreeNode(val, left, right) { ----------------------- -

- - - +

diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\347\273\237\344\270\200\350\277\255\344\273\243\346\263\225.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\347\273\237\344\270\200\350\277\255\344\273\243\346\263\225.md" index 486a101e04..075e776eaf 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\347\273\237\344\270\200\350\277\255\344\273\243\346\263\225.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\347\273\237\344\270\200\350\277\255\344\273\243\346\263\225.md" @@ -1,7 +1,8 @@

- - + + +

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

@@ -524,7 +525,4 @@ var postorderTraversal = function(root, res = []) { ----------------------- -

- - - +

diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" index c5c920723c..379fe40aba 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" @@ -1,7 +1,8 @@

- - + + +

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

# 二叉树的迭代遍历 @@ -455,7 +456,4 @@ var postorderTraversal = function(root, res = []) { ----------------------- -

- - - +

diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" index 49851f3997..875e6169df 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" @@ -1,7 +1,8 @@

- - + + +

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

@@ -409,7 +410,4 @@ int* postorderTraversal(struct TreeNode* root, int* returnSize){ ``` ----------------------- -

- - - +

diff --git "a/problems/\345\205\263\344\272\216\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\214\344\275\240\344\270\215\347\237\245\351\201\223\347\232\204\351\203\275\345\234\250\350\277\231\351\207\214\357\274\201.md" "b/problems/\345\205\263\344\272\216\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\214\344\275\240\344\270\215\347\237\245\351\201\223\347\232\204\351\203\275\345\234\250\350\277\231\351\207\214\357\274\201.md" index eb8383df7b..c36c8b61f8 100644 --- "a/problems/\345\205\263\344\272\216\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\214\344\275\240\344\270\215\347\237\245\351\201\223\347\232\204\351\203\275\345\234\250\350\277\231\351\207\214\357\274\201.md" +++ "b/problems/\345\205\263\344\272\216\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\214\344\275\240\344\270\215\347\237\245\351\201\223\347\232\204\351\203\275\345\234\250\350\277\231\351\207\214\357\274\201.md" @@ -1,7 +1,8 @@

- - + + +

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

相信每一位录友都接触过时间复杂度,「代码随想录」已经也讲了一百多道经典题目了,是时候对时间复杂度来一个深度的剖析了,很早之前就写过一篇,当时文章还没有人看,Carl感觉有价值的东西值得让更多的人看到,哈哈。 @@ -171,7 +172,4 @@ Go: ----------------------- -

- - - +

diff --git "a/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" "b/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" index 129cd249b8..115ed1e749 100644 --- "a/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" +++ "b/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" @@ -1,7 +1,8 @@

- - + + +

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

# 题目:剑指Offer 05.替换空格 @@ -342,7 +343,4 @@ func replaceSpace(_ s: String) -> String { ----------------------- -

- - - +

diff --git "a/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" "b/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" index ad269c675c..cd09b69017 100644 --- "a/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" @@ -1,7 +1,8 @@

- - + + +

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

> 反转个字符串还有这么多用处? @@ -240,7 +241,4 @@ func reverseString(_ s: inout [Character], startIndex: Int, endIndex: Int) { ----------------------- -

- - - +

diff --git "a/problems/\345\212\250\346\200\201\350\247\204\345\210\222-\350\202\241\347\245\250\351\227\256\351\242\230\346\200\273\347\273\223\347\257\207.md" "b/problems/\345\212\250\346\200\201\350\247\204\345\210\222-\350\202\241\347\245\250\351\227\256\351\242\230\346\200\273\347\273\223\347\257\207.md" index 7347048543..ff16db367d 100644 --- "a/problems/\345\212\250\346\200\201\350\247\204\345\210\222-\350\202\241\347\245\250\351\227\256\351\242\230\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/\345\212\250\346\200\201\350\247\204\345\210\222-\350\202\241\347\245\250\351\227\256\351\242\230\346\200\273\347\273\223\347\257\207.md" @@ -1,7 +1,8 @@

- - + + +

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

之前我们已经把力扣上股票系列的题目都讲过的,但没有来一篇股票总结,来帮大家高屋建瓴,所以总结篇这就来了! @@ -480,7 +481,4 @@ Go: ----------------------- -

- - - +

diff --git "a/problems/\345\212\250\346\200\201\350\247\204\345\210\222\346\200\273\347\273\223\347\257\207.md" "b/problems/\345\212\250\346\200\201\350\247\204\345\210\222\346\200\273\347\273\223\347\257\207.md" index b1331a6b47..5ba23d11e9 100644 --- "a/problems/\345\212\250\346\200\201\350\247\204\345\210\222\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/\345\212\250\346\200\201\350\247\204\345\210\222\346\200\273\347\273\223\347\257\207.md" @@ -1,7 +1,8 @@

- - + + +

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

@@ -131,7 +132,4 @@ ----------------------- -

- - - +

diff --git "a/problems/\345\212\250\346\200\201\350\247\204\345\210\222\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\345\212\250\346\200\201\350\247\204\345\210\222\347\220\206\350\256\272\345\237\272\347\241\200.md" index 70c57a48c2..ce7f6a510e 100644 --- "a/problems/\345\212\250\346\200\201\350\247\204\345\210\222\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\345\212\250\346\200\201\350\247\204\345\210\222\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -1,7 +1,8 @@

- - + + +

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

# 动态规划理论基础 @@ -126,7 +127,4 @@ ----------------------- -

- - - +

diff --git "a/problems/\345\217\214\346\214\207\351\222\210\346\200\273\347\273\223.md" "b/problems/\345\217\214\346\214\207\351\222\210\346\200\273\347\273\223.md" index c3a7d928b9..e67015e8e7 100644 --- "a/problems/\345\217\214\346\214\207\351\222\210\346\200\273\347\273\223.md" +++ "b/problems/\345\217\214\346\214\207\351\222\210\346\200\273\347\273\223.md" @@ -1,7 +1,8 @@

- - + + +

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

> 又是一波总结 @@ -94,7 +95,4 @@ for (int i = 0; i < array.size(); i++) { ----------------------- -

- - - +

diff --git "a/problems/\345\223\210\345\270\214\350\241\250\346\200\273\347\273\223.md" "b/problems/\345\223\210\345\270\214\350\241\250\346\200\273\347\273\223.md" index c16d2b62b3..885dc59a44 100644 --- "a/problems/\345\223\210\345\270\214\350\241\250\346\200\273\347\273\223.md" +++ "b/problems/\345\223\210\345\270\214\350\241\250\346\200\273\347\273\223.md" @@ -1,7 +1,8 @@

- - + + +

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

> 哈希表总结篇如约而至 @@ -125,7 +126,4 @@ std::unordered_map 底层实现为哈希,std::map 和std::multimap 的底层 ----------------------- -

- - - +

diff --git "a/problems/\345\223\210\345\270\214\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\345\223\210\345\270\214\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" index f565246410..445bfed640 100644 --- "a/problems/\345\223\210\345\270\214\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\345\223\210\345\270\214\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -1,7 +1,8 @@

- - + + +

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

@@ -127,7 +128,4 @@ std::unordered_map 底层实现为哈希表,std::map 和std::multimap 的底 ----------------------- -

- - - +

diff --git "a/problems/\345\233\236\346\272\257\346\200\273\347\273\223.md" "b/problems/\345\233\236\346\272\257\346\200\273\347\273\223.md" index 8f4cba198d..7f8a312f8d 100644 --- "a/problems/\345\233\236\346\272\257\346\200\273\347\273\223.md" +++ "b/problems/\345\233\236\346\272\257\346\200\273\347\273\223.md" @@ -1,7 +1,8 @@

- - + + +

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

> 20张树形结构图、14道精选回溯题目,21篇回溯法精讲文章,由浅入深,一气呵成,这是全网最强回溯算法总结! @@ -452,7 +453,4 @@ Go: ----------------------- -

- - - +

diff --git "a/problems/\345\233\236\346\272\257\347\256\227\346\263\225\345\216\273\351\207\215\351\227\256\351\242\230\347\232\204\345\217\246\344\270\200\347\247\215\345\206\231\346\263\225.md" "b/problems/\345\233\236\346\272\257\347\256\227\346\263\225\345\216\273\351\207\215\351\227\256\351\242\230\347\232\204\345\217\246\344\270\200\347\247\215\345\206\231\346\263\225.md" index b397b61ab8..99fff63065 100644 --- "a/problems/\345\233\236\346\272\257\347\256\227\346\263\225\345\216\273\351\207\215\351\227\256\351\242\230\347\232\204\345\217\246\344\270\200\347\247\215\345\206\231\346\263\225.md" +++ "b/problems/\345\233\236\346\272\257\347\256\227\346\263\225\345\216\273\351\207\215\351\227\256\351\242\230\347\232\204\345\217\246\344\270\200\347\247\215\345\206\231\346\263\225.md" @@ -1,7 +1,8 @@

- - + + +

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

# 回溯算法去重问题的另一种写法 @@ -371,7 +372,4 @@ Go: ----------------------- -

- - - +

diff --git "a/problems/\345\233\236\346\272\257\347\256\227\346\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\345\233\236\346\272\257\347\256\227\346\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md" index d8a04582ae..ac31b30b11 100644 --- "a/problems/\345\233\236\346\272\257\347\256\227\346\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\345\233\236\346\272\257\347\256\227\346\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -1,7 +1,8 @@

- - + + +

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

# 回溯算法理论基础 @@ -169,7 +170,4 @@ void backtracking(参数) { ----------------------- -

- - - +

diff --git "a/problems/\345\255\227\347\254\246\344\270\262\346\200\273\347\273\223.md" "b/problems/\345\255\227\347\254\246\344\270\262\346\200\273\347\273\223.md" index f8fc148d57..6c33615857 100644 --- "a/problems/\345\255\227\347\254\246\344\270\262\346\200\273\347\273\223.md" +++ "b/problems/\345\255\227\347\254\246\344\270\262\346\200\273\347\273\223.md" @@ -1,7 +1,8 @@

- - + + +

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

# 字符串:总结篇 @@ -124,7 +125,4 @@ KMP算法是字符串查找最重要的算法,但彻底理解KMP并不容易 ----------------------- -

- - - +

diff --git "a/problems/\346\225\260\347\273\204\346\200\273\347\273\223\347\257\207.md" "b/problems/\346\225\260\347\273\204\346\200\273\347\273\223\347\257\207.md" index 85ab718b87..8d52db2692 100644 --- "a/problems/\346\225\260\347\273\204\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/\346\225\260\347\273\204\346\200\273\347\273\223\347\257\207.md" @@ -1,7 +1,8 @@

- - + + +

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

@@ -143,7 +144,4 @@ Go: ----------------------- -

- - - +

diff --git "a/problems/\346\225\260\347\273\204\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\346\225\260\347\273\204\347\220\206\350\256\272\345\237\272\347\241\200.md" index 6777a8dd15..4031338f96 100644 --- "a/problems/\346\225\260\347\273\204\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\346\225\260\347\273\204\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -1,7 +1,8 @@

- - + + +

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

@@ -118,7 +119,4 @@ public static void test_arr() { ----------------------- -

- - - +

diff --git "a/problems/\346\240\210\344\270\216\351\230\237\345\210\227\346\200\273\347\273\223.md" "b/problems/\346\240\210\344\270\216\351\230\237\345\210\227\346\200\273\347\273\223.md" index 2526d75c4b..2faa27c45f 100644 --- "a/problems/\346\240\210\344\270\216\351\230\237\345\210\227\346\200\273\347\273\223.md" +++ "b/problems/\346\240\210\344\270\216\351\230\237\345\210\227\346\200\273\347\273\223.md" @@ -1,7 +1,8 @@

- - + + +

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

# 栈与队列的理论基础 @@ -175,7 +176,4 @@ Go: ----------------------- -

- - - +

diff --git "a/problems/\346\240\210\344\270\216\351\230\237\345\210\227\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\346\240\210\344\270\216\351\230\237\345\210\227\347\220\206\350\256\272\345\237\272\347\241\200.md" index 2acd1d153b..7a1b484d14 100644 --- "a/problems/\346\240\210\344\270\216\351\230\237\345\210\227\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\346\240\210\344\270\216\351\230\237\345\210\227\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -1,7 +1,8 @@

- - + + +

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

> 来看看栈和队列不为人知的一面 @@ -88,7 +89,4 @@ std::queue> third; // 定义以list为底层容器的队列 ----------------------- -

- - - +

diff --git "a/problems/\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227\357\274\210vector\345\216\237\347\220\206\350\256\262\350\247\243\357\274\211.md" "b/problems/\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227\357\274\210vector\345\216\237\347\220\206\350\256\262\350\247\243\357\274\211.md" index c406076e51..b2a9cf3a55 100644 --- "a/problems/\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227\357\274\210vector\345\216\237\347\220\206\350\256\262\350\247\243\357\274\211.md" +++ "b/problems/\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227\357\274\210vector\345\216\237\347\220\206\350\256\262\350\247\243\357\274\211.md" @@ -1,7 +1,8 @@

- - + + +

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

# 贪心算法:根据身高重建队列(续集) 在讲解[贪心算法:根据身高重建队列](https://programmercarl.com/0406.根据身高重建队列.html)中,我们提到了使用vector(C++中的动态数组)来进行insert操作是费时的。 @@ -174,7 +175,4 @@ Go: ----------------------- -

- - - +

diff --git "a/problems/\347\256\227\346\263\225\346\250\241\346\235\277.md" "b/problems/\347\256\227\346\263\225\346\250\241\346\235\277.md" index 30c626bb4c..853816d27d 100644 --- "a/problems/\347\256\227\346\263\225\346\250\241\346\235\277.md" +++ "b/problems/\347\256\227\346\263\225\346\250\241\346\235\277.md" @@ -1,7 +1,8 @@

- - + + +

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

## 二分查找法 @@ -547,7 +548,4 @@ Go: ----------------------- -

- - - +

diff --git "a/problems/\350\203\214\345\214\205\346\200\273\347\273\223\347\257\207.md" "b/problems/\350\203\214\345\214\205\346\200\273\347\273\223\347\257\207.md" index 01803bbcd1..12120b130a 100644 --- "a/problems/\350\203\214\345\214\205\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/\350\203\214\345\214\205\346\200\273\347\273\223\347\257\207.md" @@ -1,7 +1,8 @@

- - + + +

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

# 听说背包问题很难? 这篇总结篇来拯救你了 年前我们已经把背包问题都讲完了,那么现在我们要对背包问题进行总结一番。 @@ -95,7 +96,4 @@ ----------------------- -

- - - +

diff --git "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" index 9f1136dc75..16be4c67ff 100644 --- "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" +++ "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" @@ -1,7 +1,8 @@

- - + + +

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

# 动态规划:关于01背包问题,你该了解这些! 这周我们正式开始讲解背包问题! @@ -425,7 +426,4 @@ test(); ``` ----------------------- -

- - - +

diff --git "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" index 3296f604e6..5086b25fef 100644 --- "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" +++ "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" @@ -1,7 +1,8 @@

- - + + +

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

# 动态规划:关于01背包问题,你该了解这些!(滚动数组) @@ -317,7 +318,4 @@ test(); ----------------------- -

- - - +

diff --git "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\244\232\351\207\215\350\203\214\345\214\205.md" "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\244\232\351\207\215\350\203\214\345\214\205.md" index 39deb489a6..5f62ccd6a7 100644 --- "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\244\232\351\207\215\350\203\214\345\214\205.md" +++ "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\244\232\351\207\215\350\203\214\345\214\205.md" @@ -1,7 +1,8 @@

- - + + +

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

# 动态规划:关于多重背包,你该了解这些! @@ -203,7 +204,4 @@ Go: ----------------------- -

- - - +

diff --git "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" index d4e71b8992..0801f68b8d 100644 --- "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" +++ "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" @@ -1,7 +1,8 @@

- - + + +

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

# 动态规划:关于完全背包,你该了解这些! ## 完全背包 @@ -343,7 +344,4 @@ function test_completePack2() { ----------------------- -

- - - +

diff --git "a/problems/\350\264\252\345\277\203\347\256\227\346\263\225\346\200\273\347\273\223\347\257\207.md" "b/problems/\350\264\252\345\277\203\347\256\227\346\263\225\346\200\273\347\273\223\347\257\207.md" index 6476b9eed7..85d1ec68af 100644 --- "a/problems/\350\264\252\345\277\203\347\256\227\346\263\225\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/\350\264\252\345\277\203\347\256\227\346\263\225\346\200\273\347\273\223\347\257\207.md" @@ -1,7 +1,8 @@

- - + + +

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

我刚刚开始讲解贪心系列的时候就说了,贪心系列并不打算严格的从简单到困难这么个顺序来讲解。 @@ -159,7 +160,4 @@ Go: ----------------------- -

- - - +

diff --git "a/problems/\350\264\252\345\277\203\347\256\227\346\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\350\264\252\345\277\203\347\256\227\346\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md" index 17fab5a97f..2b5de45c38 100644 --- "a/problems/\350\264\252\345\277\203\347\256\227\346\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\350\264\252\345\277\203\347\256\227\346\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -1,7 +1,8 @@

- - + + +

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

# 关于贪心算法,你该了解这些! @@ -88,7 +89,4 @@ ----------------------- -

- - - +

diff --git "a/problems/\351\223\276\350\241\250\346\200\273\347\273\223\347\257\207.md" "b/problems/\351\223\276\350\241\250\346\200\273\347\273\223\347\257\207.md" index a6b6228bab..ed233d9de6 100644 --- "a/problems/\351\223\276\350\241\250\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/\351\223\276\350\241\250\346\200\273\347\273\223\347\257\207.md" @@ -1,7 +1,8 @@

- - + + +

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

@@ -92,7 +93,4 @@ ----------------------- -

- - - +

diff --git "a/problems/\351\223\276\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\351\223\276\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" index 7e393ff25f..8891c6659e 100644 --- "a/problems/\351\223\276\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\351\223\276\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -1,7 +1,8 @@

- - + + +

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

# 关于链表,你该了解这些! @@ -153,7 +154,4 @@ Go: ----------------------- -

- - - +

diff --git "a/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" "b/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" index 54742cb397..e3c284c0ab 100644 --- "a/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" +++ "b/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" @@ -1,7 +1,8 @@

- - + + +

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

## 面试题 02.07. 链表相交 @@ -252,7 +253,4 @@ var getIntersectionNode = function(headA, headB) { ----------------------- -

- - - +

From 22eead3cf3c1eb36c035accc7b1a3ddd51dc35d1 Mon Sep 17 00:00:00 2001 From: youngyangyang04 <826123027@qq.com> Date: Sun, 21 Nov 2021 16:39:56 +0800 Subject: [PATCH 0049/3019] update --- README.md | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 40b2785742..f12a00e831 100644 --- a/README.md +++ b/README.md @@ -11,10 +11,18 @@ > 6. **转载须知** :以下所有文章皆为我([程序员Carl](https://github.com/youngyangyang04))的原创。引用本项目文章请注明出处,发现恶意抄袭或搬运,会动用法律武器维护自己的权益。让我们一起维护一个良好的技术创作环境!

- - + + +

+ + + + +

+ + # LeetCode 刷题攻略 ## 刷题攻略的背景 From 2a9a7a627c9a71f7b40da7af80448c7976fdde46 Mon Sep 17 00:00:00 2001 From: programmercarl Date: Sun, 21 Nov 2021 16:49:14 +0800 Subject: [PATCH 0050/3019] test --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index f12a00e831..004d322a4e 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,7 @@ > 5. **提交代码**:本项目统一使用C++语言进行讲解,但已经有Java、Python、Go、JavaScript等等多语言版本,感谢[这里的每一位贡献者](https://github.com/youngyangyang04/leetcode-master/graphs/contributors),如果你也想贡献代码点亮你的头像,[点击这里](https://mp.weixin.qq.com/s/tqCxrMEU-ajQumL1i8im9A)了解提交代码的方式。 > 6. **转载须知** :以下所有文章皆为我([程序员Carl](https://github.com/youngyangyang04))的原创。引用本项目文章请注明出处,发现恶意抄袭或搬运,会动用法律武器维护自己的权益。让我们一起维护一个良好的技术创作环境! +

From b697353cbde4a582b2e1ee529407ab65af4b5768 Mon Sep 17 00:00:00 2001 From: youngyangyang04 <826123027@qq.com> Date: Sun, 21 Nov 2021 16:51:43 +0800 Subject: [PATCH 0051/3019] test --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index 004d322a4e..f12a00e831 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,6 @@ > 5. **提交代码**:本项目统一使用C++语言进行讲解,但已经有Java、Python、Go、JavaScript等等多语言版本,感谢[这里的每一位贡献者](https://github.com/youngyangyang04/leetcode-master/graphs/contributors),如果你也想贡献代码点亮你的头像,[点击这里](https://mp.weixin.qq.com/s/tqCxrMEU-ajQumL1i8im9A)了解提交代码的方式。 > 6. **转载须知** :以下所有文章皆为我([程序员Carl](https://github.com/youngyangyang04))的原创。引用本项目文章请注明出处,发现恶意抄袭或搬运,会动用法律武器维护自己的权益。让我们一起维护一个良好的技术创作环境! -

From 434ba4ed39cc52d86b9aa7d2ae16e507d1eddd44 Mon Sep 17 00:00:00 2001 From: mengyuan Date: Mon, 22 Nov 2021 20:04:35 +0800 Subject: [PATCH 0052/3019] =?UTF-8?q?update:=20=E5=B9=B3=E8=A1=A1=E4=BA=8C?= =?UTF-8?q?=E5=8F=89=E6=A0=91js=E7=89=88=E6=9C=AC=E6=A0=BC=E5=BC=8F?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...41\344\272\214\345\217\211\346\240\221.md" | 34 ++++++++----------- 1 file changed, 14 insertions(+), 20 deletions(-) diff --git "a/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" "b/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" index a06bff0e8e..a8dbb0db42 100644 --- "a/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" @@ -606,29 +606,23 @@ func abs(a int)int{ ## JavaScript ```javascript var isBalanced = function(root) { - //还是用递归三部曲 + 后序遍历 左右中 当前左子树右子树高度相差大于1就返回-1 + //还是用递归三部曲 + 后序遍历 左右中 当前左子树右子树高度相差大于1就返回-1 // 1. 确定递归函数参数以及返回值 - const getDepth=function(node){ - // 2. 确定递归函数终止条件 - if(node===null){ - return 0; + const getDepth = function(node) { + // 2. 确定递归函数终止条件 + if(node === null) return 0; + // 3. 确定单层递归逻辑 + let leftDepth = getDepth(node.left); //左子树高度 + let rightDepth = getDepth(node.right); //右子树高度 + if(leftDepth === -1) return -1; + if(rightDepth === -1) return -1; + if(Math.abs(leftDepth - rightDepth) > 1) { + return -1; + } else { + return 1 + Math.max(leftDepth, rightDepth); } - // 3. 确定单层递归逻辑 - let leftDepth=getDepth(node.left);//左子树高度 - if(leftDepth===-1){ - return -1; - } - let rightDepth=getDepth(node.right);//右子树高度 - if(rightDepth===-1){ - return -1; - } - if(Math.abs(leftDepth-rightDepth)>1){ - return -1; - }else{ - return 1+Math.max(leftDepth,rightDepth); - } } - return getDepth(root)===-1?false:true; + return !(getDepth(root) === -1); }; ``` From 407c08457cadf94df46b16bf17231f2fa6d9ec82 Mon Sep 17 00:00:00 2001 From: mengyuan Date: Mon, 22 Nov 2021 20:18:58 +0800 Subject: [PATCH 0053/3019] =?UTF-8?q?update:=20112.=20=E8=B7=AF=E5=BE=84?= =?UTF-8?q?=E6=80=BB=E5=92=8C=20&&=20=E8=B7=AF=E5=BE=84=E6=80=BB=E5=92=8C-?= =?UTF-8?q?ii=20js=E8=BF=AD=E4=BB=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...57\345\276\204\346\200\273\345\222\214.md" | 67 ++++++++++++++++++- 1 file changed, 66 insertions(+), 1 deletion(-) diff --git "a/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" "b/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" index 054b23405e..19f4bcac7e 100644 --- "a/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" +++ "b/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" @@ -614,6 +614,7 @@ func haspathsum(root *treenode,sumnodes *[]int,targetsum int,result *[][]int){ 0112.路径总和 +**递归** ```javascript /** * @param {treenode} root @@ -643,9 +644,38 @@ let haspathsum = function (root, targetsum) { // return haspathsum(root.left, targetsum - root.val) || haspathsum(root.right, targetsum - root.val); }; ``` +**迭代** +```javascript +let hasPathSum = function(root, targetSum) { + if(root === null) return false; + let nodeArr = [root]; + let valArr = [0]; + while(nodeArr.length) { + let curNode = nodeArr.shift(); + let curVal = valArr.shift(); + curVal += curNode.val; + // 为叶子结点,且和等于目标数,返回true + if (curNode.left === null && curNode.right === null && curVal === targetSum) { + return true; + } + // 左节点,将当前的数值也对应记录下来 + if (curNode.left) { + nodeArr.push(curNode.left); + valArr.push(curVal); + } + // 右节点,将当前的数值也对应记录下来 + if (curNode.right) { + nodeArr.push(curNode.right); + valArr.push(curVal); + } + } + return false; +}; +``` 0113.路径总和-ii +**递归** ```javascript let pathsum = function (root, targetsum) { // 递归法 @@ -677,7 +707,7 @@ let pathsum = function (root, targetsum) { return res; }; ``` -113 路径总和 精简版 +**递归 精简版** ```javascript var pathsum = function(root, targetsum) { //递归方法 @@ -701,6 +731,41 @@ var pathsum = function(root, targetsum) { return resPath; }; ``` +**迭代** +```javascript +let pathSum = function(root, targetSum) { + if(root === null) return []; + let nodeArr = [root]; + let resArr = []; // 记录符合目标和的返回路径 + let tempArr = [[]]; // 对应路径 + let countArr = [0]; //对应和 + while(nodeArr.length) { + let curNode = nodeArr.shift(); + let curVal = countArr.shift(); + let curNodeArr = tempArr.shift(); + curVal += curNode.val; + curNodeArr.push(curNode.val); + // 为叶子结点,且和等于目标数,将此次结果数组push进返回数组中 + if (curNode.left === null && curNode.right === null && curVal === targetSum) { + resArr.push(curNodeArr); + } + // 左节点,将当前的和及对应路径也对应记录下来 + if (curNode.left) { + nodeArr.push(curNode.left); + countArr.push(curVal); + tempArr.push([...curNodeArr]); + } + // 右节点,将当前的和及对应路径也对应记录下来 + if (curNode.right) { + nodeArr.push(curNode.right); + countArr.push(curVal); + tempArr.push([...curNodeArr]); + } + } + return resArr; +}; +``` + From 7cef253757777c2dbb92a7cb164357c4303c022c Mon Sep 17 00:00:00 2001 From: LiHua <1985390347@qq.com> Date: Tue, 23 Nov 2021 18:33:52 +0800 Subject: [PATCH 0054/3019] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BA=86121.?= =?UTF-8?q?=E4=B9=B0=E5=8D=96=E8=82=A1=E7=A5=A8=E7=9A=84=E6=9C=80=E4=BD=B3?= =?UTF-8?q?=E6=97=B6=E6=9C=BA=E7=9A=84java=E9=A2=98=E8=A7=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...00\344\275\263\346\227\266\346\234\272.md" | 64 +++++++++---------- 1 file changed, 32 insertions(+), 32 deletions(-) diff --git "a/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" "b/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" index 3aff6b891c..89f0637a55 100644 --- "a/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" +++ "b/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" @@ -195,23 +195,26 @@ public: ## 其他语言版本 Java: + +> 贪心法: + ```java -// 贪心思路 class Solution { public int maxProfit(int[] prices) { - int minprice = Integer.MAX_VALUE; - int maxprofit = 0; - for (int i = 0; i < prices.length; i++) { - if (prices[i] < minprice) { - minprice = prices[i]; - } else if (prices[i] - minprice > maxprofit) { - maxprofit = prices[i] - minprice; - } + // 找到一个最小的购入点 + int low = Integer.MAX_VALUE; + // res不断更新,直到数组循环完毕 + int res = 0; + for(int i = 0; i < prices.length; i++){ + low = Math.min(prices[i], low); + res = Math.max(prices[i] - low, res); } - return maxprofit; + return res; } } ``` +> 动态规划:版本一 + ```java // 解法1 class Solution { @@ -233,30 +236,27 @@ class Solution { } ``` -``` java -class Solution { // 动态规划解法 - public int maxProfit(int[] prices) { - // 可交易次数 - int k = 1; - // [天数][交易次数][是否持有股票] - int[][][] dp = new int[prices.length][k + 1][2]; - - // bad case - dp[0][0][0] = 0; - dp[0][0][1] = Integer.MIN_VALUE; - dp[0][1][0] = Integer.MIN_VALUE; - dp[0][1][1] = -prices[0]; - - for (int i = 1; i < prices.length; i++) { - for (int j = k; j >= 1; j--) { - // dp公式 - dp[i][j][0] = Math.max(dp[i - 1][j][0], dp[i - 1][j][1] + prices[i]); - dp[i][j][1] = Math.max(dp[i - 1][j][1], dp[i - 1][j - 1][0] - prices[i]); - } - } +> 动态规划:版本二 - return dp[prices.length - 1][k][0] > 0 ? dp[prices.length - 1][k][0] : 0; +``` java +class Solution { + public int maxProfit(int[] prices) { + int[] dp = new int[2]; + dp[0] = -prices[0]; + dp[1] = 0; + // 可以参考斐波那契问题的优化方式 + // dp[0] 和 dp[1], 其实是第 0 天的数据 + // 所以我们从 i=1 开始遍历数组,一共有 prices.length 天, + // 所以是 i<=prices.length + for (int i = 1; i <= prices.length; i++) { + int temp = dp[0]; + // 前一天持有;或当天买入 + dp[0] = Math.max(temp, -prices[i - 1]); + // 前一天卖出;或当天卖出, 当天要卖出,得前一天持有才行 + dp[1] = Math.max(dp[1], temp + prices[i - 1]); } + return dp[1]; + } } ``` From e6f059f545e560e3b22cd3d9a9f5c76a65fb53bd Mon Sep 17 00:00:00 2001 From: Guanzhong Pan Date: Tue, 23 Nov 2021 10:43:17 +0000 Subject: [PATCH 0055/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200232.=E7=94=A8?= =?UTF-8?q?=E6=A0=88=E5=AE=9E=E7=8E=B0=E9=98=9F=E5=88=97.md=20C=E8=AF=AD?= =?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 --- ...36\347\216\260\351\230\237\345\210\227.md" | 77 +++++++++++++++++++ 1 file changed, 77 insertions(+) diff --git "a/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" "b/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" index 0e4a5d6dd7..d4933af6dd 100644 --- "a/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" +++ "b/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" @@ -349,6 +349,83 @@ MyQueue.prototype.empty = function() { }; ``` +C: +```C +/* +1.两个type为int的数组(栈),大小为100 + 第一个栈stackIn用来存放数据,第二个栈stackOut作为辅助用来输出数据 +2.两个指针stackInTop和stackOutTop,分别指向栈顶 +*/ +typedef struct { + int stackInTop, stackOutTop; + int stackIn[100], stackOut[100]; +} MyQueue; + +/* +1.开辟一个队列的大小空间 +2.将指针stackInTop和stackOutTop初始化为0 +3.返回开辟的队列 +*/ +MyQueue* myQueueCreate() { + MyQueue* queue = (MyQueue*)malloc(sizeof(MyQueue)); + queue->stackInTop = 0; + queue->stackOutTop = 0; + return queue; +} + +/* +将元素存入第一个栈中,存入后栈顶指针+1 +*/ +void myQueuePush(MyQueue* obj, int x) { + obj->stackIn[(obj->stackInTop)++] = x; +} + +/* +1.若输出栈为空且当第一个栈中有元素(stackInTop>0时),将第一个栈中元素复制到第二个栈中(stack2[stackTop2++] = stack1[--stackTop1]) +2.将栈顶元素保存 +3.当stackTop2>0时,将第二个栈中元素复制到第一个栈中(stack1[stackTop1++] = stack2[--stackTop2]) +*/ +int myQueuePop(MyQueue* obj) { + //优化:复制栈顶指针,减少对内存的访问次数 + int stackInTop = obj->stackInTop; + int stackOutTop = obj->stackOutTop; + //若输出栈为空 + if(stackOutTop == 0) { + //将第一个栈中元素复制到第二个栈中 + while(stackInTop > 0) { + obj->stackOut[stackOutTop++] = obj->stackIn[--stackInTop]; + } + } + //将第二个栈中栈顶元素(队列的第一个元素)出栈,并保存 + int top = obj->stackOut[--stackOutTop]; + //将输出栈中元素放回输入栈中 + while(stackOutTop > 0) { + obj->stackIn[stackInTop++] = obj->stackOut[--stackOutTop]; + } + //更新栈顶指针 + obj->stackInTop = stackInTop; + obj->stackOutTop = stackOutTop; + //返回队列中第一个元素 + return top; +} + +//返回输入栈中的栈底元素 +int myQueuePeek(MyQueue* obj) { + return obj->stackIn[0]; +} + +//若栈顶指针均为0,则代表队列为空 +bool myQueueEmpty(MyQueue* obj) { + return obj->stackInTop == 0 && obj->stackOutTop == 0; +} + +//将栈顶指针置0 +void myQueueFree(MyQueue* obj) { + obj->stackInTop = 0; + obj->stackOutTop = 0; +} +``` + -----------------------

From 71f1410d8d0d9d71d9208b6a6ee098c70b3d3303 Mon Sep 17 00:00:00 2001 From: LiHua <1985390347@qq.com> Date: Wed, 24 Nov 2021 09:25:23 +0800 Subject: [PATCH 0056/3019] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BA=86121?= =?UTF-8?q?=E5=8A=A8=E6=80=81=E8=A7=84=E5=88=92=E7=89=88=E6=9C=AC=E4=BA=8C?= =?UTF-8?q?=E7=9A=84=E8=A7=A3=E9=A2=98=E4=BB=A3=E7=A0=81^C=E9=A2=98?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...4\346\234\200\344\275\263\346\227\266\346\234\272.md" | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git "a/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" "b/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" index 89f0637a55..45b61666bc 100644 --- "a/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" +++ "b/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" @@ -249,11 +249,14 @@ class Solution { // 所以我们从 i=1 开始遍历数组,一共有 prices.length 天, // 所以是 i<=prices.length for (int i = 1; i <= prices.length; i++) { - int temp = dp[0]; // 前一天持有;或当天买入 - dp[0] = Math.max(temp, -prices[i - 1]); + dp[0] = Math.max(dp[0], -prices[i - 1]); + // 如果 dp[0] 被更新,那么 dp[1] 肯定会被更新为正数的 dp[1] + // 而不是 dp[0]+prices[i-1]==0 的0, + // 所以这里使用会改变的dp[0]也是可以的 + // 当然 dp[1] 初始值为 0 ,被更新成 0 也没影响 // 前一天卖出;或当天卖出, 当天要卖出,得前一天持有才行 - dp[1] = Math.max(dp[1], temp + prices[i - 1]); + dp[1] = Math.max(dp[1], dp[0] + prices[i - 1]); } return dp[1]; } From eacf15d7a3a8042eb8c0181c9d7fb8a438f39e17 Mon Sep 17 00:00:00 2001 From: LiHua <1985390347@qq.com> Date: Wed, 24 Nov 2021 09:31:54 +0800 Subject: [PATCH 0057/3019] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BA=86122?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E7=A9=BA=E9=97=B4=E7=9A=84java=E9=A2=98?= =?UTF-8?q?=E8=A7=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\344\275\263\346\227\266\346\234\272II.md" | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" index d4575bd6ec..5b11756390 100644 --- "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" +++ "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" @@ -167,6 +167,25 @@ class Solution { // 动态规划 } ``` +```java +// 优化空间 +class Solution { + public int maxProfit(int[] prices) { + int[] dp=new int[2]; + // 0表示持有,1表示卖出 + dp[0]=-prices[0]; + dp[1]=0; + for(int i=1; i<=prices.length; i++){ + // 前一天持有; 或当天卖出然后买入 + dp[0]=Math.max(dp[0], dp[1]-prices[i-1]); + // 前一天卖出; 或当天卖出,当天卖出,得先持有 + dp[1]=Math.max(dp[1], dp[0]+prices[i-1]); + } + return dp[1]; + } +} +``` + ### Python From 5fc35368c1feba9a87cea44d603ebb8b646e8654 Mon Sep 17 00:00:00 2001 From: LiHua <1985390347@qq.com> Date: Wed, 24 Nov 2021 09:37:18 +0800 Subject: [PATCH 0058/3019] =?UTF-8?q?=E7=BB=9F=E4=B8=80=E4=BA=86123?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E7=A9=BA=E9=97=B4=E5=86=99=E6=B3=95=E7=9A=84?= =?UTF-8?q?java=E8=A7=A3=E9=A2=98=E4=BB=A3=E7=A0=81=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...344\275\263\346\227\266\346\234\272III.md" | 41 +++++++++++-------- 1 file changed, 24 insertions(+), 17 deletions(-) diff --git "a/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" "b/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" index 9c2699781a..db3f027899 100644 --- "a/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" +++ "b/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" @@ -188,7 +188,7 @@ dp[1] = max(dp[1], dp[0] - prices[i]); 如果dp[1]取dp[1],即保持买入股 ## 其他语言版本 -Java: +### Java ```java // 版本一 @@ -221,25 +221,30 @@ class Solution { // 版本二: 空间优化 class Solution { public int maxProfit(int[] prices) { - int len = prices.length; - int[] dp = new int[5]; - dp[1] = -prices[0]; - dp[3] = -prices[0]; - - for (int i = 1; i < len; i++) { - dp[1] = Math.max(dp[1], dp[0] - prices[i]); - dp[2] = Math.max(dp[2], dp[1] + prices[i]); - dp[3] = Math.max(dp[3], dp[2] - prices[i]); - dp[4] = Math.max(dp[4], dp[3] + prices[i]); + int[] dp=new int[4]; + // 存储两天的状态就行了 + // dp[0]代表第一次买入 + dp[0]=-prices[0]; + // dp[1]代表第一次卖出 + dp[1]=0; + // dp[2]代表第二次买入 + dp[2]=-prices[0]; + // dp[3]代表第二次卖出 + dp[3]=0; + for(int i=1; i<=prices.length; i++){ + // 要么保持不变,要么没有就买,有了就卖 + dp[0]=Math.max(dp[0], -prices[i-1]); + dp[1]=Math.max(dp[1], dp[0]+prices[i-1]); + // 这已经是第二天了,所以得加上前一天卖出去的价格 + dp[2]=Math.max(dp[2], dp[1]-prices[i-1]); + dp[3]=Math.max(dp[3], dp[2]+prices[i-1]); } - - return dp[4]; + return dp[3]; } } ``` - -Python: +### Python > 版本一: ```python @@ -308,7 +313,7 @@ func max(a,b int)int{ -JavaScript: +### JavaScript > 版本一: @@ -347,7 +352,7 @@ const maxProfit = prices => { }; ``` -Go: +### Go > 版本一: ```go @@ -381,5 +386,7 @@ func max(a, b int) int { ``` + + -----------------------
From e9f7683d4679a6126907134ba4c623267b1ba951 Mon Sep 17 00:00:00 2001 From: LiHua <1985390347@qq.com> Date: Wed, 24 Nov 2021 10:11:18 +0800 Subject: [PATCH 0059/3019] =?UTF-8?q?=E6=9B=B4=E6=8D=A2=E4=BA=86188?= =?UTF-8?q?=E4=B8=80=E7=BB=B4=E6=95=B0=E7=BB=84java=E8=A7=A3=E9=A2=98?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\344\275\263\346\227\266\346\234\272IV.md" | 33 +++++++++++++------ 1 file changed, 23 insertions(+), 10 deletions(-) diff --git "a/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" "b/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" index 73861b35d1..0e898b43e3 100644 --- "a/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" +++ "b/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" @@ -222,19 +222,32 @@ class Solution { //版本三:一维 dp数组 class Solution { public int maxProfit(int k, int[] prices) { - //在版本二的基础上,由于我们只关心前一天的股票买入情况,所以只存储前一天的股票买入情况 - if(prices.length==0)return 0; - int[] dp=new int[2*k+1]; - for (int i = 1; i <2*k ; i+=2) { - dp[i]=-prices[0]; + if(prices.length == 0){ + return 0; } - for (int i = 0; i Date: Wed, 24 Nov 2021 15:33:59 +0800 Subject: [PATCH 0060/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20232.=E7=94=A8?= =?UTF-8?q?=E6=A0=88=E5=AE=9E=E7=8E=B0=E9=98=9F=E5=88=97=20Swift=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...36\347\216\260\351\230\237\345\210\227.md" | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git "a/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" "b/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" index 0e4a5d6dd7..6e247d1d28 100644 --- "a/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" +++ "b/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" @@ -349,6 +349,43 @@ MyQueue.prototype.empty = function() { }; ``` +Swift: +```swift +class MyQueue { + + var stackIn = [Int]() + var stackOut = [Int]() + + init() {} + + /** Push element x to the back of queue. */ + func push(_ x: Int) { + stackIn.append(x) + } + + /** Removes the element from in front of queue and returns that element. */ + func pop() -> Int { + if stackOut.isEmpty { + while !stackIn.isEmpty { + stackOut.append(stackIn.popLast()!) + } + } + return stackOut.popLast() ?? -1 + } + + /** Get the front element. */ + func peek() -> Int { + let res = pop() + stackOut.append(res) + return res + } + + /** Returns whether the queue is empty. */ + func empty() -> Bool { + return stackIn.isEmpty && stackOut.isEmpty + } +} +``` -----------------------
From 30886018c4fc1174914a7db707c15879fc9c6392 Mon Sep 17 00:00:00 2001 From: LiHua <1985390347@qq.com> Date: Wed, 24 Nov 2021 16:12:39 +0800 Subject: [PATCH 0061/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=BA=86309?= =?UTF-8?q?=E5=92=8C714=E8=82=A1=E7=A5=A8=E9=97=AE=E9=A2=98=E4=B8=80?= =?UTF-8?q?=E7=BB=B4=E6=95=B0=E7=BB=84=E4=BC=98=E5=8C=96=E7=A9=BA=E9=97=B4?= =?UTF-8?q?=E7=9A=84java=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...53\345\206\267\345\206\273\346\234\237.md" | 23 +++++++++++++++++++ ...53\346\211\213\347\273\255\350\264\271.md" | 18 +++++++++++++++ 2 files changed, 41 insertions(+) diff --git "a/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" "b/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" index 8520e65525..8c6ab288d3 100644 --- "a/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" +++ "b/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" @@ -185,6 +185,29 @@ class Solution { } ``` +```java +// 一维数组优化 +class Solution { + public int maxProfit(int[] prices) { + // dp[2]和dp[3]用来存储冷冻期的数据 + int[] dp=new int[4]; + // 0表示持有,1表示卖出 + dp[0] = -prices[0]; + dp[1] = 0; + for(int i = 1; i <= prices.length; i++){ + // 使用临时变量来保存dp[0], dp[2] + // 因为马上dp[0]和dp[2]的数据都会变 + int temp = dp[0]; + int temp1 = dp[2]; + dp[0] = Math.max(dp[0], Math.max(dp[3], dp[1]) - prices[i-1]); + dp[1] = Math.max(dp[1], dp[3]); + dp[2] = temp + prices[i-1]; + dp[3] = temp1; + } + return Math.max(dp[3],Math.max(dp[1],dp[2])); + } +} +``` Python: diff --git "a/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271.md" "b/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271.md" index afa2e2f6a0..964d5ea9ec 100644 --- "a/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271.md" +++ "b/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271.md" @@ -195,8 +195,26 @@ class Solution { // 动态规划 } ``` +```java +// 一维数组优化 +class Solution { + public int maxProfit(int[] prices, int fee) { + int[] dp = new int[2]; + dp[0] = -prices[0]; + dp[1] = 0; + for (int i = 1; i <= prices.length; i++) { + dp[0] = Math.max(dp[0], dp[1] - prices[i - 1]); + dp[1] = Math.max(dp[1], dp[0] + prices[i - 1] - fee); + } + return dp[1]; + } +} +``` + + Python: + ```python class Solution: # 贪心思路 def maxProfit(self, prices: List[int], fee: int) -> int: From 95a8752dd5d3c522b16b237a37df09e03379b35e Mon Sep 17 00:00:00 2001 From: LiHua <1985390347@qq.com> Date: Wed, 24 Nov 2021 16:19:34 +0800 Subject: [PATCH 0062/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E4=BA=86121?= =?UTF-8?q?=E7=9A=84=E4=B8=80=E7=BB=B4=E6=95=B0=E7=BB=84=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E7=A9=BA=E9=97=B4=E7=9A=84java=E4=BB=A3=E7=A0=81=E6=B3=A8?= =?UTF-8?q?=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...234\200\344\275\263\346\227\266\346\234\272.md" | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git "a/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" "b/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" index 45b61666bc..2815cd4728 100644 --- "a/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" +++ "b/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" @@ -194,7 +194,7 @@ public: ## 其他语言版本 -Java: +### Java > 贪心法: @@ -242,11 +242,12 @@ class Solution { class Solution { public int maxProfit(int[] prices) { int[] dp = new int[2]; + // 记录一次交易,一次交易有买入卖出两种状态 + // 0代表持有,1代表卖出 dp[0] = -prices[0]; dp[1] = 0; // 可以参考斐波那契问题的优化方式 - // dp[0] 和 dp[1], 其实是第 0 天的数据 - // 所以我们从 i=1 开始遍历数组,一共有 prices.length 天, + // 我们从 i=1 开始遍历数组,一共有 prices.length 天, // 所以是 i<=prices.length for (int i = 1; i <= prices.length; i++) { // 前一天持有;或当天买入 @@ -263,7 +264,7 @@ class Solution { } ``` -Python: +### Python > 贪心法: ```python @@ -307,7 +308,8 @@ class Solution: return dp[(length-1) % 2][1] ``` -Go: +### Go + ```Go func maxProfit(prices []int) int { length:=len(prices) @@ -334,7 +336,7 @@ func max(a,b int)int { } ``` -JavaScript: +### JavaScript > 动态规划 From aa5498df7882df5cd42eedb34f96df9c662b0eb2 Mon Sep 17 00:00:00 2001 From: LiHua <1985390347@qq.com> Date: Wed, 24 Nov 2021 16:22:07 +0800 Subject: [PATCH 0063/3019] =?UTF-8?q?=E6=A0=BC=E5=BC=8F=E5=8C=96=E4=BA=861?= =?UTF-8?q?22=E7=9A=84=E4=B8=80=E7=BB=B4=E6=95=B0=E7=BB=84java=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=EF=BC=8C=E5=85=B6=E5=AE=9E=E5=B0=B1=E6=98=AF=E5=8A=A0?= =?UTF-8?q?=E4=BA=86=E7=A9=BA=E6=A0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...234\200\344\275\263\346\227\266\346\234\272II.md" | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" index 5b11756390..e2464a0368 100644 --- "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" +++ "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" @@ -171,15 +171,15 @@ class Solution { // 动态规划 // 优化空间 class Solution { public int maxProfit(int[] prices) { - int[] dp=new int[2]; + int[] dp = new int[2]; // 0表示持有,1表示卖出 - dp[0]=-prices[0]; - dp[1]=0; - for(int i=1; i<=prices.length; i++){ + dp[0] = -prices[0]; + dp[1] = 0; + for(int i = 1; i <= prices.length; i++){ // 前一天持有; 或当天卖出然后买入 - dp[0]=Math.max(dp[0], dp[1]-prices[i-1]); + dp[0] = Math.max(dp[0], dp[1] - prices[i-1]); // 前一天卖出; 或当天卖出,当天卖出,得先持有 - dp[1]=Math.max(dp[1], dp[0]+prices[i-1]); + dp[1] = Math.max(dp[1], dp[0] + prices[i-1]); } return dp[1]; } From 6bc248031953b214a2d08fc5180938048a099940 Mon Sep 17 00:00:00 2001 From: LiHua <1985390347@qq.com> Date: Wed, 24 Nov 2021 16:26:02 +0800 Subject: [PATCH 0064/3019] =?UTF-8?q?=E6=A0=BC=E5=BC=8F=E5=8C=96=E4=BA=861?= =?UTF-8?q?23=E4=B8=80=E7=BB=B4=E6=95=B0=E7=BB=84=E7=A9=BA=E9=97=B4?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E7=9A=84java=E4=BB=A3=E7=A0=81=EF=BC=8C?= =?UTF-8?q?=E5=B9=B6=E6=9B=B4=E6=AD=A3=E4=BA=86=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...344\275\263\346\227\266\346\234\272III.md" | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git "a/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" "b/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" index db3f027899..3d67ec874d 100644 --- "a/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" +++ "b/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" @@ -221,23 +221,23 @@ class Solution { // 版本二: 空间优化 class Solution { public int maxProfit(int[] prices) { - int[] dp=new int[4]; - // 存储两天的状态就行了 - // dp[0]代表第一次买入 - dp[0]=-prices[0]; - // dp[1]代表第一次卖出 - dp[1]=0; - // dp[2]代表第二次买入 - dp[2]=-prices[0]; - // dp[3]代表第二次卖出 - dp[3]=0; - for(int i=1; i<=prices.length; i++){ + int[] dp = new int[4]; + // 存储两次交易的状态就行了 + // dp[0]代表第一次交易的买入 + dp[0] = -prices[0]; + // dp[1]代表第一次交易的卖出 + dp[1] = 0; + // dp[2]代表第二次交易的买入 + dp[2] = -prices[0]; + // dp[3]代表第二次交易的卖出 + dp[3] = 0; + for(int i = 1; i <= prices.length; i++){ // 要么保持不变,要么没有就买,有了就卖 - dp[0]=Math.max(dp[0], -prices[i-1]); - dp[1]=Math.max(dp[1], dp[0]+prices[i-1]); - // 这已经是第二天了,所以得加上前一天卖出去的价格 - dp[2]=Math.max(dp[2], dp[1]-prices[i-1]); - dp[3]=Math.max(dp[3], dp[2]+prices[i-1]); + dp[0] = Math.max(dp[0], -prices[i-1]); + dp[1] = Math.max(dp[1], dp[0]+prices[i-1]); + // 这已经是第二次交易了,所以得加上前一次交易卖出去的收获 + dp[2] = Math.max(dp[2], dp[1]-prices[i-1]); + dp[3] = Math.max(dp[3], dp[2]+ prices[i-1]); } return dp[3]; } From 7575cfd43163d35096512c4ff75b40b578ff4f3a Mon Sep 17 00:00:00 2001 From: LiHua <1985390347@qq.com> Date: Wed, 24 Nov 2021 16:28:54 +0800 Subject: [PATCH 0065/3019] =?UTF-8?q?=E6=9B=B4=E6=AD=A3=E4=BA=86188?= =?UTF-8?q?=E8=82=A1=E7=A5=A8=E9=97=AE=E9=A2=98=E4=B8=80=E7=BB=B4=E6=95=B0?= =?UTF-8?q?=E7=BB=84=E7=A9=BA=E9=97=B4=E4=BC=98=E5=8C=96=E7=9A=84java?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\344\275\263\346\227\266\346\234\272IV.md" | 22 +++++++++---------- 1 file changed, 10 insertions(+), 12 deletions(-) diff --git "a/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" "b/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" index 0e898b43e3..537ccd4aac 100644 --- "a/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" +++ "b/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" @@ -165,7 +165,7 @@ public: ## 其他语言版本 -Java: +### Java ```java // 版本一: 三维 dp数组 @@ -228,9 +228,9 @@ class Solution { if(k == 0){ return 0; } - // 其实就是123题的扩展,123题只用记录2天的状态 - // 这里记录k天的状态就行了 - // 每天都有买入,卖出两个状态,所以要乘 2 + // 其实就是123题的扩展,123题只用记录2次交易的状态 + // 这里记录k次交易的状态就行了 + // 每次交易都有买入,卖出两个状态,所以要乘 2 int[] dp = new int[2 * k]; // 按123题解题格式那样,做一个初始化 for(int i = 0; i < dp.length / 2; i++){ @@ -246,15 +246,15 @@ class Solution { dp[j + 1] = Math.max(dp[j + 1], dp[j] + prices[i - 1]); } } - // 返回最后一天卖出状态的结果就行了 + // 返回最后一次交易卖出状态的结果就行了 return dp[dp.length - 1]; } } ``` - -Python: +### Python 版本一 + ```python class Solution: def maxProfit(self, k: int, prices: List[int]) -> int: @@ -285,8 +285,9 @@ class Solution: dp[j] = max(dp[j],dp[j-1]+prices[i]) return dp[2*k] ``` -Go: +### Go 版本一: + ```go // 买卖股票的最佳时机IV 动态规划 // 时间复杂度O(kn) 空间复杂度O(kn) @@ -356,10 +357,7 @@ func max(a,b int)int{ } ``` - - - -Javascript: +### Javascript ```javascript // 方法一:动态规划 From 2517bb603948d44767f629fed00a459663723d4c Mon Sep 17 00:00:00 2001 From: LiHua <1985390347@qq.com> Date: Wed, 24 Nov 2021 21:54:22 +0800 Subject: [PATCH 0066/3019] =?UTF-8?q?=E6=9B=B4=E6=AD=A3=E4=BA=86121?= =?UTF-8?q?=E3=80=81122=E3=80=81123=E3=80=81188md=E6=A0=BC=E5=BC=8F?= =?UTF-8?q?=E9=94=99=E8=AF=AF=EF=BC=8C=E5=A5=BD=E5=BF=83=E5=B9=B2=E4=BA=86?= =?UTF-8?q?=E5=9D=8F=E4=BA=8B=EF=BC=8C=E6=8A=8A=E5=8D=A1=E5=93=A5=E6=A0=BC?= =?UTF-8?q?=E5=BC=8F=E6=94=B9=E4=BA=86=EF=BC=8C=E5=90=93=E6=AD=BB=EF=BC=8C?= =?UTF-8?q?=E8=B5=B6=E7=B4=A7=E6=94=B9=E8=BF=87=E6=9D=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...234\200\344\275\263\346\227\266\346\234\272.md" | 8 ++++---- ...4\200\344\275\263\346\227\266\346\234\272II.md" | 14 ++++++++------ ...\200\344\275\263\346\227\266\346\234\272III.md" | 10 ++++------ ...4\200\344\275\263\346\227\266\346\234\272IV.md" | 10 ++++++---- 4 files changed, 22 insertions(+), 20 deletions(-) diff --git "a/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" "b/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" index 2815cd4728..486e08bda0 100644 --- "a/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" +++ "b/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" @@ -194,7 +194,7 @@ public: ## 其他语言版本 -### Java +Java: > 贪心法: @@ -264,7 +264,7 @@ class Solution { } ``` -### Python +Python: > 贪心法: ```python @@ -308,7 +308,7 @@ class Solution: return dp[(length-1) % 2][1] ``` -### Go +Go: ```Go func maxProfit(prices []int) int { @@ -336,7 +336,7 @@ func max(a,b int)int { } ``` -### JavaScript +JavaScript: > 动态规划 diff --git "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" index e2464a0368..1259aff7ec 100644 --- "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" +++ "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" @@ -131,7 +131,7 @@ public: ## 其他语言版本 -### Java +Java: ```java // 贪心思路 @@ -186,9 +186,8 @@ class Solution { } ``` +Python: - -### Python ```python class Solution: def maxProfit(self, prices: List[int]) -> int: @@ -212,7 +211,8 @@ class Solution: return dp[-1][1] ``` -### Go +Go: + ```golang //贪心算法 func maxProfit(prices []int) int { @@ -248,7 +248,8 @@ func maxProfit(prices []int) int { } ``` -### Javascript +Javascript: + 贪心 ```Javascript var maxProfit = function(prices) { @@ -284,7 +285,8 @@ const maxProfit = (prices) => { }; ``` -### C +C: + ```c int maxProfit(int* prices, int pricesSize){ int result = 0; diff --git "a/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" "b/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" index 3d67ec874d..8fa3a8e061 100644 --- "a/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" +++ "b/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" @@ -188,7 +188,7 @@ dp[1] = max(dp[1], dp[0] - prices[i]); 如果dp[1]取dp[1],即保持买入股 ## 其他语言版本 -### Java +Java: ```java // 版本一 @@ -244,7 +244,7 @@ class Solution { } ``` -### Python +Python: > 版本一: ```python @@ -311,9 +311,7 @@ func max(a,b int)int{ } ``` - - -### JavaScript +JavaScript: > 版本一: @@ -352,7 +350,7 @@ const maxProfit = prices => { }; ``` -### Go +Go: > 版本一: ```go diff --git "a/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" "b/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" index 537ccd4aac..615ebd5c6f 100644 --- "a/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" +++ "b/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" @@ -165,7 +165,7 @@ public: ## 其他语言版本 -### Java +Java: ```java // 版本一: 三维 dp数组 @@ -252,7 +252,8 @@ class Solution { } ``` -### Python +Python: + 版本一 ```python @@ -285,7 +286,8 @@ class Solution: dp[j] = max(dp[j],dp[j-1]+prices[i]) return dp[2*k] ``` -### Go +Go: + 版本一: ```go @@ -357,7 +359,7 @@ func max(a,b int)int{ } ``` -### Javascript +Javascript: ```javascript // 方法一:动态规划 From 09a19372ba0e805e0a5a776bd64434f26f3f72af Mon Sep 17 00:00:00 2001 From: LiHua <1985390347@qq.com> Date: Wed, 24 Nov 2021 22:11:33 +0800 Subject: [PATCH 0067/3019] =?UTF-8?q?=E4=B8=8D=E5=B0=8F=E5=BF=83=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E5=88=B0714=EF=BC=88=E8=B4=AA=E5=BF=83=EF=BC=89?= =?UTF-8?q?=E5=93=AA=E9=87=8C=E5=8E=BB=E4=BA=86=EF=BC=8C=E7=8E=B0=E5=9C=A8?= =?UTF-8?q?=E6=8A=8A=E4=B8=80=E7=BB=B4=E6=95=B0=E7=BB=84=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E7=A9=BA=E9=97=B4=E7=9A=84=E4=BB=A3=E7=A0=81=E9=87=8D=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E8=BF=9B=E4=BA=86=E5=8A=A8=E6=80=81=E8=A7=84=E5=88=92?= =?UTF-8?q?=E9=A2=98=E8=A7=A3=E4=B8=AD=EF=BC=8C=E5=B7=B2=E6=9B=B4=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...0\253\346\211\213\347\273\255\350\264\271.md" | 16 ---------------- ...0\201\350\247\204\345\210\222\357\274\211.md" | 14 ++++++++++++++ 2 files changed, 14 insertions(+), 16 deletions(-) diff --git "a/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271.md" "b/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271.md" index 964d5ea9ec..f7ddeaf74b 100644 --- "a/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271.md" +++ "b/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271.md" @@ -195,22 +195,6 @@ class Solution { // 动态规划 } ``` -```java -// 一维数组优化 -class Solution { - public int maxProfit(int[] prices, int fee) { - int[] dp = new int[2]; - dp[0] = -prices[0]; - dp[1] = 0; - for (int i = 1; i <= prices.length; i++) { - dp[0] = Math.max(dp[0], dp[1] - prices[i - 1]); - dp[1] = Math.max(dp[1], dp[0] + prices[i - 1] - fee); - } - return dp[1]; - } -} -``` - Python: diff --git "a/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" "b/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" index 2b3416d4ca..700b8cde13 100644 --- "a/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" +++ "b/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" @@ -134,6 +134,20 @@ public int maxProfit(int[] prices, int fee) { } return Math.max(dp[len - 1][0], dp[len - 1][1]); } + +// 一维数组优化 +class Solution { + public int maxProfit(int[] prices, int fee) { + int[] dp = new int[2]; + dp[0] = -prices[0]; + dp[1] = 0; + for (int i = 1; i <= prices.length; i++) { + dp[0] = Math.max(dp[0], dp[1] - prices[i - 1]); + dp[1] = Math.max(dp[1], dp[0] + prices[i - 1] - fee); + } + return dp[1]; + } +} ``` Python: From 78bfec77ad2e9800d6cc4980a9ed936286128836 Mon Sep 17 00:00:00 2001 From: youngyangyang04 <826123027@qq.com> Date: Thu, 25 Nov 2021 11:20:04 +0800 Subject: [PATCH 0068/3019] Update --- ...4.\345\212\240\346\262\271\347\253\231.md" | 48 +++++++++---------- ...06\345\217\221\347\263\226\346\236\234.md" | 24 +++++----- ...54\346\260\264\346\211\276\351\233\266.md" | 46 +++++++++--------- ...22\346\200\273\347\273\223\347\257\207.md" | 5 ++ 4 files changed, 62 insertions(+), 61 deletions(-) diff --git "a/problems/0134.\345\212\240\346\262\271\347\253\231.md" "b/problems/0134.\345\212\240\346\262\271\347\253\231.md" index 7d702f420d..c274bd7820 100644 --- "a/problems/0134.\345\212\240\346\262\271\347\253\231.md" +++ "b/problems/0134.\345\212\240\346\262\271\347\253\231.md" @@ -5,7 +5,7 @@

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

-## 134. 加油站 +# 134. 加油站 [力扣题目链接](https://leetcode-cn.com/problems/gas-station/) @@ -23,32 +23,27 @@ 示例 1: 输入: -gas = [1,2,3,4,5] -cost = [3,4,5,1,2] +* gas = [1,2,3,4,5] +* cost = [3,4,5,1,2] 输出: 3 解释: -从 3 号加油站(索引为 3 处)出发,可获得 4 升汽油。此时油箱有 = 0 + 4 = 4 升汽油 -开往 4 号加油站,此时油箱有 4 - 1 + 5 = 8 升汽油 -开往 0 号加油站,此时油箱有 8 - 2 + 1 = 7 升汽油 -开往 1 号加油站,此时油箱有 7 - 3 + 2 = 6 升汽油 -开往 2 号加油站,此时油箱有 6 - 4 + 3 = 5 升汽油 -开往 3 号加油站,你需要消耗 5 升汽油,正好足够你返回到 3 号加油站。 -因此,3 可为起始索引。 +* 从 3 号加油站(索引为 3 处)出发,可获得 4 升汽油。此时油箱有 = 0 + 4 = 4 升汽油 +* 开往 4 号加油站,此时油箱有 4 - 1 + 5 = 8 升汽油 +* 开往 0 号加油站,此时油箱有 8 - 2 + 1 = 7 升汽油 +* 开往 1 号加油站,此时油箱有 7 - 3 + 2 = 6 升汽油 +* 开往 2 号加油站,此时油箱有 6 - 4 + 3 = 5 升汽油 +* 开往 3 号加油站,你需要消耗 5 升汽油,正好足够你返回到 3 号加油站。 +* 因此,3 可为起始索引。 示例 2: 输入: -gas = [2,3,4] -cost = [3,4,3] +* gas = [2,3,4] +* cost = [3,4,3] -输出: -1 -解释: -你不能从 0 号或 1 号加油站出发,因为没有足够的汽油可以让你行驶到下一个加油站。 -我们从 2 号加油站出发,可以获得 4 升汽油。 此时油箱有 = 0 + 4 = 4 升汽油 -开往 0 号加油站,此时油箱有 4 - 3 + 2 = 3 升汽油 -开往 1 号加油站,此时油箱有 3 - 3 + 3 = 3 升汽油 -你无法返回 2 号加油站,因为返程需要消耗 4 升汽油,但是你的油箱只有 3 升汽油。 -因此,无论怎样,你都不可能绕环路行驶一周。 +* 输出: -1 +* 解释: +你不能从 0 号或 1 号加油站出发,因为没有足够的汽油可以让你行驶到下一个加油站。我们从 2 号加油站出发,可以获得 4 升汽油。 此时油箱有 = 0 + 4 = 4 升汽油。开往 0 号加油站,此时油箱有 4 - 3 + 2 = 3 升汽油。开往 1 号加油站,此时油箱有 3 - 3 + 3 = 3 升汽油。你无法返回 2 号加油站,因为返程需要消耗 4 升汽油,但是你的油箱只有 3 升汽油。因此,无论怎样,你都不可能绕环路行驶一周。 ## 暴力方法 @@ -196,7 +191,7 @@ public: ## 其他语言版本 -Java: +### Java ```java // 解法1 class Solution { @@ -239,8 +234,9 @@ class Solution { return index; } } -``` -Python: +``` + +### Python ```python class Solution: def canCompleteCircuit(self, gas: List[int], cost: List[int]) -> int: @@ -257,7 +253,7 @@ class Solution: return start ``` -Go: +### Go ```go func canCompleteCircuit(gas []int, cost []int) int { curSum := 0 @@ -278,7 +274,7 @@ func canCompleteCircuit(gas []int, cost []int) int { } ``` -Javascript: +### Javascript 暴力: ```js var canCompleteCircuit = function(gas, cost) { @@ -343,7 +339,7 @@ var canCompleteCircuit = function(gas, cost) { }; ``` -C: +### C ```c int canCompleteCircuit(int* gas, int gasSize, int* cost, int costSize){ int curSum = 0; diff --git "a/problems/0135.\345\210\206\345\217\221\347\263\226\346\236\234.md" "b/problems/0135.\345\210\206\345\217\221\347\263\226\346\236\234.md" index 76453c6255..2dad6845a7 100644 --- "a/problems/0135.\345\210\206\345\217\221\347\263\226\346\236\234.md" +++ "b/problems/0135.\345\210\206\345\217\221\347\263\226\346\236\234.md" @@ -5,7 +5,7 @@

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

-## 135. 分发糖果 +# 135. 分发糖果 [力扣题目链接](https://leetcode-cn.com/problems/candy/) @@ -19,15 +19,14 @@ 那么这样下来,老师至少需要准备多少颗糖果呢? 示例 1: -输入: [1,0,2] -输出: 5 -解释: 你可以分别给这三个孩子分发 2、1、2 颗糖果。 +* 输入: [1,0,2] +* 输出: 5 +* 解释: 你可以分别给这三个孩子分发 2、1、2 颗糖果。 示例 2: -输入: [1,2,2] -输出: 4 -解释: 你可以分别给这三个孩子分发 1、2、1 颗糖果。 -第三个孩子只得到 1 颗糖果,这已满足上述两个条件。 +* 输入: [1,2,2] +* 输出: 4 +* 解释: 你可以分别给这三个孩子分发 1、2、1 颗糖果。第三个孩子只得到 1 颗糖果,这已满足上述两个条件。 ## 思路 @@ -127,7 +126,7 @@ public: ## 其他语言版本 -Java: +### Java ```java class Solution { /** @@ -161,7 +160,7 @@ class Solution { } ``` -Python: +### Python ```python class Solution: def candy(self, ratings: List[int]) -> int: @@ -175,7 +174,7 @@ class Solution: return sum(candyVec) ``` -Go: +### Go ```golang func candy(ratings []int) int { /**先确定一边,再确定另外一边 @@ -213,7 +212,8 @@ func findMax(num1 int ,num2 int) int{ return num2 } ``` -Javascript: + +### Javascript: ```Javascript var candy = function(ratings) { let candys = new Array(ratings.length).fill(1) diff --git "a/problems/0860.\346\237\240\346\252\254\346\260\264\346\211\276\351\233\266.md" "b/problems/0860.\346\237\240\346\252\254\346\260\264\346\211\276\351\233\266.md" index 3a36d12801..feb2f5a0b3 100644 --- "a/problems/0860.\346\237\240\346\252\254\346\260\264\346\211\276\351\233\266.md" +++ "b/problems/0860.\346\237\240\346\252\254\346\260\264\346\211\276\351\233\266.md" @@ -5,7 +5,7 @@

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

-## 860.柠檬水找零 +# 860.柠檬水找零 [力扣题目链接](https://leetcode-cn.com/problems/lemonade-change/) @@ -20,30 +20,30 @@ 如果你能给每位顾客正确找零,返回 true ,否则返回 false 。 示例 1: -输入:[5,5,5,10,20] -输出:true -解释: -前 3 位顾客那里,我们按顺序收取 3 张 5 美元的钞票。 -第 4 位顾客那里,我们收取一张 10 美元的钞票,并返还 5 美元。 -第 5 位顾客那里,我们找还一张 10 美元的钞票和一张 5 美元的钞票。 -由于所有客户都得到了正确的找零,所以我们输出 true。 +* 输入:[5,5,5,10,20] +* 输出:true +* 解释: + * 前 3 位顾客那里,我们按顺序收取 3 张 5 美元的钞票。 + * 第 4 位顾客那里,我们收取一张 10 美元的钞票,并返还 5 美元。 + * 第 5 位顾客那里,我们找还一张 10 美元的钞票和一张 5 美元的钞票。 + * 由于所有客户都得到了正确的找零,所以我们输出 true。 示例 2: -输入:[5,5,10] -输出:true +* 输入:[5,5,10] +* 输出:true 示例 3: -输入:[10,10] -输出:false +* 输入:[10,10] +* 输出:false 示例 4: -输入:[5,5,10,10,20] -输出:false -解释: -前 2 位顾客那里,我们按顺序收取 2 张 5 美元的钞票。 -对于接下来的 2 位顾客,我们收取一张 10 美元的钞票,然后返还 5 美元。 -对于最后一位顾客,我们无法退回 15 美元,因为我们现在只有两张 10 美元的钞票。 -由于不是每位顾客都得到了正确的找零,所以答案是 false。 +* 输入:[5,5,10,10,20] +* 输出:false +* 解释: + * 前 2 位顾客那里,我们按顺序收取 2 张 5 美元的钞票。 + * 对于接下来的 2 位顾客,我们收取一张 10 美元的钞票,然后返还 5 美元。 + * 对于最后一位顾客,我们无法退回 15 美元,因为我们现在只有两张 10 美元的钞票。 + * 由于不是每位顾客都得到了正确的找零,所以答案是 false。 提示: @@ -124,7 +124,7 @@ public: ## 其他语言版本 -Java: +### Java ```java class Solution { public boolean lemonadeChange(int[] bills) { @@ -153,7 +153,7 @@ class Solution { } ``` -Python: +### Python ```python class Solution: def lemonadeChange(self, bills: List[int]) -> bool: @@ -179,7 +179,7 @@ class Solution: ``` -Go: +### Go ```golang func lemonadeChange(bills []int) bool { @@ -221,7 +221,7 @@ func lemonadeChange(bills []int) bool { } ``` -Javascript: +### Javascript ```Javascript var lemonadeChange = function(bills) { let fiveCount = 0 diff --git "a/problems/\345\212\250\346\200\201\350\247\204\345\210\222\346\200\273\347\273\223\347\257\207.md" "b/problems/\345\212\250\346\200\201\350\247\204\345\210\222\346\200\273\347\273\223\347\257\207.md" index 5ba23d11e9..f4c737f757 100644 --- "a/problems/\345\212\250\346\200\201\350\247\204\345\210\222\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/\345\212\250\346\200\201\350\247\204\345\210\222\346\200\273\347\273\223\347\257\207.md" @@ -115,6 +115,11 @@ 能把本篇中列举的题目都研究通透的话,你的动规水平就已经非常高了。 对付面试已经足够! + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211121223754.png) + +这个图是 [代码随想录知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) 成员:[青](https://wx.zsxq.com/dweb2/index/footprint/185251215558842),所画,总结的非常好,分享给大家。 + 这已经是全网对动规最深刻的讲解系列了。 **其实大家去网上搜一搜也可以发现,能把动态规划讲清楚的资料挺少的,因为动规确实很难!要给别人讲清楚更难!** From 50a12ff215f7859b512e9f4fc7154196be0f56da Mon Sep 17 00:00:00 2001 From: qiuxuewei Date: Thu, 25 Nov 2021 16:24:01 +0800 Subject: [PATCH 0069/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20225.=20=E7=94=A8?= =?UTF-8?q?=E9=98=9F=E5=88=97=E5=AE=9E=E7=8E=B0=E6=A0=88=20Swift=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...27\345\256\236\347\216\260\346\240\210.md" | 119 ++++++++++++++++++ 1 file changed, 119 insertions(+) diff --git "a/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" "b/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" index edb88f3643..be9f1f790e 100644 --- "a/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" +++ "b/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" @@ -598,5 +598,124 @@ MyStack.prototype.empty = function() { ``` +Swift +```Swift +// 定义一个队列数据结构 +class Queue { + var array: [Int] + init() { + array = [Int]() + } + + /** Push element x to the back of queue. */ + func push(_ x: Int) { + array.append(x) + } + + /** Removes the element from in front of queue and returns that element. */ + func pop() -> Int { + if array.isEmpty { + return -1 + } + return array.removeFirst() + } + + /** Get the front element. */ + func peek() -> Int { + if array.isEmpty { + return -1 + } + return array.first! + } + + /** Returns whether the queue is empty. */ + func empty() -> Bool { + return array.isEmpty + } + + func count() -> Int { + return array.count + } +} + +// 使用双队列 +class MyStack { + var queue1: Queue + var queue2: Queue + + init() { + queue1 = Queue() + queue2 = Queue() + } + + func push(_ x: Int) { + queue1.push(x) + } + + func pop() -> Int { + if queue1.empty() { + return -1 + } + while queue1.count() > 1 { + queue2.push(queue1.pop()) + } + let res = queue1.pop() + while !queue2.empty() { + queue1.push(queue2.pop()) + } + return res + } + + func top() -> Int { + if queue1.empty() { + return -1 + } + let res = pop() + push(res) + return res + } + + func empty() -> Bool { + return queue1.empty() && queue2.empty() + } +} + +// 使用单队列 +class MyStack { + var queue: Queue + + init() { + queue = Queue() + } + + func push(_ x: Int) { + queue.push(x) + } + + func pop() -> Int { + if queue.empty() { + return -1 + } + for _ in 1 ..< queue.count() { + queue.push(queue.pop()) + } + return queue.pop() + } + + func top() -> Int { + if queue.empty() { + return -1 + } + let res = pop() + push(res) + return res + } + + func empty() -> Bool { + return queue.empty() + } +} +``` + -----------------------
From 52750d3a17c85ba006eed636f2fd33b6089dd9fa Mon Sep 17 00:00:00 2001 From: Guanzhong Pan Date: Thu, 25 Nov 2021 11:59:19 +0000 Subject: [PATCH 0070/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200020.=E6=9C=89?= =?UTF-8?q?=E6=95=88=E7=9A=84=E6=8B=AC=E5=8F=B7.md=20C=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 --- ...10\347\232\204\346\213\254\345\217\267.md" | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git "a/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" "b/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" index 57aa5a01ec..6c6f0cb735 100644 --- "a/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" +++ "b/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" @@ -283,6 +283,47 @@ var isValid = function(s) { }; ``` +C: +```C +//辅助函数:判断栈顶元素与输入的括号是否为一对。若不是,则返回False +int notMatch(char par, char* stack, int stackTop) { + switch(par) { + case ']': + return stack[stackTop - 1] != '['; + case ')': + return stack[stackTop - 1] != '('; + case '}': + return stack[stackTop - 1] != '{'; + } + return 0; +} + +bool isValid(char * s){ + int strLen = strlen(s); + //开辟栈空间 + char stack[5000]; + int stackTop = 0; + + //遍历字符串 + int i; + for(i = 0; i < strLen; i++) { + //取出当前下标所对应字符 + char tempChar = s[i]; + //若当前字符为左括号,则入栈 + if(tempChar == '(' || tempChar == '[' || tempChar == '{') + stack[stackTop++] = tempChar; + //若当前字符为右括号,且栈中无元素或右括号与栈顶元素不符,返回False + else if(stackTop == 0 || notMatch(tempChar, stack, stackTop)) + return 0; + //当前字符与栈顶元素为一对括号,将栈顶元素出栈 + else + stackTop--; + } + //若栈中有元素,返回False。若没有元素(stackTop为0),返回True + return !stackTop; +} +``` + -----------------------
From b18f227ffb572c08db29f54f66bbc149b5a68d11 Mon Sep 17 00:00:00 2001 From: LiHua <1985390347@qq.com> Date: Thu, 25 Nov 2021 21:26:43 +0800 Subject: [PATCH 0071/3019] =?UTF-8?q?=E5=B0=86=E8=AF=AF=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E5=88=B0122=E8=B4=AA=E5=BF=83=E7=9A=84java=E7=A9=BA=E9=97=B4?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81=E5=8A=A0=E5=88=B0=E4=BA=86?= =?UTF-8?q?122=E5=8A=A8=E6=80=81=E8=A7=84=E5=88=92=E5=A4=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\344\275\263\346\227\266\346\234\272II.md" | 19 ------------ ...01\350\247\204\345\210\222\357\274\211.md" | 29 +++++++++++-------- 2 files changed, 17 insertions(+), 31 deletions(-) diff --git "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" index 1259aff7ec..f6d5906a4a 100644 --- "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" +++ "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" @@ -167,25 +167,6 @@ class Solution { // 动态规划 } ``` -```java -// 优化空间 -class Solution { - public int maxProfit(int[] prices) { - int[] dp = new int[2]; - // 0表示持有,1表示卖出 - dp[0] = -prices[0]; - dp[1] = 0; - for(int i = 1; i <= prices.length; i++){ - // 前一天持有; 或当天卖出然后买入 - dp[0] = Math.max(dp[0], dp[1] - prices[i-1]); - // 前一天卖出; 或当天卖出,当天卖出,得先持有 - dp[1] = Math.max(dp[1], dp[0] + prices[i-1]); - } - return dp[1]; - } -} -``` - Python: ```python diff --git "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" index e701a8216e..8f03e88e4c 100644 --- "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" +++ "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" @@ -147,25 +147,30 @@ class Solution } return dp[n - 1][0]; // 卖出股票收益高于持有股票收益,因此取[0] } +} +``` - // 实现2:变量存储 - // 第一种方法需要用二维数组存储,有空间开销,其实关心的仅仅是前一天的状态,不关注更多的历史信息 - // 因此,可以仅保存前一天的信息存入 dp0、dp1 这 2 个变量即可 - // 时间复杂度:O(n),空间复杂度O(1) +```java +// 优化空间 +class Solution { public int maxProfit(int[] prices) { - int n = prices.length; - int dp0 = 0, dp1 = -prices[0]; // 定义变量,存储初始状态 - for (int i = 1; i < n; ++i) { - int newDp0 = Math.max(dp0, dp1 + prices[i]); // 第 i 天,没有股票 - int newDp1 = Math.max(dp1, dp0 - prices[i]); // 第 i 天,持有股票 - dp0 = newDp0; - dp1 = newDp1; + int[] dp = new int[2]; + // 0表示持有,1表示卖出 + dp[0] = -prices[0]; + dp[1] = 0; + for(int i = 1; i <= prices.length; i++){ + // 前一天持有; 既然不限制交易次数,那么再次买股票时,要加上之前的收益 + dp[0] = Math.max(dp[0], dp[1] - prices[i-1]); + // 前一天卖出; 或当天卖出,当天卖出,得先持有 + dp[1] = Math.max(dp[1], dp[0] + prices[i-1]); } - return dp0; + return dp[1]; } } ``` + + Python: > 版本一: From 1f33812b15367fc21c9498d77f286d4633d3a137 Mon Sep 17 00:00:00 2001 From: LiHua <1985390347@qq.com> Date: Thu, 25 Nov 2021 21:31:13 +0800 Subject: [PATCH 0072/3019] =?UTF-8?q?=E5=88=A0=E5=87=8F=E4=BA=86309?= =?UTF-8?q?=E4=B8=80=E7=BB=B4=E6=95=B0=E7=BB=84=E7=A9=BA=E9=97=B4=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E7=9A=84=E9=83=A8=E5=88=86=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git "a/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" "b/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" index 8c6ab288d3..48106bd8b9 100644 --- "a/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" +++ "b/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" @@ -189,9 +189,8 @@ class Solution { // 一维数组优化 class Solution { public int maxProfit(int[] prices) { - // dp[2]和dp[3]用来存储冷冻期的数据 int[] dp=new int[4]; - // 0表示持有,1表示卖出 + dp[0] = -prices[0]; dp[1] = 0; for(int i = 1; i <= prices.length; i++){ From 486cb9f98511a40008ce4e5fac6fcc4314840e1f Mon Sep 17 00:00:00 2001 From: youngyangyang04 <826123027@qq.com> Date: Fri, 26 Nov 2021 11:40:48 +0800 Subject: [PATCH 0073/3019] Update --- README.md | 10 + ...15\345\273\272\351\230\237\345\210\227.md" | 46 ++--- ...4-\345\206\263\350\265\233\345\234\210.md" | 87 ++++++++ ...25\345\216\273\344\275\225\344\273\216.md" | 88 ++++++++ ...01\346\200\216\344\271\210\345\212\236.md" | 45 ++++ ...33\350\267\237\344\270\215\344\270\212.md" | 55 +++++ ...13\346\213\233\345\274\200\345\245\226.md" | 65 ++++++ ...3\346\213\233\346\200\273\347\273\2231.md" | 194 ++++++++++++++++++ ...3\346\213\233\346\200\273\347\273\2232.md" | 48 +++++ ...3\346\213\233\346\200\273\347\273\2233.md" | 83 ++++++++ .../\351\200\274\347\255\276.md" | 51 +++++ ...55\347\232\204\345\233\260\346\211\260.md" | 54 +++++ 12 files changed, 803 insertions(+), 23 deletions(-) create mode 100644 "problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/offer\345\257\271\346\257\224-\345\206\263\350\265\233\345\234\210.md" create mode 100644 "problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/offer\346\200\273\345\206\263\350\265\233\357\274\214\344\275\225\345\216\273\344\275\225\344\273\216.md" create mode 100644 "problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\344\270\215\345\226\234\346\254\242\345\206\231\344\273\243\347\240\201\346\200\216\344\271\210\345\212\236.md" create mode 100644 "problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\205\245\350\201\214\345\220\216\346\213\205\345\277\203\344\273\243\347\240\201\350\203\275\345\212\233\350\267\237\344\270\215\344\270\212.md" create mode 100644 "problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\347\247\213\346\213\233\345\274\200\345\245\226.md" create mode 100644 "problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\347\247\213\346\213\233\346\200\273\347\273\2231.md" create mode 100644 "problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\347\247\213\346\213\233\346\200\273\347\273\2232.md" create mode 100644 "problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\347\247\213\346\213\233\346\200\273\347\273\2233.md" create mode 100644 "problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\351\200\274\347\255\276.md" create mode 100644 "problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\351\235\236\347\247\221\347\217\255\347\232\204\345\233\260\346\211\260.md" diff --git a/README.md b/README.md index f12a00e831..0fd937f3a8 100644 --- a/README.md +++ b/README.md @@ -124,6 +124,16 @@ ## 知识星球精选 +* [秋招面试,心态很重要!](./problems/知识星球精选/秋招总结3.md) +* [秋招倒霉透顶,触底反弹!](./problems/知识星球精选/秋招总结2.md) +* [无竞赛,无实习,如何秋招?](./problems/知识星球精选/秋招总结1.md) +* [offer总决赛,何去何从!](./problems/知识星球精选/offer总决赛,何去何从.md) +* [入职后担心代码能力跟不上!](./problems/知识星球精选/入职后担心代码能力跟不上.md) +* [秋招进入offer决赛圈!](./problems/知识星球精选/offer对比-决赛圈.md) +* [非科班的困扰](./problems/知识星球精选/非科班的困扰.md) +* [offer的选择-开奖](./problems/知识星球精选/秋招开奖.md) +* [看到代码就抵触!怎么办?](./problems/知识星球精选/不喜欢写代码怎么办.md) +* [遭遇逼签,怎么办?](./problems/知识星球精选/逼签.md) * [HR特意刁难非科班!](./problems/知识星球精选/HR特意刁难非科班.md) * [offer的选择](./problems/知识星球精选/offer的选择.md) * [天下乌鸦一般黑,哪家没有PUA?](./problems/知识星球精选/天下乌鸦一般黑.md) diff --git "a/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" "b/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" index 417fdf466d..1d79209a08 100644 --- "a/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" +++ "b/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" @@ -5,7 +5,7 @@

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

-## 406.根据身高重建队列 +# 406.根据身高重建队列 [力扣题目链接](https://leetcode-cn.com/problems/queue-reconstruction-by-height/) @@ -14,20 +14,20 @@ 请你重新构造并返回输入数组 people 所表示的队列。返回的队列应该格式化为数组 queue ,其中 queue[j] = [hj, kj] 是队列中第 j 个人的属性(queue[0] 是排在队列前面的人)。 示例 1: -输入:people = [[7,0],[4,4],[7,1],[5,0],[6,1],[5,2]] -输出:[[5,0],[7,0],[5,2],[6,1],[4,4],[7,1]] -解释: -编号为 0 的人身高为 5 ,没有身高更高或者相同的人排在他前面。 -编号为 1 的人身高为 7 ,没有身高更高或者相同的人排在他前面。 -编号为 2 的人身高为 5 ,有 2 个身高更高或者相同的人排在他前面,即编号为 0 和 1 的人。 -编号为 3 的人身高为 6 ,有 1 个身高更高或者相同的人排在他前面,即编号为 1 的人。 -编号为 4 的人身高为 4 ,有 4 个身高更高或者相同的人排在他前面,即编号为 0、1、2、3 的人。 -编号为 5 的人身高为 7 ,有 1 个身高更高或者相同的人排在他前面,即编号为 1 的人。 -因此 [[5,0],[7,0],[5,2],[6,1],[4,4],[7,1]] 是重新构造后的队列。 +* 输入:people = [[7,0],[4,4],[7,1],[5,0],[6,1],[5,2]] +* 输出:[[5,0],[7,0],[5,2],[6,1],[4,4],[7,1]] +* 解释: + * 编号为 0 的人身高为 5 ,没有身高更高或者相同的人排在他前面。 + * 编号为 1 的人身高为 7 ,没有身高更高或者相同的人排在他前面。 + * 编号为 2 的人身高为 5 ,有 2 个身高更高或者相同的人排在他前面,即编号为 0 和 1 的人。 + * 编号为 3 的人身高为 6 ,有 1 个身高更高或者相同的人排在他前面,即编号为 1 的人。 + * 编号为 4 的人身高为 4 ,有 4 个身高更高或者相同的人排在他前面,即编号为 0、1、2、3 的人。 + * 编号为 5 的人身高为 7 ,有 1 个身高更高或者相同的人排在他前面,即编号为 1 的人。 + * 因此 [[5,0],[7,0],[5,2],[6,1],[4,4],[7,1]] 是重新构造后的队列。 示例 2: -输入:people = [[6,0],[5,0],[4,0],[3,2],[2,2],[1,4]] -输出:[[4,0],[5,0],[2,2],[3,2],[1,4],[6,0]] +* 输入:people = [[6,0],[5,0],[4,0],[3,2],[2,2],[1,4]] +* 输出:[[4,0],[5,0],[2,2],[3,2],[1,4],[6,0]] 提示: @@ -86,12 +86,12 @@ [[7,0], [7,1], [6,1], [5,0], [5,2],[4,4]] 插入的过程: -插入[7,0]:[[7,0]] -插入[7,1]:[[7,0],[7,1]] -插入[6,1]:[[7,0],[6,1],[7,1]] -插入[5,0]:[[5,0],[7,0],[6,1],[7,1]] -插入[5,2]:[[5,0],[7,0],[5,2],[6,1],[7,1]] -插入[4,4]:[[5,0],[7,0],[5,2],[6,1],[4,4],[7,1]] +* 插入[7,0]:[[7,0]] +* 插入[7,1]:[[7,0],[7,1]] +* 插入[6,1]:[[7,0],[6,1],[7,1]] +* 插入[5,0]:[[5,0],[7,0],[6,1],[7,1]] +* 插入[5,2]:[[5,0],[7,0],[5,2],[6,1],[7,1]] +* 插入[4,4]:[[5,0],[7,0],[5,2],[6,1],[4,4],[7,1]] 此时就按照题目的要求完成了重新排列。 @@ -182,7 +182,7 @@ public: ## 其他语言版本 -Java: +### Java ```java class Solution { public int[][] reconstructQueue(int[][] people) { @@ -203,7 +203,7 @@ class Solution { } ``` -Python: +### Python ```python class Solution: def reconstructQueue(self, people: List[List[int]]) -> List[List[int]]: @@ -219,7 +219,7 @@ class Solution: return que ``` -Go: +### Go ```go func reconstructQueue(people [][]int) [][]int { //先将身高从大到小排序,确定最大个子的相对位置 @@ -269,7 +269,7 @@ func reconstructQueue(people [][]int) [][]int { } ``` -Javascript: +### Javascript ```Javascript var reconstructQueue = function(people) { diff --git "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/offer\345\257\271\346\257\224-\345\206\263\350\265\233\345\234\210.md" "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/offer\345\257\271\346\257\224-\345\206\263\350\265\233\345\234\210.md" new file mode 100644 index 0000000000..1f91730fc8 --- /dev/null +++ "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/offer\345\257\271\346\257\224-\345\206\263\350\265\233\345\234\210.md" @@ -0,0 +1,87 @@ +

+ + + + +# offer选择进入决赛圈.md + +秋招已经结束了,该开奖的差不多都陆续开奖了,很多录友的也进入了offer决赛圈。 + +我每天都在[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)里,回答十几个offer对比的问题,我也是结合自己过来人的经验给大家做做分析,我也选几个案例,在公众号上也给大家分享一下,希望对大家有所启发。 + +以下是知识星球里的部分问答: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211031113844.png) + +C++后端开发 总包40w,这个薪资和岗位很不错了,至于干的活杂不杂 都不是你能打听出来的,要进去,看具体工作,以及领导的具体安排,只有亲自去感受了,才知道是不是打杂。 + +深信服 云计算 大多数是做toB的业务,做私有云,几乎是和硬件设备一起卖,和阿里云,腾讯云,这些公有云厂商不是一个概念的。 + +深信服也不错,但不用奔着云计算这个壳子就去冲 深信服,进去干的活未必和云计算有多关系,而且去深信服 你就能保证不打杂了么? 对吧 + +所以 具体工作内容是 我们控制不了的,知道个大概方向就可以了。 + +去百度吧,挺好的。 + +------------- + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211031105039.png) + +普渡科技 是是一家C轮创业公司,一般创业公司 双休的可能性不太大。而且 看两家给你的薪资,如果算上公积金的话,到手的钱没有百度开的高。 + +应届生去创业公司,有一点吃亏,就是你刚进去,因为你还不能干活,有明显的产出,或者能力有限,并不会给你 期权甚至股份,可能股份兑现不了,但表示的是对候选人的重视程度。 + +创业公司研发流程还不够规范,所谓的野蛮成长 就是没有流程。 **关键是能成长起来 万事大吉,就怕长不起来**。 + +百度虽然是测开的岗位,但薪资开得挺高了,可以看出对你的重视,飞桨深度学习平台部,也很不错,是百度重点打造的深度学习框架。 + +我倾向于选百度,虽然是测开,但进去依然可以学很多东西。 这样稳一些。 + +当然如果你想赌一把,可以去普渡科技,谁也说不好,万一后面起飞了呢。 + +---------- + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211031111110.png) + +双非本,还是电子信息类专业,能拿到这些offer,真的很不容易了👍 + +如果喜欢搞硬件,嵌入式应用方向其实也挺宽的,需求面也很广,华为 中兴,还有一堆手机厂商 新能源车企,智能家居,涉及到物联网的行业,都需要嵌入式开发。 + +中新赛克 也是上市公司,其实和 海康威视 大华股份 都差不多,这几家给薪资都差不多,一样的薪资,你在南京可比在杭州舒服多了啊,而且你家也在南京。 + +如果要真的是去大厂学技术,或者工资特别高,背井离乡也是可以的,但 海康威视 大华股份 估计也没有达到这个程度,薪资也没高出来,甚至可能不如 中新赛克 ,你还有 中新赛克给你的签字费呢。 + +综上,我倾向于 去 中新赛克,在老家,这个薪资不挺舒服的么,南京也很不错。 好好干吧💪 + +------------- + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211031110153.png) + +腾讯 这个部门有点边缘,技术栈比较浅。企业IT部就是做 企业内部应用的,最多也就是 几万人使用吧,大概率也没有机会磨练技术。系统很成熟,当然不加班。 + +百度推荐架构部,还是挺核心的,技术能力 还是比较强的。 **在上海应届生可以落户了,比深圳户口香太多太多了**。 + +至于晋升,百度晋升 一点也不慢,顺利的话,T3 到 T6 可以三年,一般情况是4年, T6跳 腾讯可以对应的是3-1 或者 3-2级别了。 + +至于光环,对个人来说,百度工程师在业内是很受认可的,一点不比腾讯差, 很多人说:拼多多啊,京东啊 市值都超过百度了,百度不是第一梯队了,等等。 + +说实话,**那公司的市值和我们这些码农有关系么**,对吧,**我们对关心的是 自己技术的成长,自己值多少钱,而不是公司值多少钱**。 + +至于薪资,相对于岗位,一年差6w,不算多,倾向于选百度。 + +------------- + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211031105736.png) + +去字节吧, 云存储方向 这个方向值得深耕, 是一个技术驱动的方向,而且各大厂商 都搞分布式存储,就业机会挺多的,再说 字节给的薪资也不错。 + +如果以后想离家近,你可以跳槽 腾讯云 继续做分布式存储,薪资还能涨一波。 + +如果对技术有追求的话,整个技术生涯都是可以认准云存储方向。存储是刚需! + +你可别在准备春招了,这大厂offer 都不要,准备啥 春招啊,哈哈哈,别卷了,休息吧。 + +---------- + +以上就是我在知识星球,针对录友们offer决赛圈的解答,希望对大家也有所帮助。 + diff --git "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/offer\346\200\273\345\206\263\350\265\233\357\274\214\344\275\225\345\216\273\344\275\225\344\273\216.md" "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/offer\346\200\273\345\206\263\350\265\233\357\274\214\344\275\225\345\216\273\344\275\225\344\273\216.md" new file mode 100644 index 0000000000..01745ae3a5 --- /dev/null +++ "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/offer\346\200\273\345\206\263\350\265\233\357\274\214\344\275\225\345\216\273\344\275\225\344\273\216.md" @@ -0,0 +1,88 @@ + +

+ + + + +# offer总决赛,何去何从! + +最近在[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)上,给至少300位录友做了offer选择,准对大家的情况,结合我的经验做一做分析。 + +希望可以给大家带来不一样的分析视角,帮大家少走弯路。 + +以下是我在知识星球里分析的部分案例,公众号上再给大家分享一波。 + +----------- + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211108102416.png) + +1. C++ 后端,客户端,测开,指定选 C++后端啊,这是送分题。 +2. 转型的问题不好回答,各有各的出路,**就算大厂里,95%以上的程序员都不想写代码,就想指点江山**,但为什么大家都在写代码呢,因为出路没有固定的公式,没有固定的方法,很多人完美转型看的是运气,看时机,也看努力,**但最重要的是运气和时机**。 最不缺的就是努力的人,其实大家都挺努力的。 +3. 不会的,大厂里也没有一家语言独大,这种担心没必要。 +4. 不同公司处理情况不一样,甚至每年都会变,大部分都不会黑名单,你这几家都不会。 +5. 你的担心有点过头了,既然你拿到的offer就要对自己有信心,你也不是走后门拿到的offer,对自己能力这么没信心么,进去之后好好干就好了。剩下的交给缘分。 计划的在周密都没有变化快。 +6. 你问的太全面了[捂脸],我都没想到 拿到大厂offer,能但担心出来 这么多事情。已经很周密了👍 + +最后 倾向于你去阿里云吧,这么好的的机会 有啥犹豫的。 + + +----------------- + + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211108103414.png) + +我感觉你不用不甘心大白菜,其实挺好的,客观来看 非科班转码 拿腾信后端开发的 offer 挺不错的。 + +虾皮在公司影响力上 和 腾讯不是一个数量级的。 + +跳槽虽然看base,但也看公司的,腾讯光环加持 比 虾皮可有力多了。 + +腾讯的总包是有点虚(花样有点多),但第一年到 43w了 挺不错的,腾讯好好干,升到高级工程师,在外年很值钱的。 现在这点钱也不算啥。**而且现在应届生薪资真的挺高的,不用在去追高,容易摔到的**。 + +我建议你直接去腾讯就好, 这个选择题 其实挺好选的。 + +------------- + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211108103835.png) + +广州没有百度吧,可以活水到深圳百度,工位很宽敞,比北京工位舒服多了。 + +我倾向于选百度吧,而且百度的岗位也不错,薪资也比 虎牙高(虎牙的股票价值不好说),**虎牙你听说是 965 但未必是 965,可能你已入职项目就忙起来了,瞬间996,这个工作强度都不是永恒的,都是跟着项目走**。 + +广州可选择的互联网公司不错的,你去广州虎牙,一旦离职 其实不太好选下一家。 + +百度 试用期不过,这个感觉有点谣言,哪家大厂都有试用期不过的,不过这个看项目组,整体来说 基本试用期都能过,问题不大。 + +虾皮还在抽盲盒,就不考虑了。 + +去百度吧,好好锻炼几年,然后再找机会 回南方。或者transfer 深圳 也不错。 + +------------ + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211108104558.png) + +1. 公积金可以提出来 80%,包括自己交的和公司交的,还是挺方便的,现在支付宝可以一键提取。剩下的等你买房之后 可以全部提取。 + +2. 如果先去腾讯的话,你去 字节 做客户端更合适一些,而且你还是做 游戏直播的客户端,和腾讯互娱还是很匹配的。 + +至于研究生做客户端亏了 的问题,其实 95% 的研究生 基本都是做研发,后端或者客户端。 + +确实很多人感觉 读个研究生不做算法,不搞AI,和本科生没啥区别,**但事实是 搞算法 搞AI 可能都找不到工作了,那么就没有必要有这个执念**。 + +你现在能拿到 字节offer,也有你是研究生的加持 ,虽然 学历不等于能力,但 人多而卷,用学历晒人是最高效的方式。 + +------------ + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211108104735.png) + + +1. 一般来说管培计划,都是培养企业未来高管的,是很不错的,不同原员工干到高管多难,**但如果参加管培计划,那就不一样的,资源 和 机会 要不正常员工 多很多**, 从 去哪给你的薪资和签字费就能看出来。 不过去哪网的管培其实我不了解,我只是说一说普遍管培的情况。 + +2. 小米有很多东西可以学习? 这个其实 你现在是应届生,去哪家公司 都有很多东西可以学习,这个看具体内容了。 +3. 我感觉不用了吧,这offer也不错啊,当然如果还有激情,再战也可以的。毕竟没啥损失,不过感觉可以休息了,躺平吧。 + +建议再去详细了解一下 去哪网管培计划 的具体内容,因为不同公司 管培计划不太一样,你是 技术岗管培 还是其他方向管培。 + + +以上就是我在知识星球,针对录友们offer决赛圈的解答,希望对大家也有所帮助。 + diff --git "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\344\270\215\345\226\234\346\254\242\345\206\231\344\273\243\347\240\201\346\200\216\344\271\210\345\212\236.md" "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\344\270\215\345\226\234\346\254\242\345\206\231\344\273\243\347\240\201\346\200\216\344\271\210\345\212\236.md" new file mode 100644 index 0000000000..9bc624bbfe --- /dev/null +++ "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\344\270\215\345\226\234\346\254\242\345\206\231\344\273\243\347\240\201\346\200\216\344\271\210\345\212\236.md" @@ -0,0 +1,45 @@ + +# 看到代码就抵触!怎么办? + +最近在[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)里,看到了不少录友,其实是不喜欢写代码,看到 哪些八股文都是很抵触的。 + +其实是一个普遍现象,我在星球里分享了一下,我对这一情况的一些想法。 + +发表在星球里,很快就有了60多个赞,也确实说道大家的心里去了。 + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211019222938.png) + +我在这里再给公众号的录友们也分享一下: + +很多同学不喜欢计算机,也不喜欢写代码,看到各种大堆的面经 八股文,心里是十分抗拒的。 + +所以总是拿一些其他的事情来拖延,最后发现秋招或者春招 完全拖过去了,或者说等求职的时候发现自己完全没有达到应聘的水平,再陷入 深深的焦虑之中。 + +这里有一个很重要的问题,就是**当你发现你不喜欢计算机的时候,那问问自己喜欢什么呢?** + +如果喜欢看电影,逛街,打游戏,甚至格调再高一点 喜欢画画,喜欢音乐,唱歌之类的,这些爱好如果没有达到专业的程度,那么仅仅是日常消遣而已。(甚至是一种逃避) + +**真实情况是大部分人都说不出来自己真正喜欢什么的**。 + +这是中国教育制度的问题,大家从小学、初中、高中、到大学再到工作 就没有时间或者机会去思考自己真正想干什么。 + +别说在校学生了,就互联网大厂的程序员,我敢说 百分之九十以上 都不喜欢写代码,都感觉写代码是最苦逼的,天天对着屏幕,写写一堆正常人看不懂的英文单词,有啥意思,对吧。 + +但为什么大家都依旧写代码呢。 + +**要生活啊,要赚钱啊!** + +那种可以不考虑经济问题,一言不合就寻找人生意义的选手,都是家里有矿的,那种咱们不讨论。 + +还一些同学迷茫的时候,就放空自己。 还有已经工作的,可能会去一趟西藏,“寻找一下生命的意义”。 + +其实我也是不建议的,**放空自己之后,并不会找到 自己真正的方向,只会更迷茫!** + +所以,**当你不知道自己真正喜欢什么的时候,就先把眼前的事情做好吧!** + +如果你知道自己不喜欢计算机,不喜欢写代码,但也不知道自己究竟喜欢什么的时候,那么就先把自己现在该做的事情做好,制定计划,算法题刷题起来,八股文看起来。 + +**这才是是最重要的**。 + +希望对录友们有所启发,加油💪 + diff --git "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\205\245\350\201\214\345\220\216\346\213\205\345\277\203\344\273\243\347\240\201\350\203\275\345\212\233\350\267\237\344\270\215\344\270\212.md" "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\205\245\350\201\214\345\220\216\346\213\205\345\277\203\344\273\243\347\240\201\350\203\275\345\212\233\350\267\237\344\270\215\344\270\212.md" new file mode 100644 index 0000000000..c270452576 --- /dev/null +++ "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\205\245\350\201\214\345\220\216\346\213\205\345\277\203\344\273\243\347\240\201\350\203\275\345\212\233\350\267\237\344\270\215\344\270\212.md" @@ -0,0 +1,55 @@ + +

+ + + + +# 入职后担心代码能力跟不上 + +在[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)上,很多录友已经担心自己去了公司工作以后,代码能力跟不上,会压力很大。 + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211031202952.png) + +其实 星球里 也有很多 已经确定offer的录友,想在入职之前提升代码能力,或者说 如何可以更快的融入项目组。 + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211031203944.png) + +这里我把应届生刚刚工作需要培养的能力都说一说,其实也适用于毕业一两年的录友。 + +## 代码能力 + +练习代码能力最直接的方式就是多写,最简单的是用你的语言写一个管理系统,甚至你每天刷刷题,也是可以的。 + +再直白一遍,不是有26种设计模式,你全都实现一遍,即锻炼 代码能力,还学习了设计模式,等入职之后多看项目代码,看看大家在设计上使用了那种设计模式,或者说哪里还可以优化。 + +设计模式可以说 面试中最实用的知识的,大部分面试内容,工作中其实都用不上,所以大家会发现面试造大炮,工作拧螺丝。 + +## 心态 + +工作之后 从心态上来说,要不怕困难,不怕bug,不怕未知技术。 + +很多同学之所以代码能力弱,**就是太怕 难点**,遇到点 困难 就想:恨不得谁告诉我应该怎么怎么办得了,而不是自己去解决问题。 + +要善于使用搜索引擎,如何所谓问题是一个技术活,有的问题你怎么搜都搜不出来答案,但有的同学一搜 就搜出来了。 + +为什么呢? + +这是遇到问题,提取关键词的能力,很多同学遇到问题,不知道用什么关键词去搜。 + +**还有要有一种 越挫越勇 的精神**,这样你后面 的困难就会越来越少,也会培养出一种自信。 + +写代码也需要自信,工作之后 经常 有一些比较难任务,有的 同学就不敢接,怕做不出来,有的同学就敢接,并不说这位同学技术上一定强,而是他有自信。 + +**这种自信都在是以往 解决各种问题,排查各种bug,练就出来的**。一旦拥有自信,那能量就是 摧枯拉朽,真正的逢山开路遇水搭桥。领导也喜欢这样的组员 + +## 快速成长 + +刚入职的时候,不要怕问问题,不要怕出错,不要怕不好意思。 + +因为你是新人,就算问简单的问题,大家不会嫌弃你,但 这个新人窗口期是很短的,如果 过了几个月 还问一些非常基础的问题,那么 可能职场上就不太好了。 + +所以要在新人窗口期,快速成长,我看过太多的应届生,入职的时候 都是畏头畏尾,然后 过了新人期,能力还没有提高,还问很基础的问题,这样 项目组也不会分给他 有难度的任务,他也就得不到锻炼,越得不到锻炼,就能力越没提升,就越没自信,就越接不到有难度的活,然后陷入死循环! + + +综上,算是从学校到职场的上的一个转变。 希望对大家有帮助。 + diff --git "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\347\247\213\346\213\233\345\274\200\345\245\226.md" "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\347\247\213\346\213\233\345\274\200\345\245\226.md" new file mode 100644 index 0000000000..368596b6c6 --- /dev/null +++ "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\347\247\213\346\213\233\345\274\200\345\245\226.md" @@ -0,0 +1,65 @@ + +

+ + + + +# 开奖 + +最近秋招的录友已经陆续开奖了,同时开奖多少,也是offer选择的一个重要因素,毕竟谁能和钱过意不去呢。 + +[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)里这位录友拿到的百度offer薪资确实很高 + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211023102430.png) + +以下是我的回答: + +-------------- + +百度给你的这个薪资很不错了,百度一向是大厂里最扣的那个,能给这个价位,说明 面试官对你很满意。 + +语言方面你不用过于纠结,其实学什么语言最终都是为了赚钱是吧,钱给到位了,写啥不都一样么。 + +而且如果后面php 要转go的话,你就还很多锻炼的机会,对你晋升十分有好处,php转go,就是把已有的后端代码全部重写,相当于是重构,就是很多工作可以做。 + +**程序员最喜欢的就是重构**,重构既能提升技术,又能向上邀功(**可以理解就是容易晋升**)。 + +如果是稳定的业务,进去大概率是打杂的,因为没有那么多代码可写,进去就改改bug,写写脚本分析分析日志,之类的,总之不会接触到核心代码,没有机会,也没有必要。 + +但如果稳定的业务 代码要重构,就有机会可以读一读核心代码,分析哪里设计的不好,重写一遍,那就可以大展宏图。 + +这就是为什么程序员都喜欢重构。 + +字节的话 后端-系统架构,这个岗位是可以的,但具体什么部门,具体做什么就不太清楚了,至于你说的边缘部门,如果这个部门就叫做系统架构部的话,不可能是边缘部门。系统架构部门还是挺重要的。 + +但如果 字节和百度选的话,我还是倾向于百度。 百度对新人培养还很到位的,比字节强多了。 + +滴滴就不考虑了, 华为 2012实验室中央软件院,其实是不错的,适合好好搞技术,但关于 多媒体开发 这块 要看具体工作了。 +2012 一般薪资开的不高,毕竟不是华为的业务部门。 + +如果百度过几天逼签的话,就签了吧,挺香的,总包都40w+了,百度一向是很抠的,**这个价位,百度是下血本了**。 + +如果还能拖,就等 字节 和 华为开奖,如果能开到 50w+,那就考虑考虑。 + +如果薪资差不多,就百度吧。 + + +------------- + +这位录友最后也决定签百度了。 + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211021234705.png) + +大家也注意到,这位录友是把《代码随想录》刷了两篇,这里我也是推荐大家至少要把 《代码随想录》上的题目刷两遍,才能真正的掌握我讲解的内容,第一遍大家可能就是力扣提交通过了,然后这道题目就过了,没有深入去思考,也没有深入去看我的题解。 + +但第二遍的时候,就可以深入思考 上一道题目与本题之间的联系,动态规划或者二叉树的题目套路 等等了。 + + +还有这位录友在星球里提到,用了我推荐的项目,其实这就是这个:[基于跳表的轻量级KV存储引擎](https://mp.weixin.qq.com/s/i3vJd0nPqQFyLRH9Px84YA) + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211023103749.png) + +这个项目是我18年的时候,业余时间写的,大家如果按照我的代码来,从代码质量到结构设计,绝对是可以拿得出手的。 + +但我没有写这个项目的详细教程,很多基础不太好的录友可能看着有点费劲,后面我会在B站上出一期详细的讲解视频,公众号也会同步文字版本。 + diff --git "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\347\247\213\346\213\233\346\200\273\347\273\2231.md" "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\347\247\213\346\213\233\346\200\273\347\273\2231.md" new file mode 100644 index 0000000000..efec67ee29 --- /dev/null +++ "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\347\247\213\346\213\233\346\200\273\347\273\2231.md" @@ -0,0 +1,194 @@ +

+ + + + +# 无竞赛,无实习,如何秋招? + +今年秋招已经结束了,今天给大家介绍一位知识星球里的录友,我也是见证了他一步一步准备,从绝望到看到希望再绝望到最后拿到offer的全部过程。 + +我记得给他改简历的时候,就说过他冲客户端的话,可能更稳一些。 + +时间总是过得很快,但曾经焦虑的小伙,现在也拿到几个offer了,不一定人人都要冲大厂,卷算法,卷后端,合适自己就好,要不然会把自己搞的很累。 + +以下是他的秋招总结,**写的很用心,说了很多面试中使用的方法,发在[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)里,立刻就引来星球小伙伴们的围观**,算是给星球里明年要秋招的录友做了一个参考。 + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211109231150.png) + +我也征求了他本人的同意,将其分享在公众号上,希望对大家有所启发。 + +以下原文: + + +## 个人背景 + +* 学校:末流985 +* 学历:本科 +* 所学专业:网络空间安全 +* 意向岗位:后端开发 +* 校内学习情况:**无竞赛,无实习经历,自己平时也没有捣鼓过任何项目,只是跟着学校的课程学习**😅。 + +## 秋招时间线 + +(**加粗内容为时间节点**,中间还穿插着各种笔试,这里就不列举了) + +* 二月初-二月中旬:开始刷leetcode +* 三月初-四月初:背八股文,刷题,同时投递实习岗,但由于个人实力不足以及投递时间太晚,一面均未通过 +* 四月-七月:完成学校内的课程,准备专业课考试,同时背八股文,不断地重复刷算法题 +* **七月二十六日**:收到字节跳动**客户端软件安全工程师**岗位的面试邀请 +* 八月初:面试**腾讯**后台开发岗,一面挂 +* **八月十五日**:通过字节的三轮专业面试和一轮hr面拿到**意向书** +* 八月下旬:连续面试美团,蚂蚁;美团一面挂,蚂蚁一面通过 +* **九月三日**:蚂蚁二面通过 +* **九月十三日**:成为字节跳动实习生,提前感受工作内容 +* 九月下旬:**通过五轮面试**:蚂蚁三面和hr面;华为两轮技术面和主管面 +* **十月二十九日**:收到字节正式offer +* **十一月五日**:收到华为意向书 + +小结: + +- 面试的企业:华为,字节,蚂蚁,腾讯,美团 +- 通过的企业:华为,字节(蚂蚁泡池子) +- 字节客户端安全-深圳 +- 华为软开-深圳(东莞):14a +- offer选择:大概率华为,中概率字节,小概率春招再战 + + + +## 技能准备 + +### 算法和数据结构 + +掌握程度: + +- 代码随想录 上的题目:programmercarl.com, 除了单调栈以外的所有题目都做过,且大部分题目**3-7**刷。 +- leetcode总共题数:219题。 +- (https://www.nowcoder.com/ta/huawei )做了68道。 +- 二叉树,红黑树,B+树,数组,链表,堆栈等基础知识均掌握。 + +取得的效果: +- 95%的面试题都能做出来,能讲出时间,空间复杂度和实现思路,但没见过的题目不一定能想出最优解。 +- 华为笔试:200分 (100分通过) ,蚂蚁笔试通过率:70%,网易笔试通过率:80%。 + +### 学习建议 + +按照卡哥**出题的顺序**刷,且要**重复刷**,**不能只是背代码**。还记得春招的时候,面试官问我**两数之和**,我能把代码写出来,但当问到实现思路,为什么这么实现,我答不上来;相类似的还有**二叉树迭代法的统一写法**,当面试官问我为什么这么写的时候,我说不知道:sob: + +把卡哥的题刷得差不多的时候,建议再刷两个专题: + +* 二分法 :https://leetcode-cn.com/problems/search-insert-position/solution/te-bie-hao-yong-de-er-fen-cha-fa-fa-mo-ban-python-/) +* 滑动窗口:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/solution/hua-dong-chuang-kou-by-powcai 。 + + +笔试题刷题要点: + +- **多刷**,**多刷**,**多刷**,**熟悉ACM格式** +- 面试题刷题要点: + - **时间,空间复杂度** + - **优化方案** + - **解题思路** + +以下是本人对各个知识块的掌握情况: + +### 计算机网络 + +掌握程度:应用层到数据链路层常考题都背得很熟悉,但细节没记到位,美团曾经问过我**tcp报文的可选字段**,没答上来。 + +### 操作系统 + +掌握程度:熟悉常见面试题,但当问到特别具体的问题时难以回答,比如:给一个具体的虚拟地址,请求出它映射到的物理地址。 + +### 数据库 + +掌握程度:这部分掌握得最少,仅限于面经里MySQL的面试题:cold_sweat:。 + +### C++ + +掌握程度:基础面试题,stl,面向对象等面试题滚瓜烂熟,但面试的时候语言考察得很少,我遇到过的只有:**malloc**底层实现,**stl**相关底层原理。 + +### 项目 + +提前准备好以下问题的答案: +- 为什么要做这个项目? +- 是**为了解决什么问题**? +- 项目的性质是什么? +- 多少个人完成? +- 你负责了什么工作? +- 有什么亮点?难点? +- 运用了哪些技术? +- 有什么收获? + +## 经验技巧 + +### 模拟问答 + +把**一切**在面试中可能被问到问题的**答案背下来**,假设你的对面有一个面试官,把问题的答案说给他听,这样有几个好处: + +1. **锻炼表达能力**。有过面试经验的同学应该可以感受到,明明自己对一些问题很了解,但面试时讲得磕磕巴巴,逻辑不清晰。 + +提前模拟面试场景,可以帮助你提前发现**语言表述上的问题**,以达到在面试过程中**清晰表述内容**的效果。 + +2. **查漏补缺**。在回答问题时,自己很有可能产生一些**疑问**,而这些疑问也是面试官**特别喜欢**考察的地方。 + +举例: + +- 面试官问:进程和线程的区别? +- 回答: +- 进程切换比线程切换开销小 +- ....... +- 面试官追问:进程切换开销**小在哪**?你能详细描述出进程切换的具体过程吗? + +如果你能在面试前自己发现这个问题,查漏补缺,面试的时候也会更游刃有余。 + +### 转移话题 + +转移话题,即改变话题方向。 + +举例: + +面试官问:为什么使用DH对称加密算法而不使用其他其他对称加密算法? + +两种回答: + +* 这个我没想过:sob: +* 我在完善项目时**不侧重于**将其与其他算法比较,而是把**精力更多地放在**DH算法的改进和优化上。 + +针对第二个回答,面试官会追问,那有哪些优化呢?而这个恰恰是我背得滚瓜烂熟的地方😍。 + +### 关于实习 + +实习重要吗?很重要,我去提前实习后,更清楚了企业看中实习经历的原因:**节省培养成本**,更快上手业务。 + +没有实习经历可以吗?可以,如果时间紧迫,秋招/春招前没有实习机会,那就花时间**把实习期需要学习的事情去做一做**,例如:学习GIT,搭建博客,学习开源项目,学习linux等(当然这些我实习前都没做,是实习的时候才知道的:joy:),这些放在简历上也是加分项。 + + +## 与代码随想录的故事 + +### **算法** + +今年二月初,刷题的时,看到carl哥的题解,觉得讲得很不错,关注了微信公众号:代码随想录。于是我就按照刷题攻略的顺序进行刷题,题解讲得很详细。在秋招前我几乎把当时所有题都刷完,而且刷了好几遍。面试时的出题命中率**真的很高(字节,蚂蚁的出的所有算法题都被包含在内)**,即使不是原题,实现的算法也是类似的。 + + + +### **公众号文章** + +公众号里的文章我也非常喜欢,比如各城市互联网公司的总结,之前一直没太注意这个事情,觉得头部不就是那几个大厂吗?冲就完了。秋招过后觉得这篇文章还是挺有用的,因为眼光**不能只局限于互联网大厂**,并不是任何时候都应该向大厂冲,适合自己才是最重要的。 + + + +### **知识星球** + +后来卡哥开了知识星球,我马上就申请进来了,这段时间一直在打卡,督促自己学习。星球上主要分为两大块内容:打卡系列和问答系列。 + +- 打卡系列,记录着各位同学的每日学习情况,其中有不少文章都总结得用心。 + +- **问答系列(对我帮助很大)**,主要包括**offer选择**,**学习路线**,**学习建议**;每天都会有同学提出自己的问题(当然我也问了不少),carl哥的回答很真诚,**也很有参考价值。** + + + +## 小结 + +秋招已告一段落, 这段时间真的经历了很多事情,虽然现在对结果没有很满意,但也积累了一些经验,走一步看一步吧。 + +大家可以结合着我的经历思考这么一个问题:**知识掌握到什么程度可以拿到一个什么水平的offer**?最后,祝大家都能拿到自己满意的offer~ + diff --git "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\347\247\213\346\213\233\346\200\273\347\273\2232.md" "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\347\247\213\346\213\233\346\200\273\347\273\2232.md" new file mode 100644 index 0000000000..7f4b6770a9 --- /dev/null +++ "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\347\247\213\346\213\233\346\200\273\347\273\2232.md" @@ -0,0 +1,48 @@ +

+ + + +# 倒霉透顶,触底反弹! + +星球里不少录友秋招已经陆续结束了,很多录友都在[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)里写下了自己的秋招总结,但今天这位录友很特殊,甚至我给她修改简历的时候我都“有点愁”。 + +他的秋招过程也是极其坎坷,**逼签、被养鱼最后收到感谢信、校招流程收到实习offer,还有数不清的简历挂……**,可能是太倒霉了,最后触底反弹,接到了百度的offer,虽然是白菜价,但真的很不错了。 + +这篇总结并没有说学习路线,而是说一说她自己的感想,算是另一个维度,感觉会对大家很有帮助,所以我也分享出来。 + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211114111745.png) + +以下星球原文: + +------------- + +秋招终于结束了,收到了百度C++开发、小米C++音视频开发、深信服C++开发、知乎go后端、神策java后端的offer,不是啥大佬,全是烂白菜,但是作为一个双非本的孩子,我觉得已经很幸运了,最终无脑选择了百度,春招还会再冲一波。 + +**星球里的学习气氛很好,向卡尔哥问过好几个问题,每个都挺长,卡尔哥也给我耐心解答过,还帮我改过简历,感谢和大家相遇!** 关于学习路线大佬们说的很详细了,我觉得参考他们的已经足够有价值。**那我就为星球里还在奋斗的兄弟姐妹、以及学弟学妹们写一下我的一些其他的感想**。 + +1、**准备一定要趁早**。我是今年1月份准备的实习,那个时候我连C++智能指针都不知道,就一直陆续学着,6月份上岸滴滴实习,8月下旬跑路,可以说9月份才开始大规模投递。我是很菜的人,还不算勤奋,秋招不至于空手而归就是找实习的时候还有些积淀。 所以最大的感想就是,一定要越早越好,我认为理想的时间节点:3月份去实习,7月份投提前批,所以什么时候去准备可以根据这个时间去准备,当然越早越好。越早企业越缺人,越好进。 + +2、**多面试,哪怕实习不了也要多面试;多投简历,投了就有机会**。我没啥自主学习的意识,只有在要面试的前一个礼拜才会多少看点,还记得当时收到第二天就要腾讯面试的消息,前一天晚上我几乎通宵了,虽然最后还是挂了。但是我当时真的是要面试的恐惧支配着我学习 。 + +3、**八股文、看书和刷题**。实习面试的话看八股文还是能应付过去的,但是我看了大多数八股文感觉千篇一律,想真正化为自己的东西还是要看书,我一般喜欢看书,然后把书上的东西化为自己的理解记在笔记上。 刷题也是,我一般喜欢根据自己的理解把题归类,自己写题解。 + +4、**实习。我觉得实习比较好的时间节点是3月份(或者更早)**,暑假去实习如果不能保证转正,感觉还是有点耽误提前批,提前批是最最最好进大厂的一次。像我的话,白天工作一天到晚上九十点,回家就只想躺着,再遇上比较push的工作环境,做到实习和复习兼顾是有点难的。我觉得核心竞争力应该是基础知识的掌握程度,身边确实没有实习、但是基础和项目足够牛批的人也能进大厂,所以还需要做一个平衡吧。当然也不是劝退,实在平衡不了的话就要要根据自身情况吧。 + +但是实习确实让我简历好过了一些,这个就是实习最大的好处之一,但是我感觉像美团腾讯百度的话,如果笔试面试还可以的话,应该不太卡简历的。字节后端确实有点卡实习,还有一些没那么大但是也很强的厂是卡学历或者实习的。 + +5、还有秋招不要all in,不要all in ,不要all in!!! + +以上就是我的一些感想,可能仁者见仁智者见智,希望大家多多指正。 + +我的秋招真的不是很顺利。逼签、被养鱼最后收到感谢信、校招流程收到实习offer,还有数不清的简历挂……,但是最后也有好的结果了,其实想的比较开,大不了就春招再进大厂呗。本来都要打算春招了,书都买了几本,但是没想到能收到百度意向,已经开始流程推进啦。 + +可能这就是倒霉透顶了就触底反弹吧。**一直觉得自己倒霉透了,奇葩的时间都被我遇上了,但是最后还是被好运眷顾了一下**。我的学校还是双非本,很一般的学校,所以任何时候都有机会,拿到offer不光是实力因素,运气成分也很大,大家一定要多投多面,万一哪次就上岸大厂了。 + +**还是想参与一下春招,但是现在发现躺着太舒服啦**。还是得卷起来,争取以后能每天在星球里打卡哈哈 + +祝愿各位都有理想的offer!所愿皆所得! + +------------- + +以上就是星球里的原文,所以这位录友现在又可以愉快的在星球里,每日打卡了 哈哈哈。 + diff --git "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\347\247\213\346\213\233\346\200\273\347\273\2233.md" "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\347\247\213\346\213\233\346\200\273\347\273\2233.md" new file mode 100644 index 0000000000..895c1b8c38 --- /dev/null +++ "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\347\247\213\346\213\233\346\200\273\347\273\2233.md" @@ -0,0 +1,83 @@ +

+ + + +# 秋招面试,心态很重要! + +其实无论社招,还是校招,心态都很重要,例如,别人那个一堆offer,自己陷入深深的焦虑。 面试分明感觉自己表现的不错,结果就是挂了。面试中遇到了面试官的否定,然后就开始自我怀疑,等等等。 + +如果你也遇到这些问题,可以认真读完[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)里一位录友的总结,他是非科班,机械转码,今年5月份加入的星球,坚持打卡几个月,如果也获得自己心仪的offer,他的心路历程对大家会很有启发。 + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211121093438.png) + +以下原文: + +---------------------- + +写在最前:作为最一般的秋招选手,希望能对和我有相似经历的录友提供一些帮助。 + +1、个人情况:本硕211机械转码,无竞赛,无实习。转码原因:机械的工资真的不高,也不是很喜欢天天画图的生活;导师教本科C/C++语言,研一当助教重新学了一下C++。 + +2、加入星球: + +3月份开学决定转码,3月到5月看C++primer和刷题,之前也是按题目顺序刷,效果一般。我是在LeetCode刷题的时候看到Carl哥的题解,然后关注随想录的GitHub,刷完链表在5.27决定加入的星球(那时还没有优惠,哈哈)现在也快半年了,那段时间是我最慌的时候,毕业课题没做完,秋招准备的也不行。刚看完C++ Primer,刷了几十题的状态。就是在星球打卡的这段时间学习比较认真,让我走过了比较难的一段路,感谢Carl哥的指导和各位录友的输出。(用Forest防止玩手机并记录了一下,6~9月平均学习15000分钟) + +3、秋招历程: + +6月到7月,C++基础就每天看一条《effective C++》,操作系统和计算机网络看书来不及就准备找网上大佬的精华过一遍然后直接面经。我找的是小林大佬的图解网络+图解操作系统,阿秀大佬的面经。(每日一问的主要来源)。 + +刷题大概每日一题+3道随想录+2剑指offer,7月完成一刷,8月底完成二刷。一刷的时候白天在LeetCode提交之后,晚上会在本子上手写总结一遍,理一理思路。二刷的时候就在Typora上快速记录了一下,节约时间。开始面试的时候题量:二刷完随想录+剑指offer,一共350题左右。在刷完以后可以上CodeTop刷各公司部门岗位的高频题。 + +7月份有的公司就陆陆续续开始提前批了,虽然知道提前批不需要笔试多一次机会,但是因为自己简历项目一块还比较单薄,一直没有进行投递。7月底买了《高性能服务器编程》一周多看完,然后做了一个基础的Web服务器,有不懂的就上网搜类似的解析。自己画了一下流程图之类的梳理了一下大概思路。第二个项目就是Carl哥的跳表项目,不是很长,主要是理解跳表这个数据结构,自己画一画就清楚了。 + +8月底开始投简历,对自己定位比较明确,主要以中厂为主,大厂随缘。8月底开始基本每天都有笔试,9月开始面试,一直到10月下旬结束秋招。面试的时候主要是录音,结束后进行面试总结,包括面试问题,手撕代码,面试表现(回答问题思路是否严谨,吐词是否清晰)。 + +其余关于实习,竞赛,面试的经验可以参考星球里其他大佬,哈哈哈。我感触比较深的是心态问题,这里写一写我自己遇到的心态问题和感想。 + + +4、心态很重要: + +心态问题1:同学或室友提前批就拿到了30大几w甚至更高的的offer,自己才开始笔试,说不羡慕是不可能的,有几天晚上都有一点焦虑没有睡好。这可能是因为自己并没有全力以赴,害怕因为自己的不努力而失去机会,后来每天都在按计划学习,每天都比较充实,抱着努力不后悔的心态。当你一心学习的时候就不太会一直考虑让自己焦虑的问题,总之一句话,冲就完事了。 + +心态问题2:总感觉自己没有准备好而不敢投简历。项目没准备或者面经记得不熟。其实投了简历以后还会有一段时间,包括HR筛简历,测评笔试才到面试,所以能投尽早投,在面试之前有压力的时候复习效率比较高的。 + +心态问题3:面试时的心态:心里默念一定要思考一下,然后慢慢说。我有一次面试,前面几个问题不是很顺利,然后问了我一个我会的,我就把我想到的一股脑说出来,我想着终于遇到一个我会的了,自我感觉良好,结果面试结束复盘的时候才发现,那个问题说的不是很全面而且说的比较快,面试官感觉可能很一般。 + +心态问题4:有时可能会紧张的不行,导致本来自己知道或者有思路而因为紧张语无伦次没有表达出来,从而影响面试表现(可以事先准备好自我介绍,流畅的自我介绍在一定程度上可以建立信心,减缓紧张。参加一些模拟面试,找同学模拟或者在网上模拟,还可以录一下视频,看一下自己的表现怎样,有什么地方需要注意;找一些中小厂练手实战也不错) + +心态问题5:面试后的心态,可能有时候觉得自己表现还不错但是面试挂了而愤愤不平,或者和同学一起面一家公司,同学过了,自己挂了。这个时候需要把心态放平,及时总结自己的面试表现,可能没有你想象的那么好。而且面试主观因素挺多的,结果和面试官有很大关系,所以做好自己,尽人事听天命。 + +心态问题6:面试过程中可能会遇到比较不好的面试官,导致面试体验比较差而影响自己的心态,这个时候也是需要及时发泄,不要自我否定或赌气,想着后面还有更多的机会,把更多精力投入到下一次面试或笔试中。我遇到的面试官都比较nice的,希望大家也一样! + +5、写在最后: + +最后对主要面试结果做一个总结:腾讯(笔试挂),百度(二面挂),最后拿到的:华为通用软开,深信服C++开发,科大讯飞C++,中电28所,30所。最后选择离家近的成都华为,总的来说虽然没去成大厂,但是自己已经很满意了。 + +最后的最后:说的有点多,比较啰嗦,感谢大家能看完。希望大家一定不要放弃,相信自己,能拿到自己想要的offer!! + +--------------- + +可以看一下这篇总结在星球下的评论: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211121094859.png) + +**他在星球里知名度还是很高的,为啥知名度这么高呢?** + +因为他坚持几个月的打卡,而且打卡质量非常高,所以星球里的录友们都认识他。 + +来看看他的打卡内容: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211121095337.png) + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211121095415.png) + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211121095712.png) + +我只是随便选了几条,他有将近200条的打卡记录,如果大家也在准备明年秋招,可以进星球里看看他的每日的打卡记录,相信会对规划自己的学习计划,任务安排 都很有帮助。 + +而且星球里的学习氛围会让你惊讶,原来有这么多大佬,还这么努力。 + +![星球氛围好](https://code-thinking-1253855093.file.myqcloud.com/pics/20211018000722.png) + +![看星球里的内容收获满满](https://code-thinking-1253855093.file.myqcloud.com/pics/20211025182654.png) + diff --git "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\351\200\274\347\255\276.md" "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\351\200\274\347\255\276.md" new file mode 100644 index 0000000000..90e4e67d3a --- /dev/null +++ "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\351\200\274\347\255\276.md" @@ -0,0 +1,51 @@ + +# 遭遇逼签,怎么办? + +最近各大公司陆续开奖了,也有不少公司开始逼签了。 + +为什么会有逼签呢,无疑就是 这家公司你不太想去,但还想要一个保底(备胎),同时这家公司也知道自己竞争力可能不是很大,也不想当大家的备胎,所以就要三天内必须签三方。 + +如果是心仪的公司要求三天内签三方,我相信大家就没有被逼签的感觉了,哈哈哈 + +[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)里很多录友都问我,XX公司又要逼签了,怎么办。 我在公众号也分享一下,希望对大家有所帮助。 + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211017093816.png) + +以下是我的回答: + +TPLINK 的嵌入式,确实有点偏,但钱给的还真多 (估计是发现不好找人了)。 + +从发展来看,当然百度 虾皮 是首选,百度一般薪资不高,但我估计 虾皮薪资应该可以。 + +虾皮如果 10月底 才下offer的那,一般有更好的offer的同学 指定早就签了,我估计虾皮是能接受 毁约三方 也就是等你毁约三方,再签虾皮的 (注意,这是我猜的),要不 10月底 在下offer,优秀的毕业生遭抢没了。 所以如果能联系上HR的话,可以问一问,是否一定要三方。 + +你去签 TPLINK 三方的时候 也问问,毁约的流程,TPLINK 什么时候会退给你三方,如果是 TPLINK HR很坚决 不接受毁约的话,就等百度 和虾皮吧,到时候谈薪资的时候 拿tplink这个作为依据,高点要薪资。 + +如果 TPLINK HR 能接受毁约,给出 毁约 流程的话,那就签了。 (但这里不能排除 HR 口是心非,说是能毁约,最后不给你退三方的情况,所以多问问 有没有师兄毁约 TPLINK成功的) + +我当初校招的时候签的就是华为,也给三方了,毁约去的腾讯。我腾讯都入职了,华为才把三方退回来,我在补上三方,所以腾讯是不要求三方的,只要人去了就行。这个也看公司的。 + +------------- + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211017094407.png) + +以下是我的回答: + +7月开始自学c++,秋招就能拿到这些offer已经很棒了👍 + +先看逼签的这两家,其实我都不太了解,我的朋友们主要都在互联网圈,所以 没有认识的朋友在这两家公司。 + +不过 thoughtworks 网评不太好,说是外包公司, 中孚信息 至少是土生土长的企业,做网络安全,也是上市公司,至少会靠谱一些。 + +华为成都 光产品线的测开,如果你想真的有增进技术的心,测开就稍差了一些。 + +相对来说 小米南京的offer 还不错,但还在池子里。 + +如果逼签的话,优先考虑中孚吧。 + +关于 好好沉淀准备春招 当然是可以的,但不是每个同学都是劲再去冲春招了,找工作都是一鼓作气,如果你还能高强度的准备面试冲刺春招,当然是好的。 + +关键是 还有外部因素,毕业的事,以及大家该保研的保研了,找到工作了都吃喝玩乐了,天天聚餐,这个氛围下,你还能不能继续高强度冲刺了, 这才是你要考虑的。 + +加油💪 + diff --git "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\351\235\236\347\247\221\347\217\255\347\232\204\345\233\260\346\211\260.md" "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\351\235\236\347\247\221\347\217\255\347\232\204\345\233\260\346\211\260.md" new file mode 100644 index 0000000000..d5fea53283 --- /dev/null +++ "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\351\235\236\347\247\221\347\217\255\347\232\204\345\233\260\346\211\260.md" @@ -0,0 +1,54 @@ +

+ + + + +# 非科班的困扰! + +在[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) 里很多录友都是非科班转码的,也是要准备求职,或者准备明年秋招,非科班的录友其实对 准备找工作所需要的知识不太清楚,对其难度也不太清楚,所有总感觉准备起来心里没有底。 + +例如星球里有这位录友的提问: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211024102300.png) + +我在知识星球里,给出了详细的C++后端学习路线,包括计算机基础的学习路线, + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211024103006.png) +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211024103108.png) + +当然路线很长,这里我就截图了一部分。 + +但即使这样,其实非科班的录友也不容易量化具体的工作量究竟多大。 + +以下是我对这位录友的回答: + +---------------- + +具体学习时间 一般是不好量化的。 + +一本书,有的同学 一周就看完了,有的同学 两个月看不明白,**基础程度,学习速度,每天的投入时间,以及效率**都是不一样的。 + +**所以要靠自己 规划时间,自己是最了解自己的**。 + +C++primer 不要耗太久,差不多就去看 effective C++。 + +还有计算机求职需要准备的知识不是线性排列的。 + +例如很多非科班的录友可能会这样安排: 几个月搞定编程语言,几个月搞定算法,几个月搞定操作系统! + +**如果这么学的话,那就凉凉了**。 + +求职准备主要围绕这么几块:编程语言 + 算法 + 计算机基础(操作系统,数据库,网络,设计模式)+ 项目 。 + +**这几块都可以一起搞的,一天都要分配点时间,知识错开点来学,效率更高**。 + +每一块知识,每天都要投入一点,例如,例如一天算法几个小时,编程语言几个小时,计算机基础几个小时,项目几个小时,这样分配,当你发现 操作系统比你想象中的难,你就 下周及时调整计划,操作系统每天多分配时间。 + +**正常的学习节奏是这样根据自己的掌握程度动态调整的**。 + +在整体进度上,可以先保证都过一遍,第一遍看的时候,不要死扣细节,会非常耽误时间,先过一遍有整体性的把控 更重要。 + +之后在针对面经或者八股文,去一个难点一个难点的攻克。 + +希望对非科班的录友们有所启发,加油💪 + From 5ffd1de55b5a67edc81a68c76cb20c8ffa9ce10b Mon Sep 17 00:00:00 2001 From: youngyangyang04 <826123027@qq.com> Date: Fri, 26 Nov 2021 11:56:35 +0800 Subject: [PATCH 0074/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=9C=8D=E5=8A=A1?= =?UTF-8?q?=E5=99=A8=E6=B4=BB=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index 0fd937f3a8..12781e7701 100644 --- a/README.md +++ b/README.md @@ -577,4 +577,10 @@

+# 服务器 +

阿里云服务器,双11特价活动🔥🔥🔥🔥

+

+ + + From 009662f6350017914db18adcbf0cef8c1aa522d4 Mon Sep 17 00:00:00 2001 From: qiuxuewei Date: Fri, 26 Nov 2021 14:26:01 +0800 Subject: [PATCH 0075/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=2020.=20=E6=9C=89?= =?UTF-8?q?=E6=95=88=E7=9A=84=E6=8B=AC=E5=8F=B7=20Swift=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...10\347\232\204\346\213\254\345\217\267.md" | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git "a/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" "b/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" index 57aa5a01ec..5f597a1a8a 100644 --- "a/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" +++ "b/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" @@ -283,6 +283,29 @@ var isValid = function(s) { }; ``` +Swift +```swift +func isValid(_ s: String) -> Bool { + var stack = [String.Element]() + for ch in s { + if ch == "(" { + stack.append(")") + } else if ch == "{" { + stack.append("}") + } else if ch == "[" { + stack.append("]") + } else { + let top = stack.last + if ch == top { + stack.removeLast() + } else { + return false + } + } + } + return stack.isEmpty +} +``` -----------------------

From 9b6e798285eeb28dcd0ab117c25a75ff03e85c38 Mon Sep 17 00:00:00 2001 From: ArthurP Date: Sat, 27 Nov 2021 19:39:02 +0000 Subject: [PATCH 0076/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200131.=E5=88=86?= =?UTF-8?q?=E5=89=B2=E5=9B=9E=E6=96=87=E4=B8=B2.md=20C=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 --- ...62\345\233\236\346\226\207\344\270\262.md" | 95 +++++++++++++++++++ 1 file changed, 95 insertions(+) diff --git "a/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" "b/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" index f674835d5e..075734ea19 100644 --- "a/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" +++ "b/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" @@ -450,6 +450,101 @@ var partition = function(s) { }; ``` +##C +```c +char** path; +int pathTop; +char*** ans; +int ansTop = 0; +int* ansSize; + +//将path中的字符串全部复制到ans中 +void copy() { + //创建一个临时tempPath保存path中的字符串 + char** tempPath = (char**)malloc(sizeof(char*) * pathTop); + int i; + for(i = 0; i < pathTop; i++) { + tempPath[i] = path[i]; + } + //保存tempPath + ans[ansTop] = tempPath; + //将当前path的长度(pathTop)保存在ansSize中 + ansSize[ansTop++] = pathTop; +} + +//判断字符串是否为回文字符串 +bool isPalindrome(char* str, int startIndex, int endIndex) { + //双指针法:当endIndex(右指针)的值比startIndex(左指针)大时进行遍历 + while(endIndex >= startIndex) { + //若左指针和右指针指向元素不一样,返回False + if(str[endIndex--] != str[startIndex++]) + return 0; + } + return 1; +} + +//切割从startIndex到endIndex子字符串 +char* cutString(char* str, int startIndex, int endIndex) { + //开辟字符串的空间 + char* tempString = (char*)malloc(sizeof(char) * (endIndex - startIndex + 2)); + int i; + int index = 0; + //复制子字符串 + for(i = startIndex; i <= endIndex; i++) + tempString[index++] = str[i]; + //用'\0'作为字符串结尾 + tempString[index] = '\0'; + return tempString; +} + +void backTracking(char* str, int strLen, int startIndex) { + if(startIndex >= strLen) { + //将path拷贝到ans中 + copy(); + return ; + } + + int i; + for(i = startIndex; i < strLen; i++) { + //若从subString到i的子串是回文字符串,将其放入path中 + if(isPalindrome(str, startIndex, i)) { + path[pathTop++] = cutString(str, startIndex, i); + } + //若从startIndex到i的子串不为回文字符串,跳过这一层 + else { + continue; + } + //递归判断下一层 + backTracking(str, strLen, i + 1); + //回溯,将path中最后一位元素弹出 + pathTop--; + } +} + +char*** partition(char* s, int* returnSize, int** returnColumnSizes){ + int strLen = strlen(s); + //因为path中的字符串最多为strLen个(即单个字符的回文字符串),所以开辟strLen个char*空间 + path = (char**)malloc(sizeof(char*) * strLen); + //存放path中的数组结果 + ans = (char***)malloc(sizeof(char**) * 40000); + //存放ans数组中每一个char**数组的长度 + ansSize = (int*)malloc(sizeof(int) * 40000); + ansTop = pathTop = 0; + + //回溯函数 + backTracking(s, strLen, 0); + + //将ansTop设置为ans数组的长度 + *returnSize = ansTop; + //设置ans数组中每一个数组的长度 + *returnColumnSizes = (int*)malloc(sizeof(int) * ansTop); + int i; + for(i = 0; i < ansTop; ++i) { + (*returnColumnSizes)[i] = ansSize[i]; + } + return ans; +} +``` -----------------------
From 9fd8ea55fa2cc9a0a473481894cffe500c4b2afe 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, 29 Nov 2021 14:07:20 +0800 Subject: [PATCH 0077/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=201047.=20?= =?UTF-8?q?=E5=88=A0=E9=99=A4=E5=AD=97=E7=AC=A6=E4=B8=B2=E4=B8=AD=E7=9A=84?= =?UTF-8?q?=E6=89=80=E6=9C=89=E7=9B=B8=E9=82=BB=E9=87=8D=E5=A4=8D=E9=A1=B9?= =?UTF-8?q?=20Swift=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...2\273\351\207\215\345\244\215\351\241\271.md" | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git "a/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" "b/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" index 66f3497842..e43ab59f43 100644 --- "a/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" +++ "b/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" @@ -319,6 +319,22 @@ char * removeDuplicates(char * s){ } ``` +Swift: +```swift +func removeDuplicates(_ s: String) -> String { + let array = Array(s) + var stack = [Character]() + for c in array { + let last: Character? = stack.last + if stack.isEmpty || last != c { + stack.append(c) + } else { + stack.removeLast() + } + } + return String(stack) +} +``` -----------------------
From 997ffb1061e6cb78a1004fd4a4718100fd750ba9 Mon Sep 17 00:00:00 2001 From: ORain <58782338+ORainn@users.noreply.github.com> Date: Mon, 29 Nov 2021 18:51:29 +0800 Subject: [PATCH 0078/3019] =?UTF-8?q?python=E9=80=92=E5=BD=92=E6=B3=95=20?= =?UTF-8?q?=E6=9B=B4=E5=BF=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit python递归法 更快 --- ...\247\344\272\214\345\217\211\346\240\221.md" | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git "a/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" "b/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" index af945acaa2..361a92d16f 100644 --- "a/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" @@ -256,6 +256,23 @@ class Solution { ## Python ```python +class Solution: + """递归法 更快""" + def constructMaximumBinaryTree(self, nums: List[int]) -> TreeNode: + if not nums: + return None + maxvalue = max(nums) + index = nums.index(maxvalue) + + root = TreeNode(maxvalue) + + left = nums[:index] + right = nums[index + 1:] + + root.left = self.constructMaximumBinaryTree(left) + root.right = self.constructMaximumBinaryTree(right) + return root + class Solution: """最大二叉树 递归法""" From d1d3b28341c6f13ca0cc9ee2fd66f5f82af9575c Mon Sep 17 00:00:00 2001 From: Guanzhong Pan Date: Mon, 29 Nov 2021 11:56:50 +0000 Subject: [PATCH 0079/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200015.=E4=B8=89?= =?UTF-8?q?=E6=95=B0=E4=B9=8B=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 --- ...11\346\225\260\344\271\213\345\222\214.md" | 74 +++++++++++++++++++ 1 file changed, 74 insertions(+) diff --git "a/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" "b/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" index dec8a7c681..1e67525456 100644 --- "a/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" @@ -435,5 +435,79 @@ func threeSum(_ nums: [Int]) -> [[Int]] { } ``` +C: +```C +//qsort辅助cmp函数 +int cmp(const void* ptr1, const void* ptr2) { + return *((int*)ptr1) > *((int*)ptr2); +} + +int** threeSum(int* nums, int numsSize, int* returnSize, int** returnColumnSizes) { + //开辟ans数组空间 + int **ans = (int**)malloc(sizeof(int*) * 18000); + int ansTop = 0; + //若传入nums数组大小小于3,则需要返回数组大小为0 + if(numsSize < 3) { + *returnSize = 0; + return ans; + } + //对nums数组进行排序 + qsort(nums, numsSize, sizeof(int), cmp); + + + int i; + //用for循环遍历数组,结束条件为i < numsSize - 2(因为要预留左右指针的位置) + for(i = 0; i < numsSize - 2; i++) { + //若当前i指向元素>0,则代表left和right以及i的和大于0。直接break + if(nums[i] > 0) + break; + //去重:i > 0 && nums[i] == nums[i-1] + if(i > 0 && nums[i] == nums[i-1]) + continue; + //定义左指针和右指针 + int left = i + 1; + int right = numsSize - 1; + //当右指针比左指针大时进行循环 + while(right > left) { + //求出三数之和 + int sum = nums[right] + nums[left] + nums[i]; + //若和小于0,则左指针+1(因为左指针右边的数比当前所指元素大) + if(sum < 0) + left++; + //若和大于0,则将右指针-1 + else if(sum > 0) + right--; + //若和等于0 + else { + //开辟一个大小为3的数组空间,存入nums[i], nums[left]和nums[right] + int* arr = (int*)malloc(sizeof(int) * 3); + arr[0] = nums[i]; + arr[1] = nums[left]; + arr[2] = nums[right]; + //将开辟数组存入ans中 + ans[ansTop++] = arr; + //去重 + while(right > left && nums[right] == nums[right - 1]) + right--; + while(left < right && nums[left] == nums[left + 1]) + left++; + //更新左右指针 + left++; + right--; + } + } + } + + //设定返回的数组大小 + *returnSize = ansTop; + *returnColumnSizes = (int*)malloc(sizeof(int) * ansTop); + int z; + for(z = 0; z < ansTop; z++) { + (*returnColumnSizes)[z] = 3; + } + return ans; +} +``` + -----------------------
From 77b31bb0caaca95080c29844098f6bbb0e7f75b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9E=81=E5=AE=A2=E5=AD=A6=E4=BC=9F?= Date: Tue, 30 Nov 2021 14:07:32 +0800 Subject: [PATCH 0080/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20150.=20=E9=80=86?= =?UTF-8?q?=E6=B3=A2=E5=85=B0=E8=A1=A8=E8=BE=BE=E5=BC=8F=E6=B1=82=E5=80=BC?= =?UTF-8?q?=20Swift=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...76\345\274\217\346\261\202\345\200\274.md" | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git "a/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" "b/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" index ef91330d0b..137aaf5d74 100644 --- "a/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" +++ "b/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" @@ -241,6 +241,38 @@ class Solution: ``` +Swift: +```Swift +func evalRPN(_ tokens: [String]) -> Int { + var stack = [Int]() + for c in tokens { + let v = Int(c) + if let num = v { + // 遇到数字直接入栈 + stack.append(num) + } else { + // 遇到运算符, 取出栈顶两元素计算, 结果压栈 + var res: Int = 0 + let num2 = stack.popLast()! + let num1 = stack.popLast()! + switch c { + case "+": + res = num1 + num2 + case "-": + res = num1 - num2 + case "*": + res = num1 * num2 + case "/": + res = num1 / num2 + default: + break + } + stack.append(res) + } + } + return stack.last! +} +``` -----------------------
From 331d3a4839f8a0ba58e4456504caa830f0a9180d Mon Sep 17 00:00:00 2001 From: youngyangyang04 <826123027@qq.com> Date: Wed, 1 Dec 2021 12:36:50 +0800 Subject: [PATCH 0081/3019] Update --- ...25\347\210\206\346\260\224\347\220\203.md" | 40 ++++---- ...36\345\255\220\345\272\217\345\210\227.md" | 1 - "problems/\345\211\215\345\272\217/vim.md" | 97 +++++++++++++++++++ 3 files changed, 116 insertions(+), 22 deletions(-) create mode 100644 "problems/\345\211\215\345\272\217/vim.md" diff --git "a/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" "b/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" index 18b3344821..9336105638 100644 --- "a/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" +++ "b/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" @@ -5,7 +5,7 @@

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

-## 452. 用最少数量的箭引爆气球 +# 452. 用最少数量的箭引爆气球 [力扣题目链接](https://leetcode-cn.com/problems/minimum-number-of-arrows-to-burst-balloons/) @@ -17,29 +17,27 @@ 示例 1: -输入:points = [[10,16],[2,8],[1,6],[7,12]] - -输出:2 -解释:对于该样例,x = 6 可以射爆 [2,8],[1,6] 两个气球,以及 x = 11 射爆另外两个气球 +* 输入:points = [[10,16],[2,8],[1,6],[7,12]] +* 输出:2 +* 解释:对于该样例,x = 6 可以射爆 [2,8],[1,6] 两个气球,以及 x = 11 射爆另外两个气球 示例 2: -输入:points = [[1,2],[3,4],[5,6],[7,8]] -输出:4 +* 输入:points = [[1,2],[3,4],[5,6],[7,8]] +* 输出:4 示例 3: -输入:points = [[1,2],[2,3],[3,4],[4,5]] -输出:2 +* 输入:points = [[1,2],[2,3],[3,4],[4,5]] +* 输出:2 示例 4: -输入:points = [[1,2]] -输出:1 +* 输入:points = [[1,2]] +* 输出:1 示例 5: -输入:points = [[2,3],[2,3]] -输出:1 +* 输入:points = [[2,3],[2,3]] +* 输出:1 提示: - * 0 <= points.length <= 10^4 * points[i].length == 2 * -2^31 <= xstart < xend <= 2^31 - 1 @@ -136,7 +134,7 @@ public: ## 其他语言版本 -Java: +### Java ```java class Solution { public int findMinArrowShots(int[][] points) { @@ -156,7 +154,7 @@ class Solution { } ``` -Python: +### Python ```python class Solution: def findMinArrowShots(self, points: List[List[int]]) -> int: @@ -171,8 +169,7 @@ class Solution: return result ``` -Go: - +### Go ```golang func findMinArrowShots(points [][]int) int { var res int =1//弓箭数 @@ -196,8 +193,9 @@ func min(a,b int) int{ } return a } -``` -Javascript: +``` + +### Javascript ```Javascript var findMinArrowShots = function(points) { points.sort((a, b) => { @@ -216,7 +214,7 @@ var findMinArrowShots = function(points) { }; ``` -C: +### C ```c int cmp(const void *a,const void *b) { diff --git "a/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" "b/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" index c5ffdd4160..231ea4946d 100644 --- "a/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" @@ -227,7 +227,6 @@ class Solution { } } ``` -<<<<<<< HEAD ### Python diff --git "a/problems/\345\211\215\345\272\217/vim.md" "b/problems/\345\211\215\345\272\217/vim.md" new file mode 100644 index 0000000000..c49ff1e32a --- /dev/null +++ "b/problems/\345\211\215\345\272\217/vim.md" @@ -0,0 +1,97 @@ +# 人生苦短,我用VIM! + +熟悉我的录友,应该都知道我是vim流,无论是写代码还是写文档(Markdown),都是vim,都没用IDE。 + +但这里我并不是说IDE不好用,IDE在 代码跟踪,引用跳转等等其实是很给力的,效率比vim高。 + +我用vim的话,如果需要跟踪代码的话,就用ctag去跳转,虽然很不智能(是基于规则匹配,不是语义匹配),但加上我自己的智能就也能用(这里真的要看对代码的把握程度了,哈哈哈) + +所以连跟踪代码都不用IDE的话,其他方面那我就更用不上IDE了。 + +## 为什么用VIM + +**至于写代码的效率,VIM完爆IDE**,其他不说,就使用IDE每次还要去碰鼠标,就很让人烦心!(真凸显了程序员的执着) + +这里说一说vim的方便之处吧,搞后端开发的同学,都得玩linux吧,在linux下写代码,如果不会vim的话,会非常难受。 + +日常我们的开发机,线上服务器,预发布服务器,都是远端linux,需要跳板机连上去,进行操作,如果不会vim,每次都把代码拷贝到本地,修改编译,在传到远端服务器,还真的麻烦。 + +使用VIM的话,本地,服务器,开发机,一刀流,无缝切换,爽不。 + +IDE那么很吃内存,打开个IDE卡半天,用VIM就很轻便了,秒开有木有! + +而且在我们日常开发中,工作年头多了,都会发现没有纯粹的C++,Java开发啥的,就是 C++也得写,Java也得写,有时候写Go起个http服务,写Python处理一下数据,写shell搞个自动部署,编译啥的。 **总是就是啥语言就得写,一些以项目需求为导向!** + +写语言还要切换不同的IDE,熟悉不同的操作姿势,想想是不是很麻烦。 + +听说好像现在有的IDE可以支持很多语言了,这个我还不太了解,但能确定的是,IDE支持的语言再多,也不会有vim多。 + +**因为vim是编辑器!**,什么都可以写,不同的语言做一下相应的配置就好,写起来都是一样的顺畅。 + +应该不少录友感觉vim上快捷键太多了,根本记不过来,其实这和我看IDE是一样的想法,我看IDE上哪些按钮一排一排的也太多了,我都记不过来,所以索性一套vim流 扫遍所有代码,它不香么。 + +而且IDE集成编译、调试、智能补全、语法高亮、工程管理等等,隐藏了太多细节,使用vim,就都自己配置,想支持什么语言就自己配置,想怎么样就怎么样,需要什么就补什么,这不是很酷么? + +可能有的同学感觉什么都要自己配置,有点恐惧。但一旦配置好的就非常舒服了。 + +**其实工程师就要逢山开路遇水搭桥,这也是最基本的素质!** + +从头打在一个自己的开发利器,再舒服不过了。 + +## PowerVim + +这里给大家介绍一下我的vim配置吧,**这套vim配置我已经打磨了将近四年**,不断调整优化,已经可以完全满足工业级打开的需求了。 + +所以我给它起名为PowerVim。一个真正强大的vim。 + +``` + _____ __ ___ + | __ \ \ \ / (_) + | |__) |____ _____ _ _\ \ / / _ _ __ ___ + | ___/ _ \ \ /\ / / _ \ '__\ \/ / | | '_ ` _ \ + | | | (_) \ V V / __/ | \ / | | | | | | | + |_| \___/ \_/\_/ \___|_| \/ |_|_| |_| |_| +``` + +这个配置我开源在Github上,地址:https://github.com/youngyangyang04/PowerVim + + + +来感受一下PowerVim的使用体验,看起来很酷吧!注意这些操作都不用鼠标的,一波键盘控制流!所以我平时写代码是不碰鼠标的! + +![](https://code-thinking.cdn.bcebos.com/gifs/vim_overview.gif) + +## 安装 + +PowerVim的安防非常简单,我已经写好了安装脚本,只要执行以下就可以安装,而且不会影响你之前的vim配置,之前的配置都给做了备份,大家看一下脚本就知道备份在哪里了。 + +安装过程非常简单: +```bash +git clone https://github.com/youngyangyang04/PowerVim.git +cd PowerVim +sh install.sh +``` + +## 特性 + +目前PowerVim支持如下功能,这些都是自己配置的: + +* CPP、PHP、JAVA代码补全,如果需要其他语言补全,可自行配置关键字列表在PowerVim/.vim/dictionary目录下 +* 显示文件函数变量列表 +* MiniBuf显示打开过的文件 +* 语法高亮支持C++ (including C++11)、 Go、Java、 Php、 Html、 Json 和 Markdown +* 显示git状态,和主干或分支的添加修改删除的情况 +* 显示项目文件目录,方便快速打开 +* 快速注释,使用gcc注释当前行,gc注释选中的块 +* 项目内搜索关键字和文件夹 +* 漂亮的颜色搭配和状态栏显示 + +## 最后 + +当然 还有很多,我还详细写了PowerVim的快捷键,使用方法,插件,配置,等等,都在Github主页的README上。当时我的Github上写的都是英文README,这次为了方便大家阅读,我又翻译成中文README。 + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211013102249.png) + + +最后,因为这个vim配置因为我一直没有宣传,所以star数量很少,哈哈哈,录友们去给个star吧,真正的开发利器,值得顶起来! + From 4dfa4d1ae2c3be414c51d0e1fb056567d2e2d938 Mon Sep 17 00:00:00 2001 From: Luo <82520819+Jerry-306@users.noreply.github.com> Date: Wed, 1 Dec 2021 19:43:05 +0800 Subject: [PATCH 0082/3019] =?UTF-8?q?=E7=AE=97=E6=B3=95=E6=A8=A1=E6=9D=BF?= =?UTF-8?q?=20js=20=E7=89=88=E6=9C=AC=E4=BB=A3=E7=A0=81=E6=A0=B7=E5=BC=8F?= =?UTF-8?q?=E5=BE=AE=E8=B0=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "problems/\347\256\227\346\263\225\346\250\241\346\235\277.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/\347\256\227\346\263\225\346\250\241\346\235\277.md" "b/problems/\347\256\227\346\263\225\346\250\241\346\235\277.md" index 853816d27d..69ebb36136 100644 --- "a/problems/\347\256\227\346\263\225\346\250\241\346\235\277.md" +++ "b/problems/\347\256\227\346\263\225\346\250\241\346\235\277.md" @@ -460,7 +460,7 @@ var levelOrder = function (root) { for (let i = 0; i < n; i++) { let node = queue.shift(); temp.push(node.val); - node.left &&queue.push(node.left); + node.left && queue.push(node.left); node.right && queue.push(node.right); } res.push(temp); From 0ab6e244f9df46186d8737c583e8bf1f3cc1b72f Mon Sep 17 00:00:00 2001 From: Luo <82520819+Jerry-306@users.noreply.github.com> Date: Wed, 1 Dec 2021 19:54:06 +0800 Subject: [PATCH 0083/3019] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=200704=20=E4=BA=8C?= =?UTF-8?q?=E5=88=86=E6=9F=A5=E6=89=BE=20js=E7=89=88=E6=9C=AC=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E6=97=A0=E9=AB=98=E4=BA=AE=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 --- ...344\272\214\345\210\206\346\237\245\346\211\276.md" | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git "a/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" "b/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" index bb10143f7d..44a0c1d8be 100644 --- "a/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" +++ "b/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" @@ -276,11 +276,9 @@ func search(nums []int, target int) int { ``` **JavaScript:** +(版本一)左闭右闭区间 ```js - -// (版本一)左闭右闭区间 - /** * @param {number[]} nums * @param {number} target @@ -302,9 +300,10 @@ var search = function(nums, target) { } return -1; }; +``` +(版本二)左闭右开区间 -// (版本二)左闭右开区间 - +```js /** * @param {number[]} nums * @param {number} target @@ -325,7 +324,6 @@ var search = function(nums, target) { } return -1; }; - ``` **Ruby:** From 44a3e351f09b4f02ba57b19fcb33c3e4cb3d07e9 Mon Sep 17 00:00:00 2001 From: Luo <82520819+Jerry-306@users.noreply.github.com> Date: Wed, 1 Dec 2021 20:10:33 +0800 Subject: [PATCH 0084/3019] =?UTF-8?q?=E6=96=B0=E5=A2=9E=200977=20=E6=9C=89?= =?UTF-8?q?=E5=BA=8F=E6=95=B0=E7=BB=84=E7=9A=84=E5=B9=B3=E6=96=B9=20JavaSc?= =?UTF-8?q?ript=E7=89=88=E6=9C=AC=20=E6=9B=B4=E5=8A=A0=E7=AE=80=E6=B4=81?= =?UTF-8?q?=E9=AB=98=E6=95=88=E7=9A=84=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...04\347\232\204\345\271\263\346\226\271.md" | 37 +++++++++---------- 1 file changed, 18 insertions(+), 19 deletions(-) diff --git "a/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" "b/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" index b1e04c4edc..6616ba8c74 100644 --- "a/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" +++ "b/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" @@ -199,27 +199,26 @@ impl Solution { Javascript: ```Javascript /** - * @desc two pointers solution - * @link https://leetcode-cn.com/problems/squares-of-a-sorted-array/ - * @param nums Array e.g. [-4,-1,0,3,10] - * @return {array} e.g. [0,1,9,16,100] + * @param {number[]} nums + * @return {number[]} */ -const sortedSquares = function (nums) { - let res = [] - for (let i = 0, j = nums.length - 1; i <= j;) { - const left = Math.abs(nums[i]) - const right = Math.abs(nums[j]) - if (right > left) { - // push element to the front of the array - res.unshift(right * right) - j-- - } else { - res.unshift(left * left) - i++ - } +var sortedSquares = function(nums) { + let n = nums.length; + let res = new Array(n).fill(0); + let i = 0, j = n - 1, k = n - 1; + while (i <= j) { + let left = nums[i] * nums[i], + right = nums[j] * nums[j]; + if (left < right) { + res[k--] = right; + j--; + } else { + res[k--] = left; + i++; + } } - return res - } + return res; +}; ``` Swift: From 2789554d525d2e02d94b669bdf582441bd249d19 Mon Sep 17 00:00:00 2001 From: Luo <82520819+Jerry-306@users.noreply.github.com> Date: Wed, 1 Dec 2021 20:56:22 +0800 Subject: [PATCH 0085/3019] =?UTF-8?q?=E6=9B=B4=E6=AD=A3=200019=20=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E9=93=BE=E8=A1=A8=E4=B8=AD=E5=80=92=E6=95=B0=E7=AC=AC?= =?UTF-8?q?N=E4=B8=AA=E8=8A=82=E7=82=B9=20JavaScript=20=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...25\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git "a/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" "b/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" index e05b9d0324..188c4c5776 100644 --- "a/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" +++ "b/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" @@ -173,8 +173,7 @@ var removeNthFromEnd = function(head, n) { let ret = new ListNode(0, head), slow = fast = ret; while(n--) fast = fast.next; - if(!fast) return ret.next; - while (fast.next) { + while (fast.next !== null) { fast = fast.next; slow = slow.next }; From 9483a652ee511371cbfe405425417a7c9f1d2583 Mon Sep 17 00:00:00 2001 From: Asterisk <44215173+casnz1601@users.noreply.github.com> Date: Sun, 5 Dec 2021 16:43:47 +0800 Subject: [PATCH 0086/3019] =?UTF-8?q?Update=200205.=E5=90=8C=E6=9E=84?= =?UTF-8?q?=E5=AD=97=E7=AC=A6=E4=B8=B2.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...204\345\255\227\347\254\246\344\270\262.md" | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git "a/problems/0205.\345\220\214\346\236\204\345\255\227\347\254\246\344\270\262.md" "b/problems/0205.\345\220\214\346\236\204\345\255\227\347\254\246\344\270\262.md" index a296314981..eeda7d2ecb 100644 --- "a/problems/0205.\345\220\214\346\236\204\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/0205.\345\220\214\346\236\204\345\255\227\347\254\246\344\270\262.md" @@ -90,6 +90,24 @@ class Solution { ## Python ```python +class Solution: + def isIsomorphic(self, s: str, t: str) -> bool: + default_dict1 = defaultdict(str) + default_dict2 = defaultdict(str) + + if len(s) != len(t): return false + + for i in range(len(s)): + if not default_dict1[s[i]]: + default_dict1[s[i]] = t[i] + + if not default_dict2[t[i]]: + default_dict2[t[i]] = s[i] + + if default_dict1[s[i]] != t[i] or default_dict2[t[i]] != s[i]: + return False + + return True ``` ## Go From 3ae922f6f17a3d7ccc9a6f713572a4a96bfba4e5 Mon Sep 17 00:00:00 2001 From: mx lai <1721261216@qq.com> Date: Sun, 5 Dec 2021 19:56:17 +0800 Subject: [PATCH 0087/3019] =?UTF-8?q?FIX:=20=E6=9B=B4=E6=AD=A30098.?= =?UTF-8?q?=E9=AA=8C=E8=AF=81=E4=BA=8C=E5=8F=89=E6=90=9C=E7=B4=A2=E6=A0=91?= =?UTF-8?q?go=E8=AF=AD=E8=A8=80=E7=89=88=E7=9A=84=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...11\346\220\234\347\264\242\346\240\221.md" | 29 +++++++++++-------- 1 file changed, 17 insertions(+), 12 deletions(-) diff --git "a/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" index ec265615bd..82d1941ebd 100644 --- "a/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" +++ "b/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" @@ -414,19 +414,24 @@ class Solution: import "math" func isValidBST(root *TreeNode) bool { - if root == nil { - return true - } - return isBST(root, math.MinInt64, math.MaxFloat64) + // 二叉搜索树也可以是空树 + if root == nil { + return true + } + // 由题目中的数据限制可以得出min和max + return check(root,math.MinInt64,math.MaxInt64) } -func isBST(root *TreeNode, min, max int) bool { - if root == nil { - return true - } - if min >= root.Val || max <= root.Val { - return false - } - return isBST(root.Left, min, root.Val) && isBST(root.Right, root.Val, max) + +func check(node *TreeNode,min,max int64) bool { + if node == nil { + return true + } + + if min >= int64(node.Val) || max <= int64(node.Val) { + return false + } + // 分别对左子树和右子树递归判断,如果左子树和右子树都符合则返回true + return check(node.Right,int64(node.Val),max) && check(node.Left,min,int64(node.Val)) } ``` ```go From 6b5049883b99aeed7179146d732c3863c5e70283 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9E=81=E5=AE=A2=E5=AD=A6=E4=BC=9F?= Date: Tue, 7 Dec 2021 14:47:48 +0800 Subject: [PATCH 0088/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20239.=20=E6=BB=91?= =?UTF-8?q?=E5=8A=A8=E7=AA=97=E5=8F=A3=E6=9C=80=E5=A4=A7=E5=80=BC=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 --- ...43\346\234\200\345\244\247\345\200\274.md" | 106 ++++++++++++++++++ 1 file changed, 106 insertions(+) diff --git "a/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" "b/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" index 8a8d3a5229..1f24569976 100644 --- "a/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" +++ "b/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" @@ -418,6 +418,112 @@ var maxSlidingWindow = function (nums, k) { }; ``` +Swift: +```Swift +/// 双向链表 +class DoublyListNode { + var head: DoublyListNode? + var tail: DoublyListNode? + var next: DoublyListNode? + var pre: DoublyListNode? + var value: Int = 0 + init(_ value: Int = 0) { + self.value = value + } + func isEmpty() -> Bool { + return self.head == nil + } + func first() -> Int? { + return self.head?.value + } + func last() -> Int? { + return self.tail?.value + } + func removeFirst() { + if isEmpty() { + return + } + let next = self.head!.next + self.head?.next = nil// 移除首节点 + next?.pre = nil + self.head = next + } + func removeLast() { + if let tail = self.tail { + if let pre = tail.pre { + self.tail?.pre = nil + pre.next = nil + self.tail = pre + } else { + self.head = nil + self.tail = nil + } + } + } + func append(_ value: Int) { + let node = DoublyListNode(value) + if self.head != nil { + node.pre = self.tail + self.tail?.next = node + self.tail = node + } else { + self.head = node + self.tail = node + self.pre = nil + self.next = nil + } + } +} +// 单调队列, 从大到小 +class MyQueue { +// var queue: [Int]!// 用数组会超时 + var queue: DoublyListNode! + init() { +// queue = [Int]() + queue = DoublyListNode() + } + // 滑动窗口时弹出第一个元素, 如果相等再弹出 + func pop(x: Int) { + if !queue.isEmpty() && front() == x { + queue.removeFirst() + } + } + // 滑动窗口时添加下一个元素, 移除队尾比 x 小的元素 始终保证队头 > 队尾 + func push(x: Int) { + while !queue.isEmpty() && queue.last()! < x { + queue.removeLast() + } + queue.append(x) + } + // 此时队头就是滑动窗口最大值 + func front() -> Int { + return queue.first() ?? -1 + } +} + +class Solution { + func maxSlidingWindow(_ nums: [Int], _ k: Int) -> [Int] { + // 存放结果 + var res = [Int]() + let queue = MyQueue() + // 先将前K个元素放入队列 + for i in 0 ..< k { + queue.push(x: nums[i]) + } + // 添加当前队列最大值到结果数组 + res.append(queue.front()) + for i in k ..< nums.count { + // 滑动窗口移除最前面元素 + queue.pop(x: nums[i - k]) + // 滑动窗口添加下一个元素 + queue.push(x: nums[i]) + // 保存当前队列最大值 + res.append(queue.front()) + } + return res + } +} +``` -----------------------
From 0d442b3b7bdde1dd81576778efaeb758946c8f6c Mon Sep 17 00:00:00 2001 From: mengyuan Date: Tue, 7 Dec 2021 21:42:05 +0800 Subject: [PATCH 0089/3019] =?UTF-8?q?update:=200040.=E7=BB=84=E5=90=88?= =?UTF-8?q?=E6=80=BB=E5=92=8CII=20JS=E7=89=88=E6=9C=AC=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E4=BD=BF=E7=94=A8used=E5=8E=BB=E9=87=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\345\220\210\346\200\273\345\222\214II.md" | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git "a/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" "b/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" index bab4bd6a6d..b5e511e776 100644 --- "a/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" +++ "b/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" @@ -457,6 +457,37 @@ var combinationSum2 = function(candidates, target) { } }; ``` +**使用used去重** +```js +var combinationSum2 = function(candidates, target) { + let res = []; + let path = []; + let total = 0; + const len = candidates.length; + candidates.sort((a, b) => a - b); + let used = new Array(len).fill(false); + const backtracking = (startIndex) => { + if (total === target) { + res.push([...path]); + return; + } + for(let i = startIndex; i < len && total < target; i++) { + const cur = candidates[i]; + if (cur > target - total || (i > 0 && cur === candidates[i - 1] && !used[i - 1])) continue; + path.push(cur); + total += cur; + used[i] = true; + backtracking(i + 1); + path.pop(); + total -= cur; + used[i] = false; + } + } + backtracking(0); + return res; +}; +``` + ## C ```c From 27bb2b0485edcea24bb54cbf4834a972b1200248 Mon Sep 17 00:00:00 2001 From: topsy404 <87177008+topsy404@users.noreply.github.com> Date: Wed, 8 Dec 2021 14:28:34 +0800 Subject: [PATCH 0090/3019] fix typo --- ...\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" "b/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" index b661a76663..393baf7d82 100644 --- "a/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" +++ "b/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" @@ -68,7 +68,7 @@ * 背包的体积为sum / 2 * 背包要放入的商品(集合里的元素)重量为 元素的数值,价值也为元素的数值 -* 背包如何正好装满,说明找到了总和为 sum / 2 的子集。 +* 背包如果正好装满,说明找到了总和为 sum / 2 的子集。 * 背包中每一个元素是不可重复放入。 以上分析完,我们就可以套用01背包,来解决这个问题了。 From c5b691b91dc85cc16304fb9884d9db4afadb88e0 Mon Sep 17 00:00:00 2001 From: zhicheng lee <904688436@qq.com> Date: Wed, 8 Dec 2021 16:49:06 +0800 Subject: [PATCH 0091/3019] =?UTF-8?q?Update=200236.=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=A0=91=E7=9A=84=E6=9C=80=E8=BF=91=E5=85=AC=E5=85=B1=E7=A5=96?= =?UTF-8?q?=E5=85=88.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 更新 0236题 Java版本代码 --- ...54\345\205\261\347\245\226\345\205\210.md" | 40 +++++++------------ 1 file changed, 14 insertions(+), 26 deletions(-) diff --git "a/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" "b/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" index 4182999f63..6d26e376bb 100644 --- "a/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" +++ "b/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" @@ -221,42 +221,30 @@ public: ## Java + ```Java class Solution { public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { - return lowestCommonAncestor1(root, p, q); - } - public TreeNode lowestCommonAncestor1(TreeNode root, TreeNode p, TreeNode q) { - if (root == null || root == p || root == q) { - return root; - } - TreeNode left = lowestCommonAncestor1(root.left, p, q); - TreeNode right = lowestCommonAncestor1(root.right, p, q); - if (left != null && right != null) {// 左右子树分别找到了,说明此时的root就是要求的结果 + if (root == null || root == p || root == q) { // 递归结束条件 return root; } - if (left == null) { + + // 后序遍历 + TreeNode left = lowestCommonAncestor(root.left, p, q); + TreeNode right = lowestCommonAncestor(root.right, p, q); + + if(left == null && right == null) { // 若未找到节点 p 或 q + return null; + }else if(left == null && right != null) { // 若找到一个节点 return right; + }else if(left != null && right == null) { // 若找到一个节点 + return left; + }else { // 若找到两个节点 + return root; } - return left; } } -``` - -```java -// 代码精简版 -class Solution { - public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { - if (root == null || root.val == p.val ||root.val == q.val) return root; - TreeNode left = lowestCommonAncestor(root.left,p,q); - TreeNode right = lowestCommonAncestor(root.right,p,q); - if (left != null && right != null) return root; - else if (left == null && right != null) return right; - else if (left != null && right == null) return left; - else return null; - } -} ``` ## Python From 38b8b343c931019e76d7692b99ee7d397538494c Mon Sep 17 00:00:00 2001 From: zhicheng lee <904688436@qq.com> Date: Thu, 9 Dec 2021 11:16:22 +0800 Subject: [PATCH 0092/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20=E9=A2=98?= =?UTF-8?q?=E7=9B=AE0701=20Java=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 --- ...4\346\217\222\345\205\245\346\223\215\344\275\234.md" | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git "a/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" "b/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" index 5d63ce58e3..1e6ab47e1e 100644 --- "a/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" +++ "b/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" @@ -236,16 +236,13 @@ class Solution { ```java class Solution { public TreeNode insertIntoBST(TreeNode root, int val) { - return buildTree(root, val); - } - - public TreeNode buildTree(TreeNode root, int val){ if (root == null) // 如果当前节点为空,也就意味着val找到了合适的位置,此时创建节点直接返回。 return new TreeNode(val); + if (root.val < val){ - root.right = buildTree(root.right, val); // 递归创建右子树 + root.right = insertIntoBST(root.right, val); // 递归创建右子树 }else if (root.val > val){ - root.left = buildTree(root.left, val); // 递归创建左子树 + root.left = insertIntoBST(root.left, val); // 递归创建左子树 } return root; } From 815fe64ffc47c9a5cc90ea150536c89510363f84 Mon Sep 17 00:00:00 2001 From: DtYXs <59554522+DtYXs@users.noreply.github.com> Date: Thu, 9 Dec 2021 11:49:46 +0800 Subject: [PATCH 0093/3019] =?UTF-8?q?Update=200216.=E7=BB=84=E5=90=88?= =?UTF-8?q?=E6=80=BB=E5=92=8CIII.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Python版本代码缺少len(path)==k但sum!=n时的剪枝 --- ...345\220\210\346\200\273\345\222\214III.md" | 39 +++++++++++-------- 1 file changed, 23 insertions(+), 16 deletions(-) diff --git "a/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" "b/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" index fa2ce37f65..76813864b1 100644 --- "a/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" +++ "b/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" @@ -301,22 +301,29 @@ class Solution { ```py class Solution: - def combinationSum3(self, k: int, n: int) -> List[List[int]]: - res = [] #存放结果集 - path = [] #符合条件的结果 - def findallPath(n,k,sum,startIndex): - if sum > n: return #剪枝操作 - if sum == n and len(path) == k: #如果path.size() == k 但sum != n 直接返回 - return res.append(path[:]) - for i in range(startIndex,9-(k-len(path))+2): #剪枝操作 - path.append(i) - sum += i - findallPath(n,k,sum,i+1) #注意i+1调整startIndex - sum -= i #回溯 - path.pop() #回溯 - - findallPath(n,k,0,1) - return res + def __init__(self): + self.res = [] + self.sum_now = 0 + self.path = [] + + def combinationSum3(self, k: int, n: int) -> [[int]]: + self.backtracking(k, n, 1) + return self.res + + def backtracking(self, k: int, n: int, start_num: int): + if self.sum_now > n: # 剪枝 + return + if len(self.path) == k: # len(path)==k时不管sum是否等于n都会返回 + if self.sum_now == n: + self.res.append(self.path[:]) + return + for i in range(start_num, 10 - (k - len(self.path)) + 1): + self.path.append(i) + self.sum_now += i + self.backtracking(k, n, i + 1) + self.path.pop() + self.sum_now -= i + return ``` ## Go: From 1a037380a095ce622a6bdcad1d1b8417b293e0b2 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 Dec 2021 13:33:44 +0800 Subject: [PATCH 0094/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20=E4=BA=8C?= =?UTF-8?q?=E5=8F=89=E6=A0=91=E7=90=86=E8=AE=BA=E5=9F=BA=E7=A1=80=E7=AF=87?= =?UTF-8?q?=20Swift=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...20\206\350\256\272\345\237\272\347\241\200.md" | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" index dab434e69c..411e7e22de 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -227,6 +227,21 @@ function TreeNode(val, left, right) { } ``` +Swift: +```Swift +class TreeNode { + var value: T + var left: TreeNode? + var right: TreeNode? + init(_ value: T, + left: TreeNode? = nil, + right: TreeNode? = nil) { + self.value = value + self.left = left + self.right = right + } +} +``` -----------------------
From e12257efc7279e1e40c277ed0b6fec1957364e27 Mon Sep 17 00:00:00 2001 From: bqlin Date: Fri, 10 Dec 2021 13:45:56 +0800 Subject: [PATCH 0095/3019] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=94=99=E5=88=AB?= =?UTF-8?q?=E5=AD=97=E2=80=9C=E4=B8=8B=E8=A1=A8=E2=80=9D->=E2=80=9C?= =?UTF-8?q?=E4=B8=8B=E6=A0=87=E2=80=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: bqlin --- ...244\346\225\260\344\271\213\345\222\214.md" | 4 ++-- ...233\346\225\260\344\271\213\345\222\214.md" | 4 ++-- ...273\351\231\244\345\205\203\347\264\240.md" | 2 +- ...222\345\205\245\344\275\215\347\275\256.md" | 2 +- ...215\345\220\214\350\267\257\345\276\204.md" | 2 +- ...247\347\232\204\347\237\251\345\275\242.md" | 8 ++++---- ...240\344\272\214\345\217\211\346\240\221.md" | 2 +- ...211\346\220\234\347\264\242\346\240\221.md" | 16 ++++++++-------- ...215\345\274\202\344\275\215\350\257\215.md" | 2 +- ...254\345\255\227\347\254\246\344\270\262.md" | 2 +- ...206\345\217\221\351\245\274\345\271\262.md" | 2 +- ...64\345\244\247\345\205\203\347\264\240I.md" | 14 +++++++------- ...247\344\272\214\345\217\211\346\240\221.md" | 18 +++++++++--------- ...222\345\242\236\345\272\217\345\210\227.md" | 2 +- ...254\346\260\264\346\211\276\351\233\266.md" | 2 +- ...2\345\272\217\346\225\260\347\273\204II.md" | 4 ++-- ...261\350\204\211\346\225\260\347\273\204.md" | 2 +- ...206\350\256\272\345\237\272\347\241\200.md" | 2 +- ...207\351\222\210\346\200\273\347\273\223.md" | 2 +- ...250\346\234\253\346\200\273\347\273\223.md" | 2 +- ...214\350\241\250\346\200\273\347\273\223.md" | 2 +- ...206\350\256\272\345\237\272\347\241\200.md" | 6 +++--- ...246\344\270\262\346\200\273\347\273\223.md" | 2 +- 23 files changed, 52 insertions(+), 52 deletions(-) diff --git "a/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" "b/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" index 4f9dbbadac..f8856d8b72 100644 --- "a/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" @@ -35,9 +35,9 @@ 本题呢,则要使用map,那么来看一下使用数组和set来做哈希法的局限。 * 数组的大小是受限制的,而且如果元素很少,而哈希值太大会造成内存空间的浪费。 -* set是一个集合,里面放的元素只能是一个key,而两数之和这道题目,不仅要判断y是否存在而且还要记录y的下表位置,因为要返回x 和 y的下表。所以set 也不能用。 +* set是一个集合,里面放的元素只能是一个key,而两数之和这道题目,不仅要判断y是否存在而且还要记录y的下标位置,因为要返回x 和 y的下标。所以set 也不能用。 -此时就要选择另一种数据结构:map ,map是一种key value的存储结构,可以用key保存数值,用value在保存数值所在的下表。 +此时就要选择另一种数据结构:map ,map是一种key value的存储结构,可以用key保存数值,用value在保存数值所在的下标。 C++中map,有三种类型: diff --git "a/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" "b/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" index cf9ba9c10b..1dd9a774f0 100644 --- "a/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" @@ -33,9 +33,9 @@ 但是有一些细节需要注意,例如: 不要判断`nums[k] > target` 就返回了,三数之和 可以通过 `nums[i] > 0` 就返回了,因为 0 已经是确定的数了,四数之和这道题目 target是任意值。(大家亲自写代码就能感受出来) -[15.三数之和](https://programmercarl.com/0015.三数之和.html)的双指针解法是一层for循环num[i]为确定值,然后循环内有left和right下表作为双指针,找到nums[i] + nums[left] + nums[right] == 0。 +[15.三数之和](https://programmercarl.com/0015.三数之和.html)的双指针解法是一层for循环num[i]为确定值,然后循环内有left和right下标作为双指针,找到nums[i] + nums[left] + nums[right] == 0。 -四数之和的双指针解法是两层for循环nums[k] + nums[i]为确定值,依然是循环内有left和right下表作为双指针,找出nums[k] + nums[i] + nums[left] + nums[right] == target的情况,三数之和的时间复杂度是O(n^2),四数之和的时间复杂度是O(n^3) 。 +四数之和的双指针解法是两层for循环nums[k] + nums[i]为确定值,依然是循环内有left和right下标作为双指针,找出nums[k] + nums[i] + nums[left] + nums[right] == target的情况,三数之和的时间复杂度是O(n^2),四数之和的时间复杂度是O(n^3) 。 那么一样的道理,五数之和、六数之和等等都采用这种解法。 diff --git "a/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" "b/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" index 9e8e2c3367..f7122b62c9 100644 --- "a/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" +++ "b/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" @@ -58,7 +58,7 @@ public: for (int j = i + 1; j < size; j++) { nums[j - 1] = nums[j]; } - i--; // 因为下表i以后的数值都向前移动了一位,所以i也向前移动一位 + i--; // 因为下标i以后的数值都向前移动了一位,所以i也向前移动一位 size--; // 此时数组的大小-1 } } diff --git "a/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" "b/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" index 0b902c5beb..a3116381cd 100644 --- "a/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" +++ "b/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" @@ -90,7 +90,7 @@ public: 以后大家**只要看到面试题里给出的数组是有序数组,都可以想一想是否可以使用二分法。** -同时题目还强调数组中无重复元素,因为一旦有重复元素,使用二分查找法返回的元素下表可能不是唯一的。 +同时题目还强调数组中无重复元素,因为一旦有重复元素,使用二分查找法返回的元素下标可能不是唯一的。 大体讲解一下二分法的思路,这里来举一个例子,例如在这个数组中,使用二分法寻找元素为5的位置,并返回其下标。 diff --git "a/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" "b/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" index 5d78933282..968ac6b8e3 100644 --- "a/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" +++ "b/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" @@ -243,7 +243,7 @@ public: Java: ```java /** - * 1. 确定dp数组下表含义 dp[i][j] 到每一个坐标可能的路径种类 + * 1. 确定dp数组下标含义 dp[i][j] 到每一个坐标可能的路径种类 * 2. 递推公式 dp[i][j] = dp[i-1][j] dp[i][j-1] * 3. 初始化 dp[i][0]=1 dp[0][i]=1 初始化横竖就可 * 4. 遍历顺序 一行一行遍历 diff --git "a/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" "b/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" index 0c49c58174..d06648aaa0 100644 --- "a/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" +++ "b/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" @@ -140,9 +140,9 @@ public: heights.push_back(0); // 数组尾部加入元素0 st.push(0); int result = 0; - // 第一个元素已经入栈,从下表1开始 + // 第一个元素已经入栈,从下标1开始 for (int i = 1; i < heights.size(); i++) { - // 注意heights[i] 是和heights[st.top()] 比较 ,st.top()是下表 + // 注意heights[i] 是和heights[st.top()] 比较 ,st.top()是下标 if (heights[i] > heights[st.top()]) { st.push(i); } else if (heights[i] == heights[st.top()]) { @@ -251,9 +251,9 @@ class Solution { st.push(0); int result = 0; - // 第一个元素已经入栈,从下表1开始 + // 第一个元素已经入栈,从下标1开始 for (int i = 1; i < heights.length; i++) { - // 注意heights[i] 是和heights[st.top()] 比较 ,st.top()是下表 + // 注意heights[i] 是和heights[st.top()] 比较 ,st.top()是下标 if (heights[i] > heights[st.peek()]) { st.push(i); } else if (heights[i] == heights[st.peek()]) { diff --git "a/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" "b/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" index 6b55b10e5f..41e15a7976 100644 --- "a/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" @@ -272,7 +272,7 @@ public: **此时应该发现了,如上的代码性能并不好,应为每层递归定定义了新的vector(就是数组),既耗时又耗空间,但上面的代码是最好理解的,为了方便读者理解,所以用如上的代码来讲解。** -下面给出用下表索引写出的代码版本:(思路是一样的,只不过不用重复定义vector了,每次用下表索引来分割) +下面给出用下标索引写出的代码版本:(思路是一样的,只不过不用重复定义vector了,每次用下标索引来分割) ### C++优化版本 ```CPP diff --git "a/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" index 04f62e6062..3d0f7b522c 100644 --- "a/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" +++ "b/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" @@ -70,7 +70,7 @@ 那么本题要构造二叉树,依然用递归函数的返回值来构造中节点的左右孩子。 -再来看参数,首先是传入数组,然后就是左下表left和右下表right,我们在[二叉树:构造二叉树登场!](https://programmercarl.com/0106.从中序与后序遍历序列构造二叉树.html)中提过,在构造二叉树的时候尽量不要重新定义左右区间数组,而是用下表来操作原数组。 +再来看参数,首先是传入数组,然后就是左下标left和右下标right,我们在[二叉树:构造二叉树登场!](https://programmercarl.com/0106.从中序与后序遍历序列构造二叉树.html)中提过,在构造二叉树的时候尽量不要重新定义左右区间数组,而是用下标来操作原数组。 所以代码如下: @@ -144,7 +144,7 @@ public: ## 迭代法 -迭代法可以通过三个队列来模拟,一个队列放遍历的节点,一个队列放左区间下表,一个队列放右区间下表。 +迭代法可以通过三个队列来模拟,一个队列放遍历的节点,一个队列放左区间下标,一个队列放右区间下标。 模拟的就是不断分割的过程,C++代码如下:(我已经详细注释) @@ -156,11 +156,11 @@ public: TreeNode* root = new TreeNode(0); // 初始根节点 queue nodeQue; // 放遍历的节点 - queue leftQue; // 保存左区间下表 - queue rightQue; // 保存右区间下表 + queue leftQue; // 保存左区间下标 + queue rightQue; // 保存右区间下标 nodeQue.push(root); // 根节点入队列 - leftQue.push(0); // 0为左区间下表初始位置 - rightQue.push(nums.size() - 1); // nums.size() - 1为右区间下表初始位置 + leftQue.push(0); // 0为左区间下标初始位置 + rightQue.push(nums.size() - 1); // nums.size() - 1为右区间下标初始位置 while (!nodeQue.empty()) { TreeNode* curNode = nodeQue.front(); @@ -267,9 +267,9 @@ class Solution { // 根节点入队列 nodeQueue.offer(root); - // 0为左区间下表初始位置 + // 0为左区间下标初始位置 leftQueue.offer(0); - // nums.size() - 1为右区间下表初始位置 + // nums.size() - 1为右区间下标初始位置 rightQueue.offer(nums.length - 1); while (!nodeQueue.isEmpty()) { diff --git "a/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" "b/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" index 611827586c..34417c701d 100644 --- "a/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" +++ "b/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" @@ -45,7 +45,7 @@ 定义一个数组叫做record用来上记录字符串s里字符出现的次数。 -需要把字符映射到数组也就是哈希表的索引下表上,**因为字符a到字符z的ASCII是26个连续的数值,所以字符a映射为下表0,相应的字符z映射为下表25。** +需要把字符映射到数组也就是哈希表的索引下标上,**因为字符a到字符z的ASCII是26个连续的数值,所以字符a映射为下标0,相应的字符z映射为下标25。** 再遍历 字符串s的时候,**只需要将 s[i] - ‘a’ 所在的元素做+1 操作即可,并不需要记住字符a的ASCII,只要求出一个相对数值就可以了。** 这样就将字符串s中字符出现的次数,统计出来了。 diff --git "a/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" "b/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" index cfd536de24..c45f1941a5 100644 --- "a/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" @@ -63,7 +63,7 @@ 如果对数组和链表原理不清楚的同学,可以看这两篇,[关于链表,你该了解这些!](https://programmercarl.com/链表理论基础.html),[必须掌握的数组理论知识](https://programmercarl.com/数组理论基础.html)。 -对于字符串,我们定义两个指针(也可以说是索引下表),一个从字符串前面,一个从字符串后面,两个指针同时向中间移动,并交换元素。 +对于字符串,我们定义两个指针(也可以说是索引下标),一个从字符串前面,一个从字符串后面,两个指针同时向中间移动,并交换元素。 以字符串`hello`为例,过程如下: diff --git "a/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" "b/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" index 4c7c817aec..be8420832b 100644 --- "a/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" +++ "b/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" @@ -59,7 +59,7 @@ public: int findContentChildren(vector& g, vector& s) { sort(g.begin(), g.end()); sort(s.begin(), s.end()); - int index = s.size() - 1; // 饼干数组的下表 + int index = s.size() - 1; // 饼干数组的下标 int result = 0; for (int i = g.size() - 1; i >= 0; i--) { if (index >= 0 && s[index] >= g[i]) { diff --git "a/problems/0496.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240I.md" "b/problems/0496.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240I.md" index deeae2a691..0ca899fbaa 100644 --- "a/problems/0496.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240I.md" +++ "b/problems/0496.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240I.md" @@ -70,7 +70,7 @@ C++中,当我们要使用集合来解决哈希问题的时候,优先使用un 那么预处理代码如下: ```CPP -unordered_map umap; // key:下表元素,value:下表 +unordered_map umap; // key:下标元素,value:下标 for (int i = 0; i < nums1.size(); i++) { umap[nums1[i]] = i; } @@ -108,7 +108,7 @@ for (int i = 0; i < nums1.size(); i++) { ```CPP while (!st.empty() && nums2[i] > nums2[st.top()]) { if (umap.count(nums2[st.top()]) > 0) { // 看map里是否存在这个元素 - int index = umap[nums2[st.top()]]; // 根据map找到nums2[st.top()] 在 nums1中的下表 + int index = umap[nums2[st.top()]]; // 根据map找到nums2[st.top()] 在 nums1中的下标 result[index] = nums2[i]; } st.pop(); @@ -128,7 +128,7 @@ public: vector result(nums1.size(), -1); if (nums1.size() == 0) return result; - unordered_map umap; // key:下表元素,value:下表 + unordered_map umap; // key:下标元素,value:下标 for (int i = 0; i < nums1.size(); i++) { umap[nums1[i]] = i; } @@ -141,7 +141,7 @@ public: } else { // 情况三 while (!st.empty() && nums2[i] > nums2[st.top()]) { if (umap.count(nums2[st.top()]) > 0) { // 看map里是否存在这个元素 - int index = umap[nums2[st.top()]]; // 根据map找到nums2[st.top()] 在 nums1中的下表 + int index = umap[nums2[st.top()]]; // 根据map找到nums2[st.top()] 在 nums1中的下标 result[index] = nums2[i]; } st.pop(); @@ -166,7 +166,7 @@ public: vector result(nums1.size(), -1); if (nums1.size() == 0) return result; - unordered_map umap; // key:下表元素,value:下表 + unordered_map umap; // key:下标元素,value:下标 for (int i = 0; i < nums1.size(); i++) { umap[nums1[i]] = i; } @@ -174,7 +174,7 @@ public: for (int i = 1; i < nums2.size(); i++) { while (!st.empty() && nums2[i] > nums2[st.top()]) { if (umap.count(nums2[st.top()]) > 0) { // 看map里是否存在这个元素 - int index = umap[nums2[st.top()]]; // 根据map找到nums2[st.top()] 在 nums1中的下表 + int index = umap[nums2[st.top()]]; // 根据map找到nums2[st.top()] 在 nums1中的下标 result[index] = nums2[i]; } st.pop(); @@ -264,7 +264,7 @@ func nextGreaterElement(nums1 []int, nums2 []int) []int { top := stack[len(stack)-1] if _, ok := mp[nums2[top]]; ok { // 看map里是否存在这个元素 - index := mp[nums2[top]]; // 根据map找到nums2[top] 在 nums1中的下表 + index := mp[nums2[top]]; // 根据map找到nums2[top] 在 nums1中的下标 res[index] = nums2[i] } diff --git "a/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" "b/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" index 361a92d16f..d5209b5d39 100644 --- "a/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" @@ -63,7 +63,7 @@ if (nums.size() == 1) { 这里有三步工作 -1. 先要找到数组中最大的值和对应的下表, 最大的值构造根节点,下表用来下一步分割数组。 +1. 先要找到数组中最大的值和对应的下标, 最大的值构造根节点,下标用来下一步分割数组。 代码如下: ```CPP @@ -79,7 +79,7 @@ TreeNode* node = new TreeNode(0); node->val = maxValue; ``` -2. 最大值所在的下表左区间 构造左子树 +2. 最大值所在的下标左区间 构造左子树 这里要判断maxValueIndex > 0,因为要保证左区间至少有一个数值。 @@ -91,7 +91,7 @@ if (maxValueIndex > 0) { } ``` -3. 最大值所在的下表右区间 构造右子树 +3. 最大值所在的下标右区间 构造右子树 判断maxValueIndex < (nums.size() - 1),确保右区间至少有一个数值。 @@ -114,7 +114,7 @@ public: node->val = nums[0]; return node; } - // 找到数组中最大的值和对应的下表 + // 找到数组中最大的值和对应的下标 int maxValue = 0; int maxValueIndex = 0; for (int i = 0; i < nums.size(); i++) { @@ -124,12 +124,12 @@ public: } } node->val = maxValue; - // 最大值所在的下表左区间 构造左子树 + // 最大值所在的下标左区间 构造左子树 if (maxValueIndex > 0) { vector newVec(nums.begin(), nums.begin() + maxValueIndex); node->left = constructMaximumBinaryTree(newVec); } - // 最大值所在的下表右区间 构造右子树 + // 最大值所在的下标右区间 构造右子树 if (maxValueIndex < (nums.size() - 1)) { vector newVec(nums.begin() + maxValueIndex + 1, nums.end()); node->right = constructMaximumBinaryTree(newVec); @@ -141,7 +141,7 @@ public: 以上代码比较冗余,效率也不高,每次还要切割的时候每次都要定义新的vector(也就是数组),但逻辑比较清晰。 -和文章[二叉树:构造二叉树登场!](https://programmercarl.com/0106.从中序与后序遍历序列构造二叉树.html)中一样的优化思路,就是每次分隔不用定义新的数组,而是通过下表索引直接在原数组上操作。 +和文章[二叉树:构造二叉树登场!](https://programmercarl.com/0106.从中序与后序遍历序列构造二叉树.html)中一样的优化思路,就是每次分隔不用定义新的数组,而是通过下标索引直接在原数组上操作。 优化后代码如下: @@ -152,7 +152,7 @@ private: TreeNode* traversal(vector& nums, int left, int right) { if (left >= right) return nullptr; - // 分割点下表:maxValueIndex + // 分割点下标:maxValueIndex int maxValueIndex = left; for (int i = left + 1; i < right; ++i) { if (nums[i] > nums[maxValueIndex]) maxValueIndex = i; @@ -212,7 +212,7 @@ root->right = traversal(nums, maxValueIndex + 1, right); 这道题目其实和 [二叉树:构造二叉树登场!](https://programmercarl.com/0106.从中序与后序遍历序列构造二叉树.html) 是一个思路,比[二叉树:构造二叉树登场!](https://programmercarl.com/0106.从中序与后序遍历序列构造二叉树.html) 还简单一些。 -**注意类似用数组构造二叉树的题目,每次分隔尽量不要定义新的数组,而是通过下表索引直接在原数组上操作,这样可以节约时间和空间上的开销。** +**注意类似用数组构造二叉树的题目,每次分隔尽量不要定义新的数组,而是通过下标索引直接在原数组上操作,这样可以节约时间和空间上的开销。** 一些同学也会疑惑,什么时候递归函数前面加if,什么时候不加if,这个问题我在最后也给出了解释。 diff --git "a/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" "b/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" index 740b0ce70e..c0ea936279 100644 --- "a/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" +++ "b/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" @@ -156,7 +156,7 @@ public: Java: ```java /** - * 1.dp[i] 代表当前下表最大连续值 + * 1.dp[i] 代表当前下标最大连续值 * 2.递推公式 if(nums[i+1]>nums[i]) dp[i+1] = dp[i]+1 * 3.初始化 都为1 * 4.遍历方向,从其那往后 diff --git "a/problems/0860.\346\237\240\346\252\254\346\260\264\346\211\276\351\233\266.md" "b/problems/0860.\346\237\240\346\252\254\346\260\264\346\211\276\351\233\266.md" index feb2f5a0b3..ceb4e5ee19 100644 --- "a/problems/0860.\346\237\240\346\252\254\346\260\264\346\211\276\351\233\266.md" +++ "b/problems/0860.\346\237\240\346\252\254\346\260\264\346\211\276\351\233\266.md" @@ -183,7 +183,7 @@ class Solution: ```golang func lemonadeChange(bills []int) bool { - //left表示还剩多少 下表0位5元的个数 ,下表1为10元的个数 + //left表示还剩多少 下标0位5元的个数 ,下标1为10元的个数 left:=[2]int{0,0} //第一个元素不为5,直接退出 if bills[0]!=5{ diff --git "a/problems/0922.\346\214\211\345\245\207\345\201\266\346\216\222\345\272\217\346\225\260\347\273\204II.md" "b/problems/0922.\346\214\211\345\245\207\345\201\266\346\216\222\345\272\217\346\225\260\347\273\204II.md" index 71b13de1d1..9fec82899b 100644 --- "a/problems/0922.\346\214\211\345\245\207\345\201\266\346\216\222\345\272\217\346\225\260\347\273\204II.md" +++ "b/problems/0922.\346\214\211\345\245\207\345\201\266\346\216\222\345\272\217\346\225\260\347\273\204II.md" @@ -69,8 +69,8 @@ class Solution { public: vector sortArrayByParityII(vector& A) { vector result(A.size()); - int evenIndex = 0; // 偶数下表 - int oddIndex = 1; // 奇数下表 + int evenIndex = 0; // 偶数下标 + int oddIndex = 1; // 奇数下标 for (int i = 0; i < A.size(); i++) { if (A[i] % 2 == 0) { result[evenIndex] = A[i]; diff --git "a/problems/0941.\346\234\211\346\225\210\347\232\204\345\261\261\350\204\211\346\225\260\347\273\204.md" "b/problems/0941.\346\234\211\346\225\210\347\232\204\345\261\261\350\204\211\346\225\260\347\273\204.md" index 24a2906b1b..9c346c53fd 100644 --- "a/problems/0941.\346\234\211\346\225\210\347\232\204\345\261\261\350\204\211\346\225\260\347\273\204.md" +++ "b/problems/0941.\346\234\211\346\225\210\347\232\204\345\261\261\350\204\211\346\225\260\347\273\204.md" @@ -43,7 +43,7 @@ **注意这里还是有一些细节,例如如下两点:** -* 因为left和right是数组下表,移动的过程中注意不要数组越界 +* 因为left和right是数组下标,移动的过程中注意不要数组越界 * 如果left或者right没有移动,说明是一个单调递增或者递减的数组,依然不是山峰 C++代码如下: diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" index dab434e69c..c2feb8a79c 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -93,7 +93,7 @@ 用数组来存储二叉树如何遍历的呢? -**如果父节点的数组下表是i,那么它的左孩子就是i * 2 + 1,右孩子就是 i * 2 + 2。** +**如果父节点的数组下标是 i,那么它的左孩子就是 i * 2 + 1,右孩子就是 i * 2 + 2。** 但是用链式表示的二叉树,更有利于我们理解,所以一般我们都是用链式存储二叉树。 diff --git "a/problems/\345\217\214\346\214\207\351\222\210\346\200\273\347\273\223.md" "b/problems/\345\217\214\346\214\207\351\222\210\346\200\273\347\273\223.md" index e67015e8e7..72ec7b4ed9 100644 --- "a/problems/\345\217\214\346\214\207\351\222\210\346\200\273\347\273\223.md" +++ "b/problems/\345\217\214\346\214\207\351\222\210\346\200\273\347\273\223.md" @@ -30,7 +30,7 @@ for (int i = 0; i < array.size(); i++) { 在[字符串:这道题目,使用库函数一行代码搞定](https://programmercarl.com/0344.反转字符串.html)中讲解了反转字符串,注意这里强调要原地反转,要不然就失去了题目的意义。 -使用双指针法,**定义两个指针(也可以说是索引下表),一个从字符串前面,一个从字符串后面,两个指针同时向中间移动,并交换元素。**,时间复杂度是O(n)。 +使用双指针法,**定义两个指针(也可以说是索引下标),一个从字符串前面,一个从字符串后面,两个指针同时向中间移动,并交换元素。**,时间复杂度是O(n)。 在[替换空格](https://programmercarl.com/剑指Offer05.替换空格.html) 中介绍使用双指针填充字符串的方法,如果想把这道题目做到极致,就不要只用额外的辅助空间了! diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20201010\344\272\214\345\217\211\346\240\221\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20201010\344\272\214\345\217\211\346\240\221\345\221\250\346\234\253\346\200\273\347\273\223.md" index 913ad963ee..215452bd73 100644 --- "a/problems/\345\221\250\346\200\273\347\273\223/20201010\344\272\214\345\217\211\346\240\221\345\221\250\346\234\253\346\200\273\347\273\223.md" +++ "b/problems/\345\221\250\346\200\273\347\273\223/20201010\344\272\214\345\217\211\346\240\221\345\221\250\346\234\253\346\200\273\347\273\223.md" @@ -67,7 +67,7 @@ 知道了如何构造二叉树,那么使用一个套路就可以解决文章[二叉树:构造一棵最大的二叉树](https://programmercarl.com/0654.最大二叉树.html)中的问题。 -**注意类似用数组构造二叉树的题目,每次分隔尽量不要定义新的数组,而是通过下表索引直接在原数组上操作,这样可以节约时间和空间上的开销。** +**注意类似用数组构造二叉树的题目,每次分隔尽量不要定义新的数组,而是通过下标索引直接在原数组上操作,这样可以节约时间和空间上的开销。** 文章中我还给出了递归函数什么时候加if,什么时候不加if,其实就是控制空节点(空指针)是否进入递归,是不同的代码实现方式,都是可以的。 diff --git "a/problems/\345\223\210\345\270\214\350\241\250\346\200\273\347\273\223.md" "b/problems/\345\223\210\345\270\214\350\241\250\346\200\273\347\273\223.md" index 885dc59a44..80534b856f 100644 --- "a/problems/\345\223\210\345\270\214\350\241\250\346\200\273\347\273\223.md" +++ "b/problems/\345\223\210\345\270\214\350\241\250\346\200\273\347\273\223.md" @@ -84,7 +84,7 @@ std::set和std::multiset底层实现都是红黑树,std::unordered_set的底 * 数组的大小是受限制的,而且如果元素很少,而哈希值太大会造成内存空间的浪费。 * set是一个集合,里面放的元素只能是一个key,而两数之和这道题目,不仅要判断y是否存在而且还要记录y的下标位置,因为要返回x 和 y的下标。所以set 也不能用。 -map是一种``的结构,本题可以用key保存数值,用value在保存数值所在的下表。所以使用map最为合适。 +map是一种``的结构,本题可以用key保存数值,用value在保存数值所在的下标。所以使用map最为合适。 C++提供如下三种map::(详情请看[关于哈希表,你该了解这些!](https://programmercarl.com/哈希表理论基础.html)) diff --git "a/problems/\345\223\210\345\270\214\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\345\223\210\345\270\214\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" index 445bfed640..f59d341f50 100644 --- "a/problems/\345\223\210\345\270\214\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\345\223\210\345\270\214\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -14,7 +14,7 @@ 这么这官方的解释可能有点懵,其实直白来讲其实数组就是一张哈希表。 -哈希表中关键码就是数组的索引下表,然后通过下表直接访问数组中的元素,如下图所示: +哈希表中关键码就是数组的索引下标,然后通过下标直接访问数组中的元素,如下图所示: ![哈希表1](https://img-blog.csdnimg.cn/20210104234805168.png) @@ -42,13 +42,13 @@ 此时问题又来了,哈希表我们刚刚说过,就是一个数组。 -如果学生的数量大于哈希表的大小怎么办,此时就算哈希函数计算的再均匀,也避免不了会有几位学生的名字同时映射到哈希表 同一个索引下表的位置。 +如果学生的数量大于哈希表的大小怎么办,此时就算哈希函数计算的再均匀,也避免不了会有几位学生的名字同时映射到哈希表 同一个索引下标的位置。 接下来**哈希碰撞**登场 ### 哈希碰撞 -如图所示,小李和小王都映射到了索引下表 1的位置,**这一现象叫做哈希碰撞**。 +如图所示,小李和小王都映射到了索引下标 1 的位置,**这一现象叫做哈希碰撞**。 ![哈希表3](https://img-blog.csdnimg.cn/2021010423494884.png) diff --git "a/problems/\345\255\227\347\254\246\344\270\262\346\200\273\347\273\223.md" "b/problems/\345\255\227\347\254\246\344\270\262\346\200\273\347\273\223.md" index 6c33615857..ed637f5cb3 100644 --- "a/problems/\345\255\227\347\254\246\344\270\262\346\200\273\347\273\223.md" +++ "b/problems/\345\255\227\347\254\246\344\270\262\346\200\273\347\273\223.md" @@ -93,7 +93,7 @@ KMP的主要思想是**当出现字符串不匹配时,可以知道一部分之 KMP的精髓所在就是前缀表,在[KMP精讲](https://programmercarl.com/0028.实现strStr.html)中提到了,什么是KMP,什么是前缀表,以及为什么要用前缀表。 -前缀表:起始位置到下表i之前(包括i)的子串中,有多大长度的相同前缀后缀。 +前缀表:起始位置到下标i之前(包括i)的子串中,有多大长度的相同前缀后缀。 那么使用KMP可以解决两类经典问题: From 5fe70ed38ac7544ddef107f08a7ad9a590967666 Mon Sep 17 00:00:00 2001 From: lixiyin_lab Date: Fri, 10 Dec 2021 17:11:59 +0800 Subject: [PATCH 0096/3019] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=BD=91=E9=A1=B5?= =?UTF-8?q?=E7=BC=96=E7=A8=8B=E7=B4=A0=E5=85=BB=E9=83=A8=E5=88=86=E7=9A=84?= =?UTF-8?q?=E4=B8=80=E4=BA=9B=E5=90=B9=E6=AF=9B=E6=B1=82=E7=96=B5=EF=BC=8C?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=AD=A4=E9=83=A8=E5=88=86=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E7=9A=84=E5=85=B7=E4=BD=93=E5=86=85=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...72\344\272\214\345\217\211\346\240\221.md" | 16 +++++++++- ...43\347\240\201\351\243\216\346\240\274.md" | 6 ++-- ...21\350\277\220\350\241\214\357\274\237.md" | 4 +-- ...71\346\257\233\346\261\202\347\226\265.md" | 31 +++++++++++++++++++ 4 files changed, 51 insertions(+), 6 deletions(-) create mode 100644 "problems/\345\211\215\345\272\217/\347\274\226\347\250\213\347\264\240\345\205\273\351\203\250\345\210\206\347\232\204\345\220\271\346\257\233\346\261\202\347\226\265.md" diff --git "a/problems/\345\211\215\345\272\217/ACM\346\250\241\345\274\217\345\246\202\344\275\225\346\236\204\345\273\272\344\272\214\345\217\211\346\240\221.md" "b/problems/\345\211\215\345\272\217/ACM\346\250\241\345\274\217\345\246\202\344\275\225\346\236\204\345\273\272\344\272\214\345\217\211\346\240\221.md" index 682e18f578..d0cf234153 100644 --- "a/problems/\345\211\215\345\272\217/ACM\346\250\241\345\274\217\345\246\202\344\275\225\346\236\204\345\273\272\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/\345\211\215\345\272\217/ACM\346\250\241\345\274\217\345\246\202\344\275\225\346\236\204\345\273\272\344\272\214\345\217\211\346\240\221.md" @@ -45,7 +45,21 @@ ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210914223147.png) -那么此时大家是不是应该知道了,数组如何转化成 二叉树了。**如果父节点的数组下标是i,那么它的左孩子下标就是i * 2 + 1,右孩子下标就是 i * 2 + 2**。 +那么此时大家是不是应该知道了,数组如何转化成 二叉树了。**如果父节点的数组下标是i,那么它的左孩子下标就是i * 2 + 1,右孩子下标就是 i * 2 + 2**。计算过程为: + +如果父节点在第$k$层,第$m,m \in [0,2^k]$个节点,则其左孩子所在的位置必然为$k+1$层,第$2*(m-1)+1$个节点。 + +- 计算父节点在数组中的索引: + $$ + index_{father}=(\sum_{i=0}^{i=k-1}2^i)+m-1=2^k-1+m-1 + $$ + +- 计算左子节点在数组的索引: + $$ + index_{left}=(\sum_{i=0}^{i=k}2^i)+2*m-1-1=2^{k+1}+2m-3 + $$ + +- 故左孩子的下表为$index_{left}=index_{father}\times2+1$,同理可得到右子孩子的索引关系。也可以直接在左子孩子的基础上`+1`。 那么这里又有同学疑惑了,这些我都懂了,但我还是不知道 应该 怎么构造。 diff --git "a/problems/\345\211\215\345\272\217/\344\273\243\347\240\201\351\243\216\346\240\274.md" "b/problems/\345\211\215\345\272\217/\344\273\243\347\240\201\351\243\216\346\240\274.md" index a71ac420a5..b48665e5d4 100644 --- "a/problems/\345\211\215\345\272\217/\344\273\243\347\240\201\351\243\216\346\240\274.md" +++ "b/problems/\345\211\215\345\272\217/\344\273\243\347\240\201\351\243\216\346\240\274.md" @@ -13,7 +13,7 @@ 最近看了很多录友在[leetcode-master](https://mp.weixin.qq.com/s/wZRTrA9Rbvgq1yEkSw4vfQ)上提交的代码,发现很多录友的代码其实并不规范,这一点平时在交流群和知识星球里也能看出来。 -很多录友对代码规范应该不甚了解,代码看起来并不舒服。 +很多录友对代码规范应该了解得不多,代码看起来并不舒服。 所以呢,我给大家讲一讲代码规范,我主要以C++代码为例。 @@ -27,7 +27,7 @@ 现在一些小公司,甚至大公司里的某些技术团队也不注重代码规范,赶进度撸出功能就完事,这种情况就要分两方面看: -* 第一种情况:这个项目在业务上具有巨大潜力,需要抢占市场,只要先站住市场就能赚到钱,每年年终好几十万,那项目前期还关心啥代码风格,赶进度把功能撸出来,赚钱就完事了,例如12年的微信,15年的王者荣耀。这些项目都是后期在不断优化的。 +* 第一种情况:这个项目在业务上具有巨大潜力,需要抢占市场,只要先站住市场就能赚到钱,每年年终好几十万,那项目前期还关心啥代码风格,赶进度把功能撸出来,赚钱就完事了,例如12年的微信,15年的王者荣耀。这些项目都是后期再不断优化的。 * 第二种情况:这个项目没赚到钱,半死不活的,代码还没有设计也没有规范,这样对技术人员的伤害就非常大了。 @@ -39,7 +39,7 @@ 这里我简单说一说规范问题。 -**权威的C++规范以Google为主**,我给大家下载了一份中文版本,在公众号「代码随想录」后台回复:googlec++编程规范,就可以领取。 +**权威的C++规范以Google为主**,我给大家下载了一份中文版本,在公众号「代码随想录」后台回复:googlec++编程规范,就可以领取。(涉及到微信后台的回复,没更改) **具体的规范要以自己团队风格为主**,融入团队才是最重要的。 diff --git "a/problems/\345\211\215\345\272\217/\345\212\233\346\211\243\344\270\212\347\232\204\344\273\243\347\240\201\346\203\263\345\234\250\346\234\254\345\234\260\347\274\226\350\257\221\350\277\220\350\241\214\357\274\237.md" "b/problems/\345\211\215\345\272\217/\345\212\233\346\211\243\344\270\212\347\232\204\344\273\243\347\240\201\346\203\263\345\234\250\346\234\254\345\234\260\347\274\226\350\257\221\350\277\220\350\241\214\357\274\237.md" index 970af7ffc6..c4899a2068 100644 --- "a/problems/\345\211\215\345\272\217/\345\212\233\346\211\243\344\270\212\347\232\204\344\273\243\347\240\201\346\203\263\345\234\250\346\234\254\345\234\260\347\274\226\350\257\221\350\277\220\350\241\214\357\274\237.md" +++ "b/problems/\345\211\215\345\272\217/\345\212\233\346\211\243\344\270\212\347\232\204\344\273\243\347\240\201\346\203\263\345\234\250\346\234\254\345\234\260\347\274\226\350\257\221\350\277\220\350\241\214\357\274\237.md" @@ -13,11 +13,11 @@ 然后录友就问了:如何打日志呢? -其实在力扣上打日志也挺方便的,我一般调试就是直接在力扣上打日志,偶尔需要把代码粘到本例来运行添加日志debug一下。 +其实在力扣上打日志也挺方便的,我一般调试就是直接在力扣上打日志,偶尔需要把代码粘到本地来运行添加日志debug一下。 在力扣上直接打日志,这个就不用讲,C++的话想打啥直接cout啥就可以了。 -我来说一说力扣代码如何在本题运行。 +我来说一说力扣代码如何在本地运行。 毕竟我们天天用力扣刷题,也应该知道力扣上的代码如何在本地编译运行。 diff --git "a/problems/\345\211\215\345\272\217/\347\274\226\347\250\213\347\264\240\345\205\273\351\203\250\345\210\206\347\232\204\345\220\271\346\257\233\346\261\202\347\226\265.md" "b/problems/\345\211\215\345\272\217/\347\274\226\347\250\213\347\264\240\345\205\273\351\203\250\345\210\206\347\232\204\345\220\271\346\257\233\346\261\202\347\226\265.md" new file mode 100644 index 0000000000..3f18f9d1d5 --- /dev/null +++ "b/problems/\345\211\215\345\272\217/\347\274\226\347\250\213\347\264\240\345\205\273\351\203\250\345\210\206\347\232\204\345\220\271\346\257\233\346\261\202\347\226\265.md" @@ -0,0 +1,31 @@ +## 代码风格 + +- `不甚了解`是不能更了解的意思,这个地方应该使用存疑。 +- `后期在不断优化`,'在'应为'再'。 +- `googlec++编程规范`,Google拼写错误 + +## 代码本地编译 + +- `粘到本例来运行`存疑,应为本地 +- `本题运行`存疑,应为本地 + +## ACM二叉树 + +- 左孩子和右孩子的下标不太好理解。我给出证明过程: + + 如果父节点在第$k$层,第$m,m \in [0,2^k]$个节点,则其左孩子所在的位置必然为$k+1$层,第$2*(m-1)+1$个节点。 + + - 计算父节点在数组中的索引: + $$ + index_{father}=(\sum_{i=0}^{i=k-1}2^i)+m-1=2^k-1+m-1 + $$ + + - 计算左子节点在数组的索引: + $$ + index_{left}=(\sum_{i=0}^{i=k}2^i)+2*m-1-1=2^{k+1}+2m-3 + $$ + + - 故左孩子的下表为$index_{left}=index_{father}\times2+1$,同理可得到右子孩子的索引关系。也可以直接在左子孩子的基础上`+1`。 + + + From e662df7c0c602f90f9cdc129c71b709dfdeb3337 Mon Sep 17 00:00:00 2001 From: bqlin Date: Fri, 10 Dec 2021 17:19:39 +0800 Subject: [PATCH 0097/3019] =?UTF-8?q?=E9=9D=A2=E8=AF=95=E9=A2=9802.07.?= =?UTF-8?q?=E9=93=BE=E8=A1=A8=E7=9B=B8=E4=BA=A4=EF=BC=9A=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?C=E8=AF=AD=E8=A8=80=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...76\350\241\250\347\233\270\344\272\244.md" | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git "a/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" "b/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" index e3c284c0ab..9d399ef95f 100644 --- "a/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" +++ "b/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" @@ -249,6 +249,45 @@ var getIntersectionNode = function(headA, headB) { }; ``` +C: + +```c +ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) { + ListNode *l = NULL, *s = NULL; + int lenA = 0, lenB = 0, gap = 0; + // 求出两个链表的长度 + s = headA; + while (s) { + lenA ++; + s = s->next; + } + s = headB; + while (s) { + lenB ++; + s = s->next; + } + + // 求出两个链表长度差 + if (lenA > lenB) { + l = headA, s = headB; + gap = lenA - lenB; + } else { + l = headB, s = headA; + gap = lenB - lenA; + } + + // 尾部对齐 + while (gap--) l = l->next; + // 移动,并检查是否有相同的元素 + while (l) { + if (l == s) return l; + l = l->next, s = s->next; + } + + return NULL; +} +``` + From 973582cd7e9aaec35af835177254dfc35b712802 Mon Sep 17 00:00:00 2001 From: bqlin Date: Fri, 10 Dec 2021 17:32:54 +0800 Subject: [PATCH 0098/3019] =?UTF-8?q?0142.=E7=8E=AF=E5=BD=A2=E9=93=BE?= =?UTF-8?q?=E8=A1=A8II=EF=BC=9A=E6=B7=BB=E5=8A=A0C=E8=AF=AD=E8=A8=80?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\345\275\242\351\223\276\350\241\250II.md" | 25 +++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git "a/problems/0142.\347\216\257\345\275\242\351\223\276\350\241\250II.md" "b/problems/0142.\347\216\257\345\275\242\351\223\276\350\241\250II.md" index 60bb10b706..fb2172c6db 100644 --- "a/problems/0142.\347\216\257\345\275\242\351\223\276\350\241\250II.md" +++ "b/problems/0142.\347\216\257\345\275\242\351\223\276\350\241\250II.md" @@ -33,11 +33,11 @@ ### 判断链表是否有环 -可以使用快慢指针法, 分别定义 fast 和 slow指针,从头结点出发,fast指针每次移动两个节点,slow指针每次移动一个节点,如果 fast 和 slow指针在途中相遇 ,说明这个链表有环。 +可以使用快慢指针法,分别定义 fast 和 slow 指针,从头结点出发,fast指针每次移动两个节点,slow指针每次移动一个节点,如果 fast 和 slow指针在途中相遇 ,说明这个链表有环。 为什么fast 走两个节点,slow走一个节点,有环的话,一定会在环内相遇呢,而不是永远的错开呢 -首先第一点: **fast指针一定先进入环中,如果fast 指针和slow指针相遇的话,一定是在环中相遇,这是毋庸置疑的。** +首先第一点:**fast指针一定先进入环中,如果fast指针和slow指针相遇的话,一定是在环中相遇,这是毋庸置疑的。** 那么来看一下,**为什么fast指针和slow指针一定会相遇呢?** @@ -328,5 +328,26 @@ extension ListNode: Equatable { } ``` +C: + +```c +ListNode *detectCycle(ListNode *head) { + ListNode *fast = head, *slow = head; + while (fast && fast->next) { + // 这里判断两个指针是否相等,所以移位操作放在前面 + slow = slow->next; + fast = fast->next->next; + if (slow == fast) { // 相交,开始找环形入口:分别从头部和从交点出发,找到相遇的点就是环形入口 + ListNode *f = fast, *h = head; + while (f != h) f = f->next, h = h->next; + return h; + } + } + return NULL; +} +``` + + + -----------------------
From 90638af21a1756fea854b38a03a5e3271b13f173 Mon Sep 17 00:00:00 2001 From: bqlin Date: Fri, 10 Dec 2021 20:07:53 +0800 Subject: [PATCH 0099/3019] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=8E=92=E7=89=88?= =?UTF-8?q?=EF=BC=8C=E6=8A=8A=E5=A4=8D=E6=9D=82=E5=BA=A6=E6=A0=87=E8=AE=B0?= =?UTF-8?q?=E4=B8=BA=E5=85=AC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- ...44\346\225\260\344\271\213\345\222\214.md" | 8 ++-- ...36\346\226\207\345\255\220\344\270\262.md" | 10 ++-- ...11\346\225\260\344\271\213\345\222\214.md" | 6 +-- ...33\346\225\260\344\271\213\345\222\214.md" | 6 +-- ...55\347\232\204\350\212\202\347\202\271.md" | 5 +- ...73\351\231\244\345\205\203\347\264\240.md" | 6 +-- .../0028.\345\256\236\347\216\260strStr.md" | 4 +- ...00\344\270\252\344\275\215\347\275\256.md" | 2 +- ...22\345\205\245\344\275\215\347\275\256.md" | 15 +++--- ...2.\346\216\245\351\233\250\346\260\264.md" | 9 ++-- ...47\345\255\220\345\272\217\345\222\214.md" | 14 +++--- ...01\350\247\204\345\210\222\357\274\211.md" | 5 +- ...10\345\271\266\345\214\272\351\227\264.md" | 4 +- ...\346\227\213\347\237\251\351\230\265II.md" | 2 +- ...15\345\220\214\350\267\257\345\276\204.md" | 16 ++++--- ...\345\220\214\350\267\257\345\276\204II.md" | 5 +- ...0.\347\210\254\346\245\274\346\242\257.md" | 10 ++-- ...47\347\232\204\347\237\251\345\275\242.md" | 2 +- ...11\346\220\234\347\264\242\346\240\221.md" | 5 +- ...00\344\275\263\346\227\266\346\234\272.md" | 18 ++++---- ...\344\275\263\346\227\266\346\234\272II.md" | 10 ++-- ...01\350\247\204\345\210\222\357\274\211.md" | 12 ++--- ...344\275\263\346\227\266\346\234\272III.md" | 8 ++-- ...4.\345\212\240\346\262\271\347\253\231.md" | 15 +++--- ...25\350\257\215\346\213\206\345\210\206.md" | 11 +++-- ...14\347\232\204\345\215\225\350\257\215.md" | 10 ++-- ...13\350\275\254\346\225\260\347\273\204.md" | 4 +- ...04\345\255\220\346\225\260\347\273\204.md" | 8 ++-- ...02\347\202\271\344\270\252\346\225\260.md" | 12 ++--- ...43\346\234\200\345\244\247\345\200\274.md" | 10 ++-- ...15\345\274\202\344\275\215\350\257\215.md" | 4 +- ...3.\347\247\273\345\212\250\351\233\266.md" | 2 +- ...53\345\206\267\345\206\273\346\234\237.md" | 4 +- ...345\256\266\345\212\253\350\210\215III.md" | 13 +++--- ...64\346\225\260\346\213\206\345\210\206.md" | 9 ++-- ...54\345\255\227\347\254\246\344\270\262.md" | 2 +- ...30\351\242\221\345\205\203\347\264\240.md" | 2 +- ...04\347\232\204\344\272\244\351\233\206.md" | 2 +- ...06\345\212\250\345\272\217\345\210\227.md" | 14 +++--- ...55\345\255\220\345\272\217\345\210\227.md" | 6 +-- ...15\345\273\272\351\230\237\345\210\227.md" | 10 ++-- ...11\345\222\214\345\255\220\351\233\206.md" | 4 +- ...15\345\217\240\345\214\272\351\227\264.md" | 4 +- ...55\347\232\204\350\212\202\347\202\271.md" | 2 +- ...25\347\210\206\346\260\224\347\220\203.md" | 4 +- ...4.\347\233\256\346\240\207\345\222\214.md" | 4 +- ...\345\244\247\345\205\203\347\264\240II.md" | 2 +- ...42\351\202\243\345\245\221\346\225\260.md" | 12 ++--- ...36\346\226\207\345\255\220\344\270\262.md" | 11 +++-- ...27\347\232\204\344\270\252\346\225\260.md" | 6 +-- ...22\345\242\236\345\272\217\345\210\227.md" | 10 ++-- ...53\346\211\213\347\273\255\350\264\271.md" | 13 +++--- ...01\350\247\204\345\210\222\357\274\211.md" | 9 ++-- ...15\345\255\220\346\225\260\347\273\204.md" | 8 ++-- ...36\347\232\204\346\225\260\345\255\227.md" | 8 ++-- ...17\346\227\245\346\270\251\345\272\246.md" | 10 ++-- ...71\347\210\254\346\245\274\346\242\257.md" | 8 ++-- ...27\346\257\215\345\214\272\351\227\264.md" | 4 +- ...04\345\255\227\347\254\246\344\270\262.md" | 17 +++---- ...\345\272\217\346\225\260\347\273\204II.md" | 18 ++++---- ...77\346\214\211\351\224\256\345\205\245.md" | 4 +- ...04\347\232\204\345\271\263\346\226\271.md" | 4 +- ...70\347\224\250\345\255\227\347\254\246.md" | 2 +- ...\347\232\204\351\207\215\351\207\217II.md" | 4 +- ...27\347\232\204\346\225\260\345\255\227.md" | 4 +- ...57\345\244\232\345\244\247\357\274\237.md" | 20 ++++---- ...50\350\277\231\351\207\214\357\274\201.md" | 44 +++++++++--------- ...57\345\244\232\345\244\247\357\274\237.md" | 18 ++++---- ...50\350\277\231\351\207\214\357\274\201.md" | 46 +++++++++---------- ...52\347\226\221\351\227\256\357\274\237.md" | 16 +++---- ...02\345\272\246\345\210\206\346\236\220.md" | 28 +++++------ ...15\346\235\202\345\272\246\357\274\201.md" | 24 +++++----- ...77\346\215\242\347\251\272\346\240\274.md" | 8 ++-- ...54\345\255\227\347\254\246\344\270\262.md" | 2 +- ...30\346\200\273\347\273\223\347\257\207.md" | 33 ++++++------- ...07\351\222\210\346\200\273\347\273\223.md" | 18 ++++---- ...50\346\234\253\346\200\273\347\273\223.md" | 2 +- ...50\346\234\253\346\200\273\347\273\223.md" | 12 ++--- ...50\346\234\253\346\200\273\347\273\223.md" | 2 +- ...50\346\234\253\346\200\273\347\273\223.md" | 2 +- ...50\346\234\253\346\200\273\347\273\223.md" | 12 ++--- ...50\346\234\253\346\200\273\347\273\223.md" | 2 +- ...50\346\234\253\346\200\273\347\273\223.md" | 18 ++++---- ...23\347\263\273\345\210\227\344\270\200.md" | 2 +- ...06\350\256\272\345\237\272\347\241\200.md" | 14 +++--- ...36\346\272\257\346\200\273\347\273\223.md" | 26 +++++------ ...00\347\247\215\345\206\231\346\263\225.md" | 6 +-- ...46\344\270\262\346\200\273\347\273\223.md" | 6 +-- ...04\346\200\273\347\273\223\347\257\207.md" | 28 +++-------- ...37\345\210\227\346\200\273\347\273\223.md" | 2 +- ...06\350\256\262\350\247\243\357\274\211.md" | 8 ++-- ...50\345\272\223\345\207\275\346\225\260.md" | 2 +- ...47\241\20001\350\203\214\345\214\205-1.md" | 2 +- ...32\351\207\215\350\203\214\345\214\205.md" | 4 +- ...06\350\256\272\345\237\272\347\241\200.md" | 10 ++-- 96 files changed, 462 insertions(+), 449 deletions(-) diff --git a/README.md b/README.md index 12781e7701..b3f09d4997 100644 --- a/README.md +++ b/README.md @@ -115,7 +115,7 @@ * 算法性能分析 * [关于时间复杂度,你不知道的都在这里!](./problems/前序/关于时间复杂度,你不知道的都在这里!.md) - * [O(n)的算法居然超时了,此时的n究竟是多大?](./problems/前序/On的算法居然超时了,此时的n究竟是多大?.md) + * [$O(n)$的算法居然超时了,此时的n究竟是多大?](./problems/前序/On的算法居然超时了,此时的n究竟是多大?.md) * [通过一道面试题目,讲一讲递归算法的时间复杂度!](./problems/前序/通过一道面试题目,讲一讲递归算法的时间复杂度!.md) * [本周小结!(算法性能分析系列一)](./problems/周总结/20201210复杂度分析周末总结.md) * [关于空间复杂度,可能有几个疑问?](./problems/前序/关于空间复杂度,可能有几个疑问?.md) diff --git "a/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" "b/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" index f8856d8b72..f612a11017 100644 --- "a/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" @@ -24,7 +24,7 @@ ## 思路 -很明显暴力的解法是两层for循环查找,时间复杂度是O(n^2)。 +很明显暴力的解法是两层for循环查找,时间复杂度是$O(n^2)$。 建议大家做这道题目之前,先做一下这两道 * [242. 有效的字母异位词](https://www.programmercarl.com/0242.有效的字母异位词.html) @@ -43,9 +43,9 @@ C++中map,有三种类型: |映射 |底层实现 | 是否有序 |数值是否可以重复 | 能否更改数值|查询效率 |增删效率| |---|---| --- |---| --- | --- | ---| -|std::map |红黑树 |key有序 |key不可重复 |key不可修改 | O(logn)|O(logn) | -|std::multimap | 红黑树|key有序 | key可重复 | key不可修改|O(logn) |O(logn) | -|std::unordered_map |哈希表 | key无序 |key不可重复 |key不可修改 |O(1) | O(1)| +|std::map |红黑树 |key有序 |key不可重复 |key不可修改 | $O(\log n)$|$O(\log n)$ | +|std::multimap | 红黑树|key有序 | key可重复 | key不可修改|$O(\log n)$ |$O(\log n)$ | +|std::unordered_map |哈希表 | key无序 |key不可重复 |key不可修改 |$O(1)$ | $O(1)$| std::unordered_map 底层实现为哈希表,std::map 和std::multimap 的底层实现是红黑树。 diff --git "a/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" "b/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" index cb022ac382..c54de0397b 100644 --- "a/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" +++ "b/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" @@ -38,7 +38,7 @@ 两层for循环,遍历区间起始位置和终止位置,然后判断这个区间是不是回文。 -时间复杂度:O(n^3) +时间复杂度:$O(n^3)$ ## 动态规划 @@ -205,8 +205,8 @@ public: ``` -* 时间复杂度:O(n^2) -* 空间复杂度:O(n^2) +* 时间复杂度:$O(n^2)$ +* 空间复杂度:$O(n^2)$ ## 双指针 @@ -253,8 +253,8 @@ public: ``` -* 时间复杂度:O(n^2) -* 空间复杂度:O(1) +* 时间复杂度:$O(n^2)$ +* 空间复杂度:$O(1)$ diff --git "a/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" "b/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" index 1e67525456..38158bc645 100644 --- "a/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" @@ -39,7 +39,7 @@ 去重的过程不好处理,有很多小细节,如果在面试中很难想到位。 -时间复杂度可以做到O(n^2),但还是比较费时的,因为不好做剪枝操作。 +时间复杂度可以做到$O(n^2)$,但还是比较费时的,因为不好做剪枝操作。 大家可以尝试使用哈希法写一写,就知道其困难的程度了。 @@ -85,7 +85,7 @@ public: **其实这道题目使用哈希法并不十分合适**,因为在去重的操作中有很多细节需要注意,在面试中很难直接写出没有bug的代码。 -而且使用哈希法 在使用两层for循环的时候,能做的剪枝操作很有限,虽然时间复杂度是O(n^2),也是可以在leetcode上通过,但是程序的执行时间依然比较长 。 +而且使用哈希法 在使用两层for循环的时候,能做的剪枝操作很有限,虽然时间复杂度是$O(n^2)$,也是可以在leetcode上通过,但是程序的执行时间依然比较长 。 接下来我来介绍另一个解法:双指针法,**这道题目使用双指针法 要比哈希法高效一些**,那么来讲解一下具体实现的思路。 @@ -101,7 +101,7 @@ public: 如果 nums[i] + nums[left] + nums[right] < 0 说明 此时 三数之和小了,left 就向右移动,才能让三数之和大一些,直到left与right相遇为止。 -时间复杂度:O(n^2)。 +时间复杂度:$O(n^2)$。 C++代码代码如下: diff --git "a/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" "b/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" index 1dd9a774f0..25350b7af8 100644 --- "a/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" @@ -35,11 +35,11 @@ [15.三数之和](https://programmercarl.com/0015.三数之和.html)的双指针解法是一层for循环num[i]为确定值,然后循环内有left和right下标作为双指针,找到nums[i] + nums[left] + nums[right] == 0。 -四数之和的双指针解法是两层for循环nums[k] + nums[i]为确定值,依然是循环内有left和right下标作为双指针,找出nums[k] + nums[i] + nums[left] + nums[right] == target的情况,三数之和的时间复杂度是O(n^2),四数之和的时间复杂度是O(n^3) 。 +四数之和的双指针解法是两层for循环nums[k] + nums[i]为确定值,依然是循环内有left和right下标作为双指针,找出nums[k] + nums[i] + nums[left] + nums[right] == target的情况,三数之和的时间复杂度是$O(n^2)$,四数之和的时间复杂度是$O(n^3)$ 。 那么一样的道理,五数之和、六数之和等等都采用这种解法。 -对于[15.三数之和](https://programmercarl.com/0015.三数之和.html)双指针法就是将原本暴力O(n^3)的解法,降为O(n^2)的解法,四数之和的双指针解法就是将原本暴力O(n^4)的解法,降为O(n^3)的解法。 +对于[15.三数之和](https://programmercarl.com/0015.三数之和.html)双指针法就是将原本暴力$O(n^3)$的解法,降为$O(n^2)$的解法,四数之和的双指针解法就是将原本暴力$O(n^4)$的解法,降为$O(n^3)$的解法。 之前我们讲过哈希表的经典题目:[454.四数相加II](https://programmercarl.com/0454.四数相加II.html),相对于本题简单很多,因为本题是要求在一个集合中找出四个数相加等于target,同时四元组不能重复。 @@ -47,7 +47,7 @@ 我们来回顾一下,几道题目使用了双指针法。 -双指针法将时间复杂度O(n^2)的解法优化为 O(n)的解法。也就是降一个数量级,题目如下: +双指针法将时间复杂度:$O(n^2)$的解法优化为 $O(n)$的解法。也就是降一个数量级,题目如下: * [27.移除元素](https://programmercarl.com/0027.移除元素.html) * [15.三数之和](https://programmercarl.com/0015.三数之和.html) diff --git "a/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" "b/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" index 4f1f79564d..aa1e11182f 100644 --- "a/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" +++ "b/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" @@ -62,6 +62,7 @@ public: } }; ``` + * 时间复杂度:$O(n)$ * 空间复杂度:$O(1)$ @@ -73,7 +74,7 @@ public: 上面的代码我第一次提交执行用时8ms,打败6.5%的用户,差点吓到我了。 -心想应该没有更好的方法了吧,也就O(n)的时间复杂度,重复提交几次,这样了: +心想应该没有更好的方法了吧,也就$O(n)$的时间复杂度,重复提交几次,这样了: ![24.两两交换链表中的节点](https://code-thinking.cdn.bcebos.com/pics/24.%E4%B8%A4%E4%B8%A4%E4%BA%A4%E6%8D%A2%E9%93%BE%E8%A1%A8%E4%B8%AD%E7%9A%84%E8%8A%82%E7%82%B9.png) @@ -85,7 +86,7 @@ public: ## 其他语言版本 C: -``` +```c /** * Definition for singly-linked list. * struct ListNode { diff --git "a/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" "b/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" index f7122b62c9..b0376f515f 100644 --- "a/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" +++ "b/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" @@ -11,7 +11,7 @@ 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。 -不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并**原地**修改输入数组。 +不要使用额外的数组空间,你必须仅使用 $O(1)$ 额外空间并**原地**修改输入数组。 元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。 @@ -184,8 +184,8 @@ func removeElement(nums []int, val int) int { JavaScript: ```javascript -//时间复杂度O(n) -//空间复杂度O(1) +//时间复杂度:O(n) +//空间复杂度:O(1) var removeElement = (nums, val) => { let k = 0; for(let i = 0;i < nums.length;i++){ diff --git "a/problems/0028.\345\256\236\347\216\260strStr.md" "b/problems/0028.\345\256\236\347\216\260strStr.md" index 1c654dd456..91f8a5240d 100644 --- "a/problems/0028.\345\256\236\347\216\260strStr.md" +++ "b/problems/0028.\345\256\236\347\216\260strStr.md" @@ -229,9 +229,9 @@ next数组就可以是前缀表,但是很多实现都是把前缀表统一减 # 时间复杂度分析 -其中n为文本串长度,m为模式串长度,因为在匹配的过程中,根据前缀表不断调整匹配的位置,可以看出匹配的过程是O(n),之前还要单独生成next数组,时间复杂度是O(m)。所以整个KMP算法的时间复杂度是O(n+m)的。 +其中n为文本串长度,m为模式串长度,因为在匹配的过程中,根据前缀表不断调整匹配的位置,可以看出匹配的过程是$O(n)$,之前还要单独生成next数组,时间复杂度是$O(m)$。所以整个KMP算法的时间复杂度是$O(n+m)$的。 -暴力的解法显而易见是O(n * m),所以**KMP在字符串匹配中极大的提高的搜索的效率。** +暴力的解法显而易见是$O(n × m)$,所以**KMP在字符串匹配中极大的提高的搜索的效率。** 为了和力扣题目28.实现strStr保持一致,方便大家理解,以下文章统称haystack为文本串, needle为模式串。 diff --git "a/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" "b/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" index f39672533e..44f1329525 100644 --- "a/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" +++ "b/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" @@ -11,7 +11,7 @@ 如果数组中不存在目标值 target,返回 [-1, -1]。 -进阶:你可以设计并实现时间复杂度为 O(log n) 的算法解决此问题吗? +进阶:你可以设计并实现时间复杂度为 $O(\log n)$ 的算法解决此问题吗? 示例 1: diff --git "a/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" "b/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" index a3116381cd..1f66e6bd7a 100644 --- "a/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" +++ "b/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" @@ -73,8 +73,8 @@ public: }; ``` -* 时间复杂度:O(n) -* 空间复杂度:O(1) +* 时间复杂度:$O(n)$ +* 空间复杂度:$O(1)$ 效率如下: @@ -82,7 +82,7 @@ public: ### 二分法 -既然暴力解法的时间复杂度是O(n),就要尝试一下使用二分查找法。 +既然暴力解法的时间复杂度是$O(n)$,就要尝试一下使用二分查找法。 ![35_搜索插入位置4](https://img-blog.csdnimg.cn/202012162326354.png) @@ -140,8 +140,9 @@ public: } }; ``` -* 时间复杂度:O(logn) -* 时间复杂度:O(1) + +* 时间复杂度:$O(\log n)$ +* 时间复杂度:$O(1)$ 效率如下: ![35_搜索插入位置2](https://img-blog.csdnimg.cn/2020121623272877.png) @@ -183,8 +184,8 @@ public: }; ``` -* 时间复杂度:O(logn) -* 时间复杂度:O(1) +* 时间复杂度:$O(\log n)$ +* 时间复杂度:$O(1)$ ## 总结 diff --git "a/problems/0042.\346\216\245\351\233\250\346\260\264.md" "b/problems/0042.\346\216\245\351\233\250\346\260\264.md" index 3c1577a84b..2022f6cc58 100644 --- "a/problems/0042.\346\216\245\351\233\250\346\260\264.md" +++ "b/problems/0042.\346\216\245\351\233\250\346\260\264.md" @@ -129,8 +129,8 @@ public: }; ``` -因为每次遍历列的时候,还要向两边寻找最高的列,所以时间复杂度为O(n^2)。 -空间复杂度为O(1)。 +因为每次遍历列的时候,还要向两边寻找最高的列,所以时间复杂度为$O(n^2)$。 +空间复杂度为$O(1)$。 @@ -778,8 +778,9 @@ int trap(int* height, int heightSize) { return ans; } ``` -时间复杂度 O(n) -空间复杂度 O(1) + +* 时间复杂度 $O(n)$ +* 空间复杂度 $O(1)$ ----------------------- diff --git "a/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" "b/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" index 6f75935c8f..8c62440e15 100644 --- "a/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" +++ "b/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" @@ -21,8 +21,9 @@ 暴力解法的思路,第一层for 就是设置起始位置,第二层for循环遍历数组寻找最大值 -时间复杂度:O(n^2) -空间复杂度:O(1) +* 时间复杂度:$O(n^2)$ +* 空间复杂度:$O(1)$ + ```CPP class Solution { public: @@ -96,8 +97,9 @@ public: } }; ``` -时间复杂度:O(n) -空间复杂度:O(1) + +* 时间复杂度:$O(n)$ +* 空间复杂度:$O(1)$ 当然题目没有说如果数组为空,应该返回什么,所以数组为空的话返回啥都可以了。 @@ -126,8 +128,8 @@ public: }; ``` -时间复杂度:O(n) -空间复杂度:O(n) +* 时间复杂度:$O(n)$ +* 空间复杂度:$O(n)$ ## 总结 diff --git "a/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" "b/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" index 9e9f5511c9..e88f996108 100644 --- "a/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" +++ "b/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" @@ -79,8 +79,9 @@ public: } }; ``` -* 时间复杂度:O(n) -* 空间复杂度:O(n) + +* 时间复杂度:$O(n)$ +* 空间复杂度:$O(n)$ ## 总结 diff --git "a/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" "b/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" index 2732f5ee74..b7b05699fb 100644 --- "a/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" +++ "b/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" @@ -112,8 +112,8 @@ public: }; ``` -* 时间复杂度:O(nlogn) ,有一个快排 -* 空间复杂度:O(1),我没有算result数组(返回值所需容器占的空间) +* 时间复杂度:$O(n\log n)$ ,有一个快排 +* 空间复杂度:$O(1)$,我没有算result数组(返回值所需容器占的空间) ## 总结 diff --git "a/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" "b/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" index f90fce1a0c..306b917b76 100644 --- "a/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" +++ "b/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" @@ -10,7 +10,7 @@ [力扣题目链接](https://leetcode-cn.com/problems/spiral-matrix-ii/) -给定一个正整数 n,生成一个包含 1 到 n^2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。 +给定一个正整数 n,生成一个包含 1 到 $n^2$ 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。 示例: diff --git "a/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" "b/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" index 968ac6b8e3..6a2c3e1220 100644 --- "a/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" +++ "b/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" @@ -80,7 +80,7 @@ public: 那二叉树的节点个数就是 2^(m + n - 1) - 1。可以理解深搜的算法就是遍历了整个满二叉树(其实没有遍历整个满二叉树,只是近似而已) -所以上面深搜代码的时间复杂度为O(2^(m + n - 1) - 1),可以看出,这是指数级别的时间复杂度,是非常大的。 +所以上面深搜代码的时间复杂度为$O(2^(m + n - 1) - 1)$,可以看出,这是指数级别的时间复杂度,是非常大的。 ### 动态规划 @@ -142,8 +142,9 @@ public: } }; ``` -* 时间复杂度:O(m * n) -* 空间复杂度:O(m * n) + +* 时间复杂度:$O(m × n)$ +* 空间复杂度:$O(m × n)$ 其实用一个一维数组(也可以理解是滚动数组)就可以了,但是不利于理解,可以优化点空间,建议先理解了二维,在理解一维,C++代码如下: @@ -162,8 +163,9 @@ public: } }; ``` -* 时间复杂度:O(m * n) -* 空间复杂度:O(n) + +* 时间复杂度:$O(m × n)$ +* 空间复杂度:$O(n)$ ### 数论方法 @@ -222,8 +224,8 @@ public: }; ``` -时间复杂度:O(m) -空间复杂度:O(1) +* 时间复杂度:$O(m)$ +* 空间复杂度:$O(1)$ **计算组合问题的代码还是有难度的,特别是处理溢出的情况!** diff --git "a/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" "b/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" index 0f0d10b365..73186314f8 100644 --- "a/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" +++ "b/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" @@ -152,8 +152,9 @@ public: } }; ``` -* 时间复杂度O(n * m) n m 分别为obstacleGrid 长度和宽度 -* 空间复杂度O(n * m) + +* 时间复杂度:$O(n × m)$,n、m 分别为obstacleGrid 长度和宽度 +* 空间复杂度:$O(n × m)$ ## 总结 diff --git "a/problems/0070.\347\210\254\346\245\274\346\242\257.md" "b/problems/0070.\347\210\254\346\245\274\346\242\257.md" index 4b7f60f47a..cf8f2fe73c 100644 --- "a/problems/0070.\347\210\254\346\245\274\346\242\257.md" +++ "b/problems/0070.\347\210\254\346\245\274\346\242\257.md" @@ -123,8 +123,9 @@ public: } }; ``` -* 时间复杂度:O(n) -* 空间复杂度:O(n) + +* 时间复杂度:$O(n)$ +* 空间复杂度:$O(n)$ 当然依然也可以,优化一下空间复杂度,代码如下: @@ -146,8 +147,9 @@ public: } }; ``` -* 时间复杂度:O(n) -* 空间复杂度:O(1) + +* 时间复杂度:$O(n)$ +* 空间复杂度:$O(1)$ 后面将讲解的很多动规的题目其实都是当前状态依赖前两个,或者前三个状态,都可以做空间上的优化,**但我个人认为面试中能写出版本一就够了哈,清晰明了,如果面试官要求进一步优化空间的话,我们再去优化**。 diff --git "a/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" "b/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" index d06648aaa0..7dc20af25a 100644 --- "a/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" +++ "b/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" @@ -51,7 +51,7 @@ public: }; ``` -如上代码并不能通过leetcode,超时了,因为时间复杂度是O(n^2)。 +如上代码并不能通过leetcode,超时了,因为时间复杂度是$O(n^2)$。 ## 动态规划 diff --git "a/problems/0096.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0096.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" index 0567beda0f..1f6d0962a3 100644 --- "a/problems/0096.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" +++ "b/problems/0096.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" @@ -136,8 +136,9 @@ public: } }; ``` -* 时间复杂度O(n^2) -* 空间复杂度O(n) + +* 时间复杂度:$O(n^2)$ +* 空间复杂度:$O(n)$ 大家应该发现了,我们分析了这么多,最后代码却如此简单! diff --git "a/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" "b/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" index 486e08bda0..b299e5ae0c 100644 --- "a/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" +++ "b/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" @@ -46,8 +46,8 @@ public: }; ``` -* 时间复杂度:O(n^2) -* 空间复杂度:O(1) +* 时间复杂度:$O(n^2)$ +* 空间复杂度:$O(1)$ 当然该方法超时了。 @@ -71,8 +71,9 @@ public: } }; ``` -* 时间复杂度:O(n) -* 空间复杂度:O(1) + +* 时间复杂度:$O(n)$ +* 空间复杂度:$O(1)$ ### 动态规划 @@ -155,8 +156,9 @@ public: } }; ``` -* 时间复杂度:O(n) -* 空间复杂度:O(n) + +* 时间复杂度:$O(n)$ +* 空间复杂度:$O(n)$ 从递推公式可以看出,dp[i]只是依赖于dp[i - 1]的状态。 @@ -185,8 +187,8 @@ public: }; ``` -* 时间复杂度:O(n) -* 空间复杂度:O(1) +* 时间复杂度:$O(n)$ +* 空间复杂度:$O(1)$ 这里能写出版本一就可以了,版本二虽然原理都一样,但是想直接写出版本二还是有点麻烦,容易自己给自己找bug。 diff --git "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" index f6d5906a4a..5f917983cd 100644 --- "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" +++ "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" @@ -90,8 +90,9 @@ public: } }; ``` -* 时间复杂度O(n) -* 空间复杂度O(1) + +* 时间复杂度:$O(n)$ +* 空间复杂度:$O(1)$ ### 动态规划 @@ -116,8 +117,9 @@ public: } }; ``` -* 时间复杂度O(n) -* 空间复杂度O(n) + +* 时间复杂度:$O(n)$ +* 空间复杂度:$O(n)$ ## 总结 diff --git "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" index 8f03e88e4c..17a96b3633 100644 --- "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" +++ "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" @@ -88,8 +88,8 @@ public: }; ``` -* 时间复杂度:O(n) -* 空间复杂度:O(n) +* 时间复杂度:$O(n)$ +* 空间复杂度:$O(n)$ 大家可以本题和[121. 买卖股票的最佳时机](https://programmercarl.com/0121.买卖股票的最佳时机.html)的代码几乎一样,唯一的区别在: @@ -121,8 +121,8 @@ public: }; ``` -* 时间复杂度:O(n) -* 空间复杂度:O(1) +* 时间复杂度:$O(n)$ +* 空间复杂度:$O(1)$ @@ -135,7 +135,7 @@ Java: class Solution // 实现1:二维数组存储 // 可以将每天持有与否的情况分别用 dp[i][0] 和 dp[i][1] 来进行存储 - // 时间复杂度:O(n),空间复杂度O(n) + // 时间复杂度:O(n),空间复杂度:O(n) public int maxProfit(int[] prices) { int n = prices.length; int[][] dp = new int[n][2]; // 创建二维数组存储状态 @@ -204,7 +204,7 @@ class Solution: Go: ```go // 买卖股票的最佳时机Ⅱ 动态规划 -// 时间复杂度O(n) 空间复杂度O(n) +// 时间复杂度:O(n) 空间复杂度:O(n) func maxProfit(prices []int) int { dp := make([][]int, len(prices)) status := make([]int, len(prices) * 2) diff --git "a/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" "b/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" index 8fa3a8e061..4ab5f53cc8 100644 --- "a/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" +++ "b/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" @@ -146,8 +146,8 @@ public: }; ``` -* 时间复杂度:O(n) -* 空间复杂度:O(n * 5) +* 时间复杂度:$O(n)$ +* 空间复杂度:$O(n × 5)$ 当然,大家可以看到力扣官方题解里的一种优化空间写法,我这里给出对应的C++版本: @@ -171,8 +171,8 @@ public: }; ``` -* 时间复杂度:O(n) -* 空间复杂度:O(1) +* 时间复杂度:$O(n)$ +* 空间复杂度:$O(1)$ 大家会发现dp[2]利用的是当天的dp[1]。 但结果也是对的。 diff --git "a/problems/0134.\345\212\240\346\262\271\347\253\231.md" "b/problems/0134.\345\212\240\346\262\271\347\253\231.md" index c274bd7820..f6e8596cff 100644 --- "a/problems/0134.\345\212\240\346\262\271\347\253\231.md" +++ "b/problems/0134.\345\212\240\346\262\271\347\253\231.md" @@ -48,7 +48,7 @@ ## 暴力方法 -暴力的方法很明显就是O(n^2)的,遍历每一个加油站为起点的情况,模拟一圈。 +暴力的方法很明显就是$O(n^2)$的,遍历每一个加油站为起点的情况,模拟一圈。 如果跑了一圈,中途没有断油,而且最后油量大于等于0,说明这个起点是ok的。 @@ -76,8 +76,9 @@ public: } }; ``` -* 时间复杂度O(n^2) -* 空间复杂度O(n) + +* 时间复杂度:$O(n^2)$ +* 空间复杂度:$O(n)$ C++暴力解法在leetcode上提交也可以过。 @@ -119,8 +120,8 @@ public: } }; ``` -* 时间复杂度:O(n) -* 空间复杂度:O(1) +* 时间复杂度:$O(n)$ +* 空间复杂度:$O(1)$ **其实我不认为这种方式是贪心算法,因为没有找出局部最优,而是直接从全局最优的角度上思考问题**。 @@ -173,8 +174,8 @@ public: } }; ``` -* 时间复杂度:O(n) -* 空间复杂度:O(1) +* 时间复杂度:$O(n)$ +* 空间复杂度:$O(1)$ **说这种解法为贪心算法,才是是有理有据的,因为全局最优解是根据局部最优推导出来的**。 diff --git "a/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" "b/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" index 0ae5c5f2e5..58d54afc61 100644 --- "a/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" +++ "b/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" @@ -66,8 +66,8 @@ public: }; ``` -* 时间复杂度:O(2^n),因为每一个单词都有两个状态,切割和不切割 -* 空间复杂度:O(n),算法递归系统调用栈的空间 +* 时间复杂度:$O(2^n)$,因为每一个单词都有两个状态,切割和不切割 +* 空间复杂度:$O(n)$,算法递归系统调用栈的空间 那么以上代码很明显要超时了,超时的数据如下: @@ -115,7 +115,7 @@ public: }; ``` -这个时间复杂度其实也是:O(2^n)。只不过对于上面那个超时测试用例优化效果特别明显。 +这个时间复杂度其实也是:$O(2^n)$。只不过对于上面那个超时测试用例优化效果特别明显。 **这个代码就可以AC了,当然回溯算法不是本题的主菜,背包才是!** @@ -207,8 +207,9 @@ public: } }; ``` -* 时间复杂度:O(n^3),因为substr返回子串的副本是O(n)的复杂度(这里的n是substring的长度) -* 空间复杂度:O(n) + +* 时间复杂度:$O(n^3)$,因为substr返回子串的副本是$O(n)$的复杂度(这里的n是substring的长度) +* 空间复杂度:$O(n)$ ## 总结 diff --git "a/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" "b/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" index a6669147a7..d447788530 100644 --- "a/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" +++ "b/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" @@ -36,7 +36,7 @@ 一些同学会使用split库函数,分隔单词,然后定义一个新的string字符串,最后再把单词倒序相加,那么这道题题目就是一道水题了,失去了它的意义。 -所以这里我还是提高一下本题的难度:**不要使用辅助空间,空间复杂度要求为O(1)。** +所以这里我还是提高一下本题的难度:**不要使用辅助空间,空间复杂度要求为$O(1)$。** 不能使用辅助空间之后,那么只能在原字符串上下功夫了。 @@ -79,13 +79,13 @@ void removeExtraSpaces(string& s) { 逻辑很简单,从前向后遍历,遇到空格了就erase。 -如果不仔细琢磨一下erase的时间复杂读,还以为以上的代码是O(n)的时间复杂度呢。 +如果不仔细琢磨一下erase的时间复杂读,还以为以上的代码是$O(n)$的时间复杂度呢。 -想一下真正的时间复杂度是多少,一个erase本来就是O(n)的操作,erase实现原理题目:[数组:就移除个元素很难么?](https://programmercarl.com/0027.移除元素.html),最优的算法来移除元素也要O(n)。 +想一下真正的时间复杂度是多少,一个erase本来就是$O(n)$的操作,erase实现原理题目:[数组:就移除个元素很难么?](https://programmercarl.com/0027.移除元素.html),最优的算法来移除元素也要$O(n)$。 -erase操作上面还套了一个for循环,那么以上代码移除冗余空格的代码时间复杂度为O(n^2)。 +erase操作上面还套了一个for循环,那么以上代码移除冗余空格的代码时间复杂度为$O(n^2)$。 -那么使用双指针法来去移除空格,最后resize(重新设置)一下字符串的大小,就可以做到O(n)的时间复杂度。 +那么使用双指针法来去移除空格,最后resize(重新设置)一下字符串的大小,就可以做到$O(n)$的时间复杂度。 如果对这个操作比较生疏了,可以再看一下这篇文章:[数组:就移除个元素很难么?](https://programmercarl.com/0027.移除元素.html)是如何移除元素的。 diff --git "a/problems/0189.\346\227\213\350\275\254\346\225\260\347\273\204.md" "b/problems/0189.\346\227\213\350\275\254\346\225\260\347\273\204.md" index 2a60d245e0..b2619c4d7a 100644 --- "a/problems/0189.\346\227\213\350\275\254\346\225\260\347\273\204.md" +++ "b/problems/0189.\346\227\213\350\275\254\346\225\260\347\273\204.md" @@ -12,7 +12,7 @@ 进阶: 尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。 -你可以使用空间复杂度为 O(1) 的 原地 算法解决这个问题吗? +你可以使用空间复杂度为 $O(1)$ 的 原地 算法解决这个问题吗? 示例 1: @@ -41,7 +41,7 @@ 本题其实和[字符串:剑指Offer58-II.左旋转字符串](https://programmercarl.com/剑指Offer58-II.左旋转字符串.html)就非常像了,剑指offer上左旋转,本题是右旋转。 -注意题目要求是**要求使用空间复杂度为 O(1) 的 原地 算法** +注意题目要求是**要求使用空间复杂度为 $O(1)$ 的 原地 算法** 那么我来提供一种旋转的方式哈。 diff --git "a/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" "b/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" index 8c539ff72d..a289c22eb7 100644 --- "a/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" +++ "b/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" @@ -20,7 +20,7 @@ ## 暴力解法 -这道题目暴力解法当然是 两个for循环,然后不断的寻找符合条件的子序列,时间复杂度很明显是O(n^2) 。 +这道题目暴力解法当然是 两个for循环,然后不断的寻找符合条件的子序列,时间复杂度很明显是$O(n^2)$。 代码如下: @@ -80,7 +80,7 @@ public: ![leetcode_209](https://img-blog.csdnimg.cn/20210312160441942.png) -可以发现**滑动窗口的精妙之处在于根据当前子序列和大小的情况,不断调节子序列的起始位置。从而将O(n^2)的暴力解法降为O(n)。** +可以发现**滑动窗口的精妙之处在于根据当前子序列和大小的情况,不断调节子序列的起始位置。从而将$O(n^2)$的暴力解法降为$O(n)$。** C++代码如下: @@ -110,9 +110,9 @@ public: 时间复杂度:$O(n)$ 空间复杂度:$O(1)$ -**一些录友会疑惑为什么时间复杂度是O(n)**。 +**一些录友会疑惑为什么时间复杂度是$O(n)$**。 -不要以为for里放一个while就以为是$O(n^2)$啊, 主要是看每一个元素被操作的次数,每个元素在滑动窗后进来操作一次,出去操作一次,每个元素都是被被操作两次,所以时间复杂度是2 * n 也就是$O(n)$。 +不要以为for里放一个while就以为是$O(n^2)$啊, 主要是看每一个元素被操作的次数,每个元素在滑动窗后进来操作一次,出去操作一次,每个元素都是被被操作两次,所以时间复杂度是 2 × n 也就是$O(n)$。 ## 相关题目推荐 diff --git "a/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" "b/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" index 2e964dfc1f..3b5ca4d822 100644 --- "a/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" +++ "b/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" @@ -105,8 +105,8 @@ public: }; ``` -* 时间复杂度:O(n) -* 空间复杂度:O(logn),算上了递归系统栈占用的空间 +* 时间复杂度:$O(n)$ +* 空间复杂度:$O(\log n)$,算上了递归系统栈占用的空间 **网上基本都是这个精简的代码版本,其实不建议大家照着这个来写,代码确实精简,但隐藏了一些内容,连遍历的顺序都看不出来,所以初学者建议学习版本一的代码,稳稳的打基础**。 @@ -138,8 +138,8 @@ public: } }; ``` -* 时间复杂度:O(n) -* 空间复杂度:O(n) +* 时间复杂度:$O(n)$ +* 空间复杂度:$O(n)$ ## 完全二叉树 @@ -185,8 +185,8 @@ public: }; ``` -* 时间复杂度:O(logn * logn) -* 空间复杂度:O(logn) +* 时间复杂度:$O(\log n × \log n)$ +* 空间复杂度:$O(\log n)$ # 其他语言版本 diff --git "a/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" "b/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" index 1f24569976..ba36222229 100644 --- "a/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" +++ "b/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" @@ -36,7 +36,7 @@ 难点是如何求一个区间里的最大值呢? (这好像是废话),暴力一下不就得了。 -暴力方法,遍历一遍的过程中每次从窗口中在找到最大的数值,这样很明显是O(n * k)的算法。 +暴力方法,遍历一遍的过程中每次从窗口中在找到最大的数值,这样很明显是$O(n × k)$的算法。 有的同学可能会想用一个大顶堆(优先级队列)来存放这个窗口里的k个数字,这样就可以知道最大的最大值是多少了, **但是问题是这个窗口是移动的,而大顶堆每次只能弹出最大值,我们无法移除其他数值,这样就造成大顶堆维护的不是滑动窗口里面的数值了。所以不能用大顶堆。** @@ -183,13 +183,13 @@ public: }; ``` -在来看一下时间复杂度,使用单调队列的时间复杂度是 O(n)。 +在来看一下时间复杂度,使用单调队列的时间复杂度是 $O(n)$。 -有的同学可能想了,在队列中 push元素的过程中,还有pop操作呢,感觉不是纯粹的O(n)。 +有的同学可能想了,在队列中 push元素的过程中,还有pop操作呢,感觉不是纯粹的$O(n)$。 -其实,大家可以自己观察一下单调队列的实现,nums 中的每个元素最多也就被 push_back 和 pop_back 各一次,没有任何多余操作,所以整体的复杂度还是 O(n)。 +其实,大家可以自己观察一下单调队列的实现,nums 中的每个元素最多也就被 push_back 和 pop_back 各一次,没有任何多余操作,所以整体的复杂度还是 $O(n)$。 -空间复杂度因为我们定义一个辅助队列,所以是O(k)。 +空间复杂度因为我们定义一个辅助队列,所以是$O(k)$。 # 扩展 diff --git "a/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" "b/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" index 34417c701d..69b5df670c 100644 --- "a/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" +++ "b/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" @@ -27,7 +27,7 @@ ## 思路 -先看暴力的解法,两层for循环,同时还要记录字符是否重复出现,很明显时间复杂度是 O(n^2)。 +先看暴力的解法,两层for循环,同时还要记录字符是否重复出现,很明显时间复杂度是 $O(n^2)$。 暴力的方法这里就不做介绍了,直接看一下有没有更优的方式。 @@ -55,7 +55,7 @@ 最后如果record数组所有元素都为零0,说明字符串s和t是字母异位词,return true。 -时间复杂度为O(n),空间上因为定义是的一个常量大小的辅助数组,所以空间复杂度为O(1)。 +时间复杂度为$O(n)$,空间上因为定义是的一个常量大小的辅助数组,所以空间复杂度为$O(1)$。 C++ 代码如下: diff --git "a/problems/0283.\347\247\273\345\212\250\351\233\266.md" "b/problems/0283.\347\247\273\345\212\250\351\233\266.md" index 8ba3ff3b4e..de3b1e8901 100644 --- "a/problems/0283.\347\247\273\345\212\250\351\233\266.md" +++ "b/problems/0283.\347\247\273\345\212\250\351\233\266.md" @@ -30,7 +30,7 @@ 好了,我们说一说双指针法,大家如果对双指针还不熟悉,可以看我的这篇总结[双指针法:总结篇!](https://programmercarl.com/双指针总结.html)。 -双指针法在数组移除元素中,可以达到O(n)的时间复杂度,在[27.移除元素](https://programmercarl.com/0027.移除元素.html)里已经详细讲解了,那么本题和移除元素其实是一个套路。 +双指针法在数组移除元素中,可以达到$O(n)$的时间复杂度,在[27.移除元素](https://programmercarl.com/0027.移除元素.html)里已经详细讲解了,那么本题和移除元素其实是一个套路。 **相当于对整个数组移除元素0,然后slowIndex之后都是移除元素0的冗余元素,把这些元素都赋值为0就可以了**。 diff --git "a/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" "b/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" index 48106bd8b9..1da766daa3 100644 --- "a/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" +++ "b/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" @@ -147,8 +147,8 @@ public: }; ``` -* 时间复杂度:O(n) -* 空间复杂度:O(n) +* 时间复杂度:$O(n)$ +* 空间复杂度:$O(n)$ 当然,空间复杂度可以优化,定义一个dp[2][4]大小的数组就可以了,就保存前一天的当前的状态,感兴趣的同学可以自己去写一写,思路是一样的。 diff --git "a/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" "b/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" index e8e95cc411..4264728fbf 100644 --- "a/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" +++ "b/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" @@ -50,8 +50,8 @@ public: }; ``` -* 时间复杂度:O(n^2) 这个时间复杂度不太标准,也不容易准确化,例如越往下的节点重复计算次数就越多 -* 空间复杂度:O(logn) 算上递推系统栈的空间 +* 时间复杂度:$O(n^2)$,这个时间复杂度不太标准,也不容易准确化,例如越往下的节点重复计算次数就越多 +* 空间复杂度:$O(\log n)$,算上递推系统栈的空间 当然以上代码超时了,这个递归的过程中其实是有重复计算了。 @@ -83,8 +83,9 @@ public: }; ``` -* 时间复杂度:O(n) -* 空间复杂度:O(logn) 算上递推系统栈的空间 + +* 时间复杂度:$O(n)$ +* 空间复杂度:$O(\log n)$,算上递推系统栈的空间 ### 动态规划 @@ -197,8 +198,8 @@ public: } }; ``` -* 时间复杂度:O(n) 每个节点只遍历了一次 -* 空间复杂度:O(logn) 算上递推系统栈的空间 +* 时间复杂度:$O(n)$,每个节点只遍历了一次 +* 空间复杂度:$O(\log n)$,算上递推系统栈的空间 ## 总结 diff --git "a/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" "b/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" index 9f070e242b..1bab99ca60 100644 --- "a/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" +++ "b/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" @@ -120,8 +120,8 @@ public: }; ``` -* 时间复杂度:O(n^2) -* 空间复杂度:O(n) +* 时间复杂度:$O(n^2)$ +* 空间复杂度:$O(n)$ ### 贪心 @@ -148,8 +148,9 @@ public: } }; ``` -* 时间复杂度O(n) -* 空间复杂度O(1) + +* 时间复杂度:$O(n)$ +* 空间复杂度:$O(1)$ ## 总结 diff --git "a/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" "b/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" index c45f1941a5..39da73071a 100644 --- "a/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" @@ -14,7 +14,7 @@ 编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。 -不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。 +不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 $O(1)$ 的额外空间解决这一问题。 你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。 diff --git "a/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" "b/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" index c0f194fa44..6f3a65fef9 100644 --- "a/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" +++ "b/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" @@ -25,7 +25,7 @@ 提示: * 你可以假设给定的 k 总是合理的,且 1 ≤ k ≤ 数组中不相同的元素的个数。 -* 你的算法的时间复杂度必须优于 O(n log n) , n 是数组的大小。 +* 你的算法的时间复杂度必须优于 $O(n \log n)$ , n 是数组的大小。 * 题目数据保证答案唯一,换句话说,数组中前 k 个高频元素的集合是唯一的。 * 你可以按任意顺序返回答案。 diff --git "a/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" "b/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" index 35d0cb7f2c..b5cf31c5d3 100644 --- "a/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" +++ "b/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" @@ -28,7 +28,7 @@ 注意题目特意说明:**输出结果中的每个元素一定是唯一的,也就是说输出的结果的去重的, 同时可以不考虑输出结果的顺序** -这道题用暴力的解法时间复杂度是O(n^2),那来看看使用哈希法进一步优化。 +这道题用暴力的解法时间复杂度是$O(n^2)$,那来看看使用哈希法进一步优化。 那么用数组来做哈希表也是不错的选择,例如[242. 有效的字母异位词](https://programmercarl.com/0242.有效的字母异位词.html) diff --git "a/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" "b/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" index 3432ca53fc..39a3db1527 100644 --- "a/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" +++ "b/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" @@ -87,8 +87,9 @@ public: } }; ``` -时间复杂度O(n) -空间复杂度O(1) + +* 时间复杂度:$O(n)$ +* 空间复杂度:$O(1)$ ## 思路2(动态规划) @@ -137,9 +138,8 @@ public: }; ``` -时间复杂度O(n^2) - -空间复杂度O(n) +* 时间复杂度:$O(n^2)$ +* 空间复杂度:$O(n)$ **进阶** @@ -149,9 +149,9 @@ public: * 每次更新`dp[i][1]`,则在`tree2`的`nums[i]`位置值更新为`dp[i][1]` * 则dp转移方程中就没有必要j从0遍历到i-1,可以直接在线段树中查询指定区间的值即可。 -时间复杂度O(nlogn) +时间复杂度:$O(n\log n)$ -空间复杂度O(n) +空间复杂度:$O(n)$ ## 总结 diff --git "a/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" "b/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" index f71940f65e..e157b4392b 100644 --- "a/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" @@ -31,7 +31,7 @@ ## 思路 -(这道题可以用双指针的思路来实现,时间复杂度就是O(n)) +(这道题可以用双指针的思路来实现,时间复杂度就是$O(n)$) 这道题应该算是编辑距离的入门题目,因为从题意中我们也可以发现,只需要计算删除的情况,不用考虑增加和替换的情况。 @@ -122,8 +122,8 @@ public: }; ``` -* 时间复杂度:O(n * m) -* 空间复杂度:O(n * m) +* 时间复杂度:$O(n × m)$ +* 空间复杂度:$O(n × m)$ ## 总结 diff --git "a/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" "b/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" index 1d79209a08..40756878d3 100644 --- "a/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" +++ "b/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" @@ -116,12 +116,12 @@ public: } }; ``` -* 时间复杂度O(nlogn + n^2) -* 空间复杂度O(n) +* 时间复杂度:$O(n\log n + n^2)$ +* 空间复杂度:$O(n)$ 但使用vector是非常费时的,C++中vector(可以理解是一个动态数组,底层是普通数组实现的)如果插入元素大于预先普通数组大小,vector底部会有一个扩容的操作,即申请两倍于原先普通数组的大小,然后把数据拷贝到另一个更大的数组上。 -所以使用vector(动态数组)来insert,是费时的,插入再拷贝的话,单纯一个插入的操作就是O(n^2)了,甚至可能拷贝好几次,就不止O(n^2)了。 +所以使用vector(动态数组)来insert,是费时的,插入再拷贝的话,单纯一个插入的操作就是$O(n^2)$了,甚至可能拷贝好几次,就不止$O(n^2)$了。 改成链表之后,C++代码如下: @@ -150,8 +150,8 @@ public: }; ``` -* 时间复杂度O(nlogn + n^2) -* 空间复杂度O(n) +* 时间复杂度:$O(n\log n + n^2)$ +* 空间复杂度:$O(n)$ 大家可以把两个版本的代码提交一下试试,就可以发现其差别了! diff --git "a/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" "b/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" index 393baf7d82..2c33842acf 100644 --- "a/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" +++ "b/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" @@ -168,8 +168,8 @@ public: }; ``` -* 时间复杂度:O(n^2) -* 空间复杂度:O(n),虽然dp数组大小为一个常数,但是大常数 +* 时间复杂度:$O(n^2)$ +* 空间复杂度:$O(n)$,虽然dp数组大小为一个常数,但是大常数 ## 总结 diff --git "a/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" "b/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" index 9b8435812f..1ca8083e71 100644 --- "a/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" +++ "b/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" @@ -92,8 +92,8 @@ public: } }; ``` -* 时间复杂度:O(nlogn) ,有一个快排 -* 空间复杂度:O(1) +* 时间复杂度:$O(n\log n)$ ,有一个快排 +* 空间复杂度:$O(1)$ 大家此时会发现如此复杂的一个问题,代码实现却这么简单! diff --git "a/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" "b/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" index 4c43389979..c9be2c02c7 100644 --- "a/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" +++ "b/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" @@ -17,7 +17,7 @@ 首先找到需要删除的节点; 如果找到了,删除它。 -说明: 要求算法时间复杂度为 O(h),h 为树的高度。 +说明: 要求算法时间复杂度为 $O(h)$,h 为树的高度。 示例: diff --git "a/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" "b/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" index 9336105638..326680e124 100644 --- "a/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" +++ "b/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" @@ -105,8 +105,8 @@ public: }; ``` -* 时间复杂度O(nlogn),因为有一个快排 -* 空间复杂度O(1) +* 时间复杂度:$O(n\log n)$,因为有一个快排 +* 空间复杂度:$O(1)$ 可以看出代码并不复杂。 diff --git "a/problems/0494.\347\233\256\346\240\207\345\222\214.md" "b/problems/0494.\347\233\256\346\240\207\345\222\214.md" index 01554b028e..1b107c95a7 100644 --- "a/problems/0494.\347\233\256\346\240\207\345\222\214.md" +++ "b/problems/0494.\347\233\256\346\240\207\345\222\214.md" @@ -221,8 +221,8 @@ public: }; ``` -* 时间复杂度O(n * m),n为正数个数,m为背包容量 -* 空间复杂度:O(m) m为背包容量 +* 时间复杂度:$O(n × m)$,n为正数个数,m为背包容量 +* 空间复杂度:$O(m)$,m为背包容量 ## 总结 diff --git "a/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" "b/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" index 0634e932c6..2d09c527ce 100644 --- "a/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" +++ "b/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" @@ -68,7 +68,7 @@ public: 这种写法确实比较直观,但做了很多无用操作,例如修改了nums数组,而且最后还要把result数组resize回去。 -resize倒是不费时间,是O(1)的操作,但扩充nums数组相当于多了一个O(n)的操作。 +resize倒是不费时间,是$O(1)$的操作,但扩充nums数组相当于多了一个$O(n)$的操作。 其实也可以不扩充nums,而是在遍历的过程中模拟走了两边nums。 diff --git "a/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" "b/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" index 3cdd2c52f3..b866cbe2a8 100644 --- "a/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" +++ "b/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" @@ -101,8 +101,8 @@ public: } }; ``` -* 时间复杂度:O(n) -* 空间复杂度:O(n) +* 时间复杂度:$O(n)$ +* 空间复杂度:$O(n)$ 当然可以发现,我们只需要维护两个数值就可以了,不需要记录整个序列。 @@ -126,8 +126,8 @@ public: }; ``` -* 时间复杂度:O(n) -* 空间复杂度:O(1) +* 时间复杂度:$O(n)$ +* 空间复杂度:$O(1)$ ### 递归解法 @@ -145,8 +145,8 @@ public: }; ``` -* 时间复杂度:O(2^n) -* 空间复杂度:O(n) 算上了编程语言中实现递归的系统栈所占空间 +* 时间复杂度:$O(2^n)$ +* 空间复杂度:$O(n)$,算上了编程语言中实现递归的系统栈所占空间 这个递归的时间复杂度大家画一下树形图就知道了,如果不清晰的同学,可以看这篇:[通过一道面试题目,讲一讲递归算法的时间复杂度!](https://programmercarl.com/前序/通过一道面试题目,讲一讲递归算法的时间复杂度!.html) diff --git "a/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" "b/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" index 89046eed95..9aa44cad2f 100644 --- "a/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" +++ "b/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" @@ -32,7 +32,7 @@ 两层for循环,遍历区间起始位置和终止位置,然后判断这个区间是不是回文。 -时间复杂度:O(n^3) +时间复杂度:$O(n^3)$ ## 动态规划 @@ -171,8 +171,8 @@ public: }; ``` -* 时间复杂度:O(n^2) -* 空间复杂度:O(n^2) +* 时间复杂度:$O(n^2)$ +* 空间复杂度:$O(n^2)$ ## 双指针法 @@ -212,8 +212,9 @@ public: } }; ``` -* 时间复杂度:O(n^2) -* 空间复杂度:O(1) + +* 时间复杂度:$O(n^2)$ +* 空间复杂度:$O(1)$ ## 其他语言版本 diff --git "a/problems/0673.\346\234\200\351\225\277\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227\347\232\204\344\270\252\346\225\260.md" "b/problems/0673.\346\234\200\351\225\277\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227\347\232\204\344\270\252\346\225\260.md" index d15ecbb91b..1bfaa7d017 100644 --- "a/problems/0673.\346\234\200\351\225\277\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227\347\232\204\344\270\252\346\225\260.md" +++ "b/problems/0673.\346\234\200\351\225\277\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227\347\232\204\344\270\252\346\225\260.md" @@ -216,10 +216,10 @@ public: }; ``` -* 时间复杂度O(n^2) -* 空间复杂度O(n) +* 时间复杂度:$O(n^2)$ +* 空间复杂度:$O(n)$ -还有O(nlogn)的解法,使用树状数组,今天有点忙就先不写了,感兴趣的同学可以自行学习一下,这里有我之前写的树状数组系列博客:https://blog.csdn.net/youngyangyang04/category_871105.html (十年前的陈年老文了) +还有$O(n\log n)$的解法,使用树状数组,今天有点忙就先不写了,感兴趣的同学可以自行学习一下,这里有我之前写的树状数组系列博客:https://blog.csdn.net/youngyangyang04/category_871105.html (十年前的陈年老文了) # 其他语言版本 diff --git "a/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" "b/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" index c0ea936279..4c1f645389 100644 --- "a/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" +++ "b/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" @@ -107,8 +107,8 @@ public: }; ``` -* 时间复杂度:O(n) -* 空间复杂度:O(n) +* 时间复杂度:$O(n)$ +* 空间复杂度:$O(n)$ ### 贪心 @@ -135,12 +135,12 @@ public: } }; ``` -* 时间复杂度:O(n) -* 空间复杂度:O(1) +* 时间复杂度:$O(n)$ +* 空间复杂度:$O(1)$ ## 总结 -本题也是动规里子序列问题的经典题目,但也可以用贪心来做,大家也会发现贪心好像更简单一点,而且空间复杂度仅是O(1)。 +本题也是动规里子序列问题的经典题目,但也可以用贪心来做,大家也会发现贪心好像更简单一点,而且空间复杂度仅是$O(1)$。 在动规分析中,关键是要理解和[动态规划:300.最长递增子序列](https://programmercarl.com/0300.最长上升子序列.html)的区别。 diff --git "a/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271.md" "b/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271.md" index f7ddeaf74b..ae0ee0477c 100644 --- "a/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271.md" +++ "b/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271.md" @@ -84,8 +84,8 @@ public: }; ``` -* 时间复杂度:O(n) -* 空间复杂度:O(1) +* 时间复杂度:$O(n)$ +* 空间复杂度:$O(1)$ 从代码中可以看出对情况一的操作,因为如果还在收获利润的区间里,表示并不是真正的卖出,而计算利润每次都要减去手续费,**所以要让minPrice = prices[i] - fee;,这样在明天收获利润的时候,才不会多减一次手续费!** @@ -117,8 +117,8 @@ public: }; ``` -* 时间复杂度:O(n) -* 空间复杂度:O(n) +* 时间复杂度:$O(n)$ +* 空间复杂度:$O(n)$ 当然可以对空间经行优化,因为当前状态只是依赖前一个状态。 @@ -140,8 +140,9 @@ public: } }; ``` -* 时间复杂度:O(n) -* 空间复杂度:O(1) + +* 时间复杂度:$O(n)$ +* 空间复杂度:$O(1)$ ## 总结 diff --git "a/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" "b/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" index 700b8cde13..4a5b8cf104 100644 --- "a/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" +++ "b/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" @@ -37,8 +37,9 @@ 在讲解贪心专题的时候,我们已经讲过本题了[贪心算法:买卖股票的最佳时机含手续费](https://programmercarl.com/0714.买卖股票的最佳时机含手续费.html) 使用贪心算法,的性能是: -* 时间复杂度:O(n) -* 空间复杂度:O(1) + +* 时间复杂度:$O(n)$ +* 空间复杂度:$O(1)$ 那么我们再来看看是使用动规的方法如何解题。 @@ -86,8 +87,8 @@ public: }; ``` -* 时间复杂度:O(n) -* 空间复杂度:O(n) +* 时间复杂度:$O(n)$ +* 空间复杂度:$O(n)$ ## 其他语言版本 diff --git "a/problems/0718.\346\234\200\351\225\277\351\207\215\345\244\215\345\255\220\346\225\260\347\273\204.md" "b/problems/0718.\346\234\200\351\225\277\351\207\215\345\244\215\345\255\220\346\225\260\347\273\204.md" index ec2a436632..b2738ac188 100644 --- "a/problems/0718.\346\234\200\351\225\277\351\207\215\345\244\215\345\255\220\346\225\260\347\273\204.md" +++ "b/problems/0718.\346\234\200\351\225\277\351\207\215\345\244\215\345\255\220\346\225\260\347\273\204.md" @@ -111,8 +111,8 @@ public: }; ``` -* 时间复杂度O(n * m) n 为A长度,m为B长度 -* 空间复杂度O(n * m) +* 时间复杂度:$O(n × m)$,n 为A长度,m为B长度 +* 空间复杂度:$O(n × m)$ ## 滚动数组 @@ -145,8 +145,8 @@ public: }; ``` -* 时间复杂度O(n * m) n 为A长度,m为B长度 -* 空间复杂度O(m) +* 时间复杂度:$O(n × m)$,n 为A长度,m为B长度 +* 空间复杂度:$O(m)$ ## 其他语言版本 diff --git "a/problems/0738.\345\215\225\350\260\203\351\200\222\345\242\236\347\232\204\346\225\260\345\255\227.md" "b/problems/0738.\345\215\225\350\260\203\351\200\222\345\242\236\347\232\204\346\225\260\345\255\227.md" index 6baaa82761..cb21965a49 100644 --- "a/problems/0738.\345\215\225\350\260\203\351\200\222\345\242\236\347\232\204\346\225\260\345\255\227.md" +++ "b/problems/0738.\345\215\225\350\260\203\351\200\222\345\242\236\347\232\204\346\225\260\345\255\227.md" @@ -54,8 +54,8 @@ public: } }; ``` -* 时间复杂度:O(n * m) m为n的数字长度 -* 空间复杂度:O(1) +* 时间复杂度:$O(n × m)$ m为n的数字长度 +* 空间复杂度:$O(1)$ ## 贪心算法 @@ -108,8 +108,8 @@ public: ``` -* 时间复杂度:O(n) n 为数字长度 -* 空间复杂度:O(n) 需要一个字符串,转化为字符串操作更方便 +* 时间复杂度:$O(n)$,n 为数字长度 +* 空间复杂度:$O(n)$,需要一个字符串,转化为字符串操作更方便 ## 总结 diff --git "a/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" "b/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" index fe9f9f7a85..9fdcafc087 100644 --- "a/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" +++ "b/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" @@ -18,7 +18,7 @@ ## 思路 -首先想到的当然是暴力解法,两层for循环,把至少需要等待的天数就搜出来了。时间复杂度是O(n^2) +首先想到的当然是暴力解法,两层for循环,把至少需要等待的天数就搜出来了。时间复杂度是$O(n^2)$ 那么接下来在来看看使用单调栈的解法。 @@ -26,13 +26,13 @@ **通常是一维数组,要寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置,此时我们就要想到可以用单调栈了**。 -时间复杂度为O(n)。 +时间复杂度为$O(n)$。 例如本题其实就是找找到一个元素右边第一个比自己大的元素。 此时就应该想到用单调栈了。 -那么单调栈的原理是什么呢?为什么时间复杂度是O(n)就可以找到每一个元素的右边第一个比它大的元素位置呢? +那么单调栈的原理是什么呢?为什么时间复杂度是$O(n)$就可以找到每一个元素的右边第一个比它大的元素位置呢? 单调栈的本质是空间换时间,因为在遍历的过程中需要用一个栈来记录右边第一个比当前元素的元素,优点是只需要遍历一次。 @@ -165,8 +165,8 @@ public: } }; ``` -* 时间复杂度:O(n) -* 空间复杂度:O(n) +* 时间复杂度:$O(n)$ +* 空间复杂度:$O(n)$ 精简的代码是直接把情况一二三都合并到了一起,其实这种代码精简是精简,但思路不是很清晰。 diff --git "a/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" "b/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" index ce7b310c2e..6bd3d8586c 100644 --- "a/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" +++ "b/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" @@ -113,8 +113,8 @@ public: }; ``` -* 时间复杂度:O(n) -* 空间复杂度:O(n) +* 时间复杂度:$O(n)$ +* 空间复杂度:$O(n)$ 还可以优化空间复杂度,因为dp[i]就是由前两位推出来的,那么也不用dp数组了,C++代码如下: @@ -136,8 +136,8 @@ public: ``` -* 时间复杂度:O(n) -* 空间复杂度:O(1) +* 时间复杂度:$O(n)$ +* 空间复杂度:$O(1)$ **当然我不建议这么写,能写出版本一就可以了,直观简洁!** diff --git "a/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" "b/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" index 40318726ff..b55f4b2b3c 100644 --- "a/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" +++ "b/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" @@ -68,8 +68,8 @@ public: }; ``` -* 时间复杂度:O(n) -* 空间复杂度:O(1) 使用的hash数组是固定大小 +* 时间复杂度:$O(n)$ +* 空间复杂度:$O(1)$,使用的hash数组是固定大小 ## 总结 diff --git "a/problems/0844.\346\257\224\350\276\203\345\220\253\351\200\200\346\240\274\347\232\204\345\255\227\347\254\246\344\270\262.md" "b/problems/0844.\346\257\224\350\276\203\345\220\253\351\200\200\346\240\274\347\232\204\345\255\227\347\254\246\344\270\262.md" index 95cf69c864..deb4a4337a 100644 --- "a/problems/0844.\346\257\224\350\276\203\345\220\253\351\200\200\346\240\274\347\232\204\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/0844.\346\257\224\350\276\203\345\220\253\351\200\200\346\240\274\347\232\204\345\255\227\347\254\246\344\270\262.md" @@ -36,7 +36,7 @@ # 思路 -本文将给出 空间复杂度O(n)的栈模拟方法 以及空间复杂度是O(1)的双指针方法。 +本文将给出 空间复杂度$O(n)$的栈模拟方法 以及空间复杂度是$O(1)$的双指针方法。 ## 普通方法(使用栈的思路) @@ -71,8 +71,8 @@ public: } }; ``` -* 时间复杂度:O(n + m), n为S的长度,m为T的长度 ,也可以理解是O(n)的时间复杂度 -* 空间复杂度:O(n + m) +* 时间复杂度:$O(n + m)$,n为S的长度,m为T的长度 ,也可以理解是$O(n)$的时间复杂度 +* 空间复杂度:$O(n + m)$ 当然以上代码,大家可以发现有重复的逻辑处理S,处理T,可以把这块公共逻辑抽离出来,代码精简如下: @@ -96,12 +96,13 @@ public: }; ``` 性能依然是: -* 时间复杂度:O(n + m) -* 空间复杂度:O(n + m) + +* 时间复杂度:$O(n + m)$ +* 空间复杂度:$O(n + m)$ ## 优化方法(从后向前双指针) -当然还可以有使用 O(1) 的空间复杂度来解决该问题。 +当然还可以有使用 $O(1)$ 的空间复杂度来解决该问题。 同时从后向前遍历S和T(i初始为S末尾,j初始为T末尾),记录#的数量,模拟消除的操作,如果#用完了,就开始比较S[i]和S[j]。 @@ -150,8 +151,8 @@ public: }; ``` -* 时间复杂度:O(n + m) -* 空间复杂度:O(1) +* 时间复杂度:$O(n + m)$ +* 空间复杂度:$O(1)$ # 其他语言版本 diff --git "a/problems/0922.\346\214\211\345\245\207\345\201\266\346\216\222\345\272\217\346\225\260\347\273\204II.md" "b/problems/0922.\346\214\211\345\245\207\345\201\266\346\216\222\345\272\217\346\225\260\347\273\204II.md" index 9fec82899b..36d0c2cc28 100644 --- "a/problems/0922.\346\214\211\345\245\207\345\201\266\346\216\222\345\272\217\346\225\260\347\273\204II.md" +++ "b/problems/0922.\346\214\211\345\245\207\345\201\266\346\216\222\345\272\217\346\225\260\347\273\204II.md" @@ -26,11 +26,11 @@ ## 思路 -这道题目直接的想法可能是两层for循环再加上used数组表示使用过的元素。这样的的时间复杂度是O(n^2)。 +这道题目直接的想法可能是两层for循环再加上used数组表示使用过的元素。这样的的时间复杂度是$O(n^2)$。 ### 方法一 -其实这道题可以用很朴实的方法,时间复杂度就就是O(n)了,C++代码如下: +其实这道题可以用很朴实的方法,时间复杂度就就是$O(n)$了,C++代码如下: ```CPP class Solution { @@ -57,8 +57,8 @@ public: }; ``` -* 时间复杂度:O(n) -* 空间复杂度:O(n) +* 时间复杂度:$O(n)$ +* 空间复杂度:$O(n)$ ### 方法二 @@ -86,8 +86,8 @@ public: }; ``` -* 时间复杂度O(n) -* 空间复杂度O(n) +* 时间复杂度:$O(n)$ +* 空间复杂度:$O(n)$ ### 方法三 @@ -109,10 +109,10 @@ public: }; ``` -* 时间复杂度:O(n) -* 空间复杂度:O(1) +* 时间复杂度:$O(n)$ +* 空间复杂度:$O(1)$ -这里时间复杂度并不是O(n^2),因为偶数位和奇数位都只操作一次,不是n/2 * n/2的关系,而是n/2 + n/2的关系! +这里时间复杂度并不是$O(n^2)$,因为偶数位和奇数位都只操作一次,不是n/2 * n/2的关系,而是n/2 + n/2的关系! ## 其他语言版本 diff --git "a/problems/0925.\351\225\277\346\214\211\351\224\256\345\205\245.md" "b/problems/0925.\351\225\277\346\214\211\351\224\256\345\205\245.md" index 603040e624..dd3679bad9 100644 --- "a/problems/0925.\351\225\277\346\214\211\351\224\256\345\205\245.md" +++ "b/problems/0925.\351\225\277\346\214\211\351\224\256\345\205\245.md" @@ -90,8 +90,8 @@ public: ``` -时间复杂度:O(n) -空间复杂度:O(1) +时间复杂度:$O(n)$ +空间复杂度:$O(1)$ # 其他语言版本 diff --git "a/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" "b/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" index 6616ba8c74..ac300a7d19 100644 --- "a/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" +++ "b/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" @@ -40,7 +40,7 @@ public: }; ``` -这个时间复杂度是 O(n + nlogn), 可以说是O(nlogn)的时间复杂度,但为了和下面双指针法算法时间复杂度有鲜明对比,我记为 O(n + nlogn)。 +这个时间复杂度是 $O(n + n\log n)$, 可以说是$O(n\log n)$的时间复杂度,但为了和下面双指针法算法时间复杂度有鲜明对比,我记为 $O(n + n\log n)$。 ## 双指针法 @@ -83,7 +83,7 @@ public: }; ``` -此时的时间复杂度为O(n),相对于暴力排序的解法O(n + nlogn)还是提升不少的。 +此时的时间复杂度为$O(n)$,相对于暴力排序的解法$O(n + n\log n)$还是提升不少的。 **这里还是说一下,大家不必太在意leetcode上执行用时,打败多少多少用户,这个就是一个玩具,非常不准确。** diff --git "a/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md" "b/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md" index 093bfdde71..63a15751a7 100644 --- "a/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md" +++ "b/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md" @@ -40,7 +40,7 @@ words[i] 由小写英文字母组成 这道题目一眼看上去,就是用哈希法,**“小写字符”,“出现频率”, 这些关键字都是为哈希法量身定做的啊** -首先可以想到的是暴力解法,一个字符串一个字符串去搜,时间复杂度是O(n^m),n是字符串长度,m是有几个字符串。 +首先可以想到的是暴力解法,一个字符串一个字符串去搜,时间复杂度是$O(n^m)$,n是字符串长度,m是有几个字符串。 可以看出这是指数级别的时间复杂度,非常高,而且代码实现也不容易,因为要统计 重复的字符,还要适当的替换或者去重。 diff --git "a/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" "b/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" index 842e63aa76..79cc69e115 100644 --- "a/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" +++ "b/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" @@ -136,8 +136,8 @@ public: ``` -* 时间复杂度:O(m * n) , m是石头总重量(准确的说是总重量的一半),n为石头块数 -* 空间复杂度:O(m) +* 时间复杂度:$O(m × n)$ , m是石头总重量(准确的说是总重量的一半),n为石头块数 +* 空间复杂度:$O(m)$ ## 总结 diff --git "a/problems/1365.\346\234\211\345\244\232\345\260\221\345\260\217\344\272\216\345\275\223\345\211\215\346\225\260\345\255\227\347\232\204\346\225\260\345\255\227.md" "b/problems/1365.\346\234\211\345\244\232\345\260\221\345\260\217\344\272\216\345\275\223\345\211\215\346\225\260\345\255\227\347\232\204\346\225\260\345\255\227.md" index 5e1e875c56..c7f9d0f973 100644 --- "a/problems/1365.\346\234\211\345\244\232\345\260\221\345\260\217\344\272\216\345\275\223\345\211\215\346\225\260\345\255\227\347\232\204\346\225\260\345\255\227.md" +++ "b/problems/1365.\346\234\211\345\244\232\345\260\221\345\260\217\344\272\216\345\275\223\345\211\215\346\225\260\345\255\227\347\232\204\346\225\260\345\255\227.md" @@ -41,7 +41,7 @@ # 思路 -两层for循环暴力查找,时间复杂度明显为O(n^2)。 +两层for循环暴力查找,时间复杂度明显为$O(n^2)$。 那么我们来看一下如何优化。 @@ -110,7 +110,7 @@ public: }; ``` -可以排序之后加哈希,时间复杂度为O(nlogn) +可以排序之后加哈希,时间复杂度为$O(n\log n)$ # 其他语言版本 diff --git "a/problems/O(n)\347\232\204\347\256\227\346\263\225\345\261\205\347\204\266\350\266\205\346\227\266\344\272\206\357\274\214\346\255\244\346\227\266\347\232\204n\347\251\266\347\253\237\346\230\257\345\244\232\345\244\247\357\274\237.md" "b/problems/O(n)\347\232\204\347\256\227\346\263\225\345\261\205\347\204\266\350\266\205\346\227\266\344\272\206\357\274\214\346\255\244\346\227\266\347\232\204n\347\251\266\347\253\237\346\230\257\345\244\232\345\244\247\357\274\237.md" index 4c368ef859..9e36092c3d 100644 --- "a/problems/O(n)\347\232\204\347\256\227\346\263\225\345\261\205\347\204\266\350\266\205\346\227\266\344\272\206\357\274\214\346\255\244\346\227\266\347\232\204n\347\251\266\347\253\237\346\230\257\345\244\232\345\244\247\357\274\237.md" +++ "b/problems/O(n)\347\232\204\347\256\227\346\263\225\345\261\205\347\204\266\350\266\205\346\227\266\344\272\206\357\274\214\346\255\244\346\227\266\347\232\204n\347\251\266\347\253\237\346\230\257\345\244\232\345\244\247\357\274\237.md" @@ -3,7 +3,7 @@

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

-# 程序提交之后为什么会超时?O(n)的算法会超时,n究竟是多大? +# 程序提交之后为什么会超时?$O(n)$的算法会超时,n究竟是多大? 一些同学可能对计算机运行的速度还没有概念,就是感觉计算机运行速度应该会很快,那么在leetcode上做算法题目的时候为什么会超时呢? @@ -18,9 +18,9 @@ 也就是说程序运行的时间超过了规定的时间,一般OJ(online judge)的超时时间就是1s,也就是用例数据输入后最多要1s内得到结果,暂时还不清楚leetcode的判题规则,下文为了方便讲解,暂定超时时间就是1s。 -如果写出了一个O(n)的算法 ,其实可以估算出来n是多大的时候算法的执行时间就会超过1s了。 +如果写出了一个$O(n)$的算法 ,其实可以估算出来n是多大的时候算法的执行时间就会超过1s了。 -如果n的规模已经足够让O(n)的算法运行时间超过了1s,就应该考虑log(n)的解法了。 +如果n的规模已经足够让$O(n)$的算法运行时间超过了1s,就应该考虑log(n)的解法了。 # 从硬件配置看计算机的性能 @@ -63,7 +63,7 @@ 测试硬件:2015年MacPro,CPU配置:2.7 GHz Dual-Core Intel Core i5 -实现三个函数,时间复杂度分别是 O(n) , O(n^2), O(nlogn),使用加法运算来统一测试。 +实现三个函数,时间复杂度分别是 $O(n)$ , $O(n^2)$, $O(n\log n)$,使用加法运算来统一测试。 ```CPP // O(n) @@ -128,19 +128,19 @@ int main() { ![程序超时2](https://img-blog.csdnimg.cn/20200729200018460.png) -O(n)的算法,1s内大概计算机可以运行 5 * (10^8)次计算,可以推测一下O(n^2) 的算法应该1s可以处理的数量级的规模是 5 * (10^8)开根号,实验数据如下。 +O(n)的算法,1s内大概计算机可以运行 5 * (10^8)次计算,可以推测一下$O(n^2)$ 的算法应该1s可以处理的数量级的规模是 5 * (10^8)开根号,实验数据如下。 ![程序超时3](https://img-blog.csdnimg.cn/2020072919590970.png) O(n^2)的算法,1s内大概计算机可以运行 22500次计算,验证了刚刚的推测。 -在推测一下O(nlogn)的话, 1s可以处理的数据规模是什么呢? +在推测一下$O(n\log n)$的话, 1s可以处理的数据规模是什么呢? -理论上应该是比 O(n)少一个数量级,因为logn的复杂度 其实是很快,看一下实验数据。 +理论上应该是比 $O(n)$少一个数量级,因为$\log n$的复杂度 其实是很快,看一下实验数据。 ![程序超时4](https://img-blog.csdnimg.cn/20200729195729407.png) -O(nlogn)的算法,1s内大概计算机可以运行 2 * (10^7)次计算,符合预期。 +$O(n \logn)$的算法,1s内大概计算机可以运行 2 * (10^7)次计算,符合预期。 这是在我个人PC上测出来的数据,不能说是十分精确,但数量级是差不多的,大家也可以在自己的计算机上测一下。 @@ -148,7 +148,7 @@ O(nlogn)的算法,1s内大概计算机可以运行 2 * (10^7)次计算,符 ![程序超时1](https://img-blog.csdnimg.cn/20201208231559175.png) -至于O(logn) 和O(n^3) 等等这些时间复杂度在1s内可以处理的多大的数据规模,大家可以自己写一写代码去测一下了。 +至于$O(\log n)$和$O(n^3)$ 等等这些时间复杂度在1s内可以处理的多大的数据规模,大家可以自己写一写代码去测一下了。 # 完整测试代码 @@ -209,7 +209,7 @@ int main() { # 总结 -本文详细分析了在leetcode上做题程序为什么会有超时,以及从硬件配置上大体知道CPU的执行速度,然后亲自做一个实验来看看O(n)的算法,跑一秒钟,这个n究竟是做大,最后给出不同时间复杂度,一秒内可以运算出来的n的大小。 +本文详细分析了在leetcode上做题程序为什么会有超时,以及从硬件配置上大体知道CPU的执行速度,然后亲自做一个实验来看看$O(n)$的算法,跑一秒钟,这个n究竟是做大,最后给出不同时间复杂度,一秒内可以运算出来的n的大小。 建议录友们也都自己做一做实验,测一测,看看是不是和我的测出来的结果差不多。 diff --git "a/problems/\345\205\263\344\272\216\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\214\344\275\240\344\270\215\347\237\245\351\201\223\347\232\204\351\203\275\345\234\250\350\277\231\351\207\214\357\274\201.md" "b/problems/\345\205\263\344\272\216\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\214\344\275\240\344\270\215\347\237\245\351\201\223\347\232\204\351\203\275\345\234\250\350\277\231\351\207\214\357\274\201.md" index c36c8b61f8..f05af6bc6f 100644 --- "a/problems/\345\205\263\344\272\216\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\214\344\275\240\344\270\215\347\237\245\351\201\223\347\232\204\351\203\275\345\234\250\350\277\231\351\207\214\357\274\201.md" +++ "b/problems/\345\205\263\344\272\216\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\214\344\275\240\344\270\215\347\237\245\351\201\223\347\232\204\351\203\275\345\234\250\350\277\231\351\207\214\357\274\201.md" @@ -16,21 +16,21 @@ 那么该如何估计程序运行时间呢,通常会估算算法的操作单元数量来代表程序消耗的时间,这里默认CPU的每个单元运行消耗的时间都是相同的。 -假设算法的问题规模为n,那么操作单元数量便用函数f(n)来表示,随着数据规模n的增大,算法执行时间的增长率和f(n)的增长率相同,这称作为算法的渐近时间复杂度,简称时间复杂度,记为 O(f(n))。 +假设算法的问题规模为n,那么操作单元数量便用函数f(n)来表示,随着数据规模n的增大,算法执行时间的增长率和f(n)的增长率相同,这称作为算法的渐近时间复杂度,简称时间复杂度,记为 $O(f(n))$。 ## 什么是大O -这里的大O是指什么呢,说到时间复杂度,**大家都知道O(n),O(n^2),却说不清什么是大O**。 +这里的大O是指什么呢,说到时间复杂度,**大家都知道$O(n)$,$O(n^2)$,却说不清什么是大O**。 算法导论给出的解释:**大O用来表示上界的**,当用它作为算法的最坏情况运行时间的上界,就是对任意数据输入的运行时间的上界。 -同样算法导论给出了例子:拿插入排序来说,插入排序的时间复杂度我们都说是O(n^2) 。 +同样算法导论给出了例子:拿插入排序来说,插入排序的时间复杂度我们都说是$O(n^2)$ 。 -输入数据的形式对程序运算时间是有很大影响的,在数据本来有序的情况下时间复杂度是O(n),但如果数据是逆序的话,插入排序的时间复杂度就是O(n^2),也就对于所有输入情况来说,最坏是O(n^2) 的时间复杂度,所以称插入排序的时间复杂度为O(n^2)。 +输入数据的形式对程序运算时间是有很大影响的,在数据本来有序的情况下时间复杂度是$O(n)$,但如果数据是逆序的话,插入排序的时间复杂度就是$O(n^2)$,也就对于所有输入情况来说,最坏是$O(n^2)$ 的时间复杂度,所以称插入排序的时间复杂度为$O(n^2)$。 -同样的同理再看一下快速排序,都知道快速排序是O(nlogn),但是当数据已经有序情况下,快速排序的时间复杂度是O(n^2) 的,**所以严格从大O的定义来讲,快速排序的时间复杂度应该是O(n^2)**。 +同样的同理再看一下快速排序,都知道快速排序是$O(n\log n)$,但是当数据已经有序情况下,快速排序的时间复杂度是$O(n^2)$ 的,**所以严格从大O的定义来讲,快速排序的时间复杂度应该是$O(n^2)$**。 -**但是我们依然说快速排序是O(nlogn)的时间复杂度,这个就是业内的一个默认规定,这里说的O代表的就是一般情况,而不是严格的上界**。如图所示: +**但是我们依然说快速排序是$O(n\log n)$的时间复杂度,这个就是业内的一个默认规定,这里说的O代表的就是一般情况,而不是严格的上界**。如图所示: ![时间复杂度4,一般情况下的时间复杂度](https://img-blog.csdnimg.cn/20200728185745611.png) 我们主要关心的还是一般情况下的数据形式。 @@ -44,11 +44,11 @@ ![时间复杂度,不同数据规模的差异](https://img-blog.csdnimg.cn/20200728191447384.png) -在决定使用哪些算法的时候,不是时间复杂越低的越好(因为简化后的时间复杂度忽略了常数项等等),要考虑数据规模,如果数据规模很小甚至可以用O(n^2)的算法比O(n)的更合适(在有常数项的时候)。 +在决定使用哪些算法的时候,不是时间复杂越低的越好(因为简化后的时间复杂度忽略了常数项等等),要考虑数据规模,如果数据规模很小甚至可以用$O(n^2)$的算法比$O(n)$的更合适(在有常数项的时候)。 -就像上图中 O(5n^2) 和 O(100n) 在n为20之前 很明显 O(5n^2)是更优的,所花费的时间也是最少的。 +就像上图中 $O(5n^2)$ 和 $O(100n)$ 在n为20之前 很明显 $O(5n^2)$是更优的,所花费的时间也是最少的。 -那为什么在计算时间复杂度的时候要忽略常数项系数呢,也就说O(100n) 就是O(n)的时间复杂度,O(5n^2) 就是O(n^2)的时间复杂度,而且要默认O(n) 优于O(n^2) 呢 ? +那为什么在计算时间复杂度的时候要忽略常数项系数呢,也就说$O(100n)$ 就是$O(n)$的时间复杂度,$O(5n^2)$ 就是$O(n^2)$的时间复杂度,而且要默认$O(n)$ 优于$O(n^2)$ 呢 ? 这里就又涉及到大O的定义,**因为大O就是数据量级突破一个点且数据量级非常大的情况下所表现出的时间复杂度,这个数据量也就是常数项系数已经不起决定性作用的数据量**。 @@ -56,13 +56,13 @@ **所以我们说的时间复杂度都是省略常数项系数的,是因为一般情况下都是默认数据规模足够的大,基于这样的事实,给出的算法时间复杂的的一个排行如下所示**: -O(1)常数阶 < O(logn)对数阶 < O(n)线性阶 < O(n^2)平方阶 < O(n^3)(立方阶) < O(2^n) (指数阶) +O(1) 常数阶 < $O(\log n)$ 对数阶 < $O(n)$ 线性阶 < $O(n^2)$ 平方阶 < $O(n^3)$ 立方阶 < $O(2^n)$指数阶 但是也要注意大常数,如果这个常数非常大,例如10^7 ,10^9 ,那么常数就是不得不考虑的因素了。 ## 复杂表达式的化简 -有时候我们去计算时间复杂度的时候发现不是一个简单的O(n) 或者O(n^2), 而是一个复杂的表达式,例如: +有时候我们去计算时间复杂度的时候发现不是一个简单的$O(n)$ 或者$O(n^2)$, 而是一个复杂的表达式,例如: ``` O(2*n^2 + 10*n + 1000) @@ -88,19 +88,19 @@ O(n^2 + n) O(n^2) ``` -如果这一步理解有困难,那也可以做提取n的操作,变成O(n(n+1)) ,省略加法常数项后也就别变成了: +如果这一步理解有困难,那也可以做提取n的操作,变成$O(n(n+1))$,省略加法常数项后也就别变成了: ``` O(n^2) ``` -所以最后我们说:这个算法的算法时间复杂度是O(n^2) 。 +所以最后我们说:这个算法的算法时间复杂度是$O(n^2)$ 。 -也可以用另一种简化的思路,其实当n大于40的时候, 这个复杂度会恒小于O(3 * n^2), -O(2 * n^2 + 10 * n + 1000) < O(3 * n^2),所以说最后省略掉常数项系数最终时间复杂度也是O(n^2)。 +也可以用另一种简化的思路,其实当n大于40的时候, 这个复杂度会恒小于$O(3 × n^2)$, +$O(2 × n^2 + 10 × n + 1000)$ < $O(3 × n^2)$,所以说最后省略掉常数项系数最终时间复杂度也是$O(n^2)$。 -## O(logn)中的log是以什么为底? +## $O(\log n)$中的log是以什么为底? 平时说这个算法的时间复杂度是logn的,那么一定是log 以2为底n的对数么? @@ -123,21 +123,21 @@ O(2 * n^2 + 10 * n + 1000) < O(3 * n^2),所以说最后省略掉常数项系 通过这道面试题目,来分析一下时间复杂度。题目描述:找出n个字符串中相同的两个字符串(假设这里只有两个相同的字符串)。 -如果是暴力枚举的话,时间复杂度是多少呢,是O(n^2)么? +如果是暴力枚举的话,时间复杂度是多少呢,是$O(n^2)$么? -这里一些同学会忽略了字符串比较的时间消耗,这里并不像int 型数字做比较那么简单,除了n^2 次的遍历次数外,字符串比较依然要消耗m次操作(m也就是字母串的长度),所以时间复杂度是O(m * n * n)。 +这里一些同学会忽略了字符串比较的时间消耗,这里并不像int 型数字做比较那么简单,除了$n^2$次的遍历次数外,字符串比较依然要消耗m次操作(m也就是字母串的长度),所以时间复杂度是$O(m × n × n)$。 接下来再想一下其他解题思路。 先排对n个字符串按字典序来排序,排序后n个字符串就是有序的,意味着两个相同的字符串就是挨在一起,然后在遍历一遍n个字符串,这样就找到两个相同的字符串了。 -那看看这种算法的时间复杂度,快速排序时间复杂度为O(nlogn),依然要考虑字符串的长度是m,那么快速排序每次的比较都要有m次的字符比较的操作,就是O(m * n * logn) 。 +那看看这种算法的时间复杂度,快速排序时间复杂度为$O(n\log n)$,依然要考虑字符串的长度是m,那么快速排序每次的比较都要有m次的字符比较的操作,就是$O(m × n × \log n)$。 -之后还要遍历一遍这n个字符串找出两个相同的字符串,别忘了遍历的时候依然要比较字符串,所以总共的时间复杂度是 O(m * n * logn + n * m)。 +之后还要遍历一遍这n个字符串找出两个相同的字符串,别忘了遍历的时候依然要比较字符串,所以总共的时间复杂度是 $O(m × n × \log n + n × m)$。 -我们对O(m * n * logn + n * m) 进行简化操作,把m * n提取出来变成 O(m * n * (logn + 1)),再省略常数项最后的时间复杂度是 O(m * n * logn)。 +我们对$O(m × n × \log n + n × m)$进行简化操作,把$m × n$提取出来变成$O(m × n × (\log n + 1)$),再省略常数项最后的时间复杂度是$O(m × n × \log n)$。 -最后很明显O(m * n * logn) 要优于O(m * n * n)! +最后很明显$O(m × n × \log n)$ 要优于$O(m × n × n)$! 所以先把字符串集合排序再遍历一遍找到两个相同字符串的方法要比直接暴力枚举的方式更快。 diff --git "a/problems/\345\211\215\345\272\217/On\347\232\204\347\256\227\346\263\225\345\261\205\347\204\266\350\266\205\346\227\266\344\272\206\357\274\214\346\255\244\346\227\266\347\232\204n\347\251\266\347\253\237\346\230\257\345\244\232\345\244\247\357\274\237.md" "b/problems/\345\211\215\345\272\217/On\347\232\204\347\256\227\346\263\225\345\261\205\347\204\266\350\266\205\346\227\266\344\272\206\357\274\214\346\255\244\346\227\266\347\232\204n\347\251\266\347\253\237\346\230\257\345\244\232\345\244\247\357\274\237.md" index d9cc8d450c..2019e691d9 100644 --- "a/problems/\345\211\215\345\272\217/On\347\232\204\347\256\227\346\263\225\345\261\205\347\204\266\350\266\205\346\227\266\344\272\206\357\274\214\346\255\244\346\227\266\347\232\204n\347\251\266\347\253\237\346\230\257\345\244\232\345\244\247\357\274\237.md" +++ "b/problems/\345\211\215\345\272\217/On\347\232\204\347\256\227\346\263\225\345\261\205\347\204\266\350\266\205\346\227\266\344\272\206\357\274\214\346\255\244\346\227\266\347\232\204n\347\251\266\347\253\237\346\230\257\345\244\232\345\244\247\357\274\237.md" @@ -20,9 +20,9 @@ 也就是说程序运行的时间超过了规定的时间,一般OJ(online judge)的超时时间就是1s,也就是用例数据输入后最多要1s内得到结果,暂时还不清楚leetcode的判题规则,下文为了方便讲解,暂定超时时间就是1s。 -如果写出了一个O(n)的算法 ,其实可以估算出来n是多大的时候算法的执行时间就会超过1s了。 +如果写出了一个$O(n)$的算法 ,其实可以估算出来n是多大的时候算法的执行时间就会超过1s了。 -如果n的规模已经足够让O(n)的算法运行时间超过了1s,就应该考虑log(n)的解法了。 +如果n的规模已经足够让$O(n)$的算法运行时间超过了1s,就应该考虑log(n)的解法了。 # 从硬件配置看计算机的性能 @@ -65,7 +65,7 @@ 测试硬件:2015年MacPro,CPU配置:2.7 GHz Dual-Core Intel Core i5 -实现三个函数,时间复杂度分别是 O(n) , O(n^2), O(nlogn),使用加法运算来统一测试。 +实现三个函数,时间复杂度分别是 $O(n)$ , $O(n^2)$, $O(n\log n)$,使用加法运算来统一测试。 ```CPP // O(n) @@ -130,19 +130,19 @@ int main() { ![程序超时2](https://img-blog.csdnimg.cn/20200729200018460.png) -O(n)的算法,1s内大概计算机可以运行 5 * (10^8)次计算,可以推测一下O(n^2) 的算法应该1s可以处理的数量级的规模是 5 * (10^8)开根号,实验数据如下。 +O(n)的算法,1s内大概计算机可以运行 5 * (10^8)次计算,可以推测一下$O(n^2)$ 的算法应该1s可以处理的数量级的规模是 5 * (10^8)开根号,实验数据如下。 ![程序超时3](https://img-blog.csdnimg.cn/2020072919590970.png) O(n^2)的算法,1s内大概计算机可以运行 22500次计算,验证了刚刚的推测。 -在推测一下O(nlogn)的话, 1s可以处理的数据规模是什么呢? +在推测一下$O(n\log n)$的话, 1s可以处理的数据规模是什么呢? -理论上应该是比 O(n)少一个数量级,因为logn的复杂度 其实是很快,看一下实验数据。 +理论上应该是比 $O(n)$少一个数量级,因为$\log n$的复杂度 其实是很快,看一下实验数据。 ![程序超时4](https://img-blog.csdnimg.cn/20200729195729407.png) -O(nlogn)的算法,1s内大概计算机可以运行 2 * (10^7)次计算,符合预期。 +$O(n\log n)$的算法,1s内大概计算机可以运行 2 * (10^7)次计算,符合预期。 这是在我个人PC上测出来的数据,不能说是十分精确,但数量级是差不多的,大家也可以在自己的计算机上测一下。 @@ -150,7 +150,7 @@ O(nlogn)的算法,1s内大概计算机可以运行 2 * (10^7)次计算,符 ![程序超时1](https://img-blog.csdnimg.cn/20201208231559175.png) -至于O(logn) 和O(n^3) 等等这些时间复杂度在1s内可以处理的多大的数据规模,大家可以自己写一写代码去测一下了。 +至于 $O(\log n)$ 和 $O(n^3)$ 等等这些时间复杂度在1s内可以处理的多大的数据规模,大家可以自己写一写代码去测一下了。 # 完整测试代码 @@ -211,7 +211,7 @@ int main() { # 总结 -本文详细分析了在leetcode上做题程序为什么会有超时,以及从硬件配置上大体知道CPU的执行速度,然后亲自做一个实验来看看O(n)的算法,跑一秒钟,这个n究竟是做大,最后给出不同时间复杂度,一秒内可以运算出来的n的大小。 +本文详细分析了在leetcode上做题程序为什么会有超时,以及从硬件配置上大体知道CPU的执行速度,然后亲自做一个实验来看看$O(n)$的算法,跑一秒钟,这个n究竟是做大,最后给出不同时间复杂度,一秒内可以运算出来的n的大小。 建议录友们也都自己做一做实验,测一测,看看是不是和我的测出来的结果差不多。 diff --git "a/problems/\345\211\215\345\272\217/\345\205\263\344\272\216\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\214\344\275\240\344\270\215\347\237\245\351\201\223\347\232\204\351\203\275\345\234\250\350\277\231\351\207\214\357\274\201.md" "b/problems/\345\211\215\345\272\217/\345\205\263\344\272\216\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\214\344\275\240\344\270\215\347\237\245\351\201\223\347\232\204\351\203\275\345\234\250\350\277\231\351\207\214\357\274\201.md" index d4869b143f..cfcbed1a6e 100644 --- "a/problems/\345\211\215\345\272\217/\345\205\263\344\272\216\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\214\344\275\240\344\270\215\347\237\245\351\201\223\347\232\204\351\203\275\345\234\250\350\277\231\351\207\214\357\274\201.md" +++ "b/problems/\345\211\215\345\272\217/\345\205\263\344\272\216\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\214\344\275\240\344\270\215\347\237\245\351\201\223\347\232\204\351\203\275\345\234\250\350\277\231\351\207\214\357\274\201.md" @@ -15,7 +15,7 @@ * 什么是大O * 不同数据规模的差异 * 复杂表达式的化简 -* O(logn)中的log是以什么为底? +* $O(\log n)$中的log是以什么为底? * 举一个例子 @@ -29,21 +29,21 @@ 那么该如何估计程序运行时间呢,通常会估算算法的操作单元数量来代表程序消耗的时间,这里默认CPU的每个单元运行消耗的时间都是相同的。 -假设算法的问题规模为n,那么操作单元数量便用函数f(n)来表示,随着数据规模n的增大,算法执行时间的增长率和f(n)的增长率相同,这称作为算法的渐近时间复杂度,简称时间复杂度,记为 O(f(n))。 +假设算法的问题规模为n,那么操作单元数量便用函数f(n)来表示,随着数据规模n的增大,算法执行时间的增长率和f(n)的增长率相同,这称作为算法的渐近时间复杂度,简称时间复杂度,记为 $O(f(n)$)。 ## 什么是大O -这里的大O是指什么呢,说到时间复杂度,**大家都知道O(n),O(n^2),却说不清什么是大O**。 +这里的大O是指什么呢,说到时间复杂度,**大家都知道$O(n)$,$O(n^2)$,却说不清什么是大O**。 算法导论给出的解释:**大O用来表示上界的**,当用它作为算法的最坏情况运行时间的上界,就是对任意数据输入的运行时间的上界。 -同样算法导论给出了例子:拿插入排序来说,插入排序的时间复杂度我们都说是O(n^2) 。 +同样算法导论给出了例子:拿插入排序来说,插入排序的时间复杂度我们都说是$O(n^2)$ 。 -输入数据的形式对程序运算时间是有很大影响的,在数据本来有序的情况下时间复杂度是O(n),但如果数据是逆序的话,插入排序的时间复杂度就是O(n^2),也就对于所有输入情况来说,最坏是O(n^2) 的时间复杂度,所以称插入排序的时间复杂度为O(n^2)。 +输入数据的形式对程序运算时间是有很大影响的,在数据本来有序的情况下时间复杂度是$O(n)$,但如果数据是逆序的话,插入排序的时间复杂度就是$O(n^2)$,也就对于所有输入情况来说,最坏是$O(n^2)$ 的时间复杂度,所以称插入排序的时间复杂度为$O(n^2)$。 -同样的同理再看一下快速排序,都知道快速排序是O(nlogn),但是当数据已经有序情况下,快速排序的时间复杂度是O(n^2) 的,**所以严格从大O的定义来讲,快速排序的时间复杂度应该是O(n^2)**。 +同样的同理再看一下快速排序,都知道快速排序是$O(n\log n)$,但是当数据已经有序情况下,快速排序的时间复杂度是$O(n^2)$ 的,**所以严格从大O的定义来讲,快速排序的时间复杂度应该是$O(n^2)$**。 -**但是我们依然说快速排序是O(nlogn)的时间复杂度,这个就是业内的一个默认规定,这里说的O代表的就是一般情况,而不是严格的上界**。如图所示: +**但是我们依然说快速排序是$O(n\log n)$的时间复杂度,这个就是业内的一个默认规定,这里说的O代表的就是一般情况,而不是严格的上界**。如图所示: ![时间复杂度4,一般情况下的时间复杂度](https://img-blog.csdnimg.cn/20200728185745611.png) 我们主要关心的还是一般情况下的数据形式。 @@ -57,11 +57,11 @@ ![时间复杂度,不同数据规模的差异](https://img-blog.csdnimg.cn/20200728191447384.png) -在决定使用哪些算法的时候,不是时间复杂越低的越好(因为简化后的时间复杂度忽略了常数项等等),要考虑数据规模,如果数据规模很小甚至可以用O(n^2)的算法比O(n)的更合适(在有常数项的时候)。 +在决定使用哪些算法的时候,不是时间复杂越低的越好(因为简化后的时间复杂度忽略了常数项等等),要考虑数据规模,如果数据规模很小甚至可以用$O(n^2)$的算法比$O(n)$的更合适(在有常数项的时候)。 -就像上图中 O(5n^2) 和 O(100n) 在n为20之前 很明显 O(5n^2)是更优的,所花费的时间也是最少的。 +就像上图中 $O(5n^2)$ 和 $O(100n)$ 在n为20之前 很明显 $O(5n^2)$是更优的,所花费的时间也是最少的。 -那为什么在计算时间复杂度的时候要忽略常数项系数呢,也就说O(100n) 就是O(n)的时间复杂度,O(5n^2) 就是O(n^2)的时间复杂度,而且要默认O(n) 优于O(n^2) 呢 ? +那为什么在计算时间复杂度的时候要忽略常数项系数呢,也就说$O(100n)$ 就是$O(n)$的时间复杂度,$O(5n^2)$ 就是$O(n^2)$的时间复杂度,而且要默认$O(n)$ 优于$O(n^2)$ 呢 ? 这里就又涉及到大O的定义,**因为大O就是数据量级突破一个点且数据量级非常大的情况下所表现出的时间复杂度,这个数据量也就是常数项系数已经不起决定性作用的数据量**。 @@ -69,13 +69,13 @@ **所以我们说的时间复杂度都是省略常数项系数的,是因为一般情况下都是默认数据规模足够的大,基于这样的事实,给出的算法时间复杂的的一个排行如下所示**: -O(1)常数阶 < O(logn)对数阶 < O(n)线性阶 < O(n^2)平方阶 < O(n^3)(立方阶) < O(2^n) (指数阶) +O(1)常数阶 < $O(\log n)$对数阶 < $O(n)$线性阶 < $O(n^2)$平方阶 < $O(n^3)$立方阶 < $O(2^n)$指数阶 但是也要注意大常数,如果这个常数非常大,例如10^7 ,10^9 ,那么常数就是不得不考虑的因素了。 ## 复杂表达式的化简 -有时候我们去计算时间复杂度的时候发现不是一个简单的O(n) 或者O(n^2), 而是一个复杂的表达式,例如: +有时候我们去计算时间复杂度的时候发现不是一个简单的$O(n)$ 或者$O(n^2)$, 而是一个复杂的表达式,例如: ``` O(2*n^2 + 10*n + 1000) @@ -101,19 +101,19 @@ O(n^2 + n) O(n^2) ``` -如果这一步理解有困难,那也可以做提取n的操作,变成O(n(n+1)) ,省略加法常数项后也就别变成了: +如果这一步理解有困难,那也可以做提取n的操作,变成$O(n(n+1)$) ,省略加法常数项后也就别变成了: ``` O(n^2) ``` -所以最后我们说:这个算法的算法时间复杂度是O(n^2) 。 +所以最后我们说:这个算法的算法时间复杂度是$O(n^2)$ 。 -也可以用另一种简化的思路,其实当n大于40的时候, 这个复杂度会恒小于O(3 * n^2), -O(2 * n^2 + 10 * n + 1000) < O(3 * n^2),所以说最后省略掉常数项系数最终时间复杂度也是O(n^2)。 +也可以用另一种简化的思路,其实当n大于40的时候, 这个复杂度会恒小于$O(3 × n^2)$, +$O(2 × n^2 + 10 × n + 1000) < O(3 × n^2)$,所以说最后省略掉常数项系数最终时间复杂度也是$O(n^2)$。 -## O(logn)中的log是以什么为底? +## $O(\log n)$中的log是以什么为底? 平时说这个算法的时间复杂度是logn的,那么一定是log 以2为底n的对数么? @@ -136,21 +136,21 @@ O(2 * n^2 + 10 * n + 1000) < O(3 * n^2),所以说最后省略掉常数项系 通过这道面试题目,来分析一下时间复杂度。题目描述:找出n个字符串中相同的两个字符串(假设这里只有两个相同的字符串)。 -如果是暴力枚举的话,时间复杂度是多少呢,是O(n^2)么? +如果是暴力枚举的话,时间复杂度是多少呢,是$O(n^2)$么? -这里一些同学会忽略了字符串比较的时间消耗,这里并不像int 型数字做比较那么简单,除了n^2 次的遍历次数外,字符串比较依然要消耗m次操作(m也就是字母串的长度),所以时间复杂度是O(m * n * n)。 +这里一些同学会忽略了字符串比较的时间消耗,这里并不像int 型数字做比较那么简单,除了n^2 次的遍历次数外,字符串比较依然要消耗m次操作(m也就是字母串的长度),所以时间复杂度是$O(m × n × n)$。 接下来再想一下其他解题思路。 先排对n个字符串按字典序来排序,排序后n个字符串就是有序的,意味着两个相同的字符串就是挨在一起,然后在遍历一遍n个字符串,这样就找到两个相同的字符串了。 -那看看这种算法的时间复杂度,快速排序时间复杂度为O(nlogn),依然要考虑字符串的长度是m,那么快速排序每次的比较都要有m次的字符比较的操作,就是O(m * n * logn) 。 +那看看这种算法的时间复杂度,快速排序时间复杂度为$O(n\log n)$,依然要考虑字符串的长度是m,那么快速排序每次的比较都要有m次的字符比较的操作,就是$O(m × n × \log n)$ 。 -之后还要遍历一遍这n个字符串找出两个相同的字符串,别忘了遍历的时候依然要比较字符串,所以总共的时间复杂度是 O(m * n * logn + n * m)。 +之后还要遍历一遍这n个字符串找出两个相同的字符串,别忘了遍历的时候依然要比较字符串,所以总共的时间复杂度是 $O(m × n × \log n + n × m)$。 -我们对O(m * n * logn + n * m) 进行简化操作,把m * n提取出来变成 O(m * n * (logn + 1)),再省略常数项最后的时间复杂度是 O(m * n * logn)。 +我们对$O(m × n × \log n + n × m)$ 进行简化操作,把$m × n$提取出来变成 $O(m × n × (\log n + 1)$),再省略常数项最后的时间复杂度是 $O(m × n × \log n)$。 -最后很明显O(m * n * logn) 要优于O(m * n * n)! +最后很明显$O(m × n × \log n)$ 要优于$O(m × n × n)$! 所以先把字符串集合排序再遍历一遍找到两个相同字符串的方法要比直接暴力枚举的方式更快。 diff --git "a/problems/\345\211\215\345\272\217/\345\205\263\344\272\216\347\251\272\351\227\264\345\244\215\346\235\202\345\272\246\357\274\214\345\217\257\350\203\275\346\234\211\345\207\240\344\270\252\347\226\221\351\227\256\357\274\237.md" "b/problems/\345\211\215\345\272\217/\345\205\263\344\272\216\347\251\272\351\227\264\345\244\215\346\235\202\345\272\246\357\274\214\345\217\257\350\203\275\346\234\211\345\207\240\344\270\252\347\226\221\351\227\256\357\274\237.md" index 510979c9cf..95ffe597be 100644 --- "a/problems/\345\211\215\345\272\217/\345\205\263\344\272\216\347\251\272\351\227\264\345\244\215\346\235\202\345\272\246\357\274\214\345\217\257\350\203\275\346\234\211\345\207\240\344\270\252\347\226\221\351\227\256\357\274\237.md" +++ "b/problems/\345\211\215\345\272\217/\345\205\263\344\272\216\347\251\272\351\227\264\345\244\215\346\235\202\345\272\246\357\274\214\345\217\257\350\203\275\346\234\211\345\207\240\344\270\252\347\226\221\351\227\256\357\274\237.md" @@ -11,14 +11,14 @@ # 空间复杂度分析 * [关于时间复杂度,你不知道的都在这里!](https://programmercarl.com/前序/关于时间复杂度,你不知道的都在这里!.html) -* [O(n)的算法居然超时了,此时的n究竟是多大?](https://programmercarl.com/前序/On的算法居然超时了,此时的n究竟是多大?.html) +* [$O(n)$的算法居然超时了,此时的n究竟是多大?](https://programmercarl.com/前序/On的算法居然超时了,此时的n究竟是多大?.html) * [通过一道面试题目,讲一讲递归算法的时间复杂度!](https://programmercarl.com/前序/通过一道面试题目,讲一讲递归算法的时间复杂度!.html) 那么一直还没有讲空间复杂度,所以打算陆续来补上,内容不难,大家可以读一遍文章就有整体的了解了。 什么是空间复杂度呢? -是对一个算法在运行过程中占用内存空间大小的量度,记做S(n)=O(f(n)。 +是对一个算法在运行过程中占用内存空间大小的量度,记做$S(n)=O(f(n)$。 空间复杂度(Space Complexity)记作S(n) 依然使用大O来表示。利用程序的空间复杂度,可以对程序运行中需要多少内存有个预先估计。 @@ -40,7 +40,7 @@ 同样在工程实践中,计算机的内存空间也不是无限的,需要工程师对软件运行时所使用的内存有一个大体评估,这都需要用到算法空间复杂度的分析。 -来看一下例子,什么时候的空间复杂度是O(1)呢,C++代码如下: +来看一下例子,什么时候的空间复杂度是$O(1)$呢,C++代码如下: ```CPP int j = 0; @@ -49,11 +49,11 @@ for (int i = 0; i < n; i++) { } ``` -第一段代码可以看出,随着n的变化,所需开辟的内存空间并不会随着n的变化而变化。即此算法空间复杂度为一个常量,所以表示为大 O(1)。 +第一段代码可以看出,随着n的变化,所需开辟的内存空间并不会随着n的变化而变化。即此算法空间复杂度为一个常量,所以表示为大$O(1)$。 -什么时候的空间复杂度是O(n)? +什么时候的空间复杂度是$O(n)$? -当消耗空间和输入参数n保持线性增长,这样的空间复杂度为O(n),来看一下这段C++代码 +当消耗空间和输入参数n保持线性增长,这样的空间复杂度为$O(n)$,来看一下这段C++代码 ```CPP int* a = new int(n); for (int i = 0; i < n; i++) { @@ -61,9 +61,9 @@ for (int i = 0; i < n; i++) { } ``` -我们定义了一个数组出来,这个数组占用的大小为n,虽然有一个for循环,但没有再分配新的空间,因此,这段代码的空间复杂度主要看第一行即可,随着n的增大,开辟的内存大小呈线性增长,即 O(n)。 +我们定义了一个数组出来,这个数组占用的大小为n,虽然有一个for循环,但没有再分配新的空间,因此,这段代码的空间复杂度主要看第一行即可,随着n的增大,开辟的内存大小呈线性增长,即 $O(n)$。 -其他的 O(n^2), O(n^3) 我想大家应该都可以以此例举出来了,**那么思考一下 什么时候空间复杂度是 O(logn)呢?** +其他的 $O(n^2)$, $O(n^3)$ 我想大家应该都可以以此例举出来了,**那么思考一下 什么时候空间复杂度是 $O(\log n)$呢?** 空间复杂度是logn的情况确实有些特殊,其实是在**递归的时候,会出现空间复杂度为logn的情况**。 diff --git "a/problems/\345\211\215\345\272\217/\351\200\222\345\275\222\347\256\227\346\263\225\347\232\204\346\227\266\351\227\264\344\270\216\347\251\272\351\227\264\345\244\215\346\235\202\345\272\246\345\210\206\346\236\220.md" "b/problems/\345\211\215\345\272\217/\351\200\222\345\275\222\347\256\227\346\263\225\347\232\204\346\227\266\351\227\264\344\270\216\347\251\272\351\227\264\345\244\215\346\235\202\345\272\246\345\210\206\346\236\220.md" index 63376d11d4..8025e8e6ce 100644 --- "a/problems/\345\211\215\345\272\217/\351\200\222\345\275\222\347\256\227\346\263\225\347\232\204\346\227\266\351\227\264\344\270\216\347\251\272\351\227\264\345\244\215\346\235\202\345\272\246\345\210\206\346\236\220.md" +++ "b/problems/\345\211\215\345\272\217/\351\200\222\345\275\222\347\256\227\346\263\225\347\232\204\346\227\266\351\227\264\344\270\216\347\251\272\351\227\264\345\244\215\346\235\202\345\272\246\345\210\206\346\236\220.md" @@ -34,7 +34,7 @@ int fibonacci(int i) { 在讲解递归时间复杂度的时候,我们提到了递归算法的时间复杂度本质上是要看: **递归的次数 * 每次递归的时间复杂度**。 -可以看出上面的代码每次递归都是O(1)的操作。再来看递归了多少次,这里将i为5作为输入的递归过程 抽象成一颗递归树,如图: +可以看出上面的代码每次递归都是$O(1)$的操作。再来看递归了多少次,这里将i为5作为输入的递归过程 抽象成一颗递归树,如图: ![递归空间复杂度分析](https://img-blog.csdnimg.cn/20210305093200104.png) @@ -44,7 +44,7 @@ int fibonacci(int i) { 我们之前也有说到,一棵深度(按根节点深度为1)为k的二叉树最多可以有 2^k - 1 个节点。 -所以该递归算法的时间复杂度为 O(2^n) ,这个复杂度是非常大的,随着n的增大,耗时是指数上升的。 +所以该递归算法的时间复杂度为$O(2^n)$,这个复杂度是非常大的,随着n的增大,耗时是指数上升的。 来做一个实验,大家可以有一个直观的感受。 @@ -93,7 +93,7 @@ int main() * n = 40,耗时:837 ms * n = 50,耗时:110306 ms -可以看出,O(2^n)这种指数级别的复杂度是非常大的。 +可以看出,$O(2^n)$这种指数级别的复杂度是非常大的。 所以这种求斐波那契数的算法看似简洁,其实时间复杂度非常高,一般不推荐这样来实现斐波那契。 @@ -127,14 +127,14 @@ int fibonacci(int first, int second, int n) { 这里相当于用first和second来记录当前相加的两个数值,此时就不用两次递归了。 -因为每次递归的时候n减1,即只是递归了n次,所以时间复杂度是 O(n)。 +因为每次递归的时候n减1,即只是递归了n次,所以时间复杂度是 $O(n)$。 -同理递归的深度依然是n,每次递归所需的空间也是常数,所以空间复杂度依然是O(n)。 +同理递归的深度依然是n,每次递归所需的空间也是常数,所以空间复杂度依然是$O(n)$。 代码(版本二)的复杂度如下: -* 时间复杂度: O(n) -* 空间复杂度: O(n) +* 时间复杂度:$O(n)$ +* 空间复杂度:$O(n)$ 此时再来测一下耗时情况验证一下: @@ -198,7 +198,7 @@ int main() 因为每次递归所需的空间都被压到调用栈里(这是内存管理里面的数据结构,和算法里的栈原理是一样的),一次递归结束,这个栈就是就是把本次递归的数据弹出去。所以这个栈最大的长度就是递归的深度。 -此时可以分析这段递归的空间复杂度,从代码中可以看出每次递归所需要的空间大小都是一样的,所以每次递归中需要的空间是一个常量,并不会随着n的变化而变化,每次递归的空间复杂度就是O(1)。 +此时可以分析这段递归的空间复杂度,从代码中可以看出每次递归所需要的空间大小都是一样的,所以每次递归中需要的空间是一个常量,并不会随着n的变化而变化,每次递归的空间复杂度就是$O(1)$。 在看递归的深度是多少呢?如图所示: @@ -206,7 +206,7 @@ int main() 递归第n个斐波那契数的话,递归调用栈的深度就是n。 -那么每次递归的空间复杂度是O(1), 调用栈深度为n,所以这段递归代码的空间复杂度就是O(n)。 +那么每次递归的空间复杂度是$O(1)$, 调用栈深度为n,所以这段递归代码的空间复杂度就是$O(n)$。 ```CPP int fibonacci(int i) { @@ -241,24 +241,24 @@ int binary_search( int arr[], int l, int r, int x) { } ``` -都知道二分查找的时间复杂度是O(logn),那么递归二分查找的空间复杂度是多少呢? +都知道二分查找的时间复杂度是$O(\log n)$,那么递归二分查找的空间复杂度是多少呢? 我们依然看 **每次递归的空间复杂度和递归的深度** 每次递归的空间复杂度可以看出主要就是参数里传入的这个arr数组,但需要注意的是在C/C++中函数传递数组参数,不是整个数组拷贝一份传入函数而是传入的数组首元素地址。 -**也就是说每一层递归都是公用一块数组地址空间的**,所以 每次递归的空间复杂度是常数即:O(1)。 +**也就是说每一层递归都是公用一块数组地址空间的**,所以 每次递归的空间复杂度是常数即:$O(1)$。 -再来看递归的深度,二分查找的递归深度是logn ,递归深度就是调用栈的长度,那么这段代码的空间复杂度为 1 * logn = O(logn)。 +再来看递归的深度,二分查找的递归深度是logn ,递归深度就是调用栈的长度,那么这段代码的空间复杂度为 $1 * logn = O(logn)$。 -大家要注意自己所用的语言在传递函数参数的时,是拷贝整个数值还是拷贝地址,如果是拷贝整个数值那么该二分法的空间复杂度就是O(nlogn)。 +大家要注意自己所用的语言在传递函数参数的时,是拷贝整个数值还是拷贝地址,如果是拷贝整个数值那么该二分法的空间复杂度就是$O(n\log n)$。 ## 总结 本章我们详细分析了递归实现的求斐波那契和二分法的空间复杂度,同时也对时间复杂度做了分析。 -特别是两种递归实现的求斐波那契数列,其时间复杂度截然不容,我们还做了实验,验证了时间复杂度为O(2^n)是非常耗时的。 +特别是两种递归实现的求斐波那契数列,其时间复杂度截然不容,我们还做了实验,验证了时间复杂度为$O(2^n)$是非常耗时的。 通过本篇大家应该对递归算法的时间复杂度和空间复杂度有更加深刻的理解了。 diff --git "a/problems/\345\211\215\345\272\217/\351\200\232\350\277\207\344\270\200\351\201\223\351\235\242\350\257\225\351\242\230\347\233\256\357\274\214\350\256\262\344\270\200\350\256\262\351\200\222\345\275\222\347\256\227\346\263\225\347\232\204\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\201.md" "b/problems/\345\211\215\345\272\217/\351\200\232\350\277\207\344\270\200\351\201\223\351\235\242\350\257\225\351\242\230\347\233\256\357\274\214\350\256\262\344\270\200\350\256\262\351\200\222\345\275\222\347\256\227\346\263\225\347\232\204\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\201.md" index b3aef43c37..dd998c5353 100644 --- "a/problems/\345\211\215\345\272\217/\351\200\232\350\277\207\344\270\200\351\201\223\351\235\242\350\257\225\351\242\230\347\233\256\357\274\214\350\256\262\344\270\200\350\256\262\351\200\222\345\275\222\347\256\227\346\263\225\347\232\204\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\201.md" +++ "b/problems/\345\211\215\345\272\217/\351\200\232\350\277\207\344\270\200\351\201\223\351\235\242\350\257\225\351\242\230\347\233\256\357\274\214\350\256\262\344\270\200\350\256\262\351\200\222\345\275\222\347\256\227\346\263\225\347\232\204\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\201.md" @@ -15,13 +15,13 @@ 相信很多同学对递归算法的时间复杂度都很模糊,那么这篇来给大家通透的讲一讲。 -**同一道题目,同样使用递归算法,有的同学会写出了O(n)的代码,有的同学就写出了O(logn)的代码**。 +**同一道题目,同样使用递归算法,有的同学会写出了$O(n)$的代码,有的同学就写出了$O(\log n)$的代码**。 这是为什么呢? 如果对递归的时间复杂度理解的不够深入的话,就会这样! -那么我通过一道简单的面试题,模拟面试的场景,来带大家逐步分析递归算法的时间复杂度,最后找出最优解,来看看同样是递归,怎么就写成了O(n)的代码。 +那么我通过一道简单的面试题,模拟面试的场景,来带大家逐步分析递归算法的时间复杂度,最后找出最优解,来看看同样是递归,怎么就写成了$O(n)$的代码。 面试题:求x的n次方 @@ -36,7 +36,7 @@ int function1(int x, int n) { return result; } ``` -时间复杂度为O(n),此时面试官会说,有没有效率更好的算法呢。 +时间复杂度为$O(n)$,此时面试官会说,有没有效率更好的算法呢。 **如果此时没有思路,不要说:我不会,我不知道了等等**。 @@ -54,11 +54,11 @@ int function2(int x, int n) { ``` 面试官问:“那么这个代码的时间复杂度是多少?”。 -一些同学可能一看到递归就想到了O(logn),其实并不是这样,递归算法的时间复杂度本质上是要看: **递归的次数 * 每次递归中的操作次数**。 +一些同学可能一看到递归就想到了$O(\log n)$,其实并不是这样,递归算法的时间复杂度本质上是要看: **递归的次数 * 每次递归中的操作次数**。 那再来看代码,这里递归了几次呢? -每次n-1,递归了n次时间复杂度是O(n),每次进行了一个乘法操作,乘法操作的时间复杂度一个常数项O(1),所以这份代码的时间复杂度是 n * 1 = O(n)。 +每次n-1,递归了n次时间复杂度是$O(n)$,每次进行了一个乘法操作,乘法操作的时间复杂度一个常数项$O(1)$,所以这份代码的时间复杂度是 $n × 1 = O(n)$。 这个时间复杂度就没有达到面试官的预期。于是又写出了如下的递归算法的代码: @@ -91,11 +91,11 @@ int function3(int x, int n) { ![递归求时间复杂度](https://img-blog.csdnimg.cn/20200728195531892.png) -**时间复杂度忽略掉常数项`-1`之后,这个递归算法的时间复杂度依然是O(n)**。对,你没看错,依然是O(n)的时间复杂度! +**时间复杂度忽略掉常数项`-1`之后,这个递归算法的时间复杂度依然是$O(n)$**。对,你没看错,依然是$O(n)$的时间复杂度! -此时面试官就会说:“这个递归的算法依然还是O(n)啊”, 很明显没有达到面试官的预期。 +此时面试官就会说:“这个递归的算法依然还是$O(n)$啊”, 很明显没有达到面试官的预期。 -那么O(logn)的递归算法应该怎么写呢? +那么$O(\log n)$的递归算法应该怎么写呢? 想一想刚刚给出的那份递归算法的代码,是不是有哪里比较冗余呢,其实有重复计算的部分。 @@ -118,7 +118,7 @@ int function4(int x, int n) { 依然还是看他递归了多少次,可以看到这里仅仅有一个递归调用,且每次都是n/2 ,所以这里我们一共调用了log以2为底n的对数次。 -**每次递归了做都是一次乘法操作,这也是一个常数项的操作,那么这个递归算法的时间复杂度才是真正的O(logn)**。 +**每次递归了做都是一次乘法操作,这也是一个常数项的操作,那么这个递归算法的时间复杂度才是真正的$O(\log n)$**。 此时大家最后写出了这样的代码并且将时间复杂度分析的非常清晰,相信面试官是比较满意的。 @@ -126,11 +126,11 @@ int function4(int x, int n) { 对于递归的时间复杂度,毕竟初学者有时候会迷糊,刷过很多题的老手依然迷糊。 -**本篇我用一道非常简单的面试题目:求x的n次方,来逐步分析递归算法的时间复杂度,注意不要一看到递归就想到了O(logn)!** +**本篇我用一道非常简单的面试题目:求x的n次方,来逐步分析递归算法的时间复杂度,注意不要一看到递归就想到了$O(\log n)$!** -同样使用递归,有的同学可以写出O(logn)的代码,有的同学还可以写出O(n)的代码。 +同样使用递归,有的同学可以写出$O(\log n)$的代码,有的同学还可以写出$O(n)$的代码。 -对于function3 这样的递归实现,很容易让人感觉这是O(logn)的时间复杂度,其实这是O(n)的算法! +对于function3 这样的递归实现,很容易让人感觉这是$O(\log n)$的时间复杂度,其实这是$O(n)$的算法! ```CPP int function3(int x, int n) { diff --git "a/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" "b/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" index 115ed1e749..eed31557a3 100644 --- "a/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" +++ "b/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" @@ -29,7 +29,7 @@ i指向新长度的末尾,j指向旧长度的末尾。 有同学问了,为什么要从后向前填充,从前向后填充不行么? -从前向后填充就是O(n^2)的算法了,因为每次添加元素都要将添加元素之后的所有元素向后移动。 +从前向后填充就是$O(n^2)$的算法了,因为每次添加元素都要将添加元素之后的所有元素向后移动。 **其实很多数组填充类的问题,都可以先预先给数组扩容带填充后的大小,然后在从后向前进行操作。** @@ -72,10 +72,10 @@ public: return s; } }; - ``` -* 时间复杂度:O(n) -* 空间复杂度:O(1) + +* 时间复杂度:$O(n)$ +* 空间复杂度:$O(1)$ 此时算上本题,我们已经做了七道双指针相关的题目了分别是: diff --git "a/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" "b/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" index cd09b69017..a7ffb931c9 100644 --- "a/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" @@ -86,7 +86,7 @@ public: # 题外话 一些同学热衷于使用substr,来做这道题。 -其实使用substr 和 反转 时间复杂度是一样的 ,都是O(n),但是使用substr申请了额外空间,所以空间复杂度是O(n),而反转方法的空间复杂度是O(1)。 +其实使用substr 和 反转 时间复杂度是一样的 ,都是$O(n)$,但是使用substr申请了额外空间,所以空间复杂度是$O(n)$,而反转方法的空间复杂度是$O(1)$。 **如果想让这套题目有意义,就不要申请额外空间。** diff --git "a/problems/\345\212\250\346\200\201\350\247\204\345\210\222-\350\202\241\347\245\250\351\227\256\351\242\230\346\200\273\347\273\223\347\257\207.md" "b/problems/\345\212\250\346\200\201\350\247\204\345\210\222-\350\202\241\347\245\250\351\227\256\351\242\230\346\200\273\347\273\223\347\257\207.md" index ff16db367d..e630eb4437 100644 --- "a/problems/\345\212\250\346\200\201\350\247\204\345\210\222-\350\202\241\347\245\250\351\227\256\351\242\230\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/\345\212\250\346\200\201\350\247\204\345\210\222-\350\202\241\347\245\250\351\227\256\351\242\230\346\200\273\347\273\223\347\257\207.md" @@ -72,8 +72,8 @@ public: } }; ``` -* 时间复杂度:O(n) -* 空间复杂度:O(n) +* 时间复杂度:$O(n)$ +* 空间复杂度:$O(n)$ 使用滚动数组,代码如下: @@ -95,8 +95,8 @@ public: }; ``` -* 时间复杂度:O(n) -* 空间复杂度:O(1) +* 时间复杂度:$O(n)$ +* 空间复杂度:$O(1)$ ## 买卖股票的最佳时机II @@ -120,8 +120,9 @@ public: } }; ``` -* 时间复杂度O(n) -* 空间复杂度O(1) + +* 时间复杂度:$O(n)$ +* 空间复杂度:$O(1)$ 【动态规划】 @@ -161,8 +162,8 @@ public: }; ``` -* 时间复杂度:O(n) -* 空间复杂度:O(n) +* 时间复杂度:$O(n)$ +* 空间复杂度:$O(n)$ ## 买卖股票的最佳时机III @@ -223,8 +224,8 @@ public: }; ``` -* 时间复杂度:O(n) -* 空间复杂度:O(n * 5) +* 时间复杂度:$O(n)$ +* 空间复杂度:$O(n × 5)$ 当然,大家可以看到力扣官方题解里的一种优化空间写法,我这里给出对应的C++版本: @@ -248,8 +249,8 @@ public: }; ``` -* 时间复杂度:O(n) -* 空间复杂度:O(1) +* 时间复杂度:$O(n)$ +* 空间复杂度:$O(1)$ **这种写法看上去简单,其实思路很绕,不建议大家这么写,这么思考,很容易把自己绕进去!** 对于本题,把版本一的写法研究明白,足以! @@ -401,8 +402,8 @@ public: }; ``` -* 时间复杂度:O(n) -* 空间复杂度:O(n) +* 时间复杂度:$O(n)$ +* 空间复杂度:$O(n)$ ## 买卖股票的最佳时机含手续费 @@ -453,8 +454,8 @@ public: }; ``` -* 时间复杂度:O(n) -* 空间复杂度:O(n) +* 时间复杂度:$O(n)$ +* 空间复杂度:$O(n)$ ## 总结 diff --git "a/problems/\345\217\214\346\214\207\351\222\210\346\200\273\347\273\223.md" "b/problems/\345\217\214\346\214\207\351\222\210\346\200\273\347\273\223.md" index 72ec7b4ed9..68be65ef56 100644 --- "a/problems/\345\217\214\346\214\207\351\222\210\346\200\273\347\273\223.md" +++ "b/problems/\345\217\214\346\214\207\351\222\210\346\200\273\347\273\223.md" @@ -22,7 +22,7 @@ for (int i = 0; i < array.size(); i++) { } ``` -这个代码看上去好像是O(n)的时间复杂度,其实是O(n^2)的时间复杂度,因为erase操作也是O(n)的操作。 +这个代码看上去好像是$O(n)$的时间复杂度,其实是$O(n^2)$的时间复杂度,因为erase操作也是$O(n)$的操作。 所以此时使用双指针法才展现出效率的优势:**通过两个指针在一个for循环下完成两个for循环的工作。** @@ -30,7 +30,7 @@ for (int i = 0; i < array.size(); i++) { 在[字符串:这道题目,使用库函数一行代码搞定](https://programmercarl.com/0344.反转字符串.html)中讲解了反转字符串,注意这里强调要原地反转,要不然就失去了题目的意义。 -使用双指针法,**定义两个指针(也可以说是索引下标),一个从字符串前面,一个从字符串后面,两个指针同时向中间移动,并交换元素。**,时间复杂度是O(n)。 +使用双指针法,**定义两个指针(也可以说是索引下标),一个从字符串前面,一个从字符串后面,两个指针同时向中间移动,并交换元素。**,时间复杂度是$O(n)$。 在[替换空格](https://programmercarl.com/剑指Offer05.替换空格.html) 中介绍使用双指针填充字符串的方法,如果想把这道题目做到极致,就不要只用额外的辅助空间了! @@ -38,13 +38,13 @@ for (int i = 0; i < array.size(); i++) { 有同学问了,为什么要从后向前填充,从前向后填充不行么? -从前向后填充就是O(n^2)的算法了,因为每次添加元素都要将添加元素之后的所有元素向后移动。 +从前向后填充就是$O(n^2)$的算法了,因为每次添加元素都要将添加元素之后的所有元素向后移动。 **其实很多数组(字符串)填充类的问题,都可以先预先给数组扩容带填充后的大小,然后在从后向前进行操作。** -那么在[字符串:花式反转还不够!](https://programmercarl.com/0151.翻转字符串里的单词.html)中,我们使用双指针法,用O(n)的时间复杂度完成字符串删除类的操作,因为题目要产出冗余空格。 +那么在[字符串:花式反转还不够!](https://programmercarl.com/0151.翻转字符串里的单词.html)中,我们使用双指针法,用$O(n)$的时间复杂度完成字符串删除类的操作,因为题目要产出冗余空格。 -**在删除冗余空格的过程中,如果不注意代码效率,很容易写成了O(n^2)的时间复杂度。其实使用双指针法O(n)就可以搞定。** +**在删除冗余空格的过程中,如果不注意代码效率,很容易写成了$O(n^2)$的时间复杂度。其实使用双指针法$O(n)$就可以搞定。** **主要还是大家用erase用的比较随意,一定要注意for循环下用erase的情况,一般可以用双指针写效率更高!** @@ -74,22 +74,22 @@ for (int i = 0; i < array.size(); i++) { 去重的过程不好处理,有很多小细节,如果在面试中很难想到位。 -时间复杂度可以做到O(n^2),但还是比较费时的,因为不好做剪枝操作。 +时间复杂度可以做到$O(n^2)$,但还是比较费时的,因为不好做剪枝操作。 所以这道题目使用双指针法才是最为合适的,用双指针做这道题目才能就能真正体会到,**通过前后两个指针不算向中间逼近,在一个for循环下完成两个for循环的工作。** -只用双指针法时间复杂度为O(n^2),但比哈希法的O(n^2)效率高得多,哈希法在使用两层for循环的时候,能做的剪枝操作很有限。 +只用双指针法时间复杂度为$O(n^2)$,但比哈希法的$O(n^2)$效率高得多,哈希法在使用两层for循环的时候,能做的剪枝操作很有限。 在[双指针法:一样的道理,能解决四数之和](https://programmercarl.com/0018.四数之和.html)中,讲到了四数之和,其实思路是一样的,**在三数之和的基础上再套一层for循环,依然是使用双指针法。** -对于三数之和使用双指针法就是将原本暴力O(n^3)的解法,降为O(n^2)的解法,四数之和的双指针解法就是将原本暴力O(n^4)的解法,降为O(n^3)的解法。 +对于三数之和使用双指针法就是将原本暴力$O(n^3)$的解法,降为$O(n^2)$的解法,四数之和的双指针解法就是将原本暴力$O(n^4)$的解法,降为$O(n^3)$的解法。 同样的道理,五数之和,n数之和都是在这个基础上累加。 # 总结 -本文中一共介绍了leetcode上九道使用双指针解决问题的经典题目,除了链表一些题目一定要使用双指针,其他题目都是使用双指针来提高效率,一般是将O(n^2)的时间复杂度,降为O(n)。 +本文中一共介绍了leetcode上九道使用双指针解决问题的经典题目,除了链表一些题目一定要使用双指针,其他题目都是使用双指针来提高效率,一般是将$O(n^2)$的时间复杂度,降为$O(n)$。 建议大家可以把文中涉及到的题目在好好做一做,琢磨琢磨,基本对双指针法就不在话下了。 diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20200927\344\272\214\345\217\211\346\240\221\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20200927\344\272\214\345\217\211\346\240\221\345\221\250\346\234\253\346\200\273\347\273\223.md" index ff8f67d47d..60f0220541 100644 --- "a/problems/\345\221\250\346\200\273\347\273\223/20200927\344\272\214\345\217\211\346\240\221\345\221\250\346\234\253\346\200\273\347\273\223.md" +++ "b/problems/\345\221\250\346\200\273\347\273\223/20200927\344\272\214\345\217\211\346\240\221\345\221\250\346\234\253\346\200\273\347\273\223.md" @@ -44,7 +44,7 @@ a->right = NULL; 在介绍前中后序遍历的时候,有递归和迭代(非递归),还有一种牛逼的遍历方式:morris遍历。 -morris遍历是二叉树遍历算法的超强进阶算法,morris遍历可以将非递归遍历中的空间复杂度降为O(1),感兴趣大家就去查一查学习学习,比较小众,面试几乎不会考。我其实也没有研究过,就不做过多介绍了。 +morris遍历是二叉树遍历算法的超强进阶算法,morris遍历可以将非递归遍历中的空间复杂度降为$O(1)$,感兴趣大家就去查一查学习学习,比较小众,面试几乎不会考。我其实也没有研究过,就不做过多介绍了。 ## 周二 diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20201112\345\233\236\346\272\257\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20201112\345\233\236\346\272\257\345\221\250\346\234\253\346\200\273\347\273\223.md" index 3d019cf2d1..f363b9f7f1 100644 --- "a/problems/\345\221\250\346\200\273\347\273\223/20201112\345\233\236\346\272\257\345\221\250\346\234\253\346\200\273\347\273\223.md" +++ "b/problems/\345\221\250\346\200\273\347\273\223/20201112\345\233\236\346\272\257\345\221\250\346\234\253\346\200\273\347\273\223.md" @@ -72,16 +72,16 @@ **所以这块就说一说我个人理解,对内容持开放态度,集思广益,欢迎大家来讨论!** 子集问题分析: -* 时间复杂度:O(n * 2^n),因为每一个元素的状态无外乎取与不取,所以时间复杂度为O(2^n),构造每一组子集都需要填进数组,又有需要O(n),最终时间复杂度:O(n * 2^n) -* 空间复杂度:O(n),递归深度为n,所以系统栈所用空间为O(n),每一层递归所用的空间都是常数级别,注意代码里的result和path都是全局变量,就算是放在参数里,传的也是引用,并不会新申请内存空间,最终空间复杂度为O(n) +* 时间复杂度:$O(n × 2^n)$,因为每一个元素的状态无外乎取与不取,所以时间复杂度为$O(2^n)$,构造每一组子集都需要填进数组,又有需要$O(n)$,最终时间复杂度:$O(n × 2^n)$ +* 空间复杂度:$O(n)$,递归深度为n,所以系统栈所用空间为$O(n)$,每一层递归所用的空间都是常数级别,注意代码里的result和path都是全局变量,就算是放在参数里,传的也是引用,并不会新申请内存空间,最终空间复杂度为$O(n)$ 排列问题分析: -* 时间复杂度:O(n!),这个可以从排列的树形图中很明显发现,每一层节点为n,第二层每一个分支都延伸了n-1个分支,再往下又是n-2个分支,所以一直到叶子节点一共就是 n * n-1 * n-2 * ..... 1 = n!。 -* 空间复杂度:O(n),和子集问题同理。 +* 时间复杂度:$O(n!)$,这个可以从排列的树形图中很明显发现,每一层节点为n,第二层每一个分支都延伸了n-1个分支,再往下又是n-2个分支,所以一直到叶子节点一共就是 n * n-1 * n-2 * ..... 1 = n!。 +* 空间复杂度:$O(n)$,和子集问题同理。 组合问题分析: -* 时间复杂度:O(n * 2^n),组合问题其实就是一种子集的问题,所以组合问题最坏的情况,也不会超过子集问题的时间复杂度。 -* 空间复杂度:O(n),和子集问题同理。 +* 时间复杂度:$O(n × 2^n)$,组合问题其实就是一种子集的问题,所以组合问题最坏的情况,也不会超过子集问题的时间复杂度。 +* 空间复杂度:$O(n)$,和子集问题同理。 **一般说道回溯算法的复杂度,都说是指数级别的时间复杂度,这也算是一个概括吧!** diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20201126\350\264\252\345\277\203\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20201126\350\264\252\345\277\203\345\221\250\346\234\253\346\200\273\347\273\223.md" index 5671cdbdc1..02fccc25e0 100644 --- "a/problems/\345\221\250\346\200\273\347\273\223/20201126\350\264\252\345\277\203\345\221\250\346\234\253\346\200\273\347\273\223.md" +++ "b/problems/\345\221\250\346\200\273\347\273\223/20201126\350\264\252\345\277\203\345\221\250\346\234\253\346\200\273\347\273\223.md" @@ -41,7 +41,7 @@ 一些录友不清楚[贪心算法:分发饼干](https://programmercarl.com/0455.分发饼干.html)中时间复杂度是怎么来的? -就是快排O(nlogn),遍历O(n),加一起就是还是O(nlogn)。 +就是快排$O(n\log n)$,遍历$O(n)$,加一起就是还是$O(n\log n)$。 ## 周三 diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20201203\350\264\252\345\277\203\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20201203\350\264\252\345\277\203\345\221\250\346\234\253\346\200\273\347\273\223.md" index 23b0b7cf25..10e2d1bb50 100644 --- "a/problems/\345\221\250\346\200\273\347\273\223/20201203\350\264\252\345\277\203\345\221\250\346\234\253\346\200\273\347\273\223.md" +++ "b/problems/\345\221\250\346\200\273\347\273\223/20201203\350\264\252\345\277\203\345\221\250\346\234\253\346\200\273\347\273\223.md" @@ -79,7 +79,7 @@ [贪心算法:K次取反后最大化的数组和](https://programmercarl.com/1005.K次取反后最大化的数组和.html)中的代码,最后while处理K的时候,其实直接判断奇偶数就可以了,文中给出的方式太粗暴了,哈哈,Carl大意了。 -例外一位录友留言给出一个很好的建议,因为文中是使用快排,仔细看题,**题目中限定了数据范围是正负一百,所以可以使用桶排序**,这样时间复杂度就可以优化为O(n)了。但可能代码要复杂一些了。 +例外一位录友留言给出一个很好的建议,因为文中是使用快排,仔细看题,**题目中限定了数据范围是正负一百,所以可以使用桶排序**,这样时间复杂度就可以优化为$O(n)$了。但可能代码要复杂一些了。 ## 总结 diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20201210\345\244\215\346\235\202\345\272\246\345\210\206\346\236\220\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20201210\345\244\215\346\235\202\345\272\246\345\210\206\346\236\220\345\221\250\346\234\253\346\200\273\347\273\223.md" index 02bfbd8324..1b404bf060 100644 --- "a/problems/\345\221\250\346\200\273\347\273\223/20201210\345\244\215\346\235\202\345\272\246\345\210\206\346\236\220\345\221\250\346\234\253\346\200\273\347\273\223.md" +++ "b/problems/\345\221\250\346\200\273\347\273\223/20201210\345\244\215\346\235\202\345\272\246\345\210\206\346\236\220\345\221\250\346\234\253\346\200\273\347\273\223.md" @@ -53,11 +53,11 @@ 文中涉及如下问题: -* 究竟什么是大O?大O表示什么意思?严格按照大O的定义来说,快排应该是O(n^2)的算法! -* O(n^2)的算法为什么有时候比O(n)的算法更优? +* 究竟什么是大O?大O表示什么意思?严格按照大O的定义来说,快排应该是$O(n^2)$的算法! +* $O(n^2)$的算法为什么有时候比$O(n)$的算法更优? * 什么时间复杂度为什么可以忽略常数项? * 如何简化复杂的时间复杂度表达式,原理是什么? -* O(logn)中的log究竟是以谁为底? +* $O(\log n)$中的log究竟是以谁为底? 这些问题大家可能懵懵懂懂的了解一些,但一细问又答不上来。 @@ -70,9 +70,9 @@ # 周三 -在[O(n)的算法居然超时了,此时的n究竟是多大?](https://programmercarl.com/前序/On的算法居然超时了,此时的n究竟是多大?.html)中介绍了大家在leetcode上提交代码经常遇到的一个问题-超时! +在[$O(n)$的算法居然超时了,此时的n究竟是多大?](https://programmercarl.com/前序/On的算法居然超时了,此时的n究竟是多大?.html)中介绍了大家在leetcode上提交代码经常遇到的一个问题-超时! -估计很多录友知道算法超时了,但没有注意过 O(n)的算法,如果1s内出结果,这个n究竟是多大? +估计很多录友知道算法超时了,但没有注意过 $O(n)$的算法,如果1s内出结果,这个n究竟是多大? 文中从计算机硬件出发,分析计算机的计算性能,然后亲自做实验,整理出数据如下: @@ -95,7 +95,7 @@ 文中给出了四个版本的代码实现,并逐一分析了其时间复杂度。 -此时大家就会发现,同一道题目,同样使用递归算法,有的同学会写出了O(n)的代码,有的同学就写出了O(logn)的代码。 +此时大家就会发现,同一道题目,同样使用递归算法,有的同学会写出了$O(n)$的代码,有的同学就写出了$O(\log n)$的代码。 其本质是要对递归的时间复杂度有清晰的认识,才能运用递归来有效的解决问题! diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20201217\350\264\252\345\277\203\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20201217\350\264\252\345\277\203\345\221\250\346\234\253\346\200\273\347\273\223.md" index 4d12f92a88..e9d22d6e22 100644 --- "a/problems/\345\221\250\346\200\273\347\273\223/20201217\350\264\252\345\277\203\345\221\250\346\234\253\346\200\273\347\273\223.md" +++ "b/problems/\345\221\250\346\200\273\347\273\223/20201217\350\264\252\345\277\203\345\221\250\346\234\253\346\200\273\347\273\223.md" @@ -8,7 +8,7 @@ 在[贪心算法:加油站](https://programmercarl.com/0134.加油站.html)中给出每一个加油站的汽油和开到这个加油站的消耗,问汽车能不能开一圈。 -这道题目咋眼一看,感觉是一道模拟题,模拟一下汽车从每一个节点出发看看能不能开一圈,时间复杂度是O(n^2)。 +这道题目咋眼一看,感觉是一道模拟题,模拟一下汽车从每一个节点出发看看能不能开一圈,时间复杂度是$O(n^2)$。 即使用模拟这种情况,也挺考察代码技巧的。 diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20210225\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20210225\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" index ae8b480024..4ea92266e3 100644 --- "a/problems/\345\221\250\346\200\273\347\273\223/20210225\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" +++ "b/problems/\345\221\250\346\200\273\347\273\223/20210225\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" @@ -211,8 +211,8 @@ public: }; ``` -* 时间复杂度:O(n^2) -* 空间复杂度:O(1) +* 时间复杂度:$O(n^2)$ +* 空间复杂度:$O(1)$ 贪心解法代码如下: @@ -232,8 +232,9 @@ public: } }; ``` -* 时间复杂度:O(n) -* 空间复杂度:O(1) + +* 时间复杂度:$O(n)$ +* 空间复杂度:$O(1)$ 动规解法,版本一,代码如下: @@ -254,8 +255,9 @@ public: } }; ``` -* 时间复杂度:O(n) -* 空间复杂度:O(n) + +* 时间复杂度:$O(n)$ +* 空间复杂度:$O(n)$ 从递推公式可以看出,dp[i]只是依赖于dp[i - 1]的状态。 @@ -280,8 +282,8 @@ public: }; ``` -* 时间复杂度:O(n) -* 空间复杂度:O(1) +* 时间复杂度:$O(n)$ +* 空间复杂度:$O(1)$ 建议先写出版本一,然后在版本一的基础上优化成版本二,而不是直接就写出版本二。 diff --git "a/problems/\345\221\250\346\200\273\347\273\223/\344\272\214\345\217\211\346\240\221\351\230\266\346\256\265\346\200\273\347\273\223\347\263\273\345\210\227\344\270\200.md" "b/problems/\345\221\250\346\200\273\347\273\223/\344\272\214\345\217\211\346\240\221\351\230\266\346\256\265\346\200\273\347\273\223\347\263\273\345\210\227\344\270\200.md" index 595f367d4d..f65f549705 100644 --- "a/problems/\345\221\250\346\200\273\347\273\223/\344\272\214\345\217\211\346\240\221\351\230\266\346\256\265\346\200\273\347\273\223\347\263\273\345\210\227\344\270\200.md" +++ "b/problems/\345\221\250\346\200\273\347\273\223/\344\272\214\345\217\211\346\240\221\351\230\266\346\256\265\346\200\273\347\273\223\347\263\273\345\210\227\344\270\200.md" @@ -49,7 +49,7 @@ a->right = NULL; 在介绍前中后序遍历的时候,有递归和迭代(非递归),还有一种牛逼的遍历方式:morris遍历。 -morris遍历是二叉树遍历算法的超强进阶算法,morris遍历可以将非递归遍历中的空间复杂度降为O(1),感兴趣大家就去查一查学习学习,比较小众,面试几乎不会考。我其实也没有研究过,就不做过多介绍了。 +morris遍历是二叉树遍历算法的超强进阶算法,morris遍历可以将非递归遍历中的空间复杂度降为$O(1)$,感兴趣大家就去查一查学习学习,比较小众,面试几乎不会考。我其实也没有研究过,就不做过多介绍了。 ## [二叉树的递归遍历](https://programmercarl.com/二叉树的递归遍历.html) diff --git "a/problems/\345\223\210\345\270\214\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\345\223\210\345\270\214\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" index f59d341f50..646429548f 100644 --- "a/problems/\345\223\210\345\270\214\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\345\223\210\345\270\214\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -22,7 +22,7 @@ 例如要查询一个名字是否在这所学校里。 -要枚举的话时间复杂度是O(n),但如果使用哈希表的话, 只需要O(1) 就可以做到。 +要枚举的话时间复杂度是$O(n)$,但如果使用哈希表的话, 只需要$O(1)$就可以做到。 我们只需要初始化把这所学校里学生的名字都存在哈希表里,在查询的时候通过索引直接就可以知道这位同学在不在这所学校里了。 @@ -88,17 +88,17 @@ |集合 |底层实现 | 是否有序 |数值是否可以重复 | 能否更改数值|查询效率 |增删效率| |---|---| --- |---| --- | --- | ---| -|std::set |红黑树 |有序 |否 |否 | O(logn)|O(logn) | -|std::multiset | 红黑树|有序 |是 | 否| O(logn) |O(logn) | -|std::unordered_set |哈希表 |无序 |否 |否 |O(1) | O(1)| +|std::set |红黑树 |有序 |否 |否 | $O(\log n)$|$O(\log n)$ | +|std::multiset | 红黑树|有序 |是 | 否| $O(\log n)$ |$O(\log n)$ | +|std::unordered_set |哈希表 |无序 |否 |否 |$O(1)$ | $O(1)$| std::unordered_set底层实现为哈希表,std::set 和std::multiset 的底层实现是红黑树,红黑树是一种平衡二叉搜索树,所以key值是有序的,但key不可以修改,改动key值会导致整棵树的错乱,所以只能删除和增加。 |映射 |底层实现 | 是否有序 |数值是否可以重复 | 能否更改数值|查询效率 |增删效率| |---|---| --- |---| --- | --- | ---| -|std::map |红黑树 |key有序 |key不可重复 |key不可修改 | O(logn)|O(logn) | -|std::multimap | 红黑树|key有序 | key可重复 | key不可修改|O(logn) |O(logn) | -|std::unordered_map |哈希表 | key无序 |key不可重复 |key不可修改 |O(1) | O(1)| +|std::map |红黑树 |key有序 |key不可重复 |key不可修改 | $O(\log n)$|$O(\log n)$ | +|std::multimap | 红黑树|key有序 | key可重复 | key不可修改|$O(\log n)$ |$O(\log n)$ | +|std::unordered_map |哈希表 | key无序 |key不可重复 |key不可修改 |$O(1)$ | $O(1)$| std::unordered_map 底层实现为哈希表,std::map 和std::multimap 的底层实现是红黑树。同理,std::map 和std::multimap 的key也是有序的(这个问题也经常作为面试题,考察对语言容器底层的理解)。 diff --git "a/problems/\345\233\236\346\272\257\346\200\273\347\273\223.md" "b/problems/\345\233\236\346\272\257\346\200\273\347\273\223.md" index 7f8a312f8d..424d6947e7 100644 --- "a/problems/\345\233\236\346\272\257\346\200\273\347\273\223.md" +++ "b/problems/\345\233\236\346\272\257\346\200\273\347\273\223.md" @@ -302,11 +302,11 @@ if (startIndex >= nums.size()) { // 终止条件可以不加 **而使用used数组在时间复杂度上几乎没有额外负担!** -**使用set去重,不仅时间复杂度高了,空间复杂度也高了**,在[本周小结!(回溯算法系列三)](https://programmercarl.com/周总结/20201112回溯周末总结.html)中分析过,组合,子集,排列问题的空间复杂度都是O(n),但如果使用set去重,空间复杂度就变成了O(n^2),因为每一层递归都有一个set集合,系统栈空间是n,每一个空间都有set集合。 +**使用set去重,不仅时间复杂度高了,空间复杂度也高了**,在[本周小结!(回溯算法系列三)](https://programmercarl.com/周总结/20201112回溯周末总结.html)中分析过,组合,子集,排列问题的空间复杂度都是$O(n)$,但如果使用set去重,空间复杂度就变成了$O(n^2)$,因为每一层递归都有一个set集合,系统栈空间是n,每一个空间都有set集合。 -那有同学可能疑惑 用used数组也是占用O(n)的空间啊? +那有同学可能疑惑 用used数组也是占用$O(n)$的空间啊? -used数组可是全局变量,每层与每层之间公用一个used数组,所以空间复杂度是O(n + n),最终空间复杂度还是O(n)。 +used数组可是全局变量,每层与每层之间公用一个used数组,所以空间复杂度是$O(n + n)$,最终空间复杂度还是$O(n)$。 # 重新安排行程(图论额外拓展) @@ -380,24 +380,24 @@ used数组可是全局变量,每层与每层之间公用一个used数组,所 以下在计算空间复杂度的时候我都把系统栈(不是数据结构里的栈)所占空间算进去。 子集问题分析: -* 时间复杂度:O(2^n),因为每一个元素的状态无外乎取与不取,所以时间复杂度为O(2^n) -* 空间复杂度:O(n),递归深度为n,所以系统栈所用空间为O(n),每一层递归所用的空间都是常数级别,注意代码里的result和path都是全局变量,就算是放在参数里,传的也是引用,并不会新申请内存空间,最终空间复杂度为O(n) +* 时间复杂度:$O(2^n)$,因为每一个元素的状态无外乎取与不取,所以时间复杂度为$O(2^n)$ +* 空间复杂度:$O(n)$,递归深度为n,所以系统栈所用空间为$O(n)$,每一层递归所用的空间都是常数级别,注意代码里的result和path都是全局变量,就算是放在参数里,传的也是引用,并不会新申请内存空间,最终空间复杂度为$O(n)$ 排列问题分析: -* 时间复杂度:O(n!),这个可以从排列的树形图中很明显发现,每一层节点为n,第二层每一个分支都延伸了n-1个分支,再往下又是n-2个分支,所以一直到叶子节点一共就是 n * n-1 * n-2 * ..... 1 = n!。 -* 空间复杂度:O(n),和子集问题同理。 +* 时间复杂度:$O(n!)$,这个可以从排列的树形图中很明显发现,每一层节点为n,第二层每一个分支都延伸了n-1个分支,再往下又是n-2个分支,所以一直到叶子节点一共就是 n * n-1 * n-2 * ..... 1 = n!。 +* 空间复杂度:$O(n)$,和子集问题同理。 组合问题分析: -* 时间复杂度:O(2^n),组合问题其实就是一种子集的问题,所以组合问题最坏的情况,也不会超过子集问题的时间复杂度。 -* 空间复杂度:O(n),和子集问题同理。 +* 时间复杂度:$O(2^n)$,组合问题其实就是一种子集的问题,所以组合问题最坏的情况,也不会超过子集问题的时间复杂度。 +* 空间复杂度:$O(n)$,和子集问题同理。 N皇后问题分析: -* 时间复杂度:O(n!) ,其实如果看树形图的话,直觉上是O(n^n),但皇后之间不能见面所以在搜索的过程中是有剪枝的,最差也就是O(n!),n!表示n * (n-1) * .... * 1。 -* 空间复杂度:O(n),和子集问题同理。 +* 时间复杂度:$O(n!)$ ,其实如果看树形图的话,直觉上是$O(n^n)$,但皇后之间不能见面所以在搜索的过程中是有剪枝的,最差也就是O(n!),n!表示n * (n-1) * .... * 1。 +* 空间复杂度:$O(n)$,和子集问题同理。 解数独问题分析: -* 时间复杂度:O(9^m) , m是'.'的数目。 -* 空间复杂度:O(n^2),递归的深度是n^2 +* 时间复杂度:$O(9^m)$ , m是'.'的数目。 +* 空间复杂度:$O(n^2)$,递归的深度是n^2 **一般说道回溯算法的复杂度,都说是指数级别的时间复杂度,这也算是一个概括吧!** diff --git "a/problems/\345\233\236\346\272\257\347\256\227\346\263\225\345\216\273\351\207\215\351\227\256\351\242\230\347\232\204\345\217\246\344\270\200\347\247\215\345\206\231\346\263\225.md" "b/problems/\345\233\236\346\272\257\347\256\227\346\263\225\345\216\273\351\207\215\351\227\256\351\242\230\347\232\204\345\217\246\344\270\200\347\247\215\345\206\231\346\263\225.md" index 99fff63065..d79f985ac6 100644 --- "a/problems/\345\233\236\346\272\257\347\256\227\346\263\225\345\216\273\351\207\215\351\227\256\351\242\230\347\232\204\345\217\246\344\270\200\347\247\215\345\206\231\346\263\225.md" +++ "b/problems/\345\233\236\346\272\257\347\256\227\346\263\225\345\216\273\351\207\215\351\227\256\351\242\230\347\232\204\345\217\246\344\270\200\347\247\215\345\206\231\346\263\225.md" @@ -226,11 +226,11 @@ public: **而使用used数组在时间复杂度上几乎没有额外负担!** -**使用set去重,不仅时间复杂度高了,空间复杂度也高了**,在[本周小结!(回溯算法系列三)](https://programmercarl.com/周总结/20201112回溯周末总结.html)中分析过,组合,子集,排列问题的空间复杂度都是O(n),但如果使用set去重,空间复杂度就变成了O(n^2),因为每一层递归都有一个set集合,系统栈空间是n,每一个空间都有set集合。 +**使用set去重,不仅时间复杂度高了,空间复杂度也高了**,在[本周小结!(回溯算法系列三)](https://programmercarl.com/周总结/20201112回溯周末总结.html)中分析过,组合,子集,排列问题的空间复杂度都是$O(n)$,但如果使用set去重,空间复杂度就变成了$O(n^2)$,因为每一层递归都有一个set集合,系统栈空间是n,每一个空间都有set集合。 -那有同学可能疑惑 用used数组也是占用O(n)的空间啊? +那有同学可能疑惑 用used数组也是占用$O(n)$的空间啊? -used数组可是全局变量,每层与每层之间公用一个used数组,所以空间复杂度是O(n + n),最终空间复杂度还是O(n)。 +used数组可是全局变量,每层与每层之间公用一个used数组,所以空间复杂度是$O(n + n)$,最终空间复杂度还是$O(n)$。 ## 总结 diff --git "a/problems/\345\255\227\347\254\246\344\270\262\346\200\273\347\273\223.md" "b/problems/\345\255\227\347\254\246\344\270\262\346\200\273\347\273\223.md" index ed637f5cb3..46df61fe76 100644 --- "a/problems/\345\255\227\347\254\246\344\270\262\346\200\273\347\273\223.md" +++ "b/problems/\345\255\227\347\254\246\344\270\262\346\200\273\347\273\223.md" @@ -57,15 +57,15 @@ for (int i = 0; i < a.size(); i++) { 在[344.反转字符串](https://programmercarl.com/0344.反转字符串.html) ,我们使用双指针法实现了反转字符串的操作,**双指针法在数组,链表和字符串中很常用。** -接着在[字符串:替换空格](https://programmercarl.com/剑指Offer05.替换空格.html),同样还是使用双指针法在时间复杂度O(n)的情况下完成替换空格。 +接着在[字符串:替换空格](https://programmercarl.com/剑指Offer05.替换空格.html),同样还是使用双指针法在时间复杂度$O(n)$的情况下完成替换空格。 **其实很多数组填充类的问题,都可以先预先给数组扩容带填充后的大小,然后在从后向前进行操作。** 那么针对数组删除操作的问题,其实在[27. 移除元素](https://programmercarl.com/0027.移除元素.html)中就已经提到了使用双指针法进行移除操作。 -同样的道理在[151.翻转字符串里的单词](https://programmercarl.com/0151.翻转字符串里的单词.html)中我们使用O(n)的时间复杂度,完成了删除冗余空格。 +同样的道理在[151.翻转字符串里的单词](https://programmercarl.com/0151.翻转字符串里的单词.html)中我们使用$O(n)$的时间复杂度,完成了删除冗余空格。 -一些同学会使用for循环里调用库函数erase来移除元素,这其实是O(n^2)的操作,因为erase就是O(n)的操作,所以这也是典型的不知道库函数的时间复杂度,上来就用的案例了。 +一些同学会使用for循环里调用库函数erase来移除元素,这其实是$O(n^2)$的操作,因为erase就是$O(n)$的操作,所以这也是典型的不知道库函数的时间复杂度,上来就用的案例了。 # 反转系列 diff --git "a/problems/\346\225\260\347\273\204\346\200\273\347\273\223\347\257\207.md" "b/problems/\346\225\260\347\273\204\346\200\273\347\273\223\347\257\207.md" index 8d52db2692..39f9aa5eea 100644 --- "a/problems/\346\225\260\347\273\204\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/\346\225\260\347\273\204\346\200\273\347\273\223\347\257\207.md" @@ -67,8 +67,8 @@ 可以使用暴力解法,通过这道题目,如果追求更优的算法,建议试一试用二分法,来解决这道题目 -暴力解法时间复杂度:O(n) -二分法时间复杂度:O(logn) +* 暴力解法时间复杂度:$O(n)$ +* 二分法时间复杂度:$O(\log n)$ 在这道题目中我们讲到了**循环不变量原则**,只有在循环中坚持对区间的定义,才能清楚的把握循环中的各种细节。 @@ -81,8 +81,8 @@ 双指针法(快慢指针法):**通过一个快指针和慢指针在一个for循环下完成两个for循环的工作。** -暴力解法时间复杂度:O(n^2) -双指针时间复杂度:O(n) +* 暴力解法时间复杂度:$O(n^2)$ +* 双指针时间复杂度:$O(n)$ 这道题目迷惑了不少同学,纠结于数组中的元素为什么不能删除,主要是因为以下两点: @@ -97,12 +97,12 @@ 本题介绍了数组操作中的另一个重要思想:滑动窗口。 -暴力解法时间复杂度:O(n^2) -滑动窗口时间复杂度:O(n) +* 暴力解法时间复杂度:$O(n^2)$ +* 滑动窗口时间复杂度:$O(n)$ 本题中,主要要理解滑动窗口如何移动 窗口起始位置,达到动态更新窗口大小的,从而得出长度最小的符合条件的长度。 -**滑动窗口的精妙之处在于根据当前子序列和大小的情况,不断调节子序列的起始位置。从而将O(n^2)的暴力解法降为O(n)。** +**滑动窗口的精妙之处在于根据当前子序列和大小的情况,不断调节子序列的起始位置。从而将$O(n^2)$的暴力解法降为$O(n)$。** 如果没有接触过这一类的方法,很难想到类似的解题思路,滑动窗口方法还是很巧妙的。 @@ -129,19 +129,5 @@ 最后,大家周末愉快! -## 其他语言版本 - - -Java: - - -Python: - - -Go: - - - - -----------------------
diff --git "a/problems/\346\240\210\344\270\216\351\230\237\345\210\227\346\200\273\347\273\223.md" "b/problems/\346\240\210\344\270\216\351\230\237\345\210\227\346\200\273\347\273\223.md" index 2faa27c45f..485d0cf67f 100644 --- "a/problems/\346\240\210\344\270\216\351\230\237\345\210\227\346\200\273\347\273\223.md" +++ "b/problems/\346\240\210\344\270\216\351\230\237\345\210\227\346\200\273\347\273\223.md" @@ -141,7 +141,7 @@ cd a/b/c/../../ 本题就要**使用优先级队列来对部分频率进行排序。** 注意这里是对部分数据进行排序而不需要对所有数据排序! -所以排序的过程的时间复杂度是O(logk),整个算法的时间复杂度是O(nlogk)。 +所以排序的过程的时间复杂度是$O(\log k)$,整个算法的时间复杂度是$O(n\log k)$。 # 总结 diff --git "a/problems/\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227\357\274\210vector\345\216\237\347\220\206\350\256\262\350\247\243\357\274\211.md" "b/problems/\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227\357\274\210vector\345\216\237\347\220\206\350\256\262\350\247\243\357\274\211.md" index b2a9cf3a55..09fe64768a 100644 --- "a/problems/\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227\357\274\210vector\345\216\237\347\220\206\350\256\262\350\247\243\357\274\211.md" +++ "b/problems/\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227\357\274\210vector\345\216\237\347\220\206\350\256\262\350\247\243\357\274\211.md" @@ -33,7 +33,7 @@ public: 耗时如下: ![vectorinsert](https://img-blog.csdnimg.cn/20201218203611181.png) -其直观上来看数组的insert操作是O(n)的,整体代码的时间复杂度是O(n^2)。 +其直观上来看数组的insert操作是$O(n)$的,整体代码的时间复杂度是$O(n^2)$。 这么一分析好像和版本二链表实现的时间复杂度是一样的啊,为什么提交之后效率会差距这么大呢? ```CPP @@ -97,7 +97,7 @@ for (int i = 0; i < vec.size(); i++) { **同时也注意此时capicity和size的变化,关键的地方我都标红了**。 -而在[贪心算法:根据身高重建队列](https://programmercarl.com/0406.根据身高重建队列.html)中,我们使用vector来做insert的操作,此时大家可会发现,**虽然表面上复杂度是O(n^2),但是其底层都不知道额外做了多少次全量拷贝了,所以算上vector的底层拷贝,整体时间复杂度可以认为是O(n^2 + t * n)级别的,t是底层拷贝的次数**。 +而在[贪心算法:根据身高重建队列](https://programmercarl.com/0406.根据身高重建队列.html)中,我们使用vector来做insert的操作,此时大家可会发现,**虽然表面上复杂度是$O(n^2)$,但是其底层都不知道额外做了多少次全量拷贝了,所以算上vector的底层拷贝,整体时间复杂度可以认为是$O(n^2 + t × n)$级别的,t是底层拷贝的次数**。 那么是不是可以直接确定好vector的大小,不让它在动态扩容了,例如在[贪心算法:根据身高重建队列](https://programmercarl.com/0406.根据身高重建队列.html)中已经给出了有people.size这么多的人,可以定义好一个固定大小的vector,这样我们就可以控制vector,不让它底层动态扩容。 @@ -133,7 +133,7 @@ public: ![vector手动模拟insert](https://img-blog.csdnimg.cn/20201218200626718.png) -这份代码就是不让vector动态扩容,全程我们自己模拟insert的操作,大家也可以直观的看出是一个O(n^2)的方法了。 +这份代码就是不让vector动态扩容,全程我们自己模拟insert的操作,大家也可以直观的看出是一个$O(n^2)$的方法了。 但这份代码在leetcode上统计的耗时甚至比版本一的还高,我们都不让它动态扩容了,为什么耗时更高了呢? @@ -151,7 +151,7 @@ public: 大家应该发现了,编程语言中一个普通容器的insert,delete的使用,都可能对写出来的算法的有很大影响! -如果抛开语言谈算法,除非从来不用代码写算法纯分析,**否则的话,语言功底不到位O(n)的算法可以写出O(n^2)的性能**,哈哈。 +如果抛开语言谈算法,除非从来不用代码写算法纯分析,**否则的话,语言功底不到位$O(n)$的算法可以写出$O(n^2)$的性能**,哈哈。 相信在这里学习算法的录友们,都是想在软件行业长远发展的,都是要从事编程的工作,那么一定要深耕好一门编程语言,这个非常重要! diff --git "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\210\267\345\212\233\346\211\243\347\224\250\344\270\215\347\224\250\345\272\223\345\207\275\346\225\260.md" "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\210\267\345\212\233\346\211\243\347\224\250\344\270\215\347\224\250\345\272\223\345\207\275\346\225\260.md" index 07db85641c..73f2a2d57e 100644 --- "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\210\267\345\212\233\346\211\243\347\224\250\344\270\215\347\224\250\345\272\223\345\207\275\346\225\260.md" +++ "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\210\267\345\212\233\346\211\243\347\224\250\344\270\215\347\224\250\345\272\223\345\207\275\346\225\260.md" @@ -27,7 +27,7 @@ 使用库函数最大的忌讳就是不知道这个库函数怎么实现的,也不知道其时间复杂度,上来就用,这样写出来的算法,时间复杂度自己都掌握不好的。 -例如for循环里套一个字符串的insert,erase之类的操作,你说时间复杂度是多少呢,很明显是O(n^2)的时间复杂度了。 +例如for循环里套一个字符串的insert,erase之类的操作,你说时间复杂度是多少呢,很明显是$O(n^2)$的时间复杂度了。 在刷题的时候本着我说的标准来使用库函数,详细对大家回有所帮助! diff --git "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" index 16be4c67ff..ae645d9301 100644 --- "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" +++ "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" @@ -40,7 +40,7 @@ leetcode上没有纯01背包的问题,都是01背包应用方面的题目, 这样其实是没有从底向上去思考,而是习惯性想到了背包,那么暴力的解法应该是怎么样的呢? -每一件物品其实只有两个状态,取或者不取,所以可以使用回溯法搜索出所有的情况,那么时间复杂度就是O(2^n),这里的n表示物品数量。 +每一件物品其实只有两个状态,取或者不取,所以可以使用回溯法搜索出所有的情况,那么时间复杂度就是$O(2^n)$,这里的n表示物品数量。 **所以暴力的解法是指数级别的时间复杂度。进而才需要动态规划的解法来进行优化!** diff --git "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\244\232\351\207\215\350\203\214\345\214\205.md" "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\244\232\351\207\215\350\203\214\345\214\205.md" index 5f62ccd6a7..1b24168b93 100644 --- "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\244\232\351\207\215\350\203\214\345\214\205.md" +++ "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\244\232\351\207\215\350\203\214\345\214\205.md" @@ -89,7 +89,7 @@ int main() { ``` -* 时间复杂度:O(m * n * k) m:物品种类个数,n背包容量,k单类物品数量 +* 时间复杂度:$O(m × n × k)$,m:物品种类个数,n背包容量,k单类物品数量 也有另一种实现方式,就是把每种商品遍历的个数放在01背包里面在遍历一遍。 @@ -125,7 +125,7 @@ int main() { } ``` -* 时间复杂度:O(m * n * k) m:物品种类个数,n背包容量,k单类物品数量 +* 时间复杂度:$O(m × n × k)$,m:物品种类个数,n背包容量,k单类物品数量 从代码里可以看出是01背包里面在加一个for循环遍历一个每种商品的数量。 和01背包还是如出一辙的。 diff --git "a/problems/\351\223\276\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\351\223\276\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" index 8891c6659e..500ff213af 100644 --- "a/problems/\351\223\276\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\351\223\276\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -70,7 +70,7 @@ 这里我给出C/C++的定义链表节点方式,如下所示: -``` +```cpp // 单链表 struct ListNode { int val; // 节点上存储的元素 @@ -85,13 +85,13 @@ struct ListNode { 通过自己定义构造函数初始化节点: -``` +```cpp ListNode* head = new ListNode(5); ``` 使用默认构造函数初始化节点: -``` +```cpp ListNode* head = new ListNode(); head->val = 5; ``` @@ -120,9 +120,9 @@ head->val = 5; ![链表-添加节点](https://img-blog.csdnimg.cn/20200806195134331.png) -可以看出链表的增添和删除都是O(1)操作,也不会影响到其他节点。 +可以看出链表的增添和删除都是$O(1)$操作,也不会影响到其他节点。 -但是要注意,要是删除第五个节点,需要从头节点查找到第四个节点通过next指针进行删除操作,查找的时间复杂度是O(n)。 +但是要注意,要是删除第五个节点,需要从头节点查找到第四个节点通过next指针进行删除操作,查找的时间复杂度是$O(n)$。 # 性能分析 From 05b7350eb23d5039a6d9501fdc83bfb6cacc1739 Mon Sep 17 00:00:00 2001 From: bqlin Date: Fri, 10 Dec 2021 21:00:40 +0800 Subject: [PATCH 0100/3019] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E5=A4=8D=E6=9D=82?= =?UTF-8?q?=E5=BA=A6=E5=85=AC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: bqlin --- .../0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" "b/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" index 6a2c3e1220..25dc7ad839 100644 --- "a/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" +++ "b/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" @@ -80,7 +80,7 @@ public: 那二叉树的节点个数就是 2^(m + n - 1) - 1。可以理解深搜的算法就是遍历了整个满二叉树(其实没有遍历整个满二叉树,只是近似而已) -所以上面深搜代码的时间复杂度为$O(2^(m + n - 1) - 1)$,可以看出,这是指数级别的时间复杂度,是非常大的。 +所以上面深搜代码的时间复杂度为$O(2^{m + n - 1} - 1)$,可以看出,这是指数级别的时间复杂度,是非常大的。 ### 动态规划 From 8614090773bf77964b350a31afac82752fd59234 Mon Sep 17 00:00:00 2001 From: jxxiao Date: Fri, 10 Dec 2021 21:46:15 +0800 Subject: [PATCH 0101/3019] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=200077.=E7=BB=84?= =?UTF-8?q?=E5=90=88=20python=E6=9C=AA=E5=89=AA=E6=9E=9D=E5=92=8C=E5=89=AA?= =?UTF-8?q?=E6=9E=9D=E4=BB=A3=E7=A0=81=E4=B8=80=E6=A0=B7=E7=9A=84=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/0077.\347\273\204\345\220\210.md" | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git "a/problems/0077.\347\273\204\345\220\210.md" "b/problems/0077.\347\273\204\345\220\210.md" index 16313cb880..edd9f393f5 100644 --- "a/problems/0077.\347\273\204\345\220\210.md" +++ "b/problems/0077.\347\273\204\345\220\210.md" @@ -405,7 +405,7 @@ class Solution: if len(path) == k: res.append(path[:]) return - for i in range(StartIndex, n-(k-len(path)) + 2): + for i in range(StartIndex, n + 1): path.append(i) backtrack(n, k, i+1) path.pop() @@ -414,7 +414,7 @@ class Solution: ``` 剪枝: -```python3 +```python class Solution: def combine(self, n: int, k: int) -> List[List[int]]: res=[] #存放符合条件结果的集合 @@ -423,7 +423,7 @@ class Solution: if len(path) == k: res.append(path[:]) return - for i in range(startIndex,n-(k-len(path))+2): #优化的地方 + for i in range(startIndex,n - (k - len(path)) + 2): #优化的地方 path.append(i) #处理节点 backtrack(n,k,i+1) #递归 path.pop() #回溯,撤销处理的节点 From f7db9fd7ebb380110ebe53d687e0bd7c57924377 Mon Sep 17 00:00:00 2001 From: bqlin Date: Sat, 11 Dec 2021 18:15:56 +0800 Subject: [PATCH 0102/3019] =?UTF-8?q?0017.=E7=94=B5=E8=AF=9D=E5=8F=B7?= =?UTF-8?q?=E7=A0=81=E7=9A=84=E5=AD=97=E6=AF=8D=E7=BB=84=E5=90=88=EF=BC=9A?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=8E=92=E7=89=88=EF=BC=8C=E8=A1=A5=E5=85=85?= =?UTF-8?q?Swift=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...27\346\257\215\347\273\204\345\220\210.md" | 54 ++++++++++++++++--- 1 file changed, 48 insertions(+), 6 deletions(-) diff --git "a/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" "b/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" index 0f99c87972..58508e08ab 100644 --- "a/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" +++ "b/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" @@ -39,7 +39,7 @@ 可以使用map或者定义一个二位数组,例如:string letterMap[10],来做映射,我这里定义一个二维数组,代码如下: -``` +```cpp const string letterMap[10] = { "", // 0 "", // 1 @@ -79,7 +79,7 @@ const string letterMap[10] = { 代码如下: -``` +```cpp vector result; string s; void backtracking(const string& digits, int index) @@ -95,7 +95,7 @@ void backtracking(const string& digits, int index) 代码如下: -``` +```cpp if (index == digits.size()) { result.push_back(s); return; @@ -281,7 +281,7 @@ class Solution { ## Python **回溯** -```python3 +```python class Solution: def __init__(self): self.answers: List[str] = [] @@ -317,7 +317,7 @@ class Solution: self.answer = self.answer[:-1] # 回溯 ``` **回溯简化** -```python3 +```python class Solution: def __init__(self): self.answers: List[str] = [] @@ -420,7 +420,8 @@ var letterCombinations = function(digits) { }; ``` -C: +## C + ```c char* path; int pathTop; @@ -481,6 +482,47 @@ char ** letterCombinations(char * digits, int* returnSize){ } ``` +## Swift + +```swift +func letterCombinations(_ digits: String) -> [String] { + // 按键与字母串映射 + let letterMap = [ + "", + "", "abc", "def", + "ghi", "jkl", "mno", + "pqrs", "tuv", "wxyz" + ] + // 把输入的按键字符串转成Int数组 + let baseCode = ("0" as Character).asciiValue! + let digits = digits.map { c in + guard let code = c.asciiValue else { return -1 } + return Int(code - baseCode) + }.filter { $0 >= 0 && $0 <= 9 } + guard !digits.isEmpty else { return [] } + + var result = [String]() + var s = "" + func backtracking(digits: [Int], index: Int) { + // 结束条件:收集结果 + if index == digits.count { + result.append(s) + return + } + + // 遍历当前按键对应的字母串 + let letters = letterMap[digits[index]] + for letter in letters { + s.append(letter) // 处理 + backtracking(digits: digits, index: index + 1) // 递归,记得+1 + s.removeLast() // 回溯 + } + } + backtracking(digits: digits, index: 0) + return result +} +``` + -----------------------
From f702f0482d678ef2c989d477157b0b6542852348 Mon Sep 17 00:00:00 2001 From: bqlin Date: Sat, 11 Dec 2021 18:18:45 +0800 Subject: [PATCH 0103/3019] =?UTF-8?q?0216.=E7=BB=84=E5=90=88=E6=80=BB?= =?UTF-8?q?=E5=92=8CIII=EF=BC=9A=E4=BC=98=E5=8C=96=E6=8E=92=E7=89=88?= =?UTF-8?q?=EF=BC=8C=E8=A1=A5=E5=85=85Swift=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...345\220\210\346\200\273\345\222\214III.md" | 45 ++++++++++++++++--- 1 file changed, 39 insertions(+), 6 deletions(-) diff --git "a/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" "b/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" index fa2ce37f65..76d31098a3 100644 --- "a/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" +++ "b/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" @@ -57,7 +57,7 @@ 至于为什么取名为path?从上面树形结构中,可以看出,结果其实就是一条根节点到叶子节点的路径。 -``` +```cpp vector> result; // 存放结果集 vector path; // 符合条件的结果 ``` @@ -71,7 +71,7 @@ vector path; // 符合条件的结果 所以代码如下: -``` +```cpp vector> result; vector path; void backtracking(int targetSum, int k, int sum, int startIndex) @@ -168,7 +168,7 @@ public: 那么剪枝的地方一定是在递归终止的地方剪,剪枝代码如下: -``` +```cpp if (sum > targetSum) { // 剪枝操作 return; } @@ -319,7 +319,7 @@ class Solution: return res ``` -## Go: +## Go 回溯+减枝 @@ -351,7 +351,7 @@ func backTree(n,k,startIndex int,track *[]int,result *[][]int){ } ``` -## javaScript: +## javaScript ```js // 等差数列 @@ -390,7 +390,8 @@ var combinationSum3 = function(k, n) { }; ``` -C: +## C + ```c int* path; int pathTop; @@ -448,5 +449,37 @@ int** combinationSum3(int k, int n, int* returnSize, int** returnColumnSizes){ } ``` +## Swift + +```swift +func combinationSum3(_ k: Int, _ n: Int) -> [[Int]] { + var result = [[Int]]() + var path = [Int]() + func backtracking(targetSum: Int, k: Int, sum: Int, startIndex: Int) { + // 剪枝 + if sum > targetSum { return } + // 终止条件 + if path.count == k { + if sum == targetSum { + result.append(path) + } + return + } + + // 单层逻辑 + let endIndex = 9 + guard startIndex <= endIndex else { return } + for i in startIndex ... endIndex { + path.append(i) // 处理 + backtracking(targetSum: targetSum, k: k, sum: sum + i, startIndex: i + 1) + path.removeLast() // 回溯 + } + } + + backtracking(targetSum: n, k: k, sum: 0, startIndex: 1) + return result +} +``` + -----------------------
From 1a15ed08a5f7149acf515fd3f266cb4a756508c2 Mon Sep 17 00:00:00 2001 From: bqlin Date: Sat, 11 Dec 2021 18:23:11 +0800 Subject: [PATCH 0104/3019] =?UTF-8?q?0077.=E7=BB=84=E5=90=88=E4=BC=98?= =?UTF-8?q?=E5=8C=96=EF=BC=9A=E8=A1=A5=E5=85=85Swift=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...04\345\220\210\344\274\230\345\214\226.md" | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git "a/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" "b/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" index 1d725bc529..d7f7bc38f0 100644 --- "a/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" +++ "b/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" @@ -294,5 +294,35 @@ int** combine(int n, int k, int* returnSize, int** returnColumnSizes){ } ``` +Swift: + +```swift +func combine(_ n: Int, _ k: Int) -> [[Int]] { + var path = [Int]() + var result = [[Int]]() + func backtracking(_ n: Int, _ k: Int, _ startIndex: Int) { + // 结束条件,并收集结果 + if path.count == k { + result.append(path) + return + } + + // 单层逻辑 + // let end = n + // 剪枝优化 + let end = n - (k - path.count) + 1 + guard startIndex <= end else { return } + for i in startIndex ... end { + path.append(i) // 处理结点 + backtracking(n, k, i + 1) // 递归 + path.removeLast() // 回溯 + } + } + + backtracking(n, k, 1) + return result +} +``` + -----------------------
From a1359e0f3b2578197eff747441d816aaa9ae2a7b Mon Sep 17 00:00:00 2001 From: bqlin Date: Sat, 11 Dec 2021 18:23:33 +0800 Subject: [PATCH 0105/3019] =?UTF-8?q?0077.=E7=BB=84=E5=90=88=EF=BC=9A?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=8E=92=E7=89=88=EF=BC=8C=E8=A1=A5=E5=85=85?= =?UTF-8?q?Swift=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "problems/0077.\347\273\204\345\220\210.md" | 42 ++++++++++++++++++--- 1 file changed, 36 insertions(+), 6 deletions(-) diff --git "a/problems/0077.\347\273\204\345\220\210.md" "b/problems/0077.\347\273\204\345\220\210.md" index 16313cb880..6c74ab52f4 100644 --- "a/problems/0077.\347\273\204\345\220\210.md" +++ "b/problems/0077.\347\273\204\345\220\210.md" @@ -109,7 +109,7 @@ for (int i = 1; i <= n; i++) { 代码如下: -``` +```cpp vector> result; // 存放符合条件结果的集合 vector path; // 用来存放符合条件结果 ``` @@ -132,7 +132,7 @@ vector path; // 用来存放符合条件结果 那么整体代码如下: -``` +```cpp vector> result; // 存放符合条件结果的集合 vector path; // 用来存放符合条件单一结果 void backtracking(int n, int k, int startIndex) @@ -152,7 +152,7 @@ path这个数组的大小如果达到k,说明我们找到了一个子集大小 所以终止条件代码如下: -``` +```cpp if (path.size() == k) { result.push_back(path); return; @@ -248,7 +248,7 @@ void backtracking(参数) { 在遍历的过程中有如下代码: -``` +```cpp for (int i = startIndex; i <= n; i++) { path.push_back(i); backtracking(n, k, i + 1); @@ -411,7 +411,7 @@ class Solution: path.pop() backtrack(n, k, 1) return res -``` +``` 剪枝: ```python3 @@ -454,7 +454,7 @@ const combineHelper = (n, k, startIndex) => { path.pop() } } -``` +``` @@ -621,5 +621,35 @@ int** combine(int n, int k, int* returnSize, int** returnColumnSizes){ } ``` +## Swift + +```swift +func combine(_ n: Int, _ k: Int) -> [[Int]] { + var path = [Int]() + var result = [[Int]]() + func backtracking(_ n: Int, _ k: Int, _ startIndex: Int) { + // 结束条件,并收集结果 + if path.count == k { + result.append(path) + return + } + + // 单层逻辑 + // let end = n + // 剪枝优化 + let end = n - (k - path.count) + 1 + guard startIndex <= end else { return } + for i in startIndex ... end { + path.append(i) // 处理结点 + backtracking(n, k, i + 1) // 递归 + path.removeLast() // 回溯 + } + } + + backtracking(n, k, 1) + return result +} +``` + -----------------------
From dda0b209263fea961185e8bb9a18262fa4af8f13 Mon Sep 17 00:00:00 2001 From: bqlin Date: Sat, 11 Dec 2021 23:34:11 +0800 Subject: [PATCH 0106/3019] =?UTF-8?q?0017.=E7=94=B5=E8=AF=9D=E5=8F=B7?= =?UTF-8?q?=E7=A0=81=E7=9A=84=E5=AD=97=E6=AF=8D=E7=BB=84=E5=90=88=EF=BC=9A?= =?UTF-8?q?=E6=9B=B4=E6=96=B0Swift=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\204\345\255\227\346\257\215\347\273\204\345\220\210.md" | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git "a/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" "b/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" index 58508e08ab..b3bbf122bd 100644 --- "a/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" +++ "b/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" @@ -503,7 +503,7 @@ func letterCombinations(_ digits: String) -> [String] { var result = [String]() var s = "" - func backtracking(digits: [Int], index: Int) { + func backtracking(index: Int) { // 结束条件:收集结果 if index == digits.count { result.append(s) @@ -514,11 +514,11 @@ func letterCombinations(_ digits: String) -> [String] { let letters = letterMap[digits[index]] for letter in letters { s.append(letter) // 处理 - backtracking(digits: digits, index: index + 1) // 递归,记得+1 + backtracking(index: index + 1) // 递归,记得+1 s.removeLast() // 回溯 } } - backtracking(digits: digits, index: 0) + backtracking(index: 0) return result } ``` From a5c51b705fa256ce3ba612b0960fe8908ffa97dd Mon Sep 17 00:00:00 2001 From: bqlin Date: Sat, 11 Dec 2021 23:37:54 +0800 Subject: [PATCH 0107/3019] =?UTF-8?q?0216.=E7=BB=84=E5=90=88=E6=80=BB?= =?UTF-8?q?=E5=92=8CIII=EF=BC=9A=E6=9B=B4=E6=96=B0Swift=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...73\204\345\220\210\346\200\273\345\222\214III.md" | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git "a/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" "b/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" index 76d31098a3..dd6ba9992d 100644 --- "a/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" +++ "b/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" @@ -452,14 +452,14 @@ int** combinationSum3(int k, int n, int* returnSize, int** returnColumnSizes){ ## Swift ```swift -func combinationSum3(_ k: Int, _ n: Int) -> [[Int]] { +func combinationSum3(_ count: Int, _ targetSum: Int) -> [[Int]] { var result = [[Int]]() var path = [Int]() - func backtracking(targetSum: Int, k: Int, sum: Int, startIndex: Int) { + func backtracking(sum: Int, startIndex: Int) { // 剪枝 - if sum > targetSum { return } + if sum > targetSum { return } // 终止条件 - if path.count == k { + if path.count == count { if sum == targetSum { result.append(path) } @@ -471,12 +471,12 @@ func combinationSum3(_ k: Int, _ n: Int) -> [[Int]] { guard startIndex <= endIndex else { return } for i in startIndex ... endIndex { path.append(i) // 处理 - backtracking(targetSum: targetSum, k: k, sum: sum + i, startIndex: i + 1) + backtracking(sum: sum + i, startIndex: i + 1) path.removeLast() // 回溯 } } - backtracking(targetSum: n, k: k, sum: 0, startIndex: 1) + backtracking(sum: 0, startIndex: 1) return result } ``` From 6a5c3ae29a8448c3bcf7d35f89d2c8654208a260 Mon Sep 17 00:00:00 2001 From: bqlin Date: Sat, 11 Dec 2021 23:46:45 +0800 Subject: [PATCH 0108/3019] =?UTF-8?q?0039.=E7=BB=84=E5=90=88=E6=80=BB?= =?UTF-8?q?=E5=92=8C=EF=BC=9A=E4=BC=98=E5=8C=96=E6=8E=92=E7=89=88=EF=BC=8C?= =?UTF-8?q?=E8=A1=A5=E5=85=85Swift=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...04\345\220\210\346\200\273\345\222\214.md" | 29 ++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git "a/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" "b/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" index c2c7530d20..81be41fd2c 100644 --- "a/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" +++ "b/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" @@ -365,7 +365,7 @@ func backtracking(startIndex,sum,target int,candidates,trcak []int,res *[][]int) } ``` -## JavaScript: +## JavaScript ```js var combinationSum = function(candidates, target) { @@ -447,5 +447,32 @@ int** combinationSum(int* candidates, int candidatesSize, int target, int* retur } ``` +## Swift + +```swift +func combinationSum(_ candidates: [Int], _ target: Int) -> [[Int]] { + var result = [[Int]]() + var path = [Int]() + func backtracking(sum: Int, startIndex: Int) { + // 终止条件 + if sum > target { return } + if sum == target { + result.append(path) + return + } + + let end = candidates.count + guard startIndex < end else { return } + for i in startIndex ..< end { + path.append(candidates[i]) // 处理 + backtracking(sum: sum + candidates[i], startIndex: i) // sum这里用新变量完成回溯,i不用+1以重复访问 + path.removeLast() // 回溯 + } + } + backtracking(sum: 0, startIndex: 0) + return result +} +``` + -----------------------
From 9a577c7b25ee0ca7e28e6055dffbb6ab815d7743 Mon Sep 17 00:00:00 2001 From: bqlin Date: Sun, 12 Dec 2021 10:28:21 +0800 Subject: [PATCH 0109/3019] =?UTF-8?q?0040.=E7=BB=84=E5=90=88=E6=80=BB?= =?UTF-8?q?=E5=92=8CII=EF=BC=9A=E4=BC=98=E5=8C=96=E6=8E=92=E7=89=88?= =?UTF-8?q?=EF=BC=8C=E8=A1=A5=E5=85=85Swift=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\345\220\210\346\200\273\345\222\214II.md" | 36 +++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) diff --git "a/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" "b/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" index b5e511e776..ac1970e1c9 100644 --- "a/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" +++ "b/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" @@ -381,7 +381,7 @@ class Solution: sum_ -= candidates[i] # 回溯,为了下一轮for loop ``` -## Go: +## Go 主要在于如何在回溯中去重 ```go @@ -424,7 +424,7 @@ func backtracking(startIndex,sum,target int,candidates,trcak []int,res *[][]int, } ``` -## javaScript: +## javaScript ```js /** @@ -550,5 +550,37 @@ int** combinationSum2(int* candidates, int candidatesSize, int target, int* retu } ``` +## Swift + +```swift +func combinationSum2(_ candidates: [Int], _ target: Int) -> [[Int]] { + // 为了方便去重复,先对集合排序 + let candidates = candidates.sorted() + var result = [[Int]]() + var path = [Int]() + func backtracking(sum: Int, startIndex: Int) { + // 终止条件 + if sum == target { + result.append(path) + return + } + + let end = candidates.count + guard startIndex < end else { return } + for i in startIndex ..< end { + if i > startIndex, candidates[i] == candidates[i - 1] { continue } // 去重复 + let sum = sum + candidates[i] // 使用局部变量隐藏回溯 + if sum > target { continue } // 剪枝 + + path.append(candidates[i]) // 处理 + backtracking(sum: sum, startIndex: i + 1) // i+1避免重复访问 + path.removeLast() // 回溯 + } + } + backtracking(sum: 0, startIndex: 0) + return result +} +``` + -----------------------
From c82bf133d4d6f95212ab42bfbcdb6af68927d9df Mon Sep 17 00:00:00 2001 From: bqlin Date: Sun, 12 Dec 2021 12:54:37 +0800 Subject: [PATCH 0110/3019] =?UTF-8?q?0131.=E5=88=86=E5=89=B2=E5=9B=9E?= =?UTF-8?q?=E6=96=87=E4=B8=B2=EF=BC=9A=E4=BC=98=E5=8C=96=E6=8E=92=E7=89=88?= =?UTF-8?q?=EF=BC=8C=E8=A1=A5=E5=85=85Swift=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...62\345\233\236\346\226\207\344\270\262.md" | 46 ++++++++++++++++++- 1 file changed, 45 insertions(+), 1 deletion(-) diff --git "a/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" "b/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" index 075734ea19..47734f6c66 100644 --- "a/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" +++ "b/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" @@ -450,7 +450,8 @@ var partition = function(s) { }; ``` -##C +## C + ```c char** path; int pathTop; @@ -546,5 +547,48 @@ char*** partition(char* s, int* returnSize, int** returnColumnSizes){ } ``` +## Swift + +```swift +func partition(_ s: String) -> [[String]] { + // 把字符串转为字符数组以便于通过索引访问和取子串 + let s = Array(s) + // 使用双指针法判断子串是否回文 + func isPalindrome(start: Int, end: Int) -> Bool { + var start = start, end = end + while start < end { + if s[start] != s[end] { return false } + start += 1 + end -= 1 + } + return true + } + + var result = [[String]]() + var path = [String]() // 切割方案 + func backtracking(startIndex: Int) { + // 终止条件,收集结果 + guard startIndex < s.count else { + result.append(path) + return + } + + for i in startIndex ..< s.count { + // 回文则收集,否则跳过 + if isPalindrome(start: startIndex, end: i) { + let substring = String(s[startIndex ... i]) + path.append(substring) + } else { + continue + } + backtracking(startIndex: i + 1) // 寻找下一个起始位置的子串 + if !path.isEmpty { path.removeLast() } // 回溯 + } + } + backtracking(startIndex: 0) + return result +} +``` + -----------------------
From aa0faf8a0ce26644514e93da2926ee6e2972fe77 Mon Sep 17 00:00:00 2001 From: youngyangyang04 <826123027@qq.com> Date: Sun, 12 Dec 2021 14:39:45 +0800 Subject: [PATCH 0111/3019] Update --- README.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/README.md b/README.md index 12781e7701..d304164103 100644 --- a/README.md +++ b/README.md @@ -22,6 +22,13 @@

+

《代码随想录》正式出版啦!!双十二五折优惠!

+ +

+ + + +

# LeetCode 刷题攻略 From 00a4baab52e8d968c5b3ac123d449e8dab44c583 Mon Sep 17 00:00:00 2001 From: youngyangyang04 <826123027@qq.com> Date: Sun, 12 Dec 2021 15:02:43 +0800 Subject: [PATCH 0112/3019] Update --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index d304164103..6e6f949053 100644 --- a/README.md +++ b/README.md @@ -22,11 +22,11 @@

-

《代码随想录》正式出版啦!!双十二五折优惠!

+

《代码随想录》正式出版啦!!录友专属福利,扫下方二维码享五折优惠!详细可以点击这里

- +

From d2dec64633aadce6a4c4bf4655da9f6a2e9356b9 Mon Sep 17 00:00:00 2001 From: youngyangyang04 <826123027@qq.com> Date: Sun, 12 Dec 2021 15:34:57 +0800 Subject: [PATCH 0113/3019] Update --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6e6f949053..de9ee00414 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@

《代码随想录》正式出版啦!!录友专属福利,扫下方二维码享五折优惠!详细可以点击这里

- +

From c29f74dc69fb02b3fd0886d09c9787df3007cb9b Mon Sep 17 00:00:00 2001 From: bqlin Date: Sun, 12 Dec 2021 17:08:20 +0800 Subject: [PATCH 0114/3019] =?UTF-8?q?0093.=E5=A4=8D=E5=8E=9FIP=E5=9C=B0?= =?UTF-8?q?=E5=9D=80=EF=BC=9A=E4=BC=98=E5=8C=96=E6=8E=92=E7=89=88=EF=BC=8C?= =?UTF-8?q?=E8=A1=A5=E5=85=85Swift=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\345\216\237IP\345\234\260\345\235\200.md" | 59 +++++++++++++++++-- 1 file changed, 53 insertions(+), 6 deletions(-) diff --git "a/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" "b/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" index 2277aa60b3..5118810d9a 100644 --- "a/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" +++ "b/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" @@ -66,10 +66,10 @@ startIndex一定是需要的,因为不能重复分割,记录下一层递归 所以代码如下: -``` - vector result;// 记录结果 - // startIndex: 搜索的起始位置,pointNum:添加逗点的数量 - void backtracking(string& s, int startIndex, int pointNum) { +```cpp +vector result;// 记录结果 +// startIndex: 搜索的起始位置,pointNum:添加逗点的数量 +void backtracking(string& s, int startIndex, int pointNum) { ``` * 递归终止条件 @@ -82,7 +82,7 @@ pointNum表示逗点数量,pointNum为3说明字符串分成了4段了。 代码如下: -``` +```cpp if (pointNum == 3) { // 逗点数量为3时,分隔结束 // 判断第四段子字符串是否合法,如果合法就放进result中 if (isValid(s, startIndex, s.size() - 1)) { @@ -96,7 +96,7 @@ if (pointNum == 3) { // 逗点数量为3时,分隔结束 在[131.分割回文串](https://programmercarl.com/0131.分割回文串.html)中已经讲过在循环遍历中如何截取子串。 -在`for (int i = startIndex; i < s.size(); i++)`循环中 [startIndex, i]这个区间就是截取的子串,需要判断这个子串是否合法。 +在`for (int i = startIndex; i < s.size(); i++)`循环中 [startIndex, i] 这个区间就是截取的子串,需要判断这个子串是否合法。 如果合法就在字符串后面加上符号`.`表示已经分割。 @@ -531,6 +531,53 @@ char ** restoreIpAddresses(char * s, int* returnSize){ } ``` +## Swift + +```swift +// 判断区间段是否合法 +func isValid(s: [Character], start: Int, end: Int) -> Bool { + guard start <= end, start >= 0, end < s.count else { return false } // 索引不合法 + if start != end, s[start] == "0" { return false } // 以0开头的多位数字不合法 + var num = 0 + for i in start ... end { + let c = s[i] + guard c >= "0", c <= "9" else { return false } // 非数字不合法 + let value = c.asciiValue! - ("0" as Character).asciiValue! + num = num * 10 + Int(value) + guard num <= 255 else { return false } // 大于255不合法 + } + return true +} +func restoreIpAddresses(_ s: String) -> [String] { + var s = Array(s) // 转换成字符数组以便于比较 + var result = [String]() // 结果 + func backtracking(startIndex: Int, pointCount: Int) { + guard startIndex < s.count else { return } // 索引不合法 + // 结束条件 + if pointCount == 3 { + // 最后一段也合法,则收集结果 + if isValid(s: s, start: startIndex, end: s.count - 1) { + result.append(String(s)) + } + return + } + + for i in startIndex ..< s.count { + // 判断[starIndex, i]子串是否合法,合法则插入“.”,否则结束本层循环 + if isValid(s: s, start: startIndex, end: i) { + s.insert(".", at: i + 1) // 子串后面插入“.” + backtracking(startIndex: i + 2, pointCount: pointCount + 1) // 注意这里时跳2位,且通过pointCount + 1局部变量隐藏了pointCount的回溯 + s.remove(at: i + 1) // 回溯 + } else { + break + } + } + } + backtracking(startIndex: 0, pointCount: 0) + return result +} +``` + -----------------------
From 458a37ea32c6903e7179dc84c935006d0bbc7c2a Mon Sep 17 00:00:00 2001 From: bqlin Date: Sun, 12 Dec 2021 18:07:00 +0800 Subject: [PATCH 0115/3019] =?UTF-8?q?0078.=E5=AD=90=E9=9B=86=EF=BC=9A?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=8E=92=E7=89=88=EF=BC=8C=E8=A1=A5=E5=85=85?= =?UTF-8?q?Swift=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "problems/0078.\345\255\220\351\233\206.md" | 31 ++++++++++++++++++--- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git "a/problems/0078.\345\255\220\351\233\206.md" "b/problems/0078.\345\255\220\351\233\206.md" index c5dec79564..133c55ac22 100644 --- "a/problems/0078.\345\255\220\351\233\206.md" +++ "b/problems/0078.\345\255\220\351\233\206.md" @@ -57,13 +57,13 @@ 代码如下: -``` +```cpp vector> result; vector path; void backtracking(vector& nums, int startIndex) { ``` -* 递归终止条件 +递归终止条件 从图中可以看出: @@ -75,7 +75,7 @@ void backtracking(vector& nums, int startIndex) { 就是startIndex已经大于数组的长度了,就终止了,因为没有元素可取了,代码如下: -``` +```cpp if (startIndex >= nums.size()) { return; } @@ -253,7 +253,7 @@ func Dfs(temp, nums []int, start int){ } ``` -## Javascript: +## Javascript ```Javascript var subsets = function(nums) { @@ -329,6 +329,29 @@ int** subsets(int* nums, int numsSize, int* returnSize, int** returnColumnSizes) } ``` +## Swift + +```swift +func subsets(_ nums: [Int]) -> [[Int]] { + var result = [[Int]]() + var path = [Int]() + func backtracking(startIndex: Int) { + // 直接收集结果 + result.append(path) + + let end = nums.count + guard startIndex < end else { return } // 终止条件 + for i in startIndex ..< end { + path.append(nums[i]) // 处理:收集元素 + backtracking(startIndex: i + 1) // 元素不重复访问 + path.removeLast() // 回溯 + } + } + backtracking(startIndex: 0) + return result +} +``` + -----------------------
From b884383b1264da0bf158bcf34ffba62afa754c36 Mon Sep 17 00:00:00 2001 From: bqlin Date: Sun, 12 Dec 2021 18:35:29 +0800 Subject: [PATCH 0116/3019] =?UTF-8?q?0090.=E5=AD=90=E9=9B=86II=EF=BC=9A?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=8E=92=E7=89=88=EF=BC=8C=E8=A1=A5=E5=85=85?= =?UTF-8?q?Swift=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "problems/0090.\345\255\220\351\233\206II.md" | 31 ++++++++++++++++--- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git "a/problems/0090.\345\255\220\351\233\206II.md" "b/problems/0090.\345\255\220\351\233\206II.md" index 95b6080bf7..1761280182 100644 --- "a/problems/0090.\345\255\220\351\233\206II.md" +++ "b/problems/0090.\345\255\220\351\233\206II.md" @@ -156,14 +156,12 @@ public: 当然本题去重的逻辑,也可以这么写 -``` +```cpp if (i > startIndex && nums[i] == nums[i - 1] ) { - continue; + continue; } ``` - - ## 其他语言版本 @@ -359,6 +357,31 @@ int** subsetsWithDup(int* nums, int numsSize, int* returnSize, int** returnColum } ``` +## Swift + +```swift +func subsetsWithDup(_ nums: [Int]) -> [[Int]] { + let nums = nums.sorted() + var result = [[Int]]() + var path = [Int]() + func backtracking(startIndex: Int) { + // 直接收集结果 + result.append(path) + + let end = nums.count + guard startIndex < end else { return } // 终止条件 + for i in startIndex ..< end { + if i > startIndex, nums[i] == nums[i - 1] { continue } // 跳过重复元素 + path.append(nums[i]) // 处理:收集元素 + backtracking(startIndex: i + 1) // 元素不重复访问 + path.removeLast() // 回溯 + } + } + backtracking(startIndex: 0) + return result +} +``` + -----------------------
From cf59acd6c28eb712344b8eaf20923729d4eadd24 Mon Sep 17 00:00:00 2001 From: bqlin Date: Sun, 12 Dec 2021 19:15:58 +0800 Subject: [PATCH 0117/3019] =?UTF-8?q?0491.=E9=80=92=E5=A2=9E=E5=AD=90?= =?UTF-8?q?=E5=BA=8F=E5=88=97=EF=BC=9A=E4=BC=98=E5=8C=96=E6=8E=92=E7=89=88?= =?UTF-8?q?=EF=BC=8C=E8=A1=A5=E5=85=85Swift=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...36\345\255\220\345\272\217\345\210\227.md" | 36 +++++++++++++++++-- 1 file changed, 33 insertions(+), 3 deletions(-) diff --git "a/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" "b/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" index 231ea4946d..ee7180dd04 100644 --- "a/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" @@ -56,7 +56,7 @@ 代码如下: -``` +```cpp vector> result; vector path; void backtracking(vector& nums, int startIndex) @@ -68,7 +68,7 @@ void backtracking(vector& nums, int startIndex) 但本题收集结果有所不同,题目要求递增子序列大小至少为2,所以代码如下: -``` +```cpp if (path.size() > 1) { result.push_back(path); // 注意这里不要加return,因为要取树上的所有节点 @@ -82,7 +82,7 @@ if (path.size() > 1) { 那么单层搜索代码如下: -``` +```cpp unordered_set uset; // 使用set来对本层元素进行去重 for (int i = startIndex; i < nums.size(); i++) { if ((!path.empty() && nums[i] < path.back()) @@ -431,6 +431,36 @@ int** findSubsequences(int* nums, int numsSize, int* returnSize, int** returnCol } ``` +## Swift + +```swift +func findSubsequences(_ nums: [Int]) -> [[Int]] { + var result = [[Int]]() + var path = [Int]() + func backtracking(startIndex: Int) { + // 收集结果,但不返回,因为后续还要以此基础拼接 + if path.count > 1 { + result.append(path) + } + + var uset = Set() + let end = nums.count + guard startIndex < end else { return } // 终止条件 + for i in startIndex ..< end { + let num = nums[i] + if uset.contains(num) { continue } // 跳过重复元素 + if !path.isEmpty, num < path.last! { continue } // 确保递增 + uset.insert(num) // 通过set记录 + path.append(num) // 处理:收集元素 + backtracking(startIndex: i + 1) // 元素不重复访问 + path.removeLast() // 回溯 + } + } + backtracking(startIndex: 0) + return result +} +``` + -----------------------
From a981cee54cad59114335f32bcb88b4a2e39d0342 Mon Sep 17 00:00:00 2001 From: ShrinkLynn Date: Sun, 12 Dec 2021 19:54:33 +0800 Subject: [PATCH 0118/3019] [ShrinkLynn] 0028 add swift version --- .../0028.\345\256\236\347\216\260strStr.md" | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git "a/problems/0028.\345\256\236\347\216\260strStr.md" "b/problems/0028.\345\256\236\347\216\260strStr.md" index 1c654dd456..d6c5ee2711 100644 --- "a/problems/0028.\345\256\236\347\216\260strStr.md" +++ "b/problems/0028.\345\256\236\347\216\260strStr.md" @@ -894,7 +894,58 @@ var strStr = function (haystack, needle) { }; ``` +Swift 版本 +> 前缀表统一减一 + +```swift +func strStr(_ haystack: String, _ needle: String) -> Int { + + let s = Array(haystack), p = Array(needle) + guard p.count != 0 else { return 0 } + + // 2 pointer + var j = -1 + var next = [Int](repeating: -1, count: needle.count) + // KMP + getNext(&next, needle: p) + for i in 0 ..< s.count { + while j >= 0 && s[i] != p[j + 1] { + //不匹配之后寻找之前匹配的位置 + j = next[j] + } + if s[i] == p[j + 1] { + //匹配,双指针同时后移 + j += 1 + } + if j == (p.count - 1) { + //出现匹配字符串 + return i - p.count + 1 + } + } + return -1 +} + +//前缀表统一减一 +func getNext(_ next: inout [Int], needle: [Character]) { + + var j: Int = -1 + next[0] = j + + // i 从 1 开始 + for i in 1 ..< needle.count { + while j >= 0 && needle[i] != needle[j + 1] { + j = next[j] + } + if needle[i] == needle[j + 1] { + j += 1; + } + next[i] = j + } + print(next) +} + +``` -----------------------
From 39a233f22ff8c15d1561a44e157bafdc38633f33 Mon Sep 17 00:00:00 2001 From: bqlin Date: Mon, 13 Dec 2021 12:00:32 +0800 Subject: [PATCH 0119/3019] =?UTF-8?q?0046.=E5=85=A8=E6=8E=92=E5=88=97?= =?UTF-8?q?=EF=BC=9A=E4=BC=98=E5=8C=96=E6=8E=92=E7=89=88=EF=BC=8C=E8=A1=A5?= =?UTF-8?q?=E5=85=85Swift=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...6.\345\205\250\346\216\222\345\210\227.md" | 42 ++++++++++++++++--- 1 file changed, 36 insertions(+), 6 deletions(-) diff --git "a/problems/0046.\345\205\250\346\216\222\345\210\227.md" "b/problems/0046.\345\205\250\346\216\222\345\210\227.md" index 180059615e..a37f6da3ec 100644 --- "a/problems/0046.\345\205\250\346\216\222\345\210\227.md" +++ "b/problems/0046.\345\205\250\346\216\222\345\210\227.md" @@ -44,7 +44,7 @@ * 递归函数参数 -**首先排列是有序的,也就是说[1,2] 和[2,1] 是两个集合,这和之前分析的子集以及组合所不同的地方**。 +**首先排列是有序的,也就是说 [1,2] 和 [2,1] 是两个集合,这和之前分析的子集以及组合所不同的地方**。 可以看出元素1在[1,2]中已经使用过了,但是在[2,1]中还要在使用一次1,所以处理排列问题就不用使用startIndex了。 @@ -54,7 +54,7 @@ 代码如下: -``` +```cpp vector> result; vector path; void backtracking (vector& nums, vector& used) @@ -72,7 +72,7 @@ void backtracking (vector& nums, vector& used) 代码如下: -``` +```cpp // 此时说明找到了一组 if (path.size() == nums.size()) { result.push_back(path); @@ -90,7 +90,7 @@ if (path.size() == nums.size()) { 代码如下: -``` +```cpp for (int i = 0; i < nums.size(); i++) { if (used[i] == true) continue; // path里已经收录的元素,直接跳过 used[i] = true; @@ -179,7 +179,7 @@ class Solution { } } } -``` +``` ```java // 解法2:通过判断path中是否存在数字,排除已经选择的数字 @@ -331,7 +331,8 @@ var permute = function(nums) { ``` -C: +### C + ```c int* path; int pathTop; @@ -398,6 +399,35 @@ int** permute(int* nums, int numsSize, int* returnSize, int** returnColumnSizes) } ``` +### Swift + +```swift +func permute(_ nums: [Int]) -> [[Int]] { + var result = [[Int]]() + var path = [Int]() + var used = [Bool](repeating: false, count: nums.count) // 记录path中已包含的元素 + func backtracking() { + // 结束条件,收集结果 + if path.count == nums.count { + result.append(path) + return + } + + for i in 0 ..< nums.count { + if used[i] { continue } // 排除已包含的元素 + used[i] = true + path.append(nums[i]) + backtracking() + // 回溯 + path.removeLast() + used[i] = false + } + } + backtracking() + return result +} +``` + -----------------------
From a953eca2342b74be1255a3d1a9359b37a2044526 Mon Sep 17 00:00:00 2001 From: bqlin Date: Mon, 13 Dec 2021 15:54:48 +0800 Subject: [PATCH 0120/3019] =?UTF-8?q?0047.=E5=85=A8=E6=8E=92=E5=88=97II?= =?UTF-8?q?=EF=BC=9A=E4=BC=98=E5=8C=96=E6=8E=92=E7=89=88=EF=BC=8C=E8=A1=A5?= =?UTF-8?q?=E5=85=85Swift=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\345\205\250\346\216\222\345\210\227II.md" | 38 +++++++++++++++++-- 1 file changed, 34 insertions(+), 4 deletions(-) diff --git "a/problems/0047.\345\205\250\346\216\222\345\210\227II.md" "b/problems/0047.\345\205\250\346\216\222\345\210\227II.md" index d5d1528be2..167e4b760e 100644 --- "a/problems/0047.\345\205\250\346\216\222\345\210\227II.md" +++ "b/problems/0047.\345\205\250\346\216\222\345\210\227II.md" @@ -97,14 +97,15 @@ public: 大家发现,去重最为关键的代码为: -``` +```cpp if (i > 0 && nums[i] == nums[i - 1] && used[i - 1] == false) { continue; } ``` **如果改成 `used[i - 1] == true`, 也是正确的!**,去重代码如下: -``` + +```cpp if (i > 0 && nums[i] == nums[i - 1] && used[i - 1] == true) { continue; } @@ -131,13 +132,13 @@ if (i > 0 && nums[i] == nums[i - 1] && used[i - 1] == true) { ## 总结 这道题其实还是用了我们之前讲过的去重思路,但有意思的是,去重的代码中,这么写: -``` +```cpp if (i > 0 && nums[i] == nums[i - 1] && used[i - 1] == false) { continue; } ``` 和这么写: -``` +```cpp if (i > 0 && nums[i] == nums[i - 1] && used[i - 1] == true) { continue; } @@ -291,7 +292,36 @@ var permuteUnique = function (nums) { ``` +### Swift + +```swift +func permuteUnique(_ nums: [Int]) -> [[Int]] { + let nums = nums.sorted() // 先排序,以方便相邻元素去重 + var result = [[Int]]() + var path = [Int]() + var used = [Bool](repeating: false, count: nums.count) + func backtracking() { + if path.count == nums.count { + result.append(path) + return + } + for i in 0 ..< nums.count { + // !used[i - 1]表示同一树层nums[i - 1]使用过,直接跳过,这一步很关键! + if i > 0, nums[i] == nums[i - 1], !used[i - 1] { continue } + if used[i] { continue } + used[i] = true + path.append(nums[i]) + backtracking() + // 回溯 + path.removeLast() + used[i] = false + } + } + backtracking() + return result +} +``` -----------------------
From b396e64bbce4c4809132dd35fac1e01276701674 Mon Sep 17 00:00:00 2001 From: youngyangyang04 <826123027@qq.com> Date: Mon, 13 Dec 2021 19:04:14 +0800 Subject: [PATCH 0121/3019] Update --- README.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index de9ee00414..3c20376fde 100644 --- a/README.md +++ b/README.md @@ -22,14 +22,15 @@

-

《代码随想录》正式出版啦!!录友专属福利,扫下方二维码享五折优惠!详细可以点击这里

+

《代码随想录》正式出版啦!!录友专属福利,点击下方可以享五折优惠!详细可以点击这里

- - + +

+ # LeetCode 刷题攻略 ## 刷题攻略的背景 From 52ba6c2b35639233668d59eef75e41ceaf6d39bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9E=81=E5=AE=A2=E5=AD=A6=E4=BC=9F?= Date: Tue, 14 Dec 2021 13:29:25 +0800 Subject: [PATCH 0122/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20=E4=BA=8C?= =?UTF-8?q?=E5=8F=89=E6=A0=91=E7=9A=84=E9=80=92=E5=BD=92=E9=81=8D=E5=8E=86?= =?UTF-8?q?=20Swift=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...22\345\275\222\351\201\215\345\216\206.md" | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" index 875e6169df..0468b79b98 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" @@ -409,5 +409,56 @@ int* postorderTraversal(struct TreeNode* root, int* returnSize){ } ``` +Swift: +前序遍历:(144.二叉树的前序遍历) +```Swift +func preorderTraversal(_ root: TreeNode?) -> [Int] { + var res = [Int]() + preorder(root, res: &res) + return res +} +func preorder(_ root: TreeNode?, res: inout [Int]) { + if root == nil { + return + } + res.append(root!.val) + preorder(root!.left, res: &res) + preorder(root!.right, res: &res) +} +``` + +中序遍历:(94. 二叉树的中序遍历) +```Swift +func inorderTraversal(_ root: TreeNode?) -> [Int] { + var res = [Int]() + inorder(root, res: &res) + return res +} +func inorder(_ root: TreeNode?, res: inout [Int]) { + if root == nil { + return + } + inorder(root!.left, res: &res) + res.append(root!.val) + inorder(root!.right, res: &res) +} +``` + +后序遍历:(145. 二叉树的后序遍历) +```Swift +func postorderTraversal(_ root: TreeNode?) -> [Int] { + var res = [Int]() + postorder(root, res: &res) + return res +} +func postorder(_ root: TreeNode?, res: inout [Int]) { + if root == nil { + return + } + postorder(root!.left, res: &res) + postorder(root!.right, res: &res) + res.append(root!.val) +} +``` -----------------------
From a87829edeb0d5677f2661582eb8367a47310c37c Mon Sep 17 00:00:00 2001 From: cndoit18 Date: Thu, 16 Dec 2021 14:56:59 +0800 Subject: [PATCH 0123/3019] =?UTF-8?q?feat(go=200242):=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=200242=20golang=E7=9A=84=E6=96=B0=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: cndoit18 --- ...7\215\345\274\202\344\275\215\350\257\215.md" | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git "a/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" "b/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" index 611827586c..88fa06d8b4 100644 --- "a/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" +++ "b/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" @@ -173,6 +173,22 @@ func isAnagram(s string, t string) bool { } ``` +Go写法二(没有使用slice作为哈希表,用数组来代替): + +```go +func isAnagram(s string, t string) bool { + record := [26]int{} + for _, r := range s { + record[r-rune('a')]++ + } + for _, r := range t { + record[r-rune('a')]-- + } + + return record == [26]int{} +} +``` + javaScript: ```js From e70a6ff0f1c9a6f7c69f552c9918729654646efe Mon Sep 17 00:00:00 2001 From: bqlin Date: Fri, 17 Dec 2021 13:46:06 +0800 Subject: [PATCH 0124/3019] =?UTF-8?q?20201112=E5=9B=9E=E6=BA=AF=E5=91=A8?= =?UTF-8?q?=E6=9C=AB=E6=80=BB=E7=BB=93=EF=BC=9A=E4=BC=98=E5=8C=96=E6=8E=92?= =?UTF-8?q?=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...72\257\345\221\250\346\234\253\346\200\273\347\273\223.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20201112\345\233\236\346\272\257\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20201112\345\233\236\346\272\257\345\221\250\346\234\253\346\200\273\347\273\223.md" index f363b9f7f1..c61de4bb4c 100644 --- "a/problems/\345\221\250\346\200\273\347\273\223/20201112\345\233\236\346\272\257\345\221\250\346\234\253\346\200\273\347\273\223.md" +++ "b/problems/\345\221\250\346\200\273\347\273\223/20201112\345\233\236\346\272\257\345\221\250\346\234\253\346\200\273\347\273\223.md" @@ -72,8 +72,8 @@ **所以这块就说一说我个人理解,对内容持开放态度,集思广益,欢迎大家来讨论!** 子集问题分析: -* 时间复杂度:$O(n × 2^n)$,因为每一个元素的状态无外乎取与不取,所以时间复杂度为$O(2^n)$,构造每一组子集都需要填进数组,又有需要$O(n)$,最终时间复杂度:$O(n × 2^n)$ -* 空间复杂度:$O(n)$,递归深度为n,所以系统栈所用空间为$O(n)$,每一层递归所用的空间都是常数级别,注意代码里的result和path都是全局变量,就算是放在参数里,传的也是引用,并不会新申请内存空间,最终空间复杂度为$O(n)$ +* 时间复杂度:$O(n × 2^n)$,因为每一个元素的状态无外乎取与不取,所以时间复杂度为$O(2^n)$,构造每一组子集都需要填进数组,又有需要$O(n)$,最终时间复杂度:$O(n × 2^n)$。 +* 空间复杂度:$O(n)$,递归深度为n,所以系统栈所用空间为$O(n)$,每一层递归所用的空间都是常数级别,注意代码里的result和path都是全局变量,就算是放在参数里,传的也是引用,并不会新申请内存空间,最终空间复杂度为$O(n)$。 排列问题分析: * 时间复杂度:$O(n!)$,这个可以从排列的树形图中很明显发现,每一层节点为n,第二层每一个分支都延伸了n-1个分支,再往下又是n-2个分支,所以一直到叶子节点一共就是 n * n-1 * n-2 * ..... 1 = n!。 From a8f8f21ba93cbd6640767243b2c89350795d9303 Mon Sep 17 00:00:00 2001 From: bqlin Date: Fri, 17 Dec 2021 13:47:27 +0800 Subject: [PATCH 0125/3019] =?UTF-8?q?0332.=E9=87=8D=E6=96=B0=E5=AE=89?= =?UTF-8?q?=E6=8E=92=E8=A1=8C=E7=A8=8B=EF=BC=9A=E4=BC=98=E5=8C=96=E6=8E=92?= =?UTF-8?q?=E7=89=88=EF=BC=8C=E8=A1=A5=E5=85=85Swift=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...11\346\216\222\350\241\214\347\250\213.md" | 133 +++++++++++++++++- 1 file changed, 128 insertions(+), 5 deletions(-) diff --git "a/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" "b/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" index cfdea23727..b5c3ca0038 100644 --- "a/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" +++ "b/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" @@ -125,7 +125,7 @@ void backtracking(参数) { 代码如下: -``` +```cpp // unordered_map<出发机场, map<到达机场, 航班次数>> targets unordered_map> targets; bool backtracking(int ticketNum, vector& result) { @@ -142,7 +142,8 @@ bool backtracking(int ticketNum, vector& result) { 所以找到了这个叶子节点了直接返回,这个递归函数的返回值问题我们在讲解二叉树的系列的时候,在这篇[二叉树:递归函数究竟什么时候需要返回值,什么时候不要返回值?](https://programmercarl.com/0112.路径总和.html)详细介绍过。 当然本题的targets和result都需要初始化,代码如下: -``` + +```cpp for (const vector& vec : tickets) { targets[vec[0]][vec[1]]++; // 记录映射关系 } @@ -157,7 +158,7 @@ result.push_back("JFK"); // 起始机场 代码如下: -``` +```cpp if (result.size() == ticketNum + 1) { return true; } @@ -230,13 +231,15 @@ public: 一波分析之后,可以看出我就是按照回溯算法的模板来的。 代码中 -``` + +```cpp for (pair& target : targets[result[result.size() - 1]]) ``` pair里要有const,因为map中的key是不可修改的,所以是`pair`。 如果不加const,也可以复制一份pair,例如这么写: -``` + +```cpp for (pairtarget : targets[result[result.size() - 1]]) ``` @@ -445,5 +448,125 @@ var findItinerary = function(tickets) { ``` +### Swift + +直接迭代tickets数组: + +```swift +func findItinerary(_ tickets: [[String]]) -> [String] { + // 先对路线进行排序 + let tickets = tickets.sorted { (arr1, arr2) -> Bool in + if arr1[0] < arr2[0] { + return true + } else if arr1[0] > arr2[0] { + return false + } + if arr1[1] < arr2[1] { + return true + } else if arr1[1] > arr2[1] { + return false + } + return true + } + var path = ["JFK"] + var used = [Bool](repeating: false, count: tickets.count) + + @discardableResult + func backtracking() -> Bool { + // 结束条件:满足一条路径的数量 + if path.count == tickets.count + 1 { return true } + + for i in 0 ..< tickets.count { + // 巧妙之处!跳过处理过或出发站不是path末尾站的线路,即筛选出未处理的又可以衔接path的线路 + guard !used[i], tickets[i][0] == path.last! else { continue } + // 处理 + used[i] = true + path.append(tickets[i][1]) + // 递归 + if backtracking() { return true } + // 回溯 + path.removeLast() + used[i] = false + } + return false + } + backtracking() + return path +} +``` + +使用字典优化迭代遍历: + +```swift +func findItinerary(_ tickets: [[String]]) -> [String] { + // 建立出发站和目的站的一对多关系,要对目的地进行排序 + typealias Destination = (name: String, used: Bool) + var targets = [String: [Destination]]() + for line in tickets { + let src = line[0], des = line[1] + var value = targets[src] ?? [] + value.append((des, false)) + targets[src] = value + } + for (k, v) in targets { + targets[k] = v.sorted { $0.name < $1.name } + } + + var path = ["JFK"] + let pathCount = tickets.count + 1 + @discardableResult + func backtracking() -> Bool { + if path.count == pathCount { return true } + + let startPoint = path.last! + guard let end = targets[startPoint]?.count, end > 0 else { return false } + for i in 0 ..< end { + // 排除处理过的线路 + guard !targets[startPoint]![i].used else { continue } + // 处理 + targets[startPoint]![i].used = true + path.append(targets[startPoint]![i].name) + // 递归 + if backtracking() { return true } + // 回溯 + path.removeLast() + targets[startPoint]![i].used = false + } + return false + } + backtracking() + return path +} +``` + +使用插入时排序优化targets字典的构造: + +```swift +// 建立出发站和目的站的一对多关系,在构建的时候进行插入排序 +typealias Destination = (name: String, used: Bool) +var targets = [String: [Destination]]() +func sortedInsert(_ element: Destination, to array: inout [Destination]) { + var left = 0, right = array.count - 1 + while left <= right { + let mid = left + (right - left) / 2 + if array[mid].name < element.name { + left = mid + 1 + } else if array[mid].name > element.name { + right = mid - 1 + } else { + left = mid + break + } + } + array.insert(element, at: left) +} +for line in tickets { + let src = line[0], des = line[1] + var value = targets[src] ?? [] + sortedInsert((des, false), to: &value) + targets[src] = value +} +``` + -----------------------
From b137d79f89c6af17fb8486900f569da845c00c85 Mon Sep 17 00:00:00 2001 From: LQX0088 <838056160@qq.com> Date: Fri, 17 Dec 2021 14:25:57 +0800 Subject: [PATCH 0126/3019] =?UTF-8?q?feat:=E4=BF=AE=E6=94=B9=E4=BA=86?= =?UTF-8?q?=E5=89=91=E6=8C=87Offer=2005=E9=A2=98=E4=B8=AD=E7=9A=84Java?= =?UTF-8?q?=E7=AC=AC=E4=B8=80=E7=A7=8D=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 这里的charAt()函数返回的本身就是一个char型变量,因此我认为没必要将其转换成String类型,而是直接比较即可。 --- ...ffer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git "a/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" "b/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" index eed31557a3..77d3c36b3a 100644 --- "a/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" +++ "b/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" @@ -134,7 +134,8 @@ public static String replaceSpace(StringBuffer str) { //使用 sb 逐个复制 str ,碰到空格则替换,否则直接复制 for (int i = 0; i < str.length(); i++) { //str.charAt(i) 为 char 类型,为了比较需要将其转为和 " " 相同的字符串类型 - if (" ".equals(String.valueOf(str.charAt(i)))){ + //if (" ".equals(String.valueOf(str.charAt(i)))){ + if (s.charAt(i) == ' ') { sb.append("%20"); } else { sb.append(str.charAt(i)); From e495a0fccef650dda96f4fec9b47c84f3ad7ed4e Mon Sep 17 00:00:00 2001 From: joeCarf <52153761+joeCarf@users.noreply.github.com> Date: Fri, 17 Dec 2021 15:03:39 +0800 Subject: [PATCH 0127/3019] =?UTF-8?q?feat:=20=E4=BF=AE=E6=94=B9232?= =?UTF-8?q?=E9=A2=98=E4=B8=ADJava=E5=86=99=E6=B3=95=E5=8F=8A=E5=91=BD?= =?UTF-8?q?=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 命名更易理解,写法更加简洁 --- ...36\347\216\260\351\230\237\345\210\227.md" | 55 +++++++++---------- 1 file changed, 27 insertions(+), 28 deletions(-) diff --git "a/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" "b/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" index ec27365125..7e0ba63189 100644 --- "a/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" +++ "b/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" @@ -130,43 +130,42 @@ Java: ```java class MyQueue { - Stack stack1; - Stack stack2; + Stack stackIn; + Stack stackOut; /** Initialize your data structure here. */ public MyQueue() { - stack1 = new Stack<>(); // 负责进栈 - stack2 = new Stack<>(); // 负责出栈 + stackIn = new Stack<>(); // 负责进栈 + stackOut = new Stack<>(); // 负责出栈 } /** Push element x to the back of queue. */ public void push(int x) { - stack1.push(x); + stackIn.push(x); } /** Removes the element from in front of queue and returns that element. */ public int pop() { - dumpStack1(); - return stack2.pop(); + dumpstackIn(); + return stackOut.pop(); } /** Get the front element. */ public int peek() { - dumpStack1(); - return stack2.peek(); + dumpstackIn(); + return stackOut.peek(); } /** Returns whether the queue is empty. */ public boolean empty() { - return stack1.isEmpty() && stack2.isEmpty(); + return stackIn.isEmpty() && stackOut.isEmpty(); } - // 如果stack2为空,那么将stack1中的元素全部放到stack2中 - private void dumpStack1(){ - if (stack2.isEmpty()){ - while (!stack1.isEmpty()){ - stack2.push(stack1.pop()); - } + // 如果stackOut为空,那么将stackIn中的元素全部放到stackOut中 + private void dumpstackIn(){ + if (!stackOut.isEmpty()) return; + while (!stackIn.isEmpty()){ + stackOut.push(stackIn.pop()); } } } @@ -302,8 +301,8 @@ func (this *MyQueue) Empty() bool { * Initialize your data structure here. */ var MyQueue = function() { - this.stack1 = []; - this.stack2 = []; + this.stackIn = []; + this.stackOut = []; }; /** @@ -312,7 +311,7 @@ var MyQueue = function() { * @return {void} */ MyQueue.prototype.push = function(x) { - this.stack1.push(x); + this.stackIn.push(x); }; /** @@ -320,14 +319,14 @@ MyQueue.prototype.push = function(x) { * @return {number} */ MyQueue.prototype.pop = function() { - const size = this.stack2.length; + const size = this.stackOut.length; if(size) { - return this.stack2.pop(); + return this.stackOut.pop(); } - while(this.stack1.length) { - this.stack2.push(this.stack1.pop()); + while(this.stackIn.length) { + this.stackOut.push(this.stackIn.pop()); } - return this.stack2.pop(); + return this.stackOut.pop(); }; /** @@ -336,7 +335,7 @@ MyQueue.prototype.pop = function() { */ MyQueue.prototype.peek = function() { const x = this.pop(); - this.stack2.push(x); + this.stackOut.push(x); return x; }; @@ -345,7 +344,7 @@ MyQueue.prototype.peek = function() { * @return {boolean} */ MyQueue.prototype.empty = function() { - return !this.stack1.length && !this.stack2.length + return !this.stackIn.length && !this.stackOut.length }; ``` @@ -419,9 +418,9 @@ void myQueuePush(MyQueue* obj, int x) { } /* -1.若输出栈为空且当第一个栈中有元素(stackInTop>0时),将第一个栈中元素复制到第二个栈中(stack2[stackTop2++] = stack1[--stackTop1]) +1.若输出栈为空且当第一个栈中有元素(stackInTop>0时),将第一个栈中元素复制到第二个栈中(stackOut[stackTop2++] = stackIn[--stackTop1]) 2.将栈顶元素保存 -3.当stackTop2>0时,将第二个栈中元素复制到第一个栈中(stack1[stackTop1++] = stack2[--stackTop2]) +3.当stackTop2>0时,将第二个栈中元素复制到第一个栈中(stackIn[stackTop1++] = stackOut[--stackTop2]) */ int myQueuePop(MyQueue* obj) { //优化:复制栈顶指针,减少对内存的访问次数 From 595ab6ea07ab52e991865550a05003041088079f Mon Sep 17 00:00:00 2001 From: Martin Hsu <31008681+Martin-Hsu@users.noreply.github.com> Date: Fri, 17 Dec 2021 16:50:37 +0800 Subject: [PATCH 0128/3019] =?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 Use ref --- ...53\230\351\207\215\345\273\272\351\230\237\345\210\227.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" "b/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" index 40756878d3..c31e8440c4 100644 --- "a/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" +++ "b/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" @@ -101,7 +101,7 @@ C++代码如下: // 版本一 class Solution { public: - static bool cmp(const vector a, const vector b) { + static bool cmp(const vector& a, const vector& b) { if (a[0] == b[0]) return a[1] < b[1]; return a[0] > b[0]; } @@ -130,7 +130,7 @@ public: class Solution { public: // 身高从大到小排(身高相同k小的站前面) - static bool cmp(const vector a, const vector b) { + static bool cmp(const vector& a, const vector& b) { if (a[0] == b[0]) return a[1] < b[1]; return a[0] > b[0]; } From 879886acb3a5720dfd60447ca0e4eaae8036a0f0 Mon Sep 17 00:00:00 2001 From: bqlin Date: Fri, 17 Dec 2021 18:53:51 +0800 Subject: [PATCH 0129/3019] =?UTF-8?q?0051.N=E7=9A=87=E5=90=8E=EF=BC=9A?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=8E=92=E7=89=88=EF=BC=8C=E8=A1=A5=E5=85=85?= =?UTF-8?q?Swift=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "problems/0051.N\347\232\207\345\220\216.md" | 65 +++++++++++++++++--- 1 file changed, 57 insertions(+), 8 deletions(-) diff --git "a/problems/0051.N\347\232\207\345\220\216.md" "b/problems/0051.N\347\232\207\345\220\216.md" index d36ac5430f..02aa25df2f 100644 --- "a/problems/0051.N\347\232\207\345\220\216.md" +++ "b/problems/0051.N\347\232\207\345\220\216.md" @@ -33,7 +33,7 @@ n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上, **如果对回溯算法基础还不了解的话,我还特意录制了一期视频:[带你学透回溯算法(理论篇)](https://www.bilibili.com/video/BV1cy4y167mM/)** 可以结合题解和视频一起看,希望对大家理解回溯算法有所帮助。 -都知道n皇后问题是回溯算法解决的经典问题,但是用回溯解决多了组合、切割、子集、排列问题之后,遇到这种二位矩阵还会有点不知所措。 +都知道n皇后问题是回溯算法解决的经典问题,但是用回溯解决多了组合、切割、子集、排列问题之后,遇到这种二维矩阵还会有点不知所措。 首先来看一下皇后们的约束条件: @@ -43,7 +43,7 @@ n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上, 确定完约束条件,来看看究竟要怎么去搜索皇后们的位置,其实搜索皇后的位置,可以抽象为一棵树。 -下面我用一个3 * 3 的棋牌,将搜索过程抽象为一颗树,如图: +下面我用一个 3 * 3 的棋盘,将搜索过程抽象为一颗树,如图: ![51.N皇后](https://img-blog.csdnimg.cn/20210130182532303.jpg) @@ -73,11 +73,11 @@ void backtracking(参数) { 我依然是定义全局变量二维数组result来记录最终结果。 -参数n是棋牌的大小,然后用row来记录当前遍历到棋盘的第几层了。 +参数n是棋盘的大小,然后用row来记录当前遍历到棋盘的第几层了。 代码如下: -``` +```cpp vector> result; void backtracking(int n, int row, vector& chessboard) { ``` @@ -92,7 +92,7 @@ void backtracking(int n, int row, vector& chessboard) { 代码如下: -``` +```cpp if (row == n) { result.push_back(chessboard); return; @@ -107,7 +107,7 @@ if (row == n) { 代码如下: -``` +```cpp for (int col = 0; col < n; col++) { if (isValid(row, col, chessboard, n)) { // 验证合法就可以放 chessboard[row][col] = 'Q'; // 放置皇后 @@ -117,7 +117,7 @@ for (int col = 0; col < n; col++) { } ``` -* 验证棋牌是否合法 +* 验证棋盘是否合法 按照如下标准去重: @@ -163,7 +163,7 @@ class Solution { private: vector> result; // n 为输入的棋盘大小 -// row 是当前递归到棋牌的第几行了 +// row 是当前递归到棋盘的第几行了 void backtracking(int n, int row, vector& chessboard) { if (row == n) { result.push_back(chessboard); @@ -470,7 +470,56 @@ var solveNQueens = function(n) { }; ``` +### Swift + +```swift +func solveNQueens(_ n: Int) -> [[String]] { + var result = [[String]]() + // 棋盘,使用Character的二维数组,以便于更新元素 + var chessboard = [[Character]](repeating: [Character](repeating: ".", count: n), count: n) + // 检查棋盘是否符合N皇后 + func isVaild(row: Int, col: Int) -> Bool { + // 检查列 + for i in 0 ..< row { + if chessboard[i][col] == "Q" { return false } + } + + var i, j: Int + // 检查45度 + i = row - 1 + j = col - 1 + while i >= 0, j >= 0 { + if chessboard[i][j] == "Q" { return false } + i -= 1 + j -= 1 + } + // 检查135度 + i = row - 1 + j = col + 1 + while i >= 0, j < n { + if chessboard[i][j] == "Q" { return false } + i -= 1 + j += 1 + } + + return true + } + func backtracking(row: Int) { + if row == n { + result.append(chessboard.map { String($0) }) + } + for col in 0 ..< n { + guard isVaild(row: row, col: col) else { continue } + chessboard[row][col] = "Q" // 放置皇后 + backtracking(row: row + 1) + chessboard[row][col] = "." // 回溯 + } + } + backtracking(row: 0) + return result +} +``` -----------------------
From 99ff6dd216589b9e9eaa4f1945fe2dc39c44bba8 Mon Sep 17 00:00:00 2001 From: victor Date: Fri, 17 Dec 2021 20:50:00 +0800 Subject: [PATCH 0130/3019] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BA=86707?= =?UTF-8?q?=E8=AE=BE=E8=AE=A1=E9=93=BE=E8=A1=A8javascript=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E9=A2=98=E8=A7=A3=E7=9A=84=E5=88=A0=E9=99=A4=E8=8A=82?= =?UTF-8?q?=E7=82=B9=E6=93=8D=E4=BD=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" | 4 ++++ 1 file changed, 4 insertions(+) diff --git "a/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" "b/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" index 145efa18de..4f2938bcfe 100644 --- "a/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" +++ "b/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" @@ -847,6 +847,10 @@ MyLinkedList.prototype.deleteAtIndex = function(index) { if(index < 0 || index >= this._size) return; if(index === 0) { this._head = this._head.next; + // 如果删除的这个节点同时是尾节点,要处理尾节点 + if(index === this._size - 1){ + this._tail = this._head + } this._size--; return; } From 115fe28b238fb32b3759f6aa57b0e23ae84cebdd Mon Sep 17 00:00:00 2001 From: chengleqi Date: Fri, 17 Dec 2021 21:21:27 +0800 Subject: [PATCH 0131/3019] =?UTF-8?q?update=200116.=E5=A1=AB=E5=85=85?= =?UTF-8?q?=E6=AF=8F=E4=B8=AA=E8=8A=82=E7=82=B9=E7=9A=84=E4=B8=8B=E4=B8=80?= =?UTF-8?q?=E4=B8=AA=E5=8F=B3=E4=BE=A7=E8=8A=82=E7=82=B9=E6=8C=87=E9=92=88?= =?UTF-8?q?.md=20C++=E7=89=88=E6=9C=AC=20=E4=B8=80=E7=A7=8D=E6=9B=B4?= =?UTF-8?q?=E7=AC=A6=E5=90=88=E6=A8=A1=E6=9D=BF=E7=9A=84=E5=B1=82=E5=BA=8F?= =?UTF-8?q?=E9=81=8D=E5=8E=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...02\347\202\271\346\214\207\351\222\210.md" | 29 +++++++------------ 1 file changed, 10 insertions(+), 19 deletions(-) diff --git "a/problems/0116.\345\241\253\345\205\205\346\257\217\344\270\252\350\212\202\347\202\271\347\232\204\344\270\213\344\270\200\344\270\252\345\217\263\344\276\247\350\212\202\347\202\271\346\214\207\351\222\210.md" "b/problems/0116.\345\241\253\345\205\205\346\257\217\344\270\252\350\212\202\347\202\271\347\232\204\344\270\213\344\270\200\344\270\252\345\217\263\344\276\247\350\212\202\347\202\271\346\214\207\351\222\210.md" index b6b723c93d..1af0eaf02b 100644 --- "a/problems/0116.\345\241\253\345\205\205\346\257\217\344\270\252\350\212\202\347\202\271\347\232\204\344\270\213\344\270\200\344\270\252\345\217\263\344\276\247\350\212\202\347\202\271\346\214\207\351\222\210.md" +++ "b/problems/0116.\345\241\253\345\205\205\346\257\217\344\270\252\350\212\202\347\202\271\347\232\204\344\270\213\344\270\200\344\270\252\345\217\263\344\276\247\350\212\202\347\202\271\346\214\207\351\222\210.md" @@ -87,7 +87,7 @@ public: 本题使用层序遍历是最为直观的,如果对层序遍历不了解,看这篇:[二叉树:层序遍历登场!](https://programmercarl.com/0102.二叉树的层序遍历.html)。 -层序遍历本来就是一层一层的去遍历,记录一层的头结点(nodePre),然后让nodePre指向当前遍历的节点就可以了。 +遍历每一行的时候,如果不是最后一个Node,则指向下一个Node;如果是最后一个Node,则指向nullptr。 代码如下: @@ -96,27 +96,18 @@ class Solution { public: Node* connect(Node* root) { queue que; - if (root != NULL) que.push(root); + if (root != nullptr) que.push(root); while (!que.empty()) { int size = que.size(); - vector vec; - Node* nodePre; - Node* node; - for (int i = 0; i < size; i++) { // 开始每一层的遍历 - if (i == 0) { - nodePre = que.front(); // 记录一层的头结点 - que.pop(); - node = nodePre; - } else { - node = que.front(); - que.pop(); - nodePre->next = node; // 本层前一个节点next指向本节点 - nodePre = nodePre->next; - } - if (node->left) que.push(node->left); - if (node->right) que.push(node->right); + for (int i = 0; i < size; ++i) { + Node* node = que.front(); + que.pop(); + if (i != size - 1) { + node->next = que.front(); //如果不是最后一个Node 则指向下一个Node + } else node->next = nullptr; //如果是最后一个Node 则指向nullptr + if (node->left != nullptr) que.push(node->left); + if (node->right != nullptr) que.push(node->right); } - nodePre->next = NULL; // 本层最后一个节点指向NULL } return root; } From 1a1a662ce4f49da18f98bd143f868c984ae07abf Mon Sep 17 00:00:00 2001 From: Martin Hsu <31008681+Martin-Hsu@users.noreply.github.com> Date: Sat, 18 Dec 2021 01:52:37 +0800 Subject: [PATCH 0132/3019] =?UTF-8?q?Update=20=E5=8A=A8=E6=80=81=E8=A7=84?= =?UTF-8?q?=E5=88=92=E7=90=86=E8=AE=BA=E5=9F=BA=E7=A1=80.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\210\222\347\220\206\350\256\272\345\237\272\347\241\200.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/\345\212\250\346\200\201\350\247\204\345\210\222\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\345\212\250\346\200\201\350\247\204\345\210\222\347\220\206\350\256\272\345\237\272\347\241\200.md" index ce7f6a510e..36fb64d7d3 100644 --- "a/problems/\345\212\250\346\200\201\350\247\204\345\210\222\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\345\212\250\346\200\201\350\247\204\345\210\222\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -69,7 +69,7 @@ 相信动规的题目,很大部分同学都是这样做的。 -看一下题解,感觉看懂了,然后照葫芦画瓢,如果能正好画对了,万事大吉,一旦要是没通过,就怎么改都通过不了,对 dp数组的初始化,递归公式,遍历顺序,处于一种黑盒的理解状态。 +看一下题解,感觉看懂了,然后照葫芦画瓢,如果能正好画对了,万事大吉,一旦要是没通过,就怎么改都通过不了,对 dp数组的初始化,递推公式,遍历顺序,处于一种黑盒的理解状态。 写动规题目,代码出问题很正常! From 589519d937152bcaf5061faae3bacf865a6c9071 Mon Sep 17 00:00:00 2001 From: qyg <1600314850@qq.com> Date: Sat, 18 Dec 2021 11:50:05 +0800 Subject: [PATCH 0133/3019] =?UTF-8?q?416.=20=E5=88=86=E5=89=B2=E7=AD=89?= =?UTF-8?q?=E5=92=8C=E5=AD=90=E9=9B=86=EF=BC=9A=E4=BF=AE=E6=94=B9=E5=8A=A8?= =?UTF-8?q?=E8=A7=84=E4=BA=94=E9=83=A8=E6=9B=B2=E6=AD=A5=E9=AA=A41?= =?UTF-8?q?=E4=B8=AD=20i=20=E5=92=8C=20j=20=E7=9A=84=E9=94=99=E8=AF=AF?= =?UTF-8?q?=E4=BD=BF=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...11\262\347\255\211\345\222\214\345\255\220\351\233\206.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" "b/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" index 2c33842acf..178872339a 100644 --- "a/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" +++ "b/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" @@ -77,9 +77,9 @@ 1. 确定dp数组以及下标的含义 -01背包中,dp[i] 表示: 容量为j的背包,所背的物品价值可以最大为dp[j]。 +01背包中,dp[j] 表示: 容量为j的背包,所背的物品价值可以最大为dp[j]。 -**套到本题,dp[i]表示 背包总容量是i,最大可以凑成i的子集总和为dp[i]**。 +**套到本题,dp[j]表示 背包总容量是j,最大可以凑成j的子集总和为dp[j]**。 2. 确定递推公式 From e2443d5240441ce9d06ec0431b91ebd95c149da6 Mon Sep 17 00:00:00 2001 From: qyg <1600314850@qq.com> Date: Sat, 18 Dec 2021 11:51:06 +0800 Subject: [PATCH 0134/3019] =?UTF-8?q?494.=20=E7=9B=AE=E6=A0=87=E5=92=8C?= =?UTF-8?q?=EF=BC=9A=E4=BF=AE=E6=94=B9=E5=8A=A8=E8=A7=84=E4=BA=94=E9=83=A8?= =?UTF-8?q?=E6=9B=B2=E6=AD=A5=E9=AA=A41=E4=B8=AD=20i=20=E5=92=8C=20j=20?= =?UTF-8?q?=E7=9A=84=E9=94=99=E8=AF=AF=E4=BD=BF=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "problems/0494.\347\233\256\346\240\207\345\222\214.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0494.\347\233\256\346\240\207\345\222\214.md" "b/problems/0494.\347\233\256\346\240\207\345\222\214.md" index 1b107c95a7..e2ce920dec 100644 --- "a/problems/0494.\347\233\256\346\240\207\345\222\214.md" +++ "b/problems/0494.\347\233\256\346\240\207\345\222\214.md" @@ -146,7 +146,7 @@ if (abs(S) > sum) return 0; // 此时没有方案 1. 确定dp数组以及下标的含义 -dp[j] 表示:填满j(包括j)这么大容积的包,有dp[i]种方法 +dp[j] 表示:填满j(包括j)这么大容积的包,有dp[j]种方法 其实也可以使用二维dp数组来求解本题,dp[i][j]:使用 下标为[0, i]的nums[i]能够凑满j(包括j)这么大容量的包,有dp[i][j]种方法。 From eb721afa3527e37a702b03b15eb3fd3520b12864 Mon Sep 17 00:00:00 2001 From: bqlin Date: Sat, 18 Dec 2021 13:55:22 +0800 Subject: [PATCH 0135/3019] =?UTF-8?q?0037.=E8=A7=A3=E6=95=B0=E7=8B=AC?= =?UTF-8?q?=EF=BC=9A=E4=BC=98=E5=8C=96=E6=8E=92=E7=89=88=EF=BC=8C=E8=A1=A5?= =?UTF-8?q?=E5=85=85Swift=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...7.\350\247\243\346\225\260\347\213\254.md" | 51 ++++++++++++++++++- 1 file changed, 50 insertions(+), 1 deletion(-) diff --git "a/problems/0037.\350\247\243\346\225\260\347\213\254.md" "b/problems/0037.\350\247\243\346\225\260\347\213\254.md" index a580f27014..3d69b958a3 100644 --- "a/problems/0037.\350\247\243\346\225\260\347\213\254.md" +++ "b/problems/0037.\350\247\243\346\225\260\347\213\254.md" @@ -61,7 +61,7 @@ 代码如下: -``` +```cpp bool backtracking(vector>& board) ``` @@ -504,5 +504,54 @@ void solveSudoku(char** board, int boardSize, int* boardColSize) { } ``` +### Swift + +```swift +func solveSudoku(_ board: inout [[Character]]) { + // 判断对应格子的值是否合法 + func isValid(row: Int, col: Int, val: Character) -> Bool { + // 行中是否重复 + for i in 0 ..< 9 { + if board[row][i] == val { return false } + } + + // 列中是否重复 + for j in 0 ..< 9 { + if board[j][col] == val { return false } + } + + // 9方格内是否重复 + let startRow = row / 3 * 3 + let startCol = col / 3 * 3 + for i in startRow ..< startRow + 3 { + for j in startCol ..< startCol + 3 { + if board[i][j] == val { return false } + } + } + return true + } + + @discardableResult + func backtracking() -> Bool { + for i in 0 ..< board.count { // i:行坐标 + for j in 0 ..< board[0].count { // j:列坐标 + guard board[i][j] == "." else { continue } // 跳过已填写格子 + // 填写格子 + for val in 1 ... 9 { + let charVal = Character("\(val)") + guard isValid(row: i, col: j, val: charVal) else { continue } // 跳过不合法的 + board[i][j] = charVal // 填写 + if backtracking() { return true } + board[i][j] = "." // 回溯:擦除 + } + return false // 遍历完数字都不行 + } + } + return true // 没有不合法的,填写正确 + } + backtracking() +} +``` + -----------------------
From b2f6e0c272610e174e20e35a7cdac5195ab65ac8 Mon Sep 17 00:00:00 2001 From: Tickylime <35446132+Tickylime@users.noreply.github.com> Date: Sun, 19 Dec 2021 23:00:56 +0800 Subject: [PATCH 0136/3019] =?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 --- .../0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" | 3 +++ 1 file changed, 3 insertions(+) diff --git "a/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" "b/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" index 145efa18de..95e90ac690 100644 --- "a/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" +++ "b/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" @@ -706,6 +706,9 @@ func (this *MyLinkedList) AddAtIndex(index int, val int) { head = head.Next index-- } + if index > 0 { + return + } node := &Node{ Val: val, //node.Next = MyLinkedList[index] From a273e8f86f8e67723dbbe4fffa8728e146117569 Mon Sep 17 00:00:00 2001 From: qyg <1600314850@qq.com> Date: Mon, 20 Dec 2021 10:51:56 +0800 Subject: [PATCH 0137/3019] =?UTF-8?q?20210128=E5=8A=A8=E8=A7=84=E5=91=A8?= =?UTF-8?q?=E6=9C=AB=E6=80=BB=E7=BB=93=EF=BC=9A=E4=BF=AE=E6=94=B9=E7=9B=AE?= =?UTF-8?q?=E6=A0=87=E5=92=8C=20=E5=8A=A8=E8=A7=84=E4=BA=94=E9=83=A8?= =?UTF-8?q?=E6=9B=B2=E6=AD=A5=E9=AA=A41=E5=92=8C2=E4=B8=AD=20i=20=E5=92=8C?= =?UTF-8?q?=20j=20=E7=9A=84=E9=94=99=E8=AF=AF=E4=BD=BF=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...47\204\345\221\250\346\234\253\346\200\273\347\273\223.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20210128\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20210128\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" index 06193a7019..83bddaff3b 100644 --- "a/problems/\345\221\250\346\200\273\347\273\223/20210128\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" +++ "b/problems/\345\221\250\346\200\273\347\273\223/20210128\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" @@ -10,11 +10,11 @@ S 和 sum都是固定的,那此时问题就转化为01背包问题(数列中 1. 确定dp数组以及下标的含义 -**dp[j] 表示:填满j(包括j)这么大容积的包,有dp[i]种方法** +**dp[j] 表示:填满j(包括j)这么大容积的包,有dp[j]种方法** 2. 确定递推公式 -dp[i] += dp[j - nums[j]] +dp[j] += dp[j - nums[i]] **注意:求装满背包有几种方法类似的题目,递推公式基本都是这样的**。 From 23725675a81de764c53dafd5f02c1e9bfdcb4dd2 Mon Sep 17 00:00:00 2001 From: db <39407623+IcePigZDB@users.noreply.github.com> Date: Mon, 20 Dec 2021 15:45:51 +0800 Subject: [PATCH 0138/3019] =?UTF-8?q?Update=200102.=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=A0=91=E7=9A=84=E5=B1=82=E5=BA=8F=E9=81=8D=E5=8E=86.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 更新错别字 --- ...\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" index 04b980c641..270dce6f4f 100644 --- "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" +++ "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" @@ -12,7 +12,7 @@ * 107.二叉树的层次遍历II * 199.二叉树的右视图 * 637.二叉树的层平均值 -* 429.N叉树的前序遍历 +* 429.N叉树的层序遍历 * 515.在每个树行中找最大值 * 116.填充每个节点的下一个右侧节点指针 * 117.填充每个节点的下一个右侧节点指针II From f6be40f9d78e1fd46a18d78c3d9ccb9edd61dbe1 Mon Sep 17 00:00:00 2001 From: mengyuan Date: Mon, 20 Dec 2021 19:44:54 +0800 Subject: [PATCH 0139/3019] =?UTF-8?q?update:=200376.=E6=91=86=E5=8A=A8?= =?UTF-8?q?=E5=BA=8F=E5=88=97=20js=E5=8A=A8=E6=80=81=E8=A7=84=E5=88=92?= =?UTF-8?q?=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...06\345\212\250\345\272\217\345\210\227.md" | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git "a/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" "b/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" index 3432ca53fc..b7293635fe 100644 --- "a/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" +++ "b/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" @@ -261,6 +261,7 @@ func wiggleMaxLength(nums []int) int { ``` ### Javascript +**贪心** ```Javascript var wiggleMaxLength = function(nums) { if(nums.length <= 1) return nums.length @@ -277,6 +278,25 @@ var wiggleMaxLength = function(nums) { return result }; ``` +**动态规划** +```Javascript +var wiggleMaxLength = function(nums) { + if (nums.length === 1) return 1; + // 考虑前i个数,当第i个值作为峰谷时的情况(则第i-1是峰顶) + let down = 1; + // 考虑前i个数,当第i个值作为峰顶时的情况(则第i-1是峰谷) + let up = 1; + for (let i = 1; i < nums.length; i++) { + if (nums[i] < nums[i - 1]) { + down = Math.max(up + 1, down); + } + if (nums[i] > nums[i - 1]) { + up = Math.max(down + 1, up) + } + } + return Math.max(down, up); +}; +``` -----------------------
From 1c6ad043466a19f36a449d957b044c759f0df8c6 Mon Sep 17 00:00:00 2001 From: youngyangyang04 <826123027@qq.com> Date: Mon, 20 Dec 2021 22:44:15 +0800 Subject: [PATCH 0140/3019] Update --- README.md | 2 +- ...11\346\225\260\344\271\213\345\222\214.md" | 2 +- ...33\346\225\260\344\271\213\345\222\214.md" | 4 +- ...10\345\271\266\345\214\272\351\227\264.md" | 24 ++++----- ...15\345\217\240\345\214\272\351\227\264.md" | 32 +++++------ ...53\346\211\213\347\273\255\350\264\271.md" | 2 +- ...36\347\232\204\346\225\260\345\255\227.md" | 25 ++++----- ...27\346\257\215\345\214\272\351\227\264.md" | 14 ++--- ...47\344\272\214\345\217\211\346\240\221.md" | 52 +++++++++--------- ...76\350\241\250\347\233\270\344\272\244.md" | 54 ++++++++----------- 10 files changed, 100 insertions(+), 111 deletions(-) diff --git a/README.md b/README.md index 3c20376fde..ceb7bd9255 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@

-

《代码随想录》正式出版啦!!录友专属福利,点击下方可以享五折优惠!详细可以点击这里

+

《代码随想录》正式出版啦!!录友专属福利,点击下方可以享五折优惠!详细可以点击这里

diff --git "a/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" "b/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" index 1e67525456..c951bd8591 100644 --- "a/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" @@ -55,7 +55,7 @@ public: for (int i = 0; i < nums.size(); i++) { // 排序之后如果第一个元素已经大于零,那么不可能凑成三元组 if (nums[i] > 0) { - continue; + break; } if (i > 0 && nums[i] == nums[i - 1]) { //三元组元素a去重 continue; diff --git "a/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" "b/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" index cf9ba9c10b..b6ff7c3bec 100644 --- "a/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" @@ -91,7 +91,8 @@ public: // 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) { + // nums[k] + nums[i] + nums[left] + nums[right] < target 会溢出 + } else if (nums[k] + nums[i] < target - (nums[left] + nums[right])) { left++; } else { result.push_back(vector{nums[k], nums[i], nums[left], nums[right]}); @@ -111,6 +112,7 @@ public: } }; + ``` diff --git "a/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" "b/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" index 2732f5ee74..51a8d3211d 100644 --- "a/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" +++ "b/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" @@ -5,22 +5,22 @@

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

-## 56. 合并区间 +# 56. 合并区间 [力扣题目链接](https://leetcode-cn.com/problems/merge-intervals/) 给出一个区间的集合,请合并所有重叠的区间。 示例 1: -输入: intervals = [[1,3],[2,6],[8,10],[15,18]] -输出: [[1,6],[8,10],[15,18]] -解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6]. +* 输入: intervals = [[1,3],[2,6],[8,10],[15,18]] +* 输出: [[1,6],[8,10],[15,18]] +* 解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6]. 示例 2: -输入: intervals = [[1,4],[4,5]] -输出: [[1,5]] -解释: 区间 [1,4] 和 [4,5] 可被视为重叠区间。 -注意:输入类型已于2019年4月15日更改。 请重置默认代码定义以获取新方法签名。 +* 输入: intervals = [[1,4],[4,5]] +* 输出: [[1,5]] +* 解释: 区间 [1,4] 和 [4,5] 可被视为重叠区间。 +* 注意:输入类型已于2019年4月15日更改。 请重置默认代码定义以获取新方法签名。 提示: @@ -134,7 +134,7 @@ public: ## 其他语言版本 -Java: +### Java ```java class Solution { public int[][] merge(int[][] intervals) { @@ -178,7 +178,7 @@ class Solution { } ``` -Python: +### Python ```python class Solution: def merge(self, intervals: List[List[int]]) -> List[List[int]]: @@ -195,7 +195,7 @@ class Solution: return result ``` -Go: +### Go ```golang func merge(intervals [][]int) [][]int { //先从小到大排序 @@ -220,7 +220,7 @@ func max(a,b int)int{ } ``` -Javascript: +### Javascript ```javascript var merge = function (intervals) { intervals.sort((a, b) => a[0] - b[0]); diff --git "a/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" "b/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" index 9b8435812f..038cc987fa 100644 --- "a/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" +++ "b/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" @@ -5,7 +5,7 @@

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

-## 435. 无重叠区间 +# 435. 无重叠区间 [力扣题目链接](https://leetcode-cn.com/problems/non-overlapping-intervals/) @@ -16,19 +16,19 @@ 区间 [1,2] 和 [2,3] 的边界相互“接触”,但没有相互重叠。 示例 1: -输入: [ [1,2], [2,3], [3,4], [1,3] ] -输出: 1 -解释: 移除 [1,3] 后,剩下的区间没有重叠。 +* 输入: [ [1,2], [2,3], [3,4], [1,3] ] +* 输出: 1 +* 解释: 移除 [1,3] 后,剩下的区间没有重叠。 示例 2: -输入: [ [1,2], [1,2], [1,2] ] -输出: 2 -解释: 你需要移除两个 [1,2] 来使剩下的区间没有重叠。 +* 输入: [ [1,2], [1,2], [1,2] ] +* 输出: 2 +* 解释: 你需要移除两个 [1,2] 来使剩下的区间没有重叠。 示例 3: -输入: [ [1,2], [2,3] ] -输出: 0 -解释: 你不需要移除任何区间,因为它们已经是无重叠的了。 +* 输入: [ [1,2], [2,3] ] +* 输出: 0 +* 解释: 你不需要移除任何区间,因为它们已经是无重叠的了。 ## 思路 @@ -179,7 +179,7 @@ public: ## 其他语言版本 -Java: +### Java ```java class Solution { public int eraseOverlapIntervals(int[][] intervals) { @@ -209,7 +209,6 @@ class Solution { } ``` -Java: 按左边排序,不管右边顺序。相交的时候取最小的右边。 ```java class Solution { @@ -232,7 +231,7 @@ class Solution { } ``` -Python: +### Python ```python class Solution: def eraseOverlapIntervals(self, intervals: List[List[int]]) -> int: @@ -247,7 +246,7 @@ class Solution: return len(intervals) - count ``` -Go: +### Go ```golang func eraseOverlapIntervals(intervals [][]int) int { var flag int @@ -270,8 +269,9 @@ func min(a,b int)int{ } return a } -``` -Javascript: +``` + +### Javascript: - 按右边界排序 ```Javascript var eraseOverlapIntervals = function(intervals) { diff --git "a/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271.md" "b/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271.md" index f7ddeaf74b..5b54a29deb 100644 --- "a/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271.md" +++ "b/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271.md" @@ -5,7 +5,7 @@

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

-## 714. 买卖股票的最佳时机含手续费 +# 714. 买卖股票的最佳时机含手续费 [力扣题目链接](https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-with-transaction-fee/) diff --git "a/problems/0738.\345\215\225\350\260\203\351\200\222\345\242\236\347\232\204\346\225\260\345\255\227.md" "b/problems/0738.\345\215\225\350\260\203\351\200\222\345\242\236\347\232\204\346\225\260\345\255\227.md" index 6baaa82761..6f8cc58ee1 100644 --- "a/problems/0738.\345\215\225\350\260\203\351\200\222\345\242\236\347\232\204\346\225\260\345\255\227.md" +++ "b/problems/0738.\345\215\225\350\260\203\351\200\222\345\242\236\347\232\204\346\225\260\345\255\227.md" @@ -5,7 +5,7 @@

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

-## 738.单调递增的数字 +# 738.单调递增的数字 [力扣题目链接](https://leetcode-cn.com/problems/monotone-increasing-digits/) 给定一个非负整数 N,找出小于或等于 N 的最大的整数,同时这个整数需要满足其各个位数上的数字是单调递增。 @@ -13,16 +13,16 @@ (当且仅当每个相邻位数上的数字 x 和 y 满足 x <= y 时,我们称这个整数是单调递增的。) 示例 1: -输入: N = 10 -输出: 9 +* 输入: N = 10 +* 输出: 9 示例 2: -输入: N = 1234 -输出: 1234 +* 输入: N = 1234 +* 输出: 1234 示例 3: -输入: N = 332 -输出: 299 +* 输入: N = 332 +* 输出: 299 说明: N 是在 [0, 10^9] 范围内的一个整数。 @@ -123,7 +123,7 @@ public: ## 其他语言版本 -Java: +### Java: ```java 版本1 class Solution { @@ -170,8 +170,8 @@ class Solution { ``` -Python: -```python3 +### Python: +```python class Solution: def monotoneIncreasingDigits(self, n: int) -> int: a = list(str(n)) @@ -182,7 +182,7 @@ class Solution: return int("".join(a)) ``` -Go: +### Go ```golang func monotoneIncreasingDigits(N int) int { s := strconv.Itoa(N)//将数字转为字符串,方便使用下标 @@ -203,7 +203,8 @@ func monotoneIncreasingDigits(N int) int { return res } ``` -Javascript: + +### Javascript ```Javascript var monotoneIncreasingDigits = function(n) { n = n.toString() diff --git "a/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" "b/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" index 40318726ff..6117ffc782 100644 --- "a/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" +++ "b/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" @@ -5,15 +5,15 @@

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

-## 763.划分字母区间 +# 763.划分字母区间 [力扣题目链接](https://leetcode-cn.com/problems/partition-labels/) 字符串 S 由小写字母组成。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。返回一个表示每个字符串片段的长度的列表。 示例: -输入:S = "ababcbacadefegdehijhklij" -输出:[9,7,8] +* 输入:S = "ababcbacadefegdehijhklij" +* 输出:[9,7,8] 解释: 划分结果为 "ababcbaca", "defegde", "hijhklij"。 每个字母最多出现在一个片段中。 @@ -81,7 +81,7 @@ public: ## 其他语言版本 -Java: +### Java ```java class Solution { public List partitionLabels(String S) { @@ -105,7 +105,7 @@ class Solution { } ``` -Python: +### Python ```python class Solution: def partitionLabels(self, s: str) -> List[int]: @@ -124,7 +124,7 @@ class Solution: ``` -Go: +### Go ```go @@ -153,7 +153,7 @@ func max(a, b int) int { } ``` -Javascript: +### Javascript ```Javascript var partitionLabels = function(s) { let hash = {} diff --git "a/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" "b/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" index d777920535..7d76aaba2b 100644 --- "a/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" @@ -5,7 +5,7 @@

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

-## 968.监控二叉树 +# 968.监控二叉树 [力扣题目链接](https://leetcode-cn.com/problems/binary-tree-cameras/) @@ -19,17 +19,17 @@ ![](https://img-blog.csdnimg.cn/20201229175736596.png) -输入:[0,0,null,0,0] -输出:1 -解释:如图所示,一台摄像头足以监控所有节点。 +* 输入:[0,0,null,0,0] +* 输出:1 +* 解释:如图所示,一台摄像头足以监控所有节点。 示例 2: ![](https://img-blog.csdnimg.cn/2020122917584449.png) -输入:[0,0,null,0,null,0,null,null,0] -输出:2 -解释:需要至少两个摄像头来监视树的所有节点。 上图显示了摄像头放置的有效位置之一。 +* 输入:[0,0,null,0,null,0,null,null,0] +* 输出:2 +* 解释:需要至少两个摄像头来监视树的所有节点。 上图显示了摄像头放置的有效位置之一。 提示: @@ -72,17 +72,17 @@ 后序遍历代码如下: ``` - int traversal(TreeNode* cur) { +int traversal(TreeNode* cur) { - // 空节点,该节点有覆盖 - if (终止条件) return ; + // 空节点,该节点有覆盖 + if (终止条件) return ; - int left = traversal(cur->left); // 左 - int right = traversal(cur->right); // 右 + int left = traversal(cur->left); // 左 + int right = traversal(cur->right); // 右 - 逻辑处理 // 中 - return ; - } + 逻辑处理 // 中 + return ; +} ``` **注意在以上代码中我们取了左孩子的返回值,右孩子的返回值,即left 和 right, 以后推导中间节点的状态** @@ -212,7 +212,7 @@ int minCameraCover(TreeNode* root) { (**以下我的代码注释很详细,为了把情况说清楚,特别把每种情况列出来。**) -## C++代码 +C++代码如下: ```CPP // 版本一 @@ -313,7 +313,7 @@ public: ## 其他语言版本 -Java: +### Java ```java class Solution { private int count = 0; @@ -343,14 +343,8 @@ 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 minCameraCover(self, root: TreeNode) -> int: # Greedy Algo: @@ -397,8 +391,9 @@ class Solution: result += 1 return result -``` -Go: +``` + +### Go ```go const inf = math.MaxInt64 / 2 @@ -427,7 +422,8 @@ func min(a, b int) int { } ``` -Javascript: + +### Javascript ```Javascript var minCameraCover = function(root) { let result = 0 @@ -464,7 +460,7 @@ var minCameraCover = function(root) { }; ``` -C: +### C ```c /* **函数后序遍历二叉树。判断一个结点状态时,根据其左右孩子结点的状态进行判断 diff --git "a/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" "b/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" index e3c284c0ab..21104aea52 100644 --- "a/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" +++ "b/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" @@ -5,24 +5,35 @@

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

-## 面试题 02.07. 链表相交 +# 面试题 02.07. 链表相交 [力扣题目链接](https://leetcode-cn.com/problems/intersection-of-two-linked-lists-lcci/) -给定两个(单向)链表,判定它们是否相交并返回交点。请注意相交的定义基于节点的引用,而不是基于节点的值。换句话说,如果一个链表的第k个节点与另一个链表的第j个节点是同一节点(引用完全相同),则这两个链表相交。 +给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。 -示例 1: +图示两个链表在节点 c1 开始相交: -输入:listA = [4,1,8,4,5], listB = [5,0,1,8,4,5] +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211219221657.png) -输出:Reference of the node with value = 8 +题目数据 保证 整个链式结构中不存在环。 -输入解释:相交节点的值为 8 (注意,如果两个列表相交则不能为 0)。从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [5,0,1,8,4,5]。在 A 中,相交节点前有 2 个节点;在 B 中,相交节点前有 3 个节点。 +注意,函数返回结果后,链表必须 保持其原始结构 。 + +示例 1: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211219221723.png) + +示例 2: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211219221749.png) + +示例 3: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211219221812.png)![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211219221812.png) ## 思路 -本来很简洁明了的一道题,让题目描述搞的云里雾里的。 简单来说,就是求两个链表交点节点的**指针**。 这里同学们要注意,交点不是数值相等,而是指针相等。 @@ -89,19 +100,8 @@ public: ## 其他语言版本 -Java: +### Java ```Java -/** - * Definition for singly-linked list. - * public class ListNode { - * int val; - * ListNode next; - * ListNode(int x) { - * val = x; - * next = null; - * } - * } - */ public class Solution { public ListNode getIntersectionNode(ListNode headA, ListNode headB) { ListNode curA = headA; @@ -148,13 +148,8 @@ public class Solution { } ``` -Python: +### Python ```python -# Definition for singly-linked list. -# class ListNode: -# def __init__(self, x): -# self.val = x -# self.next = None class Solution: def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> ListNode: @@ -175,7 +170,7 @@ class Solution: return cur_a ``` -Go: +### Go ```go func getIntersectionNode(headA, headB *ListNode) *ListNode { @@ -213,14 +208,9 @@ func getIntersectionNode(headA, headB *ListNode) *ListNode { } ``` -javaScript: +### javaScript ```js -/** - * @param {ListNode} headA - * @param {ListNode} headB - * @return {ListNode} - */ var getListLen = function(head) { let len = 0, cur = head; while(cur) { From 2793db9231902a269e97653e2dd888167b6bf131 Mon Sep 17 00:00:00 2001 From: youngyangyang04 <826123027@qq.com> Date: Mon, 20 Dec 2021 22:55:18 +0800 Subject: [PATCH 0141/3019] =?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 --- .../0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" | 2 +- ...\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" | 2 +- .../0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" | 2 +- ...\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" | 2 +- .../0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" | 2 +- ...225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" | 2 +- ...\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" | 2 +- ...\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" | 2 +- .../0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" | 2 +- "problems/0028.\345\256\236\347\216\260strStr.md" | 2 +- ...\270\213\344\270\200\344\270\252\346\216\222\345\210\227.md" | 2 +- ...\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" | 2 +- ...\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" | 2 +- "problems/0037.\350\247\243\346\225\260\347\213\254.md" | 2 +- .../0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" | 2 +- .../0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" | 2 +- "problems/0042.\346\216\245\351\233\250\346\260\264.md" | 2 +- .../0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" | 2 +- "problems/0046.\345\205\250\346\216\222\345\210\227.md" | 2 +- "problems/0047.\345\205\250\346\216\222\345\210\227II.md" | 2 +- "problems/0051.N\347\232\207\345\220\216.md" | 2 +- "problems/0052.N\347\232\207\345\220\216II.md" | 2 +- ...\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" | 2 +- ...\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" | 2 +- .../0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" | 2 +- .../0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" | 2 +- .../0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" | 2 +- .../0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" | 2 +- .../0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" | 2 +- "problems/0070.\347\210\254\346\245\274\346\242\257.md" | 2 +- ...\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md" | 2 +- .../0072.\347\274\226\350\276\221\350\267\235\347\246\273.md" | 2 +- "problems/0077.\347\273\204\345\220\210.md" | 2 +- .../0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" | 2 +- "problems/0078.\345\255\220\351\233\206.md" | 2 +- ...\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" | 2 +- "problems/0090.\345\255\220\351\233\206II.md" | 2 +- .../0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" | 2 +- ...\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" | 2 +- ...\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" | 2 +- .../0100.\347\233\270\345\220\214\347\232\204\346\240\221.md" | 2 +- ...\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" | 2 +- ...\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" | 2 +- ...\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" | 2 +- ...\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" | 2 +- ...\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" | 2 +- ...\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" | 2 +- ...\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" | 2 +- .../0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" | 2 +- ...\220\214\347\232\204\345\255\220\345\272\217\345\210\227.md" | 2 +- ...\276\247\350\212\202\347\202\271\346\214\207\351\222\210.md" | 2 +- ...\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" | 2 +- ...32\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" | 2 +- ...\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" | 2 +- ...2\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" | 2 +- .../0127.\345\215\225\350\257\215\346\216\245\351\276\231.md" | 2 +- ...\202\271\346\225\260\345\255\227\344\271\213\345\222\214.md" | 2 +- ...\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" | 2 +- ...10\206\345\211\262\345\233\236\346\226\207\344\270\262II.md" | 2 +- "problems/0134.\345\212\240\346\262\271\347\253\231.md" | 2 +- .../0135.\345\210\206\345\217\221\347\263\226\346\236\234.md" | 2 +- .../0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" | 2 +- .../0141.\347\216\257\345\275\242\351\223\276\350\241\250.md" | 2 +- .../0142.\347\216\257\345\275\242\351\223\276\350\241\250II.md" | 2 +- .../0143.\351\207\215\346\216\222\351\223\276\350\241\250.md" | 2 +- ...\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" | 2 +- ...\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" | 2 +- .../0160.\347\233\270\344\272\244\351\223\276\350\241\250.md" | 2 +- ...32\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" | 2 +- .../0189.\346\227\213\350\275\254\346\225\260\347\273\204.md" | 2 +- .../0198.\346\211\223\345\256\266\345\212\253\350\210\215.md" | 2 +- "problems/0202.\345\277\253\344\271\220\346\225\260.md" | 2 +- ...\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" | 2 +- ...\220\214\346\236\204\345\255\227\347\254\246\344\270\262.md" | 2 +- .../0206.\347\277\273\350\275\254\351\223\276\350\241\250.md" | 2 +- ...\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" | 2 +- .../0213.\346\211\223\345\256\266\345\212\253\350\210\215II.md" | 2 +- ...0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" | 2 +- ...\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" | 2 +- ...\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" | 2 +- ...\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" | 2 +- ...\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" | 2 +- .../0234.\345\233\236\346\226\207\351\223\276\350\241\250.md" | 2 +- ...\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" | 2 +- ...\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" | 2 +- ...\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" | 2 +- ...\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" | 2 +- ...\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" | 2 +- ...\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" | 2 +- "problems/0283.\347\247\273\345\212\250\351\233\266.md" | 2 +- ...\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" | 2 +- ...\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" | 2 +- .../0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" | 2 +- ...\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" | 2 +- ...0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" | 2 +- .../0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" | 2 +- ...\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" | 2 +- ...\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" | 2 +- ...\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" | 2 +- .../0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" | 2 +- ...\273\204\345\220\210\346\200\273\345\222\214\342\205\243.md" | 2 +- "problems/0383.\350\265\216\351\207\221\344\277\241.md" | 2 +- ...\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" | 2 +- ...\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" | 2 +- ...\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" | 2 +- ...\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" | 2 +- ...\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" | 2 +- ...\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" | 2 +- ...\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" | 2 +- .../0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" | 2 +- .../0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" | 2 +- ...\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" | 2 +- ...\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" | 2 +- "problems/0474.\344\270\200\345\222\214\351\233\266.md" | 2 +- ...\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" | 2 +- "problems/0494.\347\233\256\346\240\207\345\222\214.md" | 2 +- ...270\252\346\233\264\345\244\247\345\205\203\347\264\240I.md" | 2 +- ...\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" | 2 +- ...70\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" | 2 +- ...\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" | 2 +- ...\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" | 2 +- ...\233\236\346\226\207\345\255\220\345\272\217\345\210\227.md" | 2 +- .../0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" | 2 +- ...\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" | 2 +- ...\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md" | 2 +- ...17\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" | 2 +- ...\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" | 2 +- ...\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md" | 2 +- .../0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" | 2 +- "problems/0649.Dota2\345\217\202\350\256\256\351\231\242.md" | 2 +- ...\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" | 2 +- ...\220\246\350\277\224\345\233\236\345\216\237\347\202\271.md" | 2 +- ...\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" | 2 +- ...\272\217\345\210\227\347\232\204\344\270\252\346\225\260.md" | 2 +- ...\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" | 2 +- .../0684.\345\206\227\344\275\231\350\277\236\346\216\245.md" | 2 +- .../0685.\345\206\227\344\275\231\350\277\236\346\216\245II.md" | 2 +- ...\240\221\344\270\255\347\232\204\346\220\234\347\264\242.md" | 2 +- ...\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" | 2 +- .../0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" | 2 +- .../0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" | 2 +- ...\234\272\345\220\253\346\211\213\347\273\255\350\264\271.md" | 2 +- ...\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" | 2 +- ...\207\215\345\244\215\345\255\220\346\225\260\347\273\204.md" | 2 +- ...\232\204\344\270\255\345\277\203\347\264\242\345\274\225.md" | 2 +- ...\200\222\345\242\236\347\232\204\346\225\260\345\255\227.md" | 2 +- .../0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" | 2 +- ...\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" | 2 +- ...\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" | 2 +- ...\222\245\345\214\231\345\222\214\346\210\277\351\227\264.md" | 2 +- ...\240\274\347\232\204\345\255\227\347\254\246\344\270\262.md" | 2 +- ...\237\240\346\252\254\346\260\264\346\211\276\351\233\266.md" | 2 +- ...01\266\346\216\222\345\272\217\346\225\260\347\273\204II.md" | 2 +- .../0925.\351\225\277\346\214\211\351\224\256\345\205\245.md" | 2 +- ...\232\204\345\261\261\350\204\211\346\225\260\347\273\204.md" | 2 +- ...\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" | 2 +- ...\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" | 2 +- ...\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md" | 2 +- ...\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" | 2 +- ...\270\215\347\233\270\344\272\244\347\232\204\347\272\277.md" | 2 +- ...\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" | 2 +- ...37\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" | 2 +- ...\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" | 2 +- ...\232\204\345\207\272\347\216\260\346\254\241\346\225\260.md" | 2 +- ...\271\263\350\241\241\345\255\227\347\254\246\344\270\262.md" | 2 +- ...\232\204\346\225\260\347\233\256\346\216\222\345\272\217.md" | 2 +- ...\225\260\345\255\227\347\232\204\346\225\260\345\255\227.md" | 2 +- ...\264\242\346\240\221\345\217\230\345\271\263\350\241\241.md" | 2 +- ...\253\237\346\230\257\345\244\232\345\244\247\357\274\237.md" | 2 +- ...\272\206\344\270\211\346\255\245\351\223\272\345\236\253.md" | 2 +- ...\275\222\345\270\246\347\235\200\345\233\236\346\272\257.md" | 2 +- ...\217\211\346\240\221\346\200\273\347\273\223\347\257\207.md" | 2 +- ...\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" | 2 +- ...\273\237\344\270\200\350\277\255\344\273\243\346\263\225.md" | 2 +- ...\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" | 2 +- ...\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" | 2 +- ...\203\275\345\234\250\350\277\231\351\207\214\357\274\201.md" | 2 +- ...Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" | 2 +- ...\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" | 2 +- ...\227\256\351\242\230\346\200\273\347\273\223\347\257\207.md" | 2 +- ...\247\204\345\210\222\346\200\273\347\273\223\347\257\207.md" | 2 +- ...\210\222\347\220\206\350\256\272\345\237\272\347\241\200.md" | 2 +- ...\217\214\346\214\207\351\222\210\346\200\273\347\273\223.md" | 2 +- ...\223\210\345\270\214\350\241\250\346\200\273\347\273\223.md" | 2 +- ...\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" | 2 +- "problems/\345\233\236\346\272\257\346\200\273\347\273\223.md" | 2 +- ...\217\246\344\270\200\347\247\215\345\206\231\346\263\225.md" | 2 +- ...\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md" | 2 +- ...\255\227\347\254\246\344\270\262\346\200\273\347\273\223.md" | 2 +- ...\225\260\347\273\204\346\200\273\347\273\223\347\257\207.md" | 2 +- ...\273\204\347\220\206\350\256\272\345\237\272\347\241\200.md" | 2 +- ...\270\216\351\230\237\345\210\227\346\200\273\347\273\223.md" | 2 +- ...\210\227\347\220\206\350\256\272\345\237\272\347\241\200.md" | 2 +- ...\216\237\347\220\206\350\256\262\350\247\243\357\274\211.md" | 2 +- "problems/\347\256\227\346\263\225\346\250\241\346\235\277.md" | 2 +- ...\203\214\345\214\205\346\200\273\347\273\223\347\257\207.md" | 2 +- ...\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" | 2 +- ...\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" | 2 +- ...\241\200\345\244\232\351\207\215\350\203\214\345\214\205.md" | 2 +- ...\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" | 2 +- ...\256\227\346\263\225\346\200\273\347\273\223\347\257\207.md" | 2 +- ...\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md" | 2 +- ...\223\276\350\241\250\346\200\273\347\273\223\347\257\207.md" | 2 +- ...\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" | 2 +- ...3002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" | 2 +- 205 files changed, 205 insertions(+), 205 deletions(-) diff --git "a/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" "b/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" index f612a11017..37c95736a9 100644 --- "a/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" "b/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" index c54de0397b..d651a14785 100644 --- "a/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" +++ "b/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" "b/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" index 3b1e8a87cc..c78ab06d3f 100644 --- "a/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" "b/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" index b3bbf122bd..146493e996 100644 --- "a/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" +++ "b/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" "b/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" index 488e9ee6ee..b94ebeef8c 100644 --- "a/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" "b/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" index 188c4c5776..e041937f87 100644 --- "a/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" +++ "b/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" "b/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" index ec49c1c99c..9e4046d4d5 100644 --- "a/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" +++ "b/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" "b/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" index aa1e11182f..9b9c6689d5 100644 --- "a/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" +++ "b/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" "b/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" index b0376f515f..693684f3d7 100644 --- "a/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" +++ "b/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0028.\345\256\236\347\216\260strStr.md" "b/problems/0028.\345\256\236\347\216\260strStr.md" index cc73420b86..ef7008bc05 100644 --- "a/problems/0028.\345\256\236\347\216\260strStr.md" +++ "b/problems/0028.\345\256\236\347\216\260strStr.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0031.\344\270\213\344\270\200\344\270\252\346\216\222\345\210\227.md" "b/problems/0031.\344\270\213\344\270\200\344\270\252\346\216\222\345\210\227.md" index 2dad8b27af..10ee0aaa31 100644 --- "a/problems/0031.\344\270\213\344\270\200\344\270\252\346\216\222\345\210\227.md" +++ "b/problems/0031.\344\270\213\344\270\200\344\270\252\346\216\222\345\210\227.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" "b/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" index 44f1329525..618fa395d2 100644 --- "a/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" +++ "b/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" "b/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" index 1f66e6bd7a..f5f041aa7f 100644 --- "a/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" +++ "b/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0037.\350\247\243\346\225\260\347\213\254.md" "b/problems/0037.\350\247\243\346\225\260\347\213\254.md" index a580f27014..53b5c1b4de 100644 --- "a/problems/0037.\350\247\243\346\225\260\347\213\254.md" +++ "b/problems/0037.\350\247\243\346\225\260\347\213\254.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" "b/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" index 81be41fd2c..e78f2e2d86 100644 --- "a/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" +++ "b/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" "b/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" index ac1970e1c9..31011ed639 100644 --- "a/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" +++ "b/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0042.\346\216\245\351\233\250\346\260\264.md" "b/problems/0042.\346\216\245\351\233\250\346\260\264.md" index 2022f6cc58..2774560794 100644 --- "a/problems/0042.\346\216\245\351\233\250\346\260\264.md" +++ "b/problems/0042.\346\216\245\351\233\250\346\260\264.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" "b/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" index 55634b5565..a39c064ae6 100644 --- "a/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" +++ "b/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0046.\345\205\250\346\216\222\345\210\227.md" "b/problems/0046.\345\205\250\346\216\222\345\210\227.md" index a37f6da3ec..3d31db6212 100644 --- "a/problems/0046.\345\205\250\346\216\222\345\210\227.md" +++ "b/problems/0046.\345\205\250\346\216\222\345\210\227.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0047.\345\205\250\346\216\222\345\210\227II.md" "b/problems/0047.\345\205\250\346\216\222\345\210\227II.md" index 167e4b760e..6a94d1e0aa 100644 --- "a/problems/0047.\345\205\250\346\216\222\345\210\227II.md" +++ "b/problems/0047.\345\205\250\346\216\222\345\210\227II.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0051.N\347\232\207\345\220\216.md" "b/problems/0051.N\347\232\207\345\220\216.md" index d36ac5430f..ecc8337706 100644 --- "a/problems/0051.N\347\232\207\345\220\216.md" +++ "b/problems/0051.N\347\232\207\345\220\216.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0052.N\347\232\207\345\220\216II.md" "b/problems/0052.N\347\232\207\345\220\216II.md" index 68343e0cc1..78531798c4 100644 --- "a/problems/0052.N\347\232\207\345\220\216II.md" +++ "b/problems/0052.N\347\232\207\345\220\216II.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" "b/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" index 8c62440e15..d699d49aaf 100644 --- "a/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" +++ "b/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" "b/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" index e88f996108..2e9d2fd55f 100644 --- "a/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" +++ "b/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" "b/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" index 25d5f0bd66..c0890f75f3 100644 --- "a/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" +++ "b/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" "b/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" index 0bb909dce5..a9caeaf057 100644 --- "a/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" +++ "b/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" "b/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" index 306b917b76..c7e91b4d7e 100644 --- "a/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" +++ "b/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" "b/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" index 25dc7ad839..38481b50d6 100644 --- "a/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" +++ "b/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" "b/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" index 73186314f8..490b6b5c95 100644 --- "a/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" +++ "b/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0070.\347\210\254\346\245\274\346\242\257.md" "b/problems/0070.\347\210\254\346\245\274\346\242\257.md" index cf8f2fe73c..ec6ff35145 100644 --- "a/problems/0070.\347\210\254\346\245\274\346\242\257.md" +++ "b/problems/0070.\347\210\254\346\245\274\346\242\257.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0070.\347\210\254\346\245\274\346\242\257\345\256\214\345\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md" "b/problems/0070.\347\210\254\346\245\274\346\242\257\345\256\214\345\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md" index 20b49a114d..b5fbb96a19 100644 --- "a/problems/0070.\347\210\254\346\245\274\346\242\257\345\256\214\345\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md" +++ "b/problems/0070.\347\210\254\346\245\274\346\242\257\345\256\214\345\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0072.\347\274\226\350\276\221\350\267\235\347\246\273.md" "b/problems/0072.\347\274\226\350\276\221\350\267\235\347\246\273.md" index eeb9d40204..3802c228d6 100644 --- "a/problems/0072.\347\274\226\350\276\221\350\267\235\347\246\273.md" +++ "b/problems/0072.\347\274\226\350\276\221\350\267\235\347\246\273.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0077.\347\273\204\345\220\210.md" "b/problems/0077.\347\273\204\345\220\210.md" index ef7031e3cd..2bf856df13 100644 --- "a/problems/0077.\347\273\204\345\220\210.md" +++ "b/problems/0077.\347\273\204\345\220\210.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" "b/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" index d7f7bc38f0..b713bdcdf6 100644 --- "a/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" +++ "b/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0078.\345\255\220\351\233\206.md" "b/problems/0078.\345\255\220\351\233\206.md" index 133c55ac22..f263c3fc59 100644 --- "a/problems/0078.\345\255\220\351\233\206.md" +++ "b/problems/0078.\345\255\220\351\233\206.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" "b/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" index 7dc20af25a..3cb51f1d82 100644 --- "a/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" +++ "b/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0090.\345\255\220\351\233\206II.md" "b/problems/0090.\345\255\220\351\233\206II.md" index 1761280182..5b92517aa6 100644 --- "a/problems/0090.\345\255\220\351\233\206II.md" +++ "b/problems/0090.\345\255\220\351\233\206II.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" "b/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" index 5118810d9a..3e7cd1ade2 100644 --- "a/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" +++ "b/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0096.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0096.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" index 1f6d0962a3..43d4cfb066 100644 --- "a/problems/0096.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" +++ "b/problems/0096.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" index 82d1941ebd..4ed2961977 100644 --- "a/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" +++ "b/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0100.\347\233\270\345\220\214\347\232\204\346\240\221.md" "b/problems/0100.\347\233\270\345\220\214\347\232\204\346\240\221.md" index ef5db23ae2..5e805d0111 100644 --- "a/problems/0100.\347\233\270\345\220\214\347\232\204\346\240\221.md" +++ "b/problems/0100.\347\233\270\345\220\214\347\232\204\346\240\221.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" "b/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" index 3dfe863070..b9dff99ce2 100644 --- "a/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" index 04b980c641..7ee6e95cc3 100644 --- "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" +++ "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" "b/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" index 82a82fd5a8..7a6478443a 100644 --- "a/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" +++ "b/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" "b/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" index 41e15a7976..30ec684d2a 100644 --- "a/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" index 3d0f7b522c..194f69df50 100644 --- "a/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" +++ "b/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" "b/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" index a88aa63768..83e8146d2c 100644 --- "a/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" "b/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" index 20914b5a95..fc93d91808 100644 --- "a/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" +++ "b/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" "b/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" index 19f4bcac7e..ec346d6bf7 100644 --- "a/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" +++ "b/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0115.\344\270\215\345\220\214\347\232\204\345\255\220\345\272\217\345\210\227.md" "b/problems/0115.\344\270\215\345\220\214\347\232\204\345\255\220\345\272\217\345\210\227.md" index 9a011378e0..0f76296949 100644 --- "a/problems/0115.\344\270\215\345\220\214\347\232\204\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0115.\344\270\215\345\220\214\347\232\204\345\255\220\345\272\217\345\210\227.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0116.\345\241\253\345\205\205\346\257\217\344\270\252\350\212\202\347\202\271\347\232\204\344\270\213\344\270\200\344\270\252\345\217\263\344\276\247\350\212\202\347\202\271\346\214\207\351\222\210.md" "b/problems/0116.\345\241\253\345\205\205\346\257\217\344\270\252\350\212\202\347\202\271\347\232\204\344\270\213\344\270\200\344\270\252\345\217\263\344\276\247\350\212\202\347\202\271\346\214\207\351\222\210.md" index b6b723c93d..31c81703e2 100644 --- "a/problems/0116.\345\241\253\345\205\205\346\257\217\344\270\252\350\212\202\347\202\271\347\232\204\344\270\213\344\270\200\344\270\252\345\217\263\344\276\247\350\212\202\347\202\271\346\214\207\351\222\210.md" +++ "b/problems/0116.\345\241\253\345\205\205\346\257\217\344\270\252\350\212\202\347\202\271\347\232\204\344\270\213\344\270\200\344\270\252\345\217\263\344\276\247\350\212\202\347\202\271\346\214\207\351\222\210.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" "b/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" index b299e5ae0c..e7c0ac65ba 100644 --- "a/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" +++ "b/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" index 5f917983cd..83b852c6c0 100644 --- "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" +++ "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" index 17a96b3633..e5fdd53dd7 100644 --- "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" +++ "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" "b/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" index 4ab5f53cc8..4a8df2b9a3 100644 --- "a/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" +++ "b/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0127.\345\215\225\350\257\215\346\216\245\351\276\231.md" "b/problems/0127.\345\215\225\350\257\215\346\216\245\351\276\231.md" index 0063c97cf5..fb403a5bdb 100644 --- "a/problems/0127.\345\215\225\350\257\215\346\216\245\351\276\231.md" +++ "b/problems/0127.\345\215\225\350\257\215\346\216\245\351\276\231.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0129.\346\261\202\346\240\271\345\210\260\345\217\266\345\255\220\350\212\202\347\202\271\346\225\260\345\255\227\344\271\213\345\222\214.md" "b/problems/0129.\346\261\202\346\240\271\345\210\260\345\217\266\345\255\220\350\212\202\347\202\271\346\225\260\345\255\227\344\271\213\345\222\214.md" index 1f10926512..d07d524462 100644 --- "a/problems/0129.\346\261\202\346\240\271\345\210\260\345\217\266\345\255\220\350\212\202\347\202\271\346\225\260\345\255\227\344\271\213\345\222\214.md" +++ "b/problems/0129.\346\261\202\346\240\271\345\210\260\345\217\266\345\255\220\350\212\202\347\202\271\346\225\260\345\255\227\344\271\213\345\222\214.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" "b/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" index 47734f6c66..f4d72eeaaa 100644 --- "a/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" +++ "b/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0132.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262II.md" "b/problems/0132.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262II.md" index 3325578b6d..87d3e4b434 100644 --- "a/problems/0132.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262II.md" +++ "b/problems/0132.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262II.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0134.\345\212\240\346\262\271\347\253\231.md" "b/problems/0134.\345\212\240\346\262\271\347\253\231.md" index f6e8596cff..ca95af6764 100644 --- "a/problems/0134.\345\212\240\346\262\271\347\253\231.md" +++ "b/problems/0134.\345\212\240\346\262\271\347\253\231.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0135.\345\210\206\345\217\221\347\263\226\346\236\234.md" "b/problems/0135.\345\210\206\345\217\221\347\263\226\346\236\234.md" index 2dad6845a7..ccdabc16b4 100644 --- "a/problems/0135.\345\210\206\345\217\221\347\263\226\346\236\234.md" +++ "b/problems/0135.\345\210\206\345\217\221\347\263\226\346\236\234.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" "b/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" index 58d54afc61..db80d4d467 100644 --- "a/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" +++ "b/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0141.\347\216\257\345\275\242\351\223\276\350\241\250.md" "b/problems/0141.\347\216\257\345\275\242\351\223\276\350\241\250.md" index 137c429f70..0712a2a2a5 100644 --- "a/problems/0141.\347\216\257\345\275\242\351\223\276\350\241\250.md" +++ "b/problems/0141.\347\216\257\345\275\242\351\223\276\350\241\250.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0142.\347\216\257\345\275\242\351\223\276\350\241\250II.md" "b/problems/0142.\347\216\257\345\275\242\351\223\276\350\241\250II.md" index fb2172c6db..dfe042b857 100644 --- "a/problems/0142.\347\216\257\345\275\242\351\223\276\350\241\250II.md" +++ "b/problems/0142.\347\216\257\345\275\242\351\223\276\350\241\250II.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0143.\351\207\215\346\216\222\351\223\276\350\241\250.md" "b/problems/0143.\351\207\215\346\216\222\351\223\276\350\241\250.md" index dff1fb74dd..4ea9cb97a9 100644 --- "a/problems/0143.\351\207\215\346\216\222\351\223\276\350\241\250.md" +++ "b/problems/0143.\351\207\215\346\216\222\351\223\276\350\241\250.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" "b/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" index 137aaf5d74..7f7b2f4ca3 100644 --- "a/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" +++ "b/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" "b/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" index d447788530..48324cd9e1 100644 --- "a/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" +++ "b/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0160.\347\233\270\344\272\244\351\223\276\350\241\250.md" "b/problems/0160.\347\233\270\344\272\244\351\223\276\350\241\250.md" index dd1afe4a10..03b102f77e 100644 --- "a/problems/0160.\347\233\270\344\272\244\351\223\276\350\241\250.md" +++ "b/problems/0160.\347\233\270\344\272\244\351\223\276\350\241\250.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" "b/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" index 615ebd5c6f..49e5342b1e 100644 --- "a/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" +++ "b/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0189.\346\227\213\350\275\254\346\225\260\347\273\204.md" "b/problems/0189.\346\227\213\350\275\254\346\225\260\347\273\204.md" index b2619c4d7a..bbe152a267 100644 --- "a/problems/0189.\346\227\213\350\275\254\346\225\260\347\273\204.md" +++ "b/problems/0189.\346\227\213\350\275\254\346\225\260\347\273\204.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0198.\346\211\223\345\256\266\345\212\253\350\210\215.md" "b/problems/0198.\346\211\223\345\256\266\345\212\253\350\210\215.md" index 20cf3d2038..dfe1f3a062 100644 --- "a/problems/0198.\346\211\223\345\256\266\345\212\253\350\210\215.md" +++ "b/problems/0198.\346\211\223\345\256\266\345\212\253\350\210\215.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0202.\345\277\253\344\271\220\346\225\260.md" "b/problems/0202.\345\277\253\344\271\220\346\225\260.md" index a5a6f19976..2d678151ee 100644 --- "a/problems/0202.\345\277\253\344\271\220\346\225\260.md" +++ "b/problems/0202.\345\277\253\344\271\220\346\225\260.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" "b/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" index eff2812c7c..9d0ef91f12 100644 --- "a/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" +++ "b/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0205.\345\220\214\346\236\204\345\255\227\347\254\246\344\270\262.md" "b/problems/0205.\345\220\214\346\236\204\345\255\227\347\254\246\344\270\262.md" index eeda7d2ecb..d4b71c59c4 100644 --- "a/problems/0205.\345\220\214\346\236\204\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/0205.\345\220\214\346\236\204\345\255\227\347\254\246\344\270\262.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md" "b/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md" index c1d7bcfe1d..13ed753cf8 100644 --- "a/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md" +++ "b/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" "b/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" index a289c22eb7..808224366f 100644 --- "a/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" +++ "b/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0213.\346\211\223\345\256\266\345\212\253\350\210\215II.md" "b/problems/0213.\346\211\223\345\256\266\345\212\253\350\210\215II.md" index bfc3b69bf5..b6c2d080b8 100644 --- "a/problems/0213.\346\211\223\345\256\266\345\212\253\350\210\215II.md" +++ "b/problems/0213.\346\211\223\345\256\266\345\212\253\350\210\215II.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" "b/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" index adb1167695..a411117cea 100644 --- "a/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" +++ "b/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" "b/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" index 3b5ca4d822..c5039039b0 100644 --- "a/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" +++ "b/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" "b/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" index be9f1f790e..fdb544a6c2 100644 --- "a/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" +++ "b/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" "b/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" index 12c60c7ea8..ee1f5ddfbb 100644 --- "a/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" "b/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" index 7e0ba63189..4edba2f201 100644 --- "a/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" +++ "b/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0234.\345\233\236\346\226\207\351\223\276\350\241\250.md" "b/problems/0234.\345\233\236\346\226\207\351\223\276\350\241\250.md" index 5e92959456..db910d4ee0 100644 --- "a/problems/0234.\345\233\236\346\226\207\351\223\276\350\241\250.md" +++ "b/problems/0234.\345\233\236\346\226\207\351\223\276\350\241\250.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" "b/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" index 5bde557b15..b9d0a0bf91 100644 --- "a/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" +++ "b/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" "b/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" index 6d26e376bb..348275fa4d 100644 --- "a/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" +++ "b/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" "b/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" index ba36222229..d9788f6328 100644 --- "a/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" +++ "b/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" "b/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" index 432235c0cb..4a8e9d14c5 100644 --- "a/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" +++ "b/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" "b/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" index 62c720dd47..cb837d8781 100644 --- "a/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" +++ "b/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" "b/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" index 78effc2a82..86c3170e3a 100644 --- "a/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" +++ "b/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0283.\347\247\273\345\212\250\351\233\266.md" "b/problems/0283.\347\247\273\345\212\250\351\233\266.md" index de3b1e8901..13b9c26ca9 100644 --- "a/problems/0283.\347\247\273\345\212\250\351\233\266.md" +++ "b/problems/0283.\347\247\273\345\212\250\351\233\266.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" "b/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" index ee8dc79ba2..9c1c07f6dc 100644 --- "a/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" "b/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" index 1da766daa3..82555f8080 100644 --- "a/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" +++ "b/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" "b/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" index 380402b1a4..637e68eb6c 100644 --- "a/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" +++ "b/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" "b/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" index cfdea23727..d9235e9778 100644 --- "a/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" +++ "b/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" "b/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" index 4264728fbf..06831cb6ab 100644 --- "a/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" +++ "b/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" "b/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" index 1bab99ca60..5d11f670f7 100644 --- "a/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" +++ "b/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" "b/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" index 39da73071a..2831383901 100644 --- "a/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" "b/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" index 6f3a65fef9..43706b8374 100644 --- "a/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" +++ "b/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" "b/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" index b5cf31c5d3..812c4489a9 100644 --- "a/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" +++ "b/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" "b/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" index 39a3db1527..e228d9e466 100644 --- "a/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" +++ "b/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0377.\347\273\204\345\220\210\346\200\273\345\222\214\342\205\243.md" "b/problems/0377.\347\273\204\345\220\210\346\200\273\345\222\214\342\205\243.md" index 012a603f07..940d81b85b 100644 --- "a/problems/0377.\347\273\204\345\220\210\346\200\273\345\222\214\342\205\243.md" +++ "b/problems/0377.\347\273\204\345\220\210\346\200\273\345\222\214\342\205\243.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0383.\350\265\216\351\207\221\344\277\241.md" "b/problems/0383.\350\265\216\351\207\221\344\277\241.md" index 034f681d11..650f2a9931 100644 --- "a/problems/0383.\350\265\216\351\207\221\344\277\241.md" +++ "b/problems/0383.\350\265\216\351\207\221\344\277\241.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" "b/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" index e157b4392b..ecde244857 100644 --- "a/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" "b/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" index 828ee2583a..ddbd100e2c 100644 --- "a/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" +++ "b/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" "b/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" index c31e8440c4..28eb574485 100644 --- "a/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" +++ "b/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" "b/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" index 178872339a..23a285f854 100644 --- "a/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" +++ "b/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" "b/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" index 269b8516ce..118360bc2c 100644 --- "a/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" +++ "b/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" "b/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" index c9be2c02c7..47585b537b 100644 --- "a/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" +++ "b/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" "b/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" index 326680e124..ebfe648f09 100644 --- "a/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" +++ "b/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" "b/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" index 97118ae453..6853354c49 100644 --- "a/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" +++ "b/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" "b/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" index be8420832b..1711f63836 100644 --- "a/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" +++ "b/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" "b/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" index 3d4eac5888..fee9dee55b 100644 --- "a/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0463.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" "b/problems/0463.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" index 39808e0e41..e19e06ee5e 100644 --- "a/problems/0463.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" +++ "b/problems/0463.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0474.\344\270\200\345\222\214\351\233\266.md" "b/problems/0474.\344\270\200\345\222\214\351\233\266.md" index 8c72eedfb6..67e366f436 100644 --- "a/problems/0474.\344\270\200\345\222\214\351\233\266.md" +++ "b/problems/0474.\344\270\200\345\222\214\351\233\266.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" "b/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" index ee7180dd04..6d88119e7c 100644 --- "a/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0494.\347\233\256\346\240\207\345\222\214.md" "b/problems/0494.\347\233\256\346\240\207\345\222\214.md" index e2ce920dec..1835f49897 100644 --- "a/problems/0494.\347\233\256\346\240\207\345\222\214.md" +++ "b/problems/0494.\347\233\256\346\240\207\345\222\214.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0496.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240I.md" "b/problems/0496.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240I.md" index 0ca899fbaa..f039c19854 100644 --- "a/problems/0496.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240I.md" +++ "b/problems/0496.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240I.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" "b/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" index 6f2a29227e..277f46f52e 100644 --- "a/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" +++ "b/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" "b/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" index 2d09c527ce..c9532a2291 100644 --- "a/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" +++ "b/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" "b/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" index b866cbe2a8..e3e750917a 100644 --- "a/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" +++ "b/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" "b/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" index 5be99390f3..018a30579d 100644 --- "a/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" +++ "b/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0516.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\345\272\217\345\210\227.md" "b/problems/0516.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\345\272\217\345\210\227.md" index d6adc11ba0..69536cef56 100644 --- "a/problems/0516.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0516.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\345\272\217\345\210\227.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" "b/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" index 9c77a916d8..be60ac1333 100644 --- "a/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" +++ "b/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" "b/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" index e1f5f8a60b..3ebb4c8c30 100644 --- "a/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" +++ "b/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0538.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md" "b/problems/0538.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md" index 0ad9326b44..0959e9f00d 100644 --- "a/problems/0538.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md" +++ "b/problems/0538.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" "b/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" index c5c729bf4b..fb92b1e49b 100644 --- "a/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" +++ "b/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" "b/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" index e6b932aca0..a04907d4ef 100644 --- "a/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" +++ "b/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0617.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md" "b/problems/0617.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md" index e6f350fd0d..2dc393979c 100644 --- "a/problems/0617.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0617.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" "b/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" index 9aa44cad2f..d9928b8f2f 100644 --- "a/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" +++ "b/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0649.Dota2\345\217\202\350\256\256\351\231\242.md" "b/problems/0649.Dota2\345\217\202\350\256\256\351\231\242.md" index 1fd931c16c..6e84c9fde2 100644 --- "a/problems/0649.Dota2\345\217\202\350\256\256\351\231\242.md" +++ "b/problems/0649.Dota2\345\217\202\350\256\256\351\231\242.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" "b/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" index d5209b5d39..b4679c7d1f 100644 --- "a/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0657.\346\234\272\345\231\250\344\272\272\350\203\275\345\220\246\350\277\224\345\233\236\345\216\237\347\202\271.md" "b/problems/0657.\346\234\272\345\231\250\344\272\272\350\203\275\345\220\246\350\277\224\345\233\236\345\216\237\347\202\271.md" index 841b355d05..4eb69a6ce3 100644 --- "a/problems/0657.\346\234\272\345\231\250\344\272\272\350\203\275\345\220\246\350\277\224\345\233\236\345\216\237\347\202\271.md" +++ "b/problems/0657.\346\234\272\345\231\250\344\272\272\350\203\275\345\220\246\350\277\224\345\233\236\345\216\237\347\202\271.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0669.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0669.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" index 890963207b..d17c0b1c1c 100644 --- "a/problems/0669.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" +++ "b/problems/0669.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0673.\346\234\200\351\225\277\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227\347\232\204\344\270\252\346\225\260.md" "b/problems/0673.\346\234\200\351\225\277\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227\347\232\204\344\270\252\346\225\260.md" index 1bfaa7d017..7ea91e9774 100644 --- "a/problems/0673.\346\234\200\351\225\277\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227\347\232\204\344\270\252\346\225\260.md" +++ "b/problems/0673.\346\234\200\351\225\277\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227\347\232\204\344\270\252\346\225\260.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" "b/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" index 4c1f645389..98e09bf86c 100644 --- "a/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" +++ "b/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0684.\345\206\227\344\275\231\350\277\236\346\216\245.md" "b/problems/0684.\345\206\227\344\275\231\350\277\236\346\216\245.md" index bc8b22f5fc..a16833bc8e 100644 --- "a/problems/0684.\345\206\227\344\275\231\350\277\236\346\216\245.md" +++ "b/problems/0684.\345\206\227\344\275\231\350\277\236\346\216\245.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0685.\345\206\227\344\275\231\350\277\236\346\216\245II.md" "b/problems/0685.\345\206\227\344\275\231\350\277\236\346\216\245II.md" index 184c3caa97..f33396a01e 100644 --- "a/problems/0685.\345\206\227\344\275\231\350\277\236\346\216\245II.md" +++ "b/problems/0685.\345\206\227\344\275\231\350\277\236\346\216\245II.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0700.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\220\234\347\264\242.md" "b/problems/0700.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\220\234\347\264\242.md" index f8d99c81f0..1521514a78 100644 --- "a/problems/0700.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\220\234\347\264\242.md" +++ "b/problems/0700.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\220\234\347\264\242.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" "b/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" index 1e6ab47e1e..cc98ee1d27 100644 --- "a/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" +++ "b/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" "b/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" index 44a0c1d8be..689c0633bb 100644 --- "a/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" +++ "b/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" "b/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" index 4f2938bcfe..43b18c58f6 100644 --- "a/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" +++ "b/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271.md" "b/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271.md" index 7b5df34ad6..fd42691b7a 100644 --- "a/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271.md" +++ "b/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" "b/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" index 4a5b8cf104..1f5218e974 100644 --- "a/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" +++ "b/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0718.\346\234\200\351\225\277\351\207\215\345\244\215\345\255\220\346\225\260\347\273\204.md" "b/problems/0718.\346\234\200\351\225\277\351\207\215\345\244\215\345\255\220\346\225\260\347\273\204.md" index b2738ac188..87b1492ae9 100644 --- "a/problems/0718.\346\234\200\351\225\277\351\207\215\345\244\215\345\255\220\346\225\260\347\273\204.md" +++ "b/problems/0718.\346\234\200\351\225\277\351\207\215\345\244\215\345\255\220\346\225\260\347\273\204.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0724.\345\257\273\346\211\276\346\225\260\347\273\204\347\232\204\344\270\255\345\277\203\347\264\242\345\274\225.md" "b/problems/0724.\345\257\273\346\211\276\346\225\260\347\273\204\347\232\204\344\270\255\345\277\203\347\264\242\345\274\225.md" index c347acc552..14dcd2c08a 100644 --- "a/problems/0724.\345\257\273\346\211\276\346\225\260\347\273\204\347\232\204\344\270\255\345\277\203\347\264\242\345\274\225.md" +++ "b/problems/0724.\345\257\273\346\211\276\346\225\260\347\273\204\347\232\204\344\270\255\345\277\203\347\264\242\345\274\225.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0738.\345\215\225\350\260\203\351\200\222\345\242\236\347\232\204\346\225\260\345\255\227.md" "b/problems/0738.\345\215\225\350\260\203\351\200\222\345\242\236\347\232\204\346\225\260\345\255\227.md" index 65e0c0aa25..e670bb31be 100644 --- "a/problems/0738.\345\215\225\350\260\203\351\200\222\345\242\236\347\232\204\346\225\260\345\255\227.md" +++ "b/problems/0738.\345\215\225\350\260\203\351\200\222\345\242\236\347\232\204\346\225\260\345\255\227.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" "b/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" index 9fdcafc087..d16416d946 100644 --- "a/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" +++ "b/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" "b/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" index 6bd3d8586c..ad13174402 100644 --- "a/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" +++ "b/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" "b/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" index 3235318b1b..03d3a73b3b 100644 --- "a/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" +++ "b/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0841.\351\222\245\345\214\231\345\222\214\346\210\277\351\227\264.md" "b/problems/0841.\351\222\245\345\214\231\345\222\214\346\210\277\351\227\264.md" index 406a116d58..8397690e5c 100644 --- "a/problems/0841.\351\222\245\345\214\231\345\222\214\346\210\277\351\227\264.md" +++ "b/problems/0841.\351\222\245\345\214\231\345\222\214\346\210\277\351\227\264.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0844.\346\257\224\350\276\203\345\220\253\351\200\200\346\240\274\347\232\204\345\255\227\347\254\246\344\270\262.md" "b/problems/0844.\346\257\224\350\276\203\345\220\253\351\200\200\346\240\274\347\232\204\345\255\227\347\254\246\344\270\262.md" index deb4a4337a..57caad12ab 100644 --- "a/problems/0844.\346\257\224\350\276\203\345\220\253\351\200\200\346\240\274\347\232\204\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/0844.\346\257\224\350\276\203\345\220\253\351\200\200\346\240\274\347\232\204\345\255\227\347\254\246\344\270\262.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0860.\346\237\240\346\252\254\346\260\264\346\211\276\351\233\266.md" "b/problems/0860.\346\237\240\346\252\254\346\260\264\346\211\276\351\233\266.md" index ceb4e5ee19..01bd1a3bcf 100644 --- "a/problems/0860.\346\237\240\346\252\254\346\260\264\346\211\276\351\233\266.md" +++ "b/problems/0860.\346\237\240\346\252\254\346\260\264\346\211\276\351\233\266.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0922.\346\214\211\345\245\207\345\201\266\346\216\222\345\272\217\346\225\260\347\273\204II.md" "b/problems/0922.\346\214\211\345\245\207\345\201\266\346\216\222\345\272\217\346\225\260\347\273\204II.md" index 36d0c2cc28..19675e7fad 100644 --- "a/problems/0922.\346\214\211\345\245\207\345\201\266\346\216\222\345\272\217\346\225\260\347\273\204II.md" +++ "b/problems/0922.\346\214\211\345\245\207\345\201\266\346\216\222\345\272\217\346\225\260\347\273\204II.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0925.\351\225\277\346\214\211\351\224\256\345\205\245.md" "b/problems/0925.\351\225\277\346\214\211\351\224\256\345\205\245.md" index dd3679bad9..5067e9a721 100644 --- "a/problems/0925.\351\225\277\346\214\211\351\224\256\345\205\245.md" +++ "b/problems/0925.\351\225\277\346\214\211\351\224\256\345\205\245.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0941.\346\234\211\346\225\210\347\232\204\345\261\261\350\204\211\346\225\260\347\273\204.md" "b/problems/0941.\346\234\211\346\225\210\347\232\204\345\261\261\350\204\211\346\225\260\347\273\204.md" index 9c346c53fd..a2444cc145 100644 --- "a/problems/0941.\346\234\211\346\225\210\347\232\204\345\261\261\350\204\211\346\225\260\347\273\204.md" +++ "b/problems/0941.\346\234\211\346\225\210\347\232\204\345\261\261\350\204\211\346\225\260\347\273\204.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" "b/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" index 7d76aaba2b..433060a540 100644 --- "a/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" "b/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" index ac300a7d19..0085de0b75 100644 --- "a/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" +++ "b/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md" "b/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md" index 63a15751a7..08e7ec3d8e 100644 --- "a/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md" +++ "b/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" "b/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" index 45208b0ac8..45f186e2b9 100644 --- "a/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" +++ "b/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/1035.\344\270\215\347\233\270\344\272\244\347\232\204\347\272\277.md" "b/problems/1035.\344\270\215\347\233\270\344\272\244\347\232\204\347\272\277.md" index 5896c6fb93..0602e111f8 100644 --- "a/problems/1035.\344\270\215\347\233\270\344\272\244\347\232\204\347\272\277.md" +++ "b/problems/1035.\344\270\215\347\233\270\344\272\244\347\232\204\347\272\277.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" "b/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" index e43ab59f43..755520f351 100644 --- "a/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" +++ "b/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" "b/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" index 79cc69e115..975968deb1 100644 --- "a/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" +++ "b/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/1143.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" "b/problems/1143.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" index 39bca419cd..fdcc7619ba 100644 --- "a/problems/1143.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/1143.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/1207.\347\213\254\344\270\200\346\227\240\344\272\214\347\232\204\345\207\272\347\216\260\346\254\241\346\225\260.md" "b/problems/1207.\347\213\254\344\270\200\346\227\240\344\272\214\347\232\204\345\207\272\347\216\260\346\254\241\346\225\260.md" index e8f0738357..ba92552ab8 100644 --- "a/problems/1207.\347\213\254\344\270\200\346\227\240\344\272\214\347\232\204\345\207\272\347\216\260\346\254\241\346\225\260.md" +++ "b/problems/1207.\347\213\254\344\270\200\346\227\240\344\272\214\347\232\204\345\207\272\347\216\260\346\254\241\346\225\260.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/1221.\345\210\206\345\211\262\345\271\263\350\241\241\345\255\227\347\254\246\344\270\262.md" "b/problems/1221.\345\210\206\345\211\262\345\271\263\350\241\241\345\255\227\347\254\246\344\270\262.md" index c5f4463f4a..0d29923509 100644 --- "a/problems/1221.\345\210\206\345\211\262\345\271\263\350\241\241\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/1221.\345\210\206\345\211\262\345\271\263\350\241\241\345\255\227\347\254\246\344\270\262.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/1356.\346\240\271\346\215\256\346\225\260\345\255\227\344\272\214\350\277\233\345\210\266\344\270\2131\347\232\204\346\225\260\347\233\256\346\216\222\345\272\217.md" "b/problems/1356.\346\240\271\346\215\256\346\225\260\345\255\227\344\272\214\350\277\233\345\210\266\344\270\2131\347\232\204\346\225\260\347\233\256\346\216\222\345\272\217.md" index c721cc0226..838c3a9600 100644 --- "a/problems/1356.\346\240\271\346\215\256\346\225\260\345\255\227\344\272\214\350\277\233\345\210\266\344\270\2131\347\232\204\346\225\260\347\233\256\346\216\222\345\272\217.md" +++ "b/problems/1356.\346\240\271\346\215\256\346\225\260\345\255\227\344\272\214\350\277\233\345\210\266\344\270\2131\347\232\204\346\225\260\347\233\256\346\216\222\345\272\217.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/1365.\346\234\211\345\244\232\345\260\221\345\260\217\344\272\216\345\275\223\345\211\215\346\225\260\345\255\227\347\232\204\346\225\260\345\255\227.md" "b/problems/1365.\346\234\211\345\244\232\345\260\221\345\260\217\344\272\216\345\275\223\345\211\215\346\225\260\345\255\227\347\232\204\346\225\260\345\255\227.md" index c7f9d0f973..78fa84c094 100644 --- "a/problems/1365.\346\234\211\345\244\232\345\260\221\345\260\217\344\272\216\345\275\223\345\211\215\346\225\260\345\255\227\347\232\204\346\225\260\345\255\227.md" +++ "b/problems/1365.\346\234\211\345\244\232\345\260\221\345\260\217\344\272\216\345\275\223\345\211\215\346\225\260\345\255\227\347\232\204\346\225\260\345\255\227.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/1382.\345\260\206\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\345\217\230\345\271\263\350\241\241.md" "b/problems/1382.\345\260\206\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\345\217\230\345\271\263\350\241\241.md" index d5b25f84b7..57231ec46b 100644 --- "a/problems/1382.\345\260\206\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\345\217\230\345\271\263\350\241\241.md" +++ "b/problems/1382.\345\260\206\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\345\217\230\345\271\263\350\241\241.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/O(n)\347\232\204\347\256\227\346\263\225\345\261\205\347\204\266\350\266\205\346\227\266\344\272\206\357\274\214\346\255\244\346\227\266\347\232\204n\347\251\266\347\253\237\346\230\257\345\244\232\345\244\247\357\274\237.md" "b/problems/O(n)\347\232\204\347\256\227\346\263\225\345\261\205\347\204\266\350\266\205\346\227\266\344\272\206\357\274\214\346\255\244\346\227\266\347\232\204n\347\251\266\347\253\237\346\230\257\345\244\232\345\244\247\357\274\237.md" index 9e36092c3d..4de5659724 100644 --- "a/problems/O(n)\347\232\204\347\256\227\346\263\225\345\261\205\347\204\266\350\266\205\346\227\266\344\272\206\357\274\214\346\255\244\346\227\266\347\232\204n\347\251\266\347\253\237\346\230\257\345\244\232\345\244\247\357\274\237.md" +++ "b/problems/O(n)\347\232\204\347\256\227\346\263\225\345\261\205\347\204\266\350\266\205\346\227\266\344\272\206\357\274\214\346\255\244\346\227\266\347\232\204n\347\251\266\347\253\237\346\230\257\345\244\232\345\244\247\357\274\237.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/\344\270\272\344\272\206\347\273\235\346\235\200\347\274\226\350\276\221\350\267\235\347\246\273\357\274\214\345\215\241\345\260\224\345\201\232\344\272\206\344\270\211\346\255\245\351\223\272\345\236\253.md" "b/problems/\344\270\272\344\272\206\347\273\235\346\235\200\347\274\226\350\276\221\350\267\235\347\246\273\357\274\214\345\215\241\345\260\224\345\201\232\344\272\206\344\270\211\346\255\245\351\223\272\345\236\253.md" index ae62ec2ccc..ef2c30f0c6 100644 --- "a/problems/\344\270\272\344\272\206\347\273\235\346\235\200\347\274\226\350\276\221\350\267\235\347\246\273\357\274\214\345\215\241\345\260\224\345\201\232\344\272\206\344\270\211\346\255\245\351\223\272\345\236\253.md" +++ "b/problems/\344\270\272\344\272\206\347\273\235\346\235\200\347\274\226\350\276\221\350\267\235\347\246\273\357\274\214\345\215\241\345\260\224\345\201\232\344\272\206\344\270\211\346\255\245\351\223\272\345\236\253.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/\344\272\214\345\217\211\346\240\221\344\270\255\351\200\222\345\275\222\345\270\246\347\235\200\345\233\236\346\272\257.md" "b/problems/\344\272\214\345\217\211\346\240\221\344\270\255\351\200\222\345\275\222\345\270\246\347\235\200\345\233\236\346\272\257.md" index b21c7cfe7b..3818b3ec35 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\344\270\255\351\200\222\345\275\222\345\270\246\347\235\200\345\233\236\346\272\257.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\344\270\255\351\200\222\345\275\222\345\270\246\347\235\200\345\233\236\346\272\257.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/\344\272\214\345\217\211\346\240\221\346\200\273\347\273\223\347\257\207.md" "b/problems/\344\272\214\345\217\211\346\240\221\346\200\273\347\273\223\347\257\207.md" index 26a55a58f9..d1332e09a8 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\346\200\273\347\273\223\347\257\207.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" index 37b200af37..cc89985092 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\347\273\237\344\270\200\350\277\255\344\273\243\346\263\225.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\347\273\237\344\270\200\350\277\255\344\273\243\346\263\225.md" index 075e776eaf..2ff848179f 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\347\273\237\344\270\200\350\277\255\344\273\243\346\263\225.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\347\273\237\344\270\200\350\277\255\344\273\243\346\263\225.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" index 379fe40aba..a139652ca0 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" index 0468b79b98..45b576e769 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/\345\205\263\344\272\216\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\214\344\275\240\344\270\215\347\237\245\351\201\223\347\232\204\351\203\275\345\234\250\350\277\231\351\207\214\357\274\201.md" "b/problems/\345\205\263\344\272\216\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\214\344\275\240\344\270\215\347\237\245\351\201\223\347\232\204\351\203\275\345\234\250\350\277\231\351\207\214\357\274\201.md" index f05af6bc6f..b6477249df 100644 --- "a/problems/\345\205\263\344\272\216\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\214\344\275\240\344\270\215\347\237\245\351\201\223\347\232\204\351\203\275\345\234\250\350\277\231\351\207\214\357\274\201.md" +++ "b/problems/\345\205\263\344\272\216\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\214\344\275\240\344\270\215\347\237\245\351\201\223\347\232\204\351\203\275\345\234\250\350\277\231\351\207\214\357\274\201.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" "b/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" index 77d3c36b3a..d0f382c859 100644 --- "a/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" +++ "b/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" "b/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" index a7ffb931c9..c391d661c4 100644 --- "a/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/\345\212\250\346\200\201\350\247\204\345\210\222-\350\202\241\347\245\250\351\227\256\351\242\230\346\200\273\347\273\223\347\257\207.md" "b/problems/\345\212\250\346\200\201\350\247\204\345\210\222-\350\202\241\347\245\250\351\227\256\351\242\230\346\200\273\347\273\223\347\257\207.md" index e630eb4437..86b4f23991 100644 --- "a/problems/\345\212\250\346\200\201\350\247\204\345\210\222-\350\202\241\347\245\250\351\227\256\351\242\230\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/\345\212\250\346\200\201\350\247\204\345\210\222-\350\202\241\347\245\250\351\227\256\351\242\230\346\200\273\347\273\223\347\257\207.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/\345\212\250\346\200\201\350\247\204\345\210\222\346\200\273\347\273\223\347\257\207.md" "b/problems/\345\212\250\346\200\201\350\247\204\345\210\222\346\200\273\347\273\223\347\257\207.md" index f4c737f757..699d443556 100644 --- "a/problems/\345\212\250\346\200\201\350\247\204\345\210\222\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/\345\212\250\346\200\201\350\247\204\345\210\222\346\200\273\347\273\223\347\257\207.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/\345\212\250\346\200\201\350\247\204\345\210\222\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\345\212\250\346\200\201\350\247\204\345\210\222\347\220\206\350\256\272\345\237\272\347\241\200.md" index ce7f6a510e..a4f5b12475 100644 --- "a/problems/\345\212\250\346\200\201\350\247\204\345\210\222\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\345\212\250\346\200\201\350\247\204\345\210\222\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/\345\217\214\346\214\207\351\222\210\346\200\273\347\273\223.md" "b/problems/\345\217\214\346\214\207\351\222\210\346\200\273\347\273\223.md" index 68be65ef56..e866aa669c 100644 --- "a/problems/\345\217\214\346\214\207\351\222\210\346\200\273\347\273\223.md" +++ "b/problems/\345\217\214\346\214\207\351\222\210\346\200\273\347\273\223.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/\345\223\210\345\270\214\350\241\250\346\200\273\347\273\223.md" "b/problems/\345\223\210\345\270\214\350\241\250\346\200\273\347\273\223.md" index 80534b856f..bbec31d7b0 100644 --- "a/problems/\345\223\210\345\270\214\350\241\250\346\200\273\347\273\223.md" +++ "b/problems/\345\223\210\345\270\214\350\241\250\346\200\273\347\273\223.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/\345\223\210\345\270\214\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\345\223\210\345\270\214\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" index 646429548f..40a8d0ca9e 100644 --- "a/problems/\345\223\210\345\270\214\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\345\223\210\345\270\214\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/\345\233\236\346\272\257\346\200\273\347\273\223.md" "b/problems/\345\233\236\346\272\257\346\200\273\347\273\223.md" index 424d6947e7..2fefeb0478 100644 --- "a/problems/\345\233\236\346\272\257\346\200\273\347\273\223.md" +++ "b/problems/\345\233\236\346\272\257\346\200\273\347\273\223.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/\345\233\236\346\272\257\347\256\227\346\263\225\345\216\273\351\207\215\351\227\256\351\242\230\347\232\204\345\217\246\344\270\200\347\247\215\345\206\231\346\263\225.md" "b/problems/\345\233\236\346\272\257\347\256\227\346\263\225\345\216\273\351\207\215\351\227\256\351\242\230\347\232\204\345\217\246\344\270\200\347\247\215\345\206\231\346\263\225.md" index d79f985ac6..06c5383d69 100644 --- "a/problems/\345\233\236\346\272\257\347\256\227\346\263\225\345\216\273\351\207\215\351\227\256\351\242\230\347\232\204\345\217\246\344\270\200\347\247\215\345\206\231\346\263\225.md" +++ "b/problems/\345\233\236\346\272\257\347\256\227\346\263\225\345\216\273\351\207\215\351\227\256\351\242\230\347\232\204\345\217\246\344\270\200\347\247\215\345\206\231\346\263\225.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/\345\233\236\346\272\257\347\256\227\346\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\345\233\236\346\272\257\347\256\227\346\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md" index ac31b30b11..265d10459e 100644 --- "a/problems/\345\233\236\346\272\257\347\256\227\346\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\345\233\236\346\272\257\347\256\227\346\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/\345\255\227\347\254\246\344\270\262\346\200\273\347\273\223.md" "b/problems/\345\255\227\347\254\246\344\270\262\346\200\273\347\273\223.md" index 46df61fe76..469cb743bd 100644 --- "a/problems/\345\255\227\347\254\246\344\270\262\346\200\273\347\273\223.md" +++ "b/problems/\345\255\227\347\254\246\344\270\262\346\200\273\347\273\223.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/\346\225\260\347\273\204\346\200\273\347\273\223\347\257\207.md" "b/problems/\346\225\260\347\273\204\346\200\273\347\273\223\347\257\207.md" index 39f9aa5eea..d3d4a1e246 100644 --- "a/problems/\346\225\260\347\273\204\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/\346\225\260\347\273\204\346\200\273\347\273\223\347\257\207.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/\346\225\260\347\273\204\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\346\225\260\347\273\204\347\220\206\350\256\272\345\237\272\347\241\200.md" index 4031338f96..93167255fd 100644 --- "a/problems/\346\225\260\347\273\204\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\346\225\260\347\273\204\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/\346\240\210\344\270\216\351\230\237\345\210\227\346\200\273\347\273\223.md" "b/problems/\346\240\210\344\270\216\351\230\237\345\210\227\346\200\273\347\273\223.md" index 485d0cf67f..0824d32fc0 100644 --- "a/problems/\346\240\210\344\270\216\351\230\237\345\210\227\346\200\273\347\273\223.md" +++ "b/problems/\346\240\210\344\270\216\351\230\237\345\210\227\346\200\273\347\273\223.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/\346\240\210\344\270\216\351\230\237\345\210\227\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\346\240\210\344\270\216\351\230\237\345\210\227\347\220\206\350\256\272\345\237\272\347\241\200.md" index 7a1b484d14..b9811b296b 100644 --- "a/problems/\346\240\210\344\270\216\351\230\237\345\210\227\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\346\240\210\344\270\216\351\230\237\345\210\227\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227\357\274\210vector\345\216\237\347\220\206\350\256\262\350\247\243\357\274\211.md" "b/problems/\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227\357\274\210vector\345\216\237\347\220\206\350\256\262\350\247\243\357\274\211.md" index 09fe64768a..11a72e2db0 100644 --- "a/problems/\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227\357\274\210vector\345\216\237\347\220\206\350\256\262\350\247\243\357\274\211.md" +++ "b/problems/\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227\357\274\210vector\345\216\237\347\220\206\350\256\262\350\247\243\357\274\211.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/\347\256\227\346\263\225\346\250\241\346\235\277.md" "b/problems/\347\256\227\346\263\225\346\250\241\346\235\277.md" index 69ebb36136..a41365115f 100644 --- "a/problems/\347\256\227\346\263\225\346\250\241\346\235\277.md" +++ "b/problems/\347\256\227\346\263\225\346\250\241\346\235\277.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/\350\203\214\345\214\205\346\200\273\347\273\223\347\257\207.md" "b/problems/\350\203\214\345\214\205\346\200\273\347\273\223\347\257\207.md" index 12120b130a..f80bcf29ae 100644 --- "a/problems/\350\203\214\345\214\205\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/\350\203\214\345\214\205\346\200\273\347\273\223\347\257\207.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" index ae645d9301..4367aff9bb 100644 --- "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" +++ "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" index 5086b25fef..7f646f06b4 100644 --- "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" +++ "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\244\232\351\207\215\350\203\214\345\214\205.md" "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\244\232\351\207\215\350\203\214\345\214\205.md" index 1b24168b93..55f7cf96f1 100644 --- "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\244\232\351\207\215\350\203\214\345\214\205.md" +++ "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\244\232\351\207\215\350\203\214\345\214\205.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" index 0801f68b8d..27d820bc70 100644 --- "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" +++ "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/\350\264\252\345\277\203\347\256\227\346\263\225\346\200\273\347\273\223\347\257\207.md" "b/problems/\350\264\252\345\277\203\347\256\227\346\263\225\346\200\273\347\273\223\347\257\207.md" index 85d1ec68af..6da43ea31d 100644 --- "a/problems/\350\264\252\345\277\203\347\256\227\346\263\225\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/\350\264\252\345\277\203\347\256\227\346\263\225\346\200\273\347\273\223\347\257\207.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/\350\264\252\345\277\203\347\256\227\346\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\350\264\252\345\277\203\347\256\227\346\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md" index 2b5de45c38..f1fde32f6e 100644 --- "a/problems/\350\264\252\345\277\203\347\256\227\346\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\350\264\252\345\277\203\347\256\227\346\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/\351\223\276\350\241\250\346\200\273\347\273\223\347\257\207.md" "b/problems/\351\223\276\350\241\250\346\200\273\347\273\223\347\257\207.md" index ed233d9de6..abbb288e3b 100644 --- "a/problems/\351\223\276\350\241\250\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/\351\223\276\350\241\250\346\200\273\347\273\223\347\257\207.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/\351\223\276\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\351\223\276\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" index 500ff213af..0da269f009 100644 --- "a/problems/\351\223\276\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\351\223\276\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -1,5 +1,5 @@

- +

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

diff --git "a/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" "b/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" index 7eeeba30a9..e8198aa079 100644 --- "a/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" +++ "b/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" @@ -1,5 +1,5 @@

- +

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

From 581dbd64f020e50c6f508131c588ab82f8abd9d1 Mon Sep 17 00:00:00 2001 From: qyg <1600314850@qq.com> Date: Tue, 21 Dec 2021 09:28:32 +0800 Subject: [PATCH 0142/3019] =?UTF-8?q?=E8=83=8C=E5=8C=85=E9=97=AE=E9=A2=98?= =?UTF-8?q?=E7=90=86=E8=AE=BA=E5=9F=BA=E7=A1=80=E5=AE=8C=E5=85=A8=E8=83=8C?= =?UTF-8?q?=E5=8C=85=EF=BC=9A=E4=BF=AE=E6=94=B9Java=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E6=A0=BC=E5=BC=8F=E5=8C=96=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...14\345\205\250\350\203\214\345\214\205.md" | 56 +++++++++---------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" index 27d820bc70..3cc8557c8b 100644 --- "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" +++ "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" @@ -177,41 +177,41 @@ int main() { Java: ```java - //先遍历物品,再遍历背包 - private static void testCompletePack(){ - int[] weight = {1, 3, 4}; - int[] value = {15, 20, 30}; - int bagWeight = 4; - int[] dp = new int[bagWeight + 1]; - for (int i = 0; i < weight.length; i++){ - for (int j = 1; j <= bagWeight; j++){ - if (j - weight[i] >= 0){ - dp[j] = Math.max(dp[j], dp[j - weight[i]] + value[i]); - } +//先遍历物品,再遍历背包 +private static void testCompletePack(){ + int[] weight = {1, 3, 4}; + int[] value = {15, 20, 30}; + int bagWeight = 4; + int[] dp = new int[bagWeight + 1]; + for (int i = 0; i < weight.length; i++){ + for (int j = 1; j <= bagWeight; j++){ + if (j - weight[i] >= 0){ + dp[j] = Math.max(dp[j], dp[j - weight[i]] + value[i]); } } - for (int maxValue : dp){ - System.out.println(maxValue + " "); - } } + for (int maxValue : dp){ + System.out.println(maxValue + " "); + } +} - //先遍历背包,再遍历物品 - private static void testCompletePackAnotherWay(){ - int[] weight = {1, 3, 4}; - int[] value = {15, 20, 30}; - int bagWeight = 4; - int[] dp = new int[bagWeight + 1]; - for (int i = 1; i <= bagWeight; i++){ - for (int j = 0; j < weight.length; j++){ - if (i - weight[j] >= 0){ - dp[i] = Math.max(dp[i], dp[i - weight[j]] + value[j]); - } +//先遍历背包,再遍历物品 +private static void testCompletePackAnotherWay(){ + int[] weight = {1, 3, 4}; + int[] value = {15, 20, 30}; + int bagWeight = 4; + int[] dp = new int[bagWeight + 1]; + for (int i = 1; i <= bagWeight; i++){ + for (int j = 0; j < weight.length; j++){ + if (i - weight[j] >= 0){ + dp[i] = Math.max(dp[i], dp[i - weight[j]] + value[j]); } } - for (int maxValue : dp){ - System.out.println(maxValue + " "); - } } + for (int maxValue : dp){ + System.out.println(maxValue + " "); + } +} ``` From 91db8652e7f38dc968291d639740bfc6f8d58164 Mon Sep 17 00:00:00 2001 From: qyg <1600314850@qq.com> Date: Tue, 21 Dec 2021 10:55:00 +0800 Subject: [PATCH 0143/3019] =?UTF-8?q?0322.=E9=9B=B6=E9=92=B1=E5=85=91?= =?UTF-8?q?=E6=8D=A2=EF=BC=9A=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 --- .../0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" "b/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" index 637e68eb6c..8f3438af47 100644 --- "a/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" +++ "b/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" @@ -81,7 +81,7 @@ dp[0] = 0; 4. 确定遍历顺序 -本题求钱币最小个数,**那么钱币有顺序和没有顺序都可以,都不影响钱币的最小个数。**。 +本题求钱币最小个数,**那么钱币有顺序和没有顺序都可以,都不影响钱币的最小个数**。 所以本题并不强调集合是组合还是排列。 @@ -170,7 +170,7 @@ public: 这也是我为什么要先讲518.零钱兑换II 然后再讲本题即:322.零钱兑换,这是Carl的良苦用心那。 -相信大家看完之后,对背包问题中的遍历顺序又了更深的理解了。 +相信大家看完之后,对背包问题中的遍历顺序有更深的理解了。 From 0b5e79d826b9eca2f4ef53e9ddd9dc540e288ca9 Mon Sep 17 00:00:00 2001 From: qyg <1600314850@qq.com> Date: Tue, 21 Dec 2021 11:30:52 +0800 Subject: [PATCH 0144/3019] =?UTF-8?q?279.=E5=AE=8C=E5=85=A8=E5=B9=B3?= =?UTF-8?q?=E6=96=B9=E6=95=B0=EF=BC=9A=E4=BF=AE=E6=94=B9=E5=8A=A8=E8=A7=84?= =?UTF-8?q?=E4=BA=94=E9=83=A8=E6=9B=B2=E4=B8=AD=20i=E5=92=8Cj=E7=9A=84?= =?UTF-8?q?=E9=94=99=E8=AF=AF=E4=BD=BF=E7=94=A8=20=E5=92=8C=20=E9=83=A8?= =?UTF-8?q?=E5=88=86=E6=96=87=E5=AD=97=E8=A1=A8=E8=BF=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...14\345\205\250\345\271\263\346\226\271\346\225\260.md" | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git "a/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" "b/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" index 86c3170e3a..7bc0c2f721 100644 --- "a/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" +++ "b/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" @@ -40,7 +40,7 @@ 1. 确定dp数组(dp table)以及下标的含义 -**dp[i]:和为i的完全平方数的最少数量为dp[i]** +**dp[j]:和为j的完全平方数的最少数量为dp[j]** 2. 确定递推公式 @@ -58,7 +58,7 @@ dp[0]表示 和为0的完全平方数的最小数量,那么dp[0]一定是0。 非0下标的dp[j]应该是多少呢? -从递归公式dp[j] = min(dp[j - i * i] + 1, dp[j]);中可以看出每次dp[j]都要选最小的,**所以非0下标的dp[i]一定要初始为最大值,这样dp[j]在递推的时候才不会被初始值覆盖**。 +从递归公式dp[j] = min(dp[j - i * i] + 1, dp[j]);中可以看出每次dp[j]都要选最小的,**所以非0下标的dp[j]一定要初始为最大值,这样dp[j]在递推的时候才不会被初始值覆盖**。 4. 确定遍历顺序 @@ -70,9 +70,9 @@ dp[0]表示 和为0的完全平方数的最小数量,那么dp[0]一定是0。 在[动态规划:322. 零钱兑换](https://programmercarl.com/0322.零钱兑换.html)中我们就深入探讨了这个问题,本题也是一样的,是求最小数! -**所以本题外层for遍历背包,里层for遍历物品,还是外层for遍历物品,内层for遍历背包,都是可以的!** +**所以本题外层for遍历背包,内层for遍历物品,还是外层for遍历物品,内层for遍历背包,都是可以的!** -我这里先给出外层遍历背包,里层遍历物品的代码: +我这里先给出外层遍历背包,内层遍历物品的代码: ```CPP vector dp(n + 1, INT_MAX); From fbddab5769b40824d9dca8c35c97f7f66707939d Mon Sep 17 00:00:00 2001 From: qyg <1600314850@qq.com> Date: Tue, 21 Dec 2021 11:39:10 +0800 Subject: [PATCH 0145/3019] =?UTF-8?q?20210204=E5=8A=A8=E8=A7=84=E5=91=A8?= =?UTF-8?q?=E6=9C=AB=E6=80=BB=E7=BB=93=EF=BC=9A=20=E8=B0=83=E6=95=B4?= =?UTF-8?q?=E7=AC=94=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20210204\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20210204\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" index 310092988b..9a64c1529d 100644 --- "a/problems/\345\221\250\346\200\273\347\273\223/20210204\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" +++ "b/problems/\345\221\250\346\200\273\347\273\223/20210204\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" @@ -85,7 +85,7 @@ public: 关键看遍历顺序。 -本题求钱币最小个数,**那么钱币有顺序和没有顺序都可以,都不影响钱币的最小个数。**。 +本题求钱币最小个数,**那么钱币有顺序和没有顺序都可以,都不影响钱币的最小个数**。 所以本题并不强调集合是组合还是排列。 From f460b46a261fd5a75a8bad175d5f41d30b632e87 Mon Sep 17 00:00:00 2001 From: qyg <1600314850@qq.com> Date: Wed, 22 Dec 2021 10:02:54 +0800 Subject: [PATCH 0146/3019] =?UTF-8?q?0139.=E5=8D=95=E8=AF=8D=E6=8B=86?= =?UTF-8?q?=E5=88=86=EF=BC=9A=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 --- .../0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" "b/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" index db80d4d467..e24ffc1a89 100644 --- "a/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" +++ "b/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" @@ -220,7 +220,7 @@ public: 但因为分割子串的特殊性,遍历背包放在外循环,将遍历物品放在内循环更方便一些。 -本题其实递推公式都不是重点,遍历顺序才是重点,如果我直接把代码贴出来,估计同学们也会想两个for循环的顺序理所当然就是这样,甚至都不会想为什么遍历背包的for循环为什么在外层。 +本题其实递推公式都不是重点,遍历顺序才是重点,如果我直接把代码贴出来,估计同学们也会想两个for循环的顺序理所当然就是这样,甚至都不会想为什么遍历背包的for循环在外层。 不分析透彻不是Carl的风格啊,哈哈 From f4b5c9198d5fe5ab8e8d41c334a406ece7bca0df Mon Sep 17 00:00:00 2001 From: qyg <1600314850@qq.com> Date: Wed, 22 Dec 2021 10:10:45 +0800 Subject: [PATCH 0147/3019] =?UTF-8?q?=E8=83=8C=E5=8C=85=E9=97=AE=E9=A2=98?= =?UTF-8?q?=E7=90=86=E8=AE=BA=E5=9F=BA=E7=A1=80=E5=A4=9A=E9=87=8D=E8=83=8C?= =?UTF-8?q?=E5=8C=85=EF=BC=9A=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 --- ...\241\200\345\244\232\351\207\215\350\203\214\345\214\205.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\244\232\351\207\215\350\203\214\345\214\205.md" "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\244\232\351\207\215\350\203\214\345\214\205.md" index 55f7cf96f1..8241818852 100644 --- "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\244\232\351\207\215\350\203\214\345\214\205.md" +++ "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\244\232\351\207\215\350\203\214\345\214\205.md" @@ -7,7 +7,7 @@ # 动态规划:关于多重背包,你该了解这些! -之前我们已经体统的讲解了01背包和完全背包,如果没有看过的录友,建议先把如下三篇文章仔细阅读一波。 +之前我们已经系统的讲解了01背包和完全背包,如果没有看过的录友,建议先把如下三篇文章仔细阅读一波。 * [动态规划:关于01背包问题,你该了解这些!](https://programmercarl.com/背包理论基础01背包-1.html) * [动态规划:关于01背包问题,你该了解这些!(滚动数组)](https://programmercarl.com/背包理论基础01背包-2.html) From 1a08a66586a5f3f5f2362e8b4e4e05fc1204140f Mon Sep 17 00:00:00 2001 From: qyg <1600314850@qq.com> Date: Thu, 23 Dec 2021 10:45:41 +0800 Subject: [PATCH 0148/3019] =?UTF-8?q?20210225=E5=8A=A8=E8=A7=84=E5=91=A8?= =?UTF-8?q?=E6=9C=AB=E6=80=BB=E7=BB=93=EF=BC=9A=E8=B0=83=E6=95=B4=E7=AC=94?= =?UTF-8?q?=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...345\221\250\346\234\253\346\200\273\347\273\223.md" | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20210225\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20210225\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" index 4ea92266e3..0bf9dbdb6f 100644 --- "a/problems/\345\221\250\346\200\273\347\273\223/20210225\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" +++ "b/problems/\345\221\250\346\200\273\347\273\223/20210225\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" @@ -3,7 +3,7 @@ ## 周一 -[动态规划:开始打家劫舍!](https://programmercarl.com/0198.打家劫舍.html)中就是给一个数组相邻之间不能连着偷,如果偷才能得到最大金钱。 +[动态规划:开始打家劫舍!](https://programmercarl.com/0198.打家劫舍.html)中就是给一个数组相邻之间不能连着偷,如何偷才能得到最大金钱。 1. 确定dp数组含义 @@ -65,7 +65,7 @@ dp[1] = max(nums[0], nums[1]); ## 周三 -[动态规划:还要打家劫舍!](https://programmercarl.com/0337.打家劫舍III.html)这次是在一颗二叉树上打家劫舍了,条件还是一样的,相临的不能偷。 +[动态规划:还要打家劫舍!](https://programmercarl.com/0337.打家劫舍III.html)这次是在一棵二叉树上打家劫舍了,条件还是一样的,相临的不能偷。 这道题目是树形DP的入门题目,其实树形DP其实就是在树上进行递推公式的推导,没有什么神秘的。 @@ -191,12 +191,12 @@ return {val2, val1}; ## 周四 -[动态规划:买卖股票的最佳时机](https://programmercarl.com/0121.买卖股票的最佳时机.html) 一段时间,只能买买一次,问最大收益。 +[动态规划:买卖股票的最佳时机](https://programmercarl.com/0121.买卖股票的最佳时机.html) 一段时间,只能买卖一次,问最大收益。 -这里我给出了三中解法: +这里我给出了三种解法: 暴力解法代码: -``` +```CPP class Solution { public: int maxProfit(vector& prices) { From 7b7251f1e4bb8125c7f88030a2c93db0c0ceace3 Mon Sep 17 00:00:00 2001 From: bqlin Date: Sat, 18 Dec 2021 13:56:43 +0800 Subject: [PATCH 0149/3019] =?UTF-8?q?0017.=E7=94=B5=E8=AF=9D=E5=8F=B7?= =?UTF-8?q?=E7=A0=81=E7=9A=84=E5=AD=97=E6=AF=8D=E7=BB=84=E5=90=88=EF=BC=9A?= =?UTF-8?q?=E2=80=9C=E4=BA=8C=E4=BD=8D=E6=95=B0=E7=BB=84=E2=80=9D=20->=20?= =?UTF-8?q?=E2=80=9C=E4=BA=8C=E7=BB=B4=E6=95=B0=E7=BB=84=E2=80=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" "b/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" index 146493e996..7040182f3b 100644 --- "a/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" +++ "b/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" @@ -37,7 +37,7 @@ ## 数字和字母如何映射 -可以使用map或者定义一个二位数组,例如:string letterMap[10],来做映射,我这里定义一个二维数组,代码如下: +可以使用map或者定义一个二维数组,例如:string letterMap[10],来做映射,我这里定义一个二维数组,代码如下: ```cpp const string letterMap[10] = { From de0465b773693fa6c19a4da73a008cfa287ce812 Mon Sep 17 00:00:00 2001 From: bqlin Date: Sat, 18 Dec 2021 14:02:02 +0800 Subject: [PATCH 0150/3019] =?UTF-8?q?=E5=9B=9E=E6=BA=AF=E6=80=BB=E7=BB=93?= =?UTF-8?q?=EF=BC=9A=E2=80=9C=E6=A3=8B=E7=89=8C=E2=80=9D=20->=20=E2=80=9C?= =?UTF-8?q?=E6=A3=8B=E7=9B=98=E2=80=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\236\346\272\257\346\200\273\347\273\223.md" | 17 +---------------- 1 file changed, 1 insertion(+), 16 deletions(-) diff --git "a/problems/\345\233\236\346\272\257\346\200\273\347\273\223.md" "b/problems/\345\233\236\346\272\257\346\200\273\347\273\223.md" index 2fefeb0478..cff41f242c 100644 --- "a/problems/\345\233\236\346\272\257\346\200\273\347\273\223.md" +++ "b/problems/\345\233\236\346\272\257\346\200\273\347\273\223.md" @@ -331,7 +331,7 @@ used数组可是全局变量,每层与每层之间公用一个used数组,所 在[回溯算法:N皇后问题](https://programmercarl.com/0051.N皇后.html)中终于迎来了传说中的N皇后。 -下面我用一个3 * 3 的棋牌,将搜索过程抽象为一颗树,如图: +下面我用一个3 * 3 的棋盘,将搜索过程抽象为一颗树,如图: ![51.N皇后](https://img-blog.csdnimg.cn/20201118225433127.png) @@ -437,20 +437,5 @@ N皇后问题分析: **回溯算法系列正式结束,新的系列终将开始,录友们准备开启新的征程!** - -## 其他语言版本 - - -Java: - - -Python: - - -Go: - - - - -----------------------
From 90aa75c57300eaa7eea9a87d268cb9b0ad8a8553 Mon Sep 17 00:00:00 2001 From: bqlin Date: Sat, 18 Dec 2021 18:45:54 +0800 Subject: [PATCH 0151/3019] =?UTF-8?q?0077.=E7=BB=84=E5=90=88=E3=80=810077.?= =?UTF-8?q?=E7=BB=84=E5=90=88=E4=BC=98=E5=8C=96=EF=BC=9ASwift=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0=E5=87=8F=E5=B0=91=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "problems/0077.\347\273\204\345\220\210.md" | 10 +++++----- ...347\273\204\345\220\210\344\274\230\345\214\226.md" | 10 +++++----- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git "a/problems/0077.\347\273\204\345\220\210.md" "b/problems/0077.\347\273\204\345\220\210.md" index 2bf856df13..4ec154e10a 100644 --- "a/problems/0077.\347\273\204\345\220\210.md" +++ "b/problems/0077.\347\273\204\345\220\210.md" @@ -627,7 +627,7 @@ int** combine(int n, int k, int* returnSize, int** returnColumnSizes){ func combine(_ n: Int, _ k: Int) -> [[Int]] { var path = [Int]() var result = [[Int]]() - func backtracking(_ n: Int, _ k: Int, _ startIndex: Int) { + func backtracking(start: Int) { // 结束条件,并收集结果 if path.count == k { result.append(path) @@ -638,15 +638,15 @@ func combine(_ n: Int, _ k: Int) -> [[Int]] { // let end = n // 剪枝优化 let end = n - (k - path.count) + 1 - guard startIndex <= end else { return } - for i in startIndex ... end { + guard start <= end else { return } + for i in start ... end { path.append(i) // 处理结点 - backtracking(n, k, i + 1) // 递归 + backtracking(start: i + 1) // 递归 path.removeLast() // 回溯 } } - backtracking(n, k, 1) + backtracking(start: 1) return result } ``` diff --git "a/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" "b/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" index b713bdcdf6..5fe56e824c 100644 --- "a/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" +++ "b/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" @@ -300,7 +300,7 @@ Swift: func combine(_ n: Int, _ k: Int) -> [[Int]] { var path = [Int]() var result = [[Int]]() - func backtracking(_ n: Int, _ k: Int, _ startIndex: Int) { + func backtracking(start: Int) { // 结束条件,并收集结果 if path.count == k { result.append(path) @@ -311,15 +311,15 @@ func combine(_ n: Int, _ k: Int) -> [[Int]] { // let end = n // 剪枝优化 let end = n - (k - path.count) + 1 - guard startIndex <= end else { return } - for i in startIndex ... end { + guard start <= end else { return } + for i in start ... end { path.append(i) // 处理结点 - backtracking(n, k, i + 1) // 递归 + backtracking(start: i + 1) // 递归 path.removeLast() // 回溯 } } - backtracking(n, k, 1) + backtracking(start: 1) return result } ``` From 7c4bafe9b1d4c83a36520e3cc9c37d9c103a3651 Mon Sep 17 00:00:00 2001 From: bqlin Date: Sat, 18 Dec 2021 20:06:04 +0800 Subject: [PATCH 0152/3019] =?UTF-8?q?0216.=E7=BB=84=E5=90=88=E6=80=BB?= =?UTF-8?q?=E5=92=8CIII=EF=BC=9ASwift=E5=AE=9E=E7=8E=B0=E5=87=8F=E5=B0=91?= =?UTF-8?q?=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...73\204\345\220\210\346\200\273\345\222\214III.md" | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git "a/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" "b/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" index a411117cea..26c630b9aa 100644 --- "a/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" +++ "b/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" @@ -462,7 +462,7 @@ int** combinationSum3(int k, int n, int* returnSize, int** returnColumnSizes){ func combinationSum3(_ count: Int, _ targetSum: Int) -> [[Int]] { var result = [[Int]]() var path = [Int]() - func backtracking(sum: Int, startIndex: Int) { + func backtracking(sum: Int, start: Int) { // 剪枝 if sum > targetSum { return } // 终止条件 @@ -474,16 +474,16 @@ func combinationSum3(_ count: Int, _ targetSum: Int) -> [[Int]] { } // 单层逻辑 - let endIndex = 9 - guard startIndex <= endIndex else { return } - for i in startIndex ... endIndex { + let end = 9 + guard start <= end else { return } + for i in start ... end { path.append(i) // 处理 - backtracking(sum: sum + i, startIndex: i + 1) + backtracking(sum: sum + i, start: i + 1) path.removeLast() // 回溯 } } - backtracking(sum: 0, startIndex: 1) + backtracking(sum: 0, start: 1) return result } ``` From 622b443bbe309d91c14693e6b2dff96fd209bbb4 Mon Sep 17 00:00:00 2001 From: bqlin Date: Sat, 18 Dec 2021 20:12:46 +0800 Subject: [PATCH 0153/3019] =?UTF-8?q?0039.=E7=BB=84=E5=90=88=E6=80=BB?= =?UTF-8?q?=E5=92=8C=EF=BC=9ASwift=E5=AE=9E=E7=8E=B0=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E5=8F=82=E6=95=B0=E5=91=BD=E5=90=8D=EF=BC=8C=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E5=89=AA=E6=9E=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...039.\347\273\204\345\220\210\346\200\273\345\222\214.md" | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git "a/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" "b/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" index e78f2e2d86..0f8fe4f6b8 100644 --- "a/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" +++ "b/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" @@ -455,7 +455,6 @@ func combinationSum(_ candidates: [Int], _ target: Int) -> [[Int]] { var path = [Int]() func backtracking(sum: Int, startIndex: Int) { // 终止条件 - if sum > target { return } if sum == target { result.append(path) return @@ -464,8 +463,11 @@ func combinationSum(_ candidates: [Int], _ target: Int) -> [[Int]] { let end = candidates.count guard startIndex < end else { return } for i in startIndex ..< end { + let sum = sum + candidates[i] // 使用局部变量隐藏回溯 + if sum > target { continue } // 剪枝 + path.append(candidates[i]) // 处理 - backtracking(sum: sum + candidates[i], startIndex: i) // sum这里用新变量完成回溯,i不用+1以重复访问 + backtracking(sum: sum, startIndex: i) // i不用+1以重复访问 path.removeLast() // 回溯 } } From 690897f33f513887c07809bd2fc158004094769c Mon Sep 17 00:00:00 2001 From: bqlin Date: Sat, 18 Dec 2021 20:23:12 +0800 Subject: [PATCH 0154/3019] =?UTF-8?q?0131.=E5=88=86=E5=89=B2=E5=9B=9E?= =?UTF-8?q?=E6=96=87=E4=B8=B2=EF=BC=9ASwift=E5=AE=9E=E7=8E=B0=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E8=BF=AD=E4=BB=A3=E4=B8=AD=E8=B7=B3=E8=BF=87=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...6\345\211\262\345\233\236\346\226\207\344\270\262.md" | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git "a/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" "b/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" index f4d72eeaaa..84a5bd02f7 100644 --- "a/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" +++ "b/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" @@ -575,12 +575,9 @@ func partition(_ s: String) -> [[String]] { for i in startIndex ..< s.count { // 回文则收集,否则跳过 - if isPalindrome(start: startIndex, end: i) { - let substring = String(s[startIndex ... i]) - path.append(substring) - } else { - continue - } + guard isPalindrome(start: startIndex, end: i) else { continue } + let substring = String(s[startIndex ... i]) + path.append(substring) // 处理 backtracking(startIndex: i + 1) // 寻找下一个起始位置的子串 if !path.isEmpty { path.removeLast() } // 回溯 } From 9a2ca76d995ed9fc0cb89925ff7acdc63384ea0c Mon Sep 17 00:00:00 2001 From: qyg <1600314850@qq.com> Date: Fri, 24 Dec 2021 09:53:13 +0800 Subject: [PATCH 0155/3019] =?UTF-8?q?0123.=E4=B9=B0=E5=8D=96=E8=82=A1?= =?UTF-8?q?=E7=A5=A8=E7=9A=84=E6=9C=80=E4=BD=B3=E6=97=B6=E6=9C=BAIII?= =?UTF-8?q?=EF=BC=9A=E4=BC=98=E5=8C=96=E6=8E=92=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...2\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" | 2 ++ 1 file changed, 2 insertions(+) diff --git "a/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" "b/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" index 4a8df2b9a3..fc81c3e9c1 100644 --- "a/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" +++ "b/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" @@ -51,6 +51,7 @@ 1. 确定dp数组以及下标的含义 一天一共就有五个状态, + 0. 没有操作 1. 第一次买入 2. 第一次卖出 @@ -82,6 +83,7 @@ dp[i][j]中 i表示第i天,j为 [0 - 4] 五个状态,dp[i][j]表示第i天 同理可推出剩下状态部分: dp[i][3] = max(dp[i - 1][3], dp[i - 1][2] - prices[i]); + dp[i][4] = max(dp[i - 1][4], dp[i - 1][3] + prices[i]); From bd06d11aca72b02f476758d454ab600d0cf0f5b0 Mon Sep 17 00:00:00 2001 From: qyg <1600314850@qq.com> Date: Fri, 24 Dec 2021 10:09:14 +0800 Subject: [PATCH 0156/3019] =?UTF-8?q?0188.=E4=B9=B0=E5=8D=96=E8=82=A1?= =?UTF-8?q?=E7=A5=A8=E7=9A=84=E6=9C=80=E4=BD=B3=E6=97=B6=E6=9C=BAIV?= =?UTF-8?q?=EF=BC=9A=E4=BF=AE=E6=94=B9=E5=8A=A8=E8=A7=84=E4=BA=94=E9=83=A8?= =?UTF-8?q?=E6=9B=B2=E6=AD=A5=E9=AA=A42=E7=9A=84=E9=80=92=E6=8E=A8?= =?UTF-8?q?=E5=85=AC=E5=BC=8F=E9=94=99=E8=AF=AF=20=E5=92=8C=20=E9=83=A8?= =?UTF-8?q?=E5=88=86=E7=AC=94=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...6\234\200\344\275\263\346\227\266\346\234\272IV.md" | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git "a/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" "b/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" index 49e5342b1e..7db75f060c 100644 --- "a/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" +++ "b/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" @@ -58,7 +58,7 @@ j的状态表示为: 所以二维dp数组的C++定义为: -``` +```CPP vector> dp(prices.size(), vector(2 * k + 1, 0)); ``` @@ -71,14 +71,14 @@ vector> dp(prices.size(), vector(2 * k + 1, 0)); * 操作一:第i天买入股票了,那么dp[i][1] = dp[i - 1][0] - prices[i] * 操作二:第i天没有操作,而是沿用前一天买入的状态,即:dp[i][1] = dp[i - 1][1] -选最大的,所以 dp[i][1] = max(dp[i - 1][0] - prices[i], dp[i - 1][0]); +选最大的,所以 dp[i][1] = max(dp[i - 1][0] - prices[i], dp[i - 1][1]); 同理dp[i][2]也有两个操作: * 操作一:第i天卖出股票了,那么dp[i][2] = dp[i - 1][1] + prices[i] * 操作二:第i天没有操作,沿用前一天卖出股票的状态,即:dp[i][2] = dp[i - 1][2] -所以dp[i][2] = max(dp[i - 1][i] + prices[i], dp[i][2]) +所以dp[i][2] = max(dp[i - 1][1] + prices[i], dp[i - 1][2]) 同理可以类比剩下的状态,代码如下: @@ -89,7 +89,7 @@ for (int j = 0; j < 2 * k - 1; j += 2) { } ``` -**本题和[动态规划:123.买卖股票的最佳时机III](https://programmercarl.com/0123.买卖股票的最佳时机III.html)最大的区别就是这里要类比j为奇数是买,偶数是卖剩的状态**。 +**本题和[动态规划:123.买卖股票的最佳时机III](https://programmercarl.com/0123.买卖股票的最佳时机III.html)最大的区别就是这里要类比j为奇数是买,偶数是卖的状态**。 3. dp数组如何初始化 @@ -160,7 +160,7 @@ public: 当然有的解法是定义一个三维数组dp[i][j][k],第i天,第j次买卖,k表示买还是卖的状态,从定义上来讲是比较直观。 -但感觉三维数组操作起来有些麻烦,我是直接用二维数组来模拟三位数组的情况,代码看起来也清爽一些。 +但感觉三维数组操作起来有些麻烦,我是直接用二维数组来模拟三维数组的情况,代码看起来也清爽一些。 ## 其他语言版本 From 28f0a9fa8156554a31ab2b38706b2409a1b13667 Mon Sep 17 00:00:00 2001 From: qyg <1600314850@qq.com> Date: Fri, 24 Dec 2021 10:22:11 +0800 Subject: [PATCH 0157/3019] =?UTF-8?q?0309.=E6=9C=80=E4=BD=B3=E4=B9=B0?= =?UTF-8?q?=E5=8D=96=E8=82=A1=E7=A5=A8=E6=97=B6=E6=9C=BA=E5=90=AB=E5=86=B7?= =?UTF-8?q?=E5=86=BB=E6=9C=9F=EF=BC=9A=E5=88=A0=E9=99=A4=E9=87=8D=E5=A4=8D?= =?UTF-8?q?=E5=8A=9B=E6=89=A3=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 --- ...\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" | 2 -- 1 file changed, 2 deletions(-) diff --git "a/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" "b/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" index 82555f8080..dd86b2ac99 100644 --- "a/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" +++ "b/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" @@ -8,8 +8,6 @@ [力扣题目链接](https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-with-cooldown/) -[https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-with-cooldown/](https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-with-cooldown/) - 给定一个整数数组,其中第 i 个元素代表了第 i 天的股票价格 。 设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票): From 65732b0cd160dfeb8ba6f2bd0b8d6e58a226569c Mon Sep 17 00:00:00 2001 From: qyg <1600314850@qq.com> Date: Fri, 24 Dec 2021 10:43:04 +0800 Subject: [PATCH 0158/3019] =?UTF-8?q?0309.=E6=9C=80=E4=BD=B3=E4=B9=B0?= =?UTF-8?q?=E5=8D=96=E8=82=A1=E7=A5=A8=E6=97=B6=E6=9C=BA=E5=90=AB=E5=86=B7?= =?UTF-8?q?=E5=86=BB=E6=9C=9F=EF=BC=9A=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 --- ...34\272\345\220\253\345\206\267\345\206\273\346\234\237.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" "b/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" index dd86b2ac99..ecc3f1a621 100644 --- "a/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" +++ "b/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" @@ -88,7 +88,7 @@ dp[i][1] = max(dp[i - 1][1], dp[i - 1][3]); * 操作一:昨天卖出了股票(状态三) -p[i][3] = dp[i - 1][2]; +dp[i][3] = dp[i - 1][2]; 综上分析,递推代码如下: @@ -122,7 +122,7 @@ dp[i][3] = dp[i - 1][2]; ![309.最佳买卖股票时机含冷冻期](https://img-blog.csdnimg.cn/2021032317451040.png) -最后结果去是 状态二,状态三,和状态四的最大值,不少同学会把状态四忘了,状态四是冷冻期,最后一天如果是冷冻期也可能是最大值。 +最后结果是取 状态二,状态三,和状态四的最大值,不少同学会把状态四忘了,状态四是冷冻期,最后一天如果是冷冻期也可能是最大值。 代码如下: From 6fddb03a38c7a6eb39ff7a0b2eb3df84c5f010de Mon Sep 17 00:00:00 2001 From: qyg <1600314850@qq.com> Date: Fri, 24 Dec 2021 12:11:01 +0800 Subject: [PATCH 0159/3019] =?UTF-8?q?20210304=E5=8A=A8=E8=A7=84=E5=91=A8?= =?UTF-8?q?=E6=9C=AB=E6=80=BB=E7=BB=93=EF=BC=9A=E4=BF=AE=E6=94=B9=E5=91=A8?= =?UTF-8?q?=E5=9B=9B=E5=8A=A8=E8=A7=84=E4=BA=94=E9=83=A8=E6=9B=B2=E6=AD=A5?= =?UTF-8?q?=E9=AA=A41=E4=B8=ADj=E7=9A=84=E7=8A=B6=E6=80=81=EF=BC=8C?= =?UTF-8?q?=E9=83=A8=E5=88=86=E7=AC=94=E8=AF=AF=EF=BC=8C=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E6=8E=92=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\250\346\234\253\346\200\273\347\273\223.md" | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20210304\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20210304\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" index dad9884dda..c912b92d4a 100644 --- "a/problems/\345\221\250\346\200\273\347\273\223/20210304\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" +++ "b/problems/\345\221\250\346\200\273\347\273\223/20210304\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" @@ -3,11 +3,11 @@ ## 周一 -[动态规划:买卖股票的最佳时机II](https://programmercarl.com/0122.买卖股票的最佳时机II(动态规划).html)中股票可以买买多了次! +[动态规划:买卖股票的最佳时机II](https://programmercarl.com/0122.买卖股票的最佳时机II(动态规划).html)中股票可以买卖多次了! 这也是和[121. 买卖股票的最佳时机](https://programmercarl.com/0121.买卖股票的最佳时机.html)的唯一区别(注意只有一只股票,所以再次购买前要出售掉之前的股票) -重点在于递推公式公式的不同。 +重点在于递推公式的不同。 在回顾一下dp数组的含义: @@ -40,6 +40,7 @@ dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] - prices[i]); 1. 确定dp数组以及下标的含义 一天一共就有五个状态, + 0. 没有操作 1. 第一次买入 2. 第一次卖出 @@ -117,7 +118,7 @@ for (int j = 0; j < 2 * k - 1; j += 2) { } ``` -**本题和[动态规划:123.买卖股票的最佳时机III](https://programmercarl.com/0123.买卖股票的最佳时机III.html)最大的区别就是这里要类比j为奇数是买,偶数是卖剩的状态**。 +**本题和[动态规划:123.买卖股票的最佳时机III](https://programmercarl.com/0123.买卖股票的最佳时机III.html)最大的区别就是这里要类比j为奇数是买,偶数是卖的状态**。 3. dp数组如何初始化 @@ -131,7 +132,7 @@ for (int j = 1; j < 2 * k; j += 2) { } ``` -**在初始化的地方同样要类比j为偶数是买、奇数是卖的状态**。 +**在初始化的地方同样要类比j为奇数是买、偶数是卖的状态**。 4. 确定遍历顺序 @@ -162,9 +163,9 @@ for (int j = 1; j < 2 * k; j += 2) { j的状态为: -* 1:持有股票后的最多现金 -* 2:不持有股票(能购买)的最多现金 -* 3:不持有股票(冷冻期)的最多现金 +* 0:持有股票后的最多现金 +* 1:不持有股票(能购买)的最多现金 +* 2:不持有股票(冷冻期)的最多现金 2. 确定递推公式 @@ -179,7 +180,7 @@ dp[i][2] = dp[i - 1][0] + prices[i]; 可以统一都初始为0了。 代码如下: -``` +```CPP vector> dp(n, vector(3, 0)); ``` From 2a59d4fff670f89f012fdc280d662be38773b186 Mon Sep 17 00:00:00 2001 From: Martin Hsu <31008681+Martin-Hsu@users.noreply.github.com> Date: Fri, 24 Dec 2021 16:48:52 +0800 Subject: [PATCH 0160/3019] =?UTF-8?q?Update=200739.=E6=AF=8F=E6=97=A5?= =?UTF-8?q?=E6=B8=A9=E5=BA=A6.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 簡化版可以直接i = 0開始 --- .../0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git "a/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" "b/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" index d16416d946..d025e73c45 100644 --- "a/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" +++ "b/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" @@ -152,8 +152,7 @@ public: vector dailyTemperatures(vector& T) { stack st; // 递减栈 vector result(T.size(), 0); - st.push(0); - for (int i = 1; i < T.size(); i++) { + for (int i = 0; i < T.size(); i++) { while (!st.empty() && T[i] > T[st.top()]) { // 注意栈不能为空 result[st.top()] = i - st.top(); st.pop(); From d9605c25c741c19429fe5570e7f3d378ea7f56f2 Mon Sep 17 00:00:00 2001 From: youngyangyang04 <826123027@qq.com> Date: Fri, 24 Dec 2021 22:56:41 +0800 Subject: [PATCH 0161/3019] Update --- ...4\200\344\275\263\346\227\266\346\234\272IV.md" | 4 ++-- ...253\230\351\242\221\345\205\203\347\264\240.md" | 2 ++ ...232\204\345\255\227\347\254\246\344\270\262.md" | 14 ++++++-------- ...225\277\346\214\211\351\224\256\345\205\245.md" | 12 ++++++------ ...241\241\345\255\227\347\254\246\344\270\262.md" | 14 +++++++------- 5 files changed, 23 insertions(+), 23 deletions(-) diff --git "a/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" "b/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" index 49e5342b1e..840e268cb6 100644 --- "a/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" +++ "b/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" @@ -71,14 +71,14 @@ vector> dp(prices.size(), vector(2 * k + 1, 0)); * 操作一:第i天买入股票了,那么dp[i][1] = dp[i - 1][0] - prices[i] * 操作二:第i天没有操作,而是沿用前一天买入的状态,即:dp[i][1] = dp[i - 1][1] -选最大的,所以 dp[i][1] = max(dp[i - 1][0] - prices[i], dp[i - 1][0]); +选最大的,所以 dp[i][1] = max(dp[i - 1][0] - prices[i], dp[i - 1][1]); 同理dp[i][2]也有两个操作: * 操作一:第i天卖出股票了,那么dp[i][2] = dp[i - 1][1] + prices[i] * 操作二:第i天没有操作,沿用前一天卖出股票的状态,即:dp[i][2] = dp[i - 1][2] -所以dp[i][2] = max(dp[i - 1][i] + prices[i], dp[i][2]) +所以dp[i][2] = max(dp[i - 1][1] + prices[i], dp[i - 1][2]) 同理可以类比剩下的状态,代码如下: diff --git "a/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" "b/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" index 43706b8374..4a682779a1 100644 --- "a/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" +++ "b/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" @@ -64,6 +64,8 @@ 那么问题来了,定义一个大小为k的大顶堆,在每次移动更新大顶堆的时候,每次弹出都把最大的元素弹出去了,那么怎么保留下来前K个高频元素呢。 +而且使用大顶堆就要把所有元素都进行排序,那能不能只排序k个元素呢? + **所以我们要用小顶堆,因为要统计最大前k个元素,只有小顶堆每次将最小的元素弹出,最后小顶堆里积累的才是前k个最大元素。** 寻找前k个最大元素流程如图所示:(图中的频率只有三个,所以正好构成一个大小为3的小顶堆,如果频率更多一些,则用这个小顶堆进行扫描) diff --git "a/problems/0844.\346\257\224\350\276\203\345\220\253\351\200\200\346\240\274\347\232\204\345\255\227\347\254\246\344\270\262.md" "b/problems/0844.\346\257\224\350\276\203\345\220\253\351\200\200\346\240\274\347\232\204\345\255\227\347\254\246\344\270\262.md" index 57caad12ab..5d629a8c33 100644 --- "a/problems/0844.\346\257\224\350\276\203\345\220\253\351\200\200\346\240\274\347\232\204\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/0844.\346\257\224\350\276\203\345\220\253\351\200\200\346\240\274\347\232\204\345\255\227\347\254\246\344\270\262.md" @@ -34,7 +34,7 @@ * 解释:S 会变成 “c”,但 T 仍然是 “b”。 -# 思路 +## 思路 本文将给出 空间复杂度$O(n)$的栈模拟方法 以及空间复杂度是$O(1)$的双指针方法。 @@ -155,9 +155,9 @@ public: * 空间复杂度:$O(1)$ -# 其他语言版本 +## 其他语言版本 -Java: +### Java: ```java // 普通方法(使用栈的思路) @@ -185,9 +185,8 @@ class Solution { } ``` -Python: -python3 +### python ```python class Solution: @@ -207,8 +206,7 @@ class Solution: pass ``` - -Go: +### Go ```go @@ -230,7 +228,7 @@ func backspaceCompare(s string, t string) bool { ``` -JavaScript: +### JavaScript ```javascript // 双栈 var backspaceCompare = function(s, t) { diff --git "a/problems/0925.\351\225\277\346\214\211\351\224\256\345\205\245.md" "b/problems/0925.\351\225\277\346\214\211\351\224\256\345\205\245.md" index 5067e9a721..3aacee5c11 100644 --- "a/problems/0925.\351\225\277\346\214\211\351\224\256\345\205\245.md" +++ "b/problems/0925.\351\225\277\346\214\211\351\224\256\345\205\245.md" @@ -34,7 +34,7 @@ * 输出:true * 解释:长按名字中的字符并不是必要的。 -# 思路 +## 思路 这道题目一看以为是哈希,仔细一看不行,要有顺序。 @@ -94,9 +94,9 @@ public: 空间复杂度:$O(1)$ -# 其他语言版本 +## 其他语言版本 -Java: +### Java ```java class Solution { public boolean isLongPressedName(String name, String typed) { @@ -127,7 +127,7 @@ class Solution { } } ``` -Python: +### Python ```python class Solution: def isLongPressedName(self, name: str, typed: str) -> bool: @@ -154,7 +154,7 @@ class Solution: return True ``` -Go: +### Go ```go @@ -179,7 +179,7 @@ func isLongPressedName(name string, typed string) bool { } ``` -JavaScript: +### JavaScript: ```javascript var isLongPressedName = function(name, typed) { let i = 0, j = 0; diff --git "a/problems/1221.\345\210\206\345\211\262\345\271\263\350\241\241\345\255\227\347\254\246\344\270\262.md" "b/problems/1221.\345\210\206\345\211\262\345\271\263\350\241\241\345\255\227\347\254\246\344\270\262.md" index 0d29923509..1a9b34a29e 100644 --- "a/problems/1221.\345\210\206\345\211\262\345\271\263\350\241\241\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/1221.\345\210\206\345\211\262\345\271\263\350\241\241\345\255\227\347\254\246\344\270\262.md" @@ -38,7 +38,7 @@ * 输出:2 * 解释:s 可以分割为 "RL"、"RRRLLRLL" ,每个子字符串中都包含相同数量的 'L' 和 'R' 。 -# 思路 +## 思路 这道题目看起来好像很复杂,其实是非常简单的贪心,关于贪心,我在这里[关于贪心算法,你该了解这些!](https://programmercarl.com/贪心算法理论基础.html)有详细的讲解。 @@ -71,7 +71,7 @@ public: }; ``` -# 拓展 +## 拓展 一些同学可能想,你这个推理不靠谱,都没有数学证明。怎么就能说是合理的呢,怎么就能说明 局部最优可以推出全局最优呢? @@ -86,9 +86,9 @@ public: -# 其他语言版本 +## 其他语言版本 -## Java +### Java ```java class Solution { @@ -105,17 +105,17 @@ class Solution { } ``` -## Python +### Python ```python ``` -## Go +### Go ```go ``` -## JavaScript +### JavaScript ```js var balancedStringSplit = function(s) { From fab5c0235409de2eb62cf1736cc1560031b21d86 Mon Sep 17 00:00:00 2001 From: qyg <1600314850@qq.com> Date: Sat, 25 Dec 2021 09:45:01 +0800 Subject: [PATCH 0162/3019] =?UTF-8?q?0309.=E6=9C=80=E4=BD=B3=E4=B9=B0?= =?UTF-8?q?=E5=8D=96=E8=82=A1=E7=A5=A8=E6=97=B6=E6=9C=BA=E5=90=AB=E5=86=B7?= =?UTF-8?q?=E5=86=BB=E6=9C=9F=EF=BC=9A=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 --- ...\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" "b/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" index ecc3f1a621..18c940d42c 100644 --- "a/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" +++ "b/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" @@ -103,7 +103,7 @@ dp[i][3] = dp[i - 1][2]; 这里主要讨论一下第0天如何初始化。 -如果是持有股票状态(状态一)那么:dp[0][0] = -prices[0],买入股票所省现金为负数。 +如果是持有股票状态(状态一)那么:dp[0][0] = -prices[0],买入股票所剩现金为负数。 保持卖出股票状态(状态二),第0天没有卖出dp[0][1]初始化为0就行, From e85e9e72755af16f2e47eb8f2e8cade5fb96599d Mon Sep 17 00:00:00 2001 From: qyg <1600314850@qq.com> Date: Sat, 25 Dec 2021 10:06:17 +0800 Subject: [PATCH 0163/3019] =?UTF-8?q?=E5=8A=A8=E6=80=81=E8=A7=84=E5=88=92-?= =?UTF-8?q?=E8=82=A1=E7=A5=A8=E9=97=AE=E9=A2=98=E6=80=BB=E7=BB=93=E7=AF=87?= =?UTF-8?q?=EF=BC=9A=E4=BF=AE=E6=94=B9=E4=B9=B0=E5=8D=96=E8=82=A1=E7=A5=A8?= =?UTF-8?q?=E7=9A=84=E6=9C=80=E4=BD=B3=E6=97=B6=E6=9C=BAIV=E7=9A=84?= =?UTF-8?q?=E5=8A=A8=E8=A7=84=E4=BA=94=E9=83=A8=E6=9B=B2=E6=AD=A5=E9=AA=A4?= =?UTF-8?q?2=E9=80=92=E6=8E=A8=E5=85=AC=E5=BC=8F=E9=94=99=E8=AF=AF?= =?UTF-8?q?=EF=BC=8C=E4=BC=98=E5=8C=96=E6=8E=92=E7=89=88=EF=BC=8C=E7=AC=94?= =?UTF-8?q?=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...351\242\230\346\200\273\347\273\223\347\257\207.md" | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git "a/problems/\345\212\250\346\200\201\350\247\204\345\210\222-\350\202\241\347\245\250\351\227\256\351\242\230\346\200\273\347\273\223\347\257\207.md" "b/problems/\345\212\250\346\200\201\350\247\204\345\210\222-\350\202\241\347\245\250\351\227\256\351\242\230\346\200\273\347\273\223\347\257\207.md" index 86b4f23991..e1fb477bdd 100644 --- "a/problems/\345\212\250\346\200\201\350\247\204\345\210\222-\350\202\241\347\245\250\351\227\256\351\242\230\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/\345\212\250\346\200\201\350\247\204\345\210\222-\350\202\241\347\245\250\351\227\256\351\242\230\346\200\273\347\273\223\347\257\207.md" @@ -173,6 +173,7 @@ public: 【动态规划】 一天一共就有五个状态, + 0. 没有操作 1. 第一次买入 2. 第一次卖出 @@ -199,6 +200,7 @@ dp[i][1] = max(dp[i-1][0] - prices[i], dp[i - 1][1]); 同理可推出剩下状态部分: dp[i][3] = max(dp[i - 1][3], dp[i - 1][2] - prices[i]); + dp[i][4] = max(dp[i - 1][4], dp[i - 1][3] + prices[i]); 代码如下: @@ -279,14 +281,14 @@ j的状态表示为: * 操作一:第i天买入股票了,那么dp[i][1] = dp[i - 1][0] - prices[i] * 操作二:第i天没有操作,而是沿用前一天买入的状态,即:dp[i][1] = dp[i - 1][1] -dp[i][1] = max(dp[i - 1][0] - prices[i], dp[i - 1][0]); +dp[i][1] = max(dp[i - 1][0] - prices[i], dp[i - 1][1]); 同理dp[i][2]也有两个操作: * 操作一:第i天卖出股票了,那么dp[i][2] = dp[i - 1][1] + prices[i] * 操作二:第i天没有操作,沿用前一天卖出股票的状态,即:dp[i][2] = dp[i - 1][2] -dp[i][2] = max(dp[i - 1][i] + prices[i], dp[i][2]) +dp[i][2] = max(dp[i - 1][1] + prices[i], dp[i - 1][2]) 同理可以类比剩下的状态,代码如下: @@ -320,7 +322,7 @@ public: }; ``` -当然有的解法是定义一个三维数组dp[i][j][k],第i天,第j次买卖,k表示买还是卖的状态,从定义上来讲是比较直观。但感觉三维数组操作起来有些麻烦,直接用二维数组来模拟三位数组的情况,代码看起来也清爽一些。 +当然有的解法是定义一个三维数组dp[i][j][k],第i天,第j次买卖,k表示买还是卖的状态,从定义上来讲是比较直观。但感觉三维数组操作起来有些麻烦,直接用二维数组来模拟三维数组的情况,代码看起来也清爽一些。 ## 最佳买卖股票时机含冷冻期 @@ -462,7 +464,7 @@ public: 至此,股票系列正式剧终,全部讲解完毕! -从买买一次到买卖多次,从最多买卖两次到最多买卖k次,从冷冻期再到手续费,最后再来一个股票大总结,可以说对股票系列完美收官了。 +从买卖一次到买卖多次,从最多买卖两次到最多买卖k次,从冷冻期再到手续费,最后再来一个股票大总结,可以说对股票系列完美收官了。 「代码随想录」值得推荐给身边每一位学习算法的朋友同学们,关注后都会发现相见恨晚! From 854a8c6f90bd343fc8aab3751f01bb56516fd1ff Mon Sep 17 00:00:00 2001 From: zhuxianzhong <22525482@qq.com> Date: Sun, 26 Dec 2021 10:01:41 +0800 Subject: [PATCH 0164/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B00034.=E5=9C=A8?= =?UTF-8?q?=E6=8E=92=E5=BA=8F=E6=95=B0=E7=BB=84=E4=B8=AD=E6=9F=A5=E6=89=BE?= =?UTF-8?q?=E5=85=83=E7=B4=A0=E7=9A=84=E7=AC=AC=E4=B8=80=E4=B8=AA=E5=92=8C?= =?UTF-8?q?=E6=9C=80=E5=90=8E=E4=B8=80=E4=B8=AA=E4=BD=8D=E7=BD=AE.md=20?= =?UTF-8?q?=E7=96=91=E4=BC=BC=E9=94=99=E5=88=AB=E5=AD=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" "b/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" index 618fa395d2..7201274799 100644 --- "a/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" +++ "b/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" @@ -50,7 +50,7 @@ 采用二分法来去寻找左右边界,为了让代码清晰,我分别写两个二分来寻找左边界和右边界。 -**刚刚接触二分搜索的同学不建议上来就像如果用一个二分来查找左右边界,很容易把自己绕进去,建议扎扎实实的写两个二分分别找左边界和右边界** +**刚刚接触二分搜索的同学不建议上来就想用一个二分来查找左右边界,很容易把自己绕进去,建议扎扎实实的写两个二分分别找左边界和右边界** ### 寻找右边界 From 2282bae4ccd82ca5242b3ea7a072b534f7d06881 Mon Sep 17 00:00:00 2001 From: zhuxianzhong <22525482@qq.com> Date: Sun, 26 Dec 2021 10:02:24 +0800 Subject: [PATCH 0165/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B00034.=E5=9C=A8?= =?UTF-8?q?=E6=8E=92=E5=BA=8F=E6=95=B0=E7=BB=84=E4=B8=AD=E6=9F=A5=E6=89=BE?= =?UTF-8?q?=E5=85=83=E7=B4=A0=E7=9A=84=E7=AC=AC=E4=B8=80=E4=B8=AA=E5=92=8C?= =?UTF-8?q?=E6=9C=80=E5=90=8E=E4=B8=80=E4=B8=AA=E4=BD=8D=E7=BD=AE.md=20?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E9=94=99=E5=88=AB=E5=AD=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...20\216\344\270\200\344\270\252\344\275\215\347\275\256.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" "b/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" index 7201274799..2b96e41b69 100644 --- "a/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" +++ "b/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" @@ -56,9 +56,9 @@ 先来寻找右边界,至于二分查找,如果看过[704.二分查找](https://programmercarl.com/0704.二分查找.html)就会知道,二分查找中什么时候用while (left <= right),有什么时候用while (left < right),其实只要清楚**循环不变量**,很容易区分两种写法。 -那么这里我采用while (left <= right)的写法,区间定义为[left, right],即左闭又闭的区间(如果这里有点看不懂了,强烈建议把[704.二分查找](https://programmercarl.com/0704.二分查找.html)这篇文章先看了,704题目做了之后再做这道题目就好很多了) +那么这里我采用while (left <= right)的写法,区间定义为[left, right],即左闭右闭的区间(如果这里有点看不懂了,强烈建议把[704.二分查找](https://programmercarl.com/0704.二分查找.html)这篇文章先看了,704题目做了之后再做这道题目就好很多了) -确定好:计算出来的右边界是不包好target的右边界,左边界同理。 +确定好:计算出来的右边界是不包含target的右边界,左边界同理。 可以写出如下代码 From 8c16a79ea406385fd1520d14016a3373e145c473 Mon Sep 17 00:00:00 2001 From: db <39407623+IcePigZDB@users.noreply.github.com> Date: Sun, 26 Dec 2021 22:00:18 +0800 Subject: [PATCH 0166/3019] =?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=A0=91=E6=9C=80?= =?UTF-8?q?=E5=A4=A7=E6=B7=B1=E5=BA=A6=20null->NULL?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...6\234\200\345\244\247\346\267\261\345\272\246.md" | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git "a/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" "b/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" index 82a82fd5a8..e0cf2b635c 100644 --- "a/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" +++ "b/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" @@ -48,7 +48,7 @@ int getdepth(treenode* node) 代码如下: ```CPP -if (node == null) return 0; +if (node == NULL) return 0; ``` 3. 确定单层递归的逻辑:先求它的左子树的深度,再求的右子树的深度,最后取左右深度最大的数值 再+1 (加1是因为算上当前中间节点)就是目前节点为根节点的树的深度。 @@ -68,7 +68,7 @@ return depth; class solution { public: int getdepth(treenode* node) { - if (node == null) return 0; + if (node == NULL) return 0; int leftdepth = getdepth(node->left); // 左 int rightdepth = getdepth(node->right); // 右 int depth = 1 + max(leftdepth, rightdepth); // 中 @@ -104,7 +104,7 @@ public: void getdepth(treenode* node, int depth) { result = depth > result ? depth : result; // 中 - if (node->left == null && node->right == null) return ; + if (node->left == NULL && node->right == NULL) return ; if (node->left) { // 左 depth++; // 深度+1 @@ -137,7 +137,7 @@ public: int result; void getdepth(treenode* node, int depth) { result = depth > result ? depth : result; // 中 - if (node->left == null && node->right == null) return ; + if (node->left == NULL && node->right == NULL) return ; if (node->left) { // 左 getdepth(node->left, depth + 1); } @@ -173,7 +173,7 @@ c++代码如下: class solution { public: int maxdepth(treenode* root) { - if (root == null) return 0; + if (root == NULL) return 0; int depth = 0; queue que; que.push(root); @@ -238,7 +238,7 @@ class solution { public: int maxdepth(node* root) { queue que; - if (root != null) que.push(root); + if (root != NULL) que.push(root); int depth = 0; while (!que.empty()) { int size = que.size(); From a00146c55944c218c28dc1ddde1ca70899202513 Mon Sep 17 00:00:00 2001 From: db <39407623+IcePigZDB@users.noreply.github.com> Date: Mon, 27 Dec 2021 09:27:01 +0800 Subject: [PATCH 0167/3019] =?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 --- ...5\275\222\345\270\246\347\235\200\345\233\236\346\272\257.md" | 1 + 1 file changed, 1 insertion(+) diff --git "a/problems/\344\272\214\345\217\211\346\240\221\344\270\255\351\200\222\345\275\222\345\270\246\347\235\200\345\233\236\346\272\257.md" "b/problems/\344\272\214\345\217\211\346\240\221\344\270\255\351\200\222\345\275\222\345\270\246\347\235\200\345\233\236\346\272\257.md" index b21c7cfe7b..372a4660ff 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\344\270\255\351\200\222\345\275\222\345\270\246\347\235\200\345\233\236\346\272\257.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\344\270\255\351\200\222\345\275\222\345\270\246\347\235\200\345\233\236\346\272\257.md" @@ -90,6 +90,7 @@ public: 如下为精简之后的递归代码:(257. 二叉树的所有路径) +CPP ``` class Solution { private: From 4545e48a90836b7d3a94d910d9d72e58dcd1c2d9 Mon Sep 17 00:00:00 2001 From: db <39407623+IcePigZDB@users.noreply.github.com> Date: Mon, 27 Dec 2021 09:27:45 +0800 Subject: [PATCH 0168/3019] =?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 --- ...\222\345\270\246\347\235\200\345\233\236\346\272\257.md" | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git "a/problems/\344\272\214\345\217\211\346\240\221\344\270\255\351\200\222\345\275\222\345\270\246\347\235\200\345\233\236\346\272\257.md" "b/problems/\344\272\214\345\217\211\346\240\221\344\270\255\351\200\222\345\275\222\345\270\246\347\235\200\345\233\236\346\272\257.md" index 372a4660ff..27ed7a6f1a 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\344\270\255\351\200\222\345\275\222\345\270\246\347\235\200\345\233\236\346\272\257.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\344\270\255\351\200\222\345\275\222\345\270\246\347\235\200\345\233\236\346\272\257.md" @@ -90,8 +90,7 @@ public: 如下为精简之后的递归代码:(257. 二叉树的所有路径) -CPP -``` +```CPP class Solution { private: void traversal(TreeNode* cur, string path, vector& result) { @@ -132,8 +131,7 @@ traversal(cur->left, path, result); // 左 即: -``` - +``` CPP if (cur->left) { path += "->"; traversal(cur->left, path, result); // 左 From eb2b5e756a3b0e2d92ee1bb0a0740ae9ccb9c64a Mon Sep 17 00:00:00 2001 From: qyg <1600314850@qq.com> Date: Mon, 27 Dec 2021 09:53:51 +0800 Subject: [PATCH 0169/3019] =?UTF-8?q?0053.=E6=9C=80=E5=A4=A7=E5=AD=90?= =?UTF-8?q?=E5=BA=8F=E5=92=8C=EF=BC=88=E5=8A=A8=E6=80=81=E8=A7=84=E5=88=92?= =?UTF-8?q?=EF=BC=89=EF=BC=9A=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 --- ...\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" "b/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" index 2e9d2fd55f..37de9bbed8 100644 --- "a/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" +++ "b/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" @@ -42,7 +42,7 @@ dp[i]只有两个方向可以推出来: dp[0]应该是多少呢? -更具dp[i]的定义,很明显dp[0]因为为nums[0]即dp[0] = nums[0]。 +根据dp[i]的定义,很明显dp[0]应为nums[0]即dp[0] = nums[0]。 4. 确定遍历顺序 From e1b489d34caed9d9552f1585defbc6cece269215 Mon Sep 17 00:00:00 2001 From: qyg <1600314850@qq.com> Date: Mon, 27 Dec 2021 09:54:39 +0800 Subject: [PATCH 0170/3019] =?UTF-8?q?0300.=E6=9C=80=E9=95=BF=E4=B8=8A?= =?UTF-8?q?=E5=8D=87=E5=AD=90=E5=BA=8F=E5=88=97=EF=BC=9A=E8=B0=83=E6=95=B4?= =?UTF-8?q?=E7=AC=94=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" "b/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" index 9c1c07f6dc..27d5b122a3 100644 --- "a/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" @@ -55,7 +55,7 @@ dp[i] 是有0到i-1各个位置的最长升序子序列 推导而来,那么遍历i一定是从前向后遍历。 -j其实就是0到i-1,遍历i的循环里外层,遍历j则在内层,代码如下: +j其实就是0到i-1,遍历i的循环在外层,遍历j则在内层,代码如下: ```CPP for (int i = 1; i < nums.size(); i++) { From 02fe7d6e79d8c9c644e842dbc12a113bbfce0809 Mon Sep 17 00:00:00 2001 From: qyg <1600314850@qq.com> Date: Mon, 27 Dec 2021 10:07:19 +0800 Subject: [PATCH 0171/3019] =?UTF-8?q?0392.=E5=88=A4=E6=96=AD=E5=AD=90?= =?UTF-8?q?=E5=BA=8F=E5=88=97=EF=BC=9A=E8=B0=83=E6=95=B4=E7=AC=94=E8=AF=AF?= =?UTF-8?q?=EF=BC=8C=E4=BC=98=E5=8C=96=E6=8E=92=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...10\244\346\226\255\345\255\220\345\272\217\345\210\227.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" "b/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" index ecde244857..d64e1fd080 100644 --- "a/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" @@ -81,13 +81,13 @@ if (s[i - 1] != t[j - 1]),此时相当于t要删除元素,t如果把当前 **其实这里只初始化dp[i][0]就够了,但一起初始化也方便,所以就一起操作了**,代码如下: -``` +```CPP vector> dp(s.size() + 1, vector(t.size() + 1, 0)); ``` 4. 确定遍历顺序 -同理从从递推公式可以看出dp[i][j]都是依赖于dp[i - 1][j - 1] 和 dp[i][j - 1],那么遍历顺序也应该是从上到下,从左到右 +同理从递推公式可以看出dp[i][j]都是依赖于dp[i - 1][j - 1] 和 dp[i][j - 1],那么遍历顺序也应该是从上到下,从左到右 如图所示: From 0fad1f60e1e2c408677ed75ce86618af539b598f Mon Sep 17 00:00:00 2001 From: qyg <1600314850@qq.com> Date: Mon, 27 Dec 2021 11:22:00 +0800 Subject: [PATCH 0172/3019] =?UTF-8?q?0583.=E4=B8=A4=E4=B8=AA=E5=AD=97?= =?UTF-8?q?=E7=AC=A6=E4=B8=B2=E7=9A=84=E5=88=A0=E9=99=A4=E6=93=8D=E4=BD=9C?= =?UTF-8?q?=EF=BC=9A=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 --- ...\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" "b/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" index a04907d4ef..d2f7d84b92 100644 --- "a/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" +++ "b/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" @@ -18,7 +18,7 @@ ## 思路 -本题和[动态规划:115.不同的子序列](https://programmercarl.com/0115.不同的子序列.html)相比,其实就是两个字符串可以都可以删除了,情况虽说复杂一些,但整体思路是不变的。 +本题和[动态规划:115.不同的子序列](https://programmercarl.com/0115.不同的子序列.html)相比,其实就是两个字符串都可以删除了,情况虽说复杂一些,但整体思路是不变的。 这次是两个字符串可以相互删了,这种题目也知道用动态规划的思路来解,动规五部曲,分析如下: From 94d1320fff38c56eb7dd2028fab9e2e2d9edb4f8 Mon Sep 17 00:00:00 2001 From: qyg <1600314850@qq.com> Date: Mon, 27 Dec 2021 11:28:27 +0800 Subject: [PATCH 0173/3019] =?UTF-8?q?0714.=E4=B9=B0=E5=8D=96=E8=82=A1?= =?UTF-8?q?=E7=A5=A8=E7=9A=84=E6=9C=80=E4=BD=B3=E6=97=B6=E6=9C=BA=E5=90=AB?= =?UTF-8?q?=E6=89=8B=E7=BB=AD=E8=B4=B9=EF=BC=88=E5=8A=A8=E6=80=81=E8=A7=84?= =?UTF-8?q?=E5=88=92=EF=BC=89=EF=BC=9A=E4=BF=AE=E6=94=B9=E9=93=BE=E6=8E=A5?= =?UTF-8?q?=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...12\250\346\200\201\350\247\204\345\210\222\357\274\211.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" "b/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" index 1f5218e974..b385d710d0 100644 --- "a/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" +++ "b/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" @@ -43,7 +43,7 @@ 那么我们再来看看是使用动规的方法如何解题。 -相对于[动态规划:122.买卖股票的最佳时机II](https://programmercarl.com/0122.买卖股票的最佳时机II.html),本题只需要在计算卖出操作的时候减去手续费就可以了,代码几乎是一样的。 +相对于[动态规划:122.买卖股票的最佳时机II](https://programmercarl.com/0122.买卖股票的最佳时机II(动态规划).html),本题只需要在计算卖出操作的时候减去手续费就可以了,代码几乎是一样的。 唯一差别在于递推公式部分,所以本篇也就不按照动规五部曲详细讲解了,主要讲解一下递推公式部分。 @@ -67,7 +67,7 @@ dp[i][1] 表示第i天不持有股票所得最多现金 所以:dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] + prices[i] - fee); -**本题和[动态规划:122.买卖股票的最佳时机II](https://programmercarl.com/0122.买卖股票的最佳时机II.html)的区别就是这里需要多一个减去手续费的操作**。 +**本题和[动态规划:122.买卖股票的最佳时机II](https://programmercarl.com/0122.买卖股票的最佳时机II(动态规划).html)的区别就是这里需要多一个减去手续费的操作**。 以上分析完毕,C++代码如下: From b6bb291bec7d45d9efc90020af2b0729813ce58d Mon Sep 17 00:00:00 2001 From: Frogrey <35210929+Frogrey@users.noreply.github.com> Date: Mon, 27 Dec 2021 15:28:22 +0800 Subject: [PATCH 0174/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20=E8=83=8C?= =?UTF-8?q?=E5=8C=85=E9=97=AE=E9=A2=98=E7=90=86=E8=AE=BA=E5=9F=BA=E7=A1=80?= =?UTF-8?q?=E5=A4=9A=E9=87=8D=E8=83=8C=E5=8C=85=20Java=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...32\351\207\215\350\203\214\345\214\205.md" | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\244\232\351\207\215\350\203\214\345\214\205.md" "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\244\232\351\207\215\350\203\214\345\214\205.md" index 55f7cf96f1..19374d54da 100644 --- "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\244\232\351\207\215\350\203\214\345\214\205.md" +++ "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\244\232\351\207\215\350\203\214\345\214\205.md" @@ -147,6 +147,51 @@ int main() { Java: +```Java +public void testMultiPack1(){ + // 版本一:改变物品数量为01背包格式 + List weight = new ArrayList<>(Arrays.asList(1, 3, 4)); + List value = new ArrayList<>(Arrays.asList(15, 20, 30)); + List nums = new ArrayList<>(Arrays.asList(2, 3, 2)); + int bagWeight = 10; + + for (int i = 0; i < nums.size(); i++) { + while (nums.get(i) > 1) { // 把物品展开为i + weight.add(weight.get(i)); + value.add(value.get(i)); + nums.set(i, nums.get(i) - 1); + } + } + + int[] dp = new int[bagWeight + 1]; + for(int i = 0; i < weight.size(); i++) { // 遍历物品 + for(int j = bagWeight; j >= weight.get(i); j--) { // 遍历背包容量 + dp[j] = Math.max(dp[j], dp[j - weight.get(i)] + value.get(i)); + } + System.out.println(Arrays.toString(dp)); + } +} + +public void testMultiPack2(){ + // 版本二:改变遍历个数 + int[] weight = new int[] {1, 3, 4}; + int[] value = new int[] {15, 20, 30}; + int[] nums = new int[] {2, 3, 2}; + int bagWeight = 10; + + int[] dp = new int[bagWeight + 1]; + for(int i = 0; i < weight.length; i++) { // 遍历物品 + for(int j = bagWeight; j >= weight[i]; j--) { // 遍历背包容量 + // 以上为01背包,然后加一个遍历个数 + for (int k = 1; k <= nums[i] && (j - k * weight[i]) >= 0; k++) { // 遍历个数 + dp[j] = Math.max(dp[j], dp[j - k * weight[i]] + k * value[i]); + } + System.out.println(Arrays.toString(dp)); + } + } +} +``` + Python: ```python From 2e877cf1e838dbfd1d48b9a61d62562d14bcb592 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, 27 Dec 2021 18:47:28 +0800 Subject: [PATCH 0175/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20=E4=BA=8C?= =?UTF-8?q?=E5=8F=89=E6=A0=91=E7=9A=84=E8=BF=AD=E4=BB=A3=E9=81=8D=E5=8E=86?= =?UTF-8?q?=20Swift=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...55\344\273\243\351\201\215\345\216\206.md" | 73 +++++++++++++++++++ 1 file changed, 73 insertions(+) diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" index a139652ca0..4cb94cb5e3 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" @@ -454,6 +454,79 @@ var postorderTraversal = function(root, res = []) { }; ``` +Swift: + +> 迭代法前序遍历 +```swift +func preorderTraversal(_ root: TreeNode?) -> [Int] { + var res = [Int]() + if root == nil { + return res + } + var stack = [TreeNode]() + stack.append(root!) + while !stack.isEmpty { + let node = stack.popLast()! + res.append(node.val) + if node.right != nil { + stack.append(node.right!) + } + if node.left != nil { + stack.append(node.left!) + } + } + return res +} +``` + +> 迭代法中序遍历 +```swift +func inorderTraversal(_ root: TreeNode?) -> [Int] { + var res = [Int]() + if root == nil { + return res + } + var stack = [TreeNode]() + var cur: TreeNode? = root + while cur != nil || !stack.isEmpty { + if cur != nil { + stack.append(cur!) + cur = cur!.left + } else { + cur = stack.popLast() + res.append(cur!.val) + cur = cur!.right + } + } + return res +} +``` + +> 迭代法后序遍历 +```swift +func postorderTraversal(_ root: TreeNode?) -> [Int] { + var res = [Int]() + if root == nil { + return res + } + var stack = [TreeNode]() + stack.append(root!) + // res 存储 中 -> 右 -> 左 + while !stack.isEmpty { + let node = stack.popLast()! + res.append(node.val) + if node.left != nil { + stack.append(node.left!) + } + if node.right != nil { + stack.append(node.right!) + } + } + // res 翻转 + res.reverse() + return res +} +``` -----------------------
From 09f9682792f2d6adb916da6e06ff6ec7d3cea8b5 Mon Sep 17 00:00:00 2001 From: qyg <1600314850@qq.com> Date: Tue, 28 Dec 2021 10:02:16 +0800 Subject: [PATCH 0176/3019] =?UTF-8?q?0300.=E6=9C=80=E9=95=BF=E4=B8=8A?= =?UTF-8?q?=E5=8D=87=E5=AD=90=E5=BA=8F=E5=88=97=EF=BC=9A=E8=B0=83=E6=95=B4?= =?UTF-8?q?=E7=AC=94=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" "b/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" index 27d5b122a3..ed61a30e8d 100644 --- "a/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" @@ -49,7 +49,7 @@ 3. dp[i]的初始化 -每一个i,对应的dp[i](即最长上升子序列)起始大小至少都是是1. +每一个i,对应的dp[i](即最长上升子序列)起始大小至少都是1. 4. 确定遍历顺序 From 7fac9733dac6d3e801ec1ee01bd485005b3c1a25 Mon Sep 17 00:00:00 2001 From: Tina-Brick <52629663+Tina-Brick@users.noreply.github.com> Date: Tue, 28 Dec 2021 02:40:35 -0600 Subject: [PATCH 0177/3019] =?UTF-8?q?Update=200242.=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=8D.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" | 2 ++ 1 file changed, 2 insertions(+) diff --git "a/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" "b/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" index 4a8e9d14c5..cdcf39ce7b 100644 --- "a/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" +++ "b/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" @@ -125,6 +125,8 @@ class Solution: if record[i] != 0: #record数组如果有的元素不为零0,说明字符串s和t 一定是谁多了字符或者谁少了字符。 return False + #如果有一个元素不为零,则可以判断字符串s和t不是字母异位词 + break return True ``` From f403cbe3c37ed9dbd2adfbb164ecb9d01b1b2017 Mon Sep 17 00:00:00 2001 From: db <39407623+IcePigZDB@users.noreply.github.com> Date: Mon, 20 Dec 2021 15:45:51 +0800 Subject: [PATCH 0178/3019] =?UTF-8?q?Update=200102.=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=A0=91=E7=9A=84=E5=B1=82=E5=BA=8F=E9=81=8D=E5=8E=86.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 更新错别字 --- ...\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" index 7ee6e95cc3..4fcbbff8dd 100644 --- "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" +++ "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" @@ -12,7 +12,7 @@ * 107.二叉树的层次遍历II * 199.二叉树的右视图 * 637.二叉树的层平均值 -* 429.N叉树的前序遍历 +* 429.N叉树的层序遍历 * 515.在每个树行中找最大值 * 116.填充每个节点的下一个右侧节点指针 * 117.填充每个节点的下一个右侧节点指针II From bf8ece20044eb115e5f12c7fd8b08485225a11f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=86=E5=8A=B2=E6=B6=9B?= Date: Tue, 28 Dec 2021 16:39:16 +0800 Subject: [PATCH 0179/3019] =?UTF-8?q?=E6=B5=8B=E8=AF=95=E4=B8=8D=E5=90=8C?= =?UTF-8?q?=E6=97=B6=E9=97=B4=E5=A4=8D=E6=9D=82=E5=BA=A6=E7=9A=84=E7=A8=8B?= =?UTF-8?q?=E5=BA=8F=E8=BF=90=E8=A1=8C=E6=97=B6=E9=97=B4Java=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E6=B5=8B=E8=AF=95=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...57\345\244\232\345\244\247\357\274\237.md" | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git "a/problems/\345\211\215\345\272\217/On\347\232\204\347\256\227\346\263\225\345\261\205\347\204\266\350\266\205\346\227\266\344\272\206\357\274\214\346\255\244\346\227\266\347\232\204n\347\251\266\347\253\237\346\230\257\345\244\232\345\244\247\357\274\237.md" "b/problems/\345\211\215\345\272\217/On\347\232\204\347\256\227\346\263\225\345\261\205\347\204\266\350\266\205\346\227\266\344\272\206\357\274\214\346\255\244\346\227\266\347\232\204n\347\251\266\347\253\237\346\230\257\345\244\232\345\244\247\357\274\237.md" index 2019e691d9..9a56937c95 100644 --- "a/problems/\345\211\215\345\272\217/On\347\232\204\347\256\227\346\263\225\345\261\205\347\204\266\350\266\205\346\227\266\344\272\206\357\274\214\346\255\244\346\227\266\347\232\204n\347\251\266\347\253\237\346\230\257\345\244\232\345\244\247\357\274\237.md" +++ "b/problems/\345\211\215\345\272\217/On\347\232\204\347\256\227\346\263\225\345\261\205\347\204\266\350\266\205\346\227\266\344\272\206\357\274\214\346\255\244\346\227\266\347\232\204n\347\251\266\347\253\237\346\230\257\345\244\232\345\244\247\357\274\237.md" @@ -206,7 +206,62 @@ int main() { } } +``` + + +Java版本 +```Java +import java.util.Scanner; + +public class TimeComplexity { + // o(n) + public static void function1(long n) { + System.out.println("o(n)算法"); + long k = 0; + for (long i = 0; i < n; i++) { + k++; + } + } + + // o(n^2) + public static void function2(long n) { + System.out.println("o(n^2)算法"); + long k = 0; + for (long i = 0; i < n; i++) { + for (long j = 0; j < n; j++) { + k++; + } + } + } + + // o(nlogn) + public static void function3(long n) { + System.out.println("o(nlogn)算法"); + long k = 0; + for (long i = 0; i < n; i++) { + for (long j = 1; j < n; j = j * 2) { // 注意这里j=1 + k++; + } + } + } + + public static void main(String[] args) { + while(true) { + Scanner in = new Scanner(System.in); + System.out.print("输入n: "); + int n = in.nextInt(); + long startTime = System.currentTimeMillis(); + function1(n); + // function2(n); + // function3(n); + + long endTime = System.currentTimeMillis(); + long costTime = endTime - startTime; + System.out.println("算法耗时 == " + costTime + "ms"); + } + } +} ``` # 总结 From 050a498c10aba764efee7ebb4141f96c0cddbda4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=86=E5=8A=B2=E6=B6=9B?= Date: Tue, 28 Dec 2021 16:42:31 +0800 Subject: [PATCH 0180/3019] =?UTF-8?q?=E6=B5=8B=E8=AF=95=E4=B8=8D=E5=90=8C?= =?UTF-8?q?=E6=97=B6=E9=97=B4=E5=A4=8D=E6=9D=82=E5=BA=A6=E7=9A=84=E7=A8=8B?= =?UTF-8?q?=E5=BA=8F=E8=BF=90=E8=A1=8C=E6=97=B6=E9=97=B4Java=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E6=B5=8B=E8=AF=95=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...0\206\350\276\223\345\205\245\350\276\223\345\207\272.md" | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 "problems/\345\211\215\345\272\217/Java\345\244\204\347\220\206\350\276\223\345\205\245\350\276\223\345\207\272.md" diff --git "a/problems/\345\211\215\345\272\217/Java\345\244\204\347\220\206\350\276\223\345\205\245\350\276\223\345\207\272.md" "b/problems/\345\211\215\345\272\217/Java\345\244\204\347\220\206\350\276\223\345\205\245\350\276\223\345\207\272.md" new file mode 100644 index 0000000000..9ddec96dd4 --- /dev/null +++ "b/problems/\345\211\215\345\272\217/Java\345\244\204\347\220\206\350\276\223\345\205\245\350\276\223\345\207\272.md" @@ -0,0 +1,5 @@ +在面试中,我们常常会遇到面试官让我们用某种编程语言做题,并要求能够在本地编译运行。 +这种模式也被称做ACM模式。 + +本文将介绍如何用Java处理输入输出。 + From 440f94447a88184f9c664e302720cded7a565aa0 Mon Sep 17 00:00:00 2001 From: bqlin Date: Sun, 19 Dec 2021 11:38:26 +0800 Subject: [PATCH 0181/3019] =?UTF-8?q?=E2=80=9C=E6=9A=B4=E5=88=A9=E2=80=9D?= =?UTF-8?q?=20->=20=E2=80=9C=E6=9A=B4=E5=8A=9B=E2=80=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\257\345\221\250\346\234\253\346\200\273\347\273\223.md" | 2 +- .../\345\233\236\346\272\257\346\200\273\347\273\223.md" | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20201030\345\233\236\346\272\257\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20201030\345\233\236\346\272\257\345\221\250\346\234\253\346\200\273\347\273\223.md" index 3a432bee81..6127016111 100644 --- "a/problems/\345\221\250\346\200\273\347\273\223/20201030\345\233\236\346\272\257\345\221\250\346\234\253\346\200\273\347\273\223.md" +++ "b/problems/\345\221\250\346\200\273\347\273\223/20201030\345\233\236\346\272\257\345\221\250\346\234\253\346\200\273\347\273\223.md" @@ -40,7 +40,7 @@ 在[回溯算法:求组合问题!](https://programmercarl.com/0077.组合.html)中,我们开始用回溯法解决第一道题目,组合问题。 -我在文中开始的时候给大家列举k层for循环例子,进而得出都是同样是暴利解法,为什么要用回溯法。 +我在文中开始的时候给大家列举k层for循环例子,进而得出都是同样是暴力解法,为什么要用回溯法。 **此时大家应该深有体会回溯法的魅力,用递归控制for循环嵌套的数量!** diff --git "a/problems/\345\233\236\346\272\257\346\200\273\347\273\223.md" "b/problems/\345\233\236\346\272\257\346\200\273\347\273\223.md" index cff41f242c..b6ca5a867b 100644 --- "a/problems/\345\233\236\346\272\257\346\200\273\347\273\223.md" +++ "b/problems/\345\233\236\346\272\257\346\200\273\347\273\223.md" @@ -55,7 +55,7 @@ void backtracking(参数) { 在[回溯算法:求组合问题!](https://programmercarl.com/0077.组合.html)中,我们开始用回溯法解决第一道题目:组合问题。 -我在文中开始的时候给大家列举k层for循环例子,进而得出都是同样是暴利解法,为什么要用回溯法! +我在文中开始的时候给大家列举k层for循环例子,进而得出都是同样是暴力解法,为什么要用回溯法! **此时大家应该深有体会回溯法的魅力,用递归控制for循环嵌套的数量!** @@ -117,7 +117,7 @@ void backtracking(参数) { 最后还给出了本题的剪枝优化,如下: -``` +```cpp for (int i = startIndex; i < candidates.size() && sum + candidates[i] <= target; i++) ``` @@ -251,7 +251,7 @@ if (startIndex >= nums.size()) { // 终止条件可以不加 [回溯算法:排列问题!](https://programmercarl.com/0046.全排列.html) 又不一样了。 -排列是有序的,也就是说[1,2] 和[2,1] 是两个集合,这和之前分析的子集以及组合所不同的地方。 +排列是有序的,也就是说 [1,2] 和 [2,1] 是两个集合,这和之前分析的子集以及组合所不同的地方。 可以看出元素1在[1,2]中已经使用过了,但是在[2,1]中还要在使用一次1,所以处理排列问题就不用使用startIndex了。 From 9e70fbc5280c8819863984cbb39bab73c96c9514 Mon Sep 17 00:00:00 2001 From: bqlin Date: Sun, 19 Dec 2021 11:54:22 +0800 Subject: [PATCH 0182/3019] =?UTF-8?q?=E2=80=9C=E6=A0=91=E6=94=AF=E2=80=9D?= =?UTF-8?q?=20->=20=E2=80=9D=E6=A0=91=E6=9E=9D=E2=80=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\347\273\204\345\220\210\346\200\273\345\222\214II.md" | 8 ++++---- "problems/0047.\345\205\250\346\216\222\345\210\227II.md" | 4 ++-- "problems/0090.\345\255\220\351\233\206II.md" | 2 +- ...57\345\221\250\346\234\253\346\200\273\347\273\223.md" | 2 +- .../\345\233\236\346\272\257\346\200\273\347\273\223.md" | 2 +- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git "a/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" "b/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" index 31011ed639..14737e3149 100644 --- "a/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" +++ "b/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" @@ -128,7 +128,7 @@ if (sum == target) { 我在图中将used的变化用橘黄色标注上,可以看出在candidates[i] == candidates[i - 1]相同的情况下: -* used[i - 1] == true,说明同一树支candidates[i - 1]使用过 +* used[i - 1] == true,说明同一树枝candidates[i - 1]使用过 * used[i - 1] == false,说明同一树层candidates[i - 1]使用过 **这块去重的逻辑很抽象,网上搜的题解基本没有能讲清楚的,如果大家之前思考过这个问题或者刷过这道题目,看到这里一定会感觉通透了很多!** @@ -137,7 +137,7 @@ if (sum == target) { ```CPP for (int i = startIndex; i < candidates.size() && sum + candidates[i] <= target; i++) { - // used[i - 1] == true,说明同一树支candidates[i - 1]使用过 + // used[i - 1] == true,说明同一树枝candidates[i - 1]使用过 // used[i - 1] == false,说明同一树层candidates[i - 1]使用过 // 要对同一树层使用过的元素进行跳过 if (i > 0 && candidates[i] == candidates[i - 1] && used[i - 1] == false) { @@ -169,7 +169,7 @@ private: return; } for (int i = startIndex; i < candidates.size() && sum + candidates[i] <= target; i++) { - // used[i - 1] == true,说明同一树支candidates[i - 1]使用过 + // used[i - 1] == true,说明同一树枝candidates[i - 1]使用过 // used[i - 1] == false,说明同一树层candidates[i - 1]使用过 // 要对同一树层使用过的元素进行跳过 if (i > 0 && candidates[i] == candidates[i - 1] && used[i - 1] == false) { @@ -404,7 +404,7 @@ func backtracking(startIndex,sum,target int,candidates,trcak []int,res *[][]int, } if sum>target{return} //回溯 - // used[i - 1] == true,说明同一树支candidates[i - 1]使用过 + // used[i - 1] == true,说明同一树枝candidates[i - 1]使用过 // used[i - 1] == false,说明同一树层candidates[i - 1]使用过 for i:=startIndex;i0&&candidates[i]==candidates[i-1]&&history[i-1]==false{ diff --git "a/problems/0047.\345\205\250\346\216\222\345\210\227II.md" "b/problems/0047.\345\205\250\346\216\222\345\210\227II.md" index 6a94d1e0aa..781f01c380 100644 --- "a/problems/0047.\345\205\250\346\216\222\345\210\227II.md" +++ "b/problems/0047.\345\205\250\346\216\222\345\210\227II.md" @@ -65,7 +65,7 @@ private: return; } for (int i = 0; i < nums.size(); i++) { - // used[i - 1] == true,说明同一树支nums[i - 1]使用过 + // used[i - 1] == true,说明同一树枝nums[i - 1]使用过 // used[i - 1] == false,说明同一树层nums[i - 1]使用过 // 如果同一树层nums[i - 1]使用过则直接跳过 if (i > 0 && nums[i] == nums[i - 1] && used[i - 1] == false) { @@ -183,7 +183,7 @@ class Solution { } //如果同⼀树⽀nums[i]没使⽤过开始处理 if (used[i] == false) { - used[i] = true;//标记同⼀树⽀nums[i]使⽤过,防止同一树支重复使用 + used[i] = true;//标记同⼀树⽀nums[i]使⽤过,防止同一树枝重复使用 path.add(nums[i]); backTrack(nums, used); path.remove(path.size() - 1);//回溯,说明同⼀树层nums[i]使⽤过,防止下一树层重复 diff --git "a/problems/0090.\345\255\220\351\233\206II.md" "b/problems/0090.\345\255\220\351\233\206II.md" index 5b92517aa6..48085a3f3e 100644 --- "a/problems/0090.\345\255\220\351\233\206II.md" +++ "b/problems/0090.\345\255\220\351\233\206II.md" @@ -55,7 +55,7 @@ private: void backtracking(vector& nums, int startIndex, vector& used) { result.push_back(path); for (int i = startIndex; i < nums.size(); i++) { - // used[i - 1] == true,说明同一树支candidates[i - 1]使用过 + // used[i - 1] == true,说明同一树枝candidates[i - 1]使用过 // used[i - 1] == false,说明同一树层candidates[i - 1]使用过 // 而我们要对同一树层使用过的元素进行跳过 if (i > 0 && nums[i] == nums[i - 1] && used[i - 1] == false) { diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20201107\345\233\236\346\272\257\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20201107\345\233\236\346\272\257\345\221\250\346\234\253\346\200\273\347\273\223.md" index 71bf62de05..f9940a2a72 100644 --- "a/problems/\345\221\250\346\200\273\347\273\223/20201107\345\233\236\346\272\257\345\221\250\346\234\253\346\200\273\347\273\223.md" +++ "b/problems/\345\221\250\346\200\273\347\273\223/20201107\345\233\236\346\272\257\345\221\250\346\234\253\346\200\273\347\273\223.md" @@ -50,7 +50,7 @@ for (int i = startIndex; i < candidates.size() && sum + candidates[i] <= target; 我在图中将used的变化用橘黄色标注上,可以看出在candidates[i] == candidates[i - 1]相同的情况下: -* used[i - 1] == true,说明同一树支candidates[i - 1]使用过 +* used[i - 1] == true,说明同一树枝candidates[i - 1]使用过 * used[i - 1] == false,说明同一树层candidates[i - 1]使用过 **这块去重的逻辑很抽象,网上搜的题解基本没有能讲清楚的,如果大家之前思考过这个问题或者刷过这道题目,看到这里一定会感觉通透了很多!** diff --git "a/problems/\345\233\236\346\272\257\346\200\273\347\273\223.md" "b/problems/\345\233\236\346\272\257\346\200\273\347\273\223.md" index b6ca5a867b..6365235f5a 100644 --- "a/problems/\345\233\236\346\272\257\346\200\273\347\273\223.md" +++ "b/problems/\345\233\236\346\272\257\346\200\273\347\273\223.md" @@ -142,7 +142,7 @@ for (int i = startIndex; i < candidates.size() && sum + candidates[i] <= target; 我在图中将used的变化用橘黄色标注上,**可以看出在candidates[i] == candidates[i - 1]相同的情况下:** -* used[i - 1] == true,说明同一树支candidates[i - 1]使用过 +* used[i - 1] == true,说明同一树枝candidates[i - 1]使用过 * used[i - 1] == false,说明同一树层candidates[i - 1]使用过 **这块去重的逻辑很抽象,网上搜的题解基本没有能讲清楚的,如果大家之前思考过这个问题或者刷过这道题目,看到这里一定会感觉通透了很多!** From 96f70a46a47249dcf6057b37232e3e812f356265 Mon Sep 17 00:00:00 2001 From: bqlin Date: Sun, 19 Dec 2021 12:01:58 +0800 Subject: [PATCH 0183/3019] =?UTF-8?q?=E2=80=9C=E4=B8=8D=E9=80=82=E7=94=A8?= =?UTF-8?q?=E2=80=9D=20->=20=E2=80=9C=E4=B8=8D=E4=BD=BF=E7=94=A8=E2=80=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "problems/0090.\345\255\220\351\233\206II.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0090.\345\255\220\351\233\206II.md" "b/problems/0090.\345\255\220\351\233\206II.md" index 48085a3f3e..1ae5c9660b 100644 --- "a/problems/0090.\345\255\220\351\233\206II.md" +++ "b/problems/0090.\345\255\220\351\233\206II.md" @@ -115,7 +115,7 @@ public: ## 补充 -本题也可以不适用used数组来去重,因为递归的时候下一个startIndex是i+1而不是0。 +本题也可以不使用used数组来去重,因为递归的时候下一个startIndex是i+1而不是0。 如果要是全排列的话,每次要从0开始遍历,为了跳过已入栈的元素,需要使用used。 From 898330147cfefd8e018f2c0c84182c207bcca556 Mon Sep 17 00:00:00 2001 From: bqlin Date: Sat, 25 Dec 2021 12:24:02 +0800 Subject: [PATCH 0184/3019] =?UTF-8?q?=E2=80=9C=E9=A2=97=E2=80=9D=20->=20?= =?UTF-8?q?=E2=80=9C=E6=A3=B5=E2=80=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "problems/0051.N\347\232\207\345\220\216.md" | 6 +++--- ...270\215\345\220\214\350\267\257\345\276\204.md" | 4 ++-- "problems/0077.\347\273\204\345\220\210.md" | 2 +- ...273\204\345\220\210\344\274\230\345\214\226.md" | 2 +- "problems/0078.\345\255\220\351\233\206.md" | 2 +- ...217\211\346\220\234\347\264\242\346\240\221.md" | 2 +- ...200\240\344\272\214\345\217\211\346\240\221.md" | 14 +++++++------- ...217\211\346\220\234\347\264\242\346\240\221.md" | 4 ++-- ...241\241\344\272\214\345\217\211\346\240\221.md" | 2 +- ...267\257\345\276\204\346\200\273\345\222\214.md" | 4 ++-- ...211\262\345\233\236\346\226\207\344\270\262.md" | 2 +- ...205\254\345\205\261\347\245\226\345\205\210.md" | 6 +++--- ...253\230\351\242\221\345\205\203\347\264\240.md" | 2 +- ...270\255\347\232\204\350\212\202\347\202\271.md" | 2 +- ...270\213\350\247\222\347\232\204\345\200\274.md" | 4 ++-- ...270\272\347\264\257\345\212\240\346\240\221.md" | 2 +- ...271\266\344\272\214\345\217\211\346\240\221.md" | 2 +- ...6\227\344\275\231\350\277\236\346\216\245II.md" | 2 +- ...217\222\345\205\245\346\223\215\344\275\234.md" | 2 +- ...273\272\344\272\214\345\217\211\346\240\221.md" | 2 +- ...235\202\345\272\246\345\210\206\346\236\220.md" | 4 ++-- ...244\215\346\235\202\345\272\246\357\274\201.md" | 6 +++--- ...221\250\346\234\253\346\200\273\347\273\223.md" | 4 ++-- ...221\250\346\234\253\346\200\273\347\273\223.md" | 4 ++-- ...221\250\346\234\253\346\200\273\347\273\223.md" | 2 +- ...233\236\346\272\257\346\200\273\347\273\223.md" | 8 ++++---- ...270\200\347\247\215\345\206\231\346\263\225.md" | 2 +- ...220\206\350\256\272\345\237\272\347\241\200.md" | 2 +- ...230\237\345\210\227\346\200\273\347\273\223.md" | 2 +- 29 files changed, 51 insertions(+), 51 deletions(-) diff --git "a/problems/0051.N\347\232\207\345\220\216.md" "b/problems/0051.N\347\232\207\345\220\216.md" index 7302887aa5..fa1e9270d4 100644 --- "a/problems/0051.N\347\232\207\345\220\216.md" +++ "b/problems/0051.N\347\232\207\345\220\216.md" @@ -43,13 +43,13 @@ n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上, 确定完约束条件,来看看究竟要怎么去搜索皇后们的位置,其实搜索皇后的位置,可以抽象为一棵树。 -下面我用一个 3 * 3 的棋盘,将搜索过程抽象为一颗树,如图: +下面我用一个 3 * 3 的棋盘,将搜索过程抽象为一棵树,如图: ![51.N皇后](https://img-blog.csdnimg.cn/20210130182532303.jpg) -从图中,可以看出,二维矩阵中矩阵的高就是这颗树的高度,矩阵的宽就是树形结构中每一个节点的宽度。 +从图中,可以看出,二维矩阵中矩阵的高就是这棵树的高度,矩阵的宽就是树形结构中每一个节点的宽度。 -那么我们用皇后们的约束条件,来回溯搜索这颗树,**只要搜索到了树的叶子节点,说明就找到了皇后们的合理位置了**。 +那么我们用皇后们的约束条件,来回溯搜索这棵树,**只要搜索到了树的叶子节点,说明就找到了皇后们的合理位置了**。 ### 回溯三部曲 diff --git "a/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" "b/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" index 38481b50d6..b8d8b447de 100644 --- "a/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" +++ "b/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" @@ -49,7 +49,7 @@ 这道题目,刚一看最直观的想法就是用图论里的深搜,来枚举出来有多少种路径。 -注意题目中说机器人每次只能向下或者向右移动一步,那么其实**机器人走过的路径可以抽象为一颗二叉树,而叶子节点就是终点!** +注意题目中说机器人每次只能向下或者向右移动一步,那么其实**机器人走过的路径可以抽象为一棵二叉树,而叶子节点就是终点!** 如图举例: @@ -76,7 +76,7 @@ public: 来分析一下时间复杂度,这个深搜的算法,其实就是要遍历整个二叉树。 -这颗树的深度其实就是m+n-1(深度按从1开始计算)。 +这棵树的深度其实就是m+n-1(深度按从1开始计算)。 那二叉树的节点个数就是 2^(m + n - 1) - 1。可以理解深搜的算法就是遍历了整个满二叉树(其实没有遍历整个满二叉树,只是近似而已) diff --git "a/problems/0077.\347\273\204\345\220\210.md" "b/problems/0077.\347\273\204\345\220\210.md" index 4ec154e10a..8e944eb377 100644 --- "a/problems/0077.\347\273\204\345\220\210.md" +++ "b/problems/0077.\347\273\204\345\220\210.md" @@ -328,7 +328,7 @@ public: 本篇我们准对求组合问题的回溯法代码做了剪枝优化,这个优化如果不画图的话,其实不好理解,也不好讲清楚。 -所以我依然是把整个回溯过程抽象为一颗树形结构,然后可以直观的看出,剪枝究竟是剪的哪里。 +所以我依然是把整个回溯过程抽象为一棵树形结构,然后可以直观的看出,剪枝究竟是剪的哪里。 diff --git "a/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" "b/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" index 5fe56e824c..bd941e038c 100644 --- "a/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" +++ "b/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" @@ -133,7 +133,7 @@ public: 本篇我们准对求组合问题的回溯法代码做了剪枝优化,这个优化如果不画图的话,其实不好理解,也不好讲清楚。 -所以我依然是把整个回溯过程抽象为一颗树形结构,然后可以直观的看出,剪枝究竟是剪的哪里。 +所以我依然是把整个回溯过程抽象为一棵树形结构,然后可以直观的看出,剪枝究竟是剪的哪里。 **就酱,学到了就帮Carl转发一下吧,让更多的同学知道这里!** diff --git "a/problems/0078.\345\255\220\351\233\206.md" "b/problems/0078.\345\255\220\351\233\206.md" index f263c3fc59..1abf8c9553 100644 --- "a/problems/0078.\345\255\220\351\233\206.md" +++ "b/problems/0078.\345\255\220\351\233\206.md" @@ -145,7 +145,7 @@ public: ``` -在注释中,可以发现可以不写终止条件,因为本来我们就要遍历整颗树。 +在注释中,可以发现可以不写终止条件,因为本来我们就要遍历整棵树。 有的同学可能担心不写终止条件会不会无限递归? diff --git "a/problems/0096.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0096.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" index 43d4cfb066..1b0a788f14 100644 --- "a/problems/0096.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" +++ "b/problems/0096.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" @@ -87,7 +87,7 @@ j相当于是头结点的元素,从1遍历到i为止。 那么dp[0]应该是多少呢? -从定义上来讲,空节点也是一颗二叉树,也是一颗二叉搜索树,这是可以说得通的。 +从定义上来讲,空节点也是一棵二叉树,也是一棵二叉搜索树,这是可以说得通的。 从递归公式上来讲,dp[以j为头结点左子树节点数量] * dp[以j为头结点右子树节点数量] 中以j为头结点左子树节点数量为0,也需要dp[以j为头结点左子树节点数量] = 1, 否则乘法的结果就都变成0了。 diff --git "a/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" "b/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" index 30ec684d2a..487e4f7d9b 100644 --- "a/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" @@ -31,7 +31,7 @@ 首先回忆一下如何根据两个顺序构造一个唯一的二叉树,相信理论知识大家应该都清楚,就是以 后序数组的最后一个元素为切割点,先切中序数组,根据中序数组,反过来在切后序数组。一层一层切下去,每次后序数组最后一个元素就是节点元素。 -如果让我们肉眼看两个序列,画一颗二叉树的话,应该分分钟都可以画出来。 +如果让我们肉眼看两个序列,画一棵二叉树的话,应该分分钟都可以画出来。 流程如图: @@ -540,13 +540,13 @@ public: # 思考题 -前序和中序可以唯一确定一颗二叉树。 +前序和中序可以唯一确定一棵二叉树。 -后序和中序可以唯一确定一颗二叉树。 +后序和中序可以唯一确定一棵二叉树。 -那么前序和后序可不可以唯一确定一颗二叉树呢? +那么前序和后序可不可以唯一确定一棵二叉树呢? -**前序和后序不能唯一确定一颗二叉树!**,因为没有中序遍历无法确定左右部分,也就是无法分割。 +**前序和后序不能唯一确定一棵二叉树!**,因为没有中序遍历无法确定左右部分,也就是无法分割。 举一个例子: @@ -558,7 +558,7 @@ tree2 的前序遍历是[1 2 3], 后序遍历是[3 2 1]。 那么tree1 和 tree2 的前序和后序完全相同,这是一棵树么,很明显是两棵树! -所以前序和后序不能唯一确定一颗二叉树! +所以前序和后序不能唯一确定一棵二叉树! # 总结 @@ -570,7 +570,7 @@ tree2 的前序遍历是[1 2 3], 后序遍历是[3 2 1]。 大家遇到这种题目的时候,也要学会打日志来调试(如何打日志有时候也是个技术活),不要脑动模拟,脑动模拟很容易越想越乱。 -最后我还给出了为什么前序和中序可以唯一确定一颗二叉树,后序和中序可以唯一确定一颗二叉树,而前序和后序却不行。 +最后我还给出了为什么前序和中序可以唯一确定一棵二叉树,后序和中序可以唯一确定一棵二叉树,而前序和后序却不行。 认真研究完本篇,相信大家对二叉树的构造会清晰很多。 diff --git "a/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" index 194f69df50..bd48ea0c96 100644 --- "a/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" +++ "b/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" @@ -24,7 +24,7 @@ 做这道题目之前大家可以了解一下这几道: * [106.从中序与后序遍历序列构造二叉树](https://programmercarl.com/0106.从中序与后序遍历序列构造二叉树.html) -* [654.最大二叉树](https://programmercarl.com/0654.最大二叉树.html)中其实已经讲过了,如果根据数组构造一颗二叉树。 +* [654.最大二叉树](https://programmercarl.com/0654.最大二叉树.html)中其实已经讲过了,如果根据数组构造一棵二叉树。 * [701.二叉搜索树中的插入操作](https://programmercarl.com/0701.二叉搜索树中的插入操作.html) * [450.删除二叉搜索树中的节点](https://programmercarl.com/0450.删除二叉搜索树中的节点.html) @@ -36,7 +36,7 @@ 其实这里不用强调平衡二叉搜索树,数组构造二叉树,构成平衡树是自然而然的事情,因为大家默认都是从数组中间位置取值作为节点元素,一般不会随机取,**所以想构成不平衡的二叉树是自找麻烦**。 -在[二叉树:构造二叉树登场!](https://programmercarl.com/0106.从中序与后序遍历序列构造二叉树.html)和[二叉树:构造一棵最大的二叉树](https://programmercarl.com/0654.最大二叉树.html)中其实已经讲过了,如果根据数组构造一颗二叉树。 +在[二叉树:构造二叉树登场!](https://programmercarl.com/0106.从中序与后序遍历序列构造二叉树.html)和[二叉树:构造一棵最大的二叉树](https://programmercarl.com/0654.最大二叉树.html)中其实已经讲过了,如果根据数组构造一棵二叉树。 **本质就是寻找分割点,分割点作为当前节点,然后递归左区间和右区间**。 diff --git "a/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" "b/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" index 83e8146d2c..c0914f05de 100644 --- "a/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" @@ -51,7 +51,7 @@ 有的同学一定疑惑,为什么[104.二叉树的最大深度](https://programmercarl.com/0104.二叉树的最大深度.html)中求的是二叉树的最大深度,也用的是后序遍历。 -**那是因为代码的逻辑其实是求的根节点的高度,而根节点的高度就是这颗树的最大深度,所以才可以使用后序遍历。** +**那是因为代码的逻辑其实是求的根节点的高度,而根节点的高度就是这棵树的最大深度,所以才可以使用后序遍历。** 在[104.二叉树的最大深度](https://programmercarl.com/0104.二叉树的最大深度.html)中,如果真正求取二叉树的最大深度,代码应该写成如下:(前序遍历) diff --git "a/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" "b/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" index ec346d6bf7..910e57c86f 100644 --- "a/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" +++ "b/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" @@ -43,8 +43,8 @@ 再来看返回值,递归函数什么时候需要返回值?什么时候不需要返回值?这里总结如下三点: -* 如果需要搜索整颗二叉树且不用处理递归返回值,递归函数就不要返回值。(这种情况就是本文下半部分介绍的113.路径总和ii) -* 如果需要搜索整颗二叉树且需要处理递归返回值,递归函数就需要返回值。 (这种情况我们在[236. 二叉树的最近公共祖先](https://programmercarl.com/0236.二叉树的最近公共祖先.html)中介绍) +* 如果需要搜索整棵二叉树且不用处理递归返回值,递归函数就不要返回值。(这种情况就是本文下半部分介绍的113.路径总和ii) +* 如果需要搜索整棵二叉树且需要处理递归返回值,递归函数就需要返回值。 (这种情况我们在[236. 二叉树的最近公共祖先](https://programmercarl.com/0236.二叉树的最近公共祖先.html)中介绍) * 如果要搜索其中一条符合条件的路径,那么递归一定需要返回值,因为遇到符合条件的路径了就要及时返回。(本题的情况) 而本题我们要找一条符合条件的路径,所以递归函数需要返回值,及时返回,那么返回类型是什么呢? diff --git "a/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" "b/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" index 84a5bd02f7..ec8ad61c50 100644 --- "a/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" +++ "b/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" @@ -48,7 +48,7 @@ 感受出来了不? -所以切割问题,也可以抽象为一颗树形结构,如图: +所以切割问题,也可以抽象为一棵树形结构,如图: ![131.分割回文串](https://code-thinking.cdn.bcebos.com/pics/131.%E5%88%86%E5%89%B2%E5%9B%9E%E6%96%87%E4%B8%B2.jpg) diff --git "a/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" "b/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" index 348275fa4d..6213aeaa2c 100644 --- "a/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" +++ "b/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" @@ -101,7 +101,7 @@ left与right的逻辑处理; **在递归函数有返回值的情况下:如果要搜索一条边,递归函数返回值不为空的时候,立刻返回,如果搜索整个树,直接用一个变量left、right接住返回值,这个left、right后序还有逻辑处理的需要,也就是后序遍历中处理中间节点的逻辑(也是回溯)**。 -那么为什么要遍历整颗树呢?直观上来看,找到最近公共祖先,直接一路返回就可以了。 +那么为什么要遍历整棵树呢?直观上来看,找到最近公共祖先,直接一路返回就可以了。 如图: @@ -161,7 +161,7 @@ else { // (left == NULL && right == NULL) ![236.二叉树的最近公共祖先2](https://img-blog.csdnimg.cn/202102041512582.png) -**从图中,大家可以看到,我们是如何回溯遍历整颗二叉树,将结果返回给头结点的!** +**从图中,大家可以看到,我们是如何回溯遍历整棵二叉树,将结果返回给头结点的!** 整体代码如下: @@ -208,7 +208,7 @@ public: 1. 求最小公共祖先,需要从底向上遍历,那么二叉树,只能通过后序遍历(即:回溯)实现从低向上的遍历方式。 -2. 在回溯的过程中,必然要遍历整颗二叉树,即使已经找到结果了,依然要把其他节点遍历完,因为要使用递归函数的返回值(也就是代码中的left和right)做逻辑判断。 +2. 在回溯的过程中,必然要遍历整棵二叉树,即使已经找到结果了,依然要把其他节点遍历完,因为要使用递归函数的返回值(也就是代码中的left和right)做逻辑判断。 3. 要理解如果返回值left为空,right不为空为什么要返回right,为什么可以用返回right传给上一层结果。 diff --git "a/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" "b/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" index 43706b8374..046491450b 100644 --- "a/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" +++ "b/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" @@ -50,7 +50,7 @@ 什么是堆呢? -**堆是一颗完全二叉树,树中每个结点的值都不小于(或不大于)其左右孩子的值。** 如果父亲结点是大于等于左右孩子就是大顶堆,小于等于左右孩子就是小顶堆。 +**堆是一棵完全二叉树,树中每个结点的值都不小于(或不大于)其左右孩子的值。** 如果父亲结点是大于等于左右孩子就是大顶堆,小于等于左右孩子就是小顶堆。 所以大家经常说的大顶堆(堆头是最大元素),小顶堆(堆头是最小元素),如果懒得自己实现的话,就直接用priority_queue(优先级队列)就可以了,底层实现都是一样的,从小到大排就是小顶堆,从大到小排就是大顶堆。 diff --git "a/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" "b/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" index 47585b537b..2e33353093 100644 --- "a/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" +++ "b/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" @@ -66,7 +66,7 @@ if (root == nullptr) return root; ![450.删除二叉搜索树中的节点](https://tva1.sinaimg.cn/large/008eGmZEly1gnbj3k596mg30dq0aigyz.gif) -动画中颗二叉搜索树中,删除元素7, 那么删除节点(元素7)的左孩子就是5,删除节点(元素7)的右子树的最左面节点是元素8。 +动画中棵二叉搜索树中,删除元素7, 那么删除节点(元素7)的左孩子就是5,删除节点(元素7)的右子树的最左面节点是元素8。 将删除节点(元素7)的左孩子放到删除节点(元素7)的右子树的最左面节点(元素8)的左孩子上,就是把5为根节点的子树移到了8的左孩子的位置。 diff --git "a/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" "b/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" index 018a30579d..99f42d34cd 100644 --- "a/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" +++ "b/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" @@ -63,11 +63,11 @@ void traversal(TreeNode* root, int leftLen) 其实很多同学都对递归函数什么时候要有返回值,什么时候不能有返回值很迷茫。 -**如果需要遍历整颗树,递归函数就不能有返回值。如果需要遍历某一条固定路线,递归函数就一定要有返回值!** +**如果需要遍历整棵树,递归函数就不能有返回值。如果需要遍历某一条固定路线,递归函数就一定要有返回值!** 初学者可能对这个结论不太理解,别急,后面我会安排一道题目专门讲递归函数的返回值问题。这里大家暂时先了解一下。 -本题我们是要遍历整个树找到最深的叶子节点,需要遍历整颗树,所以递归函数没有返回值。 +本题我们是要遍历整个树找到最深的叶子节点,需要遍历整棵树,所以递归函数没有返回值。 2. 确定终止条件 diff --git "a/problems/0538.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md" "b/problems/0538.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md" index 0959e9f00d..1d11d4ee0e 100644 --- "a/problems/0538.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md" +++ "b/problems/0538.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md" @@ -47,7 +47,7 @@ 一看到累加树,相信很多小伙伴都会疑惑:如何累加?遇到一个节点,然后在遍历其他节点累加?怎么一想这么麻烦呢。 -然后再发现这是一颗二叉搜索树,二叉搜索树啊,这是有序的啊。 +然后再发现这是一棵二叉搜索树,二叉搜索树啊,这是有序的啊。 那么有序的元素如果求累加呢? diff --git "a/problems/0617.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md" "b/problems/0617.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md" index 2dc393979c..f815d74132 100644 --- "a/problems/0617.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0617.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md" @@ -243,7 +243,7 @@ public: 合并二叉树,也是二叉树操作的经典题目,如果没有接触过的话,其实并不简单,因为我们习惯了操作一个二叉树,一起操作两个二叉树,还会有点懵懵的。 -这不是我们第一次操作两颗二叉树了,在[二叉树:我对称么?](https://programmercarl.com/0101.对称二叉树.html)中也一起操作了两棵二叉树。 +这不是我们第一次操作两棵二叉树了,在[二叉树:我对称么?](https://programmercarl.com/0101.对称二叉树.html)中也一起操作了两棵二叉树。 迭代法中,一般一起操作两个树都是使用队列模拟类似层序遍历,同时处理两个树的节点,这种方式最好理解,如果用模拟递归的思路的话,要复杂一些。 diff --git "a/problems/0685.\345\206\227\344\275\231\350\277\236\346\216\245II.md" "b/problems/0685.\345\206\227\344\275\231\350\277\236\346\216\245II.md" index f33396a01e..de62432c72 100644 --- "a/problems/0685.\345\206\227\344\275\231\350\277\236\346\216\245II.md" +++ "b/problems/0685.\345\206\227\344\275\231\350\277\236\346\216\245II.md" @@ -42,7 +42,7 @@ -且只有一个节点入度为2,为什么不看出度呢,出度没有意义,一颗树中随便一个父节点就有多个出度。 +且只有一个节点入度为2,为什么不看出度呢,出度没有意义,一棵树中随便一个父节点就有多个出度。 第三种情况是没有入度为2的点,那么图中一定出现了有向环(**注意这里强调是有向环!**) diff --git "a/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" "b/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" index cc98ee1d27..468f26750d 100644 --- "a/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" +++ "b/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" @@ -77,7 +77,7 @@ if (root == NULL) { 此时要明确,需要遍历整棵树么? -别忘了这是搜索树,遍历整颗搜索树简直是对搜索树的侮辱,哈哈。 +别忘了这是搜索树,遍历整棵搜索树简直是对搜索树的侮辱,哈哈。 搜索树是有方向了,可以根据插入元素的数值,决定递归方向。 diff --git "a/problems/\345\211\215\345\272\217/ACM\346\250\241\345\274\217\345\246\202\344\275\225\346\236\204\345\273\272\344\272\214\345\217\211\346\240\221.md" "b/problems/\345\211\215\345\272\217/ACM\346\250\241\345\274\217\345\246\202\344\275\225\346\236\204\345\273\272\344\272\214\345\217\211\346\240\221.md" index d0cf234153..d3b2656eba 100644 --- "a/problems/\345\211\215\345\272\217/ACM\346\250\241\345\274\217\345\246\202\344\275\225\346\236\204\345\273\272\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/\345\211\215\345\272\217/ACM\346\250\241\345\274\217\345\246\202\344\275\225\346\236\204\345\273\272\344\272\214\345\217\211\346\240\221.md" @@ -24,7 +24,7 @@ ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210914222335.png) -一直跟着公众号学算法的录友 应该知道,我在[二叉树:构造二叉树登场!](https://mp.weixin.qq.com/s/Dza-fqjTyGrsRw4PWNKdxA),已经讲过,**只有 中序与后序 和 中序和前序 可以确定一颗唯一的二叉树。 前序和后序是不能确定唯一的二叉树的**。 +一直跟着公众号学算法的录友 应该知道,我在[二叉树:构造二叉树登场!](https://mp.weixin.qq.com/s/Dza-fqjTyGrsRw4PWNKdxA),已经讲过,**只有 中序与后序 和 中序和前序 可以确定一棵唯一的二叉树。 前序和后序是不能确定唯一的二叉树的**。 那么[538.把二叉搜索树转换为累加树](https://mp.weixin.qq.com/s/rlJUFGCnXsIMX0Lg-fRpIw)的示例中,为什么,一个序列(数组或者是字符串)就可以确定二叉树了呢? diff --git "a/problems/\345\211\215\345\272\217/\351\200\222\345\275\222\347\256\227\346\263\225\347\232\204\346\227\266\351\227\264\344\270\216\347\251\272\351\227\264\345\244\215\346\235\202\345\272\246\345\210\206\346\236\220.md" "b/problems/\345\211\215\345\272\217/\351\200\222\345\275\222\347\256\227\346\263\225\347\232\204\346\227\266\351\227\264\344\270\216\347\251\272\351\227\264\345\244\215\346\235\202\345\272\246\345\210\206\346\236\220.md" index 8025e8e6ce..4dd340a6a2 100644 --- "a/problems/\345\211\215\345\272\217/\351\200\222\345\275\222\347\256\227\346\263\225\347\232\204\346\227\266\351\227\264\344\270\216\347\251\272\351\227\264\345\244\215\346\235\202\345\272\246\345\210\206\346\236\220.md" +++ "b/problems/\345\211\215\345\272\217/\351\200\222\345\275\222\347\256\227\346\263\225\347\232\204\346\227\266\351\227\264\344\270\216\347\251\272\351\227\264\345\244\215\346\235\202\345\272\246\345\210\206\346\236\220.md" @@ -34,13 +34,13 @@ int fibonacci(int i) { 在讲解递归时间复杂度的时候,我们提到了递归算法的时间复杂度本质上是要看: **递归的次数 * 每次递归的时间复杂度**。 -可以看出上面的代码每次递归都是$O(1)$的操作。再来看递归了多少次,这里将i为5作为输入的递归过程 抽象成一颗递归树,如图: +可以看出上面的代码每次递归都是$O(1)$的操作。再来看递归了多少次,这里将i为5作为输入的递归过程 抽象成一棵递归树,如图: ![递归空间复杂度分析](https://img-blog.csdnimg.cn/20210305093200104.png) 从图中,可以看出f(5)是由f(4)和f(3)相加而来,那么f(4)是由f(3)和f(2)相加而来 以此类推。 -在这颗二叉树中每一个节点都是一次递归,那么这棵树有多少个节点呢? +在这棵二叉树中每一个节点都是一次递归,那么这棵树有多少个节点呢? 我们之前也有说到,一棵深度(按根节点深度为1)为k的二叉树最多可以有 2^k - 1 个节点。 diff --git "a/problems/\345\211\215\345\272\217/\351\200\232\350\277\207\344\270\200\351\201\223\351\235\242\350\257\225\351\242\230\347\233\256\357\274\214\350\256\262\344\270\200\350\256\262\351\200\222\345\275\222\347\256\227\346\263\225\347\232\204\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\201.md" "b/problems/\345\211\215\345\272\217/\351\200\232\350\277\207\344\270\200\351\201\223\351\235\242\350\257\225\351\242\230\347\233\256\357\274\214\350\256\262\344\270\200\350\256\262\351\200\222\345\275\222\347\256\227\346\263\225\347\232\204\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\201.md" index dd998c5353..8780122f3f 100644 --- "a/problems/\345\211\215\345\272\217/\351\200\232\350\277\207\344\270\200\351\201\223\351\235\242\350\257\225\351\242\230\347\233\256\357\274\214\350\256\262\344\270\200\350\256\262\351\200\222\345\275\222\347\256\227\346\263\225\347\232\204\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\201.md" +++ "b/problems/\345\211\215\345\272\217/\351\200\232\350\277\207\344\270\200\351\201\223\351\235\242\350\257\225\351\242\230\347\233\256\357\274\214\350\256\262\344\270\200\350\256\262\351\200\222\345\275\222\347\256\227\346\263\225\347\232\204\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\201.md" @@ -77,15 +77,15 @@ int function3(int x, int n) { 面试官看到后微微一笑,问:“这份代码的时间复杂度又是多少呢?” 此刻有些同学可能要陷入了沉思了。 -我们来分析一下,首先看递归了多少次呢,可以把递归抽象出一颗满二叉树。刚刚同学写的这个算法,可以用一颗满二叉树来表示(为了方便表示,选择n为偶数16),如图: +我们来分析一下,首先看递归了多少次呢,可以把递归抽象出一棵满二叉树。刚刚同学写的这个算法,可以用一棵满二叉树来表示(为了方便表示,选择n为偶数16),如图: ![递归算法的时间复杂度](https://img-blog.csdnimg.cn/20201209193909426.png) -当前这颗二叉树就是求x的n次方,n为16的情况,n为16的时候,进行了多少次乘法运算呢? +当前这棵二叉树就是求x的n次方,n为16的情况,n为16的时候,进行了多少次乘法运算呢? 这棵树上每一个节点就代表着一次递归并进行了一次相乘操作,所以进行了多少次递归的话,就是看这棵树上有多少个节点。 -熟悉二叉树话应该知道如何求满二叉树节点数量,这颗满二叉树的节点数量就是`2^3 + 2^2 + 2^1 + 2^0 = 15`,可以发现:**这其实是等比数列的求和公式,这个结论在二叉树相关的面试题里也经常出现**。 +熟悉二叉树话应该知道如何求满二叉树节点数量,这棵满二叉树的节点数量就是`2^3 + 2^2 + 2^1 + 2^0 = 15`,可以发现:**这其实是等比数列的求和公式,这个结论在二叉树相关的面试题里也经常出现**。 这么如果是求x的n次方,这个递归树有多少个节点呢,如下图所示:(m为深度,从0开始) diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20201010\344\272\214\345\217\211\346\240\221\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20201010\344\272\214\345\217\211\346\240\221\345\221\250\346\234\253\346\200\273\347\273\223.md" index 215452bd73..391a463102 100644 --- "a/problems/\345\221\250\346\200\273\347\273\223/20201010\344\272\214\345\217\211\346\240\221\345\221\250\346\234\253\346\200\273\347\273\223.md" +++ "b/problems/\345\221\250\346\200\273\347\273\223/20201010\344\272\214\345\217\211\346\240\221\345\221\250\346\234\253\346\200\273\347\273\223.md" @@ -43,7 +43,7 @@ 在[二叉树:递归函数究竟什么时候需要返回值,什么时候不要返回值?](https://programmercarl.com/0112.路径总和.html)中通过两道题目,彻底说清楚递归函数的返回值问题。 -一般情况下:**如果需要搜索整颗二叉树,那么递归函数就不要返回值,如果要搜索其中一条符合条件的路径,递归函数就需要返回值,因为遇到符合条件的路径了就要及时返回。** +一般情况下:**如果需要搜索整棵二叉树,那么递归函数就不要返回值,如果要搜索其中一条符合条件的路径,递归函数就需要返回值,因为遇到符合条件的路径了就要及时返回。** 特别是有些时候 递归函数的返回值是bool类型,一些同学会疑惑为啥要加这个,其实就是为了找到一条边立刻返回。 @@ -51,7 +51,7 @@ ## 周五 -之前都是讲解遍历二叉树,这次该构造二叉树了,在[二叉树:构造二叉树登场!](https://programmercarl.com/0106.从中序与后序遍历序列构造二叉树.html)中,我们通过前序和中序,后序和中序,构造了唯一的一颗二叉树。 +之前都是讲解遍历二叉树,这次该构造二叉树了,在[二叉树:构造二叉树登场!](https://programmercarl.com/0106.从中序与后序遍历序列构造二叉树.html)中,我们通过前序和中序,后序和中序,构造了唯一的一棵二叉树。 **构造二叉树有三个注意的点:** diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20201017\344\272\214\345\217\211\346\240\221\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20201017\344\272\214\345\217\211\346\240\221\345\221\250\346\234\253\346\200\273\347\273\223.md" index 4b219834bc..57de82fd83 100644 --- "a/problems/\345\221\250\346\200\273\347\273\223/20201017\344\272\214\345\217\211\346\240\221\345\221\250\346\234\253\346\200\273\347\273\223.md" +++ "b/problems/\345\221\250\346\200\273\347\273\223/20201017\344\272\214\345\217\211\346\240\221\345\221\250\346\234\253\346\200\273\347\273\223.md" @@ -8,7 +8,7 @@ 在[二叉树:合并两个二叉树](https://programmercarl.com/0617.合并二叉树.html)中讲解了如何合并两个二叉树,平时我们都习惯了操作一个二叉树,一起操作两个树可能还有点陌生。 -其实套路是一样,只不过一起操作两个树的指针,我们之前讲过求 [二叉树:我对称么?](https://programmercarl.com/0101.对称二叉树.html)的时候,已经初步涉及到了 一起遍历两颗二叉树了。 +其实套路是一样,只不过一起操作两个树的指针,我们之前讲过求 [二叉树:我对称么?](https://programmercarl.com/0101.对称二叉树.html)的时候,已经初步涉及到了 一起遍历两棵二叉树了。 **迭代法中,一般一起操作两个树都是使用队列模拟类似层序遍历,同时处理两个树的节点,这种方式最好理解,如果用模拟递归的思路的话,要复杂一些。** @@ -24,7 +24,7 @@ ## 周三 -了解了二搜索树的特性之后, 开始验证[一颗二叉树是不是二叉搜索树](https://programmercarl.com/0098.验证二叉搜索树.html)。 +了解了二搜索树的特性之后, 开始验证[一棵二叉树是不是二叉搜索树](https://programmercarl.com/0098.验证二叉搜索树.html)。 首先在此强调一下二叉搜索树的特性: diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20201107\345\233\236\346\272\257\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20201107\345\233\236\346\272\257\345\221\250\346\234\253\346\200\273\347\273\223.md" index f9940a2a72..5310f9ecf0 100644 --- "a/problems/\345\221\250\346\200\273\347\273\223/20201107\345\233\236\346\272\257\345\221\250\346\234\253\346\200\273\347\273\223.md" +++ "b/problems/\345\221\250\346\200\273\347\273\223/20201107\345\233\236\346\272\257\345\221\250\346\234\253\346\200\273\347\273\223.md" @@ -118,7 +118,7 @@ if (s.size() > 12) return result; // 剪枝 认清这个本质之后,今天的题目就是一道模板题了。 -其实可以不需要加终止条件,因为startIndex >= nums.size(),本层for循环本来也结束了,本来我们就要遍历整颗树。 +其实可以不需要加终止条件,因为startIndex >= nums.size(),本层for循环本来也结束了,本来我们就要遍历整棵树。 有的同学可能担心不写终止条件会不会无限递归? diff --git "a/problems/\345\233\236\346\272\257\346\200\273\347\273\223.md" "b/problems/\345\233\236\346\272\257\346\200\273\347\273\223.md" index 6365235f5a..af1712439f 100644 --- "a/problems/\345\233\236\346\272\257\346\200\273\347\273\223.md" +++ "b/problems/\345\233\236\346\272\257\346\200\273\347\273\223.md" @@ -202,7 +202,7 @@ for (int i = startIndex; i < candidates.size() && sum + candidates[i] <= target; 认清这个本质之后,今天的题目就是一道模板题了。 -**本题其实可以不需要加终止条件**,因为startIndex >= nums.size(),本层for循环本来也结束了,本来我们就要遍历整颗树。 +**本题其实可以不需要加终止条件**,因为startIndex >= nums.size(),本层for循环本来也结束了,本来我们就要遍历整棵树。 有的同学可能担心不写终止条件会不会无限递归? @@ -331,13 +331,13 @@ used数组可是全局变量,每层与每层之间公用一个used数组,所 在[回溯算法:N皇后问题](https://programmercarl.com/0051.N皇后.html)中终于迎来了传说中的N皇后。 -下面我用一个3 * 3 的棋盘,将搜索过程抽象为一颗树,如图: +下面我用一个3 * 3 的棋盘,将搜索过程抽象为一棵树,如图: ![51.N皇后](https://img-blog.csdnimg.cn/20201118225433127.png) -从图中,可以看出,二维矩阵中矩阵的高就是这颗树的高度,矩阵的宽就是树形结构中每一个节点的宽度。 +从图中,可以看出,二维矩阵中矩阵的高就是这棵树的高度,矩阵的宽就是树形结构中每一个节点的宽度。 -那么我们用皇后们的约束条件,来回溯搜索这颗树,**只要搜索到了树的叶子节点,说明就找到了皇后们的合理位置了**。 +那么我们用皇后们的约束条件,来回溯搜索这棵树,**只要搜索到了树的叶子节点,说明就找到了皇后们的合理位置了**。 如果从来没有接触过N皇后问题的同学看着这样的题会感觉无从下手,可能知道要用回溯法,但也不知道该怎么去搜。 diff --git "a/problems/\345\233\236\346\272\257\347\256\227\346\263\225\345\216\273\351\207\215\351\227\256\351\242\230\347\232\204\345\217\246\344\270\200\347\247\215\345\206\231\346\263\225.md" "b/problems/\345\233\236\346\272\257\347\256\227\346\263\225\345\216\273\351\207\215\351\227\256\351\242\230\347\232\204\345\217\246\344\270\200\347\247\215\345\206\231\346\263\225.md" index 06c5383d69..7a601493e1 100644 --- "a/problems/\345\233\236\346\272\257\347\256\227\346\263\225\345\216\273\351\207\215\351\227\256\351\242\230\347\232\204\345\217\246\344\270\200\347\247\215\345\206\231\346\263\225.md" +++ "b/problems/\345\233\236\346\272\257\347\256\227\346\263\225\345\216\273\351\207\215\351\227\256\351\242\230\347\232\204\345\217\246\344\270\200\347\247\215\345\206\231\346\263\225.md" @@ -6,7 +6,7 @@ # 回溯算法去重问题的另一种写法 -> 在 [本周小结!(回溯算法系列三)](https://programmercarl.com/周总结/20201112回溯周末总结.html) 中一位录友对 整颗树的本层和同一节点的本层有疑问,也让我重新思考了一下,发现这里确实有问题,所以专门写一篇来纠正,感谢录友们的积极交流哈! +> 在 [本周小结!(回溯算法系列三)](https://programmercarl.com/周总结/20201112回溯周末总结.html) 中一位录友对 整棵树的本层和同一节点的本层有疑问,也让我重新思考了一下,发现这里确实有问题,所以专门写一篇来纠正,感谢录友们的积极交流哈! 接下来我再把这块再讲一下。 diff --git "a/problems/\345\233\236\346\272\257\347\256\227\346\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\345\233\236\346\272\257\347\256\227\346\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md" index 265d10459e..7061667d3b 100644 --- "a/problems/\345\233\236\346\272\257\347\256\227\346\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\345\233\236\346\272\257\347\256\227\346\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -61,7 +61,7 @@ 因为回溯法解决的都是在集合中递归查找子集,**集合的大小就构成了树的宽度,递归的深度,都构成的树的深度**。 -递归就要有终止条件,所以必然是一颗高度有限的树(N叉树)。 +递归就要有终止条件,所以必然是一棵高度有限的树(N叉树)。 这块可能初学者还不太理解,后面的回溯算法解决的所有题目中,我都会强调这一点并画图举相应的例子,现在有一个印象就行。 diff --git "a/problems/\346\240\210\344\270\216\351\230\237\345\210\227\346\200\273\347\273\223.md" "b/problems/\346\240\210\344\270\216\351\230\237\345\210\227\346\200\273\347\273\223.md" index 0824d32fc0..8ec96a2972 100644 --- "a/problems/\346\240\210\344\270\216\351\230\237\345\210\227\346\200\273\347\273\223.md" +++ "b/problems/\346\240\210\344\270\216\351\230\237\345\210\227\346\200\273\347\273\223.md" @@ -135,7 +135,7 @@ cd a/b/c/../../ 什么是堆呢? -**堆是一颗完全二叉树,树中每个结点的值都不小于(或不大于)其左右孩子的值。** 如果父亲结点是大于等于左右孩子就是大顶堆,小于等于左右孩子就是小顶堆。 +**堆是一棵完全二叉树,树中每个结点的值都不小于(或不大于)其左右孩子的值。** 如果父亲结点是大于等于左右孩子就是大顶堆,小于等于左右孩子就是小顶堆。 所以大家经常说的大顶堆(堆头是最大元素),小顶堆(堆头是最小元素),如果懒得自己实现的话,就直接用priority_queue(优先级队列)就可以了,底层实现都是一样的,从小到大排就是小顶堆,从大到小排就是大顶堆。 From 7773bd9470e2824a054de8fea83a100c7f12362c Mon Sep 17 00:00:00 2001 From: ArthurP Date: Wed, 29 Dec 2021 21:56:11 +0000 Subject: [PATCH 0185/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200051.N=E7=9A=87?= =?UTF-8?q?=E5=90=8E.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/0051.N\347\232\207\345\220\216.md" | 125 +++++++++++++++++++ 1 file changed, 125 insertions(+) diff --git "a/problems/0051.N\347\232\207\345\220\216.md" "b/problems/0051.N\347\232\207\345\220\216.md" index 7302887aa5..d658226bbc 100644 --- "a/problems/0051.N\347\232\207\345\220\216.md" +++ "b/problems/0051.N\347\232\207\345\220\216.md" @@ -521,5 +521,130 @@ func solveNQueens(_ n: Int) -> [[String]] { } ``` +### C +```c +char ***ans; +char **path; +int ansTop, pathTop; +//将path中元素复制到ans中 +void copyPath(int n) { + char **tempPath = (char**)malloc(sizeof(char*) * pathTop); + int i; + for(i = 0; i < pathTop; ++i) { + tempPath[i] = (char*)malloc(sizeof(char) * n + 1); + int j; + for(j = 0; j < n; ++j) + tempPath[i][j] = path[i][j]; + tempPath[i][j] = '\0'; + + } + ans[ansTop++] = tempPath; +} + +//判断当前位置是否有效(是否不被其它皇后影响) +int isValid(int x, int y, int n) { + int i, j; + //检查同一行以及同一列是否有效 + for(i = 0; i < n; ++i) { + if(path[y][i] == 'Q' || path[i][x] == 'Q') + return 0; + } + //下面两个for循环检查斜角45度是否有效 + i = y - 1; + j = x - 1; + while(i >= 0 && j >= 0) { + if(path[i][j] == 'Q') + return 0; + --i, --j; + } + + i = y + 1; + j = x + 1; + while(i < n && j < n) { + if(path[i][j] == 'Q') + return 0; + ++i, ++j; + } + + //下面两个for循环检查135度是否有效 + i = y - 1; + j = x + 1; + while(i >= 0 && j < n) { + if(path[i][j] == 'Q') + return 0; + --i, ++j; + } + + i = y + 1; + j = x -1; + while(j >= 0 && i < n) { + if(path[i][j] == 'Q') + return 0; + ++i, --j; + } + return 1; +} + +void backTracking(int n, int depth) { + //若path中有四个元素,将其拷贝到ans中。从当前层返回 + if(pathTop == n) { + copyPath(n); + return; + } + + //遍历横向棋盘 + int i; + for(i = 0; i < n; ++i) { + //若当前位置有效 + if(isValid(i, depth, n)) { + //在当前位置放置皇后 + path[depth][i] = 'Q'; + //path中元素数量+1 + ++pathTop; + + backTracking(n, depth + 1); + //进行回溯 + path[depth][i] = '.'; + //path中元素数量-1 + --pathTop; + } + } +} + +//初始化存储char*数组path,将path中所有元素设为'.' +void initPath(int n) { + int i, j; + for(i = 0; i < n; i++) { + //为path中每个char*开辟空间 + path[i] = (char*)malloc(sizeof(char) * n + 1); + //将path中所有字符设为'.' + for(j = 0; j < n; j++) + path[i][j] = '.'; + //在每个字符串结尾加入'\0' + path[i][j] = '\0'; + } +} + +char *** solveNQueens(int n, int* returnSize, int** returnColumnSizes){ + //初始化辅助变量 + ans = (char***)malloc(sizeof(char**) * 400); + path = (char**)malloc(sizeof(char*) * n); + ansTop = pathTop = 0; + + //初始化path数组 + initPath(n); + backTracking(n, 0); + + //设置返回数组大小 + *returnSize = ansTop; + int i; + *returnColumnSizes = (int*)malloc(sizeof(int) * ansTop); + for(i = 0; i < ansTop; ++i) { + (*returnColumnSizes)[i] = n; + } + return ans; +} +``` + -----------------------
From 77a890132af75d9b711087772736a08e47570d0c Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 30 Dec 2021 10:46:03 +0800 Subject: [PATCH 0186/3019] =?UTF-8?q?=E4=BF=AE=E6=94=B9=200005.=E6=9C=80?= =?UTF-8?q?=E9=95=BF=E5=9B=9E=E6=96=87=E5=AD=90=E4=B8=B2.md=20=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3=E9=94=99=E5=88=AB=E5=AD=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" "b/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" index d651a14785..f204a60784 100644 --- "a/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" +++ "b/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" @@ -218,7 +218,7 @@ public: 一个元素可以作为中心点,两个元素也可以作为中心点。 -那么有人同学问了,三个元素还可以做中心点呢。其实三个元素就可以由一个元素左右添加元素得到,四个元素则可以由两个元素左右添加元素得到。 +那么有的同学问了,三个元素还可以做中心点呢。其实三个元素就可以由一个元素左右添加元素得到,四个元素则可以由两个元素左右添加元素得到。 所以我们在计算的时候,要注意一个元素为中心点和两个元素为中心点的情况。 From d2b7849453a665187f1cfb1cb0a9925ed8990d9a Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 30 Dec 2021 10:47:29 +0800 Subject: [PATCH 0187/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200096.=E4=B8=8D?= =?UTF-8?q?=E5=90=8C=E7=9A=84=E4=BA=8C=E5=8F=89=E6=90=9C=E7=B4=A2=E6=A0=91?= =?UTF-8?q?.mc=20=E4=BF=AE=E6=AD=A3=E9=94=99=E5=88=AB=E5=AD=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...345\217\211\346\220\234\347\264\242\346\240\221.md" | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git "a/problems/0096.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0096.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" index 43d4cfb066..d4b8d0245f 100644 --- "a/problems/0096.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" +++ "b/problems/0096.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" @@ -18,7 +18,7 @@ 这道题目描述很简短,但估计大部分同学看完都是懵懵的状态,这得怎么统计呢? -关于什么是二叉搜索树,我们之前在讲解二叉树专题的时候已经详细讲解过了,也可以看看这篇[二叉树:二叉搜索树登场!](https://programmercarl.com/0700.二叉搜索树中的搜索.html)在回顾一波。 +关于什么是二叉搜索树,我们之前在讲解二叉树专题的时候已经详细讲解过了,也可以看看这篇[二叉树:二叉搜索树登场!](https://programmercarl.com/0700.二叉搜索树中的搜索.html)再回顾一波。 了解了二叉搜索树之后,我们应该先举几个例子,画画图,看看有没有什么规律,如图: @@ -36,9 +36,9 @@ n为1的时候有一棵树,n为2有两棵树,这个是很直观的。 当3为头结点的时候,其左子树有两个节点,看这两个节点的布局,是不是和n为2的时候两棵树的布局也是一样的啊! -当2位头结点的时候,其左右子树都只有一个节点,布局是不是和n为1的时候只有一棵树的布局也是一样的啊! +当2为头结点的时候,其左右子树都只有一个节点,布局是不是和n为1的时候只有一棵树的布局也是一样的啊! -发现到这里,其实我们就找到的重叠子问题了,其实也就是发现可以通过dp[1] 和 dp[2] 来推导出来dp[3]的某种方式。 +发现到这里,其实我们就找到了重叠子问题了,其实也就是发现可以通过dp[1] 和 dp[2] 来推导出来dp[3]的某种方式。 思考到这里,这道题目就有眉目了。 @@ -63,7 +63,7 @@ dp[3],就是 元素1为头结点搜索树的数量 + 元素2为头结点搜索 ![96.不同的二叉搜索树2](https://img-blog.csdnimg.cn/20210107093226241.png) -此时我们已经找到的递推关系了,那么可以用动规五部曲在系统分析一遍。 +此时我们已经找到递推关系了,那么可以用动规五部曲再系统分析一遍。 1. 确定dp数组(dp table)以及下标的含义 @@ -87,7 +87,7 @@ j相当于是头结点的元素,从1遍历到i为止。 那么dp[0]应该是多少呢? -从定义上来讲,空节点也是一颗二叉树,也是一颗二叉搜索树,这是可以说得通的。 +从定义上来讲,空节点也是一棵二叉树,也是一棵二叉搜索树,这是可以说得通的。 从递归公式上来讲,dp[以j为头结点左子树节点数量] * dp[以j为头结点右子树节点数量] 中以j为头结点左子树节点数量为0,也需要dp[以j为头结点左子树节点数量] = 1, 否则乘法的结果就都变成0了。 From f2a1ad632f99c6f1a37ab4b88310e2c03f7a8c52 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B2=89=E9=BB=98?= <71065161+chenmo1995@users.noreply.github.com> Date: Thu, 30 Dec 2021 14:32:20 +0800 Subject: [PATCH 0188/3019] =?UTF-8?q?Update=200222.=E5=AE=8C=E5=85=A8?= =?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=A0=91=E7=9A=84=E8=8A=82=E7=82=B9=E4=B8=AA?= =?UTF-8?q?=E6=95=B0.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" "b/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" index c5039039b0..754a6094ea 100644 --- "a/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" +++ "b/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" @@ -80,7 +80,7 @@ return treeNum; class Solution { private: int getNodesNum(TreeNode* cur) { - if (cur == 0) return 0; + if (cur == NULL) return 0; int leftNum = getNodesNum(cur->left); // 左 int rightNum = getNodesNum(cur->right); // 右 int treeNum = leftNum + rightNum + 1; // 中 From 8f62ce95bfa6f76b1288bcac8628d1a78cae2e21 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=86=E5=8A=B2=E6=B6=9B?= Date: Thu, 30 Dec 2021 15:06:23 +0800 Subject: [PATCH 0189/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0Java=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E7=9A=84=E9=93=BE=E8=A1=A8ListNode=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...06\350\256\272\345\237\272\347\241\200.md" | 25 ++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git "a/problems/\351\223\276\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\351\223\276\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" index 0da269f009..02b7029e5d 100644 --- "a/problems/\351\223\276\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\351\223\276\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -143,7 +143,30 @@ head->val = 5; Java: - +```java +public class ListNode { + // 结点的值 + int val; + + // 下一个结点 + ListNode next; + + // 节点的构造函数(无参) + public ListNode() { + } + + // 节点的构造函数(有一个参数) + public ListNode(int val) { + this.val = val; + } + + // 节点的构造函数(有两个参数) + public ListNode(int val, ListNode next) { + this.val = val; + this.next = next; + } +} +``` Python: From 4ed7da80c08a51cc79cbc0aa987d41f6a57da5fe Mon Sep 17 00:00:00 2001 From: Steve <841532108@qq.com> Date: Fri, 31 Dec 2021 16:18:03 +0800 Subject: [PATCH 0190/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200704.=E4=BA=8C?= =?UTF-8?q?=E5=88=86=E6=9F=A5=E6=89=BE.md=20Typescript=20=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...14\345\210\206\346\237\245\346\211\276.md" | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git "a/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" "b/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" index 689c0633bb..cc7d7de5a7 100644 --- "a/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" +++ "b/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" @@ -326,6 +326,46 @@ var search = function(nums, target) { }; ``` +**TypeScript** + +(版本一)左闭右闭区间 + +```typescript +function search(nums: number[], target: number): number { + let left: number = 0, right: number = nums.length - 1; + while (left <= right) { + let mid: number = 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; +}; +``` + +(版本二)左闭右开区间 + +```typescript +function search(nums: number[], target: number): number { + let left: number = 0, right: number = nums.length; + while (left < right) { + let mid: number = 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; +}; +``` + **Ruby:** ```ruby From 0dbd6c42d249cf0a33bdcd9a2f67c023f83003f1 Mon Sep 17 00:00:00 2001 From: Steve <841532108@qq.com> Date: Fri, 31 Dec 2021 16:29:05 +0800 Subject: [PATCH 0191/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200704.=E4=BA=8C?= =?UTF-8?q?=E5=88=86=E6=9F=A5=E6=89=BE.md=EF=BC=9A=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E5=A4=9A=E4=BD=99=E5=AD=97=E7=AC=A6=EF=BC=8C=E5=AF=BC=E8=87=B4?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E6=9C=AA=E9=AB=98=E4=BA=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" | 1 - 1 file changed, 1 deletion(-) diff --git "a/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" "b/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" index cc7d7de5a7..379cb5fc46 100644 --- "a/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" +++ "b/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" @@ -284,7 +284,6 @@ func search(nums []int, target int) int { * @param {number} target * @return {number} */ -/** var search = function(nums, target) { let left = 0, right = nums.length - 1; // 使用左闭右闭区间 From d58fe4ea60f314dd4a9ffdd41beadc4710369ba7 Mon Sep 17 00:00:00 2001 From: Kai Dang <15596570256@163.com> Date: Fri, 31 Dec 2021 17:04:46 +0800 Subject: [PATCH 0192/3019] =?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=20=E4=B8=AD=E7=9A=84Java?= =?UTF-8?q?=E4=B8=8EGo=E7=9A=84=E4=B8=8D=E4=BD=BF=E7=94=A8=E6=A0=87?= =?UTF-8?q?=E8=AE=B0=E6=95=B0=E7=BB=84=E7=9A=84=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\345\220\210\346\200\273\345\222\214II.md" | 76 ++++++++++++++++++- 1 file changed, 75 insertions(+), 1 deletion(-) diff --git "a/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" "b/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" index 31011ed639..5d9e4965eb 100644 --- "a/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" +++ "b/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" @@ -255,6 +255,7 @@ public: ## Java +**使用标记数组** ```Java class Solution { List> lists = new ArrayList<>(); @@ -292,6 +293,44 @@ class Solution { } } ``` +**不使用标记数组** +```Java +class Solution { + List> res = new ArrayList<>(); + LinkedList path = new LinkedList<>(); + int sum = 0; + + public List> combinationSum2( int[] candidates, int target ) { + //为了将重复的数字都放到一起,所以先进行排序 + Arrays.sort( candidates ); + backTracking( candidates, target, 0 ); + return res; + } + + private void backTracking( int[] candidates, int target, int start ) { + if ( sum == target ) { + res.add( new ArrayList<>( path ) ); + return; + } + for ( int i = start; i < candidates.length && sum + candidates[i] <= target; i++ ) { + //正确剔除重复解的办法 + //跳过同一树层使用过的元素 + if ( i > start && candidates[i] == candidates[i - 1] ) { + continue; + } + + sum += candidates[i]; + path.add( candidates[i] ); + // i+1 代表当前组内元素只选取一次 + backTracking( candidates, target, i + 1 ); + + int temp = path.getLast(); + sum -= temp; + path.removeLast(); + } + } +} +``` ## Python **回溯+巧妙去重(省去使用used** @@ -384,6 +423,7 @@ class Solution: ## Go 主要在于如何在回溯中去重 +**使用used数组** ```go func combinationSum2(candidates []int, target int) [][]int { var trcak []int @@ -423,7 +463,41 @@ func backtracking(startIndex,sum,target int,candidates,trcak []int,res *[][]int, } } ``` - +**不使用used数组** +```go +func combinationSum2(candidates []int, target int) [][]int { + var trcak []int + var res [][]int + sort.Ints(candidates) + backtracking(0,0,target,candidates,trcak,&res) + return res +} +func backtracking(startIndex,sum,target int,candidates,trcak []int,res *[][]int){ + //终止条件 + if sum==target{ + tmp:=make([]int,len(trcak)) + //拷贝 + copy(tmp,trcak) + //放入结果集 + *res=append(*res,tmp) + return + } + //回溯 + for i:=startIndex;istartIndex&&candidates[i]==candidates[i-1]{ + continue + } + //更新路径集合和sum + trcak=append(trcak,candidates[i]) + sum+=candidates[i] + backtracking(i+1,sum,target,candidates,trcak,res) + //回溯 + trcak=trcak[:len(trcak)-1] + sum-=candidates[i] + } +} +``` ## javaScript ```js From e894f44b607b0a3433cae8284a9e2c0c85f86645 Mon Sep 17 00:00:00 2001 From: Steve <841532108@qq.com> Date: Fri, 31 Dec 2021 19:23:47 +0800 Subject: [PATCH 0193/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880027.?= =?UTF-8?q?=E7=A7=BB=E9=99=A4=E5=85=83=E7=B4=A0.md=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20typescript=20=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...7\273\351\231\244\345\205\203\347\264\240.md" | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git "a/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" "b/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" index 693684f3d7..99990302e1 100644 --- "a/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" +++ "b/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" @@ -197,7 +197,23 @@ var removeElement = (nums, val) => { }; ``` +TypeScript: + +```typescript +function removeElement(nums: number[], val: number): number { + let slowIndex: number = 0, fastIndex: number = 0; + while (fastIndex < nums.length) { + if (nums[fastIndex] !== val) { + nums[slowIndex++] = nums[fastIndex]; + } + fastIndex++; + } + return slowIndex; +}; +``` + Ruby: + ```ruby def remove_element(nums, val) i = 0 From 2e16036f1abcd6a42b4f0dc66f402fd0ddf0cd78 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Fri, 31 Dec 2021 20:16:20 +0800 Subject: [PATCH 0194/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880977.?= =?UTF-8?q?=E6=9C=89=E5=BA=8F=E6=95=B0=E7=BB=84=E7=9A=84=E5=B9=B3=E6=96=B9?= =?UTF-8?q?.md=EF=BC=89=EF=BC=9A=E6=B7=BB=E5=8A=A0typescript=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...04\347\232\204\345\271\263\346\226\271.md" | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git "a/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" "b/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" index 0085de0b75..b11fa7ef02 100644 --- "a/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" +++ "b/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" @@ -221,6 +221,35 @@ var sortedSquares = function(nums) { }; ``` +Typescript: + +双指针法: + +```typescript +function sortedSquares(nums: number[]): number[] { + let left: number = 0, right: number = nums.length - 1; + let resArr: number[] = new Array(nums.length); + let resArrIndex: number = resArr.length - 1; + while (left <= right) { + if (Math.abs(nums[left]) < Math.abs(nums[right])) { + resArr[resArrIndex] = nums[right--] ** 2; + } else { + resArr[resArrIndex] = nums[left++] ** 2; + } + resArrIndex--; + } + return resArr; +}; +``` + +骚操作法(暴力思路): + +```typescript +function sortedSquares(nums: number[]): number[] { + return nums.map(i => i * i).sort((a, b) => a - b); +}; +``` + Swift: ```swift From 310c19934a97b99bf11e211abbfccb0c23200447 Mon Sep 17 00:00:00 2001 From: youngyangyang04 <826123027@qq.com> Date: Fri, 31 Dec 2021 22:15:59 +0800 Subject: [PATCH 0195/3019] Update --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index eddc37a1de..5121dd2901 100644 --- a/README.md +++ b/README.md @@ -571,7 +571,7 @@ 也欢迎与我交流,备注:「个人简单介绍」 + 交流,围观朋友圈,做点赞之交(备注没有自我介绍不通过哦) -
+
# 公众号 From 082302078bd1e4a354f21a4b8f77a9a6b389940b Mon Sep 17 00:00:00 2001 From: tlylt Date: Sat, 1 Jan 2022 11:17:07 +0800 Subject: [PATCH 0196/3019] fix Qn0077 python indent --- "problems/0077.\347\273\204\345\220\210.md" | 2 +- .../0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git "a/problems/0077.\347\273\204\345\220\210.md" "b/problems/0077.\347\273\204\345\220\210.md" index 4ec154e10a..c00f1efb78 100644 --- "a/problems/0077.\347\273\204\345\220\210.md" +++ "b/problems/0077.\347\273\204\345\220\210.md" @@ -422,7 +422,7 @@ class Solution: def backtrack(n,k,startIndex): if len(path) == k: res.append(path[:]) - return + return for i in range(startIndex,n - (k - len(path)) + 2): #优化的地方 path.append(i) #处理节点 backtrack(n,k,i+1) #递归 diff --git "a/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" "b/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" index 5fe56e824c..4eec160819 100644 --- "a/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" +++ "b/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" @@ -182,7 +182,7 @@ class Solution: def backtrack(n,k,startIndex): if len(path) == k: res.append(path[:]) - return + return for i in range(startIndex,n-(k-len(path))+2): #优化的地方 path.append(i) #处理节点 backtrack(n,k,i+1) #递归 From eb94c291b26f43470d874a405b78c914d3bdb9c3 Mon Sep 17 00:00:00 2001 From: tlylt Date: Sat, 1 Jan 2022 11:38:38 +0800 Subject: [PATCH 0197/3019] fix Qn0077 & Qn0216 python indent errors --- "problems/0077.\347\273\204\345\220\210.md" | 4 ++-- .../0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" | 4 ++-- ...16.\347\273\204\345\220\210\346\200\273\345\222\214III.md" | 1 - 3 files changed, 4 insertions(+), 5 deletions(-) diff --git "a/problems/0077.\347\273\204\345\220\210.md" "b/problems/0077.\347\273\204\345\220\210.md" index c00f1efb78..c00ff551b9 100644 --- "a/problems/0077.\347\273\204\345\220\210.md" +++ "b/problems/0077.\347\273\204\345\220\210.md" @@ -427,8 +427,8 @@ class Solution: path.append(i) #处理节点 backtrack(n,k,i+1) #递归 path.pop() #回溯,撤销处理的节点 - backtrack(n,k,1) - return res + backtrack(n,k,1) + return res ``` diff --git "a/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" "b/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" index 4eec160819..24bfc086b8 100644 --- "a/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" +++ "b/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" @@ -187,8 +187,8 @@ class Solution: path.append(i) #处理节点 backtrack(n,k,i+1) #递归 path.pop() #回溯,撤销处理的节点 - backtrack(n,k,1) - return res + backtrack(n,k,1) + return res ``` Go: ```Go diff --git "a/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" "b/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" index 26c630b9aa..0bb4219265 100644 --- "a/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" +++ "b/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" @@ -323,7 +323,6 @@ class Solution: self.backtracking(k, n, i + 1) self.path.pop() self.sum_now -= i - return ``` ## Go From f4ea34989e8a114259a5a9ca5501d831101e8475 Mon Sep 17 00:00:00 2001 From: joeCarf <52153761+joeCarf@users.noreply.github.com> Date: Sat, 1 Jan 2022 23:08:04 +0800 Subject: [PATCH 0198/3019] =?UTF-8?q?[+]=20LeetCode=2028:=E5=89=8D?= =?UTF-8?q?=E7=BC=80=E8=A1=A8=EF=BC=88=E4=B8=8D=E5=87=8F=E4=B8=80=EF=BC=89?= =?UTF-8?q?Java=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0028.\345\256\236\347\216\260strStr.md" | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git "a/problems/0028.\345\256\236\347\216\260strStr.md" "b/problems/0028.\345\256\236\347\216\260strStr.md" index ef7008bc05..f0b56719ae 100644 --- "a/problems/0028.\345\256\236\347\216\260strStr.md" +++ "b/problems/0028.\345\256\236\347\216\260strStr.md" @@ -649,6 +649,41 @@ class Solution { } ``` +```Java +class Solution { + //前缀表(不减一)Java实现 + public int strStr(String haystack, String needle) { + if (needle.length() == 0) return 0; + int[] next = new int[needle.length()]; + getNext(next, needle); + + int j = 0; + for (int i = 0; i < haystack.length(); i++) { + while (j > 0 && needle.charAt(j) != haystack.charAt(i)) + j = next[j - 1]; + if (needle.charAt(j) == haystack.charAt(i)) + j++; + if (j == needle.length()) + return i - needle.length() + 1; + } + return -1; + + } + + private void getNext(int[] next, String s) { + int j = 0; + next[0] = 0; + for (int i = 1; i < s.length(); i++) { + while (j > 0 && s.charAt(j) != s.charAt(i)) + j = next[j - 1]; + if (s.charAt(j) == s.charAt(i)) + j++; + next[i] = j; + } + } +} +``` + Python3: ```python From 46ceb72cd01b08f6a734ca87d329c56ec51a51e6 Mon Sep 17 00:00:00 2001 From: erdengk <15596570256@163.com> Date: Sun, 2 Jan 2022 11:21:56 +0800 Subject: [PATCH 0199/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200090.=E5=AD=90?= =?UTF-8?q?=E9=9B=86II.md=20=E4=B8=AD=E7=9A=84Java=E4=B8=8D=E4=BD=BF?= =?UTF-8?q?=E7=94=A8=E6=A0=87=E8=AE=B0=E6=95=B0=E7=BB=84=E7=9A=84=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/0090.\345\255\220\351\233\206II.md" | 33 ++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git "a/problems/0090.\345\255\220\351\233\206II.md" "b/problems/0090.\345\255\220\351\233\206II.md" index 5b92517aa6..a1e864643f 100644 --- "a/problems/0090.\345\255\220\351\233\206II.md" +++ "b/problems/0090.\345\255\220\351\233\206II.md" @@ -166,7 +166,7 @@ if (i > startIndex && nums[i] == nums[i - 1] ) { ### Java - +使用used数组 ```java class Solution { List> result = new ArrayList<>();// 存放符合条件结果的集合 @@ -202,6 +202,37 @@ class Solution { } ``` +不使用used数组 +```java +class Solution { + + List> res = new ArrayList<>(); + LinkedList path = new LinkedList<>(); + + public List> subsetsWithDup( int[] nums ) { + Arrays.sort( nums ); + subsetsWithDupHelper( nums, 0 ); + return res; + } + + + private void subsetsWithDupHelper( int[] nums, int start ) { + res.add( new ArrayList<>( path ) ); + + for ( int i = start; i < nums.length; i++ ) { + // 跳过当前树层使用过的、相同的元素 + if ( i > start && nums[i - 1] == nums[i] ) { + continue; + } + path.add( nums[i] ); + subsetsWithDupHelper( nums, i + 1 ); + path.removeLast(); + } + } + +} +``` + ### Python ```python class Solution: From 97cd84d47870a8ab2aad30838b9ebc1a9a450099 Mon Sep 17 00:00:00 2001 From: zcxzcxzcx <18810692826@163.com> Date: Sun, 2 Jan 2022 22:16:26 +0800 Subject: [PATCH 0200/3019] =?UTF-8?q?Create=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 优化时间复杂度,更好地剪枝(java版本) --- ...\345\216\237IP\345\234\260\345\235\200.md" | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git "a/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" "b/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" index 3e7cd1ade2..67bb1bbe03 100644 --- "a/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" +++ "b/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" @@ -304,6 +304,48 @@ class Solution { return true; } } + +//方法二:比上面的方法时间复杂度低,更好地剪枝,优化时间复杂度 +class Solution { + List result = new ArrayList(); + StringBuilder stringBuilder = new StringBuilder(); + + public List restoreIpAddresses(String s) { + restoreIpAddressesHandler(s, 0, 0); + return result; + } + + // number表示stringbuilder中ip段的数量 + public void restoreIpAddressesHandler(String s, int start, int number) { + // 如果start等于s的长度并且ip段的数量是4,则加入结果集,并返回 + if (start == s.length() && number == 4) { + result.add(stringBuilder.toString()); + return; + } + // 如果start等于s的长度但是ip段的数量不为4,或者ip段的数量为4但是start小于s的长度,则直接返回 + if (start == s.length() || number == 4) { + return; + } + // 剪枝:ip段的长度最大是3,并且ip段处于[0,255] + for (int i = start; i < s.length() && i - start < 3 && Integer.parseInt(s.substring(start, i + 1)) >= 0 + && Integer.parseInt(s.substring(start, i + 1)) <= 255; i++) { + // 如果ip段的长度大于1,并且第一位为0的话,continue + if (i + 1 - start > 1 && s.charAt(start) - '0' == 0) { + continue; + } + stringBuilder.append(s.substring(start, i + 1)); + // 当stringBuilder里的网段数量小于3时,才会加点;如果等于3,说明已经有3段了,最后一段不需要再加点 + if (number < 3) { + stringBuilder.append("."); + } + number++; + restoreIpAddressesHandler(s, i + 1, number); + number--; + // 删除当前stringBuilder最后一个网段,注意考虑点的数量的问题 + stringBuilder.delete(start + number, i + number + 2); + } + } +} ``` ## python From ac735d918b22ee025dddf7d3df038af5a5ba2b39 Mon Sep 17 00:00:00 2001 From: Guanzhong Pan Date: Sun, 2 Jan 2022 14:30:25 +0000 Subject: [PATCH 0201/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200024.=E4=B8=A4?= =?UTF-8?q?=E4=B8=A4=E4=BA=A4=E6=8D=A2=E9=93=BE=E8=A1=A8=E4=B8=AD=E7=9A=84?= =?UTF-8?q?=E8=8A=82=E7=82=B9.md=20C=E8=AF=AD=E8=A8=80=E9=80=92=E5=BD=92?= =?UTF-8?q?=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...70\255\347\232\204\350\212\202\347\202\271.md" | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git "a/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" "b/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" index 9b9c6689d5..f1bfa5b25c 100644 --- "a/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" +++ "b/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" @@ -94,8 +94,21 @@ C: * struct ListNode *next; * }; */ +//递归版本 +struct ListNode* swapPairs(struct ListNode* head){ + //递归结束条件:头节点不存在或头节点的下一个节点不存在。此时不需要交换,直接返回head + if(!head || !head->next) + return head; + //创建一个节点指针类型保存头结点下一个节点 + struct ListNode *newHead = head->next; + //更改头结点+2位节点后的值,并将头结点的next指针指向这个更改过的list + head->next = swapPairs(newHead->next); + //将新的头结点的next指针指向老的头节点 + newHead->next = head; + return newHead; +} - +//迭代版本 struct ListNode* swapPairs(struct ListNode* head){ //使用双指针避免使用中间变量 typedef struct ListNode ListNode; From 4e2c449827e3bc6a7b2e9c52803076118314f6b3 Mon Sep 17 00:00:00 2001 From: reoooh Date: Sun, 2 Jan 2022 22:36:47 +0800 Subject: [PATCH 0202/3019] 2022-0102: 0209 add ruby version --- ...04\345\255\220\346\225\260\347\273\204.md" | 21 +++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git "a/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" "b/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" index 808224366f..7c13961d7e 100644 --- "a/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" +++ "b/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" @@ -107,7 +107,7 @@ public: }; ``` -时间复杂度:$O(n)$ +时间复杂度:$O(n)$ 空间复杂度:$O(1)$ **一些录友会疑惑为什么时间复杂度是$O(n)$**。 @@ -121,7 +121,6 @@ public: - ## 其他语言版本 @@ -291,5 +290,23 @@ class Solution { } ``` +Ruby: + +```ruby +def min_sub_array_len(target, nums) + res = Float::INFINITY # 无穷大 + i, sum = 0, 0 + nums.length.times do |j| + sum += nums[j] + while sum >= target + res = [res, j - i + 1].min + sum -= nums[i] + i += 1 + end + end + res == Float::INFINITY ? 0 : res +end +``` + -----------------------
From f6d8350d24d6d24561db7af26a123ea0101cf4ae Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Sun, 2 Jan 2022 23:24:52 +0800 Subject: [PATCH 0203/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880209.?= =?UTF-8?q?=E9=95=BF=E5=BA=A6=E6=9C=80=E5=B0=8F=E7=9A=84=E5=AD=90=E6=95=B0?= =?UTF-8?q?=E7=BB=84.md=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript?= =?UTF-8?q?=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...04\345\255\220\346\225\260\347\273\204.md" | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git "a/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" "b/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" index 808224366f..2c6ea7759f 100644 --- "a/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" +++ "b/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" @@ -214,6 +214,28 @@ var minSubArrayLen = function(target, nums) { }; ``` +Typescript: + +```typescript +function minSubArrayLen(target: number, nums: number[]): number { + let left: number = 0, right: number = 0; + let res: number = nums.length + 1; + let sum: number = 0; + while (right < nums.length) { + sum += nums[right]; + if (sum >= target) { + // 不断移动左指针,直到不能再缩小为止 + while (sum - nums[left] >= target) { + sum -= nums[left++]; + } + res = Math.min(res, right - left + 1); + } + right++; + } + return res === nums.length + 1 ? 0 : res; +}; +``` + Swift: ```swift From e3f9268351ddc9b8e6c3edf776ba73dcdf7d5688 Mon Sep 17 00:00:00 2001 From: Guanzhong Pan Date: Sun, 2 Jan 2022 18:33:21 +0000 Subject: [PATCH 0204/3019] =?UTF-8?q?=E6=9B=B4=E6=94=B9=200024.=E4=B8=A4?= =?UTF-8?q?=E4=B8=A4=E4=BA=A4=E6=8D=A2=E9=93=BE=E8=A1=A8=E4=B8=AD=E7=9A=84?= =?UTF-8?q?=E8=8A=82=E7=82=B9.md=20C=E8=AF=AD=E8=A8=80=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" | 2 ++ 1 file changed, 2 insertions(+) diff --git "a/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" "b/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" index f1bfa5b25c..01abc7b4fe 100644 --- "a/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" +++ "b/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" @@ -107,7 +107,9 @@ struct ListNode* swapPairs(struct ListNode* head){ newHead->next = head; return newHead; } +``` +```c //迭代版本 struct ListNode* swapPairs(struct ListNode* head){ //使用双指针避免使用中间变量 From e3f88873f66c432c7571f5278a2db2e00a5d0a88 Mon Sep 17 00:00:00 2001 From: Frogrey <35210929+Frogrey@users.noreply.github.com> Date: Mon, 3 Jan 2022 15:44:28 +0800 Subject: [PATCH 0205/3019] =?UTF-8?q?309.=E6=9C=80=E4=BD=B3=E4=B9=B0?= =?UTF-8?q?=E5=8D=96=E8=82=A1=E7=A5=A8=E6=97=B6=E6=9C=BA=E5=90=AB=E5=86=B7?= =?UTF-8?q?=E5=86=BB=E6=9C=9F=20=E9=80=92=E6=8E=A8=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E5=B0=91=E4=BA=86=E4=B8=80=E4=B8=AA=E6=8B=AC=E5=8F=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" "b/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" index 82555f8080..10cdd5fd60 100644 --- "a/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" +++ "b/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" @@ -95,7 +95,7 @@ p[i][3] = dp[i - 1][2]; 综上分析,递推代码如下: ```CPP -dp[i][0] = max(dp[i - 1][0], max(dp[i - 1][3], dp[i - 1][1]) - prices[i]; +dp[i][0] = max(dp[i - 1][0], max(dp[i - 1][3], dp[i - 1][1]) - prices[i]); dp[i][1] = max(dp[i - 1][1], dp[i - 1][3]); dp[i][2] = dp[i - 1][0] + prices[i]; dp[i][3] = dp[i - 1][2]; From b36f6755998b4ed3ca3e827e547bca95dce224da Mon Sep 17 00:00:00 2001 From: Dewittt <43514251+Dewittt@users.noreply.github.com> Date: Mon, 3 Jan 2022 15:56:46 +0800 Subject: [PATCH 0206/3019] =?UTF-8?q?Update=200347.=E5=89=8DK=E4=B8=AA?= =?UTF-8?q?=E9=AB=98=E9=A2=91=E5=85=83=E7=B4=A0.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 前k个,应该传入倒序的comparator --- ...\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" "b/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" index e6ad751bab..a282557352 100644 --- "a/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" +++ "b/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" @@ -142,7 +142,7 @@ class Solution { Set> entries = map.entrySet(); // 根据map的value值正序排,相当于一个小顶堆 - PriorityQueue> queue = new PriorityQueue<>((o1, o2) -> o1.getValue() - o2.getValue()); + PriorityQueue> queue = new PriorityQueue<>((o1, o2) -> o2.getValue() - o1.getValue()); for (Map.Entry entry : entries) { queue.offer(entry); if (queue.size() > k) { From 8399eed5204963a8968b7872cf4aa3c3ef486f8b Mon Sep 17 00:00:00 2001 From: Frogrey <35210929+Frogrey@users.noreply.github.com> Date: Mon, 3 Jan 2022 17:13:00 +0800 Subject: [PATCH 0207/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20674.=20=E6=9C=80?= =?UTF-8?q?=E9=95=BF=E8=BF=9E=E7=BB=AD=E9=80=92=E5=A2=9E=E5=BA=8F=E5=88=97?= =?UTF-8?q?=20Java=20=E8=B4=AA=E5=BF=83=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...22\345\242\236\345\272\217\345\210\227.md" | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git "a/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" "b/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" index 98e09bf86c..51d04e92c7 100644 --- "a/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" +++ "b/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" @@ -154,6 +154,8 @@ public: Java: + +> 动态规划: ```java /** * 1.dp[i] 代表当前下标最大连续值 @@ -180,6 +182,25 @@ Java: } ``` +> 贪心法: + +```Java +public static int findLengthOfLCIS(int[] nums) { + if (nums.length == 0) return 0; + int res = 1; // 连续子序列最少也是1 + int count = 1; + for (int i = 0; i < nums.length - 1; i++) { + if (nums[i + 1] > nums[i]) { // 连续记录 + count++; + } else { // 不连续,count从头开始 + count = 1; + } + if (count > res) res = count; + } + return res; +} +``` + Python: > 动态规划: From 7e3405938c0533b8b68b4d311b91a5c4c8890385 Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Tue, 4 Jan 2022 10:35:14 +0800 Subject: [PATCH 0208/3019] Update --- ...15\345\220\214\350\267\257\345\276\204.md" | 32 +++++++------- ...0.\347\210\254\346\245\274\346\242\257.md" | 34 +++++++-------- ...42\351\202\243\345\245\221\346\225\260.md" | 43 ++++++++----------- ...71\347\210\254\346\245\274\346\242\257.md" | 12 +++--- ...06\350\256\272\345\237\272\347\241\200.md" | 2 +- 5 files changed, 59 insertions(+), 64 deletions(-) diff --git "a/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" "b/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" index 38481b50d6..4086a65963 100644 --- "a/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" +++ "b/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" @@ -4,7 +4,7 @@

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

-## 62.不同路径 +# 62.不同路径 [力扣题目链接](https://leetcode-cn.com/problems/unique-paths/) @@ -18,26 +18,26 @@ ![](https://img-blog.csdnimg.cn/20210110174033215.png) -输入:m = 3, n = 7 -输出:28 +* 输入:m = 3, n = 7 +* 输出:28 示例 2: -输入:m = 2, n = 3 -输出:3 -解释: -从左上角开始,总共有 3 条路径可以到达右下角。 +* 输入:m = 2, n = 3 +* 输出:3 + +解释: 从左上角开始,总共有 3 条路径可以到达右下角。 1. 向右 -> 向右 -> 向下 2. 向右 -> 向下 -> 向右 3. 向下 -> 向右 -> 向右 示例 3: -输入:m = 7, n = 3 -输出:28 +* 输入:m = 7, n = 3 +* 输出:28 示例 4: -输入:m = 3, n = 3 -输出:6 +* 输入:m = 3, n = 3 +* 输出:6 提示: * 1 <= m, n <= 100 @@ -242,7 +242,7 @@ public: ## 其他语言版本 -Java: +### Java ```java /** * 1. 确定dp数组下标含义 dp[i][j] 到每一个坐标可能的路径种类 @@ -273,9 +273,9 @@ Java: return dp[m-1][n-1]; } -``` +``` -Python: +### Python ```python class Solution: # 动态规划 def uniquePaths(self, m: int, n: int) -> int: @@ -286,7 +286,7 @@ class Solution: # 动态规划 return dp[m - 1][n - 1] ``` -Go: +### Go ```Go func uniquePaths(m int, n int) int { dp := make([][]int, m) @@ -306,7 +306,7 @@ func uniquePaths(m int, n int) int { } ``` -Javascript: +### Javascript ```Javascript var uniquePaths = function(m, n) { const dp = Array(m).fill().map(item => Array(n)) diff --git "a/problems/0070.\347\210\254\346\245\274\346\242\257.md" "b/problems/0070.\347\210\254\346\245\274\346\242\257.md" index ec6ff35145..97db670aae 100644 --- "a/problems/0070.\347\210\254\346\245\274\346\242\257.md" +++ "b/problems/0070.\347\210\254\346\245\274\346\242\257.md" @@ -4,7 +4,7 @@

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

-## 70. 爬楼梯 +# 70. 爬楼梯 [力扣题目链接](https://leetcode-cn.com/problems/climbing-stairs/) 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 @@ -14,19 +14,19 @@ 注意:给定 n 是一个正整数。 示例 1: -输入: 2 -输出: 2 -解释: 有两种方法可以爬到楼顶。 -1. 1 阶 + 1 阶 -2. 2 阶 +* 输入: 2 +* 输出: 2 +* 解释: 有两种方法可以爬到楼顶。 + * 1 阶 + 1 阶 + * 2 阶 示例 2: -输入: 3 -输出: 3 -解释: 有三种方法可以爬到楼顶。 -1. 1 阶 + 1 阶 + 1 阶 -2. 1 阶 + 2 阶 -3. 2 阶 + 1 阶 +* 输入: 3 +* 输出: 3 +* 解释: 有三种方法可以爬到楼顶。 + * 1 阶 + 1 阶 + 1 阶 + * 1 阶 + 2 阶 + * 2 阶 + 1 阶 ## 思路 @@ -200,7 +200,7 @@ public: 关键是 [动态规划:斐波那契数](https://programmercarl.com/0509.斐波那契数.html) 题目描述就已经把动规五部曲里的递归公式和如何初始化都给出来了,剩下几部曲也自然而然的推出来了。 -而本题,就需要逐个分析了,大家现在应该初步感受出[关于动态规划,你该了解这些!](https://leetcode-cn.com/circle/article/tNuNnM/)里给出的动规五部曲了。 +而本题,就需要逐个分析了,大家现在应该初步感受出[关于动态规划,你该了解这些!](https://programmercarl.com/动态规划理论基础.html)里给出的动规五部曲了。 简单题是用来掌握方法论的,例如昨天斐波那契的题目够简单了吧,但昨天和今天可以使用一套方法分析出来的,这就是方法论! @@ -212,7 +212,7 @@ public: ## 其他语言版本 -Java: +### Java ```Java class Solution { public int climbStairs(int n) { @@ -253,7 +253,7 @@ public int climbStairs(int n) { } ``` -Python: +### Python ```python class Solution: @@ -268,7 +268,7 @@ class Solution: return dp[-1] ``` -Go: +### Go ```Go func climbStairs(n int) int { if n==1{ @@ -283,7 +283,7 @@ func climbStairs(n int) int { return dp[n] } ``` -Javascript: +### Javascript ```Javascript var climbStairs = function(n) { // dp[i] 为第 i 阶楼梯有多少种方法爬到楼顶 diff --git "a/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" "b/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" index e3e750917a..d8020d8345 100644 --- "a/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" +++ "b/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" @@ -4,7 +4,7 @@

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

-## 509. 斐波那契数 +# 509. 斐波那契数 [力扣题目链接](https://leetcode-cn.com/problems/fibonacci-number/) @@ -14,19 +14,19 @@ F(n) = F(n - 1) + F(n - 2),其中 n > 1 给你n ,请计算 F(n) 。 示例 1: -输入:2 -输出:1 -解释:F(2) = F(1) + F(0) = 1 + 0 = 1 +* 输入:2 +* 输出:1 +* 解释:F(2) = F(1) + F(0) = 1 + 0 = 1 示例 2: -输入:3 -输出:2 -解释:F(3) = F(2) + F(1) = 1 + 1 = 2 +* 输入:3 +* 输出:2 +* 解释:F(3) = F(2) + F(1) = 1 + 1 = 2 示例 3: -输入:4 -输出:3 -解释:F(4) = F(3) + F(2) = 2 + 1 = 3 +* 输入:4 +* 输出:3 +* 解释:F(4) = F(3) + F(2) = 2 + 1 = 3 提示: @@ -45,7 +45,7 @@ F(n) = F(n - 1) + F(n - 2),其中 n > 1 对于动规,如果没有方法论的话,可能简单题目可以顺手一写就过,难一点就不知道如何下手了。 -所以我总结的动规五部曲,是要用来贯穿整个动态规划系列的,就像之前讲过[二叉树系列的递归三部曲](https://programmercarl.com/前序/通过一道面试题目,讲一讲递归算法的时间复杂度!.html),[回溯法系列的回溯三部曲](https://programmercarl.com/回溯算法理论基础.html)一样。后面慢慢大家就会体会到,动规五部曲方法的重要性。 +所以我总结的动规五部曲,是要用来贯穿整个动态规划系列的,就像之前讲过[二叉树系列的递归三部曲](https://www.programmercarl.com/二叉树的递归遍历.html),[回溯法系列的回溯三部曲](https://programmercarl.com/回溯算法理论基础.html)一样。后面慢慢大家就会体会到,动规五部曲方法的重要性。 ### 动态规划 @@ -151,7 +151,7 @@ public: 这个递归的时间复杂度大家画一下树形图就知道了,如果不清晰的同学,可以看这篇:[通过一道面试题目,讲一讲递归算法的时间复杂度!](https://programmercarl.com/前序/通过一道面试题目,讲一讲递归算法的时间复杂度!.html) -# 总结 +## 总结 斐波那契数列这道题目是非常基础的题目,我在后面的动态规划的讲解中将会多次提到斐波那契数列! @@ -165,10 +165,10 @@ public: -# 其他语言版本 +## 其他语言版本 -Java: +### Java ```Java class Solution { public int fib(int n) { @@ -183,29 +183,24 @@ class Solution { } } ``` - ```java //非压缩状态的版本 class Solution { public int fib(int n) { - if (n <= 1) return n; - + if (n <= 1) return n; int[] dp = new int[n + 1]; - dp[0] = 0; dp[1] = 1; - for (int index = 2; index <= n; index++){ dp[index] = dp[index - 1] + dp[index - 2]; } - return dp[n]; } } ``` -Python: -```python3 +### Python +```python class Solution: def fib(self, n: int) -> int: if n < 2: @@ -224,7 +219,7 @@ class Solution: return self.fib(n - 1) + self.fib(n - 2) ``` -Go: +### Go: ```Go func fib(n int) int { if n < 2 { @@ -238,7 +233,7 @@ func fib(n int) int { return c } ``` -Javascript: +### Javascript ```Javascript var fib = function(n) { let dp = [0, 1] diff --git "a/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" "b/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" index ad13174402..a146cc8b51 100644 --- "a/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" +++ "b/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" @@ -4,7 +4,7 @@

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

-## 746. 使用最小花费爬楼梯 +# 746. 使用最小花费爬楼梯 [力扣题目链接](https://leetcode-cn.com/problems/min-cost-climbing-stairs/) @@ -181,7 +181,7 @@ public: 这么写看上去比较顺,但是就是感觉和题目描述的不太符。哈哈,也没有必要这么细扣题意了,大家只要知道,题目的意思反正就是要不是第一步不花费,要不是最后一步不花费,都可以。 -# 总结 +## 总结 大家可以发现这道题目相对于 昨天的[动态规划:爬楼梯](https://programmercarl.com/0070.爬楼梯.html)有难了一点,但整体思路是一样。 @@ -200,7 +200,7 @@ public: ## 其他语言版本 -Java: +### Java ```Java class Solution { public int minCostClimbingStairs(int[] cost) { @@ -222,7 +222,7 @@ class Solution { } ``` -Python: +### Python ```python class Solution: def minCostClimbingStairs(self, cost: List[int]) -> int: @@ -234,7 +234,7 @@ class Solution: return min(dp[len(cost) - 1], dp[len(cost) - 2]) ``` -Go: +### Go ```Go func minCostClimbingStairs(cost []int) int { dp := make([]int, len(cost)) @@ -253,7 +253,7 @@ func min(a, b int) int { } ``` -Javascript: +### Javascript ```Javascript var minCostClimbingStairs = function(cost) { const dp = [ cost[0], cost[1] ] diff --git "a/problems/\345\212\250\346\200\201\350\247\204\345\210\222\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\345\212\250\346\200\201\350\247\204\345\210\222\347\220\206\350\256\272\345\237\272\347\241\200.md" index 4b0a57f6b6..e94295a5bf 100644 --- "a/problems/\345\212\250\346\200\201\350\247\204\345\210\222\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\345\212\250\346\200\201\350\247\204\345\210\222\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -16,7 +16,7 @@ 所以动态规划中每一个状态一定是由上一个状态推导出来的,**这一点就区分于贪心**,贪心没有状态推导,而是从局部直接选最优的, -在[关于贪心算法,你该了解这些!](https://programmercarl.com/贪心算法理论基础.html)中我举了一个背包问题的例子。 +在[关于贪心算法,你该了解这些!](https://mp.weixin.qq.com/s/A9MHJi1a5uugFaqp8QJFWg)中我举了一个背包问题的例子。 例如:有N件物品和一个最多能背重量为W 的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。**每件物品只能用一次**,求解将哪些物品装入背包里物品价值总和最大。 From a828e5f247c8095171d60b74eefdbeb1a6b3a9a5 Mon Sep 17 00:00:00 2001 From: Martin Hsu <31008681+Martin-Hsu@users.noreply.github.com> Date: Tue, 4 Jan 2022 14:08:00 +0800 Subject: [PATCH 0209/3019] =?UTF-8?q?Update=200739.=E6=AF=8F=E6=97=A5?= =?UTF-8?q?=E6=B8=A9=E5=BA=A6.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...739.\346\257\217\346\227\245\346\270\251\345\272\246.md" | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git "a/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" "b/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" index d025e73c45..d7489028c9 100644 --- "a/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" +++ "b/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" @@ -119,7 +119,7 @@ C++代码如下: class Solution { public: vector dailyTemperatures(vector& T) { - // 递减栈 + // 递增栈 stack st; vector result(T.size(), 0); st.push(0); @@ -150,7 +150,7 @@ public: class Solution { public: vector dailyTemperatures(vector& T) { - stack st; // 递减栈 + stack st; // 递增栈 vector result(T.size(), 0); for (int i = 0; i < T.size(); i++) { while (!st.empty() && T[i] > T[st.top()]) { // 注意栈不能为空 @@ -178,7 +178,7 @@ public: Java: ```java /** - * 单调栈,栈内顺序要么从大到小 要么从小到大,本题从大到笑 + * 单调栈,栈内顺序要么从大到小 要么从小到大,本题从大到小 *

* 入站元素要和当前栈内栈首元素进行比较 * 若大于栈首则 则与元素下标做差 From 24adf56477a4c45fdf381d00b0a7d7cd6b87c964 Mon Sep 17 00:00:00 2001 From: Sarah Date: Tue, 4 Jan 2022 20:37:49 +0800 Subject: [PATCH 0210/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A00054.=E8=9E=BA?= =?UTF-8?q?=E6=97=8B=E7=9F=A9=E9=98=B5.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...72\346\227\213\347\237\251\351\230\265.md" | 140 ++++++++++++++++++ 1 file changed, 140 insertions(+) create mode 100644 "problems/0054.\350\236\272\346\227\213\347\237\251\351\230\265.md" diff --git "a/problems/0054.\350\236\272\346\227\213\347\237\251\351\230\265.md" "b/problems/0054.\350\236\272\346\227\213\347\237\251\351\230\265.md" new file mode 100644 index 0000000000..f686b27454 --- /dev/null +++ "b/problems/0054.\350\236\272\346\227\213\347\237\251\351\230\265.md" @@ -0,0 +1,140 @@ +

+ + + +

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

+ + + +## 54.螺旋矩阵 + +[力扣题目链接](https://leetcode-cn.com/problems/spiral-matrix/) + +给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。 + +示例1: + +输入: +[ + [ 1, 2, 3 ], + [ 4, 5, 6 ], + [ 7, 8, 9 ] +] +输出:[1,2,3,6,9,8,7,4,5] + +## 思路 + +本题解决思路继承自[59.螺旋矩阵II](https://www.programmercarl.com/0059.%E8%9E%BA%E6%97%8B%E7%9F%A9%E9%98%B5II.html),建议看完59.螺旋矩阵II之后再看本题 + +与59.螺旋矩阵II相同的是:两者都是模拟矩形的顺时针旋转,所以核心依然是依然是坚持循环不变量,按照左闭右开的原则 + +模拟顺时针画矩阵的过程: + +* 填充上行从左到右 +* 填充右列从上到下 +* 填充下行从右到左 +* 填充左列从下到上 + +由外向内一圈一圈这么画下去,如下所示: + +![螺旋矩阵](https://img-blog.csdnimg.cn/2020121623550681.png) + +这里每一种颜色,代表一条边,我们遍历的长度,可以看出每一个拐角处的处理规则,拐角处让给新的一条边来继续画。 + +与59.螺旋矩阵II不同的是:前题中的螺旋矩阵是正方形,只有正方形的边长n一个边界条件,而本题中,需要考虑长方形的长和宽(m行和n列)两个边界条件。自然,m可以等于n,即前题可视为本题在m==n的特殊情况。 + +我们从最一般的情况开始考虑,与59.螺旋矩阵II题解对比起来,m和n的带入,主要引来两方面的差异: + +* loop的计算: + 本题的loop计算与59.螺旋矩阵II算法略微差异,因为存在rows和columns两个维度,可自行分析,loop只能取min(rows, columns),例如rows = 5, columns = 7,那loop = 5 / 7 = 2 +* mid的计算及填充: + 1、同样的原理,本题的mid计算也存在上述差异; + 2、 + 如果min(rows, columns)为偶数,则不需要在最后单独考虑矩阵最中间位置的赋值 + 如果min(rows, columns)为奇数,则矩阵最中间位置不只是[mid][mid],而是会留下来一个特殊的中间行或者中间列,具体是中间行还是中间列,要看rows和columns的大小,如果rows > columns,则是中间列,相反,则是中间行 + +代码如下,已经详细注释了每一步的目的,可以看出while循环里判断的情况是很多的,代码里处理的原则也是统一的左闭右开。 + +整体C++代码如下: + +```CPP +class Solution { +public: + vector spiralOrder(vector>& matrix) { + if (matrix.size() == 0 || matrix[0].size() == 0) + return {}; + int rows = matrix.size(), columns = matrix[0].size(); + int total = rows * columns; + vector res(total); // 使用vector定义一个一维数组存放结果 + int startx = 0, starty = 0; // 定义每循环一个圈的起始位置 + int loop = min(rows, columns) / 2; + // 本题的loop计算与59.螺旋矩阵II算法略微差异,因为存在rows和columns两个维度,可自行分析,loop只能取min(rows, columns),例如rows = 5, columns = 7,那loop = 5 / 7 = 2 + int mid = min(rows, columns) / 2; + // 1、同样的原理,本题的mid计算也存在上述差异; + // 2、 + //如果min(rows, columns)为偶数,则不需要在最后单独考虑矩阵最中间位置的赋值 + //如果min(rows, columns)为奇数,则矩阵最中间位置不只是[mid][mid],而是会留下来一个特殊的中间行或者中间列,具体是中间行还是中间列,要看rows和columns的大小,如果rows > columns,则是中间列,相反,则是中间行 + //相信这一点不好理解,建议自行画图理解 + int count = 0;// 用来给矩阵中每一个空格赋值 + int offset = 1;// 每一圈循环,需要控制每一条边遍历的长度 + int i,j; + while (loop --) { + i = startx; + j = starty; + + // 下面开始的四个for就是模拟转了一圈 + // 模拟填充上行从左到右(左闭右开) + for (j = starty; j < starty + columns - offset; j++) { + res[count++] = matrix[startx][j]; + } + // 模拟填充右列从上到下(左闭右开) + for (i = startx; i < startx + rows - offset; i++) { + res[count++] = matrix[i][j]; + } + // 模拟填充下行从右到左(左闭右开) + for (; j > starty; j--) { + res[count++] = matrix[i][j]; + } + // 模拟填充左列从下到上(左闭右开) + for (; i > startx; i--) { + res[count++] = matrix[i][starty]; + } + + // 第二圈开始的时候,起始位置要各自加1, 例如:第一圈起始位置是(0, 0),第二圈起始位置是(1, 1) + startx++; + starty++; + + // offset 控制每一圈里每一条边遍历的长度 + offset += 2; + } + + // 如果min(rows, columns)为奇数的话,需要单独给矩阵最中间的位置赋值 + if (min(rows, columns) % 2) { + if(rows > columns){ + for (int i = mid; i < mid + rows - columns + 1; ++i) + { + res[count++] = matrix[i][mid]; + } + + } + else{ + for (int i = mid; i < mid + columns - rows + 1; ++i) + { + res[count++] = matrix[mid][i]; + } + } + } + return res; + } +}; +``` + +## 类似题目 + +* [59.螺旋矩阵II](https://leetcode-cn.com/problems/spiral-matrix-ii/) +* [剑指Offer 29.顺时针打印矩阵](https://leetcode-cn.com/problems/shun-shi-zhen-da-yin-ju-zhen-lcof/) + + + +----------------------- +
From 1e169a02c8d20805dbab8348f49cb763299ede34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E5=91=98Carl?= Date: Tue, 4 Jan 2022 23:06:12 +0800 Subject: [PATCH 0211/3019] =?UTF-8?q?Update=200054.=E8=9E=BA=E6=97=8B?= =?UTF-8?q?=E7=9F=A9=E9=98=B5.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ....\350\236\272\346\227\213\347\237\251\351\230\265.md" | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git "a/problems/0054.\350\236\272\346\227\213\347\237\251\351\230\265.md" "b/problems/0054.\350\236\272\346\227\213\347\237\251\351\230\265.md" index f686b27454..3f85c6077a 100644 --- "a/problems/0054.\350\236\272\346\227\213\347\237\251\351\230\265.md" +++ "b/problems/0054.\350\236\272\346\227\213\347\237\251\351\230\265.md" @@ -111,15 +111,12 @@ public: // 如果min(rows, columns)为奇数的话,需要单独给矩阵最中间的位置赋值 if (min(rows, columns) % 2) { if(rows > columns){ - for (int i = mid; i < mid + rows - columns + 1; ++i) - { + for (int i = mid; i < mid + rows - columns + 1; ++i) { res[count++] = matrix[i][mid]; } - } - else{ - for (int i = mid; i < mid + columns - rows + 1; ++i) - { + } else { + for (int i = mid; i < mid + columns - rows + 1; ++i) { res[count++] = matrix[mid][i]; } } From 4b0460cdd3b198c99724c6ff93daaeb541a53bd7 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, 5 Jan 2022 11:34:24 +0800 Subject: [PATCH 0212/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20102.=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?=20Swift=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...02\345\272\217\351\201\215\345\216\206.md" | 282 +++++++++++++++++- 1 file changed, 281 insertions(+), 1 deletion(-) diff --git "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" index 4fcbbff8dd..1fb9b633af 100644 --- "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" +++ "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" @@ -246,6 +246,34 @@ var levelOrder = function(root) { ``` +Swift: +```swift +func levelOrder(_ root: TreeNode?) -> [[Int]] { + var res = [[Int]]() + guard let root = root else { + return res + } + var queue = [TreeNode]() + queue.append(root) + while !queue.isEmpty { + let size = queue.count + var sub = [Int]() + for _ in 0 ..< size { + let node = queue.removeFirst() + sub.append(node.val) + if let left = node.left { + queue.append(left) + } + if let right = node.right { + queue.append(right) + } + } + res.append(sub) + } + return res +} +``` + **此时我们就掌握了二叉树的层序遍历了,那么如下九道力扣上的题目,只需要修改模板的两三行代码(不能再多了),便可打倒!** @@ -426,6 +454,31 @@ var levelOrderBottom = function(root) { }; ``` +Swift: +```swift +func levelOrderBottom(_ root: TreeNode?) -> [[Int]] { + var res = [[Int]]() + guard let root = root else { + return res + } + var queue: [TreeNode] = [root] + while !queue.isEmpty { + var sub = [Int]() + for _ in 0 ..< queue.count { + let node = queue.removeFirst() + sub.append(node.val) + if let left = node.left { + queue.append(left) + } + if let right = node.right { + queue.append(right) + } + } + res.insert(sub, at: 0) + } + return res +} +``` # 199.二叉树的右视图 @@ -604,6 +657,36 @@ var rightSideView = function(root) { }; ``` +Swift: +```swift +func rightSideView(_ root: TreeNode?) -> [Int] { + var res = [Int]() + guard let root = root else { + return res + } + var queue = [TreeNode]() + queue.append(root) + while !queue.isEmpty { + let size = queue.count + for i in 0 ..< size { + let node = queue.removeFirst() + if i == size - 1 { + // 保存 每层最后一个元素 + res.append(node.val) + } + if let left = node.left { + queue.append(left) + } + if let right = node.right { + queue.append(right) + } + } + } + return res +} +``` + + # 637.二叉树的层平均值 [力扣题目链接](https://leetcode-cn.com/problems/average-of-levels-in-binary-tree/) @@ -785,6 +868,34 @@ var averageOfLevels = function(root) { }; ``` +Swift: +```swift +func averageOfLevels(_ root: TreeNode?) -> [Double] { + var res = [Double]() + guard let root = root else { + return res + } + var queue = [TreeNode]() + queue.append(root) + while !queue.isEmpty { + let size = queue.count + var sum = 0 + for _ in 0 ..< size { + let node = queue.removeFirst() + sum += node.val + if let left = node.left { + queue.append(left) + } + if let right = node.right { + queue.append(right) + } + } + res.append(Double(sum) / Double(size)) + } + return res +} +``` + # 429.N叉树的层序遍历 [力扣题目链接](https://leetcode-cn.com/problems/n-ary-tree-level-order-traversal/) @@ -981,6 +1092,31 @@ var levelOrder = function(root) { }; ``` +Swift: +```swift +func levelOrder(_ root: Node?) -> [[Int]] { + var res = [[Int]]() + guard let root = root else { + return res + } + var queue = [Node]() + queue.append(root) + while !queue.isEmpty { + let size = queue.count + var sub = [Int]() + for _ in 0 ..< size { + let node = queue.removeFirst() + sub.append(node.val) + for childNode in node.children { + queue.append(childNode) + } + } + res.append(sub) + } + return res +} +``` + # 515.在每个树行中找最大值 [力扣题目链接](https://leetcode-cn.com/problems/find-largest-value-in-each-tree-row/) @@ -1136,6 +1272,36 @@ var largestValues = function(root) { }; ``` +Swift: +```swift +func largestValues(_ root: TreeNode?) -> [Int] { + var res = [Int]() + guard let root = root else { + return res + } + var queue = [TreeNode]() + queue.append(root) + while !queue.isEmpty { + let size = queue.count + var max: Int = Int.min + for _ in 0 ..< size { + let node = queue.removeFirst() + if node.val > max { + max = node.val + } + if let left = node.left { + queue.append(left) + } + if let right = node.right { + queue.append(right) + } + } + res.append(max) + } + return res +} +``` + # 116.填充每个节点的下一个右侧节点指针 [力扣题目链接](https://leetcode-cn.com/problems/populating-next-right-pointers-in-each-node/) @@ -1338,6 +1504,37 @@ func connect(root *Node) *Node { } ``` +Swift: +```swift +func connect(_ root: Node?) -> Node? { + guard let root = root else { + return nil + } + var queue = [Node]() + queue.append(root) + while !queue.isEmpty { + let size = queue.count + var preNode: Node? + for i in 0 ..< size { + let node = queue.removeFirst() + if i == 0 { + preNode = node + } else { + preNode?.next = node + preNode = node + } + if let left = node.left { + queue.append(left) + } + if let right = node.right { + queue.append(right) + } + } + } + return root +} +``` + # 117.填充每个节点的下一个右侧节点指针II [力扣题目链接](https://leetcode-cn.com/problems/populating-next-right-pointers-in-each-node-ii/) @@ -1532,6 +1729,38 @@ func connect(root *Node) *Node { return root } ``` + +Swift: +```swift +func connect(_ root: Node?) -> Node? { + guard let root = root else { + return nil + } + var queue = [Node]() + queue.append(root) + while !queue.isEmpty { + let size = queue.count + var preNode: Node? + for i in 0 ..< size { + let node = queue.removeFirst() + if i == 0 { + preNode = node + } else { + preNode?.next = node + preNode = node + } + if let left = node.left { + queue.append(left) + } + if let right = node.right { + queue.append(right) + } + } + } + return root +} +``` + # 104.二叉树的最大深度 [力扣题目链接](https://leetcode-cn.com/problems/maximum-depth-of-binary-tree/) @@ -1704,6 +1933,31 @@ var maxDepth = function(root) { }; ``` +Swift: +```swift +func maxDepth(_ root: TreeNode?) -> Int { + guard let root = root else { + return 0 + } + var queue = [TreeNode]() + queue.append(root) + var res: Int = 0 + while !queue.isEmpty { + for _ in 0 ..< queue.count { + let node = queue.removeFirst() + if let left = node.left { + queue.append(left) + } + if let right = node.right { + queue.append(right) + } + } + res += 1 + } + return res +} +``` + # 111.二叉树的最小深度 [力扣题目链接](https://leetcode-cn.com/problems/minimum-depth-of-binary-tree/) @@ -1876,7 +2130,33 @@ var minDepth = function(root) { }; ``` - +Swift: +```swift +func minDepth(_ root: TreeNode?) -> Int { + guard let root = root else { + return 0 + } + var res = 0 + var queue = [TreeNode]() + queue.append(root) + while !queue.isEmpty { + res += 1 + for _ in 0 ..< queue.count { + let node = queue.removeFirst() + if node.left == nil && node.right == nil { + return res + } + if let left = node.left { + queue.append(left) + } + if let right = node.right { + queue.append(right) + } + } + } + return res +} +``` # 总结 From 5efb10740ed78aa75dfb89f81ab1db5be04f7b3d Mon Sep 17 00:00:00 2001 From: Hnuczc <3260189532@qq.com> Date: Wed, 5 Jan 2022 19:08:48 +0800 Subject: [PATCH 0213/3019] =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=AD=97=E7=AC=A6?= =?UTF-8?q?=E4=B8=B2=E5=88=A4=E6=96=AD=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...76\345\274\217\346\261\202\345\200\274.md" | 39 +++++++------------ 1 file changed, 13 insertions(+), 26 deletions(-) diff --git "a/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" "b/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" index 7f7b2f4ca3..f44703f18f 100644 --- "a/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" +++ "b/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" @@ -133,39 +133,26 @@ public: java: ```Java -public class EvalRPN { - +class Solution { public int evalRPN(String[] tokens) { Deque stack = new LinkedList(); - for (String token : tokens) { - char c = token.charAt(0); - if (!isOpe(token)) { - stack.addFirst(stoi(token)); - } else if (c == '+') { - stack.push(stack.pop() + stack.pop()); - } else if (c == '-') { - stack.push(- stack.pop() + stack.pop()); - } else if (c == '*') { - stack.push( stack.pop() * stack.pop()); + for (int i = 0; i < tokens.length; ++i) { + if ("+".equals(tokens[i])) { // leetcode 内置jdk的问题,不能使用==判断字符串是否相等 + stack.push(stack.pop() + stack.pop()); // 注意 - 和/ 需要特殊处理 + } else if ("-".equals(tokens[i])) { + stack.push(-stack.pop() + stack.pop()); + } else if ("*".equals(tokens[i])) { + stack.push(stack.pop() * stack.pop()); + } else if ("/".equals(tokens[i])) { + int temp1 = stack.pop(); + int temp2 = stack.pop(); + stack.push(temp2 / temp1); } else { - int num1 = stack.pop(); - int num2 = stack.pop(); - stack.push( num2/num1); + stack.push(Integer.valueOf(tokens[i])); } } return stack.pop(); } - private boolean isOpe(String s) { - return s.length() == 1 && s.charAt(0) <'0' || s.charAt(0) >'9'; - } - private int stoi(String s) { - return Integer.valueOf(s); - } - - public static void main(String[] args) { - new EvalRPN().evalRPN(new String[] {"10","6","9","3","+","-11","*","/","*","17","+","5","+"}); - } - } ``` From 9a1788dbf829500890da8b0c0de512f3260ce157 Mon Sep 17 00:00:00 2001 From: youngyangyang04 <826123027@qq.com> Date: Wed, 5 Jan 2022 19:49:07 +0800 Subject: [PATCH 0214/3019] Update --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 5121dd2901..55f1356a5a 100644 --- a/README.md +++ b/README.md @@ -4,9 +4,9 @@ 👉 推荐 [Gitee同步](https://gitee.com/programmercarl/leetcode-master) > 1. **介绍**:本项目是一套完整的刷题计划,旨在帮助大家少走弯路,循序渐进学算法,[关注作者](#关于作者) -> 2. **PDF版本** : [「代码随想录」算法精讲 PDF 版本](https://mp.weixin.qq.com/s/NF7NqTD9DU505S6nvR_5Wg) 。 +> 2. **PDF版本** : [「代码随想录」算法精讲 PDF 版本](https://programmercarl.com/other/algo_pdf.html) 。 > 3. **刷题顺序** : README已经将刷题顺序排好了,按照顺序一道一道刷就可以。 -> 4. **学习社区** : 一起学习打卡/面试技巧/如何选择offer/大厂内推/职场规则/简历修改/技术分享/程序人生。欢迎加入[「代码随想录」知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) 。 +> 4. **学习社区** : 一起学习打卡/面试技巧/如何选择offer/大厂内推/职场规则/简历修改/技术分享/程序人生。欢迎加入[「代码随想录」知识星球](https://programmercarl.com/other/kstar.html) 。 > 5. **提交代码**:本项目统一使用C++语言进行讲解,但已经有Java、Python、Go、JavaScript等等多语言版本,感谢[这里的每一位贡献者](https://github.com/youngyangyang04/leetcode-master/graphs/contributors),如果你也想贡献代码点亮你的头像,[点击这里](https://mp.weixin.qq.com/s/tqCxrMEU-ajQumL1i8im9A)了解提交代码的方式。 > 6. **转载须知** :以下所有文章皆为我([程序员Carl](https://github.com/youngyangyang04))的原创。引用本项目文章请注明出处,发现恶意抄袭或搬运,会动用法律武器维护自己的权益。让我们一起维护一个良好的技术创作环境! From ab268238621421ec8c117b80f5ae812b1c1f783f Mon Sep 17 00:00:00 2001 From: youngyangyang04 <826123027@qq.com> Date: Wed, 5 Jan 2022 20:02:16 +0800 Subject: [PATCH 0215/3019] Update --- README.md | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 55f1356a5a..c51497767b 100644 --- a/README.md +++ b/README.md @@ -564,14 +564,14 @@ # 关于作者 -大家好,我是程序员Carl,哈工大师兄,ACM 校赛、黑龙江省赛、东北四省赛金牌、亚洲区域赛铜牌获得者,先后在腾讯和百度从事后端技术研发,CSDN博客专家。对算法和C++后端技术有一定的见解,利用工作之余重新刷leetcode。 +大家好,我是程序员Carl,哈工大师兄,《代码随想录》作者,先后在腾讯和百度从事后端技术研发,CSDN博客专家。对算法和C++后端技术有一定的见解,利用工作之余重新刷leetcode。 -加入刷题微信群,备注:「个人简单介绍」 + 组队刷题 +加入「代码随想录」刷题小分队(微信群),可以扫下方二维码加我微信。 -也欢迎与我交流,备注:「个人简单介绍」 + 交流,围观朋友圈,做点赞之交(备注没有自我介绍不通过哦) +如果是已工作,备注:姓名-城市-岗位-组队刷题。如果学生,备注:姓名-学校-年级-组队刷题。**备注没有自我介绍不通过哦** + +
- -
# 公众号 @@ -585,10 +585,3 @@
-# 服务器 - -

阿里云服务器,双11特价活动🔥🔥🔥🔥

-

- - - From d28293da0c42ddf96599b3bdb022040fca548c62 Mon Sep 17 00:00:00 2001 From: YuYiming <41357594+Leovoki@users.noreply.github.com> Date: Wed, 5 Jan 2022 21:26:01 +0800 Subject: [PATCH 0216/3019] =?UTF-8?q?Update=200459.=E9=87=8D=E5=A4=8D?= =?UTF-8?q?=E7=9A=84=E5=AD=90=E5=AD=97=E7=AC=A6=E4=B8=B2.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 有些人使用的是从0开始的next数组不是从-1的,因此会疑惑。 --- ...\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" "b/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" index fee9dee55b..9c74f4a7bb 100644 --- "a/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" @@ -45,7 +45,7 @@ 这里就要说一说next数组了,next 数组记录的就是最长相同前后缀( [字符串:KMP算法精讲](https://programmercarl.com/0028.实现strStr.html) 这里介绍了什么是前缀,什么是后缀,什么又是最长相同前后缀), 如果 next[len - 1] != -1,则说明字符串有最长相同的前后缀(就是字符串里的前缀子串和后缀子串相同的最长长度)。 -最长相等前后缀的长度为:next[len - 1] + 1。 +最长相等前后缀的长度为:next[len - 1] + 1。(这里的next数组是以统一减一的方式计算的,因此需要+1) 数组长度为:len。 From 774c3da8309c468f3f12c28c8180fae6403a976d Mon Sep 17 00:00:00 2001 From: YiChih Wang Date: Wed, 5 Jan 2022 22:32:18 +0800 Subject: [PATCH 0217/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200131.=E5=88=86?= =?UTF-8?q?=E5=89=B2=E5=9B=9E=E6=96=87=E4=B8=B2=20Rust=E8=AA=9E=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 --- ...62\345\233\236\346\226\207\344\270\262.md" | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git "a/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" "b/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" index ec8ad61c50..439ad8ea13 100644 --- "a/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" +++ "b/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" @@ -587,5 +587,57 @@ func partition(_ s: String) -> [[String]] { } ``` +## Rust + +```rust +impl Solution { + pub fn partition(s: String) -> Vec> { + let mut ret = vec![]; + let mut path = vec![]; + let sub_str: Vec = s.chars().collect(); + + Self::backtracing(&sub_str, 0, &mut ret, &mut path); + + ret + } + + fn backtracing(sub_str: &Vec, start: usize, ret: &mut Vec>, path: &mut Vec) { + //如果起始位置大于s的大小,说明找到了一组分割方案 + if start >= sub_str.len() { + ret.push(path.clone()); + return; + } + + for i in start..sub_str.len() { + if !Self::is_palindrome(sub_str, start, i) { + continue; + } + //如果是回文子串,则记录 + let s: String = sub_str[start..i+1].into_iter().collect(); + path.push(s); + + //起始位置后移,保证不重复 + Self::backtracing(sub_str, i+1, ret, path); + path.pop(); + } + + } + + fn is_palindrome(s: &Vec, start: usize, end: usize) -> bool { + let (mut start, mut end) = (start, end); + + while start < end { + if s[start] != s[end] { + return false; + } + + start += 1; + end -= 1; + } + + true + } +} +``` -----------------------

From 552388e8fdb3439fc3222cb0dafa02c48c0262f5 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Thu, 6 Jan 2022 13:58:34 +0800 Subject: [PATCH 0218/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880059.?= =?UTF-8?q?=E8=9E=BA=E6=97=8B=E7=9F=A9=E9=98=B5II.md=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\346\227\213\347\237\251\351\230\265II.md" | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git "a/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" "b/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" index c7e91b4d7e..3f7a59ca2f 100644 --- "a/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" +++ "b/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" @@ -287,6 +287,51 @@ var generateMatrix = function(n) { ``` +TypeScript: + +```typescript +function generateMatrix(n: number): number[][] { + let loopNum: number = Math.floor(n / 2); + const resArr: number[][] = new Array(n).fill(1).map(i => new Array(n)); + let chunkNum: number = n - 1; + let startX: number = 0; + let startY: number = 0; + let value: number = 1; + let x: number, y: number; + while (loopNum--) { + x = startX; + y = startY; + while (x < startX + chunkNum) { + resArr[y][x] = value; + x++; + value++; + } + while (y < startY + chunkNum) { + resArr[y][x] = value; + y++; + value++; + } + while (x > startX) { + resArr[y][x] = value; + x--; + value++; + } + while (y > startY) { + resArr[y][x] = value; + y--; + value++; + } + startX++; + startY++; + chunkNum -= 2; + } + if (n % 2 === 1) { + resArr[startX][startY] = value; + } + return resArr; +}; +``` + Go: ```go From 871ae8f6196114273320aa7db77817e6af559d76 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9E=81=E5=AE=A2=E5=AD=A6=E4=BC=9F?= Date: Thu, 6 Jan 2022 14:32:38 +0800 Subject: [PATCH 0219/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20226.=E7=BF=BB?= =?UTF-8?q?=E8=BD=AC=E4=BA=8C=E5=8F=89=E6=A0=91=20Swift=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...54\344\272\214\345\217\211\346\240\221.md" | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git "a/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" "b/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" index ee1f5ddfbb..e6dbb70934 100644 --- "a/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" @@ -609,5 +609,43 @@ struct TreeNode* invertTree(struct TreeNode* root){ } ``` +### Swift: +```swift +// 前序遍历-递归 +func invertTree(_ root: TreeNode?) -> TreeNode? { + guard let root = root else { + return root + } + let tmp = root.left + root.left = root.right + root.right = tmp + let _ = invertTree(root.left) + let _ = invertTree(root.right) + return root +} + +// 层序遍历-迭代 +func invertTree1(_ root: TreeNode?) -> TreeNode? { + guard let root = root else { + return nil + } + var queue = [TreeNode]() + queue.append(root) + while !queue.isEmpty { + let node = queue.removeFirst() + let tmp = node.left + node.left = node.right + node.right = tmp + if let left = node.left { + queue.append(left) + } + if let right = node.right { + queue.append(right) + } + } + return root +} +``` + -----------------------
From 155f457d22a9a94fbcf21ebbf2d34c9769e8e32d Mon Sep 17 00:00:00 2001 From: Guanzhong Pan Date: Thu, 6 Jan 2022 15:07:39 +0000 Subject: [PATCH 0220/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200047.=E5=85=A8?= =?UTF-8?q?=E6=8E=92=E5=88=97II.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 --- ...\345\205\250\346\216\222\345\210\227II.md" | 71 +++++++++++++++++++ 1 file changed, 71 insertions(+) diff --git "a/problems/0047.\345\205\250\346\216\222\345\210\227II.md" "b/problems/0047.\345\205\250\346\216\222\345\210\227II.md" index 781f01c380..0cecac5058 100644 --- "a/problems/0047.\345\205\250\346\216\222\345\210\227II.md" +++ "b/problems/0047.\345\205\250\346\216\222\345\210\227II.md" @@ -323,5 +323,76 @@ func permuteUnique(_ nums: [Int]) -> [[Int]] { } ``` +### C +```c +//临时数组 +int *path; +//返回数组 +int **ans; +int *used; +int pathTop, ansTop; + +//拷贝path到ans中 +void copyPath() { + int *tempPath = (int*)malloc(sizeof(int) * pathTop); + int i; + for(i = 0; i < pathTop; ++i) { + tempPath[i] = path[i]; + } + ans[ansTop++] = tempPath; +} + +void backTracking(int* used, int *nums, int numsSize) { + //若path中元素个数等于numsSize,将path拷贝入ans数组中 + if(pathTop == numsSize) + copyPath(); + int i; + for(i = 0; i < numsSize; i++) { + //若当前元素已被使用 + //或前一位元素与当前元素值相同但并未被使用 + //则跳过此分支 + if(used[i] || (i != 0 && nums[i] == nums[i-1] && used[i-1] == 0)) + continue; + + //将当前元素的使用情况设为True + used[i] = 1; + path[pathTop++] = nums[i]; + backTracking(used, nums, numsSize); + used[i] = 0; + --pathTop; + } +} + +int cmp(void* elem1, void* elem2) { + return *((int*)elem1) - *((int*)elem2); +} + +int** permuteUnique(int* nums, int numsSize, int* returnSize, int** returnColumnSizes){ + //排序数组 + qsort(nums, numsSize, sizeof(int), cmp); + //初始化辅助变量 + pathTop = ansTop = 0; + path = (int*)malloc(sizeof(int) * numsSize); + ans = (int**)malloc(sizeof(int*) * 1000); + //初始化used辅助数组 + used = (int*)malloc(sizeof(int) * numsSize); + int i; + for(i = 0; i < numsSize; i++) { + used[i] = 0; + } + + backTracking(used, nums, numsSize); + + //设置返回的数组的长度 + *returnSize = ansTop; + *returnColumnSizes = (int*)malloc(sizeof(int) * ansTop); + int z; + for(z = 0; z < ansTop; z++) { + (*returnColumnSizes)[z] = numsSize; + } + return ans; +} +``` + -----------------------
From 59b38a9ebf73af718de50c7cc11b92bc5ef0ad68 Mon Sep 17 00:00:00 2001 From: bqlin Date: Sun, 19 Dec 2021 17:04:04 +0800 Subject: [PATCH 0221/3019] =?UTF-8?q?1002.=E6=9F=A5=E6=89=BE=E5=B8=B8?= =?UTF-8?q?=E7=94=A8=E5=AD=97=E7=AC=A6=EF=BC=9A=E4=BC=98=E5=8C=96=E6=8E=92?= =?UTF-8?q?=E7=89=88=EF=BC=8C=E4=BF=AE=E6=94=B9=E9=94=99=E5=88=AB=E5=AD=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...76\345\270\270\347\224\250\345\255\227\347\254\246.md" | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git "a/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md" "b/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md" index 08e7ec3d8e..7c5566d333 100644 --- "a/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md" +++ "b/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md" @@ -58,7 +58,7 @@ words[i] 由小写英文字母组成 先统计第一个字符串所有字符出现的次数,代码如下: -``` +```cpp int hash[26] = {0}; // 用来统计所有字符串里字符出现的最小频率 for (int i = 0; i < A[0].size(); i++) { // 用第一个字符串给hash初始化 hash[A[0][i] - 'a']++; @@ -71,7 +71,7 @@ for (int i = 0; i < A[0].size(); i++) { // 用第一个字符串给hash初始化 代码如下: -``` +```cpp int hashOtherStr[26] = {0}; // 统计除第一个字符串外字符的出现频率 for (int i = 1; i < A.size(); i++) { memset(hashOtherStr, 0, 26 * sizeof(int)); @@ -84,11 +84,11 @@ for (int i = 1; i < A.size(); i++) { } } ``` -此时hash里统计着字符在所有字符串里出现的最小次数,那么把hash转正题目要求的输出格式就可以了。 +此时hash里统计着字符在所有字符串里出现的最小次数,那么把hash转成题目要求的输出格式就可以了。 代码如下: -``` +```cpp // 将hash统计的字符次数,转成输出形式 for (int i = 0; i < 26; i++) { while (hash[i] != 0) { // 注意这里是while,多个重复的字符 From 3078fb8eeaaa0a7e4200e6a0c2eb5e7835ea5bb4 Mon Sep 17 00:00:00 2001 From: bqlin Date: Sun, 19 Dec 2021 17:22:04 +0800 Subject: [PATCH 0222/3019] =?UTF-8?q?0001.=E4=B8=A4=E6=95=B0=E4=B9=8B?= =?UTF-8?q?=E5=92=8C=EF=BC=9A=E7=AE=80=E5=8C=96Swift=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...244\346\225\260\344\271\213\345\222\214.md" | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git "a/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" "b/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" index 37c95736a9..8551274cf7 100644 --- "a/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" @@ -207,18 +207,16 @@ function twoSum(array $nums, int $target): array Swift: ```swift func twoSum(_ nums: [Int], _ target: Int) -> [Int] { - var res = [Int]() - var dict = [Int : Int]() - for i in 0 ..< nums.count { - let other = target - nums[i] - if dict.keys.contains(other) { - res.append(i) - res.append(dict[other]!) - return res + // 值: 下标 + var map = [Int: Int]() + for (i, e) in nums.enumerated() { + if let v = map[target - e] { + return [v, i] + } else { + map[e] = i } - dict[nums[i]] = i } - return res + return [] } ``` From 6144420c3962f2e63a4e682baa5e7eecce10b08c Mon Sep 17 00:00:00 2001 From: bqlin Date: Sun, 19 Dec 2021 17:28:51 +0800 Subject: [PATCH 0223/3019] =?UTF-8?q?0454.=E5=9B=9B=E6=95=B0=E7=9B=B8?= =?UTF-8?q?=E5=8A=A0II=EF=BC=9A=E7=AE=80=E5=8C=96Swift=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\346\225\260\347\233\270\345\212\240II.md" | 36 +++++++++---------- 1 file changed, 16 insertions(+), 20 deletions(-) diff --git "a/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" "b/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" index 6853354c49..6e9166081a 100644 --- "a/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" +++ "b/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" @@ -44,7 +44,7 @@ D = [ 0, 2] 1. 首先定义 一个unordered_map,key放a和b两数之和,value 放a和b两数之和出现的次数。 2. 遍历大A和大B数组,统计两个数组元素之和,和出现的次数,放到map中。 -3. 定义int变量count,用来统计a+b+c+d = 0 出现的次数。 +3. 定义int变量count,用来统计 a+b+c+d = 0 出现的次数。 4. 在遍历大C和大D数组,找到如果 0-(c+d) 在map中出现过的话,就用count把map中key对应的value也就是出现次数统计出来。 5. 最后返回统计值 count 就可以了 @@ -139,7 +139,7 @@ class Solution(object): return count -``` +``` Go: ```go @@ -229,28 +229,24 @@ class Solution { Swift: ```swift func fourSumCount(_ nums1: [Int], _ nums2: [Int], _ nums3: [Int], _ nums4: [Int]) -> Int { - // key:a+b的数值,value:a+b数值出现的次数 - var map = [Int: Int]() - // 遍历nums1和nums2数组,统计两个数组元素之和,和出现的次数,放到map中 - for i in 0 ..< nums1.count { - for j in 0 ..< nums2.count { - let sum1 = nums1[i] + nums2[j] - map[sum1] = (map[sum1] ?? 0) + 1 + // ab和: ab和出现次数 + var countDic = [Int: Int]() + for a in nums1 { + for b in nums2 { + let key = a + b + countDic[key] = countDic[key, default: 0] + 1 } } - // 统计a+b+c+d = 0 出现的次数 - var res = 0 - // 在遍历大num3和num4数组,找到如果 0-(c+d) 在map中出现过的话,就把map中key对应的value也就是出现次数统计出来。 - for i in 0 ..< nums3.count { - for j in 0 ..< nums4.count { - let sum2 = nums3[i] + nums4[j] - let other = 0 - sum2 - if map.keys.contains(other) { - res += map[other]! - } + + // 通过-(c + d)作为key,去累加ab和出现的次数 + var result = 0 + for c in nums3 { + for d in nums4 { + let key = -(c + d) + result += countDic[key, default: 0] } } - return res + return result } ``` From 1104815b1885d5ce50ff9cd5006a3ee9caaa6a94 Mon Sep 17 00:00:00 2001 From: bqlin Date: Sun, 19 Dec 2021 18:58:57 +0800 Subject: [PATCH 0224/3019] =?UTF-8?q?=E2=80=9C=E5=80=92=E5=8F=99=E2=80=9D?= =?UTF-8?q?=20->=20=E2=80=9C=E5=80=92=E5=BA=8F=E2=80=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...13\344\270\200\344\270\252\346\216\222\345\210\227.md" | 2 +- ...62\351\207\214\347\232\204\345\215\225\350\257\215.md" | 2 +- ...15\350\275\254\345\255\227\347\254\246\344\270\262.md" | 1 - ...52\351\253\230\351\242\221\345\205\203\347\264\240.md" | 4 ++-- ...62\347\255\211\345\222\214\345\255\220\351\233\206.md" | 2 +- ...\345\206\227\344\275\231\350\277\236\346\216\245II.md" | 4 ++-- ...61\350\264\271\347\210\254\346\245\274\346\242\257.md" | 2 +- ...70\351\202\273\351\207\215\345\244\215\351\241\271.md" | 2 +- ...\345\244\264\347\232\204\351\207\215\351\207\217II.md" | 2 +- ...45\237\272\347\241\20001\350\203\214\345\214\205-2.md" | 8 ++++---- 10 files changed, 14 insertions(+), 15 deletions(-) diff --git "a/problems/0031.\344\270\213\344\270\200\344\270\252\346\216\222\345\210\227.md" "b/problems/0031.\344\270\213\344\270\200\344\270\252\346\216\222\345\210\227.md" index 10ee0aaa31..84bf3e607c 100644 --- "a/problems/0031.\344\270\213\344\270\200\344\270\252\346\216\222\345\210\227.md" +++ "b/problems/0031.\344\270\213\344\270\200\344\270\252\346\216\222\345\210\227.md" @@ -86,7 +86,7 @@ public: } } } - // 到这里了说明整个数组都是倒叙了,反转一下便可 + // 到这里了说明整个数组都是倒序了,反转一下便可 reverse(nums.begin(), nums.end()); } }; diff --git "a/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" "b/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" index 48324cd9e1..d58ace8938 100644 --- "a/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" +++ "b/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" @@ -40,7 +40,7 @@ 不能使用辅助空间之后,那么只能在原字符串上下功夫了。 -想一下,我们将整个字符串都反转过来,那么单词的顺序指定是倒序了,只不过单词本身也倒叙了,那么再把单词反转一下,单词不就正过来了。 +想一下,我们将整个字符串都反转过来,那么单词的顺序指定是倒序了,只不过单词本身也倒序了,那么再把单词反转一下,单词不就正过来了。 所以解题思路如下: diff --git "a/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" "b/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" index 2831383901..9176c9159d 100644 --- "a/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" @@ -101,7 +101,6 @@ s[j] = tmp; s[i] ^= s[j]; s[j] ^= s[i]; s[i] ^= s[j]; - ``` 这道题目还是比较简单的,但是我正好可以通过这道题目说一说在刷题的时候,使用库函数的原则。 diff --git "a/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" "b/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" index e6ad751bab..8bd774e94d 100644 --- "a/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" +++ "b/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" @@ -107,7 +107,7 @@ public: } } - // 找出前K个高频元素,因为小顶堆先弹出的是最小的,所以倒叙来输出到数组 + // 找出前K个高频元素,因为小顶堆先弹出的是最小的,所以倒序来输出到数组 vector result(k); for (int i = k - 1; i >= 0; i--) { result[i] = pri_que.top().first; @@ -180,7 +180,7 @@ class Solution: if len(pri_que) > k: #如果堆的大小大于了K,则队列弹出,保证堆的大小一直为k heapq.heappop(pri_que) - #找出前K个高频元素,因为小顶堆先弹出的是最小的,所以倒叙来输出到数组 + #找出前K个高频元素,因为小顶堆先弹出的是最小的,所以倒序来输出到数组 result = [0] * k for i in range(k-1, -1, -1): result[i] = heapq.heappop(pri_que)[1] diff --git "a/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" "b/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" index 23a285f854..45b8b41627 100644 --- "a/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" +++ "b/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" @@ -112,7 +112,7 @@ vector dp(10001, 0); 4. 确定遍历顺序 -在[动态规划:关于01背包问题,你该了解这些!(滚动数组)](https://programmercarl.com/背包理论基础01背包-2.html)中就已经说明:如果使用一维dp数组,物品遍历的for循环放在外层,遍历背包的for循环放在内层,且内层for循环倒叙遍历! +在[动态规划:关于01背包问题,你该了解这些!(滚动数组)](https://programmercarl.com/背包理论基础01背包-2.html)中就已经说明:如果使用一维dp数组,物品遍历的for循环放在外层,遍历背包的for循环放在内层,且内层for循环倒序遍历! 代码如下: diff --git "a/problems/0685.\345\206\227\344\275\231\350\277\236\346\216\245II.md" "b/problems/0685.\345\206\227\344\275\231\350\277\236\346\216\245II.md" index de62432c72..d96d4912fe 100644 --- "a/problems/0685.\345\206\227\344\275\231\350\277\236\346\216\245II.md" +++ "b/problems/0685.\345\206\227\344\275\231\350\277\236\346\216\245II.md" @@ -68,7 +68,7 @@ for (int i = 0; i < n; i++) { ```cpp vector vec; // 记录入度为2的边(如果有的话就两条边) -// 找入度为2的节点所对应的边,注意要倒叙,因为优先返回最后出现在二维数组中的答案 +// 找入度为2的节点所对应的边,注意要倒序,因为优先返回最后出现在二维数组中的答案 for (int i = n - 1; i >= 0; i--) { if (inDegree[edges[i][1]] == 2) { vec.push_back(i); @@ -577,7 +577,7 @@ var findRedundantDirectedConnection = function(edges) { inDegree[edges[i][1]]++; // 统计入度 } let vec = [];// 记录入度为2的边(如果有的话就两条边) - // 找入度为2的节点所对应的边,注意要倒叙,因为优先返回最后出现在二维数组中的答案 + // 找入度为2的节点所对应的边,注意要倒序,因为优先返回最后出现在二维数组中的答案 for (let i = n - 1; i >= 0; i--) { if (inDegree[edges[i][1]] == 2) { vec.push(i); diff --git "a/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" "b/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" index a146cc8b51..0009f06c5f 100644 --- "a/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" +++ "b/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" @@ -82,7 +82,7 @@ dp[1] = cost[1]; **但是稍稍有点难度的动态规划,其遍历顺序并不容易确定下来**。 -例如:01背包,都知道两个for循环,一个for遍历物品嵌套一个for遍历背包容量,那么为什么不是一个for遍历背包容量嵌套一个for遍历物品呢? 以及在使用一维dp数组的时候遍历背包容量为什么要倒叙呢? +例如:01背包,都知道两个for循环,一个for遍历物品嵌套一个for遍历背包容量,那么为什么不是一个for遍历背包容量嵌套一个for遍历物品呢? 以及在使用一维dp数组的时候遍历背包容量为什么要倒序呢? **这些都是遍历顺序息息相关。当然背包问题后续「代码随想录」都会重点讲解的!** diff --git "a/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" "b/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" index 755520f351..d6eefd078a 100644 --- "a/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" +++ "b/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" @@ -63,7 +63,7 @@ ![1047.删除字符串中的所有相邻重复项](https://code-thinking.cdn.bcebos.com/gifs/1047.删除字符串中的所有相邻重复项.gif) -从栈中弹出剩余元素,此时是字符串ac,因为从栈里弹出的元素是倒叙的,所以在对字符串进行反转一下,就得到了最终的结果。 +从栈中弹出剩余元素,此时是字符串ac,因为从栈里弹出的元素是倒序的,所以在对字符串进行反转一下,就得到了最终的结果。 C++代码 : diff --git "a/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" "b/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" index 975968deb1..d64e7e5632 100644 --- "a/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" +++ "b/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" @@ -87,7 +87,7 @@ vector dp(15001, 0); 4. 确定遍历顺序 -在[动态规划:关于01背包问题,你该了解这些!(滚动数组)](https://programmercarl.com/背包理论基础01背包-2.html)中就已经说明:如果使用一维dp数组,物品遍历的for循环放在外层,遍历背包的for循环放在内层,且内层for循环倒叙遍历! +在[动态规划:关于01背包问题,你该了解这些!(滚动数组)](https://programmercarl.com/背包理论基础01背包-2.html)中就已经说明:如果使用一维dp数组,物品遍历的for循环放在外层,遍历背包的for循环放在内层,且内层for循环倒序遍历! 代码如下: diff --git "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" index 7f646f06b4..a57bae1064 100644 --- "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" +++ "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" @@ -103,7 +103,7 @@ for(int i = 0; i < weight.size(); i++) { // 遍历物品 为什么呢? -**倒叙遍历是为了保证物品i只被放入一次!**。但如果一旦正序遍历了,那么物品0就会被重复加入多次! +**倒序遍历是为了保证物品i只被放入一次!**。但如果一旦正序遍历了,那么物品0就会被重复加入多次! 举一个例子:物品0的重量weight[0] = 1,价值value[0] = 15 @@ -115,9 +115,9 @@ dp[2] = dp[2 - weight[0]] + value[0] = 30 此时dp[2]就已经是30了,意味着物品0,被放入了两次,所以不能正序遍历。 -为什么倒叙遍历,就可以保证物品只放入一次呢? +为什么倒序遍历,就可以保证物品只放入一次呢? -倒叙就是先算dp[2] +倒序就是先算dp[2] dp[2] = dp[2 - weight[0]] + value[0] = 15 (dp数组已经都初始化为0) @@ -125,7 +125,7 @@ dp[1] = dp[1 - weight[0]] + value[0] = 15 所以从后往前循环,每次取得状态不会和之前取得状态重合,这样每种物品就只取一次了。 -**那么问题又来了,为什么二维dp数组历的时候不用倒叙呢?** +**那么问题又来了,为什么二维dp数组历的时候不用倒序呢?** 因为对于二维dp,dp[i][j]都是通过上一层即dp[i - 1][j]计算而来,本层的dp[i][j]并不会被覆盖! From cb0f5906fdf7a22a097958cbb89783905baf970f Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Sat, 8 Jan 2022 23:55:34 +0800 Subject: [PATCH 0225/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=88=E9=93=BE?= =?UTF-8?q?=E8=A1=A8=E7=90=86=E8=AE=BA=E5=9F=BA=E7=A1=80.md=EF=BC=89?= =?UTF-8?q?=EF=BC=9A=E5=A2=9E=E5=8A=A0JS=E5=92=8CTS=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...06\350\256\272\345\237\272\347\241\200.md" | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git "a/problems/\351\223\276\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\351\223\276\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" index 02b7029e5d..109aa1ed70 100644 --- "a/problems/\351\223\276\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\351\223\276\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -168,6 +168,32 @@ public class ListNode { } ``` +JavaScript: + +```javascript +class ListNode { + val; + next = null; + constructor(value) { + this.val = value; + this.next = null; + } +} +``` + +TypeScript: + +```typescript +class ListNode { + public val: number; + public next: ListNode = null; + constructor(value: number) { + this.val = value; + this.next = null; + } +} +``` + Python: From 1c595ed05192de37b7c9927b826a365c96ed2fae Mon Sep 17 00:00:00 2001 From: Du Date: Sun, 9 Jan 2022 08:52:20 +0800 Subject: [PATCH 0226/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0105.=20=E4=BB=8E?= =?UTF-8?q?=E5=89=8D=E5=BA=8F=E4=B8=8E=E4=B8=AD=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?=E3=80=81106.=20=E4=BB=8E=E4=B8=AD=E5=BA=8F=E4=B8=8E=E5=90=8E?= =?UTF-8?q?=E5=BA=8F=E9=81=8D=E5=8E=86=E5=BA=8F=E5=88=97=E6=9E=84=E9=80=A0?= =?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=A0=91=20Swift=20=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...40\344\272\214\345\217\211\346\240\221.md" | 102 +++++++++++++++++- 1 file changed, 100 insertions(+), 2 deletions(-) diff --git "a/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" "b/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" index 487e4f7d9b..59e0ba5375 100644 --- "a/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" @@ -684,7 +684,7 @@ class Solution: root.right = self.buildTree(preorder_right, inorder_right) return root -``` +``` 106.从中序与后序遍历序列构造二叉树 @@ -716,7 +716,7 @@ class Solution: root.right = self.buildTree(inorder_right, postorder_right) return root -``` +``` ## Go @@ -816,6 +816,7 @@ var buildTree = function(preorder, inorder) { ## C 106 从中序与后序遍历序列构造二叉树 + ```c int linearSearch(int* arr, int arrSize, int key) { int i; @@ -847,6 +848,7 @@ struct TreeNode* buildTree(int* inorder, int inorderSize, int* postorder, int po ``` 105 从前序与中序遍历序列构造二叉树 + ```c struct TreeNode* buildTree(int* preorder, int preorderSize, int* inorder, int inorderSize){ // 递归结束条件:传入的数组大小为0 @@ -887,7 +889,103 @@ struct TreeNode* buildTree(int* preorder, int preorderSize, int* inorder, int in // 6.返回根节点 return root; } + +``` + +## Swift + +105 从前序与中序遍历序列构造二叉树 + +```swift +class Solution { + func buildTree(_ preorder: [Int], _ inorder: [Int]) -> TreeNode? { + return helper(preorder: preorder, + preorderBegin: 0, + preorderEnd: preorder.count, + inorder: inorder, + inorderBegin: 0, + inorderEnd: inorder.count) + } + + func helper(preorder: [Int], preorderBegin: Int, preorderEnd: Int, inorder: [Int], inorderBegin: Int, inorderEnd: Int) -> TreeNode? { + if preorderBegin == preorderEnd { + return nil + } + + // 前序遍历数组的第一个元素作为分割点 + let rootValue = preorder[preorderBegin] + let root = TreeNode(rootValue) + + + if preorderEnd - preorderBegin == 1 { + return root + } + + var index = 0 // 从中序遍历数组中找到根节点的下标 + if let ind = inorder.firstIndex(of: rootValue) { + index = ind + } + + // 递归 + root.left = helper(preorder: preorder, + preorderBegin: preorderBegin + 1, + preorderEnd: preorderBegin + 1 + index - inorderBegin, + inorder: inorder, + inorderBegin: inorderBegin, + inorderEnd: index) + root.right = helper(preorder: preorder, + preorderBegin: preorderBegin + 1 + index - inorderBegin, + preorderEnd: preorderEnd, + inorder: inorder, + inorderBegin: index + 1, + inorderEnd: inorderEnd) + return root + } +} ``` +106 从中序与后序遍历序列构造二叉树 + +```swift +class Solution_0106 { + func buildTree(inorder: [Int], inorderBegin: Int, inorderEnd: Int, postorder: [Int], postorderBegin: Int, postorderEnd: Int) -> TreeNode? { + if postorderEnd - postorderBegin < 1 { + return nil + } + + // 后序遍历数组的最后一个元素作为分割点 + let rootValue = postorder[postorderEnd - 1] + let root = TreeNode(rootValue) + + if postorderEnd - postorderBegin == 1 { + return root + } + + // 从中序遍历数组中找到根节点的下标 + var delimiterIndex = 0 + if let index = inorder.firstIndex(of: rootValue) { + delimiterIndex = index + } + + root.left = buildTree(inorder: inorder, + inorderBegin: inorderBegin, + inorderEnd: delimiterIndex, + postorder: postorder, + postorderBegin: postorderBegin, + postorderEnd: postorderBegin + (delimiterIndex - inorderBegin)) + + root.right = buildTree(inorder: inorder, + inorderBegin: delimiterIndex + 1, + inorderEnd: inorderEnd, + postorder: postorder, + postorderBegin: postorderBegin + (delimiterIndex - inorderBegin), + postorderEnd: postorderEnd - 1) + return root + } +} +``` + + + -----------------------
From 1f7f1617296bbb862b5ff6a265659ccd53659af4 Mon Sep 17 00:00:00 2001 From: Du Date: Sun, 9 Jan 2022 08:57:44 +0800 Subject: [PATCH 0227/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0105.=20=E4=BB=8E?= =?UTF-8?q?=E5=89=8D=E5=BA=8F=E4=B8=8E=E4=B8=AD=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?=E3=80=81106.=20=E4=BB=8E=E4=B8=AD=E5=BA=8F=E4=B8=8E=E5=90=8E?= =?UTF-8?q?=E5=BA=8F=E9=81=8D=E5=8E=86=E5=BA=8F=E5=88=97=E6=9E=84=E9=80=A0?= =?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=A0=91=20Swift=20=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...6\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" | 1 - 1 file changed, 1 deletion(-) diff --git "a/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" "b/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" index 59e0ba5375..40d75983cb 100644 --- "a/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" @@ -889,7 +889,6 @@ struct TreeNode* buildTree(int* preorder, int preorderSize, int* inorder, int in // 6.返回根节点 return root; } - ``` ## Swift From a246b9b4e6dc344925259f64150400ddb7661ed4 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Sun, 9 Jan 2022 13:42:10 +0800 Subject: [PATCH 0228/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880203.?= =?UTF-8?q?=E7=A7=BB=E9=99=A4=E9=93=BE=E8=A1=A8=E5=85=83=E7=B4=A0.md?= =?UTF-8?q?=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...76\350\241\250\345\205\203\347\264\240.md" | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git "a/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" "b/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" index 9d0ef91f12..4e7bdd34a8 100644 --- "a/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" +++ "b/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" @@ -302,7 +302,63 @@ var removeElements = function(head, val) { }; ``` +TypeScript: + +版本一(在原链表上直接删除): + +```typescript +/** + * Definition for singly-linked list. + * class ListNode { + * val: number + * next: ListNode | null + * constructor(val?: number, next?: ListNode | null) { + * this.val = (val===undefined ? 0 : val) + * this.next = (next===undefined ? null : next) + * } + * } + */ +function removeElements(head: ListNode | null, val: number): ListNode | null { + // 删除头部节点 + while (head !== null && head.val === val) { + head = head.next; + } + if (head === null) return head; + let pre: ListNode = head, cur: ListNode = head.next; + // 删除非头部节点 + while (cur) { + if (cur.val === val) { + pre.next = cur.next; + } else { + pre = pre.next; + } + cur = cur.next; + } + return head; +}; +``` + +版本二(虚拟头节点): + +```typescript +function removeElements(head: ListNode | null, val: number): ListNode | null { + head = new ListNode(0, head); + let pre: ListNode = head, cur: ListNode = head.next; + // 删除非头部节点 + while (cur) { + if (cur.val === val) { + pre.next = cur.next; + } else { + pre = pre.next; + } + cur = cur.next; + } + return head.next; +}; +``` + Swift: + ```swift /** * Definition for singly-linked list. From d2904c2675ecc26f0b385f368c857eeb68d526fa Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Sun, 9 Jan 2022 18:19:46 +0800 Subject: [PATCH 0229/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880206.?= =?UTF-8?q?=E7=BF=BB=E8=BD=AC=E9=93=BE=E8=A1=A8.md=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...73\350\275\254\351\223\276\350\241\250.md" | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git "a/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md" "b/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md" index 13ed753cf8..941928baae 100644 --- "a/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md" +++ "b/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md" @@ -314,6 +314,54 @@ var reverseList = function(head) { }; ``` +TypeScript: + +```typescript +// 双指针法 +function reverseList(head: ListNode | null): ListNode | null { + let preNode: ListNode | null = null, + curNode: ListNode | null = head, + tempNode: ListNode | null; + while (curNode) { + tempNode = curNode.next; + curNode.next = preNode; + preNode = curNode; + curNode = tempNode; + } + return preNode; +}; + +// 递归(从前往后翻转) +function reverseList(head: ListNode | null): ListNode | null { + function recur(preNode: ListNode | null, curNode: ListNode | null): ListNode | null { + if (curNode === null) return preNode; + let tempNode: ListNode | null = curNode.next; + curNode.next = preNode; + preNode = curNode; + curNode = tempNode; + return recur(preNode, curNode); + } + return recur(null, head); +}; + +// 递归(从后往前翻转) +function reverseList(head: ListNode | null): ListNode | null { + if (head === null) return null; + let newHead: ListNode | null; + function recur(node: ListNode | null, preNode: ListNode | null): void { + if (node.next === null) { + newHead = node; + newHead.next = preNode; + } else { + recur(node.next, node); + node.next = preNode; + } + } + recur(head, null); + return newHead; +}; +``` + Ruby: ```ruby From c5c8fe50b4f101d495e4218722335f467e7e936c 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, 10 Jan 2022 15:02:55 +0800 Subject: [PATCH 0230/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20101.=20=E5=AF=B9?= =?UTF-8?q?=E7=A7=B0=E4=BA=8C=E5=8F=89=E6=A0=91=20Swift=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...60\344\272\214\345\217\211\346\240\221.md" | 80 +++++++++++++++++++ 1 file changed, 80 insertions(+) diff --git "a/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" "b/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" index b9dff99ce2..69bc41d3c3 100644 --- "a/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" @@ -574,7 +574,87 @@ var isSymmetric = function(root) { }; ``` +## Swift: +> 递归 +```swift +func isSymmetric(_ root: TreeNode?) -> Bool { + return _isSymmetric(root?.left, right: root?.right) +} +func _isSymmetric(_ left: TreeNode?, right: TreeNode?) -> Bool { + // 首先排除空节点情况 + if left == nil && right == nil { + return true + } else if left == nil && right != nil { + return false + } else if left != nil && right == nil { + return false + } else if left!.val != right!.val { + // 进而排除数值不相等的情况 + return false + } + + // left 和 right 都不为空, 且数值也相等就递归 + let inSide = _isSymmetric(left!.right, right: right!.left) + let outSide = _isSymmetric(left!.left, right: right!.right) + return inSide && outSide +} +``` + +> 迭代 - 使用队列 +```swift +func isSymmetric2(_ root: TreeNode?) -> Bool { + guard let root = root else { + return true + } + var queue = [TreeNode?]() + queue.append(root.left) + queue.append(root.right) + while !queue.isEmpty { + let left = queue.removeFirst() + let right = queue.removeFirst() + if left == nil && right == nil { + continue + } + if left == nil || right == nil || left?.val != right?.val { + return false + } + queue.append(left!.left) + queue.append(right!.right) + queue.append(left!.right) + queue.append(right!.left) + } + return true +} +``` + +> 迭代 - 使用栈 +```swift +func isSymmetric3(_ root: TreeNode?) -> Bool { + guard let root = root else { + return true + } + var stack = [TreeNode?]() + stack.append(root.left) + stack.append(root.right) + while !stack.isEmpty { + let left = stack.removeLast() + let right = stack.removeLast() + + if left == nil && right == nil { + continue + } + if left == nil || right == nil || left?.val != right?.val { + return false + } + stack.append(left!.left) + stack.append(right!.right) + stack.append(left!.right) + stack.append(right!.left) + } + return true +} +``` -----------------------
From b3711266156c2b8e25ac6e40b681842fefab9279 Mon Sep 17 00:00:00 2001 From: HanMengnan <1448189829@qq.com> Date: Tue, 11 Jan 2022 12:48:46 +0800 Subject: [PATCH 0231/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=2034.=20=E5=9C=A8?= =?UTF-8?q?=E6=8E=92=E5=BA=8F=E6=95=B0=E7=BB=84=E4=B8=AD=E6=9F=A5=E6=89=BE?= =?UTF-8?q?=E5=85=83=E7=B4=A0=E7=9A=84=E7=AC=AC=E4=B8=80=E4=B8=AA=E5=92=8C?= =?UTF-8?q?=E6=9C=80=E5=90=8E=E4=B8=80=E4=B8=AA=E4=BD=8D=E7=BD=AE=20Go?= =?UTF-8?q?=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...00\344\270\252\344\275\215\347\275\256.md" | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git "a/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" "b/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" index 2b96e41b69..3f9cd747d8 100644 --- "a/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" +++ "b/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" @@ -389,6 +389,54 @@ class Solution: ### Go ```go +func searchRange(nums []int, target int) []int { + leftBorder := searchLeftBorder(nums, target) + rightBorder := searchRightBorder(nums, target) + + if leftBorder == -2 || rightBorder == -2 { // 情况一 + return []int{-1, -1} + } else if rightBorder-leftBorder > 1 { // 情况三 + return []int{leftBorder + 1, rightBorder - 1} + } else { // 情况二 + return []int{-1, -1} + } +} + +func searchLeftBorder(nums []int, target int) int { + left, right := 0, len(nums)-1 + leftBorder := -2 // 记录一下leftBorder没有被赋值的情况 + for left <= right { + middle := (left + right) / 2 + if target == nums[middle] { + right = middle - 1 + // 左边界leftBorder更新 + leftBorder = right + } else if target > nums[middle] { + left = middle + 1 + } else { + right = middle - 1 + } + } + return leftBorder +} + +func searchRightBorder(nums []int, target int) int { + left, right := 0, len(nums)-1 + rightBorder := -2 // 记录一下rightBorder没有被赋值的情况 + for left <= right { + middle := (left + right) / 2 + if target == nums[middle] { + left = middle + 1 + // 右边界rightBorder更新 + rightBorder = left + } else if target > nums[middle] { + left = middle + 1 + } else { + right = middle - 1 + } + } + return rightBorder +} ``` ### JavaScript From dfa64fa37b9493cfdf41a431d06da3565e86b1c5 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Tue, 11 Jan 2022 13:59:52 +0800 Subject: [PATCH 0232/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880024.?= =?UTF-8?q?=E4=B8=A4=E4=B8=A4=E4=BA=A4=E6=8D=A2=E9=93=BE=E8=A1=A8=E4=B8=AD?= =?UTF-8?q?=E7=9A=84=E8=8A=82=E7=82=B9.md=EF=BC=89=EF=BC=9A=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...55\347\232\204\350\212\202\347\202\271.md" | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git "a/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" "b/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" index 01abc7b4fe..bf1fd5e19d 100644 --- "a/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" +++ "b/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" @@ -250,6 +250,38 @@ var swapPairs = function (head) { }; ``` +TypeScript: + +```typescript +function swapPairs(head: ListNode | null): ListNode | null { + /** + * 初始状态: + * curNode -> node1 -> node2 -> tmepNode + * 转换过程: + * curNode -> node2 + * curNode -> node2 -> node1 + * curNode -> node2 -> node1 -> tempNode + * curNode = node1 + */ + let retNode: ListNode | null = new ListNode(0, head), + curNode: ListNode | null = retNode, + node1: ListNode | null = null, + node2: ListNode | null = null, + tempNode: ListNode | null = null; + + while (curNode && curNode.next && curNode.next.next) { + node1 = curNode.next; + node2 = curNode.next.next; + tempNode = node2.next; + curNode.next = node2; + node2.next = node1; + node1.next = tempNode; + curNode = node1; + } + return retNode.next; +}; +``` + Kotlin: ```kotlin From bc710f263f477d633798c9b357ce7f4178baddbf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9E=81=E5=AE=A2=E5=AD=A6=E4=BC=9F?= Date: Tue, 11 Jan 2022 14:45:40 +0800 Subject: [PATCH 0233/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20104.=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?=20Swift=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...00\345\244\247\346\267\261\345\272\246.md" | 77 +++++++++++++++++++ 1 file changed, 77 insertions(+) diff --git "a/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" "b/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" index 85b41548b5..7038598b1f 100644 --- "a/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" +++ "b/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" @@ -653,5 +653,82 @@ int maxDepth(struct TreeNode* root){ } ``` +## Swift + +>二叉树最大深度 +```swift +// 递归 - 后序 +func maxDepth1(_ root: TreeNode?) -> Int { + return _maxDepth1(root) +} +func _maxDepth1(_ root: TreeNode?) -> Int { + if root == nil { + return 0 + } + let leftDepth = _maxDepth1(root!.left) + let rightDepth = _maxDepth1(root!.right) + return 1 + max(leftDepth, rightDepth) +} + +// 层序 +func maxDepth(_ root: TreeNode?) -> Int { + guard let root = root else { + return 0 + } + var queue = [TreeNode]() + queue.append(root) + var res: Int = 0 + while !queue.isEmpty { + res += 1 + for _ in 0 ..< queue.count { + let node = queue.removeFirst() + if let left = node.left { + queue.append(left) + } + if let right = node.right { + queue.append(right) + } + } + } + return res +} +``` + +>N叉树最大深度 +```swift +// 递归 +func maxDepth(_ root: Node?) -> Int { + guard let root = root else { + return 0 + } + var depth = 0 + for node in root.children { + depth = max(depth, maxDepth(node)) + } + return depth + 1 +} + +// 迭代-层序遍历 +func maxDepth1(_ root: Node?) -> Int { + guard let root = root else { + return 0 + } + var depth = 0 + var queue = [Node]() + queue.append(root) + while !queue.isEmpty { + let size = queue.count + depth += 1 + for _ in 0 ..< size { + let node = queue.removeFirst() + for child in node.children { + queue.append(child) + } + } + } + return depth +} +``` + -----------------------
From 0d2aacb400b106a0c1b3b72c769c7920951f5d05 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Tue, 11 Jan 2022 18:58:28 +0800 Subject: [PATCH 0234/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880019.?= =?UTF-8?q?=E5=88=A0=E9=99=A4=E9=93=BE=E8=A1=A8=E7=9A=84=E5=80=92=E6=95=B0?= =?UTF-8?q?=E7=AC=ACN=E4=B8=AA=E8=8A=82=E7=82=B9.md=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...4N\344\270\252\350\212\202\347\202\271.md" | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git "a/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" "b/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" index e041937f87..87ee6b121b 100644 --- "a/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" +++ "b/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" @@ -181,7 +181,27 @@ var removeNthFromEnd = function(head, n) { return ret.next; }; ``` +TypeScript: + +```typescript +function removeNthFromEnd(head: ListNode | null, n: number): ListNode | null { + let newHead: ListNode | null = new ListNode(0, head); + let slowNode: ListNode | null = newHead, + fastNode: ListNode | null = newHead; + for (let i = 0; i < n; i++) { + fastNode = fastNode.next; + } + while (fastNode.next) { + fastNode = fastNode.next; + slowNode = slowNode.next; + } + slowNode.next = slowNode.next.next; + return newHead.next; +}; +``` + Kotlin: + ```Kotlin fun removeNthFromEnd(head: ListNode?, n: Int): ListNode? { val pre = ListNode(0).apply { From 5b0b3daf2e65f88de0566aef47d74fa1a8b6aef2 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Tue, 11 Jan 2022 19:02:49 +0800 Subject: [PATCH 0235/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0(0019.=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.md)=EF=BC=9Atypescript=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E5=A2=9E=E5=8A=A0=E6=96=B0=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...4N\344\270\252\350\212\202\347\202\271.md" | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git "a/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" "b/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" index 87ee6b121b..813e9b02fa 100644 --- "a/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" +++ "b/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" @@ -183,6 +183,8 @@ var removeNthFromEnd = function(head, n) { ``` TypeScript: +版本一(快慢指针法): + ```typescript function removeNthFromEnd(head: ListNode | null, n: number): ListNode | null { let newHead: ListNode | null = new ListNode(0, head); @@ -200,6 +202,48 @@ function removeNthFromEnd(head: ListNode | null, n: number): ListNode | null { }; ``` +版本二(计算节点总数法): + +```typescript +function removeNthFromEnd(head: ListNode | null, n: number): ListNode | null { + let curNode: ListNode | null = head; + let listSize: number = 0; + while (curNode) { + curNode = curNode.next; + listSize++; + } + if (listSize === n) { + head = head.next; + } else { + curNode = head; + for (let i = 0; i < listSize - n - 1; i++) { + curNode = curNode.next; + } + curNode.next = curNode.next.next; + } + return head; +}; +``` + +版本三(递归倒退n法): + +```typescript +function removeNthFromEnd(head: ListNode | null, n: number): ListNode | null { + let newHead: ListNode | null = new ListNode(0, head); + let cnt = 0; + function recur(node) { + if (node === null) return; + recur(node.next); + cnt++; + if (cnt === n + 1) { + node.next = node.next.next; + } + } + recur(newHead); + return newHead.next; +}; +``` + Kotlin: ```Kotlin From 4a611bbdd9884424fad04710e380f6549310cdd4 Mon Sep 17 00:00:00 2001 From: leeeeeeewii <54872662+leeeeeeewii@users.noreply.github.com> Date: Tue, 11 Jan 2022 19:07:15 +0800 Subject: [PATCH 0236/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=2034.=20=E5=9C=A8?= =?UTF-8?q?=E6=8E=92=E5=BA=8F=E6=95=B0=E7=BB=84=E4=B8=AD=E6=9F=A5=E6=89=BE?= =?UTF-8?q?=E5=85=83=E7=B4=A0=E7=9A=84=E7=AC=AC=E4=B8=80=E4=B8=AA=E5=92=8C?= =?UTF-8?q?=E6=9C=80=E5=90=8E=E4=B8=80=E4=B8=AA=E4=BD=8D=E7=BD=AE=20Go?= =?UTF-8?q?=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...00\344\270\252\344\275\215\347\275\256.md" | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git "a/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" "b/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" index 2b96e41b69..2ae8186ab2 100644 --- "a/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" +++ "b/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" @@ -389,6 +389,50 @@ class Solution: ### Go ```go +func searchRange(nums []int, target int) []int { + leftBorder := getLeft(nums, target) + rightBorder := getRight(nums, target) + // 情况一 + if leftBorder == -2 || rightBorder == -2 { + return []int{-1, -1} + } + // 情况三 + if rightBorder - leftBorder > 1 { + return []int{leftBorder + 1, rightBorder - 1} + } + // 情况二 + return []int{-1, -1} +} + +func getLeft(nums []int, target int) int { + left, right := 0, len(nums)-1 + border := -2 // 记录border没有被赋值的情况;这里不能赋值-1,target = num[0]时,会无法区分情况一和情况二 + for left <= right { // []闭区间 + mid := left + ((right - left) >> 1) + if nums[mid] >= target { // 找到第一个等于target的位置 + right = mid - 1 + border = right + } else { + left = mid + 1 + } + } + return border +} + +func getRight(nums []int, target int) int { + left, right := 0, len(nums) - 1 + border := -2 + for left <= right { + mid := left + ((right - left) >> 1) + if nums[mid] > target { + right = mid - 1 + } else { // 找到第一个大于target的位置 + left = mid + 1 + border = left + } + } + return border +} ``` ### JavaScript From a30d23871841797548b87ab1cc09ceda7be19bca Mon Sep 17 00:00:00 2001 From: leeeeeeewii <54872662+leeeeeeewii@users.noreply.github.com> Date: Wed, 12 Jan 2022 00:29:24 +0800 Subject: [PATCH 0237/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A00283.=E7=A7=BB?= =?UTF-8?q?=E5=8A=A8=E9=9B=B6=20python=E4=B8=8D=E5=90=8C=E6=96=B9=E6=B3=95?= =?UTF-8?q?=EF=BC=8CGo=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...3.\347\247\273\345\212\250\351\233\266.md" | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git "a/problems/0283.\347\247\273\345\212\250\351\233\266.md" "b/problems/0283.\347\247\273\345\212\250\351\233\266.md" index 13b9c26ca9..bb75a69683 100644 --- "a/problems/0283.\347\247\273\345\212\250\351\233\266.md" +++ "b/problems/0283.\347\247\273\345\212\250\351\233\266.md" @@ -89,9 +89,33 @@ Python: for i in range(slow, len(nums)): nums[i] = 0 ``` +交换前后变量,避免补零 +```python + def moveZeroes(self, nums: List[int]) -> None: + slow, fast = 0, 0 + while fast < len(nums): + if nums[fast] != 0: + nums[slow], nums[fast] = nums[fast], nums[slow] + slow += 1 # 保持[0, slow)区间是没有0的 + fast += 1 +``` Go: +```go +func moveZeroes(nums []int) { + slow := 0 + for fast := 0; fast < len(nums); fast ++ { + if nums[fast] != 0 { + temp := nums[slow] + nums[slow] = nums[fast] + nums[fast] = temp + slow++ + } + } +} +``` + JavaScript: ```javascript var moveZeroes = function(nums) { From c93867f0700e455615ca31b564253e1a8f00c603 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, 12 Jan 2022 12:54:12 +0800 Subject: [PATCH 0238/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20111.=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?=20Swift=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...00\345\260\217\346\267\261\345\272\246.md" | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git "a/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" "b/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" index fc93d91808..a439322a9c 100644 --- "a/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" +++ "b/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" @@ -404,8 +404,51 @@ var minDepth = function(root) { }; ``` +## Swift +> 递归 +```Swift +func minDepth(_ root: TreeNode?) -> Int { + guard let root = root else { + return 0 + } + if root.left == nil && root.right != nil { + return 1 + minDepth(root.right) + } + if root.left != nil && root.right == nil { + return 1 + minDepth(root.left) + } + return 1 + min(minDepth(root.left), minDepth(root.right)) +} +``` +> 迭代 +```Swift +func minDepth(_ root: TreeNode?) -> Int { + guard let root = root else { + return 0 + } + var res = 0 + var queue = [TreeNode]() + queue.append(root) + while !queue.isEmpty { + res += 1 + for _ in 0 ..< queue.count { + let node = queue.removeFirst() + if node.left == nil && node.right == nil { + return res + } + if let left = node.left { + queue.append(left) + } + if let right = node.right { + queue.append(right) + } + } + } + return res +} +``` -----------------------
From ba8e46f241effbb7916bbe777d51c35ad529b4f1 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Wed, 12 Jan 2022 14:32:40 +0800 Subject: [PATCH 0239/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=88=E9=9D=A2?= =?UTF-8?q?=E8=AF=95=E9=A2=9802.07.=E9=93=BE=E8=A1=A8=E7=9B=B8=E4=BA=A4.md?= =?UTF-8?q?=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...76\350\241\250\347\233\270\344\272\244.md" | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git "a/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" "b/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" index e8198aa079..dd91f0696e 100644 --- "a/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" +++ "b/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" @@ -239,6 +239,43 @@ var getIntersectionNode = function(headA, headB) { }; ``` +TypeScript: + +```typescript +function getIntersectionNode(headA: ListNode | null, headB: ListNode | null): ListNode | null { + let sizeA: number = 0, + sizeB: number = 0; + let curA: ListNode | null = headA, + curB: ListNode | null = headB; + while (curA) { + sizeA++; + curA = curA.next; + } + while (curB) { + sizeB++; + curB = curB.next; + } + curA = headA; + curB = headB; + if (sizeA < sizeB) { + [sizeA, sizeB] = [sizeB, sizeA]; + [curA, curB] = [curB, curA]; + } + let gap = sizeA - sizeB; + while (gap-- && curA) { + curA = curA.next; + } + while (curA && curB) { + if (curA === curB) { + return curA; + } + curA = curA.next; + curB = curB.next; + } + return null; +}; +``` + C: ```c From e2ee3ea4501f75818d346b4613a4c3ab27c754ab Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Wed, 12 Jan 2022 16:25:53 +0800 Subject: [PATCH 0240/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880142.?= =?UTF-8?q?=E7=8E=AF=E5=BD=A2=E9=93=BE=E8=A1=A8II.md=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\345\275\242\351\223\276\350\241\250II.md" | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git "a/problems/0142.\347\216\257\345\275\242\351\223\276\350\241\250II.md" "b/problems/0142.\347\216\257\345\275\242\351\223\276\350\241\250II.md" index dfe042b857..e8ca950dbb 100644 --- "a/problems/0142.\347\216\257\345\275\242\351\223\276\350\241\250II.md" +++ "b/problems/0142.\347\216\257\345\275\242\351\223\276\350\241\250II.md" @@ -294,7 +294,30 @@ var detectCycle = function(head) { }; ``` +TypeScript: + +```typescript +function detectCycle(head: ListNode | null): ListNode | null { + let slowNode: ListNode | null = head, + fastNode: ListNode | null = head; + while (fastNode !== null && fastNode.next !== null) { + slowNode = (slowNode as ListNode).next; + fastNode = fastNode.next.next; + if (slowNode === fastNode) { + slowNode = head; + while (slowNode !== fastNode) { + slowNode = (slowNode as ListNode).next; + fastNode = (fastNode as ListNode).next; + } + return slowNode; + } + } + return null; +}; +``` + Swift: + ```swift class Solution { func detectCycle(_ head: ListNode?) -> ListNode? { From 21fc5cd17bba8d75d22a56a832c19958610b28b2 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Wed, 12 Jan 2022 18:21:08 +0800 Subject: [PATCH 0241/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880242.?= =?UTF-8?q?=E6=9C=89=E6=95=88=E7=9A=84=E5=AD=97=E6=AF=8D=E5=BC=82=E4=BD=8D?= =?UTF-8?q?=E8=AF=8D.md=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript?= =?UTF-8?q?=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...7\215\345\274\202\344\275\215\350\257\215.md" | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git "a/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" "b/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" index cdcf39ce7b..52f8e66739 100644 --- "a/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" +++ "b/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" @@ -214,7 +214,23 @@ var isAnagram = function(s, t) { }; ``` +TypeScript: + +```typescript +function isAnagram(s: string, t: string): boolean { + if (s.length !== t.length) return false; + let helperArr: number[] = new Array(26).fill(0); + let pivot: number = 'a'.charCodeAt(0); + for (let i = 0, length = s.length; i < length; i++) { + helperArr[s.charCodeAt(i) - pivot]++; + helperArr[t.charCodeAt(i) - pivot]--; + } + return helperArr.every(i => i === 0); +}; +``` + Swift: + ```Swift func isAnagram(_ s: String, _ t: String) -> Bool { if s.count != t.count { From 014dbf0f79d09fcf46981923f62cf2e879961905 Mon Sep 17 00:00:00 2001 From: Guanzhong Pan Date: Wed, 12 Jan 2022 15:44:55 +0000 Subject: [PATCH 0242/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200509.=E6=96=90?= =?UTF-8?q?=E6=B3=A2=E9=82=A3=E5=A5=91=E6=95=B0.md=20C=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 --- ...42\351\202\243\345\245\221\346\225\260.md" | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git "a/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" "b/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" index d8020d8345..c6ce76c0cd 100644 --- "a/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" +++ "b/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" @@ -245,6 +245,38 @@ var fib = function(n) { }; ``` +### C +动态规划: +```c +int fib(int n){ + //当n <= 1时,返回n + if(n <= 1) + return n; + //动态开辟一个int数组,大小为n+1 + int *dp = (int *)malloc(sizeof(int) * (n + 1)); + //设置0号位为0,1号为为1 + dp[0] = 0; + dp[1] = 1; + + //从前向后遍历数组(i=2; i <= n; ++i),下标为n时的元素为dp[i-1] + dp[i-2] + int i; + for(i = 2; i <= n; ++i) { + dp[i] = dp[i - 1] + dp[i - 2]; + } + return dp[n]; +} +``` + +递归实现: +```c +int fib(int n){ + //若n小于等于1,返回n + if(n <= 1) + return n; + //否则返回fib(n-1) + fib(n-2) + return fib(n-1) + fib(n-2); +} +``` ----------------------- From 165fd427339ced15bc7b4e812d5c18f52638cb2f Mon Sep 17 00:00:00 2001 From: Guanzhong Pan Date: Wed, 12 Jan 2022 15:59:27 +0000 Subject: [PATCH 0243/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200070.=E7=88=AC?= =?UTF-8?q?=E6=A5=BC=E6=A2=AF.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 --- ...0.\347\210\254\346\245\274\346\242\257.md" | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git "a/problems/0070.\347\210\254\346\245\274\346\242\257.md" "b/problems/0070.\347\210\254\346\245\274\346\242\257.md" index 97db670aae..7f47a991e8 100644 --- "a/problems/0070.\347\210\254\346\245\274\346\242\257.md" +++ "b/problems/0070.\347\210\254\346\245\274\346\242\257.md" @@ -296,6 +296,48 @@ var climbStairs = function(n) { }; ``` +### C +```c +int climbStairs(int n){ + //若n<=2,返回n + if(n <= 2) + return n; + //初始化dp数组,数组大小为n+1 + int *dp = (int *)malloc(sizeof(int) * (n + 1)); + dp[0] = 0, dp[1] = 1, dp[2] = 2; + + //从前向后遍历数组,dp[i] = dp[i-1] + dp[i-2] + int i; + for(i = 3; i <= n; ++i) { + dp[i] = dp[i - 1] + dp[i - 2]; + } + //返回dp[n] + return dp[n]; +} +``` + +优化空间复杂度: +```c +int climbStairs(int n){ + //若n<=2,返回n + if(n <= 2) + return n; + //初始化dp数组,数组大小为3 + int *dp = (int *)malloc(sizeof(int) * 3); + dp[1] = 1, dp[2] = 2; + + //只记录前面两个台阶的状态 + int i; + for(i = 3; i <= n; ++i) { + int sum = dp[1] + dp[2]; + dp[1] = dp[2]; + dp[2] = sum; + } + //返回dp[2] + return dp[2]; +} +``` + -----------------------
From 518b48dbb407b706dc4a0296bf8b3621e52fdf27 Mon Sep 17 00:00:00 2001 From: Guanzhong Pan Date: Wed, 12 Jan 2022 16:19:37 +0000 Subject: [PATCH 0244/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200746.=E4=BD=BF?= =?UTF-8?q?=E7=94=A8=E6=9C=80=E5=B0=8F=E8=8A=B1=E8=B4=B9=E7=88=AC=E6=A5=BC?= =?UTF-8?q?=E6=A2=AF.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 --- ...4\271\347\210\254\346\245\274\346\242\257.md" | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git "a/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" "b/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" index a146cc8b51..91cd2c8b38 100644 --- "a/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" +++ "b/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" @@ -266,5 +266,21 @@ var minCostClimbingStairs = function(cost) { }; ``` +### C +```c +int minCostClimbingStairs(int* cost, int costSize){ + //开辟dp数组,大小为costSize + int *dp = (int *)malloc(sizeof(int) * costSize); + //初始化dp[0] = cost[0], dp[1] = cost[1] + dp[0] = cost[0], dp[1] = cost[1]; + + int i; + for(i = 2; i < costSize; ++i) { + dp[i] = (dp[i-1] < dp[i-2] ? dp[i-1] : dp[i-2]) + cost[i]; + } + //选出倒数2层楼梯中较小的 + return dp[i-1] < dp[i-2] ? dp[i-1] : dp[i-2]; +} +``` -----------------------
From c6c39724089a07c5cdd809cca27dd46047fc998f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9E=81=E5=AE=A2=E5=AD=A6=E4=BC=9F?= Date: Thu, 13 Jan 2022 14:08:26 +0800 Subject: [PATCH 0245/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20222.=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=20Swift=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...02\347\202\271\344\270\252\346\225\260.md" | 68 +++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git "a/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" "b/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" index 754a6094ea..8d38bace93 100644 --- "a/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" +++ "b/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" @@ -522,5 +522,73 @@ int countNodes(struct TreeNode* root){ } ``` +## Swift: + +> 递归 +```swift +func countNodes(_ root: TreeNode?) -> Int { + return _countNodes(root) +} +func _countNodes(_ root: TreeNode?) -> Int { + guard let root = root else { + return 0 + } + let leftCount = _countNodes(root.left) + let rightCount = _countNodes(root.right) + return 1 + leftCount + rightCount +} +``` + +> 层序遍历 +```Swift +func countNodes(_ root: TreeNode?) -> Int { + guard let root = root else { + return 0 + } + var res = 0 + var queue = [TreeNode]() + queue.append(root) + while !queue.isEmpty { + let size = queue.count + for _ in 0 ..< size { + let node = queue.removeFirst() + res += 1 + if let left = node.left { + queue.append(left) + } + if let right = node.right { + queue.append(right) + } + } + } + return res +} +``` + +> 利用完全二叉树性质 +```Swift +func countNodes(_ root: TreeNode?) -> Int { + guard let root = root else { + return 0 + } + var leftNode = root.left + var rightNode = root.right + var leftDepth = 0 + var rightDepth = 0 + while leftNode != nil { + leftNode = leftNode!.left + leftDepth += 1 + } + while rightNode != nil { + rightNode = rightNode!.right + rightDepth += 1 + } + if leftDepth == rightDepth { + return (2 << leftDepth) - 1 + } + return countNodes(root.left) + countNodes(root.right) + 1 +} +``` + -----------------------
From 0b643bd27d71a2472ee1cf0bfa16cd7f99df0a4b Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Thu, 13 Jan 2022 15:00:39 +0800 Subject: [PATCH 0246/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880349.?= =?UTF-8?q?=E4=B8=A4=E4=B8=AA=E6=95=B0=E7=BB=84=E7=9A=84=E4=BA=A4=E9=9B=86?= =?UTF-8?q?.md=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...04\347\232\204\344\272\244\351\233\206.md" | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git "a/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" "b/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" index 812c4489a9..92342f178d 100644 --- "a/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" +++ "b/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" @@ -190,7 +190,33 @@ var intersection = function(nums1, nums2) { }; ``` +TypeScript: + +版本一(正常解法): + +```typescript +function intersection(nums1: number[], nums2: number[]): number[] { + let resSet: Set = new Set(), + nums1Set: Set = new Set(nums1); + for (let i of nums2) { + if (nums1Set.has(i)) { + resSet.add(i); + } + } + return Array.from(resSet); +}; +``` + +版本二(秀操作): + +```typescript +function intersection(nums1: number[], nums2: number[]): number[] { + return Array.from(new Set(nums1.filter(i => nums2.includes(i)))) +}; +``` + Swift: + ```swift func intersection(_ nums1: [Int], _ nums2: [Int]) -> [Int] { var set1 = Set() From 391410a383f452c292a045e068b138295d4af7da Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Thu, 13 Jan 2022 15:29:20 +0800 Subject: [PATCH 0247/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A00202.=E5=BF=AB?= =?UTF-8?q?=E4=B9=90=E6=95=B0.md=E5=A2=9E=E5=8A=A0typescript=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...2.\345\277\253\344\271\220\346\225\260.md" | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git "a/problems/0202.\345\277\253\344\271\220\346\225\260.md" "b/problems/0202.\345\277\253\344\271\220\346\225\260.md" index 2d678151ee..f0a46a40d2 100644 --- "a/problems/0202.\345\277\253\344\271\220\346\225\260.md" +++ "b/problems/0202.\345\277\253\344\271\220\346\225\260.md" @@ -232,7 +232,27 @@ var isHappy = function(n) { }; ``` +TypeScript: + +```typescript +function isHappy(n: number): boolean { + // Utils + // 计算val各位的平方和 + function calcSum(val: number): number { + return String(val).split("").reduce((pre, cur) => (pre + Number(cur) * Number(cur)), 0); + } + + let storeSet: Set = new Set(); + while (n !== 1 && !storeSet.has(n)) { + storeSet.add(n); + n = calcSum(n); + } + return n === 1; +}; +``` + Swift: + ```swift // number 每个位置上的数字的平方和 func getSum(_ number: Int) -> Int { From 6586f9a8299138d0e7fcb6135f68c75d67a36bdc Mon Sep 17 00:00:00 2001 From: weiting-cn <2254912@qq.com> Date: Thu, 13 Jan 2022 17:06:28 +0800 Subject: [PATCH 0248/3019] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=AE=8C=E5=85=A8?= =?UTF-8?q?=E8=83=8C=E5=8C=85=E9=81=8D=E5=8E=86=E8=83=8C=E5=8C=85=E5=AE=B9?= =?UTF-8?q?=E9=87=8F=E6=97=B6=E7=9A=84=E8=BE=B9=E7=95=8C=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" index 3cc8557c8b..f79310b8be 100644 --- "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" +++ "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" @@ -52,7 +52,7 @@ for(int i = 0; i < weight.size(); i++) { // 遍历物品 ```CPP // 先遍历物品,再遍历背包 for(int i = 0; i < weight.size(); i++) { // 遍历物品 - for(int j = weight[i]; j < bagWeight ; j++) { // 遍历背包容量 + for(int j = weight[i]; j <= bagWeight ; j++) { // 遍历背包容量 dp[j] = max(dp[j], dp[j - weight[i]] + value[i]); } From 97a0b8d46b9ffaf1174cde3ea01d2d2afda6a9fc Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Thu, 13 Jan 2022 19:18:32 +0800 Subject: [PATCH 0249/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880001.?= =?UTF-8?q?=E4=B8=A4=E6=95=B0=E4=B9=8B=E5=92=8C.md=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...244\346\225\260\344\271\213\345\222\214.md" | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git "a/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" "b/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" index 37c95736a9..b337d1e2fb 100644 --- "a/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" @@ -186,6 +186,24 @@ var twoSum = function (nums, target) { }; ``` +TypeScript: + +```typescript +function twoSum(nums: number[], target: number): number[] { + let helperMap: Map = new Map(); + let index: number | undefined; + let resArr: number[] = []; + for (let i = 0, length = nums.length; i < length; i++) { + index = helperMap.get(target - nums[i]); + if (index !== undefined) { + resArr = [i, index]; + } + helperMap.set(nums[i], i); + } + return resArr; +}; +``` + php ```php From ed2f56fa28817edbfccd3d3bc38f07eac71a5f2b Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Thu, 13 Jan 2022 20:32:18 +0800 Subject: [PATCH 0250/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880454.?= =?UTF-8?q?=E5=9B=9B=E6=95=B0=E7=9B=B8=E5=8A=A0II.md=EF=BC=89:=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\346\225\260\347\233\270\345\212\240II.md" | 27 ++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git "a/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" "b/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" index 6853354c49..352f693bc6 100644 --- "a/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" +++ "b/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" @@ -139,7 +139,7 @@ class Solution(object): return count -``` +``` Go: ```go @@ -192,8 +192,33 @@ var fourSumCount = function(nums1, nums2, nums3, nums4) { }; ``` +TypeScript: + +```typescript +function fourSumCount(nums1: number[], nums2: number[], nums3: number[], nums4: number[]): number { + let helperMap: Map = new Map(); + let resNum: number = 0; + let tempVal: number | undefined; + for (let i of nums1) { + for (let j of nums2) { + tempVal = helperMap.get(i + j); + helperMap.set(i + j, tempVal ? tempVal + 1 : 1); + } + } + for (let k of nums3) { + for (let l of nums4) { + tempVal = helperMap.get(0 - (k + l)); + if (tempVal) { + resNum += tempVal; + } + } + } + return resNum; +}; +``` PHP: + ```php class Solution { /** From 3d36ecc092325ce614404d5cc1b69337153d1187 Mon Sep 17 00:00:00 2001 From: YiChih Wang Date: Thu, 13 Jan 2022 21:55:14 +0800 Subject: [PATCH 0251/3019] =?UTF-8?q?0452.=E7=94=A8=E6=9C=80=E5=B0=91?= =?UTF-8?q?=E6=95=B0=E9=87=8F=E7=9A=84=E7=AE=AD=E5=BC=95=E7=88=86=E6=B0=94?= =?UTF-8?q?=E7=90=83=20Rust=20=E8=AA=9E=E8=A8=80=E5=AF=A6=E7=8F=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...25\347\210\206\346\260\224\347\220\203.md" | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git "a/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" "b/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" index ebfe648f09..33bbad5538 100644 --- "a/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" +++ "b/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" @@ -239,5 +239,30 @@ int findMinArrowShots(int** points, int pointsSize, int* pointsColSize){ } ``` +### Rust +```Rust +use std::cmp; +impl Solution { + pub fn find_min_arrow_shots(mut points: Vec>) -> i32 { + if points.is_empty() { + return 0; + } + points.sort_by_key(|point| point[0]); + + let size = points.len(); + let mut count = 1; + + for i in 1..size { + if points[i][0] > points[i-1][1] { + count += 1; + } else { + points[i][1] = cmp::min(points[i][1], points[i-1][1]); + } + } + + return count; + } +} +``` -----------------------
From 0c184a5ee6e3f52d32e23a0100a5215512f8517b Mon Sep 17 00:00:00 2001 From: Guanzhong Pan Date: Thu, 13 Jan 2022 14:04:08 +0000 Subject: [PATCH 0252/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200062.=E4=B8=8D?= =?UTF-8?q?=E5=90=8C=E8=B7=AF=E5=BE=84.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 --- ...15\345\220\214\350\267\257\345\276\204.md" | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git "a/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" "b/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" index e209abb176..efa85a03ac 100644 --- "a/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" +++ "b/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" @@ -347,6 +347,42 @@ var uniquePaths = function(m, n) { }; ``` +### C +```c +//初始化dp数组 +int **initDP(int m, int n) { + //动态开辟dp数组 + int **dp = (int**)malloc(sizeof(int *) * m); + int i, j; + for(i = 0; i < m; ++i) { + dp[i] = (int *)malloc(sizeof(int) * n); + } + + //从0,0到i,0只有一种走法,所以dp[i][0]都是1,同理dp[0][j]也是1 + for(i = 0; i < m; ++i) + dp[i][0] = 1; + for(j = 0; j < n; ++j) + dp[0][j] = 1; + return dp; +} + +int uniquePaths(int m, int n){ + //dp数组,dp[i][j]代表从dp[0][0]到dp[i][j]有几种走法 + int **dp = initDP(m, n); + + int i, j; + //到达dp[i][j]只能从dp[i-1][j]和dp[i][j-1]出发 + //dp[i][j] = dp[i-1][j] + dp[i][j-1] + for(i = 1; i < m; ++i) { + for(j = 1; j < n; ++j) { + dp[i][j] = dp[i-1][j] + dp[i][j-1]; + } + } + int result = dp[m-1][n-1]; + free(dp); + return result; +} +``` -----------------------
From 7b785ab004eaa2635980a96ee543cbe65f4852de Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Thu, 13 Jan 2022 22:14:12 +0800 Subject: [PATCH 0253/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880383.?= =?UTF-8?q?=E8=B5=8E=E9=87=91=E4=BF=A1.md=EF=BC=89=EF=BC=9A=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...3.\350\265\216\351\207\221\344\277\241.md" | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git "a/problems/0383.\350\265\216\351\207\221\344\277\241.md" "b/problems/0383.\350\265\216\351\207\221\344\277\241.md" index 650f2a9931..31e19b1005 100644 --- "a/problems/0383.\350\265\216\351\207\221\344\277\241.md" +++ "b/problems/0383.\350\265\216\351\207\221\344\277\241.md" @@ -264,6 +264,27 @@ var canConstruct = function(ransomNote, magazine) { }; ``` +TypeScript: + +```typescript +function canConstruct(ransomNote: string, magazine: string): boolean { + let helperArr: number[] = new Array(26).fill(0); + let base: number = 'a'.charCodeAt(0); + let index: number; + for (let i = 0, length = magazine.length; i < length; i++) { + helperArr[magazine[i].charCodeAt(0) - base]++; + } + for (let i = 0, length = ransomNote.length; i < length; i++) { + index = ransomNote[i].charCodeAt(0) - base; + helperArr[index]--; + if (helperArr[index] < 0) { + return false; + } + } + return true; +}; +``` + PHP: ```php From 9d59aab89e5a61f752e67f3c969260a98a95fded Mon Sep 17 00:00:00 2001 From: bqlin Date: Mon, 20 Dec 2021 18:26:34 +0800 Subject: [PATCH 0254/3019] =?UTF-8?q?0028.=E5=AE=9E=E7=8E=B0strStr?= =?UTF-8?q?=EF=BC=9A=E4=BC=98=E5=8C=96=E6=8E=92=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0028.\345\256\236\347\216\260strStr.md" | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git "a/problems/0028.\345\256\236\347\216\260strStr.md" "b/problems/0028.\345\256\236\347\216\260strStr.md" index f0b56719ae..c23f55583a 100644 --- "a/problems/0028.\345\256\236\347\216\260strStr.md" +++ "b/problems/0028.\345\256\236\347\216\260strStr.md" @@ -259,7 +259,7 @@ void getNext(int* next, const string& s) 然后还要对next数组进行初始化赋值,如下: -``` +```cpp int j = -1; next[0] = j; ``` @@ -278,8 +278,8 @@ next[i] 表示 i(包括i)之前最长相等的前后缀长度(其实就是 所以遍历模式串s的循环下标i 要从 1开始,代码如下: -``` -for(int i = 1; i < s.size(); i++) { +```cpp +for (int i = 1; i < s.size(); i++) { ``` 如果 s[i] 与 s[j+1]不相同,也就是遇到 前后缀末尾不相同的情况,就要向前回退。 @@ -292,7 +292,7 @@ next[j]就是记录着j(包括j)之前的子串的相同前后缀的长度 所以,处理前后缀不相同的情况代码如下: -``` +```cpp while (j >= 0 && s[i] != s[j + 1]) { // 前后缀不相同了     j = next[j]; // 向前回退 } @@ -300,7 +300,7 @@ while (j >= 0 && s[i] != s[j + 1]) { // 前后缀不相同了 3. 处理前后缀相同的情况 -如果s[i] 与 s[j + 1] 相同,那么就同时向后移动i 和j 说明找到了相同的前后缀,同时还要将j(前缀的长度)赋给next[i], 因为next[i]要记录相同前后缀的长度。 +如果 s[i] 与 s[j + 1] 相同,那么就同时向后移动i 和j 说明找到了相同的前后缀,同时还要将j(前缀的长度)赋给next[i], 因为next[i]要记录相同前后缀的长度。 代码如下: @@ -346,7 +346,7 @@ void getNext(int* next, const string& s){ i就从0开始,遍历文本串,代码如下: -``` +```cpp for (int i = 0; i < s.size(); i++)  ``` @@ -356,7 +356,7 @@ for (int i = 0; i < s.size(); i++)  代码如下: -``` +```cpp while(j >= 0 && s[i] != t[j + 1]) {     j = next[j]; } @@ -364,7 +364,7 @@ while(j >= 0 && s[i] != t[j + 1]) { 如果 s[i] 与 t[j + 1] 相同,那么i 和 j 同时向后移动, 代码如下: -``` +```cpp if (s[i] == t[j + 1]) {     j++; // i的增加在for循环里 } @@ -376,7 +376,7 @@ if (s[i] == t[j + 1]) { 代码如下: -``` +```cpp if (j == (t.size() - 1) ) {     return (i - t.size() + 1); } From 57af6f6a4b8941e5422c8387ab8591501c5f28f4 Mon Sep 17 00:00:00 2001 From: bqlin Date: Mon, 20 Dec 2021 19:53:51 +0800 Subject: [PATCH 0255/3019] =?UTF-8?q?0027.=E7=A7=BB=E9=99=A4=E5=85=83?= =?UTF-8?q?=E7=B4=A0=EF=BC=9A=E4=BC=98=E5=8C=96=E6=8E=92=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" "b/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" index 99990302e1..d69f2bcfe8 100644 --- "a/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" +++ "b/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" @@ -42,7 +42,7 @@ ![27.移除元素-暴力解法](https://tva1.sinaimg.cn/large/008eGmZEly1gntrc7x9tjg30du09m1ky.gif) -很明显暴力解法的时间复杂度是O(n^2),这道题目暴力解法在leetcode上是可以过的。 +很明显暴力解法的时间复杂度是$O(n^2)$,这道题目暴力解法在leetcode上是可以过的。 代码如下: From 71ada4737a7cc00de5403c43f73a7d6c824eb7b2 Mon Sep 17 00:00:00 2001 From: bqlin Date: Mon, 20 Dec 2021 19:54:34 +0800 Subject: [PATCH 0256/3019] =?UTF-8?q?=E6=A0=88=E4=B8=8E=E9=98=9F=E5=88=97?= =?UTF-8?q?=E7=90=86=E8=AE=BA=E5=9F=BA=E7=A1=80=EF=BC=9A=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E6=8E=92=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...10\227\347\220\206\350\256\272\345\237\272\347\241\200.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/problems/\346\240\210\344\270\216\351\230\237\345\210\227\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\346\240\210\344\270\216\351\230\237\345\210\227\347\220\206\350\256\272\345\237\272\347\241\200.md" index b9811b296b..44fcbdd524 100644 --- "a/problems/\346\240\210\344\270\216\351\230\237\345\210\227\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\346\240\210\344\270\216\351\230\237\345\210\227\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -67,7 +67,7 @@ deque是一个双向队列,只要封住一段,只开通另一端就可以实 我们也可以指定vector为栈的底层实现,初始化语句如下: -``` +```cpp std::stack > third; // 使用vector为底层容器的栈 ``` @@ -77,7 +77,7 @@ std::stack > third; // 使用vector为底层容器的栈 也可以指定list 为起底层实现,初始化queue的语句如下: -``` +```cpp std::queue> third; // 定义以list为底层容器的队列 ``` From 13601e89abdff1a8b196645f647db551d8f4154e Mon Sep 17 00:00:00 2001 From: bqlin Date: Mon, 20 Dec 2021 20:13:03 +0800 Subject: [PATCH 0257/3019] =?UTF-8?q?0225.=E7=94=A8=E9=98=9F=E5=88=97?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E6=A0=88=E3=80=810232.=E7=94=A8=E6=A0=88?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E9=98=9F=E5=88=97=EF=BC=9A=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E6=8E=92=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" | 2 +- ...\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git "a/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" "b/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" index fdb544a6c2..524ca329d2 100644 --- "a/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" +++ "b/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" @@ -46,7 +46,7 @@ 模拟的队列执行语句如下: -``` +```cpp queue.push(1); queue.push(2); queue.pop(); // 注意弹出的操作 diff --git "a/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" "b/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" index 4edba2f201..0e4fce28fb 100644 --- "a/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" +++ "b/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" @@ -21,7 +21,7 @@ empty() -- 返回队列是否为空。 示例: -``` +```cpp MyQueue queue = new MyQueue(); queue.push(1); queue.push(2); From cd4529c8ff7c4570a4541988c1cf3a76e3586150 Mon Sep 17 00:00:00 2001 From: bin3826246 <59920177+bin3826246@users.noreply.github.com> Date: Fri, 14 Jan 2022 19:15:00 +0800 Subject: [PATCH 0258/3019] =?UTF-8?q?Create=20=E9=9D=A2=E8=AF=95=E9=A2=98?= =?UTF-8?q?=2002.07.=20=E8=A7=A3=E6=B3=95=E6=9B=B4=E6=96=B0.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...43\346\263\225\346\233\264\346\226\260.md" | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 "problems/\351\235\242\350\257\225\351\242\230 02.07. \350\247\243\346\263\225\346\233\264\346\226\260.md" diff --git "a/problems/\351\235\242\350\257\225\351\242\230 02.07. \350\247\243\346\263\225\346\233\264\346\226\260.md" "b/problems/\351\235\242\350\257\225\351\242\230 02.07. \350\247\243\346\263\225\346\233\264\346\226\260.md" new file mode 100644 index 0000000000..119f875cf5 --- /dev/null +++ "b/problems/\351\235\242\350\257\225\351\242\230 02.07. \350\247\243\346\263\225\346\233\264\346\226\260.md" @@ -0,0 +1,41 @@ +# 双指针,不计算链表长度 +设置指向headA和headB的指针pa、pb,分别遍历两个链表,每次循环同时更新pa和pb。 +* 当链表A遍历完之后,即pa为空时,将pa指向headB; +* 当链表B遍历完之后,即pa为空时,将pb指向headA; +* 当pa与pb相等时,即指向同一个节点,该节点即为相交起始节点。 +* 若链表不相交,则pa、pb同时为空时退出循环,即如果链表不相交,pa与pb在遍历过全部节点后同时指向结尾空节点,此时退出循环,返回空。 +# 证明思路 +设链表A不相交部分长度为a,链表B不相交部分长度为b,两个链表相交部分长度为c。
+在pa指向链表A时,即pa为空之前,pa经过链表A不相交部分和相交部分,走过的长度为a+c;
+pa指向链表B后,在移动相交节点之前经过链表B不相交部分,走过的长度为b,总合为a+c+b。
+同理,pb走过长度的总合为b+c+a。二者相等,即pa与pb可同时到达相交起始节点。
+该方法可避免计算具体链表长度。 +```cpp +class Solution { +public: + ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) { + //链表为空时,返回空指针 + if(headA == nullptr || headB == nullptr) return nullptr; + ListNode* pa = headA; + ListNode* pb = headB; + //pa与pb在遍历过全部节点后,同时指向结尾空节点时退出循环 + while(pa != nullptr || pb != nullptr){ + //pa为空时,将pa指向headB + if(pa == nullptr){ + pa = headB; + } + //pa为空时,将pb指向headA + if(pb == nullptr){ + pb = headA; + } + //pa == pb时,返回相交起始节点 + if(pa == pb){ + return pa; + } + pa = pa->next; + pb = pb->next; + } + return nullptr; + } +}; +``` From 570022f6666b633891bb9e590488529d5238d254 Mon Sep 17 00:00:00 2001 From: bin3826246 <59920177+bin3826246@users.noreply.github.com> Date: Fri, 14 Jan 2022 19:20:36 +0800 Subject: [PATCH 0259/3019] =?UTF-8?q?=E9=9D=A2=E8=AF=95=E9=A2=9802.07=20?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0cpp=E5=8F=8C=E6=8C=87=E9=92=88=E6=96=B0?= =?UTF-8?q?=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 双指针新解法,不需计算链表长度 --- ... 02.07. \350\247\243\346\263\225\346\233\264\346\226\260.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/\351\235\242\350\257\225\351\242\230 02.07. \350\247\243\346\263\225\346\233\264\346\226\260.md" "b/problems/\351\235\242\350\257\225\351\242\230 02.07. \350\247\243\346\263\225\346\233\264\346\226\260.md" index 119f875cf5..6115d02ee9 100644 --- "a/problems/\351\235\242\350\257\225\351\242\230 02.07. \350\247\243\346\263\225\346\233\264\346\226\260.md" +++ "b/problems/\351\235\242\350\257\225\351\242\230 02.07. \350\247\243\346\263\225\346\233\264\346\226\260.md" @@ -28,7 +28,7 @@ public: if(pb == nullptr){ pb = headA; } - //pa == pb时,返回相交起始节点 + //pa与pb相等时,返回相交起始节点 if(pa == pb){ return pa; } From 2ea72e3e4345e0de2feed93b4a74dd9bbbc25b68 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Fri, 14 Jan 2022 21:59:34 +0800 Subject: [PATCH 0260/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880015.?= =?UTF-8?q?=E4=B8=89=E6=95=B0=E4=B9=8B=E5=92=8C.md=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...11\346\225\260\344\271\213\345\222\214.md" | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git "a/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" "b/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" index c78ab06d3f..8992c5f4d9 100644 --- "a/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" @@ -332,7 +332,43 @@ var threeSum = function(nums) { return res; }; ``` +TypeScript: +```typescript +function threeSum(nums: number[]): number[][] { + nums.sort((a, b) => a - b); + let length = nums.length; + let left: number = 0, + right: number = length - 1; + let resArr: number[][] = []; + for (let i = 0; i < length; i++) { + if (i > 0 && nums[i] === nums[i - 1]) { + continue; + } + left = i + 1; + right = length - 1; + while (left < right) { + let total: number = nums[i] + nums[left] + nums[right]; + if (total === 0) { + resArr.push([nums[i], nums[left], nums[right]]); + left++; + right--; + while (nums[right] === nums[right + 1]) { + right--; + } + while (nums[left] === nums[left - 1]) { + left++; + } + } else if (total < 0) { + left++; + } else { + right--; + } + } + } + return resArr; +}; +``` ruby: ```ruby From 12bf8ae05b176816a21cfd741b2274bfada14aae Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Fri, 14 Jan 2022 22:36:55 +0800 Subject: [PATCH 0261/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880018.?= =?UTF-8?q?=E5=9B=9B=E6=95=B0=E4=B9=8B=E5=92=8C.md=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...33\346\225\260\344\271\213\345\222\214.md" | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git "a/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" "b/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" index b94ebeef8c..dae8636b6d 100644 --- "a/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" @@ -311,7 +311,49 @@ var fourSum = function(nums, target) { }; ``` +TypeScript: + +```typescript +function fourSum(nums: number[], target: number): number[][] { + nums.sort((a, b) => a - b); + let first: number = 0, + second: number, + third: number, + fourth: number; + let length: number = nums.length; + let resArr: number[][] = []; + for (; first < length; first++) { + if (first > 0 && nums[first] === nums[first - 1]) { + continue; + } + for (second = first + 1; second < length; second++) { + if ((second - first) > 1 && nums[second] === nums[second - 1]) { + continue; + } + third = second + 1; + fourth = length - 1; + while (third < fourth) { + let total: number = nums[first] + nums[second] + nums[third] + nums[fourth]; + if (total === target) { + resArr.push([nums[first], nums[second], nums[third], nums[fourth]]); + third++; + fourth--; + while (nums[third] === nums[third - 1]) third++; + while (nums[fourth] === nums[fourth + 1]) fourth--; + } else if (total < target) { + third++; + } else { + fourth--; + } + } + } + } + return resArr; +}; +``` + PHP: + ```php class Solution { /** From d9ffaec8a8e6b630f187ec662917b53d2878aee8 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Sat, 15 Jan 2022 16:32:29 +0800 Subject: [PATCH 0262/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880344.?= =?UTF-8?q?=E5=8F=8D=E8=BD=AC=E5=AD=97=E7=AC=A6=E4=B8=B2.md=EF=BC=89?= =?UTF-8?q?=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...54\345\255\227\347\254\246\344\270\262.md" | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git "a/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" "b/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" index 2831383901..e6a56ca520 100644 --- "a/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" @@ -201,6 +201,27 @@ var reverseString = function(s) { }; ``` +TypeScript: + +```typescript +/** + Do not return anything, modify s in-place instead. + */ +function reverseString(s: string[]): void { + let length: number = s.length; + let left: number = 0, + right: number = length - 1; + let tempStr: string; + while (left < right) { + tempStr = s[left]; + s[left] = s[right]; + s[right] = tempStr; + left++; + right--; + } +}; +``` + Swift: ```swift From 91807bfe9deb35788886786dd1590044dd707a36 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Sat, 15 Jan 2022 17:32:13 +0800 Subject: [PATCH 0263/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0(0541.=E5=8F=8D?= =?UTF-8?q?=E8=BD=AC=E5=AD=97=E7=AC=A6=E4=B8=B2II.md):=20=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\345\255\227\347\254\246\344\270\262II.md" | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git "a/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" "b/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" index fb92b1e49b..775586638a 100644 --- "a/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" +++ "b/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" @@ -252,6 +252,28 @@ var reverseStr = function(s, k) { ``` +TypeScript: + +```typescript +function reverseStr(s: string, k: number): string { + let left: number, right: number; + let arr: string[] = s.split(''); + let temp: string; + for (let i = 0, length = arr.length; i < length; i += 2 * k) { + left = i; + right = (i + k - 1) >= length ? length - 1 : i + k - 1; + while (left < right) { + temp = arr[left]; + arr[left] = arr[right]; + arr[right] = temp; + left++; + right--; + } + } + return arr.join(''); +}; +``` + Swift: ```swift From 3d7ec66e21c511f5cd0440388de9075ac5d45155 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Sat, 15 Jan 2022 17:59:35 +0800 Subject: [PATCH 0264/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=88=E5=89=91?= =?UTF-8?q?=E6=8C=87Offer05.=E6=9B=BF=E6=8D=A2=E7=A9=BA=E6=A0=BC.md?= =?UTF-8?q?=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...77\346\215\242\347\251\272\346\240\274.md" | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git "a/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" "b/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" index d0f382c859..530545fbb9 100644 --- "a/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" +++ "b/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" @@ -298,6 +298,33 @@ javaScript: }; ``` +TypeScript: + +```typescript +function replaceSpace(s: string): string { + let arr: string[] = s.split(''); + let spaceNum: number = 0; + let oldLength: number = arr.length; + for (let i = 0; i < oldLength; i++) { + if (arr[i] === ' ') { + spaceNum++; + } + } + arr.length = oldLength + 2 * spaceNum; + let cur: number = oldLength - 1; + for (let i = arr.length - 1; i >= 0; i--, cur--) { + if (arr[cur] !== ' ') { + arr[i] = arr[cur] + } else { + arr[i] = '0'; + arr[--i] = '2'; + arr[--i] = '%'; + } + } + return arr.join(''); +}; +``` + Swift: ```swift From 4f4a54fa7928a11d33a498310426793daeabab77 Mon Sep 17 00:00:00 2001 From: ArthurP Date: Sun, 16 Jan 2022 09:50:17 +0000 Subject: [PATCH 0265/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200063.=E4=B8=8D?= =?UTF-8?q?=E5=90=8C=E8=B7=AF=E5=BE=84II.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 --- ...\345\220\214\350\267\257\345\276\204II.md" | 54 +++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git "a/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" "b/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" index 490b6b5c95..6f405d6ace 100644 --- "a/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" +++ "b/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" @@ -333,6 +333,60 @@ var uniquePathsWithObstacles = function(obstacleGrid) { }; ``` +C +```c +//初始化dp数组 +int **initDP(int m, int n, int** obstacleGrid) { + int **dp = (int**)malloc(sizeof(int*) * m); + int i, j; + //初始化每一行数组 + for(i = 0; i < m; ++i) { + dp[i] = (int*)malloc(sizeof(int) * n); + } + + //先将第一行第一列设为0 + for(i = 0; i < m; ++i) { + dp[i][0] = 0; + } + for(j = 0; j < n; ++j) { + dp[0][j] = 0; + } + + //若碰到障碍,之后的都走不了。退出循环 + for(i = 0; i < m; ++i) { + if(obstacleGrid[i][0]) { + break; + } + dp[i][0] = 1; + } + for(j = 0; j < n; ++j) { + if(obstacleGrid[0][j]) + break; + dp[0][j] = 1; + } + return dp; +} + +int uniquePathsWithObstacles(int** obstacleGrid, int obstacleGridSize, int* obstacleGridColSize){ + int m = obstacleGridSize, n = *obstacleGridColSize; + //初始化dp数组 + int **dp = initDP(m, n, obstacleGrid); + + int i, j; + for(i = 1; i < m; ++i) { + for(j = 1; j < n; ++j) { + //若当前i,j位置有障碍 + if(obstacleGrid[i][j]) + //路线不同 + dp[i][j] = 0; + else + dp[i][j] = dp[i-1][j] + dp[i][j-1]; + } + } + //返回最后终点的路径个数 + return dp[m-1][n-1]; +} +``` -----------------------
From d164c86ac418de56e18ab6edb7578e896d5cb892 Mon Sep 17 00:00:00 2001 From: zhangjiong Date: Mon, 17 Jan 2022 01:23:41 +0800 Subject: [PATCH 0266/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200344.=E5=8F=8D?= =?UTF-8?q?=E8=BD=AC=E5=AD=97=E7=AC=A6=E4=B8=B2=20C#=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\275\254\345\255\227\347\254\246\344\270\262.md" | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git "a/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" "b/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" index 9176c9159d..920cd86cbc 100644 --- "a/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" @@ -232,6 +232,19 @@ void reverseString(char* s, int sSize){ } ``` +C#: +```csharp +public class Solution +{ + public void ReverseString(char[] s) + { + for (int i = 0, j = s.Length - 1; i < j; i++, j--) + { + (s[i], s[j]) = (s[j], s[i]); + } + } +} +``` -----------------------
From 1f00889410d44ab517b7cdd76ace801b18ed7361 Mon Sep 17 00:00:00 2001 From: zhangjiong Date: Mon, 17 Jan 2022 01:30:46 +0800 Subject: [PATCH 0267/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200541.=E5=8F=8D?= =?UTF-8?q?=E8=BD=AC=E5=AD=97=E7=AC=A6=E4=B8=B2II=20C#=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...4\345\255\227\347\254\246\344\270\262II.md" | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git "a/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" "b/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" index fb92b1e49b..1338cd0d55 100644 --- "a/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" +++ "b/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" @@ -272,9 +272,21 @@ func reverseStr(_ s: String, _ k: Int) -> String { } ``` - - - +C#: +```csharp +public class Solution +{ + public string ReverseStr(string s, int k) + { + Span span = s.ToCharArray().AsSpan(); + for (int i = 0; i < span.Length; i += 2 * k) + { + span[i + k < span.Length ? i..(i + k) : i..].Reverse(); + } + return span.ToString(); + } +} +``` -----------------------
From b1a0fbad2b4799416bd45a297f67df93eca4612b Mon Sep 17 00:00:00 2001 From: zhangjiong Date: Mon, 17 Jan 2022 11:53:23 +0800 Subject: [PATCH 0268/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200015.=E4=B8=89?= =?UTF-8?q?=E6=95=B0=E4=B9=8B=E5=92=8C=20C#=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...11\346\225\260\344\271\213\345\222\214.md" | 59 +++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git "a/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" "b/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" index c78ab06d3f..19e19e4358 100644 --- "a/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" @@ -509,5 +509,64 @@ int** threeSum(int* nums, int numsSize, int* returnSize, int** returnColumnSizes } ``` +C#: +```csharp +public class Solution +{ + public IList> ThreeSum(int[] nums) + { + var result = new List>(); + + Array.Sort(nums); + + for (int i = 0; i < nums.Length - 2; i++) + { + int n1 = nums[i]; + + if (n1 > 0) + break; + + if (i > 0 && n1 == nums[i - 1]) + continue; + + int left = i + 1; + int right = nums.Length - 1; + + while (left < right) + { + int n2 = nums[left]; + int n3 = nums[right]; + int sum = n1 + n2 + n3; + + if (sum > 0) + { + right--; + } + else if (sum < 0) + { + left++; + } + else + { + result.Add(new List { n1, n2, n3 }); + + while (left < right && nums[left] == n2) + { + left++; + } + + while (left < right && nums[right] == n3) + { + right--; + } + } + } + } + + return result; + } +} +``` + -----------------------
From 35bbec3e298c03cc69582f486baa961102e0f583 Mon Sep 17 00:00:00 2001 From: youngyangyang04 <826123027@qq.com> Date: Mon, 17 Jan 2022 12:36:22 +0800 Subject: [PATCH 0269/3019] Update --- ...\345\220\214\350\267\257\345\276\204II.md" | 29 +++--- ...11\346\220\234\347\264\242\346\240\221.md" | 10 +-- ...64\346\225\260\346\213\206\345\210\206.md" | 26 +++--- ...47\241\20001\350\203\214\345\214\205-1.md" | 88 +++++++++---------- 4 files changed, 75 insertions(+), 78 deletions(-) diff --git "a/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" "b/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" index 490b6b5c95..1bcc11cddc 100644 --- "a/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" +++ "b/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" @@ -4,7 +4,7 @@

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

-## 63. 不同路径 II +# 63. 不同路径 II [力扣题目链接](https://leetcode-cn.com/problems/unique-paths-ii/) @@ -22,23 +22,22 @@ ![](https://img-blog.csdnimg.cn/20210111204939971.png) -输入:obstacleGrid = [[0,0,0],[0,1,0],[0,0,0]] -输出:2 +* 输入:obstacleGrid = [[0,0,0],[0,1,0],[0,0,0]] +* 输出:2 解释: -3x3 网格的正中间有一个障碍物。 -从左上角到右下角一共有 2 条不同的路径: -1. 向右 -> 向右 -> 向下 -> 向下 -2. 向下 -> 向下 -> 向右 -> 向右 +* 3x3 网格的正中间有一个障碍物。 +* 从左上角到右下角一共有 2 条不同的路径: + 1. 向右 -> 向右 -> 向下 -> 向下 + 2. 向下 -> 向下 -> 向右 -> 向右 示例 2: ![](https://img-blog.csdnimg.cn/20210111205857918.png) -输入:obstacleGrid = [[0,1],[0,0]] -输出:1 +* 输入:obstacleGrid = [[0,1],[0,0]] +* 输出:1 提示: - * m == obstacleGrid.length * n == obstacleGrid[i].length * 1 <= m, n <= 100 @@ -171,7 +170,7 @@ public: ## 其他语言版本 -Java: +### Java ```java class Solution { @@ -199,7 +198,7 @@ class Solution { ``` -Python: +### Python ```python class Solution: @@ -262,7 +261,7 @@ class Solution: ``` -Go: +### Go ```go func uniquePathsWithObstacles(obstacleGrid [][]int) int { @@ -308,8 +307,8 @@ func uniquePathsWithObstacles(obstacleGrid [][]int) int { ``` -Javascript -``` Javascript +### Javascript +```Javascript var uniquePathsWithObstacles = function(obstacleGrid) { const m = obstacleGrid.length const n = obstacleGrid[0].length diff --git "a/problems/0096.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0096.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" index d4b8d0245f..48826697cf 100644 --- "a/problems/0096.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" +++ "b/problems/0096.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" @@ -4,7 +4,7 @@

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

-## 96.不同的二叉搜索树 +# 96.不同的二叉搜索树 [力扣题目链接](https://leetcode-cn.com/problems/unique-binary-search-trees/) @@ -163,7 +163,7 @@ public: ## 其他语言版本 -Java: +### Java ```Java class Solution { public int numTrees(int n) { @@ -184,7 +184,7 @@ class Solution { } ``` -Python: +### Python ```python class Solution: def numTrees(self, n: int) -> int: @@ -196,7 +196,7 @@ class Solution: return dp[-1] ``` -Go: +### Go ```Go func numTrees(n int)int{ dp:=make([]int,n+1) @@ -210,7 +210,7 @@ func numTrees(n int)int{ } ``` -Javascript: +### Javascript ```Javascript const numTrees =(n) => { let dp = new Array(n+1).fill(0); diff --git "a/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" "b/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" index 5d11f670f7..471a7ab765 100644 --- "a/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" +++ "b/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" @@ -4,23 +4,22 @@

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

-## 343. 整数拆分 +# 343. 整数拆分 [力扣题目链接](https://leetcode-cn.com/problems/integer-break/) 给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化。 返回你可以获得的最大乘积。 示例 1: -输入: 2 -输出: 1 - -\解释: 2 = 1 + 1, 1 × 1 = 1。 +* 输入: 2 +* 输出: 1 +* 解释: 2 = 1 + 1, 1 × 1 = 1。 示例 2: -输入: 10 -输出: 36 -解释: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36。 -说明: 你可以假设 n 不小于 2 且不大于 58。 +* 输入: 10 +* 输出: 36 +* 解释: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36。 +* 说明: 你可以假设 n 不小于 2 且不大于 58。 ## 思路 @@ -193,7 +192,7 @@ public: ## 其他语言版本 -Java: +### Java ```Java class Solution { public int integerBreak(int n) { @@ -212,7 +211,7 @@ class Solution { } ``` -Python: +### Python ```python class Solution: def integerBreak(self, n: int) -> int: @@ -226,7 +225,8 @@ class Solution: dp[i] = max(dp[i], max(j * (i - j), j * dp[i - j])) return dp[n] ``` -Go: + +### Go ```golang func integerBreak(n int) int { /** @@ -256,7 +256,7 @@ func max(a,b int) int{ } ``` -Javascript: +### Javascript ```Javascript var integerBreak = function(n) { let dp = new Array(n + 1).fill(0) diff --git "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" index 4367aff9bb..6ff32017cf 100644 --- "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" +++ "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" @@ -3,11 +3,12 @@

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

+ # 动态规划:关于01背包问题,你该了解这些! 这周我们正式开始讲解背包问题! -背包问题的经典资料当然是:背包九讲。在公众号「代码随想录」后台回复:背包九讲,就可以获得背包九讲的PDF。 +背包问题的经典资料当然是:背包九讲。在公众号「代码随想录」后台回复:背包九讲,就可以获得背包九讲的pdf。 但说实话,背包九讲对于小白来说确实不太友好,看起来还是有点费劲的,而且都是伪代码理解起来也吃力。 @@ -32,7 +33,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) @@ -40,7 +41,7 @@ leetcode上没有纯01背包的问题,都是01背包应用方面的题目, 这样其实是没有从底向上去思考,而是习惯性想到了背包,那么暴力的解法应该是怎么样的呢? -每一件物品其实只有两个状态,取或者不取,所以可以使用回溯法搜索出所有的情况,那么时间复杂度就是$O(2^n)$,这里的n表示物品数量。 +每一件物品其实只有两个状态,取或者不取,所以可以使用回溯法搜索出所有的情况,那么时间复杂度就是$o(2^n)$,这里的n表示物品数量。 **所以暴力的解法是指数级别的时间复杂度。进而才需要动态规划的解法来进行优化!** @@ -109,7 +110,7 @@ for (int j = 0 ; j < weight[0]; j++) { // 当然这一步,如果把dp数组 dp[0][j] = 0; } // 正序遍历 -for (int j = weight[0]; j <= bagWeight; j++) { +for (int j = weight[0]; j <= bagweight; j++) { dp[0][j] = value[0]; } ``` @@ -135,8 +136,8 @@ dp[0][j] 和 dp[i][0] 都已经初始化了,那么其他下标应该初始化 ``` // 初始化 dp -vector> dp(weight.size(), vector(bagWeight + 1, 0)); -for (int j = weight[0]; j <= bagWeight; j++) { +vector> dp(weight.size(), vector(bagweight + 1, 0)); +for (int j = weight[0]; j <= bagweight; j++) { dp[0][j] = value[0]; } @@ -160,7 +161,7 @@ for (int j = weight[0]; j <= bagWeight; j++) { ``` // weight数组的大小 就是物品个数 for(int i = 1; i < weight.size(); i++) { // 遍历物品 - for(int j = 0; j <= bagWeight; j++) { // 遍历背包容量 + for(int j = 0; j <= bagweight; j++) { // 遍历背包容量 if (j < weight[i]) dp[i][j] = dp[i - 1][j]; else dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]); @@ -174,7 +175,7 @@ for(int i = 1; i < weight.size(); i++) { // 遍历物品 ``` // weight数组的大小 就是物品个数 -for(int j = 0; j <= bagWeight; j++) { // 遍历背包容量 +for(int j = 0; j <= bagweight; j++) { // 遍历背包容量 for(int i = 1; i < weight.size(); i++) { // 遍历物品 if (j < weight[i]) dp[i][j] = dp[i - 1][j]; else dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]); @@ -219,32 +220,32 @@ dp[i-1][j]和dp[i - 1][j - weight[i]] 都在dp[i][j]的左上角方向(包括 主要就是自己没有动手推导一下dp数组的演变过程,如果推导明白了,代码写出来就算有问题,只要把dp数组打印出来,对比一下和自己推导的有什么差异,很快就可以发现问题了。 -## 完整C++测试代码 +## 完整c++测试代码 -```CPP +```cpp void test_2_wei_bag_problem1() { vector weight = {1, 3, 4}; vector value = {15, 20, 30}; - int bagWeight = 4; + int bagweight = 4; // 二维数组 - vector> dp(weight.size(), vector(bagWeight + 1, 0)); + vector> dp(weight.size(), vector(bagweight + 1, 0)); // 初始化 - for (int j = weight[0]; j <= bagWeight; j++) { + for (int j = weight[0]; j <= bagweight; j++) { dp[0][j] = value[0]; } // weight数组的大小 就是物品个数 for(int i = 1; i < weight.size(); i++) { // 遍历物品 - for(int j = 0; j <= bagWeight; j++) { // 遍历背包容量 + for(int j = 0; j <= bagweight; j++) { // 遍历背包容量 if (j < weight[i]) dp[i][j] = dp[i - 1][j]; else dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]); } } - cout << dp[weight.size() - 1][bagWeight] << endl; + cout << dp[weight.size() - 1][bagweight] << endl; } int main() { @@ -267,48 +268,45 @@ int main() { ## 其他语言版本 -Java: +### java ```java - public static void main(String[] args) { + public static void main(string[] args) { int[] weight = {1, 3, 4}; int[] value = {15, 20, 30}; - int bagSize = 4; - testWeightBagProblem(weight, value, bagSize); + int bagsize = 4; + testweightbagproblem(weight, value, bagsize); } - public static void testWeightBagProblem(int[] weight, int[] value, int bagSize){ - int wLen = weight.length, value0 = 0; + public static void testweightbagproblem(int[] weight, int[] value, int bagsize){ + int wlen = weight.length, value0 = 0; //定义dp数组:dp[i][j]表示背包容量为j时,前i个物品能获得的最大价值 - int[][] dp = new int[wLen + 1][bagSize + 1]; + int[][] dp = new int[wlen + 1][bagsize + 1]; //初始化:背包容量为0时,能获得的价值都为0 - for (int i = 0; i <= wLen; i++){ + for (int i = 0; i <= wlen; i++){ dp[i][0] = value0; } //遍历顺序:先遍历物品,再遍历背包容量 - for (int i = 1; i <= wLen; i++){ - for (int j = 1; j <= bagSize; j++){ + for (int i = 1; i <= wlen; i++){ + for (int j = 1; j <= bagsize; j++){ if (j < weight[i - 1]){ dp[i][j] = dp[i - 1][j]; }else{ - dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - weight[i - 1]] + value[i - 1]); + dp[i][j] = math.max(dp[i - 1][j], dp[i - 1][j - weight[i - 1]] + value[i - 1]); } } } //打印dp数组 - for (int i = 0; i <= wLen; i++){ - for (int j = 0; j <= bagSize; j++){ - System.out.print(dp[i][j] + " "); + for (int i = 0; i <= wlen; i++){ + for (int j = 0; j <= bagsize; j++){ + system.out.print(dp[i][j] + " "); } - System.out.print("\n"); + system.out.print("\n"); } } ``` - - - -Python: +### python ```python def test_2_wei_bag_problem1(bag_size, weight, value) -> int: rows, cols = len(weight), bag_size + 1 @@ -343,26 +341,26 @@ if __name__ == "__main__": ``` -Go: +### go ```go -func test_2_wei_bag_problem1(weight, value []int, bagWeight int) int { +func test_2_wei_bag_problem1(weight, value []int, bagweight int) int { // 定义dp数组 dp := make([][]int, len(weight)) for i, _ := range dp { - dp[i] = make([]int, bagWeight+1) + dp[i] = make([]int, bagweight+1) } // 初始化 - for j := bagWeight; j >= weight[0]; j-- { + for j := bagweight; j >= weight[0]; j-- { dp[0][j] = dp[0][j-weight[0]] + value[0] } // 递推公式 for i := 1; i < len(weight); i++ { //正序,也可以倒序 - for j := weight[i];j<= bagWeight ; j++ { + for j := weight[i];j<= bagweight ; j++ { dp[i][j] = max(dp[i-1][j], dp[i-1][j-weight[i]]+value[i]) } } - return dp[len(weight)-1][bagWeight] + return dp[len(weight)-1][bagweight] } func max(a,b int) int { @@ -379,19 +377,19 @@ func main() { } ``` -javaScript: +### javascript ```js -function testWeightBagProblem (wight, value, size) { +function testweightbagproblem (wight, value, size) { const len = wight.length, - dp = Array.from({length: len + 1}).map( - () => Array(size + 1).fill(0) + dp = array.from({length: len + 1}).map( + () => array(size + 1).fill(0) ); for(let i = 1; i <= len; i++) { for(let j = 0; j <= size; j++) { if(wight[i - 1] <= j) { - dp[i][j] = Math.max( + dp[i][j] = math.max( dp[i - 1][j], value[i - 1] + dp[i - 1][j - wight[i - 1]] ) From e4537379854fc4943f7d0a48df9168dd647f8ba8 Mon Sep 17 00:00:00 2001 From: zhangjiong Date: Mon, 17 Jan 2022 15:17:23 +0800 Subject: [PATCH 0270/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200018.=E5=9B=9B?= =?UTF-8?q?=E6=95=B0=E4=B9=8B=E5=92=8C=20C#=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...33\346\225\260\344\271\213\345\222\214.md" | 62 +++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git "a/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" "b/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" index b94ebeef8c..0a04cd6822 100644 --- "a/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" @@ -403,5 +403,67 @@ func fourSum(_ nums: [Int], _ target: Int) -> [[Int]] { } ``` +C#: +```csharp +public class Solution +{ + public IList> FourSum(int[] nums, int target) + { + var result = new List>(); + + Array.Sort(nums); + + for (int i = 0; i < nums.Length - 3; i++) + { + int n1 = nums[i]; + if (i > 0 && n1 == nums[i - 1]) + continue; + + for (int j = i + 1; j < nums.Length - 2; j++) + { + int n2 = nums[j]; + if (j > i + 1 && n2 == nums[j - 1]) + continue; + + int left = j + 1; + int right = nums.Length - 1; + + while (left < right) + { + int n3 = nums[left]; + int n4 = nums[right]; + int sum = n1 + n2 + n3 + n4; + + if (sum > target) + { + right--; + } + else if (sum < target) + { + left++; + } + else + { + result.Add(new List { n1, n2, n3, n4 }); + + while (left < right && nums[left] == n3) + { + left++; + } + + while (left < right && nums[right] == n4) + { + right--; + } + } + } + } + } + + return result; + } +} +``` + -----------------------
From d941915829f122e717190d3712d1fba7b3fbde32 Mon Sep 17 00:00:00 2001 From: chengleqi Date: Mon, 17 Jan 2022 22:07:48 +0800 Subject: [PATCH 0271/3019] =?UTF-8?q?update=200051.N=E7=9A=87=E5=90=8E.md?= =?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/0051.N\347\232\207\345\220\216.md" | 109 ++++++++----------- 1 file changed, 48 insertions(+), 61 deletions(-) diff --git "a/problems/0051.N\347\232\207\345\220\216.md" "b/problems/0051.N\347\232\207\345\220\216.md" index 51415e88ea..7eb0d7a0b1 100644 --- "a/problems/0051.N\347\232\207\345\220\216.md" +++ "b/problems/0051.N\347\232\207\345\220\216.md" @@ -346,69 +346,56 @@ class Solution { ### Go ```Go -import "strings" -var res [][]string - -func isValid(board [][]string, row, col int) (res bool){ - n := len(board) - for i:=0; i < row; i++ { - if board[i][col] == "Q" { - return false - } - } - for i := 0; i < n; i++{ - if board[row][i] == "Q" { - return false - } - } - - for i ,j := row, col; i >= 0 && j >=0 ; i, j = i - 1, j- 1{ - if board[i][j] == "Q"{ - return false - } - } - for i, j := row, col; i >=0 && j < n; i,j = i-1, j+1 { - if board[i][j] == "Q" { - return false - } - } - return true -} - -func backtrack(board [][]string, row int) { - size := len(board) - if row == size{ - temp := make([]string, size) - for i := 0; i= 0 && j >= 0; i, j = i-1, j-1 { + if chessboard[i][j] == "Q" { + return false + } + } + for i, j := row-1, col+1; i >= 0 && j < n; i, j = i-1, j+1 { + if chessboard[i][j] == "Q" { + return false + } + } + return true } ``` ### Javascript From a2ac3fa4310f001758f6e08d8874164932ca4f04 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Tue, 18 Jan 2022 13:00:33 +0800 Subject: [PATCH 0272/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880151.?= =?UTF-8?q?=E7=BF=BB=E8=BD=AC=E5=AD=97=E7=AC=A6=E4=B8=B2=E9=87=8C=E7=9A=84?= =?UTF-8?q?=E5=8D=95=E8=AF=8D.md=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typesc?= =?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 --- ...14\347\232\204\345\215\225\350\257\215.md" | 59 +++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git "a/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" "b/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" index 48324cd9e1..fc25c71830 100644 --- "a/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" +++ "b/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" @@ -553,6 +553,65 @@ function reverse(strArr, start, end) { } ``` +TypeScript: + +```typescript +function reverseWords(s: string): string { + /** Utils **/ + // 删除多余空格, 如' hello world ' => 'hello world' + function delExtraSpace(arr: string[]): void { + let left: number = 0, + right: number = 0, + length: number = arr.length; + while (right < length && arr[right] === ' ') { + right++; + } + while (right < length) { + if (arr[right] === ' ' && arr[right - 1] === ' ') { + right++; + continue; + } + arr[left++] = arr[right++]; + } + if (arr[left - 1] === ' ') { + arr.length = left - 1; + } else { + arr.length = left; + } + } + // 翻转字符串,如:'hello' => 'olleh' + function reverseWords(strArr: string[], start: number, end: number) { + let temp: string; + while (start < end) { + temp = strArr[start]; + strArr[start] = strArr[end]; + strArr[end] = temp; + start++; + end--; + } + } + + /** Main code **/ + let strArr: string[] = s.split(''); + delExtraSpace(strArr); + let length: number = strArr.length; + // 翻转整个字符串 + reverseWords(strArr, 0, length - 1); + let start: number = 0, + end: number = 0; + while (start < length) { + end = start; + while (strArr[end] !== ' ' && end < length) { + end++; + } + // 翻转单个单词 + reverseWords(strArr, start, end - 1); + start = end + 1; + } + return strArr.join(''); +}; +``` + Swift: ```swift From 3d0ce431d83ac814ab8479d9392c6a6e5e022366 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9E=81=E5=AE=A2=E5=AD=A6=E4=BC=9F?= Date: Tue, 18 Jan 2022 13:18:36 +0800 Subject: [PATCH 0273/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20110.=E5=B9=B3?= =?UTF-8?q?=E8=A1=A1=E4=BA=8C=E5=8F=89=E6=A0=91=20Swift=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...41\344\272\214\345\217\211\346\240\221.md" | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git "a/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" "b/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" index c0914f05de..9d43407a31 100644 --- "a/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" @@ -730,5 +730,33 @@ bool isBalanced(struct TreeNode* root){ } ``` +## Swift: + +>递归 +```swift +func isBalanced(_ root: TreeNode?) -> Bool { + // -1 已经不是平衡二叉树 + return getHeight(root) == -1 ? false : true +} +func getHeight(_ root: TreeNode?) -> Int { + guard let root = root else { + return 0 + } + let leftHeight = getHeight(root.left) + if leftHeight == -1 { + return -1 + } + let rightHeight = getHeight(root.right) + if rightHeight == -1 { + return -1 + } + if abs(leftHeight - rightHeight) > 1 { + return -1 + } else { + return 1 + max(leftHeight, rightHeight) + } +} +``` + -----------------------
From d1a5c9cc908e78ffdb82f5acf6a2ff297254e2fa Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Tue, 18 Jan 2022 13:25:50 +0800 Subject: [PATCH 0274/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=88=E5=89=91?= =?UTF-8?q?=E6=8C=87Offer58-II.=E5=B7=A6=E6=97=8B=E8=BD=AC=E5=AD=97?= =?UTF-8?q?=E7=AC=A6=E4=B8=B2.md=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typesc?= =?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 --- ...54\345\255\227\347\254\246\344\270\262.md" | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git "a/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" "b/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" index c391d661c4..2fbd2888b1 100644 --- "a/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" @@ -209,6 +209,31 @@ var reverseLeftWords = function(s, n) { }; ``` +TypeScript: + +```typescript +function reverseLeftWords(s: string, n: number): string { + /** Utils */ + function reverseWords(strArr: string[], start: number, end: number): void { + let temp: string; + while (start < end) { + temp = strArr[start]; + strArr[start] = strArr[end]; + strArr[end] = temp; + start++; + end--; + } + } + /** Main code */ + let strArr: string[] = s.split(''); + let length: number = strArr.length; + reverseWords(strArr, 0, length - 1); + reverseWords(strArr, 0, length - n - 1); + reverseWords(strArr, length - n, length - 1); + return strArr.join(''); +}; +``` + Swift: ```swift From 76893360a9bc77a61ac0f620441680f4ba56a3d9 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Tue, 18 Jan 2022 13:30:39 +0800 Subject: [PATCH 0275/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=88=E5=89=91?= =?UTF-8?q?=E6=8C=87Offer58-II.=E5=B7=A6=E6=97=8B=E8=BD=AC=E5=AD=97?= =?UTF-8?q?=E7=AC=A6=E4=B8=B2.md=EF=BC=89=EF=BC=9AJS=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=96=B0=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...54\345\255\227\347\254\246\344\270\262.md" | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git "a/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" "b/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" index 2fbd2888b1..6139127423 100644 --- "a/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" @@ -209,6 +209,36 @@ var reverseLeftWords = function(s, n) { }; ``` +版本二(在原字符串上操作): + +```js +/** + * @param {string} s + * @param {number} n + * @return {string} + */ +var reverseLeftWords = function (s, n) { + /** Utils */ + function reverseWords(strArr, start, end) { + let temp; + while (start < end) { + temp = strArr[start]; + strArr[start] = strArr[end]; + strArr[end] = temp; + start++; + end--; + } + } + /** Main code */ + let strArr = s.split(''); + let length = strArr.length; + reverseWords(strArr, 0, length - 1); + reverseWords(strArr, 0, length - n - 1); + reverseWords(strArr, length - n, length - 1); + return strArr.join(''); +}; +``` + TypeScript: ```typescript From 5a3be18f127f97bce75a45e473381d1fe3206a94 Mon Sep 17 00:00:00 2001 From: leeeeeeewii <54872662+leeeeeeewii@users.noreply.github.com> Date: Wed, 19 Jan 2022 22:18:56 +0800 Subject: [PATCH 0276/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A00844.=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=20python=20go=E5=8F=8C=E6=8C=87=E9=92=88=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...04\345\255\227\347\254\246\344\270\262.md" | 81 +++++++++++++++++++ 1 file changed, 81 insertions(+) diff --git "a/problems/0844.\346\257\224\350\276\203\345\220\253\351\200\200\346\240\274\347\232\204\345\255\227\347\254\246\344\270\262.md" "b/problems/0844.\346\257\224\350\276\203\345\220\253\351\200\200\346\240\274\347\232\204\345\255\227\347\254\246\344\270\262.md" index 5d629a8c33..00d52e42e2 100644 --- "a/problems/0844.\346\257\224\350\276\203\345\220\253\351\200\200\346\240\274\347\232\204\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/0844.\346\257\224\350\276\203\345\220\253\351\200\200\346\240\274\347\232\204\345\255\227\347\254\246\344\270\262.md" @@ -205,6 +205,42 @@ class Solution: return self.get_string(s) == self.get_string(t) pass ``` +双指针 +```python +class Solution: + def backspaceCompare(self, s: str, t: str) -> bool: + s_index, t_index = len(s) - 1, len(t) - 1 + s_backspace, t_backspace = 0, 0 # 记录s,t的#数量 + while s_index >= 0 or t_index >= 0: # 使用or,以防长度不一致 + while s_index >= 0: # 从后向前,消除s的# + if s[s_index] == '#': + s_index -= 1 + s_backspace += 1 + else: + if s_backspace > 0: + s_index -= 1 + s_backspace -= 1 + else: + break + while t_index >= 0: # 从后向前,消除t的# + if t[t_index] == '#': + t_index -= 1 + t_backspace += 1 + else: + if t_backspace > 0: + t_index -= 1 + t_backspace -= 1 + else: + break + if s_index >= 0 and t_index >= 0: # 后半部分#消除完了,接下来比较当前位的值 + if s[s_index] != t[t_index]: + return False + elif s_index >= 0 or t_index >= 0: # 一个字符串找到了待比较的字符,另一个没有,返回False + return False + s_index -= 1 + t_index -= 1 + return True +``` ### Go @@ -226,6 +262,51 @@ func backspaceCompare(s string, t string) bool { return getString(s) == getString(t) } +``` +双指针 +```go +func backspaceCompare(s string, t string) bool { + s_index, t_index := len(s) - 1, len(t) - 1 + s_backspace, t_backspace := 0, 0 // 记录s,t的#数量 + for s_index >= 0 || t_index >= 0 { // 使用or,以防长度不一致 + for s_index >= 0 { // 从后向前,消除s的# + if s[s_index] == '#' { + s_index-- + s_backspace++ + } else { + if s_backspace > 0 { + s_index-- + s_backspace-- + } else { + break + } + } + } + for t_index >= 0 { // 从后向前,消除t的# + if t[t_index] == '#' { + t_index-- + t_backspace++ + } else { + if t_backspace > 0 { + t_index-- + t_backspace-- + } else { + break + } + } + } + if s_index >= 0 && t_index >= 0 { // 后半部分#消除完了,接下来比较当前位的值 + if s[s_index] != t[t_index] { + return false + } + } else if s_index >= 0 || t_index >= 0 { // 一个字符串找到了待比较的字符,另一个没有,返回false + return false + } + s_index-- + t_index-- + } + return true +} ``` ### JavaScript From da4f5de90905e87e6804ca6c172750c9fc5e4370 Mon Sep 17 00:00:00 2001 From: leeeeeeewii <54872662+leeeeeeewii@users.noreply.github.com> Date: Wed, 19 Jan 2022 22:32:28 +0800 Subject: [PATCH 0277/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A00054.=E8=9E=BA?= =?UTF-8?q?=E6=97=8B=E7=9F=A9=E9=98=B5=20python=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...72\346\227\213\347\237\251\351\230\265.md" | 41 ++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git "a/problems/0054.\350\236\272\346\227\213\347\237\251\351\230\265.md" "b/problems/0054.\350\236\272\346\227\213\347\237\251\351\230\265.md" index 3f85c6077a..ccf6f47161 100644 --- "a/problems/0054.\350\236\272\346\227\213\347\237\251\351\230\265.md" +++ "b/problems/0054.\350\236\272\346\227\213\347\237\251\351\230\265.md" @@ -131,7 +131,46 @@ public: * [59.螺旋矩阵II](https://leetcode-cn.com/problems/spiral-matrix-ii/) * [剑指Offer 29.顺时针打印矩阵](https://leetcode-cn.com/problems/shun-shi-zhen-da-yin-ju-zhen-lcof/) - +## 其他语言版本 +Python: +```python +class Solution: + def spiralOrder(self, matrix: List[List[int]]) -> List[int]: + m, n = len(matrix), len(matrix[0]) + left, right, up, down = 0, n - 1, 0, m - 1 # 定位四个方向的边界,闭区间 + res = [] + + while True: + for i in range(left, right + 1): # 上边,从左到右 + res.append(matrix[up][i]) + up += 1 # 上边界下移 + + if len(res) >= m * n: # 判断是否已经遍历完 + break + + for i in range(up, down + 1): # 右边,从上到下 + res.append(matrix[i][right]) + right -= 1 # 右边界左移 + + if len(res) >= m * n: + break + + for i in range(right, left - 1, -1): # 下边,从右到左 + res.append(matrix[down][i]) + down -= 1 # 下边界上移 + + if len(res) >= m * n: + break + + for i in range(down, up - 1, -1): # 左边,从下到上 + res.append(matrix[i][left]) + left += 1 # 左边界右移 + + if len(res) >= m * n: + break + + return res +``` -----------------------
From 850939e40745fb6cf03c056caf0dbb88cae620ec Mon Sep 17 00:00:00 2001 From: leeeeeeewii <54872662+leeeeeeewii@users.noreply.github.com> Date: Wed, 19 Jan 2022 22:48:45 +0800 Subject: [PATCH 0278/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=93=BE=E8=A1=A8?= =?UTF-8?q?=E7=90=86=E8=AE=BA=E5=9F=BA=E7=A1=80=20python=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 --- ...220\206\350\256\272\345\237\272\347\241\200.md" | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git "a/problems/\351\223\276\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\351\223\276\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" index 109aa1ed70..a4fefa2b83 100644 --- "a/problems/\351\223\276\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\351\223\276\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -195,10 +195,20 @@ class ListNode { ``` Python: - +```python +class ListNode: + def __init__(self, val, next=None): + self.val = val + self.next = next +``` Go: - +```go +type ListNode struct { + Val int + Next *ListNode +} +``` From b124befd1263689d1078a3417cd10cbf5ce2aebe Mon Sep 17 00:00:00 2001 From: chenhaoran14 <2718827494@qq.com> Date: Thu, 20 Jan 2022 01:15:23 +0800 Subject: [PATCH 0279/3019] =?UTF-8?q?=E5=AF=B9Java=E7=9A=84=E5=A4=A7?= =?UTF-8?q?=E9=A1=B6=E5=A0=86=E5=92=8C=E5=B0=8F=E9=A1=B6=E5=A0=86=E9=94=99?= =?UTF-8?q?=E8=AF=AF=E8=BF=9B=E8=A1=8C=E4=BA=86=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" "b/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" index 0b8fd2d781..8bd774e94d 100644 --- "a/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" +++ "b/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" @@ -142,7 +142,7 @@ class Solution { Set> entries = map.entrySet(); // 根据map的value值正序排,相当于一个小顶堆 - PriorityQueue> queue = new PriorityQueue<>((o1, o2) -> o2.getValue() - o1.getValue()); + PriorityQueue> queue = new PriorityQueue<>((o1, o2) -> o1.getValue() - o2.getValue()); for (Map.Entry entry : entries) { queue.offer(entry); if (queue.size() > k) { From baff8206d5a6bbb0a66b0db938fca36139bd0e10 Mon Sep 17 00:00:00 2001 From: weiting-cn <2254912@qq.com> Date: Thu, 20 Jan 2022 11:36:17 +0800 Subject: [PATCH 0280/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20(0583.=E4=B8=A4?= =?UTF-8?q?=E4=B8=AA=E5=AD=97=E7=AC=A6=E4=B8=B2=E7=9A=84=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E6=93=8D=E4=BD=9C.md)=20:=20=E5=A2=9E=E5=8A=A0=E8=A7=A3?= =?UTF-8?q?=E9=A2=98=E6=80=9D=E8=B7=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...40\351\231\244\346\223\215\344\275\234.md" | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git "a/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" "b/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" index d2f7d84b92..53c1a125d7 100644 --- "a/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" +++ "b/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" @@ -18,6 +18,8 @@ ## 思路 +### 动态规划一 + 本题和[动态规划:115.不同的子序列](https://programmercarl.com/0115.不同的子序列.html)相比,其实就是两个字符串都可以删除了,情况虽说复杂一些,但整体思路是不变的。 这次是两个字符串可以相互删了,这种题目也知道用动态规划的思路来解,动规五部曲,分析如下: @@ -98,6 +100,29 @@ public: ``` +### 动态规划二 + +本题和[动态规划:1143.最长公共子序列](https://programmercarl.com/1143.最长公共子序列.html)基本相同,只要求出两个字符串的最长公共子序列长度即可,那么除了最长公共子序列之外的字符都是必须删除的,最后用两个字符串的总长度减去两个最长公共子序列的长度就是删除的最少步数。 + +代码如下: + +```CPP +class Solution { +public: + int minDistance(string word1, string word2) { + vector> dp(word1.size()+1, vector(word2.size()+1, 0)); + for (int i=1; i<=word1.size(); i++){ + for (int j=1; j<=word2.size(); j++){ + if (word1[i-1] == word2[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 word1.size()+word2.size()-dp[word1.size()][word2.size()]*2; + } +}; + +``` + ## 其他语言版本 From 43eb0269d3dbbf47794eeee8690bcebae3d523db Mon Sep 17 00:00:00 2001 From: chenhaoran14 <2718827494@qq.com> Date: Thu, 20 Jan 2022 12:04:49 +0800 Subject: [PATCH 0281/3019] =?UTF-8?q?=E5=AF=B9Java=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E5=89=8D=E5=BA=8F=E6=8E=92=E5=88=97=E7=9A=84=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...200\222\345\275\222\351\201\215\345\216\206.md" | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" index 45b576e769..4beed6503c 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" @@ -116,19 +116,19 @@ Java: ```Java // 前序遍历·递归·LC144_二叉树的前序遍历 class Solution { - ArrayList preOrderReverse(TreeNode root) { - ArrayList result = new ArrayList(); - preOrder(root, result); + public List preorderTraversal(TreeNode root) { + List result = new ArrayList(); + preorder(root, result); return result; } - void preOrder(TreeNode root, ArrayList result) { + public void preorder(TreeNode root, List result) { if (root == null) { return; } - result.add(root.val); // 注意这一句 - preOrder(root.left, result); - preOrder(root.right, result); + result.add(root.val); + preorder(root.left, result); + preorder(root.right, result); } } // 中序遍历·递归·LC94_二叉树的中序遍历 From e0c6492d6e141d8ff20a1bd2a2cc4d0337b88286 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Thu, 20 Jan 2022 14:56:16 +0800 Subject: [PATCH 0282/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880028.?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0strStr.md=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0028.\345\256\236\347\216\260strStr.md" | 77 +++++++++++++++++++ 1 file changed, 77 insertions(+) diff --git "a/problems/0028.\345\256\236\347\216\260strStr.md" "b/problems/0028.\345\256\236\347\216\260strStr.md" index f0b56719ae..5f1fa137b7 100644 --- "a/problems/0028.\345\256\236\347\216\260strStr.md" +++ "b/problems/0028.\345\256\236\347\216\260strStr.md" @@ -929,6 +929,83 @@ var strStr = function (haystack, needle) { }; ``` +TypeScript版本: + +> 前缀表统一减一 + +```typescript +function strStr(haystack: string, needle: string): number { + function getNext(str: string): number[] { + let next: number[] = []; + let j: number = -1; + next[0] = j; + for (let i = 1, length = str.length; i < length; i++) { + while (j >= 0 && str[i] !== str[j + 1]) { + j = next[j]; + } + if (str[i] === str[j + 1]) { + j++; + } + next[i] = j; + } + return next; + } + if (needle.length === 0) return 0; + let next: number[] = getNext(needle); + let j: number = -1; + for (let i = 0, length = haystack.length; i < length; i++) { + while (j >= 0 && haystack[i] !== needle[j + 1]) { + j = next[j]; + } + if (haystack[i] === needle[j + 1]) { + if (j === needle.length - 2) { + return i - j - 1; + } + j++; + } + } + return -1; +}; +``` + +> 前缀表不减一 + +```typescript +// 不减一版本 +function strStr(haystack: string, needle: string): number { + function getNext(str: string): number[] { + let next: number[] = []; + let j: number = 0; + next[0] = j; + for (let i = 1, length = str.length; i < length; i++) { + while (j > 0 && str[i] !== str[j]) { + j = next[j - 1]; + } + if (str[i] === str[j]) { + j++; + } + next[i] = j; + } + return next; + } + if (needle.length === 0) return 0; + let next: number[] = getNext(needle); + let j: number = 0; + for (let i = 0, length = haystack.length; i < length; i++) { + while (j > 0 && haystack[i] !== needle[j]) { + j = next[j - 1]; + } + if (haystack[i] === needle[j]) { + if (j === needle.length - 1) { + return i - j; + } + j++; + } + } + return -1; +} +``` + Swift 版本 > 前缀表统一减一 From 59c95ff24d60ec7809aa80c632b3728291892077 Mon Sep 17 00:00:00 2001 From: Guanzhong Pan Date: Thu, 20 Jan 2022 08:29:02 +0000 Subject: [PATCH 0283/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200343.=E6=95=B4?= =?UTF-8?q?=E6=95=B0=E6=8B=86=E5=88=86.md=20C=E8=AF=AD=E8=A8=80=E8=A7=A3?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...64\346\225\260\346\213\206\345\210\206.md" | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git "a/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" "b/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" index 5d11f670f7..9882c6ea7e 100644 --- "a/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" +++ "b/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" @@ -271,5 +271,40 @@ var integerBreak = function(n) { }; ``` +C: +```c +//初始化DP数组 +int *initDP(int num) { + int* dp = (int*)malloc(sizeof(int) * (num + 1)); + int i; + for(i = 0; i < num + 1; ++i) { + dp[i] = 0; + } + return dp; +} + +//取三数最大值 +int max(int num1, int num2, int num3) { + int tempMax = num1 > num2 ? num1 : num2; + return tempMax > num3 ? tempMax : num3; +} + +int integerBreak(int n){ + int *dp = initDP(n); + //初始化dp[2]为1 + dp[2] = 1; + + int i; + for(i = 3; i <= n; ++i) { + int j; + for(j = 1; j < i - 1; ++j) { + //取得上次循环:dp[i],原数相乘,或j*dp[]i-j] 三数中的最大值 + dp[i] = max(dp[i], j * (i - j), j * dp[i - j]); + } + } + return dp[n]; +} +``` + -----------------------
From 7aba93c8e1bbb3f623c1f67f9f2d7f794aaefd78 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Thu, 20 Jan 2022 17:15:09 +0800 Subject: [PATCH 0284/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880459.?= =?UTF-8?q?=E9=87=8D=E5=A4=8D=E7=9A=84=E5=AD=90=E5=AD=97=E7=AC=A6=E4=B8=B2?= =?UTF-8?q?.md=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...20\345\255\227\347\254\246\344\270\262.md" | 58 +++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git "a/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" "b/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" index 9c74f4a7bb..ccfb485cbb 100644 --- "a/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" @@ -361,7 +361,65 @@ var repeatedSubstringPattern = function (s) { }; ``` +TypeScript: +> 前缀表统一减一 + +```typescript +function repeatedSubstringPattern(s: string): boolean { + function getNext(str: string): number[] { + let next: number[] = []; + let j: number = -1; + next[0] = j; + for (let i = 1, length = str.length; i < length; i++) { + while (j >= 0 && str[i] !== str[j + 1]) { + j = next[j]; + } + if (str[i] === str[j + 1]) { + j++; + } + next[i] = j; + } + return next; + } + + let next: number[] = getNext(s); + let sLength: number = s.length; + let nextLength: number = next.length; + let suffixLength: number = next[nextLength - 1] + 1; + if (suffixLength > 0 && sLength % (sLength - suffixLength) === 0) return true; + return false; +}; +``` + +> 前缀表不减一 + +```typescript +function repeatedSubstringPattern(s: string): boolean { + function getNext(str: string): number[] { + let next: number[] = []; + let j: number = 0; + next[0] = j; + for (let i = 1, length = str.length; i < length; i++) { + while (j > 0 && str[i] !== str[j]) { + j = next[j - 1]; + } + if (str[i] === str[j]) { + j++; + } + next[i] = j; + } + return next; + } + + let next: number[] = getNext(s); + let sLength: number = s.length; + let nextLength: number = next.length; + let suffixLength: number = next[nextLength - 1]; + if (suffixLength > 0 && sLength % (sLength - suffixLength) === 0) return true; + return false; +}; +``` -----------------------
From 0e75c5d92e619bffb60a63db4d606a492045b732 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9E=81=E5=AE=A2=E5=AD=A6=E4=BC=9F?= Date: Thu, 20 Jan 2022 20:32:17 +0800 Subject: [PATCH 0285/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20257.=20=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?=20Swift=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...00\346\234\211\350\267\257\345\276\204.md" | 65 +++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git "a/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" "b/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" index cb837d8781..7b5fc2e959 100644 --- "a/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" +++ "b/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" @@ -581,7 +581,72 @@ var binaryTreePaths = function(root) { }; ``` +Swift: + +> 递归/回溯 +```swift +func binaryTreePaths(_ root: TreeNode?) -> [String] { + var res = [String]() + guard let root = root else { + return res + } + var path = [Int]() + _binaryTreePaths(root, path: &path, res: &res) + return res +} +func _binaryTreePaths(_ root: TreeNode, path: inout [Int], res: inout [String]) { + path.append(root.val) + if root.left == nil && root.right == nil { + var str = "" + for i in 0 ..< path.count - 1 { + str.append("\(path[i])->") + } + str.append("\(path.last!)") + res.append(str) + return + } + if let left = root.left { + _binaryTreePaths(left, path: &path, res: &res) + path.removeLast() + } + if let right = root.right { + _binaryTreePaths(right, path: &path, res: &res) + path.removeLast() + } +} +``` +> 迭代 +```swift +func binaryTreePaths(_ root: TreeNode?) -> [String] { + var res = [String]() + guard let root = root else { + return res + } + var stackNode = [TreeNode]() + stackNode.append(root) + + var stackStr = [String]() + stackStr.append("\(root.val)") + + while !stackNode.isEmpty { + let node = stackNode.popLast()! + let str = stackStr.popLast()! + if node.left == nil && node.right == nil { + res.append(str) + } + if let left = node.left { + stackNode.append(left) + stackStr.append("\(str)->\(left.val)") + } + if let right = node.right { + stackNode.append(right) + stackStr.append("\(str)->\(right.val)") + } + } + return res +} +``` -----------------------
From 02fd6b8f9a9dc49af1612762c80a439e0a1f5e04 Mon Sep 17 00:00:00 2001 From: YDLIN <1924723909@qq.com> Date: Fri, 21 Jan 2022 10:45:10 +0800 Subject: [PATCH 0286/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0257.=20=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?=20Swift=20=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...00\346\234\211\350\267\257\345\276\204.md" | 91 +++++++++++++++++++ 1 file changed, 91 insertions(+) diff --git "a/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" "b/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" index cb837d8781..9ccd81d8ae 100644 --- "a/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" +++ "b/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" @@ -581,6 +581,97 @@ var binaryTreePaths = function(root) { }; ``` +Swift: + +递归法: + +```swift +func binaryTreePaths(_ root: TreeNode?) -> [String] { + var result = Array() + var path = Array() + guard let root = root else { + return result + } + traversal(root, &path, &result) + return result + } + + func traversal(_ cur: TreeNode, _ path: inout Array, _ result: inout Array) { + path.append(cur.val) + // 递归终止条件:到达叶子节点 + if cur.left == nil && cur.right == nil { + var pathString = "" + // 处理 path 前面的元素 + for i in 0.. [String] { + // 保存树的遍历节点 + var treeStack = [TreeNode]() + // 保存遍历路径的节点 + var pathStack = [String]() + // 保存最终路径集合 + var result = [String]() + guard let root = root else { + return result + } + treeStack.append(root) + pathStack.append(String(root.val)) + while !treeStack.isEmpty { + let node = treeStack.removeLast() + let path = pathStack.removeLast() + + // 遇到叶子节点 + if node.left == nil && node.right == nil { + result.append(path) + } + + if let rightNode = node.right { + treeStack.append(rightNode) + let tmp = path + "->" + String(rightNode.val) + pathStack.append(tmp) + } + + if let leftNode = node.left { + treeStack.append(leftNode) + let tmp = path + "->" + String(leftNode.val) + pathStack.append(tmp) + } + } + + return result + } +``` + ----------------------- From d29fa29a87e8e5b2739f5033423cc6666d1ced42 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Fri, 21 Jan 2022 14:16:33 +0800 Subject: [PATCH 0287/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880232.?= =?UTF-8?q?=E7=94=A8=E6=A0=88=E5=AE=9E=E7=8E=B0=E9=98=9F=E5=88=97.md?= =?UTF-8?q?=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...36\347\216\260\351\230\237\345\210\227.md" | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git "a/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" "b/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" index 4edba2f201..33ce81147d 100644 --- "a/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" +++ "b/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" @@ -348,7 +348,44 @@ MyQueue.prototype.empty = function() { }; ``` +TypeScript: + +```typescript +class MyQueue { + private stackIn: number[] + private stackOut: number[] + constructor() { + this.stackIn = []; + this.stackOut = []; + } + + push(x: number): void { + this.stackIn.push(x); + } + + pop(): number { + if (this.stackOut.length === 0) { + while (this.stackIn.length > 0) { + this.stackOut.push(this.stackIn.pop()!); + } + } + return this.stackOut.pop()!; + } + + peek(): number { + let temp: number = this.pop(); + this.stackOut.push(temp); + return temp; + } + + empty(): boolean { + return this.stackIn.length === 0 && this.stackOut.length === 0; + } +} +``` + Swift: + ```swift class MyQueue { From 1264fa87ac45c189ed9cc9caee88ef627c352e05 Mon Sep 17 00:00:00 2001 From: chengleqi Date: Fri, 21 Jan 2022 14:38:11 +0800 Subject: [PATCH 0288/3019] =?UTF-8?q?update=200063.=E4=B8=8D=E5=90=8C?= =?UTF-8?q?=E8=B7=AF=E5=BE=84II.md=20Go=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\345\220\214\350\267\257\345\276\204II.md" | 43 +++++++------------ 1 file changed, 15 insertions(+), 28 deletions(-) diff --git "a/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" "b/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" index 6f405d6ace..105b6402bb 100644 --- "a/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" +++ "b/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" @@ -266,46 +266,33 @@ Go: ```go func uniquePathsWithObstacles(obstacleGrid [][]int) int { - m,n:= len(obstacleGrid),len(obstacleGrid[0]) + m, n := len(obstacleGrid), len(obstacleGrid[0]) // 定义一个dp数组 - dp := make([][]int,m) - for i,_ := range dp { - dp[i] = make([]int,n) + dp := make([][]int, m) + for i, _ := range dp { + dp[i] = make([]int, n) } - // 初始化 - for i:=0;i Date: Fri, 21 Jan 2022 17:25:00 +0800 Subject: [PATCH 0289/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880225.?= =?UTF-8?q?=E7=94=A8=E9=98=9F=E5=88=97=E5=AE=9E=E7=8E=B0=E6=A0=88.md?= =?UTF-8?q?=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...27\345\256\236\347\216\260\346\240\210.md" | 73 +++++++++++++++++++ 1 file changed, 73 insertions(+) diff --git "a/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" "b/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" index fdb544a6c2..961fad3889 100644 --- "a/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" +++ "b/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" @@ -598,7 +598,80 @@ MyStack.prototype.empty = function() { ``` +TypeScript: + +版本一:使用两个队列模拟栈 + +```typescript +class MyStack { + private queue: number[]; + private tempQueue: number[]; + constructor() { + this.queue = []; + this.tempQueue = []; + } + + push(x: number): void { + this.queue.push(x); + } + + pop(): number { + for (let i = 0, length = this.queue.length - 1; i < length; i++) { + this.tempQueue.push(this.queue.shift()!); + } + let res: number = this.queue.pop()!; + let temp: number[] = this.queue; + this.queue = this.tempQueue; + this.tempQueue = temp; + return res; + } + + top(): number { + let res: number = this.pop(); + this.push(res); + return res; + } + + empty(): boolean { + return this.queue.length === 0; + } +} +``` + +版本二:使用一个队列模拟栈 + +```typescript +class MyStack { + private queue: number[]; + constructor() { + this.queue = []; + } + + push(x: number): void { + this.queue.push(x); + } + + pop(): number { + for (let i = 0, length = this.queue.length - 1; i < length; i++) { + this.queue.push(this.queue.shift()!); + } + return this.queue.shift()!; + } + + top(): number { + let res: number = this.pop(); + this.push(res); + return res; + } + + empty(): boolean { + return this.queue.length === 0; + } +} +``` + Swift + ```Swift // 定义一个队列数据结构 class Queue { From f54af7ff39bb3c2d268eb1daff3bd2f5c8ca8b72 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Fri, 21 Jan 2022 20:57:58 +0800 Subject: [PATCH 0290/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880020.?= =?UTF-8?q?=E6=9C=89=E6=95=88=E7=9A=84=E6=8B=AC=E5=8F=B7.md=EF=BC=89?= =?UTF-8?q?=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...10\347\232\204\346\213\254\345\217\267.md" | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git "a/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" "b/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" index 9e4046d4d5..95d62e42a0 100644 --- "a/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" +++ "b/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" @@ -283,8 +283,60 @@ var isValid = function(s) { }; ``` +TypeScript: + +版本一:普通版 + +```typescript +function isValid(s: string): boolean { + let helperStack: string[] = []; + for (let i = 0, length = s.length; i < length; i++) { + let x: string = s[i]; + switch (x) { + case '(': + helperStack.push(')'); + break; + case '[': + helperStack.push(']'); + break; + case '{': + helperStack.push('}'); + break; + default: + if (helperStack.pop() !== x) return false; + break; + } + } + return helperStack.length === 0; +}; +``` + +版本二:优化版 + +```typescript +function isValid(s: string): boolean { + type BracketMap = { + [index: string]: string; + } + let helperStack: string[] = []; + let bracketMap: BracketMap = { + '(': ')', + '[': ']', + '{': '}' + } + for (let i of s) { + if (bracketMap.hasOwnProperty(i)) { + helperStack.push(bracketMap[i]); + } else if (i !== helperStack.pop()) { + return false; + } + } + return helperStack.length === 0; +}; +``` Swift + ```swift func isValid(_ s: String) -> Bool { var stack = [String.Element]() From 61b0ddef35b07f7b459d9bfac774691bcf6cec98 Mon Sep 17 00:00:00 2001 From: coolcty Date: Fri, 21 Jan 2022 17:52:43 +0100 Subject: [PATCH 0291/3019] =?UTF-8?q?Update=200031.=E4=B8=8B=E4=B8=80?= =?UTF-8?q?=E4=B8=AA=E6=8E=92=E5=88=97.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\270\213\344\270\200\344\270\252\346\216\222\345\210\227.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0031.\344\270\213\344\270\200\344\270\252\346\216\222\345\210\227.md" "b/problems/0031.\344\270\213\344\270\200\344\270\252\346\216\222\345\210\227.md" index 84bf3e607c..2219e24dba 100644 --- "a/problems/0031.\344\270\213\344\270\200\344\270\252\346\216\222\345\210\227.md" +++ "b/problems/0031.\344\270\213\344\270\200\344\270\252\346\216\222\345\210\227.md" @@ -81,7 +81,7 @@ public: for (int j = nums.size() - 1; j > i; j--) { if (nums[j] > nums[i]) { swap(nums[j], nums[i]); - sort(nums.begin() + i + 1, nums.end()); + reverse(nums.begin() + i + 1, nums.end()); return; } } From 2ec4867125e60381b9ded470a59ad89d0b8401d1 Mon Sep 17 00:00:00 2001 From: YDLIN <1924723909@qq.com> Date: Sat, 22 Jan 2022 10:26:18 +0800 Subject: [PATCH 0292/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20404.=20=E5=B7=A6?= =?UTF-8?q?=E5=8F=B6=E5=AD=90=E4=B9=8B=E5=92=8C=20Swift=20=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...66\345\255\220\344\271\213\345\222\214.md" | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git "a/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" "b/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" index ddbd100e2c..09272052de 100644 --- "a/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" +++ "b/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" @@ -373,6 +373,54 @@ var sumOfLeftLeaves = function(root) { ``` +## Swift + +**递归法** +```swift +func sumOfLeftLeaves(_ root: TreeNode?) -> Int { + guard let root = root else { + return 0 + } + + let leftValue = sumOfLeftLeaves(root.left) + let rightValue = sumOfLeftLeaves(root.right) + + var midValue: Int = 0 + if root.left != nil && root.left?.left == nil && root.left?.right == nil { + midValue = root.left!.val + } + + let sum = midValue + leftValue + rightValue + return sum +} +``` +**迭代法** +```swift +func sumOfLeftLeaves(_ root: TreeNode?) -> Int { + guard let root = root else { + return 0 + } + + var stack = Array() + stack.append(root) + var sum = 0 + + while !stack.isEmpty { + let lastNode = stack.removeLast() + + if lastNode.left != nil && lastNode.left?.left == nil && lastNode.left?.right == nil { + sum += lastNode.left!.val + } + if let right = lastNode.right { + stack.append(right) + } + if let left = lastNode.left { + stack.append(left) + } + } + return sum +} +``` From 26c7fd202afc2aac492c2db589a3c4af5af3fcf3 Mon Sep 17 00:00:00 2001 From: YDLIN <1924723909@qq.com> Date: Sat, 22 Jan 2022 11:38:28 +0800 Subject: [PATCH 0293/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20513.=20=E6=89=BE?= =?UTF-8?q?=E6=A0=91=E5=B7=A6=E4=B8=8B=E8=A7=92=E7=9A=84=E5=80=BC=20Swift?= =?UTF-8?q?=20=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...13\350\247\222\347\232\204\345\200\274.md" | 68 +++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git "a/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" "b/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" index 99f42d34cd..84ed393207 100644 --- "a/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" +++ "b/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" @@ -433,6 +433,74 @@ var findBottomLeftValue = function(root) { }; ``` +## Swift + +递归版本: + +```swift +var maxLen = -1 +var maxLeftValue = 0 +func findBottomLeftValue_2(_ root: TreeNode?) -> Int { + traversal(root, 0) + return maxLeftValue +} + +func traversal(_ root: TreeNode?, _ deep: Int) { + guard let root = root else { + return + } + + if root.left == nil && root.right == nil { + if deep > maxLen { + maxLen = deep + maxLeftValue = root.val + } + return + } + + if root.left != nil { + traversal(root.left, deep + 1) + } + + if root.right != nil { + traversal(root.right, deep + 1) + } + return +} +``` +层序遍历: + +```swift +func findBottomLeftValue(_ root: TreeNode?) -> Int { + guard let root = root else { + return 0 + } + + var queue = [root] + var result = 0 + + while !queue.isEmpty { + let size = queue.count + for i in 0.. Date: Sat, 22 Jan 2022 17:45:40 +0800 Subject: [PATCH 0294/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=881047.?= =?UTF-8?q?=E5=88=A0=E9=99=A4=E5=AD=97=E7=AC=A6=E4=B8=B2=E4=B8=AD=E7=9A=84?= =?UTF-8?q?=E6=89=80=E6=9C=89=E7=9B=B8=E9=82=BB=E9=87=8D=E5=A4=8D=E9=A1=B9?= =?UTF-8?q?.md=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...73\351\207\215\345\244\215\351\241\271.md" | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git "a/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" "b/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" index d6eefd078a..9a0bb1c1bd 100644 --- "a/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" +++ "b/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" @@ -267,8 +267,32 @@ var removeDuplicates = function(s) { }; ``` +TypeScript: + +```typescript +function removeDuplicates(s: string): string { + const helperStack: string[] = []; + let i: number = 0; + while (i < s.length) { + let top: string = helperStack[helperStack.length - 1]; + if (top === s[i]) { + helperStack.pop(); + } else { + helperStack.push(s[i]); + } + i++; + } + let res: string = ''; + while (helperStack.length > 0) { + res = helperStack.pop() + res; + } + return res; +}; +``` + C: 方法一:使用栈 + ```c char * removeDuplicates(char * s){ //求出字符串长度 From 2b33b45170c22eb4b900bc85ff04ad5ce0a5c2e2 Mon Sep 17 00:00:00 2001 From: Guanzhong Pan Date: Sat, 22 Jan 2022 10:39:07 +0000 Subject: [PATCH 0295/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200096.=E4=B8=8D?= =?UTF-8?q?=E5=90=8C=E7=9A=84=E4=BA=8C=E5=8F=89=E6=90=9C=E7=B4=A2=E6=A0=91?= =?UTF-8?q?.md=20C=E8=AF=AD=E8=A8=80=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...11\346\220\234\347\264\242\346\240\221.md" | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git "a/problems/0096.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0096.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" index d4b8d0245f..d6f7aca7f2 100644 --- "a/problems/0096.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" +++ "b/problems/0096.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" @@ -227,7 +227,34 @@ const numTrees =(n) => { }; ``` +C: +```c +//开辟dp数组 +int *initDP(int n) { + int *dp = (int *)malloc(sizeof(int) * (n + 1)); + int i; + for(i = 0; i <= n; ++i) + dp[i] = 0; + return dp; +} + +int numTrees(int n){ + //开辟dp数组 + int *dp = initDP(n); + //将dp[0]设为1 + dp[0] = 1; + int i, j; + for(i = 1; i <= n; ++i) { + for(j = 1; j <= i; ++j) { + //递推公式:dp[i] = d[i] + 根为j时左子树种类个数 * 根为j时右子树种类个数 + dp[i] += dp[j - 1] * dp[i - j]; + } + } + + return dp[n]; +} +``` -----------------------
From 718e67acef29a7f21f7914d0b1e175b2b52a4063 Mon Sep 17 00:00:00 2001 From: Guanzhong Pan Date: Sat, 22 Jan 2022 10:41:09 +0000 Subject: [PATCH 0296/3019] =?UTF-8?q?=E4=BF=AE=E6=94=B9=200096.=E4=B8=8D?= =?UTF-8?q?=E5=90=8C=E7=9A=84=E4=BA=8C=E5=8F=89=E6=90=9C=E7=B4=A2=E6=A0=91?= =?UTF-8?q?.md=20C=E8=AF=AD=E8=A8=80=E8=A7=A3=E6=B3=95=E6=B3=A8=E9=87=8A?= =?UTF-8?q?=E9=94=99=E5=88=AB=E5=AD=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0096.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0096.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" index d6f7aca7f2..d334a29c86 100644 --- "a/problems/0096.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" +++ "b/problems/0096.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" @@ -247,7 +247,7 @@ int numTrees(int n){ int i, j; for(i = 1; i <= n; ++i) { for(j = 1; j <= i; ++j) { - //递推公式:dp[i] = d[i] + 根为j时左子树种类个数 * 根为j时右子树种类个数 + //递推公式:dp[i] = dp[i] + 根为j时左子树种类个数 * 根为j时右子树种类个数 dp[i] += dp[j - 1] * dp[i - j]; } } From 3fb923694db6cdd6a1b38f16cfcc294bfa415876 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Sat, 22 Jan 2022 22:20:24 +0800 Subject: [PATCH 0297/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880150.?= =?UTF-8?q?=E9=80=86=E6=B3=A2=E5=85=B0=E8=A1=A8=E8=BE=BE=E5=BC=8F=E6=B1=82?= =?UTF-8?q?=E5=80=BC.md=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript?= =?UTF-8?q?=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...76\345\274\217\346\261\202\345\200\274.md" | 65 +++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git "a/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" "b/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" index f44703f18f..f4dad8231a 100644 --- "a/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" +++ "b/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" @@ -210,6 +210,71 @@ var evalRPN = function(tokens) { }; ``` +TypeScript: + +普通版: + +```typescript +function evalRPN(tokens: string[]): number { + let helperStack: number[] = []; + let temp: number; + let i: number = 0; + while (i < tokens.length) { + let t: string = tokens[i]; + switch (t) { + case '+': + temp = helperStack.pop()! + helperStack.pop()!; + helperStack.push(temp); + break; + case '-': + temp = helperStack.pop()!; + temp = helperStack.pop()! - temp; + helperStack.push(temp); + break; + case '*': + temp = helperStack.pop()! * helperStack.pop()!; + helperStack.push(temp); + break; + case '/': + temp = helperStack.pop()!; + temp = Math.trunc(helperStack.pop()! / temp); + helperStack.push(temp); + break; + default: + helperStack.push(Number(t)); + break; + } + i++; + } + return helperStack.pop()!; +}; +``` + +优化版: + +```typescript +function evalRPN(tokens: string[]): number { + const helperStack: number[] = []; + const operatorMap: Map number> = new Map([ + ['+', (a, b) => a + b], + ['-', (a, b) => a - b], + ['/', (a, b) => Math.trunc(a / b)], + ['*', (a, b) => a * b], + ]); + let a: number, b: number; + for (let t of tokens) { + if (operatorMap.has(t)) { + b = helperStack.pop()!; + a = helperStack.pop()!; + helperStack.push(operatorMap.get(t)!(a, b)); + } else { + helperStack.push(Number(t)); + } + } + return helperStack.pop()!; +}; +``` + python3 ```python From b5becb3291def44a5ddbccda6f6be7ae3266f634 Mon Sep 17 00:00:00 2001 From: chengleqi Date: Sun, 23 Jan 2022 17:23:36 +0800 Subject: [PATCH 0298/3019] =?UTF-8?q?bug-fix=200494.=E7=9B=AE=E6=A0=87?= =?UTF-8?q?=E5=92=8C.md=20Go=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...4.\347\233\256\346\240\207\345\222\214.md" | 43 ++----------------- 1 file changed, 3 insertions(+), 40 deletions(-) diff --git "a/problems/0494.\347\233\256\346\240\207\345\222\214.md" "b/problems/0494.\347\233\256\346\240\207\345\222\214.md" index 1835f49897..0faef4a577 100644 --- "a/problems/0494.\347\233\256\346\240\207\345\222\214.md" +++ "b/problems/0494.\347\233\256\346\240\207\345\222\214.md" @@ -289,7 +289,7 @@ func findTargetSumWays(nums []int, target int) int { for _, v := range nums { sum += v } - if target > sum { + if abs(target) > sum { return 0 } if (sum+target)%2 == 1 { @@ -311,49 +311,12 @@ func findTargetSumWays(nums []int, target int) int { } return dp[bag] } -``` -> 更新版,上一个跑不通了,因为会存在bag 小于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 { From b3078ef51c321e386f5900e4f43c3b2c68dd0ca0 Mon Sep 17 00:00:00 2001 From: zhicheng lee <904688436@qq.com> Date: Sun, 23 Jan 2022 22:59:59 +0800 Subject: [PATCH 0299/3019] =?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 更新Java版本代码 --- ...15\345\217\240\345\214\272\351\227\264.md" | 28 ++++++++----------- 1 file changed, 11 insertions(+), 17 deletions(-) diff --git "a/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" "b/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" index 118360bc2c..389443d1be 100644 --- "a/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" +++ "b/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" @@ -183,28 +183,22 @@ public: ```java class Solution { public int eraseOverlapIntervals(int[][] intervals) { - if (intervals.length < 2) return 0; - - Arrays.sort(intervals, new Comparator() { - @Override - public int compare(int[] o1, int[] o2) { - if (o1[1] != o2[1]) { - return Integer.compare(o1[1],o2[1]); - } else { - return Integer.compare(o1[0],o2[0]); - } - } + Arrays.sort(intervals, (a, b) -> { + if (a[0] == a[0]) return a[1] - b[1]; + return a[0] - b[0]; }); - int count = 1; - int edge = intervals[0][1]; - for (int i = 1; i < intervals.length; i++) { - if (edge <= intervals[i][0]){ - count ++; //non overlap + 1 + int count = 0; + int edge = Integer.MIN_VALUE; + for (int i = 0; i < intervals.length; i++) { + if (edge <= intervals[i][0]) { edge = intervals[i][1]; + } else { + count++; } } - return intervals.length - count; + + return count; } } ``` From 00728847e17558cda0d76ff87e544b5a0a5e2dfb Mon Sep 17 00:00:00 2001 From: YDLIN <1924723909@qq.com> Date: Mon, 24 Jan 2022 11:36:06 +0800 Subject: [PATCH 0300/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200112.=E8=B7=AF?= =?UTF-8?q?=E5=BE=84=E6=80=BB=E5=92=8C=E3=80=810113.=E8=B7=AF=E5=BE=84?= =?UTF-8?q?=E6=80=BB=E5=92=8C=20II=20Swift=20=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...57\345\276\204\346\200\273\345\222\214.md" | 117 ++++++++++++++++++ 1 file changed, 117 insertions(+) diff --git "a/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" "b/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" index 910e57c86f..5ec8ffd051 100644 --- "a/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" +++ "b/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" @@ -766,7 +766,124 @@ let pathSum = function(root, targetSum) { }; ``` +## Swift +0112.路径总和 + +**递归** +```swift +func hasPathSum(_ root: TreeNode?, _ targetSum: Int) -> Bool { + guard let root = root else { + return false + } + + return traversal(root, targetSum - root.val) +} + +func traversal(_ cur: TreeNode?, _ count: Int) -> Bool { + if cur?.left == nil && cur?.right == nil && count == 0 { + return true + } + + if cur?.left == nil && cur?.right == nil { + return false + } + + if let leftNode = cur?.left { + if traversal(leftNode, count - leftNode.val) { + return true + } + } + + if let rightNode = cur?.right { + if traversal(rightNode, count - rightNode.val) { + return true + } + } + + return false +} +``` +**迭代** +```swift +func hasPathSum(_ root: TreeNode?, _ targetSum: Int) -> Bool { + guard let root = root else { + return false + } + + var stack = Array<(TreeNode, Int)>() + stack.append((root, root.val)) + + while !stack.isEmpty { + let node = stack.removeLast() + + if node.0.left == nil && node.0.right == nil && targetSum == node.1 { + return true + } + + if let rightNode = node.0.right { + stack.append((rightNode, node.1 + rightNode.val)) + } + + if let leftNode = node.0.left { + stack.append((leftNode, node.1 + leftNode.val)) + } + } + + return false +} +``` + +0113.路径总和 II + +**递归** + +```swift +var result = [[Int]]() +var path = [Int]() +func pathSum(_ root: TreeNode?, _ targetSum: Int) -> [[Int]] { + result.removeAll() + path.removeAll() + guard let root = root else { + return result + } + path.append(root.val) + traversal(root, count: targetSum - root.val) + return result + +} + +func traversal(_ cur: TreeNode?, count: Int) { + var count = count + // 遇到了叶子节点且找到了和为targetSum的路径 + if cur?.left == nil && cur?.right == nil && count == 0 { + result.append(path) + return + } + + // 遇到叶子节点而没有找到合适的边,直接返回 + if cur?.left == nil && cur?.right == nil{ + return + } + + if let leftNode = cur?.left { + path.append(leftNode.val) + count -= leftNode.val + traversal(leftNode, count: count)// 递归 + count += leftNode.val// 回溯 + path.removeLast()// 回溯 + } + + if let rightNode = cur?.right { + path.append(rightNode.val) + count -= rightNode.val + traversal(rightNode, count: count)// 递归 + count += rightNode.val// 回溯 + path.removeLast()// 回溯 + } + return +} +``` From ac9f8c612033d87221e1fc79ce093211a1f5570b Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Mon, 24 Jan 2022 15:51:26 +0800 Subject: [PATCH 0301/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880239.?= =?UTF-8?q?=E6=BB=91=E5=8A=A8=E7=AA=97=E5=8F=A3=E6=9C=80=E5=A4=A7=E5=80=BC?= =?UTF-8?q?.md=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...43\346\234\200\345\244\247\345\200\274.md" | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git "a/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" "b/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" index d9788f6328..6e8039f403 100644 --- "a/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" +++ "b/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" @@ -418,7 +418,56 @@ var maxSlidingWindow = function (nums, k) { }; ``` +TypeScript: + +```typescript +function maxSlidingWindow(nums: number[], k: number): number[] { + /** 单调递减队列 */ + class MonoQueue { + private queue: number[]; + constructor() { + this.queue = []; + }; + /** 入队:value如果大于队尾元素,则将队尾元素删除,直至队尾元素大于value,或者队列为空 */ + public enqueue(value: number): void { + let back: number | undefined = this.queue[this.queue.length - 1]; + while (back !== undefined && back < value) { + this.queue.pop(); + back = this.queue[this.queue.length - 1]; + } + this.queue.push(value); + }; + /** 出队:只有当队头元素等于value,才出队 */ + public dequeue(value: number): void { + let top: number | undefined = this.top(); + if (top !== undefined && top === value) { + this.queue.shift(); + } + } + public top(): number | undefined { + return this.queue[0]; + } + } + const helperQueue: MonoQueue = new MonoQueue(); + let i: number = 0, + j: number = 0; + let resArr: number[] = []; + while (j < k) { + helperQueue.enqueue(nums[j++]); + } + resArr.push(helperQueue.top()!); + while (j < nums.length) { + helperQueue.enqueue(nums[j]); + helperQueue.dequeue(nums[i]); + resArr.push(helperQueue.top()!); + j++, i++; + } + return resArr; +}; +``` + Swift: + ```Swift /// 双向链表 class DoublyListNode { From a12ad31f46c082f35a88441d65ef322740d12520 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Mon, 24 Jan 2022 16:03:36 +0800 Subject: [PATCH 0302/3019] =?UTF-8?q?=E4=BF=AE=E6=94=B9=EF=BC=880239.?= =?UTF-8?q?=E6=BB=91=E5=8A=A8=E7=AA=97=E5=8F=A3=E6=9C=80=E5=A4=A7=E5=80=BC?= =?UTF-8?q?.md=EF=BC=89=EF=BC=9A=E8=A7=84=E8=8C=83=E5=8C=96js=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...43\346\234\200\345\244\247\345\200\274.md" | 61 +++++++++++++------ 1 file changed, 42 insertions(+), 19 deletions(-) diff --git "a/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" "b/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" index 6e8039f403..adf3548cbb 100644 --- "a/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" +++ "b/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" @@ -395,26 +395,49 @@ func maxSlidingWindow(nums []int, k int) []int { Javascript: ```javascript +/** + * @param {number[]} nums + * @param {number} k + * @return {number[]} + */ var maxSlidingWindow = function (nums, k) { - // 队列数组(存放的是元素下标,为了取值方便) - const q = []; - // 结果数组 - const ans = []; - for (let i = 0; i < nums.length; i++) { - // 若队列不为空,且当前元素大于等于队尾所存下标的元素,则弹出队尾 - while (q.length && nums[i] >= nums[q[q.length - 1]]) { - q.pop(); - } - // 入队当前元素下标 - q.push(i); - // 判断当前最大值(即队首元素)是否在窗口中,若不在便将其出队 - if (q[0] <= i - k) { - q.shift(); - } - // 当达到窗口大小时便开始向结果中添加数据 - if (i >= k - 1) ans.push(nums[q[0]]); - } - return ans; + class MonoQueue { + queue; + constructor() { + this.queue = []; + } + enqueue(value) { + let back = this.queue[this.queue.length - 1]; + while (back !== undefined && back < value) { + this.queue.pop(); + back = this.queue[this.queue.length - 1]; + } + this.queue.push(value); + } + dequeue(value) { + let front = this.front(); + if (front === value) { + this.queue.shift(); + } + } + front() { + return this.queue[0]; + } + } + let helperQueue = new MonoQueue(); + let i = 0, j = 0; + let resArr = []; + while (j < k) { + helperQueue.enqueue(nums[j++]); + } + resArr.push(helperQueue.front()); + while (j < nums.length) { + helperQueue.enqueue(nums[j]); + helperQueue.dequeue(nums[i]); + resArr.push(helperQueue.front()); + i++, j++; + } + return resArr; }; ``` From 9272063cf2627a6334cea807cd3de2e7166da1af Mon Sep 17 00:00:00 2001 From: YDLIN <1924723909@qq.com> Date: Mon, 24 Jan 2022 16:42:47 +0800 Subject: [PATCH 0303/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200654.=20?= =?UTF-8?q?=E6=9C=80=E5=A4=A7=E4=BA=8C=E5=8F=89=E6=A0=91=20Swift=20?= =?UTF-8?q?=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...47\344\272\214\345\217\211\346\240\221.md" | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git "a/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" "b/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" index b4679c7d1f..44c74f8903 100644 --- "a/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" @@ -401,6 +401,33 @@ struct TreeNode* constructMaximumBinaryTree(int* nums, int numsSize){ } ``` +## Swift +```swift +func constructMaximumBinaryTree(_ nums: inout [Int]) -> TreeNode? { + return traversal(&nums, 0, nums.count) +} + +func traversal(_ nums: inout [Int], _ left: Int, _ right: Int) -> TreeNode? { + if left >= right { + return nil + } + + var maxValueIndex = left + for i in (left + 1).. nums[maxValueIndex] { + maxValueIndex = i + } + } + + let root = TreeNode(nums[maxValueIndex]) + + root.left = traversal(&nums, left, maxValueIndex) + root.right = traversal(&nums, maxValueIndex + 1, right) + return root +} +``` + + -----------------------
From fee948b2af53b7bfc583fbbe5c43cd98c04e462f Mon Sep 17 00:00:00 2001 From: Guanzhong Pan Date: Mon, 24 Jan 2022 08:57:02 +0000 Subject: [PATCH 0304/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200005.=E6=9C=80?= =?UTF-8?q?=E9=95=BF=E5=9B=9E=E6=96=87=E5=AD=90=E4=B8=B2.md=20C=E8=AF=AD?= =?UTF-8?q?=E8=A8=80=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...36\346\226\207\345\255\220\344\270\262.md" | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git "a/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" "b/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" index f204a60784..588afc22f6 100644 --- "a/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" +++ "b/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" @@ -462,7 +462,56 @@ var longestPalindrome = function(s) { }; ``` +## C +动态规划: +```c +//初始化dp数组,全部初始为false +bool **initDP(int strLen) { + bool **dp = (bool **)malloc(sizeof(bool *) * strLen); + int i, j; + for(i = 0; i < strLen; ++i) { + dp[i] = (bool *)malloc(sizeof(bool) * strLen); + for(j = 0; j < strLen; ++j) + dp[i][j] = false; + } + return dp; +} +char * longestPalindrome(char * s){ + //求出字符串长度 + int strLen = strlen(s); + //初始化dp数组,元素初始化为false + bool **dp = initDP(strLen); + int maxLength = 0, left = 0, right = 0; + + //从下到上,从左到右遍历 + int i, j; + for(i = strLen - 1; i >= 0; --i) { + for(j = i; j < strLen; ++j) { + //若当前i与j所指字符一样 + if(s[i] == s[j]) { + //若i、j指向相邻字符或同一字符,则为回文字符串 + if(j - i <= 1) + dp[i][j] = true; + //若i+1与j-1所指字符串为回文字符串,则i、j所指字符串为回文字符串 + else if(dp[i + 1][j - 1]) + dp[i][j] = true; + } + //若新的字符串的长度大于之前的最大长度,进行更新 + if(dp[i][j] && j - i + 1 > maxLength) { + maxLength = j - i + 1; + left = i; + right = j; + } + } + } + //复制回文字符串,并返回 + char *ret = (char*)malloc(sizeof(char) * (maxLength + 1)); + memcpy(ret, s + left, maxLength); + ret[maxLength] = 0; + return ret; +} +``` -----------------------
From 60c3a27ce9537d7361e4927b21129bf77be507ba Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Mon, 24 Jan 2022 17:39:34 +0800 Subject: [PATCH 0305/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880347.?= =?UTF-8?q?=E5=89=8DK=E4=B8=AA=E9=AB=98=E9=A2=91=E5=85=83=E7=B4=A0.md?= =?UTF-8?q?=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...3\230\351\242\221\345\205\203\347\264\240.md" | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git "a/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" "b/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" index 8bd774e94d..1d6a358bfc 100644 --- "a/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" +++ "b/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" @@ -358,6 +358,22 @@ PriorityQueue.prototype.compare = function(index1, index2) { } ``` +TypeScript: + +```typescript +function topKFrequent(nums: number[], k: number): number[] { + const countMap: Map = new Map(); + for (let num of nums) { + countMap.set(num, (countMap.get(num) || 0) + 1); + } + // tS没有最小堆的数据结构,所以直接对整个数组进行排序,取前k个元素 + return [...countMap.entries()] + .sort((a, b) => b[1] - a[1]) + .slice(0, k) + .map(i => i[0]); +}; +``` + ----------------------- From de37c44f4fbc6b368f1afe6a51e508c949ff9271 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Mon, 24 Jan 2022 19:41:17 +0800 Subject: [PATCH 0306/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=88=E4=BA=8C?= =?UTF-8?q?=E5=8F=89=E6=A0=91=E7=90=86=E8=AE=BA=E5=9F=BA=E7=A1=80.md?= =?UTF-8?q?=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...0\206\350\256\272\345\237\272\347\241\200.md" | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" index cc89985092..009e8276f9 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -227,7 +227,23 @@ function TreeNode(val, left, right) { } ``` +TypeScript: + +```typescript +class TreeNode { + public val: number; + public left: TreeNode | null; + public right: TreeNode | null; + constructor(val?: number, left?: TreeNode, right?: TreeNode) { + this.val = val === undefined ? 0 : val; + this.left = left === undefined ? null : left; + this.right = right === undefined ? null : right; + } +} +``` + Swift: + ```Swift class TreeNode { var value: T From a488a3414a8c0e3408678f8393b116837e6240ea Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Mon, 24 Jan 2022 20:25:45 +0800 Subject: [PATCH 0307/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=88=E4=BA=8C?= =?UTF-8?q?=E5=8F=89=E6=A0=91=E7=9A=84=E9=80=92=E5=BD=92=E9=81=8D=E5=8E=86?= =?UTF-8?q?.md=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...22\345\275\222\351\201\215\345\216\206.md" | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" index 4beed6503c..ba13fc74c5 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" @@ -358,7 +358,51 @@ var postorderTraversal = function(root) { }; ``` +TypeScript: + +```typescript +// 前序遍历 +function preorderTraversal(node: TreeNode | null): number[] { + function traverse(node: TreeNode | null, res: number[]): void { + if (node === null) return; + res.push(node.val); + traverse(node.left, res); + traverse(node.right, res); + } + const res: number[] = []; + traverse(node, res); + return res; +} + +// 中序遍历 +function inorderTraversal(node: TreeNode | null): number[] { + function traverse(node: TreeNode | null, res: number[]): void { + if (node === null) return; + traverse(node.left, res); + res.push(node.val); + traverse(node.right, res); + } + const res: number[] = []; + traverse(node, res); + return res; +} + +// 后序遍历 +function postorderTraversal(node: TreeNode | null): number[] { + function traverse(node: TreeNode | null, res: number[]): void { + if (node === null) return; + traverse(node.left, res); + traverse(node.right, res); + res.push(node.val); + } + const res: number[] = []; + traverse(node, res); + return res; +} +``` + C: + ```c //前序遍历: void preOrderTraversal(struct TreeNode* root, int* ret, int* returnSize) { From fec8e0882a771ea5866e0611c01874d6850654e6 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Mon, 24 Jan 2022 20:27:15 +0800 Subject: [PATCH 0308/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=88=E4=BA=8C?= =?UTF-8?q?=E5=8F=89=E6=A0=91=E7=9A=84=E9=80=92=E5=BD=92=E9=81=8D=E5=8E=86?= =?UTF-8?q?.md=EF=BC=89=EF=BC=9A=E5=88=A0=E9=99=A4=E5=A4=9A=E4=BD=99?= =?UTF-8?q?=E7=9A=84js=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...22\345\275\222\351\201\215\345\216\206.md" | 34 ------------------- 1 file changed, 34 deletions(-) diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" index ba13fc74c5..c481fd1181 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" @@ -270,40 +270,6 @@ func postorderTraversal(root *TreeNode) (res []int) { } ``` -javaScript: - -```js - -前序遍历: - -var preorderTraversal = function(root, res = []) { - if (!root) return res; - res.push(root.val); - preorderTraversal(root.left, res) - preorderTraversal(root.right, res) - return res; -}; - -中序遍历: - -var inorderTraversal = function(root, res = []) { - if (!root) return res; - inorderTraversal(root.left, res); - res.push(root.val); - inorderTraversal(root.right, res); - return res; -}; - -后序遍历: - -var postorderTraversal = function(root, res = []) { - if (!root) return res; - postorderTraversal(root.left, res); - postorderTraversal(root.right, res); - res.push(root.val); - return res; -}; -``` Javascript版本: 前序遍历: From 1efb77e96310d884eb2b8647232dd1586f4f0afb Mon Sep 17 00:00:00 2001 From: zucong Date: Tue, 25 Jan 2022 14:33:12 +0800 Subject: [PATCH 0309/3019] =?UTF-8?q?=E4=BC=98=E5=8C=96=200112.=E8=B7=AF?= =?UTF-8?q?=E5=BE=84=E6=80=BB=E5=92=8C=20Go=E7=89=88=E6=9C=AC=E8=A7=A3?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...57\345\276\204\346\200\273\345\222\214.md" | 101 +++++++----------- 1 file changed, 41 insertions(+), 60 deletions(-) diff --git "a/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" "b/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" index 910e57c86f..b3e121babd 100644 --- "a/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" +++ "b/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" @@ -531,82 +531,63 @@ class solution: ```go //递归法 /** - * definition for a binary tree node. - * type treenode struct { - * val int - * left *treenode - * right *treenode + * Definition for a binary tree node. + * type TreeNode struct { + * Val int + * Left *TreeNode + * Right *TreeNode * } */ -func haspathsum(root *treenode, targetsum int) bool { - var flage bool //找没找到的标志 - if root==nil{ - return flage - } - pathsum(root,0,targetsum,&flage) - return flage -} -func pathsum(root *treenode, sum int,targetsum int,flage *bool){ - sum+=root.val - if root.left==nil&&root.right==nil&&sum==targetsum{ - *flage=true - return +func hasPathSum(root *TreeNode, targetSum int) bool { + if root == nil { + return false } - if root.left!=nil&&!(*flage){//左节点不为空且还没找到 - pathsum(root.left,sum,targetsum,flage) - } - if root.right!=nil&&!(*flage){//右节点不为空且没找到 - pathsum(root.right,sum,targetsum,flage) + + targetSum -= root.Val // 将targetSum在遍历每层的时候都减去本层节点的值 + if root.Left == nil && root.Right == nil && targetSum == 0 { // 如果剩余的targetSum为0, 则正好就是符合的结果 + return true } + return hasPathSum(root.Left, targetSum) || hasPathSum(root.Right, targetSum) // 否则递归找 } ``` -113 递归法 +113. 路径总和 II ```go /** - * definition for a binary tree node. - * type treenode struct { - * val int - * left *treenode - * right *treenode + * Definition for a binary tree node. + * type TreeNode struct { + * Val int + * Left *TreeNode + * Right *TreeNode * } */ -func pathsum(root *treenode, targetsum int) [][]int { - var result [][]int//最终结果 - if root==nil{ - return result - } - var sumnodes []int//经过路径的节点集合 - haspathsum(root,&sumnodes,targetsum,&result) +func pathSum(root *TreeNode, targetSum int) [][]int { + result := make([][]int, 0) + traverse(root, &result, new([]int), targetSum) return result } -func haspathsum(root *treenode,sumnodes *[]int,targetsum int,result *[][]int){ - *sumnodes=append(*sumnodes,root.val) - if root.left==nil&&root.right==nil{//叶子节点 - fmt.println(*sumnodes) - var sum int - var number int - for k,v:=range *sumnodes{//求该路径节点的和 - sum+=v - number=k - } - tempnodes:=make([]int,number+1)//新的nodes接受指针里的值,防止最终指针里的值发生变动,导致最后的结果都是最后一个sumnodes的值 - for k,v:=range *sumnodes{ - tempnodes[k]=v - } - if sum==targetsum{ - *result=append(*result,tempnodes) - } - } - if root.left!=nil{ - haspathsum(root.left,sumnodes,targetsum,result) - *sumnodes=(*sumnodes)[:len(*sumnodes)-1]//回溯 + +func traverse(node *TreeNode, result *[][]int, currPath *[]int, targetSum int) { + if node == nil { // 这个判空也可以挪到递归遍历左右子树时去判断 + return } - if root.right!=nil{ - haspathsum(root.right,sumnodes,targetsum,result) - *sumnodes=(*sumnodes)[:len(*sumnodes)-1]//回溯 + + targetSum -= node.Val // 将targetSum在遍历每层的时候都减去本层节点的值 + *currPath = append(*currPath, node.Val) // 把当前节点放到路径记录里 + + if node.Left == nil && node.Right == nil && targetSum == 0 { // 如果剩余的targetSum为0, 则正好就是符合的结果 + // 不能直接将currPath放到result里面, 因为currPath是共享的, 每次遍历子树时都会被修改 + pathCopy := make([]int, len(*currPath)) + for i, element := range *currPath { + pathCopy[i] = element + } + *result = append(*result, pathCopy) // 将副本放到结果集里 } + + traverse(node.Left, result, currPath, targetSum) + traverse(node.Right, result, currPath, targetSum) + *currPath = (*currPath)[:len(*currPath)-1] // 当前节点遍历完成, 从路径记录里删除掉 } ``` From 3a46ffdad4cfcc2bc3695db93f4760b9ae70b4d2 Mon Sep 17 00:00:00 2001 From: Guanzhong Pan Date: Tue, 25 Jan 2022 12:54:50 +0000 Subject: [PATCH 0310/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200005.=E6=9C=80?= =?UTF-8?q?=E9=95=BF=E5=9B=9E=E6=96=87=E5=AD=90=E4=B8=B2.md=20C=E8=AF=AD?= =?UTF-8?q?=E8=A8=80=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 --- ...36\346\226\207\345\255\220\344\270\262.md" | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git "a/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" "b/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" index 588afc22f6..99458825e5 100644 --- "a/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" +++ "b/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" @@ -513,5 +513,41 @@ char * longestPalindrome(char * s){ } ``` +双指针: +```c +int left, maxLength; +void extend(char *str, int i, int j, int size) { + while(i >= 0 && j < size && str[i] == str[j]) { + //若当前子字符串长度大于最长的字符串长度,进行更新 + if(j - i + 1 > maxLength) { + maxLength = j - i + 1; + left = i; + } + //左指针左移,右指针右移。扩大搜索范围 + ++j, --i; + } +} + +char * longestPalindrome(char * s){ + left = right = maxLength = 0; + int size = strlen(s); + + int i; + for(i = 0; i < size; ++i) { + //长度为单数的子字符串 + extend(s, i, i, size); + //长度为双数的子字符串 + extend(s, i, i + 1, size); + } + + //复制子字符串 + char *subStr = (char *)malloc(sizeof(char) * (maxLength + 1)); + memcpy(subStr, s + left, maxLength); + subStr[maxLength] = 0; + + return subStr; +} +``` + -----------------------
From d40a15eccca9212f701c4602a514168ab52fecf6 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Wed, 26 Jan 2022 10:40:30 +0800 Subject: [PATCH 0311/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=88=E4=BA=8C?= =?UTF-8?q?=E5=8F=89=E6=A0=91=E7=9A=84=E8=BF=AD=E4=BB=A3=E9=81=8D=E5=8E=86?= =?UTF-8?q?.md=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...55\344\273\243\351\201\215\345\216\206.md" | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" index 4cb94cb5e3..ba38726bea 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" @@ -454,6 +454,61 @@ var postorderTraversal = function(root, res = []) { }; ``` +TypeScript: + +```typescript +// 前序遍历(迭代法) +function preorderTraversal(root: TreeNode | null): number[] { + if (root === null) return []; + let res: number[] = []; + let helperStack: TreeNode[] = []; + let curNode: TreeNode = root; + helperStack.push(curNode); + while (helperStack.length > 0) { + curNode = helperStack.pop()!; + res.push(curNode.val); + if (curNode.right !== null) helperStack.push(curNode.right); + if (curNode.left !== null) helperStack.push(curNode.left); + } + return res; +}; + +// 中序遍历(迭代法) +function inorderTraversal(root: TreeNode | null): number[] { + let helperStack: TreeNode[] = []; + let res: number[] = []; + if (root === null) return res; + let curNode: TreeNode | null = root; + while (curNode !== null || helperStack.length > 0) { + if (curNode !== null) { + helperStack.push(curNode); + curNode = curNode.left; + } else { + curNode = helperStack.pop()!; + res.push(curNode.val); + curNode = curNode.right; + } + } + return res; +}; + +// 后序遍历(迭代法) +function postorderTraversal(root: TreeNode | null): number[] { + let helperStack: TreeNode[] = []; + let res: number[] = []; + let curNode: TreeNode; + if (root === null) return res; + helperStack.push(root); + while (helperStack.length > 0) { + curNode = helperStack.pop()!; + res.push(curNode.val); + if (curNode.left !== null) helperStack.push(curNode.left); + if (curNode.right !== null) helperStack.push(curNode.right); + } + return res.reverse(); +}; +``` + Swift: > 迭代法前序遍历 From 9d09b11d56722748e00d3647cdcd228793baaa66 Mon Sep 17 00:00:00 2001 From: Guanzhong Pan Date: Wed, 26 Jan 2022 09:26:03 +0000 Subject: [PATCH 0312/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200143.=E9=87=8D?= =?UTF-8?q?=E6=8E=92=E9=93=BE=E8=A1=A8.md=20C=E8=AF=AD=E8=A8=80=E8=A7=A3?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...15\346\216\222\351\223\276\350\241\250.md" | 68 +++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git "a/problems/0143.\351\207\215\346\216\222\351\223\276\350\241\250.md" "b/problems/0143.\351\207\215\346\216\222\351\223\276\350\241\250.md" index 4ea9cb97a9..0062262328 100644 --- "a/problems/0143.\351\207\215\346\216\222\351\223\276\350\241\250.md" +++ "b/problems/0143.\351\207\215\346\216\222\351\223\276\350\241\250.md" @@ -439,7 +439,75 @@ var reorderList = function(head, s = [], tmp) { } ``` +### C +方法三:反转链表 +```c +//翻转链表 +struct ListNode *reverseList(struct ListNode *head) { + if(!head) + return NULL; + struct ListNode *preNode = NULL, *curNode = head; + while(curNode) { + //创建tempNode记录curNode->next(即将被更新) + struct ListNode* tempNode = curNode->next; + //将curNode->next指向preNode + curNode->next = preNode; + //更新preNode为curNode + preNode = curNode; + //curNode更新为原链表中下一个元素 + curNode = tempNode; + } + return preNode; +} + +void reorderList(struct ListNode* head){ + //slow用来截取到链表的中间节点(第一个链表的最后节点),每次循环跳一个节点。fast用来辅助,每次循环跳两个节点 + struct ListNode *fast = head, *slow = head; + while(fast && fast->next && fast->next->next) { + //fast每次跳两个节点 + fast = fast->next->next; + //slow每次跳一个节点 + slow = slow->next; + } + //将slow->next后的节点翻转 + struct ListNode *sndLst = reverseList(slow->next); + //将第一个链表与第二个链表断开 + slow->next = NULL; + //因为插入从curNode->next开始,curNode刚开始已经head。所以fstList要从head->next开始 + struct ListNode *fstLst = head->next; + struct ListNode *curNode = head; + + int count = 0; + //当第一个链表和第二个链表中都有节点时循环 + while(sndLst && fstLst) { + //count为奇数,插入fstLst中的节点 + if(count % 2) { + curNode->next = fstLst; + fstLst = fstLst->next; + } + //count为偶数,插入sndList的节点 + else { + curNode->next = sndLst; + sndLst = sndLst->next; + } + //设置下一个节点 + curNode = curNode->next; + //更新count + ++count; + } + //若两个链表fstList和sndLst中还有节点,将其放入链表 + if(fstLst) { + curNode->next = fstLst; + } + if(sndLst) { + curNode->next = sndLst; + } + + //返回链表 + return head; +} +``` ----------------------- From 7ed2a3aef7b10b48fe7f8127f185f4a6efc9952c Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Wed, 26 Jan 2022 19:18:23 +0800 Subject: [PATCH 0313/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=88=E4=BA=8C?= =?UTF-8?q?=E5=8F=89=E6=A0=91=E7=9A=84=E7=BB=9F=E4=B8=80=E8=BF=AD=E4=BB=A3?= =?UTF-8?q?=E6=B3=95.md=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript?= =?UTF-8?q?=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...00\350\277\255\344\273\243\346\263\225.md" | 68 +++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\347\273\237\344\270\200\350\277\255\344\273\243\346\263\225.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\347\273\237\344\270\200\350\277\255\344\273\243\346\263\225.md" index 2ff848179f..f6edf586ea 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\347\273\237\344\270\200\350\277\255\344\273\243\346\263\225.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\347\273\237\344\270\200\350\277\255\344\273\243\346\263\225.md" @@ -522,7 +522,75 @@ var postorderTraversal = function(root, res = []) { ``` +TypeScript: + +```typescript +// 前序遍历(迭代法) +function preorderTraversal(root: TreeNode | null): number[] { + let helperStack: (TreeNode | null)[] = []; + let res: number[] = []; + let curNode: TreeNode | null; + if (root === null) return res; + helperStack.push(root); + while (helperStack.length > 0) { + curNode = helperStack.pop()!; + if (curNode !== null) { + if (curNode.right !== null) helperStack.push(curNode.right); + helperStack.push(curNode); + helperStack.push(null); + if (curNode.left !== null) helperStack.push(curNode.left); + } else { + curNode = helperStack.pop()!; + res.push(curNode.val); + } + } + return res; +}; + +// 中序遍历(迭代法) +function inorderTraversal(root: TreeNode | null): number[] { + let helperStack: (TreeNode | null)[] = []; + let res: number[] = []; + let curNode: TreeNode | null; + if (root === null) return res; + helperStack.push(root); + while (helperStack.length > 0) { + curNode = helperStack.pop()!; + if (curNode !== null) { + if (curNode.right !== null) helperStack.push(curNode.right); + helperStack.push(curNode); + helperStack.push(null); + if (curNode.left !== null) helperStack.push(curNode.left); + } else { + curNode = helperStack.pop()!; + res.push(curNode.val); + } + } + return res; +}; +// 后序遍历(迭代法) +function postorderTraversal(root: TreeNode | null): number[] { + let helperStack: (TreeNode | null)[] = []; + let res: number[] = []; + let curNode: TreeNode | null; + if (root === null) return res; + helperStack.push(root); + while (helperStack.length > 0) { + curNode = helperStack.pop()!; + if (curNode !== null) { + if (curNode.right !== null) helperStack.push(curNode.right); + helperStack.push(curNode); + helperStack.push(null); + if (curNode.left !== null) helperStack.push(curNode.left); + } else { + curNode = helperStack.pop()!; + res.push(curNode.val); + } + } + return res; +}; +``` -----------------------
From 878231551829fdd9deea2f2457eb09b794d7ed65 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Wed, 26 Jan 2022 21:20:36 +0800 Subject: [PATCH 0314/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880102.?= =?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=A0=91=E7=9A=84=E5=B1=82=E5=BA=8F=E9=81=8D?= =?UTF-8?q?=E5=8E=86.md=20&=20107.=E4=BA=8C=E5=8F=89=E6=A0=91=E7=9A=84?= =?UTF-8?q?=E5=B1=82=E6=AC=A1=E9=81=8D=E5=8E=86=20II=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...02\345\272\217\351\201\215\345\216\206.md" | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" index 1fb9b633af..b108c8f090 100644 --- "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" +++ "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" @@ -246,7 +246,35 @@ var levelOrder = function(root) { ``` +TypeScript: + +```typescript +function levelOrder(root: TreeNode | null): number[][] { + let helperQueue: TreeNode[] = []; + let res: number[][] = []; + let tempArr: number[] = []; + if (root !== null) helperQueue.push(root); + let curNode: TreeNode; + while (helperQueue.length > 0) { + for (let i = 0, length = helperQueue.length; i < length; i++) { + curNode = helperQueue.shift()!; + tempArr.push(curNode.val); + if (curNode.left !== null) { + helperQueue.push(curNode.left); + } + if (curNode.right !== null) { + helperQueue.push(curNode.right); + } + } + res.push(tempArr); + tempArr = []; + } + return res; +}; +``` + Swift: + ```swift func levelOrder(_ root: TreeNode?) -> [[Int]] { var res = [[Int]]() @@ -454,7 +482,31 @@ var levelOrderBottom = function(root) { }; ``` +TypeScript: + +```typescript +function levelOrderBottom(root: TreeNode | null): number[][] { + let helperQueue: TreeNode[] = []; + let resArr: number[][] = []; + let tempArr: number[] = []; + let tempNode: TreeNode; + if (root !== null) helperQueue.push(root); + while (helperQueue.length > 0) { + for (let i = 0, length = helperQueue.length; i < length; i++) { + tempNode = helperQueue.shift()!; + tempArr.push(tempNode.val); + if (tempNode.left !== null) helperQueue.push(tempNode.left); + if (tempNode.right !== null) helperQueue.push(tempNode.right); + } + resArr.push(tempArr); + tempArr = []; + } + return resArr.reverse(); +}; +``` + Swift: + ```swift func levelOrderBottom(_ root: TreeNode?) -> [[Int]] { var res = [[Int]]() From bb02fb957bfef34ffc7270e70b4cf41b829ed3a6 Mon Sep 17 00:00:00 2001 From: Guanzhong Pan Date: Wed, 26 Jan 2022 23:13:07 +0000 Subject: [PATCH 0315/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200052.N=E7=9A=87?= =?UTF-8?q?=E5=90=8EII.md=20C=E8=AF=AD=E8=A8=80=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0052.N\347\232\207\345\220\216II.md" | 60 +++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git "a/problems/0052.N\347\232\207\345\220\216II.md" "b/problems/0052.N\347\232\207\345\220\216II.md" index 78531798c4..67e439ca81 100644 --- "a/problems/0052.N\347\232\207\345\220\216II.md" +++ "b/problems/0052.N\347\232\207\345\220\216II.md" @@ -143,5 +143,65 @@ var totalNQueens = function(n) { return count; }; ``` + +C +```c +//path[i]为在i行,path[i]列上存在皇后 +int *path; +int pathTop; +int answer; +//检查当前level行index列放置皇后是否合法 +int isValid(int index, int level) { + int i; + //updater为若斜角存在皇后,其所应在的列 + //用来检查左上45度是否存在皇后 + int lCornerUpdater = index - level; + //用来检查右上135度是否存在皇后 + int rCornerUpdater = index + level; + for(i = 0; i < pathTop; ++i) { + //path[i] == index检查index列是否存在皇后 + //检查斜角皇后:只要path[i] == updater,就说明当前位置不可放置皇后。 + //path[i] == lCornerUpdater检查左上角45度是否有皇后 + //path[i] == rCornerUpdater检查右上角135度是否有皇后 + if(path[i] == index || path[i] == lCornerUpdater || path[i] == rCornerUpdater) + return 0; + //更新updater指向下一行对应的位置 + ++lCornerUpdater; + --rCornerUpdater; + } + return 1; +} + +//回溯算法:level为当前皇后行数 +void backTracking(int n, int level) { + //若path中元素个数已经为n,则证明有一种解法。answer+1 + if(pathTop == n) { + ++answer; + return; + } + + int i; + for(i = 0; i < n; ++i) { + //若当前level行,i列是合法的放置位置。就将i放入path中 + if(isValid(i, level)) { + path[pathTop++] = i; + backTracking(n, level + 1); + //回溯 + --pathTop; + } + } +} + +int totalNQueens(int n){ + answer = 0; + pathTop = 0; + path = (int *)malloc(sizeof(int) * n); + + backTracking(n, 0); + + return answer; +} +``` + -----------------------
From 023ec6900a759e030712edf5362b65569935df75 Mon Sep 17 00:00:00 2001 From: Guanzhong Pan Date: Thu, 27 Jan 2022 13:43:43 +0000 Subject: [PATCH 0316/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200129.=E6=B1=82?= =?UTF-8?q?=E6=A0=B9=E5=88=B0=E5=8F=B6=E5=AD=90=E8=8A=82=E7=82=B9=E6=95=B0?= =?UTF-8?q?=E5=AD=97=E4=B9=8B=E5=92=8C.md=20C=E8=AF=AD=E8=A8=80=E8=A7=A3?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...60\345\255\227\344\271\213\345\222\214.md" | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git "a/problems/0129.\346\261\202\346\240\271\345\210\260\345\217\266\345\255\220\350\212\202\347\202\271\346\225\260\345\255\227\344\271\213\345\222\214.md" "b/problems/0129.\346\261\202\346\240\271\345\210\260\345\217\266\345\255\220\350\212\202\347\202\271\346\225\260\345\255\227\344\271\213\345\222\214.md" index d07d524462..980779c20c 100644 --- "a/problems/0129.\346\261\202\346\240\271\345\210\260\345\217\266\345\255\220\350\212\202\347\202\271\346\225\260\345\255\227\344\271\213\345\222\214.md" +++ "b/problems/0129.\346\261\202\346\240\271\345\210\260\345\217\266\345\255\220\350\212\202\347\202\271\346\225\260\345\255\227\344\271\213\345\222\214.md" @@ -289,7 +289,33 @@ var sumNumbers = function(root) { }; ``` +C: +```c +//sum记录总和 +int sum; +void traverse(struct TreeNode *node, int val) { + //更新val为根节点到当前节点的和 + val = val * 10 + node->val; + //若当前节点为叶子节点,记录val + if(!node->left && !node->right) { + sum+=val; + return; + } + //若有左/右节点,遍历左/右节点 + if(node->left) + traverse(node->left, val); + if(node->right) + traverse(node->right, val); +} + +int sumNumbers(struct TreeNode* root){ + sum = 0; + + traverse(root, 0); + return sum; +} +``` -----------------------
From 7fe4ea3fbc3d93665e2ed5663a1c41c6f21d5874 Mon Sep 17 00:00:00 2001 From: Guanzhong Pan Date: Thu, 27 Jan 2022 19:32:30 +0000 Subject: [PATCH 0317/3019] =?UTF-8?q?Add=200209.=E9=95=BF=E5=BA=A6?= =?UTF-8?q?=E6=9C=80=E5=B0=8F=E7=9A=84=E5=AD=90=E6=95=B0=E7=BB=84.md=20C?= =?UTF-8?q?=E8=AF=AD=E8=A8=80=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...04\345\255\220\346\225\260\347\273\204.md" | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git "a/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" "b/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" index 17422ca06b..dc1d9f18d0 100644 --- "a/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" +++ "b/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" @@ -330,5 +330,55 @@ def min_sub_array_len(target, nums) end ``` +C: +暴力解法: +```c +int minSubArrayLen(int target, int* nums, int numsSize){ + //初始化最小长度为INT_MAX + int minLength = INT_MAX; + int sum; + + int left, right; + for(left = 0; left < numsSize; ++left) { + //每次遍历都清零sum,计算当前位置后和>=target的子数组的长度 + sum = 0; + //从left开始,sum中添加元素 + for(right = left; right < numsSize; ++right) { + sum += nums[right]; + //若加入当前元素后,和大于target,则更新minLength + if(sum >= target) { + int subLength = right - left + 1; + minLength = minLength < subLength ? minLength : subLength; + } + } + } + //若minLength不为INT_MAX,则返回minLnegth + return minLength == INT_MAX ? 0 : minLength; +} +``` + +滑动窗口: +```c +int minSubArrayLen(int target, int* nums, int numsSize){ + //初始化最小长度为INT_MAX + int minLength = INT_MAX; + int sum = 0; + + int left = 0, right = 0; + //右边界向右扩展 + for(; right < numsSize; ++right) { + sum += nums[right]; + //当sum的值大于等于target时,保存长度,并且收缩左边界 + while(sum >= target) { + int subLength = right - left + 1; + minLength = minLength < subLength ? minLength : subLength; + sum -= nums[left++]; + } + } + //若minLength不为INT_MAX,则返回minLnegth + return minLength == INT_MAX ? 0 : minLength; +} +``` + -----------------------
From e177bca526cd33ff4dce70b188f2214598941b0e Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Thu, 27 Jan 2022 22:35:30 +0800 Subject: [PATCH 0318/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=88199.?= =?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=A0=91=E7=9A=84=E5=8F=B3=E8=A7=86=E5=9B=BE?= =?UTF-8?q?=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...02\345\272\217\351\201\215\345\216\206.md" | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" index b108c8f090..18e19227b7 100644 --- "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" +++ "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" @@ -709,7 +709,28 @@ var rightSideView = function(root) { }; ``` +TypeScript: + +```typescript +function rightSideView(root: TreeNode | null): number[] { + let helperQueue: TreeNode[] = []; + let resArr: number[] = []; + let tempNode: TreeNode; + if (root !== null) helperQueue.push(root); + while (helperQueue.length > 0) { + for (let i = 0, length = helperQueue.length; i < length; i++) { + tempNode = helperQueue.shift()!; + if (i === length - 1) resArr.push(tempNode.val); + if (tempNode.left !== null) helperQueue.push(tempNode.left); + if (tempNode.right !== null) helperQueue.push(tempNode.right); + } + } + return resArr; +}; +``` + Swift: + ```swift func rightSideView(_ root: TreeNode?) -> [Int] { var res = [Int]() From daf710bde6eb82f2c5b2a87254ca9860d79af80e Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Fri, 28 Jan 2022 11:32:57 +0800 Subject: [PATCH 0319/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=88637.?= =?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=A0=91=E7=9A=84=E5=B1=82=E5=B9=B3=E5=9D=87?= =?UTF-8?q?=E5=80=BC=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript?= =?UTF-8?q?=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...02\345\272\217\351\201\215\345\216\206.md" | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" index 18e19227b7..9ff4f2e964 100644 --- "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" +++ "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" @@ -941,7 +941,32 @@ var averageOfLevels = function(root) { }; ``` +TypeScript: + +```typescript +function averageOfLevels(root: TreeNode | null): number[] { + let helperQueue: TreeNode[] = []; + let resArr: number[] = []; + let total: number = 0; + let tempNode: TreeNode; + if (root !== null) helperQueue.push(root); + while (helperQueue.length > 0) { + let length = helperQueue.length; + for (let i = 0; i < length; i++) { + tempNode = helperQueue.shift()!; + total += tempNode.val; + if (tempNode.left) helperQueue.push(tempNode.left); + if (tempNode.right) helperQueue.push(tempNode.right); + } + resArr.push(total / length); + total = 0; + } + return resArr; +}; +``` + Swift: + ```swift func averageOfLevels(_ root: TreeNode?) -> [Double] { var res = [Double]() From 2862d47368512a9cbc7e7184775d99d8e53f72df Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Fri, 28 Jan 2022 11:44:49 +0800 Subject: [PATCH 0320/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=88429.N?= =?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?=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...02\345\272\217\351\201\215\345\216\206.md" | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" index 9ff4f2e964..5dd448b770 100644 --- "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" +++ "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" @@ -1190,7 +1190,30 @@ var levelOrder = function(root) { }; ``` +TypeScript: + +```typescript +function levelOrder(root: Node | null): number[][] { + let helperQueue: Node[] = []; + let resArr: number[][] = []; + let tempArr: number[] = []; + if (root !== null) helperQueue.push(root); + let curNode: Node; + while (helperQueue.length > 0) { + for (let i = 0, length = helperQueue.length; i < length; i++) { + curNode = helperQueue.shift()!; + tempArr.push(curNode.val); + helperQueue.push(...curNode.children); + } + resArr.push(tempArr); + tempArr = []; + } + return resArr; +}; +``` + Swift: + ```swift func levelOrder(_ root: Node?) -> [[Int]] { var res = [[Int]]() From 9329ecff5e95e5bc1e8cb17fbba1135765fd3286 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Fri, 28 Jan 2022 12:02:15 +0800 Subject: [PATCH 0321/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=88515.?= =?UTF-8?q?=E5=9C=A8=E6=AF=8F=E4=B8=AA=E6=A0=91=E8=A1=8C=E4=B8=AD=E6=89=BE?= =?UTF-8?q?=E6=9C=80=E5=A4=A7=E5=80=BC=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...02\345\272\217\351\201\215\345\216\206.md" | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" index 5dd448b770..6f90cb75ed 100644 --- "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" +++ "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" @@ -1393,7 +1393,34 @@ var largestValues = function(root) { }; ``` +TypeScript: + +```typescript +function largestValues(root: TreeNode | null): number[] { + let helperQueue: TreeNode[] = []; + let resArr: number[] = []; + let tempNode: TreeNode; + let max: number = 0; + if (root !== null) helperQueue.push(root); + while (helperQueue.length > 0) { + for (let i = 0, length = helperQueue.length; i < length; i++) { + tempNode = helperQueue.shift()!; + if (i === 0) { + max = tempNode.val; + } else { + max = max > tempNode.val ? max : tempNode.val; + } + if (tempNode.left) helperQueue.push(tempNode.left); + if (tempNode.right) helperQueue.push(tempNode.right); + } + resArr.push(max); + } + return resArr; +}; +``` + Swift: + ```swift func largestValues(_ root: TreeNode?) -> [Int] { var res = [Int]() From 992cd6d7f3bc2b0065bf8f3f3ff064a13c66dde3 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Fri, 28 Jan 2022 16:10:56 +0800 Subject: [PATCH 0322/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=88116.?= =?UTF-8?q?=E5=A1=AB=E5=85=85=E6=AF=8F=E4=B8=AA=E8=8A=82=E7=82=B9=E7=9A=84?= =?UTF-8?q?=E4=B8=8B=E4=B8=80=E4=B8=AA=E5=8F=B3=E4=BE=A7=E8=8A=82=E7=82=B9?= =?UTF-8?q?=E6=8C=87=E9=92=88=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typescrip?= =?UTF-8?q?t=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...02\345\272\217\351\201\215\345\216\206.md" | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" index 6f90cb75ed..12f9646918 100644 --- "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" +++ "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" @@ -1611,6 +1611,31 @@ var connect = function(root) { }; ``` +TypeScript: + +```typescript +function connect(root: Node | null): Node | null { + let helperQueue: Node[] = []; + let preNode: Node, curNode: Node; + if (root !== null) helperQueue.push(root); + while (helperQueue.length > 0) { + for (let i = 0, length = helperQueue.length; i < length; i++) { + if (i === 0) { + preNode = helperQueue.shift()!; + } else { + curNode = helperQueue.shift()!; + preNode.next = curNode; + preNode = curNode; + } + if (preNode.left) helperQueue.push(preNode.left); + if (preNode.right) helperQueue.push(preNode.right); + } + preNode.next = null; + } + return root; +}; +``` + go: ```GO From d1abb0cbb4397a950479788497e3ec21adbcea22 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Fri, 28 Jan 2022 16:21:25 +0800 Subject: [PATCH 0323/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=88117.?= =?UTF-8?q?=E5=A1=AB=E5=85=85=E6=AF=8F=E4=B8=AA=E8=8A=82=E7=82=B9=E7=9A=84?= =?UTF-8?q?=E4=B8=8B=E4=B8=80=E4=B8=AA=E5=8F=B3=E4=BE=A7=E8=8A=82=E7=82=B9?= =?UTF-8?q?=E6=8C=87=E9=92=88II=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typescr?= =?UTF-8?q?ipt=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...02\345\272\217\351\201\215\345\216\206.md" | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" index 12f9646918..a7716d9258 100644 --- "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" +++ "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" @@ -1862,6 +1862,31 @@ var connect = function(root) { return root; }; ``` +TypeScript: + +```typescript +function connect(root: Node | null): Node | null { + let helperQueue: Node[] = []; + let preNode: Node, curNode: Node; + if (root !== null) helperQueue.push(root); + while (helperQueue.length > 0) { + for (let i = 0, length = helperQueue.length; i < length; i++) { + if (i === 0) { + preNode = helperQueue.shift()!; + } else { + curNode = helperQueue.shift()!; + preNode.next = curNode; + preNode = curNode; + } + if (preNode.left) helperQueue.push(preNode.left); + if (preNode.right) helperQueue.push(preNode.right); + } + preNode.next = null; + } + return root; +}; +``` + go: ```GO From bdb0954e32976832b9bd99dd2dcb2744d55e665b Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Fri, 28 Jan 2022 17:11:11 +0800 Subject: [PATCH 0324/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=88104.?= =?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=A0=91=E7=9A=84=E6=9C=80=E5=A4=A7=E6=B7=B1?= =?UTF-8?q?=E5=BA=A6=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript?= =?UTF-8?q?=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...02\345\272\217\351\201\215\345\216\206.md" | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" index a7716d9258..9ac23fdf3f 100644 --- "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" +++ "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" @@ -2131,7 +2131,28 @@ var maxDepth = function(root) { }; ``` +TypeScript: + +```typescript +function maxDepth(root: TreeNode | null): number { + let helperQueue: TreeNode[] = []; + let resDepth: number = 0; + let tempNode: TreeNode; + if (root !== null) helperQueue.push(root); + while (helperQueue.length > 0) { + resDepth++; + for (let i = 0, length = helperQueue.length; i < length; i++) { + tempNode = helperQueue.shift()!; + if (tempNode.left) helperQueue.push(tempNode.left); + if (tempNode.right) helperQueue.push(tempNode.right); + } + } + return resDepth; +}; +``` + Swift: + ```swift func maxDepth(_ root: TreeNode?) -> Int { guard let root = root else { From 626db3fc67ba0a478f39331c4788bca15314a720 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Fri, 28 Jan 2022 20:33:04 +0800 Subject: [PATCH 0325/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=88111.?= =?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=A0=91=E7=9A=84=E6=9C=80=E5=B0=8F=E6=B7=B1?= =?UTF-8?q?=E5=BA=A6=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript?= =?UTF-8?q?=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...02\345\272\217\351\201\215\345\216\206.md" | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" index 9ac23fdf3f..1a92d42f91 100644 --- "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" +++ "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" @@ -2349,7 +2349,29 @@ var minDepth = function(root) { }; ``` +TypeScript: + +```typescript +function minDepth(root: TreeNode | null): number { + let helperQueue: TreeNode[] = []; + let resMin: number = 0; + let tempNode: TreeNode; + if (root !== null) helperQueue.push(root); + while (helperQueue.length > 0) { + resMin++; + for (let i = 0, length = helperQueue.length; i < length; i++) { + tempNode = helperQueue.shift()!; + if (tempNode.left === null && tempNode.right === null) return resMin; + if (tempNode.left !== null) helperQueue.push(tempNode.left); + if (tempNode.right !== null) helperQueue.push(tempNode.right); + } + } + return resMin; +}; +``` + Swift: + ```swift func minDepth(_ root: TreeNode?) -> Int { guard let root = root else { From 653d645dabd54c9b2d94afc27dc3cb308f82b519 Mon Sep 17 00:00:00 2001 From: Younglesszzz <571688981@qq.com> Date: Sat, 29 Jan 2022 13:29:28 +0800 Subject: [PATCH 0326/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=BA=86=E4=BA=8C?= =?UTF-8?q?=E7=BB=B4=E6=95=B0=E7=BB=84=E7=89=88=E6=9C=AC=EF=BC=8C=E7=9B=B8?= =?UTF-8?q?=E6=AF=94=E4=BA=8E=E4=B8=80=E7=BB=B4=E5=A5=BD=E7=90=86=E8=A7=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\347\232\204\351\207\215\351\207\217II.md" | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git "a/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" "b/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" index d64e7e5632..7b67b1ac48 100644 --- "a/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" +++ "b/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" @@ -153,6 +153,8 @@ public: Java: + +一维数组版本 ```Java class Solution { public int lastStoneWeightII(int[] stones) { @@ -173,6 +175,41 @@ class Solution { return sum - 2 * dp[target]; } } +``` +二维数组版本(便于理解) +```Java +class Solution { + public int lastStoneWeightII(int[] stones) { + int sum = 0; + for (int s : stones) { + sum += s; + } + + int target = sum / 2; + //初始化,dp[i][j]为可以放0-i物品,背包容量为j的情况下背包中的最大价值 + int[][] dp = new int[stones.length][target + 1]; + //dp[i][0]默认初始化为0 + //dp[0][j]取决于stones[0] + for (int j = stones[0]; j <= target; j++) { + dp[0][j] = stones[0]; + } + + for (int i = 1; i < stones.length; i++) { + for (int j = 1; j <= target; j++) {//注意是等于 + if (j >= stones[i]) { + //不放:dp[i - 1][j] 放:dp[i - 1][j - stones[i]] + stones[i] + dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - stones[i]] + stones[i]); + } else { + dp[i][j] = dp[i - 1][j]; + } + } + } + + System.out.println(dp[stones.length - 1][target]); + return (sum - dp[stones.length - 1][target]) - dp[stones.length - 1][target]; + } +} + ``` Python: From b1c3d5c4f9db71676ebc44f9c41a10778dfea1c5 Mon Sep 17 00:00:00 2001 From: Younglesszzz <571688981@qq.com> Date: Sat, 29 Jan 2022 13:39:27 +0800 Subject: [PATCH 0327/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=BA=86=E4=BA=8C?= =?UTF-8?q?=E7=BB=B4=E6=95=B0=E7=BB=84=E7=89=88=E6=9C=AC=EF=BC=8C=E7=9B=B8?= =?UTF-8?q?=E6=AF=94=E4=BA=8E=E4=B8=80=E7=BB=B4=E5=A5=BD=E7=90=86=E8=A7=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...11\345\222\214\345\255\220\351\233\206.md" | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git "a/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" "b/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" index 45b8b41627..9da1f8d5d3 100644 --- "a/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" +++ "b/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" @@ -210,6 +210,45 @@ class Solution { } ``` +二维数组版本(易于理解): +```Java +class Solution { + public boolean canPartition(int[] nums) { + int sum = 0; + for (int i = 0; i < nums.length; i++) { + sum += nums[i]; + } + + if (sum % 2 == 1) + return false; + int target = sum / 2; + + //dp[i][j]代表可装物品为0-i,背包容量为j的情况下,背包内容量的最大价值 + int[][] dp = new int[nums.length][target + 1]; + + //初始化,dp[0][j]的最大价值nums[0](if j > weight[i]) + //dp[i][0]均为0,不用初始化 + for (int j = nums[0]; j <= target; j++) { + dp[0][j] = nums[0]; + } + + //遍历物品,遍历背包 + //递推公式: + for (int i = 1; i < nums.length; i++) { + for (int j = 0; j <= target; j++) { + //背包容量可以容纳nums[i] + if (j >= nums[i]) { + dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - nums[i]] + nums[i]); + } else { + dp[i][j] = dp[i - 1][j]; + } + } + } + + return dp[nums.length - 1][target] == target; + } +} +``` Python: ```python class Solution: From be3f2cfc8a6e0abc3fbbefb3d7d2967b686e96e2 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Sat, 29 Jan 2022 22:12:49 +0800 Subject: [PATCH 0328/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880226.?= =?UTF-8?q?=E7=BF=BB=E8=BD=AC=E4=BA=8C=E5=8F=89=E6=A0=91.md=EF=BC=89?= =?UTF-8?q?=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...54\344\272\214\345\217\211\346\240\221.md" | 128 ++++++++++++++++++ 1 file changed, 128 insertions(+) diff --git "a/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" "b/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" index e6dbb70934..8108e7ada6 100644 --- "a/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" @@ -563,7 +563,135 @@ var invertTree = function(root) { }; ``` +### TypeScript: + +递归法: + +```typescript +// 递归法(前序遍历) +function invertTree(root: TreeNode | null): TreeNode | null { + if (root === null) return root; + let tempNode: TreeNode | null = root.left; + root.left = root.right; + root.right = tempNode; + invertTree(root.left); + invertTree(root.right); + return root; +}; + +// 递归法(后序遍历) +function invertTree(root: TreeNode | null): TreeNode | null { + if (root === null) return root; + invertTree(root.left); + invertTree(root.right); + let tempNode: TreeNode | null = root.left; + root.left = root.right; + root.right = tempNode; + return root; +}; + +// 递归法(中序遍历) +function invertTree(root: TreeNode | null): TreeNode | null { + if (root === null) return root; + invertTree(root.left); + let tempNode: TreeNode | null = root.left; + root.left = root.right; + root.right = tempNode; + // 因为左右节点已经进行交换,此时的root.left 是原先的root.right + invertTree(root.left); + return root; +}; +``` + +迭代法: + +```typescript +// 迭代法(栈模拟前序遍历) +function invertTree(root: TreeNode | null): TreeNode | null { + let helperStack: TreeNode[] = []; + let curNode: TreeNode, + tempNode: TreeNode | null; + if (root !== null) helperStack.push(root); + while (helperStack.length > 0) { + curNode = helperStack.pop()!; + // 入栈操作最好在交换节点之前进行,便于理解 + if (curNode.right) helperStack.push(curNode.right); + if (curNode.left) helperStack.push(curNode.left); + tempNode = curNode.left; + curNode.left = curNode.right; + curNode.right = tempNode; + } + return root; +}; + +// 迭代法(栈模拟中序遍历-统一写法形式) +function invertTree(root: TreeNode | null): TreeNode | null { + let helperStack: (TreeNode | null)[] = []; + let curNode: TreeNode | null, + tempNode: TreeNode | null; + if (root !== null) helperStack.push(root); + while (helperStack.length > 0) { + curNode = helperStack.pop(); + if (curNode !== null) { + if (curNode.right !== null) helperStack.push(curNode.right); + helperStack.push(curNode); + helperStack.push(null); + if (curNode.left !== null) helperStack.push(curNode.left); + } else { + curNode = helperStack.pop()!; + tempNode = curNode.left; + curNode.left = curNode.right; + curNode.right = tempNode; + } + } + return root; +}; + +// 迭代法(栈模拟后序遍历-统一写法形式) +function invertTree(root: TreeNode | null): TreeNode | null { + let helperStack: (TreeNode | null)[] = []; + let curNode: TreeNode | null, + tempNode: TreeNode | null; + if (root !== null) helperStack.push(root); + while (helperStack.length > 0) { + curNode = helperStack.pop(); + if (curNode !== null) { + helperStack.push(curNode); + helperStack.push(null); + if (curNode.right !== null) helperStack.push(curNode.right); + if (curNode.left !== null) helperStack.push(curNode.left); + } else { + curNode = helperStack.pop()!; + tempNode = curNode.left; + curNode.left = curNode.right; + curNode.right = tempNode; + } + } + return root; +}; + +// 迭代法(队列模拟层序遍历) +function invertTree(root: TreeNode | null): TreeNode | null { + const helperQueue: TreeNode[] = []; + let curNode: TreeNode, + tempNode: TreeNode | null; + if (root !== null) helperQueue.push(root); + while (helperQueue.length > 0) { + for (let i = 0, length = helperQueue.length; i < length; i++) { + curNode = helperQueue.shift()!; + tempNode = curNode.left; + curNode.left = curNode.right; + curNode.right = tempNode; + if (curNode.left !== null) helperQueue.push(curNode.left); + if (curNode.right !== null) helperQueue.push(curNode.right); + } + } + return root; +}; +``` + ### C: + 递归法 ```c struct TreeNode* invertTree(struct TreeNode* root){ From cee8536fa671b635f74edb1f7d296a5f2efc1bde Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Sun, 30 Jan 2022 13:17:47 +0800 Subject: [PATCH 0329/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880101.?= =?UTF-8?q?=E5=AF=B9=E7=A7=B0=E4=BA=8C=E5=8F=89=E6=A0=91.md=EF=BC=89?= =?UTF-8?q?=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...60\344\272\214\345\217\211\346\240\221.md" | 69 +++++++++++++++++++ 1 file changed, 69 insertions(+) diff --git "a/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" "b/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" index 69bc41d3c3..e4e232c884 100644 --- "a/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" @@ -574,6 +574,75 @@ var isSymmetric = function(root) { }; ``` +## TypeScript: + +> 递归法 + +```typescript +function isSymmetric(root: TreeNode | null): boolean { + function recur(node1: TreeNode | null, node2: TreeNode | null): boolean { + if (node1 === null && node2 === null) return true; + if (node1 === null || node2 === null) return false; + if (node1.val !== node2.val) return false + let isSym1: boolean = recur(node1.left, node2.right); + let isSym2: boolean = recur(node1.right, node2.left); + return isSym1 && isSym2 + } + if (root === null) return true; + return recur(root.left, root.right); +}; +``` + +> 迭代法 + +```typescript +// 迭代法(队列) +function isSymmetric(root: TreeNode | null): boolean { + let helperQueue: (TreeNode | null)[] = []; + let tempNode1: TreeNode | null, + tempNode2: TreeNode | null; + if (root !== null) { + helperQueue.push(root.left); + helperQueue.push(root.right); + } + while (helperQueue.length > 0) { + tempNode1 = helperQueue.shift()!; + tempNode2 = helperQueue.shift()!; + if (tempNode1 === null && tempNode2 === null) continue; + if (tempNode1 === null || tempNode2 === null) return false; + if (tempNode1.val !== tempNode2.val) return false; + helperQueue.push(tempNode1.left); + helperQueue.push(tempNode2.right); + helperQueue.push(tempNode1.right); + helperQueue.push(tempNode2.left); + } + return true; +} + +// 迭代法(栈) +function isSymmetric(root: TreeNode | null): boolean { + let helperStack: (TreeNode | null)[] = []; + let tempNode1: TreeNode | null, + tempNode2: TreeNode | null; + if (root !== null) { + helperStack.push(root.left); + helperStack.push(root.right); + } + while (helperStack.length > 0) { + tempNode1 = helperStack.pop()!; + tempNode2 = helperStack.pop()!; + if (tempNode1 === null && tempNode2 === null) continue; + if (tempNode1 === null || tempNode2 === null) return false; + if (tempNode1.val !== tempNode2.val) return false; + helperStack.push(tempNode1.left); + helperStack.push(tempNode2.right); + helperStack.push(tempNode1.right); + helperStack.push(tempNode2.left); + } + return true; +}; +``` + ## Swift: > 递归 From 067f71cdf03858645ba70c5151a1d26f16d91928 Mon Sep 17 00:00:00 2001 From: zhicheng lee <904688436@qq.com> Date: Mon, 31 Jan 2022 11:54:59 +0800 Subject: [PATCH 0330/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20=E8=83=8C?= =?UTF-8?q?=E5=8C=85=E9=97=AE=E9=A2=98=E7=90=86=E8=AE=BA=E5=9F=BA=E7=A1=80?= =?UTF-8?q?=E5=AE=8C=E5=85=A8=E8=83=8C=E5=8C=85.md=20Java=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加注释,去掉一个不必要的if语句 --- ...5\256\214\345\205\250\350\203\214\345\214\205.md" | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" index f79310b8be..cea69c724c 100644 --- "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" +++ "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" @@ -183,11 +183,9 @@ private static void testCompletePack(){ int[] value = {15, 20, 30}; int bagWeight = 4; int[] dp = new int[bagWeight + 1]; - for (int i = 0; i < weight.length; i++){ - for (int j = 1; j <= bagWeight; j++){ - if (j - weight[i] >= 0){ - dp[j] = Math.max(dp[j], dp[j - weight[i]] + value[i]); - } + for (int i = 0; i < weight.length; i++){ // 遍历物品 + for (int j = weight[i]; j <= bagWeight; j++){ // 遍历背包容量 + dp[j] = Math.max(dp[j], dp[j - weight[i]] + value[i]); } } for (int maxValue : dp){ @@ -201,8 +199,8 @@ private static void testCompletePackAnotherWay(){ int[] value = {15, 20, 30}; int bagWeight = 4; int[] dp = new int[bagWeight + 1]; - for (int i = 1; i <= bagWeight; i++){ - for (int j = 0; j < weight.length; j++){ + for (int i = 1; i <= bagWeight; i++){ // 遍历背包容量 + for (int j = 0; j < weight.length; j++){ // 遍历物品 if (i - weight[j] >= 0){ dp[i] = Math.max(dp[i], dp[i - weight[j]] + value[j]); } From 46571a3b9c619ac39c93becab1c1325fe211b545 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Mon, 31 Jan 2022 14:51:28 +0800 Subject: [PATCH 0331/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880104.?= =?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=A0=91=E7=9A=84=E6=9C=80=E5=A4=A7=E6=B7=B1?= =?UTF-8?q?=E5=BA=A6.md=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript?= =?UTF-8?q?=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...00\345\244\247\346\267\261\345\272\246.md" | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git "a/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" "b/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" index 7038598b1f..6875ec74e6 100644 --- "a/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" +++ "b/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" @@ -598,7 +598,55 @@ var maxDepth = function(root) { }; ``` +## TypeScript: + +> 二叉树的最大深度: + +```typescript +// 后续遍历(自下而上) +function maxDepth(root: TreeNode | null): number { + if (root === null) return 0; + return Math.max(maxDepth(root.left), maxDepth(root.right)) + 1; +}; + +// 前序遍历(自上而下) +function maxDepth(root: TreeNode | null): number { + function recur(node: TreeNode | null, count: number) { + if (node === null) { + resMax = resMax > count ? resMax : count; + return; + } + recur(node.left, count + 1); + recur(node.right, count + 1); + } + let resMax: number = 0; + let count: number = 0; + recur(root, count); + return resMax; +}; + +// 层序遍历(迭代法) +function maxDepth(root: TreeNode | null): number { + let helperQueue: TreeNode[] = []; + let resDepth: number = 0; + let tempNode: TreeNode; + if (root !== null) helperQueue.push(root); + while (helperQueue.length > 0) { + resDepth++; + for (let i = 0, length = helperQueue.length; i < length; i++) { + tempNode = helperQueue.shift()!; + if (tempNode.left) helperQueue.push(tempNode.left); + if (tempNode.right) helperQueue.push(tempNode.right); + } + } + return resDepth; +}; +``` + + + ## C + 二叉树最大深度递归 ```c int maxDepth(struct TreeNode* root){ From 463f142f05d5759c8dfaa5f17dbebfa9ddf580f5 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Mon, 31 Jan 2022 16:07:01 +0800 Subject: [PATCH 0332/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=88559.n?= =?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?=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...00\345\244\247\346\267\261\345\272\246.md" | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git "a/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" "b/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" index 6875ec74e6..3eecdc927b 100644 --- "a/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" +++ "b/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" @@ -643,7 +643,33 @@ function maxDepth(root: TreeNode | null): number { }; ``` +> N叉树的最大深度 +```typescript +// 后续遍历(自下而上) +function maxDepth(root: TreeNode | null): number { + if (root === null) return 0; + return Math.max(maxDepth(root.left), maxDepth(root.right)) + 1; +}; + +// 前序遍历(自上而下) +function maxDepth(root: TreeNode | null): number { + function recur(node: TreeNode | null, count: number) { + if (node === null) { + resMax = resMax > count ? resMax : count; + return; + } + recur(node.left, count + 1); + recur(node.right, count + 1); + } + let resMax: number = 0; + let count: number = 0; + recur(root, count); + return resMax; +}; + + +``` ## C From e4f674c61e71a7b33ec97e22acc6b7a44e075b6e Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Tue, 1 Feb 2022 20:04:51 +0800 Subject: [PATCH 0333/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880111.?= =?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=A0=91=E7=9A=84=E6=9C=80=E5=B0=8F=E6=B7=B1?= =?UTF-8?q?=E5=BA=A6.md=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript?= =?UTF-8?q?=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...00\345\260\217\346\267\261\345\272\246.md" | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git "a/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" "b/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" index a439322a9c..224caa5e37 100644 --- "a/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" +++ "b/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" @@ -404,6 +404,44 @@ var minDepth = function(root) { }; ``` +## TypeScript + +> 递归法 + +```typescript +function minDepth(root: TreeNode | null): number { + if (root === null) return 0; + if (root.left !== null && root.right === null) { + return 1 + minDepth(root.left); + } + if (root.left === null && root.right !== null) { + return 1 + minDepth(root.right); + } + return 1 + Math.min(minDepth(root.left), minDepth(root.right)); +} +``` + +> 迭代法 + +```typescript +function minDepth(root: TreeNode | null): number { + let helperQueue: TreeNode[] = []; + let resMin: number = 0; + let tempNode: TreeNode; + if (root !== null) helperQueue.push(root); + while (helperQueue.length > 0) { + resMin++; + for (let i = 0, length = helperQueue.length; i < length; i++) { + tempNode = helperQueue.shift()!; + if (tempNode.left === null && tempNode.right === null) return resMin; + if (tempNode.left !== null) helperQueue.push(tempNode.left); + if (tempNode.right !== null) helperQueue.push(tempNode.right); + } + } + return resMin; +}; +``` + ## Swift > 递归 From 8ac7cdce22a6f350ec57627e474bd482f5d041b3 Mon Sep 17 00:00:00 2001 From: hutbzc <3260189532@qq.com> Date: Tue, 1 Feb 2022 23:01:36 +0800 Subject: [PATCH 0334/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880045.?= =?UTF-8?q?=E8=B7=B3=E8=B7=83=E6=B8=B8=E6=88=8FII.md=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E8=A1=A5=E5=85=85Java=E7=89=88=E6=9C=AC2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\350\267\203\346\270\270\346\210\217II.md" | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git "a/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" "b/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" index a39c064ae6..7a3f048c60 100644 --- "a/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" +++ "b/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" @@ -142,6 +142,7 @@ public: ### Java ```Java +// 版本一 class Solution { public int jump(int[] nums) { if (nums == null || nums.length == 0 || nums.length == 1) { @@ -172,7 +173,30 @@ class Solution { } ``` +```java +// 版本二 +class Solution { + public int jump(int[] nums) { + int result = 0; + // 当前覆盖的最远距离下标 + int end = 0; + // 下一步覆盖的最远距离下标 + int temp = 0; + for (int i = 0; i <= end && end < nums.length - 1; ++i) { + temp = Math.max(temp, i + nums[i]); + // 可达位置的改变次数就是跳跃次数 + if (i == end) { + end = temp; + result++; + } + } + return result; + } +} +``` + ### Python + ```python class Solution: def jump(self, nums: List[int]) -> int: From 40c06155f9e65e3525100ac6aff6f3ce6aeb8dac Mon Sep 17 00:00:00 2001 From: hutbzc <3260189532@qq.com> Date: Tue, 1 Feb 2022 23:04:07 +0800 Subject: [PATCH 0335/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880139.?= =?UTF-8?q?=E5=8D=95=E8=AF=8D=E6=8B=86=E5=88=86.md=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0Java=E5=9B=9E=E5=9B=9E=E6=BA=AF+=E8=AE=B0?= =?UTF-8?q?=E5=BF=86=E5=8C=96=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...25\350\257\215\346\213\206\345\210\206.md" | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git "a/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" "b/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" index e24ffc1a89..1653a81a14 100644 --- "a/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" +++ "b/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" @@ -248,6 +248,36 @@ class Solution { return valid[s.length()]; } } + +// 回溯法+记忆化 +class Solution { + public boolean wordBreak(String s, List wordDict) { + Set wordDictSet = new HashSet(wordDict); + int[] memory = new int[s.length()]; + return backTrack(s, wordDictSet, 0, memory); + } + + public boolean backTrack(String s, Set wordDictSet, int startIndex, int[] memory) { + // 结束条件 + if (startIndex >= s.length()) { + return true; + } + if (memory[startIndex] != 0) { + // 此处认为:memory[i] = 1 表示可以拼出i 及以后的字符子串, memory[i] = -1 表示不能 + return memory[startIndex] == 1 ? true : false; + } + for (int i = startIndex; i < s.length(); ++i) { + // 处理 递归 回溯 循环不变量:[startIndex, i + 1) + String word = s.substring(startIndex, i + 1); + if (wordDictSet.contains(word) && backTrack(s, wordDictSet, i + 1, memory)) { + memory[startIndex] = 1; + return true; + } + } + memory[startIndex] = -1; + return false; + } +} ``` Python: From 5a2ff02b94d417a7a51d44998e212913afeba48b Mon Sep 17 00:00:00 2001 From: hutbzc <3260189532@qq.com> Date: Tue, 1 Feb 2022 23:08:56 +0800 Subject: [PATCH 0336/3019] =?UTF-8?q?=E4=BF=AE=E6=94=B9=EF=BC=880376.?= =?UTF-8?q?=E6=91=86=E5=8A=A8=E5=BA=8F=E5=88=97.md=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BA=86=E9=80=BB=E8=BE=91=E5=B0=8F=E9=94=99?= =?UTF-8?q?=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" "b/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" index 2bc231822f..d75311eb2a 100644 --- "a/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" +++ "b/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" @@ -174,7 +174,7 @@ public: ```Java class Solution { public int wiggleMaxLength(int[] nums) { - if (nums == null || nums.length <= 1) { + if (nums.length <= 1) { return nums.length; } //当前差值 From 2f1c56e6dd34a5a8ae89a8401219a0ce2dd623f3 Mon Sep 17 00:00:00 2001 From: Xiaofei-fei Date: Wed, 2 Feb 2022 18:47:01 +0800 Subject: [PATCH 0337/3019] =?UTF-8?q?494=E9=A2=98python=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .DS_Store | Bin 0 -> 8196 bytes ...0494.\347\233\256\346\240\207\345\222\214.md" | 3 ++- 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 .DS_Store diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..7794435bd6714aed6095604325ab6ffe84221748 GIT binary patch literal 8196 zcmeHMU2GIp6u#fIv@>*|1GG|b$8K6szzU`1r~D<`KM+bOc3ZkFVA<^sbYMDDcV^o{ zC8_Z*g7~0DeNjN;ix1VP7!wtvi3asattOIaj7FnRKFACD;<m0CQ8r?%*`* zup!Jqn1L_@VFtnsgc#mK>qC@oE@Ocl6VhKgsPK;f zB>54*zv!9H0lrT(kg-6H3F*61pW^g@z!kv}1Hzs3QEpB$7RWIng*$_AX9z|{a6*AU zI{8I?bB36ZVHsv1%)s;vaQet>kY$*|QrDl~QTewYB!ubsmP_3Yqqra9{olWg+mlT+n{GUw!6>BxFmbE zVwVEl+2`1MGX~dp^*L5{z;=7J1${}YFKZ<|qu#RO<_Uw^irv19V_AD0*W}%FCp=@s z+c#eT{C4F9d>fSP!^y{nJ6w>vh?lONbu4&8|RHg%m zmHORkhfBfBT2dIUR;$&HV*~|7b45$7x?bVg$!AiU;v1PT@4p;3+(h7x5C#;XGc$n|KQs@D4u2 zC47d@@il(J&-ewu;tyQKU-(*}`EPl8aOHV4$};qPPqUrg~a?_**LUMB<#)$$zerqZ#K$YPAhoU&S> zu&z*-$r>?ej;P+Hu9USFMJo{1s>o{MrL0MQRb3mYRkWn6<%w!lWTPT$5S7j9R?b5$ zUsQE9rYIWoE0M-XGv|^f6Uxsu`LjI>%9Uv=l#lj1Ssi`Gb+E&<$vniKWM>KOAFzw; zOLm$4$bMs22=4`ibPeTLfog0(4BN2-yU>DG>_Zp2(L-oAaM(xuF?h&gm{5NL591L$ zhR5*)p2jnH7SG`$w)*YO6S|2@2qi-i7<@G-u?1it6^4^W#!bE~N5N?f6* zX=ombXKc%{kB~0smvguYWuAEFGJgJVp8fa#n=rEQmBS2#8ThXmKz>uase!C#ThsVi zJ4*K literal 0 HcmV?d00001 diff --git "a/problems/0494.\347\233\256\346\240\207\345\222\214.md" "b/problems/0494.\347\233\256\346\240\207\345\222\214.md" index 0faef4a577..f190b734f3 100644 --- "a/problems/0494.\347\233\256\346\240\207\345\222\214.md" +++ "b/problems/0494.\347\233\256\346\240\207\345\222\214.md" @@ -272,7 +272,8 @@ Python: class Solution: def findTargetSumWays(self, nums: List[int], target: int) -> int: sumValue = sum(nums) - if target > sumValue or (sumValue + target) % 2 == 1: return 0 + #注意边界条件为 target>sumValue or target<-sumValue or (sumValue + target) % 2 == 1 + if abs(target) > sumValue or (sumValue + target) % 2 == 1: return 0 bagSize = (sumValue + target) // 2 dp = [0] * (bagSize + 1) dp[0] = 1 From 38c8b6849f32b47d59fc9ed5d1b394dda745b277 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Thu, 3 Feb 2022 20:03:43 +0800 Subject: [PATCH 0338/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880222.?= =?UTF-8?q?=E5=AE=8C=E5=85=A8=E4=BA=8C=E5=8F=89=E6=A0=91=E7=9A=84=E8=8A=82?= =?UTF-8?q?=E7=82=B9=E4=B8=AA=E6=95=B0.md=EF=BC=89=EF=BC=9A=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...02\347\202\271\344\270\252\346\225\260.md" | 60 ++++++++++++++++++- 1 file changed, 58 insertions(+), 2 deletions(-) diff --git "a/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" "b/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" index 8d38bace93..ffbc32ffb2 100644 --- "a/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" +++ "b/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" @@ -447,7 +447,63 @@ var countNodes = function(root) { }; ``` +## TypeScrpt: + +> 递归法 + +```typescript +function countNodes(root: TreeNode | null): number { + if (root === null) return 0; + return 1 + countNodes(root.left) + countNodes(root.right); +}; +``` + +> 迭代法 + +```typescript +function countNodes(root: TreeNode | null): number { + let helperQueue: TreeNode[] = []; + let resCount: number = 0; + let tempNode: TreeNode; + if (root !== null) helperQueue.push(root); + while (helperQueue.length > 0) { + for (let i = 0, length = helperQueue.length; i < length; i++) { + tempNode = helperQueue.shift()!; + resCount++; + if (tempNode.left) helperQueue.push(tempNode.left); + if (tempNode.right) helperQueue.push(tempNode.right); + } + } + return resCount; +}; +``` + +> 利用完全二叉树性质 + +```typescript +function countNodes(root: TreeNode | null): number { + if (root === null) return 0; + let left: number = 0, + right: number = 0; + let curNode: TreeNode | null= root; + while (curNode !== null) { + left++; + curNode = curNode.left; + } + curNode = root; + while (curNode !== null) { + right++; + curNode = curNode.right; + } + if (left === right) { + return 2 ** left - 1; + } + return 1 + countNodes(root.left) + countNodes(root.right); +}; +``` + ## C: + 递归法 ```c int countNodes(struct TreeNode* root) { @@ -538,7 +594,7 @@ func _countNodes(_ root: TreeNode?) -> Int { return 1 + leftCount + rightCount } ``` - + > 层序遍历 ```Swift func countNodes(_ root: TreeNode?) -> Int { @@ -564,7 +620,7 @@ func countNodes(_ root: TreeNode?) -> Int { return res } ``` - + > 利用完全二叉树性质 ```Swift func countNodes(_ root: TreeNode?) -> Int { From ea5a011d783073dc0f98bd5d0a0130c97a02153c Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Sat, 5 Feb 2022 13:04:38 +0800 Subject: [PATCH 0339/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880110.?= =?UTF-8?q?=E5=B9=B3=E8=A1=A1=E4=BA=8C=E5=8F=89=E6=A0=91.md=EF=BC=89?= =?UTF-8?q?=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...41\344\272\214\345\217\211\346\240\221.md" | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git "a/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" "b/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" index 9d43407a31..8a701bb307 100644 --- "a/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" @@ -627,7 +627,26 @@ var isBalanced = function(root) { }; ``` +## TypeScript + +```typescript +// 递归法 +function isBalanced(root: TreeNode | null): boolean { + function getDepth(root: TreeNode | null): number { + if (root === null) return 0; + let leftDepth: number = getDepth(root.left); + if (leftDepth === -1) return -1; + let rightDepth: number = getDepth(root.right); + if (rightDepth === -1) return -1; + if (Math.abs(leftDepth - rightDepth) > 1) return -1; + return 1 + Math.max(leftDepth, rightDepth); + } + return getDepth(root) !== -1; +}; +``` + ## C + 递归法: ```c int getDepth(struct TreeNode* node) { From f9e5bce7d7b8b53d266ba082036677b30d092696 Mon Sep 17 00:00:00 2001 From: jobinben <1021137079@qq.com> Date: Sun, 6 Feb 2022 18:36:14 +0800 Subject: [PATCH 0340/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20=E9=9D=A2?= =?UTF-8?q?=E8=AF=95=E9=A2=9802.07.=E9=93=BE=E8=A1=A8=E7=9B=B8=E4=BA=A4.md?= =?UTF-8?q?=20JavaScript=E8=AF=AD=E8=A8=80=E8=A7=A3=E6=B3=95=E7=9A=84?= =?UTF-8?q?=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...02.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git "a/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" "b/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" index dd91f0696e..2e7226deeb 100644 --- "a/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" +++ "b/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" @@ -224,12 +224,14 @@ var getIntersectionNode = function(headA, headB) { lenA = getListLen(headA), lenB = getListLen(headB); if(lenA < lenB) { + // 下面交换变量注意加 “分号” ,两个数组交换变量在同一个作用域下时 + // 如果不加分号,下面两条代码等同于一条代码: [curA, curB] = [lenB, lenA] [curA, curB] = [curB, curA]; [lenA, lenB] = [lenB, lenA]; } let i = lenA - lenB; while(i-- > 0) { - curA = curA.next + curA = curA.next; } while(curA && curA !== curB) { curA = curA.next; From 343ddb37f9e84284ff8df34f89bed18522244e43 Mon Sep 17 00:00:00 2001 From: bqlin Date: Mon, 20 Dec 2021 20:13:42 +0800 Subject: [PATCH 0341/3019] =?UTF-8?q?1047.=E5=88=A0=E9=99=A4=E5=AD=97?= =?UTF-8?q?=E7=AC=A6=E4=B8=B2=E4=B8=AD=E7=9A=84=E6=89=80=E6=9C=89=E7=9B=B8?= =?UTF-8?q?=E9=82=BB=E9=87=8D=E5=A4=8D=E9=A1=B9=EF=BC=9A=E4=BC=98=E5=8C=96?= =?UTF-8?q?Swift=E7=89=88=E6=9C=AC=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...351\202\273\351\207\215\345\244\215\351\241\271.md" | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git "a/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" "b/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" index d6eefd078a..9309aed889 100644 --- "a/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" +++ "b/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" @@ -322,14 +322,12 @@ char * removeDuplicates(char * s){ Swift: ```swift func removeDuplicates(_ s: String) -> String { - let array = Array(s) var stack = [Character]() - for c in array { - let last: Character? = stack.last - if stack.isEmpty || last != c { - stack.append(c) - } else { + for c in s { + if stack.last == c { stack.removeLast() + } else { + stack.append(c) } } return String(stack) From 2aa31ce54bcb186376a1341d8ef91282a8db4c6f Mon Sep 17 00:00:00 2001 From: bqlin Date: Mon, 20 Dec 2021 21:42:07 +0800 Subject: [PATCH 0342/3019] =?UTF-8?q?0239.=E6=BB=91=E5=8A=A8=E7=AA=97?= =?UTF-8?q?=E5=8F=A3=E6=9C=80=E5=A4=A7=E5=80=BC=EF=BC=9A=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E6=8E=92=E7=89=88=EF=BC=8C=E8=A1=A5=E5=85=85Swift=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...43\346\234\200\345\244\247\345\200\274.md" | 36 ++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git "a/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" "b/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" index d9788f6328..d7a94b5ae3 100644 --- "a/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" +++ "b/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" @@ -45,7 +45,7 @@ 这个队列应该长这个样子: -``` +```cpp class MyQueue { public: void pop(int value) { @@ -525,5 +525,39 @@ class Solution { } ``` +Swift解法二: + +```swift +func maxSlidingWindow(_ nums: [Int], _ k: Int) -> [Int] { + var result = [Int]() + var window = [Int]() + var right = 0, left = right - k + 1 + + while right < nums.count { + let value = nums[right] + + // 因为窗口移动丢弃的左边数 + if left > 0, left - 1 == window.first { + window.removeFirst() + } + + // 保证末尾的是最大的 + while !window.isEmpty, value > nums[window.last!] { + window.removeLast() + } + window.append(right) + + if left >= 0 { // 窗口形成 + result.append(nums[window.first!]) + } + + right += 1 + left += 1 + } + + return result +} +``` + -----------------------
From 40dc0d5e65fc36833c9d3fc77bba45606e83f739 Mon Sep 17 00:00:00 2001 From: bqlin Date: Mon, 20 Dec 2021 21:48:45 +0800 Subject: [PATCH 0343/3019] =?UTF-8?q?=E6=A0=88=E4=B8=8E=E9=98=9F=E5=88=97?= =?UTF-8?q?=E6=80=BB=E7=BB=93=EF=BC=9A=E4=BC=98=E5=8C=96=E6=8E=92=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\237\345\210\227\346\200\273\347\273\223.md" | 17 ----------------- 1 file changed, 17 deletions(-) diff --git "a/problems/\346\240\210\344\270\216\351\230\237\345\210\227\346\200\273\347\273\223.md" "b/problems/\346\240\210\344\270\216\351\230\237\345\210\227\346\200\273\347\273\223.md" index 8ec96a2972..15093ca703 100644 --- "a/problems/\346\240\210\344\270\216\351\230\237\345\210\227\346\200\273\347\273\223.md" +++ "b/problems/\346\240\210\344\270\216\351\230\237\345\210\227\346\200\273\347\273\223.md" @@ -158,22 +158,5 @@ cd a/b/c/../../ 好了,栈与队列我们就总结到这里了,接下来Carl就要带大家开启新的篇章了,大家加油! - - - -## 其他语言版本 - - -Java: - - -Python: - - -Go: - - - - -----------------------
From c88aee12e53a301ede5ed3fa81023d98c1ce009b Mon Sep 17 00:00:00 2001 From: bqlin Date: Tue, 21 Dec 2021 11:29:56 +0800 Subject: [PATCH 0344/3019] =?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=A0=91=E7=90=86?= =?UTF-8?q?=E8=AE=BA=E5=9F=BA=E7=A1=80=EF=BC=9A=E4=BC=98=E5=8C=96=E6=8E=92?= =?UTF-8?q?=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\221\347\220\206\350\256\272\345\237\272\347\241\200.md" | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" index cc89985092..c5dd118b19 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -154,7 +154,7 @@ C++代码如下: -``` +```cpp struct TreeNode { int val; TreeNode *left; @@ -163,7 +163,7 @@ struct TreeNode { }; ``` -大家会发现二叉树的定义 和链表是差不多的,相对于链表 ,二叉树的节点里多了一个指针, 有两个指针,指向左右孩子. +大家会发现二叉树的定义 和链表是差不多的,相对于链表 ,二叉树的节点里多了一个指针, 有两个指针,指向左右孩子。 这里要提醒大家要注意二叉树节点定义的书写方式。 @@ -177,7 +177,7 @@ struct TreeNode { 本篇我们介绍了二叉树的种类、存储方式、遍历方式以及定义,比较全面的介绍了二叉树各个方面的重点,帮助大家扫一遍基础。 -**说道二叉树,就不得不说递归,很多同学对递归都是又熟悉又陌生,递归的代码一般很简短,但每次都是一看就会,一写就废。** +**说到二叉树,就不得不说递归,很多同学对递归都是又熟悉又陌生,递归的代码一般很简短,但每次都是一看就会,一写就废。** ## 其他语言版本 From be6c45c636556b1c0d3838f265fe7830ca4f00ff Mon Sep 17 00:00:00 2001 From: jobinben <1021137079@qq.com> Date: Sun, 6 Feb 2022 19:06:51 +0800 Subject: [PATCH 0345/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200110.=E5=B9=B3?= =?UTF-8?q?=E8=A1=A1=E4=BA=8C=E5=8F=89=E6=A0=91.md=20JavaScript=E8=AF=AD?= =?UTF-8?q?=E8=A8=80=E7=89=88=E6=9C=AC=E7=9A=84=E8=BF=AD=E4=BB=A3=E8=A7=A3?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...41\344\272\214\345\217\211\346\240\221.md" | 45 ++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git "a/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" "b/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" index 9d43407a31..8a11c0134f 100644 --- "a/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" @@ -604,7 +604,8 @@ func abs(a int)int{ } ``` -## JavaScript +## JavaScript +递归法: ```javascript var isBalanced = function(root) { //还是用递归三部曲 + 后序遍历 左右中 当前左子树右子树高度相差大于1就返回-1 @@ -627,6 +628,48 @@ var isBalanced = function(root) { }; ``` +迭代法: +```javascript +// 获取当前节点的高度 +var getHeight = function (curNode) { + let queue = []; + if (curNode !== null) queue.push(curNode); // 压入当前元素 + let depth = 0, res = 0; + while (queue.length) { + let node = queue[queue.length - 1]; // 取出栈顶 + if (node !== null) { + queue.pop(); + queue.push(node); // 中 + queue.push(null); + depth++; + node.right && queue.push(node.right); // 右 + node.left && queue.push(node.left); // 左 + } else { + queue.pop(); + node = queue[queue.length - 1]; + queue.pop(); + depth--; + } + res = res > depth ? res : depth; + } + return res; +} +var isBalanced = function (root) { + if (root === null) return true; + let queue = [root]; + while (queue.length) { + let node = queue[queue.length - 1]; // 取出栈顶 + queue.pop(); + if (Math.abs(getHeight(node.left) - getHeight(node.right)) > 1) { + return false; + } + node.right && queue.push(node.right); + node.left && queue.push(node.left); + } + return true; +}; +``` + ## C 递归法: ```c From f1a3fbc78851c01bb2b97cf004c85b3d15f41970 Mon Sep 17 00:00:00 2001 From: Anmizi <1845513904@qq.com> Date: Sun, 6 Feb 2022 23:33:11 +0800 Subject: [PATCH 0346/3019] =?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 修改原有JS版本代码问题 --- ...71\263\350\241\241\344\272\214\345\217\211\346\240\221.md" | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git "a/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" "b/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" index 9d43407a31..313aeff237 100644 --- "a/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" @@ -614,8 +614,10 @@ var isBalanced = function(root) { if(node === null) return 0; // 3. 确定单层递归逻辑 let leftDepth = getDepth(node.left); //左子树高度 - let rightDepth = getDepth(node.right); //右子树高度 + // 当判定左子树不为平衡二叉树时,即可直接返回-1 if(leftDepth === -1) return -1; + let rightDepth = getDepth(node.right); //右子树高度 + // 当判定右子树不为平衡二叉树时,即可直接返回-1 if(rightDepth === -1) return -1; if(Math.abs(leftDepth - rightDepth) > 1) { return -1; From 8ce87963e5fe7e74657109d71c80ce3ce3b07da6 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, 7 Feb 2022 13:29:05 +0800 Subject: [PATCH 0347/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20=E4=BA=8C?= =?UTF-8?q?=E5=8F=89=E6=A0=91=EF=BC=9A=E4=BB=A5=E4=B8=BA=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=E4=BA=86=E9=80=92=E5=BD=92=EF=BC=8C=E5=85=B6=E5=AE=9E=E8=BF=98?= =?UTF-8?q?=E9=9A=90=E8=97=8F=E7=9D=80=E5=9B=9E=E6=BA=AF=20Swift=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...46\347\235\200\345\233\236\346\272\257.md" | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git "a/problems/\344\272\214\345\217\211\346\240\221\344\270\255\351\200\222\345\275\222\345\270\246\347\235\200\345\233\236\346\272\257.md" "b/problems/\344\272\214\345\217\211\346\240\221\344\270\255\351\200\222\345\275\222\345\270\246\347\235\200\345\233\236\346\272\257.md" index 20b87f875c..603854dc95 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\344\270\255\351\200\222\345\275\222\345\270\246\347\235\200\345\233\236\346\272\257.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\344\270\255\351\200\222\345\275\222\345\270\246\347\235\200\345\233\236\346\272\257.md" @@ -515,6 +515,61 @@ var binaryTreePaths = function(root) { }; ``` +Swift: +> 100.相同的树 +```swift +// 递归 +func isSameTree(_ p: TreeNode?, _ q: TreeNode?) -> Bool { + return _isSameTree3(p, q) +} +func _isSameTree3(_ p: TreeNode?, _ q: TreeNode?) -> Bool { + if p == nil && q == nil { + return true + } else if p == nil && q != nil { + return false + } else if p != nil && q == nil { + return false + } else if p!.val != q!.val { + return false + } + let leftSide = _isSameTree3(p!.left, q!.left) + let rightSide = _isSameTree3(p!.right, q!.right) + return leftSide && rightSide +} +``` + +> 257.二叉树的不同路径 +```swift +// 递归/回溯 +func binaryTreePaths(_ root: TreeNode?) -> [String] { + var res = [String]() + guard let root = root else { + return res + } + var paths = [Int]() + _binaryTreePaths3(root, res: &res, paths: &paths) + return res +} +func _binaryTreePaths3(_ root: TreeNode, res: inout [String], paths: inout [Int]) { + paths.append(root.val) + if root.left == nil && root.right == nil { + var str = "" + for i in 0 ..< (paths.count - 1) { + str.append("\(paths[i])->") + } + str.append("\(paths.last!)") + res.append(str) + } + if let left = root.left { + _binaryTreePaths3(left, res: &res, paths: &paths) + paths.removeLast() + } + if let right = root.right { + _binaryTreePaths3(right, res: &res, paths: &paths) + paths.removeLast() + } +} +``` -----------------------
From 3aa54bfb8a8604a8cfb05a4fa8c606ebe6b09db3 Mon Sep 17 00:00:00 2001 From: Wayne <3522373084@qq.com> Date: Mon, 7 Feb 2022 21:39:51 +0800 Subject: [PATCH 0348/3019] =?UTF-8?q?343=E6=95=B4=E6=95=B0=E6=8B=86?= =?UTF-8?q?=E5=88=86,=E6=9B=B4=E6=96=B0=E7=AC=AC=E4=BA=8C=E5=B1=82?= =?UTF-8?q?=E5=BE=AA=E7=8E=AF=20j=20=E7=9A=84=E8=8C=83=E5=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...64\346\225\260\346\213\206\345\210\206.md" | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git "a/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" "b/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" index 5d11f670f7..f616a606af 100644 --- "a/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" +++ "b/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" @@ -197,14 +197,17 @@ Java: ```Java class Solution { public int integerBreak(int n) { - //dp[i]为正整数i拆分结果的最大乘积 - int[] dp = new int[n+1]; - dp[2] = 1; - for (int i = 3; i <= n; ++i) { - for (int j = 1; j < i - 1; ++j) { - //j*(i-j)代表把i拆分为j和i-j两个数相乘 - //j*dp[i-j]代表把i拆分成j和继续把(i-j)这个数拆分,取(i-j)拆分结果中的最大乘积与j相乘 - dp[i] = Math.max(dp[i], Math.max(j * (i - j), j * dp[i - j])); + //dp[i] 为正整数 i 拆分后的结果的最大乘积 + int[]dp=new int[n+1]; + dp[2]=1; + for(int i=3;i<=n;i++){ + for(int j=1;j<=i-j;j++){ + // 这里的 j 其实最大值为 i-j,再大只不过是重复而已, + //并且,在本题中,我们分析 dp[0], dp[1]都是无意义的, + //j 最大到 i-j,就不会用到 dp[0]与dp[1] + dp[i]=Math.max(dp[i],Math.max(j*(i-j),j*dp[i-j])); + // j * (i - j) 是单纯的把整数 i 拆分为两个数 也就是 i,i-j ,再相乘 + //而j * dp[i - j]是将 i 拆分成两个以及两个以上的个数,再相乘。 } } return dp[n]; From 1b7c86e20c2b36ed0732deb66a0c124a8e8fcdff Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Mon, 7 Feb 2022 23:01:47 +0800 Subject: [PATCH 0349/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880257.?= =?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=A0=91=E7=9A=84=E6=89=80=E6=9C=89=E8=B7=AF?= =?UTF-8?q?=E5=BE=84.md=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript?= =?UTF-8?q?=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...00\346\234\211\350\267\257\345\276\204.md" | 67 +++++++++++++++++-- 1 file changed, 61 insertions(+), 6 deletions(-) diff --git "a/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" "b/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" index 4078320f23..1362897c89 100644 --- "a/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" +++ "b/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" @@ -433,9 +433,9 @@ class Solution: if cur.right: self.traversal(cur.right, path + '->', result) ``` - + 迭代法: - + ```python3 from collections import deque @@ -463,13 +463,13 @@ class Solution: return result ``` - + --- Go: - + 递归法: - + ```go func binaryTreePaths(root *TreeNode) []string { res := make([]string, 0) @@ -492,7 +492,7 @@ func binaryTreePaths(root *TreeNode) []string { return res } ``` - + 迭代法: ```go @@ -581,7 +581,62 @@ var binaryTreePaths = function(root) { }; ``` +TypeScript: + +> 递归法 + +```typescript +function binaryTreePaths(root: TreeNode | null): string[] { + function recur(node: TreeNode, route: string, resArr: string[]): void { + route += String(node.val); + if (node.left === null && node.right === null) { + resArr.push(route); + return; + } + if (node.left !== null) recur(node.left, route + '->', resArr); + if (node.right !== null) recur(node.right, route + '->', resArr); + } + const resArr: string[] = []; + if (root === null) return resArr; + recur(root, '', resArr); + return resArr; +}; +``` + +> 迭代法 + +```typescript +// 迭代法2 +function binaryTreePaths(root: TreeNode | null): string[] { + let helperStack: TreeNode[] = []; + let tempNode: TreeNode; + let routeArr: string[] = []; + let resArr: string[] = []; + if (root !== null) { + helperStack.push(root); + routeArr.push(String(root.val)); + }; + while (helperStack.length > 0) { + tempNode = helperStack.pop()!; + let route: string = routeArr.pop()!; // tempNode 对应的路径 + if (tempNode.left === null && tempNode.right === null) { + resArr.push(route); + } + if (tempNode.right !== null) { + helperStack.push(tempNode.right); + routeArr.push(route + '->' + tempNode.right.val); // tempNode.right 对应的路径 + } + if (tempNode.left !== null) { + helperStack.push(tempNode.left); + routeArr.push(route + '->' + tempNode.left.val); // tempNode.left 对应的路径 + } + } + return resArr; +}; +``` + Swift: + > 递归/回溯 ```swift func binaryTreePaths(_ root: TreeNode?) -> [String] { From 47818c947888ecff3dae6f36daded1cfaf92db3b Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Tue, 8 Feb 2022 10:23:59 +0800 Subject: [PATCH 0350/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=88=E4=BA=8C?= =?UTF-8?q?=E5=8F=89=E6=A0=91=E4=B8=AD=E9=80=92=E5=BD=92=E5=B8=A6=E7=9D=80?= =?UTF-8?q?=E5=9B=9E=E6=BA=AF.md=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E7=9B=B8=E5=90=8C=E7=9A=84=E6=A0=91typescript=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...46\347\235\200\345\233\236\346\272\257.md" | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git "a/problems/\344\272\214\345\217\211\346\240\221\344\270\255\351\200\222\345\275\222\345\270\246\347\235\200\345\233\236\346\272\257.md" "b/problems/\344\272\214\345\217\211\346\240\221\344\270\255\351\200\222\345\275\222\345\270\246\347\235\200\345\233\236\346\272\257.md" index 20b87f875c..03815ed3e3 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\344\270\255\351\200\222\345\275\222\345\270\246\347\235\200\345\233\236\346\272\257.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\344\270\255\351\200\222\345\275\222\345\270\246\347\235\200\345\233\236\346\272\257.md" @@ -515,6 +515,29 @@ var binaryTreePaths = function(root) { }; ``` +TypeScript: + +> 相同的树 + +```typescript +function isSameTree(p: TreeNode | null, q: TreeNode | null): boolean { + if (p === null && q === null) return true; + if (p === null || q === null) return false; + if (p.val !== q.val) return false; + let bool1: boolean, bool2: boolean; + bool1 = isSameTree(p.left, q.left); + bool2 = isSameTree(p.right, q.right); + return bool1 && bool2; +}; +``` + +> 二叉树的不同路径 + +```typescript +``` + + + -----------------------
From 49a1a42bbed494b10b4d6659ba787830f62bd842 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Tue, 8 Feb 2022 10:45:15 +0800 Subject: [PATCH 0351/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=88=E4=BA=8C?= =?UTF-8?q?=E5=8F=89=E6=A0=91=E4=B8=AD=E9=80=92=E5=BD=92=E5=B8=A6=E7=9D=80?= =?UTF-8?q?=E5=9B=9E=E6=BA=AF.md=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=A0=91=E7=9A=84=E4=B8=8D=E5=90=8C=E8=B7=AF?= =?UTF-8?q?=E5=BE=84=E7=9A=84typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...46\347\235\200\345\233\236\346\272\257.md" | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git "a/problems/\344\272\214\345\217\211\346\240\221\344\270\255\351\200\222\345\275\222\345\270\246\347\235\200\345\233\236\346\272\257.md" "b/problems/\344\272\214\345\217\211\346\240\221\344\270\255\351\200\222\345\275\222\345\270\246\347\235\200\345\233\236\346\272\257.md" index 03815ed3e3..41d5663e04 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\344\270\255\351\200\222\345\275\222\345\270\246\347\235\200\345\233\236\346\272\257.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\344\270\255\351\200\222\345\275\222\345\270\246\347\235\200\345\233\236\346\272\257.md" @@ -534,6 +534,27 @@ function isSameTree(p: TreeNode | null, q: TreeNode | null): boolean { > 二叉树的不同路径 ```typescript +function binaryTreePaths(root: TreeNode | null): string[] { + function recur(node: TreeNode, nodeSeqArr: number[], resArr: string[]): void { + nodeSeqArr.push(node.val); + if (node.left === null && node.right === null) { + resArr.push(nodeSeqArr.join('->')); + } + if (node.left !== null) { + recur(node.left, nodeSeqArr, resArr); + nodeSeqArr.pop(); + } + if (node.right !== null) { + recur(node.right, nodeSeqArr, resArr); + nodeSeqArr.pop(); + } + } + let nodeSeqArr: number[] = []; + let resArr: string[] = []; + if (root === null) return resArr; + recur(root, nodeSeqArr, resArr); + return resArr; +}; ``` From f604aea34c6632e20ad4ced37cb24c005420e574 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Tue, 8 Feb 2022 23:00:31 +0800 Subject: [PATCH 0352/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880404.?= =?UTF-8?q?=E5=B7=A6=E5=8F=B6=E5=AD=90=E4=B9=8B=E5=92=8C.md=EF=BC=89?= =?UTF-8?q?=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...66\345\255\220\344\271\213\345\222\214.md" | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git "a/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" "b/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" index 09272052de..2b4df15123 100644 --- "a/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" +++ "b/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" @@ -372,6 +372,50 @@ var sumOfLeftLeaves = function(root) { }; ``` +## TypeScript + +> 递归法 + +```typescript +function sumOfLeftLeaves(root: TreeNode | null): number { + if (root === null) return 0; + let midVal: number = 0; + if ( + root.left !== null && + root.left.left === null && + root.left.right === null + ) { + midVal = root.left.val; + } + let leftVal: number = sumOfLeftLeaves(root.left); + let rightVal: number = sumOfLeftLeaves(root.right); + return midVal + leftVal + rightVal; +}; +``` + +> 迭代法 + +```typescript +function sumOfLeftLeaves(root: TreeNode | null): number { + let helperStack: TreeNode[] = []; + let tempNode: TreeNode; + let sum: number = 0; + if (root !== null) helperStack.push(root); + while (helperStack.length > 0) { + tempNode = helperStack.pop()!; + if ( + tempNode.left !== null && + tempNode.left.left === null && + tempNode.left.right === null + ) { + sum += tempNode.left.val; + } + if (tempNode.right !== null) helperStack.push(tempNode.right); + if (tempNode.left !== null) helperStack.push(tempNode.left); + } + return sum; +}; +``` ## Swift From 81c1060ad7b21cab48d3f27aea802135544a73ff Mon Sep 17 00:00:00 2001 From: youngyangyang04 <826123027@qq.com> Date: Wed, 9 Feb 2022 14:57:04 +0800 Subject: [PATCH 0353/3019] Update --- README.md | 9 +++++---- ...1\346\226\207\346\241\243\345\267\245\345\205\267.md" | 1 - ...5\237\272\347\241\20001\350\203\214\345\214\205-2.md" | 8 ++++---- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index c51497767b..c1761f7b02 100644 --- a/README.md +++ b/README.md @@ -5,10 +5,11 @@ > 1. **介绍**:本项目是一套完整的刷题计划,旨在帮助大家少走弯路,循序渐进学算法,[关注作者](#关于作者) > 2. **PDF版本** : [「代码随想录」算法精讲 PDF 版本](https://programmercarl.com/other/algo_pdf.html) 。 -> 3. **刷题顺序** : README已经将刷题顺序排好了,按照顺序一道一道刷就可以。 -> 4. **学习社区** : 一起学习打卡/面试技巧/如何选择offer/大厂内推/职场规则/简历修改/技术分享/程序人生。欢迎加入[「代码随想录」知识星球](https://programmercarl.com/other/kstar.html) 。 -> 5. **提交代码**:本项目统一使用C++语言进行讲解,但已经有Java、Python、Go、JavaScript等等多语言版本,感谢[这里的每一位贡献者](https://github.com/youngyangyang04/leetcode-master/graphs/contributors),如果你也想贡献代码点亮你的头像,[点击这里](https://mp.weixin.qq.com/s/tqCxrMEU-ajQumL1i8im9A)了解提交代码的方式。 -> 6. **转载须知** :以下所有文章皆为我([程序员Carl](https://github.com/youngyangyang04))的原创。引用本项目文章请注明出处,发现恶意抄袭或搬运,会动用法律武器维护自己的权益。让我们一起维护一个良好的技术创作环境! +> 3. **最强八股文:**:[代码随想录知识星球精华PDF](https://www.programmercarl.com/other/kstar_baguwen.html) +> 4. **刷题顺序** : README已经将刷题顺序排好了,按照顺序一道一道刷就可以。 +> 5. **学习社区** : 一起学习打卡/面试技巧/如何选择offer/大厂内推/职场规则/简历修改/技术分享/程序人生。欢迎加入[「代码随想录」知识星球](https://programmercarl.com/other/kstar.html) 。 +> 6. **提交代码**:本项目统一使用C++语言进行讲解,但已经有Java、Python、Go、JavaScript等等多语言版本,感谢[这里的每一位贡献者](https://github.com/youngyangyang04/leetcode-master/graphs/contributors),如果你也想贡献代码点亮你的头像,[点击这里](https://mp.weixin.qq.com/s/tqCxrMEU-ajQumL1i8im9A)了解提交代码的方式。 +> 7. **转载须知** :以下所有文章皆为我([程序员Carl](https://github.com/youngyangyang04))的原创。引用本项目文章请注明出处,发现恶意抄袭或搬运,会动用法律武器维护自己的权益。让我们一起维护一个良好的技术创作环境!

diff --git "a/problems/\345\211\215\345\272\217/\347\250\213\345\272\217\345\221\230\345\206\231\346\226\207\346\241\243\345\267\245\345\205\267.md" "b/problems/\345\211\215\345\272\217/\347\250\213\345\272\217\345\221\230\345\206\231\346\226\207\346\241\243\345\267\245\345\205\267.md" index b76fb03680..e4193c426a 100644 --- "a/problems/\345\211\215\345\272\217/\347\250\213\345\272\217\345\221\230\345\206\231\346\226\207\346\241\243\345\267\245\345\205\267.md" +++ "b/problems/\345\211\215\345\272\217/\347\250\213\345\272\217\345\221\230\345\206\231\346\226\207\346\241\243\345\267\245\345\205\267.md" @@ -135,7 +135,6 @@ Markdown支持部分html,例如这样 - ----------------------- * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) diff --git "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" index a57bae1064..dabdfb2d09 100644 --- "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" +++ "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" @@ -210,7 +210,7 @@ int main() { ## 其他语言版本 -Java: +### Java ```java public static void main(String[] args) { @@ -240,7 +240,7 @@ Java: -Python: +### Python ```python def test_1_wei_bag_problem(): weight = [1, 3, 4] @@ -260,7 +260,7 @@ def test_1_wei_bag_problem(): test_1_wei_bag_problem() ``` -Go: +### Go ```go func test_1_wei_bag_problem(weight, value []int, bagWeight int) int { // 定义 and 初始化 @@ -292,7 +292,7 @@ func main() { } ``` -javaScript: +### javaScript ```js From 4ed65b50d174a3d9f89d0352ee30da95fcecece9 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Wed, 9 Feb 2022 22:45:31 +0800 Subject: [PATCH 0354/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880513.?= =?UTF-8?q?=E6=89=BE=E6=A0=91=E5=B7=A6=E4=B8=8B=E8=A7=92=E7=9A=84=E5=80=BC?= =?UTF-8?q?.md=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...13\350\247\222\347\232\204\345\200\274.md" | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git "a/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" "b/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" index 84ed393207..12c62c7068 100644 --- "a/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" +++ "b/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" @@ -433,6 +433,51 @@ var findBottomLeftValue = function(root) { }; ``` +## TypeScript + +> 递归法: + +```typescript +function findBottomLeftValue(root: TreeNode | null): number { + function recur(root: TreeNode, depth: number): void { + if (root.left === null && root.right === null) { + if (depth > maxDepth) { + maxDepth = depth; + resVal = root.val; + } + return; + } + if (root.left !== null) recur(root.left, depth + 1); + if (root.right !== null) recur(root.right, depth + 1); + } + let maxDepth: number = 0; + let resVal: number = 0; + if (root === null) return resVal; + recur(root, 1); + return resVal; +}; +``` + +> 迭代法: + +```typescript +function findBottomLeftValue(root: TreeNode | null): number { + let helperQueue: TreeNode[] = []; + if (root !== null) helperQueue.push(root); + let resVal: number = 0; + let tempNode: TreeNode; + while (helperQueue.length > 0) { + resVal = helperQueue[0].val; + for (let i = 0, length = helperQueue.length; i < length; i++) { + tempNode = helperQueue.shift()!; + if (tempNode.left !== null) helperQueue.push(tempNode.left); + if (tempNode.right !== null) helperQueue.push(tempNode.right); + } + } + return resVal; +}; +``` + ## Swift 递归版本: From 7d8e9e8fae9d580013b717ff882bd9a942fe0e4f Mon Sep 17 00:00:00 2001 From: Guang-Hou <87743934+Guang-Hou@users.noreply.github.com> Date: Wed, 9 Feb 2022 16:37:44 -0500 Subject: [PATCH 0355/3019] =?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 递归法- 无返回值的一种更简单的实现。 --- ...22\345\205\245\346\223\215\344\275\234.md" | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git "a/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" "b/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" index 468f26750d..5e9fbdfe7e 100644 --- "a/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" +++ "b/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" @@ -310,6 +310,26 @@ class Solution: return root ``` +**递归法** - 无返回值 - another easier way +```python +class Solution: + def insertIntoBST(self, root: Optional[TreeNode], val: int) -> Optional[TreeNode]: + newNode = TreeNode(val) + if not root: return newNode + + if not root.left and val < root.val: + root.left = newNode + if not root.right and val > root.val: + root.right = newNode + + if val < root.val: + self.insertIntoBST(root.left, val) + if val > root.val: + self.insertIntoBST(root.right, val) + + return root +``` + **迭代法** 与无返回值的递归函数的思路大体一致 ```python From fc1a7e3e079958e6919bbc4fbe069a8d92e66322 Mon Sep 17 00:00:00 2001 From: zhaoninge Date: Thu, 10 Feb 2022 17:01:31 +0800 Subject: [PATCH 0356/3019] =?UTF-8?q?Update=200027.=E7=A7=BB=E9=99=A4?= =?UTF-8?q?=E5=85=83=E7=B4=A0.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加27. 移除元素 C++版相向双指针方法,该方法基于元素顺序可以改变的题目描述,使用双指针法改变了元素相对位置,确保了移动最少元素 --- ...73\351\231\244\345\205\203\347\264\240.md" | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git "a/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" "b/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" index d69f2bcfe8..0c6f512965 100644 --- "a/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" +++ "b/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" @@ -106,6 +106,37 @@ public: 旧文链接:[数组:就移除个元素很难么?](https://programmercarl.com/0027.移除元素.html) +```CPP +/** +* 相向双指针方法,基于元素顺序可以改变的题目描述改变了元素相对位置,确保了移动最少元素 +* 时间复杂度:$O(n)$ +* 空间复杂度:$O(1)$ +*/ +class Solution { +public: + int removeElement(vector& nums, int val) { + int leftIndex = 0; + int rightIndex = nums.size() - 1; + while (leftIndex <= rightIndex) { + // 找左边等于val的元素 + while (leftIndex <= rightIndex && nums[leftIndex] != val){ + ++leftIndex; + } + // 找右边不等于val的元素 + while (leftIndex <= rightIndex && nums[rightIndex] == val) { + -- rightIndex; + } + // 将右边不等于val的元素覆盖左边等于val的元素 + if (leftIndex < rightIndex) { + nums[leftIndex++] = nums[rightIndex--]; + } + } + return leftIndex; // leftIndex一定指向了最终数组末尾的下一个元素 + } +}; +``` + + ## 相关题目推荐 * 26.删除排序数组中的重复项 From 71dd3eab9e9a005eec5669bfc25ba3cd4d27fb2f Mon Sep 17 00:00:00 2001 From: Luo <82520819+Jerry-306@users.noreply.github.com> Date: Fri, 11 Feb 2022 11:26:14 +0800 Subject: [PATCH 0357/3019] =?UTF-8?q?0059=20=20=E8=9E=BA=E6=97=8B=E7=9F=A9?= =?UTF-8?q?=E9=98=B5II=20=20=E9=A2=98=E7=9B=AE=E9=94=99=E8=AF=AF=E7=BA=A0?= =?UTF-8?q?=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" "b/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" index 3f7a59ca2f..ff65435835 100644 --- "a/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" +++ "b/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" @@ -10,7 +10,7 @@ [力扣题目链接](https://leetcode-cn.com/problems/spiral-matrix-ii/) -给定一个正整数 n,生成一个包含 1 到 $n^2$ 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。 +给定一个正整数 n,生成一个包含 1 到 n^2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。 示例: From 305ef69d5878ecaf1b9655e7899d663290f53af5 Mon Sep 17 00:00:00 2001 From: weiting-cn <2254912@qq.com> Date: Fri, 11 Feb 2022 16:09:17 +0800 Subject: [PATCH 0358/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=EF=BC=9A0015.?= =?UTF-8?q?=E4=B8=89=E6=95=B0=E4=B9=8B=E5=92=8C=EF=BC=8C0018.=E5=9B=9B?= =?UTF-8?q?=E6=95=B0=E4=B9=8B=E5=92=8C=EF=BC=88=E5=8E=BB=E9=87=8D=E4=BC=98?= =?UTF-8?q?=E5=8C=96=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" | 4 ++++ .../0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" | 4 ++++ 2 files changed, 8 insertions(+) diff --git "a/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" "b/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" index e191eabc4d..9b59e66dc3 100644 --- "a/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" @@ -138,8 +138,12 @@ public: */ if (nums[i] + nums[left] + nums[right] > 0) { right--; + // 当前元素不合适了,可以去重 + while (left < right && nums[right] == nums[right + 1]) right--; } else if (nums[i] + nums[left] + nums[right] < 0) { left++; + // 不合适,去重 + while (left < right && nums[left] == nums[left - 1]) left++; } else { result.push_back(vector{nums[i], nums[left], nums[right]}); // 去重逻辑应该放在找到一个三元组之后 diff --git "a/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" "b/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" index bad258c181..c6c55d5069 100644 --- "a/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" @@ -91,9 +91,13 @@ public: // nums[k] + nums[i] + nums[left] + nums[right] > target 会溢出 if (nums[k] + nums[i] > target - (nums[left] + nums[right])) { right--; + // 当前元素不合适了,可以去重 + while (left < right && nums[right] == nums[right + 1]) right--; // nums[k] + nums[i] + nums[left] + nums[right] < target 会溢出 } else if (nums[k] + nums[i] < target - (nums[left] + nums[right])) { left++; + // 不合适,去重 + while (left < right && nums[left] == nums[left - 1]) left++; } else { result.push_back(vector{nums[k], nums[i], nums[left], nums[right]}); // 去重逻辑应该放在找到一个四元组之后 From fbf52ee2bf0cad8c4231311ef2d87fc383a49a3c Mon Sep 17 00:00:00 2001 From: Luo <82520819+Jerry-306@users.noreply.github.com> Date: Fri, 11 Feb 2022 16:57:22 +0800 Subject: [PATCH 0359/3019] =?UTF-8?q?=E7=AE=97=E6=B3=95=E6=A8=A1=E6=9D=BF?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=20typescript=20=E7=89=88=E6=9C=AC=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...27\346\263\225\346\250\241\346\235\277.md" | 265 +++++++++++++++++- 1 file changed, 264 insertions(+), 1 deletion(-) diff --git "a/problems/\347\256\227\346\263\225\346\250\241\346\235\277.md" "b/problems/\347\256\227\346\263\225\346\250\241\346\235\277.md" index a41365115f..789d8f8031 100644 --- "a/problems/\347\256\227\346\263\225\346\250\241\346\235\277.md" +++ "b/problems/\347\256\227\346\263\225\346\250\241\346\235\277.md" @@ -394,7 +394,7 @@ var postorder = function (root, list) { ```javascript var preorderTraversal = function (root) { let res = []; - if (root === null) return rs; + if (root === null) return res; let stack = [root], cur = null; while (stack.length) { @@ -536,6 +536,269 @@ function backtracking(参数) { } ``` +TypeScript: + +## 二分查找法 + +使用左闭右闭区间 + +```typescript +var search = function (nums: number[], target: number): number { + let left: number = 0, right: number = nums.length - 1; + // 使用左闭右闭区间 + while (left <= right) { + let mid: number = 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; +}; +``` + +使用左闭右开区间 + +```typescript +var search = function (nums: number[], target: number): number { + let left: number = 0, right: number = nums.length; + // 使用左闭右开区间 [left, right) + while (left < right) { + let mid: number = 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 + +```typescript +var kmp = function (next: number[], s: number): void { + next[0] = -1; + let j: number = -1; + for(let i: number = 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; + } +} +``` + +## 二叉树 + +### 深度优先遍历(递归) + +二叉树节点定义: + +```typescript +class TreeNode { + val: number + left: TreeNode | null + right: TreeNode | null + constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) { + this.val = (val===undefined ? 0 : val) + this.left = (left===undefined ? null : left) + this.right = (right===undefined ? null : right) + } +} +``` + +前序遍历(中左右): + +```typescript +var preorder = function (root: TreeNode | null, list: number[]): void { + if (root === null) return; + list.push(root.val); // 中 + preorder(root.left, list); // 左 + preorder(root.right, list); // 右 +} +``` + +中序遍历(左中右): + +```typescript +var inorder = function (root: TreeNode | null, list: number[]): void { + if (root === null) return; + inorder(root.left, list); // 左 + list.push(root.val); // 中 + inorder(root.right, list); // 右 +} +``` + +后序遍历(左右中): + +```typescript +var postorder = function (root: TreeNode | null, list: number[]): void { + if (root === null) return; + postorder(root.left, list); // 左 + postorder(root.right, list); // 右 + list.push(root.val); // 中 +} +``` + +### 深度优先遍历(迭代) + +前序遍历(中左右): + +```typescript +var preorderTraversal = function (root: TreeNode | null): number[] { + let res: number[] = []; + if (root === null) return res; + let stack: TreeNode[] = [root], + cur: TreeNode | null = 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; +}; +``` + +中序遍历(左中右): + +```typescript +var inorderTraversal = function (root: TreeNode | null): number[] { + let res: number[] = []; + if (root === null) return res; + let stack: TreeNode[] = []; + let cur: TreeNode | null = 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; +}; +``` + +后序遍历(左右中): + +```typescript +var postorderTraversal = function (root: TreeNode | null): number[] { + let res: number[] = []; + if (root === null) return res; + let stack: TreeNode[] = [root]; + let cur: TreeNode | null = 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() +}; +``` + +### 广度优先遍历(队列) + +```typescript +var levelOrder = function (root: TreeNode | null): number[] { + let res: number[] = []; + if (root === null) return res; + let queue: TreeNode[] = [root]; + while (queue.length) { + let n: number = queue.length; + let temp: number[] = []; + for (let i: number = 0; i < n; i++) { + let node: TreeNode = queue.shift(); + temp.push(node.val); + node.left && queue.push(node.left); + node.right && queue.push(node.right); + } + res.push(temp); + } + return res; +}; +``` + +### 二叉树深度 + +```typescript +var getDepth = function (node: TreNode | null): number { + if (node === null) return 0; + return 1 + Math.max(getDepth(node.left), getDepth(node.right)); +} +``` + +### 二叉树节点数量 + +```typescript +var countNodes = function (root: TreeNode | null): number { + if (root === null) return 0; + return 1 + countNodes(root.left) + countNodes(root.right); +} +``` + +## 回溯算法 + +```typescript +function backtracking(参数) { + if (终止条件) { + 存放结果; + return; + } + + for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) { + 处理节点; + backtracking(路径,选择列表); // 递归 + 回溯,撤销处理结果 + } +} + +``` + +## 并查集 + +```typescript + let n: number = 1005; // 根据题意而定 + let father: number[] = new Array(n).fill(0); + + // 并查集初始化 + function init () { + for (int i: number = 0; i < n; ++i) { + father[i] = i; + } + } + // 并查集里寻根的过程 + function find (u: number): number { + return u === father[u] ? u : father[u] = find(father[u]); + } + // 将v->u 这条边加入并查集 + function join(u: number, v: number) { + u = find(u); + v = find(v); + if (u === v) return ; + father[v] = u; + } + // 判断 u 和 v是否找到同一个根 + function same(u: number, v: number): boolean { + u = find(u); + v = find(v); + return u === v; + } +``` + Java: From 65a341bf365eb3b2648c357a7a311a59ec6e9e18 Mon Sep 17 00:00:00 2001 From: Larry Liu Date: Fri, 11 Feb 2022 20:24:45 +0800 Subject: [PATCH 0360/3019] =?UTF-8?q?Update=20=E5=B9=BF=E5=B7=9E=E4=BA=92?= =?UTF-8?q?=E8=81=94=E7=BD=91=E5=85=AC=E5=8F=B8=E6=80=BB=E7=BB=93.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 字节跳动有广州研发岗位 --- ...7\275\221\345\205\254\345\217\270\346\200\273\347\273\223.md" | 1 + 1 file changed, 1 insertion(+) diff --git "a/problems/\345\211\215\345\272\217/\345\271\277\345\267\236\344\272\222\350\201\224\347\275\221\345\205\254\345\217\270\346\200\273\347\273\223.md" "b/problems/\345\211\215\345\272\217/\345\271\277\345\267\236\344\272\222\350\201\224\347\275\221\345\205\254\345\217\270\346\200\273\347\273\223.md" index ae41c89972..ac70f40cb1 100644 --- "a/problems/\345\211\215\345\272\217/\345\271\277\345\267\236\344\272\222\350\201\224\347\275\221\345\205\254\345\217\270\346\200\273\347\273\223.md" +++ "b/problems/\345\211\215\345\272\217/\345\271\277\345\267\236\344\272\222\350\201\224\347\275\221\345\205\254\345\217\270\346\200\273\347\273\223.md" @@ -14,6 +14,7 @@ ## 一线互联网 * 微信(总部) 有点难进! +* 字节跳动(广州) ## 二线 * 网易(总部)主要是游戏 From 961ae6eadf6359f2ef6b787ad612475e02e6842e Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Fri, 11 Feb 2022 21:52:36 +0800 Subject: [PATCH 0361/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880112.?= =?UTF-8?q?=E8=B7=AF=E5=BE=84=E6=80=BB=E5=92=8C.md=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...57\345\276\204\346\200\273\345\222\214.md" | 89 +++++++++++++++++++ 1 file changed, 89 insertions(+) diff --git "a/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" "b/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" index 5ec8ffd051..de6caef02c 100644 --- "a/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" +++ "b/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" @@ -766,11 +766,100 @@ let pathSum = function(root, targetSum) { }; ``` +## TypeScript + +> 0112.路径总和 + +**递归法:** + +```typescript +function hasPathSum(root: TreeNode | null, targetSum: number): boolean { + function recur(node: TreeNode, sum: number): boolean { + console.log(sum); + if ( + node.left === null && + node.right === null && + sum === 0 + ) return true; + if (node.left !== null) { + sum -= node.left.val; + if (recur(node.left, sum) === true) return true; + sum += node.left.val; + } + if (node.right !== null) { + sum -= node.right.val; + if (recur(node.right, sum) === true) return true; + sum += node.right.val; + } + return false; + } + if (root === null) return false; + return recur(root, targetSum - root.val); +}; +``` + +**递归法(精简版):** + +```typescript +function hasPathSum(root: TreeNode | null, targetSum: number): boolean { + if (root === null) return false; + targetSum -= root.val; + if ( + root.left === null && + root.right === null && + targetSum === 0 + ) return true; + return hasPathSum(root.left, targetSum) || + hasPathSum(root.right, targetSum); +}; +``` + +**迭代法:** + +```typescript +function hasPathSum(root: TreeNode | null, targetSum: number): boolean { + type Pair = { + node: TreeNode, // 当前节点 + sum: number // 根节点到当前节点的路径数值总和 + } + + const helperStack: Pair[] = []; + if (root !== null) helperStack.push({ node: root, sum: root.val }); + let tempPair: Pair; + while (helperStack.length > 0) { + tempPair = helperStack.pop()!; + if ( + tempPair.node.left === null && + tempPair.node.right === null && + tempPair.sum === targetSum + ) return true; + if (tempPair.node.right !== null) { + helperStack.push({ + node: tempPair.node.right, + sum: tempPair.sum + tempPair.node.right.val + }); + } + if (tempPair.node.left !== null) { + helperStack.push({ + node: tempPair.node.left, + sum: tempPair.sum + tempPair.node.left.val + }); + } + } + return false; +}; +``` + +> 0112.路径总和 ii + + + ## Swift 0112.路径总和 **递归** + ```swift func hasPathSum(_ root: TreeNode?, _ targetSum: Int) -> Bool { guard let root = root else { From fde074cb2ab400b44707c178139d7757541bbf39 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Fri, 11 Feb 2022 23:28:30 +0800 Subject: [PATCH 0362/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880112.?= =?UTF-8?q?=E8=B7=AF=E5=BE=84=E6=80=BB=E5=92=8C=20ii=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...57\345\276\204\346\200\273\345\222\214.md" | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git "a/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" "b/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" index de6caef02c..2e10d98d2c 100644 --- "a/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" +++ "b/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" @@ -852,7 +852,39 @@ function hasPathSum(root: TreeNode | null, targetSum: number): boolean { > 0112.路径总和 ii +**递归法:** +```typescript +function pathSum(root: TreeNode | null, targetSum: number): number[][] { + function recur(node: TreeNode, sumGap: number, routeArr: number[]): void { + if ( + node.left === null && + node.right === null && + sumGap === 0 + ) resArr.push([...routeArr]); + if (node.left !== null) { + sumGap -= node.left.val; + routeArr.push(node.left.val); + recur(node.left, sumGap, routeArr); + sumGap += node.left.val; + routeArr.pop(); + } + if (node.right !== null) { + sumGap -= node.right.val; + routeArr.push(node.right.val); + recur(node.right, sumGap, routeArr); + sumGap += node.right.val; + routeArr.pop(); + } + } + const resArr: number[][] = []; + if (root === null) return resArr; + const routeArr: number[] = []; + routeArr.push(root.val); + recur(root, targetSum - root.val, routeArr); + return resArr; +}; +``` ## Swift From fb67fb4320c3ee7c0ee17dd695a5b7a7ea2a4d34 Mon Sep 17 00:00:00 2001 From: "darion.yaphet" Date: Sat, 12 Feb 2022 17:25:57 +0800 Subject: [PATCH 0363/3019] fix java code --- ...45\237\272\347\241\20001\350\203\214\345\214\205-1.md" | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" index 6ff32017cf..fe940b4ca4 100644 --- "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" +++ "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" @@ -271,7 +271,7 @@ int main() { ### java ```java - public static void main(string[] args) { + public static void main(String[] args) { int[] weight = {1, 3, 4}; int[] value = {15, 20, 30}; int bagsize = 4; @@ -292,16 +292,16 @@ int main() { if (j < weight[i - 1]){ dp[i][j] = dp[i - 1][j]; }else{ - dp[i][j] = math.max(dp[i - 1][j], dp[i - 1][j - weight[i - 1]] + value[i - 1]); + dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - weight[i - 1]] + value[i - 1]); } } } //打印dp数组 for (int i = 0; i <= wlen; i++){ for (int j = 0; j <= bagsize; j++){ - system.out.print(dp[i][j] + " "); + System.out.print(dp[i][j] + " "); } - system.out.print("\n"); + System.out.print("\n"); } } ``` From bac5f8d70cef72f5457ac80fd487d86618d27831 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Sun, 13 Feb 2022 16:37:32 +0800 Subject: [PATCH 0364/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880106.?= =?UTF-8?q?=E4=BB=8E=E4=B8=AD=E5=BA=8F=E4=B8=8E=E5=90=8E=E5=BA=8F=E9=81=8D?= =?UTF-8?q?=E5=8E=86=E5=BA=8F=E5=88=97=E6=9E=84=E9=80=A0=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=A0=91.md=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript?= =?UTF-8?q?=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...40\344\272\214\345\217\211\346\240\221.md" | 63 +++++++++++++++++++ 1 file changed, 63 insertions(+) diff --git "a/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" "b/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" index 40d75983cb..9b18e729c7 100644 --- "a/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" @@ -814,7 +814,70 @@ var buildTree = function(preorder, inorder) { }; ``` +## TypeScript + +> 106.从中序与后序遍历序列构造二叉树 + +**创建新数组:** + +```typescript +function buildTree(inorder: number[], postorder: number[]): TreeNode | null { + if (postorder.length === 0) return null; + const rootVal: number = postorder.pop()!; + const rootValIndex: number = inorder.indexOf(rootVal); + const rootNode: TreeNode = new TreeNode(rootVal); + rootNode.left = buildTree(inorder.slice(0, rootValIndex), postorder.slice(0, rootValIndex)); + rootNode.right = buildTree(inorder.slice(rootValIndex + 1), postorder.slice(rootValIndex)); + return rootNode; +}; +``` + +**使用数组索引:** + +```typescript +function buildTree(inorder: number[], postorder: number[]): TreeNode | null { + function recur( + inorder: number[], postorder: number[], + inBegin: number, inEnd: number, + postBegin: number, postEnd: number + ): TreeNode | null { + if (postBegin === postEnd) return null; + const rootVal: number = postorder[postEnd - 1]!; + const rootValIndex: number = inorder.indexOf(rootVal, inBegin); + const rootNode: TreeNode = new TreeNode(rootVal); + + const leftInorderBegin: number = inBegin; + const leftInorderEnd: number = rootValIndex; + const rightInorderBegin: number = rootValIndex + 1; + const rightInorderEnd: number = inEnd; + + const leftPostorderBegin: number = postBegin; + const leftPostorderEnd: number = postBegin + rootValIndex - inBegin; + const rightPostorderBegin: number = leftPostorderEnd; + const rightPostorderEnd: number = postEnd - 1; + + rootNode.left = recur( + inorder, postorder, + leftInorderBegin, leftInorderEnd, + leftPostorderBegin, leftPostorderEnd + ); + rootNode.right = recur( + inorder, postorder, + rightInorderBegin, rightInorderEnd, + rightPostorderBegin, rightPostorderEnd + ); + return rootNode; + } + return recur(inorder, postorder, 0, inorder.length, 0, inorder.length); +}; +``` + +> 105.从前序与中序遍历序列构造二叉树 + + + ## C + 106 从中序与后序遍历序列构造二叉树 ```c From ddf79ac04322e27c50f50be81a46407d7b054950 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Sun, 13 Feb 2022 17:09:38 +0800 Subject: [PATCH 0365/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=88105.?= =?UTF-8?q?=E4=BB=8E=E5=89=8D=E5=BA=8F=E4=B8=8E=E4=B8=AD=E5=BA=8F=E9=81=8D?= =?UTF-8?q?=E5=8E=86=E5=BA=8F=E5=88=97=E6=9E=84=E9=80=A0=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=A0=91=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript?= =?UTF-8?q?=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...40\344\272\214\345\217\211\346\240\221.md" | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git "a/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" "b/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" index 9b18e729c7..3e4211fb89 100644 --- "a/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" @@ -874,7 +874,51 @@ function buildTree(inorder: number[], postorder: number[]): TreeNode | null { > 105.从前序与中序遍历序列构造二叉树 +**新建数组:** +```typescript +function buildTree(preorder: number[], inorder: number[]): TreeNode | null { + if (preorder.length === 0) return null; + const rootVal: number = preorder[0]; + const rootNode: TreeNode = new TreeNode(rootVal); + const rootValIndex: number = inorder.indexOf(rootVal); + rootNode.left = buildTree(preorder.slice(1, rootValIndex + 1), inorder.slice(0, rootValIndex)); + rootNode.right = buildTree(preorder.slice(rootValIndex + 1), inorder.slice(rootValIndex + 1)); + return rootNode; +}; +``` + +**使用数组索引:** + +```typescript +function buildTree(preorder: number[], inorder: number[]): TreeNode | null { + function recur( + preorder: number[], inorder: number[], + preBegin: number, preEnd: number, + inBegin: number, inEnd: number + ): TreeNode | null { + if (preBegin === preEnd) return null; + const rootVal: number = preorder[preBegin]; + const rootNode: TreeNode = new TreeNode(rootVal); + const rootValIndex: number = inorder.indexOf(rootVal, inBegin); + + const leftPreBegin: number = preBegin + 1; + const leftPreEnd: number = preBegin + rootValIndex - inBegin + 1; + const leftInBegin: number = inBegin; + const leftInEnd: number = rootValIndex; + + const rightPreBegin: number = leftPreEnd; + const rightPreEnd: number = preEnd; + const rightInBegin: number = rootValIndex + 1; + const rightInEnd: number = inEnd; + + rootNode.left = recur(preorder, inorder, leftPreBegin, leftPreEnd, leftInBegin, leftInEnd); + rootNode.right = recur(preorder, inorder, rightPreBegin, rightPreEnd, rightInBegin, rightInEnd); + return rootNode; + }; + return recur(preorder, inorder, 0, preorder.length, 0, inorder.length); +}; +``` ## C From 92322870fe4664dffa3dcb8e6020626376417bb3 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Sun, 13 Feb 2022 21:20:24 +0800 Subject: [PATCH 0366/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880654.?= =?UTF-8?q?=E6=9C=80=E5=A4=A7=E4=BA=8C=E5=8F=89=E6=A0=91.md=EF=BC=89?= =?UTF-8?q?=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...47\344\272\214\345\217\211\346\240\221.md" | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git "a/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" "b/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" index 44c74f8903..1c73354b00 100644 --- "a/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" @@ -371,7 +371,56 @@ var constructMaximumBinaryTree = function (nums) { }; ``` +## TypeScript + +> 新建数组法: + +```typescript +function constructMaximumBinaryTree(nums: number[]): TreeNode | null { + if (nums.length === 0) return null; + let maxIndex: number = 0; + let maxVal: number = nums[0]; + for (let i = 1, length = nums.length; i < length; i++) { + if (nums[i] > maxVal) { + maxIndex = i; + maxVal = nums[i]; + } + } + const rootNode: TreeNode = new TreeNode(maxVal); + rootNode.left = constructMaximumBinaryTree(nums.slice(0, maxIndex)); + rootNode.right = constructMaximumBinaryTree(nums.slice(maxIndex + 1)); + return rootNode; +}; +``` + +> 使用数组索引法: + +```typescript +function constructMaximumBinaryTree(nums: number[]): TreeNode | null { + // 左闭右开区间[begin, end) + function recur(nums: number[], begin: number, end: number): TreeNode | null { + if (begin === end) return null; + let maxIndex: number = begin; + let maxVal: number = nums[begin]; + for (let i = begin + 1; i < end; i++) { + if (nums[i] > maxVal) { + maxIndex = i; + maxVal = nums[i]; + } + } + const rootNode: TreeNode = new TreeNode(maxVal); + rootNode.left = recur(nums, begin, maxIndex); + rootNode.right = recur(nums, maxIndex + 1, end); + return rootNode; + } + return recur(nums, 0, nums.length); +}; +``` + + + ## C + ```c struct TreeNode* traversal(int* nums, int left, int right) { //若左边界大于右边界,返回NULL From 2440d6a365def0caf92f041886545117ec0c1e9f Mon Sep 17 00:00:00 2001 From: Dewittt <43514251+Dewittt@users.noreply.github.com> Date: Mon, 14 Feb 2022 14:04:34 +0800 Subject: [PATCH 0367/3019] =?UTF-8?q?Update=20=E8=83=8C=E5=8C=85=E9=97=AE?= =?UTF-8?q?=E9=A2=98=E7=90=86=E8=AE=BA=E5=9F=BA=E7=A1=80=E5=AE=8C=E5=85=A8?= =?UTF-8?q?=E8=83=8C=E5=8C=85.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 删除多余字符 --- ...\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" index cea69c724c..2cdfeffa50 100644 --- "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" +++ "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" @@ -94,7 +94,7 @@ dp状态图如下: 看了这两个图,大家就会理解,完全背包中,两个for循环的先后循序,都不影响计算dp[j]所需要的值(这个值就是下标j之前所对应的dp[j])。 -先遍历被背包在遍历物品,代码如下: +先遍历背包在遍历物品,代码如下: ```CPP // 先遍历背包,再遍历物品 From 30f2c6bc1763bb3cfe607707f96b1d9047a3d2b3 Mon Sep 17 00:00:00 2001 From: Verolilo <57696907+Verolilo@users.noreply.github.com> Date: Mon, 14 Feb 2022 14:15:33 +0800 Subject: [PATCH 0368/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B00070.=E7=88=AC?= =?UTF-8?q?=E6=A5=BC=E6=A2=AF.md=20python=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 更新0070.爬楼梯.md python版本,添加了O(1)复杂度的python代码 --- ...0.\347\210\254\346\245\274\346\242\257.md" | 28 +++++++++++++------ 1 file changed, 20 insertions(+), 8 deletions(-) diff --git "a/problems/0070.\347\210\254\346\245\274\346\242\257.md" "b/problems/0070.\347\210\254\346\245\274\346\242\257.md" index 7f47a991e8..da19ea0ec1 100644 --- "a/problems/0070.\347\210\254\346\245\274\346\242\257.md" +++ "b/problems/0070.\347\210\254\346\245\274\346\242\257.md" @@ -256,16 +256,28 @@ public int climbStairs(int n) { ### Python ```python +# 空间复杂度为O(n)版本 class Solution: def climbStairs(self, n: int) -> int: - # dp[i]表示爬到第i级楼梯的种数, (1, 2) (2, 1)是两种不同的类型 - dp = [0] * (n + 1) - dp[0] = 1 - for i in range(n+1): - for j in range(1, 3): - if i>=j: - dp[i] += dp[i-j] - return dp[-1] + # dp[i] 为第 i 阶楼梯有多少种方法爬到楼顶 + dp=[0]*(n+1) + dp[0]=1 + dp[1]=1 + for i in range(2,n+1): + dp[i]=dp[i-1]+dp[i-2] + return dp[n] + +# 空间复杂度为O(1)版本 +class Solution: + def climbStairs(self, n: int) -> int: + dp=[0]*(n+1) + dp[0]=1 + dp[1]=1 + for i in range(2,n+1): + tmp=dp[0]+dp[1] + dp[0]=dp[1] + dp[1]=tmp + return dp[1] ``` ### Go From 6d5a0d0340798f773104f418d3db71797c5db717 Mon Sep 17 00:00:00 2001 From: Verolilo <57696907+Verolilo@users.noreply.github.com> Date: Wed, 16 Feb 2022 10:22:19 +0800 Subject: [PATCH 0369/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B00213.=E6=89=93?= =?UTF-8?q?=E5=AE=B6=E5=8A=AB=E8=88=8DII.md=20=E6=9B=B4=E7=AE=80=E6=B4=81?= =?UTF-8?q?=E7=9A=84python=20=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\345\256\266\345\212\253\350\210\215II.md" | 34 ++++++++++--------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git "a/problems/0213.\346\211\223\345\256\266\345\212\253\350\210\215II.md" "b/problems/0213.\346\211\223\345\256\266\345\212\253\350\210\215II.md" index b6c2d080b8..8e569e46cf 100644 --- "a/problems/0213.\346\211\223\345\256\266\345\212\253\350\210\215II.md" +++ "b/problems/0213.\346\211\223\345\256\266\345\212\253\350\210\215II.md" @@ -123,22 +123,24 @@ Python: ```Python class Solution: def rob(self, nums: List[int]) -> int: - if (n := len(nums)) == 0: - return 0 - if n == 1: - return nums[0] - result1 = self.robRange(nums, 0, n - 2) - result2 = self.robRange(nums, 1, n - 1) - return max(result1 , result2) - - def robRange(self, nums: List[int], start: int, end: int) -> int: - if end == start: return nums[start] - dp = [0] * len(nums) - dp[start] = nums[start] - dp[start + 1] = max(nums[start], nums[start + 1]) - for i in range(start + 2, end + 1): - dp[i] = max(dp[i -2] + nums[i], dp[i - 1]) - return dp[end] + #在198入门级的打家劫舍问题上分两种情况考虑 + #一是不偷第一间房,二是不偷最后一间房 + if len(nums)==1:#题目中提示nums.length>=1,所以不需要考虑len(nums)==0的情况 + return nums[0] + val1=self.roblist(nums[1:])#不偷第一间房 + val2=self.roblist(nums[:-1])#不偷最后一间房 + return max(val1,val2) + + def robRange(self,nums): + l=len(nums) + dp=[0]*l + dp[0]=nums[0] + for i in range(1,l): + if i==1: + dp[i]=max(dp[i-1],nums[i]) + else: + dp[i]=max(dp[i-1],dp[i-2]+nums[i]) + return dp[-1] ``` javascipt: From f39d5a110c19963037374a3f1ea253b30f08becb Mon Sep 17 00:00:00 2001 From: erdengk <15596570256@163.com> Date: Wed, 16 Feb 2022 16:23:39 +0800 Subject: [PATCH 0370/3019] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=83=A8=E5=88=86?= =?UTF-8?q?=E9=94=99=E5=AD=97=20&=20=E4=BC=98=E5=8C=96=E5=8F=98=E9=87=8F?= =?UTF-8?q?=E5=90=8D=E5=91=BD=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...40\344\272\214\345\217\211\346\240\221.md" | 4 ++-- ...54\346\260\264\346\211\276\351\233\266.md" | 20 +++++++++---------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git "a/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" "b/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" index 30ec684d2a..cb1d75d9c1 100644 --- "a/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" @@ -89,9 +89,9 @@ TreeNode* traversal (vector& inorder, vector& postorder) { **难点大家应该发现了,就是如何切割,以及边界值找不好很容易乱套。** -此时应该注意确定切割的标准,是左闭右开,还有左开又闭,还是左闭又闭,这个就是不变量,要在递归中保持这个不变量。 +此时应该注意确定切割的标准,是左闭右开,还有左开右闭,还是左闭右闭,这个就是不变量,要在递归中保持这个不变量。 -**在切割的过程中会产生四个区间,把握不好不变量的话,一会左闭右开,一会左闭又闭,必然乱套!** +**在切割的过程中会产生四个区间,把握不好不变量的话,一会左闭右开,一会左闭右闭,必然乱套!** 我在[数组:每次遇到二分法,都是一看就会,一写就废](https://programmercarl.com/0035.搜索插入位置.html)和[数组:这个循环可以转懵很多人!](https://programmercarl.com/0059.螺旋矩阵II.html)中都强调过循环不变量的重要性,在二分查找以及螺旋矩阵的求解中,坚持循环不变量非常重要,本题也是。 diff --git "a/problems/0860.\346\237\240\346\252\254\346\260\264\346\211\276\351\233\266.md" "b/problems/0860.\346\237\240\346\252\254\346\260\264\346\211\276\351\233\266.md" index 01bd1a3bcf..f48ecf4d60 100644 --- "a/problems/0860.\346\237\240\346\252\254\346\260\264\346\211\276\351\233\266.md" +++ "b/problems/0860.\346\237\240\346\252\254\346\260\264\346\211\276\351\233\266.md" @@ -128,24 +128,24 @@ public: ```java class Solution { public boolean lemonadeChange(int[] bills) { - int cash_5 = 0; - int cash_10 = 0; + int five = 0; + int ten = 0; for (int i = 0; i < bills.length; i++) { if (bills[i] == 5) { - cash_5++; + five++; } else if (bills[i] == 10) { - cash_5--; - cash_10++; + five--; + ten++; } else if (bills[i] == 20) { - if (cash_10 > 0) { - cash_10--; - cash_5--; + if (ten > 0) { + ten--; + five--; } else { - cash_5 -= 3; + five -= 3; } } - if (cash_5 < 0 || cash_10 < 0) return false; + if (five < 0 || ten < 0) return false; } return true; From 1a553b01d691478c049fd39e59548f3a71c9f456 Mon Sep 17 00:00:00 2001 From: erdengk <15596570256@163.com> Date: Wed, 16 Feb 2022 17:43:36 +0800 Subject: [PATCH 0371/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200491.=E9=80=92?= =?UTF-8?q?=E5=A2=9E=E5=AD=90=E5=BA=8F=E5=88=97.md=20Java=E8=A7=A3?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...36\345\255\220\345\272\217\345\210\227.md" | 34 ++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git "a/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" "b/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" index 6d88119e7c..298586c7ca 100644 --- "a/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" @@ -227,7 +227,39 @@ class Solution { } } ``` - +```java +//法二:使用map +class Solution { + //结果集合 + List> res = new ArrayList<>(); + //路径集合 + LinkedList path = new LinkedList<>(); + public List> findSubsequences(int[] nums) { + getSubsequences(nums,0); + return res; + } + private void getSubsequences( int[] nums, int start ) { + if(path.size()>1 ){ + res.add( new ArrayList<>(path) ); + // 注意这里不要加return,要取树上的节点 + } + HashMap map = new HashMap<>(); + for(int i=start ;i < nums.length ;i++){ + if(!path.isEmpty() && nums[i]< path.getLast()){ + continue; + } + // 使用过了当前数字 + if ( map.getOrDefault( nums[i],0 ) >=1 ){ + continue; + } + map.put(nums[i],map.getOrDefault( nums[i],0 )+1); + path.add( nums[i] ); + getSubsequences( nums,i+1 ); + path.removeLast(); + } + } +} +``` ### Python From fac4fc5193caac05a5418338f281e25c02a2739b Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Wed, 16 Feb 2022 23:22:26 +0800 Subject: [PATCH 0372/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880617.?= =?UTF-8?q?=E5=90=88=E5=B9=B6=E4=BA=8C=E5=8F=89=E6=A0=91.md=EF=BC=89?= =?UTF-8?q?=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...66\344\272\214\345\217\211\346\240\221.md" | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git "a/problems/0617.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md" "b/problems/0617.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md" index f815d74132..55786ea988 100644 --- "a/problems/0617.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0617.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md" @@ -583,6 +583,56 @@ var mergeTrees = function(root1, root2) { ``` +## TypeScript + +> 递归法: + +```type +function mergeTrees(root1: TreeNode | null, root2: TreeNode | null): TreeNode | null { + if (root1 === null) return root2; + if (root2 === null) return root1; + const resNode: TreeNode = new TreeNode(root1.val + root2.val); + resNode.left = mergeTrees(root1.left, root2.left); + resNode.right = mergeTrees(root1.right, root2.right); + return resNode; +}; +``` + +> 迭代法: + +```typescript +function mergeTrees(root1: TreeNode | null, root2: TreeNode | null): TreeNode | null { + if (root1 === null) return root2; + if (root2 === null) return root1; + const helperQueue1: TreeNode[] = [], + helperQueue2: TreeNode[] = []; + helperQueue1.push(root1); + helperQueue2.push(root2); + let tempNode1: TreeNode, + tempNode2: TreeNode; + while (helperQueue1.length > 0) { + tempNode1 = helperQueue1.shift()!; + tempNode2 = helperQueue2.shift()!; + tempNode1.val += tempNode2.val; + if (tempNode1.left !== null && tempNode2.left !== null) { + helperQueue1.push(tempNode1.left); + helperQueue2.push(tempNode2.left); + } else if (tempNode1.left === null) { + tempNode1.left = tempNode2.left; + } + if (tempNode1.right !== null && tempNode2.right !== null) { + helperQueue1.push(tempNode1.right); + helperQueue2.push(tempNode2.right); + } else if (tempNode1.right === null) { + tempNode1.right = tempNode2.right; + } + } + return root1; +}; +``` + + + -----------------------

From bd2310622b8a4d726288759820a60b5a62fce590 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Thu, 17 Feb 2022 10:25:56 +0800 Subject: [PATCH 0373/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880700.?= =?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=90=9C=E7=B4=A2=E6=A0=91=E4=B8=AD=E7=9A=84?= =?UTF-8?q?=E6=90=9C=E7=B4=A2.md=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typesc?= =?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 --- ...55\347\232\204\346\220\234\347\264\242.md" | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git "a/problems/0700.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\220\234\347\264\242.md" "b/problems/0700.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\220\234\347\264\242.md" index 1521514a78..00ba875327 100644 --- "a/problems/0700.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\220\234\347\264\242.md" +++ "b/problems/0700.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\220\234\347\264\242.md" @@ -334,6 +334,36 @@ var searchBST = function (root, val) { }; ``` +## TypeScript + +> 递归法 + +```typescript +function searchBST(root: TreeNode | null, val: number): TreeNode | null { + if (root === null || root.val === val) return root; + if (root.val < val) return searchBST(root.right, val); + if (root.val > val) return searchBST(root.left, val); + return null; +}; +``` + +> 迭代法 + +```typescript +function searchBST(root: TreeNode | null, val: number): TreeNode | null { + let resNode: TreeNode | null = root; + while (resNode !== null) { + if (resNode.val === val) return resNode; + if (resNode.val < val) { + resNode = resNode.right; + } else { + resNode = resNode.left; + } + } + return null; +}; +``` + ----------------------- From 7af58b92b86e045998ce3f7ceca186d73809cbdd Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Thu, 17 Feb 2022 15:07:13 +0800 Subject: [PATCH 0374/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880098.?= =?UTF-8?q?=E9=AA=8C=E8=AF=81=E4=BA=8C=E5=8F=89=E6=90=9C=E7=B4=A2=E6=A0=91?= =?UTF-8?q?.md=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...11\346\220\234\347\264\242\346\240\221.md" | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git "a/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" index 4ed2961977..c0f3e0391d 100644 --- "a/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" +++ "b/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" @@ -526,6 +526,48 @@ var isValidBST = function (root) { }; ``` +## TypeScript + +> 辅助数组解决: + +```typescript +function isValidBST(root: TreeNode | null): boolean { + const traversalArr: number[] = []; + function inorderTraverse(root: TreeNode | null): void { + if (root === null) return; + inorderTraverse(root.left); + traversalArr.push(root.val); + inorderTraverse(root.right); + } + inorderTraverse(root); + for (let i = 0, length = traversalArr.length; i < length - 1; i++) { + if (traversalArr[i] >= traversalArr[i + 1]) return false; + } + return true; +}; +``` + +> 递归中解决: + +```typescript +function isValidBST(root: TreeNode | null): boolean { + let maxVal = -Infinity; + function inorderTraverse(root: TreeNode | null): boolean { + if (root === null) return true; + let leftValid: boolean = inorderTraverse(root.left); + if (!leftValid) return false; + if (maxVal < root.val) { + maxVal = root.val + } else { + return false; + } + let rightValid: boolean = inorderTraverse(root.right); + return leftValid && rightValid; + } + return inorderTraverse(root); +}; +``` + ----------------------- From 6cb2076827726fc5be341e226585882424e523e7 Mon Sep 17 00:00:00 2001 From: hs-zhangsan <1513157458@qq.com> Date: Fri, 18 Feb 2022 17:03:41 +0800 Subject: [PATCH 0375/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20541.=E5=8F=8D?= =?UTF-8?q?=E8=BD=AC=E5=AD=97=E7=AC=A6=E4=B8=B2II=20C=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 --- ...\345\255\227\347\254\246\344\270\262II.md" | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git "a/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" "b/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" index 14b8601a7e..bf59f52ddb 100644 --- "a/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" +++ "b/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" @@ -98,8 +98,31 @@ public: ## 其他语言版本 +C: + +```c +char * reverseStr(char * s, int k){ + int len = strlen(s); + + for (int i = 0; i < len; i += (2 * k)) { + //判断剩余字符是否少于 k + k = i + k > len ? len - i : k; + + int left = i; + int right = i + k - 1; + while (left < right) { + char temp = s[left]; + s[left++] = s[right]; + s[right--] = temp; + } + } + + return s; +} +``` Java: + ```Java //解法一 class Solution { From 266702c291505ab3847d520ab7474789d0e97fab Mon Sep 17 00:00:00 2001 From: youngyangyang04 <826123027@qq.com> Date: Fri, 18 Feb 2022 22:09:38 +0800 Subject: [PATCH 0376/3019] Update --- ...236\204\345\273\272\344\272\214\345\217\211\346\240\221.md" | 3 --- ...203\275\345\234\250\350\277\231\351\207\214\344\272\206.md" | 3 --- ...253\237\346\230\257\345\244\232\345\244\247\357\274\237.md" | 3 --- ...275\221\345\205\254\345\217\270\346\200\273\347\273\223.md" | 3 --- ...\210\346\230\257ACM\346\250\241\345\274\217\357\274\237.md" | 3 --- ...203\275\345\234\250\350\277\231\351\207\214\357\274\201.md" | 3 --- ...207\240\344\270\252\347\226\221\351\227\256\357\274\237.md" | 3 --- ...255\230\346\266\210\350\200\227\344\271\210\357\274\237.md" | 3 --- ...274\226\350\257\221\350\277\220\350\241\214\357\274\237.md" | 3 --- ...275\221\345\205\254\345\217\270\346\200\273\347\273\223.md" | 3 --- ...275\221\345\205\254\345\217\270\346\200\273\347\273\223.md" | 3 --- ...275\221\345\205\254\345\217\270\346\200\273\347\273\223.md" | 3 --- ...275\221\345\205\254\345\217\270\346\200\273\347\273\223.md" | 3 --- ...275\221\345\205\254\345\217\270\346\200\273\347\273\223.md" | 3 --- ...206\231\346\226\207\346\241\243\345\267\245\345\205\267.md" | 3 --- ...250\213\345\272\217\345\221\230\347\256\200\345\216\206.md" | 3 --- ...244\215\346\235\202\345\272\246\345\210\206\346\236\220.md" | 3 --- ...227\264\345\244\215\346\235\202\345\272\246\357\274\201.md" | 3 --- 18 files changed, 54 deletions(-) diff --git "a/problems/\345\211\215\345\272\217/ACM\346\250\241\345\274\217\345\246\202\344\275\225\346\236\204\345\273\272\344\272\214\345\217\211\346\240\221.md" "b/problems/\345\211\215\345\272\217/ACM\346\250\241\345\274\217\345\246\202\344\275\225\346\236\204\345\273\272\344\272\214\345\217\211\346\240\221.md" index d3b2656eba..fc7a1823bf 100644 --- "a/problems/\345\211\215\345\272\217/ACM\346\250\241\345\274\217\345\246\202\344\275\225\346\236\204\345\273\272\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/\345\211\215\345\272\217/ACM\346\250\241\345\274\217\345\246\202\344\275\225\346\236\204\345\273\272\344\272\214\345\217\211\346\240\221.md" @@ -251,7 +251,4 @@ int main() { ``` ----------------------- -* 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) -* B站视频:[代码随想录](https://space.bilibili.com/525438321) -* 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)
diff --git "a/problems/\345\211\215\345\272\217/BAT\347\272\247\345\210\253\346\212\200\346\234\257\351\235\242\350\257\225\346\265\201\347\250\213\345\222\214\346\263\250\346\204\217\344\272\213\351\241\271\351\203\275\345\234\250\350\277\231\351\207\214\344\272\206.md" "b/problems/\345\211\215\345\272\217/BAT\347\272\247\345\210\253\346\212\200\346\234\257\351\235\242\350\257\225\346\265\201\347\250\213\345\222\214\346\263\250\346\204\217\344\272\213\351\241\271\351\203\275\345\234\250\350\277\231\351\207\214\344\272\206.md" index c579773969..6678860d65 100644 --- "a/problems/\345\211\215\345\272\217/BAT\347\272\247\345\210\253\346\212\200\346\234\257\351\235\242\350\257\225\346\265\201\347\250\213\345\222\214\346\263\250\346\204\217\344\272\213\351\241\271\351\203\275\345\234\250\350\277\231\351\207\214\344\272\206.md" +++ "b/problems/\345\211\215\345\272\217/BAT\347\272\247\345\210\253\346\212\200\346\234\257\351\235\242\350\257\225\346\265\201\347\250\213\345\222\214\346\263\250\346\204\217\344\272\213\351\241\271\351\203\275\345\234\250\350\277\231\351\207\214\344\272\206.md" @@ -218,7 +218,4 @@ leetcode是专门针对算法练习的题库,leetcode现在也推出了中文 ----------------------- -* 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) -* B站视频:[代码随想录](https://space.bilibili.com/525438321) -* 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)
diff --git "a/problems/\345\211\215\345\272\217/On\347\232\204\347\256\227\346\263\225\345\261\205\347\204\266\350\266\205\346\227\266\344\272\206\357\274\214\346\255\244\346\227\266\347\232\204n\347\251\266\347\253\237\346\230\257\345\244\232\345\244\247\357\274\237.md" "b/problems/\345\211\215\345\272\217/On\347\232\204\347\256\227\346\263\225\345\261\205\347\204\266\350\266\205\346\227\266\344\272\206\357\274\214\346\255\244\346\227\266\347\232\204n\347\251\266\347\253\237\346\230\257\345\244\232\345\244\247\357\274\237.md" index 9a56937c95..5257ceb94d 100644 --- "a/problems/\345\211\215\345\272\217/On\347\232\204\347\256\227\346\263\225\345\261\205\347\204\266\350\266\205\346\227\266\344\272\206\357\274\214\346\255\244\346\227\266\347\232\204n\347\251\266\347\253\237\346\230\257\345\244\232\345\244\247\357\274\237.md" +++ "b/problems/\345\211\215\345\272\217/On\347\232\204\347\256\227\346\263\225\345\261\205\347\204\266\350\266\205\346\227\266\344\272\206\357\274\214\346\255\244\346\227\266\347\232\204n\347\251\266\347\253\237\346\230\257\345\244\232\345\244\247\357\274\237.md" @@ -280,7 +280,4 @@ public class TimeComplexity { ----------------------- -* 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) -* B站视频:[代码随想录](https://space.bilibili.com/525438321) -* 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)
diff --git "a/problems/\345\211\215\345\272\217/\344\270\212\346\265\267\344\272\222\350\201\224\347\275\221\345\205\254\345\217\270\346\200\273\347\273\223.md" "b/problems/\345\211\215\345\272\217/\344\270\212\346\265\267\344\272\222\350\201\224\347\275\221\345\205\254\345\217\270\346\200\273\347\273\223.md" index 08c1589511..ffcbe77b4c 100644 --- "a/problems/\345\211\215\345\272\217/\344\270\212\346\265\267\344\272\222\350\201\224\347\275\221\345\205\254\345\217\270\346\200\273\347\273\223.md" +++ "b/problems/\345\211\215\345\272\217/\344\270\212\346\265\267\344\272\222\350\201\224\347\275\221\345\205\254\345\217\270\346\200\273\347\273\223.md" @@ -130,7 +130,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/\345\211\215\345\272\217/\344\273\200\344\271\210\346\230\257\346\240\270\345\277\203\344\273\243\347\240\201\346\250\241\345\274\217\357\274\214\344\273\200\344\271\210\345\217\210\346\230\257ACM\346\250\241\345\274\217\357\274\237.md" "b/problems/\345\211\215\345\272\217/\344\273\200\344\271\210\346\230\257\346\240\270\345\277\203\344\273\243\347\240\201\346\250\241\345\274\217\357\274\214\344\273\200\344\271\210\345\217\210\346\230\257ACM\346\250\241\345\274\217\357\274\237.md" index 3c5fb4e47f..54c5b6ecc7 100644 --- "a/problems/\345\211\215\345\272\217/\344\273\200\344\271\210\346\230\257\346\240\270\345\277\203\344\273\243\347\240\201\346\250\241\345\274\217\357\274\214\344\273\200\344\271\210\345\217\210\346\230\257ACM\346\250\241\345\274\217\357\274\237.md" +++ "b/problems/\345\211\215\345\272\217/\344\273\200\344\271\210\346\230\257\346\240\270\345\277\203\344\273\243\347\240\201\346\250\241\345\274\217\357\274\214\344\273\200\344\271\210\345\217\210\346\230\257ACM\346\250\241\345\274\217\357\274\237.md" @@ -119,7 +119,4 @@ int main() { ----------------------- -* 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) -* B站视频:[代码随想录](https://space.bilibili.com/525438321) -* 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)
diff --git "a/problems/\345\211\215\345\272\217/\345\205\263\344\272\216\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\214\344\275\240\344\270\215\347\237\245\351\201\223\347\232\204\351\203\275\345\234\250\350\277\231\351\207\214\357\274\201.md" "b/problems/\345\211\215\345\272\217/\345\205\263\344\272\216\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\214\344\275\240\344\270\215\347\237\245\351\201\223\347\232\204\351\203\275\345\234\250\350\277\231\351\207\214\357\274\201.md" index cfcbed1a6e..478b82e4f3 100644 --- "a/problems/\345\211\215\345\272\217/\345\205\263\344\272\216\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\214\344\275\240\344\270\215\347\237\245\351\201\223\347\232\204\351\203\275\345\234\250\350\277\231\351\207\214\357\274\201.md" +++ "b/problems/\345\211\215\345\272\217/\345\205\263\344\272\216\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\214\344\275\240\344\270\215\347\237\245\351\201\223\347\232\204\351\203\275\345\234\250\350\277\231\351\207\214\357\274\201.md" @@ -170,7 +170,4 @@ $O(2 × n^2 + 10 × n + 1000) < O(3 × n^2)$,所以说最后省略掉常数项 ----------------------- -* 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) -* B站视频:[代码随想录](https://space.bilibili.com/525438321) -* 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)
diff --git "a/problems/\345\211\215\345\272\217/\345\205\263\344\272\216\347\251\272\351\227\264\345\244\215\346\235\202\345\272\246\357\274\214\345\217\257\350\203\275\346\234\211\345\207\240\344\270\252\347\226\221\351\227\256\357\274\237.md" "b/problems/\345\211\215\345\272\217/\345\205\263\344\272\216\347\251\272\351\227\264\345\244\215\346\235\202\345\272\246\357\274\214\345\217\257\350\203\275\346\234\211\345\207\240\344\270\252\347\226\221\351\227\256\357\274\237.md" index 95ffe597be..d49b42a2a1 100644 --- "a/problems/\345\211\215\345\272\217/\345\205\263\344\272\216\347\251\272\351\227\264\345\244\215\346\235\202\345\272\246\357\274\214\345\217\257\350\203\275\346\234\211\345\207\240\344\270\252\347\226\221\351\227\256\357\274\237.md" +++ "b/problems/\345\211\215\345\272\217/\345\205\263\344\272\216\347\251\272\351\227\264\345\244\215\346\235\202\345\272\246\357\274\214\345\217\257\350\203\275\346\234\211\345\207\240\344\270\252\347\226\221\351\227\256\357\274\237.md" @@ -73,7 +73,4 @@ for (int i = 0; i < n; 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/\345\211\215\345\272\217/\345\210\267\344\272\206\350\277\231\344\271\210\345\244\232\351\242\230\357\274\214\344\275\240\344\272\206\350\247\243\350\207\252\345\267\261\344\273\243\347\240\201\347\232\204\345\206\205\345\255\230\346\266\210\350\200\227\344\271\210\357\274\237.md" "b/problems/\345\211\215\345\272\217/\345\210\267\344\272\206\350\277\231\344\271\210\345\244\232\351\242\230\357\274\214\344\275\240\344\272\206\350\247\243\350\207\252\345\267\261\344\273\243\347\240\201\347\232\204\345\206\205\345\255\230\346\266\210\350\200\227\344\271\210\357\274\237.md" index 3fccfb2278..0364fc8b4a 100644 --- "a/problems/\345\211\215\345\272\217/\345\210\267\344\272\206\350\277\231\344\271\210\345\244\232\351\242\230\357\274\214\344\275\240\344\272\206\350\247\243\350\207\252\345\267\261\344\273\243\347\240\201\347\232\204\345\206\205\345\255\230\346\266\210\350\200\227\344\271\210\357\274\237.md" +++ "b/problems/\345\211\215\345\272\217/\345\210\267\344\272\206\350\277\231\344\271\210\345\244\232\351\242\230\357\274\214\344\275\240\344\272\206\350\247\243\350\207\252\345\267\261\344\273\243\347\240\201\347\232\204\345\206\205\345\255\230\346\266\210\350\200\227\344\271\210\357\274\237.md" @@ -150,7 +150,4 @@ char型的数据和int型的数据挨在一起,该int数据从地址1开始, ----------------------- -* 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) -* B站视频:[代码随想录](https://space.bilibili.com/525438321) -* 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)
diff --git "a/problems/\345\211\215\345\272\217/\345\212\233\346\211\243\344\270\212\347\232\204\344\273\243\347\240\201\346\203\263\345\234\250\346\234\254\345\234\260\347\274\226\350\257\221\350\277\220\350\241\214\357\274\237.md" "b/problems/\345\211\215\345\272\217/\345\212\233\346\211\243\344\270\212\347\232\204\344\273\243\347\240\201\346\203\263\345\234\250\346\234\254\345\234\260\347\274\226\350\257\221\350\277\220\350\241\214\357\274\237.md" index c4899a2068..dca6eec37b 100644 --- "a/problems/\345\211\215\345\272\217/\345\212\233\346\211\243\344\270\212\347\232\204\344\273\243\347\240\201\346\203\263\345\234\250\346\234\254\345\234\260\347\274\226\350\257\221\350\277\220\350\241\214\357\274\237.md" +++ "b/problems/\345\211\215\345\272\217/\345\212\233\346\211\243\344\270\212\347\232\204\344\273\243\347\240\201\346\203\263\345\234\250\346\234\254\345\234\260\347\274\226\350\257\221\350\277\220\350\241\214\357\274\237.md" @@ -67,7 +67,4 @@ int main() { ----------------------- -* 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) -* B站视频:[代码随想录](https://space.bilibili.com/525438321) -* 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)
diff --git "a/problems/\345\211\215\345\272\217/\345\214\227\344\272\254\344\272\222\350\201\224\347\275\221\345\205\254\345\217\270\346\200\273\347\273\223.md" "b/problems/\345\211\215\345\272\217/\345\214\227\344\272\254\344\272\222\350\201\224\347\275\221\345\205\254\345\217\270\346\200\273\347\273\223.md" index 0e22dad640..02a877b7c6 100644 --- "a/problems/\345\211\215\345\272\217/\345\214\227\344\272\254\344\272\222\350\201\224\347\275\221\345\205\254\345\217\270\346\200\273\347\273\223.md" +++ "b/problems/\345\211\215\345\272\217/\345\214\227\344\272\254\344\272\222\350\201\224\347\275\221\345\205\254\345\217\270\346\200\273\347\273\223.md" @@ -116,7 +116,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/\345\211\215\345\272\217/\345\271\277\345\267\236\344\272\222\350\201\224\347\275\221\345\205\254\345\217\270\346\200\273\347\273\223.md" "b/problems/\345\211\215\345\272\217/\345\271\277\345\267\236\344\272\222\350\201\224\347\275\221\345\205\254\345\217\270\346\200\273\347\273\223.md" index ae41c89972..1cf0da36b3 100644 --- "a/problems/\345\211\215\345\272\217/\345\271\277\345\267\236\344\272\222\350\201\224\347\275\221\345\205\254\345\217\270\346\200\273\347\273\223.md" +++ "b/problems/\345\211\215\345\272\217/\345\271\277\345\267\236\344\272\222\350\201\224\347\275\221\345\205\254\345\217\270\346\200\273\347\273\223.md" @@ -79,7 +79,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/\345\211\215\345\272\217/\346\210\220\351\203\275\344\272\222\350\201\224\347\275\221\345\205\254\345\217\270\346\200\273\347\273\223.md" "b/problems/\345\211\215\345\272\217/\346\210\220\351\203\275\344\272\222\350\201\224\347\275\221\345\205\254\345\217\270\346\200\273\347\273\223.md" index d44800cd2d..7964f23c64 100644 --- "a/problems/\345\211\215\345\272\217/\346\210\220\351\203\275\344\272\222\350\201\224\347\275\221\345\205\254\345\217\270\346\200\273\347\273\223.md" +++ "b/problems/\345\211\215\345\272\217/\346\210\220\351\203\275\344\272\222\350\201\224\347\275\221\345\205\254\345\217\270\346\200\273\347\273\223.md" @@ -77,7 +77,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/\345\211\215\345\272\217/\346\235\255\345\267\236\344\272\222\350\201\224\347\275\221\345\205\254\345\217\270\346\200\273\347\273\223.md" "b/problems/\345\211\215\345\272\217/\346\235\255\345\267\236\344\272\222\350\201\224\347\275\221\345\205\254\345\217\270\346\200\273\347\273\223.md" index 326a176b73..029ee38089 100644 --- "a/problems/\345\211\215\345\272\217/\346\235\255\345\267\236\344\272\222\350\201\224\347\275\221\345\205\254\345\217\270\346\200\273\347\273\223.md" +++ "b/problems/\345\211\215\345\272\217/\346\235\255\345\267\236\344\272\222\350\201\224\347\275\221\345\205\254\345\217\270\346\200\273\347\273\223.md" @@ -87,7 +87,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/\345\211\215\345\272\217/\346\267\261\345\234\263\344\272\222\350\201\224\347\275\221\345\205\254\345\217\270\346\200\273\347\273\223.md" "b/problems/\345\211\215\345\272\217/\346\267\261\345\234\263\344\272\222\350\201\224\347\275\221\345\205\254\345\217\270\346\200\273\347\273\223.md" index 9e08931549..61bd52e8da 100644 --- "a/problems/\345\211\215\345\272\217/\346\267\261\345\234\263\344\272\222\350\201\224\347\275\221\345\205\254\345\217\270\346\200\273\347\273\223.md" +++ "b/problems/\345\211\215\345\272\217/\346\267\261\345\234\263\344\272\222\350\201\224\347\275\221\345\205\254\345\217\270\346\200\273\347\273\223.md" @@ -82,7 +82,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/\345\211\215\345\272\217/\347\250\213\345\272\217\345\221\230\345\206\231\346\226\207\346\241\243\345\267\245\345\205\267.md" "b/problems/\345\211\215\345\272\217/\347\250\213\345\272\217\345\221\230\345\206\231\346\226\207\346\241\243\345\267\245\345\205\267.md" index e4193c426a..5504ae7ac5 100644 --- "a/problems/\345\211\215\345\272\217/\347\250\213\345\272\217\345\221\230\345\206\231\346\226\207\346\241\243\345\267\245\345\205\267.md" +++ "b/problems/\345\211\215\345\272\217/\347\250\213\345\272\217\345\221\230\345\206\231\346\226\207\346\241\243\345\267\245\345\205\267.md" @@ -136,7 +136,4 @@ Markdown支持部分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/\345\211\215\345\272\217/\347\250\213\345\272\217\345\221\230\347\256\200\345\216\206.md" "b/problems/\345\211\215\345\272\217/\347\250\213\345\272\217\345\221\230\347\256\200\345\216\206.md" index f47516dc51..522fc5f752 100644 --- "a/problems/\345\211\215\345\272\217/\347\250\213\345\272\217\345\221\230\347\256\200\345\216\206.md" +++ "b/problems/\345\211\215\345\272\217/\347\250\213\345\272\217\345\221\230\347\256\200\345\216\206.md" @@ -133,7 +133,4 @@ Carl校招社招都拿过大厂的offer,同时也看过很多应聘者的简 ----------------------- -* 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) -* B站视频:[代码随想录](https://space.bilibili.com/525438321) -* 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)
diff --git "a/problems/\345\211\215\345\272\217/\351\200\222\345\275\222\347\256\227\346\263\225\347\232\204\346\227\266\351\227\264\344\270\216\347\251\272\351\227\264\345\244\215\346\235\202\345\272\246\345\210\206\346\236\220.md" "b/problems/\345\211\215\345\272\217/\351\200\222\345\275\222\347\256\227\346\263\225\347\232\204\346\227\266\351\227\264\344\270\216\347\251\272\351\227\264\345\244\215\346\235\202\345\272\246\345\210\206\346\236\220.md" index 4dd340a6a2..914cccfdd6 100644 --- "a/problems/\345\211\215\345\272\217/\351\200\222\345\275\222\347\256\227\346\263\225\347\232\204\346\227\266\351\227\264\344\270\216\347\251\272\351\227\264\345\244\215\346\235\202\345\272\246\345\210\206\346\236\220.md" +++ "b/problems/\345\211\215\345\272\217/\351\200\222\345\275\222\347\256\227\346\263\225\347\232\204\346\227\266\351\227\264\344\270\216\347\251\272\351\227\264\345\244\215\346\235\202\345\272\246\345\210\206\346\236\220.md" @@ -269,7 +269,4 @@ int binary_search( int arr[], int l, int r, int x) { ----------------------- -* 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) -* B站视频:[代码随想录](https://space.bilibili.com/525438321) -* 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)
diff --git "a/problems/\345\211\215\345\272\217/\351\200\232\350\277\207\344\270\200\351\201\223\351\235\242\350\257\225\351\242\230\347\233\256\357\274\214\350\256\262\344\270\200\350\256\262\351\200\222\345\275\222\347\256\227\346\263\225\347\232\204\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\201.md" "b/problems/\345\211\215\345\272\217/\351\200\232\350\277\207\344\270\200\351\201\223\351\235\242\350\257\225\351\242\230\347\233\256\357\274\214\350\256\262\344\270\200\350\256\262\351\200\222\345\275\222\347\256\227\346\263\225\347\232\204\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\201.md" index 8780122f3f..849a025d7f 100644 --- "a/problems/\345\211\215\345\272\217/\351\200\232\350\277\207\344\270\200\351\201\223\351\235\242\350\257\225\351\242\230\347\233\256\357\274\214\350\256\262\344\270\200\350\256\262\351\200\222\345\275\222\347\256\227\346\263\225\347\232\204\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\201.md" +++ "b/problems/\345\211\215\345\272\217/\351\200\232\350\277\207\344\270\200\351\201\223\351\235\242\350\257\225\351\242\230\347\233\256\357\274\214\350\256\262\344\270\200\350\256\262\351\200\222\345\275\222\347\256\227\346\263\225\347\232\204\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\201.md" @@ -152,7 +152,4 @@ int function3(int x, int n) { ----------------------- -* 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) -* B站视频:[代码随想录](https://space.bilibili.com/525438321) -* 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)
From f5fe6bd73c936faedc52b93de3cd56ec39c0ec84 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Fri, 18 Feb 2022 23:33:57 +0800 Subject: [PATCH 0377/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=88530.?= =?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=90=9C=E7=B4=A2=E6=A0=91=E7=9A=84=E6=9C=80?= =?UTF-8?q?=E5=B0=8F=E7=BB=9D=E5=AF=B9=E5=B7=AE=EF=BC=89=EF=BC=9A=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...17\347\273\235\345\257\271\345\267\256.md" | 71 ++++++++++++++++++- 1 file changed, 70 insertions(+), 1 deletion(-) diff --git "a/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" "b/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" index 3ebb4c8c30..77699c9f4e 100644 --- "a/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" +++ "b/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" @@ -238,7 +238,7 @@ class Solution: cur = cur.right return result -``` +``` ## Go: @@ -364,5 +364,74 @@ var getMinimumDifference = function(root) { } ``` +## TypeScript + +> 辅助数组解决 + +```typescript +function getMinimumDifference(root: TreeNode | null): number { + let helperArr: number[] = []; + function recur(root: TreeNode | null): void { + if (root === null) return; + recur(root.left); + helperArr.push(root.val); + recur(root.right); + } + recur(root); + let resMin: number = Infinity; + for (let i = 0, length = helperArr.length; i < length - 1; i++) { + resMin = Math.min(resMin, helperArr[i + 1] - helperArr[i]); + } + return resMin; +}; +``` + +> 递归中解决 + +```typescript +function getMinimumDifference(root: TreeNode | null): number { + let preNode: TreeNode | null= null; + let resMin: number = Infinity; + function recur(root: TreeNode | null): void { + if (root === null) return; + recur(root.left); + if (preNode !== null) { + resMin = Math.min(resMin, root.val - preNode.val); + } + preNode = root; + recur(root.right); + } + recur(root); + return resMin; +}; +``` + +> 迭代法-中序遍历 + +```typescript +function getMinimumDifference(root: TreeNode | null): number { + const helperStack: TreeNode[] = []; + let curNode: TreeNode | null = root; + let resMin: number = Infinity; + let preNode: TreeNode | null = null; + while (curNode !== null || helperStack.length > 0) { + if (curNode !== null) { + helperStack.push(curNode); + curNode = curNode.left; + } else { + curNode = helperStack.pop()!; + if (preNode !== null) { + resMin = Math.min(resMin, curNode.val - preNode.val); + } + preNode = curNode; + curNode = curNode.right; + } + } + return resMin; +}; +``` + + + -----------------------
From 28cff716ac11f9f5970593fb42a38b399eae9490 Mon Sep 17 00:00:00 2001 From: bqlin Date: Tue, 21 Dec 2021 11:52:30 +0800 Subject: [PATCH 0378/3019] =?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=A0=91=E7=9A=84?= =?UTF-8?q?=E9=80=92=E5=BD=92=E9=81=8D=E5=8E=86=EF=BC=9A=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E6=8E=92=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\204\351\200\222\345\275\222\351\201\215\345\216\206.md" | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" index c481fd1181..9e131c6de0 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" @@ -34,19 +34,19 @@ 1. **确定递归函数的参数和返回值**:因为要打印出前序遍历节点的数值,所以参数里需要传入vector在放节点的数值,除了这一点就不需要在处理什么数据了也不需要有返回值,所以递归函数返回类型就是void,代码如下: -``` +```cpp void traversal(TreeNode* cur, vector& vec) ``` 2. **确定终止条件**:在递归的过程中,如何算是递归结束了呢,当然是当前遍历的节点是空了,那么本层递归就要要结束了,所以如果当前遍历的这个节点是空,就直接return,代码如下: -``` +```cpp if (cur == NULL) return; ``` 3. **确定单层递归的逻辑**:前序遍历是中左右的循序,所以在单层递归的逻辑,是要先取中节点的数值,代码如下: -``` +```cpp vec.push_back(cur->val); // 中 traversal(cur->left, vec); // 左 traversal(cur->right, vec); // 右 From a9ae0f5d03b4e6f819c3c3d518f2984cf54d8810 Mon Sep 17 00:00:00 2001 From: bqlin Date: Tue, 21 Dec 2021 11:55:45 +0800 Subject: [PATCH 0379/3019] =?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=A0=91=E7=9A=84?= =?UTF-8?q?=E8=BF=AD=E4=BB=A3=E9=81=8D=E5=8E=86=EF=BC=9A=E8=A1=A5=E5=85=85?= =?UTF-8?q?Swift=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # Conflicts: # problems/二叉树的迭代遍历.md --- ...55\344\273\243\351\201\215\345\216\206.md" | 100 ++++++++---------- 1 file changed, 43 insertions(+), 57 deletions(-) diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" index ba38726bea..8164724b31 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" @@ -390,7 +390,7 @@ func inorderTraversal(root *TreeNode) []int { } ``` -javaScript +javaScript: ```js @@ -454,7 +454,7 @@ var postorderTraversal = function(root, res = []) { }; ``` -TypeScript: +TypeScript: ```typescript // 前序遍历(迭代法) @@ -509,77 +509,63 @@ function postorderTraversal(root: TreeNode | null): number[] { }; ``` -Swift: +Swift: -> 迭代法前序遍历 ```swift +// 前序遍历迭代法 func preorderTraversal(_ root: TreeNode?) -> [Int] { - var res = [Int]() - if root == nil { - return res - } - var stack = [TreeNode]() - stack.append(root!) + var result = [Int]() + guard let root = root else { return result } + var stack = [root] while !stack.isEmpty { - let node = stack.popLast()! - res.append(node.val) - if node.right != nil { - stack.append(node.right!) + let current = stack.removeLast() + // 先右后左,这样出栈的时候才是左右顺序 + if let node = current.right { // 右 + stack.append(node) } - if node.left != nil { - stack.append(node.left!) + if let node = current.left { // 左 + stack.append(node) } + result.append(current.val) // 中 } - return res + return result } -``` -> 迭代法中序遍历 -```swift -func inorderTraversal(_ root: TreeNode?) -> [Int] { - var res = [Int]() - if root == nil { - return res - } - var stack = [TreeNode]() - var cur: TreeNode? = root - while cur != nil || !stack.isEmpty { - if cur != nil { - stack.append(cur!) - cur = cur!.left - } else { - cur = stack.popLast() - res.append(cur!.val) - cur = cur!.right +// 后序遍历迭代法 +func postorderTraversal(_ root: TreeNode?) -> [Int] { + var result = [Int]() + guard let root = root else { return result } + var stack = [root] + while !stack.isEmpty { + let current = stack.removeLast() + // 与前序相反,即中右左,最后结果还需反转才是后序 + if let node = current.left { // 左 + stack.append(node) } + if let node = current.right { // 右 + stack.append(node) + } + result.append(current.val) // 中 } - return res + return result.reversed() } -``` -> 迭代法后序遍历 -```swift -func postorderTraversal(_ root: TreeNode?) -> [Int] { - var res = [Int]() - if root == nil { - return res - } +// 中序遍历迭代法 +func inorderTraversal(_ root: TreeNode?) -> [Int] { + var result = [Int]() var stack = [TreeNode]() - stack.append(root!) - // res 存储 中 -> 右 -> 左 - while !stack.isEmpty { - let node = stack.popLast()! - res.append(node.val) - if node.left != nil { - stack.append(node.left!) - } - if node.right != nil { - stack.append(node.right!) + var current: TreeNode! = root + while current != nil || !stack.isEmpty { + if current != nil { // 先访问到最左叶子 + stack.append(current) + current = current.left // 左 + } else { + current = stack.removeLast() + result.append(current.val) // 中 + current = current.right // 右 } } - // res 翻转 - res.reverse() - return res + return result } ``` From af547486756b7213d17c10dd76c1a6e518a9b1fa Mon Sep 17 00:00:00 2001 From: bqlin Date: Tue, 21 Dec 2021 14:57:57 +0800 Subject: [PATCH 0380/3019] =?UTF-8?q?0102.=E4=BA=8C=E5=8F=89=E6=A0=91?= =?UTF-8?q?=E7=9A=84=E5=B1=82=E5=BA=8F=E9=81=8D=E5=8E=86=EF=BC=9A=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E6=8E=92=E7=89=88=EF=BC=8C=E8=A1=A5=E5=85=85Swift?= =?UTF-8?q?=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # Conflicts: # problems/0102.二叉树的层序遍历.md --- ...02\345\272\217\351\201\215\345\216\206.md" | 332 ++++++++---------- 1 file changed, 156 insertions(+), 176 deletions(-) diff --git "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" index 1a92d42f91..8d6d2502a0 100644 --- "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" +++ "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" @@ -273,32 +273,29 @@ function levelOrder(root: TreeNode | null): number[][] { }; ``` -Swift: +Swift: ```swift func levelOrder(_ root: TreeNode?) -> [[Int]] { - var res = [[Int]]() - guard let root = root else { - return res - } - var queue = [TreeNode]() - queue.append(root) + var result = [[Int]]() + guard let root = root else { return result } + // 表示一层 + var queue = [root] while !queue.isEmpty { - let size = queue.count - var sub = [Int]() - for _ in 0 ..< size { + let count = queue.count + var subarray = [Int]() + for _ in 0 ..< count { + // 当前层 let node = queue.removeFirst() - sub.append(node.val) - if let left = node.left { - queue.append(left) - } - if let right = node.right { - queue.append(right) - } + subarray.append(node.val) + // 下一层 + if let node = node.left { queue.append(node) } + if let node = node.right { queue.append(node) } } - res.append(sub) + result.append(subarray) } - return res + + return result } ``` @@ -505,30 +502,29 @@ function levelOrderBottom(root: TreeNode | null): number[][] { }; ``` -Swift: +Swift: ```swift func levelOrderBottom(_ root: TreeNode?) -> [[Int]] { - var res = [[Int]]() - guard let root = root else { - return res - } - var queue: [TreeNode] = [root] + // 表示一层 + var queue = [TreeNode]() + if let node = root { queue.append(node) } + var result = [[Int]]() while !queue.isEmpty { - var sub = [Int]() - for _ in 0 ..< queue.count { + let count = queue.count + var subarray = [Int]() + for _ in 0 ..< count { + // 当前层 let node = queue.removeFirst() - sub.append(node.val) - if let left = node.left { - queue.append(left) - } - if let right = node.right { - queue.append(right) - } + subarray.append(node.val) + // 下一层 + if let node = node.left { queue.append(node) } + if let node = node.right { queue.append(node)} } - res.insert(sub, at: 0) + result.append(subarray) } - return res + + return result.reversed() } ``` @@ -729,37 +725,31 @@ function rightSideView(root: TreeNode | null): number[] { }; ``` -Swift: +Swift: ```swift func rightSideView(_ root: TreeNode?) -> [Int] { - var res = [Int]() - guard let root = root else { - return res - } + // 表示一层 var queue = [TreeNode]() - queue.append(root) + if let node = root { queue.append(node) } + var result = [Int]() while !queue.isEmpty { - let size = queue.count - for i in 0 ..< size { + let count = queue.count + for i in 0 ..< count { + // 当前层 let node = queue.removeFirst() - if i == size - 1 { - // 保存 每层最后一个元素 - res.append(node.val) - } - if let left = node.left { - queue.append(left) - } - if let right = node.right { - queue.append(right) - } + if i == count - 1 { result.append(node.val) } + + // 下一层 + if let node = node.left { queue.append(node) } + if let node = node.right { queue.append(node) } } } - return res + + return result } ``` - # 637.二叉树的层平均值 [力扣题目链接](https://leetcode-cn.com/problems/average-of-levels-in-binary-tree/) @@ -965,32 +955,30 @@ function averageOfLevels(root: TreeNode | null): number[] { }; ``` -Swift: +Swift: ```swift func averageOfLevels(_ root: TreeNode?) -> [Double] { - var res = [Double]() - guard let root = root else { - return res - } + // 表示一层 var queue = [TreeNode]() - queue.append(root) + if let node = root { queue.append(node) } + var result = [Double]() while !queue.isEmpty { - let size = queue.count + let count = queue.count var sum = 0 - for _ in 0 ..< size { + for _ in 0 ..< count { + // 当前层 let node = queue.removeFirst() sum += node.val - if let left = node.left { - queue.append(left) - } - if let right = node.right { - queue.append(right) - } + + // 下一层 + if let node = node.left { queue.append(node) } + if let node = node.right { queue.append(node) } } - res.append(Double(sum) / Double(size)) + result.append(Double(sum) / Double(count)) } - return res + + return result } ``` @@ -1212,29 +1200,28 @@ function levelOrder(root: Node | null): number[][] { }; ``` -Swift: +Swift: ```swift func levelOrder(_ root: Node?) -> [[Int]] { - var res = [[Int]]() - guard let root = root else { - return res - } + // 表示一层 var queue = [Node]() - queue.append(root) + if let node = root { queue.append(node) } + var result = [[Int]]() while !queue.isEmpty { - let size = queue.count - var sub = [Int]() - for _ in 0 ..< size { + let count = queue.count + var subarray = [Int]() + for _ in 0 ..< count { + // 当前层 let node = queue.removeFirst() - sub.append(node.val) - for childNode in node.children { - queue.append(childNode) - } + subarray.append(node.val) + // 下一层 + for node in node.children { queue.append(node) } } - res.append(sub) + result.append(subarray) } - return res + + return result } ``` @@ -1419,34 +1406,30 @@ function largestValues(root: TreeNode | null): number[] { }; ``` -Swift: +Swift: ```swift func largestValues(_ root: TreeNode?) -> [Int] { - var res = [Int]() - guard let root = root else { - return res - } + // 表示一层 var queue = [TreeNode]() - queue.append(root) + if let node = root { queue.append(node) } + var result = [Int]() while !queue.isEmpty { - let size = queue.count - var max: Int = Int.min - for _ in 0 ..< size { + let count = queue.count + var max = queue[0].val + for _ in 0 ..< count { + // 当前层 let node = queue.removeFirst() - if node.val > max { - max = node.val - } - if let left = node.left { - queue.append(left) - } - if let right = node.right { - queue.append(right) - } + if node.val > max { max = node.val } + + // 下一层 + if let node = node.left { queue.append(node) } + if let node = node.right { queue.append(node) } } - res.append(max) + result.append(max) } - return res + + return result } ``` @@ -1456,7 +1439,7 @@ func largestValues(_ root: TreeNode?) -> [Int] { 给定一个完美二叉树,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下: -``` +```cpp struct Node { int val; Node *left; @@ -1677,33 +1660,34 @@ func connect(root *Node) *Node { } ``` -Swift: +Swift: + ```swift func connect(_ root: Node?) -> Node? { - guard let root = root else { - return nil - } + // 表示一层 var queue = [Node]() - queue.append(root) + if let node = root { queue.append(node) } while !queue.isEmpty { - let size = queue.count - var preNode: Node? - for i in 0 ..< size { - let node = queue.removeFirst() + let count = queue.count + var current, previous: Node! + for i in 0 ..< count { + // 当前层 if i == 0 { - preNode = node + previous = queue.removeFirst() + current = previous } else { - preNode?.next = node - preNode = node - } - if let left = node.left { - queue.append(left) - } - if let right = node.right { - queue.append(right) + current = queue.removeFirst() + previous.next = current + previous = current } + + // 下一层 + if let node = current.left { queue.append(node) } + if let node = current.right { queue.append(node) } } + previous.next = nil } + return root } ``` @@ -1927,34 +1911,34 @@ func connect(root *Node) *Node { return root } ``` - Swift: + ```swift func connect(_ root: Node?) -> Node? { - guard let root = root else { - return nil - } + // 表示一层 var queue = [Node]() - queue.append(root) + if let node = root { queue.append(node) } while !queue.isEmpty { - let size = queue.count - var preNode: Node? - for i in 0 ..< size { - let node = queue.removeFirst() + let count = queue.count + var current, previous: Node! + for i in 0 ..< count { + // 当前层 if i == 0 { - preNode = node + previous = queue.removeFirst() + current = previous } else { - preNode?.next = node - preNode = node - } - if let left = node.left { - queue.append(left) - } - if let right = node.right { - queue.append(right) + current = queue.removeFirst() + previous.next = current + previous = current } + + // 下一层 + if let node = current.left { queue.append(node) } + if let node = current.right { queue.append(node) } } + previous.next = nil } + return root } ``` @@ -2151,29 +2135,28 @@ function maxDepth(root: TreeNode | null): number { }; ``` -Swift: +Swift: ```swift func maxDepth(_ root: TreeNode?) -> Int { - guard let root = root else { - return 0 - } + guard root != nil else { return 0 } + var depth = 0 var queue = [TreeNode]() - queue.append(root) - var res: Int = 0 + queue.append(root!) while !queue.isEmpty { - for _ in 0 ..< queue.count { + let count = queue.count + depth += 1 + for _ in 0 ..< count { + // 当前层 let node = queue.removeFirst() - if let left = node.left { - queue.append(left) - } - if let right = node.right { - queue.append(right) - } + + // 下一层 + if let node = node.left { queue.append(node) } + if let node = node.right { queue.append(node) } } - res += 1 } - return res + + return depth } ``` @@ -2374,28 +2357,25 @@ Swift: ```swift func minDepth(_ root: TreeNode?) -> Int { - guard let root = root else { - return 0 - } - var res = 0 - var queue = [TreeNode]() - queue.append(root) + guard root != nil else { return 0 } + var depth = 0 + var queue = [root!] while !queue.isEmpty { - res += 1 - for _ in 0 ..< queue.count { + let count = queue.count + depth += 1 + for _ in 0 ..< count { + // 当前层 let node = queue.removeFirst() - if node.left == nil && node.right == nil { - return res - } - if let left = node.left { - queue.append(left) - } - if let right = node.right { - queue.append(right) + if node.left == nil, node.right == nil { // 遇到叶子结点则返回 + return depth } + + // 下一层 + if let node = node.left { queue.append(node) } + if let node = node.right { queue.append(node) } } } - return res + return depth } ``` From 53d4999ad8e7b16a790a8cfcdb6a0f030ec96dfd Mon Sep 17 00:00:00 2001 From: bqlin Date: Sat, 25 Dec 2021 17:14:15 +0800 Subject: [PATCH 0381/3019] =?UTF-8?q?0226.=E7=BF=BB=E8=BD=AC=E4=BA=8C?= =?UTF-8?q?=E5=8F=89=E6=A0=91=EF=BC=9A=E4=BC=98=E5=8C=96=E6=8E=92=E7=89=88?= =?UTF-8?q?=EF=BC=8C=E8=A1=A5=E5=85=85Swift=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # Conflicts: # problems/0226.翻转二叉树.md --- ...54\344\272\214\345\217\211\346\240\221.md" | 63 ++++++++++++++++--- 1 file changed, 54 insertions(+), 9 deletions(-) diff --git "a/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" "b/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" index 8108e7ada6..a3ebe24dd3 100644 --- "a/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" @@ -47,8 +47,6 @@ ## 递归法 - - 对于二叉树的递归法的前中后序遍历,已经在[二叉树:前中后序递归遍历](https://programmercarl.com/二叉树的递归遍历.html)详细讲解了。 我们下文以前序遍历为例,通过动画来看一下翻转的过程: @@ -63,7 +61,7 @@ 返回值的话其实也不需要,但是题目中给出的要返回root节点的指针,可以直接使用题目定义好的函数,所以就函数的返回类型为`TreeNode*`。 -``` +```cpp TreeNode* invertTree(TreeNode* root) ``` @@ -71,7 +69,7 @@ TreeNode* invertTree(TreeNode* root) 当前节点为空的时候,就返回 -``` +```cpp if (root == NULL) return root; ``` @@ -79,7 +77,7 @@ if (root == NULL) return root; 因为是先前序遍历,所以先进行交换左右孩子节点,然后反转左子树,反转右子树。 -``` +```cpp swap(root->left, root->right); invertTree(root->left); invertTree(root->right); @@ -257,7 +255,7 @@ public: ## 其他语言版本 -### Java: +### Java ```Java //DFS递归 @@ -469,8 +467,6 @@ func invertTree(root *TreeNode) *TreeNode { } ``` - - ### JavaScript 使用递归版本的前序遍历 @@ -690,7 +686,7 @@ function invertTree(root: TreeNode | null): TreeNode | null { }; ``` -### C: +### C 递归法 ```c @@ -775,5 +771,54 @@ func invertTree1(_ root: TreeNode?) -> TreeNode? { } ``` +### Swift + +深度优先递归。 + +```swift +func invertTree(_ root: TreeNode?) -> TreeNode? { + guard let node = root else { return root } + swap(&node.left, &node.right) + _ = invertTree(node.left) + _ = invertTree(node.right) + return root +} +``` + +深度优先迭代,子结点顺序不重要,从根结点出发深度遍历即可。 + +```swift +func invertTree(_ root: TreeNode?) -> TreeNode? { + guard let node = root else { return root } + var stack = [node] + while !stack.isEmpty { + guard let node = stack.popLast() else { break } + swap(&node.left, &node.right) + if let node = node.left { stack.append(node) } + if let node = node.right { stack.append(node) } + } + return root +} +``` + +广度优先迭代。 + +```swift +func invertTree(_ root: TreeNode?) -> TreeNode? { + guard let node = root else { return root } + var queue = [node] + while !queue.isEmpty { + let count = queue.count + for _ in 0 ..< count { + let node = queue.removeFirst() + swap(&node.left, &node.right) + if let node = node.left { queue.append(node) } + if let node = node.right { queue.append(node) } + } + } + return root +} +``` + -----------------------
From 9b991d89948d5793f1f93cedb7d0c2093586506e Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Sat, 19 Feb 2022 15:05:26 +0800 Subject: [PATCH 0382/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880501.?= =?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=90=9C=E7=B4=A2=E6=A0=91=E4=B8=AD=E7=9A=84?= =?UTF-8?q?=E4=BC=97=E6=95=B0.md=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typesc?= =?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 --- ...55\347\232\204\344\274\227\346\225\260.md" | 105 +++++++++++++++++- 1 file changed, 103 insertions(+), 2 deletions(-) diff --git "a/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" "b/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" index 277f46f52e..1be9ee6a15 100644 --- "a/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" +++ "b/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" @@ -512,7 +512,7 @@ class Solution: self.search_BST(cur.right) ``` - + > 迭代法-中序遍历-不使用额外空间,利用二叉搜索树特性 ```python3 @@ -661,7 +661,7 @@ var findMode = function(root) { } return res; }; -``` +``` 不使用额外空间,利用二叉树性质,中序遍历(有序): @@ -699,6 +699,107 @@ var findMode = function(root) { }; ``` +## TypeScript + +> 辅助Map法 + +```typescript +function findMode(root: TreeNode | null): number[] { + if (root === null) return []; + const countMap: Map = new Map(); + function traverse(root: TreeNode | null): void { + if (root === null) return; + countMap.set(root.val, (countMap.get(root.val) || 0) + 1); + traverse(root.left); + traverse(root.right); + } + traverse(root); + const countArr: number[][] = Array.from(countMap); + countArr.sort((a, b) => { + return b[1] - a[1]; + }) + const resArr: number[] = []; + const maxCount: number = countArr[0][1]; + for (let i of countArr) { + if (i[1] === maxCount) resArr.push(i[0]); + } + return resArr; +}; +``` + +> 递归中直接解决 + +```typescript +function findMode(root: TreeNode | null): number[] { + let preNode: TreeNode | null = null; + let maxCount: number = 0; + let count: number = 0; + let resArr: number[] = []; + function traverse(root: TreeNode | null): void { + if (root === null) return; + traverse(root.left); + if (preNode === null) { // 第一个节点 + count = 1; + } else if (preNode.val === root.val) { + count++; + } else { + count = 1; + } + if (count === maxCount) { + resArr.push(root.val); + } else if (count > maxCount) { + maxCount = count; + resArr.length = 0; + resArr.push(root.val); + } + preNode = root; + traverse(root.right); + } + traverse(root); + return resArr; +}; +``` + +> 迭代法 + +```typescript +function findMode(root: TreeNode | null): number[] { + const helperStack: TreeNode[] = []; + const resArr: number[] = []; + let maxCount: number = 0; + let count: number = 0; + let preNode: TreeNode | null = null; + let curNode: TreeNode | null = root; + while (curNode !== null || helperStack.length > 0) { + if (curNode !== null) { + helperStack.push(curNode); + curNode = curNode.left; + } else { + curNode = helperStack.pop()!; + if (preNode === null) { // 第一个节点 + count = 1; + } else if (preNode.val === curNode.val) { + count++; + } else { + count = 1; + } + if (count === maxCount) { + resArr.push(curNode.val); + } else if (count > maxCount) { + maxCount = count; + resArr.length = 0; + resArr.push(curNode.val); + } + preNode = curNode; + curNode = curNode.right; + } + } + return resArr; +}; +``` + + + -----------------------
From 292fe1eb380622ce4fc19f2d05ef26bb472e855d Mon Sep 17 00:00:00 2001 From: hs-zhangsan <1513157458@qq.com> Date: Sat, 19 Feb 2022 15:55:31 +0800 Subject: [PATCH 0383/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20=E5=89=91?= =?UTF-8?q?=E6=8C=87Offer=2005.=E6=9B=BF=E6=8D=A2=E7=A9=BA=E6=A0=BC=20C?= =?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 --- ...77\346\215\242\347\251\272\346\240\274.md" | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git "a/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" "b/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" index 530545fbb9..9e74388733 100644 --- "a/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" +++ "b/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" @@ -121,6 +121,37 @@ for (int i = 0; i < a.size(); i++) { ## 其他语言版本 +C: +```C +char* replaceSpace(char* s){ + //统计空格数量 + int count = 0; + int len = strlen(s); + for (int i = 0; i < len; i++) { + if (s[i] == ' ') { + count++; + } + } + + //为新数组分配空间 + int newLen = len + count * 2; + char* result = malloc(sizeof(char) * newLen + 1); + //填充新数组并替换空格 + for (int i = len - 1, j = newLen - 1; i >= 0; i--, j--) { + if (s[i] != ' ') { + result[j] = s[i]; + } else { + result[j--] = '0'; + result[j--] = '2'; + result[j] = '%'; + } + } + result[newLen] = '\0'; + + return result; +} +``` + Java: ```Java From bb277e08e19b797a1b5da5bfe0c60ef84b5c9c8e Mon Sep 17 00:00:00 2001 From: K-945 <393763635@qq.com> Date: Sun, 20 Feb 2022 17:56:21 +0800 Subject: [PATCH 0384/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A00059.=E8=9E=BA?= =?UTF-8?q?=E6=97=8B=E7=9F=A9=E9=98=B5II.md=20=E5=92=8C=E8=A7=A3=E6=9E=90?= =?UTF-8?q?=E7=9B=B8=E5=90=8C=E7=9A=84python=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\346\227\213\347\237\251\351\230\265II.md" | 64 +++++++------------ 1 file changed, 24 insertions(+), 40 deletions(-) diff --git "a/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" "b/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" index 3f7a59ca2f..a98e72ad6e 100644 --- "a/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" +++ "b/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" @@ -192,47 +192,31 @@ python: ```python3 class Solution: - def generateMatrix(self, n: int) -> List[List[int]]: - # 初始化要填充的正方形 - matrix = [[0] * n for _ in range(n)] - - left, right, up, down = 0, n - 1, 0, n - 1 - number = 1 # 要填充的数字 - - while left < right and up < down: - - # 从左到右填充上边 - for x in range(left, right): - matrix[up][x] = number - number += 1 - - # 从上到下填充右边 - for y in range(up, down): - matrix[y][right] = number - number += 1 - - # 从右到左填充下边 - for x in range(right, left, -1): - matrix[down][x] = number - number += 1 - - # 从下到上填充左边 - for y in range(down, up, -1): - matrix[y][left] = number - number += 1 - - # 缩小要填充的范围 - left += 1 - right -= 1 - up += 1 - down -= 1 - - # 如果阶数为奇数,额外填充一次中心 - if n % 2: - matrix[n // 2][n // 2] = number - - return matrix + nums = [[0] * n for _ in range(n)] + startx, starty = 0, 0 # 起始点 + loop, mid = n // 2, n // 2 # 迭代次数、n为奇数时,矩阵的中心点 + count = 1 # 计数 + + for offset in range(1, loop + 1) : # 每循环一层偏移量加1,偏移量从1开始 + for i in range(starty, n - offset) : # 从左至右,左闭右开 + nums[startx][i] = count + count += 1 + for i in range(startx, n - offset) : # 从上至下 + nums[i][n - offset] = count + count += 1 + for i in range(n - offset, starty, -1) : # 从右至左 + nums[n - offset][i] = count + count += 1 + for i in range(n - offset, startx, -1) : # 从下至上 + nums[i][starty] = count + count += 1 + startx += 1 # 更新起始点 + starty += 1 + + if n % 2 != 0 : # n为奇数时,填充中心点 + nums[mid][mid] = count + return nums ``` javaScript From ceaaa2fd2d3114c75794b89fbb08005dd991b81c Mon Sep 17 00:00:00 2001 From: Epoch <75031971+messenger1th@users.noreply.github.com> Date: Mon, 21 Feb 2022 14:37:15 +0800 Subject: [PATCH 0385/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200151.=E7=BF=BB?= =?UTF-8?q?=E8=BD=AC=E5=AD=97=E7=AC=A6=E4=B8=B2=E9=87=8C=E7=9A=84=E5=8D=95?= =?UTF-8?q?=E8=AF=8D=E7=9A=84CPP=E6=9B=B4=E7=AE=80=E6=B4=81=E7=9A=84?= =?UTF-8?q?=E7=89=88=E6=9C=AC2=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 用LC27的原理使得更为简洁。 --- ...14\347\232\204\345\215\225\350\257\215.md" | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git "a/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" "b/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" index ead5fa1237..677a8f649f 100644 --- "a/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" +++ "b/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" @@ -222,7 +222,42 @@ public: 效率: +```CPP +//版本二: +class Solution { +public: + void reverseWord(string& s,int start,int end){ //这个函数,Carl哥的要更清晰。 + for(int i=start;i<(end-start)/2+start;++i){ + swap(s[i],s[end-1-i+start]); + } + } + void trim(string& s){//去除所有空格并在相邻单词之间添加空格 + int slow = 0; + for(int i=0;i Date: Thu, 24 Feb 2022 00:36:23 +0800 Subject: [PATCH 0386/3019] Added in one more python solution. Using defaultdict. --- ...33\346\225\260\347\233\270\345\212\240II.md" | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git "a/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" "b/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" index a7c903eb1b..a6cd413b19 100644 --- "a/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" +++ "b/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" @@ -141,7 +141,24 @@ class Solution(object): ``` +```python +class Solution: + def fourSumCount(self, nums1: list, nums2: list, nums3: list, nums4: list) -> int: + from collections import defaultdict # You may use normal dict instead. + rec, cnt = defaultdict(lambda : 0), 0 + # To store the summary of all the possible combinations of nums1 & nums2, together with their frequencies. + for i in nums1: + for j in nums2: + rec[i+j] += 1 + # To add up the frequencies if the corresponding value occurs in the dictionary + for i in nums3: + for j in nums4: + cnt += rec.get(-(i+j), 0) # No matched key, return 0. + return cnt +``` + Go: + ```go func fourSumCount(nums1 []int, nums2 []int, nums3 []int, nums4 []int) int { m := make(map[int]int) From 3652d00e542fc251d479a66eb676c8e1ac910f45 Mon Sep 17 00:00:00 2001 From: Luo <82520819+Jerry-306@users.noreply.github.com> Date: Thu, 24 Feb 2022 17:49:15 +0800 Subject: [PATCH 0387/3019] =?UTF-8?q?0104=20=E4=BA=8C=E5=8F=89=E6=A0=91?= =?UTF-8?q?=E6=9C=80=E5=A4=A7=E6=B7=B1=E5=BA=A6=20=E9=83=A8=E5=88=86?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E4=B9=A6=E5=86=99=E9=94=99=E8=AF=AF=E7=BA=A0?= =?UTF-8?q?=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 函数错误,逻辑错误 --- ...346\234\200\345\244\247\346\267\261\345\272\246.md" | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git "a/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" "b/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" index 3eecdc927b..2229a85434 100644 --- "a/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" +++ "b/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" @@ -523,8 +523,8 @@ func maxdepth(root *treenode) int { ```javascript var maxdepth = function(root) { - if (!root) return root - return 1 + math.max(maxdepth(root.left), maxdepth(root.right)) + if (root === null) return 0; + return 1 + Math.max(maxdepth(root.left), maxdepth(root.right)) }; ``` @@ -541,7 +541,7 @@ var maxdepth = function(root) { //3. 确定单层逻辑 let leftdepth=getdepth(node.left); let rightdepth=getdepth(node.right); - let depth=1+math.max(leftdepth,rightdepth); + let depth=1+Math.max(leftdepth,rightdepth); return depth; } return getdepth(root); @@ -591,7 +591,9 @@ var maxDepth = function(root) { count++ while(size--) { let node = queue.shift() - node && (queue = [...queue, ...node.children]) + for (let item of node.children) { + item && queue.push(item); + } } } return count From 5b78393ac4e70db5cf9518090f4cb563c68e11d6 Mon Sep 17 00:00:00 2001 From: Camille0512 Date: Fri, 25 Feb 2022 00:57:43 +0800 Subject: [PATCH 0388/3019] modified 15. Add a new version with the same idea. --- ...11\346\225\260\344\271\213\345\222\214.md" | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git "a/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" "b/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" index e191eabc4d..1d811b76ab 100644 --- "a/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" @@ -243,7 +243,34 @@ class Solution: right -= 1 return ans ``` +Python (v2): + +```python +class Solution: + def threeSum(self, nums: List[int]) -> List[List[int]]: + if len(nums) < 3: return [] + nums, res = sorted(nums), [] + for i in range(len(nums) - 2): + cur, l, r = nums[i], i + 1, len(nums) - 1 + if res != [] and res[-1][0] == cur: continue # Drop duplicates for the first time. + + while l < r: + if cur + nums[l] + nums[r] == 0: + res.append([cur, nums[l], nums[r]]) + # Drop duplicates for the second time in interation of l & r. Only used when target situation occurs, because that is the reason for dropping duplicates. + while l < r - 1 and nums[l] == nums[l + 1]: + l += 1 + while r > l + 1 and nums[r] == nums[r - 1]: + r -= 1 + if cur + nums[l] + nums[r] > 0: + r -= 1 + else: + l += 1 + return res +``` + Go: + ```Go func threeSum(nums []int)[][]int{ sort.Ints(nums) From 14f91a53702d8df5e1a587e757f739b5df55bb8f Mon Sep 17 00:00:00 2001 From: Luo <82520819+Jerry-306@users.noreply.github.com> Date: Fri, 25 Feb 2022 10:37:17 +0800 Subject: [PATCH 0389/3019] =?UTF-8?q?0404=20=E5=B7=A6=E5=8F=B6=E5=AD=90?= =?UTF-8?q?=E4=B9=8B=E5=92=8C=20=20=E5=B7=A6=E5=8F=B6=E5=AD=90=E5=AE=9A?= =?UTF-8?q?=E4=B9=89=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" "b/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" index 09272052de..691c0f3799 100644 --- "a/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" +++ "b/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" @@ -19,7 +19,7 @@ **首先要注意是判断左叶子,不是二叉树左侧节点,所以不要上来想着层序遍历。** -因为题目中其实没有说清楚左叶子究竟是什么节点,那么我来给出左叶子的明确定义:**如果左节点不为空,且左节点没有左右孩子,那么这个节点就是左叶子** +因为题目中其实没有说清楚左叶子究竟是什么节点,那么我来给出左叶子的明确定义:**如果左节点不为空,且左节点没有左右孩子,那么这个节点的左节点就是左叶子** 大家思考一下如下图中二叉树,左叶子之和究竟是多少? From 984a3ae5bc7d08bb70b05601d96d57b1b0c9c791 Mon Sep 17 00:00:00 2001 From: cylin2000 Date: Fri, 25 Feb 2022 10:56:23 +0000 Subject: [PATCH 0390/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20=E4=BA=8C?= =?UTF-8?q?=E5=88=86=E6=9F=A5=E6=89=BE=20C#=20=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...14\345\210\206\346\237\245\346\211\276.md" | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git "a/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" "b/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" index 379cb5fc46..635868a961 100644 --- "a/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" +++ "b/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" @@ -561,5 +561,51 @@ class Solution { } ``` +**C#** +```csharp +//左闭右闭 +public class Solution { + public int Search(int[] nums, int target) { + int left = 0; + int right = nums.Length - 1; + while(left <= right){ + int mid = (right - left ) / 2 + left; + if(nums[mid] == target){ + return mid; + } + else if(nums[mid] < target){ + left = mid+1; + } + else if(nums[mid] > target){ + right = mid-1; + } + } + return -1; + } +} + +//左闭右开 +public class Solution{ + public int Search(int[] nums, int target){ + int left = 0; + int right = nums.Length; + while(left < right){ + int mid = (right - left) / 2 + left; + if(nums[mid] == target){ + return mid; + } + else if(nums[mid] < target){ + left = mid + 1; + } + else if(nums[mid] > target){ + right = mid; + } + } + return -1; + } +} +``` + + -----------------------
From 3f189d4687818313a90bc240524a3dc049f39ec4 Mon Sep 17 00:00:00 2001 From: cylin2000 Date: Fri, 25 Feb 2022 10:57:05 +0000 Subject: [PATCH 0391/3019] Add : --- .../0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" "b/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" index 635868a961..15e096a0b1 100644 --- "a/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" +++ "b/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" @@ -561,7 +561,7 @@ class Solution { } ``` -**C#** +**C#:** ```csharp //左闭右闭 public class Solution { From 4980496c05aad48ea28cc0ed471cc08ffe36b9d6 Mon Sep 17 00:00:00 2001 From: Camille0512 Date: Fri, 25 Feb 2022 18:59:56 +0800 Subject: [PATCH 0392/3019] 0001. Add python v2. Making use of the dictionary property. --- ...4\270\244\346\225\260\344\271\213\345\222\214.md" | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git "a/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" "b/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" index 22b2e7eb70..9571a7737b 100644 --- "a/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" @@ -118,6 +118,18 @@ class Solution: return [records[target - val], idx] # 如果存在就返回字典记录索引和当前索引 ``` +Python (v2): + +```python +class Solution: + def twoSum(self, nums: List[int], target: int) -> List[int]: + rec = {} + for i in range(len(nums)): + rest = target - nums[i] + # Use get to get the index of the data, making use of one of the dictionary properties. + if rec.get(rest, None) is not None: return [rec[rest], i] + rec[nums[i]] = i +``` Go: From 0738423c9ed3979fa649ba7a147c4c60ecdec616 Mon Sep 17 00:00:00 2001 From: Camille0512 Date: Sun, 27 Feb 2022 00:24:13 +0800 Subject: [PATCH 0393/3019] modified 541. Can be more pythonic. --- ...\254\345\255\227\347\254\246\344\270\262II.md" | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git "a/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" "b/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" index 14b8601a7e..cd9bb0ccb9 100644 --- "a/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" +++ "b/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" @@ -204,8 +204,23 @@ class Solution: return ''.join(res) ``` +Python3 (v2): + +```python +class Solution: + def reverseStr(self, s: str, k: int) -> str: + # Two pointers. Another is inside the loop. + p = 0 + while p < len(s): + p2 = p + k + # Written in this could be more pythonic. + s = s[:p] + s[p: p2][::-1] + s[p2:] + p = p + 2 * k + return s +``` Go: + ```go func reverseStr(s string, k int) string { ss := []byte(s) From f862ebf0c70c37c62f83b5ad50b441c830f5850f Mon Sep 17 00:00:00 2001 From: Camille0512 Date: Sun, 27 Feb 2022 00:41:18 +0800 Subject: [PATCH 0394/3019] modified offer05. Add two python versions. --- ...3\277\346\215\242\347\251\272\346\240\274.md" | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git "a/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" "b/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" index 530545fbb9..59f74a187b 100644 --- "a/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" +++ "b/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" @@ -260,8 +260,24 @@ class Solution: ``` +```python +class Solution: + def replaceSpace(self, s: str) -> str: + # method 1 - Very rude + return "%20".join(s.split(" ")) + + # method 2 - Reverse the s when counting in for loop, then update from the end. + n = len(s) + for e, i in enumerate(s[::-1]): + print(i, e) + if i == " ": + s = s[: n - (e + 1)] + "%20" + s[n - e:] + print("") + return s +``` javaScript: + ```js /** * @param {string} s From 0fbacd5d9b4c72db15f5f1ddae2c73b320a8c554 Mon Sep 17 00:00:00 2001 From: Camille0512 Date: Sun, 27 Feb 2022 01:19:55 +0800 Subject: [PATCH 0395/3019] modified 151. Add 2 python versions. No need to implement Carlo's idea in such a complecated way by inviting extra space. --- ...14\347\232\204\345\215\225\350\257\215.md" | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git "a/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" "b/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" index ead5fa1237..7588cbd61c 100644 --- "a/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" +++ "b/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" @@ -438,6 +438,38 @@ class Solution: ``` +```python +class Solution: + def reverseWords(self, s: str) -> str: + # method 1 - Rude but work & efficient method. + s_list = [i for i in s.split(" ") if len(i) > 0] + return " ".join(s_list[::-1]) + + # method 2 - Carlo's idea + def trim_head_tail_space(ss: str): + p = 0 + while p < len(ss) and ss[p] == " ": + p += 1 + return ss[p:] + + # Trim the head and tail space + s = trim_head_tail_space(s) + s = trim_head_tail_space(s[::-1])[::-1] + + pf, ps, s = 0, 0, s[::-1] # Reverse the string. + while pf < len(s): + if s[pf] == " ": + # Will not excede. Because we have clean the tail space. + if s[pf] == s[pf + 1]: + s = s[:pf] + s[pf + 1:] + continue + else: + s = s[:ps] + s[ps: pf][::-1] + s[pf:] + ps, pf = pf + 1, pf + 2 + else: + pf += 1 + return s[:ps] + s[ps:][::-1] # Must do the last step, because the last word is omit though the pointers are on the correct positions, +``` Go: From ef747f7921ccd6b64a6de661847eac88528bbb40 Mon Sep 17 00:00:00 2001 From: Qiyu Liang <61932152+Guicai996@users.noreply.github.com> Date: Sun, 27 Feb 2022 19:57:40 +0800 Subject: [PATCH 0396/3019] =?UTF-8?q?Update=200236.=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=A0=91=E7=9A=84=E6=9C=80=E8=BF=91=E5=85=AC=E5=85=B1=E7=A5=96?= =?UTF-8?q?=E5=85=88.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修改了L48-54,增选解释了一种特殊情况:节点本身p(q),它拥有一个子孙节点q(p)。 --- ...21\345\205\254\345\205\261\347\245\226\345\205\210.md" | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git "a/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" "b/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" index 6213aeaa2c..5b2abd181b 100644 --- "a/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" +++ "b/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" @@ -45,9 +45,13 @@ 接下来就看如何判断一个节点是节点q和节点p的公共公共祖先呢。 -**如果找到一个节点,发现左子树出现结点p,右子树出现节点q,或者 左子树出现结点q,右子树出现节点p,那么该节点就是节点p和q的最近公共祖先。** +**首先最容易想到的一个情况:如果找到一个节点,发现左子树出现结点p,右子树出现节点q,或者 左子树出现结点q,右子树出现节点p,那么该节点就是节点p和q的最近公共祖先。** -使用后序遍历,回溯的过程,就是从低向上遍历节点,一旦发现如何这个条件的节点,就是最近公共节点了。 +**但是很多人容易忽略一个情况,就是节点本身p(q),它拥有一个子孙节点q(p)。** + +使用后序遍历,回溯的过程,就是从低向上遍历节点,一旦发现满足第一种情况的节点,就是最近公共节点了。 + +**但是如果p或者q本身就是最近公共祖先呢?其实只需要找到一个节点是p或者q的时候,直接返回当前节点,无需继续递归子树。如果接下来的遍历中找到了后继节点满足第一种情况则修改返回值为后继节点,否则,继续返回已找到的节点即可。为什么满足第一种情况的节点一定是p或q的后继节点呢?大家可以仔细思考一下。** 递归三部曲: From 9712e3f75cbd0525eb40e0d12c264d1aa1952ea6 Mon Sep 17 00:00:00 2001 From: jinyuhang-007 <53509988+jinyuhang-007@users.noreply.github.com> Date: Sun, 27 Feb 2022 17:35:50 -0800 Subject: [PATCH 0397/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B00005.=E6=9C=80?= =?UTF-8?q?=E9=95=BF=E5=9B=9E=E6=96=87=E5=AD=90=E4=B8=B2.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...36\346\226\207\345\255\220\344\270\262.md" | 37 +++++++++++++++---- 1 file changed, 29 insertions(+), 8 deletions(-) diff --git "a/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" "b/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" index 99458825e5..8b3af3bbde 100644 --- "a/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" +++ "b/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" @@ -260,7 +260,26 @@ public: # 其他语言版本 -## Java +Java: + +```java +public int[] twoSum(int[] nums, int target) { + int[] res = new int[2]; + if(nums == null || nums.length == 0){ + return res; + } + Map map = new HashMap<>(); + for(int i = 0; i < nums.length; i++){ + int temp = target - nums[i]; + if(map.containsKey(temp)){ + res[1] = i; + res[0] = map.get(temp); + } + map.put(nums[i], i); + } + return res; +} +``` ```java // 双指针 中心扩散法 @@ -291,7 +310,7 @@ class Solution { } ``` -## Python +Python: ```python class Solution: @@ -312,7 +331,8 @@ class Solution: return s[left:right + 1] ``` -> 双指针法: +双指针: + ```python class Solution: def longestPalindrome(self, s: str) -> str: @@ -340,13 +360,13 @@ class Solution: return s[start:end] ``` -## Go +Go: ```go ``` -## JavaScript +JavaScript: ```js //动态规划解法 @@ -462,8 +482,9 @@ var longestPalindrome = function(s) { }; ``` -## C -动态规划: +C: + +动态规划: ```c //初始化dp数组,全部初始为false bool **initDP(int strLen) { @@ -513,7 +534,7 @@ char * longestPalindrome(char * s){ } ``` -双指针: +双指针: ```c int left, maxLength; void extend(char *str, int i, int j, int size) { From ee0e80dae79071d1b48dfcc022e33f827de9c532 Mon Sep 17 00:00:00 2001 From: Luo <82520819+Jerry-306@users.noreply.github.com> Date: Mon, 28 Feb 2022 14:18:29 +0800 Subject: [PATCH 0398/3019] =?UTF-8?q?0700=20=E4=BA=8C=E5=8F=89=E6=90=9C?= =?UTF-8?q?=E7=B4=A2=E6=A0=91=20=E9=83=A8=E5=88=86=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E6=9B=B4=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 结果没问题,但逻辑不严谨 --- ...1\344\270\255\347\232\204\346\220\234\347\264\242.md" | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git "a/problems/0700.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\220\234\347\264\242.md" "b/problems/0700.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\220\234\347\264\242.md" index 1521514a78..fd1d21acce 100644 --- "a/problems/0700.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\220\234\347\264\242.md" +++ "b/problems/0700.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\220\234\347\264\242.md" @@ -200,7 +200,7 @@ class Solution { if (val < root.val) root = root.left; else if (val > root.val) root = root.right; else return root; - return root; + return null; } } ``` @@ -236,7 +236,7 @@ class Solution: if val < root.val: root = root.left elif val > root.val: root = root.right else: return root - return root + return None ``` @@ -271,7 +271,7 @@ func searchBST(root *TreeNode, val int) *TreeNode { break } } - return root + return nil } ``` @@ -301,7 +301,6 @@ var searchBST = function (root, val) { return searchBST(root.left, val); if (root.val < val) return searchBST(root.right, val); - return null; }; ``` @@ -330,7 +329,7 @@ var searchBST = function (root, val) { else return root; } - return root; + return null; }; ``` From 32dada4f6d071c10643dd69c356aeba74601cf21 Mon Sep 17 00:00:00 2001 From: Qiyu Liang <61932152+Guicai996@users.noreply.github.com> Date: Mon, 28 Feb 2022 15:01:23 +0800 Subject: [PATCH 0399/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200063.=E4=B8=8D?= =?UTF-8?q?=E5=90=8C=E8=B7=AF=E5=BE=84II=E5=A2=9E=E5=8A=A0=E7=A9=BA?= =?UTF-8?q?=E9=97=B4=E4=BC=98=E5=8C=96=E7=89=88=E6=9C=ACc++=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 0063.不同路径II,L159-190 增加空间优化版本c++代码 --- ...\345\220\214\350\267\257\345\276\204II.md" | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git "a/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" "b/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" index 8e82007e7a..86c42150a5 100644 --- "a/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" +++ "b/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" @@ -155,6 +155,39 @@ public: * 时间复杂度:$O(n × m)$,n、m 分别为obstacleGrid 长度和宽度 * 空间复杂度:$O(n × m)$ + +同样我们给出空间优化版本: +```CPP +class Solution { +public: + int uniquePathsWithObstacles(vector>& obstacleGrid) { + if (obstacleGrid[0][0] == 1) + return 0; + vector dp(obstacleGrid[0].size()); + for (int j = 0; j < dp.size(); ++j) + if (obstacleGrid[0][j] == 1) + dp[j] = 0; + else if (j == 0) + dp[j] = 1; + else + dp[j] = dp[j-1]; + + for (int i = 1; i < obstacleGrid.size(); ++i) + for (int j = 0; j < dp.size(); ++j){ + if (obstacleGrid[i][j] == 1) + dp[j] = 0; + else if (j != 0) + dp[j] = dp[j] + dp[j-1]; + } + return dp.back(); + } +}; +``` + +* 时间复杂度:$O(n × m)$,n、m 分别为obstacleGrid 长度和宽度 +* 空间复杂度:$O(m)$ + + ## 总结 本题是[62.不同路径](https://programmercarl.com/0062.不同路径.html)的障碍版,整体思路大体一致。 From 37e7d73ec200bd9adefbdaaef24d6f4c2e38f5f7 Mon Sep 17 00:00:00 2001 From: youngyangyang04 <826123027@qq.com> Date: Mon, 28 Feb 2022 20:52:01 +0800 Subject: [PATCH 0400/3019] Update --- ...46\225\210\347\232\204\346\213\254\345\217\267.md" | 4 ++-- ...47\247\273\351\231\244\345\205\203\347\264\240.md" | 2 +- ...46\217\222\345\205\245\344\275\215\347\275\256.md" | 2 +- ...47\273\204\345\220\210\346\200\273\345\222\214.md" | 4 ++-- ...\273\204\345\220\210\346\200\273\345\222\214II.md" | 4 ++-- .../0042.\346\216\245\351\233\250\346\260\264.md" | 2 +- .../0046.\345\205\250\346\216\222\345\210\227.md" | 2 +- ...\236\272\346\227\213\347\237\251\351\230\265II.md" | 4 ++-- ...50\203\214\345\214\205\347\211\210\346\234\254.md" | 4 ++-- ...47\273\204\345\220\210\344\274\230\345\214\226.md" | 2 +- "problems/0078.\345\255\220\351\233\206.md" | 2 +- ...45\244\247\347\232\204\347\237\251\345\275\242.md" | 4 ++-- ...\244\215\345\216\237IP\345\234\260\345\235\200.md" | 2 +- ...45\261\202\345\272\217\351\201\215\345\216\206.md" | 4 ++-- ...45\217\211\346\220\234\347\264\242\346\240\221.md" | 2 +- ...50\241\241\344\272\214\345\217\211\346\240\221.md" | 2 +- ...46\225\260\345\255\227\344\271\213\345\222\214.md" | 2 +- ...45\211\262\345\233\236\346\226\207\344\270\262.md" | 4 ++-- ...\234\200\344\275\263\346\227\266\346\234\272IV.md" | 2 +- ...46\211\200\346\234\211\350\267\257\345\276\204.md" | 2 +- ...45\205\250\345\271\263\346\226\271\346\225\260.md" | 2 +- ...51\233\266\351\222\261\345\205\221\346\215\242.md" | 2 +- ...211\223\345\256\266\345\212\253\350\210\215III.md" | 6 +++--- ...46\221\206\345\212\250\345\272\217\345\210\227.md" | 2 +- .../0383.\350\265\216\351\207\221\344\277\241.md" | 2 +- ...45\217\266\345\255\220\344\271\213\345\222\214.md" | 4 ++-- ...45\210\206\345\217\221\351\245\274\345\271\262.md" | 2 +- ...45\261\277\347\232\204\345\221\250\351\225\277.md" | 2 +- .../0474.\344\270\200\345\222\214\351\233\266.md" | 2 +- ...45\242\236\345\255\220\345\272\217\345\210\227.md" | 4 ++-- .../0494.\347\233\256\346\240\207\345\222\214.md" | 11 ++++++++--- ...6\233\264\345\244\247\345\205\203\347\264\240I.md" | 4 ++-- ...44\270\255\347\232\204\344\274\227\346\225\260.md" | 4 ++-- ...\233\264\345\244\247\345\205\203\347\264\240II.md" | 2 +- ...\233\266\351\222\261\345\205\221\346\215\242II.md" | 2 +- ...44\270\272\347\264\257\345\212\240\346\240\221.md" | 2 +- ...45\217\211\346\220\234\347\264\242\346\240\221.md" | 2 +- ...45\214\231\345\222\214\346\210\277\351\227\264.md" | 1 - ...51\202\273\351\207\215\345\244\215\351\241\271.md" | 4 ++-- ...51\200\222\345\275\222\351\201\215\345\216\206.md" | 2 +- ...45\221\250\346\234\253\346\200\273\347\273\223.md" | 4 ++-- ...45\256\214\345\205\250\350\203\214\345\214\205.md" | 2 +- 42 files changed, 64 insertions(+), 60 deletions(-) diff --git "a/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" "b/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" index 95d62e42a0..01fc7b93e8 100644 --- "a/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" +++ "b/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" @@ -159,7 +159,7 @@ class Solution { ``` Python: -```python3 +```python # 方法一,仅使用栈,更省空间 class Solution: def isValid(self, s: str) -> bool: @@ -180,7 +180,7 @@ class Solution: return True if not stack else False ``` -```python3 +```python # 方法二,使用字典 class Solution: def isValid(self, s: str) -> bool: diff --git "a/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" "b/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" index d69f2bcfe8..dd9155c693 100644 --- "a/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" +++ "b/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" @@ -142,7 +142,7 @@ class Solution { Python: -```python3 +```python class Solution: """双指针法 时间复杂度:O(n) diff --git "a/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" "b/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" index f5f041aa7f..9a770703e3 100644 --- "a/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" +++ "b/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" @@ -246,7 +246,7 @@ func searchInsert(nums []int, target int) int { ``` ### Python -```python3 +```python class Solution: def searchInsert(self, nums: List[int], target: int) -> int: left, right = 0, len(nums) - 1 diff --git "a/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" "b/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" index 0f8fe4f6b8..7a2084dd19 100644 --- "a/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" +++ "b/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" @@ -264,7 +264,7 @@ class Solution { ## Python **回溯** -```python3 +```python class Solution: def __init__(self): self.path = [] @@ -296,7 +296,7 @@ class Solution: self.path.pop() # 回溯 ``` **剪枝回溯** -```python3 +```python class Solution: def __init__(self): self.path = [] diff --git "a/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" "b/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" index 5438418807..49acb8d63f 100644 --- "a/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" +++ "b/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" @@ -334,7 +334,7 @@ class Solution { ## Python **回溯+巧妙去重(省去使用used** -```python3 +```python class Solution: def __init__(self): self.paths = [] @@ -374,7 +374,7 @@ class Solution: sum_ -= candidates[i] # 回溯,为了下一轮for loop ``` **回溯+去重(使用used)** -```python3 +```python class Solution: def __init__(self): self.paths = [] diff --git "a/problems/0042.\346\216\245\351\233\250\346\260\264.md" "b/problems/0042.\346\216\245\351\233\250\346\260\264.md" index 2774560794..55f80a5407 100644 --- "a/problems/0042.\346\216\245\351\233\250\346\260\264.md" +++ "b/problems/0042.\346\216\245\351\233\250\346\260\264.md" @@ -491,7 +491,7 @@ class Solution: return res ``` 动态规划 -```python3 +```python class Solution: def trap(self, height: List[int]) -> int: leftheight, rightheight = [0]*len(height), [0]*len(height) diff --git "a/problems/0046.\345\205\250\346\216\222\345\210\227.md" "b/problems/0046.\345\205\250\346\216\222\345\210\227.md" index 3d31db6212..c5369ddd1b 100644 --- "a/problems/0046.\345\205\250\346\216\222\345\210\227.md" +++ "b/problems/0046.\345\205\250\346\216\222\345\210\227.md" @@ -243,7 +243,7 @@ class Solution: usage_list[i] = False ``` **回溯+丢掉usage_list** -```python3 +```python class Solution: def __init__(self): self.path = [] diff --git "a/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" "b/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" index 3f7a59ca2f..670d6fc277 100644 --- "a/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" +++ "b/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" @@ -188,9 +188,9 @@ class Solution { } ``` -python: +python3: -```python3 +```python class Solution: def generateMatrix(self, n: int) -> List[List[int]]: diff --git "a/problems/0070.\347\210\254\346\245\274\346\242\257\345\256\214\345\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md" "b/problems/0070.\347\210\254\346\245\274\346\242\257\345\256\214\345\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md" index b5fbb96a19..2286de2d1f 100644 --- "a/problems/0070.\347\210\254\346\245\274\346\242\257\345\256\214\345\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md" +++ "b/problems/0070.\347\210\254\346\245\274\346\242\257\345\256\214\345\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md" @@ -143,10 +143,10 @@ class Solution { } ``` -Python: +Python3: -```python3 +```python class Solution: def climbStairs(self, n: int) -> int: dp = [0]*(n + 1) diff --git "a/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" "b/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" index e995fd1847..81b4304cee 100644 --- "a/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" +++ "b/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" @@ -174,7 +174,7 @@ class Solution { ``` Python: -```python3 +```python class Solution: def combine(self, n: int, k: int) -> List[List[int]]: res=[] #存放符合条件结果的集合 diff --git "a/problems/0078.\345\255\220\351\233\206.md" "b/problems/0078.\345\255\220\351\233\206.md" index 1abf8c9553..cdb5f54891 100644 --- "a/problems/0078.\345\255\220\351\233\206.md" +++ "b/problems/0078.\345\255\220\351\233\206.md" @@ -203,7 +203,7 @@ class Solution { ``` ## Python -```python3 +```python class Solution: def __init__(self): self.path: List[int] = [] diff --git "a/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" "b/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" index 3cb51f1d82..439a3bc5b7 100644 --- "a/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" +++ "b/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" @@ -277,9 +277,9 @@ class Solution { } ``` -Python: +Python3: -```python3 +```python # 双指针;暴力解法(leetcode超时) class Solution: diff --git "a/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" "b/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" index 3e7cd1ade2..1fa72cc97b 100644 --- "a/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" +++ "b/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" @@ -339,7 +339,7 @@ class Solution(object): ``` python3: -```python3 +```python class Solution: def __init__(self): self.result = [] diff --git "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" index 1a92d42f91..7448584854 100644 --- "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" +++ "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" @@ -83,10 +83,10 @@ public: }; ``` -python代码: +python3代码: -```python3 +```python class Solution: """二叉树层序遍历迭代解法""" diff --git "a/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" index bd48ea0c96..9e008e867e 100644 --- "a/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" +++ "b/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" @@ -305,7 +305,7 @@ class Solution { ## Python **递归** -```python3 +```python # Definition for a binary tree node. # class TreeNode: # def __init__(self, val=0, left=None, right=None): diff --git "a/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" "b/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" index 90cb7336d9..d9dcf289b3 100644 --- "a/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" @@ -497,7 +497,7 @@ class Solution { ## Python 递归法: -```python3 +```python # Definition for a binary tree node. # class TreeNode: # def __init__(self, val=0, left=None, right=None): diff --git "a/problems/0129.\346\261\202\346\240\271\345\210\260\345\217\266\345\255\220\350\212\202\347\202\271\346\225\260\345\255\227\344\271\213\345\222\214.md" "b/problems/0129.\346\261\202\346\240\271\345\210\260\345\217\266\345\255\220\350\212\202\347\202\271\346\225\260\345\255\227\344\271\213\345\222\214.md" index 980779c20c..b271ca7de5 100644 --- "a/problems/0129.\346\261\202\346\240\271\345\210\260\345\217\266\345\255\220\350\212\202\347\202\271\346\225\260\345\255\227\344\271\213\345\222\214.md" +++ "b/problems/0129.\346\261\202\346\240\271\345\210\260\345\217\266\345\255\220\350\212\202\347\202\271\346\225\260\345\255\227\344\271\213\345\222\214.md" @@ -217,7 +217,7 @@ class Solution { ``` Python: -```python3 +```python class Solution: def sumNumbers(self, root: TreeNode) -> int: res = 0 diff --git "a/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" "b/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" index 439ad8ea13..f50f1c1d11 100644 --- "a/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" +++ "b/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" @@ -289,7 +289,7 @@ class Solution { ## Python **回溯+正反序判断回文串** -```python3 +```python class Solution: def __init__(self): self.paths = [] @@ -326,7 +326,7 @@ class Solution: continue ``` **回溯+函数判断回文串** -```python3 +```python class Solution: def __init__(self): self.paths = [] diff --git "a/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" "b/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" index 7db75f060c..61c558a1a1 100644 --- "a/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" +++ "b/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" @@ -271,7 +271,7 @@ class Solution: return dp[-1][2*k] ``` 版本二 -```python3 +```python class Solution: def maxProfit(self, k: int, prices: List[int]) -> int: if len(prices) == 0: return 0 diff --git "a/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" "b/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" index 4078320f23..a0c718f45f 100644 --- "a/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" +++ "b/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" @@ -436,7 +436,7 @@ class Solution: 迭代法: -```python3 +```python from collections import deque diff --git "a/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" "b/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" index 7bc0c2f721..9bad2085e2 100644 --- "a/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" +++ "b/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" @@ -207,7 +207,7 @@ class Solution { Python: -```python3 +```python class Solution: def numSquares(self, n: int) -> int: '''版本一,先遍历背包, 再遍历物品''' diff --git "a/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" "b/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" index 8f3438af47..3a8d0662ab 100644 --- "a/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" +++ "b/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" @@ -207,7 +207,7 @@ class Solution { Python: -```python3 +```python class Solution: def coinChange(self, coins: List[int], amount: int) -> int: '''版本一''' diff --git "a/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" "b/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" index 06831cb6ab..ecd31d1b01 100644 --- "a/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" +++ "b/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" @@ -288,7 +288,7 @@ Python: > 暴力递归 -```python3 +```python # Definition for a binary tree node. # class TreeNode: @@ -315,7 +315,7 @@ class Solution: > 记忆化递归 -```python3 +```python # Definition for a binary tree node. # class TreeNode: @@ -345,7 +345,7 @@ class Solution: ``` > 动态规划 -```python3 +```python # Definition for a binary tree node. # class TreeNode: # def __init__(self, val=0, left=None, right=None): diff --git "a/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" "b/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" index d75311eb2a..5076c9adaa 100644 --- "a/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" +++ "b/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" @@ -228,7 +228,7 @@ class Solution { ### Python -```python3 +```python class Solution: def wiggleMaxLength(self, nums: List[int]) -> int: preC,curC,res = 0,0,1 #题目里nums长度大于等于1,当长度为1时,其实到不了for循环里去,所以不用考虑nums长度 diff --git "a/problems/0383.\350\265\216\351\207\221\344\277\241.md" "b/problems/0383.\350\265\216\351\207\221\344\277\241.md" index 31e19b1005..0070734779 100644 --- "a/problems/0383.\350\265\216\351\207\221\344\277\241.md" +++ "b/problems/0383.\350\265\216\351\207\221\344\277\241.md" @@ -209,7 +209,7 @@ class Solution(object): Python写法四: -```python3 +```python class Solution: def canConstruct(self, ransomNote: str, magazine: str) -> bool: c1 = collections.Counter(ransomNote) diff --git "a/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" "b/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" index 09272052de..8c6eaddb30 100644 --- "a/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" +++ "b/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" @@ -229,7 +229,7 @@ class Solution { ## Python **递归后序遍历** -```python3 +```python class Solution: def sumOfLeftLeaves(self, root: TreeNode) -> int: if not root: @@ -246,7 +246,7 @@ class Solution: ``` **迭代** -```python3 +```python class Solution: def sumOfLeftLeaves(self, root: TreeNode) -> int: """ diff --git "a/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" "b/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" index 1711f63836..210b492df6 100644 --- "a/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" +++ "b/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" @@ -146,7 +146,7 @@ class Solution { ``` ### Python -```python3 +```python class Solution: # 思路1:优先考虑胃饼干 def findContentChildren(self, g: List[int], s: List[int]) -> int: diff --git "a/problems/0463.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" "b/problems/0463.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" index e19e06ee5e..9911dfe5a3 100644 --- "a/problems/0463.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" +++ "b/problems/0463.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" @@ -124,7 +124,7 @@ Python: ### 解法1: 扫描每个cell,如果当前位置为岛屿 grid[i][j] == 1, 从当前位置判断四边方向,如果边界或者是水域,证明有边界存在,res矩阵的对应cell加一。 -```python3 +```python class Solution: def islandPerimeter(self, grid: List[List[int]]) -> int: diff --git "a/problems/0474.\344\270\200\345\222\214\351\233\266.md" "b/problems/0474.\344\270\200\345\222\214\351\233\266.md" index 67e366f436..964df4a829 100644 --- "a/problems/0474.\344\270\200\345\222\214\351\233\266.md" +++ "b/problems/0474.\344\270\200\345\222\214\351\233\266.md" @@ -193,7 +193,7 @@ class Solution { ``` Python: -```python3 +```python class Solution: def findMaxForm(self, strs: List[str], m: int, n: int) -> int: dp = [[0] * (n + 1) for _ in range(m + 1)] # 默认初始化0 diff --git "a/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" "b/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" index 6d88119e7c..70b08d50a5 100644 --- "a/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" @@ -233,7 +233,7 @@ class Solution { python3 **回溯** -```python3 +```python class Solution: def __init__(self): self.paths = [] @@ -270,7 +270,7 @@ class Solution: self.path.pop() ``` **回溯+哈希表去重** -```python3 +```python class Solution: def __init__(self): self.paths = [] diff --git "a/problems/0494.\347\233\256\346\240\207\345\222\214.md" "b/problems/0494.\347\233\256\346\240\207\345\222\214.md" index f190b734f3..47d0784ee4 100644 --- "a/problems/0494.\347\233\256\346\240\207\345\222\214.md" +++ "b/problems/0494.\347\233\256\346\240\207\345\222\214.md" @@ -160,11 +160,16 @@ dp[j] 表示:填满j(包括j)这么大容积的包,有dp[j]种方法 那么只要搞到nums[i]的话,凑成dp[j]就有dp[j - nums[i]] 种方法。 -举一个例子,nums[i] = 2: dp[3],填满背包容量为3的话,有dp[3]种方法。 -那么只需要搞到一个2(nums[i]),有dp[3]方法可以凑齐容量为3的背包,相应的就有多少种方法可以凑齐容量为5的背包。 +例如:dp[j],j 为5, -那么需要把 这些方法累加起来就可以了,dp[j] += dp[j - nums[i]] +* 已经有一个1(nums[i]) 的话,有 dp[4]种方法 凑成 dp[5]。 +* 已经有一个2(nums[i]) 的话,有 dp[3]种方法 凑成 dp[5]。 +* 已经有一个3(nums[i]) 的话,有 dp[2]中方法 凑成 dp[5] +* 已经有一个4(nums[i]) 的话,有 dp[1]中方法 凑成 dp[5] +* 已经有一个5 (nums[i])的话,有 dp[0]中方法 凑成 dp[5] + +那么凑整dp[5]有多少方法呢,也就是把 所有的 dp[j - nums[i]] 累加起来。 所以求组合类问题的公式,都是类似这种: diff --git "a/problems/0496.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240I.md" "b/problems/0496.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240I.md" index f039c19854..f9dfa3081b 100644 --- "a/problems/0496.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240I.md" +++ "b/problems/0496.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240I.md" @@ -222,8 +222,8 @@ class Solution { } } ``` -Python: -```python3 +Python3: +```python class Solution: def nextGreaterElement(self, nums1: List[int], nums2: List[int]) -> List[int]: result = [-1]*len(nums1) diff --git "a/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" "b/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" index 277f46f52e..a2984eccb3 100644 --- "a/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" +++ "b/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" @@ -470,7 +470,7 @@ class Solution { > 递归法 -```python3 +```python # Definition for a binary tree node. # class TreeNode: # def __init__(self, val=0, left=None, right=None): @@ -515,7 +515,7 @@ class Solution: > 迭代法-中序遍历-不使用额外空间,利用二叉搜索树特性 -```python3 +```python class Solution: def findMode(self, root: TreeNode) -> List[int]: stack = [] diff --git "a/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" "b/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" index c9532a2291..36e183e1b1 100644 --- "a/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" +++ "b/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" @@ -124,7 +124,7 @@ class Solution { ``` Python: -```python3 +```python class Solution: def nextGreaterElements(self, nums: List[int]) -> List[int]: dp = [-1] * len(nums) diff --git "a/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" "b/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" index be60ac1333..e72c5f8515 100644 --- "a/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" +++ "b/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" @@ -207,7 +207,7 @@ class Solution { Python: -```python3 +```python class Solution: def change(self, amount: int, coins: List[int]) -> int: dp = [0]*(amount + 1) diff --git "a/problems/0538.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md" "b/problems/0538.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md" index 1d11d4ee0e..1b07b8034f 100644 --- "a/problems/0538.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md" +++ "b/problems/0538.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md" @@ -196,7 +196,7 @@ class Solution { ## Python **递归** -```python3 +```python # Definition for a binary tree node. # class TreeNode: # def __init__(self, val=0, left=None, right=None): diff --git "a/problems/0669.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0669.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" index d17c0b1c1c..15f6a04093 100644 --- "a/problems/0669.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" +++ "b/problems/0669.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" @@ -264,7 +264,7 @@ class Solution { ## Python **递归** -```python3 +```python # Definition for a binary tree node. # class TreeNode: # def __init__(self, val=0, left=None, right=None): diff --git "a/problems/0841.\351\222\245\345\214\231\345\222\214\346\210\277\351\227\264.md" "b/problems/0841.\351\222\245\345\214\231\345\222\214\346\210\277\351\227\264.md" index 8397690e5c..1cd130653b 100644 --- "a/problems/0841.\351\222\245\345\214\231\345\222\214\346\210\277\351\227\264.md" +++ "b/problems/0841.\351\222\245\345\214\231\345\222\214\346\210\277\351\227\264.md" @@ -152,7 +152,6 @@ class Solution { -Python: python3 diff --git "a/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" "b/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" index 9a0bb1c1bd..b94e557de8 100644 --- "a/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" +++ "b/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" @@ -194,7 +194,7 @@ class Solution { ``` Python: -```python3 +```python # 方法一,使用栈,推荐! class Solution: def removeDuplicates(self, s: str) -> str: @@ -207,7 +207,7 @@ class Solution: return "".join(res) # 字符串拼接 ``` -```python3 +```python # 方法二,使用双指针模拟栈,如果不让用栈可以作为备选方法。 class Solution: def removeDuplicates(self, s: str) -> str: diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" index c481fd1181..2fef68daf0 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" @@ -168,7 +168,7 @@ class Solution { ``` Python: -```python3 +```python # 前序遍历-递归-LC144_二叉树的前序遍历 class Solution: def preorderTraversal(self, root: TreeNode) -> List[int]: diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20201003\344\272\214\345\217\211\346\240\221\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20201003\344\272\214\345\217\211\346\240\221\345\221\250\346\234\253\346\200\273\347\273\223.md" index a0b8c2dd3c..18bbf37f97 100644 --- "a/problems/\345\221\250\346\200\273\347\273\223/20201003\344\272\214\345\217\211\346\240\221\345\221\250\346\234\253\346\200\273\347\273\223.md" +++ "b/problems/\345\221\250\346\200\273\347\273\223/20201003\344\272\214\345\217\211\346\240\221\345\221\250\346\234\253\346\200\273\347\273\223.md" @@ -34,8 +34,8 @@ public: // 此时就是:左右节点都不为空,且数值相同的情况 // 此时才做递归,做下一层的判断 - bool outside = compare(left->left, right->right); // 左子树:左、 右子树:左 (相对于求对称二叉树,只需改一下这里的顺序) - bool inside = compare(left->right, right->left); // 左子树:右、 右子树:右 + bool outside = compare(left->left, right->left); // 左子树:左、 右子树:左 (相对于求对称二叉树,只需改一下这里的顺序) + bool inside = compare(left->right, right->right); // 左子树:右、 右子树:右 bool isSame = outside && inside; // 左子树:中、 右子树:中 (逻辑处理) return isSame; diff --git "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" index cea69c724c..7abaf16000 100644 --- "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" +++ "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" @@ -216,7 +216,7 @@ private static void testCompletePackAnotherWay(){ Python: -```python3 +```python # 先遍历物品,再遍历背包 def test_complete_pack1(): weight = [1, 3, 4] From 4b1542f8643f63ca9a09103642c680e05996e1a8 Mon Sep 17 00:00:00 2001 From: Jack Date: Mon, 28 Feb 2022 21:02:53 +0800 Subject: [PATCH 0401/3019] =?UTF-8?q?1002=E6=9F=A5=E6=89=BE=E5=B8=B8?= =?UTF-8?q?=E7=94=A8=E5=AD=97=E7=AC=A6=E6=B7=BB=E5=8A=A0typescript?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...70\347\224\250\345\255\227\347\254\246.md" | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git "a/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md" "b/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md" index 7c5566d333..e3d4d774b9 100644 --- "a/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md" +++ "b/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md" @@ -253,6 +253,41 @@ var commonChars = function (words) { return res }; ``` +TypeScript +```ts + console.time("test") + let str: string = "" + //设置一个用字母组成的map字典 + let map = new Map() + //给所有map设置初始值为0 + let wordInitial: [string, number][] = words[0] + .split("") + .map((item) => [item, 0]) + //如果有重复字母,就把重复字母的数量加1 + for (let word of words[0]) { + map.set(word, map.has(word) ? map.get(word) + 1 : 1) + } + for (let i = 1; i < words.length; i++) { + const mapWord = new Map(wordInitial) + for (let j = 0; j < words[i].length; j++) { + if (!map.has(words[i][j])) continue + //mapWord中的字母的个数不能高于当前map的个数,多于则不能添加 + if (map.get(words[i][j]) > mapWord.get(words[i][j])) { + mapWord.set( + words[i][j], + mapWord.has(words[i][j]) ? mapWord!.get(words[i][j]) + 1 : 1 + ) + } + } + //每次重新初始化map + map = mapWord + } + for (let [key, value] of map) { + str += key.repeat(value) + } + console.timeEnd("test") + return str.split("") +``` GO ```golang func commonChars(words []string) []string { From fc5b272bd604dfe409a5c699d8253fde515b83ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E4=BC=97=E8=B1=AA?= Date: Tue, 1 Mar 2022 08:56:51 +0800 Subject: [PATCH 0402/3019] =?UTF-8?q?fix:=200053.=E5=8A=A8=E6=80=81?= =?UTF-8?q?=E8=A7=84=E5=88=92=20js=E4=BB=A3=E7=A0=81=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...5\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" | 1 + 1 file changed, 1 insertion(+) diff --git "a/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" "b/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" index 37de9bbed8..703e1dd68d 100644 --- "a/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" +++ "b/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" @@ -174,6 +174,7 @@ const maxSubArray = nums => { // 数组长度,dp初始化 const len = nums.length; let dp = new Array(len).fill(0); + dp[0] = nums[0]; // 最大值初始化为dp[0] let max = dp[0]; for (let i = 1; i < len; i++) { From 66c3aab86a1c979ca14244c65ee2564be6e288d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8F=82=E7=8F=82?= Date: Tue, 1 Mar 2022 11:27:42 +0800 Subject: [PATCH 0403/3019] =?UTF-8?q?=E5=AF=B9=E4=BA=8E09=E8=BF=99?= =?UTF-8?q?=E6=A0=B7=E7=9A=84=E5=88=A4=E6=96=AD=E5=8F=AF=E4=BB=A5=E4=B8=8D?= =?UTF-8?q?=E5=81=9A=EF=BC=8C=E7=9B=B4=E6=8E=A5=E7=94=A8String.valueOf?= =?UTF-8?q?=E6=96=B9=E6=B3=95=E5=B0=B1=E8=A1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...36\347\232\204\346\225\260\345\255\227.md" | 24 ++++++++----------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git "a/problems/0738.\345\215\225\350\260\203\351\200\222\345\242\236\347\232\204\346\225\260\345\255\227.md" "b/problems/0738.\345\215\225\350\260\203\351\200\222\345\242\236\347\232\204\346\225\260\345\255\227.md" index e670bb31be..c8ce8a2b9a 100644 --- "a/problems/0738.\345\215\225\350\260\203\351\200\222\345\242\236\347\232\204\346\225\260\345\255\227.md" +++ "b/problems/0738.\345\215\225\350\260\203\351\200\222\345\242\236\347\232\204\346\225\260\345\255\227.md" @@ -148,23 +148,19 @@ java版本1中创建了String数组,多次使用Integer.parseInt了方法, 版本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]= 0; i--) { + if (chars[i] > chars[i + 1]) { + chars[i]--; + start = i+1; } } - StringBuilder res=new StringBuilder(); - for (int i=0;i=start){ - res.append('9'); - }else res.append(chars[i]); + for (int i = start; i < s.length(); i++) { + chars[i] = '9'; } - return Integer.parseInt(res.toString()); + return Integer.parseInt(String.valueOf(chars)); } } ``` From 1ed3e9e8f4dff921e983e636f85f963a38839e05 Mon Sep 17 00:00:00 2001 From: youngyangyang04 <826123027@qq.com> Date: Tue, 1 Mar 2022 17:12:19 +0800 Subject: [PATCH 0404/3019] Update --- ...\217\211\346\240\221\346\200\273\347\273\223\347\257\207.md" | 2 +- ...\247\204\345\210\222\346\200\273\347\273\223\347\257\207.md" | 2 +- "problems/\345\233\236\346\272\257\346\200\273\347\273\223.md" | 2 +- ...\256\227\346\263\225\346\200\273\347\273\223\347\257\207.md" | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git "a/problems/\344\272\214\345\217\211\346\240\221\346\200\273\347\273\223\347\257\207.md" "b/problems/\344\272\214\345\217\211\346\240\221\346\200\273\347\273\223\347\257\207.md" index d1332e09a8..73faffa6c5 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\346\200\273\347\273\223\347\257\207.md" @@ -152,7 +152,7 @@ ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211030125421.png) -这个图是 [代码随想录知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) 成员:[青](https://wx.zsxq.com/dweb2/index/footprint/185251215558842),所画,总结的非常好,分享给大家。 +这个图是 [代码随想录知识星球](https://programmercarl.com/other/kstar.html) 成员:[青](https://wx.zsxq.com/dweb2/index/footprint/185251215558842),所画,总结的非常好,分享给大家。 **最后,二叉树系列就这么完美结束了,估计这应该是最长的系列了,感谢大家33天的坚持与陪伴,接下来我们又要开始新的系列了「回溯算法」!** diff --git "a/problems/\345\212\250\346\200\201\350\247\204\345\210\222\346\200\273\347\273\223\347\257\207.md" "b/problems/\345\212\250\346\200\201\350\247\204\345\210\222\346\200\273\347\273\223\347\257\207.md" index 699d443556..cc973b2314 100644 --- "a/problems/\345\212\250\346\200\201\350\247\204\345\210\222\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/\345\212\250\346\200\201\350\247\204\345\210\222\346\200\273\347\273\223\347\257\207.md" @@ -118,7 +118,7 @@ ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211121223754.png) -这个图是 [代码随想录知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) 成员:[青](https://wx.zsxq.com/dweb2/index/footprint/185251215558842),所画,总结的非常好,分享给大家。 +这个图是 [代码随想录知识星球](https://programmercarl.com/other/kstar.html) 成员:[青](https://wx.zsxq.com/dweb2/index/footprint/185251215558842),所画,总结的非常好,分享给大家。 这已经是全网对动规最深刻的讲解系列了。 diff --git "a/problems/\345\233\236\346\272\257\346\200\273\347\273\223.md" "b/problems/\345\233\236\346\272\257\346\200\273\347\273\223.md" index af1712439f..671e0a4eb1 100644 --- "a/problems/\345\233\236\346\272\257\346\200\273\347\273\223.md" +++ "b/problems/\345\233\236\346\272\257\346\200\273\347\273\223.md" @@ -432,7 +432,7 @@ N皇后问题分析: ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211030124742.png) -这个图是 [代码随想录知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) 成员:[莫非毛](https://wx.zsxq.com/dweb2/index/footprint/828844212542),所画,总结的非常好,分享给大家。 +这个图是 [代码随想录知识星球](https://programmercarl.com/other/kstar.html) 成员:[莫非毛](https://wx.zsxq.com/dweb2/index/footprint/828844212542),所画,总结的非常好,分享给大家。 **回溯算法系列正式结束,新的系列终将开始,录友们准备开启新的征程!** diff --git "a/problems/\350\264\252\345\277\203\347\256\227\346\263\225\346\200\273\347\273\223\347\257\207.md" "b/problems/\350\264\252\345\277\203\347\256\227\346\263\225\346\200\273\347\273\223\347\257\207.md" index 6da43ea31d..1db9b4dc10 100644 --- "a/problems/\350\264\252\345\277\203\347\256\227\346\263\225\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/\350\264\252\345\277\203\347\256\227\346\263\225\346\200\273\347\273\223\347\257\207.md" @@ -129,7 +129,7 @@ Carl个人认为:如果找出局部最优并可以推出全局最优,就是 ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211110121605.png) -这个图是 [代码随想录知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) 成员:[青](https://wx.zsxq.com/dweb2/index/footprint/185251215558842)所画,总结的非常好,分享给大家。 +这个图是 [代码随想录知识星球](https://programmercarl.com/other/kstar.html) 成员:[青](https://wx.zsxq.com/dweb2/index/footprint/185251215558842)所画,总结的非常好,分享给大家。 很多没有接触过贪心的同学都会感觉贪心有啥可学的,但只要跟着「代码随想录」坚持下来之后,就会发现,贪心是一种很重要的算法思维而且并不简单,贪心往往妙的出其不意,触不及防! From e67bf9d4330aa3c7cf08f899aef2b11b3bba8cb8 Mon Sep 17 00:00:00 2001 From: Dawn-private <404232992@qq.com> Date: Tue, 1 Mar 2022 19:51:18 +0800 Subject: [PATCH 0405/3019] =?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 修改300.最长递增子序列动态数组的定义 --- ...\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" "b/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" index ed61a30e8d..dfdd51257c 100644 --- "a/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" @@ -37,7 +37,7 @@ 1. dp[i]的定义 -**dp[i]表示i之前包括i的最长上升子序列的长度**。 +**dp[i]表示i之前包括i的以nums[i]结尾最长上升子序列的长度** 2. 状态转移方程 From 10c49296ff3b7d9d97fd1d061beb8db77e771be9 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Tue, 1 Mar 2022 21:28:59 +0800 Subject: [PATCH 0406/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880236.?= =?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=A0=91=E7=9A=84=E6=9C=80=E8=BF=91=E5=85=AC?= =?UTF-8?q?=E5=85=B1=E7=A5=96=E5=85=88.md=EF=BC=89=EF=BC=9A=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...205\254\345\205\261\347\245\226\345\205\210.md" | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git "a/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" "b/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" index 6213aeaa2c..ca5fba77bd 100644 --- "a/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" +++ "b/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" @@ -325,6 +325,20 @@ var lowestCommonAncestor = function(root, p, q) { }; ``` +## TypeScript + +```typescript +function lowestCommonAncestor(root: TreeNode | null, p: TreeNode | null, q: TreeNode | null): TreeNode | null { + if (root === null || root === p || root === q) return root; + const left = lowestCommonAncestor(root.left, p, q); + const right = lowestCommonAncestor(root.right, p, q); + if (left !== null && right !== null) return root; + if (left !== null) return left; + if (right !== null) return right; + return null; +}; +``` + ----------------------- From d4e3da4c3db7729441397b7555b5a26b62fb8e2c Mon Sep 17 00:00:00 2001 From: Qiyu Liang <61932152+Guicai996@users.noreply.github.com> Date: Tue, 1 Mar 2022 23:33:54 +0800 Subject: [PATCH 0407/3019] =?UTF-8?q?Update=200139.=E5=8D=95=E8=AF=8D?= =?UTF-8?q?=E6=8B=86=E5=88=86.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 删除原Line 102,修改memory数组为bool型 因为根据执行顺序,Line 101的if判断句,只有在前一个判断返回true的时候才会递归,因此若执行到memory[startIndex] = 1时,程序已经完成了遍历,memory[startIndex] = 1的情况完全没用的上。而memory用上的情况为false重复,即程序已经判断过startIndex开头无法分割。 --- ....\345\215\225\350\257\215\346\213\206\345\210\206.md" | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git "a/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" "b/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" index 1653a81a14..e04cb173c8 100644 --- "a/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" +++ "b/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" @@ -89,27 +89,26 @@ class Solution { private: bool backtracking (const string& s, const unordered_set& wordSet, - vector& memory, + vector& memory, int startIndex) { if (startIndex >= s.size()) { return true; } // 如果memory[startIndex]不是初始值了,直接使用memory[startIndex]的结果 - if (memory[startIndex] != -1) return memory[startIndex]; + if (!memory[startIndex]) return memory[startIndex]; for (int i = startIndex; i < s.size(); i++) { string word = s.substr(startIndex, i - startIndex + 1); if (wordSet.find(word) != wordSet.end() && backtracking(s, wordSet, memory, i + 1)) { - memory[startIndex] = 1; // 记录以startIndex开始的子串是可以被拆分的 return true; } } - memory[startIndex] = 0; // 记录以startIndex开始的子串是不可以被拆分的 + memory[startIndex] = false; // 记录以startIndex开始的子串是不可以被拆分的 return false; } public: bool wordBreak(string s, vector& wordDict) { unordered_set wordSet(wordDict.begin(), wordDict.end()); - vector memory(s.size(), -1); // -1 表示初始化状态 + vector memory(s.size(), 1); // -1 表示初始化状态 return backtracking(s, wordSet, memory, 0); } }; From 58ffbd146ba7250eba350b688f2bed095495e012 Mon Sep 17 00:00:00 2001 From: leeeeeeewii <54872662+leeeeeeewii@users.noreply.github.com> Date: Tue, 1 Mar 2022 23:40:17 +0800 Subject: [PATCH 0408/3019] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=200116.=E5=A1=AB?= =?UTF-8?q?=E5=85=85=E6=AF=8F=E4=B8=AA=E8=8A=82=E7=82=B9=E7=9A=84=E4=B8=8B?= =?UTF-8?q?=E4=B8=80=E4=B8=AA=E5=8F=B3=E4=BE=A7=E8=8A=82=E7=82=B9=E6=8C=87?= =?UTF-8?q?=E9=92=88.md=20Go=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...02\347\202\271\346\214\207\351\222\210.md" | 47 ++++++++++++++++++- 1 file changed, 45 insertions(+), 2 deletions(-) diff --git "a/problems/0116.\345\241\253\345\205\205\346\257\217\344\270\252\350\212\202\347\202\271\347\232\204\344\270\213\344\270\200\344\270\252\345\217\263\344\276\247\350\212\202\347\202\271\346\214\207\351\222\210.md" "b/problems/0116.\345\241\253\345\205\205\346\257\217\344\270\252\350\212\202\347\202\271\347\232\204\344\270\213\344\270\200\344\270\252\345\217\263\344\276\247\350\212\202\347\202\271\346\214\207\351\222\210.md" index bc3a8c6bb0..2c443de52a 100644 --- "a/problems/0116.\345\241\253\345\205\205\346\257\217\344\270\252\350\212\202\347\202\271\347\232\204\344\270\213\344\270\200\344\270\252\345\217\263\344\276\247\350\212\202\347\202\271\346\214\207\351\222\210.md" +++ "b/problems/0116.\345\241\253\345\205\205\346\257\217\344\270\252\350\212\202\347\202\271\347\232\204\344\270\213\344\270\200\344\270\252\345\217\263\344\276\247\350\212\202\347\202\271\346\214\207\351\222\210.md" @@ -211,9 +211,52 @@ class Solution: return root ``` ## Go - ```go - +// 迭代法 +func connect(root *Node) *Node { + if root == nil { + return root + } + stack := make([]*Node, 0) + stack = append(stack, root) + for len(stack) > 0 { + n := len(stack) // 记录当前层节点个数 + for i := 0; i < n; i++ { + node := stack[0] // 依次弹出节点 + stack = stack[1:] + if i == n - 1 { // 如果是这层最右的节点,next指向nil + node.Next = nil + } else { + node.Next = stack[0] // 如果不是最右的节点,next指向右边的节点 + } + if node.Left != nil { // 如果存在左子节点,放入栈中 + stack = append(stack, node.Left) + } + if node.Right != nil { // 如果存在右子节点,放入栈中 + stack = append(stack, node.Right) + } + } + } + return root +} +``` +```go +// 常量级额外空间,使用next +func connect(root *Node) *Node { + if root == nil { + return root + } + for cur := root; cur.Left != nil; cur = cur.Left { // 遍历每层最左边的节点 + for node := cur; node != nil; node = node.Next { // 当前层从左到右遍历 + node.Left.Next = node.Right // 左子节点next指向右子节点 + if node.Next != nil { //如果node next有值,右子节点指向next节点的左子节点 + node.Right.Next = node.Next.Left + } + + } + } + return root +} ``` ## JavaScript From 246bbe921c5a09cc0f440bb97a75cf92067fd950 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Wed, 2 Mar 2022 14:20:44 +0800 Subject: [PATCH 0409/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880235.?= =?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=90=9C=E7=B4=A2=E6=A0=91=E7=9A=84=E6=9C=80?= =?UTF-8?q?=E8=BF=91=E5=85=AC=E5=85=B1=E7=A5=96=E5=85=88.md=EF=BC=89?= =?UTF-8?q?=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...54\345\205\261\347\245\226\345\205\210.md" | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git "a/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" "b/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" index b9d0a0bf91..f7f1427aad 100644 --- "a/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" +++ "b/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" @@ -350,6 +350,39 @@ var lowestCommonAncestor = function(root, p, q) { }; ``` +## TypeScript + +> 递归法: + +```typescript +function lowestCommonAncestor(root: TreeNode | null, p: TreeNode | null, q: TreeNode | null): TreeNode | null { + 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; +}; +``` + +> 迭代法: + +```typescript +function lowestCommonAncestor(root: TreeNode | null, p: TreeNode | null, q: TreeNode | null): TreeNode | null { + while (root !== null) { + if (root.val > p.val && root.val > q.val) { + root = root.left; + } else if (root.val < p.val && root.val < q.val) { + root = root.right; + } else { + return root; + }; + }; + return null; +}; +``` + + + -----------------------
From 32c54b4a5604aecab1681a84a8a58ed29b9a1151 Mon Sep 17 00:00:00 2001 From: Wayne <3522373084@qq.com> Date: Wed, 2 Mar 2022 16:03:14 +0800 Subject: [PATCH 0410/3019] =?UTF-8?q?=E4=BF=AE=E6=94=B9=20968=20=E7=9B=91?= =?UTF-8?q?=E6=8E=A7=E4=BA=8C=E5=8F=89=E6=A0=91=20Java=20=E4=BB=A3?= =?UTF-8?q?=E7=A0=81,=E5=A2=9E=E5=8A=A0=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...47\344\272\214\345\217\211\346\240\221.md" | 50 ++++++++++++------- 1 file changed, 33 insertions(+), 17 deletions(-) diff --git "a/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" "b/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" index 433060a540..35c3ccdc2b 100644 --- "a/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" @@ -316,28 +316,44 @@ public: ### Java ```java class Solution { - private int count = 0; + int res=0; public int minCameraCover(TreeNode root) { - if (trval(root) == 0) count++; - return count; + // 对根节点的状态做检验,防止根节点是无覆盖状态 . + if(minCame(root)==0){ + res++; + } + return res; } - - private int trval(TreeNode root) { - if (root == null) return -1; - - int left = trval(root.left); - int right = trval(root.right); - - if (left == 0 || right == 0) { - count++; + /** + 节点的状态值: + 0 表示无覆盖 + 1 表示 有摄像头 + 2 表示有覆盖 + 后序遍历,根据左右节点的情况,来判读 自己的状态 + */ + public int minCame(TreeNode root){ + if(root==null){ + // 空节点默认为 有覆盖状态,避免在叶子节点上放摄像头 return 2; } - - if (left == 2 || right == 2) { + int left=minCame(root.left); + int right=minCame(root.right); + + // 如果左右节点都覆盖了的话, 那么本节点的状态就应该是无覆盖,没有摄像头 + if(left==2&&right==2){ + //(2,2) + return 0; + }else if(left==0||right==0){ + // 左右节点都是无覆盖状态,那 根节点此时应该放一个摄像头 + // (0,0) (0,1) (0,2) (1,0) (2,0) + // 状态值为 1 摄像头数 ++; + res++; return 1; + }else{ + // 左右节点的 状态为 (1,1) (1,2) (2,1) 也就是左右节点至少存在 1个摄像头, + // 那么本节点就是处于被覆盖状态 + return 2; } - - return 0; } } ``` @@ -391,7 +407,7 @@ class Solution: result += 1 return result -``` +``` ### Go ```go From f4b55a1e4abb3e0ac0ae49c8126ee6a827c19447 Mon Sep 17 00:00:00 2001 From: ashing Date: Wed, 2 Mar 2022 21:10:26 +0800 Subject: [PATCH 0411/3019] =?UTF-8?q?Update=20=E8=83=8C=E5=8C=85=E9=97=AE?= =?UTF-8?q?=E9=A2=98=E7=90=86=E8=AE=BA=E5=9F=BA=E7=A1=80=E5=A4=9A=E9=87=8D?= =?UTF-8?q?=E8=83=8C=E5=8C=85.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 补充 go 多重背包理论 --- ...32\351\207\215\350\203\214\345\214\205.md" | 87 +++++++++++++++++++ 1 file changed, 87 insertions(+) diff --git "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\244\232\351\207\215\350\203\214\345\214\205.md" "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\244\232\351\207\215\350\203\214\345\214\205.md" index 80b9f8a14d..d05c3445a7 100644 --- "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\244\232\351\207\215\350\203\214\345\214\205.md" +++ "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\244\232\351\207\215\350\203\214\345\214\205.md" @@ -245,7 +245,94 @@ if __name__ == '__main__': Go: +```go +package theory + +import "log" + +// 多重背包可以化解为 01 背包 +func multiplePack(weight, value, nums []int, bagWeight int) int { + + for i := 0; i < len(nums); i++ { + for nums[i] > 1 { + weight = append(weight, weight[i]) + value = append(value, value[i]) + nums[i]-- + } + } + log.Println(weight) + log.Println(value) + + res := make([]int, bagWeight+1) + for i := 0; i < len(weight); i++ { + for j := bagWeight; j >= weight[i]; j-- { + res[j] = getMax(res[j], res[j-weight[i]]+value[i]) + } + log.Println(res) + } + + return res[bagWeight] +} +``` + +> 单元测试 + +```go +package theory + +import "testing" + +func Test_multiplePack(t *testing.T) { + type args struct { + weight []int + value []int + nums []int + bagWeight int + } + tests := []struct { + name string + args args + want int + }{ + { + name: "one", + args: args{ + weight: []int{1, 3, 4}, + value: []int{15, 20, 30}, + nums: []int{2, 3, 2}, + bagWeight: 10, + }, + want: 90, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if got := multiplePack(tt.args.weight, tt.args.value, tt.args.nums, tt.args.bagWeight); got != tt.want { + t.Errorf("multiplePack() = %v, want %v", got, tt.want) + } + }) + } +} +``` + +> 输出 +``` +=== RUN Test_multiplePack +=== RUN Test_multiplePack/one +2022/03/02 21:09:05 [1 3 4 1 3 3 4] +2022/03/02 21:09:05 [15 20 30 15 20 20 30] +2022/03/02 21:09:05 [0 15 15 15 15 15 15 15 15 15 15] +2022/03/02 21:09:05 [0 15 15 20 35 35 35 35 35 35 35] +2022/03/02 21:09:05 [0 15 15 20 35 45 45 50 65 65 65] +2022/03/02 21:09:05 [0 15 30 30 35 50 60 60 65 80 80] +2022/03/02 21:09:05 [0 15 30 30 35 50 60 60 70 80 80] +2022/03/02 21:09:05 [0 15 30 30 35 50 60 60 70 80 80] +2022/03/02 21:09:05 [0 15 30 30 35 50 60 60 70 80 90] +--- PASS: Test_multiplePack (0.00s) + --- PASS: Test_multiplePack/one (0.00s) +PASS +``` ----------------------- From f2c75c27af3bd0ed9881faaa820529730068e353 Mon Sep 17 00:00:00 2001 From: kinsozheng Date: Wed, 2 Mar 2022 22:25:00 +0800 Subject: [PATCH 0412/3019] =?UTF-8?q?=E4=BF=AE=E6=94=B90018=E5=9B=9B?= =?UTF-8?q?=E6=95=B0=E4=B9=8B=E5=92=8C=20Python=E7=89=88=E6=9C=AC=20?= =?UTF-8?q?=E5=93=88=E5=B8=8C=E8=A1=A8=E6=B3=95=E8=A7=A3=E6=B3=95=20?= =?UTF-8?q?=E8=A7=A3=E5=86=B3=E7=94=A8set()=E5=AD=98=E5=82=A8=E8=BF=94?= =?UTF-8?q?=E5=9B=9E=E7=BB=93=E6=9E=9C=E4=BD=86=E6=98=AF=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E6=8A=A5=E9=94=99=E7=9A=84=E9=97=AE=E9=A2=98=20=E5=90=8C?= =?UTF-8?q?=E6=97=B6=E5=8A=A0=E5=85=A5=E4=BB=A5list()=E5=AD=98=E5=82=A8?= =?UTF-8?q?=E7=BB=93=E6=9E=9C=E7=9A=84=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...33\233\346\225\260\344\271\213\345\222\214.md" | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git "a/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" "b/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" index bad258c181..348f2f7391 100644 --- "a/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" @@ -212,6 +212,7 @@ class Solution(object): # good thing about using python is you can use set to drop duplicates. ans = set() + # ans = [] # save results by list() for i in range(len(nums)): for j in range(i + 1, len(nums)): for k in range(j + 1, len(nums)): @@ -220,10 +221,16 @@ class Solution(object): # make sure no duplicates. count = (nums[i] == val) + (nums[j] == val) + (nums[k] == val) if hashmap[val] > count: - ans.add(tuple(sorted([nums[i], nums[j], nums[k], val]))) - else: - continue - return ans + ans_tmp = tuple(sorted([nums[i], nums[j], nums[k], val])) + ans.add(ans_tmp) + # Avoiding duplication in list manner but it cause time complexity increases + # if ans_tmp not in ans: + # ans.append(ans_tmp) + else: + continue + return list(ans) + # if used list() to save results, just + # return ans ``` From 70ea2c76eab540df65f34f79f5ba425ba50c54c7 Mon Sep 17 00:00:00 2001 From: wangming Date: Thu, 3 Mar 2022 16:29:41 +0800 Subject: [PATCH 0413/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A00309.=E6=9C=80?= =?UTF-8?q?=E4=BD=B3=E4=B9=B0=E5=8D=96=E8=82=A1=E7=A5=A8=E6=97=B6=E6=9C=BA?= =?UTF-8?q?=E5=90=AB=E5=86=B7=E5=86=BB=E6=9C=9Fjs=E7=A9=BA=E9=97=B4?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...253\345\206\267\345\206\273\346\234\237.md" | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git "a/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" "b/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" index 2dc1e87486..bb8909cd01 100644 --- "a/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" +++ "b/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" @@ -284,6 +284,24 @@ const maxProfit = (prices) => { }; ``` +```javascript +// 一维数组空间优化 +const maxProfit = (prices) => { + const n = prices.length + const dp = new Array(4).fill(0) + dp[0] = -prices[0] + for (let i = 1; i < n; i ++) { + const temp = dp[0] // 缓存上一次的状态 + const temp1 = dp[2] + dp[0] = Math.max(dp[0], Math.max(dp[3] - prices[i], dp[1] - prices[i])) // 持有状态 + dp[1] = Math.max(dp[1], dp[3]) // 今天不操作且不持有股票 + dp[2] = temp + prices[i] // 今天卖出股票 + dp[3] = temp1 // 冷冻期 + } + return Math.max(...dp) +}; +``` + -----------------------
From cc302a9e8d43440605c4a61bde398784800c2b5e Mon Sep 17 00:00:00 2001 From: Aaron-Lin-74 <84072071+Aaron-Lin-74@users.noreply.github.com> Date: Fri, 4 Mar 2022 10:52:42 +1100 Subject: [PATCH 0414/3019] =?UTF-8?q?Update=200203.=E7=A7=BB=E9=99=A4?= =?UTF-8?q?=E9=93=BE=E8=A1=A8=E5=85=83=E7=B4=A0.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The variable cur could be null, should add the union to the type of cur. --- ...\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" "b/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" index 4e7bdd34a8..c0e0be3e8d 100644 --- "a/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" +++ "b/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" @@ -324,7 +324,7 @@ function removeElements(head: ListNode | null, val: number): ListNode | null { head = head.next; } if (head === null) return head; - let pre: ListNode = head, cur: ListNode = head.next; + let pre: ListNode = head, cur: ListNode | null = head.next; // 删除非头部节点 while (cur) { if (cur.val === val) { From 09c1bd818abf8da2c1c426a06e46f2063b0089b0 Mon Sep 17 00:00:00 2001 From: Aaron-Lin-74 <84072071+Aaron-Lin-74@users.noreply.github.com> Date: Fri, 4 Mar 2022 11:12:33 +1100 Subject: [PATCH 0415/3019] =?UTF-8?q?Update=200203.=E7=A7=BB=E9=99=A4?= =?UTF-8?q?=E9=93=BE=E8=A1=A8=E5=85=83=E7=B4=A0.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Creating a dummy head variable makes the logic clear. --- ...\244\351\223\276\350\241\250\345\205\203\347\264\240.md" | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git "a/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" "b/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" index 4e7bdd34a8..d2ba1ae852 100644 --- "a/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" +++ "b/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" @@ -342,14 +342,14 @@ function removeElements(head: ListNode | null, val: number): ListNode | null { ```typescript function removeElements(head: ListNode | null, val: number): ListNode | null { - head = new ListNode(0, head); - let pre: ListNode = head, cur: ListNode = head.next; + let dummyHead = new ListNode(0, head); + let pre: ListNode = dummyHead, cur: ListNode | null = dummyHead.next; // 删除非头部节点 while (cur) { if (cur.val === val) { pre.next = cur.next; } else { - pre = pre.next; + pre = cur; } cur = cur.next; } From e83846db0413bdcb6be0509eb987d3d2d685de50 Mon Sep 17 00:00:00 2001 From: ClorisMoQi <748709762@qq.com> Date: Thu, 3 Mar 2022 22:40:31 -0800 Subject: [PATCH 0416/3019] add explanation for go slice --- ...37\346\230\257\345\244\232\345\244\247\357\274\237.md" | 6 ++++++ ...37\347\220\206\350\256\262\350\247\243\357\274\211.md" | 8 ++++++++ 2 files changed, 14 insertions(+) diff --git "a/problems/O(n)\347\232\204\347\256\227\346\263\225\345\261\205\347\204\266\350\266\205\346\227\266\344\272\206\357\274\214\346\255\244\346\227\266\347\232\204n\347\251\266\347\253\237\346\230\257\345\244\232\345\244\247\357\274\237.md" "b/problems/O(n)\347\232\204\347\256\227\346\263\225\345\261\205\347\204\266\350\266\205\346\227\266\344\272\206\357\274\214\346\255\244\346\227\266\347\232\204n\347\251\266\347\253\237\346\230\257\345\244\232\345\244\247\357\274\237.md" index 4de5659724..66db2b833b 100644 --- "a/problems/O(n)\347\232\204\347\256\227\346\263\225\345\261\205\347\204\266\350\266\205\346\227\266\344\272\206\357\274\214\346\255\244\346\227\266\347\232\204n\347\251\266\347\253\237\346\230\257\345\244\232\345\244\247\357\274\237.md" +++ "b/problems/O(n)\347\232\204\347\256\227\346\263\225\345\261\205\347\204\266\350\266\205\346\227\266\344\272\206\357\274\214\346\255\244\346\227\266\347\232\204n\347\251\266\347\253\237\346\230\257\345\244\232\345\244\247\357\274\237.md" @@ -226,7 +226,13 @@ Python: Go: +Go中slice的`append`操作和C++中vector的扩容机制基本相同。 +说是基本呢,其实是因为大家平时刷题和工作中遇到的数据不会特别大。 + +具体来说,当当前slice的长度小于**1024**时,执行`append`操作,新slice的capacity会变成当前的2倍;而当slice长度大于等于**1024**时,slice的扩容变成了每次增加当前slice长度的**1/4**。 + +在Go Slice的底层实现中,如果capacity不够时,会做一个reslice的操作,底层数组也会重新被复制到另一块内存区域中,所以`append`一个元素,不一定是O(1), 也可能是O(n)哦。 ----------------------- diff --git "a/problems/\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227\357\274\210vector\345\216\237\347\220\206\350\256\262\350\247\243\357\274\211.md" "b/problems/\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227\357\274\210vector\345\216\237\347\220\206\350\256\262\350\247\243\357\274\211.md" index 11a72e2db0..28317e6c14 100644 --- "a/problems/\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227\357\274\210vector\345\216\237\347\220\206\350\256\262\350\247\243\357\274\211.md" +++ "b/problems/\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227\357\274\210vector\345\216\237\347\220\206\350\256\262\350\247\243\357\274\211.md" @@ -171,6 +171,14 @@ Python: Go: +Go中slice的`append`操作和C++中vector的扩容机制基本相同。 + +说是基本呢,其实是因为大家平时刷题和工作中遇到的数据不会特别大。 + +具体来说,当当前slice的长度小于**1024**时,执行`append`操作,新slice的capacity会变成当前的2倍;而当slice长度大于等于**1024**时,slice的扩容变成了每次增加当前slice长度的**1/4**。 + +在Go Slice的底层实现中,如果capacity不够时,会做一个reslice的操作,底层数组也会重新被复制到另一块内存区域中,所以`append`一个元素,不一定是O(1), 也可能是O(n)哦。 + From 3ec2f7ff537407c036edabfab126d9190e0d299b Mon Sep 17 00:00:00 2001 From: ClorisMoQi <748709762@qq.com> Date: Thu, 3 Mar 2022 22:42:07 -0800 Subject: [PATCH 0417/3019] add explanation for go slice --- ...\237\346\230\257\345\244\232\345\244\247\357\274\237.md" | 6 ------ 1 file changed, 6 deletions(-) diff --git "a/problems/O(n)\347\232\204\347\256\227\346\263\225\345\261\205\347\204\266\350\266\205\346\227\266\344\272\206\357\274\214\346\255\244\346\227\266\347\232\204n\347\251\266\347\253\237\346\230\257\345\244\232\345\244\247\357\274\237.md" "b/problems/O(n)\347\232\204\347\256\227\346\263\225\345\261\205\347\204\266\350\266\205\346\227\266\344\272\206\357\274\214\346\255\244\346\227\266\347\232\204n\347\251\266\347\253\237\346\230\257\345\244\232\345\244\247\357\274\237.md" index 66db2b833b..4de5659724 100644 --- "a/problems/O(n)\347\232\204\347\256\227\346\263\225\345\261\205\347\204\266\350\266\205\346\227\266\344\272\206\357\274\214\346\255\244\346\227\266\347\232\204n\347\251\266\347\253\237\346\230\257\345\244\232\345\244\247\357\274\237.md" +++ "b/problems/O(n)\347\232\204\347\256\227\346\263\225\345\261\205\347\204\266\350\266\205\346\227\266\344\272\206\357\274\214\346\255\244\346\227\266\347\232\204n\347\251\266\347\253\237\346\230\257\345\244\232\345\244\247\357\274\237.md" @@ -226,13 +226,7 @@ Python: Go: -Go中slice的`append`操作和C++中vector的扩容机制基本相同。 -说是基本呢,其实是因为大家平时刷题和工作中遇到的数据不会特别大。 - -具体来说,当当前slice的长度小于**1024**时,执行`append`操作,新slice的capacity会变成当前的2倍;而当slice长度大于等于**1024**时,slice的扩容变成了每次增加当前slice长度的**1/4**。 - -在Go Slice的底层实现中,如果capacity不够时,会做一个reslice的操作,底层数组也会重新被复制到另一块内存区域中,所以`append`一个元素,不一定是O(1), 也可能是O(n)哦。 ----------------------- From 8cf3fabb60a29966bb725b223ada9d92d7aa5bb1 Mon Sep 17 00:00:00 2001 From: Aaron-Lin-74 <84072071+Aaron-Lin-74@users.noreply.github.com> Date: Sat, 5 Mar 2022 11:41:05 +1100 Subject: [PATCH 0418/3019] =?UTF-8?q?Update=200024.=E4=B8=A4=E4=B8=A4?= =?UTF-8?q?=E4=BA=A4=E6=8D=A2=E9=93=BE=E8=A1=A8=E4=B8=AD=E7=9A=84=E8=8A=82?= =?UTF-8?q?=E7=82=B9.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit TypeScript version code that better matches your c++ code example. --- ...55\347\232\204\350\212\202\347\202\271.md" | 40 +++++++------------ 1 file changed, 14 insertions(+), 26 deletions(-) diff --git "a/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" "b/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" index bf1fd5e19d..ce75e0d79f 100644 --- "a/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" +++ "b/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" @@ -254,32 +254,20 @@ TypeScript: ```typescript function swapPairs(head: ListNode | null): ListNode | null { - /** - * 初始状态: - * curNode -> node1 -> node2 -> tmepNode - * 转换过程: - * curNode -> node2 - * curNode -> node2 -> node1 - * curNode -> node2 -> node1 -> tempNode - * curNode = node1 - */ - let retNode: ListNode | null = new ListNode(0, head), - curNode: ListNode | null = retNode, - node1: ListNode | null = null, - node2: ListNode | null = null, - tempNode: ListNode | null = null; - - while (curNode && curNode.next && curNode.next.next) { - node1 = curNode.next; - node2 = curNode.next.next; - tempNode = node2.next; - curNode.next = node2; - node2.next = node1; - node1.next = tempNode; - curNode = node1; - } - return retNode.next; -}; + const dummyHead: ListNode = new ListNode(0, head); + let cur: ListNode = dummyHead; + while(cur.next !== null && cur.next.next !== null) { + const tem: ListNode = cur.next; + const tem1: ListNode = cur.next.next.next; + + cur.next = cur.next.next; // step 1 + cur.next.next = tem; // step 2 + cur.next.next.next = tem1; // step 3 + + cur = cur.next.next; + } + return dummyHead.next; +} ``` Kotlin: From d701e5e2aa80d44a24fbc54e241d6589e34d4b12 Mon Sep 17 00:00:00 2001 From: Wayne <3522373084@qq.com> Date: Sat, 5 Mar 2022 10:59:03 +0800 Subject: [PATCH 0419/3019] =?UTF-8?q?=E4=BF=AE=E6=94=B9739=20=E6=AF=8F?= =?UTF-8?q?=E6=97=A5=E6=B8=A9=E5=BA=A6=E7=9A=84=20Java=20=E4=BB=A3?= =?UTF-8?q?=E7=A0=81,=E5=B9=B6=E5=A2=9E=E5=8A=A0=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...17\346\227\245\346\270\251\345\272\246.md" | 76 +++++++++++++------ 1 file changed, 51 insertions(+), 25 deletions(-) diff --git "a/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" "b/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" index d7489028c9..bdc75b96b8 100644 --- "a/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" +++ "b/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" @@ -177,34 +177,60 @@ public: Java: ```java -/** - * 单调栈,栈内顺序要么从大到小 要么从小到大,本题从大到小 - *

- * 入站元素要和当前栈内栈首元素进行比较 - * 若大于栈首则 则与元素下标做差 - * 若大于等于则放入 - * - * @param temperatures - * @return - */ - public static int[] dailyTemperatures(int[] temperatures) { - Stack stack = new Stack<>(); - int[] res = new int[temperatures.length]; - for (int i = 0; i < temperatures.length; i++) { - /** - * 取出下标进行元素值的比较 - */ - while (!stack.isEmpty() && temperatures[i] > temperatures[stack.peek()]) { - int preIndex = stack.pop(); - res[preIndex] = i - preIndex; + +class Solution { + // 版本 1 + public int[] dailyTemperatures(int[] temperatures) { + + int lens=temperatures.length; + int []res=new int[lens]; + + /** + 如果当前遍历的元素 大于栈顶元素,表示 栈顶元素的 右边的最大的元素就是 当前遍历的元素, + 所以弹出 栈顶元素,并记录 + 如果栈不空的话,还要考虑新的栈顶与当前元素的大小关系 + 否则的话,可以直接入栈。 + 注意,单调栈里 加入的元素是 下标。 + */ + Stackstack=new Stack<>(); + stack.push(0); + for(int i=1;itemperatures[stack.peek()]){ + res[stack.peek()]=i-stack.peek(); + stack.pop(); + } + stack.push(i); } - /** - * 注意 放入的是元素位置 - */ - stack.push(i); } - return res; + + return res; + } + + //--------这 是一条分界线 + // 版本 2 + class Solution { + public int[] dailyTemperatures(int[] temperatures) { + int lens=temperatures.length; + int []res=new int[lens]; + Stackstack=new Stack<>(); + for(int i=0;itemperatures[stack.peek()]){ + res[stack.peek()]=i-stack.peek(); + stack.pop(); + } + stack.push(i); + } + + return res; } +} + +} ``` Python: ``` Python3 From ecde43b2fc292edbfaa1fec6b16d6941e879507f Mon Sep 17 00:00:00 2001 From: youngyangyang04 <826123027@qq.com> Date: Sat, 5 Mar 2022 17:12:34 +0800 Subject: [PATCH 0420/3019] update --- ...0\244\346\226\255\345\255\220\345\272\217\345\210\227.md" | 2 +- ...3\214\345\214\205\346\200\273\347\273\223\347\257\207.md" | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git "a/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" "b/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" index d64e1fd080..671576f7dc 100644 --- "a/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" @@ -77,7 +77,7 @@ if (s[i - 1] != t[j - 1]),此时相当于t要删除元素,t如果把当前 如果要是定义的dp[i][j]是以下标i为结尾的字符串s和以下标j为结尾的字符串t,初始化就比较麻烦了。 -这里dp[i][0]和dp[0][j]是没有含义的,仅仅是为了给递推公式做前期铺垫,所以初始化为0。 +dp[i][0] 表示以下标i-1为结尾的字符串,与空字符串的相同子序列长度,所以为0. dp[0][j]同理。 **其实这里只初始化dp[i][0]就够了,但一起初始化也方便,所以就一起操作了**,代码如下: diff --git "a/problems/\350\203\214\345\214\205\346\200\273\347\273\223\347\257\207.md" "b/problems/\350\203\214\345\214\205\346\200\273\347\273\223\347\257\207.md" index f80bcf29ae..a7852de370 100644 --- "a/problems/\350\203\214\345\214\205\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/\350\203\214\345\214\205\346\200\273\347\273\223\347\257\207.md" @@ -82,6 +82,7 @@ ## 总结 + **这篇背包问题总结篇是对背包问题的高度概括,讲最关键的两部:递推公式和遍历顺序,结合力扣上的题目全都抽象出来了**。 **而且每一个点,我都给出了对应的力扣题目**。 @@ -90,7 +91,11 @@ 如果把我本篇总结出来的内容都掌握的话,可以说对背包问题理解的就很深刻了,用来对付面试中的背包问题绰绰有余! +背包问题总结: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/背包问题1.jpeg) +这个图是 [代码随想录知识星球](https://programmercarl.com/other/kstar.html) 成员:[海螺人](https://wx.zsxq.com/dweb2/index/footprint/844412858822412),所画结的非常好,分享给大家。 From f6360c701f5e1d251ad69e15c94c05273ff4235c Mon Sep 17 00:00:00 2001 From: youngyangyang04 <826123027@qq.com> Date: Sun, 6 Mar 2022 11:44:39 +0800 Subject: [PATCH 0421/3019] Update --- README.md | 5 ++--- ...3\272\344\272\214\345\217\211\346\240\221.md" | 16 +--------------- 2 files changed, 3 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index c1761f7b02..0bf7fcdf43 100644 --- a/README.md +++ b/README.md @@ -89,8 +89,7 @@ ## 前序 -* [「代码随想录」后序安排](https://mp.weixin.qq.com/s/4eeGJREy6E-v6D7cR_5A4g) -* [「代码随想录」学习社区](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) +* [「代码随想录」学习社区](https://programmercarl.com/other/kstar.html) * 编程语言 @@ -124,7 +123,7 @@ * 算法性能分析 * [关于时间复杂度,你不知道的都在这里!](./problems/前序/关于时间复杂度,你不知道的都在这里!.md) - * [$O(n)$的算法居然超时了,此时的n究竟是多大?](./problems/前序/On的算法居然超时了,此时的n究竟是多大?.md) + * [O(n)的算法居然超时了,此时的n究竟是多大?](./problems/前序/On的算法居然超时了,此时的n究竟是多大?.md) * [通过一道面试题目,讲一讲递归算法的时间复杂度!](./problems/前序/通过一道面试题目,讲一讲递归算法的时间复杂度!.md) * [本周小结!(算法性能分析系列一)](./problems/周总结/20201210复杂度分析周末总结.md) * [关于空间复杂度,可能有几个疑问?](./problems/前序/关于空间复杂度,可能有几个疑问?.md) diff --git "a/problems/\345\211\215\345\272\217/ACM\346\250\241\345\274\217\345\246\202\344\275\225\346\236\204\345\273\272\344\272\214\345\217\211\346\240\221.md" "b/problems/\345\211\215\345\272\217/ACM\346\250\241\345\274\217\345\246\202\344\275\225\346\236\204\345\273\272\344\272\214\345\217\211\346\240\221.md" index fc7a1823bf..28c4b6f7ae 100644 --- "a/problems/\345\211\215\345\272\217/ACM\346\250\241\345\274\217\345\246\202\344\275\225\346\236\204\345\273\272\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/\345\211\215\345\272\217/ACM\346\250\241\345\274\217\345\246\202\344\275\225\346\236\204\345\273\272\344\272\214\345\217\211\346\240\221.md" @@ -45,21 +45,7 @@ ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210914223147.png) -那么此时大家是不是应该知道了,数组如何转化成 二叉树了。**如果父节点的数组下标是i,那么它的左孩子下标就是i * 2 + 1,右孩子下标就是 i * 2 + 2**。计算过程为: - -如果父节点在第$k$层,第$m,m \in [0,2^k]$个节点,则其左孩子所在的位置必然为$k+1$层,第$2*(m-1)+1$个节点。 - -- 计算父节点在数组中的索引: - $$ - index_{father}=(\sum_{i=0}^{i=k-1}2^i)+m-1=2^k-1+m-1 - $$ - -- 计算左子节点在数组的索引: - $$ - index_{left}=(\sum_{i=0}^{i=k}2^i)+2*m-1-1=2^{k+1}+2m-3 - $$ - -- 故左孩子的下表为$index_{left}=index_{father}\times2+1$,同理可得到右子孩子的索引关系。也可以直接在左子孩子的基础上`+1`。 +那么此时大家是不是应该知道了,数组如何转化成 二叉树了。**如果父节点的数组下标是i,那么它的左孩子下标就是i * 2 + 1,右孩子下标就是 i * 2 + 2**。 那么这里又有同学疑惑了,这些我都懂了,但我还是不知道 应该 怎么构造。 From d285d3d6b812a607bc31501a73a50a63222398d3 Mon Sep 17 00:00:00 2001 From: Younglesszzz <61218410+Younglesszzz@users.noreply.github.com> Date: Sun, 6 Mar 2022 20:54:25 +0800 Subject: [PATCH 0422/3019] =?UTF-8?q?=E6=9B=B4=E6=94=B9=E4=BA=86=E5=9B=9E?= =?UTF-8?q?=E6=BA=AF+=E8=AE=B0=E5=BF=86=E7=9A=84=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 经过提交验证,其实memo[startIndex] = 1的这个逻辑根本没有用到,因为如果返回true,那么会如同dfs一样直接返回,不会再进行下一步的backtracking搜索,本题的记忆法核心是令memo[startIndex]置为-1,来避免从相同的startIndex开始拆分,导致程序进行大量重复运算,这应该也是本题剪枝方法的核心。 --- ...25\350\257\215\346\213\206\345\210\206.md" | 38 ++++++++++--------- 1 file changed, 21 insertions(+), 17 deletions(-) diff --git "a/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" "b/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" index 1653a81a14..a54b849af0 100644 --- "a/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" +++ "b/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" @@ -251,30 +251,34 @@ class Solution { // 回溯法+记忆化 class Solution { + private Set set; + private int[] memo; public boolean wordBreak(String s, List wordDict) { - Set wordDictSet = new HashSet(wordDict); - int[] memory = new int[s.length()]; - return backTrack(s, wordDictSet, 0, memory); + memo = new int[s.length()]; + set = new HashSet<>(wordDict); + return backtracking(s, 0); } - - public boolean backTrack(String s, Set wordDictSet, int startIndex, int[] memory) { - // 结束条件 - if (startIndex >= s.length()) { + + public boolean backtracking(String s, int startIndex) { + // System.out.println(startIndex); + if (startIndex == s.length()) { return true; } - if (memory[startIndex] != 0) { - // 此处认为:memory[i] = 1 表示可以拼出i 及以后的字符子串, memory[i] = -1 表示不能 - return memory[startIndex] == 1 ? true : false; + if (memo[startIndex] == -1) { + return false; } - for (int i = startIndex; i < s.length(); ++i) { - // 处理 递归 回溯 循环不变量:[startIndex, i + 1) - String word = s.substring(startIndex, i + 1); - if (wordDictSet.contains(word) && backTrack(s, wordDictSet, i + 1, memory)) { - memory[startIndex] = 1; - return true; + + for (int i = startIndex; i < s.length(); i++) { + String sub = s.substring(startIndex, i + 1); + // 拆分出来的单词无法匹配 + if (!set.contains(sub)) { + continue; } + boolean res = backtracking(s, i + 1); + if (res) return true; } - memory[startIndex] = -1; + // 这里是关键,找遍了startIndex~s.length()也没能完全匹配,标记从startIndex开始不能找到 + memo[startIndex] = -1; return false; } } From 6e3f394893c39edae8864fffc71eee986e81361f Mon Sep 17 00:00:00 2001 From: Camille0512 Date: Mon, 7 Mar 2022 00:33:30 +0800 Subject: [PATCH 0423/3019] Add level order traversal --- ...60\344\272\214\345\217\211\346\240\221.md" | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git "a/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" "b/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" index e4e232c884..0007b4d44c 100644 --- "a/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" @@ -437,6 +437,41 @@ class Solution: return True ``` +层序遍历 + +```python +class Solution: + def isSymmetric(self, root: TreeNode) -> bool: + if not root: return True + que, cnt = [[root.left, root.right]], 1 + while que: + nodes, tmp, sign = que.pop(), [], False + for node in nodes: + if not node: + tmp.append(None) + tmp.append(None) + else: + if node.left: + tmp.append(node.left) + sign = True + else: + tmp.append(None) + if node.right: + tmp.append(node.right) + sign = True + else: + tmp.append(None) + p1, p2 = 0, len(nodes) - 1 + while p1 < p2: + if (not nodes[p1] and nodes[p2]) or (nodes[p1] and not nodes[p2]): return False + elif nodes[p1] and nodes[p2] and nodes[p1].val != nodes[p2].val: return False + p1 += 1 + p2 -= 1 + if sign: que.append(tmp) + cnt += 1 + return True +``` + ## Go ```go From 94bf8916eef21cd40b2eb7b04cf67b2bf32ed6f6 Mon Sep 17 00:00:00 2001 From: Aaron-Lin-74 <84072071+Aaron-Lin-74@users.noreply.github.com> Date: Mon, 7 Mar 2022 10:15:06 +1100 Subject: [PATCH 0424/3019] =?UTF-8?q?Update=201002.=E6=9F=A5=E6=89=BE?= =?UTF-8?q?=E5=B8=B8=E7=94=A8=E5=AD=97=E7=AC=A6.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add TypeScript solution. --- ...70\347\224\250\345\255\227\347\254\246.md" | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git "a/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md" "b/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md" index 7c5566d333..efad1e6a95 100644 --- "a/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md" +++ "b/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md" @@ -253,6 +253,41 @@ var commonChars = function (words) { return res }; ``` + +TypeScript +```ts +function commonChars(words: string[]): string[] { + let result: string[] = []; + if (words.length === 0) return result; + const size: number = 26; + const hash: number[] = new Array(size).fill(0); + const otherHash: number[] = new Array(size).fill(0); + let pivot: number = 'a'.charCodeAt(0); + // First word + for (let character of words[0]) { + hash[character.charCodeAt(0) - pivot]++; + } + // Other words + for (let i = 1; i < words.length; i++) { + for (let character of words[i]) { + otherHash[character.charCodeAt(0) - pivot]++; + } + // Update the first hash with min + for (let j = 0; j < size; j++) { + hash[j] = Math.min(hash[j], otherHash[j]); + } + // Reset otherHash + otherHash.fill(0); + } + // Construct the result + hash.forEach((element, index) => { + while (element-- > 0) { + result.push(String.fromCharCode(index + pivot)); + } + }); + return result; +} +``` GO ```golang func commonChars(words []string) []string { From b79f3e0fb75ceefdc7b7db1b9f60fd53e3c3fee0 Mon Sep 17 00:00:00 2001 From: wutianjue Date: Mon, 7 Mar 2022 14:38:03 +0800 Subject: [PATCH 0425/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=AF=8F=E4=B8=AA?= =?UTF-8?q?=E6=A0=91=E8=A1=8C=E4=B8=AD=E6=89=BE=E6=9C=80=E5=A4=A7=E5=80=BC?= =?UTF-8?q?Java=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...02\345\272\217\351\201\215\345\216\206.md" | 34 +++++++++---------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" index 7448584854..42380b1533 100644 --- "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" +++ "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" @@ -1300,23 +1300,23 @@ java代码: ```java class Solution { public List largestValues(TreeNode root) { - List retVal = new ArrayList(); - Queue tmpQueue = new LinkedList(); - if (root != null) tmpQueue.add(root); - - while (tmpQueue.size() != 0){ - int size = tmpQueue.size(); - List lvlVals = new ArrayList(); - for (int index = 0; index < size; index++){ - TreeNode node = tmpQueue.poll(); - lvlVals.add(node.val); - if (node.left != null) tmpQueue.add(node.left); - if (node.right != null) tmpQueue.add(node.right); - } - retVal.add(Collections.max(lvlVals)); - } - - return retVal; + if(root == null){ + return Collections.emptyList(); + } + List result = new ArrayList(); + Queue queue = new LinkedList(); + queue.offer(root); + while(!queue.isEmpty()){ + int max = Integer.MIN_VALUE; + for(int i = queue.size(); i > 0; i--){ + TreeNode node = queue.poll(); + max = Math.max(max, node.val); + if(node.left != null) queue.offer(node.left); + if(node.right != null) queue.offer(node.right); + } + result.add(max); + } + return result; } } ``` From a33f315175ff76061cbafc2b53a309f75db9890f Mon Sep 17 00:00:00 2001 From: tlylt Date: Mon, 7 Mar 2022 15:26:18 +0800 Subject: [PATCH 0426/3019] Fix spelling error --- ...347\255\211\345\222\214\345\255\220\351\233\206.md" | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git "a/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" "b/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" index 9da1f8d5d3..a4e780ab1b 100644 --- "a/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" +++ "b/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" @@ -253,14 +253,14 @@ Python: ```python class Solution: def canPartition(self, nums: List[int]) -> bool: - taraget = sum(nums) - if taraget % 2 == 1: return False - taraget //= 2 + target = sum(nums) + if target % 2 == 1: return False + target //= 2 dp = [0] * 10001 for i in range(len(nums)): - for j in range(taraget, nums[i] - 1, -1): + for j in range(target, nums[i] - 1, -1): dp[j] = max(dp[j], dp[j - nums[i]] + nums[i]) - return taraget == dp[taraget] + return target == dp[target] ``` Go: ```go From 5a848b76c184a447bdc96d8afe40071bbf7f9cd0 Mon Sep 17 00:00:00 2001 From: youngyangyang04 <826123027@qq.com> Date: Wed, 9 Mar 2022 11:22:51 +0800 Subject: [PATCH 0427/3019] Update --- .../0127.\345\215\225\350\257\215\346\216\245\351\276\231.md" | 1 - ...\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git "a/problems/0127.\345\215\225\350\257\215\346\216\245\351\276\231.md" "b/problems/0127.\345\215\225\350\257\215\346\216\245\351\276\231.md" index fb403a5bdb..407596c0d4 100644 --- "a/problems/0127.\345\215\225\350\257\215\346\216\245\351\276\231.md" +++ "b/problems/0127.\345\215\225\350\257\215\346\216\245\351\276\231.md" @@ -9,7 +9,6 @@ [力扣题目链接](https://leetcode-cn.com/problems/word-ladder/) - 字典 wordList 中从单词 beginWord 和 endWord 的 转换序列 是一个按下述规格形成的序列: * 序列中第一个单词是 beginWord 。 * 序列中最后一个单词是 endWord 。 diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" index 62e3b19a97..9c151e3205 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -33,7 +33,7 @@ 什么是完全二叉树? -完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2^h -1  个节点。 +完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2^(h-1)  个节点。 **大家要自己看完全二叉树的定义,很多同学对完全二叉树其实不是真正的懂了。** From ea31f6e70c277b527f90fce96dacb59a660f8956 Mon Sep 17 00:00:00 2001 From: berserk-112 <40333359+berserk-112@users.noreply.github.com> Date: Wed, 9 Mar 2022 12:05:30 +0800 Subject: [PATCH 0428/3019] =?UTF-8?q?Update=200309.=E6=9C=80=E4=BD=B3?= =?UTF-8?q?=E4=B9=B0=E5=8D=96=E8=82=A1=E7=A5=A8=E6=97=B6=E6=9C=BA=E5=90=AB?= =?UTF-8?q?=E5=86=B7=E5=86=BB=E6=9C=9F.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加了java版本的另一种解题思路,无需考虑多种状态,还是只考虑持有与未持有两种状态 --- ...53\345\206\267\345\206\273\346\234\237.md" | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git "a/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" "b/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" index 2dc1e87486..53caa46e7a 100644 --- "a/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" +++ "b/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" @@ -205,6 +205,29 @@ class Solution { } } ``` +```java +//另一种解题思路 +class Solution { + public int maxProfit(int[] prices) { + int[][] dp = new int[prices.length + 1][2]; + dp[1][0] = -prices[0]; + + for (int i = 2; i <= prices.length; i++) { + /* + dp[i][0] 第i天未持有股票收益; + dp[i][1] 第i天持有股票收益; + 情况一:第i天是冷静期,不能以dp[i-1][1]购买股票,所以以dp[i - 2][1]买股票,没问题 + 情况二:第i天不是冷静期,理论上应该以dp[i-1][1]购买股票,但是第i天不是冷静期说明,第i-1天没有卖出股票, + 则dp[i-1][1]=dp[i-2][1],所以可以用dp[i-2][1]买股票,没问题 + */ + dp[i][0] = Math.max(dp[i - 1][0], dp[i - 2][1] - prices[i - 1]); + dp[i][1] = Math.max(dp[i - 1][1], dp[i - 1][0] + prices[i - 1]); + } + + return dp[prices.length][1]; + } +} +``` Python: From 6c3c8c7bff1bf90f4a79259c0b7abd2434fd9d72 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Fri, 11 Mar 2022 11:35:14 +0800 Subject: [PATCH 0429/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880701.?= =?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=90=9C=E7=B4=A2=E6=A0=91=E4=B8=AD=E7=9A=84?= =?UTF-8?q?=E6=8F=92=E5=85=A5=E6=93=8D=E4=BD=9C.md=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...22\345\205\245\346\223\215\344\275\234.md" | 72 ++++++++++++++++++- 1 file changed, 69 insertions(+), 3 deletions(-) diff --git "a/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" "b/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" index 5e9fbdfe7e..df6a395444 100644 --- "a/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" +++ "b/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" @@ -280,7 +280,7 @@ class Solution: # 返回更新后的以当前root为根节点的新树 return roo -``` +``` **递归法** - 无返回值 ```python @@ -308,7 +308,7 @@ class Solution: return __traverse(root, val) return root -``` +``` **递归法** - 无返回值 - another easier way ```python @@ -378,7 +378,7 @@ func insertIntoBST(root *TreeNode, val int) *TreeNode { } return root } -``` +``` 迭代法 @@ -520,5 +520,71 @@ var insertIntoBST = function (root, val) { }; ``` +## TypeScript + +> 递归-有返回值 + +```typescript +function insertIntoBST(root: TreeNode | null, val: number): TreeNode | null { + if (root === null) return new TreeNode(val); + if (root.val > val) { + root.left = insertIntoBST(root.left, val); + } else { + root.right = insertIntoBST(root.right, val); + } + return root; +}; +``` + +> 递归-无返回值 + +```typescript +function insertIntoBST(root: TreeNode | null, val: number): TreeNode | null { + if (root === null) return new TreeNode(val); + function recur(root: TreeNode | null, val: number) { + if (root === null) { + if (parentNode.val > val) { + parentNode.left = new TreeNode(val); + } else { + parentNode.right = new TreeNode(val); + } + return; + } + parentNode = root; + if (root.val > val) recur(root.left, val); + if (root.val < val) recur(root.right, val); + } + let parentNode: TreeNode = root; + recur(root, val); + return root; +}; +``` + +> 迭代法 + +```typescript +function insertIntoBST(root: TreeNode | null, val: number): TreeNode | null { + if (root === null) return new TreeNode(val); + let curNode: TreeNode | null = root; + let parentNode: TreeNode = root; + while (curNode !== null) { + parentNode = curNode; + if (curNode.val > val) { + curNode = curNode.left + } else { + curNode = curNode.right; + } + } + if (parentNode.val > val) { + parentNode.left = new TreeNode(val); + } else { + parentNode.right = new TreeNode(val); + } + return root; +}; +``` + + + -----------------------

From 301dd3e13984a2d6de4711bc08417aa3bd2a1e8d Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Sat, 12 Mar 2022 00:15:06 +0800 Subject: [PATCH 0430/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880450.?= =?UTF-8?q?=E5=88=A0=E9=99=A4=E4=BA=8C=E5=8F=89=E6=90=9C=E7=B4=A2=E6=A0=91?= =?UTF-8?q?=E4=B8=AD=E7=9A=84=E8=8A=82=E7=82=B9.md=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...55\347\232\204\350\212\202\347\202\271.md" | 64 +++++++++++++++++++ 1 file changed, 64 insertions(+) diff --git "a/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" "b/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" index 2e33353093..cc29bea4c6 100644 --- "a/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" +++ "b/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" @@ -518,6 +518,70 @@ var deleteNode = function (root, key) { } ``` +## TypeScript + +> 递归法: + +```typescript +function deleteNode(root: TreeNode | null, key: number): TreeNode | null { + if (root === null) return null; + if (root.val === key) { + if (root.left === null && root.right === null) return null; + if (root.left === null) return root.right; + if (root.right === null) return root.left; + let curNode: TreeNode = root.right; + while (curNode.left !== null) { + curNode = curNode.left; + } + curNode.left = root.left; + return root.right; + } + if (root.val > key) root.left = deleteNode(root.left, key); + if (root.val < key) root.right = deleteNode(root.right, key); + return root; +}; +``` + +> 迭代法: + +```typescript +function deleteNode(root: TreeNode | null, key: number): TreeNode | null { + function removeTargetNode(root: TreeNode): TreeNode | null { + if (root.left === null && root.right === null) return null; + if (root.right === null) return root.left; + if (root.left === null) return root.right; + let curNode: TreeNode | null = root.right; + while (curNode.left !== null) { + curNode = curNode.left; + } + curNode.left = root.left; + return root.right; + } + let preNode: TreeNode | null = null, + curNode: TreeNode | null = root; + while (curNode !== null) { + if (curNode.val === key) break; + preNode = curNode; + if (curNode.val > key) { + curNode = curNode.left; + } else { + curNode = curNode.right; + } + } + if (curNode === null) return root; + if (preNode === null) { + // 删除头节点 + return removeTargetNode(curNode); + } + if (preNode.val > key) { + preNode.left = removeTargetNode(curNode); + } else { + preNode.right = removeTargetNode(curNode); + } + return root; +}; +``` + ----------------------- From 4549ca38bfbd438d2505f7925d6051ed146c53b4 Mon Sep 17 00:00:00 2001 From: Epoch <75031971+messenger1th@users.noreply.github.com> Date: Mon, 14 Mar 2022 13:33:40 +0800 Subject: [PATCH 0431/3019] =?UTF-8?q?Update=200151.=E7=BF=BB=E8=BD=AC?= =?UTF-8?q?=E5=AD=97=E7=AC=A6=E4=B8=B2=E9=87=8C=E7=9A=84=E5=8D=95=E8=AF=8D?= =?UTF-8?q?=20=E5=90=8C=E7=90=86CPP=20=E7=89=88=E6=9C=AC2=E7=AE=80?= =?UTF-8?q?=E6=B4=81=E5=AE=9E=E7=8E=B0.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 规范代码,优化留白。 同时添加详细注解, 并给出同理题目练习链接。 --- ...14\347\232\204\345\215\225\350\257\215.md" | 36 ++++++++++--------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git "a/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" "b/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" index 677a8f649f..e7abd1d825 100644 --- "a/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" +++ "b/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" @@ -224,34 +224,36 @@ public: ```CPP //版本二: +//原理同版本1,更简洁实现。 class Solution { public: - void reverseWord(string& s,int start,int end){ //这个函数,Carl哥的要更清晰。 - for(int i=start;i<(end-start)/2+start;++i){ - swap(s[i],s[end-1-i+start]); + void reverse(string& s, int start, int end){ //翻转,区间写法:闭区间 [] + for (int i = start, j = end; i < j; i++, j--) { + swap(s[i], s[j]); } } - void trim(string& s){//去除所有空格并在相邻单词之间添加空格 - int slow = 0; - for(int i=0;i Date: Mon, 14 Mar 2022 18:58:24 +0800 Subject: [PATCH 0432/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880669.?= =?UTF-8?q?=E4=BF=AE=E5=89=AA=E4=BA=8C=E5=8F=89=E6=90=9C=E7=B4=A2=E6=A0=91?= =?UTF-8?q?.md=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...11\346\220\234\347\264\242\346\240\221.md" | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git "a/problems/0669.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0669.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" index 15f6a04093..385b226863 100644 --- "a/problems/0669.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" +++ "b/problems/0669.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" @@ -405,6 +405,56 @@ var trimBST = function (root,low,high) { } ``` +## TypeScript + +> 递归法 + +```typescript +function trimBST(root: TreeNode | null, low: number, high: number): TreeNode | null { + if (root === null) return null; + if (root.val < low) { + return trimBST(root.right, low, high); + } + if (root.val > high) { + return trimBST(root.left, low, high); + } + root.left = trimBST(root.left, low, high); + root.right = trimBST(root.right, low, high); + return root; +}; +``` + +> 迭代法 + +```typescript +function trimBST(root: TreeNode | null, low: number, high: number): TreeNode | null { + while (root !== null && (root.val < low || root.val > high)) { + if (root.val < low) { + root = root.right; + } else if (root.val > high) { + root = root.left; + } + } + let curNode: TreeNode | null = root; + while (curNode !== null) { + while (curNode.left !== null && curNode.left.val < low) { + curNode.left = curNode.left.right; + } + curNode = curNode.left; + } + curNode = root; + while (curNode !== null) { + while (curNode.right !== null && curNode.right.val > high) { + curNode.right = curNode.right.left; + } + curNode = curNode.right; + } + return root; +}; +``` + + + -----------------------
From e03a51264b584d83838a4847983b40ee1b7d7ddb Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Tue, 15 Mar 2022 00:08:01 +0800 Subject: [PATCH 0433/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880108.?= =?UTF-8?q?=E5=B0=86=E6=9C=89=E5=BA=8F=E6=95=B0=E7=BB=84=E8=BD=AC=E6=8D=A2?= =?UTF-8?q?=E4=B8=BA=E4=BA=8C=E5=8F=89=E6=90=9C=E7=B4=A2=E6=A0=91.md?= =?UTF-8?q?=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...11\346\220\234\347\264\242\346\240\221.md" | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git "a/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" index 9e008e867e..bd5915fd31 100644 --- "a/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" +++ "b/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" @@ -251,7 +251,7 @@ class Solution { return root; } } -``` +``` 迭代: 左闭右闭 [left,right] ```java @@ -373,7 +373,24 @@ var sortedArrayToBST = function (nums) { }; ``` +## TypeScript + +```typescript +function sortedArrayToBST(nums: number[]): TreeNode | null { + function recur(nums: number[], left: number, right: number): TreeNode | null { + if (left > right) return null; + let mid: number = Math.floor((left + right) / 2); + const root: TreeNode = new TreeNode(nums[mid]); + root.left = recur(nums, left, mid - 1); + root.right = recur(nums, mid + 1, right); + return root; + } + return recur(nums, 0, nums.length - 1); +}; +``` + ## C + 递归 ```c struct TreeNode* traversal(int* nums, int left, int right) { From 56272922060f1ccff4196269dff1091e5315f2ad Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Wed, 16 Mar 2022 22:05:03 +0800 Subject: [PATCH 0434/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880538.?= =?UTF-8?q?=E6=8A=8A=E4=BA=8C=E5=8F=89=E6=90=9C=E7=B4=A2=E6=A0=91=E8=BD=AC?= =?UTF-8?q?=E6=8D=A2=E4=B8=BA=E7=B4=AF=E5=8A=A0=E6=A0=91.md=EF=BC=89?= =?UTF-8?q?=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...72\347\264\257\345\212\240\346\240\221.md" | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git "a/problems/0538.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md" "b/problems/0538.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md" index 1b07b8034f..37eb7d0f2c 100644 --- "a/problems/0538.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md" +++ "b/problems/0538.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md" @@ -312,5 +312,47 @@ struct TreeNode* convertBST(struct TreeNode* root){ } ``` +## TypeScript + +> 递归法 + +```typescript +function convertBST(root: TreeNode | null): TreeNode | null { + let pre: number = 0; + function recur(root: TreeNode | null): void { + if (root === null) return; + recur(root.right); + root.val += pre; + pre = root.val; + recur(root.left); + } + recur(root); + return root; +}; +``` + +> 迭代法 + +```typescript +function convertBST(root: TreeNode | null): TreeNode | null { + const helperStack: TreeNode[] = []; + let curNode: TreeNode | null = root; + let pre: number = 0; + while (curNode !== null || helperStack.length > 0) { + while (curNode !== null) { + helperStack.push(curNode); + curNode = curNode.right; + } + curNode = helperStack.pop()!; + curNode.val += pre; + pre = curNode.val; + curNode = curNode.left; + } + return root; +}; +``` + + + -----------------------
From 1856401654174c3b50185471b9bc2888c04237c0 Mon Sep 17 00:00:00 2001 From: Speed <48878102+speedzjy@users.noreply.github.com> Date: Wed, 16 Mar 2022 22:26:46 +0800 Subject: [PATCH 0435/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200134.=E5=8A=A0?= =?UTF-8?q?=E6=B2=B9=E7=AB=99.md=EF=BC=8C=20=E5=B0=86=E6=9A=B4=E5=8A=9B?= =?UTF-8?q?=E8=A7=A3=E6=B3=95=E4=BB=A3=E7=A0=81=E5=9D=97=E5=90=8E=E7=9A=84?= =?UTF-8?q?=E7=A9=BA=E9=97=B4=E5=A4=8D=E6=9D=82=E5=BA=A6=E8=AF=B4=E6=98=8E?= =?UTF-8?q?=E7=94=B1O(n)=E6=94=B9=E4=B8=BAO(1)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "problems/0134.\345\212\240\346\262\271\347\253\231.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0134.\345\212\240\346\262\271\347\253\231.md" "b/problems/0134.\345\212\240\346\262\271\347\253\231.md" index ca95af6764..1062a91c2d 100644 --- "a/problems/0134.\345\212\240\346\262\271\347\253\231.md" +++ "b/problems/0134.\345\212\240\346\262\271\347\253\231.md" @@ -78,7 +78,7 @@ public: ``` * 时间复杂度:$O(n^2)$ -* 空间复杂度:$O(n)$ +* 空间复杂度:$O(1)$ C++暴力解法在leetcode上提交也可以过。 From e1f3bdd973c88cada2a59dbc28fecbe0b798d246 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Thu, 17 Mar 2022 16:30:06 +0800 Subject: [PATCH 0436/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880077.?= =?UTF-8?q?=E7=BB=84=E5=90=88.md=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typesc?= =?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/0077.\347\273\204\345\220\210.md" | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git "a/problems/0077.\347\273\204\345\220\210.md" "b/problems/0077.\347\273\204\345\220\210.md" index 2bd7a28767..a1403c376b 100644 --- "a/problems/0077.\347\273\204\345\220\210.md" +++ "b/problems/0077.\347\273\204\345\220\210.md" @@ -456,6 +456,27 @@ const combineHelper = (n, k, startIndex) => { } ``` +## TypeScript + +```typescript +function combine(n: number, k: number): number[][] { + let resArr: number[][] = []; + function backTracking(n: number, k: number, startIndex: number, tempArr: number[]): void { + if (tempArr.length === k) { + resArr.push(tempArr.slice()); + return; + } + for (let i = startIndex; i <= n - k + 1 + tempArr.length; i++) { + tempArr.push(i); + backTracking(n, k, i + 1, tempArr); + tempArr.pop(); + } + } + backTracking(n, k, 1, []); + return resArr; +}; +``` + ## Go From a90db6e830474a70dd445a77cef578627374ca5e Mon Sep 17 00:00:00 2001 From: SianXiaoCHN Date: Thu, 17 Mar 2022 13:38:45 -0500 Subject: [PATCH 0437/3019] =?UTF-8?q?0941.=E6=9C=89=E6=95=88=E7=9A=84?= =?UTF-8?q?=E5=B1=B1=E8=84=89=E6=95=B0=E7=BB=84=20python3=20=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E5=8F=8C=E6=8C=87=E9=92=88=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 0941.有效的山脉数组 python3 从原方法更新到双指针方法 --- ...61\350\204\211\346\225\260\347\273\204.md" | 25 +++++++------------ 1 file changed, 9 insertions(+), 16 deletions(-) diff --git "a/problems/0941.\346\234\211\346\225\210\347\232\204\345\261\261\350\204\211\346\225\260\347\273\204.md" "b/problems/0941.\346\234\211\346\225\210\347\232\204\345\261\261\350\204\211\346\225\260\347\273\204.md" index a2444cc145..4b7a978c0e 100644 --- "a/problems/0941.\346\234\211\346\225\210\347\232\204\345\261\261\350\204\211\346\225\260\347\273\204.md" +++ "b/problems/0941.\346\234\211\346\225\210\347\232\204\345\261\261\350\204\211\346\225\260\347\273\204.md" @@ -106,22 +106,15 @@ class Solution { ```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 + left, right = 0, len(arr)-1 + + while left < len(arr)-1 and arr[left+1] > arr[left]: + left += 1 + + while right > 0 and arr[right-1] > arr[right]: + right -= 1 + + return left == right and right != 0 and left != len(arr)-1 ``` From a95b24a2290c72197e9107e38e91e11ffa92ef3d Mon Sep 17 00:00:00 2001 From: SianXiaoCHN Date: Thu, 17 Mar 2022 13:43:03 -0500 Subject: [PATCH 0438/3019] =?UTF-8?q?0225.=E7=94=A8=E9=98=9F=E5=88=97?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E6=A0=88=20python3=20=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 0225.用队列实现栈 python3 更新优化方法(只使用一个队列) --- ...27\345\256\236\347\216\260\346\240\210.md" | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git "a/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" "b/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" index c45917db4d..3457c4b368 100644 --- "a/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" +++ "b/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" @@ -354,6 +354,32 @@ class MyStack: return len(self.queue_in) == 0 ``` +优化,使用一个队列实现 +```python +class MyStack: + + def __init__(self): + self.que = deque() + + def push(self, x: int) -> None: + self.que.append(x) + + def pop(self) -> int: + if self.empty(): + return None + for i in range(len(self.que)-1): + self.que.append(self.que.popleft()) + return self.que.popleft() + + def top(self) -> int: + if self.empty(): + return None + return self.que[-1] + + def empty(self) -> bool: + return not self.que +``` + Go: From c77840639653808f528af05cd90ebef0c160cbf0 Mon Sep 17 00:00:00 2001 From: IcePigZDB Date: Sat, 19 Mar 2022 20:05:04 +0800 Subject: [PATCH 0439/3019] fix some small typo Signed-off-by: IcePigZDB --- ...34\211\346\225\210\347\232\204\346\213\254\345\217\267.md" | 2 +- .../0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" | 2 +- ...52\227\345\217\243\346\234\200\345\244\247\345\200\274.md" | 2 +- ...73\204\345\220\210\346\200\273\345\222\214\342\205\243.md" | 2 +- .../0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" | 4 ++-- ...10\227\347\220\206\350\256\272\345\237\272\347\241\200.md" | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git "a/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" "b/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" index 01fc7b93e8..7bb7f7463a 100644 --- "a/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" +++ "b/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" @@ -125,7 +125,7 @@ public: } }; ``` -技巧性的东西没有固定的学习方法,还是要多看多练,自己总灵活运用了。 +技巧性的东西没有固定的学习方法,还是要多看多练,自己灵活运用了。 ## 其他语言版本 diff --git "a/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" "b/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" index 5db36687a9..f80cf59cfc 100644 --- "a/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" +++ "b/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" @@ -212,7 +212,7 @@ public: }; ``` -如果大家完全理解了本地的递归方法之后,就可以顺便把leetcode上113. 路径总和ii做了。 +如果大家完全理解了本题的递归方法之后,就可以顺便把leetcode上113. 路径总和ii做了。 # 113. 路径总和ii diff --git "a/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" "b/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" index ce215a7e67..f269450f3b 100644 --- "a/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" +++ "b/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" @@ -193,7 +193,7 @@ public: # 扩展 -大家貌似对单调队列 都有一些疑惑,首先要明确的是,题解中单调队列里的pop和push接口,仅适用于本题哈。单调队列不是一成不变的,而是不同场景不同写法,总之要保证队列里单调递减或递增的原则,所以叫做单调队列。 不要以为本地中的单调队列实现就是固定的写法哈。 +大家貌似对单调队列 都有一些疑惑,首先要明确的是,题解中单调队列里的pop和push接口,仅适用于本题哈。单调队列不是一成不变的,而是不同场景不同写法,总之要保证队列里单调递减或递增的原则,所以叫做单调队列。 不要以为本题中的单调队列实现就是固定的写法哈。 大家貌似对deque也有一些疑惑,C++中deque是stack和queue默认的底层实现容器(这个我们之前已经讲过啦),deque是可以两边扩展的,而且deque里元素并不是严格的连续分布的。 diff --git "a/problems/0377.\347\273\204\345\220\210\346\200\273\345\222\214\342\205\243.md" "b/problems/0377.\347\273\204\345\220\210\346\200\273\345\222\214\342\205\243.md" index 940d81b85b..aaf27e6123 100644 --- "a/problems/0377.\347\273\204\345\220\210\346\200\273\345\222\214\342\205\243.md" +++ "b/problems/0377.\347\273\204\345\220\210\346\200\273\345\222\214\342\205\243.md" @@ -127,7 +127,7 @@ public: ``` -C++测试用例有超过两个树相加超过int的数据,所以需要在if里加上dp[i] < INT_MAX - dp[i - num]。 +C++测试用例有两个数相加超过int的数据,所以需要在if里加上dp[i] < INT_MAX - dp[i - num]。 但java就不用考虑这个限制,java里的int也是四个字节吧,也有可能leetcode后台对不同语言的测试数据不一样。 diff --git "a/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" "b/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" index d9928b8f2f..913aec655a 100644 --- "a/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" +++ "b/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" @@ -54,7 +54,7 @@ 当s[i]与s[j]相等时,这就复杂一些了,有如下三种情况 * 情况一:下标i 与 j相同,同一个字符例如a,当然是回文子串 -* 情况二:下标i 与 j相差为1,例如aa,也是文子串 +* 情况二:下标i 与 j相差为1,例如aa,也是回文子串 * 情况三:下标:i 与 j相差大于1的时候,例如cabac,此时s[i]与s[j]已经相同了,我们看i到j区间是不是回文子串就看aba是不是回文就可以了,那么aba的区间就是 i+1 与 j-1区间,这个区间是不是回文就看dp[i + 1][j - 1]是否为true。 以上三种情况分析完了,那么递归公式如下: @@ -178,7 +178,7 @@ public: 动态规划的空间复杂度是偏高的,我们再看一下双指针法。 -首先确定回文串,就是找中心然后想两边扩散看是不是对称的就可以了。 +首先确定回文串,就是找中心然后向两边扩散看是不是对称的就可以了。 **在遍历中心点的时候,要注意中心点有两种情况**。 diff --git "a/problems/\346\240\210\344\270\216\351\230\237\345\210\227\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\346\240\210\344\270\216\351\230\237\345\210\227\347\220\206\350\256\272\345\237\272\347\241\200.md" index 44fcbdd524..8c76614f7c 100644 --- "a/problems/\346\240\210\344\270\216\351\230\237\345\210\227\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\346\240\210\344\270\216\351\230\237\345\210\227\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -15,7 +15,7 @@ 那么我这里在列出四个关于栈的问题,大家可以思考一下。以下是以C++为例,相信使用其他编程语言的同学也对应思考一下,自己使用的编程语言里栈和队列是什么样的。 1. C++中stack 是容器么? -2. 我们使用的stack是属于那个版本的STL? +2. 我们使用的stack是属于哪个版本的STL? 3. 我们使用的STL中stack是如何实现的? 4. stack 提供迭代器来遍历stack空间么? From 907204559fb56504a0035d70cbe478996152e8d3 Mon Sep 17 00:00:00 2001 From: IcePigZDB Date: Sat, 19 Mar 2022 20:15:24 +0800 Subject: [PATCH 0440/3019] =?UTF-8?q?=E5=AD=90=E9=9B=86II=20cpp=20?= =?UTF-8?q?=E4=BB=A3=E7=A0=81formate?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: IcePigZDB --- "problems/0090.\345\255\220\351\233\206II.md" | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git "a/problems/0090.\345\255\220\351\233\206II.md" "b/problems/0090.\345\255\220\351\233\206II.md" index 16bd1f2c19..d08707b4f6 100644 --- "a/problems/0090.\345\255\220\351\233\206II.md" +++ "b/problems/0090.\345\255\220\351\233\206II.md" @@ -87,7 +87,7 @@ class Solution { private: vector> result; vector path; - void backtracking(vector& nums, int startIndex, vector& used) { + void backtracking(vector& nums, int startIndex) { result.push_back(path); unordered_set uset; for (int i = startIndex; i < nums.size(); i++) { @@ -96,7 +96,7 @@ private: } uset.insert(nums[i]); path.push_back(nums[i]); - backtracking(nums, i + 1, used); + backtracking(nums, i + 1); path.pop_back(); } } @@ -105,9 +105,8 @@ public: vector> subsetsWithDup(vector& nums) { result.clear(); path.clear(); - vector used(nums.size(), false); sort(nums.begin(), nums.end()); // 去重需要排序 - backtracking(nums, 0, used); + backtracking(nums, 0); return result; } }; From 493d6ba16a1a2359ebfe110c338818de74632476 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Sun, 20 Mar 2022 20:54:32 +0800 Subject: [PATCH 0441/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880077.?= =?UTF-8?q?=E7=BB=84=E5=90=88=E4=BC=98=E5=8C=96.md=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- node_modules/.yarn-integrity | 10 +++++++++ ...04\345\220\210\344\274\230\345\214\226.md" | 22 +++++++++++++++++++ yarn.lock | 4 ++++ 3 files changed, 36 insertions(+) create mode 100644 node_modules/.yarn-integrity create mode 100644 yarn.lock diff --git a/node_modules/.yarn-integrity b/node_modules/.yarn-integrity new file mode 100644 index 0000000000..29e4357c98 --- /dev/null +++ b/node_modules/.yarn-integrity @@ -0,0 +1,10 @@ +{ + "systemParams": "win32-x64-83", + "modulesFolders": [], + "flags": [], + "linkedModules": [], + "topLevelPatterns": [], + "lockfileEntries": {}, + "files": [], + "artifacts": {} +} \ No newline at end of file diff --git "a/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" "b/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" index 81b4304cee..94608ec18f 100644 --- "a/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" +++ "b/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" @@ -240,7 +240,29 @@ var combine = function(n, k) { }; ``` +TypeScript: + +```typescript +function combine(n: number, k: number): number[][] { + let resArr: number[][] = []; + function backTracking(n: number, k: number, startIndex: number, tempArr: number[]): void { + if (tempArr.length === k) { + resArr.push(tempArr.slice()); + return; + } + for (let i = startIndex; i <= n - k + 1 + tempArr.length; i++) { + tempArr.push(i); + backTracking(n, k, i + 1, tempArr); + tempArr.pop(); + } + } + backTracking(n, k, 1, []); + return resArr; +}; +``` + C: + ```c int* path; int pathTop; diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000000..3ff608aed0 --- /dev/null +++ b/yarn.lock @@ -0,0 +1,4 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + From 8ad12370b69a4b37f3baffe8e1102e82c394ac4a Mon Sep 17 00:00:00 2001 From: "Neil.Liu" <88214924@qq.com> Date: Sun, 20 Mar 2022 22:32:34 +0800 Subject: [PATCH 0442/3019] =?UTF-8?q?Update=200332.=E9=87=8D=E6=96=B0?= =?UTF-8?q?=E5=AE=89=E6=8E=92=E8=A1=8C=E7=A8=8B.md=20Go=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...11\346\216\222\350\241\214\347\250\213.md" | 58 +++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git "a/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" "b/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" index 01f81c4dc6..041a7f031e 100644 --- "a/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" +++ "b/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" @@ -342,6 +342,64 @@ class Solution: return path ``` +### Go +```go +type pair struct { + target string + visited bool +} +type pairs []*pair + +func (p pairs) Len() int { + return len(p) +} +func (p pairs) Swap(i, j int) { + p[i], p[j] = p[j], p[i] +} +func (p pairs) Less(i, j int) bool { + return p[i].target < p[j].target +} + +func findItinerary(tickets [][]string) []string { + result := []string{} + // map[出发机场] pair{目的地,是否被访问过} + targets := make(map[string]pairs) + for _, ticket := range tickets { + if targets[ticket[0]] == nil { + targets[ticket[0]] = make(pairs, 0) + } + targets[ticket[0]] = append(targets[ticket[0]], &pair{target: ticket[1], visited: false}) + } + for k, _ := range targets { + sort.Sort(targets[k]) + } + result = append(result, "JFK") + var backtracking func() bool + backtracking = func() bool { + if len(tickets)+1 == len(result) { + return true + } + // 取出起飞航班对应的目的地 + for _, pair := range targets[result[len(result)-1]] { + if pair.visited == false { + result = append(result, pair.target) + pair.visited = true + if backtracking() { + return true + } + result = result[:len(result)-1] + pair.visited = false + } + } + return false + } + + backtracking() + + return result +} +``` + ### C语言 ```C From 21f6068e2e3fd0c3d40971df3c0ea3b35a9ec248 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Sun, 20 Mar 2022 23:24:57 +0800 Subject: [PATCH 0443/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880216.?= =?UTF-8?q?=E7=BB=84=E5=90=88=E6=80=BB=E5=92=8CIII.md=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...345\220\210\346\200\273\345\222\214III.md" | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git "a/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" "b/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" index 0bb4219265..32b1347e56 100644 --- "a/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" +++ "b/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" @@ -396,6 +396,30 @@ var combinationSum3 = function(k, n) { }; ``` +## TypeScript + +```typescript +function combinationSum3(k: number, n: number): number[][] { + const resArr: number[][] = []; + function backTracking(k: number, n: number, sum: number, startIndex: number, tempArr: number[]): void { + if (sum > n) return; + if (tempArr.length === k) { + if (sum === n) { + resArr.push(tempArr.slice()); + } + return; + } + for (let i = startIndex; i <= 9 - (k - tempArr.length) + 1; i++) { + tempArr.push(i); + backTracking(k, n, sum + i, i + 1, tempArr); + tempArr.pop(); + } + } + backTracking(k, n, 0, 1, []); + return resArr; +}; +``` + ## C ```c From 82feee15424aa110e5d30b333ea3c0a83245b3c2 Mon Sep 17 00:00:00 2001 From: dcj_hp <294487055@qq.com> Date: Mon, 21 Mar 2022 12:04:13 +0800 Subject: [PATCH 0444/3019] =?UTF-8?q?=E4=BF=AE=E6=94=B9=20647.=E5=9B=9E?= =?UTF-8?q?=E6=96=87=E5=AD=90=E4=B8=B2=20=E6=96=87=E5=AD=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" "b/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" index d9928b8f2f..739146f12a 100644 --- "a/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" +++ "b/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" @@ -54,7 +54,7 @@ 当s[i]与s[j]相等时,这就复杂一些了,有如下三种情况 * 情况一:下标i 与 j相同,同一个字符例如a,当然是回文子串 -* 情况二:下标i 与 j相差为1,例如aa,也是文子串 +* 情况二:下标i 与 j相差为1,例如aa,也是回文子串 * 情况三:下标:i 与 j相差大于1的时候,例如cabac,此时s[i]与s[j]已经相同了,我们看i到j区间是不是回文子串就看aba是不是回文就可以了,那么aba的区间就是 i+1 与 j-1区间,这个区间是不是回文就看dp[i + 1][j - 1]是否为true。 以上三种情况分析完了,那么递归公式如下: From c408f7babc6f944cde16e51916c2741c5ab8a43e Mon Sep 17 00:00:00 2001 From: youngyangyang04 <826123027@qq.com> Date: Tue, 22 Mar 2022 09:29:32 +0800 Subject: [PATCH 0445/3019] Update --- ...2.\346\216\245\351\233\250\346\260\264.md" | 10 +++++----- "problems/0077.\347\273\204\345\220\210.md" | 4 ++-- ...345\256\266\345\212\253\350\210\215III.md" | 10 +++++----- ...11\345\222\214\345\255\220\351\233\206.md" | 10 ++++------ ...72\344\272\214\345\217\211\346\240\221.md" | 9 --------- ...50\350\277\231\351\207\214\344\272\206.md" | 9 +-------- ...57\345\244\232\345\244\247\357\274\237.md" | 18 ++++++----------- ...54\345\217\270\346\200\273\347\273\223.md" | 8 -------- ...CM\346\250\241\345\274\217\357\274\237.md" | 8 +------- ...43\347\240\201\351\243\216\346\240\274.md" | 17 +--------------- ...50\350\277\231\351\207\214\357\274\201.md" | 8 +------- ...52\347\226\221\351\227\256\357\274\237.md" | 8 -------- ...10\350\200\227\344\271\210\357\274\237.md" | 9 +-------- ...21\350\277\220\350\241\214\357\274\237.md" | 8 +------- ...54\345\217\270\346\200\273\347\273\223.md" | 11 ++-------- ...54\345\217\270\346\200\273\347\273\223.md" | 10 ++-------- ...54\345\217\270\346\200\273\347\273\223.md" | 12 ++--------- ...54\345\217\270\346\200\273\347\273\223.md" | 11 ++-------- ...54\345\217\270\346\200\273\347\273\223.md" | 10 ++-------- ...07\346\241\243\345\267\245\345\205\267.md" | 10 ++-------- ...17\345\221\230\347\256\200\345\216\206.md" | 13 +----------- ...02\345\272\246\345\210\206\346\236\220.md" | 8 -------- ...15\346\235\202\345\272\246\357\274\201.md" | 10 ---------- ...36\346\272\257\346\200\273\347\273\223.md" | 20 +++++++++---------- ...76\351\235\236\347\247\221\347\217\255.md" | 4 ++-- ...50\346\204\217\344\272\213\351\241\271.md" | 6 +++--- ...4-\345\206\263\350\265\233\345\234\210.md" | 4 ++-- ...25\345\216\273\344\275\225\344\273\216.md" | 4 ++-- ...er\347\232\204\351\200\211\346\213\251.md" | 4 ++-- ...67\347\232\204\344\270\203\345\244\225.md" | 4 ++-- ...01\346\200\216\344\271\210\345\212\236.md" | 2 +- ...76\345\274\203\347\247\213\346\213\233.md" | 8 ++++---- ...45\350\277\231\344\271\210\345\206\231.md" | 4 ++-- ...33\350\267\237\344\270\215\344\270\212.md" | 4 ++-- ...66\347\232\204\347\226\221\351\227\256.md" | 4 ++-- ...00\344\272\233\345\273\272\350\256\256.md" | 4 ++-- ...00\344\272\233\351\227\256\351\242\230.md" | 4 ++-- ...\347\240\224VS\345\267\245\344\275\234.md" | 4 ++-- ...50\345\272\223\345\207\275\346\225\260.md" | 4 ++-- ...01\345\210\267\344\270\244\351\201\215.md" | 4 ++-- ...14\350\256\241\347\256\227\346\234\272.md" | 4 ++-- ...57\346\234\200\345\245\275\347\232\204.md" | 6 +++--- ...22\345\261\212\347\247\213\346\213\233.md" | 4 ++-- ...71\345\205\273\344\275\223\347\263\273.md" | 4 ++-- ...46\344\270\200\350\210\254\351\273\221.md" | 4 ++-- ...13\346\213\233\345\244\215\344\271\240.md" | 4 ++-- .../\345\256\242\344\270\211\346\266\210.md" | 6 +++--- ...00\346\234\257\346\226\271\345\220\221.md" | 4 ++-- ...17\345\274\200\345\247\213\344\272\206.md" | 4 ++-- ...4\276\235\347\204\266\346\262\241offer.md" | 12 +++++------ ...13\346\213\233\345\274\200\345\245\226.md" | 4 ++-- ...3\346\213\233\346\200\273\347\273\2231.md" | 4 ++-- ...3\346\213\233\346\200\273\347\273\2232.md" | 4 ++-- ...3\346\213\233\346\200\273\347\273\2233.md" | 4 ++-- ...04\344\270\212\345\215\212\345\234\272.md" | 4 ++-- ...53\344\270\216\347\204\246\350\231\221.md" | 4 ++-- ...15\344\270\215\351\207\215\350\246\201.md" | 4 ++-- ...15\350\246\201\350\200\203\347\240\224.md" | 4 ++-- .../\351\200\274\347\255\276.md" | 2 +- ...13\346\213\233\346\200\273\347\273\223.md" | 4 ++-- ...55\347\232\204\345\233\260\346\211\260.md" | 4 ++-- ...43\346\200\247\351\227\256\351\242\230.md" | 4 ++-- 62 files changed, 134 insertions(+), 283 deletions(-) diff --git "a/problems/0042.\346\216\245\351\233\250\346\260\264.md" "b/problems/0042.\346\216\245\351\233\250\346\260\264.md" index 55f80a5407..75152eb7ad 100644 --- "a/problems/0042.\346\216\245\351\233\250\346\260\264.md" +++ "b/problems/0042.\346\216\245\351\233\250\346\260\264.md" @@ -365,7 +365,7 @@ public: ## 其他语言版本 -Java: +### Java: 双指针法 ```java @@ -468,7 +468,7 @@ class Solution { } ``` -Python: +### Python: 双指针法 ```python3 @@ -575,7 +575,7 @@ class Solution: ``` -Go: +### Go ```go func trap(height []int) int { @@ -642,7 +642,7 @@ func min(a,b int)int{ -JavaScript: +### JavaScript: ```javascript //双指针 @@ -744,7 +744,7 @@ var trap = function(height) { }; ``` -C: +### C: 一种更简便的双指针方法: diff --git "a/problems/0077.\347\273\204\345\220\210.md" "b/problems/0077.\347\273\204\345\220\210.md" index 2bd7a28767..e582daf6bc 100644 --- "a/problems/0077.\347\273\204\345\220\210.md" +++ "b/problems/0077.\347\273\204\345\220\210.md" @@ -423,8 +423,8 @@ class Solution: if len(path) == k: res.append(path[:]) return - for i in range(startIndex,n - (k - len(path)) + 2): #优化的地方 - path.append(i) #处理节点 + for i in range(startIndex,n-(k-len(path))+2): #优化的地方 + path.append(i) #处理节点 backtrack(n,k,i+1) #递归 path.pop() #回溯,撤销处理的节点 backtrack(n,k,1) diff --git "a/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" "b/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" index ecd31d1b01..a4d8f6b280 100644 --- "a/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" +++ "b/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" @@ -216,7 +216,7 @@ public: ## 其他语言版本 -Java: +### Java ```Java class Solution { // 1.递归去偷,超时 @@ -284,7 +284,7 @@ class Solution { } ``` -Python: +### Python > 暴力递归 @@ -367,7 +367,7 @@ class Solution: return (val1, val2) ``` -Go: +### Go 动态规划 @@ -402,7 +402,7 @@ func robTree(cur *TreeNode) []int { } ``` -JavaScript: +### JavaScript > 动态规划 @@ -429,7 +429,7 @@ const rob = root => { }; ``` -Go: +### Go ```go // 打家劫舍Ⅲ 动态规划 // 时间复杂度O(n) 空间复杂度O(logn) diff --git "a/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" "b/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" index 9da1f8d5d3..4b26d1880c 100644 --- "a/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" +++ "b/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" @@ -127,9 +127,9 @@ for(int i = 0; i < nums.size(); i++) { 5. 举例推导dp数组 -dp[i]的数值一定是小于等于i的。 +dp[j]的数值一定是小于等于j的。 -**如果dp[i] == i 说明,集合中的子集总和正好可以凑成总和i,理解这一点很重要。** +**如果dp[j] == j 说明,集合中的子集总和正好可以凑成总和j,理解这一点很重要。** 用例1,输入[1,5,11,5] 为例,如图: @@ -168,8 +168,8 @@ public: }; ``` -* 时间复杂度:$O(n^2)$ -* 空间复杂度:$O(n)$,虽然dp数组大小为一个常数,但是大常数 +* 时间复杂度:O(n^2) +* 空间复杂度:O(n),虽然dp数组大小为一个常数,但是大常数 ## 总结 @@ -180,8 +180,6 @@ public: 看代码的话,就可以发现,基本就是按照01背包的写法来的。 - - ## 其他语言版本 diff --git "a/problems/\345\211\215\345\272\217/ACM\346\250\241\345\274\217\345\246\202\344\275\225\346\236\204\345\273\272\344\272\214\345\217\211\346\240\221.md" "b/problems/\345\211\215\345\272\217/ACM\346\250\241\345\274\217\345\246\202\344\275\225\346\236\204\345\273\272\344\272\214\345\217\211\346\240\221.md" index 28c4b6f7ae..bd2e978046 100644 --- "a/problems/\345\211\215\345\272\217/ACM\346\250\241\345\274\217\345\246\202\344\275\225\346\236\204\345\273\272\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/\345\211\215\345\272\217/ACM\346\250\241\345\274\217\345\246\202\344\275\225\346\236\204\345\273\272\344\272\214\345\217\211\346\240\221.md" @@ -1,13 +1,4 @@ -

- - - - -

-

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

- - # 力扣上如何自己构造二叉树输入用例? 经常有录友问,二叉树的题目中输入用例在ACM模式下应该怎么构造呢? diff --git "a/problems/\345\211\215\345\272\217/BAT\347\272\247\345\210\253\346\212\200\346\234\257\351\235\242\350\257\225\346\265\201\347\250\213\345\222\214\346\263\250\346\204\217\344\272\213\351\241\271\351\203\275\345\234\250\350\277\231\351\207\214\344\272\206.md" "b/problems/\345\211\215\345\272\217/BAT\347\272\247\345\210\253\346\212\200\346\234\257\351\235\242\350\257\225\346\265\201\347\250\213\345\222\214\346\263\250\346\204\217\344\272\213\351\241\271\351\203\275\345\234\250\350\277\231\351\207\214\344\272\206.md" index 6678860d65..27940f1bd5 100644 --- "a/problems/\345\211\215\345\272\217/BAT\347\272\247\345\210\253\346\212\200\346\234\257\351\235\242\350\257\225\346\265\201\347\250\213\345\222\214\346\263\250\346\204\217\344\272\213\351\241\271\351\203\275\345\234\250\350\277\231\351\207\214\344\272\206.md" +++ "b/problems/\345\211\215\345\272\217/BAT\347\272\247\345\210\253\346\212\200\346\234\257\351\235\242\350\257\225\346\265\201\347\250\213\345\222\214\346\263\250\346\204\217\344\272\213\351\241\271\351\203\275\345\234\250\350\277\231\351\207\214\344\272\206.md" @@ -1,12 +1,5 @@ -

- - - - -

-

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

- +# 大厂技术面试流程和注意事项 大型互联网企业一般通过几轮技术面试来考察大家的各项能力,一般流程如下: diff --git "a/problems/\345\211\215\345\272\217/On\347\232\204\347\256\227\346\263\225\345\261\205\347\204\266\350\266\205\346\227\266\344\272\206\357\274\214\346\255\244\346\227\266\347\232\204n\347\251\266\347\253\237\346\230\257\345\244\232\345\244\247\357\274\237.md" "b/problems/\345\211\215\345\272\217/On\347\232\204\347\256\227\346\263\225\345\261\205\347\204\266\350\266\205\346\227\266\344\272\206\357\274\214\346\255\244\346\227\266\347\232\204n\347\251\266\347\253\237\346\230\257\345\244\232\345\244\247\357\274\237.md" index 5257ceb94d..20a48e191e 100644 --- "a/problems/\345\211\215\345\272\217/On\347\232\204\347\256\227\346\263\225\345\261\205\347\204\266\350\266\205\346\227\266\344\272\206\357\274\214\346\255\244\346\227\266\347\232\204n\347\251\266\347\253\237\346\230\257\345\244\232\345\244\247\357\274\237.md" +++ "b/problems/\345\211\215\345\272\217/On\347\232\204\347\256\227\346\263\225\345\261\205\347\204\266\350\266\205\346\227\266\344\272\206\357\274\214\346\255\244\346\227\266\347\232\204n\347\251\266\347\253\237\346\230\257\345\244\232\345\244\247\357\274\237.md" @@ -1,18 +1,12 @@ -

- - - - -

-

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

+# On的算法居然超时了,此时的n究竟是多大? 一些同学可能对计算机运行的速度还没有概念,就是感觉计算机运行速度应该会很快,那么在leetcode上做算法题目的时候为什么会超时呢? 计算机究竟1s可以执行多少次操作呢? 接下来探讨一下这个问题。 -# 超时是怎么回事 +## 超时是怎么回事 ![程序超时](https://img-blog.csdnimg.cn/20200729112716117.png) @@ -24,7 +18,7 @@ 如果n的规模已经足够让$O(n)$的算法运行时间超过了1s,就应该考虑log(n)的解法了。 -# 从硬件配置看计算机的性能 +## 从硬件配置看计算机的性能 计算机的运算速度主要看CPU的配置,以2015年MacPro为例,CPU配置:2.7 GHz Dual-Core Intel Core i5 。 @@ -43,7 +37,7 @@ 所以我们的程序在计算机上究竟1s真正能执行多少次操作呢? -# 做个测试实验 +## 做个测试实验 在写测试程序测1s内处理多大数量级数据的时候,有三点需要注意: @@ -152,7 +146,7 @@ $O(n\log n)$的算法,1s内大概计算机可以运行 2 * (10^7)次计算, 至于 $O(\log n)$ 和 $O(n^3)$ 等等这些时间复杂度在1s内可以处理的多大的数据规模,大家可以自己写一写代码去测一下了。 -# 完整测试代码 +## 完整测试代码 ```CPP #include @@ -264,7 +258,7 @@ public class TimeComplexity { } ``` -# 总结 +## 总结 本文详细分析了在leetcode上做题程序为什么会有超时,以及从硬件配置上大体知道CPU的执行速度,然后亲自做一个实验来看看$O(n)$的算法,跑一秒钟,这个n究竟是做大,最后给出不同时间复杂度,一秒内可以运算出来的n的大小。 diff --git "a/problems/\345\211\215\345\272\217/\344\270\212\346\265\267\344\272\222\350\201\224\347\275\221\345\205\254\345\217\270\346\200\273\347\273\223.md" "b/problems/\345\211\215\345\272\217/\344\270\212\346\265\267\344\272\222\350\201\224\347\275\221\345\205\254\345\217\270\346\200\273\347\273\223.md" index ffcbe77b4c..6309ef583e 100644 --- "a/problems/\345\211\215\345\272\217/\344\270\212\346\265\267\344\272\222\350\201\224\347\275\221\345\205\254\345\217\270\346\200\273\347\273\223.md" +++ "b/problems/\345\211\215\345\272\217/\344\270\212\346\265\267\344\272\222\350\201\224\347\275\221\345\205\254\345\217\270\346\200\273\347\273\223.md" @@ -1,11 +1,3 @@ -

- - - - -

-

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

- # 上海互联网公司总结 diff --git "a/problems/\345\211\215\345\272\217/\344\273\200\344\271\210\346\230\257\346\240\270\345\277\203\344\273\243\347\240\201\346\250\241\345\274\217\357\274\214\344\273\200\344\271\210\345\217\210\346\230\257ACM\346\250\241\345\274\217\357\274\237.md" "b/problems/\345\211\215\345\272\217/\344\273\200\344\271\210\346\230\257\346\240\270\345\277\203\344\273\243\347\240\201\346\250\241\345\274\217\357\274\214\344\273\200\344\271\210\345\217\210\346\230\257ACM\346\250\241\345\274\217\357\274\237.md" index 54c5b6ecc7..0b9d230ff9 100644 --- "a/problems/\345\211\215\345\272\217/\344\273\200\344\271\210\346\230\257\346\240\270\345\277\203\344\273\243\347\240\201\346\250\241\345\274\217\357\274\214\344\273\200\344\271\210\345\217\210\346\230\257ACM\346\250\241\345\274\217\357\274\237.md" +++ "b/problems/\345\211\215\345\272\217/\344\273\200\344\271\210\346\230\257\346\240\270\345\277\203\344\273\243\347\240\201\346\250\241\345\274\217\357\274\214\344\273\200\344\271\210\345\217\210\346\230\257ACM\346\250\241\345\274\217\357\274\237.md" @@ -1,11 +1,5 @@ -

- - - - -

-

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

+# 什么是核心代码模式,什么又是ACM模式? 现在很多企业都在牛客上进行面试,**很多录友和我反馈说搞不懂牛客上输入代码的ACM模式**。 diff --git "a/problems/\345\211\215\345\272\217/\344\273\243\347\240\201\351\243\216\346\240\274.md" "b/problems/\345\211\215\345\272\217/\344\273\243\347\240\201\351\243\216\346\240\274.md" index b48665e5d4..4ab94a51b4 100644 --- "a/problems/\345\211\215\345\272\217/\344\273\243\347\240\201\351\243\216\346\240\274.md" +++ "b/problems/\345\211\215\345\272\217/\344\273\243\347\240\201\351\243\216\346\240\274.md" @@ -1,13 +1,3 @@ -

- - - - -

-

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

- - - # 看了这么多代码,谈一谈代码风格! @@ -142,11 +132,6 @@ Google规范是 大括号和 控制语句保持同一行的,我个人也很认 就酱,以后我还会陆续分享,关于代码,求职,学习工作之类的内容。 - - - ----------------------- -* 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) -* B站视频:[代码随想录](https://space.bilibili.com/525438321) -* 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) +
diff --git "a/problems/\345\211\215\345\272\217/\345\205\263\344\272\216\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\214\344\275\240\344\270\215\347\237\245\351\201\223\347\232\204\351\203\275\345\234\250\350\277\231\351\207\214\357\274\201.md" "b/problems/\345\211\215\345\272\217/\345\205\263\344\272\216\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\214\344\275\240\344\270\215\347\237\245\351\201\223\347\232\204\351\203\275\345\234\250\350\277\231\351\207\214\357\274\201.md" index 478b82e4f3..b2acb7ddb8 100644 --- "a/problems/\345\211\215\345\272\217/\345\205\263\344\272\216\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\214\344\275\240\344\270\215\347\237\245\351\201\223\347\232\204\351\203\275\345\234\250\350\277\231\351\207\214\357\274\201.md" +++ "b/problems/\345\211\215\345\272\217/\345\205\263\344\272\216\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\214\344\275\240\344\270\215\347\237\245\351\201\223\347\232\204\351\203\275\345\234\250\350\277\231\351\207\214\357\274\201.md" @@ -1,11 +1,5 @@ -

- - - - -

-

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

+# 关于时间复杂度,你不知道的都在这里! 相信每一位录友都接触过时间复杂度,但又对时间复杂度的认识处于一种朦胧的状态,所以是时候对时间复杂度来一个深度的剖析了。 diff --git "a/problems/\345\211\215\345\272\217/\345\205\263\344\272\216\347\251\272\351\227\264\345\244\215\346\235\202\345\272\246\357\274\214\345\217\257\350\203\275\346\234\211\345\207\240\344\270\252\347\226\221\351\227\256\357\274\237.md" "b/problems/\345\211\215\345\272\217/\345\205\263\344\272\216\347\251\272\351\227\264\345\244\215\346\235\202\345\272\246\357\274\214\345\217\257\350\203\275\346\234\211\345\207\240\344\270\252\347\226\221\351\227\256\357\274\237.md" index d49b42a2a1..162dfe963e 100644 --- "a/problems/\345\211\215\345\272\217/\345\205\263\344\272\216\347\251\272\351\227\264\345\244\215\346\235\202\345\272\246\357\274\214\345\217\257\350\203\275\346\234\211\345\207\240\344\270\252\347\226\221\351\227\256\357\274\237.md" +++ "b/problems/\345\211\215\345\272\217/\345\205\263\344\272\216\347\251\272\351\227\264\345\244\215\346\235\202\345\272\246\357\274\214\345\217\257\350\203\275\346\234\211\345\207\240\344\270\252\347\226\221\351\227\256\357\274\237.md" @@ -1,11 +1,3 @@ -

- - - - -

-

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

- # 空间复杂度分析 diff --git "a/problems/\345\211\215\345\272\217/\345\210\267\344\272\206\350\277\231\344\271\210\345\244\232\351\242\230\357\274\214\344\275\240\344\272\206\350\247\243\350\207\252\345\267\261\344\273\243\347\240\201\347\232\204\345\206\205\345\255\230\346\266\210\350\200\227\344\271\210\357\274\237.md" "b/problems/\345\211\215\345\272\217/\345\210\267\344\272\206\350\277\231\344\271\210\345\244\232\351\242\230\357\274\214\344\275\240\344\272\206\350\247\243\350\207\252\345\267\261\344\273\243\347\240\201\347\232\204\345\206\205\345\255\230\346\266\210\350\200\227\344\271\210\357\274\237.md" index 0364fc8b4a..f4aa4b6ea8 100644 --- "a/problems/\345\211\215\345\272\217/\345\210\267\344\272\206\350\277\231\344\271\210\345\244\232\351\242\230\357\274\214\344\275\240\344\272\206\350\247\243\350\207\252\345\267\261\344\273\243\347\240\201\347\232\204\345\206\205\345\255\230\346\266\210\350\200\227\344\271\210\357\274\237.md" +++ "b/problems/\345\211\215\345\272\217/\345\210\267\344\272\206\350\277\231\344\271\210\345\244\232\351\242\230\357\274\214\344\275\240\344\272\206\350\247\243\350\207\252\345\267\261\344\273\243\347\240\201\347\232\204\345\206\205\345\255\230\346\266\210\350\200\227\344\271\210\357\274\237.md" @@ -1,13 +1,6 @@ -

- - - - -

-

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

- +# 刷了这么多题,你了解自己代码的内存消耗么? 理解代码的内存消耗,最关键是要知道自己所用编程语言的内存管理。 diff --git "a/problems/\345\211\215\345\272\217/\345\212\233\346\211\243\344\270\212\347\232\204\344\273\243\347\240\201\346\203\263\345\234\250\346\234\254\345\234\260\347\274\226\350\257\221\350\277\220\350\241\214\357\274\237.md" "b/problems/\345\211\215\345\272\217/\345\212\233\346\211\243\344\270\212\347\232\204\344\273\243\347\240\201\346\203\263\345\234\250\346\234\254\345\234\260\347\274\226\350\257\221\350\277\220\350\241\214\357\274\237.md" index dca6eec37b..bcef3886e5 100644 --- "a/problems/\345\211\215\345\272\217/\345\212\233\346\211\243\344\270\212\347\232\204\344\273\243\347\240\201\346\203\263\345\234\250\346\234\254\345\234\260\347\274\226\350\257\221\350\277\220\350\241\214\357\274\237.md" +++ "b/problems/\345\211\215\345\272\217/\345\212\233\346\211\243\344\270\212\347\232\204\344\273\243\347\240\201\346\203\263\345\234\250\346\234\254\345\234\260\347\274\226\350\257\221\350\277\220\350\241\214\357\274\237.md" @@ -1,10 +1,4 @@ -

- - - - -

-

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

+# 力扣上的代码想在本地编译运行? 很多录友都问过我一个问题,就是力扣上的代码如何在本地编译运行? diff --git "a/problems/\345\211\215\345\272\217/\345\214\227\344\272\254\344\272\222\350\201\224\347\275\221\345\205\254\345\217\270\346\200\273\347\273\223.md" "b/problems/\345\211\215\345\272\217/\345\214\227\344\272\254\344\272\222\350\201\224\347\275\221\345\205\254\345\217\270\346\200\273\347\273\223.md" index 02a877b7c6..a10cab0654 100644 --- "a/problems/\345\211\215\345\272\217/\345\214\227\344\272\254\344\272\222\350\201\224\347\275\221\345\205\254\345\217\270\346\200\273\347\273\223.md" +++ "b/problems/\345\211\215\345\272\217/\345\214\227\344\272\254\344\272\222\350\201\224\347\275\221\345\205\254\345\217\270\346\200\273\347\273\223.md" @@ -1,14 +1,7 @@ -

- - - - -

-

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

- +# 北京互联网公司总结 +

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

-# 北京互联网公司总结 **个人总结难免有所疏忽,欢迎大家补充,公司好坏没有排名哈!** diff --git "a/problems/\345\211\215\345\272\217/\345\271\277\345\267\236\344\272\222\350\201\224\347\275\221\345\205\254\345\217\270\346\200\273\347\273\223.md" "b/problems/\345\211\215\345\272\217/\345\271\277\345\267\236\344\272\222\350\201\224\347\275\221\345\205\254\345\217\270\346\200\273\347\273\223.md" index e83fcd2bca..b8b1641b63 100644 --- "a/problems/\345\211\215\345\272\217/\345\271\277\345\267\236\344\272\222\350\201\224\347\275\221\345\205\254\345\217\270\346\200\273\347\273\223.md" +++ "b/problems/\345\211\215\345\272\217/\345\271\277\345\267\236\344\272\222\350\201\224\347\275\221\345\205\254\345\217\270\346\200\273\347\273\223.md" @@ -1,13 +1,7 @@ -

- - - - -

-

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

+# 广州互联网公司总结 +

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

-# 广州互联网公司总结 **个人总结难免有所疏忽,欢迎大家补充,公司好坏没有排名哈!** diff --git "a/problems/\345\211\215\345\272\217/\346\210\220\351\203\275\344\272\222\350\201\224\347\275\221\345\205\254\345\217\270\346\200\273\347\273\223.md" "b/problems/\345\211\215\345\272\217/\346\210\220\351\203\275\344\272\222\350\201\224\347\275\221\345\205\254\345\217\270\346\200\273\347\273\223.md" index 7964f23c64..f6a575f64d 100644 --- "a/problems/\345\211\215\345\272\217/\346\210\220\351\203\275\344\272\222\350\201\224\347\275\221\345\205\254\345\217\270\346\200\273\347\273\223.md" +++ "b/problems/\345\211\215\345\272\217/\346\210\220\351\203\275\344\272\222\350\201\224\347\275\221\345\205\254\345\217\270\346\200\273\347\273\223.md" @@ -1,15 +1,7 @@ -

- - - - -

-

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

- - - # 成都互联网公司总结 +

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

+ **排名不分先后,个人总结难免有所疏漏,欢迎补充!** diff --git "a/problems/\345\211\215\345\272\217/\346\235\255\345\267\236\344\272\222\350\201\224\347\275\221\345\205\254\345\217\270\346\200\273\347\273\223.md" "b/problems/\345\211\215\345\272\217/\346\235\255\345\267\236\344\272\222\350\201\224\347\275\221\345\205\254\345\217\270\346\200\273\347\273\223.md" index 029ee38089..6154cfe50f 100644 --- "a/problems/\345\211\215\345\272\217/\346\235\255\345\267\236\344\272\222\350\201\224\347\275\221\345\205\254\345\217\270\346\200\273\347\273\223.md" +++ "b/problems/\345\211\215\345\272\217/\346\235\255\345\267\236\344\272\222\350\201\224\347\275\221\345\205\254\345\217\270\346\200\273\347\273\223.md" @@ -1,14 +1,7 @@ -

- - - - -

-

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

- +# 杭州互联网公司总结 +

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

-# 杭州互联网公司总结 **个人总结难免有所疏忽,欢迎大家补充,公司好坏没有排名哈!** diff --git "a/problems/\345\211\215\345\272\217/\346\267\261\345\234\263\344\272\222\350\201\224\347\275\221\345\205\254\345\217\270\346\200\273\347\273\223.md" "b/problems/\345\211\215\345\272\217/\346\267\261\345\234\263\344\272\222\350\201\224\347\275\221\345\205\254\345\217\270\346\200\273\347\273\223.md" index 61bd52e8da..3d548abbd0 100644 --- "a/problems/\345\211\215\345\272\217/\346\267\261\345\234\263\344\272\222\350\201\224\347\275\221\345\205\254\345\217\270\346\200\273\347\273\223.md" +++ "b/problems/\345\211\215\345\272\217/\346\267\261\345\234\263\344\272\222\350\201\224\347\275\221\345\205\254\345\217\270\346\200\273\347\273\223.md" @@ -1,14 +1,8 @@ -

- - - - -

-

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

- # 深圳互联网公司总结 +

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

+ **个人总结难免有所疏忽,欢迎大家补充,公司好坏没有排名哈!** ## 一线互联网 diff --git "a/problems/\345\211\215\345\272\217/\347\250\213\345\272\217\345\221\230\345\206\231\346\226\207\346\241\243\345\267\245\345\205\267.md" "b/problems/\345\211\215\345\272\217/\347\250\213\345\272\217\345\221\230\345\206\231\346\226\207\346\241\243\345\267\245\345\205\267.md" index 5504ae7ac5..a2f6ee3b5f 100644 --- "a/problems/\345\211\215\345\272\217/\347\250\213\345\272\217\345\221\230\345\206\231\346\226\207\346\241\243\345\267\245\345\205\267.md" +++ "b/problems/\345\211\215\345\272\217/\347\250\213\345\272\217\345\221\230\345\206\231\346\226\207\346\241\243\345\267\245\345\205\267.md" @@ -1,15 +1,9 @@ -

- - - - -

-

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

+# 程序员应该用什么用具来写文档? +

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

-# 程序员应该用什么用具来写文档? Carl平时写东西,都是统一使用markdown,包括题解啊,笔记啊,所以这里给大家安利一波markdown对程序员的重要性! diff --git "a/problems/\345\211\215\345\272\217/\347\250\213\345\272\217\345\221\230\347\256\200\345\216\206.md" "b/problems/\345\211\215\345\272\217/\347\250\213\345\272\217\345\221\230\347\256\200\345\216\206.md" index 522fc5f752..e64f547ac8 100644 --- "a/problems/\345\211\215\345\272\217/\347\250\213\345\272\217\345\221\230\347\256\200\345\216\206.md" +++ "b/problems/\345\211\215\345\272\217/\347\250\213\345\272\217\345\221\230\347\256\200\345\216\206.md" @@ -1,16 +1,5 @@ -

- - - - -

-

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

- - - # 程序员的简历应该这么写!!(附简历模板) - Carl校招社招都拿过大厂的offer,同时也看过很多应聘者的简历,这里把自己总结的简历技巧以及常见问题给大家梳理一下。 ## 简历篇幅 @@ -116,7 +105,7 @@ Carl校招社招都拿过大厂的offer,同时也看过很多应聘者的简 ![简历模板](https://img-blog.csdnimg.cn/20200803175538158.png) -这里是简历模板中Markdown的代码:https://github.com/youngyangyang04/Markdown-Resume-Template ,可以fork到自己Github仓库上,按照这个模板来修改自己的简历。 +这里是简历模板中Markdown的代码:[https://github.com/youngyangyang04/Markdown-Resume-Template](https://github.com/youngyangyang04/Markdown-Resume-Template) ,可以fork到自己Github仓库上,按照这个模板来修改自己的简历。 **Word版本的简历,大家可以在公众号「代码随想录」后台回复:简历模板,就可以获取!** diff --git "a/problems/\345\211\215\345\272\217/\351\200\222\345\275\222\347\256\227\346\263\225\347\232\204\346\227\266\351\227\264\344\270\216\347\251\272\351\227\264\345\244\215\346\235\202\345\272\246\345\210\206\346\236\220.md" "b/problems/\345\211\215\345\272\217/\351\200\222\345\275\222\347\256\227\346\263\225\347\232\204\346\227\266\351\227\264\344\270\216\347\251\272\351\227\264\345\244\215\346\235\202\345\272\246\345\210\206\346\236\220.md" index 914cccfdd6..3c0d219ca6 100644 --- "a/problems/\345\211\215\345\272\217/\351\200\222\345\275\222\347\256\227\346\263\225\347\232\204\346\227\266\351\227\264\344\270\216\347\251\272\351\227\264\345\244\215\346\235\202\345\272\246\345\210\206\346\236\220.md" +++ "b/problems/\345\211\215\345\272\217/\351\200\222\345\275\222\347\256\227\346\263\225\347\232\204\346\227\266\351\227\264\344\270\216\347\251\272\351\227\264\345\244\215\346\235\202\345\272\246\345\210\206\346\236\220.md" @@ -1,11 +1,3 @@ -

- - - - -

-

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

- # 递归算法的时间与空间复杂度分析! diff --git "a/problems/\345\211\215\345\272\217/\351\200\232\350\277\207\344\270\200\351\201\223\351\235\242\350\257\225\351\242\230\347\233\256\357\274\214\350\256\262\344\270\200\350\256\262\351\200\222\345\275\222\347\256\227\346\263\225\347\232\204\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\201.md" "b/problems/\345\211\215\345\272\217/\351\200\232\350\277\207\344\270\200\351\201\223\351\235\242\350\257\225\351\242\230\347\233\256\357\274\214\350\256\262\344\270\200\350\256\262\351\200\222\345\275\222\347\256\227\346\263\225\347\232\204\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\201.md" index 849a025d7f..12af4dd8fe 100644 --- "a/problems/\345\211\215\345\272\217/\351\200\232\350\277\207\344\270\200\351\201\223\351\235\242\350\257\225\351\242\230\347\233\256\357\274\214\350\256\262\344\270\200\350\256\262\351\200\222\345\275\222\347\256\227\346\263\225\347\232\204\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\201.md" +++ "b/problems/\345\211\215\345\272\217/\351\200\232\350\277\207\344\270\200\351\201\223\351\235\242\350\257\225\351\242\230\347\233\256\357\274\214\350\256\262\344\270\200\350\256\262\351\200\222\345\275\222\347\256\227\346\263\225\347\232\204\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\201.md" @@ -1,13 +1,3 @@ -

- - - - -

-

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

- - - # 通过一道面试题目,讲一讲递归算法的时间复杂度! diff --git "a/problems/\345\233\236\346\272\257\346\200\273\347\273\223.md" "b/problems/\345\233\236\346\272\257\346\200\273\347\273\223.md" index 671e0a4eb1..bd0db57565 100644 --- "a/problems/\345\233\236\346\272\257\346\200\273\347\273\223.md" +++ "b/problems/\345\233\236\346\272\257\346\200\273\347\273\223.md" @@ -380,24 +380,24 @@ used数组可是全局变量,每层与每层之间公用一个used数组,所 以下在计算空间复杂度的时候我都把系统栈(不是数据结构里的栈)所占空间算进去。 子集问题分析: -* 时间复杂度:$O(2^n)$,因为每一个元素的状态无外乎取与不取,所以时间复杂度为$O(2^n)$ -* 空间复杂度:$O(n)$,递归深度为n,所以系统栈所用空间为$O(n)$,每一层递归所用的空间都是常数级别,注意代码里的result和path都是全局变量,就算是放在参数里,传的也是引用,并不会新申请内存空间,最终空间复杂度为$O(n)$ +* 时间复杂度:O(2^n),因为每一个元素的状态无外乎取与不取,所以时间复杂度为$O(2^n)$ +* 空间复杂度:O(n),递归深度为n,所以系统栈所用空间为$O(n)$,每一层递归所用的空间都是常数级别,注意代码里的result和path都是全局变量,就算是放在参数里,传的也是引用,并不会新申请内存空间,最终空间复杂度为$O(n)$ 排列问题分析: -* 时间复杂度:$O(n!)$,这个可以从排列的树形图中很明显发现,每一层节点为n,第二层每一个分支都延伸了n-1个分支,再往下又是n-2个分支,所以一直到叶子节点一共就是 n * n-1 * n-2 * ..... 1 = n!。 -* 空间复杂度:$O(n)$,和子集问题同理。 +* 时间复杂度:O(n!),这个可以从排列的树形图中很明显发现,每一层节点为n,第二层每一个分支都延伸了n-1个分支,再往下又是n-2个分支,所以一直到叶子节点一共就是 n * n-1 * n-2 * ..... 1 = n!。 +* 空间复杂度:O(n),和子集问题同理。 组合问题分析: -* 时间复杂度:$O(2^n)$,组合问题其实就是一种子集的问题,所以组合问题最坏的情况,也不会超过子集问题的时间复杂度。 -* 空间复杂度:$O(n)$,和子集问题同理。 +* 时间复杂度:O(2^n),组合问题其实就是一种子集的问题,所以组合问题最坏的情况,也不会超过子集问题的时间复杂度。 +* 空间复杂度:O(n),和子集问题同理。 N皇后问题分析: -* 时间复杂度:$O(n!)$ ,其实如果看树形图的话,直觉上是$O(n^n)$,但皇后之间不能见面所以在搜索的过程中是有剪枝的,最差也就是O(n!),n!表示n * (n-1) * .... * 1。 -* 空间复杂度:$O(n)$,和子集问题同理。 +* 时间复杂度:O(n!) ,其实如果看树形图的话,直觉上是$O(n^n)$,但皇后之间不能见面所以在搜索的过程中是有剪枝的,最差也就是O(n!),n!表示n * (n-1) * .... * 1。 +* 空间复杂度:O(n),和子集问题同理。 解数独问题分析: -* 时间复杂度:$O(9^m)$ , m是'.'的数目。 -* 空间复杂度:$O(n^2)$,递归的深度是n^2 +* 时间复杂度:O(9^m) , m是'.'的数目。 +* 空间复杂度:O(n^2),递归的深度是n^2 **一般说道回溯算法的复杂度,都说是指数级别的时间复杂度,这也算是一个概括吧!** diff --git "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/HR\347\211\271\346\204\217\345\210\201\351\232\276\351\235\236\347\247\221\347\217\255.md" "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/HR\347\211\271\346\204\217\345\210\201\351\232\276\351\235\236\347\247\221\347\217\255.md" index c59debf2f2..d5d39fe35e 100644 --- "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/HR\347\211\271\346\204\217\345\210\201\351\232\276\351\235\236\347\247\221\347\217\255.md" +++ "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/HR\347\211\271\346\204\217\345\210\201\351\232\276\351\235\236\347\247\221\347\217\255.md" @@ -1,6 +1,6 @@

- + @@ -8,7 +8,7 @@ 不少录友都是非科班转程序员,或者进军互联网的,但有一些HR在HR面的时候特意刁难大家。 -正如[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)里,这位录友所遭受的情景。 +正如[知识星球](https://programmercarl.com/other/kstar.html)里,这位录友所遭受的情景。 ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211006230202.png) diff --git "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/HR\351\235\242\346\263\250\346\204\217\344\272\213\351\241\271.md" "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/HR\351\235\242\346\263\250\346\204\217\344\272\213\351\241\271.md" index 6a0a26f114..5dba672c5d 100644 --- "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/HR\351\235\242\346\263\250\346\204\217\344\272\213\351\241\271.md" +++ "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/HR\351\235\242\346\263\250\346\204\217\344\272\213\351\241\271.md" @@ -1,12 +1,12 @@

- + # HR面注意事项 -[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)里已经有一些录友开始准备HR面。 +[知识星球](https://programmercarl.com/other/kstar.html)里已经有一些录友开始准备HR面。 ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210807155107.png) @@ -86,4 +86,4 @@ HR朋友的回答是:你不说真相,我会认为你可能对技术有追求 --------------- -加入「代码随想录」知识星球,[点击这里](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) +加入「代码随想录」知识星球,[点击这里](https://programmercarl.com/other/kstar.html) diff --git "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/offer\345\257\271\346\257\224-\345\206\263\350\265\233\345\234\210.md" "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/offer\345\257\271\346\257\224-\345\206\263\350\265\233\345\234\210.md" index 1f91730fc8..081ae5ece2 100644 --- "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/offer\345\257\271\346\257\224-\345\206\263\350\265\233\345\234\210.md" +++ "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/offer\345\257\271\346\257\224-\345\206\263\350\265\233\345\234\210.md" @@ -1,5 +1,5 @@

- + @@ -7,7 +7,7 @@ 秋招已经结束了,该开奖的差不多都陆续开奖了,很多录友的也进入了offer决赛圈。 -我每天都在[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)里,回答十几个offer对比的问题,我也是结合自己过来人的经验给大家做做分析,我也选几个案例,在公众号上也给大家分享一下,希望对大家有所启发。 +我每天都在[知识星球](https://programmercarl.com/other/kstar.html)里,回答十几个offer对比的问题,我也是结合自己过来人的经验给大家做做分析,我也选几个案例,在公众号上也给大家分享一下,希望对大家有所启发。 以下是知识星球里的部分问答: diff --git "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/offer\346\200\273\345\206\263\350\265\233\357\274\214\344\275\225\345\216\273\344\275\225\344\273\216.md" "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/offer\346\200\273\345\206\263\350\265\233\357\274\214\344\275\225\345\216\273\344\275\225\344\273\216.md" index 01745ae3a5..e22c5d4a3a 100644 --- "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/offer\346\200\273\345\206\263\350\265\233\357\274\214\344\275\225\345\216\273\344\275\225\344\273\216.md" +++ "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/offer\346\200\273\345\206\263\350\265\233\357\274\214\344\275\225\345\216\273\344\275\225\344\273\216.md" @@ -1,12 +1,12 @@

- + # offer总决赛,何去何从! -最近在[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)上,给至少300位录友做了offer选择,准对大家的情况,结合我的经验做一做分析。 +最近在[知识星球](https://programmercarl.com/other/kstar.html)上,给至少300位录友做了offer选择,准对大家的情况,结合我的经验做一做分析。 希望可以给大家带来不一样的分析视角,帮大家少走弯路。 diff --git "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/offer\347\232\204\351\200\211\346\213\251.md" "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/offer\347\232\204\351\200\211\346\213\251.md" index b9b40dead1..106bc5f889 100644 --- "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/offer\347\232\204\351\200\211\346\213\251.md" +++ "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/offer\347\232\204\351\200\211\346\213\251.md" @@ -1,6 +1,6 @@

- + @@ -10,7 +10,7 @@ 不过大部分同学应该拿到的是 两个大厂offer,或者说拿到两个小厂offer,还要考虑岗位,业务,公司前景,那么就要纠结如何选择了。 -在[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)里,我已经给很多录友提供了选择offer的建议,这里也分享出来,希望对大家在选择offer上有所启发。 +在[知识星球](https://programmercarl.com/other/kstar.html)里,我已经给很多录友提供了选择offer的建议,这里也分享出来,希望对大家在选择offer上有所启发。 ## 保研与工作 diff --git "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\344\270\215\344\270\200\346\240\267\347\232\204\344\270\203\345\244\225.md" "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\344\270\215\344\270\200\346\240\267\347\232\204\344\270\203\345\244\225.md" index a670e0787c..40d15ecdc6 100644 --- "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\344\270\215\344\270\200\346\240\267\347\232\204\344\270\203\345\244\225.md" +++ "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\344\270\215\344\270\200\346\240\267\347\232\204\344\270\203\345\244\225.md" @@ -1,11 +1,11 @@

- + # 特殊的七夕 -昨天在[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)发了一个状态: +昨天在[知识星球](https://programmercarl.com/other/kstar.html)发了一个状态: ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210815084126.png) diff --git "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\344\270\215\345\226\234\346\254\242\345\206\231\344\273\243\347\240\201\346\200\216\344\271\210\345\212\236.md" "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\344\270\215\345\226\234\346\254\242\345\206\231\344\273\243\347\240\201\346\200\216\344\271\210\345\212\236.md" index 9bc624bbfe..84d372f080 100644 --- "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\344\270\215\345\226\234\346\254\242\345\206\231\344\273\243\347\240\201\346\200\216\344\271\210\345\212\236.md" +++ "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\344\270\215\345\226\234\346\254\242\345\206\231\344\273\243\347\240\201\346\200\216\344\271\210\345\212\236.md" @@ -1,7 +1,7 @@ # 看到代码就抵触!怎么办? -最近在[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)里,看到了不少录友,其实是不喜欢写代码,看到 哪些八股文都是很抵触的。 +最近在[知识星球](https://programmercarl.com/other/kstar.html)里,看到了不少录友,其实是不喜欢写代码,看到 哪些八股文都是很抵触的。 其实是一个普遍现象,我在星球里分享了一下,我对这一情况的一些想法。 diff --git "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\344\270\215\345\260\221\345\275\225\345\217\213\346\203\263\346\224\276\345\274\203\347\247\213\346\213\233.md" "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\344\270\215\345\260\221\345\275\225\345\217\213\346\203\263\346\224\276\345\274\203\347\247\213\346\213\233.md" index 721a931368..81c9950350 100644 --- "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\344\270\215\345\260\221\345\275\225\345\217\213\346\203\263\346\224\276\345\274\203\347\247\213\346\213\233.md" +++ "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\344\270\215\345\260\221\345\275\225\345\217\213\346\203\263\346\224\276\345\274\203\347\247\213\346\213\233.md" @@ -1,5 +1,5 @@

- + @@ -7,7 +7,7 @@ 马上就要九月份了,互联网大厂的秋招的序幕早已拉开。 -发现[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)里有一部分录友想放弃秋招,直接准备明年的春招,估计关注公众号的录友也有不少有这种想法的。 +发现[知识星球](https://programmercarl.com/other/kstar.html)里有一部分录友想放弃秋招,直接准备明年的春招,估计关注公众号的录友也有不少有这种想法的。 ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210813103515.png) @@ -50,7 +50,7 @@ 所以也给明年找工作的录友们(2023届)提一个醒,现在就要系统性的准备起来了,因为明年春季实习招聘 是一个很好的进大厂的机会,剩下的时间也不是很多了。 -来看看[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)里,一位准大三的录友准备的情况 +来看看[知识星球](https://programmercarl.com/other/kstar.html)里,一位准大三的录友准备的情况 ![](https://code-thinking-1253855093.file.myqcloud.com/pics/星球大三.jpg) @@ -60,7 +60,7 @@ **我已经预感到 这两位 等到秋招的时候就是稳稳的offer收割机**。 -[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)还有很多已经开始提前准备,或者看了 星球发文状态就开始着手准备的录友了。 +[知识星球](https://programmercarl.com/other/kstar.html)还有很多已经开始提前准备,或者看了 星球发文状态就开始着手准备的录友了。 所以 **所谓的大牛,都是 很早就规划自己要学的东西,很早就开始向过来人请教应该如何找工作,很早就知道自己应该学哪些技术,看哪些书, 这样等到找工作的时候,才是剑锋出鞘的时候**。 diff --git "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\344\270\223\344\270\232\346\212\200\350\203\275\345\217\257\344\273\245\350\277\231\344\271\210\345\206\231.md" "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\344\270\223\344\270\232\346\212\200\350\203\275\345\217\257\344\273\245\350\277\231\344\271\210\345\206\231.md" index dd616713e6..a1b7ba3abb 100644 --- "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\344\270\223\344\270\232\346\212\200\350\203\275\345\217\257\344\273\245\350\277\231\344\271\210\345\206\231.md" +++ "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\344\270\223\344\270\232\346\212\200\350\203\275\345\217\257\344\273\245\350\277\231\344\271\210\345\206\231.md" @@ -1,5 +1,5 @@

- + @@ -8,7 +8,7 @@ # 你简历里的「专业技能」写的够专业么? -其实我几乎每天都要看一些简历,有一些写的不错的,我都会在[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)里分享一下。 +其实我几乎每天都要看一些简历,有一些写的不错的,我都会在[知识星球](https://programmercarl.com/other/kstar.html)里分享一下。 ![](https://code-thinking-1253855093.cos.ap-guangzhou.myqcloud.com/pics/20210626172902.png) 这次呢,我再专门说一说简历中的【专业技能】这一栏应该怎么写。 diff --git "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\205\245\350\201\214\345\220\216\346\213\205\345\277\203\344\273\243\347\240\201\350\203\275\345\212\233\350\267\237\344\270\215\344\270\212.md" "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\205\245\350\201\214\345\220\216\346\213\205\345\277\203\344\273\243\347\240\201\350\203\275\345\212\233\350\267\237\344\270\215\344\270\212.md" index c270452576..58b8c32ced 100644 --- "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\205\245\350\201\214\345\220\216\346\213\205\345\277\203\344\273\243\347\240\201\350\203\275\345\212\233\350\267\237\344\270\215\344\270\212.md" +++ "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\205\245\350\201\214\345\220\216\346\213\205\345\277\203\344\273\243\347\240\201\350\203\275\345\212\233\350\267\237\344\270\215\344\270\212.md" @@ -1,12 +1,12 @@

- + # 入职后担心代码能力跟不上 -在[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)上,很多录友已经担心自己去了公司工作以后,代码能力跟不上,会压力很大。 +在[知识星球](https://programmercarl.com/other/kstar.html)上,很多录友已经担心自己去了公司工作以后,代码能力跟不上,会压力很大。 ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211031202952.png) diff --git "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\205\263\344\272\216\345\256\236\344\271\240\345\244\247\345\256\266\347\232\204\347\226\221\351\227\256.md" "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\205\263\344\272\216\345\256\236\344\271\240\345\244\247\345\256\266\347\232\204\347\226\221\351\227\256.md" index 5d4e695b3c..88de443634 100644 --- "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\205\263\344\272\216\345\256\236\344\271\240\345\244\247\345\256\266\347\232\204\347\226\221\351\227\256.md" +++ "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\205\263\344\272\216\345\256\236\344\271\240\345\244\247\345\256\266\347\232\204\347\226\221\351\227\256.md" @@ -1,11 +1,11 @@

- + # 关于实习,大家可能有点迷茫! -我在[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)里回答了很多关于实习相关的问题,其实很多录友可能都有这么样的疑问,主要关于实习的问题有如下四点: +我在[知识星球](https://programmercarl.com/other/kstar.html)里回答了很多关于实习相关的问题,其实很多录友可能都有这么样的疑问,主要关于实习的问题有如下四点: * 秋招什么时候开始准备 * 要不要准备实习 diff --git "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\205\263\344\272\216\346\217\220\345\211\215\346\211\271\347\232\204\344\270\200\344\272\233\345\273\272\350\256\256.md" "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\205\263\344\272\216\346\217\220\345\211\215\346\211\271\347\232\204\344\270\200\344\272\233\345\273\272\350\256\256.md" index 415a8b2f4c..6a316bd234 100644 --- "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\205\263\344\272\216\346\217\220\345\211\215\346\211\271\347\232\204\344\270\200\344\272\233\345\273\272\350\256\256.md" +++ "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\205\263\344\272\216\346\217\220\345\211\215\346\211\271\347\232\204\344\270\200\344\272\233\345\273\272\350\256\256.md" @@ -1,5 +1,5 @@

- + @@ -9,7 +9,7 @@ 以前提前批,都是 8月份,8月份中序左右,而不少大厂现在就已经提前批了。 -不少录友在 公众号留言,和[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)里,表示提前批来的还是有点快。 +不少录友在 公众号留言,和[知识星球](https://programmercarl.com/other/kstar.html)里,表示提前批来的还是有点快。 ![](https://code-thinking-1253855093.cos.ap-guangzhou.myqcloud.com/pics/20210618162214.png) diff --git "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\206\231\347\256\200\345\216\206\347\232\204\344\270\200\344\272\233\351\227\256\351\242\230.md" "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\206\231\347\256\200\345\216\206\347\232\204\344\270\200\344\272\233\351\227\256\351\242\230.md" index af42cea1d9..426eb2a653 100644 --- "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\206\231\347\256\200\345\216\206\347\232\204\344\270\200\344\272\233\351\227\256\351\242\230.md" +++ "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\206\231\347\256\200\345\216\206\347\232\204\344\270\200\344\272\233\351\227\256\351\242\230.md" @@ -1,11 +1,11 @@

- + # 程序员应该这么写简历! -自运营[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)以来,我已经给星球里的录友们看了 一百多份简历,并准对大家简历上的问题都给出了对应的详细建议。 +自运营[知识星球](https://programmercarl.com/other/kstar.html)以来,我已经给星球里的录友们看了 一百多份简历,并准对大家简历上的问题都给出了对应的详细建议。 社招,校招,实习的都有,其实大家的简历看多了,发现有很多共性的问题,这里就和大家分享一下。 diff --git "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\210\235\345\205\245\345\244\247\344\270\211\351\200\211\346\213\251\350\200\203\347\240\224VS\345\267\245\344\275\234.md" "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\210\235\345\205\245\345\244\247\344\270\211\351\200\211\346\213\251\350\200\203\347\240\224VS\345\267\245\344\275\234.md" index ba6757611a..f602e9e918 100644 --- "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\210\235\345\205\245\345\244\247\344\270\211\351\200\211\346\213\251\350\200\203\347\240\224VS\345\267\245\344\275\234.md" +++ "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\210\235\345\205\245\345\244\247\344\270\211\351\200\211\346\213\251\350\200\203\347\240\224VS\345\267\245\344\275\234.md" @@ -1,6 +1,6 @@

- + @@ -8,7 +8,7 @@ 9月份开学季,已过,一些录友也升入大三了,升入大三摆在自己面前最大的问题就是,考研还是找工作? -在[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)里就有录友问我这样一个问题, 其实每个人情况不一样,做出的选择也不一样,这里给大家分享一下,相信对你也会有启发。 +在[知识星球](https://programmercarl.com/other/kstar.html)里就有录友问我这样一个问题, 其实每个人情况不一样,做出的选择也不一样,这里给大家分享一下,相信对你也会有启发。 ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211002110618.png) diff --git "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\210\267\345\212\233\346\211\243\347\224\250\344\270\215\347\224\250\345\272\223\345\207\275\346\225\260.md" "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\210\267\345\212\233\346\211\243\347\224\250\344\270\215\347\224\250\345\272\223\345\207\275\346\225\260.md" index 73f2a2d57e..b52e4d0300 100644 --- "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\210\267\345\212\233\346\211\243\347\224\250\344\270\215\347\224\250\345\272\223\345\207\275\346\225\260.md" +++ "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\210\267\345\212\233\346\211\243\347\224\250\344\270\215\347\224\250\345\272\223\345\207\275\346\225\260.md" @@ -1,11 +1,11 @@

- + # 究竟什么时候用库函数,什么时候要自己实现 -在[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)里有录友问我,刷题究竟要不要用库函数? 刷题的时候总是禁不住库函数的诱惑,如果都不用库函数一些题目做起来还很麻烦。 +在[知识星球](https://programmercarl.com/other/kstar.html)里有录友问我,刷题究竟要不要用库函数? 刷题的时候总是禁不住库函数的诱惑,如果都不用库函数一些题目做起来还很麻烦。 估计不少录友都有这个困惑,我来说一说对于库函数的使用。 diff --git "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\210\267\351\242\230\346\224\273\347\225\245\350\246\201\345\210\267\344\270\244\351\201\215.md" "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\210\267\351\242\230\346\224\273\347\225\245\350\246\201\345\210\267\344\270\244\351\201\215.md" index 1f4fd7f93c..285a5728dd 100644 --- "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\210\267\351\242\230\346\224\273\347\225\245\350\246\201\345\210\267\344\270\244\351\201\215.md" +++ "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\210\267\351\242\230\346\224\273\347\225\245\350\246\201\345\210\267\344\270\244\351\201\215.md" @@ -1,5 +1,5 @@

- + @@ -27,7 +27,7 @@ 第三遍基本就得心应手了。 -在[「代码随想录」知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)中,我都是强调大家要至少刷两遍,有时间的话刷三遍, +在[「代码随想录」知识星球](https://programmercarl.com/other/kstar.html)中,我都是强调大家要至少刷两遍,有时间的话刷三遍, 可以看看星球里录友们的打卡: diff --git "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\215\232\345\243\253\350\275\254\350\241\214\350\256\241\347\256\227\346\234\272.md" "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\215\232\345\243\253\350\275\254\350\241\214\350\256\241\347\256\227\346\234\272.md" index 6676926444..4da79e9743 100644 --- "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\215\232\345\243\253\350\275\254\350\241\214\350\256\241\347\256\227\346\234\272.md" +++ "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\215\232\345\243\253\350\275\254\350\241\214\350\256\241\347\256\227\346\234\272.md" @@ -1,11 +1,11 @@

- + # 本硕非计算机博士,如果找计算机相关工作 -在[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)里,有一位博士录友,本硕都不是计算机,博士转的计算机,问了这样一个问题 +在[知识星球](https://programmercarl.com/other/kstar.html)里,有一位博士录友,本硕都不是计算机,博士转的计算机,问了这样一个问题 ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210903213924.png) diff --git "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\220\210\351\200\202\350\207\252\345\267\261\347\232\204\345\260\261\346\230\257\346\234\200\345\245\275\347\232\204.md" "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\220\210\351\200\202\350\207\252\345\267\261\347\232\204\345\260\261\346\230\257\346\234\200\345\245\275\347\232\204.md" index fda51afab1..dc31f5a79d 100644 --- "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\220\210\351\200\202\350\207\252\345\267\261\347\232\204\345\260\261\346\230\257\346\234\200\345\245\275\347\232\204.md" +++ "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\220\210\351\200\202\350\207\252\345\267\261\347\232\204\345\260\261\346\230\257\346\234\200\345\245\275\347\232\204.md" @@ -1,5 +1,5 @@

- + @@ -7,7 +7,7 @@ 秋招已经进入下半场了,不少同学也拿到了offer,但不是说非要进大厂,每个人情况都不一样,**合适自己的,就是最好的!**。 -[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)里有一位录友,就终于拿到了合适自己的offer,并不是大厂,是南京的一家公司,**但很合适自己,其实就非常值得开心**。 +[知识星球](https://programmercarl.com/other/kstar.html)里有一位录友,就终于拿到了合适自己的offer,并不是大厂,是南京的一家公司,**但很合适自己,其实就非常值得开心**。 ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210910232502.png) @@ -33,5 +33,5 @@ 我在发文的时候 看了一遍她这几个月完整的打卡过程,还是深有感触的。 -[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)里还有很多很多这样的录友在每日奋斗着,**我相信 等大家拿到offer之后,在回头看一下当初星球里曾经每日打卡的点点滴滴,不仅会感动自己 也会感动每一位见证者**。 +[知识星球](https://programmercarl.com/other/kstar.html)里还有很多很多这样的录友在每日奋斗着,**我相信 等大家拿到offer之后,在回头看一下当初星球里曾经每日打卡的点点滴滴,不仅会感动自己 也会感动每一位见证者**。 diff --git "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\244\207\346\210\2302022\345\261\212\347\247\213\346\213\233.md" "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\244\207\346\210\2302022\345\261\212\347\247\213\346\213\233.md" index 207a5e2ab9..55c2a3bf6c 100644 --- "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\244\207\346\210\2302022\345\261\212\347\247\213\346\213\233.md" +++ "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\244\207\346\210\2302022\345\261\212\347\247\213\346\213\233.md" @@ -1,11 +1,11 @@

- + # 要开始准备2022届的秋招了 -在[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)里准备秋招的录友还真不少,也会回答过不少关于秋招的问题。 +在[知识星球](https://programmercarl.com/other/kstar.html)里准备秋招的录友还真不少,也会回答过不少关于秋招的问题。 ![](https://img-blog.csdnimg.cn/20210507195443924.png) diff --git "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\244\247\345\216\202\346\226\260\344\272\272\345\237\271\345\205\273\344\275\223\347\263\273.md" "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\244\247\345\216\202\346\226\260\344\272\272\345\237\271\345\205\273\344\275\223\347\263\273.md" index ccd2f1c266..0e905e42f2 100644 --- "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\244\247\345\216\202\346\226\260\344\272\272\345\237\271\345\205\273\344\275\223\347\263\273.md" +++ "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\244\247\345\216\202\346\226\260\344\272\272\345\237\271\345\205\273\344\275\223\347\263\273.md" @@ -1,11 +1,11 @@

- + # 大厂的新人培养体系是什么样的 -之前我一直在[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)和大家讲,能进大厂一定要进大厂,大厂有比较好的培养体系。 +之前我一直在[知识星球](https://programmercarl.com/other/kstar.html)和大家讲,能进大厂一定要进大厂,大厂有比较好的培养体系。 也有录友在星球里问我,究竟培养体系应该是什么样的呢? 大厂都会这么培养新人么? diff --git "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\244\251\344\270\213\344\271\214\351\270\246\344\270\200\350\210\254\351\273\221.md" "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\244\251\344\270\213\344\271\214\351\270\246\344\270\200\350\210\254\351\273\221.md" index 2954374791..ccd1c32679 100644 --- "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\244\251\344\270\213\344\271\214\351\270\246\344\270\200\350\210\254\351\273\221.md" +++ "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\244\251\344\270\213\344\271\214\351\270\246\344\270\200\350\210\254\351\273\221.md" @@ -1,6 +1,6 @@

- + @@ -8,7 +8,7 @@ 相信大家应该经常在 各大论坛啊之类的 看到对各个互联网公司的评价,有风评好的,也有风评不好的。 -在[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)里有录友问我这样一个问题: +在[知识星球](https://programmercarl.com/other/kstar.html)里有录友问我这样一个问题: ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211004095707.png) diff --git "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\246\202\344\275\225\346\235\203\350\241\241\345\256\236\344\271\240\344\270\216\347\247\213\346\213\233\345\244\215\344\271\240.md" "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\246\202\344\275\225\346\235\203\350\241\241\345\256\236\344\271\240\344\270\216\347\247\213\346\213\233\345\244\215\344\271\240.md" index 275588df86..07e2bba6a5 100644 --- "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\246\202\344\275\225\346\235\203\350\241\241\345\256\236\344\271\240\344\270\216\347\247\213\346\213\233\345\244\215\344\271\240.md" +++ "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\246\202\344\275\225\346\235\203\350\241\241\345\256\236\344\271\240\344\270\216\347\247\213\346\213\233\345\244\215\344\271\240.md" @@ -1,11 +1,11 @@

- + # 已经在实习的录友如何准备秋招? -最近在[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)一位录友问了实习生如何权衡工作和准备秋招的问题。 +最近在[知识星球](https://programmercarl.com/other/kstar.html)一位录友问了实习生如何权衡工作和准备秋招的问题。 ![](https://code-thinking-1253855093.cos.ap-guangzhou.myqcloud.com/pics/20210703230618.png) diff --git "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\256\242\344\270\211\346\266\210.md" "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\256\242\344\270\211\346\266\210.md" index 8a7b5fc6a3..6b81ab2c6f 100644 --- "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\256\242\344\270\211\346\266\210.md" +++ "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\256\242\344\270\211\346\266\210.md" @@ -1,5 +1,5 @@

- + @@ -17,7 +17,7 @@ 然后朋友圈就炸了,上百条的留言,问我这是为啥。 -其实这个问题在[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)里也有录友问过我。 +其实这个问题在[知识星球](https://programmercarl.com/other/kstar.html)里也有录友问过我。 ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210905091037.png) @@ -87,7 +87,7 @@ # 总结 -以上就是我在[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)里的详细回答。 +以上就是我在[知识星球](https://programmercarl.com/other/kstar.html)里的详细回答。 注意我这里说的一般情况,当然各个岗位都有佼佼者,或者说大牛,客户端也有大牛,也很香,不过这是极少数,就不在讨论范围内了。 diff --git "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\346\212\200\346\234\257\344\270\215\345\245\275\345\246\202\344\275\225\351\200\211\346\213\251\346\212\200\346\234\257\346\226\271\345\220\221.md" "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\346\212\200\346\234\257\344\270\215\345\245\275\345\246\202\344\275\225\351\200\211\346\213\251\346\212\200\346\234\257\346\226\271\345\220\221.md" index dd13f46b5f..4ad4659bc4 100644 --- "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\346\212\200\346\234\257\344\270\215\345\245\275\345\246\202\344\275\225\351\200\211\346\213\251\346\212\200\346\234\257\346\226\271\345\220\221.md" +++ "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\346\212\200\346\234\257\344\270\215\345\245\275\345\246\202\344\275\225\351\200\211\346\213\251\346\212\200\346\234\257\346\226\271\345\220\221.md" @@ -1,11 +1,11 @@

- + # 技术不太好,也不知道对技术有没有兴趣,我该怎么选? -最近在[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)里解答了不少录友们的疑惑,其实发现一个挺普遍的问题: +最近在[知识星球](https://programmercarl.com/other/kstar.html)里解答了不少录友们的疑惑,其实发现一个挺普遍的问题: * 我技术很一般 * 对技术也没有什么追求 diff --git "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\346\217\220\345\211\215\346\211\271\345\267\262\347\273\217\345\274\200\345\247\213\344\272\206.md" "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\346\217\220\345\211\215\346\211\271\345\267\262\347\273\217\345\274\200\345\247\213\344\272\206.md" index ba05b5a9b7..3e25574669 100644 --- "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\346\217\220\345\211\215\346\211\271\345\267\262\347\273\217\345\274\200\345\247\213\344\272\206.md" +++ "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\346\217\220\345\211\215\346\211\271\345\267\262\347\273\217\345\274\200\345\247\213\344\272\206.md" @@ -1,5 +1,5 @@

- + @@ -7,7 +7,7 @@ 最近华为提前批已经开始了,不少同学已经陆续参加了提前批的面试。 -在[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)上就有录友问我这么个问题: +在[知识星球](https://programmercarl.com/other/kstar.html)上就有录友问我这么个问题: ![](https://code-thinking-1253855093.cos.ap-guangzhou.myqcloud.com/pics/20210711002802.png) diff --git "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\347\247\213\346\213\233\344\270\213\345\215\212\345\234\272\344\276\235\347\204\266\346\262\241offer.md" "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\347\247\213\346\213\233\344\270\213\345\215\212\345\234\272\344\276\235\347\204\266\346\262\241offer.md" index 829f82bac1..5862dd329f 100644 --- "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\347\247\213\346\213\233\344\270\213\345\215\212\345\234\272\344\276\235\347\204\266\346\262\241offer.md" +++ "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\347\247\213\346\213\233\344\270\213\345\215\212\345\234\272\344\276\235\347\204\266\346\262\241offer.md" @@ -1,11 +1,11 @@

- + # 秋招下半场依然没offer,怎么办? -[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)里一些录友拿到了满意的offer,也有一些录友,依然没有offer,每天的状态已经不能用焦虑来形容了。 +[知识星球](https://programmercarl.com/other/kstar.html)里一些录友拿到了满意的offer,也有一些录友,依然没有offer,每天的状态已经不能用焦虑来形容了。 在星球里就有录友向我提问了这样一个问题: @@ -52,7 +52,7 @@ ## 在学点技术,冲春招? -[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)里还有一位录友,也是类似的情况,秋招感觉很艰难,要不要在学一学微服务分布式之类的,再冲春招。 +[知识星球](https://programmercarl.com/other/kstar.html)里还有一位录友,也是类似的情况,秋招感觉很艰难,要不要在学一学微服务分布式之类的,再冲春招。 ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210921103343.png) @@ -71,13 +71,13 @@ ## 给参加明年秋招录友的劝告 -其实我在[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)里,**看到了太多太多 参加今年秋招的录友 埋怨自己 准备的太晚了,没想到要看的东西这么多,没想到竞争这么激烈**。 +其实我在[知识星球](https://programmercarl.com/other/kstar.html)里,**看到了太多太多 参加今年秋招的录友 埋怨自己 准备的太晚了,没想到要看的东西这么多,没想到竞争这么激烈**。 所以明年参加秋招的录友,要提前就开始准备,明确自己的岗位,知道岗位的要求,制定自己的计划,然后按计划执行。 **其实多早开始准备,都不算早!** -很多在[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)里的准大三,研一的录友,都能在星球里感受到 秋招的竞争与激烈。 +很多在[知识星球](https://programmercarl.com/other/kstar.html)里的准大三,研一的录友,都能在星球里感受到 秋招的竞争与激烈。 所以他们也就早早的开始准备了。 @@ -87,7 +87,7 @@ 估计大多数准大三或者准研一的同学都还没有这种意识。 -**但在[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)里,通过每天录友们的打卡,每天都能感受到这种紧迫感**。 +**但在[知识星球](https://programmercarl.com/other/kstar.html)里,通过每天录友们的打卡,每天都能感受到这种紧迫感**。 正如一位星球里的录友这么说: diff --git "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\347\247\213\346\213\233\345\274\200\345\245\226.md" "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\347\247\213\346\213\233\345\274\200\345\245\226.md" index 368596b6c6..826867854e 100644 --- "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\347\247\213\346\213\233\345\274\200\345\245\226.md" +++ "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\347\247\213\346\213\233\345\274\200\345\245\226.md" @@ -1,6 +1,6 @@

- + @@ -8,7 +8,7 @@ 最近秋招的录友已经陆续开奖了,同时开奖多少,也是offer选择的一个重要因素,毕竟谁能和钱过意不去呢。 -[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)里这位录友拿到的百度offer薪资确实很高 +[知识星球](https://programmercarl.com/other/kstar.html)里这位录友拿到的百度offer薪资确实很高 ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211023102430.png) diff --git "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\347\247\213\346\213\233\346\200\273\347\273\2231.md" "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\347\247\213\346\213\233\346\200\273\347\273\2231.md" index efec67ee29..2aec24dc9e 100644 --- "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\347\247\213\346\213\233\346\200\273\347\273\2231.md" +++ "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\347\247\213\346\213\233\346\200\273\347\273\2231.md" @@ -1,5 +1,5 @@

- + @@ -11,7 +11,7 @@ 时间总是过得很快,但曾经焦虑的小伙,现在也拿到几个offer了,不一定人人都要冲大厂,卷算法,卷后端,合适自己就好,要不然会把自己搞的很累。 -以下是他的秋招总结,**写的很用心,说了很多面试中使用的方法,发在[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)里,立刻就引来星球小伙伴们的围观**,算是给星球里明年要秋招的录友做了一个参考。 +以下是他的秋招总结,**写的很用心,说了很多面试中使用的方法,发在[知识星球](https://programmercarl.com/other/kstar.html)里,立刻就引来星球小伙伴们的围观**,算是给星球里明年要秋招的录友做了一个参考。 ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211109231150.png) diff --git "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\347\247\213\346\213\233\346\200\273\347\273\2232.md" "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\347\247\213\346\213\233\346\200\273\347\273\2232.md" index 7f4b6770a9..897a7ec3ec 100644 --- "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\347\247\213\346\213\233\346\200\273\347\273\2232.md" +++ "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\347\247\213\346\213\233\346\200\273\347\273\2232.md" @@ -1,10 +1,10 @@ -

+

# 倒霉透顶,触底反弹! -星球里不少录友秋招已经陆续结束了,很多录友都在[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)里写下了自己的秋招总结,但今天这位录友很特殊,甚至我给她修改简历的时候我都“有点愁”。 +星球里不少录友秋招已经陆续结束了,很多录友都在[知识星球](https://programmercarl.com/other/kstar.html)里写下了自己的秋招总结,但今天这位录友很特殊,甚至我给她修改简历的时候我都“有点愁”。 他的秋招过程也是极其坎坷,**逼签、被养鱼最后收到感谢信、校招流程收到实习offer,还有数不清的简历挂……**,可能是太倒霉了,最后触底反弹,接到了百度的offer,虽然是白菜价,但真的很不错了。 diff --git "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\347\247\213\346\213\233\346\200\273\347\273\2233.md" "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\347\247\213\346\213\233\346\200\273\347\273\2233.md" index 895c1b8c38..05a677ed81 100644 --- "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\347\247\213\346\213\233\346\200\273\347\273\2233.md" +++ "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\347\247\213\346\213\233\346\200\273\347\273\2233.md" @@ -1,4 +1,4 @@ -

+

@@ -6,7 +6,7 @@ 其实无论社招,还是校招,心态都很重要,例如,别人那个一堆offer,自己陷入深深的焦虑。 面试分明感觉自己表现的不错,结果就是挂了。面试中遇到了面试官的否定,然后就开始自我怀疑,等等等。 -如果你也遇到这些问题,可以认真读完[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)里一位录友的总结,他是非科班,机械转码,今年5月份加入的星球,坚持打卡几个月,如果也获得自己心仪的offer,他的心路历程对大家会很有启发。 +如果你也遇到这些问题,可以认真读完[知识星球](https://programmercarl.com/other/kstar.html)里一位录友的总结,他是非科班,机械转码,今年5月份加入的星球,坚持打卡几个月,如果也获得自己心仪的offer,他的心路历程对大家会很有启发。 ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211121093438.png) diff --git "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\347\247\213\346\213\233\347\232\204\344\270\212\345\215\212\345\234\272.md" "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\347\247\213\346\213\233\347\232\204\344\270\212\345\215\212\345\234\272.md" index f404e61172..6c81757745 100644 --- "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\347\247\213\346\213\233\347\232\204\344\270\212\345\215\212\345\234\272.md" +++ "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\347\247\213\346\213\233\347\232\204\344\270\212\345\215\212\345\234\272.md" @@ -1,11 +1,11 @@

- + # 秋招上半场的总结 -八月份已经接近尾声,不少录友已经在[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) 已经总结了秋招的上半场。 +八月份已经接近尾声,不少录友已经在[知识星球](https://programmercarl.com/other/kstar.html) 已经总结了秋招的上半场。 ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210829214839.png) diff --git "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\347\247\213\346\213\233\350\277\233\350\241\214\344\270\255\347\232\204\350\277\267\350\214\253\344\270\216\347\204\246\350\231\221.md" "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\347\247\213\346\213\233\350\277\233\350\241\214\344\270\255\347\232\204\350\277\267\350\214\253\344\270\216\347\204\246\350\231\221.md" index 6083c7b15c..24e7760cb9 100644 --- "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\347\247\213\346\213\233\350\277\233\350\241\214\344\270\255\347\232\204\350\277\267\350\214\253\344\270\216\347\204\246\350\231\221.md" +++ "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\347\247\213\346\213\233\350\277\233\350\241\214\344\270\255\347\232\204\350\277\267\350\214\253\344\270\216\347\204\246\350\231\221.md" @@ -1,5 +1,5 @@

- + @@ -9,7 +9,7 @@ 特别是大三的同学吧,同时面临这找工作和考研两个方向的诱惑。 -一位录友就在[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)问了我这个问题: +一位录友就在[知识星球](https://programmercarl.com/other/kstar.html)问了我这个问题: ![](https://code-thinking-1253855093.cos.ap-guangzhou.myqcloud.com/pics/20210724183240.png) diff --git "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\350\213\261\350\257\255\345\210\260\345\272\225\351\207\215\344\270\215\351\207\215\350\246\201.md" "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\350\213\261\350\257\255\345\210\260\345\272\225\351\207\215\344\270\215\351\207\215\350\246\201.md" index 32e6a39b32..5ee7fc2dc0 100644 --- "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\350\213\261\350\257\255\345\210\260\345\272\225\351\207\215\344\270\215\351\207\215\350\246\201.md" +++ "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\350\213\261\350\257\255\345\210\260\345\272\225\351\207\215\344\270\215\351\207\215\350\246\201.md" @@ -1,11 +1,11 @@

- + # 对程序员来说,英语到底重不重要 -在[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)有一位录友问了我这么一个问题。 +在[知识星球](https://programmercarl.com/other/kstar.html)有一位录友问了我这么一个问题。 ![](https://gitee.com/programmercarl/pics/raw/master/pic1/20210605193955.png) diff --git "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\350\246\201\344\270\215\350\246\201\350\200\203\347\240\224.md" "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\350\246\201\344\270\215\350\246\201\350\200\203\347\240\224.md" index a5f2dfa079..180e5d13cb 100644 --- "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\350\246\201\344\270\215\350\246\201\350\200\203\347\240\224.md" +++ "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\350\246\201\344\270\215\350\246\201\350\200\203\347\240\224.md" @@ -1,11 +1,11 @@

- + # 到底要不要读研 -在[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)里讨论了一下关于要不要读研的问题。 +在[知识星球](https://programmercarl.com/other/kstar.html)里讨论了一下关于要不要读研的问题。 ![](https://gitee.com/programmercarl/pics/raw/master/pic1/20210613230829.png) diff --git "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\351\200\274\347\255\276.md" "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\351\200\274\347\255\276.md" index 90e4e67d3a..f75e364218 100644 --- "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\351\200\274\347\255\276.md" +++ "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\351\200\274\347\255\276.md" @@ -7,7 +7,7 @@ 如果是心仪的公司要求三天内签三方,我相信大家就没有被逼签的感觉了,哈哈哈 -[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)里很多录友都问我,XX公司又要逼签了,怎么办。 我在公众号也分享一下,希望对大家有所帮助。 +[知识星球](https://programmercarl.com/other/kstar.html)里很多录友都问我,XX公司又要逼签了,怎么办。 我在公众号也分享一下,希望对大家有所帮助。 ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211017093816.png) diff --git "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\351\235\236\347\247\221\347\217\2552021\347\247\213\346\213\233\346\200\273\347\273\223.md" "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\351\235\236\347\247\221\347\217\2552021\347\247\213\346\213\233\346\200\273\347\273\223.md" index c2c7ed3308..b92420addb 100644 --- "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\351\235\236\347\247\221\347\217\2552021\347\247\213\346\213\233\346\200\273\347\273\223.md" +++ "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\351\235\236\347\247\221\347\217\2552021\347\247\213\346\213\233\346\200\273\347\273\223.md" @@ -1,6 +1,6 @@

- + @@ -10,7 +10,7 @@ 其中一位录友写的很好,所以想分享出来 给公众号上的录友也看一看,相信对大家有所启发,特别是明年要找工作的录友,值得好好看一看。 -这篇总结首发在代码随想录[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)上,立刻就获得了60个赞,很多评论,我这里放出一个截图: +这篇总结首发在代码随想录[知识星球](https://programmercarl.com/other/kstar.html)上,立刻就获得了60个赞,很多评论,我这里放出一个截图: ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210929220903.png) diff --git "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\351\235\236\347\247\221\347\217\255\347\232\204\345\233\260\346\211\260.md" "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\351\235\236\347\247\221\347\217\255\347\232\204\345\233\260\346\211\260.md" index d5fea53283..470b233b59 100644 --- "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\351\235\236\347\247\221\347\217\255\347\232\204\345\233\260\346\211\260.md" +++ "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\351\235\236\347\247\221\347\217\255\347\232\204\345\233\260\346\211\260.md" @@ -1,11 +1,11 @@

- + # 非科班的困扰! -在[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) 里很多录友都是非科班转码的,也是要准备求职,或者准备明年秋招,非科班的录友其实对 准备找工作所需要的知识不太清楚,对其难度也不太清楚,所有总感觉准备起来心里没有底。 +在[知识星球](https://programmercarl.com/other/kstar.html) 里很多录友都是非科班转码的,也是要准备求职,或者准备明年秋招,非科班的录友其实对 准备找工作所需要的知识不太清楚,对其难度也不太清楚,所有总感觉准备起来心里没有底。 例如星球里有这位录友的提问: diff --git "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\351\235\242\350\257\225\344\270\255\345\217\221\346\225\243\346\200\247\351\227\256\351\242\230.md" "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\351\235\242\350\257\225\344\270\255\345\217\221\346\225\243\346\200\247\351\227\256\351\242\230.md" index 7fb9150f12..5cade944c1 100644 --- "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\351\235\242\350\257\225\344\270\255\345\217\221\346\225\243\346\200\247\351\227\256\351\242\230.md" +++ "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\351\235\242\350\257\225\344\270\255\345\217\221\346\225\243\346\200\247\351\227\256\351\242\230.md" @@ -1,11 +1,11 @@

- + # 面试中遇到发散性问题,应该怎么办? -这周在[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)有一位录友问了我这么一个问题,我感觉挺有代表性的,应该不少录友在面试中不论是社招还是校招都会遇到这一类的问题。 +这周在[知识星球](https://programmercarl.com/other/kstar.html)有一位录友问了我这么一个问题,我感觉挺有代表性的,应该不少录友在面试中不论是社招还是校招都会遇到这一类的问题。 问题如下: From 759175ac6fc72b63e3c4aa02e7b893951556146d Mon Sep 17 00:00:00 2001 From: youngyangyang04 <826123027@qq.com> Date: Tue, 22 Mar 2022 09:30:23 +0800 Subject: [PATCH 0446/3019] Update --- .DS_Store | Bin 8196 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 .DS_Store diff --git a/.DS_Store b/.DS_Store deleted file mode 100644 index 7794435bd6714aed6095604325ab6ffe84221748..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8196 zcmeHMU2GIp6u#fIv@>*|1GG|b$8K6szzU`1r~D<`KM+bOc3ZkFVA<^sbYMDDcV^o{ zC8_Z*g7~0DeNjN;ix1VP7!wtvi3asattOIaj7FnRKFACD;<m0CQ8r?%*`* zup!Jqn1L_@VFtnsgc#mK>qC@oE@Ocl6VhKgsPK;f zB>54*zv!9H0lrT(kg-6H3F*61pW^g@z!kv}1Hzs3QEpB$7RWIng*$_AX9z|{a6*AU zI{8I?bB36ZVHsv1%)s;vaQet>kY$*|QrDl~QTewYB!ubsmP_3Yqqra9{olWg+mlT+n{GUw!6>BxFmbE zVwVEl+2`1MGX~dp^*L5{z;=7J1${}YFKZ<|qu#RO<_Uw^irv19V_AD0*W}%FCp=@s z+c#eT{C4F9d>fSP!^y{nJ6w>vh?lONbu4&8|RHg%m zmHORkhfBfBT2dIUR;$&HV*~|7b45$7x?bVg$!AiU;v1PT@4p;3+(h7x5C#;XGc$n|KQs@D4u2 zC47d@@il(J&-ewu;tyQKU-(*}`EPl8aOHV4$};qPPqUrg~a?_**LUMB<#)$$zerqZ#K$YPAhoU&S> zu&z*-$r>?ej;P+Hu9USFMJo{1s>o{MrL0MQRb3mYRkWn6<%w!lWTPT$5S7j9R?b5$ zUsQE9rYIWoE0M-XGv|^f6Uxsu`LjI>%9Uv=l#lj1Ssi`Gb+E&<$vniKWM>KOAFzw; zOLm$4$bMs22=4`ibPeTLfog0(4BN2-yU>DG>_Zp2(L-oAaM(xuF?h&gm{5NL591L$ zhR5*)p2jnH7SG`$w)*YO6S|2@2qi-i7<@G-u?1it6^4^W#!bE~N5N?f6* zX=ombXKc%{kB~0smvguYWuAEFGJgJVp8fa#n=rEQmBS2#8ThXmKz>uase!C#ThsVi zJ4*K From 77aa72b984465ac28006cc9c5765ecb42681811e Mon Sep 17 00:00:00 2001 From: youngyangyang04 <826123027@qq.com> Date: Wed, 23 Mar 2022 16:13:01 +0800 Subject: [PATCH 0447/3019] Update --- README.md | 2 +- "problems/0028.\345\256\236\347\216\260strStr.md" | 2 +- "problems/0494.\347\233\256\346\240\207\345\222\214.md" | 3 +-- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 0bf7fcdf43..b8ff87dafd 100644 --- a/README.md +++ b/README.md @@ -263,7 +263,7 @@ 3. [二叉树:听说递归能做的,栈也能做!](./problems/二叉树的迭代遍历.md) 4. [二叉树:前中后序迭代方式的写法就不能统一一下么?](./problems/二叉树的统一迭代法.md) 5. [二叉树:层序遍历登场!](./problems/0102.二叉树的层序遍历.md) -6. [二叉树:你真的会翻转二叉树么?](./problems/0226.翻转二叉树.md) +6. [二叉树:你真的会翻转二叉树么?](./problems/0226.翻转二叉树.md) 7. [本周小结!(二叉树)](./problems/周总结/20200927二叉树周末总结.md) 8. [二叉树:我对称么?](./problems/0101.对称二叉树.md) 9. [二叉树:看看这些树的最大深度](./problems/0104.二叉树的最大深度.md) diff --git "a/problems/0028.\345\256\236\347\216\260strStr.md" "b/problems/0028.\345\256\236\347\216\260strStr.md" index bbe5b80fae..854789ee0c 100644 --- "a/problems/0028.\345\256\236\347\216\260strStr.md" +++ "b/problems/0028.\345\256\236\347\216\260strStr.md" @@ -255,7 +255,7 @@ void getNext(int* next, const string& s) 1. 初始化: -定义两个指针i和j,j指向前缀起始位置,i指向后缀起始位置。 +定义两个指针i和j,j指向前缀末尾位置,i指向后缀末尾位置。 然后还要对next数组进行初始化赋值,如下: diff --git "a/problems/0494.\347\233\256\346\240\207\345\222\214.md" "b/problems/0494.\347\233\256\346\240\207\345\222\214.md" index 47d0784ee4..df667a8513 100644 --- "a/problems/0494.\347\233\256\346\240\207\345\222\214.md" +++ "b/problems/0494.\347\233\256\346\240\207\345\222\214.md" @@ -156,11 +156,10 @@ dp[j] 表示:填满j(包括j)这么大容积的包,有dp[j]种方法 有哪些来源可以推出dp[j]呢? -填满容量为j - nums[i]的背包,有dp[j - nums[i]]种方法。 +不考虑nums[i]的情况下,填满容量为j - nums[i]的背包,有dp[j - nums[i]]种方法。 那么只要搞到nums[i]的话,凑成dp[j]就有dp[j - nums[i]] 种方法。 - 例如:dp[j],j 为5, * 已经有一个1(nums[i]) 的话,有 dp[4]种方法 凑成 dp[5]。 From cbe5403e45e009f5d906fa168ff5aee086043e57 Mon Sep 17 00:00:00 2001 From: berserk-112 <40333359+berserk-112@users.noreply.github.com> Date: Thu, 24 Mar 2022 11:23:36 +0800 Subject: [PATCH 0448/3019] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 0bf7fcdf43..5dfc04fd8e 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ - +贪心:[贪心算法:分发糖果](./problems/0135.分发糖果.md) [贪心算法:根据身高重建队列](./problems/0406.根据身高重建队列.md) 👉 推荐 [在线阅读](http://programmercarl.com/) (Github在国内访问经常不稳定) 👉 推荐 [Gitee同步](https://gitee.com/programmercarl/leetcode-master) From 5c403d9e589203d8ee7c2beff3c863accb3bce94 Mon Sep 17 00:00:00 2001 From: berserk-112 <40333359+berserk-112@users.noreply.github.com> Date: Fri, 25 Mar 2022 11:08:45 +0800 Subject: [PATCH 0449/3019] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 5dfc04fd8e..a0f4863e0f 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -贪心:[贪心算法:分发糖果](./problems/0135.分发糖果.md) [贪心算法:根据身高重建队列](./problems/0406.根据身高重建队列.md) +贪心:[贪心算法:分发糖果](./problems/0135.分发糖果.md) [贪心算法:根据身高重建队列](./problems/0406.根据身高重建队列.md) [贪心算法:我要监控二叉树!](./problems/0968.监控二叉树.md) 👉 推荐 [在线阅读](http://programmercarl.com/) (Github在国内访问经常不稳定) 👉 推荐 [Gitee同步](https://gitee.com/programmercarl/leetcode-master) From 74ac8c39c1248afd5d99604b7a20e27c67625679 Mon Sep 17 00:00:00 2001 From: Guang-Hou <87743934+Guang-Hou@users.noreply.github.com> Date: Fri, 25 Mar 2022 15:49:48 -0400 Subject: [PATCH 0450/3019] =?UTF-8?q?Update=200134.=E5=8A=A0=E6=B2=B9?= =?UTF-8?q?=E7=AB=99.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...4.\345\212\240\346\262\271\347\253\231.md" | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git "a/problems/0134.\345\212\240\346\262\271\347\253\231.md" "b/problems/0134.\345\212\240\346\262\271\347\253\231.md" index ca95af6764..f73ab9f471 100644 --- "a/problems/0134.\345\212\240\346\262\271\347\253\231.md" +++ "b/problems/0134.\345\212\240\346\262\271\347\253\231.md" @@ -239,6 +239,30 @@ class Solution { ### Python ```python +# 解法1 +class Solution: + def canCompleteCircuit(self, gas: List[int], cost: List[int]) -> int: + n = len(gas) + cur_sum = 0 + min_sum = float('inf') + + for i in range(n): + cur_sum += gas[i] - cost[i] + min_sum = min(min_sum, cur_sum) + + if cur_sum < 0: return -1 + if min_sum >= 0: return 0 + + for j in range(n - 1, 0, -1): + min_sum += gas[j] - cost[j] + if min_sum >= 0: + return j + + return -1 +``` + +```python +# 解法2 class Solution: def canCompleteCircuit(self, gas: List[int], cost: List[int]) -> int: start = 0 From dd8bea8335794b48969ae89572aec8c7aec35231 Mon Sep 17 00:00:00 2001 From: SianXiaoCHN Date: Fri, 25 Mar 2022 20:23:39 -0500 Subject: [PATCH 0451/3019] =?UTF-8?q?0112.=E8=B7=AF=E5=BE=84=E6=80=BB?= =?UTF-8?q?=E5=92=8C=20python=20=E7=B2=BE=E7=AE=80=E9=80=92=E5=BD=92?= =?UTF-8?q?=E5=9B=9E=E6=BA=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 0112.路径总和 python 为113精简递归回溯 --- ...2.\350\267\257\345\276\204\346\200\273\345\222\214.md" | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git "a/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" "b/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" index 5db36687a9..03ec1bb7b1 100644 --- "a/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" +++ "b/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" @@ -504,17 +504,13 @@ class solution: if cur_node.left: path.append(cur_node.left.val) - remain -= cur_node.left.val - traversal(cur_node.left, remain) + traversal(cur_node.left, remain-cur_node.left.val) path.pop() - remain += cur_node.left.val if cur_node.right: path.append(cur_node.right.val) - remain -= cur_node.right.val - traversal(cur_node.right, remain) + traversal(cur_node.right, remain-cur_node.left.val) path.pop() - remain += cur_node.right.val result, path = [], [] if not root: From f8392906ac8463504e2707f3762e3fc39f909782 Mon Sep 17 00:00:00 2001 From: SianXiaoCHN Date: Fri, 25 Mar 2022 20:25:06 -0500 Subject: [PATCH 0452/3019] =?UTF-8?q?0112.=E8=B7=AF=E5=BE=84=E6=80=BB?= =?UTF-8?q?=E5=92=8C=20python=20=E7=B2=BE=E7=AE=80=E9=80=92=E5=BD=92?= =?UTF-8?q?=E8=BF=94=E5=9B=9E=E6=9D=A1=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 0112.路径总和 python 精简113递归返回条件 --- ....\350\267\257\345\276\204\346\200\273\345\222\214.md" | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git "a/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" "b/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" index 03ec1bb7b1..ff68273924 100644 --- "a/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" +++ "b/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" @@ -496,11 +496,10 @@ class solution: def pathsum(self, root: treenode, targetsum: int) -> list[list[int]]: def traversal(cur_node, remain): - if not cur_node.left and not cur_node.right and remain == 0: - result.append(path[:]) - return - - if not cur_node.left and not cur_node.right: return + if not cur_node.left and not cur_node.right: + if remain == 0: + result.append(path[:]) + return if cur_node.left: path.append(cur_node.left.val) From be6cb9f13086cd8ea7a82a98226b02666f10cdb3 Mon Sep 17 00:00:00 2001 From: SianXiaoCHN Date: Fri, 25 Mar 2022 20:35:54 -0500 Subject: [PATCH 0453/3019] =?UTF-8?q?0112.=E8=B7=AF=E5=BE=84=E6=80=BB?= =?UTF-8?q?=E5=92=8C=20python=20113=E6=B7=BB=E5=8A=A0=E8=BF=AD=E4=BB=A3?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 0112.路径总和 python 113添加迭代法 --- ...57\345\276\204\346\200\273\345\222\214.md" | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git "a/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" "b/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" index ff68273924..1904e92bd7 100644 --- "a/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" +++ "b/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" @@ -519,6 +519,30 @@ class solution: return result ``` +**迭代法,用第二个队列保存目前的总和与路径** +```python +class Solution: + def pathSum(self, root: Optional[TreeNode], targetSum: int) -> List[List[int]]: + if not root: + return [] + que, temp = deque([root]), deque([(root.val, [root.val])]) + result = [] + while que: + for _ in range(len(que)): + node = que.popleft() + value, path = temp.popleft() + if (not node.left) and (not node.right): + if value == targetSum: + result.append(path) + if node.left: + que.append(node.left) + temp.append((node.left.val+value, path+[node.left.val])) + if node.right: + que.append(node.right) + temp.append((node.right.val+value, path+[node.right.val])) + return result +``` + ## go 112. 路径总和 From 9dbc51455d7f13b83fe63d30a477d89fd1e0c33a Mon Sep 17 00:00:00 2001 From: xuerbujia <83055661+xuerbujia@users.noreply.github.com> Date: Sat, 26 Mar 2022 10:03:04 +0800 Subject: [PATCH 0454/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880141.?= =?UTF-8?q?=E7=8E=AF=E5=BD=A2=E9=93=BE=E8=A1=A8.md=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0go=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...16\257\345\275\242\351\223\276\350\241\250.md" | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git "a/problems/0141.\347\216\257\345\275\242\351\223\276\350\241\250.md" "b/problems/0141.\347\216\257\345\275\242\351\223\276\350\241\250.md" index 0712a2a2a5..ddd83c9422 100644 --- "a/problems/0141.\347\216\257\345\275\242\351\223\276\350\241\250.md" +++ "b/problems/0141.\347\216\257\345\275\242\351\223\276\350\241\250.md" @@ -106,6 +106,21 @@ class Solution: ## Go ```go +func hasCycle(head *ListNode) bool { + if head==nil{ + return false + } //空链表一定不会有环 + fast:=head + slow:=head //快慢指针 + for fast.Next!=nil&&fast.Next.Next!=nil{ + fast=fast.Next.Next + slow=slow.Next + if fast==slow{ + return true //快慢指针相遇则有环 + } + } + return false +} ``` ### JavaScript From 1fa83c2b3f6b1eded21f2f5313be38b1a72ff2e5 Mon Sep 17 00:00:00 2001 From: xuerbujia <83055661+xuerbujia@users.noreply.github.com> Date: Sat, 26 Mar 2022 10:13:44 +0800 Subject: [PATCH 0455/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880189.?= =?UTF-8?q?=E8=BD=AE=E8=BD=AC=E6=95=B0=E7=BB=84.md=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0go=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\227\213\350\275\254\346\225\260\347\273\204.md" | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git "a/problems/0189.\346\227\213\350\275\254\346\225\260\347\273\204.md" "b/problems/0189.\346\227\213\350\275\254\346\225\260\347\273\204.md" index bbe152a267..8e39d253ee 100644 --- "a/problems/0189.\346\227\213\350\275\254\346\225\260\347\273\204.md" +++ "b/problems/0189.\346\227\213\350\275\254\346\225\260\347\273\204.md" @@ -124,6 +124,19 @@ class Solution: ## Go ```go +func rotate(nums []int, k int) { + l:=len(nums) + index:=l-k%l + reverse(nums) + reverse(nums[:l-index]) + reverse(nums[l-index:]) +} +func reverse(nums []int){ + l:=len(nums) + for i:=0;i Date: Sat, 26 Mar 2022 21:47:35 -0500 Subject: [PATCH 0456/3019] =?UTF-8?q?=E5=A2=9E=E5=8A=A0python=E8=A7=A3?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...25\350\257\215\346\216\245\351\276\231.md" | 24 ++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git "a/problems/0127.\345\215\225\350\257\215\346\216\245\351\276\231.md" "b/problems/0127.\345\215\225\350\257\215\346\216\245\351\276\231.md" index 407596c0d4..584bcb2a15 100644 --- "a/problems/0127.\345\215\225\350\257\215\346\216\245\351\276\231.md" +++ "b/problems/0127.\345\215\225\350\257\215\346\216\245\351\276\231.md" @@ -134,7 +134,29 @@ public int ladderLength(String beginWord, String endWord, List wordList) ``` ## Python - +``` +class Solution: + def ladderLength(self, beginWord: str, endWord: str, wordList: List[str]) -> int: + wordSet = set(wordList) + if len(wordSet)== 0 or endWord not in wordSet: + return 0 + mapping = {beginWord:1} + queue = deque([beginWord]) + while queue: + word = queue.popleft() + path = mapping[word] + for i in range(len(word)): + word_list = list(word) + for j in range(26): + word_list[i] = chr(ord('a')+j) + newWord = "".join(word_list) + if newWord == endWord: + return path+1 + if newWord in wordSet and newWord not in mapping: + mapping[newWord] = path+1 + queue.append(newWord) + return 0 +``` ## Go ## JavaScript From 6d1746db85853e3714b194c659335a71a69d2d0b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E5=91=98Carl?= Date: Mon, 28 Mar 2022 09:55:29 +0800 Subject: [PATCH 0457/3019] Update README.md --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index a0f4863e0f..78813ac3a0 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,3 @@ -贪心:[贪心算法:分发糖果](./problems/0135.分发糖果.md) [贪心算法:根据身高重建队列](./problems/0406.根据身高重建队列.md) [贪心算法:我要监控二叉树!](./problems/0968.监控二叉树.md) 👉 推荐 [在线阅读](http://programmercarl.com/) (Github在国内访问经常不稳定) 👉 推荐 [Gitee同步](https://gitee.com/programmercarl/leetcode-master) From 0296ac0a0e4e0b7f0b63ded21004ccf24f755a60 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Mon, 28 Mar 2022 14:33:49 +0800 Subject: [PATCH 0458/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880017.?= =?UTF-8?q?=E7=94=B5=E8=AF=9D=E5=8F=B7=E7=A0=81=E7=9A=84=E5=AD=97=E6=AF=8D?= =?UTF-8?q?=E7=BB=84=E5=90=88.md=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typesr?= =?UTF-8?q?ipt=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...27\346\257\215\347\273\204\345\220\210.md" | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git "a/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" "b/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" index 7040182f3b..9413656515 100644 --- "a/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" +++ "b/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" @@ -420,6 +420,40 @@ var letterCombinations = function(digits) { }; ``` +## TypeScript + +```typescript +function letterCombinations(digits: string): string[] { + if (digits === '') return []; + const strMap: { [index: string]: string[] } = { + 1: [], + 2: ['a', 'b', 'c'], + 3: ['d', 'e', 'f'], + 4: ['g', 'h', 'i'], + 5: ['j', 'k', 'l'], + 6: ['m', 'n', 'o'], + 7: ['p', 'q', 'r', 's'], + 8: ['t', 'u', 'v'], + 9: ['w', 'x', 'y', 'z'], + } + const resArr: string[] = []; + function backTracking(digits: string, curIndex: number, route: string[]): void { + if (curIndex === digits.length) { + resArr.push(route.join('')); + return; + } + let tempArr: string[] = strMap[digits[curIndex]]; + for (let i = 0, length = tempArr.length; i < length; i++) { + route.push(tempArr[i]); + backTracking(digits, curIndex + 1, route); + route.pop(); + } + } + backTracking(digits, 0, []); + return resArr; +}; +``` + ## C ```c From 4959bd4c8aa78d401f5a1f14c2d267a4d046baf5 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Mon, 28 Mar 2022 17:15:46 +0800 Subject: [PATCH 0459/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880039.?= =?UTF-8?q?=E7=BB=84=E5=90=88=E6=80=BB=E5=92=8C.md=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...04\345\220\210\346\200\273\345\222\214.md" | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git "a/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" "b/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" index 7a2084dd19..98b37b8467 100644 --- "a/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" +++ "b/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" @@ -392,7 +392,34 @@ var combinationSum = function(candidates, target) { }; ``` +## TypeScript + +```typescript +function combinationSum(candidates: number[], target: number): number[][] { + const resArr: number[][] = []; + function backTracking( + candidates: number[], target: number, + startIndex: number, route: number[], curSum: number + ): void { + if (curSum > target) return; + if (curSum === target) { + resArr.push(route.slice()); + return + } + for (let i = startIndex, length = candidates.length; i < length; i++) { + let tempVal: number = candidates[i]; + route.push(tempVal); + backTracking(candidates, target, i, route, curSum + tempVal); + route.pop(); + } + } + backTracking(candidates, target, 0, [], 0); + return resArr; +}; +``` + ## C + ```c int* path; int pathTop; From a021470215aa859a4d5b0e9fe48dd775e6c0ed51 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Tue, 29 Mar 2022 14:38:19 +0800 Subject: [PATCH 0460/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880040.?= =?UTF-8?q?=E7=BB=84=E5=90=88=E6=80=BB=E5=92=8CII.md=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\345\220\210\346\200\273\345\222\214II.md" | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git "a/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" "b/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" index 49acb8d63f..de13e031dd 100644 --- "a/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" +++ "b/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" @@ -532,6 +532,7 @@ var combinationSum2 = function(candidates, target) { }; ``` **使用used去重** + ```js var combinationSum2 = function(candidates, target) { let res = []; @@ -562,6 +563,37 @@ var combinationSum2 = function(candidates, target) { }; ``` +## TypeScript + +```typescript +function combinationSum2(candidates: number[], target: number): number[][] { + candidates.sort((a, b) => a - b); + const resArr: number[][] = []; + function backTracking( + candidates: number[], target: number, + curSum: number, startIndex: number, route: number[] + ) { + if (curSum > target) return; + if (curSum === target) { + resArr.push(route.slice()); + return; + } + for (let i = startIndex, length = candidates.length; i < length; i++) { + if (i > startIndex && candidates[i] === candidates[i - 1]) { + continue; + } + let tempVal: number = candidates[i]; + route.push(tempVal); + backTracking(candidates, target, curSum + tempVal, i + 1, route); + route.pop(); + + } + } + backTracking(candidates, target, 0, 0, []); + return resArr; +}; +``` + ## C ```c From c569dc505b59552f1435cecc1b584d88417a4cac Mon Sep 17 00:00:00 2001 From: zhujs Date: Tue, 29 Mar 2022 23:33:34 +0800 Subject: [PATCH 0461/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200332.=E9=87=8D?= =?UTF-8?q?=E6=96=B0=E5=AE=89=E6=8E=92=E8=A1=8C=E7=A8=8B=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 --- ...11\346\216\222\350\241\214\347\250\213.md" | 72 +++++++++++++++++++ 1 file changed, 72 insertions(+) diff --git "a/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" "b/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" index 01f81c4dc6..e65786c615 100644 --- "a/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" +++ "b/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" @@ -568,5 +568,77 @@ for line in tickets { } ``` +### Go +```Go + +// 先排序,然后找到第一条路径即可返回 +func findItinerary(tickets [][]string) []string { + var path []string // 用来保存搜索的路径 + data := make(map[string]ticketSlice) // 用来保存tickets排序后的结果 + + var search func(airport string) bool + search = func(airport string) bool { + if len(path) == len(tickets) { + path = append(path, airport) + return true + } + to := data[airport] + for _, item := range to { + if item.Count == 0 { + // 已用完 + continue + } + + path = append(path, airport) + item.Count-- + if search(item.To) { return true } + item.Count++ + path = path[:len(path) - 1] + } + + return false + } + + // 排序 + // 感觉这段代码有点啰嗦,不知道能不能简化一下 + tmp := make(map[string]map[string]int) + for _, ticket := range tickets { + if to, ok := tmp[ticket[0]]; ok { + if _, ok2 := to[ticket[1]]; ok2 { + to[ticket[1]]++ + } else { + to[ticket[1]] = 1 + } + } else { + tmp[ticket[0]] = map[string]int{ + ticket[1]: 1, + } + } + } + for from, to := range tmp { + var tmp ticketSlice + for to, num := range to { + tmp = append(tmp, &ticketStat{To: to, Count: num}) + } + sort.Sort(tmp) + data[from] = tmp + } + + search("JFK") + return path +} + +type ticketStat struct { + To string + Count int +} +type ticketSlice []*ticketStat + +func (p ticketSlice) Len() int { return len(p) } +func (p ticketSlice) Less(i, j int) bool { return strings.Compare(p[i].To, p[j].To) == -1 } +func (p ticketSlice) Swap(i, j int) { p[i], p[j] = p[j], p[i] } + +``` + -----------------------

From f0b771af5c8d1fe5d5a298f00a2dbc05a1e23b42 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Wed, 30 Mar 2022 16:40:18 +0800 Subject: [PATCH 0462/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880131.?= =?UTF-8?q?=E5=88=86=E5=89=B2=E5=9B=9E=E6=96=87=E4=B8=B2.md=EF=BC=89?= =?UTF-8?q?=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...62\345\233\236\346\226\207\344\270\262.md" | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git "a/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" "b/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" index f50f1c1d11..10b747cb36 100644 --- "a/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" +++ "b/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" @@ -450,6 +450,38 @@ var partition = function(s) { }; ``` +## TypeScript + +```typescript +function partition(s: string): string[][] { + function isPalindromeStr(s: string, left: number, right: number): boolean { + while (left < right) { + if (s[left++] !== s[right--]) { + return false; + } + } + return true; + } + function backTracking(s: string, startIndex: number, route: string[]): void { + let length: number = s.length; + if (length === startIndex) { + resArr.push(route.slice()); + return; + } + for (let i = startIndex; i < length; i++) { + if (isPalindromeStr(s, startIndex, i)) { + route.push(s.slice(startIndex, i + 1)); + backTracking(s, i + 1, route); + route.pop(); + } + } + } + const resArr: string[][] = []; + backTracking(s, 0, []); + return resArr; +}; +``` + ## C ```c From 7ee6bdbbfac43194c2ce3d5feb1f322824c3c7c7 Mon Sep 17 00:00:00 2001 From: h-yx-blog <2041290842@qq.com> Date: Thu, 31 Mar 2022 08:59:58 +0800 Subject: [PATCH 0463/3019] =?UTF-8?q?416=E5=88=86=E5=89=B2=E7=AD=89?= =?UTF-8?q?=E5=92=8C=E5=AD=90=E9=9B=86java=E7=89=88=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 --- ...11\345\222\214\345\255\220\351\233\206.md" | 69 +++++++++++++++++++ 1 file changed, 69 insertions(+) diff --git "a/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" "b/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" index c8d9bc0452..b24fb365f4 100644 --- "a/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" +++ "b/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" @@ -208,6 +208,75 @@ class Solution { } ``` +```java +public class Solution { + public static void main(String[] args) { + int num[] = {1,5,11,5}; + canPartition(num); + + } + public static boolean canPartition(int[] nums) { + int len = nums.length; + // 题目已经说非空数组,可以不做非空判断 + int sum = 0; + for (int num : nums) { + sum += num; + } + // 特判:如果是奇数,就不符合要求 + if ((sum %2 ) != 0) { + return false; + } + + int target = sum / 2; //目标背包容量 + // 创建二维状态数组,行:物品索引,列:容量(包括 0) + /* + dp[i][j]表示从数组的 [0, i] 这个子区间内挑选一些正整数 + 每个数只能用一次,使得这些数的和恰好等于 j。 + */ + boolean[][] dp = new boolean[len][target + 1]; + + // 先填表格第 0 行,第 1 个数只能让容积为它自己的背包恰好装满 (这里的dp[][]数组的含义就是“恰好”,所以就算容积比它大的也不要) + if (nums[0] <= target) { + dp[0][nums[0]] = true; + } + // 再填表格后面几行 + //外层遍历物品 + for (int i = 1; i < len; i++) { + //内层遍历背包 + for (int j = 0; j <= target; j++) { + // 直接从上一行先把结果抄下来,然后再修正 + dp[i][j] = dp[i - 1][j]; + + //如果某个物品单独的重量恰好就等于背包的重量,那么也是满足dp数组的定义的 + if (nums[i] == j) { + dp[i][j] = true; + continue; + } + //如果某个物品的重量小于j,那就可以看该物品是否放入背包 + //dp[i - 1][j]表示该物品不放入背包,如果在 [0, i - 1] 这个子区间内已经有一部分元素,使得它们的和为 j ,那么 dp[i][j] = true; + //dp[i - 1][j - nums[i]]表示该物品放入背包。如果在 [0, i - 1] 这个子区间内就得找到一部分元素,使得它们的和为 j - nums[i]。 + if (nums[i] < j) { + dp[i][j] = dp[i - 1][j] || dp[i - 1][j - nums[i]]; + } + } + } + for (int i = 0; i < len; i++) { + for (int j = 0; j <= target; j++) { + System.out.print(dp[i][j]+" "); + } + System.out.println(); + } + return dp[len - 1][target]; + } +} +//dp数组的打印结果 +false true false false false false false false false false false false +false true false false false true true false false false false false +false true false false false true true false false false false true +false true false false false true true false false false true true +``` + + 二维数组版本(易于理解): ```Java class Solution { From 00dc57faaca1a77fd7c371f2975df5939a7edb0c Mon Sep 17 00:00:00 2001 From: MoonLight-Sherry <3397446353@qq.com> Date: Thu, 31 Mar 2022 10:34:34 +0800 Subject: [PATCH 0464/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=BA=860509.?= =?UTF-8?q?=E6=96=90=E6=B3=A2=E9=82=A3=E5=A5=91=E6=95=B0=E5=88=97Rust?= =?UTF-8?q?=E4=B8=A4=E7=A7=8D=E8=A7=A3=E6=B3=95=E7=9A=84=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...42\351\202\243\345\245\221\346\225\260.md" | 25 ++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git "a/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" "b/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" index c6ce76c0cd..e60b8a9e5e 100644 --- "a/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" +++ "b/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" @@ -277,7 +277,30 @@ int fib(int n){ return fib(n-1) + fib(n-2); } ``` +### Rust +动态规划: +```Rust +pub fn fib(n: i32) -> i32 { + let n = n as usize; + let mut dp = vec![0; 31]; + dp[1] = 1; + for i in 2..=n { + dp[i] = dp[i - 1] + dp[i - 2]; + } + dp[n] +} +``` - +递归实现: +```Rust +pub fn fib(n: i32) -> i32 { + //若n小于等于1,返回n + f n <= 1 { + return n; + } + //否则返回fib(n-1) + fib(n-2) + return fib(n - 1) + fib(n - 2); +} +``` -----------------------
From b6688d7a8949694c2988d48c79f4ebd75d5229ed Mon Sep 17 00:00:00 2001 From: Qianzhengjun <55390356+Qianzhengjun@users.noreply.github.com> Date: Thu, 31 Mar 2022 11:37:47 +0800 Subject: [PATCH 0465/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=BA=860844.=20?= =?UTF-8?q?=E6=AF=94=E8=BE=83=E5=90=AB=E9=80=80=E6=A0=BC=E7=9A=84=E5=AD=97?= =?UTF-8?q?=E7=AC=A6=E4=B8=B2=E5=8F=8C=E6=8C=87=E9=92=88=E6=96=B9=E6=B3=95?= =?UTF-8?q?=E7=9A=84Java=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...04\345\255\227\347\254\246\344\270\262.md" | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git "a/problems/0844.\346\257\224\350\276\203\345\220\253\351\200\200\346\240\274\347\232\204\345\255\227\347\254\246\344\270\262.md" "b/problems/0844.\346\257\224\350\276\203\345\220\253\351\200\200\346\240\274\347\232\204\345\255\227\347\254\246\344\270\262.md" index 00d52e42e2..0d83d425de 100644 --- "a/problems/0844.\346\257\224\350\276\203\345\220\253\351\200\200\346\240\274\347\232\204\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/0844.\346\257\224\350\276\203\345\220\253\351\200\200\346\240\274\347\232\204\345\255\227\347\254\246\344\270\262.md" @@ -185,6 +185,36 @@ class Solution { } ``` +双指针: + +```java +class Solution { +public static boolean backspaceCompare(String s, String t) { + char[] sarray = s.toCharArray(); + char[] tarray = t.toCharArray(); + return generate(sarray).equals(generate(tarray)); + } + public static String generate(char[] a){ + int slow = -1; + int fast = 0; + if(a.length == 1){ + return new String(a); + } else{ + for(fast = 0; fast < a.length; fast++){ + if(a[fast] != '#') + a[++slow] = a[fast]; + else{ + if(slow >= 0) + slow--; + } + } + return new String(a,0,slow + 1); + } + } +} +``` + + ### python From 6259a0e31769e1dcba1c54b20af6134ed6107120 Mon Sep 17 00:00:00 2001 From: youngyangyang04 <826123027@qq.com> Date: Thu, 31 Mar 2022 15:09:10 +0800 Subject: [PATCH 0466/3019] remote $ --- ...36\346\226\207\345\255\220\344\270\262.md" | 10 ++--- ...73\351\231\244\345\205\203\347\264\240.md" | 16 ++++---- .../0028.\345\256\236\347\216\260strStr.md" | 4 +- ...2.\346\216\245\351\233\250\346\260\264.md" | 8 ++-- ...47\345\255\220\345\272\217\345\222\214.md" | 12 +++--- ...01\350\247\204\345\210\222\357\274\211.md" | 4 +- ...15\345\220\214\350\267\257\345\276\204.md" | 14 +++---- ...\345\220\214\350\267\257\345\276\204II.md" | 4 +- ...01\350\247\204\345\210\222\357\274\211.md" | 8 ++-- ...25\350\257\215\346\213\206\345\210\206.md" | 10 ++--- ...14\347\232\204\345\215\225\350\257\215.md" | 8 ++-- ...13\350\275\254\346\225\260\347\273\204.md" | 4 +- ...04\345\255\220\346\225\260\347\273\204.md" | 16 ++++---- ...02\347\202\271\344\270\252\346\225\260.md" | 12 +++--- ...15\345\274\202\344\275\215\350\257\215.md" | 4 +- ...3.\347\247\273\345\212\250\351\233\266.md" | 2 +- ...64\346\225\260\346\213\206\345\210\206.md" | 4 +- ...04\347\232\204\344\272\244\351\233\206.md" | 2 +- ...15\345\273\272\351\230\237\345\210\227.md" | 10 ++--- ...15\345\217\240\345\214\272\351\227\264.md" | 4 +- ...4.\347\233\256\346\240\207\345\222\214.md" | 4 +- ...42\351\202\243\345\245\221\346\225\260.md" | 12 +++--- ...27\347\232\204\344\270\252\346\225\260.md" | 6 +-- ...53\346\211\213\347\273\255\350\264\271.md" | 12 +++--- ...17\346\227\245\346\270\251\345\272\246.md" | 10 ++--- ...71\347\210\254\346\245\274\346\242\257.md" | 8 ++-- ...04\345\255\227\347\254\246\344\270\262.md" | 16 ++++---- ...\345\272\217\346\225\260\347\273\204II.md" | 16 ++++---- ...77\346\214\211\351\224\256\345\205\245.md" | 4 +- ...04\347\232\204\345\271\263\346\226\271.md" | 4 +- ...\347\232\204\351\207\215\351\207\217II.md" | 4 +- ...57\345\244\232\345\244\247\357\274\237.md" | 18 ++++----- ...50\350\277\231\351\207\214\357\274\201.md" | 40 +++++++++---------- ...77\346\215\242\347\251\272\346\240\274.md" | 6 +-- ...30\346\200\273\347\273\223\347\257\207.md" | 32 +++++++-------- ...06\350\256\272\345\237\272\347\241\200.md" | 2 +- ...07\351\222\210\346\200\273\347\273\223.md" | 16 ++++---- ...36\346\272\257\346\200\273\347\273\223.md" | 12 +++--- ...00\347\247\215\345\206\231\346\263\225.md" | 6 +-- ...46\344\270\262\346\200\273\347\273\223.md" | 6 +-- ...04\346\200\273\347\273\223\347\257\207.md" | 12 +++--- ...06\350\256\262\350\247\243\357\274\211.md" | 8 ++-- ...50\345\272\223\345\207\275\346\225\260.md" | 2 +- ...32\351\207\215\350\203\214\345\214\205.md" | 4 +- ...06\350\256\272\345\237\272\347\241\200.md" | 4 +- 45 files changed, 210 insertions(+), 210 deletions(-) diff --git "a/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" "b/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" index 8b3af3bbde..eaebb5ab4d 100644 --- "a/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" +++ "b/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" @@ -38,7 +38,7 @@ 两层for循环,遍历区间起始位置和终止位置,然后判断这个区间是不是回文。 -时间复杂度:$O(n^3)$ +时间复杂度:O(n^3) ## 动态规划 @@ -205,8 +205,8 @@ public: ``` -* 时间复杂度:$O(n^2)$ -* 空间复杂度:$O(n^2)$ +* 时间复杂度:O(n^2) +* 空间复杂度:O(n^2) ## 双指针 @@ -253,8 +253,8 @@ public: ``` -* 时间复杂度:$O(n^2)$ -* 空间复杂度:$O(1)$ +* 时间复杂度:O(n^2) +* 空间复杂度:O(1) diff --git "a/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" "b/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" index 3a776837a7..8d6ca5022d 100644 --- "a/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" +++ "b/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" @@ -11,7 +11,7 @@ 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。 -不要使用额外的数组空间,你必须仅使用 $O(1)$ 额外空间并**原地**修改输入数组。 +不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并**原地**修改输入数组。 元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。 @@ -42,7 +42,7 @@ ![27.移除元素-暴力解法](https://tva1.sinaimg.cn/large/008eGmZEly1gntrc7x9tjg30du09m1ky.gif) -很明显暴力解法的时间复杂度是$O(n^2)$,这道题目暴力解法在leetcode上是可以过的。 +很明显暴力解法的时间复杂度是O(n^2),这道题目暴力解法在leetcode上是可以过的。 代码如下: @@ -68,8 +68,8 @@ public: }; ``` -* 时间复杂度:$O(n^2)$ -* 空间复杂度:$O(1)$ +* 时间复杂度:O(n^2) +* 空间复杂度:O(1) ### 双指针法 @@ -101,16 +101,16 @@ public: ``` 注意这些实现方法并没有改变元素的相对位置! -* 时间复杂度:$O(n)$ -* 空间复杂度:$O(1)$ +* 时间复杂度:O(n) +* 空间复杂度:O(1) 旧文链接:[数组:就移除个元素很难么?](https://programmercarl.com/0027.移除元素.html) ```CPP /** * 相向双指针方法,基于元素顺序可以改变的题目描述改变了元素相对位置,确保了移动最少元素 -* 时间复杂度:$O(n)$ -* 空间复杂度:$O(1)$ +* 时间复杂度:O(n) +* 空间复杂度:O(1) */ class Solution { public: diff --git "a/problems/0028.\345\256\236\347\216\260strStr.md" "b/problems/0028.\345\256\236\347\216\260strStr.md" index 854789ee0c..634d8535a2 100644 --- "a/problems/0028.\345\256\236\347\216\260strStr.md" +++ "b/problems/0028.\345\256\236\347\216\260strStr.md" @@ -229,9 +229,9 @@ next数组就可以是前缀表,但是很多实现都是把前缀表统一减 # 时间复杂度分析 -其中n为文本串长度,m为模式串长度,因为在匹配的过程中,根据前缀表不断调整匹配的位置,可以看出匹配的过程是$O(n)$,之前还要单独生成next数组,时间复杂度是$O(m)$。所以整个KMP算法的时间复杂度是$O(n+m)$的。 +其中n为文本串长度,m为模式串长度,因为在匹配的过程中,根据前缀表不断调整匹配的位置,可以看出匹配的过程是O(n),之前还要单独生成next数组,时间复杂度是O(m)。所以整个KMP算法的时间复杂度是O(n+m)的。 -暴力的解法显而易见是$O(n × m)$,所以**KMP在字符串匹配中极大的提高的搜索的效率。** +暴力的解法显而易见是O(n × m),所以**KMP在字符串匹配中极大的提高的搜索的效率。** 为了和力扣题目28.实现strStr保持一致,方便大家理解,以下文章统称haystack为文本串, needle为模式串。 diff --git "a/problems/0042.\346\216\245\351\233\250\346\260\264.md" "b/problems/0042.\346\216\245\351\233\250\346\260\264.md" index 75152eb7ad..b232ce2206 100644 --- "a/problems/0042.\346\216\245\351\233\250\346\260\264.md" +++ "b/problems/0042.\346\216\245\351\233\250\346\260\264.md" @@ -129,8 +129,8 @@ public: }; ``` -因为每次遍历列的时候,还要向两边寻找最高的列,所以时间复杂度为$O(n^2)$。 -空间复杂度为$O(1)$。 +因为每次遍历列的时候,还要向两边寻找最高的列,所以时间复杂度为O(n^2)。 +空间复杂度为O(1)。 @@ -779,8 +779,8 @@ int trap(int* height, int heightSize) { } ``` -* 时间复杂度 $O(n)$ -* 空间复杂度 $O(1)$ +* 时间复杂度 O(n) +* 空间复杂度 O(1) ----------------------- diff --git "a/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" "b/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" index d699d49aaf..3d11c91efb 100644 --- "a/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" +++ "b/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" @@ -21,8 +21,8 @@ 暴力解法的思路,第一层for 就是设置起始位置,第二层for循环遍历数组寻找最大值 -* 时间复杂度:$O(n^2)$ -* 空间复杂度:$O(1)$ +* 时间复杂度:O(n^2) +* 空间复杂度:O(1) ```CPP class Solution { @@ -98,8 +98,8 @@ public: }; ``` -* 时间复杂度:$O(n)$ -* 空间复杂度:$O(1)$ +* 时间复杂度:O(n) +* 空间复杂度:O(1) 当然题目没有说如果数组为空,应该返回什么,所以数组为空的话返回啥都可以了。 @@ -128,8 +128,8 @@ public: }; ``` -* 时间复杂度:$O(n)$ -* 空间复杂度:$O(n)$ +* 时间复杂度:O(n) +* 空间复杂度:O(n) ## 总结 diff --git "a/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" "b/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" index 703e1dd68d..4c883cb66c 100644 --- "a/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" +++ "b/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" @@ -80,8 +80,8 @@ public: }; ``` -* 时间复杂度:$O(n)$ -* 空间复杂度:$O(n)$ +* 时间复杂度:O(n) +* 空间复杂度:O(n) ## 总结 diff --git "a/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" "b/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" index efa85a03ac..4a9af12965 100644 --- "a/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" +++ "b/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" @@ -80,7 +80,7 @@ public: 那二叉树的节点个数就是 2^(m + n - 1) - 1。可以理解深搜的算法就是遍历了整个满二叉树(其实没有遍历整个满二叉树,只是近似而已) -所以上面深搜代码的时间复杂度为$O(2^{m + n - 1} - 1)$,可以看出,这是指数级别的时间复杂度,是非常大的。 +所以上面深搜代码的时间复杂度为O(2^(m + n - 1) - 1),可以看出,这是指数级别的时间复杂度,是非常大的。 ### 动态规划 @@ -143,8 +143,8 @@ public: }; ``` -* 时间复杂度:$O(m × n)$ -* 空间复杂度:$O(m × n)$ +* 时间复杂度:O(m × n) +* 空间复杂度:O(m × n) 其实用一个一维数组(也可以理解是滚动数组)就可以了,但是不利于理解,可以优化点空间,建议先理解了二维,在理解一维,C++代码如下: @@ -164,8 +164,8 @@ public: }; ``` -* 时间复杂度:$O(m × n)$ -* 空间复杂度:$O(n)$ +* 时间复杂度:O(m × n) +* 空间复杂度:O(n) ### 数论方法 @@ -224,8 +224,8 @@ public: }; ``` -* 时间复杂度:$O(m)$ -* 空间复杂度:$O(1)$ +* 时间复杂度:O(m) +* 空间复杂度:O(1) **计算组合问题的代码还是有难度的,特别是处理溢出的情况!** diff --git "a/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" "b/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" index 8e82007e7a..34df05d80e 100644 --- "a/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" +++ "b/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" @@ -152,8 +152,8 @@ public: }; ``` -* 时间复杂度:$O(n × m)$,n、m 分别为obstacleGrid 长度和宽度 -* 空间复杂度:$O(n × m)$ +* 时间复杂度:O(n × m),n、m 分别为obstacleGrid 长度和宽度 +* 空间复杂度:O(n × m) ## 总结 diff --git "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" index e5fdd53dd7..615d79bbcd 100644 --- "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" +++ "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" @@ -88,8 +88,8 @@ public: }; ``` -* 时间复杂度:$O(n)$ -* 空间复杂度:$O(n)$ +* 时间复杂度:O(n) +* 空间复杂度:O(n) 大家可以本题和[121. 买卖股票的最佳时机](https://programmercarl.com/0121.买卖股票的最佳时机.html)的代码几乎一样,唯一的区别在: @@ -121,8 +121,8 @@ public: }; ``` -* 时间复杂度:$O(n)$ -* 空间复杂度:$O(1)$ +* 时间复杂度:O(n) +* 空间复杂度:O(1) diff --git "a/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" "b/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" index e04cb173c8..c087183a5e 100644 --- "a/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" +++ "b/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" @@ -66,8 +66,8 @@ public: }; ``` -* 时间复杂度:$O(2^n)$,因为每一个单词都有两个状态,切割和不切割 -* 空间复杂度:$O(n)$,算法递归系统调用栈的空间 +* 时间复杂度:O(2^n),因为每一个单词都有两个状态,切割和不切割 +* 空间复杂度:O(n),算法递归系统调用栈的空间 那么以上代码很明显要超时了,超时的数据如下: @@ -114,7 +114,7 @@ public: }; ``` -这个时间复杂度其实也是:$O(2^n)$。只不过对于上面那个超时测试用例优化效果特别明显。 +这个时间复杂度其实也是:O(2^n)。只不过对于上面那个超时测试用例优化效果特别明显。 **这个代码就可以AC了,当然回溯算法不是本题的主菜,背包才是!** @@ -207,8 +207,8 @@ public: }; ``` -* 时间复杂度:$O(n^3)$,因为substr返回子串的副本是$O(n)$的复杂度(这里的n是substring的长度) -* 空间复杂度:$O(n)$ +* 时间复杂度:O(n^3),因为substr返回子串的副本是$O(n)$的复杂度(这里的n是substring的长度) +* 空间复杂度:O(n) ## 总结 diff --git "a/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" "b/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" index 7588cbd61c..8dfe9bbc98 100644 --- "a/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" +++ "b/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" @@ -36,7 +36,7 @@ 一些同学会使用split库函数,分隔单词,然后定义一个新的string字符串,最后再把单词倒序相加,那么这道题题目就是一道水题了,失去了它的意义。 -所以这里我还是提高一下本题的难度:**不要使用辅助空间,空间复杂度要求为$O(1)$。** +所以这里我还是提高一下本题的难度:**不要使用辅助空间,空间复杂度要求为O(1)。** 不能使用辅助空间之后,那么只能在原字符串上下功夫了。 @@ -81,11 +81,11 @@ void removeExtraSpaces(string& s) { 如果不仔细琢磨一下erase的时间复杂读,还以为以上的代码是$O(n)$的时间复杂度呢。 -想一下真正的时间复杂度是多少,一个erase本来就是$O(n)$的操作,erase实现原理题目:[数组:就移除个元素很难么?](https://programmercarl.com/0027.移除元素.html),最优的算法来移除元素也要$O(n)$。 +想一下真正的时间复杂度是多少,一个erase本来就是O(n)的操作,erase实现原理题目:[数组:就移除个元素很难么?](https://programmercarl.com/0027.移除元素.html),最优的算法来移除元素也要O(n)。 -erase操作上面还套了一个for循环,那么以上代码移除冗余空格的代码时间复杂度为$O(n^2)$。 +erase操作上面还套了一个for循环,那么以上代码移除冗余空格的代码时间复杂度为O(n^2)。 -那么使用双指针法来去移除空格,最后resize(重新设置)一下字符串的大小,就可以做到$O(n)$的时间复杂度。 +那么使用双指针法来去移除空格,最后resize(重新设置)一下字符串的大小,就可以做到O(n)的时间复杂度。 如果对这个操作比较生疏了,可以再看一下这篇文章:[数组:就移除个元素很难么?](https://programmercarl.com/0027.移除元素.html)是如何移除元素的。 diff --git "a/problems/0189.\346\227\213\350\275\254\346\225\260\347\273\204.md" "b/problems/0189.\346\227\213\350\275\254\346\225\260\347\273\204.md" index bbe152a267..1efe94462f 100644 --- "a/problems/0189.\346\227\213\350\275\254\346\225\260\347\273\204.md" +++ "b/problems/0189.\346\227\213\350\275\254\346\225\260\347\273\204.md" @@ -12,7 +12,7 @@ 进阶: 尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。 -你可以使用空间复杂度为 $O(1)$ 的 原地 算法解决这个问题吗? +你可以使用空间复杂度为 O(1) 的 原地 算法解决这个问题吗? 示例 1: @@ -41,7 +41,7 @@ 本题其实和[字符串:剑指Offer58-II.左旋转字符串](https://programmercarl.com/剑指Offer58-II.左旋转字符串.html)就非常像了,剑指offer上左旋转,本题是右旋转。 -注意题目要求是**要求使用空间复杂度为 $O(1)$ 的 原地 算法** +注意题目要求是**要求使用空间复杂度为 O(1) 的 原地 算法** 那么我来提供一种旋转的方式哈。 diff --git "a/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" "b/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" index dc1d9f18d0..82a1138183 100644 --- "a/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" +++ "b/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" @@ -20,7 +20,7 @@ ## 暴力解法 -这道题目暴力解法当然是 两个for循环,然后不断的寻找符合条件的子序列,时间复杂度很明显是$O(n^2)$。 +这道题目暴力解法当然是 两个for循环,然后不断的寻找符合条件的子序列,时间复杂度很明显是O(n^2)。 代码如下: @@ -47,8 +47,8 @@ public: } }; ``` -时间复杂度:$O(n^2)$ -空间复杂度:$O(1)$ +时间复杂度:O(n^2) +空间复杂度:O(1) ## 滑动窗口 @@ -80,7 +80,7 @@ public: ![leetcode_209](https://img-blog.csdnimg.cn/20210312160441942.png) -可以发现**滑动窗口的精妙之处在于根据当前子序列和大小的情况,不断调节子序列的起始位置。从而将$O(n^2)$的暴力解法降为$O(n)$。** +可以发现**滑动窗口的精妙之处在于根据当前子序列和大小的情况,不断调节子序列的起始位置。从而将O(n^2)暴力解法降为O(n)。** C++代码如下: @@ -107,12 +107,12 @@ public: }; ``` -时间复杂度:$O(n)$ -空间复杂度:$O(1)$ +时间复杂度:O(n) +空间复杂度:O(1) -**一些录友会疑惑为什么时间复杂度是$O(n)$**。 +**一些录友会疑惑为什么时间复杂度是O(n)**。 -不要以为for里放一个while就以为是$O(n^2)$啊, 主要是看每一个元素被操作的次数,每个元素在滑动窗后进来操作一次,出去操作一次,每个元素都是被被操作两次,所以时间复杂度是 2 × n 也就是$O(n)$。 +不要以为for里放一个while就以为是O(n^2)啊, 主要是看每一个元素被操作的次数,每个元素在滑动窗后进来操作一次,出去操作一次,每个元素都是被被操作两次,所以时间复杂度是 2 × n 也就是O(n)。 ## 相关题目推荐 diff --git "a/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" "b/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" index ffbc32ffb2..ba7acc5a49 100644 --- "a/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" +++ "b/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" @@ -105,8 +105,8 @@ public: }; ``` -* 时间复杂度:$O(n)$ -* 空间复杂度:$O(\log n)$,算上了递归系统栈占用的空间 +* 时间复杂度:O(n) +* 空间复杂度:O(log n),算上了递归系统栈占用的空间 **网上基本都是这个精简的代码版本,其实不建议大家照着这个来写,代码确实精简,但隐藏了一些内容,连遍历的顺序都看不出来,所以初学者建议学习版本一的代码,稳稳的打基础**。 @@ -138,8 +138,8 @@ public: } }; ``` -* 时间复杂度:$O(n)$ -* 空间复杂度:$O(n)$ +* 时间复杂度:O(n) +* 空间复杂度:O(n) ## 完全二叉树 @@ -185,8 +185,8 @@ public: }; ``` -* 时间复杂度:$O(\log n × \log n)$ -* 空间复杂度:$O(\log n)$ +* 时间复杂度:O(log n × log n) +* 空间复杂度:O(log n) # 其他语言版本 diff --git "a/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" "b/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" index 52f8e66739..080166fd34 100644 --- "a/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" +++ "b/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" @@ -27,7 +27,7 @@ ## 思路 -先看暴力的解法,两层for循环,同时还要记录字符是否重复出现,很明显时间复杂度是 $O(n^2)$。 +先看暴力的解法,两层for循环,同时还要记录字符是否重复出现,很明显时间复杂度是 O(n^2)。 暴力的方法这里就不做介绍了,直接看一下有没有更优的方式。 @@ -55,7 +55,7 @@ 最后如果record数组所有元素都为零0,说明字符串s和t是字母异位词,return true。 -时间复杂度为$O(n)$,空间上因为定义是的一个常量大小的辅助数组,所以空间复杂度为$O(1)$。 +时间复杂度为O(n),空间上因为定义是的一个常量大小的辅助数组,所以空间复杂度为O(1)。 C++ 代码如下: diff --git "a/problems/0283.\347\247\273\345\212\250\351\233\266.md" "b/problems/0283.\347\247\273\345\212\250\351\233\266.md" index bb75a69683..ed59d2c4aa 100644 --- "a/problems/0283.\347\247\273\345\212\250\351\233\266.md" +++ "b/problems/0283.\347\247\273\345\212\250\351\233\266.md" @@ -30,7 +30,7 @@ 好了,我们说一说双指针法,大家如果对双指针还不熟悉,可以看我的这篇总结[双指针法:总结篇!](https://programmercarl.com/双指针总结.html)。 -双指针法在数组移除元素中,可以达到$O(n)$的时间复杂度,在[27.移除元素](https://programmercarl.com/0027.移除元素.html)里已经详细讲解了,那么本题和移除元素其实是一个套路。 +双指针法在数组移除元素中,可以达到O(n)的时间复杂度,在[27.移除元素](https://programmercarl.com/0027.移除元素.html)里已经详细讲解了,那么本题和移除元素其实是一个套路。 **相当于对整个数组移除元素0,然后slowIndex之后都是移除元素0的冗余元素,把这些元素都赋值为0就可以了**。 diff --git "a/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" "b/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" index b6182ed63d..777146ba78 100644 --- "a/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" +++ "b/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" @@ -148,8 +148,8 @@ public: }; ``` -* 时间复杂度:$O(n)$ -* 空间复杂度:$O(1)$ +* 时间复杂度:O(n) +* 空间复杂度:O(1) ## 总结 diff --git "a/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" "b/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" index 92342f178d..82be1829d6 100644 --- "a/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" +++ "b/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" @@ -28,7 +28,7 @@ 注意题目特意说明:**输出结果中的每个元素一定是唯一的,也就是说输出的结果的去重的, 同时可以不考虑输出结果的顺序** -这道题用暴力的解法时间复杂度是$O(n^2)$,那来看看使用哈希法进一步优化。 +这道题用暴力的解法时间复杂度是O(n^2),那来看看使用哈希法进一步优化。 那么用数组来做哈希表也是不错的选择,例如[242. 有效的字母异位词](https://programmercarl.com/0242.有效的字母异位词.html) diff --git "a/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" "b/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" index 28eb574485..b2354d094c 100644 --- "a/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" +++ "b/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" @@ -116,12 +116,12 @@ public: } }; ``` -* 时间复杂度:$O(n\log n + n^2)$ -* 空间复杂度:$O(n)$ +* 时间复杂度:O(nlog n + n^2) +* 空间复杂度:O(n) 但使用vector是非常费时的,C++中vector(可以理解是一个动态数组,底层是普通数组实现的)如果插入元素大于预先普通数组大小,vector底部会有一个扩容的操作,即申请两倍于原先普通数组的大小,然后把数据拷贝到另一个更大的数组上。 -所以使用vector(动态数组)来insert,是费时的,插入再拷贝的话,单纯一个插入的操作就是$O(n^2)$了,甚至可能拷贝好几次,就不止$O(n^2)$了。 +所以使用vector(动态数组)来insert,是费时的,插入再拷贝的话,单纯一个插入的操作就是O(n^2)了,甚至可能拷贝好几次,就不止O(n^2)了。 改成链表之后,C++代码如下: @@ -150,8 +150,8 @@ public: }; ``` -* 时间复杂度:$O(n\log n + n^2)$ -* 空间复杂度:$O(n)$ +* 时间复杂度:O(nlog n + n^2) +* 空间复杂度:O(n) 大家可以把两个版本的代码提交一下试试,就可以发现其差别了! diff --git "a/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" "b/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" index 389443d1be..b24ca0246d 100644 --- "a/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" +++ "b/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" @@ -92,8 +92,8 @@ public: } }; ``` -* 时间复杂度:$O(n\log n)$ ,有一个快排 -* 空间复杂度:$O(1)$ +* 时间复杂度:O(nlog n) ,有一个快排 +* 空间复杂度:O(1) 大家此时会发现如此复杂的一个问题,代码实现却这么简单! diff --git "a/problems/0494.\347\233\256\346\240\207\345\222\214.md" "b/problems/0494.\347\233\256\346\240\207\345\222\214.md" index df667a8513..99b768347d 100644 --- "a/problems/0494.\347\233\256\346\240\207\345\222\214.md" +++ "b/problems/0494.\347\233\256\346\240\207\345\222\214.md" @@ -225,8 +225,8 @@ public: }; ``` -* 时间复杂度:$O(n × m)$,n为正数个数,m为背包容量 -* 空间复杂度:$O(m)$,m为背包容量 +* 时间复杂度:O(n × m),n为正数个数,m为背包容量 +* 空间复杂度:O(m),m为背包容量 ## 总结 diff --git "a/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" "b/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" index c6ce76c0cd..638bfdfe20 100644 --- "a/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" +++ "b/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" @@ -101,8 +101,8 @@ public: } }; ``` -* 时间复杂度:$O(n)$ -* 空间复杂度:$O(n)$ +* 时间复杂度:O(n) +* 空间复杂度:O(n) 当然可以发现,我们只需要维护两个数值就可以了,不需要记录整个序列。 @@ -126,8 +126,8 @@ public: }; ``` -* 时间复杂度:$O(n)$ -* 空间复杂度:$O(1)$ +* 时间复杂度:O(n) +* 空间复杂度:O(1) ### 递归解法 @@ -145,8 +145,8 @@ public: }; ``` -* 时间复杂度:$O(2^n)$ -* 空间复杂度:$O(n)$,算上了编程语言中实现递归的系统栈所占空间 +* 时间复杂度:O(2^n) +* 空间复杂度:O(n),算上了编程语言中实现递归的系统栈所占空间 这个递归的时间复杂度大家画一下树形图就知道了,如果不清晰的同学,可以看这篇:[通过一道面试题目,讲一讲递归算法的时间复杂度!](https://programmercarl.com/前序/通过一道面试题目,讲一讲递归算法的时间复杂度!.html) diff --git "a/problems/0673.\346\234\200\351\225\277\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227\347\232\204\344\270\252\346\225\260.md" "b/problems/0673.\346\234\200\351\225\277\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227\347\232\204\344\270\252\346\225\260.md" index 7ea91e9774..9a2c5db29d 100644 --- "a/problems/0673.\346\234\200\351\225\277\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227\347\232\204\344\270\252\346\225\260.md" +++ "b/problems/0673.\346\234\200\351\225\277\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227\347\232\204\344\270\252\346\225\260.md" @@ -216,10 +216,10 @@ public: }; ``` -* 时间复杂度:$O(n^2)$ -* 空间复杂度:$O(n)$ +* 时间复杂度:O(n^2) +* 空间复杂度:O(n) -还有$O(n\log n)$的解法,使用树状数组,今天有点忙就先不写了,感兴趣的同学可以自行学习一下,这里有我之前写的树状数组系列博客:https://blog.csdn.net/youngyangyang04/category_871105.html (十年前的陈年老文了) +还有O(nlog n)的解法,使用树状数组,今天有点忙就先不写了,感兴趣的同学可以自行学习一下,这里有我之前写的树状数组系列博客:https://blog.csdn.net/youngyangyang04/category_871105.html (十年前的陈年老文了) # 其他语言版本 diff --git "a/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271.md" "b/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271.md" index fd42691b7a..2f27d6eaf5 100644 --- "a/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271.md" +++ "b/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271.md" @@ -84,8 +84,8 @@ public: }; ``` -* 时间复杂度:$O(n)$ -* 空间复杂度:$O(1)$ +* 时间复杂度:O(n) +* 空间复杂度:O(1) 从代码中可以看出对情况一的操作,因为如果还在收获利润的区间里,表示并不是真正的卖出,而计算利润每次都要减去手续费,**所以要让minPrice = prices[i] - fee;,这样在明天收获利润的时候,才不会多减一次手续费!** @@ -117,8 +117,8 @@ public: }; ``` -* 时间复杂度:$O(n)$ -* 空间复杂度:$O(n)$ +* 时间复杂度:O(n) +* 空间复杂度:O(n) 当然可以对空间经行优化,因为当前状态只是依赖前一个状态。 @@ -141,8 +141,8 @@ public: }; ``` -* 时间复杂度:$O(n)$ -* 空间复杂度:$O(1)$ +* 时间复杂度:O(n) +* 空间复杂度:O(1) ## 总结 diff --git "a/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" "b/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" index bdc75b96b8..710f5eb68f 100644 --- "a/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" +++ "b/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" @@ -18,7 +18,7 @@ ## 思路 -首先想到的当然是暴力解法,两层for循环,把至少需要等待的天数就搜出来了。时间复杂度是$O(n^2)$ +首先想到的当然是暴力解法,两层for循环,把至少需要等待的天数就搜出来了。时间复杂度是O(n^2) 那么接下来在来看看使用单调栈的解法。 @@ -26,13 +26,13 @@ **通常是一维数组,要寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置,此时我们就要想到可以用单调栈了**。 -时间复杂度为$O(n)$。 +时间复杂度为O(n)。 例如本题其实就是找找到一个元素右边第一个比自己大的元素。 此时就应该想到用单调栈了。 -那么单调栈的原理是什么呢?为什么时间复杂度是$O(n)$就可以找到每一个元素的右边第一个比它大的元素位置呢? +那么单调栈的原理是什么呢?为什么时间复杂度是O(n)就可以找到每一个元素的右边第一个比它大的元素位置呢? 单调栈的本质是空间换时间,因为在遍历的过程中需要用一个栈来记录右边第一个比当前元素的元素,优点是只需要遍历一次。 @@ -164,8 +164,8 @@ public: } }; ``` -* 时间复杂度:$O(n)$ -* 空间复杂度:$O(n)$ +* 时间复杂度:O(n) +* 空间复杂度:O(n) 精简的代码是直接把情况一二三都合并到了一起,其实这种代码精简是精简,但思路不是很清晰。 diff --git "a/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" "b/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" index e94e4d2471..c356955ad4 100644 --- "a/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" +++ "b/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" @@ -113,8 +113,8 @@ public: }; ``` -* 时间复杂度:$O(n)$ -* 空间复杂度:$O(n)$ +* 时间复杂度:O(n) +* 空间复杂度:O(n) 还可以优化空间复杂度,因为dp[i]就是由前两位推出来的,那么也不用dp数组了,C++代码如下: @@ -136,8 +136,8 @@ public: ``` -* 时间复杂度:$O(n)$ -* 空间复杂度:$O(1)$ +* 时间复杂度:O(n) +* 空间复杂度:O(1) **当然我不建议这么写,能写出版本一就可以了,直观简洁!** diff --git "a/problems/0844.\346\257\224\350\276\203\345\220\253\351\200\200\346\240\274\347\232\204\345\255\227\347\254\246\344\270\262.md" "b/problems/0844.\346\257\224\350\276\203\345\220\253\351\200\200\346\240\274\347\232\204\345\255\227\347\254\246\344\270\262.md" index 00d52e42e2..3bbfb73e20 100644 --- "a/problems/0844.\346\257\224\350\276\203\345\220\253\351\200\200\346\240\274\347\232\204\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/0844.\346\257\224\350\276\203\345\220\253\351\200\200\346\240\274\347\232\204\345\255\227\347\254\246\344\270\262.md" @@ -36,7 +36,7 @@ ## 思路 -本文将给出 空间复杂度$O(n)$的栈模拟方法 以及空间复杂度是$O(1)$的双指针方法。 +本文将给出 空间复杂度O(n)的栈模拟方法 以及空间复杂度是O(1)的双指针方法。 ## 普通方法(使用栈的思路) @@ -71,8 +71,8 @@ public: } }; ``` -* 时间复杂度:$O(n + m)$,n为S的长度,m为T的长度 ,也可以理解是$O(n)$的时间复杂度 -* 空间复杂度:$O(n + m)$ +* 时间复杂度:O(n + m),n为S的长度,m为T的长度 ,也可以理解是$O(n)$的时间复杂度 +* 空间复杂度:O(n + m) 当然以上代码,大家可以发现有重复的逻辑处理S,处理T,可以把这块公共逻辑抽离出来,代码精简如下: @@ -97,12 +97,12 @@ public: ``` 性能依然是: -* 时间复杂度:$O(n + m)$ -* 空间复杂度:$O(n + m)$ +* 时间复杂度:O(n + m) +* 空间复杂度:O(n + m) ## 优化方法(从后向前双指针) -当然还可以有使用 $O(1)$ 的空间复杂度来解决该问题。 +当然还可以有使用 O(1) 的空间复杂度来解决该问题。 同时从后向前遍历S和T(i初始为S末尾,j初始为T末尾),记录#的数量,模拟消除的操作,如果#用完了,就开始比较S[i]和S[j]。 @@ -151,8 +151,8 @@ public: }; ``` -* 时间复杂度:$O(n + m)$ -* 空间复杂度:$O(1)$ +* 时间复杂度:O(n + m) +* 空间复杂度:O(1) ## 其他语言版本 diff --git "a/problems/0922.\346\214\211\345\245\207\345\201\266\346\216\222\345\272\217\346\225\260\347\273\204II.md" "b/problems/0922.\346\214\211\345\245\207\345\201\266\346\216\222\345\272\217\346\225\260\347\273\204II.md" index 19675e7fad..4ff419d388 100644 --- "a/problems/0922.\346\214\211\345\245\207\345\201\266\346\216\222\345\272\217\346\225\260\347\273\204II.md" +++ "b/problems/0922.\346\214\211\345\245\207\345\201\266\346\216\222\345\272\217\346\225\260\347\273\204II.md" @@ -26,11 +26,11 @@ ## 思路 -这道题目直接的想法可能是两层for循环再加上used数组表示使用过的元素。这样的的时间复杂度是$O(n^2)$。 +这道题目直接的想法可能是两层for循环再加上used数组表示使用过的元素。这样的的时间复杂度是O(n^2)。 ### 方法一 -其实这道题可以用很朴实的方法,时间复杂度就就是$O(n)$了,C++代码如下: +其实这道题可以用很朴实的方法,时间复杂度就就是O(n)了,C++代码如下: ```CPP class Solution { @@ -57,8 +57,8 @@ public: }; ``` -* 时间复杂度:$O(n)$ -* 空间复杂度:$O(n)$ +* 时间复杂度:O(n) +* 空间复杂度:O(n) ### 方法二 @@ -86,8 +86,8 @@ public: }; ``` -* 时间复杂度:$O(n)$ -* 空间复杂度:$O(n)$ +* 时间复杂度:O(n) +* 空间复杂度:O(n) ### 方法三 @@ -109,8 +109,8 @@ public: }; ``` -* 时间复杂度:$O(n)$ -* 空间复杂度:$O(1)$ +* 时间复杂度:O(n) +* 空间复杂度:O(1) 这里时间复杂度并不是$O(n^2)$,因为偶数位和奇数位都只操作一次,不是n/2 * n/2的关系,而是n/2 + n/2的关系! diff --git "a/problems/0925.\351\225\277\346\214\211\351\224\256\345\205\245.md" "b/problems/0925.\351\225\277\346\214\211\351\224\256\345\205\245.md" index 3aacee5c11..0ef5a3d7f3 100644 --- "a/problems/0925.\351\225\277\346\214\211\351\224\256\345\205\245.md" +++ "b/problems/0925.\351\225\277\346\214\211\351\224\256\345\205\245.md" @@ -90,8 +90,8 @@ public: ``` -时间复杂度:$O(n)$ -空间复杂度:$O(1)$ +时间复杂度:O(n) +空间复杂度:O(1) ## 其他语言版本 diff --git "a/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" "b/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" index b11fa7ef02..24276bcff0 100644 --- "a/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" +++ "b/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" @@ -40,7 +40,7 @@ public: }; ``` -这个时间复杂度是 $O(n + n\log n)$, 可以说是$O(n\log n)$的时间复杂度,但为了和下面双指针法算法时间复杂度有鲜明对比,我记为 $O(n + n\log n)$。 +这个时间复杂度是 O(n + nlogn), 可以说是O(nlogn)的时间复杂度,但为了和下面双指针法算法时间复杂度有鲜明对比,我记为 O(n + nlog n)。 ## 双指针法 @@ -83,7 +83,7 @@ public: }; ``` -此时的时间复杂度为$O(n)$,相对于暴力排序的解法$O(n + n\log n)$还是提升不少的。 +此时的时间复杂度为O(n),相对于暴力排序的解法O(n + nlog n)还是提升不少的。 **这里还是说一下,大家不必太在意leetcode上执行用时,打败多少多少用户,这个就是一个玩具,非常不准确。** diff --git "a/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" "b/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" index 7b67b1ac48..ee0ddef2d1 100644 --- "a/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" +++ "b/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" @@ -136,8 +136,8 @@ public: ``` -* 时间复杂度:$O(m × n)$ , m是石头总重量(准确的说是总重量的一半),n为石头块数 -* 空间复杂度:$O(m)$ +* 时间复杂度:O(m × n) , m是石头总重量(准确的说是总重量的一半),n为石头块数 +* 空间复杂度:O(m) ## 总结 diff --git "a/problems/O(n)\347\232\204\347\256\227\346\263\225\345\261\205\347\204\266\350\266\205\346\227\266\344\272\206\357\274\214\346\255\244\346\227\266\347\232\204n\347\251\266\347\253\237\346\230\257\345\244\232\345\244\247\357\274\237.md" "b/problems/O(n)\347\232\204\347\256\227\346\263\225\345\261\205\347\204\266\350\266\205\346\227\266\344\272\206\357\274\214\346\255\244\346\227\266\347\232\204n\347\251\266\347\253\237\346\230\257\345\244\232\345\244\247\357\274\237.md" index 4de5659724..75f441db11 100644 --- "a/problems/O(n)\347\232\204\347\256\227\346\263\225\345\261\205\347\204\266\350\266\205\346\227\266\344\272\206\357\274\214\346\255\244\346\227\266\347\232\204n\347\251\266\347\253\237\346\230\257\345\244\232\345\244\247\357\274\237.md" +++ "b/problems/O(n)\347\232\204\347\256\227\346\263\225\345\261\205\347\204\266\350\266\205\346\227\266\344\272\206\357\274\214\346\255\244\346\227\266\347\232\204n\347\251\266\347\253\237\346\230\257\345\244\232\345\244\247\357\274\237.md" @@ -3,7 +3,7 @@

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

-# 程序提交之后为什么会超时?$O(n)$的算法会超时,n究竟是多大? +# 程序提交之后为什么会超时?O(n)的算法会超时,n究竟是多大? 一些同学可能对计算机运行的速度还没有概念,就是感觉计算机运行速度应该会很快,那么在leetcode上做算法题目的时候为什么会超时呢? @@ -18,9 +18,9 @@ 也就是说程序运行的时间超过了规定的时间,一般OJ(online judge)的超时时间就是1s,也就是用例数据输入后最多要1s内得到结果,暂时还不清楚leetcode的判题规则,下文为了方便讲解,暂定超时时间就是1s。 -如果写出了一个$O(n)$的算法 ,其实可以估算出来n是多大的时候算法的执行时间就会超过1s了。 +如果写出了一个O(n)的算法 ,其实可以估算出来n是多大的时候算法的执行时间就会超过1s了。 -如果n的规模已经足够让$O(n)$的算法运行时间超过了1s,就应该考虑log(n)的解法了。 +如果n的规模已经足够让O(n)的算法运行时间超过了1s,就应该考虑log(n)的解法了。 # 从硬件配置看计算机的性能 @@ -63,7 +63,7 @@ 测试硬件:2015年MacPro,CPU配置:2.7 GHz Dual-Core Intel Core i5 -实现三个函数,时间复杂度分别是 $O(n)$ , $O(n^2)$, $O(n\log n)$,使用加法运算来统一测试。 +实现三个函数,时间复杂度分别是 O(n) , O(n^2), O(nlog n),使用加法运算来统一测试。 ```CPP // O(n) @@ -128,19 +128,19 @@ int main() { ![程序超时2](https://img-blog.csdnimg.cn/20200729200018460.png) -O(n)的算法,1s内大概计算机可以运行 5 * (10^8)次计算,可以推测一下$O(n^2)$ 的算法应该1s可以处理的数量级的规模是 5 * (10^8)开根号,实验数据如下。 +O(n)的算法,1s内大概计算机可以运行 5 * (10^8)次计算,可以推测一下O(n^2) 的算法应该1s可以处理的数量级的规模是 5 * (10^8)开根号,实验数据如下。 ![程序超时3](https://img-blog.csdnimg.cn/2020072919590970.png) O(n^2)的算法,1s内大概计算机可以运行 22500次计算,验证了刚刚的推测。 -在推测一下$O(n\log n)$的话, 1s可以处理的数据规模是什么呢? +在推测一下O(nlogn)的话, 1s可以处理的数据规模是什么呢? -理论上应该是比 $O(n)$少一个数量级,因为$\log n$的复杂度 其实是很快,看一下实验数据。 +理论上应该是比 O(n)少一个数量级,因为logn的复杂度 其实是很快,看一下实验数据。 ![程序超时4](https://img-blog.csdnimg.cn/20200729195729407.png) -$O(n \logn)$的算法,1s内大概计算机可以运行 2 * (10^7)次计算,符合预期。 +O(nlogn)的算法,1s内大概计算机可以运行 2 * (10^7)次计算,符合预期。 这是在我个人PC上测出来的数据,不能说是十分精确,但数量级是差不多的,大家也可以在自己的计算机上测一下。 @@ -209,7 +209,7 @@ int main() { # 总结 -本文详细分析了在leetcode上做题程序为什么会有超时,以及从硬件配置上大体知道CPU的执行速度,然后亲自做一个实验来看看$O(n)$的算法,跑一秒钟,这个n究竟是做大,最后给出不同时间复杂度,一秒内可以运算出来的n的大小。 +本文详细分析了在leetcode上做题程序为什么会有超时,以及从硬件配置上大体知道CPU的执行速度,然后亲自做一个实验来看看O(n)的算法,跑一秒钟,这个n究竟是做大,最后给出不同时间复杂度,一秒内可以运算出来的n的大小。 建议录友们也都自己做一做实验,测一测,看看是不是和我的测出来的结果差不多。 diff --git "a/problems/\345\205\263\344\272\216\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\214\344\275\240\344\270\215\347\237\245\351\201\223\347\232\204\351\203\275\345\234\250\350\277\231\351\207\214\357\274\201.md" "b/problems/\345\205\263\344\272\216\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\214\344\275\240\344\270\215\347\237\245\351\201\223\347\232\204\351\203\275\345\234\250\350\277\231\351\207\214\357\274\201.md" index b6477249df..77fdacc4a7 100644 --- "a/problems/\345\205\263\344\272\216\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\214\344\275\240\344\270\215\347\237\245\351\201\223\347\232\204\351\203\275\345\234\250\350\277\231\351\207\214\357\274\201.md" +++ "b/problems/\345\205\263\344\272\216\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\214\344\275\240\344\270\215\347\237\245\351\201\223\347\232\204\351\203\275\345\234\250\350\277\231\351\207\214\357\274\201.md" @@ -16,21 +16,21 @@ 那么该如何估计程序运行时间呢,通常会估算算法的操作单元数量来代表程序消耗的时间,这里默认CPU的每个单元运行消耗的时间都是相同的。 -假设算法的问题规模为n,那么操作单元数量便用函数f(n)来表示,随着数据规模n的增大,算法执行时间的增长率和f(n)的增长率相同,这称作为算法的渐近时间复杂度,简称时间复杂度,记为 $O(f(n))$。 +假设算法的问题规模为n,那么操作单元数量便用函数f(n)来表示,随着数据规模n的增大,算法执行时间的增长率和f(n)的增长率相同,这称作为算法的渐近时间复杂度,简称时间复杂度,记为 O(f(n))。 ## 什么是大O -这里的大O是指什么呢,说到时间复杂度,**大家都知道$O(n)$,$O(n^2)$,却说不清什么是大O**。 +这里的大O是指什么呢,说到时间复杂度,**大家都知道O(n),O(n^2),却说不清什么是大O**。 算法导论给出的解释:**大O用来表示上界的**,当用它作为算法的最坏情况运行时间的上界,就是对任意数据输入的运行时间的上界。 同样算法导论给出了例子:拿插入排序来说,插入排序的时间复杂度我们都说是$O(n^2)$ 。 -输入数据的形式对程序运算时间是有很大影响的,在数据本来有序的情况下时间复杂度是$O(n)$,但如果数据是逆序的话,插入排序的时间复杂度就是$O(n^2)$,也就对于所有输入情况来说,最坏是$O(n^2)$ 的时间复杂度,所以称插入排序的时间复杂度为$O(n^2)$。 +输入数据的形式对程序运算时间是有很大影响的,在数据本来有序的情况下时间复杂度是O(n),但如果数据是逆序的话,插入排序的时间复杂度就是O(n^2),也就对于所有输入情况来说,最坏是O(n^2) 的时间复杂度,所以称插入排序的时间复杂度为O(n^2)。 -同样的同理再看一下快速排序,都知道快速排序是$O(n\log n)$,但是当数据已经有序情况下,快速排序的时间复杂度是$O(n^2)$ 的,**所以严格从大O的定义来讲,快速排序的时间复杂度应该是$O(n^2)$**。 +同样的同理再看一下快速排序,都知道快速排序是O(nlog n),但是当数据已经有序情况下,快速排序的时间复杂度是O(n^2) 的,**所以严格从大O的定义来讲,快速排序的时间复杂度应该是O(n^2)**。 -**但是我们依然说快速排序是$O(n\log n)$的时间复杂度,这个就是业内的一个默认规定,这里说的O代表的就是一般情况,而不是严格的上界**。如图所示: +**但是我们依然说快速排序是O(nlog n)的时间复杂度,这个就是业内的一个默认规定,这里说的O代表的就是一般情况,而不是严格的上界**。如图所示: ![时间复杂度4,一般情况下的时间复杂度](https://img-blog.csdnimg.cn/20200728185745611.png) 我们主要关心的还是一般情况下的数据形式。 @@ -46,9 +46,9 @@ 在决定使用哪些算法的时候,不是时间复杂越低的越好(因为简化后的时间复杂度忽略了常数项等等),要考虑数据规模,如果数据规模很小甚至可以用$O(n^2)$的算法比$O(n)$的更合适(在有常数项的时候)。 -就像上图中 $O(5n^2)$ 和 $O(100n)$ 在n为20之前 很明显 $O(5n^2)$是更优的,所花费的时间也是最少的。 +就像上图中 O(5n^2) 和 O(100n) 在n为20之前 很明显 O(5n^2)是更优的,所花费的时间也是最少的。 -那为什么在计算时间复杂度的时候要忽略常数项系数呢,也就说$O(100n)$ 就是$O(n)$的时间复杂度,$O(5n^2)$ 就是$O(n^2)$的时间复杂度,而且要默认$O(n)$ 优于$O(n^2)$ 呢 ? +那为什么在计算时间复杂度的时候要忽略常数项系数呢,也就说O(100n) 就是O(n)的时间复杂度,O(5n^2) 就是O(n^2)的时间复杂度,而且要默认O(n) 优于O(n^2) 呢 ? 这里就又涉及到大O的定义,**因为大O就是数据量级突破一个点且数据量级非常大的情况下所表现出的时间复杂度,这个数据量也就是常数项系数已经不起决定性作用的数据量**。 @@ -56,13 +56,13 @@ **所以我们说的时间复杂度都是省略常数项系数的,是因为一般情况下都是默认数据规模足够的大,基于这样的事实,给出的算法时间复杂的的一个排行如下所示**: -O(1) 常数阶 < $O(\log n)$ 对数阶 < $O(n)$ 线性阶 < $O(n^2)$ 平方阶 < $O(n^3)$ 立方阶 < $O(2^n)$指数阶 +O(1) 常数阶 < O(\log n) 对数阶 < O(n) 线性阶 < O(n^2) 平方阶 < O(n^3) 立方阶 < O(2^n)指数阶 但是也要注意大常数,如果这个常数非常大,例如10^7 ,10^9 ,那么常数就是不得不考虑的因素了。 ## 复杂表达式的化简 -有时候我们去计算时间复杂度的时候发现不是一个简单的$O(n)$ 或者$O(n^2)$, 而是一个复杂的表达式,例如: +有时候我们去计算时间复杂度的时候发现不是一个简单的O(n) 或者O(n^2), 而是一个复杂的表达式,例如: ``` O(2*n^2 + 10*n + 1000) @@ -88,19 +88,19 @@ O(n^2 + n) O(n^2) ``` -如果这一步理解有困难,那也可以做提取n的操作,变成$O(n(n+1))$,省略加法常数项后也就别变成了: +如果这一步理解有困难,那也可以做提取n的操作,变成O(n(n+1)),省略加法常数项后也就别变成了: ``` O(n^2) ``` -所以最后我们说:这个算法的算法时间复杂度是$O(n^2)$ 。 +所以最后我们说:这个算法的算法时间复杂度是O(n^2) 。 -也可以用另一种简化的思路,其实当n大于40的时候, 这个复杂度会恒小于$O(3 × n^2)$, -$O(2 × n^2 + 10 × n + 1000)$ < $O(3 × n^2)$,所以说最后省略掉常数项系数最终时间复杂度也是$O(n^2)$。 +也可以用另一种简化的思路,其实当n大于40的时候, 这个复杂度会恒小于O(3 × n^2), +O(2 × n^2 + 10 × n + 1000) < O(3 × n^2),所以说最后省略掉常数项系数最终时间复杂度也是O(n^2)。 -## $O(\log n)$中的log是以什么为底? +## O(log n)中的log是以什么为底? 平时说这个算法的时间复杂度是logn的,那么一定是log 以2为底n的对数么? @@ -123,21 +123,21 @@ $O(2 × n^2 + 10 × n + 1000)$ < $O(3 × n^2)$,所以说最后省略掉常数 通过这道面试题目,来分析一下时间复杂度。题目描述:找出n个字符串中相同的两个字符串(假设这里只有两个相同的字符串)。 -如果是暴力枚举的话,时间复杂度是多少呢,是$O(n^2)$么? +如果是暴力枚举的话,时间复杂度是多少呢,是O(n^2)么? -这里一些同学会忽略了字符串比较的时间消耗,这里并不像int 型数字做比较那么简单,除了$n^2$次的遍历次数外,字符串比较依然要消耗m次操作(m也就是字母串的长度),所以时间复杂度是$O(m × n × n)$。 +这里一些同学会忽略了字符串比较的时间消耗,这里并不像int 型数字做比较那么简单,除了n^2次的遍历次数外,字符串比较依然要消耗m次操作(m也就是字母串的长度),所以时间复杂度是$O(m × n × n)$。 接下来再想一下其他解题思路。 先排对n个字符串按字典序来排序,排序后n个字符串就是有序的,意味着两个相同的字符串就是挨在一起,然后在遍历一遍n个字符串,这样就找到两个相同的字符串了。 -那看看这种算法的时间复杂度,快速排序时间复杂度为$O(n\log n)$,依然要考虑字符串的长度是m,那么快速排序每次的比较都要有m次的字符比较的操作,就是$O(m × n × \log n)$。 +那看看这种算法的时间复杂度,快速排序时间复杂度为O(nlog n),依然要考虑字符串的长度是m,那么快速排序每次的比较都要有m次的字符比较的操作,就是O(m × n × log n)。 -之后还要遍历一遍这n个字符串找出两个相同的字符串,别忘了遍历的时候依然要比较字符串,所以总共的时间复杂度是 $O(m × n × \log n + n × m)$。 +之后还要遍历一遍这n个字符串找出两个相同的字符串,别忘了遍历的时候依然要比较字符串,所以总共的时间复杂度是 O(m × n × log n + n × m)。 -我们对$O(m × n × \log n + n × m)$进行简化操作,把$m × n$提取出来变成$O(m × n × (\log n + 1)$),再省略常数项最后的时间复杂度是$O(m × n × \log n)$。 +我们对O(m × n × log n + n × m)进行简化操作,把m × n提取出来变成O(m × n × (log n + 1)),再省略常数项最后的时间复杂度是O(m × n × log n)。 -最后很明显$O(m × n × \log n)$ 要优于$O(m × n × n)$! +最后很明显O(m × n × log n) 要优于O(m × n × n)! 所以先把字符串集合排序再遍历一遍找到两个相同字符串的方法要比直接暴力枚举的方式更快。 diff --git "a/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" "b/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" index 21fc0602b5..037bd42773 100644 --- "a/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" +++ "b/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" @@ -29,7 +29,7 @@ i指向新长度的末尾,j指向旧长度的末尾。 有同学问了,为什么要从后向前填充,从前向后填充不行么? -从前向后填充就是$O(n^2)$的算法了,因为每次添加元素都要将添加元素之后的所有元素向后移动。 +从前向后填充就是O(n^2)的算法了,因为每次添加元素都要将添加元素之后的所有元素向后移动。 **其实很多数组填充类的问题,都可以先预先给数组扩容带填充后的大小,然后在从后向前进行操作。** @@ -74,8 +74,8 @@ public: }; ``` -* 时间复杂度:$O(n)$ -* 空间复杂度:$O(1)$ +* 时间复杂度:O(n) +* 空间复杂度:O(1) 此时算上本题,我们已经做了七道双指针相关的题目了分别是: diff --git "a/problems/\345\212\250\346\200\201\350\247\204\345\210\222-\350\202\241\347\245\250\351\227\256\351\242\230\346\200\273\347\273\223\347\257\207.md" "b/problems/\345\212\250\346\200\201\350\247\204\345\210\222-\350\202\241\347\245\250\351\227\256\351\242\230\346\200\273\347\273\223\347\257\207.md" index e1fb477bdd..47a9b34ba0 100644 --- "a/problems/\345\212\250\346\200\201\350\247\204\345\210\222-\350\202\241\347\245\250\351\227\256\351\242\230\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/\345\212\250\346\200\201\350\247\204\345\210\222-\350\202\241\347\245\250\351\227\256\351\242\230\346\200\273\347\273\223\347\257\207.md" @@ -72,8 +72,8 @@ public: } }; ``` -* 时间复杂度:$O(n)$ -* 空间复杂度:$O(n)$ +* 时间复杂度:O(n) +* 空间复杂度:O(n) 使用滚动数组,代码如下: @@ -95,8 +95,8 @@ public: }; ``` -* 时间复杂度:$O(n)$ -* 空间复杂度:$O(1)$ +* 时间复杂度:O(n) +* 空间复杂度:O(1) ## 买卖股票的最佳时机II @@ -121,8 +121,8 @@ public: }; ``` -* 时间复杂度:$O(n)$ -* 空间复杂度:$O(1)$ +* 时间复杂度:O(n) +* 空间复杂度:O(1) 【动态规划】 @@ -162,8 +162,8 @@ public: }; ``` -* 时间复杂度:$O(n)$ -* 空间复杂度:$O(n)$ +* 时间复杂度:O(n) +* 空间复杂度:O(n) ## 买卖股票的最佳时机III @@ -226,8 +226,8 @@ public: }; ``` -* 时间复杂度:$O(n)$ -* 空间复杂度:$O(n × 5)$ +* 时间复杂度:O(n) +* 空间复杂度:O(n × 5) 当然,大家可以看到力扣官方题解里的一种优化空间写法,我这里给出对应的C++版本: @@ -251,8 +251,8 @@ public: }; ``` -* 时间复杂度:$O(n)$ -* 空间复杂度:$O(1)$ +* 时间复杂度:O(n) +* 空间复杂度:O(1) **这种写法看上去简单,其实思路很绕,不建议大家这么写,这么思考,很容易把自己绕进去!** 对于本题,把版本一的写法研究明白,足以! @@ -404,8 +404,8 @@ public: }; ``` -* 时间复杂度:$O(n)$ -* 空间复杂度:$O(n)$ +* 时间复杂度:O(n) +* 空间复杂度:O(n) ## 买卖股票的最佳时机含手续费 @@ -456,8 +456,8 @@ public: }; ``` -* 时间复杂度:$O(n)$ -* 空间复杂度:$O(n)$ +* 时间复杂度:O(n) +* 空间复杂度:O(n) ## 总结 diff --git "a/problems/\345\212\250\346\200\201\350\247\204\345\210\222\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\345\212\250\346\200\201\350\247\204\345\210\222\347\220\206\350\256\272\345\237\272\347\241\200.md" index e94295a5bf..66971fced3 100644 --- "a/problems/\345\212\250\346\200\201\350\247\204\345\210\222\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\345\212\250\346\200\201\350\247\204\345\210\222\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -16,7 +16,7 @@ 所以动态规划中每一个状态一定是由上一个状态推导出来的,**这一点就区分于贪心**,贪心没有状态推导,而是从局部直接选最优的, -在[关于贪心算法,你该了解这些!](https://mp.weixin.qq.com/s/A9MHJi1a5uugFaqp8QJFWg)中我举了一个背包问题的例子。 +在[关于贪心算法,你该了解这些!](https://programmercarl.com/%E8%B4%AA%E5%BF%83%E7%AE%97%E6%B3%95%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html)中我举了一个背包问题的例子。 例如:有N件物品和一个最多能背重量为W 的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。**每件物品只能用一次**,求解将哪些物品装入背包里物品价值总和最大。 diff --git "a/problems/\345\217\214\346\214\207\351\222\210\346\200\273\347\273\223.md" "b/problems/\345\217\214\346\214\207\351\222\210\346\200\273\347\273\223.md" index e866aa669c..39096ff739 100644 --- "a/problems/\345\217\214\346\214\207\351\222\210\346\200\273\347\273\223.md" +++ "b/problems/\345\217\214\346\214\207\351\222\210\346\200\273\347\273\223.md" @@ -22,7 +22,7 @@ for (int i = 0; i < array.size(); i++) { } ``` -这个代码看上去好像是$O(n)$的时间复杂度,其实是$O(n^2)$的时间复杂度,因为erase操作也是$O(n)$的操作。 +这个代码看上去好像是O(n)的时间复杂度,其实是O(n^2)的时间复杂度,因为erase操作也是O(n)的操作。 所以此时使用双指针法才展现出效率的优势:**通过两个指针在一个for循环下完成两个for循环的工作。** @@ -30,7 +30,7 @@ for (int i = 0; i < array.size(); i++) { 在[字符串:这道题目,使用库函数一行代码搞定](https://programmercarl.com/0344.反转字符串.html)中讲解了反转字符串,注意这里强调要原地反转,要不然就失去了题目的意义。 -使用双指针法,**定义两个指针(也可以说是索引下标),一个从字符串前面,一个从字符串后面,两个指针同时向中间移动,并交换元素。**,时间复杂度是$O(n)$。 +使用双指针法,**定义两个指针(也可以说是索引下标),一个从字符串前面,一个从字符串后面,两个指针同时向中间移动,并交换元素。**,时间复杂度是O(n)。 在[替换空格](https://programmercarl.com/剑指Offer05.替换空格.html) 中介绍使用双指针填充字符串的方法,如果想把这道题目做到极致,就不要只用额外的辅助空间了! @@ -38,13 +38,13 @@ for (int i = 0; i < array.size(); i++) { 有同学问了,为什么要从后向前填充,从前向后填充不行么? -从前向后填充就是$O(n^2)$的算法了,因为每次添加元素都要将添加元素之后的所有元素向后移动。 +从前向后填充就是O(n^2)的算法了,因为每次添加元素都要将添加元素之后的所有元素向后移动。 **其实很多数组(字符串)填充类的问题,都可以先预先给数组扩容带填充后的大小,然后在从后向前进行操作。** -那么在[字符串:花式反转还不够!](https://programmercarl.com/0151.翻转字符串里的单词.html)中,我们使用双指针法,用$O(n)$的时间复杂度完成字符串删除类的操作,因为题目要产出冗余空格。 +那么在[字符串:花式反转还不够!](https://programmercarl.com/0151.翻转字符串里的单词.html)中,我们使用双指针法,用O(n)的时间复杂度完成字符串删除类的操作,因为题目要产出冗余空格。 -**在删除冗余空格的过程中,如果不注意代码效率,很容易写成了$O(n^2)$的时间复杂度。其实使用双指针法$O(n)$就可以搞定。** +**在删除冗余空格的过程中,如果不注意代码效率,很容易写成了O(n^2)的时间复杂度。其实使用双指针法O(n)就可以搞定。** **主要还是大家用erase用的比较随意,一定要注意for循环下用erase的情况,一般可以用双指针写效率更高!** @@ -74,15 +74,15 @@ for (int i = 0; i < array.size(); i++) { 去重的过程不好处理,有很多小细节,如果在面试中很难想到位。 -时间复杂度可以做到$O(n^2)$,但还是比较费时的,因为不好做剪枝操作。 +时间复杂度可以做到O(n^2),但还是比较费时的,因为不好做剪枝操作。 所以这道题目使用双指针法才是最为合适的,用双指针做这道题目才能就能真正体会到,**通过前后两个指针不算向中间逼近,在一个for循环下完成两个for循环的工作。** -只用双指针法时间复杂度为$O(n^2)$,但比哈希法的$O(n^2)$效率高得多,哈希法在使用两层for循环的时候,能做的剪枝操作很有限。 +只用双指针法时间复杂度为O(n^2),但比哈希法的O(n^2)效率高得多,哈希法在使用两层for循环的时候,能做的剪枝操作很有限。 在[双指针法:一样的道理,能解决四数之和](https://programmercarl.com/0018.四数之和.html)中,讲到了四数之和,其实思路是一样的,**在三数之和的基础上再套一层for循环,依然是使用双指针法。** -对于三数之和使用双指针法就是将原本暴力$O(n^3)$的解法,降为$O(n^2)$的解法,四数之和的双指针解法就是将原本暴力$O(n^4)$的解法,降为$O(n^3)$的解法。 +对于三数之和使用双指针法就是将原本暴力O(n^3)的解法,降为O(n^2)的解法,四数之和的双指针解法就是将原本暴力O(n^4)的解法,降为O(n^3)的解法。 同样的道理,五数之和,n数之和都是在这个基础上累加。 diff --git "a/problems/\345\233\236\346\272\257\346\200\273\347\273\223.md" "b/problems/\345\233\236\346\272\257\346\200\273\347\273\223.md" index bd0db57565..5b8e227603 100644 --- "a/problems/\345\233\236\346\272\257\346\200\273\347\273\223.md" +++ "b/problems/\345\233\236\346\272\257\346\200\273\347\273\223.md" @@ -302,11 +302,11 @@ if (startIndex >= nums.size()) { // 终止条件可以不加 **而使用used数组在时间复杂度上几乎没有额外负担!** -**使用set去重,不仅时间复杂度高了,空间复杂度也高了**,在[本周小结!(回溯算法系列三)](https://programmercarl.com/周总结/20201112回溯周末总结.html)中分析过,组合,子集,排列问题的空间复杂度都是$O(n)$,但如果使用set去重,空间复杂度就变成了$O(n^2)$,因为每一层递归都有一个set集合,系统栈空间是n,每一个空间都有set集合。 +**使用set去重,不仅时间复杂度高了,空间复杂度也高了**,在[本周小结!(回溯算法系列三)](https://programmercarl.com/周总结/20201112回溯周末总结.html)中分析过,组合,子集,排列问题的空间复杂度都是O(n),但如果使用set去重,空间复杂度就变成了$O(n^2)$,因为每一层递归都有一个set集合,系统栈空间是n,每一个空间都有set集合。 -那有同学可能疑惑 用used数组也是占用$O(n)$的空间啊? +那有同学可能疑惑 用used数组也是占用O(n)的空间啊? -used数组可是全局变量,每层与每层之间公用一个used数组,所以空间复杂度是$O(n + n)$,最终空间复杂度还是$O(n)$。 +used数组可是全局变量,每层与每层之间公用一个used数组,所以空间复杂度是O(n + n),最终空间复杂度还是O(n)。 # 重新安排行程(图论额外拓展) @@ -380,8 +380,8 @@ used数组可是全局变量,每层与每层之间公用一个used数组,所 以下在计算空间复杂度的时候我都把系统栈(不是数据结构里的栈)所占空间算进去。 子集问题分析: -* 时间复杂度:O(2^n),因为每一个元素的状态无外乎取与不取,所以时间复杂度为$O(2^n)$ -* 空间复杂度:O(n),递归深度为n,所以系统栈所用空间为$O(n)$,每一层递归所用的空间都是常数级别,注意代码里的result和path都是全局变量,就算是放在参数里,传的也是引用,并不会新申请内存空间,最终空间复杂度为$O(n)$ +* 时间复杂度:O(2^n),因为每一个元素的状态无外乎取与不取,所以时间复杂度为O(2^n) +* 空间复杂度:O(n),递归深度为n,所以系统栈所用空间为O(n),每一层递归所用的空间都是常数级别,注意代码里的result和path都是全局变量,就算是放在参数里,传的也是引用,并不会新申请内存空间,最终空间复杂度为O(n) 排列问题分析: * 时间复杂度:O(n!),这个可以从排列的树形图中很明显发现,每一层节点为n,第二层每一个分支都延伸了n-1个分支,再往下又是n-2个分支,所以一直到叶子节点一共就是 n * n-1 * n-2 * ..... 1 = n!。 @@ -392,7 +392,7 @@ used数组可是全局变量,每层与每层之间公用一个used数组,所 * 空间复杂度:O(n),和子集问题同理。 N皇后问题分析: -* 时间复杂度:O(n!) ,其实如果看树形图的话,直觉上是$O(n^n)$,但皇后之间不能见面所以在搜索的过程中是有剪枝的,最差也就是O(n!),n!表示n * (n-1) * .... * 1。 +* 时间复杂度:O(n!) ,其实如果看树形图的话,直觉上是O(n^n),但皇后之间不能见面所以在搜索的过程中是有剪枝的,最差也就是O(n!),n!表示n * (n-1) * .... * 1。 * 空间复杂度:O(n),和子集问题同理。 解数独问题分析: diff --git "a/problems/\345\233\236\346\272\257\347\256\227\346\263\225\345\216\273\351\207\215\351\227\256\351\242\230\347\232\204\345\217\246\344\270\200\347\247\215\345\206\231\346\263\225.md" "b/problems/\345\233\236\346\272\257\347\256\227\346\263\225\345\216\273\351\207\215\351\227\256\351\242\230\347\232\204\345\217\246\344\270\200\347\247\215\345\206\231\346\263\225.md" index 7a601493e1..b4bdda0060 100644 --- "a/problems/\345\233\236\346\272\257\347\256\227\346\263\225\345\216\273\351\207\215\351\227\256\351\242\230\347\232\204\345\217\246\344\270\200\347\247\215\345\206\231\346\263\225.md" +++ "b/problems/\345\233\236\346\272\257\347\256\227\346\263\225\345\216\273\351\207\215\351\227\256\351\242\230\347\232\204\345\217\246\344\270\200\347\247\215\345\206\231\346\263\225.md" @@ -226,11 +226,11 @@ public: **而使用used数组在时间复杂度上几乎没有额外负担!** -**使用set去重,不仅时间复杂度高了,空间复杂度也高了**,在[本周小结!(回溯算法系列三)](https://programmercarl.com/周总结/20201112回溯周末总结.html)中分析过,组合,子集,排列问题的空间复杂度都是$O(n)$,但如果使用set去重,空间复杂度就变成了$O(n^2)$,因为每一层递归都有一个set集合,系统栈空间是n,每一个空间都有set集合。 +**使用set去重,不仅时间复杂度高了,空间复杂度也高了**,在[本周小结!(回溯算法系列三)](https://programmercarl.com/周总结/20201112回溯周末总结.html)中分析过,组合,子集,排列问题的空间复杂度都是O(n),但如果使用set去重,空间复杂度就变成了O(n^2),因为每一层递归都有一个set集合,系统栈空间是n,每一个空间都有set集合。 -那有同学可能疑惑 用used数组也是占用$O(n)$的空间啊? +那有同学可能疑惑 用used数组也是占用O(n)的空间啊? -used数组可是全局变量,每层与每层之间公用一个used数组,所以空间复杂度是$O(n + n)$,最终空间复杂度还是$O(n)$。 +used数组可是全局变量,每层与每层之间公用一个used数组,所以空间复杂度是O(n + n),最终空间复杂度还是O(n)。 ## 总结 diff --git "a/problems/\345\255\227\347\254\246\344\270\262\346\200\273\347\273\223.md" "b/problems/\345\255\227\347\254\246\344\270\262\346\200\273\347\273\223.md" index 469cb743bd..1993b44b5e 100644 --- "a/problems/\345\255\227\347\254\246\344\270\262\346\200\273\347\273\223.md" +++ "b/problems/\345\255\227\347\254\246\344\270\262\346\200\273\347\273\223.md" @@ -57,15 +57,15 @@ for (int i = 0; i < a.size(); i++) { 在[344.反转字符串](https://programmercarl.com/0344.反转字符串.html) ,我们使用双指针法实现了反转字符串的操作,**双指针法在数组,链表和字符串中很常用。** -接着在[字符串:替换空格](https://programmercarl.com/剑指Offer05.替换空格.html),同样还是使用双指针法在时间复杂度$O(n)$的情况下完成替换空格。 +接着在[字符串:替换空格](https://programmercarl.com/剑指Offer05.替换空格.html),同样还是使用双指针法在时间复杂度O(n)的情况下完成替换空格。 **其实很多数组填充类的问题,都可以先预先给数组扩容带填充后的大小,然后在从后向前进行操作。** 那么针对数组删除操作的问题,其实在[27. 移除元素](https://programmercarl.com/0027.移除元素.html)中就已经提到了使用双指针法进行移除操作。 -同样的道理在[151.翻转字符串里的单词](https://programmercarl.com/0151.翻转字符串里的单词.html)中我们使用$O(n)$的时间复杂度,完成了删除冗余空格。 +同样的道理在[151.翻转字符串里的单词](https://programmercarl.com/0151.翻转字符串里的单词.html)中我们使用O(n)的时间复杂度,完成了删除冗余空格。 -一些同学会使用for循环里调用库函数erase来移除元素,这其实是$O(n^2)$的操作,因为erase就是$O(n)$的操作,所以这也是典型的不知道库函数的时间复杂度,上来就用的案例了。 +一些同学会使用for循环里调用库函数erase来移除元素,这其实是O(n^2)的操作,因为erase就是O(n)的操作,所以这也是典型的不知道库函数的时间复杂度,上来就用的案例了。 # 反转系列 diff --git "a/problems/\346\225\260\347\273\204\346\200\273\347\273\223\347\257\207.md" "b/problems/\346\225\260\347\273\204\346\200\273\347\273\223\347\257\207.md" index d3d4a1e246..242c149878 100644 --- "a/problems/\346\225\260\347\273\204\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/\346\225\260\347\273\204\346\200\273\347\273\223\347\257\207.md" @@ -67,8 +67,8 @@ 可以使用暴力解法,通过这道题目,如果追求更优的算法,建议试一试用二分法,来解决这道题目 -* 暴力解法时间复杂度:$O(n)$ -* 二分法时间复杂度:$O(\log n)$ +* 暴力解法时间复杂度:O(n) +* 二分法时间复杂度:O(logn) 在这道题目中我们讲到了**循环不变量原则**,只有在循环中坚持对区间的定义,才能清楚的把握循环中的各种细节。 @@ -81,8 +81,8 @@ 双指针法(快慢指针法):**通过一个快指针和慢指针在一个for循环下完成两个for循环的工作。** -* 暴力解法时间复杂度:$O(n^2)$ -* 双指针时间复杂度:$O(n)$ +* 暴力解法时间复杂度:O(n^2) +* 双指针时间复杂度:O(n) 这道题目迷惑了不少同学,纠结于数组中的元素为什么不能删除,主要是因为以下两点: @@ -97,8 +97,8 @@ 本题介绍了数组操作中的另一个重要思想:滑动窗口。 -* 暴力解法时间复杂度:$O(n^2)$ -* 滑动窗口时间复杂度:$O(n)$ +* 暴力解法时间复杂度:O(n^2) +* 滑动窗口时间复杂度:O(n) 本题中,主要要理解滑动窗口如何移动 窗口起始位置,达到动态更新窗口大小的,从而得出长度最小的符合条件的长度。 diff --git "a/problems/\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227\357\274\210vector\345\216\237\347\220\206\350\256\262\350\247\243\357\274\211.md" "b/problems/\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227\357\274\210vector\345\216\237\347\220\206\350\256\262\350\247\243\357\274\211.md" index 11a72e2db0..6d248c4064 100644 --- "a/problems/\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227\357\274\210vector\345\216\237\347\220\206\350\256\262\350\247\243\357\274\211.md" +++ "b/problems/\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227\357\274\210vector\345\216\237\347\220\206\350\256\262\350\247\243\357\274\211.md" @@ -33,7 +33,7 @@ public: 耗时如下: ![vectorinsert](https://img-blog.csdnimg.cn/20201218203611181.png) -其直观上来看数组的insert操作是$O(n)$的,整体代码的时间复杂度是$O(n^2)$。 +其直观上来看数组的insert操作是O(n)的,整体代码的时间复杂度是O(n^2)。 这么一分析好像和版本二链表实现的时间复杂度是一样的啊,为什么提交之后效率会差距这么大呢? ```CPP @@ -97,7 +97,7 @@ for (int i = 0; i < vec.size(); i++) { **同时也注意此时capicity和size的变化,关键的地方我都标红了**。 -而在[贪心算法:根据身高重建队列](https://programmercarl.com/0406.根据身高重建队列.html)中,我们使用vector来做insert的操作,此时大家可会发现,**虽然表面上复杂度是$O(n^2)$,但是其底层都不知道额外做了多少次全量拷贝了,所以算上vector的底层拷贝,整体时间复杂度可以认为是$O(n^2 + t × n)$级别的,t是底层拷贝的次数**。 +而在[贪心算法:根据身高重建队列](https://programmercarl.com/0406.根据身高重建队列.html)中,我们使用vector来做insert的操作,此时大家可会发现,**虽然表面上复杂度是O(n^2),但是其底层都不知道额外做了多少次全量拷贝了,所以算上vector的底层拷贝,整体时间复杂度可以认为是O(n^2 + t × n)级别的,t是底层拷贝的次数**。 那么是不是可以直接确定好vector的大小,不让它在动态扩容了,例如在[贪心算法:根据身高重建队列](https://programmercarl.com/0406.根据身高重建队列.html)中已经给出了有people.size这么多的人,可以定义好一个固定大小的vector,这样我们就可以控制vector,不让它底层动态扩容。 @@ -133,7 +133,7 @@ public: ![vector手动模拟insert](https://img-blog.csdnimg.cn/20201218200626718.png) -这份代码就是不让vector动态扩容,全程我们自己模拟insert的操作,大家也可以直观的看出是一个$O(n^2)$的方法了。 +这份代码就是不让vector动态扩容,全程我们自己模拟insert的操作,大家也可以直观的看出是一个O(n^2)的方法了。 但这份代码在leetcode上统计的耗时甚至比版本一的还高,我们都不让它动态扩容了,为什么耗时更高了呢? @@ -151,7 +151,7 @@ public: 大家应该发现了,编程语言中一个普通容器的insert,delete的使用,都可能对写出来的算法的有很大影响! -如果抛开语言谈算法,除非从来不用代码写算法纯分析,**否则的话,语言功底不到位$O(n)$的算法可以写出$O(n^2)$的性能**,哈哈。 +如果抛开语言谈算法,除非从来不用代码写算法纯分析,**否则的话,语言功底不到位O(n)的算法可以写出$O(n^2)$的性能**,哈哈。 相信在这里学习算法的录友们,都是想在软件行业长远发展的,都是要从事编程的工作,那么一定要深耕好一门编程语言,这个非常重要! diff --git "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\210\267\345\212\233\346\211\243\347\224\250\344\270\215\347\224\250\345\272\223\345\207\275\346\225\260.md" "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\210\267\345\212\233\346\211\243\347\224\250\344\270\215\347\224\250\345\272\223\345\207\275\346\225\260.md" index b52e4d0300..c8e2f5c618 100644 --- "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\210\267\345\212\233\346\211\243\347\224\250\344\270\215\347\224\250\345\272\223\345\207\275\346\225\260.md" +++ "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\210\267\345\212\233\346\211\243\347\224\250\344\270\215\347\224\250\345\272\223\345\207\275\346\225\260.md" @@ -27,7 +27,7 @@ 使用库函数最大的忌讳就是不知道这个库函数怎么实现的,也不知道其时间复杂度,上来就用,这样写出来的算法,时间复杂度自己都掌握不好的。 -例如for循环里套一个字符串的insert,erase之类的操作,你说时间复杂度是多少呢,很明显是$O(n^2)$的时间复杂度了。 +例如for循环里套一个字符串的insert,erase之类的操作,你说时间复杂度是多少呢,很明显是O(n^2)的时间复杂度了。 在刷题的时候本着我说的标准来使用库函数,详细对大家回有所帮助! diff --git "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\244\232\351\207\215\350\203\214\345\214\205.md" "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\244\232\351\207\215\350\203\214\345\214\205.md" index d05c3445a7..a988db2c82 100644 --- "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\244\232\351\207\215\350\203\214\345\214\205.md" +++ "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\244\232\351\207\215\350\203\214\345\214\205.md" @@ -89,7 +89,7 @@ int main() { ``` -* 时间复杂度:$O(m × n × k)$,m:物品种类个数,n背包容量,k单类物品数量 +* 时间复杂度:O(m × n × k),m:物品种类个数,n背包容量,k单类物品数量 也有另一种实现方式,就是把每种商品遍历的个数放在01背包里面在遍历一遍。 @@ -125,7 +125,7 @@ int main() { } ``` -* 时间复杂度:$O(m × n × k)$,m:物品种类个数,n背包容量,k单类物品数量 +* 时间复杂度:O(m × n × k),m:物品种类个数,n背包容量,k单类物品数量 从代码里可以看出是01背包里面在加一个for循环遍历一个每种商品的数量。 和01背包还是如出一辙的。 diff --git "a/problems/\351\223\276\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\351\223\276\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" index a4fefa2b83..095282f54f 100644 --- "a/problems/\351\223\276\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\351\223\276\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -120,9 +120,9 @@ head->val = 5; ![链表-添加节点](https://img-blog.csdnimg.cn/20200806195134331.png) -可以看出链表的增添和删除都是$O(1)$操作,也不会影响到其他节点。 +可以看出链表的增添和删除都是O(1)操作,也不会影响到其他节点。 -但是要注意,要是删除第五个节点,需要从头节点查找到第四个节点通过next指针进行删除操作,查找的时间复杂度是$O(n)$。 +但是要注意,要是删除第五个节点,需要从头节点查找到第四个节点通过next指针进行删除操作,查找的时间复杂度是O(n)。 # 性能分析 From d1ea59aebd4659274165c5a352166696275faddc Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Thu, 31 Mar 2022 22:14:20 +0800 Subject: [PATCH 0467/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880093.?= =?UTF-8?q?=E5=A4=8D=E5=8E=9FIP=E5=9C=B0=E5=9D=80.md=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\345\216\237IP\345\234\260\345\235\200.md" | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git "a/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" "b/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" index 714dcb4f89..7910fc50cc 100644 --- "a/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" +++ "b/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" @@ -455,6 +455,45 @@ var restoreIpAddresses = function(s) { }; ``` +## TypeScript + +```typescript +function isValidIpSegment(str: string): boolean { + let resBool: boolean = true; + let tempVal: number = Number(str); + if ( + str.length === 0 || isNaN(tempVal) || + tempVal > 255 || tempVal < 0 || + (str.length > 1 && str[0] === '0') + ) { + resBool = false; + } + return resBool; +} +function restoreIpAddresses(s: string): string[] { + const resArr: string[] = []; + backTracking(s, 0, []); + return resArr; + function backTracking(s: string, startIndex: number, route: string[]): void { + let length: number = s.length; + if (route.length === 4 && startIndex >= length) { + resArr.push(route.join('.')); + return; + } + if (route.length === 4 || startIndex >= length) return; + let tempStr: string = ''; + for (let i = startIndex + 1; i <= Math.min(length, startIndex + 3); i++) { + tempStr = s.slice(startIndex, i); + if (isValidIpSegment(tempStr)) { + route.push(s.slice(startIndex, i)); + backTracking(s, i, route); + route.pop(); + } + } + } +}; +``` + ## Go 回溯(对于前导 0的IP(特别注意s[startIndex]=='0'的判断,不应该写成s[startIndex]==0,因为s截取出来不是数字)) From 48de0f8bd55e24b2b9233648e0f85e4fcb75c0c0 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Fri, 1 Apr 2022 11:02:47 +0800 Subject: [PATCH 0468/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880078.?= =?UTF-8?q?=E5=AD=90=E9=9B=86.md=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typesc?= =?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/0078.\345\255\220\351\233\206.md" | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git "a/problems/0078.\345\255\220\351\233\206.md" "b/problems/0078.\345\255\220\351\233\206.md" index cdb5f54891..e1c52b5b81 100644 --- "a/problems/0078.\345\255\220\351\233\206.md" +++ "b/problems/0078.\345\255\220\351\233\206.md" @@ -272,7 +272,28 @@ var subsets = function(nums) { }; ``` +## TypeScript + +```typescript +function subsets(nums: number[]): number[][] { + const resArr: number[][] = []; + backTracking(nums, 0, []); + return resArr; + function backTracking(nums: number[], startIndex: number, route: number[]): void { + resArr.push(route.slice()); + let length = nums.length; + if (startIndex === length) return; + for (let i = startIndex; i < length; i++) { + route.push(nums[i]); + backTracking(nums, i + 1, route); + route.pop(); + } + } +}; +``` + ## C + ```c int* path; int pathTop; From b85700890227fa69a7ca506384e7e8a821530675 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Fri, 1 Apr 2022 12:08:26 +0800 Subject: [PATCH 0469/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880090.?= =?UTF-8?q?=E5=AD=90=E9=9B=86II.md=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0type?= =?UTF-8?q?script=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "problems/0090.\345\255\220\351\233\206II.md" | 24 ++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git "a/problems/0090.\345\255\220\351\233\206II.md" "b/problems/0090.\345\255\220\351\233\206II.md" index 16bd1f2c19..6469f4ba54 100644 --- "a/problems/0090.\345\255\220\351\233\206II.md" +++ "b/problems/0090.\345\255\220\351\233\206II.md" @@ -319,6 +319,28 @@ var subsetsWithDup = function(nums) { ``` +### TypeScript + +```typescript +function subsetsWithDup(nums: number[]): number[][] { + nums.sort((a, b) => a - b); + const resArr: number[][] = []; + backTraking(nums, 0, []); + return resArr; + function backTraking(nums: number[], startIndex: number, route: number[]): void { + resArr.push(route.slice()); + let length: number = nums.length; + if (startIndex === length) return; + for (let i = startIndex; i < length; i++) { + if (i > startIndex && nums[i] === nums[i - 1]) continue; + route.push(nums[i]); + backTraking(nums, i + 1, route); + route.pop(); + } + } +}; +``` + ### C ```c @@ -388,7 +410,7 @@ int** subsetsWithDup(int* nums, int numsSize, int* returnSize, int** returnColum } ``` -## Swift +### Swift ```swift func subsetsWithDup(_ nums: [Int]) -> [[Int]] { From c4a4a0323127f3b47e89fdeefd7bc8a57d404e1e Mon Sep 17 00:00:00 2001 From: Effy Wang Date: Fri, 1 Apr 2022 17:26:47 +0800 Subject: [PATCH 0470/3019] =?UTF-8?q?Update=200704.=E4=BA=8C=E5=88=86?= =?UTF-8?q?=E6=9F=A5=E6=89=BE.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit add detailed comments to the Javascript version of Binary Search --- ...72\214\345\210\206\346\237\245\346\211\276.md" | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git "a/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" "b/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" index 15e096a0b1..5562513089 100644 --- "a/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" +++ "b/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" @@ -276,7 +276,7 @@ func search(nums []int, target int) int { ``` **JavaScript:** -(版本一)左闭右闭区间 +(版本一)左闭右闭区间 [left, right] ```js /** @@ -285,10 +285,12 @@ func search(nums []int, target int) int { * @return {number} */ var search = function(nums, target) { + // right是数组最后一个数的下标,num[right]在查找范围内,是左闭右闭区间 let left = 0, right = nums.length - 1; - // 使用左闭右闭区间 + // 当left=right时,由于nums[right]在查找范围内,所以要包括此情况 while (left <= right) { let mid = left + Math.floor((right - left)/2); + // 如果中间数大于目标值,要把中间数排除查找范围,所以右边界更新为mid-1;如果右边界更新为mid,那中间数还在下次查找范围内 if (nums[mid] > target) { right = mid - 1; // 去左面闭区间寻找 } else if (nums[mid] < target) { @@ -300,7 +302,7 @@ var search = function(nums, target) { return -1; }; ``` -(版本二)左闭右开区间 +(版本二)左闭右开区间 [left, right) ```js /** @@ -309,10 +311,13 @@ var search = function(nums, target) { * @return {number} */ var search = function(nums, target) { - let left = 0, right = nums.length; - // 使用左闭右开区间 [left, right) + // right是数组最后一个数的下标+1,nums[right]不在查找范围内,是左闭右开区间 + let left = 0, right = nums.length; + // 当left=right时,由于nums[right]不在查找范围,所以不必包括此情况 while (left < right) { let mid = left + Math.floor((right - left)/2); + // 如果中间值大于目标值,中间值不应在下次查找的范围内,但中间值的前一个值应在; + // 由于right本来就不在查找范围内,所以将右边界更新为中间值,如果更新右边界为mid-1则将中间值的前一个值也踢出了下次寻找范围 if (nums[mid] > target) { right = mid; // 去左区间寻找 } else if (nums[mid] < target) { From 3f7dd67a8031663d2b673a41587e3a640e0a4b1f Mon Sep 17 00:00:00 2001 From: FrankLin Date: Fri, 1 Apr 2022 10:57:25 -0400 Subject: [PATCH 0471/3019] Add C version for LeetCode349 using array --- ...04\347\232\204\344\272\244\351\233\206.md" | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git "a/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" "b/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" index 82be1829d6..64d80a37c4 100644 --- "a/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" +++ "b/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" @@ -281,6 +281,38 @@ impl Solution { } } ``` + +C: +```C +int* intersection1(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize){ + + int nums1Cnt[1000] = {0}; + int lessSize = nums1Size < nums2Size ? nums1Size : nums2Size; + int * result = (int *) calloc(lessSize, sizeof(int)); + int resultIndex = 0; + int* tempNums; + + int i; + + //Calculate the number's counts for nums1 array + for(i = 0; i < nums1Size; i ++) { + nums1Cnt[nums1[i]]++; + } + + //Check if the value existing in nums1 count array + for(i = 0; i < nums2Size; i ++) { + if(nums1Cnt[nums2[i]] > 0) { + result[resultIndex] = nums2[i]; + resultIndex ++; + //Clear this count to avoid duplicated value + nums1Cnt[nums2[i]] = 0; + } + } + * returnSize = resultIndex; + return result; +} +``` + ## 相关题目 * 350.两个数组的交集 II From abc08b6bb6f698135efe52ad0a7f20b333d32173 Mon Sep 17 00:00:00 2001 From: FrankLin Date: Fri, 1 Apr 2022 11:01:00 -0400 Subject: [PATCH 0472/3019] correct comments of C version of Leetcode349 --- ...\260\347\273\204\347\232\204\344\272\244\351\233\206.md" | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git "a/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" "b/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" index 64d80a37c4..45f19b6ef2 100644 --- "a/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" +++ "b/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" @@ -294,17 +294,17 @@ int* intersection1(int* nums1, int nums1Size, int* nums2, int nums2Size, int* re int i; - //Calculate the number's counts for nums1 array + /* Calculate the number's counts for nums1 array */ for(i = 0; i < nums1Size; i ++) { nums1Cnt[nums1[i]]++; } - //Check if the value existing in nums1 count array + /* Check if the value in nums2 is existing in nums1 count array */ for(i = 0; i < nums2Size; i ++) { if(nums1Cnt[nums2[i]] > 0) { result[resultIndex] = nums2[i]; resultIndex ++; - //Clear this count to avoid duplicated value + /* Clear this count to avoid duplicated value */ nums1Cnt[nums2[i]] = 0; } } From 297a22fd880f207bd9b621b7dbd5e8dfd84340a1 Mon Sep 17 00:00:00 2001 From: FrankLin Date: Fri, 1 Apr 2022 15:11:00 -0400 Subject: [PATCH 0473/3019] Add C version for Leetcode202 passed Leetcode submission --- ...2.\345\277\253\344\271\220\346\225\260.md" | 70 +++++++++++++++++++ 1 file changed, 70 insertions(+) diff --git "a/problems/0202.\345\277\253\344\271\220\346\225\260.md" "b/problems/0202.\345\277\253\344\271\220\346\225\260.md" index f0a46a40d2..741a735a5d 100644 --- "a/problems/0202.\345\277\253\344\271\220\346\225\260.md" +++ "b/problems/0202.\345\277\253\344\271\220\346\225\260.md" @@ -315,5 +315,75 @@ class Solution { } ``` +C: +```C +typedef struct HashNodeTag { + int key; /* num */ + struct HashNodeTag *next; +}HashNode; + +/* Calcualte the hash key */ +static inline int hash(int key, int size) { + int index = key % size; + return (index > 0) ? (index) : (-index); +} + +/* Calculate the sum of the squares of its digits*/ +static inline int calcSquareSum(int num) { + unsigned int sum = 0; + while(num > 0) { + sum += (num % 10) * (num % 10); + num = num/10; + } + return sum; +} + +#define HASH_TABLE_SIZE (32) + +bool isHappy(int n){ + int sum = n; + int index = 0; + bool bHappy = false; + bool bExit = false; + /* allocate the memory for hash table with chaining method*/ + HashNode ** hashTable = (HashNode **)calloc(HASH_TABLE_SIZE, sizeof(HashNode)); + + while(bExit == false) { + /* check if n has been calculated */ + index = hash(n, HASH_TABLE_SIZE); + + HashNode ** p = hashTable + index; + + while((*p) && (bExit == false)) { + /* Check if this num was calculated, if yes, this will be endless loop */ + if((*p)->key == n) { + bHappy = false; + bExit = true; + } + /* move to next node of the same index */ + p = &((*p)->next); + } + + /* put n intot hash table */ + HashNode * newNode = (HashNode *)malloc(sizeof(HashNode)); + newNode->key = n; + newNode->next = NULL; + + *p = newNode; + + sum = calcSquareSum(n); + if(sum == 1) { + bHappy = true; + bExit = true; + } + else { + n = sum; + + } + } + + return bHappy; +} +``` -----------------------
From fb5571f16576d9d16274219d60674662970366ec Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Sat, 2 Apr 2022 11:24:06 +0800 Subject: [PATCH 0474/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880491.?= =?UTF-8?q?=E9=80=92=E5=A2=9E=E5=AD=90=E5=BA=8F=E5=88=97.md=EF=BC=89?= =?UTF-8?q?=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...36\345\255\220\345\272\217\345\210\227.md" | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git "a/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" "b/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" index 6103c3d0a1..3ea2382b1f 100644 --- "a/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" @@ -396,7 +396,35 @@ var findSubsequences = function(nums) { ``` +## TypeScript + +```typescript +function findSubsequences(nums: number[]): number[][] { + const resArr: number[][] = []; + backTracking(nums, 0, []); + return resArr; + function backTracking(nums: number[], startIndex: number, route: number[]): void { + let length: number = nums.length; + if (route.length >= 2) { + resArr.push(route.slice()); + } + const usedSet: Set = new Set(); + for (let i = startIndex; i < length; i++) { + if ( + nums[i] < route[route.length - 1] || + usedSet.has(nums[i]) + ) continue; + usedSet.add(nums[i]); + route.push(nums[i]); + backTracking(nums, i + 1, route); + route.pop(); + } + } +}; +``` + ### C + ```c int* path; int pathTop; From 9b9a37b92c20fc616b7808317ba05ff03c6d8633 Mon Sep 17 00:00:00 2001 From: SianXiaoCHN Date: Sat, 2 Apr 2022 00:03:08 -0500 Subject: [PATCH 0475/3019] 0455 typo MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 0455思路多打了一个“了” --- .../0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" "b/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" index 210b492df6..5c86e4785b 100644 --- "a/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" +++ "b/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" @@ -32,7 +32,7 @@ ## 思路 -为了了满足更多的小孩,就不要造成饼干尺寸的浪费。 +为了满足更多的小孩,就不要造成饼干尺寸的浪费。 大尺寸的饼干既可以满足胃口大的孩子也可以满足胃口小的孩子,那么就应该优先满足胃口大的。 From 77f1e2c85da13846b26cd33159e0dee565ef1d9d Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Sat, 2 Apr 2022 19:24:03 +0800 Subject: [PATCH 0476/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880046.?= =?UTF-8?q?=E5=85=A8=E6=8E=92=E5=88=97.md=EF=BC=89=EF=BC=9A=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0typesript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...6.\345\205\250\346\216\222\345\210\227.md" | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git "a/problems/0046.\345\205\250\346\216\222\345\210\227.md" "b/problems/0046.\345\205\250\346\216\222\345\210\227.md" index c5369ddd1b..836c36462f 100644 --- "a/problems/0046.\345\205\250\346\216\222\345\210\227.md" +++ "b/problems/0046.\345\205\250\346\216\222\345\210\227.md" @@ -331,6 +331,34 @@ var permute = function(nums) { ``` +## TypeScript + +```typescript +function permute(nums: number[]): number[][] { + const resArr: number[][] = []; + const helperSet: Set = new Set(); + backTracking(nums, []); + return resArr; + function backTracking(nums: number[], route: number[]): void { + if (route.length === nums.length) { + resArr.push(route.slice()); + return; + } + let tempVal: number; + for (let i = 0, length = nums.length; i < length; i++) { + tempVal = nums[i]; + if (!helperSet.has(tempVal)) { + route.push(tempVal); + helperSet.add(tempVal); + backTracking(nums, route); + route.pop(); + helperSet.delete(tempVal); + } + } + } +}; +``` + ### C ```c From c9dfda1c955c0665108d8aa7fc78b33d5edded99 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Sat, 2 Apr 2022 23:34:25 +0800 Subject: [PATCH 0477/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880047.?= =?UTF-8?q?=E5=85=A8=E6=8E=92=E5=88=97II.md=EF=BC=89=EF=BC=9A=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\345\205\250\346\216\222\345\210\227II.md" | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git "a/problems/0047.\345\205\250\346\216\222\345\210\227II.md" "b/problems/0047.\345\205\250\346\216\222\345\210\227II.md" index 0cecac5058..cce25cd9a1 100644 --- "a/problems/0047.\345\205\250\346\216\222\345\210\227II.md" +++ "b/problems/0047.\345\205\250\346\216\222\345\210\227II.md" @@ -292,6 +292,34 @@ var permuteUnique = function (nums) { ``` +### TypeScript + +```typescript +function permuteUnique(nums: number[]): number[][] { + nums.sort((a, b) => a - b); + const resArr: number[][] = []; + const usedArr: boolean[] = new Array(nums.length).fill(false); + backTracking(nums, []); + return resArr; + function backTracking(nums: number[], route: number[]): void { + if (route.length === nums.length) { + resArr.push(route.slice()); + return; + } + for (let i = 0, length = nums.length; i < length; i++) { + if (i > 0 && nums[i] === nums[i - 1] && usedArr[i - 1] === false) continue; + if (usedArr[i] === false) { + route.push(nums[i]); + usedArr[i] = true; + backTracking(nums, route); + usedArr[i] = false; + route.pop(); + } + } + } +}; +``` + ### Swift ```swift From 710e816012bb0198a5a42686e94d24b50aa68760 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Sun, 3 Apr 2022 11:26:52 +0800 Subject: [PATCH 0478/3019] =?UTF-8?q?=E4=BF=AE=E6=94=B9=EF=BC=8820201112?= =?UTF-8?q?=E5=9B=9E=E6=BA=AF=E5=91=A8=E6=9C=AB=E6=80=BB=E7=BB=93.md?= =?UTF-8?q?=EF=BC=89=EF=BC=9A=E8=A1=A5=E5=85=85=E5=88=86=E6=9E=90=E6=8E=92?= =?UTF-8?q?=E5=88=97=E9=97=AE=E9=A2=98=E6=97=B6=E9=97=B4=E5=A4=8D=E6=9D=82?= =?UTF-8?q?=E5=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\272\257\345\221\250\346\234\253\346\200\273\347\273\223.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20201112\345\233\236\346\272\257\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20201112\345\233\236\346\272\257\345\221\250\346\234\253\346\200\273\347\273\223.md" index c61de4bb4c..af08097b64 100644 --- "a/problems/\345\221\250\346\200\273\347\273\223/20201112\345\233\236\346\272\257\345\221\250\346\234\253\346\200\273\347\273\223.md" +++ "b/problems/\345\221\250\346\200\273\347\273\223/20201112\345\233\236\346\272\257\345\221\250\346\234\253\346\200\273\347\273\223.md" @@ -76,7 +76,7 @@ * 空间复杂度:$O(n)$,递归深度为n,所以系统栈所用空间为$O(n)$,每一层递归所用的空间都是常数级别,注意代码里的result和path都是全局变量,就算是放在参数里,传的也是引用,并不会新申请内存空间,最终空间复杂度为$O(n)$。 排列问题分析: -* 时间复杂度:$O(n!)$,这个可以从排列的树形图中很明显发现,每一层节点为n,第二层每一个分支都延伸了n-1个分支,再往下又是n-2个分支,所以一直到叶子节点一共就是 n * n-1 * n-2 * ..... 1 = n!。 +* 时间复杂度:$O(n!)$,这个可以从排列的树形图中很明显发现,每一层节点为n,第二层每一个分支都延伸了n-1个分支,再往下又是n-2个分支,所以一直到叶子节点一共就是 n * n-1 * n-2 * ..... 1 = n!。每个叶子节点都会有一个构造全排列填进数组的操作(对应的代码:`result.push_back(path)`),该操作的复杂度为$O(n)$。所以,最终时间复杂度为:n * n!,简化为$O(n!)$。 * 空间复杂度:$O(n)$,和子集问题同理。 组合问题分析: From e48336238d25eac775f1897ad85b9be551ba1e69 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=A2=A6=E6=B4=81?= <3224935686@qq.com> Date: Sun, 3 Apr 2022 14:03:31 +0800 Subject: [PATCH 0479/3019] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=A0=91=E7=B3=BB=E5=88=9719=20=E4=BB=8E=E4=B8=AD=E5=BA=8F?= =?UTF-8?q?=E4=B8=8E=E5=90=8E=E5=BA=8F=E9=81=8D=E5=8E=86=E5=BA=8F=E5=88=97?= =?UTF-8?q?=E6=9E=84=E9=80=A0=E4=BA=8C=E5=8F=89=E6=A0=91JS=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E5=8F=98=E9=87=8F=E5=90=8D=20preorder->inorder?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" "b/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" index 496de431ed..7ecca773f5 100644 --- "a/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" @@ -790,7 +790,7 @@ func findRootIndex(target int,inorder []int) int{ ```javascript var buildTree = function(inorder, postorder) { - if (!preorder.length) return null; + if (!inorder.length) return null; const rootVal = postorder.pop(); // 从后序遍历的数组中获取中间节点的值, 即数组最后一个值 let rootIndex = inorder.indexOf(rootVal); // 获取中间节点在中序遍历中的下标 const root = new TreeNode(rootVal); // 创建中间节点 From 1dcbf7f6f0ba7b50da6685532a42d2ceac9aeccc Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Sun, 3 Apr 2022 19:43:34 +0800 Subject: [PATCH 0480/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=88=E5=9B=9E?= =?UTF-8?q?=E6=BA=AF=E7=AE=97=E6=B3=95=E5=8E=BB=E9=87=8D=E9=97=AE=E9=A2=98?= =?UTF-8?q?=E7=9A=84=E5=8F=A6=E4=B8=80=E7=A7=8D=E5=86=99=E6=B3=95.md?= =?UTF-8?q?=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...00\347\247\215\345\206\231\346\263\225.md" | 81 +++++++++++++++++++ 1 file changed, 81 insertions(+) diff --git "a/problems/\345\233\236\346\272\257\347\256\227\346\263\225\345\216\273\351\207\215\351\227\256\351\242\230\347\232\204\345\217\246\344\270\200\347\247\215\345\206\231\346\263\225.md" "b/problems/\345\233\236\346\272\257\347\256\227\346\263\225\345\216\273\351\207\215\351\227\256\351\242\230\347\232\204\345\217\246\344\270\200\347\247\215\345\206\231\346\263\225.md" index b4bdda0060..f48097e179 100644 --- "a/problems/\345\233\236\346\272\257\347\256\227\346\263\225\345\216\273\351\207\215\351\227\256\351\242\230\347\232\204\345\217\246\344\270\200\347\247\215\345\206\231\346\263\225.md" +++ "b/problems/\345\233\236\346\272\257\347\256\227\346\263\225\345\216\273\351\207\215\351\227\256\351\242\230\347\232\204\345\217\246\344\270\200\347\247\215\345\206\231\346\263\225.md" @@ -365,6 +365,87 @@ class Solution: return res ``` +TypeScript: + +**90.子集II** + +```typescript +function subsetsWithDup(nums: number[]): number[][] { + nums.sort((a, b) => a - b); + const resArr: number[][] = []; + backTraking(nums, 0, []); + return resArr; + function backTraking(nums: number[], startIndex: number, route: number[]): void { + resArr.push(route.slice()); + const helperSet: Set = new Set(); + for (let i = startIndex, length = nums.length; i < length; i++) { + if (helperSet.has(nums[i])) continue; + helperSet.add(nums[i]); + route.push(nums[i]); + backTraking(nums, i + 1, route); + route.pop(); + } + } +}; +``` + +**40. 组合总和 II** + +```typescript +function combinationSum2(candidates: number[], target: number): number[][] { + candidates.sort((a, b) => a - b); + const resArr: number[][] = []; + backTracking(candidates, target, 0, 0, []); + return resArr; + function backTracking( + candidates: number[], target: number, + curSum: number, startIndex: number, route: number[] + ) { + if (curSum > target) return; + if (curSum === target) { + resArr.push(route.slice()); + return; + } + const helperSet: Set = new Set(); + for (let i = startIndex, length = candidates.length; i < length; i++) { + let tempVal: number = candidates[i]; + if (helperSet.has(tempVal)) continue; + helperSet.add(tempVal); + route.push(tempVal); + backTracking(candidates, target, curSum + tempVal, i + 1, route); + route.pop(); + + } + } +}; +``` + +**47. 全排列 II** + +```typescript +function permuteUnique(nums: number[]): number[][] { + const resArr: number[][] = []; + const usedArr: boolean[] = []; + backTracking(nums, []); + return resArr; + function backTracking(nums: number[], route: number[]): void { + if (nums.length === route.length) { + resArr.push(route.slice()); + return; + } + const usedSet: Set = new Set(); + for (let i = 0, length = nums.length; i < length; i++) { + if (usedArr[i] === true || usedSet.has(nums[i])) continue; + usedSet.add(nums[i]); + route.push(nums[i]); + usedArr[i] = true; + backTracking(nums, route); + usedArr[i] = false; + route.pop(); + } + } +}; +``` Go: From 3635751759fcf689f9baae10ab5fe4a5d642b5f8 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Sun, 3 Apr 2022 23:15:06 +0800 Subject: [PATCH 0481/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880332.?= =?UTF-8?q?=E9=87=8D=E6=96=B0=E5=AE=89=E6=8E=92=E8=A1=8C=E7=A8=8B.md?= =?UTF-8?q?=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...11\346\216\222\350\241\214\347\250\213.md" | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git "a/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" "b/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" index 01f81c4dc6..370db45bec 100644 --- "a/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" +++ "b/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" @@ -448,6 +448,50 @@ var findItinerary = function(tickets) { ``` +### TypeScript + +```typescript +function findItinerary(tickets: string[][]): string[] { + /** + TicketsMap 实例: + { NRT: Map(1) { 'JFK' => 1 }, JFK: Map(2) { 'KUL' => 1, 'NRT' => 1 } } + 这里选择Map数据结构的原因是:与Object类型的一个主要差异是,Map实例会维护键值对的插入顺序。 + */ + type TicketsMap = { + [index: string]: Map + }; + tickets.sort((a, b) => { + return a[1] < b[1] ? -1 : 1; + }); + const ticketMap: TicketsMap = {}; + for (const [from, to] of tickets) { + if (ticketMap[from] === undefined) { + ticketMap[from] = new Map(); + } + ticketMap[from].set(to, (ticketMap[from].get(to) || 0) + 1); + } + const resRoute = ['JFK']; + backTracking(tickets.length, ticketMap, resRoute); + return resRoute; + function backTracking(ticketNum: number, ticketMap: TicketsMap, route: string[]): boolean { + if (route.length === ticketNum + 1) return true; + const targetMap = ticketMap[route[route.length - 1]]; + if (targetMap !== undefined) { + for (const [to, count] of targetMap.entries()) { + if (count > 0) { + route.push(to); + targetMap.set(to, count - 1); + if (backTracking(ticketNum, ticketMap, route) === true) return true; + targetMap.set(to, count); + route.pop(); + } + } + } + return false; + } +}; +``` + ### Swift 直接迭代tickets数组: From 69a9316bebce0fc3f43835bb9245f124076f105f Mon Sep 17 00:00:00 2001 From: SianXiaoCHN Date: Sun, 3 Apr 2022 23:42:04 -0500 Subject: [PATCH 0482/3019] =?UTF-8?q?python=200860.=E6=9F=A0=E6=AA=AC?= =?UTF-8?q?=E6=B0=B4=E6=89=BE=E9=9B=B6=20=E5=8E=BB=E9=99=A4=E6=97=A0?= =?UTF-8?q?=E7=94=A8=E5=8F=98=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit python 0860.柠檬水找零 去除无用变量:在本题中,20的数量是无用的,因为不需要用来找零,可以不用维护这个变量。 --- ...37\240\346\252\254\346\260\264\346\211\276\351\233\266.md" | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git "a/problems/0860.\346\237\240\346\252\254\346\260\264\346\211\276\351\233\266.md" "b/problems/0860.\346\237\240\346\252\254\346\260\264\346\211\276\351\233\266.md" index f48ecf4d60..ffd5490d6d 100644 --- "a/problems/0860.\346\237\240\346\252\254\346\260\264\346\211\276\351\233\266.md" +++ "b/problems/0860.\346\237\240\346\252\254\346\260\264\346\211\276\351\233\266.md" @@ -157,7 +157,7 @@ class Solution { ```python class Solution: def lemonadeChange(self, bills: List[int]) -> bool: - five, ten, twenty = 0, 0, 0 + five, ten = 0, 0 for bill in bills: if bill == 5: five += 1 @@ -169,10 +169,8 @@ class Solution: if ten > 0 and five > 0: ten -= 1 five -= 1 - twenty += 1 elif five > 2: five -= 3 - twenty += 1 else: return False return True From d3a69ff358793c6c4f6f7636935b545437404f21 Mon Sep 17 00:00:00 2001 From: Camille0512 Date: Mon, 4 Apr 2022 12:55:12 +0800 Subject: [PATCH 0483/3019] Add one more python code --- ...11\346\220\234\347\264\242\346\240\221.md" | 23 +++++++++++- ...60\344\272\214\345\217\211\346\240\221.md" | 35 ------------------- 2 files changed, 22 insertions(+), 36 deletions(-) diff --git "a/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" index 4ed2961977..ff4335fca6 100644 --- "a/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" +++ "b/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" @@ -408,7 +408,28 @@ class Solution: return True ``` -## Go +```python +# 遵循Carl的写法,只添加了节点判断的部分 +class Solution: + def isValidBST(self, root: TreeNode) -> bool: + # method 2 + que, pre = [], None + while root or que: + while root: + que.append(root) + root = root.left + root = que.pop() + # 对第一个节点只做记录,对后面的节点进行比较 + if pre is None: + pre = root.val + else: + if pre >= root.val: return False + pre = root.val + root = root.right + return True +``` + +## Go ```Go import "math" diff --git "a/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" "b/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" index 0007b4d44c..e4e232c884 100644 --- "a/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" @@ -437,41 +437,6 @@ class Solution: return True ``` -层序遍历 - -```python -class Solution: - def isSymmetric(self, root: TreeNode) -> bool: - if not root: return True - que, cnt = [[root.left, root.right]], 1 - while que: - nodes, tmp, sign = que.pop(), [], False - for node in nodes: - if not node: - tmp.append(None) - tmp.append(None) - else: - if node.left: - tmp.append(node.left) - sign = True - else: - tmp.append(None) - if node.right: - tmp.append(node.right) - sign = True - else: - tmp.append(None) - p1, p2 = 0, len(nodes) - 1 - while p1 < p2: - if (not nodes[p1] and nodes[p2]) or (nodes[p1] and not nodes[p2]): return False - elif nodes[p1] and nodes[p2] and nodes[p1].val != nodes[p2].val: return False - p1 += 1 - p2 -= 1 - if sign: que.append(tmp) - cnt += 1 - return True -``` - ## Go ```go From 2b80a6d36af3c00b260b55395361a8c960a02d0a Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Mon, 4 Apr 2022 16:56:36 +0800 Subject: [PATCH 0484/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880051.N?= =?UTF-8?q?=E7=9A=87=E5=90=8E.md=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typesc?= =?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/0051.N\347\232\207\345\220\216.md" | 52 ++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git "a/problems/0051.N\347\232\207\345\220\216.md" "b/problems/0051.N\347\232\207\345\220\216.md" index 7eb0d7a0b1..85524e6f90 100644 --- "a/problems/0051.N\347\232\207\345\220\216.md" +++ "b/problems/0051.N\347\232\207\345\220\216.md" @@ -457,6 +457,58 @@ var solveNQueens = function(n) { }; ``` +## TypeScript + +```typescript +function solveNQueens(n: number): string[][] { + const board: string[][] = new Array(n).fill(0).map(_ => new Array(n).fill('.')); + const resArr: string[][] = []; + backTracking(n, 0, board); + return resArr; + function backTracking(n: number, rowNum: number, board: string[][]): void { + if (rowNum === n) { + resArr.push(transformBoard(board)); + return; + } + for (let i = 0; i < n; i++) { + if (isValid(i, rowNum, board) === true) { + board[rowNum][i] = 'Q'; + backTracking(n, rowNum + 1, board); + board[rowNum][i] = '.'; + } + } + } +}; +function isValid(col: number, row: number, board: string[][]): boolean { + const n: number = board.length; + if (col < 0 || col >= n || row < 0 || row >= n) return false; + // 检查列 + for (let row of board) { + if (row[col] === 'Q') return false; + } + // 检查45度方向 + let x: number = col, + y: number = row; + while (y >= 0 && x < n) { + if (board[y--][x++] === 'Q') return false; + } + // 检查135度方向 + x = col; + y = row; + while (x >= 0 && y >= 0) { + if (board[y--][x--] === 'Q') return false; + } + return true; +} +function transformBoard(board: string[][]): string[] { + const resArr = []; + for (let row of board) { + resArr.push(row.join('')); + } + return resArr; +} +``` + ### Swift ```swift From 5374fb48a4ebacd714cb74ae979a5fd09a4c7f28 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Mon, 4 Apr 2022 21:41:56 +0800 Subject: [PATCH 0485/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880037.?= =?UTF-8?q?=E8=A7=A3=E6=95=B0=E7=8B=AC.md=EF=BC=89=EF=BC=9A=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...7.\350\247\243\346\225\260\347\213\254.md" | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git "a/problems/0037.\350\247\243\346\225\260\347\213\254.md" "b/problems/0037.\350\247\243\346\225\260\347\213\254.md" index 53b9bb67e0..c1ac15af89 100644 --- "a/problems/0037.\350\247\243\346\225\260\347\213\254.md" +++ "b/problems/0037.\350\247\243\346\225\260\347\213\254.md" @@ -439,6 +439,55 @@ var solveSudoku = function(board) { }; ``` +### TypeScript + +```typescript +/** + Do not return anything, modify board in-place instead. + */ +function isValid(col: number, row: number, val: string, board: string[][]): boolean { + let n: number = board.length; + // 列向检查 + for (let rowIndex = 0; rowIndex < n; rowIndex++) { + if (board[rowIndex][col] === val) return false; + } + // 横向检查 + for (let colIndex = 0; colIndex < n; colIndex++) { + if (board[row][colIndex] === val) return false; + } + // 九宫格检查 + const startX = Math.floor(col / 3) * 3; + const startY = Math.floor(row / 3) * 3; + for (let rowIndex = startY; rowIndex < startY + 3; rowIndex++) { + for (let colIndex = startX; colIndex < startX + 3; colIndex++) { + if (board[rowIndex][colIndex] === val) return false; + } + } + return true; +} +function solveSudoku(board: string[][]): void { + let n: number = 9; + backTracking(n, board); + function backTracking(n: number, board: string[][]): boolean { + for (let row = 0; row < n; row++) { + for (let col = 0; col < n; col++) { + if (board[row][col] === '.') { + for (let i = 1; i <= n; i++) { + if (isValid(col, row, String(i), board)) { + board[row][col] = String(i); + if (backTracking(n, board) === true) return true; + board[row][col] = '.'; + } + } + return false; + } + } + } + return true; + } +}; +``` + ### C ```C From f9079ddc18206cd8a16eeb8085808b65ecab6d6e Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Tue, 5 Apr 2022 10:56:53 +0800 Subject: [PATCH 0486/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880455.?= =?UTF-8?q?=E5=88=86=E5=8F=91=E9=A5=BC=E5=B9=B2.md=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...06\345\217\221\351\245\274\345\271\262.md" | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git "a/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" "b/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" index 210b492df6..f012df68b1 100644 --- "a/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" +++ "b/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" @@ -209,7 +209,50 @@ var findContentChildren = function(g, s) { ``` +### TypeScript + +```typescript +// 大饼干尽量喂胃口大的 +function findContentChildren(g: number[], s: number[]): number { + g.sort((a, b) => a - b); + s.sort((a, b) => a - b); + const childLength: number = g.length, + cookieLength: number = s.length; + let curChild: number = childLength - 1, + curCookie: number = cookieLength - 1; + let resCount: number = 0; + while (curChild >= 0 && curCookie >= 0) { + if (g[curChild] <= s[curCookie]) { + curCookie--; + resCount++; + } + curChild--; + } + return resCount; +}; +``` + +```typescript +// 小饼干先喂饱小胃口的 +function findContentChildren(g: number[], s: number[]): number { + g.sort((a, b) => a - b); + s.sort((a, b) => a - b); + const childLength: number = g.length, + cookieLength: number = s.length; + let curChild: number = 0, + curCookie: number = 0; + while (curChild < childLength && curCookie < cookieLength) { + if (g[curChild] <= s[curCookie]) { + curChild++; + } + curCookie++; + } + return curChild; +}; +``` + ### C + ```c int cmp(int* a, int* b) { return *a - *b; From c4992be374628782d18ffa8648fa1443825bc947 Mon Sep 17 00:00:00 2001 From: Lafish <34953046+LeUKi@users.noreply.github.com> Date: Wed, 6 Apr 2022 08:52:45 +0800 Subject: [PATCH 0487/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B00122.=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=BAII=EF=BC=9A=E9=94=99=E5=AD=97=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...32\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" index 83b852c6c0..b31cbae3ec 100644 --- "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" +++ "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" @@ -40,7 +40,7 @@ 本题首先要清楚两点: * 只有一只股票! -* 当前只有买股票或者买股票的操作 +* 当前只有买股票或者卖股票的操作 想获得利润至少要两天为一个交易单元。 From fa00cd53b597d9ce837319f1967d0ae6478c430e Mon Sep 17 00:00:00 2001 From: lingyin Date: Wed, 6 Apr 2022 10:28:57 +0800 Subject: [PATCH 0488/3019] =?UTF-8?q?=E7=AE=80=E5=8C=96Peek=E5=87=BD?= =?UTF-8?q?=E6=95=B0=EF=BC=8C=E5=A4=8D=E7=94=A8Pop?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...345\256\236\347\216\260\351\230\237\345\210\227.md" | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git "a/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" "b/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" index b00ffd803f..1a56d9f386 100644 --- "a/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" +++ "b/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" @@ -275,15 +275,11 @@ func (this *MyQueue) Pop() int { /** Get the front element. */ func (this *MyQueue) Peek() int { - for len(this.stack) != 0 { - val := this.stack[len(this.stack)-1] - this.stack = this.stack[:len(this.stack)-1] - this.back = append(this.back, val) - } - if len(this.back) == 0 { + val := this.Pop() + if val == 0 { return 0 } - val := this.back[len(this.back)-1] + this.back = append(this.back, val) return val } From ee93d4d62c36f74e5f878882cd28f7877c60d570 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Wed, 6 Apr 2022 15:40:01 +0800 Subject: [PATCH 0489/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880376.?= =?UTF-8?q?=E6=91=86=E5=8A=A8=E5=BA=8F=E5=88=97.md=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...06\345\212\250\345\272\217\345\210\227.md" | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git "a/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" "b/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" index 5076c9adaa..acd8996e91 100644 --- "a/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" +++ "b/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" @@ -298,5 +298,55 @@ var wiggleMaxLength = function(nums) { }; ``` +### TypeScript + +**贪心** + +```typescript +function wiggleMaxLength(nums: number[]): number { + let length: number = nums.length; + if (length <= 1) return length; + let preDiff: number = 0; + let curDiff: number = 0; + let count: number = 1; + for (let i = 1; i < length; i++) { + curDiff = nums[i] - nums[i - 1]; + if ( + (preDiff <= 0 && curDiff > 0) || + (preDiff >= 0 && curDiff < 0) + ) { + preDiff = curDiff; + count++; + } + } + return count; +}; +``` + +**动态规划** + +```typescript +function wiggleMaxLength(nums: number[]): number { + const length: number = nums.length; + if (length <= 1) return length; + const dp: number[][] = new Array(length).fill(0).map(_ => []); + dp[0][0] = 1; // 第一个数作为波峰 + dp[0][1] = 1; // 第一个数作为波谷 + for (let i = 1; i < length; i++) { + dp[i][0] = 1; + dp[i][1] = 1; + for (let j = 0; j < i; j++) { + if (nums[j] < nums[i]) dp[i][0] = Math.max(dp[i][0], dp[j][1] + 1); + } + for (let j = 0; j < i; j++) { + if (nums[j] > nums[i]) dp[i][1] = Math.max(dp[i][1], dp[j][0] + 1); + } + } + return Math.max(dp[length - 1][0], dp[length - 1][1]); +}; +``` + + + -----------------------
From e4f34f3e47f6120c85e48d2032e6c00d1d13dad0 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Wed, 6 Apr 2022 16:23:34 +0800 Subject: [PATCH 0490/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880053.?= =?UTF-8?q?=E6=9C=80=E5=A4=A7=E5=AD=90=E5=BA=8F=E5=92=8C.md=EF=BC=89?= =?UTF-8?q?=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...47\345\255\220\345\272\217\345\222\214.md" | 37 ++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git "a/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" "b/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" index 3d11c91efb..b5fb7642c5 100644 --- "a/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" +++ "b/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" @@ -211,7 +211,7 @@ func maxSubArray(nums []int) int { return maxSum } ``` - + ### Javascript: ```Javascript var maxSubArray = function(nums) { @@ -230,6 +230,41 @@ var maxSubArray = function(nums) { }; ``` +### TypeScript + +**贪心** + +```typescript +function maxSubArray(nums: number[]): number { + let curSum: number = 0; + let resMax: number = -Infinity; + for (let i = 0, length = nums.length; i < length; i++) { + curSum += nums[i]; + resMax = Math.max(curSum, resMax); + if (curSum < 0) curSum = 0; + } + return resMax; +}; +``` + +**动态规划** + +```typescript +// 动态规划 +function maxSubArray(nums: number[]): number { + const length = nums.length; + if (length === 0) return 0; + const dp: number[] = []; + dp[0] = nums[0]; + let resMax: number = nums[0]; + for (let i = 1; i < length; i++) { + dp[i] = Math.max(dp[i - 1] + nums[i], nums[i]); + resMax = Math.max(resMax, dp[i]); + } + return resMax; +}; +``` + ----------------------- From 92c6b3609fb85036f68039fd20ac52c8c919fba0 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Wed, 6 Apr 2022 22:46:46 +0800 Subject: [PATCH 0491/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880122.?= =?UTF-8?q?=E4=B9=B0=E5=8D=96=E8=82=A1=E7=A5=A8=E7=9A=84=E6=9C=80=E4=BD=B3?= =?UTF-8?q?=E6=97=B6=E6=9C=BAII.md=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0type?= =?UTF-8?q?script=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...234\200\344\275\263\346\227\266\346\234\272II.md" | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" index 83b852c6c0..1e4d017c36 100644 --- "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" +++ "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" @@ -268,6 +268,18 @@ const maxProfit = (prices) => { }; ``` +TypeScript: + +```typescript +function maxProfit(prices: number[]): number { + let resProfit: number = 0; + for (let i = 1, length = prices.length; i < length; i++) { + resProfit += Math.max(prices[i] - prices[i - 1], 0); + } + return resProfit; +}; +``` + C: ```c From 1e6ec2d32a5cb21ba049646979b23ed948f46444 Mon Sep 17 00:00:00 2001 From: zhuye Date: Wed, 6 Apr 2022 23:05:01 +0800 Subject: [PATCH 0492/3019] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E3=80=900707-?= =?UTF-8?q?=E8=AE=BE=E8=AE=A1=E9=93=BE=E8=A1=A8.md=E3=80=91TypeScript?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" | 3 +++ 1 file changed, 3 insertions(+) diff --git "a/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" "b/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" index 86f3a683ed..c5a5557409 100644 --- "a/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" +++ "b/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" @@ -973,6 +973,9 @@ class MyLinkedList { // 处理头节点 if (index === 0) { this.head = this.head!.next; + if (index === this.size - 1) { + this.tail = null + } this.size--; return; } From 6e09456aefe7981d272e355c28e4ab43597ac5b1 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Wed, 6 Apr 2022 23:23:22 +0800 Subject: [PATCH 0493/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880055.?= =?UTF-8?q?=E8=B7=B3=E8=B7=83=E6=B8=B8=E6=88=8F.md=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\263\350\267\203\346\270\270\346\210\217.md" | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git "a/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" "b/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" index c0890f75f3..9461424265 100644 --- "a/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" +++ "b/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" @@ -154,6 +154,23 @@ var canJump = function(nums) { }; ``` +### TypeScript + +```typescript +function canJump(nums: number[]): boolean { + let farthestIndex: number = 0; + let cur: number = 0; + while (cur <= farthestIndex) { + farthestIndex = Math.max(farthestIndex, cur + nums[cur]); + if (farthestIndex >= nums.length - 1) return true; + cur++; + } + return false; +}; +``` + + + -----------------------
From 31800730a2634f0a40c99075d277acc251c1634a Mon Sep 17 00:00:00 2001 From: zhuye Date: Wed, 6 Apr 2022 23:30:18 +0800 Subject: [PATCH 0494/3019] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E3=80=900707-?= =?UTF-8?q?=E8=AE=BE=E8=AE=A1=E9=93=BE=E8=A1=A8.md=E3=80=91TypeScript?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" | 1 + 1 file changed, 1 insertion(+) diff --git "a/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" "b/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" index c5a5557409..37ce15adce 100644 --- "a/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" +++ "b/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" @@ -973,6 +973,7 @@ class MyLinkedList { // 处理头节点 if (index === 0) { this.head = this.head!.next; + // 如果链表中只有一个元素,删除头节点后,需要处理尾节点 if (index === this.size - 1) { this.tail = null } From f70acb963a499e3a627d2358a4119b24649d74d7 Mon Sep 17 00:00:00 2001 From: speed <771935730@qq.com> Date: Thu, 7 Apr 2022 00:03:02 +0800 Subject: [PATCH 0495/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200763.=E5=88=92?= =?UTF-8?q?=E5=88=86=E5=AD=97=E6=AF=8D=E5=8C=BA=E9=97=B4.md=20=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=E7=B1=BB=E4=BC=BC=E5=BC=95=E7=88=86=E6=B0=94=E7=90=83?= =?UTF-8?q?=E7=9A=84=E6=80=9D=E8=B7=AF=E4=BB=A5=E5=8F=8A=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...27\346\257\215\345\214\272\351\227\264.md" | 47 +++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git "a/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" "b/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" index 03d3a73b3b..d3958bd5e6 100644 --- "a/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" +++ "b/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" @@ -77,6 +77,53 @@ public: 但这道题目的思路是很巧妙的,所以有必要介绍给大家做一做,感受一下。 +## 补充 + +这里提供一种与[452.用最少数量的箭引爆气球](https://programmercarl.com/0452.用最少数量的箭引爆气球.html)、[435.无重叠区间](https://programmercarl.com/0435.无重叠区间.html)相同的思路。 + +统计字符串中所有字符的起始和结束位置,记录这些区间(实际上也就是[435.无重叠区间](https://programmercarl.com/0435.无重叠区间.html)题目里的输入),**将区间按左边界从小到大排序,找到边界将区间划分成组,互不重叠。找到的边界就是答案。** + +```CPP +class Solution { +public: + static bool cmp(vector &a, vector &b) { + return a[0] < b[0]; + } + // 记录每个字母出现的区间 + void countLabels(string s, vector> &hash) { + for (int i = 0; i < s.size(); ++i) { + if (hash[s[i] - 'a'][0] == INT_MIN) { + hash[s[i] - 'a'][0] = i; + } + hash[s[i] - 'a'][1] = i; + } + } + vector partitionLabels(string s) { + vector res; + vector> hash(26, vector(2, INT_MIN)); + countLabels(s, hash); + // 按照左边界从小到大排序 + sort(hash.begin(), hash.end(), cmp); + // 记录最大右边界 + int rightBoard = INT_MIN; + int leftBoard = 0; + for (int i = 0; i < hash.size(); ++i) { + // 过滤掉字符串中没有的字母 + if (hash[i][0] == INT_MIN) { + continue; + } + // 一旦下一区间左边界大于当前右边界,即可认为出现分割点 + if (rightBoard != INT_MIN && hash[i][0] > rightBoard) { + res.push_back(rightBoard - leftBoard + 1); + leftBoard = hash[i][0]; + } + rightBoard = max(rightBoard, hash[i][1]); + } + res.push_back(rightBoard - leftBoard + 1); + return res; + } +}; +``` ## 其他语言版本 From c590dfc5f29e910a85798f144bcc7178dda2bde4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E5=91=98Carl?= Date: Thu, 7 Apr 2022 09:34:25 +0800 Subject: [PATCH 0496/3019] Delete yarn.lock --- yarn.lock | 4 ---- 1 file changed, 4 deletions(-) delete mode 100644 yarn.lock diff --git a/yarn.lock b/yarn.lock deleted file mode 100644 index 3ff608aed0..0000000000 --- a/yarn.lock +++ /dev/null @@ -1,4 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - From bbe312015eca5207064aa42f3530e254845a1e62 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E5=91=98Carl?= Date: Thu, 7 Apr 2022 09:34:51 +0800 Subject: [PATCH 0497/3019] Delete .yarn-integrity --- node_modules/.yarn-integrity | 10 ---------- 1 file changed, 10 deletions(-) delete mode 100644 node_modules/.yarn-integrity diff --git a/node_modules/.yarn-integrity b/node_modules/.yarn-integrity deleted file mode 100644 index 29e4357c98..0000000000 --- a/node_modules/.yarn-integrity +++ /dev/null @@ -1,10 +0,0 @@ -{ - "systemParams": "win32-x64-83", - "modulesFolders": [], - "flags": [], - "linkedModules": [], - "topLevelPatterns": [], - "lockfileEntries": {}, - "files": [], - "artifacts": {} -} \ No newline at end of file From 3048b00d72146838275c37ec549b76eeca8813a9 Mon Sep 17 00:00:00 2001 From: speed Date: Thu, 7 Apr 2022 10:52:27 +0800 Subject: [PATCH 0498/3019] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BA=860763.?= =?UTF-8?q?=E5=88=92=E5=88=86=E5=AD=97=E6=AF=8D=E5=8C=BA=E9=97=B4.md=20?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E8=B4=AA=E5=BF=83=E6=80=9D=E8=B7=AF=E7=9A=84?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...27\346\257\215\345\214\272\351\227\264.md" | 28 ++++++++++++------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git "a/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" "b/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" index d3958bd5e6..d350f2552a 100644 --- "a/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" +++ "b/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" @@ -90,35 +90,43 @@ public: return a[0] < b[0]; } // 记录每个字母出现的区间 - void countLabels(string s, vector> &hash) { + vector> countLabels(string s) { + vector> hash(26, vector(2, INT_MIN)); + vector> hash_filter; for (int i = 0; i < s.size(); ++i) { if (hash[s[i] - 'a'][0] == INT_MIN) { hash[s[i] - 'a'][0] = i; } hash[s[i] - 'a'][1] = i; } + // 去除字符串中未出现的字母所占用区间 + for (int i = 0; i < hash.size(); ++i) { + if (hash[i][0] != INT_MIN) { + hash_filter.push_back(hash[i]); + } + } + return hash_filter; } vector partitionLabels(string s) { vector res; - vector> hash(26, vector(2, INT_MIN)); - countLabels(s, hash); + // 这一步得到的 hash 即为无重叠区间题意中的输入样例格式:区间列表 + // 只不过现在我们要求的是区间分割点 + vector> hash = countLabels(s); // 按照左边界从小到大排序 sort(hash.begin(), hash.end(), cmp); // 记录最大右边界 - int rightBoard = INT_MIN; + int rightBoard = hash[0][1]; int leftBoard = 0; - for (int i = 0; i < hash.size(); ++i) { - // 过滤掉字符串中没有的字母 - if (hash[i][0] == INT_MIN) { - continue; - } + for (int i = 1; i < hash.size(); ++i) { + // 由于字符串一定能分割,因此, // 一旦下一区间左边界大于当前右边界,即可认为出现分割点 - if (rightBoard != INT_MIN && hash[i][0] > rightBoard) { + if (hash[i][0] > rightBoard) { res.push_back(rightBoard - leftBoard + 1); leftBoard = hash[i][0]; } rightBoard = max(rightBoard, hash[i][1]); } + // 最右端 res.push_back(rightBoard - leftBoard + 1); return res; } From 3e856447424fd1a4cd37ed7b54331fea33fec588 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Thu, 7 Apr 2022 15:25:48 +0800 Subject: [PATCH 0499/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880045.?= =?UTF-8?q?=E8=B7=B3=E8=B7=83=E6=B8=B8=E6=88=8FII.md=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\350\267\203\346\270\270\346\210\217II.md" | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git "a/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" "b/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" index 7a3f048c60..4caff04246 100644 --- "a/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" +++ "b/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" @@ -250,6 +250,27 @@ var jump = function(nums) { }; ``` +### TypeScript + +```typescript +function jump(nums: number[]): number { + const length: number = nums.length; + let curFarthestIndex: number = 0, + nextFarthestIndex: number = 0; + let curIndex: number = 0; + let stepNum: number = 0; + while (curIndex < length - 1) { + nextFarthestIndex = Math.max(nextFarthestIndex, curIndex + nums[curIndex]); + if (curIndex === curFarthestIndex) { + curFarthestIndex = nextFarthestIndex; + stepNum++; + } + curIndex++; + } + return stepNum; +}; +``` + From 38deed9e52058872eb522a8d629a265ae78df1e2 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Thu, 7 Apr 2022 15:58:32 +0800 Subject: [PATCH 0500/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=881005.K?= =?UTF-8?q?=E6=AC=A1=E5=8F=96=E5=8F=8D=E5=90=8E=E6=9C=80=E5=A4=A7=E5=8C=96?= =?UTF-8?q?=E7=9A=84=E6=95=B0=E7=BB=84=E5=92=8C.md=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...04\346\225\260\347\273\204\345\222\214.md" | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git "a/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" "b/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" index 45f186e2b9..80c47147e5 100644 --- "a/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" +++ "b/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" @@ -211,5 +211,29 @@ var largestSumAfterKNegations = function(nums, k) { }; ``` +### TypeScript + +```typescript +function largestSumAfterKNegations(nums: number[], k: number): number { + nums.sort((a, b) => Math.abs(b) - Math.abs(a)); + let curIndex: number = 0; + const length = nums.length; + while (curIndex < length && k > 0) { + if (nums[curIndex] < 0) { + nums[curIndex] *= -1; + k--; + } + curIndex++; + } + while (k > 0) { + nums[length - 1] *= -1; + k--; + } + return nums.reduce((pre, cur) => pre + cur, 0); +}; +``` + + + -----------------------
From 328b447cf44335883ce51109859f6f801e2515a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=A2=A6=E6=B4=81?= <3224935686@qq.com> Date: Thu, 7 Apr 2022 21:16:00 +0800 Subject: [PATCH 0501/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0(0108.=E5=B0=86?= =?UTF-8?q?=E6=9C=89=E5=BA=8F=E6=95=B0=E7=BB=84=E8=BD=AC=E6=8D=A2=E4=B8=BA?= =?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=90=9C=E7=B4=A2=E6=A0=91.md):=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0JavaScript=E8=BF=AD=E4=BB=A3=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...11\346\220\234\347\264\242\346\240\221.md" | 40 ++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git "a/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" index bd5915fd31..6ee3947bec 100644 --- "a/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" +++ "b/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" @@ -355,6 +355,7 @@ func sortedArrayToBST(nums []int) *TreeNode { ``` ## JavaScript +递归 ```javascript var sortedArrayToBST = function (nums) { @@ -372,7 +373,44 @@ var sortedArrayToBST = function (nums) { return buildTree(nums, 0, nums.length - 1); }; ``` - +迭代 +```JavaScript +var sortedArrayToBST = function(nums) { + if(nums.length===0){ + return null; + } + let root=new TreeNode(0); //初始根节点 + let nodeQue=[root]; //放遍历的节点,并初始化 + let leftQue=[0]; //放左区间的下标,初始化 + let rightQue=[nums.length-1]; // 放右区间的下标 + + while(nodeQue.length){ + let curNode=nodeQue.pop(); + let left=leftQue.pop(); + let right=rightQue.pop(); + let mid=left+Math.floor((right-left)/2); + + curNode.val=nums[mid]; //将下标为mid的元素给中间节点 + +// 处理左区间 + if(left<=mid-1){ + curNode.left=new TreeNode(0); + nodeQue.push(curNode.left); + leftQue.push(left); + rightQue.push(mid-1); + } + +// 处理右区间 + if(right>=mid+1){ + curNode.right=new TreeNode(0); + nodeQue.push(curNode.right); + leftQue.push(mid+1); + rightQue.push(right); + } + } + return root; +}; +``` ## TypeScript ```typescript From 82df90fd14fc8897559256a65d3ba53258daf262 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Thu, 7 Apr 2022 23:58:15 +0800 Subject: [PATCH 0502/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880134.?= =?UTF-8?q?=E5=8A=A0=E6=B2=B9=E7=AB=99.md=EF=BC=89=EF=BC=9A=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...4.\345\212\240\346\262\271\347\253\231.md" | 45 ++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git "a/problems/0134.\345\212\240\346\262\271\347\253\231.md" "b/problems/0134.\345\212\240\346\262\271\347\253\231.md" index 1062a91c2d..d3b3d4539b 100644 --- "a/problems/0134.\345\212\240\346\262\271\347\253\231.md" +++ "b/problems/0134.\345\212\240\346\262\271\347\253\231.md" @@ -235,7 +235,7 @@ class Solution { return index; } } -``` +``` ### Python ```python @@ -340,7 +340,50 @@ var canCompleteCircuit = function(gas, cost) { }; ``` +### TypeScript + +**暴力法:** + +```typescript +function canCompleteCircuit(gas: number[], cost: number[]): number { + for (let i = 0, length = gas.length; i < length; i++) { + let curSum: number = 0; + let index: number = i; + while (curSum >= 0 && index < i + length) { + let tempIndex: number = index % length; + curSum += gas[tempIndex] - cost[tempIndex]; + index++; + } + if (index === i + length && curSum >= 0) return i; + } + return -1; +}; +``` + +**解法二:** + +```typescript +function canCompleteCircuit(gas: number[], cost: number[]): number { + let total: number = 0; + let curGas: number = 0; + let tempDiff: number = 0; + let resIndex: number = 0; + for (let i = 0, length = gas.length; i < length; i++) { + tempDiff = gas[i] - cost[i]; + total += tempDiff; + curGas += tempDiff; + if (curGas < 0) { + resIndex = i + 1; + curGas = 0; + } + } + if (total < 0) return -1; + return resIndex; +}; +``` + ### C + ```c int canCompleteCircuit(int* gas, int gasSize, int* cost, int costSize){ int curSum = 0; From 1496b59646e00b189bd3586145e1474d593b65cb Mon Sep 17 00:00:00 2001 From: mxdneu Date: Fri, 8 Apr 2022 00:17:47 +0800 Subject: [PATCH 0503/3019] =?UTF-8?q?fix=20js=E8=9E=BA=E6=97=8B=E6=95=B0?= =?UTF-8?q?=E7=BB=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" "b/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" index 5c679982ce..a7b19a34fe 100644 --- "a/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" +++ "b/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" @@ -246,11 +246,11 @@ var generateMatrix = function(n) { res[row][col] = count++; } // 下行从右到左(左闭右开) - for (; col > startX; col--) { + for (; col > startY; col--) { res[row][col] = count++; } // 左列做下到上(左闭右开) - for (; row > startY; row--) { + for (; row > startX; row--) { res[row][col] = count++; } From 0ecc3bd7cfdea391e9725030442cad617c277989 Mon Sep 17 00:00:00 2001 From: sanwulol Date: Fri, 8 Apr 2022 17:00:59 +0800 Subject: [PATCH 0504/3019] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E3=80=900122-?= =?UTF-8?q?=E4=B9=B0=E5=8D=96=E8=82=A1=E7=A5=A8=E7=9A=84=E6=9C=80=E4=BD=B3?= =?UTF-8?q?=E6=97=B6=E6=9C=BAII.md=E3=80=91javaScript=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...32\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" index 83b852c6c0..1e6dc7c0ae 100644 --- "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" +++ "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" @@ -264,7 +264,7 @@ const maxProfit = (prices) => { dp[i][1] = Math.max(dp[i-1][1], dp[i-1][0] + prices[i]); } - return dp[prices.length -1][0]; + return dp[prices.length -1][1]; }; ``` From ff135662de4d1f282ead7f76c17a35806d99259e Mon Sep 17 00:00:00 2001 From: sanwulol Date: Fri, 8 Apr 2022 17:01:19 +0800 Subject: [PATCH 0505/3019] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E3=80=900122-?= =?UTF-8?q?=E4=B9=B0=E5=8D=96=E8=82=A1=E7=A5=A8=E7=9A=84=E6=9C=80=E4=BD=B3?= =?UTF-8?q?=E6=97=B6=E6=9C=BAII.md(=E5=8A=A8=E6=80=81=E8=A7=84=E5=88=92)?= =?UTF-8?q?=E3=80=91javaScript=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" index 615d79bbcd..5a165a1438 100644 --- "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" +++ "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" @@ -276,7 +276,7 @@ const maxProfit = (prices) => { dp[i][1] = Math.max(dp[i-1][1], dp[i-1][0] + prices[i]); } - return dp[prices.length -1][0]; + return dp[prices.length -1][1]; }; // 方法二:动态规划(滚动数组) From ccfa2c495fc5c7762517dc990a2fe58328a3292a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=9F=E4=BB=A4=E4=BB=A4?= Date: Fri, 8 Apr 2022 18:02:30 +0800 Subject: [PATCH 0506/3019] =?UTF-8?q?Update=200028.=E5=AE=9E=E7=8E=B0strSt?= =?UTF-8?q?r.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加 swift 前缀表两种实现方法 --- .../0028.\345\256\236\347\216\260strStr.md" | 107 ++++++++++++++++++ 1 file changed, 107 insertions(+) diff --git "a/problems/0028.\345\256\236\347\216\260strStr.md" "b/problems/0028.\345\256\236\347\216\260strStr.md" index 634d8535a2..d67e5f70fc 100644 --- "a/problems/0028.\345\256\236\347\216\260strStr.md" +++ "b/problems/0028.\345\256\236\347\216\260strStr.md" @@ -1059,5 +1059,112 @@ func getNext(_ next: inout [Int], needle: [Character]) { ``` +> 前缀表右移 + +```swift +func strStr(_ haystack: String, _ needle: String) -> Int { + + let s = Array(haystack), p = Array(needle) + guard p.count != 0 else { return 0 } + + var j = 0 + var next = [Int].init(repeating: 0, count: p.count) + getNext(&next, p) + + for i in 0 ..< s.count { + + while j > 0 && s[i] != p[j] { + j = next[j] + } + + if s[i] == p[j] { + j += 1 + } + + if j == p.count { + return i - p.count + 1 + } + } + + return -1 + } + + // 前缀表后移一位,首位用 -1 填充 + func getNext(_ next: inout [Int], _ needle: [Character]) { + + guard needle.count > 1 else { return } + + var j = 0 + next[0] = j + + for i in 1 ..< needle.count-1 { + + while j > 0 && needle[i] != needle[j] { + j = next[j-1] + } + + if needle[i] == needle[j] { + j += 1 + } + + next[i] = j + } + next.removeLast() + next.insert(-1, at: 0) + } +``` + +> 前缀表统一不减一 +```swift + +func strStr(_ haystack: String, _ needle: String) -> Int { + + let s = Array(haystack), p = Array(needle) + guard p.count != 0 else { return 0 } + + var j = 0 + var next = [Int](repeating: 0, count: needle.count) + // KMP + getNext(&next, needle: p) + + for i in 0 ..< s.count { + while j > 0 && s[i] != p[j] { + j = next[j-1] + } + + if s[i] == p[j] { + j += 1 + } + + if j == p.count { + return i - p.count + 1 + } + } + return -1 + } + + //前缀表 + func getNext(_ next: inout [Int], needle: [Character]) { + + var j = 0 + next[0] = j + + for i in 1 ..< needle.count { + + while j>0 && needle[i] != needle[j] { + j = next[j-1] + } + + if needle[i] == needle[j] { + j += 1 + } + + next[i] = j + + } + } + +``` + -----------------------
From 559f03c92869ca55ae929d66de872f5ddda70567 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=9F=E4=BB=A4=E4=BB=A4?= Date: Fri, 8 Apr 2022 18:11:05 +0800 Subject: [PATCH 0507/3019] =?UTF-8?q?Update=200459.=E9=87=8D=E5=A4=8D?= =?UTF-8?q?=E7=9A=84=E5=AD=90=E5=AD=97=E7=AC=A6=E4=B8=B2.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...20\345\255\227\347\254\246\344\270\262.md" | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git "a/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" "b/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" index ccfb485cbb..6a9b4260ac 100644 --- "a/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" @@ -421,5 +421,48 @@ function repeatedSubstringPattern(s: string): boolean { }; ``` + +Swift: + +> 前缀表统一减一 +```swift + func repeatedSubstringPattern(_ s: String) -> Bool { + + let sArr = Array(s) + let len = s.count + if len == 0 { + return false + } + var next = Array.init(repeating: -1, count: len) + + getNext(&next,sArr) + + if next.last != -1 && len % (len - (next[len-1] + 1)) == 0{ + return true + } + + return false + } + + func getNext(_ next: inout [Int], _ str:[Character]) { + + var j = -1 + next[0] = j + + for i in 1 ..< str.count { + + while j >= 0 && str[j+1] != str[i] { + j = next[j] + } + + if str[i] == str[j+1] { + j += 1 + } + + next[i] = j + } + } +``` + -----------------------
From 278bcb67b8250c0cea57b6a8f970e007d1259f23 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Fri, 8 Apr 2022 20:28:24 +0800 Subject: [PATCH 0508/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880135.?= =?UTF-8?q?=E5=88=86=E5=8F=91=E7=B3=96=E6=9E=9C.md=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...06\345\217\221\347\263\226\346\236\234.md" | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git "a/problems/0135.\345\210\206\345\217\221\347\263\226\346\236\234.md" "b/problems/0135.\345\210\206\345\217\221\347\263\226\346\236\234.md" index ccdabc16b4..b8bdae0ee1 100644 --- "a/problems/0135.\345\210\206\345\217\221\347\263\226\346\236\234.md" +++ "b/problems/0135.\345\210\206\345\217\221\347\263\226\346\236\234.md" @@ -238,6 +238,32 @@ var candy = function(ratings) { }; ``` +### TypeScript + +```typescript +function candy(ratings: number[]): number { + const candies: number[] = []; + candies[0] = 1; + // 保证右边高分孩子一定比左边低分孩子发更多的糖果 + for (let i = 1, length = ratings.length; i < length; i++) { + if (ratings[i] > ratings[i - 1]) { + candies[i] = candies[i - 1] + 1; + } else { + candies[i] = 1; + } + } + // 保证左边高分孩子一定比右边低分孩子发更多的糖果 + for (let i = ratings.length - 2; i >= 0; i--) { + if (ratings[i] > ratings[i + 1]) { + candies[i] = Math.max(candies[i], candies[i + 1] + 1); + } + } + return candies.reduce((pre, cur) => pre + cur); +}; +``` + + + -----------------------
From 2f5996de0d7bcb91c615dbe9ff8e07cb339a1e42 Mon Sep 17 00:00:00 2001 From: Austin <40263822+LookCos@users.noreply.github.com> Date: Fri, 8 Apr 2022 21:01:24 +0800 Subject: [PATCH 0509/3019] =?UTF-8?q?Update=200416.=E5=88=86=E5=89=B2?= =?UTF-8?q?=E7=AD=89=E5=92=8C=E5=AD=90=E9=9B=86.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 错别字。 --- ...\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" "b/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" index c8d9bc0452..70f0cb518e 100644 --- "a/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" +++ "b/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" @@ -50,7 +50,7 @@ ## 01背包问题 -背包问题,大家都知道,有N件物品和一个最多能被重量为W 的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品只能用一次,求解将哪些物品装入背包里物品价值总和最大。 +背包问题,大家都知道,有N件物品和一个最多能背重量为W 的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品只能用一次,求解将哪些物品装入背包里物品价值总和最大。 **背包问题有多种背包方式,常见的有:01背包、完全背包、多重背包、分组背包和混合背包等等。** From 2f3f35c5727cb9469e3c186f26217d8cb053e242 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Fri, 8 Apr 2022 21:33:51 +0800 Subject: [PATCH 0510/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880860.?= =?UTF-8?q?=E6=9F=A0=E6=AA=AC=E6=B0=B4=E6=89=BE=E9=9B=B6.md=EF=BC=89?= =?UTF-8?q?=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...54\346\260\264\346\211\276\351\233\266.md" | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git "a/problems/0860.\346\237\240\346\252\254\346\260\264\346\211\276\351\233\266.md" "b/problems/0860.\346\237\240\346\252\254\346\260\264\346\211\276\351\233\266.md" index f48ecf4d60..026c2e6384 100644 --- "a/problems/0860.\346\237\240\346\252\254\346\260\264\346\211\276\351\233\266.md" +++ "b/problems/0860.\346\237\240\346\252\254\346\260\264\346\211\276\351\233\266.md" @@ -254,5 +254,39 @@ var lemonadeChange = function(bills) { ``` +### TypeScript + +```typescript +function lemonadeChange(bills: number[]): boolean { + let five: number = 0, + ten: number = 0; + for (let bill of bills) { + switch (bill) { + case 5: + five++; + break; + case 10: + if (five < 1) return false; + five--; + ten++ + break; + case 20: + if (ten > 0 && five > 0) { + five--; + ten--; + } else if (five > 2) { + five -= 3; + } else { + return false; + } + break; + } + } + return true; +}; +``` + + + -----------------------
From 0e1cbda7153b3b5b2892110696f10afe7833a38f Mon Sep 17 00:00:00 2001 From: "Neil.Liu" <88214924@qq.com> Date: Fri, 8 Apr 2022 23:56:49 +0800 Subject: [PATCH 0511/3019] =?UTF-8?q?Update=200121.=E5=8D=96=E8=82=A1?= =?UTF-8?q?=E7=A5=A8=E7=9A=84=E6=9C=80=E4=BD=B3=E6=97=B6=E6=9C=BA.md=20?= =?UTF-8?q?=E8=B4=AA=E5=BF=83=E4=BB=A5=E5=8F=8A=E5=8A=A8=E6=80=81=E8=A7=84?= =?UTF-8?q?=E5=88=92=20Go=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...00\344\275\263\346\227\266\346\234\272.md" | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git "a/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" "b/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" index e7c0ac65ba..f0bc3b9764 100644 --- "a/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" +++ "b/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" @@ -311,7 +311,36 @@ class Solution: ``` Go: +> 贪心法: +```Go +func maxProfit(prices []int) int { + low := math.MaxInt32 + rlt := 0 + for i := range prices{ + low = min(low, prices[i]) + rlt = max(rlt, prices[i]-low) + } + + return rlt +} +func min(a, b int) int { + if a < b{ + return a + } + + return b +} + +func max(a, b int) int { + if a > b{ + return a + } + + return b +} +``` +> 动态规划:版本一 ```Go func maxProfit(prices []int) int { length:=len(prices) @@ -338,6 +367,29 @@ func max(a,b int)int { } ``` +> 动态规划:版本二 +```Go +func maxProfit(prices []int) int { + dp := [2][2]int{} + dp[0][0] = -prices[0] + dp[0][1] = 0 + for i := 1; i < len(prices); i++{ + dp[i%2][0] = max(dp[(i-1)%2][0], -prices[i]) + dp[i%2][1] = max(dp[(i-1)%2][1], dp[(i-1)%2][0]+prices[i]) + } + + return dp[(len(prices)-1)%2][1] +} + +func max(a, b int) int { + if a > b{ + return a + } + + return b +} +``` + JavaScript: > 动态规划 From 888bd8fe0b2320ffd0afe4cfe014e79116d23944 Mon Sep 17 00:00:00 2001 From: dmzlingyin Date: Sat, 9 Apr 2022 00:12:46 +0800 Subject: [PATCH 0512/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0(ACM=E6=A8=A1?= =?UTF-8?q?=E5=BC=8F=E5=A6=82=E4=BD=95=E6=9E=84=E5=BB=BA=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=A0=91.md):=20Go=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...72\344\272\214\345\217\211\346\240\221.md" | 66 +++++++++++++++++++ 1 file changed, 66 insertions(+) diff --git "a/problems/\345\211\215\345\272\217/ACM\346\250\241\345\274\217\345\246\202\344\275\225\346\236\204\345\273\272\344\272\214\345\217\211\346\240\221.md" "b/problems/\345\211\215\345\272\217/ACM\346\250\241\345\274\217\345\246\202\344\275\225\346\236\204\345\273\272\344\272\214\345\217\211\346\240\221.md" index bd2e978046..dba87ca113 100644 --- "a/problems/\345\211\215\345\272\217/ACM\346\250\241\345\274\217\345\246\202\344\275\225\346\236\204\345\273\272\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/\345\211\215\345\272\217/ACM\346\250\241\345\274\217\345\246\202\344\275\225\346\236\204\345\273\272\344\272\214\345\217\211\346\240\221.md" @@ -220,6 +220,72 @@ int main() { ## Go ```Go +package main + +import "fmt" + +type TreeNode struct { + Val int + Left *TreeNode + Right *TreeNode +} + +func constructBinaryTree(array []int) *TreeNode { + var root *TreeNode + nodes := make([]*TreeNode, len(array)) + + // 初始化二叉树节点 + for i := 0; i < len(nodes); i++ { + var node *TreeNode + if array[i] != -1 { + node = &TreeNode{Val: array[i]} + } + nodes[i] = node + if i == 0 { + root = node + } + } + // 串联节点 + for i := 0; i*2+2 < len(array); i++ { + if nodes[i] != nil { + nodes[i].Left = nodes[i*2+1] + nodes[i].Right = nodes[i*2+2] + } + } + return root +} + +func printBinaryTree(root *TreeNode, n int) { + var queue []*TreeNode + if root != nil { + queue = append(queue, root) + } + + result := []int{} + for len(queue) > 0 { + for j := 0; j < len(queue); j++ { + node := queue[j] + if node != nil { + result = append(result, node.Val) + queue = append(queue, node.Left) + queue = append(queue, node.Right) + } else { + result = append(result, -1) + } + } + // 清除队列中的本层节点, 进入下一层遍历 + queue = queue[len(queue):] + } + // 参数n控制输出值数量, 否则二叉树最后一层叶子节点的孩子节点也会被打印(但是这些孩子节点是不存在的). + fmt.Println(result[:n]) +} + +func main() { + array := []int{4, 1, 6, 0, 2, 5, 7, -1, -1, -1, 3, -1, -1, -1, 8} + root := constructBinaryTree(array) + printBinaryTree(root, len(array)) +} + ``` ## JavaScript From 7ad56a33e0cb2313fd0bdaaaf1bccb26f6b09b1f Mon Sep 17 00:00:00 2001 From: lingyin <32977462+dmzlingyin@users.noreply.github.com> Date: Sat, 9 Apr 2022 00:19:52 +0800 Subject: [PATCH 0513/3019] =?UTF-8?q?Update=20ACM=E6=A8=A1=E5=BC=8F?= =?UTF-8?q?=E5=A6=82=E4=BD=95=E6=9E=84=E5=BB=BA=E4=BA=8C=E5=8F=89=E6=A0=91?= =?UTF-8?q?.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...72\344\272\214\345\217\211\346\240\221.md" | 95 ++++++++++--------- 1 file changed, 48 insertions(+), 47 deletions(-) diff --git "a/problems/\345\211\215\345\272\217/ACM\346\250\241\345\274\217\345\246\202\344\275\225\346\236\204\345\273\272\344\272\214\345\217\211\346\240\221.md" "b/problems/\345\211\215\345\272\217/ACM\346\250\241\345\274\217\345\246\202\344\275\225\346\236\204\345\273\272\344\272\214\345\217\211\346\240\221.md" index dba87ca113..444f00719e 100644 --- "a/problems/\345\211\215\345\272\217/ACM\346\250\241\345\274\217\345\246\202\344\275\225\346\236\204\345\273\272\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/\345\211\215\345\272\217/ACM\346\250\241\345\274\217\345\246\202\344\275\225\346\236\204\345\273\272\344\272\214\345\217\211\346\240\221.md" @@ -225,65 +225,66 @@ package main import "fmt" type TreeNode struct { - Val int - Left *TreeNode - Right *TreeNode + Val int + Left *TreeNode + Right *TreeNode } func constructBinaryTree(array []int) *TreeNode { - var root *TreeNode - nodes := make([]*TreeNode, len(array)) - - // 初始化二叉树节点 - for i := 0; i < len(nodes); i++ { - var node *TreeNode - if array[i] != -1 { - node = &TreeNode{Val: array[i]} - } - nodes[i] = node - if i == 0 { - root = node - } + var root *TreeNode + nodes := make([]*TreeNode, len(array)) + + // 初始化二叉树节点 + for i := 0; i < len(nodes); i++ { + var node *TreeNode + if array[i] != -1 { + node = &TreeNode{Val: array[i]} } - // 串联节点 - for i := 0; i*2+2 < len(array); i++ { - if nodes[i] != nil { - nodes[i].Left = nodes[i*2+1] - nodes[i].Right = nodes[i*2+2] - } + nodes[i] = node + if i == 0 { + root = node } - return root + } + // 串联节点 + for i := 0; i*2+2 < len(array); i++ { + if nodes[i] != nil { + nodes[i].Left = nodes[i*2+1] + nodes[i].Right = nodes[i*2+2] + } + } + return root } func printBinaryTree(root *TreeNode, n int) { - var queue []*TreeNode - if root != nil { - queue = append(queue, root) - } + var queue []*TreeNode + if root != nil { + queue = append(queue, root) + } - result := []int{} - for len(queue) > 0 { - for j := 0; j < len(queue); j++ { - node := queue[j] - if node != nil { - result = append(result, node.Val) - queue = append(queue, node.Left) - queue = append(queue, node.Right) - } else { - result = append(result, -1) - } - } - // 清除队列中的本层节点, 进入下一层遍历 - queue = queue[len(queue):] - } - // 参数n控制输出值数量, 否则二叉树最后一层叶子节点的孩子节点也会被打印(但是这些孩子节点是不存在的). - fmt.Println(result[:n]) + result := []int{} + for len(queue) > 0 { + for j := 0; j < len(queue); j++ { + node := queue[j] + if node != nil { + result = append(result, node.Val) + queue = append(queue, node.Left) + queue = append(queue, node.Right) + } else { + result = append(result, -1) + } + } + // 清除队列中的本层节点, 进入下一层遍历 + queue = queue[len(queue):] + } + + // 参数n控制输出值数量, 否则二叉树最后一层叶子节点的孩子节点也会被打印(但是这些孩子节点是不存在的). + fmt.Println(result[:n]) } func main() { - array := []int{4, 1, 6, 0, 2, 5, 7, -1, -1, -1, 3, -1, -1, -1, 8} - root := constructBinaryTree(array) - printBinaryTree(root, len(array)) + array := []int{4, 1, 6, 0, 2, 5, 7, -1, -1, -1, 3, -1, -1, -1, 8} + root := constructBinaryTree(array) + printBinaryTree(root, len(array)) } ``` From ee2993e60f2ac22f976f1780ef183f4eeb68a36b Mon Sep 17 00:00:00 2001 From: zhicheng lee <904688436@qq.com> Date: Sat, 9 Apr 2022 11:40:29 +0800 Subject: [PATCH 0514/3019] =?UTF-8?q?0332.=E9=87=8D=E6=96=B0=E5=AE=89?= =?UTF-8?q?=E6=8E=92=E8=A1=8C=E7=A8=8B=20=E6=B7=BB=E5=8A=A0Java=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...11\346\216\222\350\241\214\347\250\213.md" | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git "a/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" "b/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" index 041a7f031e..ceb6458953 100644 --- "a/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" +++ "b/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" @@ -261,6 +261,43 @@ for (pairtarget : targets[result[result.size() - 1]]) ## 其他语言版本 ### java + +```java +class Solution { + private LinkedList res; + private LinkedList path = new LinkedList<>(); + + public List findItinerary(List> tickets) { + Collections.sort(tickets, (a, b) -> a.get(1).compareTo(b.get(1))); + path.add("JFK"); + boolean[] used = new boolean[tickets.size()]; + backTracking((ArrayList) tickets, used); + return res; + } + + public boolean backTracking(ArrayList> tickets, boolean[] used) { + if (path.size() == tickets.size() + 1) { + res = new LinkedList(path); + return true; + } + + for (int i = 0; i < tickets.size(); i++) { + if (!used[i] && tickets.get(i).get(0).equals(path.getLast())) { + path.add(tickets.get(i).get(1)); + used[i] = true; + + if (backTracking(tickets, used)) { + return true; + } + + used[i] = false; + path.removeLast(); + } + } + return false; + } +} +``` ```java class Solution { From 2e18054079ecfa1147bfc4335fd6c62609a44c37 Mon Sep 17 00:00:00 2001 From: jonathanx111 <57882619+jonathanx111@users.noreply.github.com> Date: Sat, 9 Apr 2022 13:49:55 -0400 Subject: [PATCH 0515/3019] =?UTF-8?q?=E7=BA=A0=E6=AD=A30027=E7=9A=84Swift?= =?UTF-8?q?=E7=AD=94=E6=A1=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Swift答案写错了。改成对的答案。 --- .../0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git "a/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" "b/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" index 8d6ca5022d..590cf0b924 100644 --- "a/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" +++ "b/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" @@ -281,10 +281,8 @@ func removeElement(_ nums: inout [Int], _ val: Int) -> Int { for fastIndex in 0.. Date: Sun, 10 Apr 2022 10:17:10 +0800 Subject: [PATCH 0516/3019] =?UTF-8?q?=E5=88=A0=E9=99=A4=E4=BA=86=E6=9D=A5?= =?UTF-8?q?=E8=87=AAMac=E7=9A=84.DS=5FStore?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pics/.DS_Store | Bin 6148 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 pics/.DS_Store diff --git a/pics/.DS_Store b/pics/.DS_Store deleted file mode 100644 index 5008ddfcf53c02e82d7eee2e57c38e5672ef89f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeH~Jr2S!425mzP>H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0 Date: Sun, 10 Apr 2022 10:27:02 +0800 Subject: [PATCH 0517/3019] =?UTF-8?q?0051.N=E7=9A=87=E5=90=8E=20=E8=B0=83?= =?UTF-8?q?=E6=95=B4Java=E4=BB=A3=E7=A0=81=E5=92=8CPython=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E7=9A=84=E9=A1=BA=E5=BA=8F=EF=BC=8C=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E4=B8=BA=E4=B8=8E=E5=85=B6=E5=AE=83=E9=A2=98=E8=A7=A3=E9=A1=BA?= =?UTF-8?q?=E5=BA=8F=E4=B8=80=E8=87=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "problems/0051.N\347\232\207\345\220\216.md" | 101 ++++++++++--------- 1 file changed, 51 insertions(+), 50 deletions(-) diff --git "a/problems/0051.N\347\232\207\345\220\216.md" "b/problems/0051.N\347\232\207\345\220\216.md" index 7eb0d7a0b1..1b0cf0026b 100644 --- "a/problems/0051.N\347\232\207\345\220\216.md" +++ "b/problems/0051.N\347\232\207\345\220\216.md" @@ -224,56 +224,6 @@ public: ## 其他语言补充 - -### Python - -```python -class Solution: - def solveNQueens(self, n: int) -> List[List[str]]: - if not n: return [] - board = [['.'] * n for _ in range(n)] - res = [] - def isVaild(board,row, col): - #判断同一列是否冲突 - for i in range(len(board)): - if board[i][col] == 'Q': - return False - # 判断左上角是否冲突 - i = row -1 - j = col -1 - while i>=0 and j>=0: - if board[i][j] == 'Q': - return False - i -= 1 - j -= 1 - # 判断右上角是否冲突 - i = row - 1 - j = col + 1 - while i>=0 and j < len(board): - if board[i][j] == 'Q': - return False - i -= 1 - j += 1 - return True - - def backtracking(board, row, n): - # 如果走到最后一行,说明已经找到一个解 - if row == n: - temp_res = [] - for temp in board: - temp_str = "".join(temp) - temp_res.append(temp_str) - res.append(temp_res) - for col in range(n): - if not isVaild(board, row, col): - continue - board[row][col] = 'Q' - backtracking(board, row+1, n) - board[row][col] = '.' - backtracking(board, 0, n) - return res -``` - ### Java ```java @@ -343,6 +293,55 @@ class Solution { } ``` +### Python + +```python +class Solution: + def solveNQueens(self, n: int) -> List[List[str]]: + if not n: return [] + board = [['.'] * n for _ in range(n)] + res = [] + def isVaild(board,row, col): + #判断同一列是否冲突 + for i in range(len(board)): + if board[i][col] == 'Q': + return False + # 判断左上角是否冲突 + i = row -1 + j = col -1 + while i>=0 and j>=0: + if board[i][j] == 'Q': + return False + i -= 1 + j -= 1 + # 判断右上角是否冲突 + i = row - 1 + j = col + 1 + while i>=0 and j < len(board): + if board[i][j] == 'Q': + return False + i -= 1 + j += 1 + return True + + def backtracking(board, row, n): + # 如果走到最后一行,说明已经找到一个解 + if row == n: + temp_res = [] + for temp in board: + temp_str = "".join(temp) + temp_res.append(temp_str) + res.append(temp_res) + for col in range(n): + if not isVaild(board, row, col): + continue + board[row][col] = 'Q' + backtracking(board, row+1, n) + board[row][col] = '.' + backtracking(board, 0, n) + return res +``` + ### Go ```Go @@ -398,6 +397,8 @@ func isValid(n, row, col int, chessboard [][]string) bool { return true } ``` + + ### Javascript ```Javascript var solveNQueens = function(n) { From 426b00a4e2889bb4c6d2599f29c965e173a5f536 Mon Sep 17 00:00:00 2001 From: Nada Date: Sun, 10 Apr 2022 14:56:56 +0800 Subject: [PATCH 0518/3019] =?UTF-8?q?Update=200018.=E5=9B=9B=E6=95=B0?= =?UTF-8?q?=E4=B9=8B=E5=92=8C.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 增加剪枝逻辑处理 --- ...33\233\346\225\260\344\271\213\345\222\214.md" | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git "a/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" "b/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" index 7304254e54..ee70cb6909 100644 --- "a/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" @@ -31,7 +31,7 @@ 四数之和,和[15.三数之和](https://programmercarl.com/0015.三数之和.html)是一个思路,都是使用双指针法, 基本解法就是在[15.三数之和](https://programmercarl.com/0015.三数之和.html) 的基础上再套一层for循环。 -但是有一些细节需要注意,例如: 不要判断`nums[k] > target` 就返回了,三数之和 可以通过 `nums[i] > 0` 就返回了,因为 0 已经是确定的数了,四数之和这道题目 target是任意值。(大家亲自写代码就能感受出来) +但是有一些细节需要注意,例如: 不要判断`nums[k] > target` 就返回了,三数之和 可以通过 `nums[i] > 0` 就返回了,因为 0 已经是确定的数了,四数之和这道题目 target是任意值。比如:数组是`[-4, -3, -2, -1]`,`target`是`-10`,不能因为`-4 > -10`而跳过。但是我们依旧可以去做剪枝,逻辑变成`nums[i] > target && (nums[i] >=0 || target >= 0)`就可以了。 [15.三数之和](https://programmercarl.com/0015.三数之和.html)的双指针解法是一层for循环num[i]为确定值,然后循环内有left和right下标作为双指针,找到nums[i] + nums[left] + nums[right] == 0。 @@ -72,15 +72,20 @@ public: vector> result; sort(nums.begin(), nums.end()); for (int k = 0; k < nums.size(); k++) { - // 这种剪枝是错误的,这道题目target 是任意值 - // if (nums[k] > target) { - // return result; - // } + // 剪枝处理 + if (nums[k] > target && (nums[k] >= 0 || target >= 0)) { + break; // 这里使用break,统一通过最后的return返回 + } // 去重 if (k > 0 && nums[k] == nums[k - 1]) { continue; } for (int i = k + 1; i < nums.size(); i++) { + // 2级剪枝处理 + if (nums[k] + nums[i] > target && (nums[k] + nums[i] >= 0 || target >= 0)) { + break; + } + // 正确去重方法 if (i > k + 1 && nums[i] == nums[i - 1]) { continue; From 175b71d21fc5e3bdddc21e5dafe8a73980d79016 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Sun, 10 Apr 2022 21:59:21 +0800 Subject: [PATCH 0519/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880406.?= =?UTF-8?q?=E6=A0=B9=E6=8D=AE=E8=BA=AB=E9=AB=98=E9=87=8D=E5=BB=BA=E9=98=9F?= =?UTF-8?q?=E5=88=97.md=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript?= =?UTF-8?q?=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...215\345\273\272\351\230\237\345\210\227.md" | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git "a/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" "b/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" index b2354d094c..ecb0530194 100644 --- "a/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" +++ "b/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" @@ -290,6 +290,24 @@ var reconstructQueue = function(people) { }; ``` +### TypeScript + +```typescript +function reconstructQueue(people: number[][]): number[][] { + people.sort((a, b) => { + if (a[0] === b[0]) return a[1] - b[1]; + return b[0] - a[0]; + }); + const resArr: number[][] = []; + for (let i = 0, length = people.length; i < length; i++) { + resArr.splice(people[i][1], 0, people[i]); + } + return resArr; +}; +``` + + + -----------------------
From ef44e750cec20980095e63db3c090c8df48f620c Mon Sep 17 00:00:00 2001 From: Guanzhong Pan Date: Mon, 11 Apr 2022 20:34:32 +0100 Subject: [PATCH 0520/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200376.=E6=91=86?= =?UTF-8?q?=E5=8A=A8=E5=BA=8F=E5=88=97.md=20C=E8=AF=AD=E8=A8=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...06\345\212\250\345\272\217\345\210\227.md" | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git "a/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" "b/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" index 5076c9adaa..6bd2277ffe 100644 --- "a/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" +++ "b/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" @@ -298,5 +298,32 @@ var wiggleMaxLength = function(nums) { }; ``` +### C +**贪心** +```c +int wiggleMaxLength(int* nums, int numsSize){ + if(numsSize <= 1) + return numsSize; + + int length = 1; + int preDiff , curDiff; + preDiff = curDiff = 0; + for(int i = 0; i < numsSize - 1; ++i) { + // 计算当前i元素与i+1元素差值 + curDiff = nums[i+1] - nums[i]; + + // 若preDiff与curDiff符号不符,则子序列长度+1。更新preDiff的符号 + // 若preDiff与curDiff符号一致,当前i元素为连续升序/连续降序子序列的中间元素。不被记录入长度 + // 注:当preDiff为0时,curDiff为正或为负都属于符号不同 + if((curDiff > 0 && preDiff <= 0) || (preDiff >= 0 && curDiff < 0)) { + preDiff = curDiff; + length++; + } + } + + return length; +} +``` + -----------------------
From ae38a29068241636052e831d96b1e446dddd979e Mon Sep 17 00:00:00 2001 From: Jamcy123 <1219502823@qq.com> Date: Tue, 12 Apr 2022 16:57:25 +0800 Subject: [PATCH 0521/3019] =?UTF-8?q?=E4=BF=AE=E6=94=B9=200503.=E4=B8=8B?= =?UTF-8?q?=E4=B8=80=E4=B8=AA=E6=9B=B4=E5=A4=A7=E5=85=83=E7=B4=A0II=20java?= =?UTF-8?q?script=20=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\264\345\244\247\345\205\203\347\264\240II.md" | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git "a/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" "b/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" index 36e183e1b1..d6d3850fd5 100644 --- "a/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" +++ "b/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" @@ -166,20 +166,19 @@ JavaScript: * @return {number[]} */ var nextGreaterElements = function (nums) { - // let map = new Map(); + const len = nums.length; let stack = []; - let res = new Array(nums.length).fill(-1); - for (let i = 0; i < nums.length * 2; i++) { + let res = Array(len).fill(-1); + for (let i = 0; i < len * 2; i++) { while ( stack.length && - nums[i % nums.length] > nums[stack[stack.length - 1]] + nums[i % len] > nums[stack[stack.length - 1]] ) { - let index = stack.pop(); - res[index] = nums[i % nums.length]; + const index = stack.pop(); + res[index] = nums[i % len]; } - stack.push(i % nums.length); + stack.push(i % len); } - return res; }; ``` From 82ab1706f88e390ff2f13478cd7771cc92e76754 Mon Sep 17 00:00:00 2001 From: Jamcy123 <1219502823@qq.com> Date: Tue, 12 Apr 2022 17:09:20 +0800 Subject: [PATCH 0522/3019] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E4=B8=80=E3=80=81=E5=A2=9E=E5=8A=A0=E7=89=88=E6=9C=AC=E4=BA=8C?= =?UTF-8?q?=200739.=E6=AF=8F=E6=97=A5=E6=B8=A9=E5=BA=A6=20javascript=20?= =?UTF-8?q?=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...17\346\227\245\346\270\251\345\272\246.md" | 32 +++++++++++++------ 1 file changed, 23 insertions(+), 9 deletions(-) diff --git "a/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" "b/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" index 710f5eb68f..5f53e4127d 100644 --- "a/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" +++ "b/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" @@ -301,25 +301,22 @@ 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 = []; // 递减栈:用于存储元素右面第一个比他大的元素下标 + const n = temperatures.length; + const res = Array(n).fill(0); + const stack = []; // 递增栈:用于存储元素右面第一个比他大的元素下标 stack.push(0); for (let i = 1; i < n; i++) { // 栈顶元素 - let top = stack[stack.length - 1]; + const 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(); + const top = stack.pop(); res[top] = i - top; } stack.push(i); @@ -327,6 +324,23 @@ var dailyTemperatures = function(temperatures) { } return res; }; + + +// 版本二 +var dailyTemperatures = function(temperatures) { + const n = temperatures.length; + const res = Array(n).fill(0); + const stack = []; // 递增栈:用于存储元素右面第一个比他大的元素下标 + stack.push(0); + for (let i = 1; i < n; i++) { + while (stack.length && temperatures[i] > temperatures[stack[stack.length - 1]]) { + const top = stack.pop(); + res[top] = i - top; + } + stack.push(i); + } + return res; +}; ``` From 54d0d9d1c1a579e0a8750f1be864ad78b8d13c45 Mon Sep 17 00:00:00 2001 From: Guanzhong Pan Date: Tue, 12 Apr 2022 10:43:46 +0100 Subject: [PATCH 0523/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200053.=E6=9C=80?= =?UTF-8?q?=E5=A4=A7=E5=AD=90=E6=95=B0=E7=BB=84=E5=92=8C.md=20C=E8=AF=AD?= =?UTF-8?q?=E8=A8=80=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...247\345\255\220\345\272\217\345\222\214.md" | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git "a/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" "b/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" index 3d11c91efb..9af02edf2c 100644 --- "a/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" +++ "b/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" @@ -230,6 +230,24 @@ var maxSubArray = function(nums) { }; ``` +### C: +```c +int maxSubArray(int* nums, int numsSize){ + int maxVal = INT_MIN; + int subArrSum = 0; + + int i; + for(i = 0; i < numsSize; ++i) { + subArrSum += nums[i]; + // 若当前局部和大于之前的最大结果,对结果进行更新 + maxVal = subArrSum > maxVal ? subArrSum : maxVal; + // 若当前局部和为负,对结果无益。则从nums[i+1]开始应重新计算。 + subArrSum = subArrSum < 0 ? 0 : subArrSum; + } + + return maxVal; +} +``` ----------------------- From af724ef6d5ed95c4ba545a932f8257b487648aec Mon Sep 17 00:00:00 2001 From: xuerbujia <83055661+xuerbujia@users.noreply.github.com> Date: Tue, 12 Apr 2022 17:45:50 +0800 Subject: [PATCH 0524/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880143.?= =?UTF-8?q?=E9=87=8D=E6=8E=92=E9=93=BE=E8=A1=A8.md=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0go=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...15\346\216\222\351\223\276\350\241\250.md" | 28 ++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git "a/problems/0143.\351\207\215\346\216\222\351\223\276\350\241\250.md" "b/problems/0143.\351\207\215\346\216\222\351\223\276\350\241\250.md" index 0062262328..790bcb482a 100644 --- "a/problems/0143.\351\207\215\346\216\222\351\223\276\350\241\250.md" +++ "b/problems/0143.\351\207\215\346\216\222\351\223\276\350\241\250.md" @@ -336,7 +336,33 @@ class Solution: return pre ``` ### Go - +```go +# 方法三 分割链表 +func reorderList(head *ListNode) { + var slow=head + var fast=head + for fast!=nil&&fast.Next!=nil{ + slow=slow.Next + fast=fast.Next.Next + } //双指针将链表分为左右两部分 + var right =new(ListNode) + for slow!=nil{ + temp:=slow.Next + slow.Next=right.Next + right.Next=slow + slow=temp + } //翻转链表右半部分 + right=right.Next //right为反转后得右半部分 + h:=head + for right.Next!=nil{ + temp:=right.Next + right.Next=h.Next + h.Next=right + h=h.Next.Next + right=temp + } //将左右两部分重新组合 +} +``` ### JavaScript ```javascript From dd63a865717b0a439cc2ce2b5abab0a55d18d7de Mon Sep 17 00:00:00 2001 From: Guanzhong Pan Date: Tue, 12 Apr 2022 11:01:53 +0100 Subject: [PATCH 0525/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200053.=E6=9C=80?= =?UTF-8?q?=E5=A4=A7=E5=AD=90=E6=95=B0=E7=BB=84=E5=92=8C.md=20C=E8=AF=AD?= =?UTF-8?q?=E8=A8=80=E5=8A=A8=E6=80=81=E8=A7=84=E5=88=92=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...47\345\255\220\345\272\217\345\222\214.md" | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git "a/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" "b/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" index 9af02edf2c..3d4459a377 100644 --- "a/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" +++ "b/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" @@ -231,6 +231,7 @@ var maxSubArray = function(nums) { ``` ### C: +贪心: ```c int maxSubArray(int* nums, int numsSize){ int maxVal = INT_MIN; @@ -249,6 +250,39 @@ int maxSubArray(int* nums, int numsSize){ } ``` +动态规划: +```c +/** + * 解题思路:动态规划: + * 1. dp数组:dp[i]表示从0到i的子序列中最大序列和的值 + * 2. 递推公式:dp[i] = max(dp[i-1] + nums[i], nums[i]) + 若dp[i-1]<0,对最后结果无益。dp[i]则为nums[i]。 + * 3. dp数组初始化:dp[0]的最大子数组和为nums[0] + * 4. 推导顺序:从前往后遍历 + */ + +#define max(a, b) (((a) > (b)) ? (a) : (b)) + +int maxSubArray(int* nums, int numsSize){ + int dp[numsSize]; + // dp[0]最大子数组和为nums[0] + dp[0] = nums[0]; + // 若numsSize为1,应直接返回nums[0] + int subArrSum = nums[0]; + + int i; + for(i = 1; i < numsSize; ++i) { + dp[i] = max(dp[i - 1] + nums[i], nums[i]); + + // 若dp[i]大于之前记录的最大值,进行更新 + if(dp[i] > subArrSum) + subArrSum = dp[i]; + } + + return subArrSum; +} +``` + -----------------------
From 804d7e0171936ec370855ebb592fe123b731d8d8 Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Tue, 12 Apr 2022 22:23:28 +0800 Subject: [PATCH 0526/3019] delete $ --- ...\345\220\214\350\267\257\345\276\204II.md" | 4 +- ...344\275\263\346\227\266\346\234\272III.md" | 8 ++-- ...25\350\257\215\346\213\206\345\210\206.md" | 2 +- ...14\347\232\204\345\215\225\350\257\215.md" | 2 +- ...64\346\225\260\346\213\206\345\210\206.md" | 4 +- ...55\347\232\204\350\212\202\347\202\271.md" | 2 +- ...\345\244\247\345\205\203\347\264\240II.md" | 2 +- ...22\345\242\236\345\272\217\345\210\227.md" | 10 ++-- ...01\350\247\204\345\210\222\357\274\211.md" | 8 ++-- ...04\345\255\227\347\254\246\344\270\262.md" | 2 +- ...\345\272\217\346\225\260\347\273\204II.md" | 2 +- ...57\345\244\232\345\244\247\357\274\237.md" | 2 +- ...50\350\277\231\351\207\214\357\274\201.md" | 6 +-- ...50\350\277\231\351\207\214\357\274\201.md" | 46 +++++++++---------- ...52\347\226\221\351\227\256\357\274\237.md" | 14 +++--- ...71\346\257\233\346\261\202\347\226\265.md" | 2 +- ...02\345\272\246\345\210\206\346\236\220.md" | 26 +++++------ ...15\346\235\202\345\272\246\357\274\201.md" | 24 +++++----- ...54\345\255\227\347\254\246\344\270\262.md" | 2 +- ...07\351\222\210\346\200\273\347\273\223.md" | 2 +- ...50\346\234\253\346\200\273\347\273\223.md" | 2 +- ...50\346\234\253\346\200\273\347\273\223.md" | 2 +- ...50\346\234\253\346\200\273\347\273\223.md" | 6 +-- ...50\346\234\253\346\200\273\347\273\223.md" | 2 +- ...50\346\234\253\346\200\273\347\273\223.md" | 16 +++---- ...06\350\256\272\345\237\272\347\241\200.md" | 14 +++--- ...36\346\272\257\346\200\273\347\273\223.md" | 2 +- ...04\346\200\273\347\273\223\347\257\207.md" | 2 +- ...06\350\256\262\350\247\243\357\274\211.md" | 2 +- ...25\346\200\273\347\273\223\347\257\207.md" | 16 +------ 30 files changed, 111 insertions(+), 123 deletions(-) diff --git "a/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" "b/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" index c71cf79649..a40ccedaa9 100644 --- "a/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" +++ "b/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" @@ -184,8 +184,8 @@ public: }; ``` -* 时间复杂度:$O(n × m)$,n、m 分别为obstacleGrid 长度和宽度 -* 空间复杂度:$O(m)$ +* 时间复杂度:O(n × m),n、m 分别为obstacleGrid 长度和宽度 +* 空间复杂度:O(m) ## 总结 diff --git "a/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" "b/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" index fc81c3e9c1..56ade34338 100644 --- "a/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" +++ "b/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" @@ -148,8 +148,8 @@ public: }; ``` -* 时间复杂度:$O(n)$ -* 空间复杂度:$O(n × 5)$ +* 时间复杂度:O(n) +* 空间复杂度:O(n × 5) 当然,大家可以看到力扣官方题解里的一种优化空间写法,我这里给出对应的C++版本: @@ -173,8 +173,8 @@ public: }; ``` -* 时间复杂度:$O(n)$ -* 空间复杂度:$O(1)$ +* 时间复杂度:O(n) +* 空间复杂度:O(1) 大家会发现dp[2]利用的是当天的dp[1]。 但结果也是对的。 diff --git "a/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" "b/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" index 7f1e6f1737..ac834f047d 100644 --- "a/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" +++ "b/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" @@ -207,7 +207,7 @@ public: }; ``` -* 时间复杂度:O(n^3),因为substr返回子串的副本是$O(n)$的复杂度(这里的n是substring的长度) +* 时间复杂度:O(n^3),因为substr返回子串的副本是O(n)的复杂度(这里的n是substring的长度) * 空间复杂度:O(n) diff --git "a/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" "b/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" index 8dfe9bbc98..4865821a53 100644 --- "a/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" +++ "b/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" @@ -79,7 +79,7 @@ void removeExtraSpaces(string& s) { 逻辑很简单,从前向后遍历,遇到空格了就erase。 -如果不仔细琢磨一下erase的时间复杂读,还以为以上的代码是$O(n)$的时间复杂度呢。 +如果不仔细琢磨一下erase的时间复杂读,还以为以上的代码是O(n)的时间复杂度呢。 想一下真正的时间复杂度是多少,一个erase本来就是O(n)的操作,erase实现原理题目:[数组:就移除个元素很难么?](https://programmercarl.com/0027.移除元素.html),最优的算法来移除元素也要O(n)。 diff --git "a/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" "b/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" index 777146ba78..4a7ba6ab0d 100644 --- "a/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" +++ "b/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" @@ -119,8 +119,8 @@ public: }; ``` -* 时间复杂度:$O(n^2)$ -* 空间复杂度:$O(n)$ +* 时间复杂度:O(n^2) +* 空间复杂度:O(n) ### 贪心 diff --git "a/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" "b/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" index cc29bea4c6..e8f7e54c4b 100644 --- "a/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" +++ "b/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" @@ -51,7 +51,7 @@ if (root == nullptr) return root; * 确定单层递归的逻辑 -这里就把平衡二叉树中删除节点遇到的情况都搞清楚。 +这里就把二叉搜索树中删除节点遇到的情况都搞清楚。 有以下五种情况: diff --git "a/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" "b/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" index 36e183e1b1..ead31c8ba7 100644 --- "a/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" +++ "b/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" @@ -68,7 +68,7 @@ public: 这种写法确实比较直观,但做了很多无用操作,例如修改了nums数组,而且最后还要把result数组resize回去。 -resize倒是不费时间,是$O(1)$的操作,但扩充nums数组相当于多了一个$O(n)$的操作。 +resize倒是不费时间,是O(1)的操作,但扩充nums数组相当于多了一个O(n)的操作。 其实也可以不扩充nums,而是在遍历的过程中模拟走了两边nums。 diff --git "a/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" "b/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" index 51d04e92c7..e941d24263 100644 --- "a/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" +++ "b/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" @@ -107,8 +107,8 @@ public: }; ``` -* 时间复杂度:$O(n)$ -* 空间复杂度:$O(n)$ +* 时间复杂度:O(n) +* 空间复杂度:O(n) ### 贪心 @@ -135,12 +135,12 @@ public: } }; ``` -* 时间复杂度:$O(n)$ -* 空间复杂度:$O(1)$ +* 时间复杂度:O(n) +* 空间复杂度:O(1) ## 总结 -本题也是动规里子序列问题的经典题目,但也可以用贪心来做,大家也会发现贪心好像更简单一点,而且空间复杂度仅是$O(1)$。 +本题也是动规里子序列问题的经典题目,但也可以用贪心来做,大家也会发现贪心好像更简单一点,而且空间复杂度仅是O(1)。 在动规分析中,关键是要理解和[动态规划:300.最长递增子序列](https://programmercarl.com/0300.最长上升子序列.html)的区别。 diff --git "a/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" "b/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" index b385d710d0..4ab63e7925 100644 --- "a/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" +++ "b/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" @@ -38,8 +38,8 @@ 使用贪心算法,的性能是: -* 时间复杂度:$O(n)$ -* 空间复杂度:$O(1)$ +* 时间复杂度:O(n) +* 空间复杂度:O(1) 那么我们再来看看是使用动规的方法如何解题。 @@ -87,8 +87,8 @@ public: }; ``` -* 时间复杂度:$O(n)$ -* 空间复杂度:$O(n)$ +* 时间复杂度:O(n) +* 空间复杂度:O(n) ## 其他语言版本 diff --git "a/problems/0844.\346\257\224\350\276\203\345\220\253\351\200\200\346\240\274\347\232\204\345\255\227\347\254\246\344\270\262.md" "b/problems/0844.\346\257\224\350\276\203\345\220\253\351\200\200\346\240\274\347\232\204\345\255\227\347\254\246\344\270\262.md" index 3bbfb73e20..41791114fa 100644 --- "a/problems/0844.\346\257\224\350\276\203\345\220\253\351\200\200\346\240\274\347\232\204\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/0844.\346\257\224\350\276\203\345\220\253\351\200\200\346\240\274\347\232\204\345\255\227\347\254\246\344\270\262.md" @@ -71,7 +71,7 @@ public: } }; ``` -* 时间复杂度:O(n + m),n为S的长度,m为T的长度 ,也可以理解是$O(n)$的时间复杂度 +* 时间复杂度:O(n + m),n为S的长度,m为T的长度 ,也可以理解是O(n)的时间复杂度 * 空间复杂度:O(n + m) 当然以上代码,大家可以发现有重复的逻辑处理S,处理T,可以把这块公共逻辑抽离出来,代码精简如下: diff --git "a/problems/0922.\346\214\211\345\245\207\345\201\266\346\216\222\345\272\217\346\225\260\347\273\204II.md" "b/problems/0922.\346\214\211\345\245\207\345\201\266\346\216\222\345\272\217\346\225\260\347\273\204II.md" index 4ff419d388..cb564fb683 100644 --- "a/problems/0922.\346\214\211\345\245\207\345\201\266\346\216\222\345\272\217\346\225\260\347\273\204II.md" +++ "b/problems/0922.\346\214\211\345\245\207\345\201\266\346\216\222\345\272\217\346\225\260\347\273\204II.md" @@ -112,7 +112,7 @@ public: * 时间复杂度:O(n) * 空间复杂度:O(1) -这里时间复杂度并不是$O(n^2)$,因为偶数位和奇数位都只操作一次,不是n/2 * n/2的关系,而是n/2 + n/2的关系! +这里时间复杂度并不是O(n^2),因为偶数位和奇数位都只操作一次,不是n/2 * n/2的关系,而是n/2 + n/2的关系! ## 其他语言版本 diff --git "a/problems/O(n)\347\232\204\347\256\227\346\263\225\345\261\205\347\204\266\350\266\205\346\227\266\344\272\206\357\274\214\346\255\244\346\227\266\347\232\204n\347\251\266\347\253\237\346\230\257\345\244\232\345\244\247\357\274\237.md" "b/problems/O(n)\347\232\204\347\256\227\346\263\225\345\261\205\347\204\266\350\266\205\346\227\266\344\272\206\357\274\214\346\255\244\346\227\266\347\232\204n\347\251\266\347\253\237\346\230\257\345\244\232\345\244\247\357\274\237.md" index 75f441db11..24302b2dd9 100644 --- "a/problems/O(n)\347\232\204\347\256\227\346\263\225\345\261\205\347\204\266\350\266\205\346\227\266\344\272\206\357\274\214\346\255\244\346\227\266\347\232\204n\347\251\266\347\253\237\346\230\257\345\244\232\345\244\247\357\274\237.md" +++ "b/problems/O(n)\347\232\204\347\256\227\346\263\225\345\261\205\347\204\266\350\266\205\346\227\266\344\272\206\357\274\214\346\255\244\346\227\266\347\232\204n\347\251\266\347\253\237\346\230\257\345\244\232\345\244\247\357\274\237.md" @@ -148,7 +148,7 @@ O(nlogn)的算法,1s内大概计算机可以运行 2 * (10^7)次计算,符 ![程序超时1](https://img-blog.csdnimg.cn/20201208231559175.png) -至于$O(\log n)$和$O(n^3)$ 等等这些时间复杂度在1s内可以处理的多大的数据规模,大家可以自己写一写代码去测一下了。 +至于O(log n)和O(n^3) 等等这些时间复杂度在1s内可以处理的多大的数据规模,大家可以自己写一写代码去测一下了。 # 完整测试代码 diff --git "a/problems/\345\205\263\344\272\216\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\214\344\275\240\344\270\215\347\237\245\351\201\223\347\232\204\351\203\275\345\234\250\350\277\231\351\207\214\357\274\201.md" "b/problems/\345\205\263\344\272\216\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\214\344\275\240\344\270\215\347\237\245\351\201\223\347\232\204\351\203\275\345\234\250\350\277\231\351\207\214\357\274\201.md" index 77fdacc4a7..a0fd6d924b 100644 --- "a/problems/\345\205\263\344\272\216\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\214\344\275\240\344\270\215\347\237\245\351\201\223\347\232\204\351\203\275\345\234\250\350\277\231\351\207\214\357\274\201.md" +++ "b/problems/\345\205\263\344\272\216\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\214\344\275\240\344\270\215\347\237\245\351\201\223\347\232\204\351\203\275\345\234\250\350\277\231\351\207\214\357\274\201.md" @@ -24,7 +24,7 @@ 算法导论给出的解释:**大O用来表示上界的**,当用它作为算法的最坏情况运行时间的上界,就是对任意数据输入的运行时间的上界。 -同样算法导论给出了例子:拿插入排序来说,插入排序的时间复杂度我们都说是$O(n^2)$ 。 +同样算法导论给出了例子:拿插入排序来说,插入排序的时间复杂度我们都说是O(n^2) 。 输入数据的形式对程序运算时间是有很大影响的,在数据本来有序的情况下时间复杂度是O(n),但如果数据是逆序的话,插入排序的时间复杂度就是O(n^2),也就对于所有输入情况来说,最坏是O(n^2) 的时间复杂度,所以称插入排序的时间复杂度为O(n^2)。 @@ -44,7 +44,7 @@ ![时间复杂度,不同数据规模的差异](https://img-blog.csdnimg.cn/20200728191447384.png) -在决定使用哪些算法的时候,不是时间复杂越低的越好(因为简化后的时间复杂度忽略了常数项等等),要考虑数据规模,如果数据规模很小甚至可以用$O(n^2)$的算法比$O(n)$的更合适(在有常数项的时候)。 +在决定使用哪些算法的时候,不是时间复杂越低的越好(因为简化后的时间复杂度忽略了常数项等等),要考虑数据规模,如果数据规模很小甚至可以用O(n^2)的算法比O(n)的更合适(在有常数项的时候)。 就像上图中 O(5n^2) 和 O(100n) 在n为20之前 很明显 O(5n^2)是更优的,所花费的时间也是最少的。 @@ -125,7 +125,7 @@ O(2 × n^2 + 10 × n + 1000) < O(3 × n^2),所以说最后省略掉常数项 如果是暴力枚举的话,时间复杂度是多少呢,是O(n^2)么? -这里一些同学会忽略了字符串比较的时间消耗,这里并不像int 型数字做比较那么简单,除了n^2次的遍历次数外,字符串比较依然要消耗m次操作(m也就是字母串的长度),所以时间复杂度是$O(m × n × n)$。 +这里一些同学会忽略了字符串比较的时间消耗,这里并不像int 型数字做比较那么简单,除了n^2次的遍历次数外,字符串比较依然要消耗m次操作(m也就是字母串的长度),所以时间复杂度是O(m × n × n)。 接下来再想一下其他解题思路。 diff --git "a/problems/\345\211\215\345\272\217/\345\205\263\344\272\216\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\214\344\275\240\344\270\215\347\237\245\351\201\223\347\232\204\351\203\275\345\234\250\350\277\231\351\207\214\357\274\201.md" "b/problems/\345\211\215\345\272\217/\345\205\263\344\272\216\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\214\344\275\240\344\270\215\347\237\245\351\201\223\347\232\204\351\203\275\345\234\250\350\277\231\351\207\214\357\274\201.md" index b2acb7ddb8..f19984e66b 100644 --- "a/problems/\345\211\215\345\272\217/\345\205\263\344\272\216\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\214\344\275\240\344\270\215\347\237\245\351\201\223\347\232\204\351\203\275\345\234\250\350\277\231\351\207\214\357\274\201.md" +++ "b/problems/\345\211\215\345\272\217/\345\205\263\344\272\216\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\214\344\275\240\344\270\215\347\237\245\351\201\223\347\232\204\351\203\275\345\234\250\350\277\231\351\207\214\357\274\201.md" @@ -9,7 +9,7 @@ * 什么是大O * 不同数据规模的差异 * 复杂表达式的化简 -* $O(\log n)$中的log是以什么为底? +* O(log n)中的log是以什么为底? * 举一个例子 @@ -23,21 +23,21 @@ 那么该如何估计程序运行时间呢,通常会估算算法的操作单元数量来代表程序消耗的时间,这里默认CPU的每个单元运行消耗的时间都是相同的。 -假设算法的问题规模为n,那么操作单元数量便用函数f(n)来表示,随着数据规模n的增大,算法执行时间的增长率和f(n)的增长率相同,这称作为算法的渐近时间复杂度,简称时间复杂度,记为 $O(f(n)$)。 +假设算法的问题规模为n,那么操作单元数量便用函数f(n)来表示,随着数据规模n的增大,算法执行时间的增长率和f(n)的增长率相同,这称作为算法的渐近时间复杂度,简称时间复杂度,记为 O(f(n))。 ## 什么是大O -这里的大O是指什么呢,说到时间复杂度,**大家都知道$O(n)$,$O(n^2)$,却说不清什么是大O**。 +这里的大O是指什么呢,说到时间复杂度,**大家都知道O(n),O(n^2),却说不清什么是大O**。 算法导论给出的解释:**大O用来表示上界的**,当用它作为算法的最坏情况运行时间的上界,就是对任意数据输入的运行时间的上界。 -同样算法导论给出了例子:拿插入排序来说,插入排序的时间复杂度我们都说是$O(n^2)$ 。 +同样算法导论给出了例子:拿插入排序来说,插入排序的时间复杂度我们都说是O(n^2) 。 -输入数据的形式对程序运算时间是有很大影响的,在数据本来有序的情况下时间复杂度是$O(n)$,但如果数据是逆序的话,插入排序的时间复杂度就是$O(n^2)$,也就对于所有输入情况来说,最坏是$O(n^2)$ 的时间复杂度,所以称插入排序的时间复杂度为$O(n^2)$。 +输入数据的形式对程序运算时间是有很大影响的,在数据本来有序的情况下时间复杂度是O(n),但如果数据是逆序的话,插入排序的时间复杂度就是O(n^2),也就对于所有输入情况来说,最坏是O(n^2) 的时间复杂度,所以称插入排序的时间复杂度为O(n^2)。 -同样的同理再看一下快速排序,都知道快速排序是$O(n\log n)$,但是当数据已经有序情况下,快速排序的时间复杂度是$O(n^2)$ 的,**所以严格从大O的定义来讲,快速排序的时间复杂度应该是$O(n^2)$**。 +同样的同理再看一下快速排序,都知道快速排序是O(nlogn),但是当数据已经有序情况下,快速排序的时间复杂度是O(n^2) 的,**所以严格从大O的定义来讲,快速排序的时间复杂度应该是O(n^2)**。 -**但是我们依然说快速排序是$O(n\log n)$的时间复杂度,这个就是业内的一个默认规定,这里说的O代表的就是一般情况,而不是严格的上界**。如图所示: +**但是我们依然说快速排序是O(nlogn)的时间复杂度,这个就是业内的一个默认规定,这里说的O代表的就是一般情况,而不是严格的上界**。如图所示: ![时间复杂度4,一般情况下的时间复杂度](https://img-blog.csdnimg.cn/20200728185745611.png) 我们主要关心的还是一般情况下的数据形式。 @@ -51,11 +51,11 @@ ![时间复杂度,不同数据规模的差异](https://img-blog.csdnimg.cn/20200728191447384.png) -在决定使用哪些算法的时候,不是时间复杂越低的越好(因为简化后的时间复杂度忽略了常数项等等),要考虑数据规模,如果数据规模很小甚至可以用$O(n^2)$的算法比$O(n)$的更合适(在有常数项的时候)。 +在决定使用哪些算法的时候,不是时间复杂越低的越好(因为简化后的时间复杂度忽略了常数项等等),要考虑数据规模,如果数据规模很小甚至可以用O(n^2)的算法比O(n)的更合适(在有常数项的时候)。 -就像上图中 $O(5n^2)$ 和 $O(100n)$ 在n为20之前 很明显 $O(5n^2)$是更优的,所花费的时间也是最少的。 +就像上图中 O(5n^2) 和 O(100n) 在n为20之前 很明显 O(5n^2)是更优的,所花费的时间也是最少的。 -那为什么在计算时间复杂度的时候要忽略常数项系数呢,也就说$O(100n)$ 就是$O(n)$的时间复杂度,$O(5n^2)$ 就是$O(n^2)$的时间复杂度,而且要默认$O(n)$ 优于$O(n^2)$ 呢 ? +那为什么在计算时间复杂度的时候要忽略常数项系数呢,也就说O(100n) 就是O(n)的时间复杂度,O(5n^2) 就是O(n^2)的时间复杂度,而且要默认O(n) 优于O(n^2) 呢 ? 这里就又涉及到大O的定义,**因为大O就是数据量级突破一个点且数据量级非常大的情况下所表现出的时间复杂度,这个数据量也就是常数项系数已经不起决定性作用的数据量**。 @@ -63,13 +63,13 @@ **所以我们说的时间复杂度都是省略常数项系数的,是因为一般情况下都是默认数据规模足够的大,基于这样的事实,给出的算法时间复杂的的一个排行如下所示**: -O(1)常数阶 < $O(\log n)$对数阶 < $O(n)$线性阶 < $O(n^2)$平方阶 < $O(n^3)$立方阶 < $O(2^n)$指数阶 +O(1)常数阶 < O(logn)对数阶 < O(n)线性阶 < O(n^2)平方阶 < O(n^3)立方阶 < O(2^n)指数阶 但是也要注意大常数,如果这个常数非常大,例如10^7 ,10^9 ,那么常数就是不得不考虑的因素了。 ## 复杂表达式的化简 -有时候我们去计算时间复杂度的时候发现不是一个简单的$O(n)$ 或者$O(n^2)$, 而是一个复杂的表达式,例如: +有时候我们去计算时间复杂度的时候发现不是一个简单的O(n) 或者O(n^2), 而是一个复杂的表达式,例如: ``` O(2*n^2 + 10*n + 1000) @@ -95,19 +95,19 @@ O(n^2 + n) O(n^2) ``` -如果这一步理解有困难,那也可以做提取n的操作,变成$O(n(n+1)$) ,省略加法常数项后也就别变成了: +如果这一步理解有困难,那也可以做提取n的操作,变成O(n(n+1)) ,省略加法常数项后也就别变成了: ``` O(n^2) ``` -所以最后我们说:这个算法的算法时间复杂度是$O(n^2)$ 。 +所以最后我们说:这个算法的算法时间复杂度是O(n^2) 。 -也可以用另一种简化的思路,其实当n大于40的时候, 这个复杂度会恒小于$O(3 × n^2)$, -$O(2 × n^2 + 10 × n + 1000) < O(3 × n^2)$,所以说最后省略掉常数项系数最终时间复杂度也是$O(n^2)$。 +也可以用另一种简化的思路,其实当n大于40的时候, 这个复杂度会恒小于O(3 × n^2), +O(2 × n^2 + 10 × n + 1000) < O(3 × n^2),所以说最后省略掉常数项系数最终时间复杂度也是O(n^2)。 -## $O(\log n)$中的log是以什么为底? +## O(logn)中的log是以什么为底? 平时说这个算法的时间复杂度是logn的,那么一定是log 以2为底n的对数么? @@ -130,21 +130,21 @@ $O(2 × n^2 + 10 × n + 1000) < O(3 × n^2)$,所以说最后省略掉常数项 通过这道面试题目,来分析一下时间复杂度。题目描述:找出n个字符串中相同的两个字符串(假设这里只有两个相同的字符串)。 -如果是暴力枚举的话,时间复杂度是多少呢,是$O(n^2)$么? +如果是暴力枚举的话,时间复杂度是多少呢,是O(n^2)么? -这里一些同学会忽略了字符串比较的时间消耗,这里并不像int 型数字做比较那么简单,除了n^2 次的遍历次数外,字符串比较依然要消耗m次操作(m也就是字母串的长度),所以时间复杂度是$O(m × n × n)$。 +这里一些同学会忽略了字符串比较的时间消耗,这里并不像int 型数字做比较那么简单,除了n^2 次的遍历次数外,字符串比较依然要消耗m次操作(m也就是字母串的长度),所以时间复杂度是O(m × n × n)。 接下来再想一下其他解题思路。 先排对n个字符串按字典序来排序,排序后n个字符串就是有序的,意味着两个相同的字符串就是挨在一起,然后在遍历一遍n个字符串,这样就找到两个相同的字符串了。 -那看看这种算法的时间复杂度,快速排序时间复杂度为$O(n\log n)$,依然要考虑字符串的长度是m,那么快速排序每次的比较都要有m次的字符比较的操作,就是$O(m × n × \log n)$ 。 +那看看这种算法的时间复杂度,快速排序时间复杂度为O(nlogn),依然要考虑字符串的长度是m,那么快速排序每次的比较都要有m次的字符比较的操作,就是O(m × n × log n) 。 -之后还要遍历一遍这n个字符串找出两个相同的字符串,别忘了遍历的时候依然要比较字符串,所以总共的时间复杂度是 $O(m × n × \log n + n × m)$。 +之后还要遍历一遍这n个字符串找出两个相同的字符串,别忘了遍历的时候依然要比较字符串,所以总共的时间复杂度是 O(m × n × logn + n × m)。 -我们对$O(m × n × \log n + n × m)$ 进行简化操作,把$m × n$提取出来变成 $O(m × n × (\log n + 1)$),再省略常数项最后的时间复杂度是 $O(m × n × \log n)$。 +我们对O(m × n × log n + n × m) 进行简化操作,把m × n提取出来变成 O(m × n × (logn + 1)),再省略常数项最后的时间复杂度是 O(m × n × log n)。 -最后很明显$O(m × n × \log n)$ 要优于$O(m × n × n)$! +最后很明显O(m × n × logn) 要优于O(m × n × n)! 所以先把字符串集合排序再遍历一遍找到两个相同字符串的方法要比直接暴力枚举的方式更快。 diff --git "a/problems/\345\211\215\345\272\217/\345\205\263\344\272\216\347\251\272\351\227\264\345\244\215\346\235\202\345\272\246\357\274\214\345\217\257\350\203\275\346\234\211\345\207\240\344\270\252\347\226\221\351\227\256\357\274\237.md" "b/problems/\345\211\215\345\272\217/\345\205\263\344\272\216\347\251\272\351\227\264\345\244\215\346\235\202\345\272\246\357\274\214\345\217\257\350\203\275\346\234\211\345\207\240\344\270\252\347\226\221\351\227\256\357\274\237.md" index 162dfe963e..19384fd980 100644 --- "a/problems/\345\211\215\345\272\217/\345\205\263\344\272\216\347\251\272\351\227\264\345\244\215\346\235\202\345\272\246\357\274\214\345\217\257\350\203\275\346\234\211\345\207\240\344\270\252\347\226\221\351\227\256\357\274\237.md" +++ "b/problems/\345\211\215\345\272\217/\345\205\263\344\272\216\347\251\272\351\227\264\345\244\215\346\235\202\345\272\246\357\274\214\345\217\257\350\203\275\346\234\211\345\207\240\344\270\252\347\226\221\351\227\256\357\274\237.md" @@ -3,14 +3,14 @@ # 空间复杂度分析 * [关于时间复杂度,你不知道的都在这里!](https://programmercarl.com/前序/关于时间复杂度,你不知道的都在这里!.html) -* [$O(n)$的算法居然超时了,此时的n究竟是多大?](https://programmercarl.com/前序/On的算法居然超时了,此时的n究竟是多大?.html) +* [O(n)的算法居然超时了,此时的n究竟是多大?](https://programmercarl.com/前序/On的算法居然超时了,此时的n究竟是多大?.html) * [通过一道面试题目,讲一讲递归算法的时间复杂度!](https://programmercarl.com/前序/通过一道面试题目,讲一讲递归算法的时间复杂度!.html) 那么一直还没有讲空间复杂度,所以打算陆续来补上,内容不难,大家可以读一遍文章就有整体的了解了。 什么是空间复杂度呢? -是对一个算法在运行过程中占用内存空间大小的量度,记做$S(n)=O(f(n)$。 +是对一个算法在运行过程中占用内存空间大小的量度,记做S(n)=O(f(n)。 空间复杂度(Space Complexity)记作S(n) 依然使用大O来表示。利用程序的空间复杂度,可以对程序运行中需要多少内存有个预先估计。 @@ -41,11 +41,11 @@ for (int i = 0; i < n; i++) { } ``` -第一段代码可以看出,随着n的变化,所需开辟的内存空间并不会随着n的变化而变化。即此算法空间复杂度为一个常量,所以表示为大$O(1)$。 +第一段代码可以看出,随着n的变化,所需开辟的内存空间并不会随着n的变化而变化。即此算法空间复杂度为一个常量,所以表示为大O(1)。 -什么时候的空间复杂度是$O(n)$? +什么时候的空间复杂度是O(n)? -当消耗空间和输入参数n保持线性增长,这样的空间复杂度为$O(n)$,来看一下这段C++代码 +当消耗空间和输入参数n保持线性增长,这样的空间复杂度为O(n),来看一下这段C++代码 ```CPP int* a = new int(n); for (int i = 0; i < n; i++) { @@ -53,9 +53,9 @@ for (int i = 0; i < n; i++) { } ``` -我们定义了一个数组出来,这个数组占用的大小为n,虽然有一个for循环,但没有再分配新的空间,因此,这段代码的空间复杂度主要看第一行即可,随着n的增大,开辟的内存大小呈线性增长,即 $O(n)$。 +我们定义了一个数组出来,这个数组占用的大小为n,虽然有一个for循环,但没有再分配新的空间,因此,这段代码的空间复杂度主要看第一行即可,随着n的增大,开辟的内存大小呈线性增长,即 O(n)。 -其他的 $O(n^2)$, $O(n^3)$ 我想大家应该都可以以此例举出来了,**那么思考一下 什么时候空间复杂度是 $O(\log n)$呢?** +其他的 O(n^2), O(n^3) 我想大家应该都可以以此例举出来了,**那么思考一下 什么时候空间复杂度是 O(logn)呢?** 空间复杂度是logn的情况确实有些特殊,其实是在**递归的时候,会出现空间复杂度为logn的情况**。 diff --git "a/problems/\345\211\215\345\272\217/\347\274\226\347\250\213\347\264\240\345\205\273\351\203\250\345\210\206\347\232\204\345\220\271\346\257\233\346\261\202\347\226\265.md" "b/problems/\345\211\215\345\272\217/\347\274\226\347\250\213\347\264\240\345\205\273\351\203\250\345\210\206\347\232\204\345\220\271\346\257\233\346\261\202\347\226\265.md" index 3f18f9d1d5..6099747a92 100644 --- "a/problems/\345\211\215\345\272\217/\347\274\226\347\250\213\347\264\240\345\205\273\351\203\250\345\210\206\347\232\204\345\220\271\346\257\233\346\261\202\347\226\265.md" +++ "b/problems/\345\211\215\345\272\217/\347\274\226\347\250\213\347\264\240\345\205\273\351\203\250\345\210\206\347\232\204\345\220\271\346\257\233\346\261\202\347\226\265.md" @@ -13,7 +13,7 @@ - 左孩子和右孩子的下标不太好理解。我给出证明过程: - 如果父节点在第$k$层,第$m,m \in [0,2^k]$个节点,则其左孩子所在的位置必然为$k+1$层,第$2*(m-1)+1$个节点。 + 如果父节点在第k层,第$m,m \in [0,2^k]$个节点,则其左孩子所在的位置必然为$k+1$层,第$2*(m-1)+1$个节点。 - 计算父节点在数组中的索引: $$ diff --git "a/problems/\345\211\215\345\272\217/\351\200\222\345\275\222\347\256\227\346\263\225\347\232\204\346\227\266\351\227\264\344\270\216\347\251\272\351\227\264\345\244\215\346\235\202\345\272\246\345\210\206\346\236\220.md" "b/problems/\345\211\215\345\272\217/\351\200\222\345\275\222\347\256\227\346\263\225\347\232\204\346\227\266\351\227\264\344\270\216\347\251\272\351\227\264\345\244\215\346\235\202\345\272\246\345\210\206\346\236\220.md" index 3c0d219ca6..142358da7b 100644 --- "a/problems/\345\211\215\345\272\217/\351\200\222\345\275\222\347\256\227\346\263\225\347\232\204\346\227\266\351\227\264\344\270\216\347\251\272\351\227\264\345\244\215\346\235\202\345\272\246\345\210\206\346\236\220.md" +++ "b/problems/\345\211\215\345\272\217/\351\200\222\345\275\222\347\256\227\346\263\225\347\232\204\346\227\266\351\227\264\344\270\216\347\251\272\351\227\264\345\244\215\346\235\202\345\272\246\345\210\206\346\236\220.md" @@ -26,7 +26,7 @@ int fibonacci(int i) { 在讲解递归时间复杂度的时候,我们提到了递归算法的时间复杂度本质上是要看: **递归的次数 * 每次递归的时间复杂度**。 -可以看出上面的代码每次递归都是$O(1)$的操作。再来看递归了多少次,这里将i为5作为输入的递归过程 抽象成一棵递归树,如图: +可以看出上面的代码每次递归都是O(1)的操作。再来看递归了多少次,这里将i为5作为输入的递归过程 抽象成一棵递归树,如图: ![递归空间复杂度分析](https://img-blog.csdnimg.cn/20210305093200104.png) @@ -36,7 +36,7 @@ int fibonacci(int i) { 我们之前也有说到,一棵深度(按根节点深度为1)为k的二叉树最多可以有 2^k - 1 个节点。 -所以该递归算法的时间复杂度为$O(2^n)$,这个复杂度是非常大的,随着n的增大,耗时是指数上升的。 +所以该递归算法的时间复杂度为O(2^n),这个复杂度是非常大的,随着n的增大,耗时是指数上升的。 来做一个实验,大家可以有一个直观的感受。 @@ -85,7 +85,7 @@ int main() * n = 40,耗时:837 ms * n = 50,耗时:110306 ms -可以看出,$O(2^n)$这种指数级别的复杂度是非常大的。 +可以看出,O(2^n)这种指数级别的复杂度是非常大的。 所以这种求斐波那契数的算法看似简洁,其实时间复杂度非常高,一般不推荐这样来实现斐波那契。 @@ -119,14 +119,14 @@ int fibonacci(int first, int second, int n) { 这里相当于用first和second来记录当前相加的两个数值,此时就不用两次递归了。 -因为每次递归的时候n减1,即只是递归了n次,所以时间复杂度是 $O(n)$。 +因为每次递归的时候n减1,即只是递归了n次,所以时间复杂度是 O(n)。 -同理递归的深度依然是n,每次递归所需的空间也是常数,所以空间复杂度依然是$O(n)$。 +同理递归的深度依然是n,每次递归所需的空间也是常数,所以空间复杂度依然是O(n)。 代码(版本二)的复杂度如下: -* 时间复杂度:$O(n)$ -* 空间复杂度:$O(n)$ +* 时间复杂度:O(n) +* 空间复杂度:O(n) 此时再来测一下耗时情况验证一下: @@ -198,7 +198,7 @@ int main() 递归第n个斐波那契数的话,递归调用栈的深度就是n。 -那么每次递归的空间复杂度是$O(1)$, 调用栈深度为n,所以这段递归代码的空间复杂度就是$O(n)$。 +那么每次递归的空间复杂度是O(1), 调用栈深度为n,所以这段递归代码的空间复杂度就是O(n)。 ```CPP int fibonacci(int i) { @@ -233,24 +233,24 @@ int binary_search( int arr[], int l, int r, int x) { } ``` -都知道二分查找的时间复杂度是$O(\log n)$,那么递归二分查找的空间复杂度是多少呢? +都知道二分查找的时间复杂度是O(logn),那么递归二分查找的空间复杂度是多少呢? 我们依然看 **每次递归的空间复杂度和递归的深度** 每次递归的空间复杂度可以看出主要就是参数里传入的这个arr数组,但需要注意的是在C/C++中函数传递数组参数,不是整个数组拷贝一份传入函数而是传入的数组首元素地址。 -**也就是说每一层递归都是公用一块数组地址空间的**,所以 每次递归的空间复杂度是常数即:$O(1)$。 +**也就是说每一层递归都是公用一块数组地址空间的**,所以 每次递归的空间复杂度是常数即:O(1)。 -再来看递归的深度,二分查找的递归深度是logn ,递归深度就是调用栈的长度,那么这段代码的空间复杂度为 $1 * logn = O(logn)$。 +再来看递归的深度,二分查找的递归深度是logn ,递归深度就是调用栈的长度,那么这段代码的空间复杂度为 1 * logn = O(logn)。 -大家要注意自己所用的语言在传递函数参数的时,是拷贝整个数值还是拷贝地址,如果是拷贝整个数值那么该二分法的空间复杂度就是$O(n\log n)$。 +大家要注意自己所用的语言在传递函数参数的时,是拷贝整个数值还是拷贝地址,如果是拷贝整个数值那么该二分法的空间复杂度就是O(nlogn)。 ## 总结 本章我们详细分析了递归实现的求斐波那契和二分法的空间复杂度,同时也对时间复杂度做了分析。 -特别是两种递归实现的求斐波那契数列,其时间复杂度截然不容,我们还做了实验,验证了时间复杂度为$O(2^n)$是非常耗时的。 +特别是两种递归实现的求斐波那契数列,其时间复杂度截然不容,我们还做了实验,验证了时间复杂度为O(2^n)是非常耗时的。 通过本篇大家应该对递归算法的时间复杂度和空间复杂度有更加深刻的理解了。 diff --git "a/problems/\345\211\215\345\272\217/\351\200\232\350\277\207\344\270\200\351\201\223\351\235\242\350\257\225\351\242\230\347\233\256\357\274\214\350\256\262\344\270\200\350\256\262\351\200\222\345\275\222\347\256\227\346\263\225\347\232\204\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\201.md" "b/problems/\345\211\215\345\272\217/\351\200\232\350\277\207\344\270\200\351\201\223\351\235\242\350\257\225\351\242\230\347\233\256\357\274\214\350\256\262\344\270\200\350\256\262\351\200\222\345\275\222\347\256\227\346\263\225\347\232\204\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\201.md" index 12af4dd8fe..b2db92f541 100644 --- "a/problems/\345\211\215\345\272\217/\351\200\232\350\277\207\344\270\200\351\201\223\351\235\242\350\257\225\351\242\230\347\233\256\357\274\214\350\256\262\344\270\200\350\256\262\351\200\222\345\275\222\347\256\227\346\263\225\347\232\204\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\201.md" +++ "b/problems/\345\211\215\345\272\217/\351\200\232\350\277\207\344\270\200\351\201\223\351\235\242\350\257\225\351\242\230\347\233\256\357\274\214\350\256\262\344\270\200\350\256\262\351\200\222\345\275\222\347\256\227\346\263\225\347\232\204\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\201.md" @@ -5,13 +5,13 @@ 相信很多同学对递归算法的时间复杂度都很模糊,那么这篇来给大家通透的讲一讲。 -**同一道题目,同样使用递归算法,有的同学会写出了$O(n)$的代码,有的同学就写出了$O(\log n)$的代码**。 +**同一道题目,同样使用递归算法,有的同学会写出了O(n)的代码,有的同学就写出了O(logn)的代码**。 这是为什么呢? 如果对递归的时间复杂度理解的不够深入的话,就会这样! -那么我通过一道简单的面试题,模拟面试的场景,来带大家逐步分析递归算法的时间复杂度,最后找出最优解,来看看同样是递归,怎么就写成了$O(n)$的代码。 +那么我通过一道简单的面试题,模拟面试的场景,来带大家逐步分析递归算法的时间复杂度,最后找出最优解,来看看同样是递归,怎么就写成了O(n)的代码。 面试题:求x的n次方 @@ -26,7 +26,7 @@ int function1(int x, int n) { return result; } ``` -时间复杂度为$O(n)$,此时面试官会说,有没有效率更好的算法呢。 +时间复杂度为O(n),此时面试官会说,有没有效率更好的算法呢。 **如果此时没有思路,不要说:我不会,我不知道了等等**。 @@ -44,11 +44,11 @@ int function2(int x, int n) { ``` 面试官问:“那么这个代码的时间复杂度是多少?”。 -一些同学可能一看到递归就想到了$O(\log n)$,其实并不是这样,递归算法的时间复杂度本质上是要看: **递归的次数 * 每次递归中的操作次数**。 +一些同学可能一看到递归就想到了O(log n),其实并不是这样,递归算法的时间复杂度本质上是要看: **递归的次数 * 每次递归中的操作次数**。 那再来看代码,这里递归了几次呢? -每次n-1,递归了n次时间复杂度是$O(n)$,每次进行了一个乘法操作,乘法操作的时间复杂度一个常数项$O(1)$,所以这份代码的时间复杂度是 $n × 1 = O(n)$。 +每次n-1,递归了n次时间复杂度是O(n),每次进行了一个乘法操作,乘法操作的时间复杂度一个常数项O(1),所以这份代码的时间复杂度是 n × 1 = O(n)。 这个时间复杂度就没有达到面试官的预期。于是又写出了如下的递归算法的代码: @@ -81,11 +81,11 @@ int function3(int x, int n) { ![递归求时间复杂度](https://img-blog.csdnimg.cn/20200728195531892.png) -**时间复杂度忽略掉常数项`-1`之后,这个递归算法的时间复杂度依然是$O(n)$**。对,你没看错,依然是$O(n)$的时间复杂度! +**时间复杂度忽略掉常数项`-1`之后,这个递归算法的时间复杂度依然是O(n)**。对,你没看错,依然是O(n)的时间复杂度! -此时面试官就会说:“这个递归的算法依然还是$O(n)$啊”, 很明显没有达到面试官的预期。 +此时面试官就会说:“这个递归的算法依然还是O(n)啊”, 很明显没有达到面试官的预期。 -那么$O(\log n)$的递归算法应该怎么写呢? +那么O(logn)的递归算法应该怎么写呢? 想一想刚刚给出的那份递归算法的代码,是不是有哪里比较冗余呢,其实有重复计算的部分。 @@ -108,7 +108,7 @@ int function4(int x, int n) { 依然还是看他递归了多少次,可以看到这里仅仅有一个递归调用,且每次都是n/2 ,所以这里我们一共调用了log以2为底n的对数次。 -**每次递归了做都是一次乘法操作,这也是一个常数项的操作,那么这个递归算法的时间复杂度才是真正的$O(\log n)$**。 +**每次递归了做都是一次乘法操作,这也是一个常数项的操作,那么这个递归算法的时间复杂度才是真正的O(logn)**。 此时大家最后写出了这样的代码并且将时间复杂度分析的非常清晰,相信面试官是比较满意的。 @@ -116,11 +116,11 @@ int function4(int x, int n) { 对于递归的时间复杂度,毕竟初学者有时候会迷糊,刷过很多题的老手依然迷糊。 -**本篇我用一道非常简单的面试题目:求x的n次方,来逐步分析递归算法的时间复杂度,注意不要一看到递归就想到了$O(\log n)$!** +**本篇我用一道非常简单的面试题目:求x的n次方,来逐步分析递归算法的时间复杂度,注意不要一看到递归就想到了O(logn)!** -同样使用递归,有的同学可以写出$O(\log n)$的代码,有的同学还可以写出$O(n)$的代码。 +同样使用递归,有的同学可以写出O(logn)的代码,有的同学还可以写出O(n)的代码。 -对于function3 这样的递归实现,很容易让人感觉这是$O(\log n)$的时间复杂度,其实这是$O(n)$的算法! +对于function3 这样的递归实现,很容易让人感觉这是O(log n)的时间复杂度,其实这是O(n)的算法! ```CPP int function3(int x, int n) { diff --git "a/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" "b/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" index 6139127423..fec83e1d5a 100644 --- "a/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" @@ -86,7 +86,7 @@ public: # 题外话 一些同学热衷于使用substr,来做这道题。 -其实使用substr 和 反转 时间复杂度是一样的 ,都是$O(n)$,但是使用substr申请了额外空间,所以空间复杂度是$O(n)$,而反转方法的空间复杂度是$O(1)$。 +其实使用substr 和 反转 时间复杂度是一样的 ,都是O(n),但是使用substr申请了额外空间,所以空间复杂度是O(n),而反转方法的空间复杂度是O(1)。 **如果想让这套题目有意义,就不要申请额外空间。** diff --git "a/problems/\345\217\214\346\214\207\351\222\210\346\200\273\347\273\223.md" "b/problems/\345\217\214\346\214\207\351\222\210\346\200\273\347\273\223.md" index 39096ff739..06752cacb0 100644 --- "a/problems/\345\217\214\346\214\207\351\222\210\346\200\273\347\273\223.md" +++ "b/problems/\345\217\214\346\214\207\351\222\210\346\200\273\347\273\223.md" @@ -89,7 +89,7 @@ for (int i = 0; i < array.size(); i++) { # 总结 -本文中一共介绍了leetcode上九道使用双指针解决问题的经典题目,除了链表一些题目一定要使用双指针,其他题目都是使用双指针来提高效率,一般是将$O(n^2)$的时间复杂度,降为$O(n)$。 +本文中一共介绍了leetcode上九道使用双指针解决问题的经典题目,除了链表一些题目一定要使用双指针,其他题目都是使用双指针来提高效率,一般是将O(n^2)的时间复杂度,降为$O(n)$。 建议大家可以把文中涉及到的题目在好好做一做,琢磨琢磨,基本对双指针法就不在话下了。 diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20200927\344\272\214\345\217\211\346\240\221\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20200927\344\272\214\345\217\211\346\240\221\345\221\250\346\234\253\346\200\273\347\273\223.md" index 60f0220541..ff8f67d47d 100644 --- "a/problems/\345\221\250\346\200\273\347\273\223/20200927\344\272\214\345\217\211\346\240\221\345\221\250\346\234\253\346\200\273\347\273\223.md" +++ "b/problems/\345\221\250\346\200\273\347\273\223/20200927\344\272\214\345\217\211\346\240\221\345\221\250\346\234\253\346\200\273\347\273\223.md" @@ -44,7 +44,7 @@ a->right = NULL; 在介绍前中后序遍历的时候,有递归和迭代(非递归),还有一种牛逼的遍历方式:morris遍历。 -morris遍历是二叉树遍历算法的超强进阶算法,morris遍历可以将非递归遍历中的空间复杂度降为$O(1)$,感兴趣大家就去查一查学习学习,比较小众,面试几乎不会考。我其实也没有研究过,就不做过多介绍了。 +morris遍历是二叉树遍历算法的超强进阶算法,morris遍历可以将非递归遍历中的空间复杂度降为O(1),感兴趣大家就去查一查学习学习,比较小众,面试几乎不会考。我其实也没有研究过,就不做过多介绍了。 ## 周二 diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20201126\350\264\252\345\277\203\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20201126\350\264\252\345\277\203\345\221\250\346\234\253\346\200\273\347\273\223.md" index 02fccc25e0..e310c0f8e0 100644 --- "a/problems/\345\221\250\346\200\273\347\273\223/20201126\350\264\252\345\277\203\345\221\250\346\234\253\346\200\273\347\273\223.md" +++ "b/problems/\345\221\250\346\200\273\347\273\223/20201126\350\264\252\345\277\203\345\221\250\346\234\253\346\200\273\347\273\223.md" @@ -41,7 +41,7 @@ 一些录友不清楚[贪心算法:分发饼干](https://programmercarl.com/0455.分发饼干.html)中时间复杂度是怎么来的? -就是快排$O(n\log n)$,遍历$O(n)$,加一起就是还是$O(n\log n)$。 +就是快排O(nlog n),遍历O(n),加一起就是还是O(nlogn)。 ## 周三 diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20201210\345\244\215\346\235\202\345\272\246\345\210\206\346\236\220\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20201210\345\244\215\346\235\202\345\272\246\345\210\206\346\236\220\345\221\250\346\234\253\346\200\273\347\273\223.md" index 1b404bf060..5e5f696d4c 100644 --- "a/problems/\345\221\250\346\200\273\347\273\223/20201210\345\244\215\346\235\202\345\272\246\345\210\206\346\236\220\345\221\250\346\234\253\346\200\273\347\273\223.md" +++ "b/problems/\345\221\250\346\200\273\347\273\223/20201210\345\244\215\346\235\202\345\272\246\345\210\206\346\236\220\345\221\250\346\234\253\346\200\273\347\273\223.md" @@ -70,9 +70,9 @@ # 周三 -在[$O(n)$的算法居然超时了,此时的n究竟是多大?](https://programmercarl.com/前序/On的算法居然超时了,此时的n究竟是多大?.html)中介绍了大家在leetcode上提交代码经常遇到的一个问题-超时! +在[O(n)的算法居然超时了,此时的n究竟是多大?](https://programmercarl.com/前序/On的算法居然超时了,此时的n究竟是多大?.html)中介绍了大家在leetcode上提交代码经常遇到的一个问题-超时! -估计很多录友知道算法超时了,但没有注意过 $O(n)$的算法,如果1s内出结果,这个n究竟是多大? +估计很多录友知道算法超时了,但没有注意过 O(n)的算法,如果1s内出结果,这个n究竟是多大? 文中从计算机硬件出发,分析计算机的计算性能,然后亲自做实验,整理出数据如下: @@ -95,7 +95,7 @@ 文中给出了四个版本的代码实现,并逐一分析了其时间复杂度。 -此时大家就会发现,同一道题目,同样使用递归算法,有的同学会写出了$O(n)$的代码,有的同学就写出了$O(\log n)$的代码。 +此时大家就会发现,同一道题目,同样使用递归算法,有的同学会写出了O(n)的代码,有的同学就写出了$O(\log n)$的代码。 其本质是要对递归的时间复杂度有清晰的认识,才能运用递归来有效的解决问题! diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20201217\350\264\252\345\277\203\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20201217\350\264\252\345\277\203\345\221\250\346\234\253\346\200\273\347\273\223.md" index e9d22d6e22..4d12f92a88 100644 --- "a/problems/\345\221\250\346\200\273\347\273\223/20201217\350\264\252\345\277\203\345\221\250\346\234\253\346\200\273\347\273\223.md" +++ "b/problems/\345\221\250\346\200\273\347\273\223/20201217\350\264\252\345\277\203\345\221\250\346\234\253\346\200\273\347\273\223.md" @@ -8,7 +8,7 @@ 在[贪心算法:加油站](https://programmercarl.com/0134.加油站.html)中给出每一个加油站的汽油和开到这个加油站的消耗,问汽车能不能开一圈。 -这道题目咋眼一看,感觉是一道模拟题,模拟一下汽车从每一个节点出发看看能不能开一圈,时间复杂度是$O(n^2)$。 +这道题目咋眼一看,感觉是一道模拟题,模拟一下汽车从每一个节点出发看看能不能开一圈,时间复杂度是O(n^2)。 即使用模拟这种情况,也挺考察代码技巧的。 diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20210225\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20210225\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" index 0bf9dbdb6f..21cc53ad09 100644 --- "a/problems/\345\221\250\346\200\273\347\273\223/20210225\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" +++ "b/problems/\345\221\250\346\200\273\347\273\223/20210225\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" @@ -211,8 +211,8 @@ public: }; ``` -* 时间复杂度:$O(n^2)$ -* 空间复杂度:$O(1)$ +* 时间复杂度:O(n^2) +* 空间复杂度:O(1) 贪心解法代码如下: @@ -233,8 +233,8 @@ public: }; ``` -* 时间复杂度:$O(n)$ -* 空间复杂度:$O(1)$ +* 时间复杂度:O(n) +* 空间复杂度:O(1) 动规解法,版本一,代码如下: @@ -256,8 +256,8 @@ public: }; ``` -* 时间复杂度:$O(n)$ -* 空间复杂度:$O(n)$ +* 时间复杂度:O(n) +* 空间复杂度:O(n) 从递推公式可以看出,dp[i]只是依赖于dp[i - 1]的状态。 @@ -282,8 +282,8 @@ public: }; ``` -* 时间复杂度:$O(n)$ -* 空间复杂度:$O(1)$ +* 时间复杂度:O(n) +* 空间复杂度:O(1) 建议先写出版本一,然后在版本一的基础上优化成版本二,而不是直接就写出版本二。 diff --git "a/problems/\345\223\210\345\270\214\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\345\223\210\345\270\214\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" index 40a8d0ca9e..3b6c5ce549 100644 --- "a/problems/\345\223\210\345\270\214\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\345\223\210\345\270\214\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -22,7 +22,7 @@ 例如要查询一个名字是否在这所学校里。 -要枚举的话时间复杂度是$O(n)$,但如果使用哈希表的话, 只需要$O(1)$就可以做到。 +要枚举的话时间复杂度是O(n),但如果使用哈希表的话, 只需要O(1)就可以做到。 我们只需要初始化把这所学校里学生的名字都存在哈希表里,在查询的时候通过索引直接就可以知道这位同学在不在这所学校里了。 @@ -88,17 +88,17 @@ |集合 |底层实现 | 是否有序 |数值是否可以重复 | 能否更改数值|查询效率 |增删效率| |---|---| --- |---| --- | --- | ---| -|std::set |红黑树 |有序 |否 |否 | $O(\log n)$|$O(\log n)$ | -|std::multiset | 红黑树|有序 |是 | 否| $O(\log n)$ |$O(\log n)$ | -|std::unordered_set |哈希表 |无序 |否 |否 |$O(1)$ | $O(1)$| +|std::set |红黑树 |有序 |否 |否 | O(log n)|O(log n) | +|std::multiset | 红黑树|有序 |是 | 否| O(logn) |O(logn) | +|std::unordered_set |哈希表 |无序 |否 |否 |O(1) | O(1)| std::unordered_set底层实现为哈希表,std::set 和std::multiset 的底层实现是红黑树,红黑树是一种平衡二叉搜索树,所以key值是有序的,但key不可以修改,改动key值会导致整棵树的错乱,所以只能删除和增加。 |映射 |底层实现 | 是否有序 |数值是否可以重复 | 能否更改数值|查询效率 |增删效率| |---|---| --- |---| --- | --- | ---| -|std::map |红黑树 |key有序 |key不可重复 |key不可修改 | $O(\log n)$|$O(\log n)$ | -|std::multimap | 红黑树|key有序 | key可重复 | key不可修改|$O(\log n)$ |$O(\log n)$ | -|std::unordered_map |哈希表 | key无序 |key不可重复 |key不可修改 |$O(1)$ | $O(1)$| +|std::map |红黑树 |key有序 |key不可重复 |key不可修改 | O(logn)|O(logn) | +|std::multimap | 红黑树|key有序 | key可重复 | key不可修改|O(log n) |O(log n) | +|std::unordered_map |哈希表 | key无序 |key不可重复 |key不可修改 |O(1) | O(1)| std::unordered_map 底层实现为哈希表,std::map 和std::multimap 的底层实现是红黑树。同理,std::map 和std::multimap 的key也是有序的(这个问题也经常作为面试题,考察对语言容器底层的理解)。 diff --git "a/problems/\345\233\236\346\272\257\346\200\273\347\273\223.md" "b/problems/\345\233\236\346\272\257\346\200\273\347\273\223.md" index 5b8e227603..54ac485b3d 100644 --- "a/problems/\345\233\236\346\272\257\346\200\273\347\273\223.md" +++ "b/problems/\345\233\236\346\272\257\346\200\273\347\273\223.md" @@ -302,7 +302,7 @@ if (startIndex >= nums.size()) { // 终止条件可以不加 **而使用used数组在时间复杂度上几乎没有额外负担!** -**使用set去重,不仅时间复杂度高了,空间复杂度也高了**,在[本周小结!(回溯算法系列三)](https://programmercarl.com/周总结/20201112回溯周末总结.html)中分析过,组合,子集,排列问题的空间复杂度都是O(n),但如果使用set去重,空间复杂度就变成了$O(n^2)$,因为每一层递归都有一个set集合,系统栈空间是n,每一个空间都有set集合。 +**使用set去重,不仅时间复杂度高了,空间复杂度也高了**,在[本周小结!(回溯算法系列三)](https://programmercarl.com/周总结/20201112回溯周末总结.html)中分析过,组合,子集,排列问题的空间复杂度都是O(n),但如果使用set去重,空间复杂度就变成了O(n^2),因为每一层递归都有一个set集合,系统栈空间是n,每一个空间都有set集合。 那有同学可能疑惑 用used数组也是占用O(n)的空间啊? diff --git "a/problems/\346\225\260\347\273\204\346\200\273\347\273\223\347\257\207.md" "b/problems/\346\225\260\347\273\204\346\200\273\347\273\223\347\257\207.md" index 242c149878..d256298b9a 100644 --- "a/problems/\346\225\260\347\273\204\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/\346\225\260\347\273\204\346\200\273\347\273\223\347\257\207.md" @@ -102,7 +102,7 @@ 本题中,主要要理解滑动窗口如何移动 窗口起始位置,达到动态更新窗口大小的,从而得出长度最小的符合条件的长度。 -**滑动窗口的精妙之处在于根据当前子序列和大小的情况,不断调节子序列的起始位置。从而将$O(n^2)$的暴力解法降为$O(n)$。** +**滑动窗口的精妙之处在于根据当前子序列和大小的情况,不断调节子序列的起始位置。从而将O(n^2)的暴力解法降为O(n)。** 如果没有接触过这一类的方法,很难想到类似的解题思路,滑动窗口方法还是很巧妙的。 diff --git "a/problems/\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227\357\274\210vector\345\216\237\347\220\206\350\256\262\350\247\243\357\274\211.md" "b/problems/\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227\357\274\210vector\345\216\237\347\220\206\350\256\262\350\247\243\357\274\211.md" index 6c972b41b4..e229f39726 100644 --- "a/problems/\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227\357\274\210vector\345\216\237\347\220\206\350\256\262\350\247\243\357\274\211.md" +++ "b/problems/\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227\357\274\210vector\345\216\237\347\220\206\350\256\262\350\247\243\357\274\211.md" @@ -151,7 +151,7 @@ public: 大家应该发现了,编程语言中一个普通容器的insert,delete的使用,都可能对写出来的算法的有很大影响! -如果抛开语言谈算法,除非从来不用代码写算法纯分析,**否则的话,语言功底不到位O(n)的算法可以写出$O(n^2)$的性能**,哈哈。 +如果抛开语言谈算法,除非从来不用代码写算法纯分析,**否则的话,语言功底不到位O(n)的算法可以写出O(n^2)的性能**,哈哈。 相信在这里学习算法的录友们,都是想在软件行业长远发展的,都是要从事编程的工作,那么一定要深耕好一门编程语言,这个非常重要! diff --git "a/problems/\350\264\252\345\277\203\347\256\227\346\263\225\346\200\273\347\273\223\347\257\207.md" "b/problems/\350\264\252\345\277\203\347\256\227\346\263\225\346\200\273\347\273\223\347\257\207.md" index 1db9b4dc10..6539501f6b 100644 --- "a/problems/\350\264\252\345\277\203\347\256\227\346\263\225\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/\350\264\252\345\277\203\347\256\227\346\263\225\346\200\273\347\273\223\347\257\207.md" @@ -127,9 +127,9 @@ Carl个人认为:如果找出局部最优并可以推出全局最优,就是 贪心专题汇聚为一张图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211110121605.png) +![](https://code-thinking-1253855093.file.myqcloud.com/pics/贪心总结water.png) -这个图是 [代码随想录知识星球](https://programmercarl.com/other/kstar.html) 成员:[青](https://wx.zsxq.com/dweb2/index/footprint/185251215558842)所画,总结的非常好,分享给大家。 +这个图是 [代码随想录知识星球](https://programmercarl.com/other/kstar.html) 成员:[海螺人](https://wx.zsxq.com/dweb2/index/footprint/844412858822412)所画,总结的非常好,分享给大家。 很多没有接触过贪心的同学都会感觉贪心有啥可学的,但只要跟着「代码随想录」坚持下来之后,就会发现,贪心是一种很重要的算法思维而且并不简单,贪心往往妙的出其不意,触不及防! @@ -145,18 +145,6 @@ Carl个人认为:如果找出局部最优并可以推出全局最优,就是 **一个系列的结束,又是一个新系列的开始,我们将在明年第一个工作日正式开始动态规划,来不及解释了,录友们上车别掉队,我们又要开始新的征程!** -## 其他语言版本 - - -Java: - - -Python: - - -Go: - - ----------------------- From 1b935259a6c83beab9f730059da4bec509bb1f61 Mon Sep 17 00:00:00 2001 From: Guanzhong Pan Date: Tue, 12 Apr 2022 21:01:23 +0100 Subject: [PATCH 0527/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200122.=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?II.md=20C=E8=AF=AD=E8=A8=80=E5=8A=A8=E6=80=81=E8=A7=84=E5=88=92?= =?UTF-8?q?=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\344\275\263\346\227\266\346\234\272II.md" | 24 ++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" index 83b852c6c0..1b84f728f1 100644 --- "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" +++ "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" @@ -269,7 +269,7 @@ const maxProfit = (prices) => { ``` C: - +贪心: ```c int maxProfit(int* prices, int pricesSize){ int result = 0; @@ -284,5 +284,27 @@ int maxProfit(int* prices, int pricesSize){ } ``` +动态规划: +```c +#define max(a, b) (((a) > (b)) ? (a) : (b)) + +int maxProfit(int* prices, int pricesSize){ + int dp[pricesSize][2]; + dp[0][0] = 0 - prices[0]; + dp[0][1] = 0; + + int i; + for(i = 1; i < pricesSize; ++i) { + // dp[i][0]为i-1天持股的钱数/在第i天用i-1天的钱买入的最大值。 + // 若i-1天持股,且第i天买入股票比i-1天持股时更亏,说明应在i-1天时持股 + dp[i][0] = max(dp[i-1][0], dp[i-1][1] - prices[i]); + //dp[i][1]为i-1天不持股钱数/在第i天卖出所持股票dp[i-1][0] + prices[i]的最大值 + dp[i][1] = max(dp[i-1][1], dp[i-1][0] + prices[i]); + } + // 返回在最后一天不持股时的钱数(将股票卖出后钱最大化) + return dp[pricesSize - 1][1]; +} +``` + -----------------------
From 0fc1cb334d4f8612e95eabfc9e97fe8d273dc25e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=9F=E4=BB=A4=E4=BB=A4?= Date: Wed, 13 Apr 2022 15:51:42 +0800 Subject: [PATCH 0528/3019] =?UTF-8?q?Update=200459.=E9=87=8D=E5=A4=8D?= =?UTF-8?q?=E7=9A=84=E5=AD=90=E5=AD=97=E7=AC=A6=E4=B8=B2.md=20=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0swift=E6=96=B9=E6=B3=95(=E5=89=8D=E7=BC=80=E8=A1=A8?= =?UTF-8?q?=E7=BB=9F=E4=B8=80=E4=B8=8D=E5=87=8F=E4=B8=80)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...20\345\255\227\347\254\246\344\270\262.md" | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git "a/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" "b/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" index 6a9b4260ac..f2fe728dd4 100644 --- "a/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" @@ -463,6 +463,46 @@ Swift: } } ``` +> 前缀表统一不减一 +```swift + func repeatedSubstringPattern(_ s: String) -> Bool { + + let sArr = Array(s) + let len = sArr.count + if len == 0 { + return false + } + + var next = Array.init(repeating: 0, count: len) + getNext(&next, sArr) + + if next[len-1] != 0 && len % (len - next[len-1]) == 0 { + return true + } + + return false + } + + // 前缀表不减一 + func getNext(_ next: inout [Int], _ sArr:[Character]) { + + var j = 0 + next[0] = 0 + + for i in 1 ..< sArr.count { + while j > 0 && sArr[i] != sArr[j] { + j = next[j-1] + } + + if sArr[i] == sArr[j] { + j += 1 + } + + next[i] = j + } + } + +``` -----------------------
From cfb8ab8b936418f6b446bad655be491f9159be14 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=9F=E4=BB=A4=E4=BB=A4?= Date: Wed, 13 Apr 2022 16:01:26 +0800 Subject: [PATCH 0529/3019] Revert "Merge branch 'youngyangyang04:master' into master" This reverts commit 33be177e63bc622c4e1e67d9e268bc13d4d5ba54, reversing changes made to 559f03c92869ca55ae929d66de872f5ddda70567. --- ...11\346\216\222\350\241\214\347\250\213.md" | 58 ------------------- 1 file changed, 58 deletions(-) diff --git "a/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" "b/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" index 041a7f031e..01f81c4dc6 100644 --- "a/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" +++ "b/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" @@ -342,64 +342,6 @@ class Solution: return path ``` -### Go -```go -type pair struct { - target string - visited bool -} -type pairs []*pair - -func (p pairs) Len() int { - return len(p) -} -func (p pairs) Swap(i, j int) { - p[i], p[j] = p[j], p[i] -} -func (p pairs) Less(i, j int) bool { - return p[i].target < p[j].target -} - -func findItinerary(tickets [][]string) []string { - result := []string{} - // map[出发机场] pair{目的地,是否被访问过} - targets := make(map[string]pairs) - for _, ticket := range tickets { - if targets[ticket[0]] == nil { - targets[ticket[0]] = make(pairs, 0) - } - targets[ticket[0]] = append(targets[ticket[0]], &pair{target: ticket[1], visited: false}) - } - for k, _ := range targets { - sort.Sort(targets[k]) - } - result = append(result, "JFK") - var backtracking func() bool - backtracking = func() bool { - if len(tickets)+1 == len(result) { - return true - } - // 取出起飞航班对应的目的地 - for _, pair := range targets[result[len(result)-1]] { - if pair.visited == false { - result = append(result, pair.target) - pair.visited = true - if backtracking() { - return true - } - result = result[:len(result)-1] - pair.visited = false - } - } - return false - } - - backtracking() - - return result -} -``` - ### C语言 ```C From efe987be6b6a9cdc908d836e86954aab22227da7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=9F=E4=BB=A4=E4=BB=A4?= Date: Wed, 13 Apr 2022 16:07:23 +0800 Subject: [PATCH 0530/3019] =?UTF-8?q?Revert=20"Update=200459.=E9=87=8D?= =?UTF-8?q?=E5=A4=8D=E7=9A=84=E5=AD=90=E5=AD=97=E7=AC=A6=E4=B8=B2.md=20?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0swift=E6=96=B9=E6=B3=95(=E5=89=8D=E7=BC=80?= =?UTF-8?q?=E8=A1=A8=E7=BB=9F=E4=B8=80=E4=B8=8D=E5=87=8F=E4=B8=80)"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 0fc1cb334d4f8612e95eabfc9e97fe8d273dc25e. --- ...20\345\255\227\347\254\246\344\270\262.md" | 40 ------------------- 1 file changed, 40 deletions(-) diff --git "a/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" "b/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" index f2fe728dd4..6a9b4260ac 100644 --- "a/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" @@ -463,46 +463,6 @@ Swift: } } ``` -> 前缀表统一不减一 -```swift - func repeatedSubstringPattern(_ s: String) -> Bool { - - let sArr = Array(s) - let len = sArr.count - if len == 0 { - return false - } - - var next = Array.init(repeating: 0, count: len) - getNext(&next, sArr) - - if next[len-1] != 0 && len % (len - next[len-1]) == 0 { - return true - } - - return false - } - - // 前缀表不减一 - func getNext(_ next: inout [Int], _ sArr:[Character]) { - - var j = 0 - next[0] = 0 - - for i in 1 ..< sArr.count { - while j > 0 && sArr[i] != sArr[j] { - j = next[j-1] - } - - if sArr[i] == sArr[j] { - j += 1 - } - - next[i] = j - } - } - -``` -----------------------
From a391c2c949c393141e7aed3d1e8cdbf6b6a0b956 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=9F=E4=BB=A4=E4=BB=A4?= Date: Wed, 13 Apr 2022 16:10:50 +0800 Subject: [PATCH 0531/3019] =?UTF-8?q?Update=200459.=E9=87=8D=E5=A4=8D?= =?UTF-8?q?=E7=9A=84=E5=AD=90=E5=AD=97=E7=AC=A6=E4=B8=B2.md=20=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0swift=E6=96=B9=E6=B3=95(=E5=89=8D=E7=BC=80=E8=A1=A8?= =?UTF-8?q?=E7=BB=9F=E4=B8=80=E4=B8=8D=E5=87=8F=E4=B8=80)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...20\345\255\227\347\254\246\344\270\262.md" | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git "a/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" "b/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" index 6a9b4260ac..a51c68eea7 100644 --- "a/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" @@ -464,5 +464,46 @@ Swift: } ``` +> 前缀表统一不减一 +```swift + func repeatedSubstringPattern(_ s: String) -> Bool { + + let sArr = Array(s) + let len = sArr.count + if len == 0 { + return false + } + + var next = Array.init(repeating: 0, count: len) + getNext(&next, sArr) + + if next[len-1] != 0 && len % (len - next[len-1]) == 0 { + return true + } + + return false + } + + // 前缀表不减一 + func getNext(_ next: inout [Int], _ sArr:[Character]) { + + var j = 0 + next[0] = 0 + + for i in 1 ..< sArr.count { + + while j > 0 && sArr[i] != sArr[j] { + j = next[j-1] + } + + if sArr[i] == sArr[j] { + j += 1 + } + + next[i] = j + } + } +``` + -----------------------
From e1abedc13ad4d5f744ecc27fa9931aa24508364b Mon Sep 17 00:00:00 2001 From: Guanzhong Pan Date: Wed, 13 Apr 2022 09:41:50 +0100 Subject: [PATCH 0532/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200055.=E8=B7=B3?= =?UTF-8?q?=E8=B7=83=E6=B8=B8=E6=88=8F.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 --- ...63\350\267\203\346\270\270\346\210\217.md" | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git "a/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" "b/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" index c0890f75f3..4ba0c03bd3 100644 --- "a/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" +++ "b/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" @@ -154,6 +154,28 @@ var canJump = function(nums) { }; ``` +### C +```c +#define max(a, b) (((a) > (b)) ? (a) : (b)) + +bool canJump(int* nums, int numsSize){ + int cover = 0; + + int i; + // 只可能获取cover范围中的步数,所以i<=cover + for(i = 0; i <= cover; ++i) { + // 更新cover为从i出发能到达的最大值/cover的值中较大值 + cover = max(i + nums[i], cover); + + // 若更新后cover可以到达最后的元素,返回true + if(cover >= numsSize - 1) + return true; + } + + return false; +} +``` + -----------------------
From b73a7da7585b03b42ab51515f5463259ac2e0631 Mon Sep 17 00:00:00 2001 From: Guanzhong Pan Date: Fri, 15 Apr 2022 18:25:41 +0100 Subject: [PATCH 0533/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=201005.K=E6=AC=A1?= =?UTF-8?q?=E5=8F=96=E5=8F=8D=E5=90=8E=E6=9C=80=E5=A4=A7=E5=8C=96=E7=9A=84?= =?UTF-8?q?=E6=95=B0=E7=BB=84=E5=92=8C.md=20C=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...04\346\225\260\347\273\204\345\222\214.md" | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git "a/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" "b/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" index 45f186e2b9..0d122d917b 100644 --- "a/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" +++ "b/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" @@ -211,5 +211,44 @@ var largestSumAfterKNegations = function(nums, k) { }; ``` +### C +```c +#define abs(a) (((a) > 0) ? (a) : (-(a))) + +// 对数组求和 +int sum(int *nums, int numsSize) { + int sum = 0; + + int i; + for(i = 0; i < numsSize; ++i) { + sum += nums[i]; + } + return sum; +} + +int cmp(const void* v1, const void* v2) { + return abs(*(int*)v2) - abs(*(int*)v1); +} + +int largestSumAfterKNegations(int* nums, int numsSize, int k){ + qsort(nums, numsSize, sizeof(int), cmp); + + int i; + for(i = 0; i < numsSize; ++i) { + // 遍历数组,若当前元素<0则将当前元素转变,k-- + if(nums[i] < 0 && k > 0) { + nums[i] *= -1; + --k; + } + } + + // 若遍历完数组后k还有剩余(此时所有元素应均为正),则将绝对值最小的元素nums[numsSize - 1]变为负 + if(k % 2 == 1) + nums[numsSize - 1] *= -1; + + return sum(nums, numsSize); +} +``` + -----------------------
From 7c26aba0e1d9ba38a631eb5dbae8577890deb2d2 Mon Sep 17 00:00:00 2001 From: Falldio <1031249495@qq.com> Date: Sun, 17 Apr 2022 11:59:30 +0800 Subject: [PATCH 0534/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880209.?= =?UTF-8?q?=E9=95=BF=E5=BA=A6=E6=9C=80=E5=B0=8F=E7=9A=84=E5=AD=90=E6=95=B0?= =?UTF-8?q?=E7=BB=84.md=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0Kotlin=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...04\345\255\220\346\225\260\347\273\204.md" | 31 ++++++++++++++++--- 1 file changed, 26 insertions(+), 5 deletions(-) diff --git "a/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" "b/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" index 82a1138183..fd72cf1b3a 100644 --- "a/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" +++ "b/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" @@ -198,7 +198,7 @@ JavaScript: var minSubArrayLen = function(target, nums) { // 长度计算一次 const len = nums.length; - let l = r = sum = 0, + let l = r = sum = 0, res = len + 1; // 子数组最大不会超过自身 while(r < len) { sum += nums[r++]; @@ -260,12 +260,12 @@ Rust: ```rust impl Solution { - pub fn min_sub_array_len(target: i32, nums: Vec) -> i32 { + pub fn min_sub_array_len(target: i32, nums: Vec) -> i32 { let (mut result, mut subLength): (i32, i32) = (i32::MAX, 0); let (mut sum, mut i) = (0, 0); - + for (pos, val) in nums.iter().enumerate() { - sum += val; + sum += val; while sum >= target { subLength = (pos - i + 1) as i32; if result > subLength { @@ -364,7 +364,7 @@ int minSubArrayLen(int target, int* nums, int numsSize){ int minLength = INT_MAX; int sum = 0; - int left = 0, right = 0; + int left = 0, right = 0; //右边界向右扩展 for(; right < numsSize; ++right) { sum += nums[right]; @@ -380,5 +380,26 @@ int minSubArrayLen(int target, int* nums, int numsSize){ } ``` +Kotlin: +```kotlin +class Solution { + fun minSubArrayLen(target: Int, nums: IntArray): Int { + var start = 0 + var end = 0 + var ret = Int.MAX_VALUE + var count = 0 + while (end < nums.size) { + count += nums[end] + while (count >= target) { + ret = if (ret > (end - start + 1)) end - start + 1 else ret + count -= nums[start++] + } + end++ + } + return if (ret == Int.MAX_VALUE) 0 else ret + } +} +``` + -----------------------
From 0375a5b147c40a449c04ef7f988dfcb2d93b9e01 Mon Sep 17 00:00:00 2001 From: Guacker <92098421+Guacker@users.noreply.github.com> Date: Sun, 17 Apr 2022 17:19:00 +0800 Subject: [PATCH 0535/3019] =?UTF-8?q?Update=20=E4=BA=8C=E5=8F=89=E6=A0=91?= =?UTF-8?q?=E7=9A=84=E9=80=92=E5=BD=92=E9=81=8D=E5=8E=86.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修改了c语言实现的先序遍历函数名 和内部调用时用的函数名 及在preorderTraversal中的调用先序遍历操作的函数名 --- ...04\351\200\222\345\275\222\351\201\215\345\216\206.md" | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" index 35d19d7b4a..612f2394f9 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" @@ -371,18 +371,18 @@ C: ```c //前序遍历: -void preOrderTraversal(struct TreeNode* root, int* ret, int* returnSize) { +void preOrder(struct TreeNode* root, int* ret, int* returnSize) { if(root == NULL) return; ret[(*returnSize)++] = root->val; - preOrderTraverse(root->left, ret, returnSize); - preOrderTraverse(root->right, ret, returnSize); + preOrder(root->left, ret, returnSize); + preOrder(root->right, ret, returnSize); } int* preorderTraversal(struct TreeNode* root, int* returnSize){ int* ret = (int*)malloc(sizeof(int) * 100); *returnSize = 0; - preOrderTraversal(root, ret, returnSize); + preOrder(root, ret, returnSize); return ret; } From db84840986aab5ce791230eba963084bf1d5ba4b Mon Sep 17 00:00:00 2001 From: GitHubQAQ <31883473+GitHubQAQ@users.noreply.github.com> Date: Tue, 19 Apr 2022 14:23:08 +0800 Subject: [PATCH 0536/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=A2=84=E5=88=A4?= =?UTF-8?q?=E6=96=AD=E9=95=BF=E5=BA=A6=E7=9A=84=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 在magazine中字符存入数组前,预先判断ransomNote和magazine的相对长度,进行处理。 --- "problems/0383.\350\265\216\351\207\221\344\277\241.md" | 4 ++++ 1 file changed, 4 insertions(+) diff --git "a/problems/0383.\350\265\216\351\207\221\344\277\241.md" "b/problems/0383.\350\265\216\351\207\221\344\277\241.md" index 0070734779..5d9e8295c6 100644 --- "a/problems/0383.\350\265\216\351\207\221\344\277\241.md" +++ "b/problems/0383.\350\265\216\351\207\221\344\277\241.md" @@ -84,6 +84,10 @@ class Solution { public: bool canConstruct(string ransomNote, string magazine) { int record[26] = {0}; + //add + if (ransomNote.size() > magazine.size()) { + return false; + } for (int i = 0; i < magazine.length(); i++) { // 通过recode数据记录 magazine里各个字符出现次数 record[magazine[i]-'a'] ++; From 68e47dc4b30ffe38d1a26bb5104614f2f1cc067a Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Tue, 19 Apr 2022 17:10:20 +0800 Subject: [PATCH 0537/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880452.?= =?UTF-8?q?=E7=94=A8=E6=9C=80=E5=B0=91=E6=95=B0=E9=87=8F=E7=9A=84=E7=AE=AD?= =?UTF-8?q?=E5=BC=95=E7=88=86=E6=B0=94=E7=90=83.md=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...25\347\210\206\346\260\224\347\220\203.md" | 26 ++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git "a/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" "b/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" index 33bbad5538..2ab14b612b 100644 --- "a/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" +++ "b/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" @@ -193,7 +193,7 @@ func min(a,b int) int{ } return a } -``` +``` ### Javascript ```Javascript @@ -214,7 +214,31 @@ var findMinArrowShots = function(points) { }; ``` +### TypeScript + +```typescript +function findMinArrowShots(points: number[][]): number { + const length: number = points.length; + if (length === 0) return 0; + points.sort((a, b) => a[0] - b[0]); + let resCount: number = 1; + let right: number = points[0][1]; // 右边界 + let tempPoint: number[]; + for (let i = 1; i < length; i++) { + tempPoint = points[i]; + if (tempPoint[0] > right) { + resCount++; + right = tempPoint[1]; + } else { + right = Math.min(right, tempPoint[1]); + } + } + return resCount; +}; +``` + ### C + ```c int cmp(const void *a,const void *b) { From 84f41f6685e744b138890cf7143ed3069a02a78e Mon Sep 17 00:00:00 2001 From: Guanzhong Pan Date: Tue, 19 Apr 2022 17:00:17 +0100 Subject: [PATCH 0538/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200135.=E5=88=86?= =?UTF-8?q?=E5=8F=91=E7=B3=96=E6=9E=9C.md=20C=E8=AF=AD=E8=A8=80=E8=A7=A3?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...06\345\217\221\347\263\226\346\236\234.md" | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git "a/problems/0135.\345\210\206\345\217\221\347\263\226\346\236\234.md" "b/problems/0135.\345\210\206\345\217\221\347\263\226\346\236\234.md" index ccdabc16b4..27071aee20 100644 --- "a/problems/0135.\345\210\206\345\217\221\347\263\226\346\236\234.md" +++ "b/problems/0135.\345\210\206\345\217\221\347\263\226\346\236\234.md" @@ -238,6 +238,47 @@ var candy = function(ratings) { }; ``` +### C +```c +#define max(a, b) (((a) > (b)) ? (a) : (b)) + +int *initCandyArr(int size) { + int *candyArr = (int*)malloc(sizeof(int) * size); + + int i; + for(i = 0; i < size; ++i) + candyArr[i] = 1; + + return candyArr; +} + +int candy(int* ratings, int ratingsSize){ + // 初始化数组,每个小孩开始至少有一颗糖 + int *candyArr = initCandyArr(ratingsSize); + + int i; + // 先判断右边是否比左边评分高。若是,右边孩子的糖果为左边孩子+1(candyArr[i] = candyArr[i - 1] + 1) + for(i = 1; i < ratingsSize; ++i) { + if(ratings[i] > ratings[i - 1]) + candyArr[i] = candyArr[i - 1] + 1; + } + + // 再判断左边评分是否比右边高。 + // 若是,左边孩子糖果为右边孩子糖果+1/自己所持糖果最大值。(若糖果已经比右孩子+1多,则不需要更多糖果) + // 举例:ratings为[1, 2, 3, 1]。此时评分为3的孩子在判断右边比左边大后为3,虽然它比最末尾的1(ratings[3])大,但是candyArr[3]为1。所以不必更新candyArr[2] + for(i = ratingsSize - 2; i >= 0; --i) { + if(ratings[i] > ratings[i + 1]) + candyArr[i] = max(candyArr[i], candyArr[i + 1] + 1); + } + + // 求出糖果之和 + int result = 0; + for(i = 0; i < ratingsSize; ++i) { + result += candyArr[i]; + } + return result; +} +``` -----------------------
From f9146a3b98fd46ca548c8852bf3b7df0625cfe72 Mon Sep 17 00:00:00 2001 From: zhenghao <1650937065@qq.com> Date: Wed, 20 Apr 2022 10:23:18 +0800 Subject: [PATCH 0539/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B00435=20=E6=97=A0?= =?UTF-8?q?=E9=87=8D=E5=8F=A0=E5=8C=BA=E9=97=B4=20java=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E5=8F=B3=E8=BE=B9=E7=95=8C=E8=A7=A3=E6=B3=95=E4=B8=AD=E6=8E=92?= =?UTF-8?q?=E5=BA=8F=E7=9A=84=E5=88=A4=E6=96=AD=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...7\240\351\207\215\345\217\240\345\214\272\351\227\264.md" | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git "a/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" "b/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" index b24ca0246d..cf58b9e2a9 100644 --- "a/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" +++ "b/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" @@ -184,13 +184,14 @@ public: class Solution { public int eraseOverlapIntervals(int[][] intervals) { Arrays.sort(intervals, (a, b) -> { - if (a[0] == a[0]) return a[1] - b[1]; - return a[0] - b[0]; + // 按照区间右边界升序排序 + return a[1] - b[1]; }); int count = 0; int edge = Integer.MIN_VALUE; for (int i = 0; i < intervals.length; i++) { + // 若上一个区间的右边界小于当前区间的左边界,说明无交集 if (edge <= intervals[i][0]) { edge = intervals[i][1]; } else { From b5f11af3edc66af674d486ace76cde8a99637170 Mon Sep 17 00:00:00 2001 From: zhenyu <48195906+szluyu99@users.noreply.github.com> Date: Wed, 20 Apr 2022 23:56:20 +0800 Subject: [PATCH 0540/3019] =?UTF-8?q?Update=20=E8=83=8C=E5=8C=85=E9=97=AE?= =?UTF-8?q?=E9=A2=98=E7=90=86=E8=AE=BA=E5=9F=BA=E7=A1=80=E5=AE=8C=E5=85=A8?= =?UTF-8?q?=E8=83=8C=E5=8C=85.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" index faa1dc46e2..3ec399f16e 100644 --- "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" +++ "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" @@ -37,7 +37,7 @@ * [动态规划:关于01背包问题,你该了解这些!(滚动数组)](https://programmercarl.com/背包理论基础01背包-2.html) 首先在回顾一下01背包的核心代码 -``` +```cpp for(int i = 0; i < weight.size(); i++) { // 遍历物品 for(int j = bagWeight; j >= weight[i]; j--) { // 遍历背包容量 dp[j] = max(dp[j], dp[j - weight[i]] + value[i]); From 4154d3db2eadecdddaba45d09f09bfe16c0cc594 Mon Sep 17 00:00:00 2001 From: 243wresfdxvc Date: Thu, 21 Apr 2022 09:55:19 +0000 Subject: [PATCH 0541/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200134.=20?= =?UTF-8?q?=E5=8A=A0=E6=B2=B9=E7=AB=99.md=20C=E8=AF=AD=E8=A8=80=E8=B4=AA?= =?UTF-8?q?=E5=BF=83=E8=A7=A3=E6=B3=95=E6=96=B9=E6=B3=95=E4=BA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...4.\345\212\240\346\262\271\347\253\231.md" | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git "a/problems/0134.\345\212\240\346\262\271\347\253\231.md" "b/problems/0134.\345\212\240\346\262\271\347\253\231.md" index ca95af6764..45e05fedc9 100644 --- "a/problems/0134.\345\212\240\346\262\271\347\253\231.md" +++ "b/problems/0134.\345\212\240\346\262\271\347\253\231.md" @@ -341,6 +341,7 @@ var canCompleteCircuit = function(gas, cost) { ``` ### C +贪心算法:方法一 ```c int canCompleteCircuit(int* gas, int gasSize, int* cost, int costSize){ int curSum = 0; @@ -370,5 +371,36 @@ int canCompleteCircuit(int* gas, int gasSize, int* cost, int costSize){ } ``` +贪心算法:方法二 +```c +int canCompleteCircuit(int* gas, int gasSize, int* cost, int costSize){ + int curSum = 0; + int totalSum = 0; + int start = 0; + + int i; + for(i = 0; i < gasSize; ++i) { + // 当前i站中加油量与耗油量的差 + int diff = gas[i] - cost[i]; + + curSum += diff; + totalSum += diff; + + // 若0到i的加油量都为负,则开始位置应为i+1 + if(curSum < 0) { + curSum = 0; + // 当i + 1 == gasSize时,totalSum < 0(此时i为gasSize - 1),油车不可能返回原点 + start = i + 1; + } + } + + // 若总和小于0,加油车无论如何都无法返回原点。返回-1 + if(totalSum < 0) + return -1; + + return start; +} +``` + -----------------------
From be07599474b87bf7dba3e97107b19435a304e5e7 Mon Sep 17 00:00:00 2001 From: berserk-112 <40333359+berserk-112@users.noreply.github.com> Date: Fri, 22 Apr 2022 09:16:34 +0800 Subject: [PATCH 0542/3019] =?UTF-8?q?Update=200309.=E6=9C=80=E4=BD=B3?= =?UTF-8?q?=E4=B9=B0=E5=8D=96=E8=82=A1=E7=A5=A8=E6=97=B6=E6=9C=BA=E5=90=AB?= =?UTF-8?q?=E5=86=B7=E5=86=BB=E6=9C=9F.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...34\272\345\220\253\345\206\267\345\206\273\346\234\237.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" "b/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" index 53caa46e7a..8bd2fcf84c 100644 --- "a/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" +++ "b/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" @@ -214,8 +214,8 @@ class Solution { for (int i = 2; i <= prices.length; i++) { /* - dp[i][0] 第i天未持有股票收益; - dp[i][1] 第i天持有股票收益; + dp[i][0] 第i天持有股票收益; + dp[i][1] 第i天不持有股票收益; 情况一:第i天是冷静期,不能以dp[i-1][1]购买股票,所以以dp[i - 2][1]买股票,没问题 情况二:第i天不是冷静期,理论上应该以dp[i-1][1]购买股票,但是第i天不是冷静期说明,第i-1天没有卖出股票, 则dp[i-1][1]=dp[i-2][1],所以可以用dp[i-2][1]买股票,没问题 From c3f746a25d81c299ca8a3efa4fc1f9e8d45509d3 Mon Sep 17 00:00:00 2001 From: qyg <1600314850@qq.com> Date: Fri, 22 Apr 2022 10:55:01 +0800 Subject: [PATCH 0543/3019] =?UTF-8?q?0209.=E9=95=BF=E5=BA=A6=E6=9C=80?= =?UTF-8?q?=E5=B0=8F=E7=9A=84=E5=AD=90=E6=95=B0=E7=BB=84=EF=BC=9A=E8=B0=83?= =?UTF-8?q?=E6=95=B4=E7=AC=94=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" "b/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" index 82a1138183..23b27edd13 100644 --- "a/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" +++ "b/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" @@ -112,7 +112,7 @@ public: **一些录友会疑惑为什么时间复杂度是O(n)**。 -不要以为for里放一个while就以为是O(n^2)啊, 主要是看每一个元素被操作的次数,每个元素在滑动窗后进来操作一次,出去操作一次,每个元素都是被被操作两次,所以时间复杂度是 2 × n 也就是O(n)。 +不要以为for里放一个while就以为是O(n^2)啊, 主要是看每一个元素被操作的次数,每个元素在滑动窗后进来操作一次,出去操作一次,每个元素都是被操作两次,所以时间复杂度是 2 × n 也就是O(n)。 ## 相关题目推荐 From 4d668b0efc89cd15f50dcb93da01e1ace633b07b Mon Sep 17 00:00:00 2001 From: qyg <1600314850@qq.com> Date: Fri, 22 Apr 2022 11:02:11 +0800 Subject: [PATCH 0544/3019] =?UTF-8?q?0059.=E8=9E=BA=E6=97=8B=E7=9F=A9?= =?UTF-8?q?=E9=98=B5II=EF=BC=9A=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 --- ...9.\350\236\272\346\227\213\347\237\251\351\230\265II.md" | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git "a/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" "b/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" index 5c679982ce..1162c7ebb6 100644 --- "a/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" +++ "b/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" @@ -30,7 +30,7 @@ 相信很多同学刚开始做这种题目的时候,上来就是一波判断猛如虎。 -结果运行的时候各种问题,然后开始各种修修补补,最后发现改了这里哪里有问题,改了那里这里又跑不起来了。 +结果运行的时候各种问题,然后开始各种修修补补,最后发现改了这里那里有问题,改了那里这里又跑不起来了。 大家还记得我们在这篇文章[数组:每次遇到二分法,都是一看就会,一写就废](https://programmercarl.com/0704.二分查找.html)中讲解了二分法,提到如果要写出正确的二分法一定要坚持**循环不变量原则**。 @@ -47,7 +47,7 @@ 可以发现这里的边界条件非常多,在一个循环中,如此多的边界条件,如果不按照固定规则来遍历,那就是**一进循环深似海,从此offer是路人**。 -这里一圈下来,我们要画每四条边,这四条边怎么画,每画一条边都要坚持一致的左闭右开,或者左开又闭的原则,这样这一圈才能按照统一的规则画下来。 +这里一圈下来,我们要画每四条边,这四条边怎么画,每画一条边都要坚持一致的左闭右开,或者左开右闭的原则,这样这一圈才能按照统一的规则画下来。 那么我按照左闭右开的原则,来画一圈,大家看一下: @@ -59,7 +59,7 @@ 一些同学做这道题目之所以一直写不好,代码越写越乱。 -就是因为在画每一条边的时候,一会左开又闭,一会左闭右闭,一会又来左闭右开,岂能不乱。 +就是因为在画每一条边的时候,一会左开右闭,一会左闭右闭,一会又来左闭右开,岂能不乱。 代码如下,已经详细注释了每一步的目的,可以看出while循环里判断的情况是很多的,代码里处理的原则也是统一的左闭右开。 From 664746fe155a137f01c5d1478b0325c2dd8e0ffe Mon Sep 17 00:00:00 2001 From: qyg <1600314850@qq.com> Date: Fri, 22 Apr 2022 11:21:18 +0800 Subject: [PATCH 0545/3019] =?UTF-8?q?=E6=95=B0=E7=BB=84=E6=80=BB=E7=BB=93?= =?UTF-8?q?=E7=AF=87=EF=BC=9A=E8=B0=83=E6=95=B4=E7=AC=94=E8=AF=AF=EF=BC=8C?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BA=8C=E7=BB=B4=E6=95=B0=E7=BB=84=E7=9A=84?= =?UTF-8?q?=E5=86=85=E5=AE=B9=E6=98=AF=E9=92=88=E5=AF=B9Java=E8=AF=AD?= =?UTF-8?q?=E8=A8=80=E7=9A=84=E9=99=90=E5=AE=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...60\347\273\204\346\200\273\347\273\223\347\257\207.md" | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git "a/problems/\346\225\260\347\273\204\346\200\273\347\273\223\347\257\207.md" "b/problems/\346\225\260\347\273\204\346\200\273\347\273\223\347\257\207.md" index d256298b9a..39fa17a61d 100644 --- "a/problems/\346\225\260\347\273\204\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/\346\225\260\347\273\204\346\200\273\347\273\223\347\257\207.md" @@ -43,19 +43,19 @@ **那么二维数组在内存的空间地址是连续的么?** -我们来举一个例子,例如: `int[][] rating = new int[3][4];` , 这个二维数据在内存空间可不是一个 `3*4` 的连续地址空间 +我们来举一个Java的例子,例如: `int[][] rating = new int[3][4];` , 这个二维数组在内存空间可不是一个 `3*4` 的连续地址空间 看了下图,就应该明白了: -所以**二维数据在内存中不是 `3*4` 的连续地址空间,而是四条连续的地址空间组成!** +所以**Java的二维数组在内存中不是 `3*4` 的连续地址空间,而是四条连续的地址空间组成!** # 数组的经典题目 在面试中,数组是必考的基础数据结构。 -其实数据的题目在思想上一般比较简单的,但是如果想高效,并不容易。 +其实数组的题目在思想上一般比较简单的,但是如果想高效,并不容易。 我们之前一共讲解了四道经典数组题目,每一道题目都代表一个类型,一种思想。 @@ -115,7 +115,7 @@ 在这道题目中,我们再一次介绍到了**循环不变量原则**,其实这也是写程序中的重要原则。 -相信大家又遇到过这种情况: 感觉题目的边界调节超多,一波接着一波的判断,找边界,踩了东墙补西墙,好不容易运行通过了,代码写的十分冗余,毫无章法,其实**真正解决题目的代码都是简洁的,或者有原则性的**,大家可以在这道题目中体会到这一点。 +相信大家有遇到过这种情况: 感觉题目的边界调节超多,一波接着一波的判断,找边界,拆了东墙补西墙,好不容易运行通过了,代码写的十分冗余,毫无章法,其实**真正解决题目的代码都是简洁的,或者有原则性的**,大家可以在这道题目中体会到这一点。 # 总结 From 074937378aad536271afd42fdb5cc27a1f193f7f Mon Sep 17 00:00:00 2001 From: qyg <1600314850@qq.com> Date: Fri, 22 Apr 2022 11:42:50 +0800 Subject: [PATCH 0546/3019] =?UTF-8?q?=E9=93=BE=E8=A1=A8=E7=90=86=E8=AE=BA?= =?UTF-8?q?=E5=9F=BA=E7=A1=80=EF=BC=9A=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 --- ...41\250\347\220\206\350\256\272\345\237\272\347\241\200.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/problems/\351\223\276\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\351\223\276\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" index 095282f54f..2fe9f14c7a 100644 --- "a/problems/\351\223\276\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\351\223\276\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -24,7 +24,7 @@ ## 双链表 -单链表中的节点只能指向节点的下一个节点。 +单链表中的指针域只能指向节点的下一个节点。 双链表:每一个节点有两个指针域,一个指向下一个节点,一个指向上一个节点。 @@ -56,7 +56,7 @@ ![链表3](https://img-blog.csdnimg.cn/20200806194613920.png) -这个链表起始节点为2, 终止节点为7, 各个节点分布在内存个不同地址空间上,通过指针串联在一起。 +这个链表起始节点为2, 终止节点为7, 各个节点分布在内存的不同地址空间上,通过指针串联在一起。 # 链表的定义 From be4051893888427b41b172135b21add3fa096579 Mon Sep 17 00:00:00 2001 From: Jamcy123 <1219502823@qq.com> Date: Fri, 22 Apr 2022 15:34:06 +0800 Subject: [PATCH 0547/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=201047.=20?= =?UTF-8?q?=E5=88=A0=E9=99=A4=E5=AD=97=E7=AC=A6=E4=B8=B2=E4=B8=AD=E7=9A=84?= =?UTF-8?q?=E6=89=80=E6=9C=89=E7=9B=B8=E9=82=BB=E9=87=8D=E5=A4=8D=E9=A1=B9?= =?UTF-8?q?=20=E5=8F=8C=E6=8C=87=E9=92=88=E8=A7=A3=E6=B3=95=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 --- ...73\351\207\215\345\244\215\351\241\271.md" | 25 ++++++++++++++++--- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git "a/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" "b/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" index 54455f6273..638c8f4ed2 100644 --- "a/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" +++ "b/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" @@ -250,11 +250,9 @@ func removeDuplicates(s string) string { javaScript: +法一:使用栈 + ```js -/** - * @param {string} s - * @return {string} - */ var removeDuplicates = function(s) { const stack = []; for(const x of s) { @@ -267,6 +265,25 @@ var removeDuplicates = function(s) { }; ``` +法二:双指针(模拟栈) + +```js +// 原地解法(双指针模拟栈) +var removeDuplicates = function(s) { + s = [...s]; + let top = -1; // 指向栈顶元素的下标 + for(let i = 0; i < s.length; i++) { + if(top === -1 || s[top] !== s[i]) { // top === -1 即空栈 + s[++top] = s[i]; // 入栈 + } else { + top--; // 推出栈 + } + } + s.length = top + 1; // 栈顶元素下标 + 1 为栈的长度 + return s.join(''); +}; +``` + TypeScript: ```typescript From 5a7e247e5f5a70c1e33dfce4cc42b498cc031f61 Mon Sep 17 00:00:00 2001 From: ChubbyPan Date: Fri, 22 Apr 2022 07:59:32 +0000 Subject: [PATCH 0548/3019] update build binary tree in ACM pattern with python --- ...72\344\272\214\345\217\211\346\240\221.md" | 56 ++++++++++++++++++- 1 file changed, 55 insertions(+), 1 deletion(-) diff --git "a/problems/\345\211\215\345\272\217/ACM\346\250\241\345\274\217\345\246\202\344\275\225\346\236\204\345\273\272\344\272\214\345\217\211\346\240\221.md" "b/problems/\345\211\215\345\272\217/ACM\346\250\241\345\274\217\345\246\202\344\275\225\346\236\204\345\273\272\344\272\214\345\217\211\346\240\221.md" index bd2e978046..f6ec2dd3f9 100644 --- "a/problems/\345\211\215\345\272\217/ACM\346\250\241\345\274\217\345\246\202\344\275\225\346\236\204\345\273\272\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/\345\211\215\345\272\217/ACM\346\250\241\345\274\217\345\246\202\344\275\225\346\236\204\345\273\272\344\272\214\345\217\211\346\240\221.md" @@ -213,7 +213,61 @@ int main() { ## Python -```Python +```Python3 +class TreeNode: + def __init__(self, val = 0, left = None, right = None): + self.val = val + self.left = left + self.right = right + + +# 根据数组构建二叉树 + +def construct_binary_tree(nums: []) -> TreeNode: + if not nums: + return None + # 用于存放构建好的节点 + root = TreeNode(-1) + Tree = [] + # 将数组元素全部转化为树节点 + for i in range(len(nums)): + if nums[i]!= -1: + node = TreeNode(nums[i]) + else: + node = None + Tree.append(node) + if i == 0: + root = node + for i in range(len(Tree)): + node = Tree[i] + if node and (2 * i + 2) < len(Tree): + node.left = Tree[i * 2 + 1] + node.right = Tree[i * 2 + 2] + return root + + + +# 算法:中序遍历二叉树 + +class Solution: + def __init__(self): + self.T = [] + def inorder(self, root: TreeNode) -> []: + if not root: + return + self.inorder(root.left) + self.T.append(root.val) + self.inorder(root.right) + return self.T + + + +# 验证创建二叉树的有效性,二叉排序树的中序遍历应为顺序排列 + +test_tree = [3, 1, 5, -1, 2, 4 ,6] +root = construct_binary_tree(test_tree) +A = Solution() +print(A.inorder(root)) ``` From a0c16d48cb851b3c118cf3da0900797be767f9d0 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Sat, 23 Apr 2022 18:19:36 +0800 Subject: [PATCH 0549/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880435.?= =?UTF-8?q?=E6=97=A0=E9=87=8D=E5=8F=A0=E5=8C=BA=E9=97=B4.md=EF=BC=89?= =?UTF-8?q?=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...15\345\217\240\345\214\272\351\227\264.md" | 51 ++++++++++++++++++- 1 file changed, 50 insertions(+), 1 deletion(-) diff --git "a/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" "b/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" index b24ca0246d..c7f755bf33 100644 --- "a/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" +++ "b/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" @@ -263,7 +263,7 @@ func min(a,b int)int{ } return a } -``` +``` ### Javascript: - 按右边界排序 @@ -306,6 +306,55 @@ var eraseOverlapIntervals = function(intervals) { } ``` +### TypeScript + +> 按右边界排序,从左往右遍历 + +```typescript +function eraseOverlapIntervals(intervals: number[][]): number { + const length = intervals.length; + if (length === 0) return 0; + intervals.sort((a, b) => a[1] - b[1]); + let right: number = intervals[0][1]; + let count: number = 1; + for (let i = 1; i < length; i++) { + if (intervals[i][0] >= right) { + count++; + right = intervals[i][1]; + } + } + return length - count; +}; +``` + +> 按左边界排序,从左往右遍历 + +```typescript +function eraseOverlapIntervals(intervals: number[][]): number { + if (intervals.length === 0) return 0; + intervals.sort((a, b) => a[0] - b[0]); + let right: number = intervals[0][1]; + let tempInterval: number[]; + let resCount: number = 0; + for (let i = 1, length = intervals.length; i < length; i++) { + tempInterval = intervals[i]; + if (tempInterval[0] >= right) { + // 未重叠 + right = tempInterval[1]; + } else { + // 有重叠,移除当前interval和前一个interval中右边界更大的那个 + right = Math.min(right, tempInterval[1]); + resCount++; + } + } + return resCount; +}; +``` + + + + + -----------------------
From 7c752afaf472f8e3056d9bfefd9628548cbec5d8 Mon Sep 17 00:00:00 2001 From: h4 <20080114+tan-i-ham@users.noreply.github.com> Date: Sat, 23 Apr 2022 22:19:09 +0900 Subject: [PATCH 0550/3019] chore: Sync 150 markdown render format --- ...41\250\350\276\276\345\274\217\346\261\202\345\200\274.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" "b/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" index f4dad8231a..fd3d69aa33 100644 --- "a/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" +++ "b/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" @@ -109,7 +109,7 @@ public: }; ``` -# 题外话 +## 题外话 我们习惯看到的表达式都是中缀表达式,因为符合我们的习惯,但是中缀表达式对于计算机来说就不是很友好了。 @@ -128,7 +128,7 @@ public: -# 其他语言版本 +## 其他语言版本 java: From 531c1b0a3bfac9867a8403baaf95a6cd284f6a41 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Sat, 23 Apr 2022 21:19:23 +0800 Subject: [PATCH 0551/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880763.?= =?UTF-8?q?=E5=88=92=E5=88=86=E5=AD=97=E6=AF=8D=E5=8C=BA=E9=97=B4.md?= =?UTF-8?q?=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...27\346\257\215\345\214\272\351\227\264.md" | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git "a/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" "b/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" index 03d3a73b3b..901dccb4b8 100644 --- "a/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" +++ "b/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" @@ -174,6 +174,31 @@ var partitionLabels = function(s) { }; ``` +### TypeScript + +```typescript +function partitionLabels(s: string): number[] { + const length: number = s.length; + const resArr: number[] = []; + const helperMap: Map = new Map(); + for (let i = 0; i < length; i++) { + helperMap.set(s[i], i); + } + let left: number = 0; + let right: number = 0; + for (let i = 0; i < length; i++) { + right = Math.max(helperMap.get(s[i])!, right); + if (i === right) { + resArr.push(i - left + 1); + left = i + 1; + } + } + return resArr; +}; +``` + + + -----------------------
From 8966752197c174e46052ab549495a045ce1a5f14 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Sat, 23 Apr 2022 21:44:11 +0800 Subject: [PATCH 0552/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880056.?= =?UTF-8?q?=E5=90=88=E5=B9=B6=E5=8C=BA=E9=97=B4.md=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...10\345\271\266\345\214\272\351\227\264.md" | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git "a/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" "b/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" index a9caeaf057..b44d602c5c 100644 --- "a/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" +++ "b/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" @@ -266,6 +266,26 @@ var merge = function(intervals) { }; ``` +### TypeScript + +```typescript +function merge(intervals: number[][]): number[][] { + const resArr: number[][] = []; + intervals.sort((a, b) => a[0] - b[0]); + resArr[0] = [...intervals[0]]; // 避免修改原intervals + for (let i = 1, length = intervals.length; i < length; i++) { + let interval: number[] = intervals[i]; + let last: number[] = resArr[resArr.length - 1]; + if (interval[0] <= last[1]) { + last[1] = Math.max(interval[1], last[1]); + } else { + resArr.push([...intervals[i]]); + } + } + return resArr; +}; +``` + ----------------------- From e2807eb59ad5b9e45311544278c905fd942e85b3 Mon Sep 17 00:00:00 2001 From: 243wresfdxvc Date: Sat, 23 Apr 2022 16:15:53 +0000 Subject: [PATCH 0553/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200203.=E7=A7=BB?= =?UTF-8?q?=E5=87=BA=E9=93=BE=E8=A1=A8=E5=85=83=E7=B4=A0.md=20C=E8=AF=AD?= =?UTF-8?q?=E8=A8=80=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...76\350\241\250\345\205\203\347\264\240.md" | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git "a/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" "b/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" index c34831b768..751553e26f 100644 --- "a/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" +++ "b/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" @@ -145,6 +145,38 @@ public: ## 其他语言版本 C: +用原来的链表操作: +```c +struct ListNode* removeElements(struct ListNode* head, int val){ + struct ListNode* temp; + // 当头结点存在并且头结点的值等于val时 + while(head && head->val == val) { + temp = head; + // 将新的头结点设置为head->next并删除原来的头结点 + head = head->next; + free(temp); + } + + struct ListNode *cur = head; + // 当cur存在并且cur->next存在时 + // 此解法需要判断cur存在因为cur指向head。若head本身为NULL或者原链表中元素都为val的话,cur也会为NULL + while(cur && (temp = cur->next)) { + // 若cur->next的值等于val + if(temp->val == val) { + // 将cur->next设置为cur->next->next并删除cur->next + cur->next = temp->next; + free(temp); + } + // 若cur->next不等于val,则将cur后移一位 + else + cur = cur->next; + } + + // 返回头结点 + return head; +} +``` +设置一个虚拟头结点: ```c /** * Definition for singly-linked list. From 7cf68bd1f2eaa6ad83d69b969f29b1b146397dfa Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Sun, 24 Apr 2022 17:40:23 +0800 Subject: [PATCH 0554/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880738.?= =?UTF-8?q?=E5=8D=95=E8=B0=83=E9=80=92=E5=A2=9E=E7=9A=84=E6=95=B0=E5=AD=97?= =?UTF-8?q?.md=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...36\347\232\204\346\225\260\345\255\227.md" | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git "a/problems/0738.\345\215\225\350\260\203\351\200\222\345\242\236\347\232\204\346\225\260\345\255\227.md" "b/problems/0738.\345\215\225\350\260\203\351\200\222\345\242\236\347\232\204\346\225\260\345\255\227.md" index c8ce8a2b9a..4e4079a76e 100644 --- "a/problems/0738.\345\215\225\350\260\203\351\200\222\345\242\236\347\232\204\346\225\260\345\255\227.md" +++ "b/problems/0738.\345\215\225\350\260\203\351\200\222\345\242\236\347\232\204\346\225\260\345\255\227.md" @@ -225,6 +225,28 @@ var monotoneIncreasingDigits = function(n) { }; ``` +### TypeScript + +```typescript +function monotoneIncreasingDigits(n: number): number { + let strArr: number[] = String(n).split('').map(i => parseInt(i)); + const length = strArr.length; + let flag: number = length; + for (let i = length - 2; i >= 0; i--) { + if (strArr[i] > strArr[i + 1]) { + strArr[i] -= 1; + flag = i + 1; + } + } + for (let i = flag; i < length; i++) { + strArr[i] = 9; + } + return parseInt(strArr.join('')); +}; +``` + + + -----------------------
From d5f21d534198069fee0dd4a90397d1322d435179 Mon Sep 17 00:00:00 2001 From: eat to 160 pounds <2915390277@qq.com> Date: Sun, 24 Apr 2022 21:05:31 +0800 Subject: [PATCH 0555/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E4=BA=86=E4=B8=89?= =?UTF-8?q?=E6=95=B0=E4=B9=8B=E5=92=8Cjavascript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...11\346\225\260\344\271\213\345\222\214.md" | 70 +++++++------------ 1 file changed, 26 insertions(+), 44 deletions(-) diff --git "a/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" "b/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" index bfde6b3538..cc184c879e 100644 --- "a/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" @@ -313,54 +313,36 @@ func threeSum(nums []int)[][]int{ javaScript: ```js -/** - * @param {number[]} nums - * @return {number[][]} - */ - -// 循环内不考虑去重 -var threeSum = function(nums) { - const len = nums.length; - if(len < 3) return []; - nums.sort((a, b) => a - b); - const resSet = new Set(); - for(let i = 0; i < len - 2; i++) { - if(nums[i] > 0) break; - let l = i + 1, r = len - 1; - while(l < r) { - const sum = nums[i] + nums[l] + nums[r]; - if(sum < 0) { l++; continue }; - if(sum > 0) { r--; continue }; - resSet.add(`${nums[i]},${nums[l]},${nums[r]}`); - l++; - r--; - } - } - return Array.from(resSet).map(i => i.split(",")); -}; - -// 去重优化 var threeSum = function(nums) { - const len = nums.length; - if(len < 3) return []; - nums.sort((a, b) => a - b); - const res = []; - for(let i = 0; i < len - 2; i++) { - if(nums[i] > 0) break; - // a去重 - if(i > 0 && nums[i] === nums[i - 1]) continue; - let l = i + 1, r = len - 1; + const res = [], len = nums.length + // 将数组排序 + nums.sort((a, b) => a - b) + for (let i = 0; i < len; i++) { + let l = i + 1, r = len - 1, iNum = nums[i] + // 数组排过序,如果第一个数大于0直接返回res + if (iNum > 0) return res + // 去重 + if (iNum == nums[i - 1]) continue while(l < r) { - const sum = nums[i] + nums[l] + nums[r]; - if(sum < 0) { l++; continue }; - if(sum > 0) { r--; continue }; - res.push([nums[i], nums[l], nums[r]]) - // b c 去重 - while(l < r && nums[l] === nums[++l]); - while(l < r && nums[r] === nums[--r]); + let lNum = nums[l], rNum = nums[r], threeSum = iNum + lNum + rNum + // 三数之和小于0,则左指针向右移动 + if (threeSum < 0) l++ + else if (threeSum > 0) r-- + else { + res.push([iNum, lNum, rNum]) + // 去重 + while(l < r && nums[l] == nums[l + 1]){ + l++ + } + while(l < r && nums[r] == nums[r - 1]) { + r-- + } + l++ + r-- + } } } - return res; + return res }; ``` TypeScript: From 84750aca45f96f15e4dc271410c32cde78667e41 Mon Sep 17 00:00:00 2001 From: 243wresfdxvc Date: Sun, 24 Apr 2022 18:32:09 +0000 Subject: [PATCH 0556/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200860.=E6=9F=A0?= =?UTF-8?q?=E6=AA=AC=E6=B0=B4=E6=89=BE=E9=9B=B6.md=20C=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 --- ...54\346\260\264\346\211\276\351\233\266.md" | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git "a/problems/0860.\346\237\240\346\252\254\346\260\264\346\211\276\351\233\266.md" "b/problems/0860.\346\237\240\346\252\254\346\260\264\346\211\276\351\233\266.md" index ffd5490d6d..2738f57497 100644 --- "a/problems/0860.\346\237\240\346\252\254\346\260\264\346\211\276\351\233\266.md" +++ "b/problems/0860.\346\237\240\346\252\254\346\260\264\346\211\276\351\233\266.md" @@ -250,6 +250,49 @@ var lemonadeChange = function(bills) { return true }; +``` +### C +```c +bool lemonadeChange(int* bills, int billsSize){ + // 分别记录五元、十元的数量(二十元不用记录,因为不会用到20元找零) + int fiveCount = 0; int tenCount = 0; + + int i; + for(i = 0; i < billsSize; ++i) { + // 分情况讨论每位顾客的付款 + switch(bills[i]) { + // 情况一:直接收款五元 + case 5: + fiveCount++; + break; + // 情况二:收款十元 + case 10: + // 若没有五元找零,返回false + if(fiveCount == 0) + return false; + // 收款十元并找零五元 + fiveCount--; + tenCount++; + break; + // 情况三:收款二十元 + case 20: + // 若可以,优先用十元和五元找零(因为十元只能找零20,所以需要尽量用掉。而5元能找零十元和二十元) + if(fiveCount > 0 && tenCount > 0) { + fiveCount--; + tenCount--; + } + // 若没有十元,但是有三张五元。用三张五元找零 + else if(fiveCount >= 3) + fiveCount-=3; + // 无法找开,返回false + else + return false; + break; + } + } + // 全部可以找开,返回true + return true; +} ``` ----------------------- From 8291e5e1c6d1b9c913a35015848124ad9cfd1808 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Mon, 25 Apr 2022 14:05:53 +0800 Subject: [PATCH 0557/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880714.?= =?UTF-8?q?=E4=B9=B0=E5=8D=96=E8=82=A1=E7=A5=A8=E7=9A=84=E6=9C=80=E4=BD=B3?= =?UTF-8?q?=E6=97=B6=E6=9C=BA=E5=90=AB=E6=89=8B=E7=BB=AD=E8=B4=B9.md?= =?UTF-8?q?=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...53\346\211\213\347\273\255\350\264\271.md" | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git "a/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271.md" "b/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271.md" index 2f27d6eaf5..b27631c68c 100644 --- "a/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271.md" +++ "b/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271.md" @@ -293,6 +293,50 @@ var maxProfit = function(prices, fee) { }; ``` +TypeScript: + +> 贪心 + +```typescript +function maxProfit(prices: number[], fee: number): number { + if (prices.length === 0) return 0; + let minPrice: number = prices[0]; + let profit: number = 0; + for (let i = 1, length = prices.length; i < length; i++) { + if (minPrice > prices[i]) { + minPrice = prices[i]; + } + if (minPrice + fee < prices[i]) { + profit += prices[i] - minPrice - fee; + minPrice = prices[i] - fee; + } + } + return profit; +}; +``` + +> 动态规划 + +```typescript +function maxProfit(prices: number[], fee: number): number { + /** + dp[i][1]: 第i天不持有股票的最大所剩现金 + dp[i][0]: 第i天持有股票的最大所剩现金 + */ + const length: number = prices.length; + const dp: number[][] = new Array(length).fill(0).map(_ => []); + dp[0][1] = 0; + dp[0][0] = -prices[0]; + for (let i = 1, length = prices.length; i < length; i++) { + dp[i][1] = Math.max(dp[i - 1][1], dp[i - 1][0] + prices[i] - fee); + dp[i][0] = Math.max(dp[i - 1][0], dp[i - 1][1] - prices[i]); + } + return Math.max(dp[length - 1][0], dp[length - 1][1]); +}; +``` + + + -----------------------
From 7b45a3209014190bbee02de8df566638701db734 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E4=BD=B3=E4=B9=90?= <1791781644@qq.com> Date: Mon, 25 Apr 2022 22:10:18 +0800 Subject: [PATCH 0558/3019] =?UTF-8?q?=E4=BF=AE=E6=94=B9=20=E7=BB=99?= =?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=A0=91=E9=81=8D=E5=8E=86=E9=A2=98=E7=9B=AE?= =?UTF-8?q?=E5=8A=A0=E4=B8=8A=E5=8A=9B=E6=89=A3=E9=93=BE=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\204\350\277\255\344\273\243\351\201\215\345\216\206.md" | 6 +++--- ...\204\351\200\222\345\275\222\351\201\215\345\216\206.md" | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" index 8164724b31..13ba5f1e71 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" @@ -11,9 +11,9 @@ 看完本篇大家可以使用迭代法,再重新解决如下三道leetcode上的题目: -* 144.二叉树的前序遍历 -* 94.二叉树的中序遍历 -* 145.二叉树的后序遍历 +* [144.二叉树的前序遍历](https://leetcode-cn.com/problems/binary-tree-preorder-traversal/) +* [94.二叉树的中序遍历](https://leetcode-cn.com/problems/binary-tree-inorder-traversal/) +* [145.二叉树的后序遍历](https://leetcode-cn.com/problems/binary-tree-postorder-traversal/) 为什么可以用迭代法(非递归的方式)来实现二叉树的前后中序遍历呢? diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" index 35d19d7b4a..13e704ea94 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" @@ -99,9 +99,9 @@ void traversal(TreeNode* cur, vector& vec) { 此时大家可以做一做leetcode上三道题目,分别是: -* 144.二叉树的前序遍历 -* 145.二叉树的后序遍历 -* 94.二叉树的中序遍历 +* [144.二叉树的前序遍历](https://leetcode-cn.com/problems/binary-tree-preorder-traversal/) +* [145.二叉树的后序遍历](https://leetcode-cn.com/problems/binary-tree-postorder-traversal/) +* [94.二叉树的中序遍历](https://leetcode-cn.com/problems/binary-tree-inorder-traversal/) 可能有同学感觉前后中序遍历的递归太简单了,要打迭代法(非递归),别急,我们明天打迭代法,打个通透! From 9da09584cd39f56c937b5c68b7375ab0d602957b Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Tue, 26 Apr 2022 00:03:54 +0800 Subject: [PATCH 0559/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880968.?= =?UTF-8?q?=E7=9B=91=E6=8E=A7=E4=BA=8C=E5=8F=89=E6=A0=91.md=EF=BC=89?= =?UTF-8?q?=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...47\344\272\214\345\217\211\346\240\221.md" | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git "a/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" "b/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" index 35c3ccdc2b..9a510a1b79 100644 --- "a/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" @@ -476,7 +476,35 @@ var minCameraCover = function(root) { }; ``` +### TypeScript + +```typescript +function minCameraCover(root: TreeNode | null): number { + /** 0-无覆盖, 1-有摄像头, 2-有覆盖 */ + type statusCode = 0 | 1 | 2; + let resCount: number = 0; + if (recur(root) === 0) resCount++; + return resCount; + function recur(node: TreeNode | null): statusCode { + if (node === null) return 2; + const left: statusCode = recur(node.left), + right: statusCode = recur(node.right); + let resStatus: statusCode = 0; + if (left === 0 || right === 0) { + resStatus = 1; + resCount++; + } else if (left === 1 || right === 1) { + resStatus = 2; + } else { + resStatus = 0; + } + return resStatus; + } +}; +``` + ### C + ```c /* **函数后序遍历二叉树。判断一个结点状态时,根据其左右孩子结点的状态进行判断 From 3ec08f41dd08cdd830215bdf2b602bbdcfc92512 Mon Sep 17 00:00:00 2001 From: 243wresfdxvc Date: Mon, 25 Apr 2022 18:18:50 +0000 Subject: [PATCH 0560/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200406.=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?.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 --- ...15\345\273\272\351\230\237\345\210\227.md" | 47 +++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git "a/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" "b/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" index b2354d094c..9cefa11cda 100644 --- "a/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" +++ "b/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" @@ -290,6 +290,53 @@ var reconstructQueue = function(people) { }; ``` +### C +```c +int cmp(const void *p1, const void *p2) { + int *pp1 = *(int**)p1; + int *pp2 = *(int**)p2; + // 若身高相同,则按照k从小到大排列 + // 若身高不同,按身高从大到小排列 + return pp1[0] == pp2[0] ? pp1[1] - pp2[1] : pp2[0] - pp1[0]; +} + +// 将start与end中间的元素都后移一位 +// start为将要新插入元素的位置 +void moveBack(int **people, int peopleSize, int start, int end) { + int i; + for(i = end; i > start; i--) { + people[i] = people[i-1]; + } +} + +int** reconstructQueue(int** people, int peopleSize, int* peopleColSize, int* returnSize, int** returnColumnSizes){ + int i; + // 将people按身高从大到小排列(若身高相同,按k从小到大排列) + qsort(people, peopleSize, sizeof(int*), cmp); + + for(i = 0; i < peopleSize; ++i) { + // people[i]要插入的位置 + int position = people[i][1]; + int *temp = people[i]; + // 将position到i中间的元素后移一位 + // 注:因为已经排好序,position不会比i大。(举例:排序后people最后一位元素最小,其可能的k最大值为peopleSize-2,小于此时的i) + moveBack(people, peopleSize, position, i); + // 将temp放置到position处 + people[position] = temp; + + } + + + // 设置返回二维数组的大小以及里面每个一维数组的长度 + *returnSize = peopleSize; + *returnColumnSizes = (int*)malloc(sizeof(int) * peopleSize); + for(i = 0; i < peopleSize; ++i) { + (*returnColumnSizes)[i] = 2; + } + return people; +} +``` + -----------------------
From fa2e1b097b555f900dce38f01e158634df074817 Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Tue, 26 Apr 2022 10:59:56 +0800 Subject: [PATCH 0561/3019] Update --- ...3\350\241\241\344\272\214\345\217\211\346\240\221.md" | 2 +- ...0\347\273\204\346\200\273\347\273\223\347\257\207.md" | 9 ++++----- ...6\350\241\250\346\200\273\347\273\223\347\257\207.md" | 4 ++++ 3 files changed, 9 insertions(+), 6 deletions(-) diff --git "a/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" "b/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" index 411434d411..d98ff8a90c 100644 --- "a/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" @@ -264,7 +264,7 @@ int getDepth(TreeNode* cur) { } ``` -然后再用栈来模拟前序遍历,遍历每一个节点的时候,再去判断左右孩子的高度是否符合,代码如下: +然后再用栈来模拟后序遍历,遍历每一个节点的时候,再去判断左右孩子的高度是否符合,代码如下: ```CPP bool isBalanced(TreeNode* root) { diff --git "a/problems/\346\225\260\347\273\204\346\200\273\347\273\223\347\257\207.md" "b/problems/\346\225\260\347\273\204\346\200\273\347\273\223\347\257\207.md" index d256298b9a..ef7a487651 100644 --- "a/problems/\346\225\260\347\273\204\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/\346\225\260\347\273\204\346\200\273\347\273\223\347\257\207.md" @@ -120,14 +120,13 @@ # 总结 -从二分法到双指针,从滑动窗口到螺旋矩阵,相信如果大家真的认真做了「代码随想录」每日推荐的题目,定会有所收获。 - -推荐的题目即使大家之前做过了,再读一遍文章,也会帮助你提炼出解题的精髓所在。 +![](https://code-thinking-1253855093.file.myqcloud.com/pics/数组总结.png) -如果感觉有所收获,希望大家多多支持,打卡转发,点赞在看 都是对我最大的鼓励! +这个图是 [代码随想录知识星球](https://programmercarl.com/other/kstar.html) 成员:[海螺人](https://wx.zsxq.com/dweb2/index/footprint/844412858822412),所画,总结的非常好,分享给大家。 -最后,大家周末愉快! +从二分法到双指针,从滑动窗口到螺旋矩阵,相信如果大家真的认真做了「代码随想录」每日推荐的题目,定会有所收获。 +推荐的题目即使大家之前做过了,再读一遍文章,也会帮助你提炼出解题的精髓所在。 -----------------------
diff --git "a/problems/\351\223\276\350\241\250\346\200\273\347\273\223\347\257\207.md" "b/problems/\351\223\276\350\241\250\346\200\273\347\273\223\347\257\207.md" index abbb288e3b..e3fe47401b 100644 --- "a/problems/\351\223\276\350\241\250\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/\351\223\276\350\241\250\346\200\273\347\273\223\347\257\207.md" @@ -76,6 +76,10 @@ ## 总结 +![](https://code-thinking-1253855093.file.myqcloud.com/pics/链表总结.png) + +这个图是 [代码随想录知识星球](https://programmercarl.com/other/kstar.html) 成员:[海螺人](https://wx.zsxq.com/dweb2/index/footprint/844412858822412),所画,总结的非常好,分享给大家。 + 考察链表的操作其实就是考察指针的操作,是面试中的常见类型。 链表篇中开头介绍[链表理论知识](https://programmercarl.com/0203.移除链表元素.html),然后分别通过经典题目介绍了如下知识点: From e15492b0b69ca06d8d90057093237de8767bf784 Mon Sep 17 00:00:00 2001 From: dbcai Date: Tue, 26 Apr 2022 22:08:25 +0800 Subject: [PATCH 0562/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20=E5=89=8D?= =?UTF-8?q?=E5=BA=8F.ACM=E6=A8=A1=E5=BC=8F=E5=A6=82=E4=BD=95=E6=9E=84?= =?UTF-8?q?=E5=BB=BA=E4=BA=8C=E5=8F=89=E6=A0=91.md=20Java=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...72\344\272\214\345\217\211\346\240\221.md" | 53 +++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git "a/problems/\345\211\215\345\272\217/ACM\346\250\241\345\274\217\345\246\202\344\275\225\346\236\204\345\273\272\344\272\214\345\217\211\346\240\221.md" "b/problems/\345\211\215\345\272\217/ACM\346\250\241\345\274\217\345\246\202\344\275\225\346\236\204\345\273\272\344\272\214\345\217\211\346\240\221.md" index 28c4b6f7ae..07674b312c 100644 --- "a/problems/\345\211\215\345\272\217/ACM\346\250\241\345\274\217\345\246\202\344\275\225\346\236\204\345\273\272\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/\345\211\215\345\272\217/ACM\346\250\241\345\274\217\345\246\202\344\275\225\346\236\204\345\273\272\344\272\214\345\217\211\346\240\221.md" @@ -217,6 +217,59 @@ int main() { ## Java ```Java +public class Solution { + // 节点类 + static class TreeNode { + // 节点值 + int val; + + // 左节点 + TreeNode left; + + // 右节点 + TreeNode right; + + // 节点的构造函数(默认左右节点都为null) + public TreeNode(int x) { + this.val = x; + this.left = null; + this.right = null; + } + } + + /** + * 根据数组构建二叉树 + * @param arr 树的数组表示 + * @return 构建成功后树的根节点 + */ + public TreeNode constructBinaryTree(final int[] arr) { + // 构建和原数组相同的树节点列表 + List treeNodeList = arr.length > 0 ? new ArrayList<>(arr.length) : null; + TreeNode root = null; + // 把输入数值数组,先转化为二叉树节点列表 + for (int i = 0; i < arr.length; i++) { + TreeNode node = null; + if (arr[i] != -1) { // 用 -1 表示null + node = new TreeNode(arr[i]); + } + treeNodeList.add(node); + if (i == 0) { + root = node; + } + } + // 遍历一遍,根据规则左右孩子赋值就可以了 + // 注意这里 结束规则是 i * 2 + 2 < arr.length,避免空指针 + for (int i = 0; i * 2 + 2 < arr.length; i++) { + TreeNode node = treeNodeList.get(i); + if (node != null) { + // 线性存储转连式存储关键逻辑 + node.left = treeNodeList.get(2 * i + 1); + node.right = treeNodeList.get(2 * i + 2); + } + } + return root; + } +} ``` From ce8e2019db658788e1231c5d56d2e50c3cc417a0 Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Wed, 27 Apr 2022 00:00:37 +0800 Subject: [PATCH 0563/3019] Update --- README.md | 42 +--- "problems/0051.N\347\232\207\345\220\216.md" | 2 - ...50\345\272\223\345\207\275\346\225\260.md" | 8 +- ...76\351\235\236\347\247\221\347\217\255.md" | 47 ----- ...50\346\204\217\344\272\213\351\241\271.md" | 89 -------- ...4-\345\206\263\350\265\233\345\234\210.md" | 87 -------- ...25\345\216\273\344\275\225\344\273\216.md" | 88 -------- ...er\347\232\204\351\200\211\346\213\251.md" | 137 ------------- ...67\347\232\204\344\270\203\345\244\225.md" | 73 ------- ...01\346\200\216\344\271\210\345\212\236.md" | 45 ---- ...76\345\274\203\347\247\213\346\213\233.md" | 81 -------- ...45\350\277\231\344\271\210\345\206\231.md" | 69 ------- ...33\350\267\237\344\270\215\344\270\212.md" | 55 ----- ...66\347\232\204\347\226\221\351\227\256.md" | 87 -------- ...00\344\272\233\345\273\272\350\256\256.md" | 72 ------- ...00\344\272\233\351\227\256\351\242\230.md" | 100 --------- ...\347\240\224VS\345\267\245\344\275\234.md" | 49 ----- ...01\345\210\267\344\270\244\351\201\215.md" | 67 ------ ...14\350\256\241\347\256\227\346\234\272.md" | 53 ----- ...57\346\234\200\345\245\275\347\232\204.md" | 37 ---- ...22\345\261\212\347\247\213\346\213\233.md" | 67 ------ ...71\345\205\273\344\275\223\347\263\273.md" | 81 -------- ...46\344\270\200\350\210\254\351\273\221.md" | 71 ------- ...13\346\213\233\345\244\215\344\271\240.md" | 47 ----- .../\345\256\242\344\270\211\346\266\210.md" | 95 --------- ...00\346\234\257\346\226\271\345\220\221.md" | 32 --- ...17\345\274\200\345\247\213\344\272\206.md" | 48 ----- ...4\276\235\347\204\266\346\262\241offer.md" | 99 --------- ...13\346\213\233\345\274\200\345\245\226.md" | 65 ------ ...3\346\213\233\346\200\273\347\273\2231.md" | 194 ------------------ ...3\346\213\233\346\200\273\347\273\2232.md" | 48 ----- ...3\346\213\233\346\200\273\347\273\2233.md" | 83 -------- ...04\344\270\212\345\215\212\345\234\272.md" | 55 ----- ...53\344\270\216\347\204\246\350\231\221.md" | 55 ----- ...15\344\270\215\351\207\215\350\246\201.md" | 58 ------ ...15\350\246\201\350\200\203\347\240\224.md" | 45 ---- .../\351\200\274\347\255\276.md" | 51 ----- ...13\346\213\233\346\200\273\347\273\223.md" | 117 ----------- ...55\347\232\204\345\233\260\346\211\260.md" | 54 ----- ...43\346\200\247\351\227\256\351\242\230.md" | 45 ---- 40 files changed, 3 insertions(+), 2695 deletions(-) rename "problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\210\267\345\212\233\346\211\243\347\224\250\344\270\215\347\224\250\345\272\223\345\207\275\346\225\260.md" => "problems/\345\211\215\345\272\217/\345\210\267\345\212\233\346\211\243\347\224\250\344\270\215\347\224\250\345\272\223\345\207\275\346\225\260.md" (82%) delete mode 100644 "problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/HR\347\211\271\346\204\217\345\210\201\351\232\276\351\235\236\347\247\221\347\217\255.md" delete mode 100644 "problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/HR\351\235\242\346\263\250\346\204\217\344\272\213\351\241\271.md" delete mode 100644 "problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/offer\345\257\271\346\257\224-\345\206\263\350\265\233\345\234\210.md" delete mode 100644 "problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/offer\346\200\273\345\206\263\350\265\233\357\274\214\344\275\225\345\216\273\344\275\225\344\273\216.md" delete mode 100644 "problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/offer\347\232\204\351\200\211\346\213\251.md" delete mode 100644 "problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\344\270\215\344\270\200\346\240\267\347\232\204\344\270\203\345\244\225.md" delete mode 100644 "problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\344\270\215\345\226\234\346\254\242\345\206\231\344\273\243\347\240\201\346\200\216\344\271\210\345\212\236.md" delete mode 100644 "problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\344\270\215\345\260\221\345\275\225\345\217\213\346\203\263\346\224\276\345\274\203\347\247\213\346\213\233.md" delete mode 100644 "problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\344\270\223\344\270\232\346\212\200\350\203\275\345\217\257\344\273\245\350\277\231\344\271\210\345\206\231.md" delete mode 100644 "problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\205\245\350\201\214\345\220\216\346\213\205\345\277\203\344\273\243\347\240\201\350\203\275\345\212\233\350\267\237\344\270\215\344\270\212.md" delete mode 100644 "problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\205\263\344\272\216\345\256\236\344\271\240\345\244\247\345\256\266\347\232\204\347\226\221\351\227\256.md" delete mode 100644 "problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\205\263\344\272\216\346\217\220\345\211\215\346\211\271\347\232\204\344\270\200\344\272\233\345\273\272\350\256\256.md" delete mode 100644 "problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\206\231\347\256\200\345\216\206\347\232\204\344\270\200\344\272\233\351\227\256\351\242\230.md" delete mode 100644 "problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\210\235\345\205\245\345\244\247\344\270\211\351\200\211\346\213\251\350\200\203\347\240\224VS\345\267\245\344\275\234.md" delete mode 100644 "problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\210\267\351\242\230\346\224\273\347\225\245\350\246\201\345\210\267\344\270\244\351\201\215.md" delete mode 100644 "problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\215\232\345\243\253\350\275\254\350\241\214\350\256\241\347\256\227\346\234\272.md" delete mode 100644 "problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\220\210\351\200\202\350\207\252\345\267\261\347\232\204\345\260\261\346\230\257\346\234\200\345\245\275\347\232\204.md" delete mode 100644 "problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\244\207\346\210\2302022\345\261\212\347\247\213\346\213\233.md" delete mode 100644 "problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\244\247\345\216\202\346\226\260\344\272\272\345\237\271\345\205\273\344\275\223\347\263\273.md" delete mode 100644 "problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\244\251\344\270\213\344\271\214\351\270\246\344\270\200\350\210\254\351\273\221.md" delete mode 100644 "problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\246\202\344\275\225\346\235\203\350\241\241\345\256\236\344\271\240\344\270\216\347\247\213\346\213\233\345\244\215\344\271\240.md" delete mode 100644 "problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\256\242\344\270\211\346\266\210.md" delete mode 100644 "problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\346\212\200\346\234\257\344\270\215\345\245\275\345\246\202\344\275\225\351\200\211\346\213\251\346\212\200\346\234\257\346\226\271\345\220\221.md" delete mode 100644 "problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\346\217\220\345\211\215\346\211\271\345\267\262\347\273\217\345\274\200\345\247\213\344\272\206.md" delete mode 100644 "problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\347\247\213\346\213\233\344\270\213\345\215\212\345\234\272\344\276\235\347\204\266\346\262\241offer.md" delete mode 100644 "problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\347\247\213\346\213\233\345\274\200\345\245\226.md" delete mode 100644 "problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\347\247\213\346\213\233\346\200\273\347\273\2231.md" delete mode 100644 "problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\347\247\213\346\213\233\346\200\273\347\273\2232.md" delete mode 100644 "problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\347\247\213\346\213\233\346\200\273\347\273\2233.md" delete mode 100644 "problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\347\247\213\346\213\233\347\232\204\344\270\212\345\215\212\345\234\272.md" delete mode 100644 "problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\347\247\213\346\213\233\350\277\233\350\241\214\344\270\255\347\232\204\350\277\267\350\214\253\344\270\216\347\204\246\350\231\221.md" delete mode 100644 "problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\350\213\261\350\257\255\345\210\260\345\272\225\351\207\215\344\270\215\351\207\215\350\246\201.md" delete mode 100644 "problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\350\246\201\344\270\215\350\246\201\350\200\203\347\240\224.md" delete mode 100644 "problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\351\200\274\347\255\276.md" delete mode 100644 "problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\351\235\236\347\247\221\347\217\2552021\347\247\213\346\213\233\346\200\273\347\273\223.md" delete mode 100644 "problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\351\235\236\347\247\221\347\217\255\347\232\204\345\233\260\346\211\260.md" delete mode 100644 "problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\351\235\242\350\257\225\344\270\255\345\217\221\346\225\243\346\200\247\351\227\256\351\242\230.md" diff --git a/README.md b/README.md index 148f49d885..1d7f219d2c 100644 --- a/README.md +++ b/README.md @@ -102,6 +102,7 @@ * [看了这么多代码,谈一谈代码风格!](./problems/前序/代码风格.md) * [力扣上的代码想在本地编译运行?](./problems/前序/力扣上的代码想在本地编译运行?.md) * [什么是核心代码模式,什么又是ACM模式?](./problems/前序/什么是核心代码模式,什么又是ACM模式?.md) + * [刷题要不要用库函数](./problems/前序/刷力扣用不用库函数.md) * [ACM模式如何构造二叉树](./problems/前序/ACM模式如何构建二叉树.md) * [解密互联网大厂研发流程](./problems/前序/互联网大厂研发流程.md) @@ -129,45 +130,6 @@ * [递归算法的时间与空间复杂度分析!](./problems/前序/递归算法的时间与空间复杂度分析.md) * [刷了这么多题,你了解自己代码的内存消耗么?](./problems/前序/刷了这么多题,你了解自己代码的内存消耗么?.md) -## 知识星球精选 - -* [秋招面试,心态很重要!](./problems/知识星球精选/秋招总结3.md) -* [秋招倒霉透顶,触底反弹!](./problems/知识星球精选/秋招总结2.md) -* [无竞赛,无实习,如何秋招?](./problems/知识星球精选/秋招总结1.md) -* [offer总决赛,何去何从!](./problems/知识星球精选/offer总决赛,何去何从.md) -* [入职后担心代码能力跟不上!](./problems/知识星球精选/入职后担心代码能力跟不上.md) -* [秋招进入offer决赛圈!](./problems/知识星球精选/offer对比-决赛圈.md) -* [非科班的困扰](./problems/知识星球精选/非科班的困扰.md) -* [offer的选择-开奖](./problems/知识星球精选/秋招开奖.md) -* [看到代码就抵触!怎么办?](./problems/知识星球精选/不喜欢写代码怎么办.md) -* [遭遇逼签,怎么办?](./problems/知识星球精选/逼签.md) -* [HR特意刁难非科班!](./problems/知识星球精选/HR特意刁难非科班.md) -* [offer的选择](./problems/知识星球精选/offer的选择.md) -* [天下乌鸦一般黑,哪家没有PUA?](./problems/知识星球精选/天下乌鸦一般黑.md) -* [初入大三,考研VS工作](./problems/知识星球精选/初入大三选择考研VS工作.md) -* [非科班2021秋招总结](./problems/知识星球精选/非科班2021秋招总结.md) -* [秋招下半场依然没offer,怎么办?](./problems/知识星球精选/秋招下半场依然没offer.md) -* [合适自己的就是最好的](./problems/知识星球精选/合适自己的就是最好的.md) -* [为什么都说客户端会消失](./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) - ## 杂谈 * [「代码随想录」刷题网站上线](https://mp.weixin.qq.com/s/-6rd_g7LrVD1fuKBYk2tXQ)。 @@ -569,7 +531,7 @@ 如果是已工作,备注:姓名-城市-岗位-组队刷题。如果学生,备注:姓名-学校-年级-组队刷题。**备注没有自我介绍不通过哦** -
+
diff --git "a/problems/0051.N\347\232\207\345\220\216.md" "b/problems/0051.N\347\232\207\345\220\216.md" index 85524e6f90..c03e48c2e4 100644 --- "a/problems/0051.N\347\232\207\345\220\216.md" +++ "b/problems/0051.N\347\232\207\345\220\216.md" @@ -129,7 +129,6 @@ for (int col = 0; col < n; col++) { ```CPP bool isValid(int row, int col, vector& chessboard, int n) { - int count = 0; // 检查列 for (int i = 0; i < row; i++) { // 这是一个剪枝 if (chessboard[i][col] == 'Q') { @@ -178,7 +177,6 @@ void backtracking(int n, int row, vector& chessboard) { } } bool isValid(int row, int col, vector& chessboard, int n) { - int count = 0; // 检查列 for (int i = 0; i < row; i++) { // 这是一个剪枝 if (chessboard[i][col] == 'Q') { diff --git "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\210\267\345\212\233\346\211\243\347\224\250\344\270\215\347\224\250\345\272\223\345\207\275\346\225\260.md" "b/problems/\345\211\215\345\272\217/\345\210\267\345\212\233\346\211\243\347\224\250\344\270\215\347\224\250\345\272\223\345\207\275\346\225\260.md" similarity index 82% rename from "problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\210\267\345\212\233\346\211\243\347\224\250\344\270\215\347\224\250\345\272\223\345\207\275\346\225\260.md" rename to "problems/\345\211\215\345\272\217/\345\210\267\345\212\233\346\211\243\347\224\250\344\270\215\347\224\250\345\272\223\345\207\275\346\225\260.md" index c8e2f5c618..ae0940bfdc 100644 --- "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\210\267\345\212\233\346\211\243\347\224\250\344\270\215\347\224\250\345\272\223\345\207\275\346\225\260.md" +++ "b/problems/\345\211\215\345\272\217/\345\210\267\345\212\233\346\211\243\347\224\250\344\270\215\347\224\250\345\272\223\345\207\275\346\225\260.md" @@ -1,8 +1,3 @@ -

- - - - # 究竟什么时候用库函数,什么时候要自己实现 在[知识星球](https://programmercarl.com/other/kstar.html)里有录友问我,刷题究竟要不要用库函数? 刷题的时候总是禁不住库函数的诱惑,如果都不用库函数一些题目做起来还很麻烦。 @@ -11,7 +6,7 @@ 一些同学可能比较喜欢看力扣上直接调用库函数的评论和题解,**其实我感觉娱乐一下还是可以的,但千万别当真,别沉迷!** -例如:[字符串:151. 翻转字符串里的单词](https://mp.weixin.qq.com/s/X3qpi2v5RSp08mO-W5Vicw)这道题目本身是综合考察同学们对字符串的处理能力,如果 split + reverse的话,那就失去了题目的意义了。 +例如:[字符串:151. 翻转字符串里的单词](https://programmercarl.com/0151.%E7%BF%BB%E8%BD%AC%E5%AD%97%E7%AC%A6%E4%B8%B2%E9%87%8C%E7%9A%84%E5%8D%95%E8%AF%8D.html)这道题目本身是综合考察同学们对字符串的处理能力,如果 split + reverse的话,那就失去了题目的意义了。 有的同学可能不屑于实现这么简单的功能,直接调库函数完事,把字符串分成一个个单词,一想就是那么一回事,多简单。 @@ -31,4 +26,3 @@ 在刷题的时候本着我说的标准来使用库函数,详细对大家回有所帮助! - diff --git "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/HR\347\211\271\346\204\217\345\210\201\351\232\276\351\235\236\347\247\221\347\217\255.md" "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/HR\347\211\271\346\204\217\345\210\201\351\232\276\351\235\236\347\247\221\347\217\255.md" deleted file mode 100644 index d5d39fe35e..0000000000 --- "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/HR\347\211\271\346\204\217\345\210\201\351\232\276\351\235\236\347\247\221\347\217\255.md" +++ /dev/null @@ -1,47 +0,0 @@ - -

- - - - -# HR特意刁难非科班! - -不少录友都是非科班转程序员,或者进军互联网的,但有一些HR在HR面的时候特意刁难大家。 - -正如[知识星球](https://programmercarl.com/other/kstar.html)里,这位录友所遭受的情景。 - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211006230202.png) - -1. 你的研究方向并不是这个方面的,你为什么要转行? -2. 你和非科班的同学相比肯定有一些劣势,你打算怎么赶上他们?或者是你如何应对你作为非科班生在工作中的挑战? - -以下是我的回答: - -对于问题一,你这么说没问题,可以再润色一下,说一说自己看过哪些技术大牛的传记,例如《黑客与画家》,对自己影响很大,然后对编程就非常感兴趣,想从事这个行业 等等。 或者说 你感觉 新能源汽车是以后非常明确的方向,而自动驾驶是新能源汽车的标配,所以想投身这个行业。 - -问题二: 首先要自信起来,说:在技术方面和对编程的热情方面,我不比科班同学差,因为大学里教的内容和企业要求的基本脱钩的,大家准备面试进大厂都是靠自学,**反而因为我是非科班,我更加的努力,也特别珍惜来之不易的机会**。 - -如果要说科班同学有什么优势的话,我感觉他们的学习编程的氛围会好好一些,也就是遇到问题大家能一起交流,因为我车辆工程专业,所以我会经常去蹭计算机的课,也会去认识很多计算机专业的同学和他们一起讨论问题。 - -总之在HR面的时候,不要说自己哪里的缺点,也不说自己哪里技术掌握的不好,**HR不懂技术,你说自己哪里不懂,他就真认为你不懂了**。 - -缺点就说一些不痛不痒的,甚至化缺点为自己的优势。 - -例如问你的缺点是什么? - -**可以说自己有时候 对技术细节过于执着,以至于影响整体的进度**。 - -这种缺点 无形之中 就体现出自己 对技术的热爱和专研 (起到装逼于无形的效果),而且 这种缺点 是分分钟就可以改的。 - -如果问你 :作为非科班生在工作中的挑战? - -你也这么说:其实大家都是靠自学,如果说非科班在工作中遇到的挑战,我相信 科班同学在工作中也是遇到一样的挑战,工作之后自学能力更加重要,互联网变化是飞快的,只有自学能力强的同学才能跟上步伐。 - -然后随便举例一下,说明自己自学能力如何如何的强,就可以了。 - -**总之不能示弱,不能说自己哪里不好,哪里不行!** - -HR也不懂技术,主要就是看你的态度。 - -就酱,希望对录友们有所启发,加油💪 - diff --git "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/HR\351\235\242\346\263\250\346\204\217\344\272\213\351\241\271.md" "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/HR\351\235\242\346\263\250\346\204\217\344\272\213\351\241\271.md" deleted file mode 100644 index 5dba672c5d..0000000000 --- "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/HR\351\235\242\346\263\250\346\204\217\344\272\213\351\241\271.md" +++ /dev/null @@ -1,89 +0,0 @@ -

- - - - - -# HR面注意事项 - -[知识星球](https://programmercarl.com/other/kstar.html)里已经有一些录友开始准备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://programmercarl.com/other/kstar.html) diff --git "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/offer\345\257\271\346\257\224-\345\206\263\350\265\233\345\234\210.md" "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/offer\345\257\271\346\257\224-\345\206\263\350\265\233\345\234\210.md" deleted file mode 100644 index 081ae5ece2..0000000000 --- "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/offer\345\257\271\346\257\224-\345\206\263\350\265\233\345\234\210.md" +++ /dev/null @@ -1,87 +0,0 @@ -

- - - - -# offer选择进入决赛圈.md - -秋招已经结束了,该开奖的差不多都陆续开奖了,很多录友的也进入了offer决赛圈。 - -我每天都在[知识星球](https://programmercarl.com/other/kstar.html)里,回答十几个offer对比的问题,我也是结合自己过来人的经验给大家做做分析,我也选几个案例,在公众号上也给大家分享一下,希望对大家有所启发。 - -以下是知识星球里的部分问答: - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211031113844.png) - -C++后端开发 总包40w,这个薪资和岗位很不错了,至于干的活杂不杂 都不是你能打听出来的,要进去,看具体工作,以及领导的具体安排,只有亲自去感受了,才知道是不是打杂。 - -深信服 云计算 大多数是做toB的业务,做私有云,几乎是和硬件设备一起卖,和阿里云,腾讯云,这些公有云厂商不是一个概念的。 - -深信服也不错,但不用奔着云计算这个壳子就去冲 深信服,进去干的活未必和云计算有多关系,而且去深信服 你就能保证不打杂了么? 对吧 - -所以 具体工作内容是 我们控制不了的,知道个大概方向就可以了。 - -去百度吧,挺好的。 - -------------- - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211031105039.png) - -普渡科技 是是一家C轮创业公司,一般创业公司 双休的可能性不太大。而且 看两家给你的薪资,如果算上公积金的话,到手的钱没有百度开的高。 - -应届生去创业公司,有一点吃亏,就是你刚进去,因为你还不能干活,有明显的产出,或者能力有限,并不会给你 期权甚至股份,可能股份兑现不了,但表示的是对候选人的重视程度。 - -创业公司研发流程还不够规范,所谓的野蛮成长 就是没有流程。 **关键是能成长起来 万事大吉,就怕长不起来**。 - -百度虽然是测开的岗位,但薪资开得挺高了,可以看出对你的重视,飞桨深度学习平台部,也很不错,是百度重点打造的深度学习框架。 - -我倾向于选百度,虽然是测开,但进去依然可以学很多东西。 这样稳一些。 - -当然如果你想赌一把,可以去普渡科技,谁也说不好,万一后面起飞了呢。 - ----------- - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211031111110.png) - -双非本,还是电子信息类专业,能拿到这些offer,真的很不容易了👍 - -如果喜欢搞硬件,嵌入式应用方向其实也挺宽的,需求面也很广,华为 中兴,还有一堆手机厂商 新能源车企,智能家居,涉及到物联网的行业,都需要嵌入式开发。 - -中新赛克 也是上市公司,其实和 海康威视 大华股份 都差不多,这几家给薪资都差不多,一样的薪资,你在南京可比在杭州舒服多了啊,而且你家也在南京。 - -如果要真的是去大厂学技术,或者工资特别高,背井离乡也是可以的,但 海康威视 大华股份 估计也没有达到这个程度,薪资也没高出来,甚至可能不如 中新赛克 ,你还有 中新赛克给你的签字费呢。 - -综上,我倾向于 去 中新赛克,在老家,这个薪资不挺舒服的么,南京也很不错。 好好干吧💪 - -------------- - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211031110153.png) - -腾讯 这个部门有点边缘,技术栈比较浅。企业IT部就是做 企业内部应用的,最多也就是 几万人使用吧,大概率也没有机会磨练技术。系统很成熟,当然不加班。 - -百度推荐架构部,还是挺核心的,技术能力 还是比较强的。 **在上海应届生可以落户了,比深圳户口香太多太多了**。 - -至于晋升,百度晋升 一点也不慢,顺利的话,T3 到 T6 可以三年,一般情况是4年, T6跳 腾讯可以对应的是3-1 或者 3-2级别了。 - -至于光环,对个人来说,百度工程师在业内是很受认可的,一点不比腾讯差, 很多人说:拼多多啊,京东啊 市值都超过百度了,百度不是第一梯队了,等等。 - -说实话,**那公司的市值和我们这些码农有关系么**,对吧,**我们对关心的是 自己技术的成长,自己值多少钱,而不是公司值多少钱**。 - -至于薪资,相对于岗位,一年差6w,不算多,倾向于选百度。 - -------------- - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211031105736.png) - -去字节吧, 云存储方向 这个方向值得深耕, 是一个技术驱动的方向,而且各大厂商 都搞分布式存储,就业机会挺多的,再说 字节给的薪资也不错。 - -如果以后想离家近,你可以跳槽 腾讯云 继续做分布式存储,薪资还能涨一波。 - -如果对技术有追求的话,整个技术生涯都是可以认准云存储方向。存储是刚需! - -你可别在准备春招了,这大厂offer 都不要,准备啥 春招啊,哈哈哈,别卷了,休息吧。 - ----------- - -以上就是我在知识星球,针对录友们offer决赛圈的解答,希望对大家也有所帮助。 - diff --git "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/offer\346\200\273\345\206\263\350\265\233\357\274\214\344\275\225\345\216\273\344\275\225\344\273\216.md" "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/offer\346\200\273\345\206\263\350\265\233\357\274\214\344\275\225\345\216\273\344\275\225\344\273\216.md" deleted file mode 100644 index e22c5d4a3a..0000000000 --- "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/offer\346\200\273\345\206\263\350\265\233\357\274\214\344\275\225\345\216\273\344\275\225\344\273\216.md" +++ /dev/null @@ -1,88 +0,0 @@ - -

- - - - -# offer总决赛,何去何从! - -最近在[知识星球](https://programmercarl.com/other/kstar.html)上,给至少300位录友做了offer选择,准对大家的情况,结合我的经验做一做分析。 - -希望可以给大家带来不一样的分析视角,帮大家少走弯路。 - -以下是我在知识星球里分析的部分案例,公众号上再给大家分享一波。 - ------------ - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211108102416.png) - -1. C++ 后端,客户端,测开,指定选 C++后端啊,这是送分题。 -2. 转型的问题不好回答,各有各的出路,**就算大厂里,95%以上的程序员都不想写代码,就想指点江山**,但为什么大家都在写代码呢,因为出路没有固定的公式,没有固定的方法,很多人完美转型看的是运气,看时机,也看努力,**但最重要的是运气和时机**。 最不缺的就是努力的人,其实大家都挺努力的。 -3. 不会的,大厂里也没有一家语言独大,这种担心没必要。 -4. 不同公司处理情况不一样,甚至每年都会变,大部分都不会黑名单,你这几家都不会。 -5. 你的担心有点过头了,既然你拿到的offer就要对自己有信心,你也不是走后门拿到的offer,对自己能力这么没信心么,进去之后好好干就好了。剩下的交给缘分。 计划的在周密都没有变化快。 -6. 你问的太全面了[捂脸],我都没想到 拿到大厂offer,能但担心出来 这么多事情。已经很周密了👍 - -最后 倾向于你去阿里云吧,这么好的的机会 有啥犹豫的。 - - ------------------ - - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211108103414.png) - -我感觉你不用不甘心大白菜,其实挺好的,客观来看 非科班转码 拿腾信后端开发的 offer 挺不错的。 - -虾皮在公司影响力上 和 腾讯不是一个数量级的。 - -跳槽虽然看base,但也看公司的,腾讯光环加持 比 虾皮可有力多了。 - -腾讯的总包是有点虚(花样有点多),但第一年到 43w了 挺不错的,腾讯好好干,升到高级工程师,在外年很值钱的。 现在这点钱也不算啥。**而且现在应届生薪资真的挺高的,不用在去追高,容易摔到的**。 - -我建议你直接去腾讯就好, 这个选择题 其实挺好选的。 - -------------- - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211108103835.png) - -广州没有百度吧,可以活水到深圳百度,工位很宽敞,比北京工位舒服多了。 - -我倾向于选百度吧,而且百度的岗位也不错,薪资也比 虎牙高(虎牙的股票价值不好说),**虎牙你听说是 965 但未必是 965,可能你已入职项目就忙起来了,瞬间996,这个工作强度都不是永恒的,都是跟着项目走**。 - -广州可选择的互联网公司不错的,你去广州虎牙,一旦离职 其实不太好选下一家。 - -百度 试用期不过,这个感觉有点谣言,哪家大厂都有试用期不过的,不过这个看项目组,整体来说 基本试用期都能过,问题不大。 - -虾皮还在抽盲盒,就不考虑了。 - -去百度吧,好好锻炼几年,然后再找机会 回南方。或者transfer 深圳 也不错。 - ------------- - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211108104558.png) - -1. 公积金可以提出来 80%,包括自己交的和公司交的,还是挺方便的,现在支付宝可以一键提取。剩下的等你买房之后 可以全部提取。 - -2. 如果先去腾讯的话,你去 字节 做客户端更合适一些,而且你还是做 游戏直播的客户端,和腾讯互娱还是很匹配的。 - -至于研究生做客户端亏了 的问题,其实 95% 的研究生 基本都是做研发,后端或者客户端。 - -确实很多人感觉 读个研究生不做算法,不搞AI,和本科生没啥区别,**但事实是 搞算法 搞AI 可能都找不到工作了,那么就没有必要有这个执念**。 - -你现在能拿到 字节offer,也有你是研究生的加持 ,虽然 学历不等于能力,但 人多而卷,用学历晒人是最高效的方式。 - ------------- - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211108104735.png) - - -1. 一般来说管培计划,都是培养企业未来高管的,是很不错的,不同原员工干到高管多难,**但如果参加管培计划,那就不一样的,资源 和 机会 要不正常员工 多很多**, 从 去哪给你的薪资和签字费就能看出来。 不过去哪网的管培其实我不了解,我只是说一说普遍管培的情况。 - -2. 小米有很多东西可以学习? 这个其实 你现在是应届生,去哪家公司 都有很多东西可以学习,这个看具体内容了。 -3. 我感觉不用了吧,这offer也不错啊,当然如果还有激情,再战也可以的。毕竟没啥损失,不过感觉可以休息了,躺平吧。 - -建议再去详细了解一下 去哪网管培计划 的具体内容,因为不同公司 管培计划不太一样,你是 技术岗管培 还是其他方向管培。 - - -以上就是我在知识星球,针对录友们offer决赛圈的解答,希望对大家也有所帮助。 - diff --git "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/offer\347\232\204\351\200\211\346\213\251.md" "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/offer\347\232\204\351\200\211\346\213\251.md" deleted file mode 100644 index 106bc5f889..0000000000 --- "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/offer\347\232\204\351\200\211\346\213\251.md" +++ /dev/null @@ -1,137 +0,0 @@ - -

- - - - -# offer的选择 - -秋招基本要结束了,一些录友也拿到了一些offer,如果是拿到大厂和小厂的offer,那当然就不用纠结了,直接选大厂。 - -不过大部分同学应该拿到的是 两个大厂offer,或者说拿到两个小厂offer,还要考虑岗位,业务,公司前景,那么就要纠结如何选择了。 - -在[知识星球](https://programmercarl.com/other/kstar.html)里,我已经给很多录友提供了选择offer的建议,这里也分享出来,希望对大家在选择offer上有所启发。 - -## 保研与工作 - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211005233504.png) - -1. 建议你直接工作,你都已经拿到了大厂offer,没有必要读研究生了,如果你是保研到 985高校,倒是可以考虑考虑。 -2. 这是送分题,去百度吧,贴吧不算边缘,而且百度对新人的培养体系是很到位了,及时是边缘,对你技术成长也很有帮助,而且还有大厂光环。 - -3. 星球里 前端同学也很多啊,只不过你没注意到而已,我经常看到。而且前端和后端都是一样的,不能说没地位,不过不同的部门不太一样而已。(大家都是打工的,不用搞出鄙视链哈哈) -4. 躺平吧,可以歇息了,给还没拿offer的录友一条出路 - - -## 阿里云与微众 - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211005233646.png) - -中间件一点都不吭啊。 - -有云的地方,有分布式的地方,就有中间件,应用面很广泛,各大厂哪个能离开云计算,哪个能离开分布式,你就知道中间件有多重要了。当然中间件也是很大的一个领域了,是基础架构范畴。 - -关于业务部门和基础架构部门的选择,**我也倾向于 应届生选择基础架构部, 业务部门很忙没有时间沉底技术**。 - -其实你还要考虑,以后跳槽出来如何,在微众做基础架构,以后 跳槽可能更容易一些。注意跳槽不一定是你主动的,可能是被动跳槽。 - -假如阿里给你来个3.25 你就要找下家了,做 供应链管理 技术上没有太精进的话,找下家不太容易。 - -关于两个公司,我感觉差不多,微众也很不错,一般给出的薪资都比较高。 - -至于买房,杭州现在的房价涨的很猛,虽然说整体没有深圳高,但也差不多了,码农聚集地,就别想着房价多便宜。 - -互联网金融 这块后面发展一定是大势所趋的,不会差。 - -两个offer都不错,选哪个都可以! - -对技术有追求,我倾向于微众,如果对BAT有执念,就去阿里吧。 都差不多。 - -## 深信服、小米和海康 -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211006094624.png) - -音视频开发现在很火,是一个很好的方向,音视频里也是一个很大的方向了,里面有 音视频信号分析与处理、音视频编解码格式压缩、音视频文件打包封装、流媒体推流协议处理等等。 - -现在 腾讯会议,阿里钉钉,zoom都是靠音视频技术起家。 而且发展势头很不错。 - -但如果只是基于现有音视频做 SDK开发,那就没啥意思了。所以也是看具体的工作内容了。 - -股票这个 不用报太大期望,大概率 你等不到那个时候。 - -其实 深信服的技术栈 也挺封闭的,毕竟是算是比较偏硬的厂商,深信服做云计算,也是私有云,最终也是卖硬件。 - -不过小米其实你也说不好最终入职具体是干啥。 - -选一个的话,倾向于选深信服吧,毕竟深信服总部就在深圳,同事多,大家有个交流,相对来说发展稳定一些。小米 好像最近 深圳才有部门吧,估计应该没多少人,甚至入职之后 可能你单兵作战,和同事没有交流的话,无论是工作还是成长都比较难。 - -海康更硬一些,是做安防的,所以C++服务器开发基本是服务安防设备。 相对来说,选深信服更好一些,毕竟深信服是做网络安全和云计算的。 - -## 奇安信、顺网科技和东方财富 - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211005234238.png) - -这两家公司我也不太了解。 我就从业务上 简单分析一下 - -现在很多公司做私有云都有用OpenStack,你针对OpenStack 做二次开发,估计不太用深入理解OpenStack,但如何你能沉下心来学下去,以后跳槽的话 出路还是比较多的。 **就要看你对技术有没有钻劲了**。 - -东方财富 毕竟不是互联网公司,**主要业务也不是技术驱动,可能技术部门话语权还是挺低的**,大概率 可能是日常后台增删改查处理一些信息,(注意这也是我猜的,真实情况也要亲自体验了才知道) - -综上,我感觉 如果对技术热情一般,可以考虑东方财富(毕竟给的钱多), 如果想以后技术立身,考虑奇安信。 - - -## 字节客户端、度小满后端 -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211005234515.png) - -你这拿到这么多大厂offer,还说自己菜,凡尔赛石锤了,哈哈哈 - -客户端确实在劝退,但 客户端不会消失,现在客户端都在往大前端方向去转,**如果你很喜欢字节,喜欢 抖音的话,可以考虑去抖音做IOS**。但如果你一直做IOS的话,指定是发展不容乐观,入职之后就要考虑自己的下一步方向。 - -度小满后端支付业务 这个其实也不错,支付业务是核心部门,以后跳 微信支付,跳蚂蚁 都是可以的,每个互联网巨头都要做自己的支付。 - -这两个offer都可以。 - -如果非要选一个的话,我倾向于 选度小满后端支付业务吧。 以后 跳槽 选择更多一些。可以 通过社招 再去BAT,这时候自己的方向也比较稳定。缺点:不是大厂 - -如果对字节有情节,去也可以的,大厂福利待遇都不错,缺点:要考虑自己以后的方向。 - - -## 百度和华为 - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211006095816.png) - -针对于你的问题,我挨个说一下哈: - -1. 大华是做安防的,和主流互联网偏了一些。 -2. 成都有没有招人的机会,这个我也确定不了,但可以确定的是,第一份工作确实很重要!对以后的发展还是有很大影响的。 不过和 女朋友异地 如何权衡还是要看你自己。 -3. 百度大数据 也有做toB,就是给企业提供服务,做toB是比较辛苦,而且赚的不多(这里指的是部门营收),不过相对于你的其他几个offer,我倾向于你选百度,百度对应届生的培养还是很到位的。对你以后的技术发展有帮助。 而且大数据做tob的不止百度一家,阿里云,腾讯云,等等很多都做大数据toB,以后跳槽也容易。 -4. 这种情况有没有救,我也不清楚了,大概率是不太行了,不用过于纠结,能抓住目前的机会就很好了。 - - -## 大华和小米 - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211005234847.png) - -倾向于选小米吧,大华是做安防的,**在安防公司里做客户端,可以说是偏上加偏了**。 - -关于 小米南京工资 我也不了解,不过一般来说 南京工资都会低一些。 - -小米手机部门,以后你的选择 也会多一些,毕竟国内这么多手机厂商,而且小米的发展势头还是可以的,最近小米在发力小米汽车,如果能内部转岗到小米汽车,就很不错了,这是未来十年的一个重大机会,可以跟着雷总起飞。 - -在看以后定居,南京的房价可比杭州亲民多了,南京也就2w一平左右,以后你在南京定居基本压力不大,如果算上房价,杭州大华多出来的那点工资 简直不值一提了。 - -# 总结 - -最后我也只是针对大家给我的情况,我来做一个基本的分析,给出我的判断。 - -毕竟最了解你的,还是你自己,而且入职之后 工作具体内容,部门发展,其实我们都无法预测,只能结合我们能确定的内容来做分析。 - -拿我自己来举例,我当初毕业拿到是腾讯互娱XX工作室的后端开发offer 和 华为2012 数据库部门的offer,当然还有其他offer就不提了,那么当时问身边朋友前辈,一定是选 腾讯了,我也倾向于腾讯,但这么多年过后 反过来看,我感觉当初如果去华为可能更好一些。 - -具体原因我也会在知识星球里做分享。 - -所以 **在选择offer上,是有很多是未知的,再好的部门也有坑,再差的部门 遇到好领导也会很舒服**。 - -**我们只能把握住 目前能把握的,至于后面怎么样,只有经历了才知道**。 - -录友们在选择offer上,也多和问一问身边的同学,前辈们,多方面接受建议,在结合自己的情况做出判断,也希望录友们都有一个好的发展,加油💪 - diff --git "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\344\270\215\344\270\200\346\240\267\347\232\204\344\270\203\345\244\225.md" "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\344\270\215\344\270\200\346\240\267\347\232\204\344\270\203\345\244\225.md" deleted file mode 100644 index 40d15ecdc6..0000000000 --- "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\344\270\215\344\270\200\346\240\267\347\232\204\344\270\203\345\244\225.md" +++ /dev/null @@ -1,73 +0,0 @@ -

- - - - -# 特殊的七夕 - -昨天在[知识星球](https://programmercarl.com/other/kstar.html)发了一个状态: - -![](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/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\344\270\215\345\226\234\346\254\242\345\206\231\344\273\243\347\240\201\346\200\216\344\271\210\345\212\236.md" "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\344\270\215\345\226\234\346\254\242\345\206\231\344\273\243\347\240\201\346\200\216\344\271\210\345\212\236.md" deleted file mode 100644 index 84d372f080..0000000000 --- "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\344\270\215\345\226\234\346\254\242\345\206\231\344\273\243\347\240\201\346\200\216\344\271\210\345\212\236.md" +++ /dev/null @@ -1,45 +0,0 @@ - -# 看到代码就抵触!怎么办? - -最近在[知识星球](https://programmercarl.com/other/kstar.html)里,看到了不少录友,其实是不喜欢写代码,看到 哪些八股文都是很抵触的。 - -其实是一个普遍现象,我在星球里分享了一下,我对这一情况的一些想法。 - -发表在星球里,很快就有了60多个赞,也确实说道大家的心里去了。 - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211019222938.png) - -我在这里再给公众号的录友们也分享一下: - -很多同学不喜欢计算机,也不喜欢写代码,看到各种大堆的面经 八股文,心里是十分抗拒的。 - -所以总是拿一些其他的事情来拖延,最后发现秋招或者春招 完全拖过去了,或者说等求职的时候发现自己完全没有达到应聘的水平,再陷入 深深的焦虑之中。 - -这里有一个很重要的问题,就是**当你发现你不喜欢计算机的时候,那问问自己喜欢什么呢?** - -如果喜欢看电影,逛街,打游戏,甚至格调再高一点 喜欢画画,喜欢音乐,唱歌之类的,这些爱好如果没有达到专业的程度,那么仅仅是日常消遣而已。(甚至是一种逃避) - -**真实情况是大部分人都说不出来自己真正喜欢什么的**。 - -这是中国教育制度的问题,大家从小学、初中、高中、到大学再到工作 就没有时间或者机会去思考自己真正想干什么。 - -别说在校学生了,就互联网大厂的程序员,我敢说 百分之九十以上 都不喜欢写代码,都感觉写代码是最苦逼的,天天对着屏幕,写写一堆正常人看不懂的英文单词,有啥意思,对吧。 - -但为什么大家都依旧写代码呢。 - -**要生活啊,要赚钱啊!** - -那种可以不考虑经济问题,一言不合就寻找人生意义的选手,都是家里有矿的,那种咱们不讨论。 - -还一些同学迷茫的时候,就放空自己。 还有已经工作的,可能会去一趟西藏,“寻找一下生命的意义”。 - -其实我也是不建议的,**放空自己之后,并不会找到 自己真正的方向,只会更迷茫!** - -所以,**当你不知道自己真正喜欢什么的时候,就先把眼前的事情做好吧!** - -如果你知道自己不喜欢计算机,不喜欢写代码,但也不知道自己究竟喜欢什么的时候,那么就先把自己现在该做的事情做好,制定计划,算法题刷题起来,八股文看起来。 - -**这才是是最重要的**。 - -希望对录友们有所启发,加油💪 - diff --git "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\344\270\215\345\260\221\345\275\225\345\217\213\346\203\263\346\224\276\345\274\203\347\247\213\346\213\233.md" "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\344\270\215\345\260\221\345\275\225\345\217\213\346\203\263\346\224\276\345\274\203\347\247\213\346\213\233.md" deleted file mode 100644 index 81c9950350..0000000000 --- "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\344\270\215\345\260\221\345\275\225\345\217\213\346\203\263\346\224\276\345\274\203\347\247\213\346\213\233.md" +++ /dev/null @@ -1,81 +0,0 @@ -

- - - - -# 不少录友想放弃秋招了..... - -马上就要九月份了,互联网大厂的秋招的序幕早已拉开。 - -发现[知识星球](https://programmercarl.com/other/kstar.html)里有一部分录友想放弃秋招,直接准备明年的春招,估计关注公众号的录友也有不少有这种想法的。 - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210813103515.png) - -一般有这种想法的录友都是 **之前没有准备好,或者是总感觉时间赶趟赶趟,然后突然间 发现时间不赶趟了。。。** - -也有一些感觉自己没有实习经历,简历上也没什么好写,想下半年去找一找实习,不去秋招,然后直接准备春招。 - -**对于这种情况,我的建议依然要冲刺秋招!** - -# 把秋招当做最后的机会 - -**等到春招的时候,可以选岗位已经很少了,各个大厂几乎都招满了**。 - -而且就算秋招没找到好工作,一般 11月份左右,一些大厂还会有补招,腾讯就经常补招。 - -补招的情况是就是腾讯发出了 offer,有的候选人 选择违约,不来了,那么腾讯就需要补招,把人数凑齐。 - -可能有录友想,谁居然连腾讯的offer都拒绝呢? - -其实挺多的,例如:有其他大厂的核心部门offer,父母给安排了 国企、央企 的核心岗位,或者有的选择 读博了之类的,导师毕业能给安排留校 或者去其他高校任教。 - -所以几乎每年,腾讯都要补招,其他大厂也会有补招,一般是11月份,所以就算秋招没拿到大厂offer,依然有机会! - -话再说回来,面试其实也很看缘分,**永远没有真正准备好的时候,知识一直都学不完**。 - -所以 **把秋招当做最后的机会,就算秋招没找到,也可以在冲春招,而不是 直接放弃秋招**。 - - -# 放弃秋招,对心态的影响 - -如果直接放弃秋招,等 今年 10月份,身边同学都找到工作了,那时候的场面就是歌舞升平,大家天天吃喝玩乐。 - -见面打会招呼就问:你去哪了,你签哪了? - -那时候如果自己还没有面试,还在准备面试,此时自己心里阴影面积有多大,甚至会影响春招找工作。 - -# 面试要趁早准备 - -每年这时候,都会有同学后悔,我怎么就没早点准备,就感觉时间不够用。 - -所以也给明年找工作的录友们(2023届)提一个醒,现在就要系统性的准备起来了,因为明年春季实习招聘 是一个很好的进大厂的机会,剩下的时间也不是很多了。 - -来看看[知识星球](https://programmercarl.com/other/kstar.html)里,一位准大三的录友准备的情况 - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/星球大三.jpg) - -再来看看一位准大二的录友准备情况 - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/星球大二.jpg) - -**我已经预感到 这两位 等到秋招的时候就是稳稳的offer收割机**。 - -[知识星球](https://programmercarl.com/other/kstar.html)还有很多已经开始提前准备,或者看了 星球发文状态就开始着手准备的录友了。 - - -所以 **所谓的大牛,都是 很早就规划自己要学的东西,很早就开始向过来人请教应该如何找工作,很早就知道自己应该学哪些技术,看哪些书, 这样等到找工作的时候,才是剑锋出鞘的时候**。 - -我们远远还没有到拼智商的程度。 - -这里 也是给公众号里的录友们提一个醒,估计还有不少录友依然在感觉时间还赶趟,但 未来的卷王已经在路上了 哈哈哈。 - -**不过话说回来,现在互联网求职确实卷!** - -但这是社会问题,我们改变不了。 - -**卷的核心是,好的东西少,但要想的人多!** - -**如果你也想要,就要提前准备,提前规划,提前努力!** - -也希望录友们都能找到一个自己心仪的工作,加油💪。 - diff --git "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\344\270\223\344\270\232\346\212\200\350\203\275\345\217\257\344\273\245\350\277\231\344\271\210\345\206\231.md" "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\344\270\223\344\270\232\346\212\200\350\203\275\345\217\257\344\273\245\350\277\231\344\271\210\345\206\231.md" deleted file mode 100644 index a1b7ba3abb..0000000000 --- "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\344\270\223\344\270\232\346\212\200\350\203\275\345\217\257\344\273\245\350\277\231\344\271\210\345\206\231.md" +++ /dev/null @@ -1,69 +0,0 @@ -

- - - - - - -# 你简历里的「专业技能」写的够专业么? - - -其实我几乎每天都要看一些简历,有一些写的不错的,我都会在[知识星球](https://programmercarl.com/other/kstar.html)里分享一下。 -![](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/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\205\245\350\201\214\345\220\216\346\213\205\345\277\203\344\273\243\347\240\201\350\203\275\345\212\233\350\267\237\344\270\215\344\270\212.md" "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\205\245\350\201\214\345\220\216\346\213\205\345\277\203\344\273\243\347\240\201\350\203\275\345\212\233\350\267\237\344\270\215\344\270\212.md" deleted file mode 100644 index 58b8c32ced..0000000000 --- "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\205\245\350\201\214\345\220\216\346\213\205\345\277\203\344\273\243\347\240\201\350\203\275\345\212\233\350\267\237\344\270\215\344\270\212.md" +++ /dev/null @@ -1,55 +0,0 @@ - -

- - - - -# 入职后担心代码能力跟不上 - -在[知识星球](https://programmercarl.com/other/kstar.html)上,很多录友已经担心自己去了公司工作以后,代码能力跟不上,会压力很大。 - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211031202952.png) - -其实 星球里 也有很多 已经确定offer的录友,想在入职之前提升代码能力,或者说 如何可以更快的融入项目组。 - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211031203944.png) - -这里我把应届生刚刚工作需要培养的能力都说一说,其实也适用于毕业一两年的录友。 - -## 代码能力 - -练习代码能力最直接的方式就是多写,最简单的是用你的语言写一个管理系统,甚至你每天刷刷题,也是可以的。 - -再直白一遍,不是有26种设计模式,你全都实现一遍,即锻炼 代码能力,还学习了设计模式,等入职之后多看项目代码,看看大家在设计上使用了那种设计模式,或者说哪里还可以优化。 - -设计模式可以说 面试中最实用的知识的,大部分面试内容,工作中其实都用不上,所以大家会发现面试造大炮,工作拧螺丝。 - -## 心态 - -工作之后 从心态上来说,要不怕困难,不怕bug,不怕未知技术。 - -很多同学之所以代码能力弱,**就是太怕 难点**,遇到点 困难 就想:恨不得谁告诉我应该怎么怎么办得了,而不是自己去解决问题。 - -要善于使用搜索引擎,如何所谓问题是一个技术活,有的问题你怎么搜都搜不出来答案,但有的同学一搜 就搜出来了。 - -为什么呢? - -这是遇到问题,提取关键词的能力,很多同学遇到问题,不知道用什么关键词去搜。 - -**还有要有一种 越挫越勇 的精神**,这样你后面 的困难就会越来越少,也会培养出一种自信。 - -写代码也需要自信,工作之后 经常 有一些比较难任务,有的 同学就不敢接,怕做不出来,有的同学就敢接,并不说这位同学技术上一定强,而是他有自信。 - -**这种自信都在是以往 解决各种问题,排查各种bug,练就出来的**。一旦拥有自信,那能量就是 摧枯拉朽,真正的逢山开路遇水搭桥。领导也喜欢这样的组员 - -## 快速成长 - -刚入职的时候,不要怕问问题,不要怕出错,不要怕不好意思。 - -因为你是新人,就算问简单的问题,大家不会嫌弃你,但 这个新人窗口期是很短的,如果 过了几个月 还问一些非常基础的问题,那么 可能职场上就不太好了。 - -所以要在新人窗口期,快速成长,我看过太多的应届生,入职的时候 都是畏头畏尾,然后 过了新人期,能力还没有提高,还问很基础的问题,这样 项目组也不会分给他 有难度的任务,他也就得不到锻炼,越得不到锻炼,就能力越没提升,就越没自信,就越接不到有难度的活,然后陷入死循环! - - -综上,算是从学校到职场的上的一个转变。 希望对大家有帮助。 - diff --git "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\205\263\344\272\216\345\256\236\344\271\240\345\244\247\345\256\266\347\232\204\347\226\221\351\227\256.md" "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\205\263\344\272\216\345\256\236\344\271\240\345\244\247\345\256\266\347\232\204\347\226\221\351\227\256.md" deleted file mode 100644 index 88de443634..0000000000 --- "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\205\263\344\272\216\345\256\236\344\271\240\345\244\247\345\256\266\347\232\204\347\226\221\351\227\256.md" +++ /dev/null @@ -1,87 +0,0 @@ -

- - - - -# 关于实习,大家可能有点迷茫! - -我在[知识星球](https://programmercarl.com/other/kstar.html)里回答了很多关于实习相关的问题,其实很多录友可能都有这么样的疑问,主要关于实习的问题有如下四点: - -* 秋招什么时候开始准备 -* 要不要准备实习 -* 实习是不是重要? -* 什么时候找实习最有帮助 -* 如何选择实习的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/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\205\263\344\272\216\346\217\220\345\211\215\346\211\271\347\232\204\344\270\200\344\272\233\345\273\272\350\256\256.md" "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\205\263\344\272\216\346\217\220\345\211\215\346\211\271\347\232\204\344\270\200\344\272\233\345\273\272\350\256\256.md" deleted file mode 100644 index 6a316bd234..0000000000 --- "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\205\263\344\272\216\346\217\220\345\211\215\346\211\271\347\232\204\344\270\200\344\272\233\345\273\272\350\256\256.md" +++ /dev/null @@ -1,72 +0,0 @@ -

- - - - -# 秋招和提前批都越来越提前了.... - -正在准备秋招的录友,可能都感受到了,现在的秋招越来越提前了.... - -以前提前批,都是 8月份,8月份中序左右,而不少大厂现在就已经提前批了。 - -不少录友在 公众号留言,和[知识星球](https://programmercarl.com/other/kstar.html)里,表示提前批来的还是有点快。 - -![](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/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\206\231\347\256\200\345\216\206\347\232\204\344\270\200\344\272\233\351\227\256\351\242\230.md" "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\206\231\347\256\200\345\216\206\347\232\204\344\270\200\344\272\233\351\227\256\351\242\230.md" deleted file mode 100644 index 426eb2a653..0000000000 --- "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\206\231\347\256\200\345\216\206\347\232\204\344\270\200\344\272\233\351\227\256\351\242\230.md" +++ /dev/null @@ -1,100 +0,0 @@ -

- - - - -# 程序员应该这么写简历! - -自运营[知识星球](https://programmercarl.com/other/kstar.html)以来,我已经给星球里的录友们看了 一百多份简历,并准对大家简历上的问题都给出了对应的详细建议。 - -社招,校招,实习的都有,其实大家的简历看多了,发现有很多共性的问题,这里就和大家分享一下。 - -我的简历模板也分享出来了,大家在「代码随想录」后台回复:简历模板,就可以获取! - -# 简历布局 - -不少录友的简历布局就很不合理, 有的把专业技能放在最下面了,有的甚至把教育经历放下面了,建议简历布局的顺序是这样: - -* 教育工作经历 -* 专业技能 -* 项目经验 -* 荣誉奖项 -* 个人简述 - -# 教育工作经历 - -一些录友可能本科学历不是很好,然后 简历上直接不写自己的本科学校。 - -其实教育经历是最基本的,你不写 面试官也一定会问,问出来 那么感觉更不好,所以关于教育经历,大家是一定要写的。 - -写本科以后教育经历的就行了,一些录友可能是 高中就读了一些特别牛逼的高中,然后把高中也写出来了,哈哈哈,高中经历真的就不用写了。 - -还有一些社招的录友,研究生和本科之间空了几年,这几年 一定要说清楚做了些什么,甚至是“编一下”,因为这个面试官也会问的。 - -# 专业技能 - -一些录友简历上没有「专业技能」这一栏,或者写的很短。 - -可能是不知道该写啥,甚至就不写了。 - -通常「专业技能」是在 「教育工作经历」之后的,我这里给出一个模板,大家按照这个格式来写「专业技能」就可以。 - -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/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\210\235\345\205\245\345\244\247\344\270\211\351\200\211\346\213\251\350\200\203\347\240\224VS\345\267\245\344\275\234.md" "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\210\235\345\205\245\345\244\247\344\270\211\351\200\211\346\213\251\350\200\203\347\240\224VS\345\267\245\344\275\234.md" deleted file mode 100644 index f602e9e918..0000000000 --- "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\210\235\345\205\245\345\244\247\344\270\211\351\200\211\346\213\251\350\200\203\347\240\224VS\345\267\245\344\275\234.md" +++ /dev/null @@ -1,49 +0,0 @@ - -

- - - - -# 初入大三,考研VS工作 - -9月份开学季,已过,一些录友也升入大三了,升入大三摆在自己面前最大的问题就是,考研还是找工作? - -在[知识星球](https://programmercarl.com/other/kstar.html)里就有录友问我这样一个问题, 其实每个人情况不一样,做出的选择也不一样,这里给大家分享一下,相信对你也会有启发。 - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211002110618.png) - -以下是我的回答: - -首先我是考过研的,比较幸运一次就上岸了,这里说一下我的心得。 - -你才刚刚大三 就已经做了这么充分的准备了,那我倾向于 选择直接工作。 - -因为现在你准备的这些,都是找工作需要的,也都是实用的技术。 - -如果你明年初就开始准备考研了,那么你现在学的这些东西,就是半途而废了,考研一年 能让你的 编程技能水平 回到解放前(考过研的同学应该都懂的)。 - -不能说考研的内容一点用都没有,如果从技术学习的角度来说,其投入产出性价比极其极其极其的低。 - -举一个不太恰当的例子,考研就是大家一起学 “一个不太实用的知识”,看谁学的好。 - -所以考研其实更多的是学历上的提升,如果想通过考研,或者读研学习到什么? **还是不要有这个打算,大概率会让你失望的**。 - -正如你所说的,你有信心成为年级里比较优秀的(就业方面),也正是 准备的早,所以给了自己信心。 - -而且你们学校还有很多学长本科毕业就找到了好的工作,完全可以追随他们的足迹。 - -去考研的话,有信心考上更好的学校,当然可以,关键是 考研也是千军万马过独木桥,特别是计算机考研,特别是985名校,非常的卷。 - -如果没考上研究生,再去找工作就很被动了。 - -这也是为什么,很多一战失利都会选择二战,因为如果失败,损失很大,所以这条路还要继续走下去,一定要上岸。 - -再结合自己的情况,假如能考上,但考上了一所一般学校,其实对自己来说都是损失。 毕业之后 未必 有现在直接找工作找的好,年轻就是优势,特别是做研发,读研出来也是做研发,本科也是做研发,其实没太大区别的。 - -所以 如果本科毕业的学长学姐 就业也不错,可以追随他们的脚步,毕竟你已经开始准备了。 - -**如果有信心要冲 名校计算机研究生,或者说对某一所大学有情节,添补高考遗憾,那么可以冲,考上了是值得的**。 - - -当然也可以多和身边的 师兄 师姐交流,看看他们的说法,综合评估一下。 - diff --git "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\210\267\351\242\230\346\224\273\347\225\245\350\246\201\345\210\267\344\270\244\351\201\215.md" "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\210\267\351\242\230\346\224\273\347\225\245\350\246\201\345\210\267\344\270\244\351\201\215.md" deleted file mode 100644 index 285a5728dd..0000000000 --- "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\210\267\351\242\230\346\224\273\347\225\245\350\246\201\345\210\267\344\270\244\351\201\215.md" +++ /dev/null @@ -1,67 +0,0 @@ -

- - - - -# 代码随想录上的题目最好刷两遍以上 - -今天秋招可能要提前很多,往年9月份开始秋招,今天可能9月份就已经结束了,所以 正在准备秋招的录友,还是要抓紧时间了。。 - -星球里已经有录友的给出了关于秋招提前的信息 - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210801104138.png) - -那么在正式秋招之前,大家在准备算法,代码随想录上的题目 应该刷几篇呢? - -**至少刷两遍,只刷一遍是不够的**。 - -只刷一遍基本就会忘,而且关键方法论理解的也不到位,对递归三部曲,回溯三部曲,动规五部曲,只掌握了简单招式,而没有理解真正精髓。 - -拿到最简单的反转链表来说,只做一遍,下次面试出现基本还是做不出来。 - -这也是星球里 录友们的 多么痛的领悟! - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210731183247.png) - -**等大家刷第二遍的时候,才能找到触类旁通的感觉!** - -第三遍基本就得心应手了。 - -在[「代码随想录」知识星球](https://programmercarl.com/other/kstar.html)中,我都是强调大家要至少刷两遍,有时间的话刷三遍, - -可以看看星球里录友们的打卡: - -![](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/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\215\232\345\243\253\350\275\254\350\241\214\350\256\241\347\256\227\346\234\272.md" "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\215\232\345\243\253\350\275\254\350\241\214\350\256\241\347\256\227\346\234\272.md" deleted file mode 100644 index 4da79e9743..0000000000 --- "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\215\232\345\243\253\350\275\254\350\241\214\350\256\241\347\256\227\346\234\272.md" +++ /dev/null @@ -1,53 +0,0 @@ -

- - - - -# 本硕非计算机博士,如果找计算机相关工作 - -在[知识星球](https://programmercarl.com/other/kstar.html)里,有一位博士录友,本硕都不是计算机,博士转的计算机,问了这样一个问题 - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210903213924.png) - -一下是我的回答,在这里分享给大家。 - -我的一些研究生同学,都在读博,有的毕业有的还没毕业,平时和他们聊,对博士就业也是有一定的了解,这里说一说我的建议。 - -对于博士,强烈建议能去高校就去高校,这样最大程度发挥出了博士的好处,赚国家科研经费的钱还是香的。 - -虽然现在对青年研究者并不友好,基本经济大头都被实验室boss拿走了。 - -但高校壁垒高,外界再优秀的人才,也进不去和你竞争,所以可以小范围的卷。出来的话,就是和整个社会AI领域甚至和研发的同学一起卷。 - -**在企业 是谁有能力谁就上, 在高校,至少你得有博士学位才能上! 这就是很高的门槛了**。 - - -而且能给博士提供岗位的企业少之又少,所以博士的就业面反而窄了。 - -可能有同学想,薪酬要的低一点还不行么,其实博士毕业对薪资还是有要求的,如果薪资和本科,硕士应届生一样的话,自己也接受不了。 - -所以高校能给博士的机会更多一些,不过现在高校也是 青年科研人员都是 五年合同制,如果没有产出,也要走人了,压力也很大。 - -及时这样,还是建议能去高校去高校,当然这需要有心善、能力强、有人脉的博导,那是最好的了,(**注意这里选择博导,心善是最重要的一个选项**) - -实在去不了高校,接下来我们在看企业。 - -博士找工作不建议走正式招聘流程,例如走官网投递之类的,面试都没戏。 - -**AI岗现在对coding能力,工程能力要求都很高,企业现在特别喜欢有科研能力和工程能力的博士**,但这种人才还是稀缺的,大多数博士可能不会做那么多的工程项目,更别说还是本硕是非计算机专业的博士。 - -所以博士找工作要靠门派,最好你的导师,实验室大boss 有哪些徒弟在外面企业,BAT华为之类的干的很好,能联系上,就是同一门派的师兄弟。 - -联系上,做一个内推,他们看一下你的博士论文和研究成果,如果行的话,面试基本就是走个流程,这样就很舒服了。 - -如果上来一波算法题,然后 操作系统,网络 数据库,这样考察下来,基本计算机专业的博士也招架不住,毕竟大多数博士是科研型的,一般来说工程能力比较弱,计算机基础哪些基本也没时间看。 - - -再说一说非科班博士如果有机会去面试,**一定要重点突出知识的迁移能力,和对学术的研究能力,这个是硕士本科生所不能具备的**。 - -企业还是比较喜欢有快速学习能力和知识迁移能力的人,因为技术是不断在变化了,只有学习能力足够强再能跟上。 - -所以**不能和本科硕士去硬拼专业技能的储备量**,特别是最新最热的技术(因为本来就是非科班嘛), 要体现出博士对技术对知识的理解,这是你的优势。 - -以上是我的回答,希望多大家有所启发。录友们周末愉快🌹 - diff --git "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\220\210\351\200\202\350\207\252\345\267\261\347\232\204\345\260\261\346\230\257\346\234\200\345\245\275\347\232\204.md" "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\220\210\351\200\202\350\207\252\345\267\261\347\232\204\345\260\261\346\230\257\346\234\200\345\245\275\347\232\204.md" deleted file mode 100644 index dc31f5a79d..0000000000 --- "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\220\210\351\200\202\350\207\252\345\267\261\347\232\204\345\260\261\346\230\257\346\234\200\345\245\275\347\232\204.md" +++ /dev/null @@ -1,37 +0,0 @@ -

- - - - -# 合适自己的,才是最好的! - -秋招已经进入下半场了,不少同学也拿到了offer,但不是说非要进大厂,每个人情况都不一样,**合适自己的,就是最好的!**。 - -[知识星球](https://programmercarl.com/other/kstar.html)里有一位录友,就终于拿到了合适自己的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) - -星球里完整的记录了 这位录友 从五月份以来每天的学习内容和学习状态,能感觉出来 **虽然苦难重重,但依然元气满满!** - -我在发文的时候 看了一遍她这几个月完整的打卡过程,还是深有感触的。 - -[知识星球](https://programmercarl.com/other/kstar.html)里还有很多很多这样的录友在每日奋斗着,**我相信 等大家拿到offer之后,在回头看一下当初星球里曾经每日打卡的点点滴滴,不仅会感动自己 也会感动每一位见证者**。 - diff --git "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\244\207\346\210\2302022\345\261\212\347\247\213\346\213\233.md" "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\244\207\346\210\2302022\345\261\212\347\247\213\346\213\233.md" deleted file mode 100644 index 55c2a3bf6c..0000000000 --- "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\244\207\346\210\2302022\345\261\212\347\247\213\346\213\233.md" +++ /dev/null @@ -1,67 +0,0 @@ -

- - - - -# 要开始准备2022届的秋招了 - -在[知识星球](https://programmercarl.com/other/kstar.html)里准备秋招的录友还真不少,也会回答过不少关于秋招的问题。 - -![](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/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\244\247\345\216\202\346\226\260\344\272\272\345\237\271\345\205\273\344\275\223\347\263\273.md" "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\244\247\345\216\202\346\226\260\344\272\272\345\237\271\345\205\273\344\275\223\347\263\273.md" deleted file mode 100644 index 0e905e42f2..0000000000 --- "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\244\247\345\216\202\346\226\260\344\272\272\345\237\271\345\205\273\344\275\223\347\263\273.md" +++ /dev/null @@ -1,81 +0,0 @@ -

- - - - -# 大厂的新人培养体系是什么样的 - -之前我一直在[知识星球](https://programmercarl.com/other/kstar.html)和大家讲,能进大厂一定要进大厂,大厂有比较好的培养体系。 - -也有录友在星球里问我,究竟培养体系应该是什么样的呢? 大厂都会这么培养新人么? - -![](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/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\244\251\344\270\213\344\271\214\351\270\246\344\270\200\350\210\254\351\273\221.md" "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\244\251\344\270\213\344\271\214\351\270\246\344\270\200\350\210\254\351\273\221.md" deleted file mode 100644 index ccd1c32679..0000000000 --- "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\244\251\344\270\213\344\271\214\351\270\246\344\270\200\350\210\254\351\273\221.md" +++ /dev/null @@ -1,71 +0,0 @@ - -

- - - - -# 天下乌鸦一般黑,哪家没有PUA? - -相信大家应该经常在 各大论坛啊之类的 看到对各个互联网公司的评价,有风评好的,也有风评不好的。 - -在[知识星球](https://programmercarl.com/other/kstar.html)里有录友问我这样一个问题: - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211004095707.png) - -这位录友,拿了阿里云,腾讯,百度,shopee的意向书,可以确是收割机了,但如果还没有进入职场,还容易被网上这些风评误导。 - -卡哥来客观的分析一下,如何看到这些网上对公司的评论。 - -脉脉,知乎上喷阿里,百度的 都比较多。喷腾讯的确实少一些。 - -**只能说腾讯的舆论控制相对比较好**,在加上职能体系的人文关怀比较到位(公仔,各种活动,逢年过节小礼品之类的)。 - -但**天下乌鸦一般黑**,腾讯的职场PUA,一点都不比阿里的少,各种套路 ,阿里有的,腾讯都有,还有什么各种花边吃瓜新闻,在腾讯内网特别多。 - -但这些都在公司内网传播,很少传出去。 这就是腾讯厉害所在了。 - -其实我们在选择公司的时候,**主要是看岗位,看业务,看发展**,至于 有没有PUA之类的,只能说**有人的地方就有江湖**,腾讯人 就比 阿里人 就更正直么? - -相信大家都参加过面试。招聘的时候,几个小时的面试能看出人品么?对吧。 - -各种新人背锅,末尾淘汰,PUA,阿里有的,腾讯都有。 所以大家求职的时候不用在乎这些风评。 - -至于这种锅和套路 能不能落到自己的头上,就要看碰到了什么样的直属领导了。 - -例如两位同学去了同一家公司,同一个事业群,同一个部门,同一个项目组,只是在两个不同的领导下干活,其区别都可以一个天上,一个地上。 - -有的录友 可能对职场套路不太了解,或者 初入职场比较顺利,没有感受过什么套路。 - -这里卡哥给大家随便说一个,例如,一个项目组,有前端组和后端组,分别是两个老大,有一个需求,要开发一个功能,这个功能本来前端就可以独立完成的,但上线可能会有风险,保护自己手下的前端领导,就会让前端同学和后端的同学一起实现这个功能,也就是前端实现一部分,后端也要做一部分数据处理,前端展示就可以了。 - -为什么这么安排呢? - -因为一旦上线出问题了,就是前端和后端一起背锅,这样前端同学压力就小很多了。 - -而整个需求安排,前端同学其实并不知道 自己的风险,其实是领导保护了他。 - -那么 不保守下手的领导,当然就啥也不说了,让你一个人把这个功能做了,上线没出问题 那还算万事大吉,一旦出问题,那年底考核是不是就要背一个指标了。 - -所以不要感觉程序员的工作环境很单纯,其实套路多得很,还是那句话:**有人的地方就有江湖**,不区分公司的。 - -只能说 业务发展越好的部门,套路相对来说少一点,毕竟高速发展可以掩盖很多问题。 - -**所以遇到什么样的直属领导非常非常的重要**,但这又是我们决定不了的。 所以这都看缘分(运气)了。 - -有的同学毕业在大厂顺风顺水,除了自己努力外(而大家谁又不努力呢?),更重要的是遇到了好领导。 - -但有的同学同样进大厂,发展就很差,而且没人给他指引一些部门潜在的规则,那就难免会撞坑。 - -未必是他不够努力,不够聪明,不会沟通,可能恰巧 部门效益不好,部门考核就差,领导一般不会让老人背锅,毕竟系统的bug都是老人写的,老人都走了,谁来修bug呢(人间真实)。 - -那领导就拿他这个新人开刀了呗。 - -所以,**同样是进大厂,发展好的同学 不用过于优越感,感觉是自己能力多强,其实大概率是赶上了 好部门好领导,发展不好的同学也不要 自责自己能力不行,甚至开始自卑,大概率是运气不太好而已**。 - -那么是 发展好坏全看运气了么,当然不是! - -重要是 遇到挫折(背锅,绩效不好,甚至被开除),不要自卑,不要放弃,相信自己,只要把时间拉长,5-10年的时间,**真正努力的人,发展都不错!** - -卡哥希望录友们都有好的发展,加油💪 - - diff --git "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\246\202\344\275\225\346\235\203\350\241\241\345\256\236\344\271\240\344\270\216\347\247\213\346\213\233\345\244\215\344\271\240.md" "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\246\202\344\275\225\346\235\203\350\241\241\345\256\236\344\271\240\344\270\216\347\247\213\346\213\233\345\244\215\344\271\240.md" deleted file mode 100644 index 07e2bba6a5..0000000000 --- "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\246\202\344\275\225\346\235\203\350\241\241\345\256\236\344\271\240\344\270\216\347\247\213\346\213\233\345\244\215\344\271\240.md" +++ /dev/null @@ -1,47 +0,0 @@ -

- - - - -# 已经在实习的录友如何准备秋招? - -最近在[知识星球](https://programmercarl.com/other/kstar.html)一位录友问了实习生如何权衡工作和准备秋招的问题。 - - -![](https://code-thinking-1253855093.cos.ap-guangzhou.myqcloud.com/pics/20210703230618.png) - -其实这个问题挺有代表性,我之前一直讲的都是没有去实习的录友应该怎么怎么办,其实已经在大厂实习的录友也有很多烦恼。 - -这里我说一说已经有大厂实习经历,准备秋招的重点。 - -一般来说有大厂的实习经历,**面试官的兴趣都在大厂实习的项目经验上**。 - -所以关于权衡实习和准备基础这两个方面,**可以把主要精力放在项目包装上,其次是看基础**。 - -要在包装实习项目上多花点心思,实习生做的项目偏上业务很正常,不可能让实习生搞太复杂的,一旦出了问题还得导师背锅。 - -自己干的活,或者项目很简单 不要紧,可以好好包装一下,如果没有难点,**可以结合业务自己“造”难点**,大厂内部研发文档都特别多而且特别全。 - -例如整个项目的立项,各个模块的开发,以及研发中遇到的困难,技术选型,上线事故,等等这些都是有完整的文档记录的。(当然大厂也有一些部门研发流程很原始,没有文档,全靠口述) - -从这些文档中也可以找出 难点糅合到自己的项目中。 - -假如线上出了事故,虽然自己不用去排查但可以跟着同事们一起看问题,一起分析,甚至帮他捞捞日志,打打下手。 - -这次事故的表现,起因,定位等等,排查问题的同事都会记录的清清楚楚,放在项目文档下。 - -可以把这些文档都多看看,然后就可以转变成自己排查线上事故的经历了。 - -**这种经历在面试官来看就是很大的加分项了**。 - -所以在大厂实习,想包装自己的项目方法有很多,只不过一些同学初入职场,对自己有帮助的资料或者内容不太敏感,不善于利用已有的资源。 - -**需要过来人点一下,基本就上道了,哈哈哈**。 - -当然不是说只要在大厂实习,基础完全就不用看了,抽空也要看,只不过 项目经验(项目的包装)更重要! - -关于提前批,一般来说本厂实习生是不能参加提前批的。 - -你可以参加 其他大厂的提前批,只不过参加提前批是有代价的,面试不通过都是有记录的,得看自己项目准备的如何,能不能拿出手,而且一边实习一边面试可能也不太方便,如果想试一试,就找自己不想去的企业的提前批试试水! - - diff --git "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\256\242\344\270\211\346\266\210.md" "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\256\242\344\270\211\346\266\210.md" deleted file mode 100644 index 6b81ab2c6f..0000000000 --- "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\345\256\242\344\270\211\346\266\210.md" +++ /dev/null @@ -1,95 +0,0 @@ -

- - - - -# 客三消! - -给大家科普一下:什么是客三消。 - -翻译过来就是客户端三年消失。 - -**听起来是不是有点吓人**!这种说法略夸张,但只要能传开,就说明客户端一定有一些困局,并不是空穴来风。 - -昨天卡哥在朋友圈里分享了一个段子的截图 - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/IMG_3986.jpg) - -然后朋友圈就炸了,上百条的留言,问我这是为啥。 - -其实这个问题在[知识星球](https://programmercarl.com/other/kstar.html)里也有录友问过我。 - -![](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://programmercarl.com/other/kstar.html)里的详细回答。 - -注意我这里说的一般情况,当然各个岗位都有佼佼者,或者说大牛,客户端也有大牛,也很香,不过这是极少数,就不在讨论范围内了。 - -希望对大家理解目前客户端的趋势有所帮助。 - diff --git "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\346\212\200\346\234\257\344\270\215\345\245\275\345\246\202\344\275\225\351\200\211\346\213\251\346\212\200\346\234\257\346\226\271\345\220\221.md" "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\346\212\200\346\234\257\344\270\215\345\245\275\345\246\202\344\275\225\351\200\211\346\213\251\346\212\200\346\234\257\346\226\271\345\220\221.md" deleted file mode 100644 index 4ad4659bc4..0000000000 --- "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\346\212\200\346\234\257\344\270\215\345\245\275\345\246\202\344\275\225\351\200\211\346\213\251\346\212\200\346\234\257\346\226\271\345\220\221.md" +++ /dev/null @@ -1,32 +0,0 @@ -

- - - - -# 技术不太好,也不知道对技术有没有兴趣,我该怎么选? - -最近在[知识星球](https://programmercarl.com/other/kstar.html)里解答了不少录友们的疑惑,其实发现一个挺普遍的问题: - -* 我技术很一般 -* 对技术也没有什么追求 -* 要是对什么岗位感兴趣我也不知道 -* 以后自己喜欢干什么也不太清楚 - -**相信说到了不少录友心里去了, 其实目前应试教育下 确实很难找到自己感兴趣的事情**。 - -但我想说的是,并不是技术不好就什么都做不了,依然有很多选择,只不过录友们没有接触过,所以就不知道自己接下来要往哪个方向走。 - -这里我给出一些路线,大家可以参考: - -方向一:走纯研发路线,去大厂,如果真的对技术提不上兴趣可能会走的很辛苦。 - -方向二:如果技术还凑合,不做纯研发,退一步也可以考虑去大厂做测试相关的工作,对技术要求没有那么高,但也需要技术能力,而且技术能力越强越吃香。 - -方向三:去银行,证券,国企类的企业去做研发岗位,这种国有企业的技术面试相对简单不少,比较轻松,还很稳定,收入虽说不高,但生活足够滋润。 - -方向四:做toC(面向普通用户)的产品经理,toC产品经理这个岗位就特别卷,因为这个岗位门槛太低了,任何专业的同学都可以去做产品经理。 这样自己所学的技术就基本没有用了,也凸显不出技术上的优势,但如果自己真的对APP之类的各种应用得心应手,优点缺点,用户爽点、日活、次留等等手到擒来,倒可以试一试。 - -方向五:做toB的产品经理,包括云计算,大数据这些产品都是需要产品经理的,例如百度云,腾讯云,阿里云等等,这种产品本身就是技术产品,所以需要懂技术的产品经理来做设计,即需要产品的抓住需求的能力,也需要懂点技术,既可以发挥自己的技术能力,还可以做产品规划,基本也不用写代码。 - -对技术要求不高的岗位也挺多的,发展也很好,只要大家多去了解,总会找打符合自己的岗位。 - diff --git "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\346\217\220\345\211\215\346\211\271\345\267\262\347\273\217\345\274\200\345\247\213\344\272\206.md" "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\346\217\220\345\211\215\346\211\271\345\267\262\347\273\217\345\274\200\345\247\213\344\272\206.md" deleted file mode 100644 index 3e25574669..0000000000 --- "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\346\217\220\345\211\215\346\211\271\345\267\262\347\273\217\345\274\200\345\247\213\344\272\206.md" +++ /dev/null @@ -1,48 +0,0 @@ -

- - - - -# 不知不觉华为提前提已经开始了 - -最近华为提前批已经开始了,不少同学已经陆续参加了提前批的面试。 - -在[知识星球](https://programmercarl.com/other/kstar.html)上就有录友问我这么个问题: - -![](https://code-thinking-1253855093.cos.ap-guangzhou.myqcloud.com/pics/20210711002802.png) - -华为是比较看重学历的,如果学校比较好(985以上),华为的面试会随意一些,几乎就是走一个流程。 - -我记得当初校招的时候,华为来我们学校就是 几个大巴把整个计算机学院的同学拉到酒店,批量面试,面试过程差不多就是走个形式,大家基本都拿到offer了。 - -不是说 非985/211的同学 技术就不好,而是当企业每年要招上万人的时候,通过学历还筛选相对来说是 效率较高且成本最低的一种方式。 - -不过现在竞争越来越激烈了,华为也很少这种粗暴方式来召人。再说华为给出的薪酬相对互联网大厂也 很有竞争力,发展前景也很不错。 - -那么在说一说面试的内容。 - -可能有的同学感觉,我为了面试,准备了这么多,结果面试都没问,就问问项目问问编程语言就完事了。 - -这其实很正常! - -不同的公司,同一个公司不同部门,同一个部门不同面试官 面试风格都不太一样。 - -可能部门就比较缺人,面试官看一下 简历 学校可以,技术看上去还凑合,项目也还行,那么面试可能就放水一点,然后就过了。 - -毕竟面试官也很忙,在大厂谁都不想当面试官,都是工作之余加班的工作量,**所以面试官也想快点结束**。 - -还有另一种可能,就是部门已经招满了,但依然安排了面试,那么面试官就随便问问,然后也不会招人了。 - -还有一种,就是有的面试官就习惯考察算法题,问完算法了,其他的他也就不会问了。 - -因为操作系统,网络,数据库这些面试官在面试之前也要突击准备的,工作那么多年,都忘的差不多了,**所以要复习一波,这也是工作(都是加班啊!)**。 - -甚至可能面试官前天刚要和女朋友过生日,然后就没准备计算机基础方面的内容,索性面试的时候也就不问了..... - -这都是有可能的,很多同学可能没做过面试官,所以对一些面试过程就容易想不通,其实面试官也是普普通通的打工仔,他也不想加班,也想只要人品端正,积极肯干,随便召个技术差不多的就算了,哈哈哈。 - -所以说,面试有的时候也很看缘分的,大家辛辛苦苦造火箭,结果面试都没问是很正常的。 - -大家也放平心态,把该做的做好,剩下的交个天意了。 - - diff --git "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\347\247\213\346\213\233\344\270\213\345\215\212\345\234\272\344\276\235\347\204\266\346\262\241offer.md" "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\347\247\213\346\213\233\344\270\213\345\215\212\345\234\272\344\276\235\347\204\266\346\262\241offer.md" deleted file mode 100644 index 5862dd329f..0000000000 --- "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\347\247\213\346\213\233\344\270\213\345\215\212\345\234\272\344\276\235\347\204\266\346\262\241offer.md" +++ /dev/null @@ -1,99 +0,0 @@ -

- - - - -# 秋招下半场依然没offer,怎么办? - -[知识星球](https://programmercarl.com/other/kstar.html)里一些录友拿到了满意的offer,也有一些录友,依然没有offer,每天的状态已经不能用焦虑来形容了。 - -在星球里就有录友向我提问了这样一个问题: - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210921103222.png) - -估计还有公众号上还有很多录友也是这种情况,马上面试,但总感觉哪里都还没准备好,然后还必须要面试,每次面试结果还不理想。 - -能感受到此时大家非常迫切要知道还有没有什么切实可行的方案 ,只要执行 ,就能拿到offer。 - -恨不得提前知道面试官的问题,然后把问题都背下来得了。。。。 - -其实我是非常理解大家的心情的,这个时候怪自己准备的太晚也没有用。 - -说实话,已经是秋招下半场(接近末尾了),**已经没有针对面试的复习方案了。什么学习路线,突击计划 在这个时候 都没啥作用了**。 - -现在什么最重要呢? - -是**心态**。 - -心态要稳住,**放低预期,但别放低努力的程度**。 - -估计参加过面试的同学,都会有这种感觉,面试前一天复习,突击的内容,**第二天面试都不会考!是的,一道都不会考!** - -那么为什么还学呢? - -就是这股劲不能泄,只要憋住劲,每天面试,复盘,学习,面试再复盘,再学习,最终大家其实都能拿到offer的,只不过是offer的满意程度罢了。 - -**如果泄了劲,那就真没戏了**。 - -**可能自暴自弃两天,然后就发现自己啥也学不进去了**。 - -所以这个时候了,算法题还要一直刷,八股文也要背起来。 - -讲真,现在刷的题,看的八股文,面试可能也不一定会考,但为什么还要看呢,**就是稳定心态**。 - -**剩下的就看缘分了!** - -面试挺看缘分的, 可能一个面试官对你的评价就是基础不牢,下一家公司面试官对你的评价就是 基础不错,但项目经验不足。 - -所以此时你自己都蒙了,究竟自己是 基础不牢,还是项目经验不足呢? - -其实面试的本质,面试官主观性还是比较强的,可能就是问的几个问题 你都背过,而且背的很深入,那评价就是基础牢了呗。 - - -## 在学点技术,冲春招? - -[知识星球](https://programmercarl.com/other/kstar.html)里还有一位录友,也是类似的情况,秋招感觉很艰难,要不要在学一学微服务分布式之类的,再冲春招。 - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210921103343.png) - -其实这个时候,大家也不要再心思学点什么新技术,增加自己的筹码了。 - -还是那句话,**现在学啥,面试也未必会考!** - -就算 现在不参加秋招了,去学 微服务了,分布式。面试的时候 ,面试官未必会考不说,而且 你也未必学的透彻。 - -再说,春招的岗位 很少,而且优质岗位更少。 - -所以大家这个时候,就不要等了。 - -**直接海投,面试,复盘总结,再面试**。 - - -## 给参加明年秋招录友的劝告 - -其实我在[知识星球](https://programmercarl.com/other/kstar.html)里,**看到了太多太多 参加今年秋招的录友 埋怨自己 准备的太晚了,没想到要看的东西这么多,没想到竞争这么激烈**。 - -所以明年参加秋招的录友,要提前就开始准备,明确自己的岗位,知道岗位的要求,制定自己的计划,然后按计划执行。 - -**其实多早开始准备,都不算早!** - -很多在[知识星球](https://programmercarl.com/other/kstar.html)里的准大三,研一的录友,都能在星球里感受到 秋招的竞争与激烈。 - -所以他们也就早早的开始准备了。 - -来看看星球里 这位录友的提问,**他也才刚刚准大三,就已经为明年的秋招开始精心准备了**。 - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210920222600.png) - -估计大多数准大三或者准研一的同学都还没有这种意识。 - -**但在[知识星球](https://programmercarl.com/other/kstar.html)里,通过每天录友们的打卡,每天都能感受到这种紧迫感**。 - -正如一位星球里的录友这么说: - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210920223847.png) - -很多录友加入星球之后,**刷贴吧刷剧已经不香了,只有刷星球!** - -感觉每天自己被push上去,其实有时候 **大家需要的就是一个氛围,自己一个人很难有提前准备的意识,也很难坚持下来**。 - diff --git "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\347\247\213\346\213\233\345\274\200\345\245\226.md" "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\347\247\213\346\213\233\345\274\200\345\245\226.md" deleted file mode 100644 index 826867854e..0000000000 --- "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\347\247\213\346\213\233\345\274\200\345\245\226.md" +++ /dev/null @@ -1,65 +0,0 @@ - -

- - - - -# 开奖 - -最近秋招的录友已经陆续开奖了,同时开奖多少,也是offer选择的一个重要因素,毕竟谁能和钱过意不去呢。 - -[知识星球](https://programmercarl.com/other/kstar.html)里这位录友拿到的百度offer薪资确实很高 - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211023102430.png) - -以下是我的回答: - --------------- - -百度给你的这个薪资很不错了,百度一向是大厂里最扣的那个,能给这个价位,说明 面试官对你很满意。 - -语言方面你不用过于纠结,其实学什么语言最终都是为了赚钱是吧,钱给到位了,写啥不都一样么。 - -而且如果后面php 要转go的话,你就还很多锻炼的机会,对你晋升十分有好处,php转go,就是把已有的后端代码全部重写,相当于是重构,就是很多工作可以做。 - -**程序员最喜欢的就是重构**,重构既能提升技术,又能向上邀功(**可以理解就是容易晋升**)。 - -如果是稳定的业务,进去大概率是打杂的,因为没有那么多代码可写,进去就改改bug,写写脚本分析分析日志,之类的,总之不会接触到核心代码,没有机会,也没有必要。 - -但如果稳定的业务 代码要重构,就有机会可以读一读核心代码,分析哪里设计的不好,重写一遍,那就可以大展宏图。 - -这就是为什么程序员都喜欢重构。 - -字节的话 后端-系统架构,这个岗位是可以的,但具体什么部门,具体做什么就不太清楚了,至于你说的边缘部门,如果这个部门就叫做系统架构部的话,不可能是边缘部门。系统架构部门还是挺重要的。 - -但如果 字节和百度选的话,我还是倾向于百度。 百度对新人培养还很到位的,比字节强多了。 - -滴滴就不考虑了, 华为 2012实验室中央软件院,其实是不错的,适合好好搞技术,但关于 多媒体开发 这块 要看具体工作了。 -2012 一般薪资开的不高,毕竟不是华为的业务部门。 - -如果百度过几天逼签的话,就签了吧,挺香的,总包都40w+了,百度一向是很抠的,**这个价位,百度是下血本了**。 - -如果还能拖,就等 字节 和 华为开奖,如果能开到 50w+,那就考虑考虑。 - -如果薪资差不多,就百度吧。 - - -------------- - -这位录友最后也决定签百度了。 - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211021234705.png) - -大家也注意到,这位录友是把《代码随想录》刷了两篇,这里我也是推荐大家至少要把 《代码随想录》上的题目刷两遍,才能真正的掌握我讲解的内容,第一遍大家可能就是力扣提交通过了,然后这道题目就过了,没有深入去思考,也没有深入去看我的题解。 - -但第二遍的时候,就可以深入思考 上一道题目与本题之间的联系,动态规划或者二叉树的题目套路 等等了。 - - -还有这位录友在星球里提到,用了我推荐的项目,其实这就是这个:[基于跳表的轻量级KV存储引擎](https://mp.weixin.qq.com/s/i3vJd0nPqQFyLRH9Px84YA) - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211023103749.png) - -这个项目是我18年的时候,业余时间写的,大家如果按照我的代码来,从代码质量到结构设计,绝对是可以拿得出手的。 - -但我没有写这个项目的详细教程,很多基础不太好的录友可能看着有点费劲,后面我会在B站上出一期详细的讲解视频,公众号也会同步文字版本。 - diff --git "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\347\247\213\346\213\233\346\200\273\347\273\2231.md" "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\347\247\213\346\213\233\346\200\273\347\273\2231.md" deleted file mode 100644 index 2aec24dc9e..0000000000 --- "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\347\247\213\346\213\233\346\200\273\347\273\2231.md" +++ /dev/null @@ -1,194 +0,0 @@ -

- - - - -# 无竞赛,无实习,如何秋招? - -今年秋招已经结束了,今天给大家介绍一位知识星球里的录友,我也是见证了他一步一步准备,从绝望到看到希望再绝望到最后拿到offer的全部过程。 - -我记得给他改简历的时候,就说过他冲客户端的话,可能更稳一些。 - -时间总是过得很快,但曾经焦虑的小伙,现在也拿到几个offer了,不一定人人都要冲大厂,卷算法,卷后端,合适自己就好,要不然会把自己搞的很累。 - -以下是他的秋招总结,**写的很用心,说了很多面试中使用的方法,发在[知识星球](https://programmercarl.com/other/kstar.html)里,立刻就引来星球小伙伴们的围观**,算是给星球里明年要秋招的录友做了一个参考。 - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211109231150.png) - -我也征求了他本人的同意,将其分享在公众号上,希望对大家有所启发。 - -以下原文: - - -## 个人背景 - -* 学校:末流985 -* 学历:本科 -* 所学专业:网络空间安全 -* 意向岗位:后端开发 -* 校内学习情况:**无竞赛,无实习经历,自己平时也没有捣鼓过任何项目,只是跟着学校的课程学习**😅。 - -## 秋招时间线 - -(**加粗内容为时间节点**,中间还穿插着各种笔试,这里就不列举了) - -* 二月初-二月中旬:开始刷leetcode -* 三月初-四月初:背八股文,刷题,同时投递实习岗,但由于个人实力不足以及投递时间太晚,一面均未通过 -* 四月-七月:完成学校内的课程,准备专业课考试,同时背八股文,不断地重复刷算法题 -* **七月二十六日**:收到字节跳动**客户端软件安全工程师**岗位的面试邀请 -* 八月初:面试**腾讯**后台开发岗,一面挂 -* **八月十五日**:通过字节的三轮专业面试和一轮hr面拿到**意向书** -* 八月下旬:连续面试美团,蚂蚁;美团一面挂,蚂蚁一面通过 -* **九月三日**:蚂蚁二面通过 -* **九月十三日**:成为字节跳动实习生,提前感受工作内容 -* 九月下旬:**通过五轮面试**:蚂蚁三面和hr面;华为两轮技术面和主管面 -* **十月二十九日**:收到字节正式offer -* **十一月五日**:收到华为意向书 - -小结: - -- 面试的企业:华为,字节,蚂蚁,腾讯,美团 -- 通过的企业:华为,字节(蚂蚁泡池子) -- 字节客户端安全-深圳 -- 华为软开-深圳(东莞):14a -- offer选择:大概率华为,中概率字节,小概率春招再战 - - - -## 技能准备 - -### 算法和数据结构 - -掌握程度: - -- 代码随想录 上的题目:programmercarl.com, 除了单调栈以外的所有题目都做过,且大部分题目**3-7**刷。 -- leetcode总共题数:219题。 -- (https://www.nowcoder.com/ta/huawei )做了68道。 -- 二叉树,红黑树,B+树,数组,链表,堆栈等基础知识均掌握。 - -取得的效果: -- 95%的面试题都能做出来,能讲出时间,空间复杂度和实现思路,但没见过的题目不一定能想出最优解。 -- 华为笔试:200分 (100分通过) ,蚂蚁笔试通过率:70%,网易笔试通过率:80%。 - -### 学习建议 - -按照卡哥**出题的顺序**刷,且要**重复刷**,**不能只是背代码**。还记得春招的时候,面试官问我**两数之和**,我能把代码写出来,但当问到实现思路,为什么这么实现,我答不上来;相类似的还有**二叉树迭代法的统一写法**,当面试官问我为什么这么写的时候,我说不知道:sob: - -把卡哥的题刷得差不多的时候,建议再刷两个专题: - -* 二分法 :https://leetcode-cn.com/problems/search-insert-position/solution/te-bie-hao-yong-de-er-fen-cha-fa-fa-mo-ban-python-/) -* 滑动窗口:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/solution/hua-dong-chuang-kou-by-powcai 。 - - -笔试题刷题要点: - -- **多刷**,**多刷**,**多刷**,**熟悉ACM格式** -- 面试题刷题要点: - - **时间,空间复杂度** - - **优化方案** - - **解题思路** - -以下是本人对各个知识块的掌握情况: - -### 计算机网络 - -掌握程度:应用层到数据链路层常考题都背得很熟悉,但细节没记到位,美团曾经问过我**tcp报文的可选字段**,没答上来。 - -### 操作系统 - -掌握程度:熟悉常见面试题,但当问到特别具体的问题时难以回答,比如:给一个具体的虚拟地址,请求出它映射到的物理地址。 - -### 数据库 - -掌握程度:这部分掌握得最少,仅限于面经里MySQL的面试题:cold_sweat:。 - -### C++ - -掌握程度:基础面试题,stl,面向对象等面试题滚瓜烂熟,但面试的时候语言考察得很少,我遇到过的只有:**malloc**底层实现,**stl**相关底层原理。 - -### 项目 - -提前准备好以下问题的答案: -- 为什么要做这个项目? -- 是**为了解决什么问题**? -- 项目的性质是什么? -- 多少个人完成? -- 你负责了什么工作? -- 有什么亮点?难点? -- 运用了哪些技术? -- 有什么收获? - -## 经验技巧 - -### 模拟问答 - -把**一切**在面试中可能被问到问题的**答案背下来**,假设你的对面有一个面试官,把问题的答案说给他听,这样有几个好处: - -1. **锻炼表达能力**。有过面试经验的同学应该可以感受到,明明自己对一些问题很了解,但面试时讲得磕磕巴巴,逻辑不清晰。 - -提前模拟面试场景,可以帮助你提前发现**语言表述上的问题**,以达到在面试过程中**清晰表述内容**的效果。 - -2. **查漏补缺**。在回答问题时,自己很有可能产生一些**疑问**,而这些疑问也是面试官**特别喜欢**考察的地方。 - -举例: - -- 面试官问:进程和线程的区别? -- 回答: -- 进程切换比线程切换开销小 -- ....... -- 面试官追问:进程切换开销**小在哪**?你能详细描述出进程切换的具体过程吗? - -如果你能在面试前自己发现这个问题,查漏补缺,面试的时候也会更游刃有余。 - -### 转移话题 - -转移话题,即改变话题方向。 - -举例: - -面试官问:为什么使用DH对称加密算法而不使用其他其他对称加密算法? - -两种回答: - -* 这个我没想过:sob: -* 我在完善项目时**不侧重于**将其与其他算法比较,而是把**精力更多地放在**DH算法的改进和优化上。 - -针对第二个回答,面试官会追问,那有哪些优化呢?而这个恰恰是我背得滚瓜烂熟的地方😍。 - -### 关于实习 - -实习重要吗?很重要,我去提前实习后,更清楚了企业看中实习经历的原因:**节省培养成本**,更快上手业务。 - -没有实习经历可以吗?可以,如果时间紧迫,秋招/春招前没有实习机会,那就花时间**把实习期需要学习的事情去做一做**,例如:学习GIT,搭建博客,学习开源项目,学习linux等(当然这些我实习前都没做,是实习的时候才知道的:joy:),这些放在简历上也是加分项。 - - -## 与代码随想录的故事 - -### **算法** - -今年二月初,刷题的时,看到carl哥的题解,觉得讲得很不错,关注了微信公众号:代码随想录。于是我就按照刷题攻略的顺序进行刷题,题解讲得很详细。在秋招前我几乎把当时所有题都刷完,而且刷了好几遍。面试时的出题命中率**真的很高(字节,蚂蚁的出的所有算法题都被包含在内)**,即使不是原题,实现的算法也是类似的。 - - - -### **公众号文章** - -公众号里的文章我也非常喜欢,比如各城市互联网公司的总结,之前一直没太注意这个事情,觉得头部不就是那几个大厂吗?冲就完了。秋招过后觉得这篇文章还是挺有用的,因为眼光**不能只局限于互联网大厂**,并不是任何时候都应该向大厂冲,适合自己才是最重要的。 - - - -### **知识星球** - -后来卡哥开了知识星球,我马上就申请进来了,这段时间一直在打卡,督促自己学习。星球上主要分为两大块内容:打卡系列和问答系列。 - -- 打卡系列,记录着各位同学的每日学习情况,其中有不少文章都总结得用心。 - -- **问答系列(对我帮助很大)**,主要包括**offer选择**,**学习路线**,**学习建议**;每天都会有同学提出自己的问题(当然我也问了不少),carl哥的回答很真诚,**也很有参考价值。** - - - -## 小结 - -秋招已告一段落, 这段时间真的经历了很多事情,虽然现在对结果没有很满意,但也积累了一些经验,走一步看一步吧。 - -大家可以结合着我的经历思考这么一个问题:**知识掌握到什么程度可以拿到一个什么水平的offer**?最后,祝大家都能拿到自己满意的offer~ - diff --git "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\347\247\213\346\213\233\346\200\273\347\273\2232.md" "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\347\247\213\346\213\233\346\200\273\347\273\2232.md" deleted file mode 100644 index 897a7ec3ec..0000000000 --- "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\347\247\213\346\213\233\346\200\273\347\273\2232.md" +++ /dev/null @@ -1,48 +0,0 @@ -

- - - -# 倒霉透顶,触底反弹! - -星球里不少录友秋招已经陆续结束了,很多录友都在[知识星球](https://programmercarl.com/other/kstar.html)里写下了自己的秋招总结,但今天这位录友很特殊,甚至我给她修改简历的时候我都“有点愁”。 - -他的秋招过程也是极其坎坷,**逼签、被养鱼最后收到感谢信、校招流程收到实习offer,还有数不清的简历挂……**,可能是太倒霉了,最后触底反弹,接到了百度的offer,虽然是白菜价,但真的很不错了。 - -这篇总结并没有说学习路线,而是说一说她自己的感想,算是另一个维度,感觉会对大家很有帮助,所以我也分享出来。 - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211114111745.png) - -以下星球原文: - -------------- - -秋招终于结束了,收到了百度C++开发、小米C++音视频开发、深信服C++开发、知乎go后端、神策java后端的offer,不是啥大佬,全是烂白菜,但是作为一个双非本的孩子,我觉得已经很幸运了,最终无脑选择了百度,春招还会再冲一波。 - -**星球里的学习气氛很好,向卡尔哥问过好几个问题,每个都挺长,卡尔哥也给我耐心解答过,还帮我改过简历,感谢和大家相遇!** 关于学习路线大佬们说的很详细了,我觉得参考他们的已经足够有价值。**那我就为星球里还在奋斗的兄弟姐妹、以及学弟学妹们写一下我的一些其他的感想**。 - -1、**准备一定要趁早**。我是今年1月份准备的实习,那个时候我连C++智能指针都不知道,就一直陆续学着,6月份上岸滴滴实习,8月下旬跑路,可以说9月份才开始大规模投递。我是很菜的人,还不算勤奋,秋招不至于空手而归就是找实习的时候还有些积淀。 所以最大的感想就是,一定要越早越好,我认为理想的时间节点:3月份去实习,7月份投提前批,所以什么时候去准备可以根据这个时间去准备,当然越早越好。越早企业越缺人,越好进。 - -2、**多面试,哪怕实习不了也要多面试;多投简历,投了就有机会**。我没啥自主学习的意识,只有在要面试的前一个礼拜才会多少看点,还记得当时收到第二天就要腾讯面试的消息,前一天晚上我几乎通宵了,虽然最后还是挂了。但是我当时真的是要面试的恐惧支配着我学习 。 - -3、**八股文、看书和刷题**。实习面试的话看八股文还是能应付过去的,但是我看了大多数八股文感觉千篇一律,想真正化为自己的东西还是要看书,我一般喜欢看书,然后把书上的东西化为自己的理解记在笔记上。 刷题也是,我一般喜欢根据自己的理解把题归类,自己写题解。 - -4、**实习。我觉得实习比较好的时间节点是3月份(或者更早)**,暑假去实习如果不能保证转正,感觉还是有点耽误提前批,提前批是最最最好进大厂的一次。像我的话,白天工作一天到晚上九十点,回家就只想躺着,再遇上比较push的工作环境,做到实习和复习兼顾是有点难的。我觉得核心竞争力应该是基础知识的掌握程度,身边确实没有实习、但是基础和项目足够牛批的人也能进大厂,所以还需要做一个平衡吧。当然也不是劝退,实在平衡不了的话就要要根据自身情况吧。 - -但是实习确实让我简历好过了一些,这个就是实习最大的好处之一,但是我感觉像美团腾讯百度的话,如果笔试面试还可以的话,应该不太卡简历的。字节后端确实有点卡实习,还有一些没那么大但是也很强的厂是卡学历或者实习的。 - -5、还有秋招不要all in,不要all in ,不要all in!!! - -以上就是我的一些感想,可能仁者见仁智者见智,希望大家多多指正。 - -我的秋招真的不是很顺利。逼签、被养鱼最后收到感谢信、校招流程收到实习offer,还有数不清的简历挂……,但是最后也有好的结果了,其实想的比较开,大不了就春招再进大厂呗。本来都要打算春招了,书都买了几本,但是没想到能收到百度意向,已经开始流程推进啦。 - -可能这就是倒霉透顶了就触底反弹吧。**一直觉得自己倒霉透了,奇葩的时间都被我遇上了,但是最后还是被好运眷顾了一下**。我的学校还是双非本,很一般的学校,所以任何时候都有机会,拿到offer不光是实力因素,运气成分也很大,大家一定要多投多面,万一哪次就上岸大厂了。 - -**还是想参与一下春招,但是现在发现躺着太舒服啦**。还是得卷起来,争取以后能每天在星球里打卡哈哈 - -祝愿各位都有理想的offer!所愿皆所得! - -------------- - -以上就是星球里的原文,所以这位录友现在又可以愉快的在星球里,每日打卡了 哈哈哈。 - diff --git "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\347\247\213\346\213\233\346\200\273\347\273\2233.md" "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\347\247\213\346\213\233\346\200\273\347\273\2233.md" deleted file mode 100644 index 05a677ed81..0000000000 --- "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\347\247\213\346\213\233\346\200\273\347\273\2233.md" +++ /dev/null @@ -1,83 +0,0 @@ -

- - - -# 秋招面试,心态很重要! - -其实无论社招,还是校招,心态都很重要,例如,别人那个一堆offer,自己陷入深深的焦虑。 面试分明感觉自己表现的不错,结果就是挂了。面试中遇到了面试官的否定,然后就开始自我怀疑,等等等。 - -如果你也遇到这些问题,可以认真读完[知识星球](https://programmercarl.com/other/kstar.html)里一位录友的总结,他是非科班,机械转码,今年5月份加入的星球,坚持打卡几个月,如果也获得自己心仪的offer,他的心路历程对大家会很有启发。 - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211121093438.png) - -以下原文: - ----------------------- - -写在最前:作为最一般的秋招选手,希望能对和我有相似经历的录友提供一些帮助。 - -1、个人情况:本硕211机械转码,无竞赛,无实习。转码原因:机械的工资真的不高,也不是很喜欢天天画图的生活;导师教本科C/C++语言,研一当助教重新学了一下C++。 - -2、加入星球: - -3月份开学决定转码,3月到5月看C++primer和刷题,之前也是按题目顺序刷,效果一般。我是在LeetCode刷题的时候看到Carl哥的题解,然后关注随想录的GitHub,刷完链表在5.27决定加入的星球(那时还没有优惠,哈哈)现在也快半年了,那段时间是我最慌的时候,毕业课题没做完,秋招准备的也不行。刚看完C++ Primer,刷了几十题的状态。就是在星球打卡的这段时间学习比较认真,让我走过了比较难的一段路,感谢Carl哥的指导和各位录友的输出。(用Forest防止玩手机并记录了一下,6~9月平均学习15000分钟) - -3、秋招历程: - -6月到7月,C++基础就每天看一条《effective C++》,操作系统和计算机网络看书来不及就准备找网上大佬的精华过一遍然后直接面经。我找的是小林大佬的图解网络+图解操作系统,阿秀大佬的面经。(每日一问的主要来源)。 - -刷题大概每日一题+3道随想录+2剑指offer,7月完成一刷,8月底完成二刷。一刷的时候白天在LeetCode提交之后,晚上会在本子上手写总结一遍,理一理思路。二刷的时候就在Typora上快速记录了一下,节约时间。开始面试的时候题量:二刷完随想录+剑指offer,一共350题左右。在刷完以后可以上CodeTop刷各公司部门岗位的高频题。 - -7月份有的公司就陆陆续续开始提前批了,虽然知道提前批不需要笔试多一次机会,但是因为自己简历项目一块还比较单薄,一直没有进行投递。7月底买了《高性能服务器编程》一周多看完,然后做了一个基础的Web服务器,有不懂的就上网搜类似的解析。自己画了一下流程图之类的梳理了一下大概思路。第二个项目就是Carl哥的跳表项目,不是很长,主要是理解跳表这个数据结构,自己画一画就清楚了。 - -8月底开始投简历,对自己定位比较明确,主要以中厂为主,大厂随缘。8月底开始基本每天都有笔试,9月开始面试,一直到10月下旬结束秋招。面试的时候主要是录音,结束后进行面试总结,包括面试问题,手撕代码,面试表现(回答问题思路是否严谨,吐词是否清晰)。 - -其余关于实习,竞赛,面试的经验可以参考星球里其他大佬,哈哈哈。我感触比较深的是心态问题,这里写一写我自己遇到的心态问题和感想。 - - -4、心态很重要: - -心态问题1:同学或室友提前批就拿到了30大几w甚至更高的的offer,自己才开始笔试,说不羡慕是不可能的,有几天晚上都有一点焦虑没有睡好。这可能是因为自己并没有全力以赴,害怕因为自己的不努力而失去机会,后来每天都在按计划学习,每天都比较充实,抱着努力不后悔的心态。当你一心学习的时候就不太会一直考虑让自己焦虑的问题,总之一句话,冲就完事了。 - -心态问题2:总感觉自己没有准备好而不敢投简历。项目没准备或者面经记得不熟。其实投了简历以后还会有一段时间,包括HR筛简历,测评笔试才到面试,所以能投尽早投,在面试之前有压力的时候复习效率比较高的。 - -心态问题3:面试时的心态:心里默念一定要思考一下,然后慢慢说。我有一次面试,前面几个问题不是很顺利,然后问了我一个我会的,我就把我想到的一股脑说出来,我想着终于遇到一个我会的了,自我感觉良好,结果面试结束复盘的时候才发现,那个问题说的不是很全面而且说的比较快,面试官感觉可能很一般。 - -心态问题4:有时可能会紧张的不行,导致本来自己知道或者有思路而因为紧张语无伦次没有表达出来,从而影响面试表现(可以事先准备好自我介绍,流畅的自我介绍在一定程度上可以建立信心,减缓紧张。参加一些模拟面试,找同学模拟或者在网上模拟,还可以录一下视频,看一下自己的表现怎样,有什么地方需要注意;找一些中小厂练手实战也不错) - -心态问题5:面试后的心态,可能有时候觉得自己表现还不错但是面试挂了而愤愤不平,或者和同学一起面一家公司,同学过了,自己挂了。这个时候需要把心态放平,及时总结自己的面试表现,可能没有你想象的那么好。而且面试主观因素挺多的,结果和面试官有很大关系,所以做好自己,尽人事听天命。 - -心态问题6:面试过程中可能会遇到比较不好的面试官,导致面试体验比较差而影响自己的心态,这个时候也是需要及时发泄,不要自我否定或赌气,想着后面还有更多的机会,把更多精力投入到下一次面试或笔试中。我遇到的面试官都比较nice的,希望大家也一样! - -5、写在最后: - -最后对主要面试结果做一个总结:腾讯(笔试挂),百度(二面挂),最后拿到的:华为通用软开,深信服C++开发,科大讯飞C++,中电28所,30所。最后选择离家近的成都华为,总的来说虽然没去成大厂,但是自己已经很满意了。 - -最后的最后:说的有点多,比较啰嗦,感谢大家能看完。希望大家一定不要放弃,相信自己,能拿到自己想要的offer!! - ---------------- - -可以看一下这篇总结在星球下的评论: - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211121094859.png) - -**他在星球里知名度还是很高的,为啥知名度这么高呢?** - -因为他坚持几个月的打卡,而且打卡质量非常高,所以星球里的录友们都认识他。 - -来看看他的打卡内容: - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211121095337.png) - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211121095415.png) - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211121095712.png) - -我只是随便选了几条,他有将近200条的打卡记录,如果大家也在准备明年秋招,可以进星球里看看他的每日的打卡记录,相信会对规划自己的学习计划,任务安排 都很有帮助。 - -而且星球里的学习氛围会让你惊讶,原来有这么多大佬,还这么努力。 - -![星球氛围好](https://code-thinking-1253855093.file.myqcloud.com/pics/20211018000722.png) - -![看星球里的内容收获满满](https://code-thinking-1253855093.file.myqcloud.com/pics/20211025182654.png) - diff --git "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\347\247\213\346\213\233\347\232\204\344\270\212\345\215\212\345\234\272.md" "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\347\247\213\346\213\233\347\232\204\344\270\212\345\215\212\345\234\272.md" deleted file mode 100644 index 6c81757745..0000000000 --- "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\347\247\213\346\213\233\347\232\204\344\270\212\345\215\212\345\234\272.md" +++ /dev/null @@ -1,55 +0,0 @@ -

- - - - -# 秋招上半场的总结 - -八月份已经接近尾声,不少录友已经在[知识星球](https://programmercarl.com/other/kstar.html) 已经总结了秋招的上半场。 - -![](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/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\347\247\213\346\213\233\350\277\233\350\241\214\344\270\255\347\232\204\350\277\267\350\214\253\344\270\216\347\204\246\350\231\221.md" "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\347\247\213\346\213\233\350\277\233\350\241\214\344\270\255\347\232\204\350\277\267\350\214\253\344\270\216\347\204\246\350\231\221.md" deleted file mode 100644 index 24e7760cb9..0000000000 --- "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\347\247\213\346\213\233\350\277\233\350\241\214\344\270\255\347\232\204\350\277\267\350\214\253\344\270\216\347\204\246\350\231\221.md" +++ /dev/null @@ -1,55 +0,0 @@ -

- - - - -# 秋招进行时,其实大家都很焦虑 - -大家应该都发现了,提前批和秋招都越来越提前的,大部分的录友此时的心态还是挺焦虑的。 - -特别是大三的同学吧,同时面临这找工作和考研两个方向的诱惑。 - -一位录友就在[知识星球](https://programmercarl.com/other/kstar.html)问了我这个问题: - -![](https://code-thinking-1253855093.cos.ap-guangzhou.myqcloud.com/pics/20210724183240.png) - -其实 互联网35岁中年危机,应该吓退了不少小鲜肉,互联网35岁中年危机是真的,网上哪些关于裁员的消息 大多数也都是真的。 - -但我想说:特别是正在找工作的同学,大家应该都是 95后,00后,可以先不用想那么长远,能把未来五年规划好,就不错不错的了,现在行业的变化,都是两三年一变天,等大家35岁的时候,都不一定啥样了。 - -而且卡哥还替大家先趟趟路,哈哈哈 - -现在的大三,最忙的就是两伙人,**考研的和找工作的,这两条路都挺难的**。 - -另外还有不少录友应该在考研与找工作之间摇摆。可能有的学校大多数都在找工作,有的学校大多数都在考研,不过应该考研占绝大多数。 - -关于考研我的观点是,如果 本科毕业能拿到大厂或者中厂offer,可以不考研,看看自己比较优秀的学长学姐,毕业都去哪了,是否去了大厂,如果比较优秀的学长学姐 就业也一般,我还是推荐读研的,因为顺便也提升一下学历。 - -但有的同学是从大一入学就规划了自己 以后直接工作的,这种无论学校如何,我都是比较支持的! - -**因为从大一就明确自己的方向,按找工作的要求来学习,一般来说 最后找工作都不会差**。 - -最危险的是,大一大二没计划,到了大三开始摇摆,考研还是找工作。这种是最危险的,如果在纠结一阵纠结到 现在的话,那基本哪条路都走不好了。 - -对于现在找工作的录友,可能发现身边的同学都在考研,而且在准备找工作中,可能还没有明确的学习计划,东打一发西扯一下,就会很焦虑,主要也是身边一起工作的同学可能不多,交流的少。 - -找工作是一个累心的过程,非常累,恨不得哪家公司赶紧给我个offer,让我干啥都行,甚至怀疑自己是不是要再去考研。 - -**其实这时候,不是自己方法不对,也不是自己选择的路错了,而是需要一个过来人,给你打打气**。 - -静下心来,把最近开始面试的公司排一下,把自己还要学习的内容做好计划,都列出来,按着一步一步去执行,心里会踏实的多。 - -再说考研,考研也一点都不轻松,进大厂卷,**现在计算机考研比进大厂还卷(特别是名校计算机)**,如果考研没考上,找工作还挺难的,毕竟考研那套知识,对于找工作来说几乎没啥用。 - -所以不论是找工作,还是考研,大家都是一样的焦虑,每条路都不好走,但自己一旦选择了,就坚持下来,走好自己的路。 - -话再说回来,**现在不论身在什么阶段,都离不开“卷”,就算最后进了大厂工作,依然也是卷**。 - -大家都感觉自己准备面试好辛苦,好心累。其实给你面试的面试官,可能自己手上的模块线上又出问题了,还要担心年底是不是要背锅了,是不是年终没了,晋升不了了,是不是要准备跳槽了,甚至应届生的工资比自己的还高 等等。 - -**所以面试官也许比你还心累!** - -是不是想到这里,心里就舒服点了,哈哈哈哈,其实是有时候自己很迷茫但没有人沟通,就会陷入一个死循环,只要和过来人聊一聊,没啥大不了的。 - -大家其实这这样。 - diff --git "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\350\213\261\350\257\255\345\210\260\345\272\225\351\207\215\344\270\215\351\207\215\350\246\201.md" "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\350\213\261\350\257\255\345\210\260\345\272\225\351\207\215\344\270\215\351\207\215\350\246\201.md" deleted file mode 100644 index 5ee7fc2dc0..0000000000 --- "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\350\213\261\350\257\255\345\210\260\345\272\225\351\207\215\344\270\215\351\207\215\350\246\201.md" +++ /dev/null @@ -1,58 +0,0 @@ -

- - - - -# 对程序员来说,英语到底重不重要 - -在[知识星球](https://programmercarl.com/other/kstar.html)有一位录友问了我这么一个问题。 - -![](https://gitee.com/programmercarl/pics/raw/master/pic1/20210605193955.png) - -这个问题我曾经在上学的时候也思考过。 - -这次正好来好好说一说。 - -当时我搞ACM的时候都是英文题目的,哪会有中文题目,现在力扣全面汉化也是最近几年的事情。 - -如今又工作了这么多年后重新看待这个问题,又有更全面的看法了。 - -其实我想说,**对英语对程序员即重要,也不重要!** 这是要看环境,看背景的。 - -如果你现在在准备秋招,或者是跳槽,目标是冲刺国内大厂,那么暂时不用花费精力学英语,就算四级都没过,大厂面试官也不会问你过没过四六级的。 - -貌似华为对英语四六级是有要求的,如果面试BAT,英语不是关键性问题。 - -但工作之后,英语其实就很重要了,也要注意程序员英语和普通英语是不一样的。 - -一手的技术资料,和优秀的问答 基本都是英文的,国内的资料都是别人嚼过的,质量参差不齐。 - -而且国内的问答社区其实环境并不好(懂的人都懂),真正解决问题,还得靠Stack Overflow。 - -**所以技术文档(英文),Stack Overflow , Quora才是程序员的利器**。 - -工作以后如果你把程序员英语(注意不是普通英语)练好,其实对技能和视野的提升是很有帮助的。 - -这里为什么强调是程序员英语呢, 因为有太多专业词是CS特有的,而不是日常英语。 - -**继承,多态,变量,英文怎么说? 估计可以难住不少人了**。 - -所以当我们查问题的时候,第一反应 一定是用 中文关键词去搜索,因为我们不知道对应的英文关键词(也懒的去查一下)。 - -所以英语好,这是一种技术壁垒,可以任意遨游在中文和英文的世界里,有两极的思考! - -**那么对程序员来说,英语口语重要么?** - -如果你直接想去外企的话,练一练吧,也是挺重要的,如果在国内的话,用处不太大。 - -那一定有人说了:练好口语 一定是有利的。 - -这个我也 赞同,练啥其实都有有利的,但我们要看**投入产出比** - -我在学校的时候英语口语还是挺不错的,当时学校的留学生我基本都认识,和他们扯扯皮没问题,可工作这些年之后,全!都!还!回!去!了! - -所以如果练习口语,一定要有目标,要么就是雅思托付考试要出国,要么就一定要去外企找机会transfer美帝,这样有一个环境可以一直保持下去。 - -否则,花费大量时间练习,其实仅仅是感动自己,过不了多久,就都还回去。(例如说我,哈哈哈哈) - - diff --git "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\350\246\201\344\270\215\350\246\201\350\200\203\347\240\224.md" "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\350\246\201\344\270\215\350\246\201\350\200\203\347\240\224.md" deleted file mode 100644 index 180e5d13cb..0000000000 --- "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\350\246\201\344\270\215\350\246\201\350\200\203\347\240\224.md" +++ /dev/null @@ -1,45 +0,0 @@ -

- - - - -# 到底要不要读研 - -在[知识星球](https://programmercarl.com/other/kstar.html)里讨论了一下关于要不要读研的问题。 - -![](https://gitee.com/programmercarl/pics/raw/master/pic1/20210613230829.png) - -其实不少同学纠结于计算机专业要不要考研。 - -我的观点是 **如果认为自己本科毕业 可以拿到大厂的研发岗offer,那么就不用读研**(除非保研到一个特别好的学校了)。 - -那么怎么能发现自己本科毕业能不能拿到大厂offer呢。 - -看看自己学生学哥学姐,大部分人的就业去向,如果很多都可以进入大厂,那么就可以追寻他们的足迹。 - -如果自己学校本科毕业,就业比较一般,那么就去读研吧。 - -当然这里还有一个情况,就是算法岗,算法岗一般要求研究生学历以上。但算法岗现在很卷,985高校研究生,找算法岗的工作都很难,既要顶会,也要coding的能力。 - -目前的现况是很多搞AI的985研究生都在转研发岗,**但如果你依然立志从事人工智能(说明是真的热爱),那么就去读研吧**。 - -研究生毕业去做研发岗和本科毕业做的研发,其工作其实没区别。那么为什么读研呢。 - -现在环境就比较卷,两个候选人,实力差不多,一个本科,一个研究生,价钱也差不多,那么大厂就要个研究生呗,在招生简章里看着也好看,说明公司都是高学历人才。 - -当然一般来说 研究生毕竟又多读了 两三年,普遍会比本科强一些。 - -**PS:大厂研发岗校招本科和研究生薪资几乎没啥差别**。 - - -那么话在说回来,**如果打算考研,那么就争取更好学校的研究生,提升一下学历,把考研所付出的努力最大化**。 - -最后关于本科生要不要读研: - -* 本科如果有实力去大厂做研发,那么就去! - -* 如果本科去不了大厂,可以考虑考研,考研是一次提升学历的机会,一旦选择考研这条路,就给自己点压力! - -* 如果知道AI岗位目前就业情况,依然要立志从事AI,那么就去读研 - - diff --git "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\351\200\274\347\255\276.md" "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\351\200\274\347\255\276.md" deleted file mode 100644 index f75e364218..0000000000 --- "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\351\200\274\347\255\276.md" +++ /dev/null @@ -1,51 +0,0 @@ - -# 遭遇逼签,怎么办? - -最近各大公司陆续开奖了,也有不少公司开始逼签了。 - -为什么会有逼签呢,无疑就是 这家公司你不太想去,但还想要一个保底(备胎),同时这家公司也知道自己竞争力可能不是很大,也不想当大家的备胎,所以就要三天内必须签三方。 - -如果是心仪的公司要求三天内签三方,我相信大家就没有被逼签的感觉了,哈哈哈 - -[知识星球](https://programmercarl.com/other/kstar.html)里很多录友都问我,XX公司又要逼签了,怎么办。 我在公众号也分享一下,希望对大家有所帮助。 - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211017093816.png) - -以下是我的回答: - -TPLINK 的嵌入式,确实有点偏,但钱给的还真多 (估计是发现不好找人了)。 - -从发展来看,当然百度 虾皮 是首选,百度一般薪资不高,但我估计 虾皮薪资应该可以。 - -虾皮如果 10月底 才下offer的那,一般有更好的offer的同学 指定早就签了,我估计虾皮是能接受 毁约三方 也就是等你毁约三方,再签虾皮的 (注意,这是我猜的),要不 10月底 在下offer,优秀的毕业生遭抢没了。 所以如果能联系上HR的话,可以问一问,是否一定要三方。 - -你去签 TPLINK 三方的时候 也问问,毁约的流程,TPLINK 什么时候会退给你三方,如果是 TPLINK HR很坚决 不接受毁约的话,就等百度 和虾皮吧,到时候谈薪资的时候 拿tplink这个作为依据,高点要薪资。 - -如果 TPLINK HR 能接受毁约,给出 毁约 流程的话,那就签了。 (但这里不能排除 HR 口是心非,说是能毁约,最后不给你退三方的情况,所以多问问 有没有师兄毁约 TPLINK成功的) - -我当初校招的时候签的就是华为,也给三方了,毁约去的腾讯。我腾讯都入职了,华为才把三方退回来,我在补上三方,所以腾讯是不要求三方的,只要人去了就行。这个也看公司的。 - -------------- - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211017094407.png) - -以下是我的回答: - -7月开始自学c++,秋招就能拿到这些offer已经很棒了👍 - -先看逼签的这两家,其实我都不太了解,我的朋友们主要都在互联网圈,所以 没有认识的朋友在这两家公司。 - -不过 thoughtworks 网评不太好,说是外包公司, 中孚信息 至少是土生土长的企业,做网络安全,也是上市公司,至少会靠谱一些。 - -华为成都 光产品线的测开,如果你想真的有增进技术的心,测开就稍差了一些。 - -相对来说 小米南京的offer 还不错,但还在池子里。 - -如果逼签的话,优先考虑中孚吧。 - -关于 好好沉淀准备春招 当然是可以的,但不是每个同学都是劲再去冲春招了,找工作都是一鼓作气,如果你还能高强度的准备面试冲刺春招,当然是好的。 - -关键是 还有外部因素,毕业的事,以及大家该保研的保研了,找到工作了都吃喝玩乐了,天天聚餐,这个氛围下,你还能不能继续高强度冲刺了, 这才是你要考虑的。 - -加油💪 - diff --git "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\351\235\236\347\247\221\347\217\2552021\347\247\213\346\213\233\346\200\273\347\273\223.md" "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\351\235\236\347\247\221\347\217\2552021\347\247\213\346\213\233\346\200\273\347\273\223.md" deleted file mode 100644 index b92420addb..0000000000 --- "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\351\235\236\347\247\221\347\217\2552021\347\247\213\346\213\233\346\200\273\347\273\223.md" +++ /dev/null @@ -1,117 +0,0 @@ - -

- - - - -# 非科班,收获满满! - -九月份悄然已过,秋招已经快接近尾声了,星球里已经纷纷有录友开始写这次的秋招总结。 - -其中一位录友写的很好,所以想分享出来 给公众号上的录友也看一看,相信对大家有所启发,特别是明年要找工作的录友,值得好好看一看。 - -这篇总结首发在代码随想录[知识星球](https://programmercarl.com/other/kstar.html)上,立刻就获得了60个赞,很多评论,我这里放出一个截图: - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210929220903.png) - -以下是星球上该录友的总结: - --------------------- - -211本硕非科班菜鸡转码不到一年,从最开始的迷茫到后面认识到差距的焦虑再到后面逐渐恢复坦然的心态,一路起起伏伏,但也算连滚带爬的趟了过来,**感激一路上耐心为我答疑解惑的各路大佬,尤其是咱们卡哥哈哈**。 - -秋招收获如下(按收到意向顺序): - -* 诺瓦星云 西安 软件开发工程师 提前批意向书 -* 字节跳动 抖音客户端开发工程师 提前批意向书 -* 滴滴 网约车部门后端开发工程师C++/Go 提前批意向书 -* 腾讯 IEG光子工作室技术中心测试开发 正式批意向书 -* 美团 基础研发平台后端开发工程师JAVA 正式批意向书 -* 阿里 阿里云计算平台后端开发工程师C++ 正式批意向书 - -被终结的岗位: -* 蔚来 提前批后端三面挂 -* 百度/京东 后端提前批无音讯,正式批笔试我就都拒了 -* 网易 正式批一面过,但感觉不喜欢,二面就放弃了 -* 虾皮 提前批二面挂(北京hc太少,卷不动,秋招甚至直接不放岗) -* 蓝湖 提前批二面挂(面完字节三面之后半个小时紧接着蓝湖二面,字节面了两个小时,人都麻了,强烈建议大家面试不要排太挤!!) -* 招银网络 正式批一面过,二面放弃 -* 商汤、oppo、知乎 提前批简历挂,后面懒得投了 - -# 秋招历程 - -## 开始准备 - -最开始的准备是从**去年十月份左右开始**,那个时候刚开始意识到自己将来找工作的问题,就选择了一门自己相对来说有一些基础的C++开始入手学习,看到网上的很多经验都说语言不是最大的问题,能学好一门后面转型都很快,所以并没有在这个问题上有什么纠结,大家看我拿到的岗位也可以发现事实确实如此。 - -**从十月份开始看C++ Primer这本书**,断断续续花了三个多月,确实拉胯。 - -当时主要是事情太多,而且我在熟悉完主要的语法和特性之后,大概一个月的时间吧,就开始上手刷leetcode了,入门真的很痛苦,递归啥的看一遍忘一遍,一天吭哧吭哧弄下来也就两三道题,还基本都不是自己写出来的,因为我光理解别人的方法就需要很长时间。 - -**后面刷题解刷到了卡哥,着实幸运,跟着卡哥的题解我也逐渐有了自己的方法模式和比较规范的代码风格**,所以到后面尽管有时候会发现也会有比卡哥更好的方法,我还是愿意先上手走一遍卡哥的思路,之后再补充别的。 - -**不得不说,题解能跟住一个人确实很有必要**,有的题卡哥没有出题解,我也是先找到之前卡哥类似的题目找思路,再自己写出来。整个刷题的流程持续到过年,我就开始刷剑指offer了,基本简单题都可以撕,中等困难的还是只能看题解。 - -我个人的经验是不愿意在思考题解上浪费太多时间,**如果打眼一看就知道自己不太可能做出来,我会选择直接看题解**,省下的时间哪怕自己多敲两遍也比对着屏幕发呆效率高,毕竟面试考察的不是你创造算法的能力,会用就行了,当然这只是个人见解,大佬息怒。 - -刷完剑指offer大概花了半个月的时间,**时间也来到了三月份**,周围的不少人已经开始找春招实习,但更多的人还是和我一样,由于各种原因没法去找实习。 - -这个时候各种情绪都会有,焦虑,迷茫,没办法,改变不了现实情况只能尽可能的提升自己。 - -这个时候我的算法已经比较熟练了,基本一天不用太多时间也能过四道题,尽管其中仍有不少是对着题解敲的,但是对别人思路的理解确实已经练得轻车熟路了,我觉得这也是一种进步吧。 - -**四月份开始准备项目**,没错,就是烂大街的webserver,大家都知道这个项目烂大街,但是经过后面的各种面试我也发现,不管你是什么项目,对于面试官来说都很基础。 - -哪怕是大厂实习的人又有几个能接触到核心,当然这也是对大部分人说的,实习大佬勿喷。**所以面试考察的就是你对基础的掌握**,就算你讲了项目各种高大上的方法,虽然可能有加分,但也是在给自己埋坑。 - -比如面试官可能问你有没有看过这个技术具体实现源码等等。 - -**把自己捧的越高,一旦被发现基础有漏洞,摔得也越惨**,面试官对每个人都会有一个心理预期,比如我可能就因为非科班占了一些心理预期比较低的便宜,也就是不容易让对方失望,客户端我0基础,测开0基础,但是都过了,当然像我这样的坏处就是offer大概率只是白菜,所以综合来看有利有弊,大家自己权衡。 - - -**搞这个webserver连带各种计网,操作系统的学习花了两个月的时间**。之后便开始了面向面经自习的流程。 - -这个时候算法题基本不再做新的了,力扣累计刷题已经接近400,我知道里面不少题就算再拿给我,我也不一定会做,所以做新题有什么意义呢,能把之前的高频题,热题刷好就已经超过很多人了。 - -因为之前做题都是自己按标签做,后面看到卡哥出了系列题解,基本都是我之前做过的,所以**花了一周左右就把卡哥的pdf全过了一遍,帮助很大**。 - -## 提前批 - -**后面六七月份的提前批我参与的不是特别积极**,和大多数人一样,我也总想着自己还没准备好,但是总得跨出第一步,所以就先找了一些小厂练手。 - -不过牛客上投的小厂基本都没有音讯,真正想投递还是官网最靠谱。 - -诺瓦是我的第一份offer,所以尽管我大概率去不了,我依然心怀感激,**因为经历过的人都知道第一份offer对于一个迷茫的秋招生来说是多么的宝贵**。 - -后面拿到字节和滴滴我着实没有想到,因为感觉自己的表现还有待提升,但能过肯定是开心的。 - -**提前批没有笔试,所以七月份的提前批窗口确实非常宝贵**。 - -## 正式秋招 - -八月份之后就比较正常了,基本就是笔试,面试等等,**可以分享的一点是腾讯、阿里这种大厂不是特别看重笔试**,因为很多人在笔试之前就走完面试流程了,但是对于有一些劣势的同学还是希望能认真对待笔试,争取让自己多一个闪光点。 - -后期的算法题主要都集中在高频题、热题上面,所以还是应该把剑指刷好,配合别人分享的面经来巩固,**卡哥的算法pdf可以多看多复习**,就算没有考到也会让自己安心一些。 - -同时对于基础知识的整理更多的应该从面经中获取,我个人秋招下来总共看了得有至少500份面经,其实别人的面经和自己面试没啥区别。 - -同时也因为看了太多的面经,我自己的面经就不需要太多的整理了,除了一些没答上来的关键问题,因为基本都被之前的涵盖了,所以与其海投参加一些不靠谱的面试,倒不如整理十份面经来得实在。 - -参加面试主要是锻炼临场的心态,但是大厂和小厂的面试确实是有区别的,所以大厂的面经一定要多看多整理。 - - -## 感想 - -一口气写下来就已经2000字了,最后还是多说两句,分享一点感想吧。 - -**除了超级大佬,基本每一个秋招生都会有过迷茫,焦虑的心路历程**。 - -一方面我们需要认识到自己的局限性,认清现实。 - -另一方面也应该看到自己能改变的现实,许多人的时间真的只是在盲目的焦虑中虚耗,这是一个死循环,浪费的时间越多后面只会越焦虑,唯一的方法就是打起精神行动起来。当然也不用把自己逼的太紧,找到合适的排解方式,比如打会儿球打会儿游戏,让自己运行在一个正确的,符合自己节奏的轨道上不断前进。 - -**面试是玄学,有些人的就是难,有些人的就是简单**,没有人能保证你每次都简单,但也不会每次都难,我们努力提升实力只是为了能创造更多机会,并在机会出现的时候把握住。 - -我觉得一个人最大的幸运就是付出的努力能有收获,所以我希望大家都能幸运地结束秋招,也希望我能继续不忘初心,保持谦逊。秋招只是人生的一段小插曲,未来的路还有很长很长,写下这篇流水账结束我的秋招,也希望能与诸君共勉,加油! - - diff --git "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\351\235\236\347\247\221\347\217\255\347\232\204\345\233\260\346\211\260.md" "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\351\235\236\347\247\221\347\217\255\347\232\204\345\233\260\346\211\260.md" deleted file mode 100644 index 470b233b59..0000000000 --- "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\351\235\236\347\247\221\347\217\255\347\232\204\345\233\260\346\211\260.md" +++ /dev/null @@ -1,54 +0,0 @@ -

- - - - -# 非科班的困扰! - -在[知识星球](https://programmercarl.com/other/kstar.html) 里很多录友都是非科班转码的,也是要准备求职,或者准备明年秋招,非科班的录友其实对 准备找工作所需要的知识不太清楚,对其难度也不太清楚,所有总感觉准备起来心里没有底。 - -例如星球里有这位录友的提问: - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211024102300.png) - -我在知识星球里,给出了详细的C++后端学习路线,包括计算机基础的学习路线, - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211024103006.png) -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211024103108.png) - -当然路线很长,这里我就截图了一部分。 - -但即使这样,其实非科班的录友也不容易量化具体的工作量究竟多大。 - -以下是我对这位录友的回答: - ----------------- - -具体学习时间 一般是不好量化的。 - -一本书,有的同学 一周就看完了,有的同学 两个月看不明白,**基础程度,学习速度,每天的投入时间,以及效率**都是不一样的。 - -**所以要靠自己 规划时间,自己是最了解自己的**。 - -C++primer 不要耗太久,差不多就去看 effective C++。 - -还有计算机求职需要准备的知识不是线性排列的。 - -例如很多非科班的录友可能会这样安排: 几个月搞定编程语言,几个月搞定算法,几个月搞定操作系统! - -**如果这么学的话,那就凉凉了**。 - -求职准备主要围绕这么几块:编程语言 + 算法 + 计算机基础(操作系统,数据库,网络,设计模式)+ 项目 。 - -**这几块都可以一起搞的,一天都要分配点时间,知识错开点来学,效率更高**。 - -每一块知识,每天都要投入一点,例如,例如一天算法几个小时,编程语言几个小时,计算机基础几个小时,项目几个小时,这样分配,当你发现 操作系统比你想象中的难,你就 下周及时调整计划,操作系统每天多分配时间。 - -**正常的学习节奏是这样根据自己的掌握程度动态调整的**。 - -在整体进度上,可以先保证都过一遍,第一遍看的时候,不要死扣细节,会非常耽误时间,先过一遍有整体性的把控 更重要。 - -之后在针对面经或者八股文,去一个难点一个难点的攻克。 - -希望对非科班的录友们有所启发,加油💪 - diff --git "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\351\235\242\350\257\225\344\270\255\345\217\221\346\225\243\346\200\247\351\227\256\351\242\230.md" "b/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\351\235\242\350\257\225\344\270\255\345\217\221\346\225\243\346\200\247\351\227\256\351\242\230.md" deleted file mode 100644 index 5cade944c1..0000000000 --- "a/problems/\347\237\245\350\257\206\346\230\237\347\220\203\347\262\276\351\200\211/\351\235\242\350\257\225\344\270\255\345\217\221\346\225\243\346\200\247\351\227\256\351\242\230.md" +++ /dev/null @@ -1,45 +0,0 @@ -

- - - - -# 面试中遇到发散性问题,应该怎么办? - -这周在[知识星球](https://programmercarl.com/other/kstar.html)有一位录友问了我这么一个问题,我感觉挺有代表性的,应该不少录友在面试中不论是社招还是校招都会遇到这一类的问题。 - -问题如下: - -![](https://gitee.com/programmercarl/pics/raw/master/pic1/20210529183636.png) - -首先面试官评价:基本的知识都懂还可以,但是知识碎片化。 - -因为现在基本大家都是背面经,所以对考点知识点掌握的都不错,确实对整体上理解不够。 - -但如果想对整体上理解深入,需要花费很大精力的,而且要把书看的很透彻,那这种候选人基本都是拔尖的。 - -关于操作系统啊,数据库等等,大多数录友应该都是靠面经,其实背面经也是最高效,性价比最高的方式的,如果真的去把书看透,一本《深入理解计算机系统》够看一年了。。。。 - -所以面试官基本不会因为这个问题而把你pass掉,那位提问的录友也是顺利进入了三面。 - -那么面试中遇到这种发散性问题应该怎么办呢? - -其实他问的这种问题,**就没指望你能说出 正确的答案,这是没有标准答案的**,例如淘宝京东的那种登录的场景 没有经历过 是不知道究竟怎么回事的。 - -而问你对操作系统的理解,也是千人千面没有标准的。 - -遇到这种问题,你就结合自己的想法,大胆说,不要说这个我不知道,那个我没遇到过之类的。 - -你说的解决方案,一定是有问题的,面试官在质疑你的时候,**你要表现出很兴奋,积极和面试官讨论:为什么不对**,然后说出你的观点,结合你所知道的理论知识。 - -大胆说,不要怕,一般情况你的理论知识都比面试官强,面试官工作好多年了基础知识早忘了,基本都是面试你前一天突击一个小时(暴漏真相了哈哈哈) - -**忌讳:面试官一质疑你,你就开始怀疑自己,心想那我说的不对吧,然后就不说话了。。。** - -最后这种发散性的问题,也没法去专门准备,因为这种问题主要是**考察候选人对技术的态度和沟通能力!** - -所以大家如果在面试遇到这一类发散性问题,一定要积极沟通,**表现出你对技术的追求和优秀的沟通能力**。 - -**注意 和面试官讨论的时候要面带微笑,不要板着脸,面试官也会喜欢以后和这样的人做同事!** - -好咯,心法已经传授给大家了。 - From c7e34a3f9b82d989b408b4303aee17bd192fb91f Mon Sep 17 00:00:00 2001 From: JackZJ <56966563+laerpeeK@users.noreply.github.com> Date: Thu, 28 Apr 2022 08:28:12 +0800 Subject: [PATCH 0564/3019] =?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=85JavaScript?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 更新JavaScript版本二维数组做法,目前文档上的是运行不了的。 --- ...47\241\20001\350\203\214\345\214\205-1.md" | 53 +++++++++++-------- 1 file changed, 31 insertions(+), 22 deletions(-) diff --git "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" index fe940b4ca4..a844dcf53c 100644 --- "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" +++ "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" @@ -380,31 +380,40 @@ func main() { ### javascript ```js -function testweightbagproblem (wight, value, size) { - const len = wight.length, - dp = array.from({length: len + 1}).map( - () => array(size + 1).fill(0) - ); - - for(let i = 1; i <= len; i++) { - for(let j = 0; j <= size; j++) { - if(wight[i - 1] <= j) { - dp[i][j] = math.max( - dp[i - 1][j], - value[i - 1] + dp[i - 1][j - wight[i - 1]] - ) - } else { - dp[i][j] = dp[i - 1][j]; - } - } - } - -// console.table(dp); +/** + * + * @param {Number []} weight + * @param {Number []} value + * @param {Number} size + * @returns + */ + +function testWeightBagProblem(weight, value, size) { +const len = weight.length, +dp = Array.from({length: len}).map( +() => Array(size + 1)) //JavaScript 数组是引用类型 +for(let i = 0; i < len; i++) { //初始化最左一列,即背包容量为0时的情况 +dp[i][0] = 0; +} +for(let j = 1; j < size+1; j++) { //初始化第0行, 只有一件物品的情况 +if(weight[0] <= j) { +dp[0][j] = value[0]; +} else { +dp[0][j] = 0; +} +} + +for(let i = 1; i < len; i++) { //dp[i][j]由其左上方元素推导得出 +for(let j = 1; j < size+1; j++) { +if(j < weight[i]) dp[i][j] = dp[i - 1][j]; +else dp[i][j] = Math.max(dp[i-1][j], dp[i-1][j - weight[i]] + value[i]); +} +} - return dp[len][size]; +return dp[len-1][size] //满足条件的最大值 } -function testWeightBagProblem2 (wight, value, size) { +function testWeightBagProblem2 (wight, value, size)4 { const len = wight.length, dp = Array(size + 1).fill(0); for(let i = 1; i <= len; i++) { From 0694fac15bf6b7d18a53adc9f6ad0c33b51db016 Mon Sep 17 00:00:00 2001 From: JackZJ <56966563+laerpeeK@users.noreply.github.com> Date: Thu, 28 Apr 2022 08:30:30 +0800 Subject: [PATCH 0565/3019] =?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=85JavaScript?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 更新背包理论基础01背包JavaScript代码块 - 二维数组做法1, 目前主线上的是有问题的。 --- ...\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" index a844dcf53c..d6bc552064 100644 --- "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" +++ "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" @@ -413,7 +413,7 @@ else dp[i][j] = Math.max(dp[i-1][j], dp[i-1][j - weight[i]] + value[i]); return dp[len-1][size] //满足条件的最大值 } -function testWeightBagProblem2 (wight, value, size)4 { +function testWeightBagProblem2 (wight, value, size) { const len = wight.length, dp = Array(size + 1).fill(0); for(let i = 1; i <= len; i++) { From 5fd43cfd0a5770e0cb532687766f64306b5bbfed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=91=A3xx?= Date: Thu, 28 Apr 2022 22:20:22 +0800 Subject: [PATCH 0566/3019] =?UTF-8?q?0300.=E6=9C=80=E9=95=BF=E4=B8=8A?= =?UTF-8?q?=E5=8D=87=E5=AD=90=E5=BA=8F=E5=88=97-go=E5=8A=A8=E6=80=81?= =?UTF-8?q?=E8=A7=84=E5=88=92=E6=B1=82=E8=A7=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...07\345\255\220\345\272\217\345\210\227.md" | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git "a/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" "b/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" index dfdd51257c..f68edb5ae5 100644 --- "a/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" @@ -168,6 +168,39 @@ func lengthOfLIS(nums []int ) int { } ``` +```go +// 动态规划求解 +func lengthOfLIS(nums []int) int { + // dp数组的定义 dp[i]表示取第i个元素的时候,表示子序列的长度,其中包括 nums[i] 这个元素 + dp := make([]int, len(nums)) + + // 初始化,所有的元素都应该初始化为1 + for i := range dp { + dp[i] = 1 + } + + ans := dp[0] + for i := 1; i < len(nums); i++ { + for j := 0; j < i; j++ { + if nums[i] > nums[j] { + dp[i] = max(dp[i], dp[j] + 1) + } + } + if dp[i] > ans { + ans = dp[i] + } + } + return ans +} + +func max(x, y int) int { + if x > y { + return x + } + return y +} +``` + Javascript ```javascript const lengthOfLIS = (nums) => { From 6f85c2ad3a6daf8e0098b08e61b7fdd68d78c757 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=91=A3xx?= Date: Fri, 29 Apr 2022 00:50:22 +0800 Subject: [PATCH 0567/3019] =?UTF-8?q?0674.=E6=9C=80=E9=95=BF=E8=BF=9E?= =?UTF-8?q?=E7=BB=AD=E9=80=92=E5=A2=9E=E5=BA=8F=E5=88=97-go=E5=8A=A8?= =?UTF-8?q?=E6=80=81=E8=A7=84=E5=88=92=E6=B1=82=E8=A7=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...22\345\242\236\345\272\217\345\210\227.md" | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git "a/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" "b/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" index e941d24263..56e95d97d8 100644 --- "a/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" +++ "b/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" @@ -236,6 +236,45 @@ class Solution: ``` Go: +> 动态规划: +```go +func findLengthOfLCIS(nums []int) int { + if len(nums) == 0 {return 0} + res, count := 1, 1 + for i := 0; i < len(nums)-1; i++ { + if nums[i+1] > nums[i] { + count++ + }else { + count = 1 + } + if count > res { + res = count + } + } + return res +} +``` + +> 贪心算法: +```go +func findLengthOfLCIS(nums []int) int { + if len(nums) == 0 {return 0} + dp := make([]int, len(nums)) + for i := 0; i < len(dp); i++ { + dp[i] = 1 + } + res := 1 + for i := 0; i < len(nums)-1; i++ { + if nums[i+1] > nums[i] { + dp[i+1] = dp[i] + 1 + } + if dp[i+1] > res { + res = dp[i+1] + } + } + return res +} +``` Javascript: From 31eb619ea18d05e004da853d70b165ba47291c92 Mon Sep 17 00:00:00 2001 From: Anmizi <1845513904@qq.com> Date: Fri, 29 Apr 2022 19:15:41 +0800 Subject: [PATCH 0568/3019] =?UTF-8?q?=E4=BC=98=E5=8C=96JS=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E4=BB=A3=E7=A0=81=20(0039.=E7=BB=84=E5=90=88=E6=80=BB?= =?UTF-8?q?=E5=92=8C.md)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git "a/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" "b/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" index 98b37b8467..e10a827f04 100644 --- "a/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" +++ "b/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" @@ -370,18 +370,17 @@ func backtracking(startIndex,sum,target int,candidates,trcak []int,res *[][]int) ```js var combinationSum = function(candidates, target) { const res = [], path = []; - candidates.sort(); // 排序 + candidates.sort((a,b)=>a-b); // 排序 backtracking(0, 0); return res; function backtracking(j, sum) { - if (sum > target) return; if (sum === target) { res.push(Array.from(path)); return; } for(let i = j; i < candidates.length; i++ ) { const n = candidates[i]; - if(n > target - sum) continue; + if(n > target - sum) break; path.push(n); sum += n; backtracking(i, sum); From dac0b4a12e43670eb54eaa6da5fa3f07cb707424 Mon Sep 17 00:00:00 2001 From: GitHubQAQ <31883473+GitHubQAQ@users.noreply.github.com> Date: Fri, 29 Apr 2022 21:03:27 +0800 Subject: [PATCH 0569/3019] =?UTF-8?q?Update=200106.=E4=BB=8E=E4=B8=AD?= =?UTF-8?q?=E5=BA=8F=E4=B8=8E=E5=90=8E=E5=BA=8F=E9=81=8D=E5=8E=86=E5=BA=8F?= =?UTF-8?q?=E5=88=97=E6=9E=84=E9=80=A0=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 优化代码高亮 --- ...\204\351\200\240\344\272\214\345\217\211\346\240\221.md" | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git "a/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" "b/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" index 496de431ed..4396bc7666 100644 --- "a/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" @@ -103,7 +103,7 @@ TreeNode* traversal (vector& inorder, vector& postorder) { 中序数组相对比较好切,找到切割点(后序数组的最后一个元素)在中序数组的位置,然后切割,如下代码中我坚持左闭右开的原则: -```C++ +```CPP // 找到中序遍历的切割点 int delimiterIndex; for (delimiterIndex = 0; delimiterIndex < inorder.size(); delimiterIndex++) { @@ -130,7 +130,7 @@ vector rightInorder(inorder.begin() + delimiterIndex + 1, inorder.end() ); 代码如下: -``` +```CPP // postorder 舍弃末尾元素,因为这个元素就是中间节点,已经用过了 postorder.resize(postorder.size() - 1); @@ -144,7 +144,7 @@ vector rightPostorder(postorder.begin() + leftInorder.size(), postorder.end 接下来可以递归了,代码如下: -``` +```CPP root->left = traversal(leftInorder, leftPostorder); root->right = traversal(rightInorder, rightPostorder); ``` From 5b3607c6a151b6fd6dd548c1b26f3f1fb8514047 Mon Sep 17 00:00:00 2001 From: Anmizi <1845513904@qq.com> Date: Fri, 29 Apr 2022 23:18:33 +0800 Subject: [PATCH 0570/3019] =?UTF-8?q?=E4=BF=AE=E6=94=B9=200040.=E7=BB=84?= =?UTF-8?q?=E5=90=88=E6=80=BB=E5=92=8CII.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\204\345\220\210\346\200\273\345\222\214II.md" | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git "a/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" "b/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" index de13e031dd..34ac64e68d 100644 --- "a/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" +++ "b/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" @@ -508,22 +508,27 @@ func backtracking(startIndex,sum,target int,candidates,trcak []int,res *[][]int) */ var combinationSum2 = function(candidates, target) { const res = []; path = [], len = candidates.length; - candidates.sort(); + candidates.sort((a,b)=>a-b); backtracking(0, 0); return res; function backtracking(sum, i) { - if (sum > target) return; if (sum === target) { res.push(Array.from(path)); return; } - let f = -1; for(let j = i; j < len; j++) { const n = candidates[j]; - if(n > target - sum || n === f) continue; + if(j > i && candidates[j] === candidates[j-1]){ + //若当前元素和前一个元素相等 + //则本次循环结束,防止出现重复组合 + continue; + } + //如果当前元素值大于目标值-总和的值 + //由于数组已排序,那么该元素之后的元素必定不满足条件 + //直接终止当前层的递归 + if(n > target - sum) break; path.push(n); sum += n; - f = n; backtracking(sum, j + 1); path.pop(); sum -= n; From 55c78be1280054615f23c9e5859d139a7f840705 Mon Sep 17 00:00:00 2001 From: dmzlingyin Date: Fri, 29 Apr 2022 23:38:34 +0800 Subject: [PATCH 0571/3019] =?UTF-8?q?update=20(0739.=E6=AF=8F=E6=97=A5?= =?UTF-8?q?=E6=B8=A9=E5=BA=A6.md):=20python=E4=BB=A3=E7=A0=81=E9=AB=98?= =?UTF-8?q?=E4=BA=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" "b/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" index 710f5eb68f..7deab0a3c2 100644 --- "a/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" +++ "b/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" @@ -233,7 +233,7 @@ class Solution { } ``` Python: -``` Python3 +```python class Solution: def dailyTemperatures(self, temperatures: List[int]) -> List[int]: answer = [0]*len(temperatures) From d0a79760b65a1078284b036be6dcf8fa8eec5076 Mon Sep 17 00:00:00 2001 From: dmzlingyin Date: Fri, 29 Apr 2022 23:41:26 +0800 Subject: [PATCH 0572/3019] =?UTF-8?q?update=20(0739.=E6=AF=8F=E6=97=A5?= =?UTF-8?q?=E6=B8=A9=E5=BA=A6.md):=20=E8=AF=AD=E8=A8=80=E8=A1=A8=E8=BF=B0?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" "b/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" index 7deab0a3c2..f0f782d235 100644 --- "a/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" +++ "b/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" @@ -34,7 +34,7 @@ 那么单调栈的原理是什么呢?为什么时间复杂度是O(n)就可以找到每一个元素的右边第一个比它大的元素位置呢? -单调栈的本质是空间换时间,因为在遍历的过程中需要用一个栈来记录右边第一个比当前元素的元素,优点是只需要遍历一次。 +单调栈的本质是空间换时间,因为在遍历的过程中需要用一个栈来记录右边第一个比当前元素大的元素,优点是只需要遍历一次。 在使用单调栈的时候首先要明确如下几点: From 636550d44c4ac65521865cca00b1c3c8b9f7c756 Mon Sep 17 00:00:00 2001 From: dmzlingyin Date: Fri, 29 Apr 2022 23:50:31 +0800 Subject: [PATCH 0573/3019] =?UTF-8?q?update=20(0739.=E6=AF=8F=E6=97=A5?= =?UTF-8?q?=E6=B8=A9=E5=BA=A6.md):=20=E5=A2=9E=E5=8A=A0=E6=9C=AA=E7=B2=BE?= =?UTF-8?q?=E7=AE=80=E7=89=88=E6=9C=ACGo=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...17\346\227\245\346\270\251\345\272\246.md" | 30 ++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git "a/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" "b/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" index f0f782d235..206bebd234 100644 --- "a/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" +++ "b/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" @@ -277,8 +277,36 @@ func dailyTemperatures(t []int) []int { } ``` -> 单调栈法 +> 单调栈法(未精简版本) +```go +func dailyTemperatures(temperatures []int) []int { + res := make([]int, len(temperatures)) + // 初始化栈顶元素为第一个下标索引0 + stack := []int{0} + + for i := 1; i < len(temperatures); i++ { + top := stack[len(stack)-1] + if temperatures[i] < temperatures[top] { + stack = append(stack, i) + } else if temperatures[i] == temperatures[top] { + stack = append(stack, i) + } else { + for len(stack) != 0 && temperatures[i] > temperatures[top] { + res[top] = i - top + stack = stack[:len(stack)-1] + if len(stack) != 0 { + top = stack[len(stack)-1] + } + } + stack = append(stack, i) + } + } + return res +} +``` + +> 单调栈法(精简版本) ```go // 单调递减栈 func dailyTemperatures(num []int) []int { From 49ec574821f687ea8703c61245f815bf2dc76139 Mon Sep 17 00:00:00 2001 From: dmzlingyin Date: Sat, 30 Apr 2022 11:04:17 +0800 Subject: [PATCH 0574/3019] =?UTF-8?q?update=20(0496.=E4=B8=8B=E4=B8=80?= =?UTF-8?q?=E4=B8=AA=E6=9B=B4=E5=A4=A7=E5=85=83=E7=B4=A0I):=20=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E6=9C=AA=E7=B2=BE=E7=AE=80Go=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...4\345\244\247\345\205\203\347\264\240I.md" | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git "a/problems/0496.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240I.md" "b/problems/0496.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240I.md" index f9dfa3081b..02339677bc 100644 --- "a/problems/0496.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240I.md" +++ "b/problems/0496.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240I.md" @@ -244,6 +244,39 @@ class Solution: ``` Go: + +> 未精简版本 +```go +func nextGreaterElement(nums1 []int, nums2 []int) []int { + res := make([]int, len(nums1)) + for i := range res { res[i] = -1 } + m := make(map[int]int, len(nums1)) + for k, v := range nums1 { m[v] = k } + + stack := []int{0} + for i := 1; i < len(nums2); i++ { + top := stack[len(stack)-1] + if nums2[i] < nums2[top] { + stack = append(stack, i) + } else if nums2[i] == nums2[top] { + stack = append(stack, i) + } else { + for len(stack) != 0 && nums2[i] > nums2[top] { + if v, ok := m[nums2[top]]; ok { + res[v] = nums2[i] + } + stack = stack[:len(stack)-1] + if len(stack) != 0 { + top = stack[len(stack)-1] + } + } + stack = append(stack, i) + } + } + return res +} +``` +> 精简版本 ```go func nextGreaterElement(nums1 []int, nums2 []int) []int { res := make([]int, len(nums1)) From 82e8b9eaac23041c2a358af126ec4e268ee383fa Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Sat, 30 Apr 2022 21:18:55 +0800 Subject: [PATCH 0575/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880509.?= =?UTF-8?q?=E6=96=90=E6=B3=A2=E9=82=A3=E5=A5=91=E6=95=B0.md=EF=BC=89?= =?UTF-8?q?=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...42\351\202\243\345\245\221\346\225\260.md" | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git "a/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" "b/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" index d339940cf0..1d17784d43 100644 --- "a/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" +++ "b/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" @@ -245,7 +245,29 @@ var fib = function(n) { }; ``` +TypeScript + +```typescript +function fib(n: number): number { + /** + dp[i]: 第i个斐波那契数 + dp[0]: 0; + dp[1]:1; + ... + dp[i] = dp[i - 1] + dp[i - 2]; + */ + const dp: number[] = []; + dp[0] = 0; + dp[1] = 1; + for (let i = 2; i <= n; i++) { + dp[i] = dp[i - 1] + dp[i - 2]; + } + return dp[n]; +}; +``` + ### C + 动态规划: ```c int fib(int n){ From 0cba2d22f2d032bbf478662ef622d8022af24f21 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Sat, 30 Apr 2022 21:53:14 +0800 Subject: [PATCH 0576/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880070.?= =?UTF-8?q?=E7=88=AC=E6=A5=BC=E6=A2=AF.md=EF=BC=89=EF=BC=9A=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...0.\347\210\254\346\245\274\346\242\257.md" | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git "a/problems/0070.\347\210\254\346\245\274\346\242\257.md" "b/problems/0070.\347\210\254\346\245\274\346\242\257.md" index da19ea0ec1..34d414413a 100644 --- "a/problems/0070.\347\210\254\346\245\274\346\242\257.md" +++ "b/problems/0070.\347\210\254\346\245\274\346\242\257.md" @@ -308,7 +308,58 @@ var climbStairs = function(n) { }; ``` +TypeScript + +> 爬2阶 + +```typescript +function climbStairs(n: number): number { + /** + dp[i]: i阶楼梯的方法种数 + dp[1]: 1; + dp[2]: 2; + ... + dp[i]: dp[i - 1] + dp[i - 2]; + */ + const dp: number[] = []; + dp[1] = 1; + dp[2] = 2; + for (let i = 3; i <= n; i++) { + dp[i] = dp[i - 1] + dp[i - 2]; + } + return dp[n]; +}; +``` + +> 爬m阶 + +```typescript +function climbStairs(n: number): number { + /** + 一次可以爬m阶 + dp[i]: i阶楼梯的方法种数 + dp[1]: 1; + dp[2]: 2; + dp[3]: dp[2] + dp[1]; + ... + dp[i]: dp[i - 1] + dp[i - 2] + ... + dp[max(i - m, 1)]; 从i-1加到max(i-m, 1) + */ + const m: number = 2; // 本题m为2 + const dp: number[] = new Array(n + 1).fill(0); + dp[1] = 1; + dp[2] = 2; + for (let i = 3; i <= n; i++) { + const end: number = Math.max(i - m, 1); + for (let j = i - 1; j >= end; j--) { + dp[i] += dp[j]; + } + } + return dp[n]; +}; +``` + ### C + ```c int climbStairs(int n){ //若n<=2,返回n From 1e81ef27100c8fc76bc38ec0135a4b18554398af Mon Sep 17 00:00:00 2001 From: Beim <73528776+162-jld@users.noreply.github.com> Date: Sun, 1 May 2022 11:51:11 +0800 Subject: [PATCH 0577/3019] =?UTF-8?q?Update=200383.=E8=B5=8E=E9=87=91?= =?UTF-8?q?=E4=BF=A1.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...3.\350\265\216\351\207\221\344\277\241.md" | 28 ++++++++++--------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git "a/problems/0383.\350\265\216\351\207\221\344\277\241.md" "b/problems/0383.\350\265\216\351\207\221\344\277\241.md" index 0070734779..56dcb8dd1d 100644 --- "a/problems/0383.\350\265\216\351\207\221\344\277\241.md" +++ "b/problems/0383.\350\265\216\351\207\221\344\277\241.md" @@ -110,23 +110,25 @@ Java: ```Java class Solution { public boolean canConstruct(String ransomNote, String magazine) { - //记录杂志字符串出现的次数 - int[] arr = new int[26]; - int temp; - for (int i = 0; i < magazine.length(); i++) { - temp = magazine.charAt(i) - 'a'; - arr[temp]++; + // 定义一个哈希映射数组 + int[] record = new int[26]; + + // 遍历 + for(char c : magazine.toCharArray()){ + record[c - 'a'] += 1; + } + + for(char c : ransomNote.toCharArray()){ + record[c - 'a'] -= 1; } - for (int i = 0; i < ransomNote.length(); i++) { - temp = ransomNote.charAt(i) - 'a'; - //对于金信中的每一个字符都在数组中查找 - //找到相应位减一,否则找不到返回false - if (arr[temp] > 0) { - arr[temp]--; - } else { + + // 如果数组中存在负数,说明ransomNote字符串总存在magazine中没有的字符 + for(int i : record){ + if(i < 0){ return false; } } + return true; } } From 25e26f1f86bf246f93560710f41dcf5a26414770 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Sun, 1 May 2022 13:45:25 +0800 Subject: [PATCH 0578/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0(0746.=E4=BD=BF?= =?UTF-8?q?=E7=94=A8=E6=9C=80=E5=B0=8F=E8=8A=B1=E8=B4=B9=E7=88=AC=E6=A5=BC?= =?UTF-8?q?=E6=A2=AF.md)=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...71\347\210\254\346\245\274\346\242\257.md" | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git "a/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" "b/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" index c356955ad4..5931fc8ac8 100644 --- "a/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" +++ "b/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" @@ -266,7 +266,30 @@ var minCostClimbingStairs = function(cost) { }; ``` +### TypeScript + +```typescript +function minCostClimbingStairs(cost: number[]): number { + /** + dp[i]: 走到第i阶需要花费的最少金钱 + dp[0]: cost[0]; + dp[1]: cost[1]; + ... + dp[i]: min(dp[i - 1], dp[i - 2]) + cost[i]; + */ + const dp: number[] = []; + const length: number = cost.length; + dp[0] = cost[0]; + dp[1] = cost[1]; + for (let i = 2; i <= length; i++) { + dp[i] = Math.min(dp[i - 1], dp[i - 2]) + cost[i]; + } + return Math.min(dp[length - 1], dp[length - 2]); +}; +``` + ### C + ```c int minCostClimbingStairs(int* cost, int costSize){ //开辟dp数组,大小为costSize From fc28660b6189b010709bedc7dd5acf678eaf47ed Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Sun, 1 May 2022 14:42:12 +0800 Subject: [PATCH 0579/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880062.?= =?UTF-8?q?=E4=B8=8D=E5=90=8C=E8=B7=AF=E5=BE=84.md=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...15\345\220\214\350\267\257\345\276\204.md" | 30 ++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git "a/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" "b/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" index 4a9af12965..f59b7be8bc 100644 --- "a/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" +++ "b/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" @@ -273,7 +273,7 @@ public: return dp[m-1][n-1]; } -``` +``` ### Python ```python @@ -347,7 +347,35 @@ var uniquePaths = function(m, n) { }; ``` +### TypeScript + +```typescript +function uniquePaths(m: number, n: number): number { + /** + dp[i][j]: 到达(i, j)的路径数 + dp[0][*]: 1; + dp[*][0]: 1; + ... + dp[i][j]: dp[i - 1][j] + dp[i][j - 1]; + */ + const dp: number[][] = new Array(m).fill(0).map(_ => []); + for (let i = 0; i < m; i++) { + dp[i][0] = 1; + } + for (let i = 0; i < n; i++) { + dp[0][i] = 1; + } + for (let i = 1; i < m; i++) { + for (let j = 1; j < n; j++) { + dp[i][j] = dp[i - 1][j] + dp[i][j - 1]; + } + } + return dp[m - 1][n - 1]; +}; +``` + ### C + ```c //初始化dp数组 int **initDP(int m, int n) { From 8c596b161a140a76ea57130ac61a009308bd277c Mon Sep 17 00:00:00 2001 From: Beim <1497359184@qq.com> Date: Sun, 1 May 2022 15:45:58 +0800 Subject: [PATCH 0580/3019] modify_problems_0383 --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 1d7f219d2c..3d44ca690f 100644 --- a/README.md +++ b/README.md @@ -31,7 +31,7 @@

-# LeetCode 刷题攻略 +# LeetCode 刷题攻略1111 ## 刷题攻略的背景 @@ -254,7 +254,7 @@ 33. [二叉树:构造一棵搜索树](./problems/0108.将有序数组转换为二叉搜索树.md) 34. [二叉树:搜索树转成累加树](./problems/0538.把二叉搜索树转换为累加树.md) 35. [二叉树:总结篇!(需要掌握的二叉树技能都在这里了)](./problems/二叉树总结篇.md) - + ## 回溯算法 题目分类大纲如下: From d3e1f1d3b3406f28e7494340928fbc1866c0b6f6 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Sun, 1 May 2022 19:24:05 +0800 Subject: [PATCH 0581/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880063.?= =?UTF-8?q?=E4=B8=8D=E5=90=8C=E8=B7=AF=E5=BE=84II.md=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\345\220\214\350\267\257\345\276\204II.md" | 33 ++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git "a/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" "b/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" index a40ccedaa9..d09ea0e634 100644 --- "a/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" +++ "b/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" @@ -352,7 +352,38 @@ var uniquePathsWithObstacles = function(obstacleGrid) { }; ``` -C +### TypeScript + +```typescript +function uniquePathsWithObstacles(obstacleGrid: number[][]): number { + /** + dp[i][j]: 到达(i, j)的路径数 + dp[0][*]: 用u表示第一个障碍物下标,则u之前为1,u之后(含u)为0 + dp[*][0]: 同上 + ... + dp[i][j]: obstacleGrid[i][j] === 1 ? 0 : dp[i-1][j] + dp[i][j-1]; + */ + const m: number = obstacleGrid.length; + const n: number = obstacleGrid[0].length; + const dp: number[][] = new Array(m).fill(0).map(_ => new Array(n).fill(0)); + for (let i = 0; i < m && obstacleGrid[i][0] === 0; i++) { + dp[i][0] = 1; + } + for (let i = 0; i < n && obstacleGrid[0][i] === 0; i++) { + dp[0][i] = 1; + } + for (let i = 1; i < m; i++) { + for (let j = 1; j < n; j++) { + if (obstacleGrid[i][j] === 1) continue; + dp[i][j] = dp[i - 1][j] + dp[i][j - 1]; + } + } + return dp[m - 1][n - 1]; +}; +``` + +### C + ```c //初始化dp数组 int **initDP(int m, int n, int** obstacleGrid) { From dd514eb08787dd203cea4668f75477971b4e88fe Mon Sep 17 00:00:00 2001 From: wang <472146630@qq.com> Date: Sun, 1 May 2022 21:08:57 +0800 Subject: [PATCH 0582/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200053.=E6=9C=80?= =?UTF-8?q?=E5=A4=A7=E5=AD=90=E5=BA=8F=E5=92=8C=E3=80=810135=E5=88=86?= =?UTF-8?q?=E5=8F=91=E7=B3=96=E6=9E=9C=E5=92=8C0455=E5=88=86=E5=8F=91?= =?UTF-8?q?=E9=A5=BC=E5=B9=B2=E7=9A=84=20Rust=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...47\345\255\220\345\272\217\345\222\214.md" | 20 +++++++++-- ...06\345\217\221\347\263\226\346\236\234.md" | 29 ++++++++++++--- ...06\345\217\221\351\245\274\345\271\262.md" | 36 ++++++++++++++----- 3 files changed, 69 insertions(+), 16 deletions(-) diff --git "a/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" "b/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" index b5fb7642c5..9dbc7313a0 100644 --- "a/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" +++ "b/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" @@ -140,7 +140,7 @@ public: ## 其他语言版本 -### Java +### Java ```java class Solution { public int maxSubArray(int[] nums) { @@ -180,7 +180,7 @@ class Solution { } ``` -### Python +### Python ```python class Solution: def maxSubArray(self, nums: List[int]) -> int: @@ -195,7 +195,7 @@ class Solution: return result ``` -### Go +### Go ```go func maxSubArray(nums []int) int { @@ -212,6 +212,20 @@ func maxSubArray(nums []int) int { } ``` +### Rust +```rust +pub fn max_sub_array(nums: Vec) -> i32 { + let mut max_sum = i32::MIN; + let mut curr = 0; + for n in nums.iter() { + curr += n; + max_sum = max_sum.max(curr); + curr = curr.max(0); + } + max_sum +} +``` + ### Javascript: ```Javascript var maxSubArray = function(nums) { diff --git "a/problems/0135.\345\210\206\345\217\221\347\263\226\346\236\234.md" "b/problems/0135.\345\210\206\345\217\221\347\263\226\346\236\234.md" index ccdabc16b4..ce738689ac 100644 --- "a/problems/0135.\345\210\206\345\217\221\347\263\226\346\236\234.md" +++ "b/problems/0135.\345\210\206\345\217\221\347\263\226\346\236\234.md" @@ -126,11 +126,11 @@ public: ## 其他语言版本 -### Java +### Java ```java class Solution { - /** - 分两个阶段 + /** + 分两个阶段 1、起点下标1 从左往右,只要 右边 比 左边 大,右边的糖果=左边 + 1 2、起点下标 ratings.length - 2 从右往左, 只要左边 比 右边 大,此时 左边的糖果应该 取本身的糖果数(符合比它左边大) 和 右边糖果数 + 1 二者的最大值,这样才符合 它比它左边的大,也比它右边大 */ @@ -160,7 +160,7 @@ class Solution { } ``` -### Python +### Python ```python class Solution: def candy(self, ratings: List[int]) -> int: @@ -213,6 +213,25 @@ func findMax(num1 int ,num2 int) int{ } ``` +### Rust +```rust +pub fn candy(ratings: Vec) -> i32 { + let mut candies = vec![1i32; ratings.len()]; + for i in 1..ratings.len() { + if ratings[i - 1] < ratings[i] { + candies[i] = candies[i - 1] + 1; + } + } + + for i in (0..ratings.len()-1).rev() { + if ratings[i] > ratings[i + 1] { + candies[i] = candies[i].max(candies[i + 1] + 1); + } + } + candies.iter().sum() +} +``` + ### Javascript: ```Javascript var candy = function(ratings) { @@ -229,7 +248,7 @@ var candy = function(ratings) { candys[i] = Math.max(candys[i], candys[i + 1] + 1) } } - + let count = candys.reduce((a, b) => { return a + b }) diff --git "a/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" "b/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" index d95a407a75..17db4a859e 100644 --- "a/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" +++ "b/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" @@ -106,7 +106,7 @@ public: ## 其他语言版本 -### Java +### Java ```java class Solution { // 思路1:优先考虑饼干,小饼干先喂饱小胃口 @@ -145,7 +145,7 @@ class Solution { } ``` -### Python +### Python ```python class Solution: # 思路1:优先考虑胃饼干 @@ -166,13 +166,13 @@ class Solution: s.sort() start, count = len(s) - 1, 0 for index in range(len(g) - 1, -1, -1): # 先喂饱大胃口 - if start >= 0 and g[index] <= s[start]: + if start >= 0 and g[index] <= s[start]: start -= 1 count += 1 return count ``` -### Go +### Go ```golang //排序后,局部最优 func findContentChildren(g []int, s []int) int { @@ -191,7 +191,27 @@ func findContentChildren(g []int, s []int) int { } ``` -### Javascript +### Rust +```rust +pub fn find_content_children(children: Vec, cookie: Vec) -> i32 { + let mut children = children; + let mut cookies = cookie; + children.sort(); + cookies.sort(); + + let (mut child, mut cookie) = (0usize, 0usize); + while child < children.len() && cookie < cookies.len() { + // 优先选择最小饼干喂饱孩子 + if children[child] <= cookies[cookie] { + child += 1; + } + cookie += 1 + } + child as i32 +} +``` + +### Javascript ```js var findContentChildren = function(g, s) { g = g.sort((a, b) => a - b) @@ -203,7 +223,7 @@ var findContentChildren = function(g, s) { result++ index-- } - } + } return result }; @@ -251,7 +271,7 @@ function findContentChildren(g: number[], s: number[]): number { }; ``` -### C +### C ```c int cmp(int* a, int* b) { @@ -261,7 +281,7 @@ int cmp(int* a, int* b) { int findContentChildren(int* g, int gSize, int* s, int sSize){ if(sSize == 0) return 0; - + //将两个数组排序为升序 qsort(g, gSize, sizeof(int), cmp); qsort(s, sSize, sizeof(int), cmp); From 4c03ad7a78fcb324da45e97a2cfca618af1086c8 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Sun, 1 May 2022 22:32:12 +0800 Subject: [PATCH 0583/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880343.?= =?UTF-8?q?=E6=95=B4=E6=95=B0=E6=8B=86=E5=88=86.md=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...64\346\225\260\346\213\206\345\210\206.md" | 28 ++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git "a/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" "b/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" index 4a7ba6ab0d..279f1d7182 100644 --- "a/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" +++ "b/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" @@ -274,7 +274,33 @@ var integerBreak = function(n) { }; ``` -C: +### TypeScript + +```typescript +function integerBreak(n: number): number { + /** + dp[i]: i对应的最大乘积 + dp[2]: 1; + ... + dp[i]: max( + 1 * dp[i - 1], 1 * (i - 1), + 2 * dp[i - 2], 2 * (i - 2), + ..., (i - 2) * dp[2], (i - 2) * 2 + ); + */ + const dp: number[] = new Array(n + 1).fill(0); + dp[2] = 1; + for (let i = 3; i <= n; i++) { + for (let j = 1; j <= i - 2; j++) { + dp[i] = Math.max(dp[i], j * dp[i - j], j * (i - j)); + } + } + return dp[n]; +}; +``` + +### C + ```c //初始化DP数组 int *initDP(int num) { From b1ef364ffb9c0082f401c34bdd6bf22c4f330fa5 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Mon, 2 May 2022 17:25:45 +0800 Subject: [PATCH 0584/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880096.?= =?UTF-8?q?=E4=B8=8D=E5=90=8C=E7=9A=84=E4=BA=8C=E5=8F=89=E6=90=9C=E7=B4=A2?= =?UTF-8?q?=E6=A0=91.md=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript?= =?UTF-8?q?=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...11\346\220\234\347\264\242\346\240\221.md" | 28 ++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git "a/problems/0096.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0096.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" index 41fcb8fe18..25561b506a 100644 --- "a/problems/0096.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" +++ "b/problems/0096.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" @@ -227,7 +227,33 @@ const numTrees =(n) => { }; ``` -C: +TypeScript + +```typescript +function numTrees(n: number): number { + /** + dp[i]: i个节点对应的种树 + dp[0]: -1; 无意义; + dp[1]: 1; + ... + dp[i]: 2 * dp[i - 1] + + (dp[1] * dp[i - 2] + dp[2] * dp[i - 3] + ... + dp[i - 2] * dp[1]); 从1加到i-2 + */ + const dp: number[] = []; + dp[0] = -1; // 表示无意义 + dp[1] = 1; + for (let i = 2; i <= n; i++) { + dp[i] = 2 * dp[i - 1]; + for (let j = 1, end = i - 1; j < end; j++) { + dp[i] += dp[j] * dp[end - j]; + } + } + return dp[n]; +}; +``` + +### C + ```c //开辟dp数组 int *initDP(int n) { From 5440c3d46b16565a265e30e498662829bf40b5e1 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Tue, 3 May 2022 11:48:03 +0800 Subject: [PATCH 0585/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=88=E8=83=8C?= =?UTF-8?q?=E5=8C=85=E7=90=86=E8=AE=BA=E5=9F=BA=E7=A1=8001=E8=83=8C?= =?UTF-8?q?=E5=8C=85-1.md=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript?= =?UTF-8?q?=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...47\241\20001\350\203\214\345\214\205-1.md" | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" index fe940b4ca4..257e87e470 100644 --- "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" +++ "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" @@ -423,5 +423,47 @@ function test () { test(); ``` +### TypeScript + +```typescript +function testWeightBagProblem( + weight: number[], + value: number[], + size: number +): number { + /** + * dp[i][j]: 前i个物品,背包容量为j,能获得的最大价值 + * dp[0][*]: u=weight[0],u之前为0,u之后(含u)为value[0] + * dp[*][0]: 0 + * ... + * dp[i][j]: max(dp[i-1][j], dp[i-1][j-weight[i]]+value[i]); + */ + const goodsNum: number = weight.length; + const dp: number[][] = new Array(goodsNum) + .fill(0) + .map((_) => new Array(size + 1).fill(0)); + for (let i = weight[0]; i <= size; i++) { + dp[0][i] = value[0]; + } + for (let i = 1; i < goodsNum; i++) { + for (let j = 1; j <= size; j++) { + if (j < weight[i]) { + dp[i][j] = dp[i - 1][j]; + } else { + dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]); + } + } + } + return dp[goodsNum - 1][size]; +} +// test +const weight = [1, 3, 4]; +const value = [15, 20, 30]; +const size = 4; +console.log(testWeightBagProblem(weight, value, size)); +``` + + + -----------------------
From 36f630b109a93685bb241884e5584b327028d5f5 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Tue, 3 May 2022 12:34:20 +0800 Subject: [PATCH 0586/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=88=E8=83=8C?= =?UTF-8?q?=E5=8C=85=E7=90=86=E8=AE=BA=E5=9F=BA=E7=A1=8001=E8=83=8C?= =?UTF-8?q?=E5=8C=85-2.md=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript?= =?UTF-8?q?=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...47\241\20001\350\203\214\345\214\205-2.md" | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" index dabdfb2d09..bb5e3a037b 100644 --- "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" +++ "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" @@ -315,6 +315,30 @@ function test () { test(); ``` +### TypeScript + +```typescript +function testWeightBagProblem( + weight: number[], + value: number[], + size: number +): number { + const goodsNum: number = weight.length; + const dp: number[] = new Array(size + 1).fill(0); + for (let i = 0; i < goodsNum; i++) { + for (let j = size; j >= weight[i]; j--) { + dp[j] = Math.max(dp[j], dp[j - weight[i]] + value[i]); + } + } + return dp[size]; +} +const weight = [1, 3, 4]; +const value = [15, 20, 30]; +const size = 4; +console.log(testWeightBagProblem(weight, value, size)); + +``` + ----------------------- From a38ee5f525af998683a2d0fb38f6c6cac1312f5d Mon Sep 17 00:00:00 2001 From: Frankheartusf <104822497+Frankheartusf@users.noreply.github.com> Date: Tue, 3 May 2022 17:31:37 +0800 Subject: [PATCH 0587/3019] Add files via upload --- ...\350\267\203\346\270\270\346\210\217II.md" | 287 ++++++++++++++++++ 1 file changed, 287 insertions(+) create mode 100644 "0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" diff --git "a/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" "b/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" new file mode 100644 index 0000000000..c0d3c3e522 --- /dev/null +++ "b/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" @@ -0,0 +1,287 @@ +

+ + + +

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

+ + +> 相对于[贪心算法:跳跃游戏](https://mp.weixin.qq.com/s/606_N9j8ACKCODoCbV1lSA)难了不少,做好心里准备! + +# 45.跳跃游戏II + +[力扣题目链接](https://leetcode-cn.com/problems/jump-game-ii/) + +给定一个非负整数数组,你最初位于数组的第一个位置。 + +数组中的每个元素代表你在该位置可以跳跃的最大长度。 + +你的目标是使用最少的跳跃次数到达数组的最后一个位置。 + +示例: +* 输入: [2,3,1,1,4] +* 输出: 2 +* 解释: 跳到最后一个位置的最小跳跃数是 2。从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。 + +说明: +假设你总是可以到达数组的最后一个位置。 + + +## 思路 + +本题相对于[55.跳跃游戏](https://programmercarl.com/0055.跳跃游戏.html)还是难了不少。 + +但思路是相似的,还是要看最大覆盖范围。 + +本题要计算最小步数,那么就要想清楚什么时候步数才一定要加一呢? + +贪心的思路,局部最优:当前可移动距离尽可能多走,如果还没到终点,步数再加一。整体最优:一步尽可能多走,从而达到最小步数。 + +思路虽然是这样,但在写代码的时候还不能真的就能跳多远跳远,那样就不知道下一步最远能跳到哪里了。 + +**所以真正解题的时候,要从覆盖范围出发,不管怎么跳,覆盖范围内一定是可以跳到的,以最小的步数增加覆盖范围,覆盖范围一旦覆盖了终点,得到的就是最小步数!** + +**这里需要统计两个覆盖范围,当前这一步的最大覆盖和下一步最大覆盖**。 + +如果移动下标达到了当前这一步的最大覆盖最远距离了,还没有到终点的话,那么就必须再走一步来增加覆盖范围,直到覆盖范围覆盖了终点。 + +如图: + +![45.跳跃游戏II](https://img-blog.csdnimg.cn/20201201232309103.png) + +**图中覆盖范围的意义在于,只要红色的区域,最多两步一定可以到!(不用管具体怎么跳,反正一定可以跳到)** + +## 方法一 + +从图中可以看出来,就是移动下标达到了当前覆盖的最远距离下标时,步数就要加一,来增加覆盖距离。最后的步数就是最少步数。 + +这里还是有个特殊情况需要考虑,当移动下标达到了当前覆盖的最远距离下标时 + +* 如果当前覆盖最远距离下标不是是集合终点,步数就加一,还需要继续走。 +* 如果当前覆盖最远距离下标就是是集合终点,步数不用加一,因为不能再往后走了。 + +C++代码如下:(详细注释) + +```CPP +// 版本一 +class Solution { +public: + int jump(vector& nums) { + if (nums.size() == 1) return 0; + int curDistance = 0; // 当前覆盖最远距离下标 + int ans = 0; // 记录走的最大步数 + int nextDistance = 0; // 下一步覆盖最远距离下标 + for (int i = 0; i < nums.size(); i++) { + nextDistance = max(nums[i] + i, nextDistance); // 更新下一步覆盖最远距离下标 + if (i == curDistance) { // 遇到当前覆盖最远距离下标 + if (curDistance != nums.size() - 1) { // 如果当前覆盖最远距离下标不是终点 + ans++; // 需要走下一步 + curDistance = nextDistance; // 更新当前覆盖最远距离下标(相当于加油了) + if (nextDistance >= nums.size() - 1) break; // 下一步的覆盖范围已经可以达到终点,结束循环 + } else break; // 当前覆盖最远距离下标是集合终点,不用做ans++操作了,直接结束 + } + } + return ans; + } +}; +``` + +## 方法二 + +依然是贪心,思路和方法一差不多,代码可以简洁一些。 + +**针对于方法一的特殊情况,可以统一处理**,即:移动下标只要遇到当前覆盖最远距离的下标,直接步数加一,不考虑是不是终点的情况。 + +想要达到这样的效果,只要让移动下标,最大只能移动到nums.size - 2的地方就可以了。 + +因为当移动下标指向nums.size - 2时: + +* 如果移动下标等于当前覆盖最大距离下标, 需要再走一步(即ans++),因为最后一步一定是可以到的终点。(题目假设总是可以到达数组的最后一个位置),如图: +![45.跳跃游戏II2](https://img-blog.csdnimg.cn/20201201232445286.png) + +* 如果移动下标不等于当前覆盖最大距离下标,说明当前覆盖最远距离就可以直接达到终点了,不需要再走一步。如图: + +![45.跳跃游戏II1](https://img-blog.csdnimg.cn/20201201232338693.png) + +代码如下: + +```CPP +// 版本二 +class Solution { +public: + int jump(vector& nums) { + int curDistance = 0; // 当前覆盖的最远距离下标 + int ans = 0; // 记录走的最大步数 + int nextDistance = 0; // 下一步覆盖的最远距离下标 + for (int i = 0; i < nums.size() - 1; i++) { // 注意这里是小于nums.size() - 1,这是关键所在 + nextDistance = max(nums[i] + i, nextDistance); // 更新下一步覆盖的最远距离下标 + if (i == curDistance) { // 遇到当前覆盖的最远距离下标 + curDistance = nextDistance; // 更新当前覆盖的最远距离下标 + ans++; + } + } + return ans; + } +}; +``` + +可以看出版本二的代码相对于版本一简化了不少! + +其精髓在于控制移动下标i只移动到nums.size() - 2的位置,所以移动下标只要遇到当前覆盖最远距离的下标,直接步数加一,不用考虑别的了。 + +## 总结 + +相信大家可以发现,这道题目相当于[55.跳跃游戏](https://programmercarl.com/0055.跳跃游戏.html)难了不止一点。 + +但代码又十分简单,贪心就是这么巧妙。 + +理解本题的关键在于:**以最小的步数增加最大的覆盖范围,直到覆盖范围覆盖了终点**,这个范围内最小步数一定可以跳到,不用管具体是怎么跳的,不纠结于一步究竟跳一个单位还是两个单位。 + + +## 其他语言版本 + + +### Java +```Java +// 版本一 +class Solution { + public int jump(int[] nums) { + if (nums == null || nums.length == 0 || nums.length == 1) { + return 0; + } + //记录跳跃的次数 + int count=0; + //当前的覆盖最大区域 + int curDistance = 0; + //最大的覆盖区域 + int maxDistance = 0; + for (int i = 0; i < nums.length; i++) { + //在可覆盖区域内更新最大的覆盖区域 + maxDistance = Math.max(maxDistance,i+nums[i]); + //说明当前一步,再跳一步就到达了末尾 + if (maxDistance>=nums.length-1){ + count++; + break; + } + //走到当前覆盖的最大区域时,更新下一步可达的最大区域 + if (i==curDistance){ + curDistance = maxDistance; + count++; + } + } + return count; + } +} +``` + +```java +// 版本二 +class Solution { + public int jump(int[] nums) { + int result = 0; + // 当前覆盖的最远距离下标 + int end = 0; + // 下一步覆盖的最远距离下标 + int temp = 0; + for (int i = 0; i <= end && end < nums.length - 1; ++i) { + temp = Math.max(temp, i + nums[i]); + // 可达位置的改变次数就是跳跃次数 + if (i == end) { + end = temp; + result++; + } + } + return result; + } +} +``` + +### Python + +```python +class Solution: + def jump(self, nums: List[int]) -> int: + if len(nums) == 1: return 0 + ans = 0 + curDistance = 0 + nextDistance = 0 + for i in range(len(nums)): + nextDistance = max(i + nums[i], nextDistance) + if i == curDistance: + if curDistance != len(nums) - 1: + ans += 1 + curDistance = nextDistance + if nextDistance >= len(nums) - 1: break + return ans +``` + +### Go +```Go +func jump(nums []int) int { + dp := make([]int, len(nums)) + dp[0] = 0//初始第一格跳跃数一定为0 + + for i := 1; i < len(nums); i++ { + dp[i] = i + for j := 0; j < i; j++ { + if nums[j] + j >= i {//nums[j]为起点,j为往右跳的覆盖范围,这行表示从j能跳到i + dp[i] = min(dp[j] + 1, dp[i])//更新最小能到i的跳跃次数 + } + } + } + return dp[len(nums)-1] +} + +func min(a, b int) int { + if a < b { + return a + } else { + return b + } +} +``` + +### Javascript +```Javascript +var jump = function(nums) { + let curIndex = 0 + let nextIndex = 0 + let steps = 0 + for(let i = 0; i < nums.length - 1; i++) { + nextIndex = Math.max(nums[i] + i, nextIndex) + if(i === curIndex) { + curIndex = nextIndex + steps++ + } + } + + return steps +}; +``` + +### TypeScript + +```typescript +function jump(nums: number[]): number { + const length: number = nums.length; + let curFarthestIndex: number = 0, + nextFarthestIndex: number = 0; + let curIndex: number = 0; + let stepNum: number = 0; + while (curIndex < length - 1) { + nextFarthestIndex = Math.max(nextFarthestIndex, curIndex + nums[curIndex]); + if (curIndex === curFarthestIndex) { + curFarthestIndex = nextFarthestIndex; + stepNum++; + } + curIndex++; + } + return stepNum; +}; +``` + + + + + +----------------------- +
From 64d477e3f05c2b7ebb8aa3b5b8ed27578b5a1b31 Mon Sep 17 00:00:00 2001 From: Frankheartusf <2332517004@qq.com> Date: Tue, 3 May 2022 17:50:07 +0800 Subject: [PATCH 0588/3019] =?UTF-8?q?=E4=BF=AE=E6=94=B9=200045=20=E8=B7=B3?= =?UTF-8?q?=E8=B7=83=E9=97=AE=E9=A2=98II=20golang=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\350\267\203\346\270\270\346\210\217II.md" | 287 ------------------ ...\350\267\203\346\270\270\346\210\217II.md" | 32 +- 2 files changed, 20 insertions(+), 299 deletions(-) delete mode 100644 "0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" diff --git "a/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" "b/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" deleted file mode 100644 index c0d3c3e522..0000000000 --- "a/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" +++ /dev/null @@ -1,287 +0,0 @@ -

- - - -

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

- - -> 相对于[贪心算法:跳跃游戏](https://mp.weixin.qq.com/s/606_N9j8ACKCODoCbV1lSA)难了不少,做好心里准备! - -# 45.跳跃游戏II - -[力扣题目链接](https://leetcode-cn.com/problems/jump-game-ii/) - -给定一个非负整数数组,你最初位于数组的第一个位置。 - -数组中的每个元素代表你在该位置可以跳跃的最大长度。 - -你的目标是使用最少的跳跃次数到达数组的最后一个位置。 - -示例: -* 输入: [2,3,1,1,4] -* 输出: 2 -* 解释: 跳到最后一个位置的最小跳跃数是 2。从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。 - -说明: -假设你总是可以到达数组的最后一个位置。 - - -## 思路 - -本题相对于[55.跳跃游戏](https://programmercarl.com/0055.跳跃游戏.html)还是难了不少。 - -但思路是相似的,还是要看最大覆盖范围。 - -本题要计算最小步数,那么就要想清楚什么时候步数才一定要加一呢? - -贪心的思路,局部最优:当前可移动距离尽可能多走,如果还没到终点,步数再加一。整体最优:一步尽可能多走,从而达到最小步数。 - -思路虽然是这样,但在写代码的时候还不能真的就能跳多远跳远,那样就不知道下一步最远能跳到哪里了。 - -**所以真正解题的时候,要从覆盖范围出发,不管怎么跳,覆盖范围内一定是可以跳到的,以最小的步数增加覆盖范围,覆盖范围一旦覆盖了终点,得到的就是最小步数!** - -**这里需要统计两个覆盖范围,当前这一步的最大覆盖和下一步最大覆盖**。 - -如果移动下标达到了当前这一步的最大覆盖最远距离了,还没有到终点的话,那么就必须再走一步来增加覆盖范围,直到覆盖范围覆盖了终点。 - -如图: - -![45.跳跃游戏II](https://img-blog.csdnimg.cn/20201201232309103.png) - -**图中覆盖范围的意义在于,只要红色的区域,最多两步一定可以到!(不用管具体怎么跳,反正一定可以跳到)** - -## 方法一 - -从图中可以看出来,就是移动下标达到了当前覆盖的最远距离下标时,步数就要加一,来增加覆盖距离。最后的步数就是最少步数。 - -这里还是有个特殊情况需要考虑,当移动下标达到了当前覆盖的最远距离下标时 - -* 如果当前覆盖最远距离下标不是是集合终点,步数就加一,还需要继续走。 -* 如果当前覆盖最远距离下标就是是集合终点,步数不用加一,因为不能再往后走了。 - -C++代码如下:(详细注释) - -```CPP -// 版本一 -class Solution { -public: - int jump(vector& nums) { - if (nums.size() == 1) return 0; - int curDistance = 0; // 当前覆盖最远距离下标 - int ans = 0; // 记录走的最大步数 - int nextDistance = 0; // 下一步覆盖最远距离下标 - for (int i = 0; i < nums.size(); i++) { - nextDistance = max(nums[i] + i, nextDistance); // 更新下一步覆盖最远距离下标 - if (i == curDistance) { // 遇到当前覆盖最远距离下标 - if (curDistance != nums.size() - 1) { // 如果当前覆盖最远距离下标不是终点 - ans++; // 需要走下一步 - curDistance = nextDistance; // 更新当前覆盖最远距离下标(相当于加油了) - if (nextDistance >= nums.size() - 1) break; // 下一步的覆盖范围已经可以达到终点,结束循环 - } else break; // 当前覆盖最远距离下标是集合终点,不用做ans++操作了,直接结束 - } - } - return ans; - } -}; -``` - -## 方法二 - -依然是贪心,思路和方法一差不多,代码可以简洁一些。 - -**针对于方法一的特殊情况,可以统一处理**,即:移动下标只要遇到当前覆盖最远距离的下标,直接步数加一,不考虑是不是终点的情况。 - -想要达到这样的效果,只要让移动下标,最大只能移动到nums.size - 2的地方就可以了。 - -因为当移动下标指向nums.size - 2时: - -* 如果移动下标等于当前覆盖最大距离下标, 需要再走一步(即ans++),因为最后一步一定是可以到的终点。(题目假设总是可以到达数组的最后一个位置),如图: -![45.跳跃游戏II2](https://img-blog.csdnimg.cn/20201201232445286.png) - -* 如果移动下标不等于当前覆盖最大距离下标,说明当前覆盖最远距离就可以直接达到终点了,不需要再走一步。如图: - -![45.跳跃游戏II1](https://img-blog.csdnimg.cn/20201201232338693.png) - -代码如下: - -```CPP -// 版本二 -class Solution { -public: - int jump(vector& nums) { - int curDistance = 0; // 当前覆盖的最远距离下标 - int ans = 0; // 记录走的最大步数 - int nextDistance = 0; // 下一步覆盖的最远距离下标 - for (int i = 0; i < nums.size() - 1; i++) { // 注意这里是小于nums.size() - 1,这是关键所在 - nextDistance = max(nums[i] + i, nextDistance); // 更新下一步覆盖的最远距离下标 - if (i == curDistance) { // 遇到当前覆盖的最远距离下标 - curDistance = nextDistance; // 更新当前覆盖的最远距离下标 - ans++; - } - } - return ans; - } -}; -``` - -可以看出版本二的代码相对于版本一简化了不少! - -其精髓在于控制移动下标i只移动到nums.size() - 2的位置,所以移动下标只要遇到当前覆盖最远距离的下标,直接步数加一,不用考虑别的了。 - -## 总结 - -相信大家可以发现,这道题目相当于[55.跳跃游戏](https://programmercarl.com/0055.跳跃游戏.html)难了不止一点。 - -但代码又十分简单,贪心就是这么巧妙。 - -理解本题的关键在于:**以最小的步数增加最大的覆盖范围,直到覆盖范围覆盖了终点**,这个范围内最小步数一定可以跳到,不用管具体是怎么跳的,不纠结于一步究竟跳一个单位还是两个单位。 - - -## 其他语言版本 - - -### Java -```Java -// 版本一 -class Solution { - public int jump(int[] nums) { - if (nums == null || nums.length == 0 || nums.length == 1) { - return 0; - } - //记录跳跃的次数 - int count=0; - //当前的覆盖最大区域 - int curDistance = 0; - //最大的覆盖区域 - int maxDistance = 0; - for (int i = 0; i < nums.length; i++) { - //在可覆盖区域内更新最大的覆盖区域 - maxDistance = Math.max(maxDistance,i+nums[i]); - //说明当前一步,再跳一步就到达了末尾 - if (maxDistance>=nums.length-1){ - count++; - break; - } - //走到当前覆盖的最大区域时,更新下一步可达的最大区域 - if (i==curDistance){ - curDistance = maxDistance; - count++; - } - } - return count; - } -} -``` - -```java -// 版本二 -class Solution { - public int jump(int[] nums) { - int result = 0; - // 当前覆盖的最远距离下标 - int end = 0; - // 下一步覆盖的最远距离下标 - int temp = 0; - for (int i = 0; i <= end && end < nums.length - 1; ++i) { - temp = Math.max(temp, i + nums[i]); - // 可达位置的改变次数就是跳跃次数 - if (i == end) { - end = temp; - result++; - } - } - return result; - } -} -``` - -### Python - -```python -class Solution: - def jump(self, nums: List[int]) -> int: - if len(nums) == 1: return 0 - ans = 0 - curDistance = 0 - nextDistance = 0 - for i in range(len(nums)): - nextDistance = max(i + nums[i], nextDistance) - if i == curDistance: - if curDistance != len(nums) - 1: - ans += 1 - curDistance = nextDistance - if nextDistance >= len(nums) - 1: break - return ans -``` - -### Go -```Go -func jump(nums []int) int { - dp := make([]int, len(nums)) - dp[0] = 0//初始第一格跳跃数一定为0 - - for i := 1; i < len(nums); i++ { - dp[i] = i - for j := 0; j < i; j++ { - if nums[j] + j >= i {//nums[j]为起点,j为往右跳的覆盖范围,这行表示从j能跳到i - dp[i] = min(dp[j] + 1, dp[i])//更新最小能到i的跳跃次数 - } - } - } - return dp[len(nums)-1] -} - -func min(a, b int) int { - if a < b { - return a - } else { - return b - } -} -``` - -### Javascript -```Javascript -var jump = function(nums) { - let curIndex = 0 - let nextIndex = 0 - let steps = 0 - for(let i = 0; i < nums.length - 1; i++) { - nextIndex = Math.max(nums[i] + i, nextIndex) - if(i === curIndex) { - curIndex = nextIndex - steps++ - } - } - - return steps -}; -``` - -### TypeScript - -```typescript -function jump(nums: number[]): number { - const length: number = nums.length; - let curFarthestIndex: number = 0, - nextFarthestIndex: number = 0; - let curIndex: number = 0; - let stepNum: number = 0; - while (curIndex < length - 1) { - nextFarthestIndex = Math.max(nextFarthestIndex, curIndex + nums[curIndex]); - if (curIndex === curFarthestIndex) { - curFarthestIndex = nextFarthestIndex; - stepNum++; - } - curIndex++; - } - return stepNum; -}; -``` - - - - - ------------------------ -
diff --git "a/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" "b/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" index 4caff04246..4e3ab24a83 100644 --- "a/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" +++ "b/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" @@ -217,18 +217,26 @@ class Solution: ### Go ```Go func jump(nums []int) int { - dp:=make([]int ,len(nums)) - dp[0]=0 - - for i:=1;ii{ - dp[i]=min(dp[j]+1,dp[i]) - } - } - } - return dp[len(nums)-1] + dp := make([]int, len(nums)) + dp[0] = 0//初始第一格跳跃数一定为0 + + for i := 1; i < len(nums); i++ { + dp[i] = i + for j := 0; j < i; j++ { + if nums[j] + j >= i {//nums[j]为起点,j为往右跳的覆盖范围,这行表示从j能跳到i + dp[i] = min(dp[j] + 1, dp[i])//更新最小能到i的跳跃次数 + } + } + } + return dp[len(nums)-1] +} + +func min(a, b int) int { + if a < b { + return a + } else { + return b + } } ``` From d692ffe034aa1d7af9a4e5d76999ee6a506c23b9 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Tue, 3 May 2022 21:51:21 +0800 Subject: [PATCH 0589/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880416.?= =?UTF-8?q?=E5=88=86=E5=89=B2=E7=AD=89=E5=92=8C=E5=AD=90=E9=9B=86.md?= =?UTF-8?q?=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...11\345\222\214\345\255\220\351\233\206.md" | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git "a/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" "b/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" index b24fb365f4..20b7782d67 100644 --- "a/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" +++ "b/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" @@ -416,6 +416,61 @@ var canPartition = function(nums) { }; ``` +TypeScript: + +> 一维数组,简洁 + +```typescript +function canPartition(nums: number[]): boolean { + const sum: number = nums.reduce((pre, cur) => pre + cur); + if (sum % 2 === 1) return false; + const bagSize: number = sum / 2; + const goodsNum: number = nums.length; + const dp: number[] = new Array(bagSize + 1).fill(0); + for (let i = 0; i < goodsNum; i++) { + for (let j = bagSize; j >= nums[i]; j--) { + dp[j] = Math.max(dp[j], dp[j - nums[i]] + nums[i]); + } + } + return dp[bagSize] === bagSize; +}; +``` + +> 二维数组,易懂 + +```typescript +function canPartition(nums: number[]): boolean { + /** + weightArr = nums; + valueArr = nums; + bagSize = sum / 2; (sum为nums各元素总和); + 按照0-1背包处理 + */ + const sum: number = nums.reduce((pre, cur) => pre + cur); + if (sum % 2 === 1) return false; + const bagSize: number = sum / 2; + const weightArr: number[] = nums; + const valueArr: number[] = nums; + const goodsNum: number = weightArr.length; + const dp: number[][] = new Array(goodsNum) + .fill(0) + .map(_ => new Array(bagSize + 1).fill(0)); + for (let i = weightArr[0]; i <= bagSize; i++) { + dp[0][i] = valueArr[0]; + } + for (let i = 1; i < goodsNum; i++) { + for (let j = 0; j <= bagSize; j++) { + if (j < weightArr[i]) { + dp[i][j] = dp[i - 1][j]; + } else { + dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - weightArr[i]] + valueArr[i]); + } + } + } + return dp[goodsNum - 1][bagSize] === bagSize; +}; +``` + From 65cde78559bf18cced2e91b57fba8f92a66437a4 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Wed, 4 May 2022 12:57:05 +0800 Subject: [PATCH 0590/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=881049.?= =?UTF-8?q?=E6=9C=80=E5=90=8E=E4=B8=80=E5=9D=97=E7=9F=B3=E5=A4=B4=E7=9A=84?= =?UTF-8?q?=E9=87=8D=E9=87=8FII.md=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0type?= =?UTF-8?q?script=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\347\232\204\351\207\215\351\207\217II.md" | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git "a/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" "b/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" index ee0ddef2d1..3d256c3dd1 100644 --- "a/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" +++ "b/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" @@ -277,5 +277,26 @@ var lastStoneWeightII = function (stones) { }; ``` +TypeScript: + +```typescript +function lastStoneWeightII(stones: number[]): number { + const sum: number = stones.reduce((pre, cur) => pre + cur); + const bagSize: number = Math.floor(sum / 2); + const weightArr: number[] = stones; + const valueArr: number[] = stones; + const goodsNum: number = weightArr.length; + const dp: number[] = new Array(bagSize + 1).fill(0); + for (let i = 0; i < goodsNum; i++) { + for (let j = bagSize; j >= weightArr[i]; j--) { + dp[j] = Math.max(dp[j], dp[j - weightArr[i]] + valueArr[i]); + } + } + return sum - dp[bagSize] * 2; +}; +``` + + + -----------------------
From ce28066ae92780a3829883b387dc004bc76df57d Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Wed, 4 May 2022 18:06:13 +0800 Subject: [PATCH 0591/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E8=B5=84=E6=BA=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 1d7f219d2c..501c5ed439 100644 --- a/README.md +++ b/README.md @@ -543,6 +543,7 @@ **来看看就知道了,你会发现相见恨晚!** + -
+
From aacbbfbd02613a7110e913fa00298ef0734107ac Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Wed, 4 May 2022 18:11:46 +0800 Subject: [PATCH 0592/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E8=B5=84=E6=BA=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 501c5ed439..38418322b6 100644 --- a/README.md +++ b/README.md @@ -531,7 +531,8 @@ 如果是已工作,备注:姓名-城市-岗位-组队刷题。如果学生,备注:姓名-学校-年级-组队刷题。**备注没有自我介绍不通过哦** -
+ +
@@ -545,5 +546,5 @@ -
+
From b9b7c1530abf7a4b6b68b0f732b5a69cbaae772c Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Wed, 4 May 2022 23:48:12 +0800 Subject: [PATCH 0593/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880494.?= =?UTF-8?q?=E7=9B=AE=E6=A0=87=E5=92=8C.md=EF=BC=89=EF=BC=9A=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...4.\347\233\256\346\240\207\345\222\214.md" | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git "a/problems/0494.\347\233\256\346\240\207\345\222\214.md" "b/problems/0494.\347\233\256\346\240\207\345\222\214.md" index 99b768347d..8ce1f6f1ae 100644 --- "a/problems/0494.\347\233\256\346\240\207\345\222\214.md" +++ "b/problems/0494.\347\233\256\346\240\207\345\222\214.md" @@ -351,6 +351,25 @@ const findTargetSumWays = (nums, target) => { }; ``` +TypeScript: + +```typescript +function findTargetSumWays(nums: number[], target: number): number { + const sum: number = nums.reduce((pre, cur) => pre + cur); + if (Math.abs(target) > sum) return 0; + if ((target + sum) % 2 === 1) return 0; + const bagSize: number = (target + sum) / 2; + const dp: number[] = new Array(bagSize + 1).fill(0); + dp[0] = 1; + for (let i = 0; i < nums.length; i++) { + for (let j = bagSize; j >= nums[i]; j--) { + dp[j] += dp[j - nums[i]]; + } + } + return dp[bagSize]; +}; +``` + ----------------------- From 3c88974f92926f9280d71ea964bdb36b6f097044 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Thu, 5 May 2022 14:15:00 +0800 Subject: [PATCH 0594/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880474.?= =?UTF-8?q?=E4=B8=80=E5=92=8C=E9=9B=B6.md=EF=BC=89=EF=BC=9A=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...4.\344\270\200\345\222\214\351\233\266.md" | 123 ++++++++++++++++++ 1 file changed, 123 insertions(+) diff --git "a/problems/0474.\344\270\200\345\222\214\351\233\266.md" "b/problems/0474.\344\270\200\345\222\214\351\233\266.md" index 964df4a829..d38ce03f89 100644 --- "a/problems/0474.\344\270\200\345\222\214\351\233\266.md" +++ "b/problems/0474.\344\270\200\345\222\214\351\233\266.md" @@ -323,6 +323,129 @@ const findMaxForm = (strs, m, n) => { }; ``` +TypeScript: + +> 滚动数组,二维数组法 + +```typescript +type BinaryInfo = { numOfZero: number, numOfOne: number }; +function findMaxForm(strs: string[], m: number, n: number): number { + const goodsNum: number = strs.length; + const dp: number[][] = new Array(m + 1).fill(0) + .map(_ => new Array(n + 1).fill(0)); + for (let i = 0; i < goodsNum; i++) { + const { numOfZero, numOfOne } = countBinary(strs[i]); + for (let j = m; j >= numOfZero; j--) { + for (let k = n; k >= numOfOne; k--) { + dp[j][k] = Math.max(dp[j][k], dp[j - numOfZero][k - numOfOne] + 1); + } + } + } + return dp[m][n]; +}; +function countBinary(str: string): BinaryInfo { + let numOfZero: number = 0, + numOfOne: number = 0; + for (let s of str) { + if (s === '0') { + numOfZero++; + } else { + numOfOne++; + } + } + return { numOfZero, numOfOne }; +} +``` + +> 传统背包,三维数组法 + +```typescript +type BinaryInfo = { numOfZero: number, numOfOne: number }; +function findMaxForm(strs: string[], m: number, n: number): number { + /** + dp[i][j][k]: 前i个物品中, 背包的0容量为j, 1容量为k, 最多能放的物品数量 + */ + const goodsNum: number = strs.length; + const dp: number[][][] = new Array(goodsNum).fill(0) + .map(_ => new Array(m + 1) + .fill(0) + .map(_ => new Array(n + 1).fill(0)) + ); + const { numOfZero, numOfOne } = countBinary(strs[0]); + for (let i = numOfZero; i <= m; i++) { + for (let j = numOfOne; j <= n; j++) { + dp[0][i][j] = 1; + } + } + for (let i = 1; i < goodsNum; i++) { + const { numOfZero, numOfOne } = countBinary(strs[i]); + for (let j = 0; j <= m; j++) { + for (let k = 0; k <= n; k++) { + if (j < numOfZero || k < numOfOne) { + dp[i][j][k] = dp[i - 1][j][k]; + } else { + dp[i][j][k] = Math.max(dp[i - 1][j][k], dp[i - 1][j - numOfZero][k - numOfOne] + 1); + } + } + } + } + return dp[dp.length - 1][m][n]; +}; +function countBinary(str: string): BinaryInfo { + let numOfZero: number = 0, + numOfOne: number = 0; + for (let s of str) { + if (s === '0') { + numOfZero++; + } else { + numOfOne++; + } + } + return { numOfZero, numOfOne }; +} +``` + +> 回溯法(会超时) + +```typescript +function findMaxForm(strs: string[], m: number, n: number): number { + /** + 思路:暴力枚举strs的所有子集,记录符合条件子集的最大长度 + */ + let resMax: number = 0; + backTrack(strs, m, n, 0, []); + return resMax; + function backTrack( + strs: string[], m: number, n: number, + startIndex: number, route: string[] + ): void { + if (startIndex === strs.length) return; + for (let i = startIndex, length = strs.length; i < length; i++) { + route.push(strs[i]); + if (isValidSubSet(route, m, n)) { + resMax = Math.max(resMax, route.length); + backTrack(strs, m, n, i + 1, route); + } + route.pop(); + } + } +}; +function isValidSubSet(strs: string[], m: number, n: number): boolean { + let zeroNum: number = 0, + oneNum: number = 0; + strs.forEach(str => { + for (let s of str) { + if (s === '0') { + zeroNum++; + } else { + oneNum++; + } + } + }); + return zeroNum <= m && oneNum <= n; +} +``` + ----------------------- From 1e9cecb665acd511660a9c8c8af48868e20bb871 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Thu, 5 May 2022 16:53:38 +0800 Subject: [PATCH 0595/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=88=E8=83=8C?= =?UTF-8?q?=E5=8C=85=E9=97=AE=E9=A2=98=E7=90=86=E8=AE=BA=E5=9F=BA=E7=A1=80?= =?UTF-8?q?=E5=AE=8C=E5=85=A8=E8=83=8C=E5=8C=85.md=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...14\345\205\250\350\203\214\345\214\205.md" | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" index faa1dc46e2..936a80c79b 100644 --- "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" +++ "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" @@ -340,6 +340,27 @@ function test_completePack2() { } ``` +TypeScript: + +```typescript +// 先遍历物品,再遍历背包容量 +function test_CompletePack(): void { + const weight: number[] = [1, 3, 4]; + const value: number[] = [15, 20, 30]; + const bagSize: number = 4; + const dp: number[] = new Array(bagSize + 1).fill(0); + for (let i = 0; i < weight.length; i++) { + for (let j = weight[i]; j <= bagSize; j++) { + dp[j] = Math.max(dp[j], dp[j - weight[i]] + value[i]); + } + } + console.log(dp); +} +test_CompletePack(); +``` + + + -----------------------
From b82984e24b23940aa95da2a0283ae4cf3c706f7a Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Thu, 5 May 2022 18:11:41 +0800 Subject: [PATCH 0596/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880518.?= =?UTF-8?q?=E9=9B=B6=E9=92=B1=E5=85=91=E6=8D=A2II.md=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\266\351\222\261\345\205\221\346\215\242II.md" | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git "a/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" "b/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" index e72c5f8515..8faf66989e 100644 --- "a/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" +++ "b/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" @@ -258,6 +258,21 @@ const change = (amount, coins) => { } ``` +TypeScript: + +```typescript +function change(amount: number, coins: number[]): number { + const dp: number[] = new Array(amount + 1).fill(0); + dp[0] = 1; + for (let i = 0, length = coins.length; i < length; i++) { + for (let j = coins[i]; j <= amount; j++) { + dp[j] += dp[j - coins[i]]; + } + } + return dp[amount]; +}; +``` + ----------------------- From cb7bf67a4e3a277ecf53ce37d0556c8e2e65f9f3 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Fri, 6 May 2022 11:08:47 +0800 Subject: [PATCH 0597/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880377.?= =?UTF-8?q?=E7=BB=84=E5=90=88=E6=80=BB=E5=92=8C=E2=85=A3.md=EF=BC=89?= =?UTF-8?q?=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...10\346\200\273\345\222\214\342\205\243.md" | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git "a/problems/0377.\347\273\204\345\220\210\346\200\273\345\222\214\342\205\243.md" "b/problems/0377.\347\273\204\345\220\210\346\200\273\345\222\214\342\205\243.md" index aaf27e6123..1d808a3a0a 100644 --- "a/problems/0377.\347\273\204\345\220\210\346\200\273\345\222\214\342\205\243.md" +++ "b/problems/0377.\347\273\204\345\220\210\346\200\273\345\222\214\342\205\243.md" @@ -221,7 +221,27 @@ const combinationSum4 = (nums, target) => { }; ``` +TypeScript: + +```typescript +function combinationSum4(nums: number[], target: number): number { + const dp: number[] = new Array(target + 1).fill(0); + dp[0] = 1; + // 遍历背包 + for (let i = 1; i <= target; i++) { + // 遍历物品 + for (let j = 0, length = nums.length; j < length; j++) { + if (i >= nums[j]) { + dp[i] += dp[i - nums[j]]; + } + } + } + return dp[target]; +}; +``` + Rust + ```Rust impl Solution { pub fn combination_sum4(nums: Vec, target: i32) -> i32 { From 100a4e2b46abf913dacc62637da7faf27bfe060e Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Fri, 6 May 2022 11:56:19 +0800 Subject: [PATCH 0598/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880070.?= =?UTF-8?q?=E7=88=AC=E6=A5=BC=E6=A2=AF=E5=AE=8C=E5=85=A8=E8=83=8C=E5=8C=85?= =?UTF-8?q?=E7=89=88=E6=9C=AC.md=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typesc?= =?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 --- ...14\345\214\205\347\211\210\346\234\254.md" | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git "a/problems/0070.\347\210\254\346\245\274\346\242\257\345\256\214\345\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md" "b/problems/0070.\347\210\254\346\245\274\346\242\257\345\256\214\345\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md" index 2286de2d1f..0f482bb7cb 100644 --- "a/problems/0070.\347\210\254\346\245\274\346\242\257\345\256\214\345\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md" +++ "b/problems/0070.\347\210\254\346\245\274\346\242\257\345\256\214\345\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md" @@ -199,6 +199,28 @@ var climbStairs = function(n) { }; ``` +TypeScript: + +```typescript +function climbStairs(n: number): number { + const m: number = 2; // 本题m为2 + const dp: number[] = new Array(n + 1).fill(0); + dp[0] = 1; + // 遍历背包 + for (let i = 1; i <= n; i++) { + // 遍历物品 + for (let j = 1; j <= m; j++) { + if (j <= i) { + dp[i] += dp[i - j]; + } + } + } + return dp[n]; +}; +``` + + + -----------------------
From cb6f015186ae9d6af13cddf9b929f7bbdfe9bc29 Mon Sep 17 00:00:00 2001 From: cy948 <67412196+cy948@users.noreply.github.com> Date: Fri, 6 May 2022 14:43:58 +0800 Subject: [PATCH 0599/3019] =?UTF-8?q?Update=200112.=E8=B7=AF=E5=BE=84?= =?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 修复了 0113.路径总和-ii 中Java递归解法中的类名大小写问题。 --- ...0\267\257\345\276\204\346\200\273\345\222\214.md" | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git "a/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" "b/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" index 41463ec181..2fdd77417e 100644 --- "a/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" +++ "b/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" @@ -377,22 +377,22 @@ class solution { ```java class solution { - public list> pathsum(treenode root, int targetsum) { - list> res = new arraylist<>(); + public List> pathsum(TreeNode root, int targetsum) { + List> res = new ArrayList<>(); if (root == null) return res; // 非空判断 - - list path = new linkedlist<>(); + + List path = new LinkedList<>(); preorderdfs(root, targetsum, res, path); return res; } - public void preorderdfs(treenode root, int targetsum, list> res, list path) { + public void preorderdfs(TreeNode root, int targetsum, List> res, List path) { path.add(root.val); // 遇到了叶子节点 if (root.left == null && root.right == null) { // 找到了和为 targetsum 的路径 if (targetsum - root.val == 0) { - res.add(new arraylist<>(path)); + res.add(new ArrayList<>(path)); } return; // 如果和不为 targetsum,返回 } From 00b5e2aa64f49ce9273aca6aa8074d98fe4e489a Mon Sep 17 00:00:00 2001 From: eat to 160 pounds <2915390277@qq.com> Date: Fri, 6 May 2022 15:06:32 +0800 Subject: [PATCH 0600/3019] =?UTF-8?q?131=E5=88=86=E5=89=B2=E5=AD=97?= =?UTF-8?q?=E7=AC=A6=E4=B8=B2=E6=9B=B4=E6=B8=85=E6=A5=9A=E7=9A=84typescrip?= =?UTF-8?q?t=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...62\345\233\236\346\226\207\344\270\262.md" | 41 +++++++++++-------- 1 file changed, 23 insertions(+), 18 deletions(-) diff --git "a/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" "b/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" index 10b747cb36..7a702898dc 100644 --- "a/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" +++ "b/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" @@ -454,31 +454,36 @@ var partition = function(s) { ```typescript function partition(s: string): string[][] { - function isPalindromeStr(s: string, left: number, right: number): boolean { - while (left < right) { - if (s[left++] !== s[right--]) { - return false; + const res: string[][] = [] + const path: string[] = [] + const isHuiwen = ( + str: string, + startIndex: number, + endIndex: number + ): boolean => { + for (; startIndex < endIndex; startIndex++, endIndex--) { + if (str[startIndex] !== str[endIndex]) { + return false } } - return true; + return true } - function backTracking(s: string, startIndex: number, route: string[]): void { - let length: number = s.length; - if (length === startIndex) { - resArr.push(route.slice()); - return; + const rec = (str: string, index: number): void => { + if (index >= str.length) { + res.push([...path]) + return } - for (let i = startIndex; i < length; i++) { - if (isPalindromeStr(s, startIndex, i)) { - route.push(s.slice(startIndex, i + 1)); - backTracking(s, i + 1, route); - route.pop(); + for (let i = index; i < str.length; i++) { + if (!isHuiwen(str, index, i)) { + continue } + path.push(str.substring(index, i + 1)) + rec(str, i + 1) + path.pop() } } - const resArr: string[][] = []; - backTracking(s, 0, []); - return resArr; + rec(s, 0) + return res }; ``` From 82a58bc20249bb248dbbb0d90771db0ea60bf017 Mon Sep 17 00:00:00 2001 From: Jamcy123 <1219502823@qq.com> Date: Fri, 6 May 2022 15:49:43 +0800 Subject: [PATCH 0601/3019] =?UTF-8?q?1005.K=E6=AC=A1=E5=8F=96=E5=8F=8D?= =?UTF-8?q?=E5=90=8E=E6=9C=80=E5=A4=A7=E5=8C=96=E7=9A=84=E6=95=B0=E7=BB=84?= =?UTF-8?q?=E5=92=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...2\204\346\225\260\347\273\204\345\222\214.md" | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git "a/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" "b/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" index 79767debcb..202534da8c 100644 --- "a/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" +++ "b/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" @@ -209,6 +209,22 @@ var largestSumAfterKNegations = function(nums, k) { return a + b }) }; + +// 版本二 (优化: 一次遍历) +var largestSumAfterKNegations = function(nums, k) { + nums.sort((a, b) => Math.abs(b) - Math.abs(a)); // 排序 + let sum = 0; + for(let i = 0; i < nums.length; i++) { + if(nums[i] < 0 && k-- > 0) { // 负数取反(k 数量足够时) + nums[i] = -nums[i]; + } + sum += nums[i]; // 求和 + } + if(k % 2 > 0) { // k 有多余的(k若消耗完则应为 -1) + sum -= 2 * nums[nums.length - 1]; // 减去两倍的最小值(因为之前加过一次) + } + return sum; +}; ``` From 08ae851e75f735f45f033a0c5455aef198d3cc92 Mon Sep 17 00:00:00 2001 From: wang <472146630@qq.com> Date: Fri, 6 May 2022 20:45:29 +0800 Subject: [PATCH 0602/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A01035.=E4=B8=8D?= =?UTF-8?q?=E7=9B=B8=E4=BA=A4=E7=9A=84=E7=BA=BF=E5=92=8C1143.=E6=9C=80?= =?UTF-8?q?=E9=95=BF=E5=85=AC=E5=85=B1=E5=AD=90=E5=BA=8F=E5=88=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...70\344\272\244\347\232\204\347\272\277.md" | 22 ++++- ...61\345\255\220\345\272\217\345\210\227.md" | 80 ++++++++++++------- 2 files changed, 71 insertions(+), 31 deletions(-) diff --git "a/problems/1035.\344\270\215\347\233\270\344\272\244\347\232\204\347\272\277.md" "b/problems/1035.\344\270\215\347\233\270\344\272\244\347\232\204\347\272\277.md" index 0602e111f8..279ed8162a 100644 --- "a/problems/1035.\344\270\215\347\233\270\344\272\244\347\232\204\347\272\277.md" +++ "b/problems/1035.\344\270\215\347\233\270\344\272\244\347\232\204\347\272\277.md" @@ -111,7 +111,6 @@ class Solution: Golang: ```go - func maxUncrossedLines(A []int, B []int) int { m, n := len(A), len(B) dp := make([][]int, m+1) @@ -140,7 +139,26 @@ func max(a, b int) int { } ``` - +Rust: + +```rust +pub fn max_uncrossed_lines(nums1: Vec, nums2: Vec) -> i32 { + let (n, m) = (nums1.len(), nums2.len()); + let mut last = vec![0; m + 1]; // 记录滚动数组 + let mut dp = vec![0; m + 1]; + for i in 1..=n { + dp.swap_with_slice(&mut last); + for j in 1..=m { + if nums1[i - 1] == nums2[j - 1] { + dp[j] = last[j - 1] + 1; + } else { + dp[j] = last[j].max(dp[j - 1]); + } + } + } + dp[m] +} +``` JavaScript: diff --git "a/problems/1143.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" "b/problems/1143.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" index fdcc7619ba..ecedf89b6e 100644 --- "a/problems/1143.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/1143.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" @@ -4,40 +4,40 @@

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

-## 1143.最长公共子序列 +## 1143.最长公共子序列 [力扣题目链接](https://leetcode-cn.com/problems/longest-common-subsequence/) -给定两个字符串 text1 和 text2,返回这两个字符串的最长公共子序列的长度。 +给定两个字符串 text1 和 text2,返回这两个字符串的最长公共子序列的长度。 -一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。 +一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。 -例如,"ace" 是 "abcde" 的子序列,但 "aec" 不是 "abcde" 的子序列。两个字符串的「公共子序列」是这两个字符串所共同拥有的子序列。 +例如,"ace" 是 "abcde" 的子序列,但 "aec" 不是 "abcde" 的子序列。两个字符串的「公共子序列」是这两个字符串所共同拥有的子序列。 -若这两个字符串没有公共子序列,则返回 0。 +若这两个字符串没有公共子序列,则返回 0。 -示例 1: +示例 1: -输入:text1 = "abcde", text2 = "ace" -输出:3 -解释:最长公共子序列是 "ace",它的长度为 3。 +输入:text1 = "abcde", text2 = "ace" +输出:3 +解释:最长公共子序列是 "ace",它的长度为 3。 -示例 2: -输入:text1 = "abc", text2 = "abc" -输出:3 -解释:最长公共子序列是 "abc",它的长度为 3。 +示例 2: +输入:text1 = "abc", text2 = "abc" +输出:3 +解释:最长公共子序列是 "abc",它的长度为 3。 -示例 3: -输入:text1 = "abc", text2 = "def" -输出:0 -解释:两个字符串没有公共子序列,返回 0。 +示例 3: +输入:text1 = "abc", text2 = "def" +输出:0 +解释:两个字符串没有公共子序列,返回 0。 -提示: +提示: * 1 <= text1.length <= 1000 * 1 <= text2.length <= 1000 输入的字符串只含有小写英文字符。 -## 思路 +## 思路 本题和[动态规划:718. 最长重复子数组](https://programmercarl.com/0718.最长重复子数组.html)区别在于这里不要求是连续的了,但要有相对顺序,即:"ace" 是 "abcde" 的子序列,但 "aec" 不是 "abcde" 的子序列。 @@ -45,21 +45,21 @@ 1. 确定dp数组(dp table)以及下标的含义 -dp[i][j]:长度为[0, i - 1]的字符串text1与长度为[0, j - 1]的字符串text2的最长公共子序列为dp[i][j] +dp[i][j]:长度为[0, i - 1]的字符串text1与长度为[0, j - 1]的字符串text2的最长公共子序列为dp[i][j] -有同学会问:为什么要定义长度为[0, i - 1]的字符串text1,定义为长度为[0, i]的字符串text1不香么? +有同学会问:为什么要定义长度为[0, i - 1]的字符串text1,定义为长度为[0, i]的字符串text1不香么? 这样定义是为了后面代码实现方便,如果非要定义为为长度为[0, i]的字符串text1也可以,大家可以试一试! 2. 确定递推公式 -主要就是两大情况: text1[i - 1] 与 text2[j - 1]相同,text1[i - 1] 与 text2[j - 1]不相同 +主要就是两大情况: text1[i - 1] 与 text2[j - 1]相同,text1[i - 1] 与 text2[j - 1]不相同 -如果text1[i - 1] 与 text2[j - 1]相同,那么找到了一个公共元素,所以dp[i][j] = dp[i - 1][j - 1] + 1; +如果text1[i - 1] 与 text2[j - 1]相同,那么找到了一个公共元素,所以dp[i][j] = dp[i - 1][j - 1] + 1; 如果text1[i - 1] 与 text2[j - 1]不相同,那就看看text1[0, i - 2]与text2[0, j - 1]的最长公共子序列 和 text1[0, i - 1]与text2[0, j - 2]的最长公共子序列,取最大的。 -即:dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]); +即:dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]); 代码如下: @@ -71,9 +71,9 @@ if (text1[i - 1] == text2[j - 1]) { } ``` -3. dp数组如何初始化 +3. dp数组如何初始化 -先看看dp[i][0]应该是多少呢? +先看看dp[i][0]应该是多少呢? test1[0, i-1]和空串的最长公共子序列自然是0,所以dp[i][0] = 0; @@ -101,7 +101,7 @@ vector> dp(text1.size() + 1, vector(text2.size() + 1, 0)); ![1143.最长公共子序列1](https://img-blog.csdnimg.cn/20210210150215918.jpg) -最后红框dp[text1.size()][text2.size()]为最终结果 +最后红框dp[text1.size()][text2.size()]为最终结果 以上分析完毕,C++代码如下: @@ -158,7 +158,7 @@ class Solution: for i in range(1, len2): for j in range(1, len1): # 开始列出状态转移方程 if text1[j-1] == text2[i-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]) return dp[-1][-1] @@ -189,10 +189,32 @@ func longestCommonSubsequence(text1 string, text2 string) int { func max(a,b int)int { if a>b{ - return a + return a } return b } + +``` + +Rust: +```rust +pub fn longest_common_subsequence(text1: String, text2: String) -> i32 { + let (n, m) = (text1.len(), text2.len()); + let (s1, s2) = (text1.as_bytes(), text2.as_bytes()); + let mut dp = vec![0; m + 1]; + let mut last = vec![0; m + 1]; + for i in 1..=n { + dp.swap_with_slice(&mut last); + for j in 1..=m { + dp[j] = if s1[i - 1] == s2[j - 1] { + last[j - 1] + 1 + } else { + last[j].max(dp[j - 1]) + }; + } + } + dp[m] +} ``` Javascript: From 132e57e2ddd801d7360401e746d945957c7e0801 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=9F=E4=BB=A4=E4=BB=A4?= Date: Sat, 7 May 2022 09:57:27 +0800 Subject: [PATCH 0603/3019] =?UTF-8?q?Update=200332.=E9=87=8D=E6=96=B0?= =?UTF-8?q?=E5=AE=89=E6=8E=92=E8=A1=8C=E7=A8=8B.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 恢复0332 原go代码 --- ...11\346\216\222\350\241\214\347\250\213.md" | 58 +++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git "a/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" "b/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" index d087d97bc1..c71b2a9357 100644 --- "a/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" +++ "b/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" @@ -342,6 +342,64 @@ class Solution: return path ``` +### GO +```go +type pair struct { + target string + visited bool +} +type pairs []*pair + +func (p pairs) Len() int { + return len(p) +} +func (p pairs) Swap(i, j int) { + p[i], p[j] = p[j], p[i] +} +func (p pairs) Less(i, j int) bool { + return p[i].target < p[j].target +} + +func findItinerary(tickets [][]string) []string { + result := []string{} + // map[出发机场] pair{目的地,是否被访问过} + targets := make(map[string]pairs) + for _, ticket := range tickets { + if targets[ticket[0]] == nil { + targets[ticket[0]] = make(pairs, 0) + } + targets[ticket[0]] = append(targets[ticket[0]], &pair{target: ticket[1], visited: false}) + } + for k, _ := range targets { + sort.Sort(targets[k]) + } + result = append(result, "JFK") + var backtracking func() bool + backtracking = func() bool { + if len(tickets)+1 == len(result) { + return true + } + // 取出起飞航班对应的目的地 + for _, pair := range targets[result[len(result)-1]] { + if pair.visited == false { + result = append(result, pair.target) + pair.visited = true + if backtracking() { + return true + } + result = result[:len(result)-1] + pair.visited = false + } + } + return false + } + + backtracking() + + return result +} +``` + ### C语言 ```C From 29f41716f971506a001e8eb369b3f62964b43e8e Mon Sep 17 00:00:00 2001 From: GitHubQAQ <31883473+GitHubQAQ@users.noreply.github.com> Date: Sat, 7 May 2022 10:12:58 +0800 Subject: [PATCH 0604/3019] =?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 1. 优化C++版本剪枝 当字符串长度小于4时,无法组成正确的IP地址,直接返回。 关于判断是否为数字的部分,是否有必要(题目明确说明s仅由数字组成) [从解题角度可以删去,保留的话增加容错,个人意见] --- .../0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" "b/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" index 7910fc50cc..6401824b47 100644 --- "a/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" +++ "b/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" @@ -227,7 +227,7 @@ private: public: vector restoreIpAddresses(string s) { result.clear(); - if (s.size() > 12) return result; // 算是剪枝了 + if (s.size() < 4 || s.size() > 12) return result; // 算是剪枝了 backtracking(s, 0, 0); return result; } From da464016574f14c43fe1e9f7c0d808ed7ea304fb Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Sun, 8 May 2022 10:29:33 +0800 Subject: [PATCH 0605/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880322.?= =?UTF-8?q?=E9=9B=B6=E9=92=B1=E5=85=91=E6=8D=A2.md=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...233\266\351\222\261\345\205\221\346\215\242.md" | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git "a/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" "b/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" index 3a8d0662ab..1df8d61339 100644 --- "a/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" +++ "b/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" @@ -322,7 +322,21 @@ const coinChange = (coins, amount) => { } ``` +TypeScript: +```typescript +function coinChange(coins: number[], amount: number): number { + const dp: number[] = new Array(amount + 1).fill(Infinity); + dp[0] = 0; + for (let i = 0; i < coins.length; i++) { + for (let j = coins[i]; j <= amount; j++) { + if (dp[j - coins[i]] === Infinity) continue; + dp[j] = Math.min(dp[j], dp[j - coins[i]] + 1); + } + } + return dp[amount] === Infinity ? -1 : dp[amount]; +}; +``` -----------------------
From 2722fe7b5eceec7d746f94a63683430205839469 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Sun, 8 May 2022 11:07:39 +0800 Subject: [PATCH 0606/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880279.?= =?UTF-8?q?=E5=AE=8C=E5=85=A8=E5=B9=B3=E6=96=B9=E6=95=B0.md=EF=BC=89?= =?UTF-8?q?=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...50\345\271\263\346\226\271\346\225\260.md" | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git "a/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" "b/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" index 9bad2085e2..5b15639c06 100644 --- "a/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" +++ "b/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" @@ -355,5 +355,24 @@ var numSquares2 = function(n) { }; ``` +TypeScript: + +```typescript +function numSquares(n: number): number { + const goodsNum: number = Math.floor(Math.sqrt(n)); + const dp: number[] = new Array(n + 1).fill(Infinity); + dp[0] = 0; + for (let i = 1; i <= goodsNum; i++) { + const tempVal: number = i * i; + for (let j = tempVal; j <= n; j++) { + dp[j] = Math.min(dp[j], dp[j - tempVal] + 1); + } + } + return dp[n]; +}; +``` + + + -----------------------
From 9b6a447674f3290541e46088962e1e3aa764d827 Mon Sep 17 00:00:00 2001 From: Hayden-Chang <62008508+Hayden-Chang@users.noreply.github.com> Date: Sun, 8 May 2022 14:20:09 +0800 Subject: [PATCH 0607/3019] explain the reason for reverse traversal --- ...6\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" | 1 + 1 file changed, 1 insertion(+) diff --git "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" index dabdfb2d09..ea7c53ad0d 100644 --- "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" +++ "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" @@ -136,6 +136,7 @@ dp[1] = dp[1 - weight[0]] + value[0] = 15 不可以! 因为一维dp的写法,背包容量一定是要倒序遍历(原因上面已经讲了),如果遍历背包容量放在上一层,那么每个dp[j]就只会放入一个物品,即:背包里只放入了一个物品。 +倒叙遍历的原因是,本质上还是一个对二维数组的遍历,并且右下角的值依赖上一层左上角的值,因此需要保证左边的值仍然是上一层的,从右向左覆盖。 (这里如果读不懂,就在回想一下dp[j]的定义,或者就把两个for循环顺序颠倒一下试试!) From 80167289e4895c4116b61a5c2a4fa22e9e2e88b5 Mon Sep 17 00:00:00 2001 From: Hayden-Chang <62008508+Hayden-Chang@users.noreply.github.com> Date: Sun, 8 May 2022 14:24:09 +0800 Subject: [PATCH 0608/3019] =?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-2.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" index ea7c53ad0d..eae01158a9 100644 --- "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" +++ "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" @@ -136,7 +136,8 @@ dp[1] = dp[1 - weight[0]] + value[0] = 15 不可以! 因为一维dp的写法,背包容量一定是要倒序遍历(原因上面已经讲了),如果遍历背包容量放在上一层,那么每个dp[j]就只会放入一个物品,即:背包里只放入了一个物品。 -倒叙遍历的原因是,本质上还是一个对二维数组的遍历,并且右下角的值依赖上一层左上角的值,因此需要保证左边的值仍然是上一层的,从右向左覆盖。 + +倒序遍历的原因是,本质上还是一个对二维数组的遍历,并且右下角的值依赖上一层左上角的值,因此需要保证左边的值仍然是上一层的,从右向左覆盖。 (这里如果读不懂,就在回想一下dp[j]的定义,或者就把两个for循环顺序颠倒一下试试!) From 2fb34b30b38ee73624d65d183955cef3a80caced Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Sun, 8 May 2022 18:28:32 +0800 Subject: [PATCH 0609/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880139.?= =?UTF-8?q?=E5=8D=95=E8=AF=8D=E6=8B=86=E5=88=86.md=EF=BC=89:=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...25\350\257\215\346\213\206\345\210\206.md" | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git "a/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" "b/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" index ac834f047d..5b4e92b9aa 100644 --- "a/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" +++ "b/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" @@ -345,6 +345,48 @@ const wordBreak = (s, wordDict) => { } ``` +TypeScript: + +> 动态规划 + +```typescript +function wordBreak(s: string, wordDict: string[]): boolean { + const dp: boolean[] = new Array(s.length + 1).fill(false); + dp[0] = true; + for (let i = 1; i <= s.length; i++) { + for (let j = 0; j < i; j++) { + const tempStr: string = s.slice(j, i); + if (wordDict.includes(tempStr) && dp[j] === true) { + dp[i] = true; + break; + } + } + } + return dp[s.length]; +}; +``` + +> 记忆化回溯 + +```typescript +function wordBreak(s: string, wordDict: string[]): boolean { + // 只需要记忆结果为false的情况 + const memory: boolean[] = []; + return backTracking(s, wordDict, 0, memory); + function backTracking(s: string, wordDict: string[], startIndex: number, memory: boolean[]): boolean { + if (startIndex >= s.length) return true; + if (memory[startIndex] === false) return false; + for (let i = startIndex + 1, length = s.length; i <= length; i++) { + const str: string = s.slice(startIndex, i); + if (wordDict.includes(str) && backTracking(s, wordDict, i, memory)) + return true; + } + memory[startIndex] = false; + return false; + } +}; +``` + ----------------------- From 21475ad21864ce33fb5a6a113581f2c346be78b6 Mon Sep 17 00:00:00 2001 From: languagege Date: Mon, 9 May 2022 18:51:39 +0800 Subject: [PATCH 0610/3019] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E4=BA=86=E5=85=B6?= =?UTF-8?q?=E4=B8=AD=E4=B8=80=E4=B8=AA=E9=94=99=E5=88=AB=E5=AD=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" "b/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" index 590cf0b924..3a93ac8820 100644 --- "a/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" +++ "b/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" @@ -81,7 +81,7 @@ public: **双指针法(快慢指针法)在数组和链表的操作中是非常常见的,很多考察数组、链表、字符串等操作的面试题,都使用双指针法。** -后序都会一一介绍到,本题代码如下: +后续都会一一介绍到,本题代码如下: ```CPP // 时间复杂度:O(n) From 75198263f91484020c4a4dde421d9ecd989422dd Mon Sep 17 00:00:00 2001 From: changjunkui <506678275@qq.com> Date: Tue, 10 May 2022 08:16:53 +0800 Subject: [PATCH 0611/3019] =?UTF-8?q?Update=200019.=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E9=93=BE=E8=A1=A8=E7=9A=84=E5=80=92=E6=95=B0=E7=AC=ACN?= =?UTF-8?q?=E4=B8=AA=E8=8A=82=E7=82=B9.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 方面改为方便 --- ...225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" "b/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" index 813e9b02fa..b3030a81d1 100644 --- "a/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" +++ "b/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" @@ -39,7 +39,7 @@ 分为如下几步: -* 首先这里我推荐大家使用虚拟头结点,这样方面处理删除实际头结点的逻辑,如果虚拟头结点不清楚,可以看这篇: [链表:听说用虚拟头节点会方便很多?](https://programmercarl.com/0203.移除链表元素.html) +* 首先这里我推荐大家使用虚拟头结点,这样方便处理删除实际头结点的逻辑,如果虚拟头结点不清楚,可以看这篇: [链表:听说用虚拟头节点会方便很多?](https://programmercarl.com/0203.移除链表元素.html) * 定义fast指针和slow指针,初始值为虚拟头结点,如图: From 8bab33d0bba8a080fb614bec6be3b0a5961d7727 Mon Sep 17 00:00:00 2001 From: wang <472146630@qq.com> Date: Tue, 10 May 2022 21:27:54 +0800 Subject: [PATCH 0612/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200300.=E6=9C=80?= =?UTF-8?q?=E9=95=BF=E4=B8=8A=E5=8D=87=E5=AD=90=E5=BA=8F=E5=88=97=E3=80=81?= =?UTF-8?q?0322.=E9=9B=B6=E9=92=B1=E5=85=91=E6=8D=A2=E3=80=810518.?= =?UTF-8?q?=E9=9B=B6=E9=92=B1=E5=85=91=E6=8D=A2II=20=E5=92=8C0674.?= =?UTF-8?q?=E6=9C=80=E9=95=BF=E8=BF=9E=E7=BB=AD=E9=80=92=E5=A2=9E=E5=BA=8F?= =?UTF-8?q?=E5=88=97=E7=9A=84rust=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...07\345\255\220\345\272\217\345\210\227.md" | 17 ++++++++++++++++ ...66\351\222\261\345\205\221\346\215\242.md" | 20 ++++++++++++++++++- ...\351\222\261\345\205\221\346\215\242II.md" | 16 +++++++++++++++ ...22\345\242\236\345\272\217\345\210\227.md" | 19 ++++++++++++++++++ 4 files changed, 71 insertions(+), 1 deletion(-) diff --git "a/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" "b/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" index dfdd51257c..f53d19a1ce 100644 --- "a/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" @@ -168,6 +168,23 @@ func lengthOfLIS(nums []int ) int { } ``` +Rust: +```rust +pub fn length_of_lis(nums: Vec) -> i32 { + let mut dp = vec![1; nums.len() + 1]; + let mut result = 1; + for i in 1..nums.len() { + for j in 0..i { + if nums[j] < nums[i] { + dp[i] = dp[i].max(dp[j] + 1); + } + result = result.max(dp[i]); + } + } + result +} +``` + Javascript ```javascript const lengthOfLIS = (nums) => { diff --git "a/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" "b/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" index 3a8d0662ab..43c735be47 100644 --- "a/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" +++ "b/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" @@ -220,7 +220,7 @@ class Solution: for j in range(coin, amount + 1): dp[j] = min(dp[j], dp[j - coin] + 1) return dp[amount] if dp[amount] < amount + 1 else -1 - + def coinChange1(self, coins: List[int], amount: int) -> int: '''版本二''' # 初始化 @@ -302,6 +302,24 @@ func min(a, b int) int { ``` +Rust: + +```rust +pub fn coin_change(coins: Vec, amount: i32) -> i32 { + let amount = amount as usize; + let mut dp = vec![i32::MAX; amount + 1]; + dp[0] = 0; + for i in 0..coins.len() { + for j in coins[i] as usize..=amount { + if dp[j - coins[i] as usize] != i32::MAX { + dp[j] = dp[j].min(dp[j - coins[i] as usize] + 1); + } + } + } + if dp[amount] == i32::MAX { -1 } else { dp[amount] } +} +``` + Javascript: ```javascript const coinChange = (coins, amount) => { diff --git "a/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" "b/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" index e72c5f8515..0e4a398719 100644 --- "a/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" +++ "b/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" @@ -242,6 +242,22 @@ func change(amount int, coins []int) int { } ``` +Rust: +```rust +pub fn change(amount: i32, coins: Vec) -> i32 { + let amount = amount as usize; + let coins = coins.iter().map(|&c|c as usize).collect::>(); + let mut dp = vec![0usize; amount + 1]; + dp[0] = 1; + for i in 0..coins.len() { + for j in coins[i]..=amount { + dp[j] += dp[j - coins[i]]; + } + } + dp[amount] as i32 +} +``` + Javascript: ```javascript const change = (amount, coins) => { diff --git "a/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" "b/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" index e941d24263..3647149009 100644 --- "a/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" +++ "b/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" @@ -218,6 +218,7 @@ class Solution: return result ``` + > 贪心法: ```python class Solution: @@ -237,6 +238,24 @@ class Solution: Go: +Rust: +```rust +pub fn find_length_of_lcis(nums: Vec) -> i32 { + if nums.is_empty() { + return 0; + } + let mut result = 1; + let mut dp = vec![1; nums.len()]; + for i in 1..nums.len() { + if nums[i - 1] < nums[i] { + dp[i] = dp[i - 1] + 1; + result = result.max(dp[i]); + } + } + result +} +``` + Javascript: > 动态规划: From c62d518e149295783d219ec1871da84af8e5546e Mon Sep 17 00:00:00 2001 From: FizzerYu <36132150+FizzerYu@users.noreply.github.com> Date: Wed, 11 May 2022 01:17:08 +0800 Subject: [PATCH 0613/3019] fix bug --- ...\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" "b/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" index df6a395444..50e39ade5e 100644 --- "a/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" +++ "b/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" @@ -279,7 +279,7 @@ class Solution: root.right = self.insertIntoBST(root.right, val) # 返回更新后的以当前root为根节点的新树 - return roo + return root ``` **递归法** - 无返回值 From 0e5e657a6d5ba057e8dfa77019b25c5404fe9a9b Mon Sep 17 00:00:00 2001 From: 243wresfdxvc Date: Tue, 10 May 2022 23:04:35 +0000 Subject: [PATCH 0614/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200404.=E5=B7=A6?= =?UTF-8?q?=E5=8F=B6=E5=AD=90=E4=B9=8B=E5=92=8C.md=20C=E8=AF=AD=E8=A8=80?= =?UTF-8?q?=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...66\345\255\220\344\271\213\345\222\214.md" | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git "a/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" "b/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" index 6420da819d..d7fd629e68 100644 --- "a/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" +++ "b/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" @@ -466,6 +466,55 @@ func sumOfLeftLeaves(_ root: TreeNode?) -> Int { } ``` +## C +递归法: +```c +int sumOfLeftLeaves(struct TreeNode* root){ + // 递归结束条件:若当前结点为空,返回0 + if(!root) + return 0; + + // 递归取左子树的左结点和和右子树的左结点和 + int leftValue = sumOfLeftLeaves(root->left); + int rightValue = sumOfLeftLeaves(root->right); + + // 若当前结点的左结点存在,且其为叶子结点。取它的值 + int midValue = 0; + if(root->left && (!root->left->left && !root->left->right)) + midValue = root->left->val; + + return leftValue + rightValue + midValue; +} +``` + +迭代法: +```c +int sumOfLeftLeaves(struct TreeNode* root){ + struct TreeNode* stack[1000]; + int stackTop = 0; + + // 若传入root结点不为空,将其入栈 + if(root) + stack[stackTop++] = root; + + int sum = 0; + //若栈不为空,进行循环 + while(stackTop) { + // 出栈栈顶元素 + struct TreeNode *topNode = stack[--stackTop]; + // 若栈顶元素的左孩子为左叶子结点,将其值加入sum中 + if(topNode->left && (!topNode->left->left && !topNode->left->right)) + sum += topNode->left->val; + + // 若当前栈顶结点有左右孩子。将他们加入栈中进行遍历 + if(topNode->right) + stack[stackTop++] = topNode->right; + if(topNode->left) + stack[stackTop++] = topNode->left; + } + return sum; +} +``` ----------------------- From d92aa2c52f0589cca9dbf1a7624f9312395b63fe Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 11 May 2022 00:39:59 +0100 Subject: [PATCH 0615/3019] =?UTF-8?q?Add=200112.=E8=B7=AF=E5=BE=84?= =?UTF-8?q?=E6=80=BB=E5=92=8C.md=20C=E8=AF=AD=E8=A8=80=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...57\345\276\204\346\200\273\345\222\214.md" | 57 +++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git "a/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" "b/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" index 41463ec181..6433996c57 100644 --- "a/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" +++ "b/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" @@ -1006,6 +1006,63 @@ func traversal(_ cur: TreeNode?, count: Int) { } ``` +## C +0112.路径总和 +递归法: +```c +bool hasPathSum(struct TreeNode* root, int targetSum){ + // 递归结束条件:若当前节点不存在,返回false + if(!root) + return false; + // 若当前节点为叶子节点,且targetSum-root的值为0。(当前路径上的节点值的和满足条件)返回true + if(!root->right && !root->left && targetSum == root->val) + return true; + + // 查看左子树和右子树的所有节点是否满足条件 + return hasPathSum(root->right, targetSum - root->val) || hasPathSum(root->left, targetSum - root->val); +} +``` + +迭代法: +```c +// 存储一个节点以及当前的和 +struct Pair { + struct TreeNode* node; + int sum; +}; + +bool hasPathSum(struct TreeNode* root, int targetSum){ + struct Pair stack[1000]; + int stackTop = 0; + + // 若root存在,则将节点和值封装成一个pair入栈 + if(root) { + struct Pair newPair = {root, root->val}; + stack[stackTop++] = newPair; + } + + // 当栈不为空时 + while(stackTop) { + // 出栈栈顶元素 + struct Pair topPair = stack[--stackTop]; + // 若栈顶元素为叶子节点,且和为targetSum时,返回true + if(!topPair.node->left && !topPair.node->right && topPair.sum == targetSum) + return true; + + // 若当前栈顶节点有左右孩子,计算和并入栈 + if(topPair.node->left) { + struct Pair newPair = {topPair.node->left, topPair.sum + topPair.node->left->val}; + stack[stackTop++] = newPair; + } + if(topPair.node->right) { + struct Pair newPair = {topPair.node->right, topPair.sum + topPair.node->right->val}; + stack[stackTop++] = newPair; + } + } + return false; +} +``` + ----------------------- From cc2c2adb0987a5e2e82eed75a93be068da6388a4 Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Wed, 11 May 2022 16:03:22 +0800 Subject: [PATCH 0616/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200977.=E6=9C=89?= =?UTF-8?q?=E5=BA=8F=E6=95=B0=E7=BB=84=E7=9A=84=E5=B9=B3=E6=96=B9.md=20Sca?= =?UTF-8?q?la=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...04\347\232\204\345\271\263\346\226\271.md" | 36 ++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git "a/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" "b/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" index 24276bcff0..0e79a3d654 100644 --- "a/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" +++ "b/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" @@ -358,7 +358,41 @@ class Solution { } } ``` - +Scala: + +双指针: +```scala +object Solution { + def sortedSquares(nums: Array[Int]): Array[Int] = { + val res: Array[Int] = new Array[Int](nums.length) + var top = nums.length - 1 + var i = 0 + var j = nums.length - 1 + while (i <= j) { + if (nums(i) * nums(i) <= nums(j) * nums(j)) { + // 当左侧平方小于等于右侧,res数组顶部放右侧的平方,并且top下移,j左移 + res(top) = nums(j) * nums(j) + top -= 1 + j -= 1 + } else { + // 当左侧平方大于右侧,res数组顶部放左侧的平方,并且top下移,i右移 + res(top) = nums(i) * nums(i) + top -= 1 + i += 1 + } + } + res + } +} +``` +骚操作(暴力思路): +```scala +object Solution { + def sortedSquares(nums: Array[Int]): Array[Int] = { + nums.map(x=>{x*x}).sortWith(_ < _) + } +} +``` ----------------------- From 842c04208b163c4782fb7070d949f5feb0c01bee Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Wed, 11 May 2022 16:35:58 +0800 Subject: [PATCH 0617/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=88=E8=83=8C?= =?UTF-8?q?=E5=8C=85=E9=97=AE=E9=A2=98=E7=90=86=E8=AE=BA=E5=9F=BA=E7=A1=80?= =?UTF-8?q?=E5=A4=9A=E9=87=8D=E8=83=8C=E5=8C=85.md=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...32\351\207\215\350\203\214\345\214\205.md" | 58 +++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\244\232\351\207\215\350\203\214\345\214\205.md" "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\244\232\351\207\215\350\203\214\345\214\205.md" index a988db2c82..712380f4f4 100644 --- "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\244\232\351\207\215\350\203\214\345\214\205.md" +++ "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\244\232\351\207\215\350\203\214\345\214\205.md" @@ -334,6 +334,64 @@ func Test_multiplePack(t *testing.T) { PASS ``` +TypeScript: + +> 版本一(改变数据源): + +```typescript +function testMultiPack() { + const bagSize: number = 10; + const weightArr: number[] = [1, 3, 4], + valueArr: number[] = [15, 20, 30], + amountArr: number[] = [2, 3, 2]; + for (let i = 0, length = amountArr.length; i < length; i++) { + while (amountArr[i] > 1) { + weightArr.push(weightArr[i]); + valueArr.push(valueArr[i]); + amountArr[i]--; + } + } + const goodsNum: number = weightArr.length; + const dp: number[] = new Array(bagSize + 1).fill(0); + // 遍历物品 + for (let i = 0; i < goodsNum; i++) { + // 遍历背包容量 + for (let j = bagSize; j >= weightArr[i]; j--) { + dp[j] = Math.max(dp[j], dp[j - weightArr[i]] + valueArr[i]); + } + } + console.log(dp); +} +testMultiPack(); +``` + +> 版本二(改变遍历方式): + +```typescript +function testMultiPack() { + const bagSize: number = 10; + const weightArr: number[] = [1, 3, 4], + valueArr: number[] = [15, 20, 30], + amountArr: number[] = [2, 3, 2]; + const goodsNum: number = weightArr.length; + const dp: number[] = new Array(bagSize + 1).fill(0); + // 遍历物品 + for (let i = 0; i < goodsNum; i++) { + // 遍历物品个数 + for (let j = 0; j < amountArr[i]; j++) { + // 遍历背包容量 + for (let k = bagSize; k >= weightArr[i]; k--) { + dp[k] = Math.max(dp[k], dp[k - weightArr[i]] + valueArr[i]); + } + } + } + console.log(dp); +} +testMultiPack(); +``` + + + -----------------------
From 871d96a2f9202504f2f5c754da7404f602a9f073 Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Wed, 11 May 2022 16:48:59 +0800 Subject: [PATCH 0618/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200209.=E9=95=BF?= =?UTF-8?q?=E5=BA=A6=E6=9C=80=E5=B0=8F=E7=9A=84=E5=AD=90=E6=95=B0=E7=BB=84?= =?UTF-8?q?.md=20Scala=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...04\345\255\220\346\225\260\347\273\204.md" | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git "a/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" "b/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" index fd72cf1b3a..78b8156cdd 100644 --- "a/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" +++ "b/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" @@ -400,6 +400,54 @@ class Solution { } } ``` +Scala: + +滑动窗口: +```scala +object Solution { + def minSubArrayLen(target: Int, nums: Array[Int]): Int = { + var result = Int.MaxValue // 返回结果,默认最大值 + var left = 0 // 慢指针,当sum>=target,向右移动 + var sum = 0 // 窗口值的总和 + for (right <- 0 until nums.length) { + sum += nums(right) + while (sum >= target) { + result = math.min(result, right - left + 1) // 产生新结果 + sum -= nums(left) // 左指针移动,窗口总和减去左指针的值 + left += 1 // 左指针向右移动 + } + } + // 相当于三元运算符,return关键字可以省略 + if (result == Int.MaxValue) 0 else result + } +} +``` + +暴力解法: +```scala +object Solution { + def minSubArrayLen(target: Int, nums: Array[Int]): Int = { + import scala.util.control.Breaks + var res = Int.MaxValue + var subLength = 0 + for (i <- 0 until nums.length) { + var sum = 0 + Breaks.breakable( + for (j <- i until nums.length) { + sum += nums(j) + if (sum >= target) { + subLength = j - i + 1 + res = math.min(subLength, res) + Breaks.break() + } + } + ) + } + // 相当于三元运算符 + if (res == Int.MaxValue) 0 else res + } +} +``` -----------------------
From cb2fea63e7f5e616f697a715b9d523b6ba877308 Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 11 May 2022 09:50:47 +0100 Subject: [PATCH 0619/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200113.=E8=B7=AF?= =?UTF-8?q?=E5=BE=84=E6=80=BB=E5=92=8CII=20C=E8=AF=AD=E8=A8=80=E8=A7=A3?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...57\345\276\204\346\200\273\345\222\214.md" | 65 ++++++++++++++++++- 1 file changed, 64 insertions(+), 1 deletion(-) diff --git "a/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" "b/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" index 6433996c57..de155b4524 100644 --- "a/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" +++ "b/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" @@ -1007,7 +1007,7 @@ func traversal(_ cur: TreeNode?, count: Int) { ``` ## C -0112.路径总和 +> 0112.路径总和 递归法: ```c bool hasPathSum(struct TreeNode* root, int targetSum){ @@ -1062,6 +1062,69 @@ bool hasPathSum(struct TreeNode* root, int targetSum){ return false; } ``` +> 0113.路径总和 II +```c +int** ret; +int* path; +int* colSize; +int retTop; +int pathTop; + +void traversal(const struct TreeNode* const node, int count) { + // 若当前节点为叶子节点 + if(!node->right && !node->left) { + // 若当前path上的节点值总和等于targetSum。 + if(count == 0) { + // 复制当前path + int *curPath = (int*)malloc(sizeof(int) * pathTop); + memcpy(curPath, path, sizeof(int) * pathTop); + // 记录当前path的长度为pathTop + colSize[retTop] = pathTop; + // 将当前path加入到ret数组中 + ret[retTop++] = curPath; + } + return; + } + + // 若节点有左/右孩子 + if(node->left) { + // 将左孩子的值加入path中 + path[pathTop++] = node->left->val; + traversal(node->left, count - node->left->val); + // 回溯 + pathTop--; + } + if(node->right) { + // 将右孩子的值加入path中 + path[pathTop++] = node->right->val; + traversal(node->right, count - node->right->val); + // 回溯 + --pathTop; + } +} + +int** pathSum(struct TreeNode* root, int targetSum, int* returnSize, int** returnColumnSizes){ + // 初始化数组 + ret = (int**)malloc(sizeof(int*) * 1000); + path = (int*)malloc(sizeof(int*) * 1000); + colSize = (int*)malloc(sizeof(int) * 1000); + retTop = pathTop = 0; + *returnSize = 0; + + // 若根节点不存在,返回空的ret + if(!root) + return ret; + // 将根节点加入到path中 + path[pathTop++] = root->val; + traversal(root, targetSum - root->val); + + // 设置返回ret数组大小,以及其中每个一维数组元素的长度 + *returnSize = retTop; + *returnColumnSizes = colSize; + + return ret; +} +``` From c363e9da86973e5dafaa5e765c9c6318b5eb9723 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Wed, 11 May 2022 16:59:05 +0800 Subject: [PATCH 0620/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880198.?= =?UTF-8?q?=E6=89=93=E5=AE=B6=E5=8A=AB=E8=88=8D.md=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...23\345\256\266\345\212\253\350\210\215.md" | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git "a/problems/0198.\346\211\223\345\256\266\345\212\253\350\210\215.md" "b/problems/0198.\346\211\223\345\256\266\345\212\253\350\210\215.md" index dfe1f3a062..a828b9a9d6 100644 --- "a/problems/0198.\346\211\223\345\256\266\345\212\253\350\210\215.md" +++ "b/problems/0198.\346\211\223\345\256\266\345\212\253\350\210\215.md" @@ -189,6 +189,29 @@ const rob = nums => { }; ``` +TypeScript: + +```typescript +function rob(nums: number[]): number { + /** + dp[i]: 前i个房屋能偷到的最大金额 + dp[0]: nums[0]; + dp[1]: max(nums[0], nums[1]); + ... + dp[i]: max(dp[i-1], dp[i-2]+nums[i]); + */ + const length: number = nums.length; + if (length === 1) return nums[0]; + const dp: number[] = []; + dp[0] = nums[0]; + dp[1] = Math.max(nums[0], nums[1]); + for (let i = 2; i < length; i++) { + dp[i] = Math.max(dp[i - 1], dp[i - 2] + nums[i]); + } + return dp[length - 1]; +}; +``` + From a8cfc460e7143e6b6d8486ad9e8d88e1c9759211 Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Wed, 11 May 2022 17:37:12 +0800 Subject: [PATCH 0621/3019] =?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=20Scala=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\346\227\213\347\237\251\351\230\265II.md" | 53 ++++++++++++++++++- 1 file changed, 52 insertions(+), 1 deletion(-) diff --git "a/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" "b/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" index a7b19a34fe..f3b8e1ce24 100644 --- "a/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" +++ "b/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" @@ -564,6 +564,57 @@ int** generateMatrix(int n, int* returnSize, int** returnColumnSizes){ return ans; } ``` - +Scala: +```scala +object Solution { + def generateMatrix(n: Int): Array[Array[Int]] = { + var res = Array.ofDim[Int](n, n) // 定义一个n*n的二维矩阵 + var num = 1 // 标志当前到了哪个数字 + var i = 0 // 横坐标 + var j = 0 // 竖坐标 + + while (num <= n * n) { + // 向右:当j不越界,并且下一个要填的数字是空白时 + while (j < n && res(i)(j) == 0) { + res(i)(j) = num // 当前坐标等于num + num += 1 // num++ + j += 1 // 竖坐标+1 + } + i += 1 // 下移一行 + j -= 1 // 左移一列 + + // 剩下的都同上 + + // 向下 + while (i < n && res(i)(j) == 0) { + res(i)(j) = num + num += 1 + i += 1 + } + i -= 1 + j -= 1 + + // 向左 + while (j >= 0 && res(i)(j) == 0) { + res(i)(j) = num + num += 1 + j -= 1 + } + i -= 1 + j += 1 + + // 向上 + while (i >= 0 && res(i)(j) == 0) { + res(i)(j) = num + num += 1 + i -= 1 + } + i += 1 + j += 1 + } + res + } +} +``` -----------------------
From 296485551542d296e27486e985406d7944f3aa9a Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Wed, 11 May 2022 18:35:43 +0800 Subject: [PATCH 0622/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880213.?= =?UTF-8?q?=E6=89=93=E5=AE=B6=E5=8A=AB=E8=88=8DII.md=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\345\256\266\345\212\253\350\210\215II.md" | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git "a/problems/0213.\346\211\223\345\256\266\345\212\253\350\210\215II.md" "b/problems/0213.\346\211\223\345\256\266\345\212\253\350\210\215II.md" index 8e569e46cf..9e698d01c0 100644 --- "a/problems/0213.\346\211\223\345\256\266\345\212\253\350\210\215II.md" +++ "b/problems/0213.\346\211\223\345\256\266\345\212\253\350\210\215II.md" @@ -165,7 +165,30 @@ const robRange = (nums, start, end) => { return dp[end] } ``` +TypeScript: + +```typescript +function rob(nums: number[]): number { + const length: number = nums.length; + if (length === 0) return 0; + if (length === 1) return nums[0]; + return Math.max(robRange(nums, 0, length - 2), + robRange(nums, 1, length - 1)); +}; +function robRange(nums: number[], start: number, end: number): number { + if (start === end) return nums[start]; + const dp: number[] = []; + dp[start] = nums[start]; + dp[start + 1] = Math.max(nums[start], nums[start + 1]); + for (let i = start + 2; i <= end; i++) { + dp[i] = Math.max(dp[i - 1], dp[i - 2] + nums[i]); + } + return dp[end]; +} +``` + Go: + ```go // 打家劫舍Ⅱ 动态规划 // 时间复杂度O(n) 空间复杂度O(n) From 558dc3343150b1a91a1f307c0bb1fcb881abcd20 Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Wed, 11 May 2022 19:11:53 +0800 Subject: [PATCH 0623/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20=E9=93=BE?= =?UTF-8?q?=E8=A1=A8=E7=90=86=E8=AE=BA=E5=9F=BA=E7=A1=80.md=20Scala?= =?UTF-8?q?=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...250\347\220\206\350\256\272\345\237\272\347\241\200.md" | 7 +++++++ 1 file changed, 7 insertions(+) diff --git "a/problems/\351\223\276\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\351\223\276\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" index 095282f54f..9dddf1e232 100644 --- "a/problems/\351\223\276\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\351\223\276\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -210,6 +210,13 @@ type ListNode struct { } ``` +Scala: +```scala +class ListNode(_x: Int = 0, _next: ListNode = null) { + var next: ListNode = _next + var x: Int = _x +} +``` ----------------------- From 8a562b7a2511b44705a6d9e28388738d6a452848 Mon Sep 17 00:00:00 2001 From: UndeadSheep Date: Wed, 11 May 2022 19:44:09 +0800 Subject: [PATCH 0624/3019] =?UTF-8?q?=E6=96=B0=E5=A2=9E=20=E5=93=88?= =?UTF-8?q?=E5=B8=8C=E8=A1=A8=E9=83=A8=E5=88=86=E7=9A=84=20C#=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...44\346\225\260\344\271\213\345\222\214.md" | 18 +++++++++++++ ...2.\345\277\253\344\271\220\346\225\260.md" | 23 ++++++++++++++++ ...15\345\274\202\344\275\215\350\257\215.md" | 19 +++++++++++++ ...04\347\232\204\344\272\244\351\233\206.md" | 18 +++++++++++++ ...3.\350\265\216\351\207\221\344\277\241.md" | 17 ++++++++++++ ...\346\225\260\347\233\270\345\212\240II.md" | 27 +++++++++++++++++++ 6 files changed, 122 insertions(+) diff --git "a/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" "b/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" index 9571a7737b..459a66ad8c 100644 --- "a/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" @@ -274,6 +274,24 @@ class Solution { } } ``` +C#: +```csharp +public class Solution { + public int[] TwoSum(int[] nums, int target) { + Dictionary dic= new Dictionary(); + for(int i=0;i diff --git "a/problems/0202.\345\277\253\344\271\220\346\225\260.md" "b/problems/0202.\345\277\253\344\271\220\346\225\260.md" index 741a735a5d..51a79aff96 100644 --- "a/problems/0202.\345\277\253\344\271\220\346\225\260.md" +++ "b/problems/0202.\345\277\253\344\271\220\346\225\260.md" @@ -385,5 +385,28 @@ bool isHappy(int n){ return bHappy; } ``` + +C#: +```csharp +public class Solution { + private int getSum(int n) { + int sum = 0; + //每位数的换算 + while (n > 0) { + sum += (n % 10) * (n % 10); + n /= 10; + } + return sum; + } + public bool IsHappy(int n) { + HashSet set = new HashSet(); + while(n != 1 && !set.Contains(n)) { //判断避免循环 + set.Add(n); + n = getSum(n); + } + return n == 1; + } +} +``` -----------------------
diff --git "a/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" "b/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" index 080166fd34..878b24662c 100644 --- "a/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" +++ "b/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" @@ -307,6 +307,25 @@ impl Solution { } } ``` + +C#: +```csharp + public bool IsAnagram(string s, string t) { + int sl=s.Length,tl=t.Length; + if(sl!=tl) return false; + int[] a = new int[26]; + for(int i = 0; i < sl; i++){ + a[s[i] - 'a']++; + a[t[i] - 'a']--; + } + foreach (int i in a) + { + if (i != 0) + return false; + } + return true; + } +``` ## 相关题目 * 383.赎金信 diff --git "a/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" "b/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" index 45f19b6ef2..7f8958d232 100644 --- "a/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" +++ "b/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" @@ -313,6 +313,24 @@ int* intersection1(int* nums1, int nums1Size, int* nums2, int nums2Size, int* re } ``` +C#: +```csharp + public int[] Intersection(int[] nums1, int[] nums2) { + if(nums1==null||nums1.Length==0||nums2==null||nums1.Length==0) + return new int[0]; //注意数组条件 + HashSet one = Insert(nums1); + HashSet two = Insert(nums2); + one.IntersectWith(two); + return one.ToArray(); + } + public HashSet Insert(int[] nums){ + HashSet one = new HashSet(); + foreach(int num in nums){ + one.Add(num); + } + return one; + } +``` ## 相关题目 * 350.两个数组的交集 II diff --git "a/problems/0383.\350\265\216\351\207\221\344\277\241.md" "b/problems/0383.\350\265\216\351\207\221\344\277\241.md" index 5d9e8295c6..6d6efc552b 100644 --- "a/problems/0383.\350\265\216\351\207\221\344\277\241.md" +++ "b/problems/0383.\350\265\216\351\207\221\344\277\241.md" @@ -361,5 +361,22 @@ impl Solution { } ``` +C#: +```csharp +public bool CanConstruct(string ransomNote, string magazine) { + if(ransomNote.Length > magazine.Length) return false; + int[] letters = new int[26]; + foreach(char c in magazine){ + letters[c-'a']++; + } + foreach(char c in ransomNote){ + letters[c-'a']--; + if(letters[c-'a']<0){ + return false; + } + } + return true; + } +``` -----------------------
diff --git "a/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" "b/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" index a6cd413b19..962fe7a541 100644 --- "a/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" +++ "b/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" @@ -318,5 +318,32 @@ impl Solution { } ``` +C#: +```csharp +public int FourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) { + Dictionary dic = new Dictionary(); + foreach(var i in nums1){ + foreach(var j in nums2){ + int sum = i + j; + if(dic.ContainsKey(sum)){ + dic[sum]++; + }else{ + dic.Add(sum, 1); + } + + } + } + int res = 0; + foreach(var a in nums3){ + foreach(var b in nums4){ + int sum = a+b; + if(dic.TryGetValue(-sum, out var result)){ + res += result; + } + } + } + return res; + } +``` -----------------------
From ef8564a5930805ace91776c5648fa7110800c2d7 Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Wed, 11 May 2022 19:51:07 +0800 Subject: [PATCH 0625/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200203.=E7=A7=BB?= =?UTF-8?q?=E9=99=A4=E9=93=BE=E8=A1=A8=E5=85=83=E7=B4=A0.md=20Scala?= =?UTF-8?q?=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...76\350\241\250\345\205\203\347\264\240.md" | 32 ++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git "a/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" "b/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" index c34831b768..53230c0b6c 100644 --- "a/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" +++ "b/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" @@ -446,6 +446,36 @@ impl Solution { } } ``` - +Scala: +```scala +/** + * Definition for singly-linked list. + * class ListNode(_x: Int = 0, _next: ListNode = null) { + * var next: ListNode = _next + * var x: Int = _x + * } + */ +object Solution { + def removeElements(head: ListNode, `val`: Int): ListNode = { + if (head == null) return head + var dummy = new ListNode(-1, head) // 定义虚拟头节点 + var cur = head // cur 表示当前节点 + var pre = dummy // pre 表示cur前一个节点 + while (cur != null) { + if (cur.x == `val`) { + // 相等,就删除那么cur的前一个节点pre执行cur的下一个 + pre.next = cur.next + } else { + // 不相等,pre就等于当前cur节点 + pre = cur + } + // 向下迭代 + cur = cur.next + } + // 最终返回dummy的下一个,就是链表的头 + dummy.next + } +} +``` -----------------------
From 898016b8a98aa7eeb2445681e66f0302a79c28ae Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Wed, 11 May 2022 21:13:42 +0800 Subject: [PATCH 0626/3019] =?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.md=20Scala=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...76\350\256\241\351\223\276\350\241\250.md" | 68 +++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git "a/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" "b/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" index 37ce15adce..dcdb53f44e 100644 --- "a/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" +++ "b/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" @@ -1154,7 +1154,75 @@ class MyLinkedList { } ``` +Scala: +```scala +class ListNode(_x: Int = 0, _next: ListNode = null) { + var next: ListNode = _next + var x: Int = _x +} + +class MyLinkedList() { + + var size = 0 // 链表尺寸 + var dummy: ListNode = new ListNode(0) // 虚拟头节点 + + // 获取第index个节点的值 + def get(index: Int): Int = { + if (index < 0 || index >= size) { + return -1; + } + var cur = dummy + for (i <- 0 to index) { + cur = cur.next + } + cur.x // 返回cur的值 + } + + // 在链表最前面插入一个节点 + def addAtHead(`val`: Int) { + addAtIndex(0, `val`) + } + + // 在链表最后面插入一个节点 + def addAtTail(`val`: Int) { + addAtIndex(size, `val`) + } + + // 在第index个节点之前插入一个新节点 + // 如果index等于链表长度,则说明新插入的节点是尾巴 + // 如果index等于0,则说明新插入的节点是头 + // 如果index>链表长度,则说明为空 + def addAtIndex(index: Int, `val`: Int) { + if (index > size) { + return + } + var loc = index // 因为参数index是val不可变类型,所以需要赋值给一个可变类型 + if (index < 0) { + loc = 0 + } + size += 1 //链表尺寸+1 + var pre = dummy + for (i <- 0 until loc) { + pre = pre.next + } + val node: ListNode = new ListNode(`val`, pre.next) + pre.next = node + } + // 删除第index个节点 + def deleteAtIndex(index: Int) { + if (index < 0 || index >= size) { + return + } + size -= 1 + var pre = dummy + for (i <- 0 until index) { + pre = pre.next + } + pre.next = pre.next.next + } +} +``` ----------------------- From 923ce563f1461876fbed667f8a79194ccb060096 Mon Sep 17 00:00:00 2001 From: yangtzech Date: Wed, 11 May 2022 21:30:43 +0800 Subject: [PATCH 0627/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20=EF=BC=880102.?= =?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=A0=91=E7=9A=84=E5=B1=82=E5=BA=8F=E9=81=8D?= =?UTF-8?q?=E5=8E=86.md=EF=BC=89=EF=BC=9A102.=E4=BA=8C=E5=8F=89=E6=A0=91?= =?UTF-8?q?=E7=9A=84=E5=B1=82=E5=BA=8F=E9=81=8D=E5=8E=86=20=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=20c++=20=E9=80=92=E5=BD=92=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...02\345\272\217\351\201\215\345\216\206.md" | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" index ab8f2e572e..5f69f53d76 100644 --- "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" +++ "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" @@ -82,6 +82,26 @@ public: } }; ``` +```CPP +# 递归法 +class Solution { +public: + void order(TreeNode* cur, vector>& result, int depth) + { + if (cur == nullptr) return; + if (result.size() == depth) result.push_back(vector()); + result[depth].push_back(cur->val); + order(cur->left, result, depth + 1); + order(cur->right, result, depth + 1); + } + vector> levelOrder(TreeNode* root) { + vector> result; + int depth = 0; + order(root, result, depth); + return result; + } +}; +``` python3代码: From 3606a624237334eddee98308e39daedbb2d250b0 Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Wed, 11 May 2022 23:03:42 +0800 Subject: [PATCH 0628/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200206.=E7=BF=BB?= =?UTF-8?q?=E8=BD=AC=E9=93=BE=E8=A1=A8.md=20Scala=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...73\350\275\254\351\223\276\350\241\250.md" | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git "a/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md" "b/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md" index 941928baae..25b16907e4 100644 --- "a/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md" +++ "b/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md" @@ -496,6 +496,40 @@ struct ListNode* reverseList(struct ListNode* head){ return reverse(NULL, head); } ``` +Scala: +双指针法: +```scala +object Solution { + def reverseList(head: ListNode): ListNode = { + var pre: ListNode = null + var cur = head + while (cur != null) { + var tmp = cur.next + cur.next = pre + pre = cur + cur = tmp + } + pre + } +} +``` +递归法: +```scala +object Solution { + def reverseList(head: ListNode): ListNode = { + reverse(null, head) + } + + def reverse(pre: ListNode, cur: ListNode): ListNode = { + if (cur == null) { + return pre // 如果当前cur为空,则返回pre + } + val tmp: ListNode = cur.next + cur.next = pre + reverse(cur, tmp) // 此时cur成为前一个节点,tmp是当前节点 + } +} +``` -----------------------
From 83086c903d77496e6fa34e7e4b0069e27ad1210c Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Thu, 12 May 2022 10:13:00 +0800 Subject: [PATCH 0629/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200024.=E4=B8=A4?= =?UTF-8?q?=E4=B8=A4=E4=BA=A4=E6=8D=A2=E9=93=BE=E8=A1=A8=E4=B8=AD=E7=9A=84?= =?UTF-8?q?=E8=8A=82=E7=82=B9.md=20Scala=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...55\347\232\204\350\212\202\347\202\271.md" | 24 ++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git "a/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" "b/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" index ce75e0d79f..2289c22912 100644 --- "a/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" +++ "b/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" @@ -311,7 +311,29 @@ func swapPairs(_ head: ListNode?) -> ListNode? { return dummyHead.next } ``` - +Scala: +```scala +// 虚拟头节点 +object Solution { + def swapPairs(head: ListNode): ListNode = { + var dummy = new ListNode(0, head) // 虚拟头节点 + var pre = dummy + var cur = head + // 当pre的下一个和下下个都不为空,才进行两两转换 + while (pre.next != null && pre.next.next != null) { + var tmp: ListNode = cur.next.next // 缓存下一次要进行转换的第一个节点 + pre.next = cur.next // 步骤一 + cur.next.next = cur // 步骤二 + cur.next = tmp // 步骤三 + // 下面是准备下一轮的交换 + pre = cur + cur = tmp + } + // 最终返回dummy虚拟头节点的下一个,return可以省略 + dummy.next + } +} +``` -----------------------
From 5fd85215ea9c30c73e5ab84f41dbc9cf170e8617 Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Thu, 12 May 2022 10:53:20 +0800 Subject: [PATCH 0630/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=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.md=20Scala=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...4N\344\270\252\350\212\202\347\202\271.md" | 24 ++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git "a/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" "b/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" index 813e9b02fa..8df6562762 100644 --- "a/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" +++ "b/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" @@ -289,6 +289,28 @@ func removeNthFromEnd(_ head: ListNode?, _ n: Int) -> ListNode? { return dummyHead.next } ``` - +Scala: +```scala +object Solution { + def removeNthFromEnd(head: ListNode, n: Int): ListNode = { + val dummy = new ListNode(-1, head) // 定义虚拟头节点 + var fast = head // 快指针从头开始走 + var slow = dummy // 慢指针从虚拟头开始头 + // 因为参数 n 是不可变量,所以不能使用 while(n>0){n-=1}的方式 + for (i <- 0 until n) { + fast = fast.next + } + // 快指针和满指针一起走,直到fast走到null + while (fast != null) { + slow = slow.next + fast = fast.next + } + // 删除slow的下一个节点 + slow.next = slow.next.next + // 返回虚拟头节点的下一个 + dummy.next + } +} +``` -----------------------
From 6992735d8de6d1875d0565413faed410e81c822e Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Thu, 12 May 2022 12:46:47 +0800 Subject: [PATCH 0631/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20=E9=9D=A2?= =?UTF-8?q?=E8=AF=95=E9=A2=9802.07.=E9=93=BE=E8=A1=A8=E7=9B=B8=E4=BA=A4.md?= =?UTF-8?q?=20Scala=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...76\350\241\250\347\233\270\344\272\244.md" | 50 ++++++++++++++++++- 1 file changed, 49 insertions(+), 1 deletion(-) diff --git "a/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" "b/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" index 2e7226deeb..0a38cc3309 100644 --- "a/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" +++ "b/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" @@ -317,7 +317,55 @@ ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) { } ``` - +Scala: +```scala +object Solution { + def getIntersectionNode(headA: ListNode, headB: ListNode): ListNode = { + var lenA = 0 // headA链表的长度 + var lenB = 0 // headB链表的长度 + var tmp = headA // 临时变量 + // 统计headA的长度 + while (tmp != null) { + lenA += 1; + tmp = tmp.next + } + // 统计headB的长度 + tmp = headB // 临时变量赋值给headB + while (tmp != null) { + lenB += 1 + tmp = tmp.next + } + // 因为传递过来的参数是不可变量,所以需要重新定义 + var listA = headA + var listB = headB + // 两个链表的长度差 + // 如果gap>0,lenA>lenB,headA(listA)链表往前移动gap步 + // 如果gap<0,lenA 0) { + // 因为不可以i-=1,所以可以使用for + for (i <- 0 until gap) { + listA = listA.next // 链表headA(listA) 移动 + } + } else { + gap = math.abs(gap) // 此刻gap为负值,取绝对值 + for (i <- 0 until gap) { + listB = listB.next + } + } + // 现在两个链表同时往前走,如果相等则返回 + while (listA != null && listB != null) { + if (listA == listB) { + return listA + } + listA = listA.next + listB = listB.next + } + // 如果链表没有相交则返回null,return可以省略 + null + } +} +``` ----------------------- From 2ce58ac6756775f8ec5139b36a23e8f3de232d30 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Thu, 12 May 2022 12:55:14 +0800 Subject: [PATCH 0632/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880337.?= =?UTF-8?q?=E6=89=93=E5=AE=B6=E5=8A=AB=E8=88=8DIII.md=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...345\256\266\345\212\253\350\210\215III.md" | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git "a/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" "b/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" index a4d8f6b280..6f50723d8f 100644 --- "a/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" +++ "b/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" @@ -429,7 +429,50 @@ const rob = root => { }; ``` +### TypeScript + +> 记忆化后序遍历 + +```typescript +const memory: Map = new Map(); +function rob(root: TreeNode | null): number { + if (root === null) return 0; + if (memory.has(root)) return memory.get(root); + // 不取当前节点 + const res1: number = rob(root.left) + rob(root.right); + // 取当前节点 + let res2: number = root.val; + if (root.left !== null) res2 += rob(root.left.left) + rob(root.left.right); + if (root.right !== null) res2 += rob(root.right.left) + rob(root.right.right); + const res: number = Math.max(res1, res2); + memory.set(root, res); + return res; +}; +``` + +> 状态标记化后序遍历 + +```typescript +function rob(root: TreeNode | null): number { + return Math.max(...robNode(root)); +}; +// [0]-不偷当前节点能获得的最大金额; [1]-偷~~ +type MaxValueArr = [number, number]; +function robNode(node: TreeNode | null): MaxValueArr { + if (node === null) return [0, 0]; + const leftArr: MaxValueArr = robNode(node.left); + const rightArr: MaxValueArr = robNode(node.right); + // 不偷 + const val1: number = Math.max(leftArr[0], leftArr[1]) + + Math.max(rightArr[0], rightArr[1]); + // 偷 + const val2: number = leftArr[0] + rightArr[0] + node.val; + return [val1, val2]; +} +``` + ### Go + ```go // 打家劫舍Ⅲ 动态规划 // 时间复杂度O(n) 空间复杂度O(logn) From 5627d4ba8605f35b8d63cf4af363c64d721f69a3 Mon Sep 17 00:00:00 2001 From: Jamcy123 <1219502823@qq.com> Date: Thu, 12 May 2022 16:04:42 +0800 Subject: [PATCH 0633/3019] =?UTF-8?q?=E8=83=8C=E5=8C=85=E7=90=86=E8=AE=BA?= =?UTF-8?q?=E5=9F=BA=E7=A1=8001=E8=83=8C=E5=8C=85-1=20js=20=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...47\241\20001\350\203\214\345\214\205-1.md" | 49 +++++++------------ 1 file changed, 18 insertions(+), 31 deletions(-) diff --git "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" index fe940b4ca4..e833ea802b 100644 --- "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" +++ "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" @@ -380,44 +380,31 @@ func main() { ### javascript ```js -function testweightbagproblem (wight, value, size) { - const len = wight.length, - dp = array.from({length: len + 1}).map( - () => array(size + 1).fill(0) - ); - - for(let i = 1; i <= len; i++) { - for(let j = 0; j <= size; j++) { - if(wight[i - 1] <= j) { - dp[i][j] = math.max( - dp[i - 1][j], - value[i - 1] + dp[i - 1][j - wight[i - 1]] - ) - } else { - dp[i][j] = dp[i - 1][j]; - } +function testWeightBagProblem (weight, value, size) { + // 定义 dp 数组 + const len = weight.length, + dp = Array(len).fill().map(() => Array(size + 1).fill(0)); + + // 初始化 + for(let j = weight[0]; j <= size; j++) { + dp[0][j] = value[0]; } - } -// console.table(dp); + // weight 数组的长度len 就是物品个数 + for(let i = 1; i < len; i++) { // 遍历物品 + for(let j = 0; j <= size; j++) { // 遍历背包容量 + if(j < weight[i]) dp[i][j] = dp[i - 1][j]; + else dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]); + } + } - return dp[len][size]; -} + console.table(dp) -function testWeightBagProblem2 (wight, value, size) { - const len = wight.length, - dp = Array(size + 1).fill(0); - for(let i = 1; i <= len; i++) { - for(let j = size; j >= wight[i - 1]; j--) { - dp[j] = Math.max(dp[j], value[i - 1] + dp[j - wight[i - 1]]); - } - } - return dp[size]; + return dp[len - 1][size]; } - function test () { - console.log(testWeightBagProblem([1, 3, 4, 5], [15, 20, 30, 55], 6)); + console.log(testWeightBagProblem([1, 3, 4, 5], [15, 20, 30, 55], 6)); } test(); From 40457f0f44d3981dc071fd56871f66d7e5946af1 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Thu, 12 May 2022 16:16:48 +0800 Subject: [PATCH 0634/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880121.?= =?UTF-8?q?=E4=B9=B0=E5=8D=96=E8=82=A1=E7=A5=A8=E7=9A=84=E6=9C=80=E4=BD=B3?= =?UTF-8?q?=E6=97=B6=E6=9C=BA.md=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typesc?= =?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 --- ...00\344\275\263\346\227\266\346\234\272.md" | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git "a/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" "b/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" index f0bc3b9764..a2498bb6b6 100644 --- "a/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" +++ "b/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" @@ -426,6 +426,46 @@ var maxProfit = function(prices) { }; ``` +TypeScript: + +> 贪心法 + +```typescript +function maxProfit(prices: number[]): number { + if (prices.length === 0) return 0; + let buy: number = prices[0]; + let profitMax: number = 0; + for (let i = 1, length = prices.length; i < length; i++) { + profitMax = Math.max(profitMax, prices[i] - buy); + buy = Math.min(prices[i], buy); + } + return profitMax; +}; +``` + +> 动态规划 + +```typescript +function maxProfit(prices: number[]): number { + /** + dp[i][0]: 第i天持有股票的最大现金 + dp[i][1]: 第i天不持有股票的最大现金 + */ + const length = prices.length; + if (length === 0) return 0; + const dp: number[][] = []; + dp[0] = [-prices[0], 0]; + for (let i = 1; i < length; i++) { + dp[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]; +}; +``` + + + -----------------------
From 8ba775d04acd100e6cdac8ebd913aaead67fae15 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Thu, 12 May 2022 16:40:54 +0800 Subject: [PATCH 0635/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880122.?= =?UTF-8?q?=E4=B9=B0=E5=8D=96=E8=82=A1=E7=A5=A8=E7=9A=84=E6=9C=80=E4=BD=B3?= =?UTF-8?q?=E6=97=B6=E6=9C=BAII=E5=8A=A8=E6=80=81=E8=A7=84=E5=88=92.md?= =?UTF-8?q?=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...01\350\247\204\345\210\222\357\274\211.md" | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" index 5a165a1438..12b21fde30 100644 --- "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" +++ "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" @@ -295,6 +295,42 @@ const maxProfit = (prices) => { } ``` +TypeScript: + +> 动态规划 + +```typescript +function maxProfit(prices: number[]): number { + /** + dp[i][0]: 第i天持有股票 + dp[i][1]: 第i天不持有股票 + */ + const length: number = prices.length; + if (length === 0) return 0; + const dp: number[][] = new Array(length).fill(0).map(_ => []); + dp[0] = [-prices[0], 0]; + for (let i = 1; i < length; i++) { + dp[i][0] = Math.max(dp[i - 1][0], dp[i - 1][1] - prices[i]); + dp[i][1] = Math.max(dp[i - 1][1], dp[i - 1][0] + prices[i]); + } + return dp[length - 1][1]; +}; +``` + +> 贪心法 + +```typescript +function maxProfit(prices: number[]): number { + let resProfit: number = 0; + for (let i = 1, length = prices.length; i < length; i++) { + if (prices[i] > prices[i - 1]) { + resProfit += prices[i] - prices[i - 1]; + } + } + return resProfit; +}; +``` + ----------------------- From 0a58ef986de4c20c5d69a4b490b478f44b7f3f5c Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Thu, 12 May 2022 17:35:30 +0800 Subject: [PATCH 0636/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200142.=E7=8E=AF?= =?UTF-8?q?=E5=BD=A2=E9=93=BE=E8=A1=A8II.md=20Scala=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\345\275\242\351\223\276\350\241\250II.md" | 26 ++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git "a/problems/0142.\347\216\257\345\275\242\351\223\276\350\241\250II.md" "b/problems/0142.\347\216\257\345\275\242\351\223\276\350\241\250II.md" index e8ca950dbb..f8e62d4572 100644 --- "a/problems/0142.\347\216\257\345\275\242\351\223\276\350\241\250II.md" +++ "b/problems/0142.\347\216\257\345\275\242\351\223\276\350\241\250II.md" @@ -370,7 +370,31 @@ ListNode *detectCycle(ListNode *head) { } ``` - +Scala: +```scala +object Solution { + def detectCycle(head: ListNode): ListNode = { + var fast = head // 快指针 + var slow = head // 慢指针 + while (fast != null && fast.next != null) { + fast = fast.next.next // 快指针一次走两步 + slow = slow.next // 慢指针一次走一步 + // 如果相遇,fast快指针回到头 + if (fast == slow) { + fast = head + // 两个指针一步一步的走,第一次相遇的节点必是入环节点 + while (fast != slow) { + fast = fast.next + slow = slow.next + } + return fast + } + } + // 如果fast指向空值,必然无环返回null + null + } +} +``` -----------------------
From a25409d7ec351aaf2e6e513e3e091fc97cd17d60 Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Thu, 12 May 2022 19:16:20 +0800 Subject: [PATCH 0637/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200242.=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?.md=20Scala=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...15\345\274\202\344\275\215\350\257\215.md" | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git "a/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" "b/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" index 080166fd34..4f0d143ed2 100644 --- "a/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" +++ "b/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" @@ -307,6 +307,31 @@ impl Solution { } } ``` + +Scala: +```scala +object Solution { + def isAnagram(s: String, t: String): Boolean = { + // 如果两个字符串的长度不等,直接返回false + if (s.length != t.length) return false + val record = new Array[Int](26) // 记录每个单词出现了多少次 + // 遍历字符串,对于s字符串单词对应的记录+=1,t字符串对应的记录-=1 + for (i <- 0 until s.length) { + record(s(i) - 97) += 1 + record(t(i) - 97) -= 1 + } + // 如果不等于则直接返回false + for (i <- 0 until 26) { + if (record(i) != 0) { + return false + } + } + // 如果前面不返回false,说明匹配成功,返回true,return可以省略 + true + } +} +``` + ## 相关题目 * 383.赎金信 From 74b76bfd120446653495d96135e697b5797bae35 Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Thu, 12 May 2022 22:21:29 +0800 Subject: [PATCH 0638/3019] =?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=20Scala?= =?UTF-8?q?=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...70\347\224\250\345\255\227\347\254\246.md" | 34 ++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git "a/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md" "b/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md" index 36937b0b91..075b5ef1a6 100644 --- "a/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md" +++ "b/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md" @@ -418,6 +418,38 @@ char ** commonChars(char ** words, int wordsSize, int* returnSize){ return ret; } ``` - +Scala: +```scala +object Solution { + def commonChars(words: Array[String]): List[String] = { + // 声明返回结果的不可变List集合,因为res要重新赋值,所以声明为var + var res = List[String]() + var hash = new Array[Int](26) // 统计字符出现的最小频率 + // 统计第一个字符串中字符出现的次数 + for (i <- 0 until words(0).length) { + hash(words(0)(i) - 'a') += 1 + } + // 统计其他字符串出现的频率 + for (i <- 1 until words.length) { + // 统计其他字符出现的频率 + var hashOtherStr = new Array[Int](26) + for (j <- 0 until words(i).length) { + hashOtherStr(words(i)(j) - 'a') += 1 + } + // 更新hash,取26个字母最小出现的频率 + for (k <- 0 until 26) { + hash(k) = math.min(hash(k), hashOtherStr(k)) + } + } + // 根据hash的结果转换输出的形式 + for (i <- 0 until 26) { + for (j <- 0 until hash(i)) { + res = res :+ (i + 'a').toChar.toString + } + } + res + } +} +``` -----------------------
From a71f7d2127bae83cc42dffd20b4c460865006d15 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Thu, 12 May 2022 23:23:59 +0800 Subject: [PATCH 0639/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880123.?= =?UTF-8?q?=E4=B9=B0=E5=8D=96=E8=82=A1=E7=A5=A8=E7=9A=84=E6=9C=80=E4=BD=B3?= =?UTF-8?q?=E6=97=B6=E6=9C=BAIII.md=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typ?= =?UTF-8?q?escript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...344\275\263\346\227\266\346\234\272III.md" | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git "a/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" "b/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" index 56ade34338..67c9949719 100644 --- "a/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" +++ "b/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" @@ -352,6 +352,36 @@ const maxProfit = prices => { }; ``` +TypeScript: + +> 版本一 + +```typescript +function maxProfit(prices: number[]): number { + /** + dp[i][0]: 无操作; + dp[i][1]: 第一次买入; + dp[i][2]: 第一次卖出; + dp[i][3]: 第二次买入; + dp[i][4]: 第二次卖出; + */ + const length: number = prices.length; + if (length === 0) return 0; + const dp: number[][] = new Array(length).fill(0) + .map(_ => new Array(5).fill(0)); + dp[0][1] = -prices[0]; + dp[0][3] = -prices[0]; + for (let i = 1; i < length; i++) { + dp[i][0] = dp[i - 1][0]; + dp[i][1] = Math.max(dp[i - 1][1], -prices[i]); + dp[i][2] = Math.max(dp[i - 1][2], dp[i - 1][1] + prices[i]); + dp[i][3] = Math.max(dp[i - 1][3], dp[i - 1][2] - prices[i]); + dp[i][4] = Math.max(dp[i - 1][4], dp[i - 1][3] + prices[i]); + } + return Math.max(dp[length - 1][2], dp[length - 1][4]); +}; +``` + Go: > 版本一: From 78c6602ff20c309132007795956f332d66ff7130 Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Fri, 13 May 2022 10:05:27 +0800 Subject: [PATCH 0640/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200349.=E4=B8=A4?= =?UTF-8?q?=E4=B8=AA=E6=95=B0=E7=BB=84=E7=9A=84=E4=BA=A4=E9=9B=86.md=20Sca?= =?UTF-8?q?la=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...04\347\232\204\344\272\244\351\233\206.md" | 44 ++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-) diff --git "a/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" "b/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" index 45f19b6ef2..49cf4112cc 100644 --- "a/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" +++ "b/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" @@ -312,7 +312,49 @@ int* intersection1(int* nums1, int nums1Size, int* nums2, int nums2Size, int* re return result; } ``` - +Scala: + +正常解法: +```scala +object Solution { + def intersection(nums1: Array[Int], nums2: Array[Int]): Array[Int] = { + // 导入mutable + import scala.collection.mutable + // 临时Set,用于记录数组1出现的每个元素 + val tmpSet: mutable.HashSet[Int] = new mutable.HashSet[Int]() + // 结果Set,存储最终结果 + val resSet: mutable.HashSet[Int] = new mutable.HashSet[Int]() + // 遍历nums1,把每个元素添加到tmpSet + nums1.foreach(tmpSet.add(_)) + // 遍历nums2,如果在tmpSet存在就添加到resSet + nums2.foreach(elem => { + if (tmpSet.contains(elem)) { + resSet.add(elem) + } + }) + // 将结果转换为Array返回,return可以省略 + resSet.toArray + } +} +``` +骚操作1: +```scala +object Solution { + def intersection(nums1: Array[Int], nums2: Array[Int]): Array[Int] = { + // 先转为Set,然后取交集,最后转换为Array + (nums1.toSet).intersect(nums2.toSet).toArray + } +} +``` +骚操作2: +```scala +object Solution { + def intersection(nums1: Array[Int], nums2: Array[Int]): Array[Int] = { + // distinct去重,然后取交集 + (nums1.distinct).intersect(nums2.distinct) + } +} +``` ## 相关题目 * 350.两个数组的交集 II From 9f720470e8e2360047052897885261545d0e1ac7 Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Fri, 13 May 2022 10:29:17 +0800 Subject: [PATCH 0641/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200202.=E5=BF=AB?= =?UTF-8?q?=E4=B9=90=E6=95=B0.md=20Scala=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...2.\345\277\253\344\271\220\346\225\260.md" | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git "a/problems/0202.\345\277\253\344\271\220\346\225\260.md" "b/problems/0202.\345\277\253\344\271\220\346\225\260.md" index 741a735a5d..2d0f7d274e 100644 --- "a/problems/0202.\345\277\253\344\271\220\346\225\260.md" +++ "b/problems/0202.\345\277\253\344\271\220\346\225\260.md" @@ -385,5 +385,38 @@ bool isHappy(int n){ return bHappy; } ``` +Scala: +```scala +object Solution { + // 引入mutable + import scala.collection.mutable + def isHappy(n: Int): Boolean = { + // 存放每次计算后的结果 + val set: mutable.HashSet[Int] = new mutable.HashSet[Int]() + var tmp = n // 因为形参是不可变量,所以需要找到一个临时变量 + // 开始进入循环 + while (true) { + val sum = getSum(tmp) // 获取这个数每个值的平方和 + if (sum == 1) return true // 如果最终等于 1,则返回true + // 如果set里面已经有这个值了,说明进入无限循环,可以返回false,否则添加这个值到set + if (set.contains(sum)) return false + else set.add(sum) + tmp = sum + } + // 最终需要返回值,直接返回个false + false + } + + def getSum(n: Int): Int = { + var sum = 0 + var tmp = n + while (tmp != 0) { + sum += (tmp % 10) * (tmp % 10) + tmp = tmp / 10 + } + sum + } +} +``` -----------------------
From be5cc136c56cb194af8ce1d794871ca7af4b1e1d Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Fri, 13 May 2022 11:00:11 +0800 Subject: [PATCH 0642/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200035.=E6=90=9C?= =?UTF-8?q?=E7=B4=A2=E6=8F=92=E5=85=A5=E4=BD=8D=E7=BD=AE.md=20Scala?= =?UTF-8?q?=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...22\345\205\245\344\275\215\347\275\256.md" | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git "a/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" "b/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" index 9a770703e3..3e8cf5c877 100644 --- "a/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" +++ "b/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" @@ -316,7 +316,26 @@ func searchInsert(_ nums: [Int], _ target: Int) -> Int { return right + 1 } ``` - +### Scala +```scala +object Solution { + def searchInsert(nums: Array[Int], target: Int): Int = { + var left = 0 + var right = nums.length - 1 + while (left <= right) { + var mid = left + (right - left) / 2 + if (target == nums(mid)) { + return mid + } else if (target > nums(mid)) { + left = mid + 1 + } else { + right = mid - 1 + } + } + right + 1 + } +} +``` From 95593634b341a951850fae3b5aa739ba7c5d3864 Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Fri, 13 May 2022 11:01:04 +0800 Subject: [PATCH 0643/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200704.=E4=BA=8C?= =?UTF-8?q?=E5=88=86=E6=9F=A5=E6=89=BE.md=20Scala=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...14\345\210\206\346\237\245\346\211\276.md" | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git "a/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" "b/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" index 5562513089..1e474f9a96 100644 --- "a/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" +++ "b/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" @@ -610,7 +610,48 @@ public class Solution{ } } ``` +**Scala:** +(版本一)左闭右闭区间 +```scala +object Solution { + def search(nums: Array[Int], target: Int): Int = { + var left = 0 + var right = nums.length - 1 + while (left <= right) { + var mid = left + ((right - left) / 2) + if (target == nums(mid)) { + return mid + } else if (target < nums(mid)) { + right = mid - 1 + } else { + left = mid + 1 + } + } + -1 + } +} +``` +(版本二)左闭右开区间 +```scala +object Solution { + def search(nums: Array[Int], target: Int): Int = { + var left = 0 + var right = nums.length + while (left < right) { + val mid = left + (right - left) / 2 + if (target == nums(mid)) { + return mid + } else if (target < nums(mid)) { + right = mid + } else { + left = mid + 1 + } + } + -1 + } +} +``` -----------------------
From 9fc232aba413b43fd479ad5b4fd1a186ff90a359 Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Fri, 13 May 2022 11:01:45 +0800 Subject: [PATCH 0644/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200034.=E5=9C=A8?= =?UTF-8?q?=E6=8E=92=E5=BA=8F=E6=95=B0=E7=BB=84=E4=B8=AD=E6=9F=A5=E6=89=BE?= =?UTF-8?q?=E5=85=83=E7=B4=A0=E7=9A=84=E7=AC=AC=E4=B8=80=E4=B8=AA=E5=92=8C?= =?UTF-8?q?=E6=9C=80=E5=90=8E=E4=B8=80=E4=B8=AA=E4=BD=8D=E7=BD=AE.md=20Sca?= =?UTF-8?q?la=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...00\344\270\252\344\275\215\347\275\256.md" | 47 ++++++++++++++++++- 1 file changed, 46 insertions(+), 1 deletion(-) diff --git "a/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" "b/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" index dfd90b8280..260462c23b 100644 --- "a/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" +++ "b/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" @@ -480,7 +480,52 @@ var searchRange = function(nums, target) { return [-1, -1]; }; ``` - +### Scala +```scala +object Solution { + def searchRange(nums: Array[Int], target: Int): Array[Int] = { + var left = getLeftBorder(nums, target) + var right = getRightBorder(nums, target) + if (left == -2 || right == -2) return Array(-1, -1) + if (right - left > 1) return Array(left + 1, right - 1) + Array(-1, -1) + } + + // 寻找左边界 + def getLeftBorder(nums: Array[Int], target: Int): Int = { + var leftBorder = -2 + var left = 0 + var right = nums.length - 1 + while (left <= right) { + var mid = left + (right - left) / 2 + if (nums(mid) >= target) { + right = mid - 1 + leftBorder = right + } else { + left = mid + 1 + } + } + leftBorder + } + + // 寻找右边界 + def getRightBorder(nums: Array[Int], target: Int): Int = { + var rightBorder = -2 + var left = 0 + var right = nums.length - 1 + while (left <= right) { + var mid = left + (right - left) / 2 + if (nums(mid) <= target) { + left = mid + 1 + rightBorder = left + } else { + right = mid - 1 + } + } + rightBorder + } +} +``` -----------------------
From f131f27744693b91f40df4ea0fb7c1578bd6647b Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Fri, 13 May 2022 11:02:19 +0800 Subject: [PATCH 0645/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200027.=E7=A7=BB?= =?UTF-8?q?=E9=99=A4=E5=85=83=E7=B4=A0.md=20Scala=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...7\273\351\231\244\345\205\203\347\264\240.md" | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git "a/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" "b/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" index 590cf0b924..5ff327fb75 100644 --- "a/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" +++ "b/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" @@ -328,6 +328,20 @@ int removeElement(int* nums, int numsSize, int val){ return slow; } ``` - +Scala: +```scala +object Solution { + def removeElement(nums: Array[Int], `val`: Int): Int = { + var slow = 0 + for (fast <- 0 until nums.length) { + if (`val` != nums(fast)) { + nums(slow) = nums(fast) + slow += 1 + } + } + slow + } +} +``` -----------------------
From 495998e509527b53a8b84cc0527dfcff4fc1e1af Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Fri, 13 May 2022 12:07:52 +0800 Subject: [PATCH 0646/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880188.?= =?UTF-8?q?=E4=B9=B0=E5=8D=96=E8=82=A1=E7=A5=A8=E7=9A=84=E6=9C=80=E4=BD=B3?= =?UTF-8?q?=E6=97=B6=E6=9C=BAIV.md=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0type?= =?UTF-8?q?script=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\344\275\263\346\227\266\346\234\272IV.md" | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git "a/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" "b/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" index 61c558a1a1..27eb38c365 100644 --- "a/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" +++ "b/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" @@ -409,5 +409,27 @@ var maxProfit = function(k, prices) { }; ``` +TypeScript: + +```typescript +function maxProfit(k: number, prices: number[]): number { + const length: number = prices.length; + if (length === 0) return 0; + const dp: number[][] = new Array(length).fill(0) + .map(_ => new Array(k * 2 + 1).fill(0)); + for (let i = 1; i <= k; i++) { + dp[0][i * 2 - 1] = -prices[0]; + } + for (let i = 1; i < length; i++) { + for (let j = 1; j < 2 * k + 1; j++) { + dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - 1] + Math.pow(-1, j) * prices[i]); + } + } + return dp[length - 1][2 * k]; +}; +``` + + + -----------------------
From 127986e03a0b4acdedf80a6b38d3ded7d61514f3 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Fri, 13 May 2022 16:19:59 +0800 Subject: [PATCH 0647/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880309.?= =?UTF-8?q?=E6=9C=80=E4=BD=B3=E4=B9=B0=E5=8D=96=E8=82=A1=E7=A5=A8=E6=97=B6?= =?UTF-8?q?=E6=9C=BA=E5=90=AB=E5=86=B7=E5=86=BB=E6=9C=9F.md=EF=BC=89?= =?UTF-8?q?=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...53\345\206\267\345\206\273\346\234\237.md" | 60 +++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git "a/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" "b/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" index f3e7541bef..f037fe8558 100644 --- "a/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" +++ "b/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" @@ -325,6 +325,66 @@ const maxProfit = (prices) => { }; ``` +TypeScript: + +> 版本一,与本文思路一致 + +```typescript +function maxProfit(prices: number[]): number { + /** + dp[i][0]: 持股状态; + dp[i][1]: 无股状态,当天为非冷冻期; + dp[i][2]: 无股状态,当天卖出; + dp[i][3]: 无股状态,当天为冷冻期; + */ + const length: number = prices.length; + const dp: number[][] = new Array(length).fill(0).map(_ => []); + dp[0][0] = -prices[0]; + dp[0][1] = dp[0][2] = dp[0][3] = 0; + for (let i = 1; i < length; i++) { + dp[i][0] = Math.max( + dp[i - 1][0], + Math.max(dp[i - 1][1], dp[i - 1][3]) - prices[i] + ); + dp[i][1] = Math.max(dp[i - 1][1], dp[i - 1][3]); + dp[i][2] = dp[i - 1][0] + prices[i]; + dp[i][3] = dp[i - 1][2]; + } + const lastEl: number[] = dp[length - 1]; + return Math.max(lastEl[1], lastEl[2], lastEl[3]); +}; +``` + +> 版本二,状态定义略有不同,可以帮助理解 + +```typescript +function maxProfit(prices: number[]): number { + /** + dp[i][0]: 持股状态,当天买入; + dp[i][1]: 持股状态,当天未买入; + dp[i][2]: 无股状态,当天卖出; + dp[i][3]: 无股状态,当天未卖出; + + 买入有冷冻期限制,其实就是状态[0]只能由前一天的状态[3]得到; + 如果卖出有冷冻期限制,其实就是[2]由[1]得到。 + */ + const length: number = prices.length; + const dp: number[][] = new Array(length).fill(0).map(_ => []); + dp[0][0] = -prices[0]; + dp[0][1] = -Infinity; + dp[0][2] = dp[0][3] = 0; + for (let i = 1; i < length; i++) { + dp[i][0] = dp[i - 1][3] - prices[i]; + dp[i][1] = Math.max(dp[i - 1][1], dp[i - 1][0]); + dp[i][2] = Math.max(dp[i - 1][0], dp[i - 1][1]) + prices[i]; + dp[i][3] = Math.max(dp[i - 1][3], dp[i - 1][2]); + } + return Math.max(dp[length - 1][2], dp[length - 1][3]); +}; +``` + + + -----------------------
From abe00238f44718c49b9442c26e7f7b01f84be3e4 Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Fri, 13 May 2022 16:37:39 +0800 Subject: [PATCH 0648/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200001.=E4=B8=A4?= =?UTF-8?q?=E6=95=B0=E4=B9=8B=E5=92=8C.md=20Scala=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...44\346\225\260\344\271\213\345\222\214.md" | 23 ++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git "a/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" "b/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" index 9571a7737b..141e66f34e 100644 --- "a/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" @@ -274,6 +274,27 @@ class Solution { } } ``` - +Scala: +```scala +object Solution { + // 导入包 + import scala.collection.mutable + def twoSum(nums: Array[Int], target: Int): Array[Int] = { + // key存储值,value存储下标 + val map = new mutable.HashMap[Int, Int]() + for (i <- nums.indices) { + val tmp = target - nums(i) // 计算差值 + // 如果这个差值存在于map,则说明找到了结果 + if (map.contains(tmp)) { + return Array(map.get(tmp).get, i) + } + // 如果不包含把当前值与其下标放到map + map.put(nums(i), i) + } + // 如果没有找到直接返回一个空的数组,return关键字可以省略 + new Array[Int](2) + } +} +``` -----------------------
From 53379c023fe935398801f41aad3dd0399b2d7d73 Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Fri, 13 May 2022 17:28:14 +0800 Subject: [PATCH 0649/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200454.=E5=9B=9B?= =?UTF-8?q?=E6=95=B0=E7=9B=B8=E5=8A=A0II.md=20Scala=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\346\225\260\347\233\270\345\212\240II.md" | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git "a/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" "b/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" index a6cd413b19..d4aba8fa46 100644 --- "a/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" +++ "b/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" @@ -318,5 +318,41 @@ impl Solution { } ``` +Scala: +```scala +object Solution { + // 导包 + import scala.collection.mutable + def fourSumCount(nums1: Array[Int], nums2: Array[Int], nums3: Array[Int], nums4: Array[Int]): Int = { + // 定义一个HashMap,key存储值,value存储该值出现的次数 + val map = new mutable.HashMap[Int, Int]() + // 遍历前两个数组,把他们所有可能的情况都记录到map + for (i <- nums1.indices) { + for (j <- nums2.indices) { + val tmp = nums1(i) + nums2(j) + // 如果包含该值,则对他的key加1,不包含则添加进去 + if (map.contains(tmp)) { + map.put(tmp, map.get(tmp).get + 1) + } else { + map.put(tmp, 1) + } + } + } + var res = 0 // 结果变量 + // 遍历后两个数组 + for (i <- nums3.indices) { + for (j <- nums4.indices) { + val tmp = -(nums3(i) + nums4(j)) + // 如果map中存在该值,结果就+=value + if (map.contains(tmp)) { + res += map.get(tmp).get + } + } + } + // 返回最终结果,可以省略关键字return + res + } +} +``` -----------------------
From 6c0d4365c6ed1e9a47c5f31e14d59912648f4afa Mon Sep 17 00:00:00 2001 From: lizhendong128 Date: Fri, 13 May 2022 17:26:03 +0800 Subject: [PATCH 0650/3019] =?UTF-8?q?=E4=BF=AE=E6=94=B90059=E8=9E=BA?= =?UTF-8?q?=E6=97=8B=E7=9F=A9=E9=98=B5II=20Java=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 精简Java代码中不必要的变量,调整结构,减少代码量,使代码更加易读 --- ...\346\227\213\347\237\251\351\230\265II.md" | 44 +++++-------------- 1 file changed, 12 insertions(+), 32 deletions(-) diff --git "a/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" "b/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" index 9373589515..7afc15755b 100644 --- "a/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" +++ "b/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" @@ -130,57 +130,37 @@ Java: ```Java class Solution { public int[][] generateMatrix(int n) { + int loop = 0; // 控制循环次数 int[][] res = new int[n][n]; + int start = 0; // 每次循环的开始点(start, start) + int count = 1; // 定义填充数字 + int i, j; - // 循环次数 - int loop = n / 2; - - // 定义每次循环起始位置 - int startX = 0; - int startY = 0; - - // 定义偏移量 - int offset = 1; - - // 定义填充数字 - int count = 1; - - // 定义中间位置 - int mid = n / 2; - while (loop > 0) { - int i = startX; - int j = startY; - + while (loop++ < n / 2) { // 判断边界后,loop从1开始 // 模拟上侧从左到右 - for (; j startY; j--) { + for (; j >= loop; j--) { res[i][j] = count++; } // 模拟左侧从下到上 - for (; i > startX; i--) { + for (; i >= loop; i--) { res[i][j] = count++; } - - loop--; - - startX += 1; - startY += 1; - - offset += 2; + start++; } if (n % 2 == 1) { - res[mid][mid] = count; + res[start][start] = count; } return res; From 16c6abff54ec4b85d0891ed12914f538da7b8332 Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Fri, 13 May 2022 21:02:07 +0800 Subject: [PATCH 0651/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200383.=E8=B5=8E?= =?UTF-8?q?=E9=87=91=E4=BF=A1.md=20Scala=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...3.\350\265\216\351\207\221\344\277\241.md" | 64 ++++++++++++++++++- 1 file changed, 63 insertions(+), 1 deletion(-) diff --git "a/problems/0383.\350\265\216\351\207\221\344\277\241.md" "b/problems/0383.\350\265\216\351\207\221\344\277\241.md" index 5d9e8295c6..8e4cbbf870 100644 --- "a/problems/0383.\350\265\216\351\207\221\344\277\241.md" +++ "b/problems/0383.\350\265\216\351\207\221\344\277\241.md" @@ -360,6 +360,68 @@ impl Solution { } } ``` - +Scala: + +版本一: 使用数组作为哈希表 +```scala +object Solution { + def canConstruct(ransomNote: String, magazine: String): Boolean = { + // 如果magazine的长度小于ransomNote的长度,必然是false + if (magazine.length < ransomNote.length) { + return false + } + // 定义一个数组,存储magazine字符出现的次数 + val map: Array[Int] = new Array[Int](26) + // 遍历magazine字符串,对应的字符+=1 + for (i <- magazine.indices) { + map(magazine(i) - 'a') += 1 + } + // 遍历ransomNote + for (i <- ransomNote.indices) { + if (map(ransomNote(i) - 'a') > 0) + map(ransomNote(i) - 'a') -= 1 + else return false + } + // 如果上面没有返回false,直接返回true,关键字return可以省略 + true + } +} +``` +版本二: 使用HashMap +```scala +object Solution { + import scala.collection.mutable + def canConstruct(ransomNote: String, magazine: String): Boolean = { + // 如果magazine的长度小于ransomNote的长度,必然是false + if (magazine.length < ransomNote.length) { + return false + } + // 定义map,key是字符,value是字符出现的次数 + val map = new mutable.HashMap[Char, Int]() + // 遍历magazine,把所有的字符都记录到map里面 + for (i <- magazine.indices) { + val tmpChar = magazine(i) + // 如果map包含该字符,那么对应的value++,否则添加该字符 + if (map.contains(tmpChar)) { + map.put(tmpChar, map.get(tmpChar).get + 1) + } else { + map.put(tmpChar, 1) + } + } + // 遍历ransomNote + for (i <- ransomNote.indices) { + val tmpChar = ransomNote(i) + // 如果map包含并且该字符的value大于0,则匹配成功,map对应的--,否则直接返回false + if (map.contains(tmpChar) && map.get(tmpChar).get > 0) { + map.put(tmpChar, map.get(tmpChar).get - 1) + } else { + return false + } + } + // 如果上面没有返回false,直接返回true,关键字return可以省略 + true + } +} +``` -----------------------
From ca2711164dfd39b51f1e6d96207673ffba29d3f1 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Fri, 13 May 2022 21:11:48 +0800 Subject: [PATCH 0652/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880714.?= =?UTF-8?q?=E4=B9=B0=E5=8D=96=E8=82=A1=E7=A5=A8=E7=9A=84=E6=9C=80=E4=BD=B3?= =?UTF-8?q?=E6=97=B6=E6=9C=BA=E5=90=AB=E6=89=8B=E7=BB=AD=E8=B4=B9=E5=8A=A8?= =?UTF-8?q?=E6=80=81=E8=A7=84=E5=88=92.md=EF=BC=89=EF=BC=9A=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...01\350\247\204\345\210\222\357\274\211.md" | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git "a/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" "b/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" index 4ab63e7925..5625604b9d 100644 --- "a/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" +++ "b/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" @@ -200,6 +200,29 @@ const maxProfit = (prices,fee) => { } ``` +TypeScript: + +```typescript +function maxProfit(prices: number[], fee: number): number { + /** + dp[i][0]:持有股票 + dp[i][1]: 不持有 + */ + const length: number = prices.length; + if (length === 0) return 0; + const dp: number[][] = new Array(length).fill(0).map(_ => []); + dp[0][0] = -prices[0]; + dp[0][1] = 0; + for (let i = 1; i < length; i++) { + dp[i][0] = Math.max(dp[i - 1][0], dp[i - 1][1] - prices[i]); + dp[i][1] = Math.max(dp[i - 1][1], dp[i - 1][0] + prices[i] - fee); + } + return dp[length - 1][1]; +}; +``` + + + -----------------------
From a53da7b4e205468bb7f870b5b46093c42923d429 Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Sat, 14 May 2022 14:41:14 +0800 Subject: [PATCH 0653/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200015.=E4=B8=89?= =?UTF-8?q?=E6=95=B0=E4=B9=8B=E5=92=8C.md=20Scala=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...11\346\225\260\344\271\213\345\222\214.md" | 45 ++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git "a/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" "b/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" index cc184c879e..1764d244b6 100644 --- "a/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" @@ -616,6 +616,49 @@ public class Solution } } ``` - +Scala: +```scala +object Solution { + // 导包 + import scala.collection.mutable.ListBuffer + import scala.util.control.Breaks.{break, breakable} + + def threeSum(nums: Array[Int]): List[List[Int]] = { + // 定义结果集,最后需要转换为List + val res = ListBuffer[List[Int]]() + val nums_tmp = nums.sorted // 对nums进行排序 + for (i <- nums_tmp.indices) { + // 如果要排的第一个数字大于0,直接返回结果 + if (nums_tmp(i) > 0) { + return res.toList + } + // 如果i大于0并且和前一个数字重复,则跳过本次循环,相当于continue + breakable { + if (i > 0 && nums_tmp(i) == nums_tmp(i - 1)) { + break + } else { + var left = i + 1 + var right = nums_tmp.length - 1 + while (left < right) { + var sum = nums_tmp(i) + nums_tmp(left) + nums_tmp(right) // 求三数之和 + if (sum < 0) left += 1 + else if (sum > 0) right -= 1 + else { + res += List(nums_tmp(i), nums_tmp(left), nums_tmp(right)) // 如果等于0 添加进结果集 + // 为了避免重复,对left和right进行移动 + while (left < right && nums_tmp(left) == nums_tmp(left + 1)) left += 1 + while (left < right && nums_tmp(right) == nums_tmp(right - 1)) right -= 1 + left += 1 + right -= 1 + } + } + } + } + } + // 最终返回需要转换为List,return关键字可以省略 + res.toList + } +} +``` -----------------------
From 68eed4af5b1f43e7ac65093dd00c7497f88885cc Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Sat, 14 May 2022 15:26:29 +0800 Subject: [PATCH 0654/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200018.=E5=9B=9B?= =?UTF-8?q?=E6=95=B0=E4=B9=8B=E5=92=8C.md=20Scala=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...33\346\225\260\344\271\213\345\222\214.md" | 45 ++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git "a/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" "b/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" index ee70cb6909..6cbd40c288 100644 --- "a/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" @@ -522,6 +522,49 @@ public class Solution } } ``` - +Scala: +```scala +object Solution { + // 导包 + import scala.collection.mutable.ListBuffer + import scala.util.control.Breaks.{break, breakable} + def fourSum(nums: Array[Int], target: Int): List[List[Int]] = { + val res = ListBuffer[List[Int]]() + val nums_tmp = nums.sorted // 先排序 + for (i <- nums_tmp.indices) { + breakable { + if (i > 0 && nums_tmp(i) == nums_tmp(i - 1)) { + break // 如果该值和上次的值相同,跳过本次循环,相当于continue + } else { + for (j <- i + 1 until nums_tmp.length) { + breakable { + if (j > i + 1 && nums_tmp(j) == nums_tmp(j - 1)) { + break // 同上 + } else { + // 双指针 + var (left, right) = (j + 1, nums_tmp.length - 1) + while (left < right) { + var sum = nums_tmp(i) + nums_tmp(j) + nums_tmp(left) + nums_tmp(right) + if (sum == target) { + // 满足要求,直接加入到集合里面去 + res += List(nums_tmp(i), nums_tmp(j), nums_tmp(left), nums_tmp(right)) + while (left < right && nums_tmp(left) == nums_tmp(left + 1)) left += 1 + while (left < right && nums_tmp(right) == nums_tmp(right - 1)) right -= 1 + left += 1 + right -= 1 + } else if (sum < target) left += 1 + else right -= 1 + } + } + } + } + } + } + } + // 最终返回的res要转换为List,return关键字可以省略 + res.toList + } +} +``` -----------------------
From e4da60add91e39177250f6808c3846c9b563612a Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Sat, 14 May 2022 15:44:42 +0800 Subject: [PATCH 0655/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200344.=E5=8F=8D?= =?UTF-8?q?=E8=BD=AC=E5=AD=97=E7=AC=A6=E4=B8=B2.md=20Scala=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...5\254\345\255\227\347\254\246\344\270\262.md" | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git "a/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" "b/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" index 58bada05b9..e1f27bd7c5 100644 --- "a/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" @@ -266,6 +266,20 @@ public class Solution } } ``` - +Scala: +```scala +object Solution { + def reverseString(s: Array[Char]): Unit = { + var (left, right) = (0, s.length - 1) + while (left < right) { + var tmp = s(left) + s(left) = s(right) + s(right) = tmp + left += 1 + right -= 1 + } + } +} +``` -----------------------
From f2dcdbe94757d3ef88278e4f8c80281ce7baf5c9 Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Sat, 14 May 2022 16:32:23 +0800 Subject: [PATCH 0656/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200541.=E5=8F=8D?= =?UTF-8?q?=E8=BD=AC=E5=AD=97=E7=AC=A6=E4=B8=B2II.md=20Scala=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\345\255\227\347\254\246\344\270\262II.md" | 43 ++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git "a/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" "b/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" index 8c13a39021..99d6ebe04e 100644 --- "a/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" +++ "b/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" @@ -347,6 +347,47 @@ public class Solution } } ``` - +Scala: + +版本一: (正常解法) +```scala +object Solution { + def reverseStr(s: String, k: Int): String = { + val res = s.toCharArray // 转换为Array好处理 + for (i <- s.indices by 2 * k) { + // 如果i+k大于了res的长度,则需要全部翻转 + if (i + k > res.length) { + reverse(res, i, s.length - 1) + } else { + reverse(res, i, i + k - 1) + } + } + new String(res) + } + // 翻转字符串,从start到end + def reverse(s: Array[Char], start: Int, end: Int): Unit = { + var (left, right) = (start, end) + while (left < right) { + var tmp = s(left) + s(left) = s(right) + s(right) = tmp + left += 1 + right -= 1 + } + } +} +``` +版本二: 首先利用sliding每隔k个进行分割,随后转换为数组,再使用zipWithIndex添加每个数组的索引,紧接着利用map做变换,如果索引%2==0则说明需要翻转,否则原封不动,最后再转换为String +```scala +object Solution { + def reverseStr(s: String, k: Int): String = { + s.sliding(k, k) + .toArray + .zipWithIndex + .map(v => if (v._2 % 2 == 0) v._1.reverse else v._1) + .mkString + } +} +``` -----------------------
From 037bebbe90eb7bd607314d5d3d5d63e506f5aeeb Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Sat, 14 May 2022 17:04:40 +0800 Subject: [PATCH 0657/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20=E5=89=91?= =?UTF-8?q?=E6=8C=87Offer05.=E6=9B=BF=E6=8D=A2=E7=A9=BA=E6=A0=BC.md=20Scal?= =?UTF-8?q?a=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...77\346\215\242\347\251\272\346\240\274.md" | 56 ++++++++++++++++++- 1 file changed, 55 insertions(+), 1 deletion(-) diff --git "a/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" "b/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" index 037bd42773..eecd7f0c56 100644 --- "a/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" +++ "b/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" @@ -413,8 +413,62 @@ func replaceSpace(_ s: String) -> String { } ``` +Scala: - +方式一: 双指针 +```scala +object Solution { + def replaceSpace(s: String): String = { + var count = 0 + s.foreach(c => if (c == ' ') count += 1) // 统计空格的数量 + val sOldSize = s.length // 旧数组字符串长度 + val sNewSize = s.length + count * 2 // 新数组字符串长度 + val res = new Array[Char](sNewSize) // 新数组 + var index = sNewSize - 1 // 新数组索引 + // 逆序遍历 + for (i <- (0 until sOldSize).reverse) { + if (s(i) == ' ') { + res(index) = '0' + index -= 1 + res(index) = '2' + index -= 1 + res(index) = '%' + } else { + res(index) = s(i) + } + index -= 1 + } + res.mkString + } +} +``` +方式二: 使用一个集合,遇到空格就添加%20 +```scala +object Solution { + import scala.collection.mutable.ListBuffer + def replaceSpace(s: String): String = { + val res: ListBuffer[Char] = ListBuffer[Char]() + for (i <- s.indices) { + if (s(i) == ' ') { + res += '%' + res += '2' + res += '0' + }else{ + res += s(i) + } + } + res.mkString + } +} +``` +方式三: 使用map +```scala +object Solution { + def replaceSpace(s: String): String = { + s.map(c => if(c == ' ') "%20" else c).mkString + } +} +``` ----------------------- From 1c369bb83631f4449af7e646bc26bc86aacc5442 Mon Sep 17 00:00:00 2001 From: 3Xpl0it3r Date: Sat, 14 May 2022 23:24:57 +0800 Subject: [PATCH 0658/3019] 102 in rust --- ...02\345\272\217\351\201\215\345\216\206.md" | 59 +++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" index ab8f2e572e..1326781959 100644 --- "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" +++ "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" @@ -299,6 +299,36 @@ func levelOrder(_ root: TreeNode?) -> [[Int]] { } ``` +Rust: + +```rust +pub fn level_order(root: Option>>) -> Vec> { + let mut ans = Vec::new(); + let mut stack = Vec::new(); + if root.is_none(){ + return ans; + } + stack.push(root.unwrap()); + while stack.is_empty()!= true{ + let num = stack.len(); + let mut level = Vec::new(); + for _i in 0..num{ + let tmp = stack.remove(0); + level.push(tmp.borrow_mut().val); + if tmp.borrow_mut().left.is_some(){ + stack.push(tmp.borrow_mut().left.take().unwrap()); + } + if tmp.borrow_mut().right.is_some(){ + stack.push(tmp.borrow_mut().right.take().unwrap()); + } + } + ans.push(level); + } + ans +} +``` + + **此时我们就掌握了二叉树的层序遍历了,那么如下九道力扣上的题目,只需要修改模板的两三行代码(不能再多了),便可打倒!** @@ -528,6 +558,35 @@ func levelOrderBottom(_ root: TreeNode?) -> [[Int]] { } ``` +Rust: + +```rust +pub fn level_order(root: Option>>) -> Vec> { + let mut ans = Vec::new(); + let mut stack = Vec::new(); + if root.is_none(){ + return ans; + } + stack.push(root.unwrap()); + while stack.is_empty()!= true{ + let num = stack.len(); + let mut level = Vec::new(); + for _i in 0..num{ + let tmp = stack.remove(0); + level.push(tmp.borrow_mut().val); + if tmp.borrow_mut().left.is_some(){ + stack.push(tmp.borrow_mut().left.take().unwrap()); + } + if tmp.borrow_mut().right.is_some(){ + stack.push(tmp.borrow_mut().right.take().unwrap()); + } + } + ans.push(level); + } + ans +} +``` + # 199.二叉树的右视图 [力扣题目链接](https://leetcode-cn.com/problems/binary-tree-right-side-view/) From 5da6c06ef9fd308e9ab77b8393e81377eec75821 Mon Sep 17 00:00:00 2001 From: unknown Date: Sat, 14 May 2022 16:27:47 +0100 Subject: [PATCH 0659/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20=E8=83=8C?= =?UTF-8?q?=E5=8C=85=E7=90=86=E8=AE=BA=E8=82=8C=E9=86=8701=E8=83=8C?= =?UTF-8?q?=E5=8C=85=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 --- ...47\241\20001\350\203\214\345\214\205-1.md" | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" index fe940b4ca4..43ad26be33 100644 --- "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" +++ "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" @@ -423,5 +423,51 @@ function test () { test(); ``` +### C +```c +#include +#include +#include + +#define MAX(a, b) (((a) > (b)) ? (a) : (b)) +#define ARR_SIZE(a) (sizeof((a)) / sizeof((a)[0])) +#define BAG_WEIGHT 4 + +void backPack(int* weights, int weightSize, int* costs, int costSize, int bagWeight) { + // 开辟dp数组 + int dp[weightSize][bagWeight + 1]; + memset(dp, 0, sizeof(int) * weightSize * (bagWeight + 1)); + + int i, j; + // 当背包容量大于物品0的重量时,将物品0放入到背包中 + for(j = weights[0]; j <= bagWeight; ++j) { + dp[0][j] = costs[0]; + } + + // 先遍历物品,再遍历重量 + for(j = 1; j <= bagWeight; ++j) { + for(i = 1; i < weightSize; ++i) { + // 如果当前背包容量小于物品重量 + if(j < weights[i]) + // 背包物品的价值等于背包不放置当前物品时的价值 + dp[i][j] = dp[i-1][j]; + // 若背包当前重量可以放置物品 + else + // 背包的价值等于放置该物品或不放置该物品的最大值 + dp[i][j] = MAX(dp[i - 1][j], dp[i - 1][j - weights[i]] + costs[i]); + } + } + + printf("%d\n", dp[weightSize - 1][bagWeight]); +} + +int main(int argc, char* argv[]) { + int weights[] = {1, 3, 4}; + int costs[] = {15, 20, 30}; + backPack(weights, ARR_SIZE(weights), costs, ARR_SIZE(costs), BAG_WEIGHT); + return 0; +} +``` + -----------------------
From ab4d42cf0c41ce9089838dee087e961aac1b6357 Mon Sep 17 00:00:00 2001 From: n4feng Date: Sat, 14 May 2022 12:52:11 -0400 Subject: [PATCH 0660/3019] =?UTF-8?q?Update=200739.=E6=AF=8F=E6=97=A5?= =?UTF-8?q?=E6=B8=A9=E5=BA=A6.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 少了一个关键词“高” --- .../0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" "b/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" index 5f53e4127d..367e521a6c 100644 --- "a/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" +++ "b/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" @@ -34,7 +34,7 @@ 那么单调栈的原理是什么呢?为什么时间复杂度是O(n)就可以找到每一个元素的右边第一个比它大的元素位置呢? -单调栈的本质是空间换时间,因为在遍历的过程中需要用一个栈来记录右边第一个比当前元素的元素,优点是只需要遍历一次。 +单调栈的本质是空间换时间,因为在遍历的过程中需要用一个栈来记录右边第一个比当前元素高的元素,优点是只需要遍历一次。 在使用单调栈的时候首先要明确如下几点: From 78b367e5c5ee493a96cfe4ebcb440059909db285 Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Sun, 15 May 2022 12:57:39 +0800 Subject: [PATCH 0661/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200151.=E7=BF=BB?= =?UTF-8?q?=E8=BD=AC=E5=AD=97=E7=AC=A6=E4=B8=B2=E9=87=8C=E7=9A=84=E5=8D=95?= =?UTF-8?q?=E8=AF=8D.md=20Scala=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...14\347\232\204\345\215\225\350\257\215.md" | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git "a/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" "b/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" index d03de42146..0e25fc4d8c 100644 --- "a/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" +++ "b/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" @@ -758,7 +758,63 @@ func reverseWord(_ s: inout [Character]) { } ``` +Scala: + +```scala +object Solution { + def reverseWords(s: String): String = { + var sb = removeSpace(s) // 移除多余的空格 + reverseString(sb, 0, sb.length - 1) // 翻转字符串 + reverseEachWord(sb) + sb.mkString + } + + // 移除多余的空格 + def removeSpace(s: String): Array[Char] = { + var start = 0 + var end = s.length - 1 + // 移除字符串前面的空格 + while (start < s.length && s(start) == ' ') start += 1 + // 移除字符串后面的空格 + while (end >= 0 && s(end) == ' ') end -= 1 + var sb = "" // String + // 当start小于等于end的时候,执行添加操作 + while (start <= end) { + var c = s(start) + // 当前字符不等于空,sb的最后一个字符不等于空的时候添加到sb + if (c != ' ' || sb(sb.length - 1) != ' ') { + sb ++= c.toString + } + start += 1 // 指针向右移动 + } + sb.toArray + } + + // 翻转字符串 + def reverseString(s: Array[Char], start: Int, end: Int): Unit = { + var (left, right) = (start, end) + while (left < right) { + var tmp = s(left) + s(left) = s(right) + s(right) = tmp + left += 1 + right -= 1 + } + } + // 翻转每个单词 + def reverseEachWord(s: Array[Char]): Unit = { + var i = 0 + while (i < s.length) { + var j = i + 1 + // 向后迭代寻找每个单词的坐标 + while (j < s.length && s(j) != ' ') j += 1 + reverseString(s, i, j - 1) // 翻转每个单词 + i = j + 1 // i往后更新 + } + } +} +``` From c7d356f8559fd2c46eb4e9e2889fdbe0bdaafed1 Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Sun, 15 May 2022 12:59:38 +0800 Subject: [PATCH 0662/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20=E5=89=91?= =?UTF-8?q?=E6=8C=87Offer58-II.=E5=B7=A6=E6=97=8B=E8=BD=AC=E5=AD=97?= =?UTF-8?q?=E7=AC=A6=E4=B8=B2.md=20Scala=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...54\345\255\227\347\254\246\344\270\262.md" | 29 ++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git "a/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" "b/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" index fec83e1d5a..581ac1c7cc 100644 --- "a/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" @@ -290,7 +290,34 @@ func reverseString(_ s: inout [Character], startIndex: Int, endIndex: Int) { } ``` - +Scala: + +```scala +object Solution { + def reverseLeftWords(s: String, n: Int): String = { + var str = s.toCharArray // 转换为Array + // abcdefg => ba cdefg + reverseString(str, 0, n - 1) + // ba cdefg => ba gfedc + reverseString(str, n, str.length - 1) + // ba gfedc => cdefgab + reverseString(str, 0, str.length - 1) + // 最终返回,return关键字可以省略 + new String(str) + } + // 翻转字符串 + def reverseString(s: Array[Char], start: Int, end: Int): Unit = { + var (left, right) = (start, end) + while (left < right) { + var tmp = s(left) + s(left) = s(right) + s(right) = tmp + left += 1 + right -= 1 + } + } +} +``` From a5db99363b1bca72345036228776a0320242c8c4 Mon Sep 17 00:00:00 2001 From: SevenMonths Date: Sun, 15 May 2022 15:35:08 +0800 Subject: [PATCH 0663/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880035.?= =?UTF-8?q?=E6=90=9C=E7=B4=A2=E6=8F=92=E5=85=A5=E4=BD=8D=E7=BD=AE.md?= =?UTF-8?q?=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0PHP=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...22\345\205\245\344\275\215\347\275\256.md" | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git "a/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" "b/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" index 9a770703e3..8a8f970614 100644 --- "a/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" +++ "b/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" @@ -318,6 +318,31 @@ func searchInsert(_ nums: [Int], _ target: Int) -> Int { ``` +### PHP + +```php +// 二分法(1):[左闭右闭] +function searchInsert($nums, $target) +{ + $n = count($nums); + $l = 0; + $r = $n - 1; + while ($l <= $r) { + $mid = floor(($l + $r) / 2); + if ($nums[$mid] > $target) { + // 下次搜索在左区间:[$l,$mid-1] + $r = $mid - 1; + } else if ($nums[$mid] < $target) { + // 下次搜索在右区间:[$mid+1,$r] + $l = $mid + 1; + } else { + // 命中返回 + return $mid; + } + } + return $r + 1; +} +``` ----------------------- From f1061d0f8962fe8e4a4c0691d8401ee5fe505f99 Mon Sep 17 00:00:00 2001 From: GitHubQAQ <31883473+GitHubQAQ@users.noreply.github.com> Date: Sun, 15 May 2022 19:12:13 +0800 Subject: [PATCH 0664/3019] =?UTF-8?q?Update=200056.=E5=90=88=E5=B9=B6?= =?UTF-8?q?=E5=8C=BA=E9=97=B4.md=20=20-=20-=E8=A7=84=E8=8C=83C++=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E4=B8=AD=E7=9A=84lambda=E8=A1=A8=E8=BF=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" "b/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" index b44d602c5c..52a98d707a 100644 --- "a/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" +++ "b/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" @@ -96,7 +96,7 @@ public: vector> merge(vector>& intervals) { vector> result; if (intervals.size() == 0) return result; - // 排序的参数使用了lamda表达式 + // 排序的参数使用了lambda表达式 sort(intervals.begin(), intervals.end(), [](const vector& a, const vector& b){return a[0] < b[0];}); result.push_back(intervals[0]); From 224b3d293b6b2c9465e00b2127cf1d75f44775df Mon Sep 17 00:00:00 2001 From: wangning Date: Sun, 15 May 2022 20:15:11 +0800 Subject: [PATCH 0665/3019] =?UTF-8?q?=E4=BF=AE=E6=94=B9=EF=BC=9A0404?= =?UTF-8?q?=E5=B7=A6=E5=8F=B6=E5=AD=90=E4=B9=8B=E5=92=8Cjavascript?= =?UTF-8?q?=E7=89=88=E6=9C=AC=E8=B0=83=E7=94=A8=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...67\246\345\217\266\345\255\220\344\271\213\345\222\214.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" "b/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" index d7fd629e68..4ef68d3b4e 100644 --- "a/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" +++ "b/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" @@ -336,8 +336,8 @@ var sumOfLeftLeaves = function(root) { if(node===null){ return 0; } - let leftValue = sumOfLeftLeaves(node.left); - let rightValue = sumOfLeftLeaves(node.right); + let leftValue = nodesSum(node.left); + let rightValue = nodesSum(node.right); // 3. 单层递归逻辑 let midValue = 0; if(node.left&&node.left.left===null&&node.left.right===null){ From aa22b802a5986f06a123c59f395bf49aba779d1a Mon Sep 17 00:00:00 2001 From: unknown Date: Sun, 15 May 2022 14:39:41 +0100 Subject: [PATCH 0666/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20=E8=83=8C?= =?UTF-8?q?=E5=8C=85=E7=90=86=E8=AE=BA=E5=9F=BA=E7=A1=8001-2.mc=20C?= =?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 --- ...47\241\20001\350\203\214\345\214\205-2.md" | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" index dabdfb2d09..a99a872b14 100644 --- "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" +++ "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" @@ -315,6 +315,39 @@ function test () { test(); ``` +### C +```c +#include +#include + +#define MAX(a, b) (((a) > (b)) ? (a) : (b)) +#define ARR_SIZE(arr) ((sizeof((arr))) / sizeof((arr)[0])) +#define BAG_WEIGHT 4 + +void test_back_pack(int* weights, int weightSize, int* values, int valueSize, int bagWeight) { + int dp[bagWeight + 1]; + memset(dp, 0, sizeof(int) * (bagWeight + 1)); + + int i, j; + // 先遍历物品 + for(i = 0; i < weightSize; ++i) { + // 后遍历重量。从后向前遍历 + for(j = bagWeight; j >= weights[i]; --j) { + dp[j] = MAX(dp[j], dp[j - weights[i]] + values[i]); + } + } + + // 打印最优结果 + printf("%d\n", dp[bagWeight]); +} + +int main(int argc, char** argv) { + int weights[] = {1, 3, 4}; + int values[] = {15, 20, 30}; + test_back_pack(weights, ARR_SIZE(weights), values, ARR_SIZE(values), BAG_WEIGHT); + return 0; +} +``` ----------------------- From 19abe18019814af74ee51ba56e4e8ee6106b1253 Mon Sep 17 00:00:00 2001 From: unknown Date: Sun, 15 May 2022 15:26:23 +0100 Subject: [PATCH 0667/3019] =?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.md=20C=E8=AF=AD?= =?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 --- ...11\345\222\214\345\255\220\351\233\206.md" | 100 ++++++++++++++++++ 1 file changed, 100 insertions(+) diff --git "a/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" "b/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" index 6e93ae8e80..76cfd87f99 100644 --- "a/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" +++ "b/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" @@ -416,6 +416,106 @@ var canPartition = function(nums) { }; ``` +C: +二维dp: +```c +/** +1. dp数组含义:dp[i][j]为背包重量为j时,从[0-i]元素和最大值 +2. 递推公式:dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - nums[i]] + nums[i]) +3. 初始化:dp[i][0]初始化为0。因为背包重量为0时,不可能放入元素。dp[0][j] = nums[0],当j >= nums[0] && j < target时 +4. 遍历顺序:先遍历物品,再遍历背包 +*/ +#define MAX(a, b) (((a) > (b)) ? (a) : (b)) + +int getSum(int* nums, int numsSize) { + int sum = 0; + + int i; + for(i = 0; i < numsSize; ++i) { + sum += nums[i]; + } + return sum; +} + +bool canPartition(int* nums, int numsSize){ + // 求出元素总和 + int sum = getSum(nums, numsSize); + // 若元素总和为奇数,则不可能得到两个和相等的子数组 + if(sum % 2) + return false; + + // 若子数组的和等于target,则nums可以被分割 + int target = sum / 2; + // 初始化dp数组 + int dp[numsSize][target + 1]; + // dp[j][0]都应被设置为0。因为当背包重量为0时,不可放入元素 + memset(dp, 0, sizeof(int) * numsSize * (target + 1)); + + int i, j; + // 当背包重量j大于nums[0]时,可以在dp[0][j]中放入元素nums[0] + for(j = nums[0]; j <= target; ++j) { + dp[0][j] = nums[0]; + } + + for(i = 1; i < numsSize; ++i) { + for(j = 1; j <= target; ++j) { + // 若当前背包重量j小于nums[i],则其值等于只考虑0到i-1物品时的值 + if(j < nums[i]) + dp[i][j] = dp[i - 1][j]; + // 否则,背包重量等于在背包中放入num[i]/不放入nums[i]的较大值 + else + dp[i][j] = MAX(dp[i - 1][j], dp[i - 1][j - nums[i]] + nums[i]); + } + } + // 判断背包重量为target,且考虑到所有物品时,放入的元素和是否等于target + return dp[numsSize - 1][target] == target; +} +``` +滚动数组: +```c +/** +1. dp数组含义:dp[j]为背包重量为j时,其中可放入元素的最大值 +2. 递推公式:dp[j] = max(dp[j], dp[j - nums[i]] + nums[i]) +3. 初始化:均初始化为0即可 +4. 遍历顺序:先遍历物品,再后序遍历背包 +*/ +#define MAX(a, b) (((a) > (b)) ? (a) : (b)) + +int getSum(int* nums, int numsSize) { + int sum = 0; + + int i; + for(i = 0; i < numsSize; ++i) { + sum += nums[i]; + } + return sum; +} + +bool canPartition(int* nums, int numsSize){ + // 求出元素总和 + int sum = getSum(nums, numsSize); + // 若元素总和为奇数,则不可能得到两个和相等的子数组 + if(sum % 2) + return false; + // 背包容量 + int target = sum / 2; + + // 初始化dp数组,元素均为0 + int dp[target + 1]; + memset(dp, 0, sizeof(int) * (target + 1)); + + int i, j; + // 先遍历物品,后遍历背包 + for(i = 0; i < numsSize; ++i) { + for(j = target; j >= nums[i]; --j) { + dp[j] = MAX(dp[j], dp[j - nums[i]] + nums[i]); + } + } + + // 查看背包容量为target时,元素总和是否等于target + return dp[target] == target; +} +``` From 14afd23b9ea5e491a60d91f07c0b8211f4f9ae00 Mon Sep 17 00:00:00 2001 From: HanMengnan <1448189829@qq.com> Date: Mon, 16 May 2022 10:46:43 +0800 Subject: [PATCH 0668/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B00516.=E6=9C=80?= =?UTF-8?q?=E9=95=BF=E5=9B=9E=E6=96=87=E5=AD=90=E5=BA=8F=E5=88=97=E7=9A=84?= =?UTF-8?q?Go=E5=AE=9E=E7=8E=B0=E6=8F=90=E4=BE=9B=E4=BA=86=E4=B8=80?= =?UTF-8?q?=E7=A7=8D=E6=9B=B4=E4=BC=98=E7=9A=84=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...07\345\255\220\345\272\217\345\210\227.md" | 35 +++++++++---------- 1 file changed, 17 insertions(+), 18 deletions(-) diff --git "a/problems/0516.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\345\272\217\345\210\227.md" "b/problems/0516.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\345\272\217\345\210\227.md" index 69536cef56..63120b141b 100644 --- "a/problems/0516.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0516.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\345\272\217\345\210\227.md" @@ -186,29 +186,28 @@ class Solution: Go: ```Go func longestPalindromeSubseq(s string) int { - lenth:=len(s) - dp:=make([][]int,lenth) - for i:=0;i b { + return a } + return b } - for i:=lenth-1;i>=0;i--{ - for j:=i+1;j= 0; i-- { + for j := i + 1; j < size; j++ { + if s[i] == s[j] { + dp[i][j] = dp[i+1][j-1] + 2 + } else { + dp[i][j] = max(dp[i][j-1], dp[i+1][j]) } } } - - return dp[0][lenth-1] + return dp[0][size-1] } ``` From 9ac50a9a9183a3f81fd0f026950bf6fbda21f55e Mon Sep 17 00:00:00 2001 From: h4 <20080114+tan-i-ham@users.noreply.github.com> Date: Mon, 16 May 2022 14:51:05 +0900 Subject: [PATCH 0669/3019] chore: Add new solution to LeetCode 203 Without using pre Node --- ...76\350\241\250\345\205\203\347\264\240.md" | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git "a/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" "b/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" index c34831b768..9cedfe93a9 100644 --- "a/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" +++ "b/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" @@ -234,6 +234,27 @@ public ListNode removeElements(ListNode head, int val) { } return head; } +/** + * 不添加虚拟节点and pre Node方式 + * 时间复杂度 O(n) + * 空间复杂度 O(1) + * @param head + * @param val + * @return + */ +public ListNode removeElements(ListNode head, int val) { + while(head!=null && head.val==val){ + head = head.next; + } + ListNode curr = head; + while(curr!=null){ + while(curr.next!=null && curr.next.val == val){ + curr.next = curr.next.next; + } + curr = curr.next; + } + return head; +} ``` Python: From 08147d132c4611e190d03a47bc870294d3cc1292 Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Mon, 16 May 2022 14:28:02 +0800 Subject: [PATCH 0670/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200232.=E7=94=A8?= =?UTF-8?q?=E6=A0=88=E5=AE=9E=E7=8E=B0=E9=98=9F=E5=88=97.md=20Scala?= =?UTF-8?q?=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...36\347\216\260\351\230\237\345\210\227.md" | 41 ++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git "a/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" "b/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" index 1a56d9f386..d9ba8e2632 100644 --- "a/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" +++ "b/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" @@ -495,6 +495,45 @@ void myQueueFree(MyQueue* obj) { obj->stackOutTop = 0; } ``` - +Scala: +```scala +class MyQueue() { + import scala.collection.mutable + val stackIn = mutable.Stack[Int]() // 负责出栈 + val stackOut = mutable.Stack[Int]() // 负责入栈 + + // 添加元素 + def push(x: Int) { + stackIn.push(x) + } + + // 复用代码,如果stackOut为空就把stackIn的所有元素都压入StackOut + def dumpStackIn(): Unit = { + if (!stackOut.isEmpty) return + while (!stackIn.isEmpty) { + stackOut.push(stackIn.pop()) + } + } + + // 弹出元素 + def pop(): Int = { + dumpStackIn() + stackOut.pop() + } + + // 获取队头 + def peek(): Int = { + dumpStackIn() + val res: Int = stackOut.pop() + stackOut.push(res) + res + } + + // 判断是否为空 + def empty(): Boolean = { + stackIn.isEmpty && stackOut.isEmpty + } +} +``` -----------------------
From f4d98a744ee9c14ed88d07be559aa310508d89f9 Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Mon, 16 May 2022 14:56:10 +0800 Subject: [PATCH 0671/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200225.=E7=94=A8?= =?UTF-8?q?=E9=98=9F=E5=88=97=E5=AE=9E=E7=8E=B0=E6=A0=88.md=20Scala?= =?UTF-8?q?=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...27\345\256\236\347\216\260\346\240\210.md" | 83 +++++++++++++++++++ 1 file changed, 83 insertions(+) diff --git "a/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" "b/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" index 3457c4b368..3c134870ae 100644 --- "a/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" +++ "b/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" @@ -815,6 +815,89 @@ class MyStack { } } ``` +Scala: +使用两个队列模拟栈: +```scala +import scala.collection.mutable + +class MyStack() { + + val queue1 = new mutable.Queue[Int]() + val queue2 = new mutable.Queue[Int]() + + def push(x: Int) { + queue1.enqueue(x) + } + + def pop(): Int = { + var size = queue1.size + // 将queue1中的每个元素都移动到queue2 + for (i <- 0 until size - 1) { + queue2.enqueue(queue1.dequeue()) + } + var res = queue1.dequeue() + // 再将queue2中的每个元素都移动到queue1 + while (!queue2.isEmpty) { + queue1.enqueue(queue2.dequeue()) + } + res + } + + def top(): Int = { + var size = queue1.size + for (i <- 0 until size - 1) { + queue2.enqueue(queue1.dequeue()) + } + var res = queue1.dequeue() + while (!queue2.isEmpty) { + queue1.enqueue(queue2.dequeue()) + } + // 最终还需要把res送进queue1 + queue1.enqueue(res) + res + } + + def empty(): Boolean = { + queue1.isEmpty + } +} +``` +使用一个队列模拟: +```scala +import scala.collection.mutable + +class MyStack() { + + val queue = new mutable.Queue[Int]() + + def push(x: Int) { + queue.enqueue(x) + } + + def pop(): Int = { + var size = queue.size + for (i <- 0 until size - 1) { + queue.enqueue(queue.head) // 把头添到队列最后 + queue.dequeue() // 再出队 + } + queue.dequeue() + } + + def top(): Int = { + var size = queue.size + var res = 0 + for (i <- 0 until size) { + queue.enqueue(queue.head) // 把头添到队列最后 + res = queue.dequeue() // 再出队 + } + res + } + + def empty(): Boolean = { + queue.isEmpty + } +} +``` -----------------------
From 8df1b4b237552c189fa1a5788442c422c9296d07 Mon Sep 17 00:00:00 2001 From: madeai Date: Mon, 16 May 2022 16:38:53 +0800 Subject: [PATCH 0672/3019] =?UTF-8?q?Update=200739.=E6=AF=8F=E6=97=A5?= =?UTF-8?q?=E6=B8=A9=E5=BA=A6.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" "b/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" index 5f53e4127d..2305d13579 100644 --- "a/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" +++ "b/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" @@ -192,7 +192,7 @@ class Solution { 否则的话,可以直接入栈。 注意,单调栈里 加入的元素是 下标。 */ - Stackstack=new Stack<>(); + Deque stack=new LinkedList<>(); stack.push(0); for(int i=1;istack=new Stack<>(); + Deque stack=new LinkedList<>(); for(int i=0;itemperatures[stack.peek()]){ From 61f5d920d05ea01858272bc04f8bcea0a89d6991 Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Mon, 16 May 2022 17:07:23 +0800 Subject: [PATCH 0673/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200020.=E6=9C=89?= =?UTF-8?q?=E6=95=88=E7=9A=84=E6=8B=AC=E5=8F=B7.md=20Scala=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...10\347\232\204\346\213\254\345\217\267.md" | 23 ++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git "a/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" "b/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" index 7bb7f7463a..a0df0d07fc 100644 --- "a/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" +++ "b/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" @@ -400,6 +400,27 @@ bool isValid(char * s){ return !stackTop; } ``` - +Scala: +```scala +object Solution { + import scala.collection.mutable + def isValid(s: String): Boolean = { + if(s.length % 2 != 0) return false // 如果字符串长度是奇数直接返回false + val stack = mutable.Stack[Char]() + // 循环遍历字符串 + for (i <- s.indices) { + val c = s(i) + if (c == '(' || c == '[' || c == '{') stack.push(c) + else if(stack.isEmpty) return false // 如果没有(、[、{则直接返回false + // 以下三种情况,不满足则直接返回false + else if(c==')' && stack.pop() != '(') return false + else if(c==']' && stack.pop() != '[') return false + else if(c=='}' && stack.pop() != '{') return false + } + // 如果为空则正确匹配,否则还有余孽就不匹配 + stack.isEmpty + } +} +``` -----------------------
From 98bdccbe16bbb6c8c66e027d901f4fbd3baafffe Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Mon, 16 May 2022 17:24:47 +0800 Subject: [PATCH 0674/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=201047.=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E5=AD=97=E7=AC=A6=E4=B8=B2=E4=B8=AD=E7=9A=84=E6=89=80?= =?UTF-8?q?=E6=9C=89=E7=9B=B8=E9=82=BB=E9=87=8D=E5=A4=8D=E9=A1=B9.md=20Sca?= =?UTF-8?q?la=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...73\351\207\215\345\244\215\351\241\271.md" | 23 ++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git "a/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" "b/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" index 638c8f4ed2..a92a3911e1 100644 --- "a/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" +++ "b/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" @@ -374,6 +374,27 @@ func removeDuplicates(_ s: String) -> String { return String(stack) } ``` - +Scala: +```scala +object Solution { + import scala.collection.mutable + def removeDuplicates(s: String): String = { + var stack = mutable.Stack[Int]() + var str = "" // 保存最终结果 + for (i <- s.indices) { + var tmp = s(i) + // 如果栈非空并且栈顶元素等于当前字符,那么删掉栈顶和字符串最后一个元素 + if (!stack.isEmpty && tmp == stack.head) { + str = str.take(str.length - 1) + stack.pop() + } else { + stack.push(tmp) + str += tmp + } + } + str + } +} +``` -----------------------
From 8c394c9f8588a1e94250dc93bede24b7380996f8 Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Tue, 17 May 2022 17:08:11 +0800 Subject: [PATCH 0675/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200150.=E9=80=86?= =?UTF-8?q?=E6=B3=A2=E5=85=B0=E8=A1=A8=E8=BE=BE=E5=BC=8F=E6=B1=82=E5=80=BC?= =?UTF-8?q?.md=20Scala=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...76\345\274\217\346\261\202\345\200\274.md" | 29 ++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git "a/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" "b/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" index fd3d69aa33..47da06f6df 100644 --- "a/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" +++ "b/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" @@ -325,6 +325,33 @@ func evalRPN(_ tokens: [String]) -> Int { return stack.last! } ``` - +Scala: +```scala +object Solution { + import scala.collection.mutable + def evalRPN(tokens: Array[String]): Int = { + val stack = mutable.Stack[Int]() // 定义栈 + // 抽取运算操作,需要传递x,y,和一个函数 + def operator(x: Int, y: Int, f: (Int, Int) => Int): Int = f(x, y) + for (token <- tokens) { + // 模式匹配,匹配不同的操作符做什么样的运算 + token match { + // 最后一个参数 _+_,代表x+y,遵循Scala的函数至简原则,以下运算同理 + case "+" => stack.push(operator(stack.pop(), stack.pop(), _ + _)) + case "-" => stack.push(operator(stack.pop(), stack.pop(), -_ + _)) + case "*" => stack.push(operator(stack.pop(), stack.pop(), _ * _)) + case "/" => { + var pop1 = stack.pop() + var pop2 = stack.pop() + stack.push(operator(pop2, pop1, _ / _)) + } + case _ => stack.push(token.toInt) // 不是运算符就入栈 + } + } + // 最后返回栈顶,不需要加return关键字 + stack.pop() + } +} +``` -----------------------
From 349383321ff1ed393effb9ebaad075a7736cf98e Mon Sep 17 00:00:00 2001 From: SevenMonths Date: Tue, 17 May 2022 17:45:40 +0800 Subject: [PATCH 0676/3019] =?UTF-8?q?=E5=A2=9E=E5=8A=A0KMP=20php=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0028.\345\256\236\347\216\260strStr.md" | 75 +++++++++++++++++++ 1 file changed, 75 insertions(+) diff --git "a/problems/0028.\345\256\236\347\216\260strStr.md" "b/problems/0028.\345\256\236\347\216\260strStr.md" index d67e5f70fc..1cdd5292a9 100644 --- "a/problems/0028.\345\256\236\347\216\260strStr.md" +++ "b/problems/0028.\345\256\236\347\216\260strStr.md" @@ -1166,5 +1166,80 @@ func strStr(_ haystack: String, _ needle: String) -> Int { ``` +PHP: + +> 前缀表统一减一 +```php +function strStr($haystack, $needle) { + if (strlen($needle) == 0) return 0; + $next= []; + $this->getNext($next,$needle); + + $j = -1; + for ($i = 0;$i < strlen($haystack); $i++) { // 注意i就从0开始 + while($j >= 0 && $haystack[$i] != $needle[$j + 1]) { + $j = $next[$j]; + } + if ($haystack[$i] == $needle[$j + 1]) { + $j++; + } + if ($j == (strlen($needle) - 1) ) { + return ($i - strlen($needle) + 1); + } + } + return -1; +} + +function getNext(&$next, $s){ + $j = -1; + $next[0] = $j; + for($i = 1; $i < strlen($s); $i++) { // 注意i从1开始 + while ($j >= 0 && $s[$i] != $s[$j + 1]) { + $j = $next[$j]; + } + if ($s[$i] == $s[$j + 1]) { + $j++; + } + $next[$i] = $j; + } +} +``` + +> 前缀表统一不减一 +```php +function strStr($haystack, $needle) { + if (strlen($needle) == 0) return 0; + $next= []; + $this->getNext($next,$needle); + + $j = 0; + for ($i = 0;$i < strlen($haystack); $i++) { // 注意i就从0开始 + while($j > 0 && $haystack[$i] != $needle[$j]) { + $j = $next[$j-1]; + } + if ($haystack[$i] == $needle[$j]) { + $j++; + } + if ($j == strlen($needle)) { + return ($i - strlen($needle) + 1); + } + } + return -1; +} + +function getNext(&$next, $s){ + $j = 0; + $next[0] = $j; + for($i = 1; $i < strlen($s); $i++) { // 注意i从1开始 + while ($j > 0 && $s[$i] != $s[$j]) { + $j = $next[$j-1]; + } + if ($s[$i] == $s[$j]) { + $j++; + } + $next[$i] = $j; + } +} +``` -----------------------
From 748a728420be62c835866e7027171462ef90f888 Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Tue, 17 May 2022 18:41:52 +0800 Subject: [PATCH 0677/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200239.=E6=BB=91?= =?UTF-8?q?=E5=8A=A8=E7=AA=97=E5=8F=A3=E6=9C=80=E5=A4=A7=E5=80=BC.md=20Sca?= =?UTF-8?q?la=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...43\346\234\200\345\244\247\345\200\274.md" | 47 +++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git "a/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" "b/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" index f269450f3b..eb32fdd279 100644 --- "a/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" +++ "b/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" @@ -630,6 +630,53 @@ func maxSlidingWindow(_ nums: [Int], _ k: Int) -> [Int] { return result } ``` +Scala: +```scala +import scala.collection.mutable.ArrayBuffer +object Solution { + def maxSlidingWindow(nums: Array[Int], k: Int): Array[Int] = { + var len = nums.length - k + 1 // 滑动窗口长度 + var res: Array[Int] = new Array[Int](len) // 声明存储结果的数组 + var index = 0 // 结果数组指针 + val queue: MyQueue = new MyQueue // 自定义队列 + // 将前k个添加到queue + for (i <- 0 until k) { + queue.add(nums(i)) + } + res(index) = queue.peek // 第一个滑动窗口的最大值 + index += 1 + for (i <- k until nums.length) { + queue.poll(nums(i - k)) // 首先移除第i-k个元素 + queue.add(nums(i)) // 添加当前数字到队列 + res(index) = queue.peek() // 赋值 + index+=1 + } + // 最终返回res,return关键字可以省略 + res + } +} + +class MyQueue { + var queue = ArrayBuffer[Int]() + + // 移除元素,如果传递进来的跟队头相等,那么移除 + def poll(value: Int): Unit = { + if (!queue.isEmpty && queue.head == value) { + queue.remove(0) + } + } + + // 添加元素,当队尾大于当前元素就删除 + def add(value: Int): Unit = { + while (!queue.isEmpty && value > queue.last) { + queue.remove(queue.length - 1) + } + queue.append(value) + } + + def peek(): Int = queue.head +} +``` -----------------------
From 47c4cc102123b1b43f09b7b766fdd2f1e1b979a9 Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Tue, 17 May 2022 19:52:32 +0800 Subject: [PATCH 0678/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200347.=E5=89=8DK?= =?UTF-8?q?=E4=B8=AA=E9=AB=98=E9=A2=91=E5=85=83=E7=B4=A0.md=20Scala?= =?UTF-8?q?=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...30\351\242\221\345\205\203\347\264\240.md" | 44 ++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-) diff --git "a/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" "b/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" index 1d6a358bfc..20932b2814 100644 --- "a/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" +++ "b/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" @@ -374,7 +374,49 @@ function topKFrequent(nums: number[], k: number): number[] { }; ``` - +Scala: + +解法一: 优先级队列 +```scala +object Solution { + import scala.collection.mutable + def topKFrequent(nums: Array[Int], k: Int): Array[Int] = { + val map = mutable.HashMap[Int, Int]() + // 将所有元素都放入Map + for (num <- nums) { + map.put(num, map.getOrElse(num, 0) + 1) + } + // 声明一个优先级队列,在函数柯里化那块需要指明排序方式 + var queue = mutable.PriorityQueue[(Int, Int)]()(Ordering.fromLessThan((x, y) => x._2 > y._2)) + // 将map里面的元素送入优先级队列 + for (elem <- map) { + queue.enqueue(elem) + if(queue.size > k){ + queue.dequeue // 如果队列元素大于k个,出队 + } + } + // 最终只需要key的Array形式就可以了,return关键字可以省略 + queue.map(_._1).toArray + } +} +``` +解法二: 相当于一个wordCount程序 +```scala +object Solution { + def topKFrequent(nums: Array[Int], k: Int): Array[Int] = { + // 首先将数据变为(x,1),然后按照x分组,再使用map进行转换(x,sum),变换为Array + // 再使用sort针对sum进行排序,最后take前k个,再把数据变为x,y,z这种格式 + nums.map((_, 1)).groupBy(_._1) + .map { + case (x, arr) => (x, arr.map(_._2).sum) + } + .toArray + .sortWith(_._2 > _._2) + .take(k) + .map(_._1) + } +} +``` -----------------------
From 6457d2d99775e9eddc1ab8386cdd5ca2d916b4b7 Mon Sep 17 00:00:00 2001 From: whusky <31883473+GitHubQAQ@users.noreply.github.com> Date: Tue, 17 May 2022 21:22:17 +0800 Subject: [PATCH 0679/3019] =?UTF-8?q?Update=200063.=E4=B8=8D=E5=90=8C?= =?UTF-8?q?=E8=B7=AF=E5=BE=84II.md=20=20=E6=B7=BB=E5=8A=A0=E9=A2=84?= =?UTF-8?q?=E5=88=A4=E6=96=AD=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 优化代码高亮格式 2. 对于C++的第一种解法添加预判断代码 --- ...3.\344\270\215\345\220\214\350\267\257\345\276\204II.md" | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git "a/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" "b/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" index a40ccedaa9..0e51e0fedb 100644 --- "a/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" +++ "b/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" @@ -66,7 +66,7 @@ dp[i][j] :表示从(0 ,0)出发,到(i, j) 有dp[i][j]条不同的路 所以代码为: -``` +```cpp if (obstacleGrid[i][j] == 0) { // 当(i, j)没有障碍的时候,再推导dp[i][j] dp[i][j] = dp[i - 1][j] + dp[i][j - 1]; } @@ -76,7 +76,7 @@ if (obstacleGrid[i][j] == 0) { // 当(i, j)没有障碍的时候,再推导dp[i 在[62.不同路径](https://programmercarl.com/0062.不同路径.html)不同路径中我们给出如下的初始化: -``` +```cpp vector> dp(m, vector(n, 0)); // 初始值为0 for (int i = 0; i < m; i++) dp[i][0] = 1; for (int j = 0; j < n; j++) dp[0][j] = 1; @@ -138,6 +138,8 @@ public: int uniquePathsWithObstacles(vector>& obstacleGrid) { int m = obstacleGrid.size(); int n = obstacleGrid[0].size(); + if (obstacleGrid[m - 1][n - 1] == 1 || obstacleGrid[0][0] == 1) //如果在起点或终点出现了障碍,直接返回0 + return 0; vector> dp(m, vector(n, 0)); for (int i = 0; i < m && obstacleGrid[i][0] == 0; i++) dp[i][0] = 1; for (int j = 0; j < n && obstacleGrid[0][j] == 0; j++) dp[0][j] = 1; From 83c2fd2454bbbbeda82725d2c38a2b577d7434c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E5=91=98Carl?= Date: Wed, 18 May 2022 09:27:56 +0800 Subject: [PATCH 0680/3019] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 3d44ca690f..01cab0b06a 100644 --- a/README.md +++ b/README.md @@ -31,7 +31,7 @@

-# LeetCode 刷题攻略1111 +# LeetCode 刷题攻略 ## 刷题攻略的背景 From 552e24b171bae840f32ab865ae4518c8674492e3 Mon Sep 17 00:00:00 2001 From: molonlu Date: Wed, 18 May 2022 11:49:55 +0800 Subject: [PATCH 0681/3019] =?UTF-8?q?Update=200226.=E7=BF=BB=E8=BD=AC?= =?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 通过tmp显示交换的方式改为golang风格的交换 --- ...77\273\350\275\254\344\272\214\345\217\211\346\240\221.md" | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git "a/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" "b/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" index a3ebe24dd3..af5b8043a7 100644 --- "a/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" @@ -368,9 +368,7 @@ func invertTree(root *TreeNode) *TreeNode { if root ==nil{ return nil } - temp:=root.Left - root.Left=root.Right - root.Right=temp + root.Left,root.Right=root.Right,root.Left//交换 invertTree(root.Left) invertTree(root.Right) From f389dcd987a7f9b381f146de9846fc4abfdb92ae Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Wed, 18 May 2022 16:23:50 +0800 Subject: [PATCH 0682/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20=E4=BA=8C?= =?UTF-8?q?=E5=8F=89=E6=A0=91=E7=90=86=E8=AE=BA=E5=9F=BA=E7=A1=80.md=20Sca?= =?UTF-8?q?la=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...1\347\220\206\350\256\272\345\237\272\347\241\200.md" | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" index 9c151e3205..9e10ac20b3 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -258,6 +258,13 @@ class TreeNode { } } ``` - +Scala: +```scala +class TreeNode(_value: Int = 0, _left: TreeNode = null, _right: TreeNode = null) { + var value: Int = _value + var left: TreeNode = _left + var right: TreeNode = _right +} +``` -----------------------
From b2be41e4bcd2c1ef6bc4951519e5134209b55689 Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Wed, 18 May 2022 16:54:15 +0800 Subject: [PATCH 0683/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20=E4=BA=8C?= =?UTF-8?q?=E5=8F=89=E6=A0=91=E7=9A=84=E9=80=92=E5=BD=92=E9=81=8D=E5=8E=86?= =?UTF-8?q?.md=20Scala=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...22\345\275\222\351\201\215\345\216\206.md" | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" index 186c39d3d8..29c0cfdaa4 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" @@ -470,5 +470,56 @@ func postorder(_ root: TreeNode?, res: inout [Int]) { res.append(root!.val) } ``` +Scala: 前序遍历:(144.二叉树的前序遍历) +```scala +object Solution { + import scala.collection.mutable.ListBuffer + def preorderTraversal(root: TreeNode): List[Int] = { + val res = ListBuffer[Int]() + def traversal(curNode: TreeNode): Unit = { + if(curNode == null) return + res.append(curNode.value) + traversal(curNode.left) + traversal(curNode.right) + } + traversal(root) + res.toList + } +} +``` +中序遍历:(94. 二叉树的中序遍历) +```scala +object Solution { + import scala.collection.mutable.ListBuffer + def inorderTraversal(root: TreeNode): List[Int] = { + val res = ListBuffer[Int]() + def traversal(curNode: TreeNode): Unit = { + if(curNode == null) return + traversal(curNode.left) + res.append(curNode.value) + traversal(curNode.right) + } + traversal(root) + res.toList + } +} +``` +后序遍历:(145. 二叉树的后序遍历) +```scala +object Solution { + import scala.collection.mutable.ListBuffer + def postorderTraversal(root: TreeNode): List[Int] = { + val res = ListBuffer[Int]() + def traversal(curNode: TreeNode): Unit = { + if (curNode == null) return + traversal(curNode.left) + traversal(curNode.right) + res.append(curNode.value) + } + traversal(root) + res.toList + } +} +``` -----------------------
From d6d227c4affd046a47429454aa241bae12c7def2 Mon Sep 17 00:00:00 2001 From: areslk <543430610@qq.com> Date: Wed, 18 May 2022 17:07:40 +0800 Subject: [PATCH 0684/3019] =?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 修改注释 --- ...\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" "b/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" index d98ff8a90c..b759836551 100644 --- "a/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" @@ -208,7 +208,7 @@ int getHeight(TreeNode* node) { ```CPP class Solution { public: - // 返回以该节点为根节点的二叉树的高度,如果不是二叉搜索树了则返回-1 + // 返回以该节点为根节点的二叉树的高度,如果不是平衡二叉树了则返回-1 int getHeight(TreeNode* node) { if (node == NULL) { return 0; From 4aad0f9ca58c0188248af5a1043a21722aae0129 Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Wed, 18 May 2022 17:26:22 +0800 Subject: [PATCH 0685/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20=E4=BA=8C?= =?UTF-8?q?=E5=8F=89=E6=A0=91=E7=9A=84=E8=BF=AD=E4=BB=A3=E9=81=8D=E5=8E=86?= =?UTF-8?q?.md=20Scala=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...55\344\273\243\351\201\215\345\216\206.md" | 65 +++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" index 13ba5f1e71..fac30f9989 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" @@ -568,6 +568,71 @@ func inorderTraversal(_ root: TreeNode?) -> [Int] { return result } ``` +Scala: +```scala +// 前序遍历(迭代法) +object Solution { + import scala.collection.mutable + def preorderTraversal(root: TreeNode): List[Int] = { + val res = mutable.ListBuffer[Int]() + if (root == null) return res.toList + // 声明一个栈,泛型为TreeNode + val stack = mutable.Stack[TreeNode]() + stack.push(root) // 先把根节点压入栈 + while (!stack.isEmpty) { + var curNode = stack.pop() + res.append(curNode.value) // 先把这个值压入栈 + // 如果当前节点的左右节点不为空,则入栈,先放右节点,再放左节点 + if (curNode.right != null) stack.push(curNode.right) + if (curNode.left != null) stack.push(curNode.left) + } + res.toList + } +} +// 中序遍历(迭代法) +object Solution { + import scala.collection.mutable + def inorderTraversal(root: TreeNode): List[Int] = { + val res = mutable.ArrayBuffer[Int]() + if (root == null) return res.toList + val stack = mutable.Stack[TreeNode]() + var curNode = root + // 将左节点都入栈,当遍历到最左(到空)的时候,再弹出栈顶元素,加入res + // 再把栈顶元素的右节点加进来,继续下一轮遍历 + while (curNode != null || !stack.isEmpty) { + if (curNode != null) { + stack.push(curNode) + curNode = curNode.left + } else { + curNode = stack.pop() + res.append(curNode.value) + curNode = curNode.right + } + } + res.toList + } +} + +// 后序遍历(迭代法) +object Solution { + import scala.collection.mutable + def postorderTraversal(root: TreeNode): List[Int] = { + val res = mutable.ListBuffer[Int]() + if (root == null) return res.toList + val stack = mutable.Stack[TreeNode]() + stack.push(root) + while (!stack.isEmpty) { + val curNode = stack.pop() + res.append(curNode.value) + // 这次左节点先入栈,右节点再入栈 + if(curNode.left != null) stack.push(curNode.left) + if(curNode.right != null) stack.push(curNode.right) + } + // 最后需要翻转List + res.reverse.toList + } +} +``` -----------------------
From b8b62ffc32de46005c4317150f952ad1aa483f5c Mon Sep 17 00:00:00 2001 From: 3Xpl0it3r Date: Wed, 18 May 2022 18:31:37 +0800 Subject: [PATCH 0686/3019] =?UTF-8?q?=E6=A0=91=E6=B7=B1=E5=BA=A6=20rust?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...00\345\244\247\346\267\261\345\272\246.md" | 27 ++++++++ ...00\345\260\217\346\267\261\345\272\246.md" | 64 +++++++++++++++++++ 2 files changed, 91 insertions(+) diff --git "a/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" "b/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" index 2229a85434..65a155fbda 100644 --- "a/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" +++ "b/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" @@ -192,6 +192,33 @@ public: }; ``` +rust: +```rust +impl Solution { + pub fn max_depth(root: Option>>) -> i32 { + if root.is_none(){ + return 0; + } + let mut max_depth: i32 = 0; + let mut stack = vec![root.unwrap()]; + while !stack.is_empty() { + let num = stack.len(); + for _i in 0..num{ + let top = stack.remove(0); + if top.borrow_mut().left.is_some(){ + stack.push(top.borrow_mut().left.take().unwrap()); + } + if top.borrow_mut().right.is_some(){ + stack.push(top.borrow_mut().right.take().unwrap()); + } + } + max_depth+=1; + } + max_depth + } +``` + + 那么我们可以顺便解决一下n叉树的最大深度问题 # 559.n叉树的最大深度 diff --git "a/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" "b/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" index 224caa5e37..b13316591c 100644 --- "a/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" +++ "b/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" @@ -488,5 +488,69 @@ func minDepth(_ root: TreeNode?) -> Int { } ``` +rust: +```rust +impl Solution { + pub fn min_depth(root: Option>>) -> i32 { + return Solution::bfs(root) + } + + // 递归 + pub fn dfs(node: Option>>) -> i32{ + if node.is_none(){ + return 0; + } + let parent = node.unwrap(); + let left_child = parent.borrow_mut().left.take(); + let right_child = parent.borrow_mut().right.take(); + if left_child.is_none() && right_child.is_none(){ + return 1; + } + let mut min_depth = i32::MAX; + if left_child.is_some(){ + let left_depth = Solution::dfs(left_child); + if left_depth <= min_depth{ + min_depth = left_depth + } + } + if right_child.is_some(){ + let right_depth = Solution::dfs(right_child); + if right_depth <= min_depth{ + min_depth = right_depth + } + } + min_depth + 1 + + } + + // 迭代 + pub fn bfs(node: Option>>) -> i32{ + let mut min_depth = 0; + if node.is_none(){ + return min_depth + } + let mut stack = vec![node.unwrap()]; + while !stack.is_empty(){ + min_depth += 1; + let num = stack.len(); + for _i in 0..num{ + let top = stack.remove(0); + let left_child = top.borrow_mut().left.take(); + let right_child = top.borrow_mut().right.take(); + if left_child.is_none() && right_child.is_none(){ + return min_depth; + } + if left_child.is_some(){ + stack.push(left_child.unwrap()); + } + if right_child.is_some(){ + stack.push(right_child.unwrap()); + } + } + } + min_depth + } +``` + -----------------------
From 54d10fc3b893d50c278349c9de9d09bab5924ae7 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Thu, 19 May 2022 00:21:29 +0800 Subject: [PATCH 0687/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880300.?= =?UTF-8?q?=E6=9C=80=E9=95=BF=E4=B8=8A=E5=8D=87=E5=AD=90=E5=BA=8F=E5=88=97?= =?UTF-8?q?.md=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...07\345\255\220\345\272\217\345\210\227.md" | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git "a/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" "b/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" index f68edb5ae5..5ccb2d769b 100644 --- "a/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" @@ -220,6 +220,27 @@ const lengthOfLIS = (nums) => { }; ``` +TypeScript + +```typescript +function lengthOfLIS(nums: number[]): number { + /** + dp[i]: 前i个元素中,以nums[i]结尾,最长子序列的长度 + */ + const dp: number[] = new Array(nums.length).fill(1); + let resMax: number = 0; + for (let i = 0, length = nums.length; i < length; i++) { + for (let j = 0; j < i; j++) { + if (nums[i] > nums[j]) { + dp[i] = Math.max(dp[i], dp[j] + 1); + } + } + resMax = Math.max(resMax, dp[i]); + } + return resMax; +}; +``` + From 52a486101d0525074a7b1f6a54a98b5940f9ab50 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Thu, 19 May 2022 00:43:00 +0800 Subject: [PATCH 0688/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880674.?= =?UTF-8?q?=E6=9C=80=E9=95=BF=E8=BF=9E=E7=BB=AD=E9=80=92=E5=A2=9E=E5=BA=8F?= =?UTF-8?q?=E5=88=97.md=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript?= =?UTF-8?q?=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...22\345\242\236\345\272\217\345\210\227.md" | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git "a/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" "b/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" index 56e95d97d8..6ec4a6c776 100644 --- "a/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" +++ "b/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" @@ -319,6 +319,45 @@ const findLengthOfLCIS = (nums) => { }; ``` +TypeScript: + +> 动态规划: + +```typescript +function findLengthOfLCIS(nums: number[]): number { + /** + dp[i]: 前i个元素,以nums[i]结尾,最长连续子序列的长度 + */ + const dp: number[] = new Array(nums.length).fill(1); + let resMax: number = 1; + for (let i = 1, length = nums.length; i < length; i++) { + if (nums[i] > nums[i - 1]) { + dp[i] = dp[i - 1] + 1; + } + resMax = Math.max(resMax, dp[i]); + } + return resMax; +}; +``` + +> 贪心: + +```typescript +function findLengthOfLCIS(nums: number[]): number { + let resMax: number = 1; + let count: number = 1; + for (let i = 0, length = nums.length; i < length - 1; i++) { + if (nums[i] < nums[i + 1]) { + count++; + } else { + count = 1; + } + resMax = Math.max(resMax, count); + } + return resMax; +}; +``` + From 648014b28a54e953d335e822d7e7a5f98a82e3ea Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Thu, 19 May 2022 10:19:22 +0800 Subject: [PATCH 0689/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20=E4=BA=8C?= =?UTF-8?q?=E5=8F=89=E6=A0=91=E7=9A=84=E7=BB=9F=E4=B8=80=E8=BF=AD=E4=BB=A3?= =?UTF-8?q?=E6=B3=95.md=20Scala=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...00\350\277\255\344\273\243\346\263\225.md" | 74 +++++++++++++++++++ 1 file changed, 74 insertions(+) diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\347\273\237\344\270\200\350\277\255\344\273\243\346\263\225.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\347\273\237\344\270\200\350\277\255\344\273\243\346\263\225.md" index f6edf586ea..9ca6ac39c9 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\347\273\237\344\270\200\350\277\255\344\273\243\346\263\225.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\347\273\237\344\270\200\350\277\255\344\273\243\346\263\225.md" @@ -591,6 +591,80 @@ function postorderTraversal(root: TreeNode | null): number[] { return res; }; ``` +Scala: +```scala +// 前序遍历 +object Solution { + import scala.collection.mutable + def preorderTraversal(root: TreeNode): List[Int] = { + val res = mutable.ListBuffer[Int]() + val stack = mutable.Stack[TreeNode]() + if (root != null) stack.push(root) + while (!stack.isEmpty) { + var curNode = stack.top + if (curNode != null) { + stack.pop() + if (curNode.right != null) stack.push(curNode.right) + if (curNode.left != null) stack.push(curNode.left) + stack.push(curNode) + stack.push(null) + } else { + stack.pop() + res.append(stack.pop().value) + } + } + res.toList + } +} + +// 中序遍历 +object Solution { + import scala.collection.mutable + def inorderTraversal(root: TreeNode): List[Int] = { + val res = mutable.ListBuffer[Int]() + val stack = mutable.Stack[TreeNode]() + if (root != null) stack.push(root) + while (!stack.isEmpty) { + var curNode = stack.top + if (curNode != null) { + stack.pop() + if (curNode.right != null) stack.push(curNode.right) + stack.push(curNode) + stack.push(null) + if (curNode.left != null) stack.push(curNode.left) + } else { + // 等于空的时候好办,弹出这个元素 + stack.pop() + res.append(stack.pop().value) + } + } + res.toList + } +} +// 后序遍历 +object Solution { + import scala.collection.mutable + def postorderTraversal(root: TreeNode): List[Int] = { + val res = mutable.ListBuffer[Int]() + val stack = mutable.Stack[TreeNode]() + if (root != null) stack.push(root) + while (!stack.isEmpty) { + var curNode = stack.top + if (curNode != null) { + stack.pop() + stack.push(curNode) + stack.push(null) + if (curNode.right != null) stack.push(curNode.right) + if (curNode.left != null) stack.push(curNode.left) + } else { + stack.pop() + res.append(stack.pop().value) + } + } + res.toList + } +} +``` -----------------------
From 33ed3d980eecec6824fb5b9edad83d7b916c4142 Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Thu, 19 May 2022 10:35:55 +0800 Subject: [PATCH 0690/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20102.=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?=20Scala=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...02\345\272\217\351\201\215\345\216\206.md" | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" index ab8f2e572e..5afce73a64 100644 --- "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" +++ "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" @@ -298,6 +298,31 @@ func levelOrder(_ root: TreeNode?) -> [[Int]] { return result } ``` +Scala: +```scala +// 102.二叉树的层序遍历 +object Solution { + import scala.collection.mutable + def levelOrder(root: TreeNode): List[List[Int]] = { + val res = mutable.ListBuffer[List[Int]]() + if (root == null) return res.toList + val queue = mutable.Queue[TreeNode]() // 声明一个队列 + queue.enqueue(root) // 把根节点加入queue + while (!queue.isEmpty) { + val tmp = mutable.ListBuffer[Int]() + val len = queue.size // 求出len的长度 + for (i <- 0 until len) { // 从0到当前队列长度的所有节点都加入到结果集 + val curNode = queue.dequeue() + tmp.append(curNode.value) + if (curNode.left != null) queue.enqueue(curNode.left) + if (curNode.right != null) queue.enqueue(curNode.right) + } + res.append(tmp.toList) + } + res.toList + } +} +``` **此时我们就掌握了二叉树的层序遍历了,那么如下九道力扣上的题目,只需要修改模板的两三行代码(不能再多了),便可打倒!** From 04339562c7ce6c46dbd081551e51f36dcaf5fe8d Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Thu, 19 May 2022 10:36:51 +0800 Subject: [PATCH 0691/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20107.=E4=BA=8C?= =?UTF-8?q?=E5=8F=89=E6=A0=91=E7=9A=84=E5=B1=82=E6=AC=A1=E9=81=8D=E5=8E=86?= =?UTF-8?q?II=20Scala=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...02\345\272\217\351\201\215\345\216\206.md" | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" index 5afce73a64..e707ce27ee 100644 --- "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" +++ "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" @@ -553,6 +553,33 @@ func levelOrderBottom(_ root: TreeNode?) -> [[Int]] { } ``` +Scala: +```scala +// 107.二叉树的层次遍历II +object Solution { + import scala.collection.mutable + def levelOrderBottom(root: TreeNode): List[List[Int]] = { + val res = mutable.ListBuffer[List[Int]]() + if (root == null) return res.toList + val queue = mutable.Queue[TreeNode]() + queue.enqueue(root) + while (!queue.isEmpty) { + val tmp = mutable.ListBuffer[Int]() + val len = queue.size + for (i <- 0 until len) { + val curNode = queue.dequeue() + tmp.append(curNode.value) + if (curNode.left != null) queue.enqueue(curNode.left) + if (curNode.right != null) queue.enqueue(curNode.right) + } + res.append(tmp.toList) + } + // 最后翻转一下 + res.reverse.toList + } +} +``` + # 199.二叉树的右视图 [力扣题目链接](https://leetcode-cn.com/problems/binary-tree-right-side-view/) From ba51a4947adb197fcc4551e3157c509795fd0a82 Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Thu, 19 May 2022 11:03:09 +0800 Subject: [PATCH 0692/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20199.=E4=BA=8C?= =?UTF-8?q?=E5=8F=89=E6=A0=91=E7=9A=84=E5=8F=B3=E8=A7=86=E5=9B=BE=20Scala?= =?UTF-8?q?=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...02\345\272\217\351\201\215\345\216\206.md" | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" index ab8f2e572e..b74f1a0b39 100644 --- "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" +++ "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" @@ -750,6 +750,31 @@ func rightSideView(_ root: TreeNode?) -> [Int] { } ``` +Scala: +```scala +// 199.二叉树的右视图 +object Solution { + import scala.collection.mutable + def rightSideView(root: TreeNode): List[Int] = { + val res = mutable.ListBuffer[Int]() + if (root == null) return res.toList + val queue = mutable.Queue[TreeNode]() + queue.enqueue(root) + while (!queue.isEmpty) { + val len = queue.size + var curNode: TreeNode = null + for (i <- 0 until len) { + curNode = queue.dequeue() + if (curNode.left != null) queue.enqueue(curNode.left) + if (curNode.right != null) queue.enqueue(curNode.right) + } + res.append(curNode.value) // 把最后一个节点的值加入解集 + } + res.toList // 最后需要把res转换为List,return关键字可以省略 + } +} +``` + # 637.二叉树的层平均值 [力扣题目链接](https://leetcode-cn.com/problems/average-of-levels-in-binary-tree/) From 0b88af0824b696be6d2f107adde3758f1df1c3f8 Mon Sep 17 00:00:00 2001 From: lizhendong128 Date: Thu, 19 May 2022 11:08:59 +0800 Subject: [PATCH 0693/3019] =?UTF-8?q?=E4=BF=AE=E6=94=B90150=E9=80=86?= =?UTF-8?q?=E6=B3=A2=E5=85=B0=E8=A1=A8=E8=BE=BE=E5=BC=8F=E6=B1=82=E5=80=BC?= =?UTF-8?q?=20Java=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 将for循环改为for each,使代码更加简洁。因为循环除了对token进行遍历,i并没有其他用途。 --- ...0\276\276\345\274\217\346\261\202\345\200\274.md" | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git "a/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" "b/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" index fd3d69aa33..6ce7e2f9d1 100644 --- "a/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" +++ "b/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" @@ -136,19 +136,19 @@ java: class Solution { public int evalRPN(String[] tokens) { Deque stack = new LinkedList(); - for (int i = 0; i < tokens.length; ++i) { - if ("+".equals(tokens[i])) { // leetcode 内置jdk的问题,不能使用==判断字符串是否相等 + for (String s : tokens) { + if ("+".equals(s)) { // leetcode 内置jdk的问题,不能使用==判断字符串是否相等 stack.push(stack.pop() + stack.pop()); // 注意 - 和/ 需要特殊处理 - } else if ("-".equals(tokens[i])) { + } else if ("-".equals(s)) { stack.push(-stack.pop() + stack.pop()); - } else if ("*".equals(tokens[i])) { + } else if ("*".equals(s)) { stack.push(stack.pop() * stack.pop()); - } else if ("/".equals(tokens[i])) { + } else if ("/".equals(s)) { int temp1 = stack.pop(); int temp2 = stack.pop(); stack.push(temp2 / temp1); } else { - stack.push(Integer.valueOf(tokens[i])); + stack.push(Integer.valueOf(s)); } } return stack.pop(); From 9af80d3007aed88bd8d09538ab6710218c3e9dfd Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Thu, 19 May 2022 11:10:07 +0800 Subject: [PATCH 0694/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20637.=E4=BA=8C?= =?UTF-8?q?=E5=8F=89=E6=A0=91=E7=9A=84=E5=B1=82=E5=B9=B3=E5=9D=87=E5=80=BC?= =?UTF-8?q?=20Scala=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...02\345\272\217\351\201\215\345\216\206.md" | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" index b74f1a0b39..a99449fb00 100644 --- "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" +++ "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" @@ -1006,6 +1006,30 @@ func averageOfLevels(_ root: TreeNode?) -> [Double] { return result } ``` +Scala: +```scala +// 637.二叉树的层平均值 +object Solution { + import scala.collection.mutable + def averageOfLevels(root: TreeNode): Array[Double] = { + val res = mutable.ArrayBuffer[Double]() + val queue = mutable.Queue[TreeNode]() + queue.enqueue(root) + while (!queue.isEmpty) { + var sum = 0.0 + var len = queue.size + for (i <- 0 until len) { + var curNode = queue.dequeue() + sum += curNode.value // 累加该层的值 + if (curNode.left != null) queue.enqueue(curNode.left) + if (curNode.right != null) queue.enqueue(curNode.right) + } + res.append(sum / len) // 平均值即为sum/len + } + res.toArray // 最后需要转换为Array,return关键字可以省略 + } +} +``` # 429.N叉树的层序遍历 From c922fbc0e3ee16bbd0f3406227ce51a44cfe636d Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Thu, 19 May 2022 12:19:10 +0800 Subject: [PATCH 0695/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20429.N=E5=8F=89?= =?UTF-8?q?=E6=A0=91=E7=9A=84=E5=B1=82=E5=BA=8F=E9=81=8D=E5=8E=86=20Scala?= =?UTF-8?q?=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...02\345\272\217\351\201\215\345\216\206.md" | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" index a99449fb00..6964e1f0ac 100644 --- "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" +++ "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" @@ -1274,6 +1274,34 @@ func levelOrder(_ root: Node?) -> [[Int]] { } ``` +Scala: +```scala +// 429.N叉树的层序遍历 +object Solution { + import scala.collection.mutable + def levelOrder(root: Node): List[List[Int]] = { + val res = mutable.ListBuffer[List[Int]]() + if (root == null) return res.toList + val queue = mutable.Queue[Node]() + queue.enqueue(root) // 根节点入队 + while (!queue.isEmpty) { + val tmp = mutable.ListBuffer[Int]() // 存储每层节点 + val len = queue.size + for (i <- 0 until len) { + val curNode = queue.dequeue() + tmp.append(curNode.value) // 将该节点的值加入tmp + // 循环遍历该节点的子节点,加入队列 + for (child <- curNode.children) { + queue.enqueue(child) + } + } + res.append(tmp.toList) // 将该层的节点放到结果集 + } + res.toList + } +} +``` + # 515.在每个树行中找最大值 [力扣题目链接](https://leetcode-cn.com/problems/find-largest-value-in-each-tree-row/) From 80301657b305bcbd614d5294b1d483d31419755f Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Thu, 19 May 2022 12:29:12 +0800 Subject: [PATCH 0696/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20515.=E5=9C=A8?= =?UTF-8?q?=E6=AF=8F=E4=B8=AA=E6=A0=91=E8=A1=8C=E4=B8=AD=E6=89=BE=E6=9C=80?= =?UTF-8?q?=E5=A4=A7=E5=80=BC=20Scala=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...02\345\272\217\351\201\215\345\216\206.md" | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" index ab8f2e572e..db27c73d68 100644 --- "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" +++ "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" @@ -1433,6 +1433,32 @@ func largestValues(_ root: TreeNode?) -> [Int] { } ``` +Scala: +```scala +// 515.在每个树行中找最大值 +object Solution { + import scala.collection.mutable + def largestValues(root: TreeNode): List[Int] = { + val res = mutable.ListBuffer[Int]() + if (root == null) return res.toList + val queue = mutable.Queue[TreeNode]() + queue.enqueue(root) + while (!queue.isEmpty) { + var max = Int.MinValue // 初始化max为系统最小值 + val len = queue.size + for (i <- 0 until len) { + val curNode = queue.dequeue() + max = math.max(max, curNode.value) // 对比求解最大值 + if (curNode.left != null) queue.enqueue(curNode.left) + if (curNode.right != null) queue.enqueue(curNode.right) + } + res.append(max) // 将最大值放入结果集 + } + res.toList + } +} +``` + # 116.填充每个节点的下一个右侧节点指针 [力扣题目链接](https://leetcode-cn.com/problems/populating-next-right-pointers-in-each-node/) From a3179499d03b05594b8808a1d11a0ab22048cf32 Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Thu, 19 May 2022 12:58:52 +0800 Subject: [PATCH 0697/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20116.=E5=A1=AB?= =?UTF-8?q?=E5=85=85=E6=AF=8F=E4=B8=AA=E8=8A=82=E7=82=B9=E7=9A=84=E4=B8=8B?= =?UTF-8?q?=E4=B8=80=E4=B8=AA=E5=8F=B3=E4=BE=A7=E8=8A=82=E7=82=B9=E6=8C=87?= =?UTF-8?q?=E9=92=88=20Scala=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...02\345\272\217\351\201\215\345\216\206.md" | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" index db27c73d68..18fdfcb3e2 100644 --- "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" +++ "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" @@ -1718,6 +1718,35 @@ func connect(_ root: Node?) -> Node? { } ``` +Scala: +```scala +// 116.填充每个节点的下一个右侧节点指针 +object Solution { + import scala.collection.mutable + + def connect(root: Node): Node = { + if (root == null) return root + val queue = mutable.Queue[Node]() + queue.enqueue(root) + while (!queue.isEmpty) { + val len = queue.size + val tmp = mutable.ListBuffer[Node]() + for (i <- 0 until len) { + val curNode = queue.dequeue() + tmp.append(curNode) + if (curNode.left != null) queue.enqueue(curNode.left) + if (curNode.right != null) queue.enqueue(curNode.right) + } + // 处理next指针 + for (i <- 0 until tmp.size - 1) { + tmp(i).next = tmp(i + 1) + } + tmp(tmp.size-1).next = null + } + root + } +} +``` # 117.填充每个节点的下一个右侧节点指针II [力扣题目链接](https://leetcode-cn.com/problems/populating-next-right-pointers-in-each-node-ii/) From 7a62a75e399325cf439eebf507e8ce2d576e618d Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Thu, 19 May 2022 12:59:45 +0800 Subject: [PATCH 0698/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20117.=E5=A1=AB?= =?UTF-8?q?=E5=85=85=E6=AF=8F=E4=B8=AA=E8=8A=82=E7=82=B9=E7=9A=84=E4=B8=8B?= =?UTF-8?q?=E4=B8=80=E4=B8=AA=E5=8F=B3=E4=BE=A7=E8=8A=82=E7=82=B9=E6=8C=87?= =?UTF-8?q?=E9=92=88II=20Scala=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...02\345\272\217\351\201\215\345\216\206.md" | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" index 18fdfcb3e2..a2130f7e93 100644 --- "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" +++ "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" @@ -1998,6 +1998,35 @@ func connect(_ root: Node?) -> Node? { } ``` +Scala: +```scala +// 117.填充每个节点的下一个右侧节点指针II +object Solution { + import scala.collection.mutable + + def connect(root: Node): Node = { + if (root == null) return root + val queue = mutable.Queue[Node]() + queue.enqueue(root) + while (!queue.isEmpty) { + val len = queue.size + val tmp = mutable.ListBuffer[Node]() + for (i <- 0 until len) { + val curNode = queue.dequeue() + tmp.append(curNode) + if (curNode.left != null) queue.enqueue(curNode.left) + if (curNode.right != null) queue.enqueue(curNode.right) + } + // 处理next指针 + for (i <- 0 until tmp.size - 1) { + tmp(i).next = tmp(i + 1) + } + tmp(tmp.size-1).next = null + } + root + } +} +``` # 104.二叉树的最大深度 [力扣题目链接](https://leetcode-cn.com/problems/maximum-depth-of-binary-tree/) From 32f0599243e7e9585a9b18a8b36fa0e50f120a24 Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Thu, 19 May 2022 13:38:22 +0800 Subject: [PATCH 0699/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20104.=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?=20Scala=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...02\345\272\217\351\201\215\345\216\206.md" | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" index ab8f2e572e..95a6b5d619 100644 --- "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" +++ "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" @@ -2160,6 +2160,30 @@ func maxDepth(_ root: TreeNode?) -> Int { } ``` +Scala: +```scala +// 104.二叉树的最大深度 +object Solution { + import scala.collection.mutable + def maxDepth(root: TreeNode): Int = { + if (root == null) return 0 + val queue = mutable.Queue[TreeNode]() + queue.enqueue(root) + var depth = 0 + while (!queue.isEmpty) { + val len = queue.length + depth += 1 + for (i <- 0 until len) { + val curNode = queue.dequeue() + if (curNode.left != null) queue.enqueue(curNode.left) + if (curNode.right != null) queue.enqueue(curNode.right) + } + } + depth + } +} +``` + # 111.二叉树的最小深度 [力扣题目链接](https://leetcode-cn.com/problems/minimum-depth-of-binary-tree/) From f5c5a58b137adad5490c04b57f82953101789999 Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Thu, 19 May 2022 13:42:12 +0800 Subject: [PATCH 0700/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20111.=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?=20Scala=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...02\345\272\217\351\201\215\345\216\206.md" | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" index 95a6b5d619..b411816adf 100644 --- "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" +++ "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" @@ -2403,6 +2403,30 @@ func minDepth(_ root: TreeNode?) -> Int { } ``` +Scala: +```scala +// 111.二叉树的最小深度 +object Solution { + import scala.collection.mutable + def minDepth(root: TreeNode): Int = { + if (root == null) return 0 + var depth = 0 + val queue = mutable.Queue[TreeNode]() + queue.enqueue(root) + while (!queue.isEmpty) { + depth += 1 + val len = queue.size + for (i <- 0 until len) { + val curNode = queue.dequeue() + if (curNode.left != null) queue.enqueue(curNode.left) + if (curNode.right != null) queue.enqueue(curNode.right) + if (curNode.left == null && curNode.right == null) return depth + } + } + depth + } +} +``` # 总结 From afcf6cd5a1093c3bc4f525b211858da02e4c47c6 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Thu, 19 May 2022 15:03:09 +0800 Subject: [PATCH 0701/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880718.?= =?UTF-8?q?=E6=9C=80=E9=95=BF=E9=87=8D=E5=A4=8D=E5=AD=90=E6=95=B0=E7=BB=84?= =?UTF-8?q?.md=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...15\345\255\220\346\225\260\347\273\204.md" | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git "a/problems/0718.\346\234\200\351\225\277\351\207\215\345\244\215\345\255\220\346\225\260\347\273\204.md" "b/problems/0718.\346\234\200\351\225\277\351\207\215\345\244\215\345\255\220\346\225\260\347\273\204.md" index 87b1492ae9..0b7b519958 100644 --- "a/problems/0718.\346\234\200\351\225\277\351\207\215\345\244\215\345\255\220\346\225\260\347\273\204.md" +++ "b/problems/0718.\346\234\200\351\225\277\351\207\215\345\244\215\345\255\220\346\225\260\347\273\204.md" @@ -297,6 +297,56 @@ const findLength = (nums1, nums2) => { } ``` +TypeScript: + +> 动态规划: + +```typescript +function findLength(nums1: number[], nums2: number[]): number { + /** + dp[i][j]:nums[i-1]和nums[j-1]结尾,最长重复子数组的长度 + */ + const length1: number = nums1.length, + length2: number = nums2.length; + const dp: number[][] = new Array(length1 + 1).fill(0) + .map(_ => new Array(length2 + 1).fill(0)); + let resMax: number = 0; + for (let i = 1; i <= length1; i++) { + for (let j = 1; j <= length2; j++) { + if (nums1[i - 1] === nums2[j - 1]) { + dp[i][j] = dp[i - 1][j - 1] + 1; + resMax = Math.max(resMax, dp[i][j]); + } + } + } + return resMax; +}; +``` + +> 滚动数组: + +```typescript +function findLength(nums1: number[], nums2: number[]): number { + const length1: number = nums1.length, + length2: number = nums2.length; + const dp: number[] = new Array(length1 + 1).fill(0); + let resMax: number = 0; + for (let i = 1; i <= length1; i++) { + for (let j = length2; j >= 1; j--) { + if (nums1[i - 1] === nums2[j - 1]) { + dp[j] = dp[j - 1] + 1; + resMax = Math.max(resMax, dp[j]); + } else { + dp[j] = 0; + } + } + } + return resMax; +}; +``` + + + -----------------------
From a4b024705b276e5cf69a2a521af8b923a32daaca Mon Sep 17 00:00:00 2001 From: xuxiaomeng <961592690@qq.com> Date: Thu, 19 May 2022 20:25:16 +0800 Subject: [PATCH 0702/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A00704.=E4=BA=8C?= =?UTF-8?q?=E5=88=86=E6=9F=A5=E6=89=BE=20Kotlin=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...14\345\210\206\346\237\245\346\211\276.md" | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git "a/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" "b/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" index 5562513089..9173d1da82 100644 --- "a/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" +++ "b/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" @@ -611,6 +611,38 @@ public class Solution{ } ``` +**Kotlin:** +```Kotlin +// (版本一)左闭右开区间 +class Solution { + fun search(nums: IntArray, target: Int): Int { + var left = 0 + var right = nums.size // [left,right) 右侧为开区间,right 设置为 nums.size + while (left < right) { + val mid = (left + right) / 2 + if (nums[mid] < target) left = mid + 1 + else if (nums[mid] > target) right = mid // 代码的核心,循环中 right 是开区间,这里也应是开区间 + else return mid + } + return -1 // 没有找到 target ,返回 -1 + } +} +// (版本二)左闭右闭区间 +class Solution { + fun search(nums: IntArray, target: Int): Int { + var left = 0 + var right = nums.size - 1 // [left,right] 右侧为闭区间,right 设置为 nums.size - 1 + while (left <= right) { + val mid = (left + right) / 2 + if (nums[mid] < target) left = mid + 1 + else if (nums[mid] > target) right = mid - 1 // 代码的核心,循环中 right 是闭区间,这里也应是闭区间 + else return mid + } + return -1 // 没有找到 target ,返回 -1 + } +} +``` + -----------------------
From 568a569f0572cd500c152c7d836bc3aea42a59ad Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Thu, 19 May 2022 20:39:58 +0800 Subject: [PATCH 0703/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=881143.?= =?UTF-8?q?=E6=9C=80=E9=95=BF=E5=85=AC=E5=85=B1=E5=AD=90=E5=BA=8F=E5=88=97?= =?UTF-8?q?.md=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...61\345\255\220\345\272\217\345\210\227.md" | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git "a/problems/1143.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" "b/problems/1143.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" index ecedf89b6e..d58330ec11 100644 --- "a/problems/1143.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/1143.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" @@ -236,6 +236,32 @@ const longestCommonSubsequence = (text1, text2) => { }; ``` +TypeScript: + +```typescript +function longestCommonSubsequence(text1: string, text2: string): number { + /** + dp[i][j]: text1中前i-1个和text2中前j-1个,最长公共子序列的长度 + */ + const length1: number = text1.length, + length2: number = text2.length; + const dp: number[][] = new Array(length1 + 1).fill(0) + .map(_ => new Array(length2 + 1).fill(0)); + for (let i = 1; i <= length1; i++) { + for (let j = 1; j <= length2; j++) { + if (text1[i - 1] === text2[j - 1]) { + dp[i][j] = dp[i - 1][j - 1] + 1; + } else { + dp[i][j] = Math.max(dp[i][j - 1], dp[i - 1][j]); + } + } + } + return dp[length1][length2]; +}; +``` + + + -----------------------
From b3335f78a9a5c0910577835f8e61069594a23a0f Mon Sep 17 00:00:00 2001 From: zhouchaoyu1 Date: Thu, 19 May 2022 20:47:08 +0800 Subject: [PATCH 0704/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20763.=E5=88=92?= =?UTF-8?q?=E5=88=86=E5=AD=97=E6=AF=8D=E5=8C=BA=E9=97=B4=20=E8=A1=A5?= =?UTF-8?q?=E5=85=85=E6=80=9D=E8=B7=AF=E7=9A=84Java=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...27\346\257\215\345\214\272\351\227\264.md" | 65 +++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git "a/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" "b/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" index 2210cffad8..2f4d1b4861 100644 --- "a/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" +++ "b/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" @@ -158,6 +158,71 @@ class Solution { return list; } } + +class Solution{ + /*解法二: 上述c++补充思路的Java代码实现*/ + + public int[][] findPartitions(String s) { + List temp = new ArrayList<>(); + int[][] hash = new int[26][2];//26个字母2列 表示该字母对应的区间 + + for (int i = 0; i < s.length(); i++) { + //更新字符c对应的位置i + char c = s.charAt(i); + if (hash[c - 'a'][0] == 0) hash[c - 'a'][0] = i; + + hash[c - 'a'][1] = i; + + //第一个元素区别对待一下 + hash[s.charAt(0) - 'a'][0] = 0; + } + + + List> h = new LinkedList<>(); + //组装区间 + for (int i = 0; i < 26; i++) { + //if (hash[i][0] != hash[i][1]) { + temp.clear(); + temp.add(hash[i][0]); + temp.add(hash[i][1]); + //System.out.println(temp); + h.add(new ArrayList<>(temp)); + // } + } + // System.out.println(h); + // System.out.println(h.size()); + int[][] res = new int[h.size()][2]; + for (int i = 0; i < h.size(); i++) { + List list = h.get(i); + res[i][0] = list.get(0); + res[i][1] = list.get(1); + } + + return res; + + } + + public List partitionLabels(String s) { + int[][] partitions = findPartitions(s); + List res = new ArrayList<>(); + Arrays.sort(partitions, (o1, o2) -> Integer.compare(o1[0], o2[0])); + int right = partitions[0][1]; + int left = 0; + for (int i = 0; i < partitions.length; i++) { + if (partitions[i][0] > right) { + //左边界大于右边界即可纪委一次分割 + res.add(right - left + 1); + left = partitions[i][0]; + } + right = Math.max(right, partitions[i][1]); + + } + //最右端 + res.add(right - left + 1); + return res; + + } +} ``` ### Python From 30c1be11ff9ef77ff6cf0294f37b09ae50ea4619 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Thu, 19 May 2022 21:26:54 +0800 Subject: [PATCH 0705/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=881035.?= =?UTF-8?q?=E4=B8=8D=E7=9B=B8=E4=BA=A4=E7=9A=84=E7=BA=BF.md=EF=BC=89?= =?UTF-8?q?=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...70\344\272\244\347\232\204\347\272\277.md" | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git "a/problems/1035.\344\270\215\347\233\270\344\272\244\347\232\204\347\272\277.md" "b/problems/1035.\344\270\215\347\233\270\344\272\244\347\232\204\347\272\277.md" index 279ed8162a..4463c5f713 100644 --- "a/problems/1035.\344\270\215\347\233\270\344\272\244\347\232\204\347\272\277.md" +++ "b/problems/1035.\344\270\215\347\233\270\344\272\244\347\232\204\347\272\277.md" @@ -183,6 +183,30 @@ const maxUncrossedLines = (nums1, nums2) => { }; ``` +TypeScript: + +```typescript +function maxUncrossedLines(nums1: number[], nums2: number[]): number { + /** + dp[i][j]: nums1前i-1个,nums2前j-1个,最大连线数 + */ + const length1: number = nums1.length, + length2: number = nums2.length; + const dp: number[][] = new Array(length1 + 1).fill(0) + .map(_ => new Array(length2 + 1).fill(0)); + for (let i = 1; i <= length1; i++) { + for (let j = 1; j <= length2; j++) { + if (nums1[i - 1] === nums2[j - 1]) { + dp[i][j] = dp[i - 1][j - 1] + 1; + } else { + dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]); + } + } + } + return dp[length1][length2]; +}; +``` + From 4d2b80ce7508553923c99a7786521c018c24ff8a Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Thu, 19 May 2022 21:59:33 +0800 Subject: [PATCH 0706/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880053.?= =?UTF-8?q?=E6=9C=80=E5=A4=A7=E5=AD=90=E5=BA=8F=E5=92=8C=E5=8A=A8=E6=80=81?= =?UTF-8?q?=E8=A7=84=E5=88=92.md=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typesc?= =?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 --- ...201\350\247\204\345\210\222\357\274\211.md" | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git "a/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" "b/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" index 4c883cb66c..99aa7acfd5 100644 --- "a/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" +++ "b/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" @@ -186,6 +186,24 @@ const maxSubArray = nums => { }; ``` +TypeScript: + +```typescript +function maxSubArray(nums: number[]): number { + /** + dp[i]:以nums[i]结尾的最大和 + */ + const dp: number[] = [] + dp[0] = nums[0]; + let resMax: number = 0; + for (let i = 1; i < nums.length; i++) { + dp[i] = Math.max(dp[i - 1] + nums[i], nums[i]); + resMax = Math.max(resMax, dp[i]); + } + return resMax; +}; +``` + ----------------------- From 3d6baa3ae3648ef41e7a96bd49cb68c3d9d2df2d Mon Sep 17 00:00:00 2001 From: dcj_hp <294487055@qq.com> Date: Fri, 20 May 2022 00:14:16 +0800 Subject: [PATCH 0707/3019] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20java=20=E4=B8=80?= =?UTF-8?q?=E7=BB=B4dp=E6=95=B0=E7=BB=84=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 --- ...61\345\255\220\345\272\217\345\210\227.md" | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git "a/problems/1143.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" "b/problems/1143.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" index ecedf89b6e..b4b8e6dbc1 100644 --- "a/problems/1143.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/1143.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" @@ -129,6 +129,9 @@ public: Java: ```java +/* + 二维dp数组 +*/ class Solution { public int longestCommonSubsequence(String text1, String text2) { int[][] dp = new int[text1.length() + 1][text2.length() + 1]; // 先对dp数组做初始化操作 @@ -146,6 +149,47 @@ class Solution { return dp[text1.length()][text2.length()]; } } + + + +/** + 一维dp数组 +*/ +class Solution { + public int longestCommonSubsequence(String text1, String text2) { + int n1 = text1.length(); + int n2 = text2.length(); + + // 多从二维dp数组过程分析 + // 关键在于 如果记录 dp[i - 1][j - 1] + // 因为 dp[i - 1][j - 1] dp[j - 1] <=> dp[i][j - 1] + int [] dp = new int[n2 + 1]; + + for(int i = 1; i <= n1; i++){ + + // 这里pre相当于 dp[i - 1][j - 1] + int pre = dp[0]; + for(int j = 1; j <= n2; j++){ + + //用于给pre赋值 + int cur = dp[j]; + if(text1.charAt(i - 1) == text2.charAt(j - 1)){ + //这里pre相当于dp[i - 1][j - 1] 千万不能用dp[j - 1] !! + dp[j] = pre + 1; + } else{ + // dp[j] 相当于 dp[i - 1][j] + // dp[j - 1] 相当于 dp[i][j - 1] + dp[j] = Math.max(dp[j], dp[j - 1]); + } + + //更新dp[i - 1][j - 1], 为下次使用做准备 + pre = cur; + } + } + + return dp[n2]; + } +} ``` Python: From 8759349af0001c6ee2f05ceece9cc0e331fbc08a Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Fri, 20 May 2022 00:35:32 +0800 Subject: [PATCH 0708/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880392.?= =?UTF-8?q?=E5=88=A4=E6=96=AD=E5=AD=90=E5=BA=8F=E5=88=97.md=EF=BC=89?= =?UTF-8?q?=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...55\345\255\220\345\272\217\345\210\227.md" | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git "a/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" "b/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" index 671576f7dc..3f7eb11d8d 100644 --- "a/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" @@ -201,7 +201,32 @@ const isSubsequence = (s, t) => { }; ``` +TypeScript: + +```typescript +function isSubsequence(s: string, t: string): boolean { + /** + dp[i][j]: s的前i-1个,t的前j-1个,最长公共子序列的长度 + */ + const sLen: number = s.length, + tLen: number = t.length; + const dp: number[][] = new Array(sLen + 1).fill(0) + .map(_ => new Array(tLen + 1).fill(0)); + for (let i = 1; i <= sLen; i++) { + for (let j = 1; j <= tLen; j++) { + if (s[i - 1] === t[j - 1]) { + dp[i][j] = dp[i - 1][j - 1] + 1; + } else { + dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]); + } + } + } + return dp[sLen][tLen] === s.length; +}; +``` + Go: + ```go func isSubsequence(s string, t string) bool { dp := make([][]int,len(s)+1) From 4eefc546c62d0b5d63f08d1b51e5603ee722d7d5 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Fri, 20 May 2022 13:41:23 +0800 Subject: [PATCH 0709/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880115.?= =?UTF-8?q?=E4=B8=8D=E5=90=8C=E7=9A=84=E5=AD=90=E5=BA=8F=E5=88=97.md?= =?UTF-8?q?=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...04\345\255\220\345\272\217\345\210\227.md" | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git "a/problems/0115.\344\270\215\345\220\214\347\232\204\345\255\220\345\272\217\345\210\227.md" "b/problems/0115.\344\270\215\345\220\214\347\232\204\345\255\220\345\272\217\345\210\227.md" index 0f76296949..ca66e20d2a 100644 --- "a/problems/0115.\344\270\215\345\220\214\347\232\204\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0115.\344\270\215\345\220\214\347\232\204\345\255\220\345\272\217\345\210\227.md" @@ -267,6 +267,36 @@ const numDistinct = (s, t) => { }; ``` +TypeScript: + +```typescript +function numDistinct(s: string, t: string): number { + /** + dp[i][j]: s前i个字符,t前j个字符,s子序列中t出现的个数 + dp[0][0]=1, 表示s前0个字符为'',t前0个字符为'' + */ + const sLen: number = s.length, + tLen: number = t.length; + const dp: number[][] = new Array(sLen + 1).fill(0) + .map(_ => new Array(tLen + 1).fill(0)); + for (let m = 0; m < sLen; m++) { + dp[m][0] = 1; + } + for (let i = 1; i <= sLen; i++) { + for (let j = 1; j <= tLen; j++) { + if (s[i - 1] === t[j - 1]) { + dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j]; + } else { + dp[i][j] = dp[i - 1][j]; + } + } + } + return dp[sLen][tLen]; +}; +``` + + + -----------------------
From 58c4ad4947506310ef7c05d9603972af684c9b96 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Fri, 20 May 2022 15:11:12 +0800 Subject: [PATCH 0710/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880583.?= =?UTF-8?q?=E4=B8=A4=E4=B8=AA=E5=AD=97=E7=AC=A6=E4=B8=B2=E7=9A=84=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E6=93=8D=E4=BD=9C.md=EF=BC=89=EF=BC=9A=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...40\351\231\244\346\223\215\344\275\234.md" | 61 +++++++++++++++++++ 1 file changed, 61 insertions(+) diff --git "a/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" "b/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" index 53c1a125d7..00f1170009 100644 --- "a/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" +++ "b/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" @@ -229,6 +229,67 @@ const minDistance = (word1, word2) => { }; ``` +TypeScript: + +> dp版本一: + +```typescript +function minDistance(word1: string, word2: string): number { + /** + dp[i][j]: word1前i个字符,word2前j个字符,所需最小步数 + dp[0][0]=0: word1前0个字符为'', word2前0个字符为'' + */ + const length1: number = word1.length, + length2: number = word2.length; + const dp: number[][] = new Array(length1 + 1).fill(0) + .map(_ => new Array(length2 + 1).fill(0)); + for (let i = 0; i <= length1; i++) { + dp[i][0] = i; + } + for (let i = 0; i <= length2; i++) { + dp[0][i] = i; + } + for (let i = 1; i <= length1; i++) { + for (let j = 1; j <= length2; j++) { + if (word1[i - 1] === word2[j - 1]) { + dp[i][j] = dp[i - 1][j - 1]; + } else { + dp[i][j] = Math.min(dp[i - 1][j], dp[i][j - 1]) + 1; + } + } + } + return dp[length1][length2]; +}; +``` + +> dp版本二: + +```typescript +function minDistance(word1: string, word2: string): number { + /** + dp[i][j]: word1前i个字符,word2前j个字符,最长公共子序列的长度 + dp[0][0]=0: word1前0个字符为'', word2前0个字符为'' + */ + const length1: number = word1.length, + length2: number = word2.length; + const dp: number[][] = new Array(length1 + 1).fill(0) + .map(_ => new Array(length2 + 1).fill(0)); + for (let i = 1; i <= length1; i++) { + for (let j = 1; j <= length2; j++) { + if (word1[i - 1] === word2[j - 1]) { + dp[i][j] = dp[i - 1][j - 1] + 1; + } else { + dp[i][j] = Math.max(dp[i][j - 1], dp[i - 1][j]); + } + } + } + const maxLen: number = dp[length1][length2]; + return length1 + length2 - maxLen * 2; +}; +``` + + + -----------------------
From fa3a45c3dbd3cb58b9c0027cb2c8fe9e7727a439 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Fri, 20 May 2022 16:33:34 +0800 Subject: [PATCH 0711/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880072.?= =?UTF-8?q?=E7=BC=96=E8=BE=91=E8=B7=9D=E7=A6=BB.md=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...26\350\276\221\350\267\235\347\246\273.md" | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git "a/problems/0072.\347\274\226\350\276\221\350\267\235\347\246\273.md" "b/problems/0072.\347\274\226\350\276\221\350\267\235\347\246\273.md" index 3802c228d6..530774eefc 100644 --- "a/problems/0072.\347\274\226\350\276\221\350\267\235\347\246\273.md" +++ "b/problems/0072.\347\274\226\350\276\221\350\267\235\347\246\273.md" @@ -327,5 +327,42 @@ const minDistance = (word1, word2) => { }; ``` +TypeScript: + +```typescript +function minDistance(word1: string, word2: string): number { + /** + dp[i][j]: word1前i个字符,word2前j个字符,最少操作数 + dp[0][0]=0:表示word1前0个字符为'', word2前0个字符为'' + */ + const length1: number = word1.length, + length2: number = word2.length; + const dp: number[][] = new Array(length1 + 1).fill(0) + .map(_ => new Array(length2 + 1).fill(0)); + for (let i = 0; i <= length1; i++) { + dp[i][0] = i; + } + for (let i = 0; i <= length2; i++) { + dp[0][i] = i; + } + for (let i = 1; i <= length1; i++) { + for (let j = 1; j <= length2; j++) { + if (word1[i - 1] === word2[j - 1]) { + dp[i][j] = dp[i - 1][j - 1]; + } else { + dp[i][j] = Math.min( + dp[i - 1][j], + dp[i][j - 1], + dp[i - 1][j - 1] + ) + 1; + } + } + } + return dp[length1][length2]; +}; +``` + + + -----------------------
From be7d6e1325009d5f404c8abeaae0cbed49ed2303 Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Fri, 20 May 2022 19:36:10 +0800 Subject: [PATCH 0712/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200226.=E7=BF=BB?= =?UTF-8?q?=E8=BD=AC=E4=BA=8C=E5=8F=89=E6=A0=91.md=20Scala=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...54\344\272\214\345\217\211\346\240\221.md" | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git "a/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" "b/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" index a3ebe24dd3..e378cbc106 100644 --- "a/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" @@ -820,5 +820,53 @@ func invertTree(_ root: TreeNode?) -> TreeNode? { } ``` +### Scala + +深度优先遍历(前序遍历): +```scala +object Solution { + def invertTree(root: TreeNode): TreeNode = { + if (root == null) return root + // 递归 + def process(node: TreeNode): Unit = { + if (node == null) return + // 翻转节点 + val curNode = node.left + node.left = node.right + node.right = curNode + process(node.left) + process(node.right) + } + process(root) + root + } +} +``` + +广度优先遍历(层序遍历): +```scala +object Solution { + import scala.collection.mutable + def invertTree(root: TreeNode): TreeNode = { + if (root == null) return root + val queue = mutable.Queue[TreeNode]() + queue.enqueue(root) + while (!queue.isEmpty) { + val len = queue.size + for (i <- 0 until len) { + var curNode = queue.dequeue() + if (curNode.left != null) queue.enqueue(curNode.left) + if (curNode.right != null) queue.enqueue(curNode.right) + // 翻转 + var tmpNode = curNode.left + curNode.left = curNode.right + curNode.right = tmpNode + } + } + root + } +} +``` + -----------------------
From 81d4685e36603ec59e3e02d8243f60e660081541 Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Fri, 20 May 2022 21:12:54 +0800 Subject: [PATCH 0713/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200101.=E5=AF=B9?= =?UTF-8?q?=E7=A7=B0=E4=BA=8C=E5=8F=89=E6=A0=91.md=20Scala=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...60\344\272\214\345\217\211\346\240\221.md" | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git "a/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" "b/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" index e4e232c884..97ca0685de 100644 --- "a/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" @@ -725,5 +725,25 @@ func isSymmetric3(_ root: TreeNode?) -> Bool { } ``` +## Scala + +递归: +```scala +object Solution { + def isSymmetric(root: TreeNode): Boolean = { + if (root == null) return true // 如果等于空直接返回true + def compare(left: TreeNode, right: TreeNode): Boolean = { + if (left == null && right == null) return true // 如果左右都为空,则为true + if (left == null && right != null) return false // 如果左空右不空,不对称,返回false + if (left != null && right == null) return false // 如果左不空右空,不对称,返回false + // 如果左右的值相等,并且往下递归 + left.value == right.value && compare(left.left, right.right) && compare(left.right, right.left) + } + // 分别比较左子树和右子树 + compare(root.left, root.right) + } +} +``` + -----------------------
From e7529aa31bf39bb1a3966ad8bd5fcbaa730b6447 Mon Sep 17 00:00:00 2001 From: Luo <82520819+Jerry-306@users.noreply.github.com> Date: Sat, 21 May 2022 09:14:39 +0800 Subject: [PATCH 0714/3019] =?UTF-8?q?=E9=87=8D=E5=86=99=200216.=E7=BB=84?= =?UTF-8?q?=E5=90=88=E6=80=BB=E5=92=8CIII=20JavaScript=20=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 原代码冗余,建议重写 --- ...345\220\210\346\200\273\345\222\214III.md" | 45 ++++++++----------- 1 file changed, 18 insertions(+), 27 deletions(-) diff --git "a/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" "b/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" index 32b1347e56..66ca7ff7e9 100644 --- "a/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" +++ "b/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" @@ -360,39 +360,30 @@ func backTree(n,k,startIndex int,track *[]int,result *[][]int){ ## javaScript ```js -// 等差数列 -var maxV = k => k * (9 + 10 - k) / 2; -var minV = k => k * (1 + k) / 2; +/** + * @param {number} k + * @param {number} n + * @return {number[][]} + */ var combinationSum3 = function(k, n) { - if (k > 9 || k < 1) return []; - // if (n > maxV(k) || n < minV(k)) return []; - // if (n === maxV(k)) return [Array.from({length: k}).map((v, i) => 9 - i)]; - // if (n === minV(k)) return [Array.from({length: k}).map((v, i) => i + 1)]; - - const res = [], path = []; - backtracking(k, n, 1, 0); - return res; - function backtracking(k, n, i, sum){ - const len = path.length; - if (len > k || sum > n) return; - if (maxV(k - len) < n - sum) return; - if (minV(k - len) > n - sum) return; - - if(len === k && sum == n) { - res.push(Array.from(path)); + const backtrack = (start) => { + const l = path.length; + if (l === k) { + const sum = path.reduce((a, b) => a + b); + if (sum === n) { + res.push([...path]); + } return; } - - const min = Math.min(n - sum, 9 + len - k + 1); - - for(let a = i; a <= min; a++) { - path.push(a); - sum += a; - backtracking(k, n, a + 1, sum); + for (let i = start; i <= 9 - (k - l) + 1; i++) { + path.push(i); + backtrack(i + 1); path.pop(); - sum -= a; } } + let res = [], path = []; + backtrack(1); + return res; }; ``` From b4873836bacc8a65b84e8f9a7e8da7fd5d7dcd58 Mon Sep 17 00:00:00 2001 From: Luo <82520819+Jerry-306@users.noreply.github.com> Date: Sat, 21 May 2022 09:45:03 +0800 Subject: [PATCH 0715/3019] =?UTF-8?q?=E7=BA=A0=E6=AD=A3=200131=20=E5=88=86?= =?UTF-8?q?=E5=89=B2=E5=9B=9E=E6=96=87=E4=B8=B2=20JavaScript=20=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit String 实例方法 substr 已弃用,请换成 slice --- ...\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" "b/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" index 7a702898dc..6a370fb470 100644 --- "a/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" +++ "b/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" @@ -442,7 +442,7 @@ var partition = function(s) { } for(let j = i; j < len; j++) { if(!isPalindrome(s, i, j)) continue; - path.push(s.substr(i, j - i + 1)); + path.push(s.slice(i, j + 1)); backtracking(j + 1); path.pop(); } From ab6693d4b44e11dcf51771f5004e11e33c68c2cf Mon Sep 17 00:00:00 2001 From: Luo <82520819+Jerry-306@users.noreply.github.com> Date: Sat, 21 May 2022 09:57:03 +0800 Subject: [PATCH 0716/3019] =?UTF-8?q?=E7=BA=A0=E6=AD=A3=200093.=E5=A4=8D?= =?UTF-8?q?=E5=88=B6IP=E5=9C=B0=E5=9D=80=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 String 实例 substr 方法已弃用,请使用 slice 方法 --- .../0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" "b/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" index 6401824b47..d5eaa8abd0 100644 --- "a/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" +++ "b/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" @@ -444,7 +444,7 @@ var restoreIpAddresses = function(s) { return; } for(let j = i; j < s.length; j++) { - const str = s.substr(i, j - i + 1); + const str = s.slice(i, j + 1); if(str.length > 3 || +str > 255) break; if(str.length > 1 && str[0] === "0") break; path.push(str); From fd194bd52fc58a22cf38627c3a6bc7d4e4335a11 Mon Sep 17 00:00:00 2001 From: Luo <82520819+Jerry-306@users.noreply.github.com> Date: Sat, 21 May 2022 10:06:05 +0800 Subject: [PATCH 0717/3019] =?UTF-8?q?=E7=BA=A0=E6=AD=A3=200078.=E5=AD=90?= =?UTF-8?q?=E9=9B=86=E9=97=AE=E9=A2=98=20JS=20=E3=80=81TS=20=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit JS 和 TS 里面 数组深拷贝一般采用 ES6 扩展运算符 ... ,或者 Array.from() 方法,而不会采用实例方法 slice. slice方法用于数组分割等操作,请注意代码书写规范! --- "problems/0078.\345\255\220\351\233\206.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/problems/0078.\345\255\220\351\233\206.md" "b/problems/0078.\345\255\220\351\233\206.md" index e1c52b5b81..2b1c7643b1 100644 --- "a/problems/0078.\345\255\220\351\233\206.md" +++ "b/problems/0078.\345\255\220\351\233\206.md" @@ -260,7 +260,7 @@ var subsets = function(nums) { let result = [] let path = [] function backtracking(startIndex) { - result.push(path.slice()) + result.push([...path]) for(let i = startIndex; i < nums.length; i++) { path.push(nums[i]) backtracking(i + 1) @@ -280,7 +280,7 @@ function subsets(nums: number[]): number[][] { backTracking(nums, 0, []); return resArr; function backTracking(nums: number[], startIndex: number, route: number[]): void { - resArr.push(route.slice()); + resArr.push([...route]); let length = nums.length; if (startIndex === length) return; for (let i = startIndex; i < length; i++) { From 13ed28dbcf8eb40e94fafab3da7955e967f298bd Mon Sep 17 00:00:00 2001 From: Luo <82520819+Jerry-306@users.noreply.github.com> Date: Sat, 21 May 2022 10:10:36 +0800 Subject: [PATCH 0718/3019] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=200090.=E5=AD=90?= =?UTF-8?q?=E9=9B=86II=20JS=E3=80=81TS=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 JS 和 TS 里面 数组深拷贝一般采用 ES6 扩展运算符 ... ,或者 Array.from() 方法,而不会采用实例方法 slice. slice方法用于数组分割等操作,请注意代码书写规范! --- "problems/0090.\345\255\220\351\233\206II.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/problems/0090.\345\255\220\351\233\206II.md" "b/problems/0090.\345\255\220\351\233\206II.md" index 74ce000b0b..dd64d1998e 100644 --- "a/problems/0090.\345\255\220\351\233\206II.md" +++ "b/problems/0090.\345\255\220\351\233\206II.md" @@ -299,7 +299,7 @@ var subsetsWithDup = function(nums) { return a - b }) function backtracing(startIndex, sortNums) { - result.push(path.slice(0)) + result.push([...path]) if(startIndex > nums.length - 1) { return } @@ -327,7 +327,7 @@ function subsetsWithDup(nums: number[]): number[][] { backTraking(nums, 0, []); return resArr; function backTraking(nums: number[], startIndex: number, route: number[]): void { - resArr.push(route.slice()); + resArr.push([...route]); let length: number = nums.length; if (startIndex === length) return; for (let i = startIndex; i < length; i++) { From 2da33bfc93326e3cdf5a358e5ef18646f97982fb Mon Sep 17 00:00:00 2001 From: Luo <82520819+Jerry-306@users.noreply.github.com> Date: Sat, 21 May 2022 10:46:39 +0800 Subject: [PATCH 0719/3019] =?UTF-8?q?=E7=BA=A0=E6=AD=A3=200046.=E5=85=A8?= =?UTF-8?q?=E6=8E=92=E5=88=97=20TS=20=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 JS 和 TS 里面 数组深拷贝一般采用 ES6 扩展运算符 ... ,或者 Array.from() 方法,而不会采用实例方法 slice. slice方法用于数组分割等操作,请注意代码书写规范! --- "problems/0046.\345\205\250\346\216\222\345\210\227.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0046.\345\205\250\346\216\222\345\210\227.md" "b/problems/0046.\345\205\250\346\216\222\345\210\227.md" index 836c36462f..6c55e8ef41 100644 --- "a/problems/0046.\345\205\250\346\216\222\345\210\227.md" +++ "b/problems/0046.\345\205\250\346\216\222\345\210\227.md" @@ -341,7 +341,7 @@ function permute(nums: number[]): number[][] { return resArr; function backTracking(nums: number[], route: number[]): void { if (route.length === nums.length) { - resArr.push(route.slice()); + resArr.push([...route]); return; } let tempVal: number; From 38b10bcbfdb3f90f6af93a5b196ca0f68463d744 Mon Sep 17 00:00:00 2001 From: Luo <82520819+Jerry-306@users.noreply.github.com> Date: Sat, 21 May 2022 10:48:51 +0800 Subject: [PATCH 0720/3019] =?UTF-8?q?=E7=BA=A0=E6=AD=A3=200047.=E5=85=A8?= =?UTF-8?q?=E6=8E=92=E5=88=97II=20JS=E3=80=81TS=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 JS 和 TS 里面 数组深拷贝一般采用 ES6 扩展运算符 ... ,或者 Array.from() 方法,而不会采用实例方法 slice. slice方法用于数组分割等操作,请注意代码书写规范! --- "problems/0047.\345\205\250\346\216\222\345\210\227II.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/problems/0047.\345\205\250\346\216\222\345\210\227II.md" "b/problems/0047.\345\205\250\346\216\222\345\210\227II.md" index cce25cd9a1..f635b8de40 100644 --- "a/problems/0047.\345\205\250\346\216\222\345\210\227II.md" +++ "b/problems/0047.\345\205\250\346\216\222\345\210\227II.md" @@ -268,7 +268,7 @@ var permuteUnique = function (nums) { function backtracing( used) { if (path.length === nums.length) { - result.push(path.slice()) + result.push([...path]) return } for (let i = 0; i < nums.length; i++) { @@ -303,7 +303,7 @@ function permuteUnique(nums: number[]): number[][] { return resArr; function backTracking(nums: number[], route: number[]): void { if (route.length === nums.length) { - resArr.push(route.slice()); + resArr.push([...route]); return; } for (let i = 0, length = nums.length; i < length; i++) { From f36c1885cc8ccac0f38538b59b0a55e1b9f47913 Mon Sep 17 00:00:00 2001 From: Luo <82520819+Jerry-306@users.noreply.github.com> Date: Sat, 21 May 2022 11:01:21 +0800 Subject: [PATCH 0721/3019] =?UTF-8?q?=E6=96=B0=E5=A2=9E=20=E5=9B=9E?= =?UTF-8?q?=E6=BA=AF=E7=AE=97=E6=B3=95=E5=8E=BB=E9=87=8D=E9=97=AE=E9=A2=98?= =?UTF-8?q?=E7=9A=84=E5=8F=A6=E4=B8=80=E7=A7=8D=E5=86=99=E6=B3=95=20JavaSc?= =?UTF-8?q?ript=20=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 --- ...00\347\247\215\345\206\231\346\263\225.md" | 84 ++++++++++++++++++- 1 file changed, 81 insertions(+), 3 deletions(-) diff --git "a/problems/\345\233\236\346\272\257\347\256\227\346\263\225\345\216\273\351\207\215\351\227\256\351\242\230\347\232\204\345\217\246\344\270\200\347\247\215\345\206\231\346\263\225.md" "b/problems/\345\233\236\346\272\257\347\256\227\346\263\225\345\216\273\351\207\215\351\227\256\351\242\230\347\232\204\345\217\246\344\270\200\347\247\215\345\206\231\346\263\225.md" index f48097e179..cbfe046a08 100644 --- "a/problems/\345\233\236\346\272\257\347\256\227\346\263\225\345\216\273\351\207\215\351\227\256\351\242\230\347\232\204\345\217\246\344\270\200\347\247\215\345\206\231\346\263\225.md" +++ "b/problems/\345\233\236\346\272\257\347\256\227\346\263\225\345\216\273\351\207\215\351\227\256\351\242\230\347\232\204\345\217\246\344\270\200\347\247\215\345\206\231\346\263\225.md" @@ -365,6 +365,84 @@ class Solution: return res ``` +JavaScript: + +**90.子集II** + +```javascript +function subsetsWithDup(nums) { + nums.sort((a, b) => a - b); + const resArr = []; + backTraking(nums, 0, []); + return resArr; + function backTraking(nums, startIndex, route) { + resArr.push([...route]); + const helperSet = new Set(); + for (let i = startIndex, length = nums.length; i < length; i++) { + if (helperSet.has(nums[i])) continue; + helperSet.add(nums[i]); + route.push(nums[i]); + backTraking(nums, i + 1, route); + route.pop(); + } + } +}; +``` + +**40. 组合总和 II** + +```javascript +function combinationSum2(candidates, target) { + candidates.sort((a, b) => a - b); + const resArr = []; + backTracking(candidates, target, 0, 0, []); + return resArr; + function backTracking( candidates, target, curSum, startIndex, route ) { + if (curSum > target) return; + if (curSum === target) { + resArr.push([...route]); + return; + } + const helperSet = new Set(); + for (let i = startIndex, length = candidates.length; i < length; i++) { + let tempVal = candidates[i]; + if (helperSet.has(tempVal)) continue; + helperSet.add(tempVal); + route.push(tempVal); + backTracking(candidates, target, curSum + tempVal, i + 1, route); + route.pop(); + } + } +}; +``` + +**47. 全排列 II** + +```javaescript +function permuteUnique(nums) { + const resArr = []; + const usedArr = []; + backTracking(nums, []); + return resArr; + function backTracking(nums, route) { + if (nums.length === route.length) { + resArr.push([...route]); + return; + } + const usedSet = new Set(); + for (let i = 0, length = nums.length; i < length; i++) { + if (usedArr[i] === true || usedSet.has(nums[i])) continue; + usedSet.add(nums[i]); + route.push(nums[i]); + usedArr[i] = true; + backTracking(nums, route); + usedArr[i] = false; + route.pop(); + } + } +}; +``` + TypeScript: **90.子集II** @@ -376,7 +454,7 @@ function subsetsWithDup(nums: number[]): number[][] { backTraking(nums, 0, []); return resArr; function backTraking(nums: number[], startIndex: number, route: number[]): void { - resArr.push(route.slice()); + resArr.push([...route]); const helperSet: Set = new Set(); for (let i = startIndex, length = nums.length; i < length; i++) { if (helperSet.has(nums[i])) continue; @@ -403,7 +481,7 @@ function combinationSum2(candidates: number[], target: number): number[][] { ) { if (curSum > target) return; if (curSum === target) { - resArr.push(route.slice()); + resArr.push([...route]); return; } const helperSet: Set = new Set(); @@ -430,7 +508,7 @@ function permuteUnique(nums: number[]): number[][] { return resArr; function backTracking(nums: number[], route: number[]): void { if (nums.length === route.length) { - resArr.push(route.slice()); + resArr.push([...route]); return; } const usedSet: Set = new Set(); From f6501464cfdfe0c207e5f1026b1b3251d9b5c927 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Sat, 21 May 2022 11:48:18 +0800 Subject: [PATCH 0722/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880647.?= =?UTF-8?q?=E5=9B=9E=E6=96=87=E5=AD=90=E4=B8=B2.md=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...36\346\226\207\345\255\220\344\270\262.md" | 57 +++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git "a/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" "b/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" index 913aec655a..6045ba7b49 100644 --- "a/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" +++ "b/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" @@ -406,6 +406,63 @@ const countSubstrings = (s) => { } ``` +TypeScript: + +> 动态规划: + +```typescript +function countSubstrings(s: string): number { + /** + dp[i][j]: [i,j]区间内的字符串是否为回文(左闭右闭) + */ + const length: number = s.length; + const dp: boolean[][] = new Array(length).fill(0) + .map(_ => new Array(length).fill(false)); + let resCount: number = 0; + // 自下而上,自左向右遍历 + for (let i = length - 1; i >= 0; i--) { + for (let j = i; j < length; j++) { + if ( + s[i] === s[j] && + (j - i <= 1 || dp[i + 1][j - 1] === true) + ) { + dp[i][j] = true; + resCount++; + } + } + } + return resCount; +}; +``` + +> 双指针法: + +```typescript +function countSubstrings(s: string): number { + const length: number = s.length; + let resCount: number = 0; + for (let i = 0; i < length; i++) { + resCount += expandRange(s, i, i); + resCount += expandRange(s, i, i + 1); + } + return resCount; +}; +function expandRange(s: string, left: number, right: number): number { + let palindromeNum: number = 0; + while ( + left >= 0 && right < s.length && + s[left] === s[right] + ) { + palindromeNum++; + left--; + right++; + } + return palindromeNum; +} +``` + + + -----------------------
From 8e7663c9c663db8c7d24aa1528d45c68fe6f5e29 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Sat, 21 May 2022 14:26:24 +0800 Subject: [PATCH 0723/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880516.?= =?UTF-8?q?=E6=9C=80=E9=95=BF=E5=9B=9E=E6=96=87=E5=AD=90=E5=BA=8F=E5=88=97?= =?UTF-8?q?.md=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...07\345\255\220\345\272\217\345\210\227.md" | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git "a/problems/0516.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\345\272\217\345\210\227.md" "b/problems/0516.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\345\272\217\345\210\227.md" index 69536cef56..1b0ee9a300 100644 --- "a/problems/0516.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0516.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\345\272\217\345\210\227.md" @@ -236,6 +236,35 @@ const longestPalindromeSubseq = (s) => { }; ``` +TypeScript: + +```typescript +function longestPalindromeSubseq(s: string): number { + /** + dp[i][j]:[i,j]区间内,最长回文子序列的长度 + */ + const length: number = s.length; + const dp: number[][] = new Array(length).fill(0) + .map(_ => new Array(length).fill(0)); + for (let i = 0; i < length; i++) { + dp[i][i] = 1; + } + // 自下而上,自左往右遍历 + for (let i = length - 1; i >= 0; i--) { + for (let j = i + 1; j < length; j++) { + if (s[i] === s[j]) { + dp[i][j] = dp[i + 1][j - 1] + 2; + } else { + dp[i][j] = Math.max(dp[i][j - 1], dp[i + 1][j]); + } + } + } + return dp[0][length - 1]; +}; +``` + + + -----------------------
From f39d349d308a4657c7cbe247060c1fcec7272497 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Sat, 21 May 2022 16:19:25 +0800 Subject: [PATCH 0724/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880739.?= =?UTF-8?q?=E6=AF=8F=E6=97=A5=E6=B8=A9=E5=BA=A6.md=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...17\346\227\245\346\270\251\345\272\246.md" | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git "a/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" "b/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" index 58edd48963..5e7a52ac32 100644 --- "a/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" +++ "b/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" @@ -371,6 +371,32 @@ var dailyTemperatures = function(temperatures) { }; ``` +TypeScript: + +> 精简版: + +```typescript +function dailyTemperatures(temperatures: number[]): number[] { + const length: number = temperatures.length; + const stack: number[] = []; + const resArr: number[] = new Array(length).fill(0); + stack.push(0); + for (let i = 1; i < length; i++) { + let top = stack[stack.length - 1]; + while ( + stack.length > 0 && + temperatures[top] < temperatures[i] + ) { + resArr[top] = i - top; + stack.pop(); + top = stack[stack.length - 1]; + } + stack.push(i); + } + return resArr; +}; +``` + From ef9cefe08939725adadbefd5e49c79d7ce9e9b63 Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Sat, 21 May 2022 17:11:25 +0800 Subject: [PATCH 0725/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200104.=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?.md=20Scala=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...00\345\244\247\346\267\261\345\272\246.md" | 99 +++++++++++++++++-- 1 file changed, 93 insertions(+), 6 deletions(-) diff --git "a/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" "b/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" index 2229a85434..40c65af988 100644 --- "a/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" +++ "b/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" @@ -468,7 +468,7 @@ class solution: ## go - +### 104.二叉树的最大深度 ```go /** * definition for a binary tree node. @@ -521,6 +521,8 @@ func maxdepth(root *treenode) int { ## javascript +### 104.二叉树的最大深度 + ```javascript var maxdepth = function(root) { if (root === null) return 0; @@ -568,6 +570,8 @@ var maxDepth = function(root) { }; ``` +### 559.n叉树的最大深度 + N叉树的最大深度 递归写法 ```js var maxDepth = function(root) { @@ -600,9 +604,9 @@ var maxDepth = function(root) { }; ``` -## TypeScript: +## TypeScript -> 二叉树的最大深度: +### 104.二叉树的最大深度 ```typescript // 后续遍历(自下而上) @@ -645,7 +649,7 @@ function maxDepth(root: TreeNode | null): number { }; ``` -> N叉树的最大深度 +### 559.n叉树的最大深度 ```typescript // 后续遍历(自下而上) @@ -675,6 +679,8 @@ function maxDepth(root: TreeNode | null): number { ## C +### 104.二叉树的最大深度 + 二叉树最大深度递归 ```c int maxDepth(struct TreeNode* root){ @@ -731,7 +737,8 @@ int maxDepth(struct TreeNode* root){ ## Swift ->二叉树最大深度 +### 104.二叉树的最大深度 + ```swift // 递归 - 后序 func maxDepth1(_ root: TreeNode?) -> Int { @@ -770,7 +777,8 @@ func maxDepth(_ root: TreeNode?) -> Int { } ``` ->N叉树最大深度 +### 559.n叉树的最大深度 + ```swift // 递归 func maxDepth(_ root: Node?) -> Int { @@ -806,5 +814,84 @@ func maxDepth1(_ root: Node?) -> Int { } ``` +## Scala + +### 104.二叉树的最大深度 +递归法: +```scala +object Solution { + def maxDepth(root: TreeNode): Int = { + def process(curNode: TreeNode): Int = { + if (curNode == null) return 0 + // 递归左节点和右节点,返回最大的,最后+1 + math.max(process(curNode.left), process(curNode.right)) + 1 + } + // 调用递归方法,return关键字可以省略 + process(root) + } +} +``` + +迭代法: +```scala +object Solution { + import scala.collection.mutable + def maxDepth(root: TreeNode): Int = { + var depth = 0 + if (root == null) return depth + val queue = mutable.Queue[TreeNode]() + queue.enqueue(root) + while (!queue.isEmpty) { + val len = queue.size + for (i <- 0 until len) { + val curNode = queue.dequeue() + if (curNode.left != null) queue.enqueue(curNode.left) + if (curNode.right != null) queue.enqueue(curNode.right) + } + depth += 1 // 只要有层次就+=1 + } + depth + } +} +``` + +### 559.n叉树的最大深度 + +递归法: +```scala +object Solution { + def maxDepth(root: Node): Int = { + if (root == null) return 0 + var depth = 0 + for (node <- root.children) { + depth = math.max(depth, maxDepth(node)) + } + depth + 1 + } +} +``` + +迭代法: (层序遍历) +```scala +object Solution { + import scala.collection.mutable + def maxDepth(root: Node): Int = { + if (root == null) return 0 + var depth = 0 + val queue = mutable.Queue[Node]() + queue.enqueue(root) + while (!queue.isEmpty) { + val len = queue.size + depth += 1 + for (i <- 0 until len) { + val curNode = queue.dequeue() + for (node <- curNode.children) queue.enqueue(node) + } + } + depth + } +} +``` + -----------------------
From 3a7afacdeb785d271dbd57c236c2bd344a88b343 Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Sat, 21 May 2022 17:18:02 +0800 Subject: [PATCH 0726/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200111.=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?.md=20Scala=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...00\345\260\217\346\267\261\345\272\246.md" | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git "a/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" "b/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" index 224caa5e37..a7eb913e13 100644 --- "a/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" +++ "b/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" @@ -488,5 +488,44 @@ func minDepth(_ root: TreeNode?) -> Int { } ``` +## Scala + +递归法: +```scala +object Solution { + def minDepth(root: TreeNode): Int = { + if (root == null) return 0 + if (root.left == null && root.right != null) return 1 + minDepth(root.right) + if (root.left != null && root.right == null) return 1 + minDepth(root.left) + // 如果两侧都不为空,则取最小值,return关键字可以省略 + 1 + math.min(minDepth(root.left), minDepth(root.right)) + } +} +``` + +迭代法: +```scala +object Solution { + import scala.collection.mutable + def minDepth(root: TreeNode): Int = { + if (root == null) return 0 + var depth = 0 + val queue = mutable.Queue[TreeNode]() + queue.enqueue(root) + while (!queue.isEmpty) { + depth += 1 + val len = queue.size + for (i <- 0 until len) { + val curNode = queue.dequeue() + if (curNode.left != null) queue.enqueue(curNode.left) + if (curNode.right != null) queue.enqueue(curNode.right) + if (curNode.left == null && curNode.right == null) return depth + } + } + depth + } +} +``` + -----------------------
From 9cbd053e0500846fccac3936aeb497a75906133e Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Sat, 21 May 2022 19:49:59 +0800 Subject: [PATCH 0727/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880496.?= =?UTF-8?q?=E4=B8=8B=E4=B8=80=E4=B8=AA=E6=9B=B4=E5=A4=A7=E5=85=83=E7=B4=A0?= =?UTF-8?q?I.md=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...4\345\244\247\345\205\203\347\264\240I.md" | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git "a/problems/0496.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240I.md" "b/problems/0496.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240I.md" index 02339677bc..274cc32b58 100644 --- "a/problems/0496.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240I.md" +++ "b/problems/0496.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240I.md" @@ -332,5 +332,36 @@ var nextGreaterElement = function (nums1, nums2) { }; ``` +TypeScript: + +```typescript +function nextGreaterElement(nums1: number[], nums2: number[]): number[] { + const resArr: number[] = new Array(nums1.length).fill(-1); + const stack: number[] = []; + const helperMap: Map = new Map(); + nums1.forEach((num, index) => { + helperMap.set(num, index); + }) + stack.push(0); + for (let i = 1, length = nums2.length; i < length; i++) { + let top = stack[stack.length - 1]; + while (stack.length > 0 && nums2[top] < nums2[i]) { + let index = helperMap.get(nums2[top]); + if (index !== undefined) { + resArr[index] = nums2[i]; + } + stack.pop(); + top = stack[stack.length - 1]; + } + if (helperMap.get(nums2[i]) !== undefined) { + stack.push(i); + } + } + return resArr; +}; +``` + + + -----------------------
From 10ad5411d98765272a4119ecf97b6d72c8e85ada Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Sat, 21 May 2022 20:37:58 +0800 Subject: [PATCH 0728/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880503.?= =?UTF-8?q?=E4=B8=8B=E4=B8=80=E4=B8=AA=E6=9B=B4=E5=A4=A7=E5=85=83=E7=B4=A0?= =?UTF-8?q?II.md=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\345\244\247\345\205\203\347\264\240II.md" | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git "a/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" "b/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" index ace4d40bd4..33807d265d 100644 --- "a/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" +++ "b/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" @@ -182,5 +182,31 @@ var nextGreaterElements = function (nums) { return res; }; ``` +TypeScript: + +```typescript +function nextGreaterElements(nums: number[]): number[] { + const length: number = nums.length; + const stack: number[] = []; + stack.push(0); + const resArr: number[] = new Array(length).fill(-1); + for (let i = 1; i < length * 2; i++) { + const index = i % length; + let top = stack[stack.length - 1]; + while (stack.length > 0 && nums[top] < nums[index]) { + resArr[top] = nums[index]; + stack.pop(); + top = stack[stack.length - 1]; + } + if (i < length) { + stack.push(i); + } + } + return resArr; +}; +``` + + + -----------------------
From 3de2992235e43b6ce40a35624a42a08b5a5a866b Mon Sep 17 00:00:00 2001 From: xuxiaomeng <961592690@qq.com> Date: Sat, 21 May 2022 21:02:59 +0800 Subject: [PATCH 0729/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A00027.=E7=A7=BB?= =?UTF-8?q?=E9=99=A4=E5=85=83=E7=B4=A0=20Kotlin=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...47\247\273\351\231\244\345\205\203\347\264\240.md" | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git "a/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" "b/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" index 590cf0b924..f0cb5375bf 100644 --- "a/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" +++ "b/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" @@ -329,5 +329,16 @@ int removeElement(int* nums, int numsSize, int val){ } ``` +Kotlin: +```kotlin +fun removeElement(nums: IntArray, `val`: Int): Int { + var slowIndex = 0 // 初始化慢指针 + for (fastIndex in nums.indices) { + if (nums[fastIndex] != `val`) nums[slowIndex++] = nums[fastIndex] // 在慢指针所在位置存储未被删除的元素 + } + return slowIndex + } +``` + -----------------------
From 97211892492753b1903a882c68b4387051b652cb Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Sun, 22 May 2022 00:12:15 +0800 Subject: [PATCH 0730/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880042.?= =?UTF-8?q?=E6=8E=A5=E9=9B=A8=E6=B0=B4.md=EF=BC=89=EF=BC=9A=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...2.\346\216\245\351\233\250\346\260\264.md" | 85 +++++++++++++++++++ 1 file changed, 85 insertions(+) diff --git "a/problems/0042.\346\216\245\351\233\250\346\260\264.md" "b/problems/0042.\346\216\245\351\233\250\346\260\264.md" index b232ce2206..060c0b4578 100644 --- "a/problems/0042.\346\216\245\351\233\250\346\260\264.md" +++ "b/problems/0042.\346\216\245\351\233\250\346\260\264.md" @@ -744,6 +744,91 @@ var trap = function(height) { }; ``` +### TypeScript + +双指针法: + +```typescript +function trap(height: number[]): number { + const length: number = height.length; + let resVal: number = 0; + for (let i = 0; i < length; i++) { + let leftMaxHeight: number = height[i], + rightMaxHeight: number = height[i]; + let leftIndex: number = i - 1, + rightIndex: number = i + 1; + while (leftIndex >= 0) { + if (height[leftIndex] > leftMaxHeight) + leftMaxHeight = height[leftIndex]; + leftIndex--; + } + while (rightIndex < length) { + if (height[rightIndex] > rightMaxHeight) + rightMaxHeight = height[rightIndex]; + rightIndex++; + } + resVal += Math.min(leftMaxHeight, rightMaxHeight) - height[i]; + } + return resVal; +}; +``` + +动态规划: + +```typescript +function trap(height: number[]): number { + const length: number = height.length; + const leftMaxHeightDp: number[] = [], + rightMaxHeightDp: number[] = []; + leftMaxHeightDp[0] = height[0]; + rightMaxHeightDp[length - 1] = height[length - 1]; + for (let i = 1; i < length; i++) { + leftMaxHeightDp[i] = Math.max(height[i], leftMaxHeightDp[i - 1]); + } + for (let i = length - 2; i >= 0; i--) { + rightMaxHeightDp[i] = Math.max(height[i], rightMaxHeightDp[i + 1]); + } + let resVal: number = 0; + for (let i = 0; i < length; i++) { + resVal += Math.min(leftMaxHeightDp[i], rightMaxHeightDp[i]) - height[i]; + } + return resVal; +}; +``` + +单调栈: + +```typescript +function trap(height: number[]): number { + const length: number = height.length; + const stack: number[] = []; + stack.push(0); + let resVal: number = 0; + for (let i = 1; i < length; i++) { + let top = stack[stack.length - 1]; + if (height[top] > height[i]) { + stack.push(i); + } else if (height[top] === height[i]) { + stack.pop(); + stack.push(i); + } else { + while (stack.length > 0 && height[top] < height[i]) { + let mid = stack.pop(); + if (stack.length > 0) { + let left = stack[stack.length - 1]; + let h = Math.min(height[left], height[i]) - height[mid]; + let w = i - left - 1; + resVal += h * w; + top = stack[stack.length - 1]; + } + } + stack.push(i); + } + } + return resVal; +}; +``` + ### C: 一种更简便的双指针方法: From 278011c2df448c295985c0ba4f2ddc0843f4efd7 Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Sun, 22 May 2022 11:11:50 +0800 Subject: [PATCH 0731/3019] Update --- ...10\345\271\266\345\214\272\351\227\264.md" | 4 +- "problems/0077.\347\273\204\345\220\210.md" | 25 +++++------ ...60\344\272\214\345\217\211\346\240\221.md" | 4 +- ...15\345\217\240\345\214\272\351\227\264.md" | 2 +- ...25\347\210\206\346\260\224\347\220\203.md" | 4 +- ...43\346\263\225\346\233\264\346\226\260.md" | 41 ------------------- 6 files changed, 20 insertions(+), 60 deletions(-) delete mode 100644 "problems/\351\235\242\350\257\225\351\242\230 02.07. \350\247\243\346\263\225\346\233\264\346\226\260.md" diff --git "a/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" "b/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" index a9caeaf057..0d002b4689 100644 --- "a/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" +++ "b/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" @@ -112,8 +112,8 @@ public: }; ``` -* 时间复杂度:$O(n\log n)$ ,有一个快排 -* 空间复杂度:$O(1)$,我没有算result数组(返回值所需容器占的空间) +* 时间复杂度:O(nlog n) ,有一个快排 +* 空间复杂度:O(n),有一个快排,最差情况(倒序)时,需要n次递归调用。因此确实需要O(n)的栈空间 ## 总结 diff --git "a/problems/0077.\347\273\204\345\220\210.md" "b/problems/0077.\347\273\204\345\220\210.md" index 4560c5b7eb..9e0398aba1 100644 --- "a/problems/0077.\347\273\204\345\220\210.md" +++ "b/problems/0077.\347\273\204\345\220\210.md" @@ -27,7 +27,7 @@ 也可以直接看我的B站视频:[带你学透回溯算法-组合问题(对应力扣题目:77.组合)](https://www.bilibili.com/video/BV1ti4y1L7cv#reply3733925949) -# 思路 +## 思路 本题这是回溯法的经典题目。 @@ -232,7 +232,7 @@ void backtracking(参数) { **对比一下本题的代码,是不是发现有点像!** 所以有了这个模板,就有解题的大体方向,不至于毫无头绪。 -# 总结 +## 总结 组合问题是回溯法解决的经典问题,我们开始的时候给大家列举一个很形象的例子,就是n为100,k为50的话,直接想法就需要50层for循环。 @@ -242,7 +242,7 @@ void backtracking(参数) { 接着用回溯法三部曲,逐步分析了函数参数、终止条件和单层搜索的过程。 -# 剪枝优化 +## 剪枝优化 我们说过,回溯法虽然是暴力搜索,但也有时候可以有点剪枝优化一下的。 @@ -324,7 +324,7 @@ public: }; ``` -# 剪枝总结 +## 剪枝总结 本篇我们准对求组合问题的回溯法代码做了剪枝优化,这个优化如果不画图的话,其实不好理解,也不好讲清楚。 @@ -334,10 +334,10 @@ public: -# 其他语言版本 +## 其他语言版本 -## Java: +### Java: ```java class Solution { List> result = new ArrayList<>(); @@ -366,6 +366,8 @@ class Solution { } ``` +### Python + Python2: ```python class Solution(object): @@ -395,7 +397,6 @@ class Solution(object): return result ``` -## Python ```python class Solution: def combine(self, n: int, k: int) -> List[List[int]]: @@ -432,7 +433,7 @@ class Solution: ``` -## javascript +### javascript 剪枝: ```javascript @@ -456,7 +457,7 @@ const combineHelper = (n, k, startIndex) => { } ``` -## TypeScript +### TypeScript ```typescript function combine(n: number, k: number): number[][] { @@ -479,7 +480,7 @@ function combine(n: number, k: number): number[][] { -## Go +### Go ```Go var res [][]int func combine(n int, k int) [][]int { @@ -534,7 +535,7 @@ func backtrack(n,k,start int,track []int){ } ``` -## C +### C ```c int* path; int pathTop; @@ -642,7 +643,7 @@ int** combine(int n, int k, int* returnSize, int** returnColumnSizes){ } ``` -## Swift +### Swift ```swift func combine(_ n: Int, _ k: Int) -> [[Int]] { diff --git "a/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" "b/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" index e4e232c884..1eb435892d 100644 --- "a/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" @@ -238,7 +238,7 @@ public: }; ``` -# 总结 +## 总结 这次我们又深度剖析了一道二叉树的“简单题”,大家会发现,真正的把题目搞清楚其实并不简单,leetcode上accept了和真正掌握了还是有距离的。 @@ -248,7 +248,7 @@ public: 如果已经做过这道题目的同学,读完文章可以再去看看这道题目,思考一下,会有不一样的发现! -# 相关题目推荐 +## 相关题目推荐 这两道题目基本和本题是一样的,只要稍加修改就可以AC。 diff --git "a/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" "b/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" index b24ca0246d..32790a3490 100644 --- "a/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" +++ "b/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" @@ -93,7 +93,7 @@ public: }; ``` * 时间复杂度:O(nlog n) ,有一个快排 -* 空间复杂度:O(1) +* 空间复杂度:O(n),有一个快排,最差情况(倒序)时,需要n次递归调用。因此确实需要O(n)的栈空间 大家此时会发现如此复杂的一个问题,代码实现却这么简单! diff --git "a/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" "b/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" index 33bbad5538..327694ca75 100644 --- "a/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" +++ "b/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" @@ -105,8 +105,8 @@ public: }; ``` -* 时间复杂度:$O(n\log n)$,因为有一个快排 -* 空间复杂度:$O(1)$ +* 时间复杂度:O(nlog n),因为有一个快排 +* 空间复杂度:O(1),有一个快排,最差情况(倒序)时,需要n次递归调用。因此确实需要O(n)的栈空间 可以看出代码并不复杂。 diff --git "a/problems/\351\235\242\350\257\225\351\242\230 02.07. \350\247\243\346\263\225\346\233\264\346\226\260.md" "b/problems/\351\235\242\350\257\225\351\242\230 02.07. \350\247\243\346\263\225\346\233\264\346\226\260.md" deleted file mode 100644 index 6115d02ee9..0000000000 --- "a/problems/\351\235\242\350\257\225\351\242\230 02.07. \350\247\243\346\263\225\346\233\264\346\226\260.md" +++ /dev/null @@ -1,41 +0,0 @@ -# 双指针,不计算链表长度 -设置指向headA和headB的指针pa、pb,分别遍历两个链表,每次循环同时更新pa和pb。 -* 当链表A遍历完之后,即pa为空时,将pa指向headB; -* 当链表B遍历完之后,即pa为空时,将pb指向headA; -* 当pa与pb相等时,即指向同一个节点,该节点即为相交起始节点。 -* 若链表不相交,则pa、pb同时为空时退出循环,即如果链表不相交,pa与pb在遍历过全部节点后同时指向结尾空节点,此时退出循环,返回空。 -# 证明思路 -设链表A不相交部分长度为a,链表B不相交部分长度为b,两个链表相交部分长度为c。
-在pa指向链表A时,即pa为空之前,pa经过链表A不相交部分和相交部分,走过的长度为a+c;
-pa指向链表B后,在移动相交节点之前经过链表B不相交部分,走过的长度为b,总合为a+c+b。
-同理,pb走过长度的总合为b+c+a。二者相等,即pa与pb可同时到达相交起始节点。
-该方法可避免计算具体链表长度。 -```cpp -class Solution { -public: - ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) { - //链表为空时,返回空指针 - if(headA == nullptr || headB == nullptr) return nullptr; - ListNode* pa = headA; - ListNode* pb = headB; - //pa与pb在遍历过全部节点后,同时指向结尾空节点时退出循环 - while(pa != nullptr || pb != nullptr){ - //pa为空时,将pa指向headB - if(pa == nullptr){ - pa = headB; - } - //pa为空时,将pb指向headA - if(pb == nullptr){ - pb = headA; - } - //pa与pb相等时,返回相交起始节点 - if(pa == pb){ - return pa; - } - pa = pa->next; - pb = pb->next; - } - return nullptr; - } -}; -``` From b06b83867b466fa2d72268c0a6ef50e4da52aac3 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Sun, 22 May 2022 17:09:55 +0800 Subject: [PATCH 0732/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880084.?= =?UTF-8?q?=E6=9F=B1=E7=8A=B6=E5=9B=BE=E4=B8=AD=E6=9C=80=E5=A4=A7=E7=9A=84?= =?UTF-8?q?=E7=9F=A9=E5=BD=A2.md=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typesc?= =?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 --- ...47\347\232\204\347\237\251\345\275\242.md" | 90 +++++++++++++++++++ 1 file changed, 90 insertions(+) diff --git "a/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" "b/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" index 439a3bc5b7..8f10a58251 100644 --- "a/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" +++ "b/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" @@ -486,5 +486,95 @@ var largestRectangleArea = function(heights) { return maxArea; }; ``` +TypeScript: + +> 双指针法(会超时): + +```typescript +function largestRectangleArea(heights: number[]): number { + let resMax: number = 0; + for (let i = 0, length = heights.length; i < length; i++) { + // 左开右开 + let left: number = i - 1, + right: number = i + 1; + while (left >= 0 && heights[left] >= heights[i]) { + left--; + } + while (right < length && heights[right] >= heights[i]) { + right++; + } + resMax = Math.max(resMax, heights[i] * (right - left - 1)); + } + return resMax; +}; +``` + +> 动态规划预处理: + +```typescript +function largestRectangleArea(heights: number[]): number { + const length: number = heights.length; + const leftHeightDp: number[] = [], + rightHeightDp: number[] = []; + leftHeightDp[0] = -1; + rightHeightDp[length - 1] = length; + for (let i = 1; i < length; i++) { + let j = i - 1; + while (j >= 0 && heights[i] <= heights[j]) { + j = leftHeightDp[j]; + } + leftHeightDp[i] = j; + } + for (let i = length - 2; i >= 0; i--) { + let j = i + 1; + while (j < length && heights[i] <= heights[j]) { + j = rightHeightDp[j]; + } + rightHeightDp[i] = j; + } + let resMax: number = 0; + for (let i = 0; i < length; i++) { + let area = heights[i] * (rightHeightDp[i] - leftHeightDp[i] - 1); + resMax = Math.max(resMax, area); + } + return resMax; +}; +``` + +> 单调栈: + +```typescript +function largestRectangleArea(heights: number[]): number { + heights.push(0); + const length: number = heights.length; + // 栈底->栈顶:严格单调递增 + const stack: number[] = []; + stack.push(0); + let resMax: number = 0; + for (let i = 1; i < length; i++) { + let top = stack[stack.length - 1]; + if (heights[top] < heights[i]) { + stack.push(i); + } else if (heights[top] === heights[i]) { + stack.pop(); + stack.push(i); + } else { + while (stack.length > 0 && heights[top] > heights[i]) { + let mid = stack.pop(); + let left = stack.length > 0 ? stack[stack.length - 1] : -1; + let w = i - left - 1; + let h = heights[mid]; + resMax = Math.max(resMax, w * h); + top = stack[stack.length - 1]; + } + stack.push(i); + } + } + return resMax; +}; +``` + + + -----------------------
From 10b440ec27b814715dad23110b919c33d59403b6 Mon Sep 17 00:00:00 2001 From: xuxiaomeng <961592690@qq.com> Date: Mon, 23 May 2022 09:38:24 +0800 Subject: [PATCH 0733/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A00977.=E6=9C=89?= =?UTF-8?q?=E5=BA=8F=E6=95=B0=E7=BB=84=E7=9A=84=E5=B9=B3=E6=96=B9=20Kotlin?= =?UTF-8?q?=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...04\347\232\204\345\271\263\346\226\271.md" | 23 ++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git "a/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" "b/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" index 24276bcff0..9c06d8a3a1 100644 --- "a/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" +++ "b/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" @@ -359,7 +359,28 @@ class Solution { } ``` - +Kotlin: +```kotlin +class Solution { + // 双指针法 + fun sortedSquares(nums: IntArray): IntArray { + var res = IntArray(nums.size) + var left = 0 // 指向数组的最左端 + var right = nums.size - 1 // 指向数组端最右端 + // 选择平方数更大的那一个往 res 数组中倒序填充 + for (index in nums.size - 1 downTo 0) { + if (nums[left] * nums[left] > nums[right] * nums[right]) { + res[index] = nums[left] * nums[left] + left++ + } else { + res[index] = nums[right] * nums[right] + right-- + } + } + return res + } +} +``` -----------------------
From 530422fa3ecf004d27f45552e909506947992902 Mon Sep 17 00:00:00 2001 From: Luo <82520819+Jerry-306@users.noreply.github.com> Date: Mon, 23 May 2022 10:04:15 +0800 Subject: [PATCH 0734/3019] =?UTF-8?q?0416.=E5=88=86=E5=89=B2=E7=AD=89?= =?UTF-8?q?=E5=92=8C=E5=AD=90=E9=9B=86=20=E6=96=B0=E5=A2=9E=20typescript?= =?UTF-8?q?=20=E8=A7=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 --- ...11\345\222\214\345\255\220\351\233\206.md" | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git "a/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" "b/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" index 6e93ae8e80..01ea825e8f 100644 --- "a/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" +++ "b/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" @@ -416,7 +416,24 @@ var canPartition = function(nums) { }; ``` - +TypeScript: + +```ts +function canPartition(nums: number[]): boolean { + const sum: number = nums.reduce((a: number, b: number): number => a + b); + if (sum % 2 === 1) return false; + const target: number = sum / 2; + // dp[j]表示容量(总数和)为j的背包所能装下的数(下标[0, i]之间任意取)的总和(<= 容量)的最大值 + const dp: number[] = new Array(target + 1).fill(0); + const n: number = nums.length; + for (let i: number = 0; i < n; i++) { + for (let j: number = target; j >= nums[i]; j--) { + dp[j] = Math.max(dp[j], dp[j - nums[i]] + nums[i]); + } + } + return dp[target] === target; +}; +``` ----------------------- From 8f9c8e5fb1f9d89830b92a06f1fc59d97fd84772 Mon Sep 17 00:00:00 2001 From: Luo <82520819+Jerry-306@users.noreply.github.com> Date: Mon, 23 May 2022 10:10:48 +0800 Subject: [PATCH 0735/3019] =?UTF-8?q?1049.=E6=9C=80=E5=90=8E=E4=B8=80?= =?UTF-8?q?=E5=9D=97=E7=9F=B3=E5=A4=B4=E9=87=8D=E9=87=8F=20=E6=96=B0?= =?UTF-8?q?=E5=A2=9Etypescript=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 --- ...4\347\232\204\351\207\215\351\207\217II.md" | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git "a/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" "b/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" index ee0ddef2d1..8d3eeb3b23 100644 --- "a/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" +++ "b/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" @@ -277,5 +277,23 @@ var lastStoneWeightII = function (stones) { }; ``` +TypeScript版本 + +```ts +function lastStoneWeightII(stones: number[]): number { + const sum: number = stones.reduce((a: number, b:number): number => a + b); + const target: number = Math.floor(sum / 2); + const n: number = stones.length; + // dp[j]表示容量(总数和)为j的背包所能装下的数(下标[0, i]之间任意取)的总和(<= 容量)的最大值 + const dp: number[] = new Array(target + 1).fill(0); + for (let i: number = 0; i < n; i++ ) { + for (let j: number = target; j >= stones[i]; j--) { + dp[j] = Math.max(dp[j], dp[j - stones[i]] + stones[i]); + } + } + return sum - dp[target] - dp[target]; +}; +``` + -----------------------
From ffc91f1f1ca6099af747c77c5cdbfc21125fc140 Mon Sep 17 00:00:00 2001 From: Luo <82520819+Jerry-306@users.noreply.github.com> Date: Mon, 23 May 2022 10:20:08 +0800 Subject: [PATCH 0736/3019] =?UTF-8?q?0494.=E7=9B=AE=E6=A0=87=E5=92=8C=20?= =?UTF-8?q?=E6=96=B0=E5=A2=9Etypescript=E7=89=88=E6=9C=AC=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...4.\347\233\256\346\240\207\345\222\214.md" | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git "a/problems/0494.\347\233\256\346\240\207\345\222\214.md" "b/problems/0494.\347\233\256\346\240\207\345\222\214.md" index 99b768347d..929b97d417 100644 --- "a/problems/0494.\347\233\256\346\240\207\345\222\214.md" +++ "b/problems/0494.\347\233\256\346\240\207\345\222\214.md" @@ -351,6 +351,28 @@ const findTargetSumWays = (nums, target) => { }; ``` +TypeScript: + +```ts +function findTargetSumWays(nums: number[], target: number): number { + // 把数组分成两个组合left, right.left + right = sum, left - right = target. + const sum: number = nums.reduce((a: number, b: number): number => a + b); + if ((sum + target) % 2 || Math.abs(target) > sum) return 0; + const left: number = (sum + target) / 2; + + // 将问题转化为装满容量为left的背包有多少种方法 + // dp[i]表示装满容量为i的背包有多少种方法 + const dp: number[] = new Array(left + 1).fill(0); + dp[0] = 1; // 装满容量为0的背包有1种方法(什么也不装) + for (let i: number = 0; i < nums.length; i++) { + for (let j: number = left; j >= nums[i]; j--) { + dp[j] += dp[j - nums[i]]; + } + } + return dp[left]; +}; +``` + ----------------------- From 282cdc2b44b755098d223d0f9c8bd36bf0e85959 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Mon, 23 May 2022 11:18:04 +0800 Subject: [PATCH 0737/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=881365.?= =?UTF-8?q?=E6=9C=89=E5=A4=9A=E5=B0=91=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.md=EF=BC=89?= =?UTF-8?q?=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...27\347\232\204\346\225\260\345\255\227.md" | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git "a/problems/1365.\346\234\211\345\244\232\345\260\221\345\260\217\344\272\216\345\275\223\345\211\215\346\225\260\345\255\227\347\232\204\346\225\260\345\255\227.md" "b/problems/1365.\346\234\211\345\244\232\345\260\221\345\260\217\344\272\216\345\275\223\345\211\215\346\225\260\345\255\227\347\232\204\346\225\260\345\255\227.md" index 78fa84c094..ce1e77dfa7 100644 --- "a/problems/1365.\346\234\211\345\244\232\345\260\221\345\260\217\344\272\216\345\275\223\345\211\215\346\225\260\345\255\227\347\232\204\346\225\260\345\255\227.md" +++ "b/problems/1365.\346\234\211\345\244\232\345\260\221\345\260\217\344\272\216\345\275\223\345\211\215\346\225\260\345\255\227\347\232\204\346\225\260\345\255\227.md" @@ -217,6 +217,46 @@ var smallerNumbersThanCurrent = function(nums) { }; ``` +TypeScript: + +> 暴力法: + +```typescript +function smallerNumbersThanCurrent(nums: number[]): number[] { + const length: number = nums.length; + const resArr: number[] = []; + for (let i = 0; i < length; i++) { + let count: number = 0; + for (let j = 0; j < length; j++) { + if (nums[j] < nums[i]) { + count++; + } + } + resArr[i] = count; + } + return resArr; +}; +``` + +> 排序+hash + +```typescript +function smallerNumbersThanCurrent(nums: number[]): number[] { + const length: number = nums.length; + const sortedArr: number[] = [...nums]; + sortedArr.sort((a, b) => a - b); + const hashMap: Map = new Map(); + for (let i = length - 1; i >= 0; i--) { + hashMap.set(sortedArr[i], i); + } + const resArr: number[] = []; + for (let i = 0; i < length; i++) { + resArr[i] = hashMap.get(nums[i]); + } + return resArr; +}; +``` + ----------------------- From f83d5edb6ebf5cd6de1eabba51a246a921f94e1b Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Mon, 23 May 2022 19:14:45 +0800 Subject: [PATCH 0738/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200222.=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.md=20Scala=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...02\347\202\271\344\270\252\346\225\260.md" | 63 +++++++++++++++++++ 1 file changed, 63 insertions(+) diff --git "a/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" "b/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" index ba7acc5a49..746d45cc4a 100644 --- "a/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" +++ "b/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" @@ -646,5 +646,68 @@ func countNodes(_ root: TreeNode?) -> Int { } ``` +## Scala + +递归: +```scala +object Solution { + def countNodes(root: TreeNode): Int = { + if(root == null) return 0 + 1 + countNodes(root.left) + countNodes(root.right) + } +} +``` + +层序遍历: +```scala +object Solution { + import scala.collection.mutable + def countNodes(root: TreeNode): Int = { + if (root == null) return 0 + val queue = mutable.Queue[TreeNode]() + var node = 0 + queue.enqueue(root) + while (!queue.isEmpty) { + val len = queue.size + for (i <- 0 until len) { + node += 1 + val curNode = queue.dequeue() + if (curNode.left != null) queue.enqueue(curNode.left) + if (curNode.right != null) queue.enqueue(curNode.right) + } + } + node + } +} +``` + +利用完全二叉树性质: +```scala +object Solution { + def countNodes(root: TreeNode): Int = { + if (root == null) return 0 + var leftNode = root.left + var rightNode = root.right + // 向左向右往下探 + var leftDepth = 0 + while (leftNode != null) { + leftDepth += 1 + leftNode = leftNode.left + } + var rightDepth = 0 + while (rightNode != null) { + rightDepth += 1 + rightNode = rightNode.right + } + // 如果相等就是一个满二叉树 + if (leftDepth == rightDepth) { + return (2 << leftDepth) - 1 + } + // 如果不相等就不是一个完全二叉树,继续向下递归 + countNodes(root.left) + countNodes(root.right) + 1 + } +} +``` + -----------------------
From 45a3c91a7a954947d6b7373bee876d2f498e26bd Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Mon, 23 May 2022 19:49:18 +0800 Subject: [PATCH 0739/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=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=20Scala=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...00\346\234\211\350\267\257\345\276\204.md" | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git "a/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" "b/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" index 1362897c89..70a3c66f5d 100644 --- "a/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" +++ "b/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" @@ -702,5 +702,35 @@ func binaryTreePaths(_ root: TreeNode?) -> [String] { } ``` +Scala: + +递归: +```scala +object Solution { + import scala.collection.mutable.ListBuffer + def binaryTreePaths(root: TreeNode): List[String] = { + val res = ListBuffer[String]() + def traversal(curNode: TreeNode, path: ListBuffer[Int]): Unit = { + path.append(curNode.value) + if (curNode.left == null && curNode.right == null) { + res.append(path.mkString("->")) // mkString函数: 将数组的所有值按照指定字符串拼接 + return // 处理完可以直接return + } + + if (curNode.left != null) { + traversal(curNode.left, path) + path.remove(path.size - 1) + } + if (curNode.right != null) { + traversal(curNode.right, path) + path.remove(path.size - 1) + } + } + traversal(root, ListBuffer[Int]()) + res.toList + } +} +``` + -----------------------
From 6d826271dc78b310dc17f107915707115a5bd544 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Tue, 24 May 2022 11:11:51 +0800 Subject: [PATCH 0740/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880941.?= =?UTF-8?q?=E6=9C=89=E6=95=88=E7=9A=84=E5=B1=B1=E8=84=89=E6=95=B0=E7=BB=84?= =?UTF-8?q?.md=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...61\350\204\211\346\225\260\347\273\204.md" | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git "a/problems/0941.\346\234\211\346\225\210\347\232\204\345\261\261\350\204\211\346\225\260\347\273\204.md" "b/problems/0941.\346\234\211\346\225\210\347\232\204\345\261\261\350\204\211\346\225\260\347\273\204.md" index 4b7a978c0e..7004e84c2f 100644 --- "a/problems/0941.\346\234\211\346\225\210\347\232\204\345\261\261\350\204\211\346\225\260\347\273\204.md" +++ "b/problems/0941.\346\234\211\346\225\210\347\232\204\345\261\261\350\204\211\346\225\260\347\273\204.md" @@ -157,6 +157,26 @@ var validMountainArray = function(arr) { }; ``` +## TypeScript + +```typescript +function validMountainArray(arr: number[]): boolean { + const length: number = arr.length; + if (length < 3) return false; + let left: number = 0, + right: number = length - 1; + while (left < (length - 1) && arr[left] < arr[left + 1]) { + left++; + } + while (right > 0 && arr[right] < arr[right - 1]) { + right--; + } + if (left === right && left !== 0 && right !== length - 1) + return true; + return false; +}; +``` + From 211f9f28dd6ed9f9540cd5feac9c8e9bd9f80568 Mon Sep 17 00:00:00 2001 From: SevenMonths Date: Tue, 24 May 2022 14:39:04 +0800 Subject: [PATCH 0741/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880344.?= =?UTF-8?q?=E5=8F=8D=E8=BD=AC=E5=AD=97=E7=AC=A6=E4=B8=B2.md=EF=BC=89?= =?UTF-8?q?=EF=BC=9APHP=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...54\345\255\227\347\254\246\344\270\262.md" | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git "a/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" "b/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" index 58bada05b9..583d4f7875 100644 --- "a/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" @@ -267,5 +267,34 @@ public class Solution } ``` +PHP: +```php +// 双指针 +// 一: +function reverseString(&$s) { + $left = 0; + $right = count($s)-1; + while($left<$right){ + $temp = $s[$left]; + $s[$left] = $s[$right]; + $s[$right] = $temp; + $left++; + $right--; + } +} + +// 二: +function reverseString(&$s) { + $this->reverse($s,0,count($s)-1); +} +// 按指定位置交换元素 +function reverse(&$s, $start, $end) { + for ($i = $start, $j = $end; $i < $j; $i++, $j--) { + $tmp = $s[$i]; + $s[$i] = $s[$j]; + $s[$j] = $tmp; + } +} +``` -----------------------
From ded66cf2f18df921edccfbfbf0325635c4fb04ad Mon Sep 17 00:00:00 2001 From: wang2jun <91008685+wang2jun@users.noreply.github.com> Date: Tue, 24 May 2022 14:53:33 +0800 Subject: [PATCH 0742/3019] =?UTF-8?q?Update=200052.N=E7=9A=87=E5=90=8EII.m?= =?UTF-8?q?d?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修改错别字:想-》详 --- "problems/0052.N\347\232\207\345\220\216II.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0052.N\347\232\207\345\220\216II.md" "b/problems/0052.N\347\232\207\345\220\216II.md" index 67e439ca81..1c45a7f116 100644 --- "a/problems/0052.N\347\232\207\345\220\216II.md" +++ "b/problems/0052.N\347\232\207\345\220\216II.md" @@ -44,7 +44,7 @@ n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并 # 思路 -想看:[51.N皇后](https://mp.weixin.qq.com/s/lU_QwCMj6g60nh8m98GAWg) ,基本没有区别 +详看:[51.N皇后](https://mp.weixin.qq.com/s/lU_QwCMj6g60nh8m98GAWg) ,基本没有区别 # C++代码 From 3665c051d794a3abc3b350c8cc5cdb897ef54f76 Mon Sep 17 00:00:00 2001 From: SevenMonths Date: Tue, 24 May 2022 16:53:39 +0800 Subject: [PATCH 0743/3019] =?UTF-8?q?=E5=A2=9E=E5=8A=A0(=E5=89=91=E6=8C=87?= =?UTF-8?q?Offer05.=E6=9B=BF=E6=8D=A2=E7=A9=BA=E6=A0=BC.md)=EF=BC=9Aphp?= =?UTF-8?q?=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...77\346\215\242\347\251\272\346\240\274.md" | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git "a/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" "b/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" index 037bd42773..63fb021a15 100644 --- "a/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" +++ "b/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" @@ -415,6 +415,40 @@ func replaceSpace(_ s: String) -> String { +PHP: +```php +function replaceSpace($s){ + $sLen = strlen($s); + $moreLen = $this->spaceLen($s) * 2; + + $head = $sLen - 1; + $tail = $sLen + $moreLen - 1; + + $s = $s . str_repeat(' ', $moreLen); + while ($head != $tail) { + if ($s[$head] == ' ') { + $s[$tail--] = '0'; + $s[$tail--] = '2'; + $s[$tail] = '%'; + } else { + $s[$tail] = $s[$head]; + } + $head--; + $tail--; + } + return $s; +} +// 统计空格个数 +function spaceLen($s){ + $count = 0; + for ($i = 0; $i < strlen($s); $i++) { + if ($s[$i] == ' ') { + $count++; + } + } + return $count; +} +``` ----------------------- From a69ee03b3eea09f7e2bb113b631462eadd313482 Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Tue, 24 May 2022 18:59:17 +0800 Subject: [PATCH 0744/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200404.=E5=B7=A6?= =?UTF-8?q?=E5=8F=B6=E5=AD=90=E4=B9=8B=E5=92=8C.md=20Scala=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...66\345\255\220\344\271\213\345\222\214.md" | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git "a/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" "b/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" index d7fd629e68..78fc58f378 100644 --- "a/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" +++ "b/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" @@ -516,6 +516,44 @@ int sumOfLeftLeaves(struct TreeNode* root){ } ``` +## Scala + +**递归:** +```scala +object Solution { + def sumOfLeftLeaves(root: TreeNode): Int = { + if(root == null) return 0 + var midValue = 0 + if(root.left != null && root.left.left == null && root.left.right == null){ + midValue = root.left.value + } + // return关键字可以省略 + midValue + sumOfLeftLeaves(root.left) + sumOfLeftLeaves(root.right) + } +} +``` + +**迭代:** +```scala +object Solution { + import scala.collection.mutable + def sumOfLeftLeaves(root: TreeNode): Int = { + val stack = mutable.Stack[TreeNode]() + if (root == null) return 0 + stack.push(root) + var sum = 0 + while (!stack.isEmpty) { + val curNode = stack.pop() + if (curNode.left != null && curNode.left.left == null && curNode.left.right == null) { + sum += curNode.left.value // 如果满足条件就累加 + } + if (curNode.right != null) stack.push(curNode.right) + if (curNode.left != null) stack.push(curNode.left) + } + sum + } +} +``` -----------------------
From 591cf193b0effd7606a4a50860804a25f06dea7c Mon Sep 17 00:00:00 2001 From: SevenMonths Date: Tue, 24 May 2022 19:06:30 +0800 Subject: [PATCH 0745/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0(0151.=E7=BF=BB?= =?UTF-8?q?=E8=BD=AC=E5=AD=97=E7=AC=A6=E4=B8=B2=E9=87=8C=E7=9A=84=E5=8D=95?= =?UTF-8?q?=E8=AF=8D.md)=EF=BC=9APHP=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...14\347\232\204\345\215\225\350\257\215.md" | 47 +++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git "a/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" "b/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" index d03de42146..e76e05dd57 100644 --- "a/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" +++ "b/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" @@ -761,6 +761,53 @@ func reverseWord(_ s: inout [Character]) { +PHP: +```php +function reverseWords($s) { + $this->removeExtraSpaces($s); + $this->reverseString($s, 0, strlen($s)-1); + // 将每个单词反转 + $start = 0; + for ($i = 0; $i <= strlen($s); $i++) { + // 到达空格或者串尾,说明一个单词结束。进行翻转。 + if ($i == strlen($s) || $s[$i] == ' ') { + // 翻转,注意是左闭右闭 []的翻转。 + $this->reverseString($s, $start, $i-1); + // +1: 单词与单词直接有个空格 + $start = $i + 1; + } + } + return $s; +} + +// 移除多余空格 +function removeExtraSpaces(&$s){ + $slow = 0; + for ($i = 0; $i < strlen($s); $i++) { + if ($s[$i] != ' ') { + if ($slow != 0){ + $s[$slow++] = ' '; + } + while ($i < strlen($s) && $s[$i] != ' ') { + $s[$slow++] = $s[$i++]; + } + } + } + // 移动覆盖处理,丢弃多余的脏数据。 + $s = substr($s,0,$slow); + return ; +} + +// 翻转字符串 +function reverseString(&$s, $start, $end) { + for ($i = $start, $j = $end; $i < $j; $i++, $j--) { + $tmp = $s[$i]; + $s[$i] = $s[$j]; + $s[$j] = $tmp; + } + return ; +} +``` ----------------------- From 17a2ea3c435677f9b7b21a413bac1939208fae22 Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Tue, 24 May 2022 19:21:53 +0800 Subject: [PATCH 0746/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200513.=E6=89=BE?= =?UTF-8?q?=E6=A0=91=E5=B7=A6=E4=B8=8B=E8=A7=92=E7=9A=84=E5=80=BC.md=20Sca?= =?UTF-8?q?la=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...13\350\247\222\347\232\204\345\200\274.md" | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git "a/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" "b/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" index 12c62c7068..296fe47883 100644 --- "a/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" +++ "b/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" @@ -546,7 +546,50 @@ func findBottomLeftValue(_ root: TreeNode?) -> Int { } ``` +## Scala + +递归版本: +```scala +object Solution { + def findBottomLeftValue(root: TreeNode): Int = { + var maxLeftValue = 0 + var maxLen = Int.MinValue + // 递归方法 + def traversal(node: TreeNode, leftLen: Int): Unit = { + // 如果左右都为空并且当前深度大于最大深度,记录最左节点的值 + if (node.left == null && node.right == null && leftLen > maxLen) { + maxLen = leftLen + maxLeftValue = node.value + } + if (node.left != null) traversal(node.left, leftLen + 1) + if (node.right != null) traversal(node.right, leftLen + 1) + } + traversal(root, 0) // 调用方法 + maxLeftValue // return关键字可以省略 + } +} +``` +层序遍历: +```scala + import scala.collection.mutable + + def findBottomLeftValue(root: TreeNode): Int = { + val queue = mutable.Queue[TreeNode]() + queue.enqueue(root) + var res = 0 // 记录每层最左侧结果 + while (!queue.isEmpty) { + val len = queue.size + for (i <- 0 until len) { + val curNode = queue.dequeue() + if (i == 0) res = curNode.value // 记录最最左侧的节点 + if (curNode.left != null) queue.enqueue(curNode.left) + if (curNode.right != null) queue.enqueue(curNode.right) + } + } + res // 最终返回结果,return关键字可以省略 + } +``` -----------------------
From 4405be238d0041b3cd2719df2945e00fe114c030 Mon Sep 17 00:00:00 2001 From: SevenMonths Date: Tue, 24 May 2022 19:56:37 +0800 Subject: [PATCH 0747/3019] =?UTF-8?q?=E5=A2=9E=E5=8A=A0(0206.=E7=BF=BB?= =?UTF-8?q?=E8=BD=AC=E9=93=BE=E8=A1=A8.md)=EF=BC=9Aphp=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...77\273\350\275\254\351\223\276\350\241\250.md" | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git "a/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md" "b/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md" index 941928baae..2e80972c00 100644 --- "a/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md" +++ "b/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md" @@ -497,5 +497,20 @@ struct ListNode* reverseList(struct ListNode* head){ } ``` +PHP: +```php +// 双指针法: +function reverseList($head) { + $cur = $head; + $pre = NULL; + while($cur){ + $temp = $cur->next; + $cur->next = $pre; + $pre = $cur; + $cur = $temp; + } + return $pre; +} +``` -----------------------
From 5e0a01c9f3129b822c17ec33c6e46296df6ccfeb Mon Sep 17 00:00:00 2001 From: SevenMonths Date: Tue, 24 May 2022 20:21:22 +0800 Subject: [PATCH 0748/3019] =?UTF-8?q?=E5=A2=9E=E5=8A=A0(0019.=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.md)=EF=BC=9APHP=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...4N\344\270\252\350\212\202\347\202\271.md" | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git "a/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" "b/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" index 813e9b02fa..b0669697b8 100644 --- "a/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" +++ "b/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" @@ -290,5 +290,26 @@ func removeNthFromEnd(_ head: ListNode?, _ n: Int) -> ListNode? { } ``` +PHP: +```php +function removeNthFromEnd($head, $n) { + // 设置虚拟头节点 + $dummyHead = new ListNode(); + $dummyHead->next = $head; + + $slow = $fast = $dummyHead; + while($n-- && $fast != null){ + $fast = $fast->next; + } + // fast 再走一步,让 slow 指向删除节点的上一个节点 + $fast = $fast->next; + while ($fast != NULL) { + $fast = $fast->next; + $slow = $slow->next; + } + $slow->next = $slow->next->next; + return $dummyHead->next; +} +``` -----------------------
From 1a01fe3237e1b05d955daff920874f1386d1d1a0 Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Tue, 24 May 2022 20:58:07 +0800 Subject: [PATCH 0749/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200112.=E8=B7=AF?= =?UTF-8?q?=E5=BE=84=E6=80=BB=E5=92=8C.md=20Scala=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...57\345\276\204\346\200\273\345\222\214.md" | 107 ++++++++++++++++-- 1 file changed, 95 insertions(+), 12 deletions(-) diff --git "a/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" "b/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" index 41463ec181..6bf32ae929 100644 --- "a/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" +++ "b/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" @@ -300,7 +300,7 @@ public: ## java -lc112 +### 0112.路径总和 ```java class solution { public boolean haspathsum(treenode root, int targetsum) { @@ -373,7 +373,7 @@ class solution { ``` -0113.路径总和-ii +### 0113.路径总和-ii ```java class solution { @@ -436,7 +436,7 @@ class Solution { ## python -0112.路径总和 +### 0112.路径总和 **递归** ```python @@ -488,7 +488,7 @@ class solution: return false ``` -0113.路径总和-ii +### 0113.路径总和-ii **递归** ```python @@ -545,7 +545,7 @@ class Solution: ## go -112. 路径总和 +### 112. 路径总和 ```go //递归法 @@ -570,7 +570,7 @@ func hasPathSum(root *TreeNode, targetSum int) bool { } ``` -113. 路径总和 II +### 113. 路径总和 II ```go /** @@ -612,7 +612,7 @@ func traverse(node *TreeNode, result *[][]int, currPath *[]int, targetSum int) { ## javascript -0112.路径总和 +### 0112.路径总和 **递归** ```javascript @@ -673,7 +673,7 @@ let hasPathSum = function(root, targetSum) { }; ``` -0113.路径总和-ii +### 0113.路径总和-ii **递归** ```javascript @@ -768,7 +768,7 @@ let pathSum = function(root, targetSum) { ## TypeScript -> 0112.路径总和 +### 0112.路径总和 **递归法:** @@ -850,7 +850,7 @@ function hasPathSum(root: TreeNode | null, targetSum: number): boolean { }; ``` -> 0112.路径总和 ii +### 0112.路径总和 ii **递归法:** @@ -888,7 +888,7 @@ function pathSum(root: TreeNode | null, targetSum: number): number[][] { ## Swift -0112.路径总和 +### 0112.路径总和 **递归** @@ -955,7 +955,7 @@ func hasPathSum(_ root: TreeNode?, _ targetSum: Int) -> Bool { } ``` -0113.路径总和 II +### 0113.路径总和 II **递归** @@ -1006,7 +1006,90 @@ func traversal(_ cur: TreeNode?, count: Int) { } ``` +## Scala +### 0112.路径总和 + +**递归:** +```scala +object Solution { + def hasPathSum(root: TreeNode, targetSum: Int): Boolean = { + if(root == null) return false + var res = false + + def traversal(curNode: TreeNode, sum: Int): Unit = { + if (res) return // 如果直接标记为true了,就没有往下递归的必要了 + if (curNode.left == null && curNode.right == null && sum == targetSum) { + res = true + return + } + // 往下递归 + if (curNode.left != null) traversal(curNode.left, sum + curNode.left.value) + if (curNode.right != null) traversal(curNode.right, sum + curNode.right.value) + } + + traversal(root, root.value) + res // return关键字可以省略 + } +} +``` + +**迭代:** +```scala +object Solution { + import scala.collection.mutable + def hasPathSum(root: TreeNode, targetSum: Int): Boolean = { + if (root == null) return false + val stack = mutable.Stack[(TreeNode, Int)]() + stack.push((root, root.value)) // 将根节点元素放入stack + while (!stack.isEmpty) { + val curNode = stack.pop() // 取出栈顶元素 + // 如果遇到叶子节点,看当前的值是否等于targetSum,等于则返回true + if (curNode._1.left == null && curNode._1.right == null && curNode._2 == targetSum) { + return true + } + if (curNode._1.right != null) stack.push((curNode._1.right, curNode._2 + curNode._1.right.value)) + if (curNode._1.left != null) stack.push((curNode._1.left, curNode._2 + curNode._1.left.value)) + } + false //如果没有返回true,即可返回false,return关键字可以省略 + } +} +``` + +### 0113.路径总和 II + +**递归:** +```scala +object Solution { + import scala.collection.mutable.ListBuffer + def pathSum(root: TreeNode, targetSum: Int): List[List[Int]] = { + val res = ListBuffer[List[Int]]() + if (root == null) return res.toList + val path = ListBuffer[Int](); + + def traversal(cur: TreeNode, count: Int): Unit = { + if (cur.left == null && cur.right == null && count == 0) { + res.append(path.toList) + return + } + if (cur.left != null) { + path.append(cur.left.value) + traversal(cur.left, count - cur.left.value) + path.remove(path.size - 1) + } + if (cur.right != null) { + path.append(cur.right.value) + traversal(cur.right, count - cur.right.value) + path.remove(path.size - 1) + } + } + + path.append(root.value) + traversal(root, targetSum - root.value) + res.toList + } +} +``` -----------------------
From e28c733f758adc362095299a73b7f4dacd76be6e Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Wed, 25 May 2022 11:19:33 +0800 Subject: [PATCH 0750/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=881207.?= =?UTF-8?q?=E7=8B=AC=E4=B8=80=E6=97=A0=E4=BA=8C=E7=9A=84=E5=87=BA=E7=8E=B0?= =?UTF-8?q?=E6=AC=A1=E6=95=B0.md=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typesc?= =?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 --- ...72\347\216\260\346\254\241\346\225\260.md" | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git "a/problems/1207.\347\213\254\344\270\200\346\227\240\344\272\214\347\232\204\345\207\272\347\216\260\346\254\241\346\225\260.md" "b/problems/1207.\347\213\254\344\270\200\346\227\240\344\272\214\347\232\204\345\207\272\347\216\260\346\254\241\346\225\260.md" index ba92552ab8..fc51dfd42f 100644 --- "a/problems/1207.\347\213\254\344\270\200\346\227\240\344\272\214\347\232\204\345\207\272\347\216\260\346\254\241\346\225\260.md" +++ "b/problems/1207.\347\213\254\344\270\200\346\227\240\344\272\214\347\232\204\345\207\272\347\216\260\346\254\241\346\225\260.md" @@ -150,5 +150,39 @@ var uniqueOccurrences = function(arr) { }; ``` +TypeScript: + +> 借用数组: + +```typescript +function uniqueOccurrences(arr: number[]): boolean { + const countArr: number[] = new Array(2001).fill(0); + for (let i = 0, length = arr.length; i < length; i++) { + countArr[arr[i] + 1000]++; + } + const flagArr: boolean[] = new Array(1001).fill(false); + for (let count of countArr) { + if (count === 0) continue; + if (flagArr[count] === true) return false; + flagArr[count] = true; + } + return true; +}; +``` + +> 借用map、set + +```typescript +function uniqueOccurrences(arr: number[]): boolean { + const countMap: Map = new Map(); + arr.forEach(val => { + countMap.set(val, (countMap.get(val) || 0) + 1); + }) + return countMap.size === new Set(countMap.values()).size; +}; +``` + + + -----------------------
From 0fe499ac4142d87634d43c8e447de48091b803c3 Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Wed, 25 May 2022 21:01:54 +0800 Subject: [PATCH 0751/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200106.=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?.md=20Scala=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...40\344\272\214\345\217\211\346\240\221.md" | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git "a/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" "b/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" index 188ad3cb44..37a702b7ba 100644 --- "a/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" @@ -1091,7 +1091,53 @@ class Solution_0106 { } ``` +## Scala +106 从中序与后序遍历序列构造二叉树 + +```scala +object Solution { + def buildTree(inorder: Array[Int], postorder: Array[Int]): TreeNode = { + // 1、如果长度为0,则直接返回null + var len = inorder.size + if (len == 0) return null + // 2、后序数组的最后一个元素是当前根元素 + var rootValue = postorder(len - 1) + var root: TreeNode = new TreeNode(rootValue, null, null) + if (len == 1) return root // 如果数组只有一个节点,就直接返回 + // 3、在中序数组中找到切割点的索引 + var delimiterIndex: Int = inorder.indexOf(rootValue) + // 4、切分数组往下迭代 + root.left = buildTree(inorder.slice(0, delimiterIndex), postorder.slice(0, delimiterIndex)) + root.right = buildTree(inorder.slice(delimiterIndex + 1, len), postorder.slice(delimiterIndex, len - 1)) + root // 返回root,return关键字可以省略 + } +} +``` + +105 从前序与中序遍历序列构造二叉树 + +```scala +object Solution { + def buildTree(preorder: Array[Int], inorder: Array[Int]): TreeNode = { + // 1、如果长度为0,直接返回空 + var len = inorder.size + if (len == 0) return null + // 2、前序数组的第一个元素是当前子树根节点 + var rootValue = preorder(0) + var root = new TreeNode(rootValue, null, null) + if (len == 1) return root // 如果数组元素只有一个,那么返回根节点 + // 3、在中序数组中,找到切割点 + var delimiterIndex = inorder.indexOf(rootValue) + + // 4、切分数组往下迭代 + root.left = buildTree(preorder.slice(1, delimiterIndex + 1), inorder.slice(0, delimiterIndex)) + root.right = buildTree(preorder.slice(delimiterIndex + 1, preorder.size), inorder.slice(delimiterIndex + 1, len)) + + root + } +} +``` -----------------------
From 2137778d44d256795bd0ca6c9b880b2c3be180d1 Mon Sep 17 00:00:00 2001 From: damon <245211612@qq.com> Date: Thu, 26 May 2022 00:29:02 +0800 Subject: [PATCH 0752/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880015.?= =?UTF-8?q?=E4=B8=89=E6=95=B0=E4=B9=8B=E5=92=8C.md=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0javascript=E7=89=88=E6=9C=ACnsum=E7=9A=84?= =?UTF-8?q?=E9=80=9A=E7=94=A8=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...11\346\225\260\344\271\213\345\222\214.md" | 70 +++++++++++++++++++ 1 file changed, 70 insertions(+) diff --git "a/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" "b/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" index cc184c879e..12d83d8f4b 100644 --- "a/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" @@ -345,6 +345,76 @@ var threeSum = function(nums) { return res }; ``` + +解法二:nSum通用解法。递归 + +```js +/** + * nsum通用解法,支持2sum,3sum,4sum...等等 + * 时间复杂度分析: + * 1. n = 2时,时间复杂度O(NlogN),排序所消耗的时间。、 + * 2. n > 2时,时间复杂度为O(N^n-1),即N的n-1次方,至少是2次方,此时可省略排序所消耗的时间。举例:3sum为O(n^2),4sum为O(n^3) + * @param {number[]} nums + * @return {number[][]} + */ +var threeSum = function (nums) { + // nsum通用解法核心方法 + function nSumTarget(nums, n, start, target) { + // 前提:nums要先排序好 + let res = []; + if (n === 2) { + res = towSumTarget(nums, start, target); + } else { + for (let i = start; i < nums.length; i++) { + // 递归求(n - 1)sum + let subRes = nSumTarget( + nums, + n - 1, + i + 1, + target - nums[i] + ); + for (let j = 0; j < subRes.length; j++) { + res.push([nums[i], ...subRes[j]]); + } + // 跳过相同元素 + while (nums[i] === nums[i + 1]) i++; + } + } + return res; + } + + function towSumTarget(nums, start, target) { + // 前提:nums要先排序好 + let res = []; + let len = nums.length; + let left = start; + let right = len - 1; + while (left < right) { + let sum = nums[left] + nums[right]; + if (sum < target) { + while (nums[left] === nums[left + 1]) left++; + left++; + } else if (sum > target) { + while (nums[right] === nums[right - 1]) right--; + right--; + } else { + // 相等 + res.push([nums[left], nums[right]]); + // 跳过相同元素 + while (nums[left] === nums[left + 1]) left++; + while (nums[right] === nums[right - 1]) right--; + left++; + right--; + } + } + return res; + } + nums.sort((a, b) => a - b); + // n = 3,此时求3sum之和 + return nSumTarget(nums, 3, 0, 0); +}; +``` + TypeScript: ```typescript From c70440ac4318e48cfd3500ec290678f8976bb008 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Thu, 26 May 2022 10:54:39 +0800 Subject: [PATCH 0753/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880283.?= =?UTF-8?q?=E7=A7=BB=E5=8A=A8=E9=9B=B6.md=EF=BC=89=EF=BC=9A=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...3.\347\247\273\345\212\250\351\233\266.md" | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git "a/problems/0283.\347\247\273\345\212\250\351\233\266.md" "b/problems/0283.\347\247\273\345\212\250\351\233\266.md" index ed59d2c4aa..60eea3788a 100644 --- "a/problems/0283.\347\247\273\345\212\250\351\233\266.md" +++ "b/problems/0283.\347\247\273\345\212\250\351\233\266.md" @@ -133,6 +133,27 @@ var moveZeroes = function(nums) { }; ``` +TypeScript: + +```typescript +function moveZeroes(nums: number[]): void { + const length: number = nums.length; + let slowIndex: number = 0, + fastIndex: number = 0; + while (fastIndex < length) { + if (nums[fastIndex] !== 0) { + nums[slowIndex++] = nums[fastIndex]; + }; + fastIndex++; + } + while (slowIndex < length) { + nums[slowIndex++] = 0; + } +}; +``` + + + -----------------------
From 36a1d71201a59a113a339a1555e2734b7e0cc764 Mon Sep 17 00:00:00 2001 From: Harrytsz <18810271846@163.com> Date: Thu, 26 May 2022 16:35:42 +0800 Subject: [PATCH 0754/3019] =?UTF-8?q?Update=200541.=E5=8F=8D=E8=BD=AC?= =?UTF-8?q?=E5=AD=97=E7=AC=A6=E4=B8=B2II.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 去掉 continue,增加 else 分支,逻辑更加清晰 --- ...15\350\275\254\345\255\227\347\254\246\344\270\262II.md" | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git "a/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" "b/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" index 8c13a39021..38dc685393 100644 --- "a/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" +++ "b/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" @@ -53,10 +53,10 @@ public: // 2. 剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符 if (i + k <= s.size()) { reverse(s.begin() + i, s.begin() + i + k ); - continue; + } else { + // 3. 剩余字符少于 k 个,则将剩余字符全部反转。 + reverse(s.begin() + i, s.end()); } - // 3. 剩余字符少于 k 个,则将剩余字符全部反转。 - reverse(s.begin() + i, s.begin() + s.size()); } return s; } From 8d3e5b46083fe83210b683aec67e471a4a00225e Mon Sep 17 00:00:00 2001 From: SevenMonths Date: Thu, 26 May 2022 13:09:05 +0800 Subject: [PATCH 0755/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0(0232.=E7=94=A8?= =?UTF-8?q?=E6=A0=88=E5=AE=9E=E7=8E=B0=E9=98=9F=E5=88=97.md)=EF=BC=9APHP?= =?UTF-8?q?=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...36\347\216\260\351\230\237\345\210\227.md" | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git "a/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" "b/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" index 1a56d9f386..6752651e2b 100644 --- "a/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" +++ "b/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" @@ -496,5 +496,49 @@ void myQueueFree(MyQueue* obj) { } ``` +PHP: +```php +// SplStack 类通过使用一个双向链表来提供栈的主要功能。[PHP 5 >= 5.3.0, PHP 7, PHP 8] +// https://www.php.net/manual/zh/class.splstack.php +class MyQueue { + // 双栈模拟队列:In栈存储数据;Out栈辅助处理 + private $stackIn; + private $stackOut; + + function __construct() { + $this->stackIn = new SplStack(); + $this->stackOut = new SplStack(); + } + + // In: 1 2 3 <= push + function push($x) { + $this->stackIn->push($x); + } + + function pop() { + $this->peek(); + return $this->stackOut->pop(); + } + + function peek() { + if($this->stackOut->isEmpty()){ + $this->shift(); + } + return $this->stackOut->top(); + } + + function empty() { + return $this->stackOut->isEmpty() && $this->stackIn->isEmpty(); + } + + // 如果Out栈为空,把In栈数据压入Out栈 + // In: 1 2 3 => pop push => 1 2 3 :Out + private function shift(){ + while(!$this->stackIn->isEmpty()){ + $this->stackOut->push($this->stackIn->pop()); + } + } +} +``` -----------------------
From 5baecc0f7919912e10ea64651ddc880f8c61f3c9 Mon Sep 17 00:00:00 2001 From: SevenMonths Date: Fri, 27 May 2022 00:59:37 +0800 Subject: [PATCH 0756/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0(0225.=E7=94=A8?= =?UTF-8?q?=E9=98=9F=E5=88=97=E5=AE=9E=E7=8E=B0=E6=A0=88.md)=EF=BC=9APHP?= =?UTF-8?q?=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...27\345\256\236\347\216\260\346\240\210.md" | 78 +++++++++++++++++++ 1 file changed, 78 insertions(+) diff --git "a/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" "b/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" index 3457c4b368..f946cd8692 100644 --- "a/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" +++ "b/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" @@ -816,5 +816,83 @@ class MyStack { } ``` +PHP +> 双对列 +```php +// SplQueue 类通过使用一个双向链表来提供队列的主要功能。(PHP 5 >= 5.3.0, PHP 7, PHP 8) +// https://www.php.net/manual/zh/class.splqueue.php +class MyStack { + public $queueMain; // 保存数据 + public $queueTmp; // 辅助作用 + + function __construct() { + $this->queueMain=new SplQueue(); + $this->queueTmp=new SplQueue(); + } + + // queueMain: 1,2,3 <= add + function push($x) { + $this->queueMain->enqueue($x); + } + + function pop() { + $qmSize = $this->queueMain->Count(); + $qmSize --; + // queueMain: 3,2,1 => pop =>2,1 => add => 2,1 :queueTmp + while($qmSize --){ + $this->queueTmp->enqueue($this->queueMain->dequeue()); + } + // queueMain: 3 + $val = $this->queueMain->dequeue(); + // queueMain <= queueTmp + $this->queueMain = $this->queueTmp; + // 清空queueTmp,下次使用 + $this->queueTmp = new SplQueue(); + return $val; + } + + function top() { + // 底层是双链表实现:从双链表的末尾查看节点 + return $this->queueMain->top(); + } + + function empty() { + return $this->queueMain->isEmpty(); + } +} +``` +> 单对列 +```php +class MyStack { + public $queue; + + function __construct() { + $this->queue=new SplQueue(); + } + + function push($x) { + $this->queue->enqueue($x); + } + + function pop() { + $qmSize = $this->queue->Count(); + $qmSize --; + //queue: 3,2,1 => pop =>2,1 => add => 2,1,3 :queue + while($qmSize --){ + $this->queue->enqueue($this->queue->dequeue()); + } + $val = $this->queue->dequeue(); + return $val; + } + + function top() { + return $this->queue->top(); + } + + function empty() { + return $this->queue->isEmpty(); + } +} +``` -----------------------
From 513ec5418910aee18a1b6722b9316ffaaeb2dec4 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Fri, 27 May 2022 12:18:24 +0800 Subject: [PATCH 0757/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880189.?= =?UTF-8?q?=E6=97=8B=E8=BD=AC=E6=95=B0=E7=BB=84.md=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...13\350\275\254\346\225\260\347\273\204.md" | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git "a/problems/0189.\346\227\213\350\275\254\346\225\260\347\273\204.md" "b/problems/0189.\346\227\213\350\275\254\346\225\260\347\273\204.md" index 3ffed87745..23092f9cb7 100644 --- "a/problems/0189.\346\227\213\350\275\254\346\225\260\347\273\204.md" +++ "b/problems/0189.\346\227\213\350\275\254\346\225\260\347\273\204.md" @@ -7,6 +7,8 @@ # 189. 旋转数组 +[力扣题目链接](https://leetcode.cn/problems/rotate-array/) + 给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。 进阶: @@ -160,6 +162,27 @@ var rotate = function (nums, k) { }; ``` +## TypeScript + +```typescript +function rotate(nums: number[], k: number): void { + const length: number = nums.length; + k %= length; + reverseByRange(nums, 0, length - 1); + reverseByRange(nums, 0, k - 1); + reverseByRange(nums, k, length - 1); +}; +function reverseByRange(nums: number[], left: number, right: number): void { + while (left < right) { + const temp = nums[left]; + nums[left] = nums[right]; + nums[right] = temp; + left++; + right--; + } +} +``` + ----------------------- From 156d8fdd92b07c6ba74ed68ee9e8cd092c106024 Mon Sep 17 00:00:00 2001 From: SevenMonths Date: Fri, 27 May 2022 14:21:41 +0800 Subject: [PATCH 0758/3019] =?UTF-8?q?=E5=A2=9E=E5=8A=A0(0020.=E6=9C=89?= =?UTF-8?q?=E6=95=88=E7=9A=84=E6=8B=AC=E5=8F=B7.md)=EF=BC=9APHP=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...10\347\232\204\346\213\254\345\217\267.md" | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git "a/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" "b/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" index 7bb7f7463a..5e468549ca 100644 --- "a/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" +++ "b/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" @@ -401,5 +401,33 @@ bool isValid(char * s){ } ``` +PHP: +```php +// https://www.php.net/manual/zh/class.splstack.php +class Solution +{ + function isValid($s){ + $stack = new SplStack(); + for ($i = 0; $i < strlen($s); $i++) { + if ($s[$i] == "(") { + $stack->push(')'); + } else if ($s[$i] == "{") { + $stack->push('}'); + } else if ($s[$i] == "[") { + $stack->push(']'); + // 2、遍历匹配过程中,发现栈内没有要匹配的字符 return false + // 3、遍历匹配过程中,栈已为空,没有匹配的字符了,说明右括号没有找到对应的左括号 return false + } else if ($stack->isEmpty() || $stack->top() != $s[$i]) { + return false; + } else {//$stack->top() == $s[$i] + $stack->pop(); + } + } + // 1、遍历完,但是栈不为空,说明有相应的括号没有被匹配,return false + return $stack->isEmpty(); + } +} +``` + -----------------------
From edbff2f4f4746b09afa2d6dd8981f000d0bc75ae Mon Sep 17 00:00:00 2001 From: SevenMonths Date: Fri, 27 May 2022 15:04:23 +0800 Subject: [PATCH 0759/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0(1047.=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E5=AD=97=E7=AC=A6=E4=B8=B2=E4=B8=AD=E7=9A=84=E6=89=80?= =?UTF-8?q?=E6=9C=89=E7=9B=B8=E9=82=BB=E9=87=8D=E5=A4=8D=E9=A1=B9.md)?= =?UTF-8?q?=EF=BC=9Aphp=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...73\351\207\215\345\244\215\351\241\271.md" | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git "a/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" "b/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" index 638c8f4ed2..6542839486 100644 --- "a/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" +++ "b/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" @@ -375,5 +375,30 @@ func removeDuplicates(_ s: String) -> String { } ``` +PHP: +```php +class Solution { + function removeDuplicates($s) { + $stack = new SplStack(); + for($i=0;$iisEmpty() || $s[$i] != $stack->top()){ + $stack->push($s[$i]); + }else{ + $stack->pop(); + } + } + + $result = ""; + while(!$stack->isEmpty()){ + $result.= $stack->top(); + $stack->pop(); + } + + // 此时字符串需要反转一下 + return strrev($result); + } +} +``` + -----------------------
From 821ca656e14384fd63e937a0cd99fbe7bde813f0 Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Fri, 27 May 2022 16:10:35 +0800 Subject: [PATCH 0760/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200654.=E6=9C=80?= =?UTF-8?q?=E5=A4=A7=E4=BA=8C=E5=8F=89=E6=A0=91.md=20Scala=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...47\344\272\214\345\217\211\346\240\221.md" | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git "a/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" "b/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" index 1c73354b00..1b0eac66d0 100644 --- "a/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" @@ -476,7 +476,33 @@ func traversal(_ nums: inout [Int], _ left: Int, _ right: Int) -> TreeNode? { } ``` +## Scala + +```scala +object Solution { + def constructMaximumBinaryTree(nums: Array[Int]): TreeNode = { + if (nums.size == 0) return null + // 找到数组最大值 + var maxIndex = 0 + var maxValue = Int.MinValue + for (i <- nums.indices) { + if (nums(i) > maxValue) { + maxIndex = i + maxValue = nums(i) + } + } + + // 构建一棵树 + var root = new TreeNode(maxValue, null, null) + + // 递归寻找左右子树 + root.left = constructMaximumBinaryTree(nums.slice(0, maxIndex)) + root.right = constructMaximumBinaryTree(nums.slice(maxIndex + 1, nums.length)) + root // 返回root + } +} +``` -----------------------
From de34170f5cc1526eb0c4b1860943a57e6f41c4e1 Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Fri, 27 May 2022 16:37:53 +0800 Subject: [PATCH 0761/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200617.=E5=90=88?= =?UTF-8?q?=E5=B9=B6=E4=BA=8C=E5=8F=89=E6=A0=91.md=20Scala=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...66\344\272\214\345\217\211\346\240\221.md" | 53 +++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git "a/problems/0617.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md" "b/problems/0617.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md" index 55786ea988..d8bdc91c7f 100644 --- "a/problems/0617.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0617.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md" @@ -631,7 +631,60 @@ function mergeTrees(root1: TreeNode | null, root2: TreeNode | null): TreeNode | }; ``` +## Scala + +递归: +```scala +object Solution { + def mergeTrees(root1: TreeNode, root2: TreeNode): TreeNode = { + if (root1 == null) return root2 // 如果root1为空,返回root2 + if (root2 == null) return root1 // 如果root2为空,返回root1 + // 新建一个节点,值为两个节点的和 + var node = new TreeNode(root1.value + root2.value) + // 往下递归 + node.left = mergeTrees(root1.left, root2.left) + node.right = mergeTrees(root1.right, root2.right) + node // 返回node,return关键字可以省略 + } +} +``` +迭代: +```scala +object Solution { + import scala.collection.mutable + def mergeTrees(root1: TreeNode, root2: TreeNode): TreeNode = { + if (root1 == null) return root2 + if (root2 == null) return root1 + var stack = mutable.Stack[TreeNode]() + // 先放node2再放node1 + stack.push(root2) + stack.push(root1) + while (!stack.isEmpty) { + var node1 = stack.pop() + var node2 = stack.pop() + node1.value += node2.value + if (node1.right != null && node2.right != null) { + stack.push(node2.right) + stack.push(node1.right) + } else { + if(node1.right == null){ + node1.right = node2.right + } + } + if (node1.left != null && node2.left != null) { + stack.push(node2.left) + stack.push(node1.left) + } else { + if(node1.left == null){ + node1.left = node2.left + } + } + } + root1 + } +} +``` ----------------------- From 9412e2e40529db526bbb16de1f3a9c45cf2c3949 Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Fri, 27 May 2022 17:01:56 +0800 Subject: [PATCH 0762/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200700.=E4=BA=8C?= =?UTF-8?q?=E5=8F=89=E6=90=9C=E7=B4=A2=E6=A0=91=E4=B8=AD=E7=9A=84=E6=90=9C?= =?UTF-8?q?=E7=B4=A2.md=20Scala=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...55\347\232\204\346\220\234\347\264\242.md" | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git "a/problems/0700.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\220\234\347\264\242.md" "b/problems/0700.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\220\234\347\264\242.md" index 40cf4ea1fc..16ddef9bc9 100644 --- "a/problems/0700.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\220\234\347\264\242.md" +++ "b/problems/0700.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\220\234\347\264\242.md" @@ -363,7 +363,34 @@ function searchBST(root: TreeNode | null, val: number): TreeNode | null { }; ``` +## Scala + +递归: +```scala +object Solution { + def searchBST(root: TreeNode, value: Int): TreeNode = { + if (root == null || value == root.value) return root + // 相当于三元表达式,在Scala中if...else有返回值 + if (value < root.value) searchBST(root.left, value) else searchBST(root.right, value) + } +} +``` +迭代: +```scala +object Solution { + def searchBST(root: TreeNode, value: Int): TreeNode = { + // 因为root是不可变量,所以需要赋值给一个可变量 + var node = root + while (node != null) { + if (value < node.value) node = node.left + else if (value > node.value) node = node.right + else return node + } + null // 没有返回就返回空 + } +} +``` -----------------------
From d4a4eda4b8396603a70871ff215b48b2d17eef93 Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Fri, 27 May 2022 17:29:44 +0800 Subject: [PATCH 0763/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200098.=E9=AA=8C?= =?UTF-8?q?=E8=AF=81=E4=BA=8C=E5=8F=89=E6=90=9C=E7=B4=A2=E6=A0=91.md=20Sca?= =?UTF-8?q?la=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...11\346\220\234\347\264\242\346\240\221.md" | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git "a/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" index a8f3c32402..06f1b8d15f 100644 --- "a/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" +++ "b/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" @@ -589,7 +589,50 @@ function isValidBST(root: TreeNode | null): boolean { }; ``` +## Scala + +辅助数组解决: +```scala +object Solution { + import scala.collection.mutable + def isValidBST(root: TreeNode): Boolean = { + var arr = new mutable.ArrayBuffer[Int]() + // 递归中序遍历二叉树,将节点添加到arr + def traversal(node: TreeNode): Unit = { + if (node == null) return + traversal(node.left) + arr.append(node.value) + traversal(node.right) + } + traversal(root) + // 这个数组如果是升序就代表是二叉搜索树 + for (i <- 1 until arr.size) { + if (arr(i) <= arr(i - 1)) return false + } + true + } +} +``` +递归中解决: +```scala +object Solution { + def isValidBST(root: TreeNode): Boolean = { + var flag = true + var preValue:Long = Long.MinValue // 这里要使用Long类型 + + def traversal(node: TreeNode): Unit = { + if (node == null || flag == false) return + traversal(node.left) + if (node.value > preValue) preValue = node.value + else flag = false + traversal(node.right) + } + traversal(root) + flag + } +} +``` -----------------------
From 4e95d663a047d1745c57b3f46cba055836e8ec13 Mon Sep 17 00:00:00 2001 From: damon <245211612@qq.com> Date: Fri, 27 May 2022 22:52:57 +0800 Subject: [PATCH 0764/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880509.?= =?UTF-8?q?=E6=96=90=E6=B3=A2=E9=82=A3=E5=A5=91=E6=95=B0.md=EF=BC=89?= =?UTF-8?q?=EF=BC=9A=E5=A2=9E=E5=8A=A0javascript=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E7=A9=BA=E9=97=B4=E5=A4=8D=E6=9D=82=E5=BA=A6?= =?UTF-8?q?=E5=88=B0O(1)=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...242\351\202\243\345\245\221\346\225\260.md" | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git "a/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" "b/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" index 1d17784d43..7c899195c8 100644 --- "a/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" +++ "b/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" @@ -234,6 +234,7 @@ func fib(n int) int { } ``` ### Javascript +解法一 ```Javascript var fib = function(n) { let dp = [0, 1] @@ -244,6 +245,23 @@ var fib = function(n) { return dp[n] }; ``` +解法二:时间复杂度O(N),空间复杂度O(1) +```Javascript +var fib = function(n) { + // 动规状态转移中,当前结果只依赖前两个元素的结果,所以只要两个变量代替dp数组记录状态过程。将空间复杂度降到O(1) + let pre1 = 1 + let pre2 = 0 + let temp + if (n === 0) return 0 + if (n === 1) return 1 + for(let i = 2; i <= n; i++) { + temp = pre1 + pre1 = pre1 + pre2 + pre2 = temp + } + return pre1 +}; +``` TypeScript From 992909385fd8bc0181a76bf3fa65eb10f9885190 Mon Sep 17 00:00:00 2001 From: damon <245211612@qq.com> Date: Fri, 27 May 2022 22:52:57 +0800 Subject: [PATCH 0765/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880509.?= =?UTF-8?q?=E6=96=90=E6=B3=A2=E9=82=A3=E5=A5=91=E6=95=B0.md=EF=BC=89?= =?UTF-8?q?=EF=BC=9A=E5=A2=9E=E5=8A=A0javascript=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E7=A9=BA=E9=97=B4=E5=A4=8D=E6=9D=82=E5=BA=A6?= =?UTF-8?q?=E5=88=B0O(1)=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...242\351\202\243\345\245\221\346\225\260.md" | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git "a/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" "b/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" index 1d17784d43..7c899195c8 100644 --- "a/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" +++ "b/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" @@ -234,6 +234,7 @@ func fib(n int) int { } ``` ### Javascript +解法一 ```Javascript var fib = function(n) { let dp = [0, 1] @@ -244,6 +245,23 @@ var fib = function(n) { return dp[n] }; ``` +解法二:时间复杂度O(N),空间复杂度O(1) +```Javascript +var fib = function(n) { + // 动规状态转移中,当前结果只依赖前两个元素的结果,所以只要两个变量代替dp数组记录状态过程。将空间复杂度降到O(1) + let pre1 = 1 + let pre2 = 0 + let temp + if (n === 0) return 0 + if (n === 1) return 1 + for(let i = 2; i <= n; i++) { + temp = pre1 + pre1 = pre1 + pre2 + pre2 = temp + } + return pre1 +}; +``` TypeScript From a9f830267bdcd9a5bc6ec19dfbc1b4436fa41a1e Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Sat, 28 May 2022 11:12:53 +0800 Subject: [PATCH 0766/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880724.?= =?UTF-8?q?=E5=AF=BB=E6=89=BE=E6=95=B0=E7=BB=84=E7=9A=84=E4=B8=AD=E5=BF=83?= =?UTF-8?q?=E7=B4=A2=E5=BC=95.md=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typesc?= =?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 --- ...255\345\277\203\347\264\242\345\274\225.md" | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git "a/problems/0724.\345\257\273\346\211\276\346\225\260\347\273\204\347\232\204\344\270\255\345\277\203\347\264\242\345\274\225.md" "b/problems/0724.\345\257\273\346\211\276\346\225\260\347\273\204\347\232\204\344\270\255\345\277\203\347\264\242\345\274\225.md" index 14dcd2c08a..0052e5d462 100644 --- "a/problems/0724.\345\257\273\346\211\276\346\225\260\347\273\204\347\232\204\344\270\255\345\277\203\347\264\242\345\274\225.md" +++ "b/problems/0724.\345\257\273\346\211\276\346\225\260\347\273\204\347\232\204\344\270\255\345\277\203\347\264\242\345\274\225.md" @@ -140,6 +140,24 @@ var pivotIndex = function(nums) { }; ``` +### TypeScript + +```typescript +function pivotIndex(nums: number[]): number { + const length: number = nums.length; + const sum: number = nums.reduce((a, b) => a + b); + let leftSum: number = 0; + for (let i = 0; i < length; i++) { + const rightSum: number = sum - leftSum - nums[i]; + if (leftSum === rightSum) return i; + leftSum += nums[i]; + } + return -1; +}; +``` + + + -----------------------
From 6f46d91676693a83c0620e49bfdf9b9a252d87a0 Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Sat, 28 May 2022 13:55:52 +0800 Subject: [PATCH 0767/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200530.=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=B7=AE.md=20Scala=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...17\347\273\235\345\257\271\345\267\256.md" | 77 +++++++++++++++++++ 1 file changed, 77 insertions(+) diff --git "a/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" "b/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" index 77699c9f4e..d7db85ae02 100644 --- "a/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" +++ "b/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" @@ -431,7 +431,84 @@ function getMinimumDifference(root: TreeNode | null): number { }; ``` +## Scala + +构建二叉树的有序数组: + +```scala +object Solution { + import scala.collection.mutable + def getMinimumDifference(root: TreeNode): Int = { + val arr = mutable.ArrayBuffer[Int]() + def traversal(node: TreeNode): Unit = { + if (node == null) return + traversal(node.left) + arr.append(node.value) + traversal(node.right) + } + traversal(root) + // 在有序数组上求最小差值 + var result = Int.MaxValue + for (i <- 1 until arr.size) { + result = math.min(result, arr(i) - arr(i - 1)) + } + result // 返回最小差值 + } +} +``` +递归记录前一个节点: + +```scala +object Solution { + def getMinimumDifference(root: TreeNode): Int = { + var result = Int.MaxValue // 初始化为最大值 + var pre: TreeNode = null // 记录前一个节点 + + def traversal(cur: TreeNode): Unit = { + if (cur == null) return + traversal(cur.left) + if (pre != null) { + // 对比result与节点之间的差值 + result = math.min(result, cur.value - pre.value) + } + pre = cur + traversal(cur.right) + } + + traversal(root) + result // return关键字可以省略 + } +} +``` + +迭代解决: + +```scala +object Solution { + import scala.collection.mutable + def getMinimumDifference(root: TreeNode): Int = { + var result = Int.MaxValue // 初始化为最大值 + var pre: TreeNode = null // 记录前一个节点 + var cur = root + var stack = mutable.Stack[TreeNode]() + 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.value - pre.value) + } + pre = cur + cur = cur.right + } + } + result // return关键字可以省略 + } +} +``` -----------------------
From 779adf74cb1ec9b1f8b17db3cbf3d8fc3b88392f Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Sat, 28 May 2022 14:53:40 +0800 Subject: [PATCH 0768/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200501.=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=20Scala=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...55\347\232\204\344\274\227\346\225\260.md" | 71 ++++++++++++++++++- 1 file changed, 70 insertions(+), 1 deletion(-) diff --git "a/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" "b/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" index 9cb5d0713a..c08f68d951 100644 --- "a/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" +++ "b/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" @@ -9,7 +9,7 @@ # 501.二叉搜索树中的众数 -[力扣题目链接](https://leetcode-cn.com/problems/find-mode-in-binary-search-tree/solution/) +[力扣题目链接](https://leetcode.cn/problems/find-mode-in-binary-search-tree/) 给定一个有相同值的二叉搜索树(BST),找出 BST 中的所有众数(出现频率最高的元素)。 @@ -798,7 +798,76 @@ function findMode(root: TreeNode | null): number[] { }; ``` +## Scala + +暴力: +```scala +object Solution { + // 导包 + import scala.collection.mutable // 集合包 + import scala.util.control.Breaks.{break, breakable} // 流程控制包 + def findMode(root: TreeNode): Array[Int] = { + var map = mutable.HashMap[Int, Int]() // 存储节点的值,和该值出现的次数 + def searchBST(curNode: TreeNode): Unit = { + if (curNode == null) return + var value = map.getOrElse(curNode.value, 0) + map.put(curNode.value, value + 1) + searchBST(curNode.left) + searchBST(curNode.right) + } + searchBST(root) // 前序遍历把每个节点的值加入到里面 + // 将map转换为list,随后根据元组的第二个值进行排序 + val list = map.toList.sortWith((map1, map2) => { + if (map1._2 > map2._2) true else false + }) + var res = mutable.ArrayBuffer[Int]() + res.append(list(0)._1) // 将第一个加入结果集 + breakable { + for (i <- 1 until list.size) { + // 如果值相同就加入结果集合,反之break + if (list(i)._2 == list(0)._2) res.append(list(i)._1) + else break + } + } + res.toArray // 最终返回res的Array格式,return关键字可以省略 + } +} +``` +递归(利用二叉搜索树的性质): +```scala +object Solution { + import scala.collection.mutable + def findMode(root: TreeNode): Array[Int] = { + var maxCount = 0 // 最大频率 + var count = 0 // 统计频率 + var pre: TreeNode = null + var result = mutable.ArrayBuffer[Int]() + + def searchBST(cur: TreeNode): Unit = { + if (cur == null) return + searchBST(cur.left) + if (pre == null) count = 1 // 等于空置为1 + else if (pre.value == cur.value) count += 1 // 与上一个节点的值相同加1 + else count = 1 // 与上一个节点的值不同 + pre = cur + + // 如果和最大值相同,则放入结果集 + if (count == maxCount) result.append(cur.value) + + // 如果当前计数大于最大值频率,更新最大值,清空结果集 + if (count > maxCount) { + maxCount = count + result.clear() + result.append(cur.value) + } + searchBST(cur.right) + } + searchBST(root) + result.toArray // return关键字可以省略 + } +} +``` ----------------------- From 95cc2b965807a6493fe64eb23d6bbfa66587f0fa Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Sun, 29 May 2022 10:18:40 +0800 Subject: [PATCH 0769/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=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=20Scala=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...254\345\205\261\347\245\226\345\205\210.md" | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git "a/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" "b/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" index 69a6d0d6a7..a99180c30b 100644 --- "a/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" +++ "b/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" @@ -343,7 +343,25 @@ function lowestCommonAncestor(root: TreeNode | null, p: TreeNode | null, q: Tree }; ``` +## Scala + +```scala +object Solution { + def lowestCommonAncestor(root: TreeNode, p: TreeNode, q: TreeNode): TreeNode = { + // 递归结束条件 + if (root == null || root == p || root == q) { + return root + } + + var left = lowestCommonAncestor(root.left, p, q) + var right = lowestCommonAncestor(root.right, p, q) + if (left != null && right != null) return root + if (left == null) return right + left + } +} +``` -----------------------
From 78930cdd0970c0850db6aa7c90ced0510fd6b1ec Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Sun, 29 May 2022 10:32:47 +0800 Subject: [PATCH 0770/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=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=20Scala=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...54\345\205\261\347\245\226\345\205\210.md" | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git "a/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" "b/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" index f7f1427aad..a0f3099926 100644 --- "a/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" +++ "b/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" @@ -381,7 +381,36 @@ function lowestCommonAncestor(root: TreeNode | null, p: TreeNode | null, q: Tree }; ``` +## Scala + +递归: + +```scala +object Solution { + def lowestCommonAncestor(root: TreeNode, p: TreeNode, q: TreeNode): TreeNode = { + // scala中每个关键字都有其返回值,于是可以不写return + if (root.value > p.value && root.value > q.value) lowestCommonAncestor(root.left, p, q) + else if (root.value < p.value && root.value < q.value) lowestCommonAncestor(root.right, p, q) + else root + } +} +``` + +迭代: +```scala +object Solution { + def lowestCommonAncestor(root: TreeNode, p: TreeNode, q: TreeNode): TreeNode = { + var curNode = root // 因为root是不可变量,所以要赋值给curNode一个可变量 + while(curNode != null){ + if(curNode.value > p.value && curNode.value > q.value) curNode = curNode.left + else if(curNode.value < p.value && curNode.value < q.value) curNode = curNode.right + else return curNode + } + null + } +} +``` ----------------------- From 45a01eed32598a6cf4c9a20d995aa46efe296dd5 Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Sun, 29 May 2022 13:04:37 +0800 Subject: [PATCH 0771/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200701.=E4=BA=8C?= =?UTF-8?q?=E5=8F=89=E6=90=9C=E7=B4=A2=E6=A0=91=E4=B8=AD=E7=9A=84=E6=8F=92?= =?UTF-8?q?=E5=85=A5=E6=93=8D=E4=BD=9C.md=20Scala=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...22\345\205\245\346\223\215\344\275\234.md" | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git "a/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" "b/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" index 50e39ade5e..135911b919 100644 --- "a/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" +++ "b/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" @@ -585,6 +585,43 @@ function insertIntoBST(root: TreeNode | null, val: number): TreeNode | null { ``` +## Scala + +递归: + +```scala +object Solution { + def insertIntoBST(root: TreeNode, `val`: Int): TreeNode = { + if (root == null) return new TreeNode(`val`) + if (`val` < root.value) root.left = insertIntoBST(root.left, `val`) + else root.right = insertIntoBST(root.right, `val`) + root // 返回根节点 + } +} +``` + +迭代: + +```scala +object Solution { + def insertIntoBST(root: TreeNode, `val`: Int): TreeNode = { + if (root == null) { + return new TreeNode(`val`) + } + var parent = root // 记录当前节点的父节点 + var curNode = root + while (curNode != null) { + parent = curNode + if(`val` < curNode.value) curNode = curNode.left + else curNode = curNode.right + } + if(`val` < parent.value) parent.left = new TreeNode(`val`) + else parent.right = new TreeNode(`val`) + root // 最终返回根节点 + } +} +``` + -----------------------
From cc72b164cf7780f3dc4e119d30033dd0708eddd5 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Sun, 29 May 2022 22:48:13 +0800 Subject: [PATCH 0772/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880034.?= =?UTF-8?q?=E5=9C=A8=E6=8E=92=E5=BA=8F=E6=95=B0=E7=BB=84=E4=B8=AD=E6=9F=A5?= =?UTF-8?q?=E6=89=BE=E5=85=83=E7=B4=A0=E7=9A=84=E7=AC=AC=E4=B8=80=E4=B8=AA?= =?UTF-8?q?=E5=92=8C=E6=9C=80=E5=90=8E=E4=B8=80=E4=B8=AA=E4=BD=8D=E7=BD=AE?= =?UTF-8?q?.md=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...00\344\270\252\344\275\215\347\275\256.md" | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git "a/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" "b/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" index dfd90b8280..25db008349 100644 --- "a/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" +++ "b/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" @@ -481,6 +481,61 @@ var searchRange = function(nums, target) { }; ``` +### TypeScript + +```typescript +function searchRange(nums: number[], target: number): number[] { + const leftBoard: number = getLeftBorder(nums, target); + const rightBoard: number = getRightBorder(nums, target); + // target 在nums区间左侧或右侧 + if (leftBoard === (nums.length - 1) || rightBoard === 0) return [-1, -1]; + // target 不存在与nums范围内 + if (rightBoard - leftBoard <= 1) return [-1, -1]; + // target 存在于nums范围内 + return [leftBoard + 1, rightBoard - 1]; +}; +// 查找第一个大于target的元素下标 +function getRightBorder(nums: number[], target: number): number { + let left: number = 0, + right: number = nums.length - 1; + // 0表示target在nums区间的左边 + let rightBoard: number = 0; + while (left <= right) { + let mid = Math.floor((left + right) / 2); + if (nums[mid] <= target) { + // 右边界一定在mid右边(不含mid) + left = mid + 1; + rightBoard = left; + } else { + // 右边界在mid左边(含mid) + right = mid - 1; + } + } + return rightBoard; +} +// 查找第一个小于target的元素下标 +function getLeftBorder(nums: number[], target: number): number { + let left: number = 0, + right: number = nums.length - 1; + // length-1表示target在nums区间的右边 + let leftBoard: number = nums.length - 1; + while (left <= right) { + let mid = Math.floor((left + right) / 2); + if (nums[mid] >= target) { + // 左边界一定在mid左边(不含mid) + right = mid - 1; + leftBoard = right; + } else { + // 左边界在mid右边(含mid) + left = mid + 1; + } + } + return leftBoard; +} +``` + + + -----------------------
From 8eb956b553b178d3d14555c270f8b726baea5870 Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Mon, 30 May 2022 10:29:31 +0800 Subject: [PATCH 0773/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200450.=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.md=20Scala=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...55\347\232\204\350\212\202\347\202\271.md" | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git "a/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" "b/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" index e8f7e54c4b..8367a14543 100644 --- "a/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" +++ "b/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" @@ -582,7 +582,35 @@ function deleteNode(root: TreeNode | null, key: number): TreeNode | null { }; ``` +## Scala + +```scala +object Solution { + def deleteNode(root: TreeNode, key: Int): TreeNode = { + if (root == null) return root // 第一种情况,没找到删除的节点,遍历到空节点直接返回 + if (root.value == key) { + // 第二种情况: 左右孩子都为空,直接删除节点,返回null + if (root.left == null && root.right == null) return null + // 第三种情况: 左孩子为空,右孩子不为空,右孩子补位 + else if (root.left == null && root.right != null) return root.right + // 第四种情况: 左孩子不为空,右孩子为空,左孩子补位 + else if (root.left != null && root.right == null) return root.left + // 第五种情况: 左右孩子都不为空,将删除节点的左子树头节点(左孩子)放到 + // 右子树的最左边节点的左孩子上,返回删除节点的右孩子 + else { + var tmp = root.right + while (tmp.left != null) tmp = tmp.left + tmp.left = root.left + return root.right + } + } + if (root.value > key) root.left = deleteNode(root.left, key) + if (root.value < key) root.right = deleteNode(root.right, key) + root // 返回根节点,return关键字可以省略 + } +} +``` -----------------------
From df2ff8cc2e77261a0360ac848949c233f3c6258a Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Mon, 30 May 2022 10:50:51 +0800 Subject: [PATCH 0774/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200669.=E4=BF=AE?= =?UTF-8?q?=E5=89=AA=E4=BA=8C=E5=8F=89=E6=90=9C=E7=B4=A2=E6=A0=91.md=20Sca?= =?UTF-8?q?la=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...7\211\346\220\234\347\264\242\346\240\221.md" | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git "a/problems/0669.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0669.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" index 385b226863..988bff30d6 100644 --- "a/problems/0669.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" +++ "b/problems/0669.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" @@ -453,7 +453,21 @@ function trimBST(root: TreeNode | null, low: number, high: number): TreeNode | n }; ``` - +## Scala + +递归法: +```scala +object Solution { + def trimBST(root: TreeNode, low: Int, high: Int): TreeNode = { + if (root == null) return null + if (root.value < low) return trimBST(root.right, low, high) + if (root.value > high) return trimBST(root.left, low, high) + root.left = trimBST(root.left, low, high) + root.right = trimBST(root.right, low, high) + root + } +} +``` ----------------------- From 43d450d8271b6af68d209bda8f22ed71838418f1 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Mon, 30 May 2022 11:20:33 +0800 Subject: [PATCH 0775/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880922.?= =?UTF-8?q?=E6=8C=89=E5=A5=87=E5=81=B6=E6=8E=92=E5=BA=8F=E6=95=B0=E7=BB=84?= =?UTF-8?q?II.md=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\345\272\217\346\225\260\347\273\204II.md" | 69 +++++++++++++++++++ 1 file changed, 69 insertions(+) diff --git "a/problems/0922.\346\214\211\345\245\207\345\201\266\346\216\222\345\272\217\346\225\260\347\273\204II.md" "b/problems/0922.\346\214\211\345\245\207\345\201\266\346\216\222\345\272\217\346\225\260\347\273\204II.md" index cb564fb683..cb8cec73ac 100644 --- "a/problems/0922.\346\214\211\345\245\207\345\201\266\346\216\222\345\272\217\346\225\260\347\273\204II.md" +++ "b/problems/0922.\346\214\211\345\245\207\345\201\266\346\216\222\345\272\217\346\225\260\347\273\204II.md" @@ -260,6 +260,75 @@ var sortArrayByParityII = function(nums) { }; ``` +### TypeScript + +> 方法一: + +```typescript +function sortArrayByParityII(nums: number[]): number[] { + const evenArr: number[] = [], + oddArr: number[] = []; + for (let num of nums) { + if (num % 2 === 0) { + evenArr.push(num); + } else { + oddArr.push(num); + } + } + const resArr: number[] = []; + for (let i = 0, length = nums.length / 2; i < length; i++) { + resArr.push(evenArr[i]); + resArr.push(oddArr[i]); + } + return resArr; +}; +``` + +> 方法二: + +```typescript +function sortArrayByParityII(nums: number[]): number[] { + const length: number = nums.length; + const resArr: number[] = []; + let evenIndex: number = 0, + oddIndex: number = 1; + for (let i = 0; i < length; i++) { + if (nums[i] % 2 === 0) { + resArr[evenIndex] = nums[i]; + evenIndex += 2; + } else { + resArr[oddIndex] = nums[i]; + oddIndex += 2; + } + } + return resArr; +}; +``` + +> 方法三: + +```typescript +function sortArrayByParityII(nums: number[]): number[] { + const length: number = nums.length; + let oddIndex: number = 1; + for (let evenIndex = 0; evenIndex < length; evenIndex += 2) { + if (nums[evenIndex] % 2 === 1) { + // 在偶数位遇到了奇数 + while (oddIndex < length && nums[oddIndex] % 2 === 1) { + oddIndex += 2; + } + // 在奇数位遇到了偶数,交换 + let temp = nums[evenIndex]; + nums[evenIndex] = nums[oddIndex]; + nums[oddIndex] = temp; + } + } + return nums; +}; +``` + + + -----------------------
From 3e885d3aff0b2c826fe522d7eb5d2cd039b62f13 Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Mon, 30 May 2022 11:25:52 +0800 Subject: [PATCH 0776/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200108.=E5=B0=86?= =?UTF-8?q?=E6=9C=89=E5=BA=8F=E6=95=B0=E7=BB=84=E8=BD=AC=E6=8D=A2=E4=B8=BA?= =?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=90=9C=E7=B4=A2=E6=A0=91.md=20Scala?= =?UTF-8?q?=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...11\346\220\234\347\264\242\346\240\221.md" | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git "a/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" index 6ee3947bec..493118a6aa 100644 --- "a/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" +++ "b/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" @@ -448,5 +448,27 @@ struct TreeNode* sortedArrayToBST(int* nums, int numsSize) { } ``` +## Scala + +递归: + +```scala +object Solution { + def sortedArrayToBST(nums: Array[Int]): TreeNode = { + def buildTree(left: Int, right: Int): TreeNode = { + if (left > right) return null // 当left大于right的时候,返回空 + // 最中间的节点是当前节点 + var mid = left + (right - left) / 2 + var curNode = new TreeNode(nums(mid)) + curNode.left = buildTree(left, mid - 1) + curNode.right = buildTree(mid + 1, right) + curNode + } + buildTree(0, nums.size - 1) + } +} +``` + + -----------------------
From d4b5abfe9bc2f32f99c92a1d3794b58d78c69141 Mon Sep 17 00:00:00 2001 From: Ezralin <10881430+ezralin@user.noreply.gitee.com> Date: Tue, 31 May 2022 08:41:53 +0800 Subject: [PATCH 0777/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A00704.=E4=BA=8C?= =?UTF-8?q?=E5=88=86=E6=9F=A5=E6=89=BE.md=20Kotlin=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...14\345\210\206\346\237\245\346\211\276.md" | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git "a/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" "b/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" index 5562513089..3dcbd17519 100644 --- "a/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" +++ "b/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" @@ -611,6 +611,36 @@ public class Solution{ } ``` +**Kotlin:** +```kotlin +class Solution { + fun search(nums: IntArray, target: Int): Int { + // leftBorder + var left:Int = 0 + // rightBorder + var right:Int = nums.size - 1 + // 使用左闭右闭区间 + while (left <= right) { + var middle:Int = left + (right - left)/2 + // taget 在左边 + if (nums[middle] > target) { + right = middle - 1 + } + else { + // target 在右边 + if (nums[middle] < target) { + left = middle + 1 + } + // 找到了,返回 + else return middle + } + } + // 没找到,返回 + return -1 + } +} +``` + -----------------------
From ab5b82969f30b767f2815883272f4b3a49ad0c82 Mon Sep 17 00:00:00 2001 From: SevenMonths Date: Tue, 31 May 2022 15:56:00 +0800 Subject: [PATCH 0778/3019] =?UTF-8?q?=E6=96=B0=E5=A2=9E(0150.=E9=80=86?= =?UTF-8?q?=E6=B3=A2=E5=85=B0=E8=A1=A8=E8=BE=BE=E5=BC=8F=E6=B1=82=E5=80=BC?= =?UTF-8?q?.md)=EF=BC=9Aphp=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...76\345\274\217\346\261\202\345\200\274.md" | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git "a/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" "b/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" index fd3d69aa33..7e142ba3c6 100644 --- "a/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" +++ "b/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" @@ -326,5 +326,29 @@ func evalRPN(_ tokens: [String]) -> Int { } ``` +PHP: +```php +class Solution { + function evalRPN($tokens) { + $st = new SplStack(); + for($i = 0;$ipush($tokens[$i]); + }else{ + // 是符号进行运算 + $num1 = $st->pop(); + $num2 = $st->pop(); + if ($tokens[$i] == "+") $st->push($num2 + $num1); + if ($tokens[$i] == "-") $st->push($num2 - $num1); + if ($tokens[$i] == "*") $st->push($num2 * $num1); + // 注意处理小数部分 + if ($tokens[$i] == "/") $st->push(intval($num2 / $num1)); + } + } + return $st->pop(); + } +} +``` -----------------------
From ca18b7d1f5c31a91c262ec4a1cf0b93cc00b3cf1 Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Tue, 31 May 2022 22:13:58 +0800 Subject: [PATCH 0779/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200538.=E6=8A=8A?= =?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=90=9C=E7=B4=A2=E6=A0=91=E8=BD=AC=E6=8D=A2?= =?UTF-8?q?=E4=B8=BA=E7=B4=AF=E5=8A=A0=E6=A0=91.md=20Scala=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...272\347\264\257\345\212\240\346\240\221.md" | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git "a/problems/0538.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md" "b/problems/0538.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md" index 37eb7d0f2c..136377843d 100644 --- "a/problems/0538.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md" +++ "b/problems/0538.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md" @@ -352,6 +352,24 @@ function convertBST(root: TreeNode | null): TreeNode | null { }; ``` +## Scala + +```scala +object Solution { + def convertBST(root: TreeNode): TreeNode = { + var sum = 0 + def convert(node: TreeNode): Unit = { + if (node == null) return + convert(node.right) + sum += node.value + node.value = sum + convert(node.left) + } + convert(root) + root + } +} +``` ----------------------- From 752cfda89351cc2d54897a6309a181f197cc6c50 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=A1=9C=E5=B0=8F=E8=B7=AF=E4=B8=83=E8=91=89?= <20304773@qq.com> Date: Tue, 31 May 2022 23:46:41 +0800 Subject: [PATCH 0780/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880027.?= =?UTF-8?q?=E7=A7=BB=E9=99=A4=E5=85=83=E7=B4=A0.md=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20C#=20=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...47\273\351\231\244\345\205\203\347\264\240.md" | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git "a/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" "b/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" index 3a93ac8820..5e7742ee26 100644 --- "a/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" +++ "b/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" @@ -329,5 +329,20 @@ int removeElement(int* nums, int numsSize, int val){ } ``` +C#: +```csharp +public class Solution { + public int RemoveElement(int[] nums, int val) { + int slow = 0; + for (int fast = 0; fast < nums.Length; fast++) { + if (val != nums[fast]) { + nums[slow++] = nums[fast]; + } + } + return slow; + } +} +``` + -----------------------
From 0281b82d48a4f21429d35a89270843357f801c15 Mon Sep 17 00:00:00 2001 From: SevenMonths Date: Mon, 16 May 2022 15:26:21 +0800 Subject: [PATCH 0781/3019] =?UTF-8?q?=E5=A2=9E=E5=8A=A0php=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...54\345\255\227\347\254\246\344\270\262.md" | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git "a/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" "b/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" index fec83e1d5a..8781ffb4f6 100644 --- "a/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" @@ -290,6 +290,25 @@ func reverseString(_ s: inout [Character], startIndex: Int, endIndex: Int) { } ``` +### PHP + +```php +function reverseLeftWords($s, $n) { + $this->reverse($s,0,$n-1); //反转区间为前n的子串 + $this->reverse($s,$n,strlen($s)-1); //反转区间为n到末尾的子串 + $this->reverse($s,0,strlen($s)-1); //反转整个字符串 + return $s; +} + +// 按指定进行翻转 【array、string都可】 +function reverse(&$s, $start, $end) { + for ($i = $start, $j = $end; $i < $j; $i++, $j--) { + $tmp = $s[$i]; + $s[$i] = $s[$j]; + $s[$j] = $tmp; + } +} +``` From f51d72b71baf6698d2078dd9b2ce5432aa7cfe41 Mon Sep 17 00:00:00 2001 From: SevenMonths Date: Wed, 1 Jun 2022 18:45:16 +0800 Subject: [PATCH 0782/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0(0239.=E6=BB=91?= =?UTF-8?q?=E5=8A=A8=E7=AA=97=E5=8F=A3=E6=9C=80=E5=A4=A7=E5=80=BC.md)?= =?UTF-8?q?=EF=BC=9APHP=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...43\346\234\200\345\244\247\345\200\274.md" | 77 +++++++++++++++++++ 1 file changed, 77 insertions(+) diff --git "a/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" "b/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" index f269450f3b..227ab71cca 100644 --- "a/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" +++ "b/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" @@ -631,5 +631,82 @@ func maxSlidingWindow(_ nums: [Int], _ k: Int) -> [Int] { } ``` +PHP: +```php +class Solution { + /** + * @param Integer[] $nums + * @param Integer $k + * @return Integer[] + */ + function maxSlidingWindow($nums, $k) { + $myQueue = new MyQueue(); + // 先将前k的元素放进队列 + for ($i = 0; $i < $k; $i++) { + $myQueue->push($nums[$i]); + } + + $result = []; + $result[] = $myQueue->max(); // result 记录前k的元素的最大值 + + for ($i = $k; $i < count($nums); $i++) { + $myQueue->pop($nums[$i - $k]); // 滑动窗口移除最前面元素 + $myQueue->push($nums[$i]); // 滑动窗口前加入最后面的元素 + $result[]= $myQueue->max(); // 记录对应的最大值 + } + return $result; + } + +} + +// 单调对列构建 +class MyQueue{ + private $queue; + + public function __construct(){ + $this->queue = new SplQueue(); //底层是双向链表实现。 + } + + public function pop($v){ + // 判断当前对列是否为空 + // 比较当前要弹出的数值是否等于队列出口元素的数值,如果相等则弹出。 + // bottom 从链表前端查看元素, dequeue 从双向链表的开头移动一个节点 + if(!$this->queue->isEmpty() && $v == $this->queue->bottom()){ + $this->queue->dequeue(); //弹出队列 + } + } + + public function push($v){ + // 判断当前对列是否为空 + // 如果push的数值大于入口元素的数值,那么就将队列后端的数值弹出,直到push的数值小于等于队列入口元素的数值为止。 + // 这样就保持了队列里的数值是单调从大到小的了。 + while (!$this->queue->isEmpty() && $v > $this->queue->top()) { + $this->queue->pop(); // pop从链表末尾弹出一个元素, + } + $this->queue->enqueue($v); + } + + // 查询当前队列里的最大值 直接返回队首 + public function max(){ + // bottom 从链表前端查看元素, top从链表末尾查看元素 + return $this->queue->bottom(); + } + + // 辅助理解: 打印队列元素 + public function println(){ + // "迭代器移动到链表头部": 可理解为从头遍历链表元素做准备。 + // 【PHP中没有指针概念,所以就没说指针。从数据结构上理解,就是把指针指向链表头部】 + $this->queue->rewind(); + + echo "Println: "; + while($this->queue->valid()){ + echo $this->queue->current()," -> "; + $this->queue->next(); + } + echo "\n"; + } +} +``` + -----------------------
From 90075121ecd61558cb50d80668298fb4263c6cc0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=A1=9C=E5=B0=8F=E8=B7=AF=E4=B8=83=E8=91=89?= <20304773@qq.com> Date: Wed, 1 Jun 2022 19:47:53 +0800 Subject: [PATCH 0783/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880977.?= =?UTF-8?q?=E6=9C=89=E5=BA=8F=E6=95=B0=E7=BB=84=E7=9A=84=E5=B9=B3=E6=96=B9?= =?UTF-8?q?.md=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0=20C#=20=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...04\347\232\204\345\271\263\346\226\271.md" | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git "a/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" "b/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" index 0e79a3d654..f1b0e4ec4c 100644 --- "a/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" +++ "b/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" @@ -394,6 +394,24 @@ object Solution { } ``` - +C#: +```csharp +public class Solution { + public int[] SortedSquares(int[] nums) { + int k = nums.Length - 1; + int[] result = new int[nums.Length]; + for (int i = 0, j = nums.Length - 1;i <= j;){ + if (nums[i] * nums[i] < nums[j] * nums[j]) { + result[k--] = nums[j] * nums[j]; + j--; + } else { + result[k--] = nums[i] * nums[i]; + i++; + } + } + return result; + } +} +``` -----------------------
From 0bdb37d7fa0138c6870b882a8577146ad43a01ca Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Thu, 2 Jun 2022 10:05:46 +0800 Subject: [PATCH 0784/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200077.=E7=BB=84?= =?UTF-8?q?=E5=90=88.md=20Scala=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "problems/0077.\347\273\204\345\220\210.md" | 28 +++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git "a/problems/0077.\347\273\204\345\220\210.md" "b/problems/0077.\347\273\204\345\220\210.md" index 9e0398aba1..f280c1764e 100644 --- "a/problems/0077.\347\273\204\345\220\210.md" +++ "b/problems/0077.\347\273\204\345\220\210.md" @@ -673,5 +673,33 @@ func combine(_ n: Int, _ k: Int) -> [[Int]] { } ``` +### Scala + +```scala +object Solution { + import scala.collection.mutable // 导包 + def combine(n: Int, k: Int): List[List[Int]] = { + var result = mutable.ListBuffer[List[Int]]() // 存放结果集 + var path = mutable.ListBuffer[Int]() //存放符合条件的结果 + + def backtracking(n: Int, k: Int, startIndex: Int): Unit = { + if (path.size == k) { + // 如果path的size == k就达到题目要求,添加到结果集,并返回 + result.append(path.toList) + return + } + for (i <- startIndex to n) { // 遍历从startIndex到n + path.append(i) // 先把数字添加进去 + backtracking(n, k, i + 1) // 进行下一步回溯 + path = path.take(path.size - 1) // 回溯完再删除掉刚刚添加的数字 + } + } + + backtracking(n, k, 1) // 执行回溯 + result.toList // 最终返回result的List形式,return关键字可以省略 + } +} +``` + -----------------------
From e734d0a12265ac455691d5cd15efe2c7fbfb8491 Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Thu, 2 Jun 2022 10:18:52 +0800 Subject: [PATCH 0785/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200077.=E7=BB=84?= =?UTF-8?q?=E5=90=88.md=20=E5=89=AA=E6=9E=9D=20Scala=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "problems/0077.\347\273\204\345\220\210.md" | 30 +++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git "a/problems/0077.\347\273\204\345\220\210.md" "b/problems/0077.\347\273\204\345\220\210.md" index f280c1764e..583822218b 100644 --- "a/problems/0077.\347\273\204\345\220\210.md" +++ "b/problems/0077.\347\273\204\345\220\210.md" @@ -675,6 +675,7 @@ func combine(_ n: Int, _ k: Int) -> [[Int]] { ### Scala +暴力: ```scala object Solution { import scala.collection.mutable // 导包 @@ -701,5 +702,34 @@ object Solution { } ``` +剪枝: + +```scala +object Solution { + import scala.collection.mutable // 导包 + def combine(n: Int, k: Int): List[List[Int]] = { + var result = mutable.ListBuffer[List[Int]]() // 存放结果集 + var path = mutable.ListBuffer[Int]() //存放符合条件的结果 + + def backtracking(n: Int, k: Int, startIndex: Int): Unit = { + if (path.size == k) { + // 如果path的size == k就达到题目要求,添加到结果集,并返回 + result.append(path.toList) + return + } + // 剪枝优化 + for (i <- startIndex to (n - (k - path.size) + 1)) { + path.append(i) // 先把数字添加进去 + backtracking(n, k, i + 1) // 进行下一步回溯 + path = path.take(path.size - 1) // 回溯完再删除掉刚刚添加的数字 + } + } + + backtracking(n, k, 1) // 执行回溯 + result.toList // 最终返回result的List形式,return关键字可以省略 + } +} +``` + -----------------------
From 5ac414f466ac9d80511aa5c2c6659df8fa5419a0 Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Thu, 2 Jun 2022 10:22:56 +0800 Subject: [PATCH 0786/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200077.=E7=BB=84?= =?UTF-8?q?=E5=90=88=E4=BC=98=E5=8C=96.md=20Scala=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...04\345\220\210\344\274\230\345\214\226.md" | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git "a/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" "b/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" index 94608ec18f..2c1a821b8e 100644 --- "a/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" +++ "b/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" @@ -346,5 +346,34 @@ func combine(_ n: Int, _ k: Int) -> [[Int]] { } ``` +Scala: + +```scala +object Solution { + import scala.collection.mutable // 导包 + def combine(n: Int, k: Int): List[List[Int]] = { + var result = mutable.ListBuffer[List[Int]]() // 存放结果集 + var path = mutable.ListBuffer[Int]() //存放符合条件的结果 + + def backtracking(n: Int, k: Int, startIndex: Int): Unit = { + if (path.size == k) { + // 如果path的size == k就达到题目要求,添加到结果集,并返回 + result.append(path.toList) + return + } + // 剪枝优化 + for (i <- startIndex to (n - (k - path.size) + 1)) { + path.append(i) // 先把数字添加进去 + backtracking(n, k, i + 1) // 进行下一步回溯 + path = path.take(path.size - 1) // 回溯完再删除掉刚刚添加的数字 + } + } + + backtracking(n, k, 1) // 执行回溯 + result.toList // 最终返回result的List形式,return关键字可以省略 + } +} +``` + -----------------------
From d0814a723c8e293e2fa7eee1503114584269faa7 Mon Sep 17 00:00:00 2001 From: Mrchenuo Date: Thu, 2 Jun 2022 10:57:47 +0800 Subject: [PATCH 0787/3019] =?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 修复CPP代码的addAtIndex函数中,当index<0时,while会死循环的问题。 --- .../0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" | 4 ++++ 1 file changed, 4 insertions(+) diff --git "a/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" "b/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" index dcdb53f44e..a788939b5b 100644 --- "a/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" +++ "b/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" @@ -104,10 +104,14 @@ public: // 在第index个节点之前插入一个新节点,例如index为0,那么新插入的节点为链表的新头节点。 // 如果index 等于链表的长度,则说明是新插入的节点为链表的尾结点 // 如果index大于链表的长度,则返回空 + // 如果index小于0,则置为0,作为链表的新头节点。 void addAtIndex(int index, int val) { if (index > _size) { return; } + else if (index < 0) { + index = 0; + } LinkedNode* newNode = new LinkedNode(val); LinkedNode* cur = _dummyHead; while(index--) { From 7dd463e085c8b7ef66e75009b3a5cdec0d30a17c Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Thu, 2 Jun 2022 12:13:52 +0800 Subject: [PATCH 0788/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200216.=E7=BB=84?= =?UTF-8?q?=E5=90=88=E6=80=BB=E5=92=8CIII.md=20Scala=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...345\220\210\346\200\273\345\222\214III.md" | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git "a/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" "b/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" index 32b1347e56..9e7415bed1 100644 --- "a/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" +++ "b/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" @@ -511,5 +511,35 @@ func combinationSum3(_ count: Int, _ targetSum: Int) -> [[Int]] { } ``` +## Scala + +```scala +object Solution { + import scala.collection.mutable + def combinationSum3(k: Int, n: Int): List[List[Int]] = { + var result = mutable.ListBuffer[List[Int]]() + var path = mutable.ListBuffer[Int]() + + def backtracking(k: Int, n: Int, sum: Int, startIndex: Int): Unit = { + if (sum > n) return // 剪枝,如果sum>目标和,就返回 + if (sum == n && path.size == k) { + result.append(path.toList) + return + } + // 剪枝 + for (i <- startIndex to (9 - (k - path.size) + 1)) { + path.append(i) + backtracking(k, n, sum + i, i + 1) + path = path.take(path.size - 1) + } + } + + backtracking(k, n, 0, 1) // 调用递归方法 + result.toList // 最终返回结果集的List形式 + } +} +``` + + -----------------------
From 2f0a1830377fe38fed12aba3bfd38424b9c67108 Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Thu, 2 Jun 2022 16:28:28 +0800 Subject: [PATCH 0789/3019] =?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=20Scala=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...27\346\257\215\347\273\204\345\220\210.md" | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git "a/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" "b/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" index 9413656515..f638349db2 100644 --- "a/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" +++ "b/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" @@ -557,6 +557,37 @@ func letterCombinations(_ digits: String) -> [String] { } ``` +## Scala: + +```scala +object Solution { + import scala.collection.mutable + def letterCombinations(digits: String): List[String] = { + var result = mutable.ListBuffer[String]() + if(digits == "") return result.toList // 如果参数为空,返回空结果集的List形式 + var path = mutable.ListBuffer[Char]() + // 数字和字符的映射关系 + val map = Array[String]("", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz") + + def backtracking(index: Int): Unit = { + if (index == digits.size) { + result.append(path.mkString) // mkString语法:将数组类型直接转换为字符串 + return + } + var digit = digits(index) - '0' // 这里使用toInt会报错!必须 -'0' + for (i <- 0 until map(digit).size) { + path.append(map(digit)(i)) + backtracking(index + 1) + path = path.take(path.size - 1) + } + } + + backtracking(0) + result.toList + } +} +``` + -----------------------
From 3d83e14392b6f4c16ea3ea4bfaf175878dce27cf Mon Sep 17 00:00:00 2001 From: wenmimi Date: Thu, 2 Jun 2022 18:23:14 +0800 Subject: [PATCH 0790/3019] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E8=83=8C=E5=8C=85?= =?UTF-8?q?=E7=90=86=E8=AE=BA=E5=9F=BA=E7=A1=8001=E8=83=8C=E5=8C=85-1=20GO?= =?UTF-8?q?=20=E7=89=88=E6=9C=AC=E4=BB=A3=E7=A0=81=20Bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...237\272\347\241\20001\350\203\214\345\214\205-1.md" | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" index a40a92aba6..e24824b9bb 100644 --- "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" +++ "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" @@ -356,9 +356,13 @@ func test_2_wei_bag_problem1(weight, value []int, bagweight int) int { // 递推公式 for i := 1; i < len(weight); i++ { //正序,也可以倒序 - for j := weight[i];j<= bagweight ; j++ { - dp[i][j] = max(dp[i-1][j], dp[i-1][j-weight[i]]+value[i]) - } + for j := 0; j <= bagweight; j++ { + if j < weight[i] { + dp[i][j] = dp[i-1][j] + } else { + dp[i][j] = max(dp[i-1][j], dp[i-1][j-weight[i]]+value[i]) + } + } } return dp[len(weight)-1][bagweight] } From d2e9927e97519621ba04f1e3d82684ed3cfafc5f Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Fri, 3 Jun 2022 09:46:09 +0800 Subject: [PATCH 0791/3019] =?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=20Scala=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...04\345\220\210\346\200\273\345\222\214.md" | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git "a/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" "b/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" index e10a827f04..ca6312f5b3 100644 --- "a/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" +++ "b/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" @@ -502,5 +502,35 @@ func combinationSum(_ candidates: [Int], _ target: Int) -> [[Int]] { } ``` +## Scala + +```scala +object Solution { + import scala.collection.mutable + def combinationSum(candidates: Array[Int], target: Int): List[List[Int]] = { + var result = mutable.ListBuffer[List[Int]]() + var path = mutable.ListBuffer[Int]() + + def backtracking(sum: Int, index: Int): Unit = { + if (sum == target) { + result.append(path.toList) // 如果正好等于target,就添加到结果集 + return + } + // 应该是从当前索引开始的,而不是从0 + // 剪枝优化:添加循环守卫,当sum + c(i) <= target的时候才循环,才可以进入下一次递归 + for (i <- index until candidates.size if sum + candidates(i) <= target) { + path.append(candidates(i)) + backtracking(sum + candidates(i), i) + path = path.take(path.size - 1) + } + } + + backtracking(0, 0) + result.toList + } +} +``` + + -----------------------
From 301a703ece704650eeb0bfd1eb8ef2079ee274b5 Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Fri, 3 Jun 2022 15:24:28 +0800 Subject: [PATCH 0792/3019] =?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=20Scala=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\345\220\210\346\200\273\345\222\214II.md" | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git "a/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" "b/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" index 34ac64e68d..6b635f8c02 100644 --- "a/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" +++ "b/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" @@ -693,5 +693,37 @@ func combinationSum2(_ candidates: [Int], _ target: Int) -> [[Int]] { } ``` + +## Scala + +```scala +object Solution { + import scala.collection.mutable + def combinationSum2(candidates: Array[Int], target: Int): List[List[Int]] = { + var res = mutable.ListBuffer[List[Int]]() + var path = mutable.ListBuffer[Int]() + var candidate = candidates.sorted + + def backtracking(sum: Int, startIndex: Int): Unit = { + if (sum == target) { + res.append(path.toList) + return + } + + for (i <- startIndex until candidate.size if sum + candidate(i) <= target) { + if (!(i > startIndex && candidate(i) == candidate(i - 1))) { + path.append(candidate(i)) + backtracking(sum + candidate(i), i + 1) + path = path.take(path.size - 1) + } + } + } + + backtracking(0, 0) + res.toList + } +} +``` + -----------------------
From 3605046879d02c5f6b931f7440935ef4142ef121 Mon Sep 17 00:00:00 2001 From: yalexu <61576631+alexgy1@users.noreply.github.com> Date: Fri, 3 Jun 2022 18:24:51 +0800 Subject: [PATCH 0793/3019] Add JS correct reverse method --- ...\215\350\275\254\345\255\227\347\254\246\344\270\262.md" | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git "a/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" "b/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" index 58bada05b9..192a397c96 100644 --- "a/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" @@ -190,13 +190,13 @@ javaScript: * @return {void} Do not return anything, modify s in-place instead. */ var reverseString = function(s) { - return s.reverse(); + //Do not return anything, modify s in-place instead. + reverse(s) }; -var reverseString = function(s) { +var reverse = function(s) { let l = -1, r = s.length; while(++l < --r) [s[l], s[r]] = [s[r], s[l]]; - return s; }; ``` From a2a2cf60272094c3c9d962723132502d93db097a Mon Sep 17 00:00:00 2001 From: lizhendong128 Date: Fri, 3 Jun 2022 21:42:36 +0800 Subject: [PATCH 0794/3019] =?UTF-8?q?=E4=BF=AE=E6=94=B90106=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?=20Java=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 将0106和0105的Java版本进行了修改,采用了map来存储位置信息,加快定位;并且代码更容易看懂 --- ...40\344\272\214\345\217\211\346\240\221.md" | 82 +++++++++---------- 1 file changed, 37 insertions(+), 45 deletions(-) diff --git "a/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" "b/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" index 188ad3cb44..878c357269 100644 --- "a/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" @@ -584,35 +584,29 @@ tree2 的前序遍历是[1 2 3], 后序遍历是[3 2 1]。 ```java class Solution { + Map map; // 方便根据数值查找位置 public TreeNode buildTree(int[] inorder, int[] postorder) { - return buildTree1(inorder, 0, inorder.length, postorder, 0, postorder.length); + map = new HashMap<>(); + for (int i = 0; i < inorder.length; i++) { // 用map保存中序序列的数值对应位置 + map.put(inorder[i], i); + } + + return findNode(inorder, 0, inorder.length, postorder,0, postorder.length); // 前闭后开 } - public TreeNode buildTree1(int[] inorder, int inLeft, int inRight, - int[] postorder, int postLeft, int postRight) { - // 没有元素了 - if (inRight - inLeft < 1) { + + public TreeNode findNode(int[] inorder, int inBegin, int inEnd, int[] postorder, int postBegin, int postEnd) { + // 参数里的范围都是前闭后开 + if (inBegin >= inEnd || postBegin >= postEnd) { // 不满足左闭右开,说明没有元素,返回空树 return null; } - // 只有一个元素了 - if (inRight - inLeft == 1) { - return new TreeNode(inorder[inLeft]); - } - // 后序数组postorder里最后一个即为根结点 - int rootVal = postorder[postRight - 1]; - TreeNode root = new TreeNode(rootVal); - int rootIndex = 0; - // 根据根结点的值找到该值在中序数组inorder里的位置 - for (int i = inLeft; i < inRight; i++) { - if (inorder[i] == rootVal) { - rootIndex = i; - break; - } - } - // 根据rootIndex划分左右子树 - root.left = buildTree1(inorder, inLeft, rootIndex, - postorder, postLeft, postLeft + (rootIndex - inLeft)); - root.right = buildTree1(inorder, rootIndex + 1, inRight, - postorder, postLeft + (rootIndex - inLeft), postRight - 1); + int rootIndex = map.get(postorder[postEnd - 1]); // 找到后序遍历的最后一个元素在中序遍历中的位置 + TreeNode root = new TreeNode(inorder[rootIndex]); // 构造结点 + int lenOfLeft = rootIndex - inBegin; // 保存中序左子树个数,用来确定后序数列的个数 + root.left = findNode(inorder, inBegin, rootIndex, + postorder, postBegin, postBegin + lenOfLeft); + root.right = findNode(inorder, rootIndex + 1, inEnd, + postorder, postBegin + lenOfLeft, postEnd - 1); + return root; } } @@ -622,31 +616,29 @@ class Solution { ```java class Solution { + Map map; public TreeNode buildTree(int[] preorder, int[] inorder) { - return helper(preorder, 0, preorder.length - 1, inorder, 0, inorder.length - 1); + map = new HashMap<>(); + for (int i = 0; i < inorder.length; i++) { // 用map保存中序序列的数值对应位置 + map.put(inorder[i], i); + } + + return findNode(preorder, 0, preorder.length, inorder, 0, inorder.length); // 前闭后开 } - public TreeNode helper(int[] preorder, int preLeft, int preRight, - int[] inorder, int inLeft, int inRight) { - // 递归终止条件 - if (inLeft > inRight || preLeft > preRight) return null; - - // val 为前序遍历第一个的值,也即是根节点的值 - // idx 为根据根节点的值来找中序遍历的下标 - int idx = inLeft, val = preorder[preLeft]; - TreeNode root = new TreeNode(val); - for (int i = inLeft; i <= inRight; i++) { - if (inorder[i] == val) { - idx = i; - break; - } + public TreeNode findNode(int[] preorder, int preBegin, int preEnd, int[] inorder, int inBegin, int inEnd) { + // 参数里的范围都是前闭后开 + if (preBegin >= preEnd || inBegin >= inEnd) { // 不满足左闭右开,说明没有元素,返回空树 + return null; } + int rootIndex = map.get(preorder[preBegin]); // 找到前序遍历的第一个元素在中序遍历中的位置 + TreeNode root = new TreeNode(inorder[rootIndex]); // 构造结点 + int lenOfLeft = rootIndex - inBegin; // 保存中序左子树个数,用来确定前序数列的个数 + root.left = findNode(preorder, preBegin + 1, preBegin + lenOfLeft + 1, + inorder, inBegin, rootIndex); + root.right = findNode(preorder, preBegin + lenOfLeft + 1, preEnd, + inorder, rootIndex + 1, inEnd); - // 根据 idx 来递归找左右子树 - root.left = helper(preorder, preLeft + 1, preLeft + (idx - inLeft), - inorder, inLeft, idx - 1); - root.right = helper(preorder, preLeft + (idx - inLeft) + 1, preRight, - inorder, idx + 1, inRight); return root; } } From af1b3e3e32676d6037645c0553b4fc2bb2cf149d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=A1=9C=E5=B0=8F=E8=B7=AF=E4=B8=83=E8=91=89?= <20304773@qq.com> Date: Sat, 4 Jun 2022 00:22:14 +0800 Subject: [PATCH 0795/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880209.?= =?UTF-8?q?=E9=95=BF=E5=BA=A6=E6=9C=80=E5=B0=8F=E7=9A=84=E5=AD=90=E6=95=B0?= =?UTF-8?q?=E7=BB=84.md=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0=20C#=20?= =?UTF-8?q?=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...04\345\255\220\346\225\260\347\273\204.md" | 23 ++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git "a/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" "b/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" index fbef7692cd..ceb06ce9a6 100644 --- "a/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" +++ "b/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" @@ -448,6 +448,27 @@ object Solution { } } ``` - +C#: +```csharp +public class Solution { + public int MinSubArrayLen(int s, int[] nums) { + int n = nums.Length; + int ans = int.MaxValue; + int start = 0, end = 0; + int sum = 0; + while (end < n) { + sum += nums[end]; + while (sum >= s) + { + ans = Math.Min(ans, end - start + 1); + sum -= nums[start]; + start++; + } + end++; + } + return ans == int.MaxValue ? 0 : ans; + } +} +``` -----------------------
From cccb4973aeccde06a00e5c693510c824ae98c99b Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Sat, 4 Jun 2022 10:44:25 +0800 Subject: [PATCH 0796/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880035.?= =?UTF-8?q?=E6=90=9C=E7=B4=A2=E6=8F=92=E5=85=A5=E4=BD=8D=E7=BD=AE.md?= =?UTF-8?q?=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...22\345\205\245\344\275\215\347\275\256.md" | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git "a/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" "b/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" index 6c04e7dea7..3de7c4f72f 100644 --- "a/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" +++ "b/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" @@ -283,6 +283,28 @@ var searchInsert = function (nums, target) { }; ``` +### TypeScript + +```typescript +// 第一种二分法 +function searchInsert(nums: number[], target: number): number { + const length: number = nums.length; + let left: number = 0, + right: number = length - 1; + while (left <= right) { + const mid: number = Math.floor((left + right) / 2); + if (nums[mid] < target) { + left = mid + 1; + } else if (nums[mid] === target) { + return mid; + } else { + right = mid - 1; + } + } + return right + 1; +}; +``` + ### Swift ```swift From 6cd58dfef0a22f568bb5c6b03f4026520b7283de Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Sat, 4 Jun 2022 13:13:33 +0800 Subject: [PATCH 0797/3019] =?UTF-8?q?=E4=BF=AE=E6=94=B9=EF=BC=880024.?= =?UTF-8?q?=E4=B8=A4=E4=B8=A4=E4=BA=A4=E6=8D=A2=E9=93=BE=E8=A1=A8=E4=B8=AD?= =?UTF-8?q?=E7=9A=84=E8=8A=82=E7=82=B9.md=EF=BC=89=EF=BC=9A=E4=BC=98?= =?UTF-8?q?=E5=8C=96typescript=E7=89=88=E6=9C=AC=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=EF=BC=8C=E5=A2=9E=E5=BC=BA=E6=98=93=E8=AF=BB=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...55\347\232\204\350\212\202\347\202\271.md" | 27 +++++++++---------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git "a/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" "b/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" index 2289c22912..0d848e4d09 100644 --- "a/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" +++ "b/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" @@ -254,20 +254,19 @@ TypeScript: ```typescript function swapPairs(head: ListNode | null): ListNode | null { - const dummyHead: ListNode = new ListNode(0, head); - let cur: ListNode = dummyHead; - while(cur.next !== null && cur.next.next !== null) { - const tem: ListNode = cur.next; - const tem1: ListNode = cur.next.next.next; - - cur.next = cur.next.next; // step 1 - cur.next.next = tem; // step 2 - cur.next.next.next = tem1; // step 3 - - cur = cur.next.next; - } - return dummyHead.next; -} + const dummyNode: ListNode = new ListNode(0, head); + let curNode: ListNode | null = dummyNode; + while (curNode && curNode.next && curNode.next.next) { + let firstNode: ListNode = curNode.next, + secNode: ListNode = curNode.next.next, + thirdNode: ListNode | null = curNode.next.next.next; + curNode.next = secNode; + secNode.next = firstNode; + firstNode.next = thirdNode; + curNode = firstNode; + } + return dummyNode.next; +}; ``` Kotlin: From 7d5856d0b82baad2266555f33bc1eae43538fd70 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Sat, 4 Jun 2022 15:56:22 +0800 Subject: [PATCH 0798/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880234.?= =?UTF-8?q?=E5=9B=9E=E6=96=87=E9=93=BE=E8=A1=A8.md=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...36\346\226\207\351\223\276\350\241\250.md" | 59 ++++++++++++++++++- 1 file changed, 58 insertions(+), 1 deletion(-) diff --git "a/problems/0234.\345\233\236\346\226\207\351\223\276\350\241\250.md" "b/problems/0234.\345\233\236\346\226\207\351\223\276\350\241\250.md" index db910d4ee0..b19a2408ac 100644 --- "a/problems/0234.\345\233\236\346\226\207\351\223\276\350\241\250.md" +++ "b/problems/0234.\345\233\236\346\226\207\351\223\276\350\241\250.md" @@ -273,7 +273,7 @@ class Solution: return pre ``` -## Go +### Go ```go @@ -319,6 +319,63 @@ var isPalindrome = function(head) { }; ``` +### TypeScript + +> 数组模拟 + +```typescript +function isPalindrome(head: ListNode | null): boolean { + const helperArr: number[] = []; + let curNode: ListNode | null = head; + while (curNode !== null) { + helperArr.push(curNode.val); + curNode = curNode.next; + } + let left: number = 0, + right: number = helperArr.length - 1; + while (left < right) { + if (helperArr[left++] !== helperArr[right--]) return false; + } + return true; +}; +``` + +> 反转后半部分链表 + +```typescript +function isPalindrome(head: ListNode | null): boolean { + if (head === null || head.next === null) return true; + let fastNode: ListNode | null = head, + slowNode: ListNode = head, + preNode: ListNode = head; + while (fastNode !== null && fastNode.next !== null) { + preNode = slowNode; + slowNode = slowNode.next!; + fastNode = fastNode.next.next; + } + preNode.next = null; + let cur1: ListNode | null = head; + let cur2: ListNode | null = reverseList(slowNode); + while (cur1 !== null) { + if (cur1.val !== cur2!.val) return false; + cur1 = cur1.next; + cur2 = cur2!.next; + } + return true; +}; +function reverseList(head: ListNode | null): ListNode | null { + let curNode: ListNode | null = head, + preNode: ListNode | null = null; + while (curNode !== null) { + let tempNode: ListNode | null = curNode.next; + curNode.next = preNode; + preNode = curNode; + curNode = tempNode; + } + return preNode; +} +``` + ----------------------- From bb484a70ac2c8d2fcbbba08a1897bc053c9354d1 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Sat, 4 Jun 2022 21:01:59 +0800 Subject: [PATCH 0799/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880143.?= =?UTF-8?q?=E9=87=8D=E6=8E=92=E9=93=BE=E8=A1=A8.md=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...15\346\216\222\351\223\276\350\241\250.md" | 76 +++++++++++++++++++ 1 file changed, 76 insertions(+) diff --git "a/problems/0143.\351\207\215\346\216\222\351\223\276\350\241\250.md" "b/problems/0143.\351\207\215\346\216\222\351\223\276\350\241\250.md" index 790bcb482a..c60fc0f968 100644 --- "a/problems/0143.\351\207\215\346\216\222\351\223\276\350\241\250.md" +++ "b/problems/0143.\351\207\215\346\216\222\351\223\276\350\241\250.md" @@ -6,6 +6,8 @@ # 143.重排链表 +[力扣题目链接](https://leetcode.cn/problems/reorder-list/submissions/) + ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210726160122.png) ## 思路 @@ -465,7 +467,81 @@ var reorderList = function(head, s = [], tmp) { } ``` +### TypeScript + +> 辅助数组法: + +```typescript +function reorderList(head: ListNode | null): void { + if (head === null) return; + const helperArr: ListNode[] = []; + let curNode: ListNode | null = head; + while (curNode !== null) { + helperArr.push(curNode); + curNode = curNode.next; + } + let node: ListNode = head; + let left: number = 1, + right: number = helperArr.length - 1; + let count: number = 0; + while (left <= right) { + if (count % 2 === 0) { + node.next = helperArr[right--]; + } else { + node.next = helperArr[left++]; + } + count++; + node = node.next; + } + node.next = null; +}; +``` + +> 分割链表法: + +```typescript +function reorderList(head: ListNode | null): void { + if (head === null || head.next === null) return; + let fastNode: ListNode = head, + slowNode: ListNode = head; + while (fastNode.next !== null && fastNode.next.next !== null) { + slowNode = slowNode.next!; + fastNode = fastNode.next.next; + } + let head1: ListNode | null = head; + // 反转后半部分链表 + let head2: ListNode | null = reverseList(slowNode.next); + // 分割链表 + slowNode.next = null; + /** + 直接在head1链表上进行插入 + head1 链表长度一定大于或等于head2, + 因此在下面的循环中,只要head2不为null, head1 一定不为null + */ + while (head2 !== null) { + const tempNode1: ListNode | null = head1!.next, + tempNode2: ListNode | null = head2.next; + head1!.next = head2; + head2.next = tempNode1; + head1 = tempNode1; + head2 = tempNode2; + } +}; +function reverseList(head: ListNode | null): ListNode | null { + let curNode: ListNode | null = head, + preNode: ListNode | null = null; + while (curNode !== null) { + const tempNode: ListNode | null = curNode.next; + curNode.next = preNode; + preNode = curNode; + curNode = tempNode; + } + return preNode; +} +``` + ### C + 方法三:反转链表 ```c //翻转链表 From c0a73e2544202baa3839852777e053e82937004c Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Sat, 4 Jun 2022 21:35:24 +0800 Subject: [PATCH 0800/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200131.=E5=88=86?= =?UTF-8?q?=E5=89=B2=E5=9B=9E=E6=96=87=E4=B8=B2.md=20Scala=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...62\345\233\236\346\226\207\344\270\262.md" | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git "a/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" "b/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" index 7a702898dc..f361d1ef87 100644 --- "a/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" +++ "b/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" @@ -676,5 +676,50 @@ impl Solution { } } ``` + + +## Scala + +```scala +object Solution { + + import scala.collection.mutable + + def partition(s: String): List[List[String]] = { + var result = mutable.ListBuffer[List[String]]() + var path = mutable.ListBuffer[String]() + + // 判断字符串是否回文 + def isPalindrome(start: Int, end: Int): Boolean = { + var (left, right) = (start, end) + while (left < right) { + if (s(left) != s(right)) return false + left += 1 + right -= 1 + } + true + } + + // 回溯算法 + def backtracking(startIndex: Int): Unit = { + if (startIndex >= s.size) { + result.append(path.toList) + return + } + // 添加循环守卫,如果当前分割是回文子串则进入回溯 + for (i <- startIndex until s.size if isPalindrome(startIndex, i)) { + path.append(s.substring(startIndex, i + 1)) + backtracking(i + 1) + path = path.take(path.size - 1) + } + } + + backtracking(0) + result.toList + } +} +``` + + -----------------------
From a8e4d4da767758488dbbc20564eab01a08e3e2dc Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Sat, 4 Jun 2022 22:04:15 +0800 Subject: [PATCH 0801/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200093.=E5=A4=8D?= =?UTF-8?q?=E5=8E=9FIP=E5=9C=B0=E5=9D=80.md=20Scala=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\345\216\237IP\345\234\260\345\235\200.md" | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git "a/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" "b/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" index 6401824b47..48bb6df229 100644 --- "a/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" +++ "b/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" @@ -659,6 +659,48 @@ func restoreIpAddresses(_ s: String) -> [String] { } ``` +## Scala + +```scala +object Solution { + import scala.collection.mutable + def restoreIpAddresses(s: String): List[String] = { + var result = mutable.ListBuffer[String]() + if (s.size < 4 || s.length > 12) return result.toList + var path = mutable.ListBuffer[String]() + + // 判断IP中的一个字段是否为正确的 + def isIP(sub: String): Boolean = { + if (sub.size > 1 && sub(0) == '0') return false + if (sub.toInt > 255) return false + true + } + + def backtracking(startIndex: Int): Unit = { + if (startIndex >= s.size) { + if (path.size == 4) { + result.append(path.mkString(".")) // mkString方法可以把集合里的数据以指定字符串拼接 + return + } + return + } + // subString + for (i <- startIndex until startIndex + 3 if i < s.size) { + var subString = s.substring(startIndex, i + 1) + if (isIP(subString)) { // 如果合法则进行下一轮 + path.append(subString) + backtracking(i + 1) + path = path.take(path.size - 1) + } + } + } + + backtracking(0) + result.toList + } +} +``` + -----------------------
From f5268ee213dafe8e7ab1c28d722a6b7dc81f4029 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Sat, 4 Jun 2022 22:26:58 +0800 Subject: [PATCH 0802/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880141.?= =?UTF-8?q?=E7=8E=AF=E5=BD=A2=E9=93=BE=E8=A1=A8.md=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...57\345\275\242\351\223\276\350\241\250.md" | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git "a/problems/0141.\347\216\257\345\275\242\351\223\276\350\241\250.md" "b/problems/0141.\347\216\257\345\275\242\351\223\276\350\241\250.md" index ddd83c9422..ce90b6c404 100644 --- "a/problems/0141.\347\216\257\345\275\242\351\223\276\350\241\250.md" +++ "b/problems/0141.\347\216\257\345\275\242\351\223\276\350\241\250.md" @@ -7,6 +7,8 @@ # 141. 环形链表 +[力扣题目链接](https://leetcode.cn/problems/linked-list-cycle/submissions/) + 给定一个链表,判断链表中是否有环。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。 @@ -103,7 +105,7 @@ class Solution: return False ``` -## Go +### Go ```go func hasCycle(head *ListNode) bool { @@ -139,6 +141,23 @@ var hasCycle = function(head) { }; ``` +### TypeScript + +```typescript +function hasCycle(head: ListNode | null): boolean { + let slowNode: ListNode | null = head, + fastNode: ListNode | null = head; + while (fastNode !== null && fastNode.next !== null) { + slowNode = slowNode!.next; + fastNode = fastNode.next.next; + if (slowNode === fastNode) return true; + } + return false; +}; +``` + + + -----------------------
From 0245b3ae50cc612ac7765976171b670a954f6a34 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Sat, 4 Jun 2022 23:38:12 +0800 Subject: [PATCH 0803/3019] =?UTF-8?q?=E4=BF=AE=E6=94=B9=EF=BC=880142.?= =?UTF-8?q?=E7=8E=AF=E5=BD=A2=E9=93=BE=E8=A1=A8II.md=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E4=BC=98=E5=8C=96typescript=E7=89=88=E6=9C=AC=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...2.\347\216\257\345\275\242\351\223\276\350\241\250II.md" | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git "a/problems/0142.\347\216\257\345\275\242\351\223\276\350\241\250II.md" "b/problems/0142.\347\216\257\345\275\242\351\223\276\350\241\250II.md" index f8e62d4572..7d3c8443a1 100644 --- "a/problems/0142.\347\216\257\345\275\242\351\223\276\350\241\250II.md" +++ "b/problems/0142.\347\216\257\345\275\242\351\223\276\350\241\250II.md" @@ -301,13 +301,13 @@ function detectCycle(head: ListNode | null): ListNode | null { let slowNode: ListNode | null = head, fastNode: ListNode | null = head; while (fastNode !== null && fastNode.next !== null) { - slowNode = (slowNode as ListNode).next; + slowNode = slowNode!.next; fastNode = fastNode.next.next; if (slowNode === fastNode) { slowNode = head; while (slowNode !== fastNode) { - slowNode = (slowNode as ListNode).next; - fastNode = (fastNode as ListNode).next; + slowNode = slowNode!.next; + fastNode = fastNode!.next; } return slowNode; } From bc3d202797ee1a2c276efd2b0b86cc00bd0f744a Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Sun, 5 Jun 2022 10:54:31 +0800 Subject: [PATCH 0804/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880205.?= =?UTF-8?q?=E5=90=8C=E6=9E=84=E5=AD=97=E7=AC=A6=E4=B8=B2.md=EF=BC=89?= =?UTF-8?q?=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...04\345\255\227\347\254\246\344\270\262.md" | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git "a/problems/0205.\345\220\214\346\236\204\345\255\227\347\254\246\344\270\262.md" "b/problems/0205.\345\220\214\346\236\204\345\255\227\347\254\246\344\270\262.md" index d4b71c59c4..337dcc733d 100644 --- "a/problems/0205.\345\220\214\346\236\204\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/0205.\345\220\214\346\236\204\345\255\227\347\254\246\344\270\262.md" @@ -156,6 +156,28 @@ var isIsomorphic = function(s, t) { }; ``` +## TypeScript + +```typescript +function isIsomorphic(s: string, t: string): boolean { + const helperMap1: Map = new Map(); + const helperMap2: Map = new Map(); + for (let i = 0, length = s.length; i < length; i++) { + let temp1: string | undefined = helperMap1.get(s[i]); + let temp2: string | undefined = helperMap2.get(t[i]); + if (temp1 === undefined && temp2 === undefined) { + helperMap1.set(s[i], t[i]); + helperMap2.set(t[i], s[i]); + } else if (temp1 !== t[i] || temp2 !== s[i]) { + return false; + } + } + return true; +}; +``` + + + -----------------------
From ccfb805417aa1f55efd1b30be662db8a92b46893 Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Sun, 5 Jun 2022 13:50:27 +0800 Subject: [PATCH 0805/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200078.=E5=AD=90?= =?UTF-8?q?=E9=9B=86.md=20Scala=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "problems/0078.\345\255\220\351\233\206.md" | 54 +++++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git "a/problems/0078.\345\255\220\351\233\206.md" "b/problems/0078.\345\255\220\351\233\206.md" index e1c52b5b81..3fc396a2e0 100644 --- "a/problems/0078.\345\255\220\351\233\206.md" +++ "b/problems/0078.\345\255\220\351\233\206.md" @@ -373,6 +373,60 @@ func subsets(_ nums: [Int]) -> [[Int]] { } ``` +## Scala + +思路一: 使用本题解思路 + +```scala +object Solution { + import scala.collection.mutable + def subsets(nums: Array[Int]): List[List[Int]] = { + var result = mutable.ListBuffer[List[Int]]() + var path = mutable.ListBuffer[Int]() + + def backtracking(startIndex: Int): Unit = { + result.append(path.toList) // 存放结果 + if (startIndex >= nums.size) { + return + } + for (i <- startIndex until nums.size) { + path.append(nums(i)) // 添加元素 + backtracking(i + 1) + path.remove(path.size - 1) // 删除 + } + } + + backtracking(0) + result.toList + } +} +``` + +思路二: 将原问题转换为二叉树,针对每一个元素都有**选或不选**两种选择,直到遍历到最后,所有的叶子节点即为本题的答案: + +```scala +object Solution { + import scala.collection.mutable + def subsets(nums: Array[Int]): List[List[Int]] = { + var result = mutable.ListBuffer[List[Int]]() + + def backtracking(path: mutable.ListBuffer[Int], startIndex: Int): Unit = { + if (startIndex == nums.length) { + result.append(path.toList) + return + } + path.append(nums(startIndex)) + backtracking(path, startIndex + 1) // 选择元素 + path.remove(path.size - 1) + backtracking(path, startIndex + 1) // 不选择元素 + } + + backtracking(mutable.ListBuffer[Int](), 0) + result.toList + } +} +``` + -----------------------
From b3530189489235f1212b89bd9dba0281154f366c Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Sun, 5 Jun 2022 14:13:41 +0800 Subject: [PATCH 0806/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200090.=E5=AD=90?= =?UTF-8?q?=E9=9B=86II.md=20Scala=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "problems/0090.\345\255\220\351\233\206II.md" | 57 +++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git "a/problems/0090.\345\255\220\351\233\206II.md" "b/problems/0090.\345\255\220\351\233\206II.md" index 74ce000b0b..9047a80984 100644 --- "a/problems/0090.\345\255\220\351\233\206II.md" +++ "b/problems/0090.\345\255\220\351\233\206II.md" @@ -434,6 +434,63 @@ func subsetsWithDup(_ nums: [Int]) -> [[Int]] { } ``` +### Scala + +不使用userd数组: + +```scala +object Solution { + import scala.collection.mutable + def subsetsWithDup(nums: Array[Int]): List[List[Int]] = { + var result = mutable.ListBuffer[List[Int]]() + var path = mutable.ListBuffer[Int]() + var num = nums.sorted // 排序 + + def backtracking(startIndex: Int): Unit = { + result.append(path.toList) + if (startIndex >= num.size){ + return + } + for (i <- startIndex until num.size) { + // 同一树层重复的元素不进入回溯 + if (!(i > startIndex && num(i) == num(i - 1))) { + path.append(num(i)) + backtracking(i + 1) + path.remove(path.size - 1) + } + } + } + + backtracking(0) + result.toList + } +} +``` + +使用Set去重: +```scala +object Solution { + import scala.collection.mutable + def subsetsWithDup(nums: Array[Int]): List[List[Int]] = { + var result = mutable.Set[List[Int]]() + var num = nums.sorted + def backtracking(path: mutable.ListBuffer[Int], startIndex: Int): Unit = { + if (startIndex == num.length) { + result.add(path.toList) + return + } + path.append(num(startIndex)) + backtracking(path, startIndex + 1) // 选择 + path.remove(path.size - 1) + backtracking(path, startIndex + 1) // 不选择 + } + + backtracking(mutable.ListBuffer[Int](), 0) + + result.toList + } +} +``` -----------------------
From 068cc095353ceb240c98a6c2b8598e98c445260b Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Sun, 5 Jun 2022 14:46:21 +0800 Subject: [PATCH 0807/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200491.=E9=80=92?= =?UTF-8?q?=E5=A2=9E=E5=AD=90=E5=BA=8F=E5=88=97.md=20Scala=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...36\345\255\220\345\272\217\345\210\227.md" | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git "a/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" "b/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" index 3ea2382b1f..a04d433b64 100644 --- "a/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" @@ -522,5 +522,39 @@ func findSubsequences(_ nums: [Int]) -> [[Int]] { ``` +## Scala + +```scala +object Solution { + import scala.collection.mutable + def findSubsequences(nums: Array[Int]): List[List[Int]] = { + var result = mutable.ListBuffer[List[Int]]() + var path = mutable.ListBuffer[Int]() + + def backtracking(startIndex: Int): Unit = { + // 集合元素大于1,添加到结果集 + if (path.size > 1) { + result.append(path.toList) + } + + var used = new Array[Boolean](201) + // 使用循环守卫,当前层没有用过的元素才有资格进入回溯 + for (i <- startIndex until nums.size if !used(nums(i) + 100)) { + // 如果path没元素或 当前循环的元素比path的最后一个元素大,则可以进入回溯 + if (path.size == 0 || (!path.isEmpty && nums(i) >= path(path.size - 1))) { + used(nums(i) + 100) = true + path.append(nums(i)) + backtracking(i + 1) + path.remove(path.size - 1) + } + } + } + + backtracking(0) + result.toList + } +} +``` + -----------------------
From 9f38af3e3a61562b17530302e8d14a6a02d1835f Mon Sep 17 00:00:00 2001 From: Hang <69448559+silaslll@users.noreply.github.com> Date: Sun, 5 Jun 2022 17:59:15 -0400 Subject: [PATCH 0808/3019] =?UTF-8?q?Update=200452.=E7=94=A8=E6=9C=80?= =?UTF-8?q?=E5=B0=91=E6=95=B0=E9=87=8F=E7=9A=84=E7=AE=AD=E5=BC=95=E7=88=86?= =?UTF-8?q?=E6=B0=94=E7=90=83.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 更新了java代码,增加了一个 leftmostRightBound variable 记录最小的右边界使得代码可读性增加 加入了comment 解释了Arrays.sort(points, (x, y) -> Integer.compare(x[0], y[0])); 中不用 x[0] - y[0] 而是用Integer.compare(x[0], y[0]) 的原因 加入了时空复杂度和说明 --- ...25\347\210\206\346\260\224\347\220\203.md" | 21 ++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git "a/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" "b/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" index d4bbe961ee..58422d4cf2 100644 --- "a/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" +++ "b/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" @@ -136,17 +136,28 @@ public: ### Java ```java +/** +时间复杂度 : O(NlogN) 排序需要 O(NlogN) 的复杂度 + +空间复杂度 : O(logN) java所使用的内置函数用的是快速排序需要 logN 的空间 +*/ class Solution { public int findMinArrowShots(int[][] points) { if (points.length == 0) return 0; - Arrays.sort(points, (o1, o2) -> Integer.compare(o1[0], o2[0])); - + //用x[0] - y[0] 会大于2147483647 造成整型溢出 + Arrays.sort(points, (x, y) -> Integer.compare(x[0], y[0])); + //count = 1 因为最少需要一个箭来射击第一个气球 int count = 1; - for (int i = 1; i < points.length; i++) { - if (points[i][0] > points[i - 1][1]) { + //重叠气球的最小右边界 + int leftmostRightBound = points[0][1]; + //如果下一个气球的左边界大于最小右边界 + if (points[i][0] > leftmostRightBound ) { + //增加一次射击 count++; + leftmostRightBound = points[i][1]; + //不然就更新最小右边界 } else { - points[i][1] = Math.min(points[i][1],points[i - 1][1]); + leftmostRightBound = Math.min(leftmostRightBound , points[i][1]); } } return count; From 6d804e2b244891ab3c1a12ac9b34d3eafd64654c Mon Sep 17 00:00:00 2001 From: Grant Yang Date: Sun, 5 Jun 2022 21:24:56 -0400 Subject: [PATCH 0809/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20111.=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?=20=E7=9A=84=E6=8B=BC=E5=86=99=E9=94=99=E8=AF=AF=E5=8F=8A?= =?UTF-8?q?=E6=94=B9=E8=BF=9B=E8=A7=84=E8=8C=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...5\261\202\345\272\217\351\201\215\345\216\206.md" | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" index 1743243de1..d9fd0b30d4 100644 --- "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" +++ "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" @@ -2393,21 +2393,21 @@ JavaScript: var minDepth = function(root) { if (root === null) return 0; let queue = [root]; - let deepth = 0; + let depth = 0; while (queue.length) { let n = queue.length; - deepth++; + depth++; for (let i=0; i Date: Sun, 5 Jun 2022 22:31:41 -0400 Subject: [PATCH 0810/3019] =?UTF-8?q?Update=200056.=E5=90=88=E5=B9=B6?= =?UTF-8?q?=E5=8C=BA=E9=97=B4.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...10\345\271\266\345\214\272\351\227\264.md" | 26 ++++++++++++++----- 1 file changed, 20 insertions(+), 6 deletions(-) diff --git "a/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" "b/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" index e444a22111..98848963d1 100644 --- "a/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" +++ "b/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" @@ -136,24 +136,38 @@ public: ### Java ```java + +/** +时间复杂度 : O(NlogN) 排序需要O(NlogN) +空间复杂度 : O(logN) java 的内置排序是快速排序 需要 O(logN)空间 + +*/ class Solution { public int[][] merge(int[][] intervals) { List res = new LinkedList<>(); - Arrays.sort(intervals, (o1, o2) -> Integer.compare(o1[0], o2[0])); - + //按照左边界排序 + Arrays.sort(intervals, (x, y) -> Integer.compare(x[0], y[0])); + //initial start 是最小左边界 int start = intervals[0][0]; + int rightmostRightBound = intervals[0][1]; for (int i = 1; i < intervals.length; i++) { - if (intervals[i][0] > intervals[i - 1][1]) { - res.add(new int[]{start, intervals[i - 1][1]}); + //如果左边界大于最大右边界 + if (intervals[i][0] > rightmostRightBound) { + //加入区间 并且更新start + res.add(new int[]{start, rightmostRightBound}); start = intervals[i][0]; + rightmostRightBound = intervals[i][1]; } else { - intervals[i][1] = Math.max(intervals[i][1], intervals[i - 1][1]); + //更新最大右边界 + rightmostRightBound = Math.max(rightmostRightBound, intervals[i][1]); } } - res.add(new int[]{start, intervals[intervals.length - 1][1]}); + res.add(new int[]{start, rightmostRightBound}); return res.toArray(new int[res.size()][]); } } + +} ``` ```java // 版本2 From dd00b57be87e9c4e25267c5ab6cc53f6d714a97e Mon Sep 17 00:00:00 2001 From: JaneyLin <105125897+janeyziqinglin@users.noreply.github.com> Date: Mon, 6 Jun 2022 21:43:18 -0500 Subject: [PATCH 0811/3019] =?UTF-8?q?Update=200704.=E4=BA=8C=E5=88=86?= =?UTF-8?q?=E6=9F=A5=E6=89=BE.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...14\345\210\206\346\237\245\346\211\276.md" | 24 ++++++++++--------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git "a/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" "b/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" index 1e474f9a96..a468cc44b6 100644 --- "a/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" +++ "b/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" @@ -218,19 +218,21 @@ class Solution: (版本二)左闭右开区间 -```python -class Solution: +```class Solution: def search(self, nums: List[int], target: int) -> int: - left,right =0, len(nums) - while left < right: - mid = (left + right) // 2 - if nums[mid] < target: - left = mid+1 - elif nums[mid] > target: - right = mid + if nums is None or len(nums)==0: + return -1 + l=0 + r=len(nums)-1 + while (l<=r): + m = round(l+(r-l)/2) + if nums[m] == target: + return m + elif nums[m] > target: + r=m-1 else: - return mid - return -1 + l=m+1 + return -1 ``` **Go:** From 091204c926a044f0ec86200cbdd3cca6deeaf97e Mon Sep 17 00:00:00 2001 From: HanMengnan <1448189829@qq.com> Date: Tue, 7 Jun 2022 10:46:43 +0800 Subject: [PATCH 0812/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880129.?= =?UTF-8?q?=E6=B1=82=E6=A0=B9=E8=8A=82=E7=82=B9=E5=88=B0=E5=8F=B6=E8=8A=82?= =?UTF-8?q?=E7=82=B9=E6=95=B0=E5=AD=97=E4=B9=8B=E5=92=8C.md=EF=BC=89?= =?UTF-8?q?=EF=BC=9A=E5=A2=9E=E5=8A=A0go=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...60\345\255\227\344\271\213\345\222\214.md" | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git "a/problems/0129.\346\261\202\346\240\271\345\210\260\345\217\266\345\255\220\350\212\202\347\202\271\346\225\260\345\255\227\344\271\213\345\222\214.md" "b/problems/0129.\346\261\202\346\240\271\345\210\260\345\217\266\345\255\220\350\212\202\347\202\271\346\225\260\345\255\227\344\271\213\345\222\214.md" index b271ca7de5..4191bb26f3 100644 --- "a/problems/0129.\346\261\202\346\240\271\345\210\260\345\217\266\345\255\220\350\212\202\347\202\271\346\225\260\345\255\227\344\271\213\345\222\214.md" +++ "b/problems/0129.\346\261\202\346\240\271\345\210\260\345\217\266\345\255\220\350\212\202\347\202\271\346\225\260\345\255\227\344\271\213\345\222\214.md" @@ -3,6 +3,9 @@

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

+ + + # 129. 求根节点到叶节点数字之和 [力扣题目链接](https://leetcode-cn.com/problems/sum-root-to-leaf-numbers/) @@ -245,6 +248,29 @@ class Solution: ``` Go: +```go +func sumNumbers(root *TreeNode) int { + sum = 0 + travel(root, root.Val) + return sum +} + +func travel(root *TreeNode, tmpSum int) { + if root.Left == nil && root.Right == nil { + sum += tmpSum + } else { + if root.Left != nil { + travel(root.Left, tmpSum*10+root.Left.Val) + } + if root.Right != nil { + travel(root.Right, tmpSum*10+root.Right.Val) + } + } +} +``` + + + JavaScript: ```javascript var sumNumbers = function(root) { From f49b2e4a75c6f98c082923e1098aedc5cb27574b Mon Sep 17 00:00:00 2001 From: JaneyLin <105125897+janeyziqinglin@users.noreply.github.com> Date: Mon, 6 Jun 2022 21:49:32 -0500 Subject: [PATCH 0813/3019] =?UTF-8?q?Update=200027.=E7=A7=BB=E9=99=A4?= =?UTF-8?q?=E5=85=83=E7=B4=A0.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit the former code has not consider if nums is None or len(nums)==0 --- ...73\351\231\244\345\205\203\347\264\240.md" | 38 +++++++++---------- 1 file changed, 17 insertions(+), 21 deletions(-) diff --git "a/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" "b/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" index 4b50d66643..b239136c46 100644 --- "a/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" +++ "b/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" @@ -173,28 +173,24 @@ class Solution { Python: -```python +```python3 class Solution: - """双指针法 - 时间复杂度:O(n) - 空间复杂度:O(1) - """ - - @classmethod - def removeElement(cls, nums: List[int], val: int) -> int: - fast = slow = 0 - - while fast < len(nums): - - if nums[fast] != val: - nums[slow] = nums[fast] - slow += 1 - - # 当 fast 指针遇到要删除的元素时停止赋值 - # slow 指针停止移动, fast 指针继续前进 - fast += 1 - - return slow + def removeElement(self, nums: List[int], val: int) -> int: + if nums is None or len(nums)==0: + return 0 + l=0 + r=len(nums)-1 + while l Date: Mon, 6 Jun 2022 22:11:16 -0500 Subject: [PATCH 0814/3019] =?UTF-8?q?Update=200977.=E6=9C=89=E5=BA=8F?= =?UTF-8?q?=E6=95=B0=E7=BB=84=E7=9A=84=E5=B9=B3=E6=96=B9.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit python3 version of brutal force --- ...0\347\273\204\347\232\204\345\271\263\346\226\271.md" | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git "a/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" "b/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" index 0e79a3d654..d3da662f8c 100644 --- "a/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" +++ "b/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" @@ -39,6 +39,15 @@ public: } }; ``` +```python3 +class Solution: + def sortedSquares(self, nums: List[int]) -> List[int]: + res=[] + for num in nums: + res.append(num**2) + return sorted(res) +``` + 这个时间复杂度是 O(n + nlogn), 可以说是O(nlogn)的时间复杂度,但为了和下面双指针法算法时间复杂度有鲜明对比,我记为 O(n + nlog n)。 From b10f7edba037886e736e58bbe0488ab078efdaa2 Mon Sep 17 00:00:00 2001 From: JaneyLin <105125897+janeyziqinglin@users.noreply.github.com> Date: Mon, 6 Jun 2022 22:17:15 -0500 Subject: [PATCH 0815/3019] =?UTF-8?q?Update=200209.=E9=95=BF=E5=BA=A6?= =?UTF-8?q?=E6=9C=80=E5=B0=8F=E7=9A=84=E5=AD=90=E6=95=B0=E7=BB=84.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 滑动窗口 version of python3 code --- ...04\345\255\220\346\225\260\347\273\204.md" | 23 +++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git "a/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" "b/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" index fbef7692cd..160f93bb46 100644 --- "a/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" +++ "b/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" @@ -162,8 +162,27 @@ class Solution: index += 1 return 0 if res==float("inf") else res ``` - - +```python3 +#滑动窗口 +class Solution: + def minSubArrayLen(self, target: int, nums: List[int]) -> int: + if nums is None or len(nums)==0: + return 0 + lenf=len(nums)+1 + total=0 + i=j=0 + while (j=target): + lenf=min(lenf,j-i) + total=total-nums[i] + i+=1 + if lenf==len(nums)+1: + return 0 + else: + return lenf +``` Go: ```go func minSubArrayLen(target int, nums []int) int { From 97fc88e533418bf9070bd9fb549a23a2499805b4 Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Tue, 7 Jun 2022 16:59:55 +0800 Subject: [PATCH 0816/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200046.=E5=85=A8?= =?UTF-8?q?=E6=8E=92=E5=88=97.md=20Scala=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...6.\345\205\250\346\216\222\345\210\227.md" | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git "a/problems/0046.\345\205\250\346\216\222\345\210\227.md" "b/problems/0046.\345\205\250\346\216\222\345\210\227.md" index 836c36462f..ec3adaa77d 100644 --- "a/problems/0046.\345\205\250\346\216\222\345\210\227.md" +++ "b/problems/0046.\345\205\250\346\216\222\345\210\227.md" @@ -456,6 +456,36 @@ func permute(_ nums: [Int]) -> [[Int]] { } ``` +### Scala + +```scala +object Solution { + import scala.collection.mutable + def permute(nums: Array[Int]): List[List[Int]] = { + var result = mutable.ListBuffer[List[Int]]() + var path = mutable.ListBuffer[Int]() + + def backtracking(used: Array[Boolean]): Unit = { + if (path.size == nums.size) { + // 如果path的长度和nums相等,那么可以添加到结果集 + result.append(path.toList) + return + } + // 添加循环守卫,只有当当前数字没有用过的情况下才进入回溯 + for (i <- nums.indices if used(i) == false) { + used(i) = true + path.append(nums(i)) + backtracking(used) // 回溯 + path.remove(path.size - 1) + used(i) = false + } + } + + backtracking(new Array[Boolean](nums.size)) // 调用方法 + result.toList // 最终返回结果集的List形式 + } +} +``` -----------------------
From 8537401616f10ce85038bbd94aa951a20bb877d6 Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Tue, 7 Jun 2022 17:24:41 +0800 Subject: [PATCH 0817/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200047.=E5=85=A8?= =?UTF-8?q?=E6=8E=92=E5=88=97II.md=20Scala=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\345\205\250\346\216\222\345\210\227II.md" | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git "a/problems/0047.\345\205\250\346\216\222\345\210\227II.md" "b/problems/0047.\345\205\250\346\216\222\345\210\227II.md" index cce25cd9a1..0a5debcc68 100644 --- "a/problems/0047.\345\205\250\346\216\222\345\210\227II.md" +++ "b/problems/0047.\345\205\250\346\216\222\345\210\227II.md" @@ -422,5 +422,43 @@ int** permuteUnique(int* nums, int numsSize, int* returnSize, int** returnColumn } ``` +### Scala + +```scala +object Solution { + import scala.collection.mutable + def permuteUnique(nums: Array[Int]): List[List[Int]] = { + var result = mutable.ListBuffer[List[Int]]() + var path = mutable.ListBuffer[Int]() + var num = nums.sorted // 首先对数据进行排序 + + def backtracking(used: Array[Boolean]): Unit = { + if (path.size == num.size) { + // 如果path的size等于num了,那么可以添加到结果集 + result.append(path.toList) + return + } + // 循环守卫,当前元素没被使用过就进入循环体 + for (i <- num.indices if used(i) == false) { + // 当前索引为0,不存在和前一个数字相等可以进入回溯 + // 当前索引值和上一个索引不相等,可以回溯 + // 前一个索引对应的值没有被选,可以回溯 + // 因为Scala没有continue,只能将逻辑反过来写 + if (i == 0 || (i > 0 && num(i) != num(i - 1)) || used(i-1) == false) { + used(i) = true + path.append(num(i)) + backtracking(used) + path.remove(path.size - 1) + used(i) = false + } + } + } + + backtracking(new Array[Boolean](nums.length)) + result.toList + } +} +``` + -----------------------
From fa26fb332b43cbeec805944f4522472953232487 Mon Sep 17 00:00:00 2001 From: dcj_hp <294487055@qq.com> Date: Tue, 7 Jun 2022 17:38:37 +0800 Subject: [PATCH 0818/3019] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20java=20dp?= =?UTF-8?q?=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\345\233\236\346\226\207\344\270\262II.md" | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git "a/problems/0132.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262II.md" "b/problems/0132.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262II.md" index 87d3e4b434..4cb959012d 100644 --- "a/problems/0132.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262II.md" +++ "b/problems/0132.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262II.md" @@ -206,6 +206,55 @@ public: ## Java ```java +class Solution { + + public int minCut(String s) { + if(null == s || "".equals(s)){ + return 0; + } + int len = s.length(); + // 1. + // 记录子串[i..j]是否是回文串 + boolean[][] isPalindromic = new boolean[len][len]; + // 从下到上,从左到右 + for(int i = len - 1; i >= 0; i--){ + for(int j = i; j < len; j++){ + if(s.charAt(i) == s.charAt(j)){ + if(j - i <= 1){ + isPalindromic[i][j] = true; + } else{ + isPalindromic[i][j] = isPalindromic[i + 1][j - 1]; + } + } else{ + isPalindromic[i][j] = false; + } + } + } + + // 2. + // dp[i] 表示[0..i]的最小分割次数 + int[] dp = new int[len]; + for(int i = 0; i < len; i++){ + //初始考虑最坏的情况。 1个字符分割0次, len个字符分割 len - 1次 + dp[i] = i; + } + + for(int i = 1; i < len; i++){ + if(isPalindromic[0][i]){ + // s[0..i]是回文了,那 dp[i] = 0, 一次也不用分割 + dp[i] = 0; + continue; + } + for(int j = 0; j < i; j++){ + // 按文中的思路,不清楚就拿 "ababa" 为例,先写出 isPalindromic 数组,再进行求解 + if(isPalindromic[j + 1][i]){ + dp[i] = Math.min(dp[i], dp[j] + 1); + } + } + } + return dp[len - 1]; + } +} ``` ## Python @@ -240,6 +289,7 @@ class Solution: ## Go ```go + ``` ## JavaScript From 7b95f173683f4eae7fd68c313839a678b2e1b79d Mon Sep 17 00:00:00 2001 From: Chris Chen Date: Tue, 7 Jun 2022 13:21:32 +0100 Subject: [PATCH 0819/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0(0001.=E4=B8=A4?= =?UTF-8?q?=E6=95=B0=E4=B9=8B=E5=92=8C.md=EF=BC=89=EF=BC=9ADart=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...270\244\346\225\260\344\271\213\345\222\214.md" | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git "a/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" "b/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" index 6969c2e27e..4ba92092f8 100644 --- "a/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" @@ -317,6 +317,20 @@ public class Solution { } ``` +Dart: +```dart +List twoSum(List nums, int target) { + var tmp = []; + for (var i = 0; i < nums.length; i++) { + var rest = target - nums[i]; + if(tmp.contains(rest)){ + return [tmp.indexOf(rest), i]; + } + tmp.add(nums[i]); + } + return [0 , 0]; +} +``` -----------------------
From 371564ba3b9a2b9641cafc05eb033f8d162aec81 Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Tue, 7 Jun 2022 22:19:13 +0800 Subject: [PATCH 0820/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200051.N=E7=9A=87?= =?UTF-8?q?=E5=90=8E.md=20Scala=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "problems/0051.N\347\232\207\345\220\216.md" | 74 +++++++++++++++++++- 1 file changed, 73 insertions(+), 1 deletion(-) diff --git "a/problems/0051.N\347\232\207\345\220\216.md" "b/problems/0051.N\347\232\207\345\220\216.md" index c03e48c2e4..f65ccaf518 100644 --- "a/problems/0051.N\347\232\207\345\220\216.md" +++ "b/problems/0051.N\347\232\207\345\220\216.md" @@ -455,7 +455,7 @@ var solveNQueens = function(n) { }; ``` -## TypeScript +### TypeScript ```typescript function solveNQueens(n: number): string[][] { @@ -683,5 +683,77 @@ char *** solveNQueens(int n, int* returnSize, int** returnColumnSizes){ } ``` +### Scala + +```scala +object Solution { + import scala.collection.mutable + def solveNQueens(n: Int): List[List[String]] = { + var result = mutable.ListBuffer[List[String]]() + + def judge(x: Int, y: Int, maze: Array[Array[Boolean]]): Boolean = { + // 正上方 + var xx = x + while (xx >= 0) { + if (maze(xx)(y)) return false + xx -= 1 + } + // 左边 + var yy = y + while (yy >= 0) { + if (maze(x)(yy)) return false + yy -= 1 + } + // 左上方 + xx = x + yy = y + while (xx >= 0 && yy >= 0) { + if (maze(xx)(yy)) return false + xx -= 1 + yy -= 1 + } + xx = x + yy = y + // 右上方 + while (xx >= 0 && yy < n) { + if (maze(xx)(yy)) return false + xx -= 1 + yy += 1 + } + true + } + + def backtracking(row: Int, maze: Array[Array[Boolean]]): Unit = { + if (row == n) { + // 将结果转换为题目所需要的形式 + var path = mutable.ListBuffer[String]() + for (x <- maze) { + var tmp = mutable.ListBuffer[String]() + for (y <- x) { + if (y == true) tmp.append("Q") + else tmp.append(".") + } + path.append(tmp.mkString) + } + result.append(path.toList) + return + } + + for (j <- 0 until n) { + // 判断这个位置是否可以放置皇后 + if (judge(row, j, maze)) { + maze(row)(j) = true + backtracking(row + 1, maze) + maze(row)(j) = false + } + } + } + + backtracking(0, Array.ofDim[Boolean](n, n)) + result.toList + } +} +``` + -----------------------
From b61afe9aee786592c313afb42b07295d0c1f4e00 Mon Sep 17 00:00:00 2001 From: JaneyLin <105125897+janeyziqinglin@users.noreply.github.com> Date: Tue, 7 Jun 2022 12:30:18 -0500 Subject: [PATCH 0821/3019] =?UTF-8?q?Update=200054.=E8=9E=BA=E6=97=8B?= =?UTF-8?q?=E7=9F=A9=E9=98=B5.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit for loop version of python3 solution --- ...72\346\227\213\347\237\251\351\230\265.md" | 26 ++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git "a/problems/0054.\350\236\272\346\227\213\347\237\251\351\230\265.md" "b/problems/0054.\350\236\272\346\227\213\347\237\251\351\230\265.md" index ccf6f47161..27899d5181 100644 --- "a/problems/0054.\350\236\272\346\227\213\347\237\251\351\230\265.md" +++ "b/problems/0054.\350\236\272\346\227\213\347\237\251\351\230\265.md" @@ -171,6 +171,30 @@ class Solution: return res ``` - +```python3 +class Solution: + def spiralOrder(self, matrix: List[List[int]]) -> List[int]: + r=len(matrix) + if r == 0 or len(matrix[0])==0: + return [] + c=len(matrix[0]) + res=matrix[0] + + if r>1: + for i in range (1,r): + res.append(matrix[i][c-1]) + for j in range(c-2, -1, -1): + res.append(matrix[r-1][j]) + if c>1: + for i in range(r-2, 0, -1): + res.append(matrix[i][0]) + + M=[] + for k in range(1, r-1): + e=matrix[k][1:-1] + M.append(e) + + return res+self.spiralOrder(M) +``` -----------------------
From 237dc9d6b3c648d4a76e905bbc7059c2f573e91a Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Wed, 8 Jun 2022 12:52:55 +0800 Subject: [PATCH 0822/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880925.?= =?UTF-8?q?=E9=95=BF=E6=8C=89=E9=94=AE=E5=85=A5.md=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...77\346\214\211\351\224\256\345\205\245.md" | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git "a/problems/0925.\351\225\277\346\214\211\351\224\256\345\205\245.md" "b/problems/0925.\351\225\277\346\214\211\351\224\256\345\205\245.md" index 0ef5a3d7f3..feb5739148 100644 --- "a/problems/0925.\351\225\277\346\214\211\351\224\256\345\205\245.md" +++ "b/problems/0925.\351\225\277\346\214\211\351\224\256\345\205\245.md" @@ -209,6 +209,31 @@ var isLongPressedName = function(name, typed) { }; ``` +### TypeScript + +```typescript +function isLongPressedName(name: string, typed: string): boolean { + const nameLength: number = name.length, + typeLength: number = typed.length; + let i: number = 0, + j: number = 0; + while (i < nameLength && j < typeLength) { + if (name[i] !== typed[j]) return false; + i++; + j++; + if (i === nameLength || name[i] !== name[i - 1]) { + // 跳过typed中的连续相同字符 + while (j < typeLength && typed[j] === typed[j - 1]) { + j++; + } + } + } + return i === nameLength && j === typeLength; +}; +``` + + + -----------------------
From cded6c5c803e5d6de7a47e020e94ce03fcc68432 Mon Sep 17 00:00:00 2001 From: ExplosiveBattery <641370196@qq.com> Date: Thu, 9 Jun 2022 00:58:38 +0800 Subject: [PATCH 0823/3019] =?UTF-8?q?Update=200110.=E5=B9=B3=E8=A1=A1?= =?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=A0=91.md=20=20python=20code=20via=20itera?= =?UTF-8?q?te?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit In the original method, we need to traversal every node and write the function named getDepth to get the depth of all sub trees in traverse method too. But there is more suitable uniform iteration traversal algorithm, I use the map struct in the code segment where the node is Null. If you have problem in understand, please feel free to communicate with me. --- ...41\344\272\214\345\217\211\346\240\221.md" | 46 +++++++------------ 1 file changed, 16 insertions(+), 30 deletions(-) diff --git "a/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" "b/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" index d98ff8a90c..1b997643f4 100644 --- "a/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" @@ -531,40 +531,26 @@ class Solution: 迭代法: ```python class Solution: - def isBalanced(self, root: TreeNode) -> bool: - st = [] + def isBalanced(self, root: Optional[TreeNode]) -> bool: if not root: return True - st.append(root) - while st: - node = st.pop() #中 - if abs(self.getDepth(node.left) - self.getDepth(node.right)) > 1: - return False - if node.right: - st.append(node.right) #右(空节点不入栈) - if node.left: - st.append(node.left) #左(空节点不入栈) - return True - - def getDepth(self, cur): - st = [] - if cur: - st.append(cur) - depth = 0 - result = 0 - while st: - node = st.pop() + + height_map = {} + stack = [root] + while stack: + node = stack.pop() if node: - st.append(node) #中 - st.append(None) - depth += 1 - if node.right: st.append(node.right) #右 - if node.left: st.append(node.left) #左 + stack.append(node) + stack.append(None) + if node.left: stack.append(node.left) + if node.right: stack.append(node.right) else: - node = st.pop() - depth -= 1 - result = max(result, depth) - return result + real_node = stack.pop() + left, right = height_map.get(real_node.left, 0), height_map.get(real_node.right, 0) + if abs(left - right) > 1: + return False + height_map[real_node] = 1 + max(left, right) + return True ``` From e354cd6e25231fc9b255ae1d6ed3d1c58e4aa27d Mon Sep 17 00:00:00 2001 From: ExplosiveBattery <641370196@qq.com> Date: Thu, 9 Jun 2022 02:33:55 +0800 Subject: [PATCH 0824/3019] =?UTF-8?q?Update=200101.=E5=AF=B9=E7=A7=B0?= =?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=A0=91.md=20level=20order=20traversal?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This leetcode problem can use level order traversal method, the difference between with the normal version is we should judge for None. There is my python answer, please feel free to contact with me if you have any problem. --- ...60\344\272\214\345\217\211\346\240\221.md" | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git "a/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" "b/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" index 1eb435892d..caf5d249e6 100644 --- "a/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" @@ -437,6 +437,31 @@ class Solution: return True ``` +层次遍历 +```python +class Solution: + def isSymmetric(self, root: Optional[TreeNode]) -> bool: + if not root: + return True + + que = [root] + while que: + this_level_length = len(que) + for i in range(this_level_length // 2): + # 要么其中一个是None但另外一个不是 + if (not que[i] and que[this_level_length - 1 - i]) or (que[i] and not que[this_level_length - 1 - i]): + return False + # 要么两个都不是None + if que[i] and que[i].val != que[this_level_length - 1 - i].val: + return False + for i in range(this_level_length): + if not que[i]: continue + que.append(que[i].left) + que.append(que[i].right) + que = que[this_level_length:] + return True +``` + ## Go ```go From ba31161609d4131a5d039046435a8f21805e301d Mon Sep 17 00:00:00 2001 From: JaneyLin <105125897+janeyziqinglin@users.noreply.github.com> Date: Wed, 8 Jun 2022 17:47:49 -0500 Subject: [PATCH 0825/3019] =?UTF-8?q?Update=20=E9=9D=A2=E8=AF=95=E9=A2=980?= =?UTF-8?q?2.07.=E9=93=BE=E8=A1=A8=E7=9B=B8=E4=BA=A4.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...3002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" | 2 ++ 1 file changed, 2 insertions(+) diff --git "a/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" "b/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" index 0a38cc3309..ba6631a4c9 100644 --- "a/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" +++ "b/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" @@ -160,6 +160,8 @@ class Solution: 那么,只要其中一个链表走完了,就去走另一条链表的路。如果有交点,他们最终一定会在同一个 位置相遇 """ + if headA is None or headB is None: + return None cur_a, cur_b = headA, headB # 用两个指针代替a和b From e06b53a88d8b26b4840428255b0e1f65f0eaf938 Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Thu, 9 Jun 2022 21:57:15 +0800 Subject: [PATCH 0826/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200037.=E8=A7=A3?= =?UTF-8?q?=E6=95=B0=E7=8B=AC.md=20Scala=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...7.\350\247\243\346\225\260\347\213\254.md" | 95 +++++++++++++++++++ 1 file changed, 95 insertions(+) diff --git "a/problems/0037.\350\247\243\346\225\260\347\213\254.md" "b/problems/0037.\350\247\243\346\225\260\347\213\254.md" index c1ac15af89..e2c533a992 100644 --- "a/problems/0037.\350\247\243\346\225\260\347\213\254.md" +++ "b/problems/0037.\350\247\243\346\225\260\347\213\254.md" @@ -602,5 +602,100 @@ func solveSudoku(_ board: inout [[Character]]) { } ``` +### Scala + +详细写法: +```scala +object Solution { + + def solveSudoku(board: Array[Array[Char]]): Unit = { + backtracking(board) + } + + def backtracking(board: Array[Array[Char]]): Boolean = { + for (i <- 0 until 9) { + for (j <- 0 until 9) { + if (board(i)(j) == '.') { // 必须是为 . 的数字才放数字 + for (k <- '1' to '9') { // 这个位置放k是否合适 + if (isVaild(i, j, k, board)) { + board(i)(j) = k + if (backtracking(board)) return true // 找到了立刻返回 + board(i)(j) = '.' // 回溯 + } + } + return false // 9个数都试完了,都不行就返回false + } + } + } + true // 遍历完所有的都没返回false,说明找到了 + } + + def isVaild(x: Int, y: Int, value: Char, board: Array[Array[Char]]): Boolean = { + // 行 + for (i <- 0 until 9 ) { + if (board(i)(y) == value) { + return false + } + } + + // 列 + for (j <- 0 until 9) { + if (board(x)(j) == value) { + return false + } + } + + // 宫 + var row = (x / 3) * 3 + var col = (y / 3) * 3 + for (i <- row until row + 3) { + for (j <- col until col + 3) { + if (board(i)(j) == value) { + return false + } + } + } + + true + } +} +``` + +遵循Scala至简原则写法: +```scala +object Solution { + + def solveSudoku(board: Array[Array[Char]]): Unit = { + backtracking(board) + } + + def backtracking(board: Array[Array[Char]]): Boolean = { + // 双重for循环 + 循环守卫 + for (i <- 0 until 9; j <- 0 until 9 if board(i)(j) == '.') { + // 必须是为 . 的数字才放数字,使用循环守卫判断该位置是否可以放置当前循环的数字 + for (k <- '1' to '9' if isVaild(i, j, k, board)) { // 这个位置放k是否合适 + board(i)(j) = k + if (backtracking(board)) return true // 找到了立刻返回 + board(i)(j) = '.' // 回溯 + } + return false // 9个数都试完了,都不行就返回false + } + true // 遍历完所有的都没返回false,说明找到了 + } + + def isVaild(x: Int, y: Int, value: Char, board: Array[Array[Char]]): Boolean = { + // 行,循环守卫进行判断 + for (i <- 0 until 9 if board(i)(y) == value) return false + // 列,循环守卫进行判断 + for (j <- 0 until 9 if board(x)(j) == value) return false + // 宫,循环守卫进行判断 + var row = (x / 3) * 3 + var col = (y / 3) * 3 + for (i <- row until row + 3; j <- col until col + 3 if board(i)(j) == value) return false + true // 最终没有返回false,就说明该位置可以填写true + } +} +``` + -----------------------
From 730f58bccee54b576c2b5bc998e5b97fe4fb5567 Mon Sep 17 00:00:00 2001 From: hongyang <1664698982@qq.com> Date: Thu, 9 Jun 2022 23:24:30 +0800 Subject: [PATCH 0827/3019] refactor: add golang solution to Intersection of Two Linked Lists LCCI --- ...76\350\241\250\347\233\270\344\272\244.md" | 53 +++++++++++++------ 1 file changed, 38 insertions(+), 15 deletions(-) diff --git "a/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" "b/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" index 0a38cc3309..f603925d4a 100644 --- "a/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" +++ "b/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" @@ -13,21 +13,21 @@ 图示两个链表在节点 c1 开始相交: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211219221657.png) +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211219221657.png) 题目数据 保证 整个链式结构中不存在环。 -注意,函数返回结果后,链表必须 保持其原始结构 。 +注意,函数返回结果后,链表必须 保持其原始结构 。 -示例 1: +示例 1: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211219221723.png) +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211219221723.png) 示例 2: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211219221749.png) +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211219221749.png) -示例 3: +示例 3: ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211219221812.png)![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211219221812.png) @@ -100,7 +100,7 @@ public: ## 其他语言版本 -### Java +### Java ```Java public class Solution { public ListNode getIntersectionNode(ListNode headA, ListNode headB) { @@ -144,11 +144,11 @@ public class Solution { } return null; } - + } ``` -### Python +### Python ```python class Solution: @@ -162,15 +162,15 @@ class Solution: """ cur_a, cur_b = headA, headB # 用两个指针代替a和b - + while cur_a != cur_b: cur_a = cur_a.next if cur_a else headB # 如果a走完了,那么就切换到b走 cur_b = cur_b.next if cur_b else headA # 同理,b走完了就切换到a - + return cur_a ``` -### Go +### Go ```go func getIntersectionNode(headA, headB *ListNode) *ListNode { @@ -208,7 +208,30 @@ func getIntersectionNode(headA, headB *ListNode) *ListNode { } ``` -### javaScript +递归版本: + +```go +func getIntersectionNode(headA, headB *ListNode) *ListNode { + l1,l2 := headA, headB + for l1 != l2 { + if l1 != nil { + l1 = l1.Next + } else { + l1 = headB + } + + if l2 != nil { + l2 = l2.Next + } else { + l2 = headA + } + } + + return l1 +} +``` + +### javaScript ```js var getListLen = function(head) { @@ -218,9 +241,9 @@ var getListLen = function(head) { cur = cur.next; } return len; -} +} var getIntersectionNode = function(headA, headB) { - let curA = headA,curB = headB, + let curA = headA,curB = headB, lenA = getListLen(headA), lenB = getListLen(headB); if(lenA < lenB) { From c9900267505297634675172ad670e86a2269cace Mon Sep 17 00:00:00 2001 From: JaneyLin <105125897+janeyziqinglin@users.noreply.github.com> Date: Thu, 9 Jun 2022 21:11:08 -0500 Subject: [PATCH 0828/3019] =?UTF-8?q?Update=200234.=E5=9B=9E=E6=96=87?= =?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 For both solution of python3, there are shorter and more efficient ways to write it. For the #数组模拟, it can be solved more easily by convert the linked list to a list #反转后半部分链表, the original version define to function, isPalindrome, and reverseList. That's too complicated... No need. --- ...36\346\226\207\351\223\276\350\241\250.md" | 74 +++++++------------ 1 file changed, 28 insertions(+), 46 deletions(-) diff --git "a/problems/0234.\345\233\236\346\226\207\351\223\276\350\241\250.md" "b/problems/0234.\345\233\236\346\226\207\351\223\276\350\241\250.md" index db910d4ee0..bbfe4e9132 100644 --- "a/problems/0234.\345\233\236\346\226\207\351\223\276\350\241\250.md" +++ "b/problems/0234.\345\233\236\346\226\207\351\223\276\350\241\250.md" @@ -218,59 +218,41 @@ class Solution { ```python #数组模拟 class Solution: - def isPalindrome(self, head: ListNode) -> bool: - length = 0 - tmp = head - while tmp: #求链表长度 - length += 1 - tmp = tmp.next - - result = [0] * length - tmp = head - index = 0 - while tmp: #链表元素加入数组 - result[index] = tmp.val - index += 1 - tmp = tmp.next - - i, j = 0, length - 1 - while i < j: # 判断回文 - if result[i] != result[j]: + def isPalindrome(self, head: Optional[ListNode]) -> bool: + list=[] + while head: + list.append(head.val) + head=head.next + l,r=0, len(list)-1 + while l<=r: + if list[l]!=list[r]: return False - i += 1 - j -= 1 - return True - + l+=1 + r-=1 + return True + #反转后半部分链表 class Solution: - def isPalindrome(self, head: ListNode) -> bool: - if head == None or head.next == None: - return True - slow, fast = head, head + def isPalindrome(self, head: Optional[ListNode]) -> bool: + fast = slow = head + + # find mid point which including (first) mid point into the first half linked list while fast and fast.next: - pre = slow - slow = slow.next fast = fast.next.next - - pre.next = None # 分割链表 - cur1 = head # 前半部分 - cur2 = self.reverseList(slow) # 反转后半部分,总链表长度如果是奇数,cur2比cur1多一个节点 - while cur1: - if cur1.val != cur2.val: + slow = slow.next + node = None + + # reverse second half linked list + while slow: + slow.next, slow, node = node, slow.next, slow + + # compare reversed and original half; must maintain reversed linked list is shorter than 1st half + while node: + if node.val != head.val: return False - cur1 = cur1.next - cur2 = cur2.next + node = node.next + head = head.next return True - - def reverseList(self, head: ListNode) -> ListNode: - cur = head - pre = None - while(cur!=None): - temp = cur.next # 保存一下cur的下一个节点 - cur.next = pre # 反转 - pre = cur - cur = temp - return pre ``` ## Go From f5f5f5a2a530845483708938064c05aae698487c Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Fri, 10 Jun 2022 11:02:44 +0800 Subject: [PATCH 0829/3019] Update --- ...73\351\231\244\345\205\203\347\264\240.md" | 14 +- ...22\345\205\245\344\275\215\347\275\256.md" | 12 +- ...14\345\210\206\346\237\245\346\211\276.md" | 2 + ...04\347\232\204\345\271\263\346\226\271.md" | 2 + problems/qita/gitserver.md | 312 ++++++++++++++++++ problems/qita/server.md | 126 +++++++ ...16\346\234\254\351\241\271\347\233\256.md" | 0 7 files changed, 460 insertions(+), 8 deletions(-) create mode 100644 problems/qita/gitserver.md create mode 100644 problems/qita/server.md rename "problems/\345\205\266\344\273\226/\345\217\202\344\270\216\346\234\254\351\241\271\347\233\256.md" => "problems/qita/\345\217\202\344\270\216\346\234\254\351\241\271\347\233\256.md" (100%) diff --git "a/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" "b/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" index 590cf0b924..72860ffd0d 100644 --- "a/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" +++ "b/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" @@ -28,6 +28,8 @@ ## 思路 +[本题B站视频讲解](https://www.bilibili.com/video/BV12A4y1Z7LP) + 有的同学可能说了,多余的元素,删掉不就得了。 **要知道数组的元素在内存地址中是连续的,不能单独删除数组中的某个元素,只能覆盖。** @@ -75,10 +77,20 @@ public: 双指针法(快慢指针法): **通过一个快指针和慢指针在一个for循环下完成两个for循环的工作。** +定义快慢指针 + +* 快指针:寻找新数组的元素 ,新数组就是不含有目标元素的数组 +* 慢指针:指向更新 新数组下标的位置 + +很多同学这道题目做的很懵,就是不理解 快慢指针究竟都是什么含义,所以一定要明确含义,后面的思路就更容易理解了。 + 删除过程如下: ![27.移除元素-双指针法](https://tva1.sinaimg.cn/large/008eGmZEly1gntrds6r59g30du09mnpd.gif) +很多同学不了解 + + **双指针法(快慢指针法)在数组和链表的操作中是非常常见的,很多考察数组、链表、字符串等操作的面试题,都使用双指针法。** 后序都会一一介绍到,本题代码如下: @@ -104,8 +116,6 @@ public: * 时间复杂度:O(n) * 空间复杂度:O(1) -旧文链接:[数组:就移除个元素很难么?](https://programmercarl.com/0027.移除元素.html) - ```CPP /** * 相向双指针方法,基于元素顺序可以改变的题目描述改变了元素相对位置,确保了移动最少元素 diff --git "a/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" "b/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" index 8a8f970614..ff1b02926b 100644 --- "a/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" +++ "b/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" @@ -73,8 +73,8 @@ public: }; ``` -* 时间复杂度:$O(n)$ -* 空间复杂度:$O(1)$ +* 时间复杂度:O(n) +* 空间复杂度:O(1) 效率如下: @@ -135,14 +135,14 @@ public: // 目标值在数组所有元素之前 [0, -1] // 目标值等于数组中某一个元素 return middle; // 目标值插入数组中的位置 [left, right],return right + 1 - // 目标值在数组所有元素之后的情况 [left, right], return right + 1 + // 目标值在数组所有元素之后的情况 [left, right], 因为是右闭区间,所以 return right + 1 return right + 1; } }; ``` -* 时间复杂度:$O(\log n)$ -* 时间复杂度:$O(1)$ +* 时间复杂度:O(log n) +* 时间复杂度:O(1) 效率如下: ![35_搜索插入位置2](https://img-blog.csdnimg.cn/2020121623272877.png) @@ -178,7 +178,7 @@ public: // 目标值在数组所有元素之前 [0,0) // 目标值等于数组中某一个元素 return middle // 目标值插入数组中的位置 [left, right) ,return right 即可 - // 目标值在数组所有元素之后的情况 [left, right),return right 即可 + // 目标值在数组所有元素之后的情况 [left, right),因为是右开区间,所以 return right return right; } }; diff --git "a/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" "b/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" index 5562513089..ce8253afc3 100644 --- "a/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" +++ "b/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" @@ -36,6 +36,8 @@ ## 思路 +为了易于大家理解,我还录制了视频,可以看这里:[手把手带你撕出正确的二分法](https://www.bilibili.com/video/BV1fA4y1o715) + **这道题目的前提是数组为有序数组**,同时题目还强调**数组中无重复元素**,因为一旦有重复元素,使用二分查找法返回的元素下标可能不是唯一的,这些都是使用二分法的前提条件,当大家看到题目描述满足如上条件的时候,可要想一想是不是可以用二分法了。 二分查找涉及的很多的边界条件,逻辑比较简单,但就是写不好。例如到底是 `while(left < right)` 还是 `while(left <= right)`,到底是`right = middle`呢,还是要`right = middle - 1`呢? diff --git "a/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" "b/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" index 24276bcff0..8811f3d790 100644 --- "a/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" +++ "b/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" @@ -23,6 +23,8 @@ # 思路 +为了易于大家理解,我还特意录制了视频,[本题视频讲解](https://www.bilibili.com/video/BV1QB4y1D7ep) + ## 暴力排序 最直观的想法,莫过于:每个数平方之后,排个序,美滋滋,代码如下: diff --git a/problems/qita/gitserver.md b/problems/qita/gitserver.md new file mode 100644 index 0000000000..9ee06ae4d9 --- /dev/null +++ b/problems/qita/gitserver.md @@ -0,0 +1,312 @@ + +# 一文手把手教你搭建Git私服 + +## 为什么要搭建Git私服 + +很多同学都问文章,文档,资料怎么备份啊,自己电脑和公司电脑怎么随时同步资料啊等等,这里呢我写一个搭建自己的git私服的详细教程 + +为什么要搭建一个Git私服呢,而不是用Github免费的私有仓库,有以下几点: +* Github 私有仓库真的慢,文件一旦多了,或者有图片文件,git pull 的时候半天拉不下来 +* 自己的文档难免有自己个人信息,放在github心里也是担心的 +* 想建几个库就建几个,想几个人合作开发都可以,不香么? + +**网上可以搜到很多git搭建,但是说的模棱两可**,而且有的直接是在本地搭建git服务,既然是备份,搭建在本地哪有备份的意义,一定要有一个远端服务器, 而且自己的电脑和公司的电脑还是同步自己的文章,文档和资料等等。 + + +适合人群: 想通过git私服来备份自己的文章,Markdown,并做版本管理的同学 +最后,写好每篇 Chat 是对我的责任,也是对你的尊重。谢谢大家~ + +正文如下: + +----------------------------- + +## 如何找到可以外网访问服务器 + +有的同学问了,自己的电脑就不能作为服务器么? + +这里要说一下,安装家庭带宽,运营商默认是不会给我们独立分配公网IP的 + +一般情况下是一片区域公用一个公网IP池,所以外网是不能访问到在家里我们使用的电脑的 + +除非我们自己去做映射,这其实非常麻烦而且公网IP池 是不断变化的 + +辛辛苦苦做了映射,运营商给IP一换,我们的努力就白扯了 + +那我们如何才能找到一个外网可以访问的服务器呢,此时云计算拯救了我们。 + +推荐大家选一家云厂商(阿里云,腾讯云,百度云都可以)在上面上买一台云服务器 + +* [阿里云活动期间服务器购买](https://www.aliyun.com/minisite/goods?taskCode=shareNew2205&recordId=3641992&userCode=roof0wob) +* [腾讯云活动期间服务器购买](https://curl.qcloud.com/EiaMXllu) + +云厂商经常做活动,如果从来没有买过云服务器的账号更便宜,低配一年一百块左右的样子,强烈推荐一起买个三年。 + +买云服务器的时候推荐直接安装centos系统。 + +这里要说一下,有了自己的云服务器之后 不仅仅可以用来做git私服 + +**同时还可以做网站,做程序后台,跑程序,做测试**(这样我们自己的电脑就不会因为自己各种搭建环境下载各种包而搞的的烂糟糟),等等等。 + +有自己云服务器和一个公网IP真的是一件非常非常幸福的事情,能体验到自己的服务随时可以部署上去提供给所有人使用的喜悦。 + +外网可以访问的服务器解决了,接下来就要部署git服务了 + +本文将采用centos系统来部署git私服 + +## 服务器端安装Git + +切换至root账户 + +``` +su root +``` + +看一下服务器有没有安装git,如果出现下面信息就说明是有git的 +``` +[root@instance-5fcyjde7 ~]# git +usage: git [--version] [--help] [-c name=value] + [--exec-path[=]] [--html-path] [--man-path] [--info-path] + [-p|--paginate|--no-pager] [--no-replace-objects] [--bare] + [--git-dir=] [--work-tree=] [--namespace=] + [] + +The most commonly used git commands are: + add Add file contents to the index + bisect Find by binary search the change that introduced a bug + branch List, create, or delete branches + checkout Checkout a branch or paths to the working tree + clone Clone a repository into a new directory + commit Record changes to the repository + diff Show changes between commits, commit and working tree, etc + fetch Download objects and refs from another repository + grep Print lines matching a pattern + init Create an empty Git repository or reinitialize an existing one + log Show commit logs + merge Join two or more development histories together + mv Move or rename a file, a directory, or a symlink + pull Fetch from and merge with another repository or a local branch + push Update remote refs along with associated objects + rebase Forward-port local commits to the updated upstream head + reset Reset current HEAD to the specified state + rm Remove files from the working tree and from the index + show Show various types of objects + status Show the working tree status + tag Create, list, delete or verify a tag object signed with GPG + +'git help -a' and 'git help -g' lists available subcommands and some +concept guides. See 'git help ' or 'git help ' +to read about a specific subcommand or concept. +``` + +如果没有git,就安装一下,yum安装的版本默认是 `1.8.3.1` + +``` +yum install git +``` + +安装成功之后,看一下自己安装的版本 + +``` +git --version +``` + +## 服务器端设置Git账户 + +创建一个git的linux账户,这个账户只做git私服的操作,也是为了安全起见 + +如果不新创建一个linux账户,在自己的常用的linux账户下创建的话,哪天手抖 来一个`rm -rf *` 操作 数据可全没了 + +**这里linux git账户的密码设置的尽量复杂一些,我这里为了演示,就设置成为'gitpassword'** +``` +adduser git +passwd gitpassword +``` + +然后就要切换成git账户,进行后面的操作了 +``` +[root@instance-5fcyjde7 ~]# su - git +``` + +看一下自己所在的目录,是不是在git目录下面 + +``` +[git@instance-5fcyjde7 ~]$ pwd +/home/git +``` + +## 服务器端密钥管理 + +创建`.ssh` 目录,如果`.ssh` 已经存在了,可以忽略这一项 + +为啥用配置ssh公钥呢,同学们记不记得我急使用github上传上传代码的时候也要把自己的公钥配置上github上 + +这也是方面每次操作git仓库的时候不用再去输入密码 + +``` +cd ~/ +mkdir .ssh +``` + +进入.ssh 文件下,创建一个 `authorized_keys` 文件,这个文件就是后面就是要放我们客户端的公钥 + +``` +cd ~/.ssh +touch authorized_keys +``` + +别忘了`authorized_keys`给设置权限,很多同学发现自己不能免密登陆,都是因为忘记了给`authorized_keys` 设置权限 + +``` +chmod 700 /home/git/.ssh +chmod 600 /home/git/.ssh/authorized_keys +``` + +接下来我们要把客户端的公钥放在git服务器上,我们在回到客户端,创建一个公钥 + +在我们自己的电脑上,有公钥和私钥 两个文件分别是:`id_rsa` 和 `id_rsa.pub` + +如果是`windows`系统公钥私钥的目录在`C:\Users\用户名\.ssh` 下 + +如果是mac 或者 linux, 公钥和私钥的目录这里 `cd ~/.ssh/`, 如果发现自己的电脑上没有公钥私钥,那就自己创建一个 + +创建密钥的命令 + +``` +ssh-keygen -t rsa +``` + +创建密钥的过程中,一路点击回车就可以了。不需要填任何东西 + +把公钥拷贝到git服务器上,将我们刚刚生成的`id_rsa.pub`,拷贝到git服务器的`/home/git/.ssh/`目录 + +在git服务器上,将公钥添加到`authorized_keys` 文件中 + +``` +cd /home/git/.ssh/ +cat id_rsa.pub >> authorized_keys +``` + +如何看我们配置的密钥是否成功呢, 在客户点直接登录git服务器,看看是否是免密登陆 +``` +ssh git@git服务器ip +``` + +例如: + +``` +ssh git@127.0.0.1 +``` + +如果可以免密登录,那就说明服务器端密钥配置成功了 + +## 服务器端部署Git 仓库 + +我们在登陆到git 服务器端,切换为成 git账户 + +如果是root账户切换成git账户 +``` +su - git +``` + +如果是其他账户切换为git账户 +``` +sudo su - git +``` + +进入git目录下 +``` +cd ~/git +``` + +创建我们的第一个Git私服的仓库,我们叫它为world仓库 + +那么首先创建一个文件夹名为: world.git ,然后进入这个目录 + +有同学问,为什么文件夹名字后面要放`.git`, 其实不这样命名也是可以的 + +但是细心的同学可能注意到,我们平时在github上 `git clone` 其他人的仓库的时候,仓库名字后面,都是加上`.git`的 + +例如下面这个例子,其实就是github对仓库名称的一个命名规则,所以我们也遵守github的命名规则。 + +``` +git clone https://github.com/youngyangyang04/NoSQLAttack.git +``` + +所以我们的操作是 +``` +[git@localhost git]# mkdir world.git +[git@localhost git]# cd world.git +``` + +初始化我们的`world`仓库 + +``` +git init --bare + +``` + +**如果我们想创建多个仓库,就在这里创建多个文件夹并初始化就可以了,和world仓库的操作过程是一样一样的** + +现在我们服务端的git仓库就部署完了,接下来就看看客户端,如何使用这个仓库呢 + +## 客户端连接远程仓库 + +我们在自己的电脑上创建一个文件夹 也叫做`world`吧 + +其实这里命名是随意的,但是我们为了和git服务端的仓库名称保持同步。 这样更直观我们操作的是哪一个仓库。 + +``` +mkdir world +cd world +``` + +进入world文件,并初始化操作 + +``` +cd world +git init +``` + +在world目录上创建一个测试文件,并且将其添加到git版本管理中 + +``` +touch test +git add test +git commit -m "add test file" +``` + +将次仓库和远端仓库同步 + +``` +git remote add origin git@git服务器端的ip:world.git +git push -u origin master +``` + +此时这个test测试文件就已经提交到我们的git远端私服上了 + +## Git私服安全问题 + +这里有两点安全问题 + +### linux git的密码不要泄露出去 + +否则,别人可以通过 ssh git@git服务器IP 来登陆到你的git私服服务器上 + +当然了,这里同学们如果买的是云厂商的云服务器的话 + +如果有人恶意想通过 尝试不同密码链接的方式来链接你的服务器,重试三次以上 + +这个客户端的IP就会被封掉,同时邮件通知我们可以IP来自哪里 + +所以大可放心 密码只要我们不泄露出去,基本上不会有人同时不断尝试密码的方式来登上我们的git私服服务器 + +### 私钥文件`id_rsa` 不要给别人 + +如果有人得到了这个私钥,就可以免密码登陆我们的git私服上了,我相信大家也不至于把自己的私钥主动给别人吧 + +## 总结 + +这里就是整个git私服搭建的全过程,安全问题我也给大家列举了出来,接下来好好享受自己的Git私服吧 + +**enjoy!** + diff --git a/problems/qita/server.md b/problems/qita/server.md new file mode 100644 index 0000000000..16995d703d --- /dev/null +++ b/problems/qita/server.md @@ -0,0 +1,126 @@ + +# 一台服务器有什么用! + +但在组织这场活动的时候,了解到大家都有一个共同的问题: **这个服务器究竟有啥用??** + +这真是一个好问题,而且我一句两句还说不清楚,所以就专门发文来讲一讲。 + +同时我还录制的一期视频,哈哈我的视频号,大家可以关注一波。 + + +一说到服务器,可能很多人都说搞分布式,做计算,搞爬虫,做程序后台服务,多人合作等等。 + +其实这些普通人都用不上,我来说一说大家能用上的吧。 + +## 搭建git私服 + +大家平时工作的时候一定有一个自己的工作文件夹,学生的话就是自己的课件,考试,准备面试的资料等等。 + +已经工作的录友,会有一个文件夹放着自己重要的文档,Markdown,图片,简历等等。 + +这么重要的文件夹,而且我们每天都要更新,也担心哪天电脑丢了,或者坏了,突然这些都不见了。 + +所以我们想备份嘛。 + +还有就是我们经常个人电脑和工作电脑要同步一些私人资料,而不是用微信传来传去。 + +这些都是git私服的使用场景,而且很好用。 + +大家也知道 github,gitee也可以搞私人仓库 用来备份,同步文件,但自己的文档可能放着很多重要的信息,包括自己的各种密码,密钥之类的,放到上面未必安全。你就不怕哪些重大bug把你的信息都泄漏了么[机智] + +更关键的是,github 和 gitee都限速的。毕竟人家的功能定位并不是网盘。 + +项目里有大文件(几百M以上),例如pdf,ppt等等 其上传和下载速度会让你窒息。 + +**后面我会发文专门来讲一讲,如何大家git私服!** + +## 搞一个文件存储 + +这个可以用来生成文件的下载链接,也可以把本地文件传到服务器上。 + +相当于自己做一个对象存储,其实云厂商也有对象存储的产品。 + +不过我们自己也可以做一个,不够很多很同学应该都不知道对象存储怎么用吧,其实我们用服务器可以自己做一个类似的公司。 + +我现在就用自己用go写的一个工具,部署在服务器上。 用来和服务器传文件,或者生成一些文件的临时下载链接。 + +这些都是直接命令行操作的, + +操作方式这样,我把命令包 包装成一个shell命令,想传那个文件,直接 uploadtomyserver,然后就返回可以下载的链接,这个文件也同时传到了我的服务器上。 + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211126165643.png) + +我也把我的项目代码放在了github上: + +https://github.com/youngyangyang04/fileHttpServer + +感兴趣的录友可以去学习一波,顺便给个star 哈哈 + + +## 网站 + +做网站,例如 大家知道用html 写几行代码,就可以生成一个网页,但怎么给别人展示呢? + +大家如果用自己的电脑做服务器,只能同一个路由器下的设备可以访问你的网站,可能这个设备出了这个屋子 都访问不了你的网站了。 + +因为你的IP不是公网IP。 + +如果有了一台云服务器,都是配公网IP,你的网站就可以让任何人访问了。 + +或者说 你提供的一个服务就可以让任何人使用。 + +例如第二个例子中,我们可以自己开发一个文件存储,这个服务,我只把把命令行给其他人,其他人都可以使用我的服务来生成链接,当然他们的文件也都传到了我的服务器上。 + +再说一个使用场景。 + +我之前在组织免费里服务器的活动的时候,阿里云给我一个excel,让面就是从我这里买服务器录友的名单,我直接把这个名单甩到群里,让大家自己检查,出现在名单里就可以找我返现,这样做是不是也可以。 + +这么做有几个很大的问题: +* 大家都要去下载excel,做对比,会有人改excel的内容然后就说是从你这里买的,我不可能挨个去比较excel有没有改动 +* excel有其他人的个人信息,这是不能暴漏的。 +* 如果每个人自己用excel查询,私信我返现,一个将近两千人找我返现,我微信根本处理不过来,这就变成体力活了。 + +那应该怎么做呢, + +我就简单写一个查询的页面,后端逻辑就是读一个execel表格,大家在查询页面输入自己的阿里云ID,如果在excel里,页面就会返回返现群的二维码,大家就可以自主扫码加群了。 + +这样,我最后就直接在返现群里 发等额红包就好了,是不是极大降低人力成本了 + +当然我是把 17个返现群的二维码都生成好了,按照一定的规则,展现给查询通过的录友。 + +就是这样一个非常普通的查询页面。 + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211126160200.png) + +查询通过之后,就会展现返现群二维码。 + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211127160558.png) + +但要部署在服务器上,因为没有公网IP,别人用不了你的服务。 + + +## 学习linux + +学习linux其实在自己的电脑上搞一台虚拟机,或者安装双系统也可以学习,不过这很考验你的电脑性能如何了。 + +如果你有一个服务器,那就是独立的一台电脑,你怎么霍霍就怎么霍霍,而且一年都不用关机的,可以一直跑你的任务,和你本地电脑也完全隔离。 + +更方便的是,你目前系统假如是centos,想做一个实验需要在unbantu上,如果是云服务器,更换系统就是在 后台点一下,一键重装,云厂商基本都是支持所有系统一件安装的。 + +我们平时自己玩linux经常是配各种环境,然后这个linux就被自己玩坏了(一般都是毫无节制使用root权限导致的),总之就是环境配不起来了,基本就要重装了。 + +那云服务器重装系统可太方便了。 + +还有就是加入你好不容易配好的环境,如果以后把这个环境玩坏了,你先回退这之前配好的环境而不是重装系统在重新配一遍吧。 + +那么可以用云服务器的镜像保存功能,就是你配好环境的那一刻就可以打一个镜像包,以后如果环境坏了,直接回退到上次镜像包的状态,这是不是就很香了。 + + +## 总结 + +其实云服务器还有很多其他用处,不过我就说一说大家普遍能用的上的。 + + +* [阿里云活动期间服务器购买](https://www.aliyun.com/minisite/goods?taskCode=shareNew2205&recordId=3641992&userCode=roof0wob) +* [腾讯云活动期间服务器购买](https://curl.qcloud.com/EiaMXllu) + diff --git "a/problems/\345\205\266\344\273\226/\345\217\202\344\270\216\346\234\254\351\241\271\347\233\256.md" "b/problems/qita/\345\217\202\344\270\216\346\234\254\351\241\271\347\233\256.md" similarity index 100% rename from "problems/\345\205\266\344\273\226/\345\217\202\344\270\216\346\234\254\351\241\271\347\233\256.md" rename to "problems/qita/\345\217\202\344\270\216\346\234\254\351\241\271\347\233\256.md" From ddcd31b2a7668214e94763709d2cb1c88a731dae Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Fri, 10 Jun 2022 11:27:26 +0800 Subject: [PATCH 0830/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880844.?= =?UTF-8?q?=E6=AF=94=E8=BE=83=E5=90=AB=E9=80=80=E6=A0=BC=E7=9A=84=E5=AD=97?= =?UTF-8?q?=E7=AC=A6=E4=B8=B2.md=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typesc?= =?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 --- ...04\345\255\227\347\254\246\344\270\262.md" | 65 +++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git "a/problems/0844.\346\257\224\350\276\203\345\220\253\351\200\200\346\240\274\347\232\204\345\255\227\347\254\246\344\270\262.md" "b/problems/0844.\346\257\224\350\276\203\345\220\253\351\200\200\346\240\274\347\232\204\345\255\227\347\254\246\344\270\262.md" index dccc5404cc..017d4cefea 100644 --- "a/problems/0844.\346\257\224\350\276\203\345\220\253\351\200\200\346\240\274\347\232\204\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/0844.\346\257\224\350\276\203\345\220\253\351\200\200\346\240\274\347\232\204\345\255\227\347\254\246\344\270\262.md" @@ -399,6 +399,71 @@ var backspaceCompare = function(s, t) { ``` +### TypeScript + +> 双栈法: + +```typescript +function backspaceCompare(s: string, t: string): boolean { + const stack1: string[] = [], + stack2: string[] = []; + for (let c of s) { + if (c === '#') { + stack1.pop(); + } else { + stack1.push(c); + } + } + for (let c of t) { + if (c === '#') { + stack2.pop(); + } else { + stack2.push(c); + } + } + if (stack1.length !== stack2.length) return false; + for (let i = 0, length = stack1.length; i < length; i++) { + if (stack1[i] !== stack2[i]) return false; + } + return true; +}; +``` + +> 双指针法: + +```typescript +function backspaceCompare(s: string, t: string): boolean { + let sIndex: number = s.length - 1, + tIndex: number = t.length - 1; + while (true) { + sIndex = getIndexAfterDel(s, sIndex); + tIndex = getIndexAfterDel(t, tIndex); + if (sIndex < 0 || tIndex < 0) break; + if (s[sIndex] !== t[tIndex]) return false; + sIndex--; + tIndex--; + } + return sIndex === -1 && tIndex === -1; +}; +function getIndexAfterDel(s: string, startIndex: number): number { + let backspaceNum: number = 0; + while (startIndex >= 0) { + // 不可消除 + if (s[startIndex] !== '#' && backspaceNum === 0) break; + // 可消除 + if (s[startIndex] === '#') { + backspaceNum++; + } else { + backspaceNum--; + } + startIndex--; + } + return startIndex; +} +``` + + + -----------------------
From 18f29ef1786e41fba506bc27f35c6a83a116ba14 Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Fri, 10 Jun 2022 16:28:33 +0800 Subject: [PATCH 0831/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200455.=E5=88=86?= =?UTF-8?q?=E5=8F=91=E9=A5=BC=E5=B9=B2.md=20Scala=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...06\345\217\221\351\245\274\345\271\262.md" | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git "a/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" "b/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" index 17db4a859e..443ab6d755 100644 --- "a/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" +++ "b/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" @@ -296,5 +296,26 @@ int findContentChildren(int* g, int gSize, int* s, int sSize){ } ``` +### Scala + +```scala +object Solution { + def findContentChildren(g: Array[Int], s: Array[Int]): Int = { + var result = 0 + var children = g.sorted + var cookie = s.sorted + // 遍历饼干 + var j = 0 + for (i <- cookie.indices) { + if (j < children.size && cookie(i) >= children(j)) { + j += 1 + result += 1 + } + } + result + } +} +``` + -----------------------
From 7fd311f47bf257787caeea3bcbf73ec3ce29e978 Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Fri, 10 Jun 2022 20:09:14 +0800 Subject: [PATCH 0832/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200376.=E6=91=86?= =?UTF-8?q?=E5=8A=A8=E5=BA=8F=E5=88=97.md=20Scala=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...06\345\212\250\345\272\217\345\210\227.md" | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git "a/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" "b/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" index 6822896e73..fb4d6eff19 100644 --- "a/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" +++ "b/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" @@ -375,7 +375,31 @@ function wiggleMaxLength(nums: number[]): number { }; ``` +### Scala + +```scala +object Solution { + def wiggleMaxLength(nums: Array[Int]): Int = { + if (nums.length <= 1) return nums.length + var result = 1 + var curDiff = 0 // 当前一对的差值 + var preDiff = 0 // 前一对的差值 + + for (i <- 1 until nums.length) { + curDiff = nums(i) - nums(i - 1) // 计算当前这一对的差值 + // 当 curDiff > 0 的情况,preDiff <= 0 + // 当 curDiff < 0 的情况,preDiff >= 0 + // 这两种情况算是两个峰值 + if ((curDiff > 0 && preDiff <= 0) || (curDiff < 0 && preDiff >= 0)) { + result += 1 // 结果集加 1 + preDiff = curDiff // 当前差值赋值给上一轮 + } + } + result + } +} +``` -----------------------
From 7ee790f4f532e56664642163a4612c7242f0fe11 Mon Sep 17 00:00:00 2001 From: ccchooko <648646891@qq.com> Date: Fri, 10 Jun 2022 22:34:11 +0800 Subject: [PATCH 0833/3019] =?UTF-8?q?0042=20=E6=8E=A5=E9=9B=A8=E6=B0=B4?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=8D=95=E8=B0=83=E6=A0=88go=E8=A7=A3?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...2.\346\216\245\351\233\250\346\260\264.md" | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git "a/problems/0042.\346\216\245\351\233\250\346\260\264.md" "b/problems/0042.\346\216\245\351\233\250\346\260\264.md" index b232ce2206..e331967f6f 100644 --- "a/problems/0042.\346\216\245\351\233\250\346\260\264.md" +++ "b/problems/0042.\346\216\245\351\233\250\346\260\264.md" @@ -640,8 +640,44 @@ func min(a,b int)int{ } ``` +单调栈解法 +```go +func trap(height []int) int { + if len(height) <= 2 { + return 0 + } + st := make([]int, 1, len(height)) // 切片模拟单调栈,st存储的是高度数组下标 + var res int + for i := 1; i < len(height); i++ { + if height[i] < height[st[len(st)-1]] { + st = append(st, i) + } else if height[i] == height[st[len(st)-1]] { + st = st[:len(st)-1] // 比较的新元素和栈顶的元素相等,去掉栈中的,入栈新元素下标 + st = append(st, i) + } else { + for len(st) != 0 && height[i] > height[st[len(st)-1]] { + top := st[len(st)-1] + st = st[:len(st)-1] + if len(st) != 0 { + tmp := (min(height[i], height[st[len(st)-1]]) - height[top]) * (i - st[len(st)-1] - 1) + res += tmp + } + } + st = append(st, i) + } + } + return res +} +func min(x, y int) int { + if x >= y { + return y + } + return x +} +``` + ### JavaScript: ```javascript From 9a068272ce8fd245d0c0ef93aee689afe4ea3cce Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Fri, 10 Jun 2022 22:46:32 +0800 Subject: [PATCH 0834/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880129.?= =?UTF-8?q?=E6=B1=82=E6=A0=B9=E5=88=B0=E5=8F=B6=E5=AD=90=E8=8A=82=E7=82=B9?= =?UTF-8?q?=E6=95=B0=E5=AD=97=E4=B9=8B=E5=92=8C.md=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...60\345\255\227\344\271\213\345\222\214.md" | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git "a/problems/0129.\346\261\202\346\240\271\345\210\260\345\217\266\345\255\220\350\212\202\347\202\271\346\225\260\345\255\227\344\271\213\345\222\214.md" "b/problems/0129.\346\261\202\346\240\271\345\210\260\345\217\266\345\255\220\350\212\202\347\202\271\346\225\260\345\255\227\344\271\213\345\222\214.md" index b271ca7de5..a34e6921c6 100644 --- "a/problems/0129.\346\261\202\346\240\271\345\210\260\345\217\266\345\255\220\350\212\202\347\202\271\346\225\260\345\255\227\344\271\213\345\222\214.md" +++ "b/problems/0129.\346\261\202\346\240\271\345\210\260\345\217\266\345\255\220\350\212\202\347\202\271\346\225\260\345\255\227\344\271\213\345\222\214.md" @@ -289,7 +289,40 @@ var sumNumbers = function(root) { }; ``` +TypeScript: + +```typescript +function sumNumbers(root: TreeNode | null): number { + if (root === null) return 0; + let resTotal: number = 0; + const route: number[] = []; + route.push(root.val); + recur(root, route); + return resTotal; + function recur(node: TreeNode, route: number[]): void { + if (node.left === null && node.right === null) { + resTotal += listToSum(route); + return; + } + if (node.left !== null) { + route.push(node.left.val); + recur(node.left, route); + route.pop(); + }; + if (node.right !== null) { + route.push(node.right.val); + recur(node.right, route); + route.pop(); + }; + } + function listToSum(nums: number[]): number { + return Number(nums.join('')); + } +}; +``` + C: + ```c //sum记录总和 int sum; From 192beffb66d20fb51cdb61f11649e5cff6379bb8 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Fri, 10 Jun 2022 23:38:32 +0800 Subject: [PATCH 0835/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=881382.?= =?UTF-8?q?=E5=B0=86=E4=BA=8C=E5=8F=89=E6=90=9C=E7=B4=A2=E6=A0=91=E5=8F=98?= =?UTF-8?q?=E5=B9=B3=E8=A1=A1.md=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typesc?= =?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 --- ...21\345\217\230\345\271\263\350\241\241.md" | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git "a/problems/1382.\345\260\206\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\345\217\230\345\271\263\350\241\241.md" "b/problems/1382.\345\260\206\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\345\217\230\345\271\263\350\241\241.md" index 57231ec46b..d4d60ebd00 100644 --- "a/problems/1382.\345\260\206\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\345\217\230\345\271\263\350\241\241.md" +++ "b/problems/1382.\345\260\206\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\345\217\230\345\271\263\350\241\241.md" @@ -148,6 +148,30 @@ var balanceBST = function(root) { }; ``` +TypeScript: + +```typescript +function balanceBST(root: TreeNode | null): TreeNode | null { + const inorderArr: number[] = []; + inorderTraverse(root, inorderArr); + return buildTree(inorderArr, 0, inorderArr.length - 1); +}; +function inorderTraverse(node: TreeNode | null, arr: number[]): void { + if (node === null) return; + inorderTraverse(node.left, arr); + arr.push(node.val); + inorderTraverse(node.right, arr); +} +function buildTree(arr: number[], left: number, right: number): TreeNode | null { + if (left > right) return null; + const mid = (left + right) >> 1; + const resNode: TreeNode = new TreeNode(arr[mid]); + resNode.left = buildTree(arr, left, mid - 1); + resNode.right = buildTree(arr, mid + 1, right); + return resNode; +} +``` + ----------------------- From 2386694b5b67e1ec17e42ce2c1f9df784eaeab24 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Sat, 11 Jun 2022 00:43:30 +0800 Subject: [PATCH 0836/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880100.?= =?UTF-8?q?=E7=9B=B8=E5=90=8C=E7=9A=84=E6=A0=91.md=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...70\345\220\214\347\232\204\346\240\221.md" | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git "a/problems/0100.\347\233\270\345\220\214\347\232\204\346\240\221.md" "b/problems/0100.\347\233\270\345\220\214\347\232\204\346\240\221.md" index 5e805d0111..d2431f398b 100644 --- "a/problems/0100.\347\233\270\345\220\214\347\232\204\346\240\221.md" +++ "b/problems/0100.\347\233\270\345\220\214\347\232\204\346\240\221.md" @@ -240,6 +240,46 @@ Go: JavaScript: +TypeScript: + +> 递归法-先序遍历 + +```typescript +function isSameTree(p: TreeNode | null, q: TreeNode | null): boolean { + if (p === null && q === null) return true; + if (p === null || q === null) return false; + if (p.val !== q.val) return false; + return isSameTree(p.left, q.left) && isSameTree(p.right, q.right); +}; +``` + +> 迭代法-层序遍历 + +```typescript +function isSameTree(p: TreeNode | null, q: TreeNode | null): boolean { + const queue1: (TreeNode | null)[] = [], + queue2: (TreeNode | null)[] = []; + queue1.push(p); + queue2.push(q); + while (queue1.length > 0 && queue2.length > 0) { + const node1 = queue1.shift(), + node2 = queue2.shift(); + if (node1 === null && node2 === null) continue; + if ( + (node1 === null || node2 === null) || + node1!.val !== node2!.val + ) return false; + queue1.push(node1!.left); + queue1.push(node1!.right); + queue2.push(node2!.left); + queue2.push(node2!.right); + } + return true; +}; +``` + + + -----------------------
From bd4f69d04b663dae39ab5a384722cd7d5aae3377 Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Sat, 11 Jun 2022 16:35:06 +0800 Subject: [PATCH 0837/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200053.=E6=9C=80?= =?UTF-8?q?=E5=A4=A7=E5=AD=90=E5=BA=8F=E5=92=8C=EF=BC=88=E5=8A=A8=E6=80=81?= =?UTF-8?q?=E8=A7=84=E5=88=92=EF=BC=89.md=20Scala=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\201\350\247\204\345\210\222\357\274\211.md" | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git "a/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" "b/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" index 4c883cb66c..6712d0acca 100644 --- "a/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" +++ "b/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" @@ -186,7 +186,22 @@ const maxSubArray = nums => { }; ``` - +Scala: + +```scala +object Solution { + def maxSubArray(nums: Array[Int]): Int = { + var dp = new Array[Int](nums.length) + var result = nums(0) + dp(0) = nums(0) + for (i <- 1 until nums.length) { + dp(i) = math.max(nums(i), dp(i - 1) + nums(i)) + result = math.max(result, dp(i)) // 更新最大值 + } + result + } +} +``` -----------------------
From 9031523bbb334cb2190b17f12333d3a5f1edda53 Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Sat, 11 Jun 2022 16:40:33 +0800 Subject: [PATCH 0838/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200053.=E6=9C=80?= =?UTF-8?q?=E5=A4=A7=E5=AD=90=E5=BA=8F=E5=92=8C.md=20Scala=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...47\345\255\220\345\272\217\345\222\214.md" | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git "a/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" "b/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" index 73cac244db..4971133ffd 100644 --- "a/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" +++ "b/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" @@ -333,8 +333,41 @@ function maxSubArray(nums: number[]): number { }; ``` +### Scala +**贪心** + +```scala +object Solution { + def maxSubArray(nums: Array[Int]): Int = { + var result = Int.MinValue + var count = 0 + for (i <- nums.indices) { + count += nums(i) // count累加 + if (count > result) result = count // 记录最大值 + if (count <= 0) count = 0 // 一旦count为负,则count归0 + } + result + } +} +``` +**动态规划** + +```scala +object Solution { + def maxSubArray(nums: Array[Int]): Int = { + var dp = new Array[Int](nums.length) + var result = nums(0) + dp(0) = nums(0) + for (i <- 1 until nums.length) { + dp(i) = math.max(nums(i), dp(i - 1) + nums(i)) + result = math.max(result, dp(i)) // 更新最大值 + } + result + } +} +``` -----------------------
From ff233a8e3ccfb08e82ebaa662c93bf687b76f153 Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Sat, 11 Jun 2022 16:53:35 +0800 Subject: [PATCH 0839/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200122.=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=BAII.md=20Scala=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\344\275\263\346\227\266\346\234\272II.md" | 35 ++++++++++++++----- 1 file changed, 27 insertions(+), 8 deletions(-) diff --git "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" index 1e7b77d80a..1369ff5ba5 100644 --- "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" +++ "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" @@ -133,8 +133,9 @@ public: ## 其他语言版本 -Java: +### Java: +贪心: ```java // 贪心思路 class Solution { @@ -148,6 +149,7 @@ class Solution { } ``` +动态规划: ```java class Solution { // 动态规划 public int maxProfit(int[] prices) { @@ -169,8 +171,8 @@ class Solution { // 动态规划 } ``` -Python: - +### Python: +贪心: ```python class Solution: def maxProfit(self, prices: List[int]) -> int: @@ -180,7 +182,7 @@ class Solution: return result ``` -python动态规划 +动态规划: ```python class Solution: def maxProfit(self, prices: List[int]) -> int: @@ -194,7 +196,7 @@ class Solution: return dp[-1][1] ``` -Go: +### Go: ```golang //贪心算法 @@ -231,7 +233,7 @@ func maxProfit(prices []int) int { } ``` -Javascript: +### Javascript: 贪心 ```Javascript @@ -268,7 +270,7 @@ const maxProfit = (prices) => { }; ``` -TypeScript: +### TypeScript: ```typescript function maxProfit(prices: number[]): number { @@ -280,7 +282,7 @@ function maxProfit(prices: number[]): number { }; ``` -C: +### C: 贪心: ```c int maxProfit(int* prices, int pricesSize){ @@ -318,5 +320,22 @@ int maxProfit(int* prices, int pricesSize){ } ``` +### Scala + +贪心: +```scala +object Solution { + def maxProfit(prices: Array[Int]): Int = { + var result = 0 + for (i <- 1 until prices.length) { + if (prices(i) > prices(i - 1)) { + result += prices(i) - prices(i - 1) + } + } + result + } +} +``` + -----------------------
From b0664fcb81c475356ddf925b839df6e00c434e8a Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Sat, 11 Jun 2022 17:21:03 +0800 Subject: [PATCH 0840/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200055.=E8=B7=B3?= =?UTF-8?q?=E8=B7=83=E6=B8=B8=E6=88=8F.md=20Scala=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\263\350\267\203\346\270\270\346\210\217.md" | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git "a/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" "b/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" index 17a3b4f4d3..345f8ebadc 100644 --- "a/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" +++ "b/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" @@ -193,7 +193,22 @@ function canJump(nums: number[]): boolean { }; ``` - +### Scala +```scala +object Solution { + def canJump(nums: Array[Int]): Boolean = { + var cover = 0 + if (nums.length == 1) return true // 如果只有一个元素,那么必定到达 + var i = 0 + while (i <= cover) { // i表示下标,当前只能够走cover步 + cover = math.max(i + nums(i), cover) + if (cover >= nums.length - 1) return true // 说明可以覆盖到终点,直接返回 + i += 1 + } + false // 如果上面没有返回就是跳不到 + } +} +``` ----------------------- From ad24b1fb1fa50e568a7357bbe772df59fc008e74 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Sat, 11 Jun 2022 18:29:48 +0800 Subject: [PATCH 0841/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880116.?= =?UTF-8?q?=E5=A1=AB=E5=85=85=E6=AF=8F=E4=B8=AA=E8=8A=82=E7=82=B9=E7=9A=84?= =?UTF-8?q?=E4=B8=8B=E4=B8=80=E4=B8=AA=E5=8F=B3=E4=BE=A7=E8=8A=82=E7=82=B9?= =?UTF-8?q?=E6=8C=87=E9=92=88.md=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typesc?= =?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 --- ...02\347\202\271\346\214\207\351\222\210.md" | 73 +++++++++++++++++++ 1 file changed, 73 insertions(+) diff --git "a/problems/0116.\345\241\253\345\205\205\346\257\217\344\270\252\350\212\202\347\202\271\347\232\204\344\270\213\344\270\200\344\270\252\345\217\263\344\276\247\350\212\202\347\202\271\346\214\207\351\222\210.md" "b/problems/0116.\345\241\253\345\205\205\346\257\217\344\270\252\350\212\202\347\202\271\347\232\204\344\270\213\344\270\200\344\270\252\345\217\263\344\276\247\350\212\202\347\202\271\346\214\207\351\222\210.md" index 2c443de52a..1e5b227167 100644 --- "a/problems/0116.\345\241\253\345\205\205\346\257\217\344\270\252\350\212\202\347\202\271\347\232\204\344\270\213\344\270\200\344\270\252\345\217\263\344\276\247\350\212\202\347\202\271\346\214\207\351\222\210.md" +++ "b/problems/0116.\345\241\253\345\205\205\346\257\217\344\270\252\350\212\202\347\202\271\347\232\204\344\270\213\344\270\200\344\270\252\345\217\263\344\276\247\350\212\202\347\202\271\346\214\207\351\222\210.md" @@ -287,6 +287,79 @@ const connect = root => { }; ``` +## TypeScript + +(注:命名空间‘Node’与typescript中内置类型冲突,这里改成了‘NodePro’) + +> 递归法: + +```typescript +class NodePro { + val: number + left: NodePro | null + right: NodePro | null + next: NodePro | null + constructor(val?: number, left?: NodePro, right?: NodePro, next?: NodePro) { + this.val = (val === undefined ? 0 : val) + this.left = (left === undefined ? null : left) + this.right = (right === undefined ? null : right) + this.next = (next === undefined ? null : next) + } +} + +function connect(root: NodePro | null): NodePro | null { + if (root === null) return null; + root.next = null; + recur(root); + return root; +}; +function recur(node: NodePro): void { + if (node.left === null || node.right === null) return; + node.left.next = node.right; + node.right.next = node.next && node.next.left; + recur(node.left); + recur(node.right); +} +``` + +> 迭代法: + +```typescript +class NodePro { + val: number + left: NodePro | null + right: NodePro | null + next: NodePro | null + constructor(val?: number, left?: NodePro, right?: NodePro, next?: NodePro) { + this.val = (val === undefined ? 0 : val) + this.left = (left === undefined ? null : left) + this.right = (right === undefined ? null : right) + this.next = (next === undefined ? null : next) + } +} + +function connect(root: NodePro | null): NodePro | null { + if (root === null) return null; + const queue: NodePro[] = []; + queue.push(root); + while (queue.length > 0) { + for (let i = 0, length = queue.length; i < length; i++) { + const curNode: NodePro = queue.shift()!; + if (i === length - 1) { + curNode.next = null; + } else { + curNode.next = queue[0]; + } + if (curNode.left !== null) queue.push(curNode.left); + if (curNode.right !== null) queue.push(curNode.right); + } + } + return root; +}; +``` + + + -----------------------
From 74a422c53b2817271b8f50a61bdd8ccdf77a5e25 Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Sat, 11 Jun 2022 20:03:12 +0800 Subject: [PATCH 0842/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200045.=E8=B7=B3?= =?UTF-8?q?=E8=B7=83=E6=B8=B8=E6=88=8FII.md=20Scala=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\350\267\203\346\270\270\346\210\217II.md" | 26 ++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git "a/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" "b/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" index 4e3ab24a83..f29403615f 100644 --- "a/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" +++ "b/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" @@ -279,7 +279,31 @@ function jump(nums: number[]): number { }; ``` - +### Scala + +```scala +object Solution { + def jump(nums: Array[Int]): Int = { + if (nums.length == 0) return 0 + var result = 0 // 记录走的最大步数 + var curDistance = 0 // 当前覆盖最远距离下标 + var nextDistance = 0 // 下一步覆盖最远距离下标 + for (i <- nums.indices) { + nextDistance = math.max(nums(i) + i, nextDistance) // 更新下一步覆盖最远距离下标 + if (i == curDistance) { + if (curDistance != nums.length - 1) { + result += 1 + curDistance = nextDistance + if (nextDistance >= nums.length - 1) return result + } else { + return result + } + } + } + result + } +} +``` From 67f74cdc098c7e7b7e012dec82d626731a59b051 Mon Sep 17 00:00:00 2001 From: tianzhou Date: Sat, 11 Jun 2022 23:08:31 +0800 Subject: [PATCH 0843/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=AE=9E=E6=97=B6?= =?UTF-8?q?=20star=20history=20=E5=9B=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 4e2993d861..620942dca6 100644 --- a/README.md +++ b/README.md @@ -523,6 +523,10 @@ [点此这里](https://github.com/youngyangyang04/leetcode-master/graphs/contributors)查看LeetCode-Master的所有贡献者。感谢他们补充了LeetCode-Master的其他语言版本,让更多的读者收益于此项目。 +# Star 趋势 + +[![Star History Chart](https://api.star-history.com/svg?repos=youngyangyang04/leetcode-master&type=Date)](https://star-history.com/#youngyangyang04/leetcode-master&Date) + # 关于作者 大家好,我是程序员Carl,哈工大师兄,《代码随想录》作者,先后在腾讯和百度从事后端技术研发,CSDN博客专家。对算法和C++后端技术有一定的见解,利用工作之余重新刷leetcode。 From 5d4046cacb2693a4e67fc311e2e83f73275d4909 Mon Sep 17 00:00:00 2001 From: guangyusong <15316444+guangyusong@users.noreply.github.com> Date: Sat, 11 Jun 2022 15:22:31 -0400 Subject: [PATCH 0844/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0server.md=E4=B8=ADU?= =?UTF-8?q?buntu=E7=9A=84=E6=8B=BC=E5=86=99=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/qita/server.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/problems/qita/server.md b/problems/qita/server.md index 16995d703d..0748c104c2 100644 --- a/problems/qita/server.md +++ b/problems/qita/server.md @@ -105,7 +105,7 @@ https://github.com/youngyangyang04/fileHttpServer 如果你有一个服务器,那就是独立的一台电脑,你怎么霍霍就怎么霍霍,而且一年都不用关机的,可以一直跑你的任务,和你本地电脑也完全隔离。 -更方便的是,你目前系统假如是centos,想做一个实验需要在unbantu上,如果是云服务器,更换系统就是在 后台点一下,一键重装,云厂商基本都是支持所有系统一件安装的。 +更方便的是,你目前系统假如是CentOS,想做一个实验需要在Ubuntu上,如果是云服务器,更换系统就是在 后台点一下,一键重装,云厂商基本都是支持所有系统一件安装的。 我们平时自己玩linux经常是配各种环境,然后这个linux就被自己玩坏了(一般都是毫无节制使用root权限导致的),总之就是环境配不起来了,基本就要重装了。 From 882c19c3e263161a18d4349f53ee2226a09a3c6b Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Sun, 12 Jun 2022 10:17:49 +0800 Subject: [PATCH 0845/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=201005.K=E6=AC=A1?= =?UTF-8?q?=E5=8F=96=E5=8F=8D=E5=90=8E=E6=9C=80=E5=A4=A7=E5=8C=96=E7=9A=84?= =?UTF-8?q?=E6=95=B0=E7=BB=84=E5=92=8C.md=20Scala=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...04\346\225\260\347\273\204\345\222\214.md" | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git "a/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" "b/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" index 202534da8c..71fc628f7e 100644 --- "a/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" +++ "b/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" @@ -289,6 +289,28 @@ function largestSumAfterKNegations(nums: number[], k: number): number { }; ``` +### Scala + +```scala +object Solution { + def largestSumAfterKNegations(nums: Array[Int], k: Int): Int = { + var num = nums.sortWith(math.abs(_) > math.abs(_)) + + var kk = k // 因为k是不可变量,所以要赋值给一个可变量 + for (i <- num.indices) { + if (num(i) < 0 && kk > 0) { + num(i) *= -1 // 取反 + kk -= 1 + } + } + + // kk对2取余,结果为0则为偶数不需要取反,结果为1为奇数,只需要对最后的数字进行反转就可以 + if (kk % 2 == 1) num(num.size - 1) *= -1 + + num.sum // 最后返回数字的和 + } +} +``` From dd20ca032fab47e0e05f9d32c05f528872dcf83a Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Sun, 12 Jun 2022 12:17:26 +0800 Subject: [PATCH 0846/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880052.N?= =?UTF-8?q?=E7=9A=87=E5=90=8EII.md=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0type?= =?UTF-8?q?script=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0052.N\347\232\207\345\220\216II.md" | 54 +++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git "a/problems/0052.N\347\232\207\345\220\216II.md" "b/problems/0052.N\347\232\207\345\220\216II.md" index 67e439ca81..608aeda172 100644 --- "a/problems/0052.N\347\232\207\345\220\216II.md" +++ "b/problems/0052.N\347\232\207\345\220\216II.md" @@ -144,7 +144,61 @@ var totalNQueens = function(n) { }; ``` +TypeScript: + +```typescript +// 0-该格为空,1-该格有皇后 +type GridStatus = 0 | 1; +function totalNQueens(n: number): number { + let resCount: number = 0; + const chess: GridStatus[][] = new Array(n).fill(0) + .map(_ => new Array(n).fill(0)); + backTracking(chess, n, 0); + return resCount; + function backTracking(chess: GridStatus[][], n: number, startRowIndex: number): void { + if (startRowIndex === n) { + resCount++; + return; + } + for (let j = 0; j < n; j++) { + if (checkValid(chess, startRowIndex, j, n) === true) { + chess[startRowIndex][j] = 1; + backTracking(chess, n, startRowIndex + 1); + chess[startRowIndex][j] = 0; + } + } + } +}; +function checkValid(chess: GridStatus[][], i: number, j: number, n: number): boolean { + // 向上纵向检查 + let tempI: number = i - 1, + tempJ: number = j; + while (tempI >= 0) { + if (chess[tempI][tempJ] === 1) return false; + tempI--; + } + // 斜向左上检查 + tempI = i - 1; + tempJ = j - 1; + while (tempI >= 0 && tempJ >= 0) { + if (chess[tempI][tempJ] === 1) return false; + tempI--; + tempJ--; + } + // 斜向右上检查 + tempI = i - 1; + tempJ = j + 1; + while (tempI >= 0 && tempJ < n) { + if (chess[tempI][tempJ] === 1) return false; + tempI--; + tempJ++; + } + return true; +} +``` + C + ```c //path[i]为在i行,path[i]列上存在皇后 int *path; From 1da68a332c35b178d62edf946fd7a4da4ac98d3c Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Sun, 12 Jun 2022 13:46:58 +0800 Subject: [PATCH 0847/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200134.=E5=8A=A0?= =?UTF-8?q?=E6=B2=B9=E7=AB=99.md=20Scala=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...4.\345\212\240\346\262\271\347\253\231.md" | 68 +++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git "a/problems/0134.\345\212\240\346\262\271\347\253\231.md" "b/problems/0134.\345\212\240\346\262\271\347\253\231.md" index a88f677d34..541be2930d 100644 --- "a/problems/0134.\345\212\240\346\262\271\347\253\231.md" +++ "b/problems/0134.\345\212\240\346\262\271\347\253\231.md" @@ -471,5 +471,73 @@ int canCompleteCircuit(int* gas, int gasSize, int* cost, int costSize){ } ``` +### Scala + +暴力解法: + +```scala +object Solution { + def canCompleteCircuit(gas: Array[Int], cost: Array[Int]): Int = { + for (i <- cost.indices) { + var rest = gas(i) - cost(i) + var index = (i + 1) % cost.length // index为i的下一个节点 + while (rest > 0 && i != index) { + rest += (gas(index) - cost(index)) + index = (index + 1) % cost.length + } + if (rest >= 0 && index == i) return i + } + -1 + } +} +``` + +贪心算法,方法一: + +```scala +object Solution { + def canCompleteCircuit(gas: Array[Int], cost: Array[Int]): Int = { + var curSum = 0 + var min = Int.MaxValue + for (i <- gas.indices) { + var rest = gas(i) - cost(i) + curSum += rest + min = math.min(min, curSum) + } + if (curSum < 0) return -1 // 情况1: gas的总和小于cost的总和,不可能到达终点 + if (min >= 0) return 0 // 情况2: 最小值>=0,从0号出发可以直接到达 + // 情况3: min为负值,从后向前看,能把min填平的节点就是出发节点 + for (i <- gas.length - 1 to 0 by -1) { + var rest = gas(i) - cost(i) + min += rest + if (min >= 0) return i + } + -1 + } +} +``` + +贪心算法,方法二: + +```scala +object Solution { + def canCompleteCircuit(gas: Array[Int], cost: Array[Int]): Int = { + var curSum = 0 + var totalSum = 0 + var start = 0 + for (i <- gas.indices) { + curSum += (gas(i) - cost(i)) + totalSum += (gas(i) - cost(i)) + if (curSum < 0) { + start = i + 1 // 起始位置更新 + curSum = 0 // curSum从0开始 + } + } + if (totalSum < 0) return -1 // 说明怎么走不可能跑一圈 + start + } +} +``` + -----------------------
From 998785bcab1346d652b8b3db9ccd166054194a83 Mon Sep 17 00:00:00 2001 From: Vincent Date: Sun, 12 Jun 2022 16:59:08 -0700 Subject: [PATCH 0848/3019] =?UTF-8?q?Update=200034.=E5=9C=A8=E6=8E=92?= =?UTF-8?q?=E5=BA=8F=E6=95=B0=E7=BB=84=E4=B8=AD=E6=9F=A5=E6=89=BE=E5=85=83?= =?UTF-8?q?=E7=B4=A0=E7=9A=84=E7=AC=AC=E4=B8=80=E4=B8=AA=E5=92=8C=E6=9C=80?= =?UTF-8?q?=E5=90=8E=E4=B8=80=E4=B8=AA=E4=BD=8D=E7=BD=AE.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加力扣原题链接 --- ...\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" | 2 ++ 1 file changed, 2 insertions(+) diff --git "a/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" "b/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" index 260462c23b..b6e82262ff 100644 --- "a/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" +++ "b/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" @@ -7,6 +7,8 @@ # 34. 在排序数组中查找元素的第一个和最后一个位置 +[力扣链接](https://leetcode.cn/problems/find-first-and-last-position-of-element-in-sorted-array/) + 给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。 如果数组中不存在目标值 target,返回 [-1, -1]。 From 0a3a2d4ae2213cad03d8f339f09f4e9de7420998 Mon Sep 17 00:00:00 2001 From: Rinko Taketsuki <33001553+RinkoTaketsuki@users.noreply.github.com> Date: Mon, 13 Jun 2022 09:27:00 +0800 Subject: [PATCH 0849/3019] =?UTF-8?q?Update=200459.=E9=87=8D=E5=A4=8D?= =?UTF-8?q?=E7=9A=84=E5=AD=90=E5=AD=97=E7=AC=A6=E4=B8=B2.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" "b/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" index a51c68eea7..1d8a0e643c 100644 --- "a/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" @@ -49,7 +49,7 @@ 数组长度为:len。 -如果len % (len - (next[len - 1] + 1)) == 0 ,则说明 (数组长度-最长相等前后缀的长度) 正好可以被 数组的长度整除,说明有该字符串有重复的子字符串。 +如果len % (len - (next[len - 1] + 1)) == 0 ,则说明数组的长度正好可以被 (数组长度-最长相等前后缀的长度) 整除 ,说明该字符串有重复的子字符串。 **数组长度减去最长相同前后缀的长度相当于是第一个周期的长度,也就是一个周期的长度,如果这个周期可以被整除,就说明整个数组就是这个周期的循环。** From 2c1aa6ebf83cca21a8c6536922f2d652fa45c5cc Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Mon, 13 Jun 2022 17:23:30 +0800 Subject: [PATCH 0850/3019] Update --- ...2.\345\277\253\344\271\220\346\225\260.md" | 1 + ...04\345\255\220\346\225\260\347\273\204.md" | 29 +++++++++++++++---- ...04\347\232\204\344\272\244\351\233\206.md" | 2 ++ ...3.\350\265\216\351\207\221\344\277\241.md" | 1 + ...\346\225\260\347\233\270\345\212\240II.md" | 1 + problems/qita/server.md | 3 ++ 6 files changed, 31 insertions(+), 6 deletions(-) diff --git "a/problems/0202.\345\277\253\344\271\220\346\225\260.md" "b/problems/0202.\345\277\253\344\271\220\346\225\260.md" index be8686f7e1..7738b2f695 100644 --- "a/problems/0202.\345\277\253\344\271\220\346\225\260.md" +++ "b/problems/0202.\345\277\253\344\271\220\346\225\260.md" @@ -417,6 +417,7 @@ object Solution { } sum } +``` C#: diff --git "a/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" "b/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" index fbef7692cd..69e0da4f1d 100644 --- "a/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" +++ "b/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" @@ -5,7 +5,7 @@

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

-## 209.长度最小的子数组 +# 209.长度最小的子数组 [力扣题目链接](https://leetcode-cn.com/problems/minimum-size-subarray-sum/) @@ -17,6 +17,9 @@ 输出:2 解释:子数组 [4,3] 是该条件下的长度最小的子数组。 +# 思路 + +为了易于大家理解,我特意录制了[拿下滑动窗口! | LeetCode 209 长度最小的子数组](https://www.bilibili.com/video/BV1tZ4y1q7XE) ## 暴力解法 @@ -47,8 +50,8 @@ public: } }; ``` -时间复杂度:O(n^2) -空间复杂度:O(1) +* 时间复杂度:O(n^2) +* 空间复杂度:O(1) ## 滑动窗口 @@ -56,6 +59,20 @@ public: 所谓滑动窗口,**就是不断的调节子序列的起始位置和终止位置,从而得出我们要想的结果**。 +在暴力解法中,是一个for循环滑动窗口的起始位置,一个for循环为滑动窗口的终止位置,用两个for循环 完成了一个不断搜索区间的过程。 + +那么滑动窗口如何用一个for循环来完成这个操作呢。 + +首先要思考 如果用一个for循环,那么应该表示 滑动窗口的起始位置,还是终止位置。 + +如果只用一个for循环来表示 滑动窗口的起始位置,那么如何遍历剩下的终止位置? + +此时难免再次陷入 暴力解法的怪圈。 + +所以 只用一个for循环,那么这个循环的索引,一定是表示 滑动窗口的终止位置。 + +那么问题来了, 滑动窗口的起始位置如何移动呢? + 这里还是以题目中的示例来举例,s=7, 数组是 2,3,1,2,4,3,来看一下查找的过程: ![209.长度最小的子数组](https://code-thinking.cdn.bcebos.com/gifs/209.%E9%95%BF%E5%BA%A6%E6%9C%80%E5%B0%8F%E7%9A%84%E5%AD%90%E6%95%B0%E7%BB%84.gif) @@ -74,7 +91,7 @@ public: 窗口的起始位置如何移动:如果当前窗口的值大于s了,窗口就要向前移动了(也就是该缩小了)。 -窗口的结束位置如何移动:窗口的结束位置就是遍历数组的指针,窗口的起始位置设置为数组的起始位置就可以了。 +窗口的结束位置如何移动:窗口的结束位置就是遍历数组的指针,也就是for循环里的索引。 解题的关键在于 窗口的起始位置如何移动,如图所示: @@ -107,8 +124,8 @@ public: }; ``` -时间复杂度:O(n) -空间复杂度:O(1) +* 时间复杂度:O(n) +* 空间复杂度:O(1) **一些录友会疑惑为什么时间复杂度是O(n)**。 diff --git "a/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" "b/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" index f7dab3d7fa..4fbdd41460 100644 --- "a/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" +++ "b/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" @@ -356,6 +356,8 @@ object Solution { } } +``` + C#: ```csharp diff --git "a/problems/0383.\350\265\216\351\207\221\344\277\241.md" "b/problems/0383.\350\265\216\351\207\221\344\277\241.md" index 75dafb7201..9c3dda8c4c 100644 --- "a/problems/0383.\350\265\216\351\207\221\344\277\241.md" +++ "b/problems/0383.\350\265\216\351\207\221\344\277\241.md" @@ -425,6 +425,7 @@ object Solution { true } } +``` C#: diff --git "a/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" "b/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" index bfdee26e29..726fdb1569 100644 --- "a/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" +++ "b/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" @@ -354,6 +354,7 @@ object Solution { res } } +``` C#: ```csharp diff --git a/problems/qita/server.md b/problems/qita/server.md index 16995d703d..1d7a1d6b92 100644 --- a/problems/qita/server.md +++ b/problems/qita/server.md @@ -1,6 +1,9 @@ # 一台服务器有什么用! +* [阿里云活动期间服务器购买](https://www.aliyun.com/minisite/goods?taskCode=shareNew2205&recordId=3641992&userCode=roof0wob) +* [腾讯云活动期间服务器购买](https://curl.qcloud.com/EiaMXllu) + 但在组织这场活动的时候,了解到大家都有一个共同的问题: **这个服务器究竟有啥用??** 这真是一个好问题,而且我一句两句还说不清楚,所以就专门发文来讲一讲。 From 32018ff79afa8fb65cdf69445c9d93a34e648d54 Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Mon, 13 Jun 2022 20:53:11 +0800 Subject: [PATCH 0851/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200135.=E5=88=86?= =?UTF-8?q?=E5=8F=91=E7=B3=96=E6=9E=9C.md=20Scala=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...06\345\217\221\347\263\226\346\236\234.md" | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git "a/problems/0135.\345\210\206\345\217\221\347\263\226\346\236\234.md" "b/problems/0135.\345\210\206\345\217\221\347\263\226\346\236\234.md" index 3456a04c29..a805d0d446 100644 --- "a/problems/0135.\345\210\206\345\217\221\347\263\226\346\236\234.md" +++ "b/problems/0135.\345\210\206\345\217\221\347\263\226\346\236\234.md" @@ -324,6 +324,31 @@ function candy(ratings: number[]): number { }; ``` +### Scala + +```scala +object Solution { + def candy(ratings: Array[Int]): Int = { + var candyVec = new Array[Int](ratings.length) + for (i <- candyVec.indices) candyVec(i) = 1 + // 从前向后 + for (i <- 1 until candyVec.length) { + if (ratings(i) > ratings(i - 1)) { + candyVec(i) = candyVec(i - 1) + 1 + } + } + + // 从后向前 + for (i <- (candyVec.length - 2) to 0 by -1) { + if (ratings(i) > ratings(i + 1)) { + candyVec(i) = math.max(candyVec(i), candyVec(i + 1) + 1) + } + } + + candyVec.sum // 求和 + } +} +``` ----------------------- From 6867c9c5bfd379a2f6e8afb09026cb0e759bc8dc Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Mon, 13 Jun 2022 21:21:22 +0800 Subject: [PATCH 0852/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200860.=E6=9F=A0?= =?UTF-8?q?=E6=AA=AC=E6=B0=B4=E6=89=BE=E9=9B=B6.md=20Scala=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...54\346\260\264\346\211\276\351\233\266.md" | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git "a/problems/0860.\346\237\240\346\252\254\346\260\264\346\211\276\351\233\266.md" "b/problems/0860.\346\237\240\346\252\254\346\260\264\346\211\276\351\233\266.md" index aa09e1c67d..4a676b43a2 100644 --- "a/problems/0860.\346\237\240\346\252\254\346\260\264\346\211\276\351\233\266.md" +++ "b/problems/0860.\346\237\240\346\252\254\346\260\264\346\211\276\351\233\266.md" @@ -328,6 +328,37 @@ function lemonadeChange(bills: number[]): boolean { ``` +### Scala + +```scala +object Solution { + def lemonadeChange(bills: Array[Int]): Boolean = { + var fiveNum = 0 + var tenNum = 0 + + for (i <- bills) { + if (i == 5) fiveNum += 1 + if (i == 10) { + if (fiveNum <= 0) return false + tenNum += 1 + fiveNum -= 1 + } + if (i == 20) { + if (fiveNum > 0 && tenNum > 0) { + tenNum -= 1 + fiveNum -= 1 + } else if (fiveNum >= 3) { + fiveNum -= 3 + } else { + return false + } + } + } + true + } +} +``` + -----------------------
From 17208d89290c4bc10256414393671022b6b96ccf Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Mon, 13 Jun 2022 22:12:49 +0800 Subject: [PATCH 0853/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200406.=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?.md=20Scala=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...15\345\273\272\351\230\237\345\210\227.md" | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git "a/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" "b/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" index 641086a93c..516df7d7fc 100644 --- "a/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" +++ "b/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" @@ -354,8 +354,27 @@ function reconstructQueue(people: number[][]): number[][] { }; ``` +### Scala + +```scala +object Solution { + import scala.collection.mutable + def reconstructQueue(people: Array[Array[Int]]): Array[Array[Int]] = { + val person = people.sortWith((a, b) => { + if (a(0) == b(0)) a(1) < b(1) + else a(0) > b(0) + }) + + var que = mutable.ArrayBuffer[Array[Int]]() + for (per <- person) { + que.insert(per(1), per) + } + que.toArray + } +} +``` ----------------------- From e391bf18f7f0c607a918413d26866a9f376ced1e Mon Sep 17 00:00:00 2001 From: van_fantasy <46948123+sexyxlyWAol@users.noreply.github.com> Date: Mon, 13 Jun 2022 22:44:49 +0800 Subject: [PATCH 0854/3019] =?UTF-8?q?Update=201221.=E5=88=86=E5=89=B2?= =?UTF-8?q?=E5=B9=B3=E8=A1=A1=E5=AD=97=E7=AC=A6=E4=B8=B2.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit added python and go solution to 1221 --- ...41\345\255\227\347\254\246\344\270\262.md" | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git "a/problems/1221.\345\210\206\345\211\262\345\271\263\350\241\241\345\255\227\347\254\246\344\270\262.md" "b/problems/1221.\345\210\206\345\211\262\345\271\263\350\241\241\345\255\227\347\254\246\344\270\262.md" index 1a9b34a29e..e18c6358d8 100644 --- "a/problems/1221.\345\210\206\345\211\262\345\271\263\350\241\241\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/1221.\345\210\206\345\211\262\345\271\263\350\241\241\345\255\227\347\254\246\344\270\262.md" @@ -108,11 +108,38 @@ class Solution { ### Python ```python +class Solution: + def balancedStringSplit(self, s: str) -> int: + diff = 0 #右左差值 + ans = 0 + for c in s: + if c == "L": + diff -= 1 + else: + diff += 1 + if tilt == 0: + ans += 1 + return ans ``` ### Go ```go +func balancedStringSplit(s string) int { + diff := 0 // 右左差值 + ans := 0 + for _, c := range s { + if c == 'L' { + diff-- + }else { + diff++ + } + if diff == 0 { + ans++ + } + } + return ans +} ``` ### JavaScript From 8f52696f2206f2361917aad3e1cc7f87698c5cc0 Mon Sep 17 00:00:00 2001 From: Rinko Taketsuki <33001553+RinkoTaketsuki@users.noreply.github.com> Date: Tue, 14 Jun 2022 09:24:58 +0800 Subject: [PATCH 0855/3019] =?UTF-8?q?Update=200459.=E9=87=8D=E5=A4=8D?= =?UTF-8?q?=E7=9A=84=E5=AD=90=E5=AD=97=E7=AC=A6=E4=B8=B2.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" "b/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" index 1d8a0e643c..ba2fa16023 100644 --- "a/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" @@ -63,7 +63,7 @@ next[len - 1] = 7,next[len - 1] + 1 = 8,8就是此时字符串asdfasdfasdf的最长相同前后缀的长度。 -(len - (next[len - 1] + 1)) 也就是: 12(字符串的长度) - 8(最长公共前后缀的长度) = 4, 4正好可以被 12(字符串的长度) 整除,所以说明有重复的子字符串(asdf)。 +(len - (next[len - 1] + 1)) 也就是: 12(字符串的长度) - 8(最长公共前后缀的长度) = 4, 12 正好可以被 4 整除,所以说明有重复的子字符串(asdf)。 C++代码如下:(这里使用了前缀表统一减一的实现方式) From e8a8db47cfc42380b0979e8efcd7f9908216b2a6 Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Tue, 14 Jun 2022 20:03:34 +0800 Subject: [PATCH 0856/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200452.=E7=94=A8?= =?UTF-8?q?=E6=9C=80=E5=B0=91=E6=95=B0=E9=87=8F=E7=9A=84=E7=AE=AD=E5=BC=95?= =?UTF-8?q?=E7=88=86=E6=B0=94=E7=90=83.md=20Scala=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...25\347\210\206\346\260\224\347\220\203.md" | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git "a/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" "b/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" index d4bbe961ee..e07aa6e699 100644 --- "a/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" +++ "b/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" @@ -288,5 +288,30 @@ impl Solution { } } ``` + +### Scala + +```scala +object Solution { + def findMinArrowShots(points: Array[Array[Int]]): Int = { + if (points.length == 0) return 0 + // 排序 + var point = points.sortWith((a, b) => { + a(0) < b(0) + }) + + var result = 1 // points不为空就至少需要一只箭 + for (i <- 1 until point.length) { + if (point(i)(0) > point(i - 1)(1)) { + result += 1 + } else { + point(i)(1) = math.min(point(i - 1)(1), point(i)(1)) + } + } + result // 返回结果 + } +} +``` + -----------------------
From ece2c3efb6e492529c4c8b9b4be1bdf7fbb1b8b6 Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Tue, 14 Jun 2022 20:45:13 +0800 Subject: [PATCH 0857/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200435.=E6=97=A0?= =?UTF-8?q?=E9=87=8D=E5=8F=A0=E5=8C=BA=E9=97=B4.md=20Scala=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...15\345\217\240\345\214\272\351\227\264.md" | 22 ++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git "a/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" "b/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" index 66aa124475..6313bc447d 100644 --- "a/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" +++ "b/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" @@ -352,7 +352,27 @@ function eraseOverlapIntervals(intervals: number[][]): number { }; ``` - +### Scala + +```scala +object Solution { + def eraseOverlapIntervals(intervals: Array[Array[Int]]): Int = { + var result = 0 + var interval = intervals.sortWith((a, b) => { + a(1) < b(1) + }) + var edge = Int.MinValue + for (i <- 0 until interval.length) { + if (edge <= interval(i)(0)) { + edge = interval(i)(1) + } else { + result += 1 + } + } + result + } +} +``` From 94350c0c99107f5343a589d36382e52a8a3c0059 Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Tue, 14 Jun 2022 22:26:56 +0800 Subject: [PATCH 0858/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200763.=E5=88=92?= =?UTF-8?q?=E5=88=86=E5=AD=97=E6=AF=8D=E5=8C=BA=E9=97=B4.md=20Scala?= =?UTF-8?q?=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...27\346\257\215\345\214\272\351\227\264.md" | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git "a/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" "b/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" index 2f4d1b4861..f7b16f5ccd 100644 --- "a/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" +++ "b/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" @@ -317,7 +317,31 @@ function partitionLabels(s: string): number[] { }; ``` +### Scala + +```scala +object Solution { + import scala.collection.mutable + def partitionLabels(s: String): List[Int] = { + var hash = new Array[Int](26) + for (i <- s.indices) { + hash(s(i) - 'a') = i + } + + var res = mutable.ListBuffer[Int]() + var (left, right) = (0, 0) + for (i <- s.indices) { + right = math.max(hash(s(i) - 'a'), right) + if (i == right) { + res.append(right - left + 1) + left = i + 1 + } + } + res.toList + } +} +``` ----------------------- From eddfde7c1cb4c7db4c11f7d6c76b8a732a65d313 Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Wed, 15 Jun 2022 22:25:35 +0800 Subject: [PATCH 0859/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200056.=E5=90=88?= =?UTF-8?q?=E5=B9=B6=E5=8C=BA=E9=97=B4.md=20Scala=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...10\345\271\266\345\214\272\351\227\264.md" | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git "a/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" "b/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" index e444a22111..38e3472cf6 100644 --- "a/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" +++ "b/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" @@ -286,7 +286,37 @@ function merge(intervals: number[][]): number[][] { }; ``` +### Scala +```scala +object Solution { + import scala.collection.mutable + def merge(intervals: Array[Array[Int]]): Array[Array[Int]] = { + var res = mutable.ArrayBuffer[Array[Int]]() + + // 排序 + var interval = intervals.sortWith((a, b) => { + a(0) < b(0) + }) + + var left = interval(0)(0) + var right = interval(0)(1) + + for (i <- 1 until interval.length) { + if (interval(i)(0) <= right) { + left = math.min(left, interval(i)(0)) + right = math.max(right, interval(i)(1)) + } else { + res.append(Array[Int](left, right)) + left = interval(i)(0) + right = interval(i)(1) + } + } + res.append(Array[Int](left, right)) + res.toArray // 返回res的Array形式 + } +} +``` -----------------------
From 23c26135135f39757932a158d5c4b9f00f4bfe3b Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Wed, 15 Jun 2022 23:15:29 +0800 Subject: [PATCH 0860/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200738.=E5=8D=95?= =?UTF-8?q?=E8=B0=83=E9=80=92=E5=A2=9E=E7=9A=84=E6=95=B0=E5=AD=97.md=20Sca?= =?UTF-8?q?la=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...36\347\232\204\346\225\260\345\255\227.md" | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git "a/problems/0738.\345\215\225\350\260\203\351\200\222\345\242\236\347\232\204\346\225\260\345\255\227.md" "b/problems/0738.\345\215\225\350\260\203\351\200\222\345\242\236\347\232\204\346\225\260\345\255\227.md" index 4e4079a76e..2911e1cc64 100644 --- "a/problems/0738.\345\215\225\350\260\203\351\200\222\345\242\236\347\232\204\346\225\260\345\255\227.md" +++ "b/problems/0738.\345\215\225\350\260\203\351\200\222\345\242\236\347\232\204\346\225\260\345\255\227.md" @@ -246,7 +246,37 @@ function monotoneIncreasingDigits(n: number): number { ``` +### Scala + +直接转换为了整数数组: +```scala +object Solution { + import scala.collection.mutable + def monotoneIncreasingDigits(n: Int): Int = { + var digits = mutable.ArrayBuffer[Int]() + // 提取每位数字 + var temp = n // 因为 参数n 是不可变量所以需要赋值给一个可变量 + while (temp != 0) { + digits.append(temp % 10) + temp = temp / 10 + } + // 贪心 + var flag = -1 + for (i <- 0 until (digits.length - 1) if digits(i) < digits(i + 1)) { + flag = i + digits(i + 1) -= 1 + } + for (i <- 0 to flag) digits(i) = 9 + // 拼接 + var res = 0 + for (i <- 0 until digits.length) { + res += digits(i) * math.pow(10, i).toInt + } + res + } +} +``` -----------------------
From cff9cf34b0725b43598c82faccda24d83e0a06ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=96=9D=E9=86=89=E7=9A=84=E7=8E=A9=E5=85=B7=E7=86=8A=5F?= =?UTF-8?q?=E7=8E=8B=E5=9D=87=E7=A5=A5?= <1033076925@qq.com> Date: Thu, 16 Jun 2022 13:16:02 +0800 Subject: [PATCH 0861/3019] =?UTF-8?q?=E4=BF=AE=E6=AD=A30035.=E6=90=9C?= =?UTF-8?q?=E7=B4=A2=E6=8F=92=E5=85=A5=E4=BD=8D=E7=BD=AE=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 --- ...\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" "b/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" index 5cf44ded55..aef091af28 100644 --- "a/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" +++ "b/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" @@ -142,7 +142,7 @@ public: ``` * 时间复杂度:O(log n) -* 时间复杂度:O(1) +* 空间复杂度:O(1) 效率如下: ![35_搜索插入位置2](https://img-blog.csdnimg.cn/2020121623272877.png) From a031937e874267a3a4dcbaf42eba272b244fc0fc Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Thu, 16 Jun 2022 22:32:13 +0800 Subject: [PATCH 0862/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200714.=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=E5=90=AB=E6=89=8B=E7=BB=AD=E8=B4=B9.md=20Scala?= =?UTF-8?q?=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...53\346\211\213\347\273\255\350\264\271.md" | 34 +++++++++++++++---- 1 file changed, 27 insertions(+), 7 deletions(-) diff --git "a/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271.md" "b/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271.md" index b27631c68c..4bc21a7003 100644 --- "a/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271.md" +++ "b/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271.md" @@ -153,7 +153,7 @@ public: ## 其他语言版本 -Java: +### Java ```java // 贪心思路 class Solution { @@ -198,7 +198,7 @@ class Solution { // 动态规划 -Python: +### Python ```python class Solution: # 贪心思路 @@ -216,7 +216,7 @@ class Solution: # 贪心思路 return result ``` -Go: +### Go ```golang func maxProfit(prices []int, fee int) int { var minBuy int = prices[0] //第一天买入 @@ -241,7 +241,7 @@ func maxProfit(prices []int, fee int) int { return res } ``` -Javascript: +### Javascript ```Javascript // 贪心思路 var maxProfit = function(prices, fee) { @@ -293,7 +293,7 @@ var maxProfit = function(prices, fee) { }; ``` -TypeScript: +### TypeScript > 贪心 @@ -335,8 +335,28 @@ function maxProfit(prices: number[], fee: number): number { }; ``` - - +### Scala + +贪心思路: + +```scala +object Solution { + def maxProfit(prices: Array[Int], fee: Int): Int = { + var result = 0 + var minPrice = prices(0) + for (i <- 1 until prices.length) { + if (prices(i) < minPrice) { + minPrice = prices(i) // 比当前最小值还小 + } + if (prices(i) > minPrice + fee) { + result += prices(i) - minPrice - fee + minPrice = prices(i) - fee + } + } + result + } +} +``` -----------------------
From 0b9737d7541870e8f68d728fd0a0197d281b4c1d Mon Sep 17 00:00:00 2001 From: JaneyLin <105125897+janeyziqinglin@users.noreply.github.com> Date: Thu, 16 Jun 2022 21:24:24 -0500 Subject: [PATCH 0863/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A00028.=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0strStr=20python=E7=89=88=E6=9C=AC=E6=9A=B4=E5=8A=9B?= =?UTF-8?q?=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0028.\345\256\236\347\216\260strStr.md" | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git "a/problems/0028.\345\256\236\347\216\260strStr.md" "b/problems/0028.\345\256\236\347\216\260strStr.md" index 1cdd5292a9..00997907ff 100644 --- "a/problems/0028.\345\256\236\347\216\260strStr.md" +++ "b/problems/0028.\345\256\236\347\216\260strStr.md" @@ -685,7 +685,21 @@ class Solution { ``` Python3: - +```python +//暴力解法: +class Solution(object): + def strStr(self, haystack, needle): + """ + :type haystack: str + :type needle: str + :rtype: int + """ + m,n=len(haystack),len(needle) + for i in range(m): + if haystack[i:i+n]==needle: + return i + return -1 +``` ```python // 方法一 class Solution: From fdd646e0e168aff1cd2772c0bca76cb062cd265c Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Fri, 17 Jun 2022 16:55:39 +0800 Subject: [PATCH 0864/3019] Update --- ...0\236\272\346\227\213\347\237\251\351\230\265II.md" | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git "a/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" "b/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" index 2222930212..bec5be08c6 100644 --- "a/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" +++ "b/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" @@ -24,6 +24,8 @@ ## 思路 +为了利于录友们理解,我特意录制了视频,[拿下螺旋矩阵,《代码随想录》第五题!](https://www.bilibili.com/video/BV1SL4y1N7mV),结合本篇文章一起看,效果更佳。 + 这道题目可以说在面试中出现频率较高的题目,**本题并不涉及到什么算法,就是模拟过程,但却十分考察对代码的掌控能力。** 要如何画出这个螺旋排列的正方形矩阵呢? @@ -74,7 +76,7 @@ public: int loop = n / 2; // 每个圈循环几次,例如n为奇数3,那么loop = 1 只是循环一圈,矩阵中间的值需要单独处理 int mid = n / 2; // 矩阵中间的位置,例如:n为3, 中间的位置就是(1,1),n为5,中间位置为(2, 2) int count = 1; // 用来给矩阵中每一个空格赋值 - int offset = 1; // 每一圈循环,需要控制每一条边遍历的长度 + int offset = 1; // 需要控制每一条边遍历的长度,每次循环右边界收缩一位 int i,j; while (loop --) { i = startx; @@ -82,11 +84,11 @@ public: // 下面开始的四个for就是模拟转了一圈 // 模拟填充上行从左到右(左闭右开) - for (j = starty; j < starty + n - offset; j++) { + for (j = starty; j < n - offset; j++) { res[startx][j] = count++; } // 模拟填充右列从上到下(左闭右开) - for (i = startx; i < startx + n - offset; i++) { + for (i = startx; i < n - offset; i++) { res[i][j] = count++; } // 模拟填充下行从右到左(左闭右开) @@ -103,7 +105,7 @@ public: starty++; // offset 控制每一圈里每一条边遍历的长度 - offset += 2; + offset += 1; } // 如果n为奇数的话,需要单独给矩阵最中间的位置赋值 From da559f0ef013bb0503919bda084b244975a73ed6 Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Sat, 18 Jun 2022 19:17:49 +0800 Subject: [PATCH 0865/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200968.=E7=9B=91?= =?UTF-8?q?=E6=8E=A7=E4=BA=8C=E5=8F=89=E6=A0=91.md=20Scala=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...47\344\272\214\345\217\211\346\240\221.md" | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git "a/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" "b/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" index 9a510a1b79..6c957eb20c 100644 --- "a/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" @@ -544,5 +544,40 @@ int minCameraCover(struct TreeNode* root){ } ``` +### Scala + +```scala +object Solution { + def minCameraCover(root: TreeNode): Int = { + var result = 0 + def traversal(cur: TreeNode): Int = { + // 空节点,该节点有覆盖 + if (cur == null) return 2 + var left = traversal(cur.left) + var right = traversal(cur.right) + // 情况1,左右节点都有覆盖 + if (left == 2 && right == 2) { + return 0 + } + // 情况2 + if (left == 0 || right == 0) { + result += 1 + return 1 + } + // 情况3 + if (left == 1 || right == 1) { + return 2 + } + -1 + } + + if (traversal(root) == 0) { + result += 1 + } + result + } +} +``` + -----------------------
From cf0affde0826eedf6328cf383d89d70028bf43a6 Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Sat, 18 Jun 2022 19:30:51 +0800 Subject: [PATCH 0866/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200509.=E6=96=90?= =?UTF-8?q?=E6=B3=A2=E9=82=A3=E5=A5=91=E6=95=B0.md=20Scala=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...42\351\202\243\345\245\221\346\225\260.md" | 30 ++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git "a/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" "b/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" index 1d17784d43..d8e4e1d7f8 100644 --- "a/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" +++ "b/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" @@ -245,7 +245,7 @@ var fib = function(n) { }; ``` -TypeScript +### TypeScript ```typescript function fib(n: number): number { @@ -324,5 +324,33 @@ pub fn fib(n: i32) -> i32 { return fib(n - 1) + fib(n - 2); } ``` + +### Scala + +动态规划: +```scala +object Solution { + def fib(n: Int): Int = { + if (n <= 1) return n + var dp = new Array[Int](n + 1) + dp(1) = 1 + for (i <- 2 to n) { + dp(i) = dp(i - 1) + dp(i - 2) + } + dp(n) + } +} +``` + +递归: +```scala +object Solution { + def fib(n: Int): Int = { + if (n <= 1) return n + fib(n - 1) + fib(n - 2) + } +} +``` + -----------------------
From 5985aae83ce72f2d25b4976a836c1a5fd39ac1ef Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Sat, 18 Jun 2022 19:37:35 +0800 Subject: [PATCH 0867/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200070.=E7=88=AC?= =?UTF-8?q?=E6=A5=BC=E6=A2=AF.md=20Scala=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...0.\347\210\254\346\245\274\346\242\257.md" | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git "a/problems/0070.\347\210\254\346\245\274\346\242\257.md" "b/problems/0070.\347\210\254\346\245\274\346\242\257.md" index 34d414413a..097466b03a 100644 --- "a/problems/0070.\347\210\254\346\245\274\346\242\257.md" +++ "b/problems/0070.\347\210\254\346\245\274\346\242\257.md" @@ -401,6 +401,38 @@ int climbStairs(int n){ } ``` +### Scala + +```scala +object Solution { + def climbStairs(n: Int): Int = { + if (n <= 2) return n + var dp = new Array[Int](n + 1) + dp(1) = 1 + dp(2) = 2 + for (i <- 3 to n) { + dp(i) = dp(i - 1) + dp(i - 2) + } + dp(n) + } +} +``` + +优化空间复杂度: +```scala +object Solution { + def climbStairs(n: Int): Int = { + if (n <= 2) return n + var (a, b) = (1, 2) + for (i <- 3 to n) { + var tmp = a + b + a = b + b = tmp + } + b // 最终返回b + } +} +``` -----------------------
From 6e92cd2417dea438d7671140fd73298a4b598c93 Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Sat, 18 Jun 2022 20:12:19 +0800 Subject: [PATCH 0868/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200746.=E4=BD=BF?= =?UTF-8?q?=E7=94=A8=E6=9C=80=E5=B0=8F=E8=8A=B1=E8=B4=B9=E7=88=AC=E6=A5=BC?= =?UTF-8?q?=E6=A2=AF.md=20Scala=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...71\347\210\254\346\245\274\346\242\257.md" | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git "a/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" "b/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" index 5931fc8ac8..abaeb9800f 100644 --- "a/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" +++ "b/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" @@ -305,5 +305,35 @@ int minCostClimbingStairs(int* cost, int costSize){ return dp[i-1] < dp[i-2] ? dp[i-1] : dp[i-2]; } ``` + +### Scala + +```scala +object Solution { + def minCostClimbingStairs(cost: Array[Int]): Int = { + var dp = new Array[Int](cost.length) + dp(0) = cost(0) + dp(1) = cost(1) + for (i <- 2 until cost.length) { + dp(i) = math.min(dp(i - 1), dp(i - 2)) + cost(i) + } + math.min(dp(cost.length - 1), dp(cost.length - 2)) + } +} +``` + +第二种思路: dp[i] 表示爬到第i-1层所需的最小花费,状态转移方程为: dp[i] = min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2]) +```scala +object Solution { + def minCostClimbingStairs(cost: Array[Int]): Int = { + var dp = new Array[Int](cost.length + 1) + for (i <- 2 until cost.length + 1) { + dp(i) = math.min(dp(i - 1) + cost(i - 1), dp(i - 2) + cost(i - 2)) + } + dp(cost.length) + } +} +``` + -----------------------
From 8e27191aec0f9c377fe79b61a1b6deffa2af5fe4 Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Sat, 18 Jun 2022 20:29:53 +0800 Subject: [PATCH 0869/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200062.=E4=B8=8D?= =?UTF-8?q?=E5=90=8C=E8=B7=AF=E5=BE=84.md=20Scala=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...0\215\345\220\214\350\267\257\345\276\204.md" | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git "a/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" "b/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" index f59b7be8bc..cccda7f120 100644 --- "a/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" +++ "b/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" @@ -412,5 +412,21 @@ int uniquePaths(int m, int n){ } ``` +### Scala + +```scala +object Solution { + def uniquePaths(m: Int, n: Int): Int = { + var dp = Array.ofDim[Int](m, n) + for (i <- 0 until m) dp(i)(0) = 1 + for (j <- 1 until n) dp(0)(j) = 1 + for (i <- 1 until m; j <- 1 until n) { + dp(i)(j) = dp(i - 1)(j) + dp(i)(j - 1) + } + dp(m - 1)(n - 1) + } +} +``` + -----------------------
From a9de01b83c02ab57181b52df37f4252b5709772f Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Sat, 18 Jun 2022 20:49:46 +0800 Subject: [PATCH 0870/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200063.=E4=B8=8D?= =?UTF-8?q?=E5=90=8C=E8=B7=AF=E5=BE=84II.md=20Scala=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\345\220\214\350\267\257\345\276\204II.md" | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git "a/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" "b/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" index 59c60156b8..88fce505af 100644 --- "a/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" +++ "b/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" @@ -440,5 +440,37 @@ int uniquePathsWithObstacles(int** obstacleGrid, int obstacleGridSize, int* obst } ``` +### Scala + +```scala +object Solution { + import scala.util.control.Breaks._ + def uniquePathsWithObstacles(obstacleGrid: Array[Array[Int]]): Int = { + var (m, n) = (obstacleGrid.length, obstacleGrid(0).length) + var dp = Array.ofDim[Int](m, n) + + // 比如break、continue这些流程控制需要使用breakable + breakable( + for (i <- 0 until m) { + if (obstacleGrid(i)(0) != 1) dp(i)(0) = 1 + else break() + } + ) + breakable( + for (j <- 0 until n) { + if (obstacleGrid(0)(j) != 1) dp(0)(j) = 1 + else break() + } + ) + + for (i <- 1 until m; j <- 1 until n; if obstacleGrid(i)(j) != 1) { + dp(i)(j) = dp(i - 1)(j) + dp(i)(j - 1) + } + + dp(m - 1)(n - 1) + } +} +``` + -----------------------
From 568e36bae8ba2f2812a47a2d7548b9ebd20041b5 Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Sat, 18 Jun 2022 21:45:03 +0800 Subject: [PATCH 0871/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200343.=E6=95=B4?= =?UTF-8?q?=E6=95=B0=E6=8B=86=E5=88=86.md=20Scala=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\264\346\225\260\346\213\206\345\210\206.md" | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git "a/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" "b/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" index 279f1d7182..9166f2cbb9 100644 --- "a/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" +++ "b/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" @@ -335,5 +335,22 @@ int integerBreak(int n){ } ``` +### Scala + +```scala +object Solution { + def integerBreak(n: Int): Int = { + var dp = new Array[Int](n + 1) + dp(2) = 1 + for (i <- 3 to n) { + for (j <- 1 until i - 1) { + dp(i) = math.max(dp(i), math.max(j * (i - j), j * dp(i - j))) + } + } + dp(n) + } +} +``` + -----------------------
From 374190e2232ec9daeffe20660d1020199a17c10b Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Sat, 18 Jun 2022 22:25:08 +0800 Subject: [PATCH 0872/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200096.=E4=B8=8D?= =?UTF-8?q?=E5=90=8C=E7=9A=84=E4=BA=8C=E5=8F=89=E6=90=9C=E7=B4=A2=E6=A0=91?= =?UTF-8?q?.md=20Scala=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...11\346\220\234\347\264\242\346\240\221.md" | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git "a/problems/0096.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0096.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" index 25561b506a..a33421ae60 100644 --- "a/problems/0096.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" +++ "b/problems/0096.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" @@ -227,7 +227,7 @@ const numTrees =(n) => { }; ``` -TypeScript +### TypeScript ```typescript function numTrees(n: number): number { @@ -282,5 +282,22 @@ int numTrees(int n){ } ``` +### Scala + +```scala +object Solution { + def numTrees(n: Int): Int = { + var dp = new Array[Int](n + 1) + dp(0) = 1 + for (i <- 1 to n) { + for (j <- 1 to i) { + dp(i) += dp(j - 1) * dp(i - j) + } + } + dp(n) + } +} +``` + -----------------------
From cbaa9df25b535c7b1ff040bdc30631603e1cd3f7 Mon Sep 17 00:00:00 2001 From: JaneyLin <105125897+janeyziqinglin@users.noreply.github.com> Date: Sat, 18 Jun 2022 16:58:58 -0500 Subject: [PATCH 0873/3019] =?UTF-8?q?=E4=BC=98=E5=8C=960925.=E9=95=BF?= =?UTF-8?q?=E6=8C=89=E9=94=AE=E5=85=A5python=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...77\346\214\211\351\224\256\345\205\245.md" | 38 ++++++++----------- 1 file changed, 15 insertions(+), 23 deletions(-) diff --git "a/problems/0925.\351\225\277\346\214\211\351\224\256\345\205\245.md" "b/problems/0925.\351\225\277\346\214\211\351\224\256\345\205\245.md" index 0ef5a3d7f3..7aab71a2fc 100644 --- "a/problems/0925.\351\225\277\346\214\211\351\224\256\345\205\245.md" +++ "b/problems/0925.\351\225\277\346\214\211\351\224\256\345\205\245.md" @@ -129,29 +129,21 @@ class Solution { ``` ### Python ```python -class Solution: - def isLongPressedName(self, name: str, typed: str) -> bool: - i, j = 0, 0 - m, n = len(name) , len(typed) - while i< m and j < n: - if name[i] == typed[j]: # 相同时向后匹配 - i += 1 - j += 1 - else: # 不相同 - if j == 0: return False # 如果第一位不相同,直接返回false - # 判断边界为n-1,若为n会越界,例如name:"kikcxmvzi" typed:"kiikcxxmmvvzzz" - while j < n - 1 and typed[j] == typed[j-1]: j += 1 - if name[i] == typed[j]: - i += 1 - j += 1 - else: return False - # 说明name没有匹配完 - if i < m: return False - # 说明type没有匹配完 - while j < n: - if typed[j] == typed[j-1]: j += 1 - else: return False - return True + i = j = 0 + while(i Date: Sun, 19 Jun 2022 21:20:49 +0800 Subject: [PATCH 0874/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20=E8=83=8C?= =?UTF-8?q?=E5=8C=85=E7=90=86=E8=AE=BA=E5=9F=BA=E7=A1=8001=E8=83=8C?= =?UTF-8?q?=E5=8C=85-1.md=20Scala=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...47\241\20001\350\203\214\345\214\205-1.md" | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" index a40a92aba6..f991666764 100644 --- "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" +++ "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" @@ -498,7 +498,41 @@ const size = 4; console.log(testWeightBagProblem(weight, value, size)); ``` +### Scala +```scala +object Solution { + // 01背包 + def test_2_wei_bag_problem1(): Unit = { + var weight = Array[Int](1, 3, 4) + var value = Array[Int](15, 20, 30) + var baseweight = 4 + + // 二维数组 + var dp = Array.ofDim[Int](weight.length, baseweight + 1) + + // 初始化 + for (j <- weight(0) to baseweight) { + dp(0)(j) = value(0) + } + + // 遍历 + for (i <- 1 until weight.length; j <- 1 to baseweight) { + if (j - weight(i) >= 0) dp(i)(j) = dp(i - 1)(j - weight(i)) + value(i) + dp(i)(j) = math.max(dp(i)(j), dp(i - 1)(j)) + } + + // 打印数组 + dp.foreach(x => println("[" + x.mkString(",") + "]")) + + dp(weight.length - 1)(baseweight) // 最终返回 + } + + def main(args: Array[String]): Unit = { + test_2_wei_bag_problem1() + } +} +``` -----------------------
From a2d340b00279aac08df7cbba7a5733416dc28920 Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Sun, 19 Jun 2022 21:32:10 +0800 Subject: [PATCH 0875/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20=E8=83=8C?= =?UTF-8?q?=E5=8C=85=E7=90=86=E8=AE=BA=E5=9F=BA=E7=A1=8001=E8=83=8C?= =?UTF-8?q?=E5=8C=85-2.md=20Scala=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...47\241\20001\350\203\214\345\214\205-2.md" | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" index b66b74a671..81e61be42d 100644 --- "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" +++ "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" @@ -375,7 +375,33 @@ console.log(testWeightBagProblem(weight, value, size)); ``` +### Scala + +```scala +object Solution { + // 滚动数组 + def test_1_wei_bag_problem(): Unit = { + var weight = Array[Int](1, 3, 4) + var value = Array[Int](15, 20, 30) + var baseweight = 4 + + // dp数组 + var dp = new Array[Int](baseweight + 1) + + // 遍历 + for (i <- 0 until weight.length; j <- baseweight to weight(i) by -1) { + dp(j) = math.max(dp(j), dp(j - weight(i)) + value(i)) + } + + // 打印数组 + println("[" + dp.mkString(",") + "]") + } + def main(args: Array[String]): Unit = { + test_1_wei_bag_problem() + } +} +``` -----------------------
From 1739379b3d31dfe41b519ee4f2eca3da03e53b79 Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Sun, 19 Jun 2022 21:57:51 +0800 Subject: [PATCH 0876/3019] =?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.md=20Scala?= =?UTF-8?q?=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...11\345\222\214\345\255\220\351\233\206.md" | 55 +++++++++++++++++-- 1 file changed, 49 insertions(+), 6 deletions(-) diff --git "a/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" "b/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" index eb6601e184..e14287e6c9 100644 --- "a/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" +++ "b/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" @@ -183,7 +183,7 @@ public: ## 其他语言版本 -Java: +### Java: ```Java class Solution { public boolean canPartition(int[] nums) { @@ -316,7 +316,7 @@ class Solution { } } ``` -Python: +### Python: ```python class Solution: def canPartition(self, nums: List[int]) -> bool: @@ -329,7 +329,7 @@ class Solution: dp[j] = max(dp[j], dp[j - nums[i]] + nums[i]) return target == dp[target] ``` -Go: +### Go: ```go // 分割等和子集 动态规划 // 时间复杂度O(n^2) 空间复杂度O(n) @@ -397,7 +397,7 @@ func canPartition(nums []int) bool { } ``` -javaScript: +### javaScript: ```js var canPartition = function(nums) { @@ -417,7 +417,7 @@ var canPartition = function(nums) { ``` -C: +### C: 二维dp: ```c /** @@ -518,7 +518,7 @@ bool canPartition(int* nums, int numsSize){ } ``` -TypeScript: +### TypeScript: > 一维数组,简洁 @@ -573,7 +573,50 @@ function canPartition(nums: number[]): boolean { }; ``` +### Scala +滚动数组: +```scala +object Solution { + def canPartition(nums: Array[Int]): Boolean = { + var sum = nums.sum + if (sum % 2 != 0) return false + var half = sum / 2 + var dp = new Array[Int](half + 1) + + // 遍历 + for (i <- 0 until nums.length; j <- half to nums(i) by -1) { + dp(j) = math.max(dp(j), dp(j - nums(i)) + nums(i)) + } + + if (dp(half) == half) true else false + } +} +``` + +二维数组: +```scala +object Solution { + def canPartition(nums: Array[Int]): Boolean = { + var sum = nums.sum + if (sum % 2 != 0) return false + var half = sum / 2 + var dp = Array.ofDim[Int](nums.length, half + 1) + + // 初始化 + for (j <- nums(0) to half) dp(0)(j) = nums(0) + + // 遍历 + for (i <- 1 until nums.length; j <- 1 to half) { + if (j - nums(i) >= 0) dp(i)(j) = nums(i) + dp(i - 1)(j - nums(i)) + dp(i)(j) = math.max(dp(i)(j), dp(i - 1)(j)) + } + + // 如果等于half就返回ture,否则返回false + if (dp(nums.length - 1)(half) == half) true else false + } +} +``` ----------------------- From 910dc88d54a098b374b7c137873e3711710d68f9 Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Sun, 19 Jun 2022 22:50:50 +0800 Subject: [PATCH 0877/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=201049.=E6=9C=80?= =?UTF-8?q?=E5=90=8E=E4=B8=80=E5=9D=97=E7=9F=B3=E5=A4=B4=E7=9A=84=E9=87=8D?= =?UTF-8?q?=E9=87=8FII.md=20Scala=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\347\232\204\351\207\215\351\207\217II.md" | 50 +++++++++++++++++-- 1 file changed, 45 insertions(+), 5 deletions(-) diff --git "a/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" "b/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" index 3d256c3dd1..1e3b958fa4 100644 --- "a/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" +++ "b/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" @@ -152,7 +152,7 @@ public: ## 其他语言版本 -Java: +### Java: 一维数组版本 ```Java @@ -212,7 +212,7 @@ class Solution { ``` -Python: +### Python: ```python class Solution: def lastStoneWeightII(self, stones: List[int]) -> int: @@ -225,7 +225,7 @@ class Solution: return sumweight - 2 * dp[target] ``` -Go: +### Go: ```go func lastStoneWeightII(stones []int) int { // 15001 = 30 * 1000 /2 +1 @@ -254,7 +254,7 @@ func max(a, b int) int { } ``` -JavaScript版本 +### JavaScript ```javascript /** @@ -277,7 +277,7 @@ var lastStoneWeightII = function (stones) { }; ``` -TypeScript: +### TypeScript: ```typescript function lastStoneWeightII(stones: number[]): number { @@ -296,7 +296,47 @@ function lastStoneWeightII(stones: number[]): number { }; ``` +### Scala +滚动数组: +```scala +object Solution { + def lastStoneWeightII(stones: Array[Int]): Int = { + var sum = stones.sum + var half = sum / 2 + var dp = new Array[Int](half + 1) + + // 遍历 + for (i <- 0 until stones.length; j <- half to stones(i) by -1) { + dp(j) = math.max(dp(j), dp(j - stones(i)) + stones(i)) + } + + sum - 2 * dp(half) + } +} +``` + +二维数组: +```scala +object Solution { + def lastStoneWeightII(stones: Array[Int]): Int = { + var sum = stones.sum + var half = sum / 2 + var dp = Array.ofDim[Int](stones.length, half + 1) + + // 初始化 + for (j <- stones(0) to half) dp(0)(j) = stones(0) + + // 遍历 + for (i <- 1 until stones.length; j <- 1 to half) { + if (j - stones(i) >= 0) dp(i)(j) = stones(i) + dp(i - 1)(j - stones(i)) + dp(i)(j) = math.max(dp(i)(j), dp(i - 1)(j)) + } + + sum - 2 * dp(stones.length - 1)(half) + } +} +``` -----------------------
From 4cb3897549197115721472552bbfb46e3848d682 Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Mon, 20 Jun 2022 21:19:31 +0800 Subject: [PATCH 0878/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200494.=E7=9B=AE?= =?UTF-8?q?=E6=A0=87=E5=92=8C.md=20Scala=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...4.\347\233\256\346\240\207\345\222\214.md" | 28 +++++++++++++++---- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git "a/problems/0494.\347\233\256\346\240\207\345\222\214.md" "b/problems/0494.\347\233\256\346\240\207\345\222\214.md" index 8ce1f6f1ae..639f8ee8e2 100644 --- "a/problems/0494.\347\233\256\346\240\207\345\222\214.md" +++ "b/problems/0494.\347\233\256\346\240\207\345\222\214.md" @@ -250,7 +250,7 @@ dp[j] += dp[j - nums[i]]; ## 其他语言版本 -Java: +### Java ```java class Solution { public int findTargetSumWays(int[] nums, int target) { @@ -271,7 +271,7 @@ class Solution { } ``` -Python: +### Python ```python class Solution: def findTargetSumWays(self, nums: List[int], target: int) -> int: @@ -287,7 +287,7 @@ class Solution: return dp[bagSize] ``` -Go: +### Go ```go func findTargetSumWays(nums []int, target int) int { sum := 0 @@ -322,7 +322,7 @@ func abs(x int) int { } ``` -Javascript: +### Javascript ```javascript const findTargetSumWays = (nums, target) => { @@ -351,7 +351,7 @@ const findTargetSumWays = (nums, target) => { }; ``` -TypeScript: +### TypeScript ```typescript function findTargetSumWays(nums: number[], target: number): number { @@ -370,7 +370,25 @@ function findTargetSumWays(nums: number[], target: number): number { }; ``` +### Scala + +```scala +object Solution { + def findTargetSumWays(nums: Array[Int], target: Int): Int = { + var sum = nums.sum + if (math.abs(target) > sum) return 0 // 此时没有方案 + if ((sum + target) % 2 == 1) return 0 // 此时没有方案 + var bagSize = (sum + target) / 2 + var dp = new Array[Int](bagSize + 1) + dp(0) = 1 + for (i <- 0 until nums.length; j <- bagSize to nums(i) by -1) { + dp(j) += dp(j - nums(i)) + } + dp(bagSize) + } +} +``` -----------------------
From 2d9727d6202f802674c3cb399f837b66c05b6350 Mon Sep 17 00:00:00 2001 From: Parker999 Date: Mon, 20 Jun 2022 18:35:43 -0700 Subject: [PATCH 0879/3019] update the dp494 --- "problems/0494.\347\233\256\346\240\207\345\222\214.md" | 1 + 1 file changed, 1 insertion(+) diff --git "a/problems/0494.\347\233\256\346\240\207\345\222\214.md" "b/problems/0494.\347\233\256\346\240\207\345\222\214.md" index 99b768347d..60f721c21a 100644 --- "a/problems/0494.\347\233\256\346\240\207\345\222\214.md" +++ "b/problems/0494.\347\233\256\346\240\207\345\222\214.md" @@ -213,6 +213,7 @@ public: if (abs(S) > sum) return 0; // 此时没有方案 if ((S + sum) % 2 == 1) return 0; // 此时没有方案 int bagSize = (S + sum) / 2; + if(bagsize<0) return 0; vector dp(bagSize + 1, 0); dp[0] = 1; for (int i = 0; i < nums.size(); i++) { From 89c9044bf984ad638d07932f3b9ebe91e2e7589d Mon Sep 17 00:00:00 2001 From: xiaojun <13589818805@163.com> Date: Thu, 23 Jun 2022 15:36:55 +0800 Subject: [PATCH 0880/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=881382.=20?= =?UTF-8?q?=E5=B0=86=E4=BA=8C=E5=8F=89=E6=90=9C=E7=B4=A2=E6=A0=91=E5=8F=98?= =?UTF-8?q?=E5=B9=B3=E8=A1=A1=EF=BC=89=E7=9A=84go=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...21\345\217\230\345\271\263\350\241\241.md" | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git "a/problems/1382.\345\260\206\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\345\217\230\345\271\263\350\241\241.md" "b/problems/1382.\345\260\206\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\345\217\230\345\271\263\350\241\241.md" index 57231ec46b..7c7f84840e 100644 --- "a/problems/1382.\345\260\206\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\345\217\230\345\271\263\350\241\241.md" +++ "b/problems/1382.\345\260\206\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\345\217\230\345\271\263\350\241\241.md" @@ -123,6 +123,46 @@ class Solution: ``` Go: +```go +/** + * Definition for a binary tree node. + * type TreeNode struct { + * Val int + * Left *TreeNode + * Right *TreeNode + * } + */ +func balanceBST(root *TreeNode) *TreeNode { + // 二叉搜索树中序遍历得到有序数组 + nums := []int{} + // 中序递归遍历二叉树 + var travel func(node *TreeNode) + travel = func(node *TreeNode) { + if node == nil { + return + } + travel(node.Left) + nums = append(nums, node.Val) + travel(node.Right) + } + // 二分法保证左右子树高度差不超过一(题目要求返回的仍是二叉搜索树) + var buildTree func(nums []int, left, right int) *TreeNode + buildTree = func(nums []int, left, right int) *TreeNode { + if left > right { + return nil + } + mid := left + (right-left) >> 1 + root := &TreeNode{Val: nums[mid]} + root.Left = buildTree(nums, left, mid-1) + root.Right = buildTree(nums, mid+1, right) + return root + } + travel(root) + return buildTree(nums, 0, len(nums)-1) +} + +``` + JavaScript: ```javascript var balanceBST = function(root) { From beb6805c1d7fd77b66ba0870870fd12228d5a4cf Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 23 Jun 2022 10:29:24 +0100 Subject: [PATCH 0881/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=201049.=E6=9C=80?= =?UTF-8?q?=E5=90=8E=E4=B8=80=E5=9D=97=E7=9F=B3=E5=A4=B4=E7=9A=84=E9=87=8D?= =?UTF-8?q?=E9=87=8F.md=20C=E8=AF=AD=E8=A8=80=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\347\232\204\351\207\215\351\207\217II.md" | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git "a/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" "b/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" index ee0ddef2d1..c49f0a1875 100644 --- "a/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" +++ "b/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" @@ -277,5 +277,36 @@ var lastStoneWeightII = function (stones) { }; ``` +C版本 +```c +#define MAX(a, b) (((a) > (b)) ? (a) : (b)) + +int getSum(int *stones, int stoneSize) { + int sum = 0, i; + for (i = 0; i < stoneSize; ++i) + sum += stones[i]; + return sum; +} + +int lastStoneWeightII(int* stones, int stonesSize){ + int sum = getSum(stones, stonesSize); + int target = sum / 2; + int i, j; + + // 初始化dp数组 + int *dp = (int*)malloc(sizeof(int) * (target + 1)); + memset(dp, 0, sizeof(int) * (target + 1)); + for (j = stones[0]; j <= target; ++j) + dp[j] = stones[0]; + + // 递推公式:dp[j] = max(dp[j], dp[j - stones[i]] + stones[i]) + for (i = 1; i < stonesSize; ++i) { + for (j = target; j >= stones[i]; --j) + dp[j] = MAX(dp[j], dp[j - stones[i]] + stones[i]); + } + return sum - dp[target] - dp[target]; +} +``` + -----------------------
From c99bf39601a06278f9cca2e5f6d61638e23f3ced Mon Sep 17 00:00:00 2001 From: ZongqinWang <1722249371@qq.com> Date: Thu, 23 Jun 2022 21:34:24 +0800 Subject: [PATCH 0882/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200474.=E4=B8=80?= =?UTF-8?q?=E5=92=8C=E9=9B=B6.md=20Scala=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...4.\344\270\200\345\222\214\351\233\266.md" | 83 +++++++++++++++++-- 1 file changed, 78 insertions(+), 5 deletions(-) diff --git "a/problems/0474.\344\270\200\345\222\214\351\233\266.md" "b/problems/0474.\344\270\200\345\222\214\351\233\266.md" index d38ce03f89..d6c598aa9c 100644 --- "a/problems/0474.\344\270\200\345\222\214\351\233\266.md" +++ "b/problems/0474.\344\270\200\345\222\214\351\233\266.md" @@ -163,7 +163,7 @@ public: ## 其他语言版本 -Java: +### Java ```Java class Solution { public int findMaxForm(String[] strs, int m, int n) { @@ -192,7 +192,7 @@ class Solution { } ``` -Python: +### Python ```python class Solution: def findMaxForm(self, strs: List[str], m: int, n: int) -> int: @@ -208,7 +208,7 @@ class Solution: return dp[m][n] ``` -Go: +### Go ```go func findMaxForm(strs []string, m int, n int) int { // 定义数组 @@ -294,7 +294,7 @@ func getMax(a,b int)int{ } ``` -Javascript: +### Javascript ```javascript const findMaxForm = (strs, m, n) => { const dp = Array.from(Array(m+1), () => Array(n+1).fill(0)); @@ -323,7 +323,7 @@ const findMaxForm = (strs, m, n) => { }; ``` -TypeScript: +### TypeScript > 滚动数组,二维数组法 @@ -446,7 +446,80 @@ function isValidSubSet(strs: string[], m: number, n: number): boolean { } ``` +### Scala +背包: +```scala +object Solution { + def findMaxForm(strs: Array[String], m: Int, n: Int): Int = { + var dp = Array.ofDim[Int](m + 1, n + 1) + + var (oneNum, zeroNum) = (0, 0) + + for (str <- strs) { + oneNum = 0 + zeroNum = 0 + for (i <- str.indices) { + if (str(i) == '0') zeroNum += 1 + else oneNum += 1 + } + + for (i <- m to zeroNum by -1) { + for (j <- n to oneNum by -1) { + dp(i)(j) = math.max(dp(i)(j), dp(i - zeroNum)(j - oneNum) + 1) + } + } + } + + dp(m)(n) + } +} +``` + +回溯法(超时): +```scala +object Solution { + import scala.collection.mutable + + var res = Int.MinValue + + def test(str: String): (Int, Int) = { + var (zero, one) = (0, 0) + for (i <- str.indices) { + if (str(i) == '1') one += 1 + else zero += 1 + } + (zero, one) + } + + def travsel(strs: Array[String], path: mutable.ArrayBuffer[String], m: Int, n: Int, startIndex: Int): Unit = { + if (startIndex > strs.length) { + return + } + + res = math.max(res, path.length) + + for (i <- startIndex until strs.length) { + + var (zero, one) = test(strs(i)) + + // 如果0的个数小于m,1的个数小于n,则可以回溯 + if (zero <= m && one <= n) { + path.append(strs(i)) + travsel(strs, path, m - zero, n - one, i + 1) + path.remove(path.length - 1) + } + } + } + + def findMaxForm(strs: Array[String], m: Int, n: Int): Int = { + res = Int.MinValue + var path = mutable.ArrayBuffer[String]() + travsel(strs, path, m, n, 0) + res + } +} +``` -----------------------
From e9edda44e0cf080701614a1df8ab680a264c4e40 Mon Sep 17 00:00:00 2001 From: shutengfei Date: Sat, 25 Jun 2022 15:56:26 +0800 Subject: [PATCH 0883/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880649.Dota2?= =?UTF-8?q?=E5=8F=82=E8=AE=AE=E9=99=A2.md=EF=BC=89=EF=BC=9A=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...a2\345\217\202\350\256\256\351\231\242.md" | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git "a/problems/0649.Dota2\345\217\202\350\256\256\351\231\242.md" "b/problems/0649.Dota2\345\217\202\350\256\256\351\231\242.md" index 6e84c9fde2..264a003a97 100644 --- "a/problems/0649.Dota2\345\217\202\350\256\256\351\231\242.md" +++ "b/problems/0649.Dota2\345\217\202\350\256\256\351\231\242.md" @@ -244,6 +244,44 @@ var predictPartyVictory = function(senateStr) { }; ``` +## TypeScript + +```typescript +function predictPartyVictory(senate: string): string { + // 数量差:Count(Radiant) - Count(Dire) + let deltaRDCnt: number = 0; + let hasR: boolean = true, + hasD: boolean = true; + const senateArr: string[] = senate.split(''); + while (hasR && hasD) { + hasR = false; + hasD = false; + for (let i = 0, length = senateArr.length; i < length; i++) { + if (senateArr[i] === 'R') { + if (deltaRDCnt < 0) { + senateArr[i] = ''; + } else { + hasR = true; + } + deltaRDCnt++; + } else if (senateArr[i] === 'D') { + if (deltaRDCnt > 0) { + senateArr[i] = ''; + } else { + hasD = true; + } + deltaRDCnt--; + } + } + } + return hasR ? 'Radiant' : 'Dire'; +}; +``` + + + + + -----------------------
From dd31d67778cea30688bd60e4e0b23631758538e8 Mon Sep 17 00:00:00 2001 From: lesenelir Date: Sun, 26 Jun 2022 11:24:35 +0800 Subject: [PATCH 0884/3019] =?UTF-8?q?=E4=BF=AE=E6=94=B9=EF=BC=9A(1049.?= =?UTF-8?q?=E6=9C=80=E5=90=8E=E4=B8=80=E5=9D=97=E7=9F=B3=E5=A4=B4=E7=9A=84?= =?UTF-8?q?=E9=87=8D=E9=87=8FII.md):=20=E4=BF=AE=E6=94=B9markdown=E6=96=87?= =?UTF-8?q?=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" | 1 - 1 file changed, 1 deletion(-) diff --git "a/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" "b/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" index f3e7909cb1..1e87848e38 100644 --- "a/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" +++ "b/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" @@ -3,7 +3,6 @@

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

-# 动态规划:最后一块石头的重量 II ## 1049. 最后一块石头的重量 II From 88ca27562e748e004ac75dfd9ad89c2fc8fc7f07 Mon Sep 17 00:00:00 2001 From: Yang Date: Sun, 26 Jun 2022 10:08:22 +0200 Subject: [PATCH 0885/3019] Remove redundant `break` in the for loop MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Remove redundant `break` in the for loop of python script. When the `return` is triggered, the for loop will break automatically. PS: really like your work! Thanks a lot 😄 . --- ...\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" | 2 -- 1 file changed, 2 deletions(-) diff --git "a/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" "b/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" index 8fd9c6048d..f1f7e6cf45 100644 --- "a/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" +++ "b/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" @@ -125,8 +125,6 @@ class Solution: if record[i] != 0: #record数组如果有的元素不为零0,说明字符串s和t 一定是谁多了字符或者谁少了字符。 return False - #如果有一个元素不为零,则可以判断字符串s和t不是字母异位词 - break return True ``` From ffe981fb6c5af5c7400f3b82c455b80ac8333fc0 Mon Sep 17 00:00:00 2001 From: AronJudge <2286381138@qq.com> Date: Sun, 26 Jun 2022 23:50:32 +0800 Subject: [PATCH 0886/3019] =?UTF-8?q?0977.=20=E6=9C=89=E5=BA=8F=E6=95=B0?= =?UTF-8?q?=E7=BB=84=E7=9A=84=E5=B9=B3=E6=96=B9=20=E6=B7=BB=E5=8A=A0Java?= =?UTF-8?q?=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...6\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" | 1 + 1 file changed, 1 insertion(+) diff --git "a/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" "b/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" index 20bdf7b040..d274d7789c 100644 --- "a/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" +++ "b/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" @@ -106,6 +106,7 @@ class Solution { int index = result.length - 1; while (left <= right) { if (nums[left] * nums[left] > nums[right] * nums[right]) { + // 正数的相对位置是不变的, 需要调整的是负数平方后的相对位置 result[index--] = nums[left] * nums[left]; ++left; } else { From 812aeeda30f36c9dfecd16c405b8d8ad8674d865 Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Mon, 27 Jun 2022 09:54:38 +0800 Subject: [PATCH 0887/3019] Update --- .../0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" | 2 +- .../0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" | 2 +- ...\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" | 2 ++ 3 files changed, 4 insertions(+), 2 deletions(-) diff --git "a/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" "b/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" index 6969c2e27e..fb3c1d4560 100644 --- "a/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" @@ -7,7 +7,7 @@ ## 1. 两数之和 -[力扣题目链接](https://leetcode-cn.com/problems/two-sum/) +[力扣题目链接](https://leetcode.cn/problems/two-sum/) 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。 diff --git "a/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" "b/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" index bec5be08c6..bf0a279e25 100644 --- "a/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" +++ "b/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" @@ -8,7 +8,7 @@ ## 59.螺旋矩阵II -[力扣题目链接](https://leetcode-cn.com/problems/spiral-matrix-ii/) +[力扣题目链接](https://leetcode.cn/problems/spiral-matrix-ii/) 给定一个正整数 n,生成一个包含 1 到 n^2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。 diff --git "a/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" "b/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" index fe78ddab7c..975ca42926 100644 --- "a/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" +++ "b/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" @@ -28,6 +28,8 @@ # 思路 +为了方便大家理解,我特意录制了视频:[手把手带你学会操作链表,移除链表元素](https://www.bilibili.com/video/BV18B4y1s7R9),结合视频在看本题解,事半功倍。 + 这里以链表 1 4 2 4 来举例,移除元素4。 ![203_链表删除元素1](https://img-blog.csdnimg.cn/20210316095351161.png) From 1b16a934d662b73403dfb8b8036189a62a60c2eb Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Mon, 27 Jun 2022 09:58:45 +0800 Subject: [PATCH 0888/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=8A=9B=E6=89=A3?= =?UTF-8?q?=E9=93=BE=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...36\346\226\207\345\255\220\344\270\262.md" | 2 +- ...11\346\225\260\344\271\213\345\222\214.md" | 2 +- ...27\346\257\215\347\273\204\345\220\210.md" | 2 +- ...33\346\225\260\344\271\213\345\222\214.md" | 2 +- ...4N\344\270\252\350\212\202\347\202\271.md" | 2 +- ...10\347\232\204\346\213\254\345\217\267.md" | 2 +- ...55\347\232\204\350\212\202\347\202\271.md" | 2 +- ...73\351\231\244\345\205\203\347\264\240.md" | 2 +- .../0028.\345\256\236\347\216\260strStr.md" | 2 +- ...00\344\270\252\346\216\222\345\210\227.md" | 2 +- ...22\345\205\245\344\275\215\347\275\256.md" | 2 +- ...7.\350\247\243\346\225\260\347\213\254.md" | 2 +- ...04\345\220\210\346\200\273\345\222\214.md" | 2 +- ...\345\220\210\346\200\273\345\222\214II.md" | 2 +- ...2.\346\216\245\351\233\250\346\260\264.md" | 2 +- ...\350\267\203\346\270\270\346\210\217II.md" | 2 +- ...6.\345\205\250\346\216\222\345\210\227.md" | 2 +- ...\345\205\250\346\216\222\345\210\227II.md" | 2 +- "problems/0051.N\347\232\207\345\220\216.md" | 2 +- .../0052.N\347\232\207\345\220\216II.md" | 2 +- ...47\345\255\220\345\272\217\345\222\214.md" | 2 +- ...01\350\247\204\345\210\222\357\274\211.md" | 2 +- ...72\346\227\213\347\237\251\351\230\265.md" | 6 +++--- ...63\350\267\203\346\270\270\346\210\217.md" | 2 +- ...10\345\271\266\345\214\272\351\227\264.md" | 2 +- ...15\345\220\214\350\267\257\345\276\204.md" | 2 +- ...\345\220\214\350\267\257\345\276\204II.md" | 2 +- ...0.\347\210\254\346\245\274\346\242\257.md" | 2 +- ...14\345\214\205\347\211\210\346\234\254.md" | 2 +- ...26\350\276\221\350\267\235\347\246\273.md" | 2 +- "problems/0077.\347\273\204\345\220\210.md" | 2 +- ...04\345\220\210\344\274\230\345\214\226.md" | 2 +- "problems/0078.\345\255\220\351\233\206.md" | 2 +- ...47\347\232\204\347\237\251\345\275\242.md" | 2 +- "problems/0090.\345\255\220\351\233\206II.md" | 2 +- ...\345\216\237IP\345\234\260\345\235\200.md" | 2 +- ...11\346\220\234\347\264\242\346\240\221.md" | 2 +- ...11\346\220\234\347\264\242\346\240\221.md" | 2 +- ...70\345\220\214\347\232\204\346\240\221.md" | 2 +- ...60\344\272\214\345\217\211\346\240\221.md" | 2 +- ...02\345\272\217\351\201\215\345\216\206.md" | 20 +++++++++---------- ...00\345\244\247\346\267\261\345\272\246.md" | 4 ++-- ...40\344\272\214\345\217\211\346\240\221.md" | 4 ++-- ...11\346\220\234\347\264\242\346\240\221.md" | 2 +- ...41\344\272\214\345\217\211\346\240\221.md" | 2 +- ...00\345\260\217\346\267\261\345\272\246.md" | 2 +- ...57\345\276\204\346\200\273\345\222\214.md" | 4 ++-- ...04\345\255\220\345\272\217\345\210\227.md" | 2 +- ...02\347\202\271\346\214\207\351\222\210.md" | 2 +- ...00\344\275\263\346\227\266\346\234\272.md" | 2 +- ...\344\275\263\346\227\266\346\234\272II.md" | 2 +- ...01\350\247\204\345\210\222\357\274\211.md" | 2 +- ...344\275\263\346\227\266\346\234\272III.md" | 2 +- ...25\350\257\215\346\216\245\351\276\231.md" | 2 +- ...60\345\255\227\344\271\213\345\222\214.md" | 2 +- ...62\345\233\236\346\226\207\344\270\262.md" | 2 +- ...\345\233\236\346\226\207\344\270\262II.md" | 2 +- ...4.\345\212\240\346\262\271\347\253\231.md" | 2 +- ...06\345\217\221\347\263\226\346\236\234.md" | 2 +- ...25\350\257\215\346\213\206\345\210\206.md" | 2 +- ...\345\275\242\351\223\276\350\241\250II.md" | 2 +- ...76\345\274\217\346\261\202\345\200\274.md" | 2 +- ...14\347\232\204\345\215\225\350\257\215.md" | 4 ++-- ...\344\275\263\346\227\266\346\234\272IV.md" | 2 +- ...23\345\256\266\345\212\253\350\210\215.md" | 2 +- ...2.\345\277\253\344\271\220\346\225\260.md" | 2 +- ...76\350\241\250\345\205\203\347\264\240.md" | 2 +- ...04\345\255\227\347\254\246\344\270\262.md" | 2 +- ...73\350\275\254\351\223\276\350\241\250.md" | 2 +- ...04\345\255\220\346\225\260\347\273\204.md" | 6 +++--- ...\345\256\266\345\212\253\350\210\215II.md" | 2 +- ...345\220\210\346\200\273\345\222\214III.md" | 2 +- ...02\347\202\271\344\270\252\346\225\260.md" | 2 +- ...27\345\256\236\347\216\260\346\240\210.md" | 2 +- ...54\344\272\214\345\217\211\346\240\221.md" | 2 +- ...36\347\216\260\351\230\237\345\210\227.md" | 2 +- ...36\346\226\207\351\223\276\350\241\250.md" | 2 +- ...54\345\205\261\347\245\226\345\205\210.md" | 2 +- ...54\345\205\261\347\245\226\345\205\210.md" | 2 +- ...43\346\234\200\345\244\247\345\200\274.md" | 2 +- ...15\345\274\202\344\275\215\350\257\215.md" | 2 +- ...00\346\234\211\350\267\257\345\276\204.md" | 2 +- ...50\345\271\263\346\226\271\346\225\260.md" | 2 +- ...3.\347\247\273\345\212\250\351\233\266.md" | 2 +- ...07\345\255\220\345\272\217\345\210\227.md" | 2 +- ...53\345\206\267\345\206\273\346\234\237.md" | 2 +- ...66\351\222\261\345\205\221\346\215\242.md" | 2 +- ...11\346\216\222\350\241\214\347\250\213.md" | 2 +- ...345\256\266\345\212\253\350\210\215III.md" | 2 +- ...64\346\225\260\346\213\206\345\210\206.md" | 2 +- ...54\345\255\227\347\254\246\344\270\262.md" | 2 +- ...30\351\242\221\345\205\203\347\264\240.md" | 2 +- ...04\347\232\204\344\272\244\351\233\206.md" | 2 +- ...06\345\212\250\345\272\217\345\210\227.md" | 2 +- ...10\346\200\273\345\222\214\342\205\243.md" | 2 +- ...3.\350\265\216\351\207\221\344\277\241.md" | 2 +- ...55\345\255\220\345\272\217\345\210\227.md" | 2 +- ...66\345\255\220\344\271\213\345\222\214.md" | 2 +- ...15\345\273\272\351\230\237\345\210\227.md" | 2 +- ...11\345\222\214\345\255\220\351\233\206.md" | 2 +- ...15\345\217\240\345\214\272\351\227\264.md" | 2 +- ...55\347\232\204\350\212\202\347\202\271.md" | 2 +- ...25\347\210\206\346\260\224\347\220\203.md" | 2 +- ...\346\225\260\347\233\270\345\212\240II.md" | 2 +- ...06\345\217\221\351\245\274\345\271\262.md" | 2 +- ...20\345\255\227\347\254\246\344\270\262.md" | 2 +- ...77\347\232\204\345\221\250\351\225\277.md" | 2 +- ...4.\344\270\200\345\222\214\351\233\266.md" | 2 +- ...36\345\255\220\345\272\217\345\210\227.md" | 2 +- ...4.\347\233\256\346\240\207\345\222\214.md" | 2 +- ...4\345\244\247\345\205\203\347\264\240I.md" | 2 +- ...55\347\232\204\344\274\227\346\225\260.md" | 2 +- ...\345\244\247\345\205\203\347\264\240II.md" | 2 +- ...42\351\202\243\345\245\221\346\225\260.md" | 2 +- ...13\350\247\222\347\232\204\345\200\274.md" | 2 +- ...07\345\255\220\345\272\217\345\210\227.md" | 2 +- ...\351\222\261\345\205\221\346\215\242II.md" | 2 +- ...17\347\273\235\345\257\271\345\267\256.md" | 2 +- ...72\347\264\257\345\212\240\346\240\221.md" | 2 +- ...\345\255\227\347\254\246\344\270\262II.md" | 2 +- ...40\351\231\244\346\223\215\344\275\234.md" | 2 +- ...66\344\272\214\345\217\211\346\240\221.md" | 2 +- ...36\346\226\207\345\255\220\344\270\262.md" | 2 +- ...a2\345\217\202\350\256\256\351\231\242.md" | 2 +- ...47\344\272\214\345\217\211\346\240\221.md" | 2 +- ...24\345\233\236\345\216\237\347\202\271.md" | 2 +- ...11\346\220\234\347\264\242\346\240\221.md" | 2 +- ...27\347\232\204\344\270\252\346\225\260.md" | 2 +- ...22\345\242\236\345\272\217\345\210\227.md" | 2 +- ...27\344\275\231\350\277\236\346\216\245.md" | 2 +- ...\344\275\231\350\277\236\346\216\245II.md" | 2 +- ...55\347\232\204\346\220\234\347\264\242.md" | 2 +- ...22\345\205\245\346\223\215\344\275\234.md" | 2 +- ...14\345\210\206\346\237\245\346\211\276.md" | 2 +- ...76\350\256\241\351\223\276\350\241\250.md" | 2 +- ...53\346\211\213\347\273\255\350\264\271.md" | 2 +- ...01\350\247\204\345\210\222\357\274\211.md" | 2 +- ...15\345\255\220\346\225\260\347\273\204.md" | 2 +- ...55\345\277\203\347\264\242\345\274\225.md" | 2 +- ...36\347\232\204\346\225\260\345\255\227.md" | 2 +- ...17\346\227\245\346\270\251\345\272\246.md" | 2 +- ...71\347\210\254\346\245\274\346\242\257.md" | 2 +- ...27\346\257\215\345\214\272\351\227\264.md" | 2 +- ...31\345\222\214\346\210\277\351\227\264.md" | 2 +- ...04\345\255\227\347\254\246\344\270\262.md" | 2 +- ...54\346\260\264\346\211\276\351\233\266.md" | 2 +- ...\345\272\217\346\225\260\347\273\204II.md" | 2 +- ...77\346\214\211\351\224\256\345\205\245.md" | 2 +- ...61\350\204\211\346\225\260\347\273\204.md" | 2 +- ...47\344\272\214\345\217\211\346\240\221.md" | 2 +- ...04\347\232\204\345\271\263\346\226\271.md" | 2 +- ...70\347\224\250\345\255\227\347\254\246.md" | 2 +- ...04\346\225\260\347\273\204\345\222\214.md" | 2 +- ...70\344\272\244\347\232\204\347\272\277.md" | 2 +- ...73\351\207\215\345\244\215\351\241\271.md" | 2 +- ...\347\232\204\351\207\215\351\207\217II.md" | 2 +- ...61\345\255\220\345\272\217\345\210\227.md" | 2 +- ...72\347\216\260\346\254\241\346\225\260.md" | 2 +- ...41\345\255\227\347\254\246\344\270\262.md" | 2 +- ...60\347\233\256\346\216\222\345\272\217.md" | 4 ++-- ...27\347\232\204\346\225\260\345\255\227.md" | 2 +- ...21\345\217\230\345\271\263\350\241\241.md" | 2 +- ...55\344\273\243\351\201\215\345\216\206.md" | 6 +++--- ...22\345\275\222\351\201\215\345\216\206.md" | 6 +++--- ...77\346\215\242\347\251\272\346\240\274.md" | 2 +- ...54\345\255\227\347\254\246\344\270\262.md" | 2 +- ...76\350\241\250\347\233\270\344\272\244.md" | 2 +- 167 files changed, 189 insertions(+), 189 deletions(-) diff --git "a/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" "b/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" index eaebb5ab4d..d53acf63e6 100644 --- "a/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" +++ "b/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" @@ -8,7 +8,7 @@ # 5.最长回文子串 -[力扣题目链接](https://leetcode-cn.com/problems/longest-palindromic-substring/) +[力扣题目链接](https://leetcode.cn/problems/longest-palindromic-substring/) 给你一个字符串 s,找到 s 中最长的回文子串。 diff --git "a/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" "b/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" index 1764d244b6..e6dc82ddd7 100644 --- "a/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" @@ -10,7 +10,7 @@ # 第15题. 三数之和 -[力扣题目链接](https://leetcode-cn.com/problems/3sum/) +[力扣题目链接](https://leetcode.cn/problems/3sum/) 给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。 diff --git "a/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" "b/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" index 9413656515..2b5cb978a2 100644 --- "a/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" +++ "b/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" @@ -7,7 +7,7 @@ # 17.电话号码的字母组合 -[力扣题目链接](https://leetcode-cn.com/problems/letter-combinations-of-a-phone-number/) +[力扣题目链接](https://leetcode.cn/problems/letter-combinations-of-a-phone-number/) 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。 diff --git "a/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" "b/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" index 6cbd40c288..2146a11469 100644 --- "a/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" @@ -10,7 +10,7 @@ # 第18题. 四数之和 -[力扣题目链接](https://leetcode-cn.com/problems/4sum/) +[力扣题目链接](https://leetcode.cn/problems/4sum/) 题意:给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target 相等?找出所有满足条件且不重复的四元组。 diff --git "a/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" "b/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" index c36900bcde..9278ff1ade 100644 --- "a/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" +++ "b/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" @@ -9,7 +9,7 @@ ## 19.删除链表的倒数第N个节点 -[力扣题目链接](https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list/) +[力扣题目链接](https://leetcode.cn/problems/remove-nth-node-from-end-of-list/) 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 diff --git "a/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" "b/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" index a0df0d07fc..b44d21ed83 100644 --- "a/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" +++ "b/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" @@ -10,7 +10,7 @@ # 20. 有效的括号 -[力扣题目链接](https://leetcode-cn.com/problems/valid-parentheses/) +[力扣题目链接](https://leetcode.cn/problems/valid-parentheses/) 给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。 diff --git "a/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" "b/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" index 2289c22912..e636bfff58 100644 --- "a/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" +++ "b/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" @@ -7,7 +7,7 @@ ## 24. 两两交换链表中的节点 -[力扣题目链接](https://leetcode-cn.com/problems/swap-nodes-in-pairs/) +[力扣题目链接](https://leetcode.cn/problems/swap-nodes-in-pairs/) 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。 diff --git "a/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" "b/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" index f7142bad94..03c58b43ab 100644 --- "a/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" +++ "b/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" @@ -7,7 +7,7 @@ ## 27. 移除元素 -[力扣题目链接](https://leetcode-cn.com/problems/remove-element/) +[力扣题目链接](https://leetcode.cn/problems/remove-element/) 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。 diff --git "a/problems/0028.\345\256\236\347\216\260strStr.md" "b/problems/0028.\345\256\236\347\216\260strStr.md" index 1cdd5292a9..a95a52f814 100644 --- "a/problems/0028.\345\256\236\347\216\260strStr.md" +++ "b/problems/0028.\345\256\236\347\216\260strStr.md" @@ -9,7 +9,7 @@ # 28. 实现 strStr() -[力扣题目链接](https://leetcode-cn.com/problems/implement-strstr/) +[力扣题目链接](https://leetcode.cn/problems/implement-strstr/) 实现 strStr() 函数。 diff --git "a/problems/0031.\344\270\213\344\270\200\344\270\252\346\216\222\345\210\227.md" "b/problems/0031.\344\270\213\344\270\200\344\270\252\346\216\222\345\210\227.md" index 2219e24dba..bce8adef88 100644 --- "a/problems/0031.\344\270\213\344\270\200\344\270\252\346\216\222\345\210\227.md" +++ "b/problems/0031.\344\270\213\344\270\200\344\270\252\346\216\222\345\210\227.md" @@ -9,7 +9,7 @@ # 31.下一个排列 -[力扣题目链接](https://leetcode-cn.com/problems/next-permutation/) +[力扣题目链接](https://leetcode.cn/problems/next-permutation/) 实现获取 下一个排列 的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。 diff --git "a/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" "b/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" index 5cf44ded55..ed7c49b47f 100644 --- "a/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" +++ "b/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" @@ -9,7 +9,7 @@ # 35.搜索插入位置 -[力扣题目链接](https://leetcode-cn.com/problems/search-insert-position/) +[力扣题目链接](https://leetcode.cn/problems/search-insert-position/) 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 diff --git "a/problems/0037.\350\247\243\346\225\260\347\213\254.md" "b/problems/0037.\350\247\243\346\225\260\347\213\254.md" index c1ac15af89..b074b98f34 100644 --- "a/problems/0037.\350\247\243\346\225\260\347\213\254.md" +++ "b/problems/0037.\350\247\243\346\225\260\347\213\254.md" @@ -9,7 +9,7 @@ # 37. 解数独 -[力扣题目链接](https://leetcode-cn.com/problems/sudoku-solver/) +[力扣题目链接](https://leetcode.cn/problems/sudoku-solver/) 编写一个程序,通过填充空格来解决数独问题。 diff --git "a/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" "b/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" index e10a827f04..fef9b676aa 100644 --- "a/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" +++ "b/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" @@ -7,7 +7,7 @@ # 39. 组合总和 -[力扣题目链接](https://leetcode-cn.com/problems/combination-sum/) +[力扣题目链接](https://leetcode.cn/problems/combination-sum/) 给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。 diff --git "a/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" "b/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" index 34ac64e68d..ee4371cd6b 100644 --- "a/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" +++ "b/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" @@ -9,7 +9,7 @@ # 40.组合总和II -[力扣题目链接](https://leetcode-cn.com/problems/combination-sum-ii/) +[力扣题目链接](https://leetcode.cn/problems/combination-sum-ii/) 给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。 diff --git "a/problems/0042.\346\216\245\351\233\250\346\260\264.md" "b/problems/0042.\346\216\245\351\233\250\346\260\264.md" index b232ce2206..a2d6f044f0 100644 --- "a/problems/0042.\346\216\245\351\233\250\346\260\264.md" +++ "b/problems/0042.\346\216\245\351\233\250\346\260\264.md" @@ -9,7 +9,7 @@ # 42. 接雨水 -[力扣题目链接](https://leetcode-cn.com/problems/trapping-rain-water/) +[力扣题目链接](https://leetcode.cn/problems/trapping-rain-water/) 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 diff --git "a/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" "b/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" index 4e3ab24a83..9e61fbb88a 100644 --- "a/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" +++ "b/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" @@ -9,7 +9,7 @@ # 45.跳跃游戏II -[力扣题目链接](https://leetcode-cn.com/problems/jump-game-ii/) +[力扣题目链接](https://leetcode.cn/problems/jump-game-ii/) 给定一个非负整数数组,你最初位于数组的第一个位置。 diff --git "a/problems/0046.\345\205\250\346\216\222\345\210\227.md" "b/problems/0046.\345\205\250\346\216\222\345\210\227.md" index 836c36462f..70ab21d32f 100644 --- "a/problems/0046.\345\205\250\346\216\222\345\210\227.md" +++ "b/problems/0046.\345\205\250\346\216\222\345\210\227.md" @@ -7,7 +7,7 @@ # 46.全排列 -[力扣题目链接](https://leetcode-cn.com/problems/permutations/) +[力扣题目链接](https://leetcode.cn/problems/permutations/) 给定一个 没有重复 数字的序列,返回其所有可能的全排列。 diff --git "a/problems/0047.\345\205\250\346\216\222\345\210\227II.md" "b/problems/0047.\345\205\250\346\216\222\345\210\227II.md" index cce25cd9a1..bb8610d7bf 100644 --- "a/problems/0047.\345\205\250\346\216\222\345\210\227II.md" +++ "b/problems/0047.\345\205\250\346\216\222\345\210\227II.md" @@ -8,7 +8,7 @@ ## 47.全排列 II -[力扣题目链接](https://leetcode-cn.com/problems/permutations-ii/) +[力扣题目链接](https://leetcode.cn/problems/permutations-ii/) 给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。 diff --git "a/problems/0051.N\347\232\207\345\220\216.md" "b/problems/0051.N\347\232\207\345\220\216.md" index c03e48c2e4..798902aeb5 100644 --- "a/problems/0051.N\347\232\207\345\220\216.md" +++ "b/problems/0051.N\347\232\207\345\220\216.md" @@ -7,7 +7,7 @@ # 第51题. N皇后 -[力扣题目链接](https://leetcode-cn.com/problems/n-queens/) +[力扣题目链接](https://leetcode.cn/problems/n-queens/) n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。 diff --git "a/problems/0052.N\347\232\207\345\220\216II.md" "b/problems/0052.N\347\232\207\345\220\216II.md" index 67e439ca81..486340751a 100644 --- "a/problems/0052.N\347\232\207\345\220\216II.md" +++ "b/problems/0052.N\347\232\207\345\220\216II.md" @@ -8,7 +8,7 @@ # 52. N皇后II -题目链接:https://leetcode-cn.com/problems/n-queens-ii/ +题目链接:https://leetcode.cn/problems/n-queens-ii/ n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。 diff --git "a/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" "b/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" index 73cac244db..cbc91481bc 100644 --- "a/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" +++ "b/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" @@ -7,7 +7,7 @@ # 53. 最大子序和 -[力扣题目链接](https://leetcode-cn.com/problems/maximum-subarray/) +[力扣题目链接](https://leetcode.cn/problems/maximum-subarray/) 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 diff --git "a/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" "b/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" index 99aa7acfd5..345abc27d3 100644 --- "a/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" +++ "b/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" @@ -6,7 +6,7 @@ ## 53. 最大子序和 -[力扣题目链接](https://leetcode-cn.com/problems/maximum-subarray/) +[力扣题目链接](https://leetcode.cn/problems/maximum-subarray/) 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 diff --git "a/problems/0054.\350\236\272\346\227\213\347\237\251\351\230\265.md" "b/problems/0054.\350\236\272\346\227\213\347\237\251\351\230\265.md" index ccf6f47161..0d79fdf929 100644 --- "a/problems/0054.\350\236\272\346\227\213\347\237\251\351\230\265.md" +++ "b/problems/0054.\350\236\272\346\227\213\347\237\251\351\230\265.md" @@ -8,7 +8,7 @@ ## 54.螺旋矩阵 -[力扣题目链接](https://leetcode-cn.com/problems/spiral-matrix/) +[力扣题目链接](https://leetcode.cn/problems/spiral-matrix/) 给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。 @@ -128,8 +128,8 @@ public: ## 类似题目 -* [59.螺旋矩阵II](https://leetcode-cn.com/problems/spiral-matrix-ii/) -* [剑指Offer 29.顺时针打印矩阵](https://leetcode-cn.com/problems/shun-shi-zhen-da-yin-ju-zhen-lcof/) +* [59.螺旋矩阵II](https://leetcode.cn/problems/spiral-matrix-ii/) +* [剑指Offer 29.顺时针打印矩阵](https://leetcode.cn/problems/shun-shi-zhen-da-yin-ju-zhen-lcof/) ## 其他语言版本 Python: diff --git "a/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" "b/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" index 17a3b4f4d3..6fa8349514 100644 --- "a/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" +++ "b/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" @@ -7,7 +7,7 @@ # 55. 跳跃游戏 -[力扣题目链接](https://leetcode-cn.com/problems/jump-game/) +[力扣题目链接](https://leetcode.cn/problems/jump-game/) 给定一个非负整数数组,你最初位于数组的第一个位置。 diff --git "a/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" "b/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" index e444a22111..34d8dd8242 100644 --- "a/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" +++ "b/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" @@ -7,7 +7,7 @@ # 56. 合并区间 -[力扣题目链接](https://leetcode-cn.com/problems/merge-intervals/) +[力扣题目链接](https://leetcode.cn/problems/merge-intervals/) 给出一个区间的集合,请合并所有重叠的区间。 diff --git "a/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" "b/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" index f59b7be8bc..02bcc2aeea 100644 --- "a/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" +++ "b/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" @@ -6,7 +6,7 @@ # 62.不同路径 -[力扣题目链接](https://leetcode-cn.com/problems/unique-paths/) +[力扣题目链接](https://leetcode.cn/problems/unique-paths/) 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 diff --git "a/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" "b/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" index 59c60156b8..ca34055a60 100644 --- "a/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" +++ "b/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" @@ -6,7 +6,7 @@ # 63. 不同路径 II -[力扣题目链接](https://leetcode-cn.com/problems/unique-paths-ii/) +[力扣题目链接](https://leetcode.cn/problems/unique-paths-ii/) 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。 diff --git "a/problems/0070.\347\210\254\346\245\274\346\242\257.md" "b/problems/0070.\347\210\254\346\245\274\346\242\257.md" index 34d414413a..c92c581c6e 100644 --- "a/problems/0070.\347\210\254\346\245\274\346\242\257.md" +++ "b/problems/0070.\347\210\254\346\245\274\346\242\257.md" @@ -5,7 +5,7 @@

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

# 70. 爬楼梯 -[力扣题目链接](https://leetcode-cn.com/problems/climbing-stairs/) +[力扣题目链接](https://leetcode.cn/problems/climbing-stairs/) 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 diff --git "a/problems/0070.\347\210\254\346\245\274\346\242\257\345\256\214\345\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md" "b/problems/0070.\347\210\254\346\245\274\346\242\257\345\256\214\345\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md" index 0f482bb7cb..ec019e5759 100644 --- "a/problems/0070.\347\210\254\346\245\274\346\242\257\345\256\214\345\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md" +++ "b/problems/0070.\347\210\254\346\245\274\346\242\257\345\256\214\345\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md" @@ -11,7 +11,7 @@ ## 70. 爬楼梯 -[力扣题目链接](https://leetcode-cn.com/problems/climbing-stairs/) +[力扣题目链接](https://leetcode.cn/problems/climbing-stairs/) 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 diff --git "a/problems/0072.\347\274\226\350\276\221\350\267\235\347\246\273.md" "b/problems/0072.\347\274\226\350\276\221\350\267\235\347\246\273.md" index 530774eefc..641d31284d 100644 --- "a/problems/0072.\347\274\226\350\276\221\350\267\235\347\246\273.md" +++ "b/problems/0072.\347\274\226\350\276\221\350\267\235\347\246\273.md" @@ -6,7 +6,7 @@ ## 72. 编辑距离 -[力扣题目链接](https://leetcode-cn.com/problems/edit-distance/) +[力扣题目链接](https://leetcode.cn/problems/edit-distance/) 给你两个单词 word1 和 word2,请你计算出将 word1 转换成 word2 所使用的最少操作数 。 diff --git "a/problems/0077.\347\273\204\345\220\210.md" "b/problems/0077.\347\273\204\345\220\210.md" index 9e0398aba1..8d22d0187f 100644 --- "a/problems/0077.\347\273\204\345\220\210.md" +++ "b/problems/0077.\347\273\204\345\220\210.md" @@ -9,7 +9,7 @@ # 第77题. 组合 -[力扣题目链接](https://leetcode-cn.com/problems/combinations/ ) +[力扣题目链接](https://leetcode.cn/problems/combinations/ ) 给定两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数的组合。 diff --git "a/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" "b/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" index 94608ec18f..a6767047f4 100644 --- "a/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" +++ "b/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" @@ -14,7 +14,7 @@ 文中的回溯法是可以剪枝优化的,本篇我们继续来看一下题目77. 组合。 -链接:https://leetcode-cn.com/problems/combinations/ +链接:https://leetcode.cn/problems/combinations/ **看本篇之前,需要先看[回溯算法:求组合问题!](https://programmercarl.com/0077.组合.html)**。 diff --git "a/problems/0078.\345\255\220\351\233\206.md" "b/problems/0078.\345\255\220\351\233\206.md" index e1c52b5b81..2c7c19748a 100644 --- "a/problems/0078.\345\255\220\351\233\206.md" +++ "b/problems/0078.\345\255\220\351\233\206.md" @@ -7,7 +7,7 @@ # 78.子集 -[力扣题目链接](https://leetcode-cn.com/problems/subsets/) +[力扣题目链接](https://leetcode.cn/problems/subsets/) 给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。 diff --git "a/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" "b/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" index 439a3bc5b7..8463d8d05e 100644 --- "a/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" +++ "b/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" @@ -7,7 +7,7 @@ # 84.柱状图中最大的矩形 -[力扣题目链接](https://leetcode-cn.com/problems/largest-rectangle-in-histogram/) +[力扣题目链接](https://leetcode.cn/problems/largest-rectangle-in-histogram/) 给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。 diff --git "a/problems/0090.\345\255\220\351\233\206II.md" "b/problems/0090.\345\255\220\351\233\206II.md" index 74ce000b0b..b5bae53f7b 100644 --- "a/problems/0090.\345\255\220\351\233\206II.md" +++ "b/problems/0090.\345\255\220\351\233\206II.md" @@ -8,7 +8,7 @@ ## 90.子集II -[力扣题目链接](https://leetcode-cn.com/problems/subsets-ii/) +[力扣题目链接](https://leetcode.cn/problems/subsets-ii/) 给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。 diff --git "a/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" "b/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" index 6401824b47..e4e16a227a 100644 --- "a/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" +++ "b/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" @@ -8,7 +8,7 @@ # 93.复原IP地址 -[力扣题目链接](https://leetcode-cn.com/problems/restore-ip-addresses/) +[力扣题目链接](https://leetcode.cn/problems/restore-ip-addresses/) 给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式。 diff --git "a/problems/0096.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0096.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" index 25561b506a..9d98c62dbc 100644 --- "a/problems/0096.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" +++ "b/problems/0096.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" @@ -6,7 +6,7 @@ # 96.不同的二叉搜索树 -[力扣题目链接](https://leetcode-cn.com/problems/unique-binary-search-trees/) +[力扣题目链接](https://leetcode.cn/problems/unique-binary-search-trees/) 给定一个整数 n,求以 1 ... n 为节点组成的二叉搜索树有多少种? diff --git "a/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" index a8f3c32402..61dd542766 100644 --- "a/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" +++ "b/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" @@ -7,7 +7,7 @@ # 98.验证二叉搜索树 -[力扣题目链接](https://leetcode-cn.com/problems/validate-binary-search-tree/) +[力扣题目链接](https://leetcode.cn/problems/validate-binary-search-tree/) 给定一个二叉树,判断其是否是一个有效的二叉搜索树。 diff --git "a/problems/0100.\347\233\270\345\220\214\347\232\204\346\240\221.md" "b/problems/0100.\347\233\270\345\220\214\347\232\204\346\240\221.md" index 5e805d0111..5288779b7c 100644 --- "a/problems/0100.\347\233\270\345\220\214\347\232\204\346\240\221.md" +++ "b/problems/0100.\347\233\270\345\220\214\347\232\204\346\240\221.md" @@ -8,7 +8,7 @@ # 100. 相同的树 -[力扣题目链接](https://leetcode-cn.com/problems/same-tree/) +[力扣题目链接](https://leetcode.cn/problems/same-tree/) 给定两个二叉树,编写一个函数来检验它们是否相同。 diff --git "a/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" "b/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" index c79fde0ec1..40249bb78d 100644 --- "a/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" @@ -7,7 +7,7 @@ # 101. 对称二叉树 -[力扣题目链接](https://leetcode-cn.com/problems/symmetric-tree/) +[力扣题目链接](https://leetcode.cn/problems/symmetric-tree/) 给定一个二叉树,检查它是否是镜像对称的。 diff --git "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" index 3aa176991c..a2717d09ba 100644 --- "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" +++ "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" @@ -26,7 +26,7 @@ # 102.二叉树的层序遍历 -[力扣题目链接](https://leetcode-cn.com/problems/binary-tree-level-order-traversal/) +[力扣题目链接](https://leetcode.cn/problems/binary-tree-level-order-traversal/) 给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。 @@ -379,7 +379,7 @@ pub fn level_order(root: Option>>) -> Vec> { # 107.二叉树的层次遍历 II -[力扣题目链接](https://leetcode-cn.com/problems/binary-tree-level-order-traversal-ii/) +[力扣题目链接](https://leetcode.cn/problems/binary-tree-level-order-traversal-ii/) 给定一个二叉树,返回其节点值自底向上的层次遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历) @@ -660,7 +660,7 @@ pub fn level_order(root: Option>>) -> Vec> { # 199.二叉树的右视图 -[力扣题目链接](https://leetcode-cn.com/problems/binary-tree-right-side-view/) +[力扣题目链接](https://leetcode.cn/problems/binary-tree-right-side-view/) 给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。 @@ -907,7 +907,7 @@ object Solution { # 637.二叉树的层平均值 -[力扣题目链接](https://leetcode-cn.com/problems/average-of-levels-in-binary-tree/) +[力扣题目链接](https://leetcode.cn/problems/average-of-levels-in-binary-tree/) 给定一个非空二叉树, 返回一个由每层节点平均值组成的数组。 @@ -1163,7 +1163,7 @@ object Solution { # 429.N叉树的层序遍历 -[力扣题目链接](https://leetcode-cn.com/problems/n-ary-tree-level-order-traversal/) +[力扣题目链接](https://leetcode.cn/problems/n-ary-tree-level-order-traversal/) 给定一个 N 叉树,返回其节点值的层序遍历。 (即从左到右,逐层遍历)。 @@ -1434,7 +1434,7 @@ object Solution { # 515.在每个树行中找最大值 -[力扣题目链接](https://leetcode-cn.com/problems/find-largest-value-in-each-tree-row/) +[力扣题目链接](https://leetcode.cn/problems/find-largest-value-in-each-tree-row/) 您需要在二叉树的每一行中找到最大的值。 @@ -1668,7 +1668,7 @@ object Solution { # 116.填充每个节点的下一个右侧节点指针 -[力扣题目链接](https://leetcode-cn.com/problems/populating-next-right-pointers-in-each-node/) +[力扣题目链接](https://leetcode.cn/problems/populating-next-right-pointers-in-each-node/) 给定一个完美二叉树,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下: @@ -1956,7 +1956,7 @@ object Solution { ``` # 117.填充每个节点的下一个右侧节点指针II -[力扣题目链接](https://leetcode-cn.com/problems/populating-next-right-pointers-in-each-node-ii/) +[力扣题目链接](https://leetcode.cn/problems/populating-next-right-pointers-in-each-node-ii/) 思路: @@ -2236,7 +2236,7 @@ object Solution { ``` # 104.二叉树的最大深度 -[力扣题目链接](https://leetcode-cn.com/problems/maximum-depth-of-binary-tree/) +[力扣题目链接](https://leetcode.cn/problems/maximum-depth-of-binary-tree/) 给定一个二叉树,找出其最大深度。 @@ -2477,7 +2477,7 @@ object Solution { # 111.二叉树的最小深度 -[力扣题目链接](https://leetcode-cn.com/problems/minimum-depth-of-binary-tree/) +[力扣题目链接](https://leetcode.cn/problems/minimum-depth-of-binary-tree/) 相对于 104.二叉树的最大深度 ,本题还也可以使用层序遍历的方式来解决,思路是一样的。 diff --git "a/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" "b/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" index 65a155fbda..defe8e06cb 100644 --- "a/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" +++ "b/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" @@ -12,7 +12,7 @@ # 104.二叉树的最大深度 -[力扣题目链接](https://leetcode-cn.com/problems/maximum-depth-of-binary-tree/) +[力扣题目链接](https://leetcode.cn/problems/maximum-depth-of-binary-tree/) 给定一个二叉树,找出其最大深度。 @@ -223,7 +223,7 @@ impl Solution { # 559.n叉树的最大深度 -[力扣题目链接](https://leetcode-cn.com/problems/maximum-depth-of-n-ary-tree/) +[力扣题目链接](https://leetcode.cn/problems/maximum-depth-of-n-ary-tree/) 给定一个 n 叉树,找到其最大深度。 diff --git "a/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" "b/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" index 188ad3cb44..8cbe5eb609 100644 --- "a/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" @@ -12,7 +12,7 @@ # 106.从中序与后序遍历序列构造二叉树 -[力扣题目链接](https://leetcode-cn.com/problems/construct-binary-tree-from-inorder-and-postorder-traversal/) +[力扣题目链接](https://leetcode.cn/problems/construct-binary-tree-from-inorder-and-postorder-traversal/) 根据一棵树的中序遍历与后序遍历构造二叉树。 @@ -394,7 +394,7 @@ public: # 105.从前序与中序遍历序列构造二叉树 -[力扣题目链接](https://leetcode-cn.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/) +[力扣题目链接](https://leetcode.cn/problems/construct-binary-tree-from-preorder-and-inorder-traversal/) 根据一棵树的前序遍历与中序遍历构造二叉树。 diff --git "a/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" index 6ee3947bec..c9c1a69335 100644 --- "a/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" +++ "b/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" @@ -9,7 +9,7 @@ # 108.将有序数组转换为二叉搜索树 -[力扣题目链接](https://leetcode-cn.com/problems/convert-sorted-array-to-binary-search-tree/) +[力扣题目链接](https://leetcode.cn/problems/convert-sorted-array-to-binary-search-tree/) 将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。 diff --git "a/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" "b/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" index b759836551..3aa815ab07 100644 --- "a/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" @@ -9,7 +9,7 @@ # 110.平衡二叉树 -[力扣题目链接](https://leetcode-cn.com/problems/balanced-binary-tree/) +[力扣题目链接](https://leetcode.cn/problems/balanced-binary-tree/) 给定一个二叉树,判断它是否是高度平衡的二叉树。 diff --git "a/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" "b/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" index b13316591c..9f5ef4c8ea 100644 --- "a/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" +++ "b/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" @@ -9,7 +9,7 @@ # 111.二叉树的最小深度 -[力扣题目链接](https://leetcode-cn.com/problems/minimum-depth-of-binary-tree/) +[力扣题目链接](https://leetcode.cn/problems/minimum-depth-of-binary-tree/) 给定一个二叉树,找出其最小深度。 diff --git "a/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" "b/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" index d3eec16b9e..681cd1a068 100644 --- "a/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" +++ "b/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" @@ -16,7 +16,7 @@ # 112. 路径总和 -[力扣题目链接](https://leetcode-cn.com/problems/path-sum/) +[力扣题目链接](https://leetcode.cn/problems/path-sum/) 给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和。 @@ -216,7 +216,7 @@ public: # 113. 路径总和ii -[力扣题目链接](https://leetcode-cn.com/problems/path-sum-ii/) +[力扣题目链接](https://leetcode.cn/problems/path-sum-ii/) 给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径。 diff --git "a/problems/0115.\344\270\215\345\220\214\347\232\204\345\255\220\345\272\217\345\210\227.md" "b/problems/0115.\344\270\215\345\220\214\347\232\204\345\255\220\345\272\217\345\210\227.md" index ca66e20d2a..9ae0413974 100644 --- "a/problems/0115.\344\270\215\345\220\214\347\232\204\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0115.\344\270\215\345\220\214\347\232\204\345\255\220\345\272\217\345\210\227.md" @@ -6,7 +6,7 @@ ## 115.不同的子序列 -[力扣题目链接](https://leetcode-cn.com/problems/distinct-subsequences/) +[力扣题目链接](https://leetcode.cn/problems/distinct-subsequences/) 给定一个字符串 s 和一个字符串 t ,计算在 s 的子序列中 t 出现的个数。 diff --git "a/problems/0116.\345\241\253\345\205\205\346\257\217\344\270\252\350\212\202\347\202\271\347\232\204\344\270\213\344\270\200\344\270\252\345\217\263\344\276\247\350\212\202\347\202\271\346\214\207\351\222\210.md" "b/problems/0116.\345\241\253\345\205\205\346\257\217\344\270\252\350\212\202\347\202\271\347\232\204\344\270\213\344\270\200\344\270\252\345\217\263\344\276\247\350\212\202\347\202\271\346\214\207\351\222\210.md" index 2c443de52a..ed8ce59217 100644 --- "a/problems/0116.\345\241\253\345\205\205\346\257\217\344\270\252\350\212\202\347\202\271\347\232\204\344\270\213\344\270\200\344\270\252\345\217\263\344\276\247\350\212\202\347\202\271\346\214\207\351\222\210.md" +++ "b/problems/0116.\345\241\253\345\205\205\346\257\217\344\270\252\350\212\202\347\202\271\347\232\204\344\270\213\344\270\200\344\270\252\345\217\263\344\276\247\350\212\202\347\202\271\346\214\207\351\222\210.md" @@ -7,7 +7,7 @@ # 116. 填充每个节点的下一个右侧节点指针 -[力扣题目链接](https://leetcode-cn.com/problems/populating-next-right-pointers-in-each-node/) +[力扣题目链接](https://leetcode.cn/problems/populating-next-right-pointers-in-each-node/) 给定一个 完美二叉树 ,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下: diff --git "a/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" "b/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" index a2498bb6b6..a577f1dda2 100644 --- "a/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" +++ "b/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" @@ -6,7 +6,7 @@ ## 121. 买卖股票的最佳时机 -[力扣题目链接](https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock/) +[力扣题目链接](https://leetcode.cn/problems/best-time-to-buy-and-sell-stock/) 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 diff --git "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" index 1e7b77d80a..b9fa8386ea 100644 --- "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" +++ "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" @@ -7,7 +7,7 @@ # 122.买卖股票的最佳时机II -[力扣题目链接](https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-ii/) +[力扣题目链接](https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-ii/) 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。 diff --git "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" index 12b21fde30..fa9f8842fd 100644 --- "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" +++ "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" @@ -6,7 +6,7 @@ ## 122.买卖股票的最佳时机II -[力扣题目链接](https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-ii/) +[力扣题目链接](https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-ii/) 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。 diff --git "a/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" "b/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" index 67c9949719..c15aaee806 100644 --- "a/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" +++ "b/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" @@ -6,7 +6,7 @@ ## 123.买卖股票的最佳时机III -[力扣题目链接](https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-iii/) +[力扣题目链接](https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-iii/) 给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。 diff --git "a/problems/0127.\345\215\225\350\257\215\346\216\245\351\276\231.md" "b/problems/0127.\345\215\225\350\257\215\346\216\245\351\276\231.md" index 584bcb2a15..f1c6f1828a 100644 --- "a/problems/0127.\345\215\225\350\257\215\346\216\245\351\276\231.md" +++ "b/problems/0127.\345\215\225\350\257\215\346\216\245\351\276\231.md" @@ -7,7 +7,7 @@ # 127. 单词接龙 -[力扣题目链接](https://leetcode-cn.com/problems/word-ladder/) +[力扣题目链接](https://leetcode.cn/problems/word-ladder/) 字典 wordList 中从单词 beginWord 和 endWord 的 转换序列 是一个按下述规格形成的序列: * 序列中第一个单词是 beginWord 。 diff --git "a/problems/0129.\346\261\202\346\240\271\345\210\260\345\217\266\345\255\220\350\212\202\347\202\271\346\225\260\345\255\227\344\271\213\345\222\214.md" "b/problems/0129.\346\261\202\346\240\271\345\210\260\345\217\266\345\255\220\350\212\202\347\202\271\346\225\260\345\255\227\344\271\213\345\222\214.md" index b271ca7de5..ea3845b741 100644 --- "a/problems/0129.\346\261\202\346\240\271\345\210\260\345\217\266\345\255\220\350\212\202\347\202\271\346\225\260\345\255\227\344\271\213\345\222\214.md" +++ "b/problems/0129.\346\261\202\346\240\271\345\210\260\345\217\266\345\255\220\350\212\202\347\202\271\346\225\260\345\255\227\344\271\213\345\222\214.md" @@ -5,7 +5,7 @@

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

# 129. 求根节点到叶节点数字之和 -[力扣题目链接](https://leetcode-cn.com/problems/sum-root-to-leaf-numbers/) +[力扣题目链接](https://leetcode.cn/problems/sum-root-to-leaf-numbers/) # 思路 diff --git "a/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" "b/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" index 7a702898dc..a70af603b5 100644 --- "a/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" +++ "b/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" @@ -9,7 +9,7 @@ # 131.分割回文串 -[力扣题目链接](https://leetcode-cn.com/problems/palindrome-partitioning/) +[力扣题目链接](https://leetcode.cn/problems/palindrome-partitioning/) 给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。 diff --git "a/problems/0132.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262II.md" "b/problems/0132.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262II.md" index 87d3e4b434..92f9b60238 100644 --- "a/problems/0132.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262II.md" +++ "b/problems/0132.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262II.md" @@ -8,7 +8,7 @@ # 132. 分割回文串 II -[力扣题目链接](https://leetcode-cn.com/problems/palindrome-partitioning-ii/) +[力扣题目链接](https://leetcode.cn/problems/palindrome-partitioning-ii/) 给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是回文。 diff --git "a/problems/0134.\345\212\240\346\262\271\347\253\231.md" "b/problems/0134.\345\212\240\346\262\271\347\253\231.md" index a88f677d34..e6dec44be4 100644 --- "a/problems/0134.\345\212\240\346\262\271\347\253\231.md" +++ "b/problems/0134.\345\212\240\346\262\271\347\253\231.md" @@ -7,7 +7,7 @@ # 134. 加油站 -[力扣题目链接](https://leetcode-cn.com/problems/gas-station/) +[力扣题目链接](https://leetcode.cn/problems/gas-station/) 在一条环路上有 N 个加油站,其中第 i 个加油站有汽油 gas[i] 升。 diff --git "a/problems/0135.\345\210\206\345\217\221\347\263\226\346\236\234.md" "b/problems/0135.\345\210\206\345\217\221\347\263\226\346\236\234.md" index 3456a04c29..55c2efc77c 100644 --- "a/problems/0135.\345\210\206\345\217\221\347\263\226\346\236\234.md" +++ "b/problems/0135.\345\210\206\345\217\221\347\263\226\346\236\234.md" @@ -7,7 +7,7 @@ # 135. 分发糖果 -[力扣题目链接](https://leetcode-cn.com/problems/candy/) +[力扣题目链接](https://leetcode.cn/problems/candy/) 老师想给孩子们分发糖果,有 N 个孩子站成了一条直线,老师会根据每个孩子的表现,预先给他们评分。 diff --git "a/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" "b/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" index 5b4e92b9aa..7ff13f72a9 100644 --- "a/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" +++ "b/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" @@ -8,7 +8,7 @@ ## 139.单词拆分 -[力扣题目链接](https://leetcode-cn.com/problems/word-break/) +[力扣题目链接](https://leetcode.cn/problems/word-break/) 给定一个非空字符串 s 和一个包含非空单词的列表 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。 diff --git "a/problems/0142.\347\216\257\345\275\242\351\223\276\350\241\250II.md" "b/problems/0142.\347\216\257\345\275\242\351\223\276\350\241\250II.md" index f8e62d4572..6b7c7e661f 100644 --- "a/problems/0142.\347\216\257\345\275\242\351\223\276\350\241\250II.md" +++ "b/problems/0142.\347\216\257\345\275\242\351\223\276\350\241\250II.md" @@ -11,7 +11,7 @@ ## 142.环形链表II -[力扣题目链接](https://leetcode-cn.com/problems/linked-list-cycle-ii/) +[力扣题目链接](https://leetcode.cn/problems/linked-list-cycle-ii/) 题意: 给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 diff --git "a/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" "b/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" index 5452c30415..05916135be 100644 --- "a/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" +++ "b/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" @@ -11,7 +11,7 @@ # 150. 逆波兰表达式求值 -[力扣题目链接](https://leetcode-cn.com/problems/evaluate-reverse-polish-notation/) +[力扣题目链接](https://leetcode.cn/problems/evaluate-reverse-polish-notation/) 根据 逆波兰表示法,求表达式的值。 diff --git "a/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" "b/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" index 0e25fc4d8c..1bcf9888d1 100644 --- "a/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" +++ "b/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" @@ -10,7 +10,7 @@ # 151.翻转字符串里的单词 -[力扣题目链接](https://leetcode-cn.com/problems/reverse-words-in-a-string/) +[力扣题目链接](https://leetcode.cn/problems/reverse-words-in-a-string/) 给定一个字符串,逐个翻转字符串中的每个单词。 @@ -234,7 +234,7 @@ public: } void removeExtraSpaces(string& s) {//去除所有空格并在相邻单词之间添加空格, 快慢指针。 - int slow = 0; //整体思想参考Leetcode: 27. 移除元素:https://leetcode-cn.com/problems/remove-element/ + int slow = 0; //整体思想参考Leetcode: 27. 移除元素:https://leetcode.cn/problems/remove-element/ for (int i = 0; i < s.size(); ++i) { // if (s[i] != ' ') { //遇到非空格就处理,即删除所有空格。 if (slow != 0) s[slow++] = ' '; //手动控制空格,给单词之间添加空格。slow != 0说明不是第一个单词,需要在单词前添加空格。 diff --git "a/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" "b/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" index 27eb38c365..7ff198527b 100644 --- "a/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" +++ "b/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" @@ -6,7 +6,7 @@ ## 188.买卖股票的最佳时机IV -[力扣题目链接](https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-iv/) +[力扣题目链接](https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-iv/) 给定一个整数数组 prices ,它的第 i 个元素 prices[i] 是一支给定的股票在第 i 天的价格。 diff --git "a/problems/0198.\346\211\223\345\256\266\345\212\253\350\210\215.md" "b/problems/0198.\346\211\223\345\256\266\345\212\253\350\210\215.md" index a828b9a9d6..ad660f2790 100644 --- "a/problems/0198.\346\211\223\345\256\266\345\212\253\350\210\215.md" +++ "b/problems/0198.\346\211\223\345\256\266\345\212\253\350\210\215.md" @@ -6,7 +6,7 @@ ## 198.打家劫舍 -[力扣题目链接](https://leetcode-cn.com/problems/house-robber/) +[力扣题目链接](https://leetcode.cn/problems/house-robber/) 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。 diff --git "a/problems/0202.\345\277\253\344\271\220\346\225\260.md" "b/problems/0202.\345\277\253\344\271\220\346\225\260.md" index 7738b2f695..0bea0c7233 100644 --- "a/problems/0202.\345\277\253\344\271\220\346\225\260.md" +++ "b/problems/0202.\345\277\253\344\271\220\346\225\260.md" @@ -10,7 +10,7 @@ # 第202题. 快乐数 -[力扣题目链接](https://leetcode-cn.com/problems/happy-number/) +[力扣题目链接](https://leetcode.cn/problems/happy-number/) 编写一个算法来判断一个数 n 是不是快乐数。 diff --git "a/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" "b/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" index 975ca42926..b79d29a50d 100644 --- "a/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" +++ "b/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" @@ -9,7 +9,7 @@ # 203.移除链表元素 -[力扣题目链接](https://leetcode-cn.com/problems/remove-linked-list-elements/) +[力扣题目链接](https://leetcode.cn/problems/remove-linked-list-elements/) 题意:删除链表中等于给定值 val 的所有节点。 diff --git "a/problems/0205.\345\220\214\346\236\204\345\255\227\347\254\246\344\270\262.md" "b/problems/0205.\345\220\214\346\236\204\345\255\227\347\254\246\344\270\262.md" index d4b71c59c4..284e7fd944 100644 --- "a/problems/0205.\345\220\214\346\236\204\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/0205.\345\220\214\346\236\204\345\255\227\347\254\246\344\270\262.md" @@ -7,7 +7,7 @@ # 205. 同构字符串 -[力扣题目链接](https://leetcode-cn.com/problems/isomorphic-strings/) +[力扣题目链接](https://leetcode.cn/problems/isomorphic-strings/) 给定两个字符串 s 和 t,判断它们是否是同构的。 diff --git "a/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md" "b/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md" index 25b16907e4..d8a4eddbe2 100644 --- "a/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md" +++ "b/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md" @@ -9,7 +9,7 @@ # 206.反转链表 -[力扣题目链接](https://leetcode-cn.com/problems/reverse-linked-list/) +[力扣题目链接](https://leetcode.cn/problems/reverse-linked-list/) 题意:反转一个单链表。 diff --git "a/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" "b/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" index 69e0da4f1d..e2eb378e7a 100644 --- "a/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" +++ "b/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" @@ -7,7 +7,7 @@ # 209.长度最小的子数组 -[力扣题目链接](https://leetcode-cn.com/problems/minimum-size-subarray-sum/) +[力扣题目链接](https://leetcode.cn/problems/minimum-size-subarray-sum/) 给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组,并返回其长度。如果不存在符合条件的子数组,返回 0。 @@ -133,8 +133,8 @@ public: ## 相关题目推荐 -* [904.水果成篮](https://leetcode-cn.com/problems/fruit-into-baskets/) -* [76.最小覆盖子串](https://leetcode-cn.com/problems/minimum-window-substring/) +* [904.水果成篮](https://leetcode.cn/problems/fruit-into-baskets/) +* [76.最小覆盖子串](https://leetcode.cn/problems/minimum-window-substring/) diff --git "a/problems/0213.\346\211\223\345\256\266\345\212\253\350\210\215II.md" "b/problems/0213.\346\211\223\345\256\266\345\212\253\350\210\215II.md" index 9e698d01c0..d6b53a24cf 100644 --- "a/problems/0213.\346\211\223\345\256\266\345\212\253\350\210\215II.md" +++ "b/problems/0213.\346\211\223\345\256\266\345\212\253\350\210\215II.md" @@ -6,7 +6,7 @@ ## 213.打家劫舍II -[力扣题目链接](https://leetcode-cn.com/problems/house-robber-ii/) +[力扣题目链接](https://leetcode.cn/problems/house-robber-ii/) 你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 ,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警 。 diff --git "a/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" "b/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" index 32b1347e56..cb9e379fdd 100644 --- "a/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" +++ "b/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" @@ -11,7 +11,7 @@ # 216.组合总和III -[力扣题目链接](https://leetcode-cn.com/problems/combination-sum-iii/) +[力扣题目链接](https://leetcode.cn/problems/combination-sum-iii/) 找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。 diff --git "a/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" "b/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" index ba7acc5a49..82d748a712 100644 --- "a/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" +++ "b/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" @@ -7,7 +7,7 @@ # 222.完全二叉树的节点个数 -[力扣题目链接](https://leetcode-cn.com/problems/count-complete-tree-nodes/) +[力扣题目链接](https://leetcode.cn/problems/count-complete-tree-nodes/) 给出一个完全二叉树,求出该树的节点个数。 diff --git "a/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" "b/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" index 3c134870ae..994d18752b 100644 --- "a/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" +++ "b/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" @@ -10,7 +10,7 @@ # 225. 用队列实现栈 -[力扣题目链接](https://leetcode-cn.com/problems/implement-stack-using-queues/) +[力扣题目链接](https://leetcode.cn/problems/implement-stack-using-queues/) 使用队列实现栈的下列操作: diff --git "a/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" "b/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" index 9b5cfbaef7..8e35fc9d33 100644 --- "a/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" @@ -7,7 +7,7 @@ # 226.翻转二叉树 -[力扣题目链接](https://leetcode-cn.com/problems/invert-binary-tree/) +[力扣题目链接](https://leetcode.cn/problems/invert-binary-tree/) 翻转一棵二叉树。 diff --git "a/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" "b/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" index d9ba8e2632..47993fa1a8 100644 --- "a/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" +++ "b/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" @@ -9,7 +9,7 @@ # 232.用栈实现队列 -[力扣题目链接](https://leetcode-cn.com/problems/implement-queue-using-stacks/) +[力扣题目链接](https://leetcode.cn/problems/implement-queue-using-stacks/) 使用栈实现队列的下列操作: diff --git "a/problems/0234.\345\233\236\346\226\207\351\223\276\350\241\250.md" "b/problems/0234.\345\233\236\346\226\207\351\223\276\350\241\250.md" index db910d4ee0..f591fcef2b 100644 --- "a/problems/0234.\345\233\236\346\226\207\351\223\276\350\241\250.md" +++ "b/problems/0234.\345\233\236\346\226\207\351\223\276\350\241\250.md" @@ -7,7 +7,7 @@ # 234.回文链表 -[力扣题目链接](https://leetcode-cn.com/problems/palindrome-linked-list/) +[力扣题目链接](https://leetcode.cn/problems/palindrome-linked-list/) 请判断一个链表是否为回文链表。 diff --git "a/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" "b/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" index f7f1427aad..9ff7e2938f 100644 --- "a/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" +++ "b/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" @@ -7,7 +7,7 @@ # 235. 二叉搜索树的最近公共祖先 -[力扣题目链接](https://leetcode-cn.com/problems/lowest-common-ancestor-of-a-binary-search-tree/) +[力扣题目链接](https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-search-tree/) 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 diff --git "a/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" "b/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" index 69a6d0d6a7..23695b11a9 100644 --- "a/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" +++ "b/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" @@ -9,7 +9,7 @@ # 236. 二叉树的最近公共祖先 -[力扣题目链接](https://leetcode-cn.com/problems/lowest-common-ancestor-of-a-binary-tree/) +[力扣题目链接](https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-tree/) 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 diff --git "a/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" "b/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" index eb32fdd279..23e79c8096 100644 --- "a/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" +++ "b/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" @@ -10,7 +10,7 @@ # 239. 滑动窗口最大值 -[力扣题目链接](https://leetcode-cn.com/problems/sliding-window-maximum/) +[力扣题目链接](https://leetcode.cn/problems/sliding-window-maximum/) 给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 diff --git "a/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" "b/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" index 8fd9c6048d..8f4b5ae2b7 100644 --- "a/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" +++ "b/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" @@ -9,7 +9,7 @@ ## 242.有效的字母异位词 -[力扣题目链接](https://leetcode-cn.com/problems/valid-anagram/) +[力扣题目链接](https://leetcode.cn/problems/valid-anagram/) 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。 diff --git "a/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" "b/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" index 1362897c89..dc76a4326d 100644 --- "a/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" +++ "b/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" @@ -9,7 +9,7 @@ # 257. 二叉树的所有路径 -[力扣题目链接](https://leetcode-cn.com/problems/binary-tree-paths/) +[力扣题目链接](https://leetcode.cn/problems/binary-tree-paths/) 给定一个二叉树,返回所有从根节点到叶子节点的路径。 diff --git "a/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" "b/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" index 5b15639c06..e8ec98c6c7 100644 --- "a/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" +++ "b/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" @@ -7,7 +7,7 @@ ## 279.完全平方数 -[力扣题目链接](https://leetcode-cn.com/problems/perfect-squares/) +[力扣题目链接](https://leetcode.cn/problems/perfect-squares/) 给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。 diff --git "a/problems/0283.\347\247\273\345\212\250\351\233\266.md" "b/problems/0283.\347\247\273\345\212\250\351\233\266.md" index ed59d2c4aa..9600edd345 100644 --- "a/problems/0283.\347\247\273\345\212\250\351\233\266.md" +++ "b/problems/0283.\347\247\273\345\212\250\351\233\266.md" @@ -8,7 +8,7 @@ # 283. 移动零 -[力扣题目链接](https://leetcode-cn.com/problems/move-zeroes/) +[力扣题目链接](https://leetcode.cn/problems/move-zeroes/) 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 diff --git "a/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" "b/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" index ffa66c0258..41c6a7cef4 100644 --- "a/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" @@ -6,7 +6,7 @@ ## 300.最长递增子序列 -[力扣题目链接](https://leetcode-cn.com/problems/longest-increasing-subsequence/) +[力扣题目链接](https://leetcode.cn/problems/longest-increasing-subsequence/) 给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。 diff --git "a/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" "b/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" index f037fe8558..229fc636d1 100644 --- "a/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" +++ "b/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" @@ -6,7 +6,7 @@ ## 309.最佳买卖股票时机含冷冻期 -[力扣题目链接](https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-with-cooldown/) +[力扣题目链接](https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-with-cooldown/) 给定一个整数数组,其中第 i 个元素代表了第 i 天的股票价格 。 diff --git "a/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" "b/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" index fc0490c8df..03c6a4e228 100644 --- "a/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" +++ "b/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" @@ -7,7 +7,7 @@ ## 322. 零钱兑换 -[力扣题目链接](https://leetcode-cn.com/problems/coin-change/) +[力扣题目链接](https://leetcode.cn/problems/coin-change/) 给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。 diff --git "a/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" "b/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" index c71b2a9357..71942c799d 100644 --- "a/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" +++ "b/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" @@ -9,7 +9,7 @@ # 332.重新安排行程 -[力扣题目链接](https://leetcode-cn.com/problems/reconstruct-itinerary/) +[力扣题目链接](https://leetcode.cn/problems/reconstruct-itinerary/) 给定一个机票的字符串二维数组 [from, to],子数组中的两个成员分别表示飞机出发和降落的机场地点,对该行程进行重新规划排序。所有这些机票都属于一个从 JFK(肯尼迪国际机场)出发的先生,所以该行程必须从 JFK 开始。 diff --git "a/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" "b/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" index 6f50723d8f..d2add23256 100644 --- "a/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" +++ "b/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" @@ -7,7 +7,7 @@ ## 337.打家劫舍 III -[力扣题目链接](https://leetcode-cn.com/problems/house-robber-iii/) +[力扣题目链接](https://leetcode.cn/problems/house-robber-iii/) 在上次打劫完一条街道之后和一圈房屋后,小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为“根”。 除了“根”之外,每栋房子有且只有一个“父“房子与之相连。一番侦察之后,聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”。 如果两个直接相连的房子在同一天晚上被打劫,房屋将自动报警。 diff --git "a/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" "b/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" index 279f1d7182..dd03937f3e 100644 --- "a/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" +++ "b/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" @@ -6,7 +6,7 @@ # 343. 整数拆分 -[力扣题目链接](https://leetcode-cn.com/problems/integer-break/) +[力扣题目链接](https://leetcode.cn/problems/integer-break/) 给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化。 返回你可以获得的最大乘积。 diff --git "a/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" "b/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" index e1f27bd7c5..1217be15ce 100644 --- "a/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" @@ -10,7 +10,7 @@ # 344.反转字符串 -[力扣题目链接](https://leetcode-cn.com/problems/reverse-string/) +[力扣题目链接](https://leetcode.cn/problems/reverse-string/) 编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。 diff --git "a/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" "b/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" index 20932b2814..a04041ccdf 100644 --- "a/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" +++ "b/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" @@ -11,7 +11,7 @@ # 347.前 K 个高频元素 -[力扣题目链接](https://leetcode-cn.com/problems/top-k-frequent-elements/) +[力扣题目链接](https://leetcode.cn/problems/top-k-frequent-elements/) 给定一个非空的整数数组,返回其中出现频率前 k 高的元素。 diff --git "a/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" "b/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" index 4fbdd41460..9851864750 100644 --- "a/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" +++ "b/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" @@ -12,7 +12,7 @@ ## 349. 两个数组的交集 -[力扣题目链接](https://leetcode-cn.com/problems/intersection-of-two-arrays/) +[力扣题目链接](https://leetcode.cn/problems/intersection-of-two-arrays/) 题意:给定两个数组,编写一个函数来计算它们的交集。 diff --git "a/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" "b/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" index 6822896e73..00f8f70cf9 100644 --- "a/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" +++ "b/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" @@ -9,7 +9,7 @@ # 376. 摆动序列 -[力扣题目链接](https://leetcode-cn.com/problems/wiggle-subsequence/) +[力扣题目链接](https://leetcode.cn/problems/wiggle-subsequence/) 如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为摆动序列。第一个差(如果存在的话)可能是正数或负数。少于两个元素的序列也是摆动序列。 diff --git "a/problems/0377.\347\273\204\345\220\210\346\200\273\345\222\214\342\205\243.md" "b/problems/0377.\347\273\204\345\220\210\346\200\273\345\222\214\342\205\243.md" index 1d808a3a0a..f8e544a927 100644 --- "a/problems/0377.\347\273\204\345\220\210\346\200\273\345\222\214\342\205\243.md" +++ "b/problems/0377.\347\273\204\345\220\210\346\200\273\345\222\214\342\205\243.md" @@ -8,7 +8,7 @@ ## 377. 组合总和 Ⅳ -[力扣题目链接](https://leetcode-cn.com/problems/combination-sum-iv/) +[力扣题目链接](https://leetcode.cn/problems/combination-sum-iv/) 难度:中等 diff --git "a/problems/0383.\350\265\216\351\207\221\344\277\241.md" "b/problems/0383.\350\265\216\351\207\221\344\277\241.md" index 9c3dda8c4c..3cde547260 100644 --- "a/problems/0383.\350\265\216\351\207\221\344\277\241.md" +++ "b/problems/0383.\350\265\216\351\207\221\344\277\241.md" @@ -10,7 +10,7 @@ # 383. 赎金信 -[力扣题目链接](https://leetcode-cn.com/problems/ransom-note/) +[力扣题目链接](https://leetcode.cn/problems/ransom-note/) 给定一个赎金信 (ransom) 字符串和一个杂志(magazine)字符串,判断第一个字符串 ransom 能不能由第二个字符串 magazines 里面的字符构成。如果可以构成,返回 true ;否则返回 false。 diff --git "a/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" "b/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" index 3f7eb11d8d..9a26d63900 100644 --- "a/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" @@ -7,7 +7,7 @@ ## 392.判断子序列 -[力扣题目链接](https://leetcode-cn.com/problems/is-subsequence/) +[力扣题目链接](https://leetcode.cn/problems/is-subsequence/) 给定字符串 s 和 t ,判断 s 是否为 t 的子序列。 diff --git "a/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" "b/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" index 4ef68d3b4e..6a1d80c973 100644 --- "a/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" +++ "b/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" @@ -7,7 +7,7 @@ # 404.左叶子之和 -[力扣题目链接](https://leetcode-cn.com/problems/sum-of-left-leaves/) +[力扣题目链接](https://leetcode.cn/problems/sum-of-left-leaves/) 计算给定二叉树的所有左叶子之和。 diff --git "a/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" "b/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" index 641086a93c..879820eae9 100644 --- "a/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" +++ "b/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" @@ -7,7 +7,7 @@ # 406.根据身高重建队列 -[力扣题目链接](https://leetcode-cn.com/problems/queue-reconstruction-by-height/) +[力扣题目链接](https://leetcode.cn/problems/queue-reconstruction-by-height/) 假设有打乱顺序的一群人站成一个队列,数组 people 表示队列中一些人的属性(不一定按顺序)。每个 people[i] = [hi, ki] 表示第 i 个人的身高为 hi ,前面 正好 有 ki 个身高大于或等于 hi 的人。 diff --git "a/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" "b/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" index eb6601e184..b9fa78d235 100644 --- "a/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" +++ "b/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" @@ -6,7 +6,7 @@ ## 416. 分割等和子集 -[力扣题目链接](https://leetcode-cn.com/problems/partition-equal-subset-sum/) +[力扣题目链接](https://leetcode.cn/problems/partition-equal-subset-sum/) 题目难易:中等 diff --git "a/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" "b/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" index 66aa124475..f1e259aefa 100644 --- "a/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" +++ "b/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" @@ -7,7 +7,7 @@ # 435. 无重叠区间 -[力扣题目链接](https://leetcode-cn.com/problems/non-overlapping-intervals/) +[力扣题目链接](https://leetcode.cn/problems/non-overlapping-intervals/) 给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠。 diff --git "a/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" "b/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" index e8f7e54c4b..aca9084fa6 100644 --- "a/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" +++ "b/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" @@ -9,7 +9,7 @@ # 450.删除二叉搜索树中的节点 -[力扣题目链接]( https://leetcode-cn.com/problems/delete-node-in-a-bst/) +[力扣题目链接]( https://leetcode.cn/problems/delete-node-in-a-bst/) 给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。 diff --git "a/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" "b/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" index d4bbe961ee..e593b87672 100644 --- "a/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" +++ "b/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" @@ -7,7 +7,7 @@ # 452. 用最少数量的箭引爆气球 -[力扣题目链接](https://leetcode-cn.com/problems/minimum-number-of-arrows-to-burst-balloons/) +[力扣题目链接](https://leetcode.cn/problems/minimum-number-of-arrows-to-burst-balloons/) 在二维空间中有许多球形的气球。对于每个气球,提供的输入是水平方向上,气球直径的开始和结束坐标。由于它是水平的,所以纵坐标并不重要,因此只要知道开始和结束的横坐标就足够了。开始坐标总是小于结束坐标。 diff --git "a/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" "b/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" index 726fdb1569..d22e23359d 100644 --- "a/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" +++ "b/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" @@ -9,7 +9,7 @@ # 第454题.四数相加II -[力扣题目链接](https://leetcode-cn.com/problems/4sum-ii/) +[力扣题目链接](https://leetcode.cn/problems/4sum-ii/) 给定四个包含整数的数组列表 A , B , C , D ,计算有多少个元组 (i, j, k, l) ,使得 A[i] + B[j] + C[k] + D[l] = 0。 diff --git "a/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" "b/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" index 17db4a859e..b787dee6be 100644 --- "a/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" +++ "b/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" @@ -7,7 +7,7 @@ # 455.分发饼干 -[力扣题目链接](https://leetcode-cn.com/problems/assign-cookies/) +[力扣题目链接](https://leetcode.cn/problems/assign-cookies/) 假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。 diff --git "a/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" "b/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" index a51c68eea7..bb55bd7ce0 100644 --- "a/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" @@ -11,7 +11,7 @@ # 459.重复的子字符串 -[力扣题目链接](https://leetcode-cn.com/problems/repeated-substring-pattern/) +[力扣题目链接](https://leetcode.cn/problems/repeated-substring-pattern/) 给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母,并且长度不超过10000。 diff --git "a/problems/0463.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" "b/problems/0463.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" index 9911dfe5a3..ea0381402d 100644 --- "a/problems/0463.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" +++ "b/problems/0463.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" @@ -5,7 +5,7 @@

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

# 463. 岛屿的周长 -[力扣题目链接](https://leetcode-cn.com/problems/island-perimeter/) +[力扣题目链接](https://leetcode.cn/problems/island-perimeter/) ## 思路 diff --git "a/problems/0474.\344\270\200\345\222\214\351\233\266.md" "b/problems/0474.\344\270\200\345\222\214\351\233\266.md" index d38ce03f89..a5018baf21 100644 --- "a/problems/0474.\344\270\200\345\222\214\351\233\266.md" +++ "b/problems/0474.\344\270\200\345\222\214\351\233\266.md" @@ -7,7 +7,7 @@ ## 474.一和零 -[力扣题目链接](https://leetcode-cn.com/problems/ones-and-zeroes/) +[力扣题目链接](https://leetcode.cn/problems/ones-and-zeroes/) 给你一个二进制字符串数组 strs 和两个整数 m 和 n 。 diff --git "a/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" "b/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" index 3ea2382b1f..291a19bd5e 100644 --- "a/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" @@ -9,7 +9,7 @@ # 491.递增子序列 -[力扣题目链接](https://leetcode-cn.com/problems/increasing-subsequences/) +[力扣题目链接](https://leetcode.cn/problems/increasing-subsequences/) 给定一个整型数组, 你的任务是找到所有该数组的递增子序列,递增子序列的长度至少是2。 diff --git "a/problems/0494.\347\233\256\346\240\207\345\222\214.md" "b/problems/0494.\347\233\256\346\240\207\345\222\214.md" index 8ce1f6f1ae..540de7f4f4 100644 --- "a/problems/0494.\347\233\256\346\240\207\345\222\214.md" +++ "b/problems/0494.\347\233\256\346\240\207\345\222\214.md" @@ -7,7 +7,7 @@ ## 494. 目标和 -[力扣题目链接](https://leetcode-cn.com/problems/target-sum/) +[力扣题目链接](https://leetcode.cn/problems/target-sum/) 难度:中等 diff --git "a/problems/0496.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240I.md" "b/problems/0496.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240I.md" index 02339677bc..aa5277f8d5 100644 --- "a/problems/0496.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240I.md" +++ "b/problems/0496.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240I.md" @@ -6,7 +6,7 @@ # 496.下一个更大元素 I -[力扣题目链接](https://leetcode-cn.com/problems/next-greater-element-i/) +[力扣题目链接](https://leetcode.cn/problems/next-greater-element-i/) 给你两个 没有重复元素 的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集。 diff --git "a/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" "b/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" index 9cb5d0713a..f22f1eb3ed 100644 --- "a/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" +++ "b/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" @@ -9,7 +9,7 @@ # 501.二叉搜索树中的众数 -[力扣题目链接](https://leetcode-cn.com/problems/find-mode-in-binary-search-tree/solution/) +[力扣题目链接](https://leetcode.cn/problems/find-mode-in-binary-search-tree/solution/) 给定一个有相同值的二叉搜索树(BST),找出 BST 中的所有众数(出现频率最高的元素)。 diff --git "a/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" "b/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" index ace4d40bd4..67c2c9bc71 100644 --- "a/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" +++ "b/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" @@ -6,7 +6,7 @@ # 503.下一个更大元素II -[力扣题目链接](https://leetcode-cn.com/problems/next-greater-element-ii/) +[力扣题目链接](https://leetcode.cn/problems/next-greater-element-ii/) 给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素。数字 x 的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它的下一个更大的数。如果不存在,则输出 -1。 diff --git "a/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" "b/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" index 1d17784d43..71647a0a41 100644 --- "a/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" +++ "b/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" @@ -6,7 +6,7 @@ # 509. 斐波那契数 -[力扣题目链接](https://leetcode-cn.com/problems/fibonacci-number/) +[力扣题目链接](https://leetcode.cn/problems/fibonacci-number/) 斐波那契数,通常用 F(n) 表示,形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是: F(0) = 0,F(1) = 1 diff --git "a/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" "b/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" index 12c62c7068..6230ea51ee 100644 --- "a/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" +++ "b/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" @@ -7,7 +7,7 @@ # 513.找树左下角的值 -[力扣题目链接](https://leetcode-cn.com/problems/find-bottom-left-tree-value/) +[力扣题目链接](https://leetcode.cn/problems/find-bottom-left-tree-value/) 给定一个二叉树,在树的最后一行找到最左边的值。 diff --git "a/problems/0516.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\345\272\217\345\210\227.md" "b/problems/0516.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\345\272\217\345\210\227.md" index 63120b141b..ba71b240d2 100644 --- "a/problems/0516.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0516.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\345\272\217\345\210\227.md" @@ -5,7 +5,7 @@

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

## 516.最长回文子序列 -[力扣题目链接](https://leetcode-cn.com/problems/longest-palindromic-subsequence/) +[力扣题目链接](https://leetcode.cn/problems/longest-palindromic-subsequence/) 给定一个字符串 s ,找到其中最长的回文子序列,并返回该序列的长度。可以假设 s 的最大长度为 1000 。 diff --git "a/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" "b/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" index b6593438c8..222a10d759 100644 --- "a/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" +++ "b/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" @@ -7,7 +7,7 @@ ## 518. 零钱兑换 II -[力扣题目链接](https://leetcode-cn.com/problems/coin-change-2/) +[力扣题目链接](https://leetcode.cn/problems/coin-change-2/) 难度:中等 diff --git "a/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" "b/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" index 77699c9f4e..cbf8138c82 100644 --- "a/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" +++ "b/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" @@ -9,7 +9,7 @@ # 530.二叉搜索树的最小绝对差 -[力扣题目链接](https://leetcode-cn.com/problems/minimum-absolute-difference-in-bst/) +[力扣题目链接](https://leetcode.cn/problems/minimum-absolute-difference-in-bst/) 给你一棵所有节点为非负值的二叉搜索树,请你计算树中任意两节点的差的绝对值的最小值。 diff --git "a/problems/0538.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md" "b/problems/0538.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md" index 37eb7d0f2c..853cca6f37 100644 --- "a/problems/0538.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md" +++ "b/problems/0538.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md" @@ -7,7 +7,7 @@ # 538.把二叉搜索树转换为累加树 -[力扣题目链接](https://leetcode-cn.com/problems/convert-bst-to-greater-tree/) +[力扣题目链接](https://leetcode.cn/problems/convert-bst-to-greater-tree/) 给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。 diff --git "a/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" "b/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" index 99d6ebe04e..2a4bd3b324 100644 --- "a/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" +++ "b/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" @@ -10,7 +10,7 @@ # 541. 反转字符串II -[力扣题目链接](https://leetcode-cn.com/problems/reverse-string-ii/) +[力扣题目链接](https://leetcode.cn/problems/reverse-string-ii/) 给定一个字符串 s 和一个整数 k,你需要对从字符串开头算起的每隔 2k 个字符的前 k 个字符进行反转。 diff --git "a/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" "b/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" index 00f1170009..fc7e6f3940 100644 --- "a/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" +++ "b/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" @@ -6,7 +6,7 @@ ## 583. 两个字符串的删除操作 -[力扣题目链接](https://leetcode-cn.com/problems/delete-operation-for-two-strings/) +[力扣题目链接](https://leetcode.cn/problems/delete-operation-for-two-strings/) 给定两个单词 word1 和 word2,找到使得 word1 和 word2 相同所需的最小步数,每步可以删除任意一个字符串中的一个字符。 diff --git "a/problems/0617.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md" "b/problems/0617.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md" index 55786ea988..40aa98c3c0 100644 --- "a/problems/0617.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0617.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md" @@ -7,7 +7,7 @@ # 617.合并二叉树 -[力扣题目链接](https://leetcode-cn.com/problems/merge-two-binary-trees/) +[力扣题目链接](https://leetcode.cn/problems/merge-two-binary-trees/) 给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。 diff --git "a/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" "b/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" index 913aec655a..dd0b8d51c0 100644 --- "a/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" +++ "b/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" @@ -6,7 +6,7 @@ ## 647. 回文子串 -[力扣题目链接](https://leetcode-cn.com/problems/palindromic-substrings/) +[力扣题目链接](https://leetcode.cn/problems/palindromic-substrings/) 给定一个字符串,你的任务是计算这个字符串中有多少个回文子串。 diff --git "a/problems/0649.Dota2\345\217\202\350\256\256\351\231\242.md" "b/problems/0649.Dota2\345\217\202\350\256\256\351\231\242.md" index 6e84c9fde2..f1b3be11c3 100644 --- "a/problems/0649.Dota2\345\217\202\350\256\256\351\231\242.md" +++ "b/problems/0649.Dota2\345\217\202\350\256\256\351\231\242.md" @@ -8,7 +8,7 @@ # 649. Dota2 参议院 -[力扣题目链接](https://leetcode-cn.com/problems/dota2-senate/) +[力扣题目链接](https://leetcode.cn/problems/dota2-senate/) Dota2 的世界里有两个阵营:Radiant(天辉)和 Dire(夜魇) diff --git "a/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" "b/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" index 1c73354b00..38d2a9ec86 100644 --- "a/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" @@ -7,7 +7,7 @@ # 654.最大二叉树 -[力扣题目地址](https://leetcode-cn.com/problems/maximum-binary-tree/) +[力扣题目地址](https://leetcode.cn/problems/maximum-binary-tree/) 给定一个不含重复元素的整数数组。一个以此数组构建的最大二叉树定义如下: diff --git "a/problems/0657.\346\234\272\345\231\250\344\272\272\350\203\275\345\220\246\350\277\224\345\233\236\345\216\237\347\202\271.md" "b/problems/0657.\346\234\272\345\231\250\344\272\272\350\203\275\345\220\246\350\277\224\345\233\236\345\216\237\347\202\271.md" index 4eb69a6ce3..3d91a5c313 100644 --- "a/problems/0657.\346\234\272\345\231\250\344\272\272\350\203\275\345\220\246\350\277\224\345\233\236\345\216\237\347\202\271.md" +++ "b/problems/0657.\346\234\272\345\231\250\344\272\272\350\203\275\345\220\246\350\277\224\345\233\236\345\216\237\347\202\271.md" @@ -7,7 +7,7 @@ # 657. 机器人能否返回原点 -[力扣题目链接](https://leetcode-cn.com/problems/robot-return-to-origin/) +[力扣题目链接](https://leetcode.cn/problems/robot-return-to-origin/) 在二维平面上,有一个机器人从原点 (0, 0) 开始。给出它的移动顺序,判断这个机器人在完成移动后是否在 (0, 0) 处结束。 diff --git "a/problems/0669.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0669.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" index 385b226863..154ba5a9a6 100644 --- "a/problems/0669.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" +++ "b/problems/0669.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" @@ -10,7 +10,7 @@ # 669. 修剪二叉搜索树 -[力扣题目链接](https://leetcode-cn.com/problems/trim-a-binary-search-tree/) +[力扣题目链接](https://leetcode.cn/problems/trim-a-binary-search-tree/) 给定一个二叉搜索树,同时给定最小边界L 和最大边界 R。通过修剪二叉搜索树,使得所有节点的值在[L, R]中 (R>=L) 。你可能需要改变树的根节点,所以结果应当返回修剪好的二叉搜索树的新的根节点。 diff --git "a/problems/0673.\346\234\200\351\225\277\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227\347\232\204\344\270\252\346\225\260.md" "b/problems/0673.\346\234\200\351\225\277\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227\347\232\204\344\270\252\346\225\260.md" index 9a2c5db29d..8a6a2d4658 100644 --- "a/problems/0673.\346\234\200\351\225\277\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227\347\232\204\344\270\252\346\225\260.md" +++ "b/problems/0673.\346\234\200\351\225\277\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227\347\232\204\344\270\252\346\225\260.md" @@ -8,7 +8,7 @@ # 673.最长递增子序列的个数 -[力扣题目链接](https://leetcode-cn.com/problems/number-of-longest-increasing-subsequence/) +[力扣题目链接](https://leetcode.cn/problems/number-of-longest-increasing-subsequence/) 给定一个未排序的整数数组,找到最长递增子序列的个数。 diff --git "a/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" "b/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" index b1ed80c3e9..5865a68dac 100644 --- "a/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" +++ "b/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" @@ -6,7 +6,7 @@ ## 674. 最长连续递增序列 -[力扣题目链接](https://leetcode-cn.com/problems/longest-continuous-increasing-subsequence/) +[力扣题目链接](https://leetcode.cn/problems/longest-continuous-increasing-subsequence/) 给定一个未经排序的整数数组,找到最长且 连续递增的子序列,并返回该序列的长度。 diff --git "a/problems/0684.\345\206\227\344\275\231\350\277\236\346\216\245.md" "b/problems/0684.\345\206\227\344\275\231\350\277\236\346\216\245.md" index a16833bc8e..3928e05106 100644 --- "a/problems/0684.\345\206\227\344\275\231\350\277\236\346\216\245.md" +++ "b/problems/0684.\345\206\227\344\275\231\350\277\236\346\216\245.md" @@ -9,7 +9,7 @@ # 684.冗余连接 -[力扣题目链接](https://leetcode-cn.com/problems/redundant-connection/) +[力扣题目链接](https://leetcode.cn/problems/redundant-connection/) 树可以看成是一个连通且 无环 的 无向 图。 diff --git "a/problems/0685.\345\206\227\344\275\231\350\277\236\346\216\245II.md" "b/problems/0685.\345\206\227\344\275\231\350\277\236\346\216\245II.md" index d96d4912fe..a8da112449 100644 --- "a/problems/0685.\345\206\227\344\275\231\350\277\236\346\216\245II.md" +++ "b/problems/0685.\345\206\227\344\275\231\350\277\236\346\216\245II.md" @@ -7,7 +7,7 @@ # 685.冗余连接II -[力扣题目链接](https://leetcode-cn.com/problems/redundant-connection-ii/) +[力扣题目链接](https://leetcode.cn/problems/redundant-connection-ii/) 在本问题中,有根树指满足以下条件的 有向 图。该树只有一个根节点,所有其他节点都是该根节点的后继。该树除了根节点之外的每一个节点都有且只有一个父节点,而根节点没有父节点。 diff --git "a/problems/0700.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\220\234\347\264\242.md" "b/problems/0700.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\220\234\347\264\242.md" index 40cf4ea1fc..bda400c285 100644 --- "a/problems/0700.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\220\234\347\264\242.md" +++ "b/problems/0700.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\220\234\347\264\242.md" @@ -7,7 +7,7 @@ # 700.二叉搜索树中的搜索 -[力扣题目地址](https://leetcode-cn.com/problems/search-in-a-binary-search-tree/) +[力扣题目地址](https://leetcode.cn/problems/search-in-a-binary-search-tree/) 给定二叉搜索树(BST)的根节点和一个值。 你需要在BST中找到节点值等于给定值的节点。 返回以该节点为根的子树。 如果节点不存在,则返回 NULL。 diff --git "a/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" "b/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" index 50e39ade5e..102f091e9c 100644 --- "a/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" +++ "b/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" @@ -7,7 +7,7 @@ # 701.二叉搜索树中的插入操作 -[力扣题目链接](https://leetcode-cn.com/problems/insert-into-a-binary-search-tree/) +[力扣题目链接](https://leetcode.cn/problems/insert-into-a-binary-search-tree/) 给定二叉搜索树(BST)的根节点和要插入树中的值,将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 输入数据保证,新值和原始二叉搜索树中的任意节点值都不同。 diff --git "a/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" "b/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" index 50f01226f0..6a37e4d107 100644 --- "a/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" +++ "b/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" @@ -7,7 +7,7 @@ ## 704. 二分查找 -[力扣题目链接](https://leetcode-cn.com/problems/binary-search/) +[力扣题目链接](https://leetcode.cn/problems/binary-search/) 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target  ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。 diff --git "a/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" "b/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" index dcdb53f44e..6ee11eefbf 100644 --- "a/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" +++ "b/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" @@ -9,7 +9,7 @@ # 707.设计链表 -[力扣题目链接](https://leetcode-cn.com/problems/design-linked-list/) +[力扣题目链接](https://leetcode.cn/problems/design-linked-list/) 题意: diff --git "a/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271.md" "b/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271.md" index b27631c68c..7600c52cc0 100644 --- "a/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271.md" +++ "b/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271.md" @@ -7,7 +7,7 @@ # 714. 买卖股票的最佳时机含手续费 -[力扣题目链接](https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-with-transaction-fee/) +[力扣题目链接](https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-with-transaction-fee/) 给定一个整数数组 prices,其中第 i 个元素代表了第 i 天的股票价格 ;非负整数 fee 代表了交易股票的手续费用。 diff --git "a/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" "b/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" index 5625604b9d..7734450ec1 100644 --- "a/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" +++ "b/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" @@ -6,7 +6,7 @@ ## 714.买卖股票的最佳时机含手续费 -[力扣题目链接](https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-with-transaction-fee/) +[力扣题目链接](https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-with-transaction-fee/) 给定一个整数数组 prices,其中第 i 个元素代表了第 i 天的股票价格 ;非负整数 fee 代表了交易股票的手续费用。 diff --git "a/problems/0718.\346\234\200\351\225\277\351\207\215\345\244\215\345\255\220\346\225\260\347\273\204.md" "b/problems/0718.\346\234\200\351\225\277\351\207\215\345\244\215\345\255\220\346\225\260\347\273\204.md" index 0b7b519958..18007b700b 100644 --- "a/problems/0718.\346\234\200\351\225\277\351\207\215\345\244\215\345\255\220\346\225\260\347\273\204.md" +++ "b/problems/0718.\346\234\200\351\225\277\351\207\215\345\244\215\345\255\220\346\225\260\347\273\204.md" @@ -6,7 +6,7 @@ ## 718. 最长重复子数组 -[力扣题目链接](https://leetcode-cn.com/problems/maximum-length-of-repeated-subarray/) +[力扣题目链接](https://leetcode.cn/problems/maximum-length-of-repeated-subarray/) 给两个整数数组 A 和 B ,返回两个数组中公共的、长度最长的子数组的长度。 diff --git "a/problems/0724.\345\257\273\346\211\276\346\225\260\347\273\204\347\232\204\344\270\255\345\277\203\347\264\242\345\274\225.md" "b/problems/0724.\345\257\273\346\211\276\346\225\260\347\273\204\347\232\204\344\270\255\345\277\203\347\264\242\345\274\225.md" index 14dcd2c08a..2fc4200941 100644 --- "a/problems/0724.\345\257\273\346\211\276\346\225\260\347\273\204\347\232\204\344\270\255\345\277\203\347\264\242\345\274\225.md" +++ "b/problems/0724.\345\257\273\346\211\276\346\225\260\347\273\204\347\232\204\344\270\255\345\277\203\347\264\242\345\274\225.md" @@ -7,7 +7,7 @@ # 724.寻找数组的中心下标 -[力扣题目链接](https://leetcode-cn.com/problems/find-pivot-index/) +[力扣题目链接](https://leetcode.cn/problems/find-pivot-index/) 给你一个整数数组 nums ,请计算数组的 中心下标 。 diff --git "a/problems/0738.\345\215\225\350\260\203\351\200\222\345\242\236\347\232\204\346\225\260\345\255\227.md" "b/problems/0738.\345\215\225\350\260\203\351\200\222\345\242\236\347\232\204\346\225\260\345\255\227.md" index 4e4079a76e..d2f041f5fb 100644 --- "a/problems/0738.\345\215\225\350\260\203\351\200\222\345\242\236\347\232\204\346\225\260\345\255\227.md" +++ "b/problems/0738.\345\215\225\350\260\203\351\200\222\345\242\236\347\232\204\346\225\260\345\255\227.md" @@ -6,7 +6,7 @@ # 738.单调递增的数字 -[力扣题目链接](https://leetcode-cn.com/problems/monotone-increasing-digits/) +[力扣题目链接](https://leetcode.cn/problems/monotone-increasing-digits/) 给定一个非负整数 N,找出小于或等于 N 的最大的整数,同时这个整数需要满足其各个位数上的数字是单调递增。 diff --git "a/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" "b/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" index 987ce27e34..dbe9afe081 100644 --- "a/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" +++ "b/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" @@ -7,7 +7,7 @@ # 739. 每日温度 -[力扣题目链接](https://leetcode-cn.com/problems/daily-temperatures/) +[力扣题目链接](https://leetcode.cn/problems/daily-temperatures/) 请根据每日 气温 列表,重新生成一个列表。对应位置的输出为:要想观测到更高的气温,至少需要等待的天数。如果气温在这之后都不会升高,请在该位置用 0 来代替。 diff --git "a/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" "b/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" index 5931fc8ac8..c2c737150e 100644 --- "a/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" +++ "b/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" @@ -6,7 +6,7 @@ # 746. 使用最小花费爬楼梯 -[力扣题目链接](https://leetcode-cn.com/problems/min-cost-climbing-stairs/) +[力扣题目链接](https://leetcode.cn/problems/min-cost-climbing-stairs/) 数组的每个下标作为一个阶梯,第 i 个阶梯对应着一个非负数的体力花费值 cost[i](下标从 0 开始)。 diff --git "a/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" "b/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" index 2f4d1b4861..eb21e42f97 100644 --- "a/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" +++ "b/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" @@ -7,7 +7,7 @@ # 763.划分字母区间 -[力扣题目链接](https://leetcode-cn.com/problems/partition-labels/) +[力扣题目链接](https://leetcode.cn/problems/partition-labels/) 字符串 S 由小写字母组成。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。返回一个表示每个字符串片段的长度的列表。 diff --git "a/problems/0841.\351\222\245\345\214\231\345\222\214\346\210\277\351\227\264.md" "b/problems/0841.\351\222\245\345\214\231\345\222\214\346\210\277\351\227\264.md" index 1cd130653b..6f51b4addb 100644 --- "a/problems/0841.\351\222\245\345\214\231\345\222\214\346\210\277\351\227\264.md" +++ "b/problems/0841.\351\222\245\345\214\231\345\222\214\346\210\277\351\227\264.md" @@ -8,7 +8,7 @@ # 841.钥匙和房间 -[力扣题目链接](https://leetcode-cn.com/problems/keys-and-rooms/) +[力扣题目链接](https://leetcode.cn/problems/keys-and-rooms/) 有 N 个房间,开始时你位于 0 号房间。每个房间有不同的号码:0,1,2,...,N-1,并且房间里可能有一些钥匙能使你进入下一个房间。 diff --git "a/problems/0844.\346\257\224\350\276\203\345\220\253\351\200\200\346\240\274\347\232\204\345\255\227\347\254\246\344\270\262.md" "b/problems/0844.\346\257\224\350\276\203\345\220\253\351\200\200\346\240\274\347\232\204\345\255\227\347\254\246\344\270\262.md" index dccc5404cc..c0773653d0 100644 --- "a/problems/0844.\346\257\224\350\276\203\345\220\253\351\200\200\346\240\274\347\232\204\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/0844.\346\257\224\350\276\203\345\220\253\351\200\200\346\240\274\347\232\204\345\255\227\347\254\246\344\270\262.md" @@ -7,7 +7,7 @@ # 844.比较含退格的字符串 -[力扣题目链接](https://leetcode-cn.com/problems/backspace-string-compare/) +[力扣题目链接](https://leetcode.cn/problems/backspace-string-compare/) 给定 S 和 T 两个字符串,当它们分别被输入到空白的文本编辑器后,判断二者是否相等,并返回结果。 # 代表退格字符。 diff --git "a/problems/0860.\346\237\240\346\252\254\346\260\264\346\211\276\351\233\266.md" "b/problems/0860.\346\237\240\346\252\254\346\260\264\346\211\276\351\233\266.md" index aa09e1c67d..f5785a912d 100644 --- "a/problems/0860.\346\237\240\346\252\254\346\260\264\346\211\276\351\233\266.md" +++ "b/problems/0860.\346\237\240\346\252\254\346\260\264\346\211\276\351\233\266.md" @@ -7,7 +7,7 @@ # 860.柠檬水找零 -[力扣题目链接](https://leetcode-cn.com/problems/lemonade-change/) +[力扣题目链接](https://leetcode.cn/problems/lemonade-change/) 在柠檬水摊上,每一杯柠檬水的售价为 5 美元。 diff --git "a/problems/0922.\346\214\211\345\245\207\345\201\266\346\216\222\345\272\217\346\225\260\347\273\204II.md" "b/problems/0922.\346\214\211\345\245\207\345\201\266\346\216\222\345\272\217\346\225\260\347\273\204II.md" index cb564fb683..8ca46db9b5 100644 --- "a/problems/0922.\346\214\211\345\245\207\345\201\266\346\216\222\345\272\217\346\225\260\347\273\204II.md" +++ "b/problems/0922.\346\214\211\345\245\207\345\201\266\346\216\222\345\272\217\346\225\260\347\273\204II.md" @@ -9,7 +9,7 @@ # 922. 按奇偶排序数组II -[力扣题目链接](https://leetcode-cn.com/problems/sort-array-by-parity-ii/) +[力扣题目链接](https://leetcode.cn/problems/sort-array-by-parity-ii/) 给定一个非负整数数组 A, A 中一半整数是奇数,一半整数是偶数。 diff --git "a/problems/0925.\351\225\277\346\214\211\351\224\256\345\205\245.md" "b/problems/0925.\351\225\277\346\214\211\351\224\256\345\205\245.md" index 0ef5a3d7f3..bb6aeff257 100644 --- "a/problems/0925.\351\225\277\346\214\211\351\224\256\345\205\245.md" +++ "b/problems/0925.\351\225\277\346\214\211\351\224\256\345\205\245.md" @@ -6,7 +6,7 @@ # 925.长按键入 -[力扣题目链接](https://leetcode-cn.com/problems/long-pressed-name/) +[力扣题目链接](https://leetcode.cn/problems/long-pressed-name/) 你的朋友正在使用键盘输入他的名字 name。偶尔,在键入字符 c 时,按键可能会被长按,而字符可能被输入 1 次或多次。 diff --git "a/problems/0941.\346\234\211\346\225\210\347\232\204\345\261\261\350\204\211\346\225\260\347\273\204.md" "b/problems/0941.\346\234\211\346\225\210\347\232\204\345\261\261\350\204\211\346\225\260\347\273\204.md" index 4b7a978c0e..7c98aeeaee 100644 --- "a/problems/0941.\346\234\211\346\225\210\347\232\204\345\261\261\350\204\211\346\225\260\347\273\204.md" +++ "b/problems/0941.\346\234\211\346\225\210\347\232\204\345\261\261\350\204\211\346\225\260\347\273\204.md" @@ -7,7 +7,7 @@ # 941.有效的山脉数组 -[力扣题目链接](https://leetcode-cn.com/problems/valid-mountain-array/) +[力扣题目链接](https://leetcode.cn/problems/valid-mountain-array/) 给定一个整数数组 arr,如果它是有效的山脉数组就返回 true,否则返回 false。 diff --git "a/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" "b/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" index 9a510a1b79..0aa04a0297 100644 --- "a/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" @@ -7,7 +7,7 @@ # 968.监控二叉树 -[力扣题目链接](https://leetcode-cn.com/problems/binary-tree-cameras/) +[力扣题目链接](https://leetcode.cn/problems/binary-tree-cameras/) 给定一个二叉树,我们在树的节点上安装摄像头。 diff --git "a/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" "b/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" index 20bdf7b040..4052c57027 100644 --- "a/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" +++ "b/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" @@ -8,7 +8,7 @@ # 977.有序数组的平方 -[力扣题目链接](https://leetcode-cn.com/problems/squares-of-a-sorted-array/) +[力扣题目链接](https://leetcode.cn/problems/squares-of-a-sorted-array/) 给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。 diff --git "a/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md" "b/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md" index 075b5ef1a6..6f54c0986a 100644 --- "a/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md" +++ "b/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md" @@ -8,7 +8,7 @@ # 1002. 查找常用字符 -[力扣题目链接](https://leetcode-cn.com/problems/find-common-characters/) +[力扣题目链接](https://leetcode.cn/problems/find-common-characters/) 给你一个字符串数组 words ,请你找出所有在 words 的每个字符串中都出现的共用字符( 包括重复字符),并以数组形式返回。你可以按 任意顺序 返回答案。 diff --git "a/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" "b/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" index 202534da8c..8e161594fc 100644 --- "a/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" +++ "b/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" @@ -7,7 +7,7 @@ # 1005.K次取反后最大化的数组和 -[力扣题目链接](https://leetcode-cn.com/problems/maximize-sum-of-array-after-k-negations/) +[力扣题目链接](https://leetcode.cn/problems/maximize-sum-of-array-after-k-negations/) 给定一个整数数组 A,我们只能用以下方法修改该数组:我们选择某个索引 i 并将 A[i] 替换为 -A[i],然后总共重复这个过程 K 次。(我们可以多次选择同一个索引 i。) diff --git "a/problems/1035.\344\270\215\347\233\270\344\272\244\347\232\204\347\272\277.md" "b/problems/1035.\344\270\215\347\233\270\344\272\244\347\232\204\347\272\277.md" index 4463c5f713..83ccb08c10 100644 --- "a/problems/1035.\344\270\215\347\233\270\344\272\244\347\232\204\347\272\277.md" +++ "b/problems/1035.\344\270\215\347\233\270\344\272\244\347\232\204\347\272\277.md" @@ -6,7 +6,7 @@ ## 1035.不相交的线 -[力扣题目链接](https://leetcode-cn.com/problems/uncrossed-lines/) +[力扣题目链接](https://leetcode.cn/problems/uncrossed-lines/) 我们在两条独立的水平线上按给定的顺序写下 A 和 B 中的整数。 diff --git "a/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" "b/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" index a92a3911e1..7d16017243 100644 --- "a/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" +++ "b/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" @@ -11,7 +11,7 @@ # 1047. 删除字符串中的所有相邻重复项 -[力扣题目链接](https://leetcode-cn.com/problems/remove-all-adjacent-duplicates-in-string/) +[力扣题目链接](https://leetcode.cn/problems/remove-all-adjacent-duplicates-in-string/) 给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。 diff --git "a/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" "b/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" index 3d256c3dd1..c0cd6d5966 100644 --- "a/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" +++ "b/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" @@ -7,7 +7,7 @@ ## 1049. 最后一块石头的重量 II -[力扣题目链接](https://leetcode-cn.com/problems/last-stone-weight-ii/) +[力扣题目链接](https://leetcode.cn/problems/last-stone-weight-ii/) 题目难度:中等 diff --git "a/problems/1143.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" "b/problems/1143.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" index d58330ec11..ad9825b818 100644 --- "a/problems/1143.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/1143.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" @@ -6,7 +6,7 @@ ## 1143.最长公共子序列 -[力扣题目链接](https://leetcode-cn.com/problems/longest-common-subsequence/) +[力扣题目链接](https://leetcode.cn/problems/longest-common-subsequence/) 给定两个字符串 text1 和 text2,返回这两个字符串的最长公共子序列的长度。 diff --git "a/problems/1207.\347\213\254\344\270\200\346\227\240\344\272\214\347\232\204\345\207\272\347\216\260\346\254\241\346\225\260.md" "b/problems/1207.\347\213\254\344\270\200\346\227\240\344\272\214\347\232\204\345\207\272\347\216\260\346\254\241\346\225\260.md" index ba92552ab8..e88f909c9b 100644 --- "a/problems/1207.\347\213\254\344\270\200\346\227\240\344\272\214\347\232\204\345\207\272\347\216\260\346\254\241\346\225\260.md" +++ "b/problems/1207.\347\213\254\344\270\200\346\227\240\344\272\214\347\232\204\345\207\272\347\216\260\346\254\241\346\225\260.md" @@ -6,7 +6,7 @@ # 1207.独一无二的出现次数 -[力扣题目链接](https://leetcode-cn.com/problems/unique-number-of-occurrences/) +[力扣题目链接](https://leetcode.cn/problems/unique-number-of-occurrences/) 给你一个整数数组 arr,请你帮忙统计数组中每个数的出现次数。 diff --git "a/problems/1221.\345\210\206\345\211\262\345\271\263\350\241\241\345\255\227\347\254\246\344\270\262.md" "b/problems/1221.\345\210\206\345\211\262\345\271\263\350\241\241\345\255\227\347\254\246\344\270\262.md" index 1a9b34a29e..08d4fee719 100644 --- "a/problems/1221.\345\210\206\345\211\262\345\271\263\350\241\241\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/1221.\345\210\206\345\211\262\345\271\263\350\241\241\345\255\227\347\254\246\344\270\262.md" @@ -6,7 +6,7 @@ # 1221. 分割平衡字符串 -[力扣题目链接](https://leetcode-cn.com/problems/split-a-string-in-balanced-strings/) +[力扣题目链接](https://leetcode.cn/problems/split-a-string-in-balanced-strings/) 在一个 平衡字符串 中,'L' 和 'R' 字符的数量是相同的。 diff --git "a/problems/1356.\346\240\271\346\215\256\346\225\260\345\255\227\344\272\214\350\277\233\345\210\266\344\270\2131\347\232\204\346\225\260\347\233\256\346\216\222\345\272\217.md" "b/problems/1356.\346\240\271\346\215\256\346\225\260\345\255\227\344\272\214\350\277\233\345\210\266\344\270\2131\347\232\204\346\225\260\347\233\256\346\216\222\345\272\217.md" index 838c3a9600..5ca73607c0 100644 --- "a/problems/1356.\346\240\271\346\215\256\346\225\260\345\255\227\344\272\214\350\277\233\345\210\266\344\270\2131\347\232\204\346\225\260\347\233\256\346\216\222\345\272\217.md" +++ "b/problems/1356.\346\240\271\346\215\256\346\225\260\345\255\227\344\272\214\350\277\233\345\210\266\344\270\2131\347\232\204\346\225\260\347\233\256\346\216\222\345\272\217.md" @@ -8,9 +8,9 @@ # 1356. 根据数字二进制下 1 的数目排序 -[力扣题目链接](https://leetcode-cn.com/problems/sort-integers-by-the-number-of-1-bits/) +[力扣题目链接](https://leetcode.cn/problems/sort-integers-by-the-number-of-1-bits/) -题目链接:https://leetcode-cn.com/problems/sort-integers-by-the-number-of-1-bits/ +题目链接:https://leetcode.cn/problems/sort-integers-by-the-number-of-1-bits/ 给你一个整数数组 arr 。请你将数组中的元素按照其二进制表示中数字 1 的数目升序排序。 diff --git "a/problems/1365.\346\234\211\345\244\232\345\260\221\345\260\217\344\272\216\345\275\223\345\211\215\346\225\260\345\255\227\347\232\204\346\225\260\345\255\227.md" "b/problems/1365.\346\234\211\345\244\232\345\260\221\345\260\217\344\272\216\345\275\223\345\211\215\346\225\260\345\255\227\347\232\204\346\225\260\345\255\227.md" index 78fa84c094..1d1f86b44c 100644 --- "a/problems/1365.\346\234\211\345\244\232\345\260\221\345\260\217\344\272\216\345\275\223\345\211\215\346\225\260\345\255\227\347\232\204\346\225\260\345\255\227.md" +++ "b/problems/1365.\346\234\211\345\244\232\345\260\221\345\260\217\344\272\216\345\275\223\345\211\215\346\225\260\345\255\227\347\232\204\346\225\260\345\255\227.md" @@ -8,7 +8,7 @@ # 1365.有多少小于当前数字的数字 -[力扣题目链接](https://leetcode-cn.com/problems/how-many-numbers-are-smaller-than-the-current-number/) +[力扣题目链接](https://leetcode.cn/problems/how-many-numbers-are-smaller-than-the-current-number/) 给你一个数组 nums,对于其中每个元素 nums[i],请你统计数组中比它小的所有数字的数目。 diff --git "a/problems/1382.\345\260\206\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\345\217\230\345\271\263\350\241\241.md" "b/problems/1382.\345\260\206\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\345\217\230\345\271\263\350\241\241.md" index 57231ec46b..d944ac3016 100644 --- "a/problems/1382.\345\260\206\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\345\217\230\345\271\263\350\241\241.md" +++ "b/problems/1382.\345\260\206\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\345\217\230\345\271\263\350\241\241.md" @@ -7,7 +7,7 @@ # 1382.将二叉搜索树变平衡 -[力扣题目链接](https://leetcode-cn.com/problems/balance-a-binary-search-tree/) +[力扣题目链接](https://leetcode.cn/problems/balance-a-binary-search-tree/) 给你一棵二叉搜索树,请你返回一棵 平衡后 的二叉搜索树,新生成的树应该与原来的树有着相同的节点值。 diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" index fac30f9989..dc8e812c1c 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" @@ -11,9 +11,9 @@ 看完本篇大家可以使用迭代法,再重新解决如下三道leetcode上的题目: -* [144.二叉树的前序遍历](https://leetcode-cn.com/problems/binary-tree-preorder-traversal/) -* [94.二叉树的中序遍历](https://leetcode-cn.com/problems/binary-tree-inorder-traversal/) -* [145.二叉树的后序遍历](https://leetcode-cn.com/problems/binary-tree-postorder-traversal/) +* [144.二叉树的前序遍历](https://leetcode.cn/problems/binary-tree-preorder-traversal/) +* [94.二叉树的中序遍历](https://leetcode.cn/problems/binary-tree-inorder-traversal/) +* [145.二叉树的后序遍历](https://leetcode.cn/problems/binary-tree-postorder-traversal/) 为什么可以用迭代法(非递归的方式)来实现二叉树的前后中序遍历呢? diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" index 29c0cfdaa4..1cce2a0db9 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" @@ -99,9 +99,9 @@ void traversal(TreeNode* cur, vector& vec) { 此时大家可以做一做leetcode上三道题目,分别是: -* [144.二叉树的前序遍历](https://leetcode-cn.com/problems/binary-tree-preorder-traversal/) -* [145.二叉树的后序遍历](https://leetcode-cn.com/problems/binary-tree-postorder-traversal/) -* [94.二叉树的中序遍历](https://leetcode-cn.com/problems/binary-tree-inorder-traversal/) +* [144.二叉树的前序遍历](https://leetcode.cn/problems/binary-tree-preorder-traversal/) +* [145.二叉树的后序遍历](https://leetcode.cn/problems/binary-tree-postorder-traversal/) +* [94.二叉树的中序遍历](https://leetcode.cn/problems/binary-tree-inorder-traversal/) 可能有同学感觉前后中序遍历的递归太简单了,要打迭代法(非递归),别急,我们明天打迭代法,打个通透! diff --git "a/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" "b/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" index eecd7f0c56..a4a8c77752 100644 --- "a/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" +++ "b/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" @@ -7,7 +7,7 @@ # 题目:剑指Offer 05.替换空格 -[力扣题目链接](https://leetcode-cn.com/problems/ti-huan-kong-ge-lcof/) +[力扣题目链接](https://leetcode.cn/problems/ti-huan-kong-ge-lcof/) 请实现一个函数,把字符串 s 中的每个空格替换成"%20"。 diff --git "a/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" "b/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" index 7c39ed69ae..4674c14170 100644 --- "a/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" @@ -9,7 +9,7 @@ # 题目:剑指Offer58-II.左旋转字符串 -[力扣题目链接](https://leetcode-cn.com/problems/zuo-xuan-zhuan-zi-fu-chuan-lcof/) +[力扣题目链接](https://leetcode.cn/problems/zuo-xuan-zhuan-zi-fu-chuan-lcof/) 字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。 diff --git "a/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" "b/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" index 0a38cc3309..1ae01061ad 100644 --- "a/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" +++ "b/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" @@ -7,7 +7,7 @@ # 面试题 02.07. 链表相交 -[力扣题目链接](https://leetcode-cn.com/problems/intersection-of-two-linked-lists-lcci/) +[力扣题目链接](https://leetcode.cn/problems/intersection-of-two-linked-lists-lcci/) 给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。 From 8bc026fed035ee9c0f2f8b0452f7e0a5f5531281 Mon Sep 17 00:00:00 2001 From: UndeadSheep Date: Mon, 27 Jun 2022 15:28:47 +0800 Subject: [PATCH 0889/3019] =?UTF-8?q?=E6=96=B0=E5=A2=9E=20=E6=A0=88?= =?UTF-8?q?=E4=B8=8E=E9=98=9F=E5=88=97=E9=83=A8=E5=88=86=E7=9A=84=20C#?= =?UTF-8?q?=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...10\347\232\204\346\213\254\345\217\267.md" | 31 ++++++++++++++ ...76\345\274\217\346\261\202\345\200\274.md" | 34 +++++++++++++++ ...27\345\256\236\347\216\260\346\240\210.md" | 35 ++++++++++++++++ ...36\347\216\260\351\230\237\345\210\227.md" | 41 +++++++++++++++++++ ...43\346\234\200\345\244\247\345\200\274.md" | 41 +++++++++++++++++++ ...30\351\242\221\345\205\203\347\264\240.md" | 37 ++++++++++++++++- ...73\351\207\215\345\244\215\351\241\271.md" | 17 ++++++++ 7 files changed, 235 insertions(+), 1 deletion(-) diff --git "a/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" "b/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" index 7bb7f7463a..cdca70f9a9 100644 --- "a/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" +++ "b/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" @@ -401,5 +401,36 @@ bool isValid(char * s){ } ``` +C#: +```csharp +public class Solution { + public bool IsValid(string s) { + var len = s.Length; + if(len % 2 == 1) return false; // 字符串长度为单数,直接返回 false + // 初始化栈 + var stack = new Stack(); + // 遍历字符串 + for(int i = 0; i < len; i++){ + // 当字符串为左括号时,进栈对应的右括号 + if(s[i] == '('){ + stack.Push(')'); + }else if(s[i] == '['){ + stack.Push(']'); + }else if(s[i] == '{'){ + stack.Push('}'); + } + // 当字符串为右括号时,当栈为空(无左括号) 或者 出栈字符不是当前的字符 + else if(stack.Count == 0 || stack.Pop() != s[i]) + return false; + } + // 如果栈不为空,例如“((()”,右括号少于左括号,返回false + if (stack.Count > 0) + return false; + // 上面的校验都满足,则返回true + else + return true; + } +} +``` -----------------------
diff --git "a/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" "b/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" index f4dad8231a..8dafa460e3 100644 --- "a/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" +++ "b/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" @@ -326,5 +326,39 @@ func evalRPN(_ tokens: [String]) -> Int { } ``` +C#: +```csharp +public int EvalRPN(string[] tokens) { + int num; + Stack stack = new Stack(); + foreach(string s in tokens){ + if(int.TryParse(s, out num)){ + stack.Push(num); + }else{ + int num1 = stack.Pop(); + int num2 = stack.Pop(); + switch (s) + { + case "+": + stack.Push(num1 + num2); + break; + case "-": + stack.Push(num2 - num1); + break; + case "*": + stack.Push(num1 * num2); + break; + case "/": + stack.Push(num2 / num1); + break; + default: + break; + } + } + } + return stack.Pop(); + } +``` + -----------------------
diff --git "a/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" "b/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" index 3457c4b368..5d902fb1f9 100644 --- "a/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" +++ "b/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" @@ -816,5 +816,40 @@ class MyStack { } ``` +C#: +```csharp +public class MyStack { + Queue queue1; + Queue queue2; + public MyStack() { + queue1 = new Queue(); + queue2 = new Queue(); + } + + public void Push(int x) { + queue2.Enqueue(x); + while(queue1.Count != 0){ + queue2.Enqueue(queue1.Dequeue()); + } + Queue queueTemp; + queueTemp = queue1; + queue1 = queue2; + queue2 = queueTemp; + } + + public int Pop() { + return queue1.Count > 0 ? queue1.Dequeue() : -1; + } + + public int Top() { + return queue1.Count > 0 ? queue1.Peek() : -1; + } + + public bool Empty() { + return queue1.Count == 0; + } +} + +``` -----------------------
diff --git "a/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" "b/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" index 1a56d9f386..d58dc55f68 100644 --- "a/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" +++ "b/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" @@ -496,5 +496,46 @@ void myQueueFree(MyQueue* obj) { } ``` +C#: +```csharp +public class MyQueue { + Stack inStack; + Stack outStack; + + public MyQueue() { + inStack = new Stack();// 负责进栈 + outStack = new Stack();// 负责出栈 + } + + public void Push(int x) { + inStack.Push(x); + } + + public int Pop() { + dumpstackIn(); + return outStack.Pop(); + } + + public int Peek() { + dumpstackIn(); + return outStack.Peek(); + } + + public bool Empty() { + return inStack.Count == 0 && outStack.Count == 0; + } + + // 处理方法: + // 如果outStack为空,那么将inStack中的元素全部放到outStack中 + private void dumpstackIn(){ + if (outStack.Count != 0) return; + while(inStack.Count != 0){ + outStack.Push(inStack.Pop()); + } + } +} + +``` + -----------------------
diff --git "a/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" "b/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" index f269450f3b..35ca1eed20 100644 --- "a/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" +++ "b/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" @@ -631,5 +631,46 @@ func maxSlidingWindow(_ nums: [Int], _ k: Int) -> [Int] { } ``` +C#: +```csharp +class myDequeue{ + private LinkedList linkedList = new LinkedList(); + + public void Enqueue(int n){ + while(linkedList.Count > 0 && linkedList.Last.Value < n){ + linkedList.RemoveLast(); + } + linkedList.AddLast(n); + } + + public int Max(){ + return linkedList.First.Value; + } + + public void Dequeue(int n){ + if(linkedList.First.Value == n){ + linkedList.RemoveFirst(); + } + } + } + + myDequeue window = new myDequeue(); + List res = new List(); + + public int[] MaxSlidingWindow(int[] nums, int k) { + for(int i = 0; i < k; i++){ + window.Enqueue(nums[i]); + } + res.Add(window.Max()); + for(int i = k; i < nums.Length; i++){ + window.Dequeue(nums[i-k]); + window.Enqueue(nums[i]); + res.Add(window.Max()); + } + + return res.ToArray(); + } +``` + -----------------------
diff --git "a/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" "b/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" index 1d6a358bfc..c570672ffe 100644 --- "a/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" +++ "b/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" @@ -374,7 +374,42 @@ function topKFrequent(nums: number[], k: number): number[] { }; ``` - +C#: +```csharp + public int[] TopKFrequent(int[] nums, int k) { + //哈希表-标权重 + Dictionary dic = new(); + for(int i = 0; i < nums.Length; i++){ + if(dic.ContainsKey(nums[i])){ + dic[nums[i]]++; + }else{ + dic.Add(nums[i], 1); + } + } + //优先队列-从小到大排列 + PriorityQueue pq = new(); + foreach(var num in dic){ + pq.Enqueue(num.Key, num.Value); + if(pq.Count > k){ + pq.Dequeue(); + } + } + + // //Stack-倒置 + // Stack res = new(); + // while(pq.Count > 0){ + // res.Push(pq.Dequeue()); + // } + // return res.ToArray(); + + //数组倒装 + int[] res = new int[k]; + for(int i = k - 1; i >= 0; i--){ + res[i] = pq.Dequeue(); + } + return res; + } +``` -----------------------
diff --git "a/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" "b/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" index 638c8f4ed2..9237acdb90 100644 --- "a/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" +++ "b/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" @@ -375,5 +375,22 @@ func removeDuplicates(_ s: String) -> String { } ``` +C#: +```csharp +public string RemoveDuplicates(string s) { + //拿字符串直接作为栈,省去了栈还要转为字符串的操作 + StringBuilder res = new StringBuilder(); + + foreach(char c in s){ + if(res.Length > 0 && res[res.Length-1] == c){ + res.Remove(res.Length-1, 1); + }else{ + res.Append(c); + } + } + + return res.ToString(); + } +``` -----------------------
From 16af63e22ad0d3522c19ccf5eb3dd4a0b4294a9e Mon Sep 17 00:00:00 2001 From: Shuo Zhang Date: Mon, 27 Jun 2022 22:54:52 -0400 Subject: [PATCH 0890/3019] =?UTF-8?q?=E4=BF=AE=E6=94=B90349=20-=20?= =?UTF-8?q?=E7=94=A8=20Java=20stream=20=E4=BB=A3=E6=9B=BF=20for=20loop=20(?= =?UTF-8?q?=E8=BF=99=E6=A0=B7=E4=B8=BB=E9=A2=98=E6=9B=B4=E6=98=8E=E6=98=BE?= =?UTF-8?q?=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...260\347\273\204\347\232\204\344\272\244\351\233\206.md" | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git "a/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" "b/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" index 9851864750..2a8b2dae84 100644 --- "a/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" +++ "b/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" @@ -104,13 +104,8 @@ class Solution { resSet.add(i); } } - int[] resArr = new int[resSet.size()]; - int index = 0; //将结果几何转为数组 - for (int i : resSet) { - resArr[index++] = i; - } - return resArr; + return resSet.stream().mapToInt(x -> x).toArray(); } } ``` From c6db9037901601bd84ed907455cbe2adf9f2e9b9 Mon Sep 17 00:00:00 2001 From: White Dove <43168562+zhouweiwei18@users.noreply.github.com> Date: Tue, 28 Jun 2022 16:24:27 +0800 Subject: [PATCH 0891/3019] =?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.\347\233\256\346\240\207\345\222\214.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0494.\347\233\256\346\240\207\345\222\214.md" "b/problems/0494.\347\233\256\346\240\207\345\222\214.md" index 8f116fae8d..00e4bdfa4a 100644 --- "a/problems/0494.\347\233\256\346\240\207\345\222\214.md" +++ "b/problems/0494.\347\233\256\346\240\207\345\222\214.md" @@ -156,7 +156,7 @@ dp[j] 表示:填满j(包括j)这么大容积的包,有dp[j]种方法 有哪些来源可以推出dp[j]呢? -不考虑nums[i]的情况下,填满容量为j - nums[i]的背包,有dp[j - nums[i]]种方法。 +不考虑nums[i]的情况下,填满容量为j的背包,有dp[j]种方法。 那么只要搞到nums[i]的话,凑成dp[j]就有dp[j - nums[i]] 种方法。 From c70316d7aa59caffe1a0cec9b1c818fcc867a411 Mon Sep 17 00:00:00 2001 From: wzqwtt <1722249371@qq.com> Date: Tue, 28 Jun 2022 21:30:49 +0800 Subject: [PATCH 0892/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20=E8=83=8C?= =?UTF-8?q?=E5=8C=85=E9=97=AE=E9=A2=98=E7=90=86=E8=AE=BA=E5=9F=BA=E7=A1=80?= =?UTF-8?q?=E5=AE=8C=E5=85=A8=E8=83=8C=E5=8C=85.md=20Scala=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...14\345\205\250\350\203\214\345\214\205.md" | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" index 54e772e028..fc4609a69b 100644 --- "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" +++ "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" @@ -359,7 +359,27 @@ function test_CompletePack(): void { test_CompletePack(); ``` +Scala: +```scala +// 先遍历物品,再遍历背包容量 +object Solution { + def test_CompletePack() { + var weight = Array[Int](1, 3, 4) + var value = Array[Int](15, 20, 30) + var baseweight = 4 + + var dp = new Array[Int](baseweight + 1) + + for (i <- 0 until weight.length) { + for (j <- weight(i) to baseweight) { + dp(j) = math.max(dp(j), dp(j - weight(i)) + value(i)) + } + } + dp(baseweight) + } +} +``` ----------------------- From bdd4c83b642dfa5b2c7c5a6b6fd214aa8e0488bb Mon Sep 17 00:00:00 2001 From: wzqwtt <1722249371@qq.com> Date: Tue, 28 Jun 2022 21:56:42 +0800 Subject: [PATCH 0893/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200518.=E9=9B=B6?= =?UTF-8?q?=E9=92=B1=E5=85=91=E6=8D=A2II.md=20Scala=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...66\351\222\261\345\205\221\346\215\242II.md" | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git "a/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" "b/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" index 222a10d759..3abb96015b 100644 --- "a/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" +++ "b/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" @@ -289,7 +289,22 @@ function change(amount: number, coins: number[]): number { }; ``` - +Scala: + +```scala +object Solution { + def change(amount: Int, coins: Array[Int]): Int = { + var dp = new Array[Int](amount + 1) + dp(0) = 1 + for (i <- 0 until coins.length) { + for (j <- coins(i) to amount) { + dp(j) += dp(j - coins(i)) + } + } + dp(amount) + } +} +``` -----------------------
From 0cd4ffd9a470038f1b77207af082a47c00e8d430 Mon Sep 17 00:00:00 2001 From: azou Date: Wed, 29 Jun 2022 23:32:29 +0800 Subject: [PATCH 0894/3019] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=EF=BC=9A=E7=A7=BB?= =?UTF-8?q?=E9=99=A4=E9=93=BE=E8=A1=A8=E5=85=83=E7=B4=A0TS=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 --- ...351\223\276\350\241\250\345\205\203\347\264\240.md" | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git "a/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" "b/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" index b79d29a50d..0e461ce8f6 100644 --- "a/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" +++ "b/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" @@ -397,18 +397,18 @@ function removeElements(head: ListNode | null, val: number): ListNode | null { ```typescript function removeElements(head: ListNode | null, val: number): ListNode | null { - let dummyHead = new ListNode(0, head); - let pre: ListNode = dummyHead, cur: ListNode | null = dummyHead.next; - // 删除非头部节点 + // 添加虚拟节点 + const data = new ListNode(0, head); + let pre = data, cur = data.next; while (cur) { if (cur.val === val) { - pre.next = cur.next; + pre.next = cur.next } else { pre = cur; } cur = cur.next; } - return head.next; + return data.next; }; ``` From 55086c231acbb8794299d2f143444173de2b85e9 Mon Sep 17 00:00:00 2001 From: w2xi <43wangxi@gmail.com> Date: Sat, 2 Jul 2022 11:14:57 +0800 Subject: [PATCH 0895/3019] =?UTF-8?q?Update=200226.=E7=BF=BB=E8=BD=AC?= =?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=A0=91.md=20JavaScript=E9=80=92=E5=BD=92?= =?UTF-8?q?=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...54\344\272\214\345\217\211\346\240\221.md" | 27 ++++++------------- 1 file changed, 8 insertions(+), 19 deletions(-) diff --git "a/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" "b/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" index 8e35fc9d33..83d20df856 100644 --- "a/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" @@ -470,25 +470,14 @@ func invertTree(root *TreeNode) *TreeNode { 使用递归版本的前序遍历 ```javascript var invertTree = function(root) { - //1. 首先使用递归版本的前序遍历实现二叉树翻转 - //交换节点函数 - const inverNode=function(left,right){ - let temp=left; - left=right; - right=temp; - //需要重新给root赋值一下 - root.left=left; - root.right=right; - } - //确定递归函数的参数和返回值inverTree=function(root) - //确定终止条件 - if(root===null){ - return root; - } - //确定节点处理逻辑 交换 - inverNode(root.left,root.right); - invertTree(root.left); - invertTree(root.right); + // 终止条件 + if (!root) { + return null; + } + // 交换左右节点 + const rightNode = root.right; + root.right = invertTree(root.left); + root.left = invertTree(rightNode); return root; }; ``` From 889256a3781ebc8891f8a37778334f402acf362e Mon Sep 17 00:00:00 2001 From: chenwingsing <742474834@qq.com> Date: Sat, 2 Jul 2022 21:58:17 +0800 Subject: [PATCH 0896/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B00018JAVA=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 用例有一个是[1000000000,1000000000,1000000000,1000000000] -294967296 如果用int会越界,所以修改为long --- .../0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" "b/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" index 2146a11469..9961307087 100644 --- "a/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" @@ -153,7 +153,7 @@ class Solution { int left = j + 1; int right = nums.length - 1; while (right > left) { - int sum = nums[i] + nums[j] + nums[left] + nums[right]; + long sum = (long) nums[i] + nums[j] + nums[left] + nums[right]; if (sum > target) { right--; } else if (sum < target) { From 1965ff69f70373fd48f31c590e77152444ceefe3 Mon Sep 17 00:00:00 2001 From: chenwingsing <742474834@qq.com> Date: Sun, 3 Jul 2022 09:07:51 +0800 Subject: [PATCH 0897/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0[0015.=E4=B8=89?= =?UTF-8?q?=E6=95=B0=E4=B9=8B=E5=92=8C]=E8=A7=A3=E9=A2=98=E6=8F=8F?= =?UTF-8?q?=E8=BF=B0=E9=83=A8=E5=88=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加逗号让解题更加清晰,避免歧义,我一开始就看成a = num[i] *b了 --- .../0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" "b/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" index 4f1d711a7a..8bc8dd9104 100644 --- "a/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" @@ -95,7 +95,7 @@ public: 拿这个nums数组来举例,首先将数组排序,然后有一层for循环,i从下标0的地方开始,同时定一个下标left 定义在i+1的位置上,定义下标right 在数组结尾的位置上。 -依然还是在数组中找到 abc 使得a + b +c =0,我们这里相当于 a = nums[i] b = nums[left] c = nums[right]。 +依然还是在数组中找到 abc 使得a + b +c =0,我们这里相当于 a = nums[i],b = nums[left],c = nums[right]。 接下来如何移动left 和right呢, 如果nums[i] + nums[left] + nums[right] > 0 就说明 此时三数之和大了,因为数组是排序后了,所以right下标就应该向左移动,这样才能让三数之和小一些。 From 8c54205566578bf331587de936e85b5bc4454e5a Mon Sep 17 00:00:00 2001 From: chenwingsing <742474834@qq.com> Date: Sun, 3 Jul 2022 11:53:38 +0800 Subject: [PATCH 0898/3019] =?UTF-8?q?Update=200151.=E7=BF=BB=E8=BD=AC?= =?UTF-8?q?=E5=AD=97=E7=AC=A6=E4=B8=B2=E9=87=8C=E7=9A=84=E5=8D=95=E8=AF=8D?= =?UTF-8?q?.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修改错误字 --- ...\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" "b/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" index 38372f91e4..23f966e8a6 100644 --- "a/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" +++ "b/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" @@ -79,7 +79,7 @@ void removeExtraSpaces(string& s) { 逻辑很简单,从前向后遍历,遇到空格了就erase。 -如果不仔细琢磨一下erase的时间复杂读,还以为以上的代码是O(n)的时间复杂度呢。 +如果不仔细琢磨一下erase的时间复杂度,还以为以上的代码是O(n)的时间复杂度呢。 想一下真正的时间复杂度是多少,一个erase本来就是O(n)的操作,erase实现原理题目:[数组:就移除个元素很难么?](https://programmercarl.com/0027.移除元素.html),最优的算法来移除元素也要O(n)。 From 11b701fdb6ba689bdc9f07362e497a4d2ab5eefd Mon Sep 17 00:00:00 2001 From: AronJudge <2286381138@qq.com> Date: Mon, 4 Jul 2022 00:58:56 +0800 Subject: [PATCH 0899/3019] =?UTF-8?q?0018=20Java=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E9=83=A8=E5=88=86=E5=A2=9E=E5=8A=A0=E5=89=AA=E6=9E=9D=E6=93=8D?= =?UTF-8?q?=E4=BD=9C,=E4=B8=8D=E7=84=B6Leetcode=E4=B8=8D=E8=83=BD=E9=80=9A?= =?UTF-8?q?=E8=BF=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" | 5 +++++ 1 file changed, 5 insertions(+) diff --git "a/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" "b/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" index 6cbd40c288..d0b7fc68a5 100644 --- "a/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" @@ -140,6 +140,11 @@ class Solution { for (int i = 0; i < nums.length; i++) { + // nums[i] > target 直接返回, 剪枝操作 + if (nums[i] > 0 && nums[i] > target) { + return result; + } + if (i > 0 && nums[i - 1] == nums[i]) { continue; } From ca00ec680557689d6b302fe27b3e66e479a0d421 Mon Sep 17 00:00:00 2001 From: xiaojun <13589818805@163.com> Date: Mon, 4 Jul 2022 15:43:35 +0800 Subject: [PATCH 0900/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0(0031.=E4=B8=8B?= =?UTF-8?q?=E4=B8=80=E4=B8=AA=E6=8E=92=E5=88=97.md)go=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...00\344\270\252\346\216\222\345\210\227.md" | 24 +++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git "a/problems/0031.\344\270\213\344\270\200\344\270\252\346\216\222\345\210\227.md" "b/problems/0031.\344\270\213\344\270\200\344\270\252\346\216\222\345\210\227.md" index bce8adef88..1a3641b037 100644 --- "a/problems/0031.\344\270\213\344\270\200\344\270\252\346\216\222\345\210\227.md" +++ "b/problems/0031.\344\270\213\344\270\200\344\270\252\346\216\222\345\210\227.md" @@ -171,13 +171,13 @@ class Solution(object): i = n-2 while i >= 0 and nums[i] >= nums[i+1]: i -= 1 - + if i > -1: // i==-1,不存在下一个更大的排列 j = n-1 while j >= 0 and nums[j] <= nums[i]: j -= 1 nums[i], nums[j] = nums[j], nums[i] - + start, end = i+1, n-1 while start < end: nums[start], nums[end] = nums[end], nums[start] @@ -190,6 +190,26 @@ class Solution(object): ## Go ```go +//卡尔的解法 +func nextPermutation(nums []int) { + for i:=len(nums)-1;i>=0;i--{ + for j:=len(nums)-1;j>i;j--{ + if nums[j]>nums[i]{ + //交换 + nums[j],nums[i]=nums[i],nums[j] + reverse(nums,0+i+1,len(nums)-1) + return + } + } + } + reverse(nums,0,len(nums)-1) +} +//对目标切片指定区间的反转方法 +func reverse(a []int,begin,end int){ + for i,j:=begin,end;i Date: Tue, 5 Jul 2022 15:36:27 +0800 Subject: [PATCH 0901/3019] =?UTF-8?q?fix:=20=E4=BF=AE=E6=94=B9=E7=AC=AC111?= =?UTF-8?q?=E9=A2=98=E4=BA=8C=E5=8F=89=E6=A0=91=E6=9C=80=E5=B0=8F=E6=B7=B1?= =?UTF-8?q?=E5=BA=A6js=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" "b/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" index 0137bd15b1..6378300c0b 100644 --- "a/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" +++ "b/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" @@ -372,7 +372,7 @@ var minDepth1 = function(root) { // 到叶子节点 返回 1 if(!root.left && !root.right) return 1; // 只有右节点时 递归右节点 - if(!root.left) return 1 + minDepth(root.right);、 + if(!root.left) return 1 + minDepth(root.right); // 只有左节点时 递归左节点 if(!root.right) return 1 + minDepth(root.left); return Math.min(minDepth(root.left), minDepth(root.right)) + 1; From 0e480c58f0f7cc66e77f09cac6231d049dc7f23f Mon Sep 17 00:00:00 2001 From: coderwei <916606569@qq.com> Date: Tue, 5 Jul 2022 18:14:30 +0800 Subject: [PATCH 0902/3019] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E0234ts?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...36\346\226\207\351\223\276\350\241\250.md" | 68 +++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git "a/problems/0234.\345\233\236\346\226\207\351\223\276\350\241\250.md" "b/problems/0234.\345\233\236\346\226\207\351\223\276\350\241\250.md" index f591fcef2b..fa31dede3e 100644 --- "a/problems/0234.\345\233\236\346\226\207\351\223\276\350\241\250.md" +++ "b/problems/0234.\345\233\236\346\226\207\351\223\276\350\241\250.md" @@ -319,6 +319,74 @@ var isPalindrome = function(head) { }; ``` +```typescript +function isPalindrome(head: ListNode | null): boolean { + // 方法1:利用栈结构 将所有元素添加到栈中 + // 声明栈 + let stack:number[] = [] + + // 保存一份头结点 后续需要移动头结点 + let dummy:ListNode = head + + // 遍历链表将所有元素添加到数栈中 + while(dummy){ + stack.push(dummy.val) + dummy = dummy.next + } + + // 利用栈结构的先进先出后出的特性判断是否会文 + while(head){ + if(head.val!== stack.pop()) return false + head = head.next + } + + return true + + // 方法2:翻转后半部分链表 + // 封装翻转链表函数 + function reverseList(node:ListNode){ + let pre:ListNode = null + while(node){ + // 借助第三个变量 进行翻转 有疑问可以看链表篇(https://www.programmercarl.com/链表理论基础.html#单链表) + let temp:ListNode = node.next + node.next = pre + pre = node + node = temp + } + return pre + } + + // 快慢指针 需要注意的我们需要保证slow指针指向在要分隔节点的上一个节点,因为是单链表,无法找到链表前面的节点(也可以使用js代码的方法,新增个变量用去记录前一个节点) + let fast:ListNode = head.next + let slow:ListNode = head + while(fast){ + fast = fast.next + //只有fast有值的情况下才继续移动 不然代码会出现异常 + if(fast) { + fast = fast.next + slow = slow.next + } + } + + // 分隔链表 + let list2Head:ListNode = slow.next + // 断开slow节点的next指针 + slow.next = null + // 将后半部分进行翻转 + let list2 = reverseList(list2Head) + + // 最后进行迭代对比节点的值即可 + while(head && list2){ + if(head.val != list2.val) return false + head = head.next + list2 = list2.next + } + + return true +}; + +``` + ----------------------- From 0331eaa57f39c3a791603b94c1615e6118ac6737 Mon Sep 17 00:00:00 2001 From: wang2jun <91008685+wang2jun@users.noreply.github.com> Date: Tue, 5 Jul 2022 22:43:35 +0800 Subject: [PATCH 0903/3019] =?UTF-8?q?Update=200674.=E6=9C=80=E9=95=BF?= =?UTF-8?q?=E8=BF=9E=E7=BB=AD=E9=80=92=E5=A2=9E=E5=BA=8F=E5=88=97.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 更正对构造函数的使用 --- ...\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" "b/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" index 5865a68dac..7e4d0c19e4 100644 --- "a/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" +++ "b/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" @@ -300,7 +300,7 @@ Javascript: > 动态规划: ```javascript const findLengthOfLCIS = (nums) => { - let dp = Array(nums.length).fill(1); + let dp = new Array(nums.length).fill(1); for(let i = 0; i < nums.length - 1; i++) { From 2b68bee8f596b41a6be0b8e458b9ef90b245edcb Mon Sep 17 00:00:00 2001 From: wang2jun <91008685+wang2jun@users.noreply.github.com> Date: Wed, 6 Jul 2022 11:13:36 +0800 Subject: [PATCH 0904/3019] =?UTF-8?q?Update=200583.=E4=B8=A4=E4=B8=AA?= =?UTF-8?q?=E5=AD=97=E7=AC=A6=E4=B8=B2=E7=9A=84=E5=88=A0=E9=99=A4=E6=93=8D?= =?UTF-8?q?=E4=BD=9C.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 更正语法规范 --- ...\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" "b/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" index fc7e6f3940..0e02e721a8 100644 --- "a/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" +++ "b/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" @@ -205,7 +205,7 @@ func min(a, b int) int { Javascript: ```javascript const minDistance = (word1, word2) => { - let dp = Array.from(Array(word1.length + 1), () => Array(word2.length+1).fill(0)); + let dp = Array.from(new Array(word1.length + 1), () => Array(word2.length+1).fill(0)); for(let i = 1; i <= word1.length; i++) { dp[i][0] = i; From c383c1effeacf26ddbbee78e1e2fb29c7034f946 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=97=A4=E9=9C=B2?= <080301087@163.com> Date: Wed, 6 Jul 2022 17:38:33 +0800 Subject: [PATCH 0905/3019] =?UTF-8?q?Update=200450.=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=90=9C=E7=B4=A2=E6=A0=91=E4=B8=AD=E7=9A=84?= =?UTF-8?q?=E8=8A=82=E7=82=B9.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit python中不用删除节点,这样逻辑更清晰简洁 --- ...55\347\232\204\350\212\202\347\202\271.md" | 46 ++++++++----------- 1 file changed, 19 insertions(+), 27 deletions(-) diff --git "a/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" "b/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" index 3fa2a1c586..81da018f57 100644 --- "a/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" +++ "b/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" @@ -322,33 +322,25 @@ class Solution { ```python class Solution: - def deleteNode(self, root: TreeNode, key: int) -> TreeNode: - if not root: return root #第一种情况:没找到删除的节点,遍历到空节点直接返回了 - if root.val == key: - if not root.left and not root.right: #第二种情况:左右孩子都为空(叶子节点),直接删除节点, 返回NULL为根节点 - del root - return None - if not root.left and root.right: #第三种情况:其左孩子为空,右孩子不为空,删除节点,右孩子补位 ,返回右孩子为根节点 - tmp = root - root = root.right - del tmp - return root - if root.left and not root.right: #第四种情况:其右孩子为空,左孩子不为空,删除节点,左孩子补位,返回左孩子为根节点 - tmp = root - root = root.left - del tmp - return root - else: #第五种情况:左右孩子节点都不为空,则将删除节点的左子树放到删除节点的右子树的最左面节点的左孩子的位置 - v = root.right - while v.left: - v = v.left - v.left = root.left - tmp = root - root = root.right - del tmp - return root - if root.val > key: root.left = self.deleteNode(root.left,key) #左递归 - if root.val < key: root.right = self.deleteNode(root.right,key) #右递归 + def deleteNode(self, root: Optional[TreeNode], key: int) -> Optional[TreeNode]: + if not root : return None # 节点为空,返回 + if root.val < key : + root.right = self.deleteNode(root.right, key) + elif root.val > key : + root.left = self.deleteNode(root.left, key) + else: + # 当前节点的左子树为空,返回当前的右子树 + if not root.left : return root.right + # 当前节点的右子树为空,返回当前的左子树 + if not root.right: return root.left + # 左右子树都不为空,找到右孩子的最左节点 记为p + node = root.right + while node.left : + node = node.left + # 将当前节点的左子树挂在p的左孩子上 + node.left = root.left + # 当前节点的右子树替换掉当前节点,完成当前节点的删除 + root = root.right return root ``` From 0ee18c392d33c87f86a2de97cb7cd3654736a551 Mon Sep 17 00:00:00 2001 From: w2xi <43wangxi@gmail.com> Date: Wed, 6 Jul 2022 22:01:14 +0800 Subject: [PATCH 0906/3019] =?UTF-8?q?Update=200450.=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=90=9C=E7=B4=A2=E6=A0=91=E4=B8=AD=E7=9A=84?= =?UTF-8?q?=E8=8A=82=E7=82=B9.md=20JavaScript=E9=80=92=E5=BD=92=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...55\347\232\204\350\212\202\347\202\271.md" | 51 +++++++++++-------- 1 file changed, 31 insertions(+), 20 deletions(-) diff --git "a/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" "b/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" index 3fa2a1c586..3bc8369cc0 100644 --- "a/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" +++ "b/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" @@ -456,31 +456,42 @@ func deleteNode(root *TreeNode, key int) *TreeNode { * @param {number} key * @return {TreeNode} */ -var deleteNode = function (root, key) { - if (root === null) +var deleteNode = function(root, key) { + if (!root) return null; + if (key > root.val) { + root.right = deleteNode(root.right, key); return root; - if (root.val === key) { - if (!root.left) - return root.right; - else if (!root.right) + } else if (key < root.val) { + root.left = deleteNode(root.left, key); + return root; + } else { + // 场景1: 该节点是叶节点 + if (!root.left && !root.right) { + return null + } + // 场景2: 有一个孩子节点不存在 + if (root.left && !root.right) { return root.left; - else { - let cur = root.right; - while (cur.left) { - cur = cur.left; - } - cur.left = root.left; - root = root.right; - delete root; - return root; + } else if (root.right && !root.left) { + return root.right; } + // 场景3: 左右节点都存在 + const rightNode = root.right; + // 获取最小值节点 + const minNode = getMinNode(rightNode); + // 将待删除节点的值替换为最小值节点值 + root.val = minNode.val; + // 删除最小值节点 + root.right = deleteNode(root.right, minNode.val); + return root; } - if (root.val > key) - root.left = deleteNode(root.left, key); - if (root.val < key) - root.right = deleteNode(root.right, key); - return root; }; +function getMinNode(root) { + while (root.left) { + root = root.left; + } + return root; +} ``` 迭代 From 0c6b1db35cc3c5fc6d227026e4b5175628003318 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E5=91=98Carl?= Date: Thu, 7 Jul 2022 09:00:14 +0800 Subject: [PATCH 0907/3019] =?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 --- ...0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git "a/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" "b/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" index a788939b5b..31458d84c6 100644 --- "a/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" +++ "b/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" @@ -106,12 +106,9 @@ public: // 如果index大于链表的长度,则返回空 // 如果index小于0,则置为0,作为链表的新头节点。 void addAtIndex(int index, int val) { - if (index > _size) { + if (index > _size || index < 0) { return; } - else if (index < 0) { - index = 0; - } LinkedNode* newNode = new LinkedNode(val); LinkedNode* cur = _dummyHead; while(index--) { From 0f3ffb3e282af527cd2a529d7921a16321c2561e Mon Sep 17 00:00:00 2001 From: BaoTaoqi <464115280@qq.com> Date: Fri, 8 Jul 2022 10:58:53 +0800 Subject: [PATCH 0908/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200746.=E4=BD=BF?= =?UTF-8?q?=E7=94=A8=E6=9C=80=E5=B0=8F=E8=8A=B1=E8=B4=B9=E7=88=AC=E6=A5=BC?= =?UTF-8?q?=E6=A2=AF.md=20Rust=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加 0746.使用最小花费爬楼梯.md Rust版本 --- ...271\347\210\254\346\245\274\346\242\257.md" | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git "a/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" "b/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" index c2c737150e..0006f7ac93 100644 --- "a/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" +++ "b/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" @@ -288,6 +288,24 @@ function minCostClimbingStairs(cost: number[]): number { }; ``` +### Rust + +```Rust +use std::cmp::min; +impl Solution { + pub fn min_cost_climbing_stairs(cost: Vec) -> i32 { + let len = cost.len(); + let mut dp = vec![0; len]; + dp[0] = cost[0]; + dp[1] = cost[1]; + for i in 2..len { + dp[i] = min(dp[i-1], dp[i-2]) + cost[i]; + } + min(dp[len-1], dp[len-2]) + } +} +``` + ### C ```c From 9b3468e3b3e7ff844bc1c8d1a5bbb141072d5689 Mon Sep 17 00:00:00 2001 From: Ezralin <10881430+ezralin@user.noreply.gitee.com> Date: Fri, 8 Jul 2022 14:10:18 +0800 Subject: [PATCH 0909/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A00034=20Kotlin?= =?UTF-8?q?=E7=89=88,0203=20Kotlin=E7=89=88,0209=20Koltin=E7=89=88,=200977?= =?UTF-8?q?=20Kotlin=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...00\344\270\252\344\275\215\347\275\256.md" | 43 +++++++++++++++++++ ...76\350\241\250\345\205\203\347\264\240.md" | 34 +++++++++++++++ ...04\345\255\220\346\225\260\347\273\204.md" | 32 ++++++++++++++ ...04\347\232\204\345\271\263\346\226\271.md" | 28 ++++++++++++ 4 files changed, 137 insertions(+) diff --git "a/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" "b/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" index a81b36416a..6922c399dc 100644 --- "a/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" +++ "b/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" @@ -584,5 +584,48 @@ object Solution { ``` +### Kotlin +```kotlin +class Solution { + fun searchRange(nums: IntArray, target: Int): IntArray { + var index = binarySearch(nums, target) + // 没找到,返回[-1, -1] + if (index == -1) return intArrayOf(-1, -1) + var left = index + var right = index + // 寻找左边界 + while (left - 1 >=0 && nums[left - 1] == target){ + left-- + } + // 寻找右边界 + while (right + 1 target) { + right = middle - 1 + } + else { + if (nums[middle] < target) { + left = middle + 1 + } + else { + return middle + } + } + } + // 没找到,返回-1 + return -1 + } +} +``` + -----------------------
diff --git "a/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" "b/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" index b79d29a50d..ea936093f8 100644 --- "a/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" +++ "b/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" @@ -532,5 +532,39 @@ object Solution { } } ``` +Kotlin: +```kotlin +/** + * Example: + * var li = ListNode(5) + * var v = li.`val` + * Definition for singly-linked list. + * class ListNode(var `val`: Int) { + * var next: ListNode? = null + * } + */ +class Solution { + fun removeElements(head: ListNode?, `val`: Int): ListNode? { + // 使用虚拟节点,令该节点指向head + var dummyNode = ListNode(-1) + dummyNode.next = head + // 使用cur遍历链表各个节点 + var cur = dummyNode + // 判断下个节点是否为空 + while (cur.next != null) { + // 符合条件,移除节点 + if (cur.next.`val` == `val`) { + cur.next = cur.next.next + } + // 不符合条件,遍历下一节点 + else { + cur = cur.next + } + } + // 注意:返回的不是虚拟节点 + return dummyNode.next + } +} +``` -----------------------
diff --git "a/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" "b/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" index 090e73f073..c1633def0e 100644 --- "a/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" +++ "b/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" @@ -417,6 +417,38 @@ class Solution { } } ``` +滑动窗口 +```kotlin +class Solution { + fun minSubArrayLen(target: Int, nums: IntArray): Int { + // 左边界 和 右边界 + var left: Int = 0 + var right: Int = 0 + // sum 用来记录和 + var sum: Int = 0 + // result记录一个固定值,便于判断是否存在的这样的数组 + var result: Int = Int.MAX_VALUE + // subLenth记录长度 + var subLength = Int.MAX_VALUE + + + while (right < nums.size) { + // 从数组首元素开始逐次求和 + sum += nums[right++] + // 判断 + while (sum >= target) { + var temp = right - left + // 每次和上一次比较求出最小数组长度 + subLength = if (subLength > temp) temp else subLength + // sum减少,左边界右移 + sum -= nums[left++] + } + } + // 如果subLength为初始值,则说明长度为0,否则返回subLength + return if(subLength == result) 0 else subLength + } +} +``` Scala: 滑动窗口: diff --git "a/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" "b/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" index 458107dd2e..d46b525993 100644 --- "a/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" +++ "b/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" @@ -362,6 +362,8 @@ class Solution { ``` Kotlin: + +双指针法 ```kotlin class Solution { // 双指针法 @@ -383,6 +385,32 @@ class Solution { } } ``` +骚操作(暴力思路) +```kotlin +class Solution { + fun sortedSquares(nums: IntArray): IntArray { + // left 与 right 用来控制循环,类似于滑动窗口 + var left: Int = 0; + var right: Int = nums.size - 1; + // 将每个数字的平方经过排序后加入result数值 + var result: IntArray = IntArray(nums.size); + var k: Int = nums.size - 1; + while (left <= right) { + // 从大到小,从后向前填满数组 + // [left, right] 控制循环 + if (nums[left] * nums[left] > nums[right] * nums[right]) { + result[k--] = nums[left] * nums[left] + left++ + } + else { + result[k--] = nums[right] * nums[right] + right-- + } + } + return result + } +} +``` Scala: From a8897483eade1262627d360544e7022951162243 Mon Sep 17 00:00:00 2001 From: BaoTaoqi <464115280@qq.com> Date: Fri, 8 Jul 2022 14:40:26 +0800 Subject: [PATCH 0910/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200062.=E4=B8=8D?= =?UTF-8?q?=E5=90=8C=E8=B7=AF=E5=BE=84.md=20Rust=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加 0062.不同路径.md Rust版本 --- ...15\345\220\214\350\267\257\345\276\204.md" | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git "a/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" "b/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" index 02bcc2aeea..aa7c8ab823 100644 --- "a/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" +++ "b/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" @@ -374,6 +374,30 @@ function uniquePaths(m: number, n: number): number { }; ``` +### Rust + +```Rust +impl Solution { + pub fn unique_paths(m: i32, n: i32) -> i32 { + let m = m as usize; + let n = n as usize; + let mut dp = vec![vec![0; n]; m]; + for i in 0..m { + dp[i][0] = 1; + } + for j in 0..n { + dp[0][j] = 1; + } + for i in 1..m { + for j in 1..n { + dp[i][j] = dp[i-1][j] + dp[i][j-1]; + } + } + dp[m-1][n-1] + } +} +``` + ### C ```c From 821cca116c6d42020ddac3bbb68c632eba7de132 Mon Sep 17 00:00:00 2001 From: BaoTaoqi <464115280@qq.com> Date: Fri, 8 Jul 2022 15:11:49 +0800 Subject: [PATCH 0911/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200063.=E4=B8=8D?= =?UTF-8?q?=E5=90=8C=E8=B7=AF=E5=BE=84II.md=20Rust=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加 0063.不同路径II.md Rust版本 --- ...\345\220\214\350\267\257\345\276\204II.md" | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git "a/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" "b/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" index ca34055a60..e3857db6c9 100644 --- "a/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" +++ "b/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" @@ -384,6 +384,42 @@ function uniquePathsWithObstacles(obstacleGrid: number[][]): number { }; ``` +### Rust + +```Rust +impl Solution { + pub fn unique_paths_with_obstacles(obstacle_grid: Vec>) -> i32 { + let m: usize = obstacle_grid.len(); + let n: usize = obstacle_grid[0].len(); + if obstacle_grid[0][0] == 1 || obstacle_grid[m-1][n-1] == 1 { + return 0; + } + let mut dp = vec![vec![0; n]; m]; + for i in 0..m { + if obstacle_grid[i][0] == 1 { + break; + } + else { dp[i][0] = 1; } + } + for j in 0..n { + if obstacle_grid[0][j] == 1 { + break; + } + else { dp[0][j] = 1; } + } + for i in 1..m { + for j in 1..n { + if obstacle_grid[i][j] == 1 { + continue; + } + dp[i][j] = dp[i-1][j] + dp[i][j-1]; + } + } + dp[m-1][n-1] + } +} +``` + ### C ```c From e2d16c5894b2b9abed99c42522977dac2b6e8654 Mon Sep 17 00:00:00 2001 From: BaoTaoqi <464115280@qq.com> Date: Sun, 10 Jul 2022 09:09:02 +0800 Subject: [PATCH 0912/3019] =?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=200077.=E7=BB=84=E5=90=88=200077.=E7=BB=84=E5=90=88?= =?UTF-8?q?=E4=BC=98=E5=8C=96=200216.=E7=BB=84=E5=90=88=E6=80=BB=E5=92=8CI?= =?UTF-8?q?II=20Rust=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加 0017.电话号码的字母组合 0077.组合 0077.组合优化 0216.组合总和III Rust版本 --- ...27\346\257\215\347\273\204\345\220\210.md" | 43 ++++++++++++++++ "problems/0077.\347\273\204\345\220\210.md" | 50 +++++++++++++++++++ ...04\345\220\210\344\274\230\345\214\226.md" | 26 ++++++++++ ...345\220\210\346\200\273\345\222\214III.md" | 29 +++++++++++ 4 files changed, 148 insertions(+) diff --git "a/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" "b/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" index e357a33b6f..5778e903c5 100644 --- "a/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" +++ "b/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" @@ -454,6 +454,49 @@ function letterCombinations(digits: string): string[] { }; ``` +## Rust + +```Rust +impl Solution { + fn backtracking(result: &mut Vec, s: &mut String, map: &[&str; 10], digits: &String, index: usize) { + let len = digits.len(); + if len == index { + result.push(s.to_string()); + return; + } + // 在保证不会越界的情况下使用unwrap()将Some()中的值提取出来 + let digit= digits.chars().nth(index).unwrap().to_digit(10).unwrap() as usize; + let letters = map[digit]; + for i in letters.chars() { + s.push(i); + Self::backtracking(result, s, &map, &digits, index+1); + s.pop(); + } + } + pub fn letter_combinations(digits: String) -> Vec { + if digits.len() == 0 { + return vec![]; + } + const MAP: [&str; 10] = [ + "", + "", + "abc", + "def", + "ghi", + "jkl", + "mno", + "pqrs", + "tuv", + "wxyz" + ]; + let mut result: Vec = Vec::new(); + let mut s: String = String::new(); + Self::backtracking(&mut result, &mut s, &MAP, &digits, 0); + result + } +} +``` + ## C ```c diff --git "a/problems/0077.\347\273\204\345\220\210.md" "b/problems/0077.\347\273\204\345\220\210.md" index fc72be150a..5a4811bab7 100644 --- "a/problems/0077.\347\273\204\345\220\210.md" +++ "b/problems/0077.\347\273\204\345\220\210.md" @@ -535,6 +535,56 @@ func backtrack(n,k,start int,track []int){ } ``` +### Rust + +```Rust +impl Solution { + fn backtracking(result: &mut Vec>, path: &mut Vec, n: i32, k: i32, startIndex: i32) { + let len= path.len() as i32; + if len == k{ + result.push(path.to_vec()); + return; + } + for i in startIndex..= n { + path.push(i); + Self::backtracking(result, path, n, k, i+1); + path.pop(); + } + } + pub fn combine(n: i32, k: i32) -> Vec> { + let mut result: Vec> = Vec::new(); + let mut path: Vec = Vec::new(); + Self::backtracking(&mut result, &mut path, n, k, 1); + result + } +} +``` + +剪枝 +```Rust +impl Solution { + fn backtracking(result: &mut Vec>, path: &mut Vec, n: i32, k: i32, startIndex: i32) { + let len= path.len() as i32; + if len == k{ + result.push(path.to_vec()); + return; + } + // 此处剪枝 + for i in startIndex..= n - (k - len) + 1 { + path.push(i); + Self::backtracking(result, path, n, k, i+1); + path.pop(); + } + } + pub fn combine(n: i32, k: i32) -> Vec> { + let mut result: Vec> = Vec::new(); + let mut path: Vec = Vec::new(); + Self::backtracking(&mut result, &mut path, n, k, 1); + result + } +} +``` + ### C ```c int* path; diff --git "a/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" "b/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" index 8d74256602..e336fb7547 100644 --- "a/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" +++ "b/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" @@ -261,6 +261,32 @@ function combine(n: number, k: number): number[][] { }; ``` +Rust: + +```Rust +impl Solution { + fn backtracking(result: &mut Vec>, path: &mut Vec, n: i32, k: i32, startIndex: i32) { + let len= path.len() as i32; + if len == k{ + result.push(path.to_vec()); + return; + } + // 此处剪枝 + for i in startIndex..= n - (k - len) + 1 { + path.push(i); + Self::backtracking(result, path, n, k, i+1); + path.pop(); + } + } + pub fn combine(n: i32, k: i32) -> Vec> { + let mut result: Vec> = Vec::new(); + let mut path: Vec = Vec::new(); + Self::backtracking(&mut result, &mut path, n, k, 1); + result + } +} +``` + C: ```c diff --git "a/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" "b/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" index 2c1bf717e8..0a59e21643 100644 --- "a/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" +++ "b/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" @@ -411,6 +411,35 @@ function combinationSum3(k: number, n: number): number[][] { }; ``` +## Rust + +```Rust +impl Solution { + fn backtracking(result: &mut Vec>, path:&mut Vec, targetSum:i32, k: i32, mut sum: i32, startIndex: i32) { + let len = path.len() as i32; + if len == k { + if sum == targetSum { + result.push(path.to_vec()); + } + return; + } + for i in startIndex..=9 { + sum += i; + path.push(i); + Self::backtracking(result, path, targetSum, k, sum, i+1); + sum -= i; + path.pop(); + } + } + pub fn combination_sum3(k: i32, n: i32) -> Vec> { + let mut result: Vec> = Vec::new(); + let mut path: Vec = Vec::new(); + Self::backtracking(&mut result, &mut path, n, k, 0, 1); + result + } +} +``` + ## C ```c From 85e0d6c85d593339152483a3fea33ab23cdcd5b3 Mon Sep 17 00:00:00 2001 From: AronJudge <2286381138@qq.com> Date: Mon, 11 Jul 2022 11:06:51 +0800 Subject: [PATCH 0913/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B00347=20=E5=89=8DK?= =?UTF-8?q?=E4=B8=AA=E9=AB=98=E9=A2=91=E5=85=83=E7=B4=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 由原来的构建小顶堆改为构建大顶堆,减少部分代码逻辑,并增加了注释 通过LeetCode提交代码,修改后的执行时间更快。 --- ...252\351\253\230\351\242\221\345\205\203\347\264\240.md" | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git "a/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" "b/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" index a04041ccdf..0c978b2a6c 100644 --- "a/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" +++ "b/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" @@ -141,13 +141,10 @@ class Solution { } Set> entries = map.entrySet(); - // 根据map的value值正序排,相当于一个小顶堆 - PriorityQueue> queue = new PriorityQueue<>((o1, o2) -> o1.getValue() - o2.getValue()); + // 根据map的value值,构建于一个大顶堆(o1 - o2: 小顶堆, o2 - o1 : 大顶堆) + PriorityQueue> queue = new PriorityQueue<>((o1, o2) -> o2.getValue() - o1.getValue()); for (Map.Entry entry : entries) { queue.offer(entry); - if (queue.size() > k) { - queue.poll(); - } } for (int i = k - 1; i >= 0; i--) { result[i] = queue.poll().getKey(); From c265c9220c62a78109c1f6033d47f9bc8b3f47bd Mon Sep 17 00:00:00 2001 From: BaoTaoqi <464115280@qq.com> Date: Mon, 11 Jul 2022 14:50:03 +0800 Subject: [PATCH 0914/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200203.=E7=A7=BB?= =?UTF-8?q?=E9=99=A4=E9=93=BE=E8=A1=A8=E5=85=83=E7=B4=A0=200344.=E5=8F=8D?= =?UTF-8?q?=E8=BD=AC=E5=AD=97=E7=AC=A6=E4=B8=B2=200376.=E6=91=86=E5=8A=A8?= =?UTF-8?q?=E5=BA=8F=E5=88=97=200541.=E5=8F=8D=E8=BD=AC=E5=AD=97=E7=AC=A6?= =?UTF-8?q?=E4=B8=B2II=20=E5=89=91=E6=8C=87Offer05.=E6=9B=BF=E6=8D=A2?= =?UTF-8?q?=E7=A9=BA=E6=A0=BC=20Rust=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加 0203.移除链表元素 0344.反转字符串 0376.摆动序列 0541.反转字符串II 剑指Offer05.替换空格 Rust版本 --- ...76\350\241\250\345\205\203\347\264\240.md" | 18 ++++++----- ...54\345\255\227\347\254\246\344\270\262.md" | 16 ++++++++++ ...06\345\212\250\345\272\217\345\210\227.md" | 23 ++++++++++++++ ...\345\255\227\347\254\246\344\270\262II.md" | 31 +++++++++++++++++++ ...77\346\215\242\347\251\272\346\240\274.md" | 31 +++++++++++++++++++ 5 files changed, 111 insertions(+), 8 deletions(-) diff --git "a/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" "b/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" index b79d29a50d..cb46dc703b 100644 --- "a/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" +++ "b/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" @@ -487,17 +487,19 @@ RUST: // } impl Solution { pub fn remove_elements(head: Option>, val: i32) -> Option> { - let mut head = head; - let mut dummy_head = ListNode::new(0); - let mut cur = &mut dummy_head; - while let Some(mut node) = head { - head = std::mem::replace(&mut node.next, None); - if node.val != val { - cur.next = Some(node); + let mut dummyHead = Box::new(ListNode::new(0)); + dummyHead.next = head; + let mut cur = dummyHead.as_mut(); + // 使用take()替换std::men::replace(&mut node.next, None)达到相同的效果,并且更普遍易读 + while let Some(nxt) = cur.next.take() { + if nxt.val == val { + cur.next = nxt.next; + } else { + cur.next = Some(nxt); cur = cur.next.as_mut().unwrap(); } } - dummy_head.next + dummyHead.next } } ``` diff --git "a/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" "b/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" index aba6e2f381..3138f60f8b 100644 --- "a/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" @@ -238,6 +238,22 @@ func reverseString(_ s: inout [Character]) { ``` +Rust: +```Rust +impl Solution { + pub fn reverse_string(s: &mut Vec) { + let (mut left, mut right) = (0, s.len()-1); + while left < right { + let temp = s[left]; + s[left] = s[right]; + s[right] = temp; + left += 1; + right -= 1; + } + } +} +``` + C: ```c void reverseString(char* s, int sSize){ diff --git "a/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" "b/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" index 00f8f70cf9..33a5282d1c 100644 --- "a/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" +++ "b/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" @@ -298,6 +298,29 @@ var wiggleMaxLength = function(nums) { }; ``` +### Rust +**贪心** +```Rust +impl Solution { + pub fn wiggle_max_length(nums: Vec) -> i32 { + let len = nums.len() as usize; + if len <= 1 { + return len as i32; + } + let mut preDiff = 0; + let mut curDiff = 0; + let mut result = 1; + for i in 0..len-1 { + curDiff = nums[i+1] - nums[i]; + if (preDiff <= 0 && curDiff > 0) || (preDiff >= 0 && curDiff < 0) { + result += 1; + preDiff = curDiff; + } + } + result + } +} +``` ### C **贪心** diff --git "a/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" "b/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" index 84061ef56b..7ef6463e0c 100644 --- "a/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" +++ "b/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" @@ -389,5 +389,36 @@ object Solution { } } ``` + +Rust: + +```Rust +impl Solution { + pub fn reverse(s: &mut Vec, mut begin: usize, mut end: usize){ + while begin < end { + let temp = s[begin]; + s[begin] = s[end]; + s[end] = temp; + begin += 1; + end -= 1; + } + } + pub fn reverse_str(s: String, k: i32) -> String { + let len = s.len(); + let k = k as usize; + let mut s = s.chars().collect::>(); + for i in (0..len).step_by(2 * k) { + if i + k < len { + Self::reverse(&mut s, i, i + k - 1); + } + else { + Self::reverse(&mut s, i, len - 1); + } + } + s.iter().collect::() + } +} +``` + -----------------------
diff --git "a/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" "b/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" index 78b03b17be..e1ccc458a4 100644 --- "a/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" +++ "b/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" @@ -506,6 +506,37 @@ function spaceLen($s){ } ``` +Rust + +```Rust +impl Solution { + pub fn replace_space(s: String) -> String { + let mut len: usize = s.len(); + let mut s = s.chars().collect::>(); + let mut count = 0; + for i in &s { + if i.is_ascii_whitespace() { + count += 1; + } + } + let mut new_len = len + count * 2; + s.resize(new_len, ' '); + while len < new_len { + len -= 1; + new_len -= 1; + if s[len].is_ascii_whitespace() { + s[new_len] = '0'; + s[new_len - 1] = '2'; + s[new_len - 2] = '%'; + new_len -= 2; + } + else { s[new_len] = s[len] } + } + s.iter().collect::() + } +} +``` + -----------------------
From e0a422859904ddae865cc828bc30d6620ccb8137 Mon Sep 17 00:00:00 2001 From: Ezralin <10881430+ezralin@user.noreply.gitee.com> Date: Mon, 11 Jul 2022 15:09:41 +0800 Subject: [PATCH 0915/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A00206.=E7=BF=BB?= =?UTF-8?q?=E8=BD=AC=E9=93=BE=E8=A1=A8=20Kotlin=E8=A7=A3=E6=9E=90=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...73\350\275\254\351\223\276\350\241\250.md" | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git "a/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md" "b/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md" index 24ec7b943a..bb9b62d52a 100644 --- "a/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md" +++ "b/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md" @@ -420,6 +420,41 @@ fun reverseList(head: ListNode?): ListNode? { return pre } ``` +```kotlin +/** + * Example: + * var li = ListNode(5) + * var v = li.`val` + * Definition for singly-linked list. + * class ListNode(var `val`: Int) { + * var next: ListNode? = null + * } + */ +class Solution { + fun reverseList(head: ListNode?): ListNode? { + // temp用来存储临时的节点 + var temp: ListNode? + // cur用来遍历链表 + var cur: ListNode? = head + // pre用来作为链表反转的工具 + // pre是比pre前一位的节点 + var pre: ListNode? = null + while (cur != null) { + // 临时存储原本cur的下一个节点 + temp = cur.next + // 使cur下一节点地址为它之前的 + cur.next = pre + // 之后随着cur的遍历移动pre + pre = cur; + // 移动cur遍历链表各个节点 + cur = temp; + } + // 由于开头使用pre为null,所以cur等于链表本身长度+1, + // 此时pre在cur前一位,所以此时pre为头节点 + return pre; + } +} +``` Swift: ```swift From 4e77e911b397938419a41c2a06684318740fc907 Mon Sep 17 00:00:00 2001 From: cezarbbb <105843128+cezarbbb@users.noreply.github.com> Date: Mon, 11 Jul 2022 17:42:21 +0800 Subject: [PATCH 0916/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200151.=E7=BF=BB?= =?UTF-8?q?=E8=BD=AC=E5=AD=97=E7=AC=A6=E4=B8=B2=E9=87=8C=E7=9A=84=E5=8D=95?= =?UTF-8?q?=E8=AF=8D=20Rust=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加 0151.翻转字符串里的单词 Rust版本 --- ...14\347\232\204\345\215\225\350\257\215.md" | 53 ++++++++++++++++++- 1 file changed, 52 insertions(+), 1 deletion(-) diff --git "a/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" "b/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" index 38372f91e4..552584f5dc 100644 --- "a/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" +++ "b/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" @@ -864,7 +864,58 @@ function reverseString(&$s, $start, $end) { return ; } ``` - +Rust: + +```Rust +// 根据C++版本二思路进行实现 +// 函数名根据Rust编译器建议由驼峰命名法改为蛇形命名法 +impl Solution { + pub fn reverse(s: &mut Vec, mut begin: usize, mut end: usize){ + while begin < end { + let temp = s[begin]; + s[begin] = s[end]; + s[end] = temp; + begin += 1; + end -= 1; + } +} +pub fn remove_extra_spaces(s: &mut Vec) { + let mut slow: usize = 0; + let len = s.len(); + // 注意这里不能用for循环,不然在里面那个while循环中对i的递增会失效 + let mut i: usize = 0; + while i < len { + if !s[i].is_ascii_whitespace() { + if slow != 0 { + s[slow] = ' '; + slow += 1; + } + while i < len && !s[i].is_ascii_whitespace() { + s[slow] = s[i]; + slow += 1; + i += 1; + } + } + i += 1; + } + s.resize(slow, ' '); + } + pub fn reverse_words(s: String) -> String { + let mut s = s.chars().collect::>(); + Self::remove_extra_spaces(&mut s); + let len = s.len(); + Self::reverse(&mut s, 0, len - 1); + let mut start = 0; + for i in 0..=len { + if i == len || s[i].is_ascii_whitespace() { + Self::reverse(&mut s, start, i - 1); + start = i + 1; + } + } + s.iter().collect::() + } +} +``` -----------------------
From ba081f84a85ff75134c4db551e0e631b86693081 Mon Sep 17 00:00:00 2001 From: AronJudge <2286381138@qq.com> Date: Tue, 12 Jul 2022 11:36:26 +0800 Subject: [PATCH 0917/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200104.=20?= =?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=A0=91=E6=9C=80=E5=A4=A7=E6=B7=B1=E5=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 代码错误,更正代码,通过LeetCode代码检验。 --- ...00\345\244\247\346\267\261\345\272\246.md" | 25 +++++++++---------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git "a/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" "b/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" index ed27f95d11..559801897a 100644 --- "a/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" +++ "b/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" @@ -294,14 +294,13 @@ class solution { /** * 递归法 */ - public int maxdepth(treenode root) { + public int maxDepth(TreeNode root) { if (root == null) { return 0; } - int leftdepth = maxdepth(root.left); - int rightdepth = maxdepth(root.right); - return math.max(leftdepth, rightdepth) + 1; - + int leftDepth = maxDepth(root.left); + int rightDepth = maxDepth(root.right); + return Math.max(leftDepth, rightDepth) + 1; } } ``` @@ -311,23 +310,23 @@ class solution { /** * 迭代法,使用层序遍历 */ - public int maxdepth(treenode root) { + public int maxDepth(TreeNode root) { if(root == null) { return 0; } - deque deque = new linkedlist<>(); + Deque deque = new LinkedList<>(); deque.offer(root); int depth = 0; - while (!deque.isempty()) { + while (!deque.isEmpty()) { int size = deque.size(); depth++; for (int i = 0; i < size; i++) { - treenode poll = deque.poll(); - if (poll.left != null) { - deque.offer(poll.left); + TreeNode node = deque.poll(); + if (node.left != null) { + deque.offer(node.left); } - if (poll.right != null) { - deque.offer(poll.right); + if (node.right != null) { + deque.offer(node.right); } } } From a8e19d60bb371a44296134932b7470825c1fda6a Mon Sep 17 00:00:00 2001 From: cezarbbb <105843128+cezarbbb@users.noreply.github.com> Date: Tue, 12 Jul 2022 14:08:50 +0800 Subject: [PATCH 0918/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200202.=E5=BF=AB?= =?UTF-8?q?=E4=B9=90=E6=95=B0=20Rust=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加 0202.快乐数 Rust版本 --- ...2.\345\277\253\344\271\220\346\225\260.md" | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git "a/problems/0202.\345\277\253\344\271\220\346\225\260.md" "b/problems/0202.\345\277\253\344\271\220\346\225\260.md" index 0bea0c7233..2303765c2f 100644 --- "a/problems/0202.\345\277\253\344\271\220\346\225\260.md" +++ "b/problems/0202.\345\277\253\344\271\220\346\225\260.md" @@ -315,6 +315,36 @@ class Solution { } ``` +Rust: +```Rust +use std::collections::HashSet; +impl Solution { + pub fn get_sum(mut n: i32) -> i32 { + let mut sum = 0; + while n > 0 { + sum += (n % 10) * (n % 10); + n /= 10; + } + sum + } + + pub fn is_happy(n: i32) -> bool { + let mut n = n; + let mut set = HashSet::new(); + loop { + let sum = Self::get_sum(n); + if sum == 1 { + return true; + } + if set.contains(&sum) { + return false; + } else { set.insert(sum); } + n = sum; + } + } +} +``` + C: ```C typedef struct HashNodeTag { From eb3eb336dedfcbbcc0d90eab392e4799479d675e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=A1=9C=E5=B0=8F=E8=B7=AF=E4=B8=83=E8=91=89?= <20304773@qq.com> Date: Tue, 12 Jul 2022 14:09:05 +0800 Subject: [PATCH 0919/3019] =?UTF-8?q?Update=200059.=E8=9E=BA=E6=97=8B?= =?UTF-8?q?=E7=9F=A9=E9=98=B5II.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\346\227\213\347\237\251\351\230\265II.md" | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git "a/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" "b/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" index bf0a279e25..9690abb602 100644 --- "a/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" +++ "b/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" @@ -598,5 +598,30 @@ object Solution { } } ``` +C#: +```csharp +public class Solution { + public int[][] GenerateMatrix(int n) { + int[][] answer = new int[n][]; + for(int i = 0; i < n; i++) + answer[i] = new int[n]; + int start = 0; + int end = n - 1; + int tmp = 1; + while(tmp < n * n) + { + for(int i = start; i < end; i++) answer[start][i] = tmp++; + for(int i = start; i < end; i++) answer[i][end] = tmp++; + for(int i = end; i > start; i--) answer[end][i] = tmp++; + for(int i = end; i > start; i--) answer[i][start] = tmp++; + start++; + end--; + } + if(n % 2 == 1) answer[n / 2][n / 2] = tmp; + return answer; + } +} +``` + -----------------------
From 07ab44ede3fa043184754a638f59e6b76a7c3e0a Mon Sep 17 00:00:00 2001 From: cezarbbb <105843128+cezarbbb@users.noreply.github.com> Date: Tue, 12 Jul 2022 15:26:07 +0800 Subject: [PATCH 0920/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200015.=E4=B8=89?= =?UTF-8?q?=E6=95=B0=E4=B9=8B=E5=92=8C=200018.=E5=9B=9B=E6=95=B0=E4=B9=8B?= =?UTF-8?q?=E5=92=8C=20Rust=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加 0015.三数之和 0018.四数之和 Rust版本 --- ...11\346\225\260\344\271\213\345\222\214.md" | 65 +++++++++++++++++++ ...33\346\225\260\344\271\213\345\222\214.md" | 45 +++++++++++++ 2 files changed, 110 insertions(+) diff --git "a/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" "b/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" index 4f1d711a7a..94885b0c6f 100644 --- "a/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" @@ -554,6 +554,71 @@ func threeSum(_ nums: [Int]) -> [[Int]] { } ``` +Rust: +```Rust +// 哈希解法 +use std::collections::HashSet; +impl Solution { + pub fn three_sum(nums: Vec) -> Vec> { + let mut result: Vec> = Vec::new(); + let mut nums = nums; + nums.sort(); + let len = nums.len(); + for i in 0..len { + if nums[i] > 0 { break; } + if i > 0 && nums[i] == nums[i - 1] { continue; } + let mut set = HashSet::new(); + for j in (i + 1)..len { + if j > i + 2 && nums[j] == nums[j - 1] && nums[j] == nums[j - 2] { continue; } + let c = 0 - (nums[i] + nums[j]); + if set.contains(&c) { + result.push(vec![nums[i], nums[j], c]); + set.remove(&c); + } else { set.insert(nums[j]); } + } + } + result + } +} +``` + +```Rust +// 双指针法 +use std::collections::HashSet; +impl Solution { + pub fn three_sum(nums: Vec) -> Vec> { + let mut result: Vec> = Vec::new(); + let mut nums = nums; + nums.sort(); + let len = nums.len(); + for i in 0..len { + if nums[i] > 0 { return result; } + if i > 0 && nums[i] == nums[i - 1] { continue; } + let (mut left, mut right) = (i + 1, len - 1); + while left < right { + if nums[i] + nums[left] + nums[right] > 0 { + right -= 1; + // 去重 + while left < right && nums[right] == nums[right + 1] { right -= 1; } + } else if nums[i] + nums[left] + nums[right] < 0 { + left += 1; + // 去重 + while left < right && nums[left] == nums[left - 1] { left += 1; } + } else { + result.push(vec![nums[i], nums[left], nums[right]]); + // 去重 + right -= 1; + left += 1; + while left < right && nums[right] == nums[right + 1] { right -= 1; } + while left < right && nums[left] == nums[left - 1] { left += 1; } + } + } + } + result + } +} +``` + C: ```C //qsort辅助cmp函数 diff --git "a/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" "b/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" index 2146a11469..f6cfad29cc 100644 --- "a/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" @@ -522,6 +522,51 @@ public class Solution } } ``` + +Rust: +```Rust +impl Solution { + pub fn four_sum(nums: Vec, target: i32) -> Vec> { + let mut result: Vec> = Vec::new(); + let mut nums = nums; + nums.sort(); + let len = nums.len(); + for k in 0..len { + // 剪枝 + if nums[k] > target && (nums[k] > 0 || target > 0) { break; } + // 去重 + if k > 0 && nums[k] == nums[k - 1] { continue; } + for i in (k + 1)..len { + // 剪枝 + if nums[k] + nums[i] > target && (nums[k] + nums[i] >= 0 || target >= 0) { break; } + // 去重 + if i > k + 1 && nums[i] == nums[i - 1] { continue; } + let (mut left, mut right) = (i + 1, len - 1); + while left < right { + if nums[k] + nums[i] > target - (nums[left] + nums[right]) { + right -= 1; + // 去重 + while left < right && nums[right] == nums[right + 1] { right -= 1; } + } else if nums[k] + nums[i] < target - (nums[left] + nums[right]) { + left += 1; + // 去重 + while left < right && nums[left] == nums[left - 1] { left += 1; } + } else { + result.push(vec![nums[k], nums[i], nums[left], nums[right]]); + // 去重 + while left < right && nums[right] == nums[right - 1] { right -= 1; } + while left < right && nums[left] == nums[left + 1] { left += 1; } + left += 1; + right -= 1; + } + } + } + } + result + } +} +``` + Scala: ```scala object Solution { From f5e1834439d64d09b2e8d8b4e5141510e205dbc3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=9D=A8?= <2979742951@qq.com> Date: Wed, 13 Jul 2022 16:15:12 +0800 Subject: [PATCH 0921/3019] =?UTF-8?q?=E5=8F=8D=E8=BD=AC=E5=AD=97=E7=AC=A6?= =?UTF-8?q?=E4=B8=B2II=E6=B7=BB=E5=8A=A0=E4=BA=86=E4=B8=80=E7=A7=8DC++?= =?UTF-8?q?=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...4\345\255\227\347\254\246\344\270\262II.md" | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git "a/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" "b/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" index 84061ef56b..d9b9466cd0 100644 --- "a/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" +++ "b/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" @@ -63,6 +63,24 @@ public: }; ``` + +``` +class Solution { +public: + string reverseStr(string s, int k) { + int n=s.size(),pos=0; + while(pos Date: Wed, 13 Jul 2022 19:27:34 +0800 Subject: [PATCH 0922/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20=E5=89=91?= =?UTF-8?q?=E6=8C=87Offer=2058-II.=E5=B7=A6=E6=97=8B=E8=BD=AC=E5=AD=97?= =?UTF-8?q?=E7=AC=A6=E4=B8=B2=20Rust=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加 剑指Offer 58-II.左旋转字符串 Rust版本 --- ...54\345\255\227\347\254\246\344\270\262.md" | 25 ++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git "a/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" "b/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" index 4674c14170..de4a903000 100644 --- "a/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" @@ -341,7 +341,30 @@ object Solution { } ``` - +Rust: + +```Rust +impl Solution { + pub fn reverse(s: &mut Vec, mut begin: usize, mut end: usize){ + while begin < end { + let temp = s[begin]; + s[begin] = s[end]; + s[end] = temp; + begin += 1; + end -= 1; + } + } + pub fn reverse_left_words(s: String, n: i32) -> String { + let len = s.len(); + let mut s = s.chars().collect::>(); + let n = n as usize; + Self::reverse(&mut s, 0, n - 1); + Self::reverse(&mut s, n, len - 1); + Self::reverse(&mut s, 0, len - 1); + s.iter().collect::() + } +} +``` From e15beb5f14f212e2ffe24bedba1e5ae30fdcaba7 Mon Sep 17 00:00:00 2001 From: jiecheney <89916583+JakeVander@users.noreply.github.com> Date: Thu, 14 Jul 2022 10:41:34 +0800 Subject: [PATCH 0923/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200090.=E5=AD=90?= =?UTF-8?q?=E9=9B=86II.md=20Python3=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/.gitignore | 8 +++ .idea/encodings.xml | 6 ++ .idea/inspectionProfiles/Project_Default.xml | 70 +++++++++++++++++++ .../inspectionProfiles/profiles_settings.xml | 6 ++ .idea/leetcode-master.iml | 8 +++ .idea/misc.xml | 11 +++ .idea/modules.xml | 8 +++ .idea/vagrant.xml | 7 ++ .idea/vcs.xml | 6 ++ "problems/0090.\345\255\220\351\233\206II.md" | 27 +++++++ 10 files changed, 157 insertions(+) create mode 100644 .idea/.gitignore create mode 100644 .idea/encodings.xml create mode 100644 .idea/inspectionProfiles/Project_Default.xml create mode 100644 .idea/inspectionProfiles/profiles_settings.xml create mode 100644 .idea/leetcode-master.iml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/vagrant.xml create mode 100644 .idea/vcs.xml diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000000..35410cacdc --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# 默认忽略的文件 +/shelf/ +/workspace.xml +# 基于编辑器的 HTTP 客户端请求 +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000000..c2bae49d78 --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000000..3f19e2d85a --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,70 @@ + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 0000000000..105ce2da2d --- /dev/null +++ b/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/.idea/leetcode-master.iml b/.idea/leetcode-master.iml new file mode 100644 index 0000000000..d0876a78d0 --- /dev/null +++ b/.idea/leetcode-master.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000000..8ca8e3b1af --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,11 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000000..7c250acde5 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vagrant.xml b/.idea/vagrant.xml new file mode 100644 index 0000000000..a5aa786803 --- /dev/null +++ b/.idea/vagrant.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000000..94a25f7f4c --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git "a/problems/0090.\345\255\220\351\233\206II.md" "b/problems/0090.\345\255\220\351\233\206II.md" index e85ec66d3c..d503846ea6 100644 --- "a/problems/0090.\345\255\220\351\233\206II.md" +++ "b/problems/0090.\345\255\220\351\233\206II.md" @@ -261,6 +261,33 @@ class Solution: self.path.pop() ``` +### Python3 +```python3 +class Solution: + def subsetsWithDup(self, nums: List[int]) -> List[List[int]]: + res = [] + path = [] + nums.sort() # 去重需要先对数组进行排序 + + def backtracking(nums, startIndex): + # 终止条件 + res.append(path[:]) + if startIndex == len(nums): + return + + # for循环 + for i in range(startIndex, len(nums)): + # 数层去重 + if i > startIndex and nums[i] == nums[i-1]: # 去重 + continue + path.append(nums[i]) + backtracking(nums, i+1) + path.pop() + + backtracking(nums, 0) + return res +``` + ### Go ```Go From acd71b8b9e134fdc1fbe0f73d78b5f80b7b03a59 Mon Sep 17 00:00:00 2001 From: cezarbbb <105843128+cezarbbb@users.noreply.github.com> Date: Thu, 14 Jul 2022 15:46:41 +0800 Subject: [PATCH 0924/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200028.=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0strStr=200459.=E9=87=8D=E5=A4=8D=E7=9A=84=E5=AD=90?= =?UTF-8?q?=E5=AD=97=E7=AC=A6=E4=B8=B2=20Rust=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加 0028.实现strStr 0459.重复的子字符串 Rust版本 --- .../0028.\345\256\236\347\216\260strStr.md" | 44 +++++++++++++++++++ ...20\345\255\227\347\254\246\344\270\262.md" | 32 ++++++++++++++ 2 files changed, 76 insertions(+) diff --git "a/problems/0028.\345\256\236\347\216\260strStr.md" "b/problems/0028.\345\256\236\347\216\260strStr.md" index a95a52f814..1887e91bd3 100644 --- "a/problems/0028.\345\256\236\347\216\260strStr.md" +++ "b/problems/0028.\345\256\236\347\216\260strStr.md" @@ -1241,5 +1241,49 @@ function getNext(&$next, $s){ } } ``` + +Rust: + +> 前缀表统一不减一 +```Rust +impl Solution { + pub fn get_next(next: &mut Vec, s: &Vec) { + let len = s.len(); + let mut j = 0; + for i in 1..len { + while j > 0 && s[i] != s[j] { + j = next[j - 1]; + } + if s[i] == s[j] { + j += 1; + } + next[i] = j; + } + } + + pub fn str_str(haystack: String, needle: String) -> i32 { + let (haystack_len, needle_len) = (haystack.len(), needle.len()); + if haystack_len == 0 { return 0; } + if haystack_len < needle_len { return -1;} + let (haystack, needle) = (haystack.chars().collect::>(), needle.chars().collect::>()); + let mut next: Vec = vec![0; haystack_len]; + Self::get_next(&mut next, &needle); + let mut j = 0; + for i in 0..haystack_len { + while j > 0 && haystack[i] != needle[j] { + j = next[j - 1]; + } + if haystack[i] == needle[j] { + j += 1; + } + if j == needle_len { + return (i - needle_len + 1) as i32; + } + } + return -1; + } +} +``` + -----------------------
diff --git "a/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" "b/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" index bb55bd7ce0..4f45f4d733 100644 --- "a/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" @@ -505,5 +505,37 @@ Swift: } ``` +Rust: + +>前缀表统一不减一 +```Rust +impl Solution { + pub fn get_next(next: &mut Vec, s: &Vec) { + let len = s.len(); + let mut j = 0; + for i in 1..len { + while j > 0 && s[i] != s[j] { + j = next[j - 1]; + } + if s[i] == s[j] { + j += 1; + } + next[i] = j; + } + } + + pub fn repeated_substring_pattern(s: String) -> bool { + let s = s.chars().collect::>(); + let len = s.len(); + if len == 0 { return false; }; + let mut next = vec![0; len]; + Self::get_next(&mut next, &s); + if next[len - 1] != 0 && len % (len - (next[len - 1] )) == 0 { return true; } + return false; + } +} +``` + + -----------------------
From 781076a73d7d9de9f0fe525cbc8404358ca59990 Mon Sep 17 00:00:00 2001 From: Tristone Date: Thu, 14 Jul 2022 22:39:17 +0800 Subject: [PATCH 0925/3019] =?UTF-8?q?=E9=9C=80=E8=A6=81=E5=90=8C=E6=97=B6?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=BE=93=E5=85=A5=E6=95=B0=E7=BB=84nums?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" | 1 + 1 file changed, 1 insertion(+) diff --git "a/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" "b/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" index 9d687cfb16..fd24e8f8ec 100644 --- "a/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" +++ "b/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" @@ -219,6 +219,7 @@ func removeElement(nums []int, val int) int { res++ } } + nums=nums[:res] return res } ``` From 57840efc1a647803b24b5c793f4622c7e150721f Mon Sep 17 00:00:00 2001 From: cezarbbb <105843128+cezarbbb@users.noreply.github.com> Date: Fri, 15 Jul 2022 20:06:53 +0800 Subject: [PATCH 0926/3019] =?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=200040.=E7=BB=84=E5=90=88=E6=80=BB?= =?UTF-8?q?=E5=92=8CII=20Rust=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加 0039.组合总和 0040.组合总和II Rust版本 --- ...04\345\220\210\346\200\273\345\222\214.md" | 29 +++++++++++++++ ...\345\220\210\346\200\273\345\222\214II.md" | 35 +++++++++++++++++++ 2 files changed, 64 insertions(+) diff --git "a/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" "b/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" index 564d13ea3e..0f9cbc23ac 100644 --- "a/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" +++ "b/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" @@ -417,6 +417,35 @@ function combinationSum(candidates: number[], target: number): number[][] { }; ``` +## Rust + +```Rust +impl Solution { + pub fn backtracking(result: &mut Vec>, path: &mut Vec, candidates: &Vec, target: i32, mut sum: i32, start_index: usize) { + if sum == target { + result.push(path.to_vec()); + return; + } + for i in start_index..candidates.len() { + if sum + candidates[i] <= target { + sum += candidates[i]; + path.push(candidates[i]); + Self::backtracking(result, path, candidates, target, sum, i); + sum -= candidates[i]; + path.pop(); + } + } + } + + pub fn combination_sum(candidates: Vec, target: i32) -> Vec> { + let mut result: Vec> = Vec::new(); + let mut path: Vec = Vec::new(); + Self::backtracking(&mut result, &mut path, &candidates, target, 0, 0); + result + } +} +``` + ## C ```c diff --git "a/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" "b/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" index 557eb8557b..99577f0cdf 100644 --- "a/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" +++ "b/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" @@ -599,6 +599,41 @@ function combinationSum2(candidates: number[], target: number): number[][] { }; ``` +## Rust + +```Rust +impl Solution { + pub fn backtracking(result: &mut Vec>, path: &mut Vec, candidates: &Vec, target: i32, mut sum: i32, start_index: usize, used: &mut Vec) { + if sum == target { + result.push(path.to_vec()); + return; + } + for i in start_index..candidates.len() { + if sum + candidates[i] <= target { + if i > 0 && candidates[i] == candidates[i - 1] && used[i - 1] == false { continue; } + sum += candidates[i]; + path.push(candidates[i]); + used[i] = true; + Self::backtracking(result, path, candidates, target, sum, i + 1, used); + used[i] = false; + sum -= candidates[i]; + path.pop(); + } + } + } + + pub fn combination_sum2(candidates: Vec, target: i32) -> Vec> { + let mut result: Vec> = Vec::new(); + let mut path: Vec = Vec::new(); + let mut used: Vec = vec![false; candidates.len()]; + let mut candidates = candidates; + candidates.sort(); + Self::backtracking(&mut result, &mut path, &candidates, target, 0, 0, &mut used); + result + } +} +``` + ## C ```c From 26f5e59cdaf5536e0b08b94d554e4ef4428732a7 Mon Sep 17 00:00:00 2001 From: leo <55868230+LIU-HONGYANG@users.noreply.github.com> Date: Sat, 16 Jul 2022 11:56:18 +0800 Subject: [PATCH 0927/3019] =?UTF-8?q?Update=20=E9=9D=A2=E8=AF=95=E9=A2=980?= =?UTF-8?q?2.07.=E9=93=BE=E8=A1=A8=E7=9B=B8=E4=BA=A4.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...3002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" "b/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" index f603925d4a..d799bc80a5 100644 --- "a/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" +++ "b/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" @@ -208,7 +208,7 @@ func getIntersectionNode(headA, headB *ListNode) *ListNode { } ``` -递归版本: +双指针 ```go func getIntersectionNode(headA, headB *ListNode) *ListNode { From fb982fa79d643bb3e01960bb01897322cc424bf7 Mon Sep 17 00:00:00 2001 From: xiaojun <13589818805@163.com> Date: Sat, 16 Jul 2022 15:00:22 +0800 Subject: [PATCH 0928/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=88234.?= =?UTF-8?q?=E5=9B=9E=E6=96=87=E9=93=BE=E8=A1=A8=EF=BC=89=E7=9A=84go?= =?UTF-8?q?=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...36\346\226\207\351\223\276\350\241\250.md" | 68 +++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git "a/problems/0234.\345\233\236\346\226\207\351\223\276\350\241\250.md" "b/problems/0234.\345\233\236\346\226\207\351\223\276\350\241\250.md" index eeee6fa531..1ac8756a4d 100644 --- "a/problems/0234.\345\233\236\346\226\207\351\223\276\350\241\250.md" +++ "b/problems/0234.\345\233\236\346\226\207\351\223\276\350\241\250.md" @@ -276,7 +276,75 @@ class Solution: ### Go ```go +/** + * Definition for singly-linked list. + * type ListNode struct { + * Val int + * Next *ListNode + * } + */ +//方法一,使用数组 +func isPalindrome(head *ListNode) bool{ + //计算切片长度,避免切片频繁扩容 + cur,ln:=head,0 + for cur!=nil{ + ln++ + cur=cur.Next + } + nums:=make([]int,ln) + index:=0 + for head!=nil{ + nums[index]=head.Val + index++ + head=head.Next + } + //比较回文切片 + for i,j:=0,ln-1;i<=j;i,j=i+1,j-1{ + if nums[i]!=nums[j]{return false} + } + return true +} +// 方法二,快慢指针 +func isPalindrome(head *ListNode) bool { + if head==nil&&head.Next==nil{return true} + //慢指针,找到链表中间分位置,作为分割 + slow:=head + fast:=head + //记录慢指针的前一个节点,用来分割链表 + pre:=head + for fast!=nil && fast.Next!=nil{ + pre=slow + slow=slow.Next + fast=fast.Next.Next + } + //分割链表 + pre.Next=nil + //前半部分 + cur1:=head + //反转后半部分,总链表长度如果是奇数,cur2比cur1多一个节点 + cur2:=ReverseList(slow) + + //开始两个链表的比较 + for cur1!=nil{ + if cur1.Val!=cur2.Val{return false} + cur1=cur1.Next + cur2=cur2.Next + } + return true +} +//反转链表 +func ReverseList(head *ListNode) *ListNode{ + var pre *ListNode + cur:=head + for cur!=nil{ + tmp:=cur.Next + cur.Next=pre + pre=cur + cur=tmp + } + return pre +} ``` ### JavaScript From 4f867df86c7ef1ba3ef2ae3858fc1f928025a070 Mon Sep 17 00:00:00 2001 From: cezarbbb <105843128+cezarbbb@users.noreply.github.com> Date: Sat, 16 Jul 2022 15:24:05 +0800 Subject: [PATCH 0929/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200131.=E5=88=86?= =?UTF-8?q?=E5=89=B2=E5=9B=9E=E6=96=87=E4=B8=B2=20Rust=E5=9B=9E=E6=BA=AF+?= =?UTF-8?q?=E5=8A=A8=E6=80=81=E8=A7=84=E5=88=92=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加 0131.分割回文串 Rust回溯+动态规划版本 --- ...62\345\233\236\346\226\207\344\270\262.md" | 37 ++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git "a/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" "b/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" index 64d458533f..a54d65764d 100644 --- "a/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" +++ "b/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" @@ -626,7 +626,8 @@ func partition(_ s: String) -> [[String]] { ## Rust -```rust +**回溯+函数判断回文串** +```Rust impl Solution { pub fn partition(s: String) -> Vec> { let mut ret = vec![]; @@ -676,6 +677,40 @@ impl Solution { } } ``` +**回溯+动态规划预处理判断回文串** +```Rust +impl Solution { + pub fn backtracking(is_palindrome: &Vec>, result: &mut Vec>, path: &mut Vec, s: &Vec, start_index: usize) { + let len = s.len(); + if start_index >= len { + result.push(path.to_vec()); + return; + } + for i in start_index..len { + if is_palindrome[start_index][i] { path.push(s[start_index..=i].iter().collect::()); } else { continue; } + Self::backtracking(is_palindrome, result, path, s, i + 1); + path.pop(); + } + } + + pub fn partition(s: String) -> Vec> { + let mut result: Vec> = Vec::new(); + let mut path: Vec = Vec::new(); + let s = s.chars().collect::>(); + let len: usize = s.len(); + // 使用动态规划预先打表 + // 当且仅当其为空串(i>j),或其长度为1(i=j),或者首尾字符相同且(s[i+1..j−1])时为回文串 + let mut is_palindrome = vec![vec![true; len]; len]; + for i in (0..len).rev() { + for j in (i + 1)..len { + is_palindrome[i][j] = s[i] == s[j] && is_palindrome[i + 1][j - 1]; + } + } + Self::backtracking(&is_palindrome, &mut result, &mut path, &s, 0); + result + } +} +``` ## Scala From 8b9b64d7d576a783a3bb8fecdc3d614a4f9a6f36 Mon Sep 17 00:00:00 2001 From: AronJudge <2286381138@qq.com> Date: Sat, 16 Jul 2022 15:43:50 +0800 Subject: [PATCH 0930/3019] =?UTF-8?q?=E4=BF=AE=E6=94=B9:=200617=20?= =?UTF-8?q?=E5=90=88=E5=B9=B6=E4=BA=8C=E5=8F=89=E6=A0=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修改代码细节,优化性能. 用原有的Root1 代替 创建的NewRoot. --- ...10\345\271\266\344\272\214\345\217\211\346\240\221.md" | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git "a/problems/0617.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md" "b/problems/0617.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md" index acdcc0aa41..6a84376312 100644 --- "a/problems/0617.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0617.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md" @@ -262,10 +262,10 @@ class Solution { if (root1 == null) return root2; if (root2 == null) return root1; - TreeNode newRoot = new TreeNode(root1.val + root2.val); - newRoot.left = mergeTrees(root1.left,root2.left); - newRoot.right = mergeTrees(root1.right,root2.right); - return newRoot; + root1.val += root2.val; + root1.left = mergeTrees(root1.left,root2.left); + root1.right = mergeTrees(root1.right,root2.right); + return root1; } } ``` From 26376b6417a102e883071452c9863982f1d77802 Mon Sep 17 00:00:00 2001 From: cezarbbb <105843128+cezarbbb@users.noreply.github.com> Date: Sun, 17 Jul 2022 10:53:14 +0800 Subject: [PATCH 0931/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200093.=E5=A4=8D?= =?UTF-8?q?=E5=8E=9FIP=E5=9C=B0=E5=9D=80=20Rust=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加 0093.复原IP地址 Rust版本 --- ...\345\216\237IP\345\234\260\345\235\200.md" | 47 +++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git "a/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" "b/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" index 11ca2d03b5..46ac1c8677 100644 --- "a/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" +++ "b/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" @@ -536,6 +536,53 @@ func isNormalIp(s string,startIndex,end int)bool{ ``` +## Rust + +```Rust +impl Solution { + fn is_valid(s: &Vec, start: usize, end: usize) -> bool { + if start > end { return false; } + if s[start] == '0' && start != end { return false; } + let mut num = 0; + for i in start..=end { + if s[i] > '9' || s[i] < '0' { return false; } + if let Some(digit) = s[i].to_digit(10) { num = num * 10 + digit; } + if num > 255 { return false; } + } + true + } + + fn backtracking(result: &mut Vec, s: &mut Vec, start_index: usize, mut point_num: usize) { + let len = s.len(); + if point_num == 3 { + if Self::is_valid(s, start_index, len - 1) { + result.push(s.iter().collect::()); + } + return; + } + for i in start_index..len { + if Self::is_valid(s, start_index, i) { + point_num += 1; + s.insert(i + 1, '.'); + Self::backtracking(result, s, i + 2, point_num); + point_num -= 1; + s.remove(i + 1); + } else { break; } + } + } + + pub fn restore_ip_addresses(s: String) -> Vec { + let mut result: Vec = Vec::new(); + let len = s.len(); + if len < 4 || len > 12 { return result; } + let mut s = s.chars().collect::>(); + Self::backtracking(&mut result, &mut s, 0, 0); + result + } + +} +``` + ## C ```c //记录结果 From 6f3dc1e6f80c5527d266c125b1a57366d314787a Mon Sep 17 00:00:00 2001 From: DarrenRuan <31378679+DarrenRuan@users.noreply.github.com> Date: Sat, 16 Jul 2022 23:57:33 -0400 Subject: [PATCH 0932/3019] =?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代码有个注释似乎写错了。原来为`不是i-1`,应该是`不是i+1`. --- .../0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" "b/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" index 564d13ea3e..54e9f2e5c1 100644 --- "a/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" +++ "b/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" @@ -291,7 +291,7 @@ class Solution: for i in range(start_index, len(candidates)): sum_ += candidates[i] self.path.append(candidates[i]) - self.backtracking(candidates, target, sum_, i) # 因为无限制重复选取,所以不是i-1 + self.backtracking(candidates, target, sum_, i) # 因为无限制重复选取,所以不是i+1 sum_ -= candidates[i] # 回溯 self.path.pop() # 回溯 ``` From aaac4825ec0f638b07e6772829bc25a26f677863 Mon Sep 17 00:00:00 2001 From: cezarbbb <105843128+cezarbbb@users.noreply.github.com> Date: Mon, 18 Jul 2022 09:46:46 +0800 Subject: [PATCH 0933/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200078.=E5=AD=90?= =?UTF-8?q?=E9=9B=86=20Rust=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加 0078.子集 Rust版本 --- "problems/0078.\345\255\220\351\233\206.md" | 24 +++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git "a/problems/0078.\345\255\220\351\233\206.md" "b/problems/0078.\345\255\220\351\233\206.md" index e6cc668bdf..3e98311ed0 100644 --- "a/problems/0078.\345\255\220\351\233\206.md" +++ "b/problems/0078.\345\255\220\351\233\206.md" @@ -292,6 +292,30 @@ function subsets(nums: number[]): number[][] { }; ``` +## Rust + +```Rust +impl Solution { + fn backtracking(result: &mut Vec>, path: &mut Vec, nums: &Vec, start_index: usize) { + result.push(path.clone()); + let len = nums.len(); + // if start_index >= len { return; } + for i in start_index..len { + path.push(nums[i]); + Self::backtracking(result, path, nums, i + 1); + path.pop(); + } + } + + pub fn subsets(nums: Vec) -> Vec> { + let mut result: Vec> = Vec::new(); + let mut path: Vec = Vec::new(); + Self::backtracking(&mut result, &mut path, &nums, 0); + result + } +} +``` + ## C ```c From ac4bdf21015d0bdcd72522b4190158b36deea391 Mon Sep 17 00:00:00 2001 From: cezarbbb <105843128+cezarbbb@users.noreply.github.com> Date: Tue, 19 Jul 2022 09:40:59 +0800 Subject: [PATCH 0934/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200090.=E5=AD=90?= =?UTF-8?q?=E9=9B=86II=20Rust=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加 0090.子集II Rust版本 --- "problems/0090.\345\255\220\351\233\206II.md" | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git "a/problems/0090.\345\255\220\351\233\206II.md" "b/problems/0090.\345\255\220\351\233\206II.md" index e85ec66d3c..7ab6afb683 100644 --- "a/problems/0090.\345\255\220\351\233\206II.md" +++ "b/problems/0090.\345\255\220\351\233\206II.md" @@ -340,6 +340,36 @@ function subsetsWithDup(nums: number[]): number[][] { }; ``` +### Rust + +```Rust +impl Solution { + fn backtracking(result: &mut Vec>, path: &mut Vec, nums: &Vec, start_index: usize, used: &mut Vec) { + result.push(path.clone()); + let len = nums.len(); + // if start_index >= len { return; } + for i in start_index..len { + if i > 0 && nums[i] == nums[i - 1] && used[i - 1] == false { continue; } + path.push(nums[i]); + used[i] = true; + Self::backtracking(result, path, nums, i + 1, used); + used[i] = false; + path.pop(); + } + } + + pub fn subsets_with_dup(nums: Vec) -> Vec> { + let mut result: Vec> = Vec::new(); + let mut path: Vec = Vec::new(); + let mut used = vec![false; nums.len()]; + let mut nums = nums; + nums.sort(); + Self::backtracking(&mut result, &mut path, &nums, 0, &mut used); + result + } +} +``` + ### C ```c From 50b9753b647ace27caa0a1a31bd91975672db4d7 Mon Sep 17 00:00:00 2001 From: dcj_hp <294487055@qq.com> Date: Wed, 20 Jul 2022 01:11:00 +0800 Subject: [PATCH 0935/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200376.=E6=91=86?= =?UTF-8?q?=E5=8A=A8=E5=BA=8F=E5=88=97=20=20=E5=8A=A8=E6=80=81=E8=A7=84?= =?UTF-8?q?=E5=88=92=E7=89=88=E6=9C=AC(Python,=20C)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...06\345\212\250\345\272\217\345\210\227.md" | 64 +++++++++++++++++++ 1 file changed, 64 insertions(+) diff --git "a/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" "b/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" index 70a6214570..714dba57e0 100644 --- "a/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" +++ "b/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" @@ -228,6 +228,8 @@ class Solution { ### Python +**贪心** + ```python class Solution: def wiggleMaxLength(self, nums: List[int]) -> int: @@ -240,7 +242,30 @@ class Solution: return res ``` +**动态规划** + +```python +class Solution: + def wiggleMaxLength(self, nums: List[int]) -> int: + # 0 i 作为波峰的最大长度 + # 1 i 作为波谷的最大长度 + # dp是一个列表,列表中每个元素是长度为 2 的列表 + dp = [] + for i in range(len(nums)): + # 初始为[1, 1] + dp.append([1, 1]) + for j in range(i): + # nums[i] 为波谷 + if nums[j] > nums[i]: + dp[i][1] = max(dp[i][1], dp[j][0] + 1) + # nums[i] 为波峰 + if nums[j] < nums[i]: + dp[i][0] = max(dp[i][0], dp[j][1] + 1) + return max(dp[-1][0], dp[-1][1]) +``` + ### Go + ```golang func wiggleMaxLength(nums []int) int { var count,preDiff,curDiff int @@ -324,6 +349,7 @@ impl Solution { ### C **贪心** + ```c int wiggleMaxLength(int* nums, int numsSize){ if(numsSize <= 1) @@ -349,6 +375,44 @@ int wiggleMaxLength(int* nums, int numsSize){ } ``` +**动态规划** + +```c +int max(int left, int right) +{ + return left > right ? left : right; +} +int wiggleMaxLength(int* nums, int numsSize){ + if(numsSize <= 1) + { + return numsSize; + } + // 0 i 作为波峰的最大长度 + // 1 i 作为波谷的最大长度 + int dp[numsSize][2]; + for(int i = 0; i < numsSize; i++) + { + dp[i][0] = 1; + dp[i][1] = 1; + for(int j = 0; j < i; j++) + { + // nums[i] 为山谷 + if(nums[j] > nums[i]) + { + dp[i][1] = max(dp[i][1], dp[j][0] + 1); + } + // nums[i] 为山峰 + if(nums[j] < nums[i]) + { + dp[i][0] = max(dp[i][0], dp[j][1] + 1); + } + } + } + return max(dp[numsSize - 1][0], dp[numsSize - 1][1]); +} +``` + + ### TypeScript From d4f89d1b0eec92115d0270630c77a09803b45703 Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Wed, 20 Jul 2022 09:45:11 +0800 Subject: [PATCH 0936/3019] =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=8E=9F=E9=A2=98?= =?UTF-8?q?=E8=A7=A3=EF=BC=8C=E6=B7=BB=E5=8A=A0=E9=83=A8=E5=88=86=E9=A2=98?= =?UTF-8?q?=E7=9B=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...44\346\225\260\344\271\213\345\222\214.md" | 86 +++-- ...11\346\225\260\344\271\213\345\222\214.md" | 96 +++++- ...33\346\225\260\344\271\213\345\222\214.md" | 37 +-- ...55\347\232\204\350\212\202\347\202\271.md" | 6 +- ...00\344\270\252\344\275\215\347\275\256.md" | 2 + ...10\345\271\266\345\214\272\351\227\264.md" | 3 - ...\344\275\263\346\227\266\346\234\272II.md" | 4 +- ...\345\275\242\351\223\276\350\241\250II.md" | 2 + ...2.\345\277\253\344\271\220\346\225\260.md" | 47 --- ...73\350\275\254\351\223\276\350\241\250.md" | 2 + ...04\345\255\220\346\225\260\347\273\204.md" | 2 +- ...345\220\210\346\200\273\345\222\214III.md" | 2 +- ...15\345\274\202\344\275\215\350\257\215.md" | 2 + ...04\347\232\204\344\272\244\351\233\206.md" | 37 ++- ...06\345\212\250\345\272\217\345\210\227.md" | 12 +- ...55\345\255\220\345\272\217\345\210\227.md" | 6 +- ...\346\225\260\347\233\270\345\212\240II.md" | 13 +- ...36\346\226\207\345\255\220\344\270\262.md" | 10 +- ...14\345\210\206\346\237\245\346\211\276.md" | 2 +- ...76\350\256\241\351\223\276\350\241\250.md" | 2 + ...15\345\255\220\346\225\260\347\273\204.md" | 2 +- ...75\347\232\204\350\267\257\345\276\204.md" | 296 ++++++++++++++++++ ...31\345\222\214\346\210\277\351\227\264.md" | 229 ++++++++++---- ...55\345\277\203\350\212\202\347\202\271.md" | 73 +++++ ...30\345\234\250\350\267\257\345\276\204.md" | 123 ++++++++ ...22\346\200\273\347\273\223\347\257\207.md" | 2 +- ...76\350\241\250\347\233\270\344\272\244.md" | 4 +- 27 files changed, 896 insertions(+), 206 deletions(-) create mode 100644 "problems/0797.\346\211\200\346\234\211\345\217\257\350\203\275\347\232\204\350\267\257\345\276\204.md" create mode 100644 "problems/1791.\346\211\276\345\207\272\346\230\237\345\236\213\345\233\276\347\232\204\344\270\255\345\277\203\350\212\202\347\202\271.md" create mode 100644 "problems/1971.\345\257\273\346\211\276\345\233\276\344\270\255\346\230\257\345\220\246\345\255\230\345\234\250\350\267\257\345\276\204.md" diff --git "a/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" "b/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" index fb3c1d4560..055f89402c 100644 --- "a/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" @@ -24,7 +24,9 @@ ## 思路 -很明显暴力的解法是两层for循环查找,时间复杂度是$O(n^2)$。 +建议看一下我录的这期视频:[梦开始的地方,Leetcode:1.两数之和](https://www.bilibili.com/video/BV1aT41177mK),结合本题解来学习,事半功倍。 + +很明显暴力的解法是两层for循环查找,时间复杂度是O(n^2)。 建议大家做这道题目之前,先做一下这两道 * [242. 有效的字母异位词](https://www.programmercarl.com/0242.有效的字母异位词.html) @@ -32,7 +34,16 @@ [242. 有效的字母异位词](https://www.programmercarl.com/0242.有效的字母异位词.html) 这道题目是用数组作为哈希表来解决哈希问题,[349. 两个数组的交集](https://www.programmercarl.com/0349.两个数组的交集.html)这道题目是通过set作为哈希表来解决哈希问题。 -本题呢,则要使用map,那么来看一下使用数组和set来做哈希法的局限。 + +首先我在强调一下 **什么时候使用哈希法**,当我们需要查询一个元素是否出现过,或者一个元素是否在集合里的时候,就要第一时间想到哈希法。 + +本题呢,我就需要一个集合来存放我们遍历过的元素,然后在遍历数组的时候去询问这个集合,某元素是否遍历过,也就是 是否出现在这个集合。 + +那么我们就应该想到使用哈希法了。 + +因为本地,我们不仅要知道元素有没有遍历过,还有知道这个元素对应的下标,**需要使用 key value结构来存放,key来存元素,value来存下标,那么使用map正合适**。 + +再来看一下使用数组和set来做哈希法的局限。 * 数组的大小是受限制的,而且如果元素很少,而哈希值太大会造成内存空间的浪费。 * set是一个集合,里面放的元素只能是一个key,而两数之和这道题目,不仅要判断y是否存在而且还要记录y的下标位置,因为要返回x 和 y的下标。所以set 也不能用。 @@ -43,20 +54,38 @@ C++中map,有三种类型: |映射 |底层实现 | 是否有序 |数值是否可以重复 | 能否更改数值|查询效率 |增删效率| |---|---| --- |---| --- | --- | ---| -|std::map |红黑树 |key有序 |key不可重复 |key不可修改 | $O(\log n)$|$O(\log n)$ | -|std::multimap | 红黑树|key有序 | key可重复 | key不可修改|$O(\log n)$ |$O(\log n)$ | -|std::unordered_map |哈希表 | key无序 |key不可重复 |key不可修改 |$O(1)$ | $O(1)$| +|std::map |红黑树 |key有序 |key不可重复 |key不可修改 | O(log n)|O(log n) | +|std::multimap | 红黑树|key有序 | key可重复 | key不可修改|O(log n) |O(log n) | +|std::unordered_map |哈希表 | key无序 |key不可重复 |key不可修改 |O(1) | O(1)| std::unordered_map 底层实现为哈希表,std::map 和std::multimap 的底层实现是红黑树。 同理,std::map 和std::multimap 的key也是有序的(这个问题也经常作为面试题,考察对语言容器底层的理解)。 更多哈希表的理论知识请看[关于哈希表,你该了解这些!](https://www.programmercarl.com/哈希表理论基础.html)。 -**这道题目中并不需要key有序,选择std::unordered_map 效率更高!** +**这道题目中并不需要key有序,选择std::unordered_map 效率更高!** 使用其他语言的录友注意了解一下自己所用语言的数据结构就行。 + +接下来需要明确两点: + +* **map用来做什么** +* **map中key和value分别表示什么** + +map目的用来存放我们访问过的元素,因为遍历数组的时候,需要记录我们之前遍历过哪些元素和对应的下表,这样才能找到与当前元素相匹配的(也就是相加等于target) + +接下来是map中key和value分别表示什么。 + +这道题 我们需要 给出一个元素,判断这个元素是否出现过,如果出现过,返回这个元素的下标。 + +那么判断元素是否出现,这个元素就要作为key,所以数组中的元素作为key,有key对应的就是value,value用来存下标。 + +所以 map中的存储结构为 {key:数据元素,value:数组元素对应的下表}。 -解题思路动画如下: +在遍历数组的时候,只需要向map去查询是否有和目前遍历元素比配的数值,如果有,就找到的匹配对,如果没有,就把目前遍历的元素放进map中,因为map存放的就是我们访问过的元素。 -![](https://code-thinking.cdn.bcebos.com/gifs/1.两数之和.gif) +过程如下: +![过程一](https://code-thinking-1253855093.file.myqcloud.com/pics/20220711202638.png) + +![过程二](https://code-thinking-1253855093.file.myqcloud.com/pics/20220711202708.png) C++代码: @@ -66,18 +95,31 @@ public: vector twoSum(vector& nums, int target) { std::unordered_map map; for(int i = 0; i < nums.size(); i++) { - auto iter = map.find(target - nums[i]); + // 遍历当前元素,并在map中寻找是否有匹配的key + auto iter = map.find(target - nums[i]); if(iter != map.end()) { return {iter->second, i}; } - map.insert(pair(nums[i], i)); + // 如果没找到匹配对,就把访问过的元素和下标加入到map中 + map.insert(pair(nums[i], i)); } return {}; } }; ``` +## 总结 + +本题其实有四个重点: + +* 为什么会想到用哈希表 +* 哈希表为什么用map +* 本题map是用来存什么的 +* map中的key和value用来存什么的 +把这四点想清楚了,本题才算是理解透彻了。 + +很多录友把这道题目 通过了,但都没想清楚map是用来做什么的,以至于对代码的理解其实是 一知半解的。 ## 其他语言版本 @@ -250,30 +292,6 @@ func twoSum(_ nums: [Int], _ target: Int) -> [Int] { } ``` -PHP: -```php -class Solution { - /** - * @param Integer[] $nums - * @param Integer $target - * @return Integer[] - */ - function twoSum($nums, $target) { - if (count($nums) == 0) { - return []; - } - $table = []; - for ($i = 0; $i < count($nums); $i++) { - $temp = $target - $nums[$i]; - if (isset($table[$temp])) { - return [$table[$temp], $i]; - } - $table[$nums[$i]] = $i; - } - return []; - } -} -``` Scala: ```scala diff --git "a/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" "b/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" index e6dc82ddd7..5a4168d128 100644 --- "a/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" @@ -39,7 +39,7 @@ 去重的过程不好处理,有很多小细节,如果在面试中很难想到位。 -时间复杂度可以做到$O(n^2)$,但还是比较费时的,因为不好做剪枝操作。 +时间复杂度可以做到O(n^2),但还是比较费时的,因为不好做剪枝操作。 大家可以尝试使用哈希法写一写,就知道其困难的程度了。 @@ -85,7 +85,7 @@ public: **其实这道题目使用哈希法并不十分合适**,因为在去重的操作中有很多细节需要注意,在面试中很难直接写出没有bug的代码。 -而且使用哈希法 在使用两层for循环的时候,能做的剪枝操作很有限,虽然时间复杂度是$O(n^2)$,也是可以在leetcode上通过,但是程序的执行时间依然比较长 。 +而且使用哈希法 在使用两层for循环的时候,能做的剪枝操作很有限,虽然时间复杂度是O(n^2),也是可以在leetcode上通过,但是程序的执行时间依然比较长 。 接下来我来介绍另一个解法:双指针法,**这道题目使用双指针法 要比哈希法高效一些**,那么来讲解一下具体实现的思路。 @@ -101,7 +101,7 @@ public: 如果 nums[i] + nums[left] + nums[right] < 0 说明 此时 三数之和小了,left 就向右移动,才能让三数之和大一些,直到left与right相遇为止。 -时间复杂度:$O(n^2)$。 +时间复杂度:O(n^2)。 C++代码代码如下: @@ -118,13 +118,13 @@ public: if (nums[i] > 0) { return result; } - // 错误去重方法,将会漏掉-1,-1,2 这种情况 + // 错误去重a方法,将会漏掉-1,-1,2 这种情况 /* if (nums[i] == nums[i + 1]) { continue; } */ - // 正确去重方法 + // 正确去重a方法 if (i > 0 && nums[i] == nums[i - 1]) { continue; } @@ -136,17 +136,11 @@ public: while (right > left && nums[right] == nums[right - 1]) right--; while (right > left && nums[left] == nums[left + 1]) left++; */ - if (nums[i] + nums[left] + nums[right] > 0) { - right--; - // 当前元素不合适了,可以去重 - while (left < right && nums[right] == nums[right + 1]) right--; - } else if (nums[i] + nums[left] + nums[right] < 0) { - left++; - // 不合适,去重 - while (left < right && nums[left] == nums[left - 1]) left++; - } else { + if (nums[i] + nums[left] + nums[right] > 0) right--; + else if (nums[i] + nums[left] + nums[right] < 0) left++; + else { result.push_back(vector{nums[i], nums[left], nums[right]}); - // 去重逻辑应该放在找到一个三元组之后 + // 去重逻辑应该放在找到一个三元组之后,对b 和 c去重 while (right > left && nums[right] == nums[right - 1]) right--; while (right > left && nums[left] == nums[left + 1]) left++; @@ -162,6 +156,78 @@ public: }; ``` +## 去重逻辑的思考 + +### a的去重 + +说道去重,其实主要考虑三个数的去重。 a, b ,c, 对应的就是 nums[i],nums[left],nums[right] + +a 如果重复了怎么办,a是nums里遍历的元素,那么应该直接跳过去。 + +但这里有一个问题,是判断 nums[i] 与 nums[i + 1]是否相同,还是判断 nums[i] 与 nums[i-1] 是否相同。 + +有同学可能想,这不都一样吗。 + +其实不一样! + +都是和 nums[i]进行比较,是比较它的前一个,还是比较他的后一个。 + +如果我们的写法是 这样: + +```C++ +if (nums[i] == nums[i + 1]) { // 去重操作 + continue; +} +``` + +那就我们就把 三元组中出现重复元素的情况直接pass掉了。 例如{-1, -1 ,2} 这组数据,当遍历到第一个-1 的时候,判断 下一个也是-1,那这组数据就pass了。 + +**我们要做的是 不能有重复的三元组,但三元组内的元素是可以重复的!** + +所以这里是有两个重复的维度。 + +那么应该这么写: + +```C++ +if (i > 0 && nums[i] == nums[i - 1]) { + continue; +} +``` + +这么写就是当前使用 nums[i],我们判断前一位是不是一样的元素,在看 {-1, -1 ,2} 这组数据,当遍历到 第一个 -1 的时候,只要前一位没有-1,那么 {-1, -1 ,2} 这组数据一样可以收录到 结果集里。 + +这是一个非常细节的思考过程。 + +### b与c的去重 + +很多同学写本题的时候,去重的逻辑多加了 对right 和left 的去重:(代码中注释部分) + +```C++ +while (right > left) { + if (nums[i] + nums[left] + nums[right] > 0) { + right--; + // 去重 right + while (left < right && nums[right] == nums[right + 1]) right--; + } else if (nums[i] + nums[left] + nums[right] < 0) { + left++; + // 去重 left + while (left < right && nums[left] == nums[left - 1]) left++; + } else { + } +} +``` + +但细想一下,这种去重其实对提升程序运行效率是没有帮助的。 + +拿right去重为例,即使不加这个去重逻辑,依然根据 `while (right > left) ` 和 `if (nums[i] + nums[left] + nums[right] > 0)` 去完成right-- 的操作。 + +多加了 ` while (left < right && nums[right] == nums[right + 1]) right--;` 这一行代码,其实就是把 需要执行的逻辑提前执行了,但并没有减少 判断的逻辑。 + +最直白的思考过程,就是right还是一个数一个数的减下去的,所以在哪里减的都是一样的。 + +所以这种去重 是可以不加的。 仅仅是 把去重的逻辑提前了而已。 + + # 思考题 diff --git "a/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" "b/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" index 2146a11469..7989ad8fff 100644 --- "a/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" @@ -35,11 +35,11 @@ [15.三数之和](https://programmercarl.com/0015.三数之和.html)的双指针解法是一层for循环num[i]为确定值,然后循环内有left和right下标作为双指针,找到nums[i] + nums[left] + nums[right] == 0。 -四数之和的双指针解法是两层for循环nums[k] + nums[i]为确定值,依然是循环内有left和right下标作为双指针,找出nums[k] + nums[i] + nums[left] + nums[right] == target的情况,三数之和的时间复杂度是$O(n^2)$,四数之和的时间复杂度是$O(n^3)$ 。 +四数之和的双指针解法是两层for循环nums[k] + nums[i]为确定值,依然是循环内有left和right下标作为双指针,找出nums[k] + nums[i] + nums[left] + nums[right] == target的情况,三数之和的时间复杂度是O(n^2),四数之和的时间复杂度是O(n^3) 。 那么一样的道理,五数之和、六数之和等等都采用这种解法。 -对于[15.三数之和](https://programmercarl.com/0015.三数之和.html)双指针法就是将原本暴力$O(n^3)$的解法,降为$O(n^2)$的解法,四数之和的双指针解法就是将原本暴力$O(n^4)$的解法,降为$O(n^3)$的解法。 +对于[15.三数之和](https://programmercarl.com/0015.三数之和.html)双指针法就是将原本暴力O(n^3)的解法,降为O(n^2)的解法,四数之和的双指针解法就是将原本暴力O(n^4)的解法,降为O(n^3)的解法。 之前我们讲过哈希表的经典题目:[454.四数相加II](https://programmercarl.com/0454.四数相加II.html),相对于本题简单很多,因为本题是要求在一个集合中找出四个数相加等于target,同时四元组不能重复。 @@ -47,14 +47,13 @@ 我们来回顾一下,几道题目使用了双指针法。 -双指针法将时间复杂度:$O(n^2)$的解法优化为 $O(n)$的解法。也就是降一个数量级,题目如下: +双指针法将时间复杂度:O(n^2)的解法优化为 O(n)的解法。也就是降一个数量级,题目如下: * [27.移除元素](https://programmercarl.com/0027.移除元素.html) * [15.三数之和](https://programmercarl.com/0015.三数之和.html) * [18.四数之和](https://programmercarl.com/0018.四数之和.html) - -操作链表: +链表相关双指针题目: * [206.反转链表](https://programmercarl.com/0206.翻转链表.html) * [19.删除链表的倒数第N个节点](https://programmercarl.com/0019.删除链表的倒数第N个节点.html) @@ -72,21 +71,21 @@ public: vector> result; sort(nums.begin(), nums.end()); for (int k = 0; k < nums.size(); k++) { - // 剪枝处理 - if (nums[k] > target && (nums[k] >= 0 || target >= 0)) { + // 剪枝处理 + if (nums[k] > target && nums[k] >= 0 && target >= 0) { break; // 这里使用break,统一通过最后的return返回 } - // 去重 + // 对nums[k]去重 if (k > 0 && nums[k] == nums[k - 1]) { continue; } for (int i = k + 1; i < nums.size(); i++) { - // 2级剪枝处理 - if (nums[k] + nums[i] > target && (nums[k] + nums[i] >= 0 || target >= 0)) { - break; - } - - // 正确去重方法 + // 2级剪枝处理 + if (nums[k] + nums[i] > target && nums[k] + nums[i] >= 0 && target >= 0) { + break; + } + + // 对nums[i]去重 if (i > k + 1 && nums[i] == nums[i - 1]) { continue; } @@ -94,18 +93,14 @@ public: int right = nums.size() - 1; while (right > left) { // nums[k] + nums[i] + nums[left] + nums[right] > target 会溢出 - if (nums[k] + nums[i] > target - (nums[left] + nums[right])) { + if ((long) nums[k] + nums[i] + nums[left] + nums[right] > target) { right--; - // 当前元素不合适了,可以去重 - while (left < right && nums[right] == nums[right + 1]) right--; // nums[k] + nums[i] + nums[left] + nums[right] < target 会溢出 - } else if (nums[k] + nums[i] < target - (nums[left] + nums[right])) { + } else if ((long) nums[k] + nums[i] + nums[left] + nums[right] < target) { left++; - // 不合适,去重 - while (left < right && nums[left] == nums[left - 1]) left++; } else { result.push_back(vector{nums[k], nums[i], nums[left], nums[right]}); - // 去重逻辑应该放在找到一个四元组之后 + // 对nums[left]和nums[right]去重 while (right > left && nums[right] == nums[right - 1]) right--; while (right > left && nums[left] == nums[left + 1]) left++; diff --git "a/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" "b/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" index e636bfff58..550a886ef6 100644 --- "a/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" +++ "b/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" @@ -18,6 +18,8 @@ ## 思路 +针对本题重点难点,我录制了B站讲解视频,[帮你把链表细节学清楚! | LeetCode:24. 两两交换链表中的节点](https://www.bilibili.com/video/BV1YT411g7br),相信结合视频在看本篇题解,更有助于大家对链表的理解。 + 这道题目正常模拟就可以了。 建议使用虚拟头结点,这样会方便很多,要不然每次针对头结点(没有前一个指针指向头结点),还要单独处理。 @@ -63,8 +65,8 @@ public: }; ``` -* 时间复杂度:$O(n)$ -* 空间复杂度:$O(1)$ +* 时间复杂度:O(n) +* 空间复杂度:O(1) ## 拓展 diff --git "a/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" "b/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" index 260462c23b..bf9493c942 100644 --- "a/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" +++ "b/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" @@ -7,6 +7,8 @@ # 34. 在排序数组中查找元素的第一个和最后一个位置 +[题目链接](https://leetcode.cn/problems/find-first-and-last-position-of-element-in-sorted-array/) + 给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。 如果数组中不存在目标值 target,返回 [-1, -1]。 diff --git "a/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" "b/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" index 34d8dd8242..757896c1df 100644 --- "a/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" +++ "b/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" @@ -22,9 +22,6 @@ * 解释: 区间 [1,4] 和 [4,5] 可被视为重叠区间。 * 注意:输入类型已于2019年4月15日更改。 请重置默认代码定义以获取新方法签名。 -提示: - -* intervals[i][0] <= intervals[i][1] ## 思路 diff --git "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" index b9fa8386ea..ae9744d173 100644 --- "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" +++ "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" @@ -91,8 +91,8 @@ public: }; ``` -* 时间复杂度:$O(n)$ -* 空间复杂度:$O(1)$ +* 时间复杂度:O(n) +* 空间复杂度:O(1) ### 动态规划 diff --git "a/problems/0142.\347\216\257\345\275\242\351\223\276\350\241\250II.md" "b/problems/0142.\347\216\257\345\275\242\351\223\276\350\241\250II.md" index 6b7c7e661f..254f9db027 100644 --- "a/problems/0142.\347\216\257\345\275\242\351\223\276\350\241\250II.md" +++ "b/problems/0142.\347\216\257\345\275\242\351\223\276\350\241\250II.md" @@ -24,6 +24,8 @@ ## 思路 +为了易于大家理解,我录制讲解视频:[B站:把环形链表讲清楚! ](https://www.bilibili.com/video/BV1if4y1d7ob)。结合视频在看本篇题解,事半功倍。 + 这道题目,不仅考察对链表的操作,而且还需要一些数学运算。 主要考察两知识点: diff --git "a/problems/0202.\345\277\253\344\271\220\346\225\260.md" "b/problems/0202.\345\277\253\344\271\220\346\225\260.md" index 0bea0c7233..0054582ca8 100644 --- "a/problems/0202.\345\277\253\344\271\220\346\225\260.md" +++ "b/problems/0202.\345\277\253\344\271\220\346\225\260.md" @@ -338,53 +338,6 @@ static inline int calcSquareSum(int num) { return sum; } -#define HASH_TABLE_SIZE (32) - -bool isHappy(int n){ - int sum = n; - int index = 0; - bool bHappy = false; - bool bExit = false; - /* allocate the memory for hash table with chaining method*/ - HashNode ** hashTable = (HashNode **)calloc(HASH_TABLE_SIZE, sizeof(HashNode)); - - while(bExit == false) { - /* check if n has been calculated */ - index = hash(n, HASH_TABLE_SIZE); - - HashNode ** p = hashTable + index; - - while((*p) && (bExit == false)) { - /* Check if this num was calculated, if yes, this will be endless loop */ - if((*p)->key == n) { - bHappy = false; - bExit = true; - } - /* move to next node of the same index */ - p = &((*p)->next); - } - - /* put n intot hash table */ - HashNode * newNode = (HashNode *)malloc(sizeof(HashNode)); - newNode->key = n; - newNode->next = NULL; - - *p = newNode; - - sum = calcSquareSum(n); - if(sum == 1) { - bHappy = true; - bExit = true; - } - else { - n = sum; - - } - } - - return bHappy; -} -``` Scala: ```scala diff --git "a/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md" "b/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md" index 24ec7b943a..c412e840f1 100644 --- "a/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md" +++ "b/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md" @@ -19,6 +19,8 @@ # 思路 +本题我录制了B站视频,[帮你拿下反转链表 | LeetCode:206.反转链表](https://www.bilibili.com/video/BV1nB4y1i7eL),相信结合视频在看本篇题解,更有助于大家对链表的理解。 + 如果再定义一个新的链表,实现链表元素的反转,其实这是对内存空间的浪费。 其实只需要改变链表的next指针的指向,直接将链表反转 ,而不用重新定义一个新的链表,如图所示: diff --git "a/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" "b/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" index e2eb378e7a..b374aaec92 100644 --- "a/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" +++ "b/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" @@ -19,7 +19,7 @@ # 思路 -为了易于大家理解,我特意录制了[拿下滑动窗口! | LeetCode 209 长度最小的子数组](https://www.bilibili.com/video/BV1tZ4y1q7XE) +为了易于大家理解,我特意录制了B站视频[拿下滑动窗口! | LeetCode 209 长度最小的子数组](https://www.bilibili.com/video/BV1tZ4y1q7XE) ## 暴力解法 diff --git "a/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" "b/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" index 0ace0fd5af..a8a6567d59 100644 --- "a/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" +++ "b/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" @@ -212,7 +212,7 @@ public: # 总结 -开篇就介绍了本题与[回溯算法:求组合问题!](https://programmercarl.com/0077.组合.html)的区别,相对来说加了元素总和的限制,如果做完[回溯算法:求组合问题!](https://programmercarl.com/0077.组合.html)再做本题在合适不过。 +开篇就介绍了本题与[77.组合](https://programmercarl.com/0077.组合.html)的区别,相对来说加了元素总和的限制,如果做完[77.组合](https://programmercarl.com/0077.组合.html)再做本题在合适不过。 分析完区别,依然把问题抽象为树形结构,按照回溯三部曲进行讲解,最后给出剪枝的优化。 diff --git "a/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" "b/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" index 8f4b5ae2b7..0437330bbf 100644 --- "a/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" +++ "b/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" @@ -27,6 +27,8 @@ ## 思路 +本题B站视频讲解版:[学透哈希表,数组使用有技巧!Leetcode:242.有效的字母异位词](https://www.bilibili.com/video/BV1YG411p7BA) + 先看暴力的解法,两层for循环,同时还要记录字符是否重复出现,很明显时间复杂度是 O(n^2)。 暴力的方法这里就不做介绍了,直接看一下有没有更优的方式。 diff --git "a/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" "b/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" index 9851864750..c1d3515bea 100644 --- "a/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" +++ "b/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" @@ -24,6 +24,8 @@ ## 思路 +关于本题,我录制了讲解视频:[学透哈希表,set使用有技巧!Leetcode:349. 两个数组的交集](https://www.bilibili.com/video/BV1ba411S7wu),看视频配合题解,事半功倍。 + 这道题目,主要要学会使用一种哈希数据结构:unordered_set,这个数据结构可以解决很多类似的问题。 注意题目特意说明:**输出结果中的每个元素一定是唯一的,也就是说输出的结果的去重的, 同时可以不考虑输出结果的顺序** @@ -48,7 +50,8 @@ std::set和std::multiset底层实现都是红黑树,std::unordered_set的底 思路如图所示: -![set哈希法](https://img-blog.csdnimg.cn/2020080918570417.png) + +![set哈希法](https://code-thinking-1253855093.file.myqcloud.com/pics/20220707173513.png) C++代码如下: @@ -56,7 +59,7 @@ C++代码如下: class Solution { public: vector intersection(vector& nums1, vector& nums2) { - unordered_set result_set; // 存放结果 + unordered_set result_set; // 存放结果,之所以用set是为了给结果集去重 unordered_set nums_set(nums1.begin(), nums1.end()); for (int num : nums2) { // 发现nums2的元素 在nums_set里又出现过 @@ -77,6 +80,36 @@ public: 不要小瞧 这个耗时,在数据量大的情况,差距是很明显的。 +## 后记 + +本题后面 力扣改了 题目描述 和 后台测试数据,增添了 数值范围: + +* 1 <= nums1.length, nums2.length <= 1000 +* 0 <= nums1[i], nums2[i] <= 1000 + +所以就可以 使用数组来做哈希表了, 因为数组都是 1000以内的。 + +对应C++代码如下: + +```c++ +class Solution { +public: + vector intersection(vector& nums1, vector& nums2) { + unordered_set result_set; // 存放结果,之所以用set是为了给结果集去重 + int hash[1005] = {0}; // 默认数值为0 + for (int num : nums1) { // nums1中出现的字母在hash数组中做记录 + hash[num] = 1; + } + for (int num : nums2) { // nums2中出现话,result记录 + if (hash[num] == 1) { + result_set.insert(num); + } + } + return vector(result_set.begin(), result_set.end()); + } +}; +``` + ## 其他语言版本 diff --git "a/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" "b/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" index 00f8f70cf9..e8db980d63 100644 --- "a/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" +++ "b/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" @@ -88,8 +88,8 @@ public: }; ``` -* 时间复杂度:$O(n)$ -* 空间复杂度:$O(1)$ +* 时间复杂度:O(n) +* 空间复杂度:O(1) ## 思路2(动态规划) @@ -138,8 +138,8 @@ public: }; ``` -* 时间复杂度:$O(n^2)$ -* 空间复杂度:$O(n)$ +* 时间复杂度:O(n^2) +* 空间复杂度:O(n) **进阶** @@ -149,9 +149,9 @@ public: * 每次更新`dp[i][1]`,则在`tree2`的`nums[i]`位置值更新为`dp[i][1]` * 则dp转移方程中就没有必要j从0遍历到i-1,可以直接在线段树中查询指定区间的值即可。 -时间复杂度:$O(n\log n)$ +时间复杂度:O(nlog n) -空间复杂度:$O(n)$ +空间复杂度:O(n) ## 总结 diff --git "a/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" "b/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" index 9a26d63900..dedeb0ad53 100644 --- "a/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" @@ -31,7 +31,7 @@ ## 思路 -(这道题可以用双指针的思路来实现,时间复杂度就是$O(n)$) +(这道题可以用双指针的思路来实现,时间复杂度就是O(n)) 这道题应该算是编辑距离的入门题目,因为从题意中我们也可以发现,只需要计算删除的情况,不用考虑增加和替换的情况。 @@ -122,8 +122,8 @@ public: }; ``` -* 时间复杂度:$O(n × m)$ -* 空间复杂度:$O(n × m)$ +* 时间复杂度:O(n × m) +* 空间复杂度:O(n × m) ## 总结 diff --git "a/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" "b/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" index d22e23359d..b735c106a8 100644 --- "a/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" +++ "b/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" @@ -18,14 +18,19 @@ **例如:** 输入: -A = [ 1, 2] -B = [-2,-1] -C = [-1, 2] -D = [ 0, 2] +* A = [ 1, 2] +* B = [-2,-1] +* C = [-1, 2] +* D = [ 0, 2] + 输出: + 2 + **解释:** + 两个元组如下: + 1. (0, 0, 0, 1) -> A[0] + B[0] + C[0] + D[1] = 1 + (-2) + (-1) + 2 = 0 2. (1, 1, 0, 0) -> A[1] + B[1] + C[0] + D[0] = 2 + (-1) + (-1) + 0 = 0 diff --git "a/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" "b/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" index c0b34e8a8b..fa9bf7b804 100644 --- "a/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" +++ "b/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" @@ -32,7 +32,7 @@ 两层for循环,遍历区间起始位置和终止位置,然后判断这个区间是不是回文。 -时间复杂度:$O(n^3)$ +时间复杂度:O(n^3) ## 动态规划 @@ -171,8 +171,8 @@ public: }; ``` -* 时间复杂度:$O(n^2)$ -* 空间复杂度:$O(n^2)$ +* 时间复杂度:O(n^2) +* 空间复杂度:O(n^2) ## 双指针法 @@ -213,8 +213,8 @@ public: }; ``` -* 时间复杂度:$O(n^2)$ -* 空间复杂度:$O(1)$ +* 时间复杂度:O(n^2) +* 空间复杂度:O(1) ## 其他语言版本 diff --git "a/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" "b/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" index 6a37e4d107..432305e2dd 100644 --- "a/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" +++ "b/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" @@ -36,7 +36,7 @@ ## 思路 -为了易于大家理解,我还录制了视频,可以看这里:[手把手带你撕出正确的二分法](https://www.bilibili.com/video/BV1fA4y1o715) +为了易于大家理解,我还录制了视频,可以看这里:[B站:手把手带你撕出正确的二分法](https://www.bilibili.com/video/BV1fA4y1o715) **这道题目的前提是数组为有序数组**,同时题目还强调**数组中无重复元素**,因为一旦有重复元素,使用二分查找法返回的元素下标可能不是唯一的,这些都是使用二分法的前提条件,当大家看到题目描述满足如上条件的时候,可要想一想是不是可以用二分法了。 diff --git "a/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" "b/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" index 6ee11eefbf..b0385ce167 100644 --- "a/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" +++ "b/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" @@ -26,6 +26,8 @@ # 思路 +为了方便大家理解,我特意录制了视频:[帮你把链表操作学个通透!LeetCode:707.设计链表](https://www.bilibili.com/video/BV1FU4y1X7WD),结合视频在看本题解,事半功倍。 + 如果对链表的基础知识还不太懂,可以看这篇文章:[关于链表,你该了解这些!](https://programmercarl.com/链表理论基础.html) 如果对链表的虚拟头结点不清楚,可以看这篇文章:[链表:听说用虚拟头节点会方便很多?](https://programmercarl.com/0203.移除链表元素.html) diff --git "a/problems/0718.\346\234\200\351\225\277\351\207\215\345\244\215\345\255\220\346\225\260\347\273\204.md" "b/problems/0718.\346\234\200\351\225\277\351\207\215\345\244\215\345\255\220\346\225\260\347\273\204.md" index 18007b700b..6de8b80f43 100644 --- "a/problems/0718.\346\234\200\351\225\277\351\207\215\345\244\215\345\255\220\346\225\260\347\273\204.md" +++ "b/problems/0718.\346\234\200\351\225\277\351\207\215\345\244\215\345\255\220\346\225\260\347\273\204.md" @@ -31,7 +31,7 @@ B: [3,2,1,4,7] 1. 确定dp数组(dp table)以及下标的含义 -dp[i][j] :以下标i - 1为结尾的A,和以下标j - 1为结尾的B,最长重复子数组长度为dp[i][j]。 +dp[i][j] :以下标i - 1为结尾的A,和以下标j - 1为结尾的B,最长重复子数组长度为dp[i][j]。 (**特别注意**: “以下标i - 1为结尾的A” 标明一定是 以A[i-1]为结尾的字符串 ) 此时细心的同学应该发现,那dp[0][0]是什么含义呢?总不能是以下标-1为结尾的A数组吧。 diff --git "a/problems/0797.\346\211\200\346\234\211\345\217\257\350\203\275\347\232\204\350\267\257\345\276\204.md" "b/problems/0797.\346\211\200\346\234\211\345\217\257\350\203\275\347\232\204\350\267\257\345\276\204.md" new file mode 100644 index 0000000000..b990053e10 --- /dev/null +++ "b/problems/0797.\346\211\200\346\234\211\345\217\257\350\203\275\347\232\204\350\267\257\345\276\204.md" @@ -0,0 +1,296 @@ + +看一下 算法4,深搜是怎么讲的 + +# 797.所有可能的路径 + +本题是一道 原汁原味的 深度优先搜索(dfs)模板题,那么用这道题目 来讲解 深搜最合适不过了。 + +接下来给大家详细讲解dfs: + +## dfs 与 bfs 区别 + +先来了解dfs的过程,很多录友可能对dfs(深度优先搜索),bfs(广度优先搜索)分不清。 + +先给大家说一下两者大概的区别: + +* dfs是可一个方向去搜,不到黄河不回头,直到遇到绝境了,搜不下去了,在换方向(换方向的过程就涉及到了回溯)。 +* bfs是先把本节点所连接的所有节点遍历一遍,走到下一个节点的时候,再把连接节点的所有节点遍历一遍,搜索方向更像是广度,四面八方的搜索过程。 + +当然以上讲的是,大体可以这么理解,接下来 我们详细讲解dfs,(bfs在用单独一篇文章详细讲解) + +## dfs 搜索过程 + +上面说道dfs是可一个方向搜,不到黄河不回头。 那么我们来举一个例子。 + +如图一,是一个无向图,我们要搜索从节点1到节点6的所有路径。 + +![图一](https://code-thinking-1253855093.file.myqcloud.com/pics/20220707093643.png) + +那么dfs搜索的第一条路径是这样的: (假设第一次延默认方向,就找到了节点6),图二 + +![图二](https://code-thinking-1253855093.file.myqcloud.com/pics/20220707093807.png) + +此时我们找到了节点6,(遇到黄河了,是不是应该回头了),那么应该再去搜索其他方向了。 如图三: + +![图三](https://code-thinking-1253855093.file.myqcloud.com/pics/20220707094011.png) + +路径2撤销了,改变了方向,走路径3(红色线), 接着也找到终点6。 那么撤销路径2,改为路径3,在dfs中其实就是回溯的过程(这一点很重要,很多录友,都不理解dfs代码中回溯是用来干什么的) + +又找到了一条从节点1到节点6的路径,又到黄河了,此时再回头,下图图四中,路径4撤销(回溯的过程),改为路径5。 + +![图四](https://code-thinking-1253855093.file.myqcloud.com/pics/20220707094322.png) + +又找到了一条从节点1到节点6的路径,又到黄河了,此时再回头,下图图五,路径6撤销(回溯的过程),改为路径7,路径8 和 路径7,路径9, 结果发现死路一条,都走到了自己走过的节点。 + +![图五](https://code-thinking-1253855093.file.myqcloud.com/pics/20220707094813.png) + +那么节点2所连接路径和节点3所链接的路径 都走过了,撤销路径只能向上回退,去选择撤销当初节点4的选择,也就是撤销路径5,改为路径10 。 如图图六: + +![图六](https://code-thinking-1253855093.file.myqcloud.com/pics/20220707095232.png) + + +上图演示中,其实我并没有把 所有的 从节点1 到节点6的dfs(深度优先搜索)的过程都画出来,那样太冗余了,但 已经把dfs 关键的地方都涉及到了,关键就两点: + +* 搜索方向,是认准一个方向搜,直到碰壁之后在换方向 +* 换方向是撤销原路径,改为节点链接的下一个路径,回溯的过程。 + + +## 代码框架 + +正式因为dfs搜索可一个方向,并需要回溯,所以用递归的方式来实现是最方便的。 + +很多录友对回溯很陌生,建议先看看码随想录,[回溯算法章节](https://programmercarl.com/回溯算法理论基础.html)。 + +有递归的地方就有回溯,那么回溯在哪里呢? + +就地递归函数的下面,例如如下代码: +``` +void dfs(参数) { + 处理节点 + dfs(图,选择的节点); // 递归 + 回溯,撤销处理结果 +} +``` + +可以看到回溯操作就在递归函数的下面,递归和回溯是相辅相成的。 + +在讲解[二叉树章节](https://programmercarl.com/二叉树理论基础.html)的时候,二叉树的递归法其实就是dfs,而二叉树的迭代法,就是bfs(广度优先搜索) + +所以**dfs,bfs其实是基础搜索算法,也广泛应用与其他数据结构与算法中**。 + +我们在回顾一下[回溯法](https://programmercarl.com/回溯算法理论基础.html)的代码框架: + +``` +void backtracking(参数) { + if (终止条件) { + 存放结果; + return; + } + for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) { + 处理节点; + backtracking(路径,选择列表); // 递归 + 回溯,撤销处理结果 + } +} + +``` + +回溯算法,其实就是dfs的过程,这里给出dfs的代码框架: + +``` +void dfs(参数) { + if (终止条件) { + 存放结果; + return; + } + + for (选择:本节点所连接的其他节点) { + 处理节点; + dfs(图,选择的节点); // 递归 + 回溯,撤销处理结果 + } +} + +``` + +可以发现dfs的代码框架和回溯算法的代码框架是差不多的。 + +下面我在用 深搜三部曲,来解读 dfs的代码框架。 + +## 深搜三部曲 + +在 [二叉树递归讲解](https://programmercarl.com/%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E9%80%92%E5%BD%92%E9%81%8D%E5%8E%86.html)中,给出了递归三部曲。 + +[回溯算法](https://programmercarl.com/回溯算法理论基础.html)讲解中,给出了 回溯三部曲。 + +其实深搜也是一样的,深搜三部曲如下: + +1. 确认递归函数,参数 + +``` +void dfs(参数) +``` + +通常我们递归的时候,我们递归搜索需要了解哪些参数,其实也可以在写递归函数的时候,发现需要什么参数,再去补充就可以。 + +一般情况,深搜需要 二维数组数组结构保存所有路径,需要一维数组保存单一路径,这种保存结果的数组,我们可以定义一个全局遍历,避免让我们的函数参数过多。 + +例如这样: + +``` +vector> result; // 保存符合条件的所有路径 +vector path; // 起点到终点的路径 +void dfs (图,目前搜索的节点) +``` + +但这种写法看个人习惯,不强求。 + +2. 确认终止条件 + +终止条件很重要,很多同学写dfs的时候,之所以容易死循环,栈溢出等等这些问题,都是因为终止条件没有想清楚。 + +``` +if (终止条件) { + 存放结果; + return; +} +``` + +终止添加不仅是结束本层递归,同时也是我们收获结果的时候。 + +3. 处理目前搜索节点出发的路径 + +一般这里就是一个for循环的操作,去遍历 目前搜索节点 所能到的所有节点。 + +``` +for (选择:本节点所连接的其他节点) { + 处理节点; + dfs(图,选择的节点); // 递归 + 回溯,撤销处理结果 +} +``` + +不少录友疑惑的地方,都是 dfs代码框架中for循环里分明已经处理节点了,那么 dfs函数下面 为什么还要撤销的呢。 + +如图七所示, 路径2 已经走到了 目的地节点6,那么 路径2 是如何撤销,然后改为 路径3呢? 其实这就是 回溯的过程,撤销路径2,走换下一个方向。 + +![图七](https://code-thinking-1253855093.file.myqcloud.com/pics/20220708093544.png) + + +## 总结 + +我们讲解了,dfs 和 bfs的大体区别(bfs详细过程下篇来讲),dfs的搜索过程以及代码框架。 + +最后还有 深搜三部曲来解读这份代码框架。 + +以上如果大家都能理解了,其实搜索的代码就很好写,具体题目套用具体场景就可以了。 + +## 797. 所有可能的路径 + +### 思路 + +1. 确认递归函数,参数 + +首先我们dfs函数一定要存一个图,用来遍历的,还要存一个目前我们遍历的节点,定义为x + +至于 单一路径,和路径集合可以放在全局变量,那么代码是这样的: + +```c++ +vector> result; // 收集符合条件的路径 +vector path; // 0节点到终点的路径 +// x:目前遍历的节点 +// graph:存当前的图 +void dfs (vector>& graph, int x) +``` + +2. 确认终止条件 + +什么时候我们就找到一条路径了? + +当目前遍历的节点 为 最后一个节点的时候,就找到了一条,从 出发点到终止点的路径。 + +当前遍历的节点,我们定义为x,最后一点节点,就是 graph.size() - 1。 + +所以 但 x 等于 graph.size() - 1 的时候就找到一条有效路径。 代码如下: + + +```c++ +// 要求从节点 0 到节点 n-1 的路径并输出,所以是 graph.size() - 1 +if (x == graph.size() - 1) { // 找到符合条件的一条路径 + result.push_back(path); // 收集有效路径 + return; +} +``` + +3. 处理目前搜索节点出发的路径 + +接下来是走 当前遍历节点x的下一个节点。 + +首先是要找到 x节点链接了哪些节点呢? 遍历方式是这样的: + +```c++ +for (int i = 0; i < graph[x].size(); i++) { // 遍历节点n链接的所有节点 +``` + +接下来就是将 选中的x所连接的节点,加入到 单一路劲来。 + +```C++ +path.push_back(graph[x][i]); // 遍历到的节点加入到路径中来 + +``` + +当前遍历的节点就是 `graph[x][i]` 了,所以进入下一层递归 + +```C++ +dfs(graph, graph[x][i]); // 进入下一层递归 +``` + +最后就是回溯的过程,撤销本次添加节点的操作。 该过程整体代码: + +```C++ +for (int i = 0; i < graph[x].size(); i++) { // 遍历节点n链接的所有节点 + path.push_back(graph[x][i]); // 遍历到的节点加入到路径中来 + dfs(graph, graph[x][i]); // 进入下一层递归 + path.pop_back(); // 回溯,撤销本节点 +} +``` + + +### 本题代码 + +```c++ +class Solution { +private: + vector> result; // 收集符合条件的路径 + vector path; // 0节点到终点的路径 + // x:目前遍历的节点 + // graph:存当前的图 + void dfs (vector>& graph, int x) { + // 要求从节点 0 到节点 n-1 的路径并输出,所以是 graph.size() - 1 + if (x == graph.size() - 1) { // 找到符合条件的一条路径 + result.push_back(path); + return; + } + for (int i = 0; i < graph[x].size(); i++) { // 遍历节点n链接的所有节点 + path.push_back(graph[x][i]); // 遍历到的节点加入到路径中来 + dfs(graph, graph[x][i]); // 进入下一层递归 + path.pop_back(); // 回溯,撤销本节点 + } + } +public: + vector> allPathsSourceTarget(vector>& graph) { + path.push_back(0); // 无论什么路径已经是从0节点出发 + dfs(graph, 0); // 开始遍历 + return result; + } +}; + +``` + +## 其他语言版本 + +### Java + +### Python + +### Go diff --git "a/problems/0841.\351\222\245\345\214\231\345\222\214\346\210\277\351\227\264.md" "b/problems/0841.\351\222\245\345\214\231\345\222\214\346\210\277\351\227\264.md" index 6f51b4addb..58765a8fae 100644 --- "a/problems/0841.\351\222\245\345\214\231\345\222\214\346\210\277\351\227\264.md" +++ "b/problems/0841.\351\222\245\345\214\231\345\222\214\346\210\277\351\227\264.md" @@ -31,21 +31,182 @@ * 解释:我们不能进入 2 号房间。 -## 思 +## 思路 -其实这道题的本质就是判断各个房间所连成的有向图,说明不用访问所有的房间。 +本题其实给我们是一个有向图, 意识到这是有向图很重要! -如图所示: +图中给我的两个示例: `[[1],[2],[3],[]]` `[[1,3],[3,0,1],[2],[0]]`,画成对应的图如下: - +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20220714101414.png) -示例1就可以访问所有的房间,因为通过房间里的key将房间连在了一起。 +我们可以看出图1的所有节点都是链接的,而图二中,节点2 是孤立的。 -示例2中,就不能访问所有房间,从图中就可以看出,房间2是一个孤岛,我们从0出发,无论怎么遍历,都访问不到房间2。 +这就很容易让我们想起岛屿问题,只要发现独立的岛,就是不能进入所有房间。 -认清本质问题之后,**使用 广度优先搜索(BFS) 还是 深度优先搜索(DFS) 都是可以的。** +此时也容易想到用并查集的方式去解决。 -BFS C++代码代码如下: +**但本题是有向图**,在有向图中,即使所有节点都是链接的,但依然不可能从0出发遍历所有边。 +给大家举一个例子: + +图3:[[5], [], [1, 3], [5]] ,如图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20220714102201.png) + +在图3中,大家可以发现,节点0只能到节点5,然后就哪也去不了了。 + +所以本题是一个有向图搜索全路径的问题。 只能用深搜(BFS)或者广搜(DFS)来搜。 + +关于DFS的理论,如果大家有困惑,可以先看我这篇题解: [DFS理论基础](https://leetcode.cn/problems/all-paths-from-source-to-target/solution/by-carlsun-2-66pf) + +**以下dfs分析 大家一定要仔细看,本题有两种dfs的解法,很多题解没有讲清楚**。 看完之后 相信你对dfs会有更深的理解。 + +深搜三部曲: + +1. 确认递归函数,参数 + +需要传入二维数组rooms来遍历地图,需要知道当前我们拿到的key,以至于去下一个房间。 + +同时还需要一个数组,用来记录我们都走过了哪些房间,这样好知道最后有没有把所有房间都遍历的,可以定义一个一维数组。 + +所以 递归函数参数如下: + +```C++ +// key 当前得到的可以 +// visited 记录访问过的房间 +void dfs(const vector>& rooms, int key, vector& visited) { +``` + +2. 确认终止条件 + +遍历的时候,什么时候终止呢? + +这里有一个很重要的逻辑,就是在递归中,**我们是处理当前访问的节点,还是处理下一个要访问的节点**。 + +这决定 终止条件怎么写。 + +首先明确,本题中什么叫做处理,就是 visited数组来记录访问过的节点,那么把该节点默认 数组里元素都是false,把元素标记为true就是处理 本节点了。 + +如果我们是处理当前访问的节点,当前访问的节点如果是 true ,说明是访问过的节点,那就终止本层递归,如果不是true,我们就把它赋值为true,因为我们处理本层递归的节点。 + +代码就是这样: + +```C++ +// 写法一:处理当前访问的节点 +void dfs(const vector>& rooms, int key, vector& visited) { + if (visited[key]) { // 本层递归是true,说明访问过,立刻返回 + return; + } + visited[key] = true; // 给当前遍历的节点赋值true + vector keys = rooms[key]; + for (int key : keys) { + // 深度优先搜索遍历 + dfs(rooms, key, visited); + } +} +``` + +如果我们是处理下一层访问的节点,而不是当前层。那么就要在 深搜三部曲中第三步:处理目前搜索节点出发的路径 的时候对 节点进行处理。 + +这样的话,就不需要终止条件,而是在 搜索下一个节点的时候,直接判断 下一个节点是否是我们要搜的节点。 + +代码就是这样的: + +```C++ +// 写法二:处理下一个要访问的节点 +void dfs(const vector>& rooms, int key, vector& visited) { + // 这里 没有终止条件,而是在 处理下一层节点的时候来判断 + vector keys = rooms[key]; + for (int key : keys) { + if (visited[key] == false) { // 处理下一层节点,判断是否要进行递归 + visited[key] = true; + dfs(rooms, key, visited); + } + } +} +``` + +可以看出,如果看待 我们要访问的节点,直接决定了两种不一样的写法,很多同学对这一块很模糊,其实做过这道题,也没有思考到这个维度上。 + + +3. 处理目前搜索节点出发的路径 + +其实在上面,深搜三部曲 第二部,就已经讲了,因为终止条件的两种写法, 直接决定了两种不一样的递归写法。 + +这里还有细节: + +看上面两个版本的写法中, 好像没有发现回溯的逻辑。 + +我们都知道,有递归就有回溯,回溯就在递归函数的下面, 那么之前我们做的dfs题目,都需要回溯操作,例如:[797.所有可能的路径](https://leetcode.cn/problems/all-paths-from-source-to-target/solution/by-carlsun-2-66pf/), **为什么本题就没有回溯呢?** + +代码中可以看到dfs函数下面并没有回溯的操作。 + +此时就要在思考本题的要求了,本题是需要判断 0节点是否能到所有节点,那么我们就没有必要回溯去撤销操作了,只要遍历过的节点一律都标记上。 + +**那什么时候需要回溯操作呢?** + +当我们需要搜索一条可行路径的时候,就需要回溯操作了,因为没有回溯,就没法“调头”, 如果不理解的话,去看我写的 [797.所有可能的路径](https://leetcode.cn/problems/all-paths-from-source-to-target/solution/by-carlsun-2-66pf/) 的题解。 + + +以上分析完毕,DFS整体实现C++代码如下: + +```CPP +// 写法一:处理当前访问的节点 +class Solution { +private: + void dfs(const vector>& rooms, int key, vector& visited) { + if (visited[key]) { + return; + } + visited[key] = true; + vector keys = rooms[key]; + for (int key : keys) { + // 深度优先搜索遍历 + dfs(rooms, key, visited); + } + } +public: + bool canVisitAllRooms(vector>& rooms) { + vector visited(rooms.size(), false); + dfs(rooms, 0, visited); + //检查是否都访问到了 + for (int i : visited) { + if (i == false) return false; + } + return true; + } +}; + +``` + +```c++ +写法二:处理下一个要访问的节点 +class Solution { +private: + void dfs(const vector>& rooms, int key, vector& visited) { + vector keys = rooms[key]; + for (int key : keys) { + if (visited[key] == false) { + visited[key] = true; + dfs(rooms, key, visited); + } + } + } +public: + bool canVisitAllRooms(vector>& rooms) { + vector visited(rooms.size(), false); + visited[0] = true; // 0 节点是出发节点,一定被访问过 + dfs(rooms, 0, visited); + //检查是否都访问到了 + for (int i : visited) { + if (i == false) return false; + } + return true; + } +}; + +``` + +本题我也给出 BFS C++代码,至于BFS,我后面会有单独文章来讲,代码如下: ```CPP class Solution { @@ -80,39 +241,11 @@ public: }; ``` -DFS C++代码如下: - -```CPP -class Solution { -private: - void dfs(int key, const vector>& rooms, vector& visited) { - if (visited[key]) { - return; - } - visited[key] = 1; - vector keys = rooms[key]; - for (int key : keys) { - // 深度优先搜索遍历 - dfs(key, rooms, visited); - } - } -public: - bool canVisitAllRooms(vector>& rooms) { - vector visited(rooms.size(), 0); - dfs(0, rooms, visited); - //检查是否都访问到了 - for (int i : visited) { - if (i == 0) return false; - } - return true; - } -}; -``` -# 其他语言版本 +## 其他语言版本 -Java: +### Java ```java class Solution { @@ -120,24 +253,19 @@ class Solution { 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) { @@ -149,20 +277,14 @@ class Solution { } ``` - - - - -python3 +### 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)) : @@ -183,7 +305,7 @@ class Solution: ``` -Go: +### Go ```go @@ -201,11 +323,8 @@ func dfs(key int, rooms [][]int, visited []bool ) { } func canVisitAllRooms(rooms [][]int) bool { - visited := make([]bool, len(rooms)); - dfs(0, rooms, visited); - //检查是否都访问到了 for i := 0; i < len(visited); i++ { if !visited[i] { @@ -216,7 +335,7 @@ func canVisitAllRooms(rooms [][]int) bool { } ``` -JavaScript: +### JavaScript ```javascript //DFS var canVisitAllRooms = function(rooms) { diff --git "a/problems/1791.\346\211\276\345\207\272\346\230\237\345\236\213\345\233\276\347\232\204\344\270\255\345\277\203\350\212\202\347\202\271.md" "b/problems/1791.\346\211\276\345\207\272\346\230\237\345\236\213\345\233\276\347\232\204\344\270\255\345\277\203\350\212\202\347\202\271.md" new file mode 100644 index 0000000000..57777fd764 --- /dev/null +++ "b/problems/1791.\346\211\276\345\207\272\346\230\237\345\236\213\345\233\276\347\232\204\344\270\255\345\277\203\350\212\202\347\202\271.md" @@ -0,0 +1,73 @@ +# 1791.找出星型图的中心节点 + +[题目链接](https://leetcode.cn/problems/find-center-of-star-graph/) + +本题思路就是统计各个节点的度(这里没有区别入度和出度),如果某个节点的度等于这个图边的数量。 那么这个节点一定是中心节点。 + +什么是度,可以理解为,链接节点的边的数量。 题目中度如图所示: + +![1791.找出星型图的中心节点](https://code-thinking-1253855093.file.myqcloud.com/pics/20220704113207.png) + +至于出度和入度,那就是在有向图里的概念了,本题是无向图。 + +本题代码如下: + +```c++ + +class Solution { +public: + int findCenter(vector>& edges) { + unordered_map du; + for (int i = 0; i < edges.size(); i++) { // 统计各个节点的度 + du[edges[i][1]]++; + du[edges[i][0]]++; + } + unordered_map::iterator iter; // 找出度等于边熟练的节点 + for (iter = du.begin(); iter != du.end(); iter++) { + if (iter->second == edges.size()) return iter->first; + } + return -1; + } +}; +``` + +其实可以只记录度不用最后统计,因为题目说了一定是星状图,所以 一旦有 节点的度 大于1,就返回该节点数值就行,只有中心节点的度会大于1。 + +代码如下: + +```c++ +class Solution { +public: + int findCenter(vector>& edges) { + vector du(edges.size() + 2); // edges.size() + 1 为节点数量,下标表示节点数,所以+2 + for (int i = 0; i < edges.size(); i++) { + du[edges[i][1]]++; + du[edges[i][0]]++; + if (du[edges[i][1]] > 1) return edges[i][1]; + if (du[edges[i][0]] > 1) return edges[i][0]; + + } + return -1; + } +}; +``` + +以上代码中没有使用 unordered_map,因为遍历的时候,开辟新空间会浪费时间,而采用 vector,这是 空间换时间的一种策略。 + +代码其实可以再精简: + +```c++ +class Solution { +public: + int findCenter(vector>& edges) { + vector du(edges.size() + 2); + for (int i = 0; i < edges.size(); i++) { + if (++du[edges[i][1]] > 1) return edges[i][1]; + if (++du[edges[i][0]] > 1) return edges[i][0]; + } + return -1; + } +}; +``` + + diff --git "a/problems/1971.\345\257\273\346\211\276\345\233\276\344\270\255\346\230\257\345\220\246\345\255\230\345\234\250\350\267\257\345\276\204.md" "b/problems/1971.\345\257\273\346\211\276\345\233\276\344\270\255\346\230\257\345\220\246\345\255\230\345\234\250\350\267\257\345\276\204.md" new file mode 100644 index 0000000000..bf1e93cf0d --- /dev/null +++ "b/problems/1971.\345\257\273\346\211\276\345\233\276\344\270\255\346\230\257\345\220\246\345\255\230\345\234\250\350\267\257\345\276\204.md" @@ -0,0 +1,123 @@ +# 1971. 寻找图中是否存在路径 + +[题目链接](https://leetcode.cn/problems/find-if-path-exists-in-graph/) + +有一个具有 n个顶点的 双向 图,其中每个顶点标记从 0 到 n - 1(包含 0 和 n - 1)。图中的边用一个二维整数数组 edges 表示,其中 edges[i] = [ui, vi] 表示顶点 ui 和顶点 vi 之间的双向边。 每个顶点对由 最多一条 边连接,并且没有顶点存在与自身相连的边。 + +请你确定是否存在从顶点 start 开始,到顶点 end 结束的 有效路径 。 + +给你数组 edges 和整数 n、start和end,如果从 start 到 end 存在 有效路径 ,则返回 true,否则返回 false 。 + + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20220705101442.png) + + +提示: + +* 1 <= n <= 2 * 10^5 +* 0 <= edges.length <= 2 * 10^5 +* edges[i].length == 2 +* 0 <= ui, vi <= n - 1 +* ui != vi +* 0 <= start, end <= n - 1 +* 不存在双向边 +* 不存在指向顶点自身的边 + +## 思路 + +这道题目也是并查集基础题目。 + +首先要知道并查集可以解决什么问题呢? + +主要就是集合问题,两个节点在不在一个集合,也可以将两个节点添加到一个集合中。 + +这里整理出我的并查集模板如下: + +```CPP +int n = 1005; // 节点数量3 到 1000 +int father[1005]; + +// 并查集初始化 +void init() { + for (int i = 0; i < n; ++i) { + father[i] = i; + } +} +// 并查集里寻根的过程 +int find(int u) { + return u == father[u] ? u : father[u] = find(father[u]); +} +// 将v->u 这条边加入并查集 +void join(int u, int v) { + u = find(u); + v = find(v); + if (u == v) return ; + father[v] = u; +} +// 判断 u 和 v是否找到同一个根 +bool same(int u, int v) { + u = find(u); + v = find(v); + return u == v; +} +``` + +以上模板汇总,只要修改 n 和father数组的大小就可以了。 + +并查集主要有三个功能。 + +1. 寻找根节点,函数:find(int u),也就是判断这个节点的祖先节点是哪个 +2. 将两个节点接入到同一个集合,函数:join(int u, int v),将两个节点连在同一个根节点上 +3. 判断两个节点是否在同一个集合,函数:same(int u, int v),就是判断两个节点是不是同一个根节点 + +简单介绍并查集之后,我们再来看一下这道题目。 + +为什么说这道题目是并查集基础题目,因为 可以直接套用模板。 + +使用join(int u, int v)将每条边加入到并查集。 + +最后 same(int u, int v) 判断是否是同一个根 就可以里。 + +代码如下: + +```c++ +class Solution { + +private: + int n = 200005; // 节点数量 20000 + int father[200005]; + + // 并查集初始化 + void init() { + for (int i = 0; i < n; ++i) { + father[i] = i; + } + } + // 并查集里寻根的过程 + int find(int u) { + return u == father[u] ? u : father[u] = find(father[u]); + } + // 将v->u 这条边加入并查集 + void join(int u, int v) { + u = find(u); + v = find(v); + if (u == v) return ; + father[v] = u; + } + // 判断 u 和 v是否找到同一个根,本题用不上 + bool same(int u, int v) { + u = find(u); + v = find(v); + return u == v; + } + +public: + bool validPath(int n, vector>& edges, int source, int destination) { + init(); + for (int i = 0; i < edges.size(); i++) { + join(edges[i][0], edges[i][1]); + } + return same(source, destination); + } +}; +``` diff --git "a/problems/\345\212\250\346\200\201\350\247\204\345\210\222\346\200\273\347\273\223\347\257\207.md" "b/problems/\345\212\250\346\200\201\350\247\204\345\210\222\346\200\273\347\273\223\347\257\207.md" index cc973b2314..847baa9ac3 100644 --- "a/problems/\345\212\250\346\200\201\350\247\204\345\210\222\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/\345\212\250\346\200\201\350\247\204\345\210\222\346\200\273\347\273\223\347\257\207.md" @@ -116,7 +116,7 @@ 能把本篇中列举的题目都研究通透的话,你的动规水平就已经非常高了。 对付面试已经足够! -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211121223754.png) +![](https://kstar-1253855093.cos.ap-nanjing.myqcloud.com/baguwenpdf/_%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92%E6%80%9D%E7%BB%B4%E5%AF%BC%E5%9B%BE_%E9%9D%92.png) 这个图是 [代码随想录知识星球](https://programmercarl.com/other/kstar.html) 成员:[青](https://wx.zsxq.com/dweb2/index/footprint/185251215558842),所画,总结的非常好,分享给大家。 diff --git "a/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" "b/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" index 1ae01061ad..c6d33fe17d 100644 --- "a/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" +++ "b/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" @@ -94,8 +94,8 @@ public: }; ``` -* 时间复杂度:$O(n + m)$ -* 空间复杂度:$O(1)$ +* 时间复杂度:O(n + m) +* 空间复杂度:O(1) ## 其他语言版本 From 90ff8a8ff85752d865a458d9ff68c41ce9e3de21 Mon Sep 17 00:00:00 2001 From: cezarbbb <105843128+cezarbbb@users.noreply.github.com> Date: Wed, 20 Jul 2022 15:00:40 +0800 Subject: [PATCH 0937/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200491.=E9=80=92?= =?UTF-8?q?=E5=A2=9E=E5=AD=90=E5=BA=8F=E5=88=97=20Rust=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加 0491.递增子序列 Rust版本 --- ...36\345\255\220\345\272\217\345\210\227.md" | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git "a/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" "b/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" index 080984f2fa..6a92aa214d 100644 --- "a/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" @@ -423,6 +423,57 @@ function findSubsequences(nums: number[]): number[][] { }; ``` +### Rust +**回溯+哈希** +```Rust +use std::collections::HashSet; +impl Solution { + fn backtracking(result: &mut Vec>, path: &mut Vec, nums: &Vec, start_index: usize) { + if path.len() > 1 { result.push(path.clone()); } + let len = nums.len(); + let mut uset: HashSet = HashSet::new(); + for i in start_index..len { + if (!path.is_empty() && nums[i] < *path.last().unwrap()) || uset.contains(&nums[i]) { continue; } + uset.insert(nums[i]); + path.push(nums[i]); + Self::backtracking(result, path, nums, i + 1); + path.pop(); + } + } + + pub fn find_subsequences(nums: Vec) -> Vec> { + let mut result: Vec> = Vec::new(); + let mut path: Vec = Vec::new(); + Self::backtracking(&mut result, &mut path, &nums, 0); + result + } +} +``` +**回溯+数组** +```Rust +impl Solution { + fn backtracking(result: &mut Vec>, path: &mut Vec, nums: &Vec, start_index: usize) { + if path.len() > 1 { result.push(path.clone()); } + let len = nums.len(); + let mut used = [0; 201]; + for i in start_index..len { + if (!path.is_empty() && nums[i] < *path.last().unwrap()) || used[(nums[i] + 100) as usize] == 1 { continue; } + used[(nums[i] + 100) as usize] = 1; + path.push(nums[i]); + Self::backtracking(result, path, nums, i + 1); + path.pop(); + } + } + + pub fn find_subsequences(nums: Vec) -> Vec> { + let mut result: Vec> = Vec::new(); + let mut path: Vec = Vec::new(); + Self::backtracking(&mut result, &mut path, &nums, 0); + result + } +} +``` + ### C ```c From e108c87570953684cf1aee862d580d5d220bcdb4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E5=91=98Carl?= Date: Thu, 21 Jul 2022 09:37:53 +0800 Subject: [PATCH 0938/3019] =?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.\347\233\256\346\240\207\345\222\214.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0494.\347\233\256\346\240\207\345\222\214.md" "b/problems/0494.\347\233\256\346\240\207\345\222\214.md" index 60f721c21a..b8707581e1 100644 --- "a/problems/0494.\347\233\256\346\240\207\345\222\214.md" +++ "b/problems/0494.\347\233\256\346\240\207\345\222\214.md" @@ -213,7 +213,7 @@ public: if (abs(S) > sum) return 0; // 此时没有方案 if ((S + sum) % 2 == 1) return 0; // 此时没有方案 int bagSize = (S + sum) / 2; - if(bagsize<0) return 0; + if (bagsize < 0) return 0; vector dp(bagSize + 1, 0); dp[0] = 1; for (int i = 0; i < nums.size(); i++) { From d59bc2ee161e1ca76642a72cfabd83f8f4218589 Mon Sep 17 00:00:00 2001 From: cezarbbb <105843128+cezarbbb@users.noreply.github.com> Date: Thu, 21 Jul 2022 10:33:02 +0800 Subject: [PATCH 0939/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200046.=E5=85=A8?= =?UTF-8?q?=E6=8E=92=E5=88=97=20Rust=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加 0046.全排列 Rust版本 --- ...6.\345\205\250\346\216\222\345\210\227.md" | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git "a/problems/0046.\345\205\250\346\216\222\345\210\227.md" "b/problems/0046.\345\205\250\346\216\222\345\210\227.md" index 06e1550a83..ce07395a13 100644 --- "a/problems/0046.\345\205\250\346\216\222\345\210\227.md" +++ "b/problems/0046.\345\205\250\346\216\222\345\210\227.md" @@ -359,6 +359,36 @@ function permute(nums: number[]): number[][] { }; ``` +### Rust + +```Rust +impl Solution { + fn backtracking(result: &mut Vec>, path: &mut Vec, nums: &Vec, used: &mut Vec) { + let len = nums.len(); + if path.len() == len { + result.push(path.clone()); + return; + } + for i in 0..len { + if used[i] == true { continue; } + used[i] = true; + path.push(nums[i]); + Self::backtracking(result, path, nums, used); + path.pop(); + used[i] = false; + } + } + + pub fn permute(nums: Vec) -> Vec> { + let mut result: Vec> = Vec::new(); + let mut path: Vec = Vec::new(); + let mut used = vec![false; nums.len()]; + Self::backtracking(&mut result, &mut path, &nums, &mut used); + result + } +} +``` + ### C ```c From bafb7c45db1b9975c590ec93a65034c7b2190656 Mon Sep 17 00:00:00 2001 From: lizhendong128 Date: Thu, 21 Jul 2022 19:50:02 +0800 Subject: [PATCH 0940/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200309.=E6=9C=80?= =?UTF-8?q?=E4=BD=B3=E4=B9=B0=E5=8D=96=E8=82=A1=E7=A5=A8=E6=97=B6=E6=9C=BA?= =?UTF-8?q?=E5=90=AB=E5=86=B7=E5=86=BB=E6=9C=9F=20=E7=94=A8=E4=BA=8E?= =?UTF-8?q?=E8=AF=B4=E6=98=8E=E7=9A=84=E5=9B=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...34\272\345\220\253\345\206\267\345\206\273\346\234\237.md" | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git "a/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" "b/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" index 229fc636d1..3791a71f88 100644 --- "a/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" +++ "b/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" @@ -44,6 +44,8 @@ dp[i][j],第i天状态为j,所剩的最多现金为dp[i][j]。 * 状态三:今天卖出了股票 * 状态四:今天为冷冻期状态,但冷冻期状态不可持续,只有一天! +![](https://img-blog.csdnimg.cn/518d5baaf33f4b2698064f8efb42edbf.png) + j的状态为: * 0:状态一 @@ -57,7 +59,7 @@ j的状态为: **注意这里的每一个状态,例如状态一,是买入股票状态并不是说今天已经就买入股票,而是说保存买入股票的状态即:可能是前几天买入的,之后一直没操作,所以保持买入股票的状态**。 -2. 确定递推公式 +1. 确定递推公式 达到买入股票状态(状态一)即:dp[i][0],有两个具体操作: From dcb4ff10a36ef93f2f2d0f099df2c3e8d912421a Mon Sep 17 00:00:00 2001 From: cezarbbb <105843128+cezarbbb@users.noreply.github.com> Date: Fri, 22 Jul 2022 09:56:34 +0800 Subject: [PATCH 0941/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200047.=E5=85=A8?= =?UTF-8?q?=E6=8E=92=E5=88=97II=20Rust=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加 0047.全排列II Rust版本 --- ...\345\205\250\346\216\222\345\210\227II.md" | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git "a/problems/0047.\345\205\250\346\216\222\345\210\227II.md" "b/problems/0047.\345\205\250\346\216\222\345\210\227II.md" index 88680c8c47..2c3f579f3f 100644 --- "a/problems/0047.\345\205\250\346\216\222\345\210\227II.md" +++ "b/problems/0047.\345\205\250\346\216\222\345\210\227II.md" @@ -351,6 +351,40 @@ func permuteUnique(_ nums: [Int]) -> [[Int]] { } ``` +### Rust + +```Rust +impl Solution { + fn backtracking(result: &mut Vec>, path: &mut Vec, nums: &Vec, used: &mut Vec) { + let len = nums.len(); + if path.len() == len { + result.push(path.clone()); + return; + } + for i in 0..len { + if i > 0 && nums[i] == nums[i - 1] && used[i - 1] == false { continue; } + if used[i] == false { + used[i] = true; + path.push(nums[i]); + Self::backtracking(result, path, nums, used); + path.pop(); + used[i] = false; + } + } + } + + pub fn permute_unique(nums: Vec) -> Vec> { + let mut result: Vec> = Vec::new(); + let mut path: Vec = Vec::new(); + let mut used = vec![false; nums.len()]; + let mut nums= nums; + nums.sort(); + Self::backtracking(&mut result, &mut path, &nums, &mut used); + result + } +} +``` + ### C ```c //临时数组 From 1b4422d438c9f43ebb604d62e05c22a64211e339 Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Fri, 22 Jul 2022 10:39:46 +0800 Subject: [PATCH 0942/3019] Update --- ...54\345\255\227\347\254\246\344\270\262.md" | 2 +- ...64\346\265\201\351\227\256\351\242\230.md" | 199 ++++++++++++++++++ ...\346\225\260\347\233\270\345\212\240II.md" | 2 + 3 files changed, 202 insertions(+), 1 deletion(-) create mode 100644 "problems/0417.\345\244\252\345\271\263\346\264\213\345\244\247\350\245\277\346\264\213\346\260\264\346\265\201\351\227\256\351\242\230.md" diff --git "a/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" "b/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" index 031bc0adbd..ebadc04486 100644 --- "a/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" @@ -14,7 +14,7 @@ 编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。 -不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 $O(1)$ 的额外空间解决这一问题。 +不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。 你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。 diff --git "a/problems/0417.\345\244\252\345\271\263\346\264\213\345\244\247\350\245\277\346\264\213\346\260\264\346\265\201\351\227\256\351\242\230.md" "b/problems/0417.\345\244\252\345\271\263\346\264\213\345\244\247\350\245\277\346\264\213\346\260\264\346\265\201\351\227\256\351\242\230.md" new file mode 100644 index 0000000000..7efee80ade --- /dev/null +++ "b/problems/0417.\345\244\252\345\271\263\346\264\213\345\244\247\350\245\277\346\264\213\346\260\264\346\265\201\351\227\256\351\242\230.md" @@ -0,0 +1,199 @@ +# 417. 太平洋大西洋水流问题 + +[题目链接](https://leetcode.cn/problems/pacific-atlantic-water-flow/) + +不少同学可能被这道题的题目描述迷惑了,其实就是找到哪些点 可以同时到达太平洋和大西洋。 流动的方式只能从高往低流。 + +那么一个比较直白的想法,其实就是 遍历每个点,然后看这个点 能不能同时到达太平洋和大西洋。 + +至于遍历方式,可以用dfs,也可以用bfs,以下用dfs来举例。 + +那么这种思路的实现代码如下: + +```CPP +class Solution { +private: + int dir[4][2] = {-1, 0, 0, -1, 1, 0, 0, 1}; + void dfs(vector>& heights, vector>& visited, int x, int y) { + if (visited[x][y]) return; + + visited[x][y] = true; + + for (int i = 0; i < 4; i++) { + int nextx = x + dir[i][0]; + int nexty = y + dir[i][1]; + if (nextx < 0 || nextx >= heights.size() || nexty < 0 || nexty >= heights[0].size()) continue; + if (heights[x][y] < heights[nextx][nexty]) continue; // 高度不合适 + + dfs (heights, visited, nextx, nexty); + } + return; + } + bool isResult(vector>& heights, int x, int y) { + vector> visited = vector>(heights.size(), vector(heights[0].size(), false)); + + // 深搜,将x,y出发 能到的节点都标记上。 + dfs(heights, visited, x, y); + bool isPacific = false; + bool isAtlantic = false; + + // 以下就是判断x,y出发,是否到达太平洋和大西洋 + for (int j = 0; j < heights[0].size(); j++) { + if (visited[0][j]) { + isPacific = true; + break; + } + } + for (int i = 0; i < heights.size(); i++) { + if (visited[i][0]) { + isPacific = true; + break; + } + } + for (int j = 0; j < heights[0].size(); j++) { + if (visited[heights.size() - 1][j]) { + isAtlantic = true; + break; + } + } + for (int i = 0; i < heights.size(); i++) { + if (visited[i][heights[0].size() - 1]) { + isAtlantic = true; + break; + } + } + if (isAtlantic && isPacific) return true; + return false; + } +public: + + vector> pacificAtlantic(vector>& heights) { + vector> result; + // 遍历每一个点,看是否能同时到达太平洋和大西洋 + for (int i = 0; i < heights.size(); i++) { + for (int j = 0; j < heights[0].size(); j++) { + if (isResult(heights, i, j)) result.push_back({i, j}); + } + } + return result; + } +}; + +``` + +这种思路很直白,但很明显,以上代码超时了。 来看看时间复杂度。 + +遍历每一个节点,是 m * n,遍历每一个节点的时候,都要做深搜,深搜的时间复杂度是: m * n + +那么整体时间复杂度 就是 O(m^2 * n^2) ,这是一个四次方的时间复杂度。 + +## 优化 + +那么我们可以 反过来想,从太平洋边上的节点 逆流而上,将遍历过的节点都标记上。 从大西洋的边上节点 逆流而长,讲遍历过的节点也标记上。 + +从太平洋边上节点出发,如图: + +![图一](https://code-thinking-1253855093.file.myqcloud.com/pics/20220722103029.png) + +从大西洋边上节点出发,如图: + +![图二](https://code-thinking-1253855093.file.myqcloud.com/pics/20220722103330.png) + +按照这样的逻辑,就可以写出如下遍历代码:(详细注释) + +(如果对dfs基础内容就不懂,建议看 [「代码随想录」DFS算法精讲!](https://leetcode.cn/problems/all-paths-from-source-to-target/solution/by-carlsun-2-66pf/),还可以顺便解决 797. 所有可能的路径) + +```CPP +class Solution { +private: + int dir[4][2] = {-1, 0, 0, -1, 1, 0, 0, 1}; // 保存四个方向 + + // 从低向高遍历,注意这里visited是引用,即可以改变传入的pacific和atlantic的值 + void dfs(vector>& heights, vector>& visited, int x, int y) { + if (visited[x][y]) return; + visited[x][y] = true; + for (int i = 0; i < 4; i++) { // 向四个方向遍历 + int nextx = x + dir[i][0]; + int nexty = y + dir[i][1]; + // 超过边界 + if (nextx < 0 || nextx >= heights.size() || nexty < 0 || nexty >= heights[0].size()) continue; + // 高度不合适,注意这里是从低向高判断 + if (heights[x][y] > heights[nextx][nexty]) continue; + + dfs (heights, visited, nextx, nexty); + } + return; + + } + +public: + + vector> pacificAtlantic(vector>& heights) { + vector> result; + int n = heights.size(); + int m = heights[0].size(); // 这里不用担心空指针,题目要求说了长宽都大于1 + + // 记录从太平洋边出发,可以遍历的节点 + vector> pacific = vector>(n, vector(m, false)); + + // 记录从大西洋出发,可以遍历的节点 + vector> atlantic = vector>(n, vector(m, false)); + + // 从最上最下行的节点出发,向高处遍历 + for (int i = 0; i < n; i++) { + dfs (heights, pacific, i, 0); // 遍历最上行,接触太平洋 + dfs (heights, atlantic, i, m - 1); // 遍历最下行,接触大西洋 + } + + // 从最左最右列的节点出发,向高处遍历 + for (int j = 0; j < m; j++) { + dfs (heights, pacific, 0, j); // 遍历最左列,接触太平洋 + dfs (heights, atlantic, n - 1, j); // 遍历最右列,接触大西洋 + } + for (int i = 0; i < n; i++) { + for (int j = 0; j < m; j++) { + // 如果这个节点,从太平洋和大西洋出发都遍历过,就是结果 + if (pacific[i][j] && atlantic[i][j]) result.push_back({i, j}); + } + } + return result; + } +}; + +``` + +时间复杂度分析, 关于dfs函数搜索的过程 时间复杂度是 O(n * m),这个大家比较容易想。 + +关键看主函数,那么每次dfs的时候,上面还是有for循环的。 + +第一个for循环,时间复杂度是:n * (n * m) 。 + +第二个for循环,时间复杂度是:m * (n * m)。 + +所以本题看起来 时间复杂度好像是 : n * (n * m) + m * (n * m) = (m * n) * (m + n) 。 + +其实这是一个误区,大家再自己看 dfs函数的实现,其实 有visited函数记录 走过的节点,而走过的节点是不会再走第二次的。 + +所以 调用dfs函数,**只要参数传入的是 数组pacific,那么地图中 每一个节点其实就遍历一次,无论你调用多少次**。 + +同理,调用 dfs函数,只要 参数传入的是 数组atlantic,地图中每个节点也只会遍历一次。 + +所以,以下这段代码的时间复杂度是 2 * n * m。 地图用每个节点就遍历了两次,参数传入pacific的时候遍历一次,参数传入atlantic的时候遍历一次。 +```CPP +// 从最上最下行的节点出发,向高处遍历 +for (int i = 0; i < n; i++) { + dfs (heights, pacific, i, 0); // 遍历最上行,接触太平洋 + dfs (heights, atlantic, i, m - 1); // 遍历最下行,接触大西洋 +} + +// 从最左最右列的节点出发,向高处遍历 +for (int j = 0; j < m; j++) { + dfs (heights, pacific, 0, j); // 遍历最左列,接触太平洋 + dfs (heights, atlantic, n - 1, j); // 遍历最右列,接触大西洋 +} +``` + +那么本题整体的时间复杂度其实是: 2 * n * m + n * m ,所以最终时间复杂度为 O(n * m) 。 + +空间复杂度为:O(n * m) 这个就不难理解了。开了几个 n * m 的数组。 + diff --git "a/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" "b/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" index b735c106a8..45f27a1c8d 100644 --- "a/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" +++ "b/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" @@ -37,6 +37,8 @@ # 思路 +本题视频讲解:[学透哈希表,map使用有技巧!LeetCode:454.四数相加II](https://www.bilibili.com/video/BV1Md4y1Q7Yh),结合视频在看本题解,事半功倍。 + 本题咋眼一看好像和[0015.三数之和](https://programmercarl.com/0015.三数之和.html),[0018.四数之和](https://programmercarl.com/0018.四数之和.html)差不多,其实差很多。 **本题是使用哈希法的经典题目,而[0015.三数之和](https://programmercarl.com/0015.三数之和.html),[0018.四数之和](https://programmercarl.com/0018.四数之和.html)并不合适使用哈希法**,因为三数之和和四数之和这两道题目使用哈希法在不超时的情况下做到对结果去重是很困难的,很有多细节需要处理。 From 8865ed851aeb14a7e768c9fa5d7ef0c2a110c56f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=A1=9C=E5=B0=8F=E8=B7=AF=E4=B8=83=E8=91=89?= <20304773@qq.com> Date: Fri, 22 Jul 2022 15:36:23 +0800 Subject: [PATCH 0943/3019] =?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 --- ...\261\350\204\211\346\225\260\347\273\204.md" | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git "a/problems/0941.\346\234\211\346\225\210\347\232\204\345\261\261\350\204\211\346\225\260\347\273\204.md" "b/problems/0941.\346\234\211\346\225\210\347\232\204\345\261\261\350\204\211\346\225\260\347\273\204.md" index 310dd35a1c..fb7935a8c3 100644 --- "a/problems/0941.\346\234\211\346\225\210\347\232\204\345\261\261\350\204\211\346\225\260\347\273\204.md" +++ "b/problems/0941.\346\234\211\346\225\210\347\232\204\345\261\261\350\204\211\346\225\260\347\273\204.md" @@ -177,7 +177,24 @@ function validMountainArray(arr: number[]): boolean { }; ``` +## C# +```csharp +public class Solution { + public bool ValidMountainArray(int[] arr) { + if (arr.Length < 3) return false; + + int left = 0; + int right = arr.Length - 1; + + while (left + 1< arr.Length && arr[left] < arr[left + 1]) left ++; + while (right > 0 && arr[right] < arr[right - 1]) right --; + if (left == right && left != 0 && right != arr.Length - 1) return true; + + return false; + } +} +``` ----------------------- From f5b44d5f8c8ed2136a396a104b4f62884319eede Mon Sep 17 00:00:00 2001 From: Luo <82520819+Jerry-306@users.noreply.github.com> Date: Sat, 23 Jul 2022 13:06:47 +0800 Subject: [PATCH 0944/3019] =?UTF-8?q?js=20=E4=BB=A3=E7=A0=81=E6=97=A0?= =?UTF-8?q?=E9=AB=98=E4=BA=AE=E6=8F=90=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\217\246\344\270\200\347\247\215\345\206\231\346\263\225.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/\345\233\236\346\272\257\347\256\227\346\263\225\345\216\273\351\207\215\351\227\256\351\242\230\347\232\204\345\217\246\344\270\200\347\247\215\345\206\231\346\263\225.md" "b/problems/\345\233\236\346\272\257\347\256\227\346\263\225\345\216\273\351\207\215\351\227\256\351\242\230\347\232\204\345\217\246\344\270\200\347\247\215\345\206\231\346\263\225.md" index cbfe046a08..c7bf24bc4a 100644 --- "a/problems/\345\233\236\346\272\257\347\256\227\346\263\225\345\216\273\351\207\215\351\227\256\351\242\230\347\232\204\345\217\246\344\270\200\347\247\215\345\206\231\346\263\225.md" +++ "b/problems/\345\233\236\346\272\257\347\256\227\346\263\225\345\216\273\351\207\215\351\227\256\351\242\230\347\232\204\345\217\246\344\270\200\347\247\215\345\206\231\346\263\225.md" @@ -418,7 +418,7 @@ function combinationSum2(candidates, target) { **47. 全排列 II** -```javaescript +```javascript function permuteUnique(nums) { const resArr = []; const usedArr = []; From b193edc5a8f8489352dfe61fcb8d73ba1c29dd54 Mon Sep 17 00:00:00 2001 From: cezarbbb <105843128+cezarbbb@users.noreply.github.com> Date: Sat, 23 Jul 2022 20:55:18 +0800 Subject: [PATCH 0945/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200332.=E9=87=8D?= =?UTF-8?q?=E6=96=B0=E5=AE=89=E6=8E=92=E8=A1=8C=E7=A8=8B=20Rust=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加 0332.重新安排行程 Rust版本 --- ...11\346\216\222\350\241\214\347\250\213.md" | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git "a/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" "b/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" index 71942c799d..8b5f797d38 100644 --- "a/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" +++ "b/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" @@ -742,5 +742,33 @@ func (p ticketSlice) Swap(i, j int) { p[i], p[j] = p[j], p[i] } ``` +### Rust +** 文中的Hashmap嵌套Hashmap的方法因为Rust的所有权问题暂时无法实现,此方法为删除哈希表中元素法 ** +```Rust +use std::collections::HashMap; +impl Solution { + fn backtracking(airport: String, targets: &mut HashMap<&String, Vec<&String>>, result: &mut Vec) { + while let Some(next_airport) = targets.get_mut(&airport).unwrap_or(&mut vec![]).pop() { + Self::backtracking(next_airport.clone(), targets, result); + } + result.push(airport.clone()); + } + + pub fn find_itinerary(tickets: Vec>) -> Vec { + let mut targets: HashMap<&String, Vec<&String>> = HashMap::new(); + let mut result = Vec::new(); + for t in 0..tickets.len() { + targets.entry(&tickets[t][0]).or_default().push(&tickets[t][1]); + } + for (_, target) in targets.iter_mut() { + target.sort_by(|a, b| b.cmp(a)); + } + Self::backtracking("JFK".to_string(), &mut targets, &mut result); + result.reverse(); + result + } +} +``` + -----------------------
From 8e65f2e02497f7b78b2df85bc8de5788bec840e4 Mon Sep 17 00:00:00 2001 From: cezarbbb <105843128+cezarbbb@users.noreply.github.com> Date: Sun, 24 Jul 2022 22:13:45 +0800 Subject: [PATCH 0946/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200051.N=E7=9A=87?= =?UTF-8?q?=E5=90=8E=20Rust=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加 0051.N皇后 Rust版本 --- "problems/0051.N\347\232\207\345\220\216.md" | 50 ++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git "a/problems/0051.N\347\232\207\345\220\216.md" "b/problems/0051.N\347\232\207\345\220\216.md" index 9ae1f975d7..77a2ca5926 100644 --- "a/problems/0051.N\347\232\207\345\220\216.md" +++ "b/problems/0051.N\347\232\207\345\220\216.md" @@ -558,6 +558,56 @@ func solveNQueens(_ n: Int) -> [[String]] { } ``` +### Rust + +```Rust +impl Solution { + fn is_valid(row: usize, col: usize, chessboard: &mut Vec>, n: usize) -> bool { + let mut i = 0 as usize; + while i < row { + if chessboard[i][col] == 'Q' { return false; } + i += 1; + } + let (mut i, mut j) = (row as i32 - 1, col as i32 - 1); + while i >= 0 && j >= 0 { + if chessboard[i as usize][j as usize] == 'Q' { return false; } + i -= 1; + j -= 1; + } + let (mut i, mut j) = (row as i32 - 1, col as i32 + 1); + while i >= 0 && j < n as i32 { + if chessboard[i as usize][j as usize] == 'Q' { return false; } + i -= 1; + j += 1; + } + return true; + } + fn backtracking(result: &mut Vec>, n: usize, row: usize, chessboard: &mut Vec>) { + if row == n { + let mut chessboard_clone: Vec = Vec::new(); + for i in chessboard { + chessboard_clone.push(i.iter().collect::()); + } + result.push(chessboard_clone); + return; + } + for col in 0..n { + if Self::is_valid(row, col, chessboard, n) { + chessboard[row][col] = 'Q'; + Self::backtracking(result, n, row + 1, chessboard); + chessboard[row][col] = '.'; + } + } + } + pub fn solve_n_queens(n: i32) -> Vec> { + let mut result: Vec> = Vec::new(); + let mut chessboard: Vec> = vec![vec!['.'; n as usize]; n as usize]; + Self::backtracking(&mut result, n as usize, 0, &mut chessboard); + result + } +} +``` + ### C ```c char ***ans; From fd099c827574310dc9c7f8cf21578bd68d822b98 Mon Sep 17 00:00:00 2001 From: cezarbbb <105843128+cezarbbb@users.noreply.github.com> Date: Mon, 25 Jul 2022 20:05:22 +0800 Subject: [PATCH 0947/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200037.=E8=A7=A3?= =?UTF-8?q?=E6=95=B0=E7=8B=AC=20Rust=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加 0037.解数独 Rust版本 --- ...7.\350\247\243\346\225\260\347\213\254.md" | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git "a/problems/0037.\350\247\243\346\225\260\347\213\254.md" "b/problems/0037.\350\247\243\346\225\260\347\213\254.md" index 626e9d9740..8b1968902f 100644 --- "a/problems/0037.\350\247\243\346\225\260\347\213\254.md" +++ "b/problems/0037.\350\247\243\346\225\260\347\213\254.md" @@ -488,6 +488,52 @@ function solveSudoku(board: string[][]): void { }; ``` +### Rust + +```Rust +impl Solution { + fn is_valid(row: usize, col: usize, val: char, board: &mut Vec>) -> bool{ + for i in 0..9 { + if board[row][i] == val { return false; } + } + for j in 0..9 { + if board[j][col] == val { + return false; + } + } + let start_row = (row / 3) * 3; + let start_col = (col / 3) * 3; + for i in start_row..(start_row + 3) { + for j in start_col..(start_col + 3) { + if board[i][j] == val { return false; } + } + } + return true; + } + + fn backtracking(board: &mut Vec>) -> bool{ + for i in 0..board.len() { + for j in 0..board[0].len() { + if board[i][j] != '.' { continue; } + for k in '1'..='9' { + if Self::is_valid(i, j, k, board) { + board[i][j] = k; + if Self::backtracking(board) { return true; } + board[i][j] = '.'; + } + } + return false; + } + } + return true; + } + + pub fn solve_sudoku(board: &mut Vec>) { + Self::backtracking(board); + } +} +``` + ### C ```C From fdf0185e1d53e8cda56a6cb040da5b6218fbb3c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E5=91=98Carl?= Date: Tue, 26 Jul 2022 09:17:40 +0800 Subject: [PATCH 0948/3019] =?UTF-8?q?Update=200541.=E5=8F=8D=E8=BD=AC?= =?UTF-8?q?=E5=AD=97=E7=AC=A6=E4=B8=B2II.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\345\255\227\347\254\246\344\270\262II.md" | 34 ++++++++++--------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git "a/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" "b/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" index d9b9466cd0..8c654a17b9 100644 --- "a/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" +++ "b/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" @@ -64,22 +64,7 @@ public: ``` -``` -class Solution { -public: - string reverseStr(string s, int k) { - int n=s.size(),pos=0; - while(pos Date: Tue, 26 Jul 2022 10:35:31 +0800 Subject: [PATCH 0949/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200122.=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=BAII=20Rust=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加 0122.买卖股票的最佳时机II Rust版本(贪心+动态规划) --- ...\344\275\263\346\227\266\346\234\272II.md" | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" index e4742cf0e6..1094d9e4b2 100644 --- "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" +++ "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" @@ -282,6 +282,43 @@ function maxProfit(prices: number[]): number { }; ``` +### Rust + +贪心: +```Rust +impl Solution { + fn max(a: i32, b: i32) -> i32 { + if a > b { a } else { b } + } + pub fn max_profit(prices: Vec) -> i32 { + let mut result = 0; + for i in 1..prices.len() { + result += Self::max(prices[i] - prices[i - 1], 0); + } + result + } +} +``` + +动态规划: +```Rust +impl Solution { + fn max(a: i32, b: i32) -> i32 { + if a > b { a } else { b } + } + pub fn max_profit(prices: Vec) -> i32 { + let n = prices.len(); + let mut dp = vec![vec![0; 2]; n]; + dp[0][0] -= prices[0]; + for i in 1..n { + dp[i][0] = Self::max(dp[i - 1][0], dp[i - 1][1] - prices[i]); + dp[i][1] = Self::max(dp[i - 1][1], dp[i - 1][0] + prices[i]); + } + Self::max(dp[n - 1][0], dp[n - 1][1]) + } +} +``` + ### C: 贪心: ```c From fdfddd88f99400442d5bc815df0adea96cb8589a Mon Sep 17 00:00:00 2001 From: firemaples Date: Tue, 26 Jul 2022 22:37:40 +0800 Subject: [PATCH 0950/3019] =?UTF-8?q?Update=200452.=E7=94=A8=E6=9C=80?= =?UTF-8?q?=E5=B0=91=E6=95=B0=E9=87=8F=E7=9A=84=E7=AE=AD=E5=BC=95=E7=88=86?= =?UTF-8?q?=E6=B0=94=E7=90=83.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add a missing line back --- ...7\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" | 1 + 1 file changed, 1 insertion(+) diff --git "a/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" "b/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" index 3042b0636b..6e092f7c4b 100644 --- "a/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" +++ "b/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" @@ -150,6 +150,7 @@ class Solution { int count = 1; //重叠气球的最小右边界 int leftmostRightBound = points[0][1]; + for (int i = 1; i < points.length; i++) { //如果下一个气球的左边界大于最小右边界 if (points[i][0] > leftmostRightBound ) { //增加一次射击 From 5ea4ec6829730a2cba0c8fec7009e0c3b82d238c Mon Sep 17 00:00:00 2001 From: cezarbbb <105843128+cezarbbb@users.noreply.github.com> Date: Wed, 27 Jul 2022 16:20:17 +0800 Subject: [PATCH 0951/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200055.=E8=B7=B3?= =?UTF-8?q?=E8=B7=83=E6=B8=B8=E6=88=8F=20Rust=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加 0055.跳跃游戏 Rust版本 --- ...63\350\267\203\346\270\270\346\210\217.md" | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git "a/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" "b/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" index e7c4f5a290..394117eed4 100644 --- "a/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" +++ "b/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" @@ -154,6 +154,26 @@ var canJump = function(nums) { }; ``` +### Rust + +```Rust +impl Solution { + fn max(a: usize, b: usize) -> usize { + if a > b { a } else { b } + } + pub fn can_jump(nums: Vec) -> bool { + let mut cover = 0; + if (nums.len() == 1) { return true; } + let mut i = 0; + while i <= cover { + cover = Self::max(i + nums[i] as usize, cover); + if cover >= nums.len() - 1 { return true; } + i += 1; + } + false + } +} +``` ### C ```c From d7df0cbb0e7153e170f9d5c7a96bfda9052f1dc7 Mon Sep 17 00:00:00 2001 From: chaoswang <73639170+chaos0156@users.noreply.github.com> Date: Thu, 28 Jul 2022 11:34:36 +0800 Subject: [PATCH 0952/3019] =?UTF-8?q?Update=20=E5=89=91=E6=8C=87Offer58-II?= =?UTF-8?q?.=E5=B7=A6=E6=97=8B=E8=BD=AC=E5=AD=97=E7=AC=A6=E4=B8=B2.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...213\350\275\254\345\255\227\347\254\246\344\270\262.md" | 7 +++++++ 1 file changed, 7 insertions(+) diff --git "a/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" "b/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" index de4a903000..bf5d3f901c 100644 --- "a/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" @@ -263,6 +263,13 @@ function reverseLeftWords(s: string, n: number): string { return strArr.join(''); }; ``` +方法二: +```typescript +// 拼接两个字符串,截取符合要求的部分 +function reverseLeftWords(s: string, n: number): string { + return (s+s).slice(n,s.length+n); +}; +``` Swift: From ae39e59255a56e8ba4285a0b5b843716c28d1317 Mon Sep 17 00:00:00 2001 From: cezarbbb <105843128+cezarbbb@users.noreply.github.com> Date: Thu, 28 Jul 2022 17:45:30 +0800 Subject: [PATCH 0953/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200045.=E8=B7=B3?= =?UTF-8?q?=E8=B7=83=E6=B8=B8=E6=88=8FII=20Rust=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加 0045.跳跃游戏II Rust版本 --- ...\350\267\203\346\270\270\346\210\217II.md" | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git "a/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" "b/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" index 648355fdd8..13142c9936 100644 --- "a/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" +++ "b/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" @@ -305,6 +305,56 @@ object Solution { } ``` +### Rust + +```Rust +//版本一 +impl Solution { + fn max(a: i32, b:i32) -> i32 { + if a > b { a } else { b } + } + pub fn jump(nums: Vec) -> i32 { + if nums.len() == 0 { return 0; } + let mut cur_distance: i32 = 0; + let mut ans: i32 = 0; + let mut next_distance: i32 = 0; + for i in 0..nums.len() { + next_distance = Self::max(nums[i] + i as i32, next_distance); + if i as i32 == cur_distance { + if cur_distance != (nums.len() - 1) as i32 { + ans += 1; + cur_distance = next_distance; + if next_distance == (nums.len() - 1) as i32 { break; } + } + else { break; } + } + } + ans + } +} +``` + +```Rust +//版本二 +impl Solution { + fn max(a: i32, b:i32) -> i32 { + if a > b { a } else { b } + } + pub fn jump(nums: Vec) -> i32 { + let mut cur_distance: i32 = 0; + let mut ans: i32 = 0; + let mut next_distance: i32 = 0; + for i in 0..nums.len() - 1 { + next_distance = Self::max(nums[i] + i as i32, next_distance); + if i as i32 == cur_distance { + cur_distance = next_distance; + ans += 1; + } + } + ans + } +} +``` ----------------------- From 28aef25b6122b2f676546276ab51d1fccf82cbcf Mon Sep 17 00:00:00 2001 From: Caesar-Wei <65577839+Caesar-Wei@users.noreply.github.com> Date: Thu, 28 Jul 2022 22:55:05 -0400 Subject: [PATCH 0954/3019] =?UTF-8?q?Update=200031.=E4=B8=8B=E4=B8=80?= =?UTF-8?q?=E4=B8=AA=E6=8E=92=E5=88=97.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit fixed bug in python solution and display issues --- ...200\344\270\252\346\216\222\345\210\227.md" | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git "a/problems/0031.\344\270\213\344\270\200\344\270\252\346\216\222\345\210\227.md" "b/problems/0031.\344\270\213\344\270\200\344\270\252\346\216\222\345\210\227.md" index 1a3641b037..4f49ce747f 100644 --- "a/problems/0031.\344\270\213\344\270\200\344\270\252\346\216\222\345\210\227.md" +++ "b/problems/0031.\344\270\213\344\270\200\344\270\252\346\216\222\345\210\227.md" @@ -136,10 +136,10 @@ class Solution: >另一种思路 ```python class Solution: - ''' - 抛砖引玉:因题目要求“必须原地修改,只允许使用额外常数空间”,python内置sorted函数以及数组切片+sort()无法使用。 - 故选择另一种算法暂且提供一种python思路 - ''' + ''' + 抛砖引玉:因题目要求“必须原地修改,只允许使用额外常数空间”,python内置sorted函数以及数组切片+sort()无法使用。 + 故选择另一种算法暂且提供一种python思路 + ''' def nextPermutation(self, nums: List[int]) -> None: """ Do not return anything, modify nums in-place instead. @@ -153,9 +153,9 @@ class Solution: break self.reverse(nums, i, length-1) break - else: - # 若正常结束循环,则对原数组直接翻转 - self.reverse(nums, 0, length-1) + if n == 1: + # 若正常结束循环,则对原数组直接翻转 + self.reverse(nums, 0, length-1) def reverse(self, nums: List[int], low: int, high: int) -> None: while low < high: @@ -164,7 +164,7 @@ class Solution: high -= 1 ``` >上一版本简化版 -'''python +```python class Solution(object): def nextPermutation(self, nums: List[int]) -> None: n = len(nums) @@ -185,7 +185,7 @@ class Solution(object): end -= 1 return nums -''' +``` ## Go From 50d497a834658168e616c7611438b622bdf58fad Mon Sep 17 00:00:00 2001 From: cezarbbb <105843128+cezarbbb@users.noreply.github.com> Date: Fri, 29 Jul 2022 18:49:28 +0800 Subject: [PATCH 0955/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=201005.K=E6=AC=A1?= =?UTF-8?q?=E5=8F=96=E5=8F=8D=E5=90=8E=E6=9C=80=E5=A4=A7=E5=8C=96=E7=9A=84?= =?UTF-8?q?=E6=95=B0=E7=BB=84=E5=92=8C=20Rust=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加 1005.K次取反后最大化的数组和 Rust版本 --- ...04\346\225\260\347\273\204\345\222\214.md" | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git "a/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" "b/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" index 8d721b9fe4..9d82bf9fd3 100644 --- "a/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" +++ "b/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" @@ -227,6 +227,31 @@ var largestSumAfterKNegations = function(nums, k) { }; ``` +### Rust + +```Rust +impl Solution { + pub fn largest_sum_after_k_negations(nums: Vec, k: i32) -> i32 { + let mut nums = nums; + let mut k = k; + let len = nums.len(); + nums.sort_by(|a, b| b.abs().cmp(&a.abs())); + for i in 0..len { + if nums[i] < 0 && k > 0 { + nums[i] *= -1; + k -= 1; + } + } + if k % 2 == 1 { nums[len - 1] *= -1; } + let mut result = 0; + for num in nums { + result += num; + } + result + } +} +``` + ### C ```c From 056f816448e840404e34409a3e5285ad1225689a Mon Sep 17 00:00:00 2001 From: wangtao Date: Sat, 30 Jul 2022 09:45:38 +0800 Subject: [PATCH 0956/3019] =?UTF-8?q?0452.=E7=94=A8=E6=9C=80=E5=B0=91?= =?UTF-8?q?=E6=95=B0=E9=87=8F=E7=9A=84=E7=AE=AD=E5=BC=95=E7=88=86=E6=B0=94?= =?UTF-8?q?=E7=90=83=20Java=E4=BB=A3=E7=A0=81=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...7\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" | 1 + 1 file changed, 1 insertion(+) diff --git "a/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" "b/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" index 3042b0636b..7b5f387d6a 100644 --- "a/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" +++ "b/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" @@ -151,6 +151,7 @@ class Solution { //重叠气球的最小右边界 int leftmostRightBound = points[0][1]; //如果下一个气球的左边界大于最小右边界 + for(int i = 1; i < points.length; i++){ if (points[i][0] > leftmostRightBound ) { //增加一次射击 count++; From c9621173c3ee7fb323d00125656de3dce9bcdf3c Mon Sep 17 00:00:00 2001 From: cezarbbb <105843128+cezarbbb@users.noreply.github.com> Date: Sat, 30 Jul 2022 14:53:49 +0800 Subject: [PATCH 0957/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200134.=E5=8A=A0?= =?UTF-8?q?=E6=B2=B9=E7=AB=99=20Rust=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加 0134.加油站 Rust版本 --- ...4.\345\212\240\346\262\271\347\253\231.md" | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git "a/problems/0134.\345\212\240\346\262\271\347\253\231.md" "b/problems/0134.\345\212\240\346\262\271\347\253\231.md" index e5d50a9b5f..55064ce4ef 100644 --- "a/problems/0134.\345\212\240\346\262\271\347\253\231.md" +++ "b/problems/0134.\345\212\240\346\262\271\347\253\231.md" @@ -406,6 +406,55 @@ function canCompleteCircuit(gas: number[], cost: number[]): number { }; ``` +### Rust + +贪心算法:方法一 + +```Rust +impl Solution { + pub fn can_complete_circuit(gas: Vec, cost: Vec) -> i32 { + let mut cur_sum = 0; + let mut min = i32::MAX; + for i in 0..gas.len() { + let rest = gas[i] - cost[i]; + cur_sum += rest; + if cur_sum < min { min = cur_sum; } + } + if cur_sum < 0 { return -1; } + if min > 0 { return 0; } + for i in (0..gas.len()).rev() { + let rest = gas[i] - cost[i]; + min += rest; + if min >= 0 { return i as i32; } + } + -1 + } +} +``` + +贪心算法:方法二 + +```Rust +impl Solution { + pub fn can_complete_circuit(gas: Vec, cost: Vec) -> i32 { + let mut cur_sum = 0; + let mut total_sum = 0; + let mut start = 0; + for i in 0..gas.len() { + cur_sum += gas[i] - cost[i]; + total_sum += gas[i] - cost[i]; + if cur_sum < 0 { + start = i + 1; + cur_sum = 0; + } + } + if total_sum < 0 { return -1; } + start as i32 + } +} +``` + + ### C 贪心算法:方法一 From b6b57d8368a0912ceead4a4954bd1dd893d4bb2a Mon Sep 17 00:00:00 2001 From: cezarbbb <105843128+cezarbbb@users.noreply.github.com> Date: Sun, 31 Jul 2022 14:44:54 +0800 Subject: [PATCH 0958/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200860.=E6=9F=A0?= =?UTF-8?q?=E6=AA=AC=E6=B0=B4=E6=89=BE=E9=9B=B6=20Rust=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加 0860.柠檬水找零 Rust版本 --- ...54\346\260\264\346\211\276\351\233\266.md" | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git "a/problems/0860.\346\237\240\346\252\254\346\260\264\346\211\276\351\233\266.md" "b/problems/0860.\346\237\240\346\252\254\346\260\264\346\211\276\351\233\266.md" index 42e8b19a2e..16b89ff70d 100644 --- "a/problems/0860.\346\237\240\346\252\254\346\260\264\346\211\276\351\233\266.md" +++ "b/problems/0860.\346\237\240\346\252\254\346\260\264\346\211\276\351\233\266.md" @@ -251,6 +251,38 @@ var lemonadeChange = function(bills) { }; ``` + +### Rust + +```Rust +impl Solution { + pub fn lemonade_change(bills: Vec) -> bool { + let mut five = 0; + let mut ten = 0; + // let mut twenty = 0; + for bill in bills { + if bill == 5 { five += 1; } + if bill == 10 { + if five <= 0 { return false; } + ten += 1; + five -= 1; + } + if bill == 20 { + if five > 0 && ten > 0 { + five -= 1; + ten -= 1; + // twenty += 1; + } else if five >= 3 { + five -= 3; + // twenty += 1; + } else { return false; } + } + } + true + } +} +``` + ### C ```c bool lemonadeChange(int* bills, int billsSize){ From 9343ddd30cb63ad51db6f023c581f31b1f3f9d9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E5=91=98Carl?= Date: Mon, 1 Aug 2022 10:50:27 +0800 Subject: [PATCH 0959/3019] =?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.\347\233\256\346\240\207\345\222\214.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0494.\347\233\256\346\240\207\345\222\214.md" "b/problems/0494.\347\233\256\346\240\207\345\222\214.md" index 00e4bdfa4a..cb1b9bd10b 100644 --- "a/problems/0494.\347\233\256\346\240\207\345\222\214.md" +++ "b/problems/0494.\347\233\256\346\240\207\345\222\214.md" @@ -158,7 +158,7 @@ dp[j] 表示:填满j(包括j)这么大容积的包,有dp[j]种方法 不考虑nums[i]的情况下,填满容量为j的背包,有dp[j]种方法。 -那么只要搞到nums[i]的话,凑成dp[j]就有dp[j - nums[i]] 种方法。 +那么考虑nums[i]的话(只要搞到nums[i]),凑成dp[j]就有dp[j - nums[i]] 种方法。 例如:dp[j],j 为5, From 1bfd42e702b997caf5563b1823be4067cd6ad0a6 Mon Sep 17 00:00:00 2001 From: Invalided <39646604+Invalided@users.noreply.github.com> Date: Mon, 1 Aug 2022 12:31:24 +0800 Subject: [PATCH 0960/3019] =?UTF-8?q?Update=200031.=E4=B8=8B=E4=B8=80?= =?UTF-8?q?=E4=B8=AA=E6=8E=92=E5=88=97.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加 0031.下一个排列Java版本的优化代码,时间复杂度为O(N),空间复杂度O(1) --- ...00\344\270\252\346\216\222\345\210\227.md" | 46 ++++++++++++++++++- 1 file changed, 44 insertions(+), 2 deletions(-) diff --git "a/problems/0031.\344\270\213\344\270\200\344\270\252\346\216\222\345\210\227.md" "b/problems/0031.\344\270\213\344\270\200\344\270\252\346\216\222\345\210\227.md" index 1a3641b037..ada9debac6 100644 --- "a/problems/0031.\344\270\213\344\270\200\344\270\252\346\216\222\345\210\227.md" +++ "b/problems/0031.\344\270\213\344\270\200\344\270\252\346\216\222\345\210\227.md" @@ -116,6 +116,48 @@ class Solution { } } ``` +> 优化时间复杂度为O(N),空间复杂度为O(1) +```Java +class Solution { + public void nextPermutation(int[] nums) { + // 1.从后向前获取逆序区域的前一位 + int index = findIndex(nums); + // 判断数组是否处于最小组合状态 + if(index != 0){ + // 2.交换逆序区域刚好大于它的最小数字 + exchange(nums,index); + } + // 3.把原来的逆序区转为顺序 + reverse(nums,index); + } + + public static int findIndex(int [] nums){ + for(int i = nums.length-1;i>0;i--){ + if(nums[i]>nums[i-1]){ + return i; + } + } + return 0; + } + public static void exchange(int [] nums, int index){ + int head = nums[index-1]; + for(int i = nums.length-1;i>0;i--){ + if(head < nums[i]){ + nums[index-1] = nums[i]; + nums[i] = head; + break; + } + } + } + public static void reverse(int [] nums, int index){ + for(int i = index,j = nums.length-1;i直接使用sorted()不符合题意 @@ -164,7 +206,7 @@ class Solution: high -= 1 ``` >上一版本简化版 -'''python +```python class Solution(object): def nextPermutation(self, nums: List[int]) -> None: n = len(nums) @@ -185,7 +227,7 @@ class Solution(object): end -= 1 return nums -''' +``` ## Go From 9557fa8374fca37b7472309e0a3d8e0334198ff0 Mon Sep 17 00:00:00 2001 From: cezarbbb <105843128+cezarbbb@users.noreply.github.com> Date: Mon, 1 Aug 2022 15:20:27 +0800 Subject: [PATCH 0961/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200406.=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?=20Rust=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加 0406.根据身高重建队列 Rust版本 --- ...15\345\273\272\351\230\237\345\210\227.md" | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git "a/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" "b/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" index 827b748172..75e0c40c22 100644 --- "a/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" +++ "b/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" @@ -290,6 +290,26 @@ var reconstructQueue = function(people) { }; ``` +### Rust + +```Rust +impl Solution { + pub fn reconstruct_queue(people: Vec>) -> Vec> { + let mut people = people; + people.sort_by(|a, b| { + if a[0] == b[0] { return a[1].cmp(&b[1]); } + b[0].cmp(&a[0]) + }); + let mut que: Vec> = Vec::new(); + que.push(people[0].clone()); + for i in 1..people.len() { + let position = people[i][1]; + que.insert(position as usize, people[i].clone()); + } + que + } +} +``` ### C ```c From cb01b142fb04123a4debfbe8a2e1950fb13b3479 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E5=91=98Carl?= Date: Tue, 2 Aug 2022 09:34:28 +0800 Subject: [PATCH 0962/3019] Delete .gitignore --- .idea/.gitignore | 8 -------- 1 file changed, 8 deletions(-) delete mode 100644 .idea/.gitignore diff --git a/.idea/.gitignore b/.idea/.gitignore deleted file mode 100644 index 35410cacdc..0000000000 --- a/.idea/.gitignore +++ /dev/null @@ -1,8 +0,0 @@ -# 默认忽略的文件 -/shelf/ -/workspace.xml -# 基于编辑器的 HTTP 客户端请求 -/httpRequests/ -# Datasource local storage ignored files -/dataSources/ -/dataSources.local.xml From 5d690afae6e501fcdf0385f23bb81ddc633c4bb4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E5=91=98Carl?= Date: Tue, 2 Aug 2022 09:34:34 +0800 Subject: [PATCH 0963/3019] Delete encodings.xml --- .idea/encodings.xml | 6 ------ 1 file changed, 6 deletions(-) delete mode 100644 .idea/encodings.xml diff --git a/.idea/encodings.xml b/.idea/encodings.xml deleted file mode 100644 index c2bae49d78..0000000000 --- a/.idea/encodings.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file From 52c395702c37d28f459c0076279ef0e34bad6f0d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E5=91=98Carl?= Date: Tue, 2 Aug 2022 09:34:41 +0800 Subject: [PATCH 0964/3019] Delete profiles_settings.xml --- .idea/inspectionProfiles/profiles_settings.xml | 6 ------ 1 file changed, 6 deletions(-) delete mode 100644 .idea/inspectionProfiles/profiles_settings.xml diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml deleted file mode 100644 index 105ce2da2d..0000000000 --- a/.idea/inspectionProfiles/profiles_settings.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - \ No newline at end of file From 0f042a29cc62efe0cbdb4c69f717e1800f72e561 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E5=91=98Carl?= Date: Tue, 2 Aug 2022 09:34:47 +0800 Subject: [PATCH 0965/3019] Delete modules.xml --- .idea/modules.xml | 8 -------- 1 file changed, 8 deletions(-) delete mode 100644 .idea/modules.xml diff --git a/.idea/modules.xml b/.idea/modules.xml deleted file mode 100644 index 7c250acde5..0000000000 --- a/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file From 8b10e7473188a6dd5922566239049364cfa8a1be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E5=91=98Carl?= Date: Tue, 2 Aug 2022 09:35:00 +0800 Subject: [PATCH 0966/3019] Delete vagrant.xml --- .idea/vagrant.xml | 7 ------- 1 file changed, 7 deletions(-) delete mode 100644 .idea/vagrant.xml diff --git a/.idea/vagrant.xml b/.idea/vagrant.xml deleted file mode 100644 index a5aa786803..0000000000 --- a/.idea/vagrant.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - \ No newline at end of file From ea9f7c61392b8902aa3844ffcfdf4b360c5f609a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E5=91=98Carl?= Date: Tue, 2 Aug 2022 09:35:07 +0800 Subject: [PATCH 0967/3019] Delete vcs.xml --- .idea/vcs.xml | 6 ------ 1 file changed, 6 deletions(-) delete mode 100644 .idea/vcs.xml diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 94a25f7f4c..0000000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file From 227f8ee98d4b3ad5a713488bdd4435d2e784c154 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E5=91=98Carl?= Date: Tue, 2 Aug 2022 09:35:20 +0800 Subject: [PATCH 0968/3019] Delete Project_Default.xml --- .idea/inspectionProfiles/Project_Default.xml | 70 -------------------- 1 file changed, 70 deletions(-) delete mode 100644 .idea/inspectionProfiles/Project_Default.xml diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml deleted file mode 100644 index 3f19e2d85a..0000000000 --- a/.idea/inspectionProfiles/Project_Default.xml +++ /dev/null @@ -1,70 +0,0 @@ - - - - \ No newline at end of file From d49ca8f278f57831b9410d9a419845b199dcb395 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E5=91=98Carl?= Date: Tue, 2 Aug 2022 09:35:28 +0800 Subject: [PATCH 0969/3019] Delete leetcode-master.iml --- .idea/leetcode-master.iml | 8 -------- 1 file changed, 8 deletions(-) delete mode 100644 .idea/leetcode-master.iml diff --git a/.idea/leetcode-master.iml b/.idea/leetcode-master.iml deleted file mode 100644 index d0876a78d0..0000000000 --- a/.idea/leetcode-master.iml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file From 2a4a210b45d9ea8b67dc19e18591cb622941d7a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E5=91=98Carl?= Date: Tue, 2 Aug 2022 09:35:35 +0800 Subject: [PATCH 0970/3019] Delete misc.xml --- .idea/misc.xml | 11 ----------- 1 file changed, 11 deletions(-) delete mode 100644 .idea/misc.xml diff --git a/.idea/misc.xml b/.idea/misc.xml deleted file mode 100644 index 8ca8e3b1af..0000000000 --- a/.idea/misc.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - \ No newline at end of file From 753e5f06445deeb1a19b03c6c05ffbe6454293f8 Mon Sep 17 00:00:00 2001 From: cezarbbb <105843128+cezarbbb@users.noreply.github.com> Date: Tue, 2 Aug 2022 15:53:45 +0800 Subject: [PATCH 0971/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200435.=E6=97=A0?= =?UTF-8?q?=E9=87=8D=E5=8F=A0=E5=8C=BA=E9=97=B4=20Rust=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加 0435.无重叠区间 Rust版本 --- ...15\345\217\240\345\214\272\351\227\264.md" | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git "a/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" "b/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" index 3aa4eeb614..6f88cad490 100644 --- "a/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" +++ "b/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" @@ -374,7 +374,26 @@ object Solution { } ``` - +### Rust + +```Rust +impl Solution { + pub fn erase_overlap_intervals(intervals: Vec>) -> i32 { + if intervals.len() == 0 { return 0; } + let mut intervals = intervals; + intervals.sort_by(|a, b| a[1].cmp(&b[1])); + let mut count = 1; + let mut end = intervals[0][1]; + for i in 1..intervals.len() { + if end <= intervals[i][0] { + end = intervals[i][1]; + count += 1; + } + } + intervals.len() as i32 - count + } +} +``` ----------------------- From 342910ac0bc7af0f4a0d3ff612a3b191d9630686 Mon Sep 17 00:00:00 2001 From: wang2jun <91008685+wang2jun@users.noreply.github.com> Date: Tue, 2 Aug 2022 16:16:14 +0800 Subject: [PATCH 0972/3019] =?UTF-8?q?0100=E7=9B=B8=E5=90=8C=E7=9A=84?= =?UTF-8?q?=E6=A0=91=20=E5=A2=9E=E5=8A=A0=20js=20=E7=89=88=E9=80=92?= =?UTF-8?q?=E5=BD=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 0100相同的树 增加 js 版递归 --- ...233\270\345\220\214\347\232\204\346\240\221.md" | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git "a/problems/0100.\347\233\270\345\220\214\347\232\204\346\240\221.md" "b/problems/0100.\347\233\270\345\220\214\347\232\204\346\240\221.md" index 210418f7ef..4b6eb7aa4f 100644 --- "a/problems/0100.\347\233\270\345\220\214\347\232\204\346\240\221.md" +++ "b/problems/0100.\347\233\270\345\220\214\347\232\204\346\240\221.md" @@ -240,6 +240,20 @@ Go: JavaScript: +> 递归法 + +```javascript +var isSameTree = function (p, q) { + if (p == null && q == null) + return true; + if (p == null || q == null) + return false; + if (p.val != q.val) + return false; + return isSameTree(p.left, q.left) && isSameTree(p.right, q.right); +}; +``` + TypeScript: > 递归法-先序遍历 From ff8b3e9b9f8182b03abe39b173f2a716b839e566 Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Wed, 3 Aug 2022 15:55:08 +0800 Subject: [PATCH 0973/3019] Update --- ...11\346\225\260\344\271\213\345\222\214.md" | 2 + ...33\346\225\260\344\271\213\345\222\214.md" | 2 + ...73\351\231\244\345\205\203\347\264\240.md" | 2 +- ...\346\227\213\347\237\251\351\230\265II.md" | 2 +- ...4.\345\212\240\346\262\271\347\253\231.md" | 5 +- ...14\347\232\204\345\215\225\350\257\215.md" | 129 +++------ ...33\345\261\277\346\225\260\351\207\217.md" | 249 ++++++++++++++++++ ...76\350\241\250\345\205\203\347\264\240.md" | 2 +- ...73\350\275\254\351\223\276\350\241\250.md" | 3 +- ...04\345\255\220\346\225\260\347\273\204.md" | 8 +- ...36\347\216\260\351\230\237\345\210\227.md" | 2 +- ...54\345\255\227\347\254\246\344\270\262.md" | 2 + ...64\346\265\201\351\227\256\351\242\230.md" | 6 + ...20\345\255\227\347\254\246\344\270\262.md" | 116 ++++++-- ...\345\255\227\347\254\246\344\270\262II.md" | 2 + ...00\345\244\247\351\235\242\347\247\257.md" | 96 +++++++ ...75\347\232\204\350\267\257\345\276\204.md" | 4 + ...04\347\232\204\345\271\263\346\226\271.md" | 2 +- ...43\347\240\201\351\243\216\346\240\274.md" | 4 +- 19 files changed, 508 insertions(+), 130 deletions(-) create mode 100644 "problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.md" create mode 100644 "problems/0695.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" diff --git "a/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" "b/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" index f336be5bfd..da319866fc 100644 --- "a/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" @@ -29,6 +29,8 @@ # 思路 +针对本题,我录制了视频讲解:[梦破碎的地方!| LeetCode:15.三数之和](https://www.bilibili.com/video/BV1GW4y127qo),结合本题解一起看,事半功倍! + **注意[0, 0, 0, 0] 这组数据** ## 哈希解法 diff --git "a/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" "b/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" index 3813424ae0..d6b55fd6e1 100644 --- "a/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" @@ -29,6 +29,8 @@ # 思路 +针对本题,我录制了视频讲解:[难在去重和剪枝!| LeetCode:18. 四数之和](https://www.bilibili.com/video/BV1DS4y147US),结合本题解一起看,事半功倍! + 四数之和,和[15.三数之和](https://programmercarl.com/0015.三数之和.html)是一个思路,都是使用双指针法, 基本解法就是在[15.三数之和](https://programmercarl.com/0015.三数之和.html) 的基础上再套一层for循环。 但是有一些细节需要注意,例如: 不要判断`nums[k] > target` 就返回了,三数之和 可以通过 `nums[i] > 0` 就返回了,因为 0 已经是确定的数了,四数之和这道题目 target是任意值。比如:数组是`[-4, -3, -2, -1]`,`target`是`-10`,不能因为`-4 > -10`而跳过。但是我们依旧可以去做剪枝,逻辑变成`nums[i] > target && (nums[i] >=0 || target >= 0)`就可以了。 diff --git "a/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" "b/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" index e99fee9184..12f88c75df 100644 --- "a/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" +++ "b/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" @@ -28,7 +28,7 @@ ## 思路 -[本题B站视频讲解](https://www.bilibili.com/video/BV12A4y1Z7LP) +针对本题,我录制了视频讲解:[数组中移除元素并不容易!LeetCode:27. 移除元素](https://www.bilibili.com/video/BV12A4y1Z7LP),结合本题解一起看,事半功倍! 有的同学可能说了,多余的元素,删掉不就得了。 diff --git "a/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" "b/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" index bf0a279e25..aa3c848df6 100644 --- "a/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" +++ "b/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" @@ -24,7 +24,7 @@ ## 思路 -为了利于录友们理解,我特意录制了视频,[拿下螺旋矩阵,《代码随想录》第五题!](https://www.bilibili.com/video/BV1SL4y1N7mV),结合本篇文章一起看,效果更佳。 +为了利于录友们理解,我特意录制了视频,[拿下螺旋矩阵!LeetCode:59.螺旋矩阵II](https://www.bilibili.com/video/BV1SL4y1N7mV),结合视频一起看,事半功倍! 这道题目可以说在面试中出现频率较高的题目,**本题并不涉及到什么算法,就是模拟过程,但却十分考察对代码的掌控能力。** diff --git "a/problems/0134.\345\212\240\346\262\271\347\253\231.md" "b/problems/0134.\345\212\240\346\262\271\347\253\231.md" index e5d50a9b5f..7e4f74f07a 100644 --- "a/problems/0134.\345\212\240\346\262\271\347\253\231.md" +++ "b/problems/0134.\345\212\240\346\262\271\347\253\231.md" @@ -77,10 +77,9 @@ public: }; ``` -* 时间复杂度:$O(n^2)$ -* 空间复杂度:$O(1)$ +* 时间复杂度:O(n^2) +* 空间复杂度:O(1) -C++暴力解法在leetcode上提交也可以过。 ## 贪心算法(方法一) diff --git "a/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" "b/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" index d071946951..a848d6a3b0 100644 --- "a/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" +++ "b/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" @@ -31,8 +31,9 @@ # 思路 -**这道题目可以说是综合考察了字符串的多种操作。** +针对本题,我录制了视频讲解:[字符串复杂操作拿捏了! | LeetCode:151.翻转字符串里的单词](https://www.bilibili.com/video/BV1uT41177fX),结合本题解一起看,事半功倍! +**这道题目可以说是综合考察了字符串的多种操作。** 一些同学会使用split库函数,分隔单词,然后定义一个新的string字符串,最后再把单词倒序相加,那么这道题题目就是一道水题了,失去了它的意义。 @@ -81,17 +82,14 @@ void removeExtraSpaces(string& s) { 如果不仔细琢磨一下erase的时间复杂度,还以为以上的代码是O(n)的时间复杂度呢。 -想一下真正的时间复杂度是多少,一个erase本来就是O(n)的操作,erase实现原理题目:[数组:就移除个元素很难么?](https://programmercarl.com/0027.移除元素.html),最优的算法来移除元素也要O(n)。 +想一下真正的时间复杂度是多少,一个erase本来就是O(n)的操作。 erase操作上面还套了一个for循环,那么以上代码移除冗余空格的代码时间复杂度为O(n^2)。 那么使用双指针法来去移除空格,最后resize(重新设置)一下字符串的大小,就可以做到O(n)的时间复杂度。 -如果对这个操作比较生疏了,可以再看一下这篇文章:[数组:就移除个元素很难么?](https://programmercarl.com/0027.移除元素.html)是如何移除元素的。 - -那么使用双指针来移除冗余空格代码如下: fastIndex走的快,slowIndex走的慢,最后slowIndex就标记着移除多余空格后新字符串的长度。 - ```CPP +//版本一 void removeExtraSpaces(string& s) { int slowIndex = 0, fastIndex = 0; // 定义快指针,慢指针 // 去掉字符串前面的空格 @@ -121,120 +119,58 @@ void removeExtraSpaces(string& s) { 1. leetcode上的测试集里,字符串的长度不够长,如果足够长,性能差距会非常明显。 2. leetcode的测程序耗时不是很准确的。 -此时我们已经实现了removeExtraSpaces函数来移除冗余空格。 +版本一的代码是比较如何一般思考过程,就是 先移除字符串钱的空格,在移除中间的,在移除后面部分。 -还做实现反转字符串的功能,支持反转字符串子区间,这个实现我们分别在[344.反转字符串](https://programmercarl.com/0344.反转字符串.html)和[541.反转字符串II](https://programmercarl.com/0541.反转字符串II.html)里已经讲过了。 +不过其实还可以优化,这部分和[27.移除元素](https://programmercarl.com/0027.移除元素.html)的逻辑是一样一样的,本题是移除空格,而 27.移除元素 就是移除元素。 -代码如下: +所以代码可以写的很精简,大家可以看 如下 代码 removeExtraSpaces 函数的实现: -``` -// 反转字符串s中左闭又闭的区间[start, end] -void reverse(string& s, int start, int end) { - for (int i = start, j = end; i < j; i++, j--) { - swap(s[i], s[j]); +```CPP +// 版本二 +void removeExtraSpaces(string& s) {//去除所有空格并在相邻单词之间添加空格, 快慢指针。 + int slow = 0; //整体思想参考https://programmercarl.com/0027.移除元素.html + for (int i = 0; i < s.size(); ++i) { // + if (s[i] != ' ') { //遇到非空格就处理,即删除所有空格。 + if (slow != 0) s[slow++] = ' '; //手动控制空格,给单词之间添加空格。slow != 0说明不是第一个单词,需要在单词前添加空格。 + while (i < s.size() && s[i] != ' ') { //补上该单词,遇到空格说明单词结束。 + s[slow++] = s[i++]; + } + } } + s.resize(slow); //slow的大小即为去除多余空格后的大小。 } ``` -本题C++整体代码 +如果以上代码看不懂,建议先把 [27.移除元素](https://programmercarl.com/0027.移除元素.html)这道题目做了,或者看视频讲解:[数组中移除元素并不容易!LeetCode:27. 移除元素](https://www.bilibili.com/video/BV12A4y1Z7LP) 。 +此时我们已经实现了removeExtraSpaces函数来移除冗余空格。 -```CPP -// 版本一 -class Solution { -public: - // 反转字符串s中左闭又闭的区间[start, end] - void reverse(string& s, int start, int end) { - for (int i = start, j = end; i < j; i++, j--) { - swap(s[i], s[j]); - } - } +还做实现反转字符串的功能,支持反转字符串子区间,这个实现我们分别在[344.反转字符串](https://programmercarl.com/0344.反转字符串.html)和[541.反转字符串II](https://programmercarl.com/0541.反转字符串II.html)里已经讲过了。 - // 移除冗余空格:使用双指针(快慢指针法)O(n)的算法 - void removeExtraSpaces(string& s) { - int slowIndex = 0, fastIndex = 0; // 定义快指针,慢指针 - // 去掉字符串前面的空格 - while (s.size() > 0 && fastIndex < s.size() && s[fastIndex] == ' ') { - fastIndex++; - } - for (; fastIndex < s.size(); fastIndex++) { - // 去掉字符串中间部分的冗余空格 - if (fastIndex - 1 > 0 - && s[fastIndex - 1] == s[fastIndex] - && s[fastIndex] == ' ') { - continue; - } else { - s[slowIndex++] = s[fastIndex]; - } - } - if (slowIndex - 1 > 0 && s[slowIndex - 1] == ' ') { // 去掉字符串末尾的空格 - s.resize(slowIndex - 1); - } else { - s.resize(slowIndex); // 重新设置字符串大小 - } - } +代码如下: - string reverseWords(string s) { - removeExtraSpaces(s); // 去掉冗余空格 - reverse(s, 0, s.size() - 1); // 将字符串全部反转 - int start = 0; // 反转的单词在字符串里起始位置 - int end = 0; // 反转的单词在字符串里终止位置 - bool entry = false; // 标记枚举字符串的过程中是否已经进入了单词区间 - for (int i = 0; i < s.size(); i++) { // 开始反转单词 - if (!entry) { - start = i; // 确定单词起始位置 - entry = true; // 进入单词区间 - } - // 单词后面有空格的情况,空格就是分词符 - if (entry && s[i] == ' ' && s[i - 1] != ' ') { - end = i - 1; // 确定单词终止位置 - entry = false; // 结束单词区间 - reverse(s, start, end); - } - // 最后一个结尾单词之后没有空格的情况 - if (entry && (i == (s.size() - 1)) && s[i] != ' ' ) { - end = i;// 确定单词终止位置 - entry = false; // 结束单词区间 - reverse(s, start, end); - } - } - return s; - } - - // 当然这里的主函数reverseWords写的有一些冗余的,可以精简一些,精简之后的主函数为: - /* 主函数简单写法 - string reverseWords(string s) { - removeExtraSpaces(s); - reverse(s, 0, s.size() - 1); - for(int i = 0; i < s.size(); i++) { - int j = i; - // 查找单词间的空格,翻转单词 - while(j < s.size() && s[j] != ' ') j++; - reverse(s, i, j - 1); - i = j; - } - return s; +```CPP +// 反转字符串s中左闭又闭的区间[start, end] +void reverse(string& s, int start, int end) { + for (int i = start, j = end; i < j; i++, j--) { + swap(s[i], s[j]); } - */ -}; +} ``` -效率: - +整体代码如下: ```CPP -//版本二: -//原理同版本1,更简洁实现。 class Solution { public: - void reverse(string& s, int start, int end){ //翻转,区间写法:闭区间 [] + void reverse(string& s, int start, int end){ //翻转,区间写法:左闭又闭 [] for (int i = start, j = end; i < j; i++, j--) { swap(s[i], s[j]); } } void removeExtraSpaces(string& s) {//去除所有空格并在相邻单词之间添加空格, 快慢指针。 - int slow = 0; //整体思想参考Leetcode: 27. 移除元素:https://leetcode.cn/problems/remove-element/ + int slow = 0; //整体思想参考https://programmercarl.com/0027.移除元素.html for (int i = 0; i < s.size(); ++i) { // if (s[i] != ' ') { //遇到非空格就处理,即删除所有空格。 if (slow != 0) s[slow++] = ' '; //手动控制空格,给单词之间添加空格。slow != 0说明不是第一个单词,需要在单词前添加空格。 @@ -261,6 +197,7 @@ public: }; ``` + ## 其他语言版本 diff --git "a/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.md" "b/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.md" new file mode 100644 index 0000000000..b88e5fd248 --- /dev/null +++ "b/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.md" @@ -0,0 +1,249 @@ + +# 200. 岛屿数量 + +[题目链接](https://leetcode.cn/problems/number-of-islands/) + +给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。 + +岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。 + +此外,你可以假设该网格的四条边均被水包围。 + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20220726093256.png) + +提示: + +* m == grid.length +* n == grid[i].length +* 1 <= m, n <= 300 +* grid[i][j] 的值为 '0' 或 '1' + +## 思路 + +注意题目中每座岛屿只能由**水平方向和/或竖直方向上**相邻的陆地连接形成。 + +也就是说斜角度链接是不算了, 例如示例二,是三个岛屿,如图: + +![图一](https://code-thinking-1253855093.file.myqcloud.com/pics/20220726094200.png) + +这道题题目是 DFS,BFS,并查集,基础题目。 + +本题思路,是用遇到一个没有遍历过的节点陆地,计数器就加一,然后把该节点陆地所能遍历到的陆地都标记上。 + +在遇到标记过的陆地节点和海洋节点的时候直接跳过。 这样计数器就是最终岛屿的数量。 + +那么如果把节点陆地所能遍历到的陆地都标记上呢,就可以使用 DFS,BFS或者并查集。 + +### 深度优先搜索 + +以下代码使用dfs实现,如果对dfs不太了解的话,建议先看这篇题解:[797.所有可能的路径](https://leetcode.cn/problems/all-paths-from-source-to-target/solution/by-carlsun-2-66pf/), + +C++代码如下: + +```CPP +// 版本一 +class Solution { +private: + int dir[4][2] = {0, 1, 1, 0, -1, 0, 0, -1}; // 四个方向 + void dfs(vector>& grid, vector>& visited, int x, int y) { + for (int i = 0; i < 4; i++) { + int nextx = x + dir[i][0]; + int nexty = y + dir[i][1]; + if (nextx < 0 || nextx >= grid.size() || nexty < 0 || nexty >= grid[0].size()) continue; // 越界了,直接跳过 + if (!visited[nextx][nexty] && grid[nextx][nexty] == '1') { // 没有访问过的 同时 是陆地的 + + visited[nextx][nexty] = true; + dfs(grid, visited, nextx, nexty); + } + } + } +public: + int numIslands(vector>& grid) { + int n = grid.size(), m = grid[0].size(); + vector> visited = vector>(n, vector(m, false)); + + int result = 0; + for (int i = 0; i < n; i++) { + for (int j = 0; j < m; j++) { + if (!visited[i][j] && grid[i][j] == '1') { + visited[i][j] = true; + result++; // 遇到没访问过的陆地,+1 + dfs(grid, visited, i, j); // 将与其链接的陆地都标记上 true + } + } + } + return result; + } +}; +``` + +很多录友可能有疑惑,为什么 以上代码中的dfs函数,没有终止条件呢? 感觉递归没有终止很危险。 + +其实终止条件 就写在了,调用dfs的地方,如果遇到不合法的方向,直接不会去调用dfs。 + +当然,也可以这么写: + +```CPP +// 版本二 +class Solution { +private: + int dir[4][2] = {0, 1, 1, 0, -1, 0, 0, -1}; // 四个方向 + void dfs(vector>& grid, vector>& visited, int x, int y) { + if (visited[x][y] || grid[x][y] == '0') return; // 终止条件:访问过的节点 或者 遇到海水 + visited[x][y] = true; // 标记访问过 + for (int i = 0; i < 4; i++) { + int nextx = x + dir[i][0]; + int nexty = y + dir[i][1]; + if (nextx < 0 || nextx >= grid.size() || nexty < 0 || nexty >= grid[0].size()) continue; // 越界了,直接跳过 + dfs(grid, visited, nextx, nexty); + } + } +public: + int numIslands(vector>& grid) { + int n = grid.size(), m = grid[0].size(); + vector> visited = vector>(n, vector(m, false)); + + int result = 0; + for (int i = 0; i < n; i++) { + for (int j = 0; j < m; j++) { + if (!visited[i][j] && grid[i][j] == '1') { + result++; // 遇到没访问过的陆地,+1 + dfs(grid, visited, i, j); // 将与其链接的陆地都标记上 true + } + } + } + return result; + } +}; +``` + +这里大家应该能看出区别了,无疑就是版本一中 调用dfs 的条件,放在了 版本二 的 终止条件位置上。 + +**版本一的写法**是 :下一个节点是否能合法已经判断完了,只要调用dfs就是可以合法的节点。 + +**版本二的写法**是:不管节点是否合法,上来就dfs,然后在终止条件的地方进行判断,不合法再return。 + +**理论上来讲,版本一的效率更高一些**,因为避免了 没有意义的递归调用,在调用dfs之前,就做合法性判断。 但从写法来说,可能版本二 更利于理解一些。(不过其实都差不太多) + +很多同学看了同一道题目,都是dfs,写法却不一样,有时候有终止条件,有时候连终止条件都没有,其实这就是根本原因,两种写法而已。 + + +### 广度优先搜索 + +不少同学用广搜做这道题目的时候,超时了。 这里有一个广搜中很重要的细节: + +根本原因是**只要 加入队列就代表 走过,就需要标记,而不是从队列拿出来的时候再去标记走过**。 + +很多同学可能感觉这有区别吗? + +如果从队列拿出节点,再去标记这个节点走过,就会发生下图所示的结果,会导致很多节点重复加入队列。 + +![图二](https://code-thinking-1253855093.file.myqcloud.com/pics/20220727100846.png) + +超时写法 (从队列中取出节点再标记) + +```CPP +int dir[4][2] = {0, 1, 1, 0, -1, 0, 0, -1}; // 四个方向 +void bfs(vector>& grid, vector>& visited, int x, int y) { + queue> que; + que.push({x, y}); + while(!que.empty()) { + pair cur = que.front(); que.pop(); + int curx = cur.first; + int cury = cur.second; + visited[curx][cury] = true; // 从队列中取出在标记走过 + for (int i = 0; i < 4; i++) { + int nextx = curx + dir[i][0]; + int nexty = cury + dir[i][1]; + if (nextx < 0 || nextx >= grid.size() || nexty < 0 || nexty >= grid[0].size()) continue; // 越界了,直接跳过 + if (!visited[nextx][nexty] && grid[nextx][nexty] == '1') { + que.push({nextx, nexty}); + } + } + } + +} +``` + +加入队列 就代表走过,立刻标记,正确写法: + +```CPP +int dir[4][2] = {0, 1, 1, 0, -1, 0, 0, -1}; // 四个方向 +void bfs(vector>& grid, vector>& visited, int x, int y) { + queue> que; + que.push({x, y}); + visited[x][y] = true; // 只要加入队列,立刻标记 + while(!que.empty()) { + pair cur = que.front(); que.pop(); + int curx = cur.first; + int cury = cur.second; + for (int i = 0; i < 4; i++) { + int nextx = curx + dir[i][0]; + int nexty = cury + dir[i][1]; + if (nextx < 0 || nextx >= grid.size() || nexty < 0 || nexty >= grid[0].size()) continue; // 越界了,直接跳过 + if (!visited[nextx][nexty] && grid[nextx][nexty] == '1') { + que.push({nextx, nexty}); + visited[nextx][nexty] = true; // 只要加入队列立刻标记 + } + } + } + +} +``` + +以上两个版本其实,其实只有细微区别,就是 `visited[x][y] = true;` 放在的地方,着去取决于我们对 代码中队列的定义,队列中的节点就表示已经走过的节点。 **所以只要加入队列,理解标记该节点走过**。 + +本题完整广搜代码: + +```CPP +class Solution { +private: +int dir[4][2] = {0, 1, 1, 0, -1, 0, 0, -1}; // 四个方向 +void bfs(vector>& grid, vector>& visited, int x, int y) { + queue> que; + que.push({x, y}); + visited[x][y] = true; // 只要加入队列,立刻标记 + while(!que.empty()) { + pair cur = que.front(); que.pop(); + int curx = cur.first; + int cury = cur.second; + for (int i = 0; i < 4; i++) { + int nextx = curx + dir[i][0]; + int nexty = cury + dir[i][1]; + if (nextx < 0 || nextx >= grid.size() || nexty < 0 || nexty >= grid[0].size()) continue; // 越界了,直接跳过 + if (!visited[nextx][nexty] && grid[nextx][nexty] == '1') { + que.push({nextx, nexty}); + visited[nextx][nexty] = true; // 只要加入队列立刻标记 + } + } + } +} +public: + int numIslands(vector>& grid) { + int n = grid.size(), m = grid[0].size(); + vector> visited = vector>(n, vector(m, false)); + + int result = 0; + for (int i = 0; i < n; i++) { + for (int j = 0; j < m; j++) { + if (!visited[i][j] && grid[i][j] == '1') { + result++; // 遇到没访问过的陆地,+1 + bfs(grid, visited, i, j); // 将与其链接的陆地都标记上 true + } + } + } + return result; + } +}; + +``` + +## 总结 + +其实本题是 dfs,bfs 模板题,但正是因为是模板题,所以大家或者一些题解把重要的细节都很忽略了,我这里把大家没注意的但以后会踩的坑 都给列出来了。 + + + + + +## 其他语言版本 diff --git "a/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" "b/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" index 8af8675b72..6fd9b66f01 100644 --- "a/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" +++ "b/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" @@ -28,7 +28,7 @@ # 思路 -为了方便大家理解,我特意录制了视频:[手把手带你学会操作链表,移除链表元素](https://www.bilibili.com/video/BV18B4y1s7R9),结合视频在看本题解,事半功倍。 +为了方便大家理解,我特意录制了视频:[链表基础操作| LeetCode:203.移除链表元素](https://www.bilibili.com/video/BV18B4y1s7R9),结合视频在看本题解,事半功倍。 这里以链表 1 4 2 4 来举例,移除元素4。 diff --git "a/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md" "b/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md" index a6f4382a42..e97befee22 100644 --- "a/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md" +++ "b/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md" @@ -31,7 +31,7 @@ 那么接下来看一看是如何反转的呢? -我们拿有示例中的链表来举例,如动画所示: +我们拿有示例中的链表来举例,如动画所示:(纠正:动画应该是先移动pre,在移动cur) ![](https://tva1.sinaimg.cn/large/008eGmZEly1gnrf1oboupg30gy0c44qp.gif) @@ -408,6 +408,7 @@ def reverse(pre, cur) reverse(cur, tem) # 通过递归实现双指针法中的更新操作 end ``` + Kotlin: ```Kotlin fun reverseList(head: ListNode?): ListNode? { diff --git "a/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" "b/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" index 570242f90e..2a0187369c 100644 --- "a/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" +++ "b/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" @@ -19,11 +19,11 @@ # 思路 -为了易于大家理解,我特意录制了B站视频[拿下滑动窗口! | LeetCode 209 长度最小的子数组](https://www.bilibili.com/video/BV1tZ4y1q7XE) +为了易于大家理解,我特意录制了B站视频[拿下滑动窗口! | LeetCode 209 长度最小的子数组](https://www.bilibili.com/video/BV1tZ4y1q7XE),结合视频看本题解,事半功倍! ## 暴力解法 -这道题目暴力解法当然是 两个for循环,然后不断的寻找符合条件的子序列,时间复杂度很明显是O(n^2)。 +这道题目暴力解法当然是 两个for循环,然后不断的寻找符合条件的子序列,时间复杂度很明显是O(n^2)。 代码如下: @@ -51,7 +51,9 @@ public: }; ``` * 时间复杂度:O(n^2) -* 空间复杂度:O(1) +* 空间复杂度:O(1) + +后面力扣更新了数据,暴力解法已经超时了。 ## 滑动窗口 diff --git "a/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" "b/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" index 4662e2f28c..c8374a61c2 100644 --- "a/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" +++ "b/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" @@ -111,7 +111,7 @@ public: ## 拓展 -可以看出peek()的实现,直接复用了pop()。 +可以看出peek()的实现,直接复用了pop(), 要不然,对stOut判空的逻辑又要重写一遍。 再多说一些代码开发上的习惯问题,在工业级别代码开发中,最忌讳的就是 实现一个类似的函数,直接把代码粘过来改一改就完事了。 diff --git "a/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" "b/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" index ebadc04486..5b3d72d8bd 100644 --- "a/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" @@ -29,6 +29,8 @@ # 思路 +针对本题,我录制了视频讲解:[字符串基础操作! | LeetCode:344.反转字符串](https://www.bilibili.com/video/BV1fV4y17748),结合本题解一起看,事半功倍! + 先说一说题外话: 对于这道题目一些同学直接用C++里的一个库函数 reverse,调一下直接完事了, 相信每一门编程语言都有这样的库函数。 diff --git "a/problems/0417.\345\244\252\345\271\263\346\264\213\345\244\247\350\245\277\346\264\213\346\260\264\346\265\201\351\227\256\351\242\230.md" "b/problems/0417.\345\244\252\345\271\263\346\264\213\345\244\247\350\245\277\346\264\213\346\260\264\346\265\201\351\227\256\351\242\230.md" index 7efee80ade..fa2f573f51 100644 --- "a/problems/0417.\345\244\252\345\271\263\346\264\213\345\244\247\350\245\277\346\264\213\346\260\264\346\265\201\351\227\256\351\242\230.md" +++ "b/problems/0417.\345\244\252\345\271\263\346\264\213\345\244\247\350\245\277\346\264\213\346\260\264\346\265\201\351\227\256\351\242\230.md" @@ -2,6 +2,8 @@ [题目链接](https://leetcode.cn/problems/pacific-atlantic-water-flow/) +## 思路 + 不少同学可能被这道题的题目描述迷惑了,其实就是找到哪些点 可以同时到达太平洋和大西洋。 流动的方式只能从高往低流。 那么一个比较直白的想法,其实就是 遍历每个点,然后看这个点 能不能同时到达太平洋和大西洋。 @@ -197,3 +199,7 @@ for (int j = 0; j < m; j++) { 空间复杂度为:O(n * m) 这个就不难理解了。开了几个 n * m 的数组。 + +## 其他语言版本 + + diff --git "a/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" "b/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" index 4f45f4d733..f7898ae02b 100644 --- "a/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" @@ -31,21 +31,106 @@ # 思路 -这又是一道标准的KMP的题目。 +暴力的解法, 就是一个for循环获取 子串的终止位置, 然后判断子串是否能重复构成字符串,又嵌套一个for循环,所以是O(n^2)的时间复杂度。 -如果KMP还不够了解,可以看我的B站: +有的同学可以想,怎么一个for循环就可以获取子串吗? 至少得一个for获取子串起始位置,一个for获取子串结束位置吧。 -* [帮你把KMP算法学个通透!(理论篇)](https://www.bilibili.com/video/BV1PD4y1o7nd/) -* [帮你把KMP算法学个通透!(求next数组代码篇)](https://www.bilibili.com/video/BV1M5411j7Xx) +其实我们只需要判断,以第一个字母为开始的子串就可以,所以一个for循环获取子串的终止位置就行了。 而且遍历的时候 都不用遍历结束,只需要遍历到中间位置,因为子串结束位置大于中间位置的话,一定不能重复组成字符串。 +暴力的解法,这里就不讲了。 -我们在[字符串:KMP算法精讲](https://programmercarl.com/0028.实现strStr.html)里提到了,在一个串中查找是否出现过另一个串,这是KMP的看家本领。 +主要讲一讲移动匹配 和 KMP两种方法。 -那么寻找重复子串怎么也涉及到KMP算法了呢? +## 移动匹配 -这里就要说一说next数组了,next 数组记录的就是最长相同前后缀( [字符串:KMP算法精讲](https://programmercarl.com/0028.实现strStr.html) 这里介绍了什么是前缀,什么是后缀,什么又是最长相同前后缀), 如果 next[len - 1] != -1,则说明字符串有最长相同的前后缀(就是字符串里的前缀子串和后缀子串相同的最长长度)。 +当一个字符串s:abcabc,内部又重复的子串组成,那么这个字符串的结构一定是这样的: -最长相等前后缀的长度为:next[len - 1] + 1。(这里的next数组是以统一减一的方式计算的,因此需要+1) +![图一](https://code-thinking-1253855093.file.myqcloud.com/pics/20220728104518.png) + +也就是又前后又相同的子串组成。 + +那么既然前面有相同的子串,后面有相同的子串,用 s + s,这样组成的字符串中,后面的子串做前串,前后的子串做后串,就一定还能组成一个s,如图: + +![图二](https://code-thinking-1253855093.file.myqcloud.com/pics/20220728104931.png) + +所以判断字符串s是否有重复子串组成,只要两个s拼接在一起,里面还出现一个s的话,就说明是又重复子串组成。 + +当然,我们在判断 s + s 拼接的字符串里是否出现一个s的的时候,**要刨除 s + s 的首字符和尾字符**,这样避免在s+s中搜索出原来的s,我们要搜索的是中间拼接出来的s。 + +代码如下: + +```CPP +class Solution { +public: + bool repeatedSubstringPattern(string s) { + string t = s + s; + t.erase(t.begin()); t.erase(t.end() - 1); // 掐头去尾 + if (t.find(s) != std::string::npos) return true; // r + return false; + } +}; +``` + +不过这种解法还有一个问题,就是 我们最终还是要判断 一个字符串(s + s)是否出现过 s 的过程,大家可能直接用contains,find 之类的库函数。 却忽略了实现这些函数的时间复杂度(暴力解法是m * n,一般库函数实现为 O(m + n))。 + +如果我们做过 [28.实现strStr](https://programmercarl.com/0028.实现strStr.html) 题目的话,其实就知道,**实现一个 高效的算法来判断 一个字符串中是否出现另一个字符串是很复杂的**,这里就涉及到了KMP算法。 + +## KMP + +### 为什么会使用KMP +以下使用KMP方式讲解,强烈建议大家先把一下两个视频看了,理解KMP算法,在来看下面讲解,否则会很懵。 + +* [视频讲解版:帮你把KMP算法学个通透!(理论篇)](https://www.bilibili.com/video/BV1PD4y1o7nd/) +* [视频讲解版:帮你把KMP算法学个通透!(求next数组代码篇)](https://www.bilibili.com/video/BV1M5411j7Xx) +* [文字讲解版:KMP算法](https://programmercarl.com/0028.实现strStr.html) + +在一个串中查找是否出现过另一个串,这是KMP的看家本领。那么寻找重复子串怎么也涉及到KMP算法了呢? + +KMP算法中next数组为什么遇到字符不匹配的时候可以找到上一个匹配过的位置继续匹配,靠的是有计算好的前缀表。 前缀表里,统计了各个位置为终点字符串的最长相同前后缀的长度。 + +那么 最长相同前后缀和重复子串的关系又有什么关系呢。 + +可能很多录友又忘了 前缀和后缀的定义,在回顾一下: + +* 前缀是指不包含最后一个字符的所有以第一个字符开头的连续子串; +* 后缀是指不包含第一个字符的所有以最后一个字符结尾的连续子串 + +在由重复子串组成的字符串中,最长相等前后缀不包含的子串就是最小重复子串,这里那字符串s:abababab 来举例,ab就是最小重复单位,如图所示: + +![图三](https://code-thinking-1253855093.file.myqcloud.com/pics/20220728205249.png) + + +### 如何找到最小重复子串 + +这里有同学就问了,为啥一定是开头的ab呢。 其实最关键还是要理解 最长相等前后缀,如图: + +![图四](https://code-thinking-1253855093.file.myqcloud.com/pics/20220728212157.png) + +步骤一:因为 这是相等的前缀和后缀,t[0] 与 k[0]相同, t[1] 与 k[1]相同,所以 s[0] 一定和 s[2]相同,s[1] 一定和 s[3]相同,即:,s[0]s[1]与s[2]s[3]相同 。 + +步骤二: 因为在同一个字符串位置,所以 t[2] 与 k[0]相同,t[3] 与 k[1]相同。 + +步骤三: 因为 这是相等的前缀和后缀,t[2] 与 k[2]相同 ,t[3]与k[3] 相同,所以,s[2]一定和s[4]相同,s[3]一定和s[5]相同,即:s[2]s[3] 与 s[4]s[5]相同。 + +步骤四:循环往复。 + +所以字符串s,s[0]s[1]与s[2]s[3]相同, s[2]s[3] 与 s[4]s[5]相同,s[4]s[5] 与 s[6]s[7] 相同。 + +正是因为 最长相等前后缀的规则,当一个字符串由重复子串组成的,最长相等前后缀不包含的子串就是最小重复子串。 + +### 简单推理 + +这里在给出一个数推导,就容易理解很多。 + +假设字符串s使用多个重复子串构成(这个子串是最小重复单位),重复出现的子字符串长度是x,所以s是由n * x组成。 + +因为字符串s的最长相同前后缀的的长度一定是不包含s本身,所以 最长相同前后缀长度必然是m * x,而且 n - m = 1,(这里如果不懂,看上面的推理) + +所以如果 nx % (n - m)x = 0,就可以判定有重复出现的子字符串。 + +next 数组记录的就是最长相同前后缀 [字符串:KMP算法精讲](https://programmercarl.com/0028.实现strStr.html) 这里介绍了什么是前缀,什么是后缀,什么又是最长相同前后缀), 如果 next[len - 1] != -1,则说明字符串有最长相同的前后缀(就是字符串里的前缀子串和后缀子串相同的最长长度)。 + +最长相等前后缀的长度为:next[len - 1] + 1。(这里的next数组是以统一减一的方式计算的,因此需要+1,两种计算next数组的具体区别看这里:[字符串:KMP算法精讲](https://programmercarl.com/0028.实现strStr.html)) 数组长度为:len。 @@ -62,7 +147,6 @@ next[len - 1] = 7,next[len - 1] + 1 = 8,8就是此时字符串asdfasdfasdf的最长相同前后缀的长度。 - (len - (next[len - 1] + 1)) 也就是: 12(字符串的长度) - 8(最长公共前后缀的长度) = 4, 4正好可以被 12(字符串的长度) 整除,所以说明有重复的子字符串(asdf)。 @@ -75,10 +159,10 @@ public: next[0] = -1; int j = -1; for(int i = 1;i < s.size(); i++){ - while(j >= 0 && s[i] != s[j+1]) { + while(j >= 0 && s[i] != s[j + 1]) { j = next[j]; } - if(s[i] == s[j+1]) { + if(s[i] == s[j + 1]) { j++; } next[i] = j; @@ -100,7 +184,7 @@ public: ``` -前缀表(不减一)的C++代码实现 +前缀表(不减一)的C++代码实现: ```CPP class Solution { @@ -133,14 +217,6 @@ public: }; ``` -# 拓展 - -在[字符串:KMP算法精讲](https://programmercarl.com/0028.实现strStr.html)中讲解KMP算法的基础理论,给出next数组究竟是如何来了,前缀表又是怎么回事,为什么要选择前缀表。 - -讲解一道KMP的经典题目,力扣:28. 实现 strStr(),判断文本串里是否出现过模式串,这里涉及到构造next数组的代码实现,以及使用next数组完成模式串与文本串的匹配过程。 - -后来很多同学反馈说:搞不懂前后缀,什么又是最长相同前后缀(最长公共前后缀我认为这个用词不准确),以及为什么前缀表要统一减一(右移)呢,不减一行不行?针对这些问题,我在[字符串:KMP算法精讲](https://programmercarl.com/0028.实现strStr.html)给出了详细的讲解。 - ## 其他语言版本 diff --git "a/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" "b/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" index 7ef6463e0c..a8bf380464 100644 --- "a/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" +++ "b/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" @@ -25,6 +25,8 @@ # 思路 +针对本题,我录制了视频讲解:[字符串操作进阶! | LeetCode:541. 反转字符串II](https://www.bilibili.com/video/BV1dT411j7NN),结合本题解一起看,事半功倍! + 这道题目其实也是模拟,实现题目中规定的反转规则就可以了。 一些同学可能为了处理逻辑:每隔2k个字符的前k的字符,写了一堆逻辑代码或者再搞一个计数器,来统计2k,再统计前k个字符。 diff --git "a/problems/0695.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" "b/problems/0695.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" new file mode 100644 index 0000000000..b09452921f --- /dev/null +++ "b/problems/0695.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" @@ -0,0 +1,96 @@ +# 695. 岛屿的最大面积 + +给你一个大小为 m x n 的二进制矩阵 grid 。 + +岛屿 是由一些相邻的 1 (代表土地) 构成的组合,这里的「相邻」要求两个 1 必须在 水平或者竖直的四个方向上 相邻。你可以假设 grid 的四个边缘都被 0(代表水)包围着。 + +岛屿的面积是岛上值为 1 的单元格的数目。 + +计算并返回 grid 中最大的岛屿面积。如果没有岛屿,则返回面积为 0 。 + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20220729111528.png) + +输入:grid = [[0,0,1,0,0,0,0,1,0,0,0,0,0],[0,0,0,0,0,0,0,1,1,1,0,0,0],[0,1,1,0,1,0,0,0,0,0,0,0,0],[0,1,0,0,1,1,0,0,1,0,1,0,0],[0,1,0,0,1,1,0,0,1,1,1,0,0],[0,0,0,0,0,0,0,0,0,0,1,0,0],[0,0,0,0,0,0,0,1,1,1,0,0,0],[0,0,0,0,0,0,0,1,1,0,0,0,0]] +输出:6 +解释:答案不应该是 11 ,因为岛屿只能包含水平或垂直这四个方向上的 1 。 + +# 思路 + +写法一,dfs只处理下一个节点 +```CPP +class Solution { +private: + int count; + int dir[4][2] = {0, 1, 1, 0, -1, 0, 0, -1}; // 四个方向 + void dfs(vector>& grid, vector>& visited, int x, int y) { + for (int i = 0; i < 4; i++) { + int nextx = x + dir[i][0]; + int nexty = y + dir[i][1]; + if (nextx < 0 || nextx >= grid.size() || nexty < 0 || nexty >= grid[0].size()) continue; // 越界了,直接跳过 + if (!visited[nextx][nexty] && grid[nextx][nexty] == 1) { // 没有访问过的 同时 是陆地的 + + visited[nextx][nexty] = true; + count++; + dfs(grid, visited, nextx, nexty); + } + } + } + +public: + int maxAreaOfIsland(vector>& grid) { + int n = grid.size(), m = grid[0].size(); + vector> visited = vector>(n, vector(m, false)); + + int result = 0; + for (int i = 0; i < n; i++) { + for (int j = 0; j < m; j++) { + if (!visited[i][j] && grid[i][j] == 1) { + count = 1; + visited[i][j] = true; + dfs(grid, visited, i, j); // 将与其链接的陆地都标记上 true + result = max(result, count); + } + } + } + return result; + } +}; +``` + +写法二,dfs处理当前节点 +dfs +```CPP +class Solution { +private: + int count; + int dir[4][2] = {0, 1, 1, 0, -1, 0, 0, -1}; // 四个方向 + void dfs(vector>& grid, vector>& visited, int x, int y) { + if (visited[x][y] || grid[x][y] == 0) return; // 终止条件:访问过的节点 或者 遇到海水 + visited[x][y] = true; // 标记访问过 + count++; + for (int i = 0; i < 4; i++) { + int nextx = x + dir[i][0]; + int nexty = y + dir[i][1]; + if (nextx < 0 || nextx >= grid.size() || nexty < 0 || nexty >= grid[0].size()) continue; // 越界了,直接跳过 + dfs(grid, visited, nextx, nexty); + } + } + +public: + int maxAreaOfIsland(vector>& grid) { + int n = grid.size(), m = grid[0].size(); + vector> visited = vector>(n, vector(m, false)); + int result = 0; + for (int i = 0; i < n; i++) { + for (int j = 0; j < m; j++) { + if (!visited[i][j] && grid[i][j] == 1) { + count = 0; + dfs(grid, visited, i, j); // 将与其链接的陆地都标记上 true + result = max(result, count); + } + } + } + return result; + } +}; +``` diff --git "a/problems/0797.\346\211\200\346\234\211\345\217\257\350\203\275\347\232\204\350\267\257\345\276\204.md" "b/problems/0797.\346\211\200\346\234\211\345\217\257\350\203\275\347\232\204\350\267\257\345\276\204.md" index b990053e10..a51590f25a 100644 --- "a/problems/0797.\346\211\200\346\234\211\345\217\257\350\203\275\347\232\204\350\267\257\345\276\204.md" +++ "b/problems/0797.\346\211\200\346\234\211\345\217\257\350\203\275\347\232\204\350\267\257\345\276\204.md" @@ -158,6 +158,10 @@ if (终止条件) { 终止添加不仅是结束本层递归,同时也是我们收获结果的时候。 +另外,其实很多dfs写法,没有写终止条件,其实终止条件写在了, 下面dfs递归的逻辑里了,也就是不符合条件,直接不会向下递归。这里如果大家不理解的话,没关系,后面会有具体题目来讲解。 +* 841.钥匙和房间 +* 200. 岛屿数量 + 3. 处理目前搜索节点出发的路径 一般这里就是一个for循环的操作,去遍历 目前搜索节点 所能到的所有节点。 diff --git "a/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" "b/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" index 7bc84e8565..eb9f42b1ef 100644 --- "a/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" +++ "b/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" @@ -23,7 +23,7 @@ # 思路 -为了易于大家理解,我还特意录制了视频,[本题视频讲解](https://www.bilibili.com/video/BV1QB4y1D7ep) +针对本题,我录制了视频讲解:[双指针法经典题目!LeetCode:977.有序数组的平方](https://www.bilibili.com/video/BV1QB4y1D7ep),结合本题解一起看,事半功倍! ## 暴力排序 diff --git "a/problems/\345\211\215\345\272\217/\344\273\243\347\240\201\351\243\216\346\240\274.md" "b/problems/\345\211\215\345\272\217/\344\273\243\347\240\201\351\243\216\346\240\274.md" index 4ab94a51b4..196f40272c 100644 --- "a/problems/\345\211\215\345\272\217/\344\273\243\347\240\201\351\243\216\346\240\274.md" +++ "b/problems/\345\211\215\345\272\217/\344\273\243\347\240\201\351\243\216\346\240\274.md" @@ -51,7 +51,7 @@ 匈牙利命名法是:变量名 = 属性 + 类型 + 对象描述,例如:`int iMyAge`,这种命名是一个来此匈牙利的程序员在微软内部推广起来,然后推广给了全世界的Windows开发人员。 -这种命名方式在没有IDE的时代,可以很好的提醒开发人员遍历的意义,例如看到iMyAge,就知道它是一个int型的变量,而不用找它的定义,缺点是一旦该变量的属性,那么整个项目里这个变量名字都要改动,所以带来代码维护困难。 +这种命名方式在没有IDE的时代,可以很好的提醒开发人员遍历的意义,例如看到iMyAge,就知道它是一个int型的变量,而不用找它的定义,缺点是一旦改变变量的属性,那么整个项目里这个变量名字都要改动,所以带来代码维护困难。 **目前IDE已经很发达了,都不用标记变量属性了,IDE就会帮我们识别了,所以基本没人用匈牙利命名法了**,虽然我不用IDE,VIM大法好。 @@ -89,7 +89,7 @@ while (n) { } ``` -控制语句(while,if,for)前都有一个空格,例如: +控制语句(while,if,for)后都有一个空格,例如: ``` while (n) { if (k > 0) return 9; From e5dd7c3ea53c7498503ed39c7ffa7ab9e812ede9 Mon Sep 17 00:00:00 2001 From: cezarbbb <105843128+cezarbbb@users.noreply.github.com> Date: Wed, 3 Aug 2022 16:10:36 +0800 Subject: [PATCH 0974/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200763.=E5=88=92?= =?UTF-8?q?=E5=88=86=E5=AD=97=E6=AF=8D=E5=8C=BA=E9=97=B4=20Rust=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加 0763.划分字母区间 Rust版本 --- ...27\346\257\215\345\214\272\351\227\264.md" | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git "a/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" "b/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" index ecf064d337..a6066ebc67 100644 --- "a/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" +++ "b/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" @@ -343,6 +343,34 @@ object Solution { } ``` +### Rust + +```Rust +use std::collections::HashMap; +impl Solution { + fn max (a: usize, b: usize) -> usize { + if a > b { a } else { b } + } + pub fn partition_labels(s: String) -> Vec { + let s = s.chars().collect::>(); + let mut hash: HashMap = HashMap::new(); + for i in 0..s.len() { + hash.insert(s[i], i); + } + let mut result: Vec = Vec::new(); + let mut left: usize = 0; + let mut right: usize = 0; + for i in 0..s.len() { + right = Self::max(right, hash[&s[i]]); + if i == right { + result.push((right - left + 1) as i32); + left = i + 1; + } + } + result + } +} +``` -----------------------
From ddf0530d44bf1e35322dbeb80e61c26134d0c014 Mon Sep 17 00:00:00 2001 From: whosphp <11045186+whosphp@users.noreply.github.com> Date: Thu, 4 Aug 2022 14:08:38 +0800 Subject: [PATCH 0975/3019] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=200001.=E4=B8=A4?= =?UTF-8?q?=E6=95=B0=E4=B9=8B=E5=92=8C=20php=E7=89=88=E6=9C=AC=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...0\244\346\225\260\344\271\213\345\222\214.md" | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git "a/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" "b/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" index a15e1349a6..5bedd0a0af 100644 --- "a/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" @@ -263,13 +263,15 @@ php ```php function twoSum(array $nums, int $target): array { - for ($i = 0; $i < count($nums);$i++) { - // 计算剩下的数 - $residue = $target - $nums[$i]; - // 匹配的index,有则返回index, 无则返回false - $match_index = array_search($residue, $nums); - if ($match_index !== false && $match_index != $i) { - return array($i, $match_index); + $map = []; + foreach($nums as $i => $num) { + if (isset($map[$target - $num])) { + return [ + $i, + $map[$target - $num] + ]; + } else { + $map[$num] = $i; } } return []; From 04d18654c546449e116f9f7e1cef4d60b899cf8e Mon Sep 17 00:00:00 2001 From: Merlin218 <61051874+Merlin218@users.noreply.github.com> Date: Thu, 4 Aug 2022 15:48:24 +0800 Subject: [PATCH 0976/3019] =?UTF-8?q?fix(0337.=E6=89=93=E5=AE=B6=E5=8A=AB?= =?UTF-8?q?=E8=88=8D):=20=E4=BF=AE=E5=A4=8D=E4=BB=A3=E7=A0=81=E4=B8=AD?= =?UTF-8?q?=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ....\346\211\223\345\256\266\345\212\253\350\210\215III.md" | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git "a/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" "b/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" index d2add23256..1f6fdbc878 100644 --- "a/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" +++ "b/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" @@ -190,9 +190,9 @@ public: if (cur == NULL) return vector{0, 0}; vector left = robTree(cur->left); vector right = robTree(cur->right); - // 偷cur - int val1 = cur->val + left[0] + right[0]; - // 不偷cur + // 偷cur,那么就不能偷左右节点。 + int val1 = cur->val + left[1] + right[1]; + // 不偷cur,那么可以偷也可以不偷左右节点,则取较大的情况 int val2 = max(left[0], left[1]) + max(right[0], right[1]); return {val2, val1}; } From cd3c852e287435dc8a5b6188e7c6ed6025990116 Mon Sep 17 00:00:00 2001 From: cezarbbb <105843128+cezarbbb@users.noreply.github.com> Date: Thu, 4 Aug 2022 17:29:24 +0800 Subject: [PATCH 0977/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200056.=E5=90=88?= =?UTF-8?q?=E5=B9=B6=E5=8C=BA=E9=97=B4=20Rust=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加 0056.合并区间 Rust版本 --- ...10\345\271\266\345\214\272\351\227\264.md" | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git "a/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" "b/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" index 627ca5b1c3..26a8010dc3 100644 --- "a/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" +++ "b/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" @@ -329,5 +329,31 @@ object Solution { } ``` +### Rust + +```Rust +impl Solution { + fn max(a: i32, b: i32) -> i32 { + if a > b { a } else { b } + } + + pub fn merge(intervals: Vec>) -> Vec> { + let mut intervals = intervals; + let mut result = Vec::new(); + if intervals.len() == 0 { return result; } + intervals.sort_by(|a, b| a[0].cmp(&b[0])); + result.push(intervals[0].clone()); + for i in 1..intervals.len() { + if result.last_mut().unwrap()[1] >= intervals[i][0] { + result.last_mut().unwrap()[1] = Self::max(result.last_mut().unwrap()[1], intervals[i][1]); + } else { + result.push(intervals[i].clone()); + } + } + result + } +} +``` + -----------------------
From 31e340bf6c953850705bf80701f7f9df5c6622d6 Mon Sep 17 00:00:00 2001 From: Jack_ZhijieFang <56966563+laerpeeK@users.noreply.github.com> Date: Fri, 5 Aug 2022 02:45:36 +0800 Subject: [PATCH 0978/3019] =?UTF-8?q?fix:=E9=93=BE=E8=A1=A8=E7=90=86?= =?UTF-8?q?=E8=AE=BA=E5=9F=BA=E7=A1=80.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit typescript中,null只能赋值给any和null类型变量。这里需要采用联合类型声明。 --- ...\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/\351\223\276\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\351\223\276\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" index 1a29c32a54..8378f7f20c 100644 --- "a/problems/\351\223\276\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\351\223\276\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -186,7 +186,7 @@ TypeScript: ```typescript class ListNode { public val: number; - public next: ListNode = null; + public next: ListNode|null = null; constructor(value: number) { this.val = value; this.next = null; From 0f96289ed1485f64b010864c1ee26bd94051c132 Mon Sep 17 00:00:00 2001 From: Jack_ZhijieFang <56966563+laerpeeK@users.noreply.github.com> Date: Fri, 5 Aug 2022 03:15:03 +0800 Subject: [PATCH 0979/3019] =?UTF-8?q?fix=200203.=E7=A7=BB=E9=99=A4?= =?UTF-8?q?=E9=93=BE=E8=A1=A8=E5=85=83=E7=B4=A0.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修复某个变量编译时的类型问题。 --- ...231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git "a/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" "b/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" index 6fd9b66f01..5622fd1ca7 100644 --- "a/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" +++ "b/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" @@ -385,7 +385,8 @@ function removeElements(head: ListNode | null, val: number): ListNode | null { if (cur.val === val) { pre.next = cur.next; } else { - pre = pre.next; + //此处不加类型断言时:编译器会认为pre类型为ListNode, pre.next类型为ListNode | null + pre = pre.next as ListNode; } cur = cur.next; } From ec52d094831b9b9e936cf4c17b83abc3476799dc Mon Sep 17 00:00:00 2001 From: cezarbbb <105843128+cezarbbb@users.noreply.github.com> Date: Fri, 5 Aug 2022 17:11:03 +0800 Subject: [PATCH 0980/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200738.=E5=8D=95?= =?UTF-8?q?=E8=B0=83=E9=80=92=E5=A2=9E=E7=9A=84=E6=95=B0=E5=AD=97=20Rust?= =?UTF-8?q?=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加 0738.单调递增的数字 Rust版本 --- ...36\347\232\204\346\225\260\345\255\227.md" | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git "a/problems/0738.\345\215\225\350\260\203\351\200\222\345\242\236\347\232\204\346\225\260\345\255\227.md" "b/problems/0738.\345\215\225\350\260\203\351\200\222\345\242\236\347\232\204\346\225\260\345\255\227.md" index 6b7381f3c0..b452d02d19 100644 --- "a/problems/0738.\345\215\225\350\260\203\351\200\222\345\242\236\347\232\204\346\225\260\345\255\227.md" +++ "b/problems/0738.\345\215\225\350\260\203\351\200\222\345\242\236\347\232\204\346\225\260\345\255\227.md" @@ -278,5 +278,26 @@ object Solution { } ``` +### Rust + +```Rust +impl Solution { + pub fn monotone_increasing_digits(n: i32) -> i32 { + let mut str_num = n.to_string().chars().map(|x| x.to_digit(10).unwrap() as i32).collect::>(); + let mut flag = str_num.len(); + for i in (1..str_num.len()).rev() { + if str_num[i - 1] > str_num[i] { + flag = i; + str_num[i - 1] -= 1; + } + } + for i in flag..str_num.len() { + str_num[i] = 9; + } + str_num.iter().fold(0, |acc, x| acc * 10 + x) + } +} +``` + -----------------------
From b802e83e435cb4cf23f13c699816dc2f77bf500c Mon Sep 17 00:00:00 2001 From: cezarbbb <105843128+cezarbbb@users.noreply.github.com> Date: Sat, 6 Aug 2022 18:27:34 +0800 Subject: [PATCH 0981/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200714.=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=E5=90=AB=E6=89=8B=E7=BB=AD=E8=B4=B9=EF=BC=88=E5=8A=A8?= =?UTF-8?q?=E6=80=81=E8=A7=84=E5=88=92=EF=BC=89=20Rust=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加 0714.买卖股票的最佳时机含手续费(动态规划) Rust版本 --- ...01\350\247\204\345\210\222\357\274\211.md" | 40 ++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git "a/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" "b/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" index 7734450ec1..5ae8c33bf3 100644 --- "a/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" +++ "b/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" @@ -221,8 +221,46 @@ function maxProfit(prices: number[], fee: number): number { }; ``` +Rust: +**贪心** +```Rust +impl Solution { + pub fn max_profit(prices: Vec, fee: i32) -> i32 { + let mut result = 0; + let mut min_price = prices[0]; + for i in 1..prices.len() { + if prices[i] < min_price { min_price = prices[i]; } + + // if prices[i] >= min_price && prices[i] <= min_price + fee { continue; } + + if prices[i] > min_price + fee { + result += prices[i] - min_price - fee; + min_price = prices[i] - fee; + } + } + result + } +} +``` - +**动态规划** +```Rust +impl Solution { + fn max(a: i32, b: i32) -> i32 { + if a > b { a } else { b } + } + pub fn max_profit(prices: Vec, fee: i32) -> i32 { + let n = prices.len(); + let mut dp = vec![vec![0; 2]; n]; + dp[0][0] -= prices[0]; + for i in 1..n { + dp[i][0] = Self::max(dp[i - 1][0], dp[i - 1][1] - prices[i]); + dp[i][1] = Self::max(dp[i - 1][1], dp[i - 1][0] + prices[i] - fee); + } + Self::max(dp[n - 1][0], dp[n - 1][1]) + } +} +``` -----------------------
From 5868d5ec6dfd786c32cb6485e96fd861b28fccf2 Mon Sep 17 00:00:00 2001 From: Jack_ZhijieFang <56966563+laerpeeK@users.noreply.github.com> Date: Sun, 7 Aug 2022 02:11:01 +0800 Subject: [PATCH 0982/3019] =?UTF-8?q?Update=200019.=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E9=93=BE=E8=A1=A8=E7=9A=84=E5=80=92=E6=95=B0=E7=AC=ACN?= =?UTF-8?q?=E4=B8=AA=E8=8A=82=E7=82=B9.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 原方法编译时发现对节点类型缺少断言。 --- ...4N\344\270\252\350\212\202\347\202\271.md" | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git "a/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" "b/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" index 3499ab9db4..62fe4f8bae 100644 --- "a/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" +++ "b/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" @@ -188,18 +188,20 @@ TypeScript: ```typescript function removeNthFromEnd(head: ListNode | null, n: number): ListNode | null { let newHead: ListNode | null = new ListNode(0, head); - let slowNode: ListNode | null = newHead, - fastNode: ListNode | null = newHead; - for (let i = 0; i < n; i++) { - fastNode = fastNode.next; + //根据leetcode题目的定义可推断这里快慢指针均不需要定义为ListNode | null。 + let slowNode: ListNode = newHead; + let fastNode: ListNode = newHead; + + while(n--) { + fastNode = fastNode.next!; //由虚拟头节点前进n个节点时,fastNode.next可推断不为null。 } - while (fastNode.next) { + while(fastNode.next) { //遍历直至fastNode.next = null, 即尾部节点。 此时slowNode指向倒数第n个节点。 fastNode = fastNode.next; - slowNode = slowNode.next; + slowNode = slowNode.next!; } - slowNode.next = slowNode.next.next; - return newHead.next; -}; + slowNode.next = slowNode.next!.next; //倒数第n个节点可推断其next节点不为空。 + return newHead.next; +} ``` 版本二(计算节点总数法): From 60f3ad665b005e518a6b413304bfbf26058feeb5 Mon Sep 17 00:00:00 2001 From: cezarbbb <105843128+cezarbbb@users.noreply.github.com> Date: Sun, 7 Aug 2022 19:34:04 +0800 Subject: [PATCH 0983/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200343.=E6=95=B4?= =?UTF-8?q?=E6=95=B0=E6=8B=86=E5=88=86=20Rust=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加 0343.整数拆分 Rust版本 --- ...64\346\225\260\346\213\206\345\210\206.md" | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git "a/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" "b/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" index a4d532fdbc..60676e8578 100644 --- "a/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" +++ "b/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" @@ -299,6 +299,27 @@ function integerBreak(n: number): number { }; ``` +### Rust + +```Rust +impl Solution { + fn max(a: i32, b: i32) -> i32{ + if a > b { a } else { b } + } + pub fn integer_break(n: i32) -> i32 { + let n = n as usize; + let mut dp = vec![0; n + 1]; + dp[2] = 1; + for i in 3..=n { + for j in 1..i - 1 { + dp[i] = Self::max(dp[i], Self::max(((i - j) * j) as i32, dp[i - j] * j as i32)); + } + } + dp[n] + } +} +``` + ### C ```c From b58c0df620f7e5171ec4606250ad7cdd04a3646c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=9C=A1=E7=AC=94?= Date: Sun, 7 Aug 2022 20:41:01 +0800 Subject: [PATCH 0984/3019] =?UTF-8?q?Update=200376.=E6=91=86=E5=8A=A8?= =?UTF-8?q?=E5=BA=8F=E5=88=97.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 按着讲解的原理,分别完善了Golang版本的贪心算法和动态规划算法。 --- ...06\345\212\250\345\272\217\345\210\227.md" | 64 +++++++++++++++---- 1 file changed, 50 insertions(+), 14 deletions(-) diff --git "a/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" "b/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" index a41a0f0a59..d15ed2d055 100644 --- "a/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" +++ "b/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" @@ -266,22 +266,58 @@ class Solution: ### Go +**贪心** ```golang func wiggleMaxLength(nums []int) int { - var count,preDiff,curDiff int - count=1 - if len(nums)<2{ - return count - } - for i:=0;i 0 && preDiff <= 0) || (preDiff >= 0 && curDiff < 0){ - preDiff=curDiff - count++ - } - } - return count + var count, preDiff, curDiff int //初始化默认为0 + count = 1 // 初始化为1,因为最小的序列是1个数 + if len(nums) < 2 { + return count + } + for i := 0; i < len(nums)-1; i++ { + curDiff = nums[i+1] - nums[i] + if (curDiff > 0 && preDiff <= 0) || (curDiff < 0 && preDiff >= 0) { + count++ + } + } + return count +} +``` + +**动态规划** +```golang +func wiggleMaxLength(nums []int) int { + n := len(nums) + if n <= 1 { + return n + } + dp := make([][2]int, n) + // i 0 作为波峰的最大长度 + // i 1 作为波谷的最大长度 + dp[0][0] = 1 + dp[0][1] = 1 + for i := 0; i < n; i++ { + for j := 0; j < i; j++ { + if nums[j] > nums[i] { //nums[i]为波谷 + dp[i][1] = max(dp[i][1], dp[j][0]+1) + } + if nums[j] < nums[i] { //nums[i]为波峰 或者相等 + dp[i][0] = max(dp[i][0], dp[j][1]+1) + } + if nums[j] == nums[i] { //添加一种情况,nums[i]为相等 + dp[i][0] = max(dp[i][0], dp[j][0]) //波峰 + dp[i][1] = max(dp[i][1], dp[j][1]) //波谷 + } + } + } + return max(dp[n-1][0], dp[n-1][1]) +} +func max(a, b int) int { + if a > b { + return a + } else { + return b + } } ``` From b6027889f5d04955091933474ccd5735b53e9f75 Mon Sep 17 00:00:00 2001 From: cezarbbb <105843128+cezarbbb@users.noreply.github.com> Date: Mon, 8 Aug 2022 16:25:40 +0800 Subject: [PATCH 0985/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200096.=E4=B8=8D?= =?UTF-8?q?=E5=90=8C=E7=9A=84=E4=BA=8C=E5=8F=89=E6=90=9C=E7=B4=A2=E6=A0=91?= =?UTF-8?q?=20Rust=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加 0096.不同的二叉搜索树 Rust版本 --- ...211\346\220\234\347\264\242\346\240\221.md" | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git "a/problems/0096.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0096.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" index 9adc04576f..51de1e2330 100644 --- "a/problems/0096.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" +++ "b/problems/0096.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" @@ -252,6 +252,24 @@ function numTrees(n: number): number { }; ``` +### Rust + +```Rust +impl Solution { + pub fn num_trees(n: i32) -> i32 { + let n = n as usize; + let mut dp = vec![0; n + 1]; + dp[0] = 1; + for i in 1..=n { + for j in 1..=i { + dp[i] += dp[j - 1] * dp[i - j]; + } + } + dp[n] + } +} +``` + ### C ```c From 8ded72e92d94a289565b964dfe8220b0c894f9d9 Mon Sep 17 00:00:00 2001 From: FancyWxx <93196934+FancyWxx@users.noreply.github.com> Date: Tue, 9 Aug 2022 14:32:20 +0800 Subject: [PATCH 0986/3019] =?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=84=E2=85=A1.md=20?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=BA=86Java=E7=89=88=E6=9C=AC=E7=9A=84?= =?UTF-8?q?=E4=B8=A4=E7=A7=8D=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\345\272\217\346\225\260\347\273\204II.md" | 53 +++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git "a/problems/0922.\346\214\211\345\245\207\345\201\266\346\216\222\345\272\217\346\225\260\347\273\204II.md" "b/problems/0922.\346\214\211\345\245\207\345\201\266\346\216\222\345\272\217\346\225\260\347\273\204II.md" index 49547a1542..4e281a3cdf 100644 --- "a/problems/0922.\346\214\211\345\245\207\345\201\266\346\216\222\345\272\217\346\225\260\347\273\204II.md" +++ "b/problems/0922.\346\214\211\345\245\207\345\201\266\346\216\222\345\272\217\346\225\260\347\273\204II.md" @@ -147,6 +147,59 @@ class Solution { } ``` +### java + +```java +//方法一:采用额外的数组空间 +class Solution { + public int[] sortArrayByParityII(int[] nums) { + //定义结果数组 result + int[] result = new int[nums.length]; + int even = 0, odd = 1; + for(int i = 0; i < nums.length; i++){ + //如果为偶数 + if(nums[i] % 2 == 0){ + result[even] = nums[i]; + even += 2; + }else{ + result[odd] = nums[i]; + odd += 2; + } + } + return result; + } +} +``` +```java +//方法二:不采用额外的数组空间 +class Solution922 { + public int[] sortArrayByParityII(int[] nums) { + //定义双指针 + int oddPoint = 1, evenPoint = 0; + //开始移动并交换,最后一层必然为相互交换后再移动或者相同直接移动 + while(oddPoint < nums.length && evenPoint < nums.length){ + //进行判断 + if(nums[oddPoint] % 2 == 0 && nums[evenPoint] % 2 == 1){ //如果均不满足 + int temp = 0; + temp = nums[oddPoint]; + nums[oddPoint] = nums[evenPoint]; + nums[evenPoint] = temp; + oddPoint += 2; + evenPoint += 2; + }else if(nums[oddPoint] % 2 == 0 && nums[evenPoint] % 2 == 0){ //偶数满足 + evenPoint += 2; + }else if(nums[oddPoint] % 2 == 1 && nums[evenPoint] % 2 == 1){ //奇数满足 + oddPoint += 2; + }else{ + oddPoint += 2; + evenPoint += 2; + } + } + return nums; + } +} +``` + ### Python3 ```python From 0f9c10dda4b3446f1ac53805e3125ed42219dbab Mon Sep 17 00:00:00 2001 From: wang <472146630@qq.com> Date: Tue, 9 Aug 2022 17:34:44 +0800 Subject: [PATCH 0987/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=95=B4=E6=95=B0?= =?UTF-8?q?=E6=8B=86=E5=88=86Rust=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\264\346\225\260\346\213\206\345\210\206.md" | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git "a/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" "b/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" index a4d532fdbc..68846b130c 100644 --- "a/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" +++ "b/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" @@ -192,7 +192,7 @@ public: ## 其他语言版本 -### Java +### Java ```Java class Solution { public int integerBreak(int n) { @@ -259,6 +259,21 @@ func max(a,b int) int{ } ``` +### Rust +```rust +pub fn integer_break(n: i32) -> i32 { + let n = n as usize; + let mut dp = vec![0; n + 1]; + dp[2] = 1; + for i in 3..=n { + for j in 1..i-1 { + dp[i] = dp[i].max((i - j) * j).max(dp[i - j] * j); + } + } + dp[n] as i32 +} +``` + ### Javascript ```Javascript var integerBreak = function(n) { From 35ac776a7d8769ff2c13c0c233e20bdff52addb2 Mon Sep 17 00:00:00 2001 From: wjchahaha <1678912421@qq.com> Date: Tue, 9 Aug 2022 19:04:10 +0800 Subject: [PATCH 0988/3019] =?UTF-8?q?=E6=9B=B4=E6=94=B9ACM=E6=A8=A1?= =?UTF-8?q?=E5=BC=8F=E4=B8=8B=E5=A6=82=E4=BD=95=E6=9E=84=E5=BB=BA=E4=BA=8C?= =?UTF-8?q?=E5=8F=89=E6=A0=91BUG,=E4=BF=AE=E6=94=B9java&C++=E4=BB=A3?= =?UTF-8?q?=E7=A0=81.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...72\344\272\214\345\217\211\346\240\221.md" | 26 ++++++++++++++----- 1 file changed, 20 insertions(+), 6 deletions(-) diff --git "a/problems/\345\211\215\345\272\217/ACM\346\250\241\345\274\217\345\246\202\344\275\225\346\236\204\345\273\272\344\272\214\345\217\211\346\240\221.md" "b/problems/\345\211\215\345\272\217/ACM\346\250\241\345\274\217\345\246\202\344\275\225\346\236\204\345\273\272\344\272\214\345\217\211\346\240\221.md" index f2aafed6e6..01d5b25519 100644 --- "a/problems/\345\211\215\345\272\217/ACM\346\250\241\345\274\217\345\246\202\344\275\225\346\236\204\345\273\272\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/\345\211\215\345\272\217/ACM\346\250\241\345\274\217\345\246\202\344\275\225\346\236\204\345\273\272\344\272\214\345\217\211\346\240\221.md" @@ -57,11 +57,18 @@ TreeNode* construct_binary_tree(const vector& vec) { if (i == 0) root = node; } // 遍历一遍,根据规则左右孩子赋值就可以了 - // 注意这里 结束规则是 i * 2 + 2 < vec.size(),避免空指针 - for (int i = 0; i * 2 + 2 < vec.size(); i++) { + // 注意这里 结束规则是 i * 2 + 1 < vec.size(),避免空指针 + // 为什么结束规则不能是i * 2 + 2 < arr.length呢? + // 如果i * 2 + 2 < arr.length 是结束条件 + // 那么i * 2 + 1这个符合条件的节点就被忽略掉了 + // 例如[2,7,9,-1,1,9,6,-1,-1,10] 这样的一个二叉树,最后的10就会被忽略掉 + // 遍历一遍,根据规则左右孩子赋值就可以了 + + for (int i = 0; i * 2 + 1 < vec.size(); i++) { if (vecTree[i] != NULL) { // 线性存储转连式存储关键逻辑 vecTree[i]->left = vecTree[i * 2 + 1]; + if(i * 2 + 2 < vec.size()) vecTree[i]->right = vecTree[i * 2 + 2]; } } @@ -114,9 +121,10 @@ TreeNode* construct_binary_tree(const vector& vec) { vecTree[i] = node; if (i == 0) root = node; } - for (int i = 0; i * 2 + 2 < vec.size(); i++) { + for (int i = 0; i * 2 + 1 < vec.size(); i++) { if (vecTree[i] != NULL) { vecTree[i]->left = vecTree[i * 2 + 1]; + if(i * 2 + 2 < vec.size()) vecTree[i]->right = vecTree[i * 2 + 2]; } } @@ -213,7 +221,7 @@ public class Solution { static class TreeNode { // 节点值 int val; - + // 左节点 TreeNode left; @@ -249,12 +257,18 @@ public class Solution { } } // 遍历一遍,根据规则左右孩子赋值就可以了 - // 注意这里 结束规则是 i * 2 + 2 < arr.length,避免空指针 - for (int i = 0; i * 2 + 2 < arr.length; i++) { + // 注意这里 结束规则是 i * 2 + 1 < arr.length,避免空指针 + // 为什么结束规则不能是i * 2 + 2 < arr.length呢? + // 如果i * 2 + 2 < arr.length 是结束条件 + // 那么i * 2 + 1这个符合条件的节点就被忽略掉了 + // 例如[2,7,9,-1,1,9,6,-1,-1,10] 这样的一个二叉树,最后的10就会被忽略掉 + for (int i = 0; i * 2 + 1 < arr.length; i++) { TreeNode node = treeNodeList.get(i); if (node != null) { // 线性存储转连式存储关键逻辑 node.left = treeNodeList.get(2 * i + 1); + // 再次判断下 不忽略任何一个节点 + if(i * 2 + 2 < arr.length) node.right = treeNodeList.get(2 * i + 2); } } From 0012d62724742e7492c4b06a0c55ac5305ac380f Mon Sep 17 00:00:00 2001 From: cezarbbb <105843128+cezarbbb@users.noreply.github.com> Date: Tue, 9 Aug 2022 19:20:23 +0800 Subject: [PATCH 0989/3019] =?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=20Rust=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.分割等和子集 Rust版本 --- ...11\345\222\214\345\255\220\351\233\206.md" | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git "a/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" "b/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" index 83b267ac9b..03eae8ef28 100644 --- "a/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" +++ "b/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" @@ -417,7 +417,32 @@ var canPartition = function(nums) { ``` +### Rust +```Rust +impl Solution { + fn max(a: usize, b: usize) -> usize { + if a > b { a } else { b } + } + pub fn can_partition(nums: Vec) -> bool { + let nums = nums.iter().map(|x| *x as usize).collect::>(); + let mut sum = 0; + let mut dp: Vec = vec![0; 10001]; + for i in 0..nums.len() { + sum += nums[i]; + } + if sum % 2 == 1 { return false; } + let target = sum / 2; + for i in 0..nums.len() { + for j in (nums[i]..=target).rev() { + dp[j] = Self::max(dp[j], dp[j - nums[i]] + nums[i]); + } + } + if dp[target] == target { return true; } + false + } +} +``` ### C: From 2d6b09b66a0fea7412ab40002cdce4eb02da2854 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=90=B4=E7=83=A8?= Date: Wed, 10 Aug 2022 11:19:58 +0800 Subject: [PATCH 0990/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200024.=E4=B8=A4?= =?UTF-8?q?=E4=B8=A4=E4=BA=A4=E6=8D=A2=E9=93=BE=E8=A1=A8=E4=B8=AD=E7=9A=84?= =?UTF-8?q?=E8=8A=82=E7=82=B9=20PHP=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...55\347\232\204\350\212\202\347\202\271.md" | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git "a/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" "b/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" index 4b4b39e78c..5b73fb0566 100644 --- "a/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" +++ "b/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" @@ -336,5 +336,48 @@ object Solution { } ``` +PHP: +```php +//虚拟头结点 +function swapPairs($head) { + if ($head == null || $head->next == null) { + return $head; + } + + $dummyNode = new ListNode(0, $head); + $preNode = $dummyNode; //虚拟头结点 + $curNode = $head; + $nextNode = $head->next; + while($curNode && $nextNode) { + $nextNextNode = $nextNode->next; //存下一个节点 + $nextNode->next = $curNode; //交换curHead 和 nextHead + $curNode->next = $nextNextNode; + $preNode->next = $nextNode; //上一个节点的下一个指向指向nextHead + + //更新当前的几个指针 + $preNode = $preNode->next->next; + $curNode = $nextNextNode; + $nextNode = $nextNextNode->next; + } + + return $dummyNode->next; +} + +//递归版本 +function swapPairs($head) +{ + // 终止条件 + if ($head === null || $head->next === null) { + return $head; + } + + //结果要返回的头结点 + $next = $head->next; + $head->next = $this->swapPairs($next->next); //当前头结点->next指向更新 + $next->next = $head; //当前第二个节点的->next指向更新 + return $next; //返回翻转后的头结点 +} +``` + -----------------------
From d8bbb1284d8122cff0d10fbb2149e6eee40e132f Mon Sep 17 00:00:00 2001 From: wurui Date: Thu, 11 Aug 2022 17:39:41 +0800 Subject: [PATCH 0991/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20=E4=BA=8C?= =?UTF-8?q?=E5=8F=89=E6=A0=91=E5=B1=82=E5=BA=8F=E9=81=8D=E5=8E=86=E7=9A=84?= =?UTF-8?q?=E9=80=92=E5=BD=92=E9=81=8D=E5=8E=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...02\345\272\217\351\201\215\345\216\206.md" | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" index 5ef23944e1..9ad34494d8 100644 --- "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" +++ "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" @@ -205,6 +205,36 @@ class Solution { go: +```go +/** +102. 二叉树的递归遍历 + */ +func levelOrder(root *TreeNode) [][]int { + arr := [][]int{} + + depth := 0 + + var order func(root *TreeNode, depth int) + + order = func(root *TreeNode, depth int) { + if root == nil { + return + } + if len(arr) == depth { + arr = append(arr, []int{}) + } + arr[depth] = append(arr[depth], root.Val) + + order(root.Left, depth+1) + order(root.Right, depth+1) + } + + order(root, depth) + + return arr +} +``` + ```go /** 102. 二叉树的层序遍历 From ba913c8909f9cc67dd674e32410c3a0dfc632910 Mon Sep 17 00:00:00 2001 From: Glaze-sauce <1471059885@qq.com> Date: Thu, 11 Aug 2022 23:54:44 +0800 Subject: [PATCH 0992/3019] =?UTF-8?q?=E5=8A=A8=E6=80=81=E8=A7=84=E5=88=92?= =?UTF-8?q?=E7=AB=A0=E7=9A=84=200337.=E6=89=93=E5=AE=B6=E5=8A=AB=E8=88=8D3?= =?UTF-8?q?=20=E7=9A=84=20Python=20=E7=89=88=E6=9C=AC=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E5=87=BA=E7=8E=B0=E5=B0=8F=E9=94=99=E8=AF=AF=EF=BC=8C=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E4=BA=86=E6=88=91=E7=9A=84=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...345\256\266\345\212\253\350\210\215III.md" | 36 ++++++++++++------- 1 file changed, 24 insertions(+), 12 deletions(-) diff --git "a/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" "b/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" index d2add23256..fff8d3dafd 100644 --- "a/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" +++ "b/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" @@ -353,18 +353,30 @@ class Solution: # self.left = left # self.right = right class Solution: - def rob(self, root: TreeNode) -> int: - result = self.rob_tree(root) - return max(result[0], result[1]) - - def rob_tree(self, node): - if node is None: - return (0, 0) # (偷当前节点金额,不偷当前节点金额) - left = self.rob_tree(node.left) - right = self.rob_tree(node.right) - val1 = node.val + left[1] + right[1] # 偷当前节点,不能偷子节点 - val2 = max(left[0], left[1]) + max(right[0], right[1]) # 不偷当前节点,可偷可不偷子节点 - return (val1, val2) + def rob(self, root: Optional[TreeNode]) -> int: + # dp数组(dp table)以及下标的含义: + # 1. 下标为 0 记录 **不偷该节点** 所得到的的最大金钱 + # 2. 下标为 1 记录 **偷该节点** 所得到的的最大金钱 + dp = self.traversal(root) + return max(dp) + + # 要用后序遍历, 因为要通过递归函数的返回值来做下一步计算 + def traversal(self, node): + + # 递归终止条件,就是遇到了空节点,那肯定是不偷的 + if not node: + return (0, 0) + + left = self.traversal(node.left) + right = self.traversal(node.right) + + # 不偷当前节点, 偷子节点 + val_0 = max(left[0], left[1]) + max(right[0], right[1]) + + # 偷当前节点, 不偷子节点 + val_1 = node.val + left[0] + right[0] + + return (val_0, val_1) ``` ### Go From 526d24743d3b451066c5ccdc884898f02a79767d Mon Sep 17 00:00:00 2001 From: GoodLiang Date: Sat, 13 Aug 2022 11:28:00 +0800 Subject: [PATCH 0993/3019] =?UTF-8?q?Update=200077.=E7=BB=84=E5=90=88.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修改0077.组合错别字 --- "problems/0077.\347\273\204\345\220\210.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0077.\347\273\204\345\220\210.md" "b/problems/0077.\347\273\204\345\220\210.md" index 5a4811bab7..17e4fb359d 100644 --- "a/problems/0077.\347\273\204\345\220\210.md" +++ "b/problems/0077.\347\273\204\345\220\210.md" @@ -114,7 +114,7 @@ vector> result; // 存放符合条件结果的集合 vector path; // 用来存放符合条件结果 ``` -其实不定义这两个全局遍历也是可以的,把这两个变量放进递归函数的参数里,但函数里参数太多影响可读性,所以我定义全局变量了。 +其实不定义这两个全局变量也是可以的,把这两个变量放进递归函数的参数里,但函数里参数太多影响可读性,所以我定义全局变量了。 函数里一定有两个参数,既然是集合n里面取k的数,那么n和k是两个int型的参数。 From 41e677cd150572e565ddb149dd57a764c477a99d Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Sun, 14 Aug 2022 20:25:14 +0800 Subject: [PATCH 0994/3019] Update --- README.md | 144 ++++++++++++++++++++++++------------------------------ 1 file changed, 63 insertions(+), 81 deletions(-) diff --git a/README.md b/README.md index 620942dca6..3dbf2c0d87 100644 --- a/README.md +++ b/README.md @@ -4,11 +4,12 @@ > 1. **介绍**:本项目是一套完整的刷题计划,旨在帮助大家少走弯路,循序渐进学算法,[关注作者](#关于作者) > 2. **PDF版本** : [「代码随想录」算法精讲 PDF 版本](https://programmercarl.com/other/algo_pdf.html) 。 -> 3. **最强八股文:**:[代码随想录知识星球精华PDF](https://www.programmercarl.com/other/kstar_baguwen.html) -> 4. **刷题顺序** : README已经将刷题顺序排好了,按照顺序一道一道刷就可以。 -> 5. **学习社区** : 一起学习打卡/面试技巧/如何选择offer/大厂内推/职场规则/简历修改/技术分享/程序人生。欢迎加入[「代码随想录」知识星球](https://programmercarl.com/other/kstar.html) 。 -> 6. **提交代码**:本项目统一使用C++语言进行讲解,但已经有Java、Python、Go、JavaScript等等多语言版本,感谢[这里的每一位贡献者](https://github.com/youngyangyang04/leetcode-master/graphs/contributors),如果你也想贡献代码点亮你的头像,[点击这里](https://mp.weixin.qq.com/s/tqCxrMEU-ajQumL1i8im9A)了解提交代码的方式。 -> 7. **转载须知** :以下所有文章皆为我([程序员Carl](https://github.com/youngyangyang04))的原创。引用本项目文章请注明出处,发现恶意抄袭或搬运,会动用法律武器维护自己的权益。让我们一起维护一个良好的技术创作环境! +> 3. **算法公开课** : [《代码随想录》算法视频公开课](https://www.bilibili.com/video/BV1fA4y1o715) 。 +> 4. **最强八股文:**:[代码随想录知识星球精华PDF](https://www.programmercarl.com/other/kstar_baguwen.html) +> 5. **刷题顺序** : README已经将刷题顺序排好了,按照顺序一道一道刷就可以。 +> 6. **学习社区** : 一起学习打卡/面试技巧/如何选择offer/大厂内推/职场规则/简历修改/技术分享/程序人生。欢迎加入[「代码随想录」知识星球](https://programmercarl.com/other/kstar.html) 。 +> 7. **提交代码**:本项目统一使用C++语言进行讲解,但已经有Java、Python、Go、JavaScript等等多语言版本,感谢[这里的每一位贡献者](https://github.com/youngyangyang04/leetcode-master/graphs/contributors),如果你也想贡献代码点亮你的头像,[点击这里](https://mp.weixin.qq.com/s/tqCxrMEU-ajQumL1i8im9A)了解提交代码的方式。 +> 8. **转载须知** :以下所有文章皆为我([程序员Carl](https://github.com/youngyangyang04))的原创。引用本项目文章请注明出处,发现恶意抄袭或搬运,会动用法律武器维护自己的权益。让我们一起维护一个良好的技术创作环境!

@@ -141,77 +142,77 @@ ## 数组 1. [数组过于简单,但你该了解这些!](./problems/数组理论基础.md) -2. [数组:每次遇到二分法,都是一看就会,一写就废](./problems/0704.二分查找.md) -3. [数组:就移除个元素很难么?](./problems/0027.移除元素.md) -4. [数组:有序数组的平方,还有序么?](./problems/0977.有序数组的平方.md) -5. [数组:滑动窗口拯救了你](./problems/0209.长度最小的子数组.md) -6. [数组:这个循环可以转懵很多人!](./problems/0059.螺旋矩阵II.md) +2. [数组:二分查找](./problems/0704.二分查找.md) +3. [数组:移除元素](./problems/0027.移除元素.md) +4. [数组:序数组的平方](./problems/0977.有序数组的平方.md) +5. [数组:长度最小的子数组](./problems/0209.长度最小的子数组.md) +6. [数组:螺旋矩阵II](./problems/0059.螺旋矩阵II.md) 7. [数组:总结篇](./problems/数组总结篇.md) ## 链表 1. [关于链表,你该了解这些!](./problems/链表理论基础.md) -2. [链表:听说用虚拟头节点会方便很多?](./problems/0203.移除链表元素.md) -3. [链表:一道题目考察了常见的五个操作!](./problems/0707.设计链表.md) -4. [链表:听说过两天反转链表又写不出来了?](./problems/0206.翻转链表.md) +2. [链表:移除链表元素](./problems/0203.移除链表元素.md) +3. [链表:设计链表](./problems/0707.设计链表.md) +4. [链表:翻转链表](./problems/0206.翻转链表.md) 5. [链表:两两交换链表中的节点](./problems/0024.两两交换链表中的节点.md) 6. [链表:删除链表的倒数第 N 个结点](./problems/0019.删除链表的倒数第N个节点.md) 7. [链表:链表相交](./problems/面试题02.07.链表相交.md) -8. [链表:环找到了,那入口呢?](./problems/0142.环形链表II.md) +8. [链表:环形链表](./problems/0142.环形链表II.md) 9. [链表:总结篇!](./problems/链表总结篇.md) ## 哈希表 1. [关于哈希表,你该了解这些!](./problems/哈希表理论基础.md) -2. [哈希表:可以拿数组当哈希表来用,但哈希值不要太大](./problems/0242.有效的字母异位词.md) +2. [哈希表:有效的字母异位词](./problems/0242.有效的字母异位词.md) 3. [哈希表:查找常用字符](./problems/1002.查找常用字符.md) -4. [哈希表:哈希值太大了,还是得用set](./problems/0349.两个数组的交集.md) -5. [哈希表:用set来判断快乐数](./problems/0202.快乐数.md) -6. [哈希表:map等候多时了](./problems/0001.两数之和.md) -7. [哈希表:其实需要哈希的地方都能找到map的身影](./problems/0454.四数相加II.md) -8. [哈希表:这道题目我做过?](./problems/0383.赎金信.md) -9. [哈希表:解决了两数之和,那么能解决三数之和么?](./problems/0015.三数之和.md) -10. [双指针法:一样的道理,能解决四数之和](./problems/0018.四数之和.md) -11. [哈希表:总结篇!(每逢总结必经典)](./problems/哈希表总结.md) +4. [哈希表:两个数组的交集](./problems/0349.两个数组的交集.md) +5. [哈希表:快乐数](./problems/0202.快乐数.md) +6. [哈希表:两数之和](./problems/0001.两数之和.md) +7. [哈希表:四数相加II](./problems/0454.四数相加II.md) +8. [哈希表:赎金信](./problems/0383.赎金信.md) +9. [哈希表:三数之和](./problems/0015.三数之和.md) +10. [双指针法:四数之和](./problems/0018.四数之和.md) +11. [哈希表:总结篇!](./problems/哈希表总结.md) ## 字符串 -1. [字符串:这道题目,使用库函数一行代码搞定](./problems/0344.反转字符串.md) -2. [字符串:简单的反转还不够!](./problems/0541.反转字符串II.md) +1. [字符串:反转字符串](./problems/0344.反转字符串.md) +2. [字符串:反转字符串II](./problems/0541.反转字符串II.md) 3. [字符串:替换空格](./problems/剑指Offer05.替换空格.md) -4. [字符串:花式反转还不够!](./problems/0151.翻转字符串里的单词.md) -5. [字符串:反转个字符串还有这个用处?](./problems/剑指Offer58-II.左旋转字符串.md) +4. [字符串:翻转字符串里的单词](./problems/0151.翻转字符串里的单词.md) +5. [字符串:左旋转字符串](./problems/剑指Offer58-II.左旋转字符串.md) 6. [帮你把KMP算法学个通透](./problems/0028.实现strStr.md) -8. [字符串:KMP算法还能干这个!](./problems/0459.重复的子字符串.md) +8. [字符串:重复的子字符串](./problems/0459.重复的子字符串.md) 9. [字符串:总结篇!](./problems/字符串总结.md) ## 双指针法 双指针法基本都是应用在数组,字符串与链表的题目上 -1. [数组:就移除个元素很难么?](./problems/0027.移除元素.md) -2. [字符串:这道题目,使用库函数一行代码搞定](./problems/0344.反转字符串.md) +1. [数组:移除元素](./problems/0027.移除元素.md) +2. [字符串:反转字符串](./problems/0344.反转字符串.md) 3. [字符串:替换空格](./problems/剑指Offer05.替换空格.md) -4. [字符串:花式反转还不够!](./problems/0151.翻转字符串里的单词.md) -5. [链表:听说过两天反转链表又写不出来了?](./problems/0206.翻转链表.md) +4. [字符串:翻转字符串里的单词](./problems/0151.翻转字符串里的单词.md) +5. [链表:翻转链表](./problems/0206.翻转链表.md) 6. [链表:删除链表的倒数第 N 个结点](./problems/0019.删除链表的倒数第N个节点.md) 7. [链表:链表相交](./problems/面试题02.07.链表相交.md) -8. [链表:环找到了,那入口呢?](./problems/0142.环形链表II.md) -9. [哈希表:解决了两数之和,那么能解决三数之和么?](./problems/0015.三数之和.md) -10. [双指针法:一样的道理,能解决四数之和](./problems/0018.四数之和.md) -11. [双指针法:总结篇!](./problems/双指针总结.md) +8. [链表:环形链表](./problems/0142.环形链表II.md) +9. [双指针:三数之和](./problems/0015.三数之和.md) +10. [双指针:四数之和](./problems/0018.四数之和.md) +11. [双指针:总结篇!](./problems/双指针总结.md) ## 栈与队列 1. [栈与队列:来看看栈和队列不为人知的一面](./problems/栈与队列理论基础.md) -2. [栈与队列:我用栈来实现队列怎么样?](./problems/0232.用栈实现队列.md) -3. [栈与队列:用队列实现栈还有点别扭](./problems/0225.用队列实现栈.md) -4. [栈与队列:系统中处处都是栈的应用](./problems/0020.有效的括号.md) -5. [栈与队列:匹配问题都是栈的强项](./problems/1047.删除字符串中的所有相邻重复项.md) -6. [栈与队列:有没有想过计算机是如何处理表达式的?](./problems/0150.逆波兰表达式求值.md) -7. [栈与队列:滑动窗口里求最大值引出一个重要数据结构](./problems/0239.滑动窗口最大值.md) -8. [栈与队列:求前 K 个高频元素和队列有啥关系?](./problems/0347.前K个高频元素.md) +2. [栈与队列:用栈实现队列](./problems/0232.用栈实现队列.md) +3. [栈与队列:用队列实现栈](./problems/0225.用队列实现栈.md) +4. [栈与队列:有效的括号](./problems/0020.有效的括号.md) +5. [栈与队列:删除字符串中的所有相邻重复项](./problems/1047.删除字符串中的所有相邻重复项.md) +6. [栈与队列:逆波兰表达式求值](./problems/0150.逆波兰表达式求值.md) +7. [栈与队列:滑动窗口最大值](./problems/0239.滑动窗口最大值.md) +8. [栈与队列:前K个高频元素](./problems/0347.前K个高频元素.md) 9. [栈与队列:总结篇!](./problems/栈与队列总结.md) ## 二叉树 @@ -220,34 +221,34 @@ 二叉树大纲 1. [关于二叉树,你该了解这些!](./problems/二叉树理论基础.md) -2. [二叉树:一入递归深似海,从此offer是路人](./problems/二叉树的递归遍历.md) -3. [二叉树:听说递归能做的,栈也能做!](./problems/二叉树的迭代遍历.md) -4. [二叉树:前中后序迭代方式的写法就不能统一一下么?](./problems/二叉树的统一迭代法.md) -5. [二叉树:层序遍历登场!](./problems/0102.二叉树的层序遍历.md) -6. [二叉树:你真的会翻转二叉树么?](./problems/0226.翻转二叉树.md) +2. [二叉树:二叉树的递归遍历](./problems/二叉树的递归遍历.md) +3. [二叉树:二叉树的迭代遍历](./problems/二叉树的迭代遍历.md) +4. [二叉树:二叉树的统一迭代法](./problems/二叉树的统一迭代法.md) +5. [二叉树:二叉树的层序遍历](./problems/0102.二叉树的层序遍历.md) +6. [二叉树:翻转二叉树](./problems/0226.翻转二叉树.md) 7. [本周小结!(二叉树)](./problems/周总结/20200927二叉树周末总结.md) -8. [二叉树:我对称么?](./problems/0101.对称二叉树.md) -9. [二叉树:看看这些树的最大深度](./problems/0104.二叉树的最大深度.md) -10. [二叉树:看看这些树的最小深度](./problems/0111.二叉树的最小深度.md) -11. [二叉树:我有多少个节点?](./problems/0222.完全二叉树的节点个数.md) -12. [二叉树:我平衡么?](./problems/0110.平衡二叉树.md) -13. [二叉树:找我的所有路径?](./problems/0257.二叉树的所有路径.md) +8. [二叉树:对称二叉树](./problems/0101.对称二叉树.md) +9. [二叉树:二叉树的最大深度](./problems/0104.二叉树的最大深度.md) +10. [二叉树:二叉树的最小深度](./problems/0111.二叉树的最小深度.md) +11. [二叉树:完全二叉树的节点个数](./problems/0222.完全二叉树的节点个数.md) +12. [二叉树:平衡二叉树](./problems/0110.平衡二叉树.md) +13. [二叉树:二叉树的所有路径](./problems/0257.二叉树的所有路径.md) 14. [本周总结!二叉树系列二](./problems/周总结/20201003二叉树周末总结.md) -15. [二叉树:以为使用了递归,其实还隐藏着回溯](./problems/二叉树中递归带着回溯.md) -16. [二叉树:做了这么多题目了,我的左叶子之和是多少?](./problems/0404.左叶子之和.md) -17. [二叉树:我的左下角的值是多少?](./problems/0513.找树左下角的值.md) +15. [二叉树:二叉树中递归带着回溯](./problems/二叉树中递归带着回溯.md) +16. [二叉树:左叶子之和](./problems/0404.左叶子之和.md) +17. [二叉树:找树左下角的值](./problems/0513.找树左下角的值.md) 18. [二叉树:路径总和](./problems/0112.路径总和.md) -19. [二叉树:构造二叉树登场!](./problems/0106.从中序与后序遍历序列构造二叉树.md) -20. [二叉树:构造一棵最大的二叉树](./problems/0654.最大二叉树.md) +19. [二叉树:构造二叉树](./problems/0106.从中序与后序遍历序列构造二叉树.md) +20. [二叉树:最大二叉树](./problems/0654.最大二叉树.md) 21. [本周小结!(二叉树系列三)](./problems/周总结/20201010二叉树周末总结.md) 22. [二叉树:合并两个二叉树](./problems/0617.合并二叉树.md) 23. [二叉树:二叉搜索树登场!](./problems/0700.二叉搜索树中的搜索.md) -24. [二叉树:我是不是一棵二叉搜索树](./problems/0098.验证二叉搜索树.md) +24. [二叉树:验证二叉搜索树](./problems/0098.验证二叉搜索树.md) 25. [二叉树:搜索树的最小绝对差](./problems/0530.二叉搜索树的最小绝对差.md) -26. [二叉树:我的众数是多少?](./problems/0501.二叉搜索树中的众数.md) +26. [二叉树:二叉搜索树中的众数](./problems/0501.二叉搜索树中的众数.md) 27. [二叉树:公共祖先问题](./problems/0236.二叉树的最近公共祖先.md) 28. [本周小结!(二叉树系列四)](./problems/周总结/20201017二叉树周末总结.md) -29. [二叉树:搜索树的公共祖先问题](./problems/0235.二叉搜索树的最近公共祖先.md) +29. [二叉树:搜索树的最近公共祖先](./problems/0235.二叉搜索树的最近公共祖先.md) 30. [二叉树:搜索树中的插入操作](./problems/0701.二叉搜索树中的插入操作.md) 31. [二叉树:搜索树中的删除操作](./problems/0450.删除二叉搜索树中的节点.md) 32. [二叉树:修剪一棵搜索树](./problems/0669.修剪二叉搜索树.md) @@ -500,25 +501,6 @@ [各类基础算法模板](https://github.com/youngyangyang04/leetcode/blob/master/problems/算法模板.md) - - -# B站算法视频讲解 - -以下为[B站「代码随想录」](https://space.bilibili.com/525438321)算法讲解视频: - -* [KMP算法(理论篇)](https://www.bilibili.com/video/BV1PD4y1o7nd) -* [KMP算法(代码篇)](https://www.bilibili.com/video/BV1M5411j7Xx) -* [回溯算法理论基础](https://www.bilibili.com/video/BV1cy4y167mM) -* [回溯算法之组合问题(力扣题目:77.组合)](https://www.bilibili.com/video/BV1ti4y1L7cv) -* [组合问题的剪枝操作(对应力扣题目:77.组合)](https://www.bilibili.com/video/BV1wi4y157er) -* [组合总和(对应力扣题目:39.组合总和)](https://www.bilibili.com/video/BV1KT4y1M7HJ/) -* [分割回文串(对应力扣题目:131.分割回文串)](https://www.bilibili.com/video/BV1c54y1e7k6) -* [二叉树理论基础](https://www.bilibili.com/video/BV1Hy4y1t7ij) -* [二叉树的递归遍历](https://www.bilibili.com/video/BV1Wh411S7xt) -* [二叉树的非递归遍历(一)](https://www.bilibili.com/video/BV15f4y1W7i2) - -(持续更新中....) - # 贡献者 [点此这里](https://github.com/youngyangyang04/leetcode-master/graphs/contributors)查看LeetCode-Master的所有贡献者。感谢他们补充了LeetCode-Master的其他语言版本,让更多的读者收益于此项目。 From 5ec1375f7d0ac0dbdc6d11ce3d782a1c5d241c7b Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Sun, 14 Aug 2022 20:26:04 +0800 Subject: [PATCH 0995/3019] Update --- ...33\346\225\260\344\271\213\345\222\214.md" | 4 +- ...4N\344\270\252\350\212\202\347\202\271.md" | 3 + ...10\347\232\204\346\213\254\345\217\267.md" | 9 ++- ...55\347\232\204\350\212\202\347\202\271.md" | 3 +- ...01\350\247\204\345\210\222\357\274\211.md" | 2 +- ...72\346\227\213\347\237\251\351\230\265.md" | 65 +------------------ ...26\350\276\221\350\267\235\347\246\273.md" | 2 +- ...04\345\255\220\345\272\217\345\210\227.md" | 2 +- ...00\344\275\263\346\227\266\346\234\272.md" | 2 +- ...01\350\247\204\345\210\222\357\274\211.md" | 2 +- ...344\275\263\346\227\266\346\234\272III.md" | 2 +- ...\345\275\242\351\223\276\350\241\250II.md" | 3 +- ...\344\275\263\346\227\266\346\234\272IV.md" | 2 +- ...23\345\256\266\345\212\253\350\210\215.md" | 2 +- ...\345\256\266\345\212\253\350\210\215II.md" | 2 +- ...27\345\256\236\347\216\260\346\240\210.md" | 4 ++ ...36\347\216\260\351\230\237\345\210\227.md" | 11 +--- ...43\346\234\200\345\244\247\345\200\274.md" | 10 +-- ...07\345\255\220\345\272\217\345\210\227.md" | 2 +- ...53\345\206\267\345\206\273\346\234\237.md" | 2 +- ...345\256\266\345\212\253\350\210\215III.md" | 2 +- ...55\345\255\220\345\272\217\345\210\227.md" | 2 +- ...20\345\255\227\347\254\246\344\270\262.md" | 5 +- ...07\345\255\220\345\272\217\345\210\227.md" | 3 +- ...40\351\231\244\346\223\215\344\275\234.md" | 2 +- ...36\346\226\207\345\255\220\344\270\262.md" | 2 +- ...22\345\242\236\345\272\217\345\210\227.md" | 2 +- ...01\350\247\204\345\210\222\357\274\211.md" | 2 +- ...15\345\255\220\346\225\260\347\273\204.md" | 2 +- ...70\344\272\244\347\232\204\347\272\277.md" | 2 +- ...73\351\207\215\345\244\215\351\241\271.md" | 47 +++++++------- ...61\345\255\220\345\272\217\345\210\227.md" | 2 +- ...54\345\217\270\346\200\273\347\273\223.md" | 4 +- ...30\346\200\273\347\273\223\347\257\207.md" | 2 + ...22\346\200\273\347\273\223\347\257\207.md" | 1 + ...14\345\205\250\350\203\214\345\214\205.md" | 2 + 36 files changed, 88 insertions(+), 128 deletions(-) diff --git "a/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" "b/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" index d6b55fd6e1..ea7502b105 100644 --- "a/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" @@ -74,7 +74,7 @@ public: sort(nums.begin(), nums.end()); for (int k = 0; k < nums.size(); k++) { // 剪枝处理 - if (nums[k] > target && nums[k] >= 0 && target >= 0) { + if (nums[k] > target && nums[k] >= 0) { break; // 这里使用break,统一通过最后的return返回 } // 对nums[k]去重 @@ -83,7 +83,7 @@ public: } for (int i = k + 1; i < nums.size(); i++) { // 2级剪枝处理 - if (nums[k] + nums[i] > target && nums[k] + nums[i] >= 0 && target >= 0) { + if (nums[k] + nums[i] > target && nums[k] + nums[i] >= 0) { break; } diff --git "a/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" "b/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" index 3499ab9db4..65a4e383ae 100644 --- "a/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" +++ "b/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" @@ -33,6 +33,9 @@ ## 思路 +《代码随想录》算法公开课:[链表遍历学清楚! | LeetCode:19.删除链表倒数第N个节点](https://www.bilibili.com/video/BV1vW4y1U7Gf),相信结合视频在看本篇题解,更有助于大家对链表的理解。 + + 双指针的经典应用,如果要删除倒数第n个节点,让fast移动n步,然后让fast和slow同时移动,直到fast指向链表末尾。删掉slow所指向的节点就可以了。 思路是这样的,但要注意一些细节。 diff --git "a/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" "b/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" index eaf0a7191e..3c7da61b42 100644 --- "a/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" +++ "b/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" @@ -41,6 +41,9 @@ # 思路 +《代码随想录》算法视频公开课:[栈的拿手好戏!| LeetCode:20. 有效的括号](https://www.bilibili.com/video/BV1AF411w78g),相信结合视频在看本篇题解,更有助于大家对链表的理解。 + + ## 题外话 **括号匹配是使用栈解决的经典问题。** @@ -79,8 +82,10 @@ cd a/b/c/../../ 1. 第一种情况,字符串里左方向的括号多余了 ,所以不匹配。 ![括号匹配1](https://img-blog.csdnimg.cn/2020080915505387.png) + 2. 第二种情况,括号没有多余,但是 括号的类型没有匹配上。 ![括号匹配2](https://img-blog.csdnimg.cn/20200809155107397.png) + 3. 第三种情况,字符串里右方向的括号多余了,所以不匹配。 ![括号匹配3](https://img-blog.csdnimg.cn/20200809155115779.png) @@ -110,7 +115,8 @@ cd a/b/c/../../ class Solution { public: bool isValid(string s) { - stack st; + if (s.size() % 2 != 0) return false; // 如果s的长度为奇数,一定不符合要求 + stack st; for (int i = 0; i < s.size(); i++) { if (s[i] == '(') st.push(')'); else if (s[i] == '{') st.push('}'); @@ -124,6 +130,7 @@ public: return st.empty(); } }; + ``` 技巧性的东西没有固定的学习方法,还是要多看多练,自己灵活运用了。 diff --git "a/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" "b/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" index 4b4b39e78c..905a053920 100644 --- "a/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" +++ "b/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" @@ -18,7 +18,8 @@ ## 思路 -针对本题重点难点,我录制了B站讲解视频,[帮你把链表细节学清楚! | LeetCode:24. 两两交换链表中的节点](https://www.bilibili.com/video/BV1YT411g7br),相信结合视频在看本篇题解,更有助于大家对链表的理解。 +《代码随想录》算法公开课:[帮你把链表细节学清楚! | LeetCode:24. 两两交换链表中的节点](https://www.bilibili.com/video/BV1YT411g7br),相信结合视频在看本篇题解,更有助于大家对链表的理解。 + 这道题目正常模拟就可以了。 diff --git "a/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" "b/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" index 228ceade26..00f3eb84b2 100644 --- "a/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" +++ "b/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" @@ -4,7 +4,7 @@

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

-## 53. 最大子序和 +# 53. 最大子序和 [力扣题目链接](https://leetcode.cn/problems/maximum-subarray/) diff --git "a/problems/0054.\350\236\272\346\227\213\347\237\251\351\230\265.md" "b/problems/0054.\350\236\272\346\227\213\347\237\251\351\230\265.md" index 8f2691fe14..efbda5ffa8 100644 --- "a/problems/0054.\350\236\272\346\227\213\347\237\251\351\230\265.md" +++ "b/problems/0054.\350\236\272\346\227\213\347\237\251\351\230\265.md" @@ -132,69 +132,6 @@ public: * [剑指Offer 29.顺时针打印矩阵](https://leetcode.cn/problems/shun-shi-zhen-da-yin-ju-zhen-lcof/) ## 其他语言版本 -Python: -```python -class Solution: - def spiralOrder(self, matrix: List[List[int]]) -> List[int]: - m, n = len(matrix), len(matrix[0]) - left, right, up, down = 0, n - 1, 0, m - 1 # 定位四个方向的边界,闭区间 - res = [] - - while True: - for i in range(left, right + 1): # 上边,从左到右 - res.append(matrix[up][i]) - up += 1 # 上边界下移 - - if len(res) >= m * n: # 判断是否已经遍历完 - break - - for i in range(up, down + 1): # 右边,从上到下 - res.append(matrix[i][right]) - right -= 1 # 右边界左移 - - if len(res) >= m * n: - break - - for i in range(right, left - 1, -1): # 下边,从右到左 - res.append(matrix[down][i]) - down -= 1 # 下边界上移 - - if len(res) >= m * n: - break - - for i in range(down, up - 1, -1): # 左边,从下到上 - res.append(matrix[i][left]) - left += 1 # 左边界右移 - - if len(res) >= m * n: - break - - return res -``` -```python3 -class Solution: - def spiralOrder(self, matrix: List[List[int]]) -> List[int]: - r=len(matrix) - if r == 0 or len(matrix[0])==0: - return [] - c=len(matrix[0]) - res=matrix[0] - - if r>1: - for i in range (1,r): - res.append(matrix[i][c-1]) - for j in range(c-2, -1, -1): - res.append(matrix[r-1][j]) - if c>1: - for i in range(r-2, 0, -1): - res.append(matrix[i][0]) - - M=[] - for k in range(1, r-1): - e=matrix[k][1:-1] - M.append(e) - - return res+self.spiralOrder(M) -``` + -----------------------
diff --git "a/problems/0072.\347\274\226\350\276\221\350\267\235\347\246\273.md" "b/problems/0072.\347\274\226\350\276\221\350\267\235\347\246\273.md" index 641d31284d..e40461de78 100644 --- "a/problems/0072.\347\274\226\350\276\221\350\267\235\347\246\273.md" +++ "b/problems/0072.\347\274\226\350\276\221\350\267\235\347\246\273.md" @@ -4,7 +4,7 @@

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

-## 72. 编辑距离 +# 72. 编辑距离 [力扣题目链接](https://leetcode.cn/problems/edit-distance/) diff --git "a/problems/0115.\344\270\215\345\220\214\347\232\204\345\255\220\345\272\217\345\210\227.md" "b/problems/0115.\344\270\215\345\220\214\347\232\204\345\255\220\345\272\217\345\210\227.md" index 9ae0413974..fe76c3ed4a 100644 --- "a/problems/0115.\344\270\215\345\220\214\347\232\204\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0115.\344\270\215\345\220\214\347\232\204\345\255\220\345\272\217\345\210\227.md" @@ -4,7 +4,7 @@

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

-## 115.不同的子序列 +# 115.不同的子序列 [力扣题目链接](https://leetcode.cn/problems/distinct-subsequences/) diff --git "a/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" "b/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" index a577f1dda2..868c0e3e17 100644 --- "a/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" +++ "b/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" @@ -4,7 +4,7 @@

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

-## 121. 买卖股票的最佳时机 +# 121. 买卖股票的最佳时机 [力扣题目链接](https://leetcode.cn/problems/best-time-to-buy-and-sell-stock/) diff --git "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" index fa9f8842fd..98bf3e52af 100644 --- "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" +++ "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" @@ -4,7 +4,7 @@

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

-## 122.买卖股票的最佳时机II +# 122.买卖股票的最佳时机II [力扣题目链接](https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-ii/) diff --git "a/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" "b/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" index c15aaee806..947e694771 100644 --- "a/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" +++ "b/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" @@ -4,7 +4,7 @@

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

-## 123.买卖股票的最佳时机III +# 123.买卖股票的最佳时机III [力扣题目链接](https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-iii/) diff --git "a/problems/0142.\347\216\257\345\275\242\351\223\276\350\241\250II.md" "b/problems/0142.\347\216\257\345\275\242\351\223\276\350\241\250II.md" index 0b9059dc43..2054fd354c 100644 --- "a/problems/0142.\347\216\257\345\275\242\351\223\276\350\241\250II.md" +++ "b/problems/0142.\347\216\257\345\275\242\351\223\276\350\241\250II.md" @@ -24,7 +24,8 @@ ## 思路 -为了易于大家理解,我录制讲解视频:[B站:把环形链表讲清楚! ](https://www.bilibili.com/video/BV1if4y1d7ob)。结合视频在看本篇题解,事半功倍。 +《代码随想录》算法公开课:[把环形链表讲清楚!| LeetCode:142.环形链表II](https://www.bilibili.com/video/BV1if4y1d7ob),相信结合视频在看本篇题解,更有助于大家对链表的理解。 + 这道题目,不仅考察对链表的操作,而且还需要一些数学运算。 diff --git "a/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" "b/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" index 7ff198527b..8319fcba3c 100644 --- "a/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" +++ "b/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" @@ -4,7 +4,7 @@

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

-## 188.买卖股票的最佳时机IV +# 188.买卖股票的最佳时机IV [力扣题目链接](https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-iv/) diff --git "a/problems/0198.\346\211\223\345\256\266\345\212\253\350\210\215.md" "b/problems/0198.\346\211\223\345\256\266\345\212\253\350\210\215.md" index ad660f2790..6428359cf5 100644 --- "a/problems/0198.\346\211\223\345\256\266\345\212\253\350\210\215.md" +++ "b/problems/0198.\346\211\223\345\256\266\345\212\253\350\210\215.md" @@ -4,7 +4,7 @@

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

-## 198.打家劫舍 +# 198.打家劫舍 [力扣题目链接](https://leetcode.cn/problems/house-robber/) diff --git "a/problems/0213.\346\211\223\345\256\266\345\212\253\350\210\215II.md" "b/problems/0213.\346\211\223\345\256\266\345\212\253\350\210\215II.md" index d6b53a24cf..7ae7aae039 100644 --- "a/problems/0213.\346\211\223\345\256\266\345\212\253\350\210\215II.md" +++ "b/problems/0213.\346\211\223\345\256\266\345\212\253\350\210\215II.md" @@ -4,7 +4,7 @@

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

-## 213.打家劫舍II +# 213.打家劫舍II [力扣题目链接](https://leetcode.cn/problems/house-robber-ii/) diff --git "a/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" "b/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" index 17c50cd9f8..fb2851f14c 100644 --- "a/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" +++ "b/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" @@ -28,6 +28,10 @@ # 思路 + +《代码随想录》算法公开课:[队列的基本操作! | LeetCode:225. 用队列实现栈](https://www.bilibili.com/video/BV1Fd4y1K7sm),相信结合视频在看本篇题解,更有助于大家对链表的理解。 + + (这里要强调是单向队列) 有的同学可能疑惑这种题目有什么实际工程意义,**其实很多算法题目主要是对知识点的考察和教学意义远大于其工程实践的意义,所以面试题也是这样!** diff --git "a/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" "b/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" index 4dc7b794c4..7364e6c1e1 100644 --- "a/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" +++ "b/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" @@ -38,6 +38,9 @@ queue.empty(); // 返回 false ## 思路 +《代码随想录》算法公开课:[栈的基本操作! | LeetCode:232.用栈实现队列](https://www.bilibili.com/video/BV1nY4y1w7VC),相信结合视频在看本篇题解,更有助于大家对链表的理解。 + + 这是一道模拟题,不涉及到具体算法,考察的就是对栈和队列的掌握程度。 使用栈来模式队列的行为,如果仅仅用一个栈,是一定不行的,所以需要两个栈**一个输入栈,一个输出栈**,这里要注意输入栈和输出栈的关系。 @@ -170,14 +173,6 @@ class MyQueue { } } -/** - * Your MyQueue object will be instantiated and called as such: - * MyQueue obj = new MyQueue(); - * obj.push(x); - * int param_2 = obj.pop(); - * int param_3 = obj.peek(); - * boolean param_4 = obj.empty(); - */ ``` diff --git "a/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" "b/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" index 474b3a7541..6ec985069f 100644 --- "a/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" +++ "b/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" @@ -36,7 +36,7 @@ 难点是如何求一个区间里的最大值呢? (这好像是废话),暴力一下不就得了。 -暴力方法,遍历一遍的过程中每次从窗口中在找到最大的数值,这样很明显是$O(n × k)$的算法。 +暴力方法,遍历一遍的过程中每次从窗口中在找到最大的数值,这样很明显是O(n × k)的算法。 有的同学可能会想用一个大顶堆(优先级队列)来存放这个窗口里的k个数字,这样就可以知道最大的最大值是多少了, **但是问题是这个窗口是移动的,而大顶堆每次只能弹出最大值,我们无法移除其他数值,这样就造成大顶堆维护的不是滑动窗口里面的数值了。所以不能用大顶堆。** @@ -183,13 +183,13 @@ public: }; ``` -在来看一下时间复杂度,使用单调队列的时间复杂度是 $O(n)$。 +在来看一下时间复杂度,使用单调队列的时间复杂度是 O(n)。 -有的同学可能想了,在队列中 push元素的过程中,还有pop操作呢,感觉不是纯粹的$O(n)$。 +有的同学可能想了,在队列中 push元素的过程中,还有pop操作呢,感觉不是纯粹的O(n)。 -其实,大家可以自己观察一下单调队列的实现,nums 中的每个元素最多也就被 push_back 和 pop_back 各一次,没有任何多余操作,所以整体的复杂度还是 $O(n)$。 +其实,大家可以自己观察一下单调队列的实现,nums 中的每个元素最多也就被 push_back 和 pop_back 各一次,没有任何多余操作,所以整体的复杂度还是 O(n)。 -空间复杂度因为我们定义一个辅助队列,所以是$O(k)$。 +空间复杂度因为我们定义一个辅助队列,所以是O(k)。 # 扩展 diff --git "a/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" "b/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" index 41c6a7cef4..9e25689773 100644 --- "a/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" @@ -4,7 +4,7 @@

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

-## 300.最长递增子序列 +# 300.最长递增子序列 [力扣题目链接](https://leetcode.cn/problems/longest-increasing-subsequence/) diff --git "a/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" "b/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" index 3791a71f88..457721819e 100644 --- "a/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" +++ "b/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" @@ -4,7 +4,7 @@

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

-## 309.最佳买卖股票时机含冷冻期 +# 309.最佳买卖股票时机含冷冻期 [力扣题目链接](https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-with-cooldown/) diff --git "a/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" "b/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" index d2add23256..d0a2287707 100644 --- "a/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" +++ "b/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" @@ -5,7 +5,7 @@

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

-## 337.打家劫舍 III +# 337.打家劫舍 III [力扣题目链接](https://leetcode.cn/problems/house-robber-iii/) diff --git "a/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" "b/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" index dedeb0ad53..9dbafe1902 100644 --- "a/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" @@ -5,7 +5,7 @@

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

-## 392.判断子序列 +# 392.判断子序列 [力扣题目链接](https://leetcode.cn/problems/is-subsequence/) diff --git "a/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" "b/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" index 3d6df87202..69f71ee313 100644 --- "a/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" @@ -31,13 +31,16 @@ # 思路 +针对本题,我录制了视频讲解:[字符串这么玩,可有点难度! | LeetCode:459.重复的子字符串](https://www.bilibili.com/video/BV1cg41127fw),结合本题解一起看,事半功倍! + + 暴力的解法, 就是一个for循环获取 子串的终止位置, 然后判断子串是否能重复构成字符串,又嵌套一个for循环,所以是O(n^2)的时间复杂度。 有的同学可以想,怎么一个for循环就可以获取子串吗? 至少得一个for获取子串起始位置,一个for获取子串结束位置吧。 其实我们只需要判断,以第一个字母为开始的子串就可以,所以一个for循环获取子串的终止位置就行了。 而且遍历的时候 都不用遍历结束,只需要遍历到中间位置,因为子串结束位置大于中间位置的话,一定不能重复组成字符串。 -暴力的解法,这里就不讲了。 +暴力的解法,这里就不详细讲解了。 主要讲一讲移动匹配 和 KMP两种方法。 diff --git "a/problems/0516.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\345\272\217\345\210\227.md" "b/problems/0516.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\345\272\217\345\210\227.md" index 60d5e9205b..378f9b7401 100644 --- "a/problems/0516.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0516.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\345\272\217\345\210\227.md" @@ -4,7 +4,8 @@

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

-## 516.最长回文子序列 +# 516.最长回文子序列 + [力扣题目链接](https://leetcode.cn/problems/longest-palindromic-subsequence/) 给定一个字符串 s ,找到其中最长的回文子序列,并返回该序列的长度。可以假设 s 的最大长度为 1000 。 diff --git "a/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" "b/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" index 0e02e721a8..36c175c363 100644 --- "a/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" +++ "b/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" @@ -4,7 +4,7 @@

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

-## 583. 两个字符串的删除操作 +# 583. 两个字符串的删除操作 [力扣题目链接](https://leetcode.cn/problems/delete-operation-for-two-strings/) diff --git "a/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" "b/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" index fa9bf7b804..69efe7d065 100644 --- "a/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" +++ "b/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" @@ -4,7 +4,7 @@

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

-## 647. 回文子串 +# 647. 回文子串 [力扣题目链接](https://leetcode.cn/problems/palindromic-substrings/) diff --git "a/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" "b/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" index 7e4d0c19e4..c197e89789 100644 --- "a/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" +++ "b/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" @@ -4,7 +4,7 @@

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

-## 674. 最长连续递增序列 +# 674. 最长连续递增序列 [力扣题目链接](https://leetcode.cn/problems/longest-continuous-increasing-subsequence/) diff --git "a/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" "b/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" index 7734450ec1..6e4a86eb5f 100644 --- "a/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" +++ "b/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" @@ -4,7 +4,7 @@

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

-## 714.买卖股票的最佳时机含手续费 +# 714.买卖股票的最佳时机含手续费 [力扣题目链接](https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-with-transaction-fee/) diff --git "a/problems/0718.\346\234\200\351\225\277\351\207\215\345\244\215\345\255\220\346\225\260\347\273\204.md" "b/problems/0718.\346\234\200\351\225\277\351\207\215\345\244\215\345\255\220\346\225\260\347\273\204.md" index 6de8b80f43..d45f9111f7 100644 --- "a/problems/0718.\346\234\200\351\225\277\351\207\215\345\244\215\345\255\220\346\225\260\347\273\204.md" +++ "b/problems/0718.\346\234\200\351\225\277\351\207\215\345\244\215\345\255\220\346\225\260\347\273\204.md" @@ -4,7 +4,7 @@

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

-## 718. 最长重复子数组 +# 718. 最长重复子数组 [力扣题目链接](https://leetcode.cn/problems/maximum-length-of-repeated-subarray/) diff --git "a/problems/1035.\344\270\215\347\233\270\344\272\244\347\232\204\347\272\277.md" "b/problems/1035.\344\270\215\347\233\270\344\272\244\347\232\204\347\272\277.md" index 83ccb08c10..831b60c863 100644 --- "a/problems/1035.\344\270\215\347\233\270\344\272\244\347\232\204\347\272\277.md" +++ "b/problems/1035.\344\270\215\347\233\270\344\272\244\347\232\204\347\272\277.md" @@ -4,7 +4,7 @@

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

-## 1035.不相交的线 +# 1035.不相交的线 [力扣题目链接](https://leetcode.cn/problems/uncrossed-lines/) diff --git "a/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" "b/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" index 2c51bbb3ed..e22c747a48 100644 --- "a/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" +++ "b/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" @@ -32,34 +32,21 @@ # 思路 -## 题外话 - -这道题目就像是我们玩过的游戏对对碰,如果相同的元素放在挨在一起就要消除。 - -可能我们在玩游戏的时候感觉理所当然应该消除,但程序又怎么知道该如果消除呢,特别是消除之后又有新的元素可能挨在一起。 - -此时游戏的后端逻辑就可以用一个栈来实现(我没有实际考察对对碰或者爱消除游戏的代码实现,仅从原理上进行推断)。 - -游戏开发可能使用栈结构,编程语言的一些功能实现也会使用栈结构,实现函数递归调用就需要栈,但不是每种编程语言都支持递归,例如: - -![1047.删除字符串中的所有相邻重复项](https://img-blog.csdnimg.cn/20210309093252776.png) - -**递归的实现就是:每一次递归调用都会把函数的局部变量、参数值和返回地址等压入调用栈中**,然后递归返回的时候,从栈顶弹出上一次递归的各项参数,所以这就是递归为什么可以返回上一层位置的原因。 +《代码随想录》算法视频公开课:[栈的好戏还要继续!| LeetCode:1047. 删除字符串中的所有相邻重复项](https://www.bilibili.com/video/BV12a411P7mw),相信结合视频在看本篇题解,更有助于大家对本题的理解。 -相信大家应该遇到过一种错误就是栈溢出,系统输出的异常是`Segmentation fault`(当然不是所有的`Segmentation fault` 都是栈溢出导致的) ,如果你使用了递归,就要想一想是不是无限递归了,那么系统调用栈就会溢出。 - -而且**在企业项目开发中,尽量不要使用递归!**在项目比较大的时候,由于参数多,全局变量等等,使用递归很容易判断不充分return的条件,非常容易无限递归(或者递归层级过深),**造成栈溢出错误(这种问题还不好排查!)** +## 正题 -好了,题外话over,我们进入正题。 +本题要删除相邻相同元素,相对于[20. 有效的括号](https://programmercarl.com/0020.%E6%9C%89%E6%95%88%E7%9A%84%E6%8B%AC%E5%8F%B7.html)来说其实也是匹配问题,20. 有效的括号 是匹配左右括号,本题是匹配相邻元素,最后都是做消除的操作。 -## 正题 +本题也是用栈来解决的经典题目。 -本题要删除相邻相同元素,其实也是匹配问题,相同左元素相当于左括号,相同右元素就是相当于右括号,匹配上了就删除。 +那么栈里应该放的是什么元素呢? -那么再来看一下本题:可以把字符串顺序放到一个栈中,然后如果相同的话 栈就弹出,这样最后栈里剩下的元素都是相邻不相同的元素了。 +我们在删除相邻重复项的时候,其实就是要知道当前遍历的这个元素,我们在前一位是不是遍历过一样数值的元素,那么如何记录前面遍历过的元素呢? +所以就是用栈来存放,那么栈的目的,就是存放遍历过的元素,当遍历当前的这个元素的时候,去栈里看一下我们是不是遍历过相同数值的相邻元素。 -如动画所示: +然后再去做对应的消除操作。 如动画所示: ![1047.删除字符串中的所有相邻重复项](https://code-thinking.cdn.bcebos.com/gifs/1047.删除字符串中的所有相邻重复项.gif) @@ -113,6 +100,22 @@ public: }; ``` +## 题外话 + +这道题目就像是我们玩过的游戏对对碰,如果相同的元素放在挨在一起就要消除。 + +可能我们在玩游戏的时候感觉理所当然应该消除,但程序又怎么知道该如果消除呢,特别是消除之后又有新的元素可能挨在一起。 + +此时游戏的后端逻辑就可以用一个栈来实现(我没有实际考察对对碰或者爱消除游戏的代码实现,仅从原理上进行推断)。 + +游戏开发可能使用栈结构,编程语言的一些功能实现也会使用栈结构,实现函数递归调用就需要栈,但不是每种编程语言都支持递归,例如: + +**递归的实现就是:每一次递归调用都会把函数的局部变量、参数值和返回地址等压入调用栈中**,然后递归返回的时候,从栈顶弹出上一次递归的各项参数,所以这就是递归为什么可以返回上一层位置的原因。 + +相信大家应该遇到过一种错误就是栈溢出,系统输出的异常是`Segmentation fault`(当然不是所有的`Segmentation fault` 都是栈溢出导致的) ,如果你使用了递归,就要想一想是不是无限递归了,那么系统调用栈就会溢出。 + +而且**在企业项目开发中,尽量不要使用递归**!在项目比较大的时候,由于参数多,全局变量等等,使用递归很容易判断不充分return的条件,非常容易无限递归(或者递归层级过深),**造成栈溢出错误(这种问题还不好排查!)** + ## 其他语言版本 @@ -195,7 +198,7 @@ class Solution { Python: ```python -# 方法一,使用栈,推荐! +# 方法一,使用栈 class Solution: def removeDuplicates(self, s: str) -> str: res = list() diff --git "a/problems/1143.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" "b/problems/1143.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" index 4f4cb32a8b..097dc6e68a 100644 --- "a/problems/1143.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/1143.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" @@ -4,7 +4,7 @@

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

-## 1143.最长公共子序列 +# 1143.最长公共子序列 [力扣题目链接](https://leetcode.cn/problems/longest-common-subsequence/) diff --git "a/problems/\345\211\215\345\272\217/\346\267\261\345\234\263\344\272\222\350\201\224\347\275\221\345\205\254\345\217\270\346\200\273\347\273\223.md" "b/problems/\345\211\215\345\272\217/\346\267\261\345\234\263\344\272\222\350\201\224\347\275\221\345\205\254\345\217\270\346\200\273\347\273\223.md" index 3d548abbd0..f8c07016a4 100644 --- "a/problems/\345\211\215\345\272\217/\346\267\261\345\234\263\344\272\222\350\201\224\347\275\221\345\205\254\345\217\270\346\200\273\347\273\223.md" +++ "b/problems/\345\211\215\345\272\217/\346\267\261\345\234\263\344\272\222\350\201\224\347\275\221\345\205\254\345\217\270\346\200\273\347\273\223.md" @@ -22,7 +22,7 @@ * 深信服(总部深圳) * 大疆(总部深圳,无人机巨头) * 一加手机(总部深圳) -* 柔宇科技(国内领先的柔性屏幕制造商,最近正在准备上市) +* 柔宇科技(最近口碑急转直下) ## 二线大厂 @@ -66,7 +66,7 @@ ## 其他行业(有软件/互联网业务) * 三大电信运营商:中国移动、中国电信、中国联通 -* 房产企业:恒大、万科 +* 房产企业:恒大(暴雷)、万科 * 中信深圳 * 广发证券,深交所 * 珍爱网(珍爱网是国内知名的婚恋服务网站之一) diff --git "a/problems/\345\212\250\346\200\201\350\247\204\345\210\222-\350\202\241\347\245\250\351\227\256\351\242\230\346\200\273\347\273\223\347\257\207.md" "b/problems/\345\212\250\346\200\201\350\247\204\345\210\222-\350\202\241\347\245\250\351\227\256\351\242\230\346\200\273\347\273\223\347\257\207.md" index 47a9b34ba0..366810e583 100644 --- "a/problems/\345\212\250\346\200\201\350\247\204\345\210\222-\350\202\241\347\245\250\351\227\256\351\242\230\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/\345\212\250\346\200\201\350\247\204\345\210\222-\350\202\241\347\245\250\351\227\256\351\242\230\346\200\273\347\273\223\347\257\207.md" @@ -4,6 +4,8 @@

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

+# Leetcode股票问题总结篇! + 之前我们已经把力扣上股票系列的题目都讲过的,但没有来一篇股票总结,来帮大家高屋建瓴,所以总结篇这就来了! ![股票问题总结](https://code-thinking.cdn.bcebos.com/pics/%E8%82%A1%E7%A5%A8%E9%97%AE%E9%A2%98%E6%80%BB%E7%BB%93.jpg) diff --git "a/problems/\345\212\250\346\200\201\350\247\204\345\210\222\346\200\273\347\273\223\347\257\207.md" "b/problems/\345\212\250\346\200\201\350\247\204\345\210\222\346\200\273\347\273\223\347\257\207.md" index 847baa9ac3..45bd391693 100644 --- "a/problems/\345\212\250\346\200\201\350\247\204\345\210\222\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/\345\212\250\346\200\201\350\247\204\345\210\222\346\200\273\347\273\223\347\257\207.md" @@ -5,6 +5,7 @@

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

+# 动态规划最强总结篇! 如今动态规划已经讲解了42道经典题目,共50篇文章,是时候做一篇总结了。 diff --git "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" index fc4609a69b..44f7d30d94 100644 --- "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" +++ "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" @@ -3,6 +3,8 @@

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

+ + # 动态规划:关于完全背包,你该了解这些! ## 完全背包 From 8ec36e4309d91f67958529df3cd1a258f4d824ae Mon Sep 17 00:00:00 2001 From: easydonny Date: Sun, 14 Aug 2022 12:49:57 -0400 Subject: [PATCH 0996/3019] =?UTF-8?q?Update=20=E9=9D=A2=E8=AF=95=E9=A2=980?= =?UTF-8?q?2.07.=E9=93=BE=E8=A1=A8=E7=9B=B8=E4=BA=A4.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit suggest changing the title from "面试题02.07." to Leetcode question number "0160", to align with all other pages. --- ...3002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" "b/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" index abf7a2f867..8ea9c3cfe9 100644 --- "a/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" +++ "b/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" @@ -5,7 +5,7 @@

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

-# 面试题 02.07. 链表相交 +# 0160. 链表相交 [力扣题目链接](https://leetcode.cn/problems/intersection-of-two-linked-lists-lcci/) From e36dc6a5841d6aa3d719635538ee84df235c9a34 Mon Sep 17 00:00:00 2001 From: Galaxies2580 Date: Mon, 15 Aug 2022 10:22:46 +0800 Subject: [PATCH 0997/3019] Go --- ...\346\225\260Go\347\211\210\346\234\254.md" | 25 +++++++++++++++++++ ...\345\272\246Go\347\211\210\346\234\254.md" | 22 ++++++++++++++++ 2 files changed, 47 insertions(+) create mode 100644 "\346\267\273\345\212\2400222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260Go\347\211\210\346\234\254.md" create mode 100644 "\346\267\273\345\212\240559.n\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246Go\347\211\210\346\234\254.md" diff --git "a/\346\267\273\345\212\2400222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260Go\347\211\210\346\234\254.md" "b/\346\267\273\345\212\2400222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260Go\347\211\210\346\234\254.md" new file mode 100644 index 0000000000..752ace8889 --- /dev/null +++ "b/\346\267\273\345\212\2400222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260Go\347\211\210\346\234\254.md" @@ -0,0 +1,25 @@ +```go +func countNodes(root *TreeNode) int { + if root == nil { + return 0 + } + q := list.New() + q.PushBack(root) + res := 0 + for q.Len() > 0 { + n := q.Len() + for i := 0; i < n; i++ { + node := q.Remove(q.Front()).(*TreeNode) + if node.Left != nil { + q.PushBack(node.Left) + } + if node.Right != nil { + q.PushBack(node.Right) + } + res++ + } + } + return res +} +``` + diff --git "a/\346\267\273\345\212\240559.n\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246Go\347\211\210\346\234\254.md" "b/\346\267\273\345\212\240559.n\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246Go\347\211\210\346\234\254.md" new file mode 100644 index 0000000000..77ca332cd4 --- /dev/null +++ "b/\346\267\273\345\212\240559.n\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246Go\347\211\210\346\234\254.md" @@ -0,0 +1,22 @@ +```go +func maxDepth(root *Node) int { + if root == nil { + return 0 + } + q := list.New() + q.PushBack(root) + depth := 0 + for q.Len() > 0 { + n := q.Len() + for i := 0; i < n; i++ { + node := q.Remove(q.Front()).(*Node) + for j := range node.Children { + q.PushBack(node.Children[j]) + } + } + depth++ + } + return depth +} +``` + From f59621fdc5b0917f048767f64d449b6f4e7ea40b Mon Sep 17 00:00:00 2001 From: Galaxies2580 <82326525+Galaxies2580@users.noreply.github.com> Date: Mon, 15 Aug 2022 10:24:40 +0800 Subject: [PATCH 0998/3019] =?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=B0Go=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加0222.完全二叉树的节点个数Go版本 --- ...02\271\344\270\252\346\225\260Go\347\211\210\346\234\254.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/\346\267\273\345\212\2400222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260Go\347\211\210\346\234\254.md" "b/\346\267\273\345\212\2400222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260Go\347\211\210\346\234\254.md" index 752ace8889..6001e7b78c 100644 --- "a/\346\267\273\345\212\2400222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260Go\347\211\210\346\234\254.md" +++ "b/\346\267\273\345\212\2400222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260Go\347\211\210\346\234\254.md" @@ -19,7 +19,7 @@ func countNodes(root *TreeNode) int { res++ } } - return res + return res } ``` From c50085df84471905957bb5990fba5ed4825c5f9b Mon Sep 17 00:00:00 2001 From: Galaxies2580 <82326525+Galaxies2580@users.noreply.github.com> Date: Mon, 15 Aug 2022 10:25:03 +0800 Subject: [PATCH 0999/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0559.n=E5=8F=89?= =?UTF-8?q?=E6=A0=91=E7=9A=84=E6=9C=80=E5=A4=A7=E6=B7=B1=E5=BA=A6Go?= =?UTF-8?q?=E7=89=88=E6=9C=AC.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加559.n叉树的最大深度Go版本.md --- ...44\247\346\267\261\345\272\246Go\347\211\210\346\234\254.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/\346\267\273\345\212\240559.n\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246Go\347\211\210\346\234\254.md" "b/\346\267\273\345\212\240559.n\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246Go\347\211\210\346\234\254.md" index 77ca332cd4..3172837d94 100644 --- "a/\346\267\273\345\212\240559.n\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246Go\347\211\210\346\234\254.md" +++ "b/\346\267\273\345\212\240559.n\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246Go\347\211\210\346\234\254.md" @@ -16,7 +16,7 @@ func maxDepth(root *Node) int { } depth++ } - return depth + return depth } ``` From 300b8f9f3e5e0233947cb08d97ea67f4840fceb3 Mon Sep 17 00:00:00 2001 From: Yuki Chen <826992207@qq.com> Date: Thu, 18 Aug 2022 10:52:42 +0800 Subject: [PATCH 1000/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200035.=E6=90=9C?= =?UTF-8?q?=E7=B4=A2=E6=8F=92=E5=85=A5=E4=BD=8D=E7=BD=AE=20=E7=AC=AC?= =?UTF-8?q?=E4=BA=8C=E7=A7=8D=E4=BA=8C=E5=88=86=E6=B3=95Java=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...22\345\205\245\344\275\215\347\275\256.md" | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git "a/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" "b/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" index f2bbb8cada..5ed3ac5600 100644 --- "a/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" +++ "b/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" @@ -226,7 +226,32 @@ class Solution { } } ``` +```java +//第二种二分法:左闭右开 +public int searchInsert(int[] nums, int target) { + int left = 0; + int right = nums.length; + while (left < right) { //左闭右开 [left, right) + int middle = left + ((right - left) >> 1); + if (nums[middle] > target) { + right = middle; // target 在左区间,在[left, middle)中 + } else if (nums[middle] < target) { + left = middle + 1; // target 在右区间,在 [middle+1, right)中 + } else { // nums[middle] == target + return middle; // 数组中找到目标值的情况,直接返回下标 + } + } + // 目标值在数组所有元素之前 [0,0) + // 目标值插入数组中的位置 [left, right) ,return right 即可 + // 目标值在数组所有元素之后的情况 [left, right),因为是右开区间,所以 return right + return right; +} +``` + + + Golang: + ```golang // 第一种二分法 func searchInsert(nums []int, target int) int { From 708c3eefdf506d2e99df63e44826877980c981cf Mon Sep 17 00:00:00 2001 From: "xin.liu" Date: Thu, 18 Aug 2022 11:08:50 +0800 Subject: [PATCH 1001/3019] =?UTF-8?q?Update=200704.=E4=BA=8C=E5=88=86?= =?UTF-8?q?=E6=B3=95=E6=9F=A5=E6=89=BE=20JavaScript=E5=92=8CTypeScript?= =?UTF-8?q?=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...14\345\210\206\346\237\245\346\211\276.md" | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git "a/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" "b/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" index eec97a781e..53f5331aac 100644 --- "a/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" +++ "b/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" @@ -290,10 +290,11 @@ func search(nums []int, target int) int { */ var search = function(nums, target) { // right是数组最后一个数的下标,num[right]在查找范围内,是左闭右闭区间 - let left = 0, right = nums.length - 1; + let mid, left = 0, right = nums.length - 1; // 当left=right时,由于nums[right]在查找范围内,所以要包括此情况 while (left <= right) { - let mid = left + Math.floor((right - left)/2); + // 位运算 + 防止大数溢出 + mid = left + ((right - left) >> 1); // 如果中间数大于目标值,要把中间数排除查找范围,所以右边界更新为mid-1;如果右边界更新为mid,那中间数还在下次查找范围内 if (nums[mid] > target) { right = mid - 1; // 去左面闭区间寻找 @@ -316,10 +317,11 @@ var search = function(nums, target) { */ var search = function(nums, target) { // right是数组最后一个数的下标+1,nums[right]不在查找范围内,是左闭右开区间 - let left = 0, right = nums.length; + let mid, left = 0, right = nums.length; // 当left=right时,由于nums[right]不在查找范围,所以不必包括此情况 while (left < right) { - let mid = left + Math.floor((right - left)/2); + // 位运算 + 防止大数溢出 + mid = left + ((right - left) >> 1); // 如果中间值大于目标值,中间值不应在下次查找的范围内,但中间值的前一个值应在; // 由于right本来就不在查找范围内,所以将右边界更新为中间值,如果更新右边界为mid-1则将中间值的前一个值也踢出了下次寻找范围 if (nums[mid] > target) { @@ -340,9 +342,10 @@ var search = function(nums, target) { ```typescript function search(nums: number[], target: number): number { - let left: number = 0, right: number = nums.length - 1; + let mid: number, left: number = 0, right: number = nums.length - 1; while (left <= right) { - let mid: number = left + Math.floor((right - left) / 2); + // 位运算 + 防止大数溢出 + mid = left + ((right - left) >> 1); if (nums[mid] > target) { right = mid - 1; } else if (nums[mid] < target) { @@ -359,9 +362,10 @@ function search(nums: number[], target: number): number { ```typescript function search(nums: number[], target: number): number { - let left: number = 0, right: number = nums.length; + let mid: number, left: number = 0, right: number = nums.length; while (left < right) { - let mid: number = left + Math.floor((right - left) / 2); + // 位运算 + 防止大数溢出 + mid = left +((right - left) >> 1); if (nums[mid] > target) { right = mid; } else if (nums[mid] < target) { From 3fdf4484ef93ba60e5a7de589972c2c0edf2dc1c Mon Sep 17 00:00:00 2001 From: Yukun J Date: Wed, 17 Aug 2022 22:43:28 -0700 Subject: [PATCH 1002/3019] =?UTF-8?q?Update:=20=E5=A2=9E=E5=8A=A0<131.?= =?UTF-8?q?=E5=88=86=E5=89=B2=E5=9B=9E=E6=96=87=E4=B8=B2>=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...62\345\233\236\346\226\207\344\270\262.md" | 59 +++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git "a/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" "b/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" index a54d65764d..3713250390 100644 --- "a/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" +++ "b/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" @@ -206,6 +206,65 @@ public: return result; } }; +``` +# 优化 + +上面的代码还存在一定的优化空间, 在于如何更高效的计算一个子字符串是否是回文字串。上述代码```isPalindrome```函数运用双指针的方法来判定对于一个字符串```s```, 给定起始下标和终止下标, 截取出的子字符串是否是回文字串。但是其中有一定的重复计算存在: + +例如给定字符串```"abcde"```, 在已知```"bcd"```不是回文字串时, 不再需要去双指针操作```"abcde"```而可以直接判定它一定不是回文字串。 + +具体来说, 给定一个字符串`s`, 长度为```n```, 它成为回文字串的充分必要条件是```s[0] == s[n-1]```且```s[1:n-1]```是回文字串。 + +大家如果熟悉动态规划这种算法的话, 我们可以高效地事先一次性计算出, 针对一个字符串```s```, 它的任何子串是否是回文字串, 然后在我们的回溯函数中直接查询即可, 省去了双指针移动判定这一步骤. + +具体参考代码如下: + +```CPP +class Solution { +private: + vector> result; + vector path; // 放已经回文的子串 + vector> isPalindrome; // 放事先计算好的是否回文子串的结果 + void backtracking (const string& s, int startIndex) { + // 如果起始位置已经大于s的大小,说明已经找到了一组分割方案了 + if (startIndex >= s.size()) { + result.push_back(path); + return; + } + for (int i = startIndex; i < s.size(); i++) { + if (isPalindrome[startIndex][i]) { // 是回文子串 + // 获取[startIndex,i]在s中的子串 + string str = s.substr(startIndex, i - startIndex + 1); + path.push_back(str); + } else { // 不是回文,跳过 + continue; + } + backtracking(s, i + 1); // 寻找i+1为起始位置的子串 + path.pop_back(); // 回溯过程,弹出本次已经填在的子串 + } + } + void computePalindrome(const string& s) { + // isPalindrome[i][j] 代表 s[i:j](双边包括)是否是回文字串 + isPalindrome.resize(s.size(), vector(s.size(), false)); // 根据字符串s, 刷新布尔矩阵的大小 + for (int i = s.size() - 1; i >= 0; i--) { + // 需要倒序计算, 保证在i行时, i+1行已经计算好了 + for (int j = i; j < s.size(); j++) { + if (j == i) {isPalindrome[i][j] = true;} + else if (j - i == 1) {isPalindrome[i][j] = (s[i] == s[j]);} + else {isPalindrome[i][j] = (s[i] == s[j] && isPalindrome[i+1][j-1]);} + } + } + } +public: + vector> partition(string s) { + result.clear(); + path.clear(); + computePalindrome(s); + backtracking(s, 0); + return result; + } +}; + ``` # 总结 From 736ae6a2076393b97555ed14fa299e8f656adc33 Mon Sep 17 00:00:00 2001 From: Jack_ZhijieFang <56966563+laerpeeK@users.noreply.github.com> Date: Thu, 18 Aug 2022 15:16:59 +0800 Subject: [PATCH 1003/3019] =?UTF-8?q?Update=200015.=E4=B8=89=E6=95=B0?= =?UTF-8?q?=E4=B9=8B=E5=92=8C.md=20typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Update 0015.三数之和.md typescript版本。添加提前跳出循环判断条件。 --- .../0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" | 3 +++ 1 file changed, 3 insertions(+) diff --git "a/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" "b/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" index da319866fc..a4b6b84d98 100644 --- "a/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" @@ -493,6 +493,9 @@ function threeSum(nums: number[]): number[][] { right: number = length - 1; let resArr: number[][] = []; for (let i = 0; i < length; i++) { + if (nums[i]>0) { + return resArr; //nums经过排序后,只要nums[i]>0, 此后的nums[i] + nums[left] + nums[right]均大于0,可以提前终止循环。 + } if (i > 0 && nums[i] === nums[i - 1]) { continue; } From 642734522dcb0aa693ab651a6591fd315a721db2 Mon Sep 17 00:00:00 2001 From: ekertree Date: Thu, 18 Aug 2022 20:07:34 +0800 Subject: [PATCH 1004/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200844=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=20Java=20=E7=89=88=E6=9C=AC=20=E5=88=A0=E9=99=A4=20Ja?= =?UTF-8?q?va=E6=A0=87=E9=A2=98=E7=9A=84=E5=86=92=E5=8F=B7=20=E7=BB=9F?= =?UTF-8?q?=E4=B8=80=E9=A1=B5=E9=9D=A2=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...04\345\255\227\347\254\246\344\270\262.md" | 75 ++++++++++++++++++- 1 file changed, 74 insertions(+), 1 deletion(-) diff --git "a/problems/0844.\346\257\224\350\276\203\345\220\253\351\200\200\346\240\274\347\232\204\345\255\227\347\254\246\344\270\262.md" "b/problems/0844.\346\257\224\350\276\203\345\220\253\351\200\200\346\240\274\347\232\204\345\255\227\347\254\246\344\270\262.md" index f7823e59f8..5d29ffb07b 100644 --- "a/problems/0844.\346\257\224\350\276\203\345\220\253\351\200\200\346\240\274\347\232\204\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/0844.\346\257\224\350\276\203\345\220\253\351\200\200\346\240\274\347\232\204\345\255\227\347\254\246\344\270\262.md" @@ -157,7 +157,7 @@ public: ## 其他语言版本 -### Java: +### Java ```java // 普通方法(使用栈的思路) @@ -214,7 +214,80 @@ public static boolean backspaceCompare(String s, String t) { } ``` +```java +class Solution { + public static boolean backspaceCompare(String s, String t) { + return getStr(s).equals(getStr(t)); + } + + public static String getStr(String s) { //使用快慢双指针去除字符串中的# + int slowIndex; + int fastIndex = 0; + StringBuilder builder = new StringBuilder(s); //StringBuilder用于修改字符串 + for(slowIndex = 0; fastIndex < s.length(); fastIndex++) { + if(builder.charAt(fastIndex) != '#') { + builder.setCharAt(slowIndex++,builder.charAt(fastIndex)); + } else { + if(slowIndex > 0) { + slowIndex--; + } + } + } + return builder.toString().substring(0,slowIndex); //截取有效字符串 + } +} +``` +从后往前双指针: + +```java +class Solution { + public static boolean backspaceCompare(String s, String t) { + int sSkipNum = 0; //记录s的#的个数 + int tSkipNum = 0; //记录t的#的个数 + int sIndex = s.length() - 1; + int tIndex = t.length() - 1; + while(true) { + while(sIndex >= 0) { //每次记录连续的#并跳过被删除的字符 + if(s.charAt(sIndex) == '#') { + sSkipNum++; + } else { + if(sSkipNum > 0) { + sSkipNum--; + } else { + break; + } + } + sIndex--; + } + while(tIndex >= 0) { //每次记录连续的#并跳过被删除的字符 + if(t.charAt(tIndex) == '#') { + tSkipNum++; + } else { + if(tSkipNum > 0) { + tSkipNum--; + } else { + break; + } + } + tIndex--; + } + if(sIndex < 0 || tIndex < 0) { //s 或者 t遍历完了 + break; + } + if(s.charAt(sIndex) != t.charAt(tIndex)) { //当前下标的字符不相等 + return false; + } + sIndex--; + tIndex--; + } + if(sIndex == -1 && tIndex == -1) { //同时遍历完 则相等 + return true; + } + return false; + } +} +``` ### python From 058f64624a062083aeb78ea5589c6e22ce444a12 Mon Sep 17 00:00:00 2001 From: wang2jun <91008685+wang2jun@users.noreply.github.com> Date: Fri, 19 Aug 2022 10:42:17 +0800 Subject: [PATCH 1005/3019] =?UTF-8?q?0100=E7=9B=B8=E5=90=8C=E7=9A=84?= =?UTF-8?q?=E6=A0=91=20=E5=A2=9E=E5=8A=A0=20js=20=E8=BF=AD=E4=BB=A3?= =?UTF-8?q?=E6=B3=95=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...70\345\220\214\347\232\204\346\240\221.md" | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git "a/problems/0100.\347\233\270\345\220\214\347\232\204\346\240\221.md" "b/problems/0100.\347\233\270\345\220\214\347\232\204\346\240\221.md" index 4b6eb7aa4f..9820173d8e 100644 --- "a/problems/0100.\347\233\270\345\220\214\347\232\204\346\240\221.md" +++ "b/problems/0100.\347\233\270\345\220\214\347\232\204\346\240\221.md" @@ -253,6 +253,28 @@ var isSameTree = function (p, q) { return isSameTree(p.left, q.left) && isSameTree(p.right, q.right); }; ``` +> 迭代法 + +```javascript +var isSameTree = (p, q) => { + const queue = [{ p, q }]; + // 这是用{ } 解决了null的问题! + while (queue.length) { + const cur = queue.shift(); + if (cur.p == null && cur.q == null) continue; + if (cur.p == null || cur.q == null) return false; + if (cur.p.val != cur.q.val) return false; + queue.push({ + p: cur.p.left, + q: cur.q.left + }, { + p: cur.p.right, + q: cur.q.right + }); + } + return true; +}; +``` TypeScript: From 10734b6f20a881532b74f6313023717830e756dd Mon Sep 17 00:00:00 2001 From: marspere <1587393449@qq.com> Date: Fri, 19 Aug 2022 10:50:33 +0800 Subject: [PATCH 1006/3019] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=A0=91=E5=B1=82=E5=BA=8F=E9=81=8D=E5=8E=86116=E5=92=8C117?= =?UTF-8?q?=E9=A2=98=E7=9A=84go=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...02\345\272\217\351\201\215\345\216\206.md" | 69 +++++++++---------- 1 file changed, 33 insertions(+), 36 deletions(-) diff --git "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" index 9ad34494d8..69f2f5942d 100644 --- "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" +++ "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" @@ -1891,36 +1891,35 @@ go: */ func connect(root *Node) *Node { - res:=[][]*Node{} - if root==nil{//防止为空 + if root == nil { //防止为空 return root } - queue:=list.New() + queue := list.New() queue.PushBack(root) - var tmpArr []*Node - for queue.Len()>0 { - length:=queue.Len()//保存当前层的长度,然后处理当前层(十分重要,防止添加下层元素影响判断层中元素的个数) - for i:=0;i 0 { + length := queue.Len() //保存当前层的长度,然后处理当前层(十分重要,防止添加下层元素影响判断层中元素的个数) + for i := 0; i < length; i++ { + node := queue.Remove(queue.Front()).(*Node) //出队列 + if node.Left != nil { queue.PushBack(node.Left) } - if node.Right!=nil{ + if node.Right != nil { queue.PushBack(node.Right) } - tmpArr=append(tmpArr,node)//将值加入本层切片中 + tmpArr = append(tmpArr, node) //将值加入本层切片中 } - res=append(res,tmpArr)//放入结果集 - tmpArr=[]*Node{}//清空层的数据 - } - //遍历每层元素,指定next - for i:=0;i 1 { + // 遍历每层元素,指定next + for i := 0; i < len(tmpArr)-1; i++ { + tmpArr[i].Next = tmpArr[i+1] + } } + tmpArr = []*Node{} //清空层的数据 } return root } + ``` Swift: @@ -2172,33 +2171,31 @@ go: */ func connect(root *Node) *Node { - res:=[][]*Node{} - if root==nil{//防止为空 + if root == nil { //防止为空 return root } - queue:=list.New() + queue := list.New() queue.PushBack(root) - var tmpArr []*Node - for queue.Len()>0 { - length:=queue.Len()//保存当前层的长度,然后处理当前层(十分重要,防止添加下层元素影响判断层中元素的个数) - for i:=0;i 0 { + length := queue.Len() //保存当前层的长度,然后处理当前层(十分重要,防止添加下层元素影响判断层中元素的个数) + for i := 0; i < length; i++ { + node := queue.Remove(queue.Front()).(*Node) //出队列 + if node.Left != nil { queue.PushBack(node.Left) } - if node.Right!=nil{ + if node.Right != nil { queue.PushBack(node.Right) } - tmpArr=append(tmpArr,node)//将值加入本层切片中 + tmpArr = append(tmpArr, node) //将值加入本层切片中 } - res=append(res,tmpArr)//放入结果集 - tmpArr=[]*Node{}//清空层的数据 - } - //遍历每层元素,指定next - for i:=0;i 1 { + // 遍历每层元素,指定next + for i := 0; i < len(tmpArr)-1; i++ { + tmpArr[i].Next = tmpArr[i+1] + } } + tmpArr = []*Node{} //清空层的数据 } return root } From 4f71ddc10fdacabdb14acfd53cbcee7bb0d7e996 Mon Sep 17 00:00:00 2001 From: marspere <1587393449@qq.com> Date: Fri, 19 Aug 2022 11:28:57 +0800 Subject: [PATCH 1007/3019] =?UTF-8?q?Update=200102:=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=A0=91=E5=B1=82=E5=BA=8F=E9=81=8D=E5=8E=86?= =?UTF-8?q?=E4=B8=AD515=E9=A2=98=E7=9A=84go=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...02\345\272\217\351\201\215\345\216\206.md" | 52 +++++++++---------- 1 file changed, 24 insertions(+), 28 deletions(-) diff --git "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" index 69f2f5942d..a1a7baeda5 100644 --- "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" +++ "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" @@ -1552,44 +1552,40 @@ go: 515. 在每个树行中找最大值 */ func largestValues(root *TreeNode) []int { - res:=[][]int{} - var finRes []int - if root==nil{//防止为空 - return finRes + if root == nil { + //防止为空 + return nil } - queue:=list.New() + queue := list.New() queue.PushBack(root) - var tmpArr []int - //层次遍历 - for queue.Len()>0 { - length:=queue.Len()//保存当前层的长度,然后处理当前层(十分重要,防止添加下层元素影响判断层中元素的个数) - for i:=0;i 0 { + //保存当前层的长度,然后处理当前层(十分重要,防止添加下层元素影响判断层中元素的个数) + length := queue.Len() + for i := 0; i < length; i++ { + node := queue.Remove(queue.Front()).(*TreeNode)//出队列 + // 比较当前层中的最大值和新遍历的元素大小,取两者中大值 + temp = max(temp, node.Val) + if node.Left != nil { queue.PushBack(node.Left) } - if node.Right!=nil{ + if node.Right != nil { queue.PushBack(node.Right) } - tmpArr=append(tmpArr,node.Val)//将值加入本层切片中 } - res=append(res,tmpArr)//放入结果集 - tmpArr=[]int{}//清空层的数据 + ans = append(ans, temp) + temp = math.MinInt64 } - //找到每层的最大值 - for i:=0;i max { - max = val - } + +func max(x, y int) int { + if x > y { + return x } - return max + return y } ``` From 33c079738631c552185ba8476c893b90ecf477d0 Mon Sep 17 00:00:00 2001 From: marspere <1587393449@qq.com> Date: Fri, 19 Aug 2022 13:50:48 +0800 Subject: [PATCH 1008/3019] =?UTF-8?q?Update=200102:=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=A0=91=E7=9A=84=E5=B1=82=E5=BA=8F=E9=81=8D?= =?UTF-8?q?=E5=8E=86=E4=B8=AD637=E9=A2=98=E7=9A=84go=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...02\345\272\217\351\201\215\345\216\206.md" | 46 ++++++++----------- 1 file changed, 20 insertions(+), 26 deletions(-) diff --git "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" index a1a7baeda5..25189dba5a 100644 --- "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" +++ "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" @@ -1054,40 +1054,34 @@ go: 637. 二叉树的层平均值 */ func averageOfLevels(root *TreeNode) []float64 { - res:=[][]int{} - var finRes []float64 - if root==nil{//防止为空 - return finRes + if root == nil { + // 防止为空 + return nil } - queue:=list.New() + res := make([]float64, 0) + queue := list.New() queue.PushBack(root) - var tmpArr []int - for queue.Len()>0 { - length:=queue.Len()//保存当前层的长度,然后处理当前层(十分重要,防止添加下层元素影响判断层中元素的个数) - for i:=0;i 0 { + //保存当前层的长度,然后处理当前层(十分重要,防止添加下层元素影响判断层中元素的个数) + length := queue.Len() + for i := 0; i < length; i++ { + node := queue.Remove(queue.Front()).(*TreeNode) + if node.Left != nil { queue.PushBack(node.Left) } - if node.Right!=nil{ + if node.Right != nil { queue.PushBack(node.Right) } - tmpArr=append(tmpArr,node.Val)//将值加入本层切片中 - } - res=append(res,tmpArr)//放入结果集 - tmpArr=[]int{}//清空层的数据 - } - //计算每层的平均值 - length:=len(res) - for i:=0;i Date: Fri, 19 Aug 2022 13:56:47 +0800 Subject: [PATCH 1009/3019] =?UTF-8?q?Update=200102:=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=A0=91=E7=9A=84=E5=B1=82=E5=BA=8F=E9=81=8D?= =?UTF-8?q?=E5=8E=86=E4=B8=AD199=E9=A2=98=E7=9A=84go=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...02\345\272\217\351\201\215\345\216\206.md" | 35 +++++++++---------- 1 file changed, 16 insertions(+), 19 deletions(-) diff --git "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" index 25189dba5a..0063f36e1d 100644 --- "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" +++ "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" @@ -810,33 +810,30 @@ go: 199. 二叉树的右视图 */ func rightSideView(root *TreeNode) []int { - queue:=list.New() - res:=[][]int{} - var finaRes []int - if root==nil{ - return finaRes + if root == nil { + return nil } + res := make([]int, 0) + queue := list.New() queue.PushBack(root) - for queue.Len()>0{ - length:=queue.Len() - tmp:=[]int{} - for i:=0;i 0 { + length := queue.Len() + for i := 0; i < length; i++ { + node := queue.Remove(queue.Front()).(*TreeNode) + if node.Left != nil { queue.PushBack(node.Left) } - if node.Right!=nil{ + if node.Right != nil { queue.PushBack(node.Right) } - tmp=append(tmp,node.Val) + // 取每层的最后一个元素,添加到结果集中 + if i == length-1 { + res = append(res, node.Val) + } } - res=append(res,tmp) - } - //取每一层的最后一个元素 - for i:=0;i Date: Fri, 19 Aug 2022 16:52:06 +0800 Subject: [PATCH 1010/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B00129.=E6=B1=82?= =?UTF-8?q?=E6=A0=B9=E5=88=B0=E5=8F=B6=E5=AD=90=E7=BB=93=E7=82=B9=E6=95=B0?= =?UTF-8?q?=E5=AD=97=E4=B9=8B=E5=92=8C=E4=B8=AD=EF=BC=8Cgo=E8=AF=AD?= =?UTF-8?q?=E8=A8=80=E4=BB=A3=E7=A0=81=E6=97=A0=E6=B3=95=E9=80=9A=E8=BF=87?= =?UTF-8?q?leetcode=E7=9A=84=E8=AF=AD=E6=B3=95=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修改了原本的go代码的错误(原本的go代码无法通过leetcode的题目执行,有语法错误) --- ...60\345\255\227\344\271\213\345\222\214.md" | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git "a/problems/0129.\346\261\202\346\240\271\345\210\260\345\217\266\345\255\220\350\212\202\347\202\271\346\225\260\345\255\227\344\271\213\345\222\214.md" "b/problems/0129.\346\261\202\346\240\271\345\210\260\345\217\266\345\255\220\350\212\202\347\202\271\346\225\260\345\255\227\344\271\213\345\222\214.md" index 92a72fe328..859df39e6f 100644 --- "a/problems/0129.\346\261\202\346\240\271\345\210\260\345\217\266\345\255\220\350\212\202\347\202\271\346\225\260\345\255\227\344\271\213\345\222\214.md" +++ "b/problems/0129.\346\261\202\346\240\271\345\210\260\345\217\266\345\255\220\350\212\202\347\202\271\346\225\260\345\255\227\344\271\213\345\222\214.md" @@ -250,22 +250,22 @@ Go: ```go func sumNumbers(root *TreeNode) int { - sum = 0 - travel(root, root.Val) - return sum + sum := 0 + dfs(root, root.Val, &sum) + return sum } -func travel(root *TreeNode, tmpSum int) { - if root.Left == nil && root.Right == nil { - sum += tmpSum - } else { - if root.Left != nil { - travel(root.Left, tmpSum*10+root.Left.Val) - } - if root.Right != nil { - travel(root.Right, tmpSum*10+root.Right.Val) - } - } +func dfs(root *TreeNode, tmpSum int, sum *int) { + if root.Left == nil && root.Right == nil { + *sum += tmpSum + } else { + if root.Left != nil { + dfs(root.Left, tmpSum*10 + root.Left.Val, sum) + } + if root.Right != nil { + dfs(root.Right, tmpSum*10 + root.Right.Val, sum) + } + } } ``` From 87a51bcb6916834fa98dc6f2d3dd1f0df69a6ac9 Mon Sep 17 00:00:00 2001 From: SwaggyP <1352164869@qq.com> Date: Sat, 20 Aug 2022 09:53:47 +0800 Subject: [PATCH 1011/3019] =?UTF-8?q?=E5=A2=9E=E5=8A=A00100.=E7=9B=B8?= =?UTF-8?q?=E5=90=8C=E7=9A=84=E6=A0=91go=E8=AF=AD=E8=A8=80=E7=9A=84?= =?UTF-8?q?=E9=80=92=E5=BD=92=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 增加了0100.相同的树go语言的递归解法 --- ...70\345\220\214\347\232\204\346\240\221.md" | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git "a/problems/0100.\347\233\270\345\220\214\347\232\204\346\240\221.md" "b/problems/0100.\347\233\270\345\220\214\347\232\204\346\240\221.md" index 4b6eb7aa4f..0057a85e1f 100644 --- "a/problems/0100.\347\233\270\345\220\214\347\232\204\346\240\221.md" +++ "b/problems/0100.\347\233\270\345\220\214\347\232\204\346\240\221.md" @@ -237,6 +237,26 @@ class Solution: return True ``` Go: +> 递归法 +```go +func isSameTree(p *TreeNode, q *TreeNode) bool { + if p != nil && q == nil { + return false + } + if p == nil && q != nil { + return false + } + if p == nil && q == nil { + return true + } + if p.Val != q.Val { + return false + } + Left := isSameTree(p.Left, q.Left) + Right := isSameTree(p.Right, q.Right) + return Left && Right +} +``` JavaScript: From 6a201720030faa7a70abcc313c1aa756245f3329 Mon Sep 17 00:00:00 2001 From: AronJudge <2286381138@qq.com> Date: Sat, 20 Aug 2022 10:38:58 +0800 Subject: [PATCH 1012/3019] =?UTF-8?q?463=20=E5=B2=9B=E5=B1=BF=E7=9A=84?= =?UTF-8?q?=E5=91=A8=E9=95=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 更新Java的方法二 --- ...77\347\232\204\345\221\250\351\225\277.md" | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git "a/problems/0463.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" "b/problems/0463.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" index ea0381402d..3dc69f20d8 100644 --- "a/problems/0463.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" +++ "b/problems/0463.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" @@ -118,6 +118,27 @@ class Solution { return res; } } + +// 解法二 +class Solution { + public int islandPerimeter(int[][] grid) { + // 计算岛屿的周长 + // 方法二 : 遇到相邻的陆地总周长就-2 + int landSum = 0; // 陆地数量 + int cover = 0; // 相邻陆地数量 + for (int i = 0; i < grid.length; i++) { + for (int j = 0; j < grid[0].length; j++) { + if (grid[i][j] == 1) { + landSum++; + // 统计上面和左边的相邻陆地 + if(i - 1 >= 0 && grid[i-1][j] == 1) cover++; + if(j - 1 >= 0 && grid[i][j-1] == 1) cover++; + } + } + } + return landSum * 4 - cover * 2; + } +} ``` Python: From d53246138d67e2054b54bd30b596cc4e427ee25a Mon Sep 17 00:00:00 2001 From: Yuki Chen <826992207@qq.com> Date: Sat, 20 Aug 2022 11:54:39 +0800 Subject: [PATCH 1013/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A00027.=E7=A7=BB?= =?UTF-8?q?=E9=99=A4=E5=85=83=E7=B4=A0=20=E7=9B=B8=E5=90=91=E5=8F=8C?= =?UTF-8?q?=E6=8C=87=E9=92=88=E6=B3=95Java=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...73\351\231\244\345\205\203\347\264\240.md" | 26 +++++++++++++++---- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git "a/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" "b/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" index 12f88c75df..68b1d4bd58 100644 --- "a/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" +++ "b/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" @@ -146,7 +146,7 @@ public: }; ``` - + ## 相关题目推荐 * 26.删除排序数组中的重复项 @@ -154,10 +154,6 @@ public: * 844.比较含退格的字符串 * 977.有序数组的平方 - - - - ## 其他语言版本 @@ -180,6 +176,26 @@ class Solution { } } ``` +```java +//相向双指针法 +class Solution { + public int removeElement(int[] nums, int val) { + int left = 0; + int right = nums.length - 1; + while(right >= 0 && nums[right] == val) right--; //将right移到从右数第一个值不为val的位置 + while(left <= right) { + if(nums[left] == val) { //left位置的元素需要移除 + //将right位置的元素移到left(覆盖),right位置移除 + nums[left] = nums[right]; + right--; + } + left++; + while(right >= 0 && nums[right] == val) right--; + } + return left; + } +} +``` Python: From b2534f7993018e497670e05fdf258830a1f4b69b Mon Sep 17 00:00:00 2001 From: AronJudge <2286381138@qq.com> Date: Sat, 20 Aug 2022 16:50:29 +0800 Subject: [PATCH 1014/3019] =?UTF-8?q?05=20=E6=9C=80=E9=95=BF=E5=9B=9E?= =?UTF-8?q?=E6=96=87=E5=AD=90=E4=B8=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 更新Java动态绘画方法, 之前的根本就不是这个题 --- ...36\346\226\207\345\255\220\344\270\262.md" | 44 +++++++++++++------ 1 file changed, 31 insertions(+), 13 deletions(-) diff --git "a/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" "b/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" index d53acf63e6..893525d23f 100644 --- "a/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" +++ "b/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" @@ -263,21 +263,39 @@ public: Java: ```java -public int[] twoSum(int[] nums, int target) { - int[] res = new int[2]; - if(nums == null || nums.length == 0){ - return res; - } - Map map = new HashMap<>(); - for(int i = 0; i < nums.length; i++){ - int temp = target - nums[i]; - if(map.containsKey(temp)){ - res[1] = i; - res[0] = map.get(temp); +// 双指针 动态规划 +class Solution { + public String longestPalindrome(String s) { + if (s.length() == 0 || s.length() == 1) return s; + int length = 1; + int index = 0; + boolean[][] palindrome = new boolean[s.length()][s.length()]; + for (int i = 0; i < s.length(); i++) { + palindrome[i][i] = true; + } + + for (int L = 2; L <= s.length(); L++) { + for (int i = 0; i < s.length(); i++) { + int j = i + L - 1; + if (j >= s.length()) break; + + if (s.charAt(i) != s.charAt(j)) { + palindrome[i][j] = false; + } else { + if (j - i < 3) { + palindrome[i][j] = true; + } else { + palindrome[i][j] = palindrome[i + 1][j - 1]; + } + } + if (palindrome[i][j] && j - i + 1 > length) { + length = j - i + 1; + index = i; + } + } } - map.put(nums[i], i); + return s.substring(index, index + length); } - return res; } ``` From a97a7ef2ece2b73f87c196e01037508d1f197deb Mon Sep 17 00:00:00 2001 From: AronJudge <2286381138@qq.com> Date: Sat, 20 Aug 2022 16:50:29 +0800 Subject: [PATCH 1015/3019] =?UTF-8?q?05=20=E6=9C=80=E9=95=BF=E5=9B=9E?= =?UTF-8?q?=E6=96=87=E5=AD=90=E4=B8=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 更新Java动态规划方法 之前的根本就不是这个题 --- ...36\346\226\207\345\255\220\344\270\262.md" | 43 +++++++++++++------ 1 file changed, 30 insertions(+), 13 deletions(-) diff --git "a/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" "b/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" index d53acf63e6..b9b568ab35 100644 --- "a/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" +++ "b/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" @@ -263,21 +263,38 @@ public: Java: ```java -public int[] twoSum(int[] nums, int target) { - int[] res = new int[2]; - if(nums == null || nums.length == 0){ - return res; - } - Map map = new HashMap<>(); - for(int i = 0; i < nums.length; i++){ - int temp = target - nums[i]; - if(map.containsKey(temp)){ - res[1] = i; - res[0] = map.get(temp); +// 双指针 动态规划 +class Solution { + public String longestPalindrome(String s) { + if (s.length() == 0 || s.length() == 1) return s; + int length = 1; + int index = 0; + boolean[][] palindrome = new boolean[s.length()][s.length()]; + for (int i = 0; i < s.length(); i++) { + palindrome[i][i] = true; + } + + for (int L = 2; L <= s.length(); L++) { + for (int i = 0; i < s.length(); i++) { + int j = i + L - 1; + if (j >= s.length()) break; + if (s.charAt(i) != s.charAt(j)) { + palindrome[i][j] = false; + } else { + if (j - i < 3) { + palindrome[i][j] = true; + } else { + palindrome[i][j] = palindrome[i + 1][j - 1]; + } + } + if (palindrome[i][j] && j - i + 1 > length) { + length = j - i + 1; + index = i; + } + } } - map.put(nums[i], i); + return s.substring(index, index + length); } - return res; } ``` From 8e3524d482764d29e3237cc85bc6daceb4c82b53 Mon Sep 17 00:00:00 2001 From: ekertree Date: Sat, 20 Aug 2022 21:02:18 +0800 Subject: [PATCH 1016/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=2054.=E8=9E=BA?= =?UTF-8?q?=E6=97=8B=E7=9F=A9=E9=98=B5=20Java=20=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...72\346\227\213\347\237\251\351\230\265.md" | 68 +++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git "a/problems/0054.\350\236\272\346\227\213\347\237\251\351\230\265.md" "b/problems/0054.\350\236\272\346\227\213\347\237\251\351\230\265.md" index efbda5ffa8..aeb8e52155 100644 --- "a/problems/0054.\350\236\272\346\227\213\347\237\251\351\230\265.md" +++ "b/problems/0054.\350\236\272\346\227\213\347\237\251\351\230\265.md" @@ -133,5 +133,73 @@ public: ## 其他语言版本 +### Java + +```java +class Solution { + public List spiralOrder(int[][] matrix) { + //存放数组的数 + List ans = new ArrayList<>(); + //列数 + int columns = matrix[0].length; + //行数 + int rows = matrix.length; + //遍历起点 + int start = 0; + //循环的次数 行数和列数中的最小值除以二 + int loop = Math.min(rows,columns) / 2; + //未遍历的中间列(行)的列(行)下标 + int mid = loop; + //终止条件 + int offSet = 1; + int i,j; + while(loop-- > 0) { + //初始化起点 + i = j = start; + + //从左往右 + for(; j < columns - offSet; j++) + ans.add(matrix[i][j]); + + //从上往下 + for(; i < rows - offSet; i++) + ans.add(matrix[i][j]); + + //从右往左 + for(; j > start; j--) + ans.add(matrix[i][j]); + + //从下往上 + for(; i > start; i--) + ans.add(matrix[i][j]); + + //每循环一次 改变起点位置 + start++; + //终止条件改变 + offSet++; + } + + //如果行和列中的最小值是奇数 则会产生中间行或者中间列没有遍历 + if(Math.min(rows,columns) % 2 != 0) { + //行大于列则产生中间列 + if(rows > columns) { + //中间列的行的最大下标的下一位的下标为mid + rows - columns + 1 + for(int k = mid; k < mid + rows - columns + 1; k++) { + ans.add(matrix[k][mid]); + } + }else {//列大于等于行则产生中间行 + //中间行的列的最大下标的下一位的下标为mid + columns - rows + 1 + for(int k = mid; k < mid + columns - rows + 1; k++) { + ans.add(matrix[mid][k]); + } + } + } + return ans; + } +} +``` + + + -----------------------
From 0c2f5c912cd628157e2e049e80abdd3c9984d8e5 Mon Sep 17 00:00:00 2001 From: Luo <82520819+Jerry-306@users.noreply.github.com> Date: Sun, 21 Aug 2022 09:27:35 +0800 Subject: [PATCH 1017/3019] =?UTF-8?q?0070.=E7=88=AC=E6=A5=BC=E6=A2=AFJavaS?= =?UTF-8?q?cript=E4=BB=A3=E7=A0=81=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 原代码貌似不是本题的哦 --- ...0\203\214\345\214\205\347\211\210\346\234\254.md" | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git "a/problems/0070.\347\210\254\346\245\274\346\242\257\345\256\214\345\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md" "b/problems/0070.\347\210\254\346\245\274\346\242\257\345\256\214\345\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md" index ec019e5759..28439e09a2 100644 --- "a/problems/0070.\347\210\254\346\245\274\346\242\257\345\256\214\345\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md" +++ "b/problems/0070.\347\210\254\346\245\274\346\242\257\345\256\214\345\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md" @@ -187,12 +187,14 @@ func climbStairs(n int) int { JavaScript: ```javascript var climbStairs = function(n) { - const dp = new Array(n+1).fill(0); - const weight = [1,2]; + const dp = new Array(n + 1).fill(0); + const m = 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]]; + for(let i = 1; i <= n; i++){ + for(let j = 1; j <= m; j++){ + if(i >= j) { + dp[i] += dp[i - j]; + } } } return dp[n]; From 7b61605475f39edb73e1ada48a61fe55e4bbea8f Mon Sep 17 00:00:00 2001 From: Jack_ZhijieFang <56966563+laerpeeK@users.noreply.github.com> Date: Mon, 22 Aug 2022 01:22:41 +0800 Subject: [PATCH 1018/3019] =?UTF-8?q?docs=200541.=E5=8F=8D=E8=BD=AC?= =?UTF-8?q?=E5=AD=97=E7=AC=A6=E4=B8=B2=E2=85=A1.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修改了该题描述,更新到leetcode最新问题描述。原先的问题描述,个人觉得对 "是否包括前2k个字符" 有理解上的困难。 --- ...17\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" "b/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" index 26d0b89c3a..80692c0b86 100644 --- "a/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" +++ "b/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" @@ -12,7 +12,7 @@ [力扣题目链接](https://leetcode.cn/problems/reverse-string-ii/) -给定一个字符串 s 和一个整数 k,你需要对从字符串开头算起的每隔 2k 个字符的前 k 个字符进行反转。 +给定一个字符串 s 和一个整数 k,从字符串开头算起, 每计数至 2k 个字符,就反转这 2k 个字符中的前 k 个字符。 如果剩余字符少于 k 个,则将剩余字符全部反转。 From fef52ccea86c388881b08a0cbdf235bdf2378a3e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E5=91=98Carl?= Date: Tue, 23 Aug 2022 09:18:21 +0800 Subject: [PATCH 1019/3019] =?UTF-8?q?Update=20=E9=9D=A2=E8=AF=95=E9=A2=980?= =?UTF-8?q?2.07.=E9=93=BE=E8=A1=A8=E7=9B=B8=E4=BA=A4.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...02.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git "a/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" "b/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" index 8ea9c3cfe9..6d6810a3ab 100644 --- "a/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" +++ "b/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" @@ -5,7 +5,9 @@

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

-# 0160. 链表相交 +# 面试题 02.07. 链表相交 + +同:160.链表相交 [力扣题目链接](https://leetcode.cn/problems/intersection-of-two-linked-lists-lcci/) From 300922d68e3305024755fffb718f5d07a05b70cd Mon Sep 17 00:00:00 2001 From: Jamcy123 <1219502823@qq.com> Date: Tue, 23 Aug 2022 11:45:24 +0800 Subject: [PATCH 1020/3019] =?UTF-8?q?347.=E5=89=8DK=E4=B8=AA=E9=AB=98?= =?UTF-8?q?=E9=A2=91=E5=85=83=E7=B4=A0JS=E7=89=88=E6=9C=AC=E4=BF=AE?= =?UTF-8?q?=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...30\351\242\221\345\205\203\347\264\240.md" | 155 +++++++++--------- 1 file changed, 79 insertions(+), 76 deletions(-) diff --git "a/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" "b/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" index 1d6a358bfc..d0a3063ae0 100644 --- "a/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" +++ "b/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" @@ -263,99 +263,102 @@ func topKFrequent(nums []int, k int) []int { -javaScript: +JavaScript: ```js -/** - * @param {number[]} nums - * @param {number} k - * @return {number[]} - */ -var topKFrequent = function(nums, k) { - const map = new Map(); - - for(const num of nums) { - map.set(num, (map.get(num) || 0) + 1); - } - - // 创建小顶堆 - const priorityQueue = new PriorityQueue((a, b) => a[1] - b[1]); - - // entry 是一个长度为2的数组,0位置存储key,1位置存储value - for (const entry of map.entries()) { - priorityQueue.push(entry); - if (priorityQueue.size() > k) { - priorityQueue.pop(); +// js 没有堆 需要自己构造 +class Heap { + constructor(compareFn) { + this.compareFn = compareFn; + this.queue = []; } - } - const ret = []; + // 添加 + push(item) { + // 推入元素 + this.queue.push(item); - for(let i = priorityQueue.size() - 1; i >= 0; i--) { - ret[i] = priorityQueue.pop()[0]; - } + // 上浮 + let index = this.size() - 1; // 记录推入元素下标 + let parent = Math.floor((index - 1) / 2); // 记录父节点下标 - return ret; -}; + while (parent >= 0 && this.compare(parent, index) > 0) { // 注意compare参数顺序 + [this.queue[index], this.queue[parent]] = [this.queue[parent], this.queue[index]]; + // 更新下标 + index = parent; + parent = Math.floor((index - 1) / 2); + } + } -function PriorityQueue(compareFn) { - this.compareFn = compareFn; - this.queue = []; -} + // 获取堆顶元素并移除 + pop() { + // 堆顶元素 + const out = this.queue[0]; -// 添加 -PriorityQueue.prototype.push = function(item) { - this.queue.push(item); - let index = this.queue.length - 1; - let parent = Math.floor((index - 1) / 2); - // 上浮 - while(parent >= 0 && this.compare(parent, index) > 0) { - // 交换 - [this.queue[index], this.queue[parent]] = [this.queue[parent], this.queue[index]]; - index = parent; - parent = Math.floor((index - 1) / 2); - } -} + // 移除堆顶元素 填入最后一个元素 + this.queue[0] = this.queue.pop(); -// 获取堆顶元素并移除 -PriorityQueue.prototype.pop = function() { - const ret = this.queue[0]; + // 下沉 + let index = 0; // 记录下沉元素下标 + let left = 1; // left 是左子节点下标 left + 1 则是右子节点下标 + let searchChild = this.compare(left, left + 1) > 0 ? left + 1 : left; - // 把最后一个节点移到堆顶 - this.queue[0] = this.queue.pop(); + while (searchChild !== undefined && this.compare(index, searchChild) > 0) { // 注意compare参数顺序 + [this.queue[index], this.queue[searchChild]] = [this.queue[searchChild], this.queue[index]]; - let index = 0; - // 左子节点下标,left + 1 就是右子节点下标 - let left = 1; - let selectedChild = this.compare(left, left + 1) > 0 ? left + 1 : left; + // 更新下标 + index = searchChild; + left = 2 * index + 1; + searchChild = this.compare(left, left + 1) > 0 ? left + 1 : left; + } - // 下沉 - while(selectedChild !== undefined && this.compare(index, selectedChild) > 0) { - // 交换 - [this.queue[index], this.queue[selectedChild]] = [this.queue[selectedChild], this.queue[index]]; - index = selectedChild; - left = 2 * index + 1; - selectedChild = this.compare(left, left + 1) > 0 ? left + 1 : left; - } + return out; + } - return ret; -} + size() { + return this.queue.length; + } -PriorityQueue.prototype.size = function() { - return this.queue.length; -} + // 使用传入的 compareFn 比较两个位置的元素 + compare(index1, index2) { + // 处理下标越界问题 + if (this.queue[index1] === undefined) return 1; + if (this.queue[index2] === undefined) return -1; -// 使用传入的 compareFn 比较两个位置的元素 -PriorityQueue.prototype.compare = function(index1, index2) { - if (this.queue[index1] === undefined) { - return 1; - } - if (this.queue[index2] === undefined) { - return -1; - } + return this.compareFn(this.queue[index1], this.queue[index2]); + } - return this.compareFn(this.queue[index1], this.queue[index2]); } + +const topKFrequent = function (nums, k) { + const map = new Map(); + + for (const num of nums) { + map.set(num, (map.get(num) || 0) + 1); + } + + // 创建小顶堆 + const heap= new Heap((a, b) => a[1] - b[1]); + + // entry 是一个长度为2的数组,0位置存储key,1位置存储value + for (const entry of map.entries()) { + heap.push(entry); + + if (heap.size() > k) { + heap.pop(); + } + } + + // return heap.queue.map(e => e[0]); + + const res = []; + + for (let i = heap.size() - 1; i >= 0; i--) { + res[i] = heap.pop()[0]; + } + + return res; +}; ``` TypeScript: From 26cdabc43f91724bd41de2f03b2d157202f9f1d6 Mon Sep 17 00:00:00 2001 From: starry0819 Date: Tue, 23 Aug 2022 14:25:21 +0800 Subject: [PATCH 1021/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200707.=E8=AE=BE?= =?UTF-8?q?=E8=AE=A1=E9=93=BE=E8=A1=A8.md=20Java=E7=A4=BA=E4=BE=8B?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E9=83=A8=E5=88=86=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 0707.设计链表.md 中 Java示例代码中,单链表的deleteAtIndex方法进行了修改。 --- ...707.\350\256\276\350\256\241\351\223\276\350\241\250.md" | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git "a/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" "b/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" index 008860397a..42912eda8e 100644 --- "a/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" +++ "b/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" @@ -353,8 +353,12 @@ class MyLinkedList { return; } size--; + if (index == 0) { + head = head.next; + return; + } ListNode pred = head; - for (int i = 0; i < index; i++) { + for (int i = 0; i < index - 1; i++) { pred = pred.next; } pred.next = pred.next.next; From 4de12f9810d81512b073b98d68c2b5a3126abfab Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Tue, 23 Aug 2022 17:34:20 +0800 Subject: [PATCH 1022/3019] Update --- ...52\351\253\230\351\242\221\345\205\203\347\264\240.md" | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git "a/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" "b/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" index 430dcea1d8..d4059b9ba4 100644 --- "a/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" +++ "b/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" @@ -31,6 +31,14 @@ # 思路 +《代码随想录》算法视频公开课:[优先级队列正式登场!大顶堆、小顶堆该怎么用?| LeetCode:347.前 K 个高频元素](https://www.bilibili.com/video/BV1Xg41167Lz),相信结合视频在看本篇题解,更有助于大家对本题的理解。 + +

+ +

+ + + 这道题目主要涉及到如下三块内容: 1. 要统计元素出现频率 2. 对频率排序 From 59825d6700d8715eca3b980a8577598d27cc85c7 Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Tue, 23 Aug 2022 17:34:33 +0800 Subject: [PATCH 1023/3019] Update --- ...73\351\231\244\345\205\203\347\264\240.md" | 7 +-- ...76\345\274\217\346\261\202\345\200\274.md" | 2 + ...43\346\234\200\345\244\247\345\200\274.md" | 2 + ...00\345\244\247\351\235\242\347\247\257.md" | 63 +++++++++++++++++++ 4 files changed, 69 insertions(+), 5 deletions(-) diff --git "a/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" "b/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" index 12f88c75df..05c4394cab 100644 --- "a/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" +++ "b/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" @@ -165,18 +165,15 @@ Java: ```java class Solution { public int removeElement(int[] nums, int val) { - // 快慢指针 - int fastIndex = 0; - int slowIndex; - for (slowIndex = 0; fastIndex < nums.length; fastIndex++) { + int slowIndex = 0; + for (int fastIndex = 0; fastIndex < nums.length; fastIndex++) { if (nums[fastIndex] != val) { nums[slowIndex] = nums[fastIndex]; slowIndex++; } } return slowIndex; - } } ``` diff --git "a/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" "b/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" index 21bd85935f..8107e4e07a 100644 --- "a/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" +++ "b/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" @@ -65,6 +65,8 @@ # 思路 +《代码随想录》算法视频公开课:[栈的最后表演! | LeetCode:150. 逆波兰表达式求值](https://www.bilibili.com/video/BV1kd4y1o7on),相信结合视频在看本篇题解,更有助于大家对本题的理解。 + 在上一篇文章中[1047.删除字符串中的所有相邻重复项](https://programmercarl.com/1047.删除字符串中的所有相邻重复项.html)提到了 递归就是用栈来实现的。 所以**栈与递归之间在某种程度上是可以转换的!** 这一点我们在后续讲解二叉树的时候,会更详细的讲解到。 diff --git "a/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" "b/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" index 6ec985069f..3f402f1203 100644 --- "a/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" +++ "b/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" @@ -32,6 +32,8 @@ # 思路 +《代码随想录》算法视频公开课:[单调队列正式登场!| LeetCode:239. 滑动窗口最大值](https://www.bilibili.com/video/BV1XS4y1p7qj),相信结合视频在看本篇题解,更有助于大家对本题的理解。 + 这是使用单调队列的经典题目。 难点是如何求一个区间里的最大值呢? (这好像是废话),暴力一下不就得了。 diff --git "a/problems/0695.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" "b/problems/0695.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" index b09452921f..3739882aff 100644 --- "a/problems/0695.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" +++ "b/problems/0695.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" @@ -16,6 +16,17 @@ # 思路 +这道题目也是 dfs bfs基础类题目。 + + +## DFS + +很多同学,写dfs其实也是凭感觉来,有的时候dfs函数中写终止条件才能过,有的时候 dfs函数不写终止添加也能过! + +这里其实涉及到dfs的两种写法, + +以下代码使用dfs实现,如果对dfs不太了解的话,建议先看这篇题解:[797.所有可能的路径](https://leetcode.cn/problems/all-paths-from-source-to-target/solution/by-carlsun-2-66pf/), + 写法一,dfs只处理下一个节点 ```CPP class Solution { @@ -94,3 +105,55 @@ public: } }; ``` + +以上两种写法的区别,我在题解: [DFS,BDF 你没注意的细节都给你列出来了!LeetCode:200. 岛屿数量](https://leetcode.cn/problems/number-of-islands/solution/by-carlsun-2-n72a/)做了详细介绍。 + +## BFS + +```CPP +class Solution { +private: + int count; + int dir[4][2] = {0, 1, 1, 0, -1, 0, 0, -1}; // 四个方向 + void bfs(vector>& grid, vector>& visited, int x, int y) { + queue que; + que.push(x); + que.push(y); + visited[x][y] = true; // 加入队列就意味节点是陆地可到达的点 + count++; + while(!que.empty()) { + int xx = que.front();que.pop(); + int yy = que.front();que.pop(); + for (int i = 0 ;i < 4; i++) { + int nextx = xx + dir[i][0]; + int nexty = yy + dir[i][1]; + if (nextx < 0 || nextx >= grid.size() || nexty < 0 || nexty >= grid[0].size()) continue; // 越界 + if (!visited[nextx][nexty] && grid[nextx][nexty] == 1) { // 节点没有被访问过且是陆地 + visited[nextx][nexty] = true; + count++; + que.push(nextx); + que.push(nexty); + } + } + } + } + +public: + int maxAreaOfIsland(vector>& grid) { + int n = grid.size(), m = grid[0].size(); + vector> visited = vector>(n, vector(m, false)); + int result = 0; + for (int i = 0; i < n; i++) { + for (int j = 0; j < m; j++) { + if (!visited[i][j] && grid[i][j] == 1) { + count = 0; + bfs(grid, visited, i, j); // 将与其链接的陆地都标记上 true + result = max(result, count); + } + } + } + return result; + } +}; + +``` From 41c480371c4a9c41f9e0a06d35810529b15c8c91 Mon Sep 17 00:00:00 2001 From: SwaggyP <1352164869@qq.com> Date: Wed, 24 Aug 2022 12:41:38 +0800 Subject: [PATCH 1024/3019] =?UTF-8?q?0005.=E6=9C=80=E9=95=BF=E5=9B=9E?= =?UTF-8?q?=E6=96=87=E5=AD=90=E4=B8=B2=E5=A2=9E=E5=8A=A0go=E7=9A=84dp?= =?UTF-8?q?=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 0005.最长回文子串增加go的dp解法 --- ...36\346\226\207\345\255\220\344\270\262.md" | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git "a/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" "b/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" index d53acf63e6..6e407d6e99 100644 --- "a/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" +++ "b/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" @@ -363,6 +363,34 @@ class Solution: Go: ```go +func longestPalindrome(s string) string { + maxLen := 0 + left := 0 + length := 0 + dp := make([][]bool, len(s)) + for i := 0; i < len(s); i++ { + dp[i] = make([]bool,len(s)) + } + for i := len(s)-1; i >= 0; i-- { + for j := i; j < len(s); j++ { + if s[i] == s[j]{ + if j-i <= 1{ // 情况一和情况二 + length = j-i + dp[i][j]=true + }else if dp[i+1][j-1]{ // 情况三 + length = j-i + dp[i][j] = true + } + } + } + if length > maxLen { + maxLen = length + left = i + } + } + return s[left: left+maxLen+1] +} + ``` From ed199f1f75199ab9daf487c0c6b99d467f1cef43 Mon Sep 17 00:00:00 2001 From: zhicheng lee <904688436@qq.com> Date: Wed, 24 Aug 2022 21:31:30 +0800 Subject: [PATCH 1025/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200077.=E7=BB=84?= =?UTF-8?q?=E5=90=88=E4=BC=98=E5=8C=96.md=20cpp=E4=BB=A3=E7=A0=81=E8=AF=AD?= =?UTF-8?q?=E6=B3=95=E9=AB=98=E4=BA=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 网站本文cpp代码没有语法高亮,推测网站可以识别```CPP(网站其它cpp代码均用```CPP标识),但无法识别```c++ --- ...347\273\204\345\220\210\344\274\230\345\214\226.md" | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git "a/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" "b/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" index e336fb7547..b8b5f3c12d 100644 --- "a/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" +++ "b/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" @@ -20,7 +20,7 @@ 大家先回忆一下[77. 组合]给出的回溯法的代码: -```c++ +```CPP class Solution { private: vector> result; // 存放符合条件结果的集合 @@ -52,7 +52,7 @@ public: 在遍历的过程中有如下代码: -```c++ +```CPP for (int i = startIndex; i <= n; i++) { path.push_back(i); backtracking(n, k, i + 1); @@ -76,7 +76,7 @@ for (int i = startIndex; i <= n; i++) { **如果for循环选择的起始位置之后的元素个数 已经不足 我们需要的元素个数了,那么就没有必要搜索了**。 注意代码中i,就是for循环里选择的起始位置。 -```c++ +```CPP for (int i = startIndex; i <= n; i++) { ``` @@ -98,13 +98,13 @@ for (int i = startIndex; i <= n; i++) { 所以优化之后的for循环是: -```c++ +```CPP for (int i = startIndex; i <= n - (k - path.size()) + 1; i++) // i为本次搜索的起始位置 ``` 优化后整体代码如下: -```c++ +```CPP class Solution { private: vector> result; From 0a9653df8457535038888a57e05ba873109eccce Mon Sep 17 00:00:00 2001 From: Yukun J Date: Wed, 24 Aug 2022 11:22:43 -0400 Subject: [PATCH 1026/3019] =?UTF-8?q?Update:=200416=20=E4=BD=BF=E7=94=A8ST?= =?UTF-8?q?L=E6=B1=82=E5=92=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...262\347\255\211\345\222\214\345\255\220\351\233\206.md" | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git "a/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" "b/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" index 03eae8ef28..9c90ea2766 100644 --- "a/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" +++ "b/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" @@ -143,15 +143,12 @@ dp[j]的数值一定是小于等于j的。 class Solution { public: bool canPartition(vector& nums) { - int sum = 0; - + // 使用标准库函数 便捷求和 + int sum = accumulate(nums.begin(), nums.end(), 0); // dp[i]中的i表示背包内总和 // 题目中说:每个数组中的元素不会超过 100,数组的大小不会超过 200 // 总和不会大于20000,背包最大只需要其中一半,所以10001大小就可以了 vector dp(10001, 0); - for (int i = 0; i < nums.size(); i++) { - sum += nums[i]; - } if (sum % 2 == 1) return false; int target = sum / 2; From 55648dcb7905550ce30081295deee4de858fef35 Mon Sep 17 00:00:00 2001 From: SwaggyP <1352164869@qq.com> Date: Sun, 28 Aug 2022 10:26:45 +0800 Subject: [PATCH 1027/3019] =?UTF-8?q?0127.=E5=8D=95=E8=AF=8D=E6=8E=A5?= =?UTF-8?q?=E9=BE=99=20=E5=A2=9E=E5=8A=A0go=E8=AF=AD=E8=A8=80=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 0127.单词接龙 增加go语言的解法 --- ...25\350\257\215\346\216\245\351\276\231.md" | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git "a/problems/0127.\345\215\225\350\257\215\346\216\245\351\276\231.md" "b/problems/0127.\345\215\225\350\257\215\346\216\245\351\276\231.md" index f1c6f1828a..6d719691ce 100644 --- "a/problems/0127.\345\215\225\350\257\215\346\216\245\351\276\231.md" +++ "b/problems/0127.\345\215\225\350\257\215\346\216\245\351\276\231.md" @@ -158,6 +158,57 @@ class Solution: return 0 ``` ## Go +```go +func ladderLength(beginWord string, endWord string, wordList []string) int { + wordMap, que, depth := getWordMap(wordList, beginWord), []string{beginWord}, 0 + for len(que) > 0 { + depth++ + qLen := len(que) // 单词的长度 + for i := 0; i < qLen; i++ { + word := que[0] + que = que[1:] // 首位单词出队 + candidates := getCandidates(word) + for _, candidate := range candidates { + if _, exist := wordMap[candidate]; exist { // 用生成的结果集去查询 + if candidate == endWord { + return depth + 1 + } + delete(wordMap, candidate) // 删除集合中的用过的结果 + que = append(que, candidate) + } + } + } + } + return 0 +} + + +// 获取单词Map为后续的查询增加速度 +func getWordMap(wordList []string, beginWord string) map[string]int { + wordMap := make(map[string]int) + for i, word := range wordList { + if _, exist := wordMap[word]; !exist { + if word != beginWord { + wordMap[word] = i + } + } + } + return wordMap +} + +// 用26个英文字母分别替换掉各个位置的字母,生成一个结果集 +func getCandidates(word string) []string { + var res []string + for i := 0; i < 26; i++ { + for j := 0; j < len(word); j++ { + if word[j] != byte(int('a')+i) { + res = append(res, word[:j]+string(int('a')+i)+word[j+1:]) + } + } + } + return res +} +``` ## JavaScript ```javascript From bc8030b45a7e2a6cdefe8944cb624d4fa1f7d1a1 Mon Sep 17 00:00:00 2001 From: = <=> Date: Sun, 28 Aug 2022 14:31:18 +0800 Subject: [PATCH 1028/3019] =?UTF-8?q?Update=200347.=E5=89=8DK=E4=B8=AA?= =?UTF-8?q?=E9=AB=98=E9=A2=91=E5=85=83=E7=B4=A0.md=EF=BC=8C=E6=96=B0?= =?UTF-8?q?=E5=A2=9EComparator=E6=8E=A5=E5=8F=A3=E8=AF=B4=E6=98=8E?= =?UTF-8?q?=E5=8F=8A=E5=A4=A7=E9=A1=B6=E5=A0=86=E3=80=81=E5=B0=8F=E9=A1=B6?= =?UTF-8?q?=E5=A0=86=E4=B8=A4=E7=A7=8Djava=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...30\351\242\221\345\205\203\347\264\240.md" | 59 ++++++++++++++----- 1 file changed, 45 insertions(+), 14 deletions(-) diff --git "a/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" "b/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" index d4059b9ba4..8256e6296c 100644 --- "a/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" +++ "b/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" @@ -140,24 +140,55 @@ public: Java: ```java +/*Comparator接口说明: + * 返回负数,形参中第一个参数排在前面;返回正数,形参中第二个参数排在前面 + * 对于队列:排在前面意味着往队头靠 + * 对于堆(使用PriorityQueue实现):从队头到队尾按从小到大排就是最小堆(小顶堆), + * 从队头到队尾按从大到小排就是最大堆(大顶堆)--->队头元素相当于堆的根节点 + * */ class Solution { - public int[] topKFrequent(int[] nums, int k) { - int[] result = new int[k]; - HashMap map = new HashMap<>(); - for (int num : nums) { - map.put(num, map.getOrDefault(num, 0) + 1); + //解法1:基于大顶堆实现 + public int[] topKFrequent1(int[] nums, int k) { + Map map = new HashMap<>();//key为数组元素值,val为对应出现次数 + for(int num:nums){ + map.put(num,map.getOrDefault(num,0)+1); } - - Set> entries = map.entrySet(); - // 根据map的value值,构建于一个大顶堆(o1 - o2: 小顶堆, o2 - o1 : 大顶堆) - PriorityQueue> queue = new PriorityQueue<>((o1, o2) -> o2.getValue() - o1.getValue()); - for (Map.Entry entry : entries) { - queue.offer(entry); + //在优先队列中存储二元组(num,cnt),cnt表示元素值num在数组中的出现次数 + //出现次数按从队头到队尾的顺序是从大到小排,出现次数最多的在队头(相当于大顶堆) + PriorityQueue pq = new PriorityQueue<>((pair1, pair2)->pair2[1]-pair1[1]); + for(Map.Entry entry:map.entrySet()){//大顶堆需要对所有元素进行排序 + pq.add(new int[]{entry.getKey(),entry.getValue()}); } - for (int i = k - 1; i >= 0; i--) { - result[i] = queue.poll().getKey(); + int[] ans = new int[k]; + for(int i=0;i map = new HashMap<>();//key为数组元素值,val为对应出现次数 + for(int num:nums){ + map.put(num,map.getOrDefault(num,0)+1); + } + //在优先队列中存储二元组(num,cnt),cnt表示元素值num在数组中的出现次数 + //出现次数按从队头到队尾的顺序是从小到大排,出现次数最低的在队头(相当于小顶堆) + PriorityQueue pq = new PriorityQueue<>((pair1,pair2)->pair1[1]-pair2[1]); + for(Map.Entry entry:map.entrySet()){//小顶堆只需要维持k个元素有序 + if(pq.size()pq.peek()[1]){//当前元素出现次数大于小顶堆的根结点(这k个元素中出现次数最少的那个) + pq.poll();//弹出队头(小顶堆的根结点),即把堆里出现次数最少的那个删除,留下的就是出现次数多的了 + pq.add(new int[]{entry.getKey(),entry.getValue()}); + } + } + } + int[] ans = new int[k]; + for(int i=k-1;i>=0;i--){//依次弹出小顶堆,先弹出的是堆的根,出现次数少,后面弹出的出现次数多 + ans[i] = pq.poll()[0]; + } + return ans; } } ``` From 39f80d5bc38868f70a85d865bba9a20fc4965cf3 Mon Sep 17 00:00:00 2001 From: Xin-Sheng-5075 <2061461846@qq.com> Date: Sun, 28 Aug 2022 19:13:24 +0800 Subject: [PATCH 1029/3019] Signed-off-by: Xin-Sheng-5075 <2061461846@qq.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加题目 200.岛屿数量 的Java版本 --- ...33\345\261\277\346\225\260\351\207\217.md" | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git "a/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.md" "b/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.md" index b88e5fd248..59c4e5668a 100644 --- "a/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.md" +++ "b/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.md" @@ -247,3 +247,35 @@ public: ## 其他语言版本 + +### Java + +下面的代码使用的是深度优先搜索 DFS 的做法。为了统计岛屿数量同时不重复记录,每当我们搜索到一个岛后,就将这个岛 “淹没” —— 将这个岛所占的地方从 “1” 改为 “0”,这样就不用担心后续会重复记录这个岛屿了。而 DFS 的过程就体现在 “淹没” 这一步中。详见代码: + +```java +public int numIslands(char[][] grid) { + int res = 0; //记录找到的岛屿数量 + for(int i = 0;i < grid.length;i++){ + for(int j = 0;j < grid[0].length;j++){ + //找到“1”,res加一,同时淹没这个岛 + if(grid[i][j] == '1'){ + res++; + dfs(grid,i,j); + } + } + } + return res; +} +//使用DFS“淹没”岛屿 +public void dfs(char[][] grid, int i, int j){ + //搜索边界:索引越界或遍历到了"0" + if(i < 0 || i >= grid.length || j < 0 || j >= grid[0].length || grid[i][j] == '0') return; + //将这块土地标记为"0" + grid[i][j] = '0'; + //根据"每座岛屿只能由水平方向或竖直方向上相邻的陆地连接形成",对上下左右的相邻顶点进行dfs + dfs(grid,i - 1,j); + dfs(grid,i + 1,j); + dfs(grid,i,j + 1); + dfs(grid,i,j - 1); +} +``` \ No newline at end of file From 8912e30b1a6a819b653c62092a7e4fb9cfeb2d0d Mon Sep 17 00:00:00 2001 From: whale <79465534+whale2002@users.noreply.github.com> Date: Mon, 29 Aug 2022 18:31:51 +0800 Subject: [PATCH 1030/3019] =?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 --- "problems/0046.\345\205\250\346\216\222\345\210\227.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0046.\345\205\250\346\216\222\345\210\227.md" "b/problems/0046.\345\205\250\346\216\222\345\210\227.md" index ce07395a13..5a4ff1548f 100644 --- "a/problems/0046.\345\205\250\346\216\222\345\210\227.md" +++ "b/problems/0046.\345\205\250\346\216\222\345\210\227.md" @@ -331,7 +331,7 @@ var permute = function(nums) { ``` -## TypeScript +### TypeScript ```typescript function permute(nums: number[]): number[][] { From d91233d0443753b747d139e00b081fa4f4c39fb1 Mon Sep 17 00:00:00 2001 From: huaqi <2931246464@qq.com> Date: Tue, 30 Aug 2022 21:18:16 +0800 Subject: [PATCH 1031/3019] =?UTF-8?q?0977.=E6=9C=89=E5=BA=8F=E6=95=B0?= =?UTF-8?q?=E7=BB=84=E7=9A=84=E5=B9=B3=E6=96=B9-typescript=E7=89=88?= =?UTF-8?q?=E6=9C=AC-=E4=BC=98=E5=8C=96=E5=86=99=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...04\347\232\204\345\271\263\346\226\271.md" | 22 ++++++++++++------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git "a/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" "b/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" index eb9f42b1ef..501b9a42a5 100644 --- "a/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" +++ "b/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" @@ -239,18 +239,24 @@ Typescript: ```typescript function sortedSquares(nums: number[]): number[] { - let left: number = 0, right: number = nums.length - 1; - let resArr: number[] = new Array(nums.length); - let resArrIndex: number = resArr.length - 1; + const ans: number[] = []; + let left = 0, + right = nums.length - 1; + while (left <= right) { - if (Math.abs(nums[left]) < Math.abs(nums[right])) { - resArr[resArrIndex] = nums[right--] ** 2; + // 右侧的元素不需要取绝对值,nums 为非递减排序的整数数组 + // 在同为负数的情况下,左侧的平方值一定大于右侧的平方值 + if (Math.abs(nums[left]) > nums[right]) { + // 使用 Array.prototype.unshift() 直接在数组的首项插入当前最大值 + ans.unshift(nums[left] ** 2); + left++; } else { - resArr[resArrIndex] = nums[left++] ** 2; + ans.unshift(nums[right] ** 2); + right--; } - resArrIndex--; } - return resArr; + + return ans; }; ``` From 3f96750bece9167e25e52a61c1f52cdcdecdb8ea Mon Sep 17 00:00:00 2001 From: Wen Date: Tue, 30 Aug 2022 22:30:25 +0800 Subject: [PATCH 1032/3019] =?UTF-8?q?=E4=BC=98=E5=8C=96=20242.=20=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?=20Java=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...15\345\274\202\344\275\215\350\257\215.md" | 20 ++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git "a/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" "b/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" index 87302482f3..d54285ebad 100644 --- "a/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" +++ "b/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" @@ -92,18 +92,24 @@ public: Java: ```java +/** + * 242. 有效的字母异位词 字典解法 + * 时间复杂度O(m+n) 空间复杂度O(1) + */ class Solution { public boolean isAnagram(String s, String t) { - int[] record = new int[26]; - for (char c : s.toCharArray()) { - record[c - 'a'] += 1; + + for (int i = 0; i < s.length(); i++) { + record[s.charAt(i) - 'a']++; } - for (char c : t.toCharArray()) { - record[c - 'a'] -= 1; + + for (int i = 0; i < t.length(); i++) { + record[t.charAt(i) - 'a']--; } - for (int i : record) { - if (i != 0) { + + for (int count: record) { + if (count != 0) { return false; } } From a275c2cc553ad35e50d736e0630947a5bdf2d13e Mon Sep 17 00:00:00 2001 From: YukunJ Date: Tue, 30 Aug 2022 21:51:30 -0400 Subject: [PATCH 1033/3019] =?UTF-8?q?Update:=20=E6=B3=A8=E9=87=8A=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E4=BD=BF=E7=94=A8STL=E6=B1=82=E5=92=8C=E7=9A=84?= =?UTF-8?q?=E7=AE=80=E4=BE=BF=E5=B0=8F=E8=B4=B4=E5=A3=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...2\347\255\211\345\222\214\345\255\220\351\233\206.md" | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git "a/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" "b/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" index 9c90ea2766..fa677da06e 100644 --- "a/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" +++ "b/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" @@ -143,12 +143,17 @@ dp[j]的数值一定是小于等于j的。 class Solution { public: bool canPartition(vector& nums) { - // 使用标准库函数 便捷求和 - int sum = accumulate(nums.begin(), nums.end(), 0); + int sum = 0; + // dp[i]中的i表示背包内总和 // 题目中说:每个数组中的元素不会超过 100,数组的大小不会超过 200 // 总和不会大于20000,背包最大只需要其中一半,所以10001大小就可以了 vector dp(10001, 0); + for (int i = 0; i < nums.size(); i++) { + sum += nums[i]; + } + // 也可以使用库函数一步求和 + // int sum = accumulate(nums.begin(), nums.end(), 0); if (sum % 2 == 1) return false; int target = sum / 2; From 814ea3ec47208c7cfcf208b288fc8e6a5822782f Mon Sep 17 00:00:00 2001 From: zhicheng lee <904688436@qq.com> Date: Wed, 31 Aug 2022 09:52:46 +0800 Subject: [PATCH 1034/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200078.=E5=AD=90?= =?UTF-8?q?=E9=9B=86.md=20=E5=8E=BB=E9=99=A4Java=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E4=B8=AD=E5=86=97=E4=BD=99=E7=9A=84=E9=83=A8=E5=88=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit subsetsHelper(int[] nums, int startIndex)函数的第一行包含了被去除代码的功能,因此去掉主函数中冗余的代码 --- "problems/0078.\345\255\220\351\233\206.md" | 4 ---- 1 file changed, 4 deletions(-) diff --git "a/problems/0078.\345\255\220\351\233\206.md" "b/problems/0078.\345\255\220\351\233\206.md" index 3e98311ed0..a9ffd696ce 100644 --- "a/problems/0078.\345\255\220\351\233\206.md" +++ "b/problems/0078.\345\255\220\351\233\206.md" @@ -180,10 +180,6 @@ class Solution { List> result = new ArrayList<>();// 存放符合条件结果的集合 LinkedList path = new LinkedList<>();// 用来存放符合条件结果 public List> subsets(int[] nums) { - if (nums.length == 0){ - result.add(new ArrayList<>()); - return result; - } subsetsHelper(nums, 0); return result; } From a8d3874f550794df371ecb762cb4e391808e75b3 Mon Sep 17 00:00:00 2001 From: Yuki Chen <826992207@qq.com> Date: Wed, 31 Aug 2022 16:44:44 +0800 Subject: [PATCH 1035/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A00053.=E6=9C=80?= =?UTF-8?q?=E5=A4=A7=E5=AD=90=E5=BA=8F=E5=92=8C=EF=BC=88=E5=8A=A8=E6=80=81?= =?UTF-8?q?=E8=A7=84=E5=88=92=EF=BC=89=E7=A9=BA=E9=97=B4=E5=A4=8D=E6=9D=82?= =?UTF-8?q?=E5=BA=A6=E4=B8=BAO(1)=E7=9A=84=E8=A7=A3=E6=B3=95=20Java?= =?UTF-8?q?=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...200\201\350\247\204\345\210\222\357\274\211.md" | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git "a/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" "b/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" index 00f3eb84b2..23d2340087 100644 --- "a/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" +++ "b/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" @@ -120,6 +120,20 @@ Java: return res; } ``` +```Java +//因为dp[i]的递推公式只与前一个值有关,所以可以用一个变量代替dp数组,空间复杂度为O(1) +class Solution { + public int maxSubArray(int[] nums) { + int res = nums[0]; + int pre = nums[0]; + for(int i = 1; i < nums.length; i++) { + pre = Math.max(pre + nums[i], nums[i]); + res = Math.max(res, pre); + } + return res; + } +} +``` Python: ```python From 2ffce0512f3342602d9e1b084553848e67797bf1 Mon Sep 17 00:00:00 2001 From: GY-code Date: Thu, 1 Sep 2022 21:07:04 +0800 Subject: [PATCH 1036/3019] =?UTF-8?q?Update=200337.=E6=89=93=E5=AE=B6?= =?UTF-8?q?=E5=8A=AB=E8=88=8DIII.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 代码问题,对偷家情况,上面分述部分正确,下面综合代码,对应孩子下标应该为0,即`int val1 = cur->val + left[0] + right[0];` --- ...0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" "b/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" index 20b458e9a7..295f19fef6 100644 --- "a/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" +++ "b/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" @@ -191,7 +191,7 @@ public: vector left = robTree(cur->left); vector right = robTree(cur->right); // 偷cur,那么就不能偷左右节点。 - int val1 = cur->val + left[1] + right[1]; + int val1 = cur->val + left[0] + right[0]; // 不偷cur,那么可以偷也可以不偷左右节点,则取较大的情况 int val2 = max(left[0], left[1]) + max(right[0], right[1]); return {val2, val1}; From 1214fd90abefde7d0d963871f0b4ab4de2cb2360 Mon Sep 17 00:00:00 2001 From: zhicheng lee <904688436@qq.com> Date: Fri, 2 Sep 2022 20:15:28 +0800 Subject: [PATCH 1037/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200135.=E5=88=86?= =?UTF-8?q?=E5=8F=91=E7=B3=96=E6=9E=9C.md=20Java=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 代码修改规范简洁一点点 --- ...\206\345\217\221\347\263\226\346\236\234.md" | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git "a/problems/0135.\345\210\206\345\217\221\347\263\226\346\236\234.md" "b/problems/0135.\345\210\206\345\217\221\347\263\226\346\236\234.md" index 242664f0d2..03360dbcf2 100644 --- "a/problems/0135.\345\210\206\345\217\221\347\263\226\346\236\234.md" +++ "b/problems/0135.\345\210\206\345\217\221\347\263\226\346\236\234.md" @@ -135,25 +135,22 @@ class Solution { 2、起点下标 ratings.length - 2 从右往左, 只要左边 比 右边 大,此时 左边的糖果应该 取本身的糖果数(符合比它左边大) 和 右边糖果数 + 1 二者的最大值,这样才符合 它比它左边的大,也比它右边大 */ public int candy(int[] ratings) { - int[] candyVec = new int[ratings.length]; + int len = ratings.length; + int[] candyVec = new int[len]; candyVec[0] = 1; - for (int i = 1; i < ratings.length; i++) { - if (ratings[i] > ratings[i - 1]) { - candyVec[i] = candyVec[i - 1] + 1; - } else { - candyVec[i] = 1; - } + for (int i = 1; i < len; i++) { + candyVec[i] = (ratings[i] > ratings[i - 1]) ? candyVec[i - 1] + 1 : 1; } - for (int i = ratings.length - 2; i >= 0; i--) { + for (int i = len - 2; i >= 0; i--) { if (ratings[i] > ratings[i + 1]) { candyVec[i] = Math.max(candyVec[i], candyVec[i + 1] + 1); } } int ans = 0; - for (int s : candyVec) { - ans += s; + for (int num : candyVec) { + ans += num; } return ans; } From ca4f55ac2a9750f1b5357c06cd920836343768e4 Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Sat, 3 Sep 2022 10:17:03 +0800 Subject: [PATCH 1038/3019] Update --- ...60\344\272\214\345\217\211\346\240\221.md" | 2 + ...02\345\272\217\351\201\215\345\216\206.md" | 3 + ...00\345\244\247\346\267\261\345\272\246.md" | 3 + ...00\345\260\217\346\267\261\345\272\246.md" | 42 +++- ...25\350\257\215\346\216\245\351\276\231.md" | 5 +- ...25\347\232\204\345\214\272\345\237\237.md" | 80 ++++++++ ...7.\345\271\277\346\220\234\347\211\210.md" | 146 ++++++++++++++ ...7.\346\267\261\346\220\234\347\211\210.md" | 110 ----------- ...02\347\202\271\344\270\252\346\225\260.md" | 107 +++++++--- ...54\344\272\214\345\217\211\346\240\221.md" | 2 + ...00\346\234\211\350\267\257\345\276\204.md" | 77 +++++++- ...30\351\242\221\345\205\203\347\264\240.md" | 6 - ...66\345\255\220\344\271\213\345\222\214.md" | 56 ++++-- ...00\345\244\247\351\235\242\347\247\257.md" | 12 +- ...47\344\272\272\345\267\245\345\262\233.md" | 168 ++++++++++++++++ ...31\345\222\214\346\210\277\351\227\264.md" | 2 +- ...60\347\232\204\346\225\260\351\207\217.md" | 139 +++++++++++++ ...77\347\232\204\346\225\260\347\233\256.md" | 74 +++++++ ...06\350\256\272\345\237\272\347\241\200.md" | 4 + ...55\344\273\243\351\201\215\345\216\206.md" | 6 + ...22\345\275\222\351\201\215\345\216\206.md" | 4 + ...06\350\256\272\345\237\272\347\241\200.md" | 121 ++++++++++++ ...06\350\256\272\345\237\272\347\241\200.md" | 187 ++++++++++++++++++ ...05\346\200\273\347\273\223\347\257\207.md" | 2 + 24 files changed, 1185 insertions(+), 173 deletions(-) create mode 100644 "problems/0130.\350\242\253\345\233\264\347\273\225\347\232\204\345\214\272\345\237\237.md" create mode 100644 "problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\345\271\277\346\220\234\347\211\210.md" rename "problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.md" => "problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\346\267\261\346\220\234\347\211\210.md" (57%) create mode 100644 "problems/0827.\346\234\200\345\244\247\344\272\272\345\267\245\345\262\233.md" create mode 100644 "problems/1020.\351\243\236\345\234\260\347\232\204\346\225\260\351\207\217.md" create mode 100644 "problems/1254.\347\273\237\350\256\241\345\260\201\351\227\255\345\262\233\345\261\277\347\232\204\346\225\260\347\233\256.md" create mode 100644 "problems/\345\233\276\350\256\272\345\271\277\347\264\242\347\220\206\350\256\272\345\237\272\347\241\200.md" create mode 100644 "problems/\345\233\276\350\256\272\346\267\261\346\220\234\347\220\206\350\256\272\345\237\272\347\241\200.md" diff --git "a/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" "b/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" index fd2d19877f..3862a3b049 100644 --- "a/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" @@ -15,6 +15,8 @@ # 思路 +《代码随想录》算法视频公开课:[同时操作两个二叉树 | LeetCode:101. 对称二叉树](https://www.bilibili.com/video/BV1ue4y1Y7Mf),相信结合视频在看本篇题解,更有助于大家对本题的理解。 + **首先想清楚,判断对称二叉树要比较的是哪两个节点,要比较的可不是左右节点!** 对于二叉树是否对称,要比较的是根节点的左子树与右子树是不是相互翻转的,理解这一点就知道了**其实我们要比较的是两个树(这两个树是根节点的左右子树)**,所以在递归遍历的过程中,也是要同时遍历两棵树。 diff --git "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" index 9ad34494d8..f5ebccaaca 100644 --- "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" +++ "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" @@ -6,6 +6,9 @@ # 二叉树层序遍历登场! +《代码随想录》算法视频公开课:[讲透二叉树的层序遍历 | 广度优先搜索 | LeetCode:102.二叉树的层序遍历](https://www.bilibili.com/video/BV1GY4y1u7b2),相信结合视频在看本篇题解,更有助于大家对本题的理解。 + + 学会二叉树的层序遍历,可以一口气打完以下十题: * 102.二叉树的层序遍历 diff --git "a/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" "b/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" index 559801897a..392a3778cb 100644 --- "a/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" +++ "b/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" @@ -31,6 +31,9 @@ 本题可以使用前序(中左右),也可以使用后序遍历(左右中),使用前序求的就是深度,使用后序求的是高度。 +* 二叉树节点的深度:指从根节点到该节点的最长简单路径边的条数或者节点数(取决于深度从0开始还是从1开始) +* 二叉树节点的高度:指从该节点到叶子节点的最长简单路径边的条数后者节点数(取决于高度从0开始还是从1开始) + **而根节点的高度就是二叉树的最大深度**,所以本题中我们通过后序求的根节点高度来求的二叉树最大深度。 这一点其实是很多同学没有想清楚的,很多题解同样没有讲清楚。 diff --git "a/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" "b/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" index 6378300c0b..3c32f62026 100644 --- "a/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" +++ "b/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" @@ -31,7 +31,16 @@ 直觉上好像和求最大深度差不多,其实还是差不少的。 -遍历顺序上依然是后序遍历(因为要比较递归返回之后的结果),但在处理中间节点的逻辑上,最大深度很容易理解,最小深度可有一个误区,如图: +本题依然是前序遍历和后序遍历都可以,前序求的是深度,后序求的是高度。 + +* 二叉树节点的深度:指从根节点到该节点的最长简单路径边的条数或者节点数(取决于深度从0开始还是从1开始) +* 二叉树节点的高度:指从该节点到叶子节点的最长简单路径边的条数后者节点数(取决于高度从0开始还是从1开始) + +那么使用后序遍历,其实求的是根节点到叶子节点的最小距离,就是求高度的过程,这不过这个最小距离 也同样是最小深度。 + +以下讲解中遍历顺序上依然采用后序遍历(因为要比较递归返回之后的结果,本文我也给出前序遍历的写法)。 + +本题还有一个误区,在处理节点的过程中,最大深度很容易理解,最小深度就不那么好理解,如图: ![111.二叉树的最小深度](https://img-blog.csdnimg.cn/20210203155800503.png) @@ -150,6 +159,37 @@ public: **精简之后的代码根本看不出是哪种遍历方式,所以依然还要强调一波:如果对二叉树的操作还不熟练,尽量不要直接照着精简代码来学。** +前序遍历的方式: + +```CPP +class Solution { +private: + int result; + void getdepth(TreeNode* node, int depth) { + if (node->left == NULL && node->right == NULL) { + result = min(depth, result); + return; + } + // 中 只不过中没有处理的逻辑 + if (node->left) { // 左 + getdepth(node->left, depth + 1); + } + if (node->right) { // 右 + getdepth(node->right, depth + 1); + } + return ; + } + +public: + int minDepth(TreeNode* root) { + if (root == NULL) return 0; + result = INT_MAX; + getdepth(root, 1); + return result; + } +}; +``` + ## 迭代法 相对于[104.二叉树的最大深度](https://programmercarl.com/0104.二叉树的最大深度.html),本题还可以使用层序遍历的方式来解决,思路是一样的。 diff --git "a/problems/0127.\345\215\225\350\257\215\346\216\245\351\276\231.md" "b/problems/0127.\345\215\225\350\257\215\346\216\245\351\276\231.md" index f1c6f1828a..3bbc711725 100644 --- "a/problems/0127.\345\215\225\350\257\215\346\216\245\351\276\231.md" +++ "b/problems/0127.\345\215\225\350\257\215\346\216\245\351\276\231.md" @@ -42,12 +42,11 @@ * 图中的线是如何连在一起的 * 起点和终点的最短路径长度 - 首先题目中并没有给出点与点之间的连线,而是要我们自己去连,条件是字符只能差一个,所以判断点与点之间的关系,要自己判断是不是差一个字符,如果差一个字符,那就是有链接。 然后就是求起点和终点的最短路径长度,**这里无向图求最短路,广搜最为合适,广搜只要搜到了终点,那么一定是最短的路径**。因为广搜就是以起点中心向四周扩散的搜索。 -本题如果用深搜,会非常麻烦。 +本题如果用深搜,会比较麻烦,要在到达终点的不同路径中选则一条最短路。 而广搜只要达到终点,一定是最短路。 另外需要有一个注意点: @@ -96,6 +95,8 @@ public: }; ``` +当然本题也可以用双向BFS,就是从头尾两端进行搜索,大家感兴趣,可以自己去实现,这里就不再做详细讲解了。 + # 其他语言版本 ## Java diff --git "a/problems/0130.\350\242\253\345\233\264\347\273\225\347\232\204\345\214\272\345\237\237.md" "b/problems/0130.\350\242\253\345\233\264\347\273\225\347\232\204\345\214\272\345\237\237.md" new file mode 100644 index 0000000000..2a363f2443 --- /dev/null +++ "b/problems/0130.\350\242\253\345\233\264\347\273\225\347\232\204\345\214\272\345\237\237.md" @@ -0,0 +1,80 @@ + +# 130. 被围绕的区域 + +[题目链接](https://leetcode.cn/problems/surrounded-regions/) + +给你一个 m x n 的矩阵 board ,由若干字符 'X' 和 'O' ,找到所有被 'X' 围绕的区域,并将这些区域里所有的 'O' 用 'X' 填充。 + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20220901104745.png) + +* 输入:board = [["X","X","X","X"],["X","O","O","X"],["X","X","O","X"],["X","O","X","X"]] +* 输出:[["X","X","X","X"],["X","X","X","X"],["X","X","X","X"],["X","O","X","X"]] +* 解释:被围绕的区间不会存在于边界上,换句话说,任何边界上的 'O' 都不会被填充为 'X'。 任何不在边界上,或不与边界上的 'O' 相连的 'O' 最终都会被填充为 'X'。如果两个元素在水平或垂直方向相邻,则称它们是“相连”的。 + +## 思路 + +这道题目和1020. 飞地的数量正好反过来了,[1020. 飞地的数量](https://leetcode.cn/problems/number-of-enclaves/solution/by-carlsun-2-7lt9/)是求 地图中间的空格数,而本题是要把地图中间的'O'都改成'X'。 + +那么两题在思路上也是差不多的。 + +依然是从地图周边出发,将周边空格相邻的'O'都做上标记,然后在遍历一遍地图,遇到 'O' 且没做过标记的,那么都是地图中间的'O',全部改成'X'就行。 + +有的录友可能想,我在定义一个 visited 二维数组,单独标记周边的'O',然后遍历地图的时候同时对 数组board 和 数组visited 进行判断,是否'O'改成'X'。 + +这样做其实就有点麻烦了,不用额外定义空间了,标记周边的'O',可以直接改board的数值为其他特殊值。 + +步骤一:深搜或者广搜将地图周边的'O'全部改成'A',如图所示: + +![图一](https://code-thinking-1253855093.file.myqcloud.com/pics/20220902102337.png) + +步骤二:在遍历地图,将'O'全部改成'X'(地图中间的'O'改成了'X'),将'A'改回'O'(保留的地图周边的'O'),如图所示: + +![图二](https://code-thinking-1253855093.file.myqcloud.com/pics/20220902102831.png) + +整体C++代码如下,以下使用dfs实现,其实遍历方式dfs,bfs都是可以的。 + +```CPP +class Solution { +private: + int dir[4][2] = {-1, 0, 0, -1, 1, 0, 0, 1}; // 保存四个方向 + void dfs(vector>& board, int x, int y) { + board[x][y] = 'A'; + for (int i = 0; i < 4; i++) { // 向四个方向遍历 + int nextx = x + dir[i][0]; + int nexty = y + dir[i][1]; + // 超过边界 + if (nextx < 0 || nextx >= board.size() || nexty < 0 || nexty >= board[0].size()) continue; + // 不符合条件,不继续遍历 + if (board[nextx][nexty] == 'X' || board[nextx][nexty] == 'A') continue; + dfs (board, nextx, nexty); + } + return; + } + +public: + void solve(vector>& board) { + int n = board.size(), m = board[0].size(); + // 步骤一: + // 从左侧边,和右侧边 向中间遍历 + for (int i = 0; i < n; i++) { + if (board[i][0] == 'O') dfs(board, i, 0); + if (board[i][m - 1] == 'O') dfs(board, i, m - 1); + } + + // 从上边和下边 向中间遍历 + for (int j = 0; j < m; j++) { + if (board[0][j] == 'O') dfs(board, 0, j); + if (board[n - 1][j] == 'O') dfs(board, n - 1, j); + } + // 步骤二: + for (int i = 0; i < n; i++) { + for (int j = 0; j < m; j++) { + if (board[i][j] == 'O') board[i][j] = 'X'; + if (board[i][j] == 'A') board[i][j] = 'O'; + } + } + } +}; +``` + +## 其他语言版本 diff --git "a/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\345\271\277\346\220\234\347\211\210.md" "b/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\345\271\277\346\220\234\347\211\210.md" new file mode 100644 index 0000000000..d43d6183f0 --- /dev/null +++ "b/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\345\271\277\346\220\234\347\211\210.md" @@ -0,0 +1,146 @@ + + +# 200. 岛屿数量 + +[题目链接](https://leetcode.cn/problems/number-of-islands/) + +给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。 + +岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。 + +此外,你可以假设该网格的四条边均被水包围。 + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20220726093256.png) + +提示: + +* m == grid.length +* n == grid[i].length +* 1 <= m, n <= 300 +* grid[i][j] 的值为 '0' 或 '1' + +## 思路 + +注意题目中每座岛屿只能由**水平方向和/或竖直方向上**相邻的陆地连接形成。 + +也就是说斜角度链接是不算了, 例如示例二,是三个岛屿,如图: + +![图一](https://code-thinking-1253855093.file.myqcloud.com/pics/20220726094200.png) + +这道题题目是 DFS,BFS,并查集,基础题目。 + +本题思路,是用遇到一个没有遍历过的节点陆地,计数器就加一,然后把该节点陆地所能遍历到的陆地都标记上。 + +在遇到标记过的陆地节点和海洋节点的时候直接跳过。 这样计数器就是最终岛屿的数量。 + +那么如果把节点陆地所能遍历到的陆地都标记上呢,就可以使用 DFS,BFS或者并查集。 + +### 广度优先搜索 + +不少同学用广搜做这道题目的时候,超时了。 这里有一个广搜中很重要的细节: + +根本原因是**只要 加入队列就代表 走过,就需要标记,而不是从队列拿出来的时候再去标记走过**。 + +很多同学可能感觉这有区别吗? + +如果从队列拿出节点,再去标记这个节点走过,就会发生下图所示的结果,会导致很多节点重复加入队列。 + +![图二](https://code-thinking-1253855093.file.myqcloud.com/pics/20220727100846.png) + +超时写法 (从队列中取出节点再标记) + +```CPP +int dir[4][2] = {0, 1, 1, 0, -1, 0, 0, -1}; // 四个方向 +void bfs(vector>& grid, vector>& visited, int x, int y) { + queue> que; + que.push({x, y}); + while(!que.empty()) { + pair cur = que.front(); que.pop(); + int curx = cur.first; + int cury = cur.second; + visited[curx][cury] = true; // 从队列中取出在标记走过 + for (int i = 0; i < 4; i++) { + int nextx = curx + dir[i][0]; + int nexty = cury + dir[i][1]; + if (nextx < 0 || nextx >= grid.size() || nexty < 0 || nexty >= grid[0].size()) continue; // 越界了,直接跳过 + if (!visited[nextx][nexty] && grid[nextx][nexty] == '1') { + que.push({nextx, nexty}); + } + } + } + +} +``` + +加入队列 就代表走过,立刻标记,正确写法: + +```CPP +int dir[4][2] = {0, 1, 1, 0, -1, 0, 0, -1}; // 四个方向 +void bfs(vector>& grid, vector>& visited, int x, int y) { + queue> que; + que.push({x, y}); + visited[x][y] = true; // 只要加入队列,立刻标记 + while(!que.empty()) { + pair cur = que.front(); que.pop(); + int curx = cur.first; + int cury = cur.second; + for (int i = 0; i < 4; i++) { + int nextx = curx + dir[i][0]; + int nexty = cury + dir[i][1]; + if (nextx < 0 || nextx >= grid.size() || nexty < 0 || nexty >= grid[0].size()) continue; // 越界了,直接跳过 + if (!visited[nextx][nexty] && grid[nextx][nexty] == '1') { + que.push({nextx, nexty}); + visited[nextx][nexty] = true; // 只要加入队列立刻标记 + } + } + } + +} +``` + +以上两个版本其实,其实只有细微区别,就是 `visited[x][y] = true;` 放在的地方,着去取决于我们对 代码中队列的定义,队列中的节点就表示已经走过的节点。 **所以只要加入队列,理解标记该节点走过**。 + +本题完整广搜代码: + +```CPP +class Solution { +private: +int dir[4][2] = {0, 1, 1, 0, -1, 0, 0, -1}; // 四个方向 +void bfs(vector>& grid, vector>& visited, int x, int y) { + queue> que; + que.push({x, y}); + visited[x][y] = true; // 只要加入队列,立刻标记 + while(!que.empty()) { + pair cur = que.front(); que.pop(); + int curx = cur.first; + int cury = cur.second; + for (int i = 0; i < 4; i++) { + int nextx = curx + dir[i][0]; + int nexty = cury + dir[i][1]; + if (nextx < 0 || nextx >= grid.size() || nexty < 0 || nexty >= grid[0].size()) continue; // 越界了,直接跳过 + if (!visited[nextx][nexty] && grid[nextx][nexty] == '1') { + que.push({nextx, nexty}); + visited[nextx][nexty] = true; // 只要加入队列立刻标记 + } + } + } +} +public: + int numIslands(vector>& grid) { + int n = grid.size(), m = grid[0].size(); + vector> visited = vector>(n, vector(m, false)); + + int result = 0; + for (int i = 0; i < n; i++) { + for (int j = 0; j < m; j++) { + if (!visited[i][j] && grid[i][j] == '1') { + result++; // 遇到没访问过的陆地,+1 + bfs(grid, visited, i, j); // 将与其链接的陆地都标记上 true + } + } + } + return result; + } +}; + +``` diff --git "a/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.md" "b/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\346\267\261\346\220\234\347\211\210.md" similarity index 57% rename from "problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.md" rename to "problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\346\267\261\346\220\234\347\211\210.md" index b88e5fd248..15ce8bd92a 100644 --- "a/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.md" +++ "b/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\346\267\261\346\220\234\347\211\210.md" @@ -128,116 +128,6 @@ public: 很多同学看了同一道题目,都是dfs,写法却不一样,有时候有终止条件,有时候连终止条件都没有,其实这就是根本原因,两种写法而已。 -### 广度优先搜索 - -不少同学用广搜做这道题目的时候,超时了。 这里有一个广搜中很重要的细节: - -根本原因是**只要 加入队列就代表 走过,就需要标记,而不是从队列拿出来的时候再去标记走过**。 - -很多同学可能感觉这有区别吗? - -如果从队列拿出节点,再去标记这个节点走过,就会发生下图所示的结果,会导致很多节点重复加入队列。 - -![图二](https://code-thinking-1253855093.file.myqcloud.com/pics/20220727100846.png) - -超时写法 (从队列中取出节点再标记) - -```CPP -int dir[4][2] = {0, 1, 1, 0, -1, 0, 0, -1}; // 四个方向 -void bfs(vector>& grid, vector>& visited, int x, int y) { - queue> que; - que.push({x, y}); - while(!que.empty()) { - pair cur = que.front(); que.pop(); - int curx = cur.first; - int cury = cur.second; - visited[curx][cury] = true; // 从队列中取出在标记走过 - for (int i = 0; i < 4; i++) { - int nextx = curx + dir[i][0]; - int nexty = cury + dir[i][1]; - if (nextx < 0 || nextx >= grid.size() || nexty < 0 || nexty >= grid[0].size()) continue; // 越界了,直接跳过 - if (!visited[nextx][nexty] && grid[nextx][nexty] == '1') { - que.push({nextx, nexty}); - } - } - } - -} -``` - -加入队列 就代表走过,立刻标记,正确写法: - -```CPP -int dir[4][2] = {0, 1, 1, 0, -1, 0, 0, -1}; // 四个方向 -void bfs(vector>& grid, vector>& visited, int x, int y) { - queue> que; - que.push({x, y}); - visited[x][y] = true; // 只要加入队列,立刻标记 - while(!que.empty()) { - pair cur = que.front(); que.pop(); - int curx = cur.first; - int cury = cur.second; - for (int i = 0; i < 4; i++) { - int nextx = curx + dir[i][0]; - int nexty = cury + dir[i][1]; - if (nextx < 0 || nextx >= grid.size() || nexty < 0 || nexty >= grid[0].size()) continue; // 越界了,直接跳过 - if (!visited[nextx][nexty] && grid[nextx][nexty] == '1') { - que.push({nextx, nexty}); - visited[nextx][nexty] = true; // 只要加入队列立刻标记 - } - } - } - -} -``` - -以上两个版本其实,其实只有细微区别,就是 `visited[x][y] = true;` 放在的地方,着去取决于我们对 代码中队列的定义,队列中的节点就表示已经走过的节点。 **所以只要加入队列,理解标记该节点走过**。 - -本题完整广搜代码: - -```CPP -class Solution { -private: -int dir[4][2] = {0, 1, 1, 0, -1, 0, 0, -1}; // 四个方向 -void bfs(vector>& grid, vector>& visited, int x, int y) { - queue> que; - que.push({x, y}); - visited[x][y] = true; // 只要加入队列,立刻标记 - while(!que.empty()) { - pair cur = que.front(); que.pop(); - int curx = cur.first; - int cury = cur.second; - for (int i = 0; i < 4; i++) { - int nextx = curx + dir[i][0]; - int nexty = cury + dir[i][1]; - if (nextx < 0 || nextx >= grid.size() || nexty < 0 || nexty >= grid[0].size()) continue; // 越界了,直接跳过 - if (!visited[nextx][nexty] && grid[nextx][nexty] == '1') { - que.push({nextx, nexty}); - visited[nextx][nexty] = true; // 只要加入队列立刻标记 - } - } - } -} -public: - int numIslands(vector>& grid) { - int n = grid.size(), m = grid[0].size(); - vector> visited = vector>(n, vector(m, false)); - - int result = 0; - for (int i = 0; i < n; i++) { - for (int j = 0; j < m; j++) { - if (!visited[i][j] && grid[i][j] == '1') { - result++; // 遇到没访问过的陆地,+1 - bfs(grid, visited, i, j); // 将与其链接的陆地都标记上 true - } - } - } - return result; - } -}; - -``` - ## 总结 其实本题是 dfs,bfs 模板题,但正是因为是模板题,所以大家或者一些题解把重要的细节都很忽略了,我这里把大家没注意的但以后会踩的坑 都给列出来了。 diff --git "a/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" "b/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" index e2825cfb30..4057053e4f 100644 --- "a/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" +++ "b/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" @@ -34,7 +34,6 @@ 本篇给出按照普通二叉树的求法以及利用完全二叉树性质的求法。 - ## 普通二叉树 首先按照普通二叉树的逻辑来求。 @@ -145,6 +144,14 @@ public: 以上方法都是按照普通二叉树来做的,对于完全二叉树特性不了解的同学可以看这篇 [关于二叉树,你该了解这些!](https://programmercarl.com/二叉树理论基础.html),这篇详细介绍了各种二叉树的特性。 +在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2^(h-1)  个节点。 + +**大家要自己看完全二叉树的定义,很多同学对完全二叉树其实不是真正的懂了。** + +我来举一个典型的例子如题: + + + 完全二叉树只有两种情况,情况一:就是满二叉树,情况二:最后一层叶子节点没有满。 对于情况一,可以直接用 2^树深度 - 1 来计算,注意这里根节点深度为1。 @@ -159,7 +166,59 @@ public: 可以看出如果整个树不是满二叉树,就递归其左右孩子,直到遇到满二叉树为止,用公式计算这个子树(满二叉树)的节点数量。 -C++代码如下: +这里关键在于如果去判断一个左子树或者右子树是不是满二叉树呢? + +在完全二叉树中,如果递归向左遍历的深度等于递归向右遍历的深度,那说明就是满二叉树。如图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20220829163554.png) + +在完全二叉树中,如果递归向左遍历的深度不等于递归向右遍历的深度,则说明不是满二叉树,如图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20220829163709.png) + +哪有录友说了,这种情况,递归向左遍历的深度等于递归向右遍历的深度,但也不是满二叉树,如题: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20220829163811.png) + +如果这么想,大家就是对 完全二叉树理解有误区了,**以上这棵二叉树,它根本就不是一个完全二叉树**! + +判断其子树岂不是满二叉树,如果是则利用用公式计算这个子树(满二叉树)的节点数量,如果不是则继续递归,那么 在递归三部曲中,第二部:终止条件的写法应该是这样的: + +```CPP +if (root == nullptr) return 0; +// 开始根据做深度和有深度是否相同来判断该子树是不是满二叉树 +TreeNode* left = root->left; +TreeNode* right = root->right; +int leftDepth = 0, rightDepth = 0; // 这里初始为0是有目的的,为了下面求指数方便 +while (left) { // 求左子树深度 + left = left->left; + leftDepth++; +} +while (right) { // 求右子树深度 + right = right->right; + rightDepth++; +} +if (leftDepth == rightDepth) { + return (2 << leftDepth) - 1; // 注意(2<<1) 相当于2^2,返回满足满二叉树的子树节点数量 +} +``` + +递归三部曲,第三部,单层递归的逻辑:(可以看出使用后序遍历) + +```CPP +int leftTreeNum = countNodes(root->left); // 左 +int rightTreeNum = countNodes(root->right); // 右 +int result = leftTreeNum + rightTreeNum + 1; // 中 +return result; +``` + +该部分精简之后代码为: + +```CPP +return countNodes(root->left) + countNodes(root->right) + 1; +``` + +最后整体C++代码如下: ```CPP class Solution { @@ -168,17 +227,17 @@ public: if (root == nullptr) return 0; TreeNode* left = root->left; TreeNode* right = root->right; - int leftHeight = 0, rightHeight = 0; // 这里初始为0是有目的的,为了下面求指数方便 + int leftDepth = 0, rightDepth = 0; // 这里初始为0是有目的的,为了下面求指数方便 while (left) { // 求左子树深度 left = left->left; - leftHeight++; + leftDepth++; } while (right) { // 求右子树深度 right = right->right; - rightHeight++; + rightDepth++; } - if (leftHeight == rightHeight) { - return (2 << leftHeight) - 1; // 注意(2<<1) 相当于2^2,所以leftHeight初始为0 + if (leftDepth == rightDepth) { + return (2 << leftDepth) - 1; // 注意(2<<1) 相当于2^2,所以leftDepth初始为0 } return countNodes(root->left) + countNodes(root->right) + 1; } @@ -310,16 +369,16 @@ class Solution: return 0 left = root.left right = root.right - leftHeight = 0 #这里初始为0是有目的的,为了下面求指数方便 - rightHeight = 0 + leftDepth = 0 #这里初始为0是有目的的,为了下面求指数方便 + rightDepth = 0 while left: #求左子树深度 left = left.left - leftHeight += 1 + leftDepth += 1 while right: #求右子树深度 right = right.right - rightHeight += 1 - if leftHeight == rightHeight: - return (2 << leftHeight) - 1 #注意(2<<1) 相当于2^2,所以leftHeight初始为0 + rightDepth += 1 + if leftDepth == rightDepth: + return (2 << leftDepth) - 1 #注意(2<<1) 相当于2^2,所以leftDepth初始为0 return self.countNodes(root.left) + self.countNodes(root.right) + 1 ``` @@ -431,17 +490,17 @@ var countNodes = function(root) { } let left=root.left; let right=root.right; - let leftHeight=0,rightHeight=0; + let leftDepth=0,rightDepth=0; while(left){ left=left.left; - leftHeight++; + leftDepth++; } while(right){ right=right.right; - rightHeight++; + rightDepth++; } - if(leftHeight==rightHeight){ - return Math.pow(2,leftHeight+1)-1; + if(leftDepth==rightDepth){ + return Math.pow(2,leftDepth+1)-1; } return countNodes(root.left)+countNodes(root.right)+1; }; @@ -554,24 +613,24 @@ int countNodes(struct TreeNode* root){ int countNodes(struct TreeNode* root){ if(!root) return 0; - int leftHeight = 0; - int rightHeight = 0; + int leftDepth = 0; + int rightDepth = 0; struct TreeNode* rightNode = root->right; struct TreeNode* leftNode = root->left; //求出左子树深度 while(leftNode) { leftNode = leftNode->left; - leftHeight++; + leftDepth++; } //求出右子树深度 while(rightNode) { rightNode = rightNode->right; - rightHeight++; + rightDepth++; } //若左右子树深度相同,为满二叉树。结点个数为2^height-1 - if(rightHeight == leftHeight) { - return (2 << leftHeight) - 1; + if(rightDepth == leftDepth) { + return (2 << leftDepth) - 1; } //否则返回左右子树的结点个数+1 return countNodes(root->right) + countNodes(root->left) + 1; diff --git "a/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" "b/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" index 83d20df856..61a760ce26 100644 --- "a/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" @@ -25,6 +25,8 @@ # 思路 +《代码随想录》算法视频公开课:[听说一位巨佬面Google被拒了,因为没写出翻转二叉树 | LeetCode:226.翻转二叉树](https://www.bilibili.com/video/BV1sP4y1f7q7),相信结合视频在看本篇题解,更有助于大家对本题的理解。 + 我们之前介绍的都是各种方式遍历二叉树,这次要翻转了,感觉还是有点懵逼。 这得怎么翻转呢? diff --git "a/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" "b/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" index d84cc6e106..0dc9a09b46 100644 --- "a/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" +++ "b/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" @@ -141,11 +141,12 @@ if (cur->right) { 那么本题整体代码如下: ```CPP +// 版本一 class Solution { private: void traversal(TreeNode* cur, vector& path, vector& result) { - path.push_back(cur->val); + path.push_back(cur->val); // 中,中为什么写在这里,因为最后一个节点也要加入到path中 // 这才到了叶子节点 if (cur->left == NULL && cur->right == NULL) { string sPath; @@ -157,11 +158,11 @@ private: result.push_back(sPath); return; } - if (cur->left) { + if (cur->left) { // 左 traversal(cur->left, path, result); path.pop_back(); // 回溯 } - if (cur->right) { + if (cur->right) { // 右 traversal(cur->right, path, result); path.pop_back(); // 回溯 } @@ -209,7 +210,7 @@ public: 如上代码精简了不少,也隐藏了不少东西。 -注意在函数定义的时候`void traversal(TreeNode* cur, string path, vector& result)` ,定义的是`string path`,每次都是复制赋值,不用使用引用,否则就无法做到回溯的效果。 +注意在函数定义的时候`void traversal(TreeNode* cur, string path, vector& result)` ,定义的是`string path`,每次都是复制赋值,不用使用引用,否则就无法做到回溯的效果。(这里涉及到C++语法知识) 那么在如上代码中,**貌似没有看到回溯的逻辑,其实不然,回溯就隐藏在`traversal(cur->left, path + "->", result);`中的 `path + "->"`。** 每次函数调用完,path依然是没有加上"->" 的,这就是回溯了。 @@ -247,15 +248,54 @@ if (cur->right) { if (cur->left) { path += "->"; traversal(cur->left, path, result); // 左 - path.pop_back(); // 回溯 - path.pop_back(); + path.pop_back(); // 回溯 '>' + path.pop_back(); // 回溯 '-' } if (cur->right) { path += "->"; traversal(cur->right, path, result); // 右 - path.pop_back(); // 回溯 - path.pop_back(); + path.pop_back(); // 回溯 '>' + path.pop_back(); // 回溯 '-' } +``` + +整体代码如下: + +```CPP +//版本二 +class Solution { +private: + void traversal(TreeNode* cur, string path, vector& result) { + path += to_string(cur->val); // 中,中为什么写在这里,因为最后一个节点也要加入到path中 + if (cur->left == NULL && cur->right == NULL) { + result.push_back(path); + return; + } + if (cur->left) { + path += "->"; + traversal(cur->left, path, result); // 左 + path.pop_back(); // 回溯 '>' + path.pop_back(); // 回溯 '-' + } + if (cur->right) { + path += "->"; + traversal(cur->right, path, result); // 右 + path.pop_back(); // 回溯'>' + path.pop_back(); // 回溯 '-' + } + } + +public: + vector binaryTreePaths(TreeNode* root) { + vector result; + string path; + if (root == NULL) return result; + traversal(root, path, result); + return result; + + } +}; + ``` **大家应该可以感受出来,如果把 `path + "->"`作为函数参数就是可以的,因为并有没有改变path的数值,执行完递归函数之后,path依然是之前的数值(相当于回溯了)** @@ -263,6 +303,27 @@ if (cur->right) { **综合以上,第二种递归的代码虽然精简但把很多重要的点隐藏在了代码细节里,第一种递归写法虽然代码多一些,但是把每一个逻辑处理都完整的展现了出来了。** +## 拓展 + +这里讲解本题解的写法逻辑以及一些更具体的细节,下面的讲解中,涉及到C++语法特性,如果不是C++的录友,就可以不看了,避免越看越晕。 + +如果是C++的录友,建议本题独立刷过两遍,在看下面的讲解,同样避免越看越晕,造成不必要的负担。 + +在第二版本的代码中,其实仅仅是回溯了 `->` 部分(调用两次pop_back,一个pop`>` 一次pop`-`),大家应该疑惑那么 `path += to_string(cur->val);` 这一步为什么没有回溯呢? 一条路径能持续加节点 不做回溯吗? + +其实关键还在于 参数,使用的是 `string path`,这里并没有加上引用`&` ,即本层递归中,path + 该节点数值,但该层递归结束,上一层path的数值并不会受到任何影响。 如图所示: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20220831173322.png) + +节点4 的path,在遍历到节点3,path+3,遍历节点3的递归结束之后,返回节点4(回溯的过程),path并不会把3加上。 + +所以这是参数中,不带引用,不做地址拷贝,只做内容拷贝的效果。(这里涉及到C++引用方面的知识) + +在第一个版本中,函数参数我就使用了引用,即 `vector& path` ,这是会拷贝地址的,所以 本层递归逻辑如果有`path.push_back(cur->val);` 就一定要有对应的 `path.pop_back()` + +那有同学可能想,为什么不去定义一个 `string& path` 这样的函数参数呢,然后也可能在递归函数中展现回溯的过程,但关键在于,`path += to_string(cur->val);` 每次是加上一个数字,这个数字如果是个位数,那好说,就调用一次`path.pop_back()`,但如果是 十位数,百位数,千位数呢? 百位数就要调用三次`path.pop_back()`,才能实现对应的回溯操作,这样代码实现就太冗余了。 + +所以,第一个代码版本中,我才使用 vector 类型的path,这样方便给大家演示代码中回溯的操作。 vector类型的path,不管 每次 路径收集的数字是几位数,总之一定是int,所以就一次 pop_back就可以。 ## 迭代法 diff --git "a/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" "b/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" index d4059b9ba4..8f5a3914d0 100644 --- "a/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" +++ "b/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" @@ -33,12 +33,6 @@ 《代码随想录》算法视频公开课:[优先级队列正式登场!大顶堆、小顶堆该怎么用?| LeetCode:347.前 K 个高频元素](https://www.bilibili.com/video/BV1Xg41167Lz),相信结合视频在看本篇题解,更有助于大家对本题的理解。 -

- -

- - - 这道题目主要涉及到如下三块内容: 1. 要统计元素出现频率 2. 对频率排序 diff --git "a/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" "b/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" index 8485cdacf5..2d522f41cb 100644 --- "a/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" +++ "b/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" @@ -19,7 +19,7 @@ **首先要注意是判断左叶子,不是二叉树左侧节点,所以不要上来想着层序遍历。** -因为题目中其实没有说清楚左叶子究竟是什么节点,那么我来给出左叶子的明确定义:**如果左节点不为空,且左节点没有左右孩子,那么这个节点的左节点就是左叶子** +因为题目中其实没有说清楚左叶子究竟是什么节点,那么我来给出左叶子的明确定义:**节点A的左孩子不为空,且左孩子的左右孩子都为空(说明是叶子节点),那么A节点的左孩子为左叶子节点** 大家思考一下如下图中二叉树,左叶子之和究竟是多少? @@ -27,12 +27,18 @@ **其实是0,因为这棵树根本没有左叶子!** +但看这个图的左叶子之和是多少? + +![图二](https://code-thinking-1253855093.file.myqcloud.com/pics/20220902165805.png) + +相信通过这两个图,大家可以最左叶子的定义有明确理解了。 + 那么**判断当前节点是不是左叶子是无法判断的,必须要通过节点的父节点来判断其左孩子是不是左叶子。** 如果该节点的左节点不为空,该节点的左节点的左节点为空,该节点的左节点的右节点为空,则找到了一个左叶子,判断代码如下: -``` +```CPP if (node->left != NULL && node->left->left == NULL && node->left->right == NULL) { 左叶子节点处理逻辑 } @@ -40,7 +46,7 @@ if (node->left != NULL && node->left->left == NULL && node->left->right == NULL) ## 递归法 -递归的遍历顺序为后序遍历(左右中),是因为要通过递归函数的返回值来累加求取左叶子数值之和。。 +递归的遍历顺序为后序遍历(左右中),是因为要通过递归函数的返回值来累加求取左叶子数值之和。 递归三部曲: @@ -52,11 +58,20 @@ if (node->left != NULL && node->left->left == NULL && node->left->right == NULL) 2. 确定终止条件 -依然是 +如果遍历到空节点,那么左叶子值一定是0 + +```CPP +if (root == NULL) return 0; ``` + +注意,只有当前遍历的节点是父节点,才能判断其子节点是不是左叶子。 所以如果当前遍历的节点是叶子节点,那其左叶子也必定是0,那么终止条件为: + +```CPP if (root == NULL) return 0; +if (root->left == NULL && root->right== NULL) return 0; //其实这个也可以不写,如果不写不影响结果,但就会让递归多进行了一层。 ``` + 3. 确定单层递归的逻辑 当遇到左叶子节点的时候,记录数值,然后通过递归求取左子树左叶子之和,和 右子树左叶子之和,相加便是整个树的左叶子之和。 @@ -65,13 +80,12 @@ if (root == NULL) return 0; ```CPP int leftValue = sumOfLeftLeaves(root->left); // 左 -int rightValue = sumOfLeftLeaves(root->right); // 右 - // 中 -int midValue = 0; if (root->left && !root->left->left && !root->left->right) { - midValue = root->left->val; + leftValue = root->left->val; } -int sum = midValue + leftValue + rightValue; +int rightValue = sumOfLeftLeaves(root->right); // 右 + +int sum = leftValue + rightValue; // 中 return sum; ``` @@ -84,18 +98,19 @@ class Solution { public: int sumOfLeftLeaves(TreeNode* root) { if (root == NULL) return 0; + if (root->left == NULL && root->right== NULL) return 0; int leftValue = sumOfLeftLeaves(root->left); // 左 - int rightValue = sumOfLeftLeaves(root->right); // 右 - // 中 - int midValue = 0; - if (root->left && !root->left->left && !root->left->right) { // 中 - midValue = root->left->val; + if (root->left && !root->left->left && !root->left->right) { // 左子树就是一个左叶子的情况 + leftValue = root->left->val; } - int sum = midValue + leftValue + rightValue; + int rightValue = sumOfLeftLeaves(root->right); // 右 + + int sum = leftValue + rightValue; // 中 return sum; } }; + ``` 以上代码精简之后如下: @@ -105,17 +120,18 @@ class Solution { public: int sumOfLeftLeaves(TreeNode* root) { if (root == NULL) return 0; - int midValue = 0; + int leftValue = 0; if (root->left != NULL && root->left->left == NULL && root->left->right == NULL) { - midValue = root->left->val; + leftValue = root->left->val; } - return midValue + sumOfLeftLeaves(root->left) + sumOfLeftLeaves(root->right); + return leftValue + sumOfLeftLeaves(root->left) + sumOfLeftLeaves(root->right); } }; -``` +``` -## 迭代法 +精简之后的代码其实看不出来用的是什么遍历方式了,对于算法初学者以上根据第一个版本来学习。 +## 迭代法 本题迭代法使用前中后序都是可以的,只要把左叶子节点统计出来,就可以了,那么参考文章 [二叉树:听说递归能做的,栈也能做!](https://programmercarl.com/二叉树的迭代遍历.html)和[二叉树:迭代法统一写法](https://programmercarl.com/二叉树的统一迭代法.html)中的写法,可以写出一个前序遍历的迭代法。 diff --git "a/problems/0695.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" "b/problems/0695.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" index 3739882aff..e5567aec64 100644 --- "a/problems/0695.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" +++ "b/problems/0695.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" @@ -16,8 +16,14 @@ # 思路 -这道题目也是 dfs bfs基础类题目。 +注意题目中每座岛屿只能由**水平方向和/或竖直方向上**相邻的陆地连接形成。 + +也就是说斜角度链接是不算了, 例如示例二,是三个岛屿,如图: + +![图一](https://code-thinking-1253855093.file.myqcloud.com/pics/20220726094200.png) + +这道题目也是 dfs bfs基础类题目。 ## DFS @@ -110,6 +116,10 @@ public: ## BFS +关于广度优先搜索,如果大家还不了解的话,看这里:[广度优先搜索精讲](https://leetcode.cn/circle/discuss/V3FulB/) + +本题BFS代码如下: + ```CPP class Solution { private: diff --git "a/problems/0827.\346\234\200\345\244\247\344\272\272\345\267\245\345\262\233.md" "b/problems/0827.\346\234\200\345\244\247\344\272\272\345\267\245\345\262\233.md" new file mode 100644 index 0000000000..55d6c3972f --- /dev/null +++ "b/problems/0827.\346\234\200\345\244\247\344\272\272\345\267\245\345\262\233.md" @@ -0,0 +1,168 @@ +# 827. 最大人工岛 + +给你一个大小为 n x n 二进制矩阵 grid 。最多 只能将一格 0 变成 1 。 + +返回执行此操作后,grid 中最大的岛屿面积是多少? + +岛屿 由一组上、下、左、右四个方向相连的 1 形成。 + +示例 1: +* 输入: grid = [[1, 0], [0, 1]] +* 输出: 3 +* 解释: 将一格0变成1,最终连通两个小岛得到面积为 3 的岛屿。 + +示例 2: +* 输入: grid = [[1, 1], [1, 0]] +* 输出: 4 +* 解释: 将一格0变成1,岛屿的面积扩大为 4。 + +示例 3: +* 输入: grid = [[1, 1], [1, 1]] +* 输出: 4 +* 解释: 没有0可以让我们变成1,面积依然为 4。 + +# 思路 + +本题的一个暴力想法,应该是遍历地图尝试 将每一个 0 改成1,然后去搜索地图中的最大的岛屿面积。 + +计算地图的最大面积:遍历地图 + 深搜岛屿,时间复杂度为 n * n + +每改变一个0的方格,都需要重新计算一个地图的最大面积,所以 整体时间复杂度为:n^4。 + +如果对深度优先搜索不了解的录友,可以看这里:[深度优先搜索精讲](https://leetcode.cn/problems/all-paths-from-source-to-target/solution/by-carlsun-2-66pf/) + + +## 优化思路 + +其实每次深搜遍历计算最大岛屿面积,我们都做了很多重复的工作。 + +只要把深搜就可以并每个岛屿的面积记录下来就好。 + +第一步:一次遍历地图,得出各个岛屿的面积,并做编号记录。可以使用map记录,key为岛屿编号,value为岛屿面积 +第二步:在遍历地图,遍历0的方格(因为要将0变成1),并统计该1(由0变成的1)周边岛屿面积,将其相邻面积相加在一起,遍历所有 0 之后,就可以得出 选一个0变成1 之后的最大面积。 + +拿如下地图的岛屿情况来举例: (1为陆地) + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20220829104834.png) + +第一步,则遍历题目,并将岛屿到编号和面积上的统计,过程如图所示: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20220829105644.png) + + +本过程代码如下: + +```CPP +int dir[4][2] = {0, 1, 1, 0, -1, 0, 0, -1}; // 四个方向 +void dfs(vector>& grid, vector>& visited, int x, int y, int mark) { + if (visited[x][y] || grid[x][y] == 0) return; // 终止条件:访问过的节点 或者 遇到海水 + visited[x][y] = true; // 标记访问过 + grid[x][y] = mark; // 给陆地标记新标签 + count++; + for (int i = 0; i < 4; i++) { + int nextx = x + dir[i][0]; + int nexty = y + dir[i][1]; + if (nextx < 0 || nextx >= grid.size() || nexty < 0 || nexty >= grid[0].size()) continue; // 越界了,直接跳过 + dfs(grid, visited, nextx, nexty, mark); + } +} + +int largestIsland(vector>& grid) { + int n = grid.size(), m = grid[0].size(); + vector> visited = vector>(n, vector(m, false)); + unordered_map gridNum; + int mark = 2; // 记录每个岛屿的编号 + bool isAllGrid = true; // 标记是否整个地图都是陆地 + for (int i = 0; i < n; i++) { + for (int j = 0; j < m; j++) { + if (grid[i][j] == 0) isAllGrid = false; + if (!visited[i][j] && grid[i][j] == 1) { + count = 0; + dfs(grid, visited, i, j, mark); // 将与其链接的陆地都标记上 true + gridNum[mark] = count; // 记录每一个岛屿的面积 + mark++; // 记录下一个岛屿编号 + } + } + } +} +``` + +这个过程时间复杂度 n * n 。可能有录友想:分明是两个for循环下面套这一个dfs,时间复杂度怎么回事 n * n呢? + +其实大家可以自己看代码的时候,**n * n这个方格地图中,每个节点我们就遍历一次,并不会重复遍历**。 + +第二步过程如图所示: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20220829105249.png) + +也就是遍历每一个0的方格,并统计其相邻岛屿面积,最后取一个最大值。 + +这个过程的时间复杂度也为 n * n。 + +所以整个解法的时间复杂度,为 n * n + n * n 也就是 n^2。 + +最后,整体代码如下: + +```CPP +class Solution { +private: + int count; + int dir[4][2] = {0, 1, 1, 0, -1, 0, 0, -1}; // 四个方向 + void dfs(vector>& grid, vector>& visited, int x, int y, int mark) { + if (visited[x][y] || grid[x][y] == 0) return; // 终止条件:访问过的节点 或者 遇到海水 + visited[x][y] = true; // 标记访问过 + grid[x][y] = mark; // 给陆地标记新标签 + count++; + for (int i = 0; i < 4; i++) { + int nextx = x + dir[i][0]; + int nexty = y + dir[i][1]; + if (nextx < 0 || nextx >= grid.size() || nexty < 0 || nexty >= grid[0].size()) continue; // 越界了,直接跳过 + dfs(grid, visited, nextx, nexty, mark); + } + } + +public: + int largestIsland(vector>& grid) { + int n = grid.size(), m = grid[0].size(); + vector> visited = vector>(n, vector(m, false)); + unordered_map gridNum; + int mark = 2; // 记录每个岛屿的编号 + bool isAllGrid = true; // 标记是否整个地图都是陆地 + for (int i = 0; i < n; i++) { + for (int j = 0; j < m; j++) { + if (grid[i][j] == 0) isAllGrid = false; + if (!visited[i][j] && grid[i][j] == 1) { + count = 0; + dfs(grid, visited, i, j, mark); // 将与其链接的陆地都标记上 true + gridNum[mark] = count; // 记录每一个岛屿的面积 + mark++; // 记录下一个岛屿编号 + } + } + } + if (isAllGrid) return n * m; // 如果都是陆地,返回全面积 + + // 以下逻辑是根据添加陆地的位置,计算周边岛屿面积之和 + int result = 0; // 记录最后结果 + unordered_set visitedGrid; // 标记访问过的岛屿 + for (int i = 0; i < n; i++) { + for (int j = 0; j < m; j++) { + int count = 1; // 记录连接之后的岛屿数量 + visitedGrid.clear(); // 每次使用时,清空 + if (grid[i][j] == 0) { + for (int k = 0; k < 4; k++) { + int neari = i + dir[k][1]; // 计算相邻坐标 + int nearj = j + dir[k][0]; + if (neari < 0 || neari >= grid.size() || nearj < 0 || nearj >= grid[0].size()) continue; + if (visitedGrid.count(grid[neari][nearj])) continue; // 添加过的岛屿不要重复添加 + // 把相邻四面的岛屿数量加起来 + count += gridNum[grid[neari][nearj]]; + visitedGrid.insert(grid[neari][nearj]); // 标记该岛屿已经添加过 + } + } + result = max(result, count); + } + } + return result; + } +}; +``` diff --git "a/problems/0841.\351\222\245\345\214\231\345\222\214\346\210\277\351\227\264.md" "b/problems/0841.\351\222\245\345\214\231\345\222\214\346\210\277\351\227\264.md" index 58765a8fae..edef21c20c 100644 --- "a/problems/0841.\351\222\245\345\214\231\345\222\214\346\210\277\351\227\264.md" +++ "b/problems/0841.\351\222\245\345\214\231\345\222\214\346\210\277\351\227\264.md" @@ -54,7 +54,7 @@ 在图3中,大家可以发现,节点0只能到节点5,然后就哪也去不了了。 -所以本题是一个有向图搜索全路径的问题。 只能用深搜(BFS)或者广搜(DFS)来搜。 +所以本题是一个有向图搜索全路径的问题。 只能用深搜(DFS)或者广搜(BFS)来搜。 关于DFS的理论,如果大家有困惑,可以先看我这篇题解: [DFS理论基础](https://leetcode.cn/problems/all-paths-from-source-to-target/solution/by-carlsun-2-66pf) diff --git "a/problems/1020.\351\243\236\345\234\260\347\232\204\346\225\260\351\207\217.md" "b/problems/1020.\351\243\236\345\234\260\347\232\204\346\225\260\351\207\217.md" new file mode 100644 index 0000000000..4095fe9d84 --- /dev/null +++ "b/problems/1020.\351\243\236\345\234\260\347\232\204\346\225\260\351\207\217.md" @@ -0,0 +1,139 @@ + +# 1020. 飞地的数量 + +给你一个大小为 m x n 的二进制矩阵 grid ,其中 0 表示一个海洋单元格、1 表示一个陆地单元格。 + +一次 移动 是指从一个陆地单元格走到另一个相邻(上、下、左、右)的陆地单元格或跨过 grid 的边界。 + +返回网格中 无法 在任意次数的移动中离开网格边界的陆地单元格的数量。 + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20220830100710.png) + +* 输入:grid = [[0,0,0,0],[1,0,1,0],[0,1,1,0],[0,0,0,0]] +* 输出:3 +* 解释:有三个 1 被 0 包围。一个 1 没有被包围,因为它在边界上。 + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20220830100742.png) + +* 输入:grid = [[0,1,1,0],[0,0,1,0],[0,0,1,0],[0,0,0,0]] +* 输出:0 +* 解释:所有 1 都在边界上或可以到达边界。 + +## 思路 + +本题使用dfs,bfs,并查集都是可以的。 本题和 417. 太平洋大西洋水流问题 很像。 + +本题要求找到不靠边的陆地面积,那么我们只要从周边找到陆地然后 通过 dfs或者bfs 将周边靠陆地且相邻的陆地都变成海洋,然后再去重新遍历地图的时候,统计此时还剩下的陆地就可以了。 + +如图,在遍历地图周围四个边,靠地图四边的陆地,都为绿色, + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20220830104632.png) + +在遇到地图周边陆地的时候,将1都变为0,此时地图为这样: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20220830104651.png) + +然后我们再去遍历这个地图,遇到有陆地的地方,去采用深搜或者广搜,边统计所有陆地。 + +如果对深搜或者广搜不够了解,建议先看这里:[深度优先搜索精讲](https://leetcode.cn/problems/all-paths-from-source-to-target/solution/by-carlsun-2-66pf/),[广度优先搜索精讲](https://leetcode.cn/circle/discuss/V3FulB/) + +采用深度优先搜索的代码如下: + +```CPP +class Solution { +private: + int dir[4][2] = {-1, 0, 0, -1, 1, 0, 0, 1}; // 保存四个方向 + int count; // 统计符合题目要求的陆地空格数量 + void dfs(vector>& grid, int x, int y) { + grid[x][y] = 0; + count++; + for (int i = 0; i < 4; i++) { // 向四个方向遍历 + int nextx = x + dir[i][0]; + int nexty = y + dir[i][1]; + // 超过边界 + if (nextx < 0 || nextx >= grid.size() || nexty < 0 || nexty >= grid[0].size()) continue; + // 不符合条件,不继续遍历 + if (grid[nextx][nexty] == 0) continue; + + dfs (grid, nextx, nexty); + } + return; + } + +public: + int numEnclaves(vector>& grid) { + int n = grid.size(), m = grid[0].size(); + // 从左侧边,和右侧边 向中间遍历 + for (int i = 0; i < n; i++) { + if (grid[i][0] == 1) dfs(grid, i, 0); + if (grid[i][m - 1] == 1) dfs(grid, i, m - 1); + } + // 从上边和下边 向中间遍历 + for (int j = 0; j < m; j++) { + if (grid[0][j] == 1) dfs(grid, 0, j); + if (grid[n - 1][j] == 1) dfs(grid, n - 1, j); + } + count = 0; + for (int i = 0; i < n; i++) { + for (int j = 0; j < m; j++) { + if (grid[i][j] == 1) dfs(grid, i, j); + } + } + return count; + } +}; +``` + +采用广度优先搜索的代码如下: + +```CPP +class Solution { +private: +int count = 0; +int dir[4][2] = {0, 1, 1, 0, -1, 0, 0, -1}; // 四个方向 +void bfs(vector>& grid, int x, int y) { + queue> que; + que.push({x, y}); + grid[x][y] = 0; // 只要加入队列,立刻标记 + count++; + while(!que.empty()) { + pair cur = que.front(); que.pop(); + int curx = cur.first; + int cury = cur.second; + for (int i = 0; i < 4; i++) { + int nextx = curx + dir[i][0]; + int nexty = cury + dir[i][1]; + if (nextx < 0 || nextx >= grid.size() || nexty < 0 || nexty >= grid[0].size()) continue; // 越界了,直接跳过 + if (grid[nextx][nexty] == 1) { + que.push({nextx, nexty}); + count++; + grid[nextx][nexty] = 0; // 只要加入队列立刻标记 + } + } + } + +} + +public: + int numEnclaves(vector>& grid) { + int n = grid.size(), m = grid[0].size(); + // 从左侧边,和右侧边 向中间遍历 + for (int i = 0; i < n; i++) { + if (grid[i][0] == 1) bfs(grid, i, 0); + if (grid[i][m - 1] == 1) bfs(grid, i, m - 1); + } + // 从上边和下边 向中间遍历 + for (int j = 0; j < m; j++) { + if (grid[0][j] == 1) bfs(grid, 0, j); + if (grid[n - 1][j] == 1) bfs(grid, n - 1, j); + } + count = 0; + for (int i = 0; i < n; i++) { + for (int j = 0; j < m; j++) { + if (grid[i][j] == 1) bfs(grid, i, j); + } + } + return count; + } +}; +``` diff --git "a/problems/1254.\347\273\237\350\256\241\345\260\201\351\227\255\345\262\233\345\261\277\347\232\204\346\225\260\347\233\256.md" "b/problems/1254.\347\273\237\350\256\241\345\260\201\351\227\255\345\262\233\345\261\277\347\232\204\346\225\260\347\233\256.md" new file mode 100644 index 0000000000..38e93d311e --- /dev/null +++ "b/problems/1254.\347\273\237\350\256\241\345\260\201\351\227\255\345\262\233\345\261\277\347\232\204\346\225\260\347\233\256.md" @@ -0,0 +1,74 @@ + +# 1254. 统计封闭岛屿的数目 + +[力扣题目链接](https://leetcode.cn/problems/number-of-closed-islands/) + +二维矩阵 grid 由 0 (土地)和 1 (水)组成。岛是由最大的4个方向连通的 0 组成的群,封闭岛是一个 完全 由1包围(左、上、右、下)的岛。 + +请返回 封闭岛屿 的数目。 + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20220830111533.png) + +* 输入:grid = [[1,1,1,1,1,1,1,0],[1,0,0,0,0,1,1,0],[1,0,1,0,1,1,1,0],[1,0,0,0,0,1,0,1],[1,1,1,1,1,1,1,0]] +* 输出:2 +* 解释:灰色区域的岛屿是封闭岛屿,因为这座岛屿完全被水域包围(即被 1 区域包围)。 + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20220830111601.png) + +* 输入:grid = [[0,0,1,0,0],[0,1,0,1,0],[0,1,1,1,0]] +* 输出:1 + +提示: + +* 1 <= grid.length, grid[0].length <= 100 +* 0 <= grid[i][j] <=1 + +## 思路 + +和 [1020. 飞地的数量](https://leetcode.cn/problems/number-of-enclaves/solution/by-carlsun-2-7lt9/) 思路是一样的,代码也基本一样 + +```CPP +class Solution { +private: + int dir[4][2] = {-1, 0, 0, -1, 1, 0, 0, 1}; // 保存四个方向 + void dfs(vector>& grid, int x, int y) { + grid[x][y] = 1; + for (int i = 0; i < 4; i++) { // 向四个方向遍历 + int nextx = x + dir[i][0]; + int nexty = y + dir[i][1]; + // 超过边界 + if (nextx < 0 || nextx >= grid.size() || nexty < 0 || nexty >= grid[0].size()) continue; + // 不符合条件,不继续遍历 + if (grid[nextx][nexty] == 1) continue; + + dfs (grid, nextx, nexty); + } + return; + } + +public: + int closedIsland(vector>& grid) { + int n = grid.size(), m = grid[0].size(); + // 从左侧边,和右侧边 向中间遍历 + for (int i = 0; i < n; i++) { + if (grid[i][0] == 0) dfs(grid, i, 0); + if (grid[i][m - 1] == 0) dfs(grid, i, m - 1); + } + // 从上边和下边 向中间遍历 + for (int j = 0; j < m; j++) { + if (grid[0][j] == 0) dfs(grid, 0, j); + if (grid[n - 1][j] == 0) dfs(grid, n - 1, j); + } + int count = 0; + for (int i = 0; i < n; i++) { + for (int j = 0; j < m; j++) { + if (grid[i][j] == 0) { + count++; + dfs(grid, i, j); + } + } + } + return count; + } +}; +``` diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" index 9e10ac20b3..f1c3c08bb1 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -6,6 +6,10 @@ # 二叉树理论基础篇 + +《代码随想录》算法视频公开课:[关于二叉树,你该了解这些!](https://www.bilibili.com/video/BV1Hy4y1t7ij),相信结合视频在看本篇题解,更有助于大家对本题的理解。 + + 题目分类大纲如下: 二叉树大纲 diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" index dc8e812c1c..0aa12432db 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" @@ -7,6 +7,12 @@ # 二叉树的迭代遍历 +《代码随想录》算法视频公开课: +* [写出二叉树的非递归遍历很难么?(前序和后序)](https://www.bilibili.com/video/BV15f4y1W7i2) +* [写出二叉树的非递归遍历很难么?(中序))](https://www.bilibili.com/video/BV1Zf4y1a77g) +相信结合视频在看本篇题解,更有助于大家对本题的理解。 + + > 听说还可以用非递归的方式 看完本篇大家可以使用迭代法,再重新解决如下三道leetcode上的题目: diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" index 1cce2a0db9..dc39295c7f 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" @@ -8,6 +8,10 @@ # 二叉树的递归遍历 + +《代码随想录》算法视频公开课:[每次写递归都要靠直觉? 这次带你学透二叉树的递归遍历!](https://www.bilibili.com/video/BV1Wh411S7xt),相信结合视频在看本篇题解,更有助于大家对本题的理解。 + + > 一看就会,一写就废! 这次我们要好好谈一谈递归,为什么很多同学看递归算法都是“一看就会,一写就废”。 diff --git "a/problems/\345\233\276\350\256\272\345\271\277\347\264\242\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\345\233\276\350\256\272\345\271\277\347\264\242\347\220\206\350\256\272\345\237\272\347\241\200.md" new file mode 100644 index 0000000000..a584adb2a3 --- /dev/null +++ "b/problems/\345\233\276\350\256\272\345\271\277\347\264\242\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -0,0 +1,121 @@ + +# 广度优先搜索理论基础 + +> 号外!!代码随想录图论内容已经计划开更了! + +在[深度优先搜索](https://leetcode.cn/problems/all-paths-from-source-to-target/solution/by-carlsun-2-66pf/)的讲解中,我们就讲过深度优先搜索和广度优先搜索的区别。 + +广搜(bfs)是一圈一圈的搜索过程,和深搜(dfs)是一条路跑到黑然后在回溯。 + +## 广搜的使用场景 + +广搜的搜索方式就适合于解决两个点之间的最短路径问题。 + +因为广搜是从起点出发,以起始点为中心一圈一圈进行搜索,一旦遇到终点,记录之前走过的节点就是一条最短路。 + +当然,也有一些问题是广搜 和 深搜都可以解决的,例如岛屿问题,**这类问题的特征就是不涉及具体的遍历方式,只要能把相邻且相同属性的节点标记上就行**。 (我们会在具体题目讲解中详细来说) + +## 广搜的过程 + +上面我们提过,BFS是一圈一圈的搜索过程,但具体是怎么一圈一圈来搜呢。 + +我们用一个方格地图,假如每次搜索的方向为 上下左右(不包含斜上方),那么给出一个start起始位置,那么BFS就是从四个方向走出第一步。 + +![图一](https://code-thinking-1253855093.file.myqcloud.com/pics/20220825104505.png) + +如果加上一个end终止位置,那么使用BFS的搜索过程如图所示: + +![图二](https://code-thinking-1253855093.file.myqcloud.com/pics/20220825102653.png) + +我们从图中可以看出,从start起点开始,是一圈一圈,向外搜索,方格编号1为第一步遍历的节点,方格编号2为第二步遍历的节点,第四步的时候我们找到终止点end。 + +正是因为BFS一圈一圈的遍历方式,所以一旦遇到终止点,那么一定是一条最短路径。 + +而且地图还可以有障碍,如图所示: + +![图三](https://code-thinking-1253855093.file.myqcloud.com/pics/20220825103900.png) + +在第五步,第六步 我只把关键的节点染色了,其他方向周边没有去染色,大家只要关注关键地方染色的逻辑就可以。 + +从图中可以看出,如果添加了障碍,我们是第六步才能走到end终点。 + +只要BFS只要搜到终点一定是一条最短路径,大家可以参考上面的图,自己再去模拟一下。 + +## 代码框架 + +大家应该好奇,这一圈一圈的搜索过程是怎么做到的,是放在什么容器里,才能这样去遍历。 + +很多网上的资料都是直接说用队列来实现。 + +其实,我们仅仅需要一个容器,能保存我们要遍历过的元素就可以,**那么用队列,还是用栈,甚至用数组,都是可以的**。 + +用队列的话,就是保证每一圈都是一个方向去转,例如统一顺时针或者逆时针。 + +因为队列是先进先出,加入元素和弹出元素的顺序是没有改变的。 + +如果用栈的话,可能就是第一圈顺时针遍历,第二圈逆时针遍历,第三圈有顺时针遍历。 + +因为栈是先进后出,加入元素和弹出元素的顺序改变了。 + +那么广搜需要注意 转圈搜索的顺序吗? 不需要! + +所以用队列,还是用栈都是可以的,但大家都习惯用队列了,所以下面的讲解用我也用队列来讲,只不过要给大家说清楚,并不是非要用队列,用栈也可以。 + +下面给出广搜代码模板,该模板针对的就是,上面的四方格的地图: (详细注释) + +```CPP +int dir[4][2] = {0, 1, 1, 0, -1, 0, 0, -1}; // 四个方向 +// grid 是地图,也就是一个二维数组 +// visited标记访问过的节点,不要重复访问 +// x,y 表示开始搜索节点的下标 +void bfs(vector>& grid, vector>& visited, int x, int y) { + queue> que; // 定义队列 + que.push({x, y}); // 起始节点加入队列 + visited[x][y] = true; // 只要加入队列,立刻标记为访问过的节点 + while(!que.empty()) { // 开始遍历队列里的元素 + pair cur = que.front(); que.pop(); // 从队列取元素 + int curx = cur.first; + int cury = cur.second; // 当前节点坐标 + for (int i = 0; i < 4; i++) { // 开始想当前节点的四个方向左右上下去遍历 + int nextx = curx + dir[i][0]; + int nexty = cury + dir[i][1]; // 获取周边四个方向的坐标 + if (nextx < 0 || nextx >= grid.size() || nexty < 0 || nexty >= grid[0].size()) continue; // 坐标越界了,直接跳过 + if (!visited[nextx][nexty]) { // 如果节点没被访问过 + que.push({nextx, nexty}); // 队列添加该节点为下一轮要遍历的节点 + visited[nextx][nexty] = true; // 只要加入队列立刻标记,避免重复访问 + } + } + } + +} +``` + +以上模板代码,就是可以直接拿来做 [200.岛屿数量](https://leetcode.cn/problems/number-of-islands/solution/by-carlsun-2-n72a/) 这道题目,唯一区别是 针对地图 grid 中有数字1的地方去做一个遍历。 + +即: + +``` +if (!visited[nextx][nexty]) { // 如果节点没被访问过 +``` + +改为 + +``` +if (!visited[nextx][nexty] && grid[nextx][nexty] == '1') { // 如果节点没被访问过且节点是可遍历的 + +``` +就可以通过 [200.岛屿数量](https://leetcode.cn/problems/number-of-islands/solution/by-carlsun-2-n72a/) 这道题目,大家可以去体验一下。 + +## 总结 + +当然广搜还有很多细节需要注意的地方,后面我会针对广搜的题目还做针对性的讲解,因为在理论篇讲太多细节,可能会让刚学广搜的录友们越看越懵,所以细节方面针对具体题目在做讲解。 + +本篇我们重点讲解了广搜的使用场景,广搜的过程以及广搜的代码框架。 + +其实在二叉树章节的[层序遍历](https://programmercarl.com/0102.%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E5%B1%82%E5%BA%8F%E9%81%8D%E5%8E%86.html)中,我们也讲过一次广搜,相当于是广搜在二叉树这种数据结构上的应用。 + +这次则从图论的角度上再详细讲解一次广度优先遍历。 + +相信看完本篇,大家会对广搜有一个基础性的认识,后面再来做对应的题目就会得心应手一些。 + + diff --git "a/problems/\345\233\276\350\256\272\346\267\261\346\220\234\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\345\233\276\350\256\272\346\267\261\346\220\234\347\220\206\350\256\272\345\237\272\347\241\200.md" new file mode 100644 index 0000000000..28ec636ffc --- /dev/null +++ "b/problems/\345\233\276\350\256\272\346\267\261\346\220\234\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -0,0 +1,187 @@ + +# 深度优先搜索理论基础 + +提到深度优先搜索(dfs),就不得不说和广度优先有什么区别(bfs) + +## dfs 与 bfs 区别 + +先来了解dfs的过程,很多录友可能对dfs(深度优先搜索),bfs(广度优先搜索)分不清。 + +先给大家说一下两者大概的区别: + +* dfs是可一个方向去搜,不到黄河不回头,直到遇到绝境了,搜不下去了,在换方向(换方向的过程就涉及到了回溯)。 +* bfs是先把本节点所连接的所有节点遍历一遍,走到下一个节点的时候,再把连接节点的所有节点遍历一遍,搜索方向更像是广度,四面八方的搜索过程。 + +当然以上讲的是,大体可以这么理解,接下来 我们详细讲解dfs,(bfs在用单独一篇文章详细讲解) + +## dfs 搜索过程 + +上面说道dfs是可一个方向搜,不到黄河不回头。 那么我们来举一个例子。 + +如图一,是一个无向图,我们要搜索从节点1到节点6的所有路径。 + +![图一](https://code-thinking-1253855093.file.myqcloud.com/pics/20220707093643.png) + +那么dfs搜索的第一条路径是这样的: (假设第一次延默认方向,就找到了节点6),图二 + +![图二](https://code-thinking-1253855093.file.myqcloud.com/pics/20220707093807.png) + +此时我们找到了节点6,(遇到黄河了,是不是应该回头了),那么应该再去搜索其他方向了。 如图三: + +![图三](https://code-thinking-1253855093.file.myqcloud.com/pics/20220707094011.png) + +路径2撤销了,改变了方向,走路径3(红色线), 接着也找到终点6。 那么撤销路径2,改为路径3,在dfs中其实就是回溯的过程(这一点很重要,很多录友,都不理解dfs代码中回溯是用来干什么的) + +又找到了一条从节点1到节点6的路径,又到黄河了,此时再回头,下图图四中,路径4撤销(回溯的过程),改为路径5。 + +![图四](https://code-thinking-1253855093.file.myqcloud.com/pics/20220707094322.png) + +又找到了一条从节点1到节点6的路径,又到黄河了,此时再回头,下图图五,路径6撤销(回溯的过程),改为路径7,路径8 和 路径7,路径9, 结果发现死路一条,都走到了自己走过的节点。 + +![图五](https://code-thinking-1253855093.file.myqcloud.com/pics/20220707094813.png) + +那么节点2所连接路径和节点3所链接的路径 都走过了,撤销路径只能向上回退,去选择撤销当初节点4的选择,也就是撤销路径5,改为路径10 。 如图图六: + +![图六](https://code-thinking-1253855093.file.myqcloud.com/pics/20220707095232.png) + + +上图演示中,其实我并没有把 所有的 从节点1 到节点6的dfs(深度优先搜索)的过程都画出来,那样太冗余了,但 已经把dfs 关键的地方都涉及到了,关键就两点: + +* 搜索方向,是认准一个方向搜,直到碰壁之后在换方向 +* 换方向是撤销原路径,改为节点链接的下一个路径,回溯的过程。 + + +## 代码框架 + +正式因为dfs搜索可一个方向,并需要回溯,所以用递归的方式来实现是最方便的。 + +很多录友对回溯很陌生,建议先看看码随想录,[回溯算法章节](https://programmercarl.com/回溯算法理论基础.html)。 + +有递归的地方就有回溯,那么回溯在哪里呢? + +就地递归函数的下面,例如如下代码: +``` +void dfs(参数) { + 处理节点 + dfs(图,选择的节点); // 递归 + 回溯,撤销处理结果 +} +``` + +可以看到回溯操作就在递归函数的下面,递归和回溯是相辅相成的。 + +在讲解[二叉树章节](https://programmercarl.com/二叉树理论基础.html)的时候,二叉树的递归法其实就是dfs,而二叉树的迭代法,就是bfs(广度优先搜索) + +所以**dfs,bfs其实是基础搜索算法,也广泛应用与其他数据结构与算法中**。 + +我们在回顾一下[回溯法](https://programmercarl.com/回溯算法理论基础.html)的代码框架: + +``` +void backtracking(参数) { + if (终止条件) { + 存放结果; + return; + } + for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) { + 处理节点; + backtracking(路径,选择列表); // 递归 + 回溯,撤销处理结果 + } +} + +``` + +回溯算法,其实就是dfs的过程,这里给出dfs的代码框架: + +``` +void dfs(参数) { + if (终止条件) { + 存放结果; + return; + } + + for (选择:本节点所连接的其他节点) { + 处理节点; + dfs(图,选择的节点); // 递归 + 回溯,撤销处理结果 + } +} + +``` + +可以发现dfs的代码框架和回溯算法的代码框架是差不多的。 + +下面我在用 深搜三部曲,来解读 dfs的代码框架。 + +## 深搜三部曲 + +在 [二叉树递归讲解](https://programmercarl.com/%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E9%80%92%E5%BD%92%E9%81%8D%E5%8E%86.html)中,给出了递归三部曲。 + +[回溯算法](https://programmercarl.com/回溯算法理论基础.html)讲解中,给出了 回溯三部曲。 + +其实深搜也是一样的,深搜三部曲如下: + +1. 确认递归函数,参数 + +``` +void dfs(参数) +``` + +通常我们递归的时候,我们递归搜索需要了解哪些参数,其实也可以在写递归函数的时候,发现需要什么参数,再去补充就可以。 + +一般情况,深搜需要 二维数组数组结构保存所有路径,需要一维数组保存单一路径,这种保存结果的数组,我们可以定义一个全局遍历,避免让我们的函数参数过多。 + +例如这样: + +``` +vector> result; // 保存符合条件的所有路径 +vector path; // 起点到终点的路径 +void dfs (图,目前搜索的节点) +``` + +但这种写法看个人习惯,不强求。 + +2. 确认终止条件 + +终止条件很重要,很多同学写dfs的时候,之所以容易死循环,栈溢出等等这些问题,都是因为终止条件没有想清楚。 + +``` +if (终止条件) { + 存放结果; + return; +} +``` + +终止添加不仅是结束本层递归,同时也是我们收获结果的时候。 + +另外,其实很多dfs写法,没有写终止条件,其实终止条件写在了, 下面dfs递归的逻辑里了,也就是不符合条件,直接不会向下递归。这里如果大家不理解的话,没关系,后面会有具体题目来讲解。 +* 841.钥匙和房间 +* 200. 岛屿数量 + +3. 处理目前搜索节点出发的路径 + +一般这里就是一个for循环的操作,去遍历 目前搜索节点 所能到的所有节点。 + +``` +for (选择:本节点所连接的其他节点) { + 处理节点; + dfs(图,选择的节点); // 递归 + 回溯,撤销处理结果 +} +``` + +不少录友疑惑的地方,都是 dfs代码框架中for循环里分明已经处理节点了,那么 dfs函数下面 为什么还要撤销的呢。 + +如图七所示, 路径2 已经走到了 目的地节点6,那么 路径2 是如何撤销,然后改为 路径3呢? 其实这就是 回溯的过程,撤销路径2,走换下一个方向。 + +![图七](https://code-thinking-1253855093.file.myqcloud.com/pics/20220708093544.png) + + +## 总结 + +我们讲解了,dfs 和 bfs的大体区别(bfs详细过程下篇来讲),dfs的搜索过程以及代码框架。 + +最后还有 深搜三部曲来解读这份代码框架。 + +以上如果大家都能理解了,其实搜索的代码就很好写,具体题目套用具体场景就可以了。 + diff --git "a/problems/\350\203\214\345\214\205\346\200\273\347\273\223\347\257\207.md" "b/problems/\350\203\214\345\214\205\346\200\273\347\273\223\347\257\207.md" index a7852de370..24d4cec9ad 100644 --- "a/problems/\350\203\214\345\214\205\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/\350\203\214\345\214\205\346\200\273\347\273\223\347\257\207.md" @@ -3,6 +3,8 @@

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

+ + # 听说背包问题很难? 这篇总结篇来拯救你了 年前我们已经把背包问题都讲完了,那么现在我们要对背包问题进行总结一番。 From a605d75ec6d24efb68a03ff7e669de937d6a5891 Mon Sep 17 00:00:00 2001 From: SwaggyP <1352164869@qq.com> Date: Sat, 3 Sep 2022 10:52:35 +0800 Subject: [PATCH 1039/3019] =?UTF-8?q?0463.=E5=B2=9B=E5=B1=BF=E7=9A=84?= =?UTF-8?q?=E5=91=A8=E9=95=BF=E5=A2=9E=E5=8A=A0go=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 0463.岛屿的周长增加go解法 --- ...77\347\232\204\345\221\250\351\225\277.md" | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git "a/problems/0463.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" "b/problems/0463.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" index 3dc69f20d8..a881cd7cd2 100644 --- "a/problems/0463.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" +++ "b/problems/0463.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" @@ -179,6 +179,25 @@ class Solution: ``` Go: +```go +func islandPerimeter(grid [][]int) int { + m, n := len(grid), len(grid[0]) + res := 0 + for i := 0; i < m; i++ { + for j := 0; j < n; j++ { + if grid[i][j] == 1 { + res += 4 + // 上下左右四个方向 + if i > 0 && grid[i-1][j] == 1 {res--} // 上边有岛屿 + if i < m-1 && grid[i+1][j] == 1 {res--} // 下边有岛屿 + if j > 0 && grid[i][j-1] == 1 {res--} // 左边有岛屿 + if j < n-1 && grid[i][j+1] == 1 {res--} // 右边有岛屿 + } + } + } + return res +} +``` JavaScript: ```javascript From 89ac882f24a38f1932e9cbb7ad5e8fe0fea21820 Mon Sep 17 00:00:00 2001 From: zhicheng lee <904688436@qq.com> Date: Sat, 3 Sep 2022 23:48:02 +0800 Subject: [PATCH 1040/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200452.=E7=94=A8?= =?UTF-8?q?=E6=9C=80=E5=B0=91=E6=95=B0=E9=87=8F=E7=9A=84=E7=AE=AD=E5=BC=95?= =?UTF-8?q?=E7=88=86=E6=B0=94=E7=90=83.md=20Java=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 原Java代码错误,提示Line 29: error: reached end of file while parsing 且代码内容较为冗余 --- ...25\347\210\206\346\260\224\347\220\203.md" | 32 +++++++------------ 1 file changed, 12 insertions(+), 20 deletions(-) diff --git "a/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" "b/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" index c571a235c5..91e340befe 100644 --- "a/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" +++ "b/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" @@ -137,29 +137,21 @@ public: ### Java ```java /** -时间复杂度 : O(NlogN) 排序需要 O(NlogN) 的复杂度 - -空间复杂度 : O(logN) java所使用的内置函数用的是快速排序需要 logN 的空间 -*/ + * 时间复杂度 : O(NlogN) 排序需要 O(NlogN) 的复杂度 + * 空间复杂度 : O(logN) java所使用的内置函数用的是快速排序需要 logN 的空间 + */ class Solution { public int findMinArrowShots(int[][] points) { - if (points.length == 0) return 0; - //用x[0] - y[0] 会大于2147483647 造成整型溢出 - Arrays.sort(points, (x, y) -> Integer.compare(x[0], y[0])); - //count = 1 因为最少需要一个箭来射击第一个气球 - int count = 1; - //重叠气球的最小右边界 - int leftmostRightBound = points[0][1]; + // 根据气球直径的开始坐标从小到大排序 + // 使用Integer内置比较方法,不会溢出 + Arrays.sort(points, (a, b) -> Integer.compare(a[0], b[0])); + + int count = 1; // points 不为空至少需要一支箭 for (int i = 1; i < points.length; i++) { - //如果下一个气球的左边界大于最小右边界 - for(int i = 1; i < points.length; i++){ - if (points[i][0] > leftmostRightBound ) { - //增加一次射击 - count++; - leftmostRightBound = points[i][1]; - //不然就更新最小右边界 - } else { - leftmostRightBound = Math.min(leftmostRightBound , points[i][1]); + if (points[i][0] > points[i - 1][1]) { // 气球i和气球i-1不挨着,注意这里不是>= + count++; // 需要一支箭 + } else { // 气球i和气球i-1挨着 + points[i][1] = Math.min(points[i][1], points[i - 1][1]); // 更新重叠气球最小右边界 } } return count; From d0d693ffae17369a54a99cd5040f904037b3b78a Mon Sep 17 00:00:00 2001 From: SwaggyP <1352164869@qq.com> Date: Sun, 4 Sep 2022 10:21:43 +0800 Subject: [PATCH 1041/3019] =?UTF-8?q?1356.=20=E6=A0=B9=E6=8D=AE=E6=95=B0?= =?UTF-8?q?=E5=AD=97=E4=BA=8C=E8=BF=9B=E5=88=B6=E4=B8=8B=201=20=E7=9A=84?= =?UTF-8?q?=E6=95=B0=E7=9B=AE=E6=8E=92=E5=BA=8F=20=E5=A2=9E=E5=8A=A0go?= =?UTF-8?q?=E8=AF=AD=E8=A8=80=E7=9A=84=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1356. 根据数字二进制下 1 的数目排序 增加go语言的解法 --- ...60\347\233\256\346\216\222\345\272\217.md" | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git "a/problems/1356.\346\240\271\346\215\256\346\225\260\345\255\227\344\272\214\350\277\233\345\210\266\344\270\2131\347\232\204\346\225\260\347\233\256\346\216\222\345\272\217.md" "b/problems/1356.\346\240\271\346\215\256\346\225\260\345\255\227\344\272\214\350\277\233\345\210\266\344\270\2131\347\232\204\346\225\260\347\233\256\346\216\222\345\272\217.md" index 5ca73607c0..e97748cbcb 100644 --- "a/problems/1356.\346\240\271\346\215\256\346\225\260\345\255\227\344\272\214\350\277\233\345\210\266\344\270\2131\347\232\204\346\225\260\347\233\256\346\216\222\345\272\217.md" +++ "b/problems/1356.\346\240\271\346\215\256\346\225\260\345\255\227\344\272\214\350\277\233\345\210\266\344\270\2131\347\232\204\346\225\260\347\233\256\346\216\222\345\272\217.md" @@ -170,6 +170,39 @@ class Solution: ## Go ```go +func sortByBits(arr []int) []int { + var tmp int + for i := 0; i < len(arr); i++ { + for j := i+1; j < len(arr); j++ { + // 冒泡排序的手法,但是排序的规则从比大小变成了比位运算1的个数 + if isCmp(arr[i], arr[j]) { + tmp = arr[i] + arr[i] = arr[j] + arr[j] = tmp + } + } + } + return arr +} + +func isCmp(a, b int) bool { + bitA := bitCount(a) + bitB := bitCount(b) + if bitA == bitB { + return a > b + } else { + return bitA > bitB + } +} + +func bitCount(n int) int { + count := 0 + for n != 0 { + n &= (n-1) // 清除最低位的1 + count++ + } + return count +} ``` ## JavaScript From e601c0c729a0deab40982e672d02618bda76ff88 Mon Sep 17 00:00:00 2001 From: AronJudge <2286381138@qq.com> Date: Sun, 4 Sep 2022 10:39:02 +0800 Subject: [PATCH 1042/3019] =?UTF-8?q?0216.=E7=BB=84=E5=90=88=E6=80=BB?= =?UTF-8?q?=E5=92=8CIII?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 增加一种更简单的剪裁方式。 --- ...345\220\210\346\200\273\345\222\214III.md" | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git "a/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" "b/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" index 2c1bf717e8..50c0d746d8 100644 --- "a/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" +++ "b/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" @@ -260,6 +260,37 @@ class Solution { } } } + +// 上面剪枝 i <= 9 - (k - path.size()) + 1; 如果还是不清楚 +// 也可以改为 if (path.size() > k) return; 执行效率上是一样的 +class Solution { + LinkedList path = new LinkedList<>(); + List> ans = new ArrayList<>(); + public List> combinationSum3(int k, int n) { + build(k, n, 1, 0); + return ans; + } + + private void build(int k, int n, int startIndex, int sum) { + + if (sum > n) return; + + if (path.size() > k) return; + + if (sum == n && path.size() == k) { + ans.add(new ArrayList<>(path)); + return; + } + + for(int i = startIndex; i <= 9; i++) { + path.add(i); + sum += i; + build(k, n, i + 1, sum); + sum -= i; + path.removeLast(); + } + } +} ``` 其他方法 From e1e22edf47fd7a975efaa814fd98327e865aa8ee Mon Sep 17 00:00:00 2001 From: AronJudge <2286381138@qq.com> Date: Sun, 4 Sep 2022 12:55:50 +0800 Subject: [PATCH 1043/3019] =?UTF-8?q?0040=20=E7=BB=84=E5=90=88=E6=80=BB?= =?UTF-8?q?=E5=92=8CII?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 简化原来的代码逻辑, 提高可读性。 --- ...\345\220\210\346\200\273\345\222\214II.md" | 67 ++++++++++--------- 1 file changed, 36 insertions(+), 31 deletions(-) diff --git "a/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" "b/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" index 557eb8557b..efe141166e 100644 --- "a/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" +++ "b/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" @@ -258,40 +258,45 @@ public: **使用标记数组** ```Java class Solution { - List> lists = new ArrayList<>(); - Deque deque = new LinkedList<>(); - int sum = 0; - - public List> combinationSum2(int[] candidates, int target) { - //为了将重复的数字都放到一起,所以先进行排序 - Arrays.sort(candidates); - //加标志数组,用来辅助判断同层节点是否已经遍历 - boolean[] flag = new boolean[candidates.length]; - backTracking(candidates, target, 0, flag); - return lists; - } + LinkedList path = new LinkedList<>(); + List> ans = new ArrayList<>(); + boolean[] used; + int sum = 0; - public void backTracking(int[] arr, int target, int index, boolean[] flag) { - if (sum == target) { - lists.add(new ArrayList(deque)); - return; - } - for (int i = index; i < arr.length && arr[i] + sum <= target; i++) { - //出现重复节点,同层的第一个节点已经被访问过,所以直接跳过 - if (i > 0 && arr[i] == arr[i - 1] && !flag[i - 1]) { - continue; - } - flag[i] = true; - sum += arr[i]; - deque.push(arr[i]); - //每个节点仅能选择一次,所以从下一位开始 - backTracking(arr, target, i + 1, flag); - int temp = deque.pop(); - flag[i] = false; - sum -= temp; - } + public List> combinationSum2(int[] candidates, int target) { + used = new boolean[candidates.length]; + // 加标志数组,用来辅助判断同层节点是否已经遍历 + Arrays.fill(used, false); + // 为了将重复的数字都放到一起,所以先进行排序 + Arrays.sort(candidates); + backTracking(candidates, target, 0); + return ans; + } + + private void backTracking(int[] candidates, int target, int startIndex) { + if (sum == target) { + ans.add(new ArrayList(path)); + } + for (int i = startIndex; i < candidates.length; i++) { + if (sum + candidates[i] > target) { + break; + } + // 出现重复节点,同层的第一个节点已经被访问过,所以直接跳过 + if (i > 0 && candidates[i] == candidates[i - 1] && !used[i - 1]) { + continue; + } + used[i] = true; + sum += candidates[i]; + path.add(candidates[i]); + // 每个节点仅能选择一次,所以从下一位开始 + backTracking(candidates, target, i + 1); + used[i] = false; + sum -= candidates[i]; + path.removeLast(); } + } } + ``` **不使用标记数组** ```Java From ef0cb5563884ce50c49d8b8e0d43e95073e13172 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=A7=E6=9E=97=E7=A8=8B=E5=BA=8F=E5=91=98?= Date: Sun, 4 Sep 2022 17:39:00 +0800 Subject: [PATCH 1044/3019] =?UTF-8?q?530.=E4=BA=8C=E5=8F=89=E6=90=9C?= =?UTF-8?q?=E7=B4=A2=E6=A0=91=E7=9A=84=E6=9C=80=E5=B0=8F=E7=BB=9D=E5=AF=B9?= =?UTF-8?q?=E5=B7=AE=20python=E8=BF=AD=E4=BB=A3=E6=B3=95=E6=B2=A1=E6=9C=89?= =?UTF-8?q?=E5=8F=96abs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" "b/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" index 809f500bff..4b70a59500 100644 --- "a/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" +++ "b/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" @@ -233,7 +233,7 @@ class Solution: else: # 逐一处理节点 cur = stack.pop() if pre: # 当前节点和前节点的值的差值 - result = min(result, cur.val - pre.val) + result = min(result, abs(cur.val - pre.val)) pre = cur cur = cur.right return result From 8329c3d6d14c16630d6c8a8303ed7fab4080d02f Mon Sep 17 00:00:00 2001 From: 0407-zh Date: Mon, 5 Sep 2022 10:50:27 +0800 Subject: [PATCH 1045/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0376.=E6=91=86?= =?UTF-8?q?=E5=8A=A8=E5=BA=8F=E5=88=97=20=E8=B4=AA=E5=BF=83=E7=AE=97?= =?UTF-8?q?=E6=B3=95Go=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 --- ...06\345\212\250\345\272\217\345\210\227.md" | 23 +++++++++++-------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git "a/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" "b/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" index d15ed2d055..fef5e59411 100644 --- "a/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" +++ "b/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" @@ -269,18 +269,23 @@ class Solution: **贪心** ```golang func wiggleMaxLength(nums []int) int { - var count, preDiff, curDiff int //初始化默认为0 - count = 1 // 初始化为1,因为最小的序列是1个数 - if len(nums) < 2 { - return count + n := len(nums) + if n < 2 { + return n + } + ans := 1 + prevDiff := nums[1] - nums[0] + if prevDiff != 0 { + ans = 2 } - for i := 0; i < len(nums)-1; i++ { - curDiff = nums[i+1] - nums[i] - if (curDiff > 0 && preDiff <= 0) || (curDiff < 0 && preDiff >= 0) { - count++ + for i := 2; i < n; i++ { + diff := nums[i] - nums[i-1] + if diff > 0 && prevDiff <= 0 || diff < 0 && prevDiff >= 0 { + ans++ + prevDiff = diff } } - return count + return ans } ``` From 65fae3b97541e4e73d8a9c1bd7b0483d8b49b359 Mon Sep 17 00:00:00 2001 From: zhicheng lee <904688436@qq.com> Date: Mon, 5 Sep 2022 16:20:42 +0800 Subject: [PATCH 1046/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200968.=E7=9B=91?= =?UTF-8?q?=E6=8E=A7=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 CPP代码未语法高亮 --- ...6\216\247\344\272\214\345\217\211\346\240\221.md" | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git "a/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" "b/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" index b17ff0804c..717112a73a 100644 --- "a/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" @@ -71,7 +71,7 @@ 后序遍历代码如下: -``` +```CPP int traversal(TreeNode* cur) { // 空节点,该节点有覆盖 @@ -124,7 +124,7 @@ int traversal(TreeNode* cur) { 代码如下: -``` +```CPP // 空节点,该节点有覆盖 if (cur == NULL) return 2; ``` @@ -143,7 +143,7 @@ if (cur == NULL) return 2; 代码如下: -``` +```CPP // 左右节点都有覆盖 if (left == 2 && right == 2) return 0; ``` @@ -163,7 +163,7 @@ left == 2 && right == 0 左节点覆盖,右节点无覆盖 此时摄像头的数量要加一,并且return 1,代表中间节点放摄像头。 代码如下: -``` +```CPP if (left == 0 || right == 0) { result++; return 1; @@ -180,7 +180,7 @@ left == 1 && right == 1 左右节点都有摄像头 代码如下: -``` +```CPP if (left == 1 || right == 1) return 2; ``` @@ -198,7 +198,7 @@ if (left == 1 || right == 1) return 2; 所以递归结束之后,还要判断根节点,如果没有覆盖,result++,代码如下: -``` +```CPP int minCameraCover(TreeNode* root) { result = 0; if (traversal(root) == 0) { // root 无覆盖 From e498df6ace098b4f4fd78222858ce8b84c527fc8 Mon Sep 17 00:00:00 2001 From: zhicheng lee <904688436@qq.com> Date: Tue, 6 Sep 2022 20:14:12 +0800 Subject: [PATCH 1047/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200746.=E4=BD=BF?= =?UTF-8?q?=E7=94=A8=E6=9C=80=E5=B0=8F=E8=8A=B1=E8=B4=B9=E7=88=AC=E6=A5=BC?= =?UTF-8?q?=E6=A2=AF.md=20Java=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加第一步支付费用版本的Java代码 删除原版本中冗余的代码,已测试代码 添加CPP代码的语法高亮 --- ...71\347\210\254\346\245\274\346\242\257.md" | 29 +++++++++++++++---- 1 file changed, 23 insertions(+), 6 deletions(-) diff --git "a/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" "b/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" index 92fb2920ed..9d3bd7fa20 100644 --- "a/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" +++ "b/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" @@ -66,7 +66,7 @@ 所以初始化代码为: -``` +```CPP vector dp(cost.size()); dp[0] = cost[0]; dp[1] = cost[1]; @@ -201,15 +201,32 @@ public: ### Java + ```Java +// 方式一:第一步支付费用 class Solution { public int minCostClimbingStairs(int[] cost) { - if (cost == null || cost.length == 0) { - return 0; - } - if (cost.length == 1) { - return cost[0]; + int len = cost.length; + int[] dp = new int[len + 1]; + + // 从下标为 0 或下标为 1 的台阶开始,因此支付费用为0 + dp[0] = 0; + dp[1] = 0; + + // 计算到达每一层台阶的最小费用 + for (int i = 2; i <= len; i++) { + dp[i] = Math.min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]); } + + return dp[len]; + } +} +``` + +```Java +// 方式二:第一步不支付费用 +class Solution { + public int minCostClimbingStairs(int[] cost) { int[] dp = new int[cost.length]; dp[0] = cost[0]; dp[1] = cost[1]; From cc0c8782d9a519292f8e3658135f298d3e71be7e Mon Sep 17 00:00:00 2001 From: zhicheng lee <904688436@qq.com> Date: Tue, 6 Sep 2022 20:27:20 +0800 Subject: [PATCH 1048/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200070.=E7=88=AC?= =?UTF-8?q?=E6=A5=BC=E6=A2=AF.md=20Java=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 三种Java代码中有两种是相同的方法,合并相同方法的内容 --- ...0.\347\210\254\346\245\274\346\242\257.md" | 37 +++++++------------ 1 file changed, 14 insertions(+), 23 deletions(-) diff --git "a/problems/0070.\347\210\254\346\245\274\346\242\257.md" "b/problems/0070.\347\210\254\346\245\274\346\242\257.md" index 30c3642f8b..0a6acf7f69 100644 --- "a/problems/0070.\347\210\254\346\245\274\346\242\257.md" +++ "b/problems/0070.\347\210\254\346\245\274\346\242\257.md" @@ -213,22 +213,6 @@ public: ### Java -```Java -class Solution { - public int climbStairs(int n) { - // 跟斐波那契数列一样 - if(n <= 2) return n; - int a = 1, b = 2, sum = 0; - - for(int i = 3; i <= n; i++){ - sum = a + b; - a = b; - b = sum; - } - return b; - } -} -``` ```java // 常规方式 @@ -241,15 +225,22 @@ public int climbStairs(int n) { } return dp[n]; } +``` + +```Java // 用变量记录代替数组 -public int climbStairs(int n) { - int a = 0, b = 1, c = 0; // 默认需要1次 - for (int i = 1; i <= n; i++) { - c = a + b; // f(i - 1) + f(n - 2) - a = b; // 记录上一轮的值 - b = c; // 向后步进1个数 +class Solution { + public int climbStairs(int n) { + if(n <= 2) return n; + int a = 1, b = 2, sum = 0; + + for(int i = 3; i <= n; i++){ + sum = a + b; // f(i - 1) + f(i - 2) + a = b; // 记录f(i - 1),即下一轮的f(i - 2) + b = sum; // 记录f(i),即下一轮的f(i - 1) + } + return b; } - return c; } ``` From a88741bf0a5e6faa44fc70735d32a41998bf4364 Mon Sep 17 00:00:00 2001 From: Xin-Sheng-5075 <2061461846@qq.com> Date: Tue, 6 Sep 2022 21:22:30 +0800 Subject: [PATCH 1049/3019] Signed-off-by: Xin-Sheng-5075 <2061461846@qq.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 增加 695.岛屿的最大面积 Java 版本 --- ...00\345\244\247\351\235\242\347\247\257.md" | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git "a/problems/0695.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" "b/problems/0695.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" index e5567aec64..e1f43e36b7 100644 --- "a/problems/0695.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" +++ "b/problems/0695.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" @@ -167,3 +167,36 @@ public: }; ``` + +# 其它语言版本 + +## Java + +这里使用深度优先搜索 DFS 来完成本道题目。我们使用 DFS 计算一个岛屿的面积,同时维护计算过的最大的岛屿面积。同时,为了避免对岛屿重复计算,我们在 DFS 的时候对岛屿进行 “淹没” 操作,即将岛屿所占的地方置为 0。 + +```java +public int maxAreaOfIsland(int[][] grid) { + int res = 0; + for(int i = 0;i < grid.length;i++){ + for(int j = 0;j < grid[0].length;j++){ + //每遇到一个岛屿就计算这个岛屿的面积同时”淹没“这个岛屿 + if(grid[i][j] == 1){ + //每次计算一个岛屿的面积都要与res比较,维护最大的岛屿面积作为最后的答案 + res = Math.max(res,dfs(grid,i,j)); + } + } + } + return res; +} +public int dfs(int[][] grid,int i,int j){ + //搜索边界:i,j超过grid的范围或者当前元素为0,即当前所在的地方已经是海洋 + if(i < 0 || i >= grid.length || j < 0 || j >= grid[0].length || grid[i][j] == 0) return 0; + //淹没土地,防止后续被重复计算 + grid[i][j] = 0; + //递归的思路:要求当前土地(i,j)所在的岛屿的面积,则等于1加上下左右相邻的土地的总面积 + return 1 + dfs(grid,i - 1,j) + + dfs(grid,i + 1,j) + + dfs(grid,i,j + 1) + + dfs(grid,i,j - 1); +} +``` \ No newline at end of file From 3975f442848c6790178fb6950181ff3fe50ee954 Mon Sep 17 00:00:00 2001 From: Asterisk <44215173+casnz1601@users.noreply.github.com> Date: Tue, 6 Sep 2022 10:54:02 -0400 Subject: [PATCH 1050/3019] =?UTF-8?q?Update=200031.=E4=B8=8B=E4=B8=80?= =?UTF-8?q?=E4=B8=AA=E6=8E=92=E5=88=97.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 完善python代码 --- ...00\344\270\252\346\216\222\345\210\227.md" | 77 +++++-------------- 1 file changed, 19 insertions(+), 58 deletions(-) diff --git "a/problems/0031.\344\270\213\344\270\200\344\270\252\346\216\222\345\210\227.md" "b/problems/0031.\344\270\213\344\270\200\344\270\252\346\216\222\345\210\227.md" index a33821b84a..fbea1c19a1 100644 --- "a/problems/0031.\344\270\213\344\270\200\344\270\252\346\216\222\345\210\227.md" +++ "b/problems/0031.\344\270\213\344\270\200\344\270\252\346\216\222\345\210\227.md" @@ -160,73 +160,34 @@ class Solution { ``` ## Python ->直接使用sorted()不符合题意 +>直接使用sorted()会开辟新的空间并返回一个新的list,故补充一个原地反转函数 ```python class Solution: def nextPermutation(self, nums: List[int]) -> None: """ Do not return anything, modify nums in-place instead. """ - for i in range(len(nums)-1, -1, -1): - for j in range(len(nums)-1, i, -1): + length = len(nums) + for i in range(length - 1, -1, -1): + for j in range(length - 1, i, -1): if nums[j] > nums[i]: nums[j], nums[i] = nums[i], nums[j] - nums[i+1:len(nums)] = sorted(nums[i+1:len(nums)]) - return - nums.sort() -``` ->另一种思路 -```python -class Solution: - ''' - 抛砖引玉:因题目要求“必须原地修改,只允许使用额外常数空间”,python内置sorted函数以及数组切片+sort()无法使用。 - 故选择另一种算法暂且提供一种python思路 - ''' - def nextPermutation(self, nums: List[int]) -> None: - """ - Do not return anything, modify nums in-place instead. - """ - length = len(nums) - for i in range(length-1, 0, -1): - if nums[i-1] < nums[i]: - for j in range(length-1, 0, -1): - if nums[j] > nums[i-1]: - nums[i-1], nums[j] = nums[j], nums[i-1] - break - self.reverse(nums, i, length-1) - break - if n == 1: - # 若正常结束循环,则对原数组直接翻转 - self.reverse(nums, 0, length-1) - - def reverse(self, nums: List[int], low: int, high: int) -> None: - while low < high: - nums[low], nums[high] = nums[high], nums[low] - low += 1 - high -= 1 -``` ->上一版本简化版 -```python -class Solution(object): - def nextPermutation(self, nums: List[int]) -> None: - n = len(nums) - i = n-2 - while i >= 0 and nums[i] >= nums[i+1]: - i -= 1 - - if i > -1: // i==-1,不存在下一个更大的排列 - j = n-1 - while j >= 0 and nums[j] <= nums[i]: - j -= 1 - nums[i], nums[j] = nums[j], nums[i] + self.reverse(nums, i + 1, length - 1) + return + self.reverse(nums, 0, length - 1) - start, end = i+1, n-1 - while start < end: - nums[start], nums[end] = nums[end], nums[start] - start += 1 - end -= 1 - - return nums + def reverse(self, nums: List[int], left: int, right: int) -> None: + while left < right: + nums[left], nums[right] = nums[right], nums[left] + left += 1 + right -= 1 + +""" +265 / 265 个通过测试用例 +状态:通过 +执行用时: 36 ms +内存消耗: 14.9 MB +""" ``` ## Go From efaa04f8e291391d2892c1ea47f111ecee3d2430 Mon Sep 17 00:00:00 2001 From: zhicheng lee <904688436@qq.com> Date: Wed, 7 Sep 2022 23:14:26 +0800 Subject: [PATCH 1051/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200063.=E4=B8=8D?= =?UTF-8?q?=E5=90=8C=E8=B7=AF=E5=BE=84II.md=20Java=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 原Java代码修改为更加清晰简明的代码 添加空间优化版本的代码 --- ...\345\220\214\350\267\257\345\276\204II.md" | 58 ++++++++++++++----- 1 file changed, 44 insertions(+), 14 deletions(-) diff --git "a/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" "b/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" index c7326b63c9..6b81225cbc 100644 --- "a/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" +++ "b/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" @@ -210,24 +210,54 @@ public: ```java class Solution { public int uniquePathsWithObstacles(int[][] obstacleGrid) { - int n = obstacleGrid.length, m = obstacleGrid[0].length; - int[][] dp = new int[n][m]; - - for (int i = 0; i < m; i++) { - if (obstacleGrid[0][i] == 1) break; //一旦遇到障碍,后续都到不了 - dp[0][i] = 1; + int m = obstacleGrid.length; + int n = obstacleGrid[0].length; + int[][] dp = new int[m][n]; + + //如果在起点或终点出现了障碍,直接返回0 + if (obstacleGrid[m - 1][n - 1] == 1 || obstacleGrid[0][0] == 1) { + return 0; } - for (int i = 0; i < n; i++) { - if (obstacleGrid[i][0] == 1) break; ////一旦遇到障碍,后续都到不了 - dp[i][0] = 1; + + for (int i = 0; i < m && obstacleGrid[i][0] == 0; i++) { + dp[i][0] = 1; } - for (int i = 1; i < n; i++) { - for (int j = 1; j < m; j++) { - if (obstacleGrid[i][j] == 1) continue; - dp[i][j] = dp[i - 1][j] + dp[i][j - 1]; + for (int j = 0; j < n && obstacleGrid[0][j] == 0; j++) { + dp[0][j] = 1; + } + + for (int i = 1; i < m; i++) { + for (int j = 1; j < n; j++) { + dp[i][j] = (obstacleGrid[i][j] == 0) ? dp[i - 1][j] + dp[i][j - 1] : 0; + } + } + return dp[m - 1][n - 1]; + } +} +``` + +```java +// 空间优化版本 +class Solution { + public int uniquePathsWithObstacles(int[][] obstacleGrid) { + int m = obstacleGrid.length; + int n = obstacleGrid[0].length; + int[] dp = new int[n]; + + for (int j = 0; j < n && obstacleGrid[0][j] == 0; j++) { + dp[j] = 1; + } + + for (int i = 1; i < m; i++) { + for (int j = 0; j < n; j++) { + if (obstacleGrid[i][j] == 1) { + dp[j] = 0; + } else if (j != 0) { + dp[j] += dp[j - 1]; + } } } - return dp[n - 1][m - 1]; + return dp[n - 1]; } } ``` From e6f3beb3e62315faf881859561fe7830b73f2daf Mon Sep 17 00:00:00 2001 From: Allen <2439506288@qq.com> Date: Thu, 8 Sep 2022 08:30:42 +0800 Subject: [PATCH 1052/3019] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=AD=97=E7=AC=A6?= =?UTF-8?q?=E4=B8=B2=20=E5=AE=9E=E6=8E=A7=E7=BA=BFstrstr=E9=A2=98=E7=9B=AE?= =?UTF-8?q?=E9=93=BE=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "problems/0028.\345\256\236\347\216\260strStr.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/problems/0028.\345\256\236\347\216\260strStr.md" "b/problems/0028.\345\256\236\347\216\260strStr.md" index 271822dccc..84ce77506f 100644 --- "a/problems/0028.\345\256\236\347\216\260strStr.md" +++ "b/problems/0028.\345\256\236\347\216\260strStr.md" @@ -9,7 +9,7 @@ # 28. 实现 strStr() -[力扣题目链接](https://leetcode.cn/problems/implement-strstr/) +[力扣题目链接](https://leetcode.cn/problems/find-the-index-of-the-first-occurrence-in-a-string/) 实现 strStr() 函数。 @@ -699,7 +699,7 @@ class Solution(object): if haystack[i:i+n]==needle: return i return -1 -``` +``` ```python // 方法一 class Solution: From d1dfb0b00e9041512100b7f47db2590e32a1408f Mon Sep 17 00:00:00 2001 From: Eightina <81902383+Eightina@users.noreply.github.com> Date: Fri, 9 Sep 2022 09:45:07 +0800 Subject: [PATCH 1053/3019] =?UTF-8?q?Update=2020201017=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=A0=91=E5=91=A8=E6=9C=AB=E6=80=BB=E7=BB=93.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit line 105: 错字“平衡二叉搜索数”——“数” --> “树” --- ...\240\221\345\221\250\346\234\253\346\200\273\347\273\223.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20201017\344\272\214\345\217\211\346\240\221\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20201017\344\272\214\345\217\211\346\240\221\345\221\250\346\234\253\346\200\273\347\273\223.md" index 57de82fd83..f183924eee 100644 --- "a/problems/\345\221\250\346\200\273\347\273\223/20201017\344\272\214\345\217\211\346\240\221\345\221\250\346\234\253\346\200\273\347\273\223.md" +++ "b/problems/\345\221\250\346\200\273\347\273\223/20201017\344\272\214\345\217\211\346\240\221\345\221\250\346\234\253\346\200\273\347\273\223.md" @@ -102,7 +102,7 @@ 现在已经讲过了几种二叉树了,二叉树,二叉平衡树,完全二叉树,二叉搜索树,后面还会有平衡二叉搜索树。 那么一些同学难免会有混乱了,我针对如下三个问题,帮大家在捋顺一遍: -1. 平衡二叉搜索数是不是二叉搜索树和平衡二叉树的结合? +1. 平衡二叉搜索树是不是二叉搜索树和平衡二叉树的结合? 是的,是二叉搜索树和平衡二叉树的结合。 From 2fdfd0511556e0238237f5b3dc9e302cbb575fe8 Mon Sep 17 00:00:00 2001 From: Yuki Chen <826992207@qq.com> Date: Fri, 9 Sep 2022 20:39:42 +0800 Subject: [PATCH 1054/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A00200.=E5=B2=9B?= =?UTF-8?q?=E5=B1=BF=E6=95=B0=E9=87=8F.=E5=B9=BF=E6=90=9C=E7=89=88=20Java?= =?UTF-8?q?=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...7.\345\271\277\346\220\234\347\211\210.md" | 47 +++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git "a/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\345\271\277\346\220\234\347\211\210.md" "b/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\345\271\277\346\220\234\347\211\210.md" index d43d6183f0..f70ea50c89 100644 --- "a/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\345\271\277\346\220\234\347\211\210.md" +++ "b/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\345\271\277\346\220\234\347\211\210.md" @@ -144,3 +144,50 @@ public: }; ``` + +## 其他语言版本 + +### Java + +```java +class Solution { + + boolean[][] visited; + int[][] move = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}}; + + public int numIslands(char[][] grid) { + int res = 0; + visited = new boolean[grid.length][grid[0].length]; + for(int i = 0; i < grid.length; i++) { + for(int j = 0; j < grid[0].length; j++) { + if(!visited[i][j] && grid[i][j] == '1') { + bfs(grid, i, j); + res++; + } + } + } + return res; + } + + //将这片岛屿上的所有陆地都访问到 + public void bfs(char[][] grid, int y, int x) { + Deque queue = new ArrayDeque<>(); + queue.offer(new int[]{y, x}); + visited[y][x] = true; + while(!queue.isEmpty()) { + int[] cur = queue.poll(); + int m = cur[0]; + int n = cur[1]; + for(int i = 0; i < 4; i++) { + int nexty = m + move[i][0]; + int nextx = n + move[i][1]; + if(nextx < 0 || nexty == grid.length || nexty < 0 || nextx == grid[0].length) continue; + if(!visited[nexty][nextx] && grid[nexty][nextx] == '1') { + queue.offer(new int[]{nexty, nextx}); + visited[nexty][nextx] = true; //只要加入队列就标记为访问 + } + } + } + } +} +``` From bd2832ec6a2cdcf43d292a661957327c069140d0 Mon Sep 17 00:00:00 2001 From: Asterisk <44215173+casnz1601@users.noreply.github.com> Date: Fri, 9 Sep 2022 12:42:55 -0400 Subject: [PATCH 1055/3019] =?UTF-8?q?Update=200797.=E6=89=80=E6=9C=89?= =?UTF-8?q?=E5=8F=AF=E8=83=BD=E7=9A=84=E8=B7=AF=E5=BE=84.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加Python实现 --- ...75\347\232\204\350\267\257\345\276\204.md" | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git "a/problems/0797.\346\211\200\346\234\211\345\217\257\350\203\275\347\232\204\350\267\257\345\276\204.md" "b/problems/0797.\346\211\200\346\234\211\345\217\257\350\203\275\347\232\204\350\267\257\345\276\204.md" index a51590f25a..f1f867f76b 100644 --- "a/problems/0797.\346\211\200\346\234\211\345\217\257\350\203\275\347\232\204\350\267\257\345\276\204.md" +++ "b/problems/0797.\346\211\200\346\234\211\345\217\257\350\203\275\347\232\204\350\267\257\345\276\204.md" @@ -296,5 +296,29 @@ public: ### Java ### Python +``` +class Solution: + def __init__(self): + self.result = [] + self.path = [0] + + def allPathsSourceTarget(self, graph: List[List[int]]) -> List[List[int]]: + if not graph: return [] + + self.dfs(graph, 0) + return self.result + + def dfs(self, graph, root: int): + if root == len(graph) - 1: # 成功找到一条路径时 + # ***Python的list是mutable类型*** + # ***回溯中必须使用Deep Copy*** + self.result.append(self.path[:]) + return + + for node in graph[root]: # 遍历节点n的所有后序节点 + self.path.append(node) + self.dfs(graph, node) + self.path.pop() # 回溯 +``` ### Go From 628df3aca9e2b81eef9dd8b0cce4d848185fc8bd Mon Sep 17 00:00:00 2001 From: Asterisk <44215173+casnz1601@users.noreply.github.com> Date: Fri, 9 Sep 2022 19:46:21 -0400 Subject: [PATCH 1056/3019] =?UTF-8?q?Update=200695.=E5=B2=9B=E5=B1=BF?= =?UTF-8?q?=E7=9A=84=E6=9C=80=E5=A4=A7=E9=9D=A2=E7=A7=AF.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 补充Python实现 --- ...00\345\244\247\351\235\242\347\247\257.md" | 77 ++++++++++++++++++- 1 file changed, 76 insertions(+), 1 deletion(-) diff --git "a/problems/0695.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" "b/problems/0695.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" index e1f43e36b7..447a374c48 100644 --- "a/problems/0695.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" +++ "b/problems/0695.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" @@ -170,6 +170,81 @@ public: # 其它语言版本 +## Python +### BFS +```python +class Solution: + def __init__(self): + self.count = 0 + + def maxAreaOfIsland(self, grid: List[List[int]]) -> int: + # 与200.独立岛屿不同的是:此题grid列表内是int!!! + + # BFS + if not grid: return 0 + + m, n = len(grid), len(grid[0]) + visited = [[False for i in range(n)] for j in range(m)] + + result = 0 + for i in range(m): + for j in range(n): + if not visited[i][j] and grid[i][j] == 1: + # 每一个新岛屿 + self.count = 0 + print(f'{self.count}') + self.bfs(grid, visited, i, j) + result = max(result, self.count) + + return result + + def bfs(self, grid, visited, i, j): + self.count += 1 + visited[i][j] = True + + queue = collections.deque([(i, j)]) + while queue: + x, y = queue.popleft() + for new_x, new_y in [(x + 1, y), (x - 1, y), (x, y - 1), (x, y + 1)]: + if 0 <= new_x < len(grid) and 0 <= new_y < len(grid[0]) and not visited[new_x][new_y] and grid[new_x][new_y] == 1: + visited[new_x][new_y] = True + self.count += 1 + queue.append((new_x, new_y)) +``` +### DFS +```python +class Solution: + def __init__(self): + self.count = 0 + + def maxAreaOfIsland(self, grid: List[List[int]]) -> int: + # DFS + if not grid: return 0 + + m, n = len(grid), len(grid[0]) + visited = [[False for _ in range(n)] for _ in range(m)] + + result = 0 + for i in range(m): + for j in range(n): + if not visited[i][j] and grid[i][j] == 1: + self.count = 0 + self.dfs(grid, visited, i, j) + result = max(result, self.count) + return result + + def dfs(self, grid, visited, x, y): + if visited[x][y] or grid[x][y] == 0: + return + visited[x][y] = True + self.count += 1 + for new_x, new_y in [(x + 1, y), (x - 1, y), (x, y + 1), (x, y - 1)]: + if 0 <= new_x < len(grid) and 0 <= new_y < len(grid[0]): + self.dfs(grid, visited, new_x, new_y) +``` + + + ## Java 这里使用深度优先搜索 DFS 来完成本道题目。我们使用 DFS 计算一个岛屿的面积,同时维护计算过的最大的岛屿面积。同时,为了避免对岛屿重复计算,我们在 DFS 的时候对岛屿进行 “淹没” 操作,即将岛屿所占的地方置为 0。 @@ -199,4 +274,4 @@ public int dfs(int[][] grid,int i,int j){ dfs(grid,i,j + 1) + dfs(grid,i,j - 1); } -``` \ No newline at end of file +``` From 08169cefbc060617dd9a0b81de069c1b88a7719c Mon Sep 17 00:00:00 2001 From: zhywanna <47680024+zhywanna@users.noreply.github.com> Date: Sun, 11 Sep 2022 16:12:58 +0800 Subject: [PATCH 1057/3019] =?UTF-8?q?Update=200112.=E8=B7=AF=E5=BE=84?= =?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 1\ return 的位置错误 2\ 第二个traversal的输入值错误 --- .../0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" "b/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" index d4cb51908d..c6c22e7d2c 100644 --- "a/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" +++ "b/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" @@ -499,7 +499,7 @@ class solution: if not cur_node.left and not cur_node.right: if remain == 0: result.append(path[:]) - return + return if cur_node.left: path.append(cur_node.left.val) @@ -508,7 +508,7 @@ class solution: if cur_node.right: path.append(cur_node.right.val) - traversal(cur_node.right, remain-cur_node.left.val) + traversal(cur_node.right, remain-cur_node.right.val) path.pop() result, path = [], [] From ce5c5d010a778e9aadcacf903192b1da445206ff Mon Sep 17 00:00:00 2001 From: Tcotyledons <53686585+Tcotyledons@users.noreply.github.com> Date: Tue, 13 Sep 2022 13:30:31 +0800 Subject: [PATCH 1058/3019] =?UTF-8?q?Create=20707=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E9=93=BE=E8=A1=A8java=E4=BB=A3=E7=A0=81=E7=9A=84=E4=BF=AE?= =?UTF-8?q?=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 代码随想录网址上链表中的力扣707设计链表中的java代码:1,对于单链表的操作,删除元素的for循环跳出条件有误,进行了修改;2,对于双向链表,进行了插入头,尾元素和插入元素的统一操作。自己在原作者基础上写了一份设计链表的java代码。 --- ...0\201\347\232\204\344\277\256\346\224\271" | 187 ++++++++++++++++++ 1 file changed, 187 insertions(+) create mode 100644 "707\350\256\276\350\256\241\351\223\276\350\241\250java\344\273\243\347\240\201\347\232\204\344\277\256\346\224\271" diff --git "a/707\350\256\276\350\256\241\351\223\276\350\241\250java\344\273\243\347\240\201\347\232\204\344\277\256\346\224\271" "b/707\350\256\276\350\256\241\351\223\276\350\241\250java\344\273\243\347\240\201\347\232\204\344\277\256\346\224\271" new file mode 100644 index 0000000000..bf27e266d7 --- /dev/null +++ "b/707\350\256\276\350\256\241\351\223\276\350\241\250java\344\273\243\347\240\201\347\232\204\344\277\256\346\224\271" @@ -0,0 +1,187 @@ +//原来的代码随想录707设计链表的java代码中单链表的设计中有错误,修正后并对双链表进行了简化和更正,下面是我的java代码 + +//单链表 +class ListNode{ + int val; + ListNode next; + ListNode() {}; + ListNode(int val){ + this.val = val; + } +} + + +class MyLinkedList { + + //记录链表中元素的数量 + int size; + //记录链表的虚拟头结点 + ListNode head; + + public MyLinkedList() { + //初始化操作 + this.size = 0; + this.head = new ListNode(0); + this.head.next = null; + } + + public int get(int index) { + //判断index是否有效 + if(index<0 || index>=size){ + return -1; + } + ListNode cur = this.head; + //index 是可以取到的,因为有虚拟头结点 + for(int i=0; i<= index; i++){ + cur = cur.next; + } + return cur.val; + } + + public void addAtHead(int val) { + //等价于在第0个元素前添加 + addAtIndex(0,val); + } + + public void addAtTail(int val) { + //等价于在最后一个元素(null)前添加 + addAtIndex(size,val); + } + + public void addAtIndex(int index, int val) { + //index大于链表长度 + if(index>size){ + return; + } + //index小于0 + if(index<0){ + index = 0; + } + size++; + //找到前驱 + ListNode pre = this.head; + for(int i=0; i=size){ + return; + } + //删除操作 + size--; + ListNode pre = this.head; + for(int i=0; i=size){ + return -1; + } + ListNode cur = this.head; + //判断是哪一边遍历时间更短 + if(index >= size / 2){ + //tail开始 + cur = tail; + for(int i=0; i< size-index; i++){ + cur = cur.prev; + } + }else{ + for(int i=0; i<= index; i++){ + cur = cur.next; + } + } + return cur.val; + } + + public void addAtHead(int val) { + //等价于在第0个元素前添加 + addAtIndex(0,val); + } + + public void addAtTail(int val) { + //等价于在最后一个元素(null)前添加 + addAtIndex(size,val); + } + + public void addAtIndex(int index, int val) { + //index大于链表长度 + if(index>size){ + return; + } + //index小于0 + if(index<0){ + index = 0; + } + size++; + //找到前驱 + ListNode pre = this.head; + for(int i=0; i=size){ + return; + } + //删除操作 + size--; + ListNode pre = this.head; + for(int i=0; i Date: Tue, 13 Sep 2022 13:37:28 +0800 Subject: [PATCH 1059/3019] =?UTF-8?q?Delete=20707=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E9=93=BE=E8=A1=A8java=E4=BB=A3=E7=A0=81=E7=9A=84=E4=BF=AE?= =?UTF-8?q?=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...0\201\347\232\204\344\277\256\346\224\271" | 187 ------------------ 1 file changed, 187 deletions(-) delete mode 100644 "707\350\256\276\350\256\241\351\223\276\350\241\250java\344\273\243\347\240\201\347\232\204\344\277\256\346\224\271" diff --git "a/707\350\256\276\350\256\241\351\223\276\350\241\250java\344\273\243\347\240\201\347\232\204\344\277\256\346\224\271" "b/707\350\256\276\350\256\241\351\223\276\350\241\250java\344\273\243\347\240\201\347\232\204\344\277\256\346\224\271" deleted file mode 100644 index bf27e266d7..0000000000 --- "a/707\350\256\276\350\256\241\351\223\276\350\241\250java\344\273\243\347\240\201\347\232\204\344\277\256\346\224\271" +++ /dev/null @@ -1,187 +0,0 @@ -//原来的代码随想录707设计链表的java代码中单链表的设计中有错误,修正后并对双链表进行了简化和更正,下面是我的java代码 - -//单链表 -class ListNode{ - int val; - ListNode next; - ListNode() {}; - ListNode(int val){ - this.val = val; - } -} - - -class MyLinkedList { - - //记录链表中元素的数量 - int size; - //记录链表的虚拟头结点 - ListNode head; - - public MyLinkedList() { - //初始化操作 - this.size = 0; - this.head = new ListNode(0); - this.head.next = null; - } - - public int get(int index) { - //判断index是否有效 - if(index<0 || index>=size){ - return -1; - } - ListNode cur = this.head; - //index 是可以取到的,因为有虚拟头结点 - for(int i=0; i<= index; i++){ - cur = cur.next; - } - return cur.val; - } - - public void addAtHead(int val) { - //等价于在第0个元素前添加 - addAtIndex(0,val); - } - - public void addAtTail(int val) { - //等价于在最后一个元素(null)前添加 - addAtIndex(size,val); - } - - public void addAtIndex(int index, int val) { - //index大于链表长度 - if(index>size){ - return; - } - //index小于0 - if(index<0){ - index = 0; - } - size++; - //找到前驱 - ListNode pre = this.head; - for(int i=0; i=size){ - return; - } - //删除操作 - size--; - ListNode pre = this.head; - for(int i=0; i=size){ - return -1; - } - ListNode cur = this.head; - //判断是哪一边遍历时间更短 - if(index >= size / 2){ - //tail开始 - cur = tail; - for(int i=0; i< size-index; i++){ - cur = cur.prev; - } - }else{ - for(int i=0; i<= index; i++){ - cur = cur.next; - } - } - return cur.val; - } - - public void addAtHead(int val) { - //等价于在第0个元素前添加 - addAtIndex(0,val); - } - - public void addAtTail(int val) { - //等价于在最后一个元素(null)前添加 - addAtIndex(size,val); - } - - public void addAtIndex(int index, int val) { - //index大于链表长度 - if(index>size){ - return; - } - //index小于0 - if(index<0){ - index = 0; - } - size++; - //找到前驱 - ListNode pre = this.head; - for(int i=0; i=size){ - return; - } - //删除操作 - size--; - ListNode pre = this.head; - for(int i=0; i Date: Tue, 13 Sep 2022 13:41:00 +0800 Subject: [PATCH 1060/3019] =?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 修改了java版本的:1,单链表中的删除元素的循环跳出条件,2,自己优化了实现了双链表中插入元素的统一,无需单独实现头部插入和尾部插入 --- ...76\350\256\241\351\223\276\350\241\250.md" | 127 ++++++++++-------- 1 file changed, 68 insertions(+), 59 deletions(-) diff --git "a/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" "b/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" index 42912eda8e..83e57fec82 100644 --- "a/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" +++ "b/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" @@ -358,7 +358,7 @@ class MyLinkedList { return; } ListNode pred = head; - for (int i = 0; i < index - 1; i++) { + for (int i = 0; i < index ; i++) { pred = pred.next; } pred.next = pred.next.next; @@ -366,92 +366,101 @@ class MyLinkedList { } //双链表 -class MyLinkedList { - class ListNode { - int val; - ListNode next,prev; - ListNode(int x) {val = x;} +class ListNode{ + int val; + ListNode next,prev; + ListNode() {}; + ListNode(int val){ + this.val = val; } +} - int size; - ListNode head,tail;//Sentinel node - /** Initialize your data structure here. */ +class MyLinkedList { + + //记录链表中元素的数量 + int size; + //记录链表的虚拟头结点和尾结点 + ListNode head,tail; + public MyLinkedList() { - size = 0; - head = new ListNode(0); - tail = new ListNode(0); - head.next = tail; - tail.prev = head; + //初始化操作 + this.size = 0; + this.head = new ListNode(0); + this.tail = new ListNode(0); + //这一步非常关键,否则在加入头结点的操作中会出现null.next的错误!!! + head.next=tail; + tail.prev=head; } - /** Get the value of the index-th node in the linked list. If the index is invalid, return -1. */ public int get(int index) { - if(index < 0 || index >= size){return -1;} - ListNode cur = head; - - // 通过判断 index < (size - 1) / 2 来决定是从头结点还是尾节点遍历,提高效率 - if(index < (size - 1) / 2){ - for(int i = 0; i <= index; i++){ - cur = cur.next; - } - }else{ + //判断index是否有效 + if(index<0 || index>=size){ + return -1; + } + ListNode cur = this.head; + //判断是哪一边遍历时间更短 + if(index >= size / 2){ + //tail开始 cur = tail; - for(int i = 0; i <= size - index - 1; i++){ + for(int i=0; i< size-index; i++){ cur = cur.prev; } + }else{ + for(int i=0; i<= index; i++){ + cur = cur.next; + } } return cur.val; } - /** Add a node of value val before the first element of the linked list. After the insertion, the new node will be the first node of the linked list. */ public void addAtHead(int val) { - ListNode cur = head; - ListNode newNode = new ListNode(val); - newNode.next = cur.next; - cur.next.prev = newNode; - cur.next = newNode; - newNode.prev = cur; - size++; + //等价于在第0个元素前添加 + addAtIndex(0,val); } - /** Append a node of value val to the last element of the linked list. */ public void addAtTail(int val) { - ListNode cur = tail; - ListNode newNode = new ListNode(val); - newNode.next = tail; - newNode.prev = cur.prev; - cur.prev.next = newNode; - cur.prev = newNode; - size++; + //等价于在最后一个元素(null)前添加 + addAtIndex(size,val); } - /** Add a node of value val before the index-th node in the linked list. If index equals to the length of linked list, the node will be appended to the end of linked list. If index is greater than the length, the node will not be inserted. */ public void addAtIndex(int index, int val) { - if(index > size){return;} - if(index < 0){index = 0;} - ListNode cur = head; - for(int i = 0; i < index; i++){ - cur = cur.next; + //index大于链表长度 + if(index>size){ + return; + } + //index小于0 + if(index<0){ + index = 0; } - ListNode newNode = new ListNode(val); - newNode.next = cur.next; - cur.next.prev = newNode; - newNode.prev = cur; - cur.next = newNode; size++; + //找到前驱 + ListNode pre = this.head; + for(int i=0; i= size || index < 0){return;} - ListNode cur = head; - for(int i = 0; i < index; i++){ - cur = cur.next; + //判断索引是否有效 + if(index<0 || index>=size){ + return; } - cur.next.next.prev = cur; - cur.next = cur.next.next; + //删除操作 size--; + ListNode pre = this.head; + for(int i=0; i Date: Tue, 13 Sep 2022 22:21:15 +0800 Subject: [PATCH 1061/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200139.=E5=8D=95?= =?UTF-8?q?=E8=AF=8D=E6=8B=86=E5=88=86.md=20Java=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 使用Set容器加速两层for循环中的查询函数,原代码在List列表中查询,本质上为三层循环,使用Set容器后为两层循环 --- ...139.\345\215\225\350\257\215\346\213\206\345\210\206.md" | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git "a/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" "b/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" index 7ff13f72a9..5b38a7a523 100644 --- "a/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" +++ "b/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" @@ -234,11 +234,13 @@ Java: ```java class Solution { public boolean wordBreak(String s, List wordDict) { + HashSet set = new HashSet<>(wordDict); boolean[] valid = new boolean[s.length() + 1]; valid[0] = true; + for (int i = 1; i <= s.length(); i++) { - for (int j = 0; j < i; j++) { - if (wordDict.contains(s.substring(j,i)) && valid[j]) { + for (int j = 0; j < i && !valid[i]; j++) { + if (set.contains(s.substring(j, i)) && valid[j]) { valid[i] = true; } } From 7e3823d619a5ec36beb29e6d2a1c573bc0c7cd00 Mon Sep 17 00:00:00 2001 From: zhicheng lee <904688436@qq.com> Date: Tue, 13 Sep 2022 22:24:58 +0800 Subject: [PATCH 1062/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200139.=E5=8D=95?= =?UTF-8?q?=E8=AF=8D=E6=8B=86=E5=88=86.md=20Java=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加另一种思路的背包算法,比题解中的背包算法速度更快 --- ...25\350\257\215\346\213\206\345\210\206.md" | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git "a/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" "b/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" index 5b38a7a523..3d4cdb3129 100644 --- "a/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" +++ "b/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" @@ -250,6 +250,26 @@ class Solution { } } +// 另一种思路的背包算法 +class Solution { + public boolean wordBreak(String s, List wordDict) { + boolean[] dp = new boolean[s.length() + 1]; + dp[0] = true; + + for (int i = 1; i <= s.length(); i++) { + for (String word : wordDict) { + int len = word.length(); + if (i >= len && dp[i - len] && word.equals(s.substring(i - len, i))) { + dp[i] = true; + break; + } + } + } + + return dp[s.length()]; + } +} + // 回溯法+记忆化 class Solution { private Set set; From cf51b7c0397e140e68ed4dd3d5f98f6feab98e47 Mon Sep 17 00:00:00 2001 From: zhicheng lee <904688436@qq.com> Date: Tue, 13 Sep 2022 22:27:20 +0800 Subject: [PATCH 1063/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200139.=E5=8D=95?= =?UTF-8?q?=E8=AF=8D=E6=8B=86=E5=88=86.md=20Python=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E9=AB=98=E4=BA=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" "b/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" index 3d4cdb3129..d60fd46cf3 100644 --- "a/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" +++ "b/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" @@ -307,7 +307,7 @@ class Solution { Python: -```python3 +```python class Solution: def wordBreak(self, s: str, wordDict: List[str]) -> bool: '''排列''' From 5c6fa9bf6ab84d29b4e0f8d20385115309282dfd Mon Sep 17 00:00:00 2001 From: Asterisk <44215173+casnz1601@users.noreply.github.com> Date: Wed, 14 Sep 2022 11:24:50 -0400 Subject: [PATCH 1064/3019] =?UTF-8?q?Update=200797.=E6=89=80=E6=9C=89?= =?UTF-8?q?=E5=8F=AF=E8=83=BD=E7=9A=84=E8=B7=AF=E5=BE=84.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加Python注释 --- ...\217\257\350\203\275\347\232\204\350\267\257\345\276\204.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0797.\346\211\200\346\234\211\345\217\257\350\203\275\347\232\204\350\267\257\345\276\204.md" "b/problems/0797.\346\211\200\346\234\211\345\217\257\350\203\275\347\232\204\350\267\257\345\276\204.md" index f1f867f76b..66376e3deb 100644 --- "a/problems/0797.\346\211\200\346\234\211\345\217\257\350\203\275\347\232\204\350\267\257\345\276\204.md" +++ "b/problems/0797.\346\211\200\346\234\211\345\217\257\350\203\275\347\232\204\350\267\257\345\276\204.md" @@ -296,7 +296,7 @@ public: ### Java ### Python -``` +```python class Solution: def __init__(self): self.result = [] From 42e4cc2eb7a17570e64699bbc045f9cdea559967 Mon Sep 17 00:00:00 2001 From: Asterisk <44215173+casnz1601@users.noreply.github.com> Date: Wed, 14 Sep 2022 11:29:30 -0400 Subject: [PATCH 1065/3019] =?UTF-8?q?Update=200077.=E7=BB=84=E5=90=88.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Remove redundant comment for python --- "problems/0077.\347\273\204\345\220\210.md" | 1 - 1 file changed, 1 deletion(-) diff --git "a/problems/0077.\347\273\204\345\220\210.md" "b/problems/0077.\347\273\204\345\220\210.md" index 17e4fb359d..9c473bdd12 100644 --- "a/problems/0077.\347\273\204\345\220\210.md" +++ "b/problems/0077.\347\273\204\345\220\210.md" @@ -368,7 +368,6 @@ class Solution { ### Python -Python2: ```python class Solution(object): def combine(self, n, k): From a64f7a1734e676d18f2458a43fd732d8a6d101aa Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Fri, 16 Sep 2022 09:40:24 +0800 Subject: [PATCH 1066/3019] Update --- ...11\346\220\234\347\264\242\346\240\221.md" | 10 +- ...00\345\244\247\346\267\261\345\272\246.md" | 15 ++- ...41\344\272\214\345\217\211\346\240\221.md" | 28 +++--- ...00\345\260\217\346\267\261\345\272\246.md" | 3 + ...57\345\276\204\346\200\273\345\222\214.md" | 24 ++--- ...02\347\202\271\344\270\252\346\225\260.md" | 2 + ...00\346\234\211\350\267\257\345\276\204.md" | 2 + ...66\345\255\220\344\271\213\345\222\214.md" | 3 + ...55\347\232\204\344\274\227\346\225\260.md" | 8 +- ...13\350\247\222\347\232\204\345\200\274.md" | 91 +++++++++---------- ...17\347\273\235\345\257\271\345\267\256.md" | 2 +- ...55\347\232\204\346\220\234\347\264\242.md" | 35 +++++-- 12 files changed, 124 insertions(+), 99 deletions(-) diff --git "a/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" index cba450e596..727144d551 100644 --- "a/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" +++ "b/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" @@ -87,7 +87,7 @@ public: 写出了类似这样的代码: -``` +```CPP if (root->val > root->left->val && root->val < root->right->val) { return true; } else { @@ -95,7 +95,7 @@ if (root->val > root->left->val && root->val < root->right->val) { } ``` -**我们要比较的是 左子树所有节点小于中间节点,右子树所有节点大于中间节点。**所以以上代码的判断逻辑是错误的。 +**我们要比较的是 左子树所有节点小于中间节点,右子树所有节点大于中间节点**。所以以上代码的判断逻辑是错误的。 例如: [10,5,15,null,null,6,20] 这个case: @@ -125,7 +125,7 @@ if (root->val > root->left->val && root->val < root->right->val) { 代码如下: -``` +```CPP long long maxVal = LONG_MIN; // 因为后台测试数据中有int最小值 bool isValidBST(TreeNode* root) ``` @@ -138,7 +138,7 @@ bool isValidBST(TreeNode* root) 代码如下: -``` +```CPP if (root == NULL) return true; ``` @@ -148,7 +148,7 @@ if (root == NULL) return true; 代码如下: -``` +```CPP bool left = isValidBST(root->left); // 左 // 中序遍历,验证遍历的元素是不是从小到大 diff --git "a/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" "b/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" index 392a3778cb..2bcc9c5c98 100644 --- "a/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" +++ "b/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" @@ -5,11 +5,6 @@

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

-看完本篇可以一起做了如下两道题目: - -* 104.二叉树的最大深度 -* 559.n叉树的最大深度 - # 104.二叉树的最大深度 [力扣题目链接](https://leetcode.cn/problems/maximum-depth-of-binary-tree/) @@ -27,6 +22,16 @@ 返回它的最大深度 3 。 +# 思路 + +看完本篇可以一起做了如下两道题目: + +* 104.二叉树的最大深度 +* 559.n叉树的最大深度 + +《代码随想录》算法视频公开课:[二叉树的高度和深度有啥区别?究竟用什么遍历顺序?很多录友搞不懂 | 104.二叉树的最大深度](https://www.bilibili.com/video/BV1Gd4y1V75u),相信结合视频在看本篇题解,更有助于大家对本题的理解。 + + ## 递归法 本题可以使用前序(中左右),也可以使用后序遍历(左右中),使用前序求的就是深度,使用后序求的是高度。 diff --git "a/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" "b/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" index 5bdd4f1b28..a87b64fc02 100644 --- "a/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" @@ -31,8 +31,10 @@ 返回 false 。 -# 题外话 +**《代码随想录》算法视频公开课:[后序遍历求高度,高度判断是否平衡 | LeetCode:110.平衡二叉树](https://www.bilibili.com/video/BV1Ug411S7my),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 + +## 题外话 咋眼一看这道题目和[104.二叉树的最大深度](https://programmercarl.com/0104.二叉树的最大深度.html)很像,其实有很大区别。 @@ -113,9 +115,9 @@ public: }; ``` -# 本题思路 +## 本题思路 -## 递归 +### 递归 此时大家应该明白了既然要求比较高度,必然是要后序遍历。 @@ -225,7 +227,7 @@ public: }; ``` -## 迭代 +### 迭代 在[104.二叉树的最大深度](https://programmercarl.com/0104.二叉树的最大深度.html)中我们可以使用层序遍历来求深度,但是就不能直接用层序遍历来求高度了,这就体现出求高度和求深度的不同。 @@ -342,7 +344,7 @@ public: 因为对于回溯算法已经是非常复杂的递归了,如果在用迭代的话,就是自己给自己找麻烦,效率也并不一定高。 -# 总结 +## 总结 通过本题可以了解求二叉树深度 和 二叉树高度的差异,求深度适合用前序遍历,而求高度适合用后序遍历。 @@ -351,9 +353,9 @@ public: 但是递归方式是一定要掌握的! -# 其他语言版本 +## 其他语言版本 -## Java +### Java ```Java class Solution { @@ -494,7 +496,7 @@ class Solution { } ``` -## Python +### Python 递归法: ```python @@ -554,7 +556,7 @@ class Solution: ``` -## Go +### Go ```Go func isBalanced(root *TreeNode) bool { if root==nil{ @@ -590,7 +592,7 @@ func abs(a int)int{ } ``` -## JavaScript +### JavaScript 递归法: ```javascript var isBalanced = function(root) { @@ -658,7 +660,7 @@ var isBalanced = function (root) { }; ``` -## TypeScript +### TypeScript ```typescript // 递归法 @@ -676,7 +678,7 @@ function isBalanced(root: TreeNode | null): boolean { }; ``` -## C +### C 递归法: ```c @@ -780,7 +782,7 @@ bool isBalanced(struct TreeNode* root){ } ``` -## Swift: +### Swift: >递归 ```swift diff --git "a/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" "b/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" index 3c32f62026..403027e430 100644 --- "a/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" +++ "b/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" @@ -27,6 +27,9 @@ # 思路 +《代码随想录》算法视频公开课:[看起来好像做过,一写就错! | LeetCode:111.二叉树的最小深度](https://www.bilibili.com/video/BV1QD4y1B7e2),相信结合视频在看本篇题解,更有助于大家对本题的理解。 + + 看完了这篇[104.二叉树的最大深度](https://programmercarl.com/0104.二叉树的最大深度.html),再来看看如何求最小深度。 直觉上好像和求最大深度差不多,其实还是差不少的。 diff --git "a/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" "b/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" index d4cb51908d..d8d4e2f88b 100644 --- "a/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" +++ "b/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" @@ -123,9 +123,9 @@ return false; 整体代码如下: ```cpp -class solution { +class Solution { private: - bool traversal(treenode* cur, int count) { + bool traversal(TreeNode* cur, int count) { if (!cur->left && !cur->right && count == 0) return true; // 遇到叶子节点,并且计数为0 if (!cur->left && !cur->right) return false; // 遇到叶子节点直接返回 @@ -143,8 +143,8 @@ private: } public: - bool haspathsum(treenode* root, int sum) { - if (root == null) return false; + bool hasPathSum(TreeNode* root, int sum) { + if (root == NULL) return false; return traversal(root, sum - root->val); } }; @@ -155,7 +155,7 @@ public: ```cpp class solution { public: - bool haspathsum(treenode* root, int sum) { + bool hasPathSum(TreeNode* root, int sum) { if (root == null) return false; if (!root->left && !root->right && sum == root->val) { return true; @@ -176,7 +176,7 @@ public: c++就我们用pair结构来存放这个栈里的元素。 -定义为:`pair` pair<节点指针,路径数值> +定义为:`pair` pair<节点指针,路径数值> 这个为栈里的一个元素。 @@ -186,25 +186,25 @@ c++就我们用pair结构来存放这个栈里的元素。 class solution { public: - bool haspathsum(treenode* root, int sum) { + bool haspathsum(TreeNode* root, int sum) { if (root == null) return false; // 此时栈里要放的是pair<节点指针,路径数值> - stack> st; - st.push(pair(root, root->val)); + stack> st; + st.push(pair(root, root->val)); while (!st.empty()) { - pair node = st.top(); + pair node = st.top(); st.pop(); // 如果该节点是叶子节点了,同时该节点的路径数值等于sum,那么就返回true if (!node.first->left && !node.first->right && sum == node.second) return true; // 右节点,压进去一个节点的时候,将该节点的路径数值也记录下来 if (node.first->right) { - st.push(pair(node.first->right, node.second + node.first->right->val)); + st.push(pair(node.first->right, node.second + node.first->right->val)); } // 左节点,压进去一个节点的时候,将该节点的路径数值也记录下来 if (node.first->left) { - st.push(pair(node.first->left, node.second + node.first->left->val)); + st.push(pair(node.first->left, node.second + node.first->left->val)); } } return false; diff --git "a/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" "b/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" index 4057053e4f..dc037f0a39 100644 --- "a/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" +++ "b/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" @@ -32,6 +32,8 @@ # 思路 +《代码随想录》算法视频公开课:[要理解普通二叉树和完全二叉树的区别! | LeetCode:222.完全二叉树节点的数量](https://www.bilibili.com/video/BV1eW4y1B7pD),相信结合视频在看本篇题解,更有助于大家对本题的理解。 + 本篇给出按照普通二叉树的求法以及利用完全二叉树性质的求法。 ## 普通二叉树 diff --git "a/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" "b/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" index 0dc9a09b46..579c214fa4 100644 --- "a/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" +++ "b/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" @@ -20,6 +20,8 @@ # 思路 +**《代码随想录》算法视频公开课:[递归中带着回溯,你感受到了没?| LeetCode:257. 二叉树的所有路径](https://www.bilibili.com/video/BV1ZG411G7Dh),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 + 这道题目要求从根节点到叶子的路径,所以需要前序遍历,这样才方便让父节点指向孩子节点,找到对应的路径。 在这道题目中将第一次涉及到回溯,因为我们要把路径记录下来,需要回溯来回退一一个路径在进入另一个路径。 diff --git "a/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" "b/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" index 2d522f41cb..12a2881e34 100644 --- "a/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" +++ "b/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" @@ -17,6 +17,9 @@ # 思路 +**《代码随想录》算法视频公开课:[二叉树的题目中,总有一些规则让你找不到北 | LeetCode:404.左叶子之和](https://www.bilibili.com/video/BV1GY4y1K7z8),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 + + **首先要注意是判断左叶子,不是二叉树左侧节点,所以不要上来想着层序遍历。** 因为题目中其实没有说清楚左叶子究竟是什么节点,那么我来给出左叶子的明确定义:**节点A的左孩子不为空,且左孩子的左右孩子都为空(说明是叶子节点),那么A节点的左孩子为左叶子节点** diff --git "a/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" "b/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" index 671d8061fa..ad6577ddf6 100644 --- "a/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" +++ "b/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" @@ -72,7 +72,7 @@ void searchBST(TreeNode* cur, unordered_map& map) { // 前序遍历 代码如下: -``` +```CPP bool static cmp (const pair& a, const pair& b) { return a.second > b.second; // 按照频率从大到小排序 } @@ -169,7 +169,7 @@ void searchBST(TreeNode* cur) { 代码如下: -``` +```CPP if (pre == NULL) { // 第一个节点 count = 1; // 频率为1 } else if (pre->val == cur->val) { // 与前一个节点数值相同 @@ -194,7 +194,7 @@ pre = cur; // 更新上一个节点 如果 频率count 等于 maxCount(最大频率),当然要把这个元素加入到结果集中(以下代码为result数组),代码如下: -``` +```CPP if (count == maxCount) { // 如果和最大值相同,放进result中 result.push_back(cur->val); } @@ -206,7 +206,7 @@ if (count == maxCount) { // 如果和最大值相同,放进result中 频率count 大于 maxCount的时候,不仅要更新maxCount,而且要清空结果集(以下代码为result数组),因为结果集之前的元素都失效了。 -``` +```CPP if (count > maxCount) { // 如果计数大于最大值 maxCount = count; // 更新最大频率 result.clear(); // 很关键的一步,不要忘记清空result,之前result里的元素都失效了 diff --git "a/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" "b/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" index 817c22c9cc..2218a54939 100644 --- "a/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" +++ "b/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" @@ -41,7 +41,7 @@ 所以要找深度最大的叶子节点。 -那么如果找最左边的呢?可以使用前序遍历,这样才先优先左边搜索,然后记录深度最大的叶子节点,此时就是树的最后一行最左边的值。 +那么如果找最左边的呢?可以使用前序遍历(当然中序,后序都可以,因为本题没有 中间节点的处理逻辑,只要左优先就行),保证优先左边搜索,然后记录深度最大的叶子节点,此时就是树的最后一行最左边的值。 递归三部曲: @@ -49,25 +49,16 @@ 参数必须有要遍历的树的根节点,还有就是一个int型的变量用来记录最长深度。 这里就不需要返回值了,所以递归函数的返回类型为void。 -本题还需要类里的两个全局变量,maxLen用来记录最大深度,maxleftValue记录最大深度最左节点的数值。 +本题还需要类里的两个全局变量,maxLen用来记录最大深度,result记录最大深度最左节点的数值。 代码如下: ```CPP -int maxLen = INT_MIN; // 全局变量 记录最大深度 -int maxleftValue; // 全局变量 最大深度最左节点的数值 -void traversal(TreeNode* root, int leftLen) +int maxDepth = INT_MIN; // 全局变量 记录最大深度 +int result; // 全局变量 最大深度最左节点的数值 +void traversal(TreeNode* root, int depth) ``` -有的同学可能疑惑,为啥不能递归函数的返回值返回最长深度呢? - -其实很多同学都对递归函数什么时候要有返回值,什么时候不能有返回值很迷茫。 - -**如果需要遍历整棵树,递归函数就不能有返回值。如果需要遍历某一条固定路线,递归函数就一定要有返回值!** - -初学者可能对这个结论不太理解,别急,后面我会安排一道题目专门讲递归函数的返回值问题。这里大家暂时先了解一下。 - -本题我们是要遍历整个树找到最深的叶子节点,需要遍历整棵树,所以递归函数没有返回值。 2. 确定终止条件 @@ -77,9 +68,9 @@ void traversal(TreeNode* root, int leftLen) ```CPP if (root->left == NULL && root->right == NULL) { - if (leftLen > maxLen) { - maxLen = leftLen; // 更新最大深度 - maxleftValue = root->val; // 最大深度最左面的数值 + if (depth > maxDepth) { + maxDepth = depth; // 更新最大深度 + result = root->val; // 最大深度最左面的数值 } return; } @@ -92,14 +83,14 @@ if (root->left == NULL && root->right == NULL) { ```CPP // 中 if (root->left) { // 左 - leftLen++; // 深度加一 - traversal(root->left, leftLen); - leftLen--; // 回溯,深度减一 + depth++; // 深度加一 + traversal(root->left, depth); + depth--; // 回溯,深度减一 } if (root->right) { // 右 - leftLen++; // 深度加一 - traversal(root->right, leftLen); - leftLen--; // 回溯,深度减一 + depth++; // 深度加一 + traversal(root->right, depth); + depth--; // 回溯,深度减一 } return; ``` @@ -109,31 +100,31 @@ return; ```CPP class Solution { public: - int maxLen = INT_MIN; - int maxleftValue; - void traversal(TreeNode* root, int leftLen) { + int maxDepth = INT_MIN; + int result; + void traversal(TreeNode* root, int depth) { if (root->left == NULL && root->right == NULL) { - if (leftLen > maxLen) { - maxLen = leftLen; - maxleftValue = root->val; + if (depth > maxDepth) { + maxDepth = depth; + result = root->val; } return; } if (root->left) { - leftLen++; - traversal(root->left, leftLen); - leftLen--; // 回溯 + depth++; + traversal(root->left, depth); + depth--; // 回溯 } if (root->right) { - leftLen++; - traversal(root->right, leftLen); - leftLen--; // 回溯 + depth++; + traversal(root->right, depth); + depth--; // 回溯 } return; } int findBottomLeftValue(TreeNode* root) { traversal(root, 0); - return maxleftValue; + return result; } }; ``` @@ -143,27 +134,27 @@ public: ```CPP class Solution { public: - int maxLen = INT_MIN; - int maxleftValue; - void traversal(TreeNode* root, int leftLen) { + int maxDepth = INT_MIN; + int result; + void traversal(TreeNode* root, int depth) { if (root->left == NULL && root->right == NULL) { - if (leftLen > maxLen) { - maxLen = leftLen; - maxleftValue = root->val; + if (depth > maxDepth) { + maxDepth = depth; + result = root->val; } return; } if (root->left) { - traversal(root->left, leftLen + 1); // 隐藏着回溯 + traversal(root->left, depth + 1); // 隐藏着回溯 } if (root->right) { - traversal(root->right, leftLen + 1); // 隐藏着回溯 + traversal(root->right, depth + 1); // 隐藏着回溯 } return; } int findBottomLeftValue(TreeNode* root) { traversal(root, 0); - return maxleftValue; + return result; } }; ``` @@ -555,14 +546,14 @@ object Solution { var maxLeftValue = 0 var maxLen = Int.MinValue // 递归方法 - def traversal(node: TreeNode, leftLen: Int): Unit = { + def traversal(node: TreeNode, depth: Int): Unit = { // 如果左右都为空并且当前深度大于最大深度,记录最左节点的值 - if (node.left == null && node.right == null && leftLen > maxLen) { - maxLen = leftLen + if (node.left == null && node.right == null && depth > maxLen) { + maxLen = depth maxLeftValue = node.value } - if (node.left != null) traversal(node.left, leftLen + 1) - if (node.right != null) traversal(node.right, leftLen + 1) + if (node.left != null) traversal(node.left, depth + 1) + if (node.right != null) traversal(node.right, depth + 1) } traversal(root, 0) // 调用方法 maxLeftValue // return关键字可以省略 diff --git "a/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" "b/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" index 809f500bff..9611df996a 100644 --- "a/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" +++ "b/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" @@ -77,7 +77,7 @@ public: class Solution { private: int result = INT_MAX; -TreeNode* pre; +TreeNode* pre = NULL; void traversal(TreeNode* cur) { if (cur == NULL) return; traversal(cur->left); // 左 diff --git "a/problems/0700.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\220\234\347\264\242.md" "b/problems/0700.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\220\234\347\264\242.md" index a8dcc69fc6..22f009cba8 100644 --- "a/problems/0700.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\220\234\347\264\242.md" +++ "b/problems/0700.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\220\234\347\264\242.md" @@ -41,7 +41,7 @@ 代码如下: -``` +```CPP TreeNode* searchBST(TreeNode* root, int val) ``` @@ -49,7 +49,7 @@ TreeNode* searchBST(TreeNode* root, int val) 如果root为空,或者找到这个数值了,就返回root节点。 -``` +```CPP if (root == NULL || root->val == val) return root; ``` @@ -63,20 +63,36 @@ if (root == NULL || root->val == val) return root; 代码如下: -``` -if (root->val > val) return searchBST(root->left, val); // 注意这里加了return -if (root->val < val) return searchBST(root->right, val); -return NULL; +```CPP +TreeNode* result = NULL; +if (root->val > val) result = searchBST(root->left, val); +if (root->val < val) result = searchBST(root->right, val); +return result; ``` -这里可能会疑惑,在递归遍历的时候,什么时候直接return 递归函数的返回值,什么时候不用加这个 return呢。 +很多录友写递归函数的时候 习惯直接写 `searchBST(root->left, val)`,却忘了 递归函数还有返回值。 -我们在[二叉树:递归函数究竟什么时候需要返回值,什么时候不要返回值?](https://programmercarl.com/0112.路径总和.html)中讲了,如果要搜索一条边,递归函数就要加返回值,这里也是一样的道理。 +递归函数的返回值是什么? 是 左子树如果搜索到了val,要将该节点返回。 如果不用一个变量将其接住,那么返回值不就没了。 -**因为搜索到目标节点了,就要立即return了,这样才是找到节点就返回(搜索某一条边),如果不加return,就是遍历整棵树了。** +所以要 `result = searchBST(root->left, val)`。 整体代码如下: +```CPP +class Solution { +public: + TreeNode* searchBST(TreeNode* root, int val) { + if (root == NULL || root->val == val) return root; + TreeNode* result = NULL; + if (root->val > val) result = searchBST(root->left, val); + if (root->val < val) result = searchBST(root->right, val); + return result; + } +}; +``` + +或者我们也可以这么写 + ```CPP class Solution { public: @@ -89,6 +105,7 @@ public: }; ``` + ## 迭代法 一提到二叉树遍历的迭代法,可能立刻想起使用栈来模拟深度遍历,使用队列来模拟广度遍历。 From 1e7ff624a131a13ae6ac35dbff1810dbfe0d0606 Mon Sep 17 00:00:00 2001 From: fw_qaq <82551626+Jack-Zhang-1314@users.noreply.github.com> Date: Sat, 17 Sep 2022 23:17:56 +0800 Subject: [PATCH 1067/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20rust=20=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...22\345\205\245\344\275\215\347\275\256.md" | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git "a/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" "b/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" index 5ed3ac5600..4b17bec679 100644 --- "a/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" +++ "b/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" @@ -270,6 +270,26 @@ func searchInsert(nums []int, target int) int { } ``` +### Rust + +```rust +impl Solution { + pub fn search_insert(nums: Vec, target: i32) -> i32 { + let mut left = 0; + let mut right = nums.len(); + while left < right { + let mid = (left + right) / 2; + match nums[mid].cmp(&target) { + Ordering::Less => left = mid + 1, + Ordering::Equal => return ((left + right) / 2) as i32, + Ordering::Greater => right = mid, + } + } + ((left + right) / 2) as i32 + } +} +``` + ### Python ```python class Solution: From 954c3a4ecfa2330264f781c08974ffc18bf26930 Mon Sep 17 00:00:00 2001 From: fw_qaq <82551626+Jack-Zhang-1314@users.noreply.github.com> Date: Sun, 18 Sep 2022 09:51:08 +0800 Subject: [PATCH 1068/3019] =?UTF-8?q?Update=200034.=E5=9C=A8=E6=8E=92?= =?UTF-8?q?=E5=BA=8F=E6=95=B0=E7=BB=84=E4=B8=AD=E6=9F=A5=E6=89=BE=E5=85=83?= =?UTF-8?q?=E7=B4=A0=E7=9A=84=E7=AC=AC=E4=B8=80=E4=B8=AA=E5=92=8C=E6=9C=80?= =?UTF-8?q?=E5=90=8E=E4=B8=80=E4=B8=AA=E4=BD=8D=E7=BD=AE.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit rust --- ...00\344\270\252\344\275\215\347\275\256.md" | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git "a/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" "b/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" index 8b12845e4d..31ed4f7f90 100644 --- "a/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" +++ "b/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" @@ -389,6 +389,57 @@ class Solution: return [leftBorder, rightBorder] ``` +### Rust + +```rust + +impl Solution { + pub fn search_range(nums: Vec, target: i32) -> Vec { + let right_border = Solution::get_right_border(&nums, target); + let left_border = Solution::get_left_border(&nums, target); + if right_border == -2 || left_border == -2 { + return vec![-1, -1]; + } + if right_border - left_border > 0 { + return vec![left_border, right_border - 1]; + } + vec![-1, -1] + } + + pub fn get_right_border(nums: &Vec, target: i32) -> i32 { + let mut left = 0; + let mut right = nums.len(); + let mut right_border: i32 = -2; + while left < right { + let mid = (left + right) / 2; + if nums[mid] > target { + right = mid; + } else { + left = mid + 1; + right_border = left as i32; + } + } + right_border as i32 + } + + pub fn get_left_border(nums: &Vec, target: i32) -> i32 { + let mut left = 0; + let mut right = nums.len(); + let mut left_border: i32 = -2; + while left < right { + let mid = (left + right) / 2; + if nums[mid] >= target { + right = mid; + left_border = right as i32; + } else { + left = mid + 1; + } + } + left_border as i32 + } +} +``` + ### Go ```go From d3f5af3fd8a951669c110d402047d39658a9ab3f Mon Sep 17 00:00:00 2001 From: eat to 160 pounds <2915390277@qq.com> Date: Mon, 19 Sep 2022 08:57:33 +0800 Subject: [PATCH 1069/3019] =?UTF-8?q?feat:=E6=B7=BB=E5=8A=A00063=E4=B8=8D?= =?UTF-8?q?=E5=90=8C=E8=B7=AF=E5=BE=84=E5=86=85=E5=AD=98=E4=BC=98=E5=8C=96?= =?UTF-8?q?javascript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\345\220\214\350\267\257\345\276\204II.md" | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git "a/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" "b/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" index 6b81225cbc..f78995e912 100644 --- "a/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" +++ "b/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" @@ -382,8 +382,37 @@ var uniquePathsWithObstacles = function(obstacleGrid) { return dp[m - 1][n - 1] }; + +// 版本二:内存优化,直接以原数组为dp数组 +var uniquePathsWithObstacles = function(obstacleGrid) { + const m = obstacleGrid.length; + const n = obstacleGrid[0].length; + for (let i = 0; i < m; i++) { + for (let j = 0; j < n; j++) { + if (obstacleGrid[i][j] === 0) { + // 不是障碍物 + if (i === 0) { + // 取左边的值 + obstacleGrid[i][j] = obstacleGrid[i][j - 1] ?? 1; + } else if (j === 0) { + // 取上边的值 + obstacleGrid[i][j] = obstacleGrid[i - 1]?.[j] ?? 1; + } else { + // 取左边和上边的和 + obstacleGrid[i][j] = obstacleGrid[i - 1][j] + obstacleGrid[i][j - 1]; + } + } else { + // 如果是障碍物,则路径为0 + obstacleGrid[i][j] = 0; + } + } + } + return obstacleGrid[m - 1][n - 1]; +}; ``` + + ### TypeScript ```typescript From c1497b6e6eb4e2aa0c79b088d376561b04d628cf Mon Sep 17 00:00:00 2001 From: zhicheng lee <904688436@qq.com> Date: Mon, 19 Sep 2022 21:02:56 +0800 Subject: [PATCH 1070/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=201035.=E4=B8=8D?= =?UTF-8?q?=E7=9B=B8=E4=BA=A4=E7=9A=84=E7=BA=BF.md=20=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 原代码缩进、命名、空格不规范 --- ...70\344\272\244\347\232\204\347\272\277.md" | 35 ++++++++++--------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git "a/problems/1035.\344\270\215\347\233\270\344\272\244\347\232\204\347\272\277.md" "b/problems/1035.\344\270\215\347\233\270\344\272\244\347\232\204\347\272\277.md" index 831b60c863..391246756b 100644 --- "a/problems/1035.\344\270\215\347\233\270\344\272\244\347\232\204\347\272\277.md" +++ "b/problems/1035.\344\270\215\347\233\270\344\272\244\347\232\204\347\272\277.md" @@ -74,24 +74,27 @@ public: Java: - ```java +```java class Solution { - public int maxUncrossedLines(int[] A, int[] B) { - int [][] dp = new int[A.length+1][B.length+1]; - for(int i=1;i<=A.length;i++) { - for(int j=1;j<=B.length;j++) { - if (A[i-1]==B[j-1]) { - dp[i][j]=dp[i-1][j-1]+1; - } - else { - dp[i][j]=Math.max(dp[i-1][j], dp[i][j-1]); - } - } - } - return dp[A.length][B.length]; - } + public int maxUncrossedLines(int[] nums1, int[] nums2) { + int len1 = nums1.length; + int len2 = nums2.length; + int[][] dp = new int[len1 + 1][len2 + 1]; + + for (int i = 1; i <= len1; i++) { + for (int j = 1; j <= len2; j++) { + if (nums1[i - 1] == nums2[j - 1]) { + dp[i][j] = dp[i - 1][j - 1] + 1; + } else { + dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]); + } + } + } + + return dp[len1][len2]; + } } - ``` +``` Python: ```python From df5a6c62d50d0473745ce3406ceb4e04864fded1 Mon Sep 17 00:00:00 2001 From: vanyongqi <46806467+vanyongqi@users.noreply.github.com> Date: Tue, 20 Sep 2022 18:17:56 +0800 Subject: [PATCH 1071/3019] =?UTF-8?q?Update=200704.=E4=BA=8C=E5=88=86?= =?UTF-8?q?=E6=9F=A5=E6=89=BE.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 增加了二分查找C语言的左闭右开区间的版本,已通过leeitcode的验证 --- ...14\345\210\206\346\237\245\346\211\276.md" | 25 ++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git "a/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" "b/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" index 53f5331aac..26d821bd7a 100644 --- "a/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" +++ "b/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" @@ -515,7 +515,7 @@ impl Solution { ``` **C:** -```c +```c(版本一) int search(int* nums, int numsSize, int target){ int left = 0; int right = numsSize-1; @@ -541,6 +541,29 @@ int search(int* nums, int numsSize, int target){ return -1; } ``` +``` +C (版本二) +int search(int* nums, int numsSize, int target){ + int length = numsSize; + int left = 0; + int right = length;//定义target在左闭右开的区间里,即:[left, right) + int middle = 0; + while(left < right){// left == right时,区间[left, right)属于空集,所以用 < 避免该情况 + int middle = left + (right - left) / 2; + if(nums[middle] < target){ + //target位于(middle , right) 中为保证集合区间的左闭右开性,可等价为[middle + 1,right) + left = middle + 1; + }else if(nums[middle] > target){ + //target位于[left, middle)中 + right = middle ; + }else{// nums[middle] == target ,找到目标值target + return middle; + } + } + //未找到目标值,返回-1 + return -1; +} +``` **PHP:** ```php From 00aed2a72b6713b937c0379988a7e97d8383e329 Mon Sep 17 00:00:00 2001 From: zhicheng lee <904688436@qq.com> Date: Tue, 20 Sep 2022 20:46:20 +0800 Subject: [PATCH 1072/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200583.=E4=B8=A4?= =?UTF-8?q?=E4=B8=AA=E5=AD=97=E7=AC=A6=E4=B8=B2=E7=9A=84=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E6=93=8D=E4=BD=9C.md=20Java=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加另一种动态规划思路 --- ...40\351\231\244\346\223\215\344\275\234.md" | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git "a/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" "b/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" index 36c175c363..fd80853e14 100644 --- "a/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" +++ "b/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" @@ -128,6 +128,28 @@ public: Java: ```java +// dp数组中存储word1和word2最长相同子序列的长度 +class Solution { + public int minDistance(String word1, String word2) { + int len1 = word1.length(); + int len2 = word2.length(); + int[][] dp = new int[len1 + 1][len2 + 1]; + + for (int i = 1; i <= len1; i++) { + for (int j = 1; j <= len2; j++) { + if (word1.charAt(i - 1) == word2.charAt(j - 1)) { + dp[i][j] = dp[i - 1][j - 1] + 1; + } else { + dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]); + } + } + } + + return len1 + len2 - dp[len1][len2] * 2; + } +} + +// dp数组中存储需要删除的字符个数 class Solution { public int minDistance(String word1, String word2) { int[][] dp = new int[word1.length() + 1][word2.length() + 1]; From 5da89e2613958ebd2376966516f5aad366fe04dc Mon Sep 17 00:00:00 2001 From: vanyongqi <46806467+vanyongqi@users.noreply.github.com> Date: Wed, 21 Sep 2022 08:47:25 +0800 Subject: [PATCH 1073/3019] =?UTF-8?q?Update=200704.=E4=BA=8C=E5=88=86?= =?UTF-8?q?=E6=9F=A5=E6=89=BE.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 增加了C语言版本的左闭右开区间版本 --- ...44\272\214\345\210\206\346\237\245\346\211\276.md" | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git "a/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" "b/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" index 26d821bd7a..012e406676 100644 --- "a/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" +++ "b/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" @@ -515,7 +515,8 @@ impl Solution { ``` **C:** -```c(版本一) +``` +//C (版本一) 左闭右闭区间 [left, right] int search(int* nums, int numsSize, int target){ int left = 0; int right = numsSize-1; @@ -542,13 +543,13 @@ int search(int* nums, int numsSize, int target){ } ``` ``` -C (版本二) +C (版本二) 左闭右开区间 [left, right) int search(int* nums, int numsSize, int target){ int length = numsSize; int left = 0; - int right = length;//定义target在左闭右开的区间里,即:[left, right) + int right = length; //定义target在左闭右开的区间里,即:[left, right) int middle = 0; - while(left < right){// left == right时,区间[left, right)属于空集,所以用 < 避免该情况 + while(left < right){ // left == right时,区间[left, right)属于空集,所以用 < 避免该情况 int middle = left + (right - left) / 2; if(nums[middle] < target){ //target位于(middle , right) 中为保证集合区间的左闭右开性,可等价为[middle + 1,right) @@ -556,7 +557,7 @@ int search(int* nums, int numsSize, int target){ }else if(nums[middle] > target){ //target位于[left, middle)中 right = middle ; - }else{// nums[middle] == target ,找到目标值target + }else{ // nums[middle] == target ,找到目标值target return middle; } } From 19a51162372272638c2d180dd7b9c90ade37a346 Mon Sep 17 00:00:00 2001 From: Damonfruit <425212841@qq.com> Date: Wed, 21 Sep 2022 11:45:58 +0800 Subject: [PATCH 1074/3019] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BA=86=E5=B7=A6?= =?UTF-8?q?=E9=97=AD=E5=8F=88=E5=BC=80=E5=8C=BA=E9=97=B4=E7=9A=84python?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git "a/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" "b/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" index 53f5331aac..51f48267f6 100644 --- "a/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" +++ "b/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" @@ -220,7 +220,8 @@ class Solution: (版本二)左闭右开区间 -```class Solution: +```python +class Solution: def search(self, nums: List[int], target: int) -> int: if nums is None or len(nums)==0: return -1 From 84e8f9c20145be25474b0b8df7737fbb9de27533 Mon Sep 17 00:00:00 2001 From: vanyongqi <46806467+vanyongqi@users.noreply.github.com> Date: Wed, 21 Sep 2022 14:05:08 +0800 Subject: [PATCH 1075/3019] =?UTF-8?q?Update=200704.=E4=BA=8C=E5=88=86?= =?UTF-8?q?=E6=9F=A5=E6=89=BE.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...4.\344\272\214\345\210\206\346\237\245\346\211\276.md" | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git "a/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" "b/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" index 012e406676..472459de7c 100644 --- "a/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" +++ "b/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" @@ -515,8 +515,8 @@ impl Solution { ``` **C:** -``` -//C (版本一) 左闭右闭区间 [left, right] +```c +## (版本一) 左闭右闭区间 [left, right] int search(int* nums, int numsSize, int target){ int left = 0; int right = numsSize-1; @@ -542,8 +542,8 @@ int search(int* nums, int numsSize, int target){ return -1; } ``` -``` -C (版本二) 左闭右开区间 [left, right) +```C +##(版本二) 左闭右开区间 [left, right) int search(int* nums, int numsSize, int target){ int length = numsSize; int left = 0; From b9a26d4edfbc1b662b0a26ec7d193002cb915e45 Mon Sep 17 00:00:00 2001 From: vanyongqi <46806467+vanyongqi@users.noreply.github.com> Date: Wed, 21 Sep 2022 14:06:15 +0800 Subject: [PATCH 1076/3019] =?UTF-8?q?Update=200704.=E4=BA=8C=E5=88=86?= =?UTF-8?q?=E6=9F=A5=E6=89=BE.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" "b/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" index 472459de7c..21324db7e9 100644 --- "a/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" +++ "b/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" @@ -516,7 +516,7 @@ impl Solution { **C:** ```c -## (版本一) 左闭右闭区间 [left, right] +// (版本一) 左闭右闭区间 [left, right] int search(int* nums, int numsSize, int target){ int left = 0; int right = numsSize-1; @@ -543,7 +543,7 @@ int search(int* nums, int numsSize, int target){ } ``` ```C -##(版本二) 左闭右开区间 [left, right) +// (版本二) 左闭右开区间 [left, right) int search(int* nums, int numsSize, int target){ int length = numsSize; int left = 0; From 5a1841aa2b8c7a2d51c75e0cb2db199b835dee0f Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Thu, 22 Sep 2022 11:39:53 +0800 Subject: [PATCH 1077/3019] Update --- ...\346\227\213\347\237\251\351\230\265II.md" | 2 +- ...40\344\272\214\345\217\211\346\240\221.md" | 5 +++ ...57\345\276\204\346\200\273\345\222\214.md" | 34 ++++++++++--------- ...54\345\205\261\347\245\226\345\205\210.md" | 8 ++++- ...345\256\266\345\212\253\350\210\215III.md" | 4 +-- ...66\345\255\220\344\271\213\345\222\214.md" | 23 +++++++------ ...55\347\232\204\344\274\227\346\225\260.md" | 6 ++-- ...13\350\247\222\347\232\204\345\200\274.md" | 29 +++++++++------- ...04\347\232\204\345\271\263\346\226\271.md" | 9 ----- 9 files changed, 65 insertions(+), 55 deletions(-) diff --git "a/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" "b/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" index 54d7b5bb8e..0d093983ba 100644 --- "a/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" +++ "b/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" @@ -53,7 +53,7 @@ 那么我按照左闭右开的原则,来画一圈,大家看一下: -![螺旋矩阵](https://img-blog.csdnimg.cn/2020121623550681.png) +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20220922102236.png) 这里每一种颜色,代表一条边,我们遍历的长度,可以看出每一个拐角处的处理规则,拐角处让给新的一条边来继续画。 diff --git "a/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" "b/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" index 91e0c8d8c0..92eb9a257b 100644 --- "a/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" @@ -27,6 +27,11 @@ ![106. 从中序与后序遍历序列构造二叉树1](https://img-blog.csdnimg.cn/20210203154316774.png) +## 视频讲解 + +**《代码随想录》算法视频公开课:[坑很多!来看看你掉过几次坑 | LeetCode:106.从中序与后序遍历序列构造二叉树](https://www.bilibili.com/video/BV1vW4y1i7dn),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 + + ## 思路 首先回忆一下如何根据两个顺序构造一个唯一的二叉树,相信理论知识大家应该都清楚,就是以 后序数组的最后一个元素为切割点,先切中序数组,根据中序数组,反过来在切后序数组。一层一层切下去,每次后序数组最后一个元素就是节点元素。 diff --git "a/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" "b/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" index b79fd9cbeb..23b241cf4a 100644 --- "a/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" +++ "b/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" @@ -4,16 +4,6 @@

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

- -> 递归函数什么时候需要返回值 - -相信很多同学都会疑惑,递归函数什么时候要有返回值,什么时候没有返回值,特别是有的时候递归函数返回类型为bool类型。 - -那么接下来我通过详细讲解如下两道题,来回答这个问题: - -* 112.路径总和 -* 113.路径总和ii - # 112. 路径总和 [力扣题目链接](https://leetcode.cn/problems/path-sum/) @@ -29,11 +19,23 @@ 返回 true, 因为存在目标和为 22 的根节点到叶子节点的路径 5->4->11->2。 -# 思路 +## 视频讲解 + +**《代码随想录》算法视频公开课:[拿不准的遍历顺序,搞不清的回溯过程,我太难了! | LeetCode:112. 路径总和](https://www.bilibili.com/video/BV19t4y1L7CR),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 + + +## 思路 + +相信很多同学都会疑惑,递归函数什么时候要有返回值,什么时候没有返回值,特别是有的时候递归函数返回类型为bool类型。 + +那么接下来我通过详细讲解如下两道题,来回答这个问题: + +* 112.路径总和 +* 113.路径总和ii 这道题我们要遍历从根节点到叶子节点的的路径看看总和是不是目标和。 -## 递归 +### 递归 可以使用深度优先遍历的方式(本题前中后序都可以,无所谓,因为中节点也没有处理逻辑)来遍历二叉树 @@ -57,7 +59,7 @@ 所以代码如下: -``` +```CPP bool traversal(treenode* cur, int count) // 注意函数的返回类型 ``` @@ -74,7 +76,7 @@ bool traversal(treenode* cur, int count) // 注意函数的返回类型 递归终止条件代码如下: -``` +```CPP if (!cur->left && !cur->right && count == 0) return true; // 遇到叶子节点,并且计数为0 if (!cur->left && !cur->right) return false; // 遇到叶子节点而没有找到合适的边,直接返回 ``` @@ -168,7 +170,7 @@ public: **是不是发现精简之后的代码,已经完全看不出分析的过程了,所以我们要把题目分析清楚之后,在追求代码精简。** 这一点我已经强调很多次了! -## 迭代 +### 迭代 如果使用栈模拟递归的话,那么如果做回溯呢? @@ -285,7 +287,7 @@ public: 至于113. 路径总和ii 的迭代法我并没有写,用迭代方式记录所有路径比较麻烦,也没有必要,如果大家感兴趣的话,可以再深入研究研究。 -# 总结 +## 总结 本篇通过leetcode上112. 路径总和 和 113. 路径总和ii 详细的讲解了 递归函数什么时候需要返回值,什么不需要返回值。 diff --git "a/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" "b/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" index c3e2ae7a92..bae9547c21 100644 --- "a/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" +++ "b/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" @@ -51,7 +51,13 @@ 使用后序遍历,回溯的过程,就是从低向上遍历节点,一旦发现满足第一种情况的节点,就是最近公共节点了。 -**但是如果p或者q本身就是最近公共祖先呢?其实只需要找到一个节点是p或者q的时候,直接返回当前节点,无需继续递归子树。如果接下来的遍历中找到了后继节点满足第一种情况则修改返回值为后继节点,否则,继续返回已找到的节点即可。为什么满足第一种情况的节点一定是p或q的后继节点呢?大家可以仔细思考一下。** +**但是如果p或者q本身就是最近公共祖先呢**? + +其实只需要找到一个节点是p或者q的时候,直接返回当前节点,无需继续递归子树。 + +如果接下来的遍历中找到了后继节点满足第一种情况则修改返回值为后继节点,否则,继续返回已找到的节点即可。 + +为什么满足第一种情况的节点一定是p或q的后继节点呢?大家可以仔细思考一下。 递归三部曲: diff --git "a/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" "b/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" index 295f19fef6..704659885c 100644 --- "a/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" +++ "b/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" @@ -198,8 +198,8 @@ public: } }; ``` -* 时间复杂度:$O(n)$,每个节点只遍历了一次 -* 空间复杂度:$O(\log n)$,算上递推系统栈的空间 +* 时间复杂度:O(n),每个节点只遍历了一次 +* 空间复杂度:O(log n),算上递推系统栈的空间 ## 总结 diff --git "a/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" "b/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" index 12a2881e34..f9bdaa7cf9 100644 --- "a/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" +++ "b/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" @@ -15,10 +15,11 @@ ![404.左叶子之和1](https://img-blog.csdnimg.cn/20210204151927654.png) -# 思路 +## 视频讲解 **《代码随想录》算法视频公开课:[二叉树的题目中,总有一些规则让你找不到北 | LeetCode:404.左叶子之和](https://www.bilibili.com/video/BV1GY4y1K7z8),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 +## 思路 **首先要注意是判断左叶子,不是二叉树左侧节点,所以不要上来想着层序遍历。** @@ -163,7 +164,7 @@ public: }; ``` -# 总结 +## 总结 这道题目要求左叶子之和,其实是比较绕的,因为不能判断本节点是不是左叶子节点。 @@ -174,9 +175,9 @@ public: 希望通过这道题目,可以扩展大家对二叉树的解题思路。 -# 其他语言版本 +## 其他语言版本 -## Java +### Java **递归** @@ -245,7 +246,7 @@ class Solution { ``` -## Python +### Python **递归后序遍历** ```python @@ -291,7 +292,7 @@ class Solution: return res ``` -## Go +### Go **递归法** @@ -342,7 +343,7 @@ func sumOfLeftLeaves(root *TreeNode) int { ``` -## JavaScript +### JavaScript **递归法** @@ -391,7 +392,7 @@ var sumOfLeftLeaves = function(root) { }; ``` -## TypeScript +### TypeScript > 递归法 @@ -436,7 +437,7 @@ function sumOfLeftLeaves(root: TreeNode | null): number { }; ``` -## Swift +### Swift **递归法** ```swift @@ -485,7 +486,7 @@ func sumOfLeftLeaves(_ root: TreeNode?) -> Int { } ``` -## C +### C 递归法: ```c int sumOfLeftLeaves(struct TreeNode* root){ @@ -535,7 +536,7 @@ int sumOfLeftLeaves(struct TreeNode* root){ } ``` -## Scala +### Scala **递归:** ```scala diff --git "a/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" "b/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" index ad6577ddf6..a2fdddf43c 100644 --- "a/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" +++ "b/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" @@ -220,9 +220,9 @@ if (count > maxCount) { // 如果计数大于最大值 ```CPP class Solution { private: - int maxCount; // 最大频率 - int count; // 统计频率 - TreeNode* pre; + int maxCount = 0; // 最大频率 + int count = 0; // 统计频率 + TreeNode* pre = NULL; vector result; void searchBST(TreeNode* cur) { if (cur == NULL) return ; diff --git "a/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" "b/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" index 2218a54939..33c3033cd8 100644 --- "a/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" +++ "b/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" @@ -19,13 +19,18 @@ ![513.找树左下角的值1](https://img-blog.csdnimg.cn/20210204153017586.png) -# 思路 +## 视频讲解 + +**《代码随想录》算法视频公开课:[怎么找二叉树的左下角? 递归中又带回溯了,怎么办?| LeetCode:513.找二叉树左下角的值](https://www.bilibili.com/video/BV1424y1Z7pn),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 + + +## 思路 本地要找出树的最后一行找到最左边的值。此时大家应该想起用层序遍历是非常简单的了,反而用递归的话会比较难一点。 我们依然还是先介绍递归法。 -## 递归 +### 递归 咋眼一看,这道题目用递归的话就就一直向左遍历,最后一个就是答案呗? @@ -162,7 +167,7 @@ public: 如果对回溯部分精简的代码 不理解的话,可以看这篇[257. 二叉树的所有路径](https://programmercarl.com/0257.二叉树的所有路径.html) -## 迭代法 +### 迭代法 本题使用层序遍历再合适不过了,比递归要好理解的多! @@ -194,7 +199,7 @@ public: }; ``` -# 总结 +## 总结 本题涉及如下几点: @@ -204,10 +209,10 @@ public: 所以本题涉及到的点,我们之前都讲解过,这些知识点需要同学们灵活运用,这样就举一反三了。 -# 其他语言版本 +## 其他语言版本 -## Java +### Java ```java // 递归法 @@ -264,7 +269,7 @@ class Solution { -## Python +### Python 递归: ```python @@ -313,7 +318,7 @@ class Solution: return result ``` -## Go +### Go 递归法: @@ -373,7 +378,7 @@ func findBottomLeftValue(root *TreeNode) int { } ``` -## JavaScript +### JavaScript 递归版本: @@ -424,7 +429,7 @@ var findBottomLeftValue = function(root) { }; ``` -## TypeScript +### TypeScript > 递归法: @@ -469,7 +474,7 @@ function findBottomLeftValue(root: TreeNode | null): number { }; ``` -## Swift +### Swift 递归版本: @@ -537,7 +542,7 @@ func findBottomLeftValue(_ root: TreeNode?) -> Int { } ``` -## Scala +### Scala 递归版本: ```scala diff --git "a/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" "b/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" index 501b9a42a5..8b260ad4f8 100644 --- "a/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" +++ "b/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" @@ -41,15 +41,6 @@ public: } }; ``` -```python3 -class Solution: - def sortedSquares(self, nums: List[int]) -> List[int]: - res=[] - for num in nums: - res.append(num**2) - return sorted(res) -``` - 这个时间复杂度是 O(n + nlogn), 可以说是O(nlogn)的时间复杂度,但为了和下面双指针法算法时间复杂度有鲜明对比,我记为 O(n + nlog n)。 From 22537818597363b81ef74ee8b13d2b78f4896341 Mon Sep 17 00:00:00 2001 From: changcv2021 <104847847+changcv2021@users.noreply.github.com> Date: Thu, 22 Sep 2022 11:49:20 +0800 Subject: [PATCH 1078/3019] =?UTF-8?q?Update=200704.=E4=BA=8C=E5=88=86?= =?UTF-8?q?=E6=9F=A5=E6=89=BE.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ....\344\272\214\345\210\206\346\237\245\346\211\276.md" | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git "a/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" "b/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" index 7160a884de..3a44bb572e 100644 --- "a/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" +++ "b/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" @@ -225,14 +225,13 @@ class Solution: def search(self, nums: List[int], target: int) -> int: if nums is None or len(nums)==0: return -1 - l=0 - r=len(nums)-1 - while (l<=r): - m = round(l+(r-l)/2) + l,r=0,len(nums) + while (l target: - r=m-1 + r=m else: l=m+1 return -1 From 4eaca5f06f6603bede999ee95cbcc0eab26b1b94 Mon Sep 17 00:00:00 2001 From: changcv2021 <104847847+changcv2021@users.noreply.github.com> Date: Thu, 22 Sep 2022 11:51:56 +0800 Subject: [PATCH 1079/3019] =?UTF-8?q?Update=200704.=E4=BA=8C=E5=88=86?= =?UTF-8?q?=E6=9F=A5=E6=89=BE.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...2\214\345\210\206\346\237\245\346\211\276.md" | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git "a/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" "b/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" index 3a44bb572e..d13895490f 100644 --- "a/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" +++ "b/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" @@ -225,15 +225,15 @@ class Solution: def search(self, nums: List[int], target: int) -> int: if nums is None or len(nums)==0: return -1 - l,r=0,len(nums) - while (l target: - r=m + left,right=0,len(nums) + while (left target: + right=middle else: - l=m+1 + left=middle+1 return -1 ``` From 8fad92673f0cd593d483436cb718542e8fa60a3a Mon Sep 17 00:00:00 2001 From: zhicheng lee <904688436@qq.com> Date: Thu, 22 Sep 2022 22:23:24 +0800 Subject: [PATCH 1080/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=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=20Ja?= =?UTF-8?q?va=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加另一种思路的Java代码,更加清晰简洁 --- ...4\345\244\247\345\205\203\347\264\240I.md" | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git "a/problems/0496.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240I.md" "b/problems/0496.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240I.md" index 3c94881542..31e6f230b7 100644 --- "a/problems/0496.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240I.md" +++ "b/problems/0496.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240I.md" @@ -221,6 +221,32 @@ class Solution { return res; } } + +// 版本2 +class Solution { + public int[] nextGreaterElement(int[] nums1, int[] nums2) { + HashMap map = new HashMap<>(); + for (int i = 0; i < nums1.length; i++) { + map.put(nums1[i], i); + } + + int[] res = new int[nums1.length]; + Stack stack = new Stack<>(); + Arrays.fill(res, -1); + + for (int i = 0; i < nums2.length; i++) { + while (!stack.isEmpty() && nums2[stack.peek()] < nums2[i]) { + int pre = nums2[stack.pop()]; + if (map.containsKey(pre)) { + res[map.get(pre)] = nums2[i]; + } + } + stack.push(i); + } + + return res; + } +} ``` Python3: ```python From f48f7b0aa7b9cf5e81ee3405249e0c91296418ce Mon Sep 17 00:00:00 2001 From: xiaoyu2018 <861900161@qq.com> Date: Sun, 25 Sep 2022 15:54:27 +0800 Subject: [PATCH 1081/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A00509=E6=96=90?= =?UTF-8?q?=E6=B3=A2=E9=82=A3=E5=A5=91=E6=95=B0C#=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...42\351\202\243\345\245\221\346\225\260.md" | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git "a/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" "b/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" index 0b53e69827..4c9317bcb4 100644 --- "a/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" +++ "b/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" @@ -370,5 +370,45 @@ object Solution { } ``` +### C# + +动态规划: + +```c# +public class Solution +{ + public int Fib(int n) + { + if(n<2) return n; + int[] dp = new int[2] { 0, 1 }; + for (int i = 2; i <= n; i++) + { + int temp = dp[0] + dp[1]; + dp[0] = dp[1]; + dp[1] = temp; + } + return dp[1]; + } +} +``` + +递归: + +```c# +public class Solution +{ + public int Fib(int n) + { + if(n<2) + return n; + return Fib(n-1)+Fib(n-2); + } +} +``` + + + + + -----------------------
From 5ac7f6438110a91529b22fc45fb2a52d732cd076 Mon Sep 17 00:00:00 2001 From: xiaoyu2018 <861900161@qq.com> Date: Sun, 25 Sep 2022 16:02:41 +0800 Subject: [PATCH 1082/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A00509=E6=96=90?= =?UTF-8?q?=E6=B3=A2=E9=82=A3=E5=A5=91=E6=95=B0C#=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...0.\347\210\254\346\245\274\346\242\257.md" | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git "a/problems/0070.\347\210\254\346\245\274\346\242\257.md" "b/problems/0070.\347\210\254\346\245\274\346\242\257.md" index 0a6acf7f69..903e8d589e 100644 --- "a/problems/0070.\347\210\254\346\245\274\346\242\257.md" +++ "b/problems/0070.\347\210\254\346\245\274\346\242\257.md" @@ -425,5 +425,25 @@ object Solution { } ``` +### C# + +```c# +public class Solution { + public int ClimbStairs(int n) { + if(n<=2) return n; + int[] dp = new int[2] { 1, 2 }; + for (int i = 3; i <= n; i++) + { + int temp = dp[0] + dp[1]; + dp[0] = dp[1]; + dp[1] = temp; + } + return dp[1]; + } +} +``` + + + -----------------------
From 44c365a7baea23877053bb7966bcaaf6c81c1de8 Mon Sep 17 00:00:00 2001 From: xiaoyu2018 <861900161@qq.com> Date: Sun, 25 Sep 2022 16:13:05 +0800 Subject: [PATCH 1083/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A00746=E4=BD=BF?= =?UTF-8?q?=E7=94=A8=E6=9C=80=E5=B0=8F=E8=8A=B1=E8=B4=B9=E7=88=AC=E6=A5=BC?= =?UTF-8?q?=E6=A2=AFC#=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...71\347\210\254\346\245\274\346\242\257.md" | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git "a/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" "b/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" index 9d3bd7fa20..4a4c0b6557 100644 --- "a/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" +++ "b/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" @@ -370,5 +370,26 @@ object Solution { } ``` +### C# + +```c# +public class Solution +{ + public int MinCostClimbingStairs(int[] cost) + { + int[] dp=new int[2] { cost[0], cost[1] }; + for (int i = 2; i < cost.Length; i++) + { + int temp = Math.Min(dp[0], dp[1])+cost[i]; + dp[0]=dp[1]; + dp[1]=temp; + } + return Math.Min(dp[0],dp[1]); + } +} +``` + + + -----------------------
From 4e9ff712f71005b45e6ac0d7fbc2b0f0b779710e Mon Sep 17 00:00:00 2001 From: xiaoyu2018 <861900161@qq.com> Date: Sun, 25 Sep 2022 16:23:12 +0800 Subject: [PATCH 1084/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A00062=E4=B8=8D?= =?UTF-8?q?=E5=90=8C=E8=B7=AF=E5=BE=84C#=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...15\345\220\214\350\267\257\345\276\204.md" | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git "a/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" "b/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" index 5790df69ae..79e49b8773 100644 --- "a/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" +++ "b/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" @@ -452,5 +452,25 @@ object Solution { } ``` +### c# + +```c# +public class Solution +{ + public int UniquePaths(int m, int n) + { + int[] dp = new int[n]; + for (int i = 0; i < n; i++) + dp[i] = 1; + for (int i = 1; i < m; i++) + for (int j = 1; j < n; j++) + dp[j] += dp[j - 1]; + return dp[n - 1]; + } +} +``` + + + -----------------------
From 83096415a05cd5c6b1cb6a0269ca8327e993148a Mon Sep 17 00:00:00 2001 From: Galaxies2580 Date: Mon, 26 Sep 2022 09:14:58 +0800 Subject: [PATCH 1085/3019] add 0055 go tanxin --- ...63\350\267\203\346\270\270\346\210\217.md" | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git "a/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" "b/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" index 394117eed4..f2bcedcc94 100644 --- "a/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" +++ "b/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" @@ -139,7 +139,31 @@ func canJUmp(nums []int) bool { } ``` +```go +// 贪心 +func canJump(nums []int) bool { + cover := 0 + n := len(nums)-1 + for i := 0; i <= cover; i++ { // 每次与覆盖值比较 + cover = max(i+nums[i], cover) //每走一步都将 cover 更新为最大值 + if cover >= n { + return true + } + } + return false +} +func max(a, b int ) int { + if a > b { + return a + } + return b +} +``` + + + ### Javascript + ```Javascript var canJump = function(nums) { if(nums.length === 1) return true From 37d518f77632a920bb1dbf84a9ab34472437c431 Mon Sep 17 00:00:00 2001 From: Galaxies2580 Date: Mon, 26 Sep 2022 09:23:45 +0800 Subject: [PATCH 1086/3019] =?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=B0Go=E7=89=88=E6=9C=AC.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...02\347\202\271\344\270\252\346\225\260.md" | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git "a/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" "b/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" index dc037f0a39..eecc4dc170 100644 --- "a/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" +++ "b/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" @@ -437,6 +437,33 @@ func countNodes(root *TreeNode) int { } ``` +迭代法 + +```go +func countNodes(root *TreeNode) int { + if root == nil { + return 0 + } + q := list.New() + q.PushBack(root) + res := 0 + for q.Len() > 0 { + n := q.Len() + for i := 0; i < n; i++ { + node := q.Remove(q.Front()).(*TreeNode) + if node.Left != nil { + q.PushBack(node.Left) + } + if node.Right != nil { + q.PushBack(node.Right) + } + res++ + } + } + return res +} +``` + ## JavaScript: From f109f92a31bd231772f17a56432ca9f0589a0bf8 Mon Sep 17 00:00:00 2001 From: Galaxies2580 Date: Mon, 26 Sep 2022 09:30:14 +0800 Subject: [PATCH 1087/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0559.n=E5=8F=89?= =?UTF-8?q?=E6=A0=91=E7=9A=84=E6=9C=80=E5=A4=A7=E6=B7=B1=E5=BA=A6Go?= =?UTF-8?q?=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...00\345\244\247\346\267\261\345\272\246.md" | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git "a/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" "b/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" index 2bcc9c5c98..b74529d638 100644 --- "a/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" +++ "b/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" @@ -552,6 +552,29 @@ func maxdepth(root *treenode) int { ``` +### 559. n叉树的最大深度 + +```go +func maxDepth(root *Node) int { + if root == nil { + return 0 + } + q := list.New() + q.PushBack(root) + depth := 0 + for q.Len() > 0 { + n := q.Len() + for i := 0; i < n; i++ { + node := q.Remove(q.Front()).(*Node) + for j := range node.Children { + q.PushBack(node.Children[j]) + } + } + depth++ + } + return depth +} +``` ## javascript From 626f985e0ac033de68b1fad8e7453f8f624e39d2 Mon Sep 17 00:00:00 2001 From: fw_qaq <82551626+Jack-Zhang-1314@users.noreply.github.com> Date: Mon, 26 Sep 2022 16:18:11 +0800 Subject: [PATCH 1088/3019] =?UTF-8?q?Update=20=E9=93=BE=E8=A1=A8=E7=90=86?= =?UTF-8?q?=E8=AE=BA=E5=9F=BA=E7=A1=80=20about=20rust?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...20\206\350\256\272\345\237\272\347\241\200.md" | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git "a/problems/\351\223\276\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\351\223\276\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" index 8378f7f20c..455a2bfe06 100644 --- "a/problems/\351\223\276\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\351\223\276\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -218,6 +218,21 @@ class ListNode(_x: Int = 0, _next: ListNode = null) { } ``` +Rust: +```rust +pub struct Node { + value: T, + next: Link, +} + +type Link = Option>>; + +// 附设头节点 +pub struct List { + head: Link, +} +``` + -----------------------
From 9b7cf50c5a67596c50b9f720d1c845bff83ebc49 Mon Sep 17 00:00:00 2001 From: Galaxies2580 Date: Tue, 27 Sep 2022 09:29:44 +0800 Subject: [PATCH 1089/3019] =?UTF-8?q?=E5=A2=9E=E5=8A=A00045=E8=B7=B3?= =?UTF-8?q?=E8=B7=83=E6=B8=B8=E6=88=8F=E7=9A=84go=E8=B4=AA=E5=BF=83?= =?UTF-8?q?=E7=89=88=E6=9C=AC=E5=92=8Cpython=E8=B4=AA=E5=BF=83=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E4=BA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\350\267\203\346\270\270\346\210\217II.md" | 83 +++++++++++++++++++ 1 file changed, 83 insertions(+) diff --git "a/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" "b/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" index 13142c9936..59e30df525 100644 --- "a/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" +++ "b/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" @@ -214,7 +214,26 @@ class Solution: return ans ``` +```python +# 贪心版本二 +class Solution: + def jump(self, nums: List[int]) -> int: + if len(nums) == 1: + return 0 + curDistance, nextDistance = 0, 0 + step = 0 + for i in range(len(nums)-1): + nextDistance = max(nextDistance, nums[i]+i) + if i == curDistance: + curDistance = nextDistance + step += 1 + return step +``` + + + ### Go + ```Go func jump(nums []int) int { dp := make([]int, len(nums)) @@ -240,7 +259,71 @@ func min(a, b int) int { } ``` +```go +// 贪心版本一 +func jump(nums []int) int { + n := len(nums) + if n == 1 { + return 0 + } + cur, next := 0, 0 + step := 0 + for i := 0; i < n; i++ { + next = max(nums[i]+i, next) + if i == cur { + if cur != n-1 { + step++ + cur = next + if cur >= n-1 { + return step + } + } else { + return step + } + } + } + return step +} + +func max(a, b int) int { + if a > b { + return a + } + return b +} +``` + +```go +// 贪心版本二 +func jump(nums []int) int { + n := len(nums) + if n == 1 { + return 0 + } + cur, next := 0, 0 + step := 0 + for i := 0; i < n-1; i++ { + next = max(nums[i]+i, next) + if i == cur { + cur = next + step++ + } + } + return step +} + +func max(a, b int) int { + if a > b { + return a + } + return b +} +``` + + + ### Javascript + ```Javascript var jump = function(nums) { let curIndex = 0 From 28460715b62e83a89f32db41a9bcafae19f31b5e Mon Sep 17 00:00:00 2001 From: Flow-sandyu <72751523+Flow-sandyu@users.noreply.github.com> Date: Tue, 27 Sep 2022 20:39:27 +0800 Subject: [PATCH 1090/3019] =?UTF-8?q?Update=200019.=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E9=93=BE=E8=A1=A8=E7=9A=84=E5=80=92=E6=95=B0=E7=AC=ACN?= =?UTF-8?q?=E4=B8=AA=E8=8A=82=E7=82=B9.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修改了0019.删除链表的倒数第N个节点 java 版本 --- ...4N\344\270\252\350\212\202\347\202\271.md" | 45 ++++++++++--------- 1 file changed, 23 insertions(+), 22 deletions(-) diff --git "a/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" "b/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" index 00caeea0c3..c7f79b8d21 100644 --- "a/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" +++ "b/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" @@ -87,30 +87,31 @@ public: java: ```java -class Solution { - public ListNode removeNthFromEnd(ListNode head, int n) { - ListNode dummy = new ListNode(-1); - dummy.next = head; - - ListNode slow = dummy; - ListNode fast = dummy; - while (n-- > 0) { - fast = fast.next; - } - // 记住 待删除节点slow 的上一节点 - ListNode prev = null; - while (fast != null) { - prev = slow; - slow = slow.next; - fast = fast.next; - } - // 上一节点的next指针绕过 待删除节点slow 直接指向slow的下一节点 - prev.next = slow.next; - // 释放 待删除节点slow 的next指针, 这句删掉也能AC - slow.next = null; +public ListNode removeNthFromEnd(ListNode head, int n){ + ListNode dummyNode = new ListNode(0); + dummyNode.next = head; + + //排除示例 2 的情况:head = [1], n = 1 + if (head == null) + return null; - return dummy.next; + ListNode fastIndex = dummyNode; + ListNode slowIndex = dummyNode; + + //只要快慢指针相差 n 个结点即可 + for (int i = 0; i < n ; i++){ + fastIndex = fastIndex.next; + } + + while (fastIndex.next != null){ + fastIndex = fastIndex.next; + slowIndex = slowIndex.next; } + + //此时 slowIndex 的位置就是待删除元素的前一个位置。 + //具体情况可自己画一个链表长度为 3 的图来模拟代码来理解 + slowIndex.next = slowIndex.next.next; + return dummyNode.next; } ``` From 87c505371df01e7d62e422b796de66d92754fced Mon Sep 17 00:00:00 2001 From: Flow-sandyu <72751523+Flow-sandyu@users.noreply.github.com> Date: Tue, 27 Sep 2022 21:01:31 +0800 Subject: [PATCH 1091/3019] =?UTF-8?q?Update=200019.=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E9=93=BE=E8=A1=A8=E7=9A=84=E5=80=92=E6=95=B0=E7=AC=ACN?= =?UTF-8?q?=E4=B8=AA=E8=8A=82=E7=82=B9.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...5\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" | 4 ---- 1 file changed, 4 deletions(-) diff --git "a/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" "b/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" index c7f79b8d21..a84c0b2928 100644 --- "a/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" +++ "b/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" @@ -91,10 +91,6 @@ public ListNode removeNthFromEnd(ListNode head, int n){ ListNode dummyNode = new ListNode(0); dummyNode.next = head; - //排除示例 2 的情况:head = [1], n = 1 - if (head == null) - return null; - ListNode fastIndex = dummyNode; ListNode slowIndex = dummyNode; From 5252cfc060bedce7c5fe460a369343265ab92008 Mon Sep 17 00:00:00 2001 From: fw_qaq <82551626+Jack-Zhang-1314@users.noreply.github.com> Date: Wed, 28 Sep 2022 16:40:21 +0800 Subject: [PATCH 1092/3019] =?UTF-8?q?Update=20=E9=93=BE=E8=A1=A8=E7=90=86?= =?UTF-8?q?=E8=AE=BA=E5=9F=BA=E7=A1=80.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\206\350\256\272\345\237\272\347\241\200.md" | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git "a/problems/\351\223\276\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\351\223\276\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" index 455a2bfe06..cdd861fdea 100644 --- "a/problems/\351\223\276\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\351\223\276\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -220,16 +220,17 @@ class ListNode(_x: Int = 0, _next: ListNode = null) { Rust: ```rust -pub struct Node { - value: T, - next: Link, +#[derive(PartialEq, Eq, Clone, Debug)] +pub struct ListNode { + pub val: T, + pub next: Option>>, } -type Link = Option>>; - -// 附设头节点 -pub struct List { - head: Link, +impl ListNode { + #[inline] + fn new(val: T, node: Option>>) -> Self { + ListNode { next: node, val } + } } ``` From ca4c4f7f8be13af4ec8106fdc6e07ca26d6927c1 Mon Sep 17 00:00:00 2001 From: ZGQ Date: Wed, 28 Sep 2022 20:07:51 +0800 Subject: [PATCH 1093/3019] =?UTF-8?q?Update=200129.=E6=B1=82=E6=A0=B9?= =?UTF-8?q?=E8=8A=82=E7=82=B9=E5=88=B0=E5=8F=B6=E8=8A=82=E7=82=B9=E6=95=B0?= =?UTF-8?q?=E5=AD=97=E4=B9=8B=E5=92=8C.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...02\271\346\225\260\345\255\227\344\271\213\345\222\214.md" | 4 ++++ 1 file changed, 4 insertions(+) diff --git "a/problems/0129.\346\261\202\346\240\271\345\210\260\345\217\266\345\255\220\350\212\202\347\202\271\346\225\260\345\255\227\344\271\213\345\222\214.md" "b/problems/0129.\346\261\202\346\240\271\345\210\260\345\217\266\345\255\220\350\212\202\347\202\271\346\225\260\345\255\227\344\271\213\345\222\214.md" index 859df39e6f..bd5107a28a 100644 --- "a/problems/0129.\346\261\202\346\240\271\345\210\260\345\217\266\345\255\220\350\212\202\347\202\271\346\225\260\345\255\227\344\271\213\345\222\214.md" +++ "b/problems/0129.\346\261\202\346\240\271\345\210\260\345\217\266\345\255\220\350\212\202\347\202\271\346\225\260\345\255\227\344\271\213\345\222\214.md" @@ -320,8 +320,11 @@ TypeScript: ```typescript function sumNumbers(root: TreeNode | null): number { if (root === null) return 0; + // 记录最终结果 let resTotal: number = 0; + // 记录路径中遇到的节点值 const route: number[] = []; + // 递归初始值 route.push(root.val); recur(root, route); return resTotal; @@ -342,6 +345,7 @@ function sumNumbers(root: TreeNode | null): number { }; } function listToSum(nums: number[]): number { + // 数组求和 return Number(nums.join('')); } }; From de017e95441ece804182aec87cfba7f4414cc4a7 Mon Sep 17 00:00:00 2001 From: zihao Tan <53686585+Tcotyledons@users.noreply.github.com> Date: Thu, 29 Sep 2022 09:41:25 +0800 Subject: [PATCH 1094/3019] =?UTF-8?q?Update=200104.=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=A0=91=E7=9A=84=E6=9C=80=E5=A4=A7=E6=B7=B1=E5=BA=A6.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 104二叉树最大深度贡献java版本的从深度角度的递归法 --- ...00\345\244\247\346\267\261\345\272\246.md" | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git "a/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" "b/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" index 2bcc9c5c98..bcf3a4a32b 100644 --- "a/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" +++ "b/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" @@ -313,6 +313,31 @@ class solution { } ``` +```java +class Solution { + /** + * 递归法(求深度法) + */ + //定义最大深度 + int maxnum = 0; + + public int maxDepth(TreeNode root) { + ans(root,0); + return maxnum; + } + + //递归求解最大深度 + void ans(TreeNode tr,int tmp){ + if(tr==null) return; + tmp++; + maxnum = maxnum Date: Thu, 29 Sep 2022 10:51:23 +0800 Subject: [PATCH 1095/3019] =?UTF-8?q?Update=200150.=E9=80=86=E6=B3=A2?= =?UTF-8?q?=E5=85=B0=E8=A1=A8=E8=BE=BE=E5=BC=8F=E6=B1=82=E5=80=BC.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...276\345\274\217\346\261\202\345\200\274.md" | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git "a/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" "b/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" index 8107e4e07a..257bbb9a5b 100644 --- "a/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" +++ "b/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" @@ -89,26 +89,32 @@ C++代码如下: class Solution { public: int evalRPN(vector& tokens) { - stack st; + // 考虑到第20个样例使用int会溢出 + // 此处使用long long来存储number + // 在最后用int()强行转换成int输出 + + stack st; for (int i = 0; i < tokens.size(); i++) { if (tokens[i] == "+" || tokens[i] == "-" || tokens[i] == "*" || tokens[i] == "/") { - int num1 = st.top(); + long long num1 = st.top(); st.pop(); - int num2 = st.top(); + long long num2 = st.top(); st.pop(); if (tokens[i] == "+") st.push(num2 + num1); if (tokens[i] == "-") st.push(num2 - num1); if (tokens[i] == "*") st.push(num2 * num1); if (tokens[i] == "/") st.push(num2 / num1); } else { - st.push(stoi(tokens[i])); + st.push(atoll(tokens[i].c_str())); } } - int result = st.top(); + + long long result = st.top(); st.pop(); // 把栈里最后一个元素弹出(其实不弹出也没事) - return result; + return int(result); } }; + ``` ## 题外话 From 882defc2558de0592478c3836f120d63206cb065 Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Thu, 29 Sep 2022 11:04:11 +0800 Subject: [PATCH 1096/3019] Update --- ...40\344\272\214\345\217\211\346\240\221.md" | 2 +- ...\345\275\242\351\223\276\350\241\250II.md" | 2 +- ...76\345\274\217\346\261\202\345\200\274.md" | 2 +- ...54\345\205\261\347\245\226\345\205\210.md" | 20 ++++--- ...54\345\205\261\347\245\226\345\205\210.md" | 52 +++++++++++-------- ...66\344\272\214\345\217\211\346\240\221.md" | 29 ++++++----- ...47\344\272\214\345\217\211\346\240\221.md" | 29 ++++++----- ...55\347\232\204\346\220\234\347\264\242.md" | 27 ++++++---- 8 files changed, 98 insertions(+), 65 deletions(-) diff --git "a/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" "b/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" index 92eb9a257b..0fd50897b0 100644 --- "a/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" @@ -27,7 +27,7 @@ ![106. 从中序与后序遍历序列构造二叉树1](https://img-blog.csdnimg.cn/20210203154316774.png) -## 视频讲解 +# 视频讲解 **《代码随想录》算法视频公开课:[坑很多!来看看你掉过几次坑 | LeetCode:106.从中序与后序遍历序列构造二叉树](https://www.bilibili.com/video/BV1vW4y1i7dn),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 diff --git "a/problems/0142.\347\216\257\345\275\242\351\223\276\350\241\250II.md" "b/problems/0142.\347\216\257\345\275\242\351\223\276\350\241\250II.md" index 2054fd354c..050b5ee4dc 100644 --- "a/problems/0142.\347\216\257\345\275\242\351\223\276\350\241\250II.md" +++ "b/problems/0142.\347\216\257\345\275\242\351\223\276\350\241\250II.md" @@ -68,7 +68,7 @@ fast和slow各自再走一步, fast和slow就相遇了 环形入口节点到 fast指针与slow指针相遇节点 节点数为y。 从相遇节点 再到环形入口节点节点数为 z。 如图所示: -![142环形链表2](https://img-blog.csdnimg.cn/20210318162938397.png) +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20220925103433.png) 那么相遇时: slow指针走过的节点数为: `x + y`, diff --git "a/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" "b/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" index 8107e4e07a..13b2ba46bd 100644 --- "a/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" +++ "b/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" @@ -98,7 +98,7 @@ public: st.pop(); if (tokens[i] == "+") st.push(num2 + num1); if (tokens[i] == "-") st.push(num2 - num1); - if (tokens[i] == "*") st.push(num2 * num1); + if (tokens[i] == "*") st.push((long)num2 * (long)num1); //力扣改了后台测试数据 if (tokens[i] == "/") st.push(num2 / num1); } else { st.push(stoi(tokens[i])); diff --git "a/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" "b/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" index ee86d02f41..07e55ba580 100644 --- "a/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" +++ "b/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" @@ -38,24 +38,32 @@ # 思路 - 做过[二叉树:公共祖先问题](https://programmercarl.com/0236.二叉树的最近公共祖先.html)题目的同学应该知道,利用回溯从底向上搜索,遇到一个节点的左子树里有p,右子树里有q,那么当前节点就是最近公共祖先。 那么本题是二叉搜索树,二叉搜索树是有序的,那得好好利用一下这个特点。 在有序树里,如果判断一个节点的左子树里有p,右子树里有q呢? -其实只要从上到下遍历的时候,cur节点是数值在[p, q]区间中则说明该节点cur就是最近公共祖先了。 +因为是有序树,所有 如果 中间节点是 q 和 p 的公共祖先,那么 中节点的数组 一定是在 [p, q]区间的。即 中节点 > p && 中节点 < q 或者 中节点 > q && 中节点 < p。 -理解这一点,本题就很好解了。 +那么只要从上到下去遍历,遇到 cur节点是数值在[p, q]区间中则一定可以说明该节点cur就是q 和 p的公共祖先。 那问题来了,**一定是最近公共祖先吗**? + +如图,我们从根节点搜索,第一次遇到 cur节点是数值在[p, q]区间中,即 节点5,此时可以说明 p 和 q 一定分别存在于 节点 5的左子树,和右子树中。 + +![235.二叉搜索树的最近公共祖先](https://code-thinking-1253855093.file.myqcloud.com/pics/20220926164214.png) -和[二叉树:公共祖先问题](https://programmercarl.com/0236.二叉树的最近公共祖先.html)不同,普通二叉树求最近公共祖先需要使用回溯,从底向上来查找,二叉搜索树就不用了,因为搜索树有序(相当于自带方向),那么只要从上向下遍历就可以了。 +此时节点5是不是最近公共祖先? 如果 从节点5继续向左遍历,那么将错过成为q的祖先, 如果从节点5继续向右遍历则错过成为p的祖先。 -那么我们可以采用前序遍历(其实这里没有中节点的处理逻辑,遍历顺序无所谓了)。 +所以当我们从上向下去递归遍历,第一次遇到 cur节点是数值在[p, q]区间中,那么cur就是 p和q的最近公共祖先。 + +理解这一点,本题就很好解了。 + +而递归遍历顺序,本题就不涉及到 前中后序了(这里没有中节点的处理逻辑,遍历顺序无所谓了)。 如图所示:p为节点3,q为节点5 -![235.二叉搜索树的最近公共祖先](https://img-blog.csdnimg.cn/20210204150858927.png) +![235.二叉搜索树的最近公共祖先2](https://code-thinking-1253855093.file.myqcloud.com/pics/20220926165141.png) + 可以看出直接按照指定的方向,就可以找到节点4,为最近公共祖先,而且不需要遍历整棵树,找到结果直接返回! diff --git "a/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" "b/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" index bae9547c21..82ca09f0eb 100644 --- "a/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" +++ "b/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" @@ -41,23 +41,29 @@ 回溯啊,二叉树回溯的过程就是从低到上。 -后序遍历就是天然的回溯过程,最先处理的一定是叶子节点。 +后序遍历(左右中)就是天然的回溯过程,可以根据左右子树的返回值,来处理中节点的逻辑。 接下来就看如何判断一个节点是节点q和节点p的公共公共祖先呢。 -**首先最容易想到的一个情况:如果找到一个节点,发现左子树出现结点p,右子树出现节点q,或者 左子树出现结点q,右子树出现节点p,那么该节点就是节点p和q的最近公共祖先。** +**首先最容易想到的一个情况:如果找到一个节点,发现左子树出现结点p,右子树出现节点q,或者 左子树出现结点q,右子树出现节点p,那么该节点就是节点p和q的最近公共祖先。** 即情况一: -**但是很多人容易忽略一个情况,就是节点本身p(q),它拥有一个子孙节点q(p)。** +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20220922173502.png) -使用后序遍历,回溯的过程,就是从低向上遍历节点,一旦发现满足第一种情况的节点,就是最近公共节点了。 +判断逻辑是 如果递归遍历遇到q,就将q返回,遇到p 就将p返回,那么如果 左右子树的返回值都不为空,说明此时的中节点,一定是q 和p 的最近祖先。 -**但是如果p或者q本身就是最近公共祖先呢**? +那么有录友可能疑惑,会不会左子树 遇到q 返回,右子树也遇到q返回,这样并没有找到 q 和p的最近祖先。 -其实只需要找到一个节点是p或者q的时候,直接返回当前节点,无需继续递归子树。 +这么想的录友,要审题了,题目强调:**二叉树节点数值是不重复的,而且一定存在 q 和 p**。 -如果接下来的遍历中找到了后继节点满足第一种情况则修改返回值为后继节点,否则,继续返回已找到的节点即可。 +**但是很多人容易忽略一个情况,就是节点本身p(q),它拥有一个子孙节点q(p)。** 情况二: -为什么满足第一种情况的节点一定是p或q的后继节点呢?大家可以仔细思考一下。 +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20220922173530.png) + +其实情况一 和 情况二 代码实现过程都是一样的,也可以说,实现情况一的逻辑,顺便包含了情况二。 + +因为遇到 q 或者 p 就返回,这样也包含了 q 或者 p 本省就是 公共祖先的情况。 + +这一点是很多录友容易忽略的,在下面的代码讲解中,可以在去体会。 递归三部曲: @@ -69,20 +75,24 @@ 代码如下: -``` +```CPP TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) ``` * 确定终止条件 -如果找到了 节点p或者q,或者遇到空节点,就返回。 +遇到空的话,然后然后空,因为树都是空了,所以返回空。 + +那么我们来说一说,如果 root == q,或者 root == p,说明找到 q p ,则将其返回,这个返回值,后面在中节点的处理过程中会用到,那么中节点处理逻辑,后下面讲解。 代码如下: -``` +```CPP if (root == q || root == p || root == NULL) return root; ``` + + * 确定单层递归逻辑 值得注意的是 本题函数有返回值,是因为回溯的过程需要递归函数的返回值做判断,但本题我们依然要遍历树的所有节点。 @@ -93,7 +103,7 @@ if (root == q || root == p || root == NULL) return root; 搜索一条边的写法: -``` +```CPP if (递归函数(root->left)) return ; if (递归函数(root->right)) return ; @@ -101,10 +111,10 @@ if (递归函数(root->right)) return ; 搜索整个树写法: -``` -left = 递归函数(root->left); -right = 递归函数(root->right); -left与right的逻辑处理; +```CPP +left = 递归函数(root->left); // 左 +right = 递归函数(root->right); // 右 +left与right的逻辑处理; // 中 ``` 看出区别了没? @@ -123,10 +133,10 @@ left与right的逻辑处理; 因为在如下代码的后序遍历中,如果想利用left和right做逻辑处理, 不能立刻返回,而是要等left与right逻辑处理完之后才能返回。 -``` -left = 递归函数(root->left); -right = 递归函数(root->right); -left与right的逻辑处理; +```CPP +left = 递归函数(root->left); // 左 +right = 递归函数(root->right); // 右 +left与right的逻辑处理; // 中 ``` 所以此时大家要知道我们要遍历整棵树。知道这一点,对本题就有一定深度的理解了。 @@ -134,7 +144,7 @@ left与right的逻辑处理; 那么先用left和right接住左子树和右子树的返回值,代码如下: -``` +```CPP TreeNode* left = lowestCommonAncestor(root->left, p, q); TreeNode* right = lowestCommonAncestor(root->right, p, q); diff --git "a/problems/0617.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md" "b/problems/0617.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md" index 6a84376312..eb485afc21 100644 --- "a/problems/0617.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0617.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md" @@ -19,13 +19,18 @@ 注意: 合并必须从两个树的根节点开始。 -# 思路 +# 视频讲解 + +**《代码随想录》算法视频公开课:[一起操作两个二叉树?有点懵!| LeetCode:617.合并二叉树](https://www.bilibili.com/video/BV1m14y1Y7JK),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 + + +## 思路 相信这道题目很多同学疑惑的点是如何同时遍历两个二叉树呢? 其实和遍历一个树逻辑是一样的,只不过传入两个树的节点,同时操作。 -## 递归 +### 递归 二叉树使用递归,就要想使用前中后哪种遍历方式? @@ -207,7 +212,7 @@ public: }; ``` -# 拓展 +## 拓展 当然也可以秀一波指针的操作,这是我写的野路子,大家就随便看看就行了,以防带跑遍了。 @@ -239,7 +244,7 @@ public: }; ``` -# 总结 +## 总结 合并二叉树,也是二叉树操作的经典题目,如果没有接触过的话,其实并不简单,因为我们习惯了操作一个二叉树,一起操作两个二叉树,还会有点懵懵的。 @@ -250,10 +255,10 @@ public: 最后拓展中,我给了一个操作指针的野路子,大家随便看看就行了,如果学习C++的话,可以在去研究研究。 -# 其他语言版本 +## 其他语言版本 -## Java +### Java ```Java class Solution { @@ -346,7 +351,7 @@ class Solution { } ``` -## Python +### Python **递归法 - 前序遍历** ```python @@ -409,7 +414,7 @@ class Solution: return root1 ``` -## Go +### Go ```go /** @@ -503,7 +508,7 @@ func mergeTrees(root1 *TreeNode, root2 *TreeNode) *TreeNode { } ``` -## JavaScript +### JavaScript > 递归法: @@ -583,11 +588,11 @@ var mergeTrees = function(root1, root2) { ``` -## TypeScript +### TypeScript > 递归法: -```type +```typescript function mergeTrees(root1: TreeNode | null, root2: TreeNode | null): TreeNode | null { if (root1 === null) return root2; if (root2 === null) return root1; @@ -631,7 +636,7 @@ function mergeTrees(root1: TreeNode | null, root2: TreeNode | null): TreeNode | }; ``` -## Scala +### Scala 递归: ```scala diff --git "a/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" "b/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" index e2a64bcd9b..18739fdfe9 100644 --- "a/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" @@ -25,7 +25,12 @@ 给定的数组的大小在 [1, 1000] 之间。 -# 思路 +## 视频讲解 + +**《代码随想录》算法视频公开课:[又是构造二叉树,又有很多坑!| LeetCode:654.最大二叉树](https://www.bilibili.com/video/BV1MG411G7ox),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 + + +## 思路 最大二叉树的构建过程如下: @@ -175,7 +180,7 @@ public: }; ``` -# 拓展 +## 拓展 可以发现上面的代码看上去简洁一些,**主要是因为第二版其实是允许空节点进入递归,所以不用在递归的时候加判断节点是否为空** @@ -207,7 +212,7 @@ root->right = traversal(nums, maxValueIndex + 1, right); 第二版相应的终止条件,是遇到空节点,也就是数组区间为0,就终止了。 -# 总结 +## 总结 这道题目其实和 [二叉树:构造二叉树登场!](https://programmercarl.com/0106.从中序与后序遍历序列构造二叉树.html) 是一个思路,比[二叉树:构造二叉树登场!](https://programmercarl.com/0106.从中序与后序遍历序列构造二叉树.html) 还简单一些。 @@ -218,10 +223,10 @@ root->right = traversal(nums, maxValueIndex + 1, right); 其实就是不同代码风格的实现,**一般情况来说:如果让空节点(空指针)进入递归,就不加if,如果不让空节点进入递归,就加if限制一下, 终止条件也会相应的调整。** -# 其他语言版本 +## 其他语言版本 -## Java +### Java ```Java class Solution { @@ -253,7 +258,7 @@ class Solution { } ``` -## Python +### Python ```python class Solution: @@ -300,7 +305,7 @@ class Solution: return root ``` -## Go +### Go ```go @@ -334,7 +339,7 @@ func findMax(nums []int) (index int){ } ``` -## JavaScript +### JavaScript ```javascript /** @@ -371,7 +376,7 @@ var constructMaximumBinaryTree = function (nums) { }; ``` -## TypeScript +### TypeScript > 新建数组法: @@ -419,7 +424,7 @@ function constructMaximumBinaryTree(nums: number[]): TreeNode | null { -## C +### C ```c struct TreeNode* traversal(int* nums, int left, int right) { @@ -450,7 +455,7 @@ struct TreeNode* constructMaximumBinaryTree(int* nums, int numsSize){ } ``` -## Swift +### Swift ```swift func constructMaximumBinaryTree(_ nums: inout [Int]) -> TreeNode? { return traversal(&nums, 0, nums.count) @@ -476,7 +481,7 @@ func traversal(_ nums: inout [Int], _ left: Int, _ right: Int) -> TreeNode? { } ``` -## Scala +### Scala ```scala object Solution { diff --git "a/problems/0700.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\220\234\347\264\242.md" "b/problems/0700.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\220\234\347\264\242.md" index 22f009cba8..53c9136e4a 100644 --- "a/problems/0700.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\220\234\347\264\242.md" +++ "b/problems/0700.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\220\234\347\264\242.md" @@ -17,7 +17,12 @@ 在上述示例中,如果要找的值是 5,但因为没有节点值为 5,我们应该返回 NULL。 -# 思路 +# 视频讲解 + +**《代码随想录》算法视频公开课:[不愧是搜索树,这次搜索有方向了!| LeetCode:700.二叉搜索树中的搜索](https://www.bilibili.com/video/BV1wG411g7sF),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 + + +## 思路 之前我们讲了都是普通二叉树,那么接下来看看二叉搜索树。 @@ -33,7 +38,7 @@ 本题,其实就是在二叉搜索树中搜索一个节点。那么我们来看看应该如何遍历。 -## 递归法 +### 递归法 1. 确定递归函数的参数和返回值 @@ -106,7 +111,7 @@ public: ``` -## 迭代法 +### 迭代法 一提到二叉树遍历的迭代法,可能立刻想起使用栈来模拟深度遍历,使用队列来模拟广度遍历。 @@ -140,7 +145,7 @@ public: 第一次看到了如此简单的迭代法,是不是感动的痛哭流涕,哭一会~ -# 总结 +## 总结 本篇我们介绍了二叉搜索树的遍历方式,因为二叉搜索树的有序性,遍历的时候要比普通二叉树简单很多。 @@ -153,9 +158,9 @@ public: -# 其他语言版本 +## 其他语言版本 -## Java +### Java ```Java class Solution { @@ -222,7 +227,7 @@ class Solution { } ``` -## Python +### Python 递归法: @@ -257,7 +262,7 @@ class Solution: ``` -## Go +### Go 递归法: @@ -292,7 +297,7 @@ func searchBST(root *TreeNode, val int) *TreeNode { } ``` -## JavaScript +### JavaScript 递归: @@ -350,7 +355,7 @@ var searchBST = function (root, val) { }; ``` -## TypeScript +### TypeScript > 递归法 @@ -380,7 +385,7 @@ function searchBST(root: TreeNode | null, val: number): TreeNode | null { }; ``` -## Scala +### Scala 递归: ```scala From 4d6b8252a1d51b0cef64e5b4739ef21329bdd41c Mon Sep 17 00:00:00 2001 From: chenzhg <2216468566@qq.com> Date: Thu, 29 Sep 2022 17:31:58 +0800 Subject: [PATCH 1097/3019] =?UTF-8?q?Update=200583.=E4=B8=A4=E4=B8=AA?= =?UTF-8?q?=E5=AD=97=E7=AC=A6=E4=B8=B2=E7=9A=84=E5=88=A0=E9=99=A4=E6=93=8D?= =?UTF-8?q?=E4=BD=9C=20C++?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...32\204\345\210\240\351\231\244\346\223\215\344\275\234.md" | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git "a/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" "b/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" index fd80853e14..c33f7f5884 100644 --- "a/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" +++ "b/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" @@ -47,6 +47,8 @@ dp[i][j]:以i-1为结尾的字符串word1,和以j-1位结尾的字符串word 那最后当然是取最小值,所以当word1[i - 1] 与 word2[j - 1]不相同的时候,递推公式:dp[i][j] = min({dp[i - 1][j - 1] + 2, dp[i - 1][j] + 1, dp[i][j - 1] + 1}); +因为dp[i - 1][j - 1] + 1等于 dp[i - 1][j] 或 dp[i][j - 1],所以递推公式可简化为:dp[i][j] = min(dp[i - 1][j] + 1, dp[i][j - 1] + 1); + 3. dp数组如何初始化 @@ -90,7 +92,7 @@ public: if (word1[i - 1] == word2[j - 1]) { dp[i][j] = dp[i - 1][j - 1]; } else { - dp[i][j] = min({dp[i - 1][j - 1] + 2, dp[i - 1][j] + 1, dp[i][j - 1] + 1}); + dp[i][j] = min(dp[i - 1][j] + 1, dp[i][j - 1] + 1); } } } From 755ba1b0786dbc3fad56f31c54de7f4727b23819 Mon Sep 17 00:00:00 2001 From: fw_qaq <82551626+Jack-Zhang-1314@users.noreply.github.com> Date: Thu, 29 Sep 2022 18:34:49 +0800 Subject: [PATCH 1098/3019] =?UTF-8?q?update=20707.=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E9=93=BE=E8=A1=A8=20about=20rust?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...76\350\256\241\351\223\276\350\241\250.md" | 88 +++++++++++++++++++ 1 file changed, 88 insertions(+) diff --git "a/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" "b/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" index 83e57fec82..1f7e6cbfed 100644 --- "a/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" +++ "b/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" @@ -1240,6 +1240,94 @@ class MyLinkedList() { } ``` +Rust: + +```rust +#[derive(Debug)] +pub struct MyLinkedList { + pub val: i32, + pub next: Option>, +} + +impl MyLinkedList { + fn new() -> Self { + // 增加头节点 + MyLinkedList { val: 0, next: None } + } + + fn get(&self, index: i32) -> i32 { + if index < 0 { + return -1; + } + let mut i = 0; + let mut cur = &self.next; + while let Some(node) = cur { + if i == index { + return node.val; + } + i += 1; + cur = &node.next; + } + -1 + } + + fn add_at_head(&mut self, val: i32) { + let new_node = Box::new(MyLinkedList { + val, + next: self.next.take(), + }); + self.next = Some(new_node); + } + + fn add_at_tail(&mut self, val: i32) { + let new_node = Box::new(MyLinkedList { val, next: None }); + let mut last_node = &mut self.next; + while let Some(node) = last_node { + last_node = &mut node.next; + } + *last_node = Some(new_node); + } + + fn add_at_index(&mut self, index: i32, val: i32) { + if index <= 0 { + self.add_at_head(val); + } else { + let mut i = 0; + let mut cur = &mut self.next; + while let Some(node) = cur { + if i + 1 == index { + let new_node = Box::new(MyLinkedList { + val, + next: node.next.take(), + }); + node.next = Some(new_node); + break; + } + i += 1; + cur = &mut node.next; + } + } + } + + fn delete_at_index(&mut self, index: i32) { + if index < 0 { + return; + } + + let mut i = 0; + let mut cur = self; + while let Some(node) = cur.next.take() { + if i == index { + cur.next = node.next; + break; + } + i += 1; + cur.next = Some(node); + cur = cur.next.as_mut().unwrap(); + } + } +} +``` -----------------------
From 12f2ecf564c232edcd4a0d1eb143a9aa9aed05d3 Mon Sep 17 00:00:00 2001 From: vanyongqi <46806467+vanyongqi@users.noreply.github.com> Date: Fri, 30 Sep 2022 10:20:50 +0800 Subject: [PATCH 1099/3019] =?UTF-8?q?Update=200035.=E6=90=9C=E7=B4=A2?= =?UTF-8?q?=E6=8F=92=E5=85=A5=E4=BD=8D=E7=BD=AE.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 增加C语言的两种版本,已通过Leetcode测试 --- ...22\345\205\245\344\275\215\347\275\256.md" | 52 ++++++++++++++++++- 1 file changed, 51 insertions(+), 1 deletion(-) diff --git "a/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" "b/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" index 4b17bec679..98984f9e06 100644 --- "a/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" +++ "b/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" @@ -429,7 +429,57 @@ function searchInsert($nums, $target) return $r + 1; } ``` - +### C +```c +//版本一 [left, right]左闭右闭区间 +int searchInsert(int* nums, int numsSize, int target){ + //左闭右开区间 [0 , numsSize-1] + int left =0; + int mid =0; + int right = numsSize - 1; + while(left <= right){//左闭右闭区间 所以可以 left == right + mid = left + (right - left) / 2; + if(target < nums[mid]){ + //target 在左区间 [left, middle - 1]中,原区间包含mid,右区间边界可以向左内缩 + right = mid -1; + }else if( target > nums[mid]){ + // target 在右区间 [mid + 1, right]中,原区间包含mid,左区间边界可以向右内缩 + left = mid + 1; + }else { + // nums[mid] == target ,顺利找到target,直接返回mid + return mid; + } + } + //数组中未找到target元素 + //target在数组所有元素之后,[left, right]是右闭区间,需要返回 right +1 + return right + 1; +} +``` +```c +//版本二 [left, right]左闭右开区间 +int searchInsert(int* nums, int numsSize, int target){ + //左闭右开区间 [0 , numsSize) + int left =0; + int mid =0; + int right = numsSize; + while(left < right){//左闭右闭区间 所以 left < right + mid = left + (right - left) / 2; + if(target < nums[mid]){ + //target 在左区间 [left, mid)中,原区间没有包含mid,右区间边界可以不能内缩 + right = mid ; + }else if( target > nums[mid]){ + // target 在右区间 [mid+1, right)中,原区间包含mid,左区间边界可以向右内缩 + left = mid + 1; + }else { + // nums[mid] == target ,顺利找到target,直接返回mid + return mid; + } + } + //数组中未找到target元素 + //target在数组所有元素之后,[left, right)是右开区间, return right即可 + return right; +} +``` -----------------------
From 4276745f1ba4b048c022013edddb89d3959fd49b Mon Sep 17 00:00:00 2001 From: vanyongqi <46806467+vanyongqi@users.noreply.github.com> Date: Fri, 30 Sep 2022 10:23:25 +0800 Subject: [PATCH 1100/3019] =?UTF-8?q?Update=200035.=E6=90=9C=E7=B4=A2?= =?UTF-8?q?=E6=8F=92=E5=85=A5=E4=BD=8D=E7=BD=AE.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 增加C语言两种版本,通过Leetcode测试 --- ...\242\346\217\222\345\205\245\344\275\215\347\275\256.md" | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git "a/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" "b/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" index 98984f9e06..cd2c88eb20 100644 --- "a/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" +++ "b/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" @@ -440,10 +440,10 @@ int searchInsert(int* nums, int numsSize, int target){ while(left <= right){//左闭右闭区间 所以可以 left == right mid = left + (right - left) / 2; if(target < nums[mid]){ - //target 在左区间 [left, middle - 1]中,原区间包含mid,右区间边界可以向左内缩 + //target 在左区间 [left, mid - 1]中,原区间包含mid,右区间边界可以向左内缩 right = mid -1; }else if( target > nums[mid]){ - // target 在右区间 [mid + 1, right]中,原区间包含mid,左区间边界可以向右内缩 + //target 在右区间 [mid + 1, right]中,原区间包含mid,左区间边界可以向右内缩 left = mid + 1; }else { // nums[mid] == target ,顺利找到target,直接返回mid @@ -465,7 +465,7 @@ int searchInsert(int* nums, int numsSize, int target){ while(left < right){//左闭右闭区间 所以 left < right mid = left + (right - left) / 2; if(target < nums[mid]){ - //target 在左区间 [left, mid)中,原区间没有包含mid,右区间边界可以不能内缩 + //target 在左区间 [left, mid)中,原区间没有包含mid,右区间边界不能内缩 right = mid ; }else if( target > nums[mid]){ // target 在右区间 [mid+1, right)中,原区间包含mid,左区间边界可以向右内缩 From 2772fd498da7160313210e1b58b2b86d907ac96a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E6=98=82=E8=AC=99?= Date: Fri, 30 Sep 2022 14:48:18 +0800 Subject: [PATCH 1101/3019] =?UTF-8?q?update=20455.=E5=88=86=E7=99=BC?= =?UTF-8?q?=E9=A4=85=E4=B9=BE=20C=E8=AA=9E=E8=A8=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...06\345\217\221\351\245\274\345\271\262.md" | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git "a/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" "b/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" index f9e8e7f1bc..93a4c2d342 100644 --- "a/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" +++ "b/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" @@ -274,6 +274,7 @@ function findContentChildren(g: number[], s: number[]): number { ### C ```c +///小餅乾先餵飽小胃口的 int cmp(int* a, int* b) { return *a - *b; } @@ -296,6 +297,33 @@ int findContentChildren(int* g, int gSize, int* s, int sSize){ } ``` +```c +///大餅乾先餵飽大胃口的 +int cmp(int* a, int* b) { + return *a - *b; +} + +int findContentChildren(int* g, int gSize, int* s, int sSize){ + if(sSize == 0) + return 0; + + //将两个数组排序为升序 + qsort(g, gSize, sizeof(int), cmp); + qsort(s, sSize, sizeof(int), cmp); + + int count = 0; + int start = sSize - 1; + + for(int i = gSize - 1; i >= 0; i--) { + if(start >= 0 && s[start] >= g[i] ) { + start--; + count++; + } + } + return count; +} +``` + ### Scala ```scala From a8a98842cb6deb7c365e5e47790b1472abe064ad Mon Sep 17 00:00:00 2001 From: fw_qaq <82551626+Jack-Zhang-1314@users.noreply.github.com> Date: Sat, 1 Oct 2022 12:36:16 +0800 Subject: [PATCH 1102/3019] =?UTF-8?q?update=20206=E7=BF=BB=E8=BD=AC?= =?UTF-8?q?=E9=93=BE=E8=A1=A8=20about=20rust?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...73\350\275\254\351\223\276\350\241\250.md" | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git "a/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md" "b/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md" index e97befee22..009b446910 100644 --- "a/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md" +++ "b/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md" @@ -588,5 +588,45 @@ object Solution { } ``` + +Rust: +双指针法: + +```rust +impl Solution { + pub fn reverse_list(head: Option>) -> Option> { + let mut cur = head; + let mut pre = None; + while let Some(mut node) = cur.take() { + cur = node.next; + node.next = pre; + pre = Some(node); + } + pre + } +} +``` + +递归法: + +```rust +impl Solution { + pub fn reverse_list(head: Option>) -> Option> { + fn rev( + mut head: Option>, + mut pre: Option>, + ) -> Option> { + if let Some(mut node) = head.take() { + let cur = node.next; + node.next = pre; + pre = Some(node); + return rev(cur, pre); + } + pre + } + rev(head, None) + } +} +``` -----------------------
From 987380ca9327a5e097d1b0a7661586eeb2f088d2 Mon Sep 17 00:00:00 2001 From: fw_qaq <82551626+Jack-Zhang-1314@users.noreply.github.com> Date: Sat, 1 Oct 2022 14:32:22 +0800 Subject: [PATCH 1103/3019] =?UTF-8?q?update=200024.=E4=B8=A4=E4=B8=A4?= =?UTF-8?q?=E4=BA=A4=E6=8D=A2=E9=93=BE=E8=A1=A8=E4=B8=AD=E7=9A=84=E8=8A=82?= =?UTF-8?q?=E7=82=B9=20about=20rust?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...55\347\232\204\350\212\202\347\202\271.md" | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git "a/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" "b/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" index 10337a7f2b..3b86ac6f32 100644 --- "a/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" +++ "b/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" @@ -380,5 +380,30 @@ function swapPairs($head) } ``` +Rust: + +```rust +// 虚拟头节点 +impl Solution { + pub fn swap_pairs(head: Option>) -> Option> { + let mut dummy_head = Box::new(ListNode::new(0)); + dummy_head.next = head; + let mut cur = dummy_head.as_mut(); + while let Some(mut node) = cur.next.take() { + if let Some(mut next) = node.next.take() { + node.next = next.next.take(); + next.next = Some(node); + cur.next = Some(next); + cur = cur.next.as_mut().unwrap().next.as_mut().unwrap(); + } else { + cur.next = Some(node); + cur = cur.next.as_mut().unwrap(); + } + } + dummy_head.next + } +} +``` + -----------------------
From 00ad23f45815ca3a371b6beae65da209433708cf Mon Sep 17 00:00:00 2001 From: fw_qaq <82551626+Jack-Zhang-1314@users.noreply.github.com> Date: Sat, 1 Oct 2022 15:23:53 +0800 Subject: [PATCH 1104/3019] =?UTF-8?q?Update=200024.=E4=B8=A4=E4=B8=A4?= =?UTF-8?q?=E4=BA=A4=E6=8D=A2=E9=93=BE=E8=A1=A8=E4=B8=AD=E7=9A=84=E8=8A=82?= =?UTF-8?q?=E7=82=B9.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...55\347\232\204\350\212\202\347\202\271.md" | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git "a/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" "b/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" index 3b86ac6f32..d65d0bca80 100644 --- "a/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" +++ "b/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" @@ -405,5 +405,26 @@ impl Solution { } ``` +```rust +// 递归 +impl Solution { + pub fn swap_pairs(head: Option>) -> Option> { + if head == None || head.as_ref().unwrap().next == None { + return head; + } + + let mut node = head.unwrap(); + + if let Some(mut next) = node.next.take() { + node.next = Solution::swap_pairs(next.next); + next.next = Some(node); + Some(next) + } else { + Some(node) + } + } +} +``` + -----------------------
From c58be464b4ca65d6d396c744dafbc3df984bf206 Mon Sep 17 00:00:00 2001 From: fw_qaq <82551626+Jack-Zhang-1314@users.noreply.github.com> Date: Sat, 1 Oct 2022 16:21:39 +0800 Subject: [PATCH 1105/3019] =?UTF-8?q?update=20[19]=20=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E9=93=BE=E8=A1=A8=E7=9A=84=E5=80=92=E6=95=B0=E7=AC=AC=20N=20?= =?UTF-8?q?=E4=B8=AA=E7=BB=93=E7=82=B9=20about=20rust?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...4N\344\270\252\350\212\202\347\202\271.md" | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git "a/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" "b/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" index a84c0b2928..b9859968c3 100644 --- "a/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" +++ "b/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" @@ -338,5 +338,28 @@ object Solution { } } ``` + +Rust: +```rust +impl Solution { + pub fn remove_nth_from_end(head: Option>, mut n: i32) -> Option> { + let mut dummy_head = Box::new(ListNode::new(0)); + dummy_head.next = head; + let mut fast = &dummy_head.clone(); + let mut slow = &mut dummy_head; + while n > 0 { + fast = fast.next.as_ref().unwrap(); + n -= 1; + } + while fast.next.is_some() { + fast = fast.next.as_ref().unwrap(); + slow = slow.next.as_mut().unwrap(); + } + slow.next = slow.next.as_mut().unwrap().next.take(); + dummy_head.next + } +} +``` + -----------------------
From e4ca3482fbb5202172c6268a10565dfbf116f6fc Mon Sep 17 00:00:00 2001 From: chenzhg <2216468566@qq.com> Date: Sat, 1 Oct 2022 16:25:03 +0800 Subject: [PATCH 1106/3019] =?UTF-8?q?Update=200072.=E7=BC=96=E8=BE=91?= =?UTF-8?q?=E8=B7=9D=E7=A6=BB=20=E6=B7=BB=E5=8A=A0C=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 --- ...26\350\276\221\350\267\235\347\246\273.md" | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git "a/problems/0072.\347\274\226\350\276\221\350\267\235\347\246\273.md" "b/problems/0072.\347\274\226\350\276\221\350\267\235\347\246\273.md" index e40461de78..a15012d75a 100644 --- "a/problems/0072.\347\274\226\350\276\221\350\267\235\347\246\273.md" +++ "b/problems/0072.\347\274\226\350\276\221\350\267\235\347\246\273.md" @@ -362,6 +362,33 @@ function minDistance(word1: string, word2: string): number { }; ``` +C: + +```c +int min(int num1, int num2, int num3) { + return num1 > num2 ? (num2 > num3 ? num3 : num2) : (num1 > num3 ? num3 : num1); +} + +int minDistance(char * word1, char * word2){ + int dp[strlen(word1)+1][strlen(word2)+1]; + dp[0][0] = 0; + for (int i = 1; i <= strlen(word1); i++) dp[i][0] = i; + for (int i = 1; i <= strlen(word2); i++) dp[0][i] = i; + + for (int i = 1; i <= strlen(word1); i++) { + for (int j = 1; j <=strlen(word2); j++) { + if (word1[i-1] == word2[j-1]) { + dp[i][j] = dp[i-1][j-1]; + } + else { + dp[i][j] = min(dp[i-1][j-1], dp[i][j-1], dp[i-1][j]) + 1; + } + } + } + return dp[strlen(word1)][strlen(word2)]; +} +``` + ----------------------- From 3374f8e875cdd0e77bfbc3db03fcaa497029b817 Mon Sep 17 00:00:00 2001 From: ZGQ Date: Sat, 1 Oct 2022 16:35:27 +0800 Subject: [PATCH 1107/3019] =?UTF-8?q?feat:0090.=E5=AD=90=E9=9B=86=E2=85=A1?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0Typescript=E7=9A=84set=E5=8E=BB=E9=87=8D?= =?UTF-8?q?=E7=89=88=E6=9C=AC=E9=A2=98=E8=A7=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "problems/0090.\345\255\220\351\233\206II.md" | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git "a/problems/0090.\345\255\220\351\233\206II.md" "b/problems/0090.\345\255\220\351\233\206II.md" index 9e7e3bd01b..81c0f94a80 100644 --- "a/problems/0090.\345\255\220\351\233\206II.md" +++ "b/problems/0090.\345\255\220\351\233\206II.md" @@ -367,6 +367,39 @@ function subsetsWithDup(nums: number[]): number[][] { }; ``` +set去重版本: +```typescript +// 使用set去重版本 +function subsetsWithDup(nums: number[]): number[][] { + const result: number[][] = []; + const path: number[] = []; + // 去重之前先排序 + nums.sort((a, b) => a - b); + function backTracking(startIndex: number) { + // 收集结果 + result.push([...path]) + // 此处不返回也可以因为,每次递归都会使startIndex + 1,当这个数大到nums.length的时候就不会进入递归了。 + if (startIndex === nums.length) { + return + } + // 定义每一个树层的set集合 + const set: Set = new Set() + for (let i = startIndex; i < nums.length; i++) { + // 去重 + if (set.has(nums[i])) { + continue + } + set.add(nums[i]) + path.push(nums[i]) + backTracking(i + 1) + // 回溯 + path.pop() + } + } + backTracking(0) + return result +}; +``` ### Rust ```Rust From e4ede152f7d21f8ee66135119b9f0318c77bd34c Mon Sep 17 00:00:00 2001 From: chenzhg <2216468566@qq.com> Date: Sat, 1 Oct 2022 16:49:23 +0800 Subject: [PATCH 1108/3019] =?UTF-8?q?Update=200072.=E7=BC=96=E8=BE=91?= =?UTF-8?q?=E8=B7=9D=E7=A6=BB=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 --- ...26\350\276\221\350\267\235\347\246\273.md" | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git "a/problems/0072.\347\274\226\350\276\221\350\267\235\347\246\273.md" "b/problems/0072.\347\274\226\350\276\221\350\267\235\347\246\273.md" index e40461de78..df5d37c2b5 100644 --- "a/problems/0072.\347\274\226\350\276\221\350\267\235\347\246\273.md" +++ "b/problems/0072.\347\274\226\350\276\221\350\267\235\347\246\273.md" @@ -362,7 +362,32 @@ function minDistance(word1: string, word2: string): number { }; ``` +C: +```c +int min(int num1, int num2, int num3) { + return num1 > num2 ? (num2 > num3 ? num3 : num2) : (num1 > num3 ? num3 : num1); +} + +int minDistance(char * word1, char * word2){ + int dp[strlen(word1)+1][strlen(word2)+1]; + dp[0][0] = 0; + for (int i = 1; i <= strlen(word1); i++) dp[i][0] = i; + for (int i = 1; i <= strlen(word2); i++) dp[0][i] = i; + + for (int i = 1; i <= strlen(word1); i++) { + for (int j = 1; j <= strlen(word2); j++) { + if (word1[i-1] == word2[j-1]) { + dp[i][j] = dp[i-1][j-1]; + } + else { + dp[i][j] = min(dp[i-1][j-1], dp[i][j-1], dp[i-1][j]) + 1; + } + } + } + return dp[strlen(word1)][strlen(word2)]; +} +``` -----------------------
From b0ec03922ea2081f0aa72e7fccf8a322aa9a9efb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E5=91=98Carl?= Date: Sun, 2 Oct 2022 10:46:19 +0800 Subject: [PATCH 1109/3019] =?UTF-8?q?Update=200150.=E9=80=86=E6=B3=A2?= =?UTF-8?q?=E5=85=B0=E8=A1=A8=E8=BE=BE=E5=BC=8F=E6=B1=82=E5=80=BC.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 力扣修改了后端测试数据 --- ...50\276\276\345\274\217\346\261\202\345\200\274.md" | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git "a/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" "b/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" index 257bbb9a5b..a0ec5db364 100644 --- "a/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" +++ "b/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" @@ -89,10 +89,7 @@ C++代码如下: class Solution { public: int evalRPN(vector& tokens) { - // 考虑到第20个样例使用int会溢出 - // 此处使用long long来存储number - // 在最后用int()强行转换成int输出 - + // 力扣修改了后台测试数据,需要用longlong stack st; for (int i = 0; i < tokens.size(); i++) { if (tokens[i] == "+" || tokens[i] == "-" || tokens[i] == "*" || tokens[i] == "/") { @@ -105,13 +102,13 @@ public: if (tokens[i] == "*") st.push(num2 * num1); if (tokens[i] == "/") st.push(num2 / num1); } else { - st.push(atoll(tokens[i].c_str())); + st.push(stoll(tokens[i])); } } - long long result = st.top(); + int result = st.top(); st.pop(); // 把栈里最后一个元素弹出(其实不弹出也没事) - return int(result); + return result; } }; From f55786bdb2c01e3618d8b5b5b2d046e0581a5d89 Mon Sep 17 00:00:00 2001 From: Flow-sandyu <72751523+Flow-sandyu@users.noreply.github.com> Date: Sun, 2 Oct 2022 14:24:52 +0800 Subject: [PATCH 1110/3019] =?UTF-8?q?Update=EF=BC=9A=E5=89=91=E6=8C=87Offe?= =?UTF-8?q?r05.=E6=9B=BF=E6=8D=A2=E7=A9=BA=E6=A0=BC.md=20java=E7=89=88?= =?UTF-8?q?=E6=9C=AC=20=E5=8F=98=E9=87=8F=E7=9A=84=E7=B1=BB=E5=9E=8B?= =?UTF-8?q?=E5=92=8C=E5=91=BD=E5=90=8D=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 159 行 StringBuffer str 改成 String s 并把后续的 str 都换成 s 不然原答案是不能AC 的 --- ...3\277\346\215\242\347\251\272\346\240\274.md" | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git "a/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" "b/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" index e1ccc458a4..7a2712ef3b 100644 --- "a/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" +++ "b/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" @@ -156,20 +156,20 @@ char* replaceSpace(char* s){ Java: ```Java //使用一个新的对象,复制 str,复制的过程对其判断,是空格则替换,否则直接复制,类似于数组复制 -public static String replaceSpace(StringBuffer str) { - if (str == null) { +public static String replaceSpace(String s) { + if (s == null) { return null; } - //选用 StringBuilder 单线程使用,比较快,选不选都行 + //选用 StringBuilder 单线程使用,比较快,选不选都行 StringBuilder sb = new StringBuilder(); - //使用 sb 逐个复制 str ,碰到空格则替换,否则直接复制 - for (int i = 0; i < str.length(); i++) { - //str.charAt(i) 为 char 类型,为了比较需要将其转为和 " " 相同的字符串类型 - //if (" ".equals(String.valueOf(str.charAt(i)))){ + //使用 sb 逐个复制 s ,碰到空格则替换,否则直接复制 + for (int i = 0; i < s.length(); i++) { + //s.charAt(i) 为 char 类型,为了比较需要将其转为和 " " 相同的字符串类型 + //if (" ".equals(String.valueOf(s.charAt(i)))){} if (s.charAt(i) == ' ') { sb.append("%20"); } else { - sb.append(str.charAt(i)); + sb.append(s.charAt(i)); } } return sb.toString(); From e9a164add1f9c82318597bfbbc10737f700a8298 Mon Sep 17 00:00:00 2001 From: Flow-sandyu <72751523+Flow-sandyu@users.noreply.github.com> Date: Mon, 3 Oct 2022 17:59:23 +0800 Subject: [PATCH 1111/3019] =?UTF-8?q?update=EF=BC=9A0151.=E7=BF=BB?= =?UTF-8?q?=E8=BD=AC=E5=AD=97=E7=AC=A6=E4=B8=B2=E9=87=8C=E7=9A=84=E5=8D=95?= =?UTF-8?q?=E8=AF=8D.md=20java=20=E7=89=88=E6=9C=AC=EF=BC=8C=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E8=A7=A3=E6=B3=95=E5=9B=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 时间复杂度 O(n) 参考卡哥 c++ 代码的实现:先移除多余空格,再将整个字符串反转,最后把单词逐个反转 --- ...14\347\232\204\345\215\225\350\257\215.md" | 68 +++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git "a/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" "b/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" index a848d6a3b0..5a8f809484 100644 --- "a/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" +++ "b/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" @@ -360,6 +360,74 @@ class Solution { } ``` +```java +/* + * 解法四:时间复杂度 O(n) + * 参考卡哥 c++ 代码的实现:先移除多余空格,再将整个字符串反转,最后把单词逐个反转 + */ +class Solution { + //用 char[] 来实现 String 的 removeExtraSpaces,reverse 操作 + public String reverseWords(String s) { + char[] chars = s.toCharArray(); + //1.去除首尾以及中间多余空格 + chars = removeExtraSpaces(chars); + //2.整个字符串反转 + reverse(chars, 0, chars.length - 1); + //3.单词反转 + reverseEachWord(chars); + return new String(chars); + } + + //1.用 快慢指针 去除首尾以及中间多余空格,可参考数组元素移除的题解 + public char[] removeExtraSpaces(char[] chars) { + int slow = 0; + for (int fast = 0; fast < chars.length; fast++) { + //先用 fast 移除所有空格 + if (chars[fast] != ' ') { + //在用 slow 加空格。 除第一个单词外,单词末尾要加空格 + if (slow != 0) + chars[slow++] = ' '; + //fast 遇到空格或遍历到字符串末尾,就证明遍历完一个单词了 + while (fast < chars.length && chars[fast] != ' ') + chars[slow++] = chars[fast++]; + } + } + //相当于 c++ 里的 resize() + char[] newChars = new char[slow]; + System.arraycopy(chars, 0, newChars, 0, slow); + return newChars; + } + + //双指针实现指定范围内字符串反转,可参考字符串反转题解 + public void reverse(char[] chars, int left, int right) { + if (right >= chars.length) { + System.out.println("set a wrong right"); + return; + } + while (left < right) { + chars[left] ^= chars[right]; + chars[right] ^= chars[left]; + chars[left] ^= chars[right]; + left++; + right--; + } + } + + //3.单词反转 + public void reverseEachWord(char[] chars) { + int start = 0; + //end <= s.length() 这里的 = ,是为了让 end 永远指向单词末尾后一个位置,这样 reverse 的实参更好设置 + for (int end = 0; end <= chars.length; end++) { + // end 每次到单词末尾后的空格或串尾,开始反转单词 + if (end == chars.length || chars[end] == ' ') { + reverse(chars, start, end - 1); + start = end + 1; + } + } + } +} +``` + python: ```Python From 42d72e2a313cc0409b183923c1d3d8d9bcc38fdf Mon Sep 17 00:00:00 2001 From: Flow-sandyu <72751523+Flow-sandyu@users.noreply.github.com> Date: Mon, 3 Oct 2022 18:14:34 +0800 Subject: [PATCH 1112/3019] =?UTF-8?q?update=EF=BC=9A0151.=E7=BF=BB?= =?UTF-8?q?=E8=BD=AC=E5=AD=97=E7=AC=A6=E4=B8=B2=E9=87=8C=E7=9A=84=E5=8D=95?= =?UTF-8?q?=E8=AF=8D.md=20java=20=E7=89=88=E6=9C=AC=EF=BC=8C=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E8=A7=A3=E6=B3=95=E5=9B=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 时间复杂度 O(n) 参考卡哥 c++ 代码的实现:先移除多余空格,再将整个字符串反转,最后把单词逐个反转 有别于解法一 :没有用 StringBuilder 实现,而是对 String 的 char[] 数组操作来实现以上三个步骤 --- ...270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git "a/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" "b/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" index 5a8f809484..be35c2f22b 100644 --- "a/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" +++ "b/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" @@ -363,7 +363,8 @@ class Solution { ```java /* * 解法四:时间复杂度 O(n) - * 参考卡哥 c++ 代码的实现:先移除多余空格,再将整个字符串反转,最后把单词逐个反转 + * 参考卡哥 c++ 代码的三步骤:先移除多余空格,再将整个字符串反转,最后把单词逐个反转 + * 有别于解法一 :没有用 StringBuilder 实现,而是对 String 的 char[] 数组操作来实现以上三个步骤 */ class Solution { //用 char[] 来实现 String 的 removeExtraSpaces,reverse 操作 From b24e3f04ac05798947ac1bd580c7a094c3353e19 Mon Sep 17 00:00:00 2001 From: Flow-sandyu <72751523+Flow-sandyu@users.noreply.github.com> Date: Mon, 3 Oct 2022 19:37:53 +0800 Subject: [PATCH 1113/3019] =?UTF-8?q?update=EF=BC=9A=E5=89=91=E6=8C=87Offe?= =?UTF-8?q?r58-II.=E5=B7=A6=E6=97=8B=E8=BD=AC=E5=AD=97=E7=AC=A6=E4=B8=B2.m?= =?UTF-8?q?d?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 解法二:空间复杂度:O(1)。用原始数组来进行反转操作 思路:先整个字符串反转,再反转前面的,最后反转后面 n 个 --- ...54\345\255\227\347\254\246\344\270\262.md" | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git "a/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" "b/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" index bf5d3f901c..b14c26cc86 100644 --- "a/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" @@ -115,6 +115,29 @@ class Solution { } ``` +```java +//解法二:空间复杂度:O(1)。用原始数组来进行反转操作 +//思路为:先整个字符串反转,再反转前面的,最后反转后面 n 个 +class Solution { + public String reverseLeftWords(String s, int n) { + char[] chars = s.toCharArray(); + reverse(chars, 0, chars.length - 1); + reverse(chars, 0, chars.length - 1 - n); + reverse(chars, chars.length - n, chars.length - 1); + return new String(chars); + } + + public void reverse(char[] chars, int left, int right) { + while (left < right) { + chars[left] ^= chars[right]; + chars[right] ^= chars[left]; + chars[left] ^= chars[right]; + left++; + right--; + } + } +``` + python: ```python From f86b17a1f09915988a2a6dda54f4b8a9b1d5dca7 Mon Sep 17 00:00:00 2001 From: Flow-sandyu <72751523+Flow-sandyu@users.noreply.github.com> Date: Tue, 4 Oct 2022 21:40:54 +0800 Subject: [PATCH 1114/3019] =?UTF-8?q?update=EF=BC=9A=E5=8F=8C=E6=8C=87?= =?UTF-8?q?=E9=92=88=E6=80=BB=E7=BB=93.md=20=E6=9B=B4=E6=94=B9=E9=94=99?= =?UTF-8?q?=E5=AD=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 更改错字 --- ...\217\214\346\214\207\351\222\210\346\200\273\347\273\223.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/\345\217\214\346\214\207\351\222\210\346\200\273\347\273\223.md" "b/problems/\345\217\214\346\214\207\351\222\210\346\200\273\347\273\223.md" index 06752cacb0..5abcec53da 100644 --- "a/problems/\345\217\214\346\214\207\351\222\210\346\200\273\347\273\223.md" +++ "b/problems/\345\217\214\346\214\207\351\222\210\346\200\273\347\273\223.md" @@ -42,7 +42,7 @@ for (int i = 0; i < array.size(); i++) { **其实很多数组(字符串)填充类的问题,都可以先预先给数组扩容带填充后的大小,然后在从后向前进行操作。** -那么在[字符串:花式反转还不够!](https://programmercarl.com/0151.翻转字符串里的单词.html)中,我们使用双指针法,用O(n)的时间复杂度完成字符串删除类的操作,因为题目要产出冗余空格。 +那么在[字符串:花式反转还不够!](https://programmercarl.com/0151.翻转字符串里的单词.html)中,我们使用双指针法,用O(n)的时间复杂度完成字符串删除类的操作,因为题目要删除冗余空格。 **在删除冗余空格的过程中,如果不注意代码效率,很容易写成了O(n^2)的时间复杂度。其实使用双指针法O(n)就可以搞定。** From 680cf3dbd74d4266d1a077c493d0c440fd6bebfb Mon Sep 17 00:00:00 2001 From: Flow-sandyu <72751523+Flow-sandyu@users.noreply.github.com> Date: Wed, 5 Oct 2022 10:12:19 +0800 Subject: [PATCH 1115/3019] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=200225.=E7=94=A8?= =?UTF-8?q?=E9=98=9F=E5=88=97=E5=AE=9E=E7=8E=B0=E6=A0=88.md=20java=20?= =?UTF-8?q?=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 优化,使用一个 Queue 实现 对比 『使用一个 Deque 实现』 的解法,我把移动元素的代码放到 push 方法里,代码看起来更简洁 --- ...27\345\256\236\347\216\260\346\240\210.md" | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git "a/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" "b/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" index fb2851f14c..4412a8199c 100644 --- "a/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" +++ "b/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" @@ -292,6 +292,40 @@ class MyStack { } ``` +优化,使用一个 Queue 实现 +```java +class MyStack { + + Queue queue; + + public MyStack() { + queue = new LinkedList<>(); + } + + //每 offer 一个数(A)进来,都重新排列,把这个数(A)放到队列的队首 + public void push(int x) { + queue.offer(x); + int size = queue.size(); + //移动除了 A 的其它数 + while (size-- > 1) + queue.offer(queue.poll()); + } + + public int pop() { + return queue.poll(); + } + + public int top() { + return queue.peek(); + } + + public boolean empty() { + return queue.isEmpty(); + } +} + +``` + Python: ```python From 6476576fa7d88790ad881daecc05303a82913058 Mon Sep 17 00:00:00 2001 From: wyzzoo Date: Thu, 6 Oct 2022 00:17:27 +0800 Subject: [PATCH 1116/3019] =?UTF-8?q?Update=200019.=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E9=93=BE=E8=A1=A8=E7=9A=84=E5=80=92=E6=95=B0=E7=AC=ACN?= =?UTF-8?q?=E4=B8=AA=E8=8A=82=E7=82=B9.md=EF=BC=8C=E4=BF=AE=E5=A4=8D=20CPP?= =?UTF-8?q?=20=E8=A7=A3=E6=B3=95=E4=BB=A3=E7=A0=81=E4=B8=AD=E7=9A=84?= =?UTF-8?q?=E5=86=85=E5=AD=98=E6=B3=84=E6=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...260\347\254\254N\344\270\252\350\212\202\347\202\271.md" | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git "a/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" "b/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" index a84c0b2928..a37ef1d304 100644 --- "a/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" +++ "b/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" @@ -75,7 +75,11 @@ public: fast = fast->next; slow = slow->next; } - slow->next = slow->next->next; + + ListNode *nth = slow->next; + slow->next = nth->next; + delete nth; + return dummyHead->next; } }; From 1889a033c3b6754bdaafecf9ab6665deda1bee19 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E6=98=82=E8=AC=99?= Date: Fri, 7 Oct 2022 11:18:22 +0800 Subject: [PATCH 1117/3019] =?UTF-8?q?add=20001.=E5=85=A9=E6=95=B8=E4=B9=8B?= =?UTF-8?q?=E5=92=8C=20C=E8=AA=9E=E8=A8=80(=E4=BD=BF=E7=94=A8=20leetcode?= =?UTF-8?q?=20=E6=94=AF=E6=8F=B4=E4=B9=8B=20ut=5Fhash=20=E5=87=BD=E5=BC=8F?= =?UTF-8?q?=E5=BA=AB)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...44\346\225\260\344\271\213\345\222\214.md" | 81 +++++++++++++++++++ 1 file changed, 81 insertions(+) diff --git "a/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" "b/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" index 5bedd0a0af..bc618c1506 100644 --- "a/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" @@ -352,5 +352,86 @@ List twoSum(List nums, int target) { } ``` +C: +```c + + +/** + * Note: The returned array must be malloced, assume caller calls free(). + */ + +// leetcode 支持 ut_hash 函式庫 + + typedef struct { + int key; + int value; + UT_hash_handle hh; // make this structure hashable + } map; + +map* hashMap = NULL; + + void hashMapAdd(int key, int value){ + map* s; + // key already in the hash? + HASH_FIND_INT(hashMap, &key, s); + if(s == NULL){ + s = (map*)malloc(sizeof(map)); + s -> key = key; + HASH_ADD_INT(hashMap, key, s); + } + s -> value = value; + } + +map* hashMapFind(int key){ + map* s; + // *s: output pointer + HASH_FIND_INT(hashMap, &key, s); + return s; + } + + void hashMapCleanup(){ + map* cur, *tmp; + HASH_ITER(hh, hashMap, cur, tmp){ + HASH_DEL(hashMap, cur); + free(cur); + } + } + + void hashPrint(){ + map* s; + for(s = hashMap; s != NULL; s=(map*)(s -> hh.next)){ + printf("key %d, value %d\n", s -> key, s -> value); + } + } + + +int* twoSum(int* nums, int numsSize, int target, int* returnSize){ + int i, *ans; + // hash find result + map* hashMapRes; + hashMap = NULL; + ans = malloc(sizeof(int) * 2); + + for(i = 0; i < numsSize; i++){ + // key 代表 nums[i] 的值,value 代表所在 index; + hashMapAdd(nums[i], i); + } + + hashPrint(); + + for(i = 0; i < numsSize; i++){ + hashMapRes = hashMapFind(target - nums[i]); + if(hashMapRes && hashMapRes -> value != i){ + ans[0] = i; + ans[1] = hashMapRes -> value ; + *returnSize = 2; + return ans; + } + } + + hashMapCleanup(); + return NULL; +} +``` -----------------------
From 3223112124c71c21fef1354a451b12a64c118f7d Mon Sep 17 00:00:00 2001 From: KiloG <33695125+JOJO0527@users.noreply.github.com> Date: Fri, 7 Oct 2022 21:26:39 +0800 Subject: [PATCH 1118/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0Go=E7=9A=84?= =?UTF-8?q?=E5=8F=A6=E5=A4=96=E4=B8=80=E7=A7=8D=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 可以将题目转化为“求装满背包s的前几位字符的方式有几种”, 然后判断最后dp[len(s)]是否大于0就可。 --- ...15\225\350\257\215\346\213\206\345\210\206.md" | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git "a/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" "b/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" index d60fd46cf3..5226502ac4 100644 --- "a/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" +++ "b/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" @@ -344,6 +344,21 @@ func wordBreak(s string,wordDict []string) bool { } return dp[len(s)] } +// 转化为 求装满背包s的前几位字符的方式有几种 +func wordBreak(s string, wordDict []string) bool { + // 装满背包s的前几位字符的方式有几种 + dp := make([]int, len(s)+1) + dp[0] = 1 + for i := 0; i <= len(s); i++ { // 背包 + for j := 0; j < len(wordDict); j++ { // 物品 + if i >= len(wordDict[j]) && wordDict[j] == s[i-len(wordDict[j]):i] { + dp[i] += dp[i-len(wordDict[j])] + } + } + } + + return dp[len(s)] > 0 +} ``` Javascript: From a918d6fa07f4c5d0b3247b242ef30a3aacdff5fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=A7=E6=9E=97=E7=A8=8B=E5=BA=8F=E5=91=98?= Date: Sat, 8 Oct 2022 11:45:40 +0800 Subject: [PATCH 1119/3019] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dpython=E5=9C=A8md?= =?UTF-8?q?=E4=B8=AD=E7=9A=84=E8=AF=AD=E6=B3=95=E9=AB=98=E4=BA=AE&?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E6=A0=BC=E5=BC=8F=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...04\345\255\220\346\225\260\347\273\204.md" | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git "a/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" "b/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" index 2a0187369c..0bcd31e592 100644 --- "a/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" +++ "b/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" @@ -181,23 +181,23 @@ class Solution: index += 1 return 0 if res==float("inf") else res ``` -```python3 -#滑动窗口 +```python +# 滑动窗口 class Solution: def minSubArrayLen(self, target: int, nums: List[int]) -> int: - if nums is None or len(nums)==0: + if nums is None or len(nums) == 0: return 0 - lenf=len(nums)+1 - total=0 - i=j=0 - while (j=target): - lenf=min(lenf,j-i) - total=total-nums[i] - i+=1 - if lenf==len(nums)+1: + lenf = len(nums) + 1 + total = 0 + i = j = 0 + while (j < len(nums)): + total = total + nums[j] + j += 1 + while (total >= target): + lenf = min(lenf, j - i) + total = total - nums[i] + i += 1 + if lenf == len(nums) + 1: return 0 else: return lenf From b656e6032e85cc18970e0ad521e5798b67c03b51 Mon Sep 17 00:00:00 2001 From: Liu YongLiang <41845017+tlylt@users.noreply.github.com> Date: Sun, 9 Oct 2022 09:14:47 +0800 Subject: [PATCH 1120/3019] =?UTF-8?q?Update=201049.=E6=9C=80=E5=90=8E?= =?UTF-8?q?=E4=B8=80=E5=9D=97=E7=9F=B3=E5=A4=B4=E7=9A=84=E9=87=8D=E9=87=8F?= =?UTF-8?q?II.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...37\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" "b/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" index b6a674aa5d..728ae83e82 100644 --- "a/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" +++ "b/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" @@ -43,7 +43,7 @@ 是不是感觉和昨天讲解的[416. 分割等和子集](https://programmercarl.com/0416.分割等和子集.html)非常像了。 -本题物品的重量为store[i],物品的价值也为store[i]。 +本题物品的重量为stones[i],物品的价值也为stones[i]。 对应着01背包里的物品重量weight[i]和 物品价值value[i]。 From fe1eaeff4e10f6533a41539bf0e99f32021f1cc3 Mon Sep 17 00:00:00 2001 From: freshield Date: Tue, 11 Oct 2022 19:56:58 +0800 Subject: [PATCH 1121/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0python3=E7=9A=84?= =?UTF-8?q?=E7=94=A8=E4=BE=8B=EF=BC=8C=E6=9B=BF=E6=8D=A2list=E4=B8=BAdeque?= =?UTF-8?q?=EF=BC=8C=E5=A6=82=E6=9E=9C=E7=94=A8list=E4=BC=9A=E8=B6=85?= =?UTF-8?q?=E6=97=B6=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...7\345\217\243\346\234\200\345\244\247\345\200\274.md" | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git "a/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" "b/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" index 3f402f1203..b86fdd1542 100644 --- "a/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" +++ "b/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" @@ -296,16 +296,19 @@ class Solution { ``` Python: -```python +```python3 +from collections import deque + + class MyQueue: #单调队列(从大到小 def __init__(self): - self.queue = [] #使用list来实现单调队列 + self.queue = deque() #这里需要使用deque实现单调队列,直接使用list会超时 #每次弹出的时候,比较当前要弹出的数值是否等于队列出口元素的数值,如果相等则弹出。 #同时pop之前判断队列当前是否为空。 def pop(self, value): if self.queue and value == self.queue[0]: - self.queue.pop(0)#list.pop()时间复杂度为O(n),这里可以使用collections.deque() + self.queue.popleft()#list.pop()时间复杂度为O(n),这里需要使用collections.deque() #如果push的数值大于入口元素的数值,那么就将队列后端的数值弹出,直到push的数值小于等于队列入口元素的数值为止。 #这样就保持了队列里的数值是单调从大到小的了。 From b17f747202cffed777cafb9c31db771e8142dd93 Mon Sep 17 00:00:00 2001 From: baozi Date: Tue, 11 Oct 2022 22:20:09 +0800 Subject: [PATCH 1122/3019] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E9=94=99=E5=88=AB?= =?UTF-8?q?=E5=AD=97=20=E6=94=B6=E7=9B=8A--=E5=8F=97=E7=9B=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 3dbf2c0d87..fb3d625c6f 100644 --- a/README.md +++ b/README.md @@ -81,7 +81,7 @@ 我在题目讲解中统一使用C++,但你会发现下面几乎每篇题解都配有其他语言版本,Java、Python、Go、JavaScript等等,正是这些[热心小伙们](https://github.com/youngyangyang04/leetcode-master/graphs/contributors)的贡献的代码,当然我也会严格把控代码质量。 -**所以也欢迎大家参与进来,完善题解的各个语言版本,拥抱开源,让更多小伙伴们收益**。 +**所以也欢迎大家参与进来,完善题解的各个语言版本,拥抱开源,让更多小伙伴们受益**。 准备好了么,刷题攻略开始咯,go go go! From 35b28d376820dbc014010e8898430a46213e27e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E5=91=98Carl?= Date: Wed, 12 Oct 2022 12:32:40 +0800 Subject: [PATCH 1123/3019] =?UTF-8?q?Update=200019.=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E9=93=BE=E8=A1=A8=E7=9A=84=E5=80=92=E6=95=B0=E7=AC=ACN?= =?UTF-8?q?=E4=B8=AA=E8=8A=82=E7=82=B9.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...60\347\254\254N\344\270\252\350\212\202\347\202\271.md" | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git "a/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" "b/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" index a37ef1d304..18d4a057cb 100644 --- "a/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" +++ "b/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" @@ -75,10 +75,11 @@ public: fast = fast->next; slow = slow->next; } + slow->next = slow->next->next; - ListNode *nth = slow->next; - slow->next = nth->next; - delete nth; + // ListNode *tmp = slow->next; C++释放内存的逻辑 + // slow->next = tmp->next; + // delete nth; return dummyHead->next; } From 12eb9158c3b1e7148add297d289176d4543cfb15 Mon Sep 17 00:00:00 2001 From: roylx <73628821+roylx@users.noreply.github.com> Date: Wed, 12 Oct 2022 10:19:54 -0600 Subject: [PATCH 1124/3019] =?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 0701.二叉搜索树中的插入操作.md python3 迭代法优化 --- ...2\204\346\217\222\345\205\245\346\223\215\344\275\234.md" | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git "a/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" "b/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" index 06e1c88f4a..599dd0735a 100644 --- "a/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" +++ "b/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" @@ -337,16 +337,15 @@ class Solution: def insertIntoBST(self, root: TreeNode, val: int) -> TreeNode: if not root: return TreeNode(val) - parent = None + parent = None # 此步可以省略 cur = root # 用while循环不断地找新节点的parent while cur: + parent = cur # 首先保存当前非空节点作为下一次迭代的父节点 if cur.val < val: - parent = cur cur = cur.right elif cur.val > val: - parent = cur cur = cur.left # 运行到这意味着已经跳出上面的while循环, From 4671287dd3494c3b2d7592450e1c7c92f13d0504 Mon Sep 17 00:00:00 2001 From: jinzhongjia Date: Thu, 13 Oct 2022 00:34:44 +0800 Subject: [PATCH 1125/3019] =?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=EF=BC=8C=E5=A2=9E=E5=8A=A0goland=E7=9A=84=E5=8D=95=E8=B0=83?= =?UTF-8?q?=E6=A0=88=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...47\347\232\204\347\237\251\345\275\242.md" | 39 ++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git "a/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" "b/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" index e085e455cf..144b402794 100644 --- "a/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" +++ "b/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" @@ -409,7 +409,44 @@ class Solution: ``` -***** + +Go: + +> 单调栈 + +```go +func largestRectangleArea(heights []int) int { + // 声明max并初始化为0 + max := 0 + // 使用切片实现栈 + stack := make([]int, 0) + // 数组头部加入0 + heights = append([]int{0}, heights...) + // 数组尾部加入0 + heights = append(heights, 0) + // 初始化栈,序号从0开始 + stack = append(stack, 0) + for i := 1; i < len(heights); i++ { + // 结束循环条件为:当即将入栈元素>top元素,也就是形成非单调递增的趋势 + for heights[stack[len(stack)-1]] > heights[i] { + // mid 是top + mid := stack[len(stack)-1] + // 出栈 + stack = stack[0 : len(stack)-1] + // left是top的下一位元素,i是将要入栈的元素 + left := stack[len(stack)-1] + // 高度x宽度 + tmp := heights[mid] * (i - left - 1) + if tmp > max { + max = tmp + } + } + stack = append(stack, i) + } + return max +} + +``` JavaScript: ```javascript From f6db9d06e23986ea946d5108e2a921d261f1ef91 Mon Sep 17 00:00:00 2001 From: roylx <73628821+roylx@users.noreply.github.com> Date: Wed, 12 Oct 2022 10:34:56 -0600 Subject: [PATCH 1126/3019] =?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 0701.二叉搜索树中的插入操作.md Python3 **递归法** - 无返回值 有注释 不用Helper function --- ...22\345\205\245\346\223\215\344\275\234.md" | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git "a/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" "b/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" index 599dd0735a..6a78b2b4ed 100644 --- "a/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" +++ "b/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" @@ -330,6 +330,27 @@ class Solution: return root ``` +**递归法** - 无返回值 有注释 不用Helper function +``` +class Solution: + last = None + def insertIntoBST(self, root: Optional[TreeNode], val: int) -> Optional[TreeNode]: + if not root: # for root==None + return TreeNode(val) + if root.valval: + if root.left==None: # found the parent + root.left = TreeNode(val) + else: # not found, keep searching + self.insertIntoBST(root.left, val) + # return the final tree + return root +``` + **迭代法** 与无返回值的递归函数的思路大体一致 ```python From abb348dbc4dc6f0081ae313c23c1e3a408dfd818 Mon Sep 17 00:00:00 2001 From: roylx <73628821+roylx@users.noreply.github.com> Date: Wed, 12 Oct 2022 10:38:50 -0600 Subject: [PATCH 1127/3019] =?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 0701.二叉搜索树中的插入操作.md Python3 **递归法** - 无返回值 有注释 不用Helper function - 删掉无用变量 增加python标志 --- ...232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git "a/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" "b/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" index 6a78b2b4ed..a6f932b051 100644 --- "a/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" +++ "b/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" @@ -331,9 +331,8 @@ class Solution: ``` **递归法** - 无返回值 有注释 不用Helper function -``` +```python class Solution: - last = None def insertIntoBST(self, root: Optional[TreeNode], val: int) -> Optional[TreeNode]: if not root: # for root==None return TreeNode(val) From bd77b3bb63445b8ab09d47a95ab7e4e07433b307 Mon Sep 17 00:00:00 2001 From: roylx <73628821+roylx@users.noreply.github.com> Date: Wed, 12 Oct 2022 14:07:50 -0600 Subject: [PATCH 1128/3019] =?UTF-8?q?Update=200450.=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=90=9C=E7=B4=A2=E6=A0=91=E4=B8=AD=E7=9A=84?= =?UTF-8?q?=E8=8A=82=E7=82=B9.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 0450.删除二叉搜索树中的节点.md 添加python3迭代法 --- ...55\347\232\204\350\212\202\347\202\271.md" | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git "a/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" "b/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" index 2d6d4ef2c6..541c8be4a6 100644 --- "a/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" +++ "b/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" @@ -344,6 +344,48 @@ class Solution: return root ``` +**迭代法** +```python +class Solution: + def deleteNode(self, root: Optional[TreeNode], key: int) -> Optional[TreeNode]: + # 找到节点后分两步,1. 把节点的左子树和右子树连起来,2. 把右子树跟父节点连起来 + # root is None + if not root: return root + p = root + last = None + while p: + if p.val==key: + # 1. connect left to right + # right is not None -> left is None | left is not None + if p.right: + if p.left: + node = p.right + while node.left: + node = node.left + node.left = p.left + right = p.right + else: + # right is None -> right=left + right = p.left + # 2. connect right to last + if last==None: + root = right + elif last.val>key: + last.left = right + else: + last.right = right + # 3. return + break + else: + # Update last and continue + last = p + if p.val>key: + p = p.left + else: + p = p.right + return root +``` + ## Go ```Go // 递归版本 From 3947eeaab9d868fbe4665629a1792c1c9cd3a593 Mon Sep 17 00:00:00 2001 From: L1Y1 <108316255+L1Y1@users.noreply.github.com> Date: Thu, 13 Oct 2022 17:00:01 +0800 Subject: [PATCH 1129/3019] =?UTF-8?q?Update=200235.=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=90=9C=E7=B4=A2=E6=A0=91=E7=9A=84=E6=9C=80=E8=BF=91=E5=85=AC?= =?UTF-8?q?=E5=85=B1=E7=A5=96=E5=85=88.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 可以写的更通俗易懂一些 --- ...\221\345\205\254\345\205\261\347\245\226\345\205\210.md" | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git "a/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" "b/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" index 07e55ba580..a8c94ec9f9 100644 --- "a/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" +++ "b/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" @@ -328,13 +328,11 @@ var lowestCommonAncestor = function(root, p, q) { } if(root.val>p.val&&root.val>q.val) { // 向左子树查询 - let left = lowestCommonAncestor(root.left,p,q); - return left !== null&&left; + return root.left = lowestCommonAncestor(root.left,p,q); } if(root.val Date: Sat, 15 Oct 2022 16:27:34 +0800 Subject: [PATCH 1130/3019] Update --- README.md | 33 +++++----------- "problems/0077.\347\273\204\345\220\210.md" | 10 +++-- ...04\345\220\210\344\274\230\345\214\226.md" | 10 +++-- ...11\346\220\234\347\264\242\346\240\221.md" | 5 +++ ...11\346\220\234\347\264\242\346\240\221.md" | 12 +++++- ...76\345\274\217\346\261\202\345\200\274.md" | 10 ++--- ...345\220\210\346\200\273\345\222\214III.md" | 39 ++++++++++++++----- ...54\345\205\261\347\245\226\345\205\210.md" | 5 +++ ...55\347\232\204\344\274\227\346\225\260.md" | 5 +++ ...17\347\273\235\345\257\271\345\267\256.md" | 5 +++ ...72\347\264\257\345\212\240\346\240\221.md" | 4 +- ...14\345\210\206\346\237\245\346\211\276.md" | 20 +++++----- 12 files changed, 100 insertions(+), 58 deletions(-) diff --git a/README.md b/README.md index 3dbf2c0d87..02d004e9e2 100644 --- a/README.md +++ b/README.md @@ -3,35 +3,22 @@ 👉 推荐 [Gitee同步](https://gitee.com/programmercarl/leetcode-master) > 1. **介绍**:本项目是一套完整的刷题计划,旨在帮助大家少走弯路,循序渐进学算法,[关注作者](#关于作者) -> 2. **PDF版本** : [「代码随想录」算法精讲 PDF 版本](https://programmercarl.com/other/algo_pdf.html) 。 -> 3. **算法公开课** : [《代码随想录》算法视频公开课](https://www.bilibili.com/video/BV1fA4y1o715) 。 -> 4. **最强八股文:**:[代码随想录知识星球精华PDF](https://www.programmercarl.com/other/kstar_baguwen.html) -> 5. **刷题顺序** : README已经将刷题顺序排好了,按照顺序一道一道刷就可以。 -> 6. **学习社区** : 一起学习打卡/面试技巧/如何选择offer/大厂内推/职场规则/简历修改/技术分享/程序人生。欢迎加入[「代码随想录」知识星球](https://programmercarl.com/other/kstar.html) 。 -> 7. **提交代码**:本项目统一使用C++语言进行讲解,但已经有Java、Python、Go、JavaScript等等多语言版本,感谢[这里的每一位贡献者](https://github.com/youngyangyang04/leetcode-master/graphs/contributors),如果你也想贡献代码点亮你的头像,[点击这里](https://mp.weixin.qq.com/s/tqCxrMEU-ajQumL1i8im9A)了解提交代码的方式。 -> 8. **转载须知** :以下所有文章皆为我([程序员Carl](https://github.com/youngyangyang04))的原创。引用本项目文章请注明出处,发现恶意抄袭或搬运,会动用法律武器维护自己的权益。让我们一起维护一个良好的技术创作环境! +> 2. **正式出版** :[《代码随想录》](https://programmercarl.com/other/publish.html) 。 +> 3. **PDF版本** : [「代码随想录」算法精讲 PDF 版本](https://programmercarl.com/other/algo_pdf.html) 。 +> 4. **算法公开课** : [《代码随想录》算法视频公开课](https://www.bilibili.com/video/BV1fA4y1o715) 。 +> 5. **最强八股文:**:[代码随想录知识星球精华PDF](https://www.programmercarl.com/other/kstar_baguwen.html) +> 6. **刷题顺序** : README已经将刷题顺序排好了,按照顺序一道一道刷就可以。 +> 7. **学习社区** : 一起学习打卡/面试技巧/如何选择offer/大厂内推/职场规则/简历修改/技术分享/程序人生。欢迎加入[「代码随想录」知识星球](https://programmercarl.com/other/kstar.html) 。 +> 8. **提交代码**:本项目统一使用C++语言进行讲解,但已经有Java、Python、Go、JavaScript等等多语言版本,感谢[这里的每一位贡献者](https://github.com/youngyangyang04/leetcode-master/graphs/contributors),如果你也想贡献代码点亮你的头像,[点击这里](https://mp.weixin.qq.com/s/tqCxrMEU-ajQumL1i8im9A)了解提交代码的方式。 +> 9. **转载须知** :以下所有文章皆为我([程序员Carl](https://github.com/youngyangyang04))的原创。引用本项目文章请注明出处,发现恶意抄袭或搬运,会动用法律武器维护自己的权益。让我们一起维护一个良好的技术创作环境! -

- - -

- - - - -

- -

《代码随想录》正式出版啦!!录友专属福利,点击下方可以享五折优惠!详细可以点击这里

- -

- - + +

- # LeetCode 刷题攻略 ## 刷题攻略的背景 diff --git "a/problems/0077.\347\273\204\345\220\210.md" "b/problems/0077.\347\273\204\345\220\210.md" index 9c473bdd12..4ce58d3352 100644 --- "a/problems/0077.\347\273\204\345\220\210.md" +++ "b/problems/0077.\347\273\204\345\220\210.md" @@ -25,9 +25,13 @@ [1,4], ] -也可以直接看我的B站视频:[带你学透回溯算法-组合问题(对应力扣题目:77.组合)](https://www.bilibili.com/video/BV1ti4y1L7cv#reply3733925949) +# 算法公开课 -## 思路 + +**《代码随想录》算法视频公开课:[带你学透回溯算法-组合问题(对应力扣题目:77.组合)](https://www.bilibili.com/video/BV1ti4y1L7cv),[组合问题的剪枝操作](https://www.bilibili.com/video/BV1wi4y157er),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 + + +# 思路 本题这是回溯法的经典题目。 @@ -122,7 +126,7 @@ vector path; // 用来存放符合条件结果 为什么要有这个startIndex呢? -**每次从集合中选取元素,可选择的范围随着选择的进行而收缩,调整可选择的范围,就是要靠startIndex**。 +**建议在[77.组合视频讲解](https://www.bilibili.com/video/BV1ti4y1L7cv)中,07:36的时候开始听,startIndex 就是防止出现重复的组合**。 从下图中红线部分可以看出,在集合[1,2,3,4]取1之后,下一层递归,就要在[2,3,4]中取数了,那么下一层递归如何知道从[2,3,4]中取数呢,靠的就是startIndex。 diff --git "a/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" "b/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" index b8b5f3c12d..c8a5837d9a 100644 --- "a/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" +++ "b/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" @@ -6,12 +6,12 @@ +# 77.组合优化 +**《代码随想录》算法视频公开课:[组合问题的剪枝操作](https://www.bilibili.com/video/BV1wi4y157er),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 在[回溯算法:求组合问题!](https://programmercarl.com/0077.组合.html)中,我们通过回溯搜索法,解决了n个数中求k个数的组合问题。 -> 可以直接看我的B栈视频讲解:[带你学透回溯算法-组合问题的剪枝操作](https://www.bilibili.com/video/BV1wi4y157er) - 文中的回溯法是可以剪枝优化的,本篇我们继续来看一下题目77. 组合。 链接:https://leetcode.cn/problems/combinations/ @@ -84,9 +84,11 @@ for (int i = startIndex; i <= n; i++) { 1. 已经选择的元素个数:path.size(); -2. 还需要的元素个数为: k - path.size(); +2. 所需需要的元素个数为: k - path.size(); + +3. 列表中剩余元素(n-i) >= 所需需要的元素个数(k - path.size()) -3. 在集合n中至多要从该起始位置 : n - (k - path.size()) + 1,开始遍历 +4. 在集合n中至多要从该起始位置 : i <= n - (k - path.size()) + 1,开始遍历 为什么有个+1呢,因为包括起始位置,我们要是一个左闭的集合。 diff --git "a/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" index 727144d551..5deaed5234 100644 --- "a/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" +++ "b/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" @@ -20,6 +20,11 @@ ![98.验证二叉搜索树](https://img-blog.csdnimg.cn/20210203144334501.png) +# 视频讲解 + +**《代码随想录》算法视频公开课:[你对二叉搜索树了解的还不够! | LeetCode:98.验证二叉搜索树](https://www.bilibili.com/video/BV18P411n7Q4),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 + + # 思路 要知道中序遍历下,输出的二叉搜索树节点的数值是有序序列。 diff --git "a/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" index b5f322f006..f9f8a4ff24 100644 --- "a/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" +++ "b/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" @@ -31,9 +31,17 @@ 进入正题: -题目中说要转换为一棵高度平衡二叉搜索树。这和转换为一棵普通二叉搜索树有什么差别呢? +题目中说要转换为一棵高度平衡二叉搜索树。为什么强调要平衡呢? -其实这里不用强调平衡二叉搜索树,数组构造二叉树,构成平衡树是自然而然的事情,因为大家默认都是从数组中间位置取值作为节点元素,一般不会随机取,**所以想构成不平衡的二叉树是自找麻烦**。 +因为只要给我们一个有序数组,如果强调平衡,都可以以线性结构来构造二叉搜索树。 + +例如 有序数组[-10,-3,0,5,9] 可以就可以构造成这样的二叉搜索树,如图。 + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20220930173553.png) + +上图中,是符合二叉搜索树的特性吧,如果要这么做的话,是不是本题意义就不大了,所以才强调是平衡二叉搜索树。 + +其实数组构造二叉树,构成平衡树是自然而然的事情,因为大家默认都是从数组中间位置取值作为节点元素,一般不会随机取。**所以想构成不平衡的二叉树是自找麻烦**。 在[二叉树:构造二叉树登场!](https://programmercarl.com/0106.从中序与后序遍历序列构造二叉树.html)和[二叉树:构造一棵最大的二叉树](https://programmercarl.com/0654.最大二叉树.html)中其实已经讲过了,如果根据数组构造一棵二叉树。 diff --git "a/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" "b/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" index 13b2ba46bd..306af14b42 100644 --- "a/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" +++ "b/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" @@ -89,19 +89,19 @@ C++代码如下: class Solution { public: int evalRPN(vector& tokens) { - stack st; + stack st; for (int i = 0; i < tokens.size(); i++) { if (tokens[i] == "+" || tokens[i] == "-" || tokens[i] == "*" || tokens[i] == "/") { - int num1 = st.top(); + long long num1 = st.top(); st.pop(); - int num2 = st.top(); + long long num2 = st.top(); st.pop(); if (tokens[i] == "+") st.push(num2 + num1); if (tokens[i] == "-") st.push(num2 - num1); - if (tokens[i] == "*") st.push((long)num2 * (long)num1); //力扣改了后台测试数据 + if (tokens[i] == "*") st.push(num2 * num1); if (tokens[i] == "/") st.push(num2 / num1); } else { - st.push(stoi(tokens[i])); + st.push(stoll(tokens[i])); } } int result = st.top(); diff --git "a/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" "b/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" index 964faceebb..ecd3a2c99a 100644 --- "a/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" +++ "b/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" @@ -7,7 +7,7 @@ -> 别看本篇选的是组合总和III,而不是组合总和,本题和上一篇[回溯算法:求组合问题!](https://mp.weixin.qq.com/s/OnBjbLzuipWz_u4QfmgcqQ)相比难度刚刚好! +> 别看本篇选的是组合总和III,而不是组合总和,本题和上一篇77.组合相比难度刚刚好! # 216.组合总和III @@ -166,7 +166,7 @@ public: 已选元素总和如果已经大于n(图中数值为4)了,那么往后遍历就没有意义了,直接剪掉。 -那么剪枝的地方一定是在递归终止的地方剪,剪枝代码如下: +那么剪枝的地方可以放在递归函数开始的地方,剪枝代码如下: ```cpp if (sum > targetSum) { // 剪枝操作 @@ -174,6 +174,25 @@ if (sum > targetSum) { // 剪枝操作 } ``` +当然这个剪枝也可以放在 调用递归之前,即放在这里,只不过要记得 要回溯操作给做了。 + +```CPP + +for (int i = startIndex; i <= 9 - (k - path.size()) + 1; i++) { // 剪枝 + sum += i; // 处理 + path.push_back(i); // 处理 + if (sum > targetSum) { // 剪枝操作 + sum -= i; // 剪枝之前先把回溯做了 + path.pop_back(); // 剪枝之前先把回溯做了 + return; + } + backtracking(targetSum, k, sum, i + 1); // 注意i+1调整startIndex + sum -= i; // 回溯 + path.pop_back(); // 回溯 +} +``` + + 和[回溯算法:组合问题再剪剪枝](https://programmercarl.com/0077.组合优化.html) 一样,for循环的范围也可以剪枝,i <= 9 - (k - path.size()) + 1就可以了。 最后C++代码如下: @@ -224,7 +243,7 @@ public: # 其他语言版本 -## Java +## Java 模板方法 ```java @@ -247,7 +266,7 @@ class Solution { if (sum == targetSum) result.add(new ArrayList<>(path)); return; } - + // 减枝 9 - (k - path.size()) + 1 for (int i = startIndex; i <= 9 - (k - path.size()) + 1; i++) { path.add(i); @@ -272,7 +291,7 @@ class Solution { } private void build(int k, int n, int startIndex, int sum) { - + if (sum > n) return; if (path.size() > k) return; @@ -281,7 +300,7 @@ class Solution { ans.add(new ArrayList<>(path)); return; } - + for(int i = startIndex; i <= 9; i++) { path.add(i); sum += i; @@ -328,7 +347,7 @@ class Solution { } ``` -## Python +## Python ```py class Solution: @@ -492,7 +511,7 @@ void backtracking(int targetSum, int k, int sum, int startIndex) { if(sum == targetSum) { int* tempPath = (int*)malloc(sizeof(int) * k); int j; - for(j = 0; j < k; j++) + for(j = 0; j < k; j++) tempPath[j] = path[j]; ans[ansTop++] = tempPath; } @@ -580,7 +599,7 @@ object Solution { // 剪枝 for (i <- startIndex to (9 - (k - path.size) + 1)) { path.append(i) - backtracking(k, n, sum + i, i + 1) + backtracking(k, n, sum + i, i + 1) path = path.take(path.size - 1) } } @@ -592,5 +611,7 @@ object Solution { ``` + + -----------------------
diff --git "a/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" "b/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" index 82ca09f0eb..e982493fde 100644 --- "a/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" +++ "b/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" @@ -33,6 +33,11 @@ * 所有节点的值都是唯一的。 * p、q 为不同节点且均存在于给定的二叉树中。 +# 算法公开课 + +**《代码随想录》算法视频公开课:[自底向上查找,有点难度! | LeetCode:236. 二叉树的最近公共祖先](https://www.bilibili.com/video/BV1jd4y1B7E2),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 + + # 思路 遇到这个题目首先想的是要是能自底向上查找就好了,这样就可以找到公共祖先了。 diff --git "a/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" "b/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" index a2fdddf43c..6691941966 100644 --- "a/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" +++ "b/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" @@ -33,6 +33,11 @@ 进阶:你可以不使用额外的空间吗?(假设由递归产生的隐式调用栈的开销不被计算在内) +# 算法公开课 + +**《代码随想录》算法视频公开课:[不仅双指针,还有代码技巧可以惊艳到你! | LeetCode:501.二叉搜索树中的众数](https://www.bilibili.com/video/BV1fD4y117gp),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 + + # 思路 这道题目呢,递归法我从两个维度来讲。 diff --git "a/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" "b/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" index af1cbd74a7..811ae89c6d 100644 --- "a/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" +++ "b/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" @@ -19,6 +19,11 @@ 提示:树中至少有 2 个节点。 +# 视频讲解 + +**《代码随想录》算法视频公开课:[二叉搜索树中,需要掌握如何双指针遍历!| LeetCode:530.二叉搜索树的最小绝对差](https://www.bilibili.com/video/BV1DD4y11779),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 + + # 思路 题目中要求在二叉搜索树上任意两节点的差的绝对值的最小值。 diff --git "a/problems/0538.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md" "b/problems/0538.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md" index 5c1e9e8c7f..63c931d642 100644 --- "a/problems/0538.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md" +++ "b/problems/0538.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md" @@ -78,7 +78,7 @@ pre指针的使用技巧,我们在[二叉树:搜索树的最小绝对差](ht 代码如下: ``` -int pre; // 记录前一个节点的数值 +int pre = 0; // 记录前一个节点的数值 void traversal(TreeNode* cur) ``` @@ -108,7 +108,7 @@ traversal(cur->left); // 左 ```CPP class Solution { private: - int pre; // 记录前一个节点的数值 + int pre = 0; // 记录前一个节点的数值 void traversal(TreeNode* cur) { // 右中左遍历 if (cur == NULL) return; traversal(cur->right); diff --git "a/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" "b/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" index d13895490f..b1eaf75a15 100644 --- "a/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" +++ "b/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" @@ -223,18 +223,18 @@ class Solution: ```python class Solution: def search(self, nums: List[int], target: int) -> int: - if nums is None or len(nums)==0: - return -1 - left,right=0,len(nums) - while (left target: - right=middle + right = middle else: - left=middle+1 - return -1 + return middle + return -1 ``` **Go:** From 557a0592dea408cd9b01dcd05435ca509d46bca4 Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Sat, 15 Oct 2022 16:31:46 +0800 Subject: [PATCH 1131/3019] Update --- README.md | 2 +- .../\350\256\255\347\273\203\350\220\245.png" | Bin 0 -> 1017500 bytes 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 "pics/\350\256\255\347\273\203\350\220\245.png" diff --git a/README.md b/README.md index 02d004e9e2..8aa93194b2 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@

- +

diff --git "a/pics/\350\256\255\347\273\203\350\220\245.png" "b/pics/\350\256\255\347\273\203\350\220\245.png" new file mode 100644 index 0000000000000000000000000000000000000000..34433d7b3758d35fbbd50f1b2508685512bd56d2 GIT binary patch literal 1017500 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%0ABeO7YEOVvMu@W?&gxT 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

$nf6TG`qr9;K^rsGHYdkFVhR2NzO7F>iY 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
DEYchsI(CAQU3KGsLQT$bXSHgbGdhCST*)3 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 z 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

w%%9#-=^`_&xV(crMg%X0R6f^ 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

kX%YDqJ~zfsff^Qi8{z_%go_geA8U=JPEYvhZ&K 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

d)`fWE*YMEZf*E~ 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 z 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 Date: Sat, 15 Oct 2022 16:33:50 +0800 Subject: [PATCH 1132/3019] Update --- ...70\344\272\244\347\232\204\347\272\277.md" | 3 --- ...\346\225\260Go\347\211\210\346\234\254.md" | 25 ------------------- ...\345\272\246Go\347\211\210\346\234\254.md" | 22 ---------------- 3 files changed, 50 deletions(-) delete mode 100644 "\346\267\273\345\212\2400222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260Go\347\211\210\346\234\254.md" delete mode 100644 "\346\267\273\345\212\240559.n\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246Go\347\211\210\346\234\254.md" diff --git "a/problems/1035.\344\270\215\347\233\270\344\272\244\347\232\204\347\272\277.md" "b/problems/1035.\344\270\215\347\233\270\344\272\244\347\232\204\347\272\277.md" index 391246756b..d97f495a92 100644 --- "a/problems/1035.\344\270\215\347\233\270\344\272\244\347\232\204\347\272\277.md" +++ "b/problems/1035.\344\270\215\347\233\270\344\272\244\347\232\204\347\272\277.md" @@ -210,8 +210,5 @@ function maxUncrossedLines(nums1: number[], nums2: number[]): number { }; ``` - - - -----------------------

diff --git "a/\346\267\273\345\212\2400222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260Go\347\211\210\346\234\254.md" "b/\346\267\273\345\212\2400222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260Go\347\211\210\346\234\254.md" deleted file mode 100644 index 6001e7b78c..0000000000 --- "a/\346\267\273\345\212\2400222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260Go\347\211\210\346\234\254.md" +++ /dev/null @@ -1,25 +0,0 @@ -```go -func countNodes(root *TreeNode) int { - if root == nil { - return 0 - } - q := list.New() - q.PushBack(root) - res := 0 - for q.Len() > 0 { - n := q.Len() - for i := 0; i < n; i++ { - node := q.Remove(q.Front()).(*TreeNode) - if node.Left != nil { - q.PushBack(node.Left) - } - if node.Right != nil { - q.PushBack(node.Right) - } - res++ - } - } - return res -} -``` - diff --git "a/\346\267\273\345\212\240559.n\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246Go\347\211\210\346\234\254.md" "b/\346\267\273\345\212\240559.n\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246Go\347\211\210\346\234\254.md" deleted file mode 100644 index 3172837d94..0000000000 --- "a/\346\267\273\345\212\240559.n\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246Go\347\211\210\346\234\254.md" +++ /dev/null @@ -1,22 +0,0 @@ -```go -func maxDepth(root *Node) int { - if root == nil { - return 0 - } - q := list.New() - q.PushBack(root) - depth := 0 - for q.Len() > 0 { - n := q.Len() - for i := 0; i < n; i++ { - node := q.Remove(q.Front()).(*Node) - for j := range node.Children { - q.PushBack(node.Children[j]) - } - } - depth++ - } - return depth -} -``` - From 6731e4508ff7e6df95c9c372340a0d9afab0e689 Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Sat, 15 Oct 2022 17:11:17 +0800 Subject: [PATCH 1133/3019] Update --- ...3\344\274\240\346\265\267\346\212\245.jpg" | Bin 0 -> 286579 bytes ...44\346\225\260\344\271\213\345\222\214.md" | 10 ++-- ...36\346\226\207\345\255\220\344\270\262.md" | 10 ++-- ...11\346\225\260\344\271\213\345\222\214.md" | 10 ++-- ...27\346\257\215\347\273\204\345\220\210.md" | 10 ++-- ...33\346\225\260\344\271\213\345\222\214.md" | 10 ++-- ...4N\344\270\252\350\212\202\347\202\271.md" | 10 ++-- ...10\347\232\204\346\213\254\345\217\267.md" | 10 ++-- ...55\347\232\204\350\212\202\347\202\271.md" | 10 ++-- ...73\351\231\244\345\205\203\347\264\240.md" | 10 ++-- .../0028.\345\256\236\347\216\260strStr.md" | 10 ++-- ...00\344\270\252\346\216\222\345\210\227.md" | 10 ++-- ...00\344\270\252\344\275\215\347\275\256.md" | 10 ++-- ...22\345\205\245\344\275\215\347\275\256.md" | 10 ++-- ...7.\350\247\243\346\225\260\347\213\254.md" | 10 ++-- ...04\345\220\210\346\200\273\345\222\214.md" | 10 ++-- ...\345\220\210\346\200\273\345\222\214II.md" | 10 ++-- ...2.\346\216\245\351\233\250\346\260\264.md" | 10 ++-- ...\350\267\203\346\270\270\346\210\217II.md" | 10 ++-- ...6.\345\205\250\346\216\222\345\210\227.md" | 10 ++-- ...\345\205\250\346\216\222\345\210\227II.md" | 10 ++-- "problems/0051.N\347\232\207\345\220\216.md" | 10 ++-- .../0052.N\347\232\207\345\220\216II.md" | 10 ++-- ...47\345\255\220\345\272\217\345\222\214.md" | 10 ++-- ...01\350\247\204\345\210\222\357\274\211.md" | 10 ++-- ...72\346\227\213\347\237\251\351\230\265.md" | 10 ++-- ...63\350\267\203\346\270\270\346\210\217.md" | 10 ++-- ...10\345\271\266\345\214\272\351\227\264.md" | 10 ++-- ...\346\227\213\347\237\251\351\230\265II.md" | 10 ++-- ...15\345\220\214\350\267\257\345\276\204.md" | 10 ++-- ...\345\220\214\350\267\257\345\276\204II.md" | 10 ++-- ...0.\347\210\254\346\245\274\346\242\257.md" | 10 ++-- ...14\345\214\205\347\211\210\346\234\254.md" | 10 ++-- ...26\350\276\221\350\267\235\347\246\273.md" | 10 ++-- "problems/0077.\347\273\204\345\220\210.md" | 10 ++-- ...04\345\220\210\344\274\230\345\214\226.md" | 10 ++-- "problems/0078.\345\255\220\351\233\206.md" | 10 ++-- ...47\347\232\204\347\237\251\345\275\242.md" | 10 ++-- "problems/0090.\345\255\220\351\233\206II.md" | 10 ++-- ...\345\216\237IP\345\234\260\345\235\200.md" | 10 ++-- ...11\346\220\234\347\264\242\346\240\221.md" | 10 ++-- ...11\346\220\234\347\264\242\346\240\221.md" | 10 ++-- ...70\345\220\214\347\232\204\346\240\221.md" | 10 ++-- ...60\344\272\214\345\217\211\346\240\221.md" | 10 ++-- ...02\345\272\217\351\201\215\345\216\206.md" | 10 ++-- ...00\345\244\247\346\267\261\345\272\246.md" | 10 ++-- ...40\344\272\214\345\217\211\346\240\221.md" | 10 ++-- ...11\346\220\234\347\264\242\346\240\221.md" | 10 ++-- ...41\344\272\214\345\217\211\346\240\221.md" | 10 ++-- ...00\345\260\217\346\267\261\345\272\246.md" | 10 ++-- ...57\345\276\204\346\200\273\345\222\214.md" | 10 ++-- ...04\345\255\220\345\272\217\345\210\227.md" | 10 ++-- ...02\347\202\271\346\214\207\351\222\210.md" | 10 ++-- ...00\344\275\263\346\227\266\346\234\272.md" | 10 ++-- ...\344\275\263\346\227\266\346\234\272II.md" | 10 ++-- ...01\350\247\204\345\210\222\357\274\211.md" | 10 ++-- ...344\275\263\346\227\266\346\234\272III.md" | 10 ++-- ...25\350\257\215\346\216\245\351\276\231.md" | 10 ++-- ...60\345\255\227\344\271\213\345\222\214.md" | 10 ++-- ...25\347\232\204\345\214\272\345\237\237.md" | 9 +++ ...62\345\233\236\346\226\207\344\270\262.md" | 10 ++-- ...\345\233\236\346\226\207\344\270\262II.md" | 10 ++-- ...4.\345\212\240\346\262\271\347\253\231.md" | 10 ++-- ...06\345\217\221\347\263\226\346\236\234.md" | 10 ++-- ...25\350\257\215\346\213\206\345\210\206.md" | 10 ++-- ...57\345\275\242\351\223\276\350\241\250.md" | 10 ++-- ...\345\275\242\351\223\276\350\241\250II.md" | 10 ++-- ...15\346\216\222\351\223\276\350\241\250.md" | 10 ++-- ...76\345\274\217\346\261\202\345\200\274.md" | 10 ++-- ...14\347\232\204\345\215\225\350\257\215.md" | 10 ++-- ...70\344\272\244\351\223\276\350\241\250.md" | 10 ++-- ...\344\275\263\346\227\266\346\234\272IV.md" | 10 ++-- ...13\350\275\254\346\225\260\347\273\204.md" | 10 ++-- ...23\345\256\266\345\212\253\350\210\215.md" | 10 ++-- ...7.\345\271\277\346\220\234\347\211\210.md" | 9 +++ ...7.\346\267\261\346\220\234\347\211\210.md" | 10 +++- ...2.\345\277\253\344\271\220\346\225\260.md" | 10 ++-- ...76\350\241\250\345\205\203\347\264\240.md" | 10 ++-- ...04\345\255\227\347\254\246\344\270\262.md" | 10 ++-- ...73\350\275\254\351\223\276\350\241\250.md" | 10 ++-- ...04\345\255\220\346\225\260\347\273\204.md" | 10 ++-- ...\345\256\266\345\212\253\350\210\215II.md" | 10 ++-- ...345\220\210\346\200\273\345\222\214III.md" | 10 ++-- ...02\347\202\271\344\270\252\346\225\260.md" | 10 ++-- ...27\345\256\236\347\216\260\346\240\210.md" | 10 ++-- ...54\344\272\214\345\217\211\346\240\221.md" | 10 ++-- ...36\347\216\260\351\230\237\345\210\227.md" | 10 ++-- ...36\346\226\207\351\223\276\350\241\250.md" | 10 ++-- ...54\345\205\261\347\245\226\345\205\210.md" | 10 ++-- ...54\345\205\261\347\245\226\345\205\210.md" | 10 ++-- ...43\346\234\200\345\244\247\345\200\274.md" | 10 ++-- ...15\345\274\202\344\275\215\350\257\215.md" | 10 ++-- ...00\346\234\211\350\267\257\345\276\204.md" | 10 ++-- ...50\345\271\263\346\226\271\346\225\260.md" | 10 ++-- ...3.\347\247\273\345\212\250\351\233\266.md" | 10 ++-- ...07\345\255\220\345\272\217\345\210\227.md" | 10 ++-- ...53\345\206\267\345\206\273\346\234\237.md" | 10 ++-- ...66\351\222\261\345\205\221\346\215\242.md" | 10 ++-- ...11\346\216\222\350\241\214\347\250\213.md" | 10 ++-- ...345\256\266\345\212\253\350\210\215III.md" | 10 ++-- ...64\346\225\260\346\213\206\345\210\206.md" | 10 ++-- ...54\345\255\227\347\254\246\344\270\262.md" | 10 ++-- ...30\351\242\221\345\205\203\347\264\240.md" | 10 ++-- ...04\347\232\204\344\272\244\351\233\206.md" | 10 ++-- ...06\345\212\250\345\272\217\345\210\227.md" | 10 ++-- ...10\346\200\273\345\222\214\342\205\243.md" | 10 ++-- ...3.\350\265\216\351\207\221\344\277\241.md" | 10 ++-- ...55\345\255\220\345\272\217\345\210\227.md" | 10 ++-- ...66\345\255\220\344\271\213\345\222\214.md" | 10 ++-- ...15\345\273\272\351\230\237\345\210\227.md" | 10 ++-- ...11\345\222\214\345\255\220\351\233\206.md" | 10 ++-- ...64\346\265\201\351\227\256\351\242\230.md" | 9 +++ ...15\345\217\240\345\214\272\351\227\264.md" | 10 ++-- ...55\347\232\204\350\212\202\347\202\271.md" | 10 ++-- ...25\347\210\206\346\260\224\347\220\203.md" | 10 ++-- ...\346\225\260\347\233\270\345\212\240II.md" | 10 ++-- ...06\345\217\221\351\245\274\345\271\262.md" | 10 ++-- ...20\345\255\227\347\254\246\344\270\262.md" | 10 ++-- ...77\347\232\204\345\221\250\351\225\277.md" | 10 ++-- ...4.\344\270\200\345\222\214\351\233\266.md" | 10 ++-- ...36\345\255\220\345\272\217\345\210\227.md" | 10 ++-- ...4.\347\233\256\346\240\207\345\222\214.md" | 10 ++-- ...4\345\244\247\345\205\203\347\264\240I.md" | 10 ++-- ...55\347\232\204\344\274\227\346\225\260.md" | 10 ++-- ...\345\244\247\345\205\203\347\264\240II.md" | 10 ++-- ...42\351\202\243\345\245\221\346\225\260.md" | 10 ++-- ...13\350\247\222\347\232\204\345\200\274.md" | 10 ++-- ...07\345\255\220\345\272\217\345\210\227.md" | 10 ++-- ...\351\222\261\345\205\221\346\215\242II.md" | 10 ++-- ...17\347\273\235\345\257\271\345\267\256.md" | 10 ++-- ...72\347\264\257\345\212\240\346\240\221.md" | 10 ++-- ...\345\255\227\347\254\246\344\270\262II.md" | 10 ++-- ...40\351\231\244\346\223\215\344\275\234.md" | 10 ++-- ...66\344\272\214\345\217\211\346\240\221.md" | 10 ++-- ...36\346\226\207\345\255\220\344\270\262.md" | 10 ++-- ...a2\345\217\202\350\256\256\351\231\242.md" | 10 ++-- ...47\344\272\214\345\217\211\346\240\221.md" | 10 ++-- ...24\345\233\236\345\216\237\347\202\271.md" | 10 ++-- ...11\346\220\234\347\264\242\346\240\221.md" | 10 ++-- ...27\347\232\204\344\270\252\346\225\260.md" | 10 ++-- ...22\345\242\236\345\272\217\345\210\227.md" | 10 ++-- ...27\344\275\231\350\277\236\346\216\245.md" | 10 ++-- ...\344\275\231\350\277\236\346\216\245II.md" | 10 ++-- ...00\345\244\247\351\235\242\347\247\257.md" | 9 +++ ...55\347\232\204\346\220\234\347\264\242.md" | 10 ++-- ...22\345\205\245\346\223\215\344\275\234.md" | 10 ++-- ...14\345\210\206\346\237\245\346\211\276.md" | 10 ++-- ...76\350\256\241\351\223\276\350\241\250.md" | 10 ++-- ...53\346\211\213\347\273\255\350\264\271.md" | 10 ++-- ...01\350\247\204\345\210\222\357\274\211.md" | 10 ++-- ...15\345\255\220\346\225\260\347\273\204.md" | 10 ++-- ...55\345\277\203\347\264\242\345\274\225.md" | 10 ++-- ...36\347\232\204\346\225\260\345\255\227.md" | 10 ++-- ...17\346\227\245\346\270\251\345\272\246.md" | 10 ++-- ...71\347\210\254\346\245\274\346\242\257.md" | 10 ++-- ...27\346\257\215\345\214\272\351\227\264.md" | 10 ++-- ...75\347\232\204\350\267\257\345\276\204.md" | 9 +++ ...47\344\272\272\345\267\245\345\262\233.md" | 9 +++ ...31\345\222\214\346\210\277\351\227\264.md" | 10 ++-- ...04\345\255\227\347\254\246\344\270\262.md" | 10 ++-- ...54\346\260\264\346\211\276\351\233\266.md" | 10 ++-- ...\345\272\217\346\225\260\347\273\204II.md" | 13 ++-- ...77\346\214\211\351\224\256\345\205\245.md" | 10 ++-- ...61\350\204\211\346\225\260\347\273\204.md" | 10 ++-- ...47\344\272\214\345\217\211\346\240\221.md" | 10 ++-- ...04\347\232\204\345\271\263\346\226\271.md" | 10 ++-- ...70\347\224\250\345\255\227\347\254\246.md" | 10 ++-- ...04\346\225\260\347\273\204\345\222\214.md" | 10 ++-- ...60\347\232\204\346\225\260\351\207\217.md" | 9 +++ ...70\344\272\244\347\232\204\347\272\277.md" | 10 ++-- ...73\351\207\215\345\244\215\351\241\271.md" | 10 ++-- ...\347\232\204\351\207\215\351\207\217II.md" | 10 ++-- ...61\345\255\220\345\272\217\345\210\227.md" | 10 ++-- ...72\347\216\260\346\254\241\346\225\260.md" | 10 ++-- ...41\345\255\227\347\254\246\344\270\262.md" | 10 ++-- ...77\347\232\204\346\225\260\347\233\256.md" | 9 +++ ...60\347\233\256\346\216\222\345\272\217.md" | 10 ++-- ...27\347\232\204\346\225\260\345\255\227.md" | 10 ++-- ...21\345\217\230\345\271\263\350\241\241.md" | 10 ++-- ...55\345\277\203\350\212\202\347\202\271.md" | 9 +++ ...30\345\234\250\350\267\257\345\276\204.md" | 9 +++ ...57\345\244\232\345\244\247\357\274\237.md" | 10 ++-- problems/toolgithub.sh | 56 ++++++++++++++++++ ...11\346\255\245\351\223\272\345\236\253.md" | 10 ++-- ...46\347\235\200\345\233\236\346\272\257.md" | 10 ++-- ...21\346\200\273\347\273\223\347\257\207.md" | 10 ++-- ...06\350\256\272\345\237\272\347\241\200.md" | 10 ++-- ...00\350\277\255\344\273\243\346\263\225.md" | 10 ++-- ...55\344\273\243\351\201\215\345\216\206.md" | 10 ++-- ...22\345\275\222\351\201\215\345\216\206.md" | 10 ++-- ...50\350\277\231\351\207\214\357\274\201.md" | 10 ++-- ...77\346\215\242\347\251\272\346\240\274.md" | 10 ++-- ...54\345\255\227\347\254\246\344\270\262.md" | 10 ++-- ...30\346\200\273\347\273\223\347\257\207.md" | 10 ++-- ...22\346\200\273\347\273\223\347\257\207.md" | 10 ++-- ...06\350\256\272\345\237\272\347\241\200.md" | 10 ++-- ...07\351\222\210\346\200\273\347\273\223.md" | 10 ++-- ...14\350\241\250\346\200\273\347\273\223.md" | 10 ++-- ...06\350\256\272\345\237\272\347\241\200.md" | 10 ++-- ...36\346\272\257\346\200\273\347\273\223.md" | 10 ++-- ...00\347\247\215\345\206\231\346\263\225.md" | 10 ++-- ...06\350\256\272\345\237\272\347\241\200.md" | 10 ++-- ...06\350\256\272\345\237\272\347\241\200.md" | 9 +++ ...06\350\256\272\345\237\272\347\241\200.md" | 9 +++ ...46\344\270\262\346\200\273\347\273\223.md" | 10 ++-- ...04\346\200\273\347\273\223\347\257\207.md" | 10 ++-- ...06\350\256\272\345\237\272\347\241\200.md" | 10 ++-- ...37\345\210\227\346\200\273\347\273\223.md" | 10 ++-- ...06\350\256\272\345\237\272\347\241\200.md" | 10 ++-- ...06\350\256\262\350\247\243\357\274\211.md" | 10 ++-- ...27\346\263\225\346\250\241\346\235\277.md" | 10 ++-- ...05\346\200\273\347\273\223\347\257\207.md" | 10 ++-- ...47\241\20001\350\203\214\345\214\205-1.md" | 10 ++-- ...47\241\20001\350\203\214\345\214\205-2.md" | 10 ++-- ...32\351\207\215\350\203\214\345\214\205.md" | 10 ++-- ...14\345\205\250\350\203\214\345\214\205.md" | 10 ++-- ...25\346\200\273\347\273\223\347\257\207.md" | 10 ++-- ...06\350\256\272\345\237\272\347\241\200.md" | 10 ++-- ...50\346\200\273\347\273\223\347\257\207.md" | 10 ++-- ...06\350\256\272\345\237\272\347\241\200.md" | 10 ++-- ...76\350\241\250\347\233\270\344\272\244.md" | 10 ++-- 221 files changed, 1409 insertions(+), 828 deletions(-) create mode 100644 "pics/\347\275\221\347\253\231\346\230\237\347\220\203\345\256\243\344\274\240\346\265\267\346\212\245.jpg" create mode 100644 problems/toolgithub.sh diff --git "a/pics/\347\275\221\347\253\231\346\230\237\347\220\203\345\256\243\344\274\240\346\265\267\346\212\245.jpg" "b/pics/\347\275\221\347\253\231\346\230\237\347\220\203\345\256\243\344\274\240\346\265\267\346\212\245.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..b0325d8733f1e94f803e9e44e0d1b4e5a0cd570b GIT binary patch literal 286579 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 z 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 z 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 - - + +

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

@@ -433,5 +433,7 @@ int* twoSum(int* nums, int numsSize, int target, int* returnSize){ return NULL; } ``` ------------------------ -
+

+ + + diff --git "a/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" "b/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" index a76e576571..62c2cbde61 100644 --- "a/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" +++ "b/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" @@ -1,6 +1,6 @@

- - + +

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

@@ -615,5 +615,7 @@ char * longestPalindrome(char * s){ } ``` ------------------------ -
+

+ + + diff --git "a/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" "b/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" index a4b6b84d98..fb289d54e5 100644 --- "a/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" @@ -1,6 +1,6 @@

- - + +

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

@@ -866,5 +866,7 @@ object Solution { } } ``` ------------------------ -
+

+ + + diff --git "a/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" "b/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" index 5778e903c5..dd820a3911 100644 --- "a/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" +++ "b/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" @@ -1,6 +1,6 @@

- - + +

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

@@ -632,5 +632,7 @@ object Solution { ``` ------------------------ -
+

+ + + diff --git "a/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" "b/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" index ea7502b105..463eaf8fc0 100644 --- "a/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" @@ -1,6 +1,6 @@

- - + +

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

@@ -613,5 +613,7 @@ object Solution { } } ``` ------------------------ -
+

+ + + diff --git "a/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" "b/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" index f84e334e1f..314c396e00 100644 --- "a/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" +++ "b/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" @@ -1,6 +1,6 @@

- - + +

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

@@ -366,5 +366,7 @@ impl Solution { } ``` ------------------------ -
+

+ + + diff --git "a/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" "b/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" index 3c7da61b42..3d986a822c 100644 --- "a/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" +++ "b/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" @@ -1,6 +1,6 @@

- - + +

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

@@ -493,5 +493,7 @@ object Solution { } ``` ------------------------ -
+

+ + + diff --git "a/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" "b/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" index d65d0bca80..50775cddff 100644 --- "a/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" +++ "b/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" @@ -1,6 +1,6 @@

- - + +

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

@@ -426,5 +426,7 @@ impl Solution { } ``` ------------------------ -
+

+ + + diff --git "a/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" "b/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" index 33e0c8c1c4..e1de724365 100644 --- "a/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" +++ "b/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" @@ -1,6 +1,6 @@

- - + +

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

@@ -391,5 +391,7 @@ public class Solution { } ``` ------------------------ -
+

+ + + diff --git "a/problems/0028.\345\256\236\347\216\260strStr.md" "b/problems/0028.\345\256\236\347\216\260strStr.md" index 84ce77506f..7078738e8e 100644 --- "a/problems/0028.\345\256\236\347\216\260strStr.md" +++ "b/problems/0028.\345\256\236\347\216\260strStr.md" @@ -1,6 +1,6 @@

- - + +

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

@@ -1299,5 +1299,7 @@ impl Solution { } ``` ------------------------ -
+

+ + + diff --git "a/problems/0031.\344\270\213\344\270\200\344\270\252\346\216\222\345\210\227.md" "b/problems/0031.\344\270\213\344\270\200\344\270\252\346\216\222\345\210\227.md" index fbea1c19a1..88fbb2fc65 100644 --- "a/problems/0031.\344\270\213\344\270\200\344\270\252\346\216\222\345\210\227.md" +++ "b/problems/0031.\344\270\213\344\270\200\344\270\252\346\216\222\345\210\227.md" @@ -1,6 +1,6 @@

- - + +

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

@@ -267,5 +267,7 @@ var nextPermutation = function(nums) { ``` ------------------------ -
+

+ + + diff --git "a/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" "b/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" index 31ed4f7f90..dc6833f67e 100644 --- "a/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" +++ "b/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" @@ -1,6 +1,6 @@

- - + +

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

@@ -681,5 +681,7 @@ class Solution { } ``` ------------------------ -
+

+ + + diff --git "a/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" "b/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" index cd2c88eb20..dd15b36b24 100644 --- "a/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" +++ "b/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" @@ -1,6 +1,6 @@

- - + +

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

@@ -481,5 +481,7 @@ int searchInsert(int* nums, int numsSize, int target){ } ``` ------------------------ -
+

+ + + diff --git "a/problems/0037.\350\247\243\346\225\260\347\213\254.md" "b/problems/0037.\350\247\243\346\225\260\347\213\254.md" index 8b1968902f..f1f621edaf 100644 --- "a/problems/0037.\350\247\243\346\225\260\347\213\254.md" +++ "b/problems/0037.\350\247\243\346\225\260\347\213\254.md" @@ -1,6 +1,6 @@

- - + +

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

@@ -743,5 +743,7 @@ object Solution { } ``` ------------------------ -
+

+ + + diff --git "a/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" "b/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" index d9aa378562..4e1df6c78f 100644 --- "a/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" +++ "b/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" @@ -1,6 +1,6 @@

- - + +

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

@@ -561,5 +561,7 @@ object Solution { ``` ------------------------ -
+

+ + + diff --git "a/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" "b/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" index 417f4a6d4d..46b33c89fc 100644 --- "a/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" +++ "b/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" @@ -1,6 +1,6 @@

- - + +

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

@@ -765,5 +765,7 @@ object Solution { } ``` ------------------------ -
+

+ + + diff --git "a/problems/0042.\346\216\245\351\233\250\346\260\264.md" "b/problems/0042.\346\216\245\351\233\250\346\260\264.md" index 448d6d517f..e8dd3690ba 100644 --- "a/problems/0042.\346\216\245\351\233\250\346\260\264.md" +++ "b/problems/0042.\346\216\245\351\233\250\346\260\264.md" @@ -1,6 +1,6 @@

- - + +

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

@@ -904,5 +904,7 @@ int trap(int* height, int heightSize) { * 空间复杂度 O(1) ------------------------ -
+

+ + + diff --git "a/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" "b/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" index 59e30df525..5e06490ac7 100644 --- "a/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" +++ "b/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" @@ -1,6 +1,6 @@

- - + +

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

@@ -440,5 +440,7 @@ impl Solution { ``` ------------------------ -
+

+ + + diff --git "a/problems/0046.\345\205\250\346\216\222\345\210\227.md" "b/problems/0046.\345\205\250\346\216\222\345\210\227.md" index 5a4ff1548f..805bc4578f 100644 --- "a/problems/0046.\345\205\250\346\216\222\345\210\227.md" +++ "b/problems/0046.\345\205\250\346\216\222\345\210\227.md" @@ -1,6 +1,6 @@

- - + +

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

@@ -517,5 +517,7 @@ object Solution { } ``` ------------------------ -
+

+ + + diff --git "a/problems/0047.\345\205\250\346\216\222\345\210\227II.md" "b/problems/0047.\345\205\250\346\216\222\345\210\227II.md" index 2c3f579f3f..bac30a44ce 100644 --- "a/problems/0047.\345\205\250\346\216\222\345\210\227II.md" +++ "b/problems/0047.\345\205\250\346\216\222\345\210\227II.md" @@ -1,6 +1,6 @@

- - + +

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

@@ -494,5 +494,7 @@ object Solution { } ``` ------------------------ -
+

+ + + diff --git "a/problems/0051.N\347\232\207\345\220\216.md" "b/problems/0051.N\347\232\207\345\220\216.md" index 18b779512d..83d0cd94bc 100644 --- "a/problems/0051.N\347\232\207\345\220\216.md" +++ "b/problems/0051.N\347\232\207\345\220\216.md" @@ -1,6 +1,6 @@

- - + +

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

@@ -806,5 +806,7 @@ object Solution { } ``` ------------------------ -
+

+ + + diff --git "a/problems/0052.N\347\232\207\345\220\216II.md" "b/problems/0052.N\347\232\207\345\220\216II.md" index d39e9f2a1a..f1edd281e9 100644 --- "a/problems/0052.N\347\232\207\345\220\216II.md" +++ "b/problems/0052.N\347\232\207\345\220\216II.md" @@ -1,6 +1,6 @@

- - + +

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

@@ -257,5 +257,7 @@ int totalNQueens(int n){ } ``` ------------------------ -
+

+ + + diff --git "a/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" "b/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" index 17b9d31e11..665710a94b 100644 --- "a/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" +++ "b/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" @@ -1,6 +1,6 @@

- - + +

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

@@ -369,5 +369,7 @@ object Solution { } ``` ------------------------ -
+

+ + + diff --git "a/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" "b/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" index 23d2340087..e222a3c47a 100644 --- "a/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" +++ "b/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" @@ -1,6 +1,6 @@

- - + +

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

@@ -237,5 +237,7 @@ function maxSubArray(nums: number[]): number { ``` ------------------------ -
+

+ + + diff --git "a/problems/0054.\350\236\272\346\227\213\347\237\251\351\230\265.md" "b/problems/0054.\350\236\272\346\227\213\347\237\251\351\230\265.md" index aeb8e52155..858741d0b0 100644 --- "a/problems/0054.\350\236\272\346\227\213\347\237\251\351\230\265.md" +++ "b/problems/0054.\350\236\272\346\227\213\347\237\251\351\230\265.md" @@ -1,6 +1,6 @@

- - + +

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

@@ -201,5 +201,7 @@ class Solution { ------------------------ -
+

+ + + diff --git "a/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" "b/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" index f2bcedcc94..23357f2145 100644 --- "a/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" +++ "b/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" @@ -1,6 +1,6 @@

- - + +

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

@@ -255,5 +255,7 @@ object Solution { ``` ------------------------ -
+

+ + + diff --git "a/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" "b/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" index 26a8010dc3..2ff3737250 100644 --- "a/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" +++ "b/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" @@ -1,6 +1,6 @@

- - + +

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

@@ -355,5 +355,7 @@ impl Solution { } ``` ------------------------ -
+

+ + + diff --git "a/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" "b/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" index 0d093983ba..78336d5a04 100644 --- "a/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" +++ "b/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" @@ -1,6 +1,6 @@

- - + +

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

@@ -623,5 +623,7 @@ public class Solution { } ``` ------------------------ -
+

+ + + diff --git "a/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" "b/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" index 79e49b8773..ad5c6f3e74 100644 --- "a/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" +++ "b/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" @@ -1,6 +1,6 @@

- - + +

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

@@ -472,5 +472,7 @@ public class Solution ------------------------ -
+

+ + + diff --git "a/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" "b/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" index f78995e912..547eb9f876 100644 --- "a/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" +++ "b/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" @@ -1,6 +1,6 @@

- - + +

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

@@ -567,5 +567,7 @@ object Solution { } ``` ------------------------ -
+

+ + + diff --git "a/problems/0070.\347\210\254\346\245\274\346\242\257.md" "b/problems/0070.\347\210\254\346\245\274\346\242\257.md" index 903e8d589e..3acc4c11e4 100644 --- "a/problems/0070.\347\210\254\346\245\274\346\242\257.md" +++ "b/problems/0070.\347\210\254\346\245\274\346\242\257.md" @@ -1,6 +1,6 @@

- - + +

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

@@ -445,5 +445,7 @@ public class Solution { ------------------------ -
+

+ + + diff --git "a/problems/0070.\347\210\254\346\245\274\346\242\257\345\256\214\345\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md" "b/problems/0070.\347\210\254\346\245\274\346\242\257\345\256\214\345\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md" index 28439e09a2..4925c31262 100644 --- "a/problems/0070.\347\210\254\346\245\274\346\242\257\345\256\214\345\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md" +++ "b/problems/0070.\347\210\254\346\245\274\346\242\257\345\256\214\345\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md" @@ -1,6 +1,6 @@

- - + +

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

# 动态规划:以前我没得选,现在我选择再爬一次! @@ -224,5 +224,7 @@ function climbStairs(n: number): number { ------------------------ -
+

+ + + diff --git "a/problems/0072.\347\274\226\350\276\221\350\267\235\347\246\273.md" "b/problems/0072.\347\274\226\350\276\221\350\267\235\347\246\273.md" index df57b5b882..408f1d7c86 100644 --- "a/problems/0072.\347\274\226\350\276\221\350\267\235\347\246\273.md" +++ "b/problems/0072.\347\274\226\350\276\221\350\267\235\347\246\273.md" @@ -1,6 +1,6 @@

- - + +

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

@@ -390,5 +390,7 @@ int minDistance(char * word1, char * word2){ } ``` ------------------------ -
+

+ + + diff --git "a/problems/0077.\347\273\204\345\220\210.md" "b/problems/0077.\347\273\204\345\220\210.md" index 4ce58d3352..dabd2e8c3f 100644 --- "a/problems/0077.\347\273\204\345\220\210.md" +++ "b/problems/0077.\347\273\204\345\220\210.md" @@ -1,6 +1,6 @@

- - + +

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

@@ -784,5 +784,7 @@ object Solution { } ``` ------------------------ -
+

+ + + diff --git "a/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" "b/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" index c8a5837d9a..91c7ce3baa 100644 --- "a/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" +++ "b/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" @@ -1,6 +1,6 @@

- - + +

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

@@ -403,5 +403,7 @@ object Solution { } ``` ------------------------ -
+

+ + + diff --git "a/problems/0078.\345\255\220\351\233\206.md" "b/problems/0078.\345\255\220\351\233\206.md" index a9ffd696ce..e271a96f0a 100644 --- "a/problems/0078.\345\255\220\351\233\206.md" +++ "b/problems/0078.\345\255\220\351\233\206.md" @@ -1,6 +1,6 @@

- - + +

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

@@ -448,5 +448,7 @@ object Solution { ``` ------------------------ -
+

+ + + diff --git "a/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" "b/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" index e085e455cf..5fad9c5ab1 100644 --- "a/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" +++ "b/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" @@ -1,6 +1,6 @@

- - + +

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

@@ -576,5 +576,7 @@ function largestRectangleArea(heights: number[]): number { ------------------------ -
+

+ + + diff --git "a/problems/0090.\345\255\220\351\233\206II.md" "b/problems/0090.\345\255\220\351\233\206II.md" index 81c0f94a80..ea1eb4cd0a 100644 --- "a/problems/0090.\345\255\220\351\233\206II.md" +++ "b/problems/0090.\345\255\220\351\233\206II.md" @@ -1,6 +1,6 @@

- - + +

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

@@ -582,5 +582,7 @@ object Solution { } ``` ------------------------ -
+

+ + + diff --git "a/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" "b/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" index 46ac1c8677..ce62cac13d 100644 --- "a/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" +++ "b/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" @@ -1,6 +1,6 @@

- - + +

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

@@ -749,5 +749,7 @@ object Solution { ``` ------------------------ -
+

+ + + diff --git "a/problems/0096.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0096.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" index 51de1e2330..d086b1f346 100644 --- "a/problems/0096.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" +++ "b/problems/0096.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" @@ -1,6 +1,6 @@

- - + +

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

@@ -317,5 +317,7 @@ object Solution { } ``` ------------------------ -
+

+ + + diff --git "a/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" index 5deaed5234..bb38ae3577 100644 --- "a/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" +++ "b/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" @@ -1,6 +1,6 @@

- - + +

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

@@ -639,5 +639,7 @@ object Solution { } ``` ------------------------ -
+

+ + + diff --git "a/problems/0100.\347\233\270\345\220\214\347\232\204\346\240\221.md" "b/problems/0100.\347\233\270\345\220\214\347\232\204\346\240\221.md" index 07c477e6ef..96acacf61c 100644 --- "a/problems/0100.\347\233\270\345\220\214\347\232\204\346\240\221.md" +++ "b/problems/0100.\347\233\270\345\220\214\347\232\204\346\240\221.md" @@ -1,6 +1,6 @@

- - + +

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

@@ -337,5 +337,7 @@ function isSameTree(p: TreeNode | null, q: TreeNode | null): boolean { ------------------------ -
+

+ + + diff --git "a/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" "b/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" index 3862a3b049..a0870fddae 100644 --- "a/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" @@ -1,6 +1,6 @@

- - + +

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

@@ -772,5 +772,7 @@ object Solution { } ``` ------------------------ -
+

+ + + diff --git "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" index db0ff25884..aebb6f0851 100644 --- "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" +++ "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" @@ -1,6 +1,6 @@

- - + +

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

@@ -2757,5 +2757,7 @@ object Solution { ------------------------ -
+

+ + + diff --git "a/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" "b/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" index a7c206afcf..be53c41741 100644 --- "a/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" +++ "b/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" @@ -1,6 +1,6 @@

- - + +

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

@@ -975,5 +975,7 @@ object Solution { } ``` ------------------------ -
+

+ + + diff --git "a/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" "b/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" index 0fd50897b0..17ba561d47 100644 --- "a/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" @@ -1,6 +1,6 @@

- - + +

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

@@ -1136,5 +1136,7 @@ object Solution { } ``` ------------------------ -
+

+ + + diff --git "a/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" index f9f8a4ff24..fd634094fc 100644 --- "a/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" +++ "b/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" @@ -1,6 +1,6 @@

- - + +

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

@@ -478,5 +478,7 @@ object Solution { ``` ------------------------ -
+

+ + + diff --git "a/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" "b/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" index a87b64fc02..6e7c8c5300 100644 --- "a/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" @@ -1,6 +1,6 @@

- - + +

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

@@ -810,5 +810,7 @@ func getHeight(_ root: TreeNode?) -> Int { } ``` ------------------------ -
+

+ + + diff --git "a/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" "b/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" index 403027e430..470e19199e 100644 --- "a/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" +++ "b/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" @@ -1,6 +1,6 @@

- - + +

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

@@ -636,5 +636,7 @@ impl Solution { ``` ------------------------ -
+

+ + + diff --git "a/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" "b/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" index 23b241cf4a..d50f23f974 100644 --- "a/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" +++ "b/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" @@ -1,6 +1,6 @@

- - + +

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

@@ -1213,5 +1213,7 @@ object Solution { } ``` ------------------------ -
+

+ + + diff --git "a/problems/0115.\344\270\215\345\220\214\347\232\204\345\255\220\345\272\217\345\210\227.md" "b/problems/0115.\344\270\215\345\220\214\347\232\204\345\255\220\345\272\217\345\210\227.md" index fe76c3ed4a..f4893fe0f2 100644 --- "a/problems/0115.\344\270\215\345\220\214\347\232\204\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0115.\344\270\215\345\220\214\347\232\204\345\255\220\345\272\217\345\210\227.md" @@ -1,6 +1,6 @@

- - + +

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

@@ -298,5 +298,7 @@ function numDistinct(s: string, t: string): number { ------------------------ -
+

+ + + diff --git "a/problems/0116.\345\241\253\345\205\205\346\257\217\344\270\252\350\212\202\347\202\271\347\232\204\344\270\213\344\270\200\344\270\252\345\217\263\344\276\247\350\212\202\347\202\271\346\214\207\351\222\210.md" "b/problems/0116.\345\241\253\345\205\205\346\257\217\344\270\252\350\212\202\347\202\271\347\232\204\344\270\213\344\270\200\344\270\252\345\217\263\344\276\247\350\212\202\347\202\271\346\214\207\351\222\210.md" index 303108be68..31bb6822cc 100644 --- "a/problems/0116.\345\241\253\345\205\205\346\257\217\344\270\252\350\212\202\347\202\271\347\232\204\344\270\213\344\270\200\344\270\252\345\217\263\344\276\247\350\212\202\347\202\271\346\214\207\351\222\210.md" +++ "b/problems/0116.\345\241\253\345\205\205\346\257\217\344\270\252\350\212\202\347\202\271\347\232\204\344\270\213\344\270\200\344\270\252\345\217\263\344\276\247\350\212\202\347\202\271\346\214\207\351\222\210.md" @@ -1,6 +1,6 @@

- - + +

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

@@ -361,5 +361,7 @@ function connect(root: NodePro | null): NodePro | null { ------------------------ -
+

+ + + diff --git "a/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" "b/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" index 868c0e3e17..790bbd8826 100644 --- "a/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" +++ "b/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" @@ -1,6 +1,6 @@

- - + +

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

@@ -467,5 +467,7 @@ function maxProfit(prices: number[]): number { ------------------------ -
+

+ + + diff --git "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" index 1094d9e4b2..57b174d980 100644 --- "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" +++ "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" @@ -1,6 +1,6 @@

- - + +

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

@@ -374,5 +374,7 @@ object Solution { } ``` ------------------------ -
+

+ + + diff --git "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" index 98bf3e52af..f5f3f7208b 100644 --- "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" +++ "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" @@ -1,6 +1,6 @@

- - + +

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

@@ -333,5 +333,7 @@ function maxProfit(prices: number[]): number { ------------------------ -
+

+ + + diff --git "a/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" "b/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" index 947e694771..33f92db4d1 100644 --- "a/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" +++ "b/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" @@ -1,6 +1,6 @@

- - + +

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

@@ -418,5 +418,7 @@ func max(a, b int) int { ------------------------ -
+

+ + + diff --git "a/problems/0127.\345\215\225\350\257\215\346\216\245\351\276\231.md" "b/problems/0127.\345\215\225\350\257\215\346\216\245\351\276\231.md" index 4206852f03..4fa530469a 100644 --- "a/problems/0127.\345\215\225\350\257\215\346\216\245\351\276\231.md" +++ "b/problems/0127.\345\215\225\350\257\215\346\216\245\351\276\231.md" @@ -1,6 +1,6 @@

- - + +

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

@@ -248,5 +248,7 @@ var ladderLength = function(beginWord, endWord, wordList) { ``` ------------------------ -
+

+ + + diff --git "a/problems/0129.\346\261\202\346\240\271\345\210\260\345\217\266\345\255\220\350\212\202\347\202\271\346\225\260\345\255\227\344\271\213\345\222\214.md" "b/problems/0129.\346\261\202\346\240\271\345\210\260\345\217\266\345\255\220\350\212\202\347\202\271\346\225\260\345\255\227\344\271\213\345\222\214.md" index bd5107a28a..445e108aa9 100644 --- "a/problems/0129.\346\261\202\346\240\271\345\210\260\345\217\266\345\255\220\350\212\202\347\202\271\346\225\260\345\255\227\344\271\213\345\222\214.md" +++ "b/problems/0129.\346\261\202\346\240\271\345\210\260\345\217\266\345\255\220\350\212\202\347\202\271\346\225\260\345\255\227\344\271\213\345\222\214.md" @@ -1,6 +1,6 @@

- - + +

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

@@ -380,5 +380,7 @@ int sumNumbers(struct TreeNode* root){ } ``` ------------------------ -
+

+ + + diff --git "a/problems/0130.\350\242\253\345\233\264\347\273\225\347\232\204\345\214\272\345\237\237.md" "b/problems/0130.\350\242\253\345\233\264\347\273\225\347\232\204\345\214\272\345\237\237.md" index 2a363f2443..528d2042c0 100644 --- "a/problems/0130.\350\242\253\345\233\264\347\273\225\347\232\204\345\214\272\345\237\237.md" +++ "b/problems/0130.\350\242\253\345\233\264\347\273\225\347\232\204\345\214\272\345\237\237.md" @@ -1,3 +1,8 @@ +

+ + + +

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

# 130. 被围绕的区域 @@ -78,3 +83,7 @@ public: ``` ## 其他语言版本 +

+ + + diff --git "a/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" "b/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" index 3713250390..3a3c2d738e 100644 --- "a/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" +++ "b/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" @@ -1,6 +1,6 @@

- - + +

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

@@ -815,5 +815,7 @@ object Solution { ``` ------------------------ -
+

+ + + diff --git "a/problems/0132.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262II.md" "b/problems/0132.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262II.md" index 36db56cb16..24cf43ae31 100644 --- "a/problems/0132.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262II.md" +++ "b/problems/0132.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262II.md" @@ -1,6 +1,6 @@

- - + +

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

@@ -334,5 +334,7 @@ var minCut = function(s) { ``` ------------------------ -
+

+ + + diff --git "a/problems/0134.\345\212\240\346\262\271\347\253\231.md" "b/problems/0134.\345\212\240\346\262\271\347\253\231.md" index 4e698d1b45..37dddb99e3 100644 --- "a/problems/0134.\345\212\240\346\262\271\347\253\231.md" +++ "b/problems/0134.\345\212\240\346\262\271\347\253\231.md" @@ -1,6 +1,6 @@

- - + +

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

@@ -587,5 +587,7 @@ object Solution { } ``` ------------------------ -
+

+ + + diff --git "a/problems/0135.\345\210\206\345\217\221\347\263\226\346\236\234.md" "b/problems/0135.\345\210\206\345\217\221\347\263\226\346\236\234.md" index 03360dbcf2..442deccda9 100644 --- "a/problems/0135.\345\210\206\345\217\221\347\263\226\346\236\234.md" +++ "b/problems/0135.\345\210\206\345\217\221\347\263\226\346\236\234.md" @@ -1,6 +1,6 @@

- - + +

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

@@ -348,5 +348,7 @@ object Solution { ``` ------------------------ -
+

+ + + diff --git "a/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" "b/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" index 5226502ac4..c9e42dc75a 100644 --- "a/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" +++ "b/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" @@ -1,6 +1,6 @@

- - + +

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

@@ -426,5 +426,7 @@ function wordBreak(s: string, wordDict: string[]): boolean { ------------------------ -
+

+ + + diff --git "a/problems/0141.\347\216\257\345\275\242\351\223\276\350\241\250.md" "b/problems/0141.\347\216\257\345\275\242\351\223\276\350\241\250.md" index ce90b6c404..d4cd596f10 100644 --- "a/problems/0141.\347\216\257\345\275\242\351\223\276\350\241\250.md" +++ "b/problems/0141.\347\216\257\345\275\242\351\223\276\350\241\250.md" @@ -1,6 +1,6 @@

- - + +

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

@@ -159,5 +159,7 @@ function hasCycle(head: ListNode | null): boolean { ------------------------ -
+

+ + + diff --git "a/problems/0142.\347\216\257\345\275\242\351\223\276\350\241\250II.md" "b/problems/0142.\347\216\257\345\275\242\351\223\276\350\241\250II.md" index 050b5ee4dc..112aa8cfbf 100644 --- "a/problems/0142.\347\216\257\345\275\242\351\223\276\350\241\250II.md" +++ "b/problems/0142.\347\216\257\345\275\242\351\223\276\350\241\250II.md" @@ -1,6 +1,6 @@

- - + +

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

@@ -399,5 +399,7 @@ object Solution { } ``` ------------------------ -
+

+ + + diff --git "a/problems/0143.\351\207\215\346\216\222\351\223\276\350\241\250.md" "b/problems/0143.\351\207\215\346\216\222\351\223\276\350\241\250.md" index c60fc0f968..0b3be9a0f1 100644 --- "a/problems/0143.\351\207\215\346\216\222\351\223\276\350\241\250.md" +++ "b/problems/0143.\351\207\215\346\216\222\351\223\276\350\241\250.md" @@ -1,6 +1,6 @@

- - + +

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

@@ -612,5 +612,7 @@ void reorderList(struct ListNode* head){ ``` ------------------------ -
+

+ + + diff --git "a/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" "b/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" index 802b5e3d90..108c654bfe 100644 --- "a/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" +++ "b/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" @@ -1,6 +1,6 @@

- - + +

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

@@ -424,5 +424,7 @@ object Solution { } ``` ------------------------ -
+

+ + + diff --git "a/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" "b/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" index be35c2f22b..450d7258f4 100644 --- "a/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" +++ "b/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" @@ -1,6 +1,6 @@

- - + +

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

@@ -923,5 +923,7 @@ pub fn remove_extra_spaces(s: &mut Vec) { } ``` ------------------------ -
+

+ + + diff --git "a/problems/0160.\347\233\270\344\272\244\351\223\276\350\241\250.md" "b/problems/0160.\347\233\270\344\272\244\351\223\276\350\241\250.md" index 03b102f77e..bf62ab30b5 100644 --- "a/problems/0160.\347\233\270\344\272\244\351\223\276\350\241\250.md" +++ "b/problems/0160.\347\233\270\344\272\244\351\223\276\350\241\250.md" @@ -1,9 +1,11 @@

- - + +

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

同:[链表:链表相交](https://programmercarl.com/面试题02.07.链表相交.html) ------------------------ -
+

+ + + diff --git "a/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" "b/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" index 8319fcba3c..26a0a7adab 100644 --- "a/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" +++ "b/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" @@ -1,6 +1,6 @@

- - + +

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

@@ -431,5 +431,7 @@ function maxProfit(k: number, prices: number[]): number { ------------------------ -
+

+ + + diff --git "a/problems/0189.\346\227\213\350\275\254\346\225\260\347\273\204.md" "b/problems/0189.\346\227\213\350\275\254\346\225\260\347\273\204.md" index 23092f9cb7..8a7b022797 100644 --- "a/problems/0189.\346\227\213\350\275\254\346\225\260\347\273\204.md" +++ "b/problems/0189.\346\227\213\350\275\254\346\225\260\347\273\204.md" @@ -1,6 +1,6 @@

- - + +

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

@@ -185,5 +185,7 @@ function reverseByRange(nums: number[], left: number, right: number): void { ------------------------ -
+

+ + + diff --git "a/problems/0198.\346\211\223\345\256\266\345\212\253\350\210\215.md" "b/problems/0198.\346\211\223\345\256\266\345\212\253\350\210\215.md" index 6428359cf5..2cc2f4fe95 100644 --- "a/problems/0198.\346\211\223\345\256\266\345\212\253\350\210\215.md" +++ "b/problems/0198.\346\211\223\345\256\266\345\212\253\350\210\215.md" @@ -1,6 +1,6 @@

- - + +

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

@@ -215,5 +215,7 @@ function rob(nums: number[]): number { ------------------------ -
+

+ + + diff --git "a/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\345\271\277\346\220\234\347\211\210.md" "b/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\345\271\277\346\220\234\347\211\210.md" index f70ea50c89..021cb6d202 100644 --- "a/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\345\271\277\346\220\234\347\211\210.md" +++ "b/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\345\271\277\346\220\234\347\211\210.md" @@ -1,3 +1,8 @@ +

+ + + +

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

# 200. 岛屿数量 @@ -191,3 +196,7 @@ class Solution { } } ``` +

+ + + diff --git "a/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\346\267\261\346\220\234\347\211\210.md" "b/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\346\267\261\346\220\234\347\211\210.md" index fcd0db9473..98bd5a63c5 100644 --- "a/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\346\267\261\346\220\234\347\211\210.md" +++ "b/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\346\267\261\346\220\234\347\211\210.md" @@ -1,3 +1,8 @@ +

+ + + +

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

# 200. 岛屿数量 @@ -168,4 +173,7 @@ public void dfs(char[][] grid, int i, int j){ dfs(grid,i,j + 1); dfs(grid,i,j - 1); } -``` \ No newline at end of file +

+ + + diff --git "a/problems/0202.\345\277\253\344\271\220\346\225\260.md" "b/problems/0202.\345\277\253\344\271\220\346\225\260.md" index d14ee7707e..1a7d53a343 100644 --- "a/problems/0202.\345\277\253\344\271\220\346\225\260.md" +++ "b/problems/0202.\345\277\253\344\271\220\346\225\260.md" @@ -1,6 +1,6 @@

- - + +

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

@@ -425,5 +425,7 @@ public class Solution { } } ``` ------------------------ -
+

+ + + diff --git "a/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" "b/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" index 5622fd1ca7..01a6d891cc 100644 --- "a/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" +++ "b/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" @@ -1,6 +1,6 @@

- - + +

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

@@ -569,5 +569,7 @@ class Solution { } } ``` ------------------------ -
+

+ + + diff --git "a/problems/0205.\345\220\214\346\236\204\345\255\227\347\254\246\344\270\262.md" "b/problems/0205.\345\220\214\346\236\204\345\255\227\347\254\246\344\270\262.md" index 43e2b0f07b..a507638c35 100644 --- "a/problems/0205.\345\220\214\346\236\204\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/0205.\345\220\214\346\236\204\345\255\227\347\254\246\344\270\262.md" @@ -1,6 +1,6 @@

- - + +

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

@@ -179,5 +179,7 @@ function isIsomorphic(s: string, t: string): boolean { ------------------------ -
+

+ + + diff --git "a/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md" "b/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md" index 009b446910..da674eef58 100644 --- "a/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md" +++ "b/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md" @@ -1,6 +1,6 @@

- - + +

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

@@ -628,5 +628,7 @@ impl Solution { } } ``` ------------------------ -
+

+ + + diff --git "a/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" "b/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" index 0bcd31e592..c912c259ec 100644 --- "a/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" +++ "b/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" @@ -1,6 +1,6 @@

- - + +

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

@@ -540,5 +540,7 @@ public class Solution { } } ``` ------------------------ -
+

+ + + diff --git "a/problems/0213.\346\211\223\345\256\266\345\212\253\350\210\215II.md" "b/problems/0213.\346\211\223\345\256\266\345\212\253\350\210\215II.md" index 7ae7aae039..8e1ca12647 100644 --- "a/problems/0213.\346\211\223\345\256\266\345\212\253\350\210\215II.md" +++ "b/problems/0213.\346\211\223\345\256\266\345\212\253\350\210\215II.md" @@ -1,6 +1,6 @@

- - + +

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

@@ -227,5 +227,7 @@ func max(a, b int) int { ------------------------ -
+

+ + + diff --git "a/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" "b/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" index ecd3a2c99a..3e3b886959 100644 --- "a/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" +++ "b/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" @@ -1,6 +1,6 @@

- - + +

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

@@ -613,5 +613,7 @@ object Solution { ------------------------ -
+

+ + + diff --git "a/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" "b/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" index eecc4dc170..6754864df1 100644 --- "a/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" +++ "b/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" @@ -1,6 +1,6 @@

- - + +

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

@@ -797,5 +797,7 @@ object Solution { } ``` ------------------------ -
+

+ + + diff --git "a/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" "b/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" index 4412a8199c..9aa8d8a119 100644 --- "a/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" +++ "b/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" @@ -1,6 +1,6 @@

- - + +

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

@@ -1051,5 +1051,7 @@ class MyStack { } } ``` ------------------------ -
+

+ + + diff --git "a/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" "b/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" index 61a760ce26..9c34ce20e3 100644 --- "a/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" @@ -1,6 +1,6 @@

- - + +

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

@@ -857,5 +857,7 @@ object Solution { } ``` ------------------------ -
+

+ + + diff --git "a/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" "b/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" index 7364e6c1e1..1ed0c5d62b 100644 --- "a/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" +++ "b/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" @@ -1,6 +1,6 @@

- - + +

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

@@ -622,5 +622,7 @@ class MyQueue() { } ``` ------------------------ -
+

+ + + diff --git "a/problems/0234.\345\233\236\346\226\207\351\223\276\350\241\250.md" "b/problems/0234.\345\233\236\346\226\207\351\223\276\350\241\250.md" index 1f5156239d..18b397e32f 100644 --- "a/problems/0234.\345\233\236\346\226\207\351\223\276\350\241\250.md" +++ "b/problems/0234.\345\233\236\346\226\207\351\223\276\350\241\250.md" @@ -1,6 +1,6 @@

- - + +

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

@@ -428,5 +428,7 @@ function reverseList(head: ListNode | null): ListNode | null { ------------------------ -
+

+ + + diff --git "a/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" "b/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" index 07e55ba580..ed65553f18 100644 --- "a/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" +++ "b/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" @@ -1,6 +1,6 @@

- - + +

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

@@ -421,5 +421,7 @@ object Solution { ``` ------------------------ -
+

+ + + diff --git "a/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" "b/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" index e982493fde..a34e8c2135 100644 --- "a/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" +++ "b/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" @@ -1,6 +1,6 @@

- - + +

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

@@ -384,5 +384,7 @@ object Solution { } ``` ------------------------ -
+

+ + + diff --git "a/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" "b/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" index 3f402f1203..b458bb5257 100644 --- "a/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" +++ "b/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" @@ -1,6 +1,6 @@

- - + +

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

@@ -799,5 +799,7 @@ class myDequeue{ } ``` ------------------------ -
+

+ + + diff --git "a/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" "b/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" index d54285ebad..556bf39a4f 100644 --- "a/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" +++ "b/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" @@ -1,6 +1,6 @@

- - + +

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

@@ -366,5 +366,7 @@ C#: * 438.找到字符串中所有字母异位词 ------------------------ -
+

+ + + diff --git "a/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" "b/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" index 579c214fa4..297acb6002 100644 --- "a/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" +++ "b/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" @@ -1,6 +1,6 @@

- - + +

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

@@ -795,5 +795,7 @@ object Solution { } ``` ------------------------ -
+

+ + + diff --git "a/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" "b/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" index e8ec98c6c7..7596da12df 100644 --- "a/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" +++ "b/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" @@ -1,6 +1,6 @@

- - + +

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

# 动态规划:一样的套路,再求一次完全平方数 @@ -374,5 +374,7 @@ function numSquares(n: number): number { ------------------------ -
+

+ + + diff --git "a/problems/0283.\347\247\273\345\212\250\351\233\266.md" "b/problems/0283.\347\247\273\345\212\250\351\233\266.md" index fe8e41c1a2..bf388def58 100644 --- "a/problems/0283.\347\247\273\345\212\250\351\233\266.md" +++ "b/problems/0283.\347\247\273\345\212\250\351\233\266.md" @@ -1,6 +1,6 @@

- - + +

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

@@ -155,5 +155,7 @@ function moveZeroes(nums: number[]): void { ------------------------ -
+

+ + + diff --git "a/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" "b/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" index 9e25689773..cae514fd2c 100644 --- "a/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" @@ -1,6 +1,6 @@

- - + +

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

@@ -267,5 +267,7 @@ function lengthOfLIS(nums: number[]): number { ------------------------ -
+

+ + + diff --git "a/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" "b/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" index 457721819e..0111037f8f 100644 --- "a/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" +++ "b/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" @@ -1,6 +1,6 @@

- - + +

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

@@ -388,5 +388,7 @@ function maxProfit(prices: number[]): number { ------------------------ -
+

+ + + diff --git "a/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" "b/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" index 03c6a4e228..7f2e698874 100644 --- "a/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" +++ "b/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" @@ -1,6 +1,6 @@

- - + +

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

# 动态规划: 给我个机会,我再兑换一次零钱 @@ -356,5 +356,7 @@ function coinChange(coins: number[], amount: number): number { }; ``` ------------------------ -
+

+ + + diff --git "a/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" "b/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" index 604d026154..90756d7d82 100644 --- "a/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" +++ "b/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" @@ -1,6 +1,6 @@

- - + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

@@ -807,5 +807,7 @@ impl Solution { } ``` ------------------------ -
+

+ + + diff --git "a/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" "b/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" index 704659885c..3b7e7cbf3b 100644 --- "a/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" +++ "b/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" @@ -1,6 +1,6 @@

- - + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

@@ -516,5 +516,7 @@ func max(a, b int) int { ------------------------ -
+

+ + + diff --git "a/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" "b/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" index 0a568b579e..00e6a9da08 100644 --- "a/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" +++ "b/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" @@ -1,6 +1,6 @@

- - + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

@@ -388,5 +388,7 @@ object Solution { } ``` ------------------------ -
+

+ + + diff --git "a/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" "b/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" index 5b3d72d8bd..f5b0e22bf6 100644 --- "a/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" @@ -1,6 +1,6 @@

- - + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

@@ -331,5 +331,7 @@ object Solution { } } ``` ------------------------ -
+

+ + + diff --git "a/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" "b/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" index 6c3bc00037..4745645538 100644 --- "a/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" +++ "b/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" @@ -1,6 +1,6 @@

- - + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

@@ -490,5 +490,7 @@ object Solution { ``` ------------------------ -
+

+ + + diff --git "a/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" "b/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" index 61eac6cd0f..153077edef 100644 --- "a/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" +++ "b/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" @@ -1,6 +1,6 @@

- - + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

@@ -411,5 +411,7 @@ C#: * 350.两个数组的交集 II ------------------------ -
+

+ + + diff --git "a/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" "b/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" index fef5e59411..214ff31102 100644 --- "a/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" +++ "b/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" @@ -1,6 +1,6 @@

- - + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

@@ -529,5 +529,7 @@ object Solution { } ``` ------------------------ -
+

+ + + diff --git "a/problems/0377.\347\273\204\345\220\210\346\200\273\345\222\214\342\205\243.md" "b/problems/0377.\347\273\204\345\220\210\346\200\273\345\222\214\342\205\243.md" index f8e544a927..4a84b2fa34 100644 --- "a/problems/0377.\347\273\204\345\220\210\346\200\273\345\222\214\342\205\243.md" +++ "b/problems/0377.\347\273\204\345\220\210\346\200\273\345\222\214\342\205\243.md" @@ -1,6 +1,6 @@

- - + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

@@ -260,5 +260,7 @@ impl Solution { ``` ------------------------ -
+

+ + + diff --git "a/problems/0383.\350\265\216\351\207\221\344\277\241.md" "b/problems/0383.\350\265\216\351\207\221\344\277\241.md" index 3cde547260..5745830808 100644 --- "a/problems/0383.\350\265\216\351\207\221\344\277\241.md" +++ "b/problems/0383.\350\265\216\351\207\221\344\277\241.md" @@ -1,6 +1,6 @@

- - + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

@@ -446,5 +446,7 @@ public bool CanConstruct(string ransomNote, string magazine) { } ``` ------------------------ -
+

+ + + diff --git "a/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" "b/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" index 9dbafe1902..1a0d4f8b10 100644 --- "a/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" @@ -1,6 +1,6 @@

- - + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

@@ -250,5 +250,7 @@ func isSubsequence(s string, t string) bool { ------------------------ -
+

+ + + diff --git "a/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" "b/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" index f9bdaa7cf9..6b6fe72940 100644 --- "a/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" +++ "b/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" @@ -1,6 +1,6 @@

- - + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

@@ -575,5 +575,7 @@ object Solution { } ``` ------------------------ -
+

+ + + diff --git "a/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" "b/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" index 75e0c40c22..2c5c7cd3c5 100644 --- "a/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" +++ "b/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" @@ -1,6 +1,6 @@

- - + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

@@ -397,5 +397,7 @@ object Solution { ``` ------------------------ -
+

+ + + diff --git "a/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" "b/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" index fa677da06e..db080203e9 100644 --- "a/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" +++ "b/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" @@ -1,6 +1,6 @@

- - + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

@@ -649,5 +649,7 @@ object Solution { } ``` ------------------------ -
+

+ + + diff --git "a/problems/0417.\345\244\252\345\271\263\346\264\213\345\244\247\350\245\277\346\264\213\346\260\264\346\265\201\351\227\256\351\242\230.md" "b/problems/0417.\345\244\252\345\271\263\346\264\213\345\244\247\350\245\277\346\264\213\346\260\264\346\265\201\351\227\256\351\242\230.md" index fa2f573f51..35fdc7d71b 100644 --- "a/problems/0417.\345\244\252\345\271\263\346\264\213\345\244\247\350\245\277\346\264\213\346\260\264\346\265\201\351\227\256\351\242\230.md" +++ "b/problems/0417.\345\244\252\345\271\263\346\264\213\345\244\247\350\245\277\346\264\213\346\260\264\346\265\201\351\227\256\351\242\230.md" @@ -1,3 +1,8 @@ +

+ + + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

# 417. 太平洋大西洋水流问题 [题目链接](https://leetcode.cn/problems/pacific-atlantic-water-flow/) @@ -203,3 +208,7 @@ for (int j = 0; j < m; j++) { ## 其他语言版本 +

+ + + diff --git "a/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" "b/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" index 6f88cad490..6ac29996d0 100644 --- "a/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" +++ "b/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" @@ -1,6 +1,6 @@

- - + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

@@ -396,5 +396,7 @@ impl Solution { ``` ------------------------ -
+

+ + + diff --git "a/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" "b/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" index 2d6d4ef2c6..4ae092a20c 100644 --- "a/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" +++ "b/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" @@ -1,6 +1,6 @@

- - + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

@@ -615,5 +615,7 @@ object Solution { } ``` ------------------------ -
+

+ + + diff --git "a/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" "b/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" index 91e340befe..c362726c31 100644 --- "a/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" +++ "b/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" @@ -1,6 +1,6 @@

- - + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

@@ -318,5 +318,7 @@ object Solution { } ``` ------------------------ -
+

+ + + diff --git "a/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" "b/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" index 45f27a1c8d..d9fd5c04c0 100644 --- "a/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" +++ "b/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" @@ -1,6 +1,6 @@

- - + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

@@ -390,5 +390,7 @@ public int FourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) { return res; } ``` ------------------------ -
+

+ + + diff --git "a/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" "b/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" index 93a4c2d342..eec471af34 100644 --- "a/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" +++ "b/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" @@ -1,6 +1,6 @@

- - + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

@@ -345,5 +345,7 @@ object Solution { } ``` ------------------------ -
+

+ + + diff --git "a/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" "b/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" index 69f71ee313..18de79d52d 100644 --- "a/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" @@ -1,6 +1,6 @@

- - + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

@@ -616,5 +616,7 @@ impl Solution { ``` ------------------------ -
+

+ + + diff --git "a/problems/0463.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" "b/problems/0463.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" index a881cd7cd2..2c3f2ec756 100644 --- "a/problems/0463.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" +++ "b/problems/0463.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" @@ -1,6 +1,6 @@

- - + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

# 463. 岛屿的周长 @@ -251,5 +251,7 @@ var islandPerimeter = function(grid) { ``` ------------------------ -
+

+ + + diff --git "a/problems/0474.\344\270\200\345\222\214\351\233\266.md" "b/problems/0474.\344\270\200\345\222\214\351\233\266.md" index 8ebe303da0..21fbf84bad 100644 --- "a/problems/0474.\344\270\200\345\222\214\351\233\266.md" +++ "b/problems/0474.\344\270\200\345\222\214\351\233\266.md" @@ -1,6 +1,6 @@

- - + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

# 动态规划:一和零! @@ -521,5 +521,7 @@ object Solution { } ``` ------------------------ -
+

+ + + diff --git "a/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" "b/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" index 6a92aa214d..e33a049de4 100644 --- "a/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" @@ -1,6 +1,6 @@

- - + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

@@ -607,5 +607,7 @@ object Solution { } ``` ------------------------ -
+

+ + + diff --git "a/problems/0494.\347\233\256\346\240\207\345\222\214.md" "b/problems/0494.\347\233\256\346\240\207\345\222\214.md" index f2656d41f6..7882229cf6 100644 --- "a/problems/0494.\347\233\256\346\240\207\345\222\214.md" +++ "b/problems/0494.\347\233\256\346\240\207\345\222\214.md" @@ -1,6 +1,6 @@

- - + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

# 动态规划:目标和! @@ -397,5 +397,7 @@ object Solution { } ``` ------------------------ -
+

+ + + diff --git "a/problems/0496.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240I.md" "b/problems/0496.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240I.md" index 31e6f230b7..b3109fccf8 100644 --- "a/problems/0496.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240I.md" +++ "b/problems/0496.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240I.md" @@ -1,6 +1,6 @@

- - + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

@@ -389,5 +389,7 @@ function nextGreaterElement(nums1: number[], nums2: number[]): number[] { ------------------------ -
+

+ + + diff --git "a/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" "b/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" index 6691941966..3c6362bf82 100644 --- "a/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" +++ "b/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" @@ -1,6 +1,6 @@

- - + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

@@ -877,5 +877,7 @@ object Solution { ``` ------------------------ -
+

+ + + diff --git "a/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" "b/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" index 0bd0fb82ef..e82f58d78c 100644 --- "a/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" +++ "b/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" @@ -1,6 +1,6 @@

- - + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

@@ -208,5 +208,7 @@ function nextGreaterElements(nums: number[]): number[] { ------------------------ -
+

+ + + diff --git "a/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" "b/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" index 4c9317bcb4..d3c58f4401 100644 --- "a/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" +++ "b/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" @@ -1,6 +1,6 @@

- - + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

@@ -410,5 +410,7 @@ public class Solution ------------------------ -
+

+ + + diff --git "a/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" "b/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" index 33c3033cd8..fd6e5d95f6 100644 --- "a/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" +++ "b/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" @@ -1,6 +1,6 @@

- - + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

@@ -587,5 +587,7 @@ object Solution { } ``` ------------------------ -
+

+ + + diff --git "a/problems/0516.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\345\272\217\345\210\227.md" "b/problems/0516.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\345\272\217\345\210\227.md" index 378f9b7401..fc97a9523b 100644 --- "a/problems/0516.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0516.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\345\272\217\345\210\227.md" @@ -1,6 +1,6 @@

- - + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

@@ -266,5 +266,7 @@ function longestPalindromeSubseq(s: string): number { ------------------------ -
+

+ + + diff --git "a/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" "b/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" index 3abb96015b..e5c8b25107 100644 --- "a/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" +++ "b/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" @@ -1,6 +1,6 @@

- - + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

# 动态规划:给你一些零钱,你要怎么凑? @@ -306,5 +306,7 @@ object Solution { } ``` ------------------------ -
+

+ + + diff --git "a/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" "b/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" index 811ae89c6d..ad4f46d86c 100644 --- "a/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" +++ "b/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" @@ -1,6 +1,6 @@

- - + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

@@ -515,5 +515,7 @@ object Solution { } ``` ------------------------ -
+

+ + + diff --git "a/problems/0538.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md" "b/problems/0538.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md" index 63c931d642..823771b1d7 100644 --- "a/problems/0538.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md" +++ "b/problems/0538.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md" @@ -1,6 +1,6 @@

- - + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

@@ -372,5 +372,7 @@ object Solution { ``` ------------------------ -
+

+ + + diff --git "a/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" "b/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" index 80692c0b86..3dd6b1e83b 100644 --- "a/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" +++ "b/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" @@ -1,6 +1,6 @@

- - + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

@@ -442,5 +442,7 @@ impl Solution { } ``` ------------------------ -
+

+ + + diff --git "a/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" "b/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" index c33f7f5884..6bc5042159 100644 --- "a/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" +++ "b/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" @@ -1,6 +1,6 @@

- - + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

@@ -315,5 +315,7 @@ function minDistance(word1: string, word2: string): number { ------------------------ -
+

+ + + diff --git "a/problems/0617.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md" "b/problems/0617.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md" index eb485afc21..db2d3762f1 100644 --- "a/problems/0617.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0617.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md" @@ -1,6 +1,6 @@

- - + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

@@ -692,5 +692,7 @@ object Solution { ``` ------------------------ -
+

+ + + diff --git "a/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" "b/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" index 69efe7d065..847a610f14 100644 --- "a/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" +++ "b/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" @@ -1,6 +1,6 @@

- - + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

@@ -464,5 +464,7 @@ function expandRange(s: string, left: number, right: number): number { ------------------------ -
+

+ + + diff --git "a/problems/0649.Dota2\345\217\202\350\256\256\351\231\242.md" "b/problems/0649.Dota2\345\217\202\350\256\256\351\231\242.md" index 3b61a9fe8c..a1420a66db 100644 --- "a/problems/0649.Dota2\345\217\202\350\256\256\351\231\242.md" +++ "b/problems/0649.Dota2\345\217\202\350\256\256\351\231\242.md" @@ -1,6 +1,6 @@

- - + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

@@ -283,5 +283,7 @@ function predictPartyVictory(senate: string): string { ------------------------ -
+

+ + + diff --git "a/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" "b/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" index 18739fdfe9..fda6437251 100644 --- "a/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" @@ -1,6 +1,6 @@

- - + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

@@ -509,5 +509,7 @@ object Solution { } ``` ------------------------ -
+

+ + + diff --git "a/problems/0657.\346\234\272\345\231\250\344\272\272\350\203\275\345\220\246\350\277\224\345\233\236\345\216\237\347\202\271.md" "b/problems/0657.\346\234\272\345\231\250\344\272\272\350\203\275\345\220\246\350\277\224\345\233\236\345\216\237\347\202\271.md" index 3d91a5c313..017c5ecce0 100644 --- "a/problems/0657.\346\234\272\345\231\250\344\272\272\350\203\275\345\220\246\350\277\224\345\233\236\345\216\237\347\202\271.md" +++ "b/problems/0657.\346\234\272\345\231\250\344\272\272\350\203\275\345\220\246\350\277\224\345\233\236\345\216\237\347\202\271.md" @@ -1,6 +1,6 @@

- - + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

@@ -150,5 +150,7 @@ var judgeCircle = function(moves) { ``` ------------------------ -
+

+ + + diff --git "a/problems/0669.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0669.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" index a286315d62..98af3c26ab 100644 --- "a/problems/0669.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" +++ "b/problems/0669.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" @@ -1,6 +1,6 @@

- - + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

@@ -470,5 +470,7 @@ object Solution { ``` ------------------------ -
+

+ + + diff --git "a/problems/0673.\346\234\200\351\225\277\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227\347\232\204\344\270\252\346\225\260.md" "b/problems/0673.\346\234\200\351\225\277\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227\347\232\204\344\270\252\346\225\260.md" index 8a6a2d4658..6418be8a55 100644 --- "a/problems/0673.\346\234\200\351\225\277\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227\347\232\204\344\270\252\346\225\260.md" +++ "b/problems/0673.\346\234\200\351\225\277\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227\347\232\204\344\270\252\346\225\260.md" @@ -1,6 +1,6 @@

- - + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

@@ -360,5 +360,7 @@ var findNumberOfLIS = function(nums) { ``` ------------------------ -
+

+ + + diff --git "a/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" "b/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" index c197e89789..410f5b7b17 100644 --- "a/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" +++ "b/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" @@ -1,6 +1,6 @@

- - + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

@@ -380,5 +380,7 @@ function findLengthOfLCIS(nums: number[]): number { ------------------------ -
+

+ + + diff --git "a/problems/0684.\345\206\227\344\275\231\350\277\236\346\216\245.md" "b/problems/0684.\345\206\227\344\275\231\350\277\236\346\216\245.md" index 3928e05106..e3002b65ef 100644 --- "a/problems/0684.\345\206\227\344\275\231\350\277\236\346\216\245.md" +++ "b/problems/0684.\345\206\227\344\275\231\350\277\236\346\216\245.md" @@ -1,6 +1,6 @@

- - + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

@@ -347,5 +347,7 @@ var findRedundantConnection = function(edges) { ------------------------ -
+

+ + + diff --git "a/problems/0685.\345\206\227\344\275\231\350\277\236\346\216\245II.md" "b/problems/0685.\345\206\227\344\275\231\350\277\236\346\216\245II.md" index a8da112449..5a0bd5d711 100644 --- "a/problems/0685.\345\206\227\344\275\231\350\277\236\346\216\245II.md" +++ "b/problems/0685.\345\206\227\344\275\231\350\277\236\346\216\245II.md" @@ -1,6 +1,6 @@

- - + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

@@ -600,5 +600,7 @@ var findRedundantDirectedConnection = function(edges) { ------------------------ -
+

+ + + diff --git "a/problems/0695.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" "b/problems/0695.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" index 447a374c48..414efe0b3e 100644 --- "a/problems/0695.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" +++ "b/problems/0695.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" @@ -1,3 +1,8 @@ +

+ + + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

# 695. 岛屿的最大面积 给你一个大小为 m x n 的二进制矩阵 grid 。 @@ -275,3 +280,7 @@ public int dfs(int[][] grid,int i,int j){ dfs(grid,i,j - 1); } ``` +

+ + + diff --git "a/problems/0700.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\220\234\347\264\242.md" "b/problems/0700.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\220\234\347\264\242.md" index 53c9136e4a..2ee2bdb0e3 100644 --- "a/problems/0700.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\220\234\347\264\242.md" +++ "b/problems/0700.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\220\234\347\264\242.md" @@ -1,6 +1,6 @@

- - + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

@@ -414,5 +414,7 @@ object Solution { } ``` ------------------------ -
+

+ + + diff --git "a/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" "b/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" index 06e1c88f4a..039c3b6ddd 100644 --- "a/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" +++ "b/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" @@ -1,6 +1,6 @@

- - + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

@@ -623,5 +623,7 @@ object Solution { ``` ------------------------ -
+

+ + + diff --git "a/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" "b/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" index b1eaf75a15..27af3f491c 100644 --- "a/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" +++ "b/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" @@ -1,6 +1,6 @@

- - + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

@@ -750,5 +750,7 @@ object Solution { ``` ------------------------ -
+

+ + + diff --git "a/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" "b/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" index 1f7e6cbfed..1264983b76 100644 --- "a/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" +++ "b/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" @@ -1,6 +1,6 @@

- - + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

@@ -1329,5 +1329,7 @@ impl MyLinkedList { } ``` ------------------------ -
+

+ + + diff --git "a/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271.md" "b/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271.md" index 824e7937c2..66fb9fb6af 100644 --- "a/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271.md" +++ "b/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271.md" @@ -1,6 +1,6 @@

- - + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

@@ -358,5 +358,7 @@ object Solution { } ``` ------------------------ -
+

+ + + diff --git "a/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" "b/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" index c573f00dd6..25c31668f8 100644 --- "a/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" +++ "b/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" @@ -1,6 +1,6 @@

- - + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

@@ -262,5 +262,7 @@ impl Solution { } ``` ------------------------ -
+

+ + + diff --git "a/problems/0718.\346\234\200\351\225\277\351\207\215\345\244\215\345\255\220\346\225\260\347\273\204.md" "b/problems/0718.\346\234\200\351\225\277\351\207\215\345\244\215\345\255\220\346\225\260\347\273\204.md" index d45f9111f7..a1ca92e3e4 100644 --- "a/problems/0718.\346\234\200\351\225\277\351\207\215\345\244\215\345\255\220\346\225\260\347\273\204.md" +++ "b/problems/0718.\346\234\200\351\225\277\351\207\215\345\244\215\345\255\220\346\225\260\347\273\204.md" @@ -1,6 +1,6 @@

- - + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

@@ -348,5 +348,7 @@ function findLength(nums1: number[], nums2: number[]): number { ------------------------ -
+

+ + + diff --git "a/problems/0724.\345\257\273\346\211\276\346\225\260\347\273\204\347\232\204\344\270\255\345\277\203\347\264\242\345\274\225.md" "b/problems/0724.\345\257\273\346\211\276\346\225\260\347\273\204\347\232\204\344\270\255\345\277\203\347\264\242\345\274\225.md" index 5a24a884f5..9ed8535e0d 100644 --- "a/problems/0724.\345\257\273\346\211\276\346\225\260\347\273\204\347\232\204\344\270\255\345\277\203\347\264\242\345\274\225.md" +++ "b/problems/0724.\345\257\273\346\211\276\346\225\260\347\273\204\347\232\204\344\270\255\345\277\203\347\264\242\345\274\225.md" @@ -1,6 +1,6 @@

- - + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

@@ -159,5 +159,7 @@ function pivotIndex(nums: number[]): number { ------------------------ -
+

+ + + diff --git "a/problems/0738.\345\215\225\350\260\203\351\200\222\345\242\236\347\232\204\346\225\260\345\255\227.md" "b/problems/0738.\345\215\225\350\260\203\351\200\222\345\242\236\347\232\204\346\225\260\345\255\227.md" index b452d02d19..896308271f 100644 --- "a/problems/0738.\345\215\225\350\260\203\351\200\222\345\242\236\347\232\204\346\225\260\345\255\227.md" +++ "b/problems/0738.\345\215\225\350\260\203\351\200\222\345\242\236\347\232\204\346\225\260\345\255\227.md" @@ -1,6 +1,6 @@

- - + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

@@ -299,5 +299,7 @@ impl Solution { } ``` ------------------------ -
+

+ + + diff --git "a/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" "b/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" index 4605de0924..38a4553372 100644 --- "a/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" +++ "b/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" @@ -1,6 +1,6 @@

- - + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

@@ -401,5 +401,7 @@ function dailyTemperatures(temperatures: number[]): number[] { ------------------------ -
+

+ + + diff --git "a/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" "b/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" index 4a4c0b6557..cec6f704a4 100644 --- "a/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" +++ "b/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" @@ -1,6 +1,6 @@

- - + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

@@ -391,5 +391,7 @@ public class Solution ------------------------ -
+

+ + + diff --git "a/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" "b/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" index a6066ebc67..65369d252a 100644 --- "a/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" +++ "b/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" @@ -1,6 +1,6 @@

- - + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

@@ -372,5 +372,7 @@ impl Solution { } ``` ------------------------ -
+

+ + + diff --git "a/problems/0797.\346\211\200\346\234\211\345\217\257\350\203\275\347\232\204\350\267\257\345\276\204.md" "b/problems/0797.\346\211\200\346\234\211\345\217\257\350\203\275\347\232\204\350\267\257\345\276\204.md" index 66376e3deb..c727af6ec0 100644 --- "a/problems/0797.\346\211\200\346\234\211\345\217\257\350\203\275\347\232\204\350\267\257\345\276\204.md" +++ "b/problems/0797.\346\211\200\346\234\211\345\217\257\350\203\275\347\232\204\350\267\257\345\276\204.md" @@ -1,3 +1,8 @@ +

+ + + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

看一下 算法4,深搜是怎么讲的 @@ -322,3 +327,7 @@ class Solution: ``` ### Go +

+ + + diff --git "a/problems/0827.\346\234\200\345\244\247\344\272\272\345\267\245\345\262\233.md" "b/problems/0827.\346\234\200\345\244\247\344\272\272\345\267\245\345\262\233.md" index 55d6c3972f..fb0c797eb6 100644 --- "a/problems/0827.\346\234\200\345\244\247\344\272\272\345\267\245\345\262\233.md" +++ "b/problems/0827.\346\234\200\345\244\247\344\272\272\345\267\245\345\262\233.md" @@ -1,3 +1,8 @@ +

+ + + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

# 827. 最大人工岛 给你一个大小为 n x n 二进制矩阵 grid 。最多 只能将一格 0 变成 1 。 @@ -166,3 +171,7 @@ public: } }; ``` +

+ + + diff --git "a/problems/0841.\351\222\245\345\214\231\345\222\214\346\210\277\351\227\264.md" "b/problems/0841.\351\222\245\345\214\231\345\222\214\346\210\277\351\227\264.md" index edef21c20c..0233a710a6 100644 --- "a/problems/0841.\351\222\245\345\214\231\345\222\214\346\210\277\351\227\264.md" +++ "b/problems/0841.\351\222\245\345\214\231\345\222\214\346\210\277\351\227\264.md" @@ -1,6 +1,6 @@

- - + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

@@ -387,5 +387,7 @@ var canVisitAllRooms = function(rooms) { ``` ------------------------ -
+

+ + + diff --git "a/problems/0844.\346\257\224\350\276\203\345\220\253\351\200\200\346\240\274\347\232\204\345\255\227\347\254\246\344\270\262.md" "b/problems/0844.\346\257\224\350\276\203\345\220\253\351\200\200\346\240\274\347\232\204\345\255\227\347\254\246\344\270\262.md" index 5d29ffb07b..6534f18c90 100644 --- "a/problems/0844.\346\257\224\350\276\203\345\220\253\351\200\200\346\240\274\347\232\204\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/0844.\346\257\224\350\276\203\345\220\253\351\200\200\346\240\274\347\232\204\345\255\227\347\254\246\344\270\262.md" @@ -1,6 +1,6 @@

- - + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

@@ -538,5 +538,7 @@ function getIndexAfterDel(s: string, startIndex: number): number { ------------------------ -
+

+ + + diff --git "a/problems/0860.\346\237\240\346\252\254\346\260\264\346\211\276\351\233\266.md" "b/problems/0860.\346\237\240\346\252\254\346\260\264\346\211\276\351\233\266.md" index 16b89ff70d..bc006f4584 100644 --- "a/problems/0860.\346\237\240\346\252\254\346\260\264\346\211\276\351\233\266.md" +++ "b/problems/0860.\346\237\240\346\252\254\346\260\264\346\211\276\351\233\266.md" @@ -1,6 +1,6 @@

- - + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

@@ -392,5 +392,7 @@ object Solution { ``` ------------------------ -
+

+ + + diff --git "a/problems/0922.\346\214\211\345\245\207\345\201\266\346\216\222\345\272\217\346\225\260\347\273\204II.md" "b/problems/0922.\346\214\211\345\245\207\345\201\266\346\216\222\345\272\217\346\225\260\347\273\204II.md" index 4e281a3cdf..c4654f16d1 100644 --- "a/problems/0922.\346\214\211\345\245\207\345\201\266\346\216\222\345\272\217\346\225\260\347\273\204II.md" +++ "b/problems/0922.\346\214\211\345\245\207\345\201\266\346\216\222\345\272\217\346\225\260\347\273\204II.md" @@ -1,6 +1,6 @@

- - + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

@@ -380,8 +380,7 @@ function sortArrayByParityII(nums: number[]): number[] { }; ``` - - - ------------------------ -
+

+ + + diff --git "a/problems/0925.\351\225\277\346\214\211\351\224\256\345\205\245.md" "b/problems/0925.\351\225\277\346\214\211\351\224\256\345\205\245.md" index 3924c181ad..11edecd0d1 100644 --- "a/problems/0925.\351\225\277\346\214\211\351\224\256\345\205\245.md" +++ "b/problems/0925.\351\225\277\346\214\211\351\224\256\345\205\245.md" @@ -1,6 +1,6 @@

- - + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

@@ -227,5 +227,7 @@ function isLongPressedName(name: string, typed: string): boolean { ------------------------ -
+

+ + + diff --git "a/problems/0941.\346\234\211\346\225\210\347\232\204\345\261\261\350\204\211\346\225\260\347\273\204.md" "b/problems/0941.\346\234\211\346\225\210\347\232\204\345\261\261\350\204\211\346\225\260\347\273\204.md" index fb7935a8c3..f43a210837 100644 --- "a/problems/0941.\346\234\211\346\225\210\347\232\204\345\261\261\350\204\211\346\225\260\347\273\204.md" +++ "b/problems/0941.\346\234\211\346\225\210\347\232\204\345\261\261\350\204\211\346\225\260\347\273\204.md" @@ -1,6 +1,6 @@

- - + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

@@ -197,5 +197,7 @@ public class Solution { ``` ------------------------ -
+

+ + + diff --git "a/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" "b/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" index 717112a73a..e4a0512a37 100644 --- "a/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" @@ -1,6 +1,6 @@

- - + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

@@ -579,5 +579,7 @@ object Solution { } ``` ------------------------ -
+

+ + + diff --git "a/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" "b/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" index 8b260ad4f8..b889005232 100644 --- "a/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" +++ "b/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" @@ -1,6 +1,6 @@

- - + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

@@ -474,5 +474,7 @@ public class Solution { } } ``` ------------------------ -
+

+ + + diff --git "a/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md" "b/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md" index 6f54c0986a..78eb19891e 100644 --- "a/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md" +++ "b/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md" @@ -1,6 +1,6 @@

- - + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

@@ -451,5 +451,7 @@ object Solution { } } ``` ------------------------ -
+

+ + + diff --git "a/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" "b/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" index 9d82bf9fd3..09ff38e918 100644 --- "a/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" +++ "b/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" @@ -1,6 +1,6 @@

- - + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

@@ -339,5 +339,7 @@ object Solution { ------------------------ -
+

+ + + diff --git "a/problems/1020.\351\243\236\345\234\260\347\232\204\346\225\260\351\207\217.md" "b/problems/1020.\351\243\236\345\234\260\347\232\204\346\225\260\351\207\217.md" index 4095fe9d84..8b54d7f1c0 100644 --- "a/problems/1020.\351\243\236\345\234\260\347\232\204\346\225\260\351\207\217.md" +++ "b/problems/1020.\351\243\236\345\234\260\347\232\204\346\225\260\351\207\217.md" @@ -1,3 +1,8 @@ +

+ + + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

# 1020. 飞地的数量 @@ -137,3 +142,7 @@ public: } }; ``` +

+ + + diff --git "a/problems/1035.\344\270\215\347\233\270\344\272\244\347\232\204\347\272\277.md" "b/problems/1035.\344\270\215\347\233\270\344\272\244\347\232\204\347\272\277.md" index d97f495a92..6742c8d90a 100644 --- "a/problems/1035.\344\270\215\347\233\270\344\272\244\347\232\204\347\272\277.md" +++ "b/problems/1035.\344\270\215\347\233\270\344\272\244\347\232\204\347\272\277.md" @@ -1,6 +1,6 @@

- - + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

@@ -210,5 +210,7 @@ function maxUncrossedLines(nums1: number[], nums2: number[]): number { }; ``` ------------------------ -
+

+ + + diff --git "a/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" "b/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" index e22c747a48..849b5e7904 100644 --- "a/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" +++ "b/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" @@ -1,6 +1,6 @@

- - + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

@@ -447,5 +447,7 @@ object Solution { } ``` ------------------------ -
+

+ + + diff --git "a/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" "b/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" index 728ae83e82..5412c5b594 100644 --- "a/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" +++ "b/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" @@ -1,6 +1,6 @@

- - + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

@@ -370,5 +370,7 @@ object Solution { ------------------------ -
+

+ + + diff --git "a/problems/1143.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" "b/problems/1143.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" index 097dc6e68a..713d6912a2 100644 --- "a/problems/1143.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/1143.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" @@ -1,6 +1,6 @@

- - + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

@@ -307,5 +307,7 @@ function longestCommonSubsequence(text1: string, text2: string): number { ------------------------ -
+

+ + + diff --git "a/problems/1207.\347\213\254\344\270\200\346\227\240\344\272\214\347\232\204\345\207\272\347\216\260\346\254\241\346\225\260.md" "b/problems/1207.\347\213\254\344\270\200\346\227\240\344\272\214\347\232\204\345\207\272\347\216\260\346\254\241\346\225\260.md" index 5298f5becb..afc93edab9 100644 --- "a/problems/1207.\347\213\254\344\270\200\346\227\240\344\272\214\347\232\204\345\207\272\347\216\260\346\254\241\346\225\260.md" +++ "b/problems/1207.\347\213\254\344\270\200\346\227\240\344\272\214\347\232\204\345\207\272\347\216\260\346\254\241\346\225\260.md" @@ -1,6 +1,6 @@

- - + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

@@ -184,5 +184,7 @@ function uniqueOccurrences(arr: number[]): boolean { ------------------------ -
+

+ + + diff --git "a/problems/1221.\345\210\206\345\211\262\345\271\263\350\241\241\345\255\227\347\254\246\344\270\262.md" "b/problems/1221.\345\210\206\345\211\262\345\271\263\350\241\241\345\255\227\347\254\246\344\270\262.md" index 857df7efa0..94d7bca86c 100644 --- "a/problems/1221.\345\210\206\345\211\262\345\271\263\350\241\241\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/1221.\345\210\206\345\211\262\345\271\263\350\241\241\345\255\227\347\254\246\344\270\262.md" @@ -1,6 +1,6 @@

- - + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

@@ -157,5 +157,7 @@ var balancedStringSplit = function(s) { ``` ------------------------ -
+

+ + + diff --git "a/problems/1254.\347\273\237\350\256\241\345\260\201\351\227\255\345\262\233\345\261\277\347\232\204\346\225\260\347\233\256.md" "b/problems/1254.\347\273\237\350\256\241\345\260\201\351\227\255\345\262\233\345\261\277\347\232\204\346\225\260\347\233\256.md" index 38e93d311e..b70cd496f6 100644 --- "a/problems/1254.\347\273\237\350\256\241\345\260\201\351\227\255\345\262\233\345\261\277\347\232\204\346\225\260\347\233\256.md" +++ "b/problems/1254.\347\273\237\350\256\241\345\260\201\351\227\255\345\262\233\345\261\277\347\232\204\346\225\260\347\233\256.md" @@ -1,3 +1,8 @@ +

+ + + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

# 1254. 统计封闭岛屿的数目 @@ -72,3 +77,7 @@ public: } }; ``` +

+ + + diff --git "a/problems/1356.\346\240\271\346\215\256\346\225\260\345\255\227\344\272\214\350\277\233\345\210\266\344\270\2131\347\232\204\346\225\260\347\233\256\346\216\222\345\272\217.md" "b/problems/1356.\346\240\271\346\215\256\346\225\260\345\255\227\344\272\214\350\277\233\345\210\266\344\270\2131\347\232\204\346\225\260\347\233\256\346\216\222\345\272\217.md" index e97748cbcb..b898b7f25c 100644 --- "a/problems/1356.\346\240\271\346\215\256\346\225\260\345\255\227\344\272\214\350\277\233\345\210\266\344\270\2131\347\232\204\346\225\260\347\233\256\346\216\222\345\272\217.md" +++ "b/problems/1356.\346\240\271\346\215\256\346\225\260\345\255\227\344\272\214\350\277\233\345\210\266\344\270\2131\347\232\204\346\225\260\347\233\256\346\216\222\345\272\217.md" @@ -1,6 +1,6 @@

- - + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

@@ -223,5 +223,7 @@ var sortByBits = function(arr) { ``` ------------------------ -
+

+ + + diff --git "a/problems/1365.\346\234\211\345\244\232\345\260\221\345\260\217\344\272\216\345\275\223\345\211\215\346\225\260\345\255\227\347\232\204\346\225\260\345\255\227.md" "b/problems/1365.\346\234\211\345\244\232\345\260\221\345\260\217\344\272\216\345\275\223\345\211\215\346\225\260\345\255\227\347\232\204\346\225\260\345\255\227.md" index 3aaadf6d8c..7c26876957 100644 --- "a/problems/1365.\346\234\211\345\244\232\345\260\221\345\260\217\344\272\216\345\275\223\345\211\215\346\225\260\345\255\227\347\232\204\346\225\260\345\255\227.md" +++ "b/problems/1365.\346\234\211\345\244\232\345\260\221\345\260\217\344\272\216\345\275\223\345\211\215\346\225\260\345\255\227\347\232\204\346\225\260\345\255\227.md" @@ -1,6 +1,6 @@

- - + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

@@ -259,5 +259,7 @@ function smallerNumbersThanCurrent(nums: number[]): number[] { ------------------------ -
+

+ + + diff --git "a/problems/1382.\345\260\206\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\345\217\230\345\271\263\350\241\241.md" "b/problems/1382.\345\260\206\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\345\217\230\345\271\263\350\241\241.md" index 7d983fbb1f..0f81745c36 100644 --- "a/problems/1382.\345\260\206\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\345\217\230\345\271\263\350\241\241.md" +++ "b/problems/1382.\345\260\206\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\345\217\230\345\271\263\350\241\241.md" @@ -1,6 +1,6 @@

- - + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

@@ -214,5 +214,7 @@ function buildTree(arr: number[], left: number, right: number): TreeNode | null ------------------------ -
+

+ + + diff --git "a/problems/1791.\346\211\276\345\207\272\346\230\237\345\236\213\345\233\276\347\232\204\344\270\255\345\277\203\350\212\202\347\202\271.md" "b/problems/1791.\346\211\276\345\207\272\346\230\237\345\236\213\345\233\276\347\232\204\344\270\255\345\277\203\350\212\202\347\202\271.md" index 57777fd764..d44c14769e 100644 --- "a/problems/1791.\346\211\276\345\207\272\346\230\237\345\236\213\345\233\276\347\232\204\344\270\255\345\277\203\350\212\202\347\202\271.md" +++ "b/problems/1791.\346\211\276\345\207\272\346\230\237\345\236\213\345\233\276\347\232\204\344\270\255\345\277\203\350\212\202\347\202\271.md" @@ -1,3 +1,8 @@ +

+ + + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

# 1791.找出星型图的中心节点 [题目链接](https://leetcode.cn/problems/find-center-of-star-graph/) @@ -71,3 +76,7 @@ public: ``` +

+ + + diff --git "a/problems/1971.\345\257\273\346\211\276\345\233\276\344\270\255\346\230\257\345\220\246\345\255\230\345\234\250\350\267\257\345\276\204.md" "b/problems/1971.\345\257\273\346\211\276\345\233\276\344\270\255\346\230\257\345\220\246\345\255\230\345\234\250\350\267\257\345\276\204.md" index bf1e93cf0d..3969456784 100644 --- "a/problems/1971.\345\257\273\346\211\276\345\233\276\344\270\255\346\230\257\345\220\246\345\255\230\345\234\250\350\267\257\345\276\204.md" +++ "b/problems/1971.\345\257\273\346\211\276\345\233\276\344\270\255\346\230\257\345\220\246\345\255\230\345\234\250\350\267\257\345\276\204.md" @@ -1,3 +1,8 @@ +

+ + + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

# 1971. 寻找图中是否存在路径 [题目链接](https://leetcode.cn/problems/find-if-path-exists-in-graph/) @@ -121,3 +126,7 @@ public: } }; ``` +

+ + + diff --git "a/problems/O(n)\347\232\204\347\256\227\346\263\225\345\261\205\347\204\266\350\266\205\346\227\266\344\272\206\357\274\214\346\255\244\346\227\266\347\232\204n\347\251\266\347\253\237\346\230\257\345\244\232\345\244\247\357\274\237.md" "b/problems/O(n)\347\232\204\347\256\227\346\263\225\345\261\205\347\204\266\350\266\205\346\227\266\344\272\206\357\274\214\346\255\244\346\227\266\347\232\204n\347\251\266\347\253\237\346\230\257\345\244\232\345\244\247\357\274\237.md" index 24302b2dd9..c2854ca84f 100644 --- "a/problems/O(n)\347\232\204\347\256\227\346\263\225\345\261\205\347\204\266\350\266\205\346\227\266\344\272\206\357\274\214\346\255\244\346\227\266\347\232\204n\347\251\266\347\253\237\346\230\257\345\244\232\345\244\247\357\274\237.md" +++ "b/problems/O(n)\347\232\204\347\256\227\346\263\225\345\261\205\347\204\266\350\266\205\346\227\266\344\272\206\357\274\214\346\255\244\346\227\266\347\232\204n\347\251\266\347\253\237\346\230\257\345\244\232\345\244\247\357\274\237.md" @@ -1,6 +1,6 @@

- - + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

# 程序提交之后为什么会超时?O(n)的算法会超时,n究竟是多大? @@ -229,5 +229,7 @@ Go: ------------------------ -
+

+ + + diff --git a/problems/toolgithub.sh b/problems/toolgithub.sh new file mode 100644 index 0000000000..ebe9c7df7d --- /dev/null +++ b/problems/toolgithub.sh @@ -0,0 +1,56 @@ +######################################################################### + +# File Name: toolgithub.sh +# Author: 程序员Carl +# mail: programmercarl@163.com +# Created Time: Sat Oct 15 16:36:23 2022 +######################################################################### +#!/bin/bash + +for i in *.md +do + if [[ $i != 'README.md' ]] + then + # 移除开头 + # sed -i '' '/align/d;/\"\"><\/a>/d;/<\/p>/d;/<\/a>/d;/20210924105952.png/d;/_blank/d' $i + # # 移除结尾 + # sed -i '' '/--------------/d;/训练营/d;' $i + # # 添加开头 + # # 记得从后向前添加 + # ex -sc '1i|

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

' -cx $i + # ex -sc '1i|' -cx $i + # ex -sc '1i| ' -cx $i + # ex -sc '1i|' -cx $i + # ex -sc '1i|

' -cx $i + # echo '## 其他语言版本' >> $i + # echo '\n' >> $i + # echo 'Java:' >> $i + # echo '\n' >> $i + # echo 'Python:' >> $i + # echo '\n' >> $i + # echo 'Go:' >> $i + # echo '\n' >> $i + # echo '\n' >> $i + + # 添加结尾 + + echo '

' >> $i + echo '' >> $i + echo ' ' >> $i + echo '' >> $i + + # echo '-----------------------' >> $i + + # echo '

' >> $i + fi +done + +#

+# +# +# + +#

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+ + + diff --git "a/problems/\344\270\272\344\272\206\347\273\235\346\235\200\347\274\226\350\276\221\350\267\235\347\246\273\357\274\214\345\215\241\345\260\224\345\201\232\344\272\206\344\270\211\346\255\245\351\223\272\345\236\253.md" "b/problems/\344\270\272\344\272\206\347\273\235\346\235\200\347\274\226\350\276\221\350\267\235\347\246\273\357\274\214\345\215\241\345\260\224\345\201\232\344\272\206\344\270\211\346\255\245\351\223\272\345\236\253.md" index ef2c30f0c6..b8adffc775 100644 --- "a/problems/\344\270\272\344\272\206\347\273\235\346\235\200\347\274\226\350\276\221\350\267\235\347\246\273\357\274\214\345\215\241\345\260\224\345\201\232\344\272\206\344\270\211\346\255\245\351\223\272\345\236\253.md" +++ "b/problems/\344\270\272\344\272\206\347\273\235\346\235\200\347\274\226\350\276\221\350\267\235\347\246\273\357\274\214\345\215\241\345\260\224\345\201\232\344\272\206\344\270\211\346\255\245\351\223\272\345\236\253.md" @@ -1,6 +1,6 @@

- - + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

@@ -201,5 +201,7 @@ Go: ------------------------ -
+

+ + + diff --git "a/problems/\344\272\214\345\217\211\346\240\221\344\270\255\351\200\222\345\275\222\345\270\246\347\235\200\345\233\236\346\272\257.md" "b/problems/\344\272\214\345\217\211\346\240\221\344\270\255\351\200\222\345\275\222\345\270\246\347\235\200\345\233\236\346\272\257.md" index 1e9f9cbf7c..e35a521494 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\344\270\255\351\200\222\345\275\222\345\270\246\347\235\200\345\233\236\346\272\257.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\344\270\255\351\200\222\345\275\222\345\270\246\347\235\200\345\233\236\346\272\257.md" @@ -1,6 +1,6 @@

- - + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

@@ -618,5 +618,7 @@ func _binaryTreePaths3(_ root: TreeNode, res: inout [String], paths: inout [Int] ``` ------------------------ -
+

+ + + diff --git "a/problems/\344\272\214\345\217\211\346\240\221\346\200\273\347\273\223\347\257\207.md" "b/problems/\344\272\214\345\217\211\346\240\221\346\200\273\347\273\223\347\257\207.md" index 73faffa6c5..4c742a6bbf 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\346\200\273\347\273\223\347\257\207.md" @@ -1,6 +1,6 @@

- - + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

@@ -176,5 +176,7 @@ Go: ------------------------ -
+

+ + + diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" index f1c3c08bb1..e377626c8b 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -1,6 +1,6 @@

- - + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

@@ -270,5 +270,7 @@ class TreeNode(_value: Int = 0, _left: TreeNode = null, _right: TreeNode = null) var right: TreeNode = _right } ``` ------------------------ -
+

+ + + diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\347\273\237\344\270\200\350\277\255\344\273\243\346\263\225.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\347\273\237\344\270\200\350\277\255\344\273\243\346\263\225.md" index 9ca6ac39c9..030d3ae19e 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\347\273\237\344\270\200\350\277\255\344\273\243\346\263\225.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\347\273\237\344\270\200\350\277\255\344\273\243\346\263\225.md" @@ -1,6 +1,6 @@

- - + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

@@ -666,5 +666,7 @@ object Solution { } } ``` ------------------------ -
+

+ + + diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" index 0aa12432db..a20f11cbab 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" @@ -1,6 +1,6 @@

- - + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

@@ -640,5 +640,7 @@ object Solution { } } ``` ------------------------ -
+

+ + + diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" index dc39295c7f..03304cafee 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" @@ -1,6 +1,6 @@

- - + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

@@ -525,5 +525,7 @@ object Solution { } } ``` ------------------------ -
+

+ + + diff --git "a/problems/\345\205\263\344\272\216\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\214\344\275\240\344\270\215\347\237\245\351\201\223\347\232\204\351\203\275\345\234\250\350\277\231\351\207\214\357\274\201.md" "b/problems/\345\205\263\344\272\216\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\214\344\275\240\344\270\215\347\237\245\351\201\223\347\232\204\351\203\275\345\234\250\350\277\231\351\207\214\357\274\201.md" index a0fd6d924b..246294ede0 100644 --- "a/problems/\345\205\263\344\272\216\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\214\344\275\240\344\270\215\347\237\245\351\201\223\347\232\204\351\203\275\345\234\250\350\277\231\351\207\214\357\274\201.md" +++ "b/problems/\345\205\263\344\272\216\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\214\344\275\240\344\270\215\347\237\245\351\201\223\347\232\204\351\203\275\345\234\250\350\277\231\351\207\214\357\274\201.md" @@ -1,6 +1,6 @@

- - + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

@@ -171,5 +171,7 @@ Go: ------------------------ -
+

+ + + diff --git "a/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" "b/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" index 7a2712ef3b..53f0315ff8 100644 --- "a/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" +++ "b/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" @@ -1,6 +1,6 @@

- - + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

@@ -538,5 +538,7 @@ impl Solution { ``` ------------------------ -
+

+ + + diff --git "a/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" "b/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" index b14c26cc86..c34b2a7183 100644 --- "a/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" @@ -1,6 +1,6 @@

- - + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

@@ -398,5 +398,7 @@ impl Solution { ------------------------ -
+

+ + + diff --git "a/problems/\345\212\250\346\200\201\350\247\204\345\210\222-\350\202\241\347\245\250\351\227\256\351\242\230\346\200\273\347\273\223\347\257\207.md" "b/problems/\345\212\250\346\200\201\350\247\204\345\210\222-\350\202\241\347\245\250\351\227\256\351\242\230\346\200\273\347\273\223\347\257\207.md" index 366810e583..2b04b7b085 100644 --- "a/problems/\345\212\250\346\200\201\350\247\204\345\210\222-\350\202\241\347\245\250\351\227\256\351\242\230\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/\345\212\250\346\200\201\350\247\204\345\210\222-\350\202\241\347\245\250\351\227\256\351\242\230\346\200\273\347\273\223\347\257\207.md" @@ -1,6 +1,6 @@

- - + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

@@ -485,5 +485,7 @@ Go: ------------------------ -
+

+ + + diff --git "a/problems/\345\212\250\346\200\201\350\247\204\345\210\222\346\200\273\347\273\223\347\257\207.md" "b/problems/\345\212\250\346\200\201\350\247\204\345\210\222\346\200\273\347\273\223\347\257\207.md" index 45bd391693..cf604d5d71 100644 --- "a/problems/\345\212\250\346\200\201\350\247\204\345\210\222\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/\345\212\250\346\200\201\350\247\204\345\210\222\346\200\273\347\273\223\347\257\207.md" @@ -1,6 +1,6 @@

- - + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

@@ -137,5 +137,7 @@ ------------------------ -
+

+ + + diff --git "a/problems/\345\212\250\346\200\201\350\247\204\345\210\222\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\345\212\250\346\200\201\350\247\204\345\210\222\347\220\206\350\256\272\345\237\272\347\241\200.md" index 66971fced3..77f01b1393 100644 --- "a/problems/\345\212\250\346\200\201\350\247\204\345\210\222\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\345\212\250\346\200\201\350\247\204\345\210\222\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -1,6 +1,6 @@

- - + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

@@ -126,5 +126,7 @@ 今天我们开始新的征程了,你准备好了么? ------------------------ -
+

+ + + diff --git "a/problems/\345\217\214\346\214\207\351\222\210\346\200\273\347\273\223.md" "b/problems/\345\217\214\346\214\207\351\222\210\346\200\273\347\273\223.md" index 5abcec53da..04a8cb9af8 100644 --- "a/problems/\345\217\214\346\214\207\351\222\210\346\200\273\347\273\223.md" +++ "b/problems/\345\217\214\346\214\207\351\222\210\346\200\273\347\273\223.md" @@ -1,6 +1,6 @@

- - + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

@@ -94,5 +94,7 @@ for (int i = 0; i < array.size(); i++) { 建议大家可以把文中涉及到的题目在好好做一做,琢磨琢磨,基本对双指针法就不在话下了。 ------------------------ -
+

+ + + diff --git "a/problems/\345\223\210\345\270\214\350\241\250\346\200\273\347\273\223.md" "b/problems/\345\223\210\345\270\214\350\241\250\346\200\273\347\273\223.md" index bbec31d7b0..9ee84f991b 100644 --- "a/problems/\345\223\210\345\270\214\350\241\250\346\200\273\347\273\223.md" +++ "b/problems/\345\223\210\345\270\214\350\241\250\346\200\273\347\273\223.md" @@ -1,6 +1,6 @@

- - + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

@@ -125,5 +125,7 @@ std::unordered_map 底层实现为哈希,std::map 和std::multimap 的底层 ------------------------ -
+

+ + + diff --git "a/problems/\345\223\210\345\270\214\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\345\223\210\345\270\214\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" index 3b6c5ce549..9366ca5ca6 100644 --- "a/problems/\345\223\210\345\270\214\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\345\223\210\345\270\214\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -1,6 +1,6 @@

- - + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

@@ -127,5 +127,7 @@ std::unordered_map 底层实现为哈希表,std::map 和std::multimap 的底 ------------------------ -
+

+ + + diff --git "a/problems/\345\233\236\346\272\257\346\200\273\347\273\223.md" "b/problems/\345\233\236\346\272\257\346\200\273\347\273\223.md" index 54ac485b3d..58fb42f841 100644 --- "a/problems/\345\233\236\346\272\257\346\200\273\347\273\223.md" +++ "b/problems/\345\233\236\346\272\257\346\200\273\347\273\223.md" @@ -1,6 +1,6 @@

- - + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

@@ -437,5 +437,7 @@ N皇后问题分析: **回溯算法系列正式结束,新的系列终将开始,录友们准备开启新的征程!** ------------------------ -
+

+ + + diff --git "a/problems/\345\233\236\346\272\257\347\256\227\346\263\225\345\216\273\351\207\215\351\227\256\351\242\230\347\232\204\345\217\246\344\270\200\347\247\215\345\206\231\346\263\225.md" "b/problems/\345\233\236\346\272\257\347\256\227\346\263\225\345\216\273\351\207\215\351\227\256\351\242\230\347\232\204\345\217\246\344\270\200\347\247\215\345\206\231\346\263\225.md" index c7bf24bc4a..7386215681 100644 --- "a/problems/\345\233\236\346\272\257\347\256\227\346\263\225\345\216\273\351\207\215\351\227\256\351\242\230\347\232\204\345\217\246\344\270\200\347\247\215\345\206\231\346\263\225.md" +++ "b/problems/\345\233\236\346\272\257\347\256\227\346\263\225\345\216\273\351\207\215\351\227\256\351\242\230\347\232\204\345\217\246\344\270\200\347\247\215\345\206\231\346\263\225.md" @@ -1,6 +1,6 @@

- - + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

@@ -530,5 +530,7 @@ Go: ------------------------ -
+

+ + + diff --git "a/problems/\345\233\236\346\272\257\347\256\227\346\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\345\233\236\346\272\257\347\256\227\346\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md" index 7061667d3b..aba21fa0b7 100644 --- "a/problems/\345\233\236\346\272\257\347\256\227\346\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\345\233\236\346\272\257\347\256\227\346\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -1,6 +1,6 @@

- - + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

@@ -169,5 +169,7 @@ void backtracking(参数) { ------------------------ -
+

+ + + diff --git "a/problems/\345\233\276\350\256\272\345\271\277\347\264\242\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\345\233\276\350\256\272\345\271\277\347\264\242\347\220\206\350\256\272\345\237\272\347\241\200.md" index a584adb2a3..0252553b89 100644 --- "a/problems/\345\233\276\350\256\272\345\271\277\347\264\242\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\345\233\276\350\256\272\345\271\277\347\264\242\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -1,3 +1,8 @@ +

+ + + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

# 广度优先搜索理论基础 @@ -119,3 +124,7 @@ if (!visited[nextx][nexty] && grid[nextx][nexty] == '1') { // 如果节点没被 相信看完本篇,大家会对广搜有一个基础性的认识,后面再来做对应的题目就会得心应手一些。 +

+ + + diff --git "a/problems/\345\233\276\350\256\272\346\267\261\346\220\234\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\345\233\276\350\256\272\346\267\261\346\220\234\347\220\206\350\256\272\345\237\272\347\241\200.md" index 28ec636ffc..cd66b819ed 100644 --- "a/problems/\345\233\276\350\256\272\346\267\261\346\220\234\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\345\233\276\350\256\272\346\267\261\346\220\234\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -1,3 +1,8 @@ +

+ + + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

# 深度优先搜索理论基础 @@ -185,3 +190,7 @@ for (选择:本节点所连接的其他节点) { 以上如果大家都能理解了,其实搜索的代码就很好写,具体题目套用具体场景就可以了。 +

+ + + diff --git "a/problems/\345\255\227\347\254\246\344\270\262\346\200\273\347\273\223.md" "b/problems/\345\255\227\347\254\246\344\270\262\346\200\273\347\273\223.md" index 1993b44b5e..c12d1764ad 100644 --- "a/problems/\345\255\227\347\254\246\344\270\262\346\200\273\347\273\223.md" +++ "b/problems/\345\255\227\347\254\246\344\270\262\346\200\273\347\273\223.md" @@ -1,6 +1,6 @@

- - + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

@@ -124,5 +124,7 @@ KMP算法是字符串查找最重要的算法,但彻底理解KMP并不容易 ------------------------ -
+

+ + + diff --git "a/problems/\346\225\260\347\273\204\346\200\273\347\273\223\347\257\207.md" "b/problems/\346\225\260\347\273\204\346\200\273\347\273\223\347\257\207.md" index 6d7603fd63..ef962187fe 100644 --- "a/problems/\346\225\260\347\273\204\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/\346\225\260\347\273\204\346\200\273\347\273\223\347\257\207.md" @@ -1,6 +1,6 @@

- - + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

@@ -128,5 +128,7 @@ 推荐的题目即使大家之前做过了,再读一遍文章,也会帮助你提炼出解题的精髓所在。 ------------------------ -
+

+ + + diff --git "a/problems/\346\225\260\347\273\204\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\346\225\260\347\273\204\347\220\206\350\256\272\345\237\272\347\241\200.md" index 93167255fd..c49e9ec89e 100644 --- "a/problems/\346\225\260\347\273\204\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\346\225\260\347\273\204\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -1,6 +1,6 @@

- - + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

@@ -118,5 +118,7 @@ public static void test_arr() { ------------------------ -
+

+ + + diff --git "a/problems/\346\240\210\344\270\216\351\230\237\345\210\227\346\200\273\347\273\223.md" "b/problems/\346\240\210\344\270\216\351\230\237\345\210\227\346\200\273\347\273\223.md" index 15093ca703..c313220165 100644 --- "a/problems/\346\240\210\344\270\216\351\230\237\345\210\227\346\200\273\347\273\223.md" +++ "b/problems/\346\240\210\344\270\216\351\230\237\345\210\227\346\200\273\347\273\223.md" @@ -1,6 +1,6 @@

- - + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

@@ -158,5 +158,7 @@ cd a/b/c/../../ 好了,栈与队列我们就总结到这里了,接下来Carl就要带大家开启新的篇章了,大家加油! ------------------------ -
+

+ + + diff --git "a/problems/\346\240\210\344\270\216\351\230\237\345\210\227\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\346\240\210\344\270\216\351\230\237\345\210\227\347\220\206\350\256\272\345\237\272\347\241\200.md" index 8c76614f7c..da3a6dfac2 100644 --- "a/problems/\346\240\210\344\270\216\351\230\237\345\210\227\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\346\240\210\344\270\216\351\230\237\345\210\227\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -1,6 +1,6 @@

- - + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

@@ -88,5 +88,7 @@ std::queue> third; // 定义以list为底层容器的队列 ------------------------ -
+

+ + + diff --git "a/problems/\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227\357\274\210vector\345\216\237\347\220\206\350\256\262\350\247\243\357\274\211.md" "b/problems/\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227\357\274\210vector\345\216\237\347\220\206\350\256\262\350\247\243\357\274\211.md" index e229f39726..5b86074bdc 100644 --- "a/problems/\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227\357\274\210vector\345\216\237\347\220\206\350\256\262\350\247\243\357\274\211.md" +++ "b/problems/\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227\357\274\210vector\345\216\237\347\220\206\350\256\262\350\247\243\357\274\211.md" @@ -1,6 +1,6 @@

- - + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

# 贪心算法:根据身高重建队列(续集) @@ -182,5 +182,7 @@ Go中slice的`append`操作和C++中vector的扩容机制基本相同。 ------------------------ -
+

+ + + diff --git "a/problems/\347\256\227\346\263\225\346\250\241\346\235\277.md" "b/problems/\347\256\227\346\263\225\346\250\241\346\235\277.md" index 789d8f8031..24d3e6bdae 100644 --- "a/problems/\347\256\227\346\263\225\346\250\241\346\235\277.md" +++ "b/problems/\347\256\227\346\263\225\346\250\241\346\235\277.md" @@ -1,6 +1,6 @@

- - + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

@@ -810,5 +810,7 @@ Go: ------------------------ -
+

+ + + diff --git "a/problems/\350\203\214\345\214\205\346\200\273\347\273\223\347\257\207.md" "b/problems/\350\203\214\345\214\205\346\200\273\347\273\223\347\257\207.md" index 24d4cec9ad..9f61b2afa7 100644 --- "a/problems/\350\203\214\345\214\205\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/\350\203\214\345\214\205\346\200\273\347\273\223\347\257\207.md" @@ -1,6 +1,6 @@

- - + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

@@ -102,5 +102,7 @@ ------------------------ -
+

+ + + diff --git "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" index c2e93eb4ff..ee19e53d21 100644 --- "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" +++ "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" @@ -1,6 +1,6 @@

- - + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

@@ -538,5 +538,7 @@ object Solution { } ``` ------------------------ -
+

+ + + diff --git "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" index 81e61be42d..816719c374 100644 --- "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" +++ "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" @@ -1,6 +1,6 @@

- - + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

@@ -403,5 +403,7 @@ object Solution { } ``` ------------------------ -
+

+ + + diff --git "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\244\232\351\207\215\350\203\214\345\214\205.md" "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\244\232\351\207\215\350\203\214\345\214\205.md" index 712380f4f4..af10dab761 100644 --- "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\244\232\351\207\215\350\203\214\345\214\205.md" +++ "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\244\232\351\207\215\350\203\214\345\214\205.md" @@ -1,6 +1,6 @@

- - + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

@@ -393,5 +393,7 @@ testMultiPack(); ------------------------ -
+

+ + + diff --git "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" index 44f7d30d94..06bda1477e 100644 --- "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" +++ "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" @@ -1,6 +1,6 @@

- - + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

@@ -384,5 +384,7 @@ object Solution { ``` ------------------------ -
+

+ + + diff --git "a/problems/\350\264\252\345\277\203\347\256\227\346\263\225\346\200\273\347\273\223\347\257\207.md" "b/problems/\350\264\252\345\277\203\347\256\227\346\263\225\346\200\273\347\273\223\347\257\207.md" index 6539501f6b..86cd053faf 100644 --- "a/problems/\350\264\252\345\277\203\347\256\227\346\263\225\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/\350\264\252\345\277\203\347\256\227\346\263\225\346\200\273\347\273\223\347\257\207.md" @@ -1,6 +1,6 @@

- - + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

@@ -147,5 +147,7 @@ Carl个人认为:如果找出局部最优并可以推出全局最优,就是 ------------------------ -
+

+ + + diff --git "a/problems/\350\264\252\345\277\203\347\256\227\346\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\350\264\252\345\277\203\347\256\227\346\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md" index f1fde32f6e..ce3a348889 100644 --- "a/problems/\350\264\252\345\277\203\347\256\227\346\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\350\264\252\345\277\203\347\256\227\346\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -1,6 +1,6 @@

- - + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

@@ -88,5 +88,7 @@ ------------------------ -
+

+ + + diff --git "a/problems/\351\223\276\350\241\250\346\200\273\347\273\223\347\257\207.md" "b/problems/\351\223\276\350\241\250\346\200\273\347\273\223\347\257\207.md" index e3fe47401b..cfbafc45b3 100644 --- "a/problems/\351\223\276\350\241\250\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/\351\223\276\350\241\250\346\200\273\347\273\223\347\257\207.md" @@ -1,6 +1,6 @@

- - + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

@@ -96,5 +96,7 @@ ------------------------ -
+

+ + + diff --git "a/problems/\351\223\276\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\351\223\276\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" index cdd861fdea..fb1ac1ed6b 100644 --- "a/problems/\351\223\276\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\351\223\276\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -1,6 +1,6 @@

- - + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

@@ -235,5 +235,7 @@ impl ListNode { ``` ------------------------ -
+

+ + + diff --git "a/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" "b/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" index 6d6810a3ab..3277e85ef4 100644 --- "a/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" +++ "b/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" @@ -1,6 +1,6 @@

- - + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

@@ -395,5 +395,7 @@ object Solution { ``` ------------------------ -
+

+ + + From c4a12f7dc4ac6dccd16c1c81d06f4404311658e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E5=91=98Carl?= Date: Sun, 16 Oct 2022 10:46:42 +0800 Subject: [PATCH 1134/3019] =?UTF-8?q?Update=200239.=E6=BB=91=E5=8A=A8?= =?UTF-8?q?=E7=AA=97=E5=8F=A3=E6=9C=80=E5=A4=A7=E5=80=BC.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" "b/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" index b86fdd1542..d41c092d98 100644 --- "a/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" +++ "b/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" @@ -296,7 +296,7 @@ class Solution { ``` Python: -```python3 +```python from collections import deque From 819387081395ada6a866e5ce9ca236319cc2ca00 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=A7=E7=9C=BC=E7=9D=9B=E5=9B=BE=E5=9B=BE?= <108316255+L1Y1@users.noreply.github.com> Date: Sun, 16 Oct 2022 20:34:22 +0800 Subject: [PATCH 1135/3019] =?UTF-8?q?Update=200216.=E7=BB=84=E5=90=88?= =?UTF-8?q?=E6=80=BB=E5=92=8CIII.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 感觉这种解法更符合卡哥视频的讲解。 --- ...345\220\210\346\200\273\345\222\214III.md" | 31 ++++++++++++------- 1 file changed, 19 insertions(+), 12 deletions(-) diff --git "a/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" "b/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" index 964faceebb..4273240cb1 100644 --- "a/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" +++ "b/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" @@ -397,24 +397,31 @@ func backTree(n,k,startIndex int,track *[]int,result *[][]int){ * @return {number[][]} */ var combinationSum3 = function(k, n) { - const backtrack = (start) => { - const l = path.length; - if (l === k) { - const sum = path.reduce((a, b) => a + b); - if (sum === n) { + let res = []; + let path = []; + let sum = 0; + const dfs = (path,index) => { + // 剪枝操作 + if (sum > n){ + return + } + if (path.length == k) { + if(sum == n){ res.push([...path]); + return } - return; } - for (let i = start; i <= 9 - (k - l) + 1; i++) { + for (let i = index; i <= 9 - (k-path.length) + 1;i++) { path.push(i); - backtrack(i + 1); - path.pop(); + sum = sum + i; + index += 1; + dfs(path,index); + sum -= i + path.pop() } } - let res = [], path = []; - backtrack(1); - return res; + dfs(path,1); + return res }; ``` From d874aaa2dd12685f54aba09201903319aa3bd183 Mon Sep 17 00:00:00 2001 From: Asterisk <44215173+casnz1601@users.noreply.github.com> Date: Sun, 16 Oct 2022 20:19:40 -0400 Subject: [PATCH 1136/3019] =?UTF-8?q?Update=200001.=E4=B8=A4=E6=95=B0?= =?UTF-8?q?=E4=B9=8B=E5=92=8C.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 替代造成逻辑误导旧python代码 --- ...44\346\225\260\344\271\213\345\222\214.md" | 24 ++++--------------- 1 file changed, 5 insertions(+), 19 deletions(-) diff --git "a/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" "b/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" index acf2a99516..7bada9af85 100644 --- "a/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" @@ -152,25 +152,11 @@ class Solution: def twoSum(self, nums: List[int], target: int) -> List[int]: records = dict() - # 用枚举更方便,就不需要通过索引再去取当前位置的值 - for idx, val in enumerate(nums): - if target - val not in records: - records[val] = idx - else: - return [records[target - val], idx] # 如果存在就返回字典记录索引和当前索引 -``` - -Python (v2): - -```python -class Solution: - def twoSum(self, nums: List[int], target: int) -> List[int]: - rec = {} - for i in range(len(nums)): - rest = target - nums[i] - # Use get to get the index of the data, making use of one of the dictionary properties. - if rec.get(rest, None) is not None: return [rec[rest], i] - rec[nums[i]] = i + for index, value in enumerate(nums): + if target - value in records: + return [records[target- value], index] + records[value] = index + return [] ``` Go: From f2ebe047dbd93a4e4c67fa5104d1bdfcbc49734a Mon Sep 17 00:00:00 2001 From: Allen <2439506288@qq.com> Date: Mon, 17 Oct 2022 08:36:45 +0800 Subject: [PATCH 1137/3019] =?UTF-8?q?=E4=BF=AE=E6=94=B9518=E9=A2=98?= =?UTF-8?q?=E7=9B=AE=E9=93=BE=E6=8E=A5=EF=BC=8C=E6=9B=BF=E4=BB=A3=E8=BF=87?= =?UTF-8?q?=E6=97=B6=E7=9A=84=E9=93=BE=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" "b/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" index e5c8b25107..e29e21073e 100644 --- "a/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" +++ "b/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" @@ -7,7 +7,7 @@ ## 518. 零钱兑换 II -[力扣题目链接](https://leetcode.cn/problems/coin-change-2/) +[力扣题目链接](https://leetcode.cn/problems/coin-change-ii/) 难度:中等 From 7a429700ae1bc4b5f99f0ee8fd9b510d5f13d9ba Mon Sep 17 00:00:00 2001 From: ckl <1051928078@qq.com> Date: Mon, 17 Oct 2022 20:16:55 +0800 Subject: [PATCH 1138/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200052.N=E7=9A=87?= =?UTF-8?q?=E5=90=8EII.md=20Java=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0052.N\347\232\207\345\220\216II.md" | 49 ++++++++++++++++++- 1 file changed, 48 insertions(+), 1 deletion(-) diff --git "a/problems/0052.N\347\232\207\345\220\216II.md" "b/problems/0052.N\347\232\207\345\220\216II.md" index f1edd281e9..e4faac0cb4 100644 --- "a/problems/0052.N\347\232\207\345\220\216II.md" +++ "b/problems/0052.N\347\232\207\345\220\216II.md" @@ -256,7 +256,54 @@ int totalNQueens(int n){ return answer; } ``` - +Java +```java +class Solution { + int count = 0; + public int totalNQueens(int n) { + char[][] board = new char[n][n]; + for (char[] chars : board) { + Arrays.fill(chars, '.'); + } + backTrack(n, 0, board); + return count; + } + private void backTrack(int n, int row, char[][] board) { + if (row == n) { + count++; + return; + } + for (int col = 0; col < n; col++) { + if (isValid(row, col, n, board)) { + board[row][col] = 'Q'; + backTrack(n, row + 1, board); + board[row][col] = '.'; + } + } + } + private boolean isValid(int row, int col, int n, char[][] board) { + // 检查列 + for (int i = 0; i < row; ++i) { + if (board[i][col] == 'Q') { + return false; + } + } + // 检查45度对角线 + for (int i = row - 1, j = col - 1; i >= 0 && j >= 0; i--, j--) { + if (board[i][j] == 'Q') { + return false; + } + } + // 检查135度对角线 + for (int i = row - 1, j = col + 1; i >= 0 && j <= n - 1; i--, j++) { + if (board[i][j] == 'Q') { + return false; + } + } + return true; + } +} +```

From 78db04b4b70d8cf879b2c7c9f2954f3465500ad0 Mon Sep 17 00:00:00 2001 From: fw_qaq <82551626+Jack-Zhang-1314@users.noreply.github.com> Date: Tue, 18 Oct 2022 00:29:12 +0800 Subject: [PATCH 1139/3019] =?UTF-8?q?update=201002.=20=E6=9F=A5=E6=89=BE?= =?UTF-8?q?=E5=B8=B8=E7=94=A8=E5=AD=97=E7=AC=A6=20about=20rust?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...70\347\224\250\345\255\227\347\254\246.md" | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git "a/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md" "b/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md" index 78eb19891e..fd18866029 100644 --- "a/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md" +++ "b/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md" @@ -451,6 +451,42 @@ object Solution { } } ``` + +Rust: + +```rust +impl Solution { + pub fn common_chars(words: Vec) -> Vec { + if words.is_empty() { + return vec![]; + } + let mut res = vec![]; + let mut hash = vec![0; 26]; + for i in words[0].bytes() { + hash[(i - b'a') as usize] += 1; + } + for i in words.iter().skip(1) { + let mut other_hash_str = vec![0; 26]; + for j in i.bytes() { + other_hash_str[(j - b'a') as usize] += 1; + } + for k in 0..26 { + hash[k] = hash[k].min(other_hash_str[k]); + } + } + + for (i, v) in hash.iter_mut().enumerate() { + while *v > 0 { + res.push(((i as u8 + b'a') as char).to_string()); + *v -= 1; + } + } + + res + } +} +``` +

From 1256daac2497ed11bf4e200e495b031ba2d1a03a Mon Sep 17 00:00:00 2001 From: fw_qaq <82551626+Jack-Zhang-1314@users.noreply.github.com> Date: Tue, 18 Oct 2022 00:51:19 +0800 Subject: [PATCH 1140/3019] =?UTF-8?q?update=200349.=E4=B8=A4=E4=B8=AA?= =?UTF-8?q?=E6=95=B0=E7=BB=84=E7=9A=84=E4=BA=A4=E9=9B=86.md=20about=20rust?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...3\204\347\232\204\344\272\244\351\233\206.md" | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git "a/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" "b/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" index 153077edef..a6e07424d7 100644 --- "a/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" +++ "b/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" @@ -310,6 +310,22 @@ impl Solution { } ``` +解法2: + +```rust +use std::collections::HashSet; +impl Solution { + pub fn intersection(nums1: Vec, nums2: Vec) -> Vec { + nums1 + .into_iter() + .collect::>() + .intersection(&nums2.into_iter().collect::>()) + .copied() + .collect() + } +} +``` + C: ```C int* intersection1(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize){ From 853243a20ed6d6afe9f5c5ad112d662f3d02eb65 Mon Sep 17 00:00:00 2001 From: roylx <73628821+roylx@users.noreply.github.com> Date: Tue, 18 Oct 2022 11:30:57 -0600 Subject: [PATCH 1141/3019] =?UTF-8?q?Update=200332.=E9=87=8D=E6=96=B0?= =?UTF-8?q?=E5=AE=89=E6=8E=92=E8=A1=8C=E7=A8=8B.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 优化了phython3的代码,把排序部分提前完成,避免重复排序 --- ...\260\345\256\211\346\216\222\350\241\214\347\250\213.md" | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git "a/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" "b/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" index 90756d7d82..8414753246 100644 --- "a/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" +++ "b/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" @@ -355,16 +355,18 @@ class Solution: tickets_dict = defaultdict(list) for item in tickets: tickets_dict[item[0]].append(item[1]) + # 给每一个机场的到达机场排序,小的在前面,在回溯里首先被pop(0)出去 + # 这样最先找的的path就是排序最小的答案,直接返回 + for airport in tickets_dict: tickets_dict[airport].sort() ''' tickets_dict里面的内容是这样的 - {'JFK': ['SFO', 'ATL'], 'SFO': ['ATL'], 'ATL': ['JFK', 'SFO']}) + {'JFK': ['ATL', 'SFO'], 'SFO': ['ATL'], 'ATL': ['JFK', 'SFO']}) ''' path = ["JFK"] def backtracking(start_point): # 终止条件 if len(path) == len(tickets) + 1: return True - tickets_dict[start_point].sort() for _ in tickets_dict[start_point]: #必须及时删除,避免出现死循环 end_point = tickets_dict[start_point].pop(0) From 73e937f77fcf3e4deb752f6fe8960d009fdae944 Mon Sep 17 00:00:00 2001 From: tlylt Date: Wed, 19 Oct 2022 09:25:36 +0800 Subject: [PATCH 1142/3019] Update --- "problems/0090.\345\255\220\351\233\206II.md" | 28 +++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git "a/problems/0090.\345\255\220\351\233\206II.md" "b/problems/0090.\345\255\220\351\233\206II.md" index ea1eb4cd0a..9f935b605f 100644 --- "a/problems/0090.\345\255\220\351\233\206II.md" +++ "b/problems/0090.\345\255\220\351\233\206II.md" @@ -261,7 +261,9 @@ class Solution: self.path.pop() ``` -### Python3 +### Python3 + +不使用used数组 ```python3 class Solution: def subsetsWithDup(self, nums: List[int]) -> List[List[int]]: @@ -288,6 +290,28 @@ class Solution: return res ``` +使用used数组 +```python3 +class Solution: + def subsetsWithDup(self, nums: List[int]) -> List[List[int]]: + result = [] + path = [] + nums.sort() + used = [0] * len(nums) + def backtrack(nums, startIdx): + result.append(path[:]) + for i in range(startIdx, len(nums)): + if i > startIdx and nums[i] == nums[i-1] and used[i-1] == 0: + continue + used[i] = 1 + path.append(nums[i]) + backtrack(nums, i+1) + path.pop() + used[i] = 0 + backtrack(nums, 0) + return result +``` + ### Go ```Go @@ -526,7 +550,7 @@ func subsetsWithDup(_ nums: [Int]) -> [[Int]] { ### Scala -不使用userd数组: +不使用used数组: ```scala object Solution { From 9977fb5996d2e593d0bc220754d91c0abeec181f Mon Sep 17 00:00:00 2001 From: Jijie LIU Date: Wed, 19 Oct 2022 21:47:25 +0200 Subject: [PATCH 1143/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20541.=20=E5=8F=8D?= =?UTF-8?q?=E8=BD=AC=E5=AD=97=E7=AC=A6=E4=B8=B2II=EF=BC=8C=20=E6=8F=90?= =?UTF-8?q?=E4=BE=9Bscala=E7=89=88=E6=9C=AC=E7=9A=84=E9=80=92=E5=BD=92?= =?UTF-8?q?=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\345\255\227\347\254\246\344\270\262II.md" | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git "a/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" "b/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" index 3dd6b1e83b..02ad92a072 100644 --- "a/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" +++ "b/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" @@ -412,6 +412,26 @@ object Solution { } ``` +版本三: (递归) +```scala +import scala.annotation.tailrec + +object Solution { + def reverseStr(s: String, k: Int): String = { + @tailrec // 这个函数已经优化成了尾递归 + def reverse(s: String, needToReverse: Boolean, history: String): String = { + // 截取前k个字符(判断是否翻转) + val subStr = if (needToReverse) s.take(k).reverse else s.take(k) + // 如果字符串长度小于k,返回结果 + // 否则,对于剩余字符串进行同样的操作 + if (s.length < k) history + subStr + else reverse(s.drop(k), !needToReverse, history + subStr) + } + reverse(s, true, "") + } +} +``` + Rust: ```Rust From 77b431d27618a202d90b5bfc420b6686cbc66312 Mon Sep 17 00:00:00 2001 From: Jijie LIU Date: Wed, 19 Oct 2022 22:20:01 +0200 Subject: [PATCH 1144/3019] =?UTF-8?q?Update=200541.=E5=8F=8D=E8=BD=AC?= =?UTF-8?q?=E5=AD=97=E7=AC=A6=E4=B8=B2II.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\254\345\255\227\347\254\246\344\270\262II.md" | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git "a/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" "b/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" index 02ad92a072..f38ac042c0 100644 --- "a/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" +++ "b/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" @@ -399,14 +399,17 @@ object Solution { } } ``` -版本二: 首先利用sliding每隔k个进行分割,随后转换为数组,再使用zipWithIndex添加每个数组的索引,紧接着利用map做变换,如果索引%2==0则说明需要翻转,否则原封不动,最后再转换为String +版本二: 首先利用grouped每隔k个进行分割,再使用zipWithIndex添加每个数组的索引,紧接着利用map做变换,如果索引%2==0则说明需要翻转,否则原封不动,最后再转换为String ```scala -object Solution { +object SolutionFunc { def reverseStr(s: String, k: Int): String = { - s.sliding(k, k) - .toArray - .zipWithIndex - .map(v => if (v._2 % 2 == 0) v._1.reverse else v._1) + // s = "abcdefg", k = 2 + s.grouped(k) // Iterator ["ab", "cd", "ef", "g"] + .zipWithIndex // Iterator [("ab", 0), ("cd", 1), ("ef", 2), ("g", 3)] + .map { + case (subStr, index) => + if (index % 2 == 0) subStr.reverse else subStr + } .mkString } } From 7278b038c680d960d2c7d4858cb836144b90ea1c Mon Sep 17 00:00:00 2001 From: Jijie LIU Date: Wed, 19 Oct 2022 22:23:50 +0200 Subject: [PATCH 1145/3019] rename the object class name of Scala Solution 2 --- ...17\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" "b/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" index f38ac042c0..238e63490d 100644 --- "a/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" +++ "b/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" @@ -401,7 +401,7 @@ object Solution { ``` 版本二: 首先利用grouped每隔k个进行分割,再使用zipWithIndex添加每个数组的索引,紧接着利用map做变换,如果索引%2==0则说明需要翻转,否则原封不动,最后再转换为String ```scala -object SolutionFunc { +object Solution { def reverseStr(s: String, k: Int): String = { // s = "abcdefg", k = 2 s.grouped(k) // Iterator ["ab", "cd", "ef", "g"] From 185e19748c7fadc5bade6ef6e775991e395ed7c9 Mon Sep 17 00:00:00 2001 From: vanyongqi <46806467+vanyongqi@users.noreply.github.com> Date: Thu, 20 Oct 2022 19:49:24 +0800 Subject: [PATCH 1146/3019] =?UTF-8?q?Update=200019.=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E9=93=BE=E8=A1=A8=E7=9A=84=E5=80=92=E6=95=B0=E7=AC=ACN?= =?UTF-8?q?=E4=B8=AA=E8=8A=82=E7=82=B9.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 增加C语言版本,已通过Leetcode验证 --- ...4N\344\270\252\350\212\202\347\202\271.md" | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git "a/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" "b/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" index 314c396e00..b0641b5f08 100644 --- "a/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" +++ "b/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" @@ -364,6 +364,40 @@ impl Solution { dummy_head.next } } +``` +C语言 +```c +/**c语言单链表的定义 + * Definition for singly-linked list. + * struct ListNode { + * int val; + * struct ListNode *next; + * }; + */ +struct ListNode* removeNthFromEnd(struct ListNode* head, int n) { + //定义虚拟头节点dummy 并初始化使其指向head + struct ListNode* dummy = malloc(sizeof(struct ListNode)); + dummy->val = 0; + dummy->next = head; + //定义 fast slow 双指针 + struct ListNode* fast = head; + struct ListNode* slow = dummy; + + for (int i = 0; i < n; ++i) { + fast = fast->next; + } + while (fast) { + fast = fast->next; + slow = slow->next; + } + slow->next = slow->next->next;//删除倒数第n个节点 + head = dummy->next; + free(dummy);//删除虚拟节点dummy + return head; +} + + + ```

From 5dcdb06e64eef14bb555d6a0e9f8b9bfb90a4793 Mon Sep 17 00:00:00 2001 From: Guan-t7 Date: Thu, 20 Oct 2022 23:08:04 +0800 Subject: [PATCH 1147/3019] =?UTF-8?q?Update=200127.=E5=8D=95=E8=AF=8D?= =?UTF-8?q?=E6=8E=A5=E9=BE=99.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit fix typo --- .../0127.\345\215\225\350\257\215\346\216\245\351\276\231.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0127.\345\215\225\350\257\215\346\216\245\351\276\231.md" "b/problems/0127.\345\215\225\350\257\215\346\216\245\351\276\231.md" index 4fa530469a..2e30123d16 100644 --- "a/problems/0127.\345\215\225\350\257\215\346\216\245\351\276\231.md" +++ "b/problems/0127.\345\215\225\350\257\215\346\216\245\351\276\231.md" @@ -31,7 +31,7 @@ # 思路 -以示例1为例,从这个图中可以看出 hit 到 cog的路线,不止一条,有三条,两条是最短的长度为5,一条长度为6。 +以示例1为例,从这个图中可以看出 hit 到 cog的路线,不止一条,有三条,一条是最短的长度为5,两条长度为6。 ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210827175432.png) From ec774357dd539e83a682ddc3733884cc369fcb04 Mon Sep 17 00:00:00 2001 From: lysice Date: Fri, 21 Oct 2022 17:19:29 +0800 Subject: [PATCH 1148/3019] =?UTF-8?q?[fix]=20=E9=94=99=E5=88=AB=E5=AD=97?= =?UTF-8?q?=E6=9B=B4=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" "b/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" index 80c72305e5..2d556d8b6d 100644 --- "a/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" +++ "b/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" @@ -88,7 +88,7 @@ public: 对于窗口里的元素{2, 3, 5, 1 ,4},单调队列里只维护{5, 4} 就够了,保持单调队列里单调递减,此时队列出口元素就是窗口里最大元素。 -此时大家应该怀疑单调队列里维护着{5, 4} 怎么配合窗口经行滑动呢? +此时大家应该怀疑单调队列里维护着{5, 4} 怎么配合窗口进行滑动呢? 设计单调队列的时候,pop,和push操作要保持如下规则: From fddea62f38df395a6094f72f17a00fa831634821 Mon Sep 17 00:00:00 2001 From: fw_qaq <82551626+Jack-Zhang-1314@users.noreply.github.com> Date: Sat, 22 Oct 2022 16:42:48 +0800 Subject: [PATCH 1149/3019] update 15.3sum about rust --- ...11\346\225\260\344\271\213\345\222\214.md" | 33 +++++++++---------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git "a/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" "b/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" index fb289d54e5..5ee57127c6 100644 --- "a/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" @@ -655,7 +655,7 @@ impl Solution { ```Rust // 双指针法 -use std::collections::HashSet; +use std::cmp::Ordering; impl Solution { pub fn three_sum(nums: Vec) -> Vec> { let mut result: Vec> = Vec::new(); @@ -667,22 +667,21 @@ impl Solution { if i > 0 && nums[i] == nums[i - 1] { continue; } let (mut left, mut right) = (i + 1, len - 1); while left < right { - if nums[i] + nums[left] + nums[right] > 0 { - right -= 1; - // 去重 - while left < right && nums[right] == nums[right + 1] { right -= 1; } - } else if nums[i] + nums[left] + nums[right] < 0 { - left += 1; - // 去重 - while left < right && nums[left] == nums[left - 1] { left += 1; } - } else { - result.push(vec![nums[i], nums[left], nums[right]]); - // 去重 - right -= 1; - left += 1; - while left < right && nums[right] == nums[right + 1] { right -= 1; } - while left < right && nums[left] == nums[left - 1] { left += 1; } - } + match (nums[i] + nums[left] + nums[right]).cmp(&0){ + Ordering::Equal =>{ + result.push(vec![nums[i], nums[left], nums[right]]); + left +=1; + right -=1; + while left < right && nums[left] == nums[left - 1]{ + left += 1; + } + while left < right && nums[right] == nums[right+1]{ + right -= 1; + } + } + Ordering::Greater => right -= 1, + Ordering::Less => left += 1, + } } } result From 53793b70f9c9068bd45607d73465ed8256af30ac Mon Sep 17 00:00:00 2001 From: fw_qaq <82551626+Jack-Zhang-1314@users.noreply.github.com> Date: Sat, 22 Oct 2022 21:55:08 +0800 Subject: [PATCH 1150/3019] update 18.4sum about rust --- ...33\346\225\260\344\271\213\345\222\214.md" | 36 ++++++++++--------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git "a/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" "b/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" index 463eaf8fc0..ca33eb57c4 100644 --- "a/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" @@ -527,6 +527,7 @@ public class Solution Rust: ```Rust +use std::cmp::Ordering; impl Solution { pub fn four_sum(nums: Vec, target: i32) -> Vec> { let mut result: Vec> = Vec::new(); @@ -545,22 +546,25 @@ impl Solution { if i > k + 1 && nums[i] == nums[i - 1] { continue; } let (mut left, mut right) = (i + 1, len - 1); while left < right { - if nums[k] + nums[i] > target - (nums[left] + nums[right]) { - right -= 1; - // 去重 - while left < right && nums[right] == nums[right + 1] { right -= 1; } - } else if nums[k] + nums[i] < target - (nums[left] + nums[right]) { - left += 1; - // 去重 - while left < right && nums[left] == nums[left - 1] { left += 1; } - } else { - result.push(vec![nums[k], nums[i], nums[left], nums[right]]); - // 去重 - while left < right && nums[right] == nums[right - 1] { right -= 1; } - while left < right && nums[left] == nums[left + 1] { left += 1; } - left += 1; - right -= 1; - } + match (nums[k] + nums[i] + nums[left] + nums[right]).cmp(&target){ + Ordering::Equal => { + result.push(vec![nums[k], nums[i], nums[left], nums[right]]); + left += 1; + right -= 1; + while left < right && nums[left] == nums[left - 1]{ + left += 1; + } + while left < right && nums[right] == nums[right + 1]{ + right -= 1; + } + } + Ordering::Less => { + left +=1; + }, + Ordering::Greater => { + right -= 1; + } + } } } } From 8f7f6185db0ed11af2ceb447ec0f1c84664dc359 Mon Sep 17 00:00:00 2001 From: pwq <57176977+pvvq@users.noreply.github.com> Date: Tue, 25 Oct 2022 01:10:21 +0800 Subject: [PATCH 1151/3019] 0349 fix code block language change language from `c++` to `CPP`, since `c++` doesn't get rendered as expected (here)[https://programmercarl.com/0349.%E4%B8%A4%E4%B8%AA%E6%95%B0%E7%BB%84%E7%9A%84%E4%BA%A4%E9%9B%86.html#%E5%90%8E%E8%AE%B0]. --- ...\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" "b/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" index a6e07424d7..bd83fae940 100644 --- "a/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" +++ "b/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" @@ -91,7 +91,7 @@ public: 对应C++代码如下: -```c++ +```CPP class Solution { public: vector intersection(vector& nums1, vector& nums2) { From 03b37fee5e16163eb9ff17a9887764d6ba9665c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=A7=E7=9C=BC=E7=9D=9B=E5=9B=BE=E5=9B=BE?= <108316255+L1Y1@users.noreply.github.com> Date: Tue, 25 Oct 2022 09:22:21 +0800 Subject: [PATCH 1152/3019] =?UTF-8?q?Update=201005.K=E6=AC=A1=E5=8F=96?= =?UTF-8?q?=E5=8F=8D=E5=90=8E=E6=9C=80=E5=A4=A7=E5=8C=96=E7=9A=84=E6=95=B0?= =?UTF-8?q?=E7=BB=84=E5=92=8C.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit js 版本,更容易理解,并且用了js es6的语法进行了微调 --- ...04\346\225\260\347\273\204\345\222\214.md" | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git "a/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" "b/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" index 9d82bf9fd3..ed5d1509f8 100644 --- "a/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" +++ "b/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" @@ -190,23 +190,23 @@ func largestSumAfterKNegations(nums []int, K int) int { ### Javascript ```Javascript var largestSumAfterKNegations = function(nums, k) { - nums.sort((a, b) => { - return Math.abs(b) - Math.abs(a) - }) - for(let i = 0; i < nums.length; i++) { - if(nums[i] < 0 && k > 0) { - nums[i] *= -1 - k-- + + nums.sort((a,b) => Math.abs(b) - Math.abs(a)) + + for(let i = 0 ;i < nums.length; i++){ + if(nums[i] < 0 && k > 0){ + nums[i] = - nums[i]; + k--; } } - if(k > 0 && k % 2 === 1) { - nums[nums.length - 1] *= -1 + // 若k还大于0,则寻找最小的数进行不断取反 + while( k > 0 ){ + nums[nums.length-1] = - nums[nums.length-1] + k--; } - k = 0 - return nums.reduce((a, b) => { - return a + b + a + b }) }; From 5c3a57ea1c147502a769312374853955bbdd4dca Mon Sep 17 00:00:00 2001 From: c0dedance <38075730+c0dedance@users.noreply.github.com> Date: Tue, 25 Oct 2022 21:34:47 +0800 Subject: [PATCH 1153/3019] =?UTF-8?q?Update=200343.=E6=95=B4=E6=95=B0?= =?UTF-8?q?=E6=8B=86=E5=88=86.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 内层for循环优化 --- ...6\225\264\346\225\260\346\213\206\345\210\206.md" | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git "a/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" "b/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" index 00e6a9da08..f668395425 100644 --- "a/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" +++ "b/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" @@ -89,7 +89,7 @@ dp[i] 是依靠 dp[i - j]的状态,所以遍历i一定是从前向后遍历, 所以遍历顺序为: ``` for (int i = 3; i <= n ; i++) { - for (int j = 1; j < i - 1; j++) { + for (int j = 1; j <= i / 2; j++) { dp[i] = max(dp[i], max((i - j) * j, dp[i - j] * j)); } } @@ -110,7 +110,7 @@ public: vector dp(n + 1); dp[2] = 1; for (int i = 3; i <= n ; i++) { - for (int j = 1; j < i - 1; j++) { + for (int j = 1; j <= i / 2; j++) { dp[i] = max(dp[i], max((i - j) * j, dp[i - j] * j)); } } @@ -167,7 +167,7 @@ public: dp[2] = 2; dp[3] = 3; for (int i = 4; i <= n ; i++) { - for (int j = 1; j < i - 1; j++) { + for (int j = 1; j <= i / 2; j++) { dp[i] = max(dp[i], dp[i - j] * dp[j]); } } @@ -224,7 +224,7 @@ class Solution: # 假设对正整数 i 拆分出的第一个正整数是 j(1 <= j < i),则有以下两种方案: # 1) 将 i 拆分成 j 和 i−j 的和,且 i−j 不再拆分成多个正整数,此时的乘积是 j * (i-j) # 2) 将 i 拆分成 j 和 i−j 的和,且 i−j 继续拆分成多个正整数,此时的乘积是 j * dp[i-j] - for j in range(1, i - 1): + for j in range(1, i / 2 + 1): dp[i] = max(dp[i], max(j * (i - j), j * dp[i - j])) return dp[n] ``` @@ -281,7 +281,7 @@ var integerBreak = function(n) { dp[2] = 1 for(let i = 3; i <= n; i++) { - for(let j = 1; j < i; j++) { + for(let j = 1; j <= i / 2; j++) { dp[i] = Math.max(dp[i], dp[i - j] * j, (i - j) * j) } } @@ -306,7 +306,7 @@ function integerBreak(n: number): number { const dp: number[] = new Array(n + 1).fill(0); dp[2] = 1; for (let i = 3; i <= n; i++) { - for (let j = 1; j <= i - 2; j++) { + for (let j = 1; j <= i / 2; j++) { dp[i] = Math.max(dp[i], j * dp[i - j], j * (i - j)); } } From 84b4f2674436910c87e258b5984b1404591bc060 Mon Sep 17 00:00:00 2001 From: fw_qaq <82551626+Jack-Zhang-1314@users.noreply.github.com> Date: Tue, 25 Oct 2022 22:17:21 +0800 Subject: [PATCH 1154/3019] =?UTF-8?q?update=2028.=E6=89=BE=E5=87=BA?= =?UTF-8?q?=E5=AD=97=E7=AC=A6=E4=B8=B2=E4=B8=AD=E7=AC=AC=E4=B8=80=E4=B8=AA?= =?UTF-8?q?=E5=8C=B9=E9=85=8D=E9=A1=B9=E7=9A=84=E4=B8=8B=E6=A0=87=20about?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0028.\345\256\236\347\216\260strStr.md" | 47 +++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git "a/problems/0028.\345\256\236\347\216\260strStr.md" "b/problems/0028.\345\256\236\347\216\260strStr.md" index 7078738e8e..697e8c2d41 100644 --- "a/problems/0028.\345\256\236\347\216\260strStr.md" +++ "b/problems/0028.\345\256\236\347\216\260strStr.md" @@ -1299,6 +1299,53 @@ impl Solution { } ``` +> 前缀表统一减一 + +```rust +impl Solution { + pub fn get_next(mut next: Vec, s: &Vec) -> Vec { + let mut j = -1; + for i in 1..s.len() { + while j >= 0 && s[(j + 1) as usize] != s[i] { + j = next[j as usize]; + } + if s[i] == s[(j + 1) as usize] { + j += 1; + } + next[i] = j; + } + next + } + pub fn str_str(haystack: String, needle: String) -> i32 { + if needle.is_empty() { + return 0; + } + if haystack.len() < needle.len() { + return -1; + } + let (haystack_chars, needle_chars) = ( + haystack.chars().collect::>(), + needle.chars().collect::>(), + ); + let mut j = -1; + let mut next = vec![-1; needle.len()]; + next = Self::get_next(next, &needle_chars); + for (i, v) in haystack_chars.into_iter().enumerate() { + while j >= 0 && v != needle_chars[(j + 1) as usize] { + j = next[j as usize]; + } + if v == needle_chars[(j + 1) as usize] { + j += 1; + } + if j == needle_chars.len() as i32 - 1 { + return (i - needle_chars.len() + 1) as i32; + } + } + -1 + } +} +``` +

From a582640c7a800cbce116f1cd6475a0a68a629ff3 Mon Sep 17 00:00:00 2001 From: fw_qaq <82551626+Jack-Zhang-1314@users.noreply.github.com> Date: Tue, 25 Oct 2022 22:35:54 +0800 Subject: [PATCH 1155/3019] =?UTF-8?q?Update=200028.=E5=AE=9E=E7=8E=B0strSt?= =?UTF-8?q?r.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "problems/0028.\345\256\236\347\216\260strStr.md" | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git "a/problems/0028.\345\256\236\347\216\260strStr.md" "b/problems/0028.\345\256\236\347\216\260strStr.md" index 697e8c2d41..19d16e9f6b 100644 --- "a/problems/0028.\345\256\236\347\216\260strStr.md" +++ "b/problems/0028.\345\256\236\347\216\260strStr.md" @@ -1303,7 +1303,8 @@ impl Solution { ```rust impl Solution { - pub fn get_next(mut next: Vec, s: &Vec) -> Vec { + pub fn get_next(next_len: usize, s: &Vec) -> Vec { + let mut next = vec![-1; next_len]; let mut j = -1; for i in 1..s.len() { while j >= 0 && s[(j + 1) as usize] != s[i] { @@ -1328,8 +1329,7 @@ impl Solution { needle.chars().collect::>(), ); let mut j = -1; - let mut next = vec![-1; needle.len()]; - next = Self::get_next(next, &needle_chars); + let next = Self::get_next(needle.len(), &needle_chars); for (i, v) in haystack_chars.into_iter().enumerate() { while j >= 0 && v != needle_chars[(j + 1) as usize] { j = next[j as usize]; From 856907e3d596f6796b4817aa6b80a26e6dbb73d6 Mon Sep 17 00:00:00 2001 From: fw_qaq <82551626+Jack-Zhang-1314@users.noreply.github.com> Date: Tue, 25 Oct 2022 23:26:04 +0800 Subject: [PATCH 1156/3019] =?UTF-8?q?update=200459.=E9=87=8D=E5=A4=8D?= =?UTF-8?q?=E7=9A=84=E5=AD=90=E5=AD=97=E7=AC=A6=E4=B8=B2.md=20about=20rust?= =?UTF-8?q?=20=E5=89=8D=E7=BC=80=E8=A1=A8=E7=BB=9F=E4=B8=80=20-1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...20\345\255\227\347\254\246\344\270\262.md" | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git "a/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" "b/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" index 18de79d52d..378d1a635b 100644 --- "a/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" @@ -615,6 +615,35 @@ impl Solution { } ``` +>前缀表统一减一 + +```rust + pub fn get_next(next_len: usize, s: &Vec) -> Vec { + let mut next = vec![-1; next_len]; + let mut j = -1; + for i in 1..s.len() { + while j >= 0 && s[i] != s[(j + 1) as usize] { + j = next[j as usize]; + } + if s[i] == s[(j + 1) as usize] { + j += 1; + } + next[i] = j; + } + next + } + pub fn repeated_substring_pattern(s: String) -> bool { + let s_chars = s.chars().collect::>(); + let next = Self::get_next(s_chars.len(), &s_chars); + if next[s_chars.len() - 1] >= 0 + && s_chars.len() % (s_chars.len() - (next[s_chars.len() - 1] + 1) as usize) == 0 + { + return true; + } + false + } +``` +

From f386e3ca68c602c84f875ab1b6538a41e000459b Mon Sep 17 00:00:00 2001 From: fw_qaq <82551626+Jack-Zhang-1314@users.noreply.github.com> Date: Tue, 25 Oct 2022 23:27:09 +0800 Subject: [PATCH 1157/3019] =?UTF-8?q?Update=200459.=E9=87=8D=E5=A4=8D?= =?UTF-8?q?=E7=9A=84=E5=AD=90=E5=AD=97=E7=AC=A6=E4=B8=B2.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" | 2 ++ 1 file changed, 2 insertions(+) diff --git "a/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" "b/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" index 378d1a635b..b7d86880ee 100644 --- "a/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" @@ -618,6 +618,7 @@ impl Solution { >前缀表统一减一 ```rust +impl Solution { pub fn get_next(next_len: usize, s: &Vec) -> Vec { let mut next = vec![-1; next_len]; let mut j = -1; @@ -642,6 +643,7 @@ impl Solution { } false } +} ``` From 1204f0e4ed06d11d5e55ad47d94fc71733bf7ce5 Mon Sep 17 00:00:00 2001 From: Liu YongLiang <41845017+tlylt@users.noreply.github.com> Date: Wed, 26 Oct 2022 20:30:32 +0800 Subject: [PATCH 1158/3019] =?UTF-8?q?Update=201221.=E5=88=86=E5=89=B2?= =?UTF-8?q?=E5=B9=B3=E8=A1=A1=E5=AD=97=E7=AC=A6=E4=B8=B2.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\271\263\350\241\241\345\255\227\347\254\246\344\270\262.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/1221.\345\210\206\345\211\262\345\271\263\350\241\241\345\255\227\347\254\246\344\270\262.md" "b/problems/1221.\345\210\206\345\211\262\345\271\263\350\241\241\345\255\227\347\254\246\344\270\262.md" index 94d7bca86c..b587514a41 100644 --- "a/problems/1221.\345\210\206\345\211\262\345\271\263\350\241\241\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/1221.\345\210\206\345\211\262\345\271\263\350\241\241\345\255\227\347\254\246\344\270\262.md" @@ -117,7 +117,7 @@ class Solution: diff -= 1 else: diff += 1 - if tilt == 0: + if diff == 0: ans += 1 return ans ``` From 448ef5f40618d2f7428e6ea7107f2f9f24fe987c Mon Sep 17 00:00:00 2001 From: xiaoyu2018 <861900161@qq.com> Date: Fri, 28 Oct 2022 10:57:36 +0800 Subject: [PATCH 1159/3019] update 0121 and 0122 --- ...00\344\275\263\346\227\266\346\234\272.md" | 42 +++++++++++++++++++ ...01\350\247\204\345\210\222\357\274\211.md" | 42 +++++++++++++++++-- 2 files changed, 80 insertions(+), 4 deletions(-) diff --git "a/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" "b/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" index 790bbd8826..63ac5d04e7 100644 --- "a/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" +++ "b/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" @@ -464,6 +464,47 @@ function maxProfit(prices: number[]): number { }; ``` +C#: + +> 贪心法 + +```csharp +public class Solution +{ + public int MaxProfit(int[] prices) + { + int min = Int32.MaxValue; + int res = 0; + for (int i = 0; i < prices.Length; i++) + { + min = Math.Min(prices[i], min); + res = Math.Max(prices[i] - min, res); + } + return res; + } +} +``` + +> 动态规划 + +```csharp +public class Solution +{ + public int MaxProfit(int[] prices) + { + int[] dp = new int[2]; + int size = prices.Length; + (dp[0], dp[1]) = (-prices[0], 0); + for (int i = 0; i < size; i++) + { + dp[0] = Math.Max(dp[0], -prices[i]); + dp[1] = Math.Max(dp[1], dp[0]+prices[i]); + } + return dp[1]; + } +} +``` + @@ -471,3 +512,4 @@ function maxProfit(prices: number[]): number { + diff --git "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" index f5f3f7208b..f2aec68b56 100644 --- "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" +++ "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" @@ -169,8 +169,6 @@ class Solution { } ``` - - Python: > 版本一: @@ -253,8 +251,6 @@ func max(a,b int)int{ } ``` - - Javascript: ```javascript // 方法一:动态规划(dp 数组) @@ -331,9 +327,47 @@ function maxProfit(prices: number[]): number { }; ``` +C#: + +> 贪心法 + +```csharp +public class Solution +{ + public int MaxProfit(int[] prices) + { + int res = 0; + for (int i = 1; i < prices.Length; i++) + res += Math.Max(0, prices[i] - prices[i-1]); + return res; + } +} +``` + +> 动态规划 + +```csharp +public class Solution +{ + public int MaxProfit(int[] prices) + { + int[] dp = new int[2]; + dp[0] = -prices[0]; + + for (int i = 1; i < prices.Length; i++) + { + dp[0] = dp[0]>dp[1] - prices[i]?dp[0]:dp[1] - prices[i]; + dp[1] = dp[1] > dp[0] + prices[i] ? dp[1] : dp[0] + prices[i]; + } + return dp[1]; + } +} +``` +

+ From 924f5b105d8ba42cdef159570356eb40deb4a375 Mon Sep 17 00:00:00 2001 From: Peilin Sun <46664832+PPPerry@users.noreply.github.com> Date: Fri, 28 Oct 2022 20:53:21 +0800 Subject: [PATCH 1160/3019] =?UTF-8?q?Update=20=E6=A0=88=E4=B8=8E=E9=98=9F?= =?UTF-8?q?=E5=88=97=E7=90=86=E8=AE=BA=E5=9F=BA=E7=A1=80.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 错别字 --- ...\210\227\347\220\206\350\256\272\345\237\272\347\241\200.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/\346\240\210\344\270\216\351\230\237\345\210\227\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\346\240\210\344\270\216\351\230\237\345\210\227\347\220\206\350\256\272\345\237\272\347\241\200.md" index da3a6dfac2..66b8691981 100644 --- "a/problems/\346\240\210\344\270\216\351\230\237\345\210\227\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\346\240\210\344\270\216\351\230\237\345\210\227\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -59,7 +59,7 @@ C++标准库是有多个版本的,要知道我们使用的STL是哪个版本 ![栈与队列理论3](https://img-blog.csdnimg.cn/20210104235459376.png) -**我们常用的SGI STL,如果没有指定底层实现的话,默认是以deque为缺省情况下栈的低层结构。** +**我们常用的SGI STL,如果没有指定底层实现的话,默认是以deque为缺省情况下栈的底层结构。** deque是一个双向队列,只要封住一段,只开通另一端就可以实现栈的逻辑了。 From 7d11733da7c396e96abebf6bf8e5debc8d1e1300 Mon Sep 17 00:00:00 2001 From: wang2jun <91008685+wang2jun@users.noreply.github.com> Date: Sat, 29 Oct 2022 14:17:54 +0800 Subject: [PATCH 1161/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20841=E9=92=A5?= =?UTF-8?q?=E5=8C=99=E5=92=8C=E6=88=BF=E9=97=B4=20TS=20=EF=BC=88BFS?= =?UTF-8?q?=EF=BC=89=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加 841钥匙和房间 TS (BFS) 代码 --- ...31\345\222\214\346\210\277\351\227\264.md" | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git "a/problems/0841.\351\222\245\345\214\231\345\222\214\346\210\277\351\227\264.md" "b/problems/0841.\351\222\245\345\214\231\345\222\214\346\210\277\351\227\264.md" index 0233a710a6..5556922c28 100644 --- "a/problems/0841.\351\222\245\345\214\231\345\222\214\346\210\277\351\227\264.md" +++ "b/problems/0841.\351\222\245\345\214\231\345\222\214\346\210\277\351\227\264.md" @@ -387,6 +387,34 @@ var canVisitAllRooms = function(rooms) { ``` +### TypeScript +```ts +// BFS +// rooms :就是一个链接表 表示的有向图 +// 转换问题就是,一次遍历从 0开始 能不能 把所有的节点访问了,实质问题就是一个 +// 层序遍历 +function canVisitAllRooms(rooms: number[][]): boolean { + const n = rooms.length; + // cnt[i] 代表节点 i 的访问顺序, cnt[i] = 0, 代表没被访问过 + let cnt = new Array(n).fill(0); + let queue = [0]; + cnt[0]++; + while (queue.length > 0) { + const from = queue.shift(); + for (let i = 0; i < rooms[from].length; i++) { + const to = rooms[from][i]; + if (cnt[to] == 0) { + queue.push(to); + cnt[to]++; + } + } + } + // 只要其中有一个节点 没被访问过,那么就返回 false + return cnt.every((item) => item != 0); +} +``` + +

From 67a84f74c134a519c4681e00f89fe9f0663c66d3 Mon Sep 17 00:00:00 2001 From: fw_qaq <82551626+Jack-Zhang-1314@users.noreply.github.com> Date: Sat, 29 Oct 2022 18:17:20 +0800 Subject: [PATCH 1162/3019] =?UTF-8?q?update=200232.=E7=94=A8=E6=A0=88?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E9=98=9F=E5=88=97.md=20about=20rust?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...36\347\216\260\351\230\237\345\210\227.md" | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git "a/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" "b/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" index 1ed0c5d62b..e6a58be3df 100644 --- "a/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" +++ "b/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" @@ -622,6 +622,48 @@ class MyQueue() { } ``` +rust: + +```rust +struct MyQueue { + stack_in: Vec, + stack_out: Vec, +} +impl MyQueue { + + fn new() -> Self { + MyQueue { + stack_in: Vec::new(), + stack_out: Vec::new(), + } + + } + + fn push(&mut self, x: i32) { + self.stack_in.push(x); + } + + fn pop(&mut self) -> i32 { + if self.stack_out.is_empty(){ + while !self.stack_in.is_empty() { + self.stack_out.push(self.stack_in.pop().unwrap()); + } + } + self.stack_out.pop().unwrap() + } + + fn peek(&mut self) -> i32 { + let res = self.pop(); + self.stack_out.push(res); + res + } + + fn empty(&self) -> bool { + self.stack_in.is_empty() && self.stack_out.is_empty() + } +} +``` +

From 7950be58a29b0757189d3afdb25ccf45e1bbf2a6 Mon Sep 17 00:00:00 2001 From: fw_qaq <82551626+Jack-Zhang-1314@users.noreply.github.com> Date: Sat, 29 Oct 2022 18:18:34 +0800 Subject: [PATCH 1163/3019] =?UTF-8?q?Update=200232.=E7=94=A8=E6=A0=88?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E9=98=9F=E5=88=97.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...6\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" | 1 - 1 file changed, 1 deletion(-) diff --git "a/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" "b/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" index e6a58be3df..5858f9e0e4 100644 --- "a/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" +++ "b/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" @@ -630,7 +630,6 @@ struct MyQueue { stack_out: Vec, } impl MyQueue { - fn new() -> Self { MyQueue { stack_in: Vec::new(), From 9769fefe0f4305eabbf275d2db61e8cdd2871c31 Mon Sep 17 00:00:00 2001 From: fw_qaq <82551626+Jack-Zhang-1314@users.noreply.github.com> Date: Sat, 29 Oct 2022 18:47:41 +0800 Subject: [PATCH 1164/3019] =?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=20about=20rust?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...27\345\256\236\347\216\260\346\240\210.md" | 40 ++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git "a/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" "b/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" index 9aa8d8a119..2f01527270 100644 --- "a/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" +++ "b/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" @@ -1018,7 +1018,7 @@ class MyStack { } } ``` -> 单对列 +> 单队列 ```php class MyStack { public $queue; @@ -1051,6 +1051,44 @@ class MyStack { } } ``` + +> rust:单队列 + +```rust +struct MyStack { + queue: Vec, +} + +impl MyStack { + fn new() -> Self { + MyStack { queue: vec![] } + } + + fn push(&mut self, x: i32) { + self.queue.push(x); + } + + fn pop(&mut self) -> i32 { + let len = self.queue.len() - 1; + for _ in 0..len { + let tmp = self.queue.remove(0); + self.queue.push(tmp); + } + self.queue.remove(0) + } + + fn top(&mut self) -> i32 { + let res = self.pop(); + self.queue.push(res); + res + } + + fn empty(&self) -> bool { + self.queue.is_empty() + } +} +``` +

From 2df651a1358066246a72f3697dd04407628261d8 Mon Sep 17 00:00:00 2001 From: asiL-tcefreP <1626680964@qq.com> Date: Sat, 29 Oct 2022 13:54:57 -0400 Subject: [PATCH 1165/3019] =?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=20(Java=E7=89=88=E6=9C=AC)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...5\244\247\347\232\204\347\237\251\345\275\242.md" | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git "a/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" "b/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" index 220b096ea3..bcb0915e9c 100644 --- "a/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" +++ "b/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" @@ -206,7 +206,7 @@ class Solution { public int largestRectangleArea(int[] heights) { int length = heights.length; int[] minLeftIndex = new int [length]; - int[] maxRigthIndex = new int [length]; + int[] minRightIndex = new int [length]; // 记录左边第一个小于该柱子的下标 minLeftIndex[0] = -1 ; for (int i = 1; i < length; i++) { @@ -215,17 +215,17 @@ class Solution { while (t >= 0 && heights[t] >= heights[i]) t = minLeftIndex[t]; minLeftIndex[i] = t; } - // 记录每个柱子 右边第一个小于该柱子的下标 - maxRigthIndex[length - 1] = length; + // 记录每个柱子右边第一个小于该柱子的下标 + minRightIndex[length - 1] = length; for (int i = length - 2; i >= 0; i--) { int t = i + 1; - while(t < length && heights[t] >= heights[i]) t = maxRigthIndex[t]; - maxRigthIndex[i] = t; + while(t < length && heights[t] >= heights[i]) t = minRightIndex[t]; + minRightIndex[i] = t; } // 求和 int result = 0; for (int i = 0; i < length; i++) { - int sum = heights[i] * (maxRigthIndex[i] - minLeftIndex[i] - 1); + int sum = heights[i] * (minRightIndex[i] - minLeftIndex[i] - 1); result = Math.max(sum, result); } return result; From 2e5466bdce0a3d884a1a9084da74732a80fe806d Mon Sep 17 00:00:00 2001 From: fw_qaq <82551626+Jack-Zhang-1314@users.noreply.github.com> Date: Mon, 31 Oct 2022 10:41:54 +0800 Subject: [PATCH 1166/3019] =?UTF-8?q?update=200020.=E6=9C=89=E6=95=88?= =?UTF-8?q?=E7=9A=84=E6=8B=AC=E5=8F=B7.md=20about=20rust?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...10\347\232\204\346\213\254\345\217\267.md" | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git "a/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" "b/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" index 3d986a822c..69713c62fc 100644 --- "a/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" +++ "b/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" @@ -493,6 +493,33 @@ object Solution { } ``` +rust: + +```rust +impl Solution { + pub fn is_valid(s: String) -> bool { + if s.len() % 2 == 1 { + return false; + } + let mut stack = vec![]; + let mut chars: Vec = s.chars().collect(); + while let Some(s) = chars.pop() { + match s { + ')' => stack.push('('), + ']' => stack.push('['), + '}' => stack.push('{'), + _ => { + if stack.is_empty() || stack.pop().unwrap() != s { + return false; + } + } + } + } + stack.is_empty() + } +} +``` +

From 309b49cf47699554a928354e2621575ec524db2f Mon Sep 17 00:00:00 2001 From: fw_qaq <82551626+Jack-Zhang-1314@users.noreply.github.com> Date: Mon, 31 Oct 2022 10:59:59 +0800 Subject: [PATCH 1167/3019] =?UTF-8?q?update=201047.=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E5=AD=97=E7=AC=A6=E4=B8=B2=E4=B8=AD=E7=9A=84=E6=89=80=E6=9C=89?= =?UTF-8?q?=E7=9B=B8=E9=82=BB=E9=87=8D=E5=A4=8D=E9=A1=B9.md=20about=20rust?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...73\351\207\215\345\244\215\351\241\271.md" | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git "a/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" "b/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" index 849b5e7904..ad729298d5 100644 --- "a/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" +++ "b/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" @@ -447,6 +447,25 @@ object Solution { } ``` +rust: + +```rust +impl Solution { + pub fn remove_duplicates(s: String) -> String { + let mut stack = vec![]; + let mut chars: Vec = s.chars().collect(); + while let Some(c) = chars.pop() { + if stack.is_empty() || stack[stack.len() - 1] != c { + stack.push(c); + } else { + stack.pop(); + } + } + stack.into_iter().rev().collect() + } +} +``` +

From 3db9b494f9c433b2c8e9c350200a3ca877788865 Mon Sep 17 00:00:00 2001 From: fw_qaq <82551626+Jack-Zhang-1314@users.noreply.github.com> Date: Mon, 31 Oct 2022 11:53:08 +0800 Subject: [PATCH 1168/3019] =?UTF-8?q?update=200150.=E9=80=86=E6=B3=A2?= =?UTF-8?q?=E5=85=B0=E8=A1=A8=E8=BE=BE=E5=BC=8F=E6=B1=82=E5=80=BC.md=20abo?= =?UTF-8?q?ut=20rust?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...76\345\274\217\346\261\202\345\200\274.md" | 39 +++++++++++++++++-- 1 file changed, 35 insertions(+), 4 deletions(-) diff --git "a/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" "b/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" index 108c654bfe..78dfae3ea1 100644 --- "a/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" +++ "b/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" @@ -89,12 +89,8 @@ C++代码如下: class Solution { public: int evalRPN(vector& tokens) { -<<<<<<< HEAD - stack st; -======= // 力扣修改了后台测试数据,需要用longlong stack st; ->>>>>>> 28f3b52a82e3cc650290fb02030a53900e122f43 for (int i = 0; i < tokens.size(); i++) { if (tokens[i] == "+" || tokens[i] == "-" || tokens[i] == "*" || tokens[i] == "/") { long long num1 = st.top(); @@ -424,6 +420,41 @@ object Solution { } ``` + +rust: + +```rust +impl Solution { + pub fn eval_rpn(tokens: Vec) -> i32 { + let mut stack = vec![]; + for token in tokens.into_iter() { + match token.as_str() { + "+" => { + let a = stack.pop().unwrap(); + *stack.last_mut().unwrap() += a; + } + "-" => { + let a = stack.pop().unwrap(); + *stack.last_mut().unwrap() -= a; + } + "*" => { + let a = stack.pop().unwrap(); + *stack.last_mut().unwrap() *= a; + } + "/" => { + let a = stack.pop().unwrap(); + *stack.last_mut().unwrap() /= a; + } + _ => { + stack.push(token.parse::().unwrap()); + } + } + } + stack.pop().unwrap() + } +} +``` +

From 5b3b774083e5e204bd777652d6eb2452d83f06c4 Mon Sep 17 00:00:00 2001 From: fw_qaq <82551626+Jack-Zhang-1314@users.noreply.github.com> Date: Mon, 31 Oct 2022 13:10:25 +0800 Subject: [PATCH 1169/3019] =?UTF-8?q?update=200239.=E6=BB=91=E5=8A=A8?= =?UTF-8?q?=E7=AA=97=E5=8F=A3=E6=9C=80=E5=A4=A7=E5=80=BC.md=20about=20rust?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...43\346\234\200\345\244\247\345\200\274.md" | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git "a/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" "b/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" index 2d556d8b6d..40da879c3b 100644 --- "a/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" +++ "b/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" @@ -802,6 +802,35 @@ class myDequeue{ } ``` +rust: + +```rust +impl Solution { + pub fn max_sliding_window(nums: Vec, k: i32) -> Vec { + let mut res = vec![]; + let mut queue = VecDeque::with_capacity(k as usize); + for (i, &v) in nums.iter().enumerate() { + // 如果队列长度超过 k,那么需要移除队首过期元素 + if i - queue.front().unwrap_or(&0) == k as usize { + queue.pop_front(); + } + while let Some(&index) = queue.back() { + if nums[index] >= v { + break; + } + // 如果队列第一个元素比当前元素小,那么就把队列第一个元素弹出 + queue.pop_back(); + } + queue.push_back(i); + if i >= k as usize - 1 { + res.push(nums[queue[0]]); + } + } + res + } +} +``` +

From 31fa56d22947167a37ad767134ea98055314f367 Mon Sep 17 00:00:00 2001 From: fw_qaq <82551626+Jack-Zhang-1314@users.noreply.github.com> Date: Mon, 31 Oct 2022 17:48:33 +0800 Subject: [PATCH 1170/3019] =?UTF-8?q?0347.=E5=89=8DK=E4=B8=AA=E9=AB=98?= =?UTF-8?q?=E9=A2=91=E5=85=83=E7=B4=A0.md=20about=20rust?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...30\351\242\221\345\205\203\347\264\240.md" | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git "a/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" "b/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" index 4745645538..56dbaa33b3 100644 --- "a/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" +++ "b/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" @@ -487,7 +487,34 @@ object Solution { .map(_._1) } } +``` +rust: 小根堆 + +```rust +use std::cmp::Reverse; +use std::collections::{BinaryHeap, HashMap}; +impl Solution { + pub fn top_k_frequent(nums: Vec, k: i32) -> Vec { + let mut hash = HashMap::new(); + let mut heap = BinaryHeap::with_capacity(k as usize); + nums.into_iter().for_each(|k| { + *hash.entry(k).or_insert(0) += 1; + }); + + for (k, v) in hash { + if heap.len() == heap.capacity() { + if *heap.peek().unwrap() < (Reverse(v), k) { + continue; + } else { + heap.pop(); + } + } + heap.push((Reverse(v), k)); + } + heap.into_iter().map(|(_, k)| k).collect() + } +} ```

From f29352fa2760bd04bf6b4dcf53a626d92bd2833f Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Fri, 4 Nov 2022 12:05:26 +0800 Subject: [PATCH 1171/3019] Update --- ...7.\350\247\243\346\225\260\347\213\254.md" | 22 +-- ...\345\220\210\346\200\273\345\222\214II.md" | 8 ++ ...\345\205\250\346\216\222\345\210\227II.md" | 2 +- ...15\345\220\214\350\267\257\345\276\204.md" | 2 +- ...0.\347\210\254\346\245\274\346\242\257.md" | 4 + ...14\345\214\205\347\211\210\346\234\254.md" | 11 +- ...60\344\272\214\345\217\211\346\240\221.md" | 2 +- ...02\345\272\217\351\201\215\345\216\206.md" | 20 --- ...76\345\274\217\346\261\202\345\200\274.md" | 4 - ...15\345\274\202\344\275\215\350\257\215.md" | 2 +- ...50\345\271\263\346\226\271\346\225\260.md" | 4 +- ...66\351\222\261\345\205\221\346\215\242.md" | 3 +- ...42\351\202\243\345\245\221\346\225\260.md" | 3 + ...71\347\210\254\346\245\274\346\242\257.md" | 134 +++++++++--------- "problems/\345\211\215\345\272\217/vim.md" | 7 +- ...25\346\200\273\347\273\223\347\257\207.md" | 3 + 16 files changed, 114 insertions(+), 117 deletions(-) diff --git "a/problems/0037.\350\247\243\346\225\260\347\213\254.md" "b/problems/0037.\350\247\243\346\225\260\347\213\254.md" index f1f621edaf..fc1e3114d3 100644 --- "a/problems/0037.\350\247\243\346\225\260\347\213\254.md" +++ "b/problems/0037.\350\247\243\346\225\260\347\213\254.md" @@ -44,7 +44,7 @@ [N皇后问题](https://programmercarl.com/0051.N皇后.html)是因为每一行每一列只放一个皇后,只需要一层for循环遍历一行,递归来来遍历列,然后一行一列确定皇后的唯一位置。 -本题就不一样了,**本题中棋盘的每一个位置都要放一个数字,并检查数字是否合法,解数独的树形结构要比N皇后更宽更深**。 +本题就不一样了,**本题中棋盘的每一个位置都要放一个数字(而N换后是一行只放一个皇后),并检查数字是否合法,解数独的树形结构要比N皇后更宽更深**。 因为这个树形结构太大了,我抽取一部分,如图所示: @@ -57,7 +57,7 @@ **递归函数的返回值需要是bool类型,为什么呢?** -因为解数独找到一个符合的条件(就在树的叶子节点上)立刻就返回,相当于找从根节点到叶子节点一条唯一路径,所以需要使用bool返回值,这一点在[回溯算法:N皇后问题](https://programmercarl.com/0051.N皇后.html)中已经介绍过了,一样的道理。 +因为解数独找到一个符合的条件(就在树的叶子节点上)立刻就返回,相当于找从根节点到叶子节点一条唯一路径,所以需要使用bool返回值。 代码如下: @@ -157,15 +157,16 @@ private: bool backtracking(vector>& board) { for (int i = 0; i < board.size(); i++) { // 遍历行 for (int j = 0; j < board[0].size(); j++) { // 遍历列 - if (board[i][j] != '.') continue; - for (char k = '1'; k <= '9'; k++) { // (i, j) 这个位置放k是否合适 - if (isValid(i, j, k, board)) { - board[i][j] = k; // 放置k - if (backtracking(board)) return true; // 如果找到合适一组立刻返回 - board[i][j] = '.'; // 回溯,撤销k + if (board[i][j] == '.') { + for (char k = '1'; k <= '9'; k++) { // (i, j) 这个位置放k是否合适 + if (isValid(i, j, k, board)) { + board[i][j] = k; // 放置k + if (backtracking(board)) return true; // 如果找到合适一组立刻返回 + board[i][j] = '.'; // 回溯,撤销k + } } - } - return false; // 9个数都试完了,都不行,那么就返回false + return false; // 9个数都试完了,都不行,那么就返回false + } } } return true; // 遍历完没有返回false,说明找到了合适棋盘位置了 @@ -197,6 +198,7 @@ public: backtracking(board); } }; + ``` ## 总结 diff --git "a/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" "b/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" index 46b33c89fc..fcfc396b12 100644 --- "a/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" +++ "b/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" @@ -131,8 +131,16 @@ if (sum == target) { * used[i - 1] == true,说明同一树枝candidates[i - 1]使用过 * used[i - 1] == false,说明同一树层candidates[i - 1]使用过 +可能有的录友想,为什么 used[i - 1] == false 就是同一树层呢,因为同一树层,used[i - 1] == false 才能表示,当前取的 candidates[i] 是从 candidates[i - 1] 回溯而来的。 + +而 used[i - 1] == true,说明是进入下一层递归,去下一个数,所以是树枝上,如图所示: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20221021163812.png) + + **这块去重的逻辑很抽象,网上搜的题解基本没有能讲清楚的,如果大家之前思考过这个问题或者刷过这道题目,看到这里一定会感觉通透了很多!** + 那么单层搜索的逻辑代码如下: ```CPP diff --git "a/problems/0047.\345\205\250\346\216\222\345\210\227II.md" "b/problems/0047.\345\205\250\346\216\222\345\210\227II.md" index bac30a44ce..c809c62d62 100644 --- "a/problems/0047.\345\205\250\346\216\222\345\210\227II.md" +++ "b/problems/0047.\345\205\250\346\216\222\345\210\227II.md" @@ -66,7 +66,7 @@ private: } for (int i = 0; i < nums.size(); i++) { // used[i - 1] == true,说明同一树枝nums[i - 1]使用过 - // used[i - 1] == false,说明同一树层nums[i - 1]使用过 + // used[i - 1] == false,说明同一树层nums[i - 1]使用过 // 如果同一树层nums[i - 1]使用过则直接跳过 if (i > 0 && nums[i] == nums[i - 1] && used[i - 1] == false) { continue; diff --git "a/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" "b/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" index ad5c6f3e74..2367587c25 100644 --- "a/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" +++ "b/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" @@ -114,7 +114,7 @@ for (int j = 0; j < n; j++) dp[0][j] = 1; 4. 确定遍历顺序 -这里要看一下递归公式dp[i][j] = dp[i - 1][j] + dp[i][j - 1],dp[i][j]都是从其上方和左方推导而来,那么从左到右一层一层遍历就可以了。 +这里要看一下递推公式dp[i][j] = dp[i - 1][j] + dp[i][j - 1],dp[i][j]都是从其上方和左方推导而来,那么从左到右一层一层遍历就可以了。 这样就可以保证推导dp[i][j]的时候,dp[i - 1][j] 和 dp[i][j - 1]一定是有数值的。 diff --git "a/problems/0070.\347\210\254\346\245\274\346\242\257.md" "b/problems/0070.\347\210\254\346\245\274\346\242\257.md" index 3acc4c11e4..335ddb2324 100644 --- "a/problems/0070.\347\210\254\346\245\274\346\242\257.md" +++ "b/problems/0070.\347\210\254\346\245\274\346\242\257.md" @@ -28,6 +28,10 @@ * 1 阶 + 2 阶 * 2 阶 + 1 阶 +# 视频讲解 + +**《代码随想录》算法视频公开课:[带你学透动态规划-爬楼梯|LeetCode:70.爬楼梯)](https://www.bilibili.com/video/BV17h411h7UH),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 + ## 思路 diff --git "a/problems/0070.\347\210\254\346\245\274\346\242\257\345\256\214\345\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md" "b/problems/0070.\347\210\254\346\245\274\346\242\257\345\256\214\345\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md" index 4925c31262..3093c83325 100644 --- "a/problems/0070.\347\210\254\346\245\274\346\242\257\345\256\214\345\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md" +++ "b/problems/0070.\347\210\254\346\245\274\346\242\257\345\256\214\345\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md" @@ -3,13 +3,8 @@

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

-# 动态规划:以前我没得选,现在我选择再爬一次! -之前讲这道题目的时候,因为还没有讲背包问题,所以就只是讲了一下爬楼梯最直接的动规方法(斐波那契)。 - -**这次终于讲到了背包问题,我选择带录友们再爬一次楼梯!** - -## 70. 爬楼梯 +# 70. 爬楼梯 [力扣题目链接](https://leetcode.cn/problems/climbing-stairs/) @@ -36,6 +31,10 @@ ## 思路 +之前讲这道题目的时候,因为还没有讲背包问题,所以就只是讲了一下爬楼梯最直接的动规方法(斐波那契)。 + +**这次终于讲到了背包问题,我选择带录友们再爬一次楼梯!** + 这道题目 我们在[动态规划:爬楼梯](https://programmercarl.com/0070.爬楼梯.html) 中已经讲过一次了,原题其实是一道简单动规的题目。 既然这么简单为什么还要讲呢,其实本题稍加改动就是一道面试好题。 diff --git "a/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" "b/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" index a0870fddae..30ca3d7729 100644 --- "a/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" @@ -426,8 +426,8 @@ class Solution: st.append(root.left) st.append(root.right) while st: - leftNode = st.pop() rightNode = st.pop() + leftNode = st.pop() if not leftNode and not rightNode: continue if not leftNode or not rightNode or leftNode.val != rightNode.val: diff --git "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" index aebb6f0851..3a4e0a31ee 100644 --- "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" +++ "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" @@ -2073,26 +2073,6 @@ class Solution: if curnode.right: queue.append(curnode.right) return root -# 链表解法 -class Solution: - def connect(self, root: 'Node') -> 'Node': - if not root: - return None - first = root - while first: # 遍历每一层 - dummyHead = Node(None) # 为下一行创建一个虚拟头节点,相当于下一行所有节点链表的头结点(每一层都会创建); - tail = dummyHead # 为下一行维护一个尾节点指针(初始化是虚拟节点) - cur = first - while cur: # 遍历当前层的节点 - if cur.left: # 链接下一行的节点 - tail.next = cur.left - tail = tail.next - if cur.right: - tail.next = cur.right - tail = tail.next - cur = cur.next # cur同层移动到下一节点 - first = dummyHead.next # 此处为换行操作,更新到下一行 - return root ``` JavaScript: ```javascript diff --git "a/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" "b/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" index 108c654bfe..bf90b89b60 100644 --- "a/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" +++ "b/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" @@ -89,12 +89,8 @@ C++代码如下: class Solution { public: int evalRPN(vector& tokens) { -<<<<<<< HEAD - stack st; -======= // 力扣修改了后台测试数据,需要用longlong stack st; ->>>>>>> 28f3b52a82e3cc650290fb02030a53900e122f43 for (int i = 0; i < tokens.size(); i++) { if (tokens[i] == "+" || tokens[i] == "-" || tokens[i] == "*" || tokens[i] == "/") { long long num1 = st.top(); diff --git "a/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" "b/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" index 556bf39a4f..f8ebc545b8 100644 --- "a/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" +++ "b/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" @@ -361,7 +361,7 @@ C#: ## 相关题目 -* 383.赎金信 +* [383.赎金信](https://programmercarl.com/0383.%E8%B5%8E%E9%87%91%E4%BF%A1.html) * 49.字母异位词分组 * 438.找到字符串中所有字母异位词 diff --git "a/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" "b/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" index 7596da12df..6acc48917a 100644 --- "a/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" +++ "b/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" @@ -3,9 +3,9 @@

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

-# 动态规划:一样的套路,再求一次完全平方数 -## 279.完全平方数 + +# 279.完全平方数 [力扣题目链接](https://leetcode.cn/problems/perfect-squares/) diff --git "a/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" "b/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" index 7f2e698874..e337717fbb 100644 --- "a/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" +++ "b/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" @@ -3,9 +3,8 @@

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

-# 动态规划: 给我个机会,我再兑换一次零钱 -## 322. 零钱兑换 +# 322. 零钱兑换 [力扣题目链接](https://leetcode.cn/problems/coin-change/) diff --git "a/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" "b/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" index d3c58f4401..1fa5ca1838 100644 --- "a/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" +++ "b/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" @@ -32,6 +32,9 @@ F(n) = F(n - 1) + F(n - 2),其中 n > 1 * 0 <= n <= 30 +# 视频讲解 + +**《代码随想录》算法视频公开课:[手把手带你入门动态规划 | leetcode:509.斐波那契数](https://www.bilibili.com/video/BV1f5411K7mo),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 ## 思路 diff --git "a/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" "b/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" index cec6f704a4..b6f5a734fe 100644 --- "a/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" +++ "b/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" @@ -4,10 +4,15 @@

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+ + + # 746. 使用最小花费爬楼梯 [力扣题目链接](https://leetcode.cn/problems/min-cost-climbing-stairs/) +**旧题目描述**: + 数组的每个下标作为一个阶梯,第 i 个阶梯对应着一个非负数的体力花费值 cost[i](下标从 0 开始)。 每当你爬上一个阶梯你都要花费对应的体力值,一旦支付了相应的体力值,你就可以选择向上爬一个阶梯或者爬两个阶梯。 @@ -30,21 +35,32 @@ * cost 的长度范围是 [2, 1000]。 * cost[i] 将会是一个整型数据,范围为 [0, 999] 。 -## 思路 +----------------- + +本题之前的题目描述是很模糊的,看不出来,第一步需要花费体力值,最后一步不用花费,还是说 第一步不花费体力值,最后一步花费。 + +后来力扣改了题目描述,**新题目描述**: + +给你一个整数数组 cost ,其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。 -这道题目可以说是昨天[动态规划:爬楼梯](https://programmercarl.com/0070.爬楼梯.html)的花费版本。 +你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。 -**注意题目描述:每当你爬上一个阶梯你都要花费对应的体力值,一旦支付了相应的体力值,你就可以选择向上爬一个阶梯或者爬两个阶梯** +请你计算并返回达到楼梯顶部的最低花费。 -所以示例1中只花费一个15 就可以到阶梯顶,最后一步可以理解为 不用花费。 +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20221031170131.png) -读完题大家应该知道指定需要动态规划的,贪心是不可能了。 + +## 思路 + +(**在力扣修改了题目描述下,我又重新修改了题解**) + +修改之后的题意就比较明确了,题目中说 “你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯” 也就是相当于 跳到 下标 0 或者 下标 1 是不花费体力的, 从 下标 0 下标1 开始跳就要花费体力了。 1. 确定dp数组以及下标的含义 使用动态规划,就要有一个数组来记录状态,本题只需要一个一维数组dp[i]就可以了。 -**dp[i]的定义:到达第i个台阶所花费的最少体力为dp[i]**。(注意这里认为是第一步一定是要花费) +**dp[i]的定义:到达第i台阶所花费的最少体力为dp[i]**。 **对于dp数组的定义,大家一定要清晰!** @@ -52,25 +68,27 @@ **可以有两个途径得到dp[i],一个是dp[i-1] 一个是dp[i-2]**。 -那么究竟是选dp[i-1]还是dp[i-2]呢? +dp[i - 1] 跳到 dp[i] 需要花费 dp[i - 1] + cost[i - 1]。 -一定是选最小的,所以dp[i] = min(dp[i - 1], dp[i - 2]) + cost[i]; +dp[i - 2] 跳到 dp[i] 需要花费 dp[i - 2] + cost[i - 2]。 + +那么究竟是选从dp[i - 1]跳还是从dp[i - 2]跳呢? + +一定是选最小的,所以dp[i] = min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]); -**注意这里为什么是加cost[i],而不是cost[i-1],cost[i-2]之类的**,因为题目中说了:每当你爬上一个阶梯你都要花费对应的体力值 3. dp数组如何初始化 -根据dp数组的定义,dp数组初始化其实是比较难的,因为不可能初始化为第i台阶所花费的最少体力。 +看一下递归公式,dp[i]由dp[i - 1],dp[i - 2]推出,既然初始化所有的dp[i]是不可能的,那么只初始化dp[0]和dp[1]就够了,其他的最终都是dp[0]dp[1]推出。 -那么看一下递归公式,dp[i]由dp[i-1],dp[i-2]推出,既然初始化所有的dp[i]是不可能的,那么只初始化dp[0]和dp[1]就够了,其他的最终都是dp[0]dp[1]推出。 +那么 dp[0] 应该是多少呢? 根据dp数组的定义,到达第0台阶所花费的最小体力为dp[0],那么有同学可能想,那dp[0] 应该是 cost[0],例如 cost = [1, 100, 1, 1, 1, 100, 1, 1, 100, 1] 的话,dp[0] 就是 cost[0] 应该是1。 -所以初始化代码为: +这里就要说名了,本题力扣为什么改题意了,而且修改题意之后 就清晰很多的原因了。 + +新题目描述中明确说了 “你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。” 也就是说 从 到达 第 0 个台阶是不花费的,但从 第0 个台阶 往上跳的话,需要花费 cost[0]。 + +所以初始化 dp[0] = 0,dp[1] = 0; -```CPP -vector dp(cost.size()); -dp[0] = cost[0]; -dp[1] = cost[1]; -``` 4. 确定遍历顺序 @@ -78,11 +96,10 @@ dp[1] = cost[1]; 本题的遍历顺序其实比较简单,简单到很多同学都忽略了思考这一步直接就把代码写出来了。 -因为是模拟台阶,而且dp[i]又dp[i-1]dp[i-2]推出,所以是从前到后遍历cost数组就可以了。 - -**但是稍稍有点难度的动态规划,其遍历顺序并不容易确定下来**。 +因为是模拟台阶,而且dp[i]由dp[i-1]dp[i-2]推出,所以是从前到后遍历cost数组就可以了。 -例如:01背包,都知道两个for循环,一个for遍历物品嵌套一个for遍历背包容量,那么为什么不是一个for遍历背包容量嵌套一个for遍历物品呢? 以及在使用一维dp数组的时候遍历背包容量为什么要倒序呢? +> **但是稍稍有点难度的动态规划,其遍历顺序并不容易确定下来**。 +> 例如:01背包,都知道两个for循环,一个for遍历物品嵌套一个for遍历背包容量,那么为什么不是一个for遍历背包容量嵌套一个for遍历物品呢? 以及在使用一维dp数组的时候遍历背包容量为什么要倒序呢? **这些都是遍历顺序息息相关。当然背包问题后续「代码随想录」都会重点讲解的!** @@ -90,29 +107,26 @@ dp[1] = cost[1]; 拿示例2:cost = [1, 100, 1, 1, 1, 100, 1, 1, 100, 1] ,来模拟一下dp数组的状态变化,如下: -![746.使用最小花费爬楼梯](https://img-blog.csdnimg.cn/2021010621363669.png) +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20221026175104.png) 如果大家代码写出来有问题,就把dp数组打印出来,看看和如上推导的是不是一样的。 以上分析完毕,整体C++代码如下: ```CPP -// 版本一 class Solution { public: int minCostClimbingStairs(vector& cost) { - vector dp(cost.size()); - dp[0] = cost[0]; - dp[1] = cost[1]; - for (int i = 2; i < cost.size(); i++) { - dp[i] = min(dp[i - 1], dp[i - 2]) + cost[i]; + vector dp(cost.size() + 1); + dp[0] = 0; // 默认第一步都是不花费体力的 + dp[1] = 0; + for (int i = 2; i <= cost.size(); i++) { + dp[i] = min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]); } - // 注意最后一步可以理解为不用花费,所以取倒数第一步,第二步的最少值 - return min(dp[cost.size() - 1], dp[cost.size() - 2]); + return dp[cost.size()]; } }; ``` - * 时间复杂度:O(n) * 空间复杂度:O(n) @@ -123,14 +137,14 @@ public: class Solution { public: int minCostClimbingStairs(vector& cost) { - int dp0 = cost[0]; - int dp1 = cost[1]; - for (int i = 2; i < cost.size(); i++) { - int dpi = min(dp0, dp1) + cost[i]; + int dp0 = 0; + int dp1 = 0; + for (int i = 2; i <= cost.size(); i++) { + int dpi = min(dp1 + cost[i - 1], dp0 + cost[i - 2]); dp0 = dp1; // 记录一下前两位 dp1 = dpi; } - return min(dp0, dp1); + return dp1; } }; @@ -139,47 +153,32 @@ public: * 时间复杂度:O(n) * 空间复杂度:O(1) -**当然我不建议这么写,能写出版本一就可以了,直观简洁!** - -在后序的讲解中,可能我会忽略这种版本二的写法,大家只要知道有这么个写法就可以了哈。 - -## 拓展 - -这道题描述也确实有点魔幻。 - -题目描述为:每当你爬上一个阶梯你都要花费对应的体力值,一旦支付了相应的体力值,你就可以选择向上爬一个阶梯或者爬两个阶梯。 - -示例1: - -输入:cost = [10, 15, 20] -输出:15 - +当然如果在面试中,能写出版本一就行,除非面试官额外要求 空间复杂度,那么再去思考版本二,因为版本二还是有点绕。版本一才是正常思路。 -**从题目描述可以看出:要不是第一步不需要花费体力,要不就是第最后一步不需要花费体力,我个人理解:题意说的其实是第一步是要支付费用的!**。因为是当你爬上一个台阶就要花费对应的体力值! -所以我定义的dp[i]意思是也是第一步是要花费体力的,最后一步不用花费体力了,因为已经支付了。 +## 拓展 -当然也可以样,定义dp[i]为:第一步是不花费体力,最后一步是花费体力的。 +旧力扣描述,如果按照 第一步是花费的,最后一步不花费,那么代码是这么写的,提交也可以通过 -所以代码这么写: ```CPP +// 版本一 class Solution { public: int minCostClimbingStairs(vector& cost) { - vector dp(cost.size() + 1); - dp[0] = 0; // 默认第一步都是不花费体力的 - dp[1] = 0; - for (int i = 2; i <= cost.size(); i++) { - dp[i] = min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]); + vector dp(cost.size()); + dp[0] = cost[0]; // 第一步有花费 + dp[1] = cost[1]; + for (int i = 2; i < cost.size(); i++) { + dp[i] = min(dp[i - 1], dp[i - 2]) + cost[i]; } - return dp[cost.size()]; + // 注意最后一步可以理解为不用花费,所以取倒数第一步,第二步的最少值 + return min(dp[cost.size() - 1], dp[cost.size() - 2]); } }; ``` -这么写看上去比较顺,但是就是感觉和题目描述的不太符。哈哈,也没有必要这么细扣题意了,大家只要知道,题目的意思反正就是要不是第一步不花费,要不是最后一步不花费,都可以。 - +当然如果对 动态规划 理解不够深入的话,拓展内容就别看了,容易越看越懵。 ## 总结 @@ -193,17 +192,18 @@ public: 但我也可以随便选来一道难题讲呗,这其实是最省事的,不用管什么题目顺序,看心情找一道就讲。 -难的是把题目按梯度排好,循序渐进,再按照统一方法论把这些都串起来,哈哈,所以大家不要催我哈,按照我的节奏一步一步来就行啦。 +难的是把题目按梯度排好,循序渐进,再按照统一方法论把这些都串起来,所以大家不要催我哈,按照我的节奏一步一步来就行了。 学算法,认准「代码随想录」,没毛病! -## 其他语言版本 +## 其他语言版本 +以下版本其他语言版本,大多是按照旧力扣题解来写的,欢迎大家在[Github](https://github.com/youngyangyang04/leetcode-master)上[提交pr](https://mp.weixin.qq.com/s/tqCxrMEU-ajQumL1i8im9A),修正一波。 ### Java ```Java -// 方式一:第一步支付费用 +// 方式一:第一步不支付费用 class Solution { public int minCostClimbingStairs(int[] cost) { int len = cost.length; @@ -224,7 +224,7 @@ class Solution { ``` ```Java -// 方式二:第一步不支付费用 +// 方式二:第一步支付费用 class Solution { public int minCostClimbingStairs(int[] cost) { int[] dp = new int[cost.length]; diff --git "a/problems/\345\211\215\345\272\217/vim.md" "b/problems/\345\211\215\345\272\217/vim.md" index c49ff1e32a..ce4a0139f2 100644 --- "a/problems/\345\211\215\345\272\217/vim.md" +++ "b/problems/\345\211\215\345\272\217/vim.md" @@ -1,4 +1,6 @@ -# 人生苦短,我用VIM! +# 人生苦短,我用VIM!| 最强vim配置 + +> Github地址:[https://github.com/youngyangyang04/PowerVim](https://github.com/youngyangyang04/PowerVim) 熟悉我的录友,应该都知道我是vim流,无论是写代码还是写文档(Markdown),都是vim,都没用IDE。 @@ -53,7 +55,7 @@ IDE那么很吃内存,打开个IDE卡半天,用VIM就很轻便了,秒开 |_| \___/ \_/\_/ \___|_| \/ |_|_| |_| |_| ``` -这个配置我开源在Github上,地址:https://github.com/youngyangyang04/PowerVim +这个配置我开源在Github上,地址:[https://github.com/youngyangyang04/PowerVim](https://github.com/youngyangyang04/PowerVim) @@ -92,6 +94,7 @@ sh install.sh ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211013102249.png) +Github地址:[https://github.com/youngyangyang04/PowerVim](https://github.com/youngyangyang04/PowerVim) 最后,因为这个vim配置因为我一直没有宣传,所以star数量很少,哈哈哈,录友们去给个star吧,真正的开发利器,值得顶起来! diff --git "a/problems/\350\264\252\345\277\203\347\256\227\346\263\225\346\200\273\347\273\223\347\257\207.md" "b/problems/\350\264\252\345\277\203\347\256\227\346\263\225\346\200\273\347\273\223\347\257\207.md" index 86cd053faf..d70eecaa00 100644 --- "a/problems/\350\264\252\345\277\203\347\256\227\346\263\225\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/\350\264\252\345\277\203\347\256\227\346\263\225\346\200\273\347\273\223\347\257\207.md" @@ -4,6 +4,9 @@

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+# 贪心算法总结篇 + + 我刚刚开始讲解贪心系列的时候就说了,贪心系列并不打算严格的从简单到困难这么个顺序来讲解。 因为贪心的简单题可能往往过于简单甚至感觉不到贪心,如果我连续几天讲解简单的贪心,估计录友们一定会不耐烦了,会感觉贪心有啥好学的。 From 7803388377332c18559fa19296b064aa076a1f1b Mon Sep 17 00:00:00 2001 From: fw_qaq <82551626+Jack-Zhang-1314@users.noreply.github.com> Date: Sat, 5 Nov 2022 14:30:53 +0800 Subject: [PATCH 1172/3019] =?UTF-8?q?update=20=E4=BA=8C=E5=8F=89=E6=A0=91?= =?UTF-8?q?=E7=90=86=E8=AE=BA=E5=9F=BA=E7=A1=80.md=20about=20rust?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...06\350\256\272\345\237\272\347\241\200.md" | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" index e377626c8b..d520273a99 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -270,6 +270,29 @@ class TreeNode(_value: Int = 0, _left: TreeNode = null, _right: TreeNode = null) var right: TreeNode = _right } ``` + +rust: + +```rust +#[derive(Debug, PartialEq, Eq)] +pub struct TreeNode { + pub val: i32, + pub left: Option>>, + pub right: Option>>, +} + +impl TreeNode { + #[inline] + pub fn new(val: i32) -> Self { + TreeNode { + val, + left: None, + right: None, + } + } +} +``` +

From 72b6043daa4956cf6d0045e279792f1c35dd78b7 Mon Sep 17 00:00:00 2001 From: fw_qaq <82551626+Jack-Zhang-1314@users.noreply.github.com> Date: Sat, 5 Nov 2022 14:36:15 +0800 Subject: [PATCH 1173/3019] =?UTF-8?q?Update=20=E4=BA=8C=E5=8F=89=E6=A0=91?= =?UTF-8?q?=E7=90=86=E8=AE=BA=E5=9F=BA=E7=A1=80.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...7\220\206\350\256\272\345\237\272\347\241\200.md" | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" index d520273a99..034229602a 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -275,15 +275,15 @@ rust: ```rust #[derive(Debug, PartialEq, Eq)] -pub struct TreeNode { - pub val: i32, - pub left: Option>>, - pub right: Option>>, +pub struct TreeNode { + pub val: T, + pub left: Option>>>, + pub right: Option>>>, } -impl TreeNode { +impl TreeNode { #[inline] - pub fn new(val: i32) -> Self { + pub fn new(val: T) -> Self { TreeNode { val, left: None, From c64c013b9b157b99ac6a87308a2e4352abbd989f Mon Sep 17 00:00:00 2001 From: fw_qaq <82551626+Jack-Zhang-1314@users.noreply.github.com> Date: Sat, 5 Nov 2022 16:24:41 +0800 Subject: [PATCH 1174/3019] =?UTF-8?q?update=20=E4=BA=8C=E5=8F=89=E6=A0=91?= =?UTF-8?q?=E7=9A=84=E9=80=92=E5=BD=92=E9=81=8D=E5=8E=86.md=20about=20rust?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...22\345\275\222\351\201\215\345\216\206.md" | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" index 03304cafee..788610403b 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" @@ -525,6 +525,46 @@ object Solution { } } ``` + +rust: + +```rust +use std::cell::RefCell; +use std::rc::Rc; +impl Solution { + pub fn preorder_traversal(root: Option>>) -> Vec { + let mut res = vec![]; + Self::traverse(&root, &mut res); + res + } + +//前序遍历 + pub fn traverse(root: &Option>>, res: &mut Vec) { + if let Some(node) = root { + res.push(node.borrow().val); + Self::traverse(&node.borrow().left, res); + Self::traverse(&node.borrow().right, res); + } + } +//后序遍历 + pub fn traverse(root: &Option>>, res: &mut Vec) { + if let Some(node) = root { + Self::traverse(&node.borrow().left, res); + Self::traverse(&node.borrow().right, res); + res.push(node.borrow().val); + } + } +//中序遍历 + pub fn traverse(root: &Option>>, res: &mut Vec) { + if let Some(node) = root { + Self::traverse(&node.borrow().left, res); + res.push(node.borrow().val); + Self::traverse(&node.borrow().right, res); + } + } +} +``` +

From 51d8be645aab9f15101c759535785492c4162e58 Mon Sep 17 00:00:00 2001 From: Zeeland <287017217@qq.com> Date: Sat, 5 Nov 2022 18:08:43 +0800 Subject: [PATCH 1175/3019] =?UTF-8?q?Update=200242.=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=8D.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 删除一行不必要的print,简化for循环代码 --- ...7\346\257\215\345\274\202\344\275\215\350\257\215.md" | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git "a/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" "b/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" index f8ebc545b8..b7100b52de 100644 --- "a/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" +++ "b/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" @@ -123,12 +123,11 @@ Python: class Solution: def isAnagram(self, s: str, t: str) -> bool: record = [0] * 26 - for i in range(len(s)): + for i in s: #并不需要记住字符a的ASCII,只要求出一个相对数值就可以了 - record[ord(s[i]) - ord("a")] += 1 - print(record) - for i in range(len(t)): - record[ord(t[i]) - ord("a")] -= 1 + record[ord(i) - ord("a")] += 1 + for i in t: + record[ord(i) - ord("a")] -= 1 for i in range(26): if record[i] != 0: #record数组如果有的元素不为零0,说明字符串s和t 一定是谁多了字符或者谁少了字符。 From 7f53e73e544dd650bc7c8efb321fbaafe775fbe3 Mon Sep 17 00:00:00 2001 From: Zeeland <287017217@qq.com> Date: Sat, 5 Nov 2022 18:22:51 +0800 Subject: [PATCH 1176/3019] =?UTF-8?q?Update=200242.=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=8D.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加新的python题解方法 --- ...346\257\215\345\274\202\344\275\215\350\257\215.md" | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git "a/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" "b/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" index f8ebc545b8..93ab90a298 100644 --- "a/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" +++ "b/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" @@ -154,6 +154,16 @@ class Solution: return s_dict == t_dict ``` +Python写法三(没有使用数组作为哈希表,只是介绍Counter这种更方便的解题思路): + +```python +class Solution(object): + def isAnagram(self, s: str, t: str) -> bool: + from collections import Counter + a_count = Counter(s) + b_count = Counter(t) + return a_count == b_count +``` Go: From 4ecf4714c71f2ca6ea3179a161beec76adfc118b Mon Sep 17 00:00:00 2001 From: fw_qaq <82551626+Jack-Zhang-1314@users.noreply.github.com> Date: Mon, 7 Nov 2022 00:08:02 +0800 Subject: [PATCH 1177/3019] =?UTF-8?q?update=20=E4=BA=8C=E5=8F=89=E6=A0=91?= =?UTF-8?q?=E7=9A=84=E8=BF=AD=E4=BB=A3=E9=81=8D=E5=8E=86.md=20about=20rust?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...55\344\273\243\351\201\215\345\216\206.md" | 54 +++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" index a20f11cbab..2f67c323fa 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" @@ -640,6 +640,60 @@ object Solution { } } ``` + +rust: + +```rust +use std::cell::RefCell; +use std::rc::Rc; +impl Solution { + //前序 + pub fn preorder_traversal(root: Option>>) -> Vec { + let mut res = vec![]; + let mut stack = vec![root]; + while !stack.is_empty() { + if let Some(node) = stack.pop().unwrap() { + res.push(node.borrow().val); + stack.push(node.borrow().right.clone()); + stack.push(node.borrow().left.clone()); + } + } + res + } + //中序 + pub fn inorder_traversal(root: Option>>) -> Vec { + let mut res = vec![]; + let mut stack = vec![]; + let mut node = root; + + while !stack.is_empty() || node.is_some() { + while let Some(n) = node { + node = n.borrow().left.clone(); + stack.push(n); + } + if let Some(n) = stack.pop() { + res.push(n.borrow().val); + node = n.borrow().right.clone(); + } + } + res + } + //后序 + pub fn postorder_traversal(root: Option>>) -> Vec { + let mut res = vec![]; + let mut stack = vec![root]; + while !stack.is_empty() { + if let Some(node) = stack.pop().unwrap() { + res.push(node.borrow().val); + stack.push(node.borrow().left.clone()); + stack.push(node.borrow().right.clone()); + } + } + res.into_iter().rev().collect() + } +} +``` +

From 1e40f295a9906df7b5c4308cb1fe733e73bf02b4 Mon Sep 17 00:00:00 2001 From: fw_qaq <82551626+Jack-Zhang-1314@users.noreply.github.com> Date: Mon, 7 Nov 2022 17:24:44 +0800 Subject: [PATCH 1178/3019] =?UTF-8?q?update=20=E4=BA=8C=E5=8F=89=E6=A0=91?= =?UTF-8?q?=E7=9A=84=E7=BB=9F=E4=B8=80=E8=BF=AD=E4=BB=A3=E6=B3=95.md=20abo?= =?UTF-8?q?ut=20rust?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...00\350\277\255\344\273\243\346\263\225.md" | 77 +++++++++++++++++++ 1 file changed, 77 insertions(+) diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\347\273\237\344\270\200\350\277\255\344\273\243\346\263\225.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\347\273\237\344\270\200\350\277\255\344\273\243\346\263\225.md" index 030d3ae19e..6e768ec7f0 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\347\273\237\344\270\200\350\277\255\344\273\243\346\263\225.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\347\273\237\344\270\200\350\277\255\344\273\243\346\263\225.md" @@ -666,6 +666,83 @@ object Solution { } } ``` + +rust: + +```rust +impl Solution{ + // 前序 + pub fn preorder_traversal(root: Option>>) -> Vec { + let mut res = vec![]; + let mut stack = vec![]; + if root.is_some(){ + stack.push(root); + } + while !stack.is_empty(){ + if let Some(node) = stack.pop().unwrap(){ + if node.borrow().right.is_some(){ + stack.push(node.borrow().right.clone()); + } + if node.borrow().left.is_some(){ + stack.push(node.borrow().left.clone()); + } + stack.push(Some(node)); + stack.push(None); + }else{ + res.push(stack.pop().unwrap().unwrap().borrow().val); + } + } + res + } + // 中序 + pub fn inorder_traversal(root: Option>>) -> Vec { + let mut res = vec![]; + let mut stack = vec![]; + if root.is_some() { + stack.push(root); + } + while !stack.is_empty() { + if let Some(node) = stack.pop().unwrap() { + if node.borrow().right.is_some() { + stack.push(node.borrow().right.clone()); + } + stack.push(Some(node.clone())); + stack.push(None); + if node.borrow().left.is_some() { + stack.push(node.borrow().left.clone()); + } + } else { + res.push(stack.pop().unwrap().unwrap().borrow().val); + } + } + res + } + // 后序 + pub fn postorder_traversal(root: Option>>) -> Vec { + let mut res = vec![]; + let mut stack = vec![]; + if root.is_some() { + stack.push(root); + } + while !stack.is_empty() { + if let Some(node) = stack.pop().unwrap() { + stack.push(Some(node.clone())); + stack.push(None); + if node.borrow().right.is_some() { + stack.push(node.borrow().right.clone()); + } + if node.borrow().left.is_some() { + stack.push(node.borrow().left.clone()); + } + } else { + res.push(stack.pop().unwrap().unwrap().borrow().val); + } + } + res + } +} +``` +

From 24d7ad68f0a906fac3c7d27e6db6d7116f89e40f Mon Sep 17 00:00:00 2001 From: wantsnowfly <2856628706@qq.com> Date: Mon, 7 Nov 2022 17:56:01 +0800 Subject: [PATCH 1179/3019] =?UTF-8?q?=E5=A2=9E=E5=8A=A0034=20java=E8=A7=A3?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...00\344\270\252\344\275\215\347\275\256.md" | 59 +++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git "a/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" "b/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" index dc6833f67e..c7ff6dce1e 100644 --- "a/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" +++ "b/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" @@ -271,6 +271,64 @@ class Solution { } ``` +```java +// 解法三 +class Solution { + public int[] searchRange(int[] nums, int target) { + int left = searchLeft(nums,target); + int right = searchRight(nums,target); + return new int[]{left,right}; + } + public int searchLeft(int[] nums,int target){ + // 寻找元素第一次出现的地方 + int left = 0; + int right = nums.length-1; + while(left<=right){ + int mid = left+(right-left)/2; + // >= 的都要缩小 因为要找第一个元素 + if(nums[mid]>=target){ + right = mid - 1; + }else{ + left = mid + 1; + } + } + // right = left - 1 + // 如果存在答案 right是首选 + if(right>=0&&right=0&&left=0&&left=0&&right<=nums.length&&nums[right]==target){ + return right; + } + return -1; + } +} +``` + ### Python @@ -685,3 +743,4 @@ class Solution { + From 3f70c16fa6bbb059cd7e102b791d25b844bafd74 Mon Sep 17 00:00:00 2001 From: fw_qaq <82551626+Jack-Zhang-1314@users.noreply.github.com> Date: Tue, 8 Nov 2022 01:29:42 +0800 Subject: [PATCH 1180/3019] =?UTF-8?q?update=200102.=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=A0=91=E7=9A=84=E5=B1=82=E5=BA=8F=E9=81=8D=E5=8E=86.md=20abo?= =?UTF-8?q?ut=20using=20vecdeque=20rust?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...02\345\272\217\351\201\215\345\216\206.md" | 43 ++++++++++--------- 1 file changed, 23 insertions(+), 20 deletions(-) diff --git "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" index 3a4e0a31ee..f4f51f0117 100644 --- "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" +++ "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" @@ -380,29 +380,32 @@ object Solution { Rust: ```rust -pub fn level_order(root: Option>>) -> Vec> { - let mut ans = Vec::new(); - let mut stack = Vec::new(); - if root.is_none(){ - return ans; - } - stack.push(root.unwrap()); - while stack.is_empty()!= true{ - let num = stack.len(); - let mut level = Vec::new(); - for _i in 0..num{ - let tmp = stack.remove(0); - level.push(tmp.borrow_mut().val); - if tmp.borrow_mut().left.is_some(){ - stack.push(tmp.borrow_mut().left.take().unwrap()); - } - if tmp.borrow_mut().right.is_some(){ - stack.push(tmp.borrow_mut().right.take().unwrap()); +use std::cell::RefCell; +use std::rc::Rc; +use std::collections::VecDeque; +impl Solution { + pub fn level_order(root: Option>>) -> Vec> { + let mut res = vec![]; + let mut queue = VecDeque::new(); + if root.is_some() { + queue.push_back(root); + } + while !queue.is_empty() { + let mut temp = vec![]; + for _ in 0..queue.len() { + let node = queue.pop_front().unwrap().unwrap(); + temp.push(node.borrow().val); + if node.borrow().left.is_some() { + queue.push_back(node.borrow().left.clone()); + } + if node.borrow().right.is_some() { + queue.push_back(node.borrow().right.clone()); + } } + res.push(temp); } - ans.push(level); + res } - ans } ``` From 730dd3c76febe7b56cd2eb8678da6acd6057af25 Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Tue, 8 Nov 2022 09:45:36 +0800 Subject: [PATCH 1181/3019] Update --- ...64\346\225\260\346\213\206\345\210\206.md" | 30 +++++++++++++++++-- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git "a/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" "b/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" index 00e6a9da08..9969edcda9 100644 --- "a/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" +++ "b/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" @@ -84,16 +84,40 @@ j是从1开始遍历,拆分j的情况,在遍历j的过程中其实都计算 dp[i] 是依靠 dp[i - j]的状态,所以遍历i一定是从前向后遍历,先有dp[i - j]再有dp[i]。 -枚举j的时候,是从1开始的。i是从3开始,这样dp[i - j]就是dp[2]正好可以通过我们初始化的数值求出来。 所以遍历顺序为: -``` +```CPP for (int i = 3; i <= n ; i++) { for (int j = 1; j < i - 1; j++) { dp[i] = max(dp[i], max((i - j) * j, dp[i - j] * j)); } } ``` +注意 枚举j的时候,是从1开始的。从0开始的话,那么让拆分一个数拆个0的话,那么求最大乘积没有意义了。 + +j的结束条件是 j < i - 1 ,其实 j < i 也是可以的,不过可以节省一步,例如让j = i - 1,的话,其实在 j = 1的时候,这一步就已经拆出来了,重复计算,所以 j < i - 1 + +至于 i是从3开始,这样dp[i - j]就是dp[2]正好可以通过我们初始化的数值求出来。 + +更优化一步,可以这样: + +```CPP +for (int i = 3; i <= n ; i++) { + for (int j = 1; j <= i / 2; j++) { + dp[i] = max(dp[i], max((i - j) * j, dp[i - j] * j)); + } +} +``` + +因为拆分一个数n 使之乘积最大,那么一定是拆分m个成近似相同的子数相乘才是最大的。 + +例如 6 拆成 3 * 3, 10 拆成 3 * 3 * 4。 100的话 也是拆成m个近似数组的子数 相乘才是最大的。 + +只不过我们不知道m究竟是多少而已,但可以明确的是m一定大于等于2,既然m大于等于,也就是 最差也应该是拆成两个相同的 可能是最大值。 + +那么 j 遍历,只需要遍历到 n/2 就可以,后面就没有必要遍历了,一定不是最大值。 + +至于 “拆分一个数n 使之乘积最大,那么一定是拆分m个成近似相同的子数相乘才是最大的” 这个我就不去做数学证明了,感兴趣的同学,可以自己证明。 5. 举例推导dp数组 @@ -110,7 +134,7 @@ public: vector dp(n + 1); dp[2] = 1; for (int i = 3; i <= n ; i++) { - for (int j = 1; j < i - 1; j++) { + for (int j = 1; j <= i / 2; j++) { dp[i] = max(dp[i], max((i - j) * j, dp[i - j] * j)); } } From 38b5d05390d117cc77aba0a3026846bed32d75cd Mon Sep 17 00:00:00 2001 From: Hongfei Duan <1715106673@qq.com> Date: Tue, 8 Nov 2022 11:20:26 +0800 Subject: [PATCH 1182/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=201254=E7=BB=9F?= =?UTF-8?q?=E8=AE=A1=E5=B0=81=E9=97=AD=E5=B2=9B=E5=B1=BF=E7=9A=84=E6=95=B0?= =?UTF-8?q?=E7=9B=AE=20js=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...77\347\232\204\346\225\260\347\233\256.md" | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git "a/problems/1254.\347\273\237\350\256\241\345\260\201\351\227\255\345\262\233\345\261\277\347\232\204\346\225\260\347\233\256.md" "b/problems/1254.\347\273\237\350\256\241\345\260\201\351\227\255\345\262\233\345\261\277\347\232\204\346\225\260\347\233\256.md" index b70cd496f6..1270085a82 100644 --- "a/problems/1254.\347\273\237\350\256\241\345\260\201\351\227\255\345\262\233\345\261\277\347\232\204\346\225\260\347\233\256.md" +++ "b/problems/1254.\347\273\237\350\256\241\345\260\201\351\227\255\345\262\233\345\261\277\347\232\204\346\225\260\347\233\256.md" @@ -81,3 +81,59 @@ public: + +### 其他语言版本 + +### JavaScript: + +```js +/** + * @param {number[][]} grid + * @return {number} + */ +var closedIsland = function(grid) { + let rows = grid.length; + let cols = grid[0].length; + // 存储四个方向 + let dir = [[-1, 0], [0, -1], [1, 0], [0, 1]]; + // 深度优先 + function dfs(x, y) { + grid[x][y] = 1; + // 向四个方向遍历 + for(let i = 0; i < 4; i++) { + let nextX = x + dir[i][0]; + let nextY = y + dir[i][1]; + // 判断是否越界 + if (nextX < 0 || nextX >= rows || nextY < 0 || nextY >= cols) continue; + // 不符合条件 + if (grid[nextX][nextY] === 1) continue; + // 继续递归 + dfs(nextX, nextY); + } + } + // 从边界岛屿开始 + // 从左侧和右侧出发 + for(let i = 0; i < rows; i++) { + if (grid[i][0] === 0) dfs(i, 0); + if (grid[i][cols - 1] === 0) dfs(i, cols - 1); + } + // 从上侧和下侧出发 + for(let j = 0; j < cols; j++) { + if (grid[0][j] === 0) dfs(0, j); + if (grid[rows - 1][j] === 0) dfs(rows - 1, j); + } + let count = 0; + // 排除所有与边界相连的陆地之后 + // 依次遍历网格中的每个元素,如果遇到一个元素是陆地且状态是未访问,则遇到一个新的岛屿,将封闭岛屿的数目加 1 + // 并访问与当前陆地连接的所有陆地 + for(let i = 0; i < rows; i++) { + for(let j = 0; j < cols; j++) { + if (grid[i][j] === 0) { + count++; + dfs(i, j); + } + } + } + return count; +}; +``` From fe46bb43d2272c656c0744b88081b72487276798 Mon Sep 17 00:00:00 2001 From: fw_qaq <82551626+Jack-Zhang-1314@users.noreply.github.com> Date: Tue, 8 Nov 2022 12:51:43 +0800 Subject: [PATCH 1183/3019] =?UTF-8?q?Update=20=E4=BA=8C=E5=8F=89=E6=A0=91?= =?UTF-8?q?=E7=9A=84=E7=BB=9F=E4=B8=80=E8=BF=AD=E4=BB=A3=E6=B3=95.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\273\237\344\270\200\350\277\255\344\273\243\346\263\225.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\347\273\237\344\270\200\350\277\255\344\273\243\346\263\225.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\347\273\237\344\270\200\350\277\255\344\273\243\346\263\225.md" index 6e768ec7f0..69c23e5c6c 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\347\273\237\344\270\200\350\277\255\344\273\243\346\263\225.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\347\273\237\344\270\200\350\277\255\344\273\243\346\263\225.md" @@ -695,7 +695,7 @@ impl Solution{ res } // 中序 - pub fn inorder_traversal(root: Option>>) -> Vec { + pub fn inorder_traversal(root: Option>>) -> Vec { let mut res = vec![]; let mut stack = vec![]; if root.is_some() { From d5392f4936b412e0b288d5170254b3f6aa12f15e Mon Sep 17 00:00:00 2001 From: wang2jun <91008685+wang2jun@users.noreply.github.com> Date: Tue, 8 Nov 2022 15:01:42 +0800 Subject: [PATCH 1184/3019] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=200583=20=E4=B8=A4?= =?UTF-8?q?=E4=B8=AA=E5=AD=97=E7=AC=A6=E4=B8=B2=E7=9A=84=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E6=93=8D=E4=BD=9C=20Javascript=20=E6=96=B9=E6=B3=95=E4=BA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 增加 0583 两个字符串的删除操作 Javascript 方法二 --- ...40\351\231\244\346\223\215\344\275\234.md" | 55 ++++++++++++------- 1 file changed, 35 insertions(+), 20 deletions(-) diff --git "a/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" "b/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" index 6bc5042159..ca3c118f5a 100644 --- "a/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" +++ "b/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" @@ -228,28 +228,43 @@ func min(a, b int) int { ``` Javascript: ```javascript -const minDistance = (word1, word2) => { - let dp = Array.from(new Array(word1.length + 1), () => Array(word2.length+1).fill(0)); - - for(let i = 1; i <= word1.length; i++) { - dp[i][0] = i; - } - - for(let j = 1; j <= word2.length; j++) { - dp[0][j] = j; +// 方法一 +var minDistance = (word1, word2) => { + let dp = Array.from(new Array(word1.length + 1), () => + Array(word2.length + 1).fill(0) + ); + for (let i = 1; i <= word1.length; i++) { + dp[i][0] = i; + } + for (let j = 1; j <= word2.length; j++) { + dp[0][j] = j; + } + for (let i = 1; i <= word1.length; i++) { + for (let j = 1; j <= word2.length; j++) { + if (word1[i - 1] === word2[j - 1]) { + dp[i][j] = dp[i - 1][j - 1]; + } else { + dp[i][j] = Math.min( + dp[i - 1][j] + 1, + dp[i][j - 1] + 1, + dp[i - 1][j - 1] + 2 + ); + } } + } + return dp[word1.length][word2.length]; +}; - for(let i = 1; i <= word1.length; i++) { - for(let j = 1; j <= word2.length; j++) { - if(word1[i-1] === word2[j-1]) { - dp[i][j] = dp[i-1][j-1]; - } else { - dp[i][j] = Math.min(dp[i-1][j] + 1, dp[i][j-1] + 1, dp[i-1][j-1] + 2); - } - } - } - - return dp[word1.length][word2.length]; +// 方法二 +var minDistance = function (word1, word2) { + let dp = new Array(word1.length + 1) + .fill(0) + .map((_) => new Array(word2.length + 1).fill(0)); + for (let i = 1; i <= word1.length; i++) + for (let j = 1; j <= word2.length; j++) + if (word1[i - 1] === word2[j - 1]) dp[i][j] = dp[i - 1][j - 1] + 1; + else dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]); + return word1.length + word2.length - dp[word1.length][word2.length] * 2; }; ``` From f7730fad4b3a955f6e5d031cbf2c769bbe42a228 Mon Sep 17 00:00:00 2001 From: fw_qaq <82551626+Jack-Zhang-1314@users.noreply.github.com> Date: Tue, 8 Nov 2022 18:29:56 +0800 Subject: [PATCH 1185/3019] =?UTF-8?q?Update=200102.=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=A0=91=E7=9A=84=E5=B1=82=E5=BA=8F=E9=81=8D=E5=8E=86.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...02\345\272\217\351\201\215\345\216\206.md" | 43 ++++++++++--------- 1 file changed, 23 insertions(+), 20 deletions(-) diff --git "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" index f4f51f0117..e6e8f2106e 100644 --- "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" +++ "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" @@ -668,29 +668,32 @@ object Solution { Rust: ```rust -pub fn level_order(root: Option>>) -> Vec> { - let mut ans = Vec::new(); - let mut stack = Vec::new(); - if root.is_none(){ - return ans; - } - stack.push(root.unwrap()); - while stack.is_empty()!= true{ - let num = stack.len(); - let mut level = Vec::new(); - for _i in 0..num{ - let tmp = stack.remove(0); - level.push(tmp.borrow_mut().val); - if tmp.borrow_mut().left.is_some(){ - stack.push(tmp.borrow_mut().left.take().unwrap()); - } - if tmp.borrow_mut().right.is_some(){ - stack.push(tmp.borrow_mut().right.take().unwrap()); +use std::cell::RefCell; +use std::collections::VecDeque; +use std::rc::Rc; +impl Solution { + pub fn level_order_bottom(root: Option>>) -> Vec> { + let mut res = vec![]; + let mut queue = VecDeque::new(); + if root.is_some() { + queue.push_back(root); + } + while !queue.is_empty() { + let mut temp = vec![]; + for _ in 0..queue.len() { + let node = queue.pop_front().unwrap().unwrap(); + temp.push(node.borrow().val); + if node.borrow().left.is_some() { + queue.push_back(node.borrow().left.clone()); + } + if node.borrow().right.is_some() { + queue.push_back(node.borrow().right.clone()); + } } + res.push(temp); } - ans.push(level); + res.into_iter().rev().collect() } - ans } ``` From 0b060140d649cd984733e6becdc9feb560a890aa Mon Sep 17 00:00:00 2001 From: fw_qaq <82551626+Jack-Zhang-1314@users.noreply.github.com> Date: Tue, 8 Nov 2022 18:55:36 +0800 Subject: [PATCH 1186/3019] =?UTF-8?q?Update=200102.=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=A0=91=E7=9A=84=E5=B1=82=E5=BA=8F=E9=81=8D=E5=8E=86.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...02\345\272\217\351\201\215\345\216\206.md" | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" index e6e8f2106e..c9a6b47699 100644 --- "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" +++ "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" @@ -941,6 +941,39 @@ object Solution { } ``` +rust: + +```rust +use std::cell::RefCell; +use std::collections::VecDeque; +use std::rc::Rc; +impl Solution { + pub fn right_side_view(root: Option>>) -> Vec { + let mut res = vec![]; + let mut queue = VecDeque::new(); + if root.is_some() { + queue.push_back(root); + } + while !queue.is_empty() { + let len = queue.len(); + for i in 0..len { + let node = queue.pop_front().unwrap().unwrap(); + if i == len - 1 { + res.push(node.borrow().val); + } + if node.borrow().left.is_some() { + queue.push_back(node.borrow().left.clone()); + } + if node.borrow().right.is_some() { + queue.push_back(node.borrow().right.clone()); + } + } + } + res + } +} +``` + # 637.二叉树的层平均值 [力扣题目链接](https://leetcode.cn/problems/average-of-levels-in-binary-tree/) From 012081f38f78465ec6994db3cf035345384ab82b Mon Sep 17 00:00:00 2001 From: fw_qaq <82551626+Jack-Zhang-1314@users.noreply.github.com> Date: Tue, 8 Nov 2022 20:46:44 +0800 Subject: [PATCH 1187/3019] =?UTF-8?q?Update=200102.=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=A0=91=E7=9A=84=E5=B1=82=E5=BA=8F=E9=81=8D=E5=8E=86.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...02\345\272\217\351\201\215\345\216\206.md" | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" index c9a6b47699..6cb4b5e3bb 100644 --- "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" +++ "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" @@ -1224,6 +1224,39 @@ object Solution { } ``` +rust: + +```rust +use std::cell::RefCell; +use std::collections::VecDeque; +use std::rc::Rc; +impl Solution { + pub fn average_of_levels(root: Option>>) -> Vec { + let mut res = vec![]; + let mut queue = VecDeque::new(); + if root.is_some() { + queue.push_back(root); + } + while !queue.is_empty() { + let len = queue.len(); + let mut sum = 0; + for _ in 0..len { + let node = queue.pop_front().unwrap().unwrap(); + sum += node.borrow().val; + if node.borrow().left.is_some() { + queue.push_back(node.borrow().left.clone()); + } + if node.borrow().right.is_some() { + queue.push_back(node.borrow().right.clone()); + } + } + res.push((sum as f64) / len as f64); + } + res + } +} +``` + # 429.N叉树的层序遍历 [力扣题目链接](https://leetcode.cn/problems/n-ary-tree-level-order-traversal/) From 07d365dcc5ecf862d639eaf9d747cc5f0a9c283b Mon Sep 17 00:00:00 2001 From: fw_qaq <82551626+Jack-Zhang-1314@users.noreply.github.com> Date: Tue, 8 Nov 2022 21:34:54 +0800 Subject: [PATCH 1188/3019] =?UTF-8?q?Update=200102.=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=A0=91=E7=9A=84=E5=B1=82=E5=BA=8F=E9=81=8D=E5=8E=86.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...02\345\272\217\351\201\215\345\216\206.md" | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" index 6cb4b5e3bb..e75455f3de 100644 --- "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" +++ "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" @@ -1758,6 +1758,38 @@ object Solution { } ``` +rust: + +```rust +use std::cell::RefCell; +use std::collections::VecDeque; +use std::rc::Rc; +impl Solution { + pub fn largest_values(root: Option>>) -> Vec { + let mut res = vec![]; + let mut queue = VecDeque::new(); + if root.is_some() { + queue.push_back(root); + } + while !queue.is_empty() { + let mut max = i32::MIN; + for _ in 0..queue.len() { + let node = queue.pop_front().unwrap().unwrap(); + max = max.max(node.borrow().val); + if node.borrow().left.is_some() { + queue.push_back(node.borrow().left.clone()); + } + if node.borrow().right.is_some() { + queue.push_back(node.borrow().right.clone()); + } + } + res.push(max); + } + res + } +} +``` + # 116.填充每个节点的下一个右侧节点指针 [力扣题目链接](https://leetcode.cn/problems/populating-next-right-pointers-in-each-node/) From ece7623da2873f1c0c0ec31e037daf7d1b38162b Mon Sep 17 00:00:00 2001 From: lihuacai Date: Wed, 9 Nov 2022 02:22:43 +0800 Subject: [PATCH 1189/3019] =?UTF-8?q?feat:=20update=5F63=E4=B8=8D=E5=90=8C?= =?UTF-8?q?=E8=B7=AF=E5=BE=84II=5Fpython3,=20=E5=8F=8D=E5=90=91=E5=88=A4?= =?UTF-8?q?=E6=96=AD=E6=94=B9=E6=88=90=E6=AD=A3=E5=90=91=E5=88=A4=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\345\220\214\350\267\257\345\276\204II.md" | 24 +++++++++++-------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git "a/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" "b/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" index 547eb9f876..9aa369563d 100644 --- "a/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" +++ "b/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" @@ -272,24 +272,28 @@ class Solution: row = len(obstacleGrid) col = len(obstacleGrid[0]) dp = [[0 for _ in range(col)] for _ in range(row)] - - dp[0][0] = 1 if obstacleGrid[0][0] != 1 else 0 - if dp[0][0] == 0: return 0 # 如果第一个格子就是障碍,return 0 + dp[0][0] = 0 if obstacleGrid[0][0] == 1 else 1 + if dp[0][0] == 0: + return 0 # 如果第一个格子就是障碍,return 0 # 第一行 for i in range(1, col): - if obstacleGrid[0][i] != 1: - dp[0][i] = dp[0][i-1] + if obstacleGrid[0][i] == 1: + # 遇到障碍物时,直接退出循环,后面默认都是0 + break + dp[0][i] = 1 # 第一列 for i in range(1, row): - if obstacleGrid[i][0] != 1: - dp[i][0] = dp[i-1][0] - print(dp) + if obstacleGrid[i][0] == 1: + # 遇到障碍物时,直接退出循环,后面默认都是0 + break + dp[i][0] = 1 + # print(dp) for i in range(1, row): for j in range(1, col): - if obstacleGrid[i][j] != 1: - dp[i][j] = dp[i-1][j] + dp[i][j-1] + if obstacleGrid[i][j] == 0: + dp[i][j] = dp[i - 1][j] + dp[i][j - 1] return dp[-1][-1] ``` From 30550b06af1810bf6bab063cce1b3b31da0e2396 Mon Sep 17 00:00:00 2001 From: Jijie LIU Date: Tue, 8 Nov 2022 21:50:00 +0100 Subject: [PATCH 1190/3019] =?UTF-8?q?Update=200101.=E5=AF=B9=E7=A7=B0?= =?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 --- ...60\344\272\214\345\217\211\346\240\221.md" | 66 +++++++++++++++++-- 1 file changed, 60 insertions(+), 6 deletions(-) diff --git "a/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" "b/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" index 30ca3d7729..37adfd54d1 100644 --- "a/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" @@ -754,23 +754,77 @@ func isSymmetric3(_ root: TreeNode?) -> Bool { ## Scala -递归: +> 递归: ```scala -object Solution { +object Solution { def isSymmetric(root: TreeNode): Boolean = { if (root == null) return true // 如果等于空直接返回true + def compare(left: TreeNode, right: TreeNode): Boolean = { - if (left == null && right == null) return true // 如果左右都为空,则为true - if (left == null && right != null) return false // 如果左空右不空,不对称,返回false - if (left != null && right == null) return false // 如果左不空右空,不对称,返回false + if (left == null && right == null) true // 如果左右都为空,则为true + else if (left == null && right != null) false // 如果左空右不空,不对称,返回false + else if (left != null && right == null) false // 如果左不空右空,不对称,返回false // 如果左右的值相等,并且往下递归 - left.value == right.value && compare(left.left, right.right) && compare(left.right, right.left) + else left.value == right.value && compare(left.left, right.right) && compare(left.right, right.left) } + // 分别比较左子树和右子树 compare(root.left, root.right) } } ``` +> 迭代 - 使用栈 +```scala +object Solution { + + import scala.collection.mutable + + def isSymmetric(root: TreeNode): Boolean = { + if (root == null) return true + + val cache = mutable.Stack[(TreeNode, TreeNode)]((root.left, root.right)) + + while (cache.nonEmpty) { + cache.pop() match { + case (null, null) => + case (_, null) => return false + case (null, _) => return false + case (left, right) => + if (left.value != right.value) return false + cache.push((left.left, right.right)) + cache.push((left.right, right.left)) + } + } + true + } +} +``` +> 迭代 - 使用队列 +```scala +object Solution { + + import scala.collection.mutable + + def isSymmetric(root: TreeNode): Boolean = { + if (root == null) return true + + val cache = mutable.Queue[(TreeNode, TreeNode)]((root.left, root.right)) + + while (cache.nonEmpty) { + cache.dequeue() match { + case (null, null) => + case (_, null) => return false + case (null, _) => return false + case (left, right) => + if (left.value != right.value) return false + cache.enqueue((left.left, right.right)) + cache.enqueue((left.right, right.left)) + } + } + true + } +} +```

From ef5b014228c2f0002637b4af0a279596a2b53a60 Mon Sep 17 00:00:00 2001 From: fw_qaq <82551626+Jack-Zhang-1314@users.noreply.github.com> Date: Wed, 9 Nov 2022 23:19:00 +0800 Subject: [PATCH 1191/3019] =?UTF-8?q?Update=200102.=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=A0=91=E7=9A=84=E5=B1=82=E5=BA=8F=E9=81=8D=E5=8E=86.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...02\345\272\217\351\201\215\345\216\206.md" | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" index e75455f3de..f1ec3918d6 100644 --- "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" +++ "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" @@ -2576,6 +2576,36 @@ object Solution { } ``` +rust: + +```rust +use std::cell::RefCell; +use std::collections::VecDeque; +use std::rc::Rc; +impl Solution { + pub fn max_depth(root: Option>>) -> i32 { + let mut queue = VecDeque::new(); + let mut res = 0; + if root.is_some() { + queue.push_back(root); + } + while !queue.is_empty() { + res += 1; + for _ in 0..queue.len() { + let node = queue.pop_front().unwrap().unwrap(); + if node.borrow().left.is_some() { + queue.push_back(node.borrow().left.clone()); + } + if node.borrow().right.is_some() { + queue.push_back(node.borrow().right.clone()); + } + } + } + res + } +} +``` + # 111.二叉树的最小深度 [力扣题目链接](https://leetcode.cn/problems/minimum-depth-of-binary-tree/) From 0797680df421740987c05ca5f5d3501794b53a31 Mon Sep 17 00:00:00 2001 From: fw_qaq <82551626+Jack-Zhang-1314@users.noreply.github.com> Date: Wed, 9 Nov 2022 23:30:55 +0800 Subject: [PATCH 1192/3019] =?UTF-8?q?Update=200102.=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=A0=91=E7=9A=84=E5=B1=82=E5=BA=8F=E9=81=8D=E5=8E=86.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...02\345\272\217\351\201\215\345\216\206.md" | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" index f1ec3918d6..acd91c6b78 100644 --- "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" +++ "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" @@ -2850,6 +2850,39 @@ object Solution { } ``` +rust: + +```rust +use std::cell::RefCell; +use std::collections::VecDeque; +use std::rc::Rc; +impl Solution { + pub fn min_depth(root: Option>>) -> i32 { + let mut res = 0; + let mut queue = VecDeque::new(); + if root.is_some() { + queue.push_back(root); + } + while !queue.is_empty() { + res += 1; + for _ in 0..queue.len() { + let node = queue.pop_front().unwrap().unwrap(); + if node.borrow().left.is_none() && node.borrow().right.is_none() { + return res; + } + if node.borrow().left.is_some() { + queue.push_back(node.borrow().left.clone()); + } + if node.borrow().right.is_some() { + queue.push_back(node.borrow().right.clone()); + } + } + } + res + } +} +``` + # 总结 二叉树的层序遍历,**就是图论中的广度优先搜索在二叉树中的应用**,需要借助队列来实现(此时又发现队列的一个应用了)。 From 75103a887219ca10080a5cdb8ef4639bfe46422c Mon Sep 17 00:00:00 2001 From: xu <44153643+xu-kai-xu@users.noreply.github.com> Date: Thu, 10 Nov 2022 19:29:01 +0800 Subject: [PATCH 1193/3019] =?UTF-8?q?Update=20=E9=93=BE=E8=A1=A8=E7=90=86?= =?UTF-8?q?=E8=AE=BA=E5=9F=BA=E7=A1=80.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 链表理论基础,一处可能的文字错误。 --- ...\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/\351\223\276\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\351\223\276\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" index cdd861fdea..a0b13f89cb 100644 --- "a/problems/\351\223\276\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\351\223\276\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -9,7 +9,7 @@ 什么是链表,链表是一种通过指针串联在一起的线性结构,每一个节点由两部分组成,一个是数据域一个是指针域(存放指向下一个节点的指针),最后一个节点的指针域指向null(空指针的意思)。 -链接的入口节点称为链表的头结点也就是head。 +链表的入口节点称为链表的头结点也就是head。 如图所示: ![链表1](https://img-blog.csdnimg.cn/20200806194529815.png) From a2e84d93d9103298e7c11c4042ee1352da71877b Mon Sep 17 00:00:00 2001 From: fw_qaq <82551626+Jack-Zhang-1314@users.noreply.github.com> Date: Thu, 10 Nov 2022 22:05:42 +0800 Subject: [PATCH 1194/3019] =?UTF-8?q?leetcode=20=E8=BF=98=E6=B2=A1?= =?UTF-8?q?=E6=9C=89=E9=A2=98=EF=BC=8C=E8=87=AA=E5=B7=B1=E6=9E=84=E5=BB=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...02\345\272\217\351\201\215\345\216\206.md" | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" index acd91c6b78..1a01c0ae9c 100644 --- "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" +++ "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" @@ -1528,6 +1528,54 @@ object Solution { } ``` +rust: + +```rust +pub struct Solution; +#[derive(Debug, PartialEq, Eq)] +pub struct Node { + pub val: i32, + pub children: Vec>>>, +} + +impl Node { + #[inline] + pub fn new(val: i32) -> Node { + Node { + val, + children: vec![], + } + } +} + +use std::cell::RefCell; +use std::collections::VecDeque; +use std::rc::Rc; +impl Solution { + pub fn level_order(root: Option>>) -> Vec> { + let mut res = vec![]; + let mut queue = VecDeque::new(); + if root.is_some() { + queue.push_back(root); + } + while !queue.is_empty() { + let mut temp = vec![]; + for _ in 0..queue.len() { + let node = queue.pop_front().unwrap().unwrap(); + temp.push(node.borrow().val); + if !node.borrow().children.is_empty() { + for n in node.borrow().children.clone() { + queue.push_back(n); + } + } + } + res.push(temp) + } + res + } +} +``` + # 515.在每个树行中找最大值 [力扣题目链接](https://leetcode.cn/problems/find-largest-value-in-each-tree-row/) From bec57550df7a01fccb7fe060ce569e499285a134 Mon Sep 17 00:00:00 2001 From: roylx <73628821+roylx@users.noreply.github.com> Date: Thu, 10 Nov 2022 17:27:45 -0700 Subject: [PATCH 1195/3019] =?UTF-8?q?Update=200376.=E6=91=86=E5=8A=A8?= =?UTF-8?q?=E5=BA=8F=E5=88=97.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 增加python动态规划优化版 --- ...06\345\212\250\345\272\217\345\210\227.md" | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git "a/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" "b/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" index 214ff31102..f9d3f97f7d 100644 --- "a/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" +++ "b/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" @@ -264,6 +264,25 @@ class Solution: return max(dp[-1][0], dp[-1][1]) ``` +```python +class Solution: + def wiggleMaxLength(self, nums: List[int]) -> int: + # up i作为波峰最长的序列长度 + # down i作为波谷最长的序列长度 + n = len(nums) + # 长度为0和1的直接返回长度 + if n<2: return n + for i in range(1,n): + if nums[i]>nums[i-1]: + # nums[i] 为波峰,1. 前面是波峰,up值不变,2. 前面是波谷,down值加1 + # 目前up值取两者的较大值(其实down+1即可,可以推理前一步down和up最多相差1,所以down+1>=up) + up = max(up, down+1) + elif nums[i] Date: Sun, 13 Nov 2022 10:42:00 +0800 Subject: [PATCH 1196/3019] =?UTF-8?q?=E5=8F=8D=E8=BD=AC=E5=AD=97=E7=AC=A6?= =?UTF-8?q?=E4=B8=B2Java=E5=85=B6=E4=BB=96=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...54\345\255\227\347\254\246\344\270\262.md" | 18 ++++++++++++++ ...\345\255\227\347\254\246\344\270\262II.md" | 24 +++++++++++++++++++ 2 files changed, 42 insertions(+) diff --git "a/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" "b/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" index f5b0e22bf6..2807d04a58 100644 --- "a/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" @@ -151,6 +151,23 @@ class Solution { } } } + +// 第二种方法用temp来交换数值更多人容易理解些 +class Solution { + public void reverseString(char[] s) { + int l = 0; + int r = s.length - 1; + while(l < r){ + char temp = s[l]; + s[l] = s[r]; + s[r] = temp; + l++; + r--; + } + } +} + + ``` Python: @@ -335,3 +352,4 @@ object Solution { + diff --git "a/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" "b/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" index 238e63490d..598913654e 100644 --- "a/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" +++ "b/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" @@ -194,6 +194,29 @@ class Solution { return new String(ch); } } + + +// 解法二还可以用temp来交换数值,会的人更多些 +class Solution { + public String reverseStr(String s, int k) { + char[] ch = s.toCharArray(); + for(int i = 0;i < ch.length;i += 2 * k){ + int start = i; + // 判断尾数够不够k个来取决end指针的位置 + int end = Math.min(ch.length - 1,start + k - 1); + while(start < end){ + + char temp = ch[start]; + ch[start] = ch[end]; + ch[end] = temp; + + start++; + end--; + } + } + return new String(ch); + } +} ``` ```java // 解法3 @@ -469,3 +492,4 @@ impl Solution { + From 9d0872312c211f877e7af9dc2e76302961fd46af Mon Sep 17 00:00:00 2001 From: fw_qaq <82551626+Jack-Zhang-1314@users.noreply.github.com> Date: Sun, 13 Nov 2022 16:16:48 +0800 Subject: [PATCH 1197/3019] =?UTF-8?q?Update=200226.=E7=BF=BB=E8=BD=AC?= =?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 --- ...54\344\272\214\345\217\211\346\240\221.md" | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git "a/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" "b/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" index 9c34ce20e3..3136c0be91 100644 --- "a/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" @@ -857,6 +857,36 @@ object Solution { } ``` +### rust + +```rust +impl Solution { + //* 递归 */ + pub fn invert_tree(root: Option>>) -> Option>> { + if let Some(node) = root.as_ref() { + let (left, right) = (node.borrow().left.clone(), node.borrow().right.clone()); + node.borrow_mut().left = Self::invert_tree(right); + node.borrow_mut().right = Self::invert_tree(left); + } + root + } + //* 迭代 */ + pub fn invert_tree(root: Option>>) -> Option>> { + let mut stack = vec![root.clone()]; + while !stack.is_empty() { + if let Some(node) = stack.pop().unwrap() { + let (left, right) = (node.borrow().left.clone(), node.borrow().right.clone()); + stack.push(right.clone()); + stack.push(left.clone()); + node.borrow_mut().left = right; + node.borrow_mut().right = left; + } + } + root + } +} +``` +

From 7c97e9b7d29345e12d16bd34e04233bc78e16ff8 Mon Sep 17 00:00:00 2001 From: fw_qaq <82551626+Jack-Zhang-1314@users.noreply.github.com> Date: Sun, 13 Nov 2022 17:43:14 +0800 Subject: [PATCH 1198/3019] =?UTF-8?q?Update=200101.=E5=AF=B9=E7=A7=B0?= =?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 --- ...60\344\272\214\345\217\211\346\240\221.md" | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git "a/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" "b/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" index 30ca3d7729..6c96f1dbb9 100644 --- "a/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" @@ -772,6 +772,34 @@ object Solution { } ``` +## Rust + +递归: +```rust +impl Solution { + pub fn is_symmetric(root: Option>>) -> bool { + Self::recur( + &root.as_ref().unwrap().borrow().left, + &root.as_ref().unwrap().borrow().right, + ) + } + pub fn recur( + left: &Option>>, + right: &Option>>, + ) -> bool { + match (left, right) { + (None, None) => true, + (Some(n1), Some(n2)) => { + return n1.borrow().val == n2.borrow().val + && Self::recur(&n1.borrow().left, &n2.borrow().right) + && Self::recur(&n1.borrow().right, &n2.borrow().left) + } + _ => false, + } + } +} +``` +

From 30a7d36699fcf7f7ffada9b3381553c7e3924873 Mon Sep 17 00:00:00 2001 From: fw_qaq <82551626+Jack-Zhang-1314@users.noreply.github.com> Date: Sun, 13 Nov 2022 18:36:39 +0800 Subject: [PATCH 1199/3019] =?UTF-8?q?Update=200101.=E5=AF=B9=E7=A7=B0?= =?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 --- ...60\344\272\214\345\217\211\346\240\221.md" | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git "a/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" "b/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" index 6c96f1dbb9..841dbec367 100644 --- "a/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" @@ -800,6 +800,39 @@ impl Solution { } ``` +迭代: +```rust +use std::cell::RefCell; +use std::collections::VecDeque; +use std::rc::Rc; +impl Solution { + pub fn is_symmetric(root: Option>>) -> bool { + let mut queue = VecDeque::new(); + if let Some(node) = root { + queue.push_back(node.borrow().left.clone()); + queue.push_back(node.borrow().right.clone()); + } + while !queue.is_empty() { + let (n1, n2) = (queue.pop_front().unwrap(), queue.pop_front().unwrap()); + match (n1.clone(), n2.clone()) { + (None, None) => continue, + (Some(n1), Some(n2)) => { + if n1.borrow().val != n2.borrow().val { + return false; + } + } + _ => return false, + }; + queue.push_back(n1.as_ref().unwrap().borrow().left.clone()); + queue.push_back(n2.as_ref().unwrap().borrow().right.clone()); + queue.push_back(n1.unwrap().borrow().right.clone()); + queue.push_back(n2.unwrap().borrow().left.clone()); + } + true + } +} +``` +

From 875680c44c216bd3e63d87133d0a108f09f8b661 Mon Sep 17 00:00:00 2001 From: fw_qaq <82551626+Jack-Zhang-1314@users.noreply.github.com> Date: Sun, 13 Nov 2022 19:35:09 +0800 Subject: [PATCH 1200/3019] =?UTF-8?q?Update=200104.=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=A0=91=E7=9A=84=E6=9C=80=E5=A4=A7=E6=B7=B1=E5=BA=A6.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...00\345\244\247\346\267\261\345\272\246.md" | 70 ++++++++++++------- 1 file changed, 44 insertions(+), 26 deletions(-) diff --git "a/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" "b/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" index be53c41741..ee7bd50e1a 100644 --- "a/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" +++ "b/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" @@ -200,32 +200,6 @@ public: }; ``` -rust: -```rust -impl Solution { - pub fn max_depth(root: Option>>) -> i32 { - if root.is_none(){ - return 0; - } - let mut max_depth: i32 = 0; - let mut stack = vec![root.unwrap()]; - while !stack.is_empty() { - let num = stack.len(); - for _i in 0..num{ - let top = stack.remove(0); - if top.borrow_mut().left.is_some(){ - stack.push(top.borrow_mut().left.take().unwrap()); - } - if top.borrow_mut().right.is_some(){ - stack.push(top.borrow_mut().right.take().unwrap()); - } - } - max_depth+=1; - } - max_depth - } -``` - 那么我们可以顺便解决一下n叉树的最大深度问题 @@ -975,6 +949,50 @@ object Solution { } ``` +## rust +### 0104.二叉树的最大深度 + +递归: +```rust +impl Solution { + pub fn max_depth(root: Option>>) -> i32 { + if root.is_none() { + return 0; + } + std::cmp::max( + Self::max_depth(root.clone().unwrap().borrow().left.clone()), + Self::max_depth(root.unwrap().borrow().right.clone()), + ) + 1 + } +} +``` + +迭代: +```rust +impl Solution { + pub fn max_depth(root: Option>>) -> i32 { + if root.is_none(){ + return 0; + } + let mut max_depth: i32 = 0; + let mut stack = vec![root.unwrap()]; + while !stack.is_empty() { + let num = stack.len(); + for _i in 0..num{ + let top = stack.remove(0); + if top.borrow_mut().left.is_some(){ + stack.push(top.borrow_mut().left.take().unwrap()); + } + if top.borrow_mut().right.is_some(){ + stack.push(top.borrow_mut().right.take().unwrap()); + } + } + max_depth+=1; + } + max_depth + } +``` +

From 8b26d8e1931f39668c603ddb818e582f194e45e4 Mon Sep 17 00:00:00 2001 From: fw_qaq <82551626+Jack-Zhang-1314@users.noreply.github.com> Date: Sun, 13 Nov 2022 23:17:30 +0800 Subject: [PATCH 1201/3019] =?UTF-8?q?Update=200111.=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=A0=91=E7=9A=84=E6=9C=80=E5=B0=8F=E6=B7=B1=E5=BA=A6.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...00\345\260\217\346\267\261\345\272\246.md" | 38 ++++++------------- 1 file changed, 11 insertions(+), 27 deletions(-) diff --git "a/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" "b/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" index 470e19199e..301c84b1ac 100644 --- "a/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" +++ "b/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" @@ -574,36 +574,20 @@ object Solution { rust: ```rust impl Solution { - pub fn min_depth(root: Option>>) -> i32 { - return Solution::bfs(root) - } - // 递归 - pub fn dfs(node: Option>>) -> i32{ - if node.is_none(){ - return 0; - } - let parent = node.unwrap(); - let left_child = parent.borrow_mut().left.take(); - let right_child = parent.borrow_mut().right.take(); - if left_child.is_none() && right_child.is_none(){ - return 1; - } - let mut min_depth = i32::MAX; - if left_child.is_some(){ - let left_depth = Solution::dfs(left_child); - if left_depth <= min_depth{ - min_depth = left_depth - } - } - if right_child.is_some(){ - let right_depth = Solution::dfs(right_child); - if right_depth <= min_depth{ - min_depth = right_depth + pub fn min_depth(root: Option>>) -> i32 { + if let Some(node) = root { + match (node.borrow().left.clone(), node.borrow().right.clone()) { + (Some(n1), None) => 1 + Self::min_depth(Some(n1)), + (None, Some(n2)) => 1 + Self::min_depth(Some(n2)), + (Some(n1), Some(n2)) => { + 1 + std::cmp::min(Self::min_depth(Some(n1)), Self::min_depth(Some(n2))) + } + _ => 1, } + } else { + 0 } - min_depth + 1 - } // 迭代 From ad5520612d607547f0b4d7d8e9b97719ad9db9d4 Mon Sep 17 00:00:00 2001 From: fw_qaq <82551626+Jack-Zhang-1314@users.noreply.github.com> Date: Sun, 13 Nov 2022 23:22:47 +0800 Subject: [PATCH 1202/3019] =?UTF-8?q?Update=200111.=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=A0=91=E7=9A=84=E6=9C=80=E5=B0=8F=E6=B7=B1=E5=BA=A6.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...00\345\260\217\346\267\261\345\272\246.md" | 37 +++++++++---------- 1 file changed, 17 insertions(+), 20 deletions(-) diff --git "a/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" "b/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" index 301c84b1ac..074a71652b 100644 --- "a/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" +++ "b/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" @@ -591,33 +591,30 @@ impl Solution { } // 迭代 - pub fn bfs(node: Option>>) -> i32{ - let mut min_depth = 0; - if node.is_none(){ - return min_depth + pub fn min_depth(root: Option>>) -> i32 { + let mut res = 0; + let mut queue = VecDeque::new(); + if root.is_some() { + queue.push_back(root); } - let mut stack = vec![node.unwrap()]; - while !stack.is_empty(){ - min_depth += 1; - let num = stack.len(); - for _i in 0..num{ - let top = stack.remove(0); - let left_child = top.borrow_mut().left.take(); - let right_child = top.borrow_mut().right.take(); - if left_child.is_none() && right_child.is_none(){ - return min_depth; + while !queue.is_empty() { + res += 1; + for _ in 0..queue.len() { + let node = queue.pop_front().unwrap().unwrap(); + if node.borrow().left.is_none() && node.borrow().right.is_none() { + return res; } - if left_child.is_some(){ - stack.push(left_child.unwrap()); + if node.borrow().left.is_some() { + queue.push_back(node.borrow().left.clone()); } - if right_child.is_some(){ - stack.push(right_child.unwrap()); + if node.borrow().right.is_some() { + queue.push_back(node.borrow().right.clone()); } } } - min_depth + res } - +} ```

From 46e1d0b907030592f6480b5cf04588b319bcab67 Mon Sep 17 00:00:00 2001 From: fw_qaq <82551626+Jack-Zhang-1314@users.noreply.github.com> Date: Sun, 13 Nov 2022 23:29:12 +0800 Subject: [PATCH 1203/3019] =?UTF-8?q?Update=200111.=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=A0=91=E7=9A=84=E6=9C=80=E5=B0=8F=E6=B7=B1=E5=BA=A6.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...7\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" | 1 + 1 file changed, 1 insertion(+) diff --git "a/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" "b/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" index 074a71652b..0b2ec0f686 100644 --- "a/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" +++ "b/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" @@ -591,6 +591,7 @@ impl Solution { } // 迭代 + // 需要 use std::collections::VecDeque; pub fn min_depth(root: Option>>) -> i32 { let mut res = 0; let mut queue = VecDeque::new(); From ed2588520a9e6822e110995baa34c7d278c26204 Mon Sep 17 00:00:00 2001 From: roylx <73628821+roylx@users.noreply.github.com> Date: Mon, 14 Nov 2022 15:00:07 -0700 Subject: [PATCH 1204/3019] =?UTF-8?q?Update=200121.=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?.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 增加了python 动态规划:版本三 --- ...6\234\200\344\275\263\346\227\266\346\234\272.md" | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git "a/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" "b/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" index 63ac5d04e7..cf17f48dad 100644 --- "a/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" +++ "b/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" @@ -310,6 +310,18 @@ class Solution: return dp[(length-1) % 2][1] ``` +> 动态规划:版本三 +```python +class Solution: + def maxProfit(self, prices: List[int]) -> int: + length = len(prices) + dp0, dp1 = -prices[0], 0 #注意这里只维护两个常量,因为dp0的更新不受dp1的影响 + for i in range(1, length): + dp1 = max(dp1, dp0 + prices[i]) + dp0 = max(dp0, -prices[i]) + return dp1 +``` + Go: > 贪心法: ```Go From 43275d8e9cf593839bb505353f79e42c3cba7bb7 Mon Sep 17 00:00:00 2001 From: fw_qaq <82551626+Jack-Zhang-1314@users.noreply.github.com> Date: Tue, 15 Nov 2022 20:51:03 +0800 Subject: [PATCH 1205/3019] =?UTF-8?q?Update=200222.=E5=AE=8C=E5=85=A8?= =?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=A0=91=E7=9A=84=E8=8A=82=E7=82=B9=E4=B8=AA?= =?UTF-8?q?=E6=95=B0.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\202\347\202\271\344\270\252\346\225\260.md" | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git "a/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" "b/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" index 6754864df1..bfb9ac0f30 100644 --- "a/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" +++ "b/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" @@ -797,6 +797,23 @@ object Solution { } ``` +rust: + +// 递归 +```rust +use std::cell::RefCell; +use std::rc::Rc; +impl Solution { + pub fn count_nodes(root: Option>>) -> i32 { + if root.is_none() { + return 0; + } + 1 + Self::count_nodes(Rc::clone(root.as_ref().unwrap()).borrow().left.clone()) + + Self::count_nodes(root.unwrap().borrow().right.clone()) + } +} +``` +

From 933cada6dbcd4169e3345828e886a127688db619 Mon Sep 17 00:00:00 2001 From: fw_qaq <82551626+Jack-Zhang-1314@users.noreply.github.com> Date: Tue, 15 Nov 2022 21:19:56 +0800 Subject: [PATCH 1206/3019] =?UTF-8?q?Update=200222.=E5=AE=8C=E5=85=A8?= =?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=A0=91=E7=9A=84=E8=8A=82=E7=82=B9=E4=B8=AA?= =?UTF-8?q?=E6=95=B0.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...02\347\202\271\344\270\252\346\225\260.md" | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git "a/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" "b/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" index bfb9ac0f30..8a3a15f33d 100644 --- "a/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" +++ "b/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" @@ -814,6 +814,35 @@ impl Solution { } ``` +// 迭代 +```rust +use std::rc::Rc; +use std::cell::RefCell; +use std::collections::VecDeque; +impl Solution { + pub fn count_nodes(root: Option>>) -> i32 { + let mut res = 0; + let mut queue = VecDeque::new(); + if root.is_some() { + queue.push_back(root); + } + while !queue.is_empty() { + for _ in 0..queue.len() { + let node = queue.pop_front().unwrap().unwrap(); + if node.borrow().left.is_some() { + queue.push_back(node.borrow().left.clone()); + } + if node.borrow().right.is_some() { + queue.push_back(node.borrow().right.clone()); + } + res += 1; + } + } + res + } +} +``` +

From 1af721e1ed561764b081c8d8ddc25d7c614fe7fd Mon Sep 17 00:00:00 2001 From: fw_qaq <82551626+Jack-Zhang-1314@users.noreply.github.com> Date: Tue, 15 Nov 2022 21:58:16 +0800 Subject: [PATCH 1207/3019] =?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 --- ...41\344\272\214\345\217\211\346\240\221.md" | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git "a/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" "b/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" index 6e7c8c5300..9751f2dd81 100644 --- "a/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" @@ -810,6 +810,38 @@ func getHeight(_ root: TreeNode?) -> Int { } ``` +### rust + +递归 + +```rust +use std::cell::RefCell; +use std::rc::Rc; +impl Solution { + pub fn is_balanced(root: Option>>) -> bool { + Self::get_depth(root) != -1 + } + pub fn get_depth(root: Option>>) -> i32 { + if root.is_none() { + return 0; + } + let right = Self::get_depth(root.as_ref().unwrap().borrow().left.clone()); + let left = Self::get_depth(root.unwrap().borrow().right.clone()); + if right == -1 { + return -1; + } + if left == -1 { + return -1; + } + if (right - left).abs() > 1 { + return -1; + } + + 1 + right.max(left) + } +} +``` +

From 9b2f1700ca45604662b4e10bd2769b5026d3b1f9 Mon Sep 17 00:00:00 2001 From: fw_qaq <82551626+Jack-Zhang-1314@users.noreply.github.com> Date: Tue, 15 Nov 2022 22:45:20 +0800 Subject: [PATCH 1208/3019] =?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 --- ...00\346\234\211\350\267\257\345\276\204.md" | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git "a/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" "b/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" index 297acb6002..0fb7ed0d59 100644 --- "a/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" +++ "b/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" @@ -794,6 +794,34 @@ object Solution { } } ``` + +rust: + +```rust +use std::cell::RefCell; +use std::rc::Rc; +impl Solution { + pub fn binary_tree_paths(root: Option>>) -> Vec { + let mut res = vec![]; + Self::recur(&root, String::from(""), &mut res); + res + } + pub fn recur(node: &Option>>, mut path: String, res: &mut Vec) { + let r = node.as_ref().unwrap().borrow(); + path += format!("{}", r.val).as_str(); + if r.left.is_none() && r.right.is_none() { + res.push(path.to_string()); + return; + } + if r.left.is_some() { + Self::recur(&r.left, path.clone() + "->", res); + } + if r.right.is_some() { + Self::recur(&r.right, path + "->", res); + } + } +} +```

From 6e01224ee38f0f97fc1e455233948622e1dae6a0 Mon Sep 17 00:00:00 2001 From: fw_qaq <82551626+Jack-Zhang-1314@users.noreply.github.com> Date: Tue, 15 Nov 2022 22:46:07 +0800 Subject: [PATCH 1209/3019] =?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 --- ...232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git "a/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" "b/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" index 0fb7ed0d59..80ce518aa0 100644 --- "a/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" +++ "b/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" @@ -798,8 +798,7 @@ object Solution { rust: ```rust -use std::cell::RefCell; -use std::rc::Rc; +// 遍历 impl Solution { pub fn binary_tree_paths(root: Option>>) -> Vec { let mut res = vec![]; From 299fab57663088a2aa12e958c36b2b04a36c0e1e Mon Sep 17 00:00:00 2001 From: fw_qaq <82551626+Jack-Zhang-1314@users.noreply.github.com> Date: Tue, 15 Nov 2022 22:56:11 +0800 Subject: [PATCH 1210/3019] =?UTF-8?q?Update=20problems/0257.=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?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" "b/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" index 80ce518aa0..a6e142380b 100644 --- "a/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" +++ "b/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" @@ -798,7 +798,7 @@ object Solution { rust: ```rust -// 遍历 +// 递归 impl Solution { pub fn binary_tree_paths(root: Option>>) -> Vec { let mut res = vec![]; From 4261d96a144c91ba577a1a2c3bdad5fb7ce38696 Mon Sep 17 00:00:00 2001 From: roylx <73628821+roylx@users.noreply.github.com> Date: Tue, 15 Nov 2022 10:27:03 -0700 Subject: [PATCH 1211/3019] =?UTF-8?q?Update=200714.=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?=E5=90=AB=E6=89=8B=E7=BB=AD=E8=B4=B9.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 更新Python贪心,更容易理解 --- ...345\220\253\346\211\213\347\273\255\350\264\271.md" | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git "a/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271.md" "b/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271.md" index 66fb9fb6af..faa56d42da 100644 --- "a/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271.md" +++ "b/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271.md" @@ -206,13 +206,13 @@ class Solution: # 贪心思路 result = 0 minPrice = prices[0] for i in range(1, len(prices)): - if prices[i] < minPrice: + if prices[i] < minPrice: # 此时有更低的价格,可以买入 minPrice = prices[i] - elif prices[i] >= minPrice and prices[i] <= minPrice + fee: - continue - else: - result += prices[i] - minPrice - fee + elif prices[i] > (minPrice + fee): # 此时有利润,同时假买入高价的股票,看看是否继续盈利 + result += prices[i] - (minPrice + fee) minPrice = prices[i] - fee + else: # minPrice<= prices[i] <= minPrice + fee, 价格处于minPrice和minPrice+fee之间,不做操作 + continue return result ``` From 6fb61ead0b5d723775958827e4d75a7199aecfe6 Mon Sep 17 00:00:00 2001 From: roylx <73628821+roylx@users.noreply.github.com> Date: Tue, 15 Nov 2022 11:01:24 -0700 Subject: [PATCH 1212/3019] =?UTF-8?q?Update=200055.=E8=B7=B3=E8=B7=83?= =?UTF-8?q?=E6=B8=B8=E6=88=8F.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 增加Python for循环版 --- ...0\267\263\350\267\203\346\270\270\346\210\217.md" | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git "a/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" "b/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" index 23357f2145..0ed03b0786 100644 --- "a/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" +++ "b/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" @@ -119,6 +119,18 @@ class Solution: return False ``` +```python +## for循环 +class Solution: + def canJump(self, nums: List[int]) -> bool: + cover = 0 + if len(nums) == 1: return True + for i in range(len(nums)): + cover = max(i + nums[i], cover) + if cover >= len(nums) - 1: return True + return False +``` + ### Go ```Go func canJUmp(nums []int) bool { From c0f1f13669a479f6ec8d0bfe6a0b1156213363d5 Mon Sep 17 00:00:00 2001 From: roylx <73628821+roylx@users.noreply.github.com> Date: Tue, 15 Nov 2022 11:05:39 -0700 Subject: [PATCH 1213/3019] =?UTF-8?q?Update=200055.=E8=B7=B3=E8=B7=83?= =?UTF-8?q?=E6=B8=B8=E6=88=8F.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit python for循环版,添加了更新cover的条件 --- ...0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git "a/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" "b/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" index 0ed03b0786..80c35c0325 100644 --- "a/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" +++ "b/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" @@ -126,8 +126,9 @@ class Solution: cover = 0 if len(nums) == 1: return True for i in range(len(nums)): - cover = max(i + nums[i], cover) - if cover >= len(nums) - 1: return True + if i <= cover: + cover = max(i + nums[i], cover) + if cover >= len(nums) - 1: return True return False ``` From 6772a996bba54cf0741b53a5306a51d5664ffadd Mon Sep 17 00:00:00 2001 From: wangshihua Date: Wed, 16 Nov 2022 09:27:42 +0800 Subject: [PATCH 1214/3019] =?UTF-8?q?feat:=E4=BF=AE=E6=94=B9=2027=20?= =?UTF-8?q?=E9=A2=98=20python=20=E4=BB=A3=E7=A0=81=E6=A0=BC=E5=BC=8F?= =?UTF-8?q?=E9=94=99=E8=AF=AF=E9=97=AE=E9=A2=98=E5=B9=B6=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E5=BF=AB=E6=85=A2=E6=8C=87=E9=92=88=E7=9A=84=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...73\351\231\244\345\205\203\347\264\240.md" | 38 ++++++++++++++----- 1 file changed, 28 insertions(+), 10 deletions(-) diff --git "a/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" "b/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" index e1de724365..35d0e2c416 100644 --- "a/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" +++ "b/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" @@ -77,7 +77,7 @@ public: 双指针法(快慢指针法): **通过一个快指针和慢指针在一个for循环下完成两个for循环的工作。** -定义快慢指针 +定义快慢指针 * 快指针:寻找新数组的元素 ,新数组就是不含有目标元素的数组 * 慢指针:指向更新 新数组下标的位置 @@ -196,26 +196,44 @@ class Solution { Python: -```python3 +```python 3 class Solution: def removeElement(self, nums: List[int], val: int) -> int: - if nums is None or len(nums)==0: - return 0 + if nums is None or len(nums)==0: + return 0 l=0 r=len(nums)-1 - while l int: + # 快慢指针 + fast = 0 # 快指针 + slow = 0 # 慢指针 + size = len(nums) + while fast < size: # 不加等于是因为,a = size 时,nums[a] 会越界 + # slow 用来收集不等于 val 的值,如果 fast 对应值不等于 val,则把它与 slow 替换 + if nums[fast] != val: + nums[slow] = nums[fast] + slow += 1 + fast += 1 + return slow +``` + + + Go: ```go @@ -268,7 +286,7 @@ Ruby: ```ruby def remove_element(nums, val) i = 0 - nums.each_index do |j| + nums.each_index do |j| if nums[j] != val nums[i] = nums[j] i+=1 @@ -342,7 +360,7 @@ int removeElement(int* nums, int numsSize, int val){ if(nums[fast] != val) { //将其挪到慢指针指向的位置,慢指针+1 nums[slow++] = nums[fast]; - } + } } //最后慢指针的大小就是新的数组的大小 return slow; From 9969795e066996d90ae143fd974690a5e7b1af62 Mon Sep 17 00:00:00 2001 From: codeSu Date: Wed, 16 Nov 2022 21:59:33 +0800 Subject: [PATCH 1215/3019] =?UTF-8?q?feat:=200070.=E7=88=AC=E6=A5=BC?= =?UTF-8?q?=E6=A2=AF.md=20=E5=A2=9E=E5=8A=A0=20rust=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...0.\347\210\254\346\245\274\346\242\257.md" | 31 +++++++++++++++---- 1 file changed, 25 insertions(+), 6 deletions(-) diff --git "a/problems/0070.\347\210\254\346\245\274\346\242\257.md" "b/problems/0070.\347\210\254\346\245\274\346\242\257.md" index 335ddb2324..79b2d90bc4 100644 --- "a/problems/0070.\347\210\254\346\245\274\346\242\257.md" +++ "b/problems/0070.\347\210\254\346\245\274\346\242\257.md" @@ -28,7 +28,7 @@ * 1 阶 + 2 阶 * 2 阶 + 1 阶 -# 视频讲解 +# 视频讲解 **《代码随想录》算法视频公开课:[带你学透动态规划-爬楼梯|LeetCode:70.爬楼梯)](https://www.bilibili.com/video/BV17h411h7UH),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 @@ -216,7 +216,7 @@ public: ## 其他语言版本 -### Java +### Java ```java // 常规方式 @@ -237,7 +237,7 @@ class Solution { public int climbStairs(int n) { if(n <= 2) return n; int a = 1, b = 2, sum = 0; - + for(int i = 3; i <= n; i++){ sum = a + b; // f(i - 1) + f(i - 2) a = b; // 记录f(i - 1),即下一轮的f(i - 2) @@ -261,7 +261,7 @@ class Solution: for i in range(2,n+1): dp[i]=dp[i-1]+dp[i-2] return dp[n] - + # 空间复杂度为O(1)版本 class Solution: def climbStairs(self, n: int) -> int: @@ -275,7 +275,7 @@ class Solution: return dp[1] ``` -### Go +### Go ```Go func climbStairs(n int) int { if n==1{ @@ -303,7 +303,7 @@ var climbStairs = function(n) { }; ``` -TypeScript +### TypeScript > 爬2阶 @@ -447,7 +447,26 @@ public class Solution { } ``` +### Rust +```rust +impl Solution { + pub fn climb_stairs(n: i32) -> i32 { + if n <= 2 { + return n; + } + let mut a = 1; + let mut b = 2; + let mut f = 0; + for i in 2..n { + f = a + b; + a = b; + b = f; + } + return f; + } +} +```

From dfe98e3766ed8b2a84a718d09c5bef1c415379ac Mon Sep 17 00:00:00 2001 From: syuxin2019 <519802856@qq.com> Date: Fri, 18 Nov 2022 19:12:21 +0800 Subject: [PATCH 1216/3019] modified 707.md --- ...07.\350\256\276\350\256\241\351\223\276\350\241\250.md" | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git "a/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" "b/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" index 1264983b76..5393c03801 100644 --- "a/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" +++ "b/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" @@ -106,11 +106,10 @@ public: // 在第index个节点之前插入一个新节点,例如index为0,那么新插入的节点为链表的新头节点。 // 如果index 等于链表的长度,则说明是新插入的节点为链表的尾结点 // 如果index大于链表的长度,则返回空 - // 如果index小于0,则置为0,作为链表的新头节点。 + // 如果index小于0,则在头部插入节点 void addAtIndex(int index, int val) { - if (index > _size || index < 0) { - return; - } + if(index > _size) return; + if(index < 0) index = 0; LinkedNode* newNode = new LinkedNode(val); LinkedNode* cur = _dummyHead; while(index--) { From 944ce27a28b6582e71f3626c39708e84ec4a0c34 Mon Sep 17 00:00:00 2001 From: fw_qaq <82551626+Jack-Zhang-1314@users.noreply.github.com> Date: Sat, 19 Nov 2022 00:07:04 +0800 Subject: [PATCH 1217/3019] =?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 --- ...46\347\235\200\345\233\236\346\272\257.md" | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git "a/problems/\344\272\214\345\217\211\346\240\221\344\270\255\351\200\222\345\275\222\345\270\246\347\235\200\345\233\236\346\272\257.md" "b/problems/\344\272\214\345\217\211\346\240\221\344\270\255\351\200\222\345\275\222\345\270\246\347\235\200\345\233\236\346\272\257.md" index e35a521494..dc576c60bb 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\344\270\255\351\200\222\345\275\222\345\270\246\347\235\200\345\233\236\346\272\257.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\344\270\255\351\200\222\345\275\222\345\270\246\347\235\200\345\233\236\346\272\257.md" @@ -617,6 +617,38 @@ func _binaryTreePaths3(_ root: TreeNode, res: inout [String], paths: inout [Int] } ``` +### Rust + +> 100.相同的树 + +```rsut +use std::cell::RefCell; +use std::rc::Rc; +impl Solution { + pub fn is_same_tree( + p: Option>>, + q: Option>>, + ) -> bool { + match (p, q) { + (None, None) => true, + (None, Some(_)) => false, + (Some(_), None) => false, + (Some(n1), Some(n2)) => { + if n1.borrow().val == n2.borrow().val { + let right = + Self::is_same_tree(n1.borrow().left.clone(), n2.borrow().left.clone()); + let left = + Self::is_same_tree(n1.borrow().right.clone(), n2.borrow().right.clone()); + right && left + } else { + false + } + } + } + } +} +``` +

From 4bae1e84baffb99c60f073eeca515c9c4a14697b Mon Sep 17 00:00:00 2001 From: fw_qaq <82551626+Jack-Zhang-1314@users.noreply.github.com> Date: Sat, 19 Nov 2022 01:39:14 +0800 Subject: [PATCH 1218/3019] =?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 --- ...46\347\235\200\345\233\236\346\272\257.md" | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git "a/problems/\344\272\214\345\217\211\346\240\221\344\270\255\351\200\222\345\275\222\345\270\246\347\235\200\345\233\236\346\272\257.md" "b/problems/\344\272\214\345\217\211\346\240\221\344\270\255\351\200\222\345\275\222\345\270\246\347\235\200\345\233\236\346\272\257.md" index dc576c60bb..9bf7405d06 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\344\270\255\351\200\222\345\275\222\345\270\246\347\235\200\345\233\236\346\272\257.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\344\270\255\351\200\222\345\275\222\345\270\246\347\235\200\345\233\236\346\272\257.md" @@ -649,6 +649,43 @@ impl Solution { } ``` +> 257.二叉树的不同路径 + +```rust +// 递归 +use std::cell::RefCell; +use std::rc::Rc; +impl Solution { + pub fn binary_tree_paths(root: Option>>) -> Vec { + let mut res = vec![]; + let mut path = vec![]; + Self::recur(&root, &mut path, &mut res); + res + } + + pub fn recur( + root: &Option>>, + path: &mut Vec, + res: &mut Vec, + ) { + let node = root.as_ref().unwrap().borrow(); + path.push(node.val.to_string()); + if node.left.is_none() && node.right.is_none() { + res.push(path.join("->")); + return; + } + if node.left.is_some() { + Self::recur(&node.left, path, res); + path.pop(); //回溯 + } + if node.right.is_some() { + Self::recur(&node.right, path, res); + path.pop(); //回溯 + } + } +} +``` +

From 65857d15333bfe5ecf9a7f56fb0abb8a4c30ebe2 Mon Sep 17 00:00:00 2001 From: Zeeland <287017217@qq.com> Date: Sat, 19 Nov 2022 09:50:57 +0800 Subject: [PATCH 1219/3019] =?UTF-8?q?update=200695.=E5=B2=9B=E5=B1=BF?= =?UTF-8?q?=E7=9A=84=E6=9C=80=E5=A4=A7=E9=9D=A2=E7=A7=AF.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...7\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" | 1 - 1 file changed, 1 deletion(-) diff --git "a/problems/0695.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" "b/problems/0695.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" index 414efe0b3e..76740ef1f2 100644 --- "a/problems/0695.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" +++ "b/problems/0695.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" @@ -197,7 +197,6 @@ class Solution: if not visited[i][j] and grid[i][j] == 1: # 每一个新岛屿 self.count = 0 - print(f'{self.count}') self.bfs(grid, visited, i, j) result = max(result, self.count) From 98ade76980dfc8ace03d0c61f2491ed3b39f800a Mon Sep 17 00:00:00 2001 From: Allen <2439506288@qq.com> Date: Sun, 20 Nov 2022 08:20:52 +0800 Subject: [PATCH 1220/3019] =?UTF-8?q?update=200052.N=E7=9A=87=E5=90=8E2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "problems/0052.N\347\232\207\345\220\216II.md" | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git "a/problems/0052.N\347\232\207\345\220\216II.md" "b/problems/0052.N\347\232\207\345\220\216II.md" index e4faac0cb4..1c88fb3c7b 100644 --- "a/problems/0052.N\347\232\207\345\220\216II.md" +++ "b/problems/0052.N\347\232\207\345\220\216II.md" @@ -8,7 +8,7 @@ # 52. N皇后II -题目链接:https://leetcode.cn/problems/n-queens-ii/ +题目链接:[https://leetcode.cn/problems/n-queens-ii/](https://leetcode.cn/problems/n-queens-ii/) n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。 @@ -308,3 +308,4 @@ class Solution { + From 15379361aa9b1c1c062870d9e4790ca24ae51a1b Mon Sep 17 00:00:00 2001 From: fw_qaq <82551626+Jack-Zhang-1314@users.noreply.github.com> Date: Sun, 20 Nov 2022 16:11:25 +0800 Subject: [PATCH 1221/3019] =?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 --- ...66\345\255\220\344\271\213\345\222\214.md" | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git "a/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" "b/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" index 6b6fe72940..3118b7c079 100644 --- "a/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" +++ "b/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" @@ -575,6 +575,31 @@ object Solution { } ``` +### Rust + +**递归** + +```rust +use std::cell::RefCell; +use std::rc::Rc; +impl Solution { + pub fn sum_of_left_leaves(root: Option>>) -> i32 { + let mut res = 0; + if let Some(node) = root { + if let Some(left) = &node.borrow().left { + if left.borrow().right.is_none() && left.borrow().right.is_none() { + res += left.borrow().val; + } + } + res + Self::sum_of_left_leaves(node.borrow().left.clone()) + + Self::sum_of_left_leaves(node.borrow().right.clone()) + } else { + 0 + } + } +} +``` +

From 59d17ea08d37ab5e85cae19c472686fa0a4d4a69 Mon Sep 17 00:00:00 2001 From: fw_qaq <82551626+Jack-Zhang-1314@users.noreply.github.com> Date: Sun, 20 Nov 2022 16:39:42 +0800 Subject: [PATCH 1222/3019] =?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 --- ...66\345\255\220\344\271\213\345\222\214.md" | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git "a/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" "b/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" index 3118b7c079..f5b9ca3902 100644 --- "a/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" +++ "b/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" @@ -600,6 +600,33 @@ impl Solution { } ``` +**迭代:** + +```rust +use std::cell::RefCell; +use std::rc::Rc; +impl Solution { + pub fn sum_of_left_leaves(root: Option>>) -> i32 { + let mut res = 0; + let mut stack = vec![root]; + while !stack.is_empty() { + if let Some(node) = stack.pop().unwrap() { + if let Some(left) = &node.borrow().left { + if left.borrow().left.is_none() && left.borrow().right.is_none() { + res += left.borrow().val; + } + stack.push(Some(left.to_owned())); + } + if let Some(right) = &node.borrow().right { + stack.push(Some(right.to_owned())); + } + } + } + res + } +} +``` +

From 145114872d6d43e6f3e938891249bf52c7aea8c2 Mon Sep 17 00:00:00 2001 From: fw_qaq <82551626+Jack-Zhang-1314@users.noreply.github.com> Date: Sun, 20 Nov 2022 16:58:25 +0800 Subject: [PATCH 1223/3019] =?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 --- ...13\350\247\222\347\232\204\345\200\274.md" | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git "a/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" "b/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" index fd6e5d95f6..cfb4a6c46e 100644 --- "a/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" +++ "b/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" @@ -587,6 +587,40 @@ object Solution { } ``` +### rust + +**层序遍历** + +```rust +use std::cell::RefCell; +use std::collections::VecDeque; +use std::rc::Rc; +impl Solution { + pub fn find_bottom_left_value(root: Option>>) -> i32 { + let mut queue = VecDeque::new(); + let mut res = 0; + if root.is_some() { + queue.push_back(root); + } + while !queue.is_empty() { + for i in 0..queue.len() { + let node = queue.pop_front().unwrap().unwrap(); + if i == 1 { + res = node.borrow().val; + } + if node.borrow().left.is_some() { + queue.push_back(node.borrow().left.clone()); + } + if node.borrow().right.is_some() { + queue.push_back(node.borrow().right.clone()); + } + } + } + res + } +} +``` +

From 25e055ec7343a7ff79303062fbbf32ec22b9e02e Mon Sep 17 00:00:00 2001 From: fw_qaq <82551626+Jack-Zhang-1314@users.noreply.github.com> Date: Sun, 20 Nov 2022 16:59:01 +0800 Subject: [PATCH 1224/3019] =?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 --- ...\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" "b/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" index cfb4a6c46e..70be70513d 100644 --- "a/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" +++ "b/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" @@ -605,7 +605,7 @@ impl Solution { while !queue.is_empty() { for i in 0..queue.len() { let node = queue.pop_front().unwrap().unwrap(); - if i == 1 { + if i == 0 { res = node.borrow().val; } if node.borrow().left.is_some() { From 032527d25ad573ab3e7c3c715d2f6d3d66f0968f Mon Sep 17 00:00:00 2001 From: fw_qaq <82551626+Jack-Zhang-1314@users.noreply.github.com> Date: Sun, 20 Nov 2022 17:43:25 +0800 Subject: [PATCH 1225/3019] =?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 --- ...13\350\247\222\347\232\204\345\200\274.md" | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git "a/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" "b/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" index 70be70513d..622a11b5eb 100644 --- "a/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" +++ "b/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" @@ -621,6 +621,43 @@ impl Solution { } ``` +**递归** + +```rust +use std::cell::RefCell; +use std::rc::Rc; +impl Solution { + //*递归*/ + pub fn find_bottom_left_value(root: Option>>) -> i32 { + let mut res = 0; + let mut max_depth = i32::MIN; + Self::traversal(root, 0, &mut max_depth, &mut res); + res + } + fn traversal( + root: Option>>, + depth: i32, + max_depth: &mut i32, + res: &mut i32, + ) { + let node = root.unwrap(); + if node.borrow().left.is_none() && node.borrow().right.is_none() { + if depth > *max_depth { + *max_depth = depth; + *res = node.borrow().val; + } + return; + } + if node.borrow().left.is_some() { + Self::traversal(node.borrow().left.clone(), depth + 1, max_depth, res); + } + if node.borrow().right.is_some() { + Self::traversal(node.borrow().right.clone(), depth + 1, max_depth, res); + } + } +} +``` +

From d3e35b3ae961d14dbcb23a9658d3163ca50dd284 Mon Sep 17 00:00:00 2001 From: fw_qaq <82551626+Jack-Zhang-1314@users.noreply.github.com> Date: Sun, 20 Nov 2022 18:02:32 +0800 Subject: [PATCH 1226/3019] =?UTF-8?q?Update=200112.=E8=B7=AF=E5=BE=84?= =?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 --- ...57\345\276\204\346\200\273\345\222\214.md" | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git "a/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" "b/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" index d50f23f974..482787bf2f 100644 --- "a/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" +++ "b/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" @@ -1213,6 +1213,28 @@ object Solution { } ``` +## rust + +### 112.路径总和.md + +```rust +use std::rc::Rc; +use std::cell::RefCell; +impl Solution { + pub fn has_path_sum(root: Option>>, target_sum: i32) -> bool { + if root.is_none() { + return false; + } + let node = root.unwrap(); + if node.borrow().left.is_none() && node.borrow().right.is_none() { + return node.borrow().val == target_sum; + } + return Self::has_path_sum(node.borrow().left.clone(), target_sum - node.borrow().val) + || Self::has_path_sum(node.borrow().right.clone(), target_sum - node.borrow().val); + } +} +``` +

From 47b7cf3cae785ec43be3e08dc8db8143d3f9aaca Mon Sep 17 00:00:00 2001 From: fw_qaq <82551626+Jack-Zhang-1314@users.noreply.github.com> Date: Sun, 20 Nov 2022 22:06:39 +0800 Subject: [PATCH 1227/3019] =?UTF-8?q?Update=200112.=E8=B7=AF=E5=BE=84?= =?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 --- ...57\345\276\204\346\200\273\345\222\214.md" | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git "a/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" "b/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" index 482787bf2f..f717f6b856 100644 --- "a/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" +++ "b/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" @@ -1217,6 +1217,8 @@ object Solution { ### 112.路径总和.md +递归: + ```rust use std::rc::Rc; use std::cell::RefCell; @@ -1235,6 +1237,38 @@ impl Solution { } ``` +迭代: + +```rust +use std::rc::Rc; +use std::cell::RefCell; +impl Solution { + pub fn has_path_sum(root: Option>>, target_sum: i32) -> bool { + let mut stack = vec![]; + if let Some(node) = root { + stack.push((node.borrow().val, node.to_owned())); + } + while !stack.is_empty() { + let (value, node) = stack.pop().unwrap(); + if node.borrow().left.is_none() && node.borrow().right.is_none() && value == target_sum + { + return true; + } + if node.borrow().left.is_some() { + if let Some(r) = node.borrow().left.as_ref() { + stack.push((r.borrow().val + value, r.to_owned())); + } + } + if node.borrow().right.is_some() { + if let Some(r) = node.borrow().right.as_ref() { + stack.push((r.borrow().val + value, r.to_owned())); + } + } + } + false + } +``` +

From 1a854c4a7e083a5b682affe7f84ccd931b74d221 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E5=91=98Carl?= Date: Mon, 21 Nov 2022 11:47:40 +0800 Subject: [PATCH 1228/3019] =?UTF-8?q?Update=201254.=E7=BB=9F=E8=AE=A1?= =?UTF-8?q?=E5=B0=81=E9=97=AD=E5=B2=9B=E5=B1=BF=E7=9A=84=E6=95=B0=E7=9B=AE?= =?UTF-8?q?.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\277\347\232\204\346\225\260\347\233\256.md" | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git "a/problems/1254.\347\273\237\350\256\241\345\260\201\351\227\255\345\262\233\345\261\277\347\232\204\346\225\260\347\233\256.md" "b/problems/1254.\347\273\237\350\256\241\345\260\201\351\227\255\345\262\233\345\261\277\347\232\204\346\225\260\347\233\256.md" index 1270085a82..dc8fda41f1 100644 --- "a/problems/1254.\347\273\237\350\256\241\345\260\201\351\227\255\345\262\233\345\261\277\347\232\204\346\225\260\347\233\256.md" +++ "b/problems/1254.\347\273\237\350\256\241\345\260\201\351\227\255\345\262\233\345\261\277\347\232\204\346\225\260\347\233\256.md" @@ -76,13 +76,8 @@ public: return count; } }; -``` -

- - - - -### 其他语言版本 +``` +## 其他语言版本 ### JavaScript: @@ -137,3 +132,11 @@ var closedIsland = function(grid) { return count; }; ``` + + +

+ + + + + From d791cc76b6779799779c33f77fc4c6e59d7a6fee Mon Sep 17 00:00:00 2001 From: wang2jun <91008685+wang2jun@users.noreply.github.com> Date: Mon, 21 Nov 2022 13:27:00 +0800 Subject: [PATCH 1229/3019] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20657.=20=E6=9C=BA?= =?UTF-8?q?=E5=99=A8=E4=BA=BA=E8=83=BD=E5=90=A6=E8=BF=94=E5=9B=9E=E5=8E=9F?= =?UTF-8?q?=E7=82=B9=20TypeScript=20=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 增加 657. 机器人能否返回原点 TypeScript 版本代码 --- ...24\345\233\236\345\216\237\347\202\271.md" | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git "a/problems/0657.\346\234\272\345\231\250\344\272\272\350\203\275\345\220\246\350\277\224\345\233\236\345\216\237\347\202\271.md" "b/problems/0657.\346\234\272\345\231\250\344\272\272\350\203\275\345\220\246\350\277\224\345\233\236\345\216\237\347\202\271.md" index 017c5ecce0..ab4bf1525c 100644 --- "a/problems/0657.\346\234\272\345\231\250\344\272\272\350\203\275\345\220\246\350\277\224\345\233\236\345\216\237\347\202\271.md" +++ "b/problems/0657.\346\234\272\345\231\250\344\272\272\350\203\275\345\220\246\350\277\224\345\233\236\345\216\237\347\202\271.md" @@ -150,6 +150,37 @@ var judgeCircle = function(moves) { ``` +## TypeScript + +```ts +var judgeCircle = function (moves) { + let x = 0 + let y = 0 + for (let i = 0; i < moves.length; i++) { + switch (moves[i]) { + case 'L': { + x-- + break + } + case 'R': { + x++ + break + } + case 'U': { + y-- + break + } + case 'D': { + y++ + break + } + } + } + return x === 0 && y === 0 +}; +``` + +

From f9bddcabeb72f3696773091744b2d7d53387e895 Mon Sep 17 00:00:00 2001 From: HaoYu Dong <73568310+DongHY1@users.noreply.github.com> Date: Mon, 21 Nov 2022 22:21:39 +0800 Subject: [PATCH 1230/3019] =?UTF-8?q?Update=200101.=E5=AF=B9=E7=A7=B0?= =?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 Fixing description issues --- ...\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" "b/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" index 30ca3d7729..f3d9fa1d22 100644 --- "a/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" @@ -21,7 +21,7 @@ 对于二叉树是否对称,要比较的是根节点的左子树与右子树是不是相互翻转的,理解这一点就知道了**其实我们要比较的是两个树(这两个树是根节点的左右子树)**,所以在递归遍历的过程中,也是要同时遍历两棵树。 -那么如果比较呢? +那么如何比较呢? 比较的是两个子树的里侧和外侧的元素是否相等。如图所示: From 1fef4a77be4ceefde5406a774706c00de77917cc Mon Sep 17 00:00:00 2001 From: fw_qaq <82551626+Jack-Zhang-1314@users.noreply.github.com> Date: Mon, 21 Nov 2022 22:31:55 +0800 Subject: [PATCH 1231/3019] =?UTF-8?q?Update=200112.=E8=B7=AF=E5=BE=84?= =?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 --- ...57\345\276\204\346\200\273\345\222\214.md" | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git "a/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" "b/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" index f717f6b856..effe764928 100644 --- "a/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" +++ "b/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" @@ -1269,6 +1269,55 @@ impl Solution { } ``` +### 113.路径总和-ii + +```rust +impl Solution { + pub fn path_sum(root: Option>>, target_sum: i32) -> Vec> { + let mut res = vec![]; + let mut route = vec![]; + if root.is_none() { + return res; + } else { + route.push(root.as_ref().unwrap().borrow().val); + } + Self::recur( + &root, + target_sum - root.as_ref().unwrap().borrow().val, + &mut res, + &mut route, + ); + res + } + + pub fn recur( + root: &Option>>, + sum: i32, + res: &mut Vec>, + route: &mut Vec, + ) { + let node = root.as_ref().unwrap().borrow(); + if node.left.is_none() && node.right.is_none() && sum == 0 { + res.push(route.to_vec()); + return; + } + if node.left.is_some() { + let left = node.left.as_ref().unwrap(); + route.push(left.borrow().val); + Self::recur(&node.left, sum - left.borrow().val, res, route); + route.pop(); + } + if node.right.is_some() { + let right = node.right.as_ref().unwrap(); + route.push(right.borrow().val); + Self::recur(&node.right, sum - right.borrow().val, res, route); + route.pop(); + } + } +} + +``` +

From 27f8efa24c9d43b911fc7c05a7182508d50365cd Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Mon, 21 Nov 2022 23:12:33 +0800 Subject: [PATCH 1232/3019] =?UTF-8?q?=E5=9C=A8=E8=AE=BE=E8=AE=A1=E9=93=BE?= =?UTF-8?q?=E8=A1=A8=E7=9A=84C++=E4=BB=A3=E7=A0=81=E9=83=A8=E5=88=86?= =?UTF-8?q?=EF=BC=8CaddAtIndex=E6=96=B9=E6=B3=95=E4=B8=AD=EF=BC=8C?= =?UTF-8?q?=E9=92=88=E5=AF=B9index=20<=200=20=E7=9A=84=E6=83=85=E5=86=B5?= =?UTF-8?q?=E7=BA=A0=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git "a/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" "b/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" index 1264983b76..9461e263dc 100644 --- "a/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" +++ "b/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" @@ -108,9 +108,12 @@ public: // 如果index大于链表的长度,则返回空 // 如果index小于0,则置为0,作为链表的新头节点。 void addAtIndex(int index, int val) { - if (index > _size || index < 0) { + if (index > _size) { return; } + if (index < 0) { + index = 0; + } LinkedNode* newNode = new LinkedNode(val); LinkedNode* cur = _dummyHead; while(index--) { From f071df11f81f0090e611d8700d9868f38ecde55c Mon Sep 17 00:00:00 2001 From: fw_qaq <82551626+Jack-Zhang-1314@users.noreply.github.com> Date: Tue, 22 Nov 2022 00:01:41 +0800 Subject: [PATCH 1233/3019] =?UTF-8?q?Update=200106.=E4=BB=8E=E4=B8=AD?= =?UTF-8?q?=E5=BA=8F=E4=B8=8E=E5=90=8E=E5=BA=8F=E9=81=8D=E5=8E=86=E5=BA=8F?= =?UTF-8?q?=E5=88=97=E6=9E=84=E9=80=A0=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 --- ...40\344\272\214\345\217\211\346\240\221.md" | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git "a/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" "b/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" index 17ba561d47..0353ad6248 100644 --- "a/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" @@ -1136,6 +1136,34 @@ object Solution { } ``` +## rust + +105 从前序与中序遍历序列构造二叉树 + +```rust +use std::cell::RefCell; +use std::rc::Rc; +impl Solution { + pub fn build_tree( + mut preorder: Vec, + mut inorder: Vec, + ) -> Option>> { + if preorder.is_empty() { + return None; + } + let root = preorder[0]; + let index = inorder.iter().position(|&x| x == root).unwrap(); + let mut root = TreeNode::new(root); + root.left = Self::build_tree( + preorder.splice(1..index + 1, []).collect(), + inorder.splice(0..index, []).collect(), + ); + root.right = Self::build_tree(preorder.split_off(1), inorder.split_off(1)); + Some(Rc::new(RefCell::new(root))) + } +} +``` +

From 3762f1a3e3e4f4f5ec1e3efc4d6ec9cf77079244 Mon Sep 17 00:00:00 2001 From: fw_qaq <82551626+Jack-Zhang-1314@users.noreply.github.com> Date: Tue, 22 Nov 2022 00:18:08 +0800 Subject: [PATCH 1234/3019] =?UTF-8?q?Update=200106.=E4=BB=8E=E4=B8=AD?= =?UTF-8?q?=E5=BA=8F=E4=B8=8E=E5=90=8E=E5=BA=8F=E9=81=8D=E5=8E=86=E5=BA=8F?= =?UTF-8?q?=E5=88=97=E6=9E=84=E9=80=A0=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 --- ...40\344\272\214\345\217\211\346\240\221.md" | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git "a/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" "b/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" index 0353ad6248..cf5f11d063 100644 --- "a/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" @@ -1138,6 +1138,30 @@ object Solution { ## rust +106 从中序与后序遍历序列构造二叉树 + +```rust +impl Solution { + pub fn build_tree( + mut inorder: Vec, + mut postorder: Vec, + ) -> Option>> { + if inorder.is_empty() { + return None; + } + let root = postorder.pop().unwrap(); + let index = inorder.iter().position(|&x| x == root).unwrap(); + let mut root = TreeNode::new(root); + root.left = Self::build_tree( + inorder.splice(0..index, []).collect(), + postorder.splice(0..index, []).collect(), + ); + root.right = Self::build_tree(inorder.split_off(1), postorder); + Some(Rc::new(RefCell::new(root))) + } +} +``` + 105 从前序与中序遍历序列构造二叉树 ```rust From cbe3bcf50a8633b2c07ff92b86b7bd9780d62848 Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Tue, 22 Nov 2022 10:13:52 +0800 Subject: [PATCH 1235/3019] =?UTF-8?q?update=20027.=E7=A7=BB=E9=99=A4?= =?UTF-8?q?=E5=85=83=E7=B4=A0=20python=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...73\351\231\244\345\205\203\347\264\240.md" | 24 +++++++------------ 1 file changed, 9 insertions(+), 15 deletions(-) diff --git "a/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" "b/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" index e1de724365..a563a13f3e 100644 --- "a/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" +++ "b/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" @@ -199,21 +199,15 @@ Python: ```python3 class Solution: def removeElement(self, nums: List[int], val: int) -> int: - if nums is None or len(nums)==0: - return 0 - l=0 - r=len(nums)-1 - while l Date: Tue, 22 Nov 2022 16:56:31 +0800 Subject: [PATCH 1236/3019] =?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 修改了 背包理论基础01背包-1 中的 java版本的代码 --- ...47\241\20001\350\203\214\345\214\205-1.md" | 71 +++++++++++++------ 1 file changed, 48 insertions(+), 23 deletions(-) diff --git "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" index ee19e53d21..8f4ca2d43b 100644 --- "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" +++ "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" @@ -271,39 +271,64 @@ int main() { ### java ```java +public class BagProblem { public static void main(String[] args) { - int[] weight = {1, 3, 4}; - int[] value = {15, 20, 30}; - int bagsize = 4; - testweightbagproblem(weight, value, bagsize); + int[] weight = {1,3,4}; + int[] value = {15,20,30}; + int bagSize = 4; + testWeightBagProblem(weight,value,bagSize); } - public static void testweightbagproblem(int[] weight, int[] value, int bagsize){ - int wlen = weight.length, value0 = 0; - //定义dp数组:dp[i][j]表示背包容量为j时,前i个物品能获得的最大价值 - int[][] dp = new int[wlen + 1][bagsize + 1]; - //初始化:背包容量为0时,能获得的价值都为0 - for (int i = 0; i <= wlen; i++){ - dp[i][0] = value0; + /** + * 动态规划获得结果 + * @param weight 物品的重量 + * @param value 物品的价值 + * @param bagSize 背包的容量 + */ + public static void testWeightBagProblem(int[] weight, int[] value, int bagSize){ + + // 创建dp数组 + int goods = weight.length; // 获取物品的数量 + int[][] dp = new int[goods][bagSize + 1]; + + // 初始化dp数组 + // 创建数组后,其中默认的值就是0 + for (int j = weight[0]; j <= bagSize; j++) { + dp[0][j] = value[0]; } - //遍历顺序:先遍历物品,再遍历背包容量 - for (int i = 1; i <= wlen; i++){ - for (int j = 1; j <= bagsize; j++){ - if (j < weight[i - 1]){ - dp[i][j] = dp[i - 1][j]; - }else{ - dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - weight[i - 1]] + value[i - 1]); + + // 填充dp数组 + for (int i = 1; i < weight.length; i++) { + for (int j = 1; j <= bagSize; j++) { + if (j < weight[i]) { + /** + * 当前背包的容量都没有当前物品i大的时候,是不放物品i的 + * 那么前i-1个物品能放下的最大价值就是当前情况的最大价值 + */ + dp[i][j] = dp[i-1][j]; + } else { + /** + * 当前背包的容量可以放下物品i + * 那么此时分两种情况: + * 1、不放物品i + * 2、放物品i + * 比较这两种情况下,哪种背包中物品的最大价值最大 + */ + dp[i][j] = Math.max(dp[i-1][j] , dp[i-1][j-weight[i]] + value[i]); } } } - //打印dp数组 - for (int i = 0; i <= wlen; i++){ - for (int j = 0; j <= bagsize; j++){ - System.out.print(dp[i][j] + " "); + + // 打印dp数组 + for (int i = 0; i < goods; i++) { + for (int j = 0; j <= bagSize; j++) { + System.out.print(dp[i][j] + "\t"); } - System.out.print("\n"); + System.out.println("\n"); } } +} + ``` ### python From 7746c7c2bbe010bee987ca0eb9054f0d59737560 Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Tue, 22 Nov 2022 22:27:35 +0800 Subject: [PATCH 1237/3019] =?UTF-8?q?update=200209.=E9=95=BF=E5=BA=A6?= =?UTF-8?q?=E6=9C=80=E5=B0=8F=E7=9A=84=E5=AD=90=E6=95=B0=E7=BB=84=20python?= =?UTF-8?q?,=20js=20=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...04\345\255\220\346\225\260\347\273\204.md" | 66 +++++++------------ 1 file changed, 23 insertions(+), 43 deletions(-) diff --git "a/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" "b/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" index c912c259ec..220630f24b 100644 --- "a/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" +++ "b/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" @@ -169,39 +169,18 @@ Python: ```python class Solution: def minSubArrayLen(self, s: int, nums: List[int]) -> int: - # 定义一个无限大的数 - res = float("inf") - Sum = 0 - index = 0 - for i in range(len(nums)): - Sum += nums[i] + res = float("inf") # 定义一个无限大的数 + Sum = 0 # 滑动窗口数值之和 + i = 0 # 滑动窗口起始位置 + for j in range(len(nums)): + Sum += nums[j] while Sum >= s: - res = min(res, i-index+1) - Sum -= nums[index] - index += 1 - return 0 if res==float("inf") else res -``` -```python -# 滑动窗口 -class Solution: - def minSubArrayLen(self, target: int, nums: List[int]) -> int: - if nums is None or len(nums) == 0: - return 0 - lenf = len(nums) + 1 - total = 0 - i = j = 0 - while (j < len(nums)): - total = total + nums[j] - j += 1 - while (total >= target): - lenf = min(lenf, j - i) - total = total - nums[i] + res = min(res, j-i+1) + Sum -= nums[i] i += 1 - if lenf == len(nums) + 1: - return 0 - else: - return lenf + return 0 if res == float("inf") else res ``` + Go: ```go func minSubArrayLen(target int, nums []int) int { @@ -232,22 +211,23 @@ func minSubArrayLen(target int, nums []int) int { JavaScript: ```js - var minSubArrayLen = function(target, nums) { - // 长度计算一次 - const len = nums.length; - let l = r = sum = 0, - res = len + 1; // 子数组最大不会超过自身 - while(r < len) { - sum += nums[r++]; - // 窗口滑动 - while(sum >= target) { - // r始终为开区间 [l, r) - res = res < r - l ? res : r - l; - sum-=nums[l++]; + let start, end + start = end = 0 + let sum = 0 + let len = nums.length + let ans = Infinity + + while(end < len){ + sum += nums[end]; + while (sum >= target) { + ans = Math.min(ans, end - start + 1); + sum -= nums[start]; + start++; } + end++; } - return res > len ? 0 : res; + return ans === Infinity ? 0 : ans }; ``` From 183a62a9237e0b2e3710985610421984400911e7 Mon Sep 17 00:00:00 2001 From: fw_qaq <82551626+Jack-Zhang-1314@users.noreply.github.com> Date: Wed, 23 Nov 2022 01:57:45 -0500 Subject: [PATCH 1238/3019] =?UTF-8?q?Update=200106.=E4=BB=8E=E4=B8=AD?= =?UTF-8?q?=E5=BA=8F=E4=B8=8E=E5=90=8E=E5=BA=8F=E9=81=8D=E5=8E=86=E5=BA=8F?= =?UTF-8?q?=E5=88=97=E6=9E=84=E9=80=A0=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 --- ...40\344\272\214\345\217\211\346\240\221.md" | 28 ++++++++----------- 1 file changed, 11 insertions(+), 17 deletions(-) diff --git "a/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" "b/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" index cf5f11d063..e5cbeda3f0 100644 --- "a/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" @@ -1141,22 +1141,19 @@ object Solution { 106 从中序与后序遍历序列构造二叉树 ```rust +use std::cell::RefCell; +use std::rc::Rc; impl Solution { - pub fn build_tree( - mut inorder: Vec, - mut postorder: Vec, - ) -> Option>> { + pub fn build_tree(inorder: Vec, postorder: Vec) -> Option>> { if inorder.is_empty() { return None; } + let mut postorder = postorder; let root = postorder.pop().unwrap(); let index = inorder.iter().position(|&x| x == root).unwrap(); let mut root = TreeNode::new(root); - root.left = Self::build_tree( - inorder.splice(0..index, []).collect(), - postorder.splice(0..index, []).collect(), - ); - root.right = Self::build_tree(inorder.split_off(1), postorder); + root.left = Self::build_tree(inorder[..index].to_vec(), postorder[..index].to_vec()); + root.right = Self::build_tree(inorder[index + 1..].to_vec(), postorder[index..].to_vec()); Some(Rc::new(RefCell::new(root))) } } @@ -1168,21 +1165,18 @@ impl Solution { use std::cell::RefCell; use std::rc::Rc; impl Solution { - pub fn build_tree( - mut preorder: Vec, - mut inorder: Vec, - ) -> Option>> { + pub fn build_tree(preorder: Vec, inorder: Vec) -> Option>> { if preorder.is_empty() { return None; } let root = preorder[0]; let index = inorder.iter().position(|&x| x == root).unwrap(); let mut root = TreeNode::new(root); - root.left = Self::build_tree( - preorder.splice(1..index + 1, []).collect(), - inorder.splice(0..index, []).collect(), + root.left = Self::build_tree(preorder[1..index + 1].to_vec(), inorder[0..index].to_vec()); + root.right = Self::build_tree( + preorder[index + 1..].to_vec(), + inorder[index + 1..].to_vec(), ); - root.right = Self::build_tree(preorder.split_off(1), inorder.split_off(1)); Some(Rc::new(RefCell::new(root))) } } From cd5996c825bc7f18ad34f69bfa1511991f20859a Mon Sep 17 00:00:00 2001 From: fw_qaq <82551626+Jack-Zhang-1314@users.noreply.github.com> Date: Wed, 23 Nov 2022 06:08:06 -0500 Subject: [PATCH 1239/3019] =?UTF-8?q?Update=200654.=E6=9C=80=E5=A4=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 --- ...47\344\272\214\345\217\211\346\240\221.md" | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git "a/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" "b/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" index fda6437251..667610d8d8 100644 --- "a/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" @@ -509,6 +509,34 @@ object Solution { } ``` +### Rust + +```rust +use std::cell::RefCell; +use std::rc::Rc; +impl Solution { + pub fn construct_maximum_binary_tree(nums: Vec) -> Option>> { + Self::traversal(&nums, 0, nums.len()) + } + + pub fn traversal(nums: &Vec, left: usize, right: usize) -> Option>> { + if left >= right { + return None; + } + let mut max_value_index = left; + for i in left + 1..right { + if nums[max_value_index] < nums[i] { + max_value_index = i; + } + } + let mut root = TreeNode::new(nums[max_value_index]); + root.left = Self::traversal(nums, left, max_value_index); + root.right = Self::traversal(nums, max_value_index + 1, right); + Some(Rc::new(RefCell::new(root))) + } +} +``` +

From af0e45b9af2171db2a2b5ef005745463a9d739e3 Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Wed, 23 Nov 2022 23:34:26 +0800 Subject: [PATCH 1240/3019] =?UTF-8?q?update=200707.=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E9=93=BE=E8=A1=A8=20python=E4=BB=A3=E7=A0=81=EF=BC=8Cjava?= =?UTF-8?q?=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...76\350\256\241\351\223\276\350\241\250.md" | 116 ++++++++++-------- 1 file changed, 65 insertions(+), 51 deletions(-) diff --git "a/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" "b/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" index 9461e263dc..f0c4bc6048 100644 --- "a/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" +++ "b/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" @@ -305,7 +305,7 @@ class MyLinkedList { head = new ListNode(0); } - //获取第index个节点的数值 + //获取第index个节点的数值,注意index是从0开始的,第0个节点就是头结点 public int get(int index) { //如果index非法,返回-1 if (index < 0 || index >= size) { @@ -319,12 +319,12 @@ class MyLinkedList { return currentNode.val; } - //在链表最前面插入一个节点 + //在链表最前面插入一个节点,等价于在第0个元素前添加 public void addAtHead(int val) { addAtIndex(0, val); } - //在链表的最后插入一个节点 + //在链表的最后插入一个节点,等价于在(末尾+1)个元素前添加 public void addAtTail(int val) { addAtIndex(size, val); } @@ -481,76 +481,90 @@ class MyLinkedList { Python: ```python # 单链表 -class Node: - - def __init__(self, val): - self.val = val +class Node(object): + def __init__(self, x=0): + self.val = x self.next = None - -class MyLinkedList: +class MyLinkedList(object): def __init__(self): - self._head = Node(0) # 虚拟头部节点 - self._count = 0 # 添加的节点数 + self.head = Node() + self.size = 0 # 设置一个链表长度的属性,便于后续操作,注意每次增和删的时候都要更新 - def get(self, index: int) -> int: + def get(self, index): """ - Get the value of the index-th node in the linked list. If the index is invalid, return -1. + :type index: int + :rtype: int """ - if 0 <= index < self._count: - node = self._head - for _ in range(index + 1): - node = node.next - return node.val - else: + if index < 0 or index >= self.size: return -1 + cur = self.head.next + while(index): + cur = cur.next + index -= 1 + return cur.val - def addAtHead(self, val: int) -> None: + def addAtHead(self, val): """ - Add a node of value val before the first element of the linked list. After the insertion, the new node will be the first node of the linked list. + :type val: int + :rtype: None """ - self.addAtIndex(0, val) + new_node = Node(val) + new_node.next = self.head.next + self.head.next = new_node + self.size += 1 - def addAtTail(self, val: int) -> None: + def addAtTail(self, val): """ - Append a node of value val to the last element of the linked list. + :type val: int + :rtype: None """ - self.addAtIndex(self._count, val) + new_node = Node(val) + cur = self.head + while(cur.next): + cur = cur.next + cur.next = new_node + self.size += 1 - def addAtIndex(self, index: int, val: int) -> None: + def addAtIndex(self, index, val): """ - Add a node of value val before the index-th node in the linked list. If index equals to the length of linked list, the node will be appended to the end of linked list. If index is greater than the length, the node will not be inserted. + :type index: int + :type val: int + :rtype: None """ if index < 0: - index = 0 - elif index > self._count: + self.addAtHead(val) + return + elif index == self.size: + self.addAtTail(val) + return + elif index > self.size: return - # 计数累加 - self._count += 1 - - add_node = Node(val) - prev_node, current_node = None, self._head - for _ in range(index + 1): - prev_node, current_node = current_node, current_node.next - else: - prev_node.next, add_node.next = add_node, current_node - - def deleteAtIndex(self, index: int) -> None: + node = Node(val) + pre = self.head + while(index): + pre = pre.next + index -= 1 + node.next = pre.next + pre.next = node + self.size += 1 + + def deleteAtIndex(self, index): """ - Delete the index-th node in the linked list, if the index is valid. + :type index: int + :rtype: None """ - if 0 <= index < self._count: - # 计数-1 - self._count -= 1 - prev_node, current_node = None, self._head - for _ in range(index + 1): - prev_node, current_node = current_node, current_node.next - else: - prev_node.next, current_node.next = current_node.next, None - - + if index < 0 or index >= self.size: + return + pre = self.head + while(index): + pre = pre.next + index -= 1 + pre.next = pre.next.next + self.size -= 1 + # 双链表 # 相对于单链表, Node新增了prev属性 class Node: From d9950cee1bb10cb826cd1522a951cbf9ceccba81 Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Thu, 24 Nov 2022 00:15:31 +0800 Subject: [PATCH 1241/3019] =?UTF-8?q?update=20=20=E9=9D=A2=E8=AF=95?= =?UTF-8?q?=E9=A2=9802.07.=E9=93=BE=E8=A1=A8=E7=9B=B8=E4=BA=A4=20=20python?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=20js=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...76\350\241\250\347\233\270\344\272\244.md" | 55 +++++++++++-------- 1 file changed, 31 insertions(+), 24 deletions(-) diff --git "a/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" "b/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" index 3277e85ef4..30f5c467c4 100644 --- "a/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" +++ "b/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" @@ -155,23 +155,28 @@ public class Solution { class Solution: def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> ListNode: - """ - 根据快慢法则,走的快的一定会追上走得慢的。 - 在这道题里,有的链表短,他走完了就去走另一条链表,我们可以理解为走的快的指针。 - - 那么,只要其中一个链表走完了,就去走另一条链表的路。如果有交点,他们最终一定会在同一个 - 位置相遇 - """ - if headA is None or headB is None: - return None - cur_a, cur_b = headA, headB # 用两个指针代替a和b - - - while cur_a != cur_b: - cur_a = cur_a.next if cur_a else headB # 如果a走完了,那么就切换到b走 - cur_b = cur_b.next if cur_b else headA # 同理,b走完了就切换到a - - return cur_a + lenA, lenB = 0, 0 + cur = headA + while cur: # 求链表A的长度 + cur = cur.next + lenA += 1 + cur = headB + while cur: # 求链表B的长度 + cur = cur.next + lenB += 1 + curA, curB = headA, headB + if lenA > lenB: # 让curB为最长链表的头,lenB为其长度 + curA, curB = curB, curA + lenA, lenB = lenB, lenA + for _ in range(lenB - lenA): # 让curA和curB在同一起点上(末尾位置对齐) + curB = curB.next + while curA: # 遍历curA 和 curB,遇到相同则直接返回 + if curA == curB: + return curA + else: + curA = curA.next + curB = curB.next + return None ``` ### Go @@ -248,19 +253,21 @@ var getListLen = function(head) { } var getIntersectionNode = function(headA, headB) { let curA = headA,curB = headB, - lenA = getListLen(headA), - lenB = getListLen(headB); - if(lenA < lenB) { - // 下面交换变量注意加 “分号” ,两个数组交换变量在同一个作用域下时 + lenA = getListLen(headA), // 求链表A的长度 + lenB = getListLen(headB); + if(lenA < lenB) { // 让curA为最长链表的头,lenA为其长度 + + // 交换变量注意加 “分号” ,两个数组交换变量在同一个作用域下时 // 如果不加分号,下面两条代码等同于一条代码: [curA, curB] = [lenB, lenA] + [curA, curB] = [curB, curA]; [lenA, lenB] = [lenB, lenA]; } - let i = lenA - lenB; - while(i-- > 0) { + let i = lenA - lenB; // 求长度差 + while(i-- > 0) { // 让curA和curB在同一起点上(末尾位置对齐) curA = curA.next; } - while(curA && curA !== curB) { + while(curA && curA !== curB) { // 遍历curA 和 curB,遇到相同则直接返回 curA = curA.next; curB = curB.next; } From e86fea0ec398e8161149377a0fc5c5480ae680d0 Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Thu, 24 Nov 2022 21:07:05 +0800 Subject: [PATCH 1242/3019] =?UTF-8?q?update=200242.=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=8D=EF=BC=9A?= =?UTF-8?q?=E5=8A=A0java=E6=B3=A8=E9=87=8A=EF=BC=8C=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E8=B4=A8=E9=87=8F=E8=BE=83=E5=B7=AE=E4=B8=94=E5=A4=9A=E4=BD=99?= =?UTF-8?q?=E7=9A=84go=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...15\345\274\202\344\275\215\350\257\215.md" | 35 +++---------------- 1 file changed, 5 insertions(+), 30 deletions(-) diff --git "a/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" "b/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" index 1281b16b57..904a0527a2 100644 --- "a/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" +++ "b/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" @@ -101,7 +101,7 @@ class Solution { int[] record = new int[26]; for (int i = 0; i < s.length(); i++) { - record[s.charAt(i) - 'a']++; + record[s.charAt(i) - 'a']++; // 并不需要记住字符a的ASCII,只要求出一个相对数值就可以了 } for (int i = 0; i < t.length(); i++) { @@ -109,11 +109,11 @@ class Solution { } for (int count: record) { - if (count != 0) { + if (count != 0) { // record数组如果有的元素不为零0,说明字符串s和t 一定是谁多了字符或者谁少了字符。 return false; } } - return true; + return true; // record数组所有元素都为零0,说明字符串s和t是字母异位词 } } ``` @@ -166,35 +166,10 @@ class Solution(object): Go: -```go -func isAnagram(s string, t string) bool { - if len(s)!=len(t){ - return false - } - exists := make(map[byte]int) - for i:=0;i=0&&ok{ - exists[s[i]]=v+1 - }else{ - exists[s[i]]=1 - } - } - for i:=0;i=1&&ok{ - exists[t[i]]=v-1 - }else{ - return false - } - } - return true -} -``` - -Go写法二(没有使用slice作为哈希表,用数组来代替): - ```go func isAnagram(s string, t string) bool { record := [26]int{} + for _, r := range s { record[r-rune('a')]++ } @@ -202,7 +177,7 @@ func isAnagram(s string, t string) bool { record[r-rune('a')]-- } - return record == [26]int{} + return record == [26]int{} // record数组如果有的元素不为零0,说明字符串s和t 一定是谁多了字符或者谁少了字符。 } ``` From ac58e6613bd6a9d3e265e95e285c40b05bbc6f29 Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Thu, 24 Nov 2022 21:26:09 +0800 Subject: [PATCH 1243/3019] =?UTF-8?q?update=200349.=E4=B8=A4=E4=B8=AA?= =?UTF-8?q?=E6=95=B0=E7=BB=84=E7=9A=84=E4=BA=A4=E9=9B=86=20=E4=BF=AE?= =?UTF-8?q?=E6=94=B9python=E4=BB=A3=E7=A0=81=EF=BC=8C=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E5=86=97=E4=BD=99=E7=9A=84go=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...04\347\232\204\344\272\244\351\233\206.md" | 32 +++++++------------ 1 file changed, 12 insertions(+), 20 deletions(-) diff --git "a/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" "b/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" index bd83fae940..2e98ef6f22 100644 --- "a/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" +++ "b/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" @@ -147,32 +147,24 @@ Python3: ```python class Solution: def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]: - return list(set(nums1) & set(nums2)) # 两个数组先变成集合,求交集后还原为数组 + val_dict = {} + ans = [] + for num in nums1: + val_dict[num] = 1 + + for num in nums2: + if num in val_dict.keys() and val_dict[num] == 1: + ans.append(num) + val_dict[num] = 0 + + return ans ``` Go: ```go func intersection(nums1 []int, nums2 []int) []int { - m := make(map[int]int) - for _, v := range nums1 { - m[v] = 1 - } - var res []int - // 利用count>0,实现重复值只拿一次放入返回结果中 - for _, v := range nums2 { - if count, ok := m[v]; ok && count > 0 { - res = append(res, v) - m[v]-- - } - } - return res -} -``` -```golang -//优化版,利用set,减少count统计 -func intersection(nums1 []int, nums2 []int) []int { - set:=make(map[int]struct{},0) + set:=make(map[int]struct{},0) // 用map模拟set res:=make([]int,0) for _,v:=range nums1{ if _,ok:=set[v];!ok{ From 4796c816421924edff6bdc2521ae0880e2d80f39 Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Thu, 24 Nov 2022 21:35:53 +0800 Subject: [PATCH 1244/3019] =?UTF-8?q?update=200001.=E4=B8=A4=E6=95=B0?= =?UTF-8?q?=E4=B9=8B=E5=92=8C=EF=BC=9A=E5=8A=A0=E6=B3=A8=E9=87=8A=EF=BC=8C?= =?UTF-8?q?=E7=BB=99java=E4=BB=A3=E7=A0=81=E4=B8=80=E7=82=B9=E4=BC=98?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...0\244\346\225\260\344\271\213\345\222\214.md" | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git "a/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" "b/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" index 7bada9af85..56cff52779 100644 --- "a/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" @@ -134,12 +134,13 @@ public int[] twoSum(int[] nums, int target) { } Map map = new HashMap<>(); for(int i = 0; i < nums.length; i++){ - int temp = target - nums[i]; + int temp = target - nums[i]; // 遍历当前元素,并在map中寻找是否有匹配的key if(map.containsKey(temp)){ res[1] = i; res[0] = map.get(temp); + break; } - map.put(nums[i], i); + map.put(nums[i], i); // 如果没找到匹配对,就把访问过的元素和下标加入到map中 } return res; } @@ -152,16 +153,17 @@ class Solution: def twoSum(self, nums: List[int], target: int) -> List[int]: records = dict() - for index, value in enumerate(nums): - if target - value in records: + for index, value in enumerate(nums): + if target - value in records: # 遍历当前元素,并在map中寻找是否有匹配的key return [records[target- value], index] - records[value] = index + records[value] = index # 遍历当前元素,并在map中寻找是否有匹配的key return [] ``` Go: ```go +// 暴力解法 func twoSum(nums []int, target int) []int { for k1, _ := range nums { for k2 := k1 + 1; k2 < len(nums); k2++ { @@ -216,11 +218,11 @@ Javascript ```javascript var twoSum = function (nums, target) { let hash = {}; - for (let i = 0; i < nums.length; i++) { + for (let i = 0; i < nums.length; i++) { // 遍历当前元素,并在map中寻找是否有匹配的key if (hash[target - nums[i]] !== undefined) { return [i, hash[target - nums[i]]]; } - hash[nums[i]] = i; + hash[nums[i]] = i; // 如果没找到匹配对,就把访问过的元素和下标加入到map中 } return []; }; From b0f84a4b357f1413118536e55f6c37c460d32674 Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Thu, 24 Nov 2022 21:42:38 +0800 Subject: [PATCH 1245/3019] =?UTF-8?q?update=200454.=E5=9B=9B=E6=95=B0?= =?UTF-8?q?=E7=9B=B8=E5=8A=A0II=EF=BC=9A=E5=AE=8C=E5=96=84=E6=B3=A8?= =?UTF-8?q?=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...5\233\233\346\225\260\347\233\270\345\212\240II.md" | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git "a/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" "b/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" index d9fd5c04c0..07c3f71194 100644 --- "a/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" +++ "b/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" @@ -168,13 +168,15 @@ Go: ```go func fourSumCount(nums1 []int, nums2 []int, nums3 []int, nums4 []int) int { - m := make(map[int]int) + m := make(map[int]int) //key:a+b的数值,value:a+b数值出现的次数 count := 0 - for _, v1 := range nums1 { + // 遍历nums1和nums2数组,统计两个数组元素之和,和出现的次数,放到map中 + for _, v1 := range nums1 { for _, v2 := range nums2 { m[v1+v2]++ } } + // 遍历nums3和nums4数组,找到如果 0-(c+d) 在map中出现过的话,就把map中key对应的value也就是出现次数统计出来 for _, v3 := range nums3 { for _, v4 := range nums4 { count += m[-v3-v4] @@ -197,14 +199,14 @@ javaScript: var fourSumCount = function(nums1, nums2, nums3, nums4) { const twoSumMap = new Map(); let count = 0; - + // 统计nums1和nums2数组元素之和,和出现的次数,放到map中 for(const n1 of nums1) { for(const n2 of nums2) { const sum = n1 + n2; twoSumMap.set(sum, (twoSumMap.get(sum) || 0) + 1) } } - + // 找到如果 0-(c+d) 在map中出现过的话,就把map中key对应的value也就是出现次数统计出来 for(const n3 of nums3) { for(const n4 of nums4) { const sum = n3 + n4; From 983bb606d39c8ea5ab384d15d8c1bb226b65bce9 Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Thu, 24 Nov 2022 21:51:48 +0800 Subject: [PATCH 1246/3019] =?UTF-8?q?update=200383.=E8=B5=8E=E9=87=91?= =?UTF-8?q?=E4=BF=A1:=20=E5=AE=8C=E5=96=84=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...83.\350\265\216\351\207\221\344\277\241.md" | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git "a/problems/0383.\350\265\216\351\207\221\344\277\241.md" "b/problems/0383.\350\265\216\351\207\221\344\277\241.md" index 5745830808..4e6ba03369 100644 --- "a/problems/0383.\350\265\216\351\207\221\344\277\241.md" +++ "b/problems/0383.\350\265\216\351\207\221\344\277\241.md" @@ -147,11 +147,11 @@ class Solution: arr = [0] * 26 - for x in magazine: + for x in magazine: # 记录 magazine里各个字符出现次数 arr[ord(x) - ord('a')] += 1 - for x in ransomNote: - if arr[ord(x) - ord('a')] == 0: + for x in ransomNote: # 在arr里对应的字符个数做--操作 + if arr[ord(x) - ord('a')] == 0: # 如果没有出现过直接返回 return False else: arr[ord(x) - ord('a')] -= 1 @@ -234,12 +234,12 @@ Go: ```go func canConstruct(ransomNote string, magazine string) bool { record := make([]int, 26) - for _, v := range magazine { + for _, v := range magazine { // 通过recode数据记录 magazine里各个字符出现次数 record[v-'a']++ } - for _, v := range ransomNote { + for _, v := range ransomNote { // 遍历ransomNote,在record里对应的字符个数做--操作 record[v-'a']-- - if record[v-'a'] < 0 { + if record[v-'a'] < 0 { // 如果小于零说明ransomNote里出现的字符,magazine没有 return false } } @@ -258,12 +258,12 @@ javaScript: var canConstruct = function(ransomNote, magazine) { const strArr = new Array(26).fill(0), base = "a".charCodeAt(); - for(const s of magazine) { + for(const s of magazine) { // 记录 magazine里各个字符出现次数 strArr[s.charCodeAt() - base]++; } - for(const s of ransomNote) { + for(const s of ransomNote) { // 对应的字符个数做--操作 const index = s.charCodeAt() - base; - if(!strArr[index]) return false; + if(!strArr[index]) return false; // 如果没记录过直接返回false strArr[index]--; } return true; From dddbb95ea718c7dfd327b270b4686a745d1e848d Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Thu, 24 Nov 2022 22:05:59 +0800 Subject: [PATCH 1247/3019] =?UTF-8?q?update=200015.=E4=B8=89=E6=95=B0?= =?UTF-8?q?=E4=B9=8B=E5=92=8C=EF=BC=9A=E5=AE=8C=E5=96=84=E6=B3=A8=E9=87=8A?= =?UTF-8?q?=EF=BC=8C=E4=BC=98=E5=8C=96go=E4=BB=A3=E7=A0=81=E9=A3=8E?= =?UTF-8?q?=E6=A0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...11\346\225\260\344\271\213\345\222\214.md" | 56 +++++++++++-------- 1 file changed, 33 insertions(+), 23 deletions(-) diff --git "a/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" "b/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" index 5ee57127c6..6675e4088a 100644 --- "a/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" @@ -253,13 +253,15 @@ class Solution { public List> threeSum(int[] nums) { List> result = new ArrayList<>(); Arrays.sort(nums); - + // 找出a + b + c = 0 + // a = nums[i], b = nums[left], c = nums[right] for (int i = 0; i < nums.length; i++) { - if (nums[i] > 0) { + // 排序之后如果第一个元素已经大于零,那么无论如何组合都不可能凑成三元组,直接返回结果就可以了 + if (nums[i] > 0) { return result; } - if (i > 0 && nums[i] == nums[i - 1]) { + if (i > 0 && nums[i] == nums[i - 1]) { // 去重a continue; } @@ -273,7 +275,7 @@ class Solution { left++; } else { result.add(Arrays.asList(nums[i], nums[left], nums[right])); - + // 去重逻辑应该放在找到一个三元组之后,对b 和 c去重 while (right > left && nums[right] == nums[right - 1]) right--; while (right > left && nums[left] == nums[left + 1]) left++; @@ -294,12 +296,15 @@ class Solution: ans = [] n = len(nums) nums.sort() + # 找出a + b + c = 0 + # a = nums[i], b = nums[left], c = nums[right] for i in range(n): left = i + 1 right = n - 1 - if nums[i] > 0: + # 排序之后如果第一个元素已经大于零,那么无论如何组合都不可能凑成三元组,直接返回结果就可以了 + if nums[i] > 0: break - if i >= 1 and nums[i] == nums[i - 1]: + if i >= 1 and nums[i] == nums[i - 1]: # 去重a continue while left < right: total = nums[i] + nums[left] + nums[right] @@ -309,13 +314,14 @@ class Solution: left += 1 else: ans.append([nums[i], nums[left], nums[right]]) + # 去重逻辑应该放在找到一个三元组之后,对b 和 c去重 while left != right and nums[left] == nums[left + 1]: left += 1 while left != right and nums[right] == nums[right - 1]: right -= 1 left += 1 right -= 1 return ans ``` -Python (v2): +Python (v3): ```python class Solution: @@ -344,32 +350,36 @@ class Solution: Go: ```Go -func threeSum(nums []int)[][]int{ +func threeSum(nums []int) [][]int { sort.Ints(nums) - res:=[][]int{} - - for i:=0;i0{ + res := [][]int{} + // 找出a + b + c = 0 + // a = nums[i], b = nums[left], c = nums[right] + for i := 0; i < len(nums)-2; i++ { + // 排序之后如果第一个元素已经大于零,那么无论如何组合都不可能凑成三元组,直接返回结果就可以了 + n1 := nums[i] + if n1 > 0 { break } - if i>0&&n1==nums[i-1]{ + // 去重a + if i > 0 && n1 == nums[i-1] { continue } - l,r:=i+1,len(nums)-1 - for l Date: Thu, 24 Nov 2022 22:12:59 +0800 Subject: [PATCH 1248/3019] =?UTF-8?q?update=200018.=E5=9B=9B=E6=95=B0?= =?UTF-8?q?=E4=B9=8B=E5=92=8C=20=E5=AE=8C=E5=96=84=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...33\346\225\260\344\271\213\345\222\214.md" | 24 +++++++++++-------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git "a/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" "b/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" index ca33eb57c4..3fc80bba6c 100644 --- "a/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" @@ -136,25 +136,26 @@ class Solution { Arrays.sort(nums); for (int i = 0; i < nums.length; i++) { - + // nums[i] > target 直接返回, 剪枝操作 if (nums[i] > 0 && nums[i] > target) { return result; } - - if (i > 0 && nums[i - 1] == nums[i]) { + + if (i > 0 && nums[i - 1] == nums[i]) { // 对nums[i]去重 continue; } for (int j = i + 1; j < nums.length; j++) { - if (j > i + 1 && nums[j - 1] == nums[j]) { + if (j > i + 1 && nums[j - 1] == nums[j]) { // 对nums[j]去重 continue; } int left = j + 1; int right = nums.length - 1; while (right > left) { + // nums[k] + nums[i] + nums[left] + nums[right] > target int会溢出 long sum = (long) nums[i] + nums[j] + nums[left] + nums[right]; if (sum > target) { right--; @@ -162,7 +163,7 @@ class Solution { left++; } else { result.add(Arrays.asList(nums[i], nums[j], nums[left], nums[right])); - + // 对nums[left]和nums[right]去重 while (right > left && nums[right] == nums[right - 1]) right--; while (right > left && nums[left] == nums[left + 1]) left++; @@ -186,10 +187,10 @@ class Solution: nums.sort() n = len(nums) res = [] - for i in range(n): - if i > 0 and nums[i] == nums[i - 1]: continue + for i in range(n): + if i > 0 and nums[i] == nums[i - 1]: continue # 对nums[i]去重 for k in range(i+1, n): - if k > i + 1 and nums[k] == nums[k-1]: continue + if k > i + 1 and nums[k] == nums[k-1]: continue # 对nums[k]去重 p = k + 1 q = n - 1 @@ -198,6 +199,7 @@ class Solution: elif nums[i] + nums[k] + nums[p] + nums[q] < target: p += 1 else: res.append([nums[i], nums[k], nums[p], nums[q]]) + # 对nums[p]和nums[q]去重 while p < q and nums[p] == nums[p + 1]: p += 1 while p < q and nums[q] == nums[q - 1]: q -= 1 p += 1 @@ -258,12 +260,12 @@ func fourSum(nums []int, target int) [][]int { // if n1 > target { // 不能这样写,因为可能是负数 // break // } - if i > 0 && n1 == nums[i-1] { + if i > 0 && n1 == nums[i-1] { // 对nums[i]去重 continue } for j := i + 1; j < len(nums)-2; j++ { n2 := nums[j] - if j > i+1 && n2 == nums[j-1] { + if j > i+1 && n2 == nums[j-1] { // 对nums[j]去重 continue } l := j + 1 @@ -320,6 +322,8 @@ var fourSum = function(nums, target) { if(sum < target) { l++; continue} if(sum > target) { r--; continue} res.push([nums[i], nums[j], nums[l], nums[r]]); + + // 对nums[left]和nums[right]去重 while(l < r && nums[l] === nums[++l]); while(l < r && nums[r] === nums[--r]); } From a490c4b4fd7d3a2d22dfe2e20bb27dc55cd9d237 Mon Sep 17 00:00:00 2001 From: GitNaruto <19946254539@163.com> Date: Fri, 25 Nov 2022 15:00:03 +0800 Subject: [PATCH 1249/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A00051N=E7=9A=87?= =?UTF-8?q?=E5=90=8EJava=E7=89=88=E6=9C=AC(=E6=96=B9=E6=B3=952)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "problems/0051.N\347\232\207\345\220\216.md" | 50 ++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git "a/problems/0051.N\347\232\207\345\220\216.md" "b/problems/0051.N\347\232\207\345\220\216.md" index 83d0cd94bc..16fdf34787 100644 --- "a/problems/0051.N\347\232\207\345\220\216.md" +++ "b/problems/0051.N\347\232\207\345\220\216.md" @@ -291,6 +291,56 @@ class Solution { } ``` +```java +// 方法2:使用boolean数组表示已经占用的直(斜)线 +class Solution { + List> res = new ArrayList<>(); + boolean[] usedCol, usedDiag45, usedDiag135; // boolean数组中的每个元素代表一条直(斜)线 + public List> solveNQueens(int n) { + usedCol = new boolean[n]; // 列方向的直线条数为 n + usedDiag45 = new boolean[2 * n - 1]; // 45°方向的斜线条数为 2 * n - 1 + usedDiag135 = new boolean[2 * n - 1]; // 135°方向的斜线条数为 2 * n - 1 + //用于收集结果, 元素的index表示棋盘的row,元素的value代表棋盘的column + int[] board = new int[n]; + backTracking(board, n, 0); + return res; + } + private void backTracking(int[] board, int n, int row) { + if (row == n) { + //收集结果 + List temp = new ArrayList<>(); + for (int i : board) { + char[] str = new char[n]; + Arrays.fill(str, '.'); + str[i] = 'Q'; + temp.add(new String(str)); + } + res.add(temp); + return; + } + + for (int col = 0; col < n; col++) { + if (usedCol[col] | usedDiag45[row + col] | usedDiag135[row - col + n - 1]) { + continue; + } + board[row] = col; + // 标记该列出现过 + usedCol[col] = true; + // 同一45°斜线上元素的row + col为定值, 且各不相同 + usedDiag45[row + col] = true; + // 同一135°斜线上元素row - col为定值, 且各不相同 + // row - col 值有正有负, 加 n - 1 是为了对齐零点 + usedDiag135[row - col + n - 1] = true; + // 递归 + backTracking(board, n, row + 1); + usedCol[col] = false; + usedDiag45[row + col] = false; + usedDiag135[row - col + n - 1] = false; + } + } +} +``` + ### Python ```python From 45dad67adf152317ae97b9c50ea82fce4fe53c31 Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Fri, 25 Nov 2022 23:54:31 +0800 Subject: [PATCH 1250/3019] =?UTF-8?q?update=200344.=E5=8F=8D=E8=BD=AC?= =?UTF-8?q?=E5=AD=97=E7=AC=A6=E4=B8=B2=20=E4=BC=98=E5=8C=96go=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...350\275\254\345\255\227\347\254\246\344\270\262.md" | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git "a/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" "b/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" index 2807d04a58..c4803311d3 100644 --- "a/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" @@ -190,11 +190,11 @@ class Solution: Go: ```Go -func reverseString(s []byte) { - left:=0 - right:=len(s)-1 - for left Date: Sat, 26 Nov 2022 00:07:59 +0800 Subject: [PATCH 1251/3019] =?UTF-8?q?update=200541.=E5=8F=8D=E8=BD=AC?= =?UTF-8?q?=E5=AD=97=E7=AC=A6=E4=B8=B2II=EF=BC=9A=E8=A1=A5=E5=85=85?= =?UTF-8?q?=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git "a/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" "b/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" index 598913654e..516f78da3c 100644 --- "a/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" +++ "b/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" @@ -294,6 +294,8 @@ func reverseStr(s string, k int) string { ss := []byte(s) length := len(s) for i := 0; i < length; i += 2 * k { + // 1. 每隔 2k 个字符的前 k 个字符进行反转 + // 2. 剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符 if i + k <= length { reverse(ss[i:i+k]) } else { @@ -326,7 +328,7 @@ javaScript: var reverseStr = function(s, k) { const len = s.length; let resArr = s.split(""); - for(let i = 0; i < len; i += 2 * k) { + for(let i = 0; i < len; i += 2 * k) { // 每隔 2k 个字符的前 k 个字符进行反转 let l = i - 1, r = i + k > len ? len : i + k; while(++l < --r) [resArr[l], resArr[r]] = [resArr[r], resArr[l]]; } From fc4dec09d3d3aad240f23d360e7f8ee075eb7d67 Mon Sep 17 00:00:00 2001 From: fw_qaq <82551626+Jack-Zhang-1314@users.noreply.github.com> Date: Sat, 26 Nov 2022 01:51:11 +0800 Subject: [PATCH 1252/3019] =?UTF-8?q?Update=200654.=E6=9C=80=E5=A4=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 --- ...47\344\272\214\345\217\211\346\240\221.md" | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git "a/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" "b/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" index 667610d8d8..f183721675 100644 --- "a/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" @@ -511,6 +511,35 @@ object Solution { ### Rust +新建数组: + +```rust +use std::cell::RefCell; +use std::rc::Rc; +impl Solution{ + pub fn construct_maximum_binary_tree(mut nums: Vec) -> Option>> { + if nums.is_empty() { + return None; + } + let mut max_value_index = 0; + for i in 0..nums.len() { + if nums[max_value_index] < nums[i] { + max_value_index = i; + } + } + let right = Self::construct_maximum_binary_tree(nums.split_off(max_value_index + 1)); + let root = nums.pop().unwrap(); + let left = Self::construct_maximum_binary_tree(nums); + Some(Rc::new(RefCell::new(TreeNode { + val: root, + left, + right, + }))) + } +} +``` + +数组索引: ```rust use std::cell::RefCell; use std::rc::Rc; From ff0ce29232e205f737ea4236ff7be845985b1a18 Mon Sep 17 00:00:00 2001 From: WayV5 <115171820+WayV5@users.noreply.github.com> Date: Sat, 26 Nov 2022 15:13:59 +0800 Subject: [PATCH 1253/3019] Create fd --- fd | 1 + 1 file changed, 1 insertion(+) create mode 100644 fd diff --git a/fd b/fd new file mode 100644 index 0000000000..8713cfa778 --- /dev/null +++ b/fd @@ -0,0 +1 @@ +fdfdfd From 3b3ed756664435b73fceb20a971fa8ef03d608f8 Mon Sep 17 00:00:00 2001 From: fw_qaq <82551626+Jack-Zhang-1314@users.noreply.github.com> Date: Sat, 26 Nov 2022 15:16:06 +0800 Subject: [PATCH 1254/3019] =?UTF-8?q?Update=200617.=E5=90=88=E5=B9=B6?= =?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 --- ...66\344\272\214\345\217\211\346\240\221.md" | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git "a/problems/0617.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md" "b/problems/0617.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md" index db2d3762f1..f0ecf79be5 100644 --- "a/problems/0617.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0617.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md" @@ -691,6 +691,35 @@ object Solution { } ``` +### rust + +递归: + +```rust +use std::cell::RefCell; +use std::rc::Rc; +impl Solution { + pub fn merge_trees( + root1: Option>>, + root2: Option>>, + ) -> Option>> { + if root1.is_none() { + return root2; + } + if root2.is_none() { + return root1; + } + let binding = root1.clone(); + let mut node1 = binding.as_ref().unwrap().borrow_mut(); + let node2 = root2.as_ref().unwrap().borrow_mut(); + node1.left = Self::merge_trees(node1.left.clone(), node2.left.clone()); + node1.right = Self::merge_trees(node1.right.clone(), node2.right.clone()); + node1.val += node2.val; + + root1 + } +} +```

From 22cea2090fc7046c46e461a6da285b4ff3bfcaa8 Mon Sep 17 00:00:00 2001 From: GitNaruto <19946254539@163.com> Date: Sat, 26 Nov 2022 15:17:01 +0800 Subject: [PATCH 1255/3019] haha --- fd | 1 - ...273\272 \346\226\207\346\234\254\346\226\207\346\241\243.txt" | 0 2 files changed, 1 deletion(-) delete mode 100644 fd create mode 100644 "\346\226\260\345\273\272 \346\226\207\346\234\254\346\226\207\346\241\243.txt" diff --git a/fd b/fd deleted file mode 100644 index 8713cfa778..0000000000 --- a/fd +++ /dev/null @@ -1 +0,0 @@ -fdfdfd diff --git "a/\346\226\260\345\273\272 \346\226\207\346\234\254\346\226\207\346\241\243.txt" "b/\346\226\260\345\273\272 \346\226\207\346\234\254\346\226\207\346\241\243.txt" new file mode 100644 index 0000000000..e69de29bb2 From 61a6112297cd10647d577ff1e82539a3175eb6b7 Mon Sep 17 00:00:00 2001 From: GitNaruto <19946254539@163.com> Date: Sat, 26 Nov 2022 15:18:49 +0800 Subject: [PATCH 1256/3019] =?UTF-8?q?=E2=80=9C=E5=8F=8D=E5=AF=B9=E5=8F=8D?= =?UTF-8?q?=E5=AF=B9=E5=8F=8D=E5=AF=B9=E2=80=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- fd | 1 + 1 file changed, 1 insertion(+) create mode 100644 fd diff --git a/fd b/fd new file mode 100644 index 0000000000..8713cfa778 --- /dev/null +++ b/fd @@ -0,0 +1 @@ +fdfdfd From ade863f9c2d6fa9cc3a20f2b2f3636dd0079982c Mon Sep 17 00:00:00 2001 From: GitNaruto <19946254539@163.com> Date: Sat, 26 Nov 2022 15:22:43 +0800 Subject: [PATCH 1257/3019] =?UTF-8?q?=E2=80=9Cok=E2=80=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- fd | 1 - ...273\272 \346\226\207\346\234\254\346\226\207\346\241\243.txt" | 0 2 files changed, 1 deletion(-) delete mode 100644 fd delete mode 100644 "\346\226\260\345\273\272 \346\226\207\346\234\254\346\226\207\346\241\243.txt" diff --git a/fd b/fd deleted file mode 100644 index 8713cfa778..0000000000 --- a/fd +++ /dev/null @@ -1 +0,0 @@ -fdfdfd diff --git "a/\346\226\260\345\273\272 \346\226\207\346\234\254\346\226\207\346\241\243.txt" "b/\346\226\260\345\273\272 \346\226\207\346\234\254\346\226\207\346\241\243.txt" deleted file mode 100644 index e69de29bb2..0000000000 From 4f874ea20735d21f4c3aa517373d73fb66ab5c33 Mon Sep 17 00:00:00 2001 From: GitNaruto <19946254539@163.com> Date: Sat, 26 Nov 2022 15:28:36 +0800 Subject: [PATCH 1258/3019] =?UTF-8?q?=E5=8F=91=E7=9A=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 1.txt | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 1.txt diff --git a/1.txt b/1.txt new file mode 100644 index 0000000000..e69de29bb2 From abfce6875ed8693df6c1d6b83aef35261da12556 Mon Sep 17 00:00:00 2001 From: GitNaruto <19946254539@163.com> Date: Sat, 26 Nov 2022 15:31:47 +0800 Subject: [PATCH 1259/3019] fd --- 1.txt => 2.txt | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename 1.txt => 2.txt (100%) diff --git a/1.txt b/2.txt similarity index 100% rename from 1.txt rename to 2.txt From ae99d647ac6f662a9a97340511c07e541c2f257a Mon Sep 17 00:00:00 2001 From: fw_qaq <82551626+Jack-Zhang-1314@users.noreply.github.com> Date: Sat, 26 Nov 2022 16:41:16 +0800 Subject: [PATCH 1260/3019] =?UTF-8?q?Update=200617.=E5=90=88=E5=B9=B6?= =?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 --- ...66\344\272\214\345\217\211\346\240\221.md" | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git "a/problems/0617.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md" "b/problems/0617.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md" index f0ecf79be5..9fe457c634 100644 --- "a/problems/0617.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0617.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md" @@ -721,6 +721,49 @@ impl Solution { } ``` +迭代: + +```rust +impl Solution { + pub fn merge_trees( + root1: Option>>, + root2: Option>>, + ) -> Option>> { + if root1.is_none() { + return root2; + } + if root2.is_none() { + return root1; + } + let mut stack = vec![]; + stack.push(root2); + stack.push(root1.clone()); + while !stack.is_empty() { + let node1 = stack.pop().unwrap().unwrap(); + let node2 = stack.pop().unwrap().unwrap(); + let mut node1 = node1.borrow_mut(); + let node2 = node2.borrow(); + node1.val += node2.val; + if node1.left.is_some() && node2.left.is_some() { + stack.push(node2.left.clone()); + stack.push(node1.left.clone()); + } + if node1.right.is_some() && node2.right.is_some() { + stack.push(node2.right.clone()); + stack.push(node1.right.clone()); + } + if node1.left.is_none() && node2.left.is_some() { + node1.left = node2.left.clone(); + } + if node1.right.is_none() && node2.right.is_some() { + node1.right = node2.right.clone(); + } + } + root1 + } +} +``` +

From e7c9a43b41af1eddb9594527bad8b7d8546eae81 Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Sat, 26 Nov 2022 17:28:34 +0800 Subject: [PATCH 1261/3019] =?UTF-8?q?update=20=E5=89=91=E6=8C=87Offer05.?= =?UTF-8?q?=E6=9B=BF=E6=8D=A2=E7=A9=BA=E6=A0=BC:=20=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E7=97=85=E5=8F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" "b/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" index 53f0315ff8..ab6eedf7cf 100644 --- "a/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" +++ "b/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" @@ -36,7 +36,7 @@ i指向新长度的末尾,j指向旧长度的末尾。 这么做有两个好处: 1. 不用申请新数组。 -2. 从后向前填充元素,避免了从前先后填充元素要来的 每次添加元素都要将添加元素之后的所有元素向后移动。 +2. 从后向前填充元素,避免了从前向后填充元素时,每次添加元素都要将添加元素之后的所有元素向后移动的问题。 时间复杂度,空间复杂度均超过100%的用户。 From 29624142179dd8f403753ede58ebcc6705684eb7 Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Sat, 26 Nov 2022 17:42:51 +0800 Subject: [PATCH 1262/3019] =?UTF-8?q?update=200151.=E7=BF=BB=E8=BD=AC?= =?UTF-8?q?=E5=AD=97=E7=AC=A6=E4=B8=B2=E9=87=8C=E7=9A=84=E5=8D=95=E8=AF=8D?= =?UTF-8?q?:=20=E4=BF=AE=E6=94=B9=E9=94=99=E5=AD=97=EF=BC=8C=E4=BC=98?= =?UTF-8?q?=E5=8C=96python=E4=BB=A3=E7=A0=81=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...14\347\232\204\345\215\225\350\257\215.md" | 74 ++++++++++--------- 1 file changed, 38 insertions(+), 36 deletions(-) diff --git "a/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" "b/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" index 450d7258f4..b82204fa75 100644 --- "a/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" +++ "b/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" @@ -119,7 +119,7 @@ void removeExtraSpaces(string& s) { 1. leetcode上的测试集里,字符串的长度不够长,如果足够长,性能差距会非常明显。 2. leetcode的测程序耗时不是很准确的。 -版本一的代码是比较如何一般思考过程,就是 先移除字符串钱的空格,在移除中间的,在移除后面部分。 +版本一的代码是一般的思考过程,就是 先移除字符串前的空格,再移除中间的,再移除后面部分。 不过其实还可以优化,这部分和[27.移除元素](https://programmercarl.com/0027.移除元素.html)的逻辑是一样一样的,本题是移除空格,而 27.移除元素 就是移除元素。 @@ -145,7 +145,7 @@ void removeExtraSpaces(string& s) {//去除所有空格并在相邻单词之间 此时我们已经实现了removeExtraSpaces函数来移除冗余空格。 -还做实现反转字符串的功能,支持反转字符串子区间,这个实现我们分别在[344.反转字符串](https://programmercarl.com/0344.反转字符串.html)和[541.反转字符串II](https://programmercarl.com/0541.反转字符串II.html)里已经讲过了。 +还要实现反转字符串的功能,支持反转字符串子区间,这个实现我们分别在[344.反转字符串](https://programmercarl.com/0344.反转字符串.html)和[541.反转字符串II](https://programmercarl.com/0541.反转字符串II.html)里已经讲过了。 代码如下: @@ -434,49 +434,51 @@ python: ```Python class Solution: #1.去除多余的空格 - def trim_spaces(self,s): - n=len(s) - left=0 - right=n-1 + def trim_spaces(self, s): + n = len(s) + left = 0 + right = n-1 - while left<=right and s[left]==' ': #去除开头的空格 - left+=1 - while left<=right and s[right]==' ': #去除结尾的空格 - right=right-1 - tmp=[] - while left<=right: #去除单词中间多余的空格 - if s[left]!=' ': + while left <= right and s[left] == ' ': #去除开头的空格 + left += 1 + while left <= right and s[right] == ' ': #去除结尾的空格 + right = right-1 + tmp = [] + while left <= right: #去除单词中间多余的空格 + if s[left] != ' ': tmp.append(s[left]) - elif tmp[-1]!=' ': #当前位置是空格,但是相邻的上一个位置不是空格,则该空格是合理的 + elif tmp[-1] != ' ': #当前位置是空格,但是相邻的上一个位置不是空格,则该空格是合理的 tmp.append(s[left]) - left+=1 + left += 1 return tmp -#2.翻转字符数组 - def reverse_string(self,nums,left,right): - while left Date: Sat, 26 Nov 2022 17:50:07 +0800 Subject: [PATCH 1263/3019] =?UTF-8?q?update=20=E5=89=91=E6=8C=87Offer58-II?= =?UTF-8?q?.=E5=B7=A6=E6=97=8B=E8=BD=AC=E5=AD=97=E7=AC=A6=E4=B8=B2?= =?UTF-8?q?=EF=BC=9A=E4=BF=AE=E6=94=B9=E9=94=99=E5=AD=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\213\350\275\254\345\255\227\347\254\246\344\270\262.md" | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git "a/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" "b/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" index c34b2a7183..1b619ffbbd 100644 --- "a/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" @@ -31,7 +31,7 @@ 不能使用额外空间的话,模拟在本串操作要实现左旋转字符串的功能还是有点困难的。 -那么我们可以想一下上一题目[字符串:花式反转还不够!](https://programmercarl.com/0151.翻转字符串里的单词.html)中讲过,使用整体反转+局部反转就可以实现,反转单词顺序的目的。 +那么我们可以想一下上一题目[字符串:花式反转还不够!](https://programmercarl.com/0151.翻转字符串里的单词.html)中讲过,使用整体反转+局部反转就可以实现反转单词顺序的目的。 这道题目也非常类似,依然可以通过局部反转+整体反转 达到左旋转的目的。 @@ -41,7 +41,7 @@ 2. 反转区间为n到末尾的子串 3. 反转整个字符串 -最后就可以得到左旋n的目的,而不用定义新的字符串,完全在本串上操作。 +最后就可以达到左旋n的目的,而不用定义新的字符串,完全在本串上操作。 例如 :示例1中 输入:字符串abcdefg,n=2 @@ -75,7 +75,7 @@ public: 在这篇文章[344.反转字符串](https://programmercarl.com/0344.反转字符串.html),第一次讲到反转一个字符串应该怎么做,使用了双指针法。 -然后发现[541. 反转字符串II](https://programmercarl.com/0541.反转字符串II.html),这里开始给反转加上了一些条件,当需要固定规律一段一段去处理字符串的时候,要想想在在for循环的表达式上做做文章。 +然后发现[541. 反转字符串II](https://programmercarl.com/0541.反转字符串II.html),这里开始给反转加上了一些条件,当需要固定规律一段一段去处理字符串的时候,要想想在for循环的表达式上做做文章。 后来在[151.翻转字符串里的单词](https://programmercarl.com/0151.翻转字符串里的单词.html)中,要对一句话里的单词顺序进行反转,发现先整体反转再局部反转 是一个很妙的思路。 From 5c4b8b3d8140ecc67f917f49899d77ee49f9b83d Mon Sep 17 00:00:00 2001 From: fw_qaq <82551626+Jack-Zhang-1314@users.noreply.github.com> Date: Sat, 26 Nov 2022 18:07:46 +0800 Subject: [PATCH 1264/3019] =?UTF-8?q?Update=200700.=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=90=9C=E7=B4=A2?= =?UTF-8?q?.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...55\347\232\204\346\220\234\347\264\242.md" | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git "a/problems/0700.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\220\234\347\264\242.md" "b/problems/0700.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\220\234\347\264\242.md" index 2ee2bdb0e3..a0143bd8c9 100644 --- "a/problems/0700.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\220\234\347\264\242.md" +++ "b/problems/0700.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\220\234\347\264\242.md" @@ -414,6 +414,33 @@ object Solution { } ``` +### rust + +递归: + +```rust +use std::cell::RefCell; +use std::rc::Rc; +impl Solution { + pub fn search_bst( + root: Option>>, + val: i32, + ) -> Option>> { + if root.is_none() || root.as_ref().unwrap().borrow().val == val { + return root; + } + let node_val = root.as_ref().unwrap().borrow().val; + if node_val > val { + return Self::search_bst(root.as_ref().unwrap().borrow().left.clone(), val); + } + if node_val < val { + return Self::search_bst(root.unwrap().borrow().right.clone(), val); + } + None + } +} +``` +

From 4be111b3d170b7f3ff5888d0cb343368818e4fd2 Mon Sep 17 00:00:00 2001 From: fw_qaq <82551626+Jack-Zhang-1314@users.noreply.github.com> Date: Sat, 26 Nov 2022 18:25:55 +0800 Subject: [PATCH 1265/3019] =?UTF-8?q?Update=200700.=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=90=9C=E7=B4=A2?= =?UTF-8?q?.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...55\347\232\204\346\220\234\347\264\242.md" | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git "a/problems/0700.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\220\234\347\264\242.md" "b/problems/0700.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\220\234\347\264\242.md" index a0143bd8c9..c09f11b9d5 100644 --- "a/problems/0700.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\220\234\347\264\242.md" +++ "b/problems/0700.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\220\234\347\264\242.md" @@ -441,6 +441,29 @@ impl Solution { } ``` +迭代: + +```rust +use std::cell::RefCell; +use std::rc::Rc; +use std::cmp; +impl Solution { + pub fn search_bst( + mut root: Option>>, + val: i32, + ) -> Option>> { + while let Some(ref node) = root.clone() { + match val.cmp(&node.borrow().val) { + cmp::Ordering::Less => root = node.borrow().left.clone(), + cmp::Ordering::Equal => return root, + cmp::Ordering::Greater => root = node.borrow().right.clone(), + }; + } + None + } +} +``` +

From 72bc4c40b2b8d4d47276a74f54f48ae58f925db5 Mon Sep 17 00:00:00 2001 From: GitNaruto <19946254539@163.com> Date: Sat, 26 Nov 2022 19:43:43 +0800 Subject: [PATCH 1266/3019] update --- 2.txt | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 2.txt diff --git a/2.txt b/2.txt deleted file mode 100644 index e69de29bb2..0000000000 From 4594221520698dd823f65481e286d4a9b228fe99 Mon Sep 17 00:00:00 2001 From: GitNaruto <19946254539@163.com> Date: Sat, 26 Nov 2022 19:47:37 +0800 Subject: [PATCH 1267/3019] =?UTF-8?q?=E4=BF=AE=E6=94=B9=200037.=E8=A7=A3?= =?UTF-8?q?=E6=95=B0=E7=8B=AC.md=20=E9=94=99=E5=88=AB=E5=AD=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "problems/0037.\350\247\243\346\225\260\347\213\254.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0037.\350\247\243\346\225\260\347\213\254.md" "b/problems/0037.\350\247\243\346\225\260\347\213\254.md" index fc1e3114d3..a476af9b2c 100644 --- "a/problems/0037.\350\247\243\346\225\260\347\213\254.md" +++ "b/problems/0037.\350\247\243\346\225\260\347\213\254.md" @@ -44,7 +44,7 @@ [N皇后问题](https://programmercarl.com/0051.N皇后.html)是因为每一行每一列只放一个皇后,只需要一层for循环遍历一行,递归来来遍历列,然后一行一列确定皇后的唯一位置。 -本题就不一样了,**本题中棋盘的每一个位置都要放一个数字(而N换后是一行只放一个皇后),并检查数字是否合法,解数独的树形结构要比N皇后更宽更深**。 +本题就不一样了,**本题中棋盘的每一个位置都要放一个数字(而N皇后是一行只放一个皇后),并检查数字是否合法,解数独的树形结构要比N皇后更宽更深**。 因为这个树形结构太大了,我抽取一部分,如图所示: From 067c25f616e8bbc8e0e122a9c2aca50b208ece9a Mon Sep 17 00:00:00 2001 From: FlySmile <870467813@qq.com> Date: Sat, 26 Nov 2022 19:57:55 +0800 Subject: [PATCH 1268/3019] =?UTF-8?q?Update=200232.=E7=94=A8=E6=A0=88?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E9=98=9F=E5=88=97.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit about go版本 --- ...36\347\216\260\351\230\237\345\210\227.md" | 65 +++++++++---------- 1 file changed, 30 insertions(+), 35 deletions(-) diff --git "a/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" "b/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" index 5858f9e0e4..1f7d236d8a 100644 --- "a/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" +++ "b/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" @@ -231,56 +231,51 @@ class MyQueue: Go: ```Go type MyQueue struct { - stack []int - back []int + stackIn []int //输入栈 + stackOut []int //输出栈 } -/** Initialize your data structure here. */ func Constructor() MyQueue { - return MyQueue{ - stack: make([]int, 0), - back: make([]int, 0), - } + return MyQueue{ + stackIn: make([]int, 0), + stackOut: make([]int, 0), + } } -/** Push element x to the back of queue. */ +// 往输入栈做push func (this *MyQueue) Push(x int) { - for len(this.back) != 0 { - val := this.back[len(this.back)-1] - this.back = this.back[:len(this.back)-1] - this.stack = append(this.stack, val) - } - this.stack = append(this.stack, x) + this.stackIn = append(this.stackIn, x) } -/** Removes the element from in front of queue and returns that element. */ +// 在输出栈做pop,pop时如果输出栈数据为空,需要将输入栈全部数据导入,如果非空,则可直接使用 func (this *MyQueue) Pop() int { - for len(this.stack) != 0 { - val := this.stack[len(this.stack)-1] - this.stack = this.stack[:len(this.stack)-1] - this.back = append(this.back, val) - } - if len(this.back) == 0 { - return 0 - } - val := this.back[len(this.back)-1] - this.back = this.back[:len(this.back)-1] - return val + inLen, outLen := len(this.stackIn), len(this.stackOut) + if outLen == 0 { + if inLen == 0 { + return -1 + } + for i := inLen - 1; i >= 0; i-- { + this.stackOut = append(this.stackOut, this.stackIn[i]) + } + this.stackIn = []int{} //导出后清空 + outLen = len(this.stackOut) //更新长度值 + } + val := this.stackOut[outLen-1] + this.stackOut = this.stackOut[:outLen-1] + return val } -/** Get the front element. */ func (this *MyQueue) Peek() int { - val := this.Pop() - if val == 0 { - return 0 - } - this.back = append(this.back, val) - return val + val := this.Pop() + if val == -1 { + return -1 + } + this.stackOut = append(this.stackOut, val) + return val } -/** Returns whether the queue is empty. */ func (this *MyQueue) Empty() bool { - return len(this.stack) == 0 && len(this.back) == 0 + return len(this.stackIn) == 0 && len(this.stackOut) == 0 } ``` From b486f8dc20899486331385df08d9e9e0db41d906 Mon Sep 17 00:00:00 2001 From: FlySmile <870467813@qq.com> Date: Sat, 26 Nov 2022 20:01:38 +0800 Subject: [PATCH 1269/3019] =?UTF-8?q?Update=200232.=E7=94=A8=E6=A0=88?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E9=98=9F=E5=88=97.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit about go版本 --- ...36\347\216\260\351\230\237\345\210\227.md" | 56 +++++++++---------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git "a/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" "b/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" index 1f7d236d8a..d2211d11d3 100644 --- "a/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" +++ "b/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" @@ -231,51 +231,51 @@ class MyQueue: Go: ```Go type MyQueue struct { - stackIn []int //输入栈 - stackOut []int //输出栈 + stackIn []int //输入栈 + stackOut []int //输出栈 } func Constructor() MyQueue { - return MyQueue{ - stackIn: make([]int, 0), - stackOut: make([]int, 0), - } + return MyQueue{ + stackIn: make([]int, 0), + stackOut: make([]int, 0), + } } // 往输入栈做push func (this *MyQueue) Push(x int) { - this.stackIn = append(this.stackIn, x) + this.stackIn = append(this.stackIn, x) } // 在输出栈做pop,pop时如果输出栈数据为空,需要将输入栈全部数据导入,如果非空,则可直接使用 func (this *MyQueue) Pop() int { - inLen, outLen := len(this.stackIn), len(this.stackOut) - if outLen == 0 { - if inLen == 0 { - return -1 - } - for i := inLen - 1; i >= 0; i-- { - this.stackOut = append(this.stackOut, this.stackIn[i]) - } - this.stackIn = []int{} //导出后清空 - outLen = len(this.stackOut) //更新长度值 - } - val := this.stackOut[outLen-1] - this.stackOut = this.stackOut[:outLen-1] - return val + inLen, outLen := len(this.stackIn), len(this.stackOut) + if outLen == 0 { + if inLen == 0 { + return -1 + } + for i := inLen - 1; i >= 0; i-- { + this.stackOut = append(this.stackOut, this.stackIn[i]) + } + this.stackIn = []int{} //导出后清空 + outLen = len(this.stackOut) //更新长度值 + } + val := this.stackOut[outLen-1] + this.stackOut = this.stackOut[:outLen-1] + return val } func (this *MyQueue) Peek() int { - val := this.Pop() - if val == -1 { - return -1 - } - this.stackOut = append(this.stackOut, val) - return val + val := this.Pop() + if val == -1 { + return -1 + } + this.stackOut = append(this.stackOut, val) + return val } func (this *MyQueue) Empty() bool { - return len(this.stackIn) == 0 && len(this.stackOut) == 0 + return len(this.stackIn) == 0 && len(this.stackOut) == 0 } ``` From 61ea7a5b0c84635251b472f9bcde40a4ad8f1921 Mon Sep 17 00:00:00 2001 From: GitNaruto <19946254539@163.com> Date: Sat, 26 Nov 2022 20:12:39 +0800 Subject: [PATCH 1270/3019] update --- ...d 72bc4c40b2b8d4d47276a74f54f48ae58f925db5 | 250 ++++++++++++++++++ 1 file changed, 250 insertions(+) create mode 100644 et --hard 72bc4c40b2b8d4d47276a74f54f48ae58f925db5 diff --git a/et --hard 72bc4c40b2b8d4d47276a74f54f48ae58f925db5 b/et --hard 72bc4c40b2b8d4d47276a74f54f48ae58f925db5 new file mode 100644 index 0000000000..8f9dd9a028 --- /dev/null +++ b/et --hard 72bc4c40b2b8d4d47276a74f54f48ae58f925db5 @@ -0,0 +1,250 @@ +commit 4594221520698dd823f65481e286d4a9b228fe99 (HEAD -> master, origin/master, origin/HEAD) +Author: GitNaruto <19946254539@163.com> +Date: Sat Nov 26 19:47:37 2022 +0800 + + 修改 0037.解数独.md 错别字 + +commit 72bc4c40b2b8d4d47276a74f54f48ae58f925db5 +Author: GitNaruto <19946254539@163.com> +Date: Sat Nov 26 19:43:43 2022 +0800 + + update + +commit 65ff7ea4c8c5aef9d5c7b3070a66d1786aa2c2fb +Merge: abfce687 111016ae +Author: WayV5 <115171820+WayV5@users.noreply.github.com> +Date: Sat Nov 26 19:41:58 2022 +0800 + + Merge branch 'youngyangyang04:master' into master + +commit abfce6875ed8693df6c1d6b83aef35261da12556 +Author: GitNaruto <19946254539@163.com> +Date: Sat Nov 26 15:31:47 2022 +0800 + + fd + +commit 4f874ea20735d21f4c3aa517373d73fb66ab5c33 +Author: GitNaruto <19946254539@163.com> +Date: Sat Nov 26 15:28:36 2022 +0800 + + 发的 + +commit ade863f9c2d6fa9cc3a20f2b2f3636dd0079982c +Author: GitNaruto <19946254539@163.com> +Date: Sat Nov 26 15:22:43 2022 +0800 + + “ok” + +commit 61a6112297cd10647d577ff1e82539a3175eb6b7 +Author: GitNaruto <19946254539@163.com> +Date: Sat Nov 26 15:18:49 2022 +0800 + + “反对反对反对” + +commit 22cea2090fc7046c46e461a6da285b4ff3bfcaa8 +Author: GitNaruto <19946254539@163.com> +Date: Sat Nov 26 15:17:01 2022 +0800 + + haha + +commit ff0ce29232e205f737ea4236ff7be845985b1a18 +Author: WayV5 <115171820+WayV5@users.noreply.github.com> +Date: Sat Nov 26 15:13:59 2022 +0800 + + Create fd + +commit 111016aef93e18473a89585567c20eb5fff18ed0 +Merge: 97a24abe 875680c4 +Author: 程序员Carl +Date: Sat Nov 26 10:20:17 2022 +0800 + + Merge pull request #1754 from Jack-Zhang-1314/patch-15 + + Update 0104.二叉树的最大深度.md about rust + +commit 97a24abeb2a9f9949f5fecac8dfcd28e3421da63 +Merge: 73d55b1f 30a7d366 +Author: 程序员Carl +Date: Sat Nov 26 10:18:45 2022 +0800 + + Merge pull request #1753 from Jack-Zhang-1314/patch-12 + + Update 0101.对称二叉树.md about rust + +commit 73d55b1f5efce71762010c11b8518be7b79e3356 +Merge: 0330e486 9d087231 +Author: 程序员Carl +Date: Fri Nov 25 15:30:25 2022 +0800 + + Merge pull request #1752 from Jack-Zhang-1314/patch-11 + + Update 0226.翻转二叉树.md about rust + +commit 0330e4866d7c98958ac2aeb1747bd2ff8b90b4c6 +Merge: 35fbcb32 c1cac2c9 +Author: 程序员Carl +Date: Fri Nov 25 15:29:56 2022 +0800 + + Merge pull request #1751 from LookSin/my-commit + + 反转字符串Java其他解法 + +commit 35fbcb328a1df64d9e165dc97ce7c00b642d530f +Merge: c434e343 1afff796 +Author: 程序员Carl +Date: Fri Nov 25 15:27:26 2022 +0800 + + Merge pull request #1776 from juguagua/leetcode-modify-the-code-of-the-hash + + 修改完善哈希表部分代码和注释 + +commit a490c4b4fd7d3a2d22dfe2e20bb27dc55cd9d237 +Author: GitNaruto <19946254539@163.com> +Date: Fri Nov 25 15:00:03 2022 +0800 + + 添加0051N皇后Java版本(方法2) + +commit 1afff796691baa7424110fa326bc80fae5991364 +Merge: c1f1c1c4 c434e343 +Author: Yuhao Ju +Date: Thu Nov 24 22:14:50 2022 +0800 + + Merge branch 'youngyangyang04:master' into leetcode-modify-the-code-of-the-hash + +commit c1f1c1c42fbd24c1e1edeb8a27cd4ac6211b32d3 +Author: Yuhao Ju +Date: Thu Nov 24 22:12:59 2022 +0800 + + update 0018.四数之和 完善注释 + +commit dddbb95ea718c7dfd327b270b4686a745d1e848d +Author: Yuhao Ju +Date: Thu Nov 24 22:05:59 2022 +0800 + + update 0015.三数之和:完善注释,优化go代码风格 + +commit 983bb606d39c8ea5ab384d15d8c1bb226b65bce9 +Author: Yuhao Ju +Date: Thu Nov 24 21:51:48 2022 +0800 + + update 0383.赎金信: 完善注释 + +commit b0f84a4b357f1413118536e55f6c37c460d32674 +Author: Yuhao Ju +Date: Thu Nov 24 21:42:38 2022 +0800 + + update 0454.四数相加II:完善注释 + +commit 4796c816421924edff6bdc2521ae0880e2d80f39 +Author: Yuhao Ju +Date: Thu Nov 24 21:35:53 2022 +0800 + + update 0001.两数之和:加注释,给java代码一点优化 + +commit ac58e6613bd6a9d3e265e95e285c40b05bbc6f29 +Author: Yuhao Ju +Date: Thu Nov 24 21:26:09 2022 +0800 + + update 0349.两个数组的交集 修改python代码,删除冗余的go代码 + +commit e86fea0ec398e8161149377a0fc5c5480ae680d0 +Author: Yuhao Ju +Date: Thu Nov 24 21:07:05 2022 +0800 + + update 0242.有效的字母异位词:加java注释,删除质量较差且多余的go代码 + +commit c434e343a87924d06ef1660091756ed72c1a29a1 +Merge: feb3f9c2 f1c36e14 +Author: 程序员Carl +Date: Thu Nov 24 09:12:04 2022 +0800 + + Merge pull request #1749 from roylx/master + + Update 0376.摆动序列.md 增加python优化动态规划版 Update 0121.买卖股票的最佳时机.md 增加Python动态规划版本三 Update 0714.买卖股票的最佳时机含手续费 更新Python贪心,更容易理解 Update 0055.跳跃游戏.md 增加python for循环版 + +commit feb3f9c2aa7749f2814a72d058f9ae142e88bc28 +Merge: 14d0ddc3 d9950cee +Author: 程序员Carl +Date: Thu Nov 24 09:11:18 2022 +0800 + + Merge pull request #1775 from juguagua/leetcode-modify-the-code-of-the-linked-list + + 更新链表部分: 0707.设计链表 python代码,java注释 和 面试题02.07.链表相交 python代码 js注释 + +commit d9950cee1bb10cb826cd1522a951cbf9ceccba81 +Author: Yuhao Ju +Date: Thu Nov 24 00:15:31 2022 +0800 + + update 面试题02.07.链表相交 python代码 js注释 + +commit af0e45b9af2171db2a2b5ef005745463a9d739e3 +Author: Yuhao Ju +Date: Wed Nov 23 23:34:26 2022 +0800 + + update 0707.设计链表 python代码,java注释 + +commit 14d0ddc33de60360b0c25d6099425741448dd4dd +Merge: dd513bcf 75103a88 +Author: 程序员Carl +Date: Wed Nov 23 10:06:47 2022 +0800 + + Merge pull request #1748 from xu-kai-xu/master + + Update 链表理论基础.md + +commit dd513bcf2e672140c750ca9a9e5c105a9c492f9d +Merge: c94eb952 a2e84d93 +Author: 程序员Carl +Date: Wed Nov 23 10:06:20 2022 +0800 + + Merge pull request #1741 from Jack-Zhang-1314/patch-10 + + update 0102.二叉树的层序遍历.md about using vecdeque rust + +commit c94eb952baacf9e2dee7221df465200f76760179 +Merge: ee9837ff 24d7ad68 +Author: 程序员Carl +Date: Wed Nov 23 10:03:54 2022 +0800 + + Merge pull request #1740 from wantsnowfly/master + + 增加034二分查找 java解法 + +commit ee9837ff5c8ab5fccbe5c797a8d2982cd7a877ab +Merge: fd25f8f0 7746c7c2 +Author: 程序员Carl +Date: Wed Nov 23 10:02:25 2022 +0800 + + Merge pull request #1773 from juguagua/leetcode-modify-the-code-of-the-array + + 更新数组部分,0209.长度最小的子数组 python, js 代码 + +commit f1c36e140597a8f0c9ee2309eb413e3dfccd5800 +Merge: c0f1f136 fd25f8f0 +Author: roylx <73628821+roylx@users.noreply.github.com> +Date: Tue Nov 22 15:35:44 2022 -0700 + + Merge branch 'youngyangyang04:master' into master + +commit 7746c7c2bbe010bee987ca0eb9054f0d59737560 +Author: Yuhao Ju +Date: Tue Nov 22 22:27:35 2022 +0800 + + update 0209.长度最小的子数组 python, js 代码 + +commit cbe3bcf50a8633b2c07ff92b86b7bd9780d62848 +Author: Yuhao Ju +Date: Tue Nov 22 10:13:52 2022 +0800 + + update 027.移除元素 python代码 + +commit fd25f8f0af97df5ed3fdbbc6f4780b515d149c68 +Merge: 2224f82a ece7623d +Author: 程序员Carl +Date: Tue Nov 22 09:58:00 2022 +0800 + + Merge pull request #1744 from lihuacai168/master + + update 63不同路径II.md python + +commit 2224f82ab95ff228f03ed3b7c46ce0aa11f11308 \ No newline at end of file From abd6d9e9b846718416082cbc8c2c316f6ea82606 Mon Sep 17 00:00:00 2001 From: GitNaruto <19946254539@163.com> Date: Sat, 26 Nov 2022 20:15:35 +0800 Subject: [PATCH 1271/3019] =?UTF-8?q?=E4=B8=BA=E4=BB=80=E4=B9=88=E6=AF=8F?= =?UTF-8?q?=E6=AC=A1=E5=9C=A8=E8=87=AA=E5=B7=B1=E4=BB=93=E5=BA=93=E7=9A=84?= =?UTF-8?q?=E6=8F=90=E4=BA=A4=E9=83=BD=E4=BC=9A=E5=B9=B6=E5=88=B0pull=20re?= =?UTF-8?q?quest=E4=B8=AD=EF=BC=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...d 72bc4c40b2b8d4d47276a74f54f48ae58f925db5 | 250 ------------------ 1 file changed, 250 deletions(-) delete mode 100644 et --hard 72bc4c40b2b8d4d47276a74f54f48ae58f925db5 diff --git a/et --hard 72bc4c40b2b8d4d47276a74f54f48ae58f925db5 b/et --hard 72bc4c40b2b8d4d47276a74f54f48ae58f925db5 deleted file mode 100644 index 8f9dd9a028..0000000000 --- a/et --hard 72bc4c40b2b8d4d47276a74f54f48ae58f925db5 +++ /dev/null @@ -1,250 +0,0 @@ -commit 4594221520698dd823f65481e286d4a9b228fe99 (HEAD -> master, origin/master, origin/HEAD) -Author: GitNaruto <19946254539@163.com> -Date: Sat Nov 26 19:47:37 2022 +0800 - - 修改 0037.解数独.md 错别字 - -commit 72bc4c40b2b8d4d47276a74f54f48ae58f925db5 -Author: GitNaruto <19946254539@163.com> -Date: Sat Nov 26 19:43:43 2022 +0800 - - update - -commit 65ff7ea4c8c5aef9d5c7b3070a66d1786aa2c2fb -Merge: abfce687 111016ae -Author: WayV5 <115171820+WayV5@users.noreply.github.com> -Date: Sat Nov 26 19:41:58 2022 +0800 - - Merge branch 'youngyangyang04:master' into master - -commit abfce6875ed8693df6c1d6b83aef35261da12556 -Author: GitNaruto <19946254539@163.com> -Date: Sat Nov 26 15:31:47 2022 +0800 - - fd - -commit 4f874ea20735d21f4c3aa517373d73fb66ab5c33 -Author: GitNaruto <19946254539@163.com> -Date: Sat Nov 26 15:28:36 2022 +0800 - - 发的 - -commit ade863f9c2d6fa9cc3a20f2b2f3636dd0079982c -Author: GitNaruto <19946254539@163.com> -Date: Sat Nov 26 15:22:43 2022 +0800 - - “ok” - -commit 61a6112297cd10647d577ff1e82539a3175eb6b7 -Author: GitNaruto <19946254539@163.com> -Date: Sat Nov 26 15:18:49 2022 +0800 - - “反对反对反对” - -commit 22cea2090fc7046c46e461a6da285b4ff3bfcaa8 -Author: GitNaruto <19946254539@163.com> -Date: Sat Nov 26 15:17:01 2022 +0800 - - haha - -commit ff0ce29232e205f737ea4236ff7be845985b1a18 -Author: WayV5 <115171820+WayV5@users.noreply.github.com> -Date: Sat Nov 26 15:13:59 2022 +0800 - - Create fd - -commit 111016aef93e18473a89585567c20eb5fff18ed0 -Merge: 97a24abe 875680c4 -Author: 程序员Carl -Date: Sat Nov 26 10:20:17 2022 +0800 - - Merge pull request #1754 from Jack-Zhang-1314/patch-15 - - Update 0104.二叉树的最大深度.md about rust - -commit 97a24abeb2a9f9949f5fecac8dfcd28e3421da63 -Merge: 73d55b1f 30a7d366 -Author: 程序员Carl -Date: Sat Nov 26 10:18:45 2022 +0800 - - Merge pull request #1753 from Jack-Zhang-1314/patch-12 - - Update 0101.对称二叉树.md about rust - -commit 73d55b1f5efce71762010c11b8518be7b79e3356 -Merge: 0330e486 9d087231 -Author: 程序员Carl -Date: Fri Nov 25 15:30:25 2022 +0800 - - Merge pull request #1752 from Jack-Zhang-1314/patch-11 - - Update 0226.翻转二叉树.md about rust - -commit 0330e4866d7c98958ac2aeb1747bd2ff8b90b4c6 -Merge: 35fbcb32 c1cac2c9 -Author: 程序员Carl -Date: Fri Nov 25 15:29:56 2022 +0800 - - Merge pull request #1751 from LookSin/my-commit - - 反转字符串Java其他解法 - -commit 35fbcb328a1df64d9e165dc97ce7c00b642d530f -Merge: c434e343 1afff796 -Author: 程序员Carl -Date: Fri Nov 25 15:27:26 2022 +0800 - - Merge pull request #1776 from juguagua/leetcode-modify-the-code-of-the-hash - - 修改完善哈希表部分代码和注释 - -commit a490c4b4fd7d3a2d22dfe2e20bb27dc55cd9d237 -Author: GitNaruto <19946254539@163.com> -Date: Fri Nov 25 15:00:03 2022 +0800 - - 添加0051N皇后Java版本(方法2) - -commit 1afff796691baa7424110fa326bc80fae5991364 -Merge: c1f1c1c4 c434e343 -Author: Yuhao Ju -Date: Thu Nov 24 22:14:50 2022 +0800 - - Merge branch 'youngyangyang04:master' into leetcode-modify-the-code-of-the-hash - -commit c1f1c1c42fbd24c1e1edeb8a27cd4ac6211b32d3 -Author: Yuhao Ju -Date: Thu Nov 24 22:12:59 2022 +0800 - - update 0018.四数之和 完善注释 - -commit dddbb95ea718c7dfd327b270b4686a745d1e848d -Author: Yuhao Ju -Date: Thu Nov 24 22:05:59 2022 +0800 - - update 0015.三数之和:完善注释,优化go代码风格 - -commit 983bb606d39c8ea5ab384d15d8c1bb226b65bce9 -Author: Yuhao Ju -Date: Thu Nov 24 21:51:48 2022 +0800 - - update 0383.赎金信: 完善注释 - -commit b0f84a4b357f1413118536e55f6c37c460d32674 -Author: Yuhao Ju -Date: Thu Nov 24 21:42:38 2022 +0800 - - update 0454.四数相加II:完善注释 - -commit 4796c816421924edff6bdc2521ae0880e2d80f39 -Author: Yuhao Ju -Date: Thu Nov 24 21:35:53 2022 +0800 - - update 0001.两数之和:加注释,给java代码一点优化 - -commit ac58e6613bd6a9d3e265e95e285c40b05bbc6f29 -Author: Yuhao Ju -Date: Thu Nov 24 21:26:09 2022 +0800 - - update 0349.两个数组的交集 修改python代码,删除冗余的go代码 - -commit e86fea0ec398e8161149377a0fc5c5480ae680d0 -Author: Yuhao Ju -Date: Thu Nov 24 21:07:05 2022 +0800 - - update 0242.有效的字母异位词:加java注释,删除质量较差且多余的go代码 - -commit c434e343a87924d06ef1660091756ed72c1a29a1 -Merge: feb3f9c2 f1c36e14 -Author: 程序员Carl -Date: Thu Nov 24 09:12:04 2022 +0800 - - Merge pull request #1749 from roylx/master - - Update 0376.摆动序列.md 增加python优化动态规划版 Update 0121.买卖股票的最佳时机.md 增加Python动态规划版本三 Update 0714.买卖股票的最佳时机含手续费 更新Python贪心,更容易理解 Update 0055.跳跃游戏.md 增加python for循环版 - -commit feb3f9c2aa7749f2814a72d058f9ae142e88bc28 -Merge: 14d0ddc3 d9950cee -Author: 程序员Carl -Date: Thu Nov 24 09:11:18 2022 +0800 - - Merge pull request #1775 from juguagua/leetcode-modify-the-code-of-the-linked-list - - 更新链表部分: 0707.设计链表 python代码,java注释 和 面试题02.07.链表相交 python代码 js注释 - -commit d9950cee1bb10cb826cd1522a951cbf9ceccba81 -Author: Yuhao Ju -Date: Thu Nov 24 00:15:31 2022 +0800 - - update 面试题02.07.链表相交 python代码 js注释 - -commit af0e45b9af2171db2a2b5ef005745463a9d739e3 -Author: Yuhao Ju -Date: Wed Nov 23 23:34:26 2022 +0800 - - update 0707.设计链表 python代码,java注释 - -commit 14d0ddc33de60360b0c25d6099425741448dd4dd -Merge: dd513bcf 75103a88 -Author: 程序员Carl -Date: Wed Nov 23 10:06:47 2022 +0800 - - Merge pull request #1748 from xu-kai-xu/master - - Update 链表理论基础.md - -commit dd513bcf2e672140c750ca9a9e5c105a9c492f9d -Merge: c94eb952 a2e84d93 -Author: 程序员Carl -Date: Wed Nov 23 10:06:20 2022 +0800 - - Merge pull request #1741 from Jack-Zhang-1314/patch-10 - - update 0102.二叉树的层序遍历.md about using vecdeque rust - -commit c94eb952baacf9e2dee7221df465200f76760179 -Merge: ee9837ff 24d7ad68 -Author: 程序员Carl -Date: Wed Nov 23 10:03:54 2022 +0800 - - Merge pull request #1740 from wantsnowfly/master - - 增加034二分查找 java解法 - -commit ee9837ff5c8ab5fccbe5c797a8d2982cd7a877ab -Merge: fd25f8f0 7746c7c2 -Author: 程序员Carl -Date: Wed Nov 23 10:02:25 2022 +0800 - - Merge pull request #1773 from juguagua/leetcode-modify-the-code-of-the-array - - 更新数组部分,0209.长度最小的子数组 python, js 代码 - -commit f1c36e140597a8f0c9ee2309eb413e3dfccd5800 -Merge: c0f1f136 fd25f8f0 -Author: roylx <73628821+roylx@users.noreply.github.com> -Date: Tue Nov 22 15:35:44 2022 -0700 - - Merge branch 'youngyangyang04:master' into master - -commit 7746c7c2bbe010bee987ca0eb9054f0d59737560 -Author: Yuhao Ju -Date: Tue Nov 22 22:27:35 2022 +0800 - - update 0209.长度最小的子数组 python, js 代码 - -commit cbe3bcf50a8633b2c07ff92b86b7bd9780d62848 -Author: Yuhao Ju -Date: Tue Nov 22 10:13:52 2022 +0800 - - update 027.移除元素 python代码 - -commit fd25f8f0af97df5ed3fdbbc6f4780b515d149c68 -Merge: 2224f82a ece7623d -Author: 程序员Carl -Date: Tue Nov 22 09:58:00 2022 +0800 - - Merge pull request #1744 from lihuacai168/master - - update 63不同路径II.md python - -commit 2224f82ab95ff228f03ed3b7c46ce0aa11f11308 \ No newline at end of file From f95a4b6ab42d7156df54091b7d96fdf913dfd44c Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Sat, 26 Nov 2022 20:48:23 +0800 Subject: [PATCH 1272/3019] =?UTF-8?q?update=200028.=E5=AE=9E=E7=8E=B0strSt?= =?UTF-8?q?r=EF=BC=9A=E6=94=B9=E9=94=99=E5=AD=97=EF=BC=8C=E4=BC=98?= =?UTF-8?q?=E5=8C=96python=E4=BB=A3=E7=A0=81=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0028.\345\256\236\347\216\260strStr.md" | 124 +++++++++--------- 1 file changed, 62 insertions(+), 62 deletions(-) diff --git "a/problems/0028.\345\256\236\347\216\260strStr.md" "b/problems/0028.\345\256\236\347\216\260strStr.md" index 19d16e9f6b..fc22244165 100644 --- "a/problems/0028.\345\256\236\347\216\260strStr.md" +++ "b/problems/0028.\345\256\236\347\216\260strStr.md" @@ -94,7 +94,7 @@ next数组就是一个前缀表(prefix table)。 **前缀表是用来回退的,它记录了模式串与主串(文本串)不匹配的时候,模式串应该从哪里开始重新匹配。** -为了清楚的了解前缀表的来历,我们来举一个例子: +为了清楚地了解前缀表的来历,我们来举一个例子: 要在文本串:aabaabaafa 中查找是否出现过一个模式串:aabaaf。 @@ -110,9 +110,9 @@ next数组就是一个前缀表(prefix table)。 ![KMP详解1](https://code-thinking.cdn.bcebos.com/gifs/KMP%E7%B2%BE%E8%AE%B21.gif) -动画里,我特意把 子串`aa` 标记上了,这是有原因的,大家先注意一下,后面还会说道。 +动画里,我特意把 子串`aa` 标记上了,这是有原因的,大家先注意一下,后面还会说到。 -可以看出,文本串中第六个字符b 和 模式串的第六个字符f,不匹配了。如果暴力匹配,会发现不匹配,此时就要从头匹配了。 +可以看出,文本串中第六个字符b 和 模式串的第六个字符f,不匹配了。如果暴力匹配,发现不匹配,此时就要从头匹配了。 但如果使用前缀表,就不会从头匹配,而是从上次已经匹配的内容开始匹配,找到了模式串中第三个字符b继续开始匹配。 @@ -157,7 +157,7 @@ next数组就是一个前缀表(prefix table)。 以下这句话,对于理解为什么使用前缀表可以告诉我们匹配失败之后跳到哪里重新匹配 非常重要! -**下标5之前这部分的字符串(也就是字符串aabaa)的最长相等的前缀 和 后缀字符串是 子字符串aa ,因为找到了最长相等的前缀和后缀,匹配失败的位置是后缀子串的后面,那么我们找到与其相同的前缀的后面从新匹配就可以了。** +**下标5之前这部分的字符串(也就是字符串aabaa)的最长相等的前缀 和 后缀字符串是 子字符串aa ,因为找到了最长相等的前缀和后缀,匹配失败的位置是后缀子串的后面,那么我们找到与其相同的前缀的后面重新匹配就可以了。** 所以前缀表具有告诉我们当前位置匹配失败,跳到之前已经匹配过的地方的能力。 @@ -199,7 +199,7 @@ next数组就是一个前缀表(prefix table)。 所以要看前一位的 前缀表的数值。 -前一个字符的前缀表的数值是2, 所有把下标移动到下标2的位置继续比配。 可以再反复看一下上面的动画。 +前一个字符的前缀表的数值是2, 所以把下标移动到下标2的位置继续比配。 可以再反复看一下上面的动画。 最后就在文本串中找到了和模式串匹配的子串了。 @@ -211,7 +211,7 @@ next数组就可以是前缀表,但是很多实现都是把前缀表统一减 为什么这么做呢,其实也是很多文章视频没有解释清楚的地方。 -其实**这并不涉及到KMP的原理,而是具体实现,next数组即可以就是前缀表,也可以是前缀表统一减一(右移一位,初始位置为-1)。** +其实**这并不涉及到KMP的原理,而是具体实现,next数组既可以就是前缀表,也可以是前缀表统一减一(右移一位,初始位置为-1)。** 后面我会提供两种不同的实现代码,大家就明白了。 @@ -231,7 +231,7 @@ next数组就可以是前缀表,但是很多实现都是把前缀表统一减 其中n为文本串长度,m为模式串长度,因为在匹配的过程中,根据前缀表不断调整匹配的位置,可以看出匹配的过程是O(n),之前还要单独生成next数组,时间复杂度是O(m)。所以整个KMP算法的时间复杂度是O(n+m)的。 -暴力的解法显而易见是O(n × m),所以**KMP在字符串匹配中极大的提高的搜索的效率。** +暴力的解法显而易见是O(n × m),所以**KMP在字符串匹配中极大地提高了搜索的效率。** 为了和力扣题目28.实现strStr保持一致,方便大家理解,以下文章统称haystack为文本串, needle为模式串。 @@ -251,7 +251,7 @@ void getNext(int* next, const string& s) 2. 处理前后缀不相同的情况 3. 处理前后缀相同的情况 -接下来我们详解详解一下。 +接下来我们详解一下。 1. 初始化: @@ -613,12 +613,12 @@ class Solution { public void getNext(int[] next, String s){ int j = -1; next[0] = j; - for (int i = 1; i=0 && s.charAt(i) != s.charAt(j+1)){ + for (int i = 1; i < s.length(); i++){ + while(j >= 0 && s.charAt(i) != s.charAt(j+1)){ j=next[j]; } - if(s.charAt(i)==s.charAt(j+1)){ + if(s.charAt(i) == s.charAt(j+1)){ j++; } next[i] = j; @@ -632,14 +632,14 @@ class Solution { int[] next = new int[needle.length()]; getNext(next, needle); int j = -1; - for(int i = 0; i=0 && haystack.charAt(i) != needle.charAt(j+1)){ j = next[j]; } - if(haystack.charAt(i)==needle.charAt(j+1)){ + if(haystack.charAt(i) == needle.charAt(j+1)){ j++; } - if(j==needle.length()-1){ + if(j == needle.length()-1){ return (i-needle.length()+1); } } @@ -694,9 +694,9 @@ class Solution(object): :type needle: str :rtype: int """ - m,n=len(haystack),len(needle) + m, n = len(haystack), len(needle) for i in range(m): - if haystack[i:i+n]==needle: + if haystack[i:i+n] == needle: return i return -1 ``` @@ -704,31 +704,31 @@ class Solution(object): // 方法一 class Solution: def strStr(self, haystack: str, needle: str) -> int: - a=len(needle) - b=len(haystack) - if a==0: + a = len(needle) + b = len(haystack) + if a == 0: return 0 - next=self.getnext(a,needle) + next = self.getnext(a,needle) p=-1 for j in range(b): - while p>=0 and needle[p+1]!=haystack[j]: - p=next[p] - if needle[p+1]==haystack[j]: - p+=1 - if p==a-1: + while p >= 0 and needle[p+1] != haystack[j]: + p = next[p] + if needle[p+1] == haystack[j]: + p += 1 + if p == a-1: return j-a+1 return -1 def getnext(self,a,needle): - next=['' for i in range(a)] - k=-1 - next[0]=k - for i in range(1,len(needle)): - while (k>-1 and needle[k+1]!=needle[i]): - k=next[k] - if needle[k+1]==needle[i]: - k+=1 - next[i]=k + next = ['' for i in range(a)] + k = -1 + next[0] = k + for i in range(1, len(needle)): + while (k > -1 and needle[k+1] != needle[i]): + k = next[k] + if needle[k+1] == needle[i]: + k += 1 + next[i] = k return next ``` @@ -736,34 +736,34 @@ class Solution: // 方法二 class Solution: def strStr(self, haystack: str, needle: str) -> int: - a=len(needle) - b=len(haystack) - if a==0: + a = len(needle) + b = len(haystack) + if a == 0: return 0 - i=j=0 - next=self.getnext(a,needle) - while(i= 0 && s[i] != s[j+1] { - j = next[j] // 回退前一位 + j = next[j] // 回退前一位 } if s[i] == s[j+1] { j++ } - next[i] = j // next[i]是i(包括i)之前的最长相等前后缀长度 + next[i] = j // next[i]是i(包括i)之前的最长相等前后缀长度 } } func strStr(haystack string, needle string) int { @@ -796,15 +796,15 @@ func strStr(haystack string, needle string) int { } next := make([]int, len(needle)) getNext(next, needle) - j := -1 // 模式串的起始位置 next为-1 因此也为-1 + j := -1 // 模式串的起始位置 next为-1 因此也为-1 for i := 0; i < len(haystack); i++ { for j >= 0 && haystack[i] != needle[j+1] { - j = next[j] // 寻找下一个匹配点 + j = next[j] // 寻找下一个匹配点 } if haystack[i] == needle[j+1] { j++ } - if j == len(needle)-1 { // j指向了模式串的末尾 + if j == len(needle)-1 { // j指向了模式串的末尾 return i - len(needle) + 1 } } @@ -842,7 +842,7 @@ func strStr(haystack string, needle string) int { getNext(next, needle) for i := 0; i < len(haystack); i++ { for j > 0 && haystack[i] != needle[j] { - j = next[j-1] // 回退到j的前一位 + j = next[j-1] // 回退到j的前一位 } if haystack[i] == needle[j] { j++ From 7ebd52477dcd5cfeb45f700ff1b2bb2023e6b6c1 Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Sat, 26 Nov 2022 21:13:49 +0800 Subject: [PATCH 1273/3019] =?UTF-8?q?update=200459.=E9=87=8D=E5=A4=8D?= =?UTF-8?q?=E7=9A=84=E5=AD=90=E5=AD=97=E7=AC=A6=E4=B8=B2:=E6=94=B9?= =?UTF-8?q?=E9=94=99=E5=AD=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...5\220\345\255\227\347\254\246\344\270\262.md" | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git "a/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" "b/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" index b7d86880ee..5d87021903 100644 --- "a/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" @@ -46,17 +46,17 @@ ## 移动匹配 -当一个字符串s:abcabc,内部又重复的子串组成,那么这个字符串的结构一定是这样的: +当一个字符串s:abcabc,内部由重复的子串组成,那么这个字符串的结构一定是这样的: ![图一](https://code-thinking-1253855093.file.myqcloud.com/pics/20220728104518.png) -也就是又前后又相同的子串组成。 +也就是由前后相同的子串组成。 那么既然前面有相同的子串,后面有相同的子串,用 s + s,这样组成的字符串中,后面的子串做前串,前后的子串做后串,就一定还能组成一个s,如图: ![图二](https://code-thinking-1253855093.file.myqcloud.com/pics/20220728104931.png) -所以判断字符串s是否有重复子串组成,只要两个s拼接在一起,里面还出现一个s的话,就说明是又重复子串组成。 +所以判断字符串s是否由重复子串组成,只要两个s拼接在一起,里面还出现一个s的话,就说明是由重复子串组成。 当然,我们在判断 s + s 拼接的字符串里是否出现一个s的的时候,**要刨除 s + s 的首字符和尾字符**,这样避免在s+s中搜索出原来的s,我们要搜索的是中间拼接出来的s。 @@ -81,7 +81,7 @@ public: ## KMP ### 为什么会使用KMP -以下使用KMP方式讲解,强烈建议大家先把一下两个视频看了,理解KMP算法,在来看下面讲解,否则会很懵。 +以下使用KMP方式讲解,强烈建议大家先把以下两个视频看了,理解KMP算法,再来看下面讲解,否则会很懵。 * [视频讲解版:帮你把KMP算法学个通透!(理论篇)](https://www.bilibili.com/video/BV1PD4y1o7nd/) * [视频讲解版:帮你把KMP算法学个通透!(求next数组代码篇)](https://www.bilibili.com/video/BV1M5411j7Xx) @@ -93,12 +93,12 @@ KMP算法中next数组为什么遇到字符不匹配的时候可以找到上一 那么 最长相同前后缀和重复子串的关系又有什么关系呢。 -可能很多录友又忘了 前缀和后缀的定义,在回顾一下: +可能很多录友又忘了 前缀和后缀的定义,再回顾一下: * 前缀是指不包含最后一个字符的所有以第一个字符开头的连续子串; * 后缀是指不包含第一个字符的所有以最后一个字符结尾的连续子串 -在由重复子串组成的字符串中,最长相等前后缀不包含的子串就是最小重复子串,这里那字符串s:abababab 来举例,ab就是最小重复单位,如图所示: +在由重复子串组成的字符串中,最长相等前后缀不包含的子串就是最小重复子串,这里拿字符串s:abababab 来举例,ab就是最小重复单位,如图所示: ![图三](https://code-thinking-1253855093.file.myqcloud.com/pics/20220728205249.png) @@ -123,11 +123,11 @@ KMP算法中next数组为什么遇到字符不匹配的时候可以找到上一 ### 简单推理 -这里在给出一个数推导,就容易理解很多。 +这里再给出一个数学推导,就容易理解很多。 假设字符串s使用多个重复子串构成(这个子串是最小重复单位),重复出现的子字符串长度是x,所以s是由n * x组成。 -因为字符串s的最长相同前后缀的的长度一定是不包含s本身,所以 最长相同前后缀长度必然是m * x,而且 n - m = 1,(这里如果不懂,看上面的推理) +因为字符串s的最长相同前后缀的长度一定是不包含s本身,所以 最长相同前后缀长度必然是m * x,而且 n - m = 1,(这里如果不懂,看上面的推理) 所以如果 nx % (n - m)x = 0,就可以判定有重复出现的子字符串。 From 2cd1ebe5768619989294be9ff7343d9d61334d68 Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Sun, 27 Nov 2022 18:11:35 +0800 Subject: [PATCH 1274/3019] Update --- ...11\346\220\234\347\264\242\346\240\221.md" | 2 +- ...25\350\257\215\346\213\206\345\210\206.md" | 76 ++++++++++++------- ...23\345\256\266\345\212\253\350\210\215.md" | 21 +++-- ...50\345\271\263\346\226\271\346\225\260.md" | 6 +- ...66\351\222\261\345\205\221\346\215\242.md" | 2 - ...345\256\266\345\212\253\350\210\215III.md" | 8 +- ...10\346\200\273\345\222\214\342\205\243.md" | 3 +- ...11\345\222\214\345\255\220\351\233\206.md" | 12 ++- ...4.\344\270\200\345\222\214\351\233\266.md" | 16 ++-- ...4.\347\233\256\346\240\207\345\222\214.md" | 53 ++++++++----- ...\351\222\261\345\205\221\346\215\242II.md" | 54 +++++++------ ...\347\232\204\351\207\215\351\207\217II.md" | 23 ++++-- ...06\350\256\272\345\237\272\347\241\200.md" | 2 +- ...06\350\256\272\345\237\272\347\241\200.md" | 19 +++-- ...14\345\205\250\350\203\214\345\214\205.md" | 2 +- 15 files changed, 188 insertions(+), 111 deletions(-) diff --git "a/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" index fd634094fc..9318a0e2e5 100644 --- "a/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" +++ "b/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" @@ -248,7 +248,7 @@ class Solution { return root; } - // 左闭右闭区间[left, right) + // 左闭右闭区间[left, right] private TreeNode traversal(int[] nums, int left, int right) { if (left > right) return null; diff --git "a/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" "b/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" index c9e42dc75a..f06bd40c2b 100644 --- "a/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" +++ "b/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" @@ -6,7 +6,7 @@ -## 139.单词拆分 +# 139.单词拆分 [力扣题目链接](https://leetcode.cn/problems/word-break/) @@ -19,19 +19,19 @@ 你可以假设字典中没有重复的单词。 示例 1: -输入: s = "leetcode", wordDict = ["leet", "code"] -输出: true -解释: 返回 true 因为 "leetcode" 可以被拆分成 "leet code"。 +* 输入: s = "leetcode", wordDict = ["leet", "code"] +* 输出: true +* 解释: 返回 true 因为 "leetcode" 可以被拆分成 "leet code"。 示例 2: -输入: s = "applepenapple", wordDict = ["apple", "pen"] -输出: true -解释: 返回 true 因为 "applepenapple" 可以被拆分成 "apple pen apple"。 -  注意你可以重复使用字典中的单词。 +* 输入: s = "applepenapple", wordDict = ["apple", "pen"] +* 输出: true +* 解释: 返回 true 因为 "applepenapple" 可以被拆分成 "apple pen apple"。 +* 注意你可以重复使用字典中的单词。 示例 3: -输入: s = "catsandog", wordDict = ["cats", "dog", "sand", "and", "cat"] -输出: false +* 输入: s = "catsandog", wordDict = ["cats", "dog", "sand", "and", "cat"] +* 输出: false ## 思路 @@ -158,24 +158,19 @@ dp[0]表示如果字符串为空的话,说明出现在字典里。 **如果求排列数就是外层for遍历背包,内层for循环遍历物品**。 -对这个结论还有疑问的同学可以看这篇[本周小结!(动态规划系列五)](https://programmercarl.com/%E5%91%A8%E6%80%BB%E7%BB%93/20210204动规周末总结.html),这篇本周小节中,我做了如下总结: +我在这里做一个一个总结: 求组合数:[动态规划:518.零钱兑换II](https://programmercarl.com/0518.零钱兑换II.html) 求排列数:[动态规划:377. 组合总和 Ⅳ](https://programmercarl.com/0377.组合总和.html)、[动态规划:70. 爬楼梯进阶版(完全背包)](https://programmercarl.com/0070.爬楼梯完全背包版本.html) 求最小数:[动态规划:322. 零钱兑换](https://programmercarl.com/0322.零钱兑换.html)、[动态规划:279.完全平方数](https://programmercarl.com/0279.完全平方数.html) -本题最终要求的是是否都出现过,所以对出现单词集合里的元素是组合还是排列,并不在意! +而本题其实我们求的是排列数,为什么呢。 拿 s = "applepenapple", wordDict = ["apple", "pen"] 举例。 -**那么本题使用求排列的方式,还是求组合的方式都可以**。 +"apple", "pen" 是物品,那么我们要求 物品的组合一定是 "apple" + "pen" + "apple" 才能组成 "applepenapple"。 -即:外层for循环遍历物品,内层for遍历背包 或者 外层for遍历背包,内层for循环遍历物品 都是可以的。 - -但本题还有特殊性,因为是要求子串,最好是遍历背包放在外循环,将遍历物品放在内循环。 - -如果要是外层for循环遍历物品,内层for遍历背包,就需要把所有的子串都预先放在一个容器里。(如果不理解的话,可以自己尝试这么写一写就理解了) - -**所以最终我选择的遍历顺序为:遍历背包放在外循环,将遍历物品放在内循环。内循环从前到后**。 +"apple" + "apple" + "pen" 或者 "pen" + "apple" + "apple" 是不可以的,那么我们就是强调物品之间顺序。 +所以说,本题一定是 先遍历 背包,在遍历物品。 5. 举例推导dp[i] @@ -210,22 +205,51 @@ public: * 时间复杂度:O(n^3),因为substr返回子串的副本是O(n)的复杂度(这里的n是substring的长度) * 空间复杂度:O(n) +## 拓展 -## 总结 +关于遍历顺序,再给大家讲一下为什么 先遍历物品再遍历背包不行。 -本题和我们之前讲解回溯专题的[回溯算法:分割回文串](https://programmercarl.com/0131.分割回文串.html)非常像,所以我也给出了对应的回溯解法。 +这里可以给出先遍历物品在遍历背包的代码: -稍加分析,便可知道本题是完全背包,而且是求能否组成背包,所以遍历顺序理论上来讲 两层for循环谁先谁后都可以! +```CPP +class Solution { +public: + bool wordBreak(string s, vector& wordDict) { + unordered_set wordSet(wordDict.begin(), wordDict.end()); + vector dp(s.size() + 1, false); + dp[0] = true; + for (int j = 0; j < wordDict.size(); j++) { // 物品 + for (int i = wordDict[j].size(); i <= s.size(); i++) { // 背包 + string word = s.substr(i - wordDict[j].size(), wordDict[j].size()); + // cout << word << endl; + if ( word == wordDict[j] && dp[i - wordDict[j].size()]) { + dp[i] = true; + } + // for (int k = 0; k <= s.size(); k++) cout << dp[k] << " "; //这里打印 dp数组的情况 + // cout << endl; + } + } + return dp[s.size()]; -但因为分割子串的特殊性,遍历背包放在外循环,将遍历物品放在内循环更方便一些。 + } +}; +``` + +使用用例:s = "applepenapple", wordDict = ["apple", "pen"],对应的dp数组状态如下: -本题其实递推公式都不是重点,遍历顺序才是重点,如果我直接把代码贴出来,估计同学们也会想两个for循环的顺序理所当然就是这样,甚至都不会想为什么遍历背包的for循环在外层。 +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20221123205105.png) -不分析透彻不是Carl的风格啊,哈哈 +最后dp[s.size()] = 0 即 dp[13] = 0 ,而不是1,因为先用 "apple" 去遍历的时候,dp[8]并没有被赋值为1 (还没用"pen"),所以 dp[13]也不能变成1。 +除非是先用 "apple" 遍历一遍,在用 "pen" 遍历,此时 dp[8]已经是1,最后再用 "apple" 去遍历,dp[13]才能是1。 +如果大家对这里不理解,建议可以把我上面给的代码,拿去力扣上跑一跑,把dp数组打印出来,对着递推公式一步一步去看,思路就清晰了。 +## 总结 + +本题和我们之前讲解回溯专题的[回溯算法:分割回文串](https://programmercarl.com/0131.分割回文串.html)非常像,所以我也给出了对应的回溯解法。 +稍加分析,便可知道本题是完全背包,是求能否组成背包,而且这里要求物品是要有顺序的。 ## 其他语言版本 diff --git "a/problems/0198.\346\211\223\345\256\266\345\212\253\350\210\215.md" "b/problems/0198.\346\211\223\345\256\266\345\212\253\350\210\215.md" index 2cc2f4fe95..1e48f007ec 100644 --- "a/problems/0198.\346\211\223\345\256\266\345\212\253\350\210\215.md" +++ "b/problems/0198.\346\211\223\345\256\266\345\212\253\350\210\215.md" @@ -12,15 +12,16 @@ 给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。 -示例 1: -输入:[1,2,3,1] -输出:4 +* 示例 1: +* 输入:[1,2,3,1] +* 输出:4 + 解释:偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。   偷窃到的最高金额 = 1 + 3 = 4 。 -示例 2: -输入:[2,7,9,3,1] -输出:12 +* 示例 2: +* 输入:[2,7,9,3,1] +* 输出:12 解释:偷窃 1 号房屋 (金额 = 2), 偷窃 3 号房屋 (金额 = 9),接着偷窃 5 号房屋 (金额 = 1)。   偷窃到的最高金额 = 2 + 9 + 1 = 12 。 @@ -33,7 +34,13 @@ ## 思路 -打家劫舍是dp解决的经典问题,动规五部曲分析如下: +大家如果刚接触这样的题目,会有点困惑,当前的状态我是偷还是不偷呢? + +仔细一想,当前房屋偷与不偷取决于 前一个房屋和前两个房屋是否被偷了。 + +所以这里就更感觉到,当前状态和前面状态会有一种依赖关系,那么这种依赖关系都是动规的递推公式。 + +当然以上是大概思路,打家劫舍是dp解决的经典问题,接下来我们来动规五部曲分析如下: 1. 确定dp数组(dp table)以及下标的含义 diff --git "a/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" "b/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" index 6acc48917a..50ddf5f94d 100644 --- "a/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" +++ "b/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" @@ -131,10 +131,8 @@ public: vector dp(n + 1, INT_MAX); dp[0] = 0; for (int i = 1; i * i <= n; i++) { // 遍历物品 - for (int j = 1; j <= n; j++) { // 遍历背包 - if (j - i * i >= 0) { - dp[j] = min(dp[j - i * i] + 1, dp[j]); - } + for (int j = i * i; j <= n; j++) { // 遍历背包 + dp[j] = min(dp[j - i * i] + 1, dp[j]); } } return dp[n]; diff --git "a/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" "b/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" index e337717fbb..459741124b 100644 --- "a/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" +++ "b/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" @@ -53,8 +53,6 @@ 2. 确定递推公式 -得到dp[j](考虑coins[i]),只有一个来源,dp[j - coins[i]](没有考虑coins[i])。 - 凑足总额为j - coins[i]的最少个数为dp[j - coins[i]],那么只需要加上一个钱币coins[i]即dp[j - coins[i]] + 1就是dp[j](考虑coins[i]) 所以dp[j] 要取所有 dp[j - coins[i]] + 1 中最小的。 diff --git "a/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" "b/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" index 3b7e7cbf3b..c69279fdca 100644 --- "a/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" +++ "b/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" @@ -50,8 +50,8 @@ public: }; ``` -* 时间复杂度:$O(n^2)$,这个时间复杂度不太标准,也不容易准确化,例如越往下的节点重复计算次数就越多 -* 空间复杂度:$O(\log n)$,算上递推系统栈的空间 +* 时间复杂度:O(n^2),这个时间复杂度不太标准,也不容易准确化,例如越往下的节点重复计算次数就越多 +* 空间复杂度:O(log n),算上递推系统栈的空间 当然以上代码超时了,这个递归的过程中其实是有重复计算了。 @@ -84,8 +84,8 @@ public: ``` -* 时间复杂度:$O(n)$ -* 空间复杂度:$O(\log n)$,算上递推系统栈的空间 +* 时间复杂度:O(n) +* 空间复杂度:O(log n),算上递推系统栈的空间 ### 动态规划 diff --git "a/problems/0377.\347\273\204\345\220\210\346\200\273\345\222\214\342\205\243.md" "b/problems/0377.\347\273\204\345\220\210\346\200\273\345\222\214\342\205\243.md" index 4a84b2fa34..1f949ec7c9 100644 --- "a/problems/0377.\347\273\204\345\220\210\346\200\273\345\222\214\342\205\243.md" +++ "b/problems/0377.\347\273\204\345\220\210\346\200\273\345\222\214\342\205\243.md" @@ -4,9 +4,8 @@

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

-# 动态规划:Carl称它为排列总和! -## 377. 组合总和 Ⅳ +# 377. 组合总和 Ⅳ [力扣题目链接](https://leetcode.cn/problems/combination-sum-iv/) diff --git "a/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" "b/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" index db080203e9..52b4826410 100644 --- "a/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" +++ "b/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" @@ -79,7 +79,17 @@ 01背包中,dp[j] 表示: 容量为j的背包,所背的物品价值可以最大为dp[j]。 -**套到本题,dp[j]表示 背包总容量是j,最大可以凑成j的子集总和为dp[j]**。 +本题中每一个元素的数值即是重量,也是价值。 + +**套到本题,dp[j]表示 背包总容量(所能装的总重量)是j,放进物品后,背的最大重量为dp[j]**。 + +那么如果背包容量为target, dp[target]就是装满 背包之后的重量,所以 当 dp[target] == target 的时候,背包就装满了。 + +有录友可能想,那还有装不满的时候? + +拿输入数组 [1, 5, 11, 5],距离, dp[7] 只能等于 6,因为 只能放进 1 和 5。 + +而dp[6] 就可以等于6了,放进1 和 5,那么dp[6] == 6,说明背包装满了。 2. 确定递推公式 diff --git "a/problems/0474.\344\270\200\345\222\214\351\233\266.md" "b/problems/0474.\344\270\200\345\222\214\351\233\266.md" index 21fbf84bad..45a0a27035 100644 --- "a/problems/0474.\344\270\200\345\222\214\351\233\266.md" +++ "b/problems/0474.\344\270\200\345\222\214\351\233\266.md" @@ -3,9 +3,8 @@

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

-# 动态规划:一和零! -## 474.一和零 +# 474.一和零 [力扣题目链接](https://leetcode.cn/problems/ones-and-zeroes/) @@ -42,7 +41,7 @@ * [动态规划:关于01背包问题,你该了解这些!](https://programmercarl.com/背包理论基础01背包-1.html) * [动态规划:关于01背包问题,你该了解这些!(滚动数组)](https://programmercarl.com/背包理论基础01背包-2.html) -这道题目,还是比较难的,也有点像程序员自己给自己出个脑筋急转弯,程序员何苦为难程序员呢哈哈。 +这道题目,还是比较难的,也有点像程序员自己给自己出个脑筋急转弯,程序员何苦为难程序员呢。 来说题,本题不少同学会认为是多重背包,一些题解也是这么写的。 @@ -82,7 +81,7 @@ dp[i][j] 就可以是 dp[i - zeroNum][j - oneNum] + 1。 对比一下就会发现,字符串的zeroNum和oneNum相当于物品的重量(weight[i]),字符串本身的个数相当于物品的价值(value[i])。 -**这就是一个典型的01背包!** 只不过物品的重量有了两个维度而已。 +**这就是一个典型的01背包!** 只不过物品的重量有了两个维度而已。 3. dp数组如何初始化 @@ -155,8 +154,15 @@ public: 不少同学刷过这道提,可能没有总结这究竟是什么背包。 -这道题的本质是有两个维度的01背包,如果大家认识到这一点,对这道题的理解就比较深入了。 +此时我们讲解了0-1背包的多种应用, +* [纯 0 - 1 背包](https://programmercarl.com/%E8%83%8C%E5%8C%85%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%8001%E8%83%8C%E5%8C%85-2.html) 是求 给定背包容量 装满背包 的最大价值是多少。 +* [416. 分割等和子集](https://programmercarl.com/0416.%E5%88%86%E5%89%B2%E7%AD%89%E5%92%8C%E5%AD%90%E9%9B%86.html) 是求 给定背包容量,能不能装满这个背包。 +* [1049. 最后一块石头的重量 II](https://programmercarl.com/1049.%E6%9C%80%E5%90%8E%E4%B8%80%E5%9D%97%E7%9F%B3%E5%A4%B4%E7%9A%84%E9%87%8D%E9%87%8FII.html) 是求 给定背包容量,尽可能装,最多能装多少 +* [494. 目标和](https://programmercarl.com/0494.%E7%9B%AE%E6%A0%87%E5%92%8C.html) 是求 给定背包容量,装满背包有多少种方法。 +* 本题是求 给定背包容量,装满背包最多有多少个物品。 + +所以在代码随想录中所列举的题目,都是 0-1背包不同维度上的应用,大家可以细心体会! diff --git "a/problems/0494.\347\233\256\346\240\207\345\222\214.md" "b/problems/0494.\347\233\256\346\240\207\345\222\214.md" index 7882229cf6..946e52f2aa 100644 --- "a/problems/0494.\347\233\256\346\240\207\345\222\214.md" +++ "b/problems/0494.\347\233\256\346\240\207\345\222\214.md" @@ -3,9 +3,11 @@

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

-# 动态规划:目标和! -## 494. 目标和 + + + +# 494. 目标和 [力扣题目链接](https://leetcode.cn/problems/target-sum/) @@ -52,9 +54,9 @@ 既然为target,那么就一定有 left组合 - right组合 = target。 -left + right等于sum,而sum是固定的。 +left + right = sum,而sum是固定的。right = sum - left -公式来了, left - (sum - left) = target -> left = (target + sum)/2 。 +公式来了, left - (sum - left) = target 推导出 left = (target + sum)/2 。 target是固定的,sum是固定的,left就可以求出来。 @@ -117,22 +119,26 @@ public: 假设加法的总和为x,那么减法对应的总和就是sum - x。 -所以我们要求的是 x - (sum - x) = S +所以我们要求的是 x - (sum - x) = target -x = (S + sum) / 2 +x = (target + sum) / 2 **此时问题就转化为,装满容量为x背包,有几种方法**。 -大家看到(S + sum) / 2 应该担心计算的过程中向下取整有没有影响。 +这里的x,就是bagSize,也就是我们后面要求的背包容量。 + +大家看到(target + sum) / 2 应该担心计算的过程中向下取整有没有影响。 这么担心就对了,例如sum 是5,S是2的话其实就是无解的,所以: -```CPP +```CPP +(C++代码中,输入的S 就是题目描述的 target) if ((S + sum) % 2 == 1) return 0; // 此时没有方案 ``` 同时如果 S的绝对值已经大于sum,那么也是没有方案的。 ```CPP +(C++代码中,输入的S 就是题目描述的 target) if (abs(S) > sum) return 0; // 此时没有方案 ``` @@ -156,17 +162,15 @@ dp[j] 表示:填满j(包括j)这么大容积的包,有dp[j]种方法 有哪些来源可以推出dp[j]呢? -不考虑nums[i]的情况下,填满容量为j的背包,有dp[j]种方法。 - -那么考虑nums[i]的话(只要搞到nums[i]),凑成dp[j]就有dp[j - nums[i]] 种方法。 +只要搞到nums[i]),凑成dp[j]就有dp[j - nums[i]] 种方法。 例如:dp[j],j 为5, -* 已经有一个1(nums[i]) 的话,有 dp[4]种方法 凑成 dp[5]。 -* 已经有一个2(nums[i]) 的话,有 dp[3]种方法 凑成 dp[5]。 -* 已经有一个3(nums[i]) 的话,有 dp[2]中方法 凑成 dp[5] -* 已经有一个4(nums[i]) 的话,有 dp[1]中方法 凑成 dp[5] -* 已经有一个5 (nums[i])的话,有 dp[0]中方法 凑成 dp[5] +* 已经有一个1(nums[i]) 的话,有 dp[4]种方法 凑成 容量为5的背包。 +* 已经有一个2(nums[i]) 的话,有 dp[3]种方法 凑成 容量为5的背包。 +* 已经有一个3(nums[i]) 的话,有 dp[2]中方法 凑成 容量为5的背包 +* 已经有一个4(nums[i]) 的话,有 dp[1]中方法 凑成 容量为5的背包 +* 已经有一个5 (nums[i])的话,有 dp[0]中方法 凑成 容量为5的背包 那么凑整dp[5]有多少方法呢,也就是把 所有的 dp[j - nums[i]] 累加起来。 @@ -182,9 +186,19 @@ dp[j] += dp[j - nums[i]] 从递归公式可以看出,在初始化的时候dp[0] 一定要初始化为1,因为dp[0]是在公式中一切递推结果的起源,如果dp[0]是0的话,递归结果将都是0。 -dp[0] = 1,理论上也很好解释,装满容量为0的背包,有1种方法,就是装0件物品。 +这里有录友可能认为从dp数组定义来说 dp[0] 应该是0,也有录友认为dp[0]应该是1。 + +其实不要硬去解释它的含义,咱就把 dp[0]的情况带入本题看看就是应该等于多少。 -dp[j]其他下标对应的数值应该初始化为0,从递归公式也可以看出,dp[j]要保证是0的初始值,才能正确的由dp[j - nums[i]]推导出来。 +如果数组[0] ,target = 0,那么 bagSize = (target + sum) / 2 = 0。 dp[0]也应该是1, 也就是说给数组里的元素 0 前面无论放加法还是减法,都是 1 种方法。 + +所以本题我们应该初始化 dp[0] 为 1。 + +可能有同学想了,那 如果是 数组[0,0,0,0,0] target = 0 呢。 + +其实 此时最终的dp[0] = 32,也就是这五个零 子集的所有组合情况,但此dp[0]非彼dp[0],dp[0]能算出32,其基础是因为dp[0] = 1 累加起来的。 + +dp[j]其他下标对应的数值也应该初始化为0,从递归公式也可以看出,dp[j]要保证是0的初始值,才能正确的由dp[j - nums[i]]推导出来。 4. 确定遍历顺序 @@ -213,7 +227,6 @@ public: if (abs(S) > sum) return 0; // 此时没有方案 if ((S + sum) % 2 == 1) return 0; // 此时没有方案 int bagSize = (S + sum) / 2; - if (bagsize < 0) return 0; vector dp(bagSize + 1, 0); dp[0] = 1; for (int i = 0; i < nums.size(); i++) { @@ -238,7 +251,7 @@ public: 本题还是有点难度,大家也可以记住,在求装满背包有几种方法的情况下,递推公式一般为: -``` +```CPP dp[j] += dp[j - nums[i]]; ``` diff --git "a/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" "b/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" index e29e21073e..2fc807cd06 100644 --- "a/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" +++ "b/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" @@ -3,9 +3,10 @@

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

-# 动态规划:给你一些零钱,你要怎么凑? -## 518. 零钱兑换 II + + +# 518. 零钱兑换 II [力扣题目链接](https://leetcode.cn/problems/coin-change-ii/) @@ -15,22 +16,25 @@ 示例 1: -输入: amount = 5, coins = [1, 2, 5] -输出: 4 +* 输入: amount = 5, coins = [1, 2, 5] +* 输出: 4 + 解释: 有四种方式可以凑成总金额: -5=5 -5=2+2+1 -5=2+1+1+1 -5=1+1+1+1+1 + +* 5=5 +* 5=2+2+1 +* 5=2+1+1+1 +* 5=1+1+1+1+1 示例 2: -输入: amount = 3, coins = [2] -输出: 0 -解释: 只用面额2的硬币不能凑成总金额3。 + +* 输入: amount = 3, coins = [2] +* 输出: 0 +* 解释: 只用面额2的硬币不能凑成总金额3。 示例 3: -输入: amount = 10, coins = [10] -输出: 1 +* 输入: amount = 10, coins = [10] +* 输出: 1 注意,你可以假设: @@ -47,7 +51,7 @@ 对完全背包还不了解的同学,可以看这篇:[动态规划:关于完全背包,你该了解这些!](https://programmercarl.com/背包问题理论基础完全背包.html) -但本题和纯完全背包不一样,**纯完全背包是能否凑成总金额,而本题是要求凑成总金额的个数!** +但本题和纯完全背包不一样,**纯完全背包是凑成背包最大价值是多少,而本题是要求凑成总金额的物品组合个数!** 注意题目描述中是凑成总金额的硬币组合数,为什么强调是组合数呢? @@ -73,17 +77,21 @@ dp[j]:凑成总金额j的货币组合数为dp[j] 2. 确定递推公式 -dp[j] (考虑coins[i]的组合总和) 就是所有的dp[j - coins[i]](不考虑coins[i])相加。 +dp[j] 就是所有的dp[j - coins[i]](考虑coins[i]的情况)相加。 所以递推公式:dp[j] += dp[j - coins[i]]; -**这个递推公式大家应该不陌生了,我在讲解01背包题目的时候在这篇[动态规划:目标和!](https://programmercarl.com/0494.目标和.html)中就讲解了,求装满背包有几种方法,一般公式都是:dp[j] += dp[j - nums[i]];** +**这个递推公式大家应该不陌生了,我在讲解01背包题目的时候在这篇[494. 目标和](https://programmercarl.com/0494.目标和.html)中就讲解了,求装满背包有几种方法,公式都是:dp[j] += dp[j - nums[i]];** 3. dp数组如何初始化 -首先dp[0]一定要为1,dp[0] = 1是 递归公式的基础。 +首先dp[0]一定要为1,dp[0] = 1是 递归公式的基础。如果dp[0] = 0 的话,后面所有推导出来的值都是0了。 + +那么 dp[0] = 1 有没有含义,其实既可以说 凑成总金额0的货币组合数为1,也可以说 凑成总金额0的货币组合数为0,好像都没有毛病。 -从dp[i]的含义上来讲就是,凑成总金额0的货币组合数为1。 +但题目描述中,也没明确说 amount = 0 的情况,结果应该是多少。 + +这里我认为题目描述还是要说明一下,因为后台测试数据是默认,amount = 0 的情况,组合数为1的。 下标非0的dp[j]初始化为0,这样累计加dp[j - coins[i]]的时候才不会影响真正的dp[j] @@ -96,9 +104,9 @@ dp[j] (考虑coins[i]的组合总和) 就是所有的dp[j - coins[i]](不 **但本题就不行了!** -因为纯完全背包求得是能否凑成总和,和凑成总和的元素有没有顺序没关系,即:有顺序也行,没有顺序也行! +因为纯完全背包求得装满背包的最大价值是多少,和凑成总和的元素有没有顺序没关系,即:有顺序也行,没有顺序也行! -而本题要求凑成总和的组合数,元素之间要求没有顺序。 +而本题要求凑成总和的组合数,元素之间明确要求没有顺序。 所以纯完全背包是能凑成总和就行,不用管怎么凑的。 @@ -126,7 +134,7 @@ for (int i = 0; i < coins.size(); i++) { // 遍历物品 如果把两个for交换顺序,代码如下: -``` +```CPP for (int j = 0; j <= amount; j++) { // 遍历背包容量 for (int i = 0; i < coins.size(); i++) { // 遍历物品 if (j - coins[i] >= 0) dp[j] += dp[j - coins[i]]; @@ -169,7 +177,7 @@ public: ## 总结 -本题的递推公式,其实我们在[动态规划:目标和!](https://programmercarl.com/0494.目标和.html)中就已经讲过了,**而难点在于遍历顺序!** +本题的递推公式,其实我们在[494. 目标和](https://programmercarl.com/0494.目标和.html)中就已经讲过了,**而难点在于遍历顺序!** 在求装满背包有几种方案的时候,认清遍历顺序是非常关键的。 @@ -181,8 +189,6 @@ public: - - ## 其他语言版本 diff --git "a/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" "b/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" index 5412c5b594..bf4e708abb 100644 --- "a/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" +++ "b/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" @@ -15,17 +15,20 @@ 每一回合,从中选出任意两块石头,然后将它们一起粉碎。假设石头的重量分别为 x 和 y,且 x <= y。那么粉碎的可能结果如下: 如果 x == y,那么两块石头都会被完全粉碎; + 如果 x != y,那么重量为 x 的石头将会完全粉碎,而重量为 y 的石头新重量为 y-x。 + 最后,最多只会剩下一块石头。返回此石头最小的可能重量。如果没有石头剩下,就返回 0。 示例: -输入:[2,7,4,1,8,1] -输出:1 +* 输入:[2,7,4,1,8,1] +* 输出:1 + 解释: -组合 2 和 4,得到 2,所以数组转化为 [2,7,1,8,1], -组合 7 和 8,得到 1,所以数组转化为 [2,1,1,1], -组合 2 和 1,得到 1,所以数组转化为 [1,1,1], -组合 1 和 1,得到 0,所以数组转化为 [1],这就是最优值。 +* 组合 2 和 4,得到 2,所以数组转化为 [2,7,1,8,1], +* 组合 7 和 8,得到 1,所以数组转化为 [2,1,1,1], +* 组合 2 和 1,得到 1,所以数组转化为 [1,1,1], +* 组合 1 和 1,得到 0,所以数组转化为 [1],这就是最优值。 提示: @@ -51,7 +54,11 @@ 1. 确定dp数组以及下标的含义 -**dp[j]表示容量(这里说容量更形象,其实就是重量)为j的背包,最多可以背dp[j]这么重的石头**。 +**dp[j]表示容量(这里说容量更形象,其实就是重量)为j的背包,最多可以背最大重量为dp[j]**。 + +可以回忆一下01背包中,dp[j]的含义,容量为j的背包,最多可以装的价值为 dp[j]。 + +相对于 01背包,本题中,石头的重量是 stones[i],石头的价值也是 stones[i] ,可以 “最多可以装的价值为 dp[j]” == “最多可以背的重量为dp[j]” 2. 确定递推公式 @@ -61,7 +68,7 @@ 一些同学可能看到这dp[j - stones[i]] + stones[i]中 又有- stones[i] 又有+stones[i],看着有点晕乎。 -还是要牢记dp[j]的含义,要知道dp[j - stones[i]]为 容量为j - stones[i]的背包最大所背重量。 +大家可以再去看 dp[j]的含义。 3. dp数组如何初始化 diff --git "a/problems/\345\223\210\345\270\214\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\345\223\210\345\270\214\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" index 9366ca5ca6..41647d48e1 100644 --- "a/problems/\345\223\210\345\270\214\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\345\223\210\345\270\214\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -108,7 +108,7 @@ std::unordered_map 底层实现为哈希表,std::map 和std::multimap 的底 其他语言例如:java里的HashMap ,TreeMap 都是一样的原理。可以灵活贯通。 -虽然std::set、std::multiset 的底层实现是红黑树,不是哈希表,但是std::set、std::multiset 依然使用哈希函数来做映射,只不过底层的符号表使用了红黑树来存储数据,所以使用这些数据结构来解决映射问题的方法,我们依然称之为哈希法。 map也是一样的道理。 +虽然std::set、std::multiset 的底层实现是红黑树,不是哈希表,std::set、std::multiset 使用红黑树来索引和存储,不过给我们的使用方式,还是哈希法的使用方式,即key和value。所以使用这些数据结构来解决映射问题的方法,我们依然称之为哈希法。 map也是一样的道理。 这里在说一下,一些C++的经典书籍上 例如STL源码剖析,说到了hash_set hash_map,这个与unordered_set,unordered_map又有什么关系呢? diff --git "a/problems/\345\233\276\350\256\272\346\267\261\346\220\234\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\345\233\276\350\256\272\346\267\261\346\220\234\347\220\206\350\256\272\345\237\272\347\241\200.md" index cd66b819ed..9f965abb2a 100644 --- "a/problems/\345\233\276\350\256\272\346\267\261\346\220\234\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\345\233\276\350\256\272\346\267\261\346\220\234\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -6,10 +6,18 @@ # 深度优先搜索理论基础 -提到深度优先搜索(dfs),就不得不说和广度优先有什么区别(bfs) +录友们期待图论内容已久了,为什么鸽了这么久,主要是最近半年开始更新[代码随想录算法公开课](https://mp.weixin.qq.com/s/xncn6IHJGs45sJOChN6V_g),是开源在B站的算法视频,已经帮助非常多基础不好的录友学习算法。 + +录视频其实是非常累的,也要花很多时间,所以图论这边就没抽出时间来。 + +后面计划先给大家讲图论里大家特别需要的深搜和广搜。 + +以下,开始讲解深度优先搜索理论基础: ## dfs 与 bfs 区别 +提到深度优先搜索(dfs),就不得不说和广度优先有什么区别(bfs) + 先来了解dfs的过程,很多录友可能对dfs(深度优先搜索),bfs(广度优先搜索)分不清。 先给大家说一下两者大概的区别: @@ -35,7 +43,7 @@ ![图三](https://code-thinking-1253855093.file.myqcloud.com/pics/20220707094011.png) -路径2撤销了,改变了方向,走路径3(红色线), 接着也找到终点6。 那么撤销路径2,改为路径3,在dfs中其实就是回溯的过程(这一点很重要,很多录友,都不理解dfs代码中回溯是用来干什么的) +路径2撤销了,改变了方向,走路径3(红色线), 接着也找到终点6。 那么撤销路径2,改为路径3,在dfs中其实就是回溯的过程(这一点很重要,很多录友不理解dfs代码中回溯是用来干什么的) 又找到了一条从节点1到节点6的路径,又到黄河了,此时再回头,下图图四中,路径4撤销(回溯的过程),改为路径5。 @@ -55,7 +63,6 @@ * 搜索方向,是认准一个方向搜,直到碰壁之后在换方向 * 换方向是撤销原路径,改为节点链接的下一个路径,回溯的过程。 - ## 代码框架 正式因为dfs搜索可一个方向,并需要回溯,所以用递归的方式来实现是最方便的。 @@ -65,6 +72,7 @@ 有递归的地方就有回溯,那么回溯在哪里呢? 就地递归函数的下面,例如如下代码: + ``` void dfs(参数) { 处理节点 @@ -160,8 +168,6 @@ if (终止条件) { 终止添加不仅是结束本层递归,同时也是我们收获结果的时候。 另外,其实很多dfs写法,没有写终止条件,其实终止条件写在了, 下面dfs递归的逻辑里了,也就是不符合条件,直接不会向下递归。这里如果大家不理解的话,没关系,后面会有具体题目来讲解。 -* 841.钥匙和房间 -* 200. 岛屿数量 3. 处理目前搜索节点出发的路径 @@ -190,6 +196,9 @@ for (选择:本节点所连接的其他节点) { 以上如果大家都能理解了,其实搜索的代码就很好写,具体题目套用具体场景就可以了。 +后面我也会给大家安排具体练习的题目,依旧是代码随想录的风格,循序渐进由浅入深! + +

diff --git "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" index 06bda1477e..0f721bf94e 100644 --- "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" +++ "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" @@ -82,7 +82,7 @@ dp状态图如下: 就知道了,01背包中二维dp数组的两个for遍历的先后循序是可以颠倒了,一维dp数组的两个for循环先后循序一定是先遍历物品,再遍历背包容量。 -**在完全背包中,对于一维dp数组来说,其实两个for循环嵌套顺序同样无所谓!** +**在完全背包中,对于一维dp数组来说,其实两个for循环嵌套顺序是无所谓的!** 因为dp[j] 是根据 下标j之前所对应的dp[j]计算出来的。 只要保证下标j之前的dp[j]都是经过计算的就可以了。 From efe04ac4d91d8fcbb7db6080daeb3d7c495484d9 Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Sun, 27 Nov 2022 21:44:20 +0800 Subject: [PATCH 1275/3019] =?UTF-8?q?update=20=E6=A0=88=E4=B8=8E=E9=98=9F?= =?UTF-8?q?=E5=88=97=E7=90=86=E8=AE=BA=E5=9F=BA=E7=A1=80=EF=BC=9A=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E9=94=99=E5=AD=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\227\347\220\206\350\256\272\345\237\272\347\241\200.md" | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git "a/problems/\346\240\210\344\270\216\351\230\237\345\210\227\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\346\240\210\344\270\216\351\230\237\345\210\227\347\220\206\350\256\272\345\237\272\347\241\200.md" index 66b8691981..ee4506f4ca 100644 --- "a/problems/\346\240\210\344\270\216\351\230\237\345\210\227\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\346\240\210\344\270\216\351\230\237\345\210\227\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -12,7 +12,7 @@ ![栈与队列理论1](https://img-blog.csdnimg.cn/20210104235346563.png) -那么我这里在列出四个关于栈的问题,大家可以思考一下。以下是以C++为例,相信使用其他编程语言的同学也对应思考一下,自己使用的编程语言里栈和队列是什么样的。 +那么我这里再列出四个关于栈的问题,大家可以思考一下。以下是以C++为例,使用其他编程语言的同学也对应思考一下,自己使用的编程语言里栈和队列是什么样的。 1. C++中stack 是容器么? 2. 我们使用的stack是属于哪个版本的STL? @@ -23,7 +23,7 @@ 有的同学可能仅仅知道有栈和队列这么个数据结构,却不知道底层实现,也不清楚所使用栈和队列和STL是什么关系。 -所以这里我在给大家扫一遍基础知识, +所以这里我再给大家扫一遍基础知识, 首先大家要知道 栈和队列是STL(C++标准库)里面的两个数据结构。 @@ -83,7 +83,7 @@ std::queue> third; // 定义以list为底层容器的队列 所以STL 队列也不被归类为容器,而被归类为container adapter( 容器适配器)。 -我这里讲的都是C++ 语言中情况, 使用其他语言的同学也要思考栈与队列的底层实现问题, 不要对数据结构的使用浅尝辄止,而要深挖起内部原理,才能夯实基础。 +我这里讲的都是C++ 语言中的情况, 使用其他语言的同学也要思考栈与队列的底层实现问题, 不要对数据结构的使用浅尝辄止,而要深挖其内部原理,才能夯实基础。 From 02d1e6c57417e1db10f0447f1c124f0a98a59e4a Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Sun, 27 Nov 2022 22:14:54 +0800 Subject: [PATCH 1276/3019] =?UTF-8?q?update=200232.=E7=94=A8=E6=A0=88?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E9=98=9F=E5=88=97:=20=E6=9B=B4=E6=96=B0go?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...36\347\216\260\351\230\237\345\210\227.md" | 57 +++++++++---------- 1 file changed, 26 insertions(+), 31 deletions(-) diff --git "a/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" "b/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" index 5858f9e0e4..4983c93a64 100644 --- "a/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" +++ "b/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" @@ -38,14 +38,14 @@ queue.empty(); // 返回 false ## 思路 -《代码随想录》算法公开课:[栈的基本操作! | LeetCode:232.用栈实现队列](https://www.bilibili.com/video/BV1nY4y1w7VC),相信结合视频在看本篇题解,更有助于大家对链表的理解。 +《代码随想录》算法公开课:[栈的基本操作! | LeetCode:232.用栈实现队列](https://www.bilibili.com/video/BV1nY4y1w7VC),相信结合视频再看本篇题解,更有助于大家对链表的理解。 这是一道模拟题,不涉及到具体算法,考察的就是对栈和队列的掌握程度。 使用栈来模式队列的行为,如果仅仅用一个栈,是一定不行的,所以需要两个栈**一个输入栈,一个输出栈**,这里要注意输入栈和输出栈的关系。 -下面动画模拟以下队列的执行过程如下: +下面动画模拟以下队列的执行过程: 执行语句: queue.push(1); @@ -120,7 +120,7 @@ public: 这样的项目代码会越来越乱,**一定要懂得复用,功能相近的函数要抽象出来,不要大量的复制粘贴,很容易出问题!(踩过坑的人自然懂)** -工作中如果发现某一个功能自己要经常用,同事们可能也会用到,自己就花点时间把这个功能抽象成一个好用的函数或者工具类,不仅自己方便,也方面了同事们。 +工作中如果发现某一个功能自己要经常用,同事们可能也会用到,自己就花点时间把这个功能抽象成一个好用的函数或者工具类,不仅自己方便,也方便了同事们。 同事们就会逐渐认可你的工作态度和工作能力,自己的口碑都是这么一点一点积累起来的!在同事圈里口碑起来了之后,你就发现自己走上了一个正循环,以后的升职加薪才少不了你!哈哈哈 @@ -231,56 +231,51 @@ class MyQueue: Go: ```Go type MyQueue struct { - stack []int - back []int + stackIn []int //输入栈 + stackOut []int //输出栈 } -/** Initialize your data structure here. */ func Constructor() MyQueue { return MyQueue{ - stack: make([]int, 0), - back: make([]int, 0), + stackIn: make([]int, 0), + stackOut: make([]int, 0), } } -/** Push element x to the back of queue. */ +// 往输入栈做push func (this *MyQueue) Push(x int) { - for len(this.back) != 0 { - val := this.back[len(this.back)-1] - this.back = this.back[:len(this.back)-1] - this.stack = append(this.stack, val) - } - this.stack = append(this.stack, x) + this.stackIn = append(this.stackIn, x) } -/** Removes the element from in front of queue and returns that element. */ +// 在输出栈做pop,pop时如果输出栈数据为空,需要将输入栈全部数据导入,如果非空,则可直接使用 func (this *MyQueue) Pop() int { - for len(this.stack) != 0 { - val := this.stack[len(this.stack)-1] - this.stack = this.stack[:len(this.stack)-1] - this.back = append(this.back, val) - } - if len(this.back) == 0 { - return 0 + inLen, outLen := len(this.stackIn), len(this.stackOut) + if outLen == 0 { + if inLen == 0 { + return -1 + } + for i := inLen - 1; i >= 0; i-- { + this.stackOut = append(this.stackOut, this.stackIn[i]) + } + this.stackIn = []int{} //导出后清空 + outLen = len(this.stackOut) //更新长度值 } - val := this.back[len(this.back)-1] - this.back = this.back[:len(this.back)-1] + val := this.stackOut[outLen-1] + this.stackOut = this.stackOut[:outLen-1] return val } -/** Get the front element. */ func (this *MyQueue) Peek() int { val := this.Pop() - if val == 0 { - return 0 + if val == -1 { + return -1 } - this.back = append(this.back, val) + this.stackOut = append(this.stackOut, val) return val } -/** Returns whether the queue is empty. */ func (this *MyQueue) Empty() bool { - return len(this.stack) == 0 && len(this.back) == 0 + return len(this.stackIn) == 0 && len(this.stackOut) == 0 } ``` From 8b6140d2a629bdc907b4c90bef98e1a0ac9afdcc Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Sun, 27 Nov 2022 22:34:40 +0800 Subject: [PATCH 1277/3019] =?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:=20=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E9=94=99=E5=AD=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\237\345\210\227\345\256\236\347\216\260\346\240\210.md" | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git "a/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" "b/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" index 2f01527270..16b9e47cae 100644 --- "a/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" +++ "b/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" @@ -29,7 +29,7 @@ # 思路 -《代码随想录》算法公开课:[队列的基本操作! | LeetCode:225. 用队列实现栈](https://www.bilibili.com/video/BV1Fd4y1K7sm),相信结合视频在看本篇题解,更有助于大家对链表的理解。 +《代码随想录》算法公开课:[队列的基本操作! | LeetCode:225. 用队列实现栈](https://www.bilibili.com/video/BV1Fd4y1K7sm),相信结合视频再看本篇题解,更有助于大家对链表的理解。 (这里要强调是单向队列) @@ -44,7 +44,7 @@ 所以用栈实现队列, 和用队列实现栈的思路还是不一样的,这取决于这两个数据结构的性质。 -但是依然还是要用两个队列来模拟栈,只不过没有输入和输出的关系,而是另一个队列完全用又来备份的! +但是依然还是要用两个队列来模拟栈,只不过没有输入和输出的关系,而是另一个队列完全用来备份的! 如下面动画所示,**用两个队列que1和que2实现队列的功能,que2其实完全就是一个备份的作用**,把que1最后面的元素以外的元素都备份到que2,然后弹出最后面的元素,再把其他元素从que2导回que1。 @@ -116,7 +116,7 @@ public: 其实这道题目就是用一个队列就够了。 -**一个队列在模拟栈弹出元素的时候只要将队列头部的元素(除了最后一个元素外) 重新添加到队列尾部,此时在去弹出元素就是栈的顺序了。** +**一个队列在模拟栈弹出元素的时候只要将队列头部的元素(除了最后一个元素外) 重新添加到队列尾部,此时再去弹出元素就是栈的顺序了。** C++优化代码 From 8f783260e0b20cc7fa3ed3e220aa734f25f0ffc4 Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Sun, 27 Nov 2022 22:42:13 +0800 Subject: [PATCH 1278/3019] =?UTF-8?q?update=200020.=E6=9C=89=E6=95=88?= =?UTF-8?q?=E7=9A=84=E6=8B=AC=E5=8F=B7:=20=E4=BF=AE=E6=94=B9=E9=94=99?= =?UTF-8?q?=E5=AD=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" "b/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" index 69713c62fc..737fab86eb 100644 --- "a/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" +++ "b/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" @@ -76,7 +76,7 @@ cd a/b/c/../../ **一些同学,在面试中看到这种题目上来就开始写代码,然后就越写越乱。** -建议要写代码之前要分析好有哪几种不匹配的情况,如果不动手之前分析好,写出的代码也会有很多问题。 +建议在写代码之前要分析好有哪几种不匹配的情况,如果不在动手之前分析好,写出的代码也会有很多问题。 先来分析一下 这里有三种不匹配的情况, From 86d9a1084ff8dc7ebf5deac5ed42d214f7f486dc Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Sun, 27 Nov 2022 23:12:26 +0800 Subject: [PATCH 1279/3019] =?UTF-8?q?update=201047.=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E5=AD=97=E7=AC=A6=E4=B8=B2=E4=B8=AD=E7=9A=84=E6=89=80=E6=9C=89?= =?UTF-8?q?=E7=9B=B8=E9=82=BB=E9=87=8D=E5=A4=8D=E9=A1=B9:=20=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E9=94=99=E5=AD=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\270\351\202\273\351\207\215\345\244\215\351\241\271.md" | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git "a/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" "b/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" index ad729298d5..417c81d769 100644 --- "a/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" +++ "b/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" @@ -50,7 +50,7 @@ ![1047.删除字符串中的所有相邻重复项](https://code-thinking.cdn.bcebos.com/gifs/1047.删除字符串中的所有相邻重复项.gif) -从栈中弹出剩余元素,此时是字符串ac,因为从栈里弹出的元素是倒序的,所以在对字符串进行反转一下,就得到了最终的结果。 +从栈中弹出剩余元素,此时是字符串ac,因为从栈里弹出的元素是倒序的,所以再对字符串进行反转一下,就得到了最终的结果。 C++代码 : @@ -102,9 +102,9 @@ public: ## 题外话 -这道题目就像是我们玩过的游戏对对碰,如果相同的元素放在挨在一起就要消除。 +这道题目就像是我们玩过的游戏对对碰,如果相同的元素挨在一起就要消除。 -可能我们在玩游戏的时候感觉理所当然应该消除,但程序又怎么知道该如果消除呢,特别是消除之后又有新的元素可能挨在一起。 +可能我们在玩游戏的时候感觉理所当然应该消除,但程序又怎么知道该如何消除呢,特别是消除之后又有新的元素可能挨在一起。 此时游戏的后端逻辑就可以用一个栈来实现(我没有实际考察对对碰或者爱消除游戏的代码实现,仅从原理上进行推断)。 From 86119b88fc1001cc81c9b84ec3a46bbf8d712c1c Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Sun, 27 Nov 2022 23:43:00 +0800 Subject: [PATCH 1280/3019] =?UTF-8?q?update=200150.=E9=80=86=E6=B3=A2?= =?UTF-8?q?=E5=85=B0=E8=A1=A8=E8=BE=BE=E5=BC=8F=E6=B1=82=E5=80=BC:=20?= =?UTF-8?q?=E6=9B=B4=E6=96=B0js=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...76\345\274\217\346\261\202\345\200\274.md" | 90 ++++++++++--------- 1 file changed, 47 insertions(+), 43 deletions(-) diff --git "a/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" "b/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" index 78dfae3ea1..176ea6875e 100644 --- "a/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" +++ "b/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" @@ -51,7 +51,7 @@ ``` -逆波兰表达式:是一种后缀表达式,所谓后缀就是指算符写在后面。 +逆波兰表达式:是一种后缀表达式,所谓后缀就是指运算符写在后面。 平常使用的算式则是一种中缀表达式,如 ( 1 + 2 ) * ( 3 + 4 ) 。 @@ -61,11 +61,11 @@ * 去掉括号后表达式无歧义,上式即便写成 1 2 + 3 4 + * 也可以依据次序计算出正确结果。 -* 适合用栈操作运算:遇到数字则入栈;遇到算符则取出栈顶两个数字进行计算,并将结果压入栈中。 +* 适合用栈操作运算:遇到数字则入栈;遇到运算符则取出栈顶两个数字进行计算,并将结果压入栈中。 # 思路 -《代码随想录》算法视频公开课:[栈的最后表演! | LeetCode:150. 逆波兰表达式求值](https://www.bilibili.com/video/BV1kd4y1o7on),相信结合视频在看本篇题解,更有助于大家对本题的理解。 +《代码随想录》算法视频公开课:[栈的最后表演! | LeetCode:150. 逆波兰表达式求值](https://www.bilibili.com/video/BV1kd4y1o7on),相信结合视频再看本篇题解,更有助于大家对本题的理解。 在上一篇文章中[1047.删除字符串中的所有相邻重复项](https://programmercarl.com/1047.删除字符串中的所有相邻重复项.html)提到了 递归就是用栈来实现的。 @@ -73,7 +73,7 @@ 那么来看一下本题,**其实逆波兰表达式相当于是二叉树中的后序遍历**。 大家可以把运算符作为中间节点,按照后序遍历的规则画出一个二叉树。 -但我们没有必要从二叉树的角度去解决这个问题,只要知道逆波兰表达式是用后续遍历的方式把二叉树序列化了,就可以了。 +但我们没有必要从二叉树的角度去解决这个问题,只要知道逆波兰表达式是用后序遍历的方式把二叉树序列化了,就可以了。 在进一步看,本题中每一个子表达式要得出一个结果,然后拿这个结果再进行运算,那么**这岂不就是一个相邻字符串消除的过程,和[1047.删除字符串中的所有相邻重复项](https://programmercarl.com/1047.删除字符串中的所有相邻重复项.html)中的对对碰游戏是不是就非常像了。** @@ -118,9 +118,9 @@ public: 我们习惯看到的表达式都是中缀表达式,因为符合我们的习惯,但是中缀表达式对于计算机来说就不是很友好了。 -例如:4 + 13 / 5,这就是中缀表达式,计算机从左到右去扫描的话,扫到13,还要判断13后面是什么运算法,还要比较一下优先级,然后13还和后面的5做运算,做完运算之后,还要向前回退到 4 的位置,继续做加法,你说麻不麻烦! +例如:4 + 13 / 5,这就是中缀表达式,计算机从左到右去扫描的话,扫到13,还要判断13后面是什么运算符,还要比较一下优先级,然后13还和后面的5做运算,做完运算之后,还要向前回退到 4 的位置,继续做加法,你说麻不麻烦! -那么将中缀表达式,转化为后缀表达式之后:["4", "13", "5", "/", "+"] ,就不一样了,计算机可以利用栈里顺序处理,不需要考虑优先级了。也不用回退了, **所以后缀表达式对计算机来说是非常友好的。** +那么将中缀表达式,转化为后缀表达式之后:["4", "13", "5", "/", "+"] ,就不一样了,计算机可以利用栈来顺序处理,不需要考虑优先级了。也不用回退了, **所以后缀表达式对计算机来说是非常友好的。** 可以说本题不仅仅是一道好题,也展现出计算机的思考方式。 @@ -161,6 +161,24 @@ class Solution { } ``` +python3 + +```python +class Solution: + def evalRPN(self, tokens: List[str]) -> int: + stack = [] + for item in tokens: + if item not in {"+", "-", "*", "/"}: + stack.append(item) + else: + first_num, second_num = stack.pop(), stack.pop() + stack.append( + int(eval(f'{second_num} {item} {first_num}')) # 第一个出来的在运算符后面 + ) + return int(stack.pop()) # 如果一开始只有一个数,那么会是字符串形式的 + +``` + Go: ```Go func evalRPN(tokens []string) int { @@ -169,7 +187,7 @@ func evalRPN(tokens []string) int { val, err := strconv.Atoi(token) if err == nil { stack = append(stack, val) - } else { + } else { // 如果err不为nil说明不是数字 num1, num2 := stack[len(stack)-2], stack[(len(stack))-1] stack = stack[:len(stack)-2] switch token { @@ -191,27 +209,31 @@ func evalRPN(tokens []string) int { javaScript: ```js - -/** - * @param {string[]} tokens - * @return {number} - */ -var evalRPN = function(tokens) { - const s = new Map([ - ["+", (a, b) => a * 1 + b * 1], - ["-", (a, b) => b - a], - ["*", (a, b) => b * a], - ["/", (a, b) => (b / a) | 0] - ]); +var evalRPN = function (tokens) { const stack = []; - for (const i of tokens) { - if(!s.has(i)) { - stack.push(i); - continue; + for (const token of tokens) { + if (isNaN(Number(token))) { // 非数字 + const n2 = stack.pop(); // 出栈两个数字 + const n1 = stack.pop(); + switch (token) { // 判断运算符类型,算出新数入栈 + case "+": + stack.push(n1 + n2); + break; + case "-": + stack.push(n1 - n2); + break; + case "*": + stack.push(n1 * n2); + break; + case "/": + stack.push(n1 / n2 | 0); + break; + } + } else { // 数字 + stack.push(Number(token)); } - stack.push(s.get(i)(stack.pop(),stack.pop())) } - return stack.pop(); + return stack[0]; // 因没有遇到运算符而待在栈中的结果 }; ``` @@ -280,24 +302,6 @@ function evalRPN(tokens: string[]): number { }; ``` -python3 - -```python -class Solution: - def evalRPN(self, tokens: List[str]) -> int: - stack = [] - for item in tokens: - if item not in {"+", "-", "*", "/"}: - stack.append(item) - else: - first_num, second_num = stack.pop(), stack.pop() - stack.append( - int(eval(f'{second_num} {item} {first_num}')) # 第一个出来的在运算符后面 - ) - return int(stack.pop()) # 如果一开始只有一个数,那么会是字符串形式的 - -``` - Swift: ```Swift func evalRPN(_ tokens: [String]) -> Int { From 64a3c803b01c85d5741fcde29c75d25ffb0e7026 Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Mon, 28 Nov 2022 00:20:06 +0800 Subject: [PATCH 1281/3019] =?UTF-8?q?update=200239.=E6=BB=91=E5=8A=A8?= =?UTF-8?q?=E7=AA=97=E5=8F=A3=E6=9C=80=E5=A4=A7=E5=80=BC:=20=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E9=94=99=E5=AD=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...345\217\243\346\234\200\345\244\247\345\200\274.md" | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git "a/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" "b/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" index 40da879c3b..9f2e96a605 100644 --- "a/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" +++ "b/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" @@ -38,7 +38,7 @@ 难点是如何求一个区间里的最大值呢? (这好像是废话),暴力一下不就得了。 -暴力方法,遍历一遍的过程中每次从窗口中在找到最大的数值,这样很明显是O(n × k)的算法。 +暴力方法,遍历一遍的过程中每次从窗口中再找到最大的数值,这样很明显是O(n × k)的算法。 有的同学可能会想用一个大顶堆(优先级队列)来存放这个窗口里的k个数字,这样就可以知道最大的最大值是多少了, **但是问题是这个窗口是移动的,而大顶堆每次只能弹出最大值,我们无法移除其他数值,这样就造成大顶堆维护的不是滑动窗口里面的数值了。所以不能用大顶堆。** @@ -66,7 +66,7 @@ public: **可惜了,没有! 我们需要自己实现这么个队列。** -然后在分析一下,队列里的元素一定是要排序的,而且要最大值放在出队口,要不然怎么知道最大值呢。 +然后再分析一下,队列里的元素一定是要排序的,而且要最大值放在出队口,要不然怎么知道最大值呢。 但如果把窗口里的元素都放进队列里,窗口移动的时候,队列需要弹出元素。 @@ -74,9 +74,9 @@ public: 大家此时应该陷入深思..... -**其实队列没有必要维护窗口里的所有元素,只需要维护有可能成为窗口里最大值的元素就可以了,同时保证队里里的元素数值是由大到小的。** +**其实队列没有必要维护窗口里的所有元素,只需要维护有可能成为窗口里最大值的元素就可以了,同时保证队里的元素数值是由大到小的。** -那么这个维护元素单调递减的队列就叫做**单调队列,即单调递减或单调递增的队列。C++中没有直接支持单调队列,需要我们自己来一个单调队列** +那么这个维护元素单调递减的队列就叫做**单调队列,即单调递减或单调递增的队列。C++中没有直接支持单调队列,需要我们自己来实现一个单调队列** **不要以为实现的单调队列就是 对窗口里面的数进行排序,如果排序的话,那和优先级队列又有什么区别了呢。** @@ -185,7 +185,7 @@ public: }; ``` -在来看一下时间复杂度,使用单调队列的时间复杂度是 O(n)。 +再来看一下时间复杂度,使用单调队列的时间复杂度是 O(n)。 有的同学可能想了,在队列中 push元素的过程中,还有pop操作呢,感觉不是纯粹的O(n)。 From 380780256e51d2578f76bc49fdf685a904a0a3d5 Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Mon, 28 Nov 2022 00:28:16 +0800 Subject: [PATCH 1282/3019] =?UTF-8?q?update=200347.=E5=89=8DK=E4=B8=AA?= =?UTF-8?q?=E9=AB=98=E9=A2=91=E5=85=83=E7=B4=A0=20=E6=94=B9go=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E4=B8=80=E5=A4=84=E6=97=B6=E9=97=B4=E5=A4=8D=E6=9D=82?= =?UTF-8?q?=E5=BA=A6=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" "b/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" index 56dbaa33b3..60e6cee84f 100644 --- "a/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" +++ "b/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" @@ -271,7 +271,7 @@ func (h *IHeap) Pop() interface{}{ } -//方法二:利用O(logn)排序 +//方法二:利用O(nlogn)排序 func topKFrequent(nums []int, k int) []int { ans:=[]int{} map_num:=map[int]int{} From 2bc1a47c120a39d3a402332a84f7bc0d2481ed23 Mon Sep 17 00:00:00 2001 From: ZerenZhang2022 <118794589+ZerenZhang2022@users.noreply.github.com> Date: Sun, 27 Nov 2022 13:57:49 -0500 Subject: [PATCH 1283/3019] =?UTF-8?q?Update=200347.=E5=89=8DK=E4=B8=AA?= =?UTF-8?q?=E9=AB=98=E9=A2=91=E5=85=83=E7=B4=A0.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 原文打错字了:第207行应为“扫描所有频率的数值”,原文为“扫面所有频率的数值” --- ...\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" "b/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" index 56dbaa33b3..62bddbcd34 100644 --- "a/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" +++ "b/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" @@ -204,7 +204,7 @@ class Solution: #定义一个小顶堆,大小为k pri_que = [] #小顶堆 - #用固定大小为k的小顶堆,扫面所有频率的数值 + #用固定大小为k的小顶堆,扫描所有频率的数值 for key, freq in map_.items(): heapq.heappush(pri_que, (freq, key)) if len(pri_que) > k: #如果堆的大小大于了K,则队列弹出,保证堆的大小一直为k From 5a2b7b4ecdfd020203ae35c70b321c25f1112daa Mon Sep 17 00:00:00 2001 From: Flow-sandyu <72751523+Flow-sandyu@users.noreply.github.com> Date: Mon, 28 Nov 2022 15:16:21 +0800 Subject: [PATCH 1284/3019] =?UTF-8?q?Update=200235.=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=90=9C=E7=B4=A2=E6=A0=91=E7=9A=84=E6=9C=80=E8=BF=91=E5=85=AC?= =?UTF-8?q?=E5=85=B1=E7=A5=96=E5=85=88.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 补充B站视频链接 --- ...7\221\345\205\254\345\205\261\347\245\226\345\205\210.md" | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git "a/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" "b/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" index c90b3d8cd4..7e1323463b 100644 --- "a/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" +++ "b/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" @@ -35,8 +35,11 @@ * 所有节点的值都是唯一的。 * p、q 为不同节点且均存在于给定的二叉搜索树中。 -# 思路 +# 算法公开课 + +**《代码随想录》算法视频公开课:[二叉搜索树找祖先就有点不一样了!| 235. 二叉搜索树的最近公共祖先](https://www.bilibili.com/video/BV1Zt4y1F7ww?share_source=copy_web),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 +# 思路 做过[二叉树:公共祖先问题](https://programmercarl.com/0236.二叉树的最近公共祖先.html)题目的同学应该知道,利用回溯从底向上搜索,遇到一个节点的左子树里有p,右子树里有q,那么当前节点就是最近公共祖先。 From 8ecfbb79637cda0a9cbd8f236572a60184880e27 Mon Sep 17 00:00:00 2001 From: Flow-sandyu <72751523+Flow-sandyu@users.noreply.github.com> Date: Mon, 28 Nov 2022 15:24:04 +0800 Subject: [PATCH 1285/3019] =?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 补充B站视频链接 --- ...32\204\346\217\222\345\205\245\346\223\215\344\275\234.md" | 4 ++++ 1 file changed, 4 insertions(+) diff --git "a/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" "b/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" index 2e899e2284..2558743cf1 100644 --- "a/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" +++ "b/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" @@ -22,6 +22,10 @@ * -10^8 <= val <= 10^8 * 新值和原始二叉搜索树中的任意节点值都不同 +# 算法公开课 + +**《代码随想录》算法视频公开课:[原来这么简单? | LeetCode:701.二叉搜索树中的插入操作](https://www.bilibili.com/video/BV1Et4y1c78Y?share_source=copy_web),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 + # 思路 其实这道题目其实是一道简单题目,**但是题目中的提示:有多种有效的插入方式,还可以重构二叉搜索树,一下子吓退了不少人**,瞬间感觉题目复杂了很多。 From e588422356e053e927f24a7667c7b1f4dad88fd8 Mon Sep 17 00:00:00 2001 From: Flow-sandyu <72751523+Flow-sandyu@users.noreply.github.com> Date: Mon, 28 Nov 2022 15:26:02 +0800 Subject: [PATCH 1286/3019] =?UTF-8?q?Update=200450.=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=90=9C=E7=B4=A2=E6=A0=91=E4=B8=AD=E7=9A=84?= =?UTF-8?q?=E8=8A=82=E7=82=B9.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 补充B站视频链接 --- ...40\221\344\270\255\347\232\204\350\212\202\347\202\271.md" | 4 ++++ 1 file changed, 4 insertions(+) diff --git "a/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" "b/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" index d178596ead..f6621035de 100644 --- "a/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" +++ "b/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" @@ -23,6 +23,10 @@ ![450.删除二叉搜索树中的节点](https://img-blog.csdnimg.cn/20201020171048265.png) +# 算法公开课 + +**《代码随想录》算法视频公开课:[调整二叉树的结构最难!| LeetCode:450.删除二叉搜索树中的节点](https://www.bilibili.com/video/BV1tP41177us?share_source=copy_web),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 + # 思路 搜索树的节点删除要比节点增加复杂的多,有很多情况需要考虑,做好心里准备。 From d0758dce9e3328633bc3bff9aeacea6c312ba6b1 Mon Sep 17 00:00:00 2001 From: Flow-sandyu <72751523+Flow-sandyu@users.noreply.github.com> Date: Mon, 28 Nov 2022 15:27:43 +0800 Subject: [PATCH 1287/3019] =?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 补充B站视频链接 --- ...72\214\345\217\211\346\220\234\347\264\242\346\240\221.md" | 4 ++++ 1 file changed, 4 insertions(+) diff --git "a/problems/0669.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0669.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" index 98af3c26ab..09959719c4 100644 --- "a/problems/0669.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" +++ "b/problems/0669.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" @@ -18,6 +18,10 @@ ![669.修剪二叉搜索树1](https://img-blog.csdnimg.cn/20201014173219142.png) +# 算法公开课 + +**《代码随想录》算法视频公开课:[你修剪的方式不对,我来给你纠正一下!| LeetCode:669. 修剪二叉搜索树](https://www.bilibili.com/video/BV17P41177ud?share_source=copy_web),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 + # 思路 相信看到这道题目大家都感觉是一道简单题(事实上leetcode上也标明是简单)。 From 0ebb8dc5415e0913e7b0fc184d14abe178609502 Mon Sep 17 00:00:00 2001 From: Flow-sandyu <72751523+Flow-sandyu@users.noreply.github.com> Date: Mon, 28 Nov 2022 15:28:56 +0800 Subject: [PATCH 1288/3019] =?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 --- ...72\214\345\217\211\346\220\234\347\264\242\346\240\221.md" | 4 ++++ 1 file changed, 4 insertions(+) diff --git "a/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" index 9318a0e2e5..57080855b1 100644 --- "a/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" +++ "b/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" @@ -19,6 +19,10 @@ ![108.将有序数组转换为二叉搜索树](https://img-blog.csdnimg.cn/20201022164420763.png) +# 算法公开课 + +**《代码随想录》算法视频公开课:[构造平衡二叉搜索树!| LeetCode:108.将有序数组转换为二叉搜索树](https://www.bilibili.com/video/BV1uR4y1X7qL?share_source=copy_web),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 + # 思路 做这道题目之前大家可以了解一下这几道: From 51ab1648607b991cf58e5aef018410467201af2a Mon Sep 17 00:00:00 2001 From: Flow-sandyu <72751523+Flow-sandyu@users.noreply.github.com> Date: Mon, 28 Nov 2022 15:29:47 +0800 Subject: [PATCH 1289/3019] =?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 --- ...15\242\344\270\272\347\264\257\345\212\240\346\240\221.md" | 4 ++++ 1 file changed, 4 insertions(+) diff --git "a/problems/0538.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md" "b/problems/0538.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md" index 823771b1d7..c9c8a2e7dc 100644 --- "a/problems/0538.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md" +++ "b/problems/0538.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md" @@ -43,6 +43,10 @@ * 树中的所有值 互不相同 。 * 给定的树为二叉搜索树。 +# 算法公开课 + +**《代码随想录》算法视频公开课:[普大喜奔!二叉树章节已全部更完啦!| LeetCode:538.把二叉搜索树转换为累加树](https://www.bilibili.com/video/BV1d44y1f7wP?share_source=copy_web),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 + # 思路 一看到累加树,相信很多小伙伴都会疑惑:如何累加?遇到一个节点,然后在遍历其他节点累加?怎么一想这么麻烦呢。 From 8d04e8a3804b1dd7538104cb9953451109256976 Mon Sep 17 00:00:00 2001 From: fw_qaq <82551626+Jack-Zhang-1314@users.noreply.github.com> Date: Mon, 28 Nov 2022 17:08:58 +0800 Subject: [PATCH 1290/3019] =?UTF-8?q?Update=200098.=E9=AA=8C=E8=AF=81?= =?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 --- ...11\346\220\234\347\264\242\346\240\221.md" | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git "a/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" index bb38ae3577..262ad18c54 100644 --- "a/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" +++ "b/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" @@ -639,6 +639,29 @@ object Solution { } ``` +## rust + +递归: + +```rust +impl Solution { + pub fn is_valid_bst(root: Option>>) -> bool { + Self::valid_bst(i64::MIN, i64::MAX, root) + } + pub fn valid_bst(low: i64, upper: i64, root: Option>>) -> bool { + if root.is_none() { + return true; + } + let root = root.as_ref().unwrap().borrow(); + if root.val as i64 <= low || root.val as i64 >= upper { + return false; + } + Self::valid_bst(low, root.val as i64, root.left.clone()) + && Self::valid_bst(root.val as i64, upper, root.right.clone()) + } +} +``` +

From c230c2d871b2b9a93fbc137b17fb5ef8b1eea48a Mon Sep 17 00:00:00 2001 From: fw_qaq <82551626+Jack-Zhang-1314@users.noreply.github.com> Date: Mon, 28 Nov 2022 17:23:00 +0800 Subject: [PATCH 1291/3019] =?UTF-8?q?Update=200098.=E9=AA=8C=E8=AF=81?= =?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 --- ...11\346\220\234\347\264\242\346\240\221.md" | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git "a/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" index 262ad18c54..a925e36adb 100644 --- "a/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" +++ "b/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" @@ -662,6 +662,32 @@ impl Solution { } ``` +辅助数组: + +```rust +impl Solution { + pub fn is_valid_bst(root: Option>>) -> bool { + let mut vec = vec![]; + Self::valid_bst(root, &mut vec); + for i in 1..vec.len() { + if vec[i] <= vec[i - 1] { + return false; + } + } + true + } + pub fn valid_bst(root: Option>>, mut v: &mut Vec) { + if root.is_none() { + return; + } + let node = root.as_ref().unwrap().borrow(); + Self::valid_bst(node.left.clone(), v); + v.push(node.val as i64); + Self::valid_bst(node.right.clone(), v); + } +} +``` +

From 00f080bc75ac4d905442acf920edc20fcd2daf6b Mon Sep 17 00:00:00 2001 From: fw_qaq <82551626+Jack-Zhang-1314@users.noreply.github.com> Date: Mon, 28 Nov 2022 23:47:47 +0800 Subject: [PATCH 1292/3019] =?UTF-8?q?Update=200530.=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=90=9C=E7=B4=A2=E6=A0=91=E7=9A=84=E6=9C=80=E5=B0=8F=E7=BB=9D?= =?UTF-8?q?=E5=AF=B9=E5=B7=AE.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...17\347\273\235\345\257\271\345\267\256.md" | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git "a/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" "b/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" index ad4f46d86c..d1c1e1d44d 100644 --- "a/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" +++ "b/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" @@ -515,6 +515,35 @@ object Solution { } ``` +## rust + +构建二叉树的有序数组: + +```rust +use std::cell::RefCell; +use std::rc::Rc; +impl Solution { + pub fn get_minimum_difference(root: Option>>) -> i32 { + let mut vec = vec![]; + Self::traversal(root, &mut vec); + let mut min = i32::MAX; + for i in 1..vec.len() { + min = min.min(vec[i] - vec[i - 1]) + } + min + } + pub fn traversal(root: Option>>, v: &mut Vec) { + if root.is_none() { + return; + } + let node = root.as_ref().unwrap().borrow(); + Self::traversal(node.left.clone(), v); + v.push(node.val); + Self::traversal(node.right.clone(), v); + } +} +``` +

From e60af48906349690cb23ee74cd1584674de66299 Mon Sep 17 00:00:00 2001 From: fw_qaq <82551626+Jack-Zhang-1314@users.noreply.github.com> Date: Tue, 29 Nov 2022 01:00:18 +0800 Subject: [PATCH 1293/3019] =?UTF-8?q?Update=200530.=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=90=9C=E7=B4=A2=E6=A0=91=E7=9A=84=E6=9C=80=E5=B0=8F=E7=BB=9D?= =?UTF-8?q?=E5=AF=B9=E5=B7=AE.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...17\347\273\235\345\257\271\345\267\256.md" | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git "a/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" "b/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" index d1c1e1d44d..984fefe51d 100644 --- "a/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" +++ "b/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" @@ -544,6 +544,38 @@ impl Solution { } ``` +递归中解决 + +```rust +static mut PRE: Option = None; +static mut MIN: i32 = i32::MAX; + +impl Solution { + pub fn get_minimum_difference(root: Option>>) -> i32 { + unsafe { + PRE = None; + MIN = i32::MAX; + Self::inorder(root); + MIN + } + } + pub fn inorder(root: Option>>) { + if root.is_none() { + return; + } + let node = root.as_ref().unwrap().borrow(); + Self::inorder(node.left.clone()); + unsafe { + if let Some(pre) = PRE { + MIN = (node.val - pre).min(MIN).abs(); + } + PRE = Some(node.val) + } + Self::inorder(node.right.clone()); + } +} +``` +

From 72f38fa8c41d7c53caa5cb7566206d88e9953497 Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Tue, 29 Nov 2022 11:47:04 +0800 Subject: [PATCH 1294/3019] =?UTF-8?q?update=20=E4=BA=8C=E5=8F=89=E6=A0=91?= =?UTF-8?q?=E7=90=86=E8=AE=BA=E5=9F=BA=E7=A1=80:=20=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E9=94=99=E5=AD=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\221\347\220\206\350\256\272\345\237\272\347\241\200.md" | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" index 034229602a..21e2039f7a 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -14,7 +14,7 @@ 二叉树大纲 -说道二叉树,大家对于二叉树其实都很熟悉了,本文呢我也不想教科书式的把二叉树的基础内容在啰嗦一遍,所以一下我讲的都是一些比较重点的内容。 +说到二叉树,大家对于二叉树其实都很熟悉了,本文呢我也不想教科书式的把二叉树的基础内容再啰嗦一遍,所以以下我讲的都是一些比较重点的内容。 相信只要耐心看完,都会有所收获。 @@ -83,7 +83,7 @@ 那么链式存储方式就用指针, 顺序存储的方式就是用数组。 -顾名思义就是顺序存储的元素在内存是连续分布的,而链式存储则是通过指针把分布在散落在各个地址的节点串联一起。 +顾名思义就是顺序存储的元素在内存是连续分布的,而链式存储则是通过指针把分布在各个地址的节点串联一起。 链式存储如图: @@ -143,7 +143,7 @@ 最后再说一说二叉树中深度优先和广度优先遍历实现方式,我们做二叉树相关题目,经常会使用递归的方式来实现深度优先遍历,也就是实现前中后序遍历,使用递归是比较方便的。 -**之前我们讲栈与队列的时候,就说过栈其实就是递归的一种是实现结构**,也就说前中后序遍历的逻辑其实都是可以借助栈使用非递归的方式来实现的。 +**之前我们讲栈与队列的时候,就说过栈其实就是递归的一种实现结构**,也就说前中后序遍历的逻辑其实都是可以借助栈使用非递归的方式来实现的。 而广度优先遍历的实现一般使用队列来实现,这也是队列先进先出的特点所决定的,因为需要先进先出的结构,才能一层一层的来遍历二叉树。 From 16434b0491749fb7d9f39cf3a32d95eb36442e03 Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Tue, 29 Nov 2022 11:54:08 +0800 Subject: [PATCH 1295/3019] =?UTF-8?q?update=20=E4=BA=8C=E5=8F=89=E6=A0=91?= =?UTF-8?q?=E7=9A=84=E9=80=92=E5=BD=92=E9=81=8D=E5=8E=86=EF=BC=9A=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E9=94=99=E5=AD=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...32\204\351\200\222\345\275\222\351\201\215\345\216\206.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" index 788610403b..5a9a670add 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" @@ -36,13 +36,13 @@ **以下以前序遍历为例:** -1. **确定递归函数的参数和返回值**:因为要打印出前序遍历节点的数值,所以参数里需要传入vector在放节点的数值,除了这一点就不需要在处理什么数据了也不需要有返回值,所以递归函数返回类型就是void,代码如下: +1. **确定递归函数的参数和返回值**:因为要打印出前序遍历节点的数值,所以参数里需要传入vector来放节点的数值,除了这一点就不需要再处理什么数据了也不需要有返回值,所以递归函数返回类型就是void,代码如下: ```cpp void traversal(TreeNode* cur, vector& vec) ``` -2. **确定终止条件**:在递归的过程中,如何算是递归结束了呢,当然是当前遍历的节点是空了,那么本层递归就要要结束了,所以如果当前遍历的这个节点是空,就直接return,代码如下: +2. **确定终止条件**:在递归的过程中,如何算是递归结束了呢,当然是当前遍历的节点是空了,那么本层递归就要结束了,所以如果当前遍历的这个节点是空,就直接return,代码如下: ```cpp if (cur == NULL) return; From f06d81c233d63a5539a37499de10bc97af87407f Mon Sep 17 00:00:00 2001 From: fw_qaq <82551626+Jack-Zhang-1314@users.noreply.github.com> Date: Tue, 29 Nov 2022 12:48:10 +0800 Subject: [PATCH 1296/3019] =?UTF-8?q?Update=200530.=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=90=9C=E7=B4=A2=E6=A0=91=E7=9A=84=E6=9C=80=E5=B0=8F=E7=BB=9D?= =?UTF-8?q?=E5=AF=B9=E5=B7=AE.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...17\347\273\235\345\257\271\345\267\256.md" | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git "a/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" "b/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" index 984fefe51d..8c47b633ea 100644 --- "a/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" +++ "b/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" @@ -576,6 +576,38 @@ impl Solution { } ``` +迭代 + +```rust +impl Solution { + pub fn get_minimum_difference(mut root: Option>>) -> i32 { + if root.is_none() { + return 0; + } + let mut stack = vec![]; + let mut pre = -1; + let mut res = i32::MAX; + while root.is_some() || !stack.is_empty() { + while let Some(node) = root { + root = node.borrow().left.clone(); + stack.push(node); + } + + let node = stack.pop().unwrap(); + + if pre >= 0 { + res = res.min(node.borrow().val - pre); + } + + pre = node.borrow().val; + + root = node.borrow().right.clone(); + } + res + } +} +``` +

From 26aec30440761113a1ddb9e09a52db866561f1e9 Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Tue, 29 Nov 2022 14:03:05 +0800 Subject: [PATCH 1297/3019] =?UTF-8?q?update=200102.=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=A0=91=E7=9A=84=E5=B1=82=E5=BA=8F=E9=81=8D=E5=8E=86:=20?= =?UTF-8?q?=E4=BC=98=E5=8C=96=20js=20=E5=92=8C=20go=20=E7=9A=84=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E9=A3=8E=E6=A0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...02\345\272\217\351\201\215\345\216\206.md" | 482 +++++++++--------- 1 file changed, 248 insertions(+), 234 deletions(-) diff --git "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" index 1a01c0ae9c..9985971f2c 100644 --- "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" +++ "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" @@ -47,7 +47,7 @@ 层序遍历一个二叉树。就是从左到右一层一层的去遍历二叉树。这种遍历的方式和我们之前讲过的都不太一样。 -需要借用一个辅助数据结构即队列来实现,**队列先进先出,符合一层一层遍历的逻辑,而是用栈先进后出适合模拟深度优先遍历也就是递归的逻辑。** +需要借用一个辅助数据结构即队列来实现,**队列先进先出,符合一层一层遍历的逻辑,而用栈先进后出适合模拟深度优先遍历也就是递归的逻辑。** **而这种层序遍历方式就是图论中的广度优先遍历,只不过我们应用在二叉树上。** @@ -106,50 +106,6 @@ public: }; ``` -python3代码: - - -```python - -class Solution: - """二叉树层序遍历迭代解法""" - - def levelOrder(self, root: TreeNode) -> List[List[int]]: - results = [] - if not root: - return results - - from collections import deque - que = deque([root]) - - while que: - size = len(que) - result = [] - for _ in range(size): - cur = que.popleft() - result.append(cur.val) - if cur.left: - que.append(cur.left) - if cur.right: - que.append(cur.right) - results.append(result) - - return results -``` -```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 @@ -206,6 +162,51 @@ class Solution { } ``` +python3代码: + + +```python + +class Solution: + """二叉树层序遍历迭代解法""" + + def levelOrder(self, root: TreeNode) -> List[List[int]]: + results = [] + if not root: + return results + + from collections import deque + que = deque([root]) + + while que: + size = len(que) + result = [] + for _ in range(size): + cur = que.popleft() + result.append(cur.val) + if cur.left: + que.append(cur.left) + if cur.right: + que.append(cur.right) + results.append(result) + + return results +``` +```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 +``` + go: ```go @@ -243,28 +244,31 @@ func levelOrder(root *TreeNode) [][]int { 102. 二叉树的层序遍历 */ func levelOrder(root *TreeNode) [][]int { - res:=[][]int{} - if root==nil{//防止为空 + res := [][]int{} + if root == nil{//防止为空 return res } - queue:=list.New() + queue := list.New() queue.PushBack(root) + var tmpArr []int - for queue.Len()>0 { - length:=queue.Len()//保存当前层的长度,然后处理当前层(十分重要,防止添加下层元素影响判断层中元素的个数) - for i:=0;i 0 { + length := queue.Len() //保存当前层的长度,然后处理当前层(十分重要,防止添加下层元素影响判断层中元素的个数) + for i := 0; i < length; i++ { + node := queue.Remove(queue.Front()).(*TreeNode) //出队列 + if node.Left != nil { queue.PushBack(node.Left) } - if node.Right!=nil{ + if node.Right != nil { queue.PushBack(node.Right) } - tmpArr=append(tmpArr,node.Val)//将值加入本层切片中 + tmpArr = append(tmpArr, node.Val) //将值加入本层切片中 } - res=append(res,tmpArr)//放入结果集 - tmpArr=[]int{}//清空层的数据 + res = append(res, tmpArr) //放入结果集 + tmpArr = []int{} //清空层的数据 } + return res } ``` @@ -274,22 +278,22 @@ javascript代码: ```javascript var levelOrder = function(root) { //二叉树的层序遍历 - let res=[],queue=[]; + let res = [], queue = []; queue.push(root); - if(root===null){ + if(root === null) { return res; } - while(queue.length!==0){ + while(queue.length !== 0) { // 记录当前层级节点数 - let length=queue.length; + let length = queue.length; //存放每一层的节点 - let curLevel=[]; - for(let i=0;i0{ - length:=queue.Len() - tmp:=[]int{} - for i:=0;i 0 { + length := queue.Len() + tmp := []int{} + for i := 0; i < length; i++ { + node := queue.Remove(queue.Front()).(*TreeNode) + if node.Left != nil { queue.PushBack(node.Left) } - if node.Right!=nil{ + if node.Right != nil { queue.PushBack(node.Right) } - tmp=append(tmp,node.Val) + tmp = append(tmp, node.Val) } - res=append(res,tmp) + res=append(res, tmp) } + //反转结果集 - for i:=0;i0{ - length:=queue.Len()//记录当前层的数量 + for queue.Len() > 0 { + length := queue.Len() //记录当前层的数量 var tmp []int - for T:=0;Tnode.val?max:node.val; - node.left&&queue.push(node.left); - node.right&&queue.push(node.right); + max = max > node.val ? max : node.val; + node.left && queue.push(node.left); + node.right && queue.push(node.right); } //把每一层的最大值放到res数组 res.push(max); } + return res; }; ``` @@ -1964,6 +1981,46 @@ class Solution: first = first.left # 从本层扩展到下一层 return root ``` +go: + +```GO +/** +116. 填充每个节点的下一个右侧节点指针 +117. 填充每个节点的下一个右侧节点指针 II + */ + +func connect(root *Node) *Node { + if root == nil { //防止为空 + return root + } + queue := list.New() + queue.PushBack(root) + tmpArr := make([]*Node, 0) + for queue.Len() > 0 { + length := queue.Len() //保存当前层的长度,然后处理当前层(十分重要,防止添加下层元素影响判断层中元素的个数) + for i := 0; i < length; i++ { + node := queue.Remove(queue.Front()).(*Node) //出队列 + if node.Left != nil { + queue.PushBack(node.Left) + } + if node.Right != nil { + queue.PushBack(node.Right) + } + tmpArr = append(tmpArr, node) //将值加入本层切片中 + } + if len(tmpArr) > 1 { + // 遍历每层元素,指定next + for i := 0; i < len(tmpArr)-1; i++ { + tmpArr[i].Next = tmpArr[i+1] + } + } + tmpArr = []*Node{} //清空层的数据 + } + return root +} + +``` + JavaScript: ```javascript @@ -1986,7 +2043,7 @@ var connect = function(root) { let queue = [root]; while (queue.length) { let n = queue.length; - for (let i=0; i 0 { - length := queue.Len() //保存当前层的长度,然后处理当前层(十分重要,防止添加下层元素影响判断层中元素的个数) - for i := 0; i < length; i++ { - node := queue.Remove(queue.Front()).(*Node) //出队列 - if node.Left != nil { - queue.PushBack(node.Left) - } - if node.Right != nil { - queue.PushBack(node.Right) - } - tmpArr = append(tmpArr, node) //将值加入本层切片中 - } - if len(tmpArr) > 1 { - // 遍历每层元素,指定next - for i := 0; i < len(tmpArr)-1; i++ { - tmpArr[i].Next = tmpArr[i+1] - } - } - tmpArr = []*Node{} //清空层的数据 - } - return root -} - -``` - Swift: ```swift @@ -2226,6 +2243,45 @@ class Solution: return root ``` +go: + +```GO +/** +116. 填充每个节点的下一个右侧节点指针 +117. 填充每个节点的下一个右侧节点指针 II + */ + +func connect(root *Node) *Node { + if root == nil { //防止为空 + return root + } + queue := list.New() + queue.PushBack(root) + tmpArr := make([]*Node, 0) + for queue.Len() > 0 { + length := queue.Len() //保存当前层的长度,然后处理当前层(十分重要,防止添加下层元素影响判断层中元素的个数) + for i := 0; i < length; i++ { + node := queue.Remove(queue.Front()).(*Node) //出队列 + if node.Left != nil { + queue.PushBack(node.Left) + } + if node.Right != nil { + queue.PushBack(node.Right) + } + tmpArr = append(tmpArr, node) //将值加入本层切片中 + } + if len(tmpArr) > 1 { + // 遍历每层元素,指定next + for i := 0; i < len(tmpArr)-1; i++ { + tmpArr[i].Next = tmpArr[i+1] + } + } + tmpArr = []*Node{} //清空层的数据 + } + return root +} +``` + JavaScript: ```javascript /** @@ -2284,44 +2340,6 @@ function connect(root: Node | null): Node | null { }; ``` -go: - -```GO -/** -116. 填充每个节点的下一个右侧节点指针 -117. 填充每个节点的下一个右侧节点指针 II - */ - -func connect(root *Node) *Node { - if root == nil { //防止为空 - return root - } - queue := list.New() - queue.PushBack(root) - tmpArr := make([]*Node, 0) - for queue.Len() > 0 { - length := queue.Len() //保存当前层的长度,然后处理当前层(十分重要,防止添加下层元素影响判断层中元素的个数) - for i := 0; i < length; i++ { - node := queue.Remove(queue.Front()).(*Node) //出队列 - if node.Left != nil { - queue.PushBack(node.Left) - } - if node.Right != nil { - queue.PushBack(node.Right) - } - tmpArr = append(tmpArr, node) //将值加入本层切片中 - } - if len(tmpArr) > 1 { - // 遍历每层元素,指定next - for i := 0; i < len(tmpArr)-1; i++ { - tmpArr[i].Next = tmpArr[i+1] - } - } - tmpArr = []*Node{} //清空层的数据 - } - return root -} -``` Swift: ```swift @@ -2461,7 +2479,6 @@ class Solution { } ``` - Python: ```python 3 class Solution: @@ -2498,20 +2515,20 @@ Go: * } */ func maxDepth(root *TreeNode) int { - ans:=0 - if root==nil{ + ans := 0 + if root == nil { return 0 } - queue:=list.New() + queue := list.New() queue.PushBack(root) - for queue.Len()>0{ - length:=queue.Len() - for i:=0;i 0 { + length := queue.Len() + for i := 0; i < length; i++ { + node := queue.Remove(queue.Front()).(*TreeNode) + if node.Left != nil { queue.PushBack(node.Left) } - if node.Right!=nil{ + if node.Right != nil { queue.PushBack(node.Right) } } @@ -2521,8 +2538,6 @@ func maxDepth(root *TreeNode) int { } ``` - - JavaScript: ```javascript /** @@ -2763,30 +2778,29 @@ Go: * } */ func minDepth(root *TreeNode) int { - ans:=0 - if root==nil{ + ans := 0 + if root == nil { return 0 } - queue:=list.New() + queue := list.New() queue.PushBack(root) - for queue.Len()>0{ - length:=queue.Len() - for i:=0;i 0 { + length := queue.Len() + for i := 0; i < length; i++ { + node := queue.Remove(queue.Front()).(*TreeNode) + if node.Left == nil && node.Right == nil { //当前节点没有左右节点,则代表此层是最小层 + return ans+1 //返回当前层 ans代表是上一层 } - if node.Left!=nil{ + if node.Left != nil { queue.PushBack(node.Left) } - if node.Right!=nil{ + if node.Right != nil { queue.PushBack(node.Right) } } ans++//记录层数 - - } + return ans+1 } ``` From 8ca827b6f9a5e385b207f5f942dbf158afb344d5 Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Tue, 29 Nov 2022 14:41:26 +0800 Subject: [PATCH 1298/3019] =?UTF-8?q?update=200226.=E7=BF=BB=E8=BD=AC?= =?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=A0=91:=20=E4=BC=98=E5=8C=96=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E9=A3=8E=E6=A0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...54\344\272\214\345\217\211\346\240\221.md" | 179 +++++++++--------- 1 file changed, 89 insertions(+), 90 deletions(-) diff --git "a/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" "b/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" index 3136c0be91..011c695d7a 100644 --- "a/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" @@ -104,7 +104,7 @@ public: ### 深度优先遍历 -[二叉树:听说递归能做的,栈也能做!](https://programmercarl.com/二叉树的迭代遍历.html)中给出了前中后序迭代方式的写法,所以本地可以很轻松的切出如下迭代法的代码: +[二叉树:听说递归能做的,栈也能做!](https://programmercarl.com/二叉树的迭代遍历.html)中给出了前中后序迭代方式的写法,所以本题可以很轻松的写出如下迭代法的代码: C++代码迭代法(前序遍历) @@ -126,7 +126,7 @@ public: } }; ``` -如果这个代码看不懂的话可以在回顾一下[二叉树:听说递归能做的,栈也能做!](https://programmercarl.com/二叉树的迭代遍历.html)。 +如果这个代码看不懂的话可以再回顾一下[二叉树:听说递归能做的,栈也能做!](https://programmercarl.com/二叉树的迭代遍历.html)。 我们在[二叉树:前中后序迭代方式的统一写法](https://programmercarl.com/二叉树的统一迭代法.html)中介绍了统一的写法,所以,本题也只需将文中的代码少做修改便可。 @@ -257,8 +257,7 @@ public: ## 其他语言版本 -### Java - +Java ```Java //DFS递归 class Solution { @@ -294,8 +293,8 @@ class Solution { while (size-- > 0) { TreeNode node = deque.poll(); swap(node); - if (node.left != null) {deque.offer(node.left);} - if (node.right != null) {deque.offer(node.right);} + if (node.left != null) deque.offer(node.left); + if (node.right != null) deque.offer(node.right); } } return root; @@ -309,7 +308,7 @@ class Solution { } ``` -### Python +Python 递归法:前序遍历: ```python @@ -361,16 +360,15 @@ class Solution: return root ``` -### Go +Go 递归版本的前序遍历 - ```Go func invertTree(root *TreeNode) *TreeNode { - if root ==nil{ + if root == nil { return nil } - root.Left,root.Right=root.Right,root.Left//交换 + root.Left, root.Right = root.Right, root.Left //交换 invertTree(root.Left) invertTree(root.Right) @@ -383,12 +381,14 @@ func invertTree(root *TreeNode) *TreeNode { ```go func invertTree(root *TreeNode) *TreeNode { - if root==nil{ + if root == nil { return root } - invertTree(root.Left)//遍历左节点 - invertTree(root.Right)//遍历右节点 - root.Left,root.Right=root.Right,root.Left//交换 + + invertTree(root.Left) //遍历左节点 + invertTree(root.Right) //遍历右节点 + root.Left, root.Right = root.Right, root.Left //交换 + return root } ``` @@ -397,18 +397,19 @@ func invertTree(root *TreeNode) *TreeNode { ```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 + 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 + node = stack[len(stack)-1] + stack = stack[:len(stack)-1] + node = node.Right } + return root } ``` @@ -417,25 +418,26 @@ func invertTree(root *TreeNode) *TreeNode { ```go func invertTree(root *TreeNode) *TreeNode { - stack:=[]*TreeNode{} - node:=root + stack := []*TreeNode{} + node := root var prev *TreeNode - for node!=nil||len(stack)>0{ - for node!=nil{ - stack=append(stack,node) - node=node.Left + 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 + 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 } ``` @@ -444,21 +446,21 @@ func invertTree(root *TreeNode) *TreeNode { ```go func invertTree(root *TreeNode) *TreeNode { - if root==nil{ + if root == nil{ return root } - queue:=list.New() - node:=root + queue := list.New() + node := root queue.PushBack(node) - for queue.Len()>0{ - length:=queue.Len() - for i:=0;i 0 { + length := queue.Len() + for i := 0; i < length; i++ { + e := queue.Remove(queue.Front()).(*TreeNode) + e.Left, e.Right = e.Right, e.Left //交换 + if e.Left != nil { queue.PushBack(e.Left) } - if e.Right!=nil{ + if e.Right != nil { queue.PushBack(e.Right) } } @@ -467,7 +469,7 @@ func invertTree(root *TreeNode) *TreeNode { } ``` -### JavaScript +JavaScript 使用递归版本的前序遍历 ```javascript @@ -487,31 +489,31 @@ var invertTree = function(root) { ```javascript var invertTree = function(root) { //我们先定义节点交换函数 - const invertNode=function(root,left,right){ - let temp=left; - left=right; - right=temp; - root.left=left; - root.right=right; + const invertNode = function(root, left, right) { + let temp = left; + left = right; + right = temp; + root.left = left; + root.right = right; } //使用迭代方法的前序遍历 - let stack=[]; - if(root===null){ + let stack = []; + if(root === null) { return root; } stack.push(root); - while(stack.length){ - let node=stack.pop(); - if(node!==null){ + while(stack.length) { + let node = stack.pop(); + if(node !== null) { //前序遍历顺序中左右 入栈顺序是前序遍历的倒序右左中 - node.right&&stack.push(node.right); - node.left&&stack.push(node.left); + node.right && stack.push(node.right); + node.left && stack.push(node.left); stack.push(node); stack.push(null); - }else{ - node=stack.pop(); + } else { + node = stack.pop(); //节点处理逻辑 - invertNode(node,node.left,node.right); + invertNode(node, node.left, node.right); } } return root; @@ -521,34 +523,34 @@ var invertTree = function(root) { ```javascript var invertTree = function(root) { //我们先定义节点交换函数 - const invertNode=function(root,left,right){ - let temp=left; - left=right; - right=temp; - root.left=left; - root.right=right; + const invertNode = function(root, left, right) { + let temp = left; + left = right; + right = temp; + root.left = left; + root.right = right; } //使用层序遍历 - let queue=[]; - if(root===null){ + let queue = []; + if(root === null) { return root; } queue.push(root); - while(queue.length){ - let length=queue.length; - while(length--){ - let node=queue.shift(); + while(queue.length) { + let length = queue.length; + while(length--) { + let node = queue.shift(); //节点处理逻辑 - invertNode(node,node.left,node.right); - node.left&&queue.push(node.left); - node.right&&queue.push(node.right); + invertNode(node, node.left, node.right); + node.left && queue.push(node.left); + node.right && queue.push(node.right); } } return root; }; ``` -### TypeScript: +TypeScript: 递归法: @@ -675,7 +677,7 @@ function invertTree(root: TreeNode | null): TreeNode | null { }; ``` -### C +C 递归法 ```c @@ -722,7 +724,7 @@ struct TreeNode* invertTree(struct TreeNode* root){ } ``` -### Swift: +Swift: ```swift // 前序遍历-递归 func invertTree(_ root: TreeNode?) -> TreeNode? { @@ -760,7 +762,7 @@ func invertTree1(_ root: TreeNode?) -> TreeNode? { } ``` -### Swift +Swift 深度优先递归。 @@ -808,9 +810,6 @@ func invertTree(_ root: TreeNode?) -> TreeNode? { return root } ``` - -### Scala - 深度优先遍历(前序遍历): ```scala object Solution { @@ -857,7 +856,7 @@ object Solution { } ``` -### rust +rust ```rust impl Solution { From ce23890a0c26e64702d98ad0c6ce55fc9e78c0a2 Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Tue, 29 Nov 2022 15:13:58 +0800 Subject: [PATCH 1299/3019] =?UTF-8?q?update=200101.=E5=AF=B9=E7=A7=B0?= =?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=A0=91:=20=E6=9B=B4=E6=94=B9=E9=94=99?= =?UTF-8?q?=E5=AD=97=EF=BC=8C=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81=E9=A3=8E?= =?UTF-8?q?=E6=A0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...60\344\272\214\345\217\211\346\240\221.md" | 101 +++++++++--------- 1 file changed, 52 insertions(+), 49 deletions(-) diff --git "a/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" "b/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" index 37adfd54d1..2b2cef7f11 100644 --- "a/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" @@ -21,7 +21,7 @@ 对于二叉树是否对称,要比较的是根节点的左子树与右子树是不是相互翻转的,理解这一点就知道了**其实我们要比较的是两个树(这两个树是根节点的左右子树)**,所以在递归遍历的过程中,也是要同时遍历两棵树。 -那么如果比较呢? +那么如何比较呢? 比较的是两个子树的里侧和外侧的元素是否相等。如图所示: @@ -80,7 +80,7 @@ else if (left == NULL && right == NULL) return true; else if (left->val != right->val) return false; // 注意这里我没有使用else ``` -注意上面最后一种情况,我没有使用else,而是elseif, 因为我们把以上情况都排除之后,剩下的就是 左右节点都不为空,且数值相同的情况。 +注意上面最后一种情况,我没有使用else,而是else if, 因为我们把以上情况都排除之后,剩下的就是 左右节点都不为空,且数值相同的情况。 3. 确定单层递归的逻辑 @@ -244,7 +244,7 @@ public: 这次我们又深度剖析了一道二叉树的“简单题”,大家会发现,真正的把题目搞清楚其实并不简单,leetcode上accept了和真正掌握了还是有距离的。 -我们介绍了递归法和迭代法,递归依然通过递归三部曲来解决了这道题目,如果只看精简的代码根本看不出来递归三部曲是如果解题的。 +我们介绍了递归法和迭代法,递归依然通过递归三部曲来解决了这道题目,如果只看精简的代码根本看不出来递归三部曲是如何解题的。 在迭代法中我们使用了队列,需要注意的是这不是层序遍历,而且仅仅通过一个容器来成对的存放我们要比较的元素,知道这一本质之后就发现,用队列,用栈,甚至用数组,都是可以的。 @@ -259,7 +259,7 @@ public: # 其他语言版本 -## Java +Java ```Java /** @@ -364,7 +364,7 @@ public: ``` -## Python +Python 递归法: ```python @@ -464,8 +464,7 @@ class Solution: return True ``` -## Go - +Go ```go /** * Definition for a binary tree node. @@ -488,10 +487,12 @@ func defs(left *TreeNode, right *TreeNode) bool { } return defs(left.Left, right.Right) && defs(right.Left, left.Right); } + func isSymmetric(root *TreeNode) bool { return defs(root.Left, root.Right); } + // 迭代 func isSymmetric(root *TreeNode) bool { var queue []*TreeNode; @@ -515,59 +516,60 @@ func isSymmetric(root *TreeNode) bool { ``` -## JavaScript +JavaScript 递归判断是否为对称二叉树: ```javascript var isSymmetric = function(root) { - //使用递归遍历左右子树 递归三部曲 + // 使用递归遍历左右子树 递归三部曲 // 1. 确定递归的参数 root.left root.right和返回值true false - const compareNode=function(left,right){ - //2. 确定终止条件 空的情况 - if(left===null&&right!==null||left!==null&&right===null){ + const compareNode = function(left, right) { + // 2. 确定终止条件 空的情况 + if(left === null && right !== null || left !== null && right === null) { return false; - }else if(left===null&&right===null){ + } else if(left === null && right === null) { return true; - }else if(left.val!==right.val){ + } else if(left.val !== right.val) { return false; } - //3. 确定单层递归逻辑 - let outSide=compareNode(left.left,right.right); - let inSide=compareNode(left.right,right.left); - return outSide&&inSide; + // 3. 确定单层递归逻辑 + let outSide = compareNode(left.left, right.right); + let inSide = compareNode(left.right, right.left); + return outSide && inSide; } - if(root===null){ + if(root === null) { return true; } - return compareNode(root.left,root.right); + return compareNode(root.left, root.right); }; ``` 队列实现迭代判断是否为对称二叉树: ```javascript var isSymmetric = function(root) { - //迭代方法判断是否是对称二叉树 - //首先判断root是否为空 - if(root===null){ + // 迭代方法判断是否是对称二叉树 + // 首先判断root是否为空 + if(root === null) { return true; } - let queue=[]; + let queue = []; queue.push(root.left); queue.push(root.right); - while(queue.length){ - let leftNode=queue.shift();//左节点 - let rightNode=queue.shift();//右节点 - if(leftNode===null&&rightNode===null){ + while(queue.length) { + let leftNode = queue.shift(); //左节点 + let rightNode = queue.shift(); //右节点 + if(leftNode === null && rightNode === null) { continue; } - if(leftNode===null||rightNode===null||leftNode.val!==rightNode.val){ + if(leftNode === null || rightNode === null || leftNode.val !== rightNode.val) { return false; } - queue.push(leftNode.left);//左节点左孩子入队 - queue.push(rightNode.right);//右节点右孩子入队 - queue.push(leftNode.right);//左节点右孩子入队 - queue.push(rightNode.left);//右节点左孩子入队 + queue.push(leftNode.left); //左节点左孩子入队 + queue.push(rightNode.right); //右节点右孩子入队 + queue.push(leftNode.right); //左节点右孩子入队 + queue.push(rightNode.left); //右节点左孩子入队 } + return true; }; ``` @@ -575,33 +577,34 @@ var isSymmetric = function(root) { 栈实现迭代判断是否为对称二叉树: ```javascript var isSymmetric = function(root) { - //迭代方法判断是否是对称二叉树 - //首先判断root是否为空 - if(root===null){ + // 迭代方法判断是否是对称二叉树 + // 首先判断root是否为空 + if(root === null) { return true; } - let stack=[]; + let stack = []; stack.push(root.left); stack.push(root.right); - while(stack.length){ - let rightNode=stack.pop();//左节点 - let leftNode=stack.pop();//右节点 - if(leftNode===null&&rightNode===null){ + while(stack.length) { + let rightNode = stack.pop(); //左节点 + let leftNode=stack.pop(); //右节点 + if(leftNode === null && rightNode === null) { continue; } - if(leftNode===null||rightNode===null||leftNode.val!==rightNode.val){ + if(leftNode === null || rightNode === null || leftNode.val !== rightNode.val) { return false; } - stack.push(leftNode.left);//左节点左孩子入队 - stack.push(rightNode.right);//右节点右孩子入队 - stack.push(leftNode.right);//左节点右孩子入队 - stack.push(rightNode.left);//右节点左孩子入队 + stack.push(leftNode.left); //左节点左孩子入队 + stack.push(rightNode.right); //右节点右孩子入队 + stack.push(leftNode.right); //左节点右孩子入队 + stack.push(rightNode.left); //右节点左孩子入队 } + return true; }; ``` -## TypeScript: +TypeScript: > 递归法 @@ -670,7 +673,7 @@ function isSymmetric(root: TreeNode | null): boolean { }; ``` -## Swift: +Swift: > 递归 ```swift @@ -752,7 +755,7 @@ func isSymmetric3(_ root: TreeNode?) -> Bool { } ``` -## Scala +Scala > 递归: ```scala From 1e873a198404af7550071f134c50bc205cd5101e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E5=91=98Carl?= Date: Wed, 30 Nov 2022 11:58:41 +0800 Subject: [PATCH 1300/3019] =?UTF-8?q?Update=200226.=E7=BF=BB=E8=BD=AC?= =?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 --- ...\254\344\272\214\345\217\211\346\240\221.md" | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git "a/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" "b/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" index 011c695d7a..ad2a7de27b 100644 --- "a/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" @@ -257,7 +257,7 @@ public: ## 其他语言版本 -Java +### Java ```Java //DFS递归 class Solution { @@ -308,7 +308,7 @@ class Solution { } ``` -Python +### Python 递归法:前序遍历: ```python @@ -360,7 +360,7 @@ class Solution: return root ``` -Go +### Go 递归版本的前序遍历 ```Go @@ -469,7 +469,7 @@ func invertTree(root *TreeNode) *TreeNode { } ``` -JavaScript +### JavaScript 使用递归版本的前序遍历 ```javascript @@ -550,7 +550,7 @@ var invertTree = function(root) { }; ``` -TypeScript: +### TypeScript: 递归法: @@ -677,7 +677,7 @@ function invertTree(root: TreeNode | null): TreeNode | null { }; ``` -C +### C 递归法 ```c @@ -724,7 +724,7 @@ struct TreeNode* invertTree(struct TreeNode* root){ } ``` -Swift: +### Swift: ```swift // 前序遍历-递归 func invertTree(_ root: TreeNode?) -> TreeNode? { @@ -762,7 +762,6 @@ func invertTree1(_ root: TreeNode?) -> TreeNode? { } ``` -Swift 深度优先递归。 @@ -856,7 +855,7 @@ object Solution { } ``` -rust +### rust ```rust impl Solution { From dc3517c1b089933ed21f69b807bcc00aba887baa Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Wed, 30 Nov 2022 15:36:25 +0800 Subject: [PATCH 1301/3019] =?UTF-8?q?update=200104.=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=A0=91=E7=9A=84=E6=9C=80=E5=A4=A7=E6=B7=B1=E5=BA=A6:=20?= =?UTF-8?q?=E8=B0=83=E6=95=B4=E4=B8=80=E6=AE=B5=20js=20=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...6\234\200\345\244\247\346\267\261\345\272\246.md" | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git "a/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" "b/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" index ee7bd50e1a..03322c9a88 100644 --- "a/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" +++ "b/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" @@ -59,7 +59,7 @@ int getdepth(treenode* node) if (node == NULL) return 0; ``` -3. 确定单层递归的逻辑:先求它的左子树的深度,再求的右子树的深度,最后取左右深度最大的数值 再+1 (加1是因为算上当前中间节点)就是目前节点为根节点的树的深度。 +3. 确定单层递归的逻辑:先求它的左子树的深度,再求右子树的深度,最后取左右深度最大的数值 再+1 (加1是因为算上当前中间节点)就是目前节点为根节点的树的深度。 代码如下: @@ -591,15 +591,15 @@ var maxdepth = function(root) { var maxdepth = function(root) { //使用递归的方法 递归三部曲 //1. 确定递归函数的参数和返回值 - const getdepth=function(node){ + const getdepth = function(node) { //2. 确定终止条件 - if(node===null){ + if(node === null) { return 0; } //3. 确定单层逻辑 - let leftdepth=getdepth(node.left); - let rightdepth=getdepth(node.right); - let depth=1+Math.max(leftdepth,rightdepth); + let leftdepth = getdepth(node.left); + let rightdepth = getdepth(node.right); + let depth = 1 + Math.max(leftdepth, rightdepth); return depth; } return getdepth(root); From 1d857164728f7846abdc716e731c8518a10d6925 Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Wed, 30 Nov 2022 15:45:57 +0800 Subject: [PATCH 1302/3019] =?UTF-8?q?update=200111.=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=A0=91=E7=9A=84=E6=9C=80=E5=B0=8F=E6=B7=B1=E5=BA=A6=EF=BC=9A?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=96=87=E6=9C=AC=E9=94=99=E5=AD=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...32\204\346\234\200\345\260\217\346\267\261\345\272\246.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" "b/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" index 0b2ec0f686..cbe7b7ecad 100644 --- "a/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" +++ "b/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" @@ -39,7 +39,7 @@ * 二叉树节点的深度:指从根节点到该节点的最长简单路径边的条数或者节点数(取决于深度从0开始还是从1开始) * 二叉树节点的高度:指从该节点到叶子节点的最长简单路径边的条数后者节点数(取决于高度从0开始还是从1开始) -那么使用后序遍历,其实求的是根节点到叶子节点的最小距离,就是求高度的过程,这不过这个最小距离 也同样是最小深度。 +那么使用后序遍历,其实求的是根节点到叶子节点的最小距离,就是求高度的过程,不过这个最小距离 也同样是最小深度。 以下讲解中遍历顺序上依然采用后序遍历(因为要比较递归返回之后的结果,本文我也给出前序遍历的写法)。 @@ -199,7 +199,7 @@ public: 如果对层序遍历还不清楚的话,可以看这篇:[二叉树:层序遍历登场!](https://programmercarl.com/0102.二叉树的层序遍历.html) -**需要注意的是,只有当左右孩子都为空的时候,才说明遍历的最低点了。如果其中一个孩子为空则不是最低点** +**需要注意的是,只有当左右孩子都为空的时候,才说明遍历到最低点了。如果其中一个孩子不为空则不是最低点** 代码如下:(详细注释) From 0a8b3f12250417add77ce137150aa0a8009e04f9 Mon Sep 17 00:00:00 2001 From: wantsnowfly <2856628706@qq.com> Date: Wed, 30 Nov 2022 15:51:48 +0800 Subject: [PATCH 1303/3019] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BA=86java?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E4=B8=AD=E7=9A=84=E4=B8=80=E5=A4=84=E6=B3=A8?= =?UTF-8?q?=E9=87=8A=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...220\210\345\271\266\344\272\214\345\217\211\346\240\221.md" | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git "a/problems/0617.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md" "b/problems/0617.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md" index db2d3762f1..72353b2942 100644 --- "a/problems/0617.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0617.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md" @@ -341,7 +341,7 @@ class Solution { if (node1.left == null && node2.left != null) { node1.left = node2.left; } - // 若node2的左节点为空,直接赋值 + // 若node1的右节点为空,直接赋值 if (node1.right == null && node2.right != null) { node1.right = node2.right; } @@ -696,3 +696,4 @@ object Solution { + From ae13f9570900246a61b18e0901e7f955812afc62 Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Wed, 30 Nov 2022 16:54:15 +0800 Subject: [PATCH 1304/3019] =?UTF-8?q?update=200222.=E5=AE=8C=E5=85=A8?= =?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=A0=91=E7=9A=84=E8=8A=82=E7=82=B9=E4=B8=AA?= =?UTF-8?q?=E6=95=B0:=20=E6=9B=BF=E6=8D=A2=20java=20=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=EF=BC=8C=E8=B0=83=E6=95=B4=20js=20=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...02\347\202\271\344\270\252\346\225\260.md" | 90 +++++++++---------- 1 file changed, 43 insertions(+), 47 deletions(-) diff --git "a/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" "b/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" index 6754864df1..7e763bc6a7 100644 --- "a/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" +++ "b/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" @@ -63,7 +63,7 @@ int getNodesNum(TreeNode* cur) { if (cur == NULL) return 0; ``` -3. 确定单层递归的逻辑:先求它的左子树的节点数量,再求的右子树的节点数量,最后取总和再加一 (加1是因为算上当前中间节点)就是目前节点为根节点的节点数量。 +3. 确定单层递归的逻辑:先求它的左子树的节点数量,再求右子树的节点数量,最后取总和再加一 (加1是因为算上当前中间节点)就是目前节点为根节点的节点数量。 代码如下: @@ -168,7 +168,7 @@ public: 可以看出如果整个树不是满二叉树,就递归其左右孩子,直到遇到满二叉树为止,用公式计算这个子树(满二叉树)的节点数量。 -这里关键在于如果去判断一个左子树或者右子树是不是满二叉树呢? +这里关键在于如何去判断一个左子树或者右子树是不是满二叉树呢? 在完全二叉树中,如果递归向左遍历的深度等于递归向右遍历的深度,那说明就是满二叉树。如图: @@ -178,13 +178,13 @@ public: ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20220829163709.png) -哪有录友说了,这种情况,递归向左遍历的深度等于递归向右遍历的深度,但也不是满二叉树,如题: +那有录友说了,这种情况,递归向左遍历的深度等于递归向右遍历的深度,但也不是满二叉树,如题: ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20220829163811.png) 如果这么想,大家就是对 完全二叉树理解有误区了,**以上这棵二叉树,它根本就不是一个完全二叉树**! -判断其子树岂不是满二叉树,如果是则利用用公式计算这个子树(满二叉树)的节点数量,如果不是则继续递归,那么 在递归三部曲中,第二部:终止条件的写法应该是这样的: +判断其子树是不是满二叉树,如果是则利用公式计算这个子树(满二叉树)的节点数量,如果不是则继续递归,那么 在递归三部曲中,第二部:终止条件的写法应该是这样的: ```CPP if (root == nullptr) return 0; @@ -292,26 +292,22 @@ class Solution { * 满二叉树的结点数为:2^depth - 1 */ public int countNodes(TreeNode root) { - if(root == null) { - return 0; + if (root == null) return 0; + TreeNode left = root.left; + TreeNode right = root.right; + int leftDepth = 0, rightDepth = 0; // 这里初始为0是有目的的,为了下面求指数方便 + while (left != null) { // 求左子树深度 + left = left.left; + leftDepth++; } - int leftDepth = getDepth(root.left); - int rightDepth = getDepth(root.right); - if (leftDepth == rightDepth) {// 左子树是满二叉树 - // 2^leftDepth其实是 (2^leftDepth - 1) + 1 ,左子树 + 根结点 - return (1 << leftDepth) + countNodes(root.right); - } else {// 右子树是满二叉树 - return (1 << rightDepth) + countNodes(root.left); + while (right != null) { // 求右子树深度 + right = right.right; + rightDepth++; } - } - - private int getDepth(TreeNode root) { - int depth = 0; - while (root != null) { - root = root.left; - depth++; + if (leftDepth == rightDepth) { + return (2 << leftDepth) - 1; // 注意(2<<1) 相当于2^2,所以leftDepth初始为0 } - return depth; + return countNodes(root.left) + countNodes(root.right) + 1; } } ``` @@ -397,7 +393,7 @@ class Solution: * Right *TreeNode * } */ -//本题直接就是求有多少个节点,无脑存进数组算长度就行了。 +//本题直接就是求有多少个节点,无脑存进结果变量就行了。 func countNodes(root *TreeNode) int { if root == nil { return 0 @@ -473,15 +469,15 @@ func countNodes(root *TreeNode) int { var countNodes = function(root) { //递归法计算二叉树节点数 // 1. 确定递归函数参数 - const getNodeSum=function(node){ + const getNodeSum = function(node) { //2. 确定终止条件 - if(node===null){ + if(node === null) { return 0; } //3. 确定单层递归逻辑 - let leftNum=getNodeSum(node.left); - let rightNum=getNodeSum(node.right); - return leftNum+rightNum+1; + let leftNum = getNodeSum(node.left); + let rightNum = getNodeSum(node.right); + return leftNum + rightNum + 1; } return getNodeSum(root); }; @@ -491,19 +487,19 @@ var countNodes = function(root) { ```javascript var countNodes = function(root) { //层序遍历 - let queue=[]; - if(root===null){ + let queue = []; + if(root === null) { return 0; } queue.push(root); - let nodeNums=0; - while(queue.length){ - let length=queue.length; - while(length--){ - let node=queue.shift(); + let nodeNums = 0; + while(queue.length) { + let length = queue.length; + while(length--) { + let node = queue.shift(); nodeNums++; - node.left&&queue.push(node.left); - node.right&&queue.push(node.right); + node.left && queue.push(node.left); + node.right && queue.push(node.right); } } return nodeNums; @@ -514,24 +510,24 @@ var countNodes = function(root) { ```javascript var countNodes = function(root) { //利用完全二叉树的特点 - if(root===null){ + if(root === null) { return 0; } - let left=root.left; - let right=root.right; - let leftDepth=0,rightDepth=0; - while(left){ - left=left.left; + let left = root.left; + let right = root.right; + let leftDepth = 0, rightDepth = 0; + while(left) { + left = left.left; leftDepth++; } - while(right){ - right=right.right; + while(right) { + right = right.right; rightDepth++; } - if(leftDepth==rightDepth){ - return Math.pow(2,leftDepth+1)-1; + if(leftDepth == rightDepth) { + return Math.pow(2, leftDepth+1) - 1; } - return countNodes(root.left)+countNodes(root.right)+1; + return countNodes(root.left) + countNodes(root.right) + 1; }; ``` From 0b60defcb7afebd129c9bf79504fc1b3608bfd2d Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Wed, 30 Nov 2022 19:19:00 +0800 Subject: [PATCH 1305/3019] =?UTF-8?q?update=200110.=E5=B9=B3=E8=A1=A1?= =?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=A0=91:=20=E6=9B=BF=E6=8D=A2=20go=20?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...41\344\272\214\345\217\211\346\240\221.md" | 39 ++++++++----------- 1 file changed, 17 insertions(+), 22 deletions(-) diff --git "a/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" "b/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" index 6e7c8c5300..83e4dc4f39 100644 --- "a/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" @@ -158,7 +158,7 @@ if (node == NULL) { 如何判断以当前传入节点为根节点的二叉树是否是平衡二叉树呢?当然是其左子树高度和其右子树高度的差值。 -分别求出其左右子树的高度,然后如果差值小于等于1,则返回当前二叉树的高度,否则则返回-1,表示已经不是二叉平衡树了。 +分别求出其左右子树的高度,然后如果差值小于等于1,则返回当前二叉树的高度,否则返回-1,表示已经不是二叉平衡树了。 代码如下: @@ -342,7 +342,7 @@ public: **例如:都知道回溯法其实就是递归,但是很少人用迭代的方式去实现回溯算法!** -因为对于回溯算法已经是非常复杂的递归了,如果在用迭代的话,就是自己给自己找麻烦,效率也并不一定高。 +因为对于回溯算法已经是非常复杂的递归了,如果再用迭代的话,就是自己给自己找麻烦,效率也并不一定高。 ## 总结 @@ -559,37 +559,32 @@ class Solution: ### Go ```Go func isBalanced(root *TreeNode) bool { - if root==nil{ - return true - } - if !isBalanced(root.Left) || !isBalanced(root.Right){ - return false - } - LeftH:=maxdepth(root.Left)+1 - RightH:=maxdepth(root.Right)+1 - if abs(LeftH-RightH)>1{ + h := getHeight(root) + if h == -1 { return false } return true } -func maxdepth(root *TreeNode)int{ - if root==nil{ +// 返回以该节点为根节点的二叉树的高度,如果不是平衡二叉树了则返回-1 +func getHeight(root *TreeNode) int { + if root == nil { return 0 } - return max(maxdepth(root.Left),maxdepth(root.Right))+1 + l, r := getHeight(root.Left), getHeight(root.Right) + if l == -1 || r == -1 { + return -1 + } + if l - r > 1 || r - l > 1 { + return -1 + } + return max(l, r) + 1 } -func max(a,b int)int{ - if a>b{ +func max(a, b int) int { + if a > b { return a } return b } -func abs(a int)int{ - if a<0{ - return -a - } - return a -} ``` ### JavaScript From 968dcfd4ffd8d9aff0e617ed8534bb7d8d08c6f5 Mon Sep 17 00:00:00 2001 From: Min Date: Wed, 30 Nov 2022 23:04:29 +0800 Subject: [PATCH 1306/3019] =?UTF-8?q?=E5=A2=9E=E5=8A=A00005.=E6=9C=80?= =?UTF-8?q?=E9=95=B7=E5=9B=9E=E6=96=87=E5=AD=90=E4=B8=B2C#=20=E5=8B=95?= =?UTF-8?q?=E6=85=8B=E8=A6=8F=E5=89=87=E7=9A=84=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...36\346\226\207\345\255\220\344\270\262.md" | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git "a/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" "b/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" index 62c2cbde61..84d8d83530 100644 --- "a/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" +++ "b/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" @@ -615,6 +615,38 @@ char * longestPalindrome(char * s){ } ``` +C#: + +動態規則: +```c# +public class Solution { + + public string LongestPalindrome(string s) { + bool[,] dp = new bool[s.Length, s.Length]; + int maxlenth = 0; + int left = 0; + int right = 0; + for(int i = s.Length-1 ; i>=0; i--){ + for(int j = i; j maxlenth){ + maxlenth = j-i+1; + left = i; + right = j; + } + } + } + return s.Substring(left, maxlenth); + } +} +``` +

From aae0de9b8a69f25b8379b36caf37459f999d2c08 Mon Sep 17 00:00:00 2001 From: Min Date: Wed, 30 Nov 2022 23:11:47 +0800 Subject: [PATCH 1307/3019] =?UTF-8?q?=E5=A2=9E=E5=8A=A00005.=E6=9C=80?= =?UTF-8?q?=E9=95=B7=E5=9B=9E=E6=96=87=E5=AD=90=E4=B8=B2C#=20=E9=9B=99?= =?UTF-8?q?=E6=8C=87=E9=87=9D=E7=9A=84=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...36\346\226\207\345\255\220\344\270\262.md" | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git "a/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" "b/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" index 84d8d83530..4d48f18458 100644 --- "a/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" +++ "b/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" @@ -647,6 +647,36 @@ public class Solution { } ``` +雙指針: +```C# +public class Solution { + int maxlenth = 0; + int left = 0; + int right = 0; + + public string LongestPalindrome(string s) { + int result = 0; + for (int 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.Substring(left, maxlenth); + } + + private void extend(string s, int i, int j, int n) { + while (i >= 0 && j < n && s[i] == s[j]) { + if (j - i + 1 > maxlenth) { + left = i; + right = j; + maxlenth = j - i + 1; + } + i--; + j++; + } + } +} +``` +

From a0115aa88a45be202631cf856fad8065379c195d Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Wed, 30 Nov 2022 23:43:42 +0800 Subject: [PATCH 1308/3019] =?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:=20?= =?UTF-8?q?=E4=BC=98=E5=8C=96=20js=20=E4=BB=A3=E7=A0=81=E6=A0=BC=E5=BC=8F?= =?UTF-8?q?=E5=92=8C=E9=94=99=E5=AD=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...00\346\234\211\350\267\257\345\276\204.md" | 48 +++++++++---------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git "a/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" "b/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" index 297acb6002..100531cbf5 100644 --- "a/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" +++ "b/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" @@ -24,7 +24,7 @@ 这道题目要求从根节点到叶子的路径,所以需要前序遍历,这样才方便让父节点指向孩子节点,找到对应的路径。 -在这道题目中将第一次涉及到回溯,因为我们要把路径记录下来,需要回溯来回退一一个路径在进入另一个路径。 +在这道题目中将第一次涉及到回溯,因为我们要把路径记录下来,需要回溯来回退一个路径再进入另一个路径。 前序遍历以及回溯的过程如图: @@ -44,7 +44,7 @@ void traversal(TreeNode* cur, vector& path, vector& result) 2. 确定递归终止条件 -再写递归的时候都习惯了这么写: +在写递归的时候都习惯了这么写: ``` if (cur == NULL) { @@ -67,7 +67,7 @@ if (cur->left == NULL && cur->right == NULL) { 再来看一下终止处理的逻辑。 -这里使用vector 结构path来记录路径,所以要把vector 结构的path转为string格式,在把这个string 放进 result里。 +这里使用vector 结构path来记录路径,所以要把vector 结构的path转为string格式,再把这个string 放进 result里。 **那么为什么使用了vector 结构来记录路径呢?** 因为在下面处理单层递归逻辑的时候,要做回溯,使用vector方便来做回溯。 @@ -123,7 +123,7 @@ if (cur->right) { path.pop_back(); ``` -这个回溯就要很大的问题,我们知道,**回溯和递归是一一对应的,有一个递归,就要有一个回溯**,这么写的话相当于把递归和回溯拆开了, 一个在花括号里,一个在花括号外。 +这个回溯就有很大的问题,我们知道,**回溯和递归是一一对应的,有一个递归,就要有一个回溯**,这么写的话相当于把递归和回溯拆开了, 一个在花括号里,一个在花括号外。 **所以回溯要和递归永远在一起,世界上最遥远的距离是你在花括号里,而我在花括号外!** @@ -300,16 +300,16 @@ public: ``` -**大家应该可以感受出来,如果把 `path + "->"`作为函数参数就是可以的,因为并有没有改变path的数值,执行完递归函数之后,path依然是之前的数值(相当于回溯了)** +**大家应该可以感受出来,如果把 `path + "->"`作为函数参数就是可以的,因为并没有改变path的数值,执行完递归函数之后,path依然是之前的数值(相当于回溯了)** -**综合以上,第二种递归的代码虽然精简但把很多重要的点隐藏在了代码细节里,第一种递归写法虽然代码多一些,但是把每一个逻辑处理都完整的展现了出来了。** +**综合以上,第二种递归的代码虽然精简但把很多重要的点隐藏在了代码细节里,第一种递归写法虽然代码多一些,但是把每一个逻辑处理都完整的展现出来了。** ## 拓展 这里讲解本题解的写法逻辑以及一些更具体的细节,下面的讲解中,涉及到C++语法特性,如果不是C++的录友,就可以不看了,避免越看越晕。 -如果是C++的录友,建议本题独立刷过两遍,在看下面的讲解,同样避免越看越晕,造成不必要的负担。 +如果是C++的录友,建议本题独立刷过两遍,再看下面的讲解,同样避免越看越晕,造成不必要的负担。 在第二版本的代码中,其实仅仅是回溯了 `->` 部分(调用两次pop_back,一个pop`>` 一次pop`-`),大家应该疑惑那么 `path += to_string(cur->val);` 这一步为什么没有回溯呢? 一条路径能持续加节点 不做回溯吗? @@ -378,7 +378,7 @@ public: 最后我依然给出了迭代法。 -对于本地充分了解递归与回溯的过程之后,有精力的同学可以在去实现迭代法。 +对于本题充分了解递归与回溯的过程之后,有精力的同学可以再去实现迭代法。 @@ -386,7 +386,7 @@ public: # 其他语言版本 -Java: +## Java: ```Java //解法一 @@ -466,7 +466,7 @@ class Solution { } ``` --- -Python: +## Python: 递归法+隐形回溯 ```Python3 # Definition for a binary tree node. @@ -529,7 +529,7 @@ class Solution: --- -Go: +## Go: 递归法: @@ -591,28 +591,28 @@ func binaryTreePaths(root *TreeNode) []string { ``` --- -JavaScript: +## JavaScript: 递归法: ```javascript var binaryTreePaths = function(root) { //递归遍历+递归三部曲 - let res=[]; + let res = []; //1. 确定递归函数 函数参数 - const getPath=function(node,curPath){ + const getPath = function(node,curPath) { //2. 确定终止条件,到叶子节点就终止 - if(node.left===null&&node.right===null){ - curPath+=node.val; + if(node.left === null && node.right === null) { + curPath += node.val; res.push(curPath); - return ; + return; } //3. 确定单层递归逻辑 - curPath+=node.val+'->'; - node.left&&getPath(node.left,curPath); - node.right&&getPath(node.right,curPath); + curPath += node.val + '->'; + node.left && getPath(node.left, curPath); + node.right && getPath(node.right, curPath); } - getPath(root,''); + getPath(root, ''); return res; }; ``` @@ -644,7 +644,7 @@ var binaryTreePaths = function(root) { }; ``` -TypeScript: +## TypeScript: > 递归法 @@ -698,7 +698,7 @@ function binaryTreePaths(root: TreeNode | null): string[] { }; ``` -Swift: +## Swift: > 递归/回溯 ```swift @@ -765,7 +765,7 @@ func binaryTreePaths(_ root: TreeNode?) -> [String] { } ``` -Scala: +## Scala: 递归: ```scala From 294c8db68e1635bf9d87cc0b3990b3a4400c9e7b Mon Sep 17 00:00:00 2001 From: roylx <73628821+roylx@users.noreply.github.com> Date: Thu, 1 Dec 2022 11:40:50 -0700 Subject: [PATCH 1309/3019] =?UTF-8?q?Update=200746.=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=E6=9C=80=E5=B0=8F=E8=8A=B1=E8=B4=B9=E7=88=AC=E6=A5=BC=E6=A2=AF?= =?UTF-8?q?.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加Python不支付费用版本 --- ...50\264\271\347\210\254\346\245\274\346\242\257.md" | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git "a/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" "b/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" index b6f5a734fe..a2865aed5e 100644 --- "a/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" +++ "b/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" @@ -241,6 +241,17 @@ class Solution { ### Python ```python +# 第一步不支付费用 +class Solution: + def minCostClimbingStairs(self, cost: List[int]) -> int: + n = len(cost) + dp = [0]*(n+1) # 到达前两步费用为0 + for i in range(2, n+1): + dp[i] = min(dp[i-1]+cost[i-1], dp[i-2]+cost[i-2]) + return dp[-1] +``` +```python +# 第一步支付费用 class Solution: def minCostClimbingStairs(self, cost: List[int]) -> int: dp = [0] * (len(cost)) From 89b2b1cf5e70a1dc4745819c25ce3f336bfacfab Mon Sep 17 00:00:00 2001 From: Administrator Date: Sat, 3 Dec 2022 00:26:47 +0800 Subject: [PATCH 1310/3019] =?UTF-8?q?Python=E7=89=88=E6=9C=AC=E4=B8=A5?= =?UTF-8?q?=E6=A0=BC=E5=8F=82=E7=85=A7C++=E5=86=99=E6=B3=95=E5=8F=8A?= =?UTF-8?q?=E6=AC=A1=E5=BA=8F=EF=BC=8C=E5=B9=B6=E8=BF=BD=E5=8A=A0=E6=B3=A8?= =?UTF-8?q?=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...14\345\210\206\346\237\245\346\211\276.md" | 38 +++++++++---------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git "a/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" "b/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" index 27af3f491c..a02bf7a201 100644 --- "a/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" +++ "b/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" @@ -204,18 +204,18 @@ class Solution { ```python class Solution: def search(self, nums: List[int], target: int) -> int: - left, right = 0, len(nums) - 1 - - while left <= right: - middle = (left + right) // 2 + left, right = 0, len(nums) - 1 # 定义target在左闭右闭的区间里,[left, right] - if nums[middle] < target: - left = middle + 1 - elif nums[middle] > target: - right = middle - 1 + while left <= right: + middle = left + (right - left) // 2 + + if nums[middle] > target: + right = middle - 1 # target在左区间,所以[left, middle - 1] + elif nums[middle] < target: + left = middle + 1 # target在右区间,所以[middle + 1, right] else: - return middle - return -1 + return middle # 数组中找到目标值,直接返回下标 + return -1 # 未找到目标值 ``` (版本二)左闭右开区间 @@ -223,18 +223,18 @@ class Solution: ```python class Solution: def search(self, nums: List[int], target: int) -> int: - left, right = 0, len(nums) + left, right = 0, len(nums) # 定义target在左闭右开的区间里,即:[left, right) - while left < right: - middle = (left + right) // 2 + while left < right: # 因为left == right的时候,在[left, right)是无效的空间,所以使用 < + middle = left + (right - left) // 2 - if nums[middle] < target: - left = middle + 1 - elif nums[middle] > target: - right = middle + if nums[middle] > target: + right = middle # target 在左区间,在[left, middle)中 + elif nums[middle] < target: + left = middle + 1 # target 在右区间,在[middle + 1, right)中 else: - return middle - return -1 + return middle # 数组中找到目标值,直接返回下标 + return -1 # 未找到目标值 ``` **Go:** From e8978ea6a852d568314488583eca552b1c14bce1 Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Sat, 3 Dec 2022 00:41:43 +0800 Subject: [PATCH 1311/3019] =?UTF-8?q?update=200404.=E5=B7=A6=E5=8F=B6?= =?UTF-8?q?=E5=AD=90=E4=B9=8B=E5=92=8C:=20=E4=BF=AE=E6=94=B9=20go=20?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=EF=BC=8C=E4=BC=98=E5=8C=96=20js=20=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E9=A3=8E=E6=A0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...66\345\255\220\344\271\213\345\222\214.md" | 79 ++++++++++--------- 1 file changed, 40 insertions(+), 39 deletions(-) diff --git "a/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" "b/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" index 6b6fe72940..e7ce882c2f 100644 --- "a/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" +++ "b/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" @@ -35,7 +35,7 @@ ![图二](https://code-thinking-1253855093.file.myqcloud.com/pics/20220902165805.png) -相信通过这两个图,大家可以最左叶子的定义有明确理解了。 +相信通过这两个图,大家对最左叶子的定义有明确理解了。 那么**判断当前节点是不是左叶子是无法判断的,必须要通过节点的父节点来判断其左孩子是不是左叶子。** @@ -298,48 +298,49 @@ class Solution: ```go func sumOfLeftLeaves(root *TreeNode) int { - var res int - findLeft(root,&res) - return res -} -func findLeft(root *TreeNode,res *int){ - //左节点 - if root.Left!=nil&&root.Left.Left==nil&&root.Left.Right==nil{ - *res=*res+root.Left.Val - } - if root.Left!=nil{ - findLeft(root.Left,res) + if root == nil { + return 0 } - if root.Right!=nil{ - findLeft(root.Right,res) + leftValue := sumOfLeftLeaves(root.Left) // 左 + + if root.Left != nil && root.Left.Left == nil && root.Left.Right == nil { + leftValue = root.Left.Val // 中 } + + rightValue := sumOfLeftLeaves(root.Right) // 右 + + return leftValue + rightValue } ``` -**迭代法** +**迭代法(前序遍历)** ```go func sumOfLeftLeaves(root *TreeNode) int { - var res int - queue:=list.New() - queue.PushBack(root) - for queue.Len()>0{ - length:=queue.Len() - for i:=0;i Date: Sat, 3 Dec 2022 10:04:19 +0800 Subject: [PATCH 1312/3019] =?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=20=E4=BC=98?= =?UTF-8?q?=E5=8C=96=20go=20=E5=92=8C=20js=20=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...13\350\247\222\347\232\204\345\200\274.md" | 91 +++++++++---------- 1 file changed, 42 insertions(+), 49 deletions(-) diff --git "a/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" "b/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" index fd6e5d95f6..025d954d5c 100644 --- "a/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" +++ "b/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" @@ -26,7 +26,7 @@ ## 思路 -本地要找出树的最后一行找到最左边的值。此时大家应该想起用层序遍历是非常简单的了,反而用递归的话会比较难一点。 +本题要找出树的最后一行的最左边的值。此时大家应该想起用层序遍历是非常简单的了,反而用递归的话会比较难一点。 我们依然还是先介绍递归法。 @@ -46,7 +46,7 @@ 所以要找深度最大的叶子节点。 -那么如果找最左边的呢?可以使用前序遍历(当然中序,后序都可以,因为本题没有 中间节点的处理逻辑,只要左优先就行),保证优先左边搜索,然后记录深度最大的叶子节点,此时就是树的最后一行最左边的值。 +那么如何找最左边的呢?可以使用前序遍历(当然中序,后序都可以,因为本题没有 中间节点的处理逻辑,只要左优先就行),保证优先左边搜索,然后记录深度最大的叶子节点,此时就是树的最后一行最左边的值。 递归三部曲: @@ -169,7 +169,7 @@ public: ### 迭代法 -本题使用层序遍历再合适不过了,比递归要好理解的多! +本题使用层序遍历再合适不过了,比递归要好理解得多! 只需要记录最后一行第一个节点的数值就可以了。 @@ -323,34 +323,25 @@ class Solution: 递归法: ```go - var maxDeep int // 全局变量 深度 - var value int //全局变量 最终值 +var depth int // 全局变量 最大深度 +var res int // 记录最终结果 func findBottomLeftValue(root *TreeNode) int { - if root.Left==nil&&root.Right==nil{//需要提前判断一下(不要这个if的话提交结果会出错,但执行代码不会。防止这种情况出现,故先判断是否只有一个节点) - return root.Val - } - findLeftValue (root,maxDeep) - return value + depth, res = 0, 0 // 初始化 + dfs(root, 1) + return res } -func findLeftValue (root *TreeNode,deep int){ - //最左边的值在左边 - if root.Left==nil&&root.Right==nil{ - if deep>maxDeep{ - value=root.Val - maxDeep=deep - } - } - //递归 - if root.Left!=nil{ - deep++ - findLeftValue(root.Left,deep) - deep--//回溯 + +func dfs(root *TreeNode, d int) { + if root == nil { + return } - if root.Right!=nil{ - deep++ - findLeftValue(root.Right,deep) - deep--//回溯 + // 因为先遍历左边,所以左边如果有值,右边的同层不会更新结果 + if root.Left == nil && root.Right == nil && depth < d { + depth = d + res = root.Val } + dfs(root.Left, d+1) // 隐藏回溯 + dfs(root.Right, d+1) } ``` @@ -358,18 +349,21 @@ func findLeftValue (root *TreeNode,deep int){ ```go func findBottomLeftValue(root *TreeNode) int { - queue:=list.New() var gradation int + queue := list.New() + queue.PushBack(root) - for queue.Len()>0{ - length:=queue.Len() - for i:=0;i 0 { + length := queue.Len() + for i := 0; i < length; i++ { + node := queue.Remove(queue.Front()).(*TreeNode) + if i == 0 { + gradation = node.Val + } + if node.Left != nil { queue.PushBack(node.Left) } - if node.Right!=nil{ + if node.Right != nil { queue.PushBack(node.Right) } } @@ -385,19 +379,18 @@ func findBottomLeftValue(root *TreeNode) int { ```javascript var findBottomLeftValue = function(root) { //首先考虑递归遍历 前序遍历 找到最大深度的叶子节点即可 - let maxPath = 0,resNode = null; + let maxPath = 0, resNode = null; // 1. 确定递归函数的函数参数 - const dfsTree = function(node,curPath){ + const dfsTree = function(node, curPath) { // 2. 确定递归函数终止条件 - if(node.left===null&&node.right===null){ - if(curPath>maxPath){ + if(node.left === null && node.right === null) { + if(curPath > maxPath) { maxPath = curPath; resNode = node.val; } - // return ; } - node.left&&dfsTree(node.left,curPath+1); - node.right&&dfsTree(node.right,curPath+1); + node.left && dfsTree(node.left, curPath+1); + node.right && dfsTree(node.right, curPath+1); } dfsTree(root,1); return resNode; @@ -409,20 +402,20 @@ var findBottomLeftValue = function(root) { var findBottomLeftValue = function(root) { //考虑层序遍历 记录最后一行的第一个节点 let queue = []; - if(root===null){ + if(root === null) { return null; } queue.push(root); let resNode; - while(queue.length){ - let length = queue.length; - for(let i=0; i Date: Sat, 3 Dec 2022 10:29:45 +0800 Subject: [PATCH 1313/3019] =?UTF-8?q?update=200112.=E8=B7=AF=E5=BE=84?= =?UTF-8?q?=E6=80=BB=E5=92=8C:=20=E4=BC=98=E5=8C=96=20java=20=E5=92=8C=20j?= =?UTF-8?q?s=20=E9=83=A8=E5=88=86=E4=BB=A3=E7=A0=81=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...57\345\276\204\346\200\273\345\222\214.md" | 54 ++++++++++--------- 1 file changed, 30 insertions(+), 24 deletions(-) diff --git "a/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" "b/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" index d50f23f974..cb9d343f9d 100644 --- "a/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" +++ "b/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" @@ -33,7 +33,7 @@ * 112.路径总和 * 113.路径总和ii -这道题我们要遍历从根节点到叶子节点的的路径看看总和是不是目标和。 +这道题我们要遍历从根节点到叶子节点的路径看看总和是不是目标和。 ### 递归 @@ -167,7 +167,7 @@ public: }; ``` -**是不是发现精简之后的代码,已经完全看不出分析的过程了,所以我们要把题目分析清楚之后,在追求代码精简。** 这一点我已经强调很多次了! +**是不是发现精简之后的代码,已经完全看不出分析的过程了,所以我们要把题目分析清楚之后,再追求代码精简。** 这一点我已经强调很多次了! ### 迭代 @@ -316,13 +316,13 @@ class solution { } if (root.left != null) { boolean left = haspathsum(root.left, targetsum); - if (left) {// 已经找到 + if (left) { // 已经找到 return true; } } if (root.right != null) { boolean right = haspathsum(root.right, targetsum); - if (right) {// 已经找到 + if (right) { // 已经找到 return true; } } @@ -348,31 +348,37 @@ class solution { ```java class solution { public boolean haspathsum(treenode root, int targetsum) { - if(root==null)return false; + if(root == null) return false; stack stack1 = new stack<>(); stack stack2 = new stack<>(); - stack1.push(root);stack2.push(root.val); - while(!stack1.isempty()){ + stack1.push(root); + stack2.push(root.val); + while(!stack1.isempty()) { int size = stack1.size(); - for(int i=0;i Date: Sat, 3 Dec 2022 10:51:01 +0800 Subject: [PATCH 1314/3019] =?UTF-8?q?update=200106.=E4=BB=8E=E4=B8=AD?= =?UTF-8?q?=E5=BA=8F=E4=B8=8E=E5=90=8E=E5=BA=8F=E9=81=8D=E5=8E=86=E5=BA=8F?= =?UTF-8?q?=E5=88=97=E6=9E=84=E9=80=A0=E4=BA=8C=E5=8F=89=E6=A0=91:=20?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=20go=20=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...40\344\272\214\345\217\211\346\240\221.md" | 75 +++++++++++-------- 1 file changed, 44 insertions(+), 31 deletions(-) diff --git "a/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" "b/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" index 17ba561d47..94eb405bbd 100644 --- "a/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" @@ -34,7 +34,7 @@ ## 思路 -首先回忆一下如何根据两个顺序构造一个唯一的二叉树,相信理论知识大家应该都清楚,就是以 后序数组的最后一个元素为切割点,先切中序数组,根据中序数组,反过来在切后序数组。一层一层切下去,每次后序数组最后一个元素就是节点元素。 +首先回忆一下如何根据两个顺序构造一个唯一的二叉树,相信理论知识大家应该都清楚,就是以 后序数组的最后一个元素为切割点,先切中序数组,根据中序数组,反过来再切后序数组。一层一层切下去,每次后序数组最后一个元素就是节点元素。 如果让我们肉眼看两个序列,画一棵二叉树的话,应该分分钟都可以画出来。 @@ -236,7 +236,7 @@ private: vector leftPostorder(postorder.begin(), postorder.begin() + leftInorder.size()); vector rightPostorder(postorder.begin() + leftInorder.size(), postorder.end()); - // 一下为日志 + // 以下为日志 cout << "----------" << endl; cout << "leftInorder :"; @@ -275,7 +275,7 @@ public: }; ``` -**此时应该发现了,如上的代码性能并不好,应为每层递归定定义了新的vector(就是数组),既耗时又耗空间,但上面的代码是最好理解的,为了方便读者理解,所以用如上的代码来讲解。** +**此时应该发现了,如上的代码性能并不好,因为每层递归定义了新的vector(就是数组),既耗时又耗空间,但上面的代码是最好理解的,为了方便读者理解,所以用如上的代码来讲解。** 下面给出用下标索引写出的代码版本:(思路是一样的,只不过不用重复定义vector了,每次用下标索引来分割) @@ -569,7 +569,7 @@ tree2 的前序遍历是[1 2 3], 后序遍历是[3 2 1]。 之前我们讲的二叉树题目都是各种遍历二叉树,这次开始构造二叉树了,思路其实比较简单,但是真正代码实现出来并不容易。 -所以要避免眼高手低,踏实的把代码写出来。 +所以要避免眼高手低,踏实地把代码写出来。 我同时给出了添加日志的代码版本,因为这种题目是不太容易写出来调一调就能过的,所以一定要把流程日志打出来,看看符不符合自己的思路。 @@ -728,25 +728,33 @@ class Solution: * Right *TreeNode * } */ +var ( + hash map[int]int +) func buildTree(inorder []int, postorder []int) *TreeNode { - if len(inorder)<1||len(postorder)<1{return nil} - //先找到根节点(后续遍历的最后一个就是根节点) - nodeValue:=postorder[len(postorder)-1] - //从中序遍历中找到一分为二的点,左边为左子树,右边为右子树 - left:=findRootIndex(inorder,nodeValue) - //构造root - root:=&TreeNode{Val: nodeValue, - Left: buildTree(inorder[:left],postorder[:left]),//将后续遍历一分为二,左边为左子树,右边为右子树 - Right: buildTree(inorder[left+1:],postorder[left:len(postorder)-1])} + hash = make(map[int]int) + for i, v := range inorder { // 用map保存中序序列的数值对应位置 + hash[v] = i + } + // 以左闭右闭的原则进行切分 + root := rebuild(inorder, postorder, len(postorder)-1, 0, len(inorder)-1) return root } -func findRootIndex(inorder []int,target int) (index int){ - for i:=0;i r { // 说明没有元素,返回空树 + return nil + } + if l == r { // 只剩唯一一个元素,直接返回 + return &TreeNode{Val : inorder[l]} } - return -1 + rootV := postorder[rootIdx] // 根据后序数组找到根节点的值 + rootIn := hash[rootV] // 找到根节点在对应的中序数组中的位置 + root := &TreeNode{Val : rootV} // 构造根节点 + // 重建左节点和右节点 + root.Left = rebuild(inorder, postorder, rootIdx-(r-rootIn)-1, l, rootIn-1) + root.Right = rebuild(inorder, postorder, rootIdx-1, rootIn+1, r) + return root } ``` @@ -761,22 +769,27 @@ func findRootIndex(inorder []int,target int) (index int){ * Right *TreeNode * } */ +var ( + hash map[int]int +) func buildTree(preorder []int, inorder []int) *TreeNode { - if len(preorder)<1||len(inorder)<1{return nil} - left:=findRootIndex(preorder[0],inorder) - root:=&TreeNode{ - Val: preorder[0], - Left: buildTree(preorder[1:left+1],inorder[:left]), - Right: buildTree(preorder[left+1:],inorder[left+1:])} + hash = make(map[int]int, len(inorder)) + for i, v := range inorder { + hash[v] = i + } + root := build(preorder, inorder, 0, 0, len(inorder)-1) // l, r 表示构造的树在中序遍历数组中的范围 return root } -func findRootIndex(target int,inorder []int) int{ - for i:=0;i r { + return nil } - return -1 + rootVal := pre[root] // 找到本次构造的树的根节点 + index := hash[rootVal] // 根节点在中序数组中的位置 + node := &TreeNode {Val: rootVal} + node.Left = build(pre, in, root + 1, l, index-1) + node.Right = build(pre, in, root + (index-l) + 1, index+1, r) + return node } ``` From 781b38d3fa815826a74f83fed616b3df630a5cf2 Mon Sep 17 00:00:00 2001 From: hbingzhi Date: Sat, 3 Dec 2022 14:46:28 +0800 Subject: [PATCH 1315/3019] =?UTF-8?q?1047.Java=E7=AC=AC=E4=BA=8C=E7=A7=8D?= =?UTF-8?q?=E8=A7=A3=E6=B3=95=EF=BC=8C=E5=8F=AF=E4=BB=A5=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E6=88=90=E9=80=9F=E5=BA=A6=E6=9B=B4=E5=BF=AB=E7=9A=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" | 3 +++ 1 file changed, 3 insertions(+) diff --git "a/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" "b/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" index 417c81d769..810f7292ce 100644 --- "a/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" +++ "b/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" @@ -153,6 +153,8 @@ class Solution { class Solution { public String removeDuplicates(String s) { // 将 res 当做栈 + // 也可以用 StringBuilder 来修改字符串,速度更快 + // StringBuilder res = new StringBuilder(); StringBuffer res = new StringBuffer(); // top为 res 的长度 int top = -1; @@ -470,3 +472,4 @@ impl Solution { + From a6d407a44ac7b4132888ec9c6650c8a77b9730a7 Mon Sep 17 00:00:00 2001 From: fw_qaq <82551626+Jack-Zhang-1314@users.noreply.github.com> Date: Sat, 3 Dec 2022 22:36:40 +0800 Subject: [PATCH 1316/3019] =?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 --- ...55\347\232\204\344\274\227\346\225\260.md" | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git "a/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" "b/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" index 3c6362bf82..7966e87c33 100644 --- "a/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" +++ "b/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" @@ -876,6 +876,55 @@ object Solution { } ``` +## rust + +递归: + +```rust +impl Solution { + pub fn find_mode(root: Option>>) -> Vec { + let mut count = 0; + let mut max_count = 0; + let mut res = vec![]; + let mut pre = i32::MIN; + Self::search_bst(&root, &mut pre, &mut res, &mut count, &mut max_count); + res + } + pub fn search_bst( + cur: &Option>>, + mut pre: &mut i32, + res: &mut Vec, + count: &mut i32, + max_count: &mut i32, + ) { + if cur.is_none() { + return; + } + + let cur_node = cur.as_ref().unwrap().borrow(); + Self::search_bst(&cur_node.left, pre, res, count, max_count); + if *pre == i32::MIN { + *count = 1; + } else if *pre == cur_node.val { + *count += 1; + } else { + *count = 1; + }; + match count.cmp(&max_count) { + std::cmp::Ordering::Equal => res.push(cur_node.val), + std::cmp::Ordering::Greater => { + *max_count = *count; + res.clear(); + res.push(cur_node.val); + } + _ => {} + }; + *pre = cur_node.val; + Self::search_bst(&cur_node.right, pre, res, count, max_count); + } +} +``` +

From ce622d557e640b42e72aecff7cb137571bf70e41 Mon Sep 17 00:00:00 2001 From: fw_qaq <82551626+Jack-Zhang-1314@users.noreply.github.com> Date: Sun, 4 Dec 2022 00:01:46 +0800 Subject: [PATCH 1317/3019] =?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 --- ...55\347\232\204\344\274\227\346\225\260.md" | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git "a/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" "b/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" index 7966e87c33..a48fde3470 100644 --- "a/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" +++ "b/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" @@ -925,6 +925,44 @@ impl Solution { } ``` +迭代: + +```rust +pub fn find_mode(root: Option>>) -> Vec { + let (mut cur, mut pre) = (root, i32::MIN); + let mut res = vec![]; + let mut stack = vec![]; + let (mut count, mut max_count) = (0, 0); + while !stack.is_empty() || cur.is_some() { + while let Some(node) = cur { + cur = node.borrow().left.clone(); + stack.push(node); + } + if let Some(node) = stack.pop() { + if pre == i32::MIN { + count = 1; + } else if pre == node.borrow().val { + count += 1; + } else { + count = 1; + } + match count.cmp(&max_count) { + std::cmp::Ordering::Equal => res.push(node.borrow().val), + std::cmp::Ordering::Greater => { + max_count = count; + res.clear(); + res.push(node.borrow().val); + } + _ => {} + } + pre = node.borrow().val; + cur = node.borrow().right.clone(); + } + } + res + } +``` +

From 770babda32822cc9dd7d5a66b5971bbbd97d0c44 Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Sun, 4 Dec 2022 11:13:58 +0800 Subject: [PATCH 1318/3019] =?UTF-8?q?update=200654.=E6=9C=80=E5=A4=A7?= =?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=A0=91:=20=E6=9B=B4=E6=96=B0=20go=20?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E9=A3=8E=E6=A0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...47\344\272\214\345\217\211\346\240\221.md" | 34 ++++++++----------- 1 file changed, 14 insertions(+), 20 deletions(-) diff --git "a/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" "b/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" index fda6437251..ebb5e2a438 100644 --- "a/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" @@ -40,7 +40,7 @@ * 确定递归函数的参数和返回值 -参数就是传入的是存放元素的数组,返回该数组构造的二叉树的头结点,返回类型是指向节点的指针。 +参数传入的是存放元素的数组,返回该数组构造的二叉树的头结点,返回类型是指向节点的指针。 代码如下: @@ -309,30 +309,24 @@ class Solution: ```go -/** - * Definition for a binary tree node. - * type TreeNode struct { - * Val int - * Left *TreeNode - * Right *TreeNode - * } - */ func constructMaximumBinaryTree(nums []int) *TreeNode { - if len(nums)<1{return nil} - //首选找到最大值 - index:=findMax(nums) - //其次构造二叉树 - root:=&TreeNode{ + if len(nums) == 0 { + return nil + } + // 找到最大值 + index := findMax(nums) + // 构造二叉树 + root := &TreeNode { Val: nums[index], - Left:constructMaximumBinaryTree(nums[:index]),//左半边 - Right:constructMaximumBinaryTree(nums[index+1:]),//右半边 + Left: constructMaximumBinaryTree(nums[:index]), //左半边 + Right: constructMaximumBinaryTree(nums[index+1:]),//右半边 } return root } -func findMax(nums []int) (index int){ - for i:=0;inums[index]{ - index=i +func findMax(nums []int) (index int) { + for i, v := range nums { + if nums[index] < v { + index = i } } return From b81abd3d6b444e256e6ed3b4f19e650f131f6732 Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Sun, 4 Dec 2022 11:44:01 +0800 Subject: [PATCH 1319/3019] =?UTF-8?q?update=200617.=E5=90=88=E5=B9=B6?= =?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=A0=91:=20=E4=BC=98=E5=8C=96=20go=20?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...66\344\272\214\345\217\211\346\240\221.md" | 64 ++++--------------- 1 file changed, 14 insertions(+), 50 deletions(-) diff --git "a/problems/0617.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md" "b/problems/0617.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md" index db2d3762f1..58701b7dbd 100644 --- "a/problems/0617.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0617.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md" @@ -46,7 +46,7 @@ 1. **确定递归函数的参数和返回值:** -首先那么要合入两个二叉树,那么参数至少是要传入两个二叉树的根节点,返回值就是合并之后二叉树的根节点。 +首先要合入两个二叉树,那么参数至少是要传入两个二叉树的根节点,返回值就是合并之后二叉树的根节点。 代码如下: @@ -56,7 +56,7 @@ TreeNode* mergeTrees(TreeNode* t1, TreeNode* t2) { 2. **确定终止条件:** -因为是传入了两个树,那么就有两个树遍历的节点t1 和 t2,如果t1 == NULL 了,两个树合并就应该是 t2 了啊(如果t2也为NULL也无所谓,合并之后就是NULL)。 +因为是传入了两个树,那么就有两个树遍历的节点t1 和 t2,如果t1 == NULL 了,两个树合并就应该是 t2 了(如果t2也为NULL也无所谓,合并之后就是NULL)。 反过来如果t2 == NULL,那么两个数合并就是t1(如果t1也为NULL也无所谓,合并之后就是NULL)。 @@ -70,7 +70,7 @@ if (t2 == NULL) return t1; // 如果t2为空,合并之后就应该是t1 3. **确定单层递归的逻辑:** -单层递归的逻辑就比较好些了,这里我们用重复利用一下t1这个树,t1就是合并之后树的根节点(就是修改了原来树的结构)。 +单层递归的逻辑就比较好写了,这里我们重复利用一下t1这个树,t1就是合并之后树的根节点(就是修改了原来树的结构)。 那么单层递归中,就要把两棵树的元素加到一起。 ``` @@ -144,7 +144,7 @@ public: **但是前序遍历是最好理解的,我建议大家用前序遍历来做就OK。** -如上的方法修改了t1的结构,当然也可以不修改t1和t2的结构,重新定一个树。 +如上的方法修改了t1的结构,当然也可以不修改t1和t2的结构,重新定义一个树。 不修改输入树的结构,前序遍历,代码如下: @@ -214,7 +214,7 @@ public: ## 拓展 -当然也可以秀一波指针的操作,这是我写的野路子,大家就随便看看就行了,以防带跑遍了。 +当然也可以秀一波指针的操作,这是我写的野路子,大家就随便看看就行了,以防带跑偏了。 如下代码中,想要更改二叉树的值,应该传入指向指针的指针。 @@ -252,7 +252,7 @@ public: 迭代法中,一般一起操作两个树都是使用队列模拟类似层序遍历,同时处理两个树的节点,这种方式最好理解,如果用模拟递归的思路的话,要复杂一些。 -最后拓展中,我给了一个操作指针的野路子,大家随便看看就行了,如果学习C++的话,可以在去研究研究。 +最后拓展中,我给了一个操作指针的野路子,大家随便看看就行了,如果学习C++的话,可以再去研究研究。 ## 其他语言版本 @@ -417,43 +417,7 @@ class Solution: ### Go ```go -/** - * Definition for a binary tree node. - * type TreeNode struct { - * Val int - * Left *TreeNode - * Right *TreeNode - * } - */ - //前序遍历(递归遍历,跟105 106差不多的思路) -func mergeTrees(t1 *TreeNode, t2 *TreeNode) *TreeNode { - var value int - var nullNode *TreeNode//空node,便于遍历 - nullNode=&TreeNode{ - Val:0, - Left:nil, - Right:nil} - switch { - case t1==nil&&t2==nil: return nil//终止条件 - default : //如果其中一个节点为空,则将该节点置为nullNode,方便下次遍历 - if t1==nil{ - value=t2.Val - t1=nullNode - }else if t2==nil{ - value=t1.Val - t2=nullNode - }else { - value=t1.Val+t2.Val - } - } - root:=&TreeNode{//构造新的二叉树 - Val: value, - Left: mergeTrees(t1.Left,t2.Left), - Right: mergeTrees(t1.Right,t2.Right)} - return root -} - -// 前序遍历简洁版 +// 前序遍历 func mergeTrees(root1 *TreeNode, root2 *TreeNode) *TreeNode { if root1 == nil { return root2 @@ -479,28 +443,28 @@ func mergeTrees(root1 *TreeNode, root2 *TreeNode) *TreeNode { queue = append(queue,root1) queue = append(queue,root2) - for size:=len(queue);size>0;size=len(queue){ + for size := len(queue); size>0; size=len(queue) { node1 := queue[0] queue = queue[1:] node2 := queue[0] queue = queue[1:] node1.Val += node2.Val // 左子树都不为空 - if node1.Left != nil && node2.Left != nil{ + if node1.Left != nil && node2.Left != nil { queue = append(queue,node1.Left) queue = append(queue,node2.Left) } // 右子树都不为空 - if node1.Right !=nil && node2.Right !=nil{ - queue = append(queue,node1.Right) - queue = append(queue,node2.Right) + if node1.Right !=nil && node2.Right !=nil { + queue = append(queue, node1.Right) + queue = append(queue, node2.Right) } // 树 1 的左子树为 nil,直接接上树 2 的左子树 - if node1.Left == nil{ + if node1.Left == nil { node1.Left = node2.Left } // 树 1 的右子树为 nil,直接接上树 2 的右子树 - if node1.Right == nil{ + if node1.Right == nil { node1.Right = node2.Right } } From a85036e81126de1b026772ef803776a56540946c Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Sun, 4 Dec 2022 12:24:34 +0800 Subject: [PATCH 1320/3019] =?UTF-8?q?update=200700.=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=90=9C=E7=B4=A2?= =?UTF-8?q?:=20=E4=BF=AE=E6=94=B9=20go=20=E7=9A=84=E8=BF=AD=E4=BB=A3?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...55\347\232\204\346\220\234\347\264\242.md" | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git "a/problems/0700.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\220\234\347\264\242.md" "b/problems/0700.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\220\234\347\264\242.md" index 2ee2bdb0e3..f40f778a98 100644 --- "a/problems/0700.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\220\234\347\264\242.md" +++ "b/problems/0700.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\220\234\347\264\242.md" @@ -24,7 +24,7 @@ ## 思路 -之前我们讲了都是普通二叉树,那么接下来看看二叉搜索树。 +之前我们讲的都是普通二叉树,那么接下来看看二叉搜索树。 在[关于二叉树,你该了解这些!](https://programmercarl.com/二叉树理论基础.html)中,我们已经讲过了二叉搜索树。 @@ -269,13 +269,13 @@ class Solution: ```go //递归法 func searchBST(root *TreeNode, val int) *TreeNode { - if root==nil||root.Val==val{ + if root == nil || root.Val == val { return root } - if root.Val>val{ - return searchBST(root.Left,val) + if root.Val > val { + return searchBST(root.Left, val) } - return searchBST(root.Right,val) + return searchBST(root.Right, val) } ``` @@ -284,13 +284,13 @@ func searchBST(root *TreeNode, val int) *TreeNode { ```go //迭代法 func searchBST(root *TreeNode, val int) *TreeNode { - for root!=nil{ - if root.Val>val{ - root=root.Left - }else if root.Val val { + root = root.Left + } else if root.Val < val { + root = root.Right + } else { + return root } } return nil From d32e8f54c8803c475ab403fc1fa918b7e74b2a8e Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Sun, 4 Dec 2022 13:52:36 +0800 Subject: [PATCH 1321/3019] =?UTF-8?q?update=200098.=E9=AA=8C=E8=AF=81?= =?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=90=9C=E7=B4=A2=E6=A0=91:=20=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E6=96=87=E6=9C=AC=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" | 2 -- 1 file changed, 2 deletions(-) diff --git "a/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" index bb38ae3577..db9c28ad69 100644 --- "a/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" +++ "b/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" @@ -437,8 +437,6 @@ class Solution: ## Go ```Go -import "math" - func isValidBST(root *TreeNode) bool { // 二叉搜索树也可以是空树 if root == nil { From a4d7ed61422dfef71149443eb84d3a8cb074a1b6 Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Sun, 4 Dec 2022 14:27:21 +0800 Subject: [PATCH 1322/3019] =?UTF-8?q?update=200530.=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=90=9C=E7=B4=A2=E6=A0=91=E7=9A=84=E6=9C=80=E5=B0=8F=E7=BB=9D?= =?UTF-8?q?=E5=AF=B9=E5=B7=AE:=20=E5=88=A0=E9=99=A4=20go=20=E5=86=97?= =?UTF-8?q?=E4=BD=99=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...17\347\273\235\345\257\271\345\267\256.md" | 22 ------------------- 1 file changed, 22 deletions(-) diff --git "a/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" "b/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" index ad4f46d86c..699afcf7d4 100644 --- "a/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" +++ "b/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" @@ -248,28 +248,6 @@ class Solution: ## Go: 中序遍历,然后计算最小差值 - -```go -func getMinimumDifference(root *TreeNode) int { - var res []int - findMIn(root,&res) - min:=1000000//一个比较大的值 - for i:=1;i Date: Sun, 4 Dec 2022 15:31:13 +0800 Subject: [PATCH 1323/3019] =?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?:=20=E4=BF=AE=E6=94=B9=20java=EF=BC=8Cgo=20=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...55\347\232\204\344\274\227\346\225\260.md" | 45 ++----------------- 1 file changed, 3 insertions(+), 42 deletions(-) diff --git "a/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" "b/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" index 3c6362bf82..f016ee58a0 100644 --- "a/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" +++ "b/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" @@ -54,7 +54,7 @@ 1. 这个树都遍历了,用map统计频率 -至于用前中后序那种遍历也不重要,因为就是要全遍历一遍,怎么个遍历法都行,层序遍历都没毛病! +至于用前中后序哪种遍历也不重要,因为就是要全遍历一遍,怎么个遍历法都行,层序遍历都没毛病! 这里采用前序遍历,代码如下: @@ -354,7 +354,7 @@ public: ```java class Solution { - public int[] findMode(FindModeInBinarySearchTree.TreeNode root) { + public int[] findMode(TreeNode root) { Map map = new HashMap<>(); List list = new ArrayList<>(); if (root == null) return list.stream().mapToInt(Integer::intValue).toArray(); @@ -375,7 +375,7 @@ class Solution { return list.stream().mapToInt(Integer::intValue).toArray(); } - void searchBST(FindModeInBinarySearchTree.TreeNode curr, Map map) { + void searchBST(TreeNode curr, Map map) { if (curr == null) return; map.put(curr.val, map.getOrDefault(curr.val, 0) + 1); searchBST(curr.left, map); @@ -556,46 +556,7 @@ class Solution: ``` ## Go -暴力法(非BSL) - -```go -func findMode(root *TreeNode) []int { - var history map[int]int - var maxValue int - var maxIndex int - var result []int - history=make(map[int]int) - traversal(root,history) - for k,value:=range history{ - if value>maxValue{ - maxValue=value - maxIndex=k - } - } - for k,value:=range history{ - if value==history[maxIndex]{ - result=append(result,k) - } - } - return result -} -func traversal(root *TreeNode,history map[int]int){ - if root.Left!=nil{ - traversal(root.Left,history) - } - if value,ok:=history[root.Val];ok{ - history[root.Val]=value+1 - }else{ - history[root.Val]=1 - } - if root.Right!=nil{ - traversal(root.Right,history) - } -} -``` - 计数法,不使用额外空间,利用二叉树性质,中序遍历 - ```go func findMode(root *TreeNode) []int { res := make([]int, 0) From f056b7ece6be055f1f046869ee11c37cafaadd7d Mon Sep 17 00:00:00 2001 From: fw_qaq <82551626+Jack-Zhang-1314@users.noreply.github.com> Date: Sun, 4 Dec 2022 16:49:13 +0800 Subject: [PATCH 1324/3019] =?UTF-8?q?Update=200236.=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=A0=91=E7=9A=84=E6=9C=80=E8=BF=91=E5=85=AC=E5=85=B1=E7=A5=96?= =?UTF-8?q?=E5=85=88.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...54\345\205\261\347\245\226\345\205\210.md" | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git "a/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" "b/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" index a34e8c2135..eadae35e3c 100644 --- "a/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" +++ "b/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" @@ -384,6 +384,34 @@ object Solution { } ``` +## rust + +```rust +impl Solution { + pub fn lowest_common_ancestor( + root: Option>>, + p: Option>>, + q: Option>>, + ) -> Option>> { + if root == p || root == q || root.is_none() { + return root; + } + let left = Self::lowest_common_ancestor( + root.as_ref().unwrap().borrow().left.clone(), + p.clone(), + q.clone(), + ); + let right = + Self::lowest_common_ancestor(root.as_ref().unwrap().borrow().right.clone(), p, q); + match (&left, &right) { + (None, Some(_)) => right, + (Some(_), Some(_)) => root, + _ => left, + } + } +} +``` +

From 3f7beb8c8f3d9e06f9932a157ffce92dd7d2aade Mon Sep 17 00:00:00 2001 From: fw_qaq <82551626+Jack-Zhang-1314@users.noreply.github.com> Date: Sun, 4 Dec 2022 17:59:09 +0800 Subject: [PATCH 1325/3019] =?UTF-8?q?Update=200235.=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=90=9C=E7=B4=A2=E6=A0=91=E7=9A=84=E6=9C=80=E8=BF=91=E5=85=AC?= =?UTF-8?q?=E5=85=B1=E7=A5=96=E5=85=88.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...54\345\205\261\347\245\226\345\205\210.md" | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git "a/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" "b/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" index c90b3d8cd4..97f854374b 100644 --- "a/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" +++ "b/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" @@ -418,6 +418,39 @@ object Solution { } ``` +## rust + +```rust +impl Solution { + pub fn lowest_common_ancestor( + root: Option>>, + p: Option>>, + q: Option>>, + ) -> Option>> { + let q_val = q.as_ref().unwrap().borrow().val; + let p_val = p.as_ref().unwrap().borrow().val; + let root_val = root.as_ref().unwrap().borrow().val; + + if root_val > q_val && root_val > p_val { + return Self::lowest_common_ancestor( + root.as_ref().unwrap().borrow().left.clone(), + p, + q, + ); + }; + + if root_val < q_val && root_val < p_val { + return Self::lowest_common_ancestor( + root.as_ref().unwrap().borrow().right.clone(), + p, + q, + ); + } + root + } +} +``` +

From 6866f2b9ace6a92d38d9b28f3e91365a38878c35 Mon Sep 17 00:00:00 2001 From: fw_qaq <82551626+Jack-Zhang-1314@users.noreply.github.com> Date: Sun, 4 Dec 2022 19:35:20 +0800 Subject: [PATCH 1326/3019] =?UTF-8?q?Update=200235.=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=90=9C=E7=B4=A2=E6=A0=91=E7=9A=84=E6=9C=80=E8=BF=91=E5=85=AC?= =?UTF-8?q?=E5=85=B1=E7=A5=96=E5=85=88.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...54\345\205\261\347\245\226\345\205\210.md" | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git "a/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" "b/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" index 97f854374b..aa06e86c5b 100644 --- "a/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" +++ "b/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" @@ -420,6 +420,8 @@ object Solution { ## rust +递归: + ```rust impl Solution { pub fn lowest_common_ancestor( @@ -451,6 +453,32 @@ impl Solution { } ``` +迭代: + +```rust +impl Solution { + pub fn lowest_common_ancestor( + mut root: Option>>, + p: Option>>, + q: Option>>, + ) -> Option>> { + let p_val = p.unwrap().borrow().val; + let q_val = q.unwrap().borrow().val; + while let Some(node) = root.clone() { + let root_val = node.borrow().val; + if root_val > q_val && root_val > p_val { + root = node.borrow().left.clone(); + } else if root_val < q_val && root_val < p_val { + root = node.borrow().right.clone(); + } else { + return root; + } + } + None + } +} +``` +

From c5fa95ebffe0cbc200166a6eb914702d398be659 Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Sun, 4 Dec 2022 22:55:45 +0800 Subject: [PATCH 1327/3019] =?UTF-8?q?update=200236.=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=A0=91=E7=9A=84=E6=9C=80=E8=BF=91=E5=85=AC=E5=85=B1=E7=A5=96?= =?UTF-8?q?=E5=85=88=EF=BC=9A=E4=BF=AE=E6=94=B9=E9=94=99=E5=AD=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...54\345\205\261\347\245\226\345\205\210.md" | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git "a/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" "b/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" index a34e8c2135..bf2007b584 100644 --- "a/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" +++ "b/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" @@ -48,7 +48,7 @@ 后序遍历(左右中)就是天然的回溯过程,可以根据左右子树的返回值,来处理中节点的逻辑。 -接下来就看如何判断一个节点是节点q和节点p的公共公共祖先呢。 +接下来就看如何判断一个节点是节点q和节点p的公共祖先呢。 **首先最容易想到的一个情况:如果找到一个节点,发现左子树出现结点p,右子树出现节点q,或者 左子树出现结点q,右子树出现节点p,那么该节点就是节点p和q的最近公共祖先。** 即情况一: @@ -66,9 +66,9 @@ 其实情况一 和 情况二 代码实现过程都是一样的,也可以说,实现情况一的逻辑,顺便包含了情况二。 -因为遇到 q 或者 p 就返回,这样也包含了 q 或者 p 本省就是 公共祖先的情况。 +因为遇到 q 或者 p 就返回,这样也包含了 q 或者 p 本身就是 公共祖先的情况。 -这一点是很多录友容易忽略的,在下面的代码讲解中,可以在去体会。 +这一点是很多录友容易忽略的,在下面的代码讲解中,可以再去体会。 递归三部曲: @@ -86,9 +86,9 @@ TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) * 确定终止条件 -遇到空的话,然后然后空,因为树都是空了,所以返回空。 +遇到空的话,因为树都是空了,所以返回空。 -那么我们来说一说,如果 root == q,或者 root == p,说明找到 q p ,则将其返回,这个返回值,后面在中节点的处理过程中会用到,那么中节点处理逻辑,后下面讲解。 +那么我们来说一说,如果 root == q,或者 root == p,说明找到 q p ,则将其返回,这个返回值,后面在中节点的处理过程中会用到,那么中节点的处理逻辑,下面讲解。 代码如下: @@ -167,7 +167,7 @@ TreeNode* right = lowestCommonAncestor(root->right, p, q); 图中节点10的左子树返回null,右子树返回目标值7,那么此时节点10的处理逻辑就是把右子树的返回值(最近公共祖先7)返回上去! -这里点也很重要,可能刷过这道题目的同学,都不清楚结果究竟是如何从底层一层一层传到头结点的。 +这里也很重要,可能刷过这道题目的同学,都不清楚结果究竟是如何从底层一层一层传到头结点的。 那么如果left和right都为空,则返回left或者right都是可以的,也就是返回空。 @@ -231,7 +231,7 @@ public: **那么我给大家归纳如下三点**: -1. 求最小公共祖先,需要从底向上遍历,那么二叉树,只能通过后序遍历(即:回溯)实现从低向上的遍历方式。 +1. 求最小公共祖先,需要从底向上遍历,那么二叉树,只能通过后序遍历(即:回溯)实现从底向上的遍历方式。 2. 在回溯的过程中,必然要遍历整棵二叉树,即使已经找到结果了,依然要把其他节点遍历完,因为要使用递归函数的返回值(也就是代码中的left和right)做逻辑判断。 @@ -332,16 +332,16 @@ var lowestCommonAncestor = function(root, p, q) { // 1. 确定递归的函数 const travelTree = function(root,p,q) { // 2. 确定递归终止条件 - if(root === null || root === p||root === q) { + if(root === null || root === p || root === q) { return root; } // 3. 确定递归单层逻辑 let left = travelTree(root.left,p,q); let right = travelTree(root.right,p,q); - if(left !== null&&right !== null) { + if(left !== null && right !== null) { return root; } - if(left ===null) { + if(left === null) { return right; } return left; From 1287679e8eedc2c49b5e61946a15445e345b4cf4 Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Sun, 4 Dec 2022 23:10:10 +0800 Subject: [PATCH 1328/3019] =?UTF-8?q?update=200235.=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=90=9C=E7=B4=A2=E6=A0=91=E7=9A=84=E6=9C=80=E8=BF=91=E5=85=AC?= =?UTF-8?q?=E5=85=B1=E7=A5=96=E5=85=88:=20=E6=9B=BF=E6=8D=A2=20go=20?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...54\345\205\261\347\245\226\345\205\210.md" | 30 ++++++++++++------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git "a/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" "b/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" index c90b3d8cd4..391d1cfbd7 100644 --- "a/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" +++ "b/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" @@ -303,14 +303,22 @@ class Solution: 递归法: ```go -//利用BSL的性质(前序遍历有序) func lowestCommonAncestor(root, p, q *TreeNode) *TreeNode { - if root==nil{return nil} - if root.Val>p.Val&&root.Val>q.Val{//当前节点的值大于给定的值,则说明满足条件的在左边 - return lowestCommonAncestor(root.Left,p,q) - }else if root.Val p.Val && root.Val > q.Val { + root = root.Left + } + if root.Val < p.Val && root.Val < q.Val { + root = root.Right + } + if (root.Val - p.Val) * (root.Val - q.Val) <= 0 { + return root + } + } + return root } ``` @@ -326,11 +334,11 @@ var lowestCommonAncestor = function(root, p, q) { if(root === null) { return root; } - if(root.val>p.val&&root.val>q.val) { + if(root.val > p.val && root.val > q.val) { // 向左子树查询 return root.left = lowestCommonAncestor(root.left,p,q); } - if(root.valp.val&&root.val>q.val) { + if(root.val > p.val && root.val > q.val) { root = root.left; - }else if(root.val Date: Wed, 30 Nov 2022 23:04:29 +0800 Subject: [PATCH 1329/3019] =?UTF-8?q?=E5=A2=9E=E5=8A=A00005.=E6=9C=80?= =?UTF-8?q?=E9=95=B7=E5=9B=9E=E6=96=87=E5=AD=90=E4=B8=B2C#=20=E5=8B=95?= =?UTF-8?q?=E6=85=8B=E8=A6=8F=E5=89=87=E7=9A=84=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...36\346\226\207\345\255\220\344\270\262.md" | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git "a/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" "b/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" index 62c2cbde61..84d8d83530 100644 --- "a/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" +++ "b/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" @@ -615,6 +615,38 @@ char * longestPalindrome(char * s){ } ``` +C#: + +動態規則: +```c# +public class Solution { + + public string LongestPalindrome(string s) { + bool[,] dp = new bool[s.Length, s.Length]; + int maxlenth = 0; + int left = 0; + int right = 0; + for(int i = s.Length-1 ; i>=0; i--){ + for(int j = i; j maxlenth){ + maxlenth = j-i+1; + left = i; + right = j; + } + } + } + return s.Substring(left, maxlenth); + } +} +``` +

From d39ae16d2bca3e6e9b7b4ad0c2810ad4fdff5b81 Mon Sep 17 00:00:00 2001 From: Min Date: Wed, 30 Nov 2022 23:11:47 +0800 Subject: [PATCH 1330/3019] =?UTF-8?q?=E5=A2=9E=E5=8A=A00005.=E6=9C=80?= =?UTF-8?q?=E9=95=B7=E5=9B=9E=E6=96=87=E5=AD=90=E4=B8=B2C#=20=E9=9B=99?= =?UTF-8?q?=E6=8C=87=E9=87=9D=E7=9A=84=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...36\346\226\207\345\255\220\344\270\262.md" | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git "a/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" "b/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" index 84d8d83530..4d48f18458 100644 --- "a/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" +++ "b/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" @@ -647,6 +647,36 @@ public class Solution { } ``` +雙指針: +```C# +public class Solution { + int maxlenth = 0; + int left = 0; + int right = 0; + + public string LongestPalindrome(string s) { + int result = 0; + for (int 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.Substring(left, maxlenth); + } + + private void extend(string s, int i, int j, int n) { + while (i >= 0 && j < n && s[i] == s[j]) { + if (j - i + 1 > maxlenth) { + left = i; + right = j; + maxlenth = j - i + 1; + } + i--; + j++; + } + } +} +``` +

From e26fa7bf1d3a8bbd63ef583e526d1493cc85ff4c Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Sun, 4 Dec 2022 23:58:10 +0800 Subject: [PATCH 1331/3019] =?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:=20=E4=BF=AE=E6=94=B9=E9=94=99=E5=AD=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\204\346\217\222\345\205\245\346\223\215\344\275\234.md" | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git "a/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" "b/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" index 2e899e2284..432413b6f9 100644 --- "a/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" +++ "b/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" @@ -24,7 +24,7 @@ # 思路 -其实这道题目其实是一道简单题目,**但是题目中的提示:有多种有效的插入方式,还可以重构二叉搜索树,一下子吓退了不少人**,瞬间感觉题目复杂了很多。 +这道题目其实是一道简单题目,**但是题目中的提示:有多种有效的插入方式,还可以重构二叉搜索树,一下子吓退了不少人**,瞬间感觉题目复杂了很多。 其实**可以不考虑题目中提示所说的改变树的结构的插入方式。** @@ -157,7 +157,7 @@ public: 我之所以举这个例子,是想说明通过递归函数的返回值完成父子节点的赋值是可以带来便利的。 -**网上千变一律的代码,可能会误导大家认为通过递归函数返回节点 这样的写法是天经地义,其实这里是有优化的!** +**网上千篇一律的代码,可能会误导大家认为通过递归函数返回节点 这样的写法是天经地义,其实这里是有优化的!** ## 迭代 @@ -197,7 +197,7 @@ public: 首先在二叉搜索树中的插入操作,大家不用恐惧其重构搜索树,其实根本不用重构。 -然后在递归中,我们重点讲了如果通过递归函数的返回值完成新加入节点和其父节点的赋值操作,并强调了搜索树的有序性。 +然后在递归中,我们重点讲了如何通过递归函数的返回值完成新加入节点和其父节点的赋值操作,并强调了搜索树的有序性。 最后依然给出了迭代的方法,迭代的方法就需要记录当前遍历节点的父节点了,这个和没有返回值的递归函数实现的代码逻辑是一样的。 From 880c36c76a5f6f3adc973063cd10120ce0e0c857 Mon Sep 17 00:00:00 2001 From: Xi Wen <16098574d@connect.polyu.hk> Date: Sun, 4 Dec 2022 17:06:13 -0800 Subject: [PATCH 1332/3019] =?UTF-8?q?Update=200102.=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=A0=91=E7=9A=84=E5=B1=82=E5=BA=8F=E9=81=8D=E5=8E=86.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit typo --- ...\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" index 9985971f2c..29203a0ece 100644 --- "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" +++ "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" @@ -2955,7 +2955,7 @@ impl Solution { * 107.二叉树的层次遍历II * 199.二叉树的右视图 * 637.二叉树的层平均值 -* 429.N叉树的前序遍历 +* 429.N叉树的层序遍历 * 515.在每个树行中找最大值 * 116.填充每个节点的下一个右侧节点指针 * 117.填充每个节点的下一个右侧节点指针II From b93d9f6d89406cf2980cf94cfe313d7463d04d9e Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Mon, 5 Dec 2022 10:19:20 +0800 Subject: [PATCH 1333/3019] =?UTF-8?q?update=200450.=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=90=9C=E7=B4=A2=E6=A0=91=E4=B8=AD=E7=9A=84?= =?UTF-8?q?=E8=8A=82=E7=82=B9:=20=E4=BF=AE=E6=94=B9=E9=94=99=E5=AD=97?= =?UTF-8?q?=EF=BC=8C=E4=BC=98=E5=8C=96=20go=20=E4=BB=A3=E7=A0=81=E9=A3=8E?= =?UTF-8?q?=E6=A0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...55\347\232\204\350\212\202\347\202\271.md" | 42 +++++++++---------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git "a/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" "b/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" index d178596ead..0b4048d509 100644 --- "a/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" +++ "b/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" @@ -25,7 +25,7 @@ # 思路 -搜索树的节点删除要比节点增加复杂的多,有很多情况需要考虑,做好心里准备。 +搜索树的节点删除要比节点增加复杂的多,有很多情况需要考虑,做好心理准备。 ## 递归 @@ -33,7 +33,7 @@ * 确定递归函数参数以及返回值 -说道递归函数的返回值,在[二叉树:搜索树中的插入操作](https://programmercarl.com/0701.二叉搜索树中的插入操作.html)中通过递归返回值来加入新节点, 这里也可以通过递归返回值删除节点。 +说到递归函数的返回值,在[二叉树:搜索树中的插入操作](https://programmercarl.com/0701.二叉搜索树中的插入操作.html)中通过递归返回值来加入新节点, 这里也可以通过递归返回值删除节点。 代码如下: @@ -66,7 +66,7 @@ if (root == nullptr) return root; ![450.删除二叉搜索树中的节点](https://tva1.sinaimg.cn/large/008eGmZEly1gnbj3k596mg30dq0aigyz.gif) -动画中棵二叉搜索树中,删除元素7, 那么删除节点(元素7)的左孩子就是5,删除节点(元素7)的右子树的最左面节点是元素8。 +动画中的二叉搜索树中,删除元素7, 那么删除节点(元素7)的左孩子就是5,删除节点(元素7)的右子树的最左面节点是元素8。 将删除节点(元素7)的左孩子放到删除节点(元素7)的右子树的最左面节点(元素8)的左孩子上,就是把5为根节点的子树移到了8的左孩子的位置。 @@ -251,7 +251,7 @@ public: **这里最关键的逻辑就是第五种情况(删除一个左右孩子都不为空的节点),这种情况一定要想清楚**。 -而且就算想清楚了,对应的代码也未必可以写出来,所以**这道题目即考察思维逻辑,也考察代码能力**。 +而且就算想清楚了,对应的代码也未必可以写出来,所以**这道题目既考察思维逻辑,也考察代码能力**。 递归中我给出了两种写法,推荐大家学会第一种(利用搜索树的特性)就可以了,第二种递归写法其实是比较绕的。 @@ -390,39 +390,39 @@ class Solution: ```Go // 递归版本 func deleteNode(root *TreeNode, key int) *TreeNode { - if root==nil{ + if root == nil { return nil } - if keyroot.Val{ - root.Right=deleteNode(root.Right,key) + if key > root.Val { + root.Right = deleteNode(root.Right, key) return root } - if root.Right==nil{ + if root.Right == nil { return root.Left } - if root.Left==nil{ + if root.Left == nil{ return root.Right } - minnode:=root.Right - for minnode.Left!=nil{ - minnode=minnode.Left + minnode := root.Right + for minnode.Left != nil { + minnode = minnode.Left } - root.Val=minnode.Val - root.Right=deleteNode1(root.Right) + root.Val = minnode.Val + root.Right = deleteNode1(root.Right) return root } -func deleteNode1(root *TreeNode)*TreeNode{ - if root.Left==nil{ - pRight:=root.Right - root.Right=nil +func deleteNode1(root *TreeNode)*TreeNode { + if root.Left == nil { + pRight := root.Right + root.Right = nil return pRight } - root.Left=deleteNode1(root.Left) + root.Left = deleteNode1(root.Left) return root } // 迭代版本 From 10302b0a143d0b0c736466da197c6dba8ff76c07 Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Mon, 5 Dec 2022 14:33:48 +0800 Subject: [PATCH 1334/3019] =?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:=20=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E4=BB=A3=E7=A0=81=E9=A3=8E=E6=A0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...11\346\220\234\347\264\242\346\240\221.md" | 56 +++++++++---------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git "a/problems/0669.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0669.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" index 98af3c26ab..c2d7b79ba2 100644 --- "a/problems/0669.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" +++ "b/problems/0669.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" @@ -59,7 +59,7 @@ public: ![669.修剪二叉搜索树1](https://img-blog.csdnimg.cn/20210204155327203.png) -理解了最关键部分了我们在递归三部曲: +理解了最关键部分了我们再递归三部曲: * 确定递归函数的参数以及返回值 @@ -179,7 +179,7 @@ public: }; ``` -只看代码,其实不太好理解节点是符合移除的,这一块大家可以自己在模拟模拟! +只看代码,其实不太好理解节点是如何移除的,这一块大家可以自己再模拟模拟! ## 迭代法 @@ -301,19 +301,19 @@ class Solution: // 递归 func trimBST(root *TreeNode, low int, high int) *TreeNode { - if root==nil{ + if root == nil { return nil } - if root.Valhigh{//如果该节点的值大于最大值,则该节点更换为该节点的左节点值,继续遍历 - left:=trimBST(root.Left,low,high) + if root.Val > high { //如果该节点的值大于最大值,则该节点更换为该节点的左节点值,继续遍历 + left := trimBST(root.Left, low, high) return left } - root.Left=trimBST(root.Left,low,high) - root.Right=trimBST(root.Right,low,high) + root.Left = trimBST(root.Left, low, high) + root.Right = trimBST(root.Right, low, high) return root } @@ -323,25 +323,25 @@ func trimBST(root *TreeNode, low int, high int) *TreeNode { return nil } // 处理 root,让 root 移动到[low, high] 范围内,注意是左闭右闭 - for root != nil && (root.Valhigh){ - if root.Val < low{ + for root != nil && (root.Val < low || root.Val > high) { + if root.Val < low { root = root.Right - }else{ + } else { root = root.Left } } cur := root // 此时 root 已经在[low, high] 范围内,处理左孩子元素小于 low 的情况(左节点是一定小于 root.Val,因此天然小于 high) - for cur != nil{ - for cur.Left!=nil && cur.Left.Val < low{ + for cur != nil { + for cur.Left != nil && cur.Left.Val < low { cur.Left = cur.Left.Right } cur = cur.Left } cur = root // 此时 root 已经在[low, high] 范围内,处理右孩子大于 high 的情况 - for cur != nil{ - for cur.Right!=nil && cur.Right.Val > high{ + for cur != nil { + for cur.Right != nil && cur.Right.Val > high { cur.Right = cur.Right.Left } cur = cur.Right @@ -359,24 +359,24 @@ var trimBST = function(root, low, high) { if(root === null) { return null; } - while(root !==null &&(root.valhigh)) { - if(root.val high)) { + if(root.val < low) { root = root.right; }else { root = root.left; } } let cur = root; - while(cur!==null) { - while(cur.left&&cur.left.valhigh) { + while(cur !== null) { + while(cur.right && cur.right.val > high) { cur.right = cur.right.left; } cur = cur.right; @@ -391,16 +391,16 @@ var trimBST = function (root,low,high) { if(root === null) { return null; } - if(root.valhigh) { - let left = trimBST(root.left,low,high); + if(root.val > high) { + let left = trimBST(root.left, low, high); return left; } - root.left = trimBST(root.left,low,high); - root.right = trimBST(root.right,low,high); + root.left = trimBST(root.left, low, high); + root.right = trimBST(root.right, low, high); return root; } ``` From 57c41cd67076e7969e35a7aea353bac9931763e1 Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Mon, 5 Dec 2022 15:39:02 +0800 Subject: [PATCH 1335/3019] =?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:=20=E4=BC=98=E5=8C=96go=20?= =?UTF-8?q?=E5=92=8C=20js=20=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...11\346\220\234\347\264\242\346\240\221.md" | 47 ++++++++++--------- 1 file changed, 26 insertions(+), 21 deletions(-) diff --git "a/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" index 9318a0e2e5..ffb60b38fa 100644 --- "a/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" +++ "b/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" @@ -35,7 +35,7 @@ 因为只要给我们一个有序数组,如果强调平衡,都可以以线性结构来构造二叉搜索树。 -例如 有序数组[-10,-3,0,5,9] 可以就可以构造成这样的二叉搜索树,如图。 +例如 有序数组[-10,-3,0,5,9] 就可以构造成这样的二叉搜索树,如图。 ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20220930173553.png) @@ -147,7 +147,7 @@ public: }; ``` -**注意:在调用traversal的时候为什么传入的left和right为什么是0和nums.size() - 1,因为定义的区间为左闭右闭**。 +**注意:在调用traversal的时候传入的left和right为什么是0和nums.size() - 1,因为定义的区间为左闭右闭**。 ## 迭代法 @@ -354,10 +354,15 @@ class Solution: ```go func sortedArrayToBST(nums []int) *TreeNode { - if len(nums)==0{return nil}//终止条件,最后数组为空则可以返回 - root:=&TreeNode{nums[len(nums)/2],nil,nil}//按照BSL的特点,从中间构造节点 - root.Left=sortedArrayToBST(nums[:len(nums)/2])//数组的左边为左子树 - root.Right=sortedArrayToBST(nums[len(nums)/2+1:])//数字的右边为右子树 + if len(nums) == 0 { //终止条件,最后数组为空则可以返回 + return nil + } + idx := len(nums)/2 + root := &TreeNode{Val: nums[idx]} + + root.Left = sortedArrayToBST(nums[:idx]) + root.Right = sortedArrayToBST(nums[idx+1:]) + return root } ``` @@ -384,33 +389,33 @@ var sortedArrayToBST = function (nums) { 迭代 ```JavaScript var sortedArrayToBST = function(nums) { - if(nums.length===0){ + if(nums.length===0) { return null; } - let root=new TreeNode(0); //初始根节点 - let nodeQue=[root]; //放遍历的节点,并初始化 - let leftQue=[0]; //放左区间的下标,初始化 - let rightQue=[nums.length-1]; // 放右区间的下标 + let root = new TreeNode(0); //初始根节点 + let nodeQue = [root]; //放遍历的节点,并初始化 + let leftQue = [0]; //放左区间的下标,初始化 + let rightQue = [nums.length-1]; // 放右区间的下标 - while(nodeQue.length){ - let curNode=nodeQue.pop(); - let left=leftQue.pop(); - let right=rightQue.pop(); - let mid=left+Math.floor((right-left)/2); + while(nodeQue.length) { + let curNode = nodeQue.pop(); + let left = leftQue.pop(); + let right = rightQue.pop(); + let mid = left + Math.floor((right-left)/2); - curNode.val=nums[mid]; //将下标为mid的元素给中间节点 + curNode.val = nums[mid]; //将下标为mid的元素给中间节点 // 处理左区间 - if(left<=mid-1){ - curNode.left=new TreeNode(0); + if(left <= mid-1) { + curNode.left = new TreeNode(0); nodeQue.push(curNode.left); leftQue.push(left); rightQue.push(mid-1); } // 处理右区间 - if(right>=mid+1){ - curNode.right=new TreeNode(0); + if(right >= mid+1) { + curNode.right = new TreeNode(0); nodeQue.push(curNode.right); leftQue.push(mid+1); rightQue.push(right); From c03d5310a736f16accb2bf2e294743ac24e7d913 Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Mon, 5 Dec 2022 19:13:43 +0800 Subject: [PATCH 1336/3019] =?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=EF=BC=9A=E6=9B=BF=E6=8D=A2=20go=20?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...72\347\264\257\345\212\240\346\240\221.md" | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git "a/problems/0538.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md" "b/problems/0538.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md" index 823771b1d7..9940e604ae 100644 --- "a/problems/0538.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md" +++ "b/problems/0538.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md" @@ -45,11 +45,11 @@ # 思路 -一看到累加树,相信很多小伙伴都会疑惑:如何累加?遇到一个节点,然后在遍历其他节点累加?怎么一想这么麻烦呢。 +一看到累加树,相信很多小伙伴都会疑惑:如何累加?遇到一个节点,然后再遍历其他节点累加?怎么一想这么麻烦呢。 然后再发现这是一棵二叉搜索树,二叉搜索树啊,这是有序的啊。 -那么有序的元素如果求累加呢? +那么有序的元素如何求累加呢? **其实这就是一棵树,大家可能看起来有点别扭,换一个角度来看,这就是一个有序数组[2, 5, 13],求从后到前的累加数组,也就是[20, 18, 13],是不是感觉这就简单了。** @@ -233,23 +233,23 @@ class Solution: ## Go 弄一个sum暂存其和值 - ```go - //右中左 -func bstToGst(root *TreeNode) *TreeNode { - var sum int - RightMLeft(root,&sum) - return root -} -func RightMLeft(root *TreeNode,sum *int) *TreeNode { - if root==nil{return nil}//终止条件,遇到空节点就返回 - RightMLeft(root.Right,sum)//先遍历右边 - temp:=*sum//暂存总和值 - *sum+=root.Val//将总和值变更 - root.Val+=temp//更新节点值 - RightMLeft(root.Left,sum)//遍历左节点 +var pre int +func convertBST(root *TreeNode) *TreeNode { + pre = 0 + traversal(root) return root } + +func traversal(cur *TreeNode) { + if cur == nil { + return + } + traversal(cur.Right) + cur.Val += pre + pre = cur.Val + traversal(cur.Left) +} ``` ## JavaScript From 40db2893574c453acfeba8399410667be68cc1bb Mon Sep 17 00:00:00 2001 From: fw_qaq <82551626+fwqaaq@users.noreply.github.com> Date: Mon, 5 Dec 2022 22:26:55 +0800 Subject: [PATCH 1337/3019] =?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 --- ...22\345\205\245\346\223\215\344\275\234.md" | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git "a/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" "b/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" index 2e899e2284..b8d53b04c5 100644 --- "a/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" +++ "b/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" @@ -641,6 +641,42 @@ object Solution { } ``` +### rust + +迭代: + +```rust +impl Solution { + pub fn insert_into_bst( + root: Option>>, + val: i32, + ) -> Option>> { + if root.is_none() { + return Some(Rc::new(RefCell::new(TreeNode::new(val)))); + } + let mut cur = root.clone(); + let mut pre = None; + while let Some(node) = cur.clone() { + pre = cur; + if node.borrow().val > val { + cur = node.borrow().left.clone(); + } else { + cur = node.borrow().right.clone(); + }; + } + let r = Some(Rc::new(RefCell::new(TreeNode::new(val)))); + let mut p = pre.as_ref().unwrap().borrow_mut(); + if val < p.val { + p.left = r; + } else { + p.right = r; + } + + root + } +} +``` +

From eb76f57a19e813e77490931d97787a4d8b4a0552 Mon Sep 17 00:00:00 2001 From: fw_qaq <82551626+fwqaaq@users.noreply.github.com> Date: Mon, 5 Dec 2022 22:55:08 +0800 Subject: [PATCH 1338/3019] =?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 --- ...22\345\205\245\346\223\215\344\275\234.md" | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git "a/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" "b/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" index b8d53b04c5..559c3900ea 100644 --- "a/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" +++ "b/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" @@ -677,6 +677,30 @@ impl Solution { } ``` +递归: + +```rust +impl Solution { + pub fn insert_into_bst( + root: Option>>, + val: i32, + ) -> Option>> { + if let Some(node) = &root { + if node.borrow().val > val { + let left = Self::insert_into_bst(node.borrow_mut().left.take(), val); + node.borrow_mut().left = left; + } else { + let right = Self::insert_into_bst(node.borrow_mut().right.take(), val); + node.borrow_mut().right = right; + } + root + } else { + Some(Rc::new(RefCell::new(TreeNode::new(val)))) + } + } +} +``` +

From dab64d0d6a9170d22391f1960d552ab89b56d190 Mon Sep 17 00:00:00 2001 From: ZerenZhang2022 <118794589+ZerenZhang2022@users.noreply.github.com> Date: Mon, 5 Dec 2022 23:03:35 -0500 Subject: [PATCH 1339/3019] =?UTF-8?q?Update=200102.=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=A0=91=E7=9A=84=E5=B1=82=E5=BA=8F=E9=81=8D=E5=8E=86.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # LeetCode 429. N-ary Tree Level Order Traversal python, 递归法 --- ...1\202\345\272\217\351\201\215\345\216\206.md" | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" index 9985971f2c..cb5ba6bf6a 100644 --- "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" +++ "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" @@ -1346,6 +1346,22 @@ class Solution: return results ``` +```python +# LeetCode 429. N-ary Tree Level Order Traversal +# 递归法 +class Solution: + def levelOrder(self, root: 'Node') -> List[List[int]]: + if not root: return [] + result=[] + def traversal(root,depth): + if len(result)==depth:result.append([]) + result[depth].append(root.val) + if root.children: + for i in range(len(root.children)):traversal(root.children[i],depth+1) + + traversal(root,0) + return result +``` java: ```java From 0131465339d570fb8c47ddea3eb8f9a7d6cbf577 Mon Sep 17 00:00:00 2001 From: 5Reason Date: Tue, 6 Dec 2022 12:03:55 +0800 Subject: [PATCH 1340/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20131.=E5=88=86?= =?UTF-8?q?=E5=89=B2=E5=9B=9E=E6=96=87=20=E4=B8=B2=20js=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E7=9A=84=E5=8F=98=E9=87=8F=E5=90=8D,=E5=92=8C=E6=95=99?= =?UTF-8?q?=E7=A8=8B=E4=BF=9D=E6=8C=81=E4=B8=80=E8=87=B4=E9=81=BF=E5=85=8D?= =?UTF-8?q?=E6=B7=B7=E6=B7=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...5\211\262\345\233\236\346\226\207\344\270\262.md" | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git "a/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" "b/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" index 3a3c2d738e..8e180ec805 100644 --- "a/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" +++ "b/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" @@ -494,15 +494,15 @@ var partition = function(s) { const res = [], path = [], len = s.length; backtracking(0); return res; - function backtracking(i) { - if(i >= len) { + function backtracking(startIndex) { + if(startIndex >= len) { res.push(Array.from(path)); return; } - for(let j = i; j < len; j++) { - if(!isPalindrome(s, i, j)) continue; - path.push(s.slice(i, j + 1)); - backtracking(j + 1); + for(let i = startIndex; i < len; i++) { + if(!isPalindrome(s, startIndex, i)) continue; + path.push(s.slice(startIndex, i + 1)); + backtracking(i + 1); path.pop(); } } From 2575ff3b5c3dbc59f13cd469a785abaf4ad92325 Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Wed, 7 Dec 2022 16:30:05 +0800 Subject: [PATCH 1341/3019] =?UTF-8?q?update=200235.=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=90=9C=E7=B4=A2=E6=A0=91=E7=9A=84=E6=9C=80=E8=BF=91=E5=85=AC?= =?UTF-8?q?=E5=85=B1=E7=A5=96=E5=85=88:=20=E4=BF=AE=E6=94=B9=E6=96=87?= =?UTF-8?q?=E5=AD=97=E6=95=B0=E6=8D=AE=E5=92=8C=E5=9B=BE=E7=89=87=E4=B8=8D?= =?UTF-8?q?=E5=AF=B9=E5=BA=94=E7=9A=84=E5=9C=B0=E6=96=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...77\221\345\205\254\345\205\261\347\245\226\345\205\210.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" "b/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" index 391d1cfbd7..7f8f6422bb 100644 --- "a/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" +++ "b/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" @@ -60,12 +60,12 @@ 而递归遍历顺序,本题就不涉及到 前中后序了(这里没有中节点的处理逻辑,遍历顺序无所谓了)。 -如图所示:p为节点3,q为节点5 +如图所示:p为节点6,q为节点9 ![235.二叉搜索树的最近公共祖先2](https://code-thinking-1253855093.file.myqcloud.com/pics/20220926165141.png) -可以看出直接按照指定的方向,就可以找到节点4,为最近公共祖先,而且不需要遍历整棵树,找到结果直接返回! +可以看出直接按照指定的方向,就可以找到节点8,为最近公共祖先,而且不需要遍历整棵树,找到结果直接返回! ## 递归法 From 8364dcd0f181e6152f00b6f6bf415f296b451e0b Mon Sep 17 00:00:00 2001 From: jwcen Date: Wed, 7 Dec 2022 19:43:34 +0800 Subject: [PATCH 1342/3019] =?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=A0=91=E7=9A=84?= =?UTF-8?q?=E5=B1=82=E5=BA=8F=E9=81=8D=E5=8E=86=EF=BC=9A=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=E5=88=87=E7=89=87=E6=A8=A1=E6=8B=9F=E9=98=9F=E5=88=97=EF=BC=8C?= =?UTF-8?q?=E6=98=93=E7=90=86=E8=A7=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...02\345\272\217\351\201\215\345\216\206.md" | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" index 9985971f2c..bc78cb36d0 100644 --- "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" +++ "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" @@ -271,6 +271,36 @@ func levelOrder(root *TreeNode) [][]int { return res } + +/** +102. 二叉树的层序遍历:使用切片模拟队列,易理解 + */ +func levelOrder(root *TreeNode) (res [][]int) { + if root == nil { + return + } + + curLevel := []*TreeNode{root} // 存放当前层节点 + for len(curLevel) > 0 { + nextLevel := []*TreeNode{} // 准备通过当前层生成下一层 + vals := []int{} + + for _, node := range curLevel { + vals = append(vals, node.Val) // 收集当前层的值 + // 收集下一层的节点 + if node.Left != nil { + nextLevel = append(nextLevel, node.Left) + } + if node.Right != nil { + nextLevel = append(nextLevel, node.Right) + } + } + res = append(res, vals) + curLevel = nextLevel // 将下一层变成当前层 + } + + return +} ``` javascript代码: From 380fabb247985853a8b7fbe57bf2b340365ac5aa Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Wed, 7 Dec 2022 20:05:34 +0800 Subject: [PATCH 1343/3019] =?UTF-8?q?update=200077.=E7=BB=84=E5=90=88?= =?UTF-8?q?=EF=BC=9A=E6=9B=B4=E6=96=B0python=20=E5=92=8C=20go=20=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "problems/0077.\347\273\204\345\220\210.md" | 98 ++++++++------------- 1 file changed, 35 insertions(+), 63 deletions(-) diff --git "a/problems/0077.\347\273\204\345\220\210.md" "b/problems/0077.\347\273\204\345\220\210.md" index dabd2e8c3f..854b302b59 100644 --- "a/problems/0077.\347\273\204\345\220\210.md" +++ "b/problems/0077.\347\273\204\345\220\210.md" @@ -34,7 +34,7 @@ # 思路 -本题这是回溯法的经典题目。 +本题是回溯法的经典题目。 直接的解法当然是使用for循环,例如示例中k为2,很容易想到 用两个for循环,这样就可以输出 和示例中一样的结果。 @@ -82,13 +82,13 @@ for (int i = 1; i <= n; i++) { 如果脑洞模拟回溯搜索的过程,绝对可以让人窒息,所以需要抽象图形结构来进一步理解。 -**我们在[关于回溯算法,你该了解这些!](https://programmercarl.com/回溯算法理论基础.html)中说道回溯法解决的问题都可以抽象为树形结构(N叉树),用树形结构来理解回溯就容易多了**。 +**我们在[关于回溯算法,你该了解这些!](https://programmercarl.com/回溯算法理论基础.html)中说到回溯法解决的问题都可以抽象为树形结构(N叉树),用树形结构来理解回溯就容易多了**。 那么我把组合问题抽象为如下树形结构: ![77.组合](https://img-blog.csdnimg.cn/20201123195223940.png) -可以看出这个棵树,一开始集合是 1,2,3,4, 从左向右取数,取过的数,不在重复取。 +可以看出这棵树,一开始集合是 1,2,3,4, 从左向右取数,取过的数,不再重复取。 第一次取1,集合变为2,3,4 ,因为k为2,我们只需要再取一个数就可以了,分别取2,3,4,得到集合[1,2] [1,3] [1,4],以此类推。 @@ -120,7 +120,7 @@ vector path; // 用来存放符合条件结果 其实不定义这两个全局变量也是可以的,把这两个变量放进递归函数的参数里,但函数里参数太多影响可读性,所以我定义全局变量了。 -函数里一定有两个参数,既然是集合n里面取k的数,那么n和k是两个int型的参数。 +函数里一定有两个参数,既然是集合n里面取k个数,那么n和k是两个int型的参数。 然后还需要一个参数,为int型变量startIndex,这个参数用来记录本层递归的中,集合从哪里开始遍历(集合就是[1,...,n] )。 @@ -389,9 +389,8 @@ class Solution(object): # 剪枝, 最后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): + for x in range(startidx, last_startidx + 1): path.append(x) backtracking(n, k, x + 1) # 递归 path.pop() # 回溯 @@ -435,6 +434,36 @@ class Solution: return res ``` +### Go +```Go +var ( + path []int + res [][]int +) + +func combine(n int, k int) [][]int { + path, res = make([]int, 0, k), make([][]int, 0) + dfs(n, k, 1) + return res +} + +func dfs(n int, k int, start int) { + if len(path) == k { // 说明已经满足了k个数的要求 + tmp := make([]int, k) + copy(tmp, path) + res = append(res, tmp) + return + } + for i := start; i <= n; i++ { // 从start开始,不往回走,避免出现重复组合 + if n - i + 1 < k - len(path) { // 剪枝 + break + } + path = append(path, i) + dfs(n, k, i+1) + path = path[:len(path)-1] + } +} +``` ### javascript @@ -481,63 +510,6 @@ function combine(n: number, k: number): number[][] { }; ``` - - -### Go -```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] - } -} -``` -剪枝: -```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] - } -} -``` - ### Rust ```Rust From 0cba0854d3533ada7847c7263811c9430f618264 Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Wed, 7 Dec 2022 20:19:23 +0800 Subject: [PATCH 1344/3019] =?UTF-8?q?update=200077.=E7=BB=84=E5=90=88?= =?UTF-8?q?=E4=BC=98=E5=8C=96:=20=E6=9B=B4=E6=8D=A2=20go=20=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...04\345\220\210\344\274\230\345\214\226.md" | 40 +++++++++---------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git "a/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" "b/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" index 91c7ce3baa..34318d16f3 100644 --- "a/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" +++ "b/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" @@ -133,7 +133,7 @@ public: # 总结 -本篇我们准对求组合问题的回溯法代码做了剪枝优化,这个优化如果不画图的话,其实不好理解,也不好讲清楚。 +本篇我们针对求组合问题的回溯法代码做了剪枝优化,这个优化如果不画图的话,其实不好理解,也不好讲清楚。 所以我依然是把整个回溯过程抽象为一棵树形结构,然后可以直观的看出,剪枝究竟是剪的哪里。 @@ -194,28 +194,28 @@ class Solution: ``` Go: ```Go -var res [][]int +var ( + path []int + 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 + path, res = make([]int, 0, k), make([][]int, 0) + dfs(n, k, 1) + 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) + +func dfs(n int, k int, start int) { + if len(path) == k { + tmp := make([]int, k) + copy(tmp, path) + res = append(res, tmp) + return } - 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] + for i := start; i <= n - (k-len(path)) + 1; i++ { + path = append(path, i) + dfs(n, k, i+1) + path = path[:len(path)-1] } } ``` From 77aeb31bad82702662be54ab77b7c640b6e30ca5 Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Wed, 7 Dec 2022 21:07:21 +0800 Subject: [PATCH 1345/3019] =?UTF-8?q?update=200216.=E7=BB=84=E5=90=88?= =?UTF-8?q?=E6=80=BB=E5=92=8CIII:=20=E6=9B=BF=E6=8D=A2=20go=20=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...345\220\210\346\200\273\345\222\214III.md" | 41 ++++++++++--------- 1 file changed, 22 insertions(+), 19 deletions(-) diff --git "a/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" "b/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" index 9fc949cce2..19fe1eb99a 100644 --- "a/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" +++ "b/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" @@ -36,7 +36,7 @@ 想到这一点了,做过[77. 组合](https://programmercarl.com/0077.组合.html)之后,本题是简单一些了。 -本题k相当于了树的深度,9(因为整个集合就是9个数)就是树的宽度。 +本题k相当于树的深度,9(因为整个集合就是9个数)就是树的宽度。 例如 k = 2,n = 4的话,就是在集合[1,2,3,4,5,6,7,8,9]中求 k(个数) = 2, n(和) = 4的组合。 @@ -380,29 +380,32 @@ class Solution: 回溯+减枝 ```go +var ( + res [][]int + path []int +) func combinationSum3(k int, n int) [][]int { - var track []int// 遍历路径 - var result [][]int// 存放结果集 - backTree(n,k,1,&track,&result) - return result + res, path = make([][]int, 0), make([]int, 0, k) + dfs(k, n, 1, 0) + return res } -func backTree(n,k,startIndex int,track *[]int,result *[][]int){ - if len(*track)==k{ - var sum int - tmp:=make([]int,k) - for k,v:=range *track{ - sum+=v - tmp[k]=v - } - if sum==n{ - *result=append(*result,tmp) + +func dfs(k, n int, start int, sum int) { + if len(path) == k { + if sum == n { + tmp := make([]int, k) + copy(tmp, path) + res = append(res, tmp) } return } - for i:=startIndex;i<=9-(k-len(*track))+1;i++{//减枝(k-len(*track)表示还剩多少个可填充的元素) - *track=append(*track,i)//记录路径 - backTree(n,k,i+1,track,result)//递归 - *track=(*track)[:len(*track)-1]//回溯 + for i := start; i <= 9; i++ { + if sum + i > n || 9-i+1 < k-len(path) { + break + } + path = append(path, i) + dfs(k, n, i+1, sum+i) + path = path[:len(path)-1] } } ``` From c593fd5bbdae6c89dc046e7b926d7a6839cc098d Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Wed, 7 Dec 2022 21:27:44 +0800 Subject: [PATCH 1346/3019] =?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?:=20=E6=9B=B4=E6=96=B0=20go=20=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...27\346\257\215\347\273\204\345\220\210.md" | 51 ++++++++----------- 1 file changed, 22 insertions(+), 29 deletions(-) diff --git "a/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" "b/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" index dd820a3911..12a45a61ab 100644 --- "a/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" +++ "b/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" @@ -120,7 +120,7 @@ for (int i = 0; i < letters.size(); i++) { **注意这里for循环,可不像是在[回溯算法:求组合问题!](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)都是是求同一个集合中的组合!** +**因为本题每一个数字代表的是不同集合,也就是求不同集合之间的组合,而[77. 组合](https://programmercarl.com/0077.组合.html)和[216.组合总和III](https://programmercarl.com/0216.组合总和III.html)都是求同一个集合中的组合!** 注意:输入1 * #按键等等异常情况 @@ -356,38 +356,32 @@ class Solution: 主要在于递归中传递下一个数字 ```go +var ( + m []string + path []byte + res []string +) func letterCombinations(digits string) []string { - lenth:=len(digits) - if lenth==0 ||lenth>4{ - return nil + m = []string{"abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"} + path, res = make([]byte, 0), make([]string, 0) + if digits == "" { + return res } - digitsMap:= [10]string{ - "", // 0 - "", // 1 - "abc", // 2 - "def", // 3 - "ghi", // 4 - "jkl", // 5 - "mno", // 6 - "pqrs", // 7 - "tuv", // 8 - "wxyz", // 9 - } - res:=make([]string,0) - recursion("",digits,0,digitsMap,&res) - return res + dfs(digits, 0) + return res } -func recursion(tempString ,digits string, Index int,digitsMap [10]string, res *[]string) {//index表示第几个数字 - if len(tempString)==len(digits){//终止条件,字符串长度等于digits的长度 - *res=append(*res,tempString) +func dfs(digits string, start int) { + if len(path) == len(digits) { //终止条件,字符串长度等于digits的长度 + tmp := string(path) + res = append(res, tmp) return } - tmpK:=digits[Index]-'0' // 将index指向的数字转为int(确定下一个数字) - letter:=digitsMap[tmpK]// 取数字对应的字符集 - for i:=0;i Date: Wed, 7 Dec 2022 23:18:23 +0800 Subject: [PATCH 1347/3019] =?UTF-8?q?Update=200450.=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=90=9C=E7=B4=A2=E6=A0=91=E4=B8=AD=E7=9A=84?= =?UTF-8?q?=E8=8A=82=E7=82=B9.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...55\347\232\204\350\212\202\347\202\271.md" | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git "a/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" "b/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" index 0b4048d509..3d9a605052 100644 --- "a/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" +++ "b/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" @@ -657,6 +657,39 @@ object Solution { } ``` +## rust + +```rust +impl Solution { + pub fn delete_node( + root: Option>>, + key: i32, + ) -> Option>> { + root.as_ref()?; + + let mut node = root.as_ref().unwrap().borrow_mut(); + match node.val.cmp(&key) { + std::cmp::Ordering::Less => node.right = Self::delete_node(node.right.clone(), key), + std::cmp::Ordering::Equal => match (node.left.clone(), node.right.clone()) { + (None, None) => return None, + (None, Some(r)) => return Some(r), + (Some(l), None) => return Some(l), + (Some(l), Some(r)) => { + let mut cur = Some(r.clone()); + while let Some(n) = cur.clone().unwrap().borrow().left.clone() { + cur = Some(n); + } + cur.unwrap().borrow_mut().left = Some(l); + return Some(r); + } + }, + std::cmp::Ordering::Greater => node.left = Self::delete_node(node.left.clone(), key), + } + root.clone() + } +} +``` +

From 50632bc383163e690ee274867481b64070e7ca51 Mon Sep 17 00:00:00 2001 From: huhaonan <812559558@qq.com> Date: Thu, 8 Dec 2022 09:58:53 +0800 Subject: [PATCH 1348/3019] =?UTF-8?q?Java=E7=89=88=E6=9C=AC=E6=8C=89?= =?UTF-8?q?=E7=85=A7=E8=A7=86=E9=A2=91=E7=9A=84=E6=80=9D=E8=B7=AF=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...55\347\232\204\350\212\202\347\202\271.md" | 34 +++++++++---------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git "a/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" "b/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" index 50775cddff..de38944829 100644 --- "a/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" +++ "b/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" @@ -154,24 +154,23 @@ class Solution { ``` ```java -// 虚拟头结点 class Solution { - public ListNode swapPairs(ListNode head) { - - ListNode dummyNode = new ListNode(0); - dummyNode.next = head; - ListNode prev = dummyNode; - - while (prev.next != null && prev.next.next != null) { - ListNode temp = head.next.next; // 缓存 next - prev.next = head.next; // 将 prev 的 next 改为 head 的 next - head.next.next = head; // 将 head.next(prev.next) 的next,指向 head - head.next = temp; // 将head 的 next 接上缓存的temp - prev = head; // 步进1位 - head = head.next; // 步进1位 - } - return dummyNode.next; - } + ListNode dumyhead = new ListNode(-1); + dumyhead.next = head; // 设置一个虚拟头结点 + ListNode cur1 = dumyhead; // 将虚拟头结点指向head,这样方面后面做删除操作 + ListNode temp; // 临时节点,保存两个节点后面的节点 + ListNode firstnode; // 临时节点,保存两个节点之中的第一个节点 + ListNode secondnode; // 临时节点,保存两个节点之中的第二个节点 + while (cur1.next != null && cur1.next.next != null) { + temp = cur1.next.next.next; + firstnode = cur1.next; + secondnode = cur1.next.next; + cur1.next = secondnode; // 步骤一 + secondnode.next = firstnode; // 步骤二 + firstnode.next = temp; // 步骤三 + cur1 = firstnode; // cur移动,准备下一轮交换 + } + return dumyhead.next; } ``` @@ -430,3 +429,4 @@ impl Solution { + From 10cccc211edf7c96bb7d5c0fe580b0469ff8ed55 Mon Sep 17 00:00:00 2001 From: huhaonan <812559558@qq.com> Date: Thu, 8 Dec 2022 10:16:04 +0800 Subject: [PATCH 1349/3019] =?UTF-8?q?0024Java=E7=89=88=E6=8C=89=E8=A7=86?= =?UTF-8?q?=E9=A2=91=E6=80=9D=E8=B7=AF=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...55\347\232\204\350\212\202\347\202\271.md" | 23 ++++++++++--------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git "a/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" "b/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" index de38944829..4dc051aa74 100644 --- "a/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" +++ "b/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" @@ -155,22 +155,24 @@ class Solution { ```java class Solution { - ListNode dumyhead = new ListNode(-1); - dumyhead.next = head; // 设置一个虚拟头结点 - ListNode cur1 = dumyhead; // 将虚拟头结点指向head,这样方面后面做删除操作 + public ListNode swapPairs(ListNode head) { + ListNode dumyhead = new ListNode(-1); // 设置一个虚拟头结点 + dumyhead.next = head; // 将虚拟头结点指向head,这样方面后面做删除操作 + ListNode cur = dumyhead; ListNode temp; // 临时节点,保存两个节点后面的节点 ListNode firstnode; // 临时节点,保存两个节点之中的第一个节点 ListNode secondnode; // 临时节点,保存两个节点之中的第二个节点 - while (cur1.next != null && cur1.next.next != null) { - temp = cur1.next.next.next; - firstnode = cur1.next; - secondnode = cur1.next.next; - cur1.next = secondnode; // 步骤一 + while (cur.next != null && cur.next.next != null) { + temp = cur.next.next.next; + firstnode = cur.next; + secondnode = cur.next.next; + cur.next = secondnode; // 步骤一 secondnode.next = firstnode; // 步骤二 firstnode.next = temp; // 步骤三 - cur1 = firstnode; // cur移动,准备下一轮交换 + cur = firstnode; // cur移动,准备下一轮交换 } - return dumyhead.next; + return dumyhead.next; + } } ``` @@ -429,4 +431,3 @@ impl Solution { - From f01233e23ba0c296e8df959dc5a6b8f23ec2727d Mon Sep 17 00:00:00 2001 From: wang2jun <91008685+wang2jun@users.noreply.github.com> Date: Thu, 8 Dec 2022 13:52:50 +0800 Subject: [PATCH 1350/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20127=E5=8D=95?= =?UTF-8?q?=E8=AF=8D=E6=8E=A5=E9=BE=99=20TypeScript=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 添加 127单词接龙 TypeScript 版本代码 --- ...25\350\257\215\346\216\245\351\276\231.md" | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git "a/problems/0127.\345\215\225\350\257\215\346\216\245\351\276\231.md" "b/problems/0127.\345\215\225\350\257\215\346\216\245\351\276\231.md" index 2e30123d16..bc21d0ade1 100644 --- "a/problems/0127.\345\215\225\350\257\215\346\216\245\351\276\231.md" +++ "b/problems/0127.\345\215\225\350\257\215\346\216\245\351\276\231.md" @@ -247,6 +247,55 @@ var ladderLength = function(beginWord, endWord, wordList) { }; ``` +## TypeScript +```typescript +function ladderLength( + beginWord: string, + endWord: string, + wordList: string[] +): number { + const words = new Set(wordList); + if (!words.has(endWord)) return 0; + if (beginWord.length === 1) return 2; + let current = new Set([beginWord]); + let rightcurrent = new Set([endWord]); + words.delete(endWord); + let step = 1; + while (current.size) { + if (current.size > rightcurrent.size) { + [current, rightcurrent] = [rightcurrent, current]; + } + const temp: Set = new Set(); + for (const word of current) { + for (const right of rightcurrent) { + if (diffonechar(word, right)) { + return step + 1; + } + } + for (const other of words) { + if (diffonechar(other, word)) { + temp.add(other); + + words.delete(other); + } + } + } + if (temp.size === 0) return 0; + current = temp; + step = step + 1; + } + return 0; +} + +function diffonechar(word1: string, word2: string): boolean { + let changes = 0; + for (let i = 0; i < word1.length; i++) { + if (word1[i] != word2[i]) changes += 1; + } + return changes === 1; +} +``` +

From fded0906dd3c193521355bd7c69c573a674c5562 Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Thu, 8 Dec 2022 17:24:58 +0800 Subject: [PATCH 1351/3019] =?UTF-8?q?update=200039.=E7=BB=84=E5=90=88?= =?UTF-8?q?=E6=80=BB=E5=92=8C=EF=BC=9A=E4=BF=AE=E6=94=B9=E9=94=99=E5=AD=97?= =?UTF-8?q?=E5=92=8C=E6=9B=B4=E6=94=B9=20go=20=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...04\345\220\210\346\200\273\345\222\214.md" | 43 +++++++++---------- 1 file changed, 21 insertions(+), 22 deletions(-) diff --git "a/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" "b/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" index 4e1df6c78f..5244a1d6e8 100644 --- "a/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" +++ "b/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" @@ -42,7 +42,7 @@ candidates 中的数字可以无限制重复被选取。 题目中的**无限制重复被选取,吓得我赶紧想想 出现0 可咋办**,然后看到下面提示:1 <= candidates[i] <= 200,我就放心了。 -本题和[77.组合](https://programmercarl.com/0077.组合.html),[216.组合总和III](https://programmercarl.com/0216.组合总和III.html)和区别是:本题没有数量要求,可以无限重复,但是有总和的限制,所以间接的也是有个数的限制。 +本题和[77.组合](https://programmercarl.com/0077.组合.html),[216.组合总和III](https://programmercarl.com/0216.组合总和III.html)的区别是:本题没有数量要求,可以无限重复,但是有总和的限制,所以间接的也是有个数的限制。 本题搜索的过程抽象成树形结构如下: @@ -335,33 +335,32 @@ class Solution: 主要在于递归中传递下一个数字 ```go +var ( + res [][]int + path []int +) func combinationSum(candidates []int, target int) [][]int { - var trcak []int - var res [][]int - backtracking(0,0,target,candidates,trcak,&res) + res, path = make([][]int, 0), make([]int, 0, len(candidates)) + sort.Ints(candidates) // 排序,为剪枝做准备 + dfs(candidates, 0, target) return res } -func backtracking(startIndex,sum,target int,candidates,trcak []int,res *[][]int){ - //终止条件 - if sum==target{ - tmp:=make([]int,len(trcak)) - copy(tmp,trcak)//拷贝 - *res=append(*res,tmp)//放入结果集 + +func dfs(candidates []int, start int, target int) { + if target == 0 { // target 不断减小,如果为0说明达到了目标值 + tmp := make([]int, len(path)) + copy(tmp, path) + res = append(res, tmp) return } - if sum>target{return} - //回溯 - for i:=startIndex;i target { // 剪枝,提前返回 + break + } + path = append(path, candidates[i]) + dfs(candidates, i, target - candidates[i]) + path = path[:len(path) - 1] } - } ``` From 7284dffc429b87b75ceae98638cbc186544b28b1 Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Thu, 8 Dec 2022 18:06:21 +0800 Subject: [PATCH 1352/3019] =?UTF-8?q?update=200040.=E7=BB=84=E5=90=88?= =?UTF-8?q?=E6=80=BB=E5=92=8CII:=20=E4=BF=AE=E6=94=B9=E9=94=99=E5=AD=97?= =?UTF-8?q?=EF=BC=8C=E6=9B=B4=E6=8D=A2=20go=20=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\345\220\210\346\200\273\345\222\214II.md" | 108 +++++++++--------- 1 file changed, 53 insertions(+), 55 deletions(-) diff --git "a/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" "b/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" index fcfc396b12..2d4b836a3b 100644 --- "a/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" +++ "b/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" @@ -110,13 +110,13 @@ if (sum == target) { } ``` -`sum > target` 这个条件其实可以省略,因为和在递归单层遍历的时候,会有剪枝的操作,下面会介绍到。 +`sum > target` 这个条件其实可以省略,因为在递归单层遍历的时候,会有剪枝的操作,下面会介绍到。 * **单层搜索的逻辑** 这里与[39.组合总和](https://programmercarl.com/0039.组合总和.html)最大的不同就是要去重了。 -前面我们提到:要去重的是“同一树层上的使用过”,如果判断同一树层上元素(相同的元素)是否使用过了呢。 +前面我们提到:要去重的是“同一树层上的使用过”,如何判断同一树层上元素(相同的元素)是否使用过了呢。 **如果`candidates[i] == candidates[i - 1]` 并且 `used[i - 1] == false`,就说明:前一个树枝,使用了candidates[i - 1],也就是说同一树层使用过candidates[i - 1]**。 @@ -438,76 +438,74 @@ class Solution: **使用used数组** ```go +var ( + res [][]int + path []int + used []bool +) func combinationSum2(candidates []int, target int) [][]int { - var trcak []int - var res [][]int - var history map[int]bool - history=make(map[int]bool) - sort.Ints(candidates) - backtracking(0,0,target,candidates,trcak,&res,history) + res, path = make([][]int, 0), make([]int, 0, len(candidates)) + used = make([]bool, len(candidates)) + sort.Ints(candidates) // 排序,为剪枝做准备 + dfs(candidates, 0, target) return res } -func backtracking(startIndex,sum,target int,candidates,trcak []int,res *[][]int,history map[int]bool){ - //终止条件 - if sum==target{ - tmp:=make([]int,len(trcak)) - copy(tmp,trcak)//拷贝 - *res=append(*res,tmp)//放入结果集 + +func dfs(candidates []int, start int, target int) { + if target == 0 { // target 不断减小,如果为0说明达到了目标值 + tmp := make([]int, len(path)) + copy(tmp, path) + res = append(res, tmp) return } - if sum>target{return} - //回溯 - // used[i - 1] == true,说明同一树枝candidates[i - 1]使用过 - // used[i - 1] == false,说明同一树层candidates[i - 1]使用过 - for i:=startIndex;i0&&candidates[i]==candidates[i-1]&&history[i-1]==false{ - continue + for i := start; i < len(candidates); i++ { + if candidates[i] > target { // 剪枝,提前返回 + break } - //更新路径集合和sum - trcak=append(trcak,candidates[i]) - sum+=candidates[i] - history[i]=true - //递归 - backtracking(i+1,sum,target,candidates,trcak,res,history) - //回溯 - trcak=trcak[:len(trcak)-1] - sum-=candidates[i] - history[i]=false + // used[i - 1] == true,说明同一树枝candidates[i - 1]使用过 + // used[i - 1] == false,说明同一树层candidates[i - 1]使用过 + if i > 0 && candidates[i] == candidates[i-1] && used[i-1] == false { + continue + } + path = append(path, candidates[i]) + used[i] = true + dfs(candidates, i+1, target - candidates[i]) + used[i] = false + path = path[:len(path) - 1] } } ``` **不使用used数组** ```go +var ( + res [][]int + path []int +) func combinationSum2(candidates []int, target int) [][]int { - var trcak []int - var res [][]int - sort.Ints(candidates) - backtracking(0,0,target,candidates,trcak,&res) + res, path = make([][]int, 0), make([]int, 0, len(candidates)) + sort.Ints(candidates) // 排序,为剪枝做准备 + dfs(candidates, 0, target) return res } -func backtracking(startIndex,sum,target int,candidates,trcak []int,res *[][]int){ - //终止条件 - if sum==target{ - tmp:=make([]int,len(trcak)) - //拷贝 - copy(tmp,trcak) - //放入结果集 - *res=append(*res,tmp) + +func dfs(candidates []int, start int, target int) { + if target == 0 { // target 不断减小,如果为0说明达到了目标值 + tmp := make([]int, len(path)) + copy(tmp, path) + res = append(res, tmp) return } - //回溯 - for i:=startIndex;istartIndex&&candidates[i]==candidates[i-1]{ - continue + for i := start; i < len(candidates); i++ { + if candidates[i] > target { // 剪枝,提前返回 + break } - //更新路径集合和sum - trcak=append(trcak,candidates[i]) - sum+=candidates[i] - backtracking(i+1,sum,target,candidates,trcak,res) - //回溯 - trcak=trcak[:len(trcak)-1] - sum-=candidates[i] + // i != start 限制了这不对深度遍历到达的此值去重 + if i != start && candidates[i] == candidates[i-1] { // 去重 + continue + } + path = append(path, candidates[i]) + dfs(candidates, i+1, target - candidates[i]) + path = path[:len(path) - 1] } } ``` From 40ce44dd44f4c0396b99f5310753336fbddaeb06 Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Thu, 8 Dec 2022 21:07:03 +0800 Subject: [PATCH 1353/3019] =?UTF-8?q?update=200131.=E5=88=86=E5=89=B2?= =?UTF-8?q?=E5=9B=9E=E6=96=87=E4=B8=B2:=20=E4=BF=AE=E6=94=B9=E9=94=99?= =?UTF-8?q?=E5=AD=97=EF=BC=8C=E6=9B=BF=E6=8D=A2=20go=20=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...62\345\233\236\346\226\207\344\270\262.md" | 66 +++++++++---------- 1 file changed, 30 insertions(+), 36 deletions(-) diff --git "a/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" "b/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" index 3a3c2d738e..0081223c42 100644 --- "a/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" +++ "b/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" @@ -43,8 +43,8 @@ 例如对于字符串abcdef: -* 组合问题:选取一个a之后,在bcdef中再去选取第二个,选取b之后在cdef中在选组第三个.....。 -* 切割问题:切割一个a之后,在bcdef中再去切割第二段,切割b之后在cdef中在切割第三段.....。 +* 组合问题:选取一个a之后,在bcdef中再去选取第二个,选取b之后在cdef中再选取第三个.....。 +* 切割问题:切割一个a之后,在bcdef中再去切割第二段,切割b之后在cdef中再切割第三段.....。 感受出来了不? @@ -78,7 +78,7 @@ void backtracking (const string& s, int startIndex) { ![131.分割回文串](https://code-thinking.cdn.bcebos.com/pics/131.%E5%88%86%E5%89%B2%E5%9B%9E%E6%96%87%E4%B8%B2.jpg) -从树形结构的图中可以看出:切割线切到了字符串最后面,说明找到了一种切割方法,此时就是本层递归的终止终止条件。 +从树形结构的图中可以看出:切割线切到了字符串最后面,说明找到了一种切割方法,此时就是本层递归的终止条件。 **那么在代码里什么是切割线呢?** @@ -98,7 +98,7 @@ void backtracking (const string& s, int startIndex) { * 单层搜索的逻辑 -**来看看在递归循环,中如何截取子串呢?** +**来看看在递归循环中如何截取子串呢?** 在`for (int i = startIndex; i < s.size(); i++)`循环中,我们 定义了起始位置startIndex,那么 [startIndex, i] 就是要截取的子串。 @@ -126,7 +126,7 @@ for (int i = startIndex; i < s.size(); i++) { 最后我们看一下回文子串要如何判断了,判断一个字符串是否是回文。 -可以使用双指针法,一个指针从前向后,一个指针从后先前,如果前后指针所指向的元素是相等的,就是回文字符串了。 +可以使用双指针法,一个指针从前向后,一个指针从后向前,如果前后指针所指向的元素是相等的,就是回文字符串了。 那么判断回文的C++代码如下: @@ -295,7 +295,7 @@ public: 除了这些难点,**本题还有细节,例如:切割过的地方不能重复切割所以递归函数需要传入i + 1**。 -所以本题应该是一个道hard题目了。 +所以本题应该是一道hard题目了。 **可能刷过这道题目的录友都没感受到自己原来克服了这么多难点,就把这道题目AC了**,这应该叫做无招胜有招,人码合一,哈哈哈。 @@ -432,45 +432,39 @@ class Solution: ``` ## Go -**注意切片(go切片是披着值类型外衣的引用类型)** ```go +var ( + path []string // 放已经回文的子串 + res [][]string +) func partition(s string) [][]string { - var tmpString []string//切割字符串集合 - var res [][]string//结果集合 - backTracking(s,tmpString,0,&res) + path, res = make([]string, 0), make([][]string, 0) + dfs(s, 0) 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: Thu, 8 Dec 2022 21:14:57 +0800 Subject: [PATCH 1354/3019] =?UTF-8?q?update=200093.=E5=A4=8D=E5=8E=9FIP?= =?UTF-8?q?=E5=9C=B0=E5=9D=80:=20=E6=9B=BF=E6=8D=A2=20go=20=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\345\216\237IP\345\234\260\345\235\200.md" | 78 +++++++++---------- 1 file changed, 36 insertions(+), 42 deletions(-) diff --git "a/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" "b/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" index ce62cac13d..97178cd5b1 100644 --- "a/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" +++ "b/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" @@ -424,6 +424,42 @@ class Solution: return True ``` +## Go + +```go +var ( + path []string + res []string +) +func restoreIpAddresses(s string) []string { + path, res = make([]string, 0, len(s)), make([]string, 0) + dfs(s, 0) + return res +} +func dfs(s string, start int) { + if len(path) == 4 { // 够四段后就不再继续往下递归 + if start == len(s) { + str := strings.Join(path, ".") + res = append(res, str) + } + return + } + for i := start; i < len(s); i++ { + if i != start && s[start] == '0' { // 含有前导 0,无效 + break + } + str := s[start : i+1] + num, _ := strconv.Atoi(str) + if num >= 0 && num <= 255 { + path = append(path, str) // 符合条件的就进入下一层 + dfs(s, i+1) + path = path[:len(path) - 1] + } else { // 如果不满足条件,再往后也不可能满足条件,直接退出 + break + } + } +} +``` ## JavaScript @@ -494,48 +530,6 @@ function restoreIpAddresses(s: string): string[] { }; ``` -## Go - -回溯(对于前导 0的IP(特别注意s[startIndex]=='0'的判断,不应该写成s[startIndex]==0,因为s截取出来不是数字)) - -```go -func restoreIpAddresses(s string) []string { - var res,path []string - backTracking(s,path,0,&res) - return res -} -func backTracking(s string,path []string,startIndex int,res *[]string){ - //终止条件 - if startIndex==len(s)&&len(path)==4{ - tmpIpString:=path[0]+"."+path[1]+"."+path[2]+"."+path[3] - *res=append(*res,tmpIpString) - } - for i:=startIndex;i1&&s[startIndex]=='0'{//对于前导 0的IP(特别注意s[startIndex]=='0'的判断,不应该写成s[startIndex]==0,因为s截取出来不是数字) - return false - } - if checkInt>255{ - return false - } - return true -} - -``` - ## Rust ```Rust From 74ccecbdcd80d7c2ca9107e73ff65d5a35e352d7 Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Thu, 8 Dec 2022 21:30:41 +0800 Subject: [PATCH 1355/3019] =?UTF-8?q?update=200078.=E5=AD=90=E9=9B=86:=20?= =?UTF-8?q?=E6=9B=BF=E6=8D=A2=20go=20=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "problems/0078.\345\255\220\351\233\206.md" | 36 ++++++++++----------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git "a/problems/0078.\345\255\220\351\233\206.md" "b/problems/0078.\345\255\220\351\233\206.md" index e271a96f0a..b5958e65e9 100644 --- "a/problems/0078.\345\255\220\351\233\206.md" +++ "b/problems/0078.\345\255\220\351\233\206.md" @@ -227,25 +227,25 @@ class Solution: ## Go ```Go -var res [][]int -func subset(nums []int) [][]int { - res = make([][]int, 0) - sort.Ints(nums) - Dfs([]int{}, nums, 0) - return res +var ( + path []int + res [][]int +) +func subsets(nums []int) [][]int { + res, path = make([][]int, 0), make([]int, 0, len(nums)) + dfs(nums, 0) + return res } -func Dfs(temp, nums []int, start int){ - tmp := make([]int, len(temp)) - copy(tmp, temp) - res = append(res, tmp) - for i := start; i < len(nums); i++{ - //if i>start&&nums[i]==nums[i-1]{ - // continue - //} - temp = append(temp, nums[i]) - Dfs(temp, nums, i+1) - temp = temp[:len(temp)-1] - } +func dfs(nums []int, start int) { + tmp := make([]int, len(path)) + copy(tmp, path) + res = append(res, tmp) + + for i := start; i < len(nums); i++ { + path = append(path, nums[i]) + dfs(nums, i+1) + path = path[:len(path)-1] + } } ``` From 97367686282a330d87790a72c8d04e57c0354a38 Mon Sep 17 00:00:00 2001 From: fw_qaq <82551626+fwqaaq@users.noreply.github.com> Date: Fri, 9 Dec 2022 00:20:13 +0800 Subject: [PATCH 1356/3019] =?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 --- ...11\346\220\234\347\264\242\346\240\221.md" | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git "a/problems/0669.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0669.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" index c2d7b79ba2..1cc958c840 100644 --- "a/problems/0669.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" +++ "b/problems/0669.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" @@ -469,6 +469,33 @@ object Solution { } ``` +## rust + +// 递归 +```rust +impl Solution { + pub fn trim_bst( + root: Option>>, + low: i32, + high: i32, + ) -> Option>> { + root.as_ref()?; + let mut node = root.as_ref().unwrap().borrow_mut(); + if node.val < low { + return Self::trim_bst(node.right.clone(), low, high); + } + if node.val > high { + return Self::trim_bst(node.left.clone(), low, high); + } + + node.left = Self::trim_bst(node.left.clone(), low, high); + node.right = Self::trim_bst(node.right.clone(), low, high); + drop(node); + root + } +} +``` +

From 50aba633cc9be0b85a5786142020875a77cc4bbe Mon Sep 17 00:00:00 2001 From: 5Reason Date: Fri, 9 Dec 2022 14:54:53 +0800 Subject: [PATCH 1357/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20491.=E9=80=92?= =?UTF-8?q?=E5=A2=9E=E5=AD=90=E5=BA=8F=E5=88=97=20=E4=BF=AE=E6=AD=A3?= =?UTF-8?q?=E5=AD=90=E6=A0=87=E9=A2=98md=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\222\345\242\236\345\255\220\345\272\217\345\210\227.md" | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git "a/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" "b/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" index e33a049de4..c30d23f768 100644 --- "a/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" @@ -396,7 +396,7 @@ var findSubsequences = function(nums) { ``` -## TypeScript +### TypeScript ```typescript function findSubsequences(nums: number[]): number[][] { @@ -542,7 +542,7 @@ int** findSubsequences(int* nums, int numsSize, int* returnSize, int** returnCol } ``` -## Swift +### Swift ```swift func findSubsequences(_ nums: [Int]) -> [[Int]] { @@ -573,7 +573,7 @@ func findSubsequences(_ nums: [Int]) -> [[Int]] { ``` -## Scala +### Scala ```scala object Solution { From d97f27621c96972c11b0e48b5498c411ac1e85f5 Mon Sep 17 00:00:00 2001 From: fw_qaq <82551626+fwqaaq@users.noreply.github.com> Date: Fri, 9 Dec 2022 15:44:18 +0800 Subject: [PATCH 1358/3019] =?UTF-8?q?Update=20problems/0450.=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.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git "a/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" "b/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" index 3d9a605052..424491b725 100644 --- "a/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" +++ "b/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" @@ -685,7 +685,8 @@ impl Solution { }, std::cmp::Ordering::Greater => node.left = Self::delete_node(node.left.clone(), key), } - root.clone() + drop(node); + root } } ``` From 26e81746873cb06bd5edca773e55ad6489999210 Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Fri, 9 Dec 2022 16:52:22 +0800 Subject: [PATCH 1359/3019] =?UTF-8?q?update=200090.=E5=AD=90=E9=9B=86II?= =?UTF-8?q?=EF=BC=9A=E6=9B=BF=E6=8D=A2=20go=20=E4=BB=A3=E7=A0=81=EF=BC=8C?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=20python=20=E7=9A=84markdown=E8=AF=AD?= =?UTF-8?q?=E6=B3=95=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "problems/0090.\345\255\220\351\233\206II.md" | 48 ++++++++++--------- 1 file changed, 26 insertions(+), 22 deletions(-) diff --git "a/problems/0090.\345\255\220\351\233\206II.md" "b/problems/0090.\345\255\220\351\233\206II.md" index 9f935b605f..57cfd09dbe 100644 --- "a/problems/0090.\345\255\220\351\233\206II.md" +++ "b/problems/0090.\345\255\220\351\233\206II.md" @@ -261,10 +261,10 @@ class Solution: self.path.pop() ``` -### Python3 +#### Python3 不使用used数组 -```python3 +```python class Solution: def subsetsWithDup(self, nums: List[int]) -> List[List[int]]: res = [] @@ -291,7 +291,7 @@ class Solution: ``` 使用used数组 -```python3 +```python class Solution: def subsetsWithDup(self, nums: List[int]) -> List[List[int]]: result = [] @@ -315,26 +315,30 @@ class Solution: ### Go ```Go -var res[][]int -func subsetsWithDup(nums []int)[][]int { - res=make([][]int,0) - sort.Ints(nums) - dfs([]int{},nums,0) - return res +var ( + path []int + res [][]int +) +func subsetsWithDup(nums []int) [][]int { + path, res = make([]int, 0, len(nums)), make([][]int, 0) + sort.Ints(nums) + dfs(nums, 0) + return res } -func dfs(temp, num []int, start int) { - tmp:=make([]int,len(temp)) - copy(tmp,temp) - - res=append(res,tmp) - for i:=start;istart&&num[i]==num[i-1]{ - continue - } - temp=append(temp,num[i]) - dfs(temp,num,i+1) - temp=temp[:len(temp)-1] - } + +func dfs(nums []int, start int) { + tmp := make([]int, len(path)) + copy(tmp, path) + res = append(res, tmp) + + for i := start; i < len(nums); i++ { + if i != start && nums[i] == nums[i-1] { + continue + } + path = append(path, nums[i]) + dfs(nums, i+1) + path = path[:len(path)-1] + } } ``` From f132a28dba62f3a4573ac43427bcc35c916622f3 Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Fri, 9 Dec 2022 17:43:10 +0800 Subject: [PATCH 1360/3019] =?UTF-8?q?update=200491.=E9=80=92=E5=A2=9E?= =?UTF-8?q?=E5=AD=90=E5=BA=8F=E5=88=97=EF=BC=9A=E4=BF=AE=E6=94=B9=E9=94=99?= =?UTF-8?q?=E5=AD=97=EF=BC=8C=E4=BC=98=E5=8C=96=20go=20=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...36\345\255\220\345\272\217\345\210\227.md" | 43 ++++++++++--------- 1 file changed, 23 insertions(+), 20 deletions(-) diff --git "a/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" "b/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" index e33a049de4..c0196973dc 100644 --- "a/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" @@ -37,7 +37,7 @@ 在[90.子集II](https://programmercarl.com/0090.子集II.html)中我们是通过排序,再加一个标记数组来达到去重的目的。 -而本题求自增子序列,是不能对原数组经行排序的,排完序的数组都是自增子序列了。 +而本题求自增子序列,是不能对原数组进行排序的,排完序的数组都是自增子序列了。 **所以不能使用之前的去重逻辑!** @@ -78,7 +78,7 @@ if (path.size() > 1) { * 单层搜索逻辑 ![491. 递增子序列1](https://img-blog.csdnimg.cn/20201124200229824.png) -在图中可以看出,**同一父节点下的同层上使用过的元素就不能在使用了** +在图中可以看出,**同一父节点下的同层上使用过的元素就不能再使用了** 那么单层搜索代码如下: @@ -340,30 +340,33 @@ class Solution: ``` ### Go -```golang +```go +var ( + res [][]int + path []int +) func findSubsequences(nums []int) [][]int { - var subRes []int - var res [][]int - backTring(0,nums,subRes,&res) + res, path = make([][]int, 0), make([]int, 0, len(nums)) + dfs(nums, 0) return res } -func backTring(startIndex int,nums,subRes []int,res *[][]int){ - if len(subRes)>1{ - tmp:=make([]int,len(subRes)) - copy(tmp,subRes) - *res=append(*res,tmp) +func dfs(nums []int, start int) { + if len(path) >= 2 { + tmp := make([]int, len(path)) + copy(tmp, path) + res = append(res, tmp) } - history:=[201]int{}//记录本层元素使用记录 - for i:=startIndex;i0&&nums[i]= path[len(path)-1] { + path = append(path, nums[i]) + used[nums[i]] = true + dfs(nums, i+1) + path = path[:len(path)-1] + } } } ``` From 334c9a8b0097bce9eeb7dfe5797ea1e89f60cb52 Mon Sep 17 00:00:00 2001 From: fw_qaq <82551626+fwqaaq@users.noreply.github.com> Date: Fri, 9 Dec 2022 19:29:56 +0800 Subject: [PATCH 1361/3019] =?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 --- ...11\346\220\234\347\264\242\346\240\221.md" | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git "a/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" index ffb60b38fa..0a053df50a 100644 --- "a/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" +++ "b/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" @@ -482,6 +482,26 @@ object Solution { } ``` +## rust + +递归: + +```rust +impl Solution { + pub fn sorted_array_to_bst(nums: Vec) -> Option>> { + if nums.is_empty() { + return None; + } + let index = nums.len() / 2; + let mut root = TreeNode::new(nums[index]); + + root.left = Self::sorted_array_to_bst(nums[..index].to_vec()); + root.right = Self::sorted_array_to_bst(nums[index + 1..].to_vec()); + Some(Rc::new(RefCell::new(root))) + } +} +``` +

From 4341179d9381c7d1a927ba17bcb2c7dce2371af5 Mon Sep 17 00:00:00 2001 From: fw_qaq <82551626+fwqaaq@users.noreply.github.com> Date: Fri, 9 Dec 2022 20:02:58 +0800 Subject: [PATCH 1362/3019] =?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 --- ...72\347\264\257\345\212\240\346\240\221.md" | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git "a/problems/0538.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md" "b/problems/0538.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md" index 9940e604ae..36dbfa7096 100644 --- "a/problems/0538.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md" +++ "b/problems/0538.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md" @@ -371,6 +371,31 @@ object Solution { } ``` +## rust + +递归: + +```rust +impl Solution { + pub fn convert_bst(root: Option>>) -> Option>> { + let mut pre = 0; + Self::traversal(&root, &mut pre); + root + } + + pub fn traversal(cur: &Option>>, pre: &mut i32) { + if cur.is_none() { + return; + } + let mut node = cur.as_ref().unwrap().borrow_mut(); + Self::traversal(&node.right, pre); + *pre += node.val; + node.val = *pre; + Self::traversal(&node.left, pre); + } +} +``` +

From 26f01c3ef9db64c890ae077c16a50544b990701f Mon Sep 17 00:00:00 2001 From: fw_qaq <82551626+fwqaaq@users.noreply.github.com> Date: Fri, 9 Dec 2022 20:15:28 +0800 Subject: [PATCH 1363/3019] =?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 --- ...72\347\264\257\345\212\240\346\240\221.md" | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git "a/problems/0538.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md" "b/problems/0538.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md" index 36dbfa7096..2f759d3954 100644 --- "a/problems/0538.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md" +++ "b/problems/0538.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md" @@ -396,6 +396,30 @@ impl Solution { } ``` +迭代: + +```rust +impl Solution { + pub fn convert_bst(root: Option>>) -> Option>> { + let mut cur = root.clone(); + let mut stack = vec![]; + let mut pre = 0; + while !stack.is_empty() || cur.is_some() { + while let Some(node) = cur { + cur = node.borrow().right.clone(); + stack.push(node); + } + if let Some(node) = stack.pop() { + pre += node.borrow().val; + node.borrow_mut().val = pre; + cur = node.borrow().left.clone(); + } + } + root + } +} +``` +

From 41007ef26c6bfc2f4695c6cd56b8012752fac844 Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Fri, 9 Dec 2022 21:21:36 +0800 Subject: [PATCH 1364/3019] =?UTF-8?q?update=200047.=E5=85=A8=E6=8E=92?= =?UTF-8?q?=E5=88=97II=EF=BC=9A=E6=9B=BF=E6=8D=A2=20go=20=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=EF=BC=8C=E6=94=B9=E9=94=99=E5=AD=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\345\205\250\346\216\222\345\210\227II.md" | 56 ++++++++++--------- 1 file changed, 30 insertions(+), 26 deletions(-) diff --git "a/problems/0047.\345\205\250\346\216\222\345\210\227II.md" "b/problems/0047.\345\205\250\346\216\222\345\210\227II.md" index c809c62d62..d9fe8f35ef 100644 --- "a/problems/0047.\345\205\250\346\216\222\345\210\227II.md" +++ "b/problems/0047.\345\205\250\346\216\222\345\210\227II.md" @@ -49,7 +49,7 @@ **一般来说:组合问题和排列问题是在树形结构的叶子节点上收集结果,而子集问题就是取树上所有节点的结果**。 -在[46.全排列](https://programmercarl.com/0046.全排列.html)中已经详解讲解了排列问题的写法,在[40.组合总和II](https://programmercarl.com/0040.组合总和II.html) 、[90.子集II](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++代码 @@ -225,33 +225,37 @@ class Solution: ### Go ```go -var res [][]int -func permute(nums []int) [][]int { - res = [][]int{} - backTrack(nums,len(nums),[]int{}) - return res +var ( + res [][]int + path []int + st []bool // state的缩写 +) +func permuteUnique(nums []int) [][]int { + res, path = make([][]int, 0), make([]int, 0, len(nums)) + st = make([]bool, len(nums)) + sort.Ints(nums) + dfs(nums, 0) + return res } -func backTrack(nums []int,numsLen int,path []int) { - if len(nums)==0{ - p:=make([]int,len(path)) - copy(p,path) - res = append(res,p) - } - used := [21]int{}//跟前一题唯一的区别,同一层不使用重复的数。关于used的思想carl在递增子序列那一题中提到过 - for i:=0;i Date: Fri, 9 Dec 2022 21:23:03 +0800 Subject: [PATCH 1365/3019] =?UTF-8?q?update=200046.=E5=85=A8=E6=8E=92?= =?UTF-8?q?=E5=88=97:=20=E6=9B=BF=E6=8D=A2=20go=20=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...6.\345\205\250\346\216\222\345\210\227.md" | 45 ++++++++++--------- 1 file changed, 25 insertions(+), 20 deletions(-) diff --git "a/problems/0046.\345\205\250\346\216\222\345\210\227.md" "b/problems/0046.\345\205\250\346\216\222\345\210\227.md" index 805bc4578f..c437f7ca23 100644 --- "a/problems/0046.\345\205\250\346\216\222\345\210\227.md" +++ "b/problems/0046.\345\205\250\346\216\222\345\210\227.md" @@ -275,29 +275,34 @@ class Solution: ### Go ```Go -var res [][]int +var ( + res [][]int + path []int + st []bool // state的缩写 +) func permute(nums []int) [][]int { - res = [][]int{} - backTrack(nums,len(nums),[]int{}) - return res -} -func backTrack(nums []int,numsLen int,path []int) { - if len(nums)==0{ - p:=make([]int,len(path)) - copy(p,path) - res = append(res,p) - } - for i:=0;i Date: Sun, 11 Dec 2022 21:03:26 +0800 Subject: [PATCH 1366/3019] =?UTF-8?q?update=200332.=E9=87=8D=E6=96=B0?= =?UTF-8?q?=E5=AE=89=E6=8E=92=E8=A1=8C=E7=A8=8B=20=EF=BC=9A=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E7=9B=B8=E5=90=8C=E6=80=9D=E8=B7=AF=E7=9A=84=E5=86=97?= =?UTF-8?q?=E4=BD=99=20go=20=E4=BB=A3=E7=A0=81=EF=BC=8C=E8=B0=83=E6=95=B4?= =?UTF-8?q?=20c=20=E4=BB=A3=E7=A0=81=E4=BD=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...11\346\216\222\350\241\214\347\250\213.md" | 198 ++++++------------ 1 file changed, 63 insertions(+), 135 deletions(-) diff --git "a/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" "b/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" index 8414753246..17ae964161 100644 --- "a/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" +++ "b/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" @@ -86,7 +86,7 @@ unordered_map> targets:unordered_map<出发机场, ma 在遍历 `unordered_map<出发机场, map<到达机场, 航班次数>> targets`的过程中,**可以使用"航班次数"这个字段的数字做相应的增减,来标记到达机场是否使用过了。** -如果“航班次数”大于零,说明目的地还可以飞,如果如果“航班次数”等于零说明目的地不能飞了,而不用对集合做删除元素或者增加元素的操作。 +如果“航班次数”大于零,说明目的地还可以飞,如果“航班次数”等于零说明目的地不能飞了,而不用对集合做删除元素或者增加元素的操作。 **相当于说我不删,我就做一个标记!** @@ -439,68 +439,6 @@ func findItinerary(tickets [][]string) []string { } ``` -### C语言 - -```C -char **result; -bool *used; -int g_found; - -int cmp(const void *str1, const void *str2) -{ - const char **tmp1 = *(char**)str1; - const char **tmp2 = *(char**)str2; - int ret = strcmp(tmp1[0], tmp2[0]); - if (ret == 0) { - return strcmp(tmp1[1], tmp2[1]); - } - return ret; -} - -void backtracting(char *** tickets, int ticketsSize, int* returnSize, char *start, char **result, bool *used) -{ - if (*returnSize == ticketsSize + 1) { - g_found = 1; - return; - } - for (int i = 0; i < ticketsSize; i++) { - if ((used[i] == false) && (strcmp(start, tickets[i][0]) == 0)) { - result[*returnSize] = (char*)malloc(sizeof(char) * 4); - memcpy(result[*returnSize], tickets[i][1], sizeof(char) * 4); - (*returnSize)++; - used[i] = true; - /*if ((*returnSize) == ticketsSize + 1) { - return; - }*/ - backtracting(tickets, ticketsSize, returnSize, tickets[i][1], result, used); - if (g_found) { - return; - } - (*returnSize)--; - used[i] = false; - } - } - return; -} - -char ** findItinerary(char *** tickets, int ticketsSize, int* ticketsColSize, int* returnSize){ - if (tickets == NULL || ticketsSize <= 0) { - return NULL; - } - result = malloc(sizeof(char*) * (ticketsSize + 1)); - used = malloc(sizeof(bool) * ticketsSize); - memset(used, false, sizeof(bool) * ticketsSize); - result[0] = malloc(sizeof(char) * 4); - memcpy(result[0], "JFK", sizeof(char) * 4); - g_found = 0; - *returnSize = 1; - qsort(tickets, ticketsSize, sizeof(tickets[0]), cmp); - backtracting(tickets, ticketsSize, returnSize, "JFK", result, used); - *returnSize = ticketsSize + 1; - return result; -} -``` - ### Javascript ```Javascript @@ -589,6 +527,68 @@ function findItinerary(tickets: string[][]): string[] { }; ``` +### C语言 + +```C +char **result; +bool *used; +int g_found; + +int cmp(const void *str1, const void *str2) +{ + const char **tmp1 = *(char**)str1; + const char **tmp2 = *(char**)str2; + int ret = strcmp(tmp1[0], tmp2[0]); + if (ret == 0) { + return strcmp(tmp1[1], tmp2[1]); + } + return ret; +} + +void backtracting(char *** tickets, int ticketsSize, int* returnSize, char *start, char **result, bool *used) +{ + if (*returnSize == ticketsSize + 1) { + g_found = 1; + return; + } + for (int i = 0; i < ticketsSize; i++) { + if ((used[i] == false) && (strcmp(start, tickets[i][0]) == 0)) { + result[*returnSize] = (char*)malloc(sizeof(char) * 4); + memcpy(result[*returnSize], tickets[i][1], sizeof(char) * 4); + (*returnSize)++; + used[i] = true; + /*if ((*returnSize) == ticketsSize + 1) { + return; + }*/ + backtracting(tickets, ticketsSize, returnSize, tickets[i][1], result, used); + if (g_found) { + return; + } + (*returnSize)--; + used[i] = false; + } + } + return; +} + +char ** findItinerary(char *** tickets, int ticketsSize, int* ticketsColSize, int* returnSize){ + if (tickets == NULL || ticketsSize <= 0) { + return NULL; + } + result = malloc(sizeof(char*) * (ticketsSize + 1)); + used = malloc(sizeof(bool) * ticketsSize); + memset(used, false, sizeof(bool) * ticketsSize); + result[0] = malloc(sizeof(char) * 4); + memcpy(result[0], "JFK", sizeof(char) * 4); + g_found = 0; + *returnSize = 1; + qsort(tickets, ticketsSize, sizeof(tickets[0]), cmp); + backtracting(tickets, ticketsSize, returnSize, "JFK", result, used); + *returnSize = ticketsSize + 1; + return result; +} +``` + ### Swift 直接迭代tickets数组: @@ -709,78 +709,6 @@ for line in tickets { } ``` -### Go -```Go - -// 先排序,然后找到第一条路径即可返回 -func findItinerary(tickets [][]string) []string { - var path []string // 用来保存搜索的路径 - data := make(map[string]ticketSlice) // 用来保存tickets排序后的结果 - - var search func(airport string) bool - search = func(airport string) bool { - if len(path) == len(tickets) { - path = append(path, airport) - return true - } - to := data[airport] - for _, item := range to { - if item.Count == 0 { - // 已用完 - continue - } - - path = append(path, airport) - item.Count-- - if search(item.To) { return true } - item.Count++ - path = path[:len(path) - 1] - } - - return false - } - - // 排序 - // 感觉这段代码有点啰嗦,不知道能不能简化一下 - tmp := make(map[string]map[string]int) - for _, ticket := range tickets { - if to, ok := tmp[ticket[0]]; ok { - if _, ok2 := to[ticket[1]]; ok2 { - to[ticket[1]]++ - } else { - to[ticket[1]] = 1 - } - } else { - tmp[ticket[0]] = map[string]int{ - ticket[1]: 1, - } - } - } - for from, to := range tmp { - var tmp ticketSlice - for to, num := range to { - tmp = append(tmp, &ticketStat{To: to, Count: num}) - } - sort.Sort(tmp) - data[from] = tmp - } - - search("JFK") - return path -} - -type ticketStat struct { - To string - Count int -} -type ticketSlice []*ticketStat - -func (p ticketSlice) Len() int { return len(p) } -func (p ticketSlice) Less(i, j int) bool { return strings.Compare(p[i].To, p[j].To) == -1 } -func (p ticketSlice) Swap(i, j int) { p[i], p[j] = p[j], p[i] } - -``` - ### Rust ** 文中的Hashmap嵌套Hashmap的方法因为Rust的所有权问题暂时无法实现,此方法为删除哈希表中元素法 ** ```Rust From e4d38ed101ba24e3ef82168ca2b7af7348d0ce95 Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Mon, 12 Dec 2022 00:27:46 +0800 Subject: [PATCH 1367/3019] =?UTF-8?q?update=200037.=E8=A7=A3=E6=95=B0?= =?UTF-8?q?=E7=8B=AC:=20=E4=BF=AE=E6=94=B9=E9=94=99=E5=AD=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...7.\350\247\243\346\225\260\347\213\254.md" | 103 +++++++++--------- 1 file changed, 52 insertions(+), 51 deletions(-) diff --git "a/problems/0037.\350\247\243\346\225\260\347\213\254.md" "b/problems/0037.\350\247\243\346\225\260\347\213\254.md" index fc1e3114d3..aaac4c7cc1 100644 --- "a/problems/0037.\350\247\243\346\225\260\347\213\254.md" +++ "b/problems/0037.\350\247\243\346\225\260\347\213\254.md" @@ -42,9 +42,9 @@ **如果以上这几道题目没有做过的话,不建议上来就做这道题哈!** -[N皇后问题](https://programmercarl.com/0051.N皇后.html)是因为每一行每一列只放一个皇后,只需要一层for循环遍历一行,递归来来遍历列,然后一行一列确定皇后的唯一位置。 +[N皇后问题](https://programmercarl.com/0051.N皇后.html)是因为每一行每一列只放一个皇后,只需要一层for循环遍历一行,递归来遍历列,然后一行一列确定皇后的唯一位置。 -本题就不一样了,**本题中棋盘的每一个位置都要放一个数字(而N换后是一行只放一个皇后),并检查数字是否合法,解数独的树形结构要比N皇后更宽更深**。 +本题就不一样了,**本题中棋盘的每一个位置都要放一个数字(而N皇后是一行只放一个皇后),并检查数字是否合法,解数独的树形结构要比N皇后更宽更深**。 因为这个树形结构太大了,我抽取一部分,如图所示: @@ -75,7 +75,7 @@ bool backtracking(vector>& board) **那么有没有永远填不满的情况呢?** -这个问题我在递归单层搜索逻辑里在来讲! +这个问题我在递归单层搜索逻辑里再来讲! * 递归单层搜索逻辑 @@ -207,7 +207,7 @@ public: 所以我在开篇就提到了**二维递归**,这也是我自创词汇,希望可以帮助大家理解解数独的搜索过程。 -一波分析之后,在看代码会发现其实也不难,唯一难点就是理解**二维递归**的思维逻辑。 +一波分析之后,再看代码会发现其实也不难,唯一难点就是理解**二维递归**的思维逻辑。 **这样,解数独这么难的问题,也被我们攻克了**。 @@ -331,55 +331,56 @@ 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 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: Tue, 13 Dec 2022 10:54:08 +0800 Subject: [PATCH 1368/3019] =?UTF-8?q?update=200376.=E6=91=86=E5=8A=A8?= =?UTF-8?q?=E5=BA=8F=E5=88=97:=20=E4=BF=AE=E6=94=B9=E4=B8=80=E5=A4=84markd?= =?UTF-8?q?own=E8=AF=AD=E6=B3=95=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" "b/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" index f9d3f97f7d..723d1d9a0f 100644 --- "a/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" +++ "b/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" @@ -286,7 +286,7 @@ class Solution: ### Go **贪心** -```golang +```go func wiggleMaxLength(nums []int) int { n := len(nums) if n < 2 { @@ -309,7 +309,7 @@ func wiggleMaxLength(nums []int) int { ``` **动态规划** -```golang +```go func wiggleMaxLength(nums []int) int { n := len(nums) if n <= 1 { From 55d722d9c087e3b9891e6f4324e6b27b0549b0a9 Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Tue, 13 Dec 2022 15:01:47 +0800 Subject: [PATCH 1369/3019] =?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=EF=BC=9A=E4=BF=AE=E6=94=B9=20go=20=E4=BB=A3=E7=A0=81=20?= =?UTF-8?q?=E5=92=8C=20=E9=94=99=E5=AD=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\344\275\263\346\227\266\346\234\272II.md" | 46 ++++++++++--------- 1 file changed, 24 insertions(+), 22 deletions(-) diff --git "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" index 57b174d980..d094da488e 100644 --- "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" +++ "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" @@ -46,7 +46,7 @@ ### 贪心算法 -这道题目可能我们只会想,选一个低的买入,在选个高的卖,在选一个低的买入.....循环反复。 +这道题目可能我们只会想,选一个低的买入,再选个高的卖,再选一个低的买入.....循环反复。 **如果想到其实最终利润是可以分解的,那么本题就很容易了!** @@ -198,38 +198,40 @@ class Solution: ### Go: -```golang -//贪心算法 +贪心算法 +```go func maxProfit(prices []int) int { var sum int for i := 1; i < len(prices); i++ { // 累加每次大于0的交易 - if prices[i]-prices[i-1] > 0 { - sum += prices[i]-prices[i-1] + if prices[i] - prices[i-1] > 0 { + sum += prices[i] - prices[i-1] } } return sum } ``` - -```golang -//确定售卖点 +动态规划 +```go func maxProfit(prices []int) int { - var result,buy int - prices=append(prices,0)//在price末尾加个0,防止price一直递增 - /** - 思路:检查后一个元素是否大于当前元素,如果小于,则表明这是一个售卖点,当前元素的值减去购买时候的值 - 如果不小于,说明后面有更好的售卖点, - **/ - for i:=0;iprices[i+1]{ - result+=prices[i]-prices[buy] - buy=i+1 - }else if prices[buy]>prices[i]{//更改最低购买点 - buy=i - } + dp := make([][]int, len(prices)) + for i := 0; i < len(dp); i++ { + dp[i] = make([]int, 2) } - return result + // dp[i][0]表示在状态i不持有股票的现金,dp[i][1]为持有股票的现金 + dp[0][0], dp[0][1] = 0, -prices[0] + for i := 1; i < len(prices); i++ { + dp[i][0] = max(dp[i-1][0], dp[i-1][1] + prices[i]) + dp[i][1] = max(dp[i-1][0] - prices[i], dp[i-1][1]) + } + return dp[len(prices)-1][0] + +} +func max(a, b int) int { + if a > b { + return a + } + return b } ``` From c13f53e47e5d9a5247070c0f11a26f01b9f0c053 Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Wed, 14 Dec 2022 14:21:23 +0800 Subject: [PATCH 1370/3019] =?UTF-8?q?update=200055.=E8=B7=B3=E8=B7=83?= =?UTF-8?q?=E6=B8=B8=E6=88=8F=EF=BC=9A=E4=BF=AE=E6=94=B9=E9=94=99=E5=AD=97?= =?UTF-8?q?=EF=BC=8C=E5=88=A0=E9=99=A4=E5=86=97=E4=BD=99=20go=20=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...63\350\267\203\346\270\270\346\210\217.md" | 22 ++----------------- 1 file changed, 2 insertions(+), 20 deletions(-) diff --git "a/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" "b/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" index 80c35c0325..7584e95235 100644 --- "a/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" +++ "b/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" @@ -72,13 +72,13 @@ public: ``` ## 总结 -这道题目关键点在于:不用拘泥于每次究竟跳跳几步,而是看覆盖范围,覆盖范围内一定是可以跳过来的,不用管是怎么跳的。 +这道题目关键点在于:不用拘泥于每次究竟跳几步,而是看覆盖范围,覆盖范围内一定是可以跳过来的,不用管是怎么跳的。 大家可以看出思路想出来了,代码还是非常简单的。 一些同学可能感觉,我在讲贪心系列的时候,题目和题目之间貌似没有什么联系? -**是真的就是没什么联系,因为贪心无套路!**没有个整体的贪心框架解决一些列问题,只能是接触各种类型的题目锻炼自己的贪心思维! +**是真的就是没什么联系,因为贪心无套路!**没有个整体的贪心框架解决一系列问题,只能是接触各种类型的题目锻炼自己的贪心思维! ## 其他语言版本 @@ -133,24 +133,6 @@ class Solution: ``` ### Go -```Go -func canJUmp(nums []int) bool { - if len(nums)<=1{ - return true - } - dp:=make([]bool,len(nums)) - dp[0]=true - for i:=1;i=0;j--{ - if dp[j]&&nums[j]+j>=i{ - dp[i]=true - break - } - } - } - return dp[len(nums)-1] -} -``` ```go // 贪心 From bd1d8e007a23d8b672528904d689325bf03dee12 Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Thu, 15 Dec 2022 21:41:45 +0800 Subject: [PATCH 1371/3019] =?UTF-8?q?update=200045.=E8=B7=B3=E8=B7=83?= =?UTF-8?q?=E6=B8=B8=E6=88=8FII=EF=BC=9A=E4=BF=AE=E6=94=B9=E6=96=87?= =?UTF-8?q?=E6=9C=AC=EF=BC=8C=E5=88=A0=E9=99=A4=20go=20=E7=9A=84dp?= =?UTF-8?q?=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\350\267\203\346\270\270\346\210\217II.md" | 29 +------------------ 1 file changed, 1 insertion(+), 28 deletions(-) diff --git "a/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" "b/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" index 5e06490ac7..05ad872b89 100644 --- "a/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" +++ "b/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" @@ -36,7 +36,7 @@ 贪心的思路,局部最优:当前可移动距离尽可能多走,如果还没到终点,步数再加一。整体最优:一步尽可能多走,从而达到最小步数。 -思路虽然是这样,但在写代码的时候还不能真的就能跳多远跳远,那样就不知道下一步最远能跳到哪里了。 +思路虽然是这样,但在写代码的时候还不能真的能跳多远就跳多远,那样就不知道下一步最远能跳到哪里了。 **所以真正解题的时候,要从覆盖范围出发,不管怎么跳,覆盖范围内一定是可以跳到的,以最小的步数增加覆盖范围,覆盖范围一旦覆盖了终点,得到的就是最小步数!** @@ -234,31 +234,6 @@ class Solution: ### Go -```Go -func jump(nums []int) int { - dp := make([]int, len(nums)) - dp[0] = 0//初始第一格跳跃数一定为0 - - for i := 1; i < len(nums); i++ { - dp[i] = i - for j := 0; j < i; j++ { - if nums[j] + j >= i {//nums[j]为起点,j为往右跳的覆盖范围,这行表示从j能跳到i - dp[i] = min(dp[j] + 1, dp[i])//更新最小能到i的跳跃次数 - } - } - } - return dp[len(nums)-1] -} - -func min(a, b int) int { - if a < b { - return a - } else { - return b - } -} -``` - ```go // 贪心版本一 func jump(nums []int) int { @@ -320,8 +295,6 @@ func max(a, b int) int { } ``` - - ### Javascript ```Javascript From e75f76466952eb9091334c05bb1bf0cba8b16329 Mon Sep 17 00:00:00 2001 From: Min Date: Wed, 30 Nov 2022 23:04:29 +0800 Subject: [PATCH 1372/3019] =?UTF-8?q?=E5=A2=9E=E5=8A=A00005.=E6=9C=80?= =?UTF-8?q?=E9=95=B7=E5=9B=9E=E6=96=87=E5=AD=90=E4=B8=B2C#=20=E5=8B=95?= =?UTF-8?q?=E6=85=8B=E8=A6=8F=E5=89=87=E7=9A=84=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...36\346\226\207\345\255\220\344\270\262.md" | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git "a/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" "b/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" index 62c2cbde61..84d8d83530 100644 --- "a/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" +++ "b/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" @@ -615,6 +615,38 @@ char * longestPalindrome(char * s){ } ``` +C#: + +動態規則: +```c# +public class Solution { + + public string LongestPalindrome(string s) { + bool[,] dp = new bool[s.Length, s.Length]; + int maxlenth = 0; + int left = 0; + int right = 0; + for(int i = s.Length-1 ; i>=0; i--){ + for(int j = i; j maxlenth){ + maxlenth = j-i+1; + left = i; + right = j; + } + } + } + return s.Substring(left, maxlenth); + } +} +``` +

From 4621def631c57ff5fe0c360185268fd9813b71b2 Mon Sep 17 00:00:00 2001 From: Min Date: Wed, 30 Nov 2022 23:11:47 +0800 Subject: [PATCH 1373/3019] =?UTF-8?q?=E5=A2=9E=E5=8A=A00005.=E6=9C=80?= =?UTF-8?q?=E9=95=B7=E5=9B=9E=E6=96=87=E5=AD=90=E4=B8=B2C#=20=E9=9B=99?= =?UTF-8?q?=E6=8C=87=E9=87=9D=E7=9A=84=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...36\346\226\207\345\255\220\344\270\262.md" | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git "a/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" "b/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" index 84d8d83530..4d48f18458 100644 --- "a/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" +++ "b/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" @@ -647,6 +647,36 @@ public class Solution { } ``` +雙指針: +```C# +public class Solution { + int maxlenth = 0; + int left = 0; + int right = 0; + + public string LongestPalindrome(string s) { + int result = 0; + for (int 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.Substring(left, maxlenth); + } + + private void extend(string s, int i, int j, int n) { + while (i >= 0 && j < n && s[i] == s[j]) { + if (j - i + 1 > maxlenth) { + left = i; + right = j; + maxlenth = j - i + 1; + } + i--; + j++; + } + } +} +``` +

From 83d2865c21cc2ed84364c4c6a531fd7fb728832d Mon Sep 17 00:00:00 2001 From: hbingzhi Date: Fri, 16 Dec 2022 15:45:25 +0800 Subject: [PATCH 1374/3019] =?UTF-8?q?=E5=88=A0=E9=99=A4=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=A0=91=E5=B1=82=E5=BA=8F=E9=81=8D=E5=8E=86637Java=E8=A7=A3?= =?UTF-8?q?=E6=B3=95=E4=B8=AD=E6=B2=A1=E6=9C=89=E5=BF=85=E8=A6=81=E7=9A=84?= =?UTF-8?q?=E8=AF=AD=E5=8F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" index 9985971f2c..8de91e40a1 100644 --- "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" +++ "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" @@ -1072,7 +1072,6 @@ public class N0637 { que.offerLast(root); while (!que.isEmpty()) { - TreeNode peek = que.peekFirst(); int levelSize = que.size(); double levelSum = 0.0; @@ -2970,3 +2969,4 @@ impl Solution { + From 2c72abc02b9a44b9adc790dd038b085fddca001c Mon Sep 17 00:00:00 2001 From: MIracleyin Date: Fri, 16 Dec 2022 16:16:10 +0800 Subject: [PATCH 1375/3019] rust 968 min camera cover --- ...47\344\272\214\345\217\211\346\240\221.md" | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git "a/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" "b/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" index e4a0512a37..4a8f9868e2 100644 --- "a/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" @@ -579,6 +579,55 @@ object Solution { } ``` +```Rust +/// 版本一 +impl Solution { + pub fn min_camera_cover(root: Option>>) -> i32 { + let mut res = 0; + if Self::traversal(&root, &mut res) == 0 { + res += 1; + } + res + } + + pub fn traversal(cur: &Option>>, ans: &mut i32) -> i32 { + // 0 未覆盖 1 节点已设置摄像头 2 节点已覆盖 + if let Some(node) = cur { + let node = node.borrow(); + + let left = Self::traversal(&node.left, ans); + let right = Self::traversal(&node.right, ans); + + // 左右节点都被覆盖 + if left == 2 && right == 2 { + return 0; // 无覆盖 + } + + // left == 0 right == 0 左右无覆盖 + // left == 0 right == 1 左节点无覆盖 右节点有摄像头 + // left == 1 right == 0 左节点有摄像头 左节点无覆盖 + // left == 0 right == 2 左节点无覆盖 右节点有覆盖 + // left == 2 right == 0 左节点有覆盖 右节点无覆盖 + if left == 0 || right == 0 { + *ans += 1; + return 1; + } + + // left == 1 right == 1 左节点有摄像头 右节点有摄像头 + // left == 1 right == 2 左节点有摄像头 右节点覆盖 + // left == 2 right == 1 左节点覆盖 右节点有摄像头 + if left == 1 || right == 1 { + return 2; // 已覆盖 + } + } else { + return 2; + } + -1 + } +} + +``` +

From dca56f0953dde88762cc707d83f7e65ae81f2cee Mon Sep 17 00:00:00 2001 From: MIracleyin Date: Fri, 16 Dec 2022 16:19:06 +0800 Subject: [PATCH 1376/3019] fix title rust 968 --- ...\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" "b/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" index 4a8f9868e2..179102f5b2 100644 --- "a/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" @@ -578,7 +578,7 @@ object Solution { } } ``` - +### Rust ```Rust /// 版本一 impl Solution { From d6dba48fcf530057cb464170b3b019878597db3e Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Fri, 16 Dec 2022 16:44:36 +0800 Subject: [PATCH 1377/3019] =?UTF-8?q?update=200134.=E5=8A=A0=E6=B2=B9?= =?UTF-8?q?=E7=AB=99:=20=E4=BF=AE=E6=94=B9=E9=94=99=E5=AD=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "problems/0134.\345\212\240\346\262\271\347\253\231.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/problems/0134.\345\212\240\346\262\271\347\253\231.md" "b/problems/0134.\345\212\240\346\262\271\347\253\231.md" index 37dddb99e3..ade847730c 100644 --- "a/problems/0134.\345\212\240\346\262\271\347\253\231.md" +++ "b/problems/0134.\345\212\240\346\262\271\347\253\231.md" @@ -176,13 +176,13 @@ public: * 时间复杂度:$O(n)$ * 空间复杂度:$O(1)$ -**说这种解法为贪心算法,才是是有理有据的,因为全局最优解是根据局部最优推导出来的**。 +**说这种解法为贪心算法,才是有理有据的,因为全局最优解是根据局部最优推导出来的**。 ## 总结 对于本题首先给出了暴力解法,暴力解法模拟跑一圈的过程其实比较考验代码技巧的,要对while使用的很熟练。 -然后给出了两种贪心算法,对于第一种贪心方法,其实我认为就是一种直接从全局选取最优的模拟操作,思路还是好巧妙的,值得学习一下。 +然后给出了两种贪心算法,对于第一种贪心方法,其实我认为就是一种直接从全局选取最优的模拟操作,思路还是很巧妙的,值得学习一下。 对于第二种贪心方法,才真正体现出贪心的精髓,用局部最优可以推出全局最优,进而求得起始位置。 From ac18aa205aaf4278a8c037a4beb67108f905371c Mon Sep 17 00:00:00 2001 From: MIracleyin Date: Fri, 16 Dec 2022 16:57:44 +0800 Subject: [PATCH 1378/3019] rust 968 min camera cover version 2 --- ...47\344\272\214\345\217\211\346\240\221.md" | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git "a/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" "b/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" index 179102f5b2..d897755bce 100644 --- "a/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" @@ -626,6 +626,42 @@ impl Solution { } } +/// 版本二 +enum NodeState { + NoCover = 0, + Camera = 1, + Covered = 2, +} + +impl Solution { + pub fn min_camera_cover(root: Option>>) -> i32 { + let mut res = 0; + let state = Self::traversal(&root, &mut res); + match state { + NodeState::NoCover => res + 1, + _ => res, + } + } + + pub fn traversal(cur: &Option>>, ans: &mut i32) -> NodeState { + if let Some(node) = cur { + let node = node.borrow(); + let left_state = Self::traversal(&node.left, ans); + let right_state = Self::traversal(&node.right, ans); + match (left_state, right_state) { + (NodeState::NoCover, _) | (_, NodeState::NoCover) => { + *ans += 1; + NodeState::Camera + } + (NodeState::Camera, _) | (_, NodeState::Camera) => NodeState::Covered, + (_, _) => NodeState::NoCover, + } + } else { + NodeState::Covered + } + } +} + ```

From 6ffe0b568ec563fe7db7d83089525ce3f0ac3970 Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Fri, 16 Dec 2022 21:56:34 +0800 Subject: [PATCH 1379/3019] =?UTF-8?q?update=200135.=E5=88=86=E5=8F=91?= =?UTF-8?q?=E7=B3=96=E6=9E=9C=EF=BC=9A=E4=BF=AE=E6=94=B9=E9=94=99=E5=AD=97?= =?UTF-8?q?=20=E5=92=8C=20=E6=9B=B4=E6=AD=A3=20go=20=E4=BB=A3=E7=A0=81mark?= =?UTF-8?q?down=E8=AF=AD=E6=B3=95=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...06\345\217\221\347\263\226\346\236\234.md" | 76 +++++++++---------- 1 file changed, 38 insertions(+), 38 deletions(-) diff --git "a/problems/0135.\345\210\206\345\217\221\347\263\226\346\236\234.md" "b/problems/0135.\345\210\206\345\217\221\347\263\226\346\236\234.md" index 442deccda9..f56e1839a6 100644 --- "a/problems/0135.\345\210\206\345\217\221\347\263\226\346\236\234.md" +++ "b/problems/0135.\345\210\206\345\217\221\347\263\226\346\236\234.md" @@ -65,7 +65,7 @@ for (int i = 1; i < ratings.size(); i++) { 如果 ratings[i] > ratings[i + 1],此时candyVec[i](第i个小孩的糖果数量)就有两个选择了,一个是candyVec[i + 1] + 1(从右边这个加1得到的糖果数量),一个是candyVec[i](之前比较右孩子大于左孩子得到的糖果数量)。 -那么又要贪心了,局部最优:取candyVec[i + 1] + 1 和 candyVec[i] 最大的糖果数量,保证第i个小孩的糖果数量即大于左边的也大于右边的。全局最优:相邻的孩子中,评分高的孩子获得更多的糖果。 +那么又要贪心了,局部最优:取candyVec[i + 1] + 1 和 candyVec[i] 最大的糖果数量,保证第i个小孩的糖果数量既大于左边的也大于右边的。全局最优:相邻的孩子中,评分高的孩子获得更多的糖果。 局部最优可以推出全局最优。 @@ -172,63 +172,44 @@ class Solution: ``` ### Go -```golang +```go func candy(ratings []int) int { /**先确定一边,再确定另外一边 1.先从左到右,当右边的大于左边的就加1 2.再从右到左,当左边的大于右边的就再加1 **/ - need:=make([]int,len(ratings)) - sum:=0 - //初始化(每个人至少一个糖果) - for i:=0;i0;i--{ - if ratings[i-1]>ratings[i]{ - need[i-1]=findMax(need[i-1],need[i]+1) + // 2.再从右到左,当左边的大于右边的就右边加1,但要花费糖果最少,所以需要做下判断 + for i := len(ratings)-1; i > 0; i-- { + if ratings[i-1] > ratings[i] { + need[i-1] = findMax(need[i-1], need[i]+1) } } //计算总共糖果 - for i:=0;inum2{ +func findMax(num1 int, num2 int) int { + if num1 > num2 { return num1 } return num2 } ``` -### Rust -```rust -pub fn candy(ratings: Vec) -> i32 { - let mut candies = vec![1i32; ratings.len()]; - for i in 1..ratings.len() { - if ratings[i - 1] < ratings[i] { - candies[i] = candies[i - 1] + 1; - } - } - - for i in (0..ratings.len()-1).rev() { - if ratings[i] > ratings[i + 1] { - candies[i] = candies[i].max(candies[i + 1] + 1); - } - } - candies.iter().sum() -} -``` - ### Javascript: ```Javascript var candy = function(ratings) { @@ -255,6 +236,25 @@ var candy = function(ratings) { ``` +### Rust +```rust +pub fn candy(ratings: Vec) -> i32 { + let mut candies = vec![1i32; ratings.len()]; + for i in 1..ratings.len() { + if ratings[i - 1] < ratings[i] { + candies[i] = candies[i - 1] + 1; + } + } + + for i in (0..ratings.len()-1).rev() { + if ratings[i] > ratings[i + 1] { + candies[i] = candies[i].max(candies[i + 1] + 1); + } + } + candies.iter().sum() +} +``` + ### C ```c #define max(a, b) (((a) > (b)) ? (a) : (b)) From b6a92c387ef7b15eec62f8fde2af01163d418325 Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Fri, 16 Dec 2022 23:25:27 +0800 Subject: [PATCH 1380/3019] =?UTF-8?q?update=200860.=E6=9F=A0=E6=AA=AC?= =?UTF-8?q?=E6=B0=B4=E6=89=BE=E9=9B=B6:=20=E6=9B=BF=E6=8D=A2=20go=20?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...54\346\260\264\346\211\276\351\233\266.md" | 45 +++++++------------ 1 file changed, 15 insertions(+), 30 deletions(-) diff --git "a/problems/0860.\346\237\240\346\252\254\346\260\264\346\211\276\351\233\266.md" "b/problems/0860.\346\237\240\346\252\254\346\260\264\346\211\276\351\233\266.md" index bc006f4584..fc336eba82 100644 --- "a/problems/0860.\346\237\240\346\252\254\346\260\264\346\211\276\351\233\266.md" +++ "b/problems/0860.\346\237\240\346\252\254\346\260\264\346\211\276\351\233\266.md" @@ -54,7 +54,7 @@ 这是前几天的leetcode每日一题,感觉不错,给大家讲一下。 -这道题目刚一看,可能会有点懵,这要怎么找零才能保证完整全部账单的找零呢? +这道题目刚一看,可能会有点懵,这要怎么找零才能保证完成全部账单的找零呢? **但仔细一琢磨就会发现,可供我们做判断的空间非常少!** @@ -179,38 +179,23 @@ class Solution: ### Go -```golang +```go func lemonadeChange(bills []int) bool { - //left表示还剩多少 下标0位5元的个数 ,下标1为10元的个数 - left:=[2]int{0,0} - //第一个元素不为5,直接退出 - if bills[0]!=5{ - return false - } - for i:=0;i0{ - left[0]-=1 - }else { + ten, five := 0, 0 + for i := 0; i < len(bills); i++ { + if bills[i] == 5 { + five++ + } else if bills[i] == 10 { + if five == 0 { return false } - } - if tmp==15{ - if left[1]>0&&left[0]>0{ - left[0]-=1 - left[1]-=1 - }else if left[1]==0&&left[0]>2{ - left[0]-=3 - }else{ + ten++; five-- + } else { + if ten >= 1 && five >= 1 { + ten--; five-- + } else if five >= 3 { + five -= 3 + } else { return false } } From bfced8f38571131d3c8fc982ba633c90fe02114e Mon Sep 17 00:00:00 2001 From: fw_qaq <82551626+fwqaaq@users.noreply.github.com> Date: Sat, 17 Dec 2022 00:17:30 +0800 Subject: [PATCH 1381/3019] =?UTF-8?q?update=200077.=E7=BB=84=E5=90=88.md?= =?UTF-8?q?=20about=20rust=20=E5=91=BD=E5=90=8D=E4=BB=A5=E5=8F=8A=E5=85=B6?= =?UTF-8?q?=E5=AE=83=E6=96=B9=E9=9D=A2=E7=9A=84=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "problems/0077.\347\273\204\345\220\210.md" | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git "a/problems/0077.\347\273\204\345\220\210.md" "b/problems/0077.\347\273\204\345\220\210.md" index 854b302b59..77ea5e80eb 100644 --- "a/problems/0077.\347\273\204\345\220\210.md" +++ "b/problems/0077.\347\273\204\345\220\210.md" @@ -514,21 +514,21 @@ function combine(n: number, k: number): number[][] { ```Rust impl Solution { - fn backtracking(result: &mut Vec>, path: &mut Vec, n: i32, k: i32, startIndex: i32) { + fn backtracking(result: &mut Vec>, path: &mut Vec, n: i32, k: i32, start_index: i32) { let len= path.len() as i32; if len == k{ result.push(path.to_vec()); return; } - for i in startIndex..= n { + for i in start_index..= n { path.push(i); Self::backtracking(result, path, n, k, i+1); path.pop(); } } pub fn combine(n: i32, k: i32) -> Vec> { - let mut result: Vec> = Vec::new(); - let mut path: Vec = Vec::new(); + let mut result = vec![]; + let mut path = vec![]; Self::backtracking(&mut result, &mut path, n, k, 1); result } @@ -538,22 +538,22 @@ impl Solution { 剪枝 ```Rust impl Solution { - fn backtracking(result: &mut Vec>, path: &mut Vec, n: i32, k: i32, startIndex: i32) { + fn backtracking(result: &mut Vec>, path: &mut Vec, n: i32, k: i32, start_index: i32) { let len= path.len() as i32; if len == k{ result.push(path.to_vec()); return; } // 此处剪枝 - for i in startIndex..= n - (k - len) + 1 { + for i in start_index..= n - (k - len) + 1 { path.push(i); Self::backtracking(result, path, n, k, i+1); path.pop(); } } pub fn combine(n: i32, k: i32) -> Vec> { - let mut result: Vec> = Vec::new(); - let mut path: Vec = Vec::new(); + let mut result = vec![]; + let mut path = vec![]; Self::backtracking(&mut result, &mut path, n, k, 1); result } From c8b5ca8caa528ede54b3f21112c10e3b6a6d8016 Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Sat, 17 Dec 2022 00:36:31 +0800 Subject: [PATCH 1382/3019] =?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:=20?= =?UTF-8?q?=E4=BC=98=E5=8C=96=20go=20=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...15\345\273\272\351\230\237\345\210\227.md" | 58 +++++++++---------- 1 file changed, 28 insertions(+), 30 deletions(-) diff --git "a/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" "b/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" index 2c5c7cd3c5..934cc9eea2 100644 --- "a/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" +++ "b/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" @@ -39,7 +39,7 @@ ## 思路 -本题有两个维度,h和k,看到这种题目一定要想如何确定一个维度,然后在按照另一个维度重新排列。 +本题有两个维度,h和k,看到这种题目一定要想如何确定一个维度,然后再按照另一个维度重新排列。 其实如果大家认真做了[135. 分发糖果](https://programmercarl.com/0135.分发糖果.html),就会发现和此题有点点的像。 @@ -47,7 +47,7 @@ **如果两个维度一起考虑一定会顾此失彼**。 -对于本题相信大家困惑的点是先确定k还是先确定h呢,也就是究竟先按h排序呢,还先按照k排序呢? +对于本题相信大家困惑的点是先确定k还是先确定h呢,也就是究竟先按h排序呢,还是先按照k排序呢? 如果按照k来从小到大排序,排完之后,会发现k的排列并不符合条件,身高也不符合条件,两个维度哪一个都没确定下来。 @@ -222,48 +222,46 @@ class Solution: ### Go ```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]//这个只是确保身高按照由大到小的顺序来排,并不确定K是按照从小到大排序的 + return people[i][0] > people[j][0] // 身高按照由大到小的顺序来排 }) - //再按照K进行插入排序,优先插入K小的 - result := make([][]int, 0) - for _, info := range people { - result = append(result, info) - copy(result[info[1] +1:], result[info[1]:])//将插入位置之后的元素后移动一位(意思是腾出空间) - result[info[1]] = info//将插入元素位置插入元素 + + // 再按照K进行插入排序,优先插入K小的 + for i, p := range people { + copy(people[p[1]+1 : i+1], people[p[1] : i+1]) // 空出一个位置 + people[p[1]] = p } - return result + return people } ``` ```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] + return people[i][0] > people[j][0] }) - l:=list.New()//创建链表 - for i:=0;i Date: Sat, 17 Dec 2022 01:30:22 +0800 Subject: [PATCH 1383/3019] =?UTF-8?q?update=200452.=E7=94=A8=E6=9C=80?= =?UTF-8?q?=E5=B0=91=E6=95=B0=E9=87=8F=E7=9A=84=E7=AE=AD=E5=BC=95=E7=88=86?= =?UTF-8?q?=E6=B0=94=E7=90=83:=20=E4=BC=98=E5=8C=96=20go=20=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...25\347\210\206\346\260\224\347\220\203.md" | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git "a/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" "b/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" index c362726c31..86bfa49070 100644 --- "a/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" +++ "b/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" @@ -56,7 +56,7 @@ 如果真实的模拟射气球的过程,应该射一个,气球数组就remove一个元素,这样最直观,毕竟气球被射了。 -但仔细思考一下就发现:如果把气球排序之后,从前到后遍历气球,被射过的气球仅仅跳过就行了,没有必要让气球数组remote气球,只要记录一下箭的数量就可以了。 +但仔细思考一下就发现:如果把气球排序之后,从前到后遍历气球,被射过的气球仅仅跳过就行了,没有必要让气球数组remove气球,只要记录一下箭的数量就可以了。 以上为思考过程,已经确定下来使用贪心了,那么开始解题。 @@ -175,25 +175,25 @@ class Solution: ``` ### Go -```golang +```go func findMinArrowShots(points [][]int) int { - var res int =1//弓箭数 + var res int = 1 //弓箭数 //先按照第一位排序 - sort.Slice(points,func (i,j int) bool{ - return points[i][0]b{ +func min(a, b int) int { + if a > b { return b } return a From 2944b9152086d15662f4fafb636f993a9b16378c Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Sat, 17 Dec 2022 14:19:09 +0800 Subject: [PATCH 1384/3019] =?UTF-8?q?update=200435.=E6=97=A0=E9=87=8D?= =?UTF-8?q?=E5=8F=A0=E5=8C=BA=E9=97=B4=EF=BC=9A=E6=9B=B4=E6=96=B0=20java?= =?UTF-8?q?=20=E5=92=8C=20go=20=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...15\345\217\240\345\214\272\351\227\264.md" | 66 +++++++++---------- 1 file changed, 30 insertions(+), 36 deletions(-) diff --git "a/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" "b/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" index 6ac29996d0..33f8c3f28f 100644 --- "a/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" +++ "b/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" @@ -62,9 +62,9 @@ 每次取非交叉区间的时候,都是可右边界最小的来做分割点(这样留给下一个区间的空间就越大),所以第一条分割线就是区间1结束的位置。 -接下来就是找大于区间1结束位置的区间,是从区间4开始。**那有同学问了为什么不从区间5开始?别忘已经是按照右边界排序的了**。 +接下来就是找大于区间1结束位置的区间,是从区间4开始。**那有同学问了为什么不从区间5开始?别忘了已经是按照右边界排序的了**。 -区间4结束之后,在找到区间6,所以一共记录非交叉区间的个数是三个。 +区间4结束之后,再找到区间6,所以一共记录非交叉区间的个数是三个。 总共区间个数为6,减去非交叉区间的个数3。移除区间的最小数量就是3。 @@ -183,23 +183,19 @@ public: ```java class Solution { public int eraseOverlapIntervals(int[][] intervals) { - Arrays.sort(intervals, (a, b) -> { - // 按照区间右边界升序排序 - return a[1] - b[1]; + Arrays.sort(intervals, (a,b)-> { + return Integer.compare(a[0],b[0]); }); - - int count = 0; - int edge = Integer.MIN_VALUE; - for (int i = 0; i < intervals.length; i++) { - // 若上一个区间的右边界小于当前区间的左边界,说明无交集 - if (edge <= intervals[i][0]) { - edge = intervals[i][1]; - } else { + int count = 1; + for(int i = 1;i < intervals.length;i++){ + if(intervals[i][0] < intervals[i-1][1]){ + intervals[i][1] = Math.min(intervals[i - 1][1], intervals[i][1]); + continue; + }else{ count++; - } + } } - - return count; + return intervals.length - count; } } ``` @@ -208,16 +204,15 @@ class Solution { ```java class Solution { public int eraseOverlapIntervals(int[][] intervals) { - - Arrays.sort(intervals,(a,b)->{ + Arrays.sort(intervals, (a,b)-> { return Integer.compare(a[0],b[0]); }); int remove = 0; int pre = intervals[0][1]; - for(int i=1;iintervals[i][0]) { + for(int i = 1; i < intervals.length; i++) { + if(pre > intervals[i][0]) { remove++; - pre = Math.min(pre,intervals[i][1]); + pre = Math.min(pre, intervals[i][1]); } else pre = intervals[i][1]; } @@ -242,27 +237,26 @@ class Solution: ``` ### Go -```golang +```go func eraseOverlapIntervals(intervals [][]int) int { - var flag int - //先排序 - sort.Slice(intervals,func(i,j int)bool{ - return intervals[i][0]intervals[i][0]{ - flag++ - intervals[i][1]=min(intervals[i-1][1],intervals[i][1])//由于是先排序的,所以,第一位是递增顺序,故只需要将临近两个元素的第二个值最小值更新到该元素的第二个值即可作之后的判断 + res := 1 + for i := 1; i < len(intervals); i++ { + if intervals[i][0] >= intervals[i-1][1] { + res++ + } else { + intervals[i][1] = min(intervals[i - 1][1], intervals[i][1]) } } - return flag + return len(intervals) - res } -func min(a,b int)int{ - if a>b{ - return b +func min(a, b int) int { + if a < b { + return a } - return a + return b } ``` From 992ef648f60c8f1910c5dafabfbec1f6db5dcbad Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Sat, 17 Dec 2022 14:31:46 +0800 Subject: [PATCH 1385/3019] =?UTF-8?q?update=200056.=E5=90=88=E5=B9=B6?= =?UTF-8?q?=E5=8C=BA=E9=97=B4:=20=E6=9B=BF=E6=8D=A2=20go=20=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E5=92=8Cmarkdown=E8=AF=AD=E6=B3=95=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...10\345\271\266\345\214\272\351\227\264.md" | 28 ++++++++++--------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git "a/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" "b/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" index 2ff3737250..7b092c9b57 100644 --- "a/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" +++ "b/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" @@ -207,24 +207,26 @@ class Solution: ``` ### Go -```golang +```go func merge(intervals [][]int) [][]int { - //先从小到大排序 - sort.Slice(intervals,func(i,j int)bool{ - return intervals[i][0]=intervals[i+1][0]{ - intervals[i][1]=max(intervals[i][1],intervals[i+1][1])//赋值最大值 - intervals=append(intervals[:i+1],intervals[i+2:]...) - i-- + res := make([][]int, 0, len(intervals)) + left, right := intervals[0][0], intervals[0][1] + for i := 1; i < len(intervals); i++ { + if right < intervals[i][0] { + res = append(res, []int{left, right}) + left, right = intervals[i][0], intervals[i][1] + } else { + right = max(right, intervals[i][1]) } } - return intervals + res = append(res, []int{left, right}) // 将最后一个区间放入 + return res } -func max(a,b int)int{ - if a>b{ +func max(a, b int) int { + if a > b { return a } return b From f30fc5649df4a450406c65811d0979c9011d99fd Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Sat, 17 Dec 2022 16:02:03 +0800 Subject: [PATCH 1386/3019] =?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:=20=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=20go=20=E4=BB=A3=E7=A0=81=E5=A4=84markdown=E8=AF=AD?= =?UTF-8?q?=E6=B3=95=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...22\345\242\236\347\232\204\346\225\260\345\255\227.md" | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git "a/problems/0738.\345\215\225\350\260\203\351\200\222\345\242\236\347\232\204\346\225\260\345\255\227.md" "b/problems/0738.\345\215\225\350\260\203\351\200\222\345\242\236\347\232\204\346\225\260\345\255\227.md" index 896308271f..e8666bcd08 100644 --- "a/problems/0738.\345\215\225\350\260\203\351\200\222\345\242\236\347\232\204\346\225\260\345\255\227.md" +++ "b/problems/0738.\345\215\225\350\260\203\351\200\222\345\242\236\347\232\204\346\225\260\345\255\227.md" @@ -179,7 +179,7 @@ class Solution: ``` ### Go -```golang +```go func monotoneIncreasingDigits(N int) int { s := strconv.Itoa(N)//将数字转为字符串,方便使用下标 ss := []byte(s)//将字符串转为byte数组,方便更改。 @@ -187,10 +187,10 @@ func monotoneIncreasingDigits(N int) int { if n <= 1 { return N } - for i:=n-1 ; i>0; i-- { - if ss[i-1] > ss[i] {//前一个大于后一位,前一位减1,后面的全部置为9 + for i := n-1; i > 0; i-- { + if ss[i-1] > ss[i] { //前一个大于后一位,前一位减1,后面的全部置为9 ss[i-1] -= 1 - for j := i ; j < n; j++ {//后面的全部置为9 + for j := i; j < n; j++ { //后面的全部置为9 ss[j] = '9' } } From f77fa05df7f506b33be4efa4eaca07beabc2e725 Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Sat, 17 Dec 2022 16:26:04 +0800 Subject: [PATCH 1387/3019] =?UTF-8?q?update=200714.=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?=E5=90=AB=E6=89=8B=E7=BB=AD=E8=B4=B9=EF=BC=9A=E4=BF=AE=E6=94=B9?= =?UTF-8?q?markdown=E8=AF=AD=E6=B3=95=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...0\253\346\211\213\347\273\255\350\264\271.md" | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git "a/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271.md" "b/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271.md" index faa56d42da..005f9c3829 100644 --- "a/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271.md" +++ "b/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271.md" @@ -217,25 +217,25 @@ class Solution: # 贪心思路 ``` ### Go -```golang +```go func maxProfit(prices []int, fee int) int { var minBuy int = prices[0] //第一天买入 var res int - for i:=0;i=minBuy&&prices[i]-fee-minBuy<=0{ + if prices[i] >= minBuy && prices[i]-fee-minBuy <= 0 { continue } //可以售卖了 - if prices[i]>minBuy+fee{ + if prices[i] > minBuy+fee { //累加每天的收益 - res+=prices[i]-minBuy-fee + res += prices[i]-minBuy-fee //更新最小值(如果还在收获利润的区间里,表示并不是真正的卖出,而计算利润每次都要减去手续费,所以要让minBuy = prices[i] - fee;,这样在明天收获利润的时候,才不会多减一次手续费!) - minBuy=prices[i]-fee + minBuy = prices[i]-fee } } return res From e1d0a28bddf573b83f88ab65fd47cf9d912de921 Mon Sep 17 00:00:00 2001 From: fw_qaq <82551626+fwqaaq@users.noreply.github.com> Date: Sat, 17 Dec 2022 23:04:18 +0800 Subject: [PATCH 1388/3019] =?UTF-8?q?update=200077.=E7=BB=84=E5=90=88?= =?UTF-8?q?=E4=BC=98=E5=8C=96.md=20=E5=85=B3=E4=BA=8E=20rust=20=E7=9A=84?= =?UTF-8?q?=E4=B8=80=E4=BA=9B=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...7.\347\273\204\345\220\210\344\274\230\345\214\226.md" | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git "a/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" "b/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" index 34318d16f3..066e1b3329 100644 --- "a/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" +++ "b/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" @@ -267,22 +267,22 @@ Rust: ```Rust impl Solution { - fn backtracking(result: &mut Vec>, path: &mut Vec, n: i32, k: i32, startIndex: i32) { + fn backtracking(result: &mut Vec>, path: &mut Vec, n: i32, k: i32, start_index: i32) { let len= path.len() as i32; if len == k{ result.push(path.to_vec()); return; } // 此处剪枝 - for i in startIndex..= n - (k - len) + 1 { + for i in start_index..= n - (k - len) + 1 { path.push(i); Self::backtracking(result, path, n, k, i+1); path.pop(); } } pub fn combine(n: i32, k: i32) -> Vec> { - let mut result: Vec> = Vec::new(); - let mut path: Vec = Vec::new(); + let mut result = vec![]; + let mut path = vec![]; Self::backtracking(&mut result, &mut path, n, k, 1); result } From 723286ddf8580c91c9af35bb38aca5c8440c11da Mon Sep 17 00:00:00 2001 From: fw_qaq <82551626+fwqaaq@users.noreply.github.com> Date: Sat, 17 Dec 2022 23:22:24 +0800 Subject: [PATCH 1389/3019] =?UTF-8?q?Update=200530.=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=90=9C=E7=B4=A2=E6=A0=91=E7=9A=84=E6=9C=80=E5=B0=8F=E7=BB=9D?= =?UTF-8?q?=E5=AF=B9=E5=B7=AE.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...17\347\273\235\345\257\271\345\267\256.md" | 28 ++++++++----------- 1 file changed, 11 insertions(+), 17 deletions(-) diff --git "a/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" "b/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" index 8c47b633ea..bc9645dc87 100644 --- "a/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" +++ "b/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" @@ -547,31 +547,25 @@ impl Solution { 递归中解决 ```rust -static mut PRE: Option = None; -static mut MIN: i32 = i32::MAX; - impl Solution { pub fn get_minimum_difference(root: Option>>) -> i32 { - unsafe { - PRE = None; - MIN = i32::MAX; - Self::inorder(root); - MIN - } + let mut pre = None; + let mut min = i32::MAX; + Self::inorder(root, &mut pre, &mut min); + min } - pub fn inorder(root: Option>>) { + pub fn inorder(root: Option>>, pre: &mut Option, min: &mut i32) { if root.is_none() { return; } let node = root.as_ref().unwrap().borrow(); - Self::inorder(node.left.clone()); - unsafe { - if let Some(pre) = PRE { - MIN = (node.val - pre).min(MIN).abs(); - } - PRE = Some(node.val) + Self::inorder(node.left.clone(), pre, min); + if let Some(pre) = pre { + *min = (node.val - *pre).min(*min); } - Self::inorder(node.right.clone()); + *pre = Some(node.val); + + Self::inorder(node.right.clone(), pre, min); } } ``` From 9b9980020914453b19ffad8494c6ac8fb92566ca Mon Sep 17 00:00:00 2001 From: fw_qaq <82551626+fwqaaq@users.noreply.github.com> Date: Sat, 17 Dec 2022 23:55:38 +0800 Subject: [PATCH 1390/3019] =?UTF-8?q?Update=200216.=E7=BB=84=E5=90=88?= =?UTF-8?q?=E6=80=BB=E5=92=8CIII.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...345\220\210\346\200\273\345\222\214III.md" | 32 ++++++++++++------- 1 file changed, 20 insertions(+), 12 deletions(-) diff --git "a/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" "b/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" index 19fe1eb99a..3b396b3145 100644 --- "a/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" +++ "b/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" @@ -475,28 +475,36 @@ function combinationSum3(k: number, n: number): number[][] { ```Rust impl Solution { - fn backtracking(result: &mut Vec>, path:&mut Vec, targetSum:i32, k: i32, mut sum: i32, startIndex: i32) { + pub fn combination_sum3(k: i32, n: i32) -> Vec> { + let mut result = vec![]; + let mut path = vec![]; + Self::backtrace(&mut result, &mut path, n, k, 0, 1); + result + } + pub fn backtrace( + result: &mut Vec>, + path: &mut Vec, + target_sum: i32, + k: i32, + sum: i32, + start_index: i32, + ) { + if sum > target_sum { + return; + } let len = path.len() as i32; if len == k { - if sum == targetSum { + if sum == target_sum { result.push(path.to_vec()); } return; } - for i in startIndex..=9 { - sum += i; + for i in start_index..=9 - (k - len) + 1 { path.push(i); - Self::backtracking(result, path, targetSum, k, sum, i+1); - sum -= i; + Self::backtrace(result, path, target_sum, k, sum + i, i + 1); path.pop(); } } - pub fn combination_sum3(k: i32, n: i32) -> Vec> { - let mut result: Vec> = Vec::new(); - let mut path: Vec = Vec::new(); - Self::backtracking(&mut result, &mut path, n, k, 0, 1); - result - } } ``` From 9a70ce0e8ff38de7f06b9ca7dbe6a15caaf12d7c Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Sun, 18 Dec 2022 21:28:00 +0800 Subject: [PATCH 1391/3019] =?UTF-8?q?update=200070.=E7=88=AC=E6=A5=BC?= =?UTF-8?q?=E6=A2=AF=EF=BC=9A=E6=94=B9=E9=94=99=E5=AD=97=EF=BC=8C=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E4=BB=A3=E7=A0=81=E9=A3=8E=E6=A0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...0.\347\210\254\346\245\274\346\242\257.md" | 44 +++++++++---------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git "a/problems/0070.\347\210\254\346\245\274\346\242\257.md" "b/problems/0070.\347\210\254\346\245\274\346\242\257.md" index 79b2d90bc4..fb23be7d48 100644 --- "a/problems/0070.\347\210\254\346\245\274\346\242\257.md" +++ "b/problems/0070.\347\210\254\346\245\274\346\242\257.md" @@ -53,7 +53,7 @@ dp[i]: 爬到第i层楼梯,有dp[i]种方法 2. 确定递推公式 -如果可以推出dp[i]呢? +如何可以推出dp[i]呢? 从dp[i]的定义可以看出,dp[i] 可以有两个方向推出来。 @@ -73,7 +73,7 @@ dp[i]: 爬到第i层楼梯,有dp[i]种方法 在回顾一下dp[i]的定义:爬到第i层楼梯,有dp[i]中方法。 -那么i为0,dp[i]应该是多少呢,这个可以有很多解释,但都基本是直接奔着答案去解释的。 +那么i为0,dp[i]应该是多少呢,这个可以有很多解释,但基本都是直接奔着答案去解释的。 例如强行安慰自己爬到第0层,也有一种方法,什么都不做也就是一种方法即:dp[0] = 1,相当于直接站在楼顶。 @@ -91,7 +91,7 @@ dp[i]: 爬到第i层楼梯,有dp[i]种方法 我相信dp[1] = 1,dp[2] = 2,这个初始化大家应该都没有争议的。 -所以我的原则是:不考虑dp[0]如果初始化,只初始化dp[1] = 1,dp[2] = 2,然后从i = 3开始递推,这样才符合dp[i]的定义。 +所以我的原则是:不考虑dp[0]如何初始化,只初始化dp[1] = 1,dp[2] = 2,然后从i = 3开始递推,这样才符合dp[i]的定义。 4. 确定遍历顺序 @@ -163,7 +163,7 @@ public: 这道题目还可以继续深化,就是一步一个台阶,两个台阶,三个台阶,直到 m个台阶,有多少种方法爬到n阶楼顶。 -这又有难度了,这其实是一个完全背包问题,但力扣上没有这种题目,所以后续我在讲解背包问题的时候,今天这道题还会拿从背包问题的角度上来再讲一遍。 +这又有难度了,这其实是一个完全背包问题,但力扣上没有这种题目,所以后续我在讲解背包问题的时候,今天这道题还会从背包问题的角度上来再讲一遍。 这里我先给出我的实现代码: @@ -194,7 +194,7 @@ public: 这一连套问下来,候选人算法能力如何,面试官心里就有数了。 -**其实大厂面试最喜欢问题的就是这种简单题,然后慢慢变化,在小细节上考察候选人**。 +**其实大厂面试最喜欢的问题就是这种简单题,然后慢慢变化,在小细节上考察候选人**。 @@ -255,37 +255,37 @@ class Solution { class Solution: def climbStairs(self, n: int) -> int: # dp[i] 为第 i 阶楼梯有多少种方法爬到楼顶 - dp=[0]*(n+1) - dp[0]=1 - dp[1]=1 - for i in range(2,n+1): - dp[i]=dp[i-1]+dp[i-2] + dp = [0]*(n+1) + dp[0] = 1 + dp[1] = 1 + for i in range(2, n+1): + dp[i] = dp[i-1] + dp[i-2] return dp[n] # 空间复杂度为O(1)版本 class Solution: def climbStairs(self, n: int) -> int: - dp=[0]*(n+1) - dp[0]=1 - dp[1]=1 + dp = [0]*(n+1) + dp[0] = 1 + dp[1] = 1 for i in range(2,n+1): - tmp=dp[0]+dp[1] - dp[0]=dp[1] - dp[1]=tmp + tmp = dp[0] + dp[1] + dp[0] = dp[1] + dp[1] = tmp return dp[1] ``` ### Go ```Go func climbStairs(n int) int { - if n==1{ + if n == 1 { return 1 } - dp:=make([]int,n+1) - dp[1]=1 - dp[2]=2 - for i:=3;i<=n;i++{ - dp[i]=dp[i-1]+dp[i-2] + dp := make([]int, n+1) + dp[1] = 1 + dp[2] = 2 + for i := 3; i <= n; i++ { + dp[i] = dp[i-1] + dp[i-2] } return dp[n] } From 6df0981377bece752ccba09c208751cd9ad87414 Mon Sep 17 00:00:00 2001 From: fw_qaq <82551626+fwqaaq@users.noreply.github.com> Date: Sun, 18 Dec 2022 23:31:36 +0800 Subject: [PATCH 1392/3019] =?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=20about=20rust=20=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...27\346\257\215\347\273\204\345\220\210.md" | 35 +++++++------------ 1 file changed, 12 insertions(+), 23 deletions(-) diff --git "a/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" "b/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" index 12a45a61ab..a3ab112f38 100644 --- "a/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" +++ "b/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" @@ -450,42 +450,31 @@ function letterCombinations(digits: string): string[] { ## Rust ```Rust +const map: [&str; 10] = [ + "", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz", +]; impl Solution { - fn backtracking(result: &mut Vec, s: &mut String, map: &[&str; 10], digits: &String, index: usize) { + fn back_trace(result: &mut Vec, s: &mut String, digits: &String, index: usize) { let len = digits.len(); if len == index { result.push(s.to_string()); return; } - // 在保证不会越界的情况下使用unwrap()将Some()中的值提取出来 - let digit= digits.chars().nth(index).unwrap().to_digit(10).unwrap() as usize; - let letters = map[digit]; - for i in letters.chars() { + let digit = (digits.as_bytes()[index] - b'0') as usize; + for i in map[digit].chars() { s.push(i); - Self::backtracking(result, s, &map, &digits, index+1); + Self::back_trace(result, s, digits, index + 1); s.pop(); } } pub fn letter_combinations(digits: String) -> Vec { - if digits.len() == 0 { + if digits.is_empty() { return vec![]; } - const MAP: [&str; 10] = [ - "", - "", - "abc", - "def", - "ghi", - "jkl", - "mno", - "pqrs", - "tuv", - "wxyz" - ]; - let mut result: Vec = Vec::new(); - let mut s: String = String::new(); - Self::backtracking(&mut result, &mut s, &MAP, &digits, 0); - result + let mut res = vec![]; + let mut s = String::new(); + Self::back_trace(&mut res, &mut s, &digits, 0); + res } } ``` From 889f6724f7a3afb9cf9c1fadd27164ac45e054e9 Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Mon, 19 Dec 2022 16:48:15 +0800 Subject: [PATCH 1393/3019] =?UTF-8?q?update=200746.=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=E6=9C=80=E5=B0=8F=E8=8A=B1=E8=B4=B9=E7=88=AC=E6=A5=BC=E6=A2=AF?= =?UTF-8?q?=EF=BC=9A=E6=9B=B4=E6=8D=A2=E4=BB=A3=E7=A0=81=E4=B8=BA=E6=96=B0?= =?UTF-8?q?=E7=9A=84=E9=A2=98=E7=9B=AE=E6=8F=8F=E8=BF=B0=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...71\347\210\254\346\245\274\346\242\257.md" | 68 +++++++++---------- 1 file changed, 34 insertions(+), 34 deletions(-) diff --git "a/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" "b/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" index b6f5a734fe..6de0f8ec6a 100644 --- "a/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" +++ "b/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" @@ -83,7 +83,7 @@ dp[i - 2] 跳到 dp[i] 需要花费 dp[i - 2] + cost[i - 2]。 那么 dp[0] 应该是多少呢? 根据dp数组的定义,到达第0台阶所花费的最小体力为dp[0],那么有同学可能想,那dp[0] 应该是 cost[0],例如 cost = [1, 100, 1, 1, 1, 100, 1, 1, 100, 1] 的话,dp[0] 就是 cost[0] 应该是1。 -这里就要说名了,本题力扣为什么改题意了,而且修改题意之后 就清晰很多的原因了。 +这里就要说明本题力扣为什么改题意,而且修改题意之后 就清晰很多的原因了。 新题目描述中明确说了 “你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。” 也就是说 从 到达 第 0 个台阶是不花费的,但从 第0 个台阶 往上跳的话,需要花费 cost[0]。 @@ -101,7 +101,7 @@ dp[i - 2] 跳到 dp[i] 需要花费 dp[i - 2] + cost[i - 2]。 > **但是稍稍有点难度的动态规划,其遍历顺序并不容易确定下来**。 > 例如:01背包,都知道两个for循环,一个for遍历物品嵌套一个for遍历背包容量,那么为什么不是一个for遍历背包容量嵌套一个for遍历物品呢? 以及在使用一维dp数组的时候遍历背包容量为什么要倒序呢? -**这些都是遍历顺序息息相关。当然背包问题后续「代码随想录」都会重点讲解的!** +**这些都与遍历顺序息息相关。当然背包问题后续「代码随想录」都会重点讲解的!** 5. 举例推导dp数组 @@ -182,7 +182,7 @@ public: ## 总结 -大家可以发现这道题目相对于 昨天的[动态规划:爬楼梯](https://programmercarl.com/0070.爬楼梯.html)有难了一点,但整体思路是一样。 +大家可以发现这道题目相对于 昨天的[动态规划:爬楼梯](https://programmercarl.com/0070.爬楼梯.html)又难了一点,但整体思路是一样的。 从[动态规划:斐波那契数](https://programmercarl.com/0509.斐波那契数.html)到 [动态规划:爬楼梯](https://programmercarl.com/0070.爬楼梯.html)再到今天这道题目,录友们感受到循序渐进的梯度了嘛。 @@ -243,43 +243,43 @@ class Solution { ```python class Solution: def minCostClimbingStairs(self, cost: List[int]) -> int: - dp = [0] * (len(cost)) - dp[0] = cost[0] - dp[1] = cost[1] - for i in range(2, len(cost)): - dp[i] = min(dp[i - 1], dp[i - 2]) + cost[i] - return min(dp[len(cost) - 1], dp[len(cost) - 2]) + dp = [0] * (len(cost) + 1) + dp[0] = 0 + dp[1] = 0 + for i in range(2, len(cost) + 1): + dp[i] = min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i-2]) + return dp[len(cost)] ``` ### Go ```Go func minCostClimbingStairs(cost []int) int { - dp := make([]int, len(cost)) - dp[0], dp[1] = cost[0], cost[1] - for i := 2; i < len(cost); i++ { - dp[i] = min(dp[i-1], dp[i-2]) + cost[i] - } - return min(dp[len(cost)-1], dp[len(cost)-2]) + f := make([]int, len(cost) + 1) + f[0], f[1] = 0, 0 + for i := 2; i <= len(cost); i++ { + f[i] = min(f[i-1] + cost[i-1], f[i-2] + cost[i-2]) + } + return f[len(cost)] } - func min(a, b int) int { - if a < b { - return a - } - return b + if a < b { + return a + } + return b } ``` ### Javascript ```Javascript var minCostClimbingStairs = function(cost) { - const dp = [ cost[0], cost[1] ] - - for (let i = 2; i < cost.length; ++i) { - dp[i] = Math.min(dp[i -1] + cost[i], dp[i - 2] + cost[i]) + const n = cost.length; + const dp = new Array(n + 1); + dp[0] = dp[1] = 0; + for (let i = 2; i <= n; ++i) { + dp[i] = Math.min(dp[i -1] + cost[i - 1], dp[i - 2] + cost[i - 2]) } - return Math.min(dp[cost.length - 1], dp[cost.length - 2]) + return dp[n] }; ``` @@ -289,19 +289,19 @@ var minCostClimbingStairs = function(cost) { function minCostClimbingStairs(cost: number[]): number { /** dp[i]: 走到第i阶需要花费的最少金钱 - dp[0]: cost[0]; - dp[1]: cost[1]; + dp[0]: 0; + dp[1]: 0; ... - dp[i]: min(dp[i - 1], dp[i - 2]) + cost[i]; + dp[i]: min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]); */ - const dp: number[] = []; - const length: number = cost.length; - dp[0] = cost[0]; - dp[1] = cost[1]; + const dp = []; + const length = cost.length; + dp[0] = 0; + dp[1] = 0; for (let i = 2; i <= length; i++) { - dp[i] = Math.min(dp[i - 1], dp[i - 2]) + cost[i]; + dp[i] = Math.min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]); } - return Math.min(dp[length - 1], dp[length - 2]); + return dp[length]; }; ``` From d7c69811ede2abb733b85375f417fe63bf53cab1 Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Mon, 19 Dec 2022 23:54:23 +0800 Subject: [PATCH 1394/3019] =?UTF-8?q?update=200343.=E6=95=B4=E6=95=B0?= =?UTF-8?q?=E6=8B=86=E5=88=86:=20=E4=BC=98=E5=8C=96=E6=96=87=E6=9C=AC?= =?UTF-8?q?=EF=BC=8C=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81=E9=A3=8E=E6=A0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...64\346\225\260\346\213\206\345\210\206.md" | 68 +++++++++---------- 1 file changed, 34 insertions(+), 34 deletions(-) diff --git "a/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" "b/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" index 8a5e9b8f3c..25a6315497 100644 --- "a/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" +++ "b/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" @@ -35,7 +35,7 @@ dp[i]:分拆数字i,可以得到的最大乘积为dp[i]。 -dp[i]的定义讲贯彻整个解题过程,下面哪一步想不懂了,就想想dp[i]究竟表示的是啥! +dp[i]的定义将贯彻整个解题过程,下面哪一步想不懂了,就想想dp[i]究竟表示的是啥! 2. 确定递推公式 @@ -93,7 +93,7 @@ for (int i = 3; i <= n ; i++) { } } ``` -注意 枚举j的时候,是从1开始的。从0开始的话,那么让拆分一个数拆个0的话,那么求最大乘积没有意义了。 +注意 枚举j的时候,是从1开始的。从0开始的话,那么让拆分一个数拆个0,求最大乘积就没有意义了。 j的结束条件是 j < i - 1 ,其实 j < i 也是可以的,不过可以节省一步,例如让j = i - 1,的话,其实在 j = 1的时候,这一步就已经拆出来了,重复计算,所以 j < i - 1 @@ -109,15 +109,15 @@ for (int i = 3; i <= n ; i++) { } ``` -因为拆分一个数n 使之乘积最大,那么一定是拆分m个成近似相同的子数相乘才是最大的。 +因为拆分一个数n 使之乘积最大,那么一定是拆分成m个近似相同的子数相乘才是最大的。 例如 6 拆成 3 * 3, 10 拆成 3 * 3 * 4。 100的话 也是拆成m个近似数组的子数 相乘才是最大的。 -只不过我们不知道m究竟是多少而已,但可以明确的是m一定大于等于2,既然m大于等于,也就是 最差也应该是拆成两个相同的 可能是最大值。 +只不过我们不知道m究竟是多少而已,但可以明确的是m一定大于等于2,既然m大于等于2,也就是 最差也应该是拆成两个相同的 可能是最大值。 那么 j 遍历,只需要遍历到 n/2 就可以,后面就没有必要遍历了,一定不是最大值。 -至于 “拆分一个数n 使之乘积最大,那么一定是拆分m个成近似相同的子数相乘才是最大的” 这个我就不去做数学证明了,感兴趣的同学,可以自己证明。 +至于 “拆分一个数n 使之乘积最大,那么一定是拆分成m个近似相同的子数相乘才是最大的” 这个我就不去做数学证明了,感兴趣的同学,可以自己证明。 5. 举例推导dp数组 @@ -221,14 +221,14 @@ public: class Solution { public int integerBreak(int n) { //dp[i] 为正整数 i 拆分后的结果的最大乘积 - int[]dp=new int[n+1]; - dp[2]=1; - for(int i=3;i<=n;i++){ - for(int j=1;j<=i-j;j++){ + int[] dp = new int[n+1]; + dp[2] = 1; + for(int i = 3; i <= n; i++) { + for(int j = 1; j <= i-j; j++) { // 这里的 j 其实最大值为 i-j,再大只不过是重复而已, //并且,在本题中,我们分析 dp[0], dp[1]都是无意义的, //j 最大到 i-j,就不会用到 dp[0]与dp[1] - dp[i]=Math.max(dp[i],Math.max(j*(i-j),j*dp[i-j])); + dp[i] = Math.max(dp[i], Math.max(j*(i-j), j*dp[i-j])); // j * (i - j) 是单纯的把整数 i 拆分为两个数 也就是 i,i-j ,再相乘 //而j * dp[i - j]是将 i 拆分成两个以及两个以上的个数,再相乘。 } @@ -254,7 +254,7 @@ class Solution: ``` ### Go -```golang +```go func integerBreak(n int) int { /** 动态五部曲 @@ -264,40 +264,25 @@ func integerBreak(n int) int { 4.确定遍历顺序 5.打印dp **/ - dp:=make([]int,n+1) - dp[1]=1 - dp[2]=1 - for i:=3;ib{ +func max(a, b int) int{ + if a > b { return a } return b } ``` -### Rust -```rust -pub fn integer_break(n: i32) -> i32 { - let n = n as usize; - let mut dp = vec![0; n + 1]; - dp[2] = 1; - for i in 3..=n { - for j in 1..i-1 { - dp[i] = dp[i].max((i - j) * j).max(dp[i - j] * j); - } - } - dp[n] as i32 -} -``` - ### Javascript ```Javascript var integerBreak = function(n) { @@ -313,6 +298,21 @@ var integerBreak = function(n) { }; ``` +### Rust +```rust +pub fn integer_break(n: i32) -> i32 { + let n = n as usize; + let mut dp = vec![0; n + 1]; + dp[2] = 1; + for i in 3..=n { + for j in 1..i-1 { + dp[i] = dp[i].max((i - j) * j).max(dp[i - j] * j); + } + } + dp[n] as i32 +} +``` + ### TypeScript ```typescript From 83af7646e0e91bf195d22a15f453cbc37ab0bb59 Mon Sep 17 00:00:00 2001 From: ZerenZhang2022 <118794589+ZerenZhang2022@users.noreply.github.com> Date: Mon, 19 Dec 2022 15:32:28 -0500 Subject: [PATCH 1395/3019] =?UTF-8?q?Update=200226.=E7=BF=BB=E8=BD=AC?= =?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层序遍历方法,和之前层序遍历一节的写法一致 --- ...\254\344\272\214\345\217\211\346\240\221.md" | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git "a/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" "b/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" index ad2a7de27b..e55e124072 100644 --- "a/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" @@ -359,7 +359,22 @@ class Solution: queue.append(node.right) return root ``` - +迭代法:广度优先遍历(层序遍历),和之前的层序遍历写法一致: +```python +class Solution: + def invertTree(self, root: Optional[TreeNode]) -> Optional[TreeNode]: + if not root: return root + from collections import deque + que=deque([root]) + while que: + size=len(que) + for i in range(size): + cur=que.popleft() + cur.left, cur.right = cur.right, cur.left + if cur.left: que.append(cur.left) + if cur.right: que.append(cur.right) + return root +``` ### Go 递归版本的前序遍历 From 363d4e6fcbf3bceebee14053583f9cb555e6987d Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Tue, 20 Dec 2022 15:20:15 +0800 Subject: [PATCH 1396/3019] =?UTF-8?q?update=200096.=E4=B8=8D=E5=90=8C?= =?UTF-8?q?=E7=9A=84=E4=BA=8C=E5=8F=89=E6=90=9C=E7=B4=A2=E6=A0=91=EF=BC=9A?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=96=87=E6=9C=AC=20=E5=92=8C=20go=20?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E9=A3=8E=E6=A0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...5\217\211\346\220\234\347\264\242\346\240\221.md" | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git "a/problems/0096.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0096.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" index d086b1f346..519fd3237f 100644 --- "a/problems/0096.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" +++ "b/problems/0096.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" @@ -69,7 +69,7 @@ dp[3],就是 元素1为头结点搜索树的数量 + 元素2为头结点搜索 **dp[i] : 1到i为节点组成的二叉搜索树的个数为dp[i]**。 -也可以理解是i的不同元素节点组成的二叉搜索树的个数为dp[i] ,都是一样的。 +也可以理解是i个不同元素节点组成的二叉搜索树的个数为dp[i] ,都是一样的。 以下分析如果想不清楚,就来回想一下dp[i]的定义 @@ -199,11 +199,11 @@ class Solution: ### Go ```Go func numTrees(n int)int{ - dp:=make([]int,n+1) - dp[0]=1 - for i:=1;i<=n;i++{ - for j:=1;j<=i;j++{ - dp[i]+=dp[j-1]*dp[i-j] + dp := make([]int, n+1) + dp[0] = 1 + for i := 1; i <= n; i++ { + for j := 1; j <= i; j++ { + dp[i] += dp[j-1] * dp[i-j] } } return dp[n] From 77f1c528b7940d41764bde250547120f2c1fbbf4 Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Tue, 20 Dec 2022 15:33:57 +0800 Subject: [PATCH 1397/3019] Update --- ...33\346\225\260\344\271\213\345\222\214.md" | 24 ++ ...00\344\275\263\346\227\266\346\234\272.md" | 16 +- ...344\275\263\346\227\266\346\234\272III.md" | 47 +++- ...\344\275\263\346\227\266\346\234\272IV.md" | 12 +- ...7.\346\267\261\346\220\234\347\211\210.md" | 9 +- ...54\345\205\261\347\245\226\345\205\210.md" | 5 + ...07\345\255\220\345\272\217\345\210\227.md" | 36 ++- ...53\345\206\267\345\206\273\346\234\237.md" | 65 +++--- ...22\345\242\236\345\272\217\345\210\227.md" | 46 ++-- ...22\345\205\245\346\223\215\344\275\234.md" | 5 + ...15\345\255\220\346\225\260\347\273\204.md" | 84 +++++-- ...75\347\232\204\350\267\257\345\276\204.md" | 220 ++++-------------- ...61\345\255\220\345\272\217\345\210\227.md" | 2 +- "problems/\345\211\215\345\272\217/vim.md" | 3 + ...06\350\256\272\345\237\272\347\241\200.md" | 8 +- 15 files changed, 290 insertions(+), 292 deletions(-) diff --git "a/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" "b/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" index 3fc80bba6c..8e87fcbd2f 100644 --- "a/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" @@ -121,6 +121,30 @@ public: ``` +## 补充 + +二级剪枝的部分: + +```C++ +if (nums[k] + nums[i] > target && nums[k] + nums[i] >= 0) { + break; +} +``` + +可以优化为: + +```C++ +if (nums[k] + nums[i] > target && nums[i] >= 0) { + break; +} +``` + +因为只要 nums[k] + nums[i] > target,那么 nums[i] 后面的数都是正数的话,就一定 不符合条件了。 + +不过这种剪枝 其实有点 小绕,大家能够理解 文章给的完整代码的剪枝 就够了。 + + + diff --git "a/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" "b/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" index cf17f48dad..915b178aab 100644 --- "a/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" +++ "b/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" @@ -46,8 +46,8 @@ public: }; ``` -* 时间复杂度:$O(n^2)$ -* 空间复杂度:$O(1)$ +* 时间复杂度:O(n^2) +* 空间复杂度:O(1) 当然该方法超时了。 @@ -72,8 +72,8 @@ public: }; ``` -* 时间复杂度:$O(n)$ -* 空间复杂度:$O(1)$ +* 时间复杂度:O(n) +* 空间复杂度:O(1) ### 动态规划 @@ -157,8 +157,8 @@ public: }; ``` -* 时间复杂度:$O(n)$ -* 空间复杂度:$O(n)$ +* 时间复杂度:O(n) +* 空间复杂度:O(n) 从递推公式可以看出,dp[i]只是依赖于dp[i - 1]的状态。 @@ -187,8 +187,8 @@ public: }; ``` -* 时间复杂度:$O(n)$ -* 空间复杂度:$O(1)$ +* 时间复杂度:O(n) +* 空间复杂度:O(1) 这里能写出版本一就可以了,版本二虽然原理都一样,但是想直接写出版本二还是有点麻烦,容易自己给自己找bug。 diff --git "a/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" "b/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" index 33f92db4d1..611bd2ce3f 100644 --- "a/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" +++ "b/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" @@ -52,17 +52,20 @@ 一天一共就有五个状态, -0. 没有操作 -1. 第一次买入 -2. 第一次卖出 -3. 第二次买入 -4. 第二次卖出 +0. 没有操作 (其实我们也可以不设置这个状态) +1. 第一次持有股票 +2. 第一次不持有股票 +3. 第二次持有股票 +4. 第二次不持有股票 dp[i][j]中 i表示第i天,j为 [0 - 4] 五个状态,dp[i][j]表示第i天状态j所剩最大现金。 +需要注意:dp[i][1],**表示的是第i天,买入股票的状态,并不是说一定要第i天买入股票,这是很多同学容易陷入的误区**。 + +例如 dp[i][1] ,并不是说 第i点一定买入股票,有可能 第 i-1天 就买入了,那么 dp[i][1] 延续买入股票的这个状态。 + 2. 确定递推公式 -需要注意:dp[i][1],**表示的是第i天,买入股票的状态,并不是说一定要第i天买入股票,这是很多同学容易陷入的误区**。 达到dp[i][1]状态,有两个具体操作: @@ -95,11 +98,7 @@ dp[i][4] = max(dp[i - 1][4], dp[i - 1][3] + prices[i]); 第0天做第一次卖出的操作,这个初始值应该是多少呢? -首先卖出的操作一定是收获利润,整个股票买卖最差情况也就是没有盈利即全程无操作现金为0, - -从递推公式中可以看出每次是取最大值,那么既然是收获利润如果比0还小了就没有必要收获这个利润了。 - -所以dp[0][2] = 0; +此时还没有买入,怎么就卖出呢? 其实大家可以理解当天买入,当天卖出,所以dp[0][2] = 0; 第0天第二次买入操作,初始值应该是多少呢?应该不少同学疑惑,第一次还没买入呢,怎么初始化第二次买入呢? @@ -188,6 +187,32 @@ dp[1] = max(dp[1], dp[0] - prices[i]); 如果dp[1]取dp[1],即保持买入股 对于本题,把版本一的写法研究明白,足以! +## 拓展 + +其实我们可以不设置,‘0. 没有操作’ 这个状态,因为没有操作,手上的现金自然就是0, 正如我们在 [121.买卖股票的最佳时机](https://programmercarl.com/0121.买卖股票的最佳时机.html) 和 [122.买卖股票的最佳时机II](https://programmercarl.com/0122.买卖股票的最佳时机II.html) 也没有设置这一状态是一样的。 + +代码如下: + +``` CPP +// 版本三 +class Solution { +public: + int maxProfit(vector& prices) { + if (prices.size() == 0) return 0; + vector> dp(prices.size(), vector(5, 0)); + dp[0][1] = -prices[0]; + dp[0][3] = -prices[0]; + for (int i = 1; i < prices.size(); i++) { + dp[i][1] = max(dp[i - 1][1], 0 - prices[i]); + dp[i][2] = max(dp[i - 1][2], dp[i - 1][1] + prices[i]); + dp[i][3] = max(dp[i - 1][3], dp[i - 1][2] - prices[i]); + dp[i][4] = max(dp[i - 1][4], dp[i - 1][3] + prices[i]); + } + return dp[prices.size() - 1][4]; + } +}; +``` + ## 其他语言版本 Java: diff --git "a/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" "b/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" index 26a0a7adab..23a8f54a78 100644 --- "a/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" +++ "b/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" @@ -99,17 +99,15 @@ for (int j = 0; j < 2 * k - 1; j += 2) { 第0天做第一次卖出的操作,这个初始值应该是多少呢? -首先卖出的操作一定是收获利润,整个股票买卖最差情况也就是没有盈利即全程无操作现金为0, +此时还没有买入,怎么就卖出呢? 其实大家可以理解当天买入,当天卖出,所以dp[0][2] = 0; -从递推公式中可以看出每次是取最大值,那么既然是收获利润如果比0还小了就没有必要收获这个利润了。 +第0天第二次买入操作,初始值应该是多少呢?应该不少同学疑惑,第一次还没买入呢,怎么初始化第二次买入呢? -所以dp[0][2] = 0; +第二次买入依赖于第一次卖出的状态,其实相当于第0天第一次买入了,第一次卖出了,然后在买入一次(第二次买入),那么现在手头上没有现金,只要买入,现金就做相应的减少。 -第0天第二次买入操作,初始值应该是多少呢? +所以第二次买入操作,初始化为:dp[0][3] = -prices[0]; -不用管第几次,现在手头上没有现金,只要买入,现金就做相应的减少。 - -第二次买入操作,初始化为:dp[0][3] = -prices[0]; +第二次卖出初始化dp[0][4] = 0; **所以同理可以推出dp[0][j]当j为奇数的时候都初始化为 -prices[0]** diff --git "a/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\346\267\261\346\220\234\347\211\210.md" "b/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\346\267\261\346\220\234\347\211\210.md" index 98bd5a63c5..8680d2b1a3 100644 --- "a/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\346\267\261\346\220\234\347\211\210.md" +++ "b/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\346\267\261\346\220\234\347\211\210.md" @@ -84,9 +84,9 @@ public: 很多录友可能有疑惑,为什么 以上代码中的dfs函数,没有终止条件呢? 感觉递归没有终止很危险。 -其实终止条件 就写在了,调用dfs的地方,如果遇到不合法的方向,直接不会去调用dfs。 +其实终止条件 就写在了 调用dfs的地方,如果遇到不合法的方向,直接不会去调用dfs。 -当然,也可以这么写: +当然也可以这么写: ```CPP // 版本二 @@ -122,7 +122,7 @@ public: }; ``` -这里大家应该能看出区别了,无疑就是版本一中 调用dfs 的条件,放在了 版本二 的 终止条件位置上。 +这里大家应该能看出区别了,无疑就是版本一中 调用dfs 的条件判断 放在了 版本二 的 终止条件位置上。 **版本一的写法**是 :下一个节点是否能合法已经判断完了,只要调用dfs就是可以合法的节点。 @@ -137,6 +137,9 @@ public: 其实本题是 dfs,bfs 模板题,但正是因为是模板题,所以大家或者一些题解把重要的细节都很忽略了,我这里把大家没注意的但以后会踩的坑 都给列出来了。 +本篇我只给出的dfs的写法,大家发现我写的还是比较细的,那么后面我再单独更本题的bfs写法,虽然是模板题,但依然有很多注意的点,敬请期待! + + diff --git "a/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" "b/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" index c90b3d8cd4..22019d9c2c 100644 --- "a/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" +++ "b/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" @@ -35,6 +35,11 @@ * 所有节点的值都是唯一的。 * p、q 为不同节点且均存在于给定的二叉搜索树中。 +# 视频讲解 + +**《代码随想录》算法视频公开课:[二叉搜索树找祖先就有点不一样了!| 235. 二叉搜索树的最近公共祖先](https://www.bilibili.com/video/BV1Zt4y1F7ww),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 + + # 思路 diff --git "a/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" "b/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" index cae514fd2c..42efe31d77 100644 --- "a/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" @@ -14,17 +14,17 @@ 示例 1: -输入:nums = [10,9,2,5,3,7,101,18] -输出:4 -解释:最长递增子序列是 [2,3,7,101],因此长度为 4 。 +* 输入:nums = [10,9,2,5,3,7,101,18] +* 输出:4 +* 解释:最长递增子序列是 [2,3,7,101],因此长度为 4 。 示例 2: -输入:nums = [0,1,0,3,2,3] -输出:4 +* 输入:nums = [0,1,0,3,2,3] +* 输出:4 示例 3: -输入:nums = [7,7,7,7,7,7,7] -输出:1 +* 输入:nums = [7,7,7,7,7,7,7] +* 输出:1 提示: @@ -33,11 +33,21 @@ ## 思路 -最长上升子序列是动规的经典题目,这里dp[i]是可以根据dp[j] (j < i)推导出来的,那么依然用动规五部曲来分析详细一波: +首先通过本题大家要明确什么是子序列,“子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序”。 + +本题也是代码随想录中子序列问题的第一题,如果没接触过这种题目的话,本题还是很难的,甚至想暴力去搜索也不知道怎么搜。 +子序列问题是动态规划解决的经典问题,当前下标i的递增子序列长度,其实和i之前的下表j的子序列长度有关系,那那又是什么样的关系呢。 + +接下来,我们依然用动规五部曲来分析详细一波: 1. dp[i]的定义 -**dp[i]表示i之前包括i的以nums[i]结尾最长上升子序列的长度** +本题中,正确定义dp数组的含义十分重要。 + +**dp[i]表示i之前包括i的以nums[i]结尾的最长递增子序列的长度** + +为什么一定表示 “以nums[i]结尾的最长递增子序” ,因为我们在 做 递增比较的时候,如果比较 nums[j] 和 nums[i] 的大小,那么两个递增子序列一定分别以nums[j]为结尾 和 nums[i]为结尾, 要不然这个比较就没有意义了,不是尾部元素的比较那么 如果算递增呢。 + 2. 状态转移方程 @@ -49,13 +59,15 @@ 3. dp[i]的初始化 -每一个i,对应的dp[i](即最长上升子序列)起始大小至少都是1. +每一个i,对应的dp[i](即最长递增子序列)起始大小至少都是1. 4. 确定遍历顺序 -dp[i] 是有0到i-1各个位置的最长升序子序列 推导而来,那么遍历i一定是从前向后遍历。 +dp[i] 是有0到i-1各个位置的最长递增子序列 推导而来,那么遍历i一定是从前向后遍历。 + +j其实就是遍历0到i-1,那么是从前到后,还是从后到前遍历都无所谓,只要吧 0 到 i-1 的元素都遍历了就行了。 所以默认习惯 从前向后遍历。 -j其实就是0到i-1,遍历i的循环在外层,遍历j则在内层,代码如下: +遍历i的循环在外层,遍历j则在内层,代码如下: ```CPP for (int i = 1; i < nums.size(); i++) { diff --git "a/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" "b/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" index 0111037f8f..375a993dce 100644 --- "a/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" +++ "b/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" @@ -16,9 +16,9 @@ * 卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。 示例: -输入: [1,2,3,0,2] -输出: 3 -解释: 对应的交易状态为: [买入, 卖出, 冷冻期, 买入, 卖出] +* 输入: [1,2,3,0,2] +* 输出: 3 +* 解释: 对应的交易状态为: [买入, 卖出, 冷冻期, 买入, 卖出] ## 思路 @@ -36,12 +36,13 @@ dp[i][j],第i天状态为j,所剩的最多现金为dp[i][j]。 **其实本题很多同学搞的比较懵,是因为出现冷冻期之后,状态其实是比较复杂度**,例如今天买入股票、今天卖出股票、今天是冷冻期,都是不能操作股票的。 + 具体可以区分出如下四个状态: -* 状态一:买入股票状态(今天买入股票,或者是之前就买入了股票然后没有操作) -* 卖出股票状态,这里就有两种卖出股票状态 - * 状态二:两天前就卖出了股票,度过了冷冻期,一直没操作,今天保持卖出股票状态 - * 状态三:今天卖出了股票 +* 状态一:持有股票状态(今天买入股票,或者是之前就买入了股票然后没有操作,一直持有) +* 不持有股票状态,这里就有两种卖出股票状态 + * 状态二:保持卖出股票的状态(两天前就卖出了股票,度过一天冷冻期。或者是前一天就是卖出股票状态,一直没操作) + * 状态三:今天卖出股票 * 状态四:今天为冷冻期状态,但冷冻期状态不可持续,只有一天! ![](https://img-blog.csdnimg.cn/518d5baaf33f4b2698064f8efb42edbf.png) @@ -57,38 +58,48 @@ j的状态为: 从代码上来看确实可以合并,但从逻辑上分析合并之后就很难理解了,所以我下面的讲解是按照这四个状态来的,把每一个状态分析清楚。 -**注意这里的每一个状态,例如状态一,是买入股票状态并不是说今天已经就买入股票,而是说保存买入股票的状态即:可能是前几天买入的,之后一直没操作,所以保持买入股票的状态**。 +如果大家按照代码随想录顺序来刷的话,会发现 买卖股票最佳时机 1,2,3,4 的题目讲解中 -1. 确定递推公式 +* [动态规划:121.买卖股票的最佳时机](https://programmercarl.com/0121.买卖股票的最佳时机.html) +* [动态规划:122.买卖股票的最佳时机II](https://programmercarl.com/0122.买卖股票的最佳时机II(动态规划).html) +* [动态规划:123.买卖股票的最佳时机III](https://programmercarl.com/0123.买卖股票的最佳时机III.html) +* [动态规划:188.买卖股票的最佳时机IV](https://programmercarl.com/0188.买卖股票的最佳时机IV.html) + +「今天卖出股票」我是没有单独列出一个状态的归类为「不持有股票的状态」,而本题为什么要单独列出「今天卖出股票」 一个状态呢? + +因为本题我们有冷冻期,而冷冻期的前一天,只能是 「今天卖出股票」状态,如果是 「不持有股票状态」那么就很模糊,因为不一定是 卖出股票的操作。 +如果没有按照 代码随想录 顺序去刷的录友,可能看这里的讲解 会有点困惑,建议把代码随想录本篇之前股票内容的讲解都看一下,领会一下每天 状态的设置。 -达到买入股票状态(状态一)即:dp[i][0],有两个具体操作: +**注意这里的每一个状态,例如状态一,是持有股票股票状态并不是说今天一定就买入股票,而是说保持买入股票的状态即:可能是前几天买入的,之后一直没操作,所以保持买入股票的状态**。 + +1. 确定递推公式 + +**达到买入股票状态**(状态一)即:dp[i][0],有两个具体操作: * 操作一:前一天就是持有股票状态(状态一),dp[i][0] = dp[i - 1][0] * 操作二:今天买入了,有两种情况 * 前一天是冷冻期(状态四),dp[i - 1][3] - prices[i] - * 前一天是保持卖出股票状态(状态二),dp[i - 1][1] - prices[i] - -所以操作二取最大值,即:max(dp[i - 1][3], dp[i - 1][1]) - prices[i] + * 前一天是保持卖出股票的状态(状态二),dp[i - 1][1] - prices[i] -那么dp[i][0] = max(dp[i - 1][0], max(dp[i - 1][3], dp[i - 1][1]) - prices[i]); +那么dp[i][0] = max(dp[i - 1][0], dp[i - 1][3] - prices[i], dp[i - 1][1] - prices[i]); -达到保持卖出股票状态(状态二)即:dp[i][1],有两个具体操作: +**达到保持卖出股票状态**(状态二)即:dp[i][1],有两个具体操作: * 操作一:前一天就是状态二 * 操作二:前一天是冷冻期(状态四) dp[i][1] = max(dp[i - 1][1], dp[i - 1][3]); -达到今天就卖出股票状态(状态三),即:dp[i][2] ,只有一个操作: +**达到今天就卖出股票状态**(状态三),即:dp[i][2] ,只有一个操作: -* 操作一:昨天一定是买入股票状态(状态一),今天卖出 +昨天一定是持有股票状态(状态一),今天卖出 即:dp[i][2] = dp[i - 1][0] + prices[i]; -达到冷冻期状态(状态四),即:dp[i][3],只有一个操作: +**达到冷冻期状态**(状态四),即:dp[i][3],只有一个操作: -* 操作一:昨天卖出了股票(状态三) +昨天卖出了股票(状态三) dp[i][3] = dp[i - 1][2]; @@ -105,13 +116,13 @@ dp[i][3] = dp[i - 1][2]; 这里主要讨论一下第0天如何初始化。 -如果是持有股票状态(状态一)那么:dp[0][0] = -prices[0],买入股票所剩现金为负数。 +如果是持有股票状态(状态一)那么:dp[0][0] = -prices[0],一定是当天买入股票。 -保持卖出股票状态(状态二),第0天没有卖出dp[0][1]初始化为0就行, +保持卖出股票状态(状态二),这里其实从 「状态二」的定义来说 ,很难明确应该初始多少,这种情况我们就看递推公式需要我们给他初始成什么数值。 -今天卖出了股票(状态三),同样dp[0][2]初始化为0,因为最少收益就是0,绝不会是负数。 +如果i为1,第1天买入股票,那么递归公式中需要计算 dp[i - 1][1] - prices[i] ,即 dp[0][1] - prices[1],那么大家感受一下 dp[0][1] (即第0天的状态二)应该初始成多少,只能初始为0。想一想如果初始为其他数值,是我们第1天买入股票后 手里还剩的现金数量是不是就不对了。 -同理dp[0][3]也初始为0。 +今天卖出了股票(状态三),同上分析,dp[0][2]初始化为0,dp[0][3]也初始为0。 4. 确定遍历顺序 @@ -137,18 +148,18 @@ public: vector> dp(n, vector(4, 0)); dp[0][0] -= prices[0]; // 持股票 for (int i = 1; i < n; i++) { - dp[i][0] = max(dp[i - 1][0], max(dp[i - 1][3], dp[i - 1][1]) - prices[i]); + dp[i][0] = max(dp[i - 1][0], dp[i - 1][3] - prices[i], dp[i - 1][1] - prices[i]); dp[i][1] = max(dp[i - 1][1], dp[i - 1][3]); dp[i][2] = dp[i - 1][0] + prices[i]; dp[i][3] = dp[i - 1][2]; } - return max(dp[n - 1][3],max(dp[n - 1][1], dp[n - 1][2])); + return max(dp[n - 1][3], dp[n - 1][1], dp[n - 1][2]); } }; ``` -* 时间复杂度:$O(n)$ -* 空间复杂度:$O(n)$ +* 时间复杂度:O(n) +* 空间复杂度:O(n) 当然,空间复杂度可以优化,定义一个dp[2][4]大小的数组就可以了,就保存前一天的当前的状态,感兴趣的同学可以自己去写一写,思路是一样的。 diff --git "a/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" "b/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" index 410f5b7b17..81155f9b11 100644 --- "a/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" +++ "b/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" @@ -13,15 +13,14 @@ 连续递增的子序列 可以由两个下标 l 和 r(l < r)确定,如果对于每个 l <= i < r,都有 nums[i] < nums[i + 1] ,那么子序列 [nums[l], nums[l + 1], ..., nums[r - 1], nums[r]] 就是连续递增子序列。 示例 1: -输入:nums = [1,3,5,4,7] -输出:3 -解释:最长连续递增序列是 [1,3,5], 长度为3。 -尽管 [1,3,5,7] 也是升序的子序列, 但它不是连续的,因为 5 和 7 在原数组里被 4 隔开。 +* 输入:nums = [1,3,5,4,7] +* 输出:3 +* 解释:最长连续递增序列是 [1,3,5], 长度为3。尽管 [1,3,5,7] 也是升序的子序列, 但它不是连续的,因为 5 和 7 在原数组里被 4 隔开。 示例 2: -输入:nums = [2,2,2,2,2] -输出:1 -解释:最长连续递增序列是 [2], 长度为1。 +* 输入:nums = [2,2,2,2,2] +* 输出:1 +* 解释:最长连续递增序列是 [2], 长度为1。 提示: @@ -41,27 +40,27 @@ 1. 确定dp数组(dp table)以及下标的含义 -**dp[i]:以下标i为结尾的数组的连续递增的子序列长度为dp[i]**。 +**dp[i]:以下标i为结尾的连续递增的子序列长度为dp[i]**。 注意这里的定义,一定是以下标i为结尾,并不是说一定以下标0为起始位置。 2. 确定递推公式 -如果 nums[i + 1] > nums[i],那么以 i+1 为结尾的数组的连续递增的子序列长度 一定等于 以i为结尾的数组的连续递增的子序列长度 + 1 。 +如果 nums[i] > nums[i - 1],那么以 i 为结尾的连续递增的子序列长度 一定等于 以i - 1为结尾的连续递增的子序列长度 + 1 。 -即:dp[i + 1] = dp[i] + 1; +即:dp[i] = dp[i - 1] + 1; **注意这里就体现出和[动态规划:300.最长递增子序列](https://programmercarl.com/0300.最长上升子序列.html)的区别!** -因为本题要求连续递增子序列,所以就必要比较nums[i + 1]与nums[i],而不用去比较nums[j]与nums[i] (j是在0到i之间遍历)。 +因为本题要求连续递增子序列,所以就必要比较nums[i]与nums[i - 1],而不用去比较nums[j]与nums[i] (j是在0到i之间遍历)。 -既然不用j了,那么也不用两层for循环,本题一层for循环就行,比较nums[i + 1] 和 nums[i]。 +既然不用j了,那么也不用两层for循环,本题一层for循环就行,比较nums[i] 和 nums[i - 1]。 这里大家要好好体会一下! 3. dp数组如何初始化 -以下标i为结尾的数组的连续递增的子序列长度最少也应该是1,即就是nums[i]这一个元素。 +以下标i为结尾的连续递增的子序列长度最少也应该是1,即就是nums[i]这一个元素。 所以dp[i]应该初始1; @@ -72,9 +71,9 @@ 本文在确定递推公式的时候也说明了为什么本题只需要一层for循环,代码如下: ```CPP -for (int i = 0; i < nums.size() - 1; i++) { - if (nums[i + 1] > nums[i]) { // 连续记录 - dp[i + 1] = dp[i] + 1; // 递推公式 +for (int i = 1; i < nums.size(); i++) { + if (nums[i] > nums[i - 1]) { // 连续记录 + dp[i] = dp[i - 1] + 1; } } ``` @@ -96,15 +95,16 @@ public: if (nums.size() == 0) return 0; int result = 1; vector dp(nums.size() ,1); - for (int i = 0; i < nums.size() - 1; i++) { - if (nums[i + 1] > nums[i]) { // 连续记录 - dp[i + 1] = dp[i] + 1; + for (int i = 1; i < nums.size(); i++) { + if (nums[i] > nums[i - 1]) { // 连续记录 + dp[i] = dp[i - 1] + 1; } - if (dp[i + 1] > result) result = dp[i + 1]; + if (dp[i] > result) result = dp[i]; } return result; } }; + ``` * 时间复杂度:O(n) @@ -112,7 +112,7 @@ public: ### 贪心 -这道题目也可以用贪心来做,也就是遇到nums[i + 1] > nums[i]的情况,count就++,否则count为1,记录count的最大值就可以了。 +这道题目也可以用贪心来做,也就是遇到nums[i] > nums[i - 1]的情况,count就++,否则count为1,记录count的最大值就可以了。 代码如下: @@ -123,8 +123,8 @@ public: if (nums.size() == 0) return 0; int result = 1; // 连续子序列最少也是1 int count = 1; - for (int i = 0; i < nums.size() - 1; i++) { - if (nums[i + 1] > nums[i]) { // 连续记录 + for (int i = 1; i < nums.size(); i++) { + if (nums[i] > nums[i - 1]) { // 连续记录 count++; } else { // 不连续,count从头开始 count = 1; diff --git "a/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" "b/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" index 2e899e2284..e0d2cc869f 100644 --- "a/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" +++ "b/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" @@ -22,6 +22,11 @@ * -10^8 <= val <= 10^8 * 新值和原始二叉搜索树中的任意节点值都不同 +# 视频讲解 + +**《代码随想录》算法视频公开课:[原来这么简单? | LeetCode:701.二叉搜索树中的插入操作](https://www.bilibili.com/video/BV1Et4y1c78Y),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 + + # 思路 其实这道题目其实是一道简单题目,**但是题目中的提示:有多种有效的插入方式,还可以重构二叉搜索树,一下子吓退了不少人**,瞬间感觉题目复杂了很多。 diff --git "a/problems/0718.\346\234\200\351\225\277\351\207\215\345\244\215\345\255\220\346\225\260\347\273\204.md" "b/problems/0718.\346\234\200\351\225\277\351\207\215\345\244\215\345\255\220\346\225\260\347\273\204.md" index a1ca92e3e4..37f6cbfec8 100644 --- "a/problems/0718.\346\234\200\351\225\277\351\207\215\345\244\215\345\255\220\346\225\260\347\273\204.md" +++ "b/problems/0718.\346\234\200\351\225\277\351\207\215\345\244\215\345\255\220\346\225\260\347\273\204.md" @@ -13,11 +13,10 @@ 示例: 输入: -A: [1,2,3,2,1] -B: [3,2,1,4,7] -输出:3 -解释: -长度最长的公共子数组是 [3, 2, 1] 。 +* A: [1,2,3,2,1] +* B: [3,2,1,4,7] +* 输出:3 +* 解释:长度最长的公共子数组是 [3, 2, 1] 。 提示: @@ -27,7 +26,12 @@ B: [3,2,1,4,7] ## 思路 -注意题目中说的子数组,其实就是连续子序列。这种问题动规最拿手,动规五部曲分析如下: +注意题目中说的子数组,其实就是连续子序列。 + +要求两个数组中最长重复子数组,如果是暴力的解法 只要需要先两层for循环确定两个数组起始位置,然后在来一个循环可以是for或者while,来从两个起始位置开始比较,取得重复子数组的长度。 + +本题其实是动规解决的经典题目,我们只要想到 用二维数组可以记录两个字符串的所有比较情况,这样就比较好推 递推公式了。 +动规五部曲分析如下: 1. 确定dp数组(dp table)以及下标的含义 @@ -39,7 +43,7 @@ dp[i][j] :以下标i - 1为结尾的A,和以下标j - 1为结尾的B,最 那有同学问了,我就定义dp[i][j]为 以下标i为结尾的A,和以下标j 为结尾的B,最长重复子数组长度。不行么? -行倒是行! 但实现起来就麻烦一点,大家看下面的dp数组状态图就明白了。 +行倒是行! 但实现起来就麻烦一点,需要单独处理初始化部分,在本题解下面的拓展内容里,我给出了 第二种 dp数组的定义方式所对应的代码和讲解,大家比较一下就了解了。 2. 确定递推公式 @@ -73,14 +77,15 @@ dp[i][j] :以下标i - 1为结尾的A,和以下标j - 1为结尾的B,最 代码如下: ```CPP -for (int i = 1; i <= A.size(); i++) { - for (int j = 1; j <= B.size(); j++) { - if (A[i - 1] == B[j - 1]) { +for (int i = 1; i <= nums1.size(); i++) { + for (int j = 1; j <= nums2.size(); j++) { + if (nums1[i - 1] == nums2[j - 1]) { dp[i][j] = dp[i - 1][j - 1] + 1; } if (dp[i][j] > result) result = dp[i][j]; } } + ``` @@ -93,14 +98,15 @@ for (int i = 1; i <= A.size(); i++) { 以上五部曲分析完毕,C++代码如下: ```CPP +// 版本一 class Solution { public: - int findLength(vector& A, vector& B) { - vector> dp (A.size() + 1, vector(B.size() + 1, 0)); + int findLength(vector& nums1, vector& nums2) { + vector> dp (nums1.size() + 1, vector(nums2.size() + 1, 0)); int result = 0; - for (int i = 1; i <= A.size(); i++) { - for (int j = 1; j <= B.size(); j++) { - if (A[i - 1] == B[j - 1]) { + for (int i = 1; i <= nums1.size(); i++) { + for (int j = 1; j <= nums2.size(); j++) { + if (nums1[i - 1] == nums2[j - 1]) { dp[i][j] = dp[i - 1][j - 1] + 1; } if (dp[i][j] > result) result = dp[i][j]; @@ -111,8 +117,8 @@ public: }; ``` -* 时间复杂度:$O(n × m)$,n 为A长度,m为B长度 -* 空间复杂度:$O(n × m)$ +* 时间复杂度:O(n × m),n 为A长度,m为B长度 +* 空间复杂度:O(n × m) ## 滚动数组 @@ -127,6 +133,7 @@ public: **此时遍历B数组的时候,就要从后向前遍历,这样避免重复覆盖**。 ```CPP +// 版本二 class Solution { public: int findLength(vector& A, vector& B) { @@ -148,6 +155,49 @@ public: * 时间复杂度:$O(n × m)$,n 为A长度,m为B长度 * 空间复杂度:$O(m)$ +## 拓展 + +前面讲了 dp数组为什么定义:以下标i - 1为结尾的A,和以下标j - 1为结尾的B,最长重复子数组长度为dp[i][j]。 + +我就定义dp[i][j]为 以下标i为结尾的A,和以下标j 为结尾的B,最长重复子数组长度。不行么? + +当然可以,就是实现起来麻烦一些。 + +如果定义 dp[i][j]为 以下标i为结尾的A,和以下标j 为结尾的B,那么 第一行和第一列毕竟要经行初始化,如果nums1[i] 与 nums2[0] 相同的话,对应的 dp[i][0]就要初始为1, 因为此时最长重复子数组为1。 nums2[j] 与 nums1[0]相同的话,同理。 + +所以代码如下: + +```CPP +// 版本三 +class Solution { +public: + int findLength(vector& nums1, vector& nums2) { + vector> dp (nums1.size() + 1, vector(nums2.size() + 1, 0)); + int result = 0; + + // 要对第一行,第一列经行初始化 + for (int i = 0; i < nums1.size(); i++) if (nums1[i] == nums2[0]) dp[i][0] = 1; + for (int j = 0; j < nums2.size(); j++) if (nums1[0] == nums2[j]) dp[0][j] = 1; + + for (int i = 0; i < nums1.size(); i++) { + for (int j = 0; j < nums2.size(); j++) { + if (nums1[i] == nums2[j] && i > 0 && j > 0) { // 防止 i-1 出现负数 + dp[i][j] = dp[i - 1][j - 1] + 1; + } + if (dp[i][j] > result) result = dp[i][j]; + } + } + return result; + } +}; +``` + +大家会发现 这种写法 一定要多写一段初始化的过程。 + +而且为了让 `if (dp[i][j] > result) result = dp[i][j];` 收集到全部结果,两层for训练一定从0开始遍历,这样需要加上 `&& i > 0 && j > 0`的判断。 + +相对于版本一来说还是多写了不少代码。而且逻辑上也复杂了一些。 优势就是dp数组的定义,更直观一点。 + ## 其他语言版本 diff --git "a/problems/0797.\346\211\200\346\234\211\345\217\257\350\203\275\347\232\204\350\267\257\345\276\204.md" "b/problems/0797.\346\211\200\346\234\211\345\217\257\350\203\275\347\232\204\350\267\257\345\276\204.md" index c727af6ec0..79fa5b9b45 100644 --- "a/problems/0797.\346\211\200\346\234\211\345\217\257\350\203\275\347\232\204\350\267\257\345\276\204.md" +++ "b/problems/0797.\346\211\200\346\234\211\345\217\257\350\203\275\347\232\204\350\267\257\345\276\204.md" @@ -8,195 +8,44 @@ # 797.所有可能的路径 -本题是一道 原汁原味的 深度优先搜索(dfs)模板题,那么用这道题目 来讲解 深搜最合适不过了。 +[力扣题目链接](https://leetcode.cn/problems/all-paths-from-source-to-target/) -接下来给大家详细讲解dfs: +给你一个有 n 个节点的 有向无环图(DAG),请你找出所有从节点 0 到节点 n-1 的路径并输出(不要求按特定顺序) -## dfs 与 bfs 区别 +graph[i] 是一个从节点 i 可以访问的所有节点的列表(即从节点 i 到节点 graph[i][j]存在一条有向边)。 -先来了解dfs的过程,很多录友可能对dfs(深度优先搜索),bfs(广度优先搜索)分不清。 +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20221203135439.png) -先给大家说一下两者大概的区别: +提示: -* dfs是可一个方向去搜,不到黄河不回头,直到遇到绝境了,搜不下去了,在换方向(换方向的过程就涉及到了回溯)。 -* bfs是先把本节点所连接的所有节点遍历一遍,走到下一个节点的时候,再把连接节点的所有节点遍历一遍,搜索方向更像是广度,四面八方的搜索过程。 +* n == graph.length +* 2 <= n <= 15 +* 0 <= graph[i][j] < n +* graph[i][j] != i(即不存在自环) +* graph[i] 中的所有元素 互不相同 +* 保证输入为 有向无环图(DAG) -当然以上讲的是,大体可以这么理解,接下来 我们详细讲解dfs,(bfs在用单独一篇文章详细讲解) +## 思路 -## dfs 搜索过程 +这道题目是深度优先搜索,比较好的入门题。 -上面说道dfs是可一个方向搜,不到黄河不回头。 那么我们来举一个例子。 +如果对深度优先搜索还不够了解,可以先看这里:[深度优先搜索的理论基础](https://programmercarl.com/图论深搜理论基础.html) -如图一,是一个无向图,我们要搜索从节点1到节点6的所有路径。 +我依然总结了深搜三部曲,如果按照代码随想录刷题的录友,应该刷过 二叉树的递归三部曲,回溯三部曲。 -![图一](https://code-thinking-1253855093.file.myqcloud.com/pics/20220707093643.png) +**大家可能有疑惑,深搜 和 二叉树和回溯算法 有什么区别呢**? 什么时候用深搜 什么时候用回溯? -那么dfs搜索的第一条路径是这样的: (假设第一次延默认方向,就找到了节点6),图二 +我在讲解[二叉树理论基础](https://programmercarl.com/二叉树理论基础.html)的时候,提到过,**二叉树的前中后序遍历其实就是深搜在二叉树这种数据结构上的应用**。 -![图二](https://code-thinking-1253855093.file.myqcloud.com/pics/20220707093807.png) +那么回溯算法呢,**其实 回溯算法就是 深搜,只不过 我们给他一个更细分的定义,叫做回溯算法**。 -此时我们找到了节点6,(遇到黄河了,是不是应该回头了),那么应该再去搜索其他方向了。 如图三: +那有的录友可能说:那我以后称回溯算法为深搜,是不是没毛病? -![图三](https://code-thinking-1253855093.file.myqcloud.com/pics/20220707094011.png) +理论上来说,没毛病,但 就像是 二叉树 你不叫它二叉树,叫它数据结构,有问题不? 也没问题对吧。 -路径2撤销了,改变了方向,走路径3(红色线), 接着也找到终点6。 那么撤销路径2,改为路径3,在dfs中其实就是回溯的过程(这一点很重要,很多录友,都不理解dfs代码中回溯是用来干什么的) +建议是 有细分的场景,还是称其细分场景的名称。 所以回溯算法可以独立出来,但回溯确实就是深搜。 -又找到了一条从节点1到节点6的路径,又到黄河了,此时再回头,下图图四中,路径4撤销(回溯的过程),改为路径5。 - -![图四](https://code-thinking-1253855093.file.myqcloud.com/pics/20220707094322.png) - -又找到了一条从节点1到节点6的路径,又到黄河了,此时再回头,下图图五,路径6撤销(回溯的过程),改为路径7,路径8 和 路径7,路径9, 结果发现死路一条,都走到了自己走过的节点。 - -![图五](https://code-thinking-1253855093.file.myqcloud.com/pics/20220707094813.png) - -那么节点2所连接路径和节点3所链接的路径 都走过了,撤销路径只能向上回退,去选择撤销当初节点4的选择,也就是撤销路径5,改为路径10 。 如图图六: - -![图六](https://code-thinking-1253855093.file.myqcloud.com/pics/20220707095232.png) - - -上图演示中,其实我并没有把 所有的 从节点1 到节点6的dfs(深度优先搜索)的过程都画出来,那样太冗余了,但 已经把dfs 关键的地方都涉及到了,关键就两点: - -* 搜索方向,是认准一个方向搜,直到碰壁之后在换方向 -* 换方向是撤销原路径,改为节点链接的下一个路径,回溯的过程。 - - -## 代码框架 - -正式因为dfs搜索可一个方向,并需要回溯,所以用递归的方式来实现是最方便的。 - -很多录友对回溯很陌生,建议先看看码随想录,[回溯算法章节](https://programmercarl.com/回溯算法理论基础.html)。 - -有递归的地方就有回溯,那么回溯在哪里呢? - -就地递归函数的下面,例如如下代码: -``` -void dfs(参数) { - 处理节点 - dfs(图,选择的节点); // 递归 - 回溯,撤销处理结果 -} -``` - -可以看到回溯操作就在递归函数的下面,递归和回溯是相辅相成的。 - -在讲解[二叉树章节](https://programmercarl.com/二叉树理论基础.html)的时候,二叉树的递归法其实就是dfs,而二叉树的迭代法,就是bfs(广度优先搜索) - -所以**dfs,bfs其实是基础搜索算法,也广泛应用与其他数据结构与算法中**。 - -我们在回顾一下[回溯法](https://programmercarl.com/回溯算法理论基础.html)的代码框架: - -``` -void backtracking(参数) { - if (终止条件) { - 存放结果; - return; - } - for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) { - 处理节点; - backtracking(路径,选择列表); // 递归 - 回溯,撤销处理结果 - } -} - -``` - -回溯算法,其实就是dfs的过程,这里给出dfs的代码框架: - -``` -void dfs(参数) { - if (终止条件) { - 存放结果; - return; - } - - for (选择:本节点所连接的其他节点) { - 处理节点; - dfs(图,选择的节点); // 递归 - 回溯,撤销处理结果 - } -} - -``` - -可以发现dfs的代码框架和回溯算法的代码框架是差不多的。 - -下面我在用 深搜三部曲,来解读 dfs的代码框架。 - -## 深搜三部曲 - -在 [二叉树递归讲解](https://programmercarl.com/%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E9%80%92%E5%BD%92%E9%81%8D%E5%8E%86.html)中,给出了递归三部曲。 - -[回溯算法](https://programmercarl.com/回溯算法理论基础.html)讲解中,给出了 回溯三部曲。 - -其实深搜也是一样的,深搜三部曲如下: - -1. 确认递归函数,参数 - -``` -void dfs(参数) -``` - -通常我们递归的时候,我们递归搜索需要了解哪些参数,其实也可以在写递归函数的时候,发现需要什么参数,再去补充就可以。 - -一般情况,深搜需要 二维数组数组结构保存所有路径,需要一维数组保存单一路径,这种保存结果的数组,我们可以定义一个全局遍历,避免让我们的函数参数过多。 - -例如这样: - -``` -vector> result; // 保存符合条件的所有路径 -vector path; // 起点到终点的路径 -void dfs (图,目前搜索的节点) -``` - -但这种写法看个人习惯,不强求。 - -2. 确认终止条件 - -终止条件很重要,很多同学写dfs的时候,之所以容易死循环,栈溢出等等这些问题,都是因为终止条件没有想清楚。 - -``` -if (终止条件) { - 存放结果; - return; -} -``` - -终止添加不仅是结束本层递归,同时也是我们收获结果的时候。 - -另外,其实很多dfs写法,没有写终止条件,其实终止条件写在了, 下面dfs递归的逻辑里了,也就是不符合条件,直接不会向下递归。这里如果大家不理解的话,没关系,后面会有具体题目来讲解。 -* 841.钥匙和房间 -* 200. 岛屿数量 - -3. 处理目前搜索节点出发的路径 - -一般这里就是一个for循环的操作,去遍历 目前搜索节点 所能到的所有节点。 - -``` -for (选择:本节点所连接的其他节点) { - 处理节点; - dfs(图,选择的节点); // 递归 - 回溯,撤销处理结果 -} -``` - -不少录友疑惑的地方,都是 dfs代码框架中for循环里分明已经处理节点了,那么 dfs函数下面 为什么还要撤销的呢。 - -如图七所示, 路径2 已经走到了 目的地节点6,那么 路径2 是如何撤销,然后改为 路径3呢? 其实这就是 回溯的过程,撤销路径2,走换下一个方向。 - -![图七](https://code-thinking-1253855093.file.myqcloud.com/pics/20220708093544.png) - - -## 总结 - -我们讲解了,dfs 和 bfs的大体区别(bfs详细过程下篇来讲),dfs的搜索过程以及代码框架。 - -最后还有 深搜三部曲来解读这份代码框架。 - -以上如果大家都能理解了,其实搜索的代码就很好写,具体题目套用具体场景就可以了。 - -## 797. 所有可能的路径 - -### 思路 +接下来我们使用深搜三部曲来分析题目: 1. 确认递归函数,参数 @@ -218,7 +67,7 @@ void dfs (vector>& graph, int x) 当目前遍历的节点 为 最后一个节点的时候,就找到了一条,从 出发点到终止点的路径。 -当前遍历的节点,我们定义为x,最后一点节点,就是 graph.size() - 1。 +当前遍历的节点,我们定义为x,最后一点节点,就是 graph.size() - 1(因为题目描述是找出所有从节点 0 到节点 n-1 的路径并输出)。 所以 但 x 等于 graph.size() - 1 的时候就找到一条有效路径。 代码如下: @@ -248,7 +97,13 @@ path.push_back(graph[x][i]); // 遍历到的节点加入到路径中来 ``` -当前遍历的节点就是 `graph[x][i]` 了,所以进入下一层递归 +一些录友可以疑惑这里如果找到x 链接的节点的,例如如果x目前是节点0,那么目前的过程就是这样的: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20221204111937.png) + +二维数组中,graph[x][i] 都是x链接的节点,当前遍历的节点就是 `graph[x][i]` 。 + +进入下一层递归 ```C++ dfs(graph, graph[x][i]); // 进入下一层递归 @@ -264,8 +119,7 @@ for (int i = 0; i < graph[x].size(); i++) { // 遍历节点n链接的所有节 } ``` - -### 本题代码 +本题整体代码如下: ```c++ class Solution { @@ -296,11 +150,19 @@ public: ``` +# 总结 + +本题是比较基础的深度优先搜索模板题,这种有向图路径问题,最合适使用深搜,当然本题也可以使用广搜,但广搜相对来说就麻烦了一些,需要记录一下路径。 + +而深搜和广搜都适合解决颜色类的问题,例如岛屿系列,其实都是 遍历+标记,所以使用哪种遍历都是可以的。 + +至于广搜理论基础,我们在下一篇在好好讲解,敬请期待! + ## 其他语言版本 -### Java +## Java -### Python +## Python ```python class Solution: def __init__(self): diff --git "a/problems/1143.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" "b/problems/1143.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" index 713d6912a2..b655b5cd16 100644 --- "a/problems/1143.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/1143.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" @@ -49,7 +49,7 @@ dp[i][j]:长度为[0, i - 1]的字符串text1与长度为[0, j - 1]的字符 有同学会问:为什么要定义长度为[0, i - 1]的字符串text1,定义为长度为[0, i]的字符串text1不香么? -这样定义是为了后面代码实现方便,如果非要定义为为长度为[0, i]的字符串text1也可以,大家可以试一试! +这样定义是为了后面代码实现方便,如果非要定义为为长度为[0, i]的字符串text1也可以,我在 [动态规划:718. 最长重复子数组](https://programmercarl.com/0718.最长重复子数组.html) 中的「拓展」里 详细讲解了区别所在,其实就是简化了dp数组第一行和第一列的初始化逻辑。 2. 确定递推公式 diff --git "a/problems/\345\211\215\345\272\217/vim.md" "b/problems/\345\211\215\345\272\217/vim.md" index ce4a0139f2..f84e70aca7 100644 --- "a/problems/\345\211\215\345\272\217/vim.md" +++ "b/problems/\345\211\215\345\272\217/vim.md" @@ -1,6 +1,7 @@ # 人生苦短,我用VIM!| 最强vim配置 > Github地址:[https://github.com/youngyangyang04/PowerVim](https://github.com/youngyangyang04/PowerVim) +> Gitee地址:[https://gitee.com/programmercarl/power-vim](https://gitee.com/programmercarl/power-vim) 熟悉我的录友,应该都知道我是vim流,无论是写代码还是写文档(Markdown),都是vim,都没用IDE。 @@ -96,5 +97,7 @@ sh install.sh Github地址:[https://github.com/youngyangyang04/PowerVim](https://github.com/youngyangyang04/PowerVim) +Gitee地址:[https://gitee.com/programmercarl/power-vim](https://gitee.com/programmercarl/power-vim) + 最后,因为这个vim配置因为我一直没有宣传,所以star数量很少,哈哈哈,录友们去给个star吧,真正的开发利器,值得顶起来! diff --git "a/problems/\345\233\276\350\256\272\345\271\277\347\264\242\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\345\233\276\350\256\272\345\271\277\347\264\242\347\220\206\350\256\272\345\237\272\347\241\200.md" index 0252553b89..d1bb14e055 100644 --- "a/problems/\345\233\276\350\256\272\345\271\277\347\264\242\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\345\233\276\350\256\272\345\271\277\347\264\242\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -54,22 +54,22 @@ 其实,我们仅仅需要一个容器,能保存我们要遍历过的元素就可以,**那么用队列,还是用栈,甚至用数组,都是可以的**。 -用队列的话,就是保证每一圈都是一个方向去转,例如统一顺时针或者逆时针。 +**用队列的话,就是保证每一圈都是一个方向去转,例如统一顺时针或者逆时针**。 因为队列是先进先出,加入元素和弹出元素的顺序是没有改变的。 -如果用栈的话,可能就是第一圈顺时针遍历,第二圈逆时针遍历,第三圈有顺时针遍历。 +**如果用栈的话,就是第一圈顺时针遍历,第二圈逆时针遍历,第三圈有顺时针遍历**。 因为栈是先进后出,加入元素和弹出元素的顺序改变了。 那么广搜需要注意 转圈搜索的顺序吗? 不需要! -所以用队列,还是用栈都是可以的,但大家都习惯用队列了,所以下面的讲解用我也用队列来讲,只不过要给大家说清楚,并不是非要用队列,用栈也可以。 +所以用队列,还是用栈都是可以的,但大家都习惯用队列了,**所以下面的讲解用我也用队列来讲,只不过要给大家说清楚,并不是非要用队列,用栈也可以**。 下面给出广搜代码模板,该模板针对的就是,上面的四方格的地图: (详细注释) ```CPP -int dir[4][2] = {0, 1, 1, 0, -1, 0, 0, -1}; // 四个方向 +int dir[4][2] = {0, 1, 1, 0, -1, 0, 0, -1}; // 表示四个方向 // grid 是地图,也就是一个二维数组 // visited标记访问过的节点,不要重复访问 // x,y 表示开始搜索节点的下标 From 4067790b7c74bcde83dd177ccc44687a87928218 Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Tue, 20 Dec 2022 16:32:29 +0800 Subject: [PATCH 1398/3019] =?UTF-8?q?update=200416.=E5=88=86=E5=89=B2?= =?UTF-8?q?=E7=AD=89=E5=92=8C=E5=AD=90=E9=9B=86=EF=BC=9A=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E6=96=87=E6=9C=AC=E9=94=99=E5=AD=97=EF=BC=8C=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E5=85=B6=E4=BB=96=E8=AF=AD=E8=A8=80=E5=86=97=E4=BD=99=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...11\345\222\214\345\255\220\351\233\206.md" | 100 ++---------------- 1 file changed, 11 insertions(+), 89 deletions(-) diff --git "a/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" "b/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" index 52b4826410..ecee1d83fe 100644 --- "a/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" +++ "b/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" @@ -32,7 +32,7 @@ ## 思路 -这道题目初步看,是如下两题几乎是一样的,大家可以用回溯法,解决如下两题 +这道题目初步看,和如下两题几乎是一样的,大家可以用回溯法,解决如下两题 * 698.划分为k个相等的子集 * 473.火柴拼正方形 @@ -62,7 +62,7 @@ 回归主题:首先,本题要求集合里能否出现总和为 sum / 2 的子集。 -那么来一一对应一下本题,看看背包问题如果来解决。 +那么来一一对应一下本题,看看背包问题如何来解决。 **只有确定了如下四点,才能把01背包问题套到本题上来。** @@ -77,9 +77,9 @@ 1. 确定dp数组以及下标的含义 -01背包中,dp[j] 表示: 容量为j的背包,所背的物品价值可以最大为dp[j]。 +01背包中,dp[j] 表示: 容量为j的背包,所背的物品价值最大可以为dp[j]。 -本题中每一个元素的数值即是重量,也是价值。 +本题中每一个元素的数值既是重量,也是价值。 **套到本题,dp[j]表示 背包总容量(所能装的总重量)是j,放进物品后,背的最大重量为dp[j]**。 @@ -106,9 +106,9 @@ 从dp[j]的定义来看,首先dp[0]一定是0。 -如果如果题目给的价值都是正整数那么非0下标都初始化为0就可以了,如果题目给的价值有负数,那么非0下标就要初始化为负无穷。 +如果题目给的价值都是正整数那么非0下标都初始化为0就可以了,如果题目给的价值有负数,那么非0下标就要初始化为负无穷。 -**这样才能让dp数组在递归公式的过程中取的最大的价值,而不是被初始值覆盖了**。 +**这样才能让dp数组在递推的过程中取得最大的价值,而不是被初始值覆盖了**。 本题题目中 只包含正整数的非空数组,所以非0下标的元素初始化为0就可以了。 @@ -202,15 +202,15 @@ class Solution { if(nums == null || nums.length == 0) return false; int n = nums.length; int sum = 0; - for(int num : nums){ + for(int num : nums) { sum += num; } //总和为奇数,不能平分 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--){ + 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]); } @@ -220,6 +220,7 @@ class Solution { } ``` +二维数组版本(易于理解): ```java public class Solution { public static void main(String[] args) { @@ -288,46 +289,6 @@ false true false false false true true false false false false true false true false false false true true false false false true true ``` - -二维数组版本(易于理解): -```Java -class Solution { - public boolean canPartition(int[] nums) { - int sum = 0; - for (int i = 0; i < nums.length; i++) { - sum += nums[i]; - } - - if (sum % 2 == 1) - return false; - int target = sum / 2; - - //dp[i][j]代表可装物品为0-i,背包容量为j的情况下,背包内容量的最大价值 - int[][] dp = new int[nums.length][target + 1]; - - //初始化,dp[0][j]的最大价值nums[0](if j > weight[i]) - //dp[i][0]均为0,不用初始化 - for (int j = nums[0]; j <= target; j++) { - dp[0][j] = nums[0]; - } - - //遍历物品,遍历背包 - //递推公式: - for (int i = 1; i < nums.length; i++) { - for (int j = 0; j <= target; j++) { - //背包容量可以容纳nums[i] - if (j >= nums[i]) { - dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - nums[i]] + nums[i]); - } else { - dp[i][j] = dp[i - 1][j]; - } - } - } - - return dp[nums.length - 1][target] == target; - } -} -``` ### Python: ```python class Solution: @@ -341,6 +302,7 @@ class Solution: dp[j] = max(dp[j], dp[j - nums[i]] + nums[i]) return target == dp[target] ``` + ### Go: ```go // 分割等和子集 动态规划 @@ -369,46 +331,6 @@ func canPartition(nums []int) bool { } ``` -```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: ```js From 02a01bb3aa5719634beecb1ee8a388e9d6055e03 Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Tue, 20 Dec 2022 23:23:32 +0800 Subject: [PATCH 1399/3019] =?UTF-8?q?update=200494.=E7=9B=AE=E6=A0=87?= =?UTF-8?q?=E5=92=8C:=20=E4=BF=AE=E6=94=B9=E6=96=87=E6=9C=AC=E9=94=99?= =?UTF-8?q?=E5=AD=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0494.\347\233\256\346\240\207\345\222\214.md" | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git "a/problems/0494.\347\233\256\346\240\207\345\222\214.md" "b/problems/0494.\347\233\256\346\240\207\345\222\214.md" index 946e52f2aa..6c8c28ec83 100644 --- "a/problems/0494.\347\233\256\346\240\207\345\222\214.md" +++ "b/problems/0494.\347\233\256\346\240\207\345\222\214.md" @@ -123,7 +123,7 @@ public: x = (target + sum) / 2 -**此时问题就转化为,装满容量为x背包,有几种方法**。 +**此时问题就转化为,装满容量为x的背包,有几种方法**。 这里的x,就是bagSize,也就是我们后面要求的背包容量。 @@ -184,11 +184,11 @@ dp[j] += dp[j - nums[i]] 3. dp数组如何初始化 -从递归公式可以看出,在初始化的时候dp[0] 一定要初始化为1,因为dp[0]是在公式中一切递推结果的起源,如果dp[0]是0的话,递归结果将都是0。 +从递推公式可以看出,在初始化的时候dp[0] 一定要初始化为1,因为dp[0]是在公式中一切递推结果的起源,如果dp[0]是0的话,递推结果将都是0。 这里有录友可能认为从dp数组定义来说 dp[0] 应该是0,也有录友认为dp[0]应该是1。 -其实不要硬去解释它的含义,咱就把 dp[0]的情况带入本题看看就是应该等于多少。 +其实不要硬去解释它的含义,咱就把 dp[0]的情况带入本题看看应该等于多少。 如果数组[0] ,target = 0,那么 bagSize = (target + sum) / 2 = 0。 dp[0]也应该是1, 也就是说给数组里的元素 0 前面无论放加法还是减法,都是 1 种方法。 @@ -198,7 +198,7 @@ dp[j] += dp[j - nums[i]] 其实 此时最终的dp[0] = 32,也就是这五个零 子集的所有组合情况,但此dp[0]非彼dp[0],dp[0]能算出32,其基础是因为dp[0] = 1 累加起来的。 -dp[j]其他下标对应的数值也应该初始化为0,从递归公式也可以看出,dp[j]要保证是0的初始值,才能正确的由dp[j - nums[i]]推导出来。 +dp[j]其他下标对应的数值也应该初始化为0,从递推公式也可以看出,dp[j]要保证是0的初始值,才能正确的由dp[j - nums[i]]推导出来。 4. 确定遍历顺序 @@ -245,7 +245,7 @@ public: ## 总结 -此时 大家应该不仅想起,我们之前讲过的[回溯算法:39. 组合总和](https://programmercarl.com/0039.组合总和.html)是不是应该也可以用dp来做啊? +此时 大家应该不禁想起,我们之前讲过的[回溯算法:39. 组合总和](https://programmercarl.com/0039.组合总和.html)是不是应该也可以用dp来做啊? 是的,如果仅仅是求个数的话,就可以用dp,但[回溯算法:39. 组合总和](https://programmercarl.com/0039.组合总和.html)要求的是把所有组合列出来,还是要使用回溯法爆搜的。 From df5efcd1b1ac2eda08c4b44a17a5facd98d03c63 Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Wed, 21 Dec 2022 14:00:11 +0800 Subject: [PATCH 1400/3019] =?UTF-8?q?update=200474.=E4=B8=80=E5=92=8C?= =?UTF-8?q?=E9=9B=B6:=20=E4=BC=98=E5=8C=96=E6=96=87=E6=9C=AC=EF=BC=8C?= =?UTF-8?q?=E5=88=A0=E9=99=A4=E5=86=97=E4=BD=99=E7=9A=84=20go=20=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...4.\344\270\200\345\222\214\351\233\266.md" | 53 ++----------------- 1 file changed, 3 insertions(+), 50 deletions(-) diff --git "a/problems/0474.\344\270\200\345\222\214\351\233\266.md" "b/problems/0474.\344\270\200\345\222\214\351\233\266.md" index 45a0a27035..213a2aa2c7 100644 --- "a/problems/0474.\344\270\200\345\222\214\351\233\266.md" +++ "b/problems/0474.\344\270\200\345\222\214\351\233\266.md" @@ -59,7 +59,7 @@ 但本题其实是01背包问题! -这不过这个背包有两个维度,一个是m 一个是n,而不同长度的字符串就是不同大小的待装物品。 +只不过这个背包有两个维度,一个是m 一个是n,而不同长度的字符串就是不同大小的待装物品。 开始动规五部曲: @@ -114,7 +114,7 @@ for (string str : strs) { // 遍历物品 有同学可能想,那个遍历背包容量的两层for循环先后循序有没有什么讲究? -没讲究,都是物品重量的一个维度,先遍历那个都行! +没讲究,都是物品重量的一个维度,先遍历哪个都行! 5. 举例推导dp数组 @@ -152,7 +152,7 @@ public: ## 总结 -不少同学刷过这道提,可能没有总结这究竟是什么背包。 +不少同学刷过这道题,可能没有总结这究竟是什么背包。 此时我们讲解了0-1背包的多种应用, @@ -252,53 +252,6 @@ 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 36bdccd6878d0b54338741d699a4d7829318d1c1 Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Wed, 21 Dec 2022 17:17:59 +0800 Subject: [PATCH 1401/3019] =?UTF-8?q?update=200279.=E5=AE=8C=E5=85=A8?= =?UTF-8?q?=E5=B9=B3=E6=96=B9=E6=95=B0:=20=E5=88=A0=E9=99=A4=E5=86=97?= =?UTF-8?q?=E4=BD=99=20python=20=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...50\345\271\263\346\226\271\346\225\260.md" | 37 ------------------- 1 file changed, 37 deletions(-) diff --git "a/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" "b/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" index 50ddf5f94d..b6a97be3ff 100644 --- "a/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" +++ "b/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" @@ -235,43 +235,6 @@ class Solution: return dp[n] ``` -Python3: -```python -class Solution: - '''版本一,先遍历背包, 再遍历物品''' - def numSquares(self, n: int) -> int: - dp = [n] * (n + 1) - dp[0] = 0 - # 遍历背包 - for j in range(1, n+1): - for i in range(1, n): - num = i ** 2 - if num > j: break - # 遍历物品 - if j - num >= 0: - dp[j] = min(dp[j], dp[j - num] + 1) - return dp[n] - -class Solution: - '''版本二, 先遍历物品, 再遍历背包''' - def numSquares(self, n: int) -> int: - # 初始化 - # 组成和的完全平方数的最多个数,就是只用1构成 - # 因此,dp[i] = i - dp = [i for i in range(n + 1)] - # dp[0] = 0 无意义,只是为了方便记录特殊情况: - # n本身就是完全平方数,dp[n] = min(dp[n], dp[n - n] + 1) = 1 - - for i in range(1, n): # 遍历物品 - if i * i > n: - break - num = i * i - for j in range(num, n + 1): # 遍历背包 - dp[j] = min(dp[j], dp[j - num] + 1) - - return dp[n] -``` - Go: ```go // 版本一,先遍历物品, 再遍历背包 From d178871e8329d89fc98e7661a92bf928d6ee10af Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Fri, 23 Dec 2022 01:16:10 +0800 Subject: [PATCH 1402/3019] =?UTF-8?q?update=200139.=E5=8D=95=E8=AF=8D?= =?UTF-8?q?=E6=8B=86=E5=88=86=EF=BC=9A=E4=BC=98=E5=8C=96=E6=96=87=E6=9C=AC?= =?UTF-8?q?=20=E5=92=8C=20go=20=E4=BB=A3=E7=A0=81=E9=A3=8E=E6=A0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...25\350\257\215\346\213\206\345\210\206.md" | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git "a/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" "b/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" index f06bd40c2b..f76d807528 100644 --- "a/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" +++ "b/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" @@ -138,7 +138,7 @@ public: 3. dp数组如何初始化 -从递归公式中可以看出,dp[i] 的状态依靠 dp[j]是否为true,那么dp[0]就是递归的根基,dp[0]一定要为true,否则递归下去后面都都是false了。 +从递推公式中可以看出,dp[i] 的状态依靠 dp[j]是否为true,那么dp[0]就是递推的根基,dp[0]一定要为true,否则递推下去后面都都是false了。 那么dp[0]有没有意义呢? @@ -152,13 +152,13 @@ dp[0]表示如果字符串为空的话,说明出现在字典里。 题目中说是拆分为一个或多个在字典中出现的单词,所以这是完全背包。 -还要讨论两层for循环的前后循序。 +还要讨论两层for循环的前后顺序。 **如果求组合数就是外层for循环遍历物品,内层for遍历背包**。 **如果求排列数就是外层for遍历背包,内层for循环遍历物品**。 -我在这里做一个一个总结: +我在这里做一个总结: 求组合数:[动态规划:518.零钱兑换II](https://programmercarl.com/0518.零钱兑换II.html) 求排列数:[动态规划:377. 组合总和 Ⅳ](https://programmercarl.com/0377.组合总和.html)、[动态规划:70. 爬楼梯进阶版(完全背包)](https://programmercarl.com/0070.爬楼梯完全背包版本.html) @@ -170,7 +170,7 @@ dp[0]表示如果字符串为空的话,说明出现在字典里。 "apple" + "apple" + "pen" 或者 "pen" + "apple" + "apple" 是不可以的,那么我们就是强调物品之间顺序。 -所以说,本题一定是 先遍历 背包,在遍历物品。 +所以说,本题一定是 先遍历 背包,再遍历物品。 5. 举例推导dp[i] @@ -209,7 +209,7 @@ public: 关于遍历顺序,再给大家讲一下为什么 先遍历物品再遍历背包不行。 -这里可以给出先遍历物品在遍历背包的代码: +这里可以给出先遍历物品再遍历背包的代码: ```CPP class Solution { @@ -241,7 +241,7 @@ public: 最后dp[s.size()] = 0 即 dp[13] = 0 ,而不是1,因为先用 "apple" 去遍历的时候,dp[8]并没有被赋值为1 (还没用"pen"),所以 dp[13]也不能变成1。 -除非是先用 "apple" 遍历一遍,在用 "pen" 遍历,此时 dp[8]已经是1,最后再用 "apple" 去遍历,dp[13]才能是1。 +除非是先用 "apple" 遍历一遍,再用 "pen" 遍历,此时 dp[8]已经是1,最后再用 "apple" 去遍历,dp[13]才能是1。 如果大家对这里不理解,建议可以把我上面给的代码,拿去力扣上跑一跑,把dp数组打印出来,对着递推公式一步一步去看,思路就清晰了。 @@ -352,16 +352,16 @@ class Solution: Go: ```Go func wordBreak(s string,wordDict []string) bool { - wordDictSet:=make(map[string]bool) - for _,w:=range wordDict{ - wordDictSet[w]=true + wordDictSet := make(map[string]bool) + for _, w := range wordDict { + wordDictSet[w] = true } - dp:=make([]bool,len(s)+1) - dp[0]=true - for i:=1;i<=len(s);i++{ - for j:=0;j Date: Fri, 23 Dec 2022 09:52:39 +0800 Subject: [PATCH 1403/3019] Update --- ...227\346\257\215\347\273\204\345\220\210.md" | 9 +++++++-- ...204\345\220\210\346\200\273\345\222\214.md" | 14 ++++++++------ ...201\350\247\204\345\210\222\357\274\211.md" | 2 +- ...204\345\255\220\345\272\217\345\210\227.md" | 18 ++++++++++++++---- ...\345\220\210\346\200\273\345\222\214III.md" | 4 ++++ ...255\345\255\220\345\272\217\345\210\227.md" | 15 ++++++++++----- 6 files changed, 44 insertions(+), 18 deletions(-) diff --git "a/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" "b/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" index 12a45a61ab..b84d1d3c7c 100644 --- "a/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" +++ "b/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" @@ -16,11 +16,16 @@ ![17.电话号码的字母组合](https://img-blog.csdnimg.cn/2020102916424043.png) 示例: -输入:"23" -输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"]. +* 输入:"23" +* 输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"]. 说明:尽管上面的答案是按字典序排列的,但是你可以任意选择答案输出的顺序。 +# 算法公开课 + +**《代码随想录》算法视频公开课:[还得用回溯算法!| LeetCode:17.电话号码的字母组合](https://www.bilibili.com/video/BV1yV4y1V7Ug),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 + + # 思路 从示例上来说,输入"23",最直接的想法就是两层for循环遍历了吧,正好把组合的情况都输出了。 diff --git "a/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" "b/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" index 5244a1d6e8..a3c62c53dd 100644 --- "a/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" +++ "b/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" @@ -19,25 +19,27 @@ candidates 中的数字可以无限制重复被选取。 * 解集不能包含重复的组合。  示例 1: -输入:candidates = [2,3,6,7], target = 7, -所求解集为: +* 输入:candidates = [2,3,6,7], target = 7, +* 所求解集为: [ [7], [2,2,3] ] 示例 2: -输入:candidates = [2,3,5], target = 8, -所求解集为: +* 输入:candidates = [2,3,5], target = 8, +* 所求解集为: [   [2,2,2,2],   [2,3,3],   [3,5] ] -# 思路 +# 算法公开课 -[B站视频讲解-组合总和](https://www.bilibili.com/video/BV1KT4y1M7HJ) +**《代码随想录》算法视频公开课:[Leetcode:39. 组合总和讲解](https://www.bilibili.com/video/BV1KT4y1M7HJ),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 + +# 思路 题目中的**无限制重复被选取,吓得我赶紧想想 出现0 可咋办**,然后看到下面提示:1 <= candidates[i] <= 200,我就放心了。 diff --git "a/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" "b/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" index e222a3c47a..506c000fd2 100644 --- "a/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" +++ "b/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" @@ -25,7 +25,7 @@ 1. 确定dp数组(dp table)以及下标的含义 -**dp[i]:包括下标i之前的最大连续子序列和为dp[i]**。 +**dp[i]:包括下标i(以nums[i]为结尾)的最大连续子序列和为dp[i]**。 2. 确定递推公式 diff --git "a/problems/0115.\344\270\215\345\220\214\347\232\204\345\255\220\345\272\217\345\210\227.md" "b/problems/0115.\344\270\215\345\220\214\347\232\204\345\255\220\345\272\217\345\210\227.md" index f4893fe0f2..daa708bc84 100644 --- "a/problems/0115.\344\270\215\345\220\214\347\232\204\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0115.\344\270\215\345\220\214\347\232\204\345\255\220\345\272\217\345\210\227.md" @@ -33,6 +33,8 @@ s 和 t 由英文字母组成 dp[i][j]:以i-1为结尾的s子序列中出现以j-1为结尾的t的个数为dp[i][j]。 +为什么i-1,j-1 这么定义我在 [718. 最长重复子数组](https://programmercarl.com/0718.最长重复子数组.html) 中做了详细的讲解。 + 2. 确定递推公式 这一类问题,基本是要分析两种情况 @@ -42,11 +44,11 @@ dp[i][j]:以i-1为结尾的s子序列中出现以j-1为结尾的t的个数为d 当s[i - 1] 与 t[j - 1]相等时,dp[i][j]可以有两部分组成。 -一部分是用s[i - 1]来匹配,那么个数为dp[i - 1][j - 1]。 +一部分是用s[i - 1]来匹配,那么个数为dp[i - 1][j - 1]。即不需要考虑当前s子串和t子串的最后一位字母,所以只需要 dp[i-1][j-1]。 一部分是不用s[i - 1]来匹配,个数为dp[i - 1][j]。 -这里可能有同学不明白了,为什么还要考虑 不用s[i - 1]来匹配,都相同了指定要匹配啊。 +**这里可能有录友不明白了,为什么还要考虑 不用s[i - 1]来匹配,都相同了指定要匹配啊**。 例如: s:bagg 和 t:bag ,s[3] 和 t[2]是相同的,但是字符串s也可以不用s[3]来匹配,即用s[0]s[1]s[2]组成的bag。 @@ -54,13 +56,19 @@ dp[i][j]:以i-1为结尾的s子序列中出现以j-1为结尾的t的个数为d 所以当s[i - 1] 与 t[j - 1]相等时,dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j]; -当s[i - 1] 与 t[j - 1]不相等时,dp[i][j]只有一部分组成,不用s[i - 1]来匹配,即:dp[i - 1][j] +当s[i - 1] 与 t[j - 1]不相等时,dp[i][j]只有一部分组成,不用s[i - 1]来匹配(就是模拟在s中删除这个元素),即:dp[i - 1][j] 所以递推公式为:dp[i][j] = dp[i - 1][j]; +这里可能有录友还疑惑,为什么只考虑 “不用s[i - 1]来匹配” 这种情况, 不考虑 “不用t[j - 1]来匹配” 的情况呢。 + +这里大家要明确,我们求的是 s 中有多少个 t,而不是 求t中有多少个s,所以只考虑 s中删除元素的情况,即 不用s[i - 1]来匹配 的情况。 + 3. dp数组如何初始化 -从递推公式dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j]; 和 dp[i][j] = dp[i - 1][j]; 中可以看出dp[i][0] 和dp[0][j]是一定要初始化的。 +从递推公式dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j]; 和 dp[i][j] = dp[i - 1][j]; 中可以看出dp[i][j] 是从上方和左上方推导而来,如图:,那么 dp[i][0] 和dp[0][j]是一定要初始化的。 + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20221222165412.png) 每次当初始化的时候,都要回顾一下dp[i][j]的定义,不要凭感觉初始化。 @@ -91,6 +99,8 @@ for (int j = 1; j <= t.size(); j++) dp[0][j] = 0; // 其实这行代码可以和 从递推公式dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j]; 和 dp[i][j] = dp[i - 1][j]; 中可以看出dp[i][j]都是根据左上方和正上方推出来的。 +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20221222165412.png) + 所以遍历的时候一定是从上到下,从左到右,这样保证dp[i][j]可以根据之前计算出来的数值进行计算。 代码如下: diff --git "a/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" "b/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" index 19fe1eb99a..a218fb466c 100644 --- "a/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" +++ "b/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" @@ -27,6 +27,10 @@ 输入: k = 3, n = 9 输出: [[1,2,6], [1,3,5], [2,3,4]] +# 算法公开课 + +**《代码随想录》算法视频公开课:[和组合问题有啥区别?回溯算法如何剪枝?| LeetCode:216.组合总和III](https://www.bilibili.com/video/BV1wg411873x),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 + # 思路 diff --git "a/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" "b/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" index 1a0d4f8b10..03c1baae63 100644 --- "a/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" @@ -31,11 +31,11 @@ ## 思路 -(这道题可以用双指针的思路来实现,时间复杂度就是O(n)) +(这道题也可以用双指针的思路来实现,时间复杂度也是O(n)) 这道题应该算是编辑距离的入门题目,因为从题意中我们也可以发现,只需要计算删除的情况,不用考虑增加和替换的情况。 -**所以掌握本题也是对后面要讲解的编辑距离的题目打下基础**。 +**所以掌握本题的动态规划解法是对后面要讲解的编辑距离的题目打下基础**。 动态规划五部曲分析如下: @@ -47,7 +47,9 @@ 有同学问了,为啥要表示下标i-1为结尾的字符串呢,为啥不表示下标i为结尾的字符串呢? -用i来表示也可以! +为什么这么定义我在 [718. 最长重复子数组](https://programmercarl.com/0718.最长重复子数组.html) 中做了详细的讲解。 + +其实用i来表示也可以! 但我统一以下标i-1为结尾的字符串来计算,这样在下面的递归公式中会容易理解一些,如果还有疑惑,可以继续往下看。 @@ -64,6 +66,8 @@ if (s[i - 1] == t[j - 1]),那么dp[i][j] = dp[i - 1][j - 1] + 1;,因为找 if (s[i - 1] != t[j - 1]),此时相当于t要删除元素,t如果把当前元素t[j - 1]删除,那么dp[i][j] 的数值就是 看s[i - 1]与 t[j - 2]的比较结果了,即:dp[i][j] = dp[i][j - 1]; +其实这里 大家可以发现和 [1143.最长公共子序列](https://programmercarl.com/1143.最长公共子序列.html) 的递推公式基本那就是一样的,区别就是 本题 如果删元素一定是字符串t,而 1143.最长公共子序列 是两个字符串都可以删元素。 + 3. dp数组如何初始化 @@ -79,7 +83,6 @@ if (s[i - 1] != t[j - 1]),此时相当于t要删除元素,t如果把当前 dp[i][0] 表示以下标i-1为结尾的字符串,与空字符串的相同子序列长度,所以为0. dp[0][j]同理。 -**其实这里只初始化dp[i][0]就够了,但一起初始化也方便,所以就一起操作了**,代码如下: ```CPP vector> dp(s.size() + 1, vector(t.size() + 1, 0)); @@ -127,10 +130,12 @@ public: ## 总结 -这道题目算是编辑距离的入门题目(毕竟这里只是涉及到减法),也是动态规划解决的经典题型。 +这道题目算是编辑距离的入门题目(毕竟这里只是涉及到减法),也是动态规划解决的经典题型。 这一类题都是题目读上去感觉很复杂,模拟一下也发现很复杂,用动规分析完了也感觉很复杂,但是最终代码却很简短。 +在之前的题目讲解中,我们讲了 [1143.最长公共子序列](https://programmercarl.com/1143.最长公共子序列.html),大家会发现 本题和 1143.最长公共子序列 的相似之处。 + 编辑距离的题目最能体现出动规精髓和巧妙之处,大家可以好好体会一下。 From 86a3d6e01c9ea59914c3c213d2b879945d12272e Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Sat, 24 Dec 2022 17:37:56 +0800 Subject: [PATCH 1404/3019] =?UTF-8?q?update=200198.=E6=89=93=E5=AE=B6?= =?UTF-8?q?=E5=8A=AB=E8=88=8D:=20=E6=9B=B4=E6=96=B0=20go=20=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...23\345\256\266\345\212\253\350\210\215.md" | 33 +++++++------------ 1 file changed, 12 insertions(+), 21 deletions(-) diff --git "a/problems/0198.\346\211\223\345\256\266\345\212\253\350\210\215.md" "b/problems/0198.\346\211\223\345\256\266\345\212\253\350\210\215.md" index 1e48f007ec..6002cd3a48 100644 --- "a/problems/0198.\346\211\223\345\256\266\345\212\253\350\210\215.md" +++ "b/problems/0198.\346\211\223\345\256\266\345\212\253\350\210\215.md" @@ -52,7 +52,7 @@ 如果偷第i房间,那么dp[i] = dp[i - 2] + nums[i] ,即:第i-1房一定是不考虑的,找出 下标i-2(包括i-2)以内的房屋,最多可以偷窃的金额为dp[i-2] 加上第i房间偷到的钱。 -如果不偷第i房间,那么dp[i] = dp[i - 1],即考虑i-1房,(**注意这里是考虑,并不是一定要偷i-1房,这是很多同学容易混淆的点**) +如果不偷第i房间,那么dp[i] = dp[i - 1],即考 虑i-1房,(**注意这里是考虑,并不是一定要偷i-1房,这是很多同学容易混淆的点**) 然后dp[i]取最大值,即dp[i] = max(dp[i - 2] + nums[i], dp[i - 1]); @@ -154,29 +154,20 @@ class Solution: Go: ```Go func rob(nums []int) int { - if len(nums)<1{ - return 0 - } - if len(nums)==1{ - return nums[0] - } - if len(nums)==2{ - return max(nums[0],nums[1]) - } - dp :=make([]int,len(nums)) - dp[0]=nums[0] - dp[1]=max(nums[0],nums[1]) - for i:=2;ib{ - return a - } - return b + if a > b { + return a + } + return b } ``` From e39209e3d7a55cd36812e8b6042f802e1e03bdde Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Sat, 24 Dec 2022 17:41:56 +0800 Subject: [PATCH 1405/3019] =?UTF-8?q?update=200213.=E6=89=93=E5=AE=B6?= =?UTF-8?q?=E5=8A=AB=E8=88=8DII:=20=E8=B0=83=E6=8D=A2=E5=85=B6=E4=BB=96?= =?UTF-8?q?=E8=AF=AD=E8=A8=80=E4=B8=AD=20go=20=E4=BB=A3=E7=A0=81=E7=9A=84?= =?UTF-8?q?=E9=A1=BA=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\345\256\266\345\212\253\350\210\215II.md" | 76 +++++++++---------- 1 file changed, 38 insertions(+), 38 deletions(-) diff --git "a/problems/0213.\346\211\223\345\256\266\345\212\253\350\210\215II.md" "b/problems/0213.\346\211\223\345\256\266\345\212\253\350\210\215II.md" index 8e1ca12647..dd109f838e 100644 --- "a/problems/0213.\346\211\223\345\256\266\345\212\253\350\210\215II.md" +++ "b/problems/0213.\346\211\223\345\256\266\345\212\253\350\210\215II.md" @@ -143,6 +143,44 @@ class Solution: return dp[-1] ``` +Go: + +```go +// 打家劫舍Ⅱ 动态规划 +// 时间复杂度O(n) 空间复杂度O(n) +func rob(nums []int) int { + if len(nums) == 1 { + return nums[0] + } + if len(nums) == 2 { + return max(nums[0], nums[1]) + } + + result1 := robRange(nums, 0) + result2 := robRange(nums, 1) + return max(result1, result2) +} + +// 偷盗指定的范围 +func robRange(nums []int, start int) int { + dp := make([]int, len(nums)) + dp[1] = nums[start] + + for i := 2; i < len(nums); i++ { + dp[i] = max(dp[i - 2] + nums[i - 1 + start], dp[i - 1]) + } + + return dp[len(nums) - 1] +} + +func max(a, b int) int { + if a > b { + return a + } + return b +} +``` + javascipt: ```javascript var rob = function(nums) { @@ -187,44 +225,6 @@ function robRange(nums: number[], start: number, end: number): number { } ``` -Go: - -```go -// 打家劫舍Ⅱ 动态规划 -// 时间复杂度O(n) 空间复杂度O(n) -func rob(nums []int) int { - if len(nums) == 1 { - return nums[0] - } - if len(nums) == 2 { - return max(nums[0], nums[1]) - } - - result1 := robRange(nums, 0) - result2 := robRange(nums, 1) - return max(result1, result2) -} - -// 偷盗指定的范围 -func robRange(nums []int, start int) int { - dp := make([]int, len(nums)) - dp[1] = nums[start] - - for i := 2; i < len(nums); i++ { - dp[i] = max(dp[i - 2] + nums[i - 1 + start], dp[i - 1]) - } - - return dp[len(nums) - 1] -} - -func max(a, b int) int { - if a > b { - return a - } - return b -} -``` -

From a9034c491081324e49edd160184e3c99ef91dd54 Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Sat, 24 Dec 2022 17:54:59 +0800 Subject: [PATCH 1406/3019] =?UTF-8?q?update=200337.=E6=89=93=E5=AE=B6?= =?UTF-8?q?=E5=8A=AB=E8=88=8DIII=EF=BC=9A=E5=88=A0=E9=99=A4=E5=86=97?= =?UTF-8?q?=E4=BD=99=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...345\256\266\345\212\253\350\210\215III.md" | 35 ++----------------- 1 file changed, 2 insertions(+), 33 deletions(-) diff --git "a/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" "b/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" index c69279fdca..ba9a2e59af 100644 --- "a/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" +++ "b/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" @@ -129,7 +129,7 @@ if (cur == NULL) return vector{0, 0}; 3. 确定遍历顺序 -首先明确的是使用后序遍历。 因为通过递归函数的返回值来做下一步计算。 +首先明确的是使用后序遍历。 因为要通过递归函数的返回值来做下一步计算。 通过递归左节点,得到左节点偷与不偷的金钱。 @@ -147,7 +147,7 @@ vector right = robTree(cur->right); // 右 4. 确定单层递归的逻辑 -如果是偷当前节点,那么左右孩子就不能偷,val1 = cur->val + left[0] + right[0]; (**如果对下标含义不理解就在回顾一下dp数组的含义**) +如果是偷当前节点,那么左右孩子就不能偷,val1 = cur->val + left[0] + right[0]; (**如果对下标含义不理解就再回顾一下dp数组的含义**) 如果不偷当前节点,那么左右孩子就可以偷,至于到底偷不偷一定是选一个最大的,所以:val2 = max(left[0], left[1]) + max(right[0], right[1]); @@ -483,37 +483,6 @@ function robNode(node: TreeNode | null): MaxValueArr { } ``` -### Go - -```go -// 打家劫舍Ⅲ 动态规划 -// 时间复杂度O(n) 空间复杂度O(logn) -func rob(root *TreeNode) int { - dp := traversal(root) - return max(dp[0], dp[1]) -} - -func traversal(cur *TreeNode) []int { - if cur == nil { - return []int{0, 0} - } - - dpL := traversal(cur.Left) - dpR := traversal(cur.Right) - - val1 := cur.Val + dpL[0] + dpR[0] // 偷盗当前节点 - val2 := max(dpL[0], dpL[1]) + max(dpR[0], dpR[1]) // 不偷盗当前节点 - return []int{val2, val1} -} - -func max(a, b int) int { - if a > b { - return a - } - return b -} -``` -

From c94a8a951a5dbddce848b8517d362c2eb041bd19 Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Sat, 24 Dec 2022 20:04:07 +0800 Subject: [PATCH 1407/3019] =?UTF-8?q?update=200121.=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?=EF=BC=9A=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81=E9=A3=8E=E6=A0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...00\344\275\263\346\227\266\346\234\272.md" | 67 ++++++++----------- 1 file changed, 27 insertions(+), 40 deletions(-) diff --git "a/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" "b/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" index 915b178aab..8736c9f375 100644 --- "a/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" +++ "b/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" @@ -89,7 +89,7 @@ dp[i][1] 表示第i天不持有股票所得最多现金 **注意这里说的是“持有”,“持有”不代表就是当天“买入”!也有可能是昨天就买入了,今天保持持有的状态** -很多同学把“持有”和“买入”没分区分清楚。 +很多同学把“持有”和“买入”没区分清楚。 在下面递推公式分析中,我会进一步讲解。 @@ -103,11 +103,11 @@ dp[i][1] 表示第i天不持有股票所得最多现金 如果第i天不持有股票即dp[i][1], 也可以由两个状态推出来 * 第i-1天就不持有股票,那么就保持现状,所得现金就是昨天不持有股票的所得现金 即:dp[i - 1][1] -* 第i天卖出股票,所得现金就是按照今天股票佳价格卖出后所得现金即:prices[i] + dp[i - 1][0] +* 第i天卖出股票,所得现金就是按照今天股票价格卖出后所得现金即:prices[i] + dp[i - 1][0] 同样dp[i][1]取最大的,dp[i][1] = max(dp[i - 1][1], prices[i] + dp[i - 1][0]); -这样递归公式我们就分析完了 +这样递推公式我们就分析完了 3. dp数组如何初始化 @@ -121,7 +121,7 @@ dp[0][1]表示第0天不持有股票,不持有股票那么现金就是0,所 4. 确定遍历顺序 -从递推公式可以看出dp[i]都是有dp[i - 1]推导出来的,那么一定是从前向后遍历。 +从递推公式可以看出dp[i]都是由dp[i - 1]推导出来的,那么一定是从前向后遍历。 5. 举例推导dp数组 @@ -326,53 +326,40 @@ Go: > 贪心法: ```Go func maxProfit(prices []int) int { - low := math.MaxInt32 - rlt := 0 - for i := range prices{ - low = min(low, prices[i]) - rlt = max(rlt, prices[i]-low) - } - - return rlt -} -func min(a, b int) int { - if a < b{ - return a - } - - return b -} - -func max(a, b int) int { - if a > b{ - return a + min := prices[0] + res := 0 + for i := 1; i < len(prices); i++ { + if prices[i] - min > res { + res = prices[i]-min + } + if min > prices[i] { + min = prices[i] + } } - - return b + return res } ``` > 动态规划:版本一 ```Go func maxProfit(prices []int) int { - length:=len(prices) - if length==0{return 0} - dp:=make([][]int,length) - for i:=0;ib{ +func max(a, b int) int { + if a > b { return a } return b @@ -385,7 +372,7 @@ func maxProfit(prices []int) int { dp := [2][2]int{} dp[0][0] = -prices[0] dp[0][1] = 0 - for i := 1; i < len(prices); i++{ + for i := 1; i < len(prices); i++ { dp[i%2][0] = max(dp[(i-1)%2][0], -prices[i]) dp[i%2][1] = max(dp[(i-1)%2][1], dp[(i-1)%2][0]+prices[i]) } From 18e062c3e6b8cc8b1f068ca74b61a9ba42432392 Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Sat, 24 Dec 2022 20:19:05 +0800 Subject: [PATCH 1408/3019] =?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=EF=BC=88=E5=8A=A8=E6=80=81=E8=A7=84=E5=88=92=EF=BC=89?= =?UTF-8?q?=EF=BC=9A=E4=BF=AE=E6=94=B9=E9=94=99=E5=AD=97=E5=92=8C=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E5=86=97=E4=BD=99=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...01\350\247\204\345\210\222\357\274\211.md" | 31 +++---------------- 1 file changed, 4 insertions(+), 27 deletions(-) diff --git "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" index f2aec68b56..2779083d89 100644 --- "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" +++ "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" @@ -39,7 +39,7 @@ 本题我们在讲解贪心专题的时候就已经讲解过了[贪心算法:买卖股票的最佳时机II](https://programmercarl.com/0122.买卖股票的最佳时机II.html),只不过没有深入讲解动态规划的解法,那么这次我们再好好分析一下动规的解法。 -本题和[121. 买卖股票的最佳时机](https://programmercarl.com/0121.买卖股票的最佳时机.html)的唯一区别本题股票可以买卖多次了(注意只有一只股票,所以再次购买前要出售掉之前的股票) +本题和[121. 买卖股票的最佳时机](https://programmercarl.com/0121.买卖股票的最佳时机.html)的唯一区别是本题股票可以买卖多次了(注意只有一只股票,所以再次购买前要出售掉之前的股票) **在动规五部曲中,这个区别主要是体现在递推公式上,其他都和[121. 买卖股票的最佳时机](https://programmercarl.com/0121.买卖股票的最佳时机.html)一样一样的**。 @@ -63,9 +63,9 @@ 那么第i天持有股票即dp[i][0],如果是第i天买入股票,所得现金就是昨天不持有股票的所得现金 减去 今天的股票价格 即:dp[i - 1][1] - prices[i]。 -在来看看如果第i天不持有股票即dp[i][1]的情况, 依然可以由两个状态推出来 +再来看看如果第i天不持有股票即dp[i][1]的情况, 依然可以由两个状态推出来 * 第i-1天就不持有股票,那么就保持现状,所得现金就是昨天不持有股票的所得现金 即:dp[i - 1][1] -* 第i天卖出股票,所得现金就是按照今天股票佳价格卖出后所得现金即:prices[i] + dp[i - 1][0] +* 第i天卖出股票,所得现金就是按照今天股票价格卖出后所得现金即:prices[i] + dp[i - 1][0] **注意这里和[121. 买卖股票的最佳时机](https://programmercarl.com/0121.买卖股票的最佳时机.html)就是一样的逻辑,卖出股票收获利润(可能是负值)天经地义!** @@ -99,7 +99,7 @@ dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] - prices[i]); **这正是因为本题的股票可以买卖多次!** 所以买入股票的时候,可能会有之前买卖的利润即:dp[i - 1][1],所以dp[i - 1][1] - prices[i]。 -想到到这一点,对这两道题理解的比较深刻了。 +想到到这一点,对这两道题理解的就比较深刻了。 这里我依然给出滚动数组的版本,C++代码如下: @@ -228,29 +228,6 @@ func max(a, b int) int { } ``` -```go -func maxProfit(prices []int) int { - //创建数组 - dp:=make([][]int,len(prices)) - for i:=0;i Date: Sat, 24 Dec 2022 21:15:31 +0800 Subject: [PATCH 1409/3019] =?UTF-8?q?update=200123.=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?III=EF=BC=9A=E5=88=A0=E9=99=A4=E5=86=97=E4=BD=99=20go=20?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...344\275\263\346\227\266\346\234\272III.md" | 71 +++++-------------- 1 file changed, 19 insertions(+), 52 deletions(-) diff --git "a/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" "b/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" index 611bd2ce3f..d480da83c4 100644 --- "a/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" +++ "b/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" @@ -62,7 +62,7 @@ dp[i][j]中 i表示第i天,j为 [0 - 4] 五个状态,dp[i][j]表示第i天 需要注意:dp[i][1],**表示的是第i天,买入股票的状态,并不是说一定要第i天买入股票,这是很多同学容易陷入的误区**。 -例如 dp[i][1] ,并不是说 第i点一定买入股票,有可能 第 i-1天 就买入了,那么 dp[i][1] 延续买入股票的这个状态。 +例如 dp[i][1] ,并不是说 第i天一定买入股票,有可能 第 i-1天 就买入了,那么 dp[i][1] 延续买入股票的这个状态。 2. 确定递推公式 @@ -102,7 +102,7 @@ dp[i][4] = max(dp[i - 1][4], dp[i - 1][3] + prices[i]); 第0天第二次买入操作,初始值应该是多少呢?应该不少同学疑惑,第一次还没买入呢,怎么初始化第二次买入呢? -第二次买入依赖于第一次卖出的状态,其实相当于第0天第一次买入了,第一次卖出了,然后在买入一次(第二次买入),那么现在手头上没有现金,只要买入,现金就做相应的减少。 +第二次买入依赖于第一次卖出的状态,其实相当于第0天第一次买入了,第一次卖出了,然后再买入一次(第二次买入),那么现在手头上没有现金,只要买入,现金就做相应的减少。 所以第二次买入操作,初始化为:dp[0][3] = -prices[0]; @@ -181,7 +181,7 @@ public: dp[1] = max(dp[1], dp[0] - prices[i]); 如果dp[1]取dp[1],即保持买入股票的状态,那么 dp[2] = max(dp[2], dp[1] + prices[i]);中dp[1] + prices[i] 就是今天卖出。 -如果dp[1]取dp[0] - prices[i],今天买入股票,那么dp[2] = max(dp[2], dp[1] + prices[i]);中的dp[1] + prices[i]相当于是尽在再卖出股票,一买一卖收益为0,对所得现金没有影响。相当于今天买入股票又卖出股票,等于没有操作,保持昨天卖出股票的状态了。 +如果dp[1]取dp[0] - prices[i],今天买入股票,那么dp[2] = max(dp[2], dp[1] + prices[i]);中的dp[1] + prices[i]相当于是今天再卖出股票,一买一卖收益为0,对所得现金没有影响。相当于今天买入股票又卖出股票,等于没有操作,保持昨天卖出股票的状态了。 **这种写法看上去简单,其实思路很绕,不建议大家这么写,这么思考,很容易把自己绕进去!** @@ -312,26 +312,26 @@ Go: ```go func maxProfit(prices []int) int { - dp:=make([][]int,len(prices)) - for i:=0;ib{ +func max(a, b int) int { + if a > b { return a } return b @@ -407,39 +407,6 @@ function maxProfit(prices: number[]): number { }; ``` -Go: - -> 版本一: -```go -// 买卖股票的最佳时机III 动态规划 -// 时间复杂度O(n) 空间复杂度O(n) -func maxProfit(prices []int) int { - dp := make([][]int, len(prices)) - status := make([]int, len(prices) * 4) - for i := range dp { - dp[i] = status[:4] - status = status[4:] - } - dp[0][0], dp[0][2] = -prices[0], -prices[0] - - for i := 1; i < len(prices); i++ { - dp[i][0] = max(dp[i - 1][0], -prices[i]) - dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] + prices[i]) - dp[i][2] = max(dp[i - 1][2], dp[i - 1][1] - prices[i]) - dp[i][3] = max(dp[i - 1][3], dp[i - 1][2] + prices[i]) - } - - return dp[len(prices) - 1][3] -} - -func max(a, b int) int { - if a > b { - return a - } - return b -} -``` - From 78909ff5aac5594a8e8023c45fab1c53c61d6536 Mon Sep 17 00:00:00 2001 From: Re1own <0xzhzus@gmail.com> Date: Mon, 26 Dec 2022 00:29:02 -0500 Subject: [PATCH 1410/3019] =?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 结构体语法有错,中间有个free少了分号 --- ...\276\350\256\241\351\223\276\350\241\250.md" | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git "a/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" "b/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" index 614bb36efa..dd305d390d 100644 --- "a/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" +++ "b/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" @@ -157,7 +157,7 @@ private: ## 其他语言版本 C: ```C -typedef struct { +typedef struct MyLinkedList { int val; struct MyLinkedList* next; }MyLinkedList; @@ -233,7 +233,7 @@ void myLinkedListDeleteAtIndex(MyLinkedList* obj, int index) { MyLinkedList *tmp = obj->next; if (tmp != NULL){ obj->next = tmp->next; - free(tmp) + free(tmp); } return; } @@ -263,20 +263,21 @@ void myLinkedListFree(MyLinkedList* obj) { } /** + * Your MyLinkedList struct will be instantiated and called as such: * MyLinkedList* obj = myLinkedListCreate(); * int param_1 = myLinkedListGet(obj, index); - + * myLinkedListAddAtHead(obj, val); - + * myLinkedListAddAtTail(obj, val); - + * myLinkedListAddAtIndex(obj, index, val); - + * myLinkedListDeleteAtIndex(obj, index); - + * myLinkedListFree(obj); -*/ + */ ``` Java: From 44fcb894c58abaf842537bca65a384e6c4048ec0 Mon Sep 17 00:00:00 2001 From: Re1own <0xzhzus@gmail.com> Date: Mon, 26 Dec 2022 01:03:12 -0500 Subject: [PATCH 1411/3019] =?UTF-8?q?707=5FC=E4=BB=A3=E7=A0=81=E8=AF=AD?= =?UTF-8?q?=E6=B3=95=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 创建结构体语法有问题,中间有一个free没有分号 --- ...56\276\350\256\241\351\223\276\350\241\250.md" | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git "a/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" "b/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" index dd305d390d..b82a645e14 100644 --- "a/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" +++ "b/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" @@ -233,7 +233,7 @@ void myLinkedListDeleteAtIndex(MyLinkedList* obj, int index) { MyLinkedList *tmp = obj->next; if (tmp != NULL){ obj->next = tmp->next; - free(tmp); + free(tmp); } return; } @@ -263,21 +263,20 @@ void myLinkedListFree(MyLinkedList* obj) { } /** - * Your MyLinkedList struct will be instantiated and called as such: * MyLinkedList* obj = myLinkedListCreate(); * int param_1 = myLinkedListGet(obj, index); - + * myLinkedListAddAtHead(obj, val); - + * myLinkedListAddAtTail(obj, val); - + * myLinkedListAddAtIndex(obj, index, val); - + * myLinkedListDeleteAtIndex(obj, index); - + * myLinkedListFree(obj); - */ +*/ ``` Java: From 4e28ab5b7d70900c7fb6860a9473eaaca25abe62 Mon Sep 17 00:00:00 2001 From: Haitao Lu Date: Mon, 26 Dec 2022 19:26:45 +0800 Subject: [PATCH 1412/3019] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=94=99=E5=88=AB?= =?UTF-8?q?=E5=AD=97.=20=E2=80=9C=E5=B7=A6=E9=97=AD=E5=8F=88=E9=97=AD?= =?UTF-8?q?=E2=80=9D=E5=BA=94=E8=AF=A5=E6=98=AF=E2=80=9C=E5=B7=A6=E9=97=AD?= =?UTF-8?q?=E5=8F=B3=E9=97=AD=E2=80=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...70\262\351\207\214\347\232\204\345\215\225\350\257\215.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" "b/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" index b82204fa75..a12d8f76bd 100644 --- "a/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" +++ "b/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" @@ -150,7 +150,7 @@ void removeExtraSpaces(string& s) {//去除所有空格并在相邻单词之间 代码如下: ```CPP -// 反转字符串s中左闭又闭的区间[start, end] +// 反转字符串s中左闭右闭的区间[start, end] void reverse(string& s, int start, int end) { for (int i = start, j = end; i < j; i++, j--) { swap(s[i], s[j]); @@ -163,7 +163,7 @@ void reverse(string& s, int start, int end) { ```CPP class Solution { public: - void reverse(string& s, int start, int end){ //翻转,区间写法:左闭又闭 [] + void reverse(string& s, int start, int end){ //翻转,区间写法:左闭右闭 [] for (int i = start, j = end; i < j; i++, j--) { swap(s[i], s[j]); } From b825b5a7c82023ee2ac1b2adc68cf75abc2ecd13 Mon Sep 17 00:00:00 2001 From: ZerenZhang2022 <118794589+ZerenZhang2022@users.noreply.github.com> Date: Tue, 27 Dec 2022 00:30:43 -0500 Subject: [PATCH 1413/3019] =?UTF-8?q?Update=200098.=E9=AA=8C=E8=AF=81?= =?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 补充:**递归** - 避免初始化最小值做法 --- ...11\346\220\234\347\264\242\346\240\221.md" | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git "a/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" index 95ae783fba..93c2272cf6 100644 --- "a/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" +++ "b/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" @@ -392,7 +392,26 @@ class Solution: return is_left_valid and is_right_valid return __isValidBST(root) ``` - +**递归** - 避免初始化最小值做法: +```python +class Solution: + def isValidBST(self, root: TreeNode) -> bool: + # 规律: BST的中序遍历节点数值是从小到大. + pre = None + def __isValidBST(root: TreeNode) -> bool: + nonlocal pre + + if not root: + return True + + is_left_valid = __isValidBST(root.left) + if pre and pre.val>=root.val: return False + pre = root + is_right_valid = __isValidBST(root.right) + + return is_left_valid and is_right_valid + return __isValidBST(root) +``` ```python 迭代-中序遍历 class Solution: From b6807a66dc048c7098243a7c00c823eb3dceb3f1 Mon Sep 17 00:00:00 2001 From: Logen <47022821+Logenleedev@users.noreply.github.com> Date: Wed, 28 Dec 2022 09:45:31 -0600 Subject: [PATCH 1414/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0leetcode=20226?= =?UTF-8?q?=E7=BF=BB=E8=BD=AC=E4=BA=8C=E5=8F=89=E6=A0=91python=E5=90=8E?= =?UTF-8?q?=E5=BA=8F=E9=80=92=E5=BD=92=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...0\275\254\344\272\214\345\217\211\346\240\221.md" | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git "a/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" "b/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" index ad2a7de27b..84c0c58987 100644 --- "a/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" @@ -322,6 +322,18 @@ class Solution: return root ``` +递归法:后序遍历: +```python +class Solution: + def invertTree(self, root: TreeNode) -> TreeNode: + if root is None: + return None + self.invertTree(root.left) + self.invertTree(root.right) + root.left, root.right = root.right, root.left + return root +``` + 迭代法:深度优先遍历(前序遍历): ```python class Solution: From 3d87b36ad7681d4c3dae40529b41506c7a383554 Mon Sep 17 00:00:00 2001 From: Haitao Lu Date: Thu, 29 Dec 2022 00:20:09 +0800 Subject: [PATCH 1415/3019] =?UTF-8?q?=E5=9C=A8=E5=9B=BE=E7=89=87=E5=92=8C?= =?UTF-8?q?=E6=96=87=E5=AD=97=E6=AE=B5=E8=90=BD=E4=B8=AD=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E4=B8=80=E4=B8=AA=E7=A9=BA=E8=A1=8C,=20=E4=BD=BF=E6=96=87?= =?UTF-8?q?=E5=AD=97=E6=AE=B5=E8=90=BD=E5=8F=AF=E4=BB=A5=E6=96=B0=E8=B5=B7?= =?UTF-8?q?=E4=B8=80=E8=A1=8C.=20=E5=A6=82=E6=9E=9C=E4=B8=8D=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E7=A9=BA=E8=A1=8C,=20=E6=96=87=E5=AD=97=E6=AE=B5?= =?UTF-8?q?=E8=90=BD=E4=BC=9A=E8=B7=9F=E5=9C=A8=E5=9B=BE=E7=89=87=E5=90=8E?= =?UTF-8?q?=E9=9D=A2.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "problems/0028.\345\256\236\347\216\260strStr.md" | 2 ++ 1 file changed, 2 insertions(+) diff --git "a/problems/0028.\345\256\236\347\216\260strStr.md" "b/problems/0028.\345\256\236\347\216\260strStr.md" index fc22244165..4e01926fc4 100644 --- "a/problems/0028.\345\256\236\347\216\260strStr.md" +++ "b/problems/0028.\345\256\236\347\216\260strStr.md" @@ -174,9 +174,11 @@ next数组就是一个前缀表(prefix table)。 长度为前1个字符的子串`a`,最长相同前后缀的长度为0。(注意字符串的**前缀是指不包含最后一个字符的所有以第一个字符开头的连续子串**;**后缀是指不包含第一个字符的所有以最后一个字符结尾的连续子串**。) KMP精讲6 + 长度为前2个字符的子串`aa`,最长相同前后缀的长度为1。 KMP精讲7 + 长度为前3个字符的子串`aab`,最长相同前后缀的长度为0。 以此类推: From 8cb8f7f56a370cc8f52be5ecddadb063a7401ccb Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Thu, 29 Dec 2022 17:08:14 +0800 Subject: [PATCH 1416/3019] =?UTF-8?q?update=200188.=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?IV:=20=E5=88=A0=E9=99=A4=E5=86=97=E4=BD=99=20go=20=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\344\275\263\346\227\266\346\234\272IV.md" | 34 ------------------- 1 file changed, 34 deletions(-) diff --git "a/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" "b/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" index 23a8f54a78..695fac35a2 100644 --- "a/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" +++ "b/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" @@ -323,40 +323,6 @@ func max(a, b int) int { } ``` -```go -func maxProfit(k int, prices []int) int { - if len(prices)==0{ - return 0 - } - dp:=make([][]int,len(prices)) - for i:=0;ib{ - return a - } - return b -} -``` - Javascript: ```javascript From aa0078469327a4eecf6dc872ab0cfbc4ad380b4d Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Thu, 29 Dec 2022 22:12:32 +0800 Subject: [PATCH 1417/3019] =?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:=20=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E6=96=87=E6=9C=AC=E9=94=99=E5=AD=97=EF=BC=8C=E8=B0=83?= =?UTF-8?q?=E6=95=B4=E5=85=B6=E4=BB=96=E8=AF=AD=E8=A8=80=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E4=BD=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...07\345\255\220\345\272\217\345\210\227.md" | 85 +++++++++---------- 1 file changed, 42 insertions(+), 43 deletions(-) diff --git "a/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" "b/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" index 42efe31d77..f4fe1c31c3 100644 --- "a/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" @@ -36,9 +36,9 @@ 首先通过本题大家要明确什么是子序列,“子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序”。 本题也是代码随想录中子序列问题的第一题,如果没接触过这种题目的话,本题还是很难的,甚至想暴力去搜索也不知道怎么搜。 -子序列问题是动态规划解决的经典问题,当前下标i的递增子序列长度,其实和i之前的下表j的子序列长度有关系,那那又是什么样的关系呢。 +子序列问题是动态规划解决的经典问题,当前下标i的递增子序列长度,其实和i之前的下表j的子序列长度有关系,那又是什么样的关系呢。 -接下来,我们依然用动规五部曲来分析详细一波: +接下来,我们依然用动规五部曲来详细分析一波: 1. dp[i]的定义 @@ -46,7 +46,7 @@ **dp[i]表示i之前包括i的以nums[i]结尾的最长递增子序列的长度** -为什么一定表示 “以nums[i]结尾的最长递增子序” ,因为我们在 做 递增比较的时候,如果比较 nums[j] 和 nums[i] 的大小,那么两个递增子序列一定分别以nums[j]为结尾 和 nums[i]为结尾, 要不然这个比较就没有意义了,不是尾部元素的比较那么 如果算递增呢。 +为什么一定表示 “以nums[i]结尾的最长递增子序” ,因为我们在 做 递增比较的时候,如果比较 nums[j] 和 nums[i] 的大小,那么两个递增子序列一定分别以nums[j]为结尾 和 nums[i]为结尾, 要不然这个比较就没有意义了,不是尾部元素的比较那么 如何算递增呢。 2. 状态转移方程 @@ -155,31 +155,6 @@ class Solution: ``` Go: -```go -func lengthOfLIS(nums []int ) int { - dp := []int{} - for _, num := range nums { - if len(dp) ==0 || dp[len(dp) - 1] < num { - dp = append(dp, num) - } else { - l, r := 0, len(dp) - 1 - pos := r - for l <= r { - mid := (l + r) >> 1 - if dp[mid] >= num { - pos = mid; - r = mid - 1 - } else { - l = mid + 1 - } - } - dp[pos] = num - }//二分查找 - } - return len(dp) -} -``` - ```go // 动态规划求解 func lengthOfLIS(nums []int) int { @@ -212,21 +187,29 @@ func max(x, y int) int { return y } ``` - -Rust: -```rust -pub fn length_of_lis(nums: Vec) -> i32 { - let mut dp = vec![1; nums.len() + 1]; - let mut result = 1; - for i in 1..nums.len() { - for j in 0..i { - if nums[j] < nums[i] { - dp[i] = dp[i].max(dp[j] + 1); - } - result = result.max(dp[i]); - } - } - result +贪心+二分 优化 +```go +func lengthOfLIS(nums []int ) int { + dp := []int{} + for _, num := range nums { + if len(dp) == 0 || dp[len(dp) - 1] < num { + dp = append(dp, num) + } else { + l, r := 0, len(dp) - 1 + pos := r + for l <= r { + mid := (l + r) >> 1 + if dp[mid] >= num { + pos = mid; + r = mid - 1 + } else { + l = mid + 1 + } + } + dp[pos] = num + }//二分查找 + } + return len(dp) } ``` @@ -270,6 +253,22 @@ function lengthOfLIS(nums: number[]): number { }; ``` +Rust: +```rust +pub fn length_of_lis(nums: Vec) -> i32 { + let mut dp = vec![1; nums.len() + 1]; + let mut result = 1; + for i in 1..nums.len() { + for j in 0..i { + if nums[j] < nums[i] { + dp[i] = dp[i].max(dp[j] + 1); + } + result = result.max(dp[i]); + } + } + result +} +``` From 2afe2709a7d3ae8048321182083bd1fa84cdd7d2 Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Thu, 29 Dec 2022 22:40:18 +0800 Subject: [PATCH 1418/3019] =?UTF-8?q?update=200718.=E6=9C=80=E9=95=BF?= =?UTF-8?q?=E9=87=8D=E5=A4=8D=E5=AD=90=E6=95=B0=E7=BB=84=EF=BC=9A=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E6=96=87=E6=9C=AC=E9=94=99=E5=AD=97=EF=BC=8C=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=20go=20=E7=9A=84=E6=BB=9A=E5=8A=A8=E6=95=B0=E7=BB=84?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...15\345\255\220\346\225\260\347\273\204.md" | 27 +++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git "a/problems/0718.\346\234\200\351\225\277\351\207\215\345\244\215\345\255\220\346\225\260\347\273\204.md" "b/problems/0718.\346\234\200\351\225\277\351\207\215\345\244\215\345\255\220\346\225\260\347\273\204.md" index 37f6cbfec8..0658f9c8bb 100644 --- "a/problems/0718.\346\234\200\351\225\277\351\207\215\345\244\215\345\255\220\346\225\260\347\273\204.md" +++ "b/problems/0718.\346\234\200\351\225\277\351\207\215\345\244\215\345\255\220\346\225\260\347\273\204.md" @@ -28,7 +28,7 @@ 注意题目中说的子数组,其实就是连续子序列。 -要求两个数组中最长重复子数组,如果是暴力的解法 只要需要先两层for循环确定两个数组起始位置,然后在来一个循环可以是for或者while,来从两个起始位置开始比较,取得重复子数组的长度。 +要求两个数组中最长重复子数组,如果是暴力的解法 只需要先两层for循环确定两个数组起始位置,然后再来一个循环可以是for或者while,来从两个起始位置开始比较,取得重复子数组的长度。 本题其实是动规解决的经典题目,我们只要想到 用二维数组可以记录两个字符串的所有比较情况,这样就比较好推 递推公式了。 动规五部曲分析如下: @@ -163,7 +163,7 @@ public: 当然可以,就是实现起来麻烦一些。 -如果定义 dp[i][j]为 以下标i为结尾的A,和以下标j 为结尾的B,那么 第一行和第一列毕竟要经行初始化,如果nums1[i] 与 nums2[0] 相同的话,对应的 dp[i][0]就要初始为1, 因为此时最长重复子数组为1。 nums2[j] 与 nums1[0]相同的话,同理。 +如果定义 dp[i][j]为 以下标i为结尾的A,和以下标j 为结尾的B,那么 第一行和第一列毕竟要进行初始化,如果nums1[i] 与 nums2[0] 相同的话,对应的 dp[i][0]就要初始为1, 因为此时最长重复子数组为1。 nums2[j] 与 nums1[0]相同的话,同理。 所以代码如下: @@ -298,6 +298,29 @@ func findLength(A []int, B []int) int { } return res } + +// 滚动数组 +func findLength(nums1 []int, nums2 []int) int { + n, m, res := len(nums1), len(nums2), 0 + dp := make([]int, m+1) + for i := 1; i <= n; i++ { + for j := m; j >= 1; j-- { + if nums1[i-1] == nums2[j-1] { + dp[j] = dp[j-1] + 1 + } else { + dp[j] = 0 // 注意这里不相等要赋值为0,供下一层使用 + } + res = max(res, dp[j]) + } + } + return res +} +func max(a, b int) int { + if a > b { + return a + } + return b +} ``` JavaScript: From af67d52f09b8327c96f386248246300ee4df859c Mon Sep 17 00:00:00 2001 From: Logen <47022821+Logenleedev@users.noreply.github.com> Date: Thu, 29 Dec 2022 13:26:24 -0600 Subject: [PATCH 1419/3019] change depth to height --- ...04\346\234\200\345\244\247\346\267\261\345\272\246.md" | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git "a/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" "b/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" index 03322c9a88..e54221db8c 100644 --- "a/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" +++ "b/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" @@ -402,10 +402,10 @@ class solution: def getdepth(self, node): if not node: return 0 - leftdepth = self.getdepth(node.left) #左 - rightdepth = self.getdepth(node.right) #右 - depth = 1 + max(leftdepth, rightdepth) #中 - return depth + leftheight = self.getdepth(node.left) #左 + rightheight = self.getdepth(node.right) #右 + height = 1 + max(leftheight, rightheight) #中 + return height ``` 递归法:精简代码 From e7f3ecc58a575334ef02cada1407daa6c0d6d590 Mon Sep 17 00:00:00 2001 From: picassoboss <111678738+picassoboss@users.noreply.github.com> Date: Fri, 30 Dec 2022 14:12:01 +0800 Subject: [PATCH 1420/3019] =?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 java代码部分无法通过leetcode提交,需要先判断sum是否可以满足target --- "problems/0494.\347\233\256\346\240\207\345\222\214.md" | 2 ++ 1 file changed, 2 insertions(+) diff --git "a/problems/0494.\347\233\256\346\240\207\345\222\214.md" "b/problems/0494.\347\233\256\346\240\207\345\222\214.md" index 6c8c28ec83..eec4183d2f 100644 --- "a/problems/0494.\347\233\256\346\240\207\345\222\214.md" +++ "b/problems/0494.\347\233\256\346\240\207\345\222\214.md" @@ -270,6 +270,8 @@ class Solution { public int findTargetSumWays(int[] nums, int target) { int sum = 0; for (int i = 0; i < nums.length; i++) sum += nums[i]; + //如果target过大 sum将无法满足 + if ( target < 0 && sum < -target) return 0; if ((target + sum) % 2 != 0) return 0; int size = (target + sum) / 2; if(size < 0) size = -size; From 15e3377491590fceee2af002803183bd6f15e236 Mon Sep 17 00:00:00 2001 From: re1own <595875338@qq.com> Date: Fri, 30 Dec 2022 01:42:47 -0500 Subject: [PATCH 1421/3019] =?UTF-8?q?Update=200518.=E9=9B=B6=E9=92=B1?= =?UTF-8?q?=E5=85=91=E6=8D=A2II.md=20=E5=AF=B9dp[0]=3D1=E7=9A=84=E8=A1=A5?= =?UTF-8?q?=E5=85=85=E8=A7=A3=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .DS_Store | Bin 0 -> 6148 bytes problems/.DS_Store | Bin 0 -> 6148 bytes ...266\351\222\261\345\205\221\346\215\242II.md" | 3 +++ 3 files changed, 3 insertions(+) create mode 100644 .DS_Store create mode 100644 problems/.DS_Store diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..da03c1c1b207c3ee04079084ecb15dcfff97ef95 GIT binary patch literal 6148 zcmeHK%}T>S5T317Q;OJwLXQhx3-<3)^bl)(0V4`psf{T$m}X1UTBHSVD*@yHz(SRn%3w1`N_?k*PTX z=s*u5cO3N-(d77z49It9K_3Pnz=e13&kcl&V-IdW@S|a|_{35R>BXgGloVwt;#QN%@Vis8VsHj`Xe9O(bW6^; z=;?2>^71?{rY9N=vv=!y_4uZF|F|A+0!!OY6cR47cXj`MRB4$Rg_Eiph0d}LrjcXRUo z-}}7&|CmHQVt^R zVC$RRxm?z$r5rK?vu`uAlgGYm1 zMLXL^w*hCgdN+$V`92QzXMC=vDCb;Xa{*8E#yp+f@nHS>C1gr@Cz5G$oj%rFb#~6y z&W3!?%%`Rbr~<0MqAP%&&6X^C)KL{s1yq4r0scN%IAbPQd32u+4DJX3j1hK*IiDrC z#tLSFl}BV?#+L$psgWaw@#TnHS(gb`9(_3($Bg?3vyl^uaqNg&x13DoQAbrk6$lmR z_{%Q$|IMGz|6!3{sRF9Nzf!=&c|Y%AOVV3go8w+<;R84uud6)PC78HYjJ4c~*Wk_& Yw>$x6f|W-^VEQBAWY9qs_)`Tw0S;+s82|tP literal 0 HcmV?d00001 diff --git "a/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" "b/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" index 2fc807cd06..f6a8044c61 100644 --- "a/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" +++ "b/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" @@ -95,6 +95,8 @@ dp[j] 就是所有的dp[j - coins[i]](考虑coins[i]的情况)相加。 下标非0的dp[j]初始化为0,这样累计加dp[j - coins[i]]的时候才不会影响真正的dp[j] +dp[0]=1还说明了一种情况:如果正好选了coins[i]后,也就是j-coins[i] == 0的情况表示这个硬币刚好能选,此时dp[0]为1表示只选coins[i]存在这样的一种选法。 + 4. 确定遍历顺序 本题中我们是外层for循环遍历物品(钱币),内层for遍历背包(金钱总额),还是外层for遍历背包(金钱总额),内层for循环遍历物品(钱币)呢? @@ -316,3 +318,4 @@ object Solution { + From 0fed2a54a319160b17fe5cea69dd4fedd1e7e053 Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Fri, 30 Dec 2022 15:24:06 +0800 Subject: [PATCH 1422/3019] =?UTF-8?q?update=201143.=E6=9C=80=E9=95=BF?= =?UTF-8?q?=E5=85=AC=E5=85=B1=E5=AD=90=E5=BA=8F=E5=88=97=EF=BC=9A=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E6=96=87=E6=9C=AC=E9=94=99=E5=AD=97=EF=BC=8C=E8=B0=83?= =?UTF-8?q?=E6=95=B4=20rust=20=E4=BB=A3=E7=A0=81=E4=BD=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...61\345\255\220\345\272\217\345\210\227.md" | 43 +++++++++---------- 1 file changed, 21 insertions(+), 22 deletions(-) diff --git "a/problems/1143.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" "b/problems/1143.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" index b655b5cd16..f2e6e7e2b2 100644 --- "a/problems/1143.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/1143.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" @@ -49,7 +49,7 @@ dp[i][j]:长度为[0, i - 1]的字符串text1与长度为[0, j - 1]的字符 有同学会问:为什么要定义长度为[0, i - 1]的字符串text1,定义为长度为[0, i]的字符串text1不香么? -这样定义是为了后面代码实现方便,如果非要定义为为长度为[0, i]的字符串text1也可以,我在 [动态规划:718. 最长重复子数组](https://programmercarl.com/0718.最长重复子数组.html) 中的「拓展」里 详细讲解了区别所在,其实就是简化了dp数组第一行和第一列的初始化逻辑。 +这样定义是为了后面代码实现方便,如果非要定义为长度为[0, i]的字符串text1也可以,我在 [动态规划:718. 最长重复子数组](https://programmercarl.com/0718.最长重复子数组.html) 中的「拓展」里 详细讲解了区别所在,其实就是简化了dp数组第一行和第一列的初始化逻辑。 2. 确定递推公式 @@ -240,27 +240,6 @@ func max(a,b int)int { ``` -Rust: -```rust -pub fn longest_common_subsequence(text1: String, text2: String) -> i32 { - let (n, m) = (text1.len(), text2.len()); - let (s1, s2) = (text1.as_bytes(), text2.as_bytes()); - let mut dp = vec![0; m + 1]; - let mut last = vec![0; m + 1]; - for i in 1..=n { - dp.swap_with_slice(&mut last); - for j in 1..=m { - dp[j] = if s1[i - 1] == s2[j - 1] { - last[j - 1] + 1 - } else { - last[j].max(dp[j - 1]) - }; - } - } - dp[m] -} -``` - Javascript: ```javascript const longestCommonSubsequence = (text1, text2) => { @@ -304,6 +283,26 @@ function longestCommonSubsequence(text1: string, text2: string): number { }; ``` +Rust: +```rust +pub fn longest_common_subsequence(text1: String, text2: String) -> i32 { + let (n, m) = (text1.len(), text2.len()); + let (s1, s2) = (text1.as_bytes(), text2.as_bytes()); + let mut dp = vec![0; m + 1]; + let mut last = vec![0; m + 1]; + for i in 1..=n { + dp.swap_with_slice(&mut last); + for j in 1..=m { + dp[j] = if s1[i - 1] == s2[j - 1] { + last[j - 1] + 1 + } else { + last[j].max(dp[j - 1]) + }; + } + } + dp[m] +} +``` From d3bd157bb4f2a9f2174281e4d0bd0bcdaa211129 Mon Sep 17 00:00:00 2001 From: Logen <47022821+Logenleedev@users.noreply.github.com> Date: Sun, 1 Jan 2023 16:49:52 -0600 Subject: [PATCH 1423/3019] fix typo --- ...\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" "b/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" index 9f2e96a605..540ab5d7f5 100644 --- "a/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" +++ "b/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" @@ -74,7 +74,7 @@ public: 大家此时应该陷入深思..... -**其实队列没有必要维护窗口里的所有元素,只需要维护有可能成为窗口里最大值的元素就可以了,同时保证队里的元素数值是由大到小的。** +**其实队列没有必要维护窗口里的所有元素,只需要维护有可能成为窗口里最大值的元素就可以了,同时保证队列里的元素数值是由大到小的。** 那么这个维护元素单调递减的队列就叫做**单调队列,即单调递减或单调递增的队列。C++中没有直接支持单调队列,需要我们自己来实现一个单调队列** From a5fd36e64cee1d02c1b7ce7c6fbc61e2254f085b Mon Sep 17 00:00:00 2001 From: Allen <2439506288@qq.com> Date: Mon, 2 Jan 2023 09:58:06 +0800 Subject: [PATCH 1424/3019] =?UTF-8?q?Update=200491.=E9=80=92=E5=A2=9E?= =?UTF-8?q?=E5=AD=90=E5=BA=8F=E5=88=97.md=20=E4=BF=AE=E6=94=B9=E8=BF=87?= =?UTF-8?q?=E6=97=B6=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 --- ...200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git "a/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" "b/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" index c764a1c325..82b3604eb9 100644 --- "a/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" @@ -9,7 +9,7 @@ # 491.递增子序列 -[力扣题目链接](https://leetcode.cn/problems/increasing-subsequences/) +[力扣题目链接](https://leetcode.cn/problems/non-decreasing-subsequences/) 给定一个整型数组, 你的任务是找到所有该数组的递增子序列,递增子序列的长度至少是2。 @@ -614,3 +614,4 @@ object Solution { + From 2cd16202f48ae765049c00a1a773214033b0e127 Mon Sep 17 00:00:00 2001 From: El nino <69737612+el-nino2020@users.noreply.github.com> Date: Mon, 2 Jan 2023 16:39:24 +0800 Subject: [PATCH 1425/3019] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 3b0e8d6558..a04f58a6b3 100644 --- a/README.md +++ b/README.md @@ -131,7 +131,7 @@ 1. [数组过于简单,但你该了解这些!](./problems/数组理论基础.md) 2. [数组:二分查找](./problems/0704.二分查找.md) 3. [数组:移除元素](./problems/0027.移除元素.md) -4. [数组:序数组的平方](./problems/0977.有序数组的平方.md) +4. [数组:有序数组的平方](./problems/0977.有序数组的平方.md) 5. [数组:长度最小的子数组](./problems/0209.长度最小的子数组.md) 6. [数组:螺旋矩阵II](./problems/0059.螺旋矩阵II.md) 7. [数组:总结篇](./problems/数组总结篇.md) From c54ca3f210d2e881cac888f83af2ef6796091daf Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Mon, 2 Jan 2023 22:40:46 +0800 Subject: [PATCH 1426/3019] =?UTF-8?q?update=200213.=E6=89=93=E5=AE=B6?= =?UTF-8?q?=E5=8A=AB=E8=88=8DII:=20=E4=BF=AE=E6=94=B9=E5=87=BD=E6=95=B0=20?= =?UTF-8?q?python=20=E4=BB=A3=E7=A0=81=E5=87=BD=E6=95=B0=E5=90=8D=E7=A7=B0?= =?UTF-8?q?=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0213.\346\211\223\345\256\266\345\212\253\350\210\215II.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0213.\346\211\223\345\256\266\345\212\253\350\210\215II.md" "b/problems/0213.\346\211\223\345\256\266\345\212\253\350\210\215II.md" index dd109f838e..e595d2fdb2 100644 --- "a/problems/0213.\346\211\223\345\256\266\345\212\253\350\210\215II.md" +++ "b/problems/0213.\346\211\223\345\256\266\345\212\253\350\210\215II.md" @@ -131,7 +131,7 @@ class Solution: val2=self.roblist(nums[:-1])#不偷最后一间房 return max(val1,val2) - def robRange(self,nums): + def roblist(self,nums): l=len(nums) dp=[0]*l dp[0]=nums[0] From fe0d0f8c5be965b69f2db0c966c2a8b7135e9f35 Mon Sep 17 00:00:00 2001 From: hbingzhi Date: Tue, 3 Jan 2023 17:46:01 +0800 Subject: [PATCH 1427/3019] =?UTF-8?q?232.=E4=BF=AE=E6=94=B9=E6=96=87?= =?UTF-8?q?=E5=AD=97=E5=8F=99=E8=BF=B0=E9=94=99=E8=AF=AF=E9=83=A8=E5=88=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git "a/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" "b/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" index 4983c93a64..efeb10463e 100644 --- "a/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" +++ "b/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" @@ -38,7 +38,7 @@ queue.empty(); // 返回 false ## 思路 -《代码随想录》算法公开课:[栈的基本操作! | LeetCode:232.用栈实现队列](https://www.bilibili.com/video/BV1nY4y1w7VC),相信结合视频再看本篇题解,更有助于大家对链表的理解。 +《代码随想录》算法公开课:[栈的基本操作! | LeetCode:232.用栈实现队列](https://www.bilibili.com/video/BV1nY4y1w7VC),相信结合视频再看本篇题解,更有助于大家对栈和队列的理解。 这是一道模拟题,不涉及到具体算法,考察的就是对栈和队列的掌握程度。 @@ -662,3 +662,4 @@ impl MyQueue { + From 49fc701e4897acd528e60ac9a67d0d85772dbb5b Mon Sep 17 00:00:00 2001 From: huhaonan <812559558@qq.com> Date: Thu, 5 Jan 2023 21:42:53 +0800 Subject: [PATCH 1428/3019] =?UTF-8?q?UPDATE=200222=20=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E5=85=B6=E4=B8=AD=E4=B8=A4=E4=B8=AA=E9=94=99=E5=88=AB=E5=AD=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git "a/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" "b/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" index b87877c9ef..10ac826496 100644 --- "a/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" +++ "b/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" @@ -188,7 +188,7 @@ public: ```CPP if (root == nullptr) return 0; -// 开始根据做深度和有深度是否相同来判断该子树是不是满二叉树 +// 开始根据左深度和右深度是否相同来判断该子树是不是满二叉树 TreeNode* left = root->left; TreeNode* right = root->right; int leftDepth = 0, rightDepth = 0; // 这里初始为0是有目的的,为了下面求指数方便 @@ -843,3 +843,4 @@ impl Solution { + From 0c77206ecae5acece7cc12572ed08682b3147c20 Mon Sep 17 00:00:00 2001 From: Zeeland Date: Thu, 5 Jan 2023 22:01:19 +0800 Subject: [PATCH 1429/3019] =?UTF-8?q?update:=20=200104.=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=A0=91=E7=9A=84=E6=9C=80=E5=A4=A7=E6=B7=B1=E5=BA=A6:=20?= =?UTF-8?q?=E4=BC=98=E5=8C=96python=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...04\345\261\202\345\272\217\351\201\215\345\216\206.md" | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" index 406242a786..3b68592fff 100644 --- "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" +++ "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" @@ -2532,20 +2532,18 @@ class Solution: return 0 queue_ = [root] - result = [] + depth = 0 while queue_: length = len(queue_) - sub = [] for i in range(length): cur = queue_.pop(0) sub.append(cur.val) #子节点入队列 if cur.left: queue_.append(cur.left) if cur.right: queue_.append(cur.right) - result.append(sub) + depth += 1 - - return len(result) + return depth ``` Go: From abedcbbe040fff779f54ed7a68204e677bcaa24e Mon Sep 17 00:00:00 2001 From: Frank Mao Date: Fri, 6 Jan 2023 00:35:56 +0800 Subject: [PATCH 1430/3019] =?UTF-8?q?0150.=E9=80=86=E6=B3=A2=E5=85=B0?= =?UTF-8?q?=E8=A1=A8=E8=BE=BE=E5=BC=8F=E6=B1=82=E5=80=BC=20=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E6=9B=B4=E5=BF=AB=E9=80=9F=E7=9A=84python=E8=A7=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...76\345\274\217\346\261\202\345\200\274.md" | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git "a/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" "b/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" index 176ea6875e..f0323bc4ff 100644 --- "a/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" +++ "b/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" @@ -163,6 +163,25 @@ class Solution { python3 +```python +from operator import add, sub, mul + +class Solution: + op_map = {'+': add, '-': sub, '*': mul, '/': lambda x, y: int(x / y)} + + def evalRPN(self, tokens: List[str]) -> int: + stack = [] + for token in tokens: + if token not in {'+', '-', '*', '/'}: + stack.append(int(token)) + else: + op2 = stack.pop() + op1 = stack.pop() + stack.append(self.op_map[token](op1, op2)) # 第一个出来的在运算符后面 + return stack.pop() +``` + +另一种可行,但因为使用eval相对较慢的方法: ```python class Solution: def evalRPN(self, tokens: List[str]) -> int: From 98ceaa93b7adeb672c088decfe5544770204bbe5 Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Fri, 6 Jan 2023 12:36:38 +0800 Subject: [PATCH 1431/3019] Update --- ...73\351\231\244\345\205\203\347\264\240.md" | 4 +- ...\345\220\210\346\200\273\345\222\214II.md" | 28 +++++++++----- ...26\350\276\221\350\267\235\347\246\273.md" | 35 +++++++++++------- ...60\344\272\214\345\217\211\346\240\221.md" | 2 +- ...02\345\272\217\351\201\215\345\216\206.md" | 4 +- ...62\345\233\236\346\226\207\344\270\262.md" | 6 ++- ...57\345\275\242\351\223\276\350\241\250.md" | 4 +- ...\345\275\242\351\223\276\350\241\250II.md" | 4 +- ...7.\345\271\277\346\220\234\347\211\210.md" | 2 +- ...73\350\275\254\351\223\276\350\241\250.md" | 2 +- ...54\344\272\214\345\217\211\346\240\221.md" | 2 +- ...15\345\274\202\344\275\215\350\257\215.md" | 2 +- ...3.\347\247\273\345\212\250\351\233\266.md" | 2 +- ...54\345\255\227\347\254\246\344\270\262.md" | 2 +- ...55\347\232\204\350\212\202\347\202\271.md" | 2 +- ...07\345\255\220\345\272\217\345\210\227.md" | 10 ++--- ...40\351\231\244\346\223\215\344\275\234.md" | 11 ++++-- ...66\344\272\214\345\217\211\346\240\221.md" | 2 +- ...36\346\226\207\345\255\220\344\270\262.md" | 37 +++++++++++++------ ...47\344\272\214\345\217\211\346\240\221.md" | 2 +- ...00\345\244\247\351\235\242\347\247\257.md" | 35 +++++++++++++----- ...22\345\205\245\346\223\215\344\275\234.md" | 2 +- ...00\350\277\255\344\273\243\346\263\225.md" | 2 +- ...55\344\273\243\351\201\215\345\216\206.md" | 4 +- ...77\346\215\242\347\251\272\346\240\274.md" | 2 +- ...06\350\256\272\345\237\272\347\241\200.md" | 9 +++-- 26 files changed, 134 insertions(+), 83 deletions(-) diff --git "a/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" "b/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" index 19a600d16d..3e26338d9d 100644 --- "a/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" +++ "b/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" @@ -42,7 +42,7 @@ 删除过程如下: -![27.移除元素-暴力解法](https://tva1.sinaimg.cn/large/008eGmZEly1gntrc7x9tjg30du09m1ky.gif) +![27.移除元素-暴力解法](https://code-thinking.cdn.bcebos.com/gifs/27.%E7%A7%BB%E9%99%A4%E5%85%83%E7%B4%A0-%E6%9A%B4%E5%8A%9B%E8%A7%A3%E6%B3%95.gif) 很明显暴力解法的时间复杂度是O(n^2),这道题目暴力解法在leetcode上是可以过的。 @@ -86,7 +86,7 @@ public: 删除过程如下: -![27.移除元素-双指针法](https://tva1.sinaimg.cn/large/008eGmZEly1gntrds6r59g30du09mnpd.gif) +![27.移除元素-双指针法](https://code-thinking.cdn.bcebos.com/gifs/27.%E7%A7%BB%E9%99%A4%E5%85%83%E7%B4%A0-%E5%8F%8C%E6%8C%87%E9%92%88%E6%B3%95.gif) 很多同学不了解 diff --git "a/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" "b/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" index 2d4b836a3b..415fdb605f 100644 --- "a/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" +++ "b/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" @@ -16,30 +16,38 @@ candidates 中的每个数字在每个组合中只能使用一次。 说明: -所有数字(包括目标数)都是正整数。 -解集不能包含重复的组合。  +所有数字(包括目标数)都是正整数。解集不能包含重复的组合。  -示例 1: -输入: candidates = [10,1,2,7,6,1,5], target = 8, -所求解集为: +* 示例 1: +* 输入: candidates = [10,1,2,7,6,1,5], target = 8, +* 所求解集为: +``` [ [1, 7], [1, 2, 5], [2, 6], [1, 1, 6] ] +``` + +* 示例 2: +* 输入: candidates = [2,5,2,1,2], target = 5, +* 所求解集为: -示例 2: -输入: candidates = [2,5,2,1,2], target = 5, -所求解集为: +``` [   [1,2,2],   [5] ] +``` + +# 算法公开课 + +**《代码随想录》算法视频公开课:[回溯算法中的去重,树层去重树枝去重,你弄清楚了没?| LeetCode:40.组合总和II](https://www.bilibili.com/video/BV12V4y1V73A),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 -# 思路 -**如果对回溯算法基础还不了解的话,我还特意录制了一期视频:[带你学透回溯算法(理论篇)](https://www.bilibili.com/video/BV1cy4y167mM/)** 可以结合题解和视频一起看,希望对大家理解回溯算法有所帮助。 + +# 思路 这道题目和[39.组合总和](https://programmercarl.com/0039.组合总和.html)如下区别: diff --git "a/problems/0072.\347\274\226\350\276\221\350\267\235\347\246\273.md" "b/problems/0072.\347\274\226\350\276\221\350\267\235\347\246\273.md" index 408f1d7c86..a34439e608 100644 --- "a/problems/0072.\347\274\226\350\276\221\350\267\235\347\246\273.md" +++ "b/problems/0072.\347\274\226\350\276\221\350\267\235\347\246\273.md" @@ -16,24 +16,28 @@ * 删除一个字符 * 替换一个字符 -示例 1: -输入:word1 = "horse", word2 = "ros" -输出:3 -解释: +* 示例 1: +* 输入:word1 = "horse", word2 = "ros" +* 输出:3 +* 解释: +``` horse -> rorse (将 'h' 替换为 'r') rorse -> rose (删除 'r') rose -> ros (删除 'e') +`` + -示例 2: -输入:word1 = "intention", word2 = "execution" -输出:5 -解释: +* 示例 2: +* 输入:word1 = "intention", word2 = "execution" +* 输出:5 +* 解释: +``` intention -> inention (删除 't') inention -> enention (将 'i' 替换为 'e') enention -> exention (将 'n' 替换为 'x') exention -> exection (将 'n' 替换为 'c') exection -> execution (插入 'u') - +``` 提示: @@ -54,10 +58,11 @@ exection -> execution (插入 'u') **dp[i][j] 表示以下标i-1为结尾的字符串word1,和以下标j-1为结尾的字符串word2,最近编辑距离为dp[i][j]**。 -这里在强调一下:为啥要表示下标i-1为结尾的字符串呢,为啥不表示下标i为结尾的字符串呢? +有同学问了,为啥要表示下标i-1为结尾的字符串呢,为啥不表示下标i为结尾的字符串呢? -用i来表示也可以! 但我统一以下标i-1为结尾的字符串,在下面的递归公式中会容易理解一点。 +为什么这么定义我在 [718. 最长重复子数组](https://programmercarl.com/0718.最长重复子数组.html) 中做了详细的讲解。 +其实用i来表示也可以! 用i-1就是为了方便后面dp数组初始化的。 ### 2. 确定递推公式 @@ -111,9 +116,13 @@ if (word1[i - 1] != word2[j - 1]) +-----+-----+ ``` -操作三:替换元素,`word1`替换`word1[i - 1]`,使其与`word2[j - 1]`相同,此时不用增加元素,那么以下标`i-2`为结尾的`word1` 与 `j-2`为结尾的`word2`的最近编辑距离 加上一个替换元素的操作。 +操作三:替换元素,`word1`替换`word1[i - 1]`,使其与`word2[j - 1]`相同,此时不用增删加元素。 + +可以回顾一下,`if (word1[i - 1] == word2[j - 1])`的时候我们的操作 是 `dp[i][j] = dp[i - 1][j - 1]` 对吧。 + +那么只需要一次替换的操作,就可以让 word1[i - 1] 和 word2[j - 1] 相同。 -即 `dp[i][j] = dp[i - 1][j - 1] + 1;` +所以 `dp[i][j] = dp[i - 1][j - 1] + 1;` 综上,当 `if (word1[i - 1] != word2[j - 1])` 时取最小的,即:`dp[i][j] = min({dp[i - 1][j - 1], dp[i - 1][j], dp[i][j - 1]}) + 1;` diff --git "a/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" "b/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" index 40e3e18e6d..1c2812fa64 100644 --- "a/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" @@ -169,7 +169,7 @@ public: 通过队列来判断根节点的左子树和右子树的内侧和外侧是否相等,如动画所示: -![101.对称二叉树](https://tva1.sinaimg.cn/large/008eGmZEly1gnwcimlj8lg30hm0bqnpd.gif) +![101.对称二叉树](https://code-thinking.cdn.bcebos.com/gifs/101.%E5%AF%B9%E7%A7%B0%E4%BA%8C%E5%8F%89%E6%A0%91.gif) diff --git "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" index 9985971f2c..a565d052ef 100644 --- "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" +++ "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" @@ -23,7 +23,7 @@ * 111.二叉树的最小深度 -![我要打十个](https://tva1.sinaimg.cn/large/008eGmZEly1gnadnltbpjg309603w4qp.gif) +![我要打十个](https://code-thinking.cdn.bcebos.com/gifs/%E6%88%91%E8%A6%81%E6%89%93%E5%8D%81%E4%B8%AA.gif) @@ -53,7 +53,7 @@ 使用队列实现二叉树广度优先遍历,动画如下: -![102二叉树的层序遍历](https://tva1.sinaimg.cn/large/008eGmZEly1gnad5itmk8g30iw0cqe83.gif) +![102二叉树的层序遍历](https://code-thinking.cdn.bcebos.com/gifs/102%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E5%B1%82%E5%BA%8F%E9%81%8D%E5%8E%86.gif) 这样就实现了层序从左到右遍历二叉树。 diff --git "a/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" "b/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" index 0081223c42..79ab72ee87 100644 --- "a/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" +++ "b/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" @@ -23,10 +23,12 @@ ["a","a","b"] ] +# 算法公开课 + +**《代码随想录》算法视频公开课:[131.分割回文串](https://www.bilibili.com/video/BV1c54y1e7k6),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 -# 思路 -关于本题,大家也可以看我在B站的视频讲解:[131.分割回文串(B站视频)](https://www.bilibili.com/video/BV1c54y1e7k6) +# 思路 本题这涉及到两个关键问题: diff --git "a/problems/0141.\347\216\257\345\275\242\351\223\276\350\241\250.md" "b/problems/0141.\347\216\257\345\275\242\351\223\276\350\241\250.md" index d4cd596f10..7d7121a0ba 100644 --- "a/problems/0141.\347\216\257\345\275\242\351\223\276\350\241\250.md" +++ "b/problems/0141.\347\216\257\345\275\242\351\223\276\350\241\250.md" @@ -40,7 +40,7 @@ fast和slow各自再走一步, fast和slow就相遇了 动画如下: -![141.环形链表](https://tva1.sinaimg.cn/large/e6c9d24ely1go4tquxo12g20fs0b6u0x.gif) +![141.环形链表](https://code-thinking.cdn.bcebos.com/gifs/141.%E7%8E%AF%E5%BD%A2%E9%93%BE%E8%A1%A8.gif) C++代码如下 @@ -64,7 +64,7 @@ public: ## 扩展 -做完这道题目,可以在做做[142.环形链表II](https://mp.weixin.qq.com/s/gt_VH3hQTqNxyWcl1ECSbQ),不仅仅要找环,还要找环的入口。 +做完这道题目,可以在做做[142.环形链表II](https://programmercarl.com/0142.%E7%8E%AF%E5%BD%A2%E9%93%BE%E8%A1%A8II.html),不仅仅要找环,还要找环的入口。 diff --git "a/problems/0142.\347\216\257\345\275\242\351\223\276\350\241\250II.md" "b/problems/0142.\347\216\257\345\275\242\351\223\276\350\241\250II.md" index 112aa8cfbf..7f944345f2 100644 --- "a/problems/0142.\347\216\257\345\275\242\351\223\276\350\241\250II.md" +++ "b/problems/0142.\347\216\257\345\275\242\351\223\276\350\241\250II.md" @@ -57,7 +57,7 @@ fast和slow各自再走一步, fast和slow就相遇了 动画如下: -![141.环形链表](https://tva1.sinaimg.cn/large/008eGmZEly1goo4xglk9yg30fs0b6u0x.gif) +![141.环形链表](https://code-thinking.cdn.bcebos.com/gifs/141.%E7%8E%AF%E5%BD%A2%E9%93%BE%E8%A1%A8.gif) ### 如果有环,如何找到这个环的入口 @@ -101,7 +101,7 @@ fast指针走过的节点数:` x + y + n (y + z)`,n为fast指针在环内走 动画如下: -![142.环形链表II(求入口)](https://tva1.sinaimg.cn/large/008eGmZEly1goo58gauidg30fw0bi4qr.gif) +![142.环形链表II(求入口)](https://code-thinking.cdn.bcebos.com/gifs/142.%E7%8E%AF%E5%BD%A2%E9%93%BE%E8%A1%A8II%EF%BC%88%E6%B1%82%E5%85%A5%E5%8F%A3%EF%BC%89.gif) 那么 n如果大于1是什么情况呢,就是fast指针在环形转n圈之后才遇到 slow指针。 diff --git "a/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\345\271\277\346\220\234\347\211\210.md" "b/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\345\271\277\346\220\234\347\211\210.md" index 021cb6d202..39af9f50a3 100644 --- "a/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\345\271\277\346\220\234\347\211\210.md" +++ "b/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\345\271\277\346\220\234\347\211\210.md" @@ -103,7 +103,7 @@ void bfs(vector>& grid, vector>& visited, int x, int y } ``` -以上两个版本其实,其实只有细微区别,就是 `visited[x][y] = true;` 放在的地方,着去取决于我们对 代码中队列的定义,队列中的节点就表示已经走过的节点。 **所以只要加入队列,理解标记该节点走过**。 +以上两个版本其实,其实只有细微区别,就是 `visited[x][y] = true;` 放在的地方,着去取决于我们对 代码中队列的定义,队列中的节点就表示已经走过的节点。 **所以只要加入队列,立即标记该节点走过**。 本题完整广搜代码: diff --git "a/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md" "b/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md" index da674eef58..44146bb4fd 100644 --- "a/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md" +++ "b/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md" @@ -33,7 +33,7 @@ 我们拿有示例中的链表来举例,如动画所示:(纠正:动画应该是先移动pre,在移动cur) -![](https://tva1.sinaimg.cn/large/008eGmZEly1gnrf1oboupg30gy0c44qp.gif) +![](https://code-thinking.cdn.bcebos.com/gifs/206.%E7%BF%BB%E8%BD%AC%E9%93%BE%E8%A1%A8.gif) 首先定义一个cur指针,指向头结点,再定义一个pre指针,初始化为null。 diff --git "a/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" "b/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" index ad2a7de27b..62e154b8e4 100644 --- "a/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" @@ -53,7 +53,7 @@ 我们下文以前序遍历为例,通过动画来看一下翻转的过程: -![翻转二叉树](https://tva1.sinaimg.cn/large/008eGmZEly1gnakm26jtog30e409s4qp.gif) +![翻转二叉树](https://code-thinking.cdn.bcebos.com/gifs/%E7%BF%BB%E8%BD%AC%E4%BA%8C%E5%8F%89%E6%A0%91.gif) 我们来看一下递归三部曲: diff --git "a/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" "b/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" index 904a0527a2..9f84a5cd78 100644 --- "a/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" +++ "b/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" @@ -43,7 +43,7 @@ 操作动画如下: -![242.有效的字母异位词](https://tva1.sinaimg.cn/large/008eGmZEly1govxyg83bng30ds09ob29.gif) +![242.有效的字母异位词](https://code-thinking.cdn.bcebos.com/gifs/242.%E6%9C%89%E6%95%88%E7%9A%84%E5%AD%97%E6%AF%8D%E5%BC%82%E4%BD%8D%E8%AF%8D.gif) 定义一个数组叫做record用来上记录字符串s里字符出现的次数。 diff --git "a/problems/0283.\347\247\273\345\212\250\351\233\266.md" "b/problems/0283.\347\247\273\345\212\250\351\233\266.md" index bf388def58..22d6428c10 100644 --- "a/problems/0283.\347\247\273\345\212\250\351\233\266.md" +++ "b/problems/0283.\347\247\273\345\212\250\351\233\266.md" @@ -36,7 +36,7 @@ 如动画所示: -![移动零](https://tva1.sinaimg.cn/large/e6c9d24ely1gojdlrvqqig20jc0dakjn.gif) +![移动零](https://code-thinking.cdn.bcebos.com/gifs/283.%E7%A7%BB%E5%8A%A8%E9%9B%B6.gif) C++代码如下: diff --git "a/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" "b/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" index c4803311d3..6ffbac26a0 100644 --- "a/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" @@ -69,7 +69,7 @@ 以字符串`hello`为例,过程如下: -![344.反转字符串](https://tva1.sinaimg.cn/large/008eGmZEly1gp0fvi91pfg30de0akwnq.gif) +![344.反转字符串](https://code-thinking.cdn.bcebos.com/gifs/344.%E5%8F%8D%E8%BD%AC%E5%AD%97%E7%AC%A6%E4%B8%B2.gif) 不难写出如下C++代码: diff --git "a/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" "b/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" index a25b33ef21..facdb2f938 100644 --- "a/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" +++ "b/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" @@ -68,7 +68,7 @@ if (root == nullptr) return root; 第五种情况有点难以理解,看下面动画: -![450.删除二叉搜索树中的节点](https://tva1.sinaimg.cn/large/008eGmZEly1gnbj3k596mg30dq0aigyz.gif) +![450.删除二叉搜索树中的节点](https://code-thinking.cdn.bcebos.com/gifs/450.%E5%88%A0%E9%99%A4%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91%E4%B8%AD%E7%9A%84%E8%8A%82%E7%82%B9.gif) 动画中的二叉搜索树中,删除元素7, 那么删除节点(元素7)的左孩子就是5,删除节点(元素7)的右子树的最左面节点是元素8。 diff --git "a/problems/0516.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\345\272\217\345\210\227.md" "b/problems/0516.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\345\272\217\345\210\227.md" index fc97a9523b..c8f10c242e 100644 --- "a/problems/0516.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0516.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\345\272\217\345\210\227.md" @@ -56,7 +56,7 @@ (如果这里看不懂,回忆一下dp[i][j]的定义) -如果s[i]与s[j]不相同,说明s[i]和s[j]的同时加入 并不能增加[i,j]区间回文子串的长度,那么分别加入s[i]、s[j]看看哪一个可以组成最长的回文子序列。 +如果s[i]与s[j]不相同,说明s[i]和s[j]的同时加入 并不能增加[i,j]区间回文子序列的长度,那么分别加入s[i]、s[j]看看哪一个可以组成最长的回文子序列。 加入s[j]的回文子序列长度为dp[i + 1][j]。 @@ -91,13 +91,13 @@ for (int i = 0; i < s.size(); i++) dp[i][i] = 1; 4. 确定遍历顺序 -从递推公式dp[i][j] = dp[i + 1][j - 1] + 2 和 dp[i][j] = max(dp[i + 1][j], dp[i][j - 1]) 可以看出,dp[i][j]是依赖于dp[i + 1][j - 1] 和 dp[i + 1][j], +从递归公式中,可以看出,dp[i][j] 依赖于 dp[i + 1][j - 1] ,dp[i + 1][j] 和 dp[i][j - 1],如图: -也就是从矩阵的角度来说,dp[i][j] 下一行的数据。 **所以遍历i的时候一定要从下到上遍历,这样才能保证,下一行的数据是经过计算的**。 +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20230102172155.png) -递推公式:dp[i][j] = dp[i + 1][j - 1] + 2,dp[i][j] = max(dp[i + 1][j], dp[i][j - 1]) 分别对应着下图中的红色箭头方向,如图: +**所以遍历i的时候一定要从下到上遍历,这样才能保证下一行的数据是经过计算的**。 -![516.最长回文子序列2](https://img-blog.csdnimg.cn/20210127151452993.jpg) +j的话,可以正常从左向右遍历。 代码如下: diff --git "a/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" "b/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" index ca3c118f5a..68c6de1609 100644 --- "a/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" +++ "b/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" @@ -12,9 +12,9 @@ 示例: -输入: "sea", "eat" -输出: 2 -解释: 第一步将"sea"变为"ea",第二步将"eat"变为"ea" +* 输入: "sea", "eat" +* 输出: 2 +* 解释: 第一步将"sea"变为"ea",第二步将"eat"变为"ea" ## 思路 @@ -47,7 +47,10 @@ dp[i][j]:以i-1为结尾的字符串word1,和以j-1位结尾的字符串word 那最后当然是取最小值,所以当word1[i - 1] 与 word2[j - 1]不相同的时候,递推公式:dp[i][j] = min({dp[i - 1][j - 1] + 2, dp[i - 1][j] + 1, dp[i][j - 1] + 1}); -因为dp[i - 1][j - 1] + 1等于 dp[i - 1][j] 或 dp[i][j - 1],所以递推公式可简化为:dp[i][j] = min(dp[i - 1][j] + 1, dp[i][j - 1] + 1); + +因为 dp[i][j - 1] + 1 = dp[i - 1][j - 1] + 2,所以递推公式可简化为:dp[i][j] = min(dp[i - 1][j] + 1, dp[i][j - 1] + 1); + +这里可能不少录友有点迷糊,从字面上理解 就是 当 同时删word1[i - 1]和word2[j - 1],dp[i][j-1] 本来就不考虑 word2[j - 1]了,那么我在删 word1[i - 1],是不是就达到两个元素都删除的效果,即 dp[i][j-1] + 1。 3. dp数组如何初始化 diff --git "a/problems/0617.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md" "b/problems/0617.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md" index a69de7c69d..058deb8521 100644 --- "a/problems/0617.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0617.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md" @@ -40,7 +40,7 @@ 动画如下: -![617.合并二叉树](https://tva1.sinaimg.cn/large/008eGmZEly1gnbjjq8h16g30e20cwnpd.gif) +![617.合并二叉树](https://code-thinking.cdn.bcebos.com/gifs/617.%E5%90%88%E5%B9%B6%E4%BA%8C%E5%8F%89%E6%A0%91.gif) 那么我们来按照递归三部曲来解决: diff --git "a/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" "b/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" index 847a610f14..df55d24da3 100644 --- "a/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" +++ "b/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" @@ -14,25 +14,21 @@ 示例 1: -输入:"abc" -输出:3 -解释:三个回文子串: "a", "b", "c" +* 输入:"abc" +* 输出:3 +* 解释:三个回文子串: "a", "b", "c" 示例 2: -输入:"aaa" -输出:6 -解释:6个回文子串: "a", "a", "a", "aa", "aa", "aaa" +* 输入:"aaa" +* 输出:6 +* 解释:6个回文子串: "a", "a", "a", "aa", "aa", "aaa" -提示: - -输入的字符串长度不会超过 1000 。 +提示:输入的字符串长度不会超过 1000 。 ## 暴力解法 -两层for循环,遍历区间起始位置和终止位置,然后判断这个区间是不是回文。 - -时间复杂度:O(n^3) +两层for循环,遍历区间起始位置和终止位置,然后还需要一层遍历判断这个区间是不是回文。所以时间复杂度:O(n^3) ## 动态规划 @@ -40,6 +36,23 @@ 1. 确定dp数组(dp table)以及下标的含义 +如果大家做了很多这种子序列相关的题目,在定义dp数组的时候 很自然就会想题目求什么,我们就如何定义dp数组。 + +绝大多数题目确实是这样,不过本题如果我们定义,dp[i] 为 下标i结尾的字符串有 dp[i]个回文串的话,我们会发现很难找到递归关系。 + +dp[i] 和 dp[i-1] ,dp[i + 1] 看上去都没啥关系。 + +所以我们要看回文串的性质。 如图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20230102170752.png) + +我们在判断字符串S是否是回文,那么如果我们知道 s[1],s[2],s[3] 这个子串是回文的,那么只需要比较 s[0]和s[4]这两个元素是否相同,如果相同的话,这个字符串s 就是回文串。 + + +那么此时我们是不是能找到一种递归关系,也就是判断一个子字符串(字符串的下表范围[i,j])是否回文,依赖于,子字符串(下表范围[i + 1, j - 1])) 是否是回文。 + +所以为了明确这种递归关系,我们的dp数组是要定义成一位二维dp数组。 + 布尔类型的dp[i][j]:表示区间范围[i,j] (注意是左闭右闭)的子串是否是回文子串,如果是dp[i][j]为true,否则为false。 diff --git "a/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" "b/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" index 2bc5e240b8..0f473228ad 100644 --- "a/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" @@ -34,7 +34,7 @@ 最大二叉树的构建过程如下: -![654.最大二叉树](https://tva1.sinaimg.cn/large/008eGmZEly1gnbjuvioezg30dw0921ck.gif) +![654.最大二叉树](https://code-thinking.cdn.bcebos.com/gifs/654.%E6%9C%80%E5%A4%A7%E4%BA%8C%E5%8F%89%E6%A0%91.gif) 构造树一般采用的是前序遍历,因为先构造中间节点,然后递归构造左子树和右子树。 diff --git "a/problems/0695.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" "b/problems/0695.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" index 76740ef1f2..581f30a852 100644 --- "a/problems/0695.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" +++ "b/problems/0695.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" @@ -3,8 +3,11 @@

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+ # 695. 岛屿的最大面积 +[力扣题目链接](https://leetcode.cn/problems/max-area-of-island/) + 给你一个大小为 m x n 的二进制矩阵 grid 。 岛屿 是由一些相邻的 1 (代表土地) 构成的组合,这里的「相邻」要求两个 1 必须在 水平或者竖直的四个方向上 相邻。你可以假设 grid 的四个边缘都被 0(代表水)包围着。 @@ -15,9 +18,9 @@ ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20220729111528.png) -输入:grid = [[0,0,1,0,0,0,0,1,0,0,0,0,0],[0,0,0,0,0,0,0,1,1,1,0,0,0],[0,1,1,0,1,0,0,0,0,0,0,0,0],[0,1,0,0,1,1,0,0,1,0,1,0,0],[0,1,0,0,1,1,0,0,1,1,1,0,0],[0,0,0,0,0,0,0,0,0,0,1,0,0],[0,0,0,0,0,0,0,1,1,1,0,0,0],[0,0,0,0,0,0,0,1,1,0,0,0,0]] -输出:6 -解释:答案不应该是 11 ,因为岛屿只能包含水平或垂直这四个方向上的 1 。 +* 输入:grid = [[0,0,1,0,0,0,0,1,0,0,0,0,0],[0,0,0,0,0,0,0,1,1,1,0,0,0],[0,1,1,0,1,0,0,0,0,0,0,0,0],[0,1,0,0,1,1,0,0,1,0,1,0,0],[0,1,0,0,1,1,0,0,1,1,1,0,0],[0,0,0,0,0,0,0,0,0,0,1,0,0],[0,0,0,0,0,0,0,1,1,1,0,0,0],[0,0,0,0,0,0,0,1,1,0,0,0,0]] +* 输出:6 +* 解释:答案不应该是 11 ,因为岛屿只能包含水平或垂直这四个方向上的 1 。 # 思路 @@ -28,18 +31,23 @@ ![图一](https://code-thinking-1253855093.file.myqcloud.com/pics/20220726094200.png) -这道题目也是 dfs bfs基础类题目。 +这道题目也是 dfs bfs基础类题目,就是搜索每个岛屿上“1”的数量,然后取一个最大的。 + +本题思路上比较简单,难点其实都是 dfs 和 bfs的理论基础,关于理论基础我在这里都有详细讲解 : + +* [DFS理论基础](https://leetcode.cn/problems/all-paths-from-source-to-target/solution/by-carlsun-2-66pf/) +* [BFS理论基础](https://leetcode.cn/circle/discuss/V3FulB/) ## DFS 很多同学,写dfs其实也是凭感觉来,有的时候dfs函数中写终止条件才能过,有的时候 dfs函数不写终止添加也能过! -这里其实涉及到dfs的两种写法, +这里其实涉及到dfs的两种写法。 -以下代码使用dfs实现,如果对dfs不太了解的话,建议先看这篇题解:[797.所有可能的路径](https://leetcode.cn/problems/all-paths-from-source-to-target/solution/by-carlsun-2-66pf/), +写法一,dfs只处理下一个节点,即在主函数遇到岛屿就计数为1,dfs处理接下来的相邻陆地 -写法一,dfs只处理下一个节点 ```CPP +// 版本一 class Solution { private: int count; @@ -67,7 +75,7 @@ public: for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { if (!visited[i][j] && grid[i][j] == 1) { - count = 1; + count = 1; // 因为dfs处理下一个节点,所以这里遇到陆地了就先计数,dfs处理接下来的相邻陆地 visited[i][j] = true; dfs(grid, visited, i, j); // 将与其链接的陆地都标记上 true result = max(result, count); @@ -79,9 +87,11 @@ public: }; ``` -写法二,dfs处理当前节点 +写法二,dfs处理当前节点,即即在主函数遇到岛屿就计数为0,dfs处理接下来的全部陆地 + dfs ```CPP +// 版本二 class Solution { private: int count; @@ -106,7 +116,7 @@ public: for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { if (!visited[i][j] && grid[i][j] == 1) { - count = 0; + count = 0; // 因为dfs处理当前节点,所以遇到陆地计数为0,进dfs之后在开始从1计数 dfs(grid, visited, i, j); // 将与其链接的陆地都标记上 true result = max(result, count); } @@ -117,8 +127,13 @@ public: }; ``` +大家通过注释可以发现,两种写法,版本一,在主函数遇到陆地就计数为1,接下来的相邻陆地都在dfs中计算。 版本二 在主函数遇到陆地 计数为0,也就是不计数,陆地数量都去dfs里做计算。 + +这也是为什么大家看了很多,dfs的写法,发现写法怎么都不一样呢? 其实这就是根本原因。 + 以上两种写法的区别,我在题解: [DFS,BDF 你没注意的细节都给你列出来了!LeetCode:200. 岛屿数量](https://leetcode.cn/problems/number-of-islands/solution/by-carlsun-2-n72a/)做了详细介绍。 + ## BFS 关于广度优先搜索,如果大家还不了解的话,看这里:[广度优先搜索精讲](https://leetcode.cn/circle/discuss/V3FulB/) diff --git "a/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" "b/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" index ebfe139003..955e9d3382 100644 --- "a/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" +++ "b/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" @@ -34,7 +34,7 @@ 如下演示视频中可以看出:只要按照二叉搜索树的规则去遍历,遇到空节点就插入节点就可以了。 -![701.二叉搜索树中的插入操作](https://tva1.sinaimg.cn/large/008eGmZEly1gnbk63ina5g30eo08waja.gif) +![701.二叉搜索树中的插入操作](https://code-thinking.cdn.bcebos.com/gifs/701.%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91%E4%B8%AD%E7%9A%84%E6%8F%92%E5%85%A5%E6%93%8D%E4%BD%9C.gif) 例如插入元素10 ,需要找到末尾节点插入便可,一样的道理来插入元素15,插入元素0,插入元素6,**需要调整二叉树的结构么? 并不需要。**。 diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\347\273\237\344\270\200\350\277\255\344\273\243\346\263\225.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\347\273\237\344\270\200\350\277\255\344\273\243\346\263\225.md" index 69c23e5c6c..c44bbb9937 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\347\273\237\344\270\200\350\277\255\344\273\243\346\263\225.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\347\273\237\344\270\200\350\277\255\344\273\243\346\263\225.md" @@ -63,7 +63,7 @@ public: 看代码有点抽象我们来看一下动画(中序遍历): -![中序遍历迭代(统一写法)](https://tva1.sinaimg.cn/large/008eGmZEly1gnbmq3btubg30em09ue82.gif) +![中序遍历迭代(统一写法)](https://code-thinking.cdn.bcebos.com/gifs/%E4%B8%AD%E5%BA%8F%E9%81%8D%E5%8E%86%E8%BF%AD%E4%BB%A3%EF%BC%88%E7%BB%9F%E4%B8%80%E5%86%99%E6%B3%95%EF%BC%89.gif) 动画中,result数组就是最终结果集。 diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" index 2f67c323fa..0814866fde 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" @@ -37,7 +37,7 @@ 动画如下: -![二叉树前序遍历(迭代法)](https://tva1.sinaimg.cn/large/008eGmZEly1gnbmss7603g30eq0d4b2a.gif) +![二叉树前序遍历(迭代法)](https://code-thinking.cdn.bcebos.com/gifs/%E4%BA%8C%E5%8F%89%E6%A0%91%E5%89%8D%E5%BA%8F%E9%81%8D%E5%8E%86%EF%BC%88%E8%BF%AD%E4%BB%A3%E6%B3%95%EF%BC%89.gif) 不难写出如下代码: (**注意代码中空节点不入栈**) @@ -84,7 +84,7 @@ public: 动画如下: -![二叉树中序遍历(迭代法)](https://tva1.sinaimg.cn/large/008eGmZEly1gnbmuj244bg30eq0d4kjm.gif) +![二叉树中序遍历(迭代法)](https://code-thinking.cdn.bcebos.com/gifs/%E4%BA%8C%E5%8F%89%E6%A0%91%E4%B8%AD%E5%BA%8F%E9%81%8D%E5%8E%86%EF%BC%88%E8%BF%AD%E4%BB%A3%E6%B3%95%EF%BC%89.gif) **中序遍历,可以写出如下代码:** diff --git "a/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" "b/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" index ab6eedf7cf..2e1ee1de1b 100644 --- "a/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" +++ "b/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" @@ -25,7 +25,7 @@ i指向新长度的末尾,j指向旧长度的末尾。 -![替换空格](https://tva1.sinaimg.cn/large/e6c9d24ely1go6qmevhgpg20du09m4qp.gif) +![替换空格](https://code-thinking.cdn.bcebos.com/gifs/%E6%9B%BF%E6%8D%A2%E7%A9%BA%E6%A0%BC.gif) 有同学问了,为什么要从后向前填充,从前向后填充不行么? diff --git "a/problems/\350\264\252\345\277\203\347\256\227\346\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\350\264\252\345\277\203\347\256\227\346\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md" index ce3a348889..0b90da6a7e 100644 --- "a/problems/\350\264\252\345\277\203\347\256\227\346\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\350\264\252\345\277\203\347\256\227\346\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -26,6 +26,7 @@ 再举一个例子如果是 有一堆盒子,你有一个背包体积为n,如何把背包尽可能装满,如果还每次选最大的盒子,就不行了。这时候就需要动态规划。动态规划的问题在下一个系列会详细讲解。 + ## 贪心的套路(什么时候用贪心) 很多同学做贪心的题目的时候,想不出来是贪心,想知道有没有什么套路可以一看就看出来是贪心。 @@ -74,7 +75,10 @@ * 求解每一个子问题的最优解 * 将局部最优解堆叠成全局最优解 -其实这个分的有点细了,真正做题的时候很难分出这么详细的解题步骤,可能就是因为贪心的题目往往还和其他方面的知识混在一起。 +这个四步其实过于理论化了,我们平时在做贪心类的题目 很难去按照这四步去思考,真是有点“鸡肋”。 + +做题的时候,只要想清楚 局部最优 是什么,如果推导出全局最优,其实就够了。 + ## 总结 @@ -84,9 +88,6 @@ 最后给出贪心的一般解题步骤,大家可以发现这个解题步骤也是比较抽象的,不像是二叉树,回溯算法,给出了那么具体的解题套路和模板。 -本篇没有配图,其实可以找一些动漫周边或者搞笑的图配一配(符合大多数公众号文章的作风),但这不是我的风格,所以本篇文字描述足以! - -

From 256ca509ab75b5108a3c315ef6449431b0921def Mon Sep 17 00:00:00 2001 From: Zeeland Date: Fri, 6 Jan 2023 17:23:51 +0800 Subject: [PATCH 1432/3019] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96Python?= =?UTF-8?q?=E8=AF=AD=E6=B3=95=E9=AB=98=E4=BA=AE=E6=98=BE=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "problems/0042.\346\216\245\351\233\250\346\260\264.md" | 4 ++-- ...32\204\346\211\200\346\234\211\350\267\257\345\276\204.md" | 4 ++-- ...36\204\345\273\272\344\272\214\345\217\211\346\240\221.md" | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git "a/problems/0042.\346\216\245\351\233\250\346\260\264.md" "b/problems/0042.\346\216\245\351\233\250\346\260\264.md" index e8dd3690ba..ac6f20f957 100644 --- "a/problems/0042.\346\216\245\351\233\250\346\260\264.md" +++ "b/problems/0042.\346\216\245\351\233\250\346\260\264.md" @@ -471,7 +471,7 @@ class Solution { ### Python: 双指针法 -```python3 +```Python class Solution: def trap(self, height: List[int]) -> int: res = 0 @@ -510,7 +510,7 @@ class Solution: return result ``` 单调栈 -```python3 +```Python class Solution: def trap(self, height: List[int]) -> int: # 单调栈 diff --git "a/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" "b/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" index 2d7966715d..d0c190a0f6 100644 --- "a/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" +++ "b/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" @@ -468,7 +468,7 @@ class Solution { --- ## Python: 递归法+隐形回溯 -```Python3 +```Python # Definition for a binary tree node. # class TreeNode: # def __init__(self, val=0, left=None, right=None): @@ -499,7 +499,7 @@ class Solution: 迭代法: -```python3 +```Python from collections import deque diff --git "a/problems/\345\211\215\345\272\217/ACM\346\250\241\345\274\217\345\246\202\344\275\225\346\236\204\345\273\272\344\272\214\345\217\211\346\240\221.md" "b/problems/\345\211\215\345\272\217/ACM\346\250\241\345\274\217\345\246\202\344\275\225\346\236\204\345\273\272\344\272\214\345\217\211\346\240\221.md" index 01d5b25519..42bf7af0ba 100644 --- "a/problems/\345\211\215\345\272\217/ACM\346\250\241\345\274\217\345\246\202\344\275\225\346\236\204\345\273\272\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/\345\211\215\345\272\217/ACM\346\250\241\345\274\217\345\246\202\344\275\225\346\236\204\345\273\272\344\272\214\345\217\211\346\240\221.md" @@ -280,7 +280,7 @@ public class Solution { ## Python -```Python3 +```Python class TreeNode: def __init__(self, val = 0, left = None, right = None): self.val = val From 9b07639364f2586815b10fcec5cf209b169241a8 Mon Sep 17 00:00:00 2001 From: Logen <47022821+Logenleedev@users.noreply.github.com> Date: Sat, 7 Jan 2023 14:08:19 -0600 Subject: [PATCH 1433/3019] fix minor code style --- ...\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" "b/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" index a12d8f76bd..dc12ae2336 100644 --- "a/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" +++ "b/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" @@ -442,7 +442,7 @@ class Solution: while left <= right and s[left] == ' ': #去除开头的空格 left += 1 while left <= right and s[right] == ' ': #去除结尾的空格 - right = right-1 + right -= 1 tmp = [] while left <= right: #去除单词中间多余的空格 if s[left] != ' ': From 2d2babdaf0ce7ceb3f61c26c7e959ed2776bda62 Mon Sep 17 00:00:00 2001 From: hbingzhi Date: Sun, 8 Jan 2023 12:58:54 +0800 Subject: [PATCH 1434/3019] =?UTF-8?q?349.=E6=9C=80=E5=90=8E=E8=BF=94?= =?UTF-8?q?=E5=9B=9E=E6=95=B0=E7=BB=84=E6=B7=BB=E5=8A=A0=E5=8F=A6=E4=B8=80?= =?UTF-8?q?=E7=A7=8D=E5=86=99=E6=B3=95=EF=BC=8C=E6=9B=B4=E5=A4=9A=E4=BA=BA?= =?UTF-8?q?=E5=AE=B9=E6=98=93=E7=90=86=E8=A7=A3=E7=9C=8B=E6=87=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\273\204\347\232\204\344\272\244\351\233\206.md" | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git "a/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" "b/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" index 2e98ef6f22..6f5a34e796 100644 --- "a/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" +++ "b/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" @@ -137,8 +137,18 @@ class Solution { resSet.add(i); } } - //将结果几何转为数组 + + //方法1:直接将结果几何转为数组 return resSet.stream().mapToInt(x -> x).toArray(); + + //方法2:另外申请一个数组存放setRes中的元素,最后返回数组 + int[] arr = new int[setRes.size()]; + int j = 0; + for(int i : setRes){ + arr[j++] = i; + } + + return arr; } } ``` @@ -423,3 +433,4 @@ C#: + From a008a740694b4fd99a307dab9e05a1f9276605f2 Mon Sep 17 00:00:00 2001 From: Logen <47022821+Logenleedev@users.noreply.github.com> Date: Sun, 8 Jan 2023 08:21:42 -0600 Subject: [PATCH 1435/3019] =?UTF-8?q?=E6=9B=B4=E6=94=B9=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/\345\211\215\345\272\217/vim.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/\345\211\215\345\272\217/vim.md" "b/problems/\345\211\215\345\272\217/vim.md" index f84e70aca7..5c5910d206 100644 --- "a/problems/\345\211\215\345\272\217/vim.md" +++ "b/problems/\345\211\215\345\272\217/vim.md" @@ -66,7 +66,7 @@ IDE那么很吃内存,打开个IDE卡半天,用VIM就很轻便了,秒开 ## 安装 -PowerVim的安防非常简单,我已经写好了安装脚本,只要执行以下就可以安装,而且不会影响你之前的vim配置,之前的配置都给做了备份,大家看一下脚本就知道备份在哪里了。 +PowerVim的安装非常简单,我已经写好了安装脚本,只要执行以下就可以安装,而且不会影响你之前的vim配置,之前的配置都给做了备份,大家看一下脚本就知道备份在哪里了。 安装过程非常简单: ```bash From aad6b8cee27afa237dca3997fa720705410eac7a Mon Sep 17 00:00:00 2001 From: Logen <47022821+Logenleedev@users.noreply.github.com> Date: Sun, 8 Jan 2023 16:37:47 -0600 Subject: [PATCH 1436/3019] =?UTF-8?q?=E6=95=B4=E7=90=86=E4=BA=86python=20v?= =?UTF-8?q?ersion=E7=9A=84=E9=80=BB=E8=BE=91=E3=80=82=E5=81=9A=E4=BA=86?= =?UTF-8?q?=E4=B8=80=E4=B8=8B=E7=AE=80=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...02\345\272\217\351\201\215\345\216\206.md" | 2 +- ...72\347\264\257\345\212\240\346\240\221.md" | 29 +++++++++---------- 2 files changed, 15 insertions(+), 16 deletions(-) diff --git "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" index 406242a786..2842528191 100644 --- "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" +++ "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" @@ -23,7 +23,7 @@ * 111.二叉树的最小深度 -![我要打十个](https://tva1.sinaimg.cn/large/008eGmZEly1gnadnltbpjg309603w4qp.gif) +![我要打十个](https://tva1.sinaimg.cn/large/008eGmZEly1gPnadnltbpjg309603w4qp.gif) diff --git "a/problems/0538.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md" "b/problems/0538.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md" index ec12c525c8..d2e98dc82b 100644 --- "a/problems/0538.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md" +++ "b/problems/0538.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md" @@ -209,29 +209,28 @@ class Solution { # self.right = right class Solution: def __init__(self): - self.pre = TreeNode() + self.count = 0 def convertBST(self, root: Optional[TreeNode]) -> Optional[TreeNode]: + if root == None: + return ''' 倒序累加替换: - [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) # 右 + # 右 + self.convertBST(root.right) + # 中 # 中节点:用当前root的值加上pre的值 - root.val += self.pre.val # 中 - self.pre = root + self.count += root.val + + root.val = self.count + + # 左 + self.convertBST(root.left) - self.traversal(root.left) # 左 + return root + ``` ## Go From 0290d6f1f4170585542eb553ea3def2649af8b54 Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Mon, 9 Jan 2023 16:23:31 +0800 Subject: [PATCH 1437/3019] Update --- ...26\350\276\221\350\267\235\347\246\273.md" | 4 - ...06\345\212\250\345\272\217\345\210\227.md" | 134 ++++++++++++++---- ...47\344\272\272\345\267\245\345\262\233.md" | 58 +++++++- ...60\347\232\204\346\225\260\351\207\217.md" | 4 +- 4 files changed, 160 insertions(+), 40 deletions(-) diff --git "a/problems/0072.\347\274\226\350\276\221\350\267\235\347\246\273.md" "b/problems/0072.\347\274\226\350\276\221\350\267\235\347\246\273.md" index a34439e608..8a877d2088 100644 --- "a/problems/0072.\347\274\226\350\276\221\350\267\235\347\246\273.md" +++ "b/problems/0072.\347\274\226\350\276\221\350\267\235\347\246\273.md" @@ -20,24 +20,20 @@ * 输入:word1 = "horse", word2 = "ros" * 输出:3 * 解释: -``` horse -> rorse (将 'h' 替换为 'r') rorse -> rose (删除 'r') rose -> ros (删除 'e') -`` * 示例 2: * 输入:word1 = "intention", word2 = "execution" * 输出:5 * 解释: -``` intention -> inention (删除 't') inention -> enention (将 'i' 替换为 'e') enention -> exention (将 'n' 替换为 'x') exention -> exection (将 'n' 替换为 'c') exection -> execution (插入 'u') -``` 提示: diff --git "a/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" "b/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" index 723d1d9a0f..35daf3013c 100644 --- "a/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" +++ "b/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" @@ -53,21 +53,109 @@ **实际操作上,其实连删除的操作都不用做,因为题目要求的是最长摆动子序列的长度,所以只需要统计数组的峰值数量就可以了(相当于是删除单一坡度上的节点,然后统计长度)** -**这就是贪心所贪的地方,让峰值尽可能的保持峰值,然后删除单一坡度上的节点**。 +**这就是贪心所贪的地方,让峰值尽可能的保持峰值,然后删除单一坡度上的节点** -本题代码实现中,还有一些技巧,例如统计峰值的时候,数组最左面和最右面是最不好统计的。 +在计算是否有峰值的时候,大家知道遍历的下标i ,计算prediff(nums[i] - nums[i-1]) 和 curdiff(nums[i+1] - nums[i]),如果`prediff < 0 && curdiff > 0` 或者 `prediff > 0 && curdiff < 0` 此时就有波动就需要统计。 -例如序列[2,5],它的峰值数量是2,如果靠统计差值来计算峰值个数就需要考虑数组最左面和最右面的特殊情况。 +这是我们思考本题的一个大题思路,但本题要考虑三种情况: -所以可以针对序列[2,5],可以假设为[2,2,5],这样它就有坡度了即preDiff = 0,如图: +1. 情况一:相同数字连续 +2. 情况二:数组首尾两端 +3. 情况三:单调坡度有平坡 + +### 情况一:相同数字连续 + +例如 [1,2,2,2,1]这样的数组,如图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20230106170449.png) + +它的摇摆序列长度是多少呢? **其实是长度是3**,也就是我们在删除的时候 要不删除左面的三个2,要不就删除右边的三个2。 + +如图,可以统一规则,删除左边的三个2: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20230106172613.png) + +在图中,当i指向第一个2的时候,`prediff > 0 && curdiff = 0` ,当 i 指向最后一个2的时候 `prediff = 0 && curdiff < 0`。 + +如果我们采用,删左面三个2的规则,那么 当 `prediff = 0 && curdiff < 0` 也要记录一个峰值,因为他是把之前相同的元素都删掉留下的峰值。 + +所以我们记录峰值的条件应该是: `(preDiff <= 0 && curDiff > 0) || (preDiff >= 0 && curDiff < 0)`,为什么这里允许 prediff == 0 ,就是为了 上面我说的这种情况。 + + +### 情况二:数组首尾两端 + + +所以本题统计峰值的时候,数组最左面和最右面如果统计呢? + +题目中说了,如果只有两个不同的元素,那摆动序列也是2。 + +例如序列[2,5],如果靠统计差值来计算峰值个数就需要考虑数组最左面和最右面的特殊情况。 + +因为我们在计算 prediff(nums[i] - nums[i-1]) 和 curdiff(nums[i+1] - nums[i])的时候,至少需要三个数字才能计算,而数组只有两个数字。 + +这里我们可以写死,就是 如果只有两个元素,且元素不同,那么结果为2。 + +不写死的话,如果和我们的判断规则结合在一起呢? + +可以假设,数组最前面还有一个数字,那这个数字应该是什么呢? + +之前我们在 讨论 情况一:相同数字连续 的时候, prediff = 0 ,curdiff < 0 或者 >0 也记为波谷。 + +那么为了规则统一,针对序列[2,5],可以假设为[2,2,5],这样它就有坡度了即preDiff = 0,如图: ![376.摆动序列1](https://img-blog.csdnimg.cn/20201124174357612.png) 针对以上情形,result初始为1(默认最右面有一个峰值),此时curDiff > 0 && preDiff <= 0,那么result++(计算了左面的峰值),最后得到的result就是2(峰值个数为2即摆动序列长度为2) -C++代码如下(和上图是对应的逻辑): +经过以上分析后,我们可以写出如下代码: + +```CPP +// 版本一 +class Solution { +public: + int wiggleMaxLength(vector& nums) { + if (nums.size() <= 1) return nums.size(); + int curDiff = 0; // 当前一对差值 + int preDiff = 0; // 前一对差值 + int result = 1; // 记录峰值个数,序列默认序列最右边有一个峰值 + for (int i = 0; i < nums.size() - 1; i++) { + curDiff = nums[i + 1] - nums[i]; + // 出现峰值 + if ((preDiff <= 0 && curDiff > 0) || (preDiff >= 0 && curDiff < 0)) { + result++; + } + preDiff = curDiff; + } + return result; + } +}; +``` +* 时间复杂度:O(n) +* 空间复杂度:O(1) + +此时大家是不是发现 以上代码提交也不能通过本题? + +所以此时我们要讨论情况三! + +### 情况三:单调坡度有平坡 + +在版本一中,我们忽略了一种情况,即 如果在一个单调坡度上有平坡,例如[1,2,2,2,3,4],如图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20230108171505.png) + +图中,我们可以看出,版本一的代码在三个地方记录峰值,但其实结果因为是2,因为 单调中的平坡 不能算峰值(即摆动)。 + +之所以版本一会出问题,是因为我们事实更新了 prediff。 + +那么我们应该什么时候更新prediff呢? + +我们只需要在 这个坡度 摆动变化的时候,更新prediff就行,这样prediff在 单调区间有平坡的时候 就不会发生变化,造成我们的误判。 + +所以本题的最终代码为: ```CPP + +// 版本二 class Solution { public: int wiggleMaxLength(vector& nums) { @@ -78,9 +166,9 @@ public: for (int i = 0; i < nums.size() - 1; i++) { curDiff = nums[i + 1] - nums[i]; // 出现峰值 - if ((curDiff > 0 && preDiff <= 0) || (preDiff >= 0 && curDiff < 0)) { + if ((preDiff <= 0 && curDiff > 0) || (preDiff >= 0 && curDiff < 0)) { result++; - preDiff = curDiff; + preDiff = curDiff; // 注意这里,只在摆动变化的时候更新prediff } } return result; @@ -88,8 +176,11 @@ public: }; ``` -* 时间复杂度:O(n) -* 空间复杂度:O(1) +其实本题看起来好像简单,但需要考虑的情况还是很复杂的,而且很难一次性想到位。 + +**本题异常情况的本质,就是要考虑平坡**, 平坡分两种,一个是 上下中间有平坡,一个是单调有平坡,如图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20230108174452.png) ## 思路2(动态规划) @@ -111,25 +202,19 @@ public: C++代码如下: -```c++ +```CPP 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) - { + for (int i = 1; i < nums.size(); ++i) { dp[i][0] = dp[i][1] = 1; - - for (int j = 0; j < i; ++j) - { + 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) - { + for (int j = 0; j < i; ++j) { if (nums[j] < nums[i]) dp[i][0] = max(dp[i][0], dp[j][1] + 1); } } @@ -153,17 +238,6 @@ public: 空间复杂度:O(n) -## 总结 - -**贪心的题目说简单有的时候就是常识,说难就难在都不知道该怎么用贪心**。 - -本题大家如果要去模拟删除元素达到最长摆动子序列的过程,那指定绕里面去了,一时半会拔不出来。 - -而这道题目有什么技巧说一下子能想到贪心么? - -其实也没有,类似的题目做过了就会想到。 - -此时大家就应该了解了:保持区间波动,只需要把单调区间上的元素移除就可以了。 diff --git "a/problems/0827.\346\234\200\345\244\247\344\272\272\345\267\245\345\262\233.md" "b/problems/0827.\346\234\200\345\244\247\344\272\272\345\267\245\345\262\233.md" index fb0c797eb6..05d82f7e65 100644 --- "a/problems/0827.\346\234\200\345\244\247\344\272\272\345\267\245\345\262\233.md" +++ "b/problems/0827.\346\234\200\345\244\247\344\272\272\345\267\245\345\262\233.md" @@ -3,8 +3,11 @@

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+ # 827. 最大人工岛 +[力扣链接](https://leetcode.cn/problems/making-a-large-island/) + 给你一个大小为 n x n 二进制矩阵 grid 。最多 只能将一格 0 变成 1 。 返回执行此操作后,grid 中最大的岛屿面积是多少? @@ -30,7 +33,9 @@ 本题的一个暴力想法,应该是遍历地图尝试 将每一个 0 改成1,然后去搜索地图中的最大的岛屿面积。 -计算地图的最大面积:遍历地图 + 深搜岛屿,时间复杂度为 n * n +计算地图的最大面积:遍历地图 + 深搜岛屿,时间复杂度为 n * n。 + +(其实使用深搜还是广搜都是可以的,其目的就是遍历岛屿做一个标记,相当于染色,那么使用哪个遍历方式都行,以下我用深搜来讲解) 每改变一个0的方格,都需要重新计算一个地图的最大面积,所以 整体时间复杂度为:n^4。 @@ -41,7 +46,7 @@ 其实每次深搜遍历计算最大岛屿面积,我们都做了很多重复的工作。 -只要把深搜就可以并每个岛屿的面积记录下来就好。 +只要用一次深搜把每个岛屿的面积记录下来就好。 第一步:一次遍历地图,得出各个岛屿的面积,并做编号记录。可以使用map记录,key为岛屿编号,value为岛屿面积 第二步:在遍历地图,遍历0的方格(因为要将0变成1),并统计该1(由0变成的1)周边岛屿面积,将其相邻面积相加在一起,遍历所有 0 之后,就可以得出 选一个0变成1 之后的最大面积。 @@ -74,7 +79,7 @@ void dfs(vector>& grid, vector>& visited, int x, int y, int largestIsland(vector>& grid) { int n = grid.size(), m = grid[0].size(); - vector> visited = vector>(n, vector(m, false)); + vector> visited = vector>(n, vector(m, false)); // 标记访问过的点 unordered_map gridNum; int mark = 2; // 记录每个岛屿的编号 bool isAllGrid = true; // 标记是否整个地图都是陆地 @@ -92,9 +97,10 @@ int largestIsland(vector>& grid) { } ``` + 这个过程时间复杂度 n * n 。可能有录友想:分明是两个for循环下面套这一个dfs,时间复杂度怎么回事 n * n呢? -其实大家可以自己看代码的时候,**n * n这个方格地图中,每个节点我们就遍历一次,并不会重复遍历**。 +其实大家可以仔细看一下代码,**n * n这个方格地图中,每个节点我们就遍历一次,并不会重复遍历**。 第二步过程如图所示: @@ -106,6 +112,47 @@ int largestIsland(vector>& grid) { 所以整个解法的时间复杂度,为 n * n + n * n 也就是 n^2。 +当然这里还有一个优化的点,就是 可以不用 visited数组,因为有mark来标记,所以遍历过的grid[i][j]是不等于1的。 + +代码如下: + +```CPP + int dir[4][2] = {0, 1, 1, 0, -1, 0, 0, -1}; // 四个方向 + void dfs(vector>& grid, int x, int y, int mark) { + if (grid[x][y] != 1 || grid[x][y] == 0) return; // 终止条件:访问过的节点 或者 遇到海水 + grid[x][y] = mark; // 给陆地标记新标签 + count++; + for (int i = 0; i < 4; i++) { + int nextx = x + dir[i][0]; + int nexty = y + dir[i][1]; + if (nextx < 0 || nextx >= grid.size() || nexty < 0 || nexty >= grid[0].size()) continue; // 越界了,直接跳过 + dfs(grid, nextx, nexty, mark); + } + } + +public: + int largestIsland(vector>& grid) { + int n = grid.size(), m = grid[0].size(); + unordered_map gridNum; + int mark = 2; // 记录每个岛屿的编号 + bool isAllGrid = true; // 标记是否整个地图都是陆地 + for (int i = 0; i < n; i++) { + for (int j = 0; j < m; j++) { + if (grid[i][j] == 0) isAllGrid = false; + if (grid[i][j] == 1) { + count = 0; + dfs(grid, i, j, mark); // 将与其链接的陆地都标记上 true + gridNum[mark] = count; // 记录每一个岛屿的面积 + mark++; // 记录下一个岛屿编号 + } + } + } + } +} +``` + +不过为了让各个变量各司其事,代码清晰一些,完整代码还是使用visited数组来标记。 + 最后,整体代码如下: ```CPP @@ -129,7 +176,7 @@ private: public: int largestIsland(vector>& grid) { int n = grid.size(), m = grid[0].size(); - vector> visited = vector>(n, vector(m, false)); + vector> visited = vector>(n, vector(m, false)); // 标记访问过的点 unordered_map gridNum; int mark = 2; // 记录每个岛屿的编号 bool isAllGrid = true; // 标记是否整个地图都是陆地 @@ -171,6 +218,7 @@ public: } }; ``` +

diff --git "a/problems/1020.\351\243\236\345\234\260\347\232\204\346\225\260\351\207\217.md" "b/problems/1020.\351\243\236\345\234\260\347\232\204\346\225\260\351\207\217.md" index 8b54d7f1c0..b7cba7a6a1 100644 --- "a/problems/1020.\351\243\236\345\234\260\347\232\204\346\225\260\351\207\217.md" +++ "b/problems/1020.\351\243\236\345\234\260\347\232\204\346\225\260\351\207\217.md" @@ -6,6 +6,8 @@ # 1020. 飞地的数量 +[力扣链接](https://leetcode.cn/problems/number-of-enclaves/description/) + 给你一个大小为 m x n 的二进制矩阵 grid ,其中 0 表示一个海洋单元格、1 表示一个陆地单元格。 一次 移动 是指从一个陆地单元格走到另一个相邻(上、下、左、右)的陆地单元格或跨过 grid 的边界。 @@ -26,7 +28,7 @@ ## 思路 -本题使用dfs,bfs,并查集都是可以的。 本题和 417. 太平洋大西洋水流问题 很像。 +本题使用dfs,bfs,并查集都是可以的。 本题要求找到不靠边的陆地面积,那么我们只要从周边找到陆地然后 通过 dfs或者bfs 将周边靠陆地且相邻的陆地都变成海洋,然后再去重新遍历地图的时候,统计此时还剩下的陆地就可以了。 From 67b7c7f2b802feb27acb5a33221faa96bc8f03c2 Mon Sep 17 00:00:00 2001 From: ZerenZhang2022 <118794589+ZerenZhang2022@users.noreply.github.com> Date: Mon, 9 Jan 2023 17:27:48 -0500 Subject: [PATCH 1438/3019] =?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 加入了bilibili视频链接 --- ...0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" | 3 +++ 1 file changed, 3 insertions(+) diff --git "a/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" "b/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" index 97178cd5b1..124b365fbf 100644 --- "a/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" +++ "b/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" @@ -40,6 +40,9 @@ * 0 <= s.length <= 3000 * s 仅由数字组成 +# 算法公开课 + +**《代码随想录》算法视频公开课:[93.复原IP地址](https://www.bilibili.com/video/BV1XP4y1U73i/),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 # 思路 From 5bd02484387de4c317cfeb114cf1de6b04464aca Mon Sep 17 00:00:00 2001 From: ZerenZhang2022 <118794589+ZerenZhang2022@users.noreply.github.com> Date: Mon, 9 Jan 2023 18:10:32 -0500 Subject: [PATCH 1439/3019] =?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,更类似于LeetCode131题代码的写法,看起来更简洁些 --- ...\345\216\237IP\345\234\260\345\235\200.md" | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git "a/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" "b/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" index 97178cd5b1..4e32af994c 100644 --- "a/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" +++ "b/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" @@ -424,6 +424,30 @@ class Solution: return True ``` +python3; 简单拼接版本(类似Leetcode131写法): +```python +class Solution: + def restoreIpAddresses(self, s: str) -> List[str]: + global results, path + results = [] + path = [] + self.backtracking(s,0) + return results + + def backtracking(self,s,index): + global results,path + if index == len(s) and len(path)==4: + results.append('.'.join(path)) # 在连接时需要中间间隔符号的话就在''中间写上对应的间隔符 + return + for i in range(index,len(s)): + if len(path)>3: break # 剪枝 + temp = s[index:i+1] + if (int(temp)<256 and int(temp)>0 and temp[0]!='0') or (temp=='0'): + path.append(temp) + self.backtracking(s,i+1) + path.pop() +``` + ## Go ```go From a7afca36d7024051df6b4614d9028409d5bb1bb5 Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Tue, 10 Jan 2023 09:42:52 +0800 Subject: [PATCH 1440/3019] Update --- ...6.\346\221\206\345\212\250\345\272\217\345\210\227.md" | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git "a/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" "b/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" index 35daf3013c..efb9c6b65a 100644 --- "a/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" +++ "b/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" @@ -59,11 +59,11 @@ 这是我们思考本题的一个大题思路,但本题要考虑三种情况: -1. 情况一:相同数字连续 +1. 情况一:上下坡中有平坡 2. 情况二:数组首尾两端 -3. 情况三:单调坡度有平坡 +3. 情况三:单调坡中有平坡 -### 情况一:相同数字连续 +### 情况一:上下坡中有平坡 例如 [1,2,2,2,1]这样的数组,如图: @@ -145,7 +145,7 @@ public: 图中,我们可以看出,版本一的代码在三个地方记录峰值,但其实结果因为是2,因为 单调中的平坡 不能算峰值(即摆动)。 -之所以版本一会出问题,是因为我们事实更新了 prediff。 +之所以版本一会出问题,是因为我们实时更新了 prediff。 那么我们应该什么时候更新prediff呢? From 4856f9786b82c9ca54f2759679e1ef7c9e7a34b0 Mon Sep 17 00:00:00 2001 From: PeixiZ <96801981+PeixiZ@users.noreply.github.com> Date: Tue, 10 Jan 2023 15:49:23 +0800 Subject: [PATCH 1441/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0C#=E7=A8=8B?= =?UTF-8?q?=E5=BA=8F=EF=BC=8C=E4=BD=BF=E7=94=A8=E4=B8=89=E6=8C=87=E9=92=88?= =?UTF-8?q?=E6=84=9F=E8=A7=89=E4=BC=9A=E6=9B=B4=E5=BD=A2=E8=B1=A1=E8=A1=A8?= =?UTF-8?q?=E8=BF=B0=E9=93=BE=E8=A1=A8=E7=BF=BB=E8=BD=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...73\350\275\254\351\223\276\350\241\250.md" | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git "a/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md" "b/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md" index 44146bb4fd..7db80fe1e3 100644 --- "a/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md" +++ "b/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md" @@ -628,6 +628,43 @@ impl Solution { } } ``` +C#: +三指针法, 感觉会更直观: + +```cs +public LinkNumbers Reverse() +{ + ///用三指针,写的过程中能够弥补二指针在翻转过程中的想象 + LinkNumbers pre = null; + var move = root; + var next = root; + + while (next != null) + { + next = next.linknext; + move.linknext = pre; + pre = move; + move = next; + } + root = pre; + return root; +} + +///LinkNumbers的定义 +public class LinkNumbers +{ + ///

+ /// 链表值 + /// + public int value { get; set; } + + /// + /// 链表指针 + /// + public LinkNumbers linknext { get; set; } +} +``` +

From d010b09dbd6c65fea927dabf39d10045a5a741da Mon Sep 17 00:00:00 2001 From: roylx <73628821+roylx@users.noreply.github.com> Date: Tue, 10 Jan 2023 15:18:11 -0700 Subject: [PATCH 1442/3019] =?UTF-8?q?Update=200031.=E4=B8=8B=E4=B8=80?= =?UTF-8?q?=E4=B8=AA=E6=8E=92=E5=88=97.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit python版本剪枝去重,避免对递减序列的比较 --- ...270\213\344\270\200\344\270\252\346\216\222\345\210\227.md" | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git "a/problems/0031.\344\270\213\344\270\200\344\270\252\346\216\222\345\210\227.md" "b/problems/0031.\344\270\213\344\270\200\344\270\252\346\216\222\345\210\227.md" index 88fbb2fc65..34aa1086c0 100644 --- "a/problems/0031.\344\270\213\344\270\200\344\270\252\346\216\222\345\210\227.md" +++ "b/problems/0031.\344\270\213\344\270\200\344\270\252\346\216\222\345\210\227.md" @@ -168,7 +168,8 @@ class Solution: Do not return anything, modify nums in-place instead. """ length = len(nums) - for i in range(length - 1, -1, -1): + for i in range(length - 2, -1, -1): # 从倒数第二个开始 + if nums[i]>=nums[i+1]: continue # 剪枝去重 for j in range(length - 1, i, -1): if nums[j] > nums[i]: nums[j], nums[i] = nums[i], nums[j] From 241f3af9a8c74a5a42f53e9f39689fd1ab501655 Mon Sep 17 00:00:00 2001 From: shangcode <61669790+shangcode@users.noreply.github.com> Date: Wed, 11 Jan 2023 09:25:03 +0800 Subject: [PATCH 1443/3019] =?UTF-8?q?Update=200034.=E5=9C=A8=E6=8E=92?= =?UTF-8?q?=E5=BA=8F=E6=95=B0=E7=BB=84=E4=B8=AD=E6=9F=A5=E6=89=BE=E5=85=83?= =?UTF-8?q?=E7=B4=A0=E7=9A=84=E7=AC=AC=E4=B8=80=E4=B8=AA=E5=92=8C=E6=9C=80?= =?UTF-8?q?=E5=90=8E=E4=B8=80=E4=B8=AA=E4=BD=8D=E7=BD=AE.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 去掉了一个 Python 解法中的分号。 --- ...20\216\344\270\200\344\270\252\344\275\215\347\275\256.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" "b/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" index c7ff6dce1e..7e58a870d8 100644 --- "a/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" +++ "b/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" @@ -355,8 +355,8 @@ class Solution: while left <= right: middle = left + (right-left) // 2 if nums[middle] >= target: # 寻找左边界,nums[middle] == target的时候更新right - right = middle - 1; - leftBoder = right; + right = middle - 1 + leftBoder = right else: left = middle + 1 return leftBoder From a8339121e6f98e9b5241169aef93a04b7ca2ad87 Mon Sep 17 00:00:00 2001 From: Logen <47022821+Logenleedev@users.noreply.github.com> Date: Wed, 11 Jan 2023 13:08:06 -0600 Subject: [PATCH 1444/3019] =?UTF-8?q?=E4=BF=AE=E6=94=B9=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 --- .../0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" "b/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" index eec471af34..0a85d04a95 100644 --- "a/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" +++ "b/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" @@ -148,7 +148,7 @@ class Solution { ### Python ```python class Solution: - # 思路1:优先考虑胃饼干 + # 思路1:优先考虑小胃口 def findContentChildren(self, g: List[int], s: List[int]) -> int: g.sort() s.sort() @@ -160,7 +160,7 @@ class Solution: ``` ```python class Solution: - # 思路2:优先考虑胃口 + # 思路2:优先考虑大胃口 def findContentChildren(self, g: List[int], s: List[int]) -> int: g.sort() s.sort() From 91f3da4b43f44d60a0f7c60436ec30869788ec04 Mon Sep 17 00:00:00 2001 From: Logen <47022821+Logenleedev@users.noreply.github.com> Date: Fri, 13 Jan 2023 12:53:05 -0600 Subject: [PATCH 1445/3019] add Python solution --- ...40\344\272\214\345\217\211\346\240\221.md" | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git "a/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" "b/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" index f8109f853e..c2b2872b6c 100644 --- "a/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" @@ -397,6 +397,9 @@ public: }; ``` +## Python + + # 105.从前序与中序遍历序列构造二叉树 [力扣题目链接](https://leetcode.cn/problems/construct-binary-tree-from-preorder-and-inorder-traversal/) @@ -650,6 +653,37 @@ class Solution { ``` ## Python +```python +class Solution: + def buildTree(self, inorder: List[int], postorder: List[int]) -> Optional[TreeNode]: + # 第一步: 特殊情况讨论: 树为空. 或者说是递归终止条件 + if not postorder: + return + + # 第二步: 后序遍历的最后一个就是当前的中间节点 + root_val = postorder[-1] + root = TreeNode(root_val) + + # 第三步: 找切割点. + root_index = inorder.index(root_val) + + # 第四步: 切割inorder数组. 得到inorder数组的左,右半边. + left_inorder = inorder[:root_index] + right_inorder = inorder[root_index + 1:] + + # 第五步: 切割postorder数组. 得到postorder数组的左,右半边. + # ⭐️ 重点1: 中序数组大小一定跟后序数组大小是相同的. + left_postorder = postorder[:len(left_inorder)] + right_postorder = postorder[len(left_inorder): len(postorder) - 1] + + + # 第六步: 递归 + root.left = self.buildTree(left_inorder, left_postorder) + root.right = self.buildTree(right_inorder, right_postorder) + + # 第七步: 返回答案 + return root +``` 105.从前序与中序遍历序列构造二叉树 From 7d822fe65a587f883a5d63c1b72c139239f2cff7 Mon Sep 17 00:00:00 2001 From: El nino <69737612+el-nino2020@users.noreply.github.com> Date: Sat, 14 Jan 2023 09:18:08 +0800 Subject: [PATCH 1446/3019] =?UTF-8?q?Update=2020201003=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=A0=91=E5=91=A8=E6=9C=AB=E6=80=BB=E7=BB=93.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit typo? --- ...\240\221\345\221\250\346\234\253\346\200\273\347\273\223.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20201003\344\272\214\345\217\211\346\240\221\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20201003\344\272\214\345\217\211\346\240\221\345\221\250\346\234\253\346\200\273\347\273\223.md" index 18bbf37f97..5f59b04022 100644 --- "a/problems/\345\221\250\346\200\273\347\273\223/20201003\344\272\214\345\217\211\346\240\221\345\221\250\346\234\253\346\200\273\347\273\223.md" +++ "b/problems/\345\221\250\346\200\273\347\273\223/20201003\344\272\214\345\217\211\346\240\221\345\221\250\346\234\253\346\200\273\347\273\223.md" @@ -2,7 +2,7 @@ 本周赶上了十一国庆,估计大家已经对本周末没什么概念了,但是我们该做总结还是要做总结的。 -本周的主题其实是**简单但并不简单**,本周所选的题目大多是看一下就会的题目,但是大家看完本周的文章估计也发现了,二叉树的简答题目其实里面都藏了很多细节。 这些细节我都给大家展现了出来。 +本周的主题其实是**简单但并不简单**,本周所选的题目大多是看一下就会的题目,但是大家看完本周的文章估计也发现了,二叉树的简单题目其实里面都藏了很多细节。 这些细节我都给大家展现了出来。 ## 周一 From c201b947a5bb4510b5c0214ec652c6300a2c6760 Mon Sep 17 00:00:00 2001 From: El nino <69737612+el-nino2020@users.noreply.github.com> Date: Sat, 14 Jan 2023 15:06:56 +0800 Subject: [PATCH 1447/3019] =?UTF-8?q?Update=200112.=E8=B7=AF=E5=BE=84?= =?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 原有的代码leetcode上无法通过编译 --- ...112.\350\267\257\345\276\204\346\200\273\345\222\214.md" | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git "a/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" "b/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" index 7aa5f2a165..b1f0133663 100644 --- "a/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" +++ "b/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" @@ -155,14 +155,14 @@ public: 以上代码精简之后如下: ```cpp -class solution { +class Solution { public: bool hasPathSum(TreeNode* root, int sum) { - if (root == null) return false; + if (!root) return false; if (!root->left && !root->right && sum == root->val) { return true; } - return haspathsum(root->left, sum - root->val) || haspathsum(root->right, sum - root->val); + return hasPathSum(root->left, sum - root->val) || hasPathSum(root->right, sum - root->val); } }; ``` From 1a44d7e7dfd032cf13a42ee4998b6445077c5ebb Mon Sep 17 00:00:00 2001 From: Logen <47022821+Logenleedev@users.noreply.github.com> Date: Sun, 15 Jan 2023 16:34:26 -0600 Subject: [PATCH 1448/3019] =?UTF-8?q?=E4=BF=AE=E6=94=B9=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/0134.\345\212\240\346\262\271\347\253\231.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0134.\345\212\240\346\262\271\347\253\231.md" "b/problems/0134.\345\212\240\346\262\271\347\253\231.md" index ade847730c..192e58a684 100644 --- "a/problems/0134.\345\212\240\346\262\271\347\253\231.md" +++ "b/problems/0134.\345\212\240\346\262\271\347\253\231.md" @@ -88,7 +88,7 @@ public: * 情况一:如果gas的总和小于cost总和,那么无论从哪里出发,一定是跑不了一圈的 * 情况二:rest[i] = gas[i]-cost[i]为一天剩下的油,i从0开始计算累加到最后一站,如果累加没有出现负数,说明从0出发,油就没有断过,那么0就是起点。 -* 情况三:如果累加的最小值是负数,汽车就要从非0节点出发,从后向前,看哪个节点能这个负数填平,能把这个负数填平的节点就是出发节点。 +* 情况三:如果累加的最小值是负数,汽车就要从非0节点出发,从后向前,看哪个节点能把这个负数填平,能把这个负数填平的节点就是出发节点。 C++代码如下: From 1d19ac72300e6de7c785b4eb5f64f8eea3d5e4b6 Mon Sep 17 00:00:00 2001 From: Zeeland Date: Mon, 16 Jan 2023 10:48:43 +0800 Subject: [PATCH 1449/3019] =?UTF-8?q?fix:=20=E4=BF=AE=E6=94=B9=E9=94=99?= =?UTF-8?q?=E5=88=AB=E5=AD=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" "b/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" index 2e98ef6f22..f8f41097bb 100644 --- "a/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" +++ "b/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" @@ -137,7 +137,7 @@ class Solution { resSet.add(i); } } - //将结果几何转为数组 + //将结果集合转为数组 return resSet.stream().mapToInt(x -> x).toArray(); } } From d52112c4555c1db8d2f5037d18c10103531c145b Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Tue, 17 Jan 2023 11:32:18 +0800 Subject: [PATCH 1450/3019] Update --- ...\350\267\203\346\270\270\346\210\217II.md" | 6 ++-- ...47\345\255\220\345\272\217\345\222\214.md" | 28 ++++++++++++--- ...63\350\267\203\346\270\270\346\210\217.md" | 2 +- ...25\347\232\204\345\214\272\345\237\237.md" | 1 + ...06\345\217\221\351\245\274\345\271\262.md" | 35 ++++++++++++++++--- ...04\346\225\260\347\273\204\345\222\214.md" | 2 +- ...60\347\232\204\346\225\260\351\207\217.md" | 5 +++ 7 files changed, 65 insertions(+), 14 deletions(-) diff --git "a/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" "b/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" index 05ad872b89..7dbf531bb9 100644 --- "a/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" +++ "b/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" @@ -73,11 +73,11 @@ public: for (int i = 0; i < nums.size(); i++) { nextDistance = max(nums[i] + i, nextDistance); // 更新下一步覆盖最远距离下标 if (i == curDistance) { // 遇到当前覆盖最远距离下标 - if (curDistance != nums.size() - 1) { // 如果当前覆盖最远距离下标不是终点 + if (curDistance < nums.size() - 1) { // 如果当前覆盖最远距离下标不是终点 ans++; // 需要走下一步 curDistance = nextDistance; // 更新当前覆盖最远距离下标(相当于加油了) if (nextDistance >= nums.size() - 1) break; // 下一步的覆盖范围已经可以达到终点,结束循环 - } else break; // 当前覆盖最远距离下标是集合终点,不用做ans++操作了,直接结束 + } else break; // 当前覆盖最远距到达集合终点,不用做ans++操作了,直接结束 } } return ans; @@ -126,7 +126,7 @@ public: 可以看出版本二的代码相对于版本一简化了不少! -其精髓在于控制移动下标i只移动到nums.size() - 2的位置,所以移动下标只要遇到当前覆盖最远距离的下标,直接步数加一,不用考虑别的了。 +**其精髓在于控制移动下标i只移动到nums.size() - 2的位置**,所以移动下标只要遇到当前覆盖最远距离的下标,直接步数加一,不用考虑别的了。 ## 总结 diff --git "a/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" "b/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" index 665710a94b..14017f9899 100644 --- "a/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" +++ "b/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" @@ -12,9 +12,9 @@ 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 示例: -输入: [-2,1,-3,4,-1,2,1,-5,4] -输出: 6 -解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。 +* 输入: [-2,1,-3,4,-1,2,1,-5,4] +* 输出: 6 +* 解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。 ## 暴力解法 @@ -103,8 +103,28 @@ public: 当然题目没有说如果数组为空,应该返回什么,所以数组为空的话返回啥都可以了。 + +## 常见误区 + +误区一: + 不少同学认为 如果输入用例都是-1,或者 都是负数,这个贪心算法跑出来的结果是0, 这是**又一次证明脑洞模拟不靠谱的经典案例**,建议大家把代码运行一下试一试,就知道了,也会理解 为什么 result 要初始化为最小负数了。 + +误区二: + +大家在使用贪心算法求解本题,经常陷入的误区,就是分不清,是遇到 负数就选择起始位置,还是连续和为负选择起始位置。 + +在动画演示用,大家可以发现, 4,遇到 -1 的时候,我们依然累加了,为什么呢? + +因为和为3,只要连续和还是正数就会 对后面的元素 起到增大总和的作用。 所以只要连续和为正数我们就保留。 + +这里也会有录友疑惑,那 4 + -1 之后 不就变小了吗? 会不会错过 4 成为最大连续和的可能性? + +其实并不会,因为还有一个变量result 一直在更新 最大的连续和,只要有更大的连续和出现,result就更新了,那么result已经把4更新了,后面 连续和变成3,也不会对最后结果有影响。 + + + ## 动态规划 当然本题还可以用动态规划来做,当前[「代码随想录」](https://img-blog.csdnimg.cn/20201124161234338.png)主要讲解贪心系列,后续到动态规划系列的时候会详细讲解本题的dp方法。 @@ -135,7 +155,7 @@ public: 本题的贪心思路其实并不好想,这也进一步验证了,别看贪心理论很直白,有时候看似是常识,但贪心的题目一点都不简单! -后续将介绍的贪心题目都挺难的,哈哈,所以贪心很有意思,别小看贪心! +后续将介绍的贪心题目都挺难的,所以贪心很有意思,别小看贪心! ## 其他语言版本 diff --git "a/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" "b/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" index 7584e95235..7b02075bdb 100644 --- "a/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" +++ "b/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" @@ -78,7 +78,7 @@ public: 一些同学可能感觉,我在讲贪心系列的时候,题目和题目之间貌似没有什么联系? -**是真的就是没什么联系,因为贪心无套路!**没有个整体的贪心框架解决一系列问题,只能是接触各种类型的题目锻炼自己的贪心思维! +**是真的就是没什么联系,因为贪心无套路**!没有个整体的贪心框架解决一系列问题,只能是接触各种类型的题目锻炼自己的贪心思维! ## 其他语言版本 diff --git "a/problems/0130.\350\242\253\345\233\264\347\273\225\347\232\204\345\214\272\345\237\237.md" "b/problems/0130.\350\242\253\345\233\264\347\273\225\347\232\204\345\214\272\345\237\237.md" index 528d2042c0..c2aa569693 100644 --- "a/problems/0130.\350\242\253\345\233\264\347\273\225\347\232\204\345\214\272\345\237\237.md" +++ "b/problems/0130.\350\242\253\345\233\264\347\273\225\347\232\204\345\214\272\345\237\237.md" @@ -83,6 +83,7 @@ public: ``` ## 其他语言版本 +

diff --git "a/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" "b/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" index eec471af34..8b05735c57 100644 --- "a/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" +++ "b/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" @@ -52,6 +52,7 @@ C++代码整体如下: ```CPP +// 版本一 // 时间复杂度:O(nlogn) // 空间复杂度:O(1) class Solution { @@ -61,8 +62,8 @@ public: sort(s.begin(), s.end()); int index = s.size() - 1; // 饼干数组的下标 int result = 0; - for (int i = g.size() - 1; i >= 0; i--) { - if (index >= 0 && s[index] >= g[i]) { + for (int i = g.size() - 1; i >= 0; i--) { // 遍历胃口 + if (index >= 0 && s[index] >= g[i]) { // 遍历饼干 result++; index--; } @@ -76,6 +77,26 @@ public: 有的同学看到要遍历两个数组,就想到用两个for循环,那样逻辑其实就复杂了。 + +### 注意事项 + +注意版本一的代码中,可以看出来,是先遍历的胃口,在遍历的饼干,那么可不可以 先遍历 饼干,在遍历胃口呢? + +其实是不可以的。 + +外面的for 是里的下标i 是固定移动的,而if里面的下标 index 是符合条件才移动的。 + +如果 for 控制的是饼干, if 控制胃口,就是出现如下情况 : + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20230112102848.png) + +if 里的 index 指向 胃口 10, for里的i指向饼干9,因为 饼干9 满足不了 胃口10,所以 i 持续向前移动,而index 走不到` s[index] >= g[i]` 的逻辑,所以index不会移动,那么当i 持续向前移动,最后所有的饼干都匹配不上。 + +所以 一定要for 控制 胃口,里面的if控制饼干。 + + +### 其他思路 + **也可以换一个思路,小饼干先喂饱小胃口** 代码如下: @@ -87,15 +108,19 @@ public: sort(g.begin(),g.end()); sort(s.begin(),s.end()); int index = 0; - for(int i = 0;i < s.size();++i){ - if(index < g.size() && g[index] <= s[i]){ + for(int i = 0; i < s.size(); i++) { // 饼干 + if(index < g.size() && g[index] <= s[i]){ // 胃口 index++; } } return index; } }; -``` +``` + +细心的录友可以发现,这种写法,两个循环的顺序改变了,先遍历的饼干,在遍历的胃口,这是因为遍历顺序变了,我们是从小到大遍历。 + +理由在上面 “注意事项”中 已经讲过。 ## 总结 diff --git "a/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" "b/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" index 08848a0101..cdf42511b1 100644 --- "a/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" +++ "b/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" @@ -44,7 +44,7 @@ 那么如果将负数都转变为正数了,K依然大于0,此时的问题是一个有序正整数序列,如何转变K次正负,让 数组和 达到最大。 -那么又是一个贪心:局部最优:只找数值最小的正整数进行反转,当前数值可以达到最大(例如正整数数组{5, 3, 1},反转1 得到-1 比 反转5得到的-5 大多了),全局最优:整个 数组和 达到最大。 +那么又是一个贪心:局部最优:只找数值最小的正整数进行反转,当前数值和可以达到最大(例如正整数数组{5, 3, 1},反转1 得到-1 比 反转5得到的-5 大多了),全局最优:整个 数组和 达到最大。 虽然这道题目大家做的时候,可能都不会去想什么贪心算法,一鼓作气,就AC了。 diff --git "a/problems/1020.\351\243\236\345\234\260\347\232\204\346\225\260\351\207\217.md" "b/problems/1020.\351\243\236\345\234\260\347\232\204\346\225\260\351\207\217.md" index b7cba7a6a1..3da373765a 100644 --- "a/problems/1020.\351\243\236\345\234\260\347\232\204\346\225\260\351\207\217.md" +++ "b/problems/1020.\351\243\236\345\234\260\347\232\204\346\225\260\351\207\217.md" @@ -144,6 +144,11 @@ public: } }; ``` +## 类似题目 + +* 1254. 统计封闭岛屿的数目 + +

From 835c9222deae3ffef30cbe4cf66bb536f7d9dd90 Mon Sep 17 00:00:00 2001 From: ZerenZhang2022 <118794589+ZerenZhang2022@users.noreply.github.com> Date: Wed, 18 Jan 2023 18:14:38 -0500 Subject: [PATCH 1451/3019] =?UTF-8?q?Update=200279.=E5=AE=8C=E5=85=A8?= =?UTF-8?q?=E5=B9=B3=E6=96=B9=E6=95=B0.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Python 部分,版本2,第233行少写了一个“:” --- ...\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" "b/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" index b6a97be3ff..53f6b6d084 100644 --- "a/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" +++ "b/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" @@ -230,7 +230,7 @@ class Solution: # 遍历物品 for num in nums: # 遍历背包 - for j in range(num, n + 1) + for j in range(num, n + 1): dp[j] = min(dp[j], dp[j - num] + 1) return dp[n] ``` From a11c78a19d95f7091681651e071f87fb169009e3 Mon Sep 17 00:00:00 2001 From: SUNLIFAN Date: Thu, 19 Jan 2023 09:58:56 +0800 Subject: [PATCH 1452/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A00107=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?II=20=E4=B8=8D=E9=9C=80=E8=A6=81=E5=8F=8D=E8=BD=AC=E7=AD=94?= =?UTF-8?q?=E6=A1=88=E7=9A=84=20Java=20=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...02\345\272\217\351\201\215\345\216\206.md" | 40 ++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" index 220232a2b1..21f5147dd3 100644 --- "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" +++ "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" @@ -562,6 +562,45 @@ public class N0107 { } ``` +```java +/** + * 思路和模板相同, 对收集答案的方式做了优化, 最后不需要反转 + */ +class Solution { + public List> levelOrderBottom(TreeNode root) { + // 利用链表可以进行 O(1) 头部插入, 这样最后答案不需要再反转 + LinkedList> ans = new LinkedList<>(); + + Queue q = new LinkedList<>(); + + if (root != null) q.offer(root); + + while (!q.isEmpty()) { + int size = q.size(); + + List temp = new ArrayList<>(); + + for (int i = 0; i < size; i ++) { + TreeNode node = q.poll(); + + temp.add(node.val); + + if (node.left != null) q.offer(node.left); + + if (node.right != null) q.offer(node.right); + } + + // 新遍历到的层插到头部, 这样就满足按照层次反序的要求 + ans.addFirst(temp); + } + + return ans; + } +} +``` + + + go: ```GO @@ -3013,4 +3052,3 @@ impl Solution { - From 5bf54160131703bff0029272f98626d8717bf41f Mon Sep 17 00:00:00 2001 From: Zehua Ren <48848908+Renzehua1998@users.noreply.github.com> Date: Thu, 19 Jan 2023 17:40:15 +0800 Subject: [PATCH 1453/3019] =?UTF-8?q?Update=200450.=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=90=9C=E7=B4=A2=E6=A0=91=E4=B8=AD=E7=9A=84?= =?UTF-8?q?=E8=8A=82=E7=82=B9.md=20=E6=B7=BB=E5=8A=A0=E6=99=AE=E9=80=9A?= =?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=A0=91=E7=9A=84=E5=88=A0=E9=99=A4=E6=96=B9?= =?UTF-8?q?=E5=BC=8Fpython3=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...255\347\232\204\350\212\202\347\202\271.md" | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git "a/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" "b/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" index facdb2f938..0655f8c5d0 100644 --- "a/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" +++ "b/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" @@ -348,6 +348,24 @@ class Solution: return root ``` +**普通二叉树的删除方式** +```python +class Solution: + def deleteNode(self, root: Optional[TreeNode], key: int) -> Optional[TreeNode]: + if not root: return root + if root.val == key: + if not root.right: # 这里第二次操作目标值:最终删除的作用 + return root.left + tmp = root.right + while tmp.left: + tmp = tmp.left + root.val, tmp.val = tmp.val, root.val # 这里第一次操作目标值:交换目标值其右子树最左面节点。 + + root.left = self.deleteNode(root.left, key) + root.right = self.deleteNode(root.right, key) + return root +``` + **迭代法** ```python class Solution: From cbc75c008452a9ac0de0b580a30a4a1d9ec969b5 Mon Sep 17 00:00:00 2001 From: Zehua Ren <48848908+Renzehua1998@users.noreply.github.com> Date: Thu, 19 Jan 2023 17:47:41 +0800 Subject: [PATCH 1454/3019] =?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=20=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E8=BF=AD=E4=BB=A3=E6=B3=95python3=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...11\346\220\234\347\264\242\346\240\221.md" | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git "a/problems/0669.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0669.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" index ac36509f21..1fd6fce098 100644 --- "a/problems/0669.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" +++ "b/problems/0669.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" @@ -299,6 +299,32 @@ class Solution: return root ``` +**迭代** +```python +class Solution: + def trimBST(self, root: Optional[TreeNode], low: int, high: int) -> Optional[TreeNode]: + if not root: return root + # 处理头结点,让root移动到[L, R] 范围内,注意是左闭右开 + while root and (root.val < low or root.val > high): + if root.val < low: # 小于L往右走 + root = root.right + else: # 大于R往左走 + root = root.left + # 此时root已经在[L, R] 范围内,处理左孩子元素小于L的情况 + cur = root + while cur: + while cur.left and cur.left.val < low: + cur.left = cur.left.right + cur = cur.left + # 此时root已经在[L, R] 范围内,处理右孩子大于R的情况 + cur = root + while cur: + while cur.right and cur.right.val > high: + cur.right = cur.right.left + cur = cur.right + return root +``` + ## Go ```go From f96384951fb35dc196beea26151ab992a551b08e Mon Sep 17 00:00:00 2001 From: Zehua Ren <48848908+Renzehua1998@users.noreply.github.com> Date: Thu, 19 Jan 2023 18:00:55 +0800 Subject: [PATCH 1455/3019] =?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=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E8=BF=AD=E4=BB=A3=E6=B3=95python3=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...11\346\220\234\347\264\242\346\240\221.md" | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git "a/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" index c75f87d1e0..f0455a834f 100644 --- "a/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" +++ "b/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" @@ -352,6 +352,38 @@ class Solution: return mid_root ``` +**迭代**(左闭右开) +```python +class Solution: + def sortedArrayToBST(self, nums: List[int]) -> Optional[TreeNode]: + if len(nums) == 0: return None + root = TreeNode() # 初始化 + nodeSt = [root] + leftSt = [0] + rightSt = [len(nums)] + + while nodeSt: + node = nodeSt.pop() # 处理根节点 + left = leftSt.pop() + right = rightSt.pop() + mid = left + (right - left) // 2 + node.val = nums[mid] + + if left < mid: # 处理左区间 + node.left = TreeNode() + nodeSt.append(node.left) + leftSt.append(left) + rightSt.append(mid) + + if right > mid + 1: # 处理右区间 + node.right = TreeNode() + nodeSt.append(node.right) + leftSt.append(mid + 1) + rightSt.append(right) + + return root +``` + ## Go 递归(隐含回溯) From 63183226bf48024e7669abd431ac746f6221321f Mon Sep 17 00:00:00 2001 From: Zeeland Date: Thu, 19 Jan 2023 23:56:57 +0800 Subject: [PATCH 1456/3019] =?UTF-8?q?Update=20=E6=B7=BB=E5=8A=A0=E7=94=B5?= =?UTF-8?q?=E8=AF=9D=E5=8F=B7=E7=A0=81=E5=AD=97=E6=AF=8D=E7=BB=84=E5=90=88?= =?UTF-8?q?Python=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...27\346\257\215\347\273\204\345\220\210.md" | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git "a/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" "b/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" index 4f39f60a70..df038806a5 100644 --- "a/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" +++ "b/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" @@ -354,6 +354,28 @@ class Solution: for letter in letters: self.backtracking(digits, index + 1, answer + letter) # 递归至下一层 + 回溯 ``` +**使用itertools** +```python +class Solution: + def letterCombinations(self, digits: str) -> List[str]: + import itertools + if not digits: + return list() + + phoneMap = { + "2": "abc", + "3": "def", + "4": "ghi", + "5": "jkl", + "6": "mno", + "7": "pqrs", + "8": "tuv", + "9": "wxyz", + } + + groups = (phoneMap[digit] for digit in digits) + return ["".join(combination) for combination in itertools.product(*groups)] +``` ## Go From b355d79c468998be184d69f8ef519430f4936563 Mon Sep 17 00:00:00 2001 From: El nino <69737612+el-nino2020@users.noreply.github.com> Date: Fri, 20 Jan 2023 12:04:39 +0800 Subject: [PATCH 1457/3019] =?UTF-8?q?Update=2020201126=E8=B4=AA=E5=BF=83?= =?UTF-8?q?=E5=91=A8=E6=9C=AB=E6=80=BB=E7=BB=93.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit typo --- ...77\203\345\221\250\346\234\253\346\200\273\347\273\223.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20201126\350\264\252\345\277\203\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20201126\350\264\252\345\277\203\345\221\250\346\234\253\346\200\273\347\273\223.md" index e310c0f8e0..1d5ca6afb6 100644 --- "a/problems/\345\221\250\346\200\273\347\273\223/20201126\350\264\252\345\277\203\345\221\250\346\234\253\346\200\273\347\273\223.md" +++ "b/problems/\345\221\250\346\200\273\347\273\223/20201126\350\264\252\345\277\203\345\221\250\346\234\253\346\200\273\347\273\223.md" @@ -18,7 +18,7 @@ 数学就不在讲解范围内了,感兴趣的同学可以自己去查一查资料。 -正式因为贪心算法有时候会感觉这是常识,本就应该这么做! 所以大家经常看到网上有人说这是一道贪心题目,有人是这不是。 +正是因为贪心算法有时候会感觉这是常识,本就应该这么做! 所以大家经常看到网上有人说这是一道贪心题目,有人说这不是。 这里说一下我的依据:**如果找到局部最优,然后推出整体最优,那么就是贪心**,大家可以参考哈。 @@ -37,7 +37,7 @@ **因为用小饼干优先喂饱小胃口的 这样可以尽量保证最后省下来的是大饼干(虽然题目没有这个要求)!** -所有还是小饼干优先先喂饱小胃口更好一些,也比较直观。 +所以还是小饼干优先先喂饱小胃口更好一些,也比较直观。 一些录友不清楚[贪心算法:分发饼干](https://programmercarl.com/0455.分发饼干.html)中时间复杂度是怎么来的? From 026f8ca7b4c189dac475ea2b8f93923c8abfed89 Mon Sep 17 00:00:00 2001 From: hbingzhi Date: Sat, 21 Jan 2023 17:25:14 +0800 Subject: [PATCH 1458/3019] =?UTF-8?q?257.=E7=BB=99Java=E8=A7=A3=E6=B3=95?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=9B=B4=E5=85=A8=E9=9D=A2=E6=B8=85=E6=99=B0?= =?UTF-8?q?=E7=9A=84=E6=B3=A8=E9=87=8A=EF=BC=8C=E5=8F=A6=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E4=B8=80=E5=A4=84=E9=87=8D=E5=A4=8D=E7=9A=84=E7=AC=94=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...00\346\234\211\350\267\257\345\276\204.md" | 26 ++++++++++--------- 1 file changed, 14 insertions(+), 12 deletions(-) diff --git "a/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" "b/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" index d0c190a0f6..68434479f5 100644 --- "a/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" +++ "b/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" @@ -34,7 +34,7 @@ ## 递归 -1. 递归函数函数参数以及返回值 +1. 递归函数参数以及返回值 要传入根节点,记录每一条路径的path,和存放结果集的result,这里递归不需要返回值,代码如下: @@ -259,7 +259,7 @@ if (cur->right) { path.pop_back(); // 回溯 '>' path.pop_back(); // 回溯 '-' } -``` +``` 整体代码如下: @@ -395,33 +395,34 @@ class Solution { * 递归法 */ public List binaryTreePaths(TreeNode root) { - List res = new ArrayList<>(); + List res = new ArrayList<>();// 存最终的结果 if (root == null) { return res; } - List paths = new ArrayList<>(); + List paths = new ArrayList<>();// 作为结果中的路径 traversal(root, paths, res); return res; } private void traversal(TreeNode root, List paths, List res) { - paths.add(root.val); - // 叶子结点 + paths.add(root.val);// 前序遍历,中 + // 遇到叶子结点 if (root.left == null && root.right == null) { // 输出 - StringBuilder sb = new StringBuilder(); + StringBuilder sb = new StringBuilder();// StringBuilder用来拼接字符串,速度更快 for (int i = 0; i < paths.size() - 1; i++) { sb.append(paths.get(i)).append("->"); } - sb.append(paths.get(paths.size() - 1)); - res.add(sb.toString()); + sb.append(paths.get(paths.size() - 1));// 记录最后一个节点 + res.add(sb.toString());// 收集一个路径 return; } - if (root.left != null) { + // 递归和回溯是同时进行,所以要放在同一个花括号里 + if (root.left != null) { // 左 traversal(root.left, paths, res); paths.remove(paths.size() - 1);// 回溯 } - if (root.right != null) { + if (root.right != null) { // 右 traversal(root.right, paths, res); paths.remove(paths.size() - 1);// 回溯 } @@ -794,7 +795,7 @@ object Solution { } } ``` - + rust: ```rust @@ -826,3 +827,4 @@ impl Solution { + From aeb80ae90a24ecd67593867b20507c07dd7dab50 Mon Sep 17 00:00:00 2001 From: Logen <47022821+Logenleedev@users.noreply.github.com> Date: Sat, 21 Jan 2023 13:22:09 -0600 Subject: [PATCH 1459/3019] dp python --- ...42\351\202\243\345\245\221\346\225\260.md" | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git "a/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" "b/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" index 1fa5ca1838..69306801f5 100644 --- "a/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" +++ "b/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" @@ -214,6 +214,33 @@ class Solution: a, b = b, c return c +# 动态规划 (注释版。无修饰) +class Solution: + def fib(self, n: int) -> int: + + # 排除 Corner Case + if n == 1: + return 1 + + if n == 0: + return 0 + + # 创建 dp table + dp = [0] * (n + 1) + + # 初始化 dp 数组 + dp[0] = 0 + dp[1] = 1 + + # 遍历顺序: 由前向后。因为后面要用到前面的状态 + for i in range(2, n + 1): + + # 确定递归公式/状态转移公式 + dp[i] = dp[i - 1] + dp[i - 2] + + # 返回答案 + return dp[n] + # 递归实现 class Solution: def fib(self, n: int) -> int: From 1174602e9170d0615b631a0e452d576c6af825a0 Mon Sep 17 00:00:00 2001 From: El nino <69737612+el-nino2020@users.noreply.github.com> Date: Sun, 22 Jan 2023 13:37:36 +0800 Subject: [PATCH 1460/3019] =?UTF-8?q?Update=200714.=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?=E5=90=AB=E6=89=8B=E7=BB=AD=E8=B4=B9.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修正注释中的用词错误 --- ...\234\272\345\220\253\346\211\213\347\273\255\350\264\271.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271.md" "b/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271.md" index 005f9c3829..3f44ec1764 100644 --- "a/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271.md" +++ "b/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271.md" @@ -182,7 +182,7 @@ class Solution { // 动态规划 int[][] dp = new int[prices.length][2]; - // bad case + // base case dp[0][0] = 0; dp[0][1] = -prices[0]; From 51d11d8e81b9217131d668ad940312614c898d46 Mon Sep 17 00:00:00 2001 From: Li Yuxuan <77979684+liyuxuan7762@users.noreply.github.com> Date: Mon, 23 Jan 2023 12:49:42 +0800 Subject: [PATCH 1461/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=E6=A0=88=E5=AE=9E=E7=8E=B0=E5=8F=8D=E8=BD=AC=E9=93=BE=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 更新使用栈实现反转链表 --- ...73\350\275\254\351\223\276\350\241\250.md" | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git "a/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md" "b/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md" index 7db80fe1e3..4920b5b3be 100644 --- "a/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md" +++ "b/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md" @@ -665,6 +665,42 @@ public class LinkNumbers } ``` + + +## 使用栈解决反转链表的问题 +* 首先将所有的结点入栈 +* 然后创建一个虚拟虚拟头结点,让cur指向虚拟头结点。然后开始循环出栈,每出来一个元素,就把它加入到以虚拟头结点为头结点的链表当中,最后返回即可。 + +```java +public ListNode reverseList(ListNode head) { + // 如果链表为空,则返回空 + if (head == null) return null; + // 如果链表中只有只有一个元素,则直接返回 + if (head.next == null) return head; + // 创建栈 每一个结点都入栈 + Stack stack = new Stack<>(); + ListNode cur = head; + while (cur != null) { + stack.push(cur); + cur = cur.next; + } + // 创建一个虚拟头结点 + ListNode pHead = new ListNode(0); + cur = pHead; + while (!stack.isEmpty()) { + ListNode node = stack.pop(); + cur.next = node; + cur = cur.next; + } + // 最后一个元素的next要赋值为空 + cur.next = null; + return pHead.next; +} +``` + +> 采用这种方法需要注意一点。就是当整个出栈循环结束以后,cur正好指向原来链表的第一个结点,而此时结点1中的next指向的是结点2,因此最后还需要`cur.next = null` +![image-20230117195418626](https://raw.githubusercontent.com/liyuxuan7762/MyImageOSS/master/md_images/image-20230117195418626.png) +

From 88750b119003658587b9e03ff3b6f0e525d665c2 Mon Sep 17 00:00:00 2001 From: Logen <47022821+Logenleedev@users.noreply.github.com> Date: Mon, 23 Jan 2023 17:43:15 -0600 Subject: [PATCH 1462/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=BA=8C=E7=BB=B4?= =?UTF-8?q?=E6=95=B0=E7=BB=84=E8=A7=A3=E6=B3=95=20+=20=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...11\345\222\214\345\255\220\351\233\206.md" | 47 ++++++++++++++++++- 1 file changed, 46 insertions(+), 1 deletion(-) diff --git "a/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" "b/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" index ecee1d83fe..936ba27055 100644 --- "a/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" +++ "b/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" @@ -291,18 +291,63 @@ false true false false false true true false false false true true ### Python: ```python +# 一维度数组解法 class Solution: def canPartition(self, nums: List[int]) -> bool: target = sum(nums) if target % 2 == 1: return False target //= 2 - dp = [0] * 10001 + dp = [0] * (len(nums) + 1) for i in range(len(nums)): for j in range(target, nums[i] - 1, -1): dp[j] = max(dp[j], dp[j - nums[i]] + nums[i]) return target == dp[target] ``` +```python +# 二维度数组解法 +class Solution: + def canPartition(self, nums: List[int]) -> bool: + target = sum(nums) + nums = sorted(nums) + + # 做最初的判断 + if target % 2 != 0: + return False + + # 找到 target value 可以认为这个是背包的体积 + target = target // 2 + + row = len(nums) + col = target + 1 + + # 定义 dp table + dp = [[0 for _ in range(col)] for _ in range(row)] + + # 初始 dp value + for i in range(row): + dp[i][0] = 0 + + for j in range(1, target): + if nums[0] <= j: + dp[0][j] = nums[0] + + # 遍历 先遍历物品再遍历背包 + for i in range(1, row): + + cur_weight = nums[i] + cur_value = nums[i] + + for j in range(1, col): + if cur_weight > j: + dp[i][j] = dp[i - 1][j] + else: + dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - cur_weight] + cur_value) + + # 输出结果 + return dp[-1][col - 1] == target +``` + ### Go: ```go // 分割等和子集 动态规划 From 0df3cb05501a0fc9cbc7e3867ccba4e6f5ba33f4 Mon Sep 17 00:00:00 2001 From: MWang <48111863+mouWorks@users.noreply.github.com> Date: Wed, 25 Jan 2023 12:35:45 +0800 Subject: [PATCH 1463/3019] Fix : TypeScript answer * Fixing TypeScript traversal answers - preoder / inorder / postorder has exactly same code, fixed. --- ...\237\344\270\200\350\277\255\344\273\243\346\263\225.md" | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\347\273\237\344\270\200\350\277\255\344\273\243\346\263\225.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\347\273\237\344\270\200\350\277\255\344\273\243\346\263\225.md" index c44bbb9937..274642696c 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\347\273\237\344\270\200\350\277\255\344\273\243\346\263\225.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\347\273\237\344\270\200\350\277\255\344\273\243\346\263\225.md" @@ -536,9 +536,9 @@ function preorderTraversal(root: TreeNode | null): number[] { curNode = helperStack.pop()!; if (curNode !== null) { if (curNode.right !== null) helperStack.push(curNode.right); + if (curNode.left !== null) helperStack.push(curNode.left); helperStack.push(curNode); helperStack.push(null); - if (curNode.left !== null) helperStack.push(curNode.left); } else { curNode = helperStack.pop()!; res.push(curNode.val); @@ -579,9 +579,9 @@ function postorderTraversal(root: TreeNode | null): number[] { while (helperStack.length > 0) { curNode = helperStack.pop()!; if (curNode !== null) { - if (curNode.right !== null) helperStack.push(curNode.right); - helperStack.push(curNode); + helperStack.push(curNode); helperStack.push(null); + if (curNode.right !== null) helperStack.push(curNode.right); if (curNode.left !== null) helperStack.push(curNode.left); } else { curNode = helperStack.pop()!; From 27ba94b581236d83b1778f93778f2ae57bc7e874 Mon Sep 17 00:00:00 2001 From: Logen <47022821+Logenleedev@users.noreply.github.com> Date: Wed, 25 Jan 2023 12:46:13 -0600 Subject: [PATCH 1464/3019] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...37\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" "b/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" index bf4e708abb..3b2c33c125 100644 --- "a/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" +++ "b/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" @@ -224,7 +224,7 @@ class Solution: def lastStoneWeightII(self, stones: List[int]) -> int: sumweight = sum(stones) target = sumweight // 2 - dp = [0] * 15001 + dp = [0] * (target + 1) for i in range(len(stones)): for j in range(target, stones[i] - 1, -1): dp[j] = max(dp[j], dp[j - stones[i]] + stones[i]) From 31e6a1ad95de2a4652796d4367b84655d3653008 Mon Sep 17 00:00:00 2001 From: Guanzhong Pan Date: Wed, 25 Jan 2023 20:10:53 +0000 Subject: [PATCH 1465/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A00062.=E4=B8=8D?= =?UTF-8?q?=E5=90=8C=E8=B7=AF=E5=BE=84.md=20C=E8=AF=AD=E8=A8=80=E6=BB=9A?= =?UTF-8?q?=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 --- ...15\345\220\214\350\267\257\345\276\204.md" | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git "a/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" "b/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" index 2367587c25..4c0e227993 100644 --- "a/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" +++ "b/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" @@ -436,6 +436,26 @@ int uniquePaths(int m, int n){ } ``` +滚动数组解法: +```c +int uniquePaths(int m, int n){ + int i, j; + + // 初始化dp数组 + int *dp = (int*)malloc(sizeof(int) * n); + for (i = 0; i < n; ++i) + dp[i] = 1; + + for (j = 1; j < m; ++j) { + for (i = 1; i < n; ++i) { + // dp[i]为二维数组解法中dp[i-1][j]。dp[i-1]为二维数组解法中dp[i][j-1] + dp[i] += dp[i - 1]; + } + } + return dp[n - 1]; +} +``` + ### Scala ```scala From 9d02c76777849bcf287cc3c11805fb8b98db8ce4 Mon Sep 17 00:00:00 2001 From: Guanzhong Pan Date: Thu, 26 Jan 2023 17:24:38 +0000 Subject: [PATCH 1466/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200063.=E4=B8=8D?= =?UTF-8?q?=E5=90=8C=E8=B7=AF=E5=BE=84II.md=20C=E8=AF=AD=E8=A8=80=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E7=A9=BA=E9=97=B4=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\345\220\214\350\267\257\345\276\204II.md" | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git "a/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" "b/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" index 9aa369563d..b89486e655 100644 --- "a/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" +++ "b/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" @@ -539,6 +539,39 @@ int uniquePathsWithObstacles(int** obstacleGrid, int obstacleGridSize, int* obst } ``` +空间优化版本: +```c +int uniquePathsWithObstacles(int** obstacleGrid, int obstacleGridSize, int* obstacleGridColSize){ + int m = obstacleGridSize; + int n = obstacleGridColSize[0]; + int *dp = (int*)malloc(sizeof(int) * n); + int i, j; + + // 初始化dp为第一行起始状态。 + for (j = 0; j < n; ++j) { + if (obstacleGrid[0][j] == 1) + dp[j] = 0; + else if (j == 0) + dp[j] = 1; + else + dp[j] = dp[j - 1]; + } + + for (i = 1; i < m; ++i) { + for (j = 0; j < n; ++j) { + if (obstacleGrid[i][j] == 1) + dp[j] = 0; + // 若j为0,dp[j]表示最左边一列,无需改动 + // 此处dp[j],dp[j-1]等同于二维dp中的dp[i-1][j]和dp[i][j-1] + else if (j != 0) + dp[j] += dp[j - 1]; + } + } + + return dp[n - 1]; +} +``` + ### Scala ```scala From fed1fffac571444cdbf5868ef986a4d627e577ce Mon Sep 17 00:00:00 2001 From: roylx <73628821+roylx@users.noreply.github.com> Date: Fri, 27 Jan 2023 09:40:18 -0700 Subject: [PATCH 1467/3019] =?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 Python递归法从后向前 --- ...77\273\350\275\254\351\223\276\350\241\250.md" | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git "a/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md" "b/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md" index 7db80fe1e3..d29090d9ee 100644 --- "a/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md" +++ "b/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md" @@ -228,7 +228,22 @@ class Solution: ``` +Python递归法从后向前: +```python +# Definition for singly-linked list. +# class ListNode: +# def __init__(self, val=0, next=None): +# self.val = val +# self.next = next +class Solution: + def reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]: + if not head or not head.next: return head + p = self.reverseList(head.next) + head.next.next = head + head.next = None + return p +``` Go: From d704c10869eb0942af75fb3567c9716c2c4d8696 Mon Sep 17 00:00:00 2001 From: Zehua Ren <48848908+Renzehua1998@users.noreply.github.com> Date: Sat, 28 Jan 2023 10:35:20 +0800 Subject: [PATCH 1468/3019] =?UTF-8?q?Update=20763=E5=88=92=E5=88=86?= =?UTF-8?q?=E5=AD=97=E6=AF=8D=E5=8C=BA=E9=97=B4=20=E6=96=B9=E6=B3=95?= =?UTF-8?q?=E4=BA=8CPython3=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...27\346\257\215\345\214\272\351\227\264.md" | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git "a/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" "b/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" index 65369d252a..d3878dc1c7 100644 --- "a/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" +++ "b/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" @@ -242,6 +242,40 @@ class Solution: left = i + 1 return result +# 解法二(不相交区间法) +class Solution: + def partitionLabels(self, s: str) -> List[int]: + # 记录每个字母出现的区间 + def getBord(s): + hash = [[-float('inf')] * 2 for _ in range(26)] + for i in range(len(s)): + if hash[ord(s[i]) - ord('a')][0] == -float('inf'): + hash[ord(s[i]) - ord('a')][0] = i + hash[ord(s[i]) - ord('a')][1] = i + # 去除字符串中未出现的字母所占用区间 + hash_filter = [] + for item in hash: + if item[0] != -float('inf'): hash_filter.append(item) + return hash_filter + + # 得到无重叠区间题意中的输入样例格式:区间列表 + hash = getBord(s) + # 按照左边界从小到大排序 + hash.sort(key= lambda x: x[0]) + res = [] + left = 0 + # 记录最大右边界 + right = hash[0][1] + for i in range(len(hash)): + # 一旦下一区间左边界大于当前右边界,即可认为出现分割点 + if hash[i][0] > right: + res.append(right - left + 1) + left = hash[i][0] + # 实时更新最大右边界 + right = max(right, hash[i][1]) + # 最右侧区间(字符串长度为1时的特殊情况也包含于其中) + res.append(right - left + 1) + return res ``` ### Go From d555e8815a7406649ea680f45fcfadfe0bd4c84e Mon Sep 17 00:00:00 2001 From: YuhanSun Date: Sat, 28 Jan 2023 10:46:03 -0800 Subject: [PATCH 1469/3019] =?UTF-8?q?Update=200416.=E5=88=86=E5=89=B2?= =?UTF-8?q?=E7=AD=89=E5=92=8C=E5=AD=90=E9=9B=86.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" "b/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" index 936ba27055..952d427416 100644 --- "a/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" +++ "b/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" @@ -87,7 +87,7 @@ 有录友可能想,那还有装不满的时候? -拿输入数组 [1, 5, 11, 5],距离, dp[7] 只能等于 6,因为 只能放进 1 和 5。 +拿输入数组 [1, 5, 11, 5],举例, dp[7] 只能等于 6,因为 只能放进 1 和 5。 而dp[6] 就可以等于6了,放进1 和 5,那么dp[6] == 6,说明背包装满了。 From 4b396e1f37035796e5407db69d3aa7d74c8ba21b Mon Sep 17 00:00:00 2001 From: Logen <47022821+Logenleedev@users.noreply.github.com> Date: Sat, 28 Jan 2023 14:27:57 -0600 Subject: [PATCH 1470/3019] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...2.\351\233\266\351\222\261\345\205\221\346\215\242.md" | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git "a/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" "b/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" index 459741124b..7505f5ec3f 100644 --- "a/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" +++ "b/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" @@ -209,19 +209,19 @@ class Solution: def coinChange(self, coins: List[int], amount: int) -> int: '''版本一''' # 初始化 - dp = [amount + 1]*(amount + 1) + dp = [float("inf")]*(amount + 1) dp[0] = 0 # 遍历物品 for coin in coins: # 遍历背包 for j in range(coin, amount + 1): dp[j] = min(dp[j], dp[j - coin] + 1) - return dp[amount] if dp[amount] < amount + 1 else -1 + return dp[amount] if dp[amount] != float("inf") else -1 def coinChange1(self, coins: List[int], amount: int) -> int: '''版本二''' # 初始化 - dp = [amount + 1]*(amount + 1) + dp = [float("inf")]*(amount + 1) dp[0] = 0 # 遍历物品 for j in range(1, amount + 1): @@ -229,7 +229,7 @@ class Solution: for coin in coins: if j >= coin: dp[j] = min(dp[j], dp[j - coin] + 1) - return dp[amount] if dp[amount] < amount + 1 else -1 + return dp[amount] if dp[amount] != float("inf") else -1 ``` From 614653f6d86a2edc57375f60a993a626e11290fe Mon Sep 17 00:00:00 2001 From: El nino <69737612+el-nino2020@users.noreply.github.com> Date: Mon, 30 Jan 2023 10:46:26 +0800 Subject: [PATCH 1471/3019] =?UTF-8?q?Update=200674.=E6=9C=80=E9=95=BF?= =?UTF-8?q?=E8=BF=9E=E7=BB=AD=E9=80=92=E5=A2=9E=E5=BA=8F=E5=88=97.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit typo --- ...\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" "b/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" index 81155f9b11..3cb680600f 100644 --- "a/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" +++ "b/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" @@ -52,7 +52,7 @@ **注意这里就体现出和[动态规划:300.最长递增子序列](https://programmercarl.com/0300.最长上升子序列.html)的区别!** -因为本题要求连续递增子序列,所以就必要比较nums[i]与nums[i - 1],而不用去比较nums[j]与nums[i] (j是在0到i之间遍历)。 +因为本题要求连续递增子序列,所以就只要比较nums[i]与nums[i - 1],而不用去比较nums[j]与nums[i] (j是在0到i之间遍历)。 既然不用j了,那么也不用两层for循环,本题一层for循环就行,比较nums[i] 和 nums[i - 1]。 From a4e22fb2d61411dfdccd27995079bd92f3396e96 Mon Sep 17 00:00:00 2001 From: ShuBo6 <814183583@qq.com> Date: Mon, 30 Jan 2023 22:29:45 +0800 Subject: [PATCH 1472/3019] =?UTF-8?q?bug&&typo:=200063=E4=B8=8D=E5=90=8C?= =?UTF-8?q?=E8=B7=AF=E5=BE=84II,0343=E6=95=B4=E6=95=B0=E6=8B=86=E5=88=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1.bug: 0063不同路径II go版本代码 2. typo:0343整数拆分 --- ...3.\344\270\215\345\220\214\350\267\257\345\276\204II.md" | 6 ++++-- ...343.\346\225\264\346\225\260\346\213\206\345\210\206.md" | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git "a/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" "b/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" index 9aa369563d..96873cfda7 100644 --- "a/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" +++ "b/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" @@ -335,6 +335,10 @@ class Solution: ```go func uniquePathsWithObstacles(obstacleGrid [][]int) int { m, n := len(obstacleGrid), len(obstacleGrid[0]) + //如果在起点或终点出现了障碍,直接返回0 + if obstacleGrid[m-1][n-1] == 1 || obstacleGrid[0][0] == 1 { + return 0 + } // 定义一个dp数组 dp := make([][]int, m) for i, _ := range dp { @@ -359,8 +363,6 @@ func uniquePathsWithObstacles(obstacleGrid [][]int) int { } return dp[m-1][n-1] } - - ``` ### Javascript diff --git "a/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" "b/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" index 25a6315497..78c76cbd35 100644 --- "a/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" +++ "b/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" @@ -88,7 +88,7 @@ dp[i] 是依靠 dp[i - j]的状态,所以遍历i一定是从前向后遍历, 所以遍历顺序为: ```CPP for (int i = 3; i <= n ; i++) { - for (int j = 1; j <= i / 2; j++) { + for (int j = 1; j < i - 1; j++) { dp[i] = max(dp[i], max((i - j) * j, dp[i - j] * j)); } } From 7bf3645bde75d74b1126da1e9866647763fff3e1 Mon Sep 17 00:00:00 2001 From: Logen <47022821+Logenleedev@users.noreply.github.com> Date: Mon, 30 Jan 2023 20:02:15 -0600 Subject: [PATCH 1473/3019] =?UTF-8?q?=E4=BF=AE=E6=94=B9=20typo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" index 816719c374..3c5b45c149 100644 --- "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" +++ "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" @@ -139,7 +139,7 @@ dp[1] = dp[1 - weight[0]] + value[0] = 15 倒序遍历的原因是,本质上还是一个对二维数组的遍历,并且右下角的值依赖上一层左上角的值,因此需要保证左边的值仍然是上一层的,从右向左覆盖。 -(这里如果读不懂,就在回想一下dp[j]的定义,或者就把两个for循环顺序颠倒一下试试!) +(这里如果读不懂,就再回想一下dp[j]的定义,或者就把两个for循环顺序颠倒一下试试!) **所以一维dp数组的背包在遍历顺序上和二维其实是有很大差异的!**,这一点大家一定要注意。 From 4c08579bd5dd81916768ce3672e1cb1b40049e48 Mon Sep 17 00:00:00 2001 From: simple <37768049+Civitasv@users.noreply.github.com> Date: Tue, 31 Jan 2023 15:04:52 +0800 Subject: [PATCH 1474/3019] =?UTF-8?q?fix:=200001.=20=E4=B8=A4=E6=95=B0?= =?UTF-8?q?=E4=B9=8B=E5=92=8C=EF=BC=8Ctypo=EF=BC=9A=E4=B8=8B=E8=A1=A8=3D>?= =?UTF-8?q?=E4=B8=8B=E6=A0=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" "b/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" index 56cff52779..aa8724db49 100644 --- "a/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" @@ -69,7 +69,7 @@ std::unordered_map 底层实现为哈希表,std::map 和std::multimap 的底 * **map用来做什么** * **map中key和value分别表示什么** -map目的用来存放我们访问过的元素,因为遍历数组的时候,需要记录我们之前遍历过哪些元素和对应的下表,这样才能找到与当前元素相匹配的(也就是相加等于target) +map目的用来存放我们访问过的元素,因为遍历数组的时候,需要记录我们之前遍历过哪些元素和对应的下标,这样才能找到与当前元素相匹配的(也就是相加等于target) 接下来是map中key和value分别表示什么。 @@ -77,7 +77,7 @@ map目的用来存放我们访问过的元素,因为遍历数组的时候, 那么判断元素是否出现,这个元素就要作为key,所以数组中的元素作为key,有key对应的就是value,value用来存下标。 -所以 map中的存储结构为 {key:数据元素,value:数组元素对应的下表}。 +所以 map中的存储结构为 {key:数据元素,value:数组元素对应的下标}。 在遍历数组的时候,只需要向map去查询是否有和目前遍历元素比配的数值,如果有,就找到的匹配对,如果没有,就把目前遍历的元素放进map中,因为map存放的就是我们访问过的元素。 From 7fcbe4900b03323e3a3cc70f79b86afa3554282d Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Wed, 1 Feb 2023 20:40:07 +0800 Subject: [PATCH 1475/3019] Update --- ...7.\350\247\243\346\225\260\347\213\254.md" | 6 ++ ...6.\345\205\250\346\216\222\345\210\227.md" | 8 +- ...\345\205\250\346\216\222\345\210\227II.md" | 10 ++- "problems/0051.N\347\232\207\345\220\216.md" | 8 +- ...15\345\220\214\350\267\257\345\276\204.md" | 5 +- ...\345\220\214\350\267\257\345\276\204II.md" | 5 +- ...0.\347\210\254\346\245\274\346\242\257.md" | 5 +- "problems/0078.\345\255\220\351\233\206.md" | 5 ++ "problems/0090.\345\255\220\351\233\206II.md" | 7 +- ...\345\216\237IP\345\234\260\345\235\200.md" | 5 ++ ...11\346\220\234\347\264\242\346\240\221.md" | 5 ++ ...4.\345\212\240\346\262\271\347\253\231.md" | 30 ++++--- ...64\346\225\260\346\213\206\345\210\206.md" | 6 ++ ...15\345\273\272\351\230\237\345\210\227.md" | 3 +- ...64\346\265\201\351\227\256\351\242\230.md" | 34 ++++++- ...15\345\217\240\345\214\272\351\227\264.md" | 88 ++++++++++++------- ...36\345\255\220\345\272\217\345\210\227.md" | 6 +- ...71\347\210\254\346\245\274\346\242\257.md" | 25 +++--- 18 files changed, 186 insertions(+), 75 deletions(-) diff --git "a/problems/0037.\350\247\243\346\225\260\347\213\254.md" "b/problems/0037.\350\247\243\346\225\260\347\213\254.md" index aaac4c7cc1..18a96d581b 100644 --- "a/problems/0037.\350\247\243\346\225\260\347\213\254.md" +++ "b/problems/0037.\350\247\243\346\225\260\347\213\254.md" @@ -32,6 +32,12 @@ * 你可以假设给定的数独只有唯一解。 * 给定数独永远是 9x9 形式的。 +# 算法公开课 + +**《代码随想录》算法视频公开课:[回溯算法二维递归?解数独不过如此!| LeetCode:37. 解数独](https://www.bilibili.com/video/BV1TW4y1471V/),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 + + + ## 思路 棋盘搜索问题可以使用回溯法暴力搜索,只不过这次我们要做的是**二维递归**。 diff --git "a/problems/0046.\345\205\250\346\216\222\345\210\227.md" "b/problems/0046.\345\205\250\346\216\222\345\210\227.md" index c437f7ca23..86bc704d4b 100644 --- "a/problems/0046.\345\205\250\346\216\222\345\210\227.md" +++ "b/problems/0046.\345\205\250\346\216\222\345\210\227.md" @@ -23,9 +23,13 @@ [3,2,1] ] -## 思路 -**如果对回溯算法基础还不了解的话,我还特意录制了一期视频:[带你学透回溯算法(理论篇)](https://www.bilibili.com/video/BV1cy4y167mM/)** 可以结合题解和视频一起看,希望对大家理解回溯算法有所帮助。 +# 算法公开课 + +**《代码随想录》算法视频公开课:[组合与排列的区别,回溯算法求解的时候,有何不同?| LeetCode:46.全排列](https://www.bilibili.com/video/BV19v4y1S79W/),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 + + +## 思路 此时我们已经学习了[77.组合问题](https://programmercarl.com/0077.组合.html)、 [131.分割回文串](https://programmercarl.com/0131.分割回文串.html)和[78.子集问题](https://programmercarl.com/0078.子集.html),接下来看一看排列问题。 diff --git "a/problems/0047.\345\205\250\346\216\222\345\210\227II.md" "b/problems/0047.\345\205\250\346\216\222\345\210\227II.md" index d9fe8f35ef..3eb99948ea 100644 --- "a/problems/0047.\345\205\250\346\216\222\345\210\227II.md" +++ "b/problems/0047.\345\205\250\346\216\222\345\210\227II.md" @@ -4,9 +4,8 @@

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

-# 排列问题(二) -## 47.全排列 II +# 47.全排列 II [力扣题目链接](https://leetcode.cn/problems/permutations-ii/) @@ -27,10 +26,13 @@ * 1 <= nums.length <= 8 * -10 <= nums[i] <= 10 -## 思路 -**如果对回溯算法基础还不了解的话,我还特意录制了一期视频:[带你学透回溯算法(理论篇)](https://www.bilibili.com/video/BV1cy4y167mM/)** 可以结合题解和视频一起看,希望对大家理解回溯算法有所帮助。 +# 算法公开课 + +**《代码随想录》算法视频公开课:[回溯算法求解全排列,如何去重?| LeetCode:47.全排列 II](https://www.bilibili.com/video/BV1R84y1i7Tm/),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 +## 思路 + 这道题目和[46.全排列](https://programmercarl.com/0046.全排列.html)的区别在与**给定一个可包含重复数字的序列**,要返回**所有不重复的全排列**。 这里又涉及到去重了。 diff --git "a/problems/0051.N\347\232\207\345\220\216.md" "b/problems/0051.N\347\232\207\345\220\216.md" index 16fdf34787..624452fd2c 100644 --- "a/problems/0051.N\347\232\207\345\220\216.md" +++ "b/problems/0051.N\347\232\207\345\220\216.md" @@ -5,7 +5,7 @@

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

-# 第51题. N皇后 +# 51. N皇后 [力扣题目链接](https://leetcode.cn/problems/n-queens/) @@ -28,10 +28,12 @@ n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上, * 输入:n = 1 * 输出:[["Q"]] -## 思路 +# 算法公开课 + +**《代码随想录》算法视频公开课:[这就是传说中的N皇后? 回溯算法安排!| LeetCode:51.N皇后](https://www.bilibili.com/video/BV1Rd4y1c7Bq/),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 -**如果对回溯算法基础还不了解的话,我还特意录制了一期视频:[带你学透回溯算法(理论篇)](https://www.bilibili.com/video/BV1cy4y167mM/)** 可以结合题解和视频一起看,希望对大家理解回溯算法有所帮助。 +## 思路 都知道n皇后问题是回溯算法解决的经典问题,但是用回溯解决多了组合、切割、子集、排列问题之后,遇到这种二维矩阵还会有点不知所措。 diff --git "a/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" "b/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" index 2367587c25..760d3fac28 100644 --- "a/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" +++ "b/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" @@ -43,6 +43,10 @@ * 1 <= m, n <= 100 * 题目数据保证答案小于等于 2 * 10^9 +# 算法公开课 + +**《代码随想录》算法视频公开课:[动态规划中如何初始化很重要!| LeetCode:62.不同路径](https://www.bilibili.com/video/BV1ve4y1x7Eu/),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 + ## 思路 ### 深搜 @@ -237,7 +241,6 @@ public: 然后在给出动规的方法,依然是使用动规五部曲,这次我们就要考虑如何正确的初始化了,初始化和遍历顺序其实也很重要! -就酱,循序渐进学算法,认准「代码随想录」! ## 其他语言版本 diff --git "a/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" "b/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" index 9aa369563d..68010140eb 100644 --- "a/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" +++ "b/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" @@ -43,6 +43,10 @@ * 1 <= m, n <= 100 * obstacleGrid[i][j] 为 0 或 1 +# 算法公开课 + +**《代码随想录》算法视频公开课:[动态规划,这次遇到障碍了| LeetCode:63. 不同路径 II](https://www.bilibili.com/video/BV1Ld4y1k7c6/),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 + ## 思路 @@ -200,7 +204,6 @@ public: 也有一些小细节,例如:初始化的部分,很容易忽略了障碍之后应该都是0的情况。 -就酱,「代码随想录」值得推荐给身边学算法的同学朋友们,关注后都会发现相见恨晚! ## 其他语言版本 diff --git "a/problems/0070.\347\210\254\346\245\274\346\242\257.md" "b/problems/0070.\347\210\254\346\245\274\346\242\257.md" index fb23be7d48..14aeef0142 100644 --- "a/problems/0070.\347\210\254\346\245\274\346\242\257.md" +++ "b/problems/0070.\347\210\254\346\245\274\346\242\257.md" @@ -5,6 +5,7 @@

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

# 70. 爬楼梯 + [力扣题目链接](https://leetcode.cn/problems/climbing-stairs/) 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 @@ -163,7 +164,7 @@ public: 这道题目还可以继续深化,就是一步一个台阶,两个台阶,三个台阶,直到 m个台阶,有多少种方法爬到n阶楼顶。 -这又有难度了,这其实是一个完全背包问题,但力扣上没有这种题目,所以后续我在讲解背包问题的时候,今天这道题还会从背包问题的角度上来再讲一遍。 +这又有难度了,这其实是一个完全背包问题,但力扣上没有这种题目,所以后续我在讲解背包问题的时候,今天这道题还会从背包问题的角度上来再讲一遍。 如果想提前看一下,可以看这篇:[70.爬楼梯完全背包版本](https://programmercarl.com/0070.%E7%88%AC%E6%A5%BC%E6%A2%AF%E5%AE%8C%E5%85%A8%E8%83%8C%E5%8C%85%E7%89%88%E6%9C%AC.html) 这里我先给出我的实现代码: @@ -185,7 +186,7 @@ public: 代码中m表示最多可以爬m个台阶。 -**以上代码不能运行哈,我主要是为了体现只要把m换成2,粘过去,就可以AC爬楼梯这道题,不信你就粘一下试试,哈哈**。 +**以上代码不能运行哈,我主要是为了体现只要把m换成2,粘过去,就可以AC爬楼梯这道题,不信你就粘一下试试**。 **此时我就发现一个绝佳的大厂面试题**,第一道题就是单纯的爬楼梯,然后看候选人的代码实现,如果把dp[0]的定义成1了,就可以发难了,为什么dp[0]一定要初始化为1,此时可能候选人就要强行给dp[0]应该是1找各种理由。那这就是一个考察点了,对dp[i]的定义理解的不深入。 diff --git "a/problems/0078.\345\255\220\351\233\206.md" "b/problems/0078.\345\255\220\351\233\206.md" index b5958e65e9..b0c51d4496 100644 --- "a/problems/0078.\345\255\220\351\233\206.md" +++ "b/problems/0078.\345\255\220\351\233\206.md" @@ -27,6 +27,11 @@   [] ] +# 算法公开课 + +**《代码随想录》算法视频公开课:[回溯算法解决子集问题,树上节点都是目标集和! | LeetCode:78.子集](https://www.bilibili.com/video/BV1U84y1q7Ci),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 + + # 思路 求子集问题和[77.组合](https://programmercarl.com/0077.组合.html)和[131.分割回文串](https://programmercarl.com/0131.分割回文串.html)又不一样了。 diff --git "a/problems/0090.\345\255\220\351\233\206II.md" "b/problems/0090.\345\255\220\351\233\206II.md" index 57cfd09dbe..5df479869f 100644 --- "a/problems/0090.\345\255\220\351\233\206II.md" +++ "b/problems/0090.\345\255\220\351\233\206II.md" @@ -4,9 +4,8 @@

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

-# 子集问题(二) -## 90.子集II +# 90.子集II [力扣题目链接](https://leetcode.cn/problems/subsets-ii/) @@ -26,6 +25,10 @@ [] ] +# 算法公开课 + +**《代码随想录》算法视频公开课:[回溯算法解决子集问题,如何去重?| LeetCode:90.子集II](https://www.bilibili.com/video/BV1vm4y1F71J/),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 + ## 思路 diff --git "a/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" "b/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" index 97178cd5b1..1cf152c2b5 100644 --- "a/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" +++ "b/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" @@ -41,6 +41,11 @@ * s 仅由数字组成 +# 算法公开课 + +**《代码随想录》算法视频公开课:[回溯算法如何分割字符串并判断是合法IP?| LeetCode:93.复原IP地址](https://www.bilibili.com/video/BV1XP4y1U73i/),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 + + # 思路 做这道题目之前,最好先把[131.分割回文串](https://programmercarl.com/0131.分割回文串.html)这个做了。 diff --git "a/problems/0096.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0096.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" index 519fd3237f..99a4b8dda3 100644 --- "a/problems/0096.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" +++ "b/problems/0096.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" @@ -14,6 +14,11 @@ ![](https://img-blog.csdnimg.cn/20210113161941835.png) +# 算法公开课 + +**《代码随想录》算法视频公开课:[动态规划找到子状态之间的关系很重要!| LeetCode:96.不同的二叉搜索树](https://www.bilibili.com/video/BV1eK411o7QA/),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 + + ## 思路 这道题目描述很简短,但估计大部分同学看完都是懵懵的状态,这得怎么统计呢? diff --git "a/problems/0134.\345\212\240\346\262\271\347\253\231.md" "b/problems/0134.\345\212\240\346\262\271\347\253\231.md" index ade847730c..9762dc9f2f 100644 --- "a/problems/0134.\345\212\240\346\262\271\347\253\231.md" +++ "b/problems/0134.\345\212\240\346\262\271\347\253\231.md" @@ -48,7 +48,7 @@ ## 暴力方法 -暴力的方法很明显就是$O(n^2)$的,遍历每一个加油站为起点的情况,模拟一圈。 +暴力的方法很明显就是O(n^2)的,遍历每一个加油站为起点的情况,模拟一圈。 如果跑了一圈,中途没有断油,而且最后油量大于等于0,说明这个起点是ok的。 @@ -119,8 +119,8 @@ public: } }; ``` -* 时间复杂度:$O(n)$ -* 空间复杂度:$O(1)$ +* 时间复杂度:O(n) +* 空间复杂度:O(1) **其实我不认为这种方式是贪心算法,因为没有找出局部最优,而是直接从全局最优的角度上思考问题**。 @@ -136,18 +136,26 @@ public: 每个加油站的剩余量rest[i]为gas[i] - cost[i]。 -i从0开始累加rest[i],和记为curSum,一旦curSum小于零,说明[0, i]区间都不能作为起始位置,起始位置从i+1算起,再从0计算curSum。 +i从0开始累加rest[i],和记为curSum,一旦curSum小于零,说明[0, i]区间都不能作为起始位置,因为这个区间选择任何一个位置作为起点,到i这里都会断油,那么起始位置从i+1算起,再从0计算curSum。 如图: -![134.加油站](https://img-blog.csdnimg.cn/20201213162821958.png) -那么为什么一旦[i,j] 区间和为负数,起始位置就可以是j+1呢,j+1后面就不会出现更大的负数? +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20230117165628.png) + +那么为什么一旦[0,i] 区间和为负数,起始位置就可以是i+1呢,i+1后面就不会出现更大的负数? + +如果出现更大的负数,就是更新i,那么起始位置又变成新的i+1了。 + +那有没有可能 [0,i] 区间 选某一个作为起点,累加到 i这里 curSum是不会小于零呢? 如图: -如果出现更大的负数,就是更新j,那么起始位置又变成新的j+1了。 +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20230117170703.png) -而且j之前出现了多少负数,j后面就会出现多少正数,因为耗油总和是大于零的(前提我们已经确定了一定可以跑完全程)。 +如果 curSum<0 说明 区间和1 + 区间和2 < 0, 那么 假设从上图中的位置开始计数curSum不会小于0的话,就是 区间和2>0。 -**那么局部最优:当前累加rest[j]的和curSum一旦小于0,起始位置至少要是j+1,因为从j开始一定不行。全局最优:找到可以跑一圈的起始位置**。 +区间和1 + 区间和2 < 0 同时 区间和2>0,只能说明区间和1 < 0, 那么就会从假设的箭头初就开始从新选择其实位置了。 + + +**那么局部最优:当前累加rest[i]的和curSum一旦小于0,起始位置至少要是i+1,因为从i之前开始一定不行。全局最优:找到可以跑一圈的起始位置**。 局部最优可以推出全局最优,找不出反例,试试贪心! @@ -173,8 +181,8 @@ public: } }; ``` -* 时间复杂度:$O(n)$ -* 空间复杂度:$O(1)$ +* 时间复杂度:O(n) +* 空间复杂度:O(1) **说这种解法为贪心算法,才是有理有据的,因为全局最优解是根据局部最优推导出来的**。 diff --git "a/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" "b/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" index 25a6315497..bc69c5c450 100644 --- "a/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" +++ "b/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" @@ -21,6 +21,12 @@ * 解释: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36。 * 说明: 你可以假设 n 不小于 2 且不大于 58。 + +# 算法公开课 + +**《代码随想录》算法视频公开课:[动态规划,本题关键在于理解递推公式!| LeetCode:343. 整数拆分](https://www.bilibili.com/video/BV1Mg411q7YJ/),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 + + ## 思路 看到这道题目,都会想拆成两个呢,还是三个呢,还是四个.... diff --git "a/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" "b/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" index 934cc9eea2..73a7affc53 100644 --- "a/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" +++ "b/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" @@ -175,9 +175,8 @@ public: 对于写题解的同学,刷题用什么语言影响就非常大,如果自己语言没有学好而强调算法和编程语言没关系,其实是会误伤别人的。 -**这也是我为什么统一使用C++写题解的原因**,其实用其他语言java、python、php、go啥的,我也能写,我的Github上也有用这些语言写的小项目,但写题解的话,我就不能保证把语言特性这块讲清楚,所以我始终坚持使用最熟悉的C++写题解。 +**这也是我为什么统一使用C++写题解的原因** -**而且我在写题解的时候涉及语言特性,一般都会后面加上括号说明一下。没办法,认真负责就是我,哈哈**。 ## 其他语言版本 diff --git "a/problems/0417.\345\244\252\345\271\263\346\264\213\345\244\247\350\245\277\346\264\213\346\260\264\346\265\201\351\227\256\351\242\230.md" "b/problems/0417.\345\244\252\345\271\263\346\264\213\345\244\247\350\245\277\346\264\213\346\260\264\346\265\201\351\227\256\351\242\230.md" index 35fdc7d71b..f936399b44 100644 --- "a/problems/0417.\345\244\252\345\271\263\346\264\213\345\244\247\350\245\277\346\264\213\346\260\264\346\265\201\351\227\256\351\242\230.md" +++ "b/problems/0417.\345\244\252\345\271\263\346\264\213\345\244\247\350\245\277\346\264\213\346\260\264\346\265\201\351\227\256\351\242\230.md" @@ -3,10 +3,42 @@

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+ + + # 417. 太平洋大西洋水流问题 [题目链接](https://leetcode.cn/problems/pacific-atlantic-water-flow/) +有一个 m × n 的矩形岛屿,与 太平洋 和 大西洋 相邻。 “太平洋” 处于大陆的左边界和上边界,而 “大西洋” 处于大陆的右边界和下边界。 + +这个岛被分割成一个由若干方形单元格组成的网格。给定一个 m x n 的整数矩阵 heights , heights[r][c] 表示坐标 (r, c) 上单元格 高于海平面的高度 。 + +岛上雨水较多,如果相邻单元格的高度 小于或等于 当前单元格的高度,雨水可以直接向北、南、东、西流向相邻单元格。水可以从海洋附近的任何单元格流入海洋。 + +返回网格坐标 result 的 2D 列表 ,其中 result[i] = [ri, ci] 表示雨水从单元格 (ri, ci) 流动 既可流向太平洋也可流向大西洋 。 + +示例 1: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20230129103212.png) + +* 输入: heights = [[1,2,2,3,5],[3,2,3,4,4],[2,4,5,3,1],[6,7,1,4,5],[5,1,1,2,4]] +* 输出: [[0,4],[1,3],[1,4],[2,2],[3,0],[3,1],[4,0]] + +示例 2: + +* 输入: heights = [[2,1],[1,2]] +* 输出: [[0,0],[0,1],[1,0],[1,1]] + +提示: + +* m == heights.length +* n == heights[r].length +* 1 <= m, n <= 200 +* 0 <= heights[r][c] <= 10^5 + + + ## 思路 不少同学可能被这道题的题目描述迷惑了,其实就是找到哪些点 可以同时到达太平洋和大西洋。 流动的方式只能从高往低流。 @@ -96,7 +128,7 @@ public: ## 优化 -那么我们可以 反过来想,从太平洋边上的节点 逆流而上,将遍历过的节点都标记上。 从大西洋的边上节点 逆流而长,讲遍历过的节点也标记上。 +那么我们可以 反过来想,从太平洋边上的节点 逆流而上,将遍历过的节点都标记上。 从大西洋的边上节点 逆流而长,将遍历过的节点也标记上。 然后两方都标记过的节点就是既可以流太平洋也可以流大西洋的节点。 从太平洋边上节点出发,如图: diff --git "a/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" "b/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" index 33f8c3f28f..e5675e04aa 100644 --- "a/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" +++ "b/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" @@ -34,33 +34,21 @@ **相信很多同学看到这道题目都冥冥之中感觉要排序,但是究竟是按照右边界排序,还是按照左边界排序呢?** -这其实是一个难点! - -按照右边界排序,就要从左向右遍历,因为右边界越小越好,只要右边界越小,留给下一个区间的空间就越大,所以从左向右遍历,优先选右边界小的。 - -按照左边界排序,就要从右向左遍历,因为左边界数值越大越好(越靠右),这样就给前一个区间的空间就越大,所以可以从右向左遍历。 - -如果按照左边界排序,还从左向右遍历的话,其实也可以,逻辑会有所不同。 - -一些同学做这道题目可能真的去模拟去重复区间的行为,这是比较麻烦的,还要去删除区间。 - -题目只是要求移除区间的个数,没有必要去真实的模拟删除区间! +其实都可以。主要就是为了让区间尽可能的重叠。 **我来按照右边界排序,从左向右记录非交叉区间的个数。最后用区间总数减去非交叉区间的个数就是需要移除的区间个数了**。 此时问题就是要求非交叉区间的最大个数。 -右边界排序之后,局部最优:优先选右边界小的区间,所以从左向右遍历,留给下一个区间的空间大一些,从而尽量避免交叉。全局最优:选取最多的非交叉区间。 - -局部最优推出全局最优,试试贪心! - 这里记录非交叉区间的个数还是有技巧的,如图: -![435.无重叠区间](https://img-blog.csdnimg.cn/20201221201553618.png) +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20230201164134.png) 区间,1,2,3,4,5,6都按照右边界排好序。 -每次取非交叉区间的时候,都是可右边界最小的来做分割点(这样留给下一个区间的空间就越大),所以第一条分割线就是区间1结束的位置。 +当确定区间 1 和 区间2 重叠后,如何确定是否与 区间3 也重贴呢? + +就是取 区间1 和 区间2 右边界的最小值,因为这个最小值之前的部分一定是 区间1 和区间2 的重合部分,如果这个最小值也触达到区间3,那么说明 区间 1,2,3都是重合的。 接下来就是找大于区间1结束位置的区间,是从区间4开始。**那有同学问了为什么不从区间5开始?别忘了已经是按照右边界排序的了**。 @@ -97,28 +85,62 @@ public: 大家此时会发现如此复杂的一个问题,代码实现却这么简单! -## 总结 -本题我认为难度级别可以算是hard级别的! -总结如下难点: +## 补充(1) -* 难点一:一看题就有感觉需要排序,但究竟怎么排序,按左边界排还是右边界排。 -* 难点二:排完序之后如何遍历,如果没有分析好遍历顺序,那么排序就没有意义了。 -* 难点三:直接求重复的区间是复杂的,转而求最大非重复区间个数。 -* 难点四:求最大非重复区间个数时,需要一个分割点来做标记。 +左边界排序可不可以呢? -**这四个难点都不好想,但任何一个没想到位,这道题就解不了**。 +也是可以的,只不过 左边界排序我们就是直接求 重叠的区间,count为记录重叠区间数。 -一些录友可能看网上的题解代码很简单,照葫芦画瓢稀里糊涂的就过了,但是其题解可能并没有把问题难点讲清楚,然后自己再没有钻研的话,那么一道贪心经典区间问题就这么浪费掉了。 +```CPP +class Solution { +public: + static bool cmp (const vector& a, const vector& b) { + return a[0] < b[0]; // 改为左边界排序 + } + int eraseOverlapIntervals(vector>& intervals) { + if (intervals.size() == 0) return 0; + sort(intervals.begin(), intervals.end(), cmp); + int count = 0; // 注意这里从0开始,因为是记录重叠区间 + int end = intervals[0][1]; // 记录区间分割点 + for (int i = 1; i < intervals.size(); i++) { + if (intervals[i][0] >= end) end = intervals[i][1]; // 无重叠的情况 + else { // 重叠情况 + end = min(end, intervals[i][1]); + count++; + } + } + return count; + } +}; +``` -贪心就是这样,代码有时候很简单(不是指代码短,而是逻辑简单),但想法是真的难! +其实代码还可以精简一下, 用 intervals[i][1] 替代 end变量,只判断 重叠情况就好 -这和动态规划还不一样,动规的代码有个递推公式,可能就看不懂了,而贪心往往是直白的代码,但想法读不懂,哈哈。 +```CPP +class Solution { +public: + static bool cmp (const vector& a, const vector& b) { + return a[0] < b[0]; // 改为左边界排序 + } + int eraseOverlapIntervals(vector>& intervals) { + if (intervals.size() == 0) return 0; + sort(intervals.begin(), intervals.end(), cmp); + int count = 0; // 注意这里从0开始,因为是记录重叠区间 + for (int i = 1; i < intervals.size(); i++) { + if (intervals[i][0] < intervals[i - 1][1]) { //重叠情况 + intervals[i][1] = min(intervals[i - 1][1], intervals[i][1]); + count++; + } + } + return count; + } +}; -**所以我把本题的难点也一一列出,帮大家不仅代码看的懂,想法也理解的透彻!** +``` -## 补充 +## 补充(2) 本题其实和[452.用最少数量的箭引爆气球](https://programmercarl.com/0452.用最少数量的箭引爆气球.html)非常像,弓箭的数量就相当于是非交叉区间的数量,只要把弓箭那道题目代码里射爆气球的判断条件加个等号(认为[0,1][1,2]不是相邻区间),然后用总区间数减去弓箭数量 就是要移除的区间数量了。 @@ -129,7 +151,7 @@ class Solution { public: // 按照区间右边界排序 static bool cmp (const vector& a, const vector& b) { - return a[1] < b[1]; + return a[1] < b[1]; // 右边界排序 } int eraseOverlapIntervals(vector>& intervals) { if (intervals.size() == 0) return 0; @@ -149,13 +171,13 @@ public: }; ``` -这里按照 左区间遍历,或者按照右边界遍历,都可以AC,具体原因我还没有仔细看,后面有空再补充。 +这里按照 左边界排序,或者按照右边界排序,都可以AC,原理是一样的。 ```CPP class Solution { public: // 按照区间左边界排序 static bool cmp (const vector& a, const vector& b) { - return a[0] < b[0]; + return a[0] < b[0]; // 左边界排序 } int eraseOverlapIntervals(vector>& intervals) { if (intervals.size() == 0) return 0; diff --git "a/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" "b/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" index 82b3604eb9..6aa81539ec 100644 --- "a/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" @@ -23,11 +23,12 @@ * 数组中的整数范围是 [-100,100]。 * 给定数组中可能包含重复数字,相等的数字应该被视为递增的一种情况。 +# 算法公开课 -## 思路 +**《代码随想录》算法视频公开课:[回溯算法精讲,树层去重与树枝去重 | LeetCode:491.递增子序列](https://www.bilibili.com/video/BV1EG4y1h78v/),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 -**如果对回溯算法基础还不了解的话,我还特意录制了一期视频:[带你学透回溯算法(理论篇)](https://www.bilibili.com/video/BV1cy4y167mM/)** 可以结合题解和视频一起看,希望对大家理解回溯算法有所帮助。 +## 思路 这个递增子序列比较像是取有序的子集。而且本题也要求不能有相同的递增子序列。 @@ -193,7 +194,6 @@ public: **对于养成思维定式或者套模板套嗨了的同学,这道题起到了很好的警醒作用。更重要的是拓展了大家的思路!** -**就酱,如果感觉「代码随想录」很干货,就帮Carl宣传一波吧!** ## 其他语言版本 diff --git "a/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" "b/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" index 3c6abd48f1..44b6406c8a 100644 --- "a/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" +++ "b/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" @@ -21,21 +21,28 @@ 示例 1: -输入:cost = [10, 15, 20] -输出:15 -解释:最低花费是从 cost[1] 开始,然后走两步即可到阶梯顶,一共花费 15 。 - 示例 2: +* 输入:cost = [10, 15, 20] +* 输出:15 +* 解释:最低花费是从 cost[1] 开始,然后走两步即可到阶梯顶,一共花费 15 。 -输入:cost = [1, 100, 1, 1, 1, 100, 1, 1, 100, 1] -输出:6 -解释:最低花费方式是从 cost[0] 开始,逐个经过那些 1 ,跳过 cost[3] ,一共花费 6 。 +示例 2: + +* 输入:cost = [1, 100, 1, 1, 1, 100, 1, 1, 100, 1] +* 输出:6 +* 解释:最低花费方式是从 cost[0] 开始,逐个经过那些 1 ,跳过 cost[3] ,一共花费 6 。 提示: * cost 的长度范围是 [2, 1000]。 * cost[i] 将会是一个整型数据,范围为 [0, 999] 。 ------------------ + +# 算法公开课 + +**《代码随想录》算法视频公开课:[动态规划开更了!| LeetCode:746. 使用最小花费爬楼梯](https://www.bilibili.com/video/BV16G411c7yZ/),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 + + +----------- 本题之前的题目描述是很模糊的,看不出来,第一步需要花费体力值,最后一步不用花费,还是说 第一步不花费体力值,最后一步花费。 @@ -194,8 +201,6 @@ public: 难的是把题目按梯度排好,循序渐进,再按照统一方法论把这些都串起来,所以大家不要催我哈,按照我的节奏一步一步来就行了。 -学算法,认准「代码随想录」,没毛病! - ## 其他语言版本 以下版本其他语言版本,大多是按照旧力扣题解来写的,欢迎大家在[Github](https://github.com/youngyangyang04/leetcode-master)上[提交pr](https://mp.weixin.qq.com/s/tqCxrMEU-ajQumL1i8im9A),修正一波。 From 3347033a2ece87d39f398265f2dbe2d66864c1f8 Mon Sep 17 00:00:00 2001 From: Logen <47022821+Logenleedev@users.noreply.github.com> Date: Wed, 1 Feb 2023 12:51:07 -0600 Subject: [PATCH 1476/3019] =?UTF-8?q?=E5=90=8C=E6=AD=A5=E8=A7=86=E9=A2=91?= =?UTF-8?q?=E8=AE=B2=E8=A7=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...2\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" "b/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" index d480da83c4..3cd7ab26f8 100644 --- "a/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" +++ "b/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" @@ -120,7 +120,7 @@ dp[i][4] = max(dp[i - 1][4], dp[i - 1][3] + prices[i]); 大家可以看到红色框为最后两次卖出的状态。 -现在最大的时候一定是卖出的状态,而两次卖出的状态现金最大一定是最后一次卖出。 +现在最大的时候一定是卖出的状态,而两次卖出的状态现金最大一定是最后一次卖出。如果想不明白的录友也可以这么理解:如果第一次卖出已经是最大值了,那么我们可以在当天立刻买入再立刻卖出。所以dp[4][4]已经包含了dp[4][2]的情况。也就是说第二次卖出手里所剩的钱一定是最多的。 所以最终最大利润是dp[4][4] From 5cf52116e2d20018385050d519d78d78a91e6059 Mon Sep 17 00:00:00 2001 From: ZerenZhang2022 <118794589+ZerenZhang2022@users.noreply.github.com> Date: Sun, 5 Feb 2023 01:33:49 -0500 Subject: [PATCH 1477/3019] =?UTF-8?q?Update=200045.=E8=B7=B3=E8=B7=83?= =?UTF-8?q?=E6=B8=B8=E6=88=8FII.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 加入python-动态规划做法代码 --- ...267\263\350\267\203\346\270\270\346\210\217II.md" | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git "a/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" "b/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" index 7dbf531bb9..d4f2e6ea78 100644 --- "a/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" +++ "b/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" @@ -229,7 +229,19 @@ class Solution: step += 1 return step ``` +```python +# 动态规划做法 +class Solution: + def jump(self, nums: List[int]) -> int: + result = [10**4+1]*len(nums) + result[0]=0 + for i in range(len(nums)): + for j in range(nums[i]+1): + if i+j Date: Wed, 8 Feb 2023 17:26:35 +0800 Subject: [PATCH 1478/3019] =?UTF-8?q?=E5=A2=9E=E6=B7=BB=E9=A2=98=E7=9B=AE?= =?UTF-8?q?=E7=BC=96=E5=8F=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 316 ++++++++++++++++++++++++++---------------------------- 1 file changed, 154 insertions(+), 162 deletions(-) diff --git a/README.md b/README.md index a04f58a6b3..11b63accfe 100644 --- a/README.md +++ b/README.md @@ -118,88 +118,81 @@ * [递归算法的时间与空间复杂度分析!](./problems/前序/递归算法的时间与空间复杂度分析.md) * [刷了这么多题,你了解自己代码的内存消耗么?](./problems/前序/刷了这么多题,你了解自己代码的内存消耗么?.md) -## 杂谈 - -* [「代码随想录」刷题网站上线](https://mp.weixin.qq.com/s/-6rd_g7LrVD1fuKBYk2tXQ)。 -* [LeetCode-Master上榜了](https://mp.weixin.qq.com/s/wZRTrA9Rbvgq1yEkSw4vfQ) -* [上榜之后,都有哪些变化?](https://mp.weixin.qq.com/s/VJBV0qSBthjnbbmW-lctLA) -* [大半年过去了......](https://mp.weixin.qq.com/s/lubfeistPxBLSQIe5XYg5g) -* [一万录友在B站学算法!](https://mp.weixin.qq.com/s/Vzq4zkMZY7erKeu0fqGLgw) ## 数组 1. [数组过于简单,但你该了解这些!](./problems/数组理论基础.md) -2. [数组:二分查找](./problems/0704.二分查找.md) -3. [数组:移除元素](./problems/0027.移除元素.md) -4. [数组:有序数组的平方](./problems/0977.有序数组的平方.md) -5. [数组:长度最小的子数组](./problems/0209.长度最小的子数组.md) -6. [数组:螺旋矩阵II](./problems/0059.螺旋矩阵II.md) +2. [数组:704.二分查找](./problems/0704.二分查找.md) +3. [数组:27.移除元素](./problems/0027.移除元素.md) +4. [数组:977.有序数组的平方](./problems/0977.有序数组的平方.md) +5. [数组:209.长度最小的子数组](./problems/0209.长度最小的子数组.md) +6. [数组:59.螺旋矩阵II](./problems/0059.螺旋矩阵II.md) 7. [数组:总结篇](./problems/数组总结篇.md) ## 链表 1. [关于链表,你该了解这些!](./problems/链表理论基础.md) -2. [链表:移除链表元素](./problems/0203.移除链表元素.md) -3. [链表:设计链表](./problems/0707.设计链表.md) -4. [链表:翻转链表](./problems/0206.翻转链表.md) -5. [链表:两两交换链表中的节点](./problems/0024.两两交换链表中的节点.md) -6. [链表:删除链表的倒数第 N 个结点](./problems/0019.删除链表的倒数第N个节点.md) +2. [链表:203.移除链表元素](./problems/0203.移除链表元素.md) +3. [链表:707.设计链表](./problems/0707.设计链表.md) +4. [链表:206.翻转链表](./problems/0206.翻转链表.md) +5. [链表:24.两两交换链表中的节点](./problems/0024.两两交换链表中的节点.md) +6. [链表:19.删除链表的倒数第 N 个结点](./problems/0019.删除链表的倒数第N个节点.md) 7. [链表:链表相交](./problems/面试题02.07.链表相交.md) -8. [链表:环形链表](./problems/0142.环形链表II.md) +8. [链表:142.环形链表](./problems/0142.环形链表II.md) 9. [链表:总结篇!](./problems/链表总结篇.md) ## 哈希表 1. [关于哈希表,你该了解这些!](./problems/哈希表理论基础.md) -2. [哈希表:有效的字母异位词](./problems/0242.有效的字母异位词.md) -3. [哈希表:查找常用字符](./problems/1002.查找常用字符.md) -4. [哈希表:两个数组的交集](./problems/0349.两个数组的交集.md) -5. [哈希表:快乐数](./problems/0202.快乐数.md) -6. [哈希表:两数之和](./problems/0001.两数之和.md) -7. [哈希表:四数相加II](./problems/0454.四数相加II.md) -8. [哈希表:赎金信](./problems/0383.赎金信.md) -9. [哈希表:三数之和](./problems/0015.三数之和.md) -10. [双指针法:四数之和](./problems/0018.四数之和.md) +2. [哈希表:242.有效的字母异位词](./problems/0242.有效的字母异位词.md) +3. [哈希表:1002.查找常用字符](./problems/1002.查找常用字符.md) +4. [哈希表:349.两个数组的交集](./problems/0349.两个数组的交集.md) +5. [哈希表:202.快乐数](./problems/0202.快乐数.md) +6. [哈希表:1.两数之和](./problems/0001.两数之和.md) +7. [哈希表:454.四数相加II](./problems/0454.四数相加II.md) +8. [哈希表:383.赎金信](./problems/0383.赎金信.md) +9. [哈希表:15.三数之和](./problems/0015.三数之和.md) +10. [双指针法:18.四数之和](./problems/0018.四数之和.md) 11. [哈希表:总结篇!](./problems/哈希表总结.md) ## 字符串 -1. [字符串:反转字符串](./problems/0344.反转字符串.md) -2. [字符串:反转字符串II](./problems/0541.反转字符串II.md) +1. [字符串:344.反转字符串](./problems/0344.反转字符串.md) +2. [字符串:541.反转字符串II](./problems/0541.反转字符串II.md) 3. [字符串:替换空格](./problems/剑指Offer05.替换空格.md) -4. [字符串:翻转字符串里的单词](./problems/0151.翻转字符串里的单词.md) +4. [字符串:151.翻转字符串里的单词](./problems/0151.翻转字符串里的单词.md) 5. [字符串:左旋转字符串](./problems/剑指Offer58-II.左旋转字符串.md) 6. [帮你把KMP算法学个通透](./problems/0028.实现strStr.md) -8. [字符串:重复的子字符串](./problems/0459.重复的子字符串.md) +8. [字符串:459.重复的子字符串](./problems/0459.重复的子字符串.md) 9. [字符串:总结篇!](./problems/字符串总结.md) ## 双指针法 双指针法基本都是应用在数组,字符串与链表的题目上 -1. [数组:移除元素](./problems/0027.移除元素.md) -2. [字符串:反转字符串](./problems/0344.反转字符串.md) +1. [数组:27.移除元素](./problems/0027.移除元素.md) +2. [字符串:344.反转字符串](./problems/0344.反转字符串.md) 3. [字符串:替换空格](./problems/剑指Offer05.替换空格.md) -4. [字符串:翻转字符串里的单词](./problems/0151.翻转字符串里的单词.md) -5. [链表:翻转链表](./problems/0206.翻转链表.md) -6. [链表:删除链表的倒数第 N 个结点](./problems/0019.删除链表的倒数第N个节点.md) +4. [字符串:151.翻转字符串里的单词](./problems/0151.翻转字符串里的单词.md) +5. [链表:206.翻转链表](./problems/0206.翻转链表.md) +6. [链表:19.删除链表的倒数第 N 个结点](./problems/0019.删除链表的倒数第N个节点.md) 7. [链表:链表相交](./problems/面试题02.07.链表相交.md) -8. [链表:环形链表](./problems/0142.环形链表II.md) -9. [双指针:三数之和](./problems/0015.三数之和.md) -10. [双指针:四数之和](./problems/0018.四数之和.md) +8. [链表:142.环形链表](./problems/0142.环形链表II.md) +9. [双指针:15.三数之和](./problems/0015.三数之和.md) +10. [双指针:18.四数之和](./problems/0018.四数之和.md) 11. [双指针:总结篇!](./problems/双指针总结.md) ## 栈与队列 -1. [栈与队列:来看看栈和队列不为人知的一面](./problems/栈与队列理论基础.md) -2. [栈与队列:用栈实现队列](./problems/0232.用栈实现队列.md) -3. [栈与队列:用队列实现栈](./problems/0225.用队列实现栈.md) -4. [栈与队列:有效的括号](./problems/0020.有效的括号.md) -5. [栈与队列:删除字符串中的所有相邻重复项](./problems/1047.删除字符串中的所有相邻重复项.md) -6. [栈与队列:逆波兰表达式求值](./problems/0150.逆波兰表达式求值.md) -7. [栈与队列:滑动窗口最大值](./problems/0239.滑动窗口最大值.md) -8. [栈与队列:前K个高频元素](./problems/0347.前K个高频元素.md) +1. [栈与队列:理论基础](./problems/栈与队列理论基础.md) +2. [栈与队列:232.用栈实现队列](./problems/0232.用栈实现队列.md) +3. [栈与队列:225.用队列实现栈](./problems/0225.用队列实现栈.md) +4. [栈与队列:20.有效的括号](./problems/0020.有效的括号.md) +5. [栈与队列:1047.删除字符串中的所有相邻重复项](./problems/1047.删除字符串中的所有相邻重复项.md) +6. [栈与队列:150.逆波兰表达式求值](./problems/0150.逆波兰表达式求值.md) +7. [栈与队列:239.滑动窗口最大值](./problems/0239.滑动窗口最大值.md) +8. [栈与队列:347.前K个高频元素](./problems/0347.前K个高频元素.md) 9. [栈与队列:总结篇!](./problems/栈与队列总结.md) ## 二叉树 @@ -212,35 +205,35 @@ 3. [二叉树:二叉树的迭代遍历](./problems/二叉树的迭代遍历.md) 4. [二叉树:二叉树的统一迭代法](./problems/二叉树的统一迭代法.md) 5. [二叉树:二叉树的层序遍历](./problems/0102.二叉树的层序遍历.md) -6. [二叉树:翻转二叉树](./problems/0226.翻转二叉树.md) +6. [二叉树:226.翻转二叉树](./problems/0226.翻转二叉树.md) 7. [本周小结!(二叉树)](./problems/周总结/20200927二叉树周末总结.md) -8. [二叉树:对称二叉树](./problems/0101.对称二叉树.md) -9. [二叉树:二叉树的最大深度](./problems/0104.二叉树的最大深度.md) -10. [二叉树:二叉树的最小深度](./problems/0111.二叉树的最小深度.md) -11. [二叉树:完全二叉树的节点个数](./problems/0222.完全二叉树的节点个数.md) -12. [二叉树:平衡二叉树](./problems/0110.平衡二叉树.md) -13. [二叉树:二叉树的所有路径](./problems/0257.二叉树的所有路径.md) -14. [本周总结!二叉树系列二](./problems/周总结/20201003二叉树周末总结.md) +8. [二叉树:101.对称二叉树](./problems/0101.对称二叉树.md) +9. [二叉树:104.二叉树的最大深度](./problems/0104.二叉树的最大深度.md) +10. [二叉树:111.二叉树的最小深度](./problems/0111.二叉树的最小深度.md) +11. [二叉树:222.完全二叉树的节点个数](./problems/0222.完全二叉树的节点个数.md) +12. [二叉树:110.平衡二叉树](./problems/0110.平衡二叉树.md) +13. [二叉树:257.二叉树的所有路径](./problems/0257.二叉树的所有路径.md) +14. [本周总结!(二叉树)](./problems/周总结/20201003二叉树周末总结.md) 15. [二叉树:二叉树中递归带着回溯](./problems/二叉树中递归带着回溯.md) -16. [二叉树:左叶子之和](./problems/0404.左叶子之和.md) -17. [二叉树:找树左下角的值](./problems/0513.找树左下角的值.md) -18. [二叉树:路径总和](./problems/0112.路径总和.md) -19. [二叉树:构造二叉树](./problems/0106.从中序与后序遍历序列构造二叉树.md) -20. [二叉树:最大二叉树](./problems/0654.最大二叉树.md) -21. [本周小结!(二叉树系列三)](./problems/周总结/20201010二叉树周末总结.md) -22. [二叉树:合并两个二叉树](./problems/0617.合并二叉树.md) -23. [二叉树:二叉搜索树登场!](./problems/0700.二叉搜索树中的搜索.md) -24. [二叉树:验证二叉搜索树](./problems/0098.验证二叉搜索树.md) -25. [二叉树:搜索树的最小绝对差](./problems/0530.二叉搜索树的最小绝对差.md) -26. [二叉树:二叉搜索树中的众数](./problems/0501.二叉搜索树中的众数.md) -27. [二叉树:公共祖先问题](./problems/0236.二叉树的最近公共祖先.md) -28. [本周小结!(二叉树系列四)](./problems/周总结/20201017二叉树周末总结.md) -29. [二叉树:搜索树的最近公共祖先](./problems/0235.二叉搜索树的最近公共祖先.md) -30. [二叉树:搜索树中的插入操作](./problems/0701.二叉搜索树中的插入操作.md) -31. [二叉树:搜索树中的删除操作](./problems/0450.删除二叉搜索树中的节点.md) -32. [二叉树:修剪一棵搜索树](./problems/0669.修剪二叉搜索树.md) -33. [二叉树:构造一棵搜索树](./problems/0108.将有序数组转换为二叉搜索树.md) -34. [二叉树:搜索树转成累加树](./problems/0538.把二叉搜索树转换为累加树.md) +16. [二叉树:404.左叶子之和](./problems/0404.左叶子之和.md) +17. [二叉树:513.找树左下角的值](./problems/0513.找树左下角的值.md) +18. [二叉树:112.路径总和](./problems/0112.路径总和.md) +19. [二叉树:106.构造二叉树](./problems/0106.从中序与后序遍历序列构造二叉树.md) +20. [二叉树:654.最大二叉树](./problems/0654.最大二叉树.md) +21. [本周小结!(二叉树)](./problems/周总结/20201010二叉树周末总结.md) +22. [二叉树:617.合并两个二叉树](./problems/0617.合并二叉树.md) +23. [二叉树:700.二叉搜索树登场!](./problems/0700.二叉搜索树中的搜索.md) +24. [二叉树:98.验证二叉搜索树](./problems/0098.验证二叉搜索树.md) +25. [二叉树:530.搜索树的最小绝对差](./problems/0530.二叉搜索树的最小绝对差.md) +26. [二叉树:501.二叉搜索树中的众数](./problems/0501.二叉搜索树中的众数.md) +27. [二叉树:236.公共祖先问题](./problems/0236.二叉树的最近公共祖先.md) +28. [本周小结!(二叉树)](./problems/周总结/20201017二叉树周末总结.md) +29. [二叉树:235.搜索树的最近公共祖先](./problems/0235.二叉搜索树的最近公共祖先.md) +30. [二叉树:701.搜索树中的插入操作](./problems/0701.二叉搜索树中的插入操作.md) +31. [二叉树:450.搜索树中的删除操作](./problems/0450.删除二叉搜索树中的节点.md) +32. [二叉树:669.修剪二叉搜索树](./problems/0669.修剪二叉搜索树.md) +33. [二叉树:108.将有序数组转换为二叉搜索树](./problems/0108.将有序数组转换为二叉搜索树.md) +34. [二叉树:538.把二叉搜索树转换为累加树](./problems/0538.把二叉搜索树转换为累加树.md) 35. [二叉树:总结篇!(需要掌握的二叉树技能都在这里了)](./problems/二叉树总结篇.md) ## 回溯算法 @@ -250,27 +243,27 @@ 回溯算法大纲 1. [关于回溯算法,你该了解这些!](./problems/回溯算法理论基础.md) -2. [回溯算法:组合问题](./problems/0077.组合.md) -3. [回溯算法:组合问题再剪剪枝](./problems/0077.组合优化.md) -4. [回溯算法:求组合总和!](./problems/0216.组合总和III.md) -5. [回溯算法:电话号码的字母组合](./problems/0017.电话号码的字母组合.md) +2. [回溯算法:77.组合](./problems/0077.组合.md) +3. [回溯算法:77.组合优化](./problems/0077.组合优化.md) +4. [回溯算法:216.组合总和III](./problems/0216.组合总和III.md) +5. [回溯算法:17.电话号码的字母组合](./problems/0017.电话号码的字母组合.md) 6. [本周小结!(回溯算法系列一)](./problems/周总结/20201030回溯周末总结.md) -7. [回溯算法:求组合总和(二)](./problems/0039.组合总和.md) -8. [回溯算法:求组合总和(三)](./problems/0040.组合总和II.md) -9. [回溯算法:分割回文串](./problems/0131.分割回文串.md) -10. [回溯算法:复原IP地址](./problems/0093.复原IP地址.md) -11. [回溯算法:求子集问题!](./problems/0078.子集.md) +7. [回溯算法:39.组合总和](./problems/0039.组合总和.md) +8. [回溯算法:40.组合总和II](./problems/0040.组合总和II.md) +9. [回溯算法:131.分割回文串](./problems/0131.分割回文串.md) +10. [回溯算法:93.复原IP地址](./problems/0093.复原IP地址.md) +11. [回溯算法:78.子集](./problems/0078.子集.md) 12. [本周小结!(回溯算法系列二)](./problems/周总结/20201107回溯周末总结.md) -13. [回溯算法:求子集问题(二)](./problems/0090.子集II.md) -14. [回溯算法:递增子序列](./problems/0491.递增子序列.md) -15. [回溯算法:排列问题!](./problems/0046.全排列.md) -16. [回溯算法:排列问题(二)](./problems/0047.全排列II.md) +13. [回溯算法:90.子集II](./problems/0090.子集II.md) +14. [回溯算法:491.递增子序列](./problems/0491.递增子序列.md) +15. [回溯算法:46.全排列](./problems/0046.全排列.md) +16. [回溯算法:47.全排列II](./problems/0047.全排列II.md) 17. [本周小结!(回溯算法系列三)](./problems/周总结/20201112回溯周末总结.md) 18. [回溯算法去重问题的另一种写法](./problems/回溯算法去重问题的另一种写法.md) -19. [回溯算法:重新安排行程](./problems/0332.重新安排行程.md) -20. [回溯算法:N皇后问题](./problems/0051.N皇后.md) -21. [回溯算法:解数独](./problems/0037.解数独.md) -22. [一篇总结带你彻底搞透回溯算法!](./problems/回溯总结.md) +19. [回溯算法:332.重新安排行程](./problems/0332.重新安排行程.md) +20. [回溯算法:51.N皇后](./problems/0051.N皇后.md) +21. [回溯算法:37.解数独](./problems/0037.解数独.md) +22. [回溯算法总结篇](./problems/回溯总结.md) ## 贪心算法 @@ -280,30 +273,29 @@ 贪心算法大纲 1. [关于贪心算法,你该了解这些!](./problems/贪心算法理论基础.md) -2. [贪心算法:分发饼干](./problems/0455.分发饼干.md) -3. [贪心算法:摆动序列](./problems/0376.摆动序列.md) -4. [贪心算法:最大子序和](./problems/0053.最大子序和.md) +2. [贪心算法:455.分发饼干](./problems/0455.分发饼干.md) +3. [贪心算法:376.摆动序列](./problems/0376.摆动序列.md) +4. [贪心算法:53.最大子序和](./problems/0053.最大子序和.md) 5. [本周小结!(贪心算法系列一)](./problems/周总结/20201126贪心周末总结.md) -6. [贪心算法:买卖股票的最佳时机II](./problems/0122.买卖股票的最佳时机II.md) -7. [贪心算法:跳跃游戏](./problems/0055.跳跃游戏.md) -8. [贪心算法:跳跃游戏II](./problems/0045.跳跃游戏II.md) -9. [贪心算法:K次取反后最大化的数组和](./problems/1005.K次取反后最大化的数组和.md) +6. [贪心算法:122.买卖股票的最佳时机II](./problems/0122.买卖股票的最佳时机II.md) +7. [贪心算法:55.跳跃游戏](./problems/0055.跳跃游戏.md) +8. [贪心算法:45.跳跃游戏II](./problems/0045.跳跃游戏II.md) +9. [贪心算法:1005.K次取反后最大化的数组和](./problems/1005.K次取反后最大化的数组和.md) 10. [本周小结!(贪心算法系列二)](./problems/周总结/20201203贪心周末总结.md) -11. [贪心算法:加油站](./problems/0134.加油站.md) -12. [贪心算法:分发糖果](./problems/0135.分发糖果.md) -13. [贪心算法:柠檬水找零](./problems/0860.柠檬水找零.md) -14. [贪心算法:根据身高重建队列](./problems/0406.根据身高重建队列.md) +11. [贪心算法:134.加油站](./problems/0134.加油站.md) +12. [贪心算法:135.分发糖果](./problems/0135.分发糖果.md) +13. [贪心算法:860.柠檬水找零](./problems/0860.柠檬水找零.md) +14. [贪心算法:406.根据身高重建队列](./problems/0406.根据身高重建队列.md) 15. [本周小结!(贪心算法系列三)](./problems/周总结/20201217贪心周末总结.md) -16. [贪心算法:根据身高重建队列(续集)](./problems/根据身高重建队列(vector原理讲解).md) -17. [贪心算法:用最少数量的箭引爆气球](./problems/0452.用最少数量的箭引爆气球.md) -18. [贪心算法:无重叠区间](./problems/0435.无重叠区间.md) -19. [贪心算法:划分字母区间](./problems/0763.划分字母区间.md) -20. [贪心算法:合并区间](./problems/0056.合并区间.md) +16. [贪心算法:406.根据身高重建队列(续集)](./problems/根据身高重建队列(vector原理讲解).md) +17. [贪心算法:452.用最少数量的箭引爆气球](./problems/0452.用最少数量的箭引爆气球.md) +18. [贪心算法:435.无重叠区间](./problems/0435.无重叠区间.md) +19. [贪心算法:763.划分字母区间](./problems/0763.划分字母区间.md) +20. [贪心算法:56.合并区间](./problems/0056.合并区间.md) 21. [本周小结!(贪心算法系列四)](./problems/周总结/20201224贪心周末总结.md) -22. [贪心算法:单调递增的数字](./problems/0738.单调递增的数字.md) -23. [贪心算法:买卖股票的最佳时机含手续费](./problems/0714.买卖股票的最佳时机含手续费.md) -24. [贪心算法:我要监控二叉树!](./problems/0968.监控二叉树.md) -25. [贪心算法:总结篇!(每逢总结必经典)](./problems/贪心算法总结篇.md) +22. [贪心算法:738.单调递增的数字](./problems/0738.单调递增的数字.md) +23. [贪心算法:968.监控二叉树](./problems/0968.监控二叉树.md) +24. [贪心算法:总结篇!(每逢总结必经典)](./problems/贪心算法总结篇.md) ## 动态规划 @@ -311,14 +303,14 @@ 1. [关于动态规划,你该了解这些!](./problems/动态规划理论基础.md) -2. [动态规划:斐波那契数](./problems/0509.斐波那契数.md) -3. [动态规划:爬楼梯](./problems/0070.爬楼梯.md) -4. [动态规划:使用最小花费爬楼梯](./problems/0746.使用最小花费爬楼梯.md) +2. [动态规划:509.斐波那契数](./problems/0509.斐波那契数.md) +3. [动态规划:70.爬楼梯](./problems/0070.爬楼梯.md) +4. [动态规划:746.使用最小花费爬楼梯](./problems/0746.使用最小花费爬楼梯.md) 5. [本周小结!(动态规划系列一)](./problems/周总结/20210107动规周末总结.md) -6. [动态规划:不同路径](./problems/0062.不同路径.md) -7. [动态规划:不同路径还不够,要有障碍!](./problems/0063.不同路径II.md) -8. [动态规划:整数拆分,你要怎么拆?](./problems/0343.整数拆分.md) -9. [动态规划:不同的二叉搜索树](./problems/0096.不同的二叉搜索树.md) +6. [动态规划:62.不同路径](./problems/0062.不同路径.md) +7. [动态规划:63.不同路径II](./problems/0063.不同路径II.md) +8. [动态规划:343.整数拆分](./problems/0343.整数拆分.md) +9. [动态规划:96.不同的二叉搜索树](./problems/0096.不同的二叉搜索树.md) 10. [本周小结!(动态规划系列二)](./problems/周总结/20210114动规周末总结.md) 背包问题系列: @@ -326,44 +318,44 @@ 背包问题大纲 -11. [动态规划:关于01背包问题,你该了解这些!](./problems/背包理论基础01背包-1.md) -12. [动态规划:关于01背包问题,你该了解这些!(滚动数组)](./problems/背包理论基础01背包-2.md) -13. [动态规划:分割等和子集可以用01背包!](./problems/0416.分割等和子集.md) -14. [动态规划:最后一块石头的重量 II](./problems/1049.最后一块石头的重量II.md) +11. [动态规划:01背包理论基础](./problems/背包理论基础01背包-1.md) +12. [动态规划:01背包理论基础(滚动数组)](./problems/背包理论基础01背包-2.md) +13. [动态规划:416.分割等和子集](./problems/0416.分割等和子集.md) +14. [动态规划:1049.最后一块石头的重量II](./problems/1049.最后一块石头的重量II.md) 15. [本周小结!(动态规划系列三)](./problems/周总结/20210121动规周末总结.md) -16. [动态规划:目标和!](./problems/0494.目标和.md) -17. [动态规划:一和零!](./problems/0474.一和零.md) -18. [动态规划:关于完全背包,你该了解这些!](./problems/背包问题理论基础完全背包.md) -19. [动态规划:给你一些零钱,你要怎么凑?](./problems/0518.零钱兑换II.md) +16. [动态规划:494.目标和](./problems/0494.目标和.md) +17. [动态规划:474.一和零](./problems/0474.一和零.md) +18. [动态规划:完全背包总结篇](./problems/背包问题理论基础完全背包.md) +19. [动态规划:518.零钱兑换II](./problems/0518.零钱兑换II.md) 20. [本周小结!(动态规划系列四)](./problems/周总结/20210128动规周末总结.md) -21. [动态规划:Carl称它为排列总和!](./problems/0377.组合总和Ⅳ.md) -22. [动态规划:以前我没得选,现在我选择再爬一次!](./problems/0070.爬楼梯完全背包版本.md) -23. [动态规划: 给我个机会,我再兑换一次零钱](./problems/0322.零钱兑换.md) -24. [动态规划:一样的套路,再求一次完全平方数](./problems/0279.完全平方数.md) +21. [动态规划:377.组合总和Ⅳ](./problems/0377.组合总和Ⅳ.md) +22. [动态规划:70.爬楼梯(完全背包版本)](./problems/0070.爬楼梯完全背包版本.md) +23. [动态规划:322.零钱兑换](./problems/0322.零钱兑换.md) +24. [动态规划:279.完全平方数](./problems/0279.完全平方数.md) 25. [本周小结!(动态规划系列五)](./problems/周总结/20210204动规周末总结.md) -26. [动态规划:单词拆分](./problems/0139.单词拆分.md) -27. [动态规划:关于多重背包,你该了解这些!](./problems/背包问题理论基础多重背包.md) -28. [听说背包问题很难? 这篇总结篇来拯救你了](./problems/背包总结篇.md) +26. [动态规划:139.单词拆分](./problems/0139.单词拆分.md) +27. [动态规划:多重背包理论基础](./problems/背包问题理论基础多重背包.md) +28. [背包问题总结篇](./problems/背包总结篇.md) 打家劫舍系列: -29. [动态规划:开始打家劫舍!](./problems/0198.打家劫舍.md) -30. [动态规划:继续打家劫舍!](./problems/0213.打家劫舍II.md) -31. [动态规划:还要打家劫舍!](./problems/0337.打家劫舍III.md) +29. [动态规划:198.打家劫舍](./problems/0198.打家劫舍.md) +30. [动态规划:213.打家劫舍II](./problems/0213.打家劫舍II.md) +31. [动态规划:337.打家劫舍III](./problems/0337.打家劫舍III.md) 股票系列: 股票问题总结 -32. [动态规划:买卖股票的最佳时机](./problems/0121.买卖股票的最佳时机.md) -33. [动态规划:本周我们都讲了这些(系列六)](./problems/周总结/20210225动规周末总结.md) -34. [动态规划:买卖股票的最佳时机II](./problems/0122.买卖股票的最佳时机II(动态规划).md) -35. [动态规划:买卖股票的最佳时机III](./problems/0123.买卖股票的最佳时机III.md) -36. [动态规划:买卖股票的最佳时机IV](./problems/0188.买卖股票的最佳时机IV.md) -37. [动态规划:最佳买卖股票时机含冷冻期](./problems/0309.最佳买卖股票时机含冷冻期.md) -38. [动态规划:本周我们都讲了这些(系列七)](./problems/周总结/20210304动规周末总结.md) -39. [动态规划:买卖股票的最佳时机含手续费](./problems/0714.买卖股票的最佳时机含手续费(动态规划).md) +32. [动态规划:121.买卖股票的最佳时机](./problems/0121.买卖股票的最佳时机.md) +33. [动态规划:本周小结(系列六)](./problems/周总结/20210225动规周末总结.md) +34. [动态规划:122.买卖股票的最佳时机II](./problems/0122.买卖股票的最佳时机II(动态规划).md) +35. [动态规划:123.买卖股票的最佳时机III](./problems/0123.买卖股票的最佳时机III.md) +36. [动态规划:188.买卖股票的最佳时机IV](./problems/0188.买卖股票的最佳时机IV.md) +37. [动态规划:309.最佳买卖股票时机含冷冻期](./problems/0309.最佳买卖股票时机含冷冻期.md) +38. [动态规划:本周小结(系列七)](./problems/周总结/20210304动规周末总结.md) +39. [动态规划:714.买卖股票的最佳时机含手续费](./problems/0714.买卖股票的最佳时机含手续费(动态规划).md) 40. [动态规划:股票系列总结篇](./problems/动态规划-股票问题总结篇.md) 子序列系列: @@ -371,29 +363,29 @@ -41. [动态规划:最长递增子序列](./problems/0300.最长上升子序列.md) -42. [动态规划:最长连续递增序列](./problems/0674.最长连续递增序列.md) -43. [动态规划:最长重复子数组](./problems/0718.最长重复子数组.md) -44. [动态规划:最长公共子序列](./problems/1143.最长公共子序列.md) -45. [动态规划:不相交的线](./problems/1035.不相交的线.md) -46. [动态规划:最大子序和](./problems/0053.最大子序和(动态规划).md) -47. [动态规划:判断子序列](./problems/0392.判断子序列.md) -48. [动态规划:不同的子序列](./problems/0115.不同的子序列.md) -49. [动态规划:两个字符串的删除操作](./problems/0583.两个字符串的删除操作.md) -50. [动态规划:编辑距离](./problems/0072.编辑距离.md) -51. [为了绝杀编辑距离,Carl做了三步铺垫,你都知道么?](./problems/为了绝杀编辑距离,卡尔做了三步铺垫.md) -52. [动态规划:回文子串](./problems/0647.回文子串.md) -53. [动态规划:最长回文子序列](./problems/0516.最长回文子序列.md) +41. [动态规划:300.最长递增子序列](./problems/0300.最长上升子序列.md) +42. [动态规划:674.最长连续递增序列](./problems/0674.最长连续递增序列.md) +43. [动态规划:718.最长重复子数组](./problems/0718.最长重复子数组.md) +44. [动态规划:1143.最长公共子序列](./problems/1143.最长公共子序列.md) +45. [动态规划:1035.不相交的线](./problems/1035.不相交的线.md) +46. [动态规划:53.最大子序和](./problems/0053.最大子序和(动态规划).md) +47. [动态规划:392.判断子序列](./problems/0392.判断子序列.md) +48. [动态规划:115.不同的子序列](./problems/0115.不同的子序列.md) +49. [动态规划:583.两个字符串的删除操作](./problems/0583.两个字符串的删除操作.md) +50. [动态规划:72.编辑距离](./problems/0072.编辑距离.md) +51. [编辑距离总结篇](./problems/为了绝杀编辑距离,卡尔做了三步铺垫.md) +52. [动态规划:647.回文子串](./problems/0647.回文子串.md) +53. [动态规划:516.最长回文子序列](./problems/0516.最长回文子序列.md) 54. [动态规划总结篇](./problems/动态规划总结篇.md) ## 单调栈 -1. [单调栈:每日温度](./problems/0739.每日温度.md) -2. [单调栈:下一个更大元素I](./problems/0496.下一个更大元素I.md) -3. [单调栈:下一个更大元素II](./problems/0503.下一个更大元素II.md) -4. [单调栈:接雨水](./problems/0042.接雨水.md) -5. [单调栈:柱状图中最大的矩形](./problems/0084.柱状图中最大的矩形.md) +1. [单调栈:739.每日温度](./problems/0739.每日温度.md) +2. [单调栈:496.下一个更大元素I](./problems/0496.下一个更大元素I.md) +3. [单调栈:503.下一个更大元素II](./problems/0503.下一个更大元素II.md) +4. [单调栈:42.接雨水](./problems/0042.接雨水.md) +5. [单调栈:84.柱状图中最大的矩形](./problems/0084.柱状图中最大的矩形.md) (持续更新中....) From 1ec9d9bcb40f4855d914fbd936c3349d221205cd Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Wed, 8 Feb 2023 17:28:04 +0800 Subject: [PATCH 1479/3019] Update --- ...10\345\271\266\345\214\272\351\227\264.md" | 84 +++---------------- ...4.\345\212\240\346\262\271\347\253\231.md" | 2 +- ...06\345\217\221\347\263\226\346\236\234.md" | 7 +- ...25\350\257\215\346\213\206\345\210\206.md" | 5 ++ ...50\345\271\263\346\226\271\346\225\260.md" | 17 ++-- ...66\351\222\261\345\205\221\346\215\242.md" | 28 ++++--- ...345\256\266\345\212\253\350\210\215III.md" | 3 +- ...10\346\200\273\345\222\214\342\205\243.md" | 8 +- ...11\345\222\214\345\255\220\351\233\206.md" | 17 ++-- ...06\345\217\221\351\245\274\345\271\262.md" | 3 +- ...4.\344\270\200\345\222\214\351\233\266.md" | 17 ++-- ...4.\347\233\256\346\240\207\345\222\214.md" | 21 +++-- ...\351\222\261\345\205\221\346\215\242II.md" | 10 ++- ...01\350\247\204\345\210\222\357\274\211.md" | 20 ++--- ...36\347\232\204\346\225\260\345\255\227.md" | 19 ++--- ...27\346\257\215\345\214\272\351\227\264.md" | 4 +- ...47\344\272\272\345\267\245\345\262\233.md" | 2 +- ...\347\232\204\351\207\215\351\207\217II.md" | 7 +- ...06\350\256\262\350\247\243\357\274\211.md" | 4 +- ...47\241\20001\350\203\214\345\214\205-1.md" | 6 +- ...47\241\20001\350\203\214\345\214\205-2.md" | 5 +- ...14\345\205\250\350\203\214\345\214\205.md" | 5 +- 22 files changed, 146 insertions(+), 148 deletions(-) diff --git "a/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" "b/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" index 7b092c9b57..3c980c2be3 100644 --- "a/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" +++ "b/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" @@ -25,21 +25,15 @@ ## 思路 -大家应该都感觉到了,此题一定要排序,那么按照左边界排序,还是右边界排序呢? +本题的本质其实还是判断重叠区间问题。 -都可以! +大家如果认真做题的话,话发现和我们刚刚讲过的[452. 用最少数量的箭引爆气球](https://programmercarl.com/0452.用最少数量的箭引爆气球.html) 和 [435. 无重叠区间](https://programmercarl.com/0435.无重叠区间.html) 都是一个套路。 -那么我按照左边界排序,排序之后局部最优:每次合并都取最大的右边界,这样就可以合并更多的区间了,整体最优:合并所有重叠的区间。 +这几道题都是判断区间重叠,区别就是判断区间重叠后的逻辑,本题是判断区间重贴后要进行区间合并。 -局部最优可以推出全局最优,找不出反例,试试贪心。 +所以一样的套路,先排序,让所有的相邻区间尽可能的重叠在一起,按左边界,或者右边界排序都可以,处理逻辑稍有不同。 -那有同学问了,本来不就应该合并最大右边界么,这和贪心有啥关系? - -有时候贪心就是常识!哈哈 - -按照左边界从小到大排序之后,如果 `intervals[i][0] < intervals[i - 1][1]` 即intervals[i]左边界 < intervals[i - 1]右边界,则一定有重复,因为intervals[i]的左边界一定是大于等于intervals[i - 1]的左边界。 - -即:intervals[i]的左边界在intervals[i - 1]左边界和右边界的范围内,那么一定有重复! +按照左边界从小到大排序之后,如果 `intervals[i][0] <= intervals[i - 1][1]` 即intervals[i]的左边界 <= intervals[i - 1]的右边界,则一定有重叠。(本题相邻区间也算重贴,所以是<=) 这么说有点抽象,看图:(**注意图中区间都是按照左边界排序之后了**) @@ -51,57 +45,24 @@ C++代码如下: -```CPP -class Solution { -public: - // 按照区间左边界从小到大排序 - static bool cmp (const vector& a, const vector& b) { - return a[0] < b[0]; - } - vector> merge(vector>& intervals) { - vector> result; - if (intervals.size() == 0) return result; - sort(intervals.begin(), intervals.end(), cmp); - bool flag = false; // 标记最后一个区间有没有合并 - int length = intervals.size(); - - for (int i = 1; i < length; i++) { - int start = intervals[i - 1][0]; // 初始为i-1区间的左边界 - int end = intervals[i - 1][1]; // 初始i-1区间的右边界 - while (i < length && intervals[i][0] <= end) { // 合并区间 - end = max(end, intervals[i][1]); // 不断更新右区间 - if (i == length - 1) flag = true; // 最后一个区间也合并了 - i++; // 继续合并下一个区间 - } - // start和end是表示intervals[i - 1]的左边界右边界,所以最优intervals[i]区间是否合并了要标记一下 - result.push_back({start, end}); - } - // 如果最后一个区间没有合并,将其加入result - if (flag == false) { - result.push_back({intervals[length - 1][0], intervals[length - 1][1]}); - } - return result; - } -}; -``` - -当然以上代码有冗余一些,可以优化一下,如下:(思路是一样的) - ```CPP class Solution { public: vector> merge(vector>& intervals) { vector> result; - if (intervals.size() == 0) return result; + if (intervals.size() == 0) return result; // 区间集合为空直接返回 // 排序的参数使用了lambda表达式 sort(intervals.begin(), intervals.end(), [](const vector& a, const vector& b){return a[0] < b[0];}); - result.push_back(intervals[0]); + // 第一个区间就可以放进结果集里,后面如果重叠,在result上直接合并 + result.push_back(intervals[0]); + for (int i = 1; i < intervals.size(); i++) { - if (result.back()[1] >= intervals[i][0]) { // 合并区间 - result.back()[1] = max(result.back()[1], intervals[i][1]); + if (result.back()[1] >= intervals[i][0]) { // 发现重叠区间 + // 合并区间,只更新右边界就好,因为result.back()的左边界一定是最小值,因为我们按照左边界排序的 + result.back()[1] = max(result.back()[1], intervals[i][1]); } else { - result.push_back(intervals[i]); + result.push_back(intervals[i]); // 区间不重叠 } } return result; @@ -109,25 +70,6 @@ public: }; ``` -* 时间复杂度:O(nlog n) ,有一个快排 -* 空间复杂度:O(n),有一个快排,最差情况(倒序)时,需要n次递归调用。因此确实需要O(n)的栈空间 - - -## 总结 - -对于贪心算法,很多同学都是:**如果能凭常识直接做出来,就会感觉不到自己用了贪心, 一旦第一直觉想不出来, 可能就一直想不出来了**。 - -跟着「代码随想录」刷题的录友应该感受过,贪心难起来,真的难。 - -那应该怎么办呢? - -正如我贪心系列开篇词[关于贪心算法,你该了解这些!](https://programmercarl.com/贪心算法理论基础.html)中讲解的一样,贪心本来就没有套路,也没有框架,所以各种常规解法需要多接触多练习,自然而然才会想到。 - -「代码随想录」会把贪心常见的经典题目覆盖到,大家只要认真学习打卡就可以了。 - - - - ## 其他语言版本 diff --git "a/problems/0134.\345\212\240\346\262\271\347\253\231.md" "b/problems/0134.\345\212\240\346\262\271\347\253\231.md" index 8eb0293b1c..77e199fd35 100644 --- "a/problems/0134.\345\212\240\346\262\271\347\253\231.md" +++ "b/problems/0134.\345\212\240\346\262\271\347\253\231.md" @@ -65,7 +65,7 @@ public: for (int i = 0; i < cost.size(); i++) { int rest = gas[i] - cost[i]; // 记录剩余油量 int index = (i + 1) % cost.size(); - while (rest > 0 && index != i) { // 模拟以i为起点行驶一圈 + while (rest > 0 && index != i) { // 模拟以i为起点行驶一圈(如果有rest==0,那么答案就不唯一了) rest += gas[index] - cost[index]; index = (index + 1) % cost.size(); } diff --git "a/problems/0135.\345\210\206\345\217\221\347\263\226\346\236\234.md" "b/problems/0135.\345\210\206\345\217\221\347\263\226\346\236\234.md" index f56e1839a6..1a2fe92a5d 100644 --- "a/problems/0135.\345\210\206\345\217\221\347\263\226\346\236\234.md" +++ "b/problems/0135.\345\210\206\345\217\221\347\263\226\346\236\234.md" @@ -59,10 +59,15 @@ for (int i = 1; i < ratings.size(); i++) { 遍历顺序这里有同学可能会有疑问,为什么不能从前向后遍历呢? -因为如果从前向后遍历,根据 ratings[i + 1] 来确定 ratings[i] 对应的糖果,那么每次都不能利用上前一次的比较结果了。 +因为 rating[5]与rating[4]的比较 要利用上 rating[5]与rating[6]的比较结果,所以 要从后向前遍历。 + +如果从前向后遍历,rating[5]与rating[4]的比较 就不能用上 rating[5]与rating[6]的比较结果了 。如图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20230202102044.png) **所以确定左孩子大于右孩子的情况一定要从后向前遍历!** + 如果 ratings[i] > ratings[i + 1],此时candyVec[i](第i个小孩的糖果数量)就有两个选择了,一个是candyVec[i + 1] + 1(从右边这个加1得到的糖果数量),一个是candyVec[i](之前比较右孩子大于左孩子得到的糖果数量)。 那么又要贪心了,局部最优:取candyVec[i + 1] + 1 和 candyVec[i] 最大的糖果数量,保证第i个小孩的糖果数量既大于左边的也大于右边的。全局最优:相邻的孩子中,评分高的孩子获得更多的糖果。 diff --git "a/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" "b/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" index f76d807528..2148971d51 100644 --- "a/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" +++ "b/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" @@ -33,6 +33,11 @@ * 输入: s = "catsandog", wordDict = ["cats", "dog", "sand", "and", "cat"] * 输出: false +# 算法公开课 + +**《代码随想录》算法视频公开课:[你的背包如何装满?| LeetCode:139.单词拆分](https://www.bilibili.com/video/BV1pd4y147Rh/),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 + + ## 思路 看到这道题目的时候,大家应该回想起我们之前讲解回溯法专题的时候,讲过的一道题目[回溯算法:分割回文串](https://programmercarl.com/0131.分割回文串.html),就是枚举字符串的所有分割情况。 diff --git "a/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" "b/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" index 53f6b6d084..0654e49442 100644 --- "a/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" +++ "b/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" @@ -16,18 +16,23 @@ 完全平方数 是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,1、4、9 和 16 都是完全平方数,而 3 和 11 不是。 示例 1: -输入:n = 12 -输出:3 -解释:12 = 4 + 4 + 4 +* 输入:n = 12 +* 输出:3 +* 解释:12 = 4 + 4 + 4 示例 2: -输入:n = 13 -输出:2 -解释:13 = 4 + 9 +* 输入:n = 13 +* 输出:2 +* 解释:13 = 4 + 9 提示: * 1 <= n <= 10^4 +# 算法公开课 + +**《代码随想录》算法视频公开课:[换汤不换药!| LeetCode:279.完全平方数](https://www.bilibili.com/video/BV12P411T7Br/),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 + + ## 思路 可能刚看这种题感觉没啥思路,又平方和的,又最小数的。 diff --git "a/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" "b/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" index 459741124b..0145542794 100644 --- "a/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" +++ "b/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" @@ -13,25 +13,25 @@ 你可以认为每种硬币的数量是无限的。 示例 1: -输入:coins = [1, 2, 5], amount = 11 -输出:3 -解释:11 = 5 + 5 + 1 +* 输入:coins = [1, 2, 5], amount = 11 +* 输出:3 +* 解释:11 = 5 + 5 + 1 示例 2: -输入:coins = [2], amount = 3 -输出:-1 +* 输入:coins = [2], amount = 3 +* 输出:-1 示例 3: -输入:coins = [1], amount = 0 -输出:0 +* 输入:coins = [1], amount = 0 +* 输出:0 示例 4: -输入:coins = [1], amount = 1 -输出:1 +* 输入:coins = [1], amount = 1 +* 输出:1 示例 5: -输入:coins = [1], amount = 2 -输出:2 +* 输入:coins = [1], amount = 2 +* 输出:2 提示: @@ -39,6 +39,12 @@ * 1 <= coins[i] <= 2^31 - 1 * 0 <= amount <= 10^4 +# 算法公开课 + +**《代码随想录》算法视频公开课:[装满背包最少的物品件数是多少?| LeetCode:322.零钱兑换](https://www.bilibili.com/video/BV14K411R7yv/),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 + + + ## 思路 在[动态规划:518.零钱兑换II](https://programmercarl.com/0518.零钱兑换II.html)中我们已经兑换一次零钱了,这次又要兑换,套路不一样! diff --git "a/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" "b/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" index ba9a2e59af..97cf234fba 100644 --- "a/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" +++ "b/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" @@ -172,7 +172,8 @@ return {val2, val1}; 以示例1为例,dp数组状态如下:(**注意用后序遍历的方式推导**) -![337.打家劫舍III](https://code-thinking.cdn.bcebos.com/pics/337.打家劫舍III.jpg) + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20230203110031.png) **最后头结点就是 取下标0 和 下标1的最大值就是偷得的最大金钱**。 diff --git "a/problems/0377.\347\273\204\345\220\210\346\200\273\345\222\214\342\205\243.md" "b/problems/0377.\347\273\204\345\220\210\346\200\273\345\222\214\342\205\243.md" index 1f949ec7c9..0b7a2fdd2d 100644 --- "a/problems/0377.\347\273\204\345\220\210\346\200\273\345\222\214\342\205\243.md" +++ "b/problems/0377.\347\273\204\345\220\210\346\200\273\345\222\214\342\205\243.md" @@ -15,8 +15,8 @@ 示例: -nums = [1, 2, 3] -target = 4 +* nums = [1, 2, 3] +* target = 4 所有可能的组合为: (1, 1, 1, 1) @@ -31,6 +31,10 @@ target = 4 因此输出为 7。 +# 算法公开课 + +**《代码随想录》算法视频公开课:[装满背包有几种方法?求排列数?| LeetCode:377.组合总和IV](https://www.bilibili.com/video/BV1V14y1n7B6/),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 + ## 思路 对完全背包还不了解的同学,可以看这篇:[动态规划:关于完全背包,你该了解这些!](https://programmercarl.com/背包问题理论基础完全背包.html) diff --git "a/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" "b/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" index 936ba27055..7cf5bcfb30 100644 --- "a/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" +++ "b/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" @@ -17,19 +17,24 @@ 数组的大小不会超过 200 示例 1: -输入: [1, 5, 11, 5] -输出: true -解释: 数组可以分割成 [1, 5, 5] 和 [11]. +* 输入: [1, 5, 11, 5] +* 输出: true +* 解释: 数组可以分割成 [1, 5, 5] 和 [11]. 示例 2: -输入: [1, 2, 3, 5] -输出: false -解释: 数组不能分割成两个元素和相等的子集. +* 输入: [1, 2, 3, 5] +* 输出: false +* 解释: 数组不能分割成两个元素和相等的子集. 提示: * 1 <= nums.length <= 200 * 1 <= nums[i] <= 100 +# 算法公开课 + +**《代码随想录》算法视频公开课:[动态规划之背包问题,这个包能装满吗?| LeetCode:416.分割等和子集](https://www.bilibili.com/video/BV1rt4y1N7jE/),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 + + ## 思路 这道题目初步看,和如下两题几乎是一样的,大家可以用回溯法,解决如下两题 diff --git "a/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" "b/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" index 2471cb6855..2437582cc6 100644 --- "a/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" +++ "b/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" @@ -44,7 +44,8 @@ 如图: -![455.分发饼干](https://img-blog.csdnimg.cn/20201123161809624.png) +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20230203105634.png) + 这个例子可以看出饼干9只有喂给胃口为7的小孩,这样才是整体最优解,并想不出反例,那么就可以撸代码了。 diff --git "a/problems/0474.\344\270\200\345\222\214\351\233\266.md" "b/problems/0474.\344\270\200\345\222\214\351\233\266.md" index 213a2aa2c7..b40380dbea 100644 --- "a/problems/0474.\344\270\200\345\222\214\351\233\266.md" +++ "b/problems/0474.\344\270\200\345\222\214\351\233\266.md" @@ -16,16 +16,16 @@ 示例 1: -输入:strs = ["10", "0001", "111001", "1", "0"], m = 5, n = 3 -输出:4 +* 输入:strs = ["10", "0001", "111001", "1", "0"], m = 5, n = 3 +* 输出:4 -解释:最多有 5 个 0 和 3 个 1 的最大子集是 {"10","0001","1","0"} ,因此答案是 4 。 +* 解释:最多有 5 个 0 和 3 个 1 的最大子集是 {"10","0001","1","0"} ,因此答案是 4 。 其他满足题意但较小的子集包括 {"0001","1"} 和 {"10","1","0"} 。{"111001"} 不满足题意,因为它含 4 个 1 ,大于 n 的值 3 。 示例 2: -输入:strs = ["10", "0", "1"], m = 1, n = 1 -输出:2 -解释:最大的子集是 {"0", "1"} ,所以答案是 2 。 +* 输入:strs = ["10", "0", "1"], m = 1, n = 1 +* 输出:2 +* 解释:最大的子集是 {"0", "1"} ,所以答案是 2 。 提示: @@ -34,6 +34,11 @@ * strs[i] 仅由 '0' 和 '1' 组成 * 1 <= m, n <= 100 +# 算法公开课 + +**《代码随想录》算法视频公开课:[装满这个背包最多用多少个物品?| LeetCode:474.一和零](https://www.bilibili.com/video/BV1rW4y1x7ZQ/),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 + + ## 思路 如果对背包问题不都熟悉先看这两篇: diff --git "a/problems/0494.\347\233\256\346\240\207\345\222\214.md" "b/problems/0494.\347\233\256\346\240\207\345\222\214.md" index eec4183d2f..9adf8b0518 100644 --- "a/problems/0494.\347\233\256\346\240\207\345\222\214.md" +++ "b/problems/0494.\347\233\256\346\240\207\345\222\214.md" @@ -7,7 +7,7 @@ -# 494. 目标和 +# 494.目标和 [力扣题目链接](https://leetcode.cn/problems/target-sum/) @@ -19,15 +19,15 @@ 示例: -输入:nums: [1, 1, 1, 1, 1], S: 3 -输出:5 +* 输入:nums: [1, 1, 1, 1, 1], S: 3 +* 输出:5 解释: --1+1+1+1+1 = 3 -+1-1+1+1+1 = 3 -+1+1-1+1+1 = 3 -+1+1+1-1+1 = 3 -+1+1+1+1-1 = 3 +* -1+1+1+1+1 = 3 +* +1-1+1+1+1 = 3 +* +1+1-1+1+1 = 3 +* +1+1+1-1+1 = 3 +* +1+1+1+1-1 = 3 一共有5种方法让最终目标和为3。 @@ -37,6 +37,11 @@ * 初始的数组的和不会超过 1000 。 * 保证返回的最终结果能被 32 位整数存下。 +# 算法公开课 + +**《代码随想录》算法视频公开课:[装满背包有多少种方法?| LeetCode:494.目标和](https://www.bilibili.com/video/BV1o8411j73x/),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 + + ## 思路 如果对背包问题不都熟悉先看这两篇: diff --git "a/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" "b/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" index f6a8044c61..162bbe680e 100644 --- "a/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" +++ "b/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" @@ -6,12 +6,10 @@ -# 518. 零钱兑换 II +# 518.零钱兑换II [力扣题目链接](https://leetcode.cn/problems/coin-change-ii/) -难度:中等 - 给定不同面额的硬币和一个总金额。写出函数来计算可以凑成总金额的硬币组合数。假设每一种面额的硬币有无限个。  示例 1: @@ -43,6 +41,12 @@ * 硬币种类不超过 500 种 * 结果符合 32 位符号整数 +# 算法公开课 + +**《代码随想录》算法视频公开课:[装满背包有多少种方法?组合与排列有讲究!| LeetCode:518.零钱兑换II](https://www.bilibili.com/video/BV1KM411k75j/),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 + + + ## 思路 diff --git "a/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" "b/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" index 25c31668f8..db8d3dcb97 100644 --- "a/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" +++ "b/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" @@ -17,15 +17,15 @@ 注意:这里的一笔交易指买入持有并卖出股票的整个过程,每笔交易你只需要为支付一次手续费。 示例 1: -输入: prices = [1, 3, 2, 8, 4, 9], fee = 2 -输出: 8 +* 输入: prices = [1, 3, 2, 8, 4, 9], fee = 2 +* 输出: 8 解释: 能够达到的最大利润: -在此处买入 prices[0] = 1 -在此处卖出 prices[3] = 8 -在此处买入 prices[4] = 4 -在此处卖出 prices[5] = 9 -总利润: ((8 - 1) - 2) + ((9 - 4) - 2) = 8. +* 在此处买入 prices[0] = 1 +* 在此处卖出 prices[3] = 8 +* 在此处买入 prices[4] = 4 +* 在此处卖出 prices[5] = 9 +* 总利润: ((8 - 1) - 2) + ((9 - 4) - 2) = 8. 注意: * 0 < prices.length <= 50000. @@ -34,14 +34,14 @@ ## 思路 -在讲解贪心专题的时候,我们已经讲过本题了[贪心算法:买卖股票的最佳时机含手续费](https://programmercarl.com/0714.买卖股票的最佳时机含手续费.html) +在讲解贪心专题的时候,我们已经讲过本题了[贪心算法:买卖股票的最佳时机含手续费](https://programmercarl.com/0714.买卖股票的最佳时机含手续费.html) 使用贪心算法,的性能是: * 时间复杂度:O(n) -* 空间复杂度:O(1) +* 空间复杂度:O(1) -那么我们再来看看是使用动规的方法如何解题。 +本题使用贪心算法并不好理解,也很容易出错,那么我们再来看看是使用动规的方法如何解题。 相对于[动态规划:122.买卖股票的最佳时机II](https://programmercarl.com/0122.买卖股票的最佳时机II(动态规划).html),本题只需要在计算卖出操作的时候减去手续费就可以了,代码几乎是一样的。 diff --git "a/problems/0738.\345\215\225\350\260\203\351\200\222\345\242\236\347\232\204\346\225\260\345\255\227.md" "b/problems/0738.\345\215\225\350\260\203\351\200\222\345\242\236\347\232\204\346\225\260\345\255\227.md" index e8666bcd08..fda378aa46 100644 --- "a/problems/0738.\345\215\225\350\260\203\351\200\222\345\242\236\347\232\204\346\225\260\345\255\227.md" +++ "b/problems/0738.\345\215\225\350\260\203\351\200\222\345\242\236\347\232\204\346\225\260\345\255\227.md" @@ -35,6 +35,7 @@ ```CPP class Solution { private: + // 判断一个数字的各位上是否是递增 bool checkNum(int num) { int max = 10; while (num) { @@ -47,15 +48,15 @@ private: } public: int monotoneIncreasingDigits(int N) { - for (int i = N; i > 0; i--) { + for (int i = N; i > 0; i--) { // 从大到小遍历 if (checkNum(i)) return i; } return 0; } }; ``` -* 时间复杂度:$O(n × m)$ m为n的数字长度 -* 空间复杂度:$O(1)$ +* 时间复杂度:O(n × m) m为n的数字长度 +* 空间复杂度:O(1) ## 贪心算法 @@ -65,20 +66,12 @@ public: 这一点如果想清楚了,这道题就好办了。 -**局部最优:遇到strNum[i - 1] > strNum[i]的情况,让strNum[i - 1]--,然后strNum[i]给为9,可以保证这两位变成最大单调递增整数**。 - -**全局最优:得到小于等于N的最大单调递增的整数**。 - -**但这里局部最优推出全局最优,还需要其他条件,即遍历顺序,和标记从哪一位开始统一改成9**。 - 此时是从前向后遍历还是从后向前遍历呢? 从前向后遍历的话,遇到strNum[i - 1] > strNum[i]的情况,让strNum[i - 1]减一,但此时如果strNum[i - 1]减一了,可能又小于strNum[i - 2]。 这么说有点抽象,举个例子,数字:332,从前向后遍历的话,那么就把变成了329,此时2又小于了第一位的3了,真正的结果应该是299。 -**所以从前后向遍历会改变已经遍历过的结果!** - 那么从后向前遍历,就可以重复利用上次比较得出的结果了,从后向前遍历332的数值变化为:332 -> 329 -> 299 确定了遍历顺序之后,那么此时局部最优就可以推出全局,找不出反例,试试贪心。 @@ -108,8 +101,8 @@ public: ``` -* 时间复杂度:$O(n)$,n 为数字长度 -* 空间复杂度:$O(n)$,需要一个字符串,转化为字符串操作更方便 +* 时间复杂度:O(n),n 为数字长度 +* 空间复杂度:O(n),需要一个字符串,转化为字符串操作更方便 ## 总结 diff --git "a/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" "b/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" index 65369d252a..96dc724d08 100644 --- "a/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" +++ "b/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" @@ -68,8 +68,8 @@ public: }; ``` -* 时间复杂度:$O(n)$ -* 空间复杂度:$O(1)$,使用的hash数组是固定大小 +* 时间复杂度:O(n) +* 空间复杂度:O(1),使用的hash数组是固定大小 ## 总结 diff --git "a/problems/0827.\346\234\200\345\244\247\344\272\272\345\267\245\345\262\233.md" "b/problems/0827.\346\234\200\345\244\247\344\272\272\345\267\245\345\262\233.md" index 05d82f7e65..1b49e9ee66 100644 --- "a/problems/0827.\346\234\200\345\244\247\344\272\272\345\267\245\345\262\233.md" +++ "b/problems/0827.\346\234\200\345\244\247\344\272\272\345\267\245\345\262\233.md" @@ -4,7 +4,7 @@

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

-# 827. 最大人工岛 +# 827.最大人工岛 [力扣链接](https://leetcode.cn/problems/making-a-large-island/) diff --git "a/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" "b/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" index 3b2c33c125..8e40dcd59f 100644 --- "a/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" +++ "b/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" @@ -4,7 +4,7 @@

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

-## 1049. 最后一块石头的重量 II +# 1049.最后一块石头的重量II [力扣题目链接](https://leetcode.cn/problems/last-stone-weight-ii/) @@ -35,6 +35,11 @@ * 1 <= stones.length <= 30 * 1 <= stones[i] <= 1000 +# 算法公开课 + +**《代码随想录》算法视频公开课:[这个背包最多能装多少?LeetCode:1049.最后一块石头的重量II](https://www.bilibili.com/video/BV14M411C7oV/),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 + + ## 思路 如果对背包问题不都熟悉先看这两篇: diff --git "a/problems/\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227\357\274\210vector\345\216\237\347\220\206\350\256\262\350\247\243\357\274\211.md" "b/problems/\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227\357\274\210vector\345\216\237\347\220\206\350\256\262\350\247\243\357\274\211.md" index 5b86074bdc..315b6da12a 100644 --- "a/problems/\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227\357\274\210vector\345\216\237\347\220\206\350\256\262\350\247\243\357\274\211.md" +++ "b/problems/\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227\357\274\210vector\345\216\237\347\220\206\350\256\262\350\247\243\357\274\211.md" @@ -3,11 +3,13 @@

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+ + # 贪心算法:根据身高重建队列(续集) 在讲解[贪心算法:根据身高重建队列](https://programmercarl.com/0406.根据身高重建队列.html)中,我们提到了使用vector(C++中的动态数组)来进行insert操作是费时的。 -但是在解释的过程中有不恰当的地方,所以来专门写一篇文章来详细说一说这个问题。 +这里专门写一篇文章来详细说一说这个问题。 使用vector的代码如下: ```CPP diff --git "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" index 8f4ca2d43b..0b2d7ae685 100644 --- "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" +++ "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" @@ -4,7 +4,11 @@

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

-# 动态规划:关于01背包问题,你该了解这些! +# 动态规划:01背包理论基础 + + +**《代码随想录》算法视频公开课:[带你学透0-1背包问题!](https://www.bilibili.com/video/BV1cg411g7Y6/),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 + 这周我们正式开始讲解背包问题! diff --git "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" index 816719c374..11c414706d 100644 --- "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" +++ "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" @@ -4,7 +4,10 @@

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

-# 动态规划:关于01背包问题,你该了解这些!(滚动数组) +# 动态规划:01背包理论基础(滚动数组) + +**《代码随想录》算法视频公开课:[带你学透0-1背包问题!(滚动数组)](https://www.bilibili.com/video/BV1BU4y177kY/),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 + 昨天[动态规划:关于01背包问题,你该了解这些!](https://programmercarl.com/背包理论基础01背包-1.html)中是用二维dp数组来讲解01背包。 diff --git "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" index 0f721bf94e..2a2f61ec38 100644 --- "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" +++ "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" @@ -5,10 +5,13 @@

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

-# 动态规划:关于完全背包,你该了解这些! +# 动态规划:完全背包理论基础 + +**《代码随想录》算法视频公开课:[带你学透完全背包问题! ](https://www.bilibili.com/video/BV1uK411o7c9/),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 ## 完全背包 + 有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。**每件物品都有无限个(也就是可以放入背包多次)**,求解将哪些物品装入背包里物品价值总和最大。 **完全背包和01背包问题唯一不同的地方就是,每种物品有无限件**。 From 6884c44f7238f730824f65d150c17376bc456158 Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Fri, 10 Feb 2023 10:09:04 +0800 Subject: [PATCH 1480/3019] Update --- README.md | 3 ++- ...53\346\211\213\347\273\255\350\264\271.md" | 16 ++++++++------ ...47\344\272\214\345\217\211\346\240\221.md" | 22 +++++++++---------- ...25\346\200\273\347\273\223\347\257\207.md" | 2 +- 4 files changed, 22 insertions(+), 21 deletions(-) diff --git a/README.md b/README.md index 11b63accfe..c6d6bfe235 100644 --- a/README.md +++ b/README.md @@ -295,7 +295,8 @@ 21. [本周小结!(贪心算法系列四)](./problems/周总结/20201224贪心周末总结.md) 22. [贪心算法:738.单调递增的数字](./problems/0738.单调递增的数字.md) 23. [贪心算法:968.监控二叉树](./problems/0968.监控二叉树.md) -24. [贪心算法:总结篇!(每逢总结必经典)](./problems/贪心算法总结篇.md) +24. [贪心算法:714.买卖股票的最佳时机含手续费](./problems/0714.买卖股票的最佳时机含手续费.md) +25. [贪心算法:总结篇!(每逢总结必经典)](./problems/贪心算法总结篇.md) ## 动态规划 diff --git "a/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271.md" "b/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271.md" index 3f44ec1764..d0a5360c5e 100644 --- "a/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271.md" +++ "b/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271.md" @@ -18,15 +18,15 @@ 注意:这里的一笔交易指买入持有并卖出股票的整个过程,每笔交易你只需要为支付一次手续费。 示例 1: -输入: prices = [1, 3, 2, 8, 4, 9], fee = 2 -输出: 8 +* 输入: prices = [1, 3, 2, 8, 4, 9], fee = 2 +* 输出: 8 解释: 能够达到的最大利润: -在此处买入 prices[0] = 1 -在此处卖出 prices[3] = 8 -在此处买入 prices[4] = 4 -在此处卖出 prices[5] = 9 -总利润: ((8 - 1) - 2) + ((9 - 4) - 2) = 8. +* 在此处买入 prices[0] = 1 +* 在此处卖出 prices[3] = 8 +* 在此处买入 prices[4] = 4 +* 在此处卖出 prices[5] = 9 +* 总利润: ((8 - 1) - 2) + ((9 - 4) - 2) = 8. 注意: * 0 < prices.length <= 50000. @@ -35,6 +35,8 @@ ## 思路 +本题优先掌握动态规划解法,在动态规划章节中,还会详细讲解本题。 + 本题相对于[贪心算法:122.买卖股票的最佳时机II](https://programmercarl.com/0122.买卖股票的最佳时机II.html),多添加了一个条件就是手续费。 ## 贪心算法 diff --git "a/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" "b/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" index d897755bce..92212ebbea 100644 --- "a/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" @@ -152,11 +152,11 @@ if (left == 2 && right == 2) return 0; 如果是以下情况,则中间节点(父节点)应该放摄像头: -left == 0 && right == 0 左右节点无覆盖 -left == 1 && right == 0 左节点有摄像头,右节点无覆盖 -left == 0 && right == 1 左节点有无覆盖,右节点摄像头 -left == 0 && right == 2 左节点无覆盖,右节点覆盖 -left == 2 && right == 0 左节点覆盖,右节点无覆盖 +* left == 0 && right == 0 左右节点无覆盖 +* left == 1 && right == 0 左节点有摄像头,右节点无覆盖 +* left == 0 && right == 1 左节点有无覆盖,右节点摄像头 +* left == 0 && right == 2 左节点无覆盖,右节点覆盖 +* left == 2 && right == 0 左节点覆盖,右节点无覆盖 这个不难理解,毕竟有一个孩子没有覆盖,父节点就应该放摄像头。 @@ -174,9 +174,9 @@ if (left == 0 || right == 0) { 如果是以下情况,其实就是 左右孩子节点有一个有摄像头了,那么其父节点就应该是2(覆盖的状态) -left == 1 && right == 2 左节点有摄像头,右节点有覆盖 -left == 2 && right == 1 左节点有覆盖,右节点有摄像头 -left == 1 && right == 1 左右节点都有摄像头 +* left == 1 && right == 2 左节点有摄像头,右节点有覆盖 +* left == 2 && right == 1 左节点有覆盖,右节点有摄像头 +* left == 1 && right == 1 左右节点都有摄像头 代码如下: @@ -298,7 +298,7 @@ public: 大家可能会惊讶,居然可以这么简短,**其实就是在版本一的基础上,使用else把一些情况直接覆盖掉了**。 -在网上关于这道题解可以搜到很多这种神级别的代码,但都没讲不清楚,如果直接看代码的话,指定越看越晕,**所以建议大家对着版本一的代码一步一步来哈,版本二中看不中用!**。 +在网上关于这道题解可以搜到很多这种神级别的代码,但都没讲不清楚,如果直接看代码的话,指定越看越晕,**所以建议大家对着版本一的代码一步一步来,版本二中看不中用!**。 ## 总结 @@ -306,9 +306,7 @@ public: 在二叉树上进行状态推导,其实难度就上了一个台阶了,需要对二叉树的操作非常娴熟。 -这道题目是名副其实的hard,大家感受感受,哈哈。 - - +这道题目是名副其实的hard,大家感受感受。 ## 其他语言版本 diff --git "a/problems/\350\264\252\345\277\203\347\256\227\346\263\225\346\200\273\347\273\223\347\257\207.md" "b/problems/\350\264\252\345\277\203\347\256\227\346\263\225\346\200\273\347\273\223\347\257\207.md" index d70eecaa00..1a516e5f1e 100644 --- "a/problems/\350\264\252\345\277\203\347\256\227\346\263\225\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/\350\264\252\345\277\203\347\256\227\346\263\225\346\200\273\347\273\223\347\257\207.md" @@ -73,7 +73,7 @@ Carl个人认为:如果找出局部最优并可以推出全局最优,就是 大家都知道股票系列问题是动规的专长,其实用贪心也可以解决,而且还不止就这两道题目,但这两道比较典型,我就拿来单独说一说 * [贪心算法:买卖股票的最佳时机II](https://programmercarl.com/0122.买卖股票的最佳时机II.html) -* [贪心算法:买卖股票的最佳时机含手续费](https://programmercarl.com/0714.买卖股票的最佳时机含手续费.html) +* [贪心算法:买卖股票的最佳时机含手续费](https://programmercarl.com/0714.买卖股票的最佳时机含手续费.html) 本题使用贪心算法比较绕,建议理解动态规划就好 ### 两个维度权衡问题 From 4b8b7267310e84cfa414bd80379d384abcf89d57 Mon Sep 17 00:00:00 2001 From: flydzy <77653369+flydzy@users.noreply.github.com> Date: Fri, 10 Feb 2023 18:40:24 +0800 Subject: [PATCH 1481/3019] fix subtract with overflow --- ...\260\347\273\204\347\232\204\345\271\263\346\226\271.md" | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git "a/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" "b/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" index b889005232..996a7cee3d 100644 --- "a/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" +++ "b/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" @@ -183,14 +183,14 @@ Rust impl Solution { pub fn sorted_squares(nums: Vec) -> Vec { let n = nums.len(); - let (mut i,mut j,mut k) = (0,n - 1,n- 1); + let (mut i,mut j,mut k) = (0,n - 1,n); let mut ans = vec![0;n]; while i <= j{ if nums[i] * nums[i] < nums[j] * nums[j] { - ans[k] = nums[j] * nums[j]; + ans[k-1] = nums[j] * nums[j]; j -= 1; }else{ - ans[k] = nums[i] * nums[i]; + ans[k-1] = nums[i] * nums[i]; i += 1; } k -= 1; From ac3f9b8d705a07001590097e0362a6e31dd19b79 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CDraymondHIT=E2=80=9D?= <“3343033352@qq.com”> Date: Sat, 11 Feb 2023 16:58:40 +0800 Subject: [PATCH 1482/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200028=E6=89=BE?= =?UTF-8?q?=E5=87=BA=E5=AD=97=E7=AC=A6=E4=B8=B2=E4=B8=AD=E7=AC=AC=E4=B8=80?= =?UTF-8?q?=E4=B8=AA=E5=8C=B9=E9=85=8D=E9=A1=B9=E7=9A=84=E4=B8=8B=E6=A0=87?= =?UTF-8?q?=20=E5=89=8D=E7=BC=80=E8=A1=A8=EF=BC=88=E4=B8=8D=E5=87=8F?= =?UTF-8?q?=E4=B8=80=EF=BC=89=20Python=20=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0028.\345\256\236\347\216\260strStr.md" | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git "a/problems/0028.\345\256\236\347\216\260strStr.md" "b/problems/0028.\345\256\236\347\216\260strStr.md" index 4e01926fc4..2757130c8a 100644 --- "a/problems/0028.\345\256\236\347\216\260strStr.md" +++ "b/problems/0028.\345\256\236\347\216\260strStr.md" @@ -769,6 +769,36 @@ class Solution: return next ``` +```python +// 前缀表(不减一)Python实现 +class Solution: + def strStr(self, haystack: str, needle: str) -> int: + if len(needle) == 0: + return 0 + next = self.getNext(needle) + j = 0 + for i in range(len(haystack)): + while j >= 1 and haystack[i] != needle[j]: + j = next[j-1] + if haystack[i] == needle[j]: + j += 1 + if j == len(needle): + return i - len(needle) + 1 + return -1 + + def getNext(self, needle): + next = [0] * len(needle) + j = 0 + next[0] = j + for i in range(1, len(needle)): + while j >= 1 and needle[i] != needle[j]: + j = next[j-1] + if needle[i] == needle[j]: + j += 1 + next[i] = j + return next +``` + Go: ```go @@ -1352,3 +1382,4 @@ impl Solution { + From 78afbd24123303f9bba67c6880295e42a3ae68bb Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Mon, 13 Feb 2023 11:28:33 +0800 Subject: [PATCH 1483/3019] Update --- ...25\350\257\215\346\216\245\351\276\231.md" | 4 +-- ...53\345\206\267\345\206\273\346\234\237.md" | 4 +-- ...17\346\227\245\346\270\251\345\272\246.md" | 28 ++++++++++--------- 3 files changed, 19 insertions(+), 17 deletions(-) diff --git "a/problems/0127.\345\215\225\350\257\215\346\216\245\351\276\231.md" "b/problems/0127.\345\215\225\350\257\215\346\216\245\351\276\231.md" index bc21d0ade1..7ffd6a21e6 100644 --- "a/problems/0127.\345\215\225\350\257\215\346\216\245\351\276\231.md" +++ "b/problems/0127.\345\215\225\350\257\215\346\216\245\351\276\231.md" @@ -35,7 +35,7 @@ ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210827175432.png) -本题只需要求出最短长度就可以了,不用找出路径。 +本题只需要求出最短路径的长度就可以了,不用找出路径。 所以这道题要解决两个问题: @@ -46,7 +46,7 @@ 然后就是求起点和终点的最短路径长度,**这里无向图求最短路,广搜最为合适,广搜只要搜到了终点,那么一定是最短的路径**。因为广搜就是以起点中心向四周扩散的搜索。 -本题如果用深搜,会比较麻烦,要在到达终点的不同路径中选则一条最短路。 而广搜只要达到终点,一定是最短路。 +**本题如果用深搜,会比较麻烦,要在到达终点的不同路径中选则一条最短路**。 而广搜只要达到终点,一定是最短路。 另外需要有一个注意点: diff --git "a/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" "b/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" index 375a993dce..b4825894b8 100644 --- "a/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" +++ "b/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" @@ -148,12 +148,12 @@ public: vector> dp(n, vector(4, 0)); dp[0][0] -= prices[0]; // 持股票 for (int i = 1; i < n; i++) { - dp[i][0] = max(dp[i - 1][0], dp[i - 1][3] - prices[i], dp[i - 1][1] - prices[i]); + dp[i][0] = max(dp[i - 1][0], max(dp[i - 1][3] - prices[i], dp[i - 1][1] - prices[i])); dp[i][1] = max(dp[i - 1][1], dp[i - 1][3]); dp[i][2] = dp[i - 1][0] + prices[i]; dp[i][3] = dp[i - 1][2]; } - return max(dp[n - 1][3], dp[n - 1][1], dp[n - 1][2]); + return max(dp[n - 1][3], max(dp[n - 1][1], dp[n - 1][2])); } }; ``` diff --git "a/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" "b/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" index 38a4553372..93f45bd9c8 100644 --- "a/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" +++ "b/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" @@ -24,19 +24,13 @@ 那有同学就问了,我怎么能想到用单调栈呢? 什么时候用单调栈呢? -**通常是一维数组,要寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置,此时我们就要想到可以用单调栈了**。 +**通常是一维数组,要寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置,此时我们就要想到可以用单调栈了**。时间复杂度为O(n)。 -时间复杂度为O(n)。 - -例如本题其实就是找找到一个元素右边第一个比自己大的元素。 - -此时就应该想到用单调栈了。 +例如本题其实就是找找到一个元素右边第一个比自己大的元素,此时就应该想到用单调栈了。 那么单调栈的原理是什么呢?为什么时间复杂度是O(n)就可以找到每一个元素的右边第一个比它大的元素位置呢? - -单调栈的本质是空间换时间,因为在遍历的过程中需要用一个栈来记录右边第一个比当前元素高的元素,优点是只需要遍历一次。 - +**单调栈的本质是空间换时间**,因为在遍历的过程中需要用一个栈来记录右边第一个比当前元素高的元素,优点是整个数组只需要遍历一次。 在使用单调栈的时候首先要明确如下几点: @@ -46,10 +40,9 @@ 2. 单调栈里元素是递增呢? 还是递减呢? -**注意一下顺序为 从栈头到栈底的顺序**,因为单纯的说从左到右或者从前到后,不说栈头朝哪个方向的话,大家一定会越看越懵。 +**注意以下讲解中,顺序的描述为 从栈头到栈底的顺序**,因为单纯的说从左到右或者从前到后,不说栈头朝哪个方向的话,大家一定比较懵。 - -这里我们要使用递增循序(再强调一下是指从栈头到栈底的顺序),因为只有递增的时候,加入一个元素i,才知道栈顶元素在数组中右面第一个比栈顶元素大的元素是i。 +这里我们要使用递增循序(再强调一下是指从栈头到栈底的顺序),因为只有递增的时候,栈里要加入一个元素i的时候,才知道栈顶元素在数组中右面第一个比栈顶元素大的元素是i。 文字描述理解起来有点费劲,接下来我画了一系列的图,来讲解单调栈的工作过程。 @@ -64,9 +57,13 @@ 接下来我们用temperatures = [73, 74, 75, 71, 71, 72, 76, 73]为例来逐步分析,输出应该是 [1, 1, 4, 2, 1, 1, 0, 0]。 首先先将第一个遍历元素加入单调栈 + ![739.每日温度1](https://img-blog.csdnimg.cn/20210219124434172.jpg) -加入T[1] = 74,因为T[1] > T[0](当前遍历的元素T[i]大于栈顶元素T[st.top()]的情况),而我们要保持一个递增单调栈(从栈头到栈底),所以将T[0]弹出,T[1]加入,此时result数组可以记录了,result[0] = 1,即T[0]右面第一个比T[0]大的元素是T[1]。 +加入T[1] = 74,因为T[1] > T[0](当前遍历的元素T[i]大于栈顶元素T[st.top()]的情况)。 + +我们要保持一个递增单调栈(从栈头到栈底),所以将T[0]弹出,T[1]加入,此时result数组可以记录了,result[0] = 1,即T[0]右面第一个比T[0]大的元素是T[1]。 + ![739.每日温度2](https://img-blog.csdnimg.cn/20210219124504299.jpg) 加入T[2],同理,T[1]弹出 @@ -78,6 +75,7 @@ ![739.每日温度4](https://img-blog.csdnimg.cn/20210219124610761.jpg) 加入T[4],T[4] == T[3] (当前遍历的元素T[i]等于栈顶元素T[st.top()]的情况),此时依然要加入栈,不用计算距离,因为我们要求的是右面第一个大于本元素的位置,而不是大于等于! + ![739.每日温度5](https://img-blog.csdnimg.cn/20210219124633444.jpg) 加入T[5],T[5] > T[4] (当前遍历的元素T[i]大于栈顶元素T[st.top()]的情况),将T[4]弹出,同时计算距离,更新result @@ -87,12 +85,15 @@ T[4]弹出之后, T[5] > T[3] (当前遍历的元素T[i]大于栈顶元素T[ ![739.每日温度7](https://img-blog.csdnimg.cn/20210219124726613.jpg) 直到发现T[5]小于T[st.top()],终止弹出,将T[5]加入单调栈 + ![739.每日温度8](https://img-blog.csdnimg.cn/20210219124807715.jpg) 加入T[6],同理,需要将栈里的T[5],T[2]弹出 + ![739.每日温度9](https://img-blog.csdnimg.cn/2021021912483374.jpg) 同理,继续弹出 + ![739.每日温度10](https://img-blog.csdnimg.cn/2021021912490098.jpg) 此时栈里只剩下了T[6] @@ -100,6 +101,7 @@ T[4]弹出之后, T[5] > T[3] (当前遍历的元素T[i]大于栈顶元素T[ ![739.每日温度11](https://img-blog.csdnimg.cn/20210219124930156.jpg) 加入T[7], T[7] < T[6] 直接入栈,这就是最后的情况,result数组也更新完了。 + ![739.每日温度12](https://img-blog.csdnimg.cn/20210219124957216.jpg) From fd505712011729d5abb353073cafaaba0b814e6a Mon Sep 17 00:00:00 2001 From: fw_qaq Date: Mon, 13 Feb 2023 17:49:40 +0800 Subject: [PATCH 1484/3019] =?UTF-8?q?Update=200977.=E6=9C=89=E5=BA=8F?= =?UTF-8?q?=E6=95=B0=E7=BB=84=E7=9A=84=E5=B9=B3=E6=96=B9.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit add rust highlighting --- ...\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" "b/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" index 996a7cee3d..57f8de02af 100644 --- "a/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" +++ "b/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" @@ -179,7 +179,7 @@ func sortedSquares(nums []int) []int { } ``` Rust -``` +```rust impl Solution { pub fn sorted_squares(nums: Vec) -> Vec { let n = nums.len(); From e41471fdf603d435e58f4b412774b3f6bc2ff82a Mon Sep 17 00:00:00 2001 From: Logen <47022821+Logenleedev@users.noreply.github.com> Date: Mon, 13 Feb 2023 08:59:42 -0600 Subject: [PATCH 1485/3019] minor modification --- ...226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" | 3 --- 1 file changed, 3 deletions(-) diff --git "a/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" "b/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" index 69306801f5..08175058bb 100644 --- "a/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" +++ "b/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" @@ -219,9 +219,6 @@ class Solution: def fib(self, n: int) -> int: # 排除 Corner Case - if n == 1: - return 1 - if n == 0: return 0 From 633293b509052780afc83b23c07a4ad79ba18156 Mon Sep 17 00:00:00 2001 From: Logen <47022821+Logenleedev@users.noreply.github.com> Date: Tue, 14 Feb 2023 19:23:52 -0600 Subject: [PATCH 1486/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E8=A7=A3=E9=A2=98?= =?UTF-8?q?=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...0\275\254\345\255\227\347\254\246\344\270\262.md" | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git "a/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" "b/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" index 1b619ffbbd..49480abfae 100644 --- "a/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" @@ -194,6 +194,18 @@ class Solution: ``` +```python 3 +# 方法五:另类的切片方法 +class Solution: + def reverseLeftWords(self, s: str, n: int) -> str: + n = len(s) + s = s + s + return s[k : n+k] + +# 时间复杂度:O(n) +# 空间复杂度:O(n) +``` + Go: ```go From 20faa53739104f4d979bf4ef4f49894fdd03840a Mon Sep 17 00:00:00 2001 From: KieranTou Date: Wed, 15 Feb 2023 17:03:16 +0800 Subject: [PATCH 1487/3019] =?UTF-8?q?=E4=B8=BA27.=E7=A7=BB=E9=99=A4?= =?UTF-8?q?=E5=85=83=E7=B4=A0=E5=A2=9E=E5=8A=A0go=E8=AF=AD=E8=A8=80?= =?UTF-8?q?=E7=9A=84=E7=9B=B8=E5=90=91=E5=8F=8C=E6=8C=87=E9=92=88=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...73\351\231\244\345\205\203\347\264\240.md" | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git "a/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" "b/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" index 3e26338d9d..91150c74b9 100644 --- "a/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" +++ "b/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" @@ -231,6 +231,31 @@ func removeElement(nums []int, val int) int { return res } ``` +```go +//相向双指针法 +func removeElement(nums []int, val int) int { + // 有点像二分查找的左闭右闭区间 所以下面是<= + left := 0 + right := len(nums) - 1 + for left <= right { + // 不断寻找左侧的val和右侧的非val 找到时交换位置 目的是将val全覆盖掉 + for left <= right && nums[left] != val { + left++ + } + for left <= right && nums[right] == val { + right-- + } + //各自找到后开始覆盖 覆盖后继续寻找 + if left < right { + nums[left] = nums[right] + left++ + right-- + } + } + fmt.Println(nums) + return left +} +``` JavaScript: ```javascript From 4d8363319d431e99ea2bbd4fae2d84a0f9ec17f7 Mon Sep 17 00:00:00 2001 From: Bingyang Yan <75976791+byYanXX@users.noreply.github.com> Date: Thu, 16 Feb 2023 16:43:09 +0800 Subject: [PATCH 1488/3019] =?UTF-8?q?Update=20=E4=BA=8C=E5=8F=89=E6=A0=91?= =?UTF-8?q?=E7=90=86=E8=AE=BA=E5=9F=BA=E7=A1=80.md=20=EF=BC=9A=E9=94=99?= =?UTF-8?q?=E5=88=AB=E5=AD=97=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 应该是想说unordered_map、unordered_set底层实现是哈希表,但写成了unordered_map、unordered_map底层实现是哈希表。 --- ...\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" index 21e2039f7a..387aa64fd2 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -72,7 +72,7 @@ 最后一棵 不是平衡二叉树,因为它的左右两个子树的高度差的绝对值超过了1。 -**C++中map、set、multimap,multiset的底层实现都是平衡二叉搜索树**,所以map、set的增删操作时间时间复杂度是logn,注意我这里没有说unordered_map、unordered_set,unordered_map、unordered_map底层实现是哈希表。 +**C++中map、set、multimap,multiset的底层实现都是平衡二叉搜索树**,所以map、set的增删操作时间时间复杂度是logn,注意我这里没有说unordered_map、unordered_set,unordered_map、unordered_set底层实现是哈希表。 **所以大家使用自己熟悉的编程语言写算法,一定要知道常用的容器底层都是如何实现的,最基本的就是map、set等等,否则自己写的代码,自己对其性能分析都分析不清楚!** From 8a7ea66c6f136ff802dd81411f21381dbcdb357f Mon Sep 17 00:00:00 2001 From: Logen <47022821+Logenleedev@users.noreply.github.com> Date: Thu, 16 Feb 2023 19:19:49 -0600 Subject: [PATCH 1489/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E8=A7=A3=E9=A2=98?= =?UTF-8?q?=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...7\213\350\275\254\346\225\260\347\273\204.md" | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git "a/problems/0189.\346\227\213\350\275\254\346\225\260\347\273\204.md" "b/problems/0189.\346\227\213\350\275\254\346\225\260\347\273\204.md" index 8a7b022797..3581969439 100644 --- "a/problems/0189.\346\227\213\350\275\254\346\225\260\347\273\204.md" +++ "b/problems/0189.\346\227\213\350\275\254\346\225\260\347\273\204.md" @@ -108,6 +108,7 @@ class Solution { ## Python +方法一:局部翻转 + 整体翻转 ```python class Solution: def rotate(self, A: List[int], k: int) -> None: @@ -123,6 +124,21 @@ class Solution: reverse(k, n - 1) ``` +方法二:利用余数 + +```python +class Solution: + def rotate(self, nums: List[int], k: int) -> None: + copy = nums[:] + + for i in range(len(nums)): + nums[(i + k) % len(nums)] = copy[i] + + return nums + + # 备注:这个方法会导致空间复杂度变成 O(n) 因为我们要创建一个 copy 数组。但是不失为一种思路。 +``` + ## Go ```go From ca628323d60513178ba19e192d6bbfae94c2e947 Mon Sep 17 00:00:00 2001 From: KieranTou Date: Fri, 17 Feb 2023 10:00:34 +0800 Subject: [PATCH 1490/3019] =?UTF-8?q?=E6=9B=B4=E6=AD=A3=E6=8E=92=E7=89=88?= =?UTF-8?q?=E9=94=99=E8=AF=AF=20=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E6=9B=B4=E6=98=93=E7=90=86=E8=A7=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...22\345\205\245\344\275\215\347\275\256.md" | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git "a/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" "b/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" index dd15b36b24..4d9ee74fb2 100644 --- "a/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" +++ "b/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" @@ -250,23 +250,23 @@ public int searchInsert(int[] nums, int target) { -Golang: +### Golang -```golang +```go // 第一种二分法 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 + left, right := 0, len(nums)-1 + for left <= right { + mid := left + (right-left)/2 + if nums[mid] == target { + return mid + } else if nums[mid] > target { + right = mid - 1 + } else { + left = mid + 1 + } + } + return len(nums) } ``` From 55b6e432cafb08d64de589681902e0700bd88ea8 Mon Sep 17 00:00:00 2001 From: KieranTou Date: Fri, 17 Feb 2023 14:20:18 +0800 Subject: [PATCH 1491/3019] =?UTF-8?q?=E8=BF=99=E7=A7=8D=E6=96=B9=E6=B3=95?= =?UTF-8?q?=E7=9A=84=E5=AE=9E=E7=8E=B0=E6=80=9D=E8=B7=AF=E5=92=8C=E5=8D=A1?= =?UTF-8?q?=E5=B0=94=E5=93=A5=E8=AE=B2=E7=9A=84=E4=B8=8D=E4=B8=80=E6=A0=B7?= =?UTF-8?q?=20=E8=A1=A5=E5=85=85=E5=8D=A1=E5=B0=94=E5=93=A5=E7=9A=84?= =?UTF-8?q?=E8=A7=A3=E9=A2=98=E6=80=9D=E8=B7=AF=E6=96=B9=E4=BE=BF=E5=A4=A7?= =?UTF-8?q?=E5=AE=B6=E7=90=86=E8=A7=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\346\227\213\347\237\251\351\230\265II.md" | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git "a/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" "b/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" index 78336d5a04..d9a656b9f6 100644 --- "a/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" +++ "b/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" @@ -300,6 +300,61 @@ function generateMatrix(n: number): number[][] { Go: +```go +package main + +import "fmt" + +func main() { + n := 3 + fmt.Println(generateMatrix(n)) +} + +func generateMatrix(n int) [][]int { + startx, starty := 0, 0 + var loop int = n / 2 + var center int = n / 2 + count := 1 + offset := 1 + res := make([][]int, n) + for i := 0; i < n; i++ { + res[i] = make([]int, n) + } + for loop > 0 { + i, j := startx, starty + + //行数不变 列数在变 + for j = starty; j < n-offset; j++ { + res[startx][j] = count + count++ + } + //列数不变是j 行数变 + for i = startx; i < n-offset; i++ { + res[i][j] = count + count++ + } + //行数不变 i 列数变 j-- + for ; j > starty; j-- { + res[i][j] = count + count++ + } + //列不变 行变 + for ; i > startx; i-- { + res[i][j] = count + count++ + } + startx++ + starty++ + offset++ + loop-- + } + if n%2 == 1 { + res[center][center] = n * n + } + return res +} +``` + ```go func generateMatrix(n int) [][]int { top, bottom := 0, n-1 From 9e2793ae99d107e2948ddcb6013fbf47709bbdfd Mon Sep 17 00:00:00 2001 From: KieranTou Date: Fri, 17 Feb 2023 16:00:57 +0800 Subject: [PATCH 1492/3019] =?UTF-8?q?=E8=AE=BE=E8=AE=A1=E9=93=BE=E8=A1=A8?= =?UTF-8?q?=20=E6=B2=A1=E6=9C=89Go=E5=8D=95=E9=93=BE=E8=A1=A8=E7=9A=84?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E5=8F=AA=E6=9C=89=E5=BE=AA=E7=8E=AF=E5=8F=8C?= =?UTF-8?q?=E9=93=BE=E8=A1=A8=20=E6=B7=BB=E5=8A=A0=E5=8D=95=E9=93=BE?= =?UTF-8?q?=E8=A1=A8=E5=AE=9E=E7=8E=B0=E4=BE=BF=E4=BA=8E=E7=90=86=E8=A7=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...76\350\256\241\351\223\276\350\241\250.md" | 100 ++++++++++++++++++ 1 file changed, 100 insertions(+) diff --git "a/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" "b/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" index b82a645e14..43ed262296 100644 --- "a/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" +++ "b/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" @@ -652,6 +652,106 @@ class MyLinkedList: Go: +```go +//单链表实现 +package main + +import "fmt" + +func main() { + var list = new(SingleLinkedList) + list.Init() + list.addAtHead(100) + list.addAtTail(242) + list.addAtTail(777) + list.addAtIndex(1, 99999) + list.printLinkedList() +} + +// 单链表写法 // + +type SingleNode struct { + Val int + Next *SingleNode +} + +type SingleLinkedList struct { + dummyHead *SingleNode + Size int +} + +// 初始化链表 +func (list *SingleLinkedList) Init() *SingleLinkedList { + list.Size = 0 + list.dummyHead = new(SingleNode) + return list +} + +// 获取第index个节点数值 +func (list *SingleLinkedList) get(index int) int { + if list != nil || index < 0 || index > list.Size { + return -1 + } + // 让cur等于真正头节点 + cur := list.dummyHead.Next + for i := 0; i < index; i++ { + cur = cur.Next + } + return cur.Val +} + +// 在链表最前面插入一个节点 +func (list *SingleLinkedList) addAtHead(val int) { + // 以下两行代码可用一行代替 + // newNode := new(SingleNode) + // newNode.Val = val + newNode := &SingleNode{Val: val} + + newNode.Next = list.dummyHead.Next + list.dummyHead.Next = newNode + list.Size++ +} + +// 在链表最后面插入一个节点 +func (list *SingleLinkedList) addAtTail(val int) { + newNode := &SingleNode{Val: val} + cur := list.dummyHead + for cur.Next != nil { + cur = cur.Next + } + cur.Next = newNode + list.Size++ +} + +// 打印链表 +func (list *SingleLinkedList) printLinkedList() { + cur := list.dummyHead + for cur.Next != nil { + fmt.Println(cur.Next.Val) + cur = cur.Next + } +} + +// 在第index个节点之前插入新节点 +func (list *SingleLinkedList) addAtIndex(index int, val int) { + if index < 0 { + index = 0 + } else if index > list.Size { + return + } + + newNode := &SingleNode{Val: val} + cur := list.dummyHead //用虚拟头节点不用考虑在头部插入的情况 + for i := 0; i < index; i++ { + cur = cur.Next + } + newNode.Next = cur.Next + cur.Next = newNode + list.Size++ +} + +``` + ```go //循环双链表 type MyLinkedList struct { From 12d1ae53960b06698006b83a1b6832e8bc1d486a Mon Sep 17 00:00:00 2001 From: fw_qaq Date: Fri, 17 Feb 2023 19:16:35 +0800 Subject: [PATCH 1493/3019] =?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 `&Vec` 内部实现包括指向堆上分配的缓冲区的指针、容量和长度信息等,在这里我们不需要那么多没用的信息,这可以减少一部分开销 --- ...\345\216\237IP\345\234\260\345\235\200.md" | 24 +++++++++++++------ 1 file changed, 17 insertions(+), 7 deletions(-) diff --git "a/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" "b/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" index a825b81554..1f99a7a5d0 100644 --- "a/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" +++ "b/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" @@ -566,14 +566,24 @@ function restoreIpAddresses(s: string): string[] { ```Rust impl Solution { - fn is_valid(s: &Vec, start: usize, end: usize) -> bool { - if start > end { return false; } - if s[start] == '0' && start != end { return false; } + fn is_valid(s: &[char], start: usize, end: usize) -> bool { + if start > end { + return false; + } + if s[start] == '0' && start != end { + return false; + } let mut num = 0; - for i in start..=end { - if s[i] > '9' || s[i] < '0' { return false; } - if let Some(digit) = s[i].to_digit(10) { num = num * 10 + digit; } - if num > 255 { return false; } + for &c in s.iter().take(end + 1).skip(start) { + if !('0'..='9').contains(&c) { + return false; + } + if let Some(digit) = c.to_digit(10) { + num = num * 10 + digit; + } + if num > 255 { + return false; + } } true } From d2311377a89c9811fbd2c1bca9c67a6a8fda2d21 Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Sat, 18 Feb 2023 09:18:51 +0800 Subject: [PATCH 1494/3019] Update --- ...2.\346\216\245\351\233\250\346\260\264.md" | 61 +++++++++++-------- ...04\345\255\220\346\225\260\347\273\204.md" | 6 ++ ...4\345\244\247\345\205\203\347\264\240I.md" | 6 +- ...\345\244\247\345\205\203\347\264\240II.md" | 55 ++++++++++++++--- ...53\346\211\213\347\273\255\350\264\271.md" | 2 +- ...17\346\227\245\346\270\251\345\272\246.md" | 33 +++++++++- ...22\346\200\273\347\273\223\347\257\207.md" | 9 +-- 7 files changed, 127 insertions(+), 45 deletions(-) diff --git "a/problems/0042.\346\216\245\351\233\250\346\260\264.md" "b/problems/0042.\346\216\245\351\233\250\346\260\264.md" index ac6f20f957..8ea81234cc 100644 --- "a/problems/0042.\346\216\245\351\233\250\346\260\264.md" +++ "b/problems/0042.\346\216\245\351\233\250\346\260\264.md" @@ -36,9 +36,9 @@ * 动态规划 * 单调栈 -## 双指针解法 +## 暴力解法 -这道题目使用双指针法并不简单,我们来看一下思路。 +本题暴力解法也是也是使用双指针。 首先要明确,要按照行来计算,还是按照列来计算。 @@ -75,6 +75,7 @@ 一样的方法,只要从头遍历一遍所有的列,然后求出每一列雨水的体积,相加之后就是总雨水的体积了。 首先从头遍历所有的列,并且**要注意第一个柱子和最后一个柱子不接雨水**,代码如下: + ```CPP for (int i = 0; i < height.size(); i++) { // 第一个柱子和最后一个柱子不接雨水 @@ -129,19 +130,18 @@ public: }; ``` -因为每次遍历列的时候,还要向两边寻找最高的列,所以时间复杂度为O(n^2)。 -空间复杂度为O(1)。 - +因为每次遍历列的时候,还要向两边寻找最高的列,所以时间复杂度为O(n^2),空间复杂度为O(1)。 +力扣后面修改了后台测试数据,所以以上暴力解法超时了。 +## 双指针优化 -## 动态规划解法 -在上一节的双指针解法中,我们可以看到只要记录左边柱子的最高高度 和 右边柱子的最高高度,就可以计算当前位置的雨水面积,这就是通过列来计算。 +在暴力解法中,我们可以看到只要记录左边柱子的最高高度 和 右边柱子的最高高度,就可以计算当前位置的雨水面积,这就是通过列来计算。 当前列雨水面积:min(左边柱子的最高高度,记录右边柱子的最高高度) - 当前柱子高度。 -为了得到两边的最高高度,使用了双指针来遍历,每到一个柱子都向两边遍历一遍,这其实是有重复计算的。我们把每一个位置的左边最高高度记录在一个数组上(maxLeft),右边最高高度记录在一个数组上(maxRight)。这样就避免了重复计算,这就用到了动态规划。 +为了得到两边的最高高度,使用了双指针来遍历,每到一个柱子都向两边遍历一遍,这其实是有重复计算的。我们把每一个位置的左边最高高度记录在一个数组上(maxLeft),右边最高高度记录在一个数组上(maxRight),这样就避免了重复计算。 当前位置,左边的最高高度是前一个位置的左边最高高度和本高度的最大值。 @@ -149,8 +149,6 @@ public: 从右向左遍历:maxRight[i] = max(height[i], maxRight[i + 1]); -这样就找到递推公式。 - 代码如下: ```CPP @@ -185,10 +183,13 @@ public: ## 单调栈解法 -这个解法可以说是最不好理解的了,所以下面我花了大量的篇幅来介绍这种方法。 +关于单调栈的理论基础,单调栈适合解决什么问题,单调栈的工作过程,大家可以先看这题讲解 [739. 每日温度](https://programmercarl.com/0739.每日温度.html)。 单调栈就是保持栈内元素有序。和[栈与队列:单调队列](https://programmercarl.com/0239.滑动窗口最大值.html)一样,需要我们自己维持顺序,没有现成的容器可以用。 +通常是一维数组,要寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置,此时我们就要想到可以用单调栈了。 + +而接雨水这道题目,我们正需要寻找一个元素,右边最大元素以及左边最大元素,来计算雨水面积。 ### 准备工作 @@ -212,6 +213,7 @@ public: ![42.接雨水4](https://img-blog.csdnimg.cn/2021022309321229.png) +关于单调栈的顺序给大家一个总结: [739. 每日温度](https://programmercarl.com/0739.每日温度.html) 中求一个元素右边第一个更大元素,单调栈就是递增的,[84.柱状图中最大的矩形](https://programmercarl.com/0084.柱状图中最大的矩形.html)求一个元素右边第一个更小元素,单调栈就是递减的。 3. 遇到相同高度的柱子怎么办。 @@ -227,13 +229,13 @@ public: 4. 栈里要保存什么数值 -是用单调栈,其实是通过 长 * 宽 来计算雨水面积的。 +使用单调栈,也是通过 长 * 宽 来计算雨水面积的。 长就是通过柱子的高度来计算,宽是通过柱子之间的下标来计算, 那么栈里有没有必要存一个pair类型的元素,保存柱子的高度和下标呢。 -其实不用,栈里就存放int类型的元素就行了,表示下标,想要知道对应的高度,通过height[stack.top()] 就知道弹出的下标对应的高度了。 +其实不用,栈里就存放下标就行,想要知道对应的高度,通过height[stack.top()] 就知道弹出的下标对应的高度了。 所以栈的定义如下: @@ -243,9 +245,17 @@ stack st; // 存着下标,计算的时候用下标对应的柱子高度 明确了如上几点,我们再来看处理逻辑。 -### 单调栈处理逻辑 +### 单调栈处理逻辑 + +以下操作过程其实和 [739. 每日温度](https://programmercarl.com/0739.每日温度.html) 也是一样的,建议先做 [739. 每日温度](https://programmercarl.com/0739.每日温度.html)。 -先将下标0的柱子加入到栈中,`st.push(0);`。 +以下逻辑主要就是三种情况 + +* 情况一:当前遍历的元素(柱子)高度小于栈顶元素的高度 height[i] < height[st.top()] +* 情况二:当前遍历的元素(柱子)高度等于栈顶元素的高度 height[i] == height[st.top()] +* 情况三:当前遍历的元素(柱子)高度大于栈顶元素的高度 height[i] > height[st.top()] + +先将下标0的柱子加入到栈中,`st.push(0);`。 栈中存放我们遍历过的元素,所以先将下标0加进来。 然后开始从下标1开始遍历所有的柱子,`for (int i = 1; i < height.size(); i++)`。 @@ -278,7 +288,7 @@ if (height[i] == height[st.top()]) { // 例如 5 5 1 7 这种情况 当前遍历的元素i,就是凹槽右边的位置,下标为i,对应的高度为height[i](就是图中的高度3)。 -此时大家应该可以发现其实就是**栈顶和栈顶的下一个元素以及要入栈的三个元素来接水!** +此时大家应该可以发现其实就是**栈顶和栈顶的下一个元素以及要入栈的元素,三个元素来接水!** 那么雨水高度是 min(凹槽左边高度, 凹槽右边高度) - 凹槽底部高度,代码为:`int h = min(height[st.top()], height[i]) - height[mid];` @@ -367,7 +377,7 @@ public: ### Java: -双指针法 +暴力解法: ```java class Solution { public int trap(int[] height) { @@ -393,7 +403,7 @@ class Solution { } ``` -动态规划法 +双指针: ```java class Solution { public int trap(int[] height) { @@ -470,7 +480,7 @@ class Solution { ### Python: -双指针法 +暴力解法: ```Python class Solution: def trap(self, height: List[int]) -> int: @@ -490,7 +500,8 @@ class Solution: res += res1 return res ``` -动态规划 + +双指针: ```python class Solution: def trap(self, height: List[int]) -> int: @@ -602,7 +613,7 @@ func trap(height []int) int { } ``` -动态规划解法: +双指针解法: ```go func trap(height []int) int { @@ -681,7 +692,7 @@ func min(x, y int) int { ### JavaScript: ```javascript -//双指针 +//暴力解法 var trap = function(height) { const len = height.length; let sum = 0; @@ -702,7 +713,7 @@ var trap = function(height) { return sum; }; -//动态规划 +//双指针 var trap = function(height) { const len = height.length; if(len <= 2) return 0; @@ -782,7 +793,7 @@ var trap = function(height) { ### TypeScript -双指针法: +暴力解法: ```typescript function trap(height: number[]): number { @@ -809,7 +820,7 @@ function trap(height: number[]): number { }; ``` -动态规划: +双指针: ```typescript function trap(height: number[]): number { diff --git "a/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" "b/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" index 220630f24b..a25fc2f582 100644 --- "a/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" +++ "b/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" @@ -17,6 +17,12 @@ 输出:2 解释:子数组 [4,3] 是该条件下的长度最小的子数组。 +提示: + +* 1 <= target <= 10^9 +* 1 <= nums.length <= 10^5 +* 1 <= nums[i] <= 10^5 + # 思路 为了易于大家理解,我特意录制了B站视频[拿下滑动窗口! | LeetCode 209 长度最小的子数组](https://www.bilibili.com/video/BV1tZ4y1q7XE),结合视频看本题解,事半功倍! diff --git "a/problems/0496.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240I.md" "b/problems/0496.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240I.md" index b3109fccf8..31c3ce4387 100644 --- "a/problems/0496.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240I.md" +++ "b/problems/0496.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240I.md" @@ -82,7 +82,7 @@ for (int i = 0; i < nums1.size(); i++) { 栈头到栈底的顺序,要从小到大,也就是保持栈里的元素为递增顺序。只要保持递增,才能找到右边第一个比自己大的元素。 -可能这里有一些同学不理解,那么可以自己尝试一下用递减栈,能不能求出来。其实递减栈就是求右边第一个比自己小的元素了。 +可能这里有一些同学不理解,那么可以自己尝试一下用递减栈,能不能求出来。**其实递减栈就是求右边第一个比自己小的元素了**。 接下来就要分析如下三种情况,一定要分析清楚。 @@ -101,7 +101,7 @@ for (int i = 0; i < nums1.size(); i++) { 判断栈顶元素是否在nums1里出现过,(注意栈里的元素是nums2的元素),如果出现过,开始记录结果。 -记录结果这块逻辑有一点小绕,要清楚,此时栈顶元素在nums2中右面第一个大的元素是nums2[i]即当前遍历元素。 +记录结果这块逻辑有一点小绕,要清楚,此时栈顶元素在nums2数组中右面第一个大的元素是nums2[i](即当前遍历元素)。 代码如下: @@ -116,7 +116,7 @@ while (!st.empty() && nums2[i] > nums2[st.top()]) { st.push(i); ``` -以上分析完毕,C++代码如下: +以上分析完毕,C++代码如下:(其实本题代码和 [739. 每日温度](https://programmercarl.com/0739.每日温度.html) 是基本差不多的) ```CPP diff --git "a/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" "b/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" index e82f58d78c..bf65120923 100644 --- "a/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" +++ "b/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" @@ -16,6 +16,11 @@ * 输出: [2,-1,2] * 解释: 第一个 1 的下一个更大的数是 2;数字 2 找不到下一个更大的数;第二个 1 的下一个最大的数需要循环搜索,结果也是 2。 +提示: + +* 1 <= nums.length <= 10^4 +* -10^9 <= nums[i] <= 10^9 + # 思路 @@ -23,7 +28,7 @@ 这道题和[739. 每日温度](https://programmercarl.com/0739.每日温度.html)也几乎如出一辙。 -不同的时候本题要循环数组了。 +不过,本题要循环数组了。 关于单调栈的讲解我在题解[739. 每日温度](https://programmercarl.com/0739.每日温度.html)中已经详细讲解了。 @@ -33,7 +38,7 @@ 确实可以! -讲两个nums数组拼接在一起,使用单调栈计算出每一个元素的下一个最大值,最后再把结果集即result数组resize到原数组大小就可以了。 +将两个nums数组拼接在一起,使用单调栈计算出每一个元素的下一个最大值,最后再把结果集即result数组resize到原数组大小就可以了。 代码如下: @@ -51,12 +56,17 @@ public: // 开始单调栈 stack st; - for (int i = 0; i < nums.size(); i++) { - while (!st.empty() && nums[i] > nums[st.top()]) { - result[st.top()] = nums[i]; - st.pop(); + st.push(0); + for (int i = 1; i < nums.size(); i++) { + if (nums[i] < nums[st.top()]) st.push(i); + else if (nums[i] == nums[st.top()]) st.push(i); + else { + while (!st.empty() && nums[i] > nums[st.top()]) { + result[st.top()] = nums[i]; + st.pop(); + } + st.push(i); } - st.push(i); } // 最后再把结果集即result数组resize到原数组大小 result.resize(nums.size() / 2); @@ -74,6 +84,36 @@ resize倒是不费时间,是O(1)的操作,但扩充nums数组相当于多了 代码如下: +```CPP +// 版本二 +class Solution { +public: + vector nextGreaterElements(vector& nums) { + vector result(nums.size(), -1); + if (nums.size() == 0) return result; + stack st; + st.push(0); + for (int i = 1; i < nums.size() * 2; i++) { + // 模拟遍历两边nums,注意一下都是用i % nums.size()来操作 + if (nums[i % nums.size()] < nums[st.top()]) st.push(i % nums.size()); + else if (nums[i % nums.size()] == nums[st.top()]) st.push(i % nums.size()); + else { + while (!st.empty() && nums[i % nums.size()] > nums[st.top()]) { + result[st.top()] = nums[i % nums.size()]; + st.pop(); + } + st.push(i % nums.size()); + } + } + return result; + } +}; +``` + +可以版本二不仅代码精简了,也比版本一少做了无用功! + +最后在给出 单调栈的精简版本,即三种情况都做了合并的操作。 + ```CPP // 版本二 class Solution { @@ -95,7 +135,6 @@ public: }; ``` -可以版本二不仅代码精简了,也比版本一少做了无用功! ## 其他语言版本 diff --git "a/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271.md" "b/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271.md" index d0a5360c5e..52b2be3bcc 100644 --- "a/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271.md" +++ "b/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271.md" @@ -78,7 +78,7 @@ public: // 计算利润,可能有多次计算利润,最后一次计算利润才是真正意义的卖出 if (prices[i] > minPrice + fee) { result += prices[i] - minPrice - fee; - minPrice = prices[i] - fee; // 情况一,这一步很关键 + minPrice = prices[i] - fee; // 情况一,这一步很关键,避免重复扣手续费 } } return result; diff --git "a/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" "b/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" index 93f45bd9c8..5aa370052f 100644 --- "a/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" +++ "b/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" @@ -32,6 +32,9 @@ **单调栈的本质是空间换时间**,因为在遍历的过程中需要用一个栈来记录右边第一个比当前元素高的元素,优点是整个数组只需要遍历一次。 +**更直白来说,就是用一个栈来记录我们遍历过的元素**,因为我们遍历数组的时候,我们不知道之前都遍历了哪些元素,以至于遍历一个元素找不到是不是之前遍历过一个更小的,所以我们需要用一个容器(这里用单调栈)来记录我们遍历过的元素。 + + 在使用单调栈的时候首先要明确如下几点: 1. 单调栈里存放的元素是什么? @@ -44,7 +47,9 @@ 这里我们要使用递增循序(再强调一下是指从栈头到栈底的顺序),因为只有递增的时候,栈里要加入一个元素i的时候,才知道栈顶元素在数组中右面第一个比栈顶元素大的元素是i。 -文字描述理解起来有点费劲,接下来我画了一系列的图,来讲解单调栈的工作过程。 +即:如果求一个元素右边第一个更大元素,单调栈就是递增的,如果求一个元素右边第一个更小元素,单调栈就是递减的。 + +文字描述理解起来有点费劲,接下来我画了一系列的图,来讲解单调栈的工作过程,大家再去思考,本题为什么是递增栈。 使用单调栈主要有三个判断条件。 @@ -56,50 +61,74 @@ 接下来我们用temperatures = [73, 74, 75, 71, 71, 72, 76, 73]为例来逐步分析,输出应该是 [1, 1, 4, 2, 1, 1, 0, 0]。 +------- + 首先先将第一个遍历元素加入单调栈 ![739.每日温度1](https://img-blog.csdnimg.cn/20210219124434172.jpg) +--------- + 加入T[1] = 74,因为T[1] > T[0](当前遍历的元素T[i]大于栈顶元素T[st.top()]的情况)。 我们要保持一个递增单调栈(从栈头到栈底),所以将T[0]弹出,T[1]加入,此时result数组可以记录了,result[0] = 1,即T[0]右面第一个比T[0]大的元素是T[1]。 ![739.每日温度2](https://img-blog.csdnimg.cn/20210219124504299.jpg) +----------- + 加入T[2],同理,T[1]弹出 ![739.每日温度3](https://img-blog.csdnimg.cn/20210219124527361.jpg) +------- + 加入T[3],T[3] < T[2] (当前遍历的元素T[i]小于栈顶元素T[st.top()]的情况),加T[3]加入单调栈。 ![739.每日温度4](https://img-blog.csdnimg.cn/20210219124610761.jpg) +--------- + 加入T[4],T[4] == T[3] (当前遍历的元素T[i]等于栈顶元素T[st.top()]的情况),此时依然要加入栈,不用计算距离,因为我们要求的是右面第一个大于本元素的位置,而不是大于等于! ![739.每日温度5](https://img-blog.csdnimg.cn/20210219124633444.jpg) +--------- + 加入T[5],T[5] > T[4] (当前遍历的元素T[i]大于栈顶元素T[st.top()]的情况),将T[4]弹出,同时计算距离,更新result ![739.每日温度6](https://img-blog.csdnimg.cn/20210219124700567.jpg) +---------- + T[4]弹出之后, T[5] > T[3] (当前遍历的元素T[i]大于栈顶元素T[st.top()]的情况),将T[3]继续弹出,同时计算距离,更新result ![739.每日温度7](https://img-blog.csdnimg.cn/20210219124726613.jpg) +------- + 直到发现T[5]小于T[st.top()],终止弹出,将T[5]加入单调栈 ![739.每日温度8](https://img-blog.csdnimg.cn/20210219124807715.jpg) +------- + 加入T[6],同理,需要将栈里的T[5],T[2]弹出 ![739.每日温度9](https://img-blog.csdnimg.cn/2021021912483374.jpg) +------- + 同理,继续弹出 ![739.每日温度10](https://img-blog.csdnimg.cn/2021021912490098.jpg) +------ + 此时栈里只剩下了T[6] ![739.每日温度11](https://img-blog.csdnimg.cn/20210219124930156.jpg) +------------ + 加入T[7], T[7] < T[6] 直接入栈,这就是最后的情况,result数组也更新完了。 ![739.每日温度12](https://img-blog.csdnimg.cn/20210219124957216.jpg) @@ -115,6 +144,8 @@ T[4]弹出之后, T[5] > T[3] (当前遍历的元素T[i]大于栈顶元素T[ * 情况二:当前遍历的元素T[i]等于栈顶元素T[st.top()]的情况 * 情况三:当前遍历的元素T[i]大于栈顶元素T[st.top()]的情况 +通过以上过程,大家可以自己再模拟一遍,就会发现:只有单调栈递增(从栈口到栈底顺序),就是求右边第一个比自己大的,单调栈递减的话,就是求右边第一个比自己小的。 + C++代码如下: ```CPP diff --git "a/problems/\345\212\250\346\200\201\350\247\204\345\210\222\346\200\273\347\273\223\347\257\207.md" "b/problems/\345\212\250\346\200\201\350\247\204\345\210\222\346\200\273\347\273\223\347\257\207.md" index cf604d5d71..8a1531f8be 100644 --- "a/problems/\345\212\250\346\200\201\350\247\204\345\210\222\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/\345\212\250\346\200\201\350\247\204\345\210\222\346\200\273\347\273\223\347\257\207.md" @@ -121,7 +121,7 @@ 这个图是 [代码随想录知识星球](https://programmercarl.com/other/kstar.html) 成员:[青](https://wx.zsxq.com/dweb2/index/footprint/185251215558842),所画,总结的非常好,分享给大家。 -这已经是全网对动规最深刻的讲解系列了。 +这应该是全网对动规最深刻的讲解系列了。 **其实大家去网上搜一搜也可以发现,能把动态规划讲清楚的资料挺少的,因为动规确实很难!要给别人讲清楚更难!** @@ -129,12 +129,7 @@ 讲清楚一道题容易,讲清楚两道题也容易,但把整个动态规划的各个分支讲清楚,每道题目讲通透,并用一套方法论把整个动规贯彻始终就非常难了。 -所以Carl花费的这么大精力,把自己对动规算法理解 一五一十的全部分享给了录友们,帮助大家少走弯路! - -**至于动态规划PDF,即将在公众号「代码随想录」全网首发!** - -最后感谢录友们的一路支持,Carl才有继续更下去的动力[玫瑰],[撒花] - +所以Carl花费的这么大精力,把自己对动规算法理解 一五一十的全部分享给了录友们,帮助大家少走弯路,加油!

From 2fc3e83bcf7c053420a5ebb485608c0ccce17ced Mon Sep 17 00:00:00 2001 From: ZerenZhang2022 <118794589+ZerenZhang2022@users.noreply.github.com> Date: Sat, 18 Feb 2023 17:27:51 -0500 Subject: [PATCH 1495/3019] =?UTF-8?q?Update=200763.=E5=88=92=E5=88=86?= =?UTF-8?q?=E5=AD=97=E6=AF=8D=E5=8C=BA=E9=97=B4.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit python 解法三:区间合并法 (结合下一题 56. Merge Intervals 的写法) --- ...27\346\257\215\345\214\272\351\227\264.md" | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git "a/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" "b/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" index 6c4f1c5e76..6667e7403e 100644 --- "a/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" +++ "b/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" @@ -276,6 +276,33 @@ class Solution: # 最右侧区间(字符串长度为1时的特殊情况也包含于其中) res.append(right - left + 1) return res + +# 解法三:区间合并法 (结合下一题 56. Merge Intervals 的写法) +class Solution: # + def partitionLabels(self, s: str) -> List[int]: + aaa = list(set(s)) + #aaa.sort() + bbb = list(s) + ccc = [] + for i in reversed(bbb): + ccc.append(i) + intervals = [] + for i in range(len(aaa)): + intervals.append([bbb.index(aaa[i]),len(bbb)-ccc.index(aaa[i])-1]) + # 先求出各个字母的存在区间,之后利用区间合并方法得出所有不相邻的最大区间。 + intervals.sort(key = lambda x:x[0]) + newinterval = [] + left, right = intervals[0][0], intervals[0][1] + for i in range(1,len(intervals)): + if intervals[i][0] in range(left, right+1): + right = max(intervals[i][1],intervals[i-1][1],right) + left = min(intervals[i-1][0],left) + else: + newinterval.append(right-left+1) + left = intervals[i][0] + right = intervals[i][1] + newinterval.append(right-left+1) + return newinterval ``` ### Go From 974e66aba2e86d68b71c91bbc6bcf80baac7dbc5 Mon Sep 17 00:00:00 2001 From: lee3yearsold <56989190+lee3yearsold@users.noreply.github.com> Date: Mon, 20 Feb 2023 11:08:26 +0800 Subject: [PATCH 1496/3019] Add files via upload --- ...5\344\273\243\347\220\206\350\247\243).md" | 145 ++++++++++++++++++ 1 file changed, 145 insertions(+) create mode 100644 "problems/0377-\347\273\204\345\220\210\346\200\273\345\222\214IV(\345\256\214\345\205\250\350\203\214\345\214\205\347\232\204\346\216\222\345\210\227\351\227\256\351\242\230\344\272\214\347\273\264\350\277\255\344\273\243\347\220\206\350\247\243).md" diff --git "a/problems/0377-\347\273\204\345\220\210\346\200\273\345\222\214IV(\345\256\214\345\205\250\350\203\214\345\214\205\347\232\204\346\216\222\345\210\227\351\227\256\351\242\230\344\272\214\347\273\264\350\277\255\344\273\243\347\220\206\350\247\243).md" "b/problems/0377-\347\273\204\345\220\210\346\200\273\345\222\214IV(\345\256\214\345\205\250\350\203\214\345\214\205\347\232\204\346\216\222\345\210\227\351\227\256\351\242\230\344\272\214\347\273\264\350\277\255\344\273\243\347\220\206\350\247\243).md" new file mode 100644 index 0000000000..276329c56a --- /dev/null +++ "b/problems/0377-\347\273\204\345\220\210\346\200\273\345\222\214IV(\345\256\214\345\205\250\350\203\214\345\214\205\347\232\204\346\216\222\345\210\227\351\227\256\351\242\230\344\272\214\347\273\264\350\277\255\344\273\243\347\220\206\350\247\243).md" @@ -0,0 +1,145 @@ +# 完全背包的排列问题模拟 + +#### Problem + +1. 排列问题是完全背包中十分棘手的问题。 +2. 其在迭代过程中需要先迭代背包容量,再迭代物品个数,使得其在代码理解上较难入手。 + +#### Contribution + +本文档以力扣上[组合总和IV](https://leetcode.cn/problems/combination-sum-iv/)为例,提供一个二维dp的代码例子,并提供模拟过程以便于理解 + +#### Code + +```cpp +int combinationSum4(vector& nums, int target) { + // 定义背包容量为target,物品个数为nums.size()的dp数组 + // dp[i][j]表示将第0-i个物品添加入排列中,和为j的排列方式 + vector> dp (nums.size(), vector(target+1,0)); + + // 表示有0,1,...,n个物品可选择的情况下,和为0的选择方法为1:什么都不取 + for(int i = 0; i < nums.size(); i++) dp[i][0] = 1; + + // 必须按列遍历,因为右边数组需要知道左边数组最低部的信息(排列问题) + // 后面的模拟可以更清楚的表现这么操作的原因 + for(int i = 1; i <= target; i++){ + for(int j = 0; j < nums.size(); j++){ + // 只有nums[j]可以取的情况 + if(j == 0){ + if(nums[j] > i) dp[j][i] = 0; + // 如果背包容量放不下 那么此时没有排列方式 + else dp[j][i] = dp[nums.size()-1][i-nums[j]]; + // 如果背包容量放的下 全排列方式为dp[最底层][容量-该物品容量]排列方式后面放一个nums[j] + } + // 有多个nums数可以取 + else{ + // 如果背包容量放不下 那么沿用0-j-1个物品的排列方式 + if(nums[j] > i) dp[j][i] = dp[j-1][i]; + // 如果背包容量放得下 在dp[最底层][容量-该物品容量]排列方式后面放一个nums[j]后面放个nums[j] + // INT_MAX避免溢出 + else if(i >= nums[j] && dp[j-1][i] < INT_MAX - dp[nums.size()-1][i-nums[j]]) + dp[j][i] = dp[j-1][i] + dp[nums.size()-1][i-nums[j]]; + } + } + } + // 打印dp数组 + for(int i = 0; i < nums.size(); i++){ + for(int j = 0; j <= target; j++){ + cout< Date: Mon, 20 Feb 2023 13:47:11 -0600 Subject: [PATCH 1497/3019] =?UTF-8?q?=E5=9C=A8=E5=9B=BE=E7=89=87=E5=89=8D?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=9B=9E=E8=BD=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...6\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" | 1 + 1 file changed, 1 insertion(+) diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" index 21e2039f7a..9fc6a39cd8 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -59,6 +59,7 @@ * 它的左、右子树也分别为二叉排序树 下面这两棵树都是搜索树 + From 7c1da2e34ed067d07604b6efbdc3b2696884bd73 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8A=B1=E6=97=A0=E7=BC=BA?= Date: Tue, 21 Feb 2023 12:01:03 +0800 Subject: [PATCH 1498/3019] =?UTF-8?q?=E4=BC=98=E5=8C=96=E8=87=AA=E8=BF=B0?= =?UTF-8?q?=E6=96=87=E6=A1=A3=EF=BC=88README.md=EF=BC=89=E6=A0=BC=E5=BC=8F?= =?UTF-8?q?=EF=BC=8C=E6=8F=90=E5=8D=87=E6=96=87=E6=A1=A3=E7=BE=8E=E8=A7=82?= =?UTF-8?q?=E5=BA=A6=E5=92=8C=E4=B8=93=E4=B8=9A=E6=80=A7=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c6d6bfe235..a2da15507b 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ > 2. **正式出版** :[《代码随想录》](https://programmercarl.com/other/publish.html) 。 > 3. **PDF版本** : [「代码随想录」算法精讲 PDF 版本](https://programmercarl.com/other/algo_pdf.html) 。 > 4. **算法公开课** : [《代码随想录》算法视频公开课](https://www.bilibili.com/video/BV1fA4y1o715) 。 -> 5. **最强八股文:**:[代码随想录知识星球精华PDF](https://www.programmercarl.com/other/kstar_baguwen.html) +> 5. **最强八股文** : [代码随想录知识星球精华PDF](https://www.programmercarl.com/other/kstar_baguwen.html) 。 > 6. **刷题顺序** : README已经将刷题顺序排好了,按照顺序一道一道刷就可以。 > 7. **学习社区** : 一起学习打卡/面试技巧/如何选择offer/大厂内推/职场规则/简历修改/技术分享/程序人生。欢迎加入[「代码随想录」知识星球](https://programmercarl.com/other/kstar.html) 。 > 8. **提交代码**:本项目统一使用C++语言进行讲解,但已经有Java、Python、Go、JavaScript等等多语言版本,感谢[这里的每一位贡献者](https://github.com/youngyangyang04/leetcode-master/graphs/contributors),如果你也想贡献代码点亮你的头像,[点击这里](https://mp.weixin.qq.com/s/tqCxrMEU-ajQumL1i8im9A)了解提交代码的方式。 From 85b5186117ae1e3a80b58bcfe49ce1c387c6e18b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8A=B1=E6=97=A0=E7=BC=BA?= Date: Tue, 21 Feb 2023 12:05:58 +0800 Subject: [PATCH 1499/3019] =?UTF-8?q?=E4=BC=98=E5=8C=96=E8=87=AA=E8=BF=B0?= =?UTF-8?q?=E6=96=87=E6=A1=A3=EF=BC=88README.md=EF=BC=89=E6=A0=BC=E5=BC=8F?= =?UTF-8?q?=EF=BC=8C=E6=8F=90=E5=8D=87=E6=96=87=E6=A1=A3=E7=BE=8E=E8=A7=82?= =?UTF-8?q?=E5=BA=A6=E5=92=8C=E4=B8=93=E4=B8=9A=E6=80=A7=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index a2da15507b..aa6c93ee23 100644 --- a/README.md +++ b/README.md @@ -2,14 +2,14 @@ 👉 推荐 [在线阅读](http://programmercarl.com/) (Github在国内访问经常不稳定) 👉 推荐 [Gitee同步](https://gitee.com/programmercarl/leetcode-master) -> 1. **介绍**:本项目是一套完整的刷题计划,旨在帮助大家少走弯路,循序渐进学算法,[关注作者](#关于作者) +> 1. **介绍** :本项目是一套完整的刷题计划,旨在帮助大家少走弯路,循序渐进学算法,[关注作者](#关于作者) > 2. **正式出版** :[《代码随想录》](https://programmercarl.com/other/publish.html) 。 -> 3. **PDF版本** : [「代码随想录」算法精讲 PDF 版本](https://programmercarl.com/other/algo_pdf.html) 。 -> 4. **算法公开课** : [《代码随想录》算法视频公开课](https://www.bilibili.com/video/BV1fA4y1o715) 。 -> 5. **最强八股文** : [代码随想录知识星球精华PDF](https://www.programmercarl.com/other/kstar_baguwen.html) 。 -> 6. **刷题顺序** : README已经将刷题顺序排好了,按照顺序一道一道刷就可以。 -> 7. **学习社区** : 一起学习打卡/面试技巧/如何选择offer/大厂内推/职场规则/简历修改/技术分享/程序人生。欢迎加入[「代码随想录」知识星球](https://programmercarl.com/other/kstar.html) 。 -> 8. **提交代码**:本项目统一使用C++语言进行讲解,但已经有Java、Python、Go、JavaScript等等多语言版本,感谢[这里的每一位贡献者](https://github.com/youngyangyang04/leetcode-master/graphs/contributors),如果你也想贡献代码点亮你的头像,[点击这里](https://mp.weixin.qq.com/s/tqCxrMEU-ajQumL1i8im9A)了解提交代码的方式。 +> 3. **PDF版本** :[「代码随想录」算法精讲 PDF 版本](https://programmercarl.com/other/algo_pdf.html) 。 +> 4. **算法公开课** :[《代码随想录》算法视频公开课](https://www.bilibili.com/video/BV1fA4y1o715) 。 +> 5. **最强八股文** :[代码随想录知识星球精华PDF](https://www.programmercarl.com/other/kstar_baguwen.html) 。 +> 6. **刷题顺序** :README已经将刷题顺序排好了,按照顺序一道一道刷就可以。 +> 7. **学习社区** :一起学习打卡/面试技巧/如何选择offer/大厂内推/职场规则/简历修改/技术分享/程序人生。欢迎加入[「代码随想录」知识星球](https://programmercarl.com/other/kstar.html) 。 +> 8. **提交代码** :本项目统一使用C++语言进行讲解,但已经有Java、Python、Go、JavaScript等等多语言版本,感谢[这里的每一位贡献者](https://github.com/youngyangyang04/leetcode-master/graphs/contributors),如果你也想贡献代码点亮你的头像,[点击这里](https://mp.weixin.qq.com/s/tqCxrMEU-ajQumL1i8im9A)了解提交代码的方式。 > 9. **转载须知** :以下所有文章皆为我([程序员Carl](https://github.com/youngyangyang04))的原创。引用本项目文章请注明出处,发现恶意抄袭或搬运,会动用法律武器维护自己的权益。让我们一起维护一个良好的技术创作环境! From 0b3e4aed920c420d6fdb1d76872e826796926ed3 Mon Sep 17 00:00:00 2001 From: Logen <47022821+Logenleedev@users.noreply.github.com> Date: Mon, 20 Feb 2023 22:30:01 -0600 Subject: [PATCH 1500/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=96=B0=E6=96=B9?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...72\347\216\260\346\254\241\346\225\260.md" | 23 ++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git "a/problems/1207.\347\213\254\344\270\200\346\227\240\344\272\214\347\232\204\345\207\272\347\216\260\346\254\241\346\225\260.md" "b/problems/1207.\347\213\254\344\270\200\346\227\240\344\272\214\347\232\204\345\207\272\347\216\260\346\254\241\346\225\260.md" index afc93edab9..1a7a001989 100644 --- "a/problems/1207.\347\213\254\344\270\200\346\227\240\344\272\214\347\232\204\345\207\272\347\216\260\346\254\241\346\225\260.md" +++ "b/problems/1207.\347\213\254\344\270\200\346\227\240\344\272\214\347\232\204\345\207\272\347\216\260\346\254\241\346\225\260.md" @@ -98,7 +98,8 @@ class Solution { ``` Python: -```python +```python +# 方法 1: 数组在哈西法的应用 class Solution: def uniqueOccurrences(self, arr: List[int]) -> bool: count = [0] * 2002 @@ -113,6 +114,26 @@ class Solution: return False return True ``` +```python +# 方法 2: map 在哈西法的应用 +class Solution: + def uniqueOccurrences(self, arr: List[int]) -> bool: + ref = dict() + + for i in range(len(arr)): + ref[arr[i]] = ref.get(arr[i], 0) + 1 + + value_list = sorted(ref.values()) + + for i in range(len(value_list) - 1): + if value_list[i + 1] == value_list[i]: + return False + + return True + +``` + + Go: JavaScript: From 97e495ccccf7dc8b9f982ef22434a28fac494f0d Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Wed, 22 Feb 2023 17:21:40 +0800 Subject: [PATCH 1501/3019] Update --- README.md | 2 +- ...44\346\225\260\344\271\213\345\222\214.md" | 3 +- ...47\347\232\204\347\237\251\345\275\242.md" | 87 +++++++++++++------ ...25\346\200\273\347\273\223\347\257\207.md" | 2 +- 4 files changed, 63 insertions(+), 31 deletions(-) diff --git a/README.md b/README.md index c6d6bfe235..017c4fdd30 100644 --- a/README.md +++ b/README.md @@ -295,7 +295,7 @@ 21. [本周小结!(贪心算法系列四)](./problems/周总结/20201224贪心周末总结.md) 22. [贪心算法:738.单调递增的数字](./problems/0738.单调递增的数字.md) 23. [贪心算法:968.监控二叉树](./problems/0968.监控二叉树.md) -24. [贪心算法:714.买卖股票的最佳时机含手续费](./problems/0714.买卖股票的最佳时机含手续费.md) + 25. [贪心算法:总结篇!(每逢总结必经典)](./problems/贪心算法总结篇.md) ## 动态规划 diff --git "a/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" "b/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" index aa8724db49..2d3d6ea33a 100644 --- "a/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" @@ -85,7 +85,8 @@ map目的用来存放我们访问过的元素,因为遍历数组的时候, ![过程一](https://code-thinking-1253855093.file.myqcloud.com/pics/20220711202638.png) -![过程二](https://code-thinking-1253855093.file.myqcloud.com/pics/20220711202708.png) + +![过程二](https://code-thinking-1253855093.file.myqcloud.com/pics/20230220223536.png) C++代码: diff --git "a/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" "b/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" index bcb0915e9c..eb06414334 100644 --- "a/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" +++ "b/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" @@ -17,6 +17,8 @@ ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210803220506.png) +* 1 <= heights.length <=10^5 +* 0 <= heights[i] <= 10^4 # 思路 @@ -24,9 +26,9 @@ 其实这两道题目先做那一道都可以,但我先写的42.接雨水的题解,所以如果没做过接雨水的话,建议先做一做接雨水,可以参考我的题解:[42. 接雨水](https://programmercarl.com/0042.接雨水.html) -我们先来看一下双指针的解法: +我们先来看一下暴力解法的解法: -## 双指针解法 +## 暴力解法 ```CPP class Solution { @@ -53,9 +55,9 @@ public: 如上代码并不能通过leetcode,超时了,因为时间复杂度是$O(n^2)$。 -## 动态规划 +## 双指针解法 -本题动态规划的写法整体思路和[42. 接雨水](https://programmercarl.com/0042.接雨水.html)是一致的,但要比[42. 接雨水](https://programmercarl.com/0042.接雨水.html)难一些。 +本题双指针的写法整体思路和[42. 接雨水](https://programmercarl.com/0042.接雨水.html)是一致的,但要比[42. 接雨水](https://programmercarl.com/0042.接雨水.html)难一些。 难就难在本题要记录记录每个柱子 左边第一个小于该柱子的下标,而不是左边第一个小于该柱子的高度。 @@ -110,7 +112,7 @@ public: 我来举一个例子,如图: -![84.柱状图中最大的矩形](https://img-blog.csdnimg.cn/20210223155303971.jpg) +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20230221165730.png) 只有栈里从大到小的顺序,才能保证栈顶元素找到左右两边第一个小于栈顶元素的柱子。 @@ -122,11 +124,11 @@ public: 除了栈内元素顺序和接雨水不同,剩下的逻辑就都差不多了,在题解[42. 接雨水](https://programmercarl.com/0042.接雨水.html)我已经对单调栈的各个方面做了详细讲解,这里就不赘述了。 -剩下就是分析清楚如下三种情况: +主要就是分析清楚如下三种情况: -* 情况一:当前遍历的元素heights[i]小于栈顶元素heights[st.top()]的情况 +* 情况一:当前遍历的元素heights[i]大于栈顶元素heights[st.top()]的情况 * 情况二:当前遍历的元素heights[i]等于栈顶元素heights[st.top()]的情况 -* 情况三:当前遍历的元素heights[i]大于栈顶元素heights[st.top()]的情况 +* 情况三:当前遍历的元素heights[i]小于栈顶元素heights[st.top()]的情况 C++代码如下: @@ -135,28 +137,30 @@ C++代码如下: class Solution { public: int largestRectangleArea(vector& heights) { + int result = 0; stack st; heights.insert(heights.begin(), 0); // 数组头部加入元素0 heights.push_back(0); // 数组尾部加入元素0 st.push(0); - int result = 0; + // 第一个元素已经入栈,从下标1开始 for (int i = 1; i < heights.size(); i++) { - // 注意heights[i] 是和heights[st.top()] 比较 ,st.top()是下标 - if (heights[i] > heights[st.top()]) { + if (heights[i] > heights[st.top()]) { // 情况一 st.push(i); - } else if (heights[i] == heights[st.top()]) { + } else if (heights[i] == heights[st.top()]) { // 情况二 st.pop(); // 这个可以加,可以不加,效果一样,思路不同 st.push(i); - } else { - while (heights[i] < heights[st.top()]) { // 注意是while + } else { // 情况三 + while (!st.empty() && heights[i] < heights[st.top()]) { // 注意是while int mid = st.top(); st.pop(); - int left = st.top(); - int right = i; - int w = right - left - 1; - int h = heights[mid]; - result = max(result, w * h); + if (!st.empty()) { + int left = st.top(); + int right = i; + int w = right - left - 1; + int h = heights[mid]; + result = max(result, w * h); + } } st.push(i); } @@ -165,9 +169,36 @@ public: } }; -``` +``` + +细心的录友会发现,我在 height数组上后,都加了一个元素0, 为什么这么做呢? + +首先来说末尾为什么要加元素0? + +如果数组本身就是升序的,例如[2,4,6,8],那么入栈之后 都是单调递减,一直都没有走 情况三 计算结果的哪一步,所以最后输出的就是0了。 如图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20230221163936.png) + +那么结尾加一个0,就会让栈里的所有元素,走到情况三的逻辑。 + + +开头为什么要加元素0? + +如果数组本身是降序的,例如 [8,6,4,2],在 8 入栈后,6 开始与8 进行比较,此时我们得到 mid(8),rigt(6),但是得不到 left。 + +(mid、left,right 都是对应版本一里的逻辑) + +因为 将 8 弹出之后,栈里没有元素了,那么为了避免空栈取值,直接跳过了计算结果的逻辑。 + +之后又将6 加入栈(此时8已经弹出了),然后 就是 4 与 栈口元素 8 进行比较,周而复始,那么计算的最后结果resutl就是0。 如图所示: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20230221164533.png) + +所以我们需要在 height数组前后各加一个元素0。 + + -代码精简之后: +版本一代码精简之后: ```CPP // 版本二 @@ -200,7 +231,7 @@ public: Java: -动态规划 +暴力解法: ```java class Solution { public int largestRectangleArea(int[] heights) { @@ -233,7 +264,7 @@ class Solution { } ``` -单调栈 +单调栈: ```java class Solution { int largestRectangleArea(int[] heights) { @@ -281,7 +312,7 @@ Python3: ```python -# 双指针;暴力解法(leetcode超时) +# 暴力解法(leetcode超时) class Solution: def largestRectangleArea(self, heights: List[int]) -> int: # 从左向右遍历:以每一根柱子为主心骨(当前轮最高的参照物),迭代直到找到左侧和右侧各第一个矮一级的柱子 @@ -307,7 +338,7 @@ class Solution: return res -# DP动态规划 +# 双指针 class Solution: def largestRectangleArea(self, heights: List[int]) -> int: size = len(heights) @@ -450,7 +481,7 @@ func largestRectangleArea(heights []int) int { JavaScript: ```javascript -//动态规划 js中运行速度最快 +//双指针 js中运行速度最快 var largestRectangleArea = function(heights) { const len = heights.length; const minLeftIndex = new Array(len); @@ -525,7 +556,7 @@ var largestRectangleArea = function(heights) { ``` TypeScript: -> 双指针法(会超时): +> 暴力法(会超时): ```typescript function largestRectangleArea(heights: number[]): number { @@ -546,7 +577,7 @@ function largestRectangleArea(heights: number[]): number { }; ``` -> 动态规划预处理: +> 双指针预处理: ```typescript function largestRectangleArea(heights: number[]): number { diff --git "a/problems/\350\264\252\345\277\203\347\256\227\346\263\225\346\200\273\347\273\223\347\257\207.md" "b/problems/\350\264\252\345\277\203\347\256\227\346\263\225\346\200\273\347\273\223\347\257\207.md" index 1a516e5f1e..d52e85513c 100644 --- "a/problems/\350\264\252\345\277\203\347\256\227\346\263\225\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/\350\264\252\345\277\203\347\256\227\346\263\225\346\200\273\347\273\223\347\257\207.md" @@ -73,7 +73,7 @@ Carl个人认为:如果找出局部最优并可以推出全局最优,就是 大家都知道股票系列问题是动规的专长,其实用贪心也可以解决,而且还不止就这两道题目,但这两道比较典型,我就拿来单独说一说 * [贪心算法:买卖股票的最佳时机II](https://programmercarl.com/0122.买卖股票的最佳时机II.html) -* [贪心算法:买卖股票的最佳时机含手续费](https://programmercarl.com/0714.买卖股票的最佳时机含手续费.html) 本题使用贪心算法比较绕,建议理解动态规划就好 +* [贪心算法:买卖股票的最佳时机含手续费](https://programmercarl.com/0714.买卖股票的最佳时机含手续费.html) 本题使用贪心算法比较绕,建议后面学习动态规划章节的时候,理解动规就好 ### 两个维度权衡问题 From c6bc3fc67817f65b7e436ecef34fa9ebbd53d416 Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Wed, 22 Feb 2023 17:26:31 +0800 Subject: [PATCH 1502/3019] Update --- README.md | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 1108dac850..a9b2f7efe9 100644 --- a/README.md +++ b/README.md @@ -295,8 +295,7 @@ 21. [本周小结!(贪心算法系列四)](./problems/周总结/20201224贪心周末总结.md) 22. [贪心算法:738.单调递增的数字](./problems/0738.单调递增的数字.md) 23. [贪心算法:968.监控二叉树](./problems/0968.监控二叉树.md) - -25. [贪心算法:总结篇!(每逢总结必经典)](./problems/贪心算法总结篇.md) +24. [贪心算法:总结篇!(每逢总结必经典)](./problems/贪心算法总结篇.md) ## 动态规划 @@ -501,16 +500,15 @@

- # 公众号 更多精彩文章持续更新,微信搜索:「代码随想录」第一时间围观,关注后回复:666,可以获得我的所有算法专题原创PDF。 -**「代码随想录」每天准时为你推送一篇经典面试题目,帮你梳理算法知识体系,轻松学习算法!**,并且公众号里有大量学习资源,也有我自己的学习心得和方法总结,更有上万录友们在这里打卡学习。 - **来看看就知道了,你会发现相见恨晚!**
+ + From 97e5867fac9161200652c52dafa955df6805cdca Mon Sep 17 00:00:00 2001 From: fw_qaq Date: Wed, 22 Feb 2023 22:15:19 +0800 Subject: [PATCH 1503/3019] =?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 --- "problems/0090.\345\255\220\351\233\206II.md" | 34 +++++++++++++++++-- 1 file changed, 31 insertions(+), 3 deletions(-) diff --git "a/problems/0090.\345\255\220\351\233\206II.md" "b/problems/0090.\345\255\220\351\233\206II.md" index 5df479869f..a02161aa92 100644 --- "a/problems/0090.\345\255\220\351\233\206II.md" +++ "b/problems/0090.\345\255\220\351\233\206II.md" @@ -440,7 +440,7 @@ impl Solution { let len = nums.len(); // if start_index >= len { return; } for i in start_index..len { - if i > 0 && nums[i] == nums[i - 1] && used[i - 1] == false { continue; } + if i > 0 && nums[i] == nums[i - 1] && !used[i - 1] { continue; } path.push(nums[i]); used[i] = true; Self::backtracking(result, path, nums, i + 1, used); @@ -449,11 +449,10 @@ impl Solution { } } - pub fn subsets_with_dup(nums: Vec) -> Vec> { + pub fn subsets_with_dup(mut nums: Vec) -> Vec> { let mut result: Vec> = Vec::new(); let mut path: Vec = Vec::new(); let mut used = vec![false; nums.len()]; - let mut nums = nums; nums.sort(); Self::backtracking(&mut result, &mut path, &nums, 0, &mut used); result @@ -461,6 +460,35 @@ impl Solution { } ``` +set 去重版本 + +```rust +use std::collections::HashSet; +impl Solution { + pub fn subsets_with_dup(mut nums: Vec) -> Vec> { + let mut res = HashSet::new(); + let mut path = vec![]; + nums.sort(); + Self::backtracking(&nums, &mut path, &mut res, 0); + res.into_iter().collect() + } + + pub fn backtracking( + nums: &Vec, + path: &mut Vec, + res: &mut HashSet>, + start_index: usize, + ) { + res.insert(path.clone()); + for i in start_index..nums.len() { + path.push(nums[i]); + Self::backtracking(nums, path, res, i + 1); + path.pop(); + } + } +} +``` + ### C ```c From 42abe9d51fc8cc9feffb73e1d4d8308e22cca18b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8A=B1=E6=97=A0=E7=BC=BA?= Date: Wed, 22 Feb 2023 23:43:25 +0800 Subject: [PATCH 1504/3019] =?UTF-8?q?=E7=BA=A0=E6=AD=A30203.=E7=A7=BB?= =?UTF-8?q?=E9=99=A4=E9=93=BE=E8=A1=A8=E5=85=83=E7=B4=A0.md=E6=96=87?= =?UTF-8?q?=E6=A1=A3=E4=B8=AD=E6=B1=89=E5=AD=97=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" "b/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" index 01a6d891cc..883876673f 100644 --- "a/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" +++ "b/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" @@ -5,7 +5,7 @@

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

-> 链表操作中,可以使用原链表来直接进行删除操作,也可以设置一个虚拟头结点在进行删除操作,接下来看一看哪种方式更方便。 +> 链表操作中,可以使用原链表来直接进行删除操作,也可以设置一个虚拟头结点再进行删除操作,接下来看一看哪种方式更方便。 # 203.移除链表元素 From e7bc3d3a7ee984f40153a270d0d42d461d5d2136 Mon Sep 17 00:00:00 2001 From: Logen <47022821+Logenleedev@users.noreply.github.com> Date: Wed, 22 Feb 2023 20:07:09 -0600 Subject: [PATCH 1505/3019] =?UTF-8?q?add=20python=E7=AE=97=E6=B3=95?= =?UTF-8?q?=E6=A8=A1=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...27\346\263\225\346\250\241\346\235\277.md" | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git "a/problems/\347\256\227\346\263\225\346\250\241\346\235\277.md" "b/problems/\347\256\227\346\263\225\346\250\241\346\235\277.md" index 24d3e6bdae..59de69dfd7 100644 --- "a/problems/\347\256\227\346\263\225\346\250\241\346\235\277.md" +++ "b/problems/\347\256\227\346\263\225\346\250\241\346\235\277.md" @@ -803,6 +803,46 @@ Java: Python: +## 二分查找法 +```python +def binarysearch(nums, target): + low = 0 + high = len(nums) - 1 + while (low <= high): + mid = (high + low)//2 + + if (nums[mid] < target): + low = mid + 1 + + if (nums[mid] > target): + high = mid - 1 + + if (nums[mid] == target): + return mid + + return -1 +``` + +## KMP + +```python +def kmp(self, a, s): + # a: length of the array + # s: string + + next = [0]*a + j = 0 + next[0] = 0 + + for i in range(1, len(s)): + while j > 0 and s[j] != s[i]: + j = next[j - 1] + + if s[j] == s[i]: + j += 1 + next[i] = j + return next +``` Go: From 122a8e61619cfb9600f0c05865dfee3a0ac4eeea Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Sat, 25 Feb 2023 08:43:56 +0800 Subject: [PATCH 1506/3019] Update --- ...\347\273\264dp\346\225\260\347\273\204.md" | 145 ++++++++++++++++++ ...01\350\247\204\345\210\222\357\274\211.md" | 4 +- 2 files changed, 147 insertions(+), 2 deletions(-) create mode 100644 "problems/0377.\347\273\204\345\220\210\346\200\273\345\222\214IV\344\272\214\347\273\264dp\346\225\260\347\273\204.md" diff --git "a/problems/0377.\347\273\204\345\220\210\346\200\273\345\222\214IV\344\272\214\347\273\264dp\346\225\260\347\273\204.md" "b/problems/0377.\347\273\204\345\220\210\346\200\273\345\222\214IV\344\272\214\347\273\264dp\346\225\260\347\273\204.md" new file mode 100644 index 0000000000..276329c56a --- /dev/null +++ "b/problems/0377.\347\273\204\345\220\210\346\200\273\345\222\214IV\344\272\214\347\273\264dp\346\225\260\347\273\204.md" @@ -0,0 +1,145 @@ +# 完全背包的排列问题模拟 + +#### Problem + +1. 排列问题是完全背包中十分棘手的问题。 +2. 其在迭代过程中需要先迭代背包容量,再迭代物品个数,使得其在代码理解上较难入手。 + +#### Contribution + +本文档以力扣上[组合总和IV](https://leetcode.cn/problems/combination-sum-iv/)为例,提供一个二维dp的代码例子,并提供模拟过程以便于理解 + +#### Code + +```cpp +int combinationSum4(vector& nums, int target) { + // 定义背包容量为target,物品个数为nums.size()的dp数组 + // dp[i][j]表示将第0-i个物品添加入排列中,和为j的排列方式 + vector> dp (nums.size(), vector(target+1,0)); + + // 表示有0,1,...,n个物品可选择的情况下,和为0的选择方法为1:什么都不取 + for(int i = 0; i < nums.size(); i++) dp[i][0] = 1; + + // 必须按列遍历,因为右边数组需要知道左边数组最低部的信息(排列问题) + // 后面的模拟可以更清楚的表现这么操作的原因 + for(int i = 1; i <= target; i++){ + for(int j = 0; j < nums.size(); j++){ + // 只有nums[j]可以取的情况 + if(j == 0){ + if(nums[j] > i) dp[j][i] = 0; + // 如果背包容量放不下 那么此时没有排列方式 + else dp[j][i] = dp[nums.size()-1][i-nums[j]]; + // 如果背包容量放的下 全排列方式为dp[最底层][容量-该物品容量]排列方式后面放一个nums[j] + } + // 有多个nums数可以取 + else{ + // 如果背包容量放不下 那么沿用0-j-1个物品的排列方式 + if(nums[j] > i) dp[j][i] = dp[j-1][i]; + // 如果背包容量放得下 在dp[最底层][容量-该物品容量]排列方式后面放一个nums[j]后面放个nums[j] + // INT_MAX避免溢出 + else if(i >= nums[j] && dp[j-1][i] < INT_MAX - dp[nums.size()-1][i-nums[j]]) + dp[j][i] = dp[j-1][i] + dp[nums.size()-1][i-nums[j]]; + } + } + } + // 打印dp数组 + for(int i = 0; i < nums.size(); i++){ + for(int j = 0; j <= target; j++){ + cout< Date: Sat, 25 Feb 2023 14:24:27 +0800 Subject: [PATCH 1507/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200206.=E7=BF=BB?= =?UTF-8?q?=E8=BD=AC=E9=93=BE=E8=A1=A8=20=E5=8D=95=E7=BA=AF=E4=BD=BF?= =?UTF-8?q?=E7=94=A8=E8=99=9A=E6=8B=9F=E5=A4=B4=E7=BB=93=E7=82=B9=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0=E9=93=BE=E8=A1=A8=E7=BF=BB=E8=BD=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...73\350\275\254\351\223\276\350\241\250.md" | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git "a/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md" "b/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md" index 016477ae79..b87c7cba5c 100644 --- "a/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md" +++ "b/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md" @@ -682,7 +682,33 @@ public class LinkNumbers +## 使用虚拟头结点解决链表翻转 + +> 使用虚拟头结点,通过头插法实现链表的翻转(不需要栈) + +```java +// 迭代方法:增加虚头结点,使用头插法实现链表翻转 +public static ListNode reverseList1(ListNode head) { + // 创建虚头结点 + ListNode dumpyHead = new ListNode(-1); + dumpyHead.next = null; + // 遍历所有节点 + ListNode cur = head; + while(cur != null){ + ListNode temp = cur.next; + // 头插法 + cur.next = dumpyHead.next; + dumpyHead.next = cur; + cur = temp; + } + return dumpyHead.next; +} +``` + + + ## 使用栈解决反转链表的问题 + * 首先将所有的结点入栈 * 然后创建一个虚拟虚拟头结点,让cur指向虚拟头结点。然后开始循环出栈,每出来一个元素,就把它加入到以虚拟头结点为头结点的链表当中,最后返回即可。 @@ -720,3 +746,4 @@ public ListNode reverseList(ListNode head) { + From 7bd81669f2d8313513287aa1691011ef0151fb55 Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Mon, 27 Feb 2023 09:09:33 +0800 Subject: [PATCH 1508/3019] Update --- ...275\347\232\204\350\267\257\345\276\204.md" | 1 - ...231\345\222\214\346\210\277\351\227\264.md" | 18 ++++++++---------- 2 files changed, 8 insertions(+), 11 deletions(-) diff --git "a/problems/0797.\346\211\200\346\234\211\345\217\257\350\203\275\347\232\204\350\267\257\345\276\204.md" "b/problems/0797.\346\211\200\346\234\211\345\217\257\350\203\275\347\232\204\350\267\257\345\276\204.md" index 79fa5b9b45..eb3f7fb422 100644 --- "a/problems/0797.\346\211\200\346\234\211\345\217\257\350\203\275\347\232\204\350\267\257\345\276\204.md" +++ "b/problems/0797.\346\211\200\346\234\211\345\217\257\350\203\275\347\232\204\350\267\257\345\276\204.md" @@ -4,7 +4,6 @@

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

-看一下 算法4,深搜是怎么讲的 # 797.所有可能的路径 diff --git "a/problems/0841.\351\222\245\345\214\231\345\222\214\346\210\277\351\227\264.md" "b/problems/0841.\351\222\245\345\214\231\345\222\214\346\210\277\351\227\264.md" index 5556922c28..a973ab56c4 100644 --- "a/problems/0841.\351\222\245\345\214\231\345\222\214\346\210\277\351\227\264.md" +++ "b/problems/0841.\351\222\245\345\214\231\345\222\214\346\210\277\351\227\264.md" @@ -56,7 +56,7 @@ 所以本题是一个有向图搜索全路径的问题。 只能用深搜(DFS)或者广搜(BFS)来搜。 -关于DFS的理论,如果大家有困惑,可以先看我这篇题解: [DFS理论基础](https://leetcode.cn/problems/all-paths-from-source-to-target/solution/by-carlsun-2-66pf) +关于DFS的理论,如果大家有困惑,可以先看我这篇题解: [DFS理论基础](https://programmercarl.com/%E5%9B%BE%E8%AE%BA%E6%B7%B1%E6%90%9C%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html) **以下dfs分析 大家一定要仔细看,本题有两种dfs的解法,很多题解没有讲清楚**。 看完之后 相信你对dfs会有更深的理解。 @@ -84,9 +84,9 @@ void dfs(const vector>& rooms, int key, vector& visited) { 这决定 终止条件怎么写。 -首先明确,本题中什么叫做处理,就是 visited数组来记录访问过的节点,那么把该节点默认 数组里元素都是false,把元素标记为true就是处理 本节点了。 +首先明确,本题中什么叫做处理,就是 visited数组来记录访问过的节点,该节点默认 数组里元素都是false,把元素标记为true就是处理 本节点了。 -如果我们是处理当前访问的节点,当前访问的节点如果是 true ,说明是访问过的节点,那就终止本层递归,如果不是true,我们就把它赋值为true,因为我们处理本层递归的节点。 +如果我们是处理当前访问的节点,当前访问的节点如果是 true ,说明是访问过的节点,那就终止本层递归,如果不是true,我们就把它赋值为true,因为这是我们处理本层递归的节点。 代码就是这样: @@ -105,7 +105,7 @@ void dfs(const vector>& rooms, int key, vector& visited) { } ``` -如果我们是处理下一层访问的节点,而不是当前层。那么就要在 深搜三部曲中第三步:处理目前搜索节点出发的路径 的时候对 节点进行处理。 +如果我们是处理下一层访问的节点,而不是当前层。那么就要在 深搜三部曲中第三步:处理目前搜索节点出发的路径的时候对 节点进行处理。 这样的话,就不需要终止条件,而是在 搜索下一个节点的时候,直接判断 下一个节点是否是我们要搜的节点。 @@ -125,7 +125,7 @@ void dfs(const vector>& rooms, int key, vector& visited) { } ``` -可以看出,如果看待 我们要访问的节点,直接决定了两种不一样的写法,很多同学对这一块很模糊,其实做过这道题,也没有思考到这个维度上。 +可以看出,如果看待 我们要访问的节点,直接决定了两种不一样的写法,很多录友对这一块很模糊,可能做过这道题,但没有思考到这个维度上。 3. 处理目前搜索节点出发的路径 @@ -136,7 +136,7 @@ void dfs(const vector>& rooms, int key, vector& visited) { 看上面两个版本的写法中, 好像没有发现回溯的逻辑。 -我们都知道,有递归就有回溯,回溯就在递归函数的下面, 那么之前我们做的dfs题目,都需要回溯操作,例如:[797.所有可能的路径](https://leetcode.cn/problems/all-paths-from-source-to-target/solution/by-carlsun-2-66pf/), **为什么本题就没有回溯呢?** +我们都知道,有递归就有回溯,回溯就在递归函数的下面, 那么之前我们做的dfs题目,都需要回溯操作,例如:[797.所有可能的路径](https://programmercarl.com/0797.%E6%89%80%E6%9C%89%E5%8F%AF%E8%83%BD%E7%9A%84%E8%B7%AF%E5%BE%84.html), **为什么本题就没有回溯呢?** 代码中可以看到dfs函数下面并没有回溯的操作。 @@ -144,7 +144,7 @@ void dfs(const vector>& rooms, int key, vector& visited) { **那什么时候需要回溯操作呢?** -当我们需要搜索一条可行路径的时候,就需要回溯操作了,因为没有回溯,就没法“调头”, 如果不理解的话,去看我写的 [797.所有可能的路径](https://leetcode.cn/problems/all-paths-from-source-to-target/solution/by-carlsun-2-66pf/) 的题解。 +当我们需要搜索一条可行路径的时候,就需要回溯操作了,因为没有回溯,就没法“调头”, 如果不理解的话,去看我写的 [797.所有可能的路径](https://programmercarl.com/0797.%E6%89%80%E6%9C%89%E5%8F%AF%E8%83%BD%E7%9A%84%E8%B7%AF%E5%BE%84.html) 的题解。 以上分析完毕,DFS整体实现C++代码如下: @@ -206,7 +206,7 @@ public: ``` -本题我也给出 BFS C++代码,至于BFS,我后面会有单独文章来讲,代码如下: +本题我也给出 BFS C++代码,[BFS理论基础](https://programmercarl.com/%E5%9B%BE%E8%AE%BA%E6%B7%B1%E6%90%9C%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html),代码如下: ```CPP class Solution { @@ -241,8 +241,6 @@ public: }; ``` - - ## 其他语言版本 ### Java From 6043be28ff4692d8bee1218f62b92fca5175d739 Mon Sep 17 00:00:00 2001 From: Jeremy Feng <44312563+jeremy-feng@users.noreply.github.com> Date: Mon, 27 Feb 2023 10:35:47 +0800 Subject: [PATCH 1509/3019] =?UTF-8?q?Update=200001.=E4=B8=A4=E6=95=B0?= =?UTF-8?q?=E4=B9=8B=E5=92=8C.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修改 Typo --- .../0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" "b/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" index 2d3d6ea33a..a0acdcbe0e 100644 --- "a/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" @@ -79,7 +79,7 @@ map目的用来存放我们访问过的元素,因为遍历数组的时候, 所以 map中的存储结构为 {key:数据元素,value:数组元素对应的下标}。 -在遍历数组的时候,只需要向map去查询是否有和目前遍历元素比配的数值,如果有,就找到的匹配对,如果没有,就把目前遍历的元素放进map中,因为map存放的就是我们访问过的元素。 +在遍历数组的时候,只需要向map去查询是否有和目前遍历元素匹配的数值,如果有,就找到的匹配对,如果没有,就把目前遍历的元素放进map中,因为map存放的就是我们访问过的元素。 过程如下: From 94d4af7d916c0770d6824898efc7b017b91d5041 Mon Sep 17 00:00:00 2001 From: roylx <73628821+roylx@users.noreply.github.com> Date: Mon, 27 Feb 2023 13:51:47 -0700 Subject: [PATCH 1510/3019] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E4=BA=86python?= =?UTF-8?q?=E7=89=88=E6=9C=AC=E7=9A=84=E7=A9=BA=E9=97=B4=E5=A4=8D=E6=9D=82?= =?UTF-8?q?=E5=BA=A6=E7=9A=84=E6=8F=8F=E8=BF=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...0\221\344\270\255\347\232\204\344\274\227\346\225\260.md" | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git "a/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" "b/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" index cb14fb14bf..4214e232cd 100644 --- "a/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" +++ "b/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" @@ -476,6 +476,7 @@ class Solution { ## Python > 递归法 +> 常量空间,递归产生的栈不算 ```python # Definition for a binary tree node. @@ -521,7 +522,9 @@ class Solution: ``` -> 迭代法-中序遍历-不使用额外空间,利用二叉搜索树特性 +> 迭代法-中序遍历 +> 利用二叉搜索树特性,在历遍过程中更新结果,一次历遍 +> 但需要使用额外空间存储历遍的节点 ```python class Solution: def findMode(self, root: TreeNode) -> List[int]: From 6d23362f95d718d05730bcca8857fdc99c89adbe Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Thu, 2 Mar 2023 10:01:15 +0800 Subject: [PATCH 1511/3019] Update --- ...36\204\351\200\240\344\272\214\345\217\211\346\240\221.md" | 4 ++-- ...03\275\345\234\250\350\277\231\351\207\214\357\274\201.md" | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git "a/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" "b/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" index c2b2872b6c..9c563619da 100644 --- "a/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" @@ -21,8 +21,8 @@ 例如,给出 -中序遍历 inorder = [9,3,15,20,7] -后序遍历 postorder = [9,15,7,20,3] +* 中序遍历 inorder = [9,3,15,20,7] +* 后序遍历 postorder = [9,15,7,20,3] 返回如下的二叉树: ![106. 从中序与后序遍历序列构造二叉树1](https://img-blog.csdnimg.cn/20210203154316774.png) diff --git "a/problems/\345\211\215\345\272\217/\345\205\263\344\272\216\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\214\344\275\240\344\270\215\347\237\245\351\201\223\347\232\204\351\203\275\345\234\250\350\277\231\351\207\214\357\274\201.md" "b/problems/\345\211\215\345\272\217/\345\205\263\344\272\216\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\214\344\275\240\344\270\215\347\237\245\351\201\223\347\232\204\351\203\275\345\234\250\350\277\231\351\207\214\357\274\201.md" index f19984e66b..72cfab542c 100644 --- "a/problems/\345\211\215\345\272\217/\345\205\263\344\272\216\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\214\344\275\240\344\270\215\347\237\245\351\201\223\347\232\204\351\203\275\345\234\250\350\277\231\351\207\214\357\274\201.md" +++ "b/problems/\345\211\215\345\272\217/\345\205\263\344\272\216\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\214\344\275\240\344\270\215\347\237\245\351\201\223\347\232\204\351\203\275\345\234\250\350\277\231\351\207\214\357\274\201.md" @@ -63,7 +63,7 @@ **所以我们说的时间复杂度都是省略常数项系数的,是因为一般情况下都是默认数据规模足够的大,基于这样的事实,给出的算法时间复杂的的一个排行如下所示**: -O(1)常数阶 < O(logn)对数阶 < O(n)线性阶 < O(n^2)平方阶 < O(n^3)立方阶 < O(2^n)指数阶 +O(1)常数阶 < O(logn)对数阶 < O(n)线性阶 < O(nlogn)线性对数阶 < O(n^2)平方阶 < O(n^3)立方阶 < O(2^n)指数阶 但是也要注意大常数,如果这个常数非常大,例如10^7 ,10^9 ,那么常数就是不得不考虑的因素了。 From 7a4057066a52a68b60e1c19670a5f21b5ffa716c Mon Sep 17 00:00:00 2001 From: StriveDD Date: Thu, 2 Mar 2023 11:15:07 +0800 Subject: [PATCH 1512/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0841.=E9=92=A5?= =?UTF-8?q?=E5=8C=99=E5=92=8C=E6=88=BF=E9=97=B4=E7=9A=84Java=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E7=9A=84BFS=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...31\345\222\214\346\210\277\351\227\264.md" | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git "a/problems/0841.\351\222\245\345\214\231\345\222\214\346\210\277\351\227\264.md" "b/problems/0841.\351\222\245\345\214\231\345\222\214\346\210\277\351\227\264.md" index a973ab56c4..00263cac9a 100644 --- "a/problems/0841.\351\222\245\345\214\231\345\222\214\346\210\277\351\227\264.md" +++ "b/problems/0841.\351\222\245\345\214\231\345\222\214\346\210\277\351\227\264.md" @@ -273,6 +273,48 @@ class Solution { return true; } } + +// 广度优先搜索 +class Solution { + public boolean canVisitAllRooms(List> rooms) { + boolean[] visited = new boolean[rooms.size()]; // 用一个 visited 数据记录房间是否被访问 + visited[0] = true; + Queue queue = new ArrayDeque<>(); + queue.add(0); // 第 0 个房间标记为已访问 + while (!queue.isEmpty()) { + int curKey = queue.poll(); + for (int key: rooms.get(curKey)) { + if (visited[key]) continue; + visited[key] = true; + queue.add(key); + } + } + for (boolean key: visited) + if (!key) return false; + return true; + } +} + +// 广度优先遍历(时间优化) +class Solution { + public boolean canVisitAllRooms(List> rooms) { + int count = 1; // 用来记录可以被访问的房间数目,因为初始状态下 0 号房间可以被访问,所以置为 1 + boolean[] visited = new boolean[rooms.size()]; // 用一个 visited 数据记录房间是否被访问 + visited[0] = true; // 第 0 个房间标记为已访问 + Queue queue = new ArrayDeque<>(); + queue.add(0); + while (!queue.isEmpty()) { + int curKey = queue.poll(); + for (int key: rooms.get(curKey)) { + if (visited[key]) continue; + ++count; // 每访问一个访问房间就让 count 加 1 + visited[key] = true; + queue.add(key); + } + } + return count == rooms.size(); // 如果 count 等于房间数目,表示能进入所有房间,反之不能 + } +} ``` ### python3 @@ -417,3 +459,4 @@ function canVisitAllRooms(rooms: number[][]): boolean { + From 5dd403e69ab53c363799e0182e6443e2fde99d7a Mon Sep 17 00:00:00 2001 From: StriveDD Date: Thu, 2 Mar 2023 11:21:03 +0800 Subject: [PATCH 1513/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0127.=20=E5=8D=95?= =?UTF-8?q?=E8=AF=8D=E6=8E=A5=E9=BE=99=E7=9A=84Java=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E7=9A=84=E5=8F=8C=E5=90=91BFS=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...25\350\257\215\346\216\245\351\276\231.md" | 67 ++++++++++++++++++- 1 file changed, 66 insertions(+), 1 deletion(-) diff --git "a/problems/0127.\345\215\225\350\257\215\346\216\245\351\276\231.md" "b/problems/0127.\345\215\225\350\257\215\346\216\245\351\276\231.md" index 7ffd6a21e6..b4078913f2 100644 --- "a/problems/0127.\345\215\225\350\257\215\346\216\245\351\276\231.md" +++ "b/problems/0127.\345\215\225\350\257\215\346\216\245\351\276\231.md" @@ -16,7 +16,7 @@ * 转换过程中的中间单词必须是字典 wordList 中的单词。 * 给你两个单词 beginWord 和 endWord 和一个字典 wordList ,找到从 beginWord 到 endWord 的 最短转换序列 中的 单词数目 。如果不存在这样的转换序列,返回 0。 -  + 示例 1: * 输入:beginWord = "hit", endWord = "cog", wordList = ["hot","dot","dog","lot","log","cog"] @@ -134,7 +134,71 @@ public int ladderLength(String beginWord, String endWord, List wordList) } ``` +## Java 双向BFS + +```java +class Solution { + // 判断单词之间是否之差了一个字母 + public boolean isValid(String currentWord, String chooseWord) { + int count = 0; + for (int i = 0; i < currentWord.length(); i++) + if (currentWord.charAt(i) != chooseWord.charAt(i)) ++count; + return count == 1; + } + + public int ladderLength(String beginWord, String endWord, List wordList) { + if (!wordList.contains(endWord)) return 0; // 如果 endWord 不在 wordList 中,那么无法成功转换,返回 0 + + // ansLeft 记录从 beginWord 开始 BFS 时能组成的单词数目 + // ansRight 记录从 endWord 开始 BFS 时能组成的单词数目 + int ansLeft = 0, ansRight = 0; + + // queueLeft 表示从 beginWord 开始 BFS 时使用的队列 + // queueRight 表示从 endWord 开始 BFS 时使用的队列 + Queue queueLeft = new ArrayDeque<>(), queueRight = new ArrayDeque<>(); + queueLeft.add(beginWord); + queueRight.add(endWord); + + // 从 beginWord 开始 BFS 时把遍历到的节点存入 hashSetLeft 中 + // 从 endWord 开始 BFS 时把遍历到的节点存入 hashSetRight 中 + Set hashSetLeft = new HashSet<>(), hashSetRight = new HashSet<>(); + hashSetLeft.add(beginWord); + hashSetRight.add(endWord); + + // 只要有一个队列为空,说明 beginWord 无法转换到 endWord + while (!queueLeft.isEmpty() && !queueRight.isEmpty()) { + ++ansLeft; + int size = queueLeft.size(); + for (int i = 0; i < size; i++) { + String currentWord = queueLeft.poll(); + // 只要 hashSetRight 中存在 currentWord,说明从 currentWord 可以转换到 endWord + if (hashSetRight.contains(currentWord)) return ansRight + ansLeft; + for (String chooseWord : wordList) { + if (hashSetLeft.contains(chooseWord) || !isValid(currentWord, chooseWord)) continue; + hashSetLeft.add(chooseWord); + queueLeft.add(chooseWord); + } + } + ++ansRight; + size = queueRight.size(); + for (int i = 0; i < size; i++) { + String currentWord = queueRight.poll(); + // 只要 hashSetLeft 中存在 currentWord,说明从 currentWord 可以转换到 beginWord + if (hashSetLeft.contains(currentWord)) return ansLeft + ansRight; + for (String chooseWord : wordList) { + if (hashSetRight.contains(chooseWord) || !isValid(currentWord, chooseWord)) continue; + hashSetRight.add(chooseWord); + queueRight.add(chooseWord); + } + } + } + return 0; + } +} +``` + ## Python + ``` class Solution: def ladderLength(self, beginWord: str, endWord: str, wordList: List[str]) -> int: @@ -301,3 +365,4 @@ function diffonechar(word1: string, word2: string): boolean { + From 453fa147c9adf88abc038f68d3b3f36acf696f89 Mon Sep 17 00:00:00 2001 From: StriveDD Date: Thu, 2 Mar 2023 14:44:36 +0800 Subject: [PATCH 1514/3019] =?UTF-8?q?=E5=A2=9E=E5=8A=A00827.=E6=9C=80?= =?UTF-8?q?=E5=A4=A7=E4=BA=BA=E5=B7=A5=E5=B2=9B=E7=9A=84Java=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...47\344\272\272\345\267\245\345\262\233.md" | 64 +++++++++++++++++++ 1 file changed, 64 insertions(+) diff --git "a/problems/0827.\346\234\200\345\244\247\344\272\272\345\267\245\345\262\233.md" "b/problems/0827.\346\234\200\345\244\247\344\272\272\345\267\245\345\262\233.md" index 1b49e9ee66..45b2ef5ab9 100644 --- "a/problems/0827.\346\234\200\345\244\247\344\272\272\345\267\245\345\262\233.md" +++ "b/problems/0827.\346\234\200\345\244\247\344\272\272\345\267\245\345\262\233.md" @@ -219,7 +219,71 @@ public: }; ``` +# 其他语言版本 + +## Java + +```Java +class Solution { + private static final int[][] position = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}}; // 四个方向 + + /** + * @param grid 矩阵数组 + * @param row 当前遍历的节点的行号 + * @param col 当前遍历的节点的列号 + * @param mark 当前区域的标记 + * @return 返回当前区域内 1 的数量 + */ + public int dfs(int[][] grid, int row, int col, int mark) { + int ans = 0; + grid[row][col] = mark; + for (int[] current: position) { + int curRow = row + current[0], curCol = col + current[1]; + if (curRow < 0 || curRow >= grid.length || curCol < 0 || curCol >= grid.length) continue; // 越界 + if (grid[curRow][curCol] == 1) + ans += 1 + dfs(grid, curRow, curCol, mark); + } + return ans; + } + + public int largestIsland(int[][] grid) { + int ans = Integer.MIN_VALUE, size = grid.length, mark = 2; + Map getSize = new HashMap<>(); + for (int row = 0; row < size; row++) { + for (int col = 0; col < size; col++) { + if (grid[row][col] == 1) { + int areaSize = 1 + dfs(grid, row, col, mark); + getSize.put(mark++, areaSize); + } + } + } + for (int row = 0; row < size; row++) { + for (int col = 0; col < size; col++) { + // 当前位置如果不是 0 那么直接跳过,因为我们只能把 0 变成 1 + if (grid[row][col] != 0) continue; + Set hashSet = new HashSet<>(); // 防止同一个区域被重复计算 + // 计算从当前位置开始获取的 1 的数量,初始化 1 是因为把当前位置的 0 转换成了 1 + int curSize = 1; + for (int[] current: position) { + int curRow = row + current[0], curCol = col + current[1]; + if (curRow < 0 || curRow >= grid.length || curCol < 0 || curCol >= grid.length) continue; + int curMark = grid[curRow][curCol]; // 获取对应位置的标记 + // 如果标记存在 hashSet 中说明该标记被记录过一次,如果不存在 getSize 中说明该标记是无效标记(此时 curMark = 0) + if (hashSet.contains(curMark) || !getSize.containsKey(curMark)) continue; + hashSet.add(curMark); + curSize += getSize.get(curMark); + } + ans = Math.max(ans, curSize); + } + } + // 当 ans == Integer.MIN_VALUE 说明矩阵数组中不存在 0,全都是有效区域,返回数组大小即可 + return ans == Integer.MIN_VALUE ? size * size : ans; + } +} +``` +

+ From 987bad6d74d57b065ae5aaf55196a0f790aa5d2c Mon Sep 17 00:00:00 2001 From: StriveDD Date: Thu, 2 Mar 2023 14:50:46 +0800 Subject: [PATCH 1515/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A00127.=E5=8D=95?= =?UTF-8?q?=E8=AF=8D=E6=8E=A5=E9=BE=99=E7=9A=84Java=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E5=8F=8C=E5=90=91BFS=E4=BB=A3=E7=A0=81=EF=BC=8C0827.=E6=9C=80?= =?UTF-8?q?=E5=A4=A7=E4=BA=BA=E5=B7=A5=E5=B2=9B=E7=9A=84Java=E7=89=88?= =?UTF-8?q?=E6=9C=AC=EF=BC=8C0841.=E9=92=A5=E5=8C=99=E5=92=8C=E6=88=BF?= =?UTF-8?q?=E9=97=B4=E7=9A=84Java=E7=89=88=E6=9C=AC=E7=9A=84BFS=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...0127.\345\215\225\350\257\215\346\216\245\351\276\231.md" | 3 +-- ...2\245\345\214\231\345\222\214\346\210\277\351\227\264.md" | 5 ++++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git "a/problems/0127.\345\215\225\350\257\215\346\216\245\351\276\231.md" "b/problems/0127.\345\215\225\350\257\215\346\216\245\351\276\231.md" index b4078913f2..20ad518295 100644 --- "a/problems/0127.\345\215\225\350\257\215\346\216\245\351\276\231.md" +++ "b/problems/0127.\345\215\225\350\257\215\346\216\245\351\276\231.md" @@ -134,9 +134,8 @@ public int ladderLength(String beginWord, String endWord, List wordList) } ``` -## Java 双向BFS - ```java +// Java 双向BFS class Solution { // 判断单词之间是否之差了一个字母 public boolean isValid(String currentWord, String chooseWord) { diff --git "a/problems/0841.\351\222\245\345\214\231\345\222\214\346\210\277\351\227\264.md" "b/problems/0841.\351\222\245\345\214\231\345\222\214\346\210\277\351\227\264.md" index 00263cac9a..faf2b97f5d 100644 --- "a/problems/0841.\351\222\245\345\214\231\345\222\214\346\210\277\351\227\264.md" +++ "b/problems/0841.\351\222\245\345\214\231\345\222\214\346\210\277\351\227\264.md" @@ -273,7 +273,9 @@ class Solution { return true; } } +``` +```Java // 广度优先搜索 class Solution { public boolean canVisitAllRooms(List> rooms) { @@ -294,7 +296,9 @@ class Solution { return true; } } +``` +```java // 广度优先遍历(时间优化) class Solution { public boolean canVisitAllRooms(List> rooms) { @@ -459,4 +463,3 @@ function canVisitAllRooms(rooms: number[][]): boolean { - From 2a9b627a90574695b2e5689c721428e27b5f1dcc Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Fri, 3 Mar 2023 09:46:38 +0800 Subject: [PATCH 1516/3019] Update --- problems/.DS_Store | Bin 6148 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 problems/.DS_Store diff --git a/problems/.DS_Store b/problems/.DS_Store deleted file mode 100644 index 32266f382acd7b944a23d2f5f05301bbed6d4e0f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHKu}Z{15S`7Xh^TO-<^Doyn|MS!8_z;f zVC$RRxm?z$r5rK?vu`uAlgGYm1 zMLXL^w*hCgdN+$V`92QzXMC=vDCb;Xa{*8E#yp+f@nHS>C1gr@Cz5G$oj%rFb#~6y z&W3!?%%`Rbr~<0MqAP%&&6X^C)KL{s1yq4r0scN%IAbPQd32u+4DJX3j1hK*IiDrC z#tLSFl}BV?#+L$psgWaw@#TnHS(gb`9(_3($Bg?3vyl^uaqNg&x13DoQAbrk6$lmR z_{%Q$|IMGz|6!3{sRF9Nzf!=&c|Y%AOVV3go8w+<;R84uud6)PC78HYjJ4c~*Wk_& Yw>$x6f|W-^VEQBAWY9qs_)`Tw0S;+s82|tP From 54847a181cfd59d8e938aa619daf72307a50ac39 Mon Sep 17 00:00:00 2001 From: GODVvVZzz <2662446324@qq.com> Date: Fri, 3 Mar 2023 10:57:00 +0800 Subject: [PATCH 1517/3019] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E9=94=99=E5=88=AB?= =?UTF-8?q?=E5=AD=97-=E6=9F=A5=E5=88=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20210114\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20210114\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" index 039f3596df..f47925fe32 100644 --- "a/problems/\345\221\250\346\200\273\347\273\223/20210114\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" +++ "b/problems/\345\221\250\346\200\273\347\273\223/20210114\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" @@ -117,7 +117,7 @@ for (int i = 3; i <= n ; i++) { 其实可以模拟一下哈,拆分j的情况,在遍历j的过程中dp[i - j]其实都计算过了。 -例如 i= 10,j = 5,i-j = 5,如果把j查分为 2 和 3,其实在j = 2 的时候,i-j= 8 ,拆分i-j的时候就可以拆出来一个3了。 +例如 i= 10,j = 5,i-j = 5,如果把j拆分为 2 和 3,其实在j = 2 的时候,i-j= 8 ,拆分i-j的时候就可以拆出来一个3了。 **或者也可以理解j是拆分i的第一个整数**。 From 419e67ca91122f505f937e774d41bfd1a8c60246 Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Fri, 3 Mar 2023 23:26:04 +0800 Subject: [PATCH 1518/3019] =?UTF-8?q?update=200416.=E5=88=86=E5=89=B2?= =?UTF-8?q?=E7=AD=89=E5=92=8C=E5=AD=90=E9=9B=86=EF=BC=9A=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=20python=20=E4=BB=A3=E7=A0=81=E4=B8=AD=E4=B8=80=E7=BB=B4?= =?UTF-8?q?=E8=83=8C=E5=8C=85=E7=9A=84=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" "b/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" index 45dd289a21..dfb327ec1f 100644 --- "a/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" +++ "b/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" @@ -302,7 +302,7 @@ class Solution: target = sum(nums) if target % 2 == 1: return False target //= 2 - dp = [0] * (len(nums) + 1) + dp = [0] * (target + 1) for i in range(len(nums)): for j in range(target, nums[i] - 1, -1): dp[j] = max(dp[j], dp[j - nums[i]] + nums[i]) From 511381119d8228de09c2fb57a3b4c3ce0163bee5 Mon Sep 17 00:00:00 2001 From: life <13122192336@163.com> Date: Sat, 4 Mar 2023 18:30:51 +0800 Subject: [PATCH 1519/3019] =?UTF-8?q?=E9=94=99=E8=AF=AF=E5=8F=98=E9=87=8F?= =?UTF-8?q?=EF=BC=8C=E4=B8=8A=E9=9D=A2=E9=83=BD=E6=98=AFresSet=E4=B8=8B?= =?UTF-8?q?=E9=9D=A2=E5=86=99=E6=88=90=E4=BA=86setRes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...25\260\347\273\204\347\232\204\344\272\244\351\233\206.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" "b/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" index ed6a5d97c8..347d10947d 100644 --- "a/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" +++ "b/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" @@ -143,9 +143,9 @@ class Solution { return resSet.stream().mapToInt(x -> x).toArray(); //方法2:另外申请一个数组存放setRes中的元素,最后返回数组 - int[] arr = new int[setRes.size()]; + int[] arr = new int[resSet.size()]; int j = 0; - for(int i : setRes){ + for(int i : resSet){ arr[j++] = i; } From 77aef4b18badbd6e04e0d78d834af7fea2613027 Mon Sep 17 00:00:00 2001 From: fw_qaq Date: Sun, 5 Mar 2023 10:19:41 +0800 Subject: [PATCH 1520/3019] =?UTF-8?q?Update=20=E5=9B=9E=E6=BA=AF=E7=AE=97?= =?UTF-8?q?=E6=B3=95=E5=8E=BB=E9=87=8D=E9=97=AE=E9=A2=98=E7=9A=84=E5=8F=A6?= =?UTF-8?q?=E4=B8=80=E7=A7=8D=E5=86=99=E6=B3=95.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...00\347\247\215\345\206\231\346\263\225.md" | 37 +++++++++++++++++-- 1 file changed, 34 insertions(+), 3 deletions(-) diff --git "a/problems/\345\233\236\346\272\257\347\256\227\346\263\225\345\216\273\351\207\215\351\227\256\351\242\230\347\232\204\345\217\246\344\270\200\347\247\215\345\206\231\346\263\225.md" "b/problems/\345\233\236\346\272\257\347\256\227\346\263\225\345\216\273\351\207\215\351\227\256\351\242\230\347\232\204\345\217\246\344\270\200\347\247\215\345\206\231\346\263\225.md" index 7386215681..2265a89b88 100644 --- "a/problems/\345\233\236\346\272\257\347\256\227\346\263\225\345\216\273\351\207\215\351\227\256\351\242\230\347\232\204\345\217\246\344\270\200\347\247\215\345\206\231\346\263\225.md" +++ "b/problems/\345\233\236\346\272\257\347\256\227\346\263\225\345\216\273\351\207\215\351\227\256\351\242\230\347\232\204\345\217\246\344\270\200\347\247\215\345\206\231\346\263\225.md" @@ -525,10 +525,41 @@ function permuteUnique(nums: number[]): number[][] { }; ``` -Go: - - +Rust: + +**90.子集II**: + +```rust +use std::collections::HashSet; +impl Solution { + pub fn subsets_with_dup(mut nums: Vec) -> Vec> { + let mut res = vec![]; + let mut path = vec![]; + nums.sort(); + Self::backtracking(&nums, &mut path, &mut res, 0); + res + } + pub fn backtracking( + nums: &Vec, + path: &mut Vec, + res: &mut Vec>, + start_index: usize, + ) { + res.push(path.clone()); + let mut helper_set = HashSet::new(); + for i in start_index..nums.len() { + if helper_set.contains(&nums[i]) { + continue; + } + helper_set.insert(nums[i]); + path.push(nums[i]); + Self::backtracking(nums, path, res, i + 1); + path.pop(); + } + } +} +```

From a30546d0777b41eb415d056f6f15dd4cc88e878e Mon Sep 17 00:00:00 2001 From: fw_qaq Date: Sun, 5 Mar 2023 10:38:54 +0800 Subject: [PATCH 1521/3019] =?UTF-8?q?Update=20=E5=9B=9E=E6=BA=AF=E7=AE=97?= =?UTF-8?q?=E6=B3=95=E5=8E=BB=E9=87=8D=E9=97=AE=E9=A2=98=E7=9A=84=E5=8F=A6?= =?UTF-8?q?=E4=B8=80=E7=A7=8D=E5=86=99=E6=B3=95.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...00\347\247\215\345\206\231\346\263\225.md" | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git "a/problems/\345\233\236\346\272\257\347\256\227\346\263\225\345\216\273\351\207\215\351\227\256\351\242\230\347\232\204\345\217\246\344\270\200\347\247\215\345\206\231\346\263\225.md" "b/problems/\345\233\236\346\272\257\347\256\227\346\263\225\345\216\273\351\207\215\351\227\256\351\242\230\347\232\204\345\217\246\344\270\200\347\247\215\345\206\231\346\263\225.md" index 2265a89b88..08ba64dc05 100644 --- "a/problems/\345\233\236\346\272\257\347\256\227\346\263\225\345\216\273\351\207\215\351\227\256\351\242\230\347\232\204\345\217\246\344\270\200\347\247\215\345\206\231\346\263\225.md" +++ "b/problems/\345\233\236\346\272\257\347\256\227\346\263\225\345\216\273\351\207\215\351\227\256\351\242\230\347\232\204\345\217\246\344\270\200\347\247\215\345\206\231\346\263\225.md" @@ -561,6 +561,49 @@ impl Solution { } ``` +**40. 组合总和 II** + +```rust +use std::collections::HashSet; +impl Solution { + pub fn backtracking( + candidates: &Vec, + target: i32, + sum: i32, + path: &mut Vec, + res: &mut Vec>, + start_index: usize, + ) { + if sum > target { + return; + } + if sum == target { + res.push(path.clone()); + } + let mut helper_set = HashSet::new(); + for i in start_index..candidates.len() { + if sum + candidates[i] <= target { + if helper_set.contains(&candidates[i]) { + continue; + } + helper_set.insert(candidates[i]); + path.push(candidates[i]); + Self::backtracking(candidates, target, sum + candidates[i], path, res, i + 1); + path.pop(); + } + } + } + + pub fn combination_sum2(mut candidates: Vec, target: i32) -> Vec> { + let mut res = vec![]; + let mut path = vec![]; + candidates.sort(); + Self::backtracking(&candidates, target, 0, &mut path, &mut res, 0); + res + } +} +``` +

From 4a203a3787e507cd28016779df9ffbb26e745a8b Mon Sep 17 00:00:00 2001 From: fw_qaq Date: Sun, 5 Mar 2023 11:11:41 +0800 Subject: [PATCH 1522/3019] =?UTF-8?q?Update=20=E5=9B=9E=E6=BA=AF=E7=AE=97?= =?UTF-8?q?=E6=B3=95=E5=8E=BB=E9=87=8D=E9=97=AE=E9=A2=98=E7=9A=84=E5=8F=A6?= =?UTF-8?q?=E4=B8=80=E7=A7=8D=E5=86=99=E6=B3=95.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...00\347\247\215\345\206\231\346\263\225.md" | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git "a/problems/\345\233\236\346\272\257\347\256\227\346\263\225\345\216\273\351\207\215\351\227\256\351\242\230\347\232\204\345\217\246\344\270\200\347\247\215\345\206\231\346\263\225.md" "b/problems/\345\233\236\346\272\257\347\256\227\346\263\225\345\216\273\351\207\215\351\227\256\351\242\230\347\232\204\345\217\246\344\270\200\347\247\215\345\206\231\346\263\225.md" index 08ba64dc05..e60bd44abf 100644 --- "a/problems/\345\233\236\346\272\257\347\256\227\346\263\225\345\216\273\351\207\215\351\227\256\351\242\230\347\232\204\345\217\246\344\270\200\347\247\215\345\206\231\346\263\225.md" +++ "b/problems/\345\233\236\346\272\257\347\256\227\346\263\225\345\216\273\351\207\215\351\227\256\351\242\230\347\232\204\345\217\246\344\270\200\347\247\215\345\206\231\346\263\225.md" @@ -604,6 +604,44 @@ impl Solution { } ``` +**47. 全排列 II** + +```rust +use std::collections::HashSet; +impl Solution { + pub fn permute_unique(mut nums: Vec) -> Vec> { + let mut res = vec![]; + let mut path = vec![]; + let mut used = vec![false; nums.len()]; + Self::backtracking(&mut res, &mut path, &nums, &mut used); + res + } + pub fn backtracking( + res: &mut Vec>, + path: &mut Vec, + nums: &Vec, + used: &mut Vec, + ) { + if path.len() == nums.len() { + res.push(path.clone()); + return; + } + let mut helper_set = HashSet::new(); + for i in 0..nums.len() { + if used[i] || helper_set.contains(&nums[i]) { + continue; + } + helper_set.insert(nums[i]); + path.push(nums[i]); + used[i] = true; + Self::backtracking(res, path, nums, used); + used[i] = false; + path.pop(); + } + } +} +``` +

From 1d44a17aaa733ef95a7eafde6f155cb5ea1a1929 Mon Sep 17 00:00:00 2001 From: ruyubai1 <104716559+ruyubai1@users.noreply.github.com> Date: Sun, 5 Mar 2023 18:52:47 +0100 Subject: [PATCH 1523/3019] =?UTF-8?q?python=E4=B8=80=E7=BB=B4=E6=95=B0?= =?UTF-8?q?=E7=BB=84=E5=88=9D=E5=A7=8B=E5=8C=96=E9=95=BF=E5=BA=A6=E5=BA=94?= =?UTF-8?q?=E4=B8=BAtarget+1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" "b/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" index 45dd289a21..dfb327ec1f 100644 --- "a/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" +++ "b/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" @@ -302,7 +302,7 @@ class Solution: target = sum(nums) if target % 2 == 1: return False target //= 2 - dp = [0] * (len(nums) + 1) + dp = [0] * (target + 1) for i in range(len(nums)): for j in range(target, nums[i] - 1, -1): dp[j] = max(dp[j], dp[j - nums[i]] + nums[i]) From 5e08d1b8108b9c99cf1c2e8bb1ae12b5f6bcf822 Mon Sep 17 00:00:00 2001 From: ZerenZhang2022 <118794589+ZerenZhang2022@users.noreply.github.com> Date: Sun, 5 Mar 2023 16:21:15 -0500 Subject: [PATCH 1524/3019] =?UTF-8?q?Update=200019.=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E9=93=BE=E8=A1=A8=E7=9A=84=E5=80=92=E6=95=B0=E7=AC=ACN?= =?UTF-8?q?=E4=B8=AA=E8=8A=82=E7=82=B9.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修改python版本为:fast先走n+1步 (旧版本是fast走n步,然后判断fast.next!=None),这样与上面的讲解一致 --- ...5\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" "b/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" index b0641b5f08..4e4474cabd 100644 --- "a/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" +++ "b/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" @@ -129,10 +129,10 @@ class Solution: head_dummy.next = head slow, fast = head_dummy, head_dummy - while(n!=0): #fast先往前走n步 + while(n>=0): #fast先往前走n+1步 fast = fast.next n -= 1 - while(fast.next!=None): + while(fast!=None): slow = slow.next fast = fast.next #fast 走到结尾后,slow的下一个节点为倒数第N个节点 From 98a8a8b8b1c8068d1cc291b0770369318d867338 Mon Sep 17 00:00:00 2001 From: Du Zongwei <894588765@qq.com> Date: Mon, 6 Mar 2023 09:48:49 +0800 Subject: [PATCH 1525/3019] =?UTF-8?q?modified=20ACM=E4=B8=8B=E6=9E=84?= =?UTF-8?q?=E5=BB=BA=E4=BA=8C=E5=8F=89=E6=A0=91=20Python?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...4\345\273\272\344\272\214\345\217\211\346\240\221.md" | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git "a/problems/\345\211\215\345\272\217/ACM\346\250\241\345\274\217\345\246\202\344\275\225\346\236\204\345\273\272\344\272\214\345\217\211\346\240\221.md" "b/problems/\345\211\215\345\272\217/ACM\346\250\241\345\274\217\345\246\202\344\275\225\346\236\204\345\273\272\344\272\214\345\217\211\346\240\221.md" index 42bf7af0ba..b64464031f 100644 --- "a/problems/\345\211\215\345\272\217/ACM\346\250\241\345\274\217\345\246\202\344\275\225\346\236\204\345\273\272\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/\345\211\215\345\272\217/ACM\346\250\241\345\274\217\345\246\202\344\275\225\346\236\204\345\273\272\344\272\214\345\217\211\346\240\221.md" @@ -305,11 +305,12 @@ def construct_binary_tree(nums: []) -> TreeNode: Tree.append(node) if i == 0: root = node + # 直接判断2*i+2 Date: Mon, 6 Mar 2023 10:52:35 +0800 Subject: [PATCH 1526/3019] =?UTF-8?q?Update=200455.=E5=88=86=E5=8F=91?= =?UTF-8?q?=E9=A5=BC=E5=B9=B2.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...5.\345\210\206\345\217\221\351\245\274\345\271\262.md" | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git "a/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" "b/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" index 2437582cc6..63525b0394 100644 --- "a/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" +++ "b/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" @@ -219,19 +219,17 @@ func findContentChildren(g []int, s []int) int { ### Rust ```rust -pub fn find_content_children(children: Vec, cookie: Vec) -> i32 { - let mut children = children; - let mut cookies = cookie; +pub fn find_content_children(mut children: Vec, mut cookie: Vec) -> i32 { children.sort(); cookies.sort(); - let (mut child, mut cookie) = (0usize, 0usize); + let (mut child, mut cookie) = (0, 0); while child < children.len() && cookie < cookies.len() { // 优先选择最小饼干喂饱孩子 if children[child] <= cookies[cookie] { child += 1; } - cookie += 1 + cookie += 1; } child as i32 } From 2f1cd225eea3fff9f76c2054f7b3472b7ed24cfd Mon Sep 17 00:00:00 2001 From: fw_qaq Date: Mon, 6 Mar 2023 11:41:46 +0800 Subject: [PATCH 1527/3019] =?UTF-8?q?Update=200376.=E6=91=86=E5=8A=A8?= =?UTF-8?q?=E5=BA=8F=E5=88=97.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...06\345\212\250\345\272\217\345\210\227.md" | 22 +++++++++---------- 1 file changed, 10 insertions(+), 12 deletions(-) diff --git "a/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" "b/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" index efb9c6b65a..d4daccc586 100644 --- "a/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" +++ "b/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" @@ -462,21 +462,19 @@ var wiggleMaxLength = function(nums) { ```Rust impl Solution { pub fn wiggle_max_length(nums: Vec) -> i32 { - let len = nums.len() as usize; - if len <= 1 { - return len as i32; + if nums.len() == 1 { + return 1; } - let mut preDiff = 0; - let mut curDiff = 0; - let mut result = 1; - for i in 0..len-1 { - curDiff = nums[i+1] - nums[i]; - if (preDiff <= 0 && curDiff > 0) || (preDiff >= 0 && curDiff < 0) { - result += 1; - preDiff = curDiff; + let mut res = 1; + let mut pre_diff = 0; + for i in 0..nums.len() - 1 { + let cur_diff = nums[i + 1] - nums[i]; + if (pre_diff <= 0 && cur_diff > 0) || (pre_diff >= 0 && cur_diff < 0) { + res += 1; + pre_diff = cur_diff; } } - result + res } } ``` From 30b5b629a288a380f21dcda11d6f8be5d9e17f10 Mon Sep 17 00:00:00 2001 From: fw_qaq Date: Mon, 6 Mar 2023 12:24:23 +0800 Subject: [PATCH 1528/3019] =?UTF-8?q?Update=200376.=E6=91=86=E5=8A=A8?= =?UTF-8?q?=E5=BA=8F=E5=88=97.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...06\345\212\250\345\272\217\345\210\227.md" | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git "a/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" "b/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" index d4daccc586..0199d83b5d 100644 --- "a/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" +++ "b/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" @@ -479,6 +479,30 @@ impl Solution { } ``` +**动态规划** + +```rust +impl Solution { + pub fn wiggle_max_length(nums: Vec) -> i32 { + if nums.len() == 1 { + return 1; + } + let (mut down, mut up) = (1, 1); + for i in 1..nums.len() { + // i - 1 为峰顶 + if nums[i] < nums[i - 1] { + down = down.max(up + 1); + } + // i - 1 为峰谷 + if nums[i] > nums[i - 1] { + up = up.max(down + 1); + } + } + down.max(up) + } +} +``` + ### C **贪心** From 84326d9d6154626f907cddedc59d37f35acb44a6 Mon Sep 17 00:00:00 2001 From: ZerenZhang2022 <118794589+ZerenZhang2022@users.noreply.github.com> Date: Mon, 6 Mar 2023 01:35:47 -0500 Subject: [PATCH 1529/3019] =?UTF-8?q?Update=200349.=E4=B8=A4=E4=B8=AA?= =?UTF-8?q?=E6=95=B0=E7=BB=84=E7=9A=84=E4=BA=A4=E9=9B=86.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 加入python使用数组方法 --- ...73\204\347\232\204\344\272\244\351\233\206.md" | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git "a/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" "b/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" index 347d10947d..b7365e6e5d 100644 --- "a/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" +++ "b/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" @@ -169,6 +169,21 @@ class Solution: val_dict[num] = 0 return ans + +class Solution: # 使用数组方法 + def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]: + count1 = [0]*1001 + count2 = [0]*1001 + result = [] + for i in range(len(nums1)): + count1[nums1[i]]+=1 + for j in range(len(nums2)): + count2[nums2[j]]+=1 + for k in range(1001): + if count1[k]*count2[k]>0: + result.append(k) + return result + ``` From 3a16650abe53b59bb9ab99c931993ef1f253d22c Mon Sep 17 00:00:00 2001 From: ZerenZhang2022 <118794589+ZerenZhang2022@users.noreply.github.com> Date: Mon, 6 Mar 2023 01:49:19 -0500 Subject: [PATCH 1530/3019] =?UTF-8?q?Update=200202.=E5=BF=AB=E4=B9=90?= =?UTF-8?q?=E6=95=B0.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit python的另一种写法 - 通过字符串来计算各位平方和 --- .../0202.\345\277\253\344\271\220\346\225\260.md" | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git "a/problems/0202.\345\277\253\344\271\220\346\225\260.md" "b/problems/0202.\345\277\253\344\271\220\346\225\260.md" index 1a7d53a343..2687574fdc 100644 --- "a/problems/0202.\345\277\253\344\271\220\346\225\260.md" +++ "b/problems/0202.\345\277\253\344\271\220\346\225\260.md" @@ -132,6 +132,19 @@ class Solution: else: record.add(n) +# python的另一种写法 - 通过字符串来计算各位平方和 +class Solution: + def isHappy(self, n: int) -> bool: + record = [] + while n not in record: + record.append(n) + newn = 0 + nn = str(n) + for i in nn: + newn+=int(i)**2 + if newn==1: return True + n = newn + return False ``` Go: From 3bc935ccc716f316040e0da5f5370cfcc6ce708c Mon Sep 17 00:00:00 2001 From: StriveDD Date: Mon, 6 Mar 2023 16:32:25 +0800 Subject: [PATCH 1531/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A00130.=E8=A2=AB?= =?UTF-8?q?=E5=9B=B4=E7=BB=95=E7=9A=84=E5=8C=BA=E5=9F=9F=E7=9A=84Java?= =?UTF-8?q?=E7=89=88=E6=9C=AC=E7=9A=84=20BFS=E3=80=81DFS=20=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=EF=BC=8C0797.=E6=89=80=E6=9C=89=E5=8F=AF=E8=83=BD?= =?UTF-8?q?=E7=9A=84=E8=B7=AF=E5=BE=84=E7=9A=84Java=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E7=9A=84=20DFS=20=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...25\347\232\204\345\214\272\345\237\237.md" | 214 ++++++++++++++++++ ...75\347\232\204\350\267\257\345\276\204.md" | 30 +++ 2 files changed, 244 insertions(+) diff --git "a/problems/0130.\350\242\253\345\233\264\347\273\225\347\232\204\345\214\272\345\237\237.md" "b/problems/0130.\350\242\253\345\233\264\347\273\225\347\232\204\345\214\272\345\237\237.md" index c2aa569693..7afa71b40f 100644 --- "a/problems/0130.\350\242\253\345\233\264\347\273\225\347\232\204\345\214\272\345\237\237.md" +++ "b/problems/0130.\350\242\253\345\233\264\347\273\225\347\232\204\345\214\272\345\237\237.md" @@ -84,7 +84,221 @@ public: ## 其他语言版本 +### Java + +```Java +// 广度优先遍历 +// 使用 visited 数组进行标记 +class Solution { + private static final int[][] position = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}}; // 四个方向 + + public void solve(char[][] board) { + // rowSize:行的长度,colSize:列的长度 + int rowSize = board.length, colSize = board[0].length; + boolean[][] visited = new boolean[rowSize][colSize]; + Queue queue = new ArrayDeque<>(); + // 从左侧边,和右侧边遍历 + for (int row = 0; row < rowSize; row++) { + if (board[row][0] == 'O') { + visited[row][0] = true; + queue.add(new int[]{row, 0}); + } + if (board[row][colSize - 1] == 'O') { + visited[row][colSize - 1] = true; + queue.add(new int[]{row, colSize - 1}); + } + } + // 从上边和下边遍历,在对左侧边和右侧边遍历时我们已经遍历了矩阵的四个角 + // 所以在遍历上边和下边时可以不用遍历四个角 + for (int col = 1; col < colSize - 1; col++) { + if (board[0][col] == 'O') { + visited[0][col] = true; + queue.add(new int[]{0, col}); + } + if (board[rowSize - 1][col] == 'O') { + visited[rowSize - 1][col] = true; + queue.add(new int[]{rowSize - 1, col}); + } + } + // 广度优先遍历,把没有被 'X' 包围的 'O' 进行标记 + while (!queue.isEmpty()) { + int[] current = queue.poll(); + for (int[] pos: position) { + int row = current[0] + pos[0], col = current[1] + pos[1]; + // 如果范围越界、位置已被访问过、该位置的值不是 'O',就直接跳过 + if (row < 0 || row >= rowSize || col < 0 || col >= colSize) continue; + if (visited[row][col] || board[row][col] != 'O') continue; + visited[row][col] = true; + queue.add(new int[]{row, col}); + } + } + // 遍历数组,把没有被标记的 'O' 修改成 'X' + for (int row = 0; row < rowSize; row++) { + for (int col = 0; col < colSize; col++) { + if (board[row][col] == 'O' && !visited[row][col]) board[row][col] = 'X'; + } + } + } +} +``` +```Java +// 广度优先遍历 +// 直接修改 board 的值为其他特殊值 +class Solution { + private static final int[][] position = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}}; // 四个方向 + + public void solve(char[][] board) { + // rowSize:行的长度,colSize:列的长度 + int rowSize = board.length, colSize = board[0].length; + Queue queue = new ArrayDeque<>(); + // 从左侧边,和右侧边遍历 + for (int row = 0; row < rowSize; row++) { + if (board[row][0] == 'O') + queue.add(new int[]{row, 0}); + if (board[row][colSize - 1] == 'O') + queue.add(new int[]{row, colSize - 1}); + } + // 从上边和下边遍历,在对左侧边和右侧边遍历时我们已经遍历了矩阵的四个角 + // 所以在遍历上边和下边时可以不用遍历四个角 + for (int col = 1; col < colSize - 1; col++) { + if (board[0][col] == 'O') + queue.add(new int[]{0, col}); + if (board[rowSize - 1][col] == 'O') + queue.add(new int[]{rowSize - 1, col}); + } + // 广度优先遍历,把没有被 'X' 包围的 'O' 修改成特殊值 + while (!queue.isEmpty()) { + int[] current = queue.poll(); + board[current[0]][current[1]] = 'A'; + for (int[] pos: position) { + int row = current[0] + pos[0], col = current[1] + pos[1]; + // 如果范围越界、该位置的值不是 'O',就直接跳过 + if (row < 0 || row >= rowSize || col < 0 || col >= colSize) continue; + if (board[row][col] != 'O') continue; + queue.add(new int[]{row, col}); + } + } + // 遍历数组,把 'O' 修改成 'X',特殊值修改成 'O' + for (int row = 0; row < rowSize; row++) { + for (int col = 0; col < colSize; col++) { + if (board[row][col] == 'A') board[row][col] = 'O'; + else if (board[row][col] == 'O') board[row][col] = 'X'; + } + } + } +} +``` +```Java +// 深度优先遍历 +// 使用 visited 数组进行标记 +class Solution { + private static final int[][] position = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}}; // 四个方向 + + public void dfs(char[][] board, int row, int col, boolean[][] visited) { + for (int[] pos: position) { + int nextRow = row + pos[0], nextCol = col + pos[1]; + // 位置越界 + if (nextRow < 0 || nextRow >= board.length || nextCol < 0 || nextCol >= board[0].length) + continue; + // 位置已被访问过、新位置值不是 'O' + if (visited[nextRow][nextCol] || board[nextRow][nextCol] != 'O') continue; + visited[nextRow][nextCol] = true; + dfs(board, nextRow, nextCol, visited); + } + } + + public void solve(char[][] board) { + int rowSize = board.length, colSize = board[0].length; + boolean[][] visited = new boolean[rowSize][colSize]; + // 从左侧遍、右侧遍遍历 + for (int row = 0; row < rowSize; row++) { + if (board[row][0] == 'O' && !visited[row][0]) { + visited[row][0] = true; + dfs(board, row, 0, visited); + } + if (board[row][colSize - 1] == 'O' && !visited[row][colSize - 1]) { + visited[row][colSize - 1] = true; + dfs(board, row, colSize - 1, visited); + } + } + // 从上边和下边遍历,在对左侧边和右侧边遍历时我们已经遍历了矩阵的四个角 + // 所以在遍历上边和下边时可以不用遍历四个角 + for (int col = 1; col < colSize - 1; col++) { + if (board[0][col] == 'O' && !visited[0][col]) { + visited[0][col] = true; + dfs(board, 0, col, visited); + } + if (board[rowSize - 1][col] == 'O' && !visited[rowSize - 1][col]) { + visited[rowSize - 1][col] = true; + dfs(board, rowSize - 1, col, visited); + } + } + // 遍历数组,把没有被标记的 'O' 修改成 'X' + for (int row = 0; row < rowSize; row++) { + for (int col = 0; col < colSize; col++) { + if (board[row][col] == 'O' && !visited[row][col]) board[row][col] = 'X'; + } + } + } +} +``` +```Java +// 深度优先遍历 +// // 直接修改 board 的值为其他特殊值 +class Solution { + private static final int[][] position = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}}; // 四个方向 + + public void dfs(char[][] board, int row, int col) { + for (int[] pos: position) { + int nextRow = row + pos[0], nextCol = col + pos[1]; + // 位置越界 + if (nextRow < 0 || nextRow >= board.length || nextCol < 0 || nextCol >= board[0].length) + continue; + // 新位置值不是 'O' + if (board[nextRow][nextCol] != 'O') continue; + board[nextRow][nextCol] = 'A'; // 修改为特殊值 + dfs(board, nextRow, nextCol); + } + } + + public void solve(char[][] board) { + int rowSize = board.length, colSize = board[0].length; + // 从左侧遍、右侧遍遍历 + for (int row = 0; row < rowSize; row++) { + if (board[row][0] == 'O') { + board[row][0] = 'A'; + dfs(board, row, 0); + } + if (board[row][colSize - 1] == 'O') { + board[row][colSize - 1] = 'A'; + dfs(board, row, colSize - 1); + } + } + // 从上边和下边遍历,在对左侧边和右侧边遍历时我们已经遍历了矩阵的四个角 + // 所以在遍历上边和下边时可以不用遍历四个角 + for (int col = 1; col < colSize - 1; col++) { + if (board[0][col] == 'O') { + board[0][col] = 'A'; + dfs(board, 0, col); + } + if (board[rowSize - 1][col] == 'O') { + board[rowSize - 1][col] = 'A'; + dfs(board, rowSize - 1, col); + } + } + // 遍历数组,把 'O' 修改成 'X',特殊值修改成 'O' + for (int row = 0; row < rowSize; row++) { + for (int col = 0; col < colSize; col++) { + if (board[row][col] == 'O') board[row][col] = 'X'; + else if (board[row][col] == 'A') board[row][col] = 'O'; + } + } + } +} +``` +

+ diff --git "a/problems/0797.\346\211\200\346\234\211\345\217\257\350\203\275\347\232\204\350\267\257\345\276\204.md" "b/problems/0797.\346\211\200\346\234\211\345\217\257\350\203\275\347\232\204\350\267\257\345\276\204.md" index eb3f7fb422..89643e0490 100644 --- "a/problems/0797.\346\211\200\346\234\211\345\217\257\350\203\275\347\232\204\350\267\257\345\276\204.md" +++ "b/problems/0797.\346\211\200\346\234\211\345\217\257\350\203\275\347\232\204\350\267\257\345\276\204.md" @@ -161,6 +161,35 @@ public: ## Java +```Java +// 深度优先遍历 +class Solution { + List> ans; // 用来存放满足条件的路径 + List cnt; // 用来保存 dfs 过程中的节点值 + + public void dfs(int[][] graph, int node) { + if (node == graph.length - 1) { // 如果当前节点是 n - 1,那么就保存这条路径 + ans.add(new ArrayList<>(cnt)); + return; + } + for (int index = 0; index < graph[node].length; index++) { + int nextNode = graph[node][index]; + cnt.add(nextNode); + dfs(graph, nextNode); + cnt.remove(cnt.size() - 1); // 回溯 + } + } + + public List> allPathsSourceTarget(int[][] graph) { + ans = new ArrayList<>(); + cnt = new ArrayList<>(); + cnt.add(0); // 注意,0 号节点要加入 cnt 数组中 + dfs(graph, 0); + return ans; + } +} +``` + ## Python ```python class Solution: @@ -192,3 +221,4 @@ class Solution: + From aea8bee9543fd699068fd413167a682d6dd967a8 Mon Sep 17 00:00:00 2001 From: Logen <47022821+Logenleedev@users.noreply.github.com> Date: Mon, 6 Mar 2023 19:50:04 -0600 Subject: [PATCH 1532/3019] =?UTF-8?q?=E5=88=A0=E9=99=A4typo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "problems/0494.\347\233\256\346\240\207\345\222\214.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0494.\347\233\256\346\240\207\345\222\214.md" "b/problems/0494.\347\233\256\346\240\207\345\222\214.md" index eec4183d2f..2e3f4fee63 100644 --- "a/problems/0494.\347\233\256\346\240\207\345\222\214.md" +++ "b/problems/0494.\347\233\256\346\240\207\345\222\214.md" @@ -162,7 +162,7 @@ dp[j] 表示:填满j(包括j)这么大容积的包,有dp[j]种方法 有哪些来源可以推出dp[j]呢? -只要搞到nums[i]),凑成dp[j]就有dp[j - nums[i]] 种方法。 +只要搞到nums[i],凑成dp[j]就有dp[j - nums[i]] 种方法。 例如:dp[j],j 为5, From 202013fd817e303e14d5f43a324b55b9c9810ead Mon Sep 17 00:00:00 2001 From: Jeremy Feng <44312563+jeremy-feng@users.noreply.github.com> Date: Tue, 7 Mar 2023 17:46:03 +0800 Subject: [PATCH 1533/3019] =?UTF-8?q?Update=200070.=E7=88=AC=E6=A5=BC?= =?UTF-8?q?=E6=A2=AF.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修改错别字 --- "problems/0070.\347\210\254\346\245\274\346\242\257.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0070.\347\210\254\346\245\274\346\242\257.md" "b/problems/0070.\347\210\254\346\245\274\346\242\257.md" index 14aeef0142..d4a7881ddd 100644 --- "a/problems/0070.\347\210\254\346\245\274\346\242\257.md" +++ "b/problems/0070.\347\210\254\346\245\274\346\242\257.md" @@ -72,7 +72,7 @@ dp[i]: 爬到第i层楼梯,有dp[i]种方法 3. dp数组如何初始化 -在回顾一下dp[i]的定义:爬到第i层楼梯,有dp[i]中方法。 +再回顾一下dp[i]的定义:爬到第i层楼梯,有dp[i]中方法。 那么i为0,dp[i]应该是多少呢,这个可以有很多解释,但基本都是直接奔着答案去解释的。 From 200e14cbdedff221fe93387e709c8b349986ac60 Mon Sep 17 00:00:00 2001 From: GODVvVZzz <2662446324@qq.com> Date: Wed, 8 Mar 2023 20:07:45 +0800 Subject: [PATCH 1534/3019] =?UTF-8?q?=E4=BF=AE=E6=94=B9Java=E8=A7=A3?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...0\350\203\214\345\214\205\347\211\210\346\234\254.md" | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git "a/problems/0070.\347\210\254\346\245\274\346\242\257\345\256\214\345\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md" "b/problems/0070.\347\210\254\346\245\274\346\242\257\345\256\214\345\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md" index 3093c83325..41c2e6162d 100644 --- "a/problems/0070.\347\210\254\346\245\274\346\242\257\345\256\214\345\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md" +++ "b/problems/0070.\347\210\254\346\245\274\346\242\257\345\256\214\345\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md" @@ -128,12 +128,12 @@ Java: class Solution { public int climbStairs(int n) { int[] dp = new int[n + 1]; - int[] weight = {1,2}; + int m = 2; dp[0] = 1; - for (int i = 0; i <= n; i++) { - for (int j = 0; j < weight.length; j++) { - if (i >= weight[j]) dp[i] += dp[i - weight[j]]; + for (int i = 1; i <= n; i++) { // 遍历背包 + for (int j = 1; j <= m; j++) { //遍历物品 + if (i >= j) dp[i] += dp[i - j]; } } @@ -227,3 +227,4 @@ function climbStairs(n: number): number { + From 77eeed96bcfb0375e09d1a8f2d4e7a6afe9cd615 Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Thu, 9 Mar 2023 00:13:05 +0800 Subject: [PATCH 1535/3019] =?UTF-8?q?update=200704.=E4=BA=8C=E5=88=86?= =?UTF-8?q?=E6=9F=A5=E6=89=BE:=20=E6=B7=BB=E5=8A=A0=E5=A4=8D=E6=9D=82?= =?UTF-8?q?=E5=BA=A6=E5=88=86=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...704.\344\272\214\345\210\206\346\237\245\346\211\276.md" | 6 ++++++ 1 file changed, 6 insertions(+) diff --git "a/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" "b/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" index a02bf7a201..2d5525baa8 100644 --- "a/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" +++ "b/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" @@ -86,6 +86,9 @@ public: }; ``` +* 时间复杂度:O(log n) +* 空间复杂度:O(1) + ### 二分法第二种写法 @@ -124,6 +127,9 @@ public: } }; ``` +* 时间复杂度:O(log n) +* 空间复杂度:O(1) + ## 总结 From 337bf59ee6f703345d8e3371ec7e6ea6b8a013a5 Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Thu, 9 Mar 2023 00:20:33 +0800 Subject: [PATCH 1536/3019] =?UTF-8?q?update=200059.=E8=9E=BA=E6=97=8B?= =?UTF-8?q?=E7=9F=A9=E9=98=B5II=EF=BC=9A=E6=B7=BB=E5=8A=A0=E5=A4=8D?= =?UTF-8?q?=E6=9D=82=E5=BA=A6=E5=88=86=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" | 3 +++ 1 file changed, 3 insertions(+) diff --git "a/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" "b/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" index d9a656b9f6..b4dad9c3de 100644 --- "a/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" +++ "b/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" @@ -117,6 +117,9 @@ public: }; ``` +* 时间复杂度 O(n^2): 模拟遍历二维矩阵的时间 +* 空间复杂度 O(1) + ## 类似题目 * 54.螺旋矩阵 From 60d585f4eeb2018483b1f80b8697e9ea80ff871e Mon Sep 17 00:00:00 2001 From: dongyunpeng Date: Thu, 9 Mar 2023 01:36:30 +0800 Subject: [PATCH 1537/3019] =?UTF-8?q?=E5=AE=8C=E5=96=840707.=E8=AE=BE?= =?UTF-8?q?=E8=AE=A1=E9=93=BE=E8=A1=A8C++=E7=89=88=E6=9C=AC=EF=BC=8C?= =?UTF-8?q?=E5=9C=A8delete=E6=8C=87=E9=92=88=E4=B9=8B=E5=90=8E=E8=B5=8B?= =?UTF-8?q?=E5=80=BC=E4=B8=BAnull=EF=BC=8C=E5=9C=A8=E6=B3=A8=E9=87=8A?= =?UTF-8?q?=E4=B8=AD=20=E8=AF=B4=E6=98=8E=E4=BA=86=E9=87=8E=E6=8C=87?= =?UTF-8?q?=E9=92=88=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...707.\350\256\276\350\256\241\351\223\276\350\241\250.md" | 6 ++++++ 1 file changed, 6 insertions(+) diff --git "a/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" "b/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" index 43ed262296..de1e7eb452 100644 --- "a/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" +++ "b/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" @@ -133,6 +133,11 @@ public: LinkedNode* tmp = cur->next; cur->next = cur->next->next; delete tmp; + //delete命令指示释放了tmp指针原本所指的那部分内存, + //被delete后的指针tmp的值(地址)并非就是NULL,而是随机值。也就是被delete后, + //如果不再加上一句tmp=nullptr,tmp会成为乱指的野指针 + //如果之后的程序不小心使用了tmp,会指向难以预想的内存空间 + tmp=nullptr; _size--; } @@ -1447,3 +1452,4 @@ impl MyLinkedList { + From 4164ddbb69da491b05f201a39b7b4c6233fad929 Mon Sep 17 00:00:00 2001 From: fw_qaq Date: Fri, 10 Mar 2023 11:11:54 +0800 Subject: [PATCH 1538/3019] =?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 --- ...200\344\275\263\346\227\266\346\234\272II.md" | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" index d094da488e..a863afe7b4 100644 --- "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" +++ "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" @@ -274,6 +274,7 @@ const maxProfit = (prices) => { ### TypeScript: +贪心 ```typescript function maxProfit(prices: number[]): number { let resProfit: number = 0; @@ -284,6 +285,21 @@ function maxProfit(prices: number[]): number { }; ``` +动态规划 +```typescript +function maxProfit(prices: number[]): number { + const dp = Array(prices.length) + .fill(0) + .map(() => Array(2).fill(0)) + dp[0][0] = -prices[0] + for (let i = 1; i < prices.length; i++) { + dp[i][0] = Math.max(dp[i - 1][0], dp[i - 1][1] - prices[i]) + dp[i][1] = Math.max(dp[i - 1][1], dp[i - 1][0] + prices[i]) + } + return dp[prices.length - 1][1] +} +``` + ### Rust 贪心: From 17cb4b45c7c53cf50ba91815b0f8feb9a5aa4e5a Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Fri, 10 Mar 2023 14:02:32 +0800 Subject: [PATCH 1539/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=9B=BE=E5=BA=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...36\346\226\207\345\255\220\344\270\262.md" | 4 +- ...27\346\257\215\347\273\204\345\220\210.md" | 4 +- ...4N\344\270\252\350\212\202\347\202\271.md" | 3 +- ...10\347\232\204\346\213\254\345\217\267.md" | 9 +- ...22\345\205\245\344\275\215\347\275\256.md" | 47 +++-- ...7.\350\247\243\346\225\260\347\213\254.md" | 50 +++--- ...04\345\220\210\346\200\273\345\222\214.md" | 66 ++++--- ...\345\220\210\346\200\273\345\222\214II.md" | 4 +- ...2.\346\216\245\351\233\250\346\260\264.md" | 99 +++++----- ...\350\267\203\346\270\270\346\210\217II.md" | 7 +- ...6.\345\205\250\346\216\222\345\210\227.md" | 2 +- ...\345\205\250\346\216\222\345\210\227II.md" | 32 ++-- "problems/0051.N\347\232\207\345\220\216.md" | 4 +- .../0052.N\347\232\207\345\220\216II.md" | 4 +- ...01\350\247\204\345\210\222\357\274\211.md" | 2 +- ...72\346\227\213\347\237\251\351\230\265.md" | 3 +- ...63\350\267\203\346\270\270\346\210\217.md" | 3 +- ...10\345\271\266\345\214\272\351\227\264.md" | 2 +- ...15\345\220\214\350\267\257\345\276\204.md" | 46 +++-- ...\345\220\214\350\267\257\345\276\204II.md" | 50 +++--- ...0.\347\210\254\346\245\274\346\242\257.md" | 3 +- ...26\350\276\221\350\267\235\347\246\273.md" | 4 +- "problems/0077.\347\273\204\345\220\210.md" | 95 +++++----- ...04\345\220\210\344\274\230\345\214\226.md" | 2 +- "problems/0078.\345\255\220\351\233\206.md" | 4 +- "problems/0090.\345\255\220\351\233\206II.md" | 2 +- ...\345\216\237IP\345\234\260\345\235\200.md" | 6 +- ...11\346\220\234\347\264\242\346\240\221.md" | 22 ++- ...11\346\220\234\347\264\242\346\240\221.md" | 4 +- ...60\344\272\214\345\217\211\346\240\221.md" | 4 +- ...02\345\272\217\351\201\215\345\216\206.md" | 170 ++++++++++-------- ...00\345\244\247\346\267\261\345\272\246.md" | 8 +- ...40\344\272\214\345\217\211\346\240\221.md" | 84 ++++----- ...11\346\220\234\347\264\242\346\240\221.md" | 3 +- ...41\344\272\214\345\217\211\346\240\221.md" | 41 +++-- ...00\345\260\217\346\267\261\345\272\246.md" | 7 +- ...57\345\276\204\346\200\273\345\222\214.md" | 117 +++++++----- ...00\344\275\263\346\227\266\346\234\272.md" | 3 +- ...\344\275\263\346\227\266\346\234\272II.md" | 3 +- ...344\275\263\346\227\266\346\234\272III.md" | 3 +- ...\345\233\236\346\226\207\344\270\262II.md" | 2 +- ...06\345\217\221\347\263\226\346\236\234.md" | 6 +- ...25\350\257\215\346\213\206\345\210\206.md" | 3 +- ...\345\275\242\351\223\276\350\241\250II.md" | 19 +- ...\344\275\263\346\227\266\346\234\272IV.md" | 2 +- ...23\345\256\266\345\212\253\350\210\215.md" | 2 +- ...76\350\241\250\345\205\203\347\264\240.md" | 53 ++++-- ...73\350\275\254\351\223\276\350\241\250.md" | 3 +- ...04\345\255\220\346\225\260\347\273\204.md" | 2 +- ...\345\256\266\345\212\253\350\210\215II.md" | 6 +- ...345\220\210\346\200\273\345\222\214III.md" | 21 ++- ...02\347\202\271\344\270\252\346\225\260.md" | 6 +- ...54\344\272\214\345\217\211\346\240\221.md" | 6 +- ...54\345\205\261\347\245\226\345\205\210.md" | 3 +- ...54\345\205\261\347\245\226\345\205\210.md" | 9 +- ...00\346\234\211\350\267\257\345\276\204.md" | 4 +- ...50\345\271\263\346\226\271\346\225\260.md" | 3 +- ...07\345\255\220\345\272\217\345\210\227.md" | 2 +- ...53\345\206\267\345\206\273\346\234\237.md" | 5 +- ...66\351\222\261\345\205\221\346\215\242.md" | 2 +- ...11\346\216\222\350\241\214\347\250\213.md" | 6 +- ...345\256\266\345\212\253\350\210\215III.md" | 3 +- ...64\346\225\260\346\213\206\345\210\206.md" | 2 +- ...04\347\232\204\344\272\244\351\233\206.md" | 2 +- ...06\345\212\250\345\272\217\345\210\227.md" | 4 +- ...10\346\200\273\345\222\214\342\205\243.md" | 2 +- ...55\345\255\220\345\272\217\345\210\227.md" | 9 +- ...66\345\255\220\344\271\213\345\222\214.md" | 6 +- ...15\345\273\272\351\230\237\345\210\227.md" | 2 +- ...11\345\222\214\345\255\220\351\233\206.md" | 3 +- ...55\347\232\204\350\212\202\347\202\271.md" | 3 +- ...25\347\210\206\346\260\224\347\220\203.md" | 2 +- ...4.\344\270\200\345\222\214\351\233\266.md" | 5 +- ...36\345\255\220\345\272\217\345\210\227.md" | 7 +- ...4.\347\233\256\346\240\207\345\222\214.md" | 2 +- ...55\347\232\204\344\274\227\346\225\260.md" | 4 +- ...13\350\247\222\347\232\204\345\200\274.md" | 5 +- ...07\345\255\220\345\272\217\345\210\227.md" | 20 ++- ...\351\222\261\345\205\221\346\215\242II.md" | 2 +- ...17\347\273\235\345\257\271\345\267\256.md" | 4 +- ...72\347\264\257\345\212\240\346\240\221.md" | 6 +- ...40\351\231\244\346\223\215\344\275\234.md" | 2 +- ...66\344\272\214\345\217\211\346\240\221.md" | 2 +- ...36\346\226\207\345\255\220\344\270\262.md" | 4 +- ...47\344\272\214\345\217\211\346\240\221.md" | 2 +- ...11\346\220\234\347\264\242\346\240\221.md" | 35 ++-- ...27\347\232\204\344\270\252\346\225\260.md" | 2 +- ...22\345\242\236\345\272\217\345\210\227.md" | 3 +- ...55\347\232\204\346\220\234\347\264\242.md" | 5 +- ...22\345\205\245\346\223\215\344\275\234.md" | 3 +- ...14\345\210\206\346\237\245\346\211\276.md" | 5 +- ...76\350\256\241\351\223\276\350\241\250.md" | 6 +- ...15\345\255\220\346\225\260\347\273\204.md" | 6 +- ...17\346\227\245\346\270\251\345\272\246.md" | 90 +++++----- ...27\346\257\215\345\214\272\351\227\264.md" | 3 +- ...47\344\272\214\345\217\211\346\240\221.md" | 57 +++--- ...70\344\272\244\347\232\204\347\272\277.md" | 3 +- ...\347\232\204\351\207\215\351\207\217II.md" | 2 +- ...61\345\255\220\345\272\217\345\210\227.md" | 5 +- ...57\345\244\232\345\244\247\357\274\237.md" | 15 +- ...06\350\256\272\345\237\272\347\241\200.md" | 40 +++-- ...55\344\273\243\351\201\215\345\216\206.md" | 2 +- ...50\350\277\231\351\207\214\357\274\201.md" | 6 +- ...57\345\244\232\345\244\247\357\274\237.md" | 14 +- ...43\347\240\201\351\243\216\346\240\274.md" | 2 +- ...50\350\277\231\351\207\214\357\274\201.md" | 6 +- ...10\350\200\227\344\271\210\357\274\237.md" | 12 +- ...17\345\221\230\347\256\200\345\216\206.md" | 2 +- ...02\345\272\246\345\210\206\346\236\220.md" | 9 +- ...15\346\235\202\345\272\246\357\274\201.md" | 4 +- ...50\346\234\253\346\200\273\347\273\223.md" | 2 +- ...50\346\234\253\346\200\273\347\273\223.md" | 11 +- ...50\346\234\253\346\200\273\347\273\223.md" | 16 +- ...50\346\234\253\346\200\273\347\273\223.md" | 11 +- ...50\346\234\253\346\200\273\347\273\223.md" | 3 +- ...50\346\234\253\346\200\273\347\273\223.md" | 5 +- ...50\346\234\253\346\200\273\347\273\223.md" | 10 +- ...50\346\234\253\346\200\273\347\273\223.md" | 13 +- ...50\346\234\253\346\200\273\347\273\223.md" | 10 +- ...50\346\234\253\346\200\273\347\273\223.md" | 5 +- ...50\346\234\253\346\200\273\347\273\223.md" | 13 +- ...50\346\234\253\346\200\273\347\273\223.md" | 8 +- ...06\350\256\272\345\237\272\347\241\200.md" | 34 ++-- ...36\346\272\257\346\200\273\347\273\223.md" | 86 +++++---- ...00\347\247\215\345\206\231\346\263\225.md" | 5 +- ...06\350\256\272\345\237\272\347\241\200.md" | 4 +- ...06\350\256\272\345\237\272\347\241\200.md" | 6 +- ...06\350\256\272\345\237\272\347\241\200.md" | 7 +- ...06\350\256\262\350\247\243\357\274\211.md" | 15 +- ...05\346\200\273\347\273\223\347\257\207.md" | 2 +- ...47\241\20001\350\203\214\345\214\205-1.md" | 72 ++++---- ...47\241\20001\350\203\214\345\214\205-2.md" | 2 +- ...14\345\205\250\350\203\214\345\214\205.md" | 6 +- ...06\350\256\272\345\237\272\347\241\200.md" | 21 ++- 134 files changed, 1169 insertions(+), 829 deletions(-) diff --git "a/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" "b/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" index 4d48f18458..b1987b87b3 100644 --- "a/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" +++ "b/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" @@ -108,7 +108,7 @@ dp[i][j]可以初始化为true么? 当然不行,怎能刚开始就全都匹 dp[i + 1][j - 1] 在 dp[i][j]的左下角,如图: -![647.回文子串](https://img-blog.csdnimg.cn/20210121171032473.jpg) +![647.回文子串](https://code-thinking-1253855093.file.myqcloud.com/pics/20210121171032473.jpg) 如果这矩阵是从上到下,从左到右遍历,那么会用到没有计算过的dp[i + 1][j - 1],也就是根据不确定是不是回文的区间[i+1,j-1],来判断了[i,j]是不是回文,那结果一定是不对的。 @@ -142,7 +142,7 @@ for (int i = s.size() - 1; i >= 0; i--) { // 注意遍历顺序 举例,输入:"aaa",dp[i][j]状态如下: -![647.回文子串1](https://img-blog.csdnimg.cn/20210121171059951.jpg) +![647.回文子串1](https://code-thinking-1253855093.file.myqcloud.com/pics/20210121171059951.jpg) **注意因为dp[i][j]的定义,所以j一定是大于等于i的,那么在填充dp[i][j]的时候一定是只填充右上半部分**。 diff --git "a/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" "b/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" index df038806a5..d113549716 100644 --- "a/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" +++ "b/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" @@ -13,7 +13,7 @@ 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。 -![17.电话号码的字母组合](https://img-blog.csdnimg.cn/2020102916424043.png) +![17.电话号码的字母组合](https://code-thinking-1253855093.file.myqcloud.com/pics/2020102916424043.png) 示例: * 输入:"23" @@ -66,7 +66,7 @@ const string letterMap[10] = { 例如:输入:"23",抽象为树形结构,如图所示: -![17. 电话号码的字母组合](https://img-blog.csdnimg.cn/20201123200304469.png) +![17. 电话号码的字母组合](https://code-thinking-1253855093.file.myqcloud.com/pics/20201123200304469.png) 图中可以看出遍历的深度,就是输入"23"的长度,而叶子节点就是我们要收集的结果,输出["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"]。 diff --git "a/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" "b/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" index b0641b5f08..48c6dd5de4 100644 --- "a/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" +++ "b/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" @@ -17,7 +17,8 @@ 示例 1: -![19.删除链表的倒数第N个节点](https://img-blog.csdnimg.cn/20210510085957392.png) + +![19.删除链表的倒数第N个节点](https://code-thinking-1253855093.file.myqcloud.com/pics/20210510085957392.png) 输入:head = [1,2,3,4,5], n = 2 输出:[1,2,3,5] diff --git "a/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" "b/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" index 737fab86eb..a25129c52a 100644 --- "a/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" +++ "b/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" @@ -80,14 +80,17 @@ cd a/b/c/../../ 先来分析一下 这里有三种不匹配的情况, + 1. 第一种情况,字符串里左方向的括号多余了 ,所以不匹配。 -![括号匹配1](https://img-blog.csdnimg.cn/2020080915505387.png) +![括号匹配1](https://code-thinking-1253855093.file.myqcloud.com/pics/2020080915505387.png) 2. 第二种情况,括号没有多余,但是 括号的类型没有匹配上。 -![括号匹配2](https://img-blog.csdnimg.cn/20200809155107397.png) +![括号匹配2](https://code-thinking-1253855093.file.myqcloud.com/pics/20200809155107397.png) 3. 第三种情况,字符串里右方向的括号多余了,所以不匹配。 -![括号匹配3](https://img-blog.csdnimg.cn/20200809155115779.png) +![括号匹配3](https://code-thinking-1253855093.file.myqcloud.com/pics/20200809155115779.png) + + 我们的代码只要覆盖了这三种不匹配的情况,就不会出问题,可以看出 动手之前分析好题目的重要性。 diff --git "a/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" "b/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" index 4d9ee74fb2..58340c21a1 100644 --- "a/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" +++ "b/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" @@ -1,3 +1,4 @@ +

@@ -7,6 +8,7 @@ + # 35.搜索插入位置 [力扣题目链接](https://leetcode.cn/problems/search-insert-position/) @@ -16,18 +18,22 @@ 你可以假设数组中无重复元素。 示例 1: + * 输入: [1,3,5,6], 5 * 输出: 2 -示例 2: +示例 2: + * 输入: [1,3,5,6], 2 * 输出: 1 示例 3: + * 输入: [1,3,5,6], 7 * 输出: 4 示例 4: + * 输入: [1,3,5,6], 0 * 输出: 0 @@ -37,7 +43,7 @@ 这道题目,要在数组中插入目标值,无非是这四种情况。 -![35_搜索插入位置3](https://img-blog.csdnimg.cn/20201216232148471.png) +![35_搜索插入位置3](https://code-thinking-1253855093.file.myqcloud.com/pics/20201216232148471.png) * 目标值在数组所有元素之前 * 目标值等于数组中某一个元素 @@ -78,13 +84,14 @@ public: 效率如下: -![35_搜索插入位置](https://img-blog.csdnimg.cn/20201216232127268.png) +![35_搜索插入位置](https://code-thinking-1253855093.file.myqcloud.com/pics/20201216232127268.png) ### 二分法 -既然暴力解法的时间复杂度是$O(n)$,就要尝试一下使用二分查找法。 +既然暴力解法的时间复杂度是O(n),就要尝试一下使用二分查找法。 -![35_搜索插入位置4](https://img-blog.csdnimg.cn/202012162326354.png) + +![35_搜索插入位置4](https://code-thinking-1253855093.file.myqcloud.com/pics/202012162326354.png) 大家注意这道题目的前提是数组是有序数组,这也是使用二分查找的基础条件。 @@ -94,7 +101,7 @@ public: 大体讲解一下二分法的思路,这里来举一个例子,例如在这个数组中,使用二分法寻找元素为5的位置,并返回其下标。 -![35_搜索插入位置5](https://img-blog.csdnimg.cn/20201216232659199.png) +![35_搜索插入位置5](https://code-thinking-1253855093.file.myqcloud.com/pics/20201216232659199.png) 二分查找涉及的很多的边界条件,逻辑比较简单,就是写不好。 @@ -145,7 +152,7 @@ public: * 空间复杂度:O(1) 效率如下: -![35_搜索插入位置2](https://img-blog.csdnimg.cn/2020121623272877.png) +![35_搜索插入位置2](https://code-thinking-1253855093.file.myqcloud.com/pics/2020121623272877.png) ### 二分法第二种写法 @@ -199,7 +206,7 @@ public: ## 其他语言版本 -### Java +### Java ```java class Solution { @@ -226,11 +233,12 @@ class Solution { } } ``` + ```java //第二种二分法:左闭右开 public int searchInsert(int[] nums, int target) { int left = 0; - int right = nums.length; + int right = nums.length; while (left < right) { //左闭右开 [left, right) int middle = left + ((right - left) >> 1); if (nums[middle] > target) { @@ -290,7 +298,8 @@ impl Solution { } ``` -### Python +### Python + ```python class Solution: def searchInsert(self, nums: List[int], target: int) -> int: @@ -308,7 +317,8 @@ class Solution: return right + 1 ``` -### JavaScript +### JavaScript + ```js var searchInsert = function (nums, target) { let l = 0, r = nums.length - 1, ans = nums.length; @@ -350,7 +360,7 @@ function searchInsert(nums: number[], target: number): number { }; ``` -### Swift +### Swift ```swift // 暴力法 @@ -383,7 +393,9 @@ func searchInsert(_ nums: [Int], _ target: Int) -> Int { return right + 1 } ``` + ### Scala + ```scala object Solution { def searchInsert(nums: Array[Int], target: Int): Int = { @@ -404,7 +416,7 @@ object Solution { } ``` -### PHP +### PHP ```php // 二分法(1):[左闭右闭] @@ -429,11 +441,13 @@ function searchInsert($nums, $target) return $r + 1; } ``` + ### C + ```c //版本一 [left, right]左闭右闭区间 int searchInsert(int* nums, int numsSize, int target){ - //左闭右开区间 [0 , numsSize-1] + //左闭右开区间 [0 , numsSize-1] int left =0; int mid =0; int right = numsSize - 1; @@ -451,14 +465,15 @@ int searchInsert(int* nums, int numsSize, int target){ } } //数组中未找到target元素 - //target在数组所有元素之后,[left, right]是右闭区间,需要返回 right +1 + //target在数组所有元素之后,[left, right]是右闭区间,需要返回 right +1 return right + 1; } ``` + ```c //版本二 [left, right]左闭右开区间 int searchInsert(int* nums, int numsSize, int target){ - //左闭右开区间 [0 , numsSize) + //左闭右开区间 [0 , numsSize) int left =0; int mid =0; int right = numsSize; diff --git "a/problems/0037.\350\247\243\346\225\260\347\213\254.md" "b/problems/0037.\350\247\243\346\225\260\347\213\254.md" index 18a96d581b..6edd3c5b5e 100644 --- "a/problems/0037.\350\247\243\346\225\260\347\213\254.md" +++ "b/problems/0037.\350\247\243\346\225\260\347\213\254.md" @@ -1,3 +1,4 @@ +

@@ -5,6 +6,7 @@

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+ 如果对回溯法理论还不清楚的同学,可以先看这个视频[视频来了!!带你学透回溯算法(理论篇)](https://mp.weixin.qq.com/s/wDd5azGIYWjbU0fdua_qBg) # 37. 解数独 @@ -14,20 +16,21 @@ 编写一个程序,通过填充空格来解决数独问题。 一个数独的解法需遵循如下规则: -数字 1-9 在每一行只能出现一次。 -数字 1-9 在每一列只能出现一次。 -数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。 -空白格用 '.' 表示。 +数字 1-9 在每一行只能出现一次。 +数字 1-9 在每一列只能出现一次。 +数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。 +空白格用 '.' 表示。 -![解数独](https://img-blog.csdnimg.cn/202011171912586.png) +![解数独](https://code-thinking-1253855093.file.myqcloud.com/pics/202011171912586.png) 一个数独。 -![解数独](https://img-blog.csdnimg.cn/20201117191340669.png) +![解数独](https://code-thinking-1253855093.file.myqcloud.com/pics/20201117191340669.png) 答案被标成红色。 提示: + * 给定的数独序列只包含数字 1-9 和字符 '.' 。 * 你可以假设给定的数独只有唯一解。 * 给定数独永远是 9x9 形式的。 @@ -54,7 +57,7 @@ 因为这个树形结构太大了,我抽取一部分,如图所示: -![37.解数独](https://img-blog.csdnimg.cn/2020111720451790.png) +![37.解数独](https://code-thinking-1253855093.file.myqcloud.com/pics/2020111720451790-20230310131816104.png) ### 回溯三部曲 @@ -85,7 +88,7 @@ bool backtracking(vector>& board) * 递归单层搜索逻辑 -![37.解数独](https://img-blog.csdnimg.cn/2020111720451790.png) +![37.解数独](https://code-thinking-1253855093.file.myqcloud.com/pics/2020111720451790-20230310131822254.png) 在树形图中可以看出我们需要的是一个二维的递归(也就是两个for循环嵌套着递归) @@ -171,8 +174,8 @@ bool backtracking(vector>& board) { board[i][j] = '.'; // 回溯,撤销k } } - return false; // 9个数都试完了,都不行,那么就返回false - } + return false; // 9个数都试完了,都不行,那么就返回false + } } } return true; // 遍历完没有返回false,说明找到了合适棋盘位置了 @@ -223,7 +226,8 @@ public: ## 其他语言版本 -### Java +### Java + ```java class Solution { public void solveSudoku(char[][] board) { @@ -291,7 +295,8 @@ class Solution { } ``` -### Python +### Python + ```python class Solution: def solveSudoku(self, board: List[List[str]]) -> None: @@ -306,7 +311,7 @@ class Solution: for j in range(len(board[0])): # 遍历列 # 若空格内已有数字,跳过 if board[i][j] != '.': continue - for k in range(1, 10): + 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 @@ -334,7 +339,7 @@ class Solution: return True ``` -### Go +### Go ```go func solveSudoku(board [][]byte) { @@ -392,7 +397,8 @@ func isvalid(row, col int, k byte, board [][]byte) bool { -### Javascript +### Javascript + ```Javascript var solveSudoku = function(board) { function isValid(row, col, val, board) { @@ -433,7 +439,7 @@ var solveSudoku = function(board) { if (backTracking()) { return true } - + board[i][j] = `.` } } @@ -444,7 +450,7 @@ var solveSudoku = function(board) { } backTracking(board) return board - + }; ``` @@ -543,7 +549,7 @@ impl Solution { } ``` -### C +### C ```C bool isValid(char** board, int row, int col, int k) { @@ -660,9 +666,10 @@ func solveSudoku(_ board: inout [[Character]]) { ### Scala 详细写法: + ```scala object Solution { - + def solveSudoku(board: Array[Array[Char]]): Unit = { backtracking(board) } @@ -692,7 +699,7 @@ object Solution { return false } } - + // 列 for (j <- 0 until 9) { if (board(x)(j) == value) { @@ -717,9 +724,10 @@ object Solution { ``` 遵循Scala至简原则写法: + ```scala object Solution { - + def solveSudoku(board: Array[Array[Char]]): Unit = { backtracking(board) } diff --git "a/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" "b/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" index a3c62c53dd..c4ee5ca6ca 100644 --- "a/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" +++ "b/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" @@ -1,3 +1,4 @@ +

@@ -5,40 +6,43 @@

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+ # 39. 组合总和 [力扣题目链接](https://leetcode.cn/problems/combination-sum/) -给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。 +给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。 -candidates 中的数字可以无限制重复被选取。 +candidates 中的数字可以无限制重复被选取。 说明: -* 所有数字(包括 target)都是正整数。 -* 解集不能包含重复的组合。  +* 所有数字(包括 target)都是正整数。 +* 解集不能包含重复的组合。 示例 1: + * 输入:candidates = [2,3,6,7], target = 7, * 所求解集为: -[ + [ [7], [2,2,3] -] + ] + +示例 2: -示例 2: * 输入:candidates = [2,3,5], target = 8, * 所求解集为: -[ -  [2,2,2,2], -  [2,3,3], -  [3,5] -] + [ + [2,2,2,2], + [2,3,3], + [3,5] + ] # 算法公开课 **《代码随想录》算法视频公开课:[Leetcode:39. 组合总和讲解](https://www.bilibili.com/video/BV1KT4y1M7HJ),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 - + # 思路 @@ -48,7 +52,7 @@ candidates 中的数字可以无限制重复被选取。 本题搜索的过程抽象成树形结构如下: -![39.组合总和](https://img-blog.csdnimg.cn/20201223170730367.png) +![39.组合总和](https://code-thinking-1253855093.file.myqcloud.com/pics/20201223170730367.png) 注意图中叶子节点的返回条件,因为本题没有组合数量要求,仅仅是总和的限制,所以递归没有层数的限制,只要选取的元素总和超过target,就返回! 而在[77.组合](https://programmercarl.com/0077.组合.html)和[216.组合总和III](https://programmercarl.com/0216.组合总和III.html) 中都可以知道要递归K层,因为要取k个元素的组合。 @@ -83,7 +87,7 @@ void backtracking(vector& candidates, int target, int sum, int startIndex) 在如下树形结构中: -![39.组合总和](https://img-blog.csdnimg.cn/20201223170730367.png) +![39.组合总和](https://code-thinking-1253855093.file.myqcloud.com/pics/20201223170730367-20230310135337214.png) 从叶子节点可以清晰看到,终止只有两种情况,sum大于target和sum等于target。 @@ -156,7 +160,7 @@ public: 在这个树形结构中: -![39.组合总和](https://img-blog.csdnimg.cn/20201223170730367.png) +![39.组合总和](https://code-thinking-1253855093.file.myqcloud.com/pics/20201223170730367-20230310135342472.png) 以及上面的版本一的代码大家可以看到,对于sum已经大于target的情况,其实是依然进入了下一层递归,只是下一层递归结束判断的时候,会判断sum > target的话就返回。 @@ -169,7 +173,7 @@ public: 如图: -![39.组合总和1](https://img-blog.csdnimg.cn/20201223170809182.png) +![39.组合总和1](https://code-thinking-1253855093.file.myqcloud.com/pics/20201223170809182.png) for循环剪枝代码如下: @@ -235,7 +239,8 @@ public: # 其他语言版本 -## Java +## Java + ```Java // 剪枝优化 class Solution { @@ -264,8 +269,10 @@ class Solution { } ``` -## Python +## Python + **回溯** + ```python class Solution: def __init__(self): @@ -287,9 +294,9 @@ class Solution: self.paths.append(self.path[:]) # 因为是shallow copy,所以不能直接传入self.path return if sum_ > target: - return - - # 单层递归逻辑 + return + + # 单层递归逻辑 for i in range(start_index, len(candidates)): sum_ += candidates[i] self.path.append(candidates[i]) @@ -297,7 +304,9 @@ class Solution: sum_ -= candidates[i] # 回溯 self.path.pop() # 回溯 ``` + **剪枝回溯** + ```python class Solution: def __init__(self): @@ -321,11 +330,11 @@ class Solution: 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 + if sum_ + candidates[i] > target: + return sum_ += candidates[i] self.path.append(candidates[i]) self.backtracking(candidates, target, sum_, i) # 因为无限制重复选取,所以不是i-1 @@ -333,7 +342,8 @@ class Solution: self.path.pop() # 回溯 ``` -## Go +## Go + 主要在于递归中传递下一个数字 ```go @@ -423,7 +433,7 @@ function combinationSum(candidates: number[], target: number): number[][] { ```Rust impl Solution { pub fn backtracking(result: &mut Vec>, path: &mut Vec, candidates: &Vec, target: i32, mut sum: i32, start_index: usize) { - if sum == target { + if sum == target { result.push(path.to_vec()); return; } @@ -447,7 +457,7 @@ impl Solution { } ``` -## C +## C ```c int* path; diff --git "a/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" "b/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" index 415fdb605f..83708df720 100644 --- "a/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" +++ "b/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" @@ -82,7 +82,7 @@ candidates 中的每个数字在每个组合中只能使用一次。 选择过程树形结构如图所示: -![40.组合总和II](https://img-blog.csdnimg.cn/20201123202736384.png) +![40.组合总和II](https://code-thinking-1253855093.file.myqcloud.com/pics/20230310000918.png) 可以看到图中,每个节点相对于 [39.组合总和](https://mp.weixin.qq.com/s/FLg8G6EjVcxBjwCbzpACPw)我多加了used数组,这个used数组下面会重点介绍。 @@ -132,7 +132,7 @@ if (sum == target) { 这块比较抽象,如图: -![40.组合总和II1](https://img-blog.csdnimg.cn/20201123202817973.png) +![40.组合总和II1](https://code-thinking-1253855093.file.myqcloud.com/pics/20230310000954.png) 我在图中将used的变化用橘黄色标注上,可以看出在candidates[i] == candidates[i - 1]相同的情况下: diff --git "a/problems/0042.\346\216\245\351\233\250\346\260\264.md" "b/problems/0042.\346\216\245\351\233\250\346\260\264.md" index 8ea81234cc..db66095da2 100644 --- "a/problems/0042.\346\216\245\351\233\250\346\260\264.md" +++ "b/problems/0042.\346\216\245\351\233\250\346\260\264.md" @@ -1,3 +1,4 @@ +

@@ -5,9 +6,10 @@

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+ > 这个图就是大厂面试经典题目,接雨水! 最常青藤的一道题,面试官百出不厌! -# 42. 接雨水 +# 42. 接雨水 [力扣题目链接](https://leetcode.cn/problems/trapping-rain-water/) @@ -15,7 +17,7 @@ 示例 1: -![](https://code-thinking-1253855093.cos.ap-guangzhou.myqcloud.com/pics/20210713205038.png) +![](https://code-thinking-1253855093.cos.ap-guangzhou.myqcloud.com/pics/20210713205038.png) * 输入:height = [0,1,0,2,1,0,1,3,2,1,2,1] * 输出:6 @@ -27,26 +29,27 @@ * 输出:9 -# 思路 +# 思路 接雨水问题在面试中还是常见题目的,有必要好好讲一讲。 本文深度讲解如下三种方法: + * 双指针法 * 动态规划 * 单调栈 -## 暴力解法 +## 暴力解法 本题暴力解法也是也是使用双指针。 首先要明确,要按照行来计算,还是按照列来计算。 按照行来计算如图: -![42.接雨水2](https://img-blog.csdnimg.cn/20210402091118927.png) +![42.接雨水2](https://code-thinking-1253855093.file.myqcloud.com/pics/20210402091118927.png) 按照列来计算如图: -![42.接雨水1](https://img-blog.csdnimg.cn/20210402091208445.png) +![42.接雨水1](https://code-thinking-1253855093.file.myqcloud.com/pics/20210402091208445.png) 一些同学在实现的时候,很容易一会按照行来计算一会按照列来计算,这样就会越写越乱。 @@ -58,7 +61,7 @@ 这句话可以有点绕,来举一个理解,例如求列4的雨水高度,如图: -![42.接雨水3](https://img-blog.csdnimg.cn/20210223092732301.png) +![42.接雨水3](https://code-thinking-1253855093.file.myqcloud.com/pics/20210223092732301.png) 列4 左侧最高的柱子是列3,高度为2(以下用lHeight表示)。 @@ -72,7 +75,7 @@ 此时求出了列4的雨水体积。 -一样的方法,只要从头遍历一遍所有的列,然后求出每一列雨水的体积,相加之后就是总雨水的体积了。 +一样的方法,只要从头遍历一遍所有的列,然后求出每一列雨水的体积,相加之后就是总雨水的体积了。 首先从头遍历所有的列,并且**要注意第一个柱子和最后一个柱子不接雨水**,代码如下: @@ -132,7 +135,7 @@ public: 因为每次遍历列的时候,还要向两边寻找最高的列,所以时间复杂度为O(n^2),空间复杂度为O(1)。 -力扣后面修改了后台测试数据,所以以上暴力解法超时了。 +力扣后面修改了后台测试数据,所以以上暴力解法超时了。 ## 双指针优化 @@ -181,9 +184,9 @@ public: }; ``` -## 单调栈解法 +## 单调栈解法 -关于单调栈的理论基础,单调栈适合解决什么问题,单调栈的工作过程,大家可以先看这题讲解 [739. 每日温度](https://programmercarl.com/0739.每日温度.html)。 +关于单调栈的理论基础,单调栈适合解决什么问题,单调栈的工作过程,大家可以先看这题讲解 [739. 每日温度](https://programmercarl.com/0739.每日温度.html)。 单调栈就是保持栈内元素有序。和[栈与队列:单调队列](https://programmercarl.com/0239.滑动窗口最大值.html)一样,需要我们自己维持顺序,没有现成的容器可以用。 @@ -197,7 +200,7 @@ public: 1. 首先单调栈是按照行方向来计算雨水,如图: -![42.接雨水2](https://img-blog.csdnimg.cn/20210223092629946.png) +![42.接雨水2](https://code-thinking-1253855093.file.myqcloud.com/pics/20210223092629946.png) 知道这一点,后面的就可以理解了。 @@ -211,11 +214,11 @@ public: 如图: -![42.接雨水4](https://img-blog.csdnimg.cn/2021022309321229.png) +![42.接雨水4](https://code-thinking-1253855093.file.myqcloud.com/pics/2021022309321229.png) 关于单调栈的顺序给大家一个总结: [739. 每日温度](https://programmercarl.com/0739.每日温度.html) 中求一个元素右边第一个更大元素,单调栈就是递增的,[84.柱状图中最大的矩形](https://programmercarl.com/0084.柱状图中最大的矩形.html)求一个元素右边第一个更小元素,单调栈就是递减的。 -3. 遇到相同高度的柱子怎么办。 +3. 遇到相同高度的柱子怎么办。 遇到相同的元素,更新栈内下标,就是将栈里元素(旧下标)弹出,将新元素(新下标)加入栈中。 @@ -225,7 +228,7 @@ public: 如图所示: -![42.接雨水5](https://img-blog.csdnimg.cn/20210223094619398.png) +![42.接雨水5](https://code-thinking-1253855093.file.myqcloud.com/pics/20210223094619398.png) 4. 栈里要保存什么数值 @@ -233,7 +236,7 @@ public: 长就是通过柱子的高度来计算,宽是通过柱子之间的下标来计算, -那么栈里有没有必要存一个pair类型的元素,保存柱子的高度和下标呢。 +那么栈里有没有必要存一个pair类型的元素,保存柱子的高度和下标呢。 其实不用,栈里就存放下标就行,想要知道对应的高度,通过height[stack.top()] 就知道弹出的下标对应的高度了。 @@ -245,17 +248,17 @@ stack st; // 存着下标,计算的时候用下标对应的柱子高度 明确了如上几点,我们再来看处理逻辑。 -### 单调栈处理逻辑 +### 单调栈处理逻辑 -以下操作过程其实和 [739. 每日温度](https://programmercarl.com/0739.每日温度.html) 也是一样的,建议先做 [739. 每日温度](https://programmercarl.com/0739.每日温度.html)。 +以下操作过程其实和 [739. 每日温度](https://programmercarl.com/0739.每日温度.html) 也是一样的,建议先做 [739. 每日温度](https://programmercarl.com/0739.每日温度.html)。 -以下逻辑主要就是三种情况 +以下逻辑主要就是三种情况 -* 情况一:当前遍历的元素(柱子)高度小于栈顶元素的高度 height[i] < height[st.top()] -* 情况二:当前遍历的元素(柱子)高度等于栈顶元素的高度 height[i] == height[st.top()] -* 情况三:当前遍历的元素(柱子)高度大于栈顶元素的高度 height[i] > height[st.top()] +* 情况一:当前遍历的元素(柱子)高度小于栈顶元素的高度 height[i] < height[st.top()] +* 情况二:当前遍历的元素(柱子)高度等于栈顶元素的高度 height[i] == height[st.top()] +* 情况三:当前遍历的元素(柱子)高度大于栈顶元素的高度 height[i] > height[st.top()] -先将下标0的柱子加入到栈中,`st.push(0);`。 栈中存放我们遍历过的元素,所以先将下标0加进来。 +先将下标0的柱子加入到栈中,`st.push(0);`。 栈中存放我们遍历过的元素,所以先将下标0加进来。 然后开始从下标1开始遍历所有的柱子,`for (int i = 1; i < height.size(); i++)`。 @@ -278,9 +281,9 @@ if (height[i] == height[st.top()]) { // 例如 5 5 1 7 这种情况 } ``` -如果当前遍历的元素(柱子)高度大于栈顶元素的高度,此时就出现凹槽了,如图所示: +如果当前遍历的元素(柱子)高度大于栈顶元素的高度,此时就出现凹槽了,如图所示: -![42.接雨水4](https://img-blog.csdnimg.cn/2021022309321229.png) +![42.接雨水4](https://code-thinking-1253855093.file.myqcloud.com/pics/2021022309321229-20230310123027977.png) 取栈顶元素,将栈顶元素弹出,这个就是凹槽的底部,也就是中间位置,下标记为mid,对应的高度为height[mid](就是图中的高度1)。 @@ -290,7 +293,7 @@ if (height[i] == height[st.top()]) { // 例如 5 5 1 7 这种情况 此时大家应该可以发现其实就是**栈顶和栈顶的下一个元素以及要入栈的元素,三个元素来接水!** -那么雨水高度是 min(凹槽左边高度, 凹槽右边高度) - 凹槽底部高度,代码为:`int h = min(height[st.top()], height[i]) - height[mid];` +那么雨水高度是 min(凹槽左边高度, 凹槽右边高度) - 凹槽底部高度,代码为:`int h = min(height[st.top()], height[i]) - height[mid];` 雨水的宽度是 凹槽右边的下标 - 凹槽左边的下标 - 1(因为只求中间宽度),代码为:`int w = i - st.top() - 1 ;` @@ -373,11 +376,12 @@ public: 精简之后的代码,大家就看不出去三种情况的处理了,貌似好像只处理的情况三,其实是把情况一和情况二融合了。 这样的代码不太利于理解。 -## 其他语言版本 +## 其他语言版本 -### Java: +### Java: 暴力解法: + ```java class Solution { public int trap(int[] height) { @@ -385,7 +389,7 @@ class Solution { for (int i = 0; i < height.length; i++) { // 第一个柱子和最后一个柱子不接雨水 if (i==0 || i== height.length - 1) continue; - + int rHeight = height[i]; // 记录右边柱子的最高高度 int lHeight = height[i]; // 记录左边柱子的最高高度 for (int r = i+1; r < height.length; r++) { @@ -404,6 +408,7 @@ class Solution { ``` 双指针: + ```java class Solution { public int trap(int[] height) { @@ -411,15 +416,15 @@ class Solution { if (length <= 2) return 0; int[] maxLeft = new int[length]; int[] maxRight = new int[length]; - + // 记录每个柱子左边柱子最大高度 maxLeft[0] = height[0]; for (int i = 1; i< length; i++) maxLeft[i] = Math.max(height[i], maxLeft[i-1]); - + // 记录每个柱子右边柱子最大高度 maxRight[length - 1] = height[length - 1]; for(int i = length - 2; i >= 0; i--) maxRight[i] = Math.max(height[i], maxRight[i+1]); - + // 求和 int sum = 0; for (int i = 0; i < length; i++) { @@ -432,13 +437,14 @@ class Solution { ``` 单调栈法 + ```java class Solution { public int trap(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(); @@ -458,7 +464,7 @@ class Solution { int heightAtIdx = height[index]; while (!stack.isEmpty() && (heightAtIdx > height[stackTop])){ int mid = stack.pop(); - + if (!stack.isEmpty()){ int left = stack.peek(); @@ -472,7 +478,7 @@ class Solution { stack.push(index); } } - + return sum; } } @@ -481,6 +487,7 @@ class Solution { ### Python: 暴力解法: + ```Python class Solution: def trap(self, height: List[int]) -> int: @@ -495,32 +502,35 @@ class Solution: for k in range(i+2,len(height)): if height[k] > rHight: rHight = height[k] - res1 = min(lHight,rHight) - height[i] + res1 = min(lHight,rHight) - height[i] if res1 > 0: res += res1 return res ``` 双指针: + ```python class Solution: def trap(self, height: List[int]) -> int: leftheight, rightheight = [0]*len(height), [0]*len(height) - + leftheight[0]=height[0] for i in range(1,len(height)): leftheight[i]=max(leftheight[i-1],height[i]) rightheight[-1]=height[-1] for i in range(len(height)-2,-1,-1): rightheight[i]=max(rightheight[i+1],height[i]) - + result = 0 for i in range(0,len(height)): summ = min(leftheight[i],rightheight[i])-height[i] result += summ return result ``` + 单调栈 + ```Python class Solution: def trap(self, height: List[int]) -> int: @@ -565,8 +575,8 @@ class Solution: result += h * w stack.append(i) return result - -# 单调栈压缩版 + +# 单调栈压缩版 class Solution: def trap(self, height: List[int]) -> int: stack = [0] @@ -586,7 +596,7 @@ class Solution: ``` -### Go +### Go ```go func trap(height []int) int { @@ -601,7 +611,7 @@ func trap(height []int) int { } left++ } else { - if height[right] > rightMax { + if height[right] > rightMax { rightMax = height[right] // //设置右边最高柱子 } else { res += rightMax - height[right] // //左边必定有柱子挡水,所以,遇到所有值小于等于rightMax的,全部加入水池 @@ -652,6 +662,7 @@ func min(a,b int)int{ ``` 单调栈解法 + ```go func trap(height []int) int { if len(height) <= 2 { @@ -896,12 +907,12 @@ int trap(int* height, int heightSize) { while (left < right) { //两个指针重合就结束 leftMax = fmax(leftMax, height[left]); rightMax = fmax(rightMax, height[right]); - if (leftMax < rightMax) { + if (leftMax < rightMax) { ans += leftMax - height[left]; //这里考虑的是下标为left的“底”能装多少水 ++left;//指针的移动次序是这个方法的关键 //这里左指针右移是因为左“墙”较矮,左边这一片实际情况下的盛水量是受制于这个矮的左“墙”的 //而较高的右边在实际情况下的限制条件可能不是当前的左“墙”,比如限制条件可能是右“墙”,就能装更高的水, - } + } else { ans += rightMax - height[right]; //同理,考虑下标为right的元素 --right; diff --git "a/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" "b/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" index d4f2e6ea78..22151fdc9a 100644 --- "a/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" +++ "b/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" @@ -46,7 +46,8 @@ 如图: -![45.跳跃游戏II](https://img-blog.csdnimg.cn/20201201232309103.png) + +![45.跳跃游戏II](https://code-thinking-1253855093.file.myqcloud.com/pics/20201201232309103.png) **图中覆盖范围的意义在于,只要红色的区域,最多两步一定可以到!(不用管具体怎么跳,反正一定可以跳到)** @@ -96,11 +97,11 @@ public: 因为当移动下标指向nums.size - 2时: * 如果移动下标等于当前覆盖最大距离下标, 需要再走一步(即ans++),因为最后一步一定是可以到的终点。(题目假设总是可以到达数组的最后一个位置),如图: -![45.跳跃游戏II2](https://img-blog.csdnimg.cn/20201201232445286.png) +![45.跳跃游戏II2](https://code-thinking-1253855093.file.myqcloud.com/pics/20201201232445286.png) * 如果移动下标不等于当前覆盖最大距离下标,说明当前覆盖最远距离就可以直接达到终点了,不需要再走一步。如图: -![45.跳跃游戏II1](https://img-blog.csdnimg.cn/20201201232338693.png) +![45.跳跃游戏II1](https://code-thinking-1253855093.file.myqcloud.com/pics/20201201232338693.png) 代码如下: diff --git "a/problems/0046.\345\205\250\346\216\222\345\210\227.md" "b/problems/0046.\345\205\250\346\216\222\345\210\227.md" index 86bc704d4b..e08aec940b 100644 --- "a/problems/0046.\345\205\250\346\216\222\345\210\227.md" +++ "b/problems/0046.\345\205\250\346\216\222\345\210\227.md" @@ -66,7 +66,7 @@ void backtracking (vector& nums, vector& used) * 递归终止条件 -![46.全排列](https://img-blog.csdnimg.cn/20201209174225145.png) +![46.全排列](https://code-thinking-1253855093.file.myqcloud.com/pics/20201209174225145.png) 可以看出叶子节点,就是收割结果的地方。 diff --git "a/problems/0047.\345\205\250\346\216\222\345\210\227II.md" "b/problems/0047.\345\205\250\346\216\222\345\210\227II.md" index 3eb99948ea..b4f7a4d8cb 100644 --- "a/problems/0047.\345\205\250\346\216\222\345\210\227II.md" +++ "b/problems/0047.\345\205\250\346\216\222\345\210\227II.md" @@ -1,3 +1,4 @@ +

@@ -5,6 +6,7 @@

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+ # 47.全排列 II [力扣题目链接](https://leetcode.cn/problems/permutations-ii/) @@ -12,17 +14,20 @@ 给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。 示例 1: + * 输入:nums = [1,1,2] * 输出: -[[1,1,2], - [1,2,1], - [2,1,1]] + [[1,1,2], + [1,2,1], + [2,1,1]] 示例 2: + * 输入:nums = [1,2,3] * 输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]] 提示: + * 1 <= nums.length <= 8 * -10 <= nums[i] <= 10 @@ -45,7 +50,7 @@ 我以示例中的 [1,1,2]为例 (为了方便举例,已经排序)抽象为一棵树,去重过程如图: -![47.全排列II1](https://img-blog.csdnimg.cn/20201124201331223.png) +![47.全排列II1](https://code-thinking-1253855093.file.myqcloud.com/pics/20201124201331223.png) 图中我们对同一树层,前一位(也就是nums[i-1])如果使用过,那么就进行去重。 @@ -68,7 +73,7 @@ private: } for (int i = 0; i < nums.size(); i++) { // used[i - 1] == true,说明同一树枝nums[i - 1]使用过 - // used[i - 1] == false,说明同一树层nums[i - 1]使用过 + // used[i - 1] == false,说明同一树层nums[i - 1]使用过 // 如果同一树层nums[i - 1]使用过则直接跳过 if (i > 0 && nums[i] == nums[i - 1] && used[i - 1] == false) { continue; @@ -123,23 +128,26 @@ if (i > 0 && nums[i] == nums[i - 1] && used[i - 1] == true) { 树层上去重(used[i - 1] == false),的树形结构如下: -![47.全排列II2](https://img-blog.csdnimg.cn/20201124201406192.png) +![47.全排列II2](https://code-thinking-1253855093.file.myqcloud.com/pics/20201124201406192.png) 树枝上去重(used[i - 1] == true)的树型结构如下: -![47.全排列II3](https://img-blog.csdnimg.cn/20201124201431571.png) +![47.全排列II3](https://code-thinking-1253855093.file.myqcloud.com/pics/20201124201431571.png) 大家应该很清晰的看到,树层上对前一位去重非常彻底,效率很高,树枝上对前一位去重虽然最后可以得到答案,但是做了很多无用搜索。 ## 总结 这道题其实还是用了我们之前讲过的去重思路,但有意思的是,去重的代码中,这么写: + ```cpp if (i > 0 && nums[i] == nums[i - 1] && used[i - 1] == false) { continue; } ``` + 和这么写: + ```cpp if (i > 0 && nums[i] == nums[i - 1] && used[i - 1] == true) { continue; @@ -154,7 +162,7 @@ if (i > 0 && nums[i] == nums[i - 1] && used[i - 1] == true) { ## 其他语言版本 -### java +### java ```java class Solution { @@ -196,7 +204,7 @@ class Solution { } ``` -### python +### python ```python class Solution: @@ -224,7 +232,7 @@ class Solution: return res ``` -### Go +### Go ```go var ( @@ -264,7 +272,6 @@ func dfs(nums []int, cur int) { ### Javascript ```javascript - var permuteUnique = function (nums) { nums.sort((a, b) => { return a - b @@ -392,6 +399,7 @@ impl Solution { ``` ### C + ```c //临时数组 int *path; @@ -483,7 +491,7 @@ object Solution { // 当前索引为0,不存在和前一个数字相等可以进入回溯 // 当前索引值和上一个索引不相等,可以回溯 // 前一个索引对应的值没有被选,可以回溯 - // 因为Scala没有continue,只能将逻辑反过来写 + // 因为Scala没有continue,只能将逻辑反过来写 if (i == 0 || (i > 0 && num(i) != num(i - 1)) || used(i-1) == false) { used(i) = true path.append(num(i)) diff --git "a/problems/0051.N\347\232\207\345\220\216.md" "b/problems/0051.N\347\232\207\345\220\216.md" index 624452fd2c..bd1d1c9bec 100644 --- "a/problems/0051.N\347\232\207\345\220\216.md" +++ "b/problems/0051.N\347\232\207\345\220\216.md" @@ -47,7 +47,7 @@ n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上, 下面我用一个 3 * 3 的棋盘,将搜索过程抽象为一棵树,如图: -![51.N皇后](https://img-blog.csdnimg.cn/20210130182532303.jpg) +![51.N皇后](https://code-thinking-1253855093.file.myqcloud.com/pics/20210130182532303.jpg) 从图中,可以看出,二维矩阵中矩阵的高就是这棵树的高度,矩阵的宽就是树形结构中每一个节点的宽度。 @@ -87,7 +87,7 @@ void backtracking(int n, int row, vector& chessboard) { * 递归终止条件 在如下树形结构中: -![51.N皇后](https://img-blog.csdnimg.cn/20210130182532303.jpg) +![51.N皇后](https://code-thinking-1253855093.file.myqcloud.com/pics/20210130182532303-20230310122134167.jpg) 可以看出,当递归到棋盘最底层(也就是叶子节点)的时候,就可以收集结果并返回了。 diff --git "a/problems/0052.N\347\232\207\345\220\216II.md" "b/problems/0052.N\347\232\207\345\220\216II.md" index 1c88fb3c7b..90b920bac4 100644 --- "a/problems/0052.N\347\232\207\345\220\216II.md" +++ "b/problems/0052.N\347\232\207\345\220\216II.md" @@ -13,7 +13,9 @@ n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。 上图为 8 皇后问题的一种解法。 -![51n皇后](https://img-blog.csdnimg.cn/20200821152118456.png) + + +![51n皇后](https://code-thinking-1253855093.file.myqcloud.com/pics/20200821152118456.png) 给定一个整数 n,返回 n 皇后不同的解决方案的数量。 diff --git "a/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" "b/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" index 506c000fd2..c7d1b2fd7b 100644 --- "a/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" +++ "b/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" @@ -51,7 +51,7 @@ dp[0]应该是多少呢? 5. 举例推导dp数组 以示例一为例,输入:nums = [-2,1,-3,4,-1,2,1,-5,4],对应的dp状态如下: -![53.最大子序和(动态规划)](https://img-blog.csdnimg.cn/20210303104129101.png) +![53.最大子序和(动态规划)](https://code-thinking-1253855093.file.myqcloud.com/pics/20210303104129101.png) **注意最后的结果可不是dp[nums.size() - 1]!** ,而是dp[6]。 diff --git "a/problems/0054.\350\236\272\346\227\213\347\237\251\351\230\265.md" "b/problems/0054.\350\236\272\346\227\213\347\237\251\351\230\265.md" index 858741d0b0..a38e8237b9 100644 --- "a/problems/0054.\350\236\272\346\227\213\347\237\251\351\230\265.md" +++ "b/problems/0054.\350\236\272\346\227\213\347\237\251\351\230\265.md" @@ -37,7 +37,8 @@ 由外向内一圈一圈这么画下去,如下所示: -![螺旋矩阵](https://img-blog.csdnimg.cn/2020121623550681.png) + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20220922102236.png) 这里每一种颜色,代表一条边,我们遍历的长度,可以看出每一个拐角处的处理规则,拐角处让给新的一条边来继续画。 diff --git "a/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" "b/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" index 7b02075bdb..a898263de9 100644 --- "a/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" +++ "b/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" @@ -46,7 +46,8 @@ 如图: -![55.跳跃游戏](https://img-blog.csdnimg.cn/20201124154758229.png) + +![55.跳跃游戏](https://code-thinking-1253855093.file.myqcloud.com/pics/20201124154758229-20230310135019977.png) i每次移动只能在cover的范围内移动,每移动一个元素,cover得到该元素数值(新的覆盖范围)的补充,让i继续移动下去。 diff --git "a/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" "b/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" index 3c980c2be3..d467ab1a29 100644 --- "a/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" +++ "b/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" @@ -37,7 +37,7 @@ 这么说有点抽象,看图:(**注意图中区间都是按照左边界排序之后了**) -![56.合并区间](https://img-blog.csdnimg.cn/20201223200632791.png) +![56.合并区间](https://code-thinking-1253855093.file.myqcloud.com/pics/20201223200632791.png) 知道如何判断重复之后,剩下的就是合并了,如何去模拟合并区间呢? diff --git "a/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" "b/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" index 40655f0c28..bf4363692b 100644 --- "a/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" +++ "b/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" @@ -1,14 +1,16 @@ +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+ # 62.不同路径 [力扣题目链接](https://leetcode.cn/problems/unique-paths/) -一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 +一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。 @@ -16,30 +18,35 @@ 示例 1: -![](https://img-blog.csdnimg.cn/20210110174033215.png) +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210110174033215.png) * 输入:m = 3, n = 7 * 输出:28 示例 2: + * 输入:m = 2, n = 3 * 输出:3 解释: 从左上角开始,总共有 3 条路径可以到达右下角。 + 1. 向右 -> 向右 -> 向下 2. 向右 -> 向下 -> 向右 3. 向下 -> 向右 -> 向右 示例 3: + * 输入:m = 7, n = 3 * 输出:28 示例 4: + * 输入:m = 3, n = 3 * 输出:6 提示: + * 1 <= m, n <= 100 * 题目数据保证答案小于等于 2 * 10^9 @@ -57,7 +64,7 @@ 如图举例: -![62.不同路径](https://img-blog.csdnimg.cn/20201209113602700.png) +![62.不同路径](https://code-thinking-1253855093.file.myqcloud.com/pics/20201209113602700.png) 此时问题就可以转化为求二叉树叶子节点的个数,代码如下: @@ -126,7 +133,7 @@ for (int j = 0; j < n; j++) dp[0][j] = 1; 如图所示: -![62.不同路径1](https://img-blog.csdnimg.cn/20201209113631392.png) +![62.不同路径1](https://code-thinking-1253855093.file.myqcloud.com/pics/20201209113631392.png) 以上动规五部曲分析完毕,C++代码如下: @@ -175,7 +182,7 @@ public: 在这个图中,可以看出一共m,n的话,无论怎么走,走到终点都需要 m + n - 2 步。 -![62.不同路径](https://img-blog.csdnimg.cn/20201209113602700.png) +![62.不同路径](https://code-thinking-1253855093.file.myqcloud.com/pics/20201209113602700-20230310120944078.png) 在这m + n - 2 步中,一定有 m - 1 步是要向下走的,不用管什么时候向下走。 @@ -185,7 +192,7 @@ public: 那么答案,如图所示: -![62.不同路径2](https://img-blog.csdnimg.cn/20201209113725324.png) +![62.不同路径2](https://code-thinking-1253855093.file.myqcloud.com/pics/20201209113725324.png) **求组合的时候,要防止两个int相乘溢出!** 所以不能把算式的分子都算出来,分母都算出来再做除法。 @@ -245,7 +252,8 @@ public: ## 其他语言版本 -### Java +### Java + ```java /** * 1. 确定dp数组下标含义 dp[i][j] 到每一个坐标可能的路径种类 @@ -278,7 +286,8 @@ public: ``` -### Python +### Python + ```python class Solution: # 动态规划 def uniquePaths(self, m: int, n: int) -> int: @@ -289,7 +298,8 @@ class Solution: # 动态规划 return dp[m - 1][n - 1] ``` -### Go +### Go + ```Go func uniquePaths(m int, n int) int { dp := make([][]int, m) @@ -309,19 +319,20 @@ func uniquePaths(m int, n int) int { } ``` -### Javascript +### Javascript + ```Javascript var uniquePaths = function(m, n) { const dp = Array(m).fill().map(item => Array(n)) - + for (let i = 0; i < m; ++i) { dp[i][0] = 1 } - + for (let i = 0; i < n; ++i) { dp[0][i] = 1 } - + for (let i = 1; i < m; ++i) { for (let j = 1; j < n; ++j) { dp[i][j] = dp[i - 1][j] + dp[i][j - 1] @@ -330,7 +341,9 @@ var uniquePaths = function(m, n) { return dp[m - 1][n - 1] }; ``` + >版本二:直接将dp数值值初始化为1 + ```javascript /** * @param {number} m @@ -414,9 +427,9 @@ int **initDP(int m, int n) { } //从0,0到i,0只有一种走法,所以dp[i][0]都是1,同理dp[0][j]也是1 - for(i = 0; i < m; ++i) + for(i = 0; i < m; ++i) dp[i][0] = 1; - for(j = 0; j < n; ++j) + for(j = 0; j < n; ++j) dp[0][j] = 1; return dp; } @@ -440,6 +453,7 @@ int uniquePaths(int m, int n){ ``` 滚动数组解法: + ```c int uniquePaths(int m, int n){ int i, j; @@ -455,7 +469,7 @@ int uniquePaths(int m, int n){ dp[i] += dp[i - 1]; } } - return dp[n - 1]; + return dp[n - 1]; } ``` diff --git "a/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" "b/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" index c4ce3f954f..85130ab4e4 100644 --- "a/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" +++ "b/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" @@ -1,9 +1,11 @@ +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+ # 63. 不同路径 II [力扣题目链接](https://leetcode.cn/problems/unique-paths-ii/) @@ -14,32 +16,33 @@ 现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径? -![](https://img-blog.csdnimg.cn/20210111204901338.png) +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210111204901338.png) 网格中的障碍物和空位置分别用 1 和 0 来表示。 示例 1: -![](https://img-blog.csdnimg.cn/20210111204939971.png) +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210111204939971.png) * 输入:obstacleGrid = [[0,0,0],[0,1,0],[0,0,0]] * 输出:2 -解释: + 解释: * 3x3 网格的正中间有一个障碍物。 * 从左上角到右下角一共有 2 条不同的路径: - 1. 向右 -> 向右 -> 向下 -> 向下 - 2. 向下 -> 向下 -> 向右 -> 向右 + 1. 向右 -> 向右 -> 向下 -> 向下 + 2. 向下 -> 向下 -> 向右 -> 向右 示例 2: -![](https://img-blog.csdnimg.cn/20210111205857918.png) +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210111205857918.png) * 输入:obstacleGrid = [[0,1],[0,0]] * 输出:1 提示: -* m == obstacleGrid.length -* n == obstacleGrid[i].length + +* m == obstacleGrid.length +* n == obstacleGrid[i].length * 1 <= m, n <= 100 * obstacleGrid[i][j] 为 0 或 1 @@ -92,7 +95,7 @@ for (int j = 0; j < n; j++) dp[0][j] = 1; 如图: -![63.不同路径II](https://img-blog.csdnimg.cn/20210104114513928.png) +![63.不同路径II](https://code-thinking-1253855093.file.myqcloud.com/pics/20210104114513928.png) 下标(0, j)的初始化情况同理。 @@ -126,13 +129,13 @@ for (int i = 1; i < m; i++) { 拿示例1来举例如题: -![63.不同路径II1](https://img-blog.csdnimg.cn/20210104114548983.png) +![63.不同路径II1](https://code-thinking-1253855093.file.myqcloud.com/pics/20210104114548983.png) 对应的dp table 如图: -![63.不同路径II2](https://img-blog.csdnimg.cn/20210104114610256.png) +![63.不同路径II2](https://code-thinking-1253855093.file.myqcloud.com/pics/20210104114610256.png) -如果这个图看不同,建议在理解一下递归公式,然后照着文章中说的遍历顺序,自己推导一下​!​ +如果这个图看不同,建议在理解一下递归公式,然后照着文章中说的遍历顺序,自己推导一下! 动规五部分分析完毕,对应C++代码如下: @@ -163,6 +166,7 @@ public: 同样我们给出空间优化版本: + ```CPP class Solution { public: @@ -208,7 +212,7 @@ public: ## 其他语言版本 -### Java +### Java ```java class Solution { @@ -246,11 +250,11 @@ class Solution { int m = obstacleGrid.length; int n = obstacleGrid[0].length; int[] dp = new int[n]; - + for (int j = 0; j < n && obstacleGrid[0][j] == 0; j++) { dp[j] = 1; } - + for (int i = 1; i < m; i++) { for (int j = 0; j < n; j++) { if (obstacleGrid[i][j] == 1) { @@ -316,7 +320,7 @@ class Solution: if obstacleGrid[0][j] == 1: break curr[j] = 1 - + for i in range(1, m): # 从第二行开始 for j in range(n): # 从第一列开始,因为第一列可能有障碍物 # 有障碍物处无法通行,状态就设成0 @@ -328,7 +332,7 @@ class Solution: curr[j] = curr[j] + curr[j - 1] # 隐含的状态更新 # dp[i][0] = dp[i - 1][0] - + return curr[n - 1] ``` @@ -369,26 +373,27 @@ func uniquePathsWithObstacles(obstacleGrid [][]int) int { ``` ### Javascript + ```Javascript var uniquePathsWithObstacles = function(obstacleGrid) { const m = obstacleGrid.length const n = obstacleGrid[0].length const dp = Array(m).fill().map(item => Array(n).fill(0)) - + for (let i = 0; i < m && obstacleGrid[i][0] === 0; ++i) { dp[i][0] = 1 } - + for (let i = 0; i < n && obstacleGrid[0][i] === 0; ++i) { dp[0][i] = 1 } - + for (let i = 1; i < m; ++i) { for (let j = 1; j < n; ++j) { dp[i][j] = obstacleGrid[i][j] === 1 ? 0 : dp[i - 1][j] + dp[i][j - 1] } } - + return dp[m - 1][n - 1] }; @@ -545,9 +550,10 @@ int uniquePathsWithObstacles(int** obstacleGrid, int obstacleGridSize, int* obst ``` 空间优化版本: + ```c int uniquePathsWithObstacles(int** obstacleGrid, int obstacleGridSize, int* obstacleGridColSize){ - int m = obstacleGridSize; + int m = obstacleGridSize; int n = obstacleGridColSize[0]; int *dp = (int*)malloc(sizeof(int) * n); int i, j; diff --git "a/problems/0070.\347\210\254\346\245\274\346\242\257.md" "b/problems/0070.\347\210\254\346\245\274\346\242\257.md" index 14aeef0142..ed9be618d2 100644 --- "a/problems/0070.\347\210\254\346\245\274\346\242\257.md" +++ "b/problems/0070.\347\210\254\346\245\274\346\242\257.md" @@ -102,7 +102,8 @@ dp[i]: 爬到第i层楼梯,有dp[i]种方法 举例当n为5的时候,dp table(dp数组)应该是这样的 -![70.爬楼梯](https://img-blog.csdnimg.cn/20210105202546299.png) + +![70.爬楼梯](https://code-thinking-1253855093.file.myqcloud.com/pics/20210105202546299.png) 如果代码出问题了,就把dp table 打印出来,看看究竟是不是和自己推导的一样。 diff --git "a/problems/0072.\347\274\226\350\276\221\350\267\235\347\246\273.md" "b/problems/0072.\347\274\226\350\276\221\350\267\235\347\246\273.md" index 8a877d2088..0b49e3c656 100644 --- "a/problems/0072.\347\274\226\350\276\221\350\267\235\347\246\273.md" +++ "b/problems/0072.\347\274\226\350\276\221\350\267\235\347\246\273.md" @@ -169,7 +169,7 @@ for (int j = 0; j <= word2.size(); j++) dp[0][j] = j; 可以看出dp[i][j]是依赖左方,上方和左上方元素的,如图: -![72.编辑距离](https://img-blog.csdnimg.cn/20210114162113131.jpg) +![72.编辑距离](https://code-thinking-1253855093.file.myqcloud.com/pics/20210114162113131.jpg) 所以在dp矩阵中一定是从左到右从上到下去遍历。 @@ -193,7 +193,7 @@ for (int i = 1; i <= word1.size(); i++) { 以示例1为例,输入:`word1 = "horse", word2 = "ros"`为例,dp矩阵状态图如下: -![72.编辑距离1](https://img-blog.csdnimg.cn/20210114162132300.jpg) +![72.编辑距离1](https://code-thinking-1253855093.file.myqcloud.com/pics/20210114162132300.jpg) 以上动规五部分析完毕,C++代码如下: diff --git "a/problems/0077.\347\273\204\345\220\210.md" "b/problems/0077.\347\273\204\345\220\210.md" index 77ea5e80eb..9c6d481ddb 100644 --- "a/problems/0077.\347\273\204\345\220\210.md" +++ "b/problems/0077.\347\273\204\345\220\210.md" @@ -1,3 +1,4 @@ +

@@ -7,31 +8,32 @@ + # 第77题. 组合 [力扣题目链接](https://leetcode.cn/problems/combinations/ ) -给定两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数的组合。 +给定两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数的组合。 -示例: -输入: n = 4, k = 2 -输出: -[ - [2,4], - [3,4], - [2,3], - [1,2], - [1,3], - [1,4], -] +示例: +输入: n = 4, k = 2 +输出: +[ + [2,4], + [3,4], + [2,3], + [1,2], + [1,3], + [1,4], +] -# 算法公开课 +# 算法公开课 **《代码随想录》算法视频公开课:[带你学透回溯算法-组合问题(对应力扣题目:77.组合)](https://www.bilibili.com/video/BV1ti4y1L7cv),[组合问题的剪枝操作](https://www.bilibili.com/video/BV1wi4y157er),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 -# 思路 +# 思路 本题是回溯法的经典题目。 @@ -39,6 +41,7 @@ 直接的解法当然是使用for循环,例如示例中k为2,很容易想到 用两个for循环,这样就可以输出 和示例中一样的结果。 代码如下: + ```CPP int n = 4; for (int i = 1; i <= n; i++) { @@ -66,7 +69,7 @@ for (int i = 1; i <= n; i++) { **此时就会发现虽然想暴力搜索,但是用for循环嵌套连暴力都写不出来!** -咋整? +咋整? 回溯搜索法来了,虽然回溯法也是暴力,但至少能写出来,不像for循环嵌套k层让人绝望。 @@ -86,7 +89,7 @@ for (int i = 1; i <= n; i++) { 那么我把组合问题抽象为如下树形结构: -![77.组合](https://img-blog.csdnimg.cn/20201123195223940.png) +![77.组合](https://code-thinking-1253855093.file.myqcloud.com/pics/20201123195223940.png) 可以看出这棵树,一开始集合是 1,2,3,4, 从左向右取数,取过的数,不再重复取。 @@ -94,7 +97,7 @@ for (int i = 1; i <= n; i++) { **每次从集合中选取元素,可选择的范围随着选择的进行而收缩,调整可选择的范围**。 -**图中可以发现n相当于树的宽度,k相当于树的深度**。 +**图中可以发现n相当于树的宽度,k相当于树的深度**。 那么如何在这个树上遍历,然后收集到我们要的结果集呢? @@ -107,7 +110,7 @@ for (int i = 1; i <= n; i++) { ## 回溯法三部曲 -* 递归函数的返回值以及参数 +* 递归函数的返回值以及参数 在这里要定义两个全局变量,一个用来存放符合条件单一结果,一个用来存放符合条件结果的集合。 @@ -124,25 +127,25 @@ vector path; // 用来存放符合条件结果 然后还需要一个参数,为int型变量startIndex,这个参数用来记录本层递归的中,集合从哪里开始遍历(集合就是[1,...,n] )。 -为什么要有这个startIndex呢? +为什么要有这个startIndex呢? **建议在[77.组合视频讲解](https://www.bilibili.com/video/BV1ti4y1L7cv)中,07:36的时候开始听,startIndex 就是防止出现重复的组合**。 从下图中红线部分可以看出,在集合[1,2,3,4]取1之后,下一层递归,就要在[2,3,4]中取数了,那么下一层递归如何知道从[2,3,4]中取数呢,靠的就是startIndex。 -![77.组合2](https://img-blog.csdnimg.cn/20201123195328976.png) +![77.组合2](https://code-thinking-1253855093.file.myqcloud.com/pics/20201123195328976.png) -所以需要startIndex来记录下一层递归,搜索的起始位置。 +所以需要startIndex来记录下一层递归,搜索的起始位置。 那么整体代码如下: ```cpp vector> result; // 存放符合条件结果的集合 vector path; // 用来存放符合条件单一结果 -void backtracking(int n, int k, int startIndex) +void backtracking(int n, int k, int startIndex) ``` -* 回溯函数终止条件 +* 回溯函数终止条件 什么时候到达所谓的叶子节点了呢? @@ -150,7 +153,7 @@ path这个数组的大小如果达到k,说明我们找到了一个子集大小 如图红色部分: -![77.组合3](https://img-blog.csdnimg.cn/20201123195407907.png) +![77.组合3](https://code-thinking-1253855093.file.myqcloud.com/pics/20201123195407907.png) 此时用result二维数组,把path保存起来,并终止本层递归。 @@ -163,21 +166,21 @@ if (path.size() == k) { } ``` -* 单层搜索的过程 +* 单层搜索的过程 回溯法的搜索过程就是一个树型结构的遍历过程,在如下图中,可以看出for循环用来横向遍历,递归的过程是纵向遍历。 -![77.组合1](https://img-blog.csdnimg.cn/20201123195242899.png) +![77.组合1](https://code-thinking-1253855093.file.myqcloud.com/pics/20201123195242899.png) 如此我们才遍历完图中的这棵树。 -for循环每次从startIndex开始遍历,然后用path保存取到的节点i。 +for循环每次从startIndex开始遍历,然后用path保存取到的节点i。 代码如下: ```CPP for (int i = startIndex; i <= n; i++) { // 控制树的横向遍历 - path.push_back(i); // 处理节点 + path.push_back(i); // 处理节点 backtracking(n, k, i + 1); // 递归:控制树的纵向遍历,注意下一层搜索要从i+1开始 path.pop_back(); // 回溯,撤销处理的节点 } @@ -201,7 +204,7 @@ private: return; } for (int i = startIndex; i <= n; i++) { - path.push_back(i); // 处理节点 + path.push_back(i); // 处理节点 backtracking(n, k, i + 1); // 递归 path.pop_back(); // 回溯,撤销处理的节点 } @@ -216,9 +219,10 @@ public: }; ``` -还记得我们在[关于回溯算法,你该了解这些!](https://programmercarl.com/回溯算法理论基础.html)中给出的回溯法模板么? +还记得我们在[关于回溯算法,你该了解这些!](https://programmercarl.com/回溯算法理论基础.html)中给出的回溯法模板么? 如下: + ``` void backtracking(参数) { if (终止条件) { @@ -234,15 +238,15 @@ void backtracking(参数) { } ``` -**对比一下本题的代码,是不是发现有点像!** 所以有了这个模板,就有解题的大体方向,不至于毫无头绪。 +**对比一下本题的代码,是不是发现有点像!** 所以有了这个模板,就有解题的大体方向,不至于毫无头绪。 -## 总结 +## 总结 组合问题是回溯法解决的经典问题,我们开始的时候给大家列举一个很形象的例子,就是n为100,k为50的话,直接想法就需要50层for循环。 从而引出了回溯法就是解决这种k层for循环嵌套的问题。 -然后进一步把回溯法的搜索过程抽象为树形结构,可以直观的看出搜索的过程。 +然后进一步把回溯法的搜索过程抽象为树形结构,可以直观的看出搜索的过程。 接着用回溯法三部曲,逐步分析了函数参数、终止条件和单层搜索的过程。 @@ -266,7 +270,7 @@ for (int i = startIndex; i <= n; i++) { 这么说有点抽象,如图所示: -![77.组合4](https://img-blog.csdnimg.cn/20210130194335207.png) +![77.组合4](https://code-thinking-1253855093.file.myqcloud.com/pics/20210130194335207-20230310134409532.png) 图中每一个节点(图中为矩形),就代表本层的一个for循环,那么每一层的for循环从第二个数开始遍历的话,都没有意义,都是无效遍历。 @@ -275,6 +279,7 @@ for (int i = startIndex; i <= n; i++) { **如果for循环选择的起始位置之后的元素个数 已经不足 我们需要的元素个数了,那么就没有必要搜索了**。 注意代码中i,就是for循环里选择的起始位置。 + ``` for (int i = startIndex; i <= n; i++) { ``` @@ -342,6 +347,7 @@ public: ### Java: + ```java class Solution { List> result = new ArrayList<>(); @@ -370,7 +376,7 @@ class Solution { } ``` -### Python +### Python ```python class Solution(object): @@ -417,6 +423,7 @@ class Solution: ``` 剪枝: + ```python class Solution: def combine(self, n: int, k: int) -> List[List[int]]: @@ -434,7 +441,8 @@ class Solution: return res ``` -### Go +### Go + ```Go var ( path []int @@ -452,7 +460,7 @@ func dfs(n int, k int, start int) { tmp := make([]int, k) copy(tmp, path) res = append(res, tmp) - return + return } for i := start; i <= n; i++ { // 从start开始,不往回走,避免出现重复组合 if n - i + 1 < k - len(path) { // 剪枝 @@ -465,9 +473,10 @@ func dfs(n int, k int, start int) { } ``` -### javascript +### javascript 剪枝: + ```javascript let result = [] let path = [] @@ -536,6 +545,7 @@ impl Solution { ``` 剪枝 + ```Rust impl Solution { fn backtracking(result: &mut Vec>, path: &mut Vec, n: i32, k: i32, start_index: i32) { @@ -561,6 +571,7 @@ impl Solution { ``` ### C + ```c int* path; int pathTop; @@ -615,6 +626,7 @@ int** combine(int n, int k, int* returnSize, int** returnColumnSizes){ ``` 剪枝: + ```c int* path; int pathTop; @@ -701,13 +713,14 @@ func combine(_ n: Int, _ k: Int) -> [[Int]] { ### Scala 暴力: + ```scala object Solution { import scala.collection.mutable // 导包 def combine(n: Int, k: Int): List[List[Int]] = { var result = mutable.ListBuffer[List[Int]]() // 存放结果集 var path = mutable.ListBuffer[Int]() //存放符合条件的结果 - + def backtracking(n: Int, k: Int, startIndex: Int): Unit = { if (path.size == k) { // 如果path的size == k就达到题目要求,添加到结果集,并返回 @@ -720,7 +733,7 @@ object Solution { path = path.take(path.size - 1) // 回溯完再删除掉刚刚添加的数字 } } - + backtracking(n, k, 1) // 执行回溯 result.toList // 最终返回result的List形式,return关键字可以省略 } @@ -743,7 +756,7 @@ object Solution { return } // 剪枝优化 - for (i <- startIndex to (n - (k - path.size) + 1)) { + for (i <- startIndex to (n - (k - path.size) + 1)) { path.append(i) // 先把数字添加进去 backtracking(n, k, i + 1) // 进行下一步回溯 path = path.take(path.size - 1) // 回溯完再删除掉刚刚添加的数字 diff --git "a/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" "b/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" index 066e1b3329..9736549c57 100644 --- "a/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" +++ "b/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" @@ -66,7 +66,7 @@ for (int i = startIndex; i <= n; i++) { 这么说有点抽象,如图所示: -![77.组合4](https://img-blog.csdnimg.cn/20210130194335207.png) +![77.组合4](https://code-thinking-1253855093.file.myqcloud.com/pics/20210130194335207.png) 图中每一个节点(图中为矩形),就代表本层的一个for循环,那么每一层的for循环从第二个数开始遍历的话,都没有意义,都是无效遍历。 diff --git "a/problems/0078.\345\255\220\351\233\206.md" "b/problems/0078.\345\255\220\351\233\206.md" index b0c51d4496..f26d0821e9 100644 --- "a/problems/0078.\345\255\220\351\233\206.md" +++ "b/problems/0078.\345\255\220\351\233\206.md" @@ -48,7 +48,7 @@ 以示例中nums = [1,2,3]为例把求子集抽象为树型结构,如下: -![78.子集](https://img-blog.csdnimg.cn/202011232041348.png) +![78.子集](https://code-thinking.cdn.bcebos.com/pics/78.%E5%AD%90%E9%9B%86.png) 从图中红线部分,可以看出**遍历这个树的时候,把所有节点都记录下来,就是要求的子集集合**。 @@ -72,7 +72,7 @@ void backtracking(vector& nums, int startIndex) { 从图中可以看出: -![78.子集](https://img-blog.csdnimg.cn/202011232041348.png) +![78.子集](https://code-thinking.cdn.bcebos.com/pics/78.%E5%AD%90%E9%9B%86.png) 剩余集合为空的时候,就是叶子节点。 diff --git "a/problems/0090.\345\255\220\351\233\206II.md" "b/problems/0090.\345\255\220\351\233\206II.md" index a02161aa92..1a9f8fda3e 100644 --- "a/problems/0090.\345\255\220\351\233\206II.md" +++ "b/problems/0090.\345\255\220\351\233\206II.md" @@ -42,7 +42,7 @@ 用示例中的[1, 2, 2] 来举例,如图所示: (**注意去重需要先对集合排序**) -![90.子集II](https://img-blog.csdnimg.cn/20201124195411977.png) +![90.子集II](https://code-thinking-1253855093.file.myqcloud.com/pics/20201124195411977.png) 从图中可以看出,同一树层上重复取2 就要过滤掉,同一树枝上就可以重复取2,因为同一树枝上元素的集合才是唯一子集! diff --git "a/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" "b/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" index 1f99a7a5d0..9d4d59180e 100644 --- "a/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" +++ "b/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" @@ -59,7 +59,8 @@ 切割问题可以抽象为树型结构,如图: -![93.复原IP地址](https://img-blog.csdnimg.cn/20201123203735933.png) + +![93.复原IP地址](https://code-thinking-1253855093.file.myqcloud.com/pics/20201123203735933.png) ## 回溯三部曲 @@ -110,7 +111,8 @@ if (pointNum == 3) { // 逗点数量为3时,分隔结束 如果不合法就结束本层循环,如图中剪掉的分支: -![93.复原IP地址](https://img-blog.csdnimg.cn/20201123203735933.png) + +![93.复原IP地址](https://code-thinking-1253855093.file.myqcloud.com/pics/20201123203735933-20230310132314109.png) 然后就是递归和回溯的过程: diff --git "a/problems/0096.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0096.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" index 99a4b8dda3..9f41906d27 100644 --- "a/problems/0096.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" +++ "b/problems/0096.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" @@ -1,9 +1,11 @@ +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+ # 96.不同的二叉搜索树 [力扣题目链接](https://leetcode.cn/problems/unique-binary-search-trees/) @@ -12,7 +14,7 @@ 示例: -![](https://img-blog.csdnimg.cn/20210113161941835.png) +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210113161941835.png) # 算法公开课 @@ -27,11 +29,11 @@ 了解了二叉搜索树之后,我们应该先举几个例子,画画图,看看有没有什么规律,如图: -![96.不同的二叉搜索树](https://img-blog.csdnimg.cn/20210107093106367.png) +![96.不同的二叉搜索树](https://code-thinking-1253855093.file.myqcloud.com/pics/20210107093106367.png) n为1的时候有一棵树,n为2有两棵树,这个是很直观的。 -![96.不同的二叉搜索树1](https://img-blog.csdnimg.cn/20210107093129889.png) +![96.不同的二叉搜索树1](https://code-thinking-1253855093.file.myqcloud.com/pics/20210107093129889.png) 来看看n为3的时候,有哪几种情况。 @@ -65,7 +67,7 @@ dp[3],就是 元素1为头结点搜索树的数量 + 元素2为头结点搜索 如图所示: -![96.不同的二叉搜索树2](https://img-blog.csdnimg.cn/20210107093226241.png) +![96.不同的二叉搜索树2](https://code-thinking-1253855093.file.myqcloud.com/pics/20210107093226241.png) 此时我们已经找到递推关系了,那么可以用动规五部曲再系统分析一遍。 @@ -118,7 +120,7 @@ for (int i = 1; i <= n; i++) { n为5时候的dp数组状态如图: -![96.不同的二叉搜索树3](https://img-blog.csdnimg.cn/20210107093253987.png) +![96.不同的二叉搜索树3](https://code-thinking-1253855093.file.myqcloud.com/pics/20210107093253987.png) 当然如果自己画图举例的话,基本举例到n为3就可以了,n为4的时候,画图已经比较麻烦了。 @@ -168,7 +170,8 @@ public: ## 其他语言版本 -### Java +### Java + ```Java class Solution { public int numTrees(int n) { @@ -190,6 +193,7 @@ class Solution { ``` ### Python + ```python class Solution: def numTrees(self, n: int) -> int: @@ -202,6 +206,7 @@ class Solution: ``` ### Go + ```Go func numTrees(n int)int{ dp := make([]int, n+1) @@ -216,6 +221,7 @@ func numTrees(n int)int{ ``` ### Javascript + ```Javascript const numTrees =(n) => { let dp = new Array(n+1).fill(0); @@ -241,7 +247,7 @@ function numTrees(n: number): number { dp[0]: -1; 无意义; dp[1]: 1; ... - dp[i]: 2 * dp[i - 1] + + dp[i]: 2 * dp[i - 1] + (dp[1] * dp[i - 2] + dp[2] * dp[i - 3] + ... + dp[i - 2] * dp[1]); 从1加到i-2 */ const dp: number[] = []; @@ -282,7 +288,7 @@ impl Solution { int *initDP(int n) { int *dp = (int *)malloc(sizeof(int) * (n + 1)); int i; - for(i = 0; i <= n; ++i) + for(i = 0; i <= n; ++i) dp[i] = 0; return dp; } diff --git "a/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" index 93c2272cf6..95afe6805c 100644 --- "a/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" +++ "b/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" @@ -18,7 +18,7 @@ * 节点的右子树只包含大于当前节点的数。 * 所有左子树和右子树自身必须也是二叉搜索树。 -![98.验证二叉搜索树](https://img-blog.csdnimg.cn/20210203144334501.png) +![98.验证二叉搜索树](https://code-thinking-1253855093.file.myqcloud.com/pics/20230310000750.png) # 视频讲解 @@ -104,7 +104,7 @@ if (root->val > root->left->val && root->val < root->right->val) { 例如: [10,5,15,null,null,6,20] 这个case: -![二叉搜索树](https://img-blog.csdnimg.cn/20200812191501419.png) +![二叉搜索树](https://code-thinking-1253855093.file.myqcloud.com/pics/20230310000824.png) 节点10大于左节点5,小于右节点15,但右子树里出现了一个6 这就不符合了! diff --git "a/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" "b/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" index 1c2812fa64..b75e9ff2da 100644 --- "a/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" @@ -11,7 +11,7 @@ 给定一个二叉树,检查它是否是镜像对称的。 -![101. 对称二叉树](https://img-blog.csdnimg.cn/20210203144607387.png) +![101. 对称二叉树](https://code-thinking-1253855093.file.myqcloud.com/pics/20210203144607387.png) # 思路 @@ -25,7 +25,7 @@ 比较的是两个子树的里侧和外侧的元素是否相等。如图所示: -![101. 对称二叉树1](https://img-blog.csdnimg.cn/20210203144624414.png) +![101. 对称二叉树1](https://code-thinking-1253855093.file.myqcloud.com/pics/20210203144624414.png) 那么遍历的顺序应该是什么样的呢? diff --git "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" index 5c6ce488cb..26f0ae2d17 100644 --- "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" +++ "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" @@ -1,9 +1,11 @@ +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+ # 二叉树层序遍历登场! 《代码随想录》算法视频公开课:[讲透二叉树的层序遍历 | 广度优先搜索 | LeetCode:102.二叉树的层序遍历](https://www.bilibili.com/video/BV1GY4y1u7b2),相信结合视频在看本篇题解,更有助于大家对本题的理解。 @@ -35,7 +37,7 @@ 给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。 -![102.二叉树的层序遍历](https://img-blog.csdnimg.cn/20210203144842988.png) +![102.二叉树的层序遍历](https://code-thinking-1253855093.file.myqcloud.com/pics/20210203144842988.png) 思路: @@ -87,6 +89,7 @@ public: } }; ``` + ```CPP # 递归法 class Solution { @@ -108,7 +111,7 @@ public: }; ``` -java: +java: ```Java // 102.二叉树的层序遍历 @@ -168,7 +171,6 @@ python3代码: ```python - class Solution: """二叉树层序遍历迭代解法""" @@ -176,10 +178,10 @@ class Solution: results = [] if not root: return results - + from collections import deque que = deque([root]) - + while que: size = len(que) result = [] @@ -194,6 +196,7 @@ class Solution: return results ``` + ```python # 递归法 class Solution: @@ -209,7 +212,7 @@ class Solution: return res ``` -go: +go: ```go /** @@ -252,9 +255,9 @@ func levelOrder(root *TreeNode) [][]int { } queue := list.New() queue.PushBack(root) - + var tmpArr []int - + for queue.Len() > 0 { length := queue.Len() //保存当前层的长度,然后处理当前层(十分重要,防止添加下层元素影响判断层中元素的个数) for i := 0; i < length; i++ { @@ -270,7 +273,7 @@ func levelOrder(root *TreeNode) [][]int { res = append(res, tmpArr) //放入结果集 tmpArr = []int{} //清空层的数据 } - + return res } @@ -279,7 +282,7 @@ func levelOrder(root *TreeNode) [][]int { */ func levelOrder(root *TreeNode) (res [][]int) { if root == nil { - return + return } curLevel := []*TreeNode{root} // 存放当前层节点 @@ -318,7 +321,7 @@ var levelOrder = function(root) { while(queue.length !== 0) { // 记录当前层级节点数 let length = queue.length; - //存放每一层的节点 + //存放每一层的节点 let curLevel = []; for(let i = 0;i < length; i++) { let node = queue.shift(); @@ -387,7 +390,9 @@ func levelOrder(_ root: TreeNode?) -> [[Int]] { return result } ``` + Scala: + ```scala // 102.二叉树的层序遍历 object Solution { @@ -455,7 +460,7 @@ impl Solution { 给定一个二叉树,返回其节点值自底向上的层次遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历) -![107.二叉树的层次遍历II](https://img-blog.csdnimg.cn/20210203151058308.png) +![107.二叉树的层次遍历II](https://code-thinking-1253855093.file.myqcloud.com/pics/20210203151058308.png) 思路: @@ -488,6 +493,7 @@ public: } }; ``` + python代码: ```python @@ -498,10 +504,10 @@ class Solution: results = [] if not root: return results - + from collections import deque que = deque([root]) - + while que: result = [] for _ in range(len(que)): @@ -572,7 +578,7 @@ class Solution { public List> levelOrderBottom(TreeNode root) { // 利用链表可以进行 O(1) 头部插入, 这样最后答案不需要再反转 LinkedList> ans = new LinkedList<>(); - + Queue q = new LinkedList<>(); if (root != null) q.offer(root); @@ -584,9 +590,9 @@ class Solution { for (int i = 0; i < size; i ++) { TreeNode node = q.poll(); - + temp.add(node.val); - + if (node.left != null) q.offer(node.left); if (node.right != null) q.offer(node.right); @@ -616,7 +622,7 @@ func levelOrderBottom(root *TreeNode) [][]int { return res } queue.PushBack(root) - + for queue.Len() > 0 { length := queue.Len() tmp := []int{} @@ -632,12 +638,12 @@ func levelOrderBottom(root *TreeNode) [][]int { } res=append(res, tmp) } - + //反转结果集 for i:=0; i [[Int]] { Scala: + ```scala // 107.二叉树的层次遍历II object Solution { @@ -781,7 +788,7 @@ impl Solution { 给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。 -![199.二叉树的右视图](https://img-blog.csdnimg.cn/20210203151307377.png) +![199.二叉树的右视图](https://code-thinking-1253855093.file.myqcloud.com/pics/20210203151307377.png) 思路: @@ -810,6 +817,7 @@ public: } }; ``` + python代码: ```python @@ -817,7 +825,7 @@ class Solution: def rightSideView(self, root: TreeNode) -> List[int]: if not root: return [] - + # deque来自collections模块,不在力扣平台时,需要手动写入 # 'from collections import deque' 导入 # deque相比list的好处是,list的pop(0)是O(n)复杂度,deque的popleft()是O(1)复杂度 @@ -837,15 +845,15 @@ class Solution: quene.append(node.left) if node.right: quene.append(node.right) - + return out_list - + # 执行用时:36 ms, 在所有 Python3 提交中击败了89.47%的用户 # 内存消耗:14.6 MB, 在所有 Python3 提交中击败了96.65%的用户 ``` -Java: +Java: ```java // 199.二叉树的右视图 @@ -889,10 +897,9 @@ public class N0199 { } ``` -go: +go: ```GO - /** 199. 二叉树的右视图 */ @@ -932,7 +939,7 @@ var rightSideView = function(root) { //二叉树右视图 只需要把每一层最后一个节点存储到res数组 let res = [], queue = []; queue.push(root); - + while(queue.length && root!==null) { // 记录当前层级节点个数 let length = queue.length; @@ -946,7 +953,7 @@ var rightSideView = function(root) { node.right && queue.push(node.right); } } - + return res; }; ``` @@ -997,6 +1004,7 @@ func rightSideView(_ root: TreeNode?) -> [Int] { ``` Scala: + ```scala // 199.二叉树的右视图 object Solution { @@ -1060,7 +1068,7 @@ impl Solution { 给定一个非空二叉树, 返回一个由每层节点平均值组成的数组。 -![637.二叉树的层平均值](https://img-blog.csdnimg.cn/20210203151350500.png) +![637.二叉树的层平均值](https://code-thinking-1253855093.file.myqcloud.com/pics/20210203151350500.png) 思路: @@ -1103,10 +1111,10 @@ class Solution: results = [] if not root: return results - + from collections import deque que = deque([root]) - + while que: size = len(que) sum_ = 0 @@ -1124,8 +1132,7 @@ class Solution: java: -```java - +```java // 637. 二叉树的层平均值 public class N0637 { @@ -1210,7 +1217,7 @@ var averageOfLevels = function(root) { //层级平均值 let res = [], queue = []; queue.push(root); - + while(queue.length && root!==null) { //每一层节点个数 let length = queue.length; @@ -1225,7 +1232,7 @@ var averageOfLevels = function(root) { //每一层的平均值存入数组res res.push(sum/length); } - + return res; }; ``` @@ -1280,7 +1287,9 @@ func averageOfLevels(_ root: TreeNode?) -> [Double] { return result } ``` + Scala: + ```scala // 637.二叉树的层平均值 object Solution { @@ -1346,7 +1355,7 @@ impl Solution { 例如,给定一个 3叉树 : -![429. N叉树的层序遍历](https://img-blog.csdnimg.cn/20210203151439168.png) +![429. N叉树的层序遍历](https://code-thinking-1253855093.file.myqcloud.com/pics/20210203151439168.png) 返回其层序遍历: @@ -1399,10 +1408,10 @@ class Solution: results = [] if not root: return results - + from collections import deque que = deque([root]) - + while que: result = [] for _ in range(len(que)): @@ -1426,16 +1435,16 @@ class Solution: def traversal(root,depth): if len(result)==depth:result.append([]) result[depth].append(root.val) - if root.children: + if root.children: for i in range(len(root.children)):traversal(root.children[i],depth+1) - + traversal(root,0) - return result + return result ``` -java: -```java +java: +```java // 429. N 叉树的层序遍历 public class N0429 { /** @@ -1520,7 +1529,7 @@ func levelOrder(root *Node) [][]int { } res = append(res, tmp) } - + return res } ``` @@ -1532,7 +1541,7 @@ var levelOrder = function(root) { //每一层可能有2个以上,所以不再使用node.left node.right let res = [], queue = []; queue.push(root); - + while(queue.length && root!==null) { //记录每一层节点个数还是和二叉树一致 let length = queue.length; @@ -1541,7 +1550,7 @@ var levelOrder = function(root) { while(length--) { let node = queue.shift(); curLevel.push(node.val); - + //这里不再是 ndoe.left node.right 而是循坏node.children for(let item of node.children){ item && queue.push(item); @@ -1549,7 +1558,7 @@ var levelOrder = function(root) { } res.push(curLevel); } - + return res; }; ``` @@ -1602,6 +1611,7 @@ func levelOrder(_ root: Node?) -> [[Int]] { ``` Scala: + ```scala // 429.N叉树的层序遍历 object Solution { @@ -1683,7 +1693,7 @@ impl Solution { 您需要在二叉树的每一行中找到最大的值。 -![515.在每个树行中找最大值](https://img-blog.csdnimg.cn/20210203151532153.png) +![515.在每个树行中找最大值](https://code-thinking-1253855093.file.myqcloud.com/pics/20210203151532153.png) 思路: @@ -1714,6 +1724,7 @@ public: } }; ``` + python代码: ```python @@ -1734,6 +1745,7 @@ class Solution: out_list.append(max(in_list)) return out_list ``` + java代码: ```java @@ -1754,7 +1766,7 @@ class Solution { if(node.right != null) queue.offer(node.right); } result.add(max); - } + } return result; } } @@ -1811,8 +1823,8 @@ var largestValues = function(root) { //使用层序遍历 let res = [], queue = []; queue.push(root); - - while(root !== null && queue.length) { + + while(root !== null && queue.length) { //设置max初始值就是队列的第一个元素 let max = queue[0].val; let length = queue.length; @@ -1825,7 +1837,7 @@ var largestValues = function(root) { //把每一层的最大值放到res数组 res.push(max); } - + return res; }; ``` @@ -1884,6 +1896,7 @@ func largestValues(_ root: TreeNode?) -> [Int] { ``` Scala: + ```scala // 515.在每个树行中找最大值 object Solution { @@ -1959,9 +1972,9 @@ struct Node { 填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。 -初始状态下,所有 next 指针都被设置为 NULL。 +初始状态下,所有 next 指针都被设置为 NULL。 -![116.填充每个节点的下一个右侧节点指针](https://img-blog.csdnimg.cn/20210203152044855.jpg) +![116.填充每个节点的下一个右侧节点指针](https://code-thinking-1253855093.file.myqcloud.com/pics/20210203152044855.jpg) 思路: @@ -2009,24 +2022,24 @@ class Solution { public Node connect(Node root) { Queue tmpQueue = new LinkedList(); if (root != null) tmpQueue.add(root); - + while (tmpQueue.size() != 0){ int size = tmpQueue.size(); - + Node cur = tmpQueue.poll(); if (cur.left != null) tmpQueue.add(cur.left); if (cur.right != null) tmpQueue.add(cur.right); - + for (int index = 1; index < size; index++){ Node next = tmpQueue.poll(); if (next.left != null) tmpQueue.add(next.left); if (next.right != null) tmpQueue.add(next.right); - + cur.next = next; cur = next; } } - + return root; } } @@ -2067,6 +2080,7 @@ class Solution: first = first.left # 从本层扩展到下一层 return root ``` + go: ```GO @@ -2108,8 +2122,8 @@ func connect(root *Node) *Node { ``` JavaScript: -```javascript +```javascript /** * // Definition for a Node. * function Node(val, left, right, next) { @@ -2142,6 +2156,7 @@ var connect = function(root) { }; ``` + TypeScript: ```typescript @@ -2200,6 +2215,7 @@ func connect(_ root: Node?) -> Node? { ``` Scala: + ```scala // 116.填充每个节点的下一个右侧节点指针 object Solution { @@ -2228,6 +2244,7 @@ object Solution { } } ``` + # 117.填充每个节点的下一个右侧节点指针II [力扣题目链接](https://leetcode.cn/problems/populating-next-right-pointers-in-each-node-ii/) @@ -2284,7 +2301,7 @@ class Solution { int size = queue.size(); Node node = null; Node nodePre = null; - + for (int i = 0; i < size; i++) { if (i == 0) { nodePre = queue.poll(); // 取出本层头一个节点 @@ -2307,6 +2324,7 @@ class Solution { } } ``` + python代码: ```python @@ -2329,6 +2347,7 @@ class Solution: return root ``` + go: ```GO @@ -2369,6 +2388,7 @@ func connect(root *Node) *Node { ``` JavaScript: + ```javascript /** * // Definition for a Node. @@ -2401,6 +2421,7 @@ var connect = function(root) { return root; }; ``` + TypeScript: ```typescript @@ -2459,6 +2480,7 @@ func connect(_ root: Node?) -> Node? { ``` Scala: + ```scala // 117.填充每个节点的下一个右侧节点指针II object Solution { @@ -2487,6 +2509,7 @@ object Solution { } } ``` + # 104.二叉树的最大深度 [力扣题目链接](https://leetcode.cn/problems/maximum-depth-of-binary-tree/) @@ -2501,7 +2524,7 @@ object Solution { 给定二叉树 [3,9,20,null,null,15,7], -![104. 二叉树的最大深度](https://img-blog.csdnimg.cn/20210203153031914.png) +![104. 二叉树的最大深度](https://code-thinking-1253855093.file.myqcloud.com/pics/20210203153031914-20230310134849764.png) 返回它的最大深度 3 。 @@ -2511,7 +2534,7 @@ object Solution { 在二叉树中,一层一层的来遍历二叉树,记录一下遍历的层数就是二叉树的深度,如图所示: -![层序遍历](https://img-blog.csdnimg.cn/20200810193056585.png) +![层序遍历](https://code-thinking-1253855093.file.myqcloud.com/pics/20200810193056585-20230310134854803.png) 所以这道题的迭代法就是一道模板题,可以使用二叉树层序遍历的模板来解决的。 @@ -2540,7 +2563,8 @@ public: }; ``` -Java: +Java: + ```Java class Solution { public int maxDepth(TreeNode root) { @@ -2566,12 +2590,13 @@ class Solution { ``` Python: + ```python 3 class Solution: def maxDepth(self, root: TreeNode) -> int: if root == None: return 0 - + queue_ = [root] depth = 0 while queue_: @@ -2583,7 +2608,7 @@ class Solution: if cur.left: queue_.append(cur.left) if cur.right: queue_.append(cur.right) depth += 1 - + return depth ``` @@ -2623,6 +2648,7 @@ func maxDepth(root *TreeNode) int { ``` JavaScript: + ```javascript /** * Definition for a binary tree node. @@ -2700,6 +2726,7 @@ func maxDepth(_ root: TreeNode?) -> Int { ``` Scala: + ```scala // 104.二叉树的最大深度 object Solution { @@ -2789,7 +2816,8 @@ public: }; ``` -Java: +Java: + ```java class Solution { public int minDepth(TreeNode root){ @@ -2838,7 +2866,7 @@ class Solution: queue_ = [(root,1)] while queue_: cur, depth = queue_.pop(0) - + if cur.left == None and cur.right == None: return depth #先左子节点,由于左子节点没有孩子,则就是这一层了 @@ -2884,12 +2912,13 @@ func minDepth(root *TreeNode) int { } ans++//记录层数 } - + return ans+1 } ``` JavaScript: + ```javascript /** * Definition for a binary tree node. @@ -2972,6 +3001,7 @@ func minDepth(_ root: TreeNode?) -> Int { ``` Scala: + ```scala // 111.二叉树的最小深度 object Solution { diff --git "a/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" "b/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" index e54221db8c..b95e39c864 100644 --- "a/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" +++ "b/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" @@ -18,7 +18,8 @@ 示例: 给定二叉树 [3,9,20,null,null,15,7], -![104. 二叉树的最大深度](https://img-blog.csdnimg.cn/20210203153031914.png) + +![104. 二叉树的最大深度](https://code-thinking-1253855093.file.myqcloud.com/pics/20210203153031914-20230310121809902.png) 返回它的最大深度 3 。 @@ -169,7 +170,8 @@ public: 在二叉树中,一层一层的来遍历二叉树,记录一下遍历的层数就是二叉树的深度,如图所示: -![层序遍历](https://img-blog.csdnimg.cn/20200810193056585.png) + +![层序遍历](https://code-thinking-1253855093.file.myqcloud.com/pics/20200810193056585.png) 所以这道题的迭代法就是一道模板题,可以使用二叉树层序遍历的模板来解决的。 @@ -213,7 +215,7 @@ public: 例如,给定一个 3叉树 : -![559.n叉树的最大深度](https://img-blog.csdnimg.cn/2021020315313214.png) +![559.n叉树的最大深度](https://code-thinking-1253855093.file.myqcloud.com/pics/2021020315313214.png) 我们应返回其最大深度,3。 diff --git "a/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" "b/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" index 9c563619da..adb374f957 100644 --- "a/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" @@ -1,3 +1,4 @@ +

@@ -5,6 +6,7 @@

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+ 看完本文,可以一起解决如下两道题目 * 106.从中序与后序遍历序列构造二叉树 @@ -21,11 +23,11 @@ 例如,给出 -* 中序遍历 inorder = [9,3,15,20,7] +* 中序遍历 inorder = [9,3,15,20,7] * 后序遍历 postorder = [9,15,7,20,3] -返回如下的二叉树: + 返回如下的二叉树: -![106. 从中序与后序遍历序列构造二叉树1](https://img-blog.csdnimg.cn/20210203154316774.png) +![106. 从中序与后序遍历序列构造二叉树1](https://code-thinking-1253855093.file.myqcloud.com/pics/20210203154316774.png) # 视频讲解 @@ -40,7 +42,7 @@ 流程如图: -![106.从中序与后序遍历序列构造二叉树](https://img-blog.csdnimg.cn/20210203154249860.png) +![106.从中序与后序遍历序列构造二叉树](https://code-thinking-1253855093.file.myqcloud.com/pics/20210203154249860.png) 那么代码应该怎么写呢? @@ -280,6 +282,7 @@ public: 下面给出用下标索引写出的代码版本:(思路是一样的,只不过不用重复定义vector了,每次用下标索引来分割) ### C++优化版本 + ```CPP class Solution { private: @@ -397,7 +400,7 @@ public: }; ``` -## Python +## Python # 105.从前序与中序遍历序列构造二叉树 @@ -411,11 +414,11 @@ public: 例如,给出 -前序遍历 preorder = [3,9,20,15,7] +前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = [9,3,15,20,7] 返回如下的二叉树: -![105. 从前序与中序遍历序列构造二叉树](https://img-blog.csdnimg.cn/20210203154626672.png) +![105. 从前序与中序遍历序列构造二叉树](https://code-thinking-1253855093.file.myqcloud.com/pics/20210203154626672.png) ## 思路 @@ -558,7 +561,7 @@ public: 举一个例子: -![106.从中序与后序遍历序列构造二叉树2](https://img-blog.csdnimg.cn/20210203154720326.png) +![106.从中序与后序遍历序列构造二叉树2](https://code-thinking-1253855093.file.myqcloud.com/pics/20210203154720326.png) tree1 的前序遍历是[1 2 3], 后序遍历是[3 2 1]。 @@ -601,7 +604,7 @@ class Solution { return findNode(inorder, 0, inorder.length, postorder,0, postorder.length); // 前闭后开 } - + public TreeNode findNode(int[] inorder, int inBegin, int inEnd, int[] postorder, int postBegin, int postEnd) { // 参数里的范围都是前闭后开 if (inBegin >= inEnd || postBegin >= postEnd) { // 不满足左闭右开,说明没有元素,返回空树 @@ -642,7 +645,7 @@ class Solution { int rootIndex = map.get(preorder[preBegin]); // 找到前序遍历的第一个元素在中序遍历中的位置 TreeNode root = new TreeNode(inorder[rootIndex]); // 构造结点 int lenOfLeft = rootIndex - inBegin; // 保存中序左子树个数,用来确定前序数列的个数 - root.left = findNode(preorder, preBegin + 1, preBegin + lenOfLeft + 1, + root.left = findNode(preorder, preBegin + 1, preBegin + lenOfLeft + 1, inorder, inBegin, rootIndex); root.right = findNode(preorder, preBegin + lenOfLeft + 1, preEnd, inorder, rootIndex + 1, inEnd); @@ -652,18 +655,19 @@ class Solution { } ``` -## Python +## Python + ```python class Solution: def buildTree(self, inorder: List[int], postorder: List[int]) -> Optional[TreeNode]: # 第一步: 特殊情况讨论: 树为空. 或者说是递归终止条件 if not postorder: - return + return # 第二步: 后序遍历的最后一个就是当前的中间节点 root_val = postorder[-1] root = TreeNode(root_val) - + # 第三步: 找切割点. root_index = inorder.index(root_val) @@ -672,7 +676,7 @@ class Solution: right_inorder = inorder[root_index + 1:] # 第五步: 切割postorder数组. 得到postorder数组的左,右半边. - # ⭐️ 重点1: 中序数组大小一定跟后序数组大小是相同的. + # ⭐️ 重点1: 中序数组大小一定跟后序数组大小是相同的. left_postorder = postorder[:len(left_inorder)] right_postorder = postorder[len(left_inorder): len(postorder) - 1] @@ -682,7 +686,7 @@ class Solution: root.right = self.buildTree(right_inorder, right_postorder) # 第七步: 返回答案 - return root + return root ``` 105.从前序与中序遍历序列构造二叉树 @@ -691,22 +695,22 @@ class Solution: class Solution: def buildTree(self, preorder: List[int], inorder: List[int]) -> TreeNode: # 第一步: 特殊情况讨论: 树为空. 或者说是递归终止条件 - if not preorder: + if not preorder: return None - # 第二步: 前序遍历的第一个就是当前的中间节点. + # 第二步: 前序遍历的第一个就是当前的中间节点. root_val = preorder[0] root = TreeNode(root_val) - # 第三步: 找切割点. + # 第三步: 找切割点. separator_idx = inorder.index(root_val) - # 第四步: 切割inorder数组. 得到inorder数组的左,右半边. + # 第四步: 切割inorder数组. 得到inorder数组的左,右半边. inorder_left = inorder[:separator_idx] inorder_right = inorder[separator_idx + 1:] # 第五步: 切割preorder数组. 得到preorder数组的左,右半边. - # ⭐️ 重点1: 中序数组大小一定跟前序数组大小是相同的. + # ⭐️ 重点1: 中序数组大小一定跟前序数组大小是相同的. preorder_left = preorder[1:1 + len(inorder_left)] preorder_right = preorder[1 + len(inorder_left):] @@ -723,22 +727,22 @@ class Solution: class Solution: def buildTree(self, inorder: List[int], postorder: List[int]) -> TreeNode: # 第一步: 特殊情况讨论: 树为空. (递归终止条件) - if not postorder: + if not postorder: return None - # 第二步: 后序遍历的最后一个就是当前的中间节点. + # 第二步: 后序遍历的最后一个就是当前的中间节点. root_val = postorder[-1] root = TreeNode(root_val) - # 第三步: 找切割点. + # 第三步: 找切割点. separator_idx = inorder.index(root_val) - # 第四步: 切割inorder数组. 得到inorder数组的左,右半边. + # 第四步: 切割inorder数组. 得到inorder数组的左,右半边. inorder_left = inorder[:separator_idx] inorder_right = inorder[separator_idx + 1:] # 第五步: 切割postorder数组. 得到postorder数组的左,右半边. - # ⭐️ 重点1: 中序数组大小一定跟后序数组大小是相同的. + # ⭐️ 重点1: 中序数组大小一定跟后序数组大小是相同的. postorder_left = postorder[:len(inorder_left)] postorder_right = postorder[len(inorder_left): len(postorder) - 1] @@ -746,7 +750,7 @@ class Solution: root.left = self.buildTree(inorder_left, postorder_left) root.right = self.buildTree(inorder_right, postorder_right) - return root + return root ``` ## Go @@ -786,7 +790,7 @@ func rebuild(inorder []int, postorder []int, rootIdx int, l, r int) *TreeNode { rootIn := hash[rootV] // 找到根节点在对应的中序数组中的位置 root := &TreeNode{Val : rootV} // 构造根节点 // 重建左节点和右节点 - root.Left = rebuild(inorder, postorder, rootIdx-(r-rootIn)-1, l, rootIn-1) + root.Left = rebuild(inorder, postorder, rootIdx-(r-rootIn)-1, l, rootIn-1) root.Right = rebuild(inorder, postorder, rootIdx-1, rootIn+1, r) return root } @@ -830,7 +834,7 @@ func build(pre []int, in []int, root int, l, r int) *TreeNode { -## JavaScript +## JavaScript ```javascript var buildTree = function(inorder, postorder) { @@ -1031,7 +1035,7 @@ struct TreeNode* buildTree(int* preorder, int preorderSize, int* inorder, int in // 4.根据中序遍历数组左右数组的各子大小切割前序遍历数组。也分为左右数组 int* leftPreorder = preorder+1; - int* rightPreorder = preorder + 1 + leftNum; + int* rightPreorder = preorder + 1 + leftNum; // 5.递归进入左右数组,将返回的结果作为根结点的左右孩子 root->left = buildTree(leftPreorder, leftNum, leftInorder, leftNum); @@ -1056,26 +1060,26 @@ class Solution { inorderBegin: 0, inorderEnd: inorder.count) } - + func helper(preorder: [Int], preorderBegin: Int, preorderEnd: Int, inorder: [Int], inorderBegin: Int, inorderEnd: Int) -> TreeNode? { if preorderBegin == preorderEnd { return nil } - + // 前序遍历数组的第一个元素作为分割点 let rootValue = preorder[preorderBegin] let root = TreeNode(rootValue) - - + + if preorderEnd - preorderBegin == 1 { return root } - + var index = 0 // 从中序遍历数组中找到根节点的下标 if let ind = inorder.firstIndex(of: rootValue) { index = ind } - + // 递归 root.left = helper(preorder: preorder, preorderBegin: preorderBegin + 1, @@ -1102,28 +1106,28 @@ class Solution_0106 { if postorderEnd - postorderBegin < 1 { return nil } - + // 后序遍历数组的最后一个元素作为分割点 let rootValue = postorder[postorderEnd - 1] let root = TreeNode(rootValue) - + if postorderEnd - postorderBegin == 1 { return root } - + // 从中序遍历数组中找到根节点的下标 var delimiterIndex = 0 if let index = inorder.firstIndex(of: rootValue) { delimiterIndex = index } - + root.left = buildTree(inorder: inorder, inorderBegin: inorderBegin, inorderEnd: delimiterIndex, postorder: postorder, postorderBegin: postorderBegin, postorderEnd: postorderBegin + (delimiterIndex - inorderBegin)) - + root.right = buildTree(inorder: inorder, inorderBegin: delimiterIndex + 1, inorderEnd: inorderEnd, diff --git "a/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" index f0455a834f..89778421d1 100644 --- "a/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" +++ "b/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" @@ -17,7 +17,8 @@ 示例: -![108.将有序数组转换为二叉搜索树](https://img-blog.csdnimg.cn/20201022164420763.png) + +![108.将有序数组转换为二叉搜索树](https://code-thinking-1253855093.file.myqcloud.com/pics/20201022164420763.png) # 算法公开课 diff --git "a/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" "b/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" index 492e25d9a5..804c95eb27 100644 --- "a/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" @@ -1,3 +1,4 @@ +

@@ -5,6 +6,7 @@

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+ > 求高度还是求深度,你搞懂了不? # 110.平衡二叉树 @@ -13,13 +15,13 @@ 给定一个二叉树,判断它是否是高度平衡的二叉树。 -本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。 +本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。 示例 1: 给定二叉树 [3,9,20,null,null,15,7] -![110.平衡二叉树](https://img-blog.csdnimg.cn/2021020315542230.png) +![110.平衡二叉树](https://code-thinking-1253855093.file.myqcloud.com/pics/2021020315542230.png) 返回 true 。 @@ -27,7 +29,7 @@ 给定二叉树 [1,2,2,3,3,null,null,4,4] -![110.平衡二叉树1](https://img-blog.csdnimg.cn/20210203155447919.png) +![110.平衡二叉树1](https://code-thinking-1253855093.file.myqcloud.com/pics/20210203155447919.png) 返回 false 。 @@ -45,7 +47,7 @@ 但leetcode中强调的深度和高度很明显是按照节点来计算的,如图: -![110.平衡二叉树2](https://img-blog.csdnimg.cn/20210203155515650.png) +![110.平衡二叉树2](https://code-thinking-1253855093.file.myqcloud.com/pics/20210203155515650.png) 关于根节点的深度究竟是1 还是 0,不同的地方有不一样的标准,leetcode的题目中都是以节点为一度,即根节点深度是1。但维基百科上定义用边为一度,即根节点的深度是0,我们暂时以leetcode为准(毕竟要在这上面刷题)。 @@ -125,7 +127,7 @@ public: 1. 明确递归函数的参数和返回值 -参数:当前传入节点。 +参数:当前传入节点。 返回值:以当前传入节点为根节点的树的高度。 那么如何标记左右子树是否差值大于1呢? @@ -496,9 +498,10 @@ class Solution { } ``` -### Python +### Python 递归法: + ```python # Definition for a binary tree node. # class TreeNode: @@ -512,7 +515,7 @@ class Solution: return True else: return False - + def get_height(self, root: TreeNode) -> int: # Base Case if not root: @@ -531,6 +534,7 @@ class Solution: ``` 迭代法: + ```python class Solution: def isBalanced(self, root: Optional[TreeNode]) -> bool: @@ -557,9 +561,10 @@ class Solution: ### Go + ```Go func isBalanced(root *TreeNode) bool { - h := getHeight(root) + h := getHeight(root) if h == -1 { return false } @@ -588,7 +593,9 @@ func max(a, b int) int { ``` ### JavaScript -递归法: + +递归法: + ```javascript var isBalanced = function(root) { //还是用递归三部曲 + 后序遍历 左右中 当前左子树右子树高度相差大于1就返回-1 @@ -614,6 +621,7 @@ var isBalanced = function(root) { ``` 迭代法: + ```javascript // 获取当前节点的高度 var getHeight = function (curNode) { @@ -644,7 +652,7 @@ var isBalanced = function (root) { let queue = [root]; while (queue.length) { let node = queue[queue.length - 1]; // 取出栈顶 - queue.pop(); + queue.pop(); if (Math.abs(getHeight(node.left) - getHeight(node.right)) > 1) { return false; } @@ -676,6 +684,7 @@ function isBalanced(root: TreeNode | null): boolean { ### C 递归法: + ```c int getDepth(struct TreeNode* node) { //如果结点不存在,返回0 @@ -706,6 +715,7 @@ bool isBalanced(struct TreeNode* root) { ``` 迭代法: + ```c //计算结点深度 int getDepth(struct TreeNode* node) { @@ -717,7 +727,7 @@ int getDepth(struct TreeNode* node) { stack[stackTop++] = node; int result = 0; int depth = 0; - + //当栈中有元素时,进行迭代遍历 while(stackTop) { //取出栈顶元素 @@ -741,7 +751,7 @@ int getDepth(struct TreeNode* node) { tempNode = stack[--stackTop]; depth--; } - } + } return result; } @@ -750,11 +760,11 @@ bool isBalanced(struct TreeNode* root){ //开辟栈空间 struct TreeNode** stack = (struct TreeNode**)malloc(sizeof(struct TreeNode*) * 10000); int stackTop = 0; - + //若根节点不存在,返回True if(!root) return 1; - + //将根节点入栈 stack[stackTop++] = root; //当栈中有元素时,进行遍历 @@ -764,7 +774,7 @@ bool isBalanced(struct TreeNode* root){ //计算左右子树的深度 int diff = getDepth(node->right) - getDepth(node->left); //若深度的绝对值大于1,返回False - if(diff > 1 || diff < -1) + if(diff > 1 || diff < -1) return 0; //如果栈顶结点有左右结点,将左右结点入栈 if(node->left) @@ -780,6 +790,7 @@ bool isBalanced(struct TreeNode* root){ ### Swift: >递归 + ```swift func isBalanced(_ root: TreeNode?) -> Bool { // -1 已经不是平衡二叉树 diff --git "a/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" "b/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" index cbe7b7ecad..de36c6f25a 100644 --- "a/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" +++ "b/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" @@ -21,7 +21,8 @@ 给定二叉树 [3,9,20,null,null,15,7], -![111.二叉树的最小深度1](https://img-blog.csdnimg.cn/2021020315582586.png) + +![111.二叉树的最小深度1](https://code-thinking-1253855093.file.myqcloud.com/pics/2021020315582586.png) 返回它的最小深度 2. @@ -45,7 +46,7 @@ 本题还有一个误区,在处理节点的过程中,最大深度很容易理解,最小深度就不那么好理解,如图: -![111.二叉树的最小深度](https://img-blog.csdnimg.cn/20210203155800503.png) +![111.二叉树的最小深度](https://code-thinking.cdn.bcebos.com/pics/111.%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E6%9C%80%E5%B0%8F%E6%B7%B1%E5%BA%A6.png) 这就重新审题了,题目中说的是:**最小深度是从根节点到最近叶子节点的最短路径上的节点数量。**,注意是**叶子节点**。 @@ -87,7 +88,7 @@ return result; 这个代码就犯了此图中的误区: -![111.二叉树的最小深度](https://img-blog.csdnimg.cn/20210203155800503.png) +![111.二叉树的最小深度](https://code-thinking.cdn.bcebos.com/pics/111.%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E6%9C%80%E5%B0%8F%E6%B7%B1%E5%BA%A6.png) 如果这么求的话,没有左孩子的分支会算为最短深度。 diff --git "a/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" "b/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" index b1f0133663..e412d38e4e 100644 --- "a/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" +++ "b/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" @@ -1,18 +1,20 @@ +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+ # 112. 路径总和 [力扣题目链接](https://leetcode.cn/problems/path-sum/) 给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和。 -说明: 叶子节点是指没有子节点的节点。 +说明: 叶子节点是指没有子节点的节点。 -示例:  +示例: 给定如下二叉树,以及目标和 sum = 22, ![112.路径总和1](https://img-blog.csdnimg.cn/20210203160355234.png) @@ -53,7 +55,7 @@ 如图所示: -![112.路径总和](https://img-blog.csdnimg.cn/2021020316051216.png) +![112.路径总和](https://code-thinking-1253855093.file.myqcloud.com/pics/2021020316051216.png) 图中可以看出,遍历的路线,并不要遍历整棵树,所以递归函数需要返回值,可以用bool类型表示。 @@ -222,13 +224,13 @@ public: 给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径。 -说明: 叶子节点是指没有子节点的节点。 +说明: 叶子节点是指没有子节点的节点。 示例: -给定如下二叉树,以及目标和 sum = 22, +给定如下二叉树,以及目标和 sum = 22, -![113.路径总和ii1.png](https://img-blog.csdnimg.cn/20210203160854654.png) +![113.路径总和ii1.png](https://code-thinking-1253855093.file.myqcloud.com/pics/20210203160854654.png) ## 思路 @@ -237,7 +239,7 @@ public: 如图: -![113.路径总和ii](https://img-blog.csdnimg.cn/20210203160922745.png) +![113.路径总和ii](https://code-thinking-1253855093.file.myqcloud.com/pics/20210203160922745.png) 为了尽可能的把细节体现出来,我写出如下代码(**这份代码并不简洁,但是逻辑非常清晰**) @@ -303,6 +305,7 @@ public: ## java ### 0112.路径总和 + ```java class solution { public boolean haspathsum(treenode root, int targetsum) { @@ -333,9 +336,9 @@ class solution { // lc112 简洁方法 class solution { public boolean haspathsum(treenode root, int targetsum) { - + if (root == null) return false; // 为空退出 - + // 叶子节点判断是否符合 if (root.left == null && root.right == null) return root.val == targetsum; @@ -344,7 +347,9 @@ class solution { } } ``` + 迭代 + ```java class solution { public boolean haspathsum(treenode root, int targetsum) { @@ -363,7 +368,7 @@ class solution { // 如果该节点是叶子节点了,同时该节点的路径数值等于sum,那么就返回true if(node.left == null && node.right == null && sum == targetsum) { return true; - } + } // 右节点,压进去一个节点的时候,将该节点的路径数值也记录下来 if(node.right != null){ stack1.push(node.right); @@ -377,7 +382,7 @@ class solution { } } return false; - } + } } ``` @@ -447,6 +452,7 @@ class Solution { ### 0112.路径总和 **递归** + ```python class solution: def haspathsum(self, root: treenode, targetsum: int) -> bool: @@ -472,55 +478,57 @@ class solution: ``` **迭代 - 层序遍历** + ```python class solution: def haspathsum(self, root: treenode, targetsum: int) -> bool: - if not root: + if not root: return false stack = [] # [(当前节点,路径数值), ...] stack.append((root, root.val)) - while stack: + while stack: cur_node, path_sum = stack.pop() - if not cur_node.left and not cur_node.right and path_sum == targetsum: + if not cur_node.left and not cur_node.right and path_sum == targetsum: return true - if cur_node.right: - stack.append((cur_node.right, path_sum + cur_node.right.val)) + if cur_node.right: + stack.append((cur_node.right, path_sum + cur_node.right.val)) - if cur_node.left: + if cur_node.left: stack.append((cur_node.left, path_sum + cur_node.left.val)) return false ``` -### 0113.路径总和-ii +### 0113.路径总和-ii **递归** + ```python class solution: def pathsum(self, root: treenode, targetsum: int) -> list[list[int]]: - def traversal(cur_node, remain): + def traversal(cur_node, remain): if not cur_node.left and not cur_node.right: - if remain == 0: + if remain == 0: result.append(path[:]) return - if cur_node.left: + if cur_node.left: path.append(cur_node.left.val) traversal(cur_node.left, remain-cur_node.left.val) path.pop() - if cur_node.right: + if cur_node.right: path.append(cur_node.right.val) traversal(cur_node.right, remain-cur_node.right.val) path.pop() result, path = [], [] - if not root: + if not root: return [] path.append(root.val) traversal(root, targetsum - root.val) @@ -528,6 +536,7 @@ class solution: ``` **迭代法,用第二个队列保存目前的总和与路径** + ```python class Solution: def pathSum(self, root: Optional[TreeNode], targetSum: int) -> List[List[int]]: @@ -569,7 +578,7 @@ func hasPathSum(root *TreeNode, targetSum int) bool { if root == nil { return false } - + targetSum -= root.Val // 将targetSum在遍历每层的时候都减去本层节点的值 if root.Left == nil && root.Right == nil && targetSum == 0 { // 如果剩余的targetSum为0, 则正好就是符合的结果 return true @@ -602,10 +611,10 @@ func traverse(node *TreeNode, result *[][]int, currPath *[]int, targetSum int) { targetSum -= node.Val // 将targetSum在遍历每层的时候都减去本层节点的值 *currPath = append(*currPath, node.Val) // 把当前节点放到路径记录里 - + if node.Left == nil && node.Right == nil && targetSum == 0 { // 如果剩余的targetSum为0, 则正好就是符合的结果 // 不能直接将currPath放到result里面, 因为currPath是共享的, 每次遍历子树时都会被修改 - pathCopy := make([]int, len(*currPath)) + pathCopy := make([]int, len(*currPath)) for i, element := range *currPath { pathCopy[i] = element } @@ -623,6 +632,7 @@ func traverse(node *TreeNode, result *[][]int, currPath *[]int, targetSum int) { ### 0112.路径总和 **递归** + ```javascript /** * @param {treenode} root @@ -639,7 +649,7 @@ let haspathsum = function (root, targetsum) { // 左(空节点不遍历).遇到叶子节点返回true,则直接返回true if (node.left && traversal(node.left, cnt - node.left.val)) return true; - // 右(空节点不遍历) + // 右(空节点不遍历) if (node.right && traversal(node.right, cnt - node.right.val)) return true; return false; }; @@ -652,7 +662,9 @@ let haspathsum = function (root, targetsum) { // return haspathsum(root.left, targetsum - root.val) || haspathsum(root.right, targetsum - root.val); }; ``` + **迭代** + ```javascript let hasPathSum = function(root, targetSum) { if(root === null) return false; @@ -681,9 +693,10 @@ let hasPathSum = function(root, targetSum) { }; ``` -### 0113.路径总和-ii +### 0113.路径总和-ii **递归** + ```javascript let pathsum = function (root, targetsum) { // 递归法 @@ -715,7 +728,9 @@ let pathsum = function (root, targetsum) { return res; }; ``` + **递归 精简版** + ```javascript var pathsum = function(root, targetsum) { //递归方法 @@ -739,7 +754,9 @@ var pathsum = function(root, targetsum) { return resPath; }; ``` + **迭代** + ```javascript let pathSum = function(root, targetSum) { if(root === null) return []; @@ -905,7 +922,7 @@ func hasPathSum(_ root: TreeNode?, _ targetSum: Int) -> Bool { guard let root = root else { return false } - + return traversal(root, targetSum - root.val) } @@ -913,52 +930,54 @@ func traversal(_ cur: TreeNode?, _ count: Int) -> Bool { if cur?.left == nil && cur?.right == nil && count == 0 { return true } - + if cur?.left == nil && cur?.right == nil { return false } - + if let leftNode = cur?.left { if traversal(leftNode, count - leftNode.val) { return true } } - + if let rightNode = cur?.right { if traversal(rightNode, count - rightNode.val) { return true } } - + return false } ``` + **迭代** + ```swift func hasPathSum(_ root: TreeNode?, _ targetSum: Int) -> Bool { guard let root = root else { return false } - + var stack = Array<(TreeNode, Int)>() stack.append((root, root.val)) - + while !stack.isEmpty { let node = stack.removeLast() - + if node.0.left == nil && node.0.right == nil && targetSum == node.1 { return true } - + if let rightNode = node.0.right { stack.append((rightNode, node.1 + rightNode.val)) } - + if let leftNode = node.0.left { stack.append((leftNode, node.1 + leftNode.val)) } } - + return false } ``` @@ -989,12 +1008,12 @@ func traversal(_ cur: TreeNode?, count: Int) { result.append(path) return } - + // 遇到叶子节点而没有找到合适的边,直接返回 if cur?.left == nil && cur?.right == nil{ return } - + if let leftNode = cur?.left { path.append(leftNode.val) count -= leftNode.val @@ -1002,7 +1021,7 @@ func traversal(_ cur: TreeNode?, count: Int) { count += leftNode.val// 回溯 path.removeLast()// 回溯 } - + if let rightNode = cur?.right { path.append(rightNode.val) count -= rightNode.val @@ -1015,8 +1034,10 @@ func traversal(_ cur: TreeNode?, count: Int) { ``` ## C + > 0112.路径总和 -递归法: +> 递归法: + ```c bool hasPathSum(struct TreeNode* root, int targetSum){ // 递归结束条件:若当前节点不存在,返回false @@ -1025,13 +1046,14 @@ bool hasPathSum(struct TreeNode* root, int targetSum){ // 若当前节点为叶子节点,且targetSum-root的值为0。(当前路径上的节点值的和满足条件)返回true if(!root->right && !root->left && targetSum == root->val) return true; - + // 查看左子树和右子树的所有节点是否满足条件 return hasPathSum(root->right, targetSum - root->val) || hasPathSum(root->left, targetSum - root->val); } ``` 迭代法: + ```c // 存储一个节点以及当前的和 struct Pair { @@ -1056,7 +1078,7 @@ bool hasPathSum(struct TreeNode* root, int targetSum){ // 若栈顶元素为叶子节点,且和为targetSum时,返回true if(!topPair.node->left && !topPair.node->right && topPair.sum == targetSum) return true; - + // 若当前栈顶节点有左右孩子,计算和并入栈 if(topPair.node->left) { struct Pair newPair = {topPair.node->left, topPair.sum + topPair.node->left->val}; @@ -1070,7 +1092,9 @@ bool hasPathSum(struct TreeNode* root, int targetSum){ return false; } ``` + > 0113.路径总和 II + ```c int** ret; int* path; @@ -1139,6 +1163,7 @@ int** pathSum(struct TreeNode* root, int targetSum, int* returnSize, int** retur ### 0112.路径总和 **递归:** + ```scala object Solution { def hasPathSum(root: TreeNode, targetSum: Int): Boolean = { @@ -1163,6 +1188,7 @@ object Solution { ``` **迭代:** + ```scala object Solution { import scala.collection.mutable @@ -1187,6 +1213,7 @@ object Solution { ### 0113.路径总和 II **递归:** + ```scala object Solution { import scala.collection.mutable.ListBuffer diff --git "a/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" "b/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" index 8736c9f375..5b398f3fc7 100644 --- "a/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" +++ "b/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" @@ -127,7 +127,8 @@ dp[0][1]表示第0天不持有股票,不持有股票那么现金就是0,所 以示例1,输入:[7,1,5,3,6,4]为例,dp数组状态如下: -![121.买卖股票的最佳时机](https://img-blog.csdnimg.cn/20210224225642465.png) + +![121.买卖股票的最佳时机](https://code-thinking-1253855093.file.myqcloud.com/pics/20210224225642465.png) dp[5][1]就是最终结果。 diff --git "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" index d094da488e..29242be3db 100644 --- "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" +++ "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" @@ -62,7 +62,8 @@ 如图: -![122.买卖股票的最佳时机II](https://img-blog.csdnimg.cn/2020112917480858.png) + +![122.买卖股票的最佳时机II](https://code-thinking-1253855093.file.myqcloud.com/pics/2020112917480858-20230310134659477.png) 一些同学陷入:第一天怎么就没有利润呢,第一天到底算不算的困惑中。 diff --git "a/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" "b/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" index 3cd7ab26f8..33157238ac 100644 --- "a/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" +++ "b/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" @@ -116,7 +116,8 @@ dp[i][4] = max(dp[i - 1][4], dp[i - 1][3] + prices[i]); 以输入[1,2,3,4,5]为例 -![123.买卖股票的最佳时机III](https://img-blog.csdnimg.cn/20201228181724295.png) + +![123.买卖股票的最佳时机III](https://code-thinking-1253855093.file.myqcloud.com/pics/20201228181724295-20230310134201291.png) 大家可以看到红色框为最后两次卖出的状态。 diff --git "a/problems/0132.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262II.md" "b/problems/0132.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262II.md" index 24cf43ae31..eb0e39fb5a 100644 --- "a/problems/0132.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262II.md" +++ "b/problems/0132.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262II.md" @@ -163,7 +163,7 @@ for (int i = s.size() - 1; i >= 0; i--) { 以输入:"aabc" 为例: -![132.分割回文串II](https://img-blog.csdnimg.cn/20210124182218844.jpg) +![132.分割回文串II](https://code-thinking-1253855093.file.myqcloud.com/pics/20210124182218844.jpg) 以上分析完毕,代码如下: diff --git "a/problems/0135.\345\210\206\345\217\221\347\263\226\346\236\234.md" "b/problems/0135.\345\210\206\345\217\221\347\263\226\346\236\234.md" index 1a2fe92a5d..181f24e98e 100644 --- "a/problems/0135.\345\210\206\345\217\221\347\263\226\346\236\234.md" +++ "b/problems/0135.\345\210\206\345\217\221\347\263\226\346\236\234.md" @@ -53,7 +53,8 @@ for (int i = 1; i < ratings.size(); i++) { 如图: -![135.分发糖果](https://img-blog.csdnimg.cn/20201117114916878.png) + +![135.分发糖果](https://code-thinking-1253855093.file.myqcloud.com/pics/20201117114916878.png) 再确定左孩子大于右孩子的情况(从后向前遍历) @@ -78,7 +79,8 @@ for (int i = 1; i < ratings.size(); i++) { 如图: -![135.分发糖果1](https://img-blog.csdnimg.cn/20201117115658791.png) + +![135.分发糖果1](https://code-thinking-1253855093.file.myqcloud.com/pics/20201117115658791.png) 所以该过程代码如下: diff --git "a/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" "b/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" index 2148971d51..edb2c65ad6 100644 --- "a/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" +++ "b/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" @@ -181,7 +181,8 @@ dp[0]表示如果字符串为空的话,说明出现在字典里。 以输入: s = "leetcode", wordDict = ["leet", "code"]为例,dp状态如图: -![139.单词拆分](https://img-blog.csdnimg.cn/20210202162652727.jpg) + +![139.单词拆分](https://code-thinking-1253855093.file.myqcloud.com/pics/20210202162652727.jpg) dp[s.size()]就是最终结果。 diff --git "a/problems/0142.\347\216\257\345\275\242\351\223\276\350\241\250II.md" "b/problems/0142.\347\216\257\345\275\242\351\223\276\350\241\250II.md" index 7f944345f2..8a48c7d5f6 100644 --- "a/problems/0142.\347\216\257\345\275\242\351\223\276\350\241\250II.md" +++ "b/problems/0142.\347\216\257\345\275\242\351\223\276\350\241\250II.md" @@ -1,3 +1,4 @@ +

@@ -6,6 +7,7 @@ + > 找到有没有环已经很不容易了,还要让我找到环的入口? @@ -14,13 +16,13 @@ [力扣题目链接](https://leetcode.cn/problems/linked-list-cycle-ii/) 题意: -给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 +给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 为了表示给定链表中的环,使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。 **说明**:不允许修改给定的链表。 -![循环链表](https://img-blog.csdnimg.cn/20200816110112704.png) +![循环链表](https://code-thinking-1253855093.file.myqcloud.com/pics/20200816110112704.png) ## 思路 @@ -48,7 +50,7 @@ 会发现最终都是这种情况, 如下图: -![142环形链表1](https://img-blog.csdnimg.cn/20210318162236720.png) +![142环形链表1](https://code-thinking-1253855093.file.myqcloud.com/pics/20210318162236720.png) fast和slow各自再走一步, fast和slow就相遇了 @@ -149,20 +151,20 @@ public: 即文章[链表:环找到了,那入口呢?](https://programmercarl.com/0142.环形链表II.html)中如下的地方: -![142环形链表5](https://img-blog.csdnimg.cn/20210318165123581.png) +![142环形链表5](https://code-thinking-1253855093.file.myqcloud.com/pics/20210318165123581.png) 首先slow进环的时候,fast一定是先进环来了。 如果slow进环入口,fast也在环入口,那么把这个环展开成直线,就是如下图的样子: -![142环形链表3](https://img-blog.csdnimg.cn/2021031816503266.png) +![142环形链表3](https://code-thinking-1253855093.file.myqcloud.com/pics/2021031816503266.png) 可以看出如果slow 和 fast同时在环入口开始走,一定会在环入口3相遇,slow走了一圈,fast走了两圈。 重点来了,slow进环的时候,fast一定是在环的任意一个位置,如图: -![142环形链表4](https://img-blog.csdnimg.cn/2021031816515727.png) +![142环形链表4](https://code-thinking-1253855093.file.myqcloud.com/pics/2021031816515727.png) 那么fast指针走到环入口3的时候,已经走了k + n 个节点,slow相应的应该走了(k + n) / 2 个节点。 @@ -187,6 +189,7 @@ public: Java: + ```java public class Solution { public ListNode detectCycle(ListNode head) { @@ -235,6 +238,7 @@ class Solution: ``` Go: + ```go func detectCycle(head *ListNode) *ListNode { slow, fast := head, head @@ -267,7 +271,7 @@ var detectCycle = function(head) { let slow =head.next, fast = head.next.next; while(fast && fast.next && fast!== slow) { slow = slow.next; - fast = fast.next.next; + fast = fast.next.next; } if(!fast || !fast.next ) return null; slow = head; @@ -374,6 +378,7 @@ ListNode *detectCycle(ListNode *head) { ``` Scala: + ```scala object Solution { def detectCycle(head: ListNode): ListNode = { diff --git "a/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" "b/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" index 695fac35a2..4fdd7bf40c 100644 --- "a/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" +++ "b/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" @@ -129,7 +129,7 @@ for (int j = 1; j < 2 * k; j += 2) { 以输入[1,2,3,4,5],k=2为例。 -![188.买卖股票的最佳时机IV](https://img-blog.csdnimg.cn/20201229100358221.png) +![188.买卖股票的最佳时机IV](https://code-thinking-1253855093.file.myqcloud.com/pics/20201229100358221.png) 最后一次卖出,一定是利润最大的,dp[prices.size() - 1][2 * k]即红色部分就是最后求解。 diff --git "a/problems/0198.\346\211\223\345\256\266\345\212\253\350\210\215.md" "b/problems/0198.\346\211\223\345\256\266\345\212\253\350\210\215.md" index 6002cd3a48..fdb2dabf5f 100644 --- "a/problems/0198.\346\211\223\345\256\266\345\212\253\350\210\215.md" +++ "b/problems/0198.\346\211\223\345\256\266\345\212\253\350\210\215.md" @@ -85,7 +85,7 @@ for (int i = 2; i < nums.size(); i++) { 以示例二,输入[2,7,9,3,1]为例。 -![198.打家劫舍](https://img-blog.csdnimg.cn/20210221170954115.jpg) +![198.打家劫舍](https://code-thinking-1253855093.file.myqcloud.com/pics/20210221170954115.jpg) 红框dp[nums.size() - 1]为结果。 diff --git "a/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" "b/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" index 883876673f..99bd35805a 100644 --- "a/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" +++ "b/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" @@ -1,3 +1,4 @@ +

@@ -5,6 +6,7 @@

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+ > 链表操作中,可以使用原链表来直接进行删除操作,也可以设置一个虚拟头结点再进行删除操作,接下来看一看哪种方式更方便。 # 203.移除链表元素 @@ -13,17 +15,17 @@ 题意:删除链表中等于给定值 val 的所有节点。 -示例 1: -输入:head = [1,2,6,3,4,5,6], val = 6 -输出:[1,2,3,4,5] +示例 1: +输入:head = [1,2,6,3,4,5,6], val = 6 +输出:[1,2,3,4,5] -示例 2: -输入:head = [], val = 1 -输出:[] +示例 2: +输入:head = [], val = 1 +输出:[] -示例 3: -输入:head = [7,7,7,7], val = 7 -输出:[] +示例 3: +输入:head = [7,7,7,7], val = 7 +输出:[] # 思路 @@ -32,11 +34,11 @@ 这里以链表 1 4 2 4 来举例,移除元素4。 -![203_链表删除元素1](https://img-blog.csdnimg.cn/20210316095351161.png) +![203_链表删除元素1](https://code-thinking-1253855093.file.myqcloud.com/pics/20210316095351161.png) 如果使用C,C++编程语言的话,不要忘了还要从内存中删除这两个移除的节点, 清理节点内存之后如图: -![203_链表删除元素2](https://img-blog.csdnimg.cn/20210316095418280.png) +![203_链表删除元素2](https://code-thinking-1253855093.file.myqcloud.com/pics/20210316095418280.png) **当然如果使用java ,python的话就不用手动管理内存了。** @@ -47,23 +49,23 @@ 那么因为单链表的特殊性,只能指向下一个节点,刚刚删除的是链表的中第二个,和第四个节点,那么如果删除的是头结点又该怎么办呢? 这里就涉及如下链表操作的两种方式: + * **直接使用原来的链表来进行删除操作。** * **设置一个虚拟头结点在进行删除操作。** 来看第一种操作:直接使用原来的链表来进行移除。 -![203_链表删除元素3](https://img-blog.csdnimg.cn/2021031609544922.png) +![203_链表删除元素3](https://code-thinking-1253855093.file.myqcloud.com/pics/2021031609544922.png) 移除头结点和移除其他节点的操作是不一样的,因为链表的其他节点都是通过前一个节点来移除当前节点,而头结点没有前一个节点。 所以头结点如何移除呢,其实只要将头结点向后移动一位就可以,这样就从链表中移除了一个头结点。 -![203_链表删除元素4](https://img-blog.csdnimg.cn/20210316095512470.png) - +![203_链表删除元素4](https://code-thinking-1253855093.file.myqcloud.com/pics/20210316095512470.png) 依然别忘将原头结点从内存中删掉。 -![203_链表删除元素5](https://img-blog.csdnimg.cn/20210316095543775.png) +![203_链表删除元素5](https://code-thinking-1253855093.file.myqcloud.com/pics/20210316095543775.png) 这样移除了一个头结点,是不是发现,在单链表中移除头结点 和 移除其他节点的操作方式是不一样,其实在写代码的时候也会发现,需要单独写一段逻辑来处理移除头结点的情况。 @@ -74,7 +76,7 @@ 来看看如何设置一个虚拟头。依然还是在这个链表中,移除元素1。 -![203_链表删除元素6](https://img-blog.csdnimg.cn/20210316095619221.png) +![203_链表删除元素6](https://code-thinking-1253855093.file.myqcloud.com/pics/20210316095619221.png) 这里来给链表添加一个虚拟头结点为新的头结点,此时要移除这个旧头结点元素1。 @@ -146,8 +148,10 @@ public: ## 其他语言版本 + C: 用原来的链表操作: + ```c struct ListNode* removeElements(struct ListNode* head, int val){ struct ListNode* temp; @@ -168,7 +172,7 @@ struct ListNode* removeElements(struct ListNode* head, int val){ // 将cur->next设置为cur->next->next并删除cur->next cur->next = temp->next; free(temp); - } + } // 若cur->next不等于val,则将cur后移一位 else cur = cur->next; @@ -178,7 +182,9 @@ struct ListNode* removeElements(struct ListNode* head, int val){ return head; } ``` + 设置一个虚拟头结点: + ```c /** * Definition for singly-linked list. @@ -212,6 +218,7 @@ struct ListNode* removeElements(struct ListNode* head, int val){ ``` Java: + ```java /** * 添加虚节点方式 @@ -292,6 +299,7 @@ public ListNode removeElements(ListNode head, int val) { ``` Python: + ```python # Definition for singly-linked list. # class ListNode: @@ -335,7 +343,7 @@ func removeElements(head *ListNode, val int) *ListNode { } ``` -javaScript: +javaScript: ```js /** @@ -442,6 +450,7 @@ func removeElements(_ head: ListNode?, _ val: Int) -> ListNode? { ``` PHP: + ```php /** * Definition for singly-linked list. @@ -469,6 +478,7 @@ func removeElements(head *ListNode, val int) *ListNode { ``` RUST: + ```rust // Definition for singly-linked list. // #[derive(PartialEq, Eq, Clone, Debug)] @@ -476,7 +486,7 @@ RUST: // pub val: i32, // pub next: Option> // } -// +// // impl ListNode { // #[inline] // fn new(val: i32) -> Self { @@ -504,7 +514,9 @@ impl Solution { } } ``` + Scala: + ```scala /** * Definition for singly-linked list. @@ -535,7 +547,9 @@ object Solution { } } ``` + Kotlin: + ```kotlin /** * Example: @@ -569,6 +583,7 @@ class Solution { } } ``` +

diff --git "a/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md" "b/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md" index b87c7cba5c..8bf61c3f8f 100644 --- "a/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md" +++ "b/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md" @@ -25,7 +25,8 @@ 其实只需要改变链表的next指针的指向,直接将链表反转 ,而不用重新定义一个新的链表,如图所示: -![206_反转链表](https://img-blog.csdnimg.cn/20210218090901207.png) + +![206_反转链表](https://code-thinking-1253855093.file.myqcloud.com/pics/20210218090901207.png) 之前链表的头节点是元素1, 反转之后头结点就是元素5 ,这里并没有添加或者删除节点,仅仅是改变next指针的方向。 diff --git "a/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" "b/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" index a25fc2f582..5a8f91aff3 100644 --- "a/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" +++ "b/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" @@ -103,7 +103,7 @@ public: 解题的关键在于 窗口的起始位置如何移动,如图所示: -![leetcode_209](https://img-blog.csdnimg.cn/20210312160441942.png) +![leetcode_209](https://code-thinking-1253855093.file.myqcloud.com/pics/20210312160441942.png) 可以发现**滑动窗口的精妙之处在于根据当前子序列和大小的情况,不断调节子序列的起始位置。从而将O(n^2)暴力解法降为O(n)。** diff --git "a/problems/0213.\346\211\223\345\256\266\345\212\253\350\210\215II.md" "b/problems/0213.\346\211\223\345\256\266\345\212\253\350\210\215II.md" index e595d2fdb2..0627eedb23 100644 --- "a/problems/0213.\346\211\223\345\256\266\345\212\253\350\210\215II.md" +++ "b/problems/0213.\346\211\223\345\256\266\345\212\253\350\210\215II.md" @@ -39,15 +39,15 @@ * 情况一:考虑不包含首尾元素 -![213.打家劫舍II](https://img-blog.csdnimg.cn/20210129160748643.jpg) +![213.打家劫舍II](https://code-thinking-1253855093.file.myqcloud.com/pics/20210129160748643-20230310134000692.jpg) * 情况二:考虑包含首元素,不包含尾元素 -![213.打家劫舍II1](https://img-blog.csdnimg.cn/20210129160821374.jpg) +![213.打家劫舍II1](https://code-thinking-1253855093.file.myqcloud.com/pics/20210129160821374-20230310134003961.jpg) * 情况三:考虑包含尾元素,不包含首元素 -![213.打家劫舍II2](https://img-blog.csdnimg.cn/20210129160842491.jpg) +![213.打家劫舍II2](https://code-thinking-1253855093.file.myqcloud.com/pics/20210129160842491-20230310134008133.jpg) **注意我这里用的是"考虑"**,例如情况三,虽然是考虑包含尾元素,但不一定要选尾部元素! 对于情况三,取nums[1] 和 nums[3]就是最大的。 diff --git "a/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" "b/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" index 5ca7bb9094..f631c3cdc8 100644 --- "a/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" +++ "b/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" @@ -1,3 +1,4 @@ +

@@ -7,17 +8,19 @@ + > 别看本篇选的是组合总和III,而不是组合总和,本题和上一篇77.组合相比难度刚刚好! # 216.组合总和III [力扣题目链接](https://leetcode.cn/problems/combination-sum-iii/) -找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。 +找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。 说明: + * 所有数字都是正整数。 -* 解集不能包含重复的组合。  +* 解集不能包含重复的组合。 示例 1: 输入: k = 3, n = 7 @@ -46,7 +49,7 @@ 选取过程如图: -![216.组合总和III](https://img-blog.csdnimg.cn/20201123195717975.png) +![216.组合总和III](https://code-thinking-1253855093.file.myqcloud.com/pics/20201123195717975.png) 图中,可以看出,只有最后取到集合(1,3)和为4 符合条件。 @@ -80,6 +83,7 @@ vector> result; vector path; void backtracking(int targetSum, int k, int sum, int startIndex) ``` + 其实这里sum这个参数也可以省略,每次targetSum减去选取的元素数值,然后判断如果targetSum为0了,说明收集到符合条件的结果了,我这里为了直观便于理解,还是加一个sum参数。 还要强调一下,回溯法中递归函数参数很难一次性确定下来,一般先写逻辑,需要啥参数了,填什么参数。 @@ -108,7 +112,7 @@ if (path.size() == k) { 本题和[77. 组合](https://programmercarl.com/0077.组合.html)区别之一就是集合固定的就是9个数[1,...,9],所以for循环固定i<=9 如图: -![216.组合总和III](https://img-blog.csdnimg.cn/20201123195717975.png) +![216.组合总和III](https://code-thinking-1253855093.file.myqcloud.com/pics/20201123195717975-20230310113546003.png) 处理过程就是 path收集每次选取的元素,相当于树型结构里的边,sum来统计path里元素的总和。 @@ -166,7 +170,7 @@ public: 这道题目,剪枝操作其实是很容易想到了,想必大家看上面的树形图的时候已经想到了。 如图: -![216.组合总和III1](https://img-blog.csdnimg.cn/2020112319580476.png) +![216.组合总和III1](https://code-thinking-1253855093.file.myqcloud.com/pics/2020112319580476.png) 已选元素总和如果已经大于n(图中数值为4)了,那么往后遍历就没有意义了,直接剪掉。 @@ -181,7 +185,6 @@ if (sum > targetSum) { // 剪枝操作 当然这个剪枝也可以放在 调用递归之前,即放在这里,只不过要记得 要回溯操作给做了。 ```CPP - for (int i = startIndex; i <= 9 - (k - path.size()) + 1; i++) { // 剪枝 sum += i; // 处理 path.push_back(i); // 处理 @@ -250,6 +253,7 @@ public: ## Java 模板方法 + ```java class Solution { List> result = new ArrayList<>(); @@ -317,6 +321,7 @@ class Solution { ``` 其他方法 + ```java class Solution { List> res = new ArrayList<>(); @@ -429,12 +434,12 @@ var combinationSum3 = function(k, n) { const dfs = (path,index) => { // 剪枝操作 if (sum > n){ - return + return } if (path.length == k) { if(sum == n){ res.push([...path]); - return + return } } for (let i = index; i <= 9 - (k-path.length) + 1;i++) { diff --git "a/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" "b/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" index 10ac826496..c346b6ff19 100644 --- "a/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" +++ "b/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" @@ -152,7 +152,7 @@ public: 我来举一个典型的例子如题: - + 完全二叉树只有两种情况,情况一:就是满二叉树,情况二:最后一层叶子节点没有满。 @@ -161,10 +161,10 @@ public: 对于情况二,分别递归左孩子,和右孩子,递归到某一深度一定会有左孩子或者右孩子为满二叉树,然后依然可以按照情况1来计算。 完全二叉树(一)如图: -![222.完全二叉树的节点个数](https://img-blog.csdnimg.cn/20201124092543662.png) +![222.完全二叉树的节点个数](https://code-thinking-1253855093.file.myqcloud.com/pics/20201124092543662.png) 完全二叉树(二)如图: -![222.完全二叉树的节点个数1](https://img-blog.csdnimg.cn/20201124092634138.png) +![222.完全二叉树的节点个数1](https://code-thinking-1253855093.file.myqcloud.com/pics/20201124092634138.png) 可以看出如果整个树不是满二叉树,就递归其左右孩子,直到遇到满二叉树为止,用公式计算这个子树(满二叉树)的节点数量。 diff --git "a/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" "b/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" index 1ea9a3e6c1..16a5be577d 100644 --- "a/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" @@ -11,7 +11,8 @@ 翻转一棵二叉树。 -![226.翻转二叉树](https://img-blog.csdnimg.cn/20210203192644329.png) + +![226.翻转二叉树](https://code-thinking-1253855093.file.myqcloud.com/pics/20210203192644329.png) 这道题目背后有一个让程序员心酸的故事,听说 Homebrew的作者Max Howell,就是因为没在白板上写出翻转二叉树,最后被Google拒绝了。(真假不做判断,权当一个乐子哈) @@ -33,7 +34,8 @@ 如果要从整个树来看,翻转还真的挺复杂,整个树以中间分割线进行翻转,如图: -![226.翻转二叉树1](https://img-blog.csdnimg.cn/20210203192724351.png) + +![226.翻转二叉树1](https://code-thinking-1253855093.file.myqcloud.com/pics/20210203192724351.png) 可以发现想要翻转它,其实就把每一个节点的左右孩子交换一下就可以了。 diff --git "a/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" "b/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" index 1c21f2be28..8353303aa3 100644 --- "a/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" +++ "b/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" @@ -15,7 +15,8 @@ 例如,给定如下二叉搜索树:  root = [6,2,8,0,4,7,9,null,null,3,5] -![235. 二叉搜索树的最近公共祖先](https://img-blog.csdnimg.cn/20201018172243602.png) + +![235. 二叉搜索树的最近公共祖先](https://code-thinking-1253855093.file.myqcloud.com/pics/20201018172243602.png) 示例 1: diff --git "a/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" "b/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" index 7b163ee503..33201def08 100644 --- "a/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" +++ "b/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" @@ -17,7 +17,8 @@ 例如,给定如下二叉树:  root = [3,5,1,6,2,0,8,null,null,7,4] -![236. 二叉树的最近公共祖先](https://img-blog.csdnimg.cn/20201016173414722.png) + +![236. 二叉树的最近公共祖先](https://code-thinking-1253855093.file.myqcloud.com/pics/20201016173414722.png) 示例 1: 输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1 @@ -130,7 +131,7 @@ left与right的逻辑处理; // 中 如图: -![236.二叉树的最近公共祖先](https://img-blog.csdnimg.cn/2021020415105872.png) +![236.二叉树的最近公共祖先](https://code-thinking-1253855093.file.myqcloud.com/pics/2021020415105872.png) 就像图中一样直接返回7,多美滋滋。 @@ -163,7 +164,7 @@ TreeNode* right = lowestCommonAncestor(root->right, p, q); 如图: -![236.二叉树的最近公共祖先1](https://img-blog.csdnimg.cn/20210204151125844.png) +![236.二叉树的最近公共祖先1](https://code-thinking-1253855093.file.myqcloud.com/pics/20210204151125844.png) 图中节点10的左子树返回null,右子树返回目标值7,那么此时节点10的处理逻辑就是把右子树的返回值(最近公共祖先7)返回上去! @@ -184,7 +185,7 @@ else { // (left == NULL && right == NULL) 那么寻找最小公共祖先,完整流程图如下: -![236.二叉树的最近公共祖先2](https://img-blog.csdnimg.cn/202102041512582.png) +![236.二叉树的最近公共祖先2](https://code-thinking-1253855093.file.myqcloud.com/pics/202102041512582.png) **从图中,大家可以看到,我们是如何回溯遍历整棵二叉树,将结果返回给头结点的!** diff --git "a/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" "b/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" index 68434479f5..8c542ceaa4 100644 --- "a/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" +++ "b/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" @@ -16,7 +16,7 @@ 说明: 叶子节点是指没有子节点的节点。 示例: -![257.二叉树的所有路径1](https://img-blog.csdnimg.cn/2021020415161576.png) +![257.二叉树的所有路径1](https://code-thinking-1253855093.file.myqcloud.com/pics/2021020415161576.png) # 思路 @@ -28,7 +28,7 @@ 前序遍历以及回溯的过程如图: -![257.二叉树的所有路径](https://img-blog.csdnimg.cn/20210204151702443.png) +![257.二叉树的所有路径](https://code-thinking-1253855093.file.myqcloud.com/pics/20210204151702443.png) 我们先使用递归的方式,来做前序遍历。**要知道递归和回溯就是一家的,本题也需要回溯。** diff --git "a/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" "b/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" index 0654e49442..c329156b83 100644 --- "a/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" +++ "b/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" @@ -94,7 +94,8 @@ for (int i = 0; i <= n; i++) { // 遍历背包 已输入n为5例,dp状态图如下: -![279.完全平方数](https://img-blog.csdnimg.cn/20210202112617341.jpg) + +![279.完全平方数](https://code-thinking-1253855093.file.myqcloud.com/pics/20210202112617341.jpg) dp[0] = 0 dp[1] = min(dp[0] + 1) = 1 diff --git "a/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" "b/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" index f4fe1c31c3..478837cc1b 100644 --- "a/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" @@ -82,7 +82,7 @@ for (int i = 1; i < nums.size(); i++) { 输入:[0,1,0,3,2],dp数组的变化如下: -![300.最长上升子序列](https://img-blog.csdnimg.cn/20210110170945618.jpg) +![300.最长上升子序列](https://code-thinking-1253855093.file.myqcloud.com/pics/20210110170945618.jpg) 如果代码写出来,但一直AC不了,那么就把dp数组打印出来,看看对不对! diff --git "a/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" "b/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" index b4825894b8..d62e91c74a 100644 --- "a/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" +++ "b/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" @@ -45,7 +45,7 @@ dp[i][j],第i天状态为j,所剩的最多现金为dp[i][j]。 * 状态三:今天卖出股票 * 状态四:今天为冷冻期状态,但冷冻期状态不可持续,只有一天! -![](https://img-blog.csdnimg.cn/518d5baaf33f4b2698064f8efb42edbf.png) +![](https://code-thinking-1253855093.file.myqcloud.com/pics/518d5baaf33f4b2698064f8efb42edbf.png) j的状态为: @@ -133,7 +133,8 @@ dp[i][3] = dp[i - 1][2]; 以 [1,2,3,0,2] 为例,dp数组如下: -![309.最佳买卖股票时机含冷冻期](https://img-blog.csdnimg.cn/2021032317451040.png) + +![309.最佳买卖股票时机含冷冻期](https://code-thinking-1253855093.file.myqcloud.com/pics/2021032317451040.png) 最后结果是取 状态二,状态三,和状态四的最大值,不少同学会把状态四忘了,状态四是冷冻期,最后一天如果是冷冻期也可能是最大值。 diff --git "a/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" "b/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" index c718ef4757..3be72565be 100644 --- "a/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" +++ "b/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" @@ -106,7 +106,7 @@ dp[0] = 0; 以输入:coins = [1, 2, 5], amount = 5为例 -![322.零钱兑换](https://img-blog.csdnimg.cn/20210201111833906.jpg) +![322.零钱兑换](https://code-thinking-1253855093.file.myqcloud.com/pics/20210201111833906.jpg) dp[amount]为最终结果。 diff --git "a/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" "b/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" index 17ae964161..9bd5df7aad 100644 --- "a/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" +++ "b/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" @@ -57,7 +57,7 @@ 对于死循环,我来举一个有重复机场的例子: -![332.重新安排行程](https://img-blog.csdnimg.cn/20201115180537865.png) +![332.重新安排行程](https://code-thinking-1253855093.file.myqcloud.com/pics/20201115180537865.png) 为什么要举这个例子呢,就是告诉大家,出发机场和到达机场也会重复的,**如果在解题的过程中没有对集合元素处理好,就会死循环。** @@ -111,7 +111,7 @@ void backtracking(参数) { 本题以输入:[["JFK", "KUL"], ["JFK", "NRT"], ["NRT", "JFK"]为例,抽象为树形结构如下: -![332.重新安排行程1](https://img-blog.csdnimg.cn/2020111518065555.png) +![332.重新安排行程1](https://code-thinking-1253855093.file.myqcloud.com/pics/2020111518065555-20230310121223600.png) 开始回溯三部曲讲解: @@ -137,7 +137,7 @@ bool backtracking(int ticketNum, vector& result) { 因为我们只需要找到一个行程,就是在树形结构中唯一的一条通向叶子节点的路线,如图: -![332.重新安排行程1](https://img-blog.csdnimg.cn/2020111518065555.png) +![332.重新安排行程1](https://code-thinking-1253855093.file.myqcloud.com/pics/2020111518065555-20230310121240991.png) 所以找到了这个叶子节点了直接返回,这个递归函数的返回值问题我们在讲解二叉树的系列的时候,在这篇[二叉树:递归函数究竟什么时候需要返回值,什么时候不要返回值?](https://programmercarl.com/0112.路径总和.html)详细介绍过。 diff --git "a/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" "b/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" index 97cf234fba..f75c4c88ad 100644 --- "a/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" +++ "b/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" @@ -13,7 +13,8 @@ 计算在不触动警报的情况下,小偷一晚能够盗取的最高金额。 -![337.打家劫舍III](https://img-blog.csdnimg.cn/20210223173849619.png) + +![337.打家劫舍III](https://code-thinking-1253855093.file.myqcloud.com/pics/20210223173849619.png) ## 思路 diff --git "a/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" "b/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" index 4170f7e6db..c2fbbdde68 100644 --- "a/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" +++ "b/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" @@ -129,7 +129,7 @@ for (int i = 3; i <= n ; i++) { 举例当n为10 的时候,dp数组里的数值,如下: -![343.整数拆分](https://img-blog.csdnimg.cn/20210104173021581.png) +![343.整数拆分](https://code-thinking-1253855093.file.myqcloud.com/pics/20210104173021581.png) 以上动规五部曲分析完毕,C++代码如下: diff --git "a/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" "b/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" index ed6a5d97c8..0d25cba50d 100644 --- "a/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" +++ "b/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" @@ -16,7 +16,7 @@ 题意:给定两个数组,编写一个函数来计算它们的交集。 -![349. 两个数组的交集](https://img-blog.csdnimg.cn/20200818193523911.png) +![349. 两个数组的交集](https://code-thinking-1253855093.file.myqcloud.com/pics/20200818193523911.png) **说明:** 输出结果中的每个元素一定是唯一的。 diff --git "a/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" "b/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" index efb9c6b65a..5eb61ed075 100644 --- "a/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" +++ "b/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" @@ -41,7 +41,7 @@ 用示例二来举例,如图所示: -![376.摆动序列](https://img-blog.csdnimg.cn/20201124174327597.png) +![376.摆动序列](https://code-thinking-1253855093.file.myqcloud.com/pics/20201124174327597.png) **局部最优:删除单调坡度上的节点(不包括单调坡度两端的节点),那么这个坡度就可以有两个局部峰值**。 @@ -103,7 +103,7 @@ 那么为了规则统一,针对序列[2,5],可以假设为[2,2,5],这样它就有坡度了即preDiff = 0,如图: -![376.摆动序列1](https://img-blog.csdnimg.cn/20201124174357612.png) +![376.摆动序列1](https://code-thinking-1253855093.file.myqcloud.com/pics/20201124174357612.png) 针对以上情形,result初始为1(默认最右面有一个峰值),此时curDiff > 0 && preDiff <= 0,那么result++(计算了左面的峰值),最后得到的result就是2(峰值个数为2即摆动序列长度为2) diff --git "a/problems/0377.\347\273\204\345\220\210\346\200\273\345\222\214\342\205\243.md" "b/problems/0377.\347\273\204\345\220\210\346\200\273\345\222\214\342\205\243.md" index 0b7a2fdd2d..f228718857 100644 --- "a/problems/0377.\347\273\204\345\220\210\346\200\273\345\222\214\342\205\243.md" +++ "b/problems/0377.\347\273\204\345\220\210\346\200\273\345\222\214\342\205\243.md" @@ -105,7 +105,7 @@ dp[i](考虑nums[j])可以由 dp[i - nums[j]](不考虑nums[j]) 推导 我们再来用示例中的例子推导一下: -![377.组合总和Ⅳ](https://img-blog.csdnimg.cn/20210131174250148.jpg) +![377.组合总和Ⅳ](https://code-thinking-1253855093.file.myqcloud.com/pics/20230310000625.png) 如果代码运行处的结果不是想要的结果,就把dp[i]都打出来,看看和我们推导的一不一样。 diff --git "a/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" "b/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" index 03c1baae63..2fa647d200 100644 --- "a/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" @@ -77,7 +77,8 @@ if (s[i - 1] != t[j - 1]),此时相当于t要删除元素,t如果把当前 因为这样的定义在dp二维矩阵中可以留出初始化的区间,如图: -![392.判断子序列](https://img-blog.csdnimg.cn/20210303173115966.png) + +![392.判断子序列](https://code-thinking-1253855093.file.myqcloud.com/pics/20210303173115966.png) 如果要是定义的dp[i][j]是以下标i为结尾的字符串s和以下标j为结尾的字符串t,初始化就比较麻烦了。 @@ -94,13 +95,15 @@ vector> dp(s.size() + 1, vector(t.size() + 1, 0)); 如图所示: -![392.判断子序列1](https://img-blog.csdnimg.cn/20210303172354155.jpg) + +![392.判断子序列1](https://code-thinking-1253855093.file.myqcloud.com/pics/20210303172354155.jpg) 5. 举例推导dp数组 以示例一为例,输入:s = "abc", t = "ahbgdc",dp状态转移图如下: -![392.判断子序列2](https://img-blog.csdnimg.cn/2021030317364166.jpg) + +![392.判断子序列2](https://code-thinking-1253855093.file.myqcloud.com/pics/2021030317364166.jpg) dp[i][j]表示以下标i-1为结尾的字符串s和以下标j-1为结尾的字符串t 相同子序列的长度,所以如果dp[s.size()][t.size()] 与 字符串s的长度相同说明:s与t的最长相同子序列就是s,那么s 就是 t 的子序列。 diff --git "a/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" "b/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" index 1ff74bc96b..cf5441c4c4 100644 --- "a/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" +++ "b/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" @@ -13,7 +13,8 @@ 示例: -![404.左叶子之和1](https://img-blog.csdnimg.cn/20210204151927654.png) + +![404.左叶子之和1](https://code-thinking-1253855093.file.myqcloud.com/pics/20210204151927654.png) ## 视频讲解 @@ -27,8 +28,7 @@ 大家思考一下如下图中二叉树,左叶子之和究竟是多少? -![404.左叶子之和](https://img-blog.csdnimg.cn/20210204151949672.png) - +![404.左叶子之和](https://code-thinking-1253855093.file.myqcloud.com/pics/20210204151949672.png) **其实是0,因为这棵树根本没有左叶子!** 但看这个图的左叶子之和是多少? diff --git "a/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" "b/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" index 73a7affc53..48c498e1ad 100644 --- "a/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" +++ "b/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" @@ -59,7 +59,7 @@ 以图中{5,2} 为例: -![406.根据身高重建队列](https://img-blog.csdnimg.cn/20201216201851982.png) +![406.根据身高重建队列](https://code-thinking-1253855093.file.myqcloud.com/pics/20201216201851982.png) 按照身高排序之后,优先按身高高的people的k来插入,后序插入节点也不会影响前面已经插入的节点,最终按照k的规则完成了队列。 diff --git "a/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" "b/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" index 45dd289a21..08d005f57a 100644 --- "a/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" +++ "b/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" @@ -148,7 +148,8 @@ dp[j]的数值一定是小于等于j的。 用例1,输入[1,5,11,5] 为例,如图: -![416.分割等和子集2](https://img-blog.csdnimg.cn/20210110104240545.png) + +![416.分割等和子集2](https://code-thinking-1253855093.file.myqcloud.com/pics/20210110104240545.png) 最后dp[11] == 11,说明可以将这个数组分割成两个子集,使得两个子集的元素和相等。 diff --git "a/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" "b/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" index 0655f8c5d0..2602b52873 100644 --- "a/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" +++ "b/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" @@ -21,7 +21,8 @@ 示例: -![450.删除二叉搜索树中的节点](https://img-blog.csdnimg.cn/20201020171048265.png) + +![450.删除二叉搜索树中的节点](https://code-thinking-1253855093.file.myqcloud.com/pics/20201020171048265.png) # 算法公开课 diff --git "a/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" "b/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" index 86bfa49070..6b018f978a 100644 --- "a/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" +++ "b/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" @@ -74,7 +74,7 @@ 以题目示例: [[10,16],[2,8],[1,6],[7,12]]为例,如图:(方便起见,已经排序) -![452.用最少数量的箭引爆气球](https://img-blog.csdnimg.cn/20201123101929791.png) +![452.用最少数量的箭引爆气球](https://code-thinking-1253855093.file.myqcloud.com/pics/20201123101929791.png) 可以看出首先第一组重叠气球,一定是需要一个箭,气球3,的左边界大于了 第一组重叠气球的最小右边界,所以再需要一支箭来射气球3了。 diff --git "a/problems/0474.\344\270\200\345\222\214\351\233\266.md" "b/problems/0474.\344\270\200\345\222\214\351\233\266.md" index b40380dbea..8d79d701ac 100644 --- "a/problems/0474.\344\270\200\345\222\214\351\233\266.md" +++ "b/problems/0474.\344\270\200\345\222\214\351\233\266.md" @@ -52,7 +52,8 @@ 其实本题并不是多重背包,再来看一下这个图,捋清几种背包的关系 -![416.分割等和子集1](https://img-blog.csdnimg.cn/20210117171307407.png) + +![416.分割等和子集1](https://code-thinking-1253855093.file.myqcloud.com/pics/20210117171307407-20230310132423205.png) 多重背包是每个物品,数量不同的情况。 @@ -128,7 +129,7 @@ for (string str : strs) { // 遍历物品 最后dp数组的状态如下所示: -![474.一和零](https://img-blog.csdnimg.cn/20210120111201512.jpg) +![474.一和零](https://code-thinking-1253855093.file.myqcloud.com/pics/20210120111201512.jpg) 以上动规五部曲分析完毕,C++代码如下: diff --git "a/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" "b/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" index 6aa81539ec..436dbf01c8 100644 --- "a/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" @@ -46,7 +46,10 @@ 为了有鲜明的对比,我用[4, 7, 6, 7]这个数组来举例,抽象为树形结构如图: -![491. 递增子序列1](https://img-blog.csdnimg.cn/20201124200229824.png) + +![491. 递增子序列1](https://code-thinking-1253855093.file.myqcloud.com/pics/20201124200229824.png) + + ### 回溯三部曲 @@ -78,7 +81,7 @@ if (path.size() > 1) { * 单层搜索逻辑 -![491. 递增子序列1](https://img-blog.csdnimg.cn/20201124200229824.png) +![491. 递增子序列1](https://code-thinking-1253855093.file.myqcloud.com/pics/20201124200229824-20230310131640070.png) 在图中可以看出,**同一父节点下的同层上使用过的元素就不能再使用了** 那么单层搜索代码如下: diff --git "a/problems/0494.\347\233\256\346\240\207\345\222\214.md" "b/problems/0494.\347\233\256\346\240\207\345\222\214.md" index 9adf8b0518..3dcac737ba 100644 --- "a/problems/0494.\347\233\256\346\240\207\345\222\214.md" +++ "b/problems/0494.\347\233\256\346\240\207\345\222\214.md" @@ -219,7 +219,7 @@ bagSize = (S + sum) / 2 = (3 + 5) / 2 = 4 dp数组状态变化如下: -![494.目标和](https://img-blog.csdnimg.cn/20210125120743274.jpg) +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210125120743274.jpg) C++代码如下: diff --git "a/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" "b/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" index 4214e232cd..b7ef606fe6 100644 --- "a/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" +++ "b/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" @@ -25,7 +25,7 @@ 给定 BST [1,null,2,2], -![501. 二叉搜索树中的众数](https://img-blog.csdnimg.cn/20201014221532206.png) +![501. 二叉搜索树中的众数](https://code-thinking-1253855093.file.myqcloud.com/pics/20201014221532206.png) 返回[2]. @@ -146,7 +146,7 @@ public: 如图: -![501.二叉搜索树中的众数1](https://img-blog.csdnimg.cn/20210204152758889.png) +![501.二叉搜索树中的众数1](https://code-thinking-1253855093.file.myqcloud.com/pics/20210204152758889.png) 中序遍历代码如下: diff --git "a/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" "b/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" index d08948822e..5ff254845d 100644 --- "a/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" +++ "b/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" @@ -11,13 +11,14 @@ 给定一个二叉树,在树的最后一行找到最左边的值。 + 示例 1: -![513.找树左下角的值](https://img-blog.csdnimg.cn/20210204152956836.png) +![513.找树左下角的值](https://code-thinking-1253855093.file.myqcloud.com/pics/20210204152956836.png) 示例 2: -![513.找树左下角的值1](https://img-blog.csdnimg.cn/20210204153017586.png) +![513.找树左下角的值1](https://code-thinking-1253855093.file.myqcloud.com/pics/20210204153017586.png) ## 视频讲解 diff --git "a/problems/0516.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\345\272\217\345\210\227.md" "b/problems/0516.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\345\272\217\345\210\227.md" index c8f10c242e..d28a33ccd0 100644 --- "a/problems/0516.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0516.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\345\272\217\345\210\227.md" @@ -1,10 +1,12 @@ +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

-# 516.最长回文子序列 + +# 516.最长回文子序列 [力扣题目链接](https://leetcode.cn/problems/longest-palindromic-subsequence/) @@ -52,7 +54,7 @@ 如果s[i]与s[j]相同,那么dp[i][j] = dp[i + 1][j - 1] + 2; 如图: -![516.最长回文子序列](https://img-blog.csdnimg.cn/20210127151350563.jpg) +![516.最长回文子序列](https://code-thinking-1253855093.file.myqcloud.com/pics/20210127151350563.jpg) (如果这里看不懂,回忆一下dp[i][j]的定义) @@ -64,7 +66,7 @@ 那么dp[i][j]一定是取最大的,即:dp[i][j] = max(dp[i + 1][j], dp[i][j - 1]); -![516.最长回文子序列1](https://img-blog.csdnimg.cn/20210127151420476.jpg) +![516.最长回文子序列1](https://code-thinking-1253855093.file.myqcloud.com/pics/20210127151420476.jpg) 代码如下: @@ -91,7 +93,7 @@ for (int i = 0; i < s.size(); i++) dp[i][i] = 1; 4. 确定遍历顺序 -从递归公式中,可以看出,dp[i][j] 依赖于 dp[i + 1][j - 1] ,dp[i + 1][j] 和 dp[i][j - 1],如图: +从递归公式中,可以看出,dp[i][j] 依赖于 dp[i + 1][j - 1] ,dp[i + 1][j] 和 dp[i][j - 1],如图: ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20230102172155.png) @@ -117,7 +119,7 @@ for (int i = s.size() - 1; i >= 0; i--) { 输入s:"cbbd" 为例,dp数组状态如图: -![516.最长回文子序列3](https://img-blog.csdnimg.cn/20210127151521432.jpg) +![516.最长回文子序列3](https://code-thinking-1253855093.file.myqcloud.com/pics/20210127151521432.jpg) 红色框即:dp[0][s.size() - 1]; 为最终结果。 @@ -147,6 +149,7 @@ public: Java: + ```java public class Solution { public int longestPalindromeSubseq(String s) { @@ -169,6 +172,7 @@ public class Solution { Python: + ```python class Solution: def longestPalindromeSubseq(self, s: str) -> int: @@ -185,6 +189,7 @@ class Solution: ``` Go: + ```Go func longestPalindromeSubseq(s string) int { size := len(s) @@ -213,11 +218,12 @@ func longestPalindromeSubseq(s string) int { ``` Javascript: + ```javascript const longestPalindromeSubseq = (s) => { const strLen = s.length; let dp = Array.from(Array(strLen), () => Array(strLen).fill(0)); - + for(let i = 0; i < strLen; i++) { dp[i][i] = 1; } @@ -241,7 +247,7 @@ TypeScript: ```typescript function longestPalindromeSubseq(s: string): number { /** - dp[i][j]:[i,j]区间内,最长回文子序列的长度 + dp[i][j]:[i,j]区间内,最长回文子序列的长度 */ const length: number = s.length; const dp: number[][] = new Array(length).fill(0) diff --git "a/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" "b/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" index 162bbe680e..3fd03e1607 100644 --- "a/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" +++ "b/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" @@ -158,7 +158,7 @@ for (int j = 0; j <= amount; j++) { // 遍历背包容量 输入: amount = 5, coins = [1, 2, 5] ,dp状态图如下: -![518.零钱兑换II](https://img-blog.csdnimg.cn/20210120181331461.jpg) +![518.零钱兑换II](https://code-thinking-1253855093.file.myqcloud.com/pics/20210120181331461.jpg) 最后红色框dp[amount]为最终结果。 diff --git "a/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" "b/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" index d59ec09c0e..203add397d 100644 --- "a/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" +++ "b/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" @@ -15,7 +15,7 @@ 示例: -![530二叉搜索树的最小绝对差](https://img-blog.csdnimg.cn/20201014223400123.png) +![530二叉搜索树的最小绝对差](https://code-thinking-1253855093.file.myqcloud.com/pics/20201014223400123.png) 提示:树中至少有 2 个节点。 @@ -72,7 +72,7 @@ public: 如图: -![530.二叉搜索树的最小绝对差](https://img-blog.csdnimg.cn/20210204153247458.png) +![530.二叉搜索树的最小绝对差](https://code-thinking-1253855093.file.myqcloud.com/pics/20210204153247458.png) 一些同学不知道在递归中如何记录前一个节点的指针,其实实现起来是很简单的,大家只要看过一次,写过一次,就掌握了。 diff --git "a/problems/0538.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md" "b/problems/0538.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md" index 8d4b97f18f..29b2184059 100644 --- "a/problems/0538.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md" +++ "b/problems/0538.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md" @@ -19,7 +19,8 @@ 示例 1: -![538.把二叉搜索树转换为累加树](https://img-blog.csdnimg.cn/20201023160751832.png) + +![538.把二叉搜索树转换为累加树](https://code-thinking-1253855093.file.myqcloud.com/pics/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] @@ -67,7 +68,8 @@ 遍历顺序如图所示: -![538.把二叉搜索树转换为累加树](https://img-blog.csdnimg.cn/20210204153440666.png) + +![538.把二叉搜索树转换为累加树](https://code-thinking-1253855093.file.myqcloud.com/pics/20210204153440666.png) 本题依然需要一个pre指针记录当前遍历节点cur的前一个节点,这样才方便做累加。 diff --git "a/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" "b/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" index 68c6de1609..eb046a9d04 100644 --- "a/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" +++ "b/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" @@ -78,7 +78,7 @@ for (int j = 0; j <= word2.size(); j++) dp[0][j] = j; 以word1:"sea",word2:"eat"为例,推导dp数组状态图如下: -![583.两个字符串的删除操作1](https://img-blog.csdnimg.cn/20210714101750205.png) +![583.两个字符串的删除操作1](https://code-thinking-1253855093.file.myqcloud.com/pics/20210714101750205.png) 以上分析完毕,代码如下: diff --git "a/problems/0617.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md" "b/problems/0617.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md" index 058deb8521..f98948f0f3 100644 --- "a/problems/0617.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0617.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md" @@ -15,7 +15,7 @@ 示例 1: -![617.合并二叉树](https://img-blog.csdnimg.cn/20210204153634809.png) +![617.合并二叉树](https://code-thinking-1253855093.file.myqcloud.com/pics/20230310000854.png) 注意: 合并必须从两个树的根节点开始。 diff --git "a/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" "b/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" index df55d24da3..90e6da9fbf 100644 --- "a/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" +++ "b/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" @@ -102,7 +102,7 @@ dp[i][j]可以初始化为true么? 当然不行,怎能刚开始就全都匹 dp[i + 1][j - 1] 在 dp[i][j]的左下角,如图: -![647.回文子串](https://img-blog.csdnimg.cn/20210121171032473.jpg) +![647.回文子串](https://code-thinking-1253855093.file.myqcloud.com/pics/20210121171032473-20230310132134822.jpg) 如果这矩阵是从上到下,从左到右遍历,那么会用到没有计算过的dp[i + 1][j - 1],也就是根据不确定是不是回文的区间[i+1,j-1],来判断了[i,j]是不是回文,那结果一定是不对的。 @@ -132,7 +132,7 @@ for (int i = s.size() - 1; i >= 0; i--) { // 注意遍历顺序 举例,输入:"aaa",dp[i][j]状态如下: -![647.回文子串1](https://img-blog.csdnimg.cn/20210121171059951.jpg) +![647.回文子串1](https://code-thinking-1253855093.file.myqcloud.com/pics/20210121171059951-20230310132153163.jpg) 图中有6个true,所以就是有6个回文子串。 diff --git "a/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" "b/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" index 0f473228ad..64b38b488e 100644 --- "a/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" @@ -19,7 +19,7 @@ 示例 : -![654.最大二叉树](https://img-blog.csdnimg.cn/20210204154534796.png) +![654.最大二叉树](https://code-thinking-1253855093.file.myqcloud.com/pics/20210204154534796.png) 提示: diff --git "a/problems/0669.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0669.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" index 1fd6fce098..18d8a0cc8d 100644 --- "a/problems/0669.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" +++ "b/problems/0669.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" @@ -1,3 +1,4 @@ +

@@ -5,6 +6,7 @@

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+ > 如果不对递归有深刻的理解,本题有点难 > 单纯移除一个节点那还不够,要修剪! @@ -12,13 +14,13 @@ [力扣题目链接](https://leetcode.cn/problems/trim-a-binary-search-tree/) -给定一个二叉搜索树,同时给定最小边界L 和最大边界 R。通过修剪二叉搜索树,使得所有节点的值在[L, R]中 (R>=L) 。你可能需要改变树的根节点,所以结果应当返回修剪好的二叉搜索树的新的根节点。 +给定一个二叉搜索树,同时给定最小边界L 和最大边界 R。通过修剪二叉搜索树,使得所有节点的值在[L, R]中 (R>=L) 。你可能需要改变树的根节点,所以结果应当返回修剪好的二叉搜索树的新的根节点。 -![669.修剪二叉搜索树](https://img-blog.csdnimg.cn/20201014173115788.png) +![669.修剪二叉搜索树](https://code-thinking-1253855093.file.myqcloud.com/pics/20201014173115788.png) -![669.修剪二叉搜索树1](https://img-blog.csdnimg.cn/20201014173219142.png) +![669.修剪二叉搜索树1](https://code-thinking-1253855093.file.myqcloud.com/pics/20201014173219142.png) -# 算法公开课 +# 算法公开课 **《代码随想录》算法视频公开课:[你修剪的方式不对,我来给你纠正一下!| LeetCode:669. 修剪二叉搜索树](https://www.bilibili.com/video/BV17P41177ud?share_source=copy_web),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 @@ -50,7 +52,7 @@ public: 我们在重新关注一下第二个示例,如图: -![669.修剪二叉搜索树](https://img-blog.csdnimg.cn/20210204155302751.png) +![669.修剪二叉搜索树](https://code-thinking-1253855093.file.myqcloud.com/pics/20210204155302751.png) **所以以上的代码是不可行的!** @@ -60,7 +62,7 @@ public: 在上图中我们发现节点0并不符合区间要求,那么将节点0的右孩子 节点2 直接赋给 节点3的左孩子就可以了(就是把节点0从二叉树中移除),如图: -![669.修剪二叉搜索树1](https://img-blog.csdnimg.cn/20210204155327203.png) +![669.修剪二叉搜索树1](https://code-thinking-1253855093.file.myqcloud.com/pics/20210204155327203.png) 理解了最关键部分了我们再递归三部曲: @@ -127,9 +129,10 @@ return root; 在回顾一下上面的代码,针对下图中二叉树的情况: -![669.修剪二叉搜索树1](https://img-blog.csdnimg.cn/20210204155327203.png) +![669.修剪二叉搜索树1](https://code-thinking-1253855093.file.myqcloud.com/pics/20210204155327203-20230310120126738.png) 如下代码相当于把节点0的右孩子(节点2)返回给上一层, + ``` if (root->val < low) { TreeNode* right = trimBST(root->right, low, high); // 寻找符合区间[low, high]的节点 @@ -243,7 +246,7 @@ public: # 其他语言版本 -## Java +## Java ```Java class Solution { @@ -266,8 +269,10 @@ class Solution { ``` -## Python +## Python + **递归** + ```python # Definition for a binary tree node. # class TreeNode: @@ -287,7 +292,7 @@ class Solution: if root.val < low: # 若当前root节点小于左界:只考虑其右子树,用于替代更新后的其本身,抛弃其左子树整体 return self.trimBST(root.right, low, high) - + if high < root.val: # 若当前root节点大于右界:只考虑其左子树,用于替代更新后的其本身,抛弃其右子树整体 return self.trimBST(root.left, low, high) @@ -300,6 +305,7 @@ class Solution: ``` **迭代** + ```python class Solution: def trimBST(self, root: Optional[TreeNode], low: int, high: int) -> Optional[TreeNode]: @@ -325,10 +331,9 @@ class Solution: return root ``` -## Go +## Go ```go - // 递归 func trimBST(root *TreeNode, low int, high int) *TreeNode { if root == nil { @@ -384,6 +389,7 @@ func trimBST(root *TreeNode, low int, high int) *TreeNode { ## JavaScript版本 迭代: + ```js var trimBST = function(root, low, high) { if(root === null) { @@ -416,8 +422,9 @@ var trimBST = function(root, low, high) { ``` 递归: + ```js -var trimBST = function (root,low,high) { +var trimBST = function (root,low,high) { if(root === null) { return null; } @@ -486,6 +493,7 @@ function trimBST(root: TreeNode | null, low: number, high: number): TreeNode | n ## Scala 递归法: + ```scala object Solution { def trimBST(root: TreeNode, low: Int, high: Int): TreeNode = { @@ -502,6 +510,7 @@ object Solution { ## rust // 递归 + ```rust impl Solution { pub fn trim_bst( diff --git "a/problems/0673.\346\234\200\351\225\277\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227\347\232\204\344\270\252\346\225\260.md" "b/problems/0673.\346\234\200\351\225\277\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227\347\232\204\344\270\252\346\225\260.md" index 6418be8a55..da80a4e039 100644 --- "a/problems/0673.\346\234\200\351\225\277\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227\347\232\204\344\270\252\346\225\260.md" +++ "b/problems/0673.\346\234\200\351\225\277\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227\347\232\204\344\270\252\346\225\260.md" @@ -180,7 +180,7 @@ for (int i = 0; i < nums.size(); i++) { 输入:[1,3,5,4,7] -![673.最长递增子序列的个数](https://img-blog.csdnimg.cn/20210112104555234.jpg) +![673.最长递增子序列的个数](https://code-thinking-1253855093.file.myqcloud.com/pics/20230310000656.png) **如果代码写出来了,怎么改都通过不了,那么把dp和count打印出来看看对不对!** diff --git "a/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" "b/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" index 3cb680600f..79a8311d78 100644 --- "a/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" +++ "b/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" @@ -82,7 +82,8 @@ for (int i = 1; i < nums.size(); i++) { 已输入nums = [1,3,5,4,7]为例,dp数组状态如下: -![674.最长连续递增序列](https://img-blog.csdnimg.cn/20210204103529742.jpg) + +![674.最长连续递增序列](https://code-thinking-1253855093.file.myqcloud.com/pics/20210204103529742.jpg) **注意这里要取dp[i]里的最大值,所以dp[2]才是结果!** diff --git "a/problems/0700.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\220\234\347\264\242.md" "b/problems/0700.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\220\234\347\264\242.md" index 675a0e4a23..40724f48a8 100644 --- "a/problems/0700.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\220\234\347\264\242.md" +++ "b/problems/0700.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\220\234\347\264\242.md" @@ -13,7 +13,8 @@ 例如, -![700.二叉搜索树中的搜索](https://img-blog.csdnimg.cn/20210204155522476.png) + +![700.二叉搜索树中的搜索](https://code-thinking-1253855093.file.myqcloud.com/pics/20210204155522476.png) 在上述示例中,如果要找的值是 5,但因为没有节点值为 5,我们应该返回 NULL。 @@ -125,7 +126,7 @@ public: 中间节点如果大于3就向左走,如果小于3就向右走,如图: -![二叉搜索树](https://img-blog.csdnimg.cn/20200812190213280.png) +![二叉搜索树](https://code-thinking-1253855093.file.myqcloud.com/pics/20200812190213280.png) 所以迭代法代码如下: diff --git "a/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" "b/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" index 4bdb8d607f..4e834201bd 100644 --- "a/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" +++ "b/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" @@ -13,7 +13,8 @@ 注意,可能存在多种有效的插入方式,只要树在插入后仍保持为二叉搜索树即可。 你可以返回任意有效的结果。 -![701.二叉搜索树中的插入操作](https://img-blog.csdnimg.cn/20201019173259554.png) + +![701.二叉搜索树中的插入操作](https://code-thinking-1253855093.file.myqcloud.com/pics/20201019173259554.png) 提示: diff --git "a/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" "b/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" index a02bf7a201..97b123bc03 100644 --- "a/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" +++ "b/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" @@ -59,7 +59,7 @@ 例如在数组:1,2,3,4,7,9,10中查找元素2,如图所示: -![704.二分查找](https://img-blog.csdnimg.cn/20210311153055723.jpg) +![704.二分查找](https://code-thinking-1253855093.file.myqcloud.com/pics/20210311153055723.jpg) 代码如下:(详细注释) @@ -98,7 +98,8 @@ public: 在数组:1,2,3,4,7,9,10中查找元素2,如图所示:(**注意和方法一的区别**) -![704.二分查找1](https://img-blog.csdnimg.cn/20210311153123632.jpg) + +![704.二分查找1](https://code-thinking-1253855093.file.myqcloud.com/pics/20210311153123632.jpg) 代码如下:(详细注释) diff --git "a/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" "b/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" index 43ed262296..95560fb138 100644 --- "a/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" +++ "b/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" @@ -22,7 +22,7 @@ * deleteAtIndex(index):如果索引 index 有效,则删除链表中的第 index 个节点。 -![707示例](https://img-blog.csdnimg.cn/20200814200558953.png) +![707示例](https://code-thinking-1253855093.file.myqcloud.com/pics/20200814200558953.png) # 思路 @@ -33,10 +33,10 @@ 如果对链表的虚拟头结点不清楚,可以看这篇文章:[链表:听说用虚拟头节点会方便很多?](https://programmercarl.com/0203.移除链表元素.html) 删除链表节点: -![链表-删除节点](https://img-blog.csdnimg.cn/20200806195114541.png) +![链表-删除节点](https://code-thinking-1253855093.file.myqcloud.com/pics/20200806195114541.png) 添加链表节点: -![链表-添加节点](https://img-blog.csdnimg.cn/20200806195134331.png) +![链表-添加节点](https://code-thinking-1253855093.file.myqcloud.com/pics/20200806195134331.png) 这道题目设计链表的五个接口: * 获取链表第index个节点的数值 diff --git "a/problems/0718.\346\234\200\351\225\277\351\207\215\345\244\215\345\255\220\346\225\260\347\273\204.md" "b/problems/0718.\346\234\200\351\225\277\351\207\215\345\244\215\345\255\220\346\225\260\347\273\204.md" index 0658f9c8bb..08be67326e 100644 --- "a/problems/0718.\346\234\200\351\225\277\351\207\215\345\244\215\345\255\220\346\225\260\347\273\204.md" +++ "b/problems/0718.\346\234\200\351\225\277\351\207\215\345\244\215\345\255\220\346\225\260\347\273\204.md" @@ -93,7 +93,8 @@ for (int i = 1; i <= nums1.size(); i++) { 拿示例1中,A: [1,2,3,2,1],B: [3,2,1,4,7]为例,画一个dp数组的状态变化,如下: -![718.最长重复子数组](https://img-blog.csdnimg.cn/2021011215282060.jpg) + +![718.最长重复子数组](https://code-thinking-1253855093.file.myqcloud.com/pics/2021011215282060.jpg) 以上五部曲分析完毕,C++代码如下: @@ -124,7 +125,8 @@ public: 在如下图中: -![718.最长重复子数组](https://img-blog.csdnimg.cn/2021011215282060.jpg) + +![718.最长重复子数组](https://code-thinking-1253855093.file.myqcloud.com/pics/2021011215282060-20230310134554486.jpg) 我们可以看出dp[i][j]都是由dp[i - 1][j - 1]推出。那么压缩为一维数组,也就是dp[j]都是由dp[j - 1]推出。 diff --git "a/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" "b/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" index 5aa370052f..263a28f40c 100644 --- "a/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" +++ "b/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" @@ -1,3 +1,4 @@ +

@@ -5,15 +6,16 @@

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+ # 739. 每日温度 [力扣题目链接](https://leetcode.cn/problems/daily-temperatures/) -请根据每日 气温 列表,重新生成一个列表。对应位置的输出为:要想观测到更高的气温,至少需要等待的天数。如果气温在这之后都不会升高,请在该位置用 0 来代替。 +请根据每日 气温 列表,重新生成一个列表。对应位置的输出为:要想观测到更高的气温,至少需要等待的天数。如果气温在这之后都不会升高,请在该位置用 0 来代替。 -例如,给定一个列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的输出应该是 [1, 1, 4, 2, 1, 1, 0, 0]。 +例如,给定一个列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的输出应该是 [1, 1, 4, 2, 1, 1, 0, 0]。 -提示:气温 列表长度的范围是 [1, 30000]。每个气温的值的均为华氏度,都是在 [30, 100] 范围内的整数。 +提示:气温 列表长度的范围是 [1, 30000]。每个气温的值的均为华氏度,都是在 [30, 100] 范围内的整数。 ## 思路 @@ -32,7 +34,7 @@ **单调栈的本质是空间换时间**,因为在遍历的过程中需要用一个栈来记录右边第一个比当前元素高的元素,优点是整个数组只需要遍历一次。 -**更直白来说,就是用一个栈来记录我们遍历过的元素**,因为我们遍历数组的时候,我们不知道之前都遍历了哪些元素,以至于遍历一个元素找不到是不是之前遍历过一个更小的,所以我们需要用一个容器(这里用单调栈)来记录我们遍历过的元素。 +**更直白来说,就是用一个栈来记录我们遍历过的元素**,因为我们遍历数组的时候,我们不知道之前都遍历了哪些元素,以至于遍历一个元素找不到是不是之前遍历过一个更小的,所以我们需要用一个容器(这里用单调栈)来记录我们遍历过的元素。 在使用单调栈的时候首先要明确如下几点: @@ -59,79 +61,79 @@ **把这三种情况分析清楚了,也就理解透彻了**。 -接下来我们用temperatures = [73, 74, 75, 71, 71, 72, 76, 73]为例来逐步分析,输出应该是 [1, 1, 4, 2, 1, 1, 0, 0]。 +接下来我们用temperatures = [73, 74, 75, 71, 71, 72, 76, 73]为例来逐步分析,输出应该是 [1, 1, 4, 2, 1, 1, 0, 0]。 -------- +------- 首先先将第一个遍历元素加入单调栈 -![739.每日温度1](https://img-blog.csdnimg.cn/20210219124434172.jpg) +![739.每日温度1](https://code-thinking-1253855093.file.myqcloud.com/pics/20210219124434172.jpg) ---------- +--------- 加入T[1] = 74,因为T[1] > T[0](当前遍历的元素T[i]大于栈顶元素T[st.top()]的情况)。 我们要保持一个递增单调栈(从栈头到栈底),所以将T[0]弹出,T[1]加入,此时result数组可以记录了,result[0] = 1,即T[0]右面第一个比T[0]大的元素是T[1]。 -![739.每日温度2](https://img-blog.csdnimg.cn/20210219124504299.jpg) +![739.每日温度2](https://code-thinking-1253855093.file.myqcloud.com/pics/20210219124504299.jpg) ------------ +----------- 加入T[2],同理,T[1]弹出 -![739.每日温度3](https://img-blog.csdnimg.cn/20210219124527361.jpg) +![739.每日温度3](https://code-thinking-1253855093.file.myqcloud.com/pics/20210219124527361.jpg) -------- +------- 加入T[3],T[3] < T[2] (当前遍历的元素T[i]小于栈顶元素T[st.top()]的情况),加T[3]加入单调栈。 -![739.每日温度4](https://img-blog.csdnimg.cn/20210219124610761.jpg) +![739.每日温度4](https://code-thinking-1253855093.file.myqcloud.com/pics/20210219124610761.jpg) ---------- +--------- 加入T[4],T[4] == T[3] (当前遍历的元素T[i]等于栈顶元素T[st.top()]的情况),此时依然要加入栈,不用计算距离,因为我们要求的是右面第一个大于本元素的位置,而不是大于等于! -![739.每日温度5](https://img-blog.csdnimg.cn/20210219124633444.jpg) +![739.每日温度5](https://code-thinking-1253855093.file.myqcloud.com/pics/20210219124633444.jpg) ---------- +--------- 加入T[5],T[5] > T[4] (当前遍历的元素T[i]大于栈顶元素T[st.top()]的情况),将T[4]弹出,同时计算距离,更新result -![739.每日温度6](https://img-blog.csdnimg.cn/20210219124700567.jpg) +![739.每日温度6](https://code-thinking-1253855093.file.myqcloud.com/pics/20210219124700567.jpg) ----------- +---------- T[4]弹出之后, T[5] > T[3] (当前遍历的元素T[i]大于栈顶元素T[st.top()]的情况),将T[3]继续弹出,同时计算距离,更新result -![739.每日温度7](https://img-blog.csdnimg.cn/20210219124726613.jpg) +![739.每日温度7](https://code-thinking-1253855093.file.myqcloud.com/pics/20210219124726613.jpg) -------- +------- 直到发现T[5]小于T[st.top()],终止弹出,将T[5]加入单调栈 -![739.每日温度8](https://img-blog.csdnimg.cn/20210219124807715.jpg) +![739.每日温度8](https://code-thinking-1253855093.file.myqcloud.com/pics/20210219124807715.jpg) -------- +------- 加入T[6],同理,需要将栈里的T[5],T[2]弹出 -![739.每日温度9](https://img-blog.csdnimg.cn/2021021912483374.jpg) +![739.每日温度9](https://code-thinking-1253855093.file.myqcloud.com/pics/2021021912483374.jpg) -------- +------- 同理,继续弹出 -![739.每日温度10](https://img-blog.csdnimg.cn/2021021912490098.jpg) +![739.每日温度10](https://code-thinking-1253855093.file.myqcloud.com/pics/2021021912490098.jpg) ------- +------ 此时栈里只剩下了T[6] -![739.每日温度11](https://img-blog.csdnimg.cn/20210219124930156.jpg) +![739.每日温度11](https://code-thinking-1253855093.file.myqcloud.com/pics/20210219124930156.jpg) ------------ 加入T[7], T[7] < T[6] 直接入栈,这就是最后的情况,result数组也更新完了。 -![739.每日温度12](https://img-blog.csdnimg.cn/20210219124957216.jpg) +![739.每日温度12](https://code-thinking-1253855093.file.myqcloud.com/pics/20210219124957216.jpg) 此时有同学可能就疑惑了,那result[6] , result[7]怎么没更新啊,元素也一直在栈里。 @@ -144,7 +146,7 @@ T[4]弹出之后, T[5] > T[3] (当前遍历的元素T[i]大于栈顶元素T[ * 情况二:当前遍历的元素T[i]等于栈顶元素T[st.top()]的情况 * 情况三:当前遍历的元素T[i]大于栈顶元素T[st.top()]的情况 -通过以上过程,大家可以自己再模拟一遍,就会发现:只有单调栈递增(从栈口到栈底顺序),就是求右边第一个比自己大的,单调栈递减的话,就是求右边第一个比自己小的。 +通过以上过程,大家可以自己再模拟一遍,就会发现:只有单调栈递增(从栈口到栈底顺序),就是求右边第一个比自己大的,单调栈递减的话,就是求右边第一个比自己小的。 C++代码如下: @@ -198,6 +200,7 @@ public: } }; ``` + * 时间复杂度:O(n) * 空间复杂度:O(n) @@ -210,26 +213,26 @@ public: Java: -```java +```java class Solution { - // 版本 1 + // 版本 1 public int[] dailyTemperatures(int[] temperatures) { - + int lens=temperatures.length; int []res=new int[lens]; - + /** 如果当前遍历的元素 大于栈顶元素,表示 栈顶元素的 右边的最大的元素就是 当前遍历的元素, - 所以弹出 栈顶元素,并记录 - 如果栈不空的话,还要考虑新的栈顶与当前元素的大小关系 + 所以弹出 栈顶元素,并记录 + 如果栈不空的话,还要考虑新的栈顶与当前元素的大小关系 否则的话,可以直接入栈。 注意,单调栈里 加入的元素是 下标。 */ Deque stack=new LinkedList<>(); stack.push(0); for(int i=1;i stack=new LinkedList<>(); for(int i=0;itemperatures[stack.peek()]){ res[stack.peek()]=i-stack.peek(); stack.pop(); @@ -263,10 +266,12 @@ class Solution { return res; } } - + } ``` + Python: + ```python class Solution: def dailyTemperatures(self, temperatures: List[int]) -> List[int]: @@ -282,9 +287,10 @@ class Solution: answer[stack[-1]]=i-stack[-1] stack.pop() stack.append(i) - + return answer ``` + Go: > 暴力法 @@ -341,6 +347,7 @@ func dailyTemperatures(temperatures []int) []int { ``` > 单调栈法(精简版本) + ```go // 单调递减栈 func dailyTemperatures(num []int) []int { @@ -362,6 +369,7 @@ func dailyTemperatures(num []int) []int { ``` JavaScript: + ```javascript // 版本一 var dailyTemperatures = function(temperatures) { diff --git "a/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" "b/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" index 6667e7403e..077cb54ac4 100644 --- "a/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" +++ "b/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" @@ -41,7 +41,8 @@ 如图: -![763.划分字母区间](https://img-blog.csdnimg.cn/20201222191924417.png) + +![763.划分字母区间](https://code-thinking-1253855093.file.myqcloud.com/pics/20201222191924417.png) 明白原理之后,代码并不复杂,如下: diff --git "a/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" "b/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" index 92212ebbea..14563a51fb 100644 --- "a/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" @@ -1,3 +1,4 @@ +

@@ -5,6 +6,7 @@

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+ # 968.监控二叉树 [力扣题目链接](https://leetcode.cn/problems/binary-tree-cameras/) @@ -17,7 +19,7 @@ 示例 1: -![](https://img-blog.csdnimg.cn/20201229175736596.png) +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20201229175736596.png) * 输入:[0,0,null,0,0] * 输出:1 @@ -25,7 +27,7 @@ 示例 2: -![](https://img-blog.csdnimg.cn/2020122917584449.png) +![](https://code-thinking-1253855093.file.myqcloud.com/pics/2020122917584449.png) * 输入:[0,0,null,0,null,0,null,null,0] * 输出:2 @@ -139,7 +141,7 @@ if (cur == NULL) return 2; 如图: -![968.监控二叉树2](https://img-blog.csdnimg.cn/20201229203710729.png) +![968.监控二叉树2](https://code-thinking-1253855093.file.myqcloud.com/pics/20201229203710729.png) 代码如下: @@ -163,6 +165,7 @@ if (left == 2 && right == 2) return 0; 此时摄像头的数量要加一,并且return 1,代表中间节点放摄像头。 代码如下: + ```CPP if (left == 0 || right == 0) { result++; @@ -186,7 +189,7 @@ if (left == 1 || right == 1) return 2; **从这个代码中,可以看出,如果left == 1, right == 0 怎么办?其实这种条件在情况2中已经判断过了**,如图: -![968.监控二叉树1](https://img-blog.csdnimg.cn/2020122920362355.png) +![968.监控二叉树1](https://code-thinking-1253855093.file.myqcloud.com/pics/2020122920362355.png) 这种情况也是大多数同学容易迷惑的情况。 @@ -194,7 +197,7 @@ if (left == 1 || right == 1) return 2; 以上都处理完了,递归结束之后,可能头结点 还有一个无覆盖的情况,如图: -![968.监控二叉树3](https://img-blog.csdnimg.cn/20201229203742446.png) +![968.监控二叉树3](https://code-thinking-1253855093.file.myqcloud.com/pics/20201229203742446.png) 所以递归结束之后,还要判断根节点,如果没有覆盖,result++,代码如下: @@ -311,7 +314,8 @@ public: ## 其他语言版本 -### Java +### Java + ```java class Solution { int res=0; @@ -324,32 +328,32 @@ class Solution { } /** 节点的状态值: - 0 表示无覆盖 + 0 表示无覆盖 1 表示 有摄像头 - 2 表示有覆盖 + 2 表示有覆盖 后序遍历,根据左右节点的情况,来判读 自己的状态 */ public int minCame(TreeNode root){ if(root==null){ - // 空节点默认为 有覆盖状态,避免在叶子节点上放摄像头 + // 空节点默认为 有覆盖状态,避免在叶子节点上放摄像头 return 2; } int left=minCame(root.left); int right=minCame(root.right); - + // 如果左右节点都覆盖了的话, 那么本节点的状态就应该是无覆盖,没有摄像头 if(left==2&&right==2){ - //(2,2) + //(2,2) return 0; }else if(left==0||right==0){ // 左右节点都是无覆盖状态,那 根节点此时应该放一个摄像头 - // (0,0) (0,1) (0,2) (1,0) (2,0) + // (0,0) (0,1) (0,2) (1,0) (2,0) // 状态值为 1 摄像头数 ++; res++; return 1; }else{ // 左右节点的 状态为 (1,1) (1,2) (2,1) 也就是左右节点至少存在 1个摄像头, - // 那么本节点就是处于被覆盖状态 + // 那么本节点就是处于被覆盖状态 return 2; } } @@ -357,7 +361,8 @@ class Solution { ``` -### Python +### Python + ```python class Solution: def minCameraCover(self, root: TreeNode) -> int: @@ -367,19 +372,19 @@ class Solution: # 0: 该节点未覆盖 # 1: 该节点有摄像头 # 2: 该节点有覆盖 - + result = 0 # 从下往上遍历:后序(左右中) def traversal(curr: TreeNode) -> int: nonlocal result - + if not curr: return 2 left = traversal(curr.left) right = traversal(curr.right) # Case 1: # 左右节点都有覆盖 - if left == 2 and right == 2: + if left == 2 and right == 2: return 0 # Case 2: @@ -388,7 +393,7 @@ class Solution: # left == 0 && right == 1 左节点有无覆盖,右节点摄像头 # left == 0 && right == 2 左节点无覆盖,右节点覆盖 # left == 2 && right == 0 左节点覆盖,右节点无覆盖 - elif left == 0 or right == 0: + elif left == 0 or right == 0: result += 1 return 1 @@ -398,16 +403,17 @@ class Solution: # left == 1 && right == 1 左右节点都有摄像头 elif left == 1 or right == 1: return 2 - + # 其他情况前段代码均已覆盖 if traversal(root) == 0: result += 1 - + return result ``` -### Go +### Go + ```go const inf = math.MaxInt64 / 2 @@ -437,7 +443,8 @@ func min(a, b int) int { ``` -### Javascript +### Javascript + ```Javascript var minCameraCover = function(root) { let result = 0 @@ -470,7 +477,7 @@ var minCameraCover = function(root) { } return result - + }; ``` @@ -501,7 +508,7 @@ function minCameraCover(root: TreeNode | null): number { }; ``` -### C +### C ```c /* @@ -576,7 +583,9 @@ object Solution { } } ``` + ### Rust + ```Rust /// 版本一 impl Solution { diff --git "a/problems/1035.\344\270\215\347\233\270\344\272\244\347\232\204\347\272\277.md" "b/problems/1035.\344\270\215\347\233\270\344\272\244\347\232\204\347\272\277.md" index 6742c8d90a..d1e1e30a8c 100644 --- "a/problems/1035.\344\270\215\347\233\270\344\272\244\347\232\204\347\272\277.md" +++ "b/problems/1035.\344\270\215\347\233\270\344\272\244\347\232\204\347\272\277.md" @@ -14,7 +14,8 @@ 以这种方法绘制线条,并返回我们可以绘制的最大连线数。 -![1035.不相交的线](https://img-blog.csdnimg.cn/2021032116363533.png) + +![1035.不相交的线](https://code-thinking-1253855093.file.myqcloud.com/pics/2021032116363533.png) ## 思路 diff --git "a/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" "b/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" index 8e40dcd59f..210ce73738 100644 --- "a/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" +++ "b/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" @@ -115,7 +115,7 @@ for (int i = 0; i < stones.size(); i++) { // 遍历物品 举例,输入:[2,4,1,1],此时target = (2 + 4 + 1 + 1)/2 = 4 ,dp数组状态图如下: -![1049.最后一块石头的重量II](https://img-blog.csdnimg.cn/20210121115805904.jpg) +![1049.最后一块石头的重量II](https://code-thinking-1253855093.file.myqcloud.com/pics/20210121115805904.jpg) 最后dp[target]里是容量为target的背包所能背的最大重量。 diff --git "a/problems/1143.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" "b/problems/1143.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" index f2e6e7e2b2..8e5f7eb252 100644 --- "a/problems/1143.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/1143.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" @@ -91,7 +91,7 @@ vector> dp(text1.size() + 1, vector(text2.size() + 1, 0)); 从递推公式,可以看出,有三个方向可以推出dp[i][j],如图: -![1143.最长公共子序列](https://img-blog.csdnimg.cn/20210204115139616.jpg) +![1143.最长公共子序列](https://code-thinking-1253855093.file.myqcloud.com/pics/20210204115139616.jpg) 那么为了在递推的过程中,这三个方向都是经过计算的数值,所以要从前向后,从上到下来遍历这个矩阵。 @@ -99,7 +99,8 @@ vector> dp(text1.size() + 1, vector(text2.size() + 1, 0)); 以输入:text1 = "abcde", text2 = "ace" 为例,dp状态如图: -![1143.最长公共子序列1](https://img-blog.csdnimg.cn/20210210150215918.jpg) + +![1143.最长公共子序列1](https://code-thinking-1253855093.file.myqcloud.com/pics/20210210150215918.jpg) 最后红框dp[text1.size()][text2.size()]为最终结果 diff --git "a/problems/O(n)\347\232\204\347\256\227\346\263\225\345\261\205\347\204\266\350\266\205\346\227\266\344\272\206\357\274\214\346\255\244\346\227\266\347\232\204n\347\251\266\347\253\237\346\230\257\345\244\232\345\244\247\357\274\237.md" "b/problems/O(n)\347\232\204\347\256\227\346\263\225\345\261\205\347\204\266\350\266\205\346\227\266\344\272\206\357\274\214\346\255\244\346\227\266\347\232\204n\347\251\266\347\253\237\346\230\257\345\244\232\345\244\247\357\274\237.md" index c2854ca84f..a488c0bad4 100644 --- "a/problems/O(n)\347\232\204\347\256\227\346\263\225\345\261\205\347\204\266\350\266\205\346\227\266\344\272\206\357\274\214\346\255\244\346\227\266\347\232\204n\347\251\266\347\253\237\346\230\257\345\244\232\345\244\247\357\274\237.md" +++ "b/problems/O(n)\347\232\204\347\256\227\346\263\225\345\261\205\347\204\266\350\266\205\346\227\266\344\272\206\357\274\214\346\255\244\346\227\266\347\232\204n\347\251\266\347\253\237\346\230\257\345\244\232\345\244\247\357\274\237.md" @@ -1,18 +1,21 @@ +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+ # 程序提交之后为什么会超时?O(n)的算法会超时,n究竟是多大? + 一些同学可能对计算机运行的速度还没有概念,就是感觉计算机运行速度应该会很快,那么在leetcode上做算法题目的时候为什么会超时呢? 计算机究竟1s可以执行多少次操作呢? 接下来探讨一下这个问题。 # 超时是怎么回事 -![程序超时](https://img-blog.csdnimg.cn/20200729112716117.png) +![程序超时](https://code-thinking-1253855093.file.myqcloud.com/pics/20200729112716117.png) 大家在leetcode上练习算法的时候应该都遇到过一种错误是“超时”。 @@ -52,6 +55,7 @@ 尽管有很多因素影响,但是还是可以对自己程序的运行时间有一个大体的评估的。 引用算法4里面的一段话: + * 火箭科学家需要大致知道一枚试射火箭的着陆点是在大海里还是在城市中; * 医学研究者需要知道一次药物测试是会杀死还是会治愈实验对象; @@ -103,6 +107,7 @@ void function3(long long n) { ``` 来看一下这三个函数随着n的规模变化,耗时会产生多大的变化,先测function1 ,就把 function2 和 function3 注释掉 + ```CPP int main() { long long n; // 数据规模 @@ -126,11 +131,11 @@ int main() { 来看一下运行的效果,如下图: -![程序超时2](https://img-blog.csdnimg.cn/20200729200018460.png) +![程序超时2](https://code-thinking-1253855093.file.myqcloud.com/pics/20200729200018460.png) O(n)的算法,1s内大概计算机可以运行 5 * (10^8)次计算,可以推测一下O(n^2) 的算法应该1s可以处理的数量级的规模是 5 * (10^8)开根号,实验数据如下。 -![程序超时3](https://img-blog.csdnimg.cn/2020072919590970.png) +![程序超时3](https://code-thinking-1253855093.file.myqcloud.com/pics/2020072919590970.png) O(n^2)的算法,1s内大概计算机可以运行 22500次计算,验证了刚刚的推测。 @@ -138,7 +143,7 @@ O(n^2)的算法,1s内大概计算机可以运行 22500次计算,验证了刚 理论上应该是比 O(n)少一个数量级,因为logn的复杂度 其实是很快,看一下实验数据。 -![程序超时4](https://img-blog.csdnimg.cn/20200729195729407.png) +![程序超时4](https://code-thinking-1253855093.file.myqcloud.com/pics/20200729195729407.png) O(nlogn)的算法,1s内大概计算机可以运行 2 * (10^7)次计算,符合预期。 @@ -146,7 +151,7 @@ O(nlogn)的算法,1s内大概计算机可以运行 2 * (10^7)次计算,符 **整体测试数据整理如下:** -![程序超时1](https://img-blog.csdnimg.cn/20201208231559175.png) +![程序超时1](https://code-thinking-1253855093.file.myqcloud.com/pics/20201208231559175.png) 至于O(log n)和O(n^3) 等等这些时间复杂度在1s内可以处理的多大的数据规模,大家可以自己写一写代码去测一下了。 diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" index 9541baafca..3afedc8249 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -1,18 +1,20 @@ +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+ # 二叉树理论基础篇 《代码随想录》算法视频公开课:[关于二叉树,你该了解这些!](https://www.bilibili.com/video/BV1Hy4y1t7ij),相信结合视频在看本篇题解,更有助于大家对本题的理解。 -题目分类大纲如下: +题目分类大纲如下: -二叉树大纲 +二叉树大纲 说到二叉树,大家对于二叉树其实都很熟悉了,本文呢我也不想教科书式的把二叉树的基础内容再啰嗦一遍,所以以下我讲的都是一些比较重点的内容。 @@ -28,7 +30,7 @@ 如图所示: - + 这棵二叉树为满二叉树,也可以说深度为k,有2^k-1个节点的二叉树。 @@ -37,13 +39,13 @@ 什么是完全二叉树? -完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2^(h-1)  个节点。 +完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2^(h-1) 个节点。 **大家要自己看完全二叉树的定义,很多同学对完全二叉树其实不是真正的懂了。** 我来举一个典型的例子如题: - + 相信不少同学最后一个二叉树是不是完全二叉树都中招了。 @@ -60,16 +62,16 @@ 下面这两棵树都是搜索树 - + ### 平衡二叉搜索树 -平衡二叉搜索树:又被称为AVL(Adelson-Velsky and Landis)树,且具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。 +平衡二叉搜索树:又被称为AVL(Adelson-Velsky and Landis)树,且具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。 如图: - + 最后一棵 不是平衡二叉树,因为它的左右两个子树的高度差的绝对值超过了1。 @@ -88,13 +90,13 @@ 链式存储如图: - + 链式存储是大家很熟悉的一种方式,那么我们来看看如何顺序存储呢? 其实就是用数组来存储二叉树,顺序存储的方式如图: - + 用数组来存储二叉树如何遍历的呢? @@ -113,6 +115,7 @@ 我这里把二叉树的几种遍历方式列出来,大家就可以一一串起来了。 二叉树主要有两种遍历方式: + 1. 深度优先遍历:先往深走,遇到叶子节点再往回走。 2. 广度优先遍历:一层一层的去遍历。 @@ -121,11 +124,11 @@ 那么从深度优先遍历和广度优先遍历进一步拓展,才有如下遍历方式: * 深度优先遍历 - * 前序遍历(递归法,迭代法) - * 中序遍历(递归法,迭代法) - * 后序遍历(递归法,迭代法) + * 前序遍历(递归法,迭代法) + * 中序遍历(递归法,迭代法) + * 后序遍历(递归法,迭代法) * 广度优先遍历 - * 层次遍历(迭代法) + * 层次遍历(迭代法) 在深度优先遍历中:有三个顺序,前中后序遍历, 有同学总分不清这三个顺序,经常搞混,我这里教大家一个技巧。 @@ -140,7 +143,7 @@ 大家可以对着如下图,看看自己理解的前后中序有没有问题。 - + 最后再说一说二叉树中深度优先和广度优先遍历实现方式,我们做二叉树相关题目,经常会使用递归的方式来实现深度优先遍历,也就是实现前中后序遍历,使用递归是比较方便的。 @@ -206,8 +209,9 @@ public class TreeNode { Python: + ```python -class TreeNode: +class TreeNode: def __init__(self, value): self.value = value self.left = None @@ -215,6 +219,7 @@ class TreeNode: ``` Go: + ```go type TreeNode struct { Val int @@ -224,6 +229,7 @@ type TreeNode struct { ``` JavaScript: + ```javascript function TreeNode(val, left, right) { this.val = (val===undefined ? 0 : val) @@ -263,7 +269,9 @@ class TreeNode { } } ``` + Scala: + ```scala class TreeNode(_value: Int = 0, _left: TreeNode = null, _right: TreeNode = null) { var value: Int = _value diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" index 0814866fde..35cf4077a5 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" @@ -116,7 +116,7 @@ public: 再来看后序遍历,先序遍历是中左右,后续遍历是左右中,那么我们只需要调整一下先序遍历的代码顺序,就变成中右左的遍历顺序,然后在反转result数组,输出的结果顺序就是左右中了,如下图: -![前序到后序](https://img-blog.csdnimg.cn/20200808200338924.png) +![前序到后序](https://code-thinking-1253855093.file.myqcloud.com/pics/20200808200338924.png) **所以后序遍历只需要前序遍历的代码稍作修改就可以了,代码如下:** diff --git "a/problems/\345\205\263\344\272\216\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\214\344\275\240\344\270\215\347\237\245\351\201\223\347\232\204\351\203\275\345\234\250\350\277\231\351\207\214\357\274\201.md" "b/problems/\345\205\263\344\272\216\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\214\344\275\240\344\270\215\347\237\245\351\201\223\347\232\204\351\203\275\345\234\250\350\277\231\351\207\214\357\274\201.md" index 246294ede0..c479dddc67 100644 --- "a/problems/\345\205\263\344\272\216\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\214\344\275\240\344\270\215\347\237\245\351\201\223\347\232\204\351\203\275\345\234\250\350\277\231\351\207\214\357\274\201.md" +++ "b/problems/\345\205\263\344\272\216\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\214\344\275\240\344\270\215\347\237\245\351\201\223\347\232\204\351\203\275\345\234\250\350\277\231\351\207\214\357\274\201.md" @@ -31,7 +31,7 @@ 同样的同理再看一下快速排序,都知道快速排序是O(nlog n),但是当数据已经有序情况下,快速排序的时间复杂度是O(n^2) 的,**所以严格从大O的定义来讲,快速排序的时间复杂度应该是O(n^2)**。 **但是我们依然说快速排序是O(nlog n)的时间复杂度,这个就是业内的一个默认规定,这里说的O代表的就是一般情况,而不是严格的上界**。如图所示: -![时间复杂度4,一般情况下的时间复杂度](https://img-blog.csdnimg.cn/20200728185745611.png) +![时间复杂度4,一般情况下的时间复杂度](https://code-thinking-1253855093.file.myqcloud.com/pics/20200728185745611.png) 我们主要关心的还是一般情况下的数据形式。 @@ -42,7 +42,7 @@ 如下图中可以看出不同算法的时间复杂度在不同数据输入规模下的差异。 -![时间复杂度,不同数据规模的差异](https://img-blog.csdnimg.cn/20200728191447384.png) +![时间复杂度,不同数据规模的差异](https://code-thinking-1253855093.file.myqcloud.com/pics/20200728191447384.png) 在决定使用哪些算法的时候,不是时间复杂越低的越好(因为简化后的时间复杂度忽略了常数项等等),要考虑数据规模,如果数据规模很小甚至可以用O(n^2)的算法比O(n)的更合适(在有常数项的时候)。 @@ -108,7 +108,7 @@ O(2 × n^2 + 10 × n + 1000) < O(3 × n^2),所以说最后省略掉常数项 为什么可以这么做呢?如下图所示: -![时间复杂度1.png](https://img-blog.csdnimg.cn/20200728191447349.png) +![时间复杂度1.png](https://code-thinking-1253855093.file.myqcloud.com/pics/20200728191447349.png) 假如有两个算法的时间复杂度,分别是log以2为底n的对数和log以10为底n的对数,那么这里如果还记得高中数学的话,应该不能理解`以2为底n的对数 = 以2为底10的对数 * 以10为底n的对数`。 diff --git "a/problems/\345\211\215\345\272\217/On\347\232\204\347\256\227\346\263\225\345\261\205\347\204\266\350\266\205\346\227\266\344\272\206\357\274\214\346\255\244\346\227\266\347\232\204n\347\251\266\347\253\237\346\230\257\345\244\232\345\244\247\357\274\237.md" "b/problems/\345\211\215\345\272\217/On\347\232\204\347\256\227\346\263\225\345\261\205\347\204\266\350\266\205\346\227\266\344\272\206\357\274\214\346\255\244\346\227\266\347\232\204n\347\251\266\347\253\237\346\230\257\345\244\232\345\244\247\357\274\237.md" index 20a48e191e..8b0934c582 100644 --- "a/problems/\345\211\215\345\272\217/On\347\232\204\347\256\227\346\263\225\345\261\205\347\204\266\350\266\205\346\227\266\344\272\206\357\274\214\346\255\244\346\227\266\347\232\204n\347\251\266\347\253\237\346\230\257\345\244\232\345\244\247\357\274\237.md" +++ "b/problems/\345\211\215\345\272\217/On\347\232\204\347\256\227\346\263\225\345\261\205\347\204\266\350\266\205\346\227\266\344\272\206\357\274\214\346\255\244\346\227\266\347\232\204n\347\251\266\347\253\237\346\230\257\345\244\232\345\244\247\357\274\237.md" @@ -8,7 +8,7 @@ ## 超时是怎么回事 -![程序超时](https://img-blog.csdnimg.cn/20200729112716117.png) +![程序超时](https://code-thinking-1253855093.file.myqcloud.com/pics/20200729112716117-20230310124308704.png) 大家在leetcode上练习算法的时候应该都遇到过一种错误是“超时”。 @@ -48,6 +48,7 @@ 尽管有很多因素影响,但是还是可以对自己程序的运行时间有一个大体的评估的。 引用算法4里面的一段话: + * 火箭科学家需要大致知道一枚试射火箭的着陆点是在大海里还是在城市中; * 医学研究者需要知道一次药物测试是会杀死还是会治愈实验对象; @@ -99,6 +100,7 @@ void function3(long long n) { ``` 来看一下这三个函数随着n的规模变化,耗时会产生多大的变化,先测function1 ,就把 function2 和 function3 注释掉 + ```CPP int main() { long long n; // 数据规模 @@ -122,11 +124,11 @@ int main() { 来看一下运行的效果,如下图: -![程序超时2](https://img-blog.csdnimg.cn/20200729200018460.png) +![程序超时2](https://code-thinking-1253855093.file.myqcloud.com/pics/20200729200018460-20230310124315093.png) O(n)的算法,1s内大概计算机可以运行 5 * (10^8)次计算,可以推测一下$O(n^2)$ 的算法应该1s可以处理的数量级的规模是 5 * (10^8)开根号,实验数据如下。 -![程序超时3](https://img-blog.csdnimg.cn/2020072919590970.png) +![程序超时3](https://code-thinking-1253855093.file.myqcloud.com/pics/2020072919590970-20230310124318532.png) O(n^2)的算法,1s内大概计算机可以运行 22500次计算,验证了刚刚的推测。 @@ -134,7 +136,7 @@ O(n^2)的算法,1s内大概计算机可以运行 22500次计算,验证了刚 理论上应该是比 $O(n)$少一个数量级,因为$\log n$的复杂度 其实是很快,看一下实验数据。 -![程序超时4](https://img-blog.csdnimg.cn/20200729195729407.png) +![程序超时4](https://code-thinking-1253855093.file.myqcloud.com/pics/20200729195729407-20230310124322232.png) $O(n\log n)$的算法,1s内大概计算机可以运行 2 * (10^7)次计算,符合预期。 @@ -142,7 +144,7 @@ $O(n\log n)$的算法,1s内大概计算机可以运行 2 * (10^7)次计算, **整体测试数据整理如下:** -![程序超时1](https://img-blog.csdnimg.cn/20201208231559175.png) +![程序超时1](https://code-thinking-1253855093.file.myqcloud.com/pics/20201208231559175-20230310124325152.png) 至于 $O(\log n)$ 和 $O(n^3)$ 等等这些时间复杂度在1s内可以处理的多大的数据规模,大家可以自己写一写代码去测一下了。 @@ -204,6 +206,7 @@ int main() { Java版本 + ```Java import java.util.Scanner; @@ -274,4 +277,5 @@ public class TimeComplexity { ----------------------- +
diff --git "a/problems/\345\211\215\345\272\217/\344\273\243\347\240\201\351\243\216\346\240\274.md" "b/problems/\345\211\215\345\272\217/\344\273\243\347\240\201\351\243\216\346\240\274.md" index 196f40272c..b508346080 100644 --- "a/problems/\345\211\215\345\272\217/\344\273\243\347\240\201\351\243\216\346\240\274.md" +++ "b/problems/\345\211\215\345\272\217/\344\273\243\347\240\201\351\243\216\346\240\274.md" @@ -57,7 +57,7 @@ 我做了一下总结如图: -![编程风格](https://img-blog.csdnimg.cn/20201119173039835.png) +![编程风格](https://code-thinking-1253855093.file.myqcloud.com/pics/20201119173039835.png) ### 水平留白(代码空格) diff --git "a/problems/\345\211\215\345\272\217/\345\205\263\344\272\216\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\214\344\275\240\344\270\215\347\237\245\351\201\223\347\232\204\351\203\275\345\234\250\350\277\231\351\207\214\357\274\201.md" "b/problems/\345\211\215\345\272\217/\345\205\263\344\272\216\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\214\344\275\240\344\270\215\347\237\245\351\201\223\347\232\204\351\203\275\345\234\250\350\277\231\351\207\214\357\274\201.md" index 72cfab542c..9d00a0f2a0 100644 --- "a/problems/\345\211\215\345\272\217/\345\205\263\344\272\216\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\214\344\275\240\344\270\215\347\237\245\351\201\223\347\232\204\351\203\275\345\234\250\350\277\231\351\207\214\357\274\201.md" +++ "b/problems/\345\211\215\345\272\217/\345\205\263\344\272\216\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\214\344\275\240\344\270\215\347\237\245\351\201\223\347\232\204\351\203\275\345\234\250\350\277\231\351\207\214\357\274\201.md" @@ -38,7 +38,7 @@ 同样的同理再看一下快速排序,都知道快速排序是O(nlogn),但是当数据已经有序情况下,快速排序的时间复杂度是O(n^2) 的,**所以严格从大O的定义来讲,快速排序的时间复杂度应该是O(n^2)**。 **但是我们依然说快速排序是O(nlogn)的时间复杂度,这个就是业内的一个默认规定,这里说的O代表的就是一般情况,而不是严格的上界**。如图所示: -![时间复杂度4,一般情况下的时间复杂度](https://img-blog.csdnimg.cn/20200728185745611.png) +![时间复杂度4,一般情况下的时间复杂度](https://code-thinking-1253855093.file.myqcloud.com/pics/20200728185745611-20230310123844306.png) 我们主要关心的还是一般情况下的数据形式。 @@ -49,7 +49,7 @@ 如下图中可以看出不同算法的时间复杂度在不同数据输入规模下的差异。 -![时间复杂度,不同数据规模的差异](https://img-blog.csdnimg.cn/20200728191447384.png) +![时间复杂度,不同数据规模的差异](https://code-thinking-1253855093.file.myqcloud.com/pics/20200728191447384-20230310124015324.png) 在决定使用哪些算法的时候,不是时间复杂越低的越好(因为简化后的时间复杂度忽略了常数项等等),要考虑数据规模,如果数据规模很小甚至可以用O(n^2)的算法比O(n)的更合适(在有常数项的时候)。 @@ -115,7 +115,7 @@ O(2 × n^2 + 10 × n + 1000) < O(3 × n^2),所以说最后省略掉常数项 为什么可以这么做呢?如下图所示: -![时间复杂度1.png](https://img-blog.csdnimg.cn/20200728191447349.png) +![时间复杂度1.png](https://code-thinking-1253855093.file.myqcloud.com/pics/20200728191447349-20230310124032001.png) 假如有两个算法的时间复杂度,分别是log以2为底n的对数和log以10为底n的对数,那么这里如果还记得高中数学的话,应该不难理解`以2为底n的对数 = 以2为底10的对数 * 以10为底n的对数`。 diff --git "a/problems/\345\211\215\345\272\217/\345\210\267\344\272\206\350\277\231\344\271\210\345\244\232\351\242\230\357\274\214\344\275\240\344\272\206\350\247\243\350\207\252\345\267\261\344\273\243\347\240\201\347\232\204\345\206\205\345\255\230\346\266\210\350\200\227\344\271\210\357\274\237.md" "b/problems/\345\211\215\345\272\217/\345\210\267\344\272\206\350\277\231\344\271\210\345\244\232\351\242\230\357\274\214\344\275\240\344\272\206\350\247\243\350\207\252\345\267\261\344\273\243\347\240\201\347\232\204\345\206\205\345\255\230\346\266\210\350\200\227\344\271\210\357\274\237.md" index f4aa4b6ea8..f70564e4a2 100644 --- "a/problems/\345\211\215\345\272\217/\345\210\267\344\272\206\350\277\231\344\271\210\345\244\232\351\242\230\357\274\214\344\275\240\344\272\206\350\247\243\350\207\252\345\267\261\344\273\243\347\240\201\347\232\204\345\206\205\345\255\230\346\266\210\350\200\227\344\271\210\357\274\237.md" +++ "b/problems/\345\211\215\345\272\217/\345\210\267\344\272\206\350\277\231\344\271\210\345\244\232\351\242\230\357\274\214\344\275\240\344\272\206\350\247\243\350\207\252\345\267\261\344\273\243\347\240\201\347\232\204\345\206\205\345\255\230\346\266\210\350\200\227\344\271\210\357\274\237.md" @@ -1,5 +1,4 @@ - # 刷了这么多题,你了解自己代码的内存消耗么? 理解代码的内存消耗,最关键是要知道自己所用编程语言的内存管理。 @@ -20,7 +19,7 @@ 如果我们写C++的程序,就要知道栈和堆的概念,程序运行时所需的内存空间分为 固定部分,和可变部分,如下: -![C++内存空间](https://img-blog.csdnimg.cn/20210309165950660.png) +![C++内存空间](https://code-thinking-1253855093.file.myqcloud.com/pics/20210309165950660.png) 固定部分的内存消耗 是不会随着代码运行产生变化的, 可变部分则是会产生变化的 @@ -42,7 +41,7 @@ 想要算出自己程序会占用多少内存就一定要了解自己定义的数据类型的大小,如下: -![C++数据类型的大小](https://img-blog.csdnimg.cn/20200804193045440.png) +![C++数据类型的大小](https://code-thinking-1253855093.file.myqcloud.com/pics/20200804193045440.png) 注意图中有两个不一样的地方,为什么64位的指针就占用了8个字节,而32位的指针占用4个字节呢? @@ -85,9 +84,11 @@ int main() { cout << sizeof(st) << endl; } ``` + 看一下和自己想的结果一样么, 我们来逐一分析一下。 其输出的结果依次为: + ``` 4 1 @@ -108,7 +109,7 @@ CPU读取内存不是一次读取单个字节,而是一块一块的来读取 第一种就是内存对齐的情况,如图: -![内存对齐](https://img-blog.csdnimg.cn/20200804193307347.png) +![内存对齐](https://code-thinking-1253855093.file.myqcloud.com/pics/20200804193307347.png) 一字节的char占用了四个字节,空了三个字节的内存地址,int数据从地址4开始。 @@ -116,7 +117,7 @@ CPU读取内存不是一次读取单个字节,而是一块一块的来读取 第二种是没有内存对齐的情况如图: -![非内存对齐](https://img-blog.csdnimg.cn/20200804193353926.png) +![非内存对齐](https://code-thinking-1253855093.file.myqcloud.com/pics/20200804193353926.png) char型的数据和int型的数据挨在一起,该int数据从地址1开始,那么CPU想要读这个数据的话来看看需要几步操作: @@ -143,4 +144,5 @@ char型的数据和int型的数据挨在一起,该int数据从地址1开始, ----------------------- +
diff --git "a/problems/\345\211\215\345\272\217/\347\250\213\345\272\217\345\221\230\347\256\200\345\216\206.md" "b/problems/\345\211\215\345\272\217/\347\250\213\345\272\217\345\221\230\347\256\200\345\216\206.md" index e64f547ac8..3e25b895f0 100644 --- "a/problems/\345\211\215\345\272\217/\347\250\213\345\272\217\345\221\230\347\256\200\345\216\206.md" +++ "b/problems/\345\211\215\345\272\217/\347\250\213\345\272\217\345\221\230\347\256\200\345\216\206.md" @@ -103,7 +103,7 @@ Carl校招社招都拿过大厂的offer,同时也看过很多应聘者的简 最后福利,把我的简历模板贡献出来!如下图所示。 -![简历模板](https://img-blog.csdnimg.cn/20200803175538158.png) +![简历模板](https://code-thinking-1253855093.file.myqcloud.com/pics/20200803175538158.png) 这里是简历模板中Markdown的代码:[https://github.com/youngyangyang04/Markdown-Resume-Template](https://github.com/youngyangyang04/Markdown-Resume-Template) ,可以fork到自己Github仓库上,按照这个模板来修改自己的简历。 diff --git "a/problems/\345\211\215\345\272\217/\351\200\222\345\275\222\347\256\227\346\263\225\347\232\204\346\227\266\351\227\264\344\270\216\347\251\272\351\227\264\345\244\215\346\235\202\345\272\246\345\210\206\346\236\220.md" "b/problems/\345\211\215\345\272\217/\351\200\222\345\275\222\347\256\227\346\263\225\347\232\204\346\227\266\351\227\264\344\270\216\347\251\272\351\227\264\345\244\215\346\235\202\345\272\246\345\210\206\346\236\220.md" index 142358da7b..aacc456857 100644 --- "a/problems/\345\211\215\345\272\217/\351\200\222\345\275\222\347\256\227\346\263\225\347\232\204\346\227\266\351\227\264\344\270\216\347\251\272\351\227\264\345\244\215\346\235\202\345\272\246\345\210\206\346\236\220.md" +++ "b/problems/\345\211\215\345\272\217/\351\200\222\345\275\222\347\256\227\346\263\225\347\232\204\346\227\266\351\227\264\344\270\216\347\251\272\351\227\264\345\244\215\346\235\202\345\272\246\345\210\206\346\236\220.md" @@ -28,7 +28,8 @@ int fibonacci(int i) { 可以看出上面的代码每次递归都是O(1)的操作。再来看递归了多少次,这里将i为5作为输入的递归过程 抽象成一棵递归树,如图: -![递归空间复杂度分析](https://img-blog.csdnimg.cn/20210305093200104.png) + +![递归空间复杂度分析](https://code-thinking-1253855093.file.myqcloud.com/pics/20210305093200104.png) 从图中,可以看出f(5)是由f(4)和f(3)相加而来,那么f(4)是由f(3)和f(2)相加而来 以此类推。 @@ -194,7 +195,8 @@ int main() 在看递归的深度是多少呢?如图所示: -![递归空间复杂度分析](https://img-blog.csdnimg.cn/20210305094749554.png) + +![递归空间复杂度分析](https://code-thinking-1253855093.file.myqcloud.com/pics/20210305094749554.png) 递归第n个斐波那契数的话,递归调用栈的深度就是n。 @@ -211,7 +213,8 @@ int fibonacci(int i) { 最后对各种求斐波那契数列方法的性能做一下分析,如题: -![递归的空间复杂度分析](https://img-blog.csdnimg.cn/20210305095227356.png) + +![递归的空间复杂度分析](https://code-thinking-1253855093.file.myqcloud.com/pics/20210305095227356.png) 可以看出,求斐波那契数的时候,使用递归算法并不一定是在性能上是最优的,但递归确实简化的代码层面的复杂度。 diff --git "a/problems/\345\211\215\345\272\217/\351\200\232\350\277\207\344\270\200\351\201\223\351\235\242\350\257\225\351\242\230\347\233\256\357\274\214\350\256\262\344\270\200\350\256\262\351\200\222\345\275\222\347\256\227\346\263\225\347\232\204\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\201.md" "b/problems/\345\211\215\345\272\217/\351\200\232\350\277\207\344\270\200\351\201\223\351\235\242\350\257\225\351\242\230\347\233\256\357\274\214\350\256\262\344\270\200\350\256\262\351\200\222\345\275\222\347\256\227\346\263\225\347\232\204\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\201.md" index b2db92f541..9f17e6fac7 100644 --- "a/problems/\345\211\215\345\272\217/\351\200\232\350\277\207\344\270\200\351\201\223\351\235\242\350\257\225\351\242\230\347\233\256\357\274\214\350\256\262\344\270\200\350\256\262\351\200\222\345\275\222\347\256\227\346\263\225\347\232\204\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\201.md" +++ "b/problems/\345\211\215\345\272\217/\351\200\232\350\277\207\344\270\200\351\201\223\351\235\242\350\257\225\351\242\230\347\233\256\357\274\214\350\256\262\344\270\200\350\256\262\351\200\222\345\275\222\347\256\227\346\263\225\347\232\204\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\201.md" @@ -69,7 +69,7 @@ int function3(int x, int n) { 我们来分析一下,首先看递归了多少次呢,可以把递归抽象出一棵满二叉树。刚刚同学写的这个算法,可以用一棵满二叉树来表示(为了方便表示,选择n为偶数16),如图: -![递归算法的时间复杂度](https://img-blog.csdnimg.cn/20201209193909426.png) +![递归算法的时间复杂度](https://code-thinking-1253855093.file.myqcloud.com/pics/20201209193909426.png) 当前这棵二叉树就是求x的n次方,n为16的情况,n为16的时候,进行了多少次乘法运算呢? @@ -79,7 +79,7 @@ int function3(int x, int n) { 这么如果是求x的n次方,这个递归树有多少个节点呢,如下图所示:(m为深度,从0开始) -![递归求时间复杂度](https://img-blog.csdnimg.cn/20200728195531892.png) +![递归求时间复杂度](https://code-thinking-1253855093.file.myqcloud.com/pics/20200728195531892.png) **时间复杂度忽略掉常数项`-1`之后,这个递归算法的时间复杂度依然是O(n)**。对,你没看错,依然是O(n)的时间复杂度! diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20201003\344\272\214\345\217\211\346\240\221\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20201003\344\272\214\345\217\211\346\240\221\345\221\250\346\234\253\346\200\273\347\273\223.md" index 5f59b04022..57416775fb 100644 --- "a/problems/\345\221\250\346\200\273\347\273\223/20201003\344\272\214\345\217\211\346\240\221\345\221\250\346\234\253\346\200\273\347\273\223.md" +++ "b/problems/\345\221\250\346\200\273\347\273\223/20201003\344\272\214\345\217\211\346\240\221\345\221\250\346\234\253\346\200\273\347\273\223.md" @@ -254,5 +254,5 @@ traversal(cur->left, tmp, result); * Github:[leetcode-master](https://github.com/youngyangyang04/leetcode-master) * 知乎:[代码随想录](https://www.zhihu.com/people/sun-xiu-yang-64) -![](https://img-blog.csdnimg.cn/2021013018121150.png) +![](https://code-thinking-1253855093.file.myqcloud.com/pics/2021013018121150.png)
diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20201107\345\233\236\346\272\257\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20201107\345\233\236\346\272\257\345\221\250\346\234\253\346\200\273\347\273\223.md" index 5310f9ecf0..76bd331bd4 100644 --- "a/problems/\345\221\250\346\200\273\347\273\223/20201107\345\233\236\346\272\257\345\221\250\346\234\253\346\200\273\347\273\223.md" +++ "b/problems/\345\221\250\346\200\273\347\273\223/20201107\345\233\236\346\272\257\345\221\250\346\234\253\346\200\273\347\273\223.md" @@ -1,5 +1,4 @@ - # 本周小结!(回溯算法系列二) > 例行每周小结 @@ -32,7 +31,7 @@ for (int i = startIndex; i < candidates.size() && sum + candidates[i] <= target; 在[回溯算法:求组合总和(二)](https://programmercarl.com/0039.组合总和.html)第一个树形结构没有画出startIndex的作用,**这里这里纠正一下,准确的树形结构如图所示:** -![39.组合总和](https://img-blog.csdnimg.cn/20201123202227835.png) +![39.组合总和](https://code-thinking-1253855093.file.myqcloud.com/pics/20201123202227835.png) ## 周二 @@ -46,7 +45,7 @@ for (int i = startIndex; i < candidates.size() && sum + candidates[i] <= target; 都知道组合问题可以抽象为树形结构,那么“使用过”在这个树形结构上是有两个维度的,一个维度是同一树枝上“使用过”,一个维度是同一树层上“使用过”。**没有理解这两个层面上的“使用过” 是造成大家没有彻底理解去重的根本原因**。 -![40.组合总和II1](https://img-blog.csdnimg.cn/20201123202817973.png) +![40.组合总和II1](https://code-thinking-1253855093.file.myqcloud.com/pics/20201123202817973.png) 我在图中将used的变化用橘黄色标注上,可以看出在candidates[i] == candidates[i - 1]相同的情况下: @@ -80,7 +79,7 @@ for (int i = startIndex; i < candidates.size() && sum + candidates[i] <= target; **本题的树形结构中,和代码的逻辑有一个小出入,已经判断不是回文的子串就不会进入递归了,纠正如下:** -![131.分割回文串](https://img-blog.csdnimg.cn/20201123203228309.png) +![131.分割回文串](https://code-thinking-1253855093.file.myqcloud.com/pics/20201123203228309.png) ## 周四 @@ -91,7 +90,7 @@ for (int i = startIndex; i < candidates.size() && sum + candidates[i] <= target; 树形图如下: -![93.复原IP地址](https://img-blog.csdnimg.cn/20201123203735933.png) +![93.复原IP地址](https://code-thinking-1253855093.file.myqcloud.com/pics/20201123203735933-20230310133532452.png) 在本文的树形结构图中,我已经把详细的分析思路都画了出来,相信大家看了之后一定会思路清晰不少! @@ -113,7 +112,7 @@ if (s.size() > 12) return result; // 剪枝 如图: -![78.子集](https://img-blog.csdnimg.cn/202011232041348.png) +![78.子集](https://code-thinking-1253855093.file.myqcloud.com/pics/202011232041348.png) 认清这个本质之后,今天的题目就是一道模板题了。 diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20201112\345\233\236\346\272\257\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20201112\345\233\236\346\272\257\345\221\250\346\234\253\346\200\273\347\273\223.md" index af08097b64..ec36d1213d 100644 --- "a/problems/\345\221\250\346\200\273\347\273\223/20201112\345\233\236\346\272\257\345\221\250\346\234\253\346\200\273\347\273\223.md" +++ "b/problems/\345\221\250\346\200\273\347\273\223/20201112\345\233\236\346\272\257\345\221\250\346\234\253\346\200\273\347\273\223.md" @@ -1,5 +1,4 @@ - # 本周小结!(回溯算法系列三) ## 周一 @@ -12,14 +11,14 @@ 树形结构如下: -![90.子集II](https://img-blog.csdnimg.cn/2020111217110449.png) +![90.子集II](https://code-thinking-1253855093.file.myqcloud.com/pics/2020111217110449-20230310133150714.png) ## 周二 在[回溯算法:递增子序列](https://programmercarl.com/0491.递增子序列.html)中,处处都能看到子集的身影,但处处是陷阱,值得好好琢磨琢磨! 树形结构如下: -![491. 递增子序列1](https://img-blog.csdnimg.cn/20201112170832333.png) +![491. 递增子序列1](https://code-thinking-1253855093.file.myqcloud.com/pics/20201112170832333-20230310133155209.png) [回溯算法:递增子序列](https://programmercarl.com/0491.递增子序列.html)留言区大家有很多疑问,主要还是和[回溯算法:求子集问题(二)](https://programmercarl.com/0090.子集II.html)混合在了一起。 @@ -34,7 +33,7 @@ 可以看出元素1在[1,2]中已经使用过了,但是在[2,1]中还要在使用一次1,所以处理排列问题就不用使用startIndex了。 如图: -![46.全排列](https://img-blog.csdnimg.cn/20201112170304979.png) +![46.全排列](https://code-thinking-1253855093.file.myqcloud.com/pics/20201112170304979-20230310133201250.png) **大家此时可以感受出排列问题的不同:** @@ -47,7 +46,7 @@ 树形结构如下: -![47.全排列II1](https://img-blog.csdnimg.cn/20201112171930470.png) +![47.全排列II1](https://code-thinking-1253855093.file.myqcloud.com/pics/20201112171930470-20230310133206398.png) **这道题目神奇的地方就是used[i - 1] == false也可以,used[i - 1] == true也可以!** @@ -55,11 +54,11 @@ 树层上去重(used[i - 1] == false),的树形结构如下: -![47.全排列II2.png](https://img-blog.csdnimg.cn/20201112172230434.png) +![47.全排列II2.png](https://code-thinking-1253855093.file.myqcloud.com/pics/20201112172230434-20230310133211392.png) 树枝上去重(used[i - 1] == true)的树型结构如下: -![47.全排列II3](https://img-blog.csdnimg.cn/20201112172327967.png) +![47.全排列II3](https://code-thinking-1253855093.file.myqcloud.com/pics/20201112172327967-20230310133216389.png) **可以清晰的看到使用(used[i - 1] == false),即树层去重,效率更高!** @@ -72,14 +71,17 @@ **所以这块就说一说我个人理解,对内容持开放态度,集思广益,欢迎大家来讨论!** 子集问题分析: + * 时间复杂度:$O(n × 2^n)$,因为每一个元素的状态无外乎取与不取,所以时间复杂度为$O(2^n)$,构造每一组子集都需要填进数组,又有需要$O(n)$,最终时间复杂度:$O(n × 2^n)$。 * 空间复杂度:$O(n)$,递归深度为n,所以系统栈所用空间为$O(n)$,每一层递归所用的空间都是常数级别,注意代码里的result和path都是全局变量,就算是放在参数里,传的也是引用,并不会新申请内存空间,最终空间复杂度为$O(n)$。 排列问题分析: + * 时间复杂度:$O(n!)$,这个可以从排列的树形图中很明显发现,每一层节点为n,第二层每一个分支都延伸了n-1个分支,再往下又是n-2个分支,所以一直到叶子节点一共就是 n * n-1 * n-2 * ..... 1 = n!。每个叶子节点都会有一个构造全排列填进数组的操作(对应的代码:`result.push_back(path)`),该操作的复杂度为$O(n)$。所以,最终时间复杂度为:n * n!,简化为$O(n!)$。 * 空间复杂度:$O(n)$,和子集问题同理。 组合问题分析: + * 时间复杂度:$O(n × 2^n)$,组合问题其实就是一种子集的问题,所以组合问题最坏的情况,也不会超过子集问题的时间复杂度。 * 空间复杂度:$O(n)$,和子集问题同理。 diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20201203\350\264\252\345\277\203\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20201203\350\264\252\345\277\203\345\221\250\346\234\253\346\200\273\347\273\223.md" index 10e2d1bb50..2918246a77 100644 --- "a/problems/\345\221\250\346\200\273\347\273\223/20201203\350\264\252\345\277\203\345\221\250\346\234\253\346\200\273\347\273\223.md" +++ "b/problems/\345\221\250\346\200\273\347\273\223/20201203\350\264\252\345\277\203\345\221\250\346\234\253\346\200\273\347\273\223.md" @@ -1,5 +1,4 @@ - # 本周小结!(贪心算法系列二) ## 周一 @@ -16,7 +15,7 @@ 如图: -![122.买卖股票的最佳时机II](https://img-blog.csdnimg.cn/2020112917480858.png) +![122.买卖股票的最佳时机II](https://code-thinking-1253855093.file.myqcloud.com/pics/2020112917480858.png) ## 周二 @@ -32,7 +31,7 @@ 如图: -![55.跳跃游戏](https://img-blog.csdnimg.cn/20201124154758229.png) +![55.跳跃游戏](https://code-thinking-1253855093.file.myqcloud.com/pics/20201124154758229.png) ## 周三 @@ -45,7 +44,7 @@ 如图: -![45.跳跃游戏II](https://img-blog.csdnimg.cn/20201201232309103.png) +![45.跳跃游戏II](https://code-thinking-1253855093.file.myqcloud.com/pics/20201201232309103-20230310133110942.png) 注意:**图中的移动下标是到当前这步覆盖的最远距离(下标2的位置),此时没有到终点,只能增加第二步来扩大覆盖范围**。 @@ -56,10 +55,10 @@ 而版本二就比较统一的,超过范围,步数就加一,但在移动下标的范围了做了文章。 即如果覆盖最远距离下标是倒数第二点:直接加一就行,默认一定可以到终点。如图: -![45.跳跃游戏II2](https://img-blog.csdnimg.cn/20201201232445286.png) +![45.跳跃游戏II2](https://code-thinking-1253855093.file.myqcloud.com/pics/20201201232445286-20230310133115650.png) 如果覆盖最远距离下标不是倒数第二点,说明本次覆盖已经到终点了。如图: -![45.跳跃游戏II1](https://img-blog.csdnimg.cn/20201201232338693.png) +![45.跳跃游戏II1](https://code-thinking-1253855093.file.myqcloud.com/pics/20201201232338693-20230310133120115.png) 有的录友认为版本一好理解,有的录友认为版本二好理解,其实掌握一种就可以了,也不用非要比拼一下代码的简洁性,简洁程度都差不多了。 diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20201210\345\244\215\346\235\202\345\272\246\345\210\206\346\236\220\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20201210\345\244\215\346\235\202\345\272\246\345\210\206\346\236\220\345\221\250\346\234\253\346\200\273\347\273\223.md" index 5e5f696d4c..203e448655 100644 --- "a/problems/\345\221\250\346\200\273\347\273\223/20201210\345\244\215\346\235\202\345\272\246\345\210\206\346\236\220\345\221\250\346\234\253\346\200\273\347\273\223.md" +++ "b/problems/\345\221\250\346\200\273\347\273\223/20201210\345\244\215\346\235\202\345\272\246\345\210\206\346\236\220\345\221\250\346\234\253\346\200\273\347\273\223.md" @@ -76,7 +76,8 @@ 文中从计算机硬件出发,分析计算机的计算性能,然后亲自做实验,整理出数据如下: -![程序超时1](https://img-blog.csdnimg.cn/20201208231559175.png) + +![程序超时1](https://code-thinking-1253855093.file.myqcloud.com/pics/20201208231559175-20230310133304038.png) **大家有一个数量级上的概念就可以了!** diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20201217\350\264\252\345\277\203\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20201217\350\264\252\345\277\203\345\221\250\346\234\253\346\200\273\347\273\223.md" index 4d12f92a88..fe4cc4a2ab 100644 --- "a/problems/\345\221\250\346\200\273\347\273\223/20201217\350\264\252\345\277\203\345\221\250\346\234\253\346\200\273\347\273\223.md" +++ "b/problems/\345\221\250\346\200\273\347\273\223/20201217\350\264\252\345\277\203\345\221\250\346\234\253\346\200\273\347\273\223.md" @@ -37,7 +37,8 @@ 先贪心一边,局部最优:只要右边评分比左边大,右边的孩子就多一个糖果,全局最优:相邻的孩子中,评分高的右孩子获得比左边孩子更多的糖果 如图: -![135.分发糖果](https://img-blog.csdnimg.cn/20201117114916878.png) + +![135.分发糖果](https://code-thinking-1253855093.file.myqcloud.com/pics/20201117114916878-20230310133332759.png) 接着在贪心另一边,左孩子大于右孩子,左孩子的糖果就要比右孩子多。 @@ -49,7 +50,7 @@ 局部最优可以推出全局最优。 如图: -![135.分发糖果1](https://img-blog.csdnimg.cn/20201117115658791.png) +![135.分发糖果1](https://code-thinking-1253855093.file.myqcloud.com/pics/20201117115658791-20230310133346127.png) ## 周三 diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20201224\350\264\252\345\277\203\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20201224\350\264\252\345\277\203\345\221\250\346\234\253\346\200\273\347\273\223.md" index 1bc3924751..7436295af3 100644 --- "a/problems/\345\221\250\346\200\273\347\273\223/20201224\350\264\252\345\277\203\345\221\250\346\234\253\346\200\273\347\273\223.md" +++ "b/problems/\345\221\250\346\200\273\347\273\223/20201224\350\264\252\345\277\203\345\221\250\346\234\253\346\200\273\347\273\223.md" @@ -1,5 +1,4 @@ - # 本周小结!(贪心算法系列四) ## 周一 @@ -10,7 +9,7 @@ 如图: -![452.用最少数量的箭引爆气球](https://img-blog.csdnimg.cn/20201123101929791.png) +![452.用最少数量的箭引爆气球](https://code-thinking-1253855093.file.myqcloud.com/pics/20201123101929791-20230310133845522.png) 模拟射气球的过程,很多同学真的要去模拟了,实时把气球从数组中移走,这么写的话就复杂了,从前向后遍历重复的只要跳过就可以的。 @@ -22,7 +21,7 @@ 如图: -![435.无重叠区间](https://img-blog.csdnimg.cn/20201221201553618.png) +![435.无重叠区间](https://code-thinking-1253855093.file.myqcloud.com/pics/20201221201553618.png) 细心的同学就发现了,此题和 [贪心算法:用最少数量的箭引爆气球](https://programmercarl.com/0452.用最少数量的箭引爆气球.html)非常像。 @@ -31,6 +30,7 @@ 把[贪心算法:用最少数量的箭引爆气球](https://programmercarl.com/0452.用最少数量的箭引爆气球.html)代码稍做修改,就可以AC本题。 修改后的C++代码如下: + ```CPP class Solution { public: @@ -71,7 +71,7 @@ public: 如图: -![763.划分字母区间](https://img-blog.csdnimg.cn/20201222191924417.png) +![763.划分字母区间](https://code-thinking-1253855093.file.myqcloud.com/pics/20201222191924417-20230310133855435.png) ## 周四 @@ -86,7 +86,7 @@ public: 如图: -![56.合并区间](https://img-blog.csdnimg.cn/20201223200632791.png) +![56.合并区间](https://code-thinking-1253855093.file.myqcloud.com/pics/20201223200632791-20230310133859587.png) ## 总结 diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20210114\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20210114\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" index 039f3596df..fb4978642a 100644 --- "a/problems/\345\221\250\346\200\273\347\273\223/20210114\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" +++ "b/problems/\345\221\250\346\200\273\347\273\223/20210114\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" @@ -30,7 +30,7 @@ for (int i = 1; i < m; i++) { } ``` -![62.不同路径1](https://img-blog.csdnimg.cn/20201209113631392.png) +![62.不同路径1](https://code-thinking-1253855093.file.myqcloud.com/pics/20201209113631392-20230310133703294.png) ## 周二 @@ -44,7 +44,7 @@ dp[i][j]定义依然是:表示从(0 ,0)出发,到(i, j) 有dp[i][j]条 如图: -![63.不同路径II](https://img-blog.csdnimg.cn/20210104114513928.png) +![63.不同路径II](https://code-thinking-1253855093.file.myqcloud.com/pics/20210104114513928-20230310133707783.png) 这里难住了不少同学,代码如下: @@ -69,11 +69,11 @@ for (int i = 1; i < m; i++) { 拿示例1来举例如题: -![63.不同路径II1](https://img-blog.csdnimg.cn/20210104114548983.png) +![63.不同路径II1](https://code-thinking-1253855093.file.myqcloud.com/pics/20210104114548983-20230310133711888.png) 对应的dp table 如图: -![63.不同路径II2](https://img-blog.csdnimg.cn/20210104114610256.png) +![63.不同路径II2](https://code-thinking-1253855093.file.myqcloud.com/pics/20210104114610256-20230310133715981.png) ## 周三 @@ -107,9 +107,10 @@ for (int i = 3; i <= n ; i++) { } } ``` + 举例当n为10 的时候,dp数组里的数值,如下: -![343.整数拆分](https://img-blog.csdnimg.cn/20210104173021581.png) +![343.整数拆分](https://code-thinking-1253855093.file.myqcloud.com/pics/20210104173021581-20230310133720552.png) @@ -141,7 +142,7 @@ dp数组如何初始化:只需要初始化dp[0]就可以了,推导的基础 n为5时候的dp数组状态如图: -![96.不同的二叉搜索树3](https://img-blog.csdnimg.cn/20210107093253987.png) +![96.不同的二叉搜索树3](https://code-thinking-1253855093.file.myqcloud.com/pics/20210107093253987-20230310133724531.png) ## 总结 diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20210121\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20210121\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" index e9427142d6..7bae5ca9ee 100644 --- "a/problems/\345\221\250\346\200\273\347\273\223/20210121\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" +++ "b/problems/\345\221\250\346\200\273\347\273\223/20210121\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" @@ -1,4 +1,6 @@ + # 本周小结!(动态规划系列三) + 本周我们正式开始讲解背包问题,也是动规里非常重要的一类问题。 背包问题其实有很多细节,如果了解个大概,然后也能一气呵成把代码写出来,但稍稍变变花样可能会陷入迷茫了。 @@ -15,7 +17,7 @@ 关于其他几种常用的背包,大家看这张图就了然于胸了: -![416.分割等和子集1](https://img-blog.csdnimg.cn/20210117171307407.png) +![416.分割等和子集1](https://code-thinking-1253855093.file.myqcloud.com/pics/20210117171307407-20230310133624872.png) 本文用动规五部曲详细讲解了01背包的二维dp数组的实现方法,大家其实可以发现最简单的是推导公式了,推导公式估计看一遍就记下来了,但难就难在确定初始化和遍历顺序上。 @@ -61,14 +63,14 @@ for(int i = 1; i < weight.size(); i++) { // 遍历物品 物品为: | | 重量 | 价值 | -| --- | --- | --- | +| ----- | ---- | ---- | | 物品0 | 1 | 15 | | 物品1 | 3 | 20 | | 物品2 | 4 | 30 | 来看一下对应的dp数组的数值,如图: -![动态规划-背包问题4](https://img-blog.csdnimg.cn/20210118163425129.jpg) +![动态规划-背包问题4](https://code-thinking-1253855093.file.myqcloud.com/pics/20210118163425129-20230310133630224.jpg) 最终结果就是dp[2][4]。 @@ -120,7 +122,7 @@ for(int i = 0; i < weight.size(); i++) { // 遍历物品 一维dp,分别用物品0,物品1,物品2 来遍历背包,最终得到结果如下: -![动态规划-背包问题9](https://img-blog.csdnimg.cn/20210110103614769.png) +![动态规划-背包问题9](https://code-thinking-1253855093.file.myqcloud.com/pics/20210110103614769-20230310133634873.png) ## 周三 diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20210128\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20210128\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" index 83bddaff3b..e785af1228 100644 --- "a/problems/\345\221\250\346\200\273\347\273\223/20210128\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" +++ "b/problems/\345\221\250\346\200\273\347\273\223/20210128\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" @@ -35,7 +35,7 @@ bagSize = (S + sum) / 2 = (3 + 5) / 2 = 4 dp数组状态变化如下: -![494.目标和](https://img-blog.csdnimg.cn/20210125120743274.jpg) +![494.目标和](https://code-thinking-1253855093.file.myqcloud.com/pics/20210125120743274-20230310132918821.jpg) ## 周二 @@ -72,7 +72,8 @@ dp[i][j] = max(dp[i][j], dp[i - zeroNum][j - oneNum] + 1); 最后dp数组的状态如下所示: -![474.一和零](https://img-blog.csdnimg.cn/20210120111201512.jpg) + +![474.一和零](https://code-thinking-1253855093.file.myqcloud.com/pics/20210120111201512-20230310132936011.jpg) ## 周三 diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20210225\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20210225\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" index 21cc53ad09..8fd292ed9a 100644 --- "a/problems/\345\221\250\346\200\273\347\273\223/20210225\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" +++ "b/problems/\345\221\250\346\200\273\347\273\223/20210225\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" @@ -29,7 +29,7 @@ dp[1] = max(nums[0], nums[1]); 以示例二,输入[2,7,9,3,1]为例。 -![198.打家劫舍](https://img-blog.csdnimg.cn/20210221170954115.jpg) +![198.打家劫舍](https://code-thinking-1253855093.file.myqcloud.com/pics/20210221170954115-20230310133425353.jpg) 红框dp[nums.size() - 1]为结果。 @@ -41,15 +41,15 @@ dp[1] = max(nums[0], nums[1]); * 情况一:考虑不包含首尾元素 -![213.打家劫舍II](https://img-blog.csdnimg.cn/20210129160748643.jpg) +![213.打家劫舍II](https://code-thinking-1253855093.file.myqcloud.com/pics/20210129160748643.jpg) * 情况二:考虑包含首元素,不包含尾元素 -![213.打家劫舍II1](https://img-blog.csdnimg.cn/20210129160821374.jpg) +![213.打家劫舍II1](https://code-thinking-1253855093.file.myqcloud.com/pics/20210129160821374.jpg) * 情况三:考虑包含尾元素,不包含首元素 -![213.打家劫舍II2](https://img-blog.csdnimg.cn/20210129160842491.jpg) +![213.打家劫舍II2](https://code-thinking-1253855093.file.myqcloud.com/pics/20210129160842491.jpg) 需要注意的是,**“考虑” 不等于 “偷”**,例如情况三,虽然是考虑包含尾元素,但不一定要选尾部元素!对于情况三,取nums[1] 和 nums[3]就是最大的。 @@ -135,9 +135,11 @@ dp数组含义:下标为0记录不偷该节点所得到的的最大金钱, 2. 确定终止条件 在遍历的过程中,如果遇到空间点的话,很明显,无论偷还是不偷都是0,所以就返回 + ``` if (cur == NULL) return vector{0, 0}; ``` + 3. 确定遍历顺序 采用后序遍历,代码如下: @@ -175,7 +177,7 @@ return {val2, val1}; 以示例1为例,dp数组状态如下:(**注意用后序遍历的方式推导**) -![337.打家劫舍III](https://img-blog.csdnimg.cn/20210129181331613.jpg) +![337.打家劫舍III](https://code-thinking-1253855093.file.myqcloud.com/pics/20210129181331613.jpg) **最后头结点就是 取下标0 和 下标1的最大值就是偷得的最大金钱**。 @@ -196,6 +198,7 @@ return {val2, val1}; 这里我给出了三种解法: 暴力解法代码: + ```CPP class Solution { public: diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20210304\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20210304\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" index c912b92d4a..b814e1b39e 100644 --- "a/problems/\345\221\250\346\200\273\347\273\223/20210304\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" +++ "b/problems/\345\221\250\346\200\273\347\273\223/20210304\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" @@ -76,7 +76,7 @@ dp[0][4] = 0; 以输入[1,2,3,4,5]为例 -![123.买卖股票的最佳时机III](https://img-blog.csdnimg.cn/20201228181724295.png) +![123.买卖股票的最佳时机III](https://code-thinking-1253855093.file.myqcloud.com/pics/20201228181724295.png) 可以看到红色框为最后两次卖出的状态。 @@ -142,7 +142,8 @@ for (int j = 1; j < 2 * k; j += 2) { 以输入[1,2,3,4,5],k=2为例。 -![188.买卖股票的最佳时机IV](https://img-blog.csdnimg.cn/20201229100358221.png) + +![188.买卖股票的最佳时机IV](https://code-thinking-1253855093.file.myqcloud.com/pics/20201229100358221-20230310133805763.png) 最后一次卖出,一定是利润最大的,dp[prices.size() - 1][2 * k]即红色部分就是最后求解。 @@ -194,7 +195,8 @@ vector> dp(n, vector(3, 0)); 以 [1,2,3,0,2] 为例,dp数组如下: -![309.最佳买卖股票时机含冷冻期](https://img-blog.csdnimg.cn/20201229163725348.png) + +![309.最佳买卖股票时机含冷冻期](https://code-thinking-1253855093.file.myqcloud.com/pics/20201229163725348.png) 最后两个状态 不持有股票(能购买) 和 不持有股票(冷冻期)都有可能最后结果,取最大的。 diff --git "a/problems/\345\223\210\345\270\214\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\345\223\210\345\270\214\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" index 41647d48e1..123fb53124 100644 --- "a/problems/\345\223\210\345\270\214\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\345\223\210\345\270\214\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -1,3 +1,4 @@ +

@@ -6,6 +7,7 @@ + ## 哈希表 首先什么是 哈希表,哈希表(英文名字为Hash table,国内也有一些算法书籍翻译为散列表,大家看到这两个名称知道都是指hash table就可以了)。 @@ -16,7 +18,7 @@ 哈希表中关键码就是数组的索引下标,然后通过下标直接访问数组中的元素,如下图所示: -![哈希表1](https://img-blog.csdnimg.cn/20210104234805168.png) +![哈希表1](https://code-thinking-1253855093.file.myqcloud.com/pics/20210104234805168.png) 那么哈希表能解决什么问题呢,**一般哈希表都是用来快速判断一个元素是否出现集合里。** @@ -34,7 +36,7 @@ 哈希函数如下图所示,通过hashCode把名字转化为数值,一般hashcode是通过特定编码方式,可以将其他数据格式转化为不同的数值,这样就把学生名字映射为哈希表上的索引数字了。 -![哈希表2](https://img-blog.csdnimg.cn/2021010423484818.png) +![哈希表2](https://code-thinking-1253855093.file.myqcloud.com/pics/2021010423484818.png) 如果hashCode得到的数值大于 哈希表的大小了,也就是大于tableSize了,怎么办呢? @@ -50,7 +52,7 @@ 如图所示,小李和小王都映射到了索引下标 1 的位置,**这一现象叫做哈希碰撞**。 -![哈希表3](https://img-blog.csdnimg.cn/2021010423494884.png) +![哈希表3](https://code-thinking-1253855093.file.myqcloud.com/pics/2021010423494884.png) 一般哈希碰撞有两种解决方法, 拉链法和线性探测法。 @@ -58,7 +60,7 @@ 刚刚小李和小王在索引1的位置发生了冲突,发生冲突的元素都被存储在链表中。 这样我们就可以通过索引找到小李和小王了 -![哈希表4](https://img-blog.csdnimg.cn/20210104235015226.png) +![哈希表4](https://code-thinking-1253855093.file.myqcloud.com/pics/20210104235015226.png) (数据规模是dataSize, 哈希表的大小为tableSize) @@ -70,7 +72,7 @@ 例如冲突的位置,放了小李,那么就向下找一个空位放置小王的信息。所以要求tableSize一定要大于dataSize ,要不然哈希表上就没有空置的位置来存放 冲突的数据了。如图所示: -![哈希表5](https://img-blog.csdnimg.cn/20210104235109950.png) +![哈希表5](https://code-thinking-1253855093.file.myqcloud.com/pics/20210104235109950.png) 其实关于哈希碰撞还有非常多的细节,感兴趣的同学可以再好好研究一下,这里我就不再赘述了。 @@ -86,19 +88,19 @@ 在C++中,set 和 map 分别提供以下三种数据结构,其底层实现以及优劣如下表所示: -|集合 |底层实现 | 是否有序 |数值是否可以重复 | 能否更改数值|查询效率 |增删效率| -|---|---| --- |---| --- | --- | ---| -|std::set |红黑树 |有序 |否 |否 | O(log n)|O(log n) | -|std::multiset | 红黑树|有序 |是 | 否| O(logn) |O(logn) | -|std::unordered_set |哈希表 |无序 |否 |否 |O(1) | O(1)| +| 集合 | 底层实现 | 是否有序 | 数值是否可以重复 | 能否更改数值 | 查询效率 | 增删效率 | +| ------------------ | -------- | -------- | ---------------- | ------------ | -------- | -------- | +| std::set | 红黑树 | 有序 | 否 | 否 | O(log n) | O(log n) | +| std::multiset | 红黑树 | 有序 | 是 | 否 | O(logn) | O(logn) | +| std::unordered_set | 哈希表 | 无序 | 否 | 否 | O(1) | O(1) | std::unordered_set底层实现为哈希表,std::set 和std::multiset 的底层实现是红黑树,红黑树是一种平衡二叉搜索树,所以key值是有序的,但key不可以修改,改动key值会导致整棵树的错乱,所以只能删除和增加。 -|映射 |底层实现 | 是否有序 |数值是否可以重复 | 能否更改数值|查询效率 |增删效率| -|---|---| --- |---| --- | --- | ---| -|std::map |红黑树 |key有序 |key不可重复 |key不可修改 | O(logn)|O(logn) | -|std::multimap | 红黑树|key有序 | key可重复 | key不可修改|O(log n) |O(log n) | -|std::unordered_map |哈希表 | key无序 |key不可重复 |key不可修改 |O(1) | O(1)| +| 映射 | 底层实现 | 是否有序 | 数值是否可以重复 | 能否更改数值 | 查询效率 | 增删效率 | +| ------------------ | -------- | -------- | ---------------- | ------------ | -------- | -------- | +| std::map | 红黑树 | key有序 | key不可重复 | key不可修改 | O(logn) | O(logn) | +| std::multimap | 红黑树 | key有序 | key可重复 | key不可修改 | O(log n) | O(log n) | +| std::unordered_map | 哈希表 | key无序 | key不可重复 | key不可修改 | O(1) | O(1) | std::unordered_map 底层实现为哈希表,std::map 和std::multimap 的底层实现是红黑树。同理,std::map 和std::multimap 的key也是有序的(这个问题也经常作为面试题,考察对语言容器底层的理解)。 @@ -114,7 +116,7 @@ std::unordered_map 底层实现为哈希表,std::map 和std::multimap 的底 实际上功能都是一样一样的, 但是unordered_set在C++11的时候被引入标准库了,而hash_set并没有,所以建议还是使用unordered_set比较好,这就好比一个是官方认证的,hash_set,hash_map 是C++11标准之前民间高手自发造的轮子。 -![哈希表6](https://img-blog.csdnimg.cn/20210104235134572.png) +![哈希表6](https://code-thinking-1253855093.file.myqcloud.com/pics/20210104235134572.png) ## 总结 diff --git "a/problems/\345\233\236\346\272\257\346\200\273\347\273\223.md" "b/problems/\345\233\236\346\272\257\346\200\273\347\273\223.md" index 58fb42f841..21d78bc211 100644 --- "a/problems/\345\233\236\346\272\257\346\200\273\347\273\223.md" +++ "b/problems/\345\233\236\346\272\257\346\200\273\347\273\223.md" @@ -1,12 +1,14 @@ +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+ > 20张树形结构图、14道精选回溯题目,21篇回溯法精讲文章,由浅入深,一气呵成,这是全网最强回溯算法总结! -# 回溯法理论基础 +# 回溯法理论基础 转眼间[「代码随想录」](https://img-blog.csdnimg.cn/20200815195519696.png)里已经分享连续讲解了21天的回溯算法,是时候做一个大总结了,本篇高能,需要花费很大的精力来看! @@ -49,9 +51,9 @@ void backtracking(参数) { **事实证明这个模板会伴随整个回溯法系列!** -# 组合问题 +# 组合问题 -## 组合问题 +## 组合问题 在[回溯算法:求组合问题!](https://programmercarl.com/0077.组合.html)中,我们开始用回溯法解决第一道题目:组合问题。 @@ -61,17 +63,17 @@ void backtracking(参数) { 本题我把回溯问题抽象为树形结构,如题: -![77.组合1](https://img-blog.csdnimg.cn/20201118152928844.png) +![77.组合1](https://code-thinking-1253855093.file.myqcloud.com/pics/20201118152928844.png) 可以直观的看出其搜索的过程:**for循环横向遍历,递归纵向遍历,回溯不断调整结果集**,这个理念贯穿整个回溯法系列,也是我做了很多回溯的题目,不断摸索其规律才总结出来的。 -对于回溯法的整体框架,网上搜的文章这块都说不清楚,按照天上掉下来的代码对着讲解,不知道究竟是怎么来的,也不知道为什么要这么写。 +对于回溯法的整体框架,网上搜的文章这块都说不清楚,按照天上掉下来的代码对着讲解,不知道究竟是怎么来的,也不知道为什么要这么写。 **所以,录友们刚开始学回溯法,起跑姿势就很标准了!** 优化回溯算法只有剪枝一种方法,在[回溯算法:组合问题再剪剪枝](https://programmercarl.com/0077.组合优化.html)中把回溯法代码做了剪枝优化,树形结构如图: -![77.组合4](https://img-blog.csdnimg.cn/20201118153133458.png) +![77.组合4](https://code-thinking-1253855093.file.myqcloud.com/pics/20201118153133458.png) 大家可以一目了然剪的究竟是哪里。 @@ -87,11 +89,11 @@ void backtracking(参数) { 在[回溯算法:求组合总和!](https://programmercarl.com/0216.组合总和III.html)中,相当于 [回溯算法:求组合问题!](https://programmercarl.com/0077.组合.html)加了一个元素总和的限制。 树形结构如图: -![216.组合总和III](https://img-blog.csdnimg.cn/20201118201921245.png) +![216.组合总和III](https://code-thinking-1253855093.file.myqcloud.com/pics/20201118201921245.png) 整体思路还是一样的,本题的剪枝会好想一些,即:**已选元素总和如果已经大于n(题中要求的和)了,那么往后遍历就没有意义了,直接剪掉**,如图: -![216.组合总和III1](https://img-blog.csdnimg.cn/20201118202038240.png) +![216.组合总和III1](https://code-thinking-1253855093.file.myqcloud.com/pics/20201118202038240.png) 在本题中,依然还可以有一个剪枝,就是[回溯算法:组合问题再剪剪枝](https://programmercarl.com/0077.组合优化.html)中提到的,对for循环选择的起始范围的剪枝。 @@ -113,7 +115,7 @@ void backtracking(参数) { 树形结构如下: -![39.组合总和](https://img-blog.csdnimg.cn/20201118152521990.png) +![39.组合总和](https://code-thinking-1253855093.file.myqcloud.com/pics/20201118152521990.png) 最后还给出了本题的剪枝优化,如下: @@ -123,7 +125,7 @@ for (int i = startIndex; i < candidates.size() && sum + candidates[i] <= target; 优化后树形结构如下: -![39.组合总和1](https://img-blog.csdnimg.cn/20201118202115929.png) +![39.组合总和1](https://code-thinking-1253855093.file.myqcloud.com/pics/20201118202115929.png) ### 组合总和(三) @@ -138,7 +140,7 @@ for (int i = startIndex; i < candidates.size() && sum + candidates[i] <= target; 都知道组合问题可以抽象为树形结构,那么“使用过”在这个树形结构上是有两个维度的,一个维度是同一树枝上“使用过”,一个维度是同一树层上“使用过”。**没有理解这两个层面上的“使用过” 是造成大家没有彻底理解去重的根本原因**。 -![40.组合总和II1](https://img-blog.csdnimg.cn/2020111820220675.png) +![40.组合总和II1](https://code-thinking-1253855093.file.myqcloud.com/pics/2020111820220675.png) 我在图中将used的变化用橘黄色标注上,**可以看出在candidates[i] == candidates[i - 1]相同的情况下:** @@ -159,7 +161,7 @@ for (int i = startIndex; i < candidates.size() && sum + candidates[i] <= target; 树形结构如下: -![17. 电话号码的字母组合](https://img-blog.csdnimg.cn/20201118202335724.png) +![17. 电话号码的字母组合](https://code-thinking-1253855093.file.myqcloud.com/pics/20201118202335724.png) 如果大家在现场面试的时候,一定要注意各种输入异常的情况,例如本题输入1 * #按键。 @@ -187,10 +189,10 @@ for (int i = startIndex; i < candidates.size() && sum + candidates[i] <= target; 树形结构如下: -![131.分割回文串](https://img-blog.csdnimg.cn/20201118202448642.png) +![131.分割回文串](https://code-thinking-1253855093.file.myqcloud.com/pics/20201118202448642.png) -# 子集问题 +# 子集问题 ## 子集问题(一) @@ -198,7 +200,7 @@ for (int i = startIndex; i < candidates.size() && sum + candidates[i] <= target; 如图: -![78.子集](https://img-blog.csdnimg.cn/20201118202544339.png) +![78.子集](https://code-thinking-1253855093.file.myqcloud.com/pics/20201118202544339.png) 认清这个本质之后,今天的题目就是一道模板题了。 @@ -225,23 +227,23 @@ if (startIndex >= nums.size()) { // 终止条件可以不加 树形结构如下: -![90.子集II](https://img-blog.csdnimg.cn/2020111217110449.png) +![90.子集II](https://code-thinking-1253855093.file.myqcloud.com/pics/2020111217110449.png) ## 递增子序列 在[回溯算法:递增子序列](https://programmercarl.com/0491.递增子序列.html)中,处处都能看到子集的身影,但处处是陷阱,值得好好琢磨琢磨! 树形结构如下: -![491. 递增子序列1](https://img-blog.csdnimg.cn/20201112170832333.png) +![491. 递增子序列1](https://code-thinking-1253855093.file.myqcloud.com/pics/20201112170832333.png) 很多同学都会把这道题目和[回溯算法:求子集问题(二)](https://programmercarl.com/0090.子集II.html)混在一起。 -**[回溯算法:求子集问题(二)](https://programmercarl.com/0090.子集II.html)也可以使用set针对同一父节点本层去重,但子集问题一定要排序,为什么呢?** +**[回溯算法:求子集问题(二)](https://programmercarl.com/0090.子集II.html)也可以使用set针对同一父节点本层去重,但子集问题一定要排序,为什么呢?** 我用没有排序的集合{2,1,2,2}来举个例子画一个图,如下: -![90.子集II2](https://img-blog.csdnimg.cn/2020111316440479.png) +![90.子集II2](https://code-thinking-1253855093.file.myqcloud.com/pics/2020111316440479.png) **相信这个图胜过千言万语的解释了**。 @@ -257,7 +259,7 @@ if (startIndex >= nums.size()) { // 终止条件可以不加 如图: -![46.全排列](https://img-blog.csdnimg.cn/20201112170304979.png) +![46.全排列](https://code-thinking-1253855093.file.myqcloud.com/pics/20201112170304979.png) **大家此时可以感受出排列问题的不同:** @@ -270,7 +272,7 @@ if (startIndex >= nums.size()) { // 终止条件可以不加 树形结构如下: -![47.全排列II1](https://img-blog.csdnimg.cn/20201112171930470.png) +![47.全排列II1](https://code-thinking-1253855093.file.myqcloud.com/pics/20201112171930470.png) **这道题目神奇的地方就是used[i - 1] == false也可以,used[i - 1] == true也可以!** @@ -278,21 +280,21 @@ if (startIndex >= nums.size()) { // 终止条件可以不加 树层上去重(used[i - 1] == false),的树形结构如下: -![47.全排列II2.png](https://img-blog.csdnimg.cn/20201112172230434.png) +![47.全排列II2.png](https://code-thinking-1253855093.file.myqcloud.com/pics/20201112172230434.png) 树枝上去重(used[i - 1] == true)的树型结构如下: -![47.全排列II3](https://img-blog.csdnimg.cn/20201112172327967.png) +![47.全排列II3](https://code-thinking-1253855093.file.myqcloud.com/pics/20201112172327967.png) **可以清晰的看到使用(used[i - 1] == false),即树层去重,效率更高!** 本题used数组即是记录path里都放了哪些元素,同时也用来去重,一举两得。 -# 去重问题 +# 去重问题 以上我都是统一使用used数组来去重的,其实使用set也可以用来去重! -在[本周小结!(回溯算法系列三)续集](https://programmercarl.com/回溯算法去重问题的另一种写法.html)中给出了子集、组合、排列问题使用set来去重的解法以及具体代码,并纠正一些同学的常见错误写法。 +在[本周小结!(回溯算法系列三)续集](https://programmercarl.com/回溯算法去重问题的另一种写法.html)中给出了子集、组合、排列问题使用set来去重的解法以及具体代码,并纠正一些同学的常见错误写法。 同时详细分析了 使用used数组去重 和 使用set去重 两种写法的性能差异: @@ -304,7 +306,7 @@ if (startIndex >= nums.size()) { // 终止条件可以不加 **使用set去重,不仅时间复杂度高了,空间复杂度也高了**,在[本周小结!(回溯算法系列三)](https://programmercarl.com/周总结/20201112回溯周末总结.html)中分析过,组合,子集,排列问题的空间复杂度都是O(n),但如果使用set去重,空间复杂度就变成了O(n^2),因为每一层递归都有一个set集合,系统栈空间是n,每一个空间都有set集合。 -那有同学可能疑惑 用used数组也是占用O(n)的空间啊? +那有同学可能疑惑 用used数组也是占用O(n)的空间啊? used数组可是全局变量,每层与每层之间公用一个used数组,所以空间复杂度是O(n + n),最终空间复杂度还是O(n)。 @@ -316,7 +318,7 @@ used数组可是全局变量,每层与每层之间公用一个used数组,所 以输入:[["JFK", "KUL"], ["JFK", "NRT"], ["NRT", "JFK"]为例,抽象为树形结构如下: -![](https://img-blog.csdnimg.cn/2020111518065555.png) +![](https://code-thinking-1253855093.file.myqcloud.com/pics/2020111518065555.png) 本题可以算是一道hard的题目了,关于本题的难点我在文中已经详细列出。 @@ -325,19 +327,19 @@ used数组可是全局变量,每层与每层之间公用一个used数组,所 本题其实是一道深度优先搜索的题目,但是我完全使用回溯法的思路来讲解这道题题目,**算是给大家拓展一下思维方式,其实深搜和回溯也是分不开的,毕竟最终都是用递归**。 -# 棋盘问题 +# 棋盘问题 -## N皇后问题 +## N皇后问题 在[回溯算法:N皇后问题](https://programmercarl.com/0051.N皇后.html)中终于迎来了传说中的N皇后。 下面我用一个3 * 3 的棋盘,将搜索过程抽象为一棵树,如图: -![51.N皇后](https://img-blog.csdnimg.cn/20201118225433127.png) +![51.N皇后](https://code-thinking-1253855093.file.myqcloud.com/pics/20201118225433127.png) 从图中,可以看出,二维矩阵中矩阵的高就是这棵树的高度,矩阵的宽就是树形结构中每一个节点的宽度。 -那么我们用皇后们的约束条件,来回溯搜索这棵树,**只要搜索到了树的叶子节点,说明就找到了皇后们的合理位置了**。 +那么我们用皇后们的约束条件,来回溯搜索这棵树,**只要搜索到了树的叶子节点,说明就找到了皇后们的合理位置了**。 如果从来没有接触过N皇后问题的同学看着这样的题会感觉无从下手,可能知道要用回溯法,但也不知道该怎么去搜。 @@ -361,7 +363,7 @@ used数组可是全局变量,每层与每层之间公用一个used数组,所 因为这个树形结构太大了,我抽取一部分,如图所示: -![37.解数独](https://img-blog.csdnimg.cn/2020111720451790.png) +![37.解数独](https://code-thinking-1253855093.file.myqcloud.com/pics/2020111720451790.png) 解数独可以说是非常难的题目了,如果还一直停留在一维递归的逻辑中,这道题目可以让大家瞬间崩溃。 @@ -380,22 +382,27 @@ used数组可是全局变量,每层与每层之间公用一个used数组,所 以下在计算空间复杂度的时候我都把系统栈(不是数据结构里的栈)所占空间算进去。 子集问题分析: + * 时间复杂度:O(2^n),因为每一个元素的状态无外乎取与不取,所以时间复杂度为O(2^n) * 空间复杂度:O(n),递归深度为n,所以系统栈所用空间为O(n),每一层递归所用的空间都是常数级别,注意代码里的result和path都是全局变量,就算是放在参数里,传的也是引用,并不会新申请内存空间,最终空间复杂度为O(n) 排列问题分析: + * 时间复杂度:O(n!),这个可以从排列的树形图中很明显发现,每一层节点为n,第二层每一个分支都延伸了n-1个分支,再往下又是n-2个分支,所以一直到叶子节点一共就是 n * n-1 * n-2 * ..... 1 = n!。 * 空间复杂度:O(n),和子集问题同理。 组合问题分析: + * 时间复杂度:O(2^n),组合问题其实就是一种子集的问题,所以组合问题最坏的情况,也不会超过子集问题的时间复杂度。 * 空间复杂度:O(n),和子集问题同理。 -N皇后问题分析: +N皇后问题分析: + * 时间复杂度:O(n!) ,其实如果看树形图的话,直觉上是O(n^n),但皇后之间不能见面所以在搜索的过程中是有剪枝的,最差也就是O(n!),n!表示n * (n-1) * .... * 1。 * 空间复杂度:O(n),和子集问题同理。 解数独问题分析: + * 时间复杂度:O(9^m) , m是'.'的数目。 * 空间复杂度:O(n^2),递归的深度是n^2 @@ -403,7 +410,7 @@ N皇后问题分析: **一般说道回溯算法的复杂度,都说是指数级别的时间复杂度,这也算是一个概括吧!** -# 总结 +# 总结 **[「代码随想录」](https://img-blog.csdnimg.cn/20200815195519696.png)历时21天,14道经典题目分析,20张树形图,21篇回溯法精讲文章,从组合到切割,从子集到排列,从棋盘问题到最后的复杂度分析**,至此收尾了。 @@ -412,11 +419,12 @@ N皇后问题分析: 可以说方方面面都详细介绍到了。 例如: + * 如何理解回溯法的搜索过程? -* 什么时候用startIndex,什么时候不用? -* 如何去重?如何理解“树枝去重”与“树层去重”? +* 什么时候用startIndex,什么时候不用? +* 如何去重?如何理解“树枝去重”与“树层去重”? * 去重的几种方法? -* 如何理解二维递归? +* 如何理解二维递归? **这里的每一个问题,网上几乎找不到能讲清楚的文章,这也是直击回溯算法本质的问题**。 @@ -424,11 +432,11 @@ N皇后问题分析: 此时回溯算法系列就要正式告一段落了。 -**录友们可以回顾一下这21天,每天的打卡,每天在交流群里和大家探讨代码,最终换来的都是不知不觉的成长**。 +**录友们可以回顾一下这21天,每天的打卡,每天在交流群里和大家探讨代码,最终换来的都是不知不觉的成长**。 同样也感谢录友们的坚持,这也是我持续写作的动力,**正是因为大家的积极参与,我才知道这件事件是非常有意义的**。 -回溯专题汇聚为一张图: +回溯专题汇聚为一张图: ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211030124742.png) diff --git "a/problems/\345\233\236\346\272\257\347\256\227\346\263\225\345\216\273\351\207\215\351\227\256\351\242\230\347\232\204\345\217\246\344\270\200\347\247\215\345\206\231\346\263\225.md" "b/problems/\345\233\236\346\272\257\347\256\227\346\263\225\345\216\273\351\207\215\351\227\256\351\242\230\347\232\204\345\217\246\344\270\200\347\247\215\345\206\231\346\263\225.md" index 7386215681..69a28ad951 100644 --- "a/problems/\345\233\236\346\272\257\347\256\227\346\263\225\345\216\273\351\207\215\351\227\256\351\242\230\347\232\204\345\217\246\344\270\200\347\247\215\345\206\231\346\263\225.md" +++ "b/problems/\345\233\236\346\272\257\347\256\227\346\263\225\345\216\273\351\207\215\351\227\256\351\242\230\347\232\204\345\217\246\344\270\200\347\247\215\345\206\231\346\263\225.md" @@ -16,7 +16,8 @@ 我用没有排序的集合{2,1,2,2}来举例子画一个图,如图: -![90.子集II2](https://img-blog.csdnimg.cn/2020111316440479.png) + +![90.子集II2](https://code-thinking-1253855093.file.myqcloud.com/pics/2020111316440479-20230310121930316.png) 图中,大家就很明显的看到,子集重复了。 @@ -96,7 +97,7 @@ private: 如图: -![90.子集II1](https://img-blog.csdnimg.cn/202011131625054.png) +![90.子集II1](https://code-thinking-1253855093.file.myqcloud.com/pics/202011131625054.png) 可以看出一旦把unordered_set uset放在类成员位置,它控制的就是整棵树,包括树枝。 diff --git "a/problems/\345\233\236\346\272\257\347\256\227\346\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\345\233\236\346\272\257\347\256\227\346\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md" index aba21fa0b7..f11dbaef52 100644 --- "a/problems/\345\233\236\346\272\257\347\256\227\346\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\345\233\236\346\272\257\347\256\227\346\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -8,7 +8,7 @@ ## 题目分类大纲如下: -回溯算法大纲 +回溯算法大纲 可以配合我的B站视频:[带你学透回溯算法(理论篇)](https://www.bilibili.com/video/BV1cy4y167mM/) 一起学习! @@ -110,7 +110,7 @@ if (终止条件) { 如图: -![回溯算法理论基础](https://img-blog.csdnimg.cn/20210130173631174.png) +![回溯算法理论基础](https://code-thinking-1253855093.file.myqcloud.com/pics/20210130173631174.png) 注意图中,我特意举例集合大小和孩子的数量是相等的! diff --git "a/problems/\346\225\260\347\273\204\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\346\225\260\347\273\204\347\220\206\350\256\272\345\237\272\347\241\200.md" index c49e9ec89e..67b7b20d1b 100644 --- "a/problems/\346\225\260\347\273\204\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\346\225\260\347\273\204\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -82,7 +82,8 @@ int main() { 如图: -![数组内存](https://img-blog.csdnimg.cn/20210310150641186.png) + +![数组内存](https://code-thinking-1253855093.file.myqcloud.com/pics/20210310150641186.png) **所以可以看出在C++中二维数组在地址空间上是连续的**。 @@ -112,7 +113,8 @@ public static void test_arr() { 所以Java的二维数组可能是如下排列的方式: -![算法通关数组3](https://img-blog.csdnimg.cn/20201214111631844.png) + +![算法通关数组3](https://code-thinking-1253855093.file.myqcloud.com/pics/20201214111631844.png) 这里面试中数组相关的理论知识就介绍完了。 diff --git "a/problems/\346\240\210\344\270\216\351\230\237\345\210\227\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\346\240\210\344\270\216\351\230\237\345\210\227\347\220\206\350\256\272\345\237\272\347\241\200.md" index ee4506f4ca..0075deb6c2 100644 --- "a/problems/\346\240\210\344\270\216\351\230\237\345\210\227\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\346\240\210\344\270\216\351\230\237\345\210\227\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -10,7 +10,7 @@ 如图所示: -![栈与队列理论1](https://img-blog.csdnimg.cn/20210104235346563.png) +![栈与队列理论1](https://code-thinking-1253855093.file.myqcloud.com/pics/20210104235346563.png) 那么我这里再列出四个关于栈的问题,大家可以思考一下。以下是以C++为例,使用其他编程语言的同学也对应思考一下,自己使用的编程语言里栈和队列是什么样的。 @@ -44,7 +44,8 @@ C++标准库是有多个版本的,要知道我们使用的STL是哪个版本 来说一说栈,栈先进后出,如图所示: -![栈与队列理论2](https://img-blog.csdnimg.cn/20210104235434905.png) + +![栈与队列理论2](https://code-thinking-1253855093.file.myqcloud.com/pics/20210104235434905.png) 栈提供push 和 pop 等等接口,所有元素必须符合先进后出规则,所以栈不提供走访功能,也不提供迭代器(iterator)。 不像是set 或者map 提供迭代器iterator来遍历所有元素。 @@ -56,8 +57,8 @@ C++标准库是有多个版本的,要知道我们使用的STL是哪个版本 从下图中可以看出,栈的内部结构,栈的底层实现可以是vector,deque,list 都是可以的, 主要就是数组和链表的底层实现。 -![栈与队列理论3](https://img-blog.csdnimg.cn/20210104235459376.png) +![栈与队列理论3](https://code-thinking-1253855093.file.myqcloud.com/pics/20210104235459376.png) **我们常用的SGI STL,如果没有指定底层实现的话,默认是以deque为缺省情况下栈的底层结构。** diff --git "a/problems/\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227\357\274\210vector\345\216\237\347\220\206\350\256\262\350\247\243\357\274\211.md" "b/problems/\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227\357\274\210vector\345\216\237\347\220\206\350\256\262\350\247\243\357\274\211.md" index 315b6da12a..94d94e3849 100644 --- "a/problems/\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227\357\274\210vector\345\216\237\347\220\206\350\256\262\350\247\243\357\274\211.md" +++ "b/problems/\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227\357\274\210vector\345\216\237\347\220\206\350\256\262\350\247\243\357\274\211.md" @@ -1,3 +1,4 @@ +

@@ -5,6 +6,7 @@

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+ # 贪心算法:根据身高重建队列(续集) 在讲解[贪心算法:根据身高重建队列](https://programmercarl.com/0406.根据身高重建队列.html)中,我们提到了使用vector(C++中的动态数组)来进行insert操作是费时的。 @@ -12,6 +14,7 @@ 这里专门写一篇文章来详细说一说这个问题。 使用vector的代码如下: + ```CPP // 版本一,使用vector(动态数组) class Solution { @@ -32,12 +35,14 @@ public: }; ``` + 耗时如下: -![vectorinsert](https://img-blog.csdnimg.cn/20201218203611181.png) +![vectorinsert](https://code-thinking-1253855093.file.myqcloud.com/pics/20201218203611181.png) 其直观上来看数组的insert操作是O(n)的,整体代码的时间复杂度是O(n^2)。 这么一分析好像和版本二链表实现的时间复杂度是一样的啊,为什么提交之后效率会差距这么大呢? + ```CPP // 版本二,使用list(链表) class Solution { @@ -65,7 +70,7 @@ public: 耗时如下: -![使用链表](https://img-blog.csdnimg.cn/20201218200756257.png) +![使用链表](https://code-thinking-1253855093.file.myqcloud.com/pics/20201218200756257.png) 大家都知道对于普通数组,一旦定义了大小就不能改变,例如int a[10];,这个数组a至多只能放10个元素,改不了的。 @@ -76,6 +81,7 @@ public: **首先vector的底层实现也是普通数组**。 vector的大小有两个维度一个是size一个是capicity,size就是我们平时用来遍历vector时候用的,例如: + ``` for (int i = 0; i < vec.size(); i++) { @@ -91,7 +97,7 @@ for (int i = 0; i < vec.size(); i++) { 就是重新申请一个二倍于原数组大小的数组,然后把数据都拷贝过去,并释放原数组内存。(对,就是这么原始粗暴的方法!) 举一个例子,如图: -![vector原理](https://img-blog.csdnimg.cn/20201218185902217.png) +![vector原理](https://code-thinking-1253855093.file.myqcloud.com/pics/20201218185902217.png) 原vector中的size和capicity相同都是3,初始化为1 2 3,此时要push_back一个元素4。 @@ -131,9 +137,10 @@ public: } }; ``` + 耗时如下: -![vector手动模拟insert](https://img-blog.csdnimg.cn/20201218200626718.png) +![vector手动模拟insert](https://code-thinking-1253855093.file.myqcloud.com/pics/20201218200626718.png) 这份代码就是不让vector动态扩容,全程我们自己模拟insert的操作,大家也可以直观的看出是一个O(n^2)的方法了。 diff --git "a/problems/\350\203\214\345\214\205\346\200\273\347\273\223\347\257\207.md" "b/problems/\350\203\214\345\214\205\346\200\273\347\273\223\347\257\207.md" index 9f61b2afa7..c4e8cd9cff 100644 --- "a/problems/\350\203\214\345\214\205\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/\350\203\214\345\214\205\346\200\273\347\273\223\347\257\207.md" @@ -13,7 +13,7 @@ 关于这几种常见的背包,其关系如下: -![416.分割等和子集1](https://img-blog.csdnimg.cn/20210117171307407.png) +![416.分割等和子集1](https://code-thinking-1253855093.file.myqcloud.com/pics/20230310000726.png) 通过这个图,可以很清晰分清这几种常见背包之间的关系。 diff --git "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" index 0b2d7ae685..ff0b6aba28 100644 --- "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" +++ "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" @@ -1,10 +1,12 @@ +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

-# 动态规划:01背包理论基础 + +# 动态规划:01背包理论基础 **《代码随想录》算法视频公开课:[带你学透0-1背包问题!](https://www.bilibili.com/video/BV1cg411g7Y6/),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 @@ -20,7 +22,7 @@ 如果这几种背包,分不清,我这里画了一个图,如下: -![416.分割等和子集1](https://img-blog.csdnimg.cn/20210117171307407.png) +![416.分割等和子集1](https://code-thinking-1253855093.file.myqcloud.com/pics/20210117171307407.png) 至于背包九讲其其他背包,面试几乎不会问,都是竞赛级别的了,leetcode上连多重背包的题目都没有,所以题库也告诉我们,01背包和完全背包就够用了。 @@ -39,7 +41,7 @@ leetcode上没有纯01背包的问题,都是01背包应用方面的题目, 有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。**每件物品只能用一次**,求解将哪些物品装入背包里物品价值总和最大。 -![动态规划-背包问题](https://img-blog.csdnimg.cn/20210117175428387.jpg) +![动态规划-背包问题](https://code-thinking-1253855093.file.myqcloud.com/pics/20210117175428387.jpg) 这是标准的背包问题,以至于很多同学看了这个自然就会想到背包,甚至都不知道暴力的解法应该怎么解了。 @@ -56,7 +58,7 @@ leetcode上没有纯01背包的问题,都是01背包应用方面的题目, 物品为: | | 重量 | 价值 | -| --- | --- | --- | +| ----- | ---- | ---- | | 物品0 | 1 | 15 | | 物品1 | 3 | 20 | | 物品2 | 4 | 30 | @@ -75,7 +77,7 @@ leetcode上没有纯01背包的问题,都是01背包应用方面的题目, 只看这个二维数组的定义,大家一定会有点懵,看下面这个图: -![动态规划-背包问题1](https://img-blog.csdnimg.cn/20210110103003361.png) +![动态规划-背包问题1](https://code-thinking-1253855093.file.myqcloud.com/pics/20210110103003361.png) **要时刻记着这个dp数组的含义,下面的一些步骤都围绕这dp数组的含义进行的**,如果哪里看懵了,就来回顾一下i代表什么,j又代表什么。 @@ -96,20 +98,21 @@ leetcode上没有纯01背包的问题,都是01背包应用方面的题目, 首先从dp[i][j]的定义出发,如果背包容量j为0的话,即dp[i][0],无论是选取哪些物品,背包价值总和一定为0。如图: -![动态规划-背包问题2](https://img-blog.csdnimg.cn/2021011010304192.png) +![动态规划-背包问题2](https://code-thinking-1253855093.file.myqcloud.com/pics/2021011010304192.png) 在看其他情况。 状态转移方程 dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]); 可以看出i 是由 i-1 推导出来,那么i为0的时候就一定要初始化。 -dp[0][j],即:i为0,存放编号0的物品的时候,各个容量的背包所能存放的最大价值。 +dp[0][j],即:i为0,存放编号0的物品的时候,各个容量的背包所能存放的最大价值。 那么很明显当 j < weight[0]的时候,dp[0][j] 应该是 0,因为背包容量比编号0的物品重量还小。 当j >= weight[0]时,dp[0][j] 应该是value[0],因为背包容量放足够放编号0物品。 代码初始化如下: -``` + +``` for (int j = 0 ; j < weight[0]; j++) { // 当然这一步,如果把dp数组预先初始化为0了,这一步就可以省略,但很多同学应该没有想清楚这一点。 dp[0][j] = 0; } @@ -122,7 +125,7 @@ for (int j = weight[0]; j <= bagweight; j++) { 此时dp数组初始化情况如图所示: -![动态规划-背包问题7](https://img-blog.csdnimg.cn/20210110103109140.png) +![动态规划-背包问题7](https://code-thinking-1253855093.file.myqcloud.com/pics/20210110103109140.png) dp[0][j] 和 dp[i][0] 都已经初始化了,那么其他下标应该初始化多少呢? @@ -134,7 +137,7 @@ dp[0][j] 和 dp[i][0] 都已经初始化了,那么其他下标应该初始化 如图: -![动态规划-背包问题10](https://code-thinking.cdn.bcebos.com/pics/动态规划-背包问题10.jpg) +![动态规划-背包问题10](https://code-thinking-1253855093.file.myqcloud.com/pics/%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92-%E8%83%8C%E5%8C%85%E9%97%AE%E9%A2%9810.jpg) 最后初始化代码如下: @@ -154,7 +157,7 @@ for (int j = weight[0]; j <= bagweight; j++) { 在如下图中,可以看出,有两个遍历的维度:物品与背包重量 -![动态规划-背包问题3](https://img-blog.csdnimg.cn/2021011010314055.png) +![动态规划-背包问题3](https://code-thinking-1253855093.file.myqcloud.com/pics/2021011010314055.png) 那么问题来了,**先遍历 物品还是先遍历背包重量呢?** @@ -166,7 +169,7 @@ for (int j = weight[0]; j <= bagweight; j++) { // weight数组的大小 就是物品个数 for(int i = 1; i < weight.size(); i++) { // 遍历物品 for(int j = 0; j <= bagweight; j++) { // 遍历背包容量 - if (j < weight[i]) dp[i][j] = dp[i - 1][j]; + if (j < weight[i]) dp[i][j] = dp[i - 1][j]; else dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]); } @@ -195,11 +198,11 @@ dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]); 递归公式 dp[i-1][j]和dp[i - 1][j - weight[i]] 都在dp[i][j]的左上角方向(包括正上方向),那么先遍历物品,再遍历背包的过程如图所示: -![动态规划-背包问题5](https://img-blog.csdnimg.cn/202101101032124.png) +![动态规划-背包问题5](https://code-thinking-1253855093.file.myqcloud.com/pics/202101101032124.png) 再来看看先遍历背包,再遍历物品呢,如图: -![动态规划-背包问题6](https://img-blog.csdnimg.cn/20210110103244701.png) +![动态规划-背包问题6](https://code-thinking-1253855093.file.myqcloud.com/pics/20210110103244701.png) **大家可以看出,虽然两个for循环遍历的次序不同,但是dp[i][j]所需要的数据就是左上角,根本不影响dp[i][j]公式的推导!** @@ -211,7 +214,7 @@ dp[i-1][j]和dp[i - 1][j - weight[i]] 都在dp[i][j]的左上角方向(包括 来看一下对应的dp数组的数值,如图: -![动态规划-背包问题4](https://img-blog.csdnimg.cn/20210118163425129.jpg) +![动态规划-背包问题4](https://code-thinking-1253855093.file.myqcloud.com/pics/20210118163425129.jpg) 最终结果就是dp[2][4]。 @@ -272,7 +275,7 @@ int main() { ## 其他语言版本 -### java +### java ```java public class BagProblem { @@ -336,33 +339,34 @@ public class BagProblem { ``` ### python + ```python -def test_2_wei_bag_problem1(bag_size, weight, value) -> int: +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)] - - # 初始化dp数组. - for i in range(rows): + + # 初始化dp数组. + for i in range(rows): dp[i][0] = 0 first_item_weight, first_item_value = weight[0], value[0] - for j in range(1, cols): - if first_item_weight <= j: + for j in range(1, cols): + if first_item_weight <= j: dp[0][j] = first_item_value - # 更新dp数组: 先遍历物品, 再遍历背包. - for i in range(1, len(weight)): + # 更新dp数组: 先遍历物品, 再遍历背包. + for i in range(1, len(weight)): cur_weight, cur_val = weight[i], value[i] - for j in range(1, cols): - if cur_weight > j: # 说明背包装不下当前物品. - dp[i][j] = dp[i - 1][j] # 所以不装当前物品. - else: + for j in range(1, cols): + if cur_weight > j: # 说明背包装不下当前物品. + dp[i][j] = dp[i - 1][j] # 所以不装当前物品. + else: # 定义dp数组: dp[i][j] 前i个物品里,放进容量为j的背包,价值总和最大是多少。 dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - cur_weight]+ cur_val) print(dp) -if __name__ == "__main__": +if __name__ == "__main__": bag_size = 4 weight = [1, 3, 4] value = [15, 20, 30] @@ -370,7 +374,8 @@ if __name__ == "__main__": ``` -### go +### go + ```go func test_2_wei_bag_problem1(weight, value []int, bagweight int) int { // 定义dp数组 @@ -391,7 +396,7 @@ func test_2_wei_bag_problem1(weight, value []int, bagweight int) int { } else { dp[i][j] = max(dp[i-1][j], dp[i-1][j-weight[i]]+value[i]) } - } + } } return dp[len(weight)-1][bagweight] } @@ -410,7 +415,7 @@ func main() { } ``` -### javascript +### javascript ```js function testWeightBagProblem (weight, value, size) { @@ -445,6 +450,7 @@ test(); ### C + ```c #include #include @@ -458,7 +464,7 @@ void backPack(int* weights, int weightSize, int* costs, int costSize, int bagWei // 开辟dp数组 int dp[weightSize][bagWeight + 1]; memset(dp, 0, sizeof(int) * weightSize * (bagWeight + 1)); - + int i, j; // 当背包容量大于物品0的重量时,将物品0放入到背包中 for(j = weights[0]; j <= bagWeight; ++j) { diff --git "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" index c9414fd6cf..baa4107f58 100644 --- "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" +++ "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" @@ -150,7 +150,7 @@ dp[1] = dp[1 - weight[0]] + value[0] = 15 一维dp,分别用物品0,物品1,物品2 来遍历背包,最终得到结果如下: -![动态规划-背包问题9](https://img-blog.csdnimg.cn/20210110103614769.png) +![动态规划-背包问题9](https://code-thinking-1253855093.file.myqcloud.com/pics/20210110103614769.png) diff --git "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" index 2a2f61ec38..d0b2ce0b8c 100644 --- "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" +++ "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" @@ -68,7 +68,8 @@ for(int i = 0; i < weight.size(); i++) { // 遍历物品 dp状态图如下: -![动态规划-完全背包](https://img-blog.csdnimg.cn/20210126104510106.jpg) + +![动态规划-完全背包](https://code-thinking-1253855093.file.myqcloud.com/pics/20210126104510106.jpg) 相信很多同学看网上的文章,关于完全背包介绍基本就到为止了。 @@ -91,7 +92,8 @@ dp状态图如下: 遍历物品在外层循环,遍历背包容量在内层循环,状态如图: -![动态规划-完全背包1](https://img-blog.csdnimg.cn/20210126104529605.jpg) + +![动态规划-完全背包1](https://code-thinking-1253855093.file.myqcloud.com/pics/20210126104529605.jpg) 遍历背包容量在外层循环,遍历物品在内层循环,状态如图: diff --git "a/problems/\351\223\276\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\351\223\276\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" index 44afc39626..a09974df7c 100644 --- "a/problems/\351\223\276\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\351\223\276\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -1,3 +1,4 @@ +

@@ -5,6 +6,7 @@

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+ # 关于链表,你该了解这些! 什么是链表,链表是一种通过指针串联在一起的线性结构,每一个节点由两部分组成,一个是数据域一个是指针域(存放指向下一个节点的指针),最后一个节点的指针域指向null(空指针的意思)。 @@ -12,7 +14,7 @@ 链表的入口节点称为链表的头结点也就是head。 如图所示: -![链表1](https://img-blog.csdnimg.cn/20200806194529815.png) +![链表1](https://code-thinking-1253855093.file.myqcloud.com/pics/20200806194529815.png) # 链表的类型 @@ -31,7 +33,7 @@ 双链表 既可以向前查询也可以向后查询。 如图所示: -![链表2](https://img-blog.csdnimg.cn/20200806194559317.png) +![链表2](https://code-thinking-1253855093.file.myqcloud.com/pics/20200806194559317.png) ## 循环链表 @@ -39,7 +41,7 @@ 循环链表可以用来解决约瑟夫环问题。 -![链表4](https://img-blog.csdnimg.cn/20200806194629603.png) +![链表4](https://code-thinking-1253855093.file.myqcloud.com/pics/20200806194629603.png) # 链表的存储方式 @@ -54,7 +56,7 @@ 如图所示: -![链表3](https://img-blog.csdnimg.cn/20200806194613920.png) +![链表3](https://code-thinking-1253855093.file.myqcloud.com/pics/20200806194613920.png) 这个链表起始节点为2, 终止节点为7, 各个节点分布在内存的不同地址空间上,通过指针串联在一起。 @@ -104,7 +106,7 @@ head->val = 5; 删除D节点,如图所示: -![链表-删除节点](https://img-blog.csdnimg.cn/20200806195114541.png) +![链表-删除节点](https://code-thinking-1253855093.file.myqcloud.com/pics/20200806195114541-20230310121459257.png) 只要将C节点的next指针 指向E节点就可以了。 @@ -118,7 +120,7 @@ head->val = 5; 如图所示: -![链表-添加节点](https://img-blog.csdnimg.cn/20200806195134331.png) +![链表-添加节点](https://code-thinking-1253855093.file.myqcloud.com/pics/20200806195134331-20230310121503147.png) 可以看出链表的增添和删除都是O(1)操作,也不会影响到其他节点。 @@ -128,7 +130,7 @@ head->val = 5; 再把链表的特性和数组的特性进行一个对比,如图所示: -![链表-链表与数据性能对比](https://img-blog.csdnimg.cn/20200806195200276.png) +![链表-链表与数据性能对比](https://code-thinking-1253855093.file.myqcloud.com/pics/20200806195200276.png) 数组在定义的时候,长度就是固定的,如果想改动数组的长度,就需要重新定义一个新的数组。 @@ -143,6 +145,7 @@ head->val = 5; Java: + ```java public class ListNode { // 结点的值 @@ -195,6 +198,7 @@ class ListNode { ``` Python: + ```python class ListNode: def __init__(self, val, next=None): @@ -203,6 +207,7 @@ class ListNode: ``` Go: + ```go type ListNode struct { Val int @@ -211,6 +216,7 @@ type ListNode struct { ``` Scala: + ```scala class ListNode(_x: Int = 0, _next: ListNode = null) { var next: ListNode = _next @@ -219,6 +225,7 @@ class ListNode(_x: Int = 0, _next: ListNode = null) { ``` Rust: + ```rust #[derive(PartialEq, Eq, Clone, Debug)] pub struct ListNode { From 3dda10b12f589a78fb026ef469c788415901b7cd Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Fri, 10 Mar 2023 14:11:11 +0800 Subject: [PATCH 1540/3019] Update --- ...\347\273\264dp\346\225\260\347\273\204.md" | 145 ------------------ 1 file changed, 145 deletions(-) delete mode 100644 "problems/0377.\347\273\204\345\220\210\346\200\273\345\222\214IV\344\272\214\347\273\264dp\346\225\260\347\273\204.md" diff --git "a/problems/0377.\347\273\204\345\220\210\346\200\273\345\222\214IV\344\272\214\347\273\264dp\346\225\260\347\273\204.md" "b/problems/0377.\347\273\204\345\220\210\346\200\273\345\222\214IV\344\272\214\347\273\264dp\346\225\260\347\273\204.md" deleted file mode 100644 index 276329c56a..0000000000 --- "a/problems/0377.\347\273\204\345\220\210\346\200\273\345\222\214IV\344\272\214\347\273\264dp\346\225\260\347\273\204.md" +++ /dev/null @@ -1,145 +0,0 @@ -# 完全背包的排列问题模拟 - -#### Problem - -1. 排列问题是完全背包中十分棘手的问题。 -2. 其在迭代过程中需要先迭代背包容量,再迭代物品个数,使得其在代码理解上较难入手。 - -#### Contribution - -本文档以力扣上[组合总和IV](https://leetcode.cn/problems/combination-sum-iv/)为例,提供一个二维dp的代码例子,并提供模拟过程以便于理解 - -#### Code - -```cpp -int combinationSum4(vector& nums, int target) { - // 定义背包容量为target,物品个数为nums.size()的dp数组 - // dp[i][j]表示将第0-i个物品添加入排列中,和为j的排列方式 - vector> dp (nums.size(), vector(target+1,0)); - - // 表示有0,1,...,n个物品可选择的情况下,和为0的选择方法为1:什么都不取 - for(int i = 0; i < nums.size(); i++) dp[i][0] = 1; - - // 必须按列遍历,因为右边数组需要知道左边数组最低部的信息(排列问题) - // 后面的模拟可以更清楚的表现这么操作的原因 - for(int i = 1; i <= target; i++){ - for(int j = 0; j < nums.size(); j++){ - // 只有nums[j]可以取的情况 - if(j == 0){ - if(nums[j] > i) dp[j][i] = 0; - // 如果背包容量放不下 那么此时没有排列方式 - else dp[j][i] = dp[nums.size()-1][i-nums[j]]; - // 如果背包容量放的下 全排列方式为dp[最底层][容量-该物品容量]排列方式后面放一个nums[j] - } - // 有多个nums数可以取 - else{ - // 如果背包容量放不下 那么沿用0-j-1个物品的排列方式 - if(nums[j] > i) dp[j][i] = dp[j-1][i]; - // 如果背包容量放得下 在dp[最底层][容量-该物品容量]排列方式后面放一个nums[j]后面放个nums[j] - // INT_MAX避免溢出 - else if(i >= nums[j] && dp[j-1][i] < INT_MAX - dp[nums.size()-1][i-nums[j]]) - dp[j][i] = dp[j-1][i] + dp[nums.size()-1][i-nums[j]]; - } - } - } - // 打印dp数组 - for(int i = 0; i < nums.size(); i++){ - for(int j = 0; j <= target; j++){ - cout< Date: Fri, 10 Mar 2023 14:52:24 +0800 Subject: [PATCH 1541/3019] =?UTF-8?q?Update=200055.=E8=B7=B3=E8=B7=83?= =?UTF-8?q?=E6=B8=B8=E6=88=8F.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...7\263\350\267\203\346\270\270\346\210\217.md" | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git "a/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" "b/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" index a898263de9..6f6dec26de 100644 --- "a/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" +++ "b/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" @@ -178,16 +178,16 @@ var canJump = function(nums) { ```Rust impl Solution { - fn max(a: usize, b: usize) -> usize { - if a > b { a } else { b } - } pub fn can_jump(nums: Vec) -> bool { - let mut cover = 0; - if (nums.len() == 1) { return true; } - let mut i = 0; + if nums.len() == 1 { + return true; + } + let (mut i, mut cover) = (0, 0); while i <= cover { - cover = Self::max(i + nums[i] as usize, cover); - if cover >= nums.len() - 1 { return true; } + cover = (i + nums[i] as usize).max(cover); + if cover >= nums.len() - 1 { + return true; + } i += 1; } false From 296ef893b4a15d4459e7400bd2bd699b3173bbbc Mon Sep 17 00:00:00 2001 From: ZerenZhang2022 <118794589+ZerenZhang2022@users.noreply.github.com> Date: Fri, 10 Mar 2023 13:12:53 -0500 Subject: [PATCH 1542/3019] =?UTF-8?q?Update=200151.=E7=BF=BB=E8=BD=AC?= =?UTF-8?q?=E5=AD=97=E7=AC=A6=E4=B8=B2=E9=87=8C=E7=9A=84=E5=8D=95=E8=AF=8D?= =?UTF-8?q?.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 增加python解法:使用双指针法移除空格 --- ...14\347\232\204\345\215\225\350\257\215.md" | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git "a/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" "b/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" index dc12ae2336..eb78cc9d18 100644 --- "a/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" +++ "b/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" @@ -516,6 +516,48 @@ class Solution: return s[:ps] + s[ps:][::-1] # Must do the last step, because the last word is omit though the pointers are on the correct positions, ``` +```python +class Solution: # 使用双指针法移除空格 + def reverseWords(self, s: str) -> str: + + def removeextraspace(s): + start = 0; end = len(s)-1 + while s[start]==' ': + start+=1 + while s[end]==' ': + end-=1 + news = list(s[start:end+1]) + slow = fast = 0 + while fast0 and news[fast]==news[fast-1]==' ': + fast+=1 + news[slow]=news[fast] + slow+=1; fast+=1 + #return "".join(news[:slow]) + return news[:slow] + + def reversestr(s): + left,right = 0,len(s)-1 + news = list(s) + while left Date: Sun, 12 Mar 2023 11:25:46 +0800 Subject: [PATCH 1543/3019] =?UTF-8?q?update=200203.=E7=A7=BB=E9=99=A4?= =?UTF-8?q?=E9=93=BE=E8=A1=A8=E5=85=83=E7=B4=A0:=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E5=A4=8D=E6=9D=82=E5=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\244\351\223\276\350\241\250\345\205\203\347\264\240.md" | 6 ++++++ 1 file changed, 6 insertions(+) diff --git "a/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" "b/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" index 99bd35805a..7e3955a5ef 100644 --- "a/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" +++ "b/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" @@ -118,6 +118,9 @@ public: }; ``` +* 时间复杂度: O(n) +* 空间复杂度: O(1) + **设置一个虚拟头结点在进行移除节点操作:** ```CPP @@ -144,6 +147,9 @@ public: ``` +* 时间复杂度: O(n) +* 空间复杂度: O(1) + From 9321c3c6773f4cd244d86d5f8052042c30ba5be0 Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Sun, 12 Mar 2023 11:34:01 +0800 Subject: [PATCH 1544/3019] =?UTF-8?q?update=200707.=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E9=93=BE=E8=A1=A8=EF=BC=9A=E6=B7=BB=E5=8A=A0=E5=A4=8D=E6=9D=82?= =?UTF-8?q?=E5=BA=A6=E5=88=86=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" | 3 +++ 1 file changed, 3 insertions(+) diff --git "a/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" "b/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" index 95560fb138..f6f16e30c7 100644 --- "a/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" +++ "b/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" @@ -152,6 +152,9 @@ private: }; ``` +* 时间复杂度: 涉及 `index` 的相关操作为 O(index), 其余为 O(1) +* 空间复杂度: O(n) + ## 其他语言版本 From 2d7a9a16c513f8e49ed9cd51d7a54743588ec722 Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Sun, 12 Mar 2023 11:38:20 +0800 Subject: [PATCH 1545/3019] =?UTF-8?q?update=200206.=E7=BF=BB=E8=BD=AC?= =?UTF-8?q?=E9=93=BE=E8=A1=A8=EF=BC=9A=E6=B7=BB=E5=8A=A0=E5=A4=8D=E6=9D=82?= =?UTF-8?q?=E5=BA=A6=E5=88=86=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ....\347\277\273\350\275\254\351\223\276\350\241\250.md" | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git "a/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md" "b/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md" index 8bf61c3f8f..d558e783fe 100644 --- "a/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md" +++ "b/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md" @@ -68,6 +68,9 @@ public: }; ``` +* 时间复杂度: O(n) +* 空间复杂度: O(1) + ## 递归法 递归法相对抽象一些,但是其实和双指针法是一样的逻辑,同样是当cur为空的时候循环结束,不断将cur指向pre的过程。 @@ -97,6 +100,9 @@ public: }; ``` +* 时间复杂度: O(n), 要递归处理链表的每个节点 +* 空间复杂度: O(n), 递归调用了 n 层栈空间 + 我们可以发现,上面的递归写法和双指针法实质上都是从前往后翻转指针指向,其实还有另外一种与双指针法不同思路的递归写法:从后往前翻转指针指向。 具体代码如下(带详细注释): @@ -120,6 +126,9 @@ public: }; ``` +* 时间复杂度: O(n) +* 空间复杂度: O(n) + ## 其他语言版本 From 358818c7a499809056fee400f460cc80b0c20ceb Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Sun, 12 Mar 2023 11:41:09 +0800 Subject: [PATCH 1546/3019] =?UTF-8?q?update=200019.=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E9=93=BE=E8=A1=A8=E7=9A=84=E5=80=92=E6=95=B0=E7=AC=ACN?= =?UTF-8?q?=E4=B8=AA=E8=8A=82=E7=82=B9=EF=BC=9A=E6=B7=BB=E5=8A=A0=E5=A4=8D?= =?UTF-8?q?=E6=9D=82=E5=BA=A6=E5=88=86=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...25\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" | 3 +++ 1 file changed, 3 insertions(+) diff --git "a/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" "b/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" index c408fefcb8..a11ff8bace 100644 --- "a/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" +++ "b/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" @@ -87,6 +87,9 @@ public: }; ``` +* 时间复杂度: O(n) +* 空间复杂度: O(1) + ## 其他语言版本 From 3aabfed8bd708b8524cab5eac65b3358eeceb9bf Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Sun, 12 Mar 2023 11:46:51 +0800 Subject: [PATCH 1547/3019] =?UTF-8?q?update=200142.=E7=8E=AF=E5=BD=A2?= =?UTF-8?q?=E9=93=BE=E8=A1=A8II=EF=BC=9A=E6=B7=BB=E5=8A=A0=E5=A4=8D?= =?UTF-8?q?=E6=9D=82=E5=BA=A6=E5=88=86=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...0142.\347\216\257\345\275\242\351\223\276\350\241\250II.md" | 3 +++ 1 file changed, 3 insertions(+) diff --git "a/problems/0142.\347\216\257\345\275\242\351\223\276\350\241\250II.md" "b/problems/0142.\347\216\257\345\275\242\351\223\276\350\241\250II.md" index 8a48c7d5f6..46df477705 100644 --- "a/problems/0142.\347\216\257\345\275\242\351\223\276\350\241\250II.md" +++ "b/problems/0142.\347\216\257\345\275\242\351\223\276\350\241\250II.md" @@ -145,6 +145,9 @@ public: }; ``` +* 时间复杂度: O(n),快慢指针相遇前,指针走的次数小于链表长度,快慢指针相遇后,两个index指针走的次数也小于链表长度,总体为走的次数小于 2n +* 空间复杂度: O(1) + ## 补充 在推理过程中,大家可能有一个疑问就是:**为什么第一次在环中相遇,slow的 步数 是 x+y 而不是 x + 若干环的长度 + y 呢?** From 0ccbc1ea535240a2118296eaf1d5414c41a865b4 Mon Sep 17 00:00:00 2001 From: jeffreyjia Date: Sun, 12 Mar 2023 13:07:31 +0800 Subject: [PATCH 1548/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B00746.=E4=BD=BF?= =?UTF-8?q?=E7=94=A8=E6=9C=80=E5=B0=8F=E8=8A=B1=E8=B4=B9=E7=88=AC=E6=A5=BC?= =?UTF-8?q?=E6=A2=AF.md=20=E6=8F=90=E4=BE=9BGo=E7=89=88=E6=9C=AC=E8=A7=A3?= =?UTF-8?q?=E6=B3=95=E7=9A=84=E6=96=B0=E6=80=9D=E8=B7=AF(dp[i]=E8=A1=A8?= =?UTF-8?q?=E7=A4=BA=E4=BB=8Ei=E5=B1=82=E8=B5=B7=E8=B7=B3=E6=89=80?= =?UTF-8?q?=E9=9C=80=E8=A6=81=E6=94=AF=E4=BB=98=E7=9A=84=E6=9C=80=E5=B0=8F?= =?UTF-8?q?=E8=B4=B9=E7=94=A8)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/.gitignore | 8 ++++++ .idea/leetcode-master.iml | 9 +++++++ .idea/modules.xml | 8 ++++++ .idea/vcs.xml | 6 +++++ ...71\347\210\254\346\245\274\346\242\257.md" | 27 +++++++++++++++++++ 5 files changed, 58 insertions(+) create mode 100644 .idea/.gitignore create mode 100644 .idea/leetcode-master.iml create mode 100644 .idea/modules.xml create mode 100644 .idea/vcs.xml diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000000..35410cacdc --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# 默认忽略的文件 +/shelf/ +/workspace.xml +# 基于编辑器的 HTTP 客户端请求 +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/leetcode-master.iml b/.idea/leetcode-master.iml new file mode 100644 index 0000000000..5e764c4f0b --- /dev/null +++ b/.idea/leetcode-master.iml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000000..7c250acde5 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000000..94a25f7f4c --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git "a/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" "b/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" index 44b6406c8a..d6b3a17735 100644 --- "a/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" +++ "b/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" @@ -284,6 +284,33 @@ func min(a, b int) int { return b } ``` +``` GO +第二种思路: dp[i]表示从i层起跳所需要支付的最小费用 +递推公式: +i Date: Sun, 12 Mar 2023 13:10:21 +0800 Subject: [PATCH 1549/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0.gitignore?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000..3d725761b0 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +.DS_Store +.idea \ No newline at end of file From d8df97845c165669713c5606b5e6a5397e356d5e Mon Sep 17 00:00:00 2001 From: jeffreyjia Date: Sun, 12 Mar 2023 13:24:03 +0800 Subject: [PATCH 1550/3019] =?UTF-8?q?=E5=BF=BD=E7=95=A5idea?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/.gitignore | 8 -------- .idea/leetcode-master.iml | 9 --------- .idea/modules.xml | 8 -------- .idea/vcs.xml | 6 ------ 4 files changed, 31 deletions(-) delete mode 100644 .idea/.gitignore delete mode 100644 .idea/leetcode-master.iml delete mode 100644 .idea/modules.xml delete mode 100644 .idea/vcs.xml diff --git a/.idea/.gitignore b/.idea/.gitignore deleted file mode 100644 index 35410cacdc..0000000000 --- a/.idea/.gitignore +++ /dev/null @@ -1,8 +0,0 @@ -# 默认忽略的文件 -/shelf/ -/workspace.xml -# 基于编辑器的 HTTP 客户端请求 -/httpRequests/ -# Datasource local storage ignored files -/dataSources/ -/dataSources.local.xml diff --git a/.idea/leetcode-master.iml b/.idea/leetcode-master.iml deleted file mode 100644 index 5e764c4f0b..0000000000 --- a/.idea/leetcode-master.iml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml deleted file mode 100644 index 7c250acde5..0000000000 --- a/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 94a25f7f4c..0000000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file From 50cdae9a91df693b122f5bf8e89aa8fc5164a0d8 Mon Sep 17 00:00:00 2001 From: jeffreyjia Date: Sun, 12 Mar 2023 13:25:18 +0800 Subject: [PATCH 1551/3019] =?UTF-8?q?=E5=88=A0=E9=99=A4.gitignore?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 -- .idea/.gitignore | 8 ++++++++ .idea/leetcode-master.iml | 9 +++++++++ .idea/modules.xml | 8 ++++++++ .idea/vcs.xml | 6 ++++++ 5 files changed, 31 insertions(+), 2 deletions(-) delete mode 100644 .gitignore create mode 100644 .idea/.gitignore create mode 100644 .idea/leetcode-master.iml create mode 100644 .idea/modules.xml create mode 100644 .idea/vcs.xml diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 3d725761b0..0000000000 --- a/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -.DS_Store -.idea \ No newline at end of file diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000000..35410cacdc --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# 默认忽略的文件 +/shelf/ +/workspace.xml +# 基于编辑器的 HTTP 客户端请求 +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/leetcode-master.iml b/.idea/leetcode-master.iml new file mode 100644 index 0000000000..5e764c4f0b --- /dev/null +++ b/.idea/leetcode-master.iml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000000..7c250acde5 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000000..94a25f7f4c --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file From d34e4a8378ae8c62cdb8a3a00462561c70ec0b4a Mon Sep 17 00:00:00 2001 From: jeffreyjia Date: Sun, 12 Mar 2023 13:25:53 +0800 Subject: [PATCH 1552/3019] =?UTF-8?q?=E5=BF=BD=E7=95=A5idea?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/.gitignore | 8 -------- .idea/leetcode-master.iml | 9 --------- .idea/modules.xml | 8 -------- .idea/vcs.xml | 6 ------ 4 files changed, 31 deletions(-) delete mode 100644 .idea/.gitignore delete mode 100644 .idea/leetcode-master.iml delete mode 100644 .idea/modules.xml delete mode 100644 .idea/vcs.xml diff --git a/.idea/.gitignore b/.idea/.gitignore deleted file mode 100644 index 35410cacdc..0000000000 --- a/.idea/.gitignore +++ /dev/null @@ -1,8 +0,0 @@ -# 默认忽略的文件 -/shelf/ -/workspace.xml -# 基于编辑器的 HTTP 客户端请求 -/httpRequests/ -# Datasource local storage ignored files -/dataSources/ -/dataSources.local.xml diff --git a/.idea/leetcode-master.iml b/.idea/leetcode-master.iml deleted file mode 100644 index 5e764c4f0b..0000000000 --- a/.idea/leetcode-master.iml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml deleted file mode 100644 index 7c250acde5..0000000000 --- a/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 94a25f7f4c..0000000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file From abc26c5e5ab377379179dba63f93f7e2eef50353 Mon Sep 17 00:00:00 2001 From: StriveDD Date: Mon, 13 Mar 2023 21:26:29 +0800 Subject: [PATCH 1553/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A01020.=E9=A3=9E?= =?UTF-8?q?=E6=8A=B5=E7=9A=84=E6=95=B0=E9=87=8FJava=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E7=9A=84=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...60\347\232\204\346\225\260\351\207\217.md" | 125 ++++++++++++++++++ 1 file changed, 125 insertions(+) diff --git "a/problems/1020.\351\243\236\345\234\260\347\232\204\346\225\260\351\207\217.md" "b/problems/1020.\351\243\236\345\234\260\347\232\204\346\225\260\351\207\217.md" index 3da373765a..ad848e7379 100644 --- "a/problems/1020.\351\243\236\345\234\260\347\232\204\346\225\260\351\207\217.md" +++ "b/problems/1020.\351\243\236\345\234\260\347\232\204\346\225\260\351\207\217.md" @@ -144,6 +144,130 @@ public: } }; ``` +## 其他语言版本 + +**Java**: + +深度优先遍历版本: + +```java +class Solution { + // 四个方向 + private static final int[][] position = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}}; + + // 深度优先遍历,把可以通向边缘部分的 1 全部标记成 true + public void dfs(int[][] grid, int row, int col, boolean[][] visited) { + for (int[] current: position) { + int newRow = row + current[0], newCol = col + current[1]; + // 下标越界直接跳过 + if (newRow < 0 || newRow >= grid.length || newCol < 0 || newCol >= grid[0].length) continue; + // 当前位置不是 1 或者已经被访问了就直接跳过 + if (grid[newRow][newCol] != 1 || visited[newRow][newCol]) continue; + visited[newRow][newCol] = true; + dfs(grid, newRow, newCol, visited); + } + } + + public int numEnclaves(int[][] grid) { + int rowSize = grid.length, colSize = grid[0].length, ans = 0; // ans 记录答案 + boolean[][] visited = new boolean[rowSize][colSize]; // 标记数组 + // 左侧边界和右侧边界查找 1 进行标记并进行深度优先遍历 + for (int row = 0; row < rowSize; row++) { + if (grid[row][0] == 1 && !visited[row][0]) { + visited[row][0] = true; + dfs(grid, row, 0, visited); + } + if (grid[row][colSize - 1] == 1 && !visited[row][colSize - 1]) { + visited[row][colSize - 1] = true; + dfs(grid, row, colSize - 1, visited); + } + } + // 上边界和下边界遍历,但是四个角不用遍历,因为上面已经遍历到了 + for (int col = 1; col < colSize - 1; col++) { + if (grid[0][col] == 1 && !visited[0][col]) { + visited[0][col] = true; + dfs(grid, 0, col, visited); + } + if (grid[rowSize - 1][col] == 1 && !visited[rowSize - 1][col]) { + visited[rowSize - 1][col] = true; + dfs(grid, rowSize - 1, col, visited); + } + } + // 查找没有标记过的 1,记录到 ans 中 + for (int row = 0; row < rowSize; row++) { + for (int col = 0; col < colSize; col++) { + if (grid[row][col] == 1 && !visited[row][col]) ++ans; + } + } + return ans; + } +} +``` + +广度优先遍历版本: + +```java +class Solution { + // 四个方向 + private static final int[][] position = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}}; + + // 广度优先遍历,把可以通向边缘部分的 1 全部标记成 true + public void bfs(int[][] grid, Queue queue, boolean[][] visited) { + while (!queue.isEmpty()) { + int[] curPos = queue.poll(); + for (int[] current: position) { + int row = curPos[0] + current[0], col = curPos[1] + current[1]; + // 下标越界直接跳过 + if (row < 0 || row >= grid.length || col < 0 || col >= grid[0].length) + continue; + // 当前位置不是 1 或者已经被访问了就直接跳过 + if (visited[row][col] || grid[row][col] == 0) continue; + visited[row][col] = true; + queue.add(new int[]{row, col}); + } + } + } + + public int numEnclaves(int[][] grid) { + int rowSize = grid.length, colSize = grid[0].length, ans = 0; // ans 记录答案 + boolean[][] visited = new boolean[rowSize][colSize]; // 标记数组 + Queue queue = new ArrayDeque<>(); + // 左侧边界和右侧边界查找 1 进行标记并进行深度优先遍历 + for (int row = 0; row < rowSize; row++) { + if (grid[row][0] == 1) { + visited[row][0] = true; + queue.add(new int[]{row, 0}); + } + if (grid[row][colSize - 1] == 1) { + visited[row][colSize - 1] = true; + queue.add(new int[]{row, colSize - 1}); + } + } + // 上边界和下边界遍历,但是四个角不用遍历,因为上面已经遍历到了 + for (int col = 1; col < colSize - 1; col++) { + if (grid[0][col] == 1) { + visited[0][col] = true; + queue.add(new int[]{0, col}); + } + if (grid[rowSize - 1][col] == 1 && !visited[rowSize - 1][col]) { + visited[rowSize - 1][col] = true; + queue.add(new int[]{rowSize - 1, col}); + } + } + bfs(grid, queue, visited); + // 查找没有标记过的 1,记录到 ans 中 + for (int row = 0; row < rowSize; row++) { + for (int col = 0; col < colSize; col++) { + if (grid[row][col] == 1 && !visited[row][col]) ++ans; + } + } + return ans; + } +} +``` + + + ## 类似题目 * 1254. 统计封闭岛屿的数目 @@ -153,3 +277,4 @@ public: + From 2b73437e7283230b340d72fe208b2c39c9d6a3c7 Mon Sep 17 00:00:00 2001 From: fw_qaq Date: Tue, 14 Mar 2023 11:35:23 +0800 Subject: [PATCH 1554/3019] =?UTF-8?q?Update=200045.=E8=B7=B3=E8=B7=83?= =?UTF-8?q?=E6=B8=B8=E6=88=8FII.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\350\267\203\346\270\270\346\210\217II.md" | 48 ++++++++++--------- 1 file changed, 26 insertions(+), 22 deletions(-) diff --git "a/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" "b/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" index 22151fdc9a..911834e130 100644 --- "a/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" +++ "b/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" @@ -379,43 +379,46 @@ object Solution { ```Rust //版本一 impl Solution { - fn max(a: i32, b:i32) -> i32 { - if a > b { a } else { b } - } pub fn jump(nums: Vec) -> i32 { - if nums.len() == 0 { return 0; } - let mut cur_distance: i32 = 0; - let mut ans: i32 = 0; - let mut next_distance: i32 = 0; - for i in 0..nums.len() { - next_distance = Self::max(nums[i] + i as i32, next_distance); - if i as i32 == cur_distance { - if cur_distance != (nums.len() - 1) as i32 { + if nums.len() == 1 { + return 0; + } + let mut cur_distance = 0; + let mut ans = 0; + let mut next_distance = 0; + for (n, &i) in nums.iter().enumerate() { + next_distance = (n as i32 + i).max(next_distance); + if i == cur_distance { + if cur_distance < n as i32 - 1 { ans += 1; cur_distance = next_distance; - if next_distance == (nums.len() - 1) as i32 { break; } + if next_distance >= n as i32 - 1 { + break; + }; + } else { + break; } - else { break; } } } ans } } + ``` ```Rust //版本二 impl Solution { - fn max(a: i32, b:i32) -> i32 { - if a > b { a } else { b } - } pub fn jump(nums: Vec) -> i32 { - let mut cur_distance: i32 = 0; - let mut ans: i32 = 0; - let mut next_distance: i32 = 0; - for i in 0..nums.len() - 1 { - next_distance = Self::max(nums[i] + i as i32, next_distance); - if i as i32 == cur_distance { + if nums.len() == 1 { + return 0; + } + let mut cur_distance = 0; + let mut ans = 0; + let mut next_distance = 0; + for (n, &i) in nums.iter().enumerate() { + next_distance = (n as i32 + i).max(next_distance); + if i == cur_distance { cur_distance = next_distance; ans += 1; } @@ -423,6 +426,7 @@ impl Solution { ans } } + ``` From 05028415306e7678ef1121e7c93dd6611897d68e Mon Sep 17 00:00:00 2001 From: fw_qaq Date: Tue, 14 Mar 2023 11:58:01 +0800 Subject: [PATCH 1555/3019] =?UTF-8?q?Update=200045.=E8=B7=B3=E8=B7=83?= =?UTF-8?q?=E6=B8=B8=E6=88=8FII.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...7\263\350\267\203\346\270\270\346\210\217II.md" | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git "a/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" "b/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" index 911834e130..9b13d31d35 100644 --- "a/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" +++ "b/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" @@ -386,13 +386,13 @@ impl Solution { let mut cur_distance = 0; let mut ans = 0; let mut next_distance = 0; - for (n, &i) in nums.iter().enumerate() { - next_distance = (n as i32 + i).max(next_distance); + for (i, &n) in nums.iter().enumerate().take(nums.len() - 1) { + next_distance = (n as usize + i).max(next_distance); if i == cur_distance { - if cur_distance < n as i32 - 1 { + if cur_distance < nums.len() - 1 { ans += 1; cur_distance = next_distance; - if next_distance >= n as i32 - 1 { + if next_distance >= nums.len() - 1 { break; }; } else { @@ -403,7 +403,6 @@ impl Solution { ans } } - ``` ```Rust @@ -416,8 +415,8 @@ impl Solution { let mut cur_distance = 0; let mut ans = 0; let mut next_distance = 0; - for (n, &i) in nums.iter().enumerate() { - next_distance = (n as i32 + i).max(next_distance); + for (i, &n) in nums.iter().enumerate().take(nums.len() - 1) { + next_distance = (n as usize + i).max(next_distance); if i == cur_distance { cur_distance = next_distance; ans += 1; @@ -426,7 +425,6 @@ impl Solution { ans } } - ``` From 411ef134a7e194e281affa0be45efe9bbcad4a25 Mon Sep 17 00:00:00 2001 From: fw_qaq Date: Tue, 14 Mar 2023 12:33:05 +0800 Subject: [PATCH 1556/3019] =?UTF-8?q?Update=201005.K=E6=AC=A1=E5=8F=96?= =?UTF-8?q?=E5=8F=8D=E5=90=8E=E6=9C=80=E5=A4=A7=E5=8C=96=E7=9A=84=E6=95=B0?= =?UTF-8?q?=E7=BB=84=E5=92=8C.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...04\346\225\260\347\273\204\345\222\214.md" | 21 +++++++------------ 1 file changed, 8 insertions(+), 13 deletions(-) diff --git "a/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" "b/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" index cdf42511b1..439bdfde9b 100644 --- "a/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" +++ "b/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" @@ -231,23 +231,18 @@ var largestSumAfterKNegations = function(nums, k) { ```Rust impl Solution { - pub fn largest_sum_after_k_negations(nums: Vec, k: i32) -> i32 { - let mut nums = nums; - let mut k = k; - let len = nums.len(); - nums.sort_by(|a, b| b.abs().cmp(&a.abs())); - for i in 0..len { - if nums[i] < 0 && k > 0 { - nums[i] *= -1; + pub fn largest_sum_after_k_negations(mut nums: Vec, mut k: i32) -> i32 { + nums.sort_by_key(|b| std::cmp::Reverse(b.abs())); + for v in nums.iter_mut() { + if *v < 0 && k > 0 { + *v *= -1; k -= 1; } } - if k % 2 == 1 { nums[len - 1] *= -1; } - let mut result = 0; - for num in nums { - result += num; + if k % 2 == 1 { + *nums.last_mut().unwrap() *= -1; } - result + nums.iter().sum() } } ``` From d1eccfba1a51880bece8edba08894000591eb3e0 Mon Sep 17 00:00:00 2001 From: StriveDD Date: Tue, 14 Mar 2023 19:05:39 +0800 Subject: [PATCH 1557/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A00417.=E5=A4=AA?= =?UTF-8?q?=E5=B9=B3=E6=B4=8B=E5=A4=A7=E8=A5=BF=E6=B4=8B=E6=B0=B4=E6=B5=81?= =?UTF-8?q?=E9=97=AE=E9=A2=98.md=E7=9A=84Java=E7=89=88=E6=9C=AC=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...64\346\265\201\351\227\256\351\242\230.md" | 124 +++++++++++++++++- ...60\347\232\204\346\225\260\351\207\217.md" | 3 +- 2 files changed, 123 insertions(+), 4 deletions(-) diff --git "a/problems/0417.\345\244\252\345\271\263\346\264\213\345\244\247\350\245\277\346\264\213\346\260\264\346\265\201\351\227\256\351\242\230.md" "b/problems/0417.\345\244\252\345\271\263\346\264\213\345\244\247\350\245\277\346\264\213\346\260\264\346\265\201\351\227\256\351\242\230.md" index f936399b44..0ec8ebf9e7 100644 --- "a/problems/0417.\345\244\252\345\271\263\346\264\213\345\244\247\350\245\277\346\264\213\346\260\264\346\265\201\351\227\256\351\242\230.md" +++ "b/problems/0417.\345\244\252\345\271\263\346\264\213\345\244\247\350\245\277\346\264\213\346\260\264\346\265\201\351\227\256\351\242\230.md" @@ -230,17 +230,137 @@ for (int j = 0; j < m; j++) { dfs (heights, pacific, 0, j); // 遍历最左列,接触太平洋 dfs (heights, atlantic, n - 1, j); // 遍历最右列,接触大西洋 } -``` +``` 那么本题整体的时间复杂度其实是: 2 * n * m + n * m ,所以最终时间复杂度为 O(n * m) 。 空间复杂度为:O(n * m) 这个就不难理解了。开了几个 n * m 的数组。 - ## 其他语言版本 +### Java + +深度优先遍历: + +```Java +class Solution { + // 四个位置 + private static final int[][] position = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}}; + + /** + * @param heights 题目给定的二维数组 + * @param row 当前位置的行号 + * @param col 当前位置的列号 + * @param sign 记录是哪一条河,两条河中可以一个为 0,一个为 1 + * @param visited 记录这个位置可以到哪条河 + */ + public void dfs(int[][] heights, int row, int col, int sign, boolean[][][] visited) { + for (int[] current: position) { + int curRow = row + current[0], curCol = col + current[1]; + // 越界 + if (curRow < 0 || curRow >= heights.length || curCol < 0 || curCol >= heights[0].length) + continue; + // 高度不合适或者已经被访问过了 + if (heights[curRow][curCol] < heights[row][col] || visited[curRow][curCol][sign]) continue; + visited[curRow][curCol][sign] = true; + dfs(heights, curRow, curCol, sign, visited); + } + } + + public List> pacificAtlantic(int[][] heights) { + int rowSize = heights.length, colSize = heights[0].length; + List> ans = new ArrayList<>(); + // 记录 [row, col] 位置是否可以到某条河,可以为 true,反之为 false; + // 假设太平洋的标记为 1,大西洋为 0 + boolean[][][] visited = new boolean[rowSize][colSize][2]; + for (int row = 0; row < rowSize; row++) { + visited[row][colSize - 1][0] = true; + visited[row][0][1] = true; + dfs(heights, row, colSize - 1, 0, visited); + dfs(heights, row, 0, 1, visited); + } + for (int col = 0; col < colSize; col++) { + visited[rowSize - 1][col][0] = true; + visited[0][col][1] = true; + dfs(heights, rowSize - 1, col, 0, visited); + dfs(heights, 0, col, 1, visited); + } + for (int row = 0; row < rowSize; row++) { + for (int col = 0; col < colSize; col++) { + // 如果该位置即可以到太平洋又可以到大西洋,就放入答案数组 + if (visited[row][col][0] && visited[row][col][1]) + ans.add(List.of(row, col)); + } + } + return ans; + } +} +``` + +广度优先遍历: + +```Java +class Solution { + // 四个位置 + private static final int[][] position = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}}; + + /** + * @param heights 题目给定的二维数组 + * @param queue 记录可以到达边界的节点 + * @param visited 记录这个位置可以到哪条河 + */ + public void bfs(int[][] heights, Queue queue, boolean[][][] visited) { + while (!queue.isEmpty()) { + int[] curPos = queue.poll(); + for (int[] current: position) { + int row = curPos[0] + current[0], col = curPos[1] + current[1], sign = curPos[2]; + // 越界 + if (row < 0 || row >= heights.length || col < 0 || col >= heights[0].length) continue; + // 高度不合适或者已经被访问过了 + if (heights[row][col] < heights[curPos[0]][curPos[1]] || visited[row][col][sign]) continue; + visited[row][col][sign] = true; + queue.add(new int[]{row, col, sign}); + } + } + } + + public List> pacificAtlantic(int[][] heights) { + int rowSize = heights.length, colSize = heights[0].length; + List> ans = new ArrayList<>(); + boolean[][][] visited = new boolean[rowSize][colSize][2]; + // 队列,保存的数据为 [行号, 列号, 标记] + // 假设太平洋的标记为 1,大西洋为 0 + Queue queue = new ArrayDeque<>(); + for (int row = 0; row < rowSize; row++) { + visited[row][colSize - 1][0] = true; + visited[row][0][1] = true; + queue.add(new int[]{row, colSize - 1, 0}); + queue.add(new int[]{row, 0, 1}); + } + for (int col = 0; col < colSize; col++) { + visited[rowSize - 1][col][0] = true; + visited[0][col][1] = true; + queue.add(new int[]{rowSize - 1, col, 0}); + queue.add(new int[]{0, col, 1}); + } + bfs(heights, queue, visited); + for (int row = 0; row < rowSize; row++) { + for (int col = 0; col < colSize; col++) { + // 如果该位置即可以到太平洋又可以到大西洋,就放入答案数组 + if (visited[row][col][0] && visited[row][col][1]) + ans.add(List.of(row, col)); + } + } + return ans; + } +} +``` + + +

+ diff --git "a/problems/1020.\351\243\236\345\234\260\347\232\204\346\225\260\351\207\217.md" "b/problems/1020.\351\243\236\345\234\260\347\232\204\346\225\260\351\207\217.md" index ad848e7379..d244e60c71 100644 --- "a/problems/1020.\351\243\236\345\234\260\347\232\204\346\225\260\351\207\217.md" +++ "b/problems/1020.\351\243\236\345\234\260\347\232\204\346\225\260\351\207\217.md" @@ -146,7 +146,7 @@ public: ``` ## 其他语言版本 -**Java**: +### Java 深度优先遍历版本: @@ -277,4 +277,3 @@ class Solution { - From d002d8769cfae23d0f5656bf9f36ba10590371d7 Mon Sep 17 00:00:00 2001 From: StriveDD Date: Wed, 15 Mar 2023 20:36:34 +0800 Subject: [PATCH 1558/3019] =?UTF-8?q?=E6=8F=90=E4=BA=A41020.=E9=A3=9E?= =?UTF-8?q?=E6=8A=B5=E7=9A=84=E6=95=B0=E9=87=8F.md=E7=9A=84Python=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E4=BB=A3=E7=A0=81=EF=BC=8C0417.=E5=A4=AA=E5=B9=B3?= =?UTF-8?q?=E6=B4=8B=E5=A4=A7=E8=A5=BF=E6=B4=8B=E6=B0=B4=E6=B5=81=E9=97=AE?= =?UTF-8?q?=E9=A2=98.md=E7=9A=84Python=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 --- ...64\346\265\201\351\227\256\351\242\230.md" | 95 ++++++++++++++- ...60\347\232\204\346\225\260\351\207\217.md" | 113 +++++++++++++++++- 2 files changed, 202 insertions(+), 6 deletions(-) diff --git "a/problems/0417.\345\244\252\345\271\263\346\264\213\345\244\247\350\245\277\346\264\213\346\260\264\346\265\201\351\227\256\351\242\230.md" "b/problems/0417.\345\244\252\345\271\263\346\264\213\345\244\247\350\245\277\346\264\213\346\260\264\346\265\201\351\227\256\351\242\230.md" index 0ec8ebf9e7..ec22936577 100644 --- "a/problems/0417.\345\244\252\345\271\263\346\264\213\345\244\247\350\245\277\346\264\213\346\260\264\346\265\201\351\227\256\351\242\230.md" +++ "b/problems/0417.\345\244\252\345\271\263\346\264\213\345\244\247\350\245\277\346\264\213\346\260\264\346\265\201\351\227\256\351\242\230.md" @@ -356,6 +356,100 @@ class Solution { } ``` +### Python + +深度优先遍历 + +```Python3 +class Solution: + def __init__(self): + self.position = [[-1, 0], [0, 1], [1, 0], [0, -1]] # 四个方向 + + # heights:题目给定的二维数组, row:当前位置的行号, col:当前位置的列号 + # sign:记录是哪一条河,两条河中可以一个为 0,一个为 1 + # visited:记录这个位置可以到哪条河 + def dfs(self, heights: List[List[int]], row: int, col: int, sign: int, visited: List[List[List[int]]]): + for current in self.position: + curRow, curCol = row + current[0], col + current[1] + # 索引下标越界 + if curRow < 0 or curRow >= len(heights) or curCol < 0 or curCol >= len(heights[0]): continue + # 不满足条件或者已经被访问过 + if heights[curRow][curCol] < heights[row][col] or visited[curRow][curCol][sign]: continue + visited[curRow][curCol][sign] = True + self.dfs(heights, curRow, curCol, sign, visited) + + def pacificAtlantic(self, heights: List[List[int]]) -> List[List[int]]: + rowSize, colSize = len(heights), len(heights[0]) + # visited 记录 [row, col] 位置是否可以到某条河,可以为 true,反之为 false; + # 假设太平洋的标记为 1,大西洋为 0 + # ans 用来保存满足条件的答案 + ans, visited = [], [[[False for _ in range(2)] for _ in range(colSize)] for _ in range(rowSize)] + for row in range(rowSize): + visited[row][0][1] = True + visited[row][colSize - 1][0] = True + self.dfs(heights, row, 0, 1, visited) + self.dfs(heights, row, colSize - 1, 0, visited) + for col in range(0, colSize): + visited[0][col][1] = True + visited[rowSize - 1][col][0] = True + self.dfs(heights, 0, col, 1, visited) + self.dfs(heights, rowSize - 1, col, 0, visited) + for row in range(rowSize): + for col in range(colSize): + # 如果该位置即可以到太平洋又可以到大西洋,就放入答案数组 + if visited[row][col][0] and visited[row][col][1]: + ans.append([row, col]) + return ans +``` + +广度优先遍历 + +```Python3 +class Solution: + def __init__(self): + self.position = [[-1, 0], [0, 1], [1, 0], [0, -1]] + + # heights:题目给定的二维数组,visited:记录这个位置可以到哪条河 + def bfs(self, heights: List[List[int]], queue: deque, visited: List[List[List[int]]]): + while queue: + curPos = queue.popleft() + for current in self.position: + row, col, sign = curPos[0] + current[0], curPos[1] + current[1], curPos[2] + # 越界 + if row < 0 or row >= len(heights) or col < 0 or col >= len(heights[0]): continue + # 不满足条件或已经访问过 + if heights[row][col] < heights[curPos[0]][curPos[1]] or visited[row][col][sign]: continue + visited[row][col][sign] = True + queue.append([row, col, sign]) + + def pacificAtlantic(self, heights: List[List[int]]) -> List[List[int]]: + rowSize, colSize = len(heights), len(heights[0]) + # visited 记录 [row, col] 位置是否可以到某条河,可以为 true,反之为 false; + # 假设太平洋的标记为 1,大西洋为 0 + # ans 用来保存满足条件的答案 + ans, visited = [], [[[False for _ in range(2)] for _ in range(colSize)] for _ in range(rowSize)] + # 队列,保存的数据为 [行号, 列号, 标记] + # 假设太平洋的标记为 1,大西洋为 0 + queue = deque() + for row in range(rowSize): + visited[row][0][1] = True + visited[row][colSize - 1][0] = True + queue.append([row, 0, 1]) + queue.append([row, colSize - 1, 0]) + for col in range(0, colSize): + visited[0][col][1] = True + visited[rowSize - 1][col][0] = True + queue.append([0, col, 1]) + queue.append([rowSize - 1, col, 0]) + self.bfs(heights, queue, visited) # 广度优先遍历 + for row in range(rowSize): + for col in range(colSize): + # 如果该位置即可以到太平洋又可以到大西洋,就放入答案数组 + if visited[row][col][0] and visited[row][col][1]: + ans.append([row, col]) + return ans +``` + @@ -363,4 +457,3 @@ class Solution { - diff --git "a/problems/1020.\351\243\236\345\234\260\347\232\204\346\225\260\351\207\217.md" "b/problems/1020.\351\243\236\345\234\260\347\232\204\346\225\260\351\207\217.md" index d244e60c71..f97678e872 100644 --- "a/problems/1020.\351\243\236\345\234\260\347\232\204\346\225\260\351\207\217.md" +++ "b/problems/1020.\351\243\236\345\234\260\347\232\204\346\225\260\351\207\217.md" @@ -170,7 +170,8 @@ class Solution { public int numEnclaves(int[][] grid) { int rowSize = grid.length, colSize = grid[0].length, ans = 0; // ans 记录答案 - boolean[][] visited = new boolean[rowSize][colSize]; // 标记数组 + // 标记数组记录每个值为 1 的位置是否可以到达边界,可以为 true,反之为 false + boolean[][] visited = new boolean[rowSize][colSize]; // 左侧边界和右侧边界查找 1 进行标记并进行深度优先遍历 for (int row = 0; row < rowSize; row++) { if (grid[row][0] == 1 && !visited[row][0]) { @@ -230,9 +231,10 @@ class Solution { public int numEnclaves(int[][] grid) { int rowSize = grid.length, colSize = grid[0].length, ans = 0; // ans 记录答案 - boolean[][] visited = new boolean[rowSize][colSize]; // 标记数组 + // 标记数组记录每个值为 1 的位置是否可以到达边界,可以为 true,反之为 false + boolean[][] visited = new boolean[rowSize][colSize]; Queue queue = new ArrayDeque<>(); - // 左侧边界和右侧边界查找 1 进行标记并进行深度优先遍历 + // 搜索左侧边界和右侧边界查找 1 存入队列 for (int row = 0; row < rowSize; row++) { if (grid[row][0] == 1) { visited[row][0] = true; @@ -243,7 +245,7 @@ class Solution { queue.add(new int[]{row, colSize - 1}); } } - // 上边界和下边界遍历,但是四个角不用遍历,因为上面已经遍历到了 + // 搜索上边界和下边界遍历,但是四个角不用遍历,因为上面已经遍历到了 for (int col = 1; col < colSize - 1; col++) { if (grid[0][col] == 1) { visited[0][col] = true; @@ -254,7 +256,7 @@ class Solution { queue.add(new int[]{rowSize - 1, col}); } } - bfs(grid, queue, visited); + bfs(grid, queue, visited); // 广度优先遍历 // 查找没有标记过的 1,记录到 ans 中 for (int row = 0; row < rowSize; row++) { for (int col = 0; col < colSize; col++) { @@ -266,6 +268,106 @@ class Solution { } ``` +### Python + +深度优先遍历 + +```Python3 +class Solution: + def __init__(self): + self.position = [[-1, 0], [0, 1], [1, 0], [0, -1]] # 四个方向 + + # 深度优先遍历,把可以通向边缘部分的 1 全部标记成 true + def dfs(self, grid: List[List[int]], row: int, col: int, visited: List[List[bool]]) -> None: + for current in self.position: + newRow, newCol = row + current[0], col + current[1] + # 索引下标越界 + if newRow < 0 or newRow >= len(grid) or newCol < 0 or newCol >= len(grid[0]): + continue + # 当前位置值不是 1 或者已经被访问过了 + if grid[newRow][newCol] == 0 or visited[newRow][newCol]: continue + visited[newRow][newCol] = True + self.dfs(grid, newRow, newCol, visited) + + def numEnclaves(self, grid: List[List[int]]) -> int: + rowSize, colSize, ans = len(grid), len(grid[0]), 0 + # 标记数组记录每个值为 1 的位置是否可以到达边界,可以为 True,反之为 False + visited = [[False for _ in range(colSize)] for _ in range(rowSize)] + # 搜索左边界和右边界,对值为 1 的位置进行深度优先遍历 + for row in range(rowSize): + if grid[row][0] == 1: + visited[row][0] = True + self.dfs(grid, row, 0, visited) + if grid[row][colSize - 1] == 1: + visited[row][colSize - 1] = True + self.dfs(grid, row, colSize - 1, visited) + # 搜索上边界和下边界,对值为 1 的位置进行深度优先遍历,但是四个角不需要,因为上面遍历过了 + for col in range(1, colSize - 1): + if grid[0][col] == 1: + visited[0][col] = True + self.dfs(grid, 0, col, visited) + if grid[rowSize - 1][col] == 1: + visited[rowSize - 1][col] = True + self.dfs(grid, rowSize - 1, col, visited) + # 找出矩阵中值为 1 但是没有被标记过的位置,记录答案 + for row in range(rowSize): + for col in range(colSize): + if grid[row][col] == 1 and not visited[row][col]: + ans += 1 + return ans +``` + +广度优先遍历 + +```Python3 +class Solution: + def __init__(self): + self.position = [[-1, 0], [0, 1], [1, 0], [0, -1]] # 四个方向 + + # 广度优先遍历,把可以通向边缘部分的 1 全部标记成 true + def bfs(self, grid: List[List[int]], queue: deque, visited: List[List[bool]]) -> None: + while queue: + curPos = queue.popleft() + for current in self.position: + row, col = curPos[0] + current[0], curPos[1] + current[1] + # 索引下标越界 + if row < 0 or row >= len(grid) or col < 0 or col >= len(grid[0]): continue + # 当前位置值不是 1 或者已经被访问过了 + if grid[row][col] == 0 or visited[row][col]: continue + visited[row][col] = True + queue.append([row, col]) + + + def numEnclaves(self, grid: List[List[int]]) -> int: + rowSize, colSize, ans = len(grid), len(grid[0]), 0 + # 标记数组记录每个值为 1 的位置是否可以到达边界,可以为 True,反之为 False + visited = [[False for _ in range(colSize)] for _ in range(rowSize)] + queue = deque() # 队列 + # 搜索左侧边界和右侧边界查找 1 存入队列 + for row in range(rowSize): + if grid[row][0] == 1: + visited[row][0] = True + queue.append([row, 0]) + if grid[row][colSize - 1] == 1: + visited[row][colSize - 1] = True + queue.append([row, colSize - 1]) + # 搜索上边界和下边界查找 1 存入队列,但是四个角不用遍历,因为上面已经遍历到了 + for col in range(1, colSize - 1): + if grid[0][col] == 1: + visited[0][col] = True + queue.append([0, col]) + if grid[rowSize - 1][col] == 1: + visited[rowSize - 1][col] = True + queue.append([rowSize - 1, col]) + self.bfs(grid, queue, visited) # 广度优先遍历 + # 找出矩阵中值为 1 但是没有被标记过的位置,记录答案 + for row in range(rowSize): + for col in range(colSize): + if grid[row][col] == 1 and not visited[row][col]: + ans += 1 + return ans +``` + ## 类似题目 @@ -277,3 +379,4 @@ class Solution { + From ef00e2c35dfe1ecb2223fe4a32b75cfa91ec042c Mon Sep 17 00:00:00 2001 From: ZashJie <1030298236@qq.com> Date: Thu, 16 Mar 2023 12:20:42 +0800 Subject: [PATCH 1559/3019] modify_01 --- ...\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" index ff0b6aba28..c45fc3d302 100644 --- "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" +++ "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" @@ -87,7 +87,7 @@ leetcode上没有纯01背包的问题,都是01背包应用方面的题目, 那么可以有两个方向推出来dp[i][j], -* **不放物品i**:由dp[i - 1][j]推出,即背包容量为j,里面不放物品i的最大价值,此时dp[i][j]就是dp[i - 1][j]。(其实就是当物品i的重量大于背包j的重量时,物品i无法放进背包中,所以被背包内的价值依然和前面相同。) +* **不放物品i**:由dp[i - 1][j]推出,即背包容量为j,里面不放物品i的最大价值,此时dp[i][j]就是dp[i - 1][j]。(其实就是当物品i的重量大于背包j的重量时,物品i无法放进背包中,所以背包内的价值依然和前面相同。) * **放物品i**:由dp[i - 1][j - weight[i]]推出,dp[i - 1][j - weight[i]] 为背包容量为j - weight[i]的时候不放物品i的最大价值,那么dp[i - 1][j - weight[i]] + value[i] (物品i的价值),就是背包放物品i得到的最大价值 所以递归公式: dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]); From 2175be827dbe4215f3ccf55048e62b158a936a0e Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Thu, 16 Mar 2023 22:24:32 +0800 Subject: [PATCH 1560/3019] =?UTF-8?q?update=200242.=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=8D:=20?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=A4=8D=E6=9D=82=E5=BA=A6=E5=88=86=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" | 3 +++ 1 file changed, 3 insertions(+) diff --git "a/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" "b/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" index 9f84a5cd78..1006ea3552 100644 --- "a/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" +++ "b/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" @@ -85,6 +85,9 @@ public: }; ``` +* 时间复杂度: O(n) +* 空间复杂度: O(1) + ## 其他语言版本 From 9a4086cd3628b0199e7e4b51eefe7dfab35688b3 Mon Sep 17 00:00:00 2001 From: ZerenZhang2022 <118794589+ZerenZhang2022@users.noreply.github.com> Date: Thu, 16 Mar 2023 19:55:49 -0400 Subject: [PATCH 1561/3019] =?UTF-8?q?Update=200222.=E5=AE=8C=E5=85=A8?= =?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=A0=91=E7=9A=84=E8=8A=82=E7=82=B9=E4=B8=AA?= =?UTF-8?q?=E6=95=B0.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 增加完全二叉树写法2,更易理解且减少非完全二叉树节点的迭代次数 --- ...212\202\347\202\271\344\270\252\346\225\260.md" | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git "a/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" "b/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" index c346b6ff19..d89a9bcea6 100644 --- "a/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" +++ "b/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" @@ -379,6 +379,20 @@ class Solution: return (2 << leftDepth) - 1 #注意(2<<1) 相当于2^2,所以leftDepth初始为0 return self.countNodes(root.left) + self.countNodes(root.right) + 1 ``` +完全二叉树写法2 +```python +class Solution: # 利用完全二叉树特性 + def countNodes(self, root: TreeNode) -> int: + if not root: return 0 + count = 1 + left = root.left; right = root.right + while left and right: + count+=1 + left = left.left; right = right.right + if not left and not right: # 如果同时到底说明是满二叉树,反之则不是 + return 2**count-1 + return 1+self.countNodes(root.left)+self.countNodes(root.right) +``` ## Go From c3588f445f13ec540e7c44e031924d946922a588 Mon Sep 17 00:00:00 2001 From: liangzhensheng <1250564179@qq.com> Date: Fri, 17 Mar 2023 11:09:35 +0800 Subject: [PATCH 1562/3019] =?UTF-8?q?docs:=20=E5=88=86=E5=8F=91=E9=A5=BC?= =?UTF-8?q?=E5=B9=B2=E6=B7=BB=E5=8A=A0=E8=A7=86=E9=A2=91=E8=AE=B2=E8=A7=A3?= =?UTF-8?q?=E9=93=BE=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...06\345\217\221\351\245\274\345\271\262.md" | 153 +++++++++--------- 1 file changed, 79 insertions(+), 74 deletions(-) diff --git "a/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" "b/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" index 63525b0394..3688b3fd95 100644 --- "a/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" +++ "b/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" @@ -4,31 +4,35 @@

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

- # 455.分发饼干 [力扣题目链接](https://leetcode.cn/problems/assign-cookies/) 假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。 -对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j,都有一个尺寸 s[j] 。如果 s[j] >= g[i],我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。 +对每个孩子 i,都有一个胃口值  g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j,都有一个尺寸 s[j] 。如果 s[j] >= g[i],我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。 + +示例  1: -示例 1: -* 输入: g = [1,2,3], s = [1,1] -* 输出: 1 -解释:你有三个孩子和两块小饼干,3个孩子的胃口值分别是:1,2,3。虽然你有两块小饼干,由于他们的尺寸都是1,你只能让胃口值是1的孩子满足。所以你应该输出1。 +- 输入: g = [1,2,3], s = [1,1] +- 输出: 1 + 解释:你有三个孩子和两块小饼干,3 个孩子的胃口值分别是:1,2,3。虽然你有两块小饼干,由于他们的尺寸都是 1,你只能让胃口值是 1 的孩子满足。所以你应该输出 1。 -示例 2: -* 输入: g = [1,2], s = [1,2,3] -* 输出: 2 -* 解释:你有两个孩子和三块小饼干,2个孩子的胃口值分别是1,2。你拥有的饼干数量和尺寸都足以让所有孩子满足。所以你应该输出2. +示例  2: +- 输入: g = [1,2], s = [1,2,3] +- 输出: 2 +- 解释:你有两个孩子和三块小饼干,2 个孩子的胃口值分别是 1,2。你拥有的饼干数量和尺寸都足以让所有孩子满足。所以你应该输出 2. 提示: -* 1 <= g.length <= 3 * 10^4 -* 0 <= s.length <= 3 * 10^4 -* 1 <= g[i], s[j] <= 2^31 - 1 +- 1 <= g.length <= 3 \* 10^4 +- 0 <= s.length <= 3 \* 10^4 +- 1 <= g[i], s[j] <= 2^31 - 1 + +# 视频讲解 + +**《代码随想录》算法视频公开课:[贪心算法,你想先喂哪个小孩?| LeetCode:455.分发饼干](https://www.bilibili.com/video/BV1MM411b7cq),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 ## 思路 @@ -46,14 +50,12 @@ ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20230203105634.png) - -这个例子可以看出饼干9只有喂给胃口为7的小孩,这样才是整体最优解,并想不出反例,那么就可以撸代码了。 - +这个例子可以看出饼干 9 只有喂给胃口为 7 的小孩,这样才是整体最优解,并想不出反例,那么就可以撸代码了。 C++代码整体如下: ```CPP -// 版本一 +// 版本一 // 时间复杂度:O(nlogn) // 空间复杂度:O(1) class Solution { @@ -63,8 +65,8 @@ public: sort(s.begin(), s.end()); int index = s.size() - 1; // 饼干数组的下标 int result = 0; - for (int i = g.size() - 1; i >= 0; i--) { // 遍历胃口 - if (index >= 0 && s[index] >= g[i]) { // 遍历饼干 + for (int i = g.size() - 1; i >= 0; i--) { // 遍历胃口 + if (index >= 0 && s[index] >= g[i]) { // 遍历饼干 result++; index--; } @@ -74,27 +76,25 @@ public: }; ``` -从代码中可以看出我用了一个index来控制饼干数组的遍历,遍历饼干并没有再起一个for循环,而是采用自减的方式,这也是常用的技巧。 - -有的同学看到要遍历两个数组,就想到用两个for循环,那样逻辑其实就复杂了。 +从代码中可以看出我用了一个 index 来控制饼干数组的遍历,遍历饼干并没有再起一个 for 循环,而是采用自减的方式,这也是常用的技巧。 +有的同学看到要遍历两个数组,就想到用两个 for 循环,那样逻辑其实就复杂了。 -### 注意事项 +### 注意事项 -注意版本一的代码中,可以看出来,是先遍历的胃口,在遍历的饼干,那么可不可以 先遍历 饼干,在遍历胃口呢? +注意版本一的代码中,可以看出来,是先遍历的胃口,在遍历的饼干,那么可不可以 先遍历 饼干,在遍历胃口呢? -其实是不可以的。 +其实是不可以的。 -外面的for 是里的下标i 是固定移动的,而if里面的下标 index 是符合条件才移动的。 +外面的 for 是里的下标 i 是固定移动的,而 if 里面的下标 index 是符合条件才移动的。 -如果 for 控制的是饼干, if 控制胃口,就是出现如下情况 : +如果 for 控制的是饼干, if 控制胃口,就是出现如下情况 : ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20230112102848.png) -if 里的 index 指向 胃口 10, for里的i指向饼干9,因为 饼干9 满足不了 胃口10,所以 i 持续向前移动,而index 走不到` s[index] >= g[i]` 的逻辑,所以index不会移动,那么当i 持续向前移动,最后所有的饼干都匹配不上。 - -所以 一定要for 控制 胃口,里面的if控制饼干。 +if 里的 index 指向 胃口 10, for 里的 i 指向饼干 9,因为 饼干 9 满足不了 胃口 10,所以 i 持续向前移动,而 index 走不到` s[index] >= g[i]` 的逻辑,所以 index 不会移动,那么当 i 持续向前移动,最后所有的饼干都匹配不上。 +所以 一定要 for 控制 胃口,里面的 if 控制饼干。 ### 其他思路 @@ -117,11 +117,11 @@ public: return index; } }; -``` +``` -细心的录友可以发现,这种写法,两个循环的顺序改变了,先遍历的饼干,在遍历的胃口,这是因为遍历顺序变了,我们是从小到大遍历。 +细心的录友可以发现,这种写法,两个循环的顺序改变了,先遍历的饼干,在遍历的胃口,这是因为遍历顺序变了,我们是从小到大遍历。 -理由在上面 “注意事项”中 已经讲过。 +理由在上面 “注意事项”中 已经讲过。 ## 总结 @@ -131,8 +131,8 @@ public: ## 其他语言版本 - ### Java + ```java class Solution { // 思路1:优先考虑饼干,小饼干先喂饱小胃口 @@ -151,6 +151,7 @@ class Solution { } } ``` + ```java class Solution { // 思路2:优先考虑胃口,先喂饱大胃口 @@ -172,6 +173,7 @@ class Solution { ``` ### Python + ```python class Solution: # 思路1:优先考虑小胃口 @@ -184,6 +186,7 @@ class Solution: res += 1 return res ``` + ```python class Solution: # 思路2:优先考虑大胃口 @@ -199,6 +202,7 @@ class Solution: ``` ### Go + ```golang //排序后,局部最优 func findContentChildren(g []int, s []int) int { @@ -218,6 +222,7 @@ func findContentChildren(g []int, s []int) int { ``` ### Rust + ```rust pub fn find_content_children(mut children: Vec, mut cookie: Vec) -> i32 { children.sort(); @@ -236,21 +241,21 @@ pub fn find_content_children(mut children: Vec, mut cookie: Vec) -> i3 ``` ### Javascript + ```js -var findContentChildren = function(g, s) { - g = g.sort((a, b) => a - b) - s = s.sort((a, b) => a - b) - let result = 0 - let index = s.length - 1 - for(let i = g.length - 1; i >= 0; i--) { - if(index >= 0 && s[index] >= g[i]) { - result++ - index-- - } +var findContentChildren = function (g, s) { + g = g.sort((a, b) => a - b); + s = s.sort((a, b) => a - b); + let result = 0; + let index = s.length - 1; + for (let i = g.length - 1; i >= 0; i--) { + if (index >= 0 && s[index] >= g[i]) { + result++; + index--; } - return result + } + return result; }; - ``` ### TypeScript @@ -258,41 +263,41 @@ var findContentChildren = function(g, s) { ```typescript // 大饼干尽量喂胃口大的 function findContentChildren(g: number[], s: number[]): number { - g.sort((a, b) => a - b); - s.sort((a, b) => a - b); - const childLength: number = g.length, - cookieLength: number = s.length; - let curChild: number = childLength - 1, - curCookie: number = cookieLength - 1; - let resCount: number = 0; - while (curChild >= 0 && curCookie >= 0) { - if (g[curChild] <= s[curCookie]) { - curCookie--; - resCount++; - } - curChild--; + g.sort((a, b) => a - b); + s.sort((a, b) => a - b); + const childLength: number = g.length, + cookieLength: number = s.length; + let curChild: number = childLength - 1, + curCookie: number = cookieLength - 1; + let resCount: number = 0; + while (curChild >= 0 && curCookie >= 0) { + if (g[curChild] <= s[curCookie]) { + curCookie--; + resCount++; } - return resCount; -}; + curChild--; + } + return resCount; +} ``` ```typescript // 小饼干先喂饱小胃口的 function findContentChildren(g: number[], s: number[]): number { - g.sort((a, b) => a - b); - s.sort((a, b) => a - b); - const childLength: number = g.length, - cookieLength: number = s.length; - let curChild: number = 0, - curCookie: number = 0; - while (curChild < childLength && curCookie < cookieLength) { - if (g[curChild] <= s[curCookie]) { - curChild++; - } - curCookie++; + g.sort((a, b) => a - b); + s.sort((a, b) => a - b); + const childLength: number = g.length, + cookieLength: number = s.length; + let curChild: number = 0, + curCookie: number = 0; + while (curChild < childLength && curCookie < cookieLength) { + if (g[curChild] <= s[curCookie]) { + curChild++; } - return curChild; -}; + curCookie++; + } + return curChild; +} ``` ### C From 5678f566a8985e145c22f8297abc38744cc98463 Mon Sep 17 00:00:00 2001 From: liangzhensheng <1250564179@qq.com> Date: Fri, 17 Mar 2023 11:11:35 +0800 Subject: [PATCH 1563/3019] =?UTF-8?q?docs:=20=E6=91=86=E5=8A=A8=E5=BA=8F?= =?UTF-8?q?=E5=88=97=E6=B7=BB=E5=8A=A0=E8=A7=86=E9=A2=91=E8=AE=B2=E8=A7=A3?= =?UTF-8?q?=E9=93=BE=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...06\345\212\250\345\272\217\345\210\227.md" | 215 +++++++++--------- 1 file changed, 111 insertions(+), 104 deletions(-) diff --git "a/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" "b/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" index 925d726270..469c19fd8d 100644 --- "a/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" +++ "b/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" @@ -4,7 +4,6 @@

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

- > 本周讲解了[贪心理论基础](https://programmercarl.com/贪心算法理论基础.html),以及第一道贪心的题目:[贪心算法:分发饼干](https://programmercarl.com/0455.分发饼干.html),可能会给大家一种贪心算法比较简单的错觉,好了,接下来几天的题目难度要上来了,哈哈。 # 376. 摆动序列 @@ -13,25 +12,32 @@ 如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为摆动序列。第一个差(如果存在的话)可能是正数或负数。少于两个元素的序列也是摆动序列。 -例如, [1,7,4,9,2,5] 是一个摆动序列,因为差值 (6,-3,5,-7,3) 是正负交替出现的。相反, [1,4,7,2,5] 和 [1,7,4,5,5] 不是摆动序列,第一个序列是因为它的前两个差值都是正数,第二个序列是因为它的最后一个差值为零。 +例如, [1,7,4,9,2,5] 是一个摆动序列,因为差值 (6,-3,5,-7,3)  是正负交替出现的。相反, [1,4,7,2,5]  和  [1,7,4,5,5] 不是摆动序列,第一个序列是因为它的前两个差值都是正数,第二个序列是因为它的最后一个差值为零。 给定一个整数序列,返回作为摆动序列的最长子序列的长度。 通过从原始序列中删除一些(也可以不删除)元素来获得子序列,剩下的元素保持其原始顺序。 示例 1: -* 输入: [1,7,4,9,2,5] -* 输出: 6 -* 解释: 整个序列均为摆动序列。 + +- 输入: [1,7,4,9,2,5] +- 输出: 6 +- 解释: 整个序列均为摆动序列。 示例 2: -* 输入: [1,17,5,10,13,15,10,5,16,8] -* 输出: 7 -* 解释: 这个序列包含几个长度为 7 摆动序列,其中一个可为[1,17,10,13,10,16,8]。 + +- 输入: [1,17,5,10,13,15,10,5,16,8] +- 输出: 7 +- 解释: 这个序列包含几个长度为 7 摆动序列,其中一个可为[1,17,10,13,10,16,8]。 示例 3: -* 输入: [1,2,3,4,5,6,7,8,9] -* 输出: 2 -## 思路1(贪心解法) +- 输入: [1,2,3,4,5,6,7,8,9] +- 输出: 2 + +# 视频讲解 + +**《代码随想录》算法视频公开课:[贪心算法,寻找摆动有细节!| LeetCode:376.摆动序列](https://www.bilibili.com/video/BV17M411b7NS),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 + +## 思路 1(贪心解法) 本题要求通过从原始序列中删除一些(也可以不删除)元素来获得子序列,剩下的元素保持其原始顺序。 @@ -53,63 +59,61 @@ **实际操作上,其实连删除的操作都不用做,因为题目要求的是最长摆动子序列的长度,所以只需要统计数组的峰值数量就可以了(相当于是删除单一坡度上的节点,然后统计长度)** -**这就是贪心所贪的地方,让峰值尽可能的保持峰值,然后删除单一坡度上的节点** +**这就是贪心所贪的地方,让峰值尽可能的保持峰值,然后删除单一坡度上的节点** -在计算是否有峰值的时候,大家知道遍历的下标i ,计算prediff(nums[i] - nums[i-1]) 和 curdiff(nums[i+1] - nums[i]),如果`prediff < 0 && curdiff > 0` 或者 `prediff > 0 && curdiff < 0` 此时就有波动就需要统计。 +在计算是否有峰值的时候,大家知道遍历的下标 i ,计算 prediff(nums[i] - nums[i-1]) 和 curdiff(nums[i+1] - nums[i]),如果`prediff < 0 && curdiff > 0` 或者 `prediff > 0 && curdiff < 0` 此时就有波动就需要统计。 这是我们思考本题的一个大题思路,但本题要考虑三种情况: -1. 情况一:上下坡中有平坡 -2. 情况二:数组首尾两端 +1. 情况一:上下坡中有平坡 +2. 情况二:数组首尾两端 3. 情况三:单调坡中有平坡 ### 情况一:上下坡中有平坡 -例如 [1,2,2,2,1]这样的数组,如图: +例如 [1,2,2,2,1]这样的数组,如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20230106170449.png) +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20230106170449.png) -它的摇摆序列长度是多少呢? **其实是长度是3**,也就是我们在删除的时候 要不删除左面的三个2,要不就删除右边的三个2。 +它的摇摆序列长度是多少呢? **其实是长度是 3**,也就是我们在删除的时候 要不删除左面的三个 2,要不就删除右边的三个 2。 -如图,可以统一规则,删除左边的三个2: +如图,可以统一规则,删除左边的三个 2: ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20230106172613.png) -在图中,当i指向第一个2的时候,`prediff > 0 && curdiff = 0` ,当 i 指向最后一个2的时候 `prediff = 0 && curdiff < 0`。 - -如果我们采用,删左面三个2的规则,那么 当 `prediff = 0 && curdiff < 0` 也要记录一个峰值,因为他是把之前相同的元素都删掉留下的峰值。 - -所以我们记录峰值的条件应该是: `(preDiff <= 0 && curDiff > 0) || (preDiff >= 0 && curDiff < 0)`,为什么这里允许 prediff == 0 ,就是为了 上面我说的这种情况。 +在图中,当 i 指向第一个 2 的时候,`prediff > 0 && curdiff = 0` ,当 i 指向最后一个 2 的时候 `prediff = 0 && curdiff < 0`。 +如果我们采用,删左面三个 2 的规则,那么 当 `prediff = 0 && curdiff < 0` 也要记录一个峰值,因为他是把之前相同的元素都删掉留下的峰值。 -### 情况二:数组首尾两端 +所以我们记录峰值的条件应该是: `(preDiff <= 0 && curDiff > 0) || (preDiff >= 0 && curDiff < 0)`,为什么这里允许 prediff == 0 ,就是为了 上面我说的这种情况。 +### 情况二:数组首尾两端 -所以本题统计峰值的时候,数组最左面和最右面如果统计呢? +所以本题统计峰值的时候,数组最左面和最右面如果统计呢? -题目中说了,如果只有两个不同的元素,那摆动序列也是2。 +题目中说了,如果只有两个不同的元素,那摆动序列也是 2。 -例如序列[2,5],如果靠统计差值来计算峰值个数就需要考虑数组最左面和最右面的特殊情况。 +例如序列[2,5],如果靠统计差值来计算峰值个数就需要考虑数组最左面和最右面的特殊情况。 因为我们在计算 prediff(nums[i] - nums[i-1]) 和 curdiff(nums[i+1] - nums[i])的时候,至少需要三个数字才能计算,而数组只有两个数字。 -这里我们可以写死,就是 如果只有两个元素,且元素不同,那么结果为2。 +这里我们可以写死,就是 如果只有两个元素,且元素不同,那么结果为 2。 -不写死的话,如果和我们的判断规则结合在一起呢? +不写死的话,如果和我们的判断规则结合在一起呢? -可以假设,数组最前面还有一个数字,那这个数字应该是什么呢? +可以假设,数组最前面还有一个数字,那这个数字应该是什么呢? -之前我们在 讨论 情况一:相同数字连续 的时候, prediff = 0 ,curdiff < 0 或者 >0 也记为波谷。 +之前我们在 讨论 情况一:相同数字连续 的时候, prediff = 0 ,curdiff < 0 或者 >0 也记为波谷。 -那么为了规则统一,针对序列[2,5],可以假设为[2,2,5],这样它就有坡度了即preDiff = 0,如图: +那么为了规则统一,针对序列[2,5],可以假设为[2,2,5],这样它就有坡度了即 preDiff = 0,如图: ![376.摆动序列1](https://code-thinking-1253855093.file.myqcloud.com/pics/20201124174357612.png) -针对以上情形,result初始为1(默认最右面有一个峰值),此时curDiff > 0 && preDiff <= 0,那么result++(计算了左面的峰值),最后得到的result就是2(峰值个数为2即摆动序列长度为2) +针对以上情形,result 初始为 1(默认最右面有一个峰值),此时 curDiff > 0 && preDiff <= 0,那么 result++(计算了左面的峰值),最后得到的 result 就是 2(峰值个数为 2 即摆动序列长度为 2) 经过以上分析后,我们可以写出如下代码: -```CPP +```CPP // 版本一 class Solution { public: @@ -129,33 +133,34 @@ public: return result; } }; -``` -* 时间复杂度:O(n) -* 空间复杂度:O(1) +``` -此时大家是不是发现 以上代码提交也不能通过本题? +- 时间复杂度:O(n) +- 空间复杂度:O(1) + +此时大家是不是发现 以上代码提交也不能通过本题? 所以此时我们要讨论情况三! -### 情况三:单调坡度有平坡 +### 情况三:单调坡度有平坡 -在版本一中,我们忽略了一种情况,即 如果在一个单调坡度上有平坡,例如[1,2,2,2,3,4],如图: +在版本一中,我们忽略了一种情况,即 如果在一个单调坡度上有平坡,例如[1,2,2,2,3,4],如图: ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20230108171505.png) -图中,我们可以看出,版本一的代码在三个地方记录峰值,但其实结果因为是2,因为 单调中的平坡 不能算峰值(即摆动)。 +图中,我们可以看出,版本一的代码在三个地方记录峰值,但其实结果因为是 2,因为 单调中的平坡 不能算峰值(即摆动)。 -之所以版本一会出问题,是因为我们实时更新了 prediff。 +之所以版本一会出问题,是因为我们实时更新了 prediff。 -那么我们应该什么时候更新prediff呢? +那么我们应该什么时候更新 prediff 呢? -我们只需要在 这个坡度 摆动变化的时候,更新prediff就行,这样prediff在 单调区间有平坡的时候 就不会发生变化,造成我们的误判。 +我们只需要在 这个坡度 摆动变化的时候,更新 prediff 就行,这样 prediff 在 单调区间有平坡的时候 就不会发生变化,造成我们的误判。 所以本题的最终代码为: ```CPP -// 版本二 +// 版本二 class Solution { public: int wiggleMaxLength(vector& nums) { @@ -168,7 +173,7 @@ public: // 出现峰值 if ((preDiff <= 0 && curDiff > 0) || (preDiff >= 0 && curDiff < 0)) { result++; - preDiff = curDiff; // 注意这里,只在摆动变化的时候更新prediff + preDiff = curDiff; // 注意这里,只在摆动变化的时候更新prediff } } return result; @@ -176,25 +181,25 @@ public: }; ``` -其实本题看起来好像简单,但需要考虑的情况还是很复杂的,而且很难一次性想到位。 +其实本题看起来好像简单,但需要考虑的情况还是很复杂的,而且很难一次性想到位。 -**本题异常情况的本质,就是要考虑平坡**, 平坡分两种,一个是 上下中间有平坡,一个是单调有平坡,如图: +**本题异常情况的本质,就是要考虑平坡**, 平坡分两种,一个是 上下中间有平坡,一个是单调有平坡,如图: ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20230108174452.png) -## 思路2(动态规划) +## 思路 2(动态规划) 考虑用动态规划的思想来解决这个问题。 -很容易可以发现,对于我们当前考虑的这个数,要么是作为山峰(即nums[i] > nums[i-1]),要么是作为山谷(即nums[i] < nums[i - 1])。 +很容易可以发现,对于我们当前考虑的这个数,要么是作为山峰(即 nums[i] > nums[i-1]),要么是作为山谷(即 nums[i] < nums[i - 1])。 -* 设dp状态`dp[i][0]`,表示考虑前i个数,第i个数作为山峰的摆动子序列的最长长度 -* 设dp状态`dp[i][1]`,表示考虑前i个数,第i个数作为山谷的摆动子序列的最长长度 +- 设 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[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]接到前面某个山峰后面,作为山谷。 初始状态: @@ -223,28 +228,25 @@ public: }; ``` -* 时间复杂度:O(n^2) -* 空间复杂度:O(n) +- 时间复杂度: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,可以直接在线段树中查询指定区间的值即可。 +- 每次更新`dp[i][0]`,则在`tree1`的`nums[i]`位置值更新为`dp[i][0]` +- 每次更新`dp[i][1]`,则在`tree2`的`nums[i]`位置值更新为`dp[i][1]` +- 则 dp 转移方程中就没有必要 j 从 0 遍历到 i-1,可以直接在线段树中查询指定区间的值即可。 时间复杂度:O(nlog n) 空间复杂度:O(n) - - - ## 其他语言版本 +### Java -### Java ```Java class Solution { public int wiggleMaxLength(int[] nums) { @@ -270,6 +272,7 @@ class Solution { } } ``` + ```java // DP class Solution { @@ -300,7 +303,7 @@ class Solution { } ``` -### Python +### Python **贪心** @@ -332,7 +335,7 @@ class Solution: # nums[i] 为波谷 if nums[j] > nums[i]: dp[i][1] = max(dp[i][1], dp[j][0] + 1) - # nums[i] 为波峰 + # nums[i] 为波峰 if nums[j] < nums[i]: dp[i][0] = max(dp[i][0], dp[j][1] + 1) return max(dp[-1][0], dp[-1][1]) @@ -357,9 +360,10 @@ class Solution: return max(up, down) ``` -### Go +### Go **贪心** + ```go func wiggleMaxLength(nums []int) int { n := len(nums) @@ -383,6 +387,7 @@ func wiggleMaxLength(nums []int) int { ``` **动态规划** + ```go func wiggleMaxLength(nums []int) int { n := len(nums) @@ -419,8 +424,10 @@ func max(a, b int) int { } ``` -### Javascript +### Javascript + **贪心** + ```Javascript var wiggleMaxLength = function(nums) { if(nums.length <= 1) return nums.length @@ -437,10 +444,12 @@ var wiggleMaxLength = function(nums) { return result }; ``` + **动态规划** + ```Javascript var wiggleMaxLength = function(nums) { - if (nums.length === 1) return 1; + if (nums.length === 1) return 1; // 考虑前i个数,当第i个值作为峰谷时的情况(则第i-1是峰顶) let down = 1; // 考虑前i个数,当第i个值作为峰顶时的情况(则第i-1是峰谷) @@ -458,7 +467,9 @@ var wiggleMaxLength = function(nums) { ``` ### Rust + **贪心** + ```Rust impl Solution { pub fn wiggle_max_length(nums: Vec) -> i32 { @@ -504,11 +515,12 @@ impl Solution { ``` ### C + **贪心** ```c int wiggleMaxLength(int* nums, int numsSize){ - if(numsSize <= 1) + if(numsSize <= 1) return numsSize; int length = 1; @@ -568,54 +580,49 @@ int wiggleMaxLength(int* nums, int numsSize){ } ``` - - ### TypeScript **贪心** ```typescript function wiggleMaxLength(nums: number[]): number { - let length: number = nums.length; - if (length <= 1) return length; - let preDiff: number = 0; - let curDiff: number = 0; - let count: number = 1; - for (let i = 1; i < length; i++) { - curDiff = nums[i] - nums[i - 1]; - if ( - (preDiff <= 0 && curDiff > 0) || - (preDiff >= 0 && curDiff < 0) - ) { - preDiff = curDiff; - count++; - } + let length: number = nums.length; + if (length <= 1) return length; + let preDiff: number = 0; + let curDiff: number = 0; + let count: number = 1; + for (let i = 1; i < length; i++) { + curDiff = nums[i] - nums[i - 1]; + if ((preDiff <= 0 && curDiff > 0) || (preDiff >= 0 && curDiff < 0)) { + preDiff = curDiff; + count++; } - return count; -}; + } + return count; +} ``` **动态规划** ```typescript function wiggleMaxLength(nums: number[]): number { - const length: number = nums.length; - if (length <= 1) return length; - const dp: number[][] = new Array(length).fill(0).map(_ => []); - dp[0][0] = 1; // 第一个数作为波峰 - dp[0][1] = 1; // 第一个数作为波谷 - for (let i = 1; i < length; i++) { - dp[i][0] = 1; - dp[i][1] = 1; - for (let j = 0; j < i; j++) { - if (nums[j] < nums[i]) dp[i][0] = Math.max(dp[i][0], dp[j][1] + 1); - } - for (let j = 0; j < i; j++) { - if (nums[j] > nums[i]) dp[i][1] = Math.max(dp[i][1], dp[j][0] + 1); - } + const length: number = nums.length; + if (length <= 1) return length; + const dp: number[][] = new Array(length).fill(0).map((_) => []); + dp[0][0] = 1; // 第一个数作为波峰 + dp[0][1] = 1; // 第一个数作为波谷 + for (let i = 1; i < length; i++) { + dp[i][0] = 1; + dp[i][1] = 1; + for (let j = 0; j < i; j++) { + if (nums[j] < nums[i]) dp[i][0] = Math.max(dp[i][0], dp[j][1] + 1); } - return Math.max(dp[length - 1][0], dp[length - 1][1]); -}; + for (let j = 0; j < i; j++) { + if (nums[j] > nums[i]) dp[i][1] = Math.max(dp[i][1], dp[j][0] + 1); + } + } + return Math.max(dp[length - 1][0], dp[length - 1][1]); +} ``` ### Scala From ef8500d4cfa9f2669dec76157a01896d018b441e Mon Sep 17 00:00:00 2001 From: liangzhensheng <1250564179@qq.com> Date: Fri, 17 Mar 2023 11:14:43 +0800 Subject: [PATCH 1564/3019] =?UTF-8?q?docs:=20=E6=9C=80=E5=A4=A7=E5=AD=90?= =?UTF-8?q?=E5=BA=8F=E5=88=97=E5=92=8C=E6=B7=BB=E5=8A=A0=E8=A7=86=E9=A2=91?= =?UTF-8?q?=E8=AE=B2=E8=A7=A3=E9=93=BE=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...47\345\255\220\345\272\217\345\222\214.md" | 116 +++++++++--------- 1 file changed, 59 insertions(+), 57 deletions(-) diff --git "a/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" "b/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" index 14017f9899..1de68041a3 100644 --- "a/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" +++ "b/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" @@ -4,7 +4,6 @@

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

- # 53. 最大子序和 [力扣题目链接](https://leetcode.cn/problems/maximum-subarray/) @@ -12,17 +11,21 @@ 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 示例: -* 输入: [-2,1,-3,4,-1,2,1,-5,4] -* 输出: 6 -* 解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。 +- 输入: [-2,1,-3,4,-1,2,1,-5,4] +- 输出: 6 +- 解释:  连续子数组  [4,-1,2,1] 的和最大,为  6。 + +# 视频讲解 + +**《代码随想录》算法视频公开课:[贪心算法的巧妙需要慢慢体会!LeetCode:53. 最大子序和](https://www.bilibili.com/video/BV1aY4y1Z7ya),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 ## 暴力解法 -暴力解法的思路,第一层for 就是设置起始位置,第二层for循环遍历数组寻找最大值 +暴力解法的思路,第一层 for 就是设置起始位置,第二层 for 循环遍历数组寻找最大值 -* 时间复杂度:O(n^2) -* 空间复杂度:O(1) +- 时间复杂度:O(n^2) +- 空间复杂度:O(1) ```CPP class Solution { @@ -42,13 +45,13 @@ public: }; ``` -以上暴力的解法C++勉强可以过,其他语言就不确定了。 +以上暴力的解法 C++勉强可以过,其他语言就不确定了。 ## 贪心解法 **贪心贪的是哪里呢?** -如果 -2 1 在一起,计算起点的时候,一定是从1开始计算,因为负数只会拉低总和,这就是贪心贪的地方! +如果 -2 1 在一起,计算起点的时候,一定是从 1 开始计算,因为负数只会拉低总和,这就是贪心贪的地方! 局部最优:当前“连续和”为负数的时候立刻放弃,从下一个元素重新计算“连续和”,因为负数加上下一个元素 “连续和”只会越来越小。 @@ -56,29 +59,27 @@ public: **局部最优的情况下,并记录最大的“连续和”,可以推出全局最优**。 - -从代码角度上来讲:遍历nums,从头开始用count累积,如果count一旦加上nums[i]变为负数,那么就应该从nums[i+1]开始从0累积count了,因为已经变为负数的count,只会拖累总和。 +从代码角度上来讲:遍历 nums,从头开始用 count 累积,如果 count 一旦加上 nums[i]变为负数,那么就应该从 nums[i+1]开始从 0 累积 count 了,因为已经变为负数的 count,只会拖累总和。 **这相当于是暴力解法中的不断调整最大子序和区间的起始位置**。 - **那有同学问了,区间终止位置不用调整么? 如何才能得到最大“连续和”呢?** -区间的终止位置,其实就是如果count取到最大值了,及时记录下来了。例如如下代码: +区间的终止位置,其实就是如果 count 取到最大值了,及时记录下来了。例如如下代码: ``` if (count > result) result = count; ``` -**这样相当于是用result记录最大子序和区间和(变相的算是调整了终止位置)**。 +**这样相当于是用 result 记录最大子序和区间和(变相的算是调整了终止位置)**。 如动画所示: ![53.最大子序和](https://code-thinking.cdn.bcebos.com/gifs/53.%E6%9C%80%E5%A4%A7%E5%AD%90%E5%BA%8F%E5%92%8C.gif) -红色的起始位置就是贪心每次取count为正数的时候,开始一个区间的统计。 +红色的起始位置就是贪心每次取 count 为正数的时候,开始一个区间的统计。 -那么不难写出如下C++代码(关键地方已经注释) +那么不难写出如下 C++代码(关键地方已经注释) ```CPP class Solution { @@ -98,38 +99,34 @@ public: }; ``` -* 时间复杂度:O(n) -* 空间复杂度:O(1) +- 时间复杂度:O(n) +- 空间复杂度:O(1) 当然题目没有说如果数组为空,应该返回什么,所以数组为空的话返回啥都可以了。 +## 常见误区 -## 常见误区 - -误区一: - -不少同学认为 如果输入用例都是-1,或者 都是负数,这个贪心算法跑出来的结果是0, 这是**又一次证明脑洞模拟不靠谱的经典案例**,建议大家把代码运行一下试一试,就知道了,也会理解 为什么 result 要初始化为最小负数了。 +误区一: +不少同学认为 如果输入用例都是-1,或者 都是负数,这个贪心算法跑出来的结果是 0, 这是**又一次证明脑洞模拟不靠谱的经典案例**,建议大家把代码运行一下试一试,就知道了,也会理解 为什么 result 要初始化为最小负数了。 误区二: -大家在使用贪心算法求解本题,经常陷入的误区,就是分不清,是遇到 负数就选择起始位置,还是连续和为负选择起始位置。 +大家在使用贪心算法求解本题,经常陷入的误区,就是分不清,是遇到 负数就选择起始位置,还是连续和为负选择起始位置。 -在动画演示用,大家可以发现, 4,遇到 -1 的时候,我们依然累加了,为什么呢? +在动画演示用,大家可以发现, 4,遇到 -1 的时候,我们依然累加了,为什么呢? -因为和为3,只要连续和还是正数就会 对后面的元素 起到增大总和的作用。 所以只要连续和为正数我们就保留。 - -这里也会有录友疑惑,那 4 + -1 之后 不就变小了吗? 会不会错过 4 成为最大连续和的可能性? - -其实并不会,因为还有一个变量result 一直在更新 最大的连续和,只要有更大的连续和出现,result就更新了,那么result已经把4更新了,后面 连续和变成3,也不会对最后结果有影响。 +因为和为 3,只要连续和还是正数就会 对后面的元素 起到增大总和的作用。 所以只要连续和为正数我们就保留。 +这里也会有录友疑惑,那 4 + -1 之后 不就变小了吗? 会不会错过 4 成为最大连续和的可能性? +其实并不会,因为还有一个变量 result 一直在更新 最大的连续和,只要有更大的连续和出现,result 就更新了,那么 result 已经把 4 更新了,后面 连续和变成 3,也不会对最后结果有影响。 ## 动态规划 -当然本题还可以用动态规划来做,当前[「代码随想录」](https://img-blog.csdnimg.cn/20201124161234338.png)主要讲解贪心系列,后续到动态规划系列的时候会详细讲解本题的dp方法。 +当然本题还可以用动态规划来做,当前[「代码随想录」](https://img-blog.csdnimg.cn/20201124161234338.png)主要讲解贪心系列,后续到动态规划系列的时候会详细讲解本题的 dp 方法。 -那么先给出我的dp代码如下,有时间的录友可以提前做一做: +那么先给出我的 dp 代码如下,有时间的录友可以提前做一做: ```CPP class Solution { @@ -148,8 +145,8 @@ public: }; ``` -* 时间复杂度:O(n) -* 空间复杂度:O(n) +- 时间复杂度:O(n) +- 空间复杂度:O(n) ## 总结 @@ -159,8 +156,8 @@ public: ## 其他语言版本 - ### Java + ```java class Solution { public int maxSubArray(int[] nums) { @@ -201,6 +198,7 @@ class Solution { ``` ### Python + ```python class Solution: def maxSubArray(self, nums: List[int]) -> int: @@ -233,6 +231,7 @@ func maxSubArray(nums []int) int { ``` ### Rust + ```rust pub fn max_sub_array(nums: Vec) -> i32 { let mut max_sum = i32::MIN; @@ -247,6 +246,7 @@ pub fn max_sub_array(nums: Vec) -> i32 { ``` ### Javascript: + ```Javascript var maxSubArray = function(nums) { let result = -Infinity @@ -264,14 +264,15 @@ var maxSubArray = function(nums) { }; ``` - ### C: + 贪心: + ```c int maxSubArray(int* nums, int numsSize){ int maxVal = INT_MIN; int subArrSum = 0; - + int i; for(i = 0; i < numsSize; ++i) { subArrSum += nums[i]; @@ -286,6 +287,7 @@ int maxSubArray(int* nums, int numsSize){ ``` 动态规划: + ```c /** * 解题思路:动态规划: @@ -324,15 +326,15 @@ int maxSubArray(int* nums, int numsSize){ ```typescript function maxSubArray(nums: number[]): number { - let curSum: number = 0; - let resMax: number = -Infinity; - for (let i = 0, length = nums.length; i < length; i++) { - curSum += nums[i]; - resMax = Math.max(curSum, resMax); - if (curSum < 0) curSum = 0; - } - return resMax; -}; + let curSum: number = 0; + let resMax: number = -Infinity; + for (let i = 0, length = nums.length; i < length; i++) { + curSum += nums[i]; + resMax = Math.max(curSum, resMax); + if (curSum < 0) curSum = 0; + } + return resMax; +} ``` **动态规划** @@ -340,17 +342,17 @@ function maxSubArray(nums: number[]): number { ```typescript // 动态规划 function maxSubArray(nums: number[]): number { - const length = nums.length; - if (length === 0) return 0; - const dp: number[] = []; - dp[0] = nums[0]; - let resMax: number = nums[0]; - for (let i = 1; i < length; i++) { - dp[i] = Math.max(dp[i - 1] + nums[i], nums[i]); - resMax = Math.max(resMax, dp[i]); - } - return resMax; -}; + const length = nums.length; + if (length === 0) return 0; + const dp: number[] = []; + dp[0] = nums[0]; + let resMax: number = nums[0]; + for (let i = 1; i < length; i++) { + dp[i] = Math.max(dp[i - 1] + nums[i], nums[i]); + resMax = Math.max(resMax, dp[i]); + } + return resMax; +} ``` ### Scala From ef5a6f8567a5924308fb4fe081665f8f5577c5fb Mon Sep 17 00:00:00 2001 From: liangzhensheng <1250564179@qq.com> Date: Fri, 17 Mar 2023 11:17:32 +0800 Subject: [PATCH 1565/3019] =?UTF-8?q?docs:=20=E8=82=A1=E7=A5=A8=E7=9A=84?= =?UTF-8?q?=E6=9C=80=E4=BD=B3=E6=97=B6=E6=9C=BA=E4=BA=8C=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E8=A7=86=E9=A2=91=E9=93=BE=E6=8E=A5=E8=B7=B3=E8=BD=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\344\275\263\346\227\266\346\234\272II.md" | 131 ++++++++++-------- 1 file changed, 76 insertions(+), 55 deletions(-) diff --git "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" index 29242be3db..533a14a4d3 100644 --- "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" +++ "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" @@ -4,43 +4,49 @@

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

- -# 122.买卖股票的最佳时机II +# 122.买卖股票的最佳时机 II [力扣题目链接](https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-ii/) -给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。 +给定一个数组,它的第  i 个元素是一支给定股票第 i 天的价格。 设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。 注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。 - 示例 1: -* 输入: [7,1,5,3,6,4] -* 输出: 7 -* 解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4。随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6-3 = 3 。 + +- 输入: [7,1,5,3,6,4] +- 输出: 7 +- 解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4。随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6-3 = 3 。 示例 2: -* 输入: [1,2,3,4,5] -* 输出: 4 -* 解释: 在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。注意你不能在第 1 天和第 2 天接连购买股票,之后再将它们卖出。因为这样属于同时参与了多笔交易,你必须在再次购买前出售掉之前的股票。 -示例 3: -* 输入: [7,6,4,3,1] -* 输出: 0 -* 解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。 +- 输入: [1,2,3,4,5] +- 输出: 4 +- 解释: 在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。注意你不能在第 1 天和第 2 天接连购买股票,之后再将它们卖出。因为这样属于同时参与了多笔交易,你必须在再次购买前出售掉之前的股票。 + +示例  3: + +- 输入: [7,6,4,3,1] +- 输出: 0 +- 解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。 提示: -* 1 <= prices.length <= 3 * 10 ^ 4 -* 0 <= prices[i] <= 10 ^ 4 + +- 1 <= prices.length <= 3 \* 10 ^ 4 +- 0 <= prices[i] <= 10 ^ 4 + +# 视频讲解 + +**《代码随想录》算法视频公开课:[贪心算法也能解决股票问题!LeetCode:122.买卖股票最佳时机 II](https://www.bilibili.com/video/BV1ev4y1C7na),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 ## 思路 本题首先要清楚两点: -* 只有一只股票! -* 当前只有买股票或者卖股票的操作 +- 只有一只股票! +- 当前只有买股票或者卖股票的操作 想获得利润至少要两天为一个交易单元。 @@ -52,17 +58,16 @@ 如何分解呢? -假如第0天买入,第3天卖出,那么利润为:prices[3] - prices[0]。 +假如第 0 天买入,第 3 天卖出,那么利润为:prices[3] - prices[0]。 相当于(prices[3] - prices[2]) + (prices[2] - prices[1]) + (prices[1] - prices[0])。 -**此时就是把利润分解为每天为单位的维度,而不是从0天到第3天整体去考虑!** +**此时就是把利润分解为每天为单位的维度,而不是从 0 天到第 3 天整体去考虑!** -那么根据prices可以得到每天的利润序列:(prices[i] - prices[i - 1]).....(prices[1] - prices[0])。 +那么根据 prices 可以得到每天的利润序列:(prices[i] - prices[i - 1]).....(prices[1] - prices[0])。 如图: - ![122.买卖股票的最佳时机II](https://code-thinking-1253855093.file.myqcloud.com/pics/2020112917480858-20230310134659477.png) 一些同学陷入:第一天怎么就没有利润呢,第一天到底算不算的困惑中。 @@ -77,7 +82,7 @@ 局部最优可以推出全局最优,找不出反例,试一试贪心! -对应C++代码如下: +对应 C++代码如下: ```CPP class Solution { @@ -92,12 +97,12 @@ public: }; ``` -* 时间复杂度:O(n) -* 空间复杂度:O(1) +- 时间复杂度:O(n) +- 空间复杂度:O(1) ### 动态规划 -动态规划将在下一个系列详细讲解,本题解先给出我的C++代码(带详细注释),感兴趣的同学可以自己先学习一下。 +动态规划将在下一个系列详细讲解,本题解先给出我的 C++代码(带详细注释),感兴趣的同学可以自己先学习一下。 ```CPP class Solution { @@ -119,8 +124,8 @@ public: }; ``` -* 时间复杂度:$O(n)$ -* 空间复杂度:$O(n)$ +- 时间复杂度:$O(n)$ +- 空间复杂度:$O(n)$ ## 总结 @@ -134,9 +139,10 @@ public: ## 其他语言版本 -### Java: +### Java: 贪心: + ```java // 贪心思路 class Solution { @@ -151,6 +157,7 @@ class Solution { ``` 动态规划: + ```java class Solution { // 动态规划 public int maxProfit(int[] prices) { @@ -172,8 +179,10 @@ class Solution { // 动态规划 } ``` -### Python: +### Python: + 贪心: + ```python class Solution: def maxProfit(self, prices: List[int]) -> int: @@ -184,6 +193,7 @@ class Solution: ``` 动态规划: + ```python class Solution: def maxProfit(self, prices: List[int]) -> int: @@ -200,6 +210,7 @@ class Solution: ### Go: 贪心算法 + ```go func maxProfit(prices []int) int { var sum int @@ -212,7 +223,9 @@ func maxProfit(prices []int) int { return sum } ``` + 动态规划 + ```go func maxProfit(prices []int) int { dp := make([][]int, len(prices)) @@ -226,7 +239,7 @@ func maxProfit(prices []int) int { dp[i][1] = max(dp[i-1][0] - prices[i], dp[i-1][1]) } return dp[len(prices)-1][0] - + } func max(a, b int) int { if a > b { @@ -239,6 +252,7 @@ func max(a, b int) int { ### Javascript: 贪心 + ```Javascript var maxProfit = function(prices) { let result = 0 @@ -249,27 +263,28 @@ var maxProfit = function(prices) { }; ``` -动态规划 +动态规划 + ```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]); - } + 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][1]; + return dp[prices.length - 1][1]; }; ``` @@ -277,17 +292,18 @@ const maxProfit = (prices) => { ```typescript function maxProfit(prices: number[]): number { - let resProfit: number = 0; - for (let i = 1, length = prices.length; i < length; i++) { - resProfit += Math.max(prices[i] - prices[i - 1], 0); - } - return resProfit; -}; + let resProfit: number = 0; + for (let i = 1, length = prices.length; i < length; i++) { + resProfit += Math.max(prices[i] - prices[i - 1], 0); + } + return resProfit; +} ``` ### Rust 贪心: + ```Rust impl Solution { fn max(a: i32, b: i32) -> i32 { @@ -304,6 +320,7 @@ impl Solution { ``` 动态规划: + ```Rust impl Solution { fn max(a: i32, b: i32) -> i32 { @@ -323,7 +340,9 @@ impl Solution { ``` ### C: + 贪心: + ```c int maxProfit(int* prices, int pricesSize){ int result = 0; @@ -339,6 +358,7 @@ int maxProfit(int* prices, int pricesSize){ ``` 动态规划: + ```c #define max(a, b) (((a) > (b)) ? (a) : (b)) @@ -363,6 +383,7 @@ int maxProfit(int* prices, int pricesSize){ ### Scala 贪心: + ```scala object Solution { def maxProfit(prices: Array[Int]): Int = { From 29646b86b90026072dfa903877e16123164d60fa Mon Sep 17 00:00:00 2001 From: liangzhensheng <1250564179@qq.com> Date: Fri, 17 Mar 2023 11:19:09 +0800 Subject: [PATCH 1566/3019] =?UTF-8?q?docs:=E8=B7=B3=E8=B7=83=E6=B8=B8?= =?UTF-8?q?=E6=88=8F=E6=B7=BB=E5=8A=A0=E8=A7=86=E9=A2=91=E9=93=BE=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...63\350\267\203\346\270\270\346\210\217.md" | 61 ++++++++++--------- 1 file changed, 32 insertions(+), 29 deletions(-) diff --git "a/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" "b/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" index a898263de9..6c75b04cf2 100644 --- "a/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" +++ "b/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" @@ -4,7 +4,6 @@

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

- # 55. 跳跃游戏 [力扣题目链接](https://leetcode.cn/problems/jump-game/) @@ -15,20 +14,25 @@ 判断你是否能够到达最后一个位置。 -示例 1: -* 输入: [2,3,1,1,4] -* 输出: true -* 解释: 我们可以先跳 1 步,从位置 0 到达 位置 1, 然后再从位置 1 跳 3 步到达最后一个位置。 +示例  1: + +- 输入: [2,3,1,1,4] +- 输出: true +- 解释: 我们可以先跳 1 步,从位置 0 到达 位置 1, 然后再从位置 1 跳 3 步到达最后一个位置。 + +示例  2: -示例 2: -* 输入: [3,2,1,0,4] -* 输出: false -* 解释: 无论怎样,你总会到达索引为 3 的位置。但该位置的最大跳跃长度是 0 , 所以你永远不可能到达最后一个位置。 +- 输入: [3,2,1,0,4] +- 输出: false +- 解释: 无论怎样,你总会到达索引为 3 的位置。但该位置的最大跳跃长度是 0 , 所以你永远不可能到达最后一个位置。 +# 视频讲解 + +**《代码随想录》算法视频公开课:[贪心算法,怎么跳跃不重要,关键在覆盖范围 | LeetCode:55.跳跃游戏](https://www.bilibili.com/video/BV1VG4y1X7kB),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 ## 思路 -刚看到本题一开始可能想:当前位置元素如果是3,我究竟是跳一步呢,还是两步呢,还是三步呢,究竟跳几步才是最优呢? +刚看到本题一开始可能想:当前位置元素如果是 3,我究竟是跳一步呢,还是两步呢,还是三步呢,究竟跳几步才是最优呢? 其实跳几步无所谓,关键在于可跳的覆盖范围! @@ -46,14 +50,13 @@ 如图: - ![55.跳跃游戏](https://code-thinking-1253855093.file.myqcloud.com/pics/20201124154758229-20230310135019977.png) -i每次移动只能在cover的范围内移动,每移动一个元素,cover得到该元素数值(新的覆盖范围)的补充,让i继续移动下去。 +i 每次移动只能在 cover 的范围内移动,每移动一个元素,cover 得到该元素数值(新的覆盖范围)的补充,让 i 继续移动下去。 -而cover每次只取 max(该元素数值补充后的范围, cover本身范围)。 +而 cover 每次只取 max(该元素数值补充后的范围, cover 本身范围)。 -如果cover大于等于了终点下标,直接return true就可以了。 +如果 cover 大于等于了终点下标,直接 return true 就可以了。 C++代码如下: @@ -71,6 +74,7 @@ public: } }; ``` + ## 总结 这道题目关键点在于:不用拘泥于每次究竟跳几步,而是看覆盖范围,覆盖范围内一定是可以跳过来的,不用管是怎么跳的。 @@ -83,8 +87,8 @@ public: ## 其他语言版本 +### Java -### Java ```Java class Solution { public boolean canJump(int[] nums) { @@ -106,6 +110,7 @@ class Solution { ``` ### Python + ```python class Solution: def canJump(self, nums: List[int]) -> bool: @@ -156,9 +161,7 @@ func max(a, b int ) int { } ``` - - -### Javascript +### Javascript ```Javascript var canJump = function(nums) { @@ -196,6 +199,7 @@ impl Solution { ``` ### C + ```c #define max(a, b) (((a) > (b)) ? (a) : (b)) @@ -217,23 +221,23 @@ bool canJump(int* nums, int numsSize){ } ``` - ### TypeScript ```typescript function canJump(nums: number[]): boolean { - let farthestIndex: number = 0; - let cur: number = 0; - while (cur <= farthestIndex) { - farthestIndex = Math.max(farthestIndex, cur + nums[cur]); - if (farthestIndex >= nums.length - 1) return true; - cur++; - } - return false; -}; + let farthestIndex: number = 0; + let cur: number = 0; + while (cur <= farthestIndex) { + farthestIndex = Math.max(farthestIndex, cur + nums[cur]); + if (farthestIndex >= nums.length - 1) return true; + cur++; + } + return false; +} ``` ### Scala + ```scala object Solution { def canJump(nums: Array[Int]): Boolean = { @@ -250,7 +254,6 @@ object Solution { } ``` -

From 6f8d5eb7a04e178b99d23b4b4c443bbdfd84840c Mon Sep 17 00:00:00 2001 From: liangzhensheng <1250564179@qq.com> Date: Fri, 17 Mar 2023 11:21:12 +0800 Subject: [PATCH 1567/3019] =?UTF-8?q?docs:=E8=B7=B3=E8=B7=83=E6=B8=B8?= =?UTF-8?q?=E6=88=8F=E4=BA=8C=E6=B7=BB=E5=8A=A0=E8=A7=86=E9=A2=91=E9=93=BE?= =?UTF-8?q?=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\350\267\203\346\270\270\346\210\217II.md" | 70 +++++++++---------- 1 file changed, 35 insertions(+), 35 deletions(-) diff --git "a/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" "b/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" index 22151fdc9a..eb622cd3d4 100644 --- "a/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" +++ "b/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" @@ -4,10 +4,9 @@

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+> 相对于[贪心算法:跳跃游戏](https://mp.weixin.qq.com/s/606_N9j8ACKCODoCbV1lSA)难了不少,做好心里准备! -> 相对于[贪心算法:跳跃游戏](https://mp.weixin.qq.com/s/606_N9j8ACKCODoCbV1lSA)难了不少,做好心里准备! - -# 45.跳跃游戏II +# 45.跳跃游戏 II [力扣题目链接](https://leetcode.cn/problems/jump-game-ii/) @@ -18,13 +17,17 @@ 你的目标是使用最少的跳跃次数到达数组的最后一个位置。 示例: -* 输入: [2,3,1,1,4] -* 输出: 2 -* 解释: 跳到最后一个位置的最小跳跃数是 2。从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。 + +- 输入: [2,3,1,1,4] +- 输出: 2 +- 解释: 跳到最后一个位置的最小跳跃数是 2。从下标为 0 跳到下标为 1 的位置,跳  1  步,然后跳  3  步到达数组的最后一个位置。 说明: 假设你总是可以到达数组的最后一个位置。 +# 视频讲解 + +**《代码随想录》算法视频公开课:[贪心算法,最少跳几步还得看覆盖范围 | LeetCode: 45.跳跃游戏 II](https://www.bilibili.com/video/BV1Y24y1r7XZ),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 ## 思路 @@ -46,7 +49,6 @@ 如图: - ![45.跳跃游戏II](https://code-thinking-1253855093.file.myqcloud.com/pics/20201201232309103.png) **图中覆盖范围的意义在于,只要红色的区域,最多两步一定可以到!(不用管具体怎么跳,反正一定可以跳到)** @@ -57,8 +59,8 @@ 这里还是有个特殊情况需要考虑,当移动下标达到了当前覆盖的最远距离下标时 -* 如果当前覆盖最远距离下标不是是集合终点,步数就加一,还需要继续走。 -* 如果当前覆盖最远距离下标就是是集合终点,步数不用加一,因为不能再往后走了。 +- 如果当前覆盖最远距离下标不是是集合终点,步数就加一,还需要继续走。 +- 如果当前覆盖最远距离下标就是是集合终点,步数不用加一,因为不能再往后走了。 C++代码如下:(详细注释) @@ -92,14 +94,14 @@ public: **针对于方法一的特殊情况,可以统一处理**,即:移动下标只要遇到当前覆盖最远距离的下标,直接步数加一,不考虑是不是终点的情况。 -想要达到这样的效果,只要让移动下标,最大只能移动到nums.size - 2的地方就可以了。 +想要达到这样的效果,只要让移动下标,最大只能移动到 nums.size - 2 的地方就可以了。 -因为当移动下标指向nums.size - 2时: +因为当移动下标指向 nums.size - 2 时: -* 如果移动下标等于当前覆盖最大距离下标, 需要再走一步(即ans++),因为最后一步一定是可以到的终点。(题目假设总是可以到达数组的最后一个位置),如图: -![45.跳跃游戏II2](https://code-thinking-1253855093.file.myqcloud.com/pics/20201201232445286.png) +- 如果移动下标等于当前覆盖最大距离下标, 需要再走一步(即 ans++),因为最后一步一定是可以到的终点。(题目假设总是可以到达数组的最后一个位置),如图: + ![45.跳跃游戏II2](https://code-thinking-1253855093.file.myqcloud.com/pics/20201201232445286.png) -* 如果移动下标不等于当前覆盖最大距离下标,说明当前覆盖最远距离就可以直接达到终点了,不需要再走一步。如图: +- 如果移动下标不等于当前覆盖最大距离下标,说明当前覆盖最远距离就可以直接达到终点了,不需要再走一步。如图: ![45.跳跃游戏II1](https://code-thinking-1253855093.file.myqcloud.com/pics/20201201232338693.png) @@ -127,7 +129,7 @@ public: 可以看出版本二的代码相对于版本一简化了不少! -**其精髓在于控制移动下标i只移动到nums.size() - 2的位置**,所以移动下标只要遇到当前覆盖最远距离的下标,直接步数加一,不用考虑别的了。 +**其精髓在于控制移动下标 i 只移动到 nums.size() - 2 的位置**,所以移动下标只要遇到当前覆盖最远距离的下标,直接步数加一,不用考虑别的了。 ## 总结 @@ -137,11 +139,10 @@ public: 理解本题的关键在于:**以最小的步数增加最大的覆盖范围,直到覆盖范围覆盖了终点**,这个范围内最小步数一定可以跳到,不用管具体是怎么跳的,不纠结于一步究竟跳一个单位还是两个单位。 - ## 其他语言版本 +### Java -### Java ```Java // 版本一 class Solution { @@ -207,7 +208,7 @@ class Solution: nextDistance = 0 for i in range(len(nums)): nextDistance = max(i + nums[i], nextDistance) - if i == curDistance: + if i == curDistance: if curDistance != len(nums) - 1: ans += 1 curDistance = nextDistance @@ -230,9 +231,10 @@ class Solution: step += 1 return step ``` + ```python # 动态规划做法 -class Solution: +class Solution: def jump(self, nums: List[int]) -> int: result = [10**4+1]*len(nums) result[0]=0 @@ -244,7 +246,6 @@ class Solution: ``` - ### Go ```go @@ -331,21 +332,21 @@ var jump = function(nums) { ```typescript function jump(nums: number[]): number { - const length: number = nums.length; - let curFarthestIndex: number = 0, - nextFarthestIndex: number = 0; - let curIndex: number = 0; - let stepNum: number = 0; - while (curIndex < length - 1) { - nextFarthestIndex = Math.max(nextFarthestIndex, curIndex + nums[curIndex]); - if (curIndex === curFarthestIndex) { - curFarthestIndex = nextFarthestIndex; - stepNum++; - } - curIndex++; + const length: number = nums.length; + let curFarthestIndex: number = 0, + nextFarthestIndex: number = 0; + let curIndex: number = 0; + let stepNum: number = 0; + while (curIndex < length - 1) { + nextFarthestIndex = Math.max(nextFarthestIndex, curIndex + nums[curIndex]); + if (curIndex === curFarthestIndex) { + curFarthestIndex = nextFarthestIndex; + stepNum++; } - return stepNum; -}; + curIndex++; + } + return stepNum; +} ``` ### Scala @@ -425,7 +426,6 @@ impl Solution { } ``` -

From a8d3d3cf75ff188b192993486059c9048f31d0e4 Mon Sep 17 00:00:00 2001 From: liangzhensheng <1250564179@qq.com> Date: Fri, 17 Mar 2023 11:22:58 +0800 Subject: [PATCH 1568/3019] =?UTF-8?q?docs:k=E6=AC=A1=E5=8F=96=E5=8F=8D?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E8=A7=86=E9=A2=91=E9=93=BE=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...14\226\347\232\204\346\225\260\347\273\204\345\222\214.md" | 4 ++++ 1 file changed, 4 insertions(+) diff --git "a/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" "b/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" index cdf42511b1..fb2a1cb701 100644 --- "a/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" +++ "b/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" @@ -34,6 +34,10 @@ * 1 <= K <= 10000 * -100 <= A[i] <= 100 +# 视频讲解 + +**《代码随想录》算法视频公开课:[贪心算法,这不就是常识?还能叫贪心?LeetCode:1005.K次取反后最大化的数组和](https://www.bilibili.com/video/BV138411G7LY),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 + ## 思路 本题思路其实比较好想了,如何可以让数组和最大呢? From 8919bcc03a39ad6366d04a3315713300c00dff53 Mon Sep 17 00:00:00 2001 From: liangzhensheng <1250564179@qq.com> Date: Fri, 17 Mar 2023 11:24:02 +0800 Subject: [PATCH 1569/3019] =?UTF-8?q?docs:=E5=8A=A0=E6=B2=B9=E7=AB=99?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E8=A7=86=E9=A2=91=E9=93=BE=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "problems/0134.\345\212\240\346\262\271\347\253\231.md" | 4 ++++ 1 file changed, 4 insertions(+) diff --git "a/problems/0134.\345\212\240\346\262\271\347\253\231.md" "b/problems/0134.\345\212\240\346\262\271\347\253\231.md" index 77e199fd35..f432bf0b1f 100644 --- "a/problems/0134.\345\212\240\346\262\271\347\253\231.md" +++ "b/problems/0134.\345\212\240\346\262\271\347\253\231.md" @@ -45,6 +45,10 @@ * 解释: 你不能从 0 号或 1 号加油站出发,因为没有足够的汽油可以让你行驶到下一个加油站。我们从 2 号加油站出发,可以获得 4 升汽油。 此时油箱有 = 0 + 4 = 4 升汽油。开往 0 号加油站,此时油箱有 4 - 3 + 2 = 3 升汽油。开往 1 号加油站,此时油箱有 3 - 3 + 3 = 3 升汽油。你无法返回 2 号加油站,因为返程需要消耗 4 升汽油,但是你的油箱只有 3 升汽油。因此,无论怎样,你都不可能绕环路行驶一周。 +# 视频讲解 + +**《代码随想录》算法视频公开课:[贪心算法,得这么加油才能跑完全程!LeetCode :134.加油站](https://www.bilibili.com/video/BV1jA411r7WX),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 + ## 暴力方法 From 74b4c506aa7a922f173ebe30daef96e17a97153c Mon Sep 17 00:00:00 2001 From: liangzhensheng <1250564179@qq.com> Date: Fri, 17 Mar 2023 11:26:03 +0800 Subject: [PATCH 1570/3019] =?UTF-8?q?docs:=E5=88=86=E5=8F=91=E7=B3=96?= =?UTF-8?q?=E6=9E=9C=E6=B7=BB=E5=8A=A0=E8=A7=86=E9=A2=91=E9=93=BE=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0135.\345\210\206\345\217\221\347\263\226\346\236\234.md" | 4 ++++ 1 file changed, 4 insertions(+) diff --git "a/problems/0135.\345\210\206\345\217\221\347\263\226\346\236\234.md" "b/problems/0135.\345\210\206\345\217\221\347\263\226\346\236\234.md" index 181f24e98e..ef79868a1a 100644 --- "a/problems/0135.\345\210\206\345\217\221\347\263\226\346\236\234.md" +++ "b/problems/0135.\345\210\206\345\217\221\347\263\226\346\236\234.md" @@ -28,6 +28,10 @@ * 输出: 4 * 解释: 你可以分别给这三个孩子分发 1、2、1 颗糖果。第三个孩子只得到 1 颗糖果,这已满足上述两个条件。 +# 视频讲解 + +**《代码随想录》算法视频公开课:[贪心算法,两者兼顾很容易顾此失彼!LeetCode:135.分发糖果](https://www.bilibili.com/video/BV1ev4y1r7wN),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 + ## 思路 From 6f1111447cca7dafb2261836ff1735de819a4f9a Mon Sep 17 00:00:00 2001 From: liangzhensheng <1250564179@qq.com> Date: Fri, 17 Mar 2023 11:27:20 +0800 Subject: [PATCH 1571/3019] =?UTF-8?q?docs:=E6=9F=A0=E6=AA=AC=E6=B0=B4?= =?UTF-8?q?=E6=89=BE=E9=9B=B6=E6=B7=BB=E5=8A=A0=E8=A7=86=E9=A2=91=E9=93=BE?= =?UTF-8?q?=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...37\240\346\252\254\346\260\264\346\211\276\351\233\266.md" | 4 ++++ 1 file changed, 4 insertions(+) diff --git "a/problems/0860.\346\237\240\346\252\254\346\260\264\346\211\276\351\233\266.md" "b/problems/0860.\346\237\240\346\252\254\346\260\264\346\211\276\351\233\266.md" index fc336eba82..cd52adb099 100644 --- "a/problems/0860.\346\237\240\346\252\254\346\260\264\346\211\276\351\233\266.md" +++ "b/problems/0860.\346\237\240\346\252\254\346\260\264\346\211\276\351\233\266.md" @@ -50,6 +50,10 @@ * 0 <= bills.length <= 10000 * bills[i] 不是 5 就是 10 或是 20  +# 视频讲解 + +**《代码随想录》算法视频公开课:[贪心算法,看上去复杂,其实逻辑都是固定的!LeetCode:860.柠檬水找零](https://www.bilibili.com/video/BV12x4y1j7DD),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 + ## 思路 这是前几天的leetcode每日一题,感觉不错,给大家讲一下。 From 5cb8eb074673c8e2f977adf83787145a84cee079 Mon Sep 17 00:00:00 2001 From: liangzhensheng <1250564179@qq.com> Date: Fri, 17 Mar 2023 11:28:54 +0800 Subject: [PATCH 1572/3019] =?UTF-8?q?docs:=E8=BA=AB=E9=AB=98=E9=87=8D?= =?UTF-8?q?=E5=BB=BA=E9=98=9F=E5=88=97=E6=B7=BB=E5=8A=A0=E8=A7=86=E9=A2=91?= =?UTF-8?q?=E9=93=BE=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...53\230\351\207\215\345\273\272\351\230\237\345\210\227.md" | 4 ++++ 1 file changed, 4 insertions(+) diff --git "a/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" "b/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" index 48c498e1ad..3f82d0bc20 100644 --- "a/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" +++ "b/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" @@ -37,6 +37,10 @@ 题目数据确保队列可以被重建 +# 视频讲解 + +**《代码随想录》算法视频公开课:[贪心算法,不要两边一起贪,会顾此失彼 | LeetCode:406.根据身高重建队列](https://www.bilibili.com/video/BV1EA411675Y),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 + ## 思路 本题有两个维度,h和k,看到这种题目一定要想如何确定一个维度,然后再按照另一个维度重新排列。 From 3f904211ca06133b2493ac5594187e1f925112fb Mon Sep 17 00:00:00 2001 From: liangzhensheng <1250564179@qq.com> Date: Fri, 17 Mar 2023 11:30:37 +0800 Subject: [PATCH 1573/3019] =?UTF-8?q?docs:=20=E6=9C=80=E5=B0=8F=E7=9A=84?= =?UTF-8?q?=E7=AE=AD=E5=BC=95=E7=88=86=E6=B0=94=E7=90=83=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E8=A7=86=E9=A2=91=E9=93=BE=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...56\255\345\274\225\347\210\206\346\260\224\347\220\203.md" | 4 ++++ 1 file changed, 4 insertions(+) diff --git "a/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" "b/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" index 6b018f978a..53eee25c77 100644 --- "a/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" +++ "b/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" @@ -42,6 +42,10 @@ * points[i].length == 2 * -2^31 <= xstart < xend <= 2^31 - 1 +# 视频讲解 + +**《代码随想录》算法视频公开课:[贪心算法,判断重叠区间问题 | LeetCode:452.用最少数量的箭引爆气球](https://www.bilibili.com/video/BV1SA41167xe),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 + ## 思路 如何使用最少的弓箭呢? From 403f524b3fb2f969074a10fe3516cefd563dec3b Mon Sep 17 00:00:00 2001 From: liangzhensheng <1250564179@qq.com> Date: Fri, 17 Mar 2023 11:31:35 +0800 Subject: [PATCH 1574/3019] =?UTF-8?q?docs:=20=E6=97=A0=E9=87=8D=E5=8F=A0?= =?UTF-8?q?=E5=8C=BA=E9=97=B4=E6=B7=BB=E5=8A=A0=E8=A7=86=E9=A2=91=E9=93=BE?= =?UTF-8?q?=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...27\240\351\207\215\345\217\240\345\214\272\351\227\264.md" | 4 ++++ 1 file changed, 4 insertions(+) diff --git "a/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" "b/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" index e5675e04aa..02db203414 100644 --- "a/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" +++ "b/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" @@ -30,6 +30,10 @@ * 输出: 0 * 解释: 你不需要移除任何区间,因为它们已经是无重叠的了。 +# 视频讲解 + +**《代码随想录》算法视频公开课:[贪心算法,依然是判断重叠区间 | LeetCode:435.无重叠区间](https://www.bilibili.com/video/BV1A14y1c7E1),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 + ## 思路 **相信很多同学看到这道题目都冥冥之中感觉要排序,但是究竟是按照右边界排序,还是按照左边界排序呢?** From b0692bfa0d0a368e0d3acf2f6f6541a8534b2d65 Mon Sep 17 00:00:00 2001 From: liangzhensheng <1250564179@qq.com> Date: Fri, 17 Mar 2023 11:32:37 +0800 Subject: [PATCH 1575/3019] =?UTF-8?q?docs:=20=E5=88=92=E5=88=86=E5=AD=97?= =?UTF-8?q?=E6=AF=8D=E5=8C=BA=E9=97=B4=E6=B7=BB=E5=8A=A0=E8=A7=86=E9=A2=91?= =?UTF-8?q?=E9=93=BE=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...10\206\345\255\227\346\257\215\345\214\272\351\227\264.md" | 4 ++++ 1 file changed, 4 insertions(+) diff --git "a/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" "b/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" index 077cb54ac4..ad680ef92d 100644 --- "a/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" +++ "b/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" @@ -24,6 +24,10 @@ * S的长度在[1, 500]之间。 * S只包含小写字母 'a' 到 'z' 。 +# 视频讲解 + +**《代码随想录》算法视频公开课:[贪心算法,寻找最远的出现位置! LeetCode:763.划分字母区间](https://www.bilibili.com/video/BV18G4y1K7d5),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 + ## 思路 一想到分割字符串就想到了回溯,但本题其实不用回溯去暴力搜索。 From f3b8bfaf77975d7b396d464c606a25c120e3ede9 Mon Sep 17 00:00:00 2001 From: liangzhensheng <1250564179@qq.com> Date: Fri, 17 Mar 2023 11:33:41 +0800 Subject: [PATCH 1576/3019] =?UTF-8?q?docs:=20=E5=90=88=E5=B9=B6=E5=8C=BA?= =?UTF-8?q?=E9=97=B4=E6=B7=BB=E5=8A=A0=E8=A7=86=E9=A2=91=E9=93=BE=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" | 3 +++ 1 file changed, 3 insertions(+) diff --git "a/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" "b/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" index d467ab1a29..17d2cc0a1b 100644 --- "a/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" +++ "b/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" @@ -22,6 +22,9 @@ * 解释: 区间 [1,4] 和 [4,5] 可被视为重叠区间。 * 注意:输入类型已于2019年4月15日更改。 请重置默认代码定义以获取新方法签名。 +# 视频讲解 + +**《代码随想录》算法视频公开课:[贪心算法,合并区间有细节!LeetCode:56.合并区间](https://www.bilibili.com/video/BV1wx4y157nD),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 ## 思路 From 1d2d187c3a93b390742b533302bda036c5df27c7 Mon Sep 17 00:00:00 2001 From: liangzhensheng <1250564179@qq.com> Date: Fri, 17 Mar 2023 11:35:28 +0800 Subject: [PATCH 1577/3019] =?UTF-8?q?docs:=20=E5=8D=95=E8=B0=83=E9=80=92?= =?UTF-8?q?=E5=A2=9E=E7=9A=84=E6=95=B0=E5=AD=97=E6=B7=BB=E5=8A=A0=E8=A7=86?= =?UTF-8?q?=E9=A2=91=E9=93=BE=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...00\222\345\242\236\347\232\204\346\225\260\345\255\227.md" | 4 ++++ 1 file changed, 4 insertions(+) diff --git "a/problems/0738.\345\215\225\350\260\203\351\200\222\345\242\236\347\232\204\346\225\260\345\255\227.md" "b/problems/0738.\345\215\225\350\260\203\351\200\222\345\242\236\347\232\204\346\225\260\345\255\227.md" index fda378aa46..f92652cd7f 100644 --- "a/problems/0738.\345\215\225\350\260\203\351\200\222\345\242\236\347\232\204\346\225\260\345\255\227.md" +++ "b/problems/0738.\345\215\225\350\260\203\351\200\222\345\242\236\347\232\204\346\225\260\345\255\227.md" @@ -26,6 +26,10 @@ 说明: N 是在 [0, 10^9] 范围内的一个整数。 +# 视频讲解 + +**《代码随想录》算法视频公开课:[贪心算法,思路不难想,但代码不好写!LeetCode:738.单调自增的数字](https://www.bilibili.com/video/BV1Kv4y1x7tP),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 + ## 暴力解法 From 7ad80ab57f282ac94eef6aa42cecb98774601b46 Mon Sep 17 00:00:00 2001 From: liangzhensheng <1250564179@qq.com> Date: Fri, 17 Mar 2023 11:37:27 +0800 Subject: [PATCH 1578/3019] =?UTF-8?q?docs:=20=E7=9B=91=E6=8E=A7=E4=BA=8C?= =?UTF-8?q?=E5=8F=89=E6=A0=91=E6=B7=BB=E5=8A=A0=E8=A7=86=E9=A2=91=E9=93=BE?= =?UTF-8?q?=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...33\221\346\216\247\344\272\214\345\217\211\346\240\221.md" | 4 ++++ 1 file changed, 4 insertions(+) diff --git "a/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" "b/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" index 14563a51fb..267e7f6ede 100644 --- "a/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" @@ -38,6 +38,10 @@ * 给定树的节点数的范围是 [1, 1000]。 * 每个节点的值都是 0。 +# 视频讲解 + +**《代码随想录》算法视频公开课:[贪心算法,二叉树与贪心的结合,有点难...... LeetCode:968.监督二叉树](https://www.bilibili.com/video/BV1SA411U75i),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 + ## 思路 From 33f6bc9a36aeca424dd7a5c1cb5ec5f186679ee9 Mon Sep 17 00:00:00 2001 From: liangzhensheng <1250564179@qq.com> Date: Fri, 17 Mar 2023 11:58:35 +0800 Subject: [PATCH 1579/3019] =?UTF-8?q?docs:=2001=E8=83=8C=E5=8C=85=E9=94=99?= =?UTF-8?q?=E8=AF=AF=E5=AD=97=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" index ff0b6aba28..c45fc3d302 100644 --- "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" +++ "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" @@ -87,7 +87,7 @@ leetcode上没有纯01背包的问题,都是01背包应用方面的题目, 那么可以有两个方向推出来dp[i][j], -* **不放物品i**:由dp[i - 1][j]推出,即背包容量为j,里面不放物品i的最大价值,此时dp[i][j]就是dp[i - 1][j]。(其实就是当物品i的重量大于背包j的重量时,物品i无法放进背包中,所以被背包内的价值依然和前面相同。) +* **不放物品i**:由dp[i - 1][j]推出,即背包容量为j,里面不放物品i的最大价值,此时dp[i][j]就是dp[i - 1][j]。(其实就是当物品i的重量大于背包j的重量时,物品i无法放进背包中,所以背包内的价值依然和前面相同。) * **放物品i**:由dp[i - 1][j - weight[i]]推出,dp[i - 1][j - weight[i]] 为背包容量为j - weight[i]的时候不放物品i的最大价值,那么dp[i - 1][j - weight[i]] + value[i] (物品i的价值),就是背包放物品i得到的最大价值 所以递归公式: dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]); From 29e1a07cc3a51cb61c5aec933d5d914eb105741d Mon Sep 17 00:00:00 2001 From: sharky <1821984081@qq.com> Date: Fri, 17 Mar 2023 12:22:40 +0800 Subject: [PATCH 1580/3019] =?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=EF=BC=8C40.=E7=BB=84=E5=90=88?= =?UTF-8?q?=E6=80=BB=E5=92=8CII=E7=9A=84java=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...00\347\247\215\345\206\231\346\263\225.md" | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git "a/problems/\345\233\236\346\272\257\347\256\227\346\263\225\345\216\273\351\207\215\351\227\256\351\242\230\347\232\204\345\217\246\344\270\200\347\247\215\345\206\231\346\263\225.md" "b/problems/\345\233\236\346\272\257\347\256\227\346\263\225\345\216\273\351\207\215\351\227\256\351\242\230\347\232\204\345\217\246\344\270\200\347\247\215\345\206\231\346\263\225.md" index b3bd74da28..cbbd831f8f 100644 --- "a/problems/\345\233\236\346\272\257\347\256\227\346\263\225\345\216\273\351\207\215\351\227\256\351\242\230\347\232\204\345\217\246\344\270\200\347\247\215\345\206\231\346\263\225.md" +++ "b/problems/\345\233\236\346\272\257\347\256\227\346\263\225\345\216\273\351\207\215\351\227\256\351\242\230\347\232\204\345\217\246\344\270\200\347\247\215\345\206\231\346\263\225.md" @@ -317,7 +317,38 @@ class Solution { } } ``` +**40.组合总和II** +```java +class Solution { + List> result = new ArrayList<>(); + LinkedList path = new LinkedList<>(); + public List> combinationSum2(int[] candidates, int target) { + Arrays.sort( candidates ); + if( candidates[0] > target ) return result; + backtracking(candidates,target,0,0); + return result; + } + public void backtracking(int[] candidates,int target,int sum,int startIndex){ + if( sum > target )return; + if( sum == target ){ + result.add( new ArrayList<>(path) ); + } + HashSet hashSet = new HashSet<>(); + for( int i = startIndex; i < candidates.length; i++){ + if( hashSet.contains(candidates[i]) ){ + continue; + } + hashSet.add(candidates[i]); + path.add(candidates[i]); + sum += candidates[i]; + backtracking(candidates,target,sum,i+1); + path.removeLast(); + sum -= candidates[i]; + } + } +} +``` Python: **90.子集II** From 39b1b10a8aa80b3a8fb0bc6363a7e761de4211db Mon Sep 17 00:00:00 2001 From: zsq <1377821797@qq.com> Date: Sat, 18 Mar 2023 22:16:17 +0800 Subject: [PATCH 1581/3019] Update README.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修改README语法错误 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a9b2f7efe9..43f4df15bd 100644 --- a/README.md +++ b/README.md @@ -66,7 +66,7 @@ **这里每一篇题解,都是精品,值得仔细琢磨**。 -我在题目讲解中统一使用C++,但你会发现下面几乎每篇题解都配有其他语言版本,Java、Python、Go、JavaScript等等,正是这些[热心小伙们](https://github.com/youngyangyang04/leetcode-master/graphs/contributors)的贡献的代码,当然我也会严格把控代码质量。 +我在题目讲解中统一使用C++,但你会发现下面几乎每篇题解都配有其他语言版本,Java、Python、Go、JavaScript等等,正是这些[热心小伙们](https://github.com/youngyangyang04/leetcode-master/graphs/contributors)贡献的代码,当然我也会严格把控代码质量。 **所以也欢迎大家参与进来,完善题解的各个语言版本,拥抱开源,让更多小伙伴们受益**。 From 8a7432ef2174ce8864f3e79816df2399815cd28d Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Sat, 18 Mar 2023 23:49:44 +0800 Subject: [PATCH 1582/3019] =?UTF-8?q?update=200349.=E4=B8=A4=E4=B8=AA?= =?UTF-8?q?=E6=95=B0=E7=BB=84=E7=9A=84=E4=BA=A4=E9=9B=86:=20=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E5=A4=8D=E6=9D=82=E5=BA=A6=E5=88=86=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...5\260\347\273\204\347\232\204\344\272\244\351\233\206.md" | 5 +++++ 1 file changed, 5 insertions(+) diff --git "a/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" "b/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" index 905bf4b268..0da0e30c37 100644 --- "a/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" +++ "b/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" @@ -72,6 +72,9 @@ public: }; ``` +* 时间复杂度: O(mn) +* 空间复杂度: O(n) + ## 拓展 那有同学可能问了,遇到哈希问题我直接都用set不就得了,用什么数组啊。 @@ -110,6 +113,8 @@ public: }; ``` +* 时间复杂度: O(m + n) +* 空间复杂度: O(n) ## 其他语言版本 From 46a34392d5308b9606436d6722bd43053da4da73 Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Sun, 19 Mar 2023 00:02:30 +0800 Subject: [PATCH 1583/3019] =?UTF-8?q?update=200202.=E5=BF=AB=E4=B9=90?= =?UTF-8?q?=E6=95=B0=EF=BC=9A=E6=B7=BB=E5=8A=A0=E5=A4=8D=E6=9D=82=E5=BA=A6?= =?UTF-8?q?=E5=88=86=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "problems/0202.\345\277\253\344\271\220\346\225\260.md" | 2 ++ 1 file changed, 2 insertions(+) diff --git "a/problems/0202.\345\277\253\344\271\220\346\225\260.md" "b/problems/0202.\345\277\253\344\271\220\346\225\260.md" index 2687574fdc..5ac29e8639 100644 --- "a/problems/0202.\345\277\253\344\271\220\346\225\260.md" +++ "b/problems/0202.\345\277\253\344\271\220\346\225\260.md" @@ -75,6 +75,8 @@ public: }; ``` +* 时间复杂度: O(logn) +* 空间复杂度: O(logn) From 3b79659bc0c3303ccf48219ff9398184b622b88c Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Sun, 19 Mar 2023 00:04:13 +0800 Subject: [PATCH 1584/3019] =?UTF-8?q?update=200001.=E4=B8=A4=E6=95=B0?= =?UTF-8?q?=E4=B9=8B=E5=92=8C=EF=BC=9A=E6=B7=BB=E5=8A=A0=E5=A4=8D=E6=9D=82?= =?UTF-8?q?=E5=BA=A6=E5=88=86=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" | 3 +++ 1 file changed, 3 insertions(+) diff --git "a/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" "b/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" index a0acdcbe0e..b3abb991ca 100644 --- "a/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" @@ -109,6 +109,9 @@ public: }; ``` +* 时间复杂度: O(n) +* 空间复杂度: O(n) + ## 总结 本题其实有四个重点: From 79dfddde054abed5c766aa70ed56f54ee3b1c3ef Mon Sep 17 00:00:00 2001 From: ZerenZhang2022 <118794589+ZerenZhang2022@users.noreply.github.com> Date: Sat, 18 Mar 2023 15:43:20 -0400 Subject: [PATCH 1585/3019] =?UTF-8?q?Update=200112.=E8=B7=AF=E5=BE=84?= =?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 增加112-python-简洁版解法 --- ...112.\350\267\257\345\276\204\346\200\273\345\222\214.md" | 6 ++++++ 1 file changed, 6 insertions(+) diff --git "a/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" "b/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" index e412d38e4e..bb46f04add 100644 --- "a/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" +++ "b/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" @@ -475,6 +475,12 @@ class solution: return false # 别忘记处理空treenode else: return isornot(root, targetsum - root.val) + +class Solution: # 简洁版 + def hasPathSum(self, root: Optional[TreeNode], targetSum: int) -> bool: + if not root: return False + if root.left==root.right==None and root.val == targetSum: return True + return self.hasPathSum(root.left,targetSum-root.val) or self.hasPathSum(root.right,targetSum-root.val) ``` **迭代 - 层序遍历** From 87dbf5efc5e12ea3a305be097c2967ac3792e403 Mon Sep 17 00:00:00 2001 From: ZerenZhang2022 <118794589+ZerenZhang2022@users.noreply.github.com> Date: Sat, 18 Mar 2023 16:34:16 -0400 Subject: [PATCH 1586/3019] =?UTF-8?q?Update=200112.=E8=B7=AF=E5=BE=84?= =?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 增加:0113 - python - 迭代法 - 前序遍历解法 --- ...57\345\276\204\346\200\273\345\222\214.md" | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git "a/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" "b/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" index e412d38e4e..29e5a547d9 100644 --- "a/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" +++ "b/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" @@ -560,6 +560,26 @@ class Solution: return result ``` +**迭代法,前序遍历** + +```python +class Solution: + def pathSum(self, root: Optional[TreeNode], targetSum: int) -> List[List[int]]: + if not root: return [] + stack, path_stack,result = [[root,root.val]],[[root.val]],[] + while stack: + cur,cursum = stack.pop() + path = path_stack.pop() + if cur.left==cur.right==None: + if cursum==targetSum: result.append(path) + if cur.right: + stack.append([cur.right,cursum+cur.right.val]) + path_stack.append(path+[cur.right.val]) + if cur.left: + stack.append([cur.left,cursum+cur.left.val]) + path_stack.append(path+[cur.left.val]) + return result +``` ## go ### 112. 路径总和 From 08a984d61c5b855b5052d8617dc23cf170d61c01 Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Sun, 19 Mar 2023 11:13:34 +0800 Subject: [PATCH 1587/3019] =?UTF-8?q?update=200454.=E5=9B=9B=E6=95=B0?= =?UTF-8?q?=E7=9B=B8=E5=8A=A0II=EF=BC=9A=E6=B7=BB=E5=8A=A0=E5=A4=8D?= =?UTF-8?q?=E6=9D=82=E5=BA=A6=E5=88=86=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" | 3 +++ 1 file changed, 3 insertions(+) diff --git "a/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" "b/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" index 07c3f71194..c2a5710fa2 100644 --- "a/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" +++ "b/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" @@ -83,6 +83,9 @@ public: ``` +* 时间复杂度: O(n^2) +* 空间复杂度: O(n^2),最坏情况下A和B的值各不相同,相加产生的数字个数为 n^2 + From 94f79ada2d4c234a7b8a67cddda169ef3c591ccf Mon Sep 17 00:00:00 2001 From: coffeelize <46947638+coffeelize@users.noreply.github.com> Date: Sun, 19 Mar 2023 11:13:54 +0800 Subject: [PATCH 1588/3019] =?UTF-8?q?Update=200001.=E4=B8=A4=E6=95=B0?= =?UTF-8?q?=E4=B9=8B=E5=92=8C.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 还有 --> 还要 --- .../0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" "b/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" index a0acdcbe0e..a8f8bf173a 100644 --- "a/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" @@ -41,7 +41,7 @@ 那么我们就应该想到使用哈希法了。 -因为本地,我们不仅要知道元素有没有遍历过,还有知道这个元素对应的下标,**需要使用 key value结构来存放,key来存元素,value来存下标,那么使用map正合适**。 +因为本地,我们不仅要知道元素有没有遍历过,还要知道这个元素对应的下标,**需要使用 key value结构来存放,key来存元素,value来存下标,那么使用map正合适**。 再来看一下使用数组和set来做哈希法的局限。 From c91ee8fdc2b7ff02953a758b0b9c7da4c031d7d0 Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Sun, 19 Mar 2023 11:16:15 +0800 Subject: [PATCH 1589/3019] =?UTF-8?q?update=200383.=E8=B5=8E=E9=87=91?= =?UTF-8?q?=E4=BF=A1=EF=BC=9A=E6=B7=BB=E5=8A=A0=E5=A4=8D=E6=9D=82=E5=BA=A6?= =?UTF-8?q?=E5=88=86=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0383.\350\265\216\351\207\221\344\277\241.md" | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git "a/problems/0383.\350\265\216\351\207\221\344\277\241.md" "b/problems/0383.\350\265\216\351\207\221\344\277\241.md" index 4e6ba03369..d9a184b643 100644 --- "a/problems/0383.\350\265\216\351\207\221\344\277\241.md" +++ "b/problems/0383.\350\265\216\351\207\221\344\277\241.md" @@ -39,8 +39,6 @@ canConstruct("aa", "aab") -> true 那么第一个思路其实就是暴力枚举了,两层for循环,不断去寻找,代码如下: ```CPP -// 时间复杂度: O(n^2) -// 空间复杂度:O(1) class Solution { public: bool canConstruct(string ransomNote, string magazine) { @@ -62,6 +60,9 @@ public: }; ``` +* 时间复杂度: O(n^2) +* 空间复杂度: O(1) + 这里时间复杂度是比较高的,而且里面还有一个字符串删除也就是erase的操作,也是费时的,当然这段代码也可以过这道题。 @@ -78,8 +79,6 @@ public: 代码如下: ```CPP -// 时间复杂度: O(n) -// 空间复杂度:O(1) class Solution { public: bool canConstruct(string ransomNote, string magazine) { @@ -105,6 +104,10 @@ public: }; ``` +* 时间复杂度: O(n) +* 空间复杂度: O(1) + + ## 其他语言版本 From 015935e4fa757f2fee1551e26336aa0fd520d844 Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Sun, 19 Mar 2023 11:24:04 +0800 Subject: [PATCH 1590/3019] =?UTF-8?q?update=200015.=E4=B8=89=E6=95=B0?= =?UTF-8?q?=E4=B9=8B=E5=92=8C=EF=BC=9A=E6=B7=BB=E5=8A=A0=E5=A4=8D=E6=9D=82?= =?UTF-8?q?=E5=BA=A6=E5=88=86=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...5.\344\270\211\346\225\260\344\271\213\345\222\214.md" | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git "a/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" "b/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" index 6675e4088a..26c9eaa284 100644 --- "a/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" @@ -83,6 +83,10 @@ public: }; ``` +* 时间复杂度: O(n^2) +* 空间复杂度: O(n),额外的 set 开销 + + ## 双指针 **其实这道题目使用哈希法并不十分合适**,因为在去重的操作中有很多细节需要注意,在面试中很难直接写出没有bug的代码。 @@ -158,6 +162,10 @@ public: }; ``` +* 时间复杂度: O(n^2) +* 空间复杂度: O(1) + + ## 去重逻辑的思考 ### a的去重 From cd537cb91aa0c2b879a9b3b8cf0d2f5ab0552495 Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Sun, 19 Mar 2023 11:26:02 +0800 Subject: [PATCH 1591/3019] =?UTF-8?q?update=200018.=E5=9B=9B=E6=95=B0?= =?UTF-8?q?=E4=B9=8B=E5=92=8C=EF=BC=9A=E6=B7=BB=E5=8A=A0=E5=A4=8D=E6=9D=82?= =?UTF-8?q?=E5=BA=A6=E5=88=86=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" | 4 ++++ 1 file changed, 4 insertions(+) diff --git "a/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" "b/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" index 8e87fcbd2f..5f4c2ec920 100644 --- "a/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" @@ -121,6 +121,10 @@ public: ``` +* 时间复杂度: O(n^3) +* 空间复杂度: O(1) + + ## 补充 二级剪枝的部分: From 633cb549fb21c4f45a366a973dcc30768a97a03f Mon Sep 17 00:00:00 2001 From: Javie Deng Date: Mon, 20 Mar 2023 12:36:06 +0800 Subject: [PATCH 1592/3019] =?UTF-8?q?=E4=B8=BA0226.=E7=BF=BB=E8=BD=AC?= =?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=A0=91=E6=B7=BB=E5=8A=A0=E4=BA=86C#?= =?UTF-8?q?=E8=AF=AD=E8=A8=80=E7=89=88=EF=BC=88=E5=8C=85=E5=90=AB=E9=80=92?= =?UTF-8?q?=E5=BD=92=E5=92=8C=E8=BF=AD=E4=BB=A3=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...54\344\272\214\345\217\211\346\240\221.md" | 47 +++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git "a/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" "b/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" index 16a5be577d..611e971aac 100644 --- "a/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" @@ -914,6 +914,53 @@ impl Solution { } ``` +### C# + +```csharp +//递归 +public class Solution { + public TreeNode InvertTree(TreeNode root) { + if (root == null) return root; + + swap(root); + InvertTree(root.left); + InvertTree(root.right); + return root; + } + + public void swap(TreeNode node) { + TreeNode temp = node.left; + node.left = node.right; + node.right = temp; + } +} +``` + +```csharp +//迭代 +public class Solution { + public TreeNode InvertTree(TreeNode root) { + if (root == null) return null; + Stack stack=new Stack(); + stack.Push(root); + while(stack.Count>0) + { + TreeNode node = stack.Pop(); + swap(node); + if(node.right!=null) stack.Push(node.right); + if(node.left!=null) stack.Push(node.left); + } + return root; + } + + public void swap(TreeNode node) { + TreeNode temp = node.left; + node.left = node.right; + node.right = temp; + } +} +``` +

From da2acd7dcf6c0a3fde44bb3801395eb7050f19f3 Mon Sep 17 00:00:00 2001 From: Javie Deng Date: Mon, 20 Mar 2023 13:05:00 +0800 Subject: [PATCH 1593/3019] =?UTF-8?q?"=E4=B8=BA0226.=E7=BF=BB=E8=BD=AC?= =?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=A0=91=E6=B7=BB=E5=8A=A0=E4=BA=86C#?= =?UTF-8?q?=E8=AF=AD=E8=A8=80=E7=89=88=EF=BC=88=E5=8C=85=E5=90=AB=E9=80=92?= =?UTF-8?q?=E5=BD=92=E5=92=8C=E8=BF=AD=E4=BB=A3=EF=BC=89"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...77\273\350\275\254\344\272\214\345\217\211\346\240\221.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" "b/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" index 611e971aac..c1f0f2c136 100644 --- "a/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" @@ -928,7 +928,7 @@ public class Solution { return root; } - public void swap(TreeNode node) { + public void swap(TreeNode node) { TreeNode temp = node.left; node.left = node.right; node.right = temp; @@ -953,7 +953,7 @@ public class Solution { return root; } - public void swap(TreeNode node) { + public void swap(TreeNode node) { TreeNode temp = node.left; node.left = node.right; node.right = temp; From deaf08a9ad225a113fd7c0efd40f161d93ca460c Mon Sep 17 00:00:00 2001 From: zj <294839611@qq.com> Date: Tue, 21 Mar 2023 16:15:58 +0800 Subject: [PATCH 1594/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20=E8=83=8C?= =?UTF-8?q?=E5=8C=85=E7=90=86=E8=AE=BA=E5=9F=BA=E7=A1=8001=E8=83=8C?= =?UTF-8?q?=E5=8C=85-1.md=20Java=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...47\241\20001\350\203\214\345\214\205-1.md" | 58 +++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" index ff0b6aba28..1b04b057f4 100644 --- "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" +++ "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" @@ -338,6 +338,64 @@ public class BagProblem { ``` +```java +import java.util.Arrays; + +public class BagProblem { + public static void main(String[] args) { + int[] weight = {1,3,4}; + int[] value = {15,20,30}; + int bagSize = 4; + testWeightBagProblem(weight,value,bagSize); + } + + /** + * 初始化 dp 数组做了简化(给物品增加冗余维)。这样初始化dp数组,默认全为0即可。 + * dp[i][j] 表示从下标为[0 - i-1]的物品里任意取,放进容量为j的背包,价值总和最大是多少。 + * 其实是模仿背包重量从 0 开始,背包容量 j 为 0 的话,即dp[i][0],无论是选取哪些物品,背包价值总和一定为 0。 + * 可选物品也可以从无开始,也就是没有物品可选,即dp[0][j],这样无论背包容量为多少,背包价值总和一定为 0。 + * @param weight 物品的重量 + * @param value 物品的价值 + * @param bagSize 背包的容量 + */ + public static void testWeightBagProblem(int[] weight, int[] value, int bagSize){ + + // 创建dp数组 + int goods = weight.length; // 获取物品的数量 + int[][] dp = new int[goods + 1][bagSize + 1]; // 给物品增加冗余维,i = 0 表示没有物品可选 + + // 初始化dp数组,默认全为0即可 + // 填充dp数组 + for (int i = 1; i <= goods; i++) { + for (int j = 1; j <= bagSize; j++) { + if (j < weight[i - 1]) { // i - 1 对应物品 i + /** + * 当前背包的容量都没有当前物品i大的时候,是不放物品i的 + * 那么前i-1个物品能放下的最大价值就是当前情况的最大价值 + */ + dp[i][j] = dp[i - 1][j]; + } else { + /** + * 当前背包的容量可以放下物品i + * 那么此时分两种情况: + * 1、不放物品i + * 2、放物品i + * 比较这两种情况下,哪种背包中物品的最大价值最大 + */ + dp[i][j] = Math.max(dp[i - 1][j] , dp[i - 1][j - weight[i - 1]] + value[i - 1]); // i - 1 对应物品 i + } + } + } + + // 打印dp数组 + for(int[] arr : dp){ + System.out.println(Arrays.toString(arr)); + } + } +} + +``` + ### python ```python From 06ebd5f204f8a7012c1e4518ce778fa06750d7e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=93=88=E5=93=88=E5=93=88?= <76643786+Projecthappy@users.noreply.github.com> Date: Thu, 23 Mar 2023 00:08:57 +0800 Subject: [PATCH 1595/3019] =?UTF-8?q?Update=200454.=E5=9B=9B=E6=95=B0?= =?UTF-8?q?=E7=9B=B8=E5=8A=A0II.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 原先是先判断map中是否有这个key,后面更新时再get(key),经过测试,直接使用getOrDefault()方法效率会更高一些,没有当前key时返回0,值为0就是没有当前key --- ...33\346\225\260\347\233\270\345\212\240II.md" | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git "a/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" "b/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" index c2a5710fa2..411b60e872 100644 --- "a/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" +++ "b/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" @@ -97,26 +97,25 @@ Java: ```Java class Solution { public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) { - Map map = new HashMap<>(); - int temp; int res = 0; + Map map = new HashMap(); //统计两个数组中的元素之和,同时统计出现的次数,放入map for (int i : nums1) { for (int j : nums2) { - temp = i + j; - if (map.containsKey(temp)) { - map.put(temp, map.get(temp) + 1); + int tmp = map.getOrDefault(i + j, 0); + if (tmp == 0) { + map.put(i + j, 1); } else { - map.put(temp, 1); + map.replace(i + j, tmp + 1); } } } //统计剩余的两个元素的和,在map中找是否存在相加为0的情况,同时记录次数 for (int i : nums3) { for (int j : nums4) { - temp = i + j; - if (map.containsKey(0 - temp)) { - res += map.get(0 - temp); + int tmp = map.getOrDefault(0 - i - j, 0); + if (tmp != 0) { + res += tmp; } } } From 37d12a168cfa59e0ae44203f5aa8234d588f23fd Mon Sep 17 00:00:00 2001 From: ZerenZhang2022 <118794589+ZerenZhang2022@users.noreply.github.com> Date: Wed, 22 Mar 2023 18:22:15 -0400 Subject: [PATCH 1596/3019] =?UTF-8?q?Update=200530.=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=90=9C=E7=B4=A2=E6=A0=91=E7=9A=84=E6=9C=80=E5=B0=8F=E7=BB=9D?= =?UTF-8?q?=E5=AF=B9=E5=B7=AE.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 增加python - 双指针法,不用数组 (同Carl写法) - 更快 --- ...17\347\273\235\345\257\271\345\267\256.md" | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git "a/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" "b/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" index 203add397d..fa1430dec1 100644 --- "a/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" +++ "b/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" @@ -221,8 +221,27 @@ class Solution: for i in range(len(res)-1): // 统计有序数组的最小差值 r = min(abs(res[i]-res[i+1]),r) return r + + +class Solution: # 双指针法,不用数组 (同Carl写法) - 更快 + def getMinimumDifference(self, root: Optional[TreeNode]) -> int: + global pre,minval + pre = None + minval = 10**5 + self.traversal(root) + return minval + + def traversal(self,root): + global pre,minval + if not root: return None + self.traversal(root.left) + if pre and root.val-pre.val Date: Thu, 23 Mar 2023 10:57:32 +0800 Subject: [PATCH 1597/3019] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BA=860056.?= =?UTF-8?q?=E5=90=88=E5=B9=B6=E5=8C=BA=E9=97=B4=E7=9A=84=E8=A7=A3=E6=B3=95?= =?UTF-8?q?=E4=BA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...10\345\271\266\345\214\272\351\227\264.md" | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git "a/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" "b/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" index d467ab1a29..0daf5f9b2c 100644 --- "a/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" +++ "b/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" @@ -174,6 +174,34 @@ func max(a, b int) int { return b } ``` +```go +// 版本2 +func merge(intervals [][]int) [][]int { + if len(intervals) == 1 { + return intervals + } + sort.Slice(intervals, func(i, j int) bool { + return intervals[i][0] < intervals[j][0] + }) + res := make([][]int, 0) + res = append(res, intervals[0]) + for i := 1; i < len(intervals); i++ { + if intervals[i][0] <= res[len(res)-1][1]{ + res[len(res)-1][1] = max56(res[len(res)-1][1],intervals[i][1]) + } else { + res = append(res, intervals[i]) + } + } + return res +} +func max56(a, b int) int { + if a > b { + return a + } + return b +} +``` + ### Javascript ```javascript From f51f31290f69bf467bdb444d8c85a94b0c30616a Mon Sep 17 00:00:00 2001 From: fw_qaq Date: Thu, 23 Mar 2023 11:10:20 +0800 Subject: [PATCH 1598/3019] =?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 --- ...215\345\273\272\351\230\237\345\210\227.md" | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git "a/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" "b/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" index 48c498e1ad..2e6818db05 100644 --- "a/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" +++ "b/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" @@ -291,19 +291,19 @@ var reconstructQueue = function(people) { ```Rust impl Solution { - pub fn reconstruct_queue(people: Vec>) -> Vec> { - let mut people = people; + pub fn reconstruct_queue(mut people: Vec>) -> Vec> { + let mut queue = vec![]; people.sort_by(|a, b| { - if a[0] == b[0] { return a[1].cmp(&b[1]); } + if a[0] == b[0] { + return a[1].cmp(&b[1]); + } b[0].cmp(&a[0]) }); - let mut que: Vec> = Vec::new(); - que.push(people[0].clone()); - for i in 1..people.len() { - let position = people[i][1]; - que.insert(position as usize, people[i].clone()); + queue.push(people[0].clone()); + for v in people.iter().skip(1) { + queue.insert(v[1] as usize, v.clone()); } - que + queue } } ``` From b934f47c83340b91b8a6291d96420978da0ec0e6 Mon Sep 17 00:00:00 2001 From: milu-tao <91822069+milu-tao@users.noreply.github.com> Date: Fri, 24 Mar 2023 22:14:39 +0800 Subject: [PATCH 1599/3019] =?UTF-8?q?Update=200647.=E5=9B=9E=E6=96=87?= =?UTF-8?q?=E5=AD=90=E4=B8=B2.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. result 在遍历过程中 ++ 就行,没必要另外计算 2.题目已经表明:s字符串的长度规则是:1 <= s.length <= 1000,所以前面不需要进行判断字符串长度 --- ...36\346\226\207\345\255\220\344\270\262.md" | 33 +++++++------------ 1 file changed, 12 insertions(+), 21 deletions(-) diff --git "a/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" "b/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" index 90e6da9fbf..339247f58a 100644 --- "a/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" +++ "b/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" @@ -238,33 +238,24 @@ Java: ```java class Solution { public int countSubstrings(String s) { - int len, ans = 0; - if (s == null || (len = s.length()) < 1) return 0; - //dp[i][j]:s字符串下标i到下标j的字串是否是一个回文串,即s[i, j] + char[] chars = s.toCharArray(); + int len = chars.length; boolean[][] dp = new boolean[len][len]; - for (int j = 0; j < len; j++) { - for (int i = 0; i <= j; i++) { - //当两端字母一样时,才可以两端收缩进一步判断 - if (s.charAt(i) == s.charAt(j)) { - //i++,j--,即两端收缩之后i,j指针指向同一个字符或者i超过j了,必然是一个回文串 - if (j - i < 3) { + int result = 0; + for (int i = len - 1; i >= 0; i--) { + for (int j = i; j < len; j++) { + if (chars[i] == chars[j]) { + if (j - i <= 1) { // 情况一 和 情况二 + result++; + dp[i][j] = true; + } else if (dp[i + 1][j - 1]) { //情况三 + result++; dp[i][j] = true; - } else { - //否则通过收缩之后的字串判断 - dp[i][j] = dp[i + 1][j - 1]; } - } else {//两端字符不一样,不是回文串 - dp[i][j] = false; } } } - //遍历每一个字串,统计回文串个数 - for (int i = 0; i < len; i++) { - for (int j = 0; j < len; j++) { - if (dp[i][j]) ans++; - } - } - return ans; + return result; } } ``` From 4b65ece9ed30a88962782f1742d2d07d53783010 Mon Sep 17 00:00:00 2001 From: "Mr.D" Date: Sun, 26 Mar 2023 16:52:18 +0800 Subject: [PATCH 1600/3019] Add another Rust solution --- ...44\346\225\260\344\271\213\345\222\214.md" | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git "a/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" "b/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" index b3abb991ca..eea3ba7a44 100644 --- "a/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" @@ -216,6 +216,26 @@ impl Solution { } } ``` +Rust + +``` +use std::collections::HashMap; + +impl Solution { + pub fn two_sum(nums: Vec, target: i32) -> Vec { + let mut hm: HashMap = HashMap::new(); + for i in 0..nums.len() { + let j = target - nums[i]; + if hm.contains_key(&j) { + return vec![*hm.get(&j).unwrap(), i as i32] + } else { + hm.insert(nums[i], i as i32); + } + } + vec![-1, -1] + } +} +``` Javascript From c73c1a2b107780ce0aeb78c578112d065b887aa4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BA=A6=E8=B6=85=E7=A6=B9?= <1677425105@qq.com> Date: Sun, 26 Mar 2023 18:36:13 +0800 Subject: [PATCH 1601/3019] =?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 --- ...\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" index ff0b6aba28..c45fc3d302 100644 --- "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" +++ "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" @@ -87,7 +87,7 @@ leetcode上没有纯01背包的问题,都是01背包应用方面的题目, 那么可以有两个方向推出来dp[i][j], -* **不放物品i**:由dp[i - 1][j]推出,即背包容量为j,里面不放物品i的最大价值,此时dp[i][j]就是dp[i - 1][j]。(其实就是当物品i的重量大于背包j的重量时,物品i无法放进背包中,所以被背包内的价值依然和前面相同。) +* **不放物品i**:由dp[i - 1][j]推出,即背包容量为j,里面不放物品i的最大价值,此时dp[i][j]就是dp[i - 1][j]。(其实就是当物品i的重量大于背包j的重量时,物品i无法放进背包中,所以背包内的价值依然和前面相同。) * **放物品i**:由dp[i - 1][j - weight[i]]推出,dp[i - 1][j - weight[i]] 为背包容量为j - weight[i]的时候不放物品i的最大价值,那么dp[i - 1][j - weight[i]] + value[i] (物品i的价值),就是背包放物品i得到的最大价值 所以递归公式: dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]); From 62a9b6c3722a44f8bf71ea360d6331a2f9918294 Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Mon, 27 Mar 2023 14:07:22 +0800 Subject: [PATCH 1602/3019] =?UTF-8?q?update=200344.=E5=8F=8D=E8=BD=AC?= =?UTF-8?q?=E5=AD=97=E7=AC=A6=E4=B8=B2=EF=BC=9A=E6=B7=BB=E5=8A=A0=E5=A4=8D?= =?UTF-8?q?=E6=9D=82=E5=BA=A6=E5=88=86=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" | 3 +++ 1 file changed, 3 insertions(+) diff --git "a/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" "b/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" index 6ffbac26a0..775cfc5872 100644 --- "a/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" @@ -130,6 +130,9 @@ public: }; ``` +* 时间复杂度: O(n) +* 空间复杂度: O(1) + From 22ab6281e44ca025aaca2e5a94ba3e07f2021c1a Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Mon, 27 Mar 2023 14:17:07 +0800 Subject: [PATCH 1603/3019] =?UTF-8?q?update=200541.=E5=8F=8D=E8=BD=AC?= =?UTF-8?q?=E5=AD=97=E7=AC=A6=E4=B8=B2II=EF=BC=9A=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E5=A4=8D=E6=9D=82=E5=BA=A6=E5=88=86=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...350\275\254\345\255\227\347\254\246\344\270\262II.md" | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git "a/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" "b/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" index 516f78da3c..179395b3ac 100644 --- "a/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" +++ "b/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" @@ -65,6 +65,9 @@ public: }; ``` +* 时间复杂度: O(n) +* 空间复杂度: O(1) + @@ -96,6 +99,9 @@ public: }; ``` +* 时间复杂度: O(n) +* 空间复杂度: O(1)或O(n), 取决于使用的语言中字符串是否可以修改. + 另一种思路的解法 @@ -116,6 +122,9 @@ public: }; ``` +* 时间复杂度: O(n) +* 空间复杂度: O(1) + ## 其他语言版本 From fe386a051dc73b3fd40bc79b70119df2e068ed9b Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Mon, 27 Mar 2023 14:29:13 +0800 Subject: [PATCH 1604/3019] =?UTF-8?q?update=200151.=E7=BF=BB=E8=BD=AC?= =?UTF-8?q?=E5=AD=97=E7=AC=A6=E4=B8=B2=E9=87=8C=E7=9A=84=E5=8D=95=E8=AF=8D?= =?UTF-8?q?=EF=BC=9A=E6=B7=BB=E5=8A=A0=E5=A4=8D=E6=9D=82=E5=BA=A6=E5=88=86?= =?UTF-8?q?=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...70\262\351\207\214\347\232\204\345\215\225\350\257\215.md" | 4 ++++ 1 file changed, 4 insertions(+) diff --git "a/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" "b/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" index eb78cc9d18..1b00666546 100644 --- "a/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" +++ "b/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" @@ -114,6 +114,7 @@ void removeExtraSpaces(string& s) { } ``` + 有的同学可能发现用erase来移除空格,在leetcode上性能也还行。主要是以下几点;: 1. leetcode上的测试集里,字符串的长度不够长,如果足够长,性能差距会非常明显。 @@ -197,6 +198,9 @@ public: }; ``` +* 时间复杂度: O(n) +* 空间复杂度: O(1) 或 O(n),取决于语言中字符串是否可变 + ## 其他语言版本 From cc1a327fb1d9f9e3ead9ba8f122b20ff4d112baf Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Mon, 27 Mar 2023 14:36:32 +0800 Subject: [PATCH 1605/3019] =?UTF-8?q?update=20=E5=89=91=E6=8C=87Offer58-II?= =?UTF-8?q?.=E5=B7=A6=E6=97=8B=E8=BD=AC=E5=AD=97=E7=AC=A6=E4=B8=B2?= =?UTF-8?q?=EF=BC=9A=E6=B7=BB=E5=8A=A0=E5=A4=8D=E6=9D=82=E5=BA=A6=E5=88=86?= =?UTF-8?q?=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" | 3 +++ 1 file changed, 3 insertions(+) diff --git "a/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" "b/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" index 49480abfae..f368514f4b 100644 --- "a/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" @@ -66,6 +66,9 @@ public: } }; ``` +* 时间复杂度: O(n) +* 空间复杂度:O(1) + 是不是发现这代码也太简单了,哈哈。 # 总结 From 167cb84ee3b4ae514d898e33090d2453a516f02e Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Mon, 27 Mar 2023 15:12:08 +0800 Subject: [PATCH 1606/3019] =?UTF-8?q?update=200028.=E5=AE=9E=E7=8E=B0strSt?= =?UTF-8?q?r=EF=BC=9A=E6=B7=BB=E5=8A=A0=E5=A4=8D=E6=9D=82=E5=BA=A6?= =?UTF-8?q?=E5=88=86=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "problems/0028.\345\256\236\347\216\260strStr.md" | 5 +++++ 1 file changed, 5 insertions(+) diff --git "a/problems/0028.\345\256\236\347\216\260strStr.md" "b/problems/0028.\345\256\236\347\216\260strStr.md" index 2757130c8a..263c168995 100644 --- "a/problems/0028.\345\256\236\347\216\260strStr.md" +++ "b/problems/0028.\345\256\236\347\216\260strStr.md" @@ -444,6 +444,8 @@ public: }; ``` +* 时间复杂度: O(n + m) +* 空间复杂度: O(m), 只需要保存字符串needle的前缀表 # 前缀表(不减一)C++实现 @@ -540,6 +542,9 @@ public: } }; ``` +* 时间复杂度: O(n + m) +* 空间复杂度: O(m) + # 总结 From dbcd875d3bcc0ccbf6b331bbfd07e799e272688b Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Mon, 27 Mar 2023 16:22:07 +0800 Subject: [PATCH 1607/3019] =?UTF-8?q?update=200459.=E9=87=8D=E5=A4=8D?= =?UTF-8?q?=E7=9A=84=E5=AD=90=E5=AD=97=E7=AC=A6=E4=B8=B2=EF=BC=9A=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E5=A4=8D=E6=9D=82=E5=BA=A6=E5=88=86=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\204\345\255\220\345\255\227\347\254\246\344\270\262.md" | 6 ++++++ 1 file changed, 6 insertions(+) diff --git "a/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" "b/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" index 5d87021903..98c02a2544 100644 --- "a/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" @@ -73,6 +73,8 @@ public: } }; ``` +* 时间复杂度: O(n) +* 空间复杂度: O(1) 不过这种解法还有一个问题,就是 我们最终还是要判断 一个字符串(s + s)是否出现过 s 的过程,大家可能直接用contains,find 之类的库函数。 却忽略了实现这些函数的时间复杂度(暴力解法是m * n,一般库函数实现为 O(m + n))。 @@ -185,6 +187,8 @@ public: } }; ``` +* 时间复杂度: O(n) +* 空间复杂度: O(n) 前缀表(不减一)的C++代码实现: @@ -219,6 +223,8 @@ public: } }; ``` +* 时间复杂度: O(n) +* 空间复杂度: O(n) ## 其他语言版本 From 334f4a27de2ecc00134c6cf287f658758f856e6f Mon Sep 17 00:00:00 2001 From: hoxiansen <1365171821@qq.com> Date: Tue, 28 Mar 2023 09:40:19 +0000 Subject: [PATCH 1608/3019] =?UTF-8?q?Update=200518.=E9=9B=B6=E9=92=B1?= =?UTF-8?q?=E5=85=91=E6=8D=A2II.md=20=E8=A1=A5=E5=85=85=E4=BA=8C=E7=BB=B4d?= =?UTF-8?q?p=E6=95=B0=E7=BB=84=E7=9A=84Java=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\351\222\261\345\205\221\346\215\242II.md" | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git "a/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" "b/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" index 3fd03e1607..eb5a844ce4 100644 --- "a/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" +++ "b/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" @@ -215,6 +215,27 @@ class Solution { } } ``` +```Java +// 二维dp数组版本,方便理解 +class Solution { + public int change(int amount, int[] coins) { + int[][] dp = new int[coins.length][amount + 1]; + // 只有一种硬币的情况 + for (int i = 0; i <= amount; i += coins[0]) { + dp[0][i] = 1; + } + for (int i = 1; i < coins.length; i++) { + for (int j = 0; j <= amount; j++) { + // 第i种硬币使用0~k次,求和 + for (int k = 0; k * coins[i] <= j; k++) { + dp[i][j] += dp[i - 1][j - k * coins[i]]; + } + } + } + return dp[coins.length - 1][amount]; + } +} +``` Python: From b18aba58bcfa66b31fb9d40ffb6805f75f5bd3ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8A=B1=E6=97=A0=E7=BC=BA?= Date: Tue, 28 Mar 2023 22:22:14 +0800 Subject: [PATCH 1609/3019] =?UTF-8?q?=E6=9B=B4=E6=94=B9=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/0070.\347\210\254\346\245\274\346\242\257.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0070.\347\210\254\346\245\274\346\242\257.md" "b/problems/0070.\347\210\254\346\245\274\346\242\257.md" index d824622389..a06ee91e1d 100644 --- "a/problems/0070.\347\210\254\346\245\274\346\242\257.md" +++ "b/problems/0070.\347\210\254\346\245\274\346\242\257.md" @@ -72,7 +72,7 @@ dp[i]: 爬到第i层楼梯,有dp[i]种方法 3. dp数组如何初始化 -再回顾一下dp[i]的定义:爬到第i层楼梯,有dp[i]中方法。 +再回顾一下dp[i]的定义:爬到第i层楼梯,有dp[i]种方法。 那么i为0,dp[i]应该是多少呢,这个可以有很多解释,但基本都是直接奔着答案去解释的。 From dad45d599b9368e7ddeeea9b62bc53bea122fc24 Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Wed, 29 Mar 2023 11:34:59 +0800 Subject: [PATCH 1610/3019] Update --- README.md | 2 +- ...5\344\273\243\347\220\206\350\247\243).md" | 145 ------------------ ...15\346\235\202\345\272\246\357\274\201.md" | 16 +- ...06\350\256\272\345\237\272\347\241\200.md" | 5 +- 4 files changed, 11 insertions(+), 157 deletions(-) delete mode 100644 "problems/0377-\347\273\204\345\220\210\346\200\273\345\222\214IV(\345\256\214\345\205\250\350\203\214\345\214\205\347\232\204\346\216\222\345\210\227\351\227\256\351\242\230\344\272\214\347\273\264\350\277\255\344\273\243\347\220\206\350\247\243).md" diff --git a/README.md b/README.md index a9b2f7efe9..f3e5812ca8 100644 --- a/README.md +++ b/README.md @@ -62,7 +62,7 @@ 如果你是算法老手,这篇攻略也是复习的最佳资料,如果把每个系列对应的总结篇,快速过一遍,整个算法知识体系以及各种解法就重现脑海了。 -目前「代码随想录」刷题攻略更新了:**200多篇文章,精讲了200道经典算法题目,共60w字的详细图解,部分难点题目还搭配了20分钟左右的视频讲解**。 +目前「代码随想录」刷题攻略更新了:**200多篇文章,精讲了200道经典算法题目,共60w字的详细图解,大部分题目都搭配了20分钟左右的视频讲解**,视频质量很好,口碑很好,大家可以去看看,视频列表:[代码随想录视频讲解](https://www.bilibili.com/video/BV1fA4y1o715)。 **这里每一篇题解,都是精品,值得仔细琢磨**。 diff --git "a/problems/0377-\347\273\204\345\220\210\346\200\273\345\222\214IV(\345\256\214\345\205\250\350\203\214\345\214\205\347\232\204\346\216\222\345\210\227\351\227\256\351\242\230\344\272\214\347\273\264\350\277\255\344\273\243\347\220\206\350\247\243).md" "b/problems/0377-\347\273\204\345\220\210\346\200\273\345\222\214IV(\345\256\214\345\205\250\350\203\214\345\214\205\347\232\204\346\216\222\345\210\227\351\227\256\351\242\230\344\272\214\347\273\264\350\277\255\344\273\243\347\220\206\350\247\243).md" deleted file mode 100644 index 276329c56a..0000000000 --- "a/problems/0377-\347\273\204\345\220\210\346\200\273\345\222\214IV(\345\256\214\345\205\250\350\203\214\345\214\205\347\232\204\346\216\222\345\210\227\351\227\256\351\242\230\344\272\214\347\273\264\350\277\255\344\273\243\347\220\206\350\247\243).md" +++ /dev/null @@ -1,145 +0,0 @@ -# 完全背包的排列问题模拟 - -#### Problem - -1. 排列问题是完全背包中十分棘手的问题。 -2. 其在迭代过程中需要先迭代背包容量,再迭代物品个数,使得其在代码理解上较难入手。 - -#### Contribution - -本文档以力扣上[组合总和IV](https://leetcode.cn/problems/combination-sum-iv/)为例,提供一个二维dp的代码例子,并提供模拟过程以便于理解 - -#### Code - -```cpp -int combinationSum4(vector& nums, int target) { - // 定义背包容量为target,物品个数为nums.size()的dp数组 - // dp[i][j]表示将第0-i个物品添加入排列中,和为j的排列方式 - vector> dp (nums.size(), vector(target+1,0)); - - // 表示有0,1,...,n个物品可选择的情况下,和为0的选择方法为1:什么都不取 - for(int i = 0; i < nums.size(); i++) dp[i][0] = 1; - - // 必须按列遍历,因为右边数组需要知道左边数组最低部的信息(排列问题) - // 后面的模拟可以更清楚的表现这么操作的原因 - for(int i = 1; i <= target; i++){ - for(int j = 0; j < nums.size(); j++){ - // 只有nums[j]可以取的情况 - if(j == 0){ - if(nums[j] > i) dp[j][i] = 0; - // 如果背包容量放不下 那么此时没有排列方式 - else dp[j][i] = dp[nums.size()-1][i-nums[j]]; - // 如果背包容量放的下 全排列方式为dp[最底层][容量-该物品容量]排列方式后面放一个nums[j] - } - // 有多个nums数可以取 - else{ - // 如果背包容量放不下 那么沿用0-j-1个物品的排列方式 - if(nums[j] > i) dp[j][i] = dp[j-1][i]; - // 如果背包容量放得下 在dp[最底层][容量-该物品容量]排列方式后面放一个nums[j]后面放个nums[j] - // INT_MAX避免溢出 - else if(i >= nums[j] && dp[j-1][i] < INT_MAX - dp[nums.size()-1][i-nums[j]]) - dp[j][i] = dp[j-1][i] + dp[nums.size()-1][i-nums[j]]; - } - } - } - // 打印dp数组 - for(int i = 0; i < nums.size(); i++){ - for(int j = 0; j <= target; j++){ - cout< Date: Wed, 29 Mar 2023 11:52:19 +0800 Subject: [PATCH 1611/3019] =?UTF-8?q?Update=20=E6=A0=B9=E6=8D=AE=E8=BA=AB?= =?UTF-8?q?=E9=AB=98=E9=87=8D=E5=BB=BA=E9=98=9F=E5=88=97=EF=BC=88vector?= =?UTF-8?q?=E5=8E=9F=E7=90=86=E8=AE=B2=E8=A7=A3=EF=BC=89.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...06\350\256\262\350\247\243\357\274\211.md" | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git "a/problems/\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227\357\274\210vector\345\216\237\347\220\206\350\256\262\350\247\243\357\274\211.md" "b/problems/\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227\357\274\210vector\345\216\237\347\220\206\350\256\262\350\247\243\357\274\211.md" index 94d94e3849..4f8cab8288 100644 --- "a/problems/\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227\357\274\210vector\345\216\237\347\220\206\350\256\262\350\247\243\357\274\211.md" +++ "b/problems/\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227\357\274\210vector\345\216\237\347\220\206\350\256\262\350\247\243\357\274\211.md" @@ -177,6 +177,35 @@ Java: Python: +Rust: + +```rust +// 版本二,使用list(链表) +use std::collections::LinkedList; +impl Solution{ + pub fn reconstruct_queue(mut people: Vec>) -> Vec> { + let mut queue = LinkedList::new(); + people.sort_by(|a, b| { + if a[0] == b[0] { + return a[1].cmp(&b[1]); + } + b[0].cmp(&a[0]) + }); + queue.push_back(people[0].clone()); + for v in people.iter().skip(1) { + if queue.len() > v[1] as usize { + let mut back_link = queue.split_off(v[1] as usize); + queue.push_back(v.clone()); + queue.append(&mut back_link); + } else { + queue.push_back(v.clone()); + } + } + queue.into_iter().collect() + } +} +``` + Go: From c835ec07b6fd76303e11ebf082df70fceb3891e3 Mon Sep 17 00:00:00 2001 From: fw_qaq Date: Wed, 29 Mar 2023 16:44:08 +0800 Subject: [PATCH 1612/3019] =?UTF-8?q?Update=2024.=20=E4=B8=A4=E4=B8=A4?= =?UTF-8?q?=E4=BA=A4=E6=8D=A2=E9=93=BE=E8=A1=A8=E4=B8=AD=E7=9A=84=E8=8A=82?= =?UTF-8?q?=E7=82=B9=20about=20rust=20=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" "b/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" index 4dc051aa74..12912382f0 100644 --- "a/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" +++ "b/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" @@ -410,7 +410,7 @@ impl Solution { // 递归 impl Solution { pub fn swap_pairs(head: Option>) -> Option> { - if head == None || head.as_ref().unwrap().next == None { + if head.is_none() || head.as_ref().unwrap().next.is_none() { return head; } From 59c86a7023989e3cb3195615f30a0a99e39fa556 Mon Sep 17 00:00:00 2001 From: fw_qaq Date: Wed, 29 Mar 2023 18:15:26 +0800 Subject: [PATCH 1613/3019] =?UTF-8?q?Update=200844.=E6=AF=94=E8=BE=83?= =?UTF-8?q?=E5=90=AB=E9=80=80=E6=A0=BC=E7=9A=84=E5=AD=97=E7=AC=A6=E4=B8=B2?= =?UTF-8?q?.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...04\345\255\227\347\254\246\344\270\262.md" | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git "a/problems/0844.\346\257\224\350\276\203\345\220\253\351\200\200\346\240\274\347\232\204\345\255\227\347\254\246\344\270\262.md" "b/problems/0844.\346\257\224\350\276\203\345\220\253\351\200\200\346\240\274\347\232\204\345\255\227\347\254\246\344\270\262.md" index 6534f18c90..40d5caa1c6 100644 --- "a/problems/0844.\346\257\224\350\276\203\345\220\253\351\200\200\346\240\274\347\232\204\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/0844.\346\257\224\350\276\203\345\220\253\351\200\200\346\240\274\347\232\204\345\255\227\347\254\246\344\270\262.md" @@ -535,6 +535,35 @@ function getIndexAfterDel(s: string, startIndex: number): number { } ``` +### Rust + +> 双指针 + +```rust +impl Solution { + pub fn backspace_compare(s: String, t: String) -> bool { + let (s, t) = ( + s.chars().collect::>(), + t.chars().collect::>(), + ); + Self::get_string(s) == Self::get_string(t) + } + + pub fn get_string(mut chars: Vec) -> Vec { + let mut slow = 0; + for i in 0..chars.len() { + if chars[i] == '#' { + slow = (slow as u32).saturating_sub(1) as usize; + } else { + chars[slow] = chars[i]; + slow += 1; + } + } + chars.truncate(slow); + chars + } +} +``` From e4951bc9dba7ebaa5314d41a52b0a5d97b8a6cea Mon Sep 17 00:00:00 2001 From: fw_qaq Date: Wed, 29 Mar 2023 18:34:11 +0800 Subject: [PATCH 1614/3019] =?UTF-8?q?Update=200844.=E6=AF=94=E8=BE=83?= =?UTF-8?q?=E5=90=AB=E9=80=80=E6=A0=BC=E7=9A=84=E5=AD=97=E7=AC=A6=E4=B8=B2?= =?UTF-8?q?.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...04\345\255\227\347\254\246\344\270\262.md" | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git "a/problems/0844.\346\257\224\350\276\203\345\220\253\351\200\200\346\240\274\347\232\204\345\255\227\347\254\246\344\270\262.md" "b/problems/0844.\346\257\224\350\276\203\345\220\253\351\200\200\346\240\274\347\232\204\345\255\227\347\254\246\344\270\262.md" index 40d5caa1c6..ac56f6f990 100644 --- "a/problems/0844.\346\257\224\350\276\203\345\220\253\351\200\200\346\240\274\347\232\204\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/0844.\346\257\224\350\276\203\345\220\253\351\200\200\346\240\274\347\232\204\345\255\227\347\254\246\344\270\262.md" @@ -565,7 +565,27 @@ impl Solution { } ``` +> 双栈法 +```rust +impl Solution { + pub fn backspace_compare(s: String, t: String) -> bool { + Self::get_string(s) == Self::get_string(t) + } + + pub fn get_string(string: String) -> String { + let mut s = String::new(); + for c in string.chars() { + if c != '#' { + s.push(c); + } else if !s.is_empty() { + s.pop(); + } + } + s + } +} +```

From cff523c993e88c7e8de553225af7112113ae6754 Mon Sep 17 00:00:00 2001 From: fw_qaq Date: Wed, 29 Mar 2023 19:58:07 +0800 Subject: [PATCH 1615/3019] =?UTF-8?q?Update=200452.=E7=94=A8=E6=9C=80?= =?UTF-8?q?=E5=B0=91=E6=95=B0=E9=87=8F=E7=9A=84=E7=AE=AD=E5=BC=95=E7=88=86?= =?UTF-8?q?=E6=B0=94=E7=90=83.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...25\347\210\206\346\260\224\347\220\203.md" | 22 ++++++------------- 1 file changed, 7 insertions(+), 15 deletions(-) diff --git "a/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" "b/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" index 6b018f978a..3066d5292a 100644 --- "a/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" +++ "b/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" @@ -270,26 +270,18 @@ int findMinArrowShots(int** points, int pointsSize, int* pointsColSize){ ### Rust ```Rust -use std::cmp; impl Solution { pub fn find_min_arrow_shots(mut points: Vec>) -> i32 { - if points.is_empty() { - return 0; - } points.sort_by_key(|point| point[0]); - - let size = points.len(); - let mut count = 1; - - for i in 1..size { - if points[i][0] > points[i-1][1] { - count += 1; - } else { - points[i][1] = cmp::min(points[i][1], points[i-1][1]); + let mut result = 1; + for i in 1..points.len() { + if points[i][0] > points[i - 1][1] { + result += 1; + } else { + points[i][1] = points[i][1].min(points[i - 1][1]) } } - - return count; + result } } ``` From d1ccf8d3320eba0bfe0fb6dfdb88a4951c0729bb Mon Sep 17 00:00:00 2001 From: fw_qaq Date: Wed, 29 Mar 2023 20:00:07 +0800 Subject: [PATCH 1616/3019] =?UTF-8?q?Update=200452.=E7=94=A8=E6=9C=80?= =?UTF-8?q?=E5=B0=91=E6=95=B0=E9=87=8F=E7=9A=84=E7=AE=AD=E5=BC=95=E7=88=86?= =?UTF-8?q?=E6=B0=94=E7=90=83.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" | 3 +++ 1 file changed, 3 insertions(+) diff --git "a/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" "b/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" index 3066d5292a..79f9d59ad3 100644 --- "a/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" +++ "b/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" @@ -272,6 +272,9 @@ int findMinArrowShots(int** points, int pointsSize, int* pointsColSize){ ```Rust impl Solution { pub fn find_min_arrow_shots(mut points: Vec>) -> i32 { + if points.is_empty() { + return 0; + } points.sort_by_key(|point| point[0]); let mut result = 1; for i in 1..points.len() { From 7e02650599bd98ef92f017f2838c09c17235a502 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8A=B1=E6=97=A0=E7=BC=BA?= Date: Wed, 29 Mar 2023 20:21:27 +0800 Subject: [PATCH 1617/3019] =?UTF-8?q?update=20=E4=BD=BF=E7=94=A8=E6=9C=80?= =?UTF-8?q?=E5=B0=8F=E8=8A=B1=E8=B4=B9=E7=88=AC=E6=A5=BC=E6=A2=AF.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 优化文档中的语言描述 --- ...\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" "b/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" index d6b3a17735..d7258d4576 100644 --- "a/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" +++ "b/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" @@ -92,7 +92,7 @@ dp[i - 2] 跳到 dp[i] 需要花费 dp[i - 2] + cost[i - 2]。 这里就要说明本题力扣为什么改题意,而且修改题意之后 就清晰很多的原因了。 -新题目描述中明确说了 “你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。” 也就是说 从 到达 第 0 个台阶是不花费的,但从 第0 个台阶 往上跳的话,需要花费 cost[0]。 +新题目描述中明确说了 “你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。” 也就是说 到达 第 0 个台阶是不花费的,但从 第0 个台阶 往上跳的话,需要花费 cost[0]。 所以初始化 dp[0] = 0,dp[1] = 0; From 5daf942cd584259762907c1e796ad535d5aa9ce6 Mon Sep 17 00:00:00 2001 From: Lozakaka <102352821+Lozakaka@users.noreply.github.com> Date: Wed, 29 Mar 2023 22:47:54 -0400 Subject: [PATCH 1618/3019] =?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 新增一個java solution用的是卡哥的邏輯 --- ...27\345\256\236\347\216\260\346\240\210.md" | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git "a/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" "b/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" index 16b9e47cae..66d807c1b1 100644 --- "a/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" +++ "b/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" @@ -324,6 +324,43 @@ class MyStack { } } +``` +优化,使用一个 Queue 实现,但用卡哥的逻辑实现 +``` +class MyStack { + Queue queue; + + public MyStack() { + queue = new LinkedList<>(); + } + + public void push(int x) { + queue.add(x); + } + + public int pop() { + rePosition(); + return queue.poll(); + } + + public int top() { + rePosition(); + int result = queue.poll(); + queue.add(result); + return result; + } + + public boolean empty() { + return queue.isEmpty(); + } + + public void rePosition(){ + int size = queue.size(); + size--; + while(size-->0) + queue.add(queue.poll()); + } +} ``` Python: From d2811139ae718d265b37653ae9ebfd4f07701c9d Mon Sep 17 00:00:00 2001 From: Jeremy Feng <44312563+jeremy-feng@users.noreply.github.com> Date: Fri, 31 Mar 2023 00:35:33 +0800 Subject: [PATCH 1619/3019] =?UTF-8?q?Update=20=E8=83=8C=E5=8C=85=E9=97=AE?= =?UTF-8?q?=E9=A2=98=E7=90=86=E8=AE=BA=E5=9F=BA=E7=A1=80=E5=AE=8C=E5=85=A8?= =?UTF-8?q?=E8=83=8C=E5=8C=85.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修改错别字 --- ...\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" index d0b2ce0b8c..f80d467138 100644 --- "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" +++ "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" @@ -41,7 +41,7 @@ * [动态规划:关于01背包问题,你该了解这些!](https://programmercarl.com/背包理论基础01背包-1.html) * [动态规划:关于01背包问题,你该了解这些!(滚动数组)](https://programmercarl.com/背包理论基础01背包-2.html) -首先在回顾一下01背包的核心代码 +首先再回顾一下01背包的核心代码 ```cpp for(int i = 0; i < weight.size(); i++) { // 遍历物品 for(int j = bagWeight; j >= weight[i]; j--) { // 遍历背包容量 From 96502b5f09b432ebb87f126fb56db83a5504abb4 Mon Sep 17 00:00:00 2001 From: Jeremy Feng <44312563+jeremy-feng@users.noreply.github.com> Date: Fri, 31 Mar 2023 00:39:08 +0800 Subject: [PATCH 1620/3019] =?UTF-8?q?Update=20=E8=83=8C=E5=8C=85=E9=97=AE?= =?UTF-8?q?=E9=A2=98=E7=90=86=E8=AE=BA=E5=9F=BA=E7=A1=80=E5=AE=8C=E5=85=A8?= =?UTF-8?q?=E8=83=8C=E5=8C=85.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修改错别字 --- ...\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" index f80d467138..e927aa2061 100644 --- "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" +++ "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" @@ -173,7 +173,7 @@ int main() { 别急,下一篇就是了!哈哈 -最后,**又可以出一道面试题了,就是纯完全背包,要求先用二维dp数组实现,然后再用一维dp数组实现,最后在问,两个for循环的先后是否可以颠倒?为什么?** +最后,**又可以出一道面试题了,就是纯完全背包,要求先用二维dp数组实现,然后再用一维dp数组实现,最后再问,两个for循环的先后是否可以颠倒?为什么?** 这个简单的完全背包问题,估计就可以难住不少候选人了。 From f7988e06dc26ffb93d93f41c8454b4d4504f5828 Mon Sep 17 00:00:00 2001 From: ayao98 <91120769+ayao98@users.noreply.github.com> Date: Fri, 31 Mar 2023 15:50:58 +0800 Subject: [PATCH 1621/3019] =?UTF-8?q?Update=200104.=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=A0=91=E7=9A=84=E6=9C=80=E5=A4=A7=E6=B7=B1=E5=BA=A6.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit c++语言部分,函数名和节点命名大小写有错误 --- ...00\345\244\247\346\267\261\345\272\246.md" | 34 +++++++++---------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git "a/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" "b/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" index b95e39c864..36578fd343 100644 --- "a/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" +++ "b/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" @@ -50,7 +50,7 @@ 代码如下: ```CPP -int getdepth(treenode* node) +int getdepth(TreeNode* node) ``` 2. 确定终止条件:如果为空节点的话,就返回0,表示高度为0。 @@ -76,14 +76,14 @@ return depth; ```CPP class solution { public: - int getdepth(treenode* node) { + int getdepth(TreeNode* node) { if (node == NULL) return 0; int leftdepth = getdepth(node->left); // 左 int rightdepth = getdepth(node->right); // 右 int depth = 1 + max(leftdepth, rightdepth); // 中 return depth; } - int maxdepth(treenode* root) { + int maxDepth(TreeNode* root) { return getdepth(root); } }; @@ -93,9 +93,9 @@ public: ```CPP class solution { public: - int maxdepth(treenode* root) { + int maxDepth(TreeNode* root) { if (root == null) return 0; - return 1 + max(maxdepth(root->left), maxdepth(root->right)); + return 1 + max(maxDepth(root->left), maxDepth(root->right)); } }; @@ -110,7 +110,7 @@ public: class solution { public: int result; - void getdepth(treenode* node, int depth) { + void getdepth(TreeNode* node, int depth) { result = depth > result ? depth : result; // 中 if (node->left == NULL && node->right == NULL) return ; @@ -127,7 +127,7 @@ public: } return ; } - int maxdepth(treenode* root) { + int maxDepth(TreeNode* root) { result = 0; if (root == NULL) return result; getdepth(root, 1); @@ -144,7 +144,7 @@ public: class solution { public: int result; - void getdepth(treenode* node, int depth) { + void getdepth(TreeNode* node, int depth) { result = depth > result ? depth : result; // 中 if (node->left == NULL && node->right == NULL) return ; if (node->left) { // 左 @@ -155,7 +155,7 @@ public: } return ; } - int maxdepth(treenode* root) { + int maxDepth(TreeNode* root) { result = 0; if (root == 0) return result; getdepth(root, 1); @@ -182,16 +182,16 @@ c++代码如下: ```CPP class solution { public: - int maxdepth(treenode* root) { + int maxDepth(TreeNode* root) { if (root == NULL) return 0; int depth = 0; - queue que; + queue que; que.push(root); while(!que.empty()) { int size = que.size(); depth++; // 记录深度 for (int i = 0; i < size; i++) { - treenode* node = que.front(); + TreeNode* node = que.front(); que.pop(); if (node->left) que.push(node->left); if (node->right) que.push(node->right); @@ -230,11 +230,11 @@ c++代码: ```CPP class solution { public: - int maxdepth(node* root) { + int maxDepth(Node* root) { if (root == 0) return 0; int depth = 0; for (int i = 0; i < root->children.size(); i++) { - depth = max (depth, maxdepth(root->children[i])); + depth = max (depth, maxDepth(root->children[i])); } return depth + 1; } @@ -247,15 +247,15 @@ public: ```CPP class solution { public: - int maxdepth(node* root) { - queue que; + int maxDepth(Node* root) { + queue que; if (root != NULL) que.push(root); int depth = 0; while (!que.empty()) { int size = que.size(); depth++; // 记录深度 for (int i = 0; i < size; i++) { - node* node = que.front(); + Node* node = que.front(); que.pop(); for (int j = 0; j < node->children.size(); j++) { if (node->children[j]) que.push(node->children[j]); From 6af02057b674d64c19c733c490ae9090e30e498e Mon Sep 17 00:00:00 2001 From: fw_qaq Date: Fri, 31 Mar 2023 18:04:59 +0800 Subject: [PATCH 1622/3019] =?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 --- ...7\215\345\217\240\345\214\272\351\227\264.md" | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git "a/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" "b/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" index 02db203414..37ef819d5b 100644 --- "a/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" +++ "b/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" @@ -399,18 +399,20 @@ object Solution { ```Rust impl Solution { pub fn erase_overlap_intervals(intervals: Vec>) -> i32 { - if intervals.len() == 0 { return 0; } - let mut intervals = intervals; - intervals.sort_by(|a, b| a[1].cmp(&b[1])); + if intervals.is_empty() { + return 0; + } + intervals.sort_by_key(|interval| interval[1]); let mut count = 1; let mut end = intervals[0][1]; - for i in 1..intervals.len() { - if end <= intervals[i][0] { - end = intervals[i][1]; + for v in intervals.iter().skip(1) { + if end <= v[0] { + end = v[1]; count += 1; } } - intervals.len() as i32 - count + + (intervals.len() - count) as i32 } } ``` From 2208d96581e13b19e4d41610f259b04ad3a75856 Mon Sep 17 00:00:00 2001 From: fw_qaq Date: Fri, 31 Mar 2023 18:37:51 +0800 Subject: [PATCH 1623/3019] =?UTF-8?q?Update=200763.=E5=88=92=E5=88=86?= =?UTF-8?q?=E5=AD=97=E6=AF=8D=E5=8C=BA=E9=97=B4.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...27\346\257\215\345\214\272\351\227\264.md" | 24 +++++++------------ 1 file changed, 9 insertions(+), 15 deletions(-) diff --git "a/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" "b/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" index ad680ef92d..fbcafdc8cb 100644 --- "a/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" +++ "b/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" @@ -412,28 +412,22 @@ object Solution { ### Rust ```Rust -use std::collections::HashMap; impl Solution { - fn max (a: usize, b: usize) -> usize { - if a > b { a } else { b } - } pub fn partition_labels(s: String) -> Vec { - let s = s.chars().collect::>(); - let mut hash: HashMap = HashMap::new(); - for i in 0..s.len() { - hash.insert(s[i], i); + let mut hash = vec![0; 26]; + for (i, &c) in s.as_bytes().iter().enumerate() { + hash[(c - b'a') as usize] = i; } - let mut result: Vec = Vec::new(); - let mut left: usize = 0; - let mut right: usize = 0; - for i in 0..s.len() { - right = Self::max(right, hash[&s[i]]); + let mut res = vec![]; + let (mut left, mut right) = (0, 0); + for (i, &c) in s.as_bytes().iter().enumerate() { + right = right.max(hash[(c - b'a') as usize]); if i == right { - result.push((right - left + 1) as i32); + res.push((right - left + 1) as i32); left = i + 1; } } - result + res } } ``` From 24d59de1c0ef5580b122516404ea5b5bdd9c0d44 Mon Sep 17 00:00:00 2001 From: GODVvVZzz <2662446324@qq.com> Date: Fri, 31 Mar 2023 20:59:03 +0800 Subject: [PATCH 1624/3019] =?UTF-8?q?Modify=20376=E6=91=86=E5=8A=A8?= =?UTF-8?q?=E5=BA=8F=E5=88=97.md=20=E9=94=99=E5=88=AB=E5=AD=97-=E6=9E=9C->?= =?UTF-8?q?=E4=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git "a/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" "b/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" index 469c19fd8d..ff388b5579 100644 --- "a/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" +++ "b/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" @@ -89,7 +89,7 @@ ### 情况二:数组首尾两端 -所以本题统计峰值的时候,数组最左面和最右面如果统计呢? +所以本题统计峰值的时候,数组最左面和最右面如何统计呢? 题目中说了,如果只有两个不同的元素,那摆动序列也是 2。 @@ -655,3 +655,4 @@ object Solution { + From 7e80792a63f6d0b63745f2bb5c401b1a749afc1a Mon Sep 17 00:00:00 2001 From: YuZou Date: Fri, 31 Mar 2023 22:20:36 +0800 Subject: [PATCH 1625/3019] =?UTF-8?q?update=200045.=E8=B7=B3=E8=B7=83?= =?UTF-8?q?=E6=B8=B8=E6=88=8FII.md=20=E4=BF=AE=E6=94=B9=E7=AE=97=E6=B3=95?= =?UTF-8?q?=E9=87=8D=E5=A4=8D=E8=AF=AD=E4=B9=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\350\267\263\350\267\203\346\270\270\346\210\217II.md" | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git "a/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" "b/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" index c6e4e9b5b5..2f6e8b6728 100644 --- "a/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" +++ "b/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" @@ -76,11 +76,9 @@ public: for (int i = 0; i < nums.size(); i++) { nextDistance = max(nums[i] + i, nextDistance); // 更新下一步覆盖最远距离下标 if (i == curDistance) { // 遇到当前覆盖最远距离下标 - if (curDistance < nums.size() - 1) { // 如果当前覆盖最远距离下标不是终点 - ans++; // 需要走下一步 - curDistance = nextDistance; // 更新当前覆盖最远距离下标(相当于加油了) - if (nextDistance >= nums.size() - 1) break; // 下一步的覆盖范围已经可以达到终点,结束循环 - } else break; // 当前覆盖最远距到达集合终点,不用做ans++操作了,直接结束 + ans++; // 需要走下一步 + curDistance = nextDistance; // 更新当前覆盖最远距离下标(相当于加油了) + if (nextDistance >= nums.size() - 1) break; // 当前覆盖最远距到达集合终点,不用做ans++操作了,直接结束 } } return ans; From 6943358d8f75b4c189bcedaa5b79d5c0b0a93c2a Mon Sep 17 00:00:00 2001 From: ZerenZhang2022 <118794589+ZerenZhang2022@users.noreply.github.com> Date: Fri, 31 Mar 2023 21:58:27 -0400 Subject: [PATCH 1626/3019] =?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 迭代法 --- ...72\347\264\257\345\212\240\346\240\221.md" | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git "a/problems/0538.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md" "b/problems/0538.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md" index 29b2184059..ad5310e150 100644 --- "a/problems/0538.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md" +++ "b/problems/0538.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md" @@ -234,6 +234,26 @@ class Solution: return root ``` +**迭代** +```python +class Solution: + def convertBST(self, root: Optional[TreeNode]) -> Optional[TreeNode]: + if not root: return root + stack = [] + result = [] + cur = root + pre = 0 + while cur or stack: + if cur: + stack.append(cur) + cur = cur.right + else: + cur = stack.pop() + cur.val+= pre + pre = cur.val + cur =cur.left + return root +``` ## Go From ddda474eb4d73d894205cd5845b0c41f1b34226b Mon Sep 17 00:00:00 2001 From: fw_qaq Date: Sat, 1 Apr 2023 11:42:50 +0800 Subject: [PATCH 1627/3019] =?UTF-8?q?Update=200056.=E5=90=88=E5=B9=B6?= =?UTF-8?q?=E5=8C=BA=E9=97=B4.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...10\345\271\266\345\214\272\351\227\264.md" | 28 +++++++++---------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git "a/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" "b/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" index 17d2cc0a1b..d03a590d6a 100644 --- "a/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" +++ "b/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" @@ -280,24 +280,22 @@ object Solution { ```Rust impl Solution { - fn max(a: i32, b: i32) -> i32 { - if a > b { a } else { b } - } - - pub fn merge(intervals: Vec>) -> Vec> { - let mut intervals = intervals; - let mut result = Vec::new(); - if intervals.len() == 0 { return result; } - intervals.sort_by(|a, b| a[0].cmp(&b[0])); - result.push(intervals[0].clone()); - for i in 1..intervals.len() { - if result.last_mut().unwrap()[1] >= intervals[i][0] { - result.last_mut().unwrap()[1] = Self::max(result.last_mut().unwrap()[1], intervals[i][1]); + pub fn merge(mut intervals: Vec>) -> Vec> { + let mut res = vec![]; + if intervals.is_empty() { + return res; + } + intervals.sort_by_key(|a| a[0]); + res.push(intervals[0].clone()); + for interval in intervals.into_iter().skip(1) { + let res_last_ele = res.last_mut().unwrap(); + if res_last_ele[1] >= interval[0] { + res_last_ele[1] = interval[1].max(res_last_ele[1]); } else { - result.push(intervals[i].clone()); + res.push(interval); } } - result + res } } ``` From cd1a680c26c25e928b7a56f3e98ce8d00f7e1577 Mon Sep 17 00:00:00 2001 From: fw_qaq Date: Sat, 1 Apr 2023 12:22:37 +0800 Subject: [PATCH 1628/3019] =?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 --- ...236\347\232\204\346\225\260\345\255\227.md" | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git "a/problems/0738.\345\215\225\350\260\203\351\200\222\345\242\236\347\232\204\346\225\260\345\255\227.md" "b/problems/0738.\345\215\225\350\260\203\351\200\222\345\242\236\347\232\204\346\225\260\345\255\227.md" index f92652cd7f..1cf8a0a61e 100644 --- "a/problems/0738.\345\215\225\350\260\203\351\200\222\345\242\236\347\232\204\346\225\260\345\255\227.md" +++ "b/problems/0738.\345\215\225\350\260\203\351\200\222\345\242\236\347\232\204\346\225\260\345\255\227.md" @@ -280,18 +280,20 @@ object Solution { ```Rust impl Solution { pub fn monotone_increasing_digits(n: i32) -> i32 { - let mut str_num = n.to_string().chars().map(|x| x.to_digit(10).unwrap() as i32).collect::>(); - let mut flag = str_num.len(); - for i in (1..str_num.len()).rev() { - if str_num[i - 1] > str_num[i] { + let mut n_bytes = n.to_string().into_bytes(); + let mut flag = n_bytes.len(); + for i in (1..n_bytes.len()).rev() { + if n_bytes[i - 1] > n_bytes[i] { flag = i; - str_num[i - 1] -= 1; + n_bytes[i - 1] -= 1; } } - for i in flag..str_num.len() { - str_num[i] = 9; + for v in n_bytes.iter_mut().skip(flag) { + *v = 57; } - str_num.iter().fold(0, |acc, x| acc * 10 + x) + n_bytes + .into_iter() + .fold(0, |acc, x| acc * 10 + x as i32 - 48) } } ``` From 02f9c26f696774c9db2aa7bef4ac25f9d4b28803 Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Sat, 1 Apr 2023 12:42:01 +0800 Subject: [PATCH 1629/3019] =?UTF-8?q?updaye=200232.=E7=94=A8=E6=A0=88?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E9=98=9F=E5=88=97=EF=BC=9A=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E5=A4=8D=E6=9D=82=E5=BA=A6=E5=88=86=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...40\210\345\256\236\347\216\260\351\230\237\345\210\227.md" | 4 ++++ 1 file changed, 4 insertions(+) diff --git "a/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" "b/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" index efeb10463e..4a57ee966b 100644 --- "a/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" +++ "b/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" @@ -112,6 +112,10 @@ public: ``` +* 时间复杂度: push和empty为O(1), pop和peek为O(n) +* 空间复杂度: O(n) + + ## 拓展 可以看出peek()的实现,直接复用了pop(), 要不然,对stOut判空的逻辑又要重写一遍。 From 1b6e26be2bf4f2dd584b3b59e4781a9d79cd4b48 Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Sat, 1 Apr 2023 12:45:02 +0800 Subject: [PATCH 1630/3019] =?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=EF=BC=9A=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E5=A4=8D=E6=9D=82=E5=BA=A6=E5=88=86=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...0\237\345\210\227\345\256\236\347\216\260\346\240\210.md" | 5 +++++ 1 file changed, 5 insertions(+) diff --git "a/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" "b/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" index 16b9e47cae..bad2faec27 100644 --- "a/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" +++ "b/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" @@ -111,6 +111,8 @@ public: } }; ``` +* 时间复杂度: push为O(n),其他为O(1) +* 空间复杂度: O(n) # 优化 @@ -156,6 +158,9 @@ public: } }; ``` +* 时间复杂度: push为O(n),其他为O(1) +* 空间复杂度: O(n) + # 其他语言版本 From 916718824bd6fe521ee2164b29f71d11633828a7 Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Sat, 1 Apr 2023 12:47:36 +0800 Subject: [PATCH 1631/3019] =?UTF-8?q?update=200020.=E6=9C=89=E6=95=88?= =?UTF-8?q?=E7=9A=84=E6=8B=AC=E5=8F=B7=EF=BC=9A=E6=B7=BB=E5=8A=A0=E5=A4=8D?= =?UTF-8?q?=E6=9D=82=E5=BA=A6=E5=88=86=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" | 3 +++ 1 file changed, 3 insertions(+) diff --git "a/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" "b/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" index a25129c52a..213d61b795 100644 --- "a/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" +++ "b/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" @@ -135,6 +135,9 @@ public: }; ``` +* 时间复杂度: O(n) +* 空间复杂度: O(n) + 技巧性的东西没有固定的学习方法,还是要多看多练,自己灵活运用了。 From 2633b1a346e106e8d14ee6404f1cf50cfb83a0af Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Sat, 1 Apr 2023 12:50:29 +0800 Subject: [PATCH 1632/3019] =?UTF-8?q?update=201047.=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E5=AD=97=E7=AC=A6=E4=B8=B2=E4=B8=AD=E7=9A=84=E6=89=80=E6=9C=89?= =?UTF-8?q?=E7=9B=B8=E9=82=BB=E9=87=8D=E5=A4=8D=E9=A1=B9:=20=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E5=A4=8D=E6=9D=82=E5=BA=A6=E5=88=86=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...3\270\351\202\273\351\207\215\345\244\215\351\241\271.md" | 5 +++++ 1 file changed, 5 insertions(+) diff --git "a/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" "b/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" index 810f7292ce..694f1a92dc 100644 --- "a/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" +++ "b/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" @@ -77,6 +77,9 @@ public: } }; ``` +* 时间复杂度: O(n) +* 空间复杂度: O(n) + 当然可以拿字符串直接作为栈,这样省去了栈还要转为字符串的操作。 @@ -99,6 +102,8 @@ public: } }; ``` +* 时间复杂度: O(n) +* 空间复杂度: O(1),返回值不计空间复杂度 ## 题外话 From 6cd25d1fc5f98a02c7ef1ad52ad416c39d7357a4 Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Sat, 1 Apr 2023 12:53:40 +0800 Subject: [PATCH 1633/3019] =?UTF-8?q?update=200150.=E9=80=86=E6=B3=A2?= =?UTF-8?q?=E5=85=B0=E8=A1=A8=E8=BE=BE=E5=BC=8F=E6=B1=82=E5=80=BC:=20?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=A4=8D=E6=9D=82=E5=BA=A6=E5=88=86=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" | 3 +++ 1 file changed, 3 insertions(+) diff --git "a/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" "b/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" index f0323bc4ff..09cc4f96e3 100644 --- "a/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" +++ "b/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" @@ -113,6 +113,9 @@ public: }; ``` +* 时间复杂度: O(n) +* 空间复杂度: O(n) + ## 题外话 From 1662ac347d28f35073066dba2761cd9d0c4bcf35 Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Sat, 1 Apr 2023 12:55:37 +0800 Subject: [PATCH 1634/3019] =?UTF-8?q?update=200239.=E6=BB=91=E5=8A=A8?= =?UTF-8?q?=E7=AA=97=E5=8F=A3=E6=9C=80=E5=A4=A7=E5=80=BC=EF=BC=9A=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E5=A4=8D=E6=9D=82=E5=BA=A6=E5=88=86=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" | 3 +++ 1 file changed, 3 insertions(+) diff --git "a/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" "b/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" index 540ab5d7f5..f1c4b76ccf 100644 --- "a/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" +++ "b/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" @@ -184,6 +184,9 @@ public: } }; ``` +* 时间复杂度: O(n) +* 空间复杂度: O(k) + 再来看一下时间复杂度,使用单调队列的时间复杂度是 O(n)。 From b28ba70ee1464fbd915c5d655bd6865a7d2d66e0 Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Sat, 1 Apr 2023 12:57:24 +0800 Subject: [PATCH 1635/3019] =?UTF-8?q?update=20=200347.=E5=89=8DK=E4=B8=AA?= =?UTF-8?q?=E9=AB=98=E9=A2=91=E5=85=83=E7=B4=A0=EF=BC=9A=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E5=A4=8D=E6=9D=82=E5=BA=A6=E5=88=86=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\252\351\253\230\351\242\221\345\205\203\347\264\240.md" | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git "a/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" "b/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" index d8eabef4a5..0d268d9bdc 100644 --- "a/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" +++ "b/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" @@ -79,8 +79,6 @@ ```CPP -// 时间复杂度:O(nlogk) -// 空间复杂度:O(n) class Solution { public: // 小顶堆 @@ -120,6 +118,10 @@ public: } }; ``` + +* 时间复杂度: O(nlogk) +* 空间复杂度: O(n) + # 拓展 大家对这个比较运算在建堆时是如何应用的,为什么左大于右就会建立小顶堆,反而建立大顶堆比较困惑。 From d7d7e6c733716a7eb516dea3c8b7660e8d0ac9ce Mon Sep 17 00:00:00 2001 From: ray Date: Sat, 1 Apr 2023 20:54:58 +0800 Subject: [PATCH 1636/3019] =?UTF-8?q?=E4=BF=AE=E6=94=B9=200203.=E7=A7=BB?= =?UTF-8?q?=E9=99=A4=E9=93=BE=E8=A1=A8=E5=85=83=E7=B4=A0.md=20=E5=86=99?= =?UTF-8?q?=E6=B3=95=E6=9B=B4Python=E4=B8=80=E7=82=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...31\244\351\223\276\350\241\250\345\205\203\347\264\240.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" "b/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" index 7e3955a5ef..b52f16ea23 100644 --- "a/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" +++ "b/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" @@ -316,8 +316,8 @@ class Solution: def removeElements(self, head: ListNode, val: int) -> ListNode: dummy_head = ListNode(next=head) #添加一个虚拟节点 cur = dummy_head - while(cur.next!=None): - if(cur.next.val == val): + while cur.next: + if cur.next.val == val: cur.next = cur.next.next #删除cur.next节点 else: cur = cur.next From befa14402bbf12eb147235e190bb775a42169ba9 Mon Sep 17 00:00:00 2001 From: jyu <1025368039@qq.com> Date: Sat, 1 Apr 2023 21:45:43 +0800 Subject: [PATCH 1637/3019] =?UTF-8?q?=E5=A2=9E=E5=8A=A0151=20C=E8=AF=AD?= =?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 --- ...14\347\232\204\345\215\225\350\257\215.md" | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git "a/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" "b/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" index 1b00666546..8fa7c77c9e 100644 --- "a/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" +++ "b/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" @@ -970,6 +970,49 @@ pub fn remove_extra_spaces(s: &mut Vec) { } } ``` +C: + +```C +// 翻转字符串中指定范围的字符 +void reverse(char* s, int start, int end) { + for (int i = start, j = end; i < j; i++, j--) { + int tmp = s[i]; + s[i] = s[j]; + s[j] = tmp; + } +} + +// 删除字符串两端和中间多余的空格 +void removeExtraSpace(char* s) { + int start = 0; // 指向字符串开头的指针 + int end = strlen(s) - 1; // 指向字符串结尾的指针 + while (s[start] == ' ') start++; // 移动指针 start,直到找到第一个非空格字符 + while (s[end] == ' ') end--; // 移动指针 end,直到找到第一个非空格字符 + int slow = 0; // 指向新字符串的下一个写入位置的指针 + for (int i = start; i <= end; i++) { // 遍历整个字符串 + if (s[i] == ' ' && s[i+1] == ' ') { // 如果当前字符是空格,并且下一个字符也是空格,则跳过 + continue; + } + s[slow] = s[i]; // 否则,将当前字符复制到新字符串的 slow 位置 + slow++; // 将 slow 指针向后移动 + } + s[slow] = '\0'; // 在新字符串的末尾添加一个空字符 +} + +// 翻转字符串中的单词 +char * reverseWords(char * s){ + removeExtraSpace(s); // 先删除字符串两端和中间的多余空格 + reverse(s, 0, strlen(s) - 1); // 翻转整个字符串 + int slow = 0; // 指向每个单词的开头位置的指针 + for (int i = 0; i <= strlen(s); i++) { // 遍历整个字符串 + if (s[i] ==' ' || s[i] == '\0') { // 如果当前字符是空格或空字符,说明一个单词结束了 + reverse(s, slow, i-1); // 翻转单词 + slow = i + 1; // 将 slow 指针指向下一个单词的开头位置 + } + } + return s; // 返回处理后的字符串 +} +```

From c1f17275e5879b94e0dcbc321f9dd434068ce516 Mon Sep 17 00:00:00 2001 From: mercer5 <602502833@qq.com> Date: Sun, 2 Apr 2023 11:40:30 +0800 Subject: [PATCH 1638/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A00739=E6=AF=8F?= =?UTF-8?q?=E6=97=A5=E6=B8=A9=E5=BA=A6=20python=20=E7=B2=BE=E7=AE=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 --- ...\217\346\227\245\346\270\251\345\272\246.md" | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git "a/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" "b/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" index 263a28f40c..e521fbc6e6 100644 --- "a/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" +++ "b/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" @@ -271,6 +271,7 @@ class Solution { ``` Python: +> 未精简版本 ```python class Solution: @@ -291,6 +292,22 @@ class Solution: return answer ``` +> 精简版本 + +```python +class Solution: + def dailyTemperatures(self, temperatures: List[int]) -> List[int]: + # 单调栈 + answer = [0]*len(temperatures) + stack = [] + for i in range(len(temperatures)): + while len(stack)>0 and temperatures[i] > temperatures[stack[-1]]: + answer[stack[-1]] = i - stack[-1] + stack.pop() + stack.append(i) + return answer +``` + Go: > 暴力法 From a490e39206f4fd5d89165bbf0b38f982736e5309 Mon Sep 17 00:00:00 2001 From: mercer5 <602502833@qq.com> Date: Sun, 2 Apr 2023 11:50:29 +0800 Subject: [PATCH 1639/3019] =?UTF-8?q?=E4=BF=AE=E6=94=B90739=E6=AF=8F?= =?UTF-8?q?=E6=97=A5=E6=B8=A9=E5=BA=A6=20python=20=E7=B2=BE=E7=AE=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 --- .../0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" | 1 - 1 file changed, 1 deletion(-) diff --git "a/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" "b/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" index e521fbc6e6..749dc97235 100644 --- "a/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" +++ "b/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" @@ -297,7 +297,6 @@ class Solution: ```python class Solution: def dailyTemperatures(self, temperatures: List[int]) -> List[int]: - # 单调栈 answer = [0]*len(temperatures) stack = [] for i in range(len(temperatures)): From 34e1b0ab5ce4a839ac9bf40b9e7ceb582fd51119 Mon Sep 17 00:00:00 2001 From: ayao98 <91120769+ayao98@users.noreply.github.com> Date: Mon, 3 Apr 2023 15:48:51 +0800 Subject: [PATCH 1640/3019] =?UTF-8?q?Update=200112.=E8=B7=AF=E5=BE=84?= =?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 --- ...112.\350\267\257\345\276\204\346\200\273\345\222\214.md" | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git "a/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" "b/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" index 9b6027d1e4..5958de93e6 100644 --- "a/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" +++ "b/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" @@ -250,7 +250,7 @@ private: vector> result; vector path; // 递归函数不需要返回值,因为我们要遍历整个树 - void traversal(treenode* cur, int count) { + void traversal(TreeNode* cur, int count) { if (!cur->left && !cur->right && count == 0) { // 遇到了叶子节点且找到了和为sum的路径 result.push_back(path); return; @@ -276,10 +276,10 @@ private: } public: - vector> pathsum(treenode* root, int sum) { + vector> pathSum(TreeNode* root, int sum) { result.clear(); path.clear(); - if (root == null) return result; + if (root == NULL) return result; path.push_back(root->val); // 把根节点放进路径 traversal(root, sum - root->val); return result; From 9e27f3dd9b40dabef0afd7e085fb6dec0e745474 Mon Sep 17 00:00:00 2001 From: ZerenZhang2022 <118794589+ZerenZhang2022@users.noreply.github.com> Date: Tue, 4 Apr 2023 22:51:45 -0400 Subject: [PATCH 1641/3019] =?UTF-8?q?Update=200332.=E9=87=8D=E6=96=B0?= =?UTF-8?q?=E5=AE=89=E6=8E=92=E8=A1=8C=E7=A8=8B.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 增加: python - 使用used数组 - 神似之前几题写法 --- ...11\346\216\222\350\241\214\347\250\213.md" | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git "a/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" "b/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" index 9bd5df7aad..95e7d3ed5c 100644 --- "a/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" +++ "b/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" @@ -380,7 +380,33 @@ class Solution: backtracking("JFK") return path ``` + +python - 使用used数组 - 神似之前几题写法 +```python +class Solution: + def findItinerary(self, tickets: List[List[str]]) -> List[str]: + global used,path,results + used = [0]*len(tickets) + path = ['JFK'] + results = [] + tickets.sort() # 先排序,这样一旦找到第一个可行路径,一定是字母排序最小的 + self.backtracking(tickets,'JFK') + return results[0] + def backtracking(self,tickets,cur): + if sum(used) == len(tickets): + results.append(path[:]) + return True # 只要找到就返回 + for i in range(len(tickets)): + if tickets[i][0]==cur and used[i]==0: + used[i]=1 + path.append(tickets[i][1]) + state = self.backtracking(tickets,tickets[i][1]) + path.pop() + used[i]=0 + if state: return True # 只要找到就返回,不继续搜索了 +``` + ### GO ```go type pair struct { From 1d74967090ff2adf96d84ba7f4dbd81d0ed53e68 Mon Sep 17 00:00:00 2001 From: Logen <47022821+Logenleedev@users.noreply.github.com> Date: Thu, 6 Apr 2023 13:40:06 -0500 Subject: [PATCH 1642/3019] fix typos --- .../0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" "b/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" index 469c19fd8d..26baf2f966 100644 --- "a/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" +++ "b/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" @@ -99,7 +99,7 @@ 这里我们可以写死,就是 如果只有两个元素,且元素不同,那么结果为 2。 -不写死的话,如果和我们的判断规则结合在一起呢? +不写死的话,如何和我们的判断规则结合在一起呢? 可以假设,数组最前面还有一个数字,那这个数字应该是什么呢? From 700b5c388bb1c3cb0a0d70ee9d0e0b54d5235a6e Mon Sep 17 00:00:00 2001 From: ZerenZhang2022 <118794589+ZerenZhang2022@users.noreply.github.com> Date: Thu, 6 Apr 2023 15:48:47 -0400 Subject: [PATCH 1643/3019] =?UTF-8?q?Update=200045.=E8=B7=B3=E8=B7=83?= =?UTF-8?q?=E6=B8=B8=E6=88=8FII.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 增加python - 贪心版本三 - 类似‘55-跳跃游戏’写法 --- ...\263\350\267\203\346\270\270\346\210\217II.md" | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git "a/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" "b/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" index c6e4e9b5b5..d12664aca8 100644 --- "a/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" +++ "b/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" @@ -231,6 +231,21 @@ class Solution: step += 1 return step ``` +```python +# 贪心版本三 - 类似‘55-跳跃游戏’写法 +class Solution: + def jump(self, nums) -> int: + if len(nums)==1: return 0 + i = 0 + count = 0 + cover = 0 + while i<=cover: + for i in range(i,cover+1): + cover = max(nums[i]+i,cover) + if cover>=len(nums)-1: return count+1 + count+=1 + +``` ```python # 动态规划做法 From bf8c539a635ce317ab9dd9598f06ca30bdebb677 Mon Sep 17 00:00:00 2001 From: ZerenZhang2022 <118794589+ZerenZhang2022@users.noreply.github.com> Date: Thu, 6 Apr 2023 23:39:05 -0400 Subject: [PATCH 1644/3019] =?UTF-8?q?Update=200452.=E7=94=A8=E6=9C=80?= =?UTF-8?q?=E5=B0=91=E6=95=B0=E9=87=8F=E7=9A=84=E7=AE=AD=E5=BC=95=E7=88=86?= =?UTF-8?q?=E6=B0=94=E7=90=83.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 增加 python 不改变原数组 写法 --- ...4\225\347\210\206\346\260\224\347\220\203.md" | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git "a/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" "b/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" index 53eee25c77..67070ba45a 100644 --- "a/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" +++ "b/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" @@ -177,7 +177,23 @@ class Solution: points[i][1] = min(points[i - 1][1], points[i][1]) # 更新重叠气球最小右边界 return result ``` +```python +class Solution: # 不改变原数组 + def findMinArrowShots(self, points: List[List[int]]) -> int: + points.sort(key = lambda x: x[0]) + sl,sr = points[0][0],points[0][1] + count = 1 + for i in points: + if i[0]>sr: + count+=1 + sl,sr = i[0],i[1] + else: + sl = max(sl,i[0]) + sr = min(sr,i[1]) + return count + +``` ### Go ```go func findMinArrowShots(points [][]int) int { From 4b0982e681e72081752843e8df83c0ceec1b543a Mon Sep 17 00:00:00 2001 From: Liu Cheng <32453247+Falldio@users.noreply.github.com> Date: Fri, 7 Apr 2023 14:29:56 +0800 Subject: [PATCH 1645/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A00132.=E5=88=86?= =?UTF-8?q?=E5=89=B2=E5=9B=9E=E6=96=87=E4=B8=B2II=E7=9A=84Golang=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\345\233\236\346\226\207\344\270\262II.md" | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git "a/problems/0132.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262II.md" "b/problems/0132.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262II.md" index eb0e39fb5a..9b164dfbb5 100644 --- "a/problems/0132.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262II.md" +++ "b/problems/0132.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262II.md" @@ -289,7 +289,45 @@ class Solution: ## Go ```go +func minCut(s string) int { + isValid := make([][]bool, len(s)) + for i := 0; i < len(isValid); i++ { + isValid[i] = make([]bool, len(s)) + isValid[i][i] = true + } + for i := len(s) - 1; i >= 0; i-- { + for j := i + 1; j < len(s); j++ { + if s[i] == s[j] && (isValid[i + 1][j - 1] || j - i == 1) { + isValid[i][j] = true + } + } + } + dp := make([]int, len(s)) + for i := 0; i < len(s); i++ { + dp[i] = math.MaxInt + } + for i := 0; i < len(s); i++ { + if isValid[0][i] { + dp[i] = 0 + continue + } + for j := 0; j < i; j++ { + if isValid[j + 1][i] { + dp[i] = min(dp[i], dp[j] + 1) + } + } + } + return dp[len(s) - 1] +} + +func min(i, j int) int { + if i < j { + return i + } else { + return j + } +} ``` ## JavaScript From dee25873fc8f594dbc0209453399669df5fdf61a Mon Sep 17 00:00:00 2001 From: Levi <3573897471@qq.com> Date: Fri, 7 Apr 2023 17:05:31 +0800 Subject: [PATCH 1646/3019] =?UTF-8?q?=E8=A1=A5=E5=85=850111.=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?=E4=B8=AD=E7=9A=84=E5=85=B3=E4=BA=8E=E5=89=8D=E5=BA=8F=E9=81=8D?= =?UTF-8?q?=E5=8E=86=EF=BC=88=E4=B8=AD=E5=B7=A6=E5=8F=B3=EF=BC=89=E7=9A=84?= =?UTF-8?q?=E4=B8=AD=E5=A4=84=E7=90=86=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\234\200\345\260\217\346\267\261\345\272\246.md" | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git "a/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" "b/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" index de36c6f25a..47569b05c6 100644 --- "a/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" +++ "b/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" @@ -170,11 +170,14 @@ class Solution { private: int result; void getdepth(TreeNode* node, int depth) { - if (node->left == NULL && node->right == NULL) { - result = min(depth, result); + // 函数递归终止条件 + if (root == nullptr) { return; } - // 中 只不过中没有处理的逻辑 + // 中,处理逻辑:判断是不是叶子结点 + if (root -> left == nullptr && root->right == nullptr) { + res = min(res, depth); + } if (node->left) { // 左 getdepth(node->left, depth + 1); } @@ -186,7 +189,9 @@ private: public: int minDepth(TreeNode* root) { - if (root == NULL) return 0; + if (root == nullptr) { + return 0; + } result = INT_MAX; getdepth(root, 1); return result; From e68a8a379be1defd7952a0d87fcac4350363de13 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8A=B1=E6=97=A0=E7=BC=BA?= Date: Sun, 9 Apr 2023 14:54:51 +0800 Subject: [PATCH 1647/3019] =?UTF-8?q?update=20=E4=B8=8D=E5=90=8C=E8=B7=AF?= =?UTF-8?q?=E5=BE=84II.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 更正文档错别字 --- .../0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" "b/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" index 85130ab4e4..6221042038 100644 --- "a/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" +++ "b/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" @@ -135,7 +135,7 @@ for (int i = 1; i < m; i++) { ![63.不同路径II2](https://code-thinking-1253855093.file.myqcloud.com/pics/20210104114610256.png) -如果这个图看不同,建议在理解一下递归公式,然后照着文章中说的遍历顺序,自己推导一下! +如果这个图看不懂,建议再理解一下递归公式,然后照着文章中说的遍历顺序,自己推导一下! 动规五部分分析完毕,对应C++代码如下: From e1e695e78d3fbba5ebf01fe1be69c6569f9a035a Mon Sep 17 00:00:00 2001 From: fw_qaq Date: Sun, 9 Apr 2023 23:11:11 +0800 Subject: [PATCH 1648/3019] =?UTF-8?q?Update=200509.=E6=96=90=E6=B3=A2?= =?UTF-8?q?=E9=82=A3=E5=A5=91=E6=95=B0.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...42\351\202\243\345\245\221\346\225\260.md" | 32 +++++++++++-------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git "a/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" "b/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" index 08175058bb..479b36a0f8 100644 --- "a/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" +++ "b/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" @@ -347,26 +347,32 @@ int fib(int n){ ### Rust 动态规划: ```Rust -pub fn fib(n: i32) -> i32 { - let n = n as usize; - let mut dp = vec![0; 31]; - dp[1] = 1; - for i in 2..=n { - dp[i] = dp[i - 1] + dp[i - 2]; +impl Solution { + pub fn fib(n: i32) -> i32 { + if n <= 1 { + return n; + } + let n = n as usize; + let mut dp = vec![0; n + 1]; + dp[1] = 1; + for i in 2..=n { + dp[i] = dp[i - 2] + dp[i - 1]; + } + dp[n] } - dp[n] } ``` 递归实现: ```Rust -pub fn fib(n: i32) -> i32 { - //若n小于等于1,返回n - f n <= 1 { - return n; +impl Solution { + pub fn fib(n: i32) -> i32 { + if n <= 1 { + n + } else { + Self::fib(n - 1) + Self::fib(n - 2) + } } - //否则返回fib(n-1) + fib(n-2) - return fib(n - 1) + fib(n - 2); } ``` From 185f6df9d8dbad3c67724bdaa97b6fa307b5b9e1 Mon Sep 17 00:00:00 2001 From: ZerenZhang2022 <118794589+ZerenZhang2022@users.noreply.github.com> Date: Sun, 9 Apr 2023 17:25:58 -0400 Subject: [PATCH 1649/3019] =?UTF-8?q?Update=2020210204=E5=8A=A8=E8=A7=84?= =?UTF-8?q?=E5=91=A8=E6=9C=AB=E6=80=BB=E7=BB=93.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修改错别字: 原为:先遍历物品,在遍历背包 改为:先遍历物品,再遍历背包 --- ...47\204\345\221\250\346\234\253\346\200\273\347\273\223.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20210204\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20210204\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" index 9a64c1529d..fb570bd402 100644 --- "a/problems/\345\221\250\346\200\273\347\273\223/20210204\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" +++ "b/problems/\345\221\250\346\200\273\347\273\223/20210204\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" @@ -146,7 +146,7 @@ public: **这也体现了刷题顺序的重要性**。 -先遍历背包,在遍历物品: +先遍历背包,再遍历物品: ```CPP // 版本一 @@ -165,7 +165,7 @@ public: }; ``` -先遍历物品,在遍历背包: +先遍历物品,再遍历背包: ```CPP // 版本二 From 2be03e614ddaa09b11b7bae3de7fddd99b959a92 Mon Sep 17 00:00:00 2001 From: ZerenZhang2022 <118794589+ZerenZhang2022@users.noreply.github.com> Date: Sun, 9 Apr 2023 18:07:43 -0400 Subject: [PATCH 1650/3019] =?UTF-8?q?Update=200139.=E5=8D=95=E8=AF=8D?= =?UTF-8?q?=E6=8B=86=E5=88=86.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 增加:python - 和视频中写法一致(和最上面C++写法一致) --- ...5\215\225\350\257\215\346\213\206\345\210\206.md" | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git "a/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" "b/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" index edb2c65ad6..230942ef02 100644 --- "a/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" +++ "b/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" @@ -351,7 +351,17 @@ class Solution: dp[j] = dp[j] or (dp[j - len(word)] and word == s[j - len(word):j]) return dp[len(s)] ``` - +```python +class Solution: # 和视频中写法一致(和最上面C++写法一致) + def wordBreak(self, s: str, wordDict: List[str]) -> bool: + dp = [False]*(len(s)+1) + dp[0]=True + for j in range(1,len(s)+1): + for i in range(j): + word = s[i:j] + if word in wordDict and dp[i]: dp[j]=True + return dp[-1] +``` From 962744515d4e67a417dc0f87ffda90710b974a76 Mon Sep 17 00:00:00 2001 From: "435962415@qq.com" Date: Mon, 10 Apr 2023 11:59:08 +0800 Subject: [PATCH 1651/3019] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BA=860188.?= =?UTF-8?q?=E4=B9=B0=E5=8D=96=E8=82=A1=E7=A5=A8=E7=9A=84=E6=9C=80=E4=BD=B3?= =?UTF-8?q?=E6=97=B6=E6=9C=BAIV=E7=9A=84=E8=A7=A3=E6=B3=95=E4=BA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\344\275\263\346\227\266\346\234\272IV.md" | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git "a/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" "b/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" index 4fdd7bf40c..77d1c961ed 100644 --- "a/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" +++ "b/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" @@ -323,6 +323,42 @@ func max(a, b int) int { } ``` +版本二: 三维 dp数组 +```go +func maxProfit(k int, prices []int) int { + length := len(prices) + if length == 0 { + return 0 + } + // [天数][交易次数][是否持有股票] + // 1表示不持有/卖出, 0表示持有/买入 + dp := make([][][]int, length) + for i := 0; i < length; i++ { + dp[i] = make([][]int, k+1) + for j := 0; j <= k; j++ { + dp[i][j] = make([]int, 2) + } + } + for j := 0; j <= k; j++ { + dp[0][j][0] = -prices[0] + } + for i := 1; i < length; i++ { + for j := 1; j <= k; j++ { + dp[i][j][0] = max188(dp[i-1][j][0], dp[i-1][j-1][1]-prices[i]) + dp[i][j][1] = max188(dp[i-1][j][1], dp[i-1][j][0]+prices[i]) + } + } + return dp[length-1][k][1] +} + +func max188(a, b int) int { + if a > b { + return a + } + return b +} +``` + Javascript: ```javascript From 801e03ab3112da8e3e1666fafded4aa998836723 Mon Sep 17 00:00:00 2001 From: ZerenZhang2022 <118794589+ZerenZhang2022@users.noreply.github.com> Date: Mon, 10 Apr 2023 00:48:03 -0400 Subject: [PATCH 1652/3019] =?UTF-8?q?Update=200198.=E6=89=93=E5=AE=B6?= =?UTF-8?q?=E5=8A=AB=E8=88=8D.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 增加python - 二维dp数组写法 --- ...6\211\223\345\256\266\345\212\253\350\210\215.md" | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git "a/problems/0198.\346\211\223\345\256\266\345\212\253\350\210\215.md" "b/problems/0198.\346\211\223\345\256\266\345\212\253\350\210\215.md" index fdb2dabf5f..20e18c0870 100644 --- "a/problems/0198.\346\211\223\345\256\266\345\212\253\350\210\215.md" +++ "b/problems/0198.\346\211\223\345\256\266\345\212\253\350\210\215.md" @@ -150,7 +150,17 @@ class Solution: dp[i] = max(dp[i-2]+nums[i], dp[i-1]) return dp[-1] ``` - +```python +class Solution: # 二维dp数组写法 + def rob(self, nums: List[int]) -> int: + dp = [[0,0] for _ in range(len(nums))] + dp[0][1] = nums[0] + for i in range(1,len(nums)): + dp[i][0] = max(dp[i-1][1],dp[i-1][0]) + dp[i][1] = dp[i-1][0]+nums[i] + print(dp) + return max(dp[-1]) +``` Go: ```Go func rob(nums []int) int { From 34aabac5b93af8dcb2e56a48c8f1b9049f2a28be Mon Sep 17 00:00:00 2001 From: ZerenZhang2022 <118794589+ZerenZhang2022@users.noreply.github.com> Date: Mon, 10 Apr 2023 00:58:56 -0400 Subject: [PATCH 1653/3019] =?UTF-8?q?Update=200213.=E6=89=93=E5=AE=B6?= =?UTF-8?q?=E5=8A=AB=E8=88=8DII.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 增加python - 二维dp数组写法 --- ...\223\345\256\266\345\212\253\350\210\215II.md" | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git "a/problems/0213.\346\211\223\345\256\266\345\212\253\350\210\215II.md" "b/problems/0213.\346\211\223\345\256\266\345\212\253\350\210\215II.md" index 0627eedb23..5d315d5cd5 100644 --- "a/problems/0213.\346\211\223\345\256\266\345\212\253\350\210\215II.md" +++ "b/problems/0213.\346\211\223\345\256\266\345\212\253\350\210\215II.md" @@ -142,7 +142,20 @@ class Solution: dp[i]=max(dp[i-1],dp[i-2]+nums[i]) return dp[-1] ``` - +```python +class Solution: # 二维dp数组写法 + def rob(self, nums: List[int]) -> int: + if len(nums)<3: return max(nums) + return max(self.default(nums[:-1]),self.default(nums[1:])) + def default(self,nums): + dp = [[0,0] for _ in range(len(nums))] + dp[0][1] = nums[0] + for i in range(1,len(nums)): + dp[i][0] = max(dp[i-1]) + dp[i][1] = dp[i-1][0] + nums[i] + return max(dp[-1]) + +``` Go: ```go From abbcbe1ed0b52b7232957bf9152ad0e92104114d Mon Sep 17 00:00:00 2001 From: fw_qaq Date: Mon, 10 Apr 2023 15:28:58 +0800 Subject: [PATCH 1654/3019] =?UTF-8?q?Update=200070.=E7=88=AC=E6=A5=BC?= =?UTF-8?q?=E6=A2=AF.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...070.\347\210\254\346\245\274\346\242\257.md" | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git "a/problems/0070.\347\210\254\346\245\274\346\242\257.md" "b/problems/0070.\347\210\254\346\245\274\346\242\257.md" index a06ee91e1d..c46e3b4669 100644 --- "a/problems/0070.\347\210\254\346\245\274\346\242\257.md" +++ "b/problems/0070.\347\210\254\346\245\274\346\242\257.md" @@ -470,6 +470,23 @@ impl Solution { } ``` +dp 数组 + +```rust +impl Solution { + pub fn climb_stairs(n: i32) -> i32 { + let n = n as usize; + let mut dp = vec![0; n + 1]; + dp[0] = 1; + dp[1] = 1; + for i in 2..=n { + dp[i] = dp[i - 1] + dp[i - 2]; + } + dp[n] + } +} +``` +

From 03f037afebff9684e9d64283b1d8d5ec690e684a Mon Sep 17 00:00:00 2001 From: fw_qaq Date: Mon, 10 Apr 2023 15:36:23 +0800 Subject: [PATCH 1655/3019] =?UTF-8?q?Update=200070.=E7=88=AC=E6=A5=BC?= =?UTF-8?q?=E6=A2=AF.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0070.\347\210\254\346\245\274\346\242\257.md" | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git "a/problems/0070.\347\210\254\346\245\274\346\242\257.md" "b/problems/0070.\347\210\254\346\245\274\346\242\257.md" index c46e3b4669..793d3e67f7 100644 --- "a/problems/0070.\347\210\254\346\245\274\346\242\257.md" +++ "b/problems/0070.\347\210\254\346\245\274\346\242\257.md" @@ -454,19 +454,16 @@ public class Solution { ```rust impl Solution { pub fn climb_stairs(n: i32) -> i32 { - if n <= 2 { + if n <= 1 { return n; } - let mut a = 1; - let mut b = 2; - let mut f = 0; - for i in 2..n { + let (mut a, mut b, mut f) = (1, 1, 0); + for _ in 2..=n { f = a + b; a = b; b = f; } - return f; - } + f } ``` From dbcec85e977fce41e5459ef3d108b29abc98883b Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Tue, 11 Apr 2023 00:22:10 +0800 Subject: [PATCH 1656/3019] =?UTF-8?q?update=200455.=E5=88=86=E5=8F=91?= =?UTF-8?q?=E9=A5=BC=E5=B9=B2=EF=BC=9A=E6=B7=BB=E5=8A=A0=E5=A4=8D=E6=9D=82?= =?UTF-8?q?=E5=BA=A6=E5=88=86=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...5.\345\210\206\345\217\221\351\245\274\345\271\262.md" | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git "a/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" "b/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" index 3688b3fd95..efadb43309 100644 --- "a/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" +++ "b/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" @@ -56,8 +56,6 @@ C++代码整体如下: ```CPP // 版本一 -// 时间复杂度:O(nlogn) -// 空间复杂度:O(1) class Solution { public: int findContentChildren(vector& g, vector& s) { @@ -75,6 +73,9 @@ public: } }; ``` +* 时间复杂度:O(nlogn) +* 空间复杂度:O(1) + 从代码中可以看出我用了一个 index 来控制饼干数组的遍历,遍历饼干并没有再起一个 for 循环,而是采用自减的方式,这也是常用的技巧。 @@ -118,6 +119,9 @@ public: } }; ``` +* 时间复杂度:O(nlogn) +* 空间复杂度:O(1) + 细心的录友可以发现,这种写法,两个循环的顺序改变了,先遍历的饼干,在遍历的胃口,这是因为遍历顺序变了,我们是从小到大遍历。 From 80006ad61592e0268fd4a8857a8a8b687278c5b3 Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Tue, 11 Apr 2023 00:28:09 +0800 Subject: [PATCH 1657/3019] =?UTF-8?q?update=200053.=E6=9C=80=E5=A4=A7?= =?UTF-8?q?=E5=AD=90=E5=BA=8F=E5=92=8C=EF=BC=9A=E6=B7=BB=E5=8A=A0=E5=A4=8D?= =?UTF-8?q?=E6=9D=82=E5=BA=A6=E5=88=86=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\200\345\244\247\345\255\220\345\272\217\345\222\214.md" | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git "a/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" "b/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" index 1de68041a3..48f8be29c1 100644 --- "a/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" +++ "b/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" @@ -24,8 +24,6 @@ 暴力解法的思路,第一层 for 就是设置起始位置,第二层 for 循环遍历数组寻找最大值 -- 时间复杂度:O(n^2) -- 空间复杂度:O(1) ```CPP class Solution { @@ -44,6 +42,9 @@ public: } }; ``` +* 时间复杂度:O(n^2) +* 空间复杂度:O(1) + 以上暴力的解法 C++勉强可以过,其他语言就不确定了。 @@ -98,7 +99,6 @@ public: } }; ``` - - 时间复杂度:O(n) - 空间复杂度:O(1) From 85f54a718d022e6a3cb5883fb3d9aff5745a3362 Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Tue, 11 Apr 2023 00:30:07 +0800 Subject: [PATCH 1658/3019] =?UTF-8?q?update=20=20=200055.=E8=B7=B3?= =?UTF-8?q?=E8=B7=83=E6=B8=B8=E6=88=8F=EF=BC=9A=E6=B7=BB=E5=8A=A0=E5=A4=8D?= =?UTF-8?q?=E6=9D=82=E5=BA=A6=E5=88=86=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" | 4 ++++ 1 file changed, 4 insertions(+) diff --git "a/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" "b/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" index ce9a21ec57..c187ef8f10 100644 --- "a/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" +++ "b/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" @@ -75,6 +75,10 @@ public: }; ``` +* 时间复杂度: O(n) +* 空间复杂度: O(1) + + ## 总结 这道题目关键点在于:不用拘泥于每次究竟跳几步,而是看覆盖范围,覆盖范围内一定是可以跳过来的,不用管是怎么跳的。 From 4afa9c2a51f3745b1dc6497fd522a607f3174136 Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Tue, 11 Apr 2023 00:32:31 +0800 Subject: [PATCH 1659/3019] =?UTF-8?q?update=20=20=200045.=E8=B7=B3?= =?UTF-8?q?=E8=B7=83=E6=B8=B8=E6=88=8FII=EF=BC=9A=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E5=A4=8D=E6=9D=82=E5=BA=A6=E5=88=86=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...350\267\263\350\267\203\346\270\270\346\210\217II.md" | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git "a/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" "b/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" index c6e4e9b5b5..558b32b9d7 100644 --- "a/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" +++ "b/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" @@ -88,6 +88,10 @@ public: }; ``` +* 时间复杂度: O(n) +* 空间复杂度: O(1) + + ## 方法二 依然是贪心,思路和方法一差不多,代码可以简洁一些。 @@ -127,6 +131,11 @@ public: }; ``` +* 时间复杂度: O(n) +* 空间复杂度: O(1) + + + 可以看出版本二的代码相对于版本一简化了不少! **其精髓在于控制移动下标 i 只移动到 nums.size() - 2 的位置**,所以移动下标只要遇到当前覆盖最远距离的下标,直接步数加一,不用考虑别的了。 From 38c74c90d793b9637feceec6350e269d9e460a16 Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Tue, 11 Apr 2023 00:34:25 +0800 Subject: [PATCH 1660/3019] =?UTF-8?q?update=20=20=201005.K=E6=AC=A1?= =?UTF-8?q?=E5=8F=96=E5=8F=8D=E5=90=8E=E6=9C=80=E5=A4=A7=E5=8C=96=E7=9A=84?= =?UTF-8?q?=E6=95=B0=E7=BB=84=E5=92=8C=EF=BC=9A=E6=B7=BB=E5=8A=A0=E5=A4=8D?= =?UTF-8?q?=E6=9D=82=E5=BA=A6=E5=88=86=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...14\226\347\232\204\346\225\260\347\273\204\345\222\214.md" | 4 ++++ 1 file changed, 4 insertions(+) diff --git "a/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" "b/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" index 4a08085701..27a575c717 100644 --- "a/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" +++ "b/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" @@ -85,6 +85,10 @@ public: }; ``` +* 时间复杂度: O(nlogn) +* 空间复杂度: O(1) + + ## 总结 贪心的题目如果简单起来,会让人简单到开始怀疑:本来不就应该这么做么?这也算是算法?我认为这不是贪心? From 25bf0859a1e7b68ddfcb83456e9828244e0ee703 Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Tue, 11 Apr 2023 00:36:37 +0800 Subject: [PATCH 1661/3019] =?UTF-8?q?update=20=20=200135.=E5=88=86?= =?UTF-8?q?=E5=8F=91=E7=B3=96=E6=9E=9C=EF=BC=9A=E6=B7=BB=E5=8A=A0=E5=A4=8D?= =?UTF-8?q?=E6=9D=82=E5=BA=A6=E5=88=86=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...0135.\345\210\206\345\217\221\347\263\226\346\236\234.md" | 5 +++++ 1 file changed, 5 insertions(+) diff --git "a/problems/0135.\345\210\206\345\217\221\347\263\226\346\236\234.md" "b/problems/0135.\345\210\206\345\217\221\347\263\226\346\236\234.md" index ef79868a1a..1ba1563fb3 100644 --- "a/problems/0135.\345\210\206\345\217\221\347\263\226\346\236\234.md" +++ "b/problems/0135.\345\210\206\345\217\221\347\263\226\346\236\234.md" @@ -121,6 +121,11 @@ public: }; ``` +* 时间复杂度: O(n) +* 空间复杂度: O(n) + + + ## 总结 这在leetcode上是一道困难的题目,其难点就在于贪心的策略,如果在考虑局部的时候想两边兼顾,就会顾此失彼。 From 4c7464fa93ca388699b37935e5b56e68b1f6fed2 Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Tue, 11 Apr 2023 00:37:48 +0800 Subject: [PATCH 1662/3019] =?UTF-8?q?update=20=200860.=E6=9F=A0=E6=AA=AC?= =?UTF-8?q?=E6=B0=B4=E6=89=BE=E9=9B=B6=20=EF=BC=9A=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E5=A4=8D=E6=9D=82=E5=BA=A6=E5=88=86=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...237\240\346\252\254\346\260\264\346\211\276\351\233\266.md" | 3 +++ 1 file changed, 3 insertions(+) diff --git "a/problems/0860.\346\237\240\346\252\254\346\260\264\346\211\276\351\233\266.md" "b/problems/0860.\346\237\240\346\252\254\346\260\264\346\211\276\351\233\266.md" index cd52adb099..d96e08797b 100644 --- "a/problems/0860.\346\237\240\346\252\254\346\260\264\346\211\276\351\233\266.md" +++ "b/problems/0860.\346\237\240\346\252\254\346\260\264\346\211\276\351\233\266.md" @@ -115,6 +115,9 @@ public: } }; ``` +* 时间复杂度: O(n) +* 空间复杂度: O(1) + ## 总结 From ff77937816b26b6aa88a41fb6b1684837ca1a31d Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Tue, 11 Apr 2023 00:41:40 +0800 Subject: [PATCH 1663/3019] =?UTF-8?q?update=20=20=200056.=E5=90=88?= =?UTF-8?q?=E5=B9=B6=E5=8C=BA=E9=97=B4=EF=BC=9A=E6=B7=BB=E5=8A=A0=E5=A4=8D?= =?UTF-8?q?=E6=9D=82=E5=BA=A6=E5=88=86=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" | 4 ++++ 1 file changed, 4 insertions(+) diff --git "a/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" "b/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" index ec65910859..72dc69c57f 100644 --- "a/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" +++ "b/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" @@ -73,6 +73,10 @@ public: }; ``` +* 时间复杂度: O(nlogn) +* 空间复杂度: O(logn),排序需要的空间开销 + + ## 其他语言版本 From 528c1d4f9e9678b143706178f76d91c0de6947c4 Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Tue, 11 Apr 2023 00:49:38 +0800 Subject: [PATCH 1664/3019] =?UTF-8?q?update=20=20=200968.=E7=9B=91?= =?UTF-8?q?=E6=8E=A7=E4=BA=8C=E5=8F=89=E6=A0=91=EF=BC=9A=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E5=A4=8D=E6=9D=82=E5=BA=A6=E5=88=86=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...3\221\346\216\247\344\272\214\345\217\211\346\240\221.md" | 5 +++++ 1 file changed, 5 insertions(+) diff --git "a/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" "b/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" index 267e7f6ede..fdec56cafa 100644 --- "a/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" @@ -303,6 +303,11 @@ public: ``` +* 时间复杂度: O(n),需要遍历二叉树上的每个节点 +* 空间复杂度: O(n) + + + 大家可能会惊讶,居然可以这么简短,**其实就是在版本一的基础上,使用else把一些情况直接覆盖掉了**。 在网上关于这道题解可以搜到很多这种神级别的代码,但都没讲不清楚,如果直接看代码的话,指定越看越晕,**所以建议大家对着版本一的代码一步一步来,版本二中看不中用!**。 From 4e1590e26db6363af09e0feef0109d27d48b3958 Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Tue, 11 Apr 2023 11:14:10 +0800 Subject: [PATCH 1665/3019] =?UTF-8?q?update=20=200474.=E4=B8=80=E5=92=8C?= =?UTF-8?q?=E9=9B=B6=20=EF=BC=9A=E6=B7=BB=E5=8A=A0=E5=A4=8D=E6=9D=82?= =?UTF-8?q?=E5=BA=A6=E5=88=86=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "problems/0474.\344\270\200\345\222\214\351\233\266.md" | 5 +++++ 1 file changed, 5 insertions(+) diff --git "a/problems/0474.\344\270\200\345\222\214\351\233\266.md" "b/problems/0474.\344\270\200\345\222\214\351\233\266.md" index 8d79d701ac..6a178a254b 100644 --- "a/problems/0474.\344\270\200\345\222\214\351\233\266.md" +++ "b/problems/0474.\344\270\200\345\222\214\351\233\266.md" @@ -156,6 +156,11 @@ public: }; ``` +* 时间复杂度: O(kmn),k 为strs的长度 +* 空间复杂度: O(mn) + + + ## 总结 不少同学刷过这道题,可能没有总结这究竟是什么背包。 From f701133a9a8b418904cf02583e90d3c7fcbdd743 Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Tue, 11 Apr 2023 11:17:04 +0800 Subject: [PATCH 1666/3019] =?UTF-8?q?update=20=20=200518.=E9=9B=B6?= =?UTF-8?q?=E9=92=B1=E5=85=91=E6=8D=A2II=EF=BC=9A=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E5=A4=8D=E6=9D=82=E5=BA=A6=E5=88=86=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...18.\351\233\266\351\222\261\345\205\221\346\215\242II.md" | 5 +++++ 1 file changed, 5 insertions(+) diff --git "a/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" "b/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" index eb5a844ce4..c208754f77 100644 --- "a/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" +++ "b/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" @@ -179,6 +179,11 @@ public: } }; ``` + +* 时间复杂度: O(mn),其中 m 是amount,n 是 coins 的长度 +* 空间复杂度: O(m) + + 是不是发现代码如此精简,哈哈 ## 总结 From 6e62049cd3f06e5bf156240087d90bdfb5910569 Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Tue, 11 Apr 2023 11:20:07 +0800 Subject: [PATCH 1667/3019] =?UTF-8?q?update=20=200377.=E7=BB=84=E5=90=88?= =?UTF-8?q?=E6=80=BB=E5=92=8C=E2=85=A3=20=EF=BC=9A=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E5=A4=8D=E6=9D=82=E5=BA=A6=E5=88=86=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...3\204\345\220\210\346\200\273\345\222\214\342\205\243.md" | 5 +++++ 1 file changed, 5 insertions(+) diff --git "a/problems/0377.\347\273\204\345\220\210\346\200\273\345\222\214\342\205\243.md" "b/problems/0377.\347\273\204\345\220\210\346\200\273\345\222\214\342\205\243.md" index f228718857..ee65972371 100644 --- "a/problems/0377.\347\273\204\345\220\210\346\200\273\345\222\214\342\205\243.md" +++ "b/problems/0377.\347\273\204\345\220\210\346\200\273\345\222\214\342\205\243.md" @@ -130,6 +130,11 @@ public: ``` +* 时间复杂度: O(target * n),其中 n 为 nums 的长度 +* 空间复杂度: O(target) + + + C++测试用例有两个数相加超过int的数据,所以需要在if里加上dp[i] < INT_MAX - dp[i - num]。 但java就不用考虑这个限制,java里的int也是四个字节吧,也有可能leetcode后台对不同语言的测试数据不一样。 From 84b84e5bf11158c3ab4ac2356c8290060b7ebf45 Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Tue, 11 Apr 2023 11:46:51 +0800 Subject: [PATCH 1668/3019] =?UTF-8?q?update=20=20=200070.=E7=88=AC?= =?UTF-8?q?=E6=A5=BC=E6=A2=AF=E5=AE=8C=E5=85=A8=E8=83=8C=E5=8C=85=E7=89=88?= =?UTF-8?q?=E6=9C=AC=EF=BC=9A=E6=B7=BB=E5=8A=A0=E5=A4=8D=E6=9D=82=E5=BA=A6?= =?UTF-8?q?=E5=88=86=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...5\250\350\203\214\345\214\205\347\211\210\346\234\254.md" | 5 +++++ 1 file changed, 5 insertions(+) diff --git "a/problems/0070.\347\210\254\346\245\274\346\242\257\345\256\214\345\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md" "b/problems/0070.\347\210\254\346\245\274\346\242\257\345\256\214\345\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md" index 41c2e6162d..8f8bc9a649 100644 --- "a/problems/0070.\347\210\254\346\245\274\346\242\257\345\256\214\345\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md" +++ "b/problems/0070.\347\210\254\346\245\274\346\242\257\345\256\214\345\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md" @@ -101,6 +101,11 @@ public: }; ``` +* 时间复杂度: O(nm) +* 空间复杂度: O(n) + + + 代码中m表示最多可以爬m个台阶,代码中把m改成2就是本题70.爬楼梯可以AC的代码了。 ## 总结 From 9fef5cbd00bde88126d4407c913d4b5f448d5308 Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Tue, 11 Apr 2023 11:51:41 +0800 Subject: [PATCH 1669/3019] =?UTF-8?q?=20update=20=20=200322.=E9=9B=B6?= =?UTF-8?q?=E9=92=B1=E5=85=91=E6=8D=A2=EF=BC=9A=E6=B7=BB=E5=8A=A0=E5=A4=8D?= =?UTF-8?q?=E6=9D=82=E5=BA=A6=E5=88=86=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...22.\351\233\266\351\222\261\345\205\221\346\215\242.md" | 7 +++++++ 1 file changed, 7 insertions(+) diff --git "a/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" "b/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" index 3be72565be..0e3947dad3 100644 --- "a/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" +++ "b/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" @@ -133,6 +133,11 @@ public: }; ``` +* 时间复杂度: O(n * amount),其中 n 为 coins 的长度 +* 空间复杂度: O(amount) + + + 对于遍历方式遍历背包放在外循环,遍历物品放在内循环也是可以的,我就直接给出代码了 ```CPP @@ -154,6 +159,8 @@ public: } }; ``` +* 同上 + ## 总结 From b6fcdc160d85cd5d541c851f514e7ea332ffd4b4 Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Tue, 11 Apr 2023 11:57:47 +0800 Subject: [PATCH 1670/3019] =?UTF-8?q?=20update=20=20=200279.=E5=AE=8C?= =?UTF-8?q?=E5=85=A8=E5=B9=B3=E6=96=B9=E6=95=B0=EF=BC=9A=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E5=A4=8D=E6=9D=82=E5=BA=A6=E5=88=86=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\214\345\205\250\345\271\263\346\226\271\346\225\260.md" | 6 ++++++ 1 file changed, 6 insertions(+) diff --git "a/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" "b/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" index c329156b83..f5b23d2636 100644 --- "a/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" +++ "b/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" @@ -127,6 +127,10 @@ public: }; ``` +* 时间复杂度: O(n * √n) +* 空间复杂度: O(n) + + 同样我在给出先遍历物品,在遍历背包的代码,一样的可以AC的。 ```CPP @@ -145,6 +149,8 @@ public: } }; ``` +* 同上 + ## 总结 From ecf8251c6ad8c3524ebbe282a62a682acc91824b Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Tue, 11 Apr 2023 13:58:53 +0800 Subject: [PATCH 1671/3019] =?UTF-8?q?update=20=20=200198.=E6=89=93?= =?UTF-8?q?=E5=AE=B6=E5=8A=AB=E8=88=8D=EF=BC=9A=E6=B7=BB=E5=8A=A0=E5=A4=8D?= =?UTF-8?q?=E6=9D=82=E5=BA=A6=E5=88=86=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0198.\346\211\223\345\256\266\345\212\253\350\210\215.md" | 3 +++ 1 file changed, 3 insertions(+) diff --git "a/problems/0198.\346\211\223\345\256\266\345\212\253\350\210\215.md" "b/problems/0198.\346\211\223\345\256\266\345\212\253\350\210\215.md" index fdb2dabf5f..c25f3b8677 100644 --- "a/problems/0198.\346\211\223\345\256\266\345\212\253\350\210\215.md" +++ "b/problems/0198.\346\211\223\345\256\266\345\212\253\350\210\215.md" @@ -108,6 +108,9 @@ public: }; ``` +* 时间复杂度: O(n) +* 空间复杂度: O(n) + ## 总结 打家劫舍是DP解决的经典题目,这道题也是打家劫舍入门级题目,后面我们还会变种方式来打劫的。 From 6754a955688dd80870593da89fa26d889074e748 Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Tue, 11 Apr 2023 14:00:01 +0800 Subject: [PATCH 1672/3019] =?UTF-8?q?update=20=200213.=E6=89=93=E5=AE=B6?= =?UTF-8?q?=E5=8A=AB=E8=88=8DII=20=EF=BC=9A=E6=B7=BB=E5=8A=A0=E5=A4=8D?= =?UTF-8?q?=E6=9D=82=E5=BA=A6=E5=88=86=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...13.\346\211\223\345\256\266\345\212\253\350\210\215II.md" | 5 +++++ 1 file changed, 5 insertions(+) diff --git "a/problems/0213.\346\211\223\345\256\266\345\212\253\350\210\215II.md" "b/problems/0213.\346\211\223\345\256\266\345\212\253\350\210\215II.md" index 0627eedb23..becad06920 100644 --- "a/problems/0213.\346\211\223\345\256\266\345\212\253\350\210\215II.md" +++ "b/problems/0213.\346\211\223\345\256\266\345\212\253\350\210\215II.md" @@ -82,6 +82,11 @@ public: }; ``` +* 时间复杂度: O(n) +* 空间复杂度: O(n) + + + ## 总结 成环之后还是难了一些的, 不少题解没有把“考虑房间”和“偷房间”说清楚。 From 56b35274356fe0cecda151e5d1aa77a9f8b750b3 Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Tue, 11 Apr 2023 14:07:01 +0800 Subject: [PATCH 1673/3019] =?UTF-8?q?update=20=200188.=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?IV=20=EF=BC=9A=E6=B7=BB=E5=8A=A0=E5=A4=8D=E6=9D=82=E5=BA=A6?= =?UTF-8?q?=E5=88=86=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" | 5 +++++ 1 file changed, 5 insertions(+) diff --git "a/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" "b/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" index 4fdd7bf40c..f6744a2b36 100644 --- "a/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" +++ "b/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" @@ -156,6 +156,11 @@ public: }; ``` +* 时间复杂度: O(n * k),其中 n 为 prices 的长度 +* 空间复杂度: O(n * k) + + + 当然有的解法是定义一个三维数组dp[i][j][k],第i天,第j次买卖,k表示买还是卖的状态,从定义上来讲是比较直观。 但感觉三维数组操作起来有些麻烦,我是直接用二维数组来模拟三维数组的情况,代码看起来也清爽一些。 From 5bc0fa5c96684068bec235ca353e297b199f5414 Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Tue, 11 Apr 2023 14:08:42 +0800 Subject: [PATCH 1674/3019] =?UTF-8?q?=20update=20=20=200300.=E6=9C=80?= =?UTF-8?q?=E9=95=BF=E4=B8=8A=E5=8D=87=E5=AD=90=E5=BA=8F=E5=88=97=EF=BC=9A?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=A4=8D=E6=9D=82=E5=BA=A6=E5=88=86=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...70\212\345\215\207\345\255\220\345\272\217\345\210\227.md" | 4 ++++ 1 file changed, 4 insertions(+) diff --git "a/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" "b/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" index 478837cc1b..e8cb0b5f18 100644 --- "a/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" @@ -106,6 +106,10 @@ public: } }; ``` +* 时间复杂度: O(n^2) +* 空间复杂度: O(n) + + ## 总结 From 1ed179e233bc18574a3f4e7b46cbbed9ab686667 Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Tue, 11 Apr 2023 14:11:04 +0800 Subject: [PATCH 1675/3019] =?UTF-8?q?update=20=20=201143.=E6=9C=80?= =?UTF-8?q?=E9=95=BF=E5=85=AC=E5=85=B1=E5=AD=90=E5=BA=8F=E5=88=97=EF=BC=9A?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=A4=8D=E6=9D=82=E5=BA=A6=E5=88=86=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...05\254\345\205\261\345\255\220\345\272\217\345\210\227.md" | 4 ++++ 1 file changed, 4 insertions(+) diff --git "a/problems/1143.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" "b/problems/1143.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" index 8e5f7eb252..730e9ad1f7 100644 --- "a/problems/1143.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/1143.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" @@ -124,6 +124,10 @@ public: } }; ``` +* 时间复杂度: O(n * m),其中 n 和 m 分别为 text1 和 text2 的长度 +* 空间复杂度: O(n * m) + + ## 其他语言版本 From 4ded4b5c820f3098ab54a3dbd6cda23e0c5e70ff Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Tue, 11 Apr 2023 14:12:41 +0800 Subject: [PATCH 1676/3019] =?UTF-8?q?update=20=20=201035.=E4=B8=8D?= =?UTF-8?q?=E7=9B=B8=E4=BA=A4=E7=9A=84=E7=BA=BF=EF=BC=9A=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E5=A4=8D=E6=9D=82=E5=BA=A6=E5=88=86=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...70\215\347\233\270\344\272\244\347\232\204\347\272\277.md" | 4 ++++ 1 file changed, 4 insertions(+) diff --git "a/problems/1035.\344\270\215\347\233\270\344\272\244\347\232\204\347\272\277.md" "b/problems/1035.\344\270\215\347\233\270\344\272\244\347\232\204\347\272\277.md" index d1e1e30a8c..7b60abdda3 100644 --- "a/problems/1035.\344\270\215\347\233\270\344\272\244\347\232\204\347\272\277.md" +++ "b/problems/1035.\344\270\215\347\233\270\344\272\244\347\232\204\347\272\277.md" @@ -62,6 +62,10 @@ public: } }; ``` +* 时间复杂度: O(n * m) +* 空间复杂度: O(n * m) + + ## 总结 From f579a9f82e89f18338b7af64f94e76a63fa7f96d Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Tue, 11 Apr 2023 14:14:03 +0800 Subject: [PATCH 1677/3019] =?UTF-8?q?update=20=20=200115.=E4=B8=8D?= =?UTF-8?q?=E5=90=8C=E7=9A=84=E5=AD=90=E5=BA=8F=E5=88=97=EF=BC=9A=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E5=A4=8D=E6=9D=82=E5=BA=A6=E5=88=86=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...0\214\347\232\204\345\255\220\345\272\217\345\210\227.md" | 5 +++++ 1 file changed, 5 insertions(+) diff --git "a/problems/0115.\344\270\215\345\220\214\347\232\204\345\255\220\345\272\217\345\210\227.md" "b/problems/0115.\344\270\215\345\220\214\347\232\204\345\255\220\345\272\217\345\210\227.md" index daa708bc84..6127f19045 100644 --- "a/problems/0115.\344\270\215\345\220\214\347\232\204\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0115.\344\270\215\345\220\214\347\232\204\345\255\220\345\272\217\345\210\227.md" @@ -149,6 +149,11 @@ public: }; ``` +* 时间复杂度: O(n * m) +* 空间复杂度: O(n * m) + + + ## 其他语言版本 From 7d6476c16a421ef03c56ee101e1fd16b1d47ea9c Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Tue, 11 Apr 2023 14:15:40 +0800 Subject: [PATCH 1678/3019] =?UTF-8?q?update=20=200583.=E4=B8=A4=E4=B8=AA?= =?UTF-8?q?=E5=AD=97=E7=AC=A6=E4=B8=B2=E7=9A=84=E5=88=A0=E9=99=A4=E6=93=8D?= =?UTF-8?q?=E4=BD=9C=20=EF=BC=9A=E6=B7=BB=E5=8A=A0=E5=A4=8D=E6=9D=82?= =?UTF-8?q?=E5=BA=A6=E5=88=86=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...04\345\210\240\351\231\244\346\223\215\344\275\234.md" | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git "a/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" "b/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" index eb046a9d04..561ad2f238 100644 --- "a/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" +++ "b/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" @@ -104,6 +104,10 @@ public: }; ``` +* 时间复杂度: O(n * m) +* 空间复杂度: O(n * m) + + ### 动态规划二 @@ -127,6 +131,10 @@ public: }; ``` +* 时间复杂度: O(n * m) +* 空间复杂度: O(n * m) + + ## 其他语言版本 From 541ac6ef3cfe7da2312df2cedf9df63edce2b325 Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Tue, 11 Apr 2023 14:16:43 +0800 Subject: [PATCH 1679/3019] =?UTF-8?q?update=20=20=200072.=E7=BC=96?= =?UTF-8?q?=E8=BE=91=E8=B7=9D=E7=A6=BB=EF=BC=9A=E6=B7=BB=E5=8A=A0=E5=A4=8D?= =?UTF-8?q?=E6=9D=82=E5=BA=A6=E5=88=86=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0072.\347\274\226\350\276\221\350\267\235\347\246\273.md" | 4 ++++ 1 file changed, 4 insertions(+) diff --git "a/problems/0072.\347\274\226\350\276\221\350\267\235\347\246\273.md" "b/problems/0072.\347\274\226\350\276\221\350\267\235\347\246\273.md" index 0b49e3c656..cc4ab00cdc 100644 --- "a/problems/0072.\347\274\226\350\276\221\350\267\235\347\246\273.md" +++ "b/problems/0072.\347\274\226\350\276\221\350\267\235\347\246\273.md" @@ -218,6 +218,10 @@ public: } }; ``` +* 时间复杂度: O(n * m) +* 空间复杂度: O(n * m) + + ## 其他语言版本 From a26fe0fdf4559c535ac3f04d4e43e87b86b01196 Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Tue, 11 Apr 2023 14:17:50 +0800 Subject: [PATCH 1680/3019] =?UTF-8?q?update=20=200516.=E6=9C=80=E9=95=BF?= =?UTF-8?q?=E5=9B=9E=E6=96=87=E5=AD=90=E5=BA=8F=E5=88=97=20=EF=BC=9A?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=A4=8D=E6=9D=82=E5=BA=A6=E5=88=86=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...3\236\346\226\207\345\255\220\345\272\217\345\210\227.md" | 5 +++++ 1 file changed, 5 insertions(+) diff --git "a/problems/0516.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\345\272\217\345\210\227.md" "b/problems/0516.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\345\272\217\345\210\227.md" index d28a33ccd0..fcdd57b0f4 100644 --- "a/problems/0516.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0516.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\345\272\217\345\210\227.md" @@ -144,6 +144,11 @@ public: } }; ``` +* 时间复杂度: O(n^2) +* 空间复杂度: O(n^2) + + + ## 其他语言版本 From 8f58ab445a4f7a50a0a9d3ab9c2041dba0c1f2d9 Mon Sep 17 00:00:00 2001 From: Erincrying <1016158928@qq.com> Date: Tue, 11 Apr 2023 20:20:33 +0800 Subject: [PATCH 1681/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0242.=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?=EF=BC=8Cjs=E6=96=B9=E6=B3=95=EF=BC=8C=E9=87=87=E7=94=A8map?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\257\215\345\274\202\344\275\215\350\257\215.md" | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git "a/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" "b/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" index 1006ea3552..ba802bbdbb 100644 --- "a/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" +++ "b/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" @@ -205,6 +205,19 @@ var isAnagram = function(s, t) { } return true; }; + +var isAnagram = function(s, t) { + if(s.length !== t.length) return false; + let char_count = new Map(); + for(let item of s) { + char_count.set(item, (char_count.get(item) || 0) + 1) ; + } + for(let item of t) { + if(!char_count.get(item)) return false; + char_count.set(item, char_count.get(item)-1); + } + return true; +}; ``` TypeScript: From eef44eb9e82c6f8c605e4e2575a3200dafe0014d Mon Sep 17 00:00:00 2001 From: Erincrying <1016158928@qq.com> Date: Tue, 11 Apr 2023 21:26:44 +0800 Subject: [PATCH 1682/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B01002.=20=E6=9F=A5?= =?UTF-8?q?=E6=89=BE=E5=B8=B8=E7=94=A8=E5=AD=97=E7=AC=A6=EF=BC=8Cjs?= =?UTF-8?q?=E6=96=B9=E6=B3=95=E9=87=87=E7=94=A8map?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...70\347\224\250\345\255\227\347\254\246.md" | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git "a/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md" "b/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md" index fd18866029..9ec3c6c4e8 100644 --- "a/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md" +++ "b/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md" @@ -252,6 +252,36 @@ var commonChars = function (words) { } return res }; + +// 方法二:map() +var commonChars = function(words) { + let min_count = new Map() + // 统计字符串中字符出现的最小频率,以第一个字符串初始化 + for(let str of words[0]) { + min_count.set(str, ((min_count.get(str) || 0) + 1)) + } + // 从第二个单词开始统计字符出现次数 + for(let i = 1; i < words.length; i++) { + let char_count = new Map() + for(let str of words[i]) { // 遍历字母 + char_count.set(str, (char_count.get(str) || 0) + 1) + } + // 比较出最小的字符次数 + for(let value of min_count) { // 注意这里遍历min_count!而不是单词 + min_count.set(value[0], Math.min((min_count.get(value[0]) || 0), (char_count.get(value[0]) || 0))) + } + } + // 遍历map + let res = [] + min_count.forEach((value, key) => { + if(value) { + for(let i=0; i Date: Thu, 13 Apr 2023 12:20:18 +0800 Subject: [PATCH 1683/3019] =?UTF-8?q?Update=200746.=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=E6=9C=80=E5=B0=8F=E8=8A=B1=E8=B4=B9=E7=88=AC=E6=A5=BC=E6=A2=AF?= =?UTF-8?q?.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...71\347\210\254\346\245\274\346\242\257.md" | 28 +++++++++++++------ 1 file changed, 20 insertions(+), 8 deletions(-) diff --git "a/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" "b/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" index d7258d4576..98a58c1256 100644 --- "a/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" +++ "b/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" @@ -351,17 +351,29 @@ function minCostClimbingStairs(cost: number[]): number { ### Rust ```Rust -use std::cmp::min; impl Solution { pub fn min_cost_climbing_stairs(cost: Vec) -> i32 { - let len = cost.len(); - let mut dp = vec![0; len]; - dp[0] = cost[0]; - dp[1] = cost[1]; - for i in 2..len { - dp[i] = min(dp[i-1], dp[i-2]) + cost[i]; + let mut dp = vec![0; cost.len() + 1]; + for i in 2..=cost.len() { + dp[i] = (dp[i - 1] + cost[i - 1]).min(dp[i - 2] + cost[i - 2]); + } + dp[cost.len()] + } +} +``` + +不使用 dp 数组 + +```rust +impl Solution { + pub fn min_cost_climbing_stairs(cost: Vec) -> i32 { + let (mut dp_before, mut dp_after) = (0, 0); + for i in 2..=cost.len() { + let dpi = (dp_before + cost[i - 2]).min(dp_after + cost[i - 1]); + dp_before = dp_after; + dp_after = dpi; } - min(dp[len-1], dp[len-2]) + dp_after } } ``` From e9c4d54f537a1c42f71b5651bfc4baa0cd1a51e8 Mon Sep 17 00:00:00 2001 From: fw_qaq Date: Thu, 13 Apr 2023 12:28:51 +0800 Subject: [PATCH 1684/3019] =?UTF-8?q?Update=200746.=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=E6=9C=80=E5=B0=8F=E8=8A=B1=E8=B4=B9=E7=88=AC=E6=A5=BC=E6=A2=AF?= =?UTF-8?q?.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...71\347\210\254\346\245\274\346\242\257.md" | 37 +++++++++++-------- 1 file changed, 21 insertions(+), 16 deletions(-) diff --git "a/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" "b/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" index 98a58c1256..3d01485874 100644 --- "a/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" +++ "b/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" @@ -330,22 +330,27 @@ var minCostClimbingStairs = function(cost) { ```typescript function minCostClimbingStairs(cost: number[]): number { - /** - dp[i]: 走到第i阶需要花费的最少金钱 - dp[0]: 0; - dp[1]: 0; - ... - dp[i]: min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]); - */ - const dp = []; - const length = cost.length; - dp[0] = 0; - dp[1] = 0; - for (let i = 2; i <= length; i++) { - dp[i] = Math.min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]); - } - return dp[length]; -}; + const dp = [0, 0] + for (let i = 2; i <= cost.length; i++) { + dp[i] = Math.min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]) + } + return dp[cost.length] +} +``` + +不使用 dp 数组 + +```typescript +function minCostClimbingStairs(cost: number[]): number { + let dp_before = 0, + dp_after = 0 + for (let i = 2; i <= cost.length; i++) { + let dpi = Math.min(dp_before + cost[i - 2], dp_after + cost[i - 1]) + dp_before = dp_after + dp_after = dpi + } + return dp_after +} ``` ### Rust From 1ad26f69cdffc20bec0c95669e929dab0f7d3b2c Mon Sep 17 00:00:00 2001 From: fw_qaq Date: Thu, 13 Apr 2023 12:37:03 +0800 Subject: [PATCH 1685/3019] =?UTF-8?q?Update=200746.=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=E6=9C=80=E5=B0=8F=E8=8A=B1=E8=B4=B9=E7=88=AC=E6=A5=BC=E6=A2=AF?= =?UTF-8?q?.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...71\347\210\254\346\245\274\346\242\257.md" | 41 ++++++++++++------- 1 file changed, 27 insertions(+), 14 deletions(-) diff --git "a/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" "b/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" index 3d01485874..fb5261f321 100644 --- "a/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" +++ "b/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" @@ -312,17 +312,30 @@ func min(a, b int) int { ``` -### Javascript +### JavaScript + ```Javascript var minCostClimbingStairs = function(cost) { - const n = cost.length; - const dp = new Array(n + 1); - dp[0] = dp[1] = 0; - for (let i = 2; i <= n; ++i) { - dp[i] = Math.min(dp[i -1] + cost[i - 1], dp[i - 2] + cost[i - 2]) + const dp = [0, 0] + for (let i = 2; i <= cost.length; ++i) { + dp[i] = Math.min(dp[i -1] + cost[i - 1], dp[i - 2] + cost[i - 2]) + } + return dp[cost.length] +}; +``` + +不使用 dp 数组 + +```JavaScript +var minCostClimbingStairs = function(cost) { + let dpBefore = 0, + dpAfter = 0 + for(let i = 2;i <= cost.length;i++){ + let dpi = Math.min(dpBefore + cost[i - 2],dpAfter + cost[i - 1]) + dpBefore = dpAfter + dpAfter = dpi } - - return dp[n] + return dpAfter }; ``` @@ -342,14 +355,14 @@ function minCostClimbingStairs(cost: number[]): number { ```typescript function minCostClimbingStairs(cost: number[]): number { - let dp_before = 0, - dp_after = 0 + let dpBefore = 0, + dpAfter = 0 for (let i = 2; i <= cost.length; i++) { - let dpi = Math.min(dp_before + cost[i - 2], dp_after + cost[i - 1]) - dp_before = dp_after - dp_after = dpi + let dpi = Math.min(dpBefore + cost[i - 2], dpAfter + cost[i - 1]) + dpBefore = dpAfter + dpAfter = dpi } - return dp_after + return dpAfter } ``` From ac16522a48d90d45d2f87f50a2c336fc383f4134 Mon Sep 17 00:00:00 2001 From: fw_qaq Date: Thu, 13 Apr 2023 12:37:46 +0800 Subject: [PATCH 1686/3019] =?UTF-8?q?Update=20problems/0746.=E4=BD=BF?= =?UTF-8?q?=E7=94=A8=E6=9C=80=E5=B0=8F=E8=8A=B1=E8=B4=B9=E7=88=AC=E6=A5=BC?= =?UTF-8?q?=E6=A2=AF.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" "b/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" index fb5261f321..561441fc4c 100644 --- "a/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" +++ "b/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" @@ -314,7 +314,7 @@ func min(a, b int) int { ### JavaScript -```Javascript +```JavaScript var minCostClimbingStairs = function(cost) { const dp = [0, 0] for (let i = 2; i <= cost.length; ++i) { From 057d6b8f89ea5bbef1bb460ce40d9093abd1c3e0 Mon Sep 17 00:00:00 2001 From: fw_qaq Date: Thu, 13 Apr 2023 13:34:46 +0800 Subject: [PATCH 1687/3019] =?UTF-8?q?Update=200746.=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=E6=9C=80=E5=B0=8F=E8=8A=B1=E8=B4=B9=E7=88=AC=E6=A5=BC=E6=A2=AF?= =?UTF-8?q?.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...71\347\210\254\346\245\274\346\242\257.md" | 35 ++++++++++++------- 1 file changed, 23 insertions(+), 12 deletions(-) diff --git "a/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" "b/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" index 561441fc4c..f11439c03c 100644 --- "a/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" +++ "b/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" @@ -399,18 +399,29 @@ impl Solution { ### C ```c -int minCostClimbingStairs(int* cost, int costSize){ - //开辟dp数组,大小为costSize - int *dp = (int *)malloc(sizeof(int) * costSize); - //初始化dp[0] = cost[0], dp[1] = cost[1] - dp[0] = cost[0], dp[1] = cost[1]; - - int i; - for(i = 2; i < costSize; ++i) { - dp[i] = (dp[i-1] < dp[i-2] ? dp[i-1] : dp[i-2]) + cost[i]; - } - //选出倒数2层楼梯中较小的 - return dp[i-1] < dp[i-2] ? dp[i-1] : dp[i-2]; +#include +int minCostClimbingStairs(int *cost, int costSize) { + int dp[costSize + 1]; + dp[0] = dp[1] = 0; + for (int i = 2; i <= costSize; i++) { + dp[i] = fmin(dp[i - 2] + cost[i - 2], dp[i - 1] + cost[i - 1]); + } + return dp[costSize]; +} +``` + +不使用 dp 数组 + +```c +#include +int minCostClimbingStairs(int *cost, int costSize) { + int dpBefore = 0, dpAfter = 0; + for (int i = 2; i <= costSize; i++) { + int dpi = fmin(dpBefore + cost[i - 2], dpAfter + cost[i - 1]); + dpBefore = dpAfter; + dpAfter = dpi; + } + return dpAfter; } ``` From f7680ab01d27b57e97dfe85796ac7c3c28b06d41 Mon Sep 17 00:00:00 2001 From: fw_qaq Date: Thu, 13 Apr 2023 17:01:45 +0800 Subject: [PATCH 1688/3019] =?UTF-8?q?Update=200062.=E4=B8=8D=E5=90=8C?= =?UTF-8?q?=E8=B7=AF=E5=BE=84.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...15\345\220\214\350\267\257\345\276\204.md" | 21 +++++++------------ 1 file changed, 7 insertions(+), 14 deletions(-) diff --git "a/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" "b/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" index bf4363692b..2ca157263e 100644 --- "a/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" +++ "b/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" @@ -395,21 +395,14 @@ function uniquePaths(m: number, n: number): number { ```Rust impl Solution { pub fn unique_paths(m: i32, n: i32) -> i32 { - let m = m as usize; - let n = n as usize; - let mut dp = vec![vec![0; n]; m]; - for i in 0..m { - dp[i][0] = 1; - } - for j in 0..n { - dp[0][j] = 1; - } - for i in 1..m { - for j in 1..n { - dp[i][j] = dp[i-1][j] + dp[i][j-1]; - } + let (m, n) = (m as usize, n as usize); + let mut dp = vec![vec![1; n]; m]; + for i in 1..m { + for j in 1..n { + dp[i][j] = dp[i - 1][j] + dp[i][j - 1]; } - dp[m-1][n-1] + } + dp[m - 1][n - 1] } } ``` From 872402e5a4e2e227e889fd3103786c503f864abd Mon Sep 17 00:00:00 2001 From: fw_qaq Date: Thu, 13 Apr 2023 18:05:44 +0800 Subject: [PATCH 1689/3019] =?UTF-8?q?Update=200063.=E4=B8=8D=E5=90=8C?= =?UTF-8?q?=E8=B7=AF=E5=BE=84II.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\345\220\214\350\267\257\345\276\204II.md" | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git "a/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" "b/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" index 85130ab4e4..8ab90e6d4f 100644 --- "a/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" +++ "b/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" @@ -493,6 +493,34 @@ impl Solution { } ``` +空间优化: + +```rust +impl Solution { + pub fn unique_paths_with_obstacles(obstacle_grid: Vec>) -> i32 { + let mut dp = vec![0; obstacle_grid[0].len()]; + for (i, &v) in obstacle_grid[0].iter().enumerate() { + if v == 0 { + dp[i] = 1; + } else { + break; + } + } + for rows in obstacle_grid.iter().skip(1) { + for j in 0..rows.len() { + if rows[j] == 1 { + dp[j] = 0; + continue; + } else if j != 0 { + dp[j] += dp[j - 1]; + } + } + } + dp.pop().unwrap() + } +} +``` + ### C ```c From ced650c7bb9d43447e8445fff31469455440057e Mon Sep 17 00:00:00 2001 From: fw_qaq Date: Thu, 13 Apr 2023 18:06:59 +0800 Subject: [PATCH 1690/3019] =?UTF-8?q?Update=20problems/0063.=E4=B8=8D?= =?UTF-8?q?=E5=90=8C=E8=B7=AF=E5=BE=84II.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" | 1 - 1 file changed, 1 deletion(-) diff --git "a/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" "b/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" index 8ab90e6d4f..8ff8c33f15 100644 --- "a/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" +++ "b/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" @@ -510,7 +510,6 @@ impl Solution { for j in 0..rows.len() { if rows[j] == 1 { dp[j] = 0; - continue; } else if j != 0 { dp[j] += dp[j - 1]; } From bd22ad9257b90dbeb2db60f5cdd6c591f6288e37 Mon Sep 17 00:00:00 2001 From: fw_qaq Date: Thu, 13 Apr 2023 18:51:26 +0800 Subject: [PATCH 1691/3019] =?UTF-8?q?Update=200343.=E6=95=B4=E6=95=B0?= =?UTF-8?q?=E6=8B=86=E5=88=86.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...64\346\225\260\346\213\206\345\210\206.md" | 44 ++++++++++--------- 1 file changed, 23 insertions(+), 21 deletions(-) diff --git "a/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" "b/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" index c2fbbdde68..4df6c41f4d 100644 --- "a/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" +++ "b/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" @@ -319,6 +319,29 @@ pub fn integer_break(n: i32) -> i32 { } ``` +贪心: + +```rust +impl Solution { + pub fn integer_break(mut n: i32) -> i32 { + match n { + 2 => 1, + 3 => 2, + 4 => 4, + 5.. => { + let mut res = 1; + while n > 4 { + res *= 3; + n -= 3; + } + res * n + } + _ => panic!("Error"), + } + } +} +``` + ### TypeScript ```typescript @@ -344,27 +367,6 @@ function integerBreak(n: number): number { }; ``` -### Rust - -```Rust -impl Solution { - fn max(a: i32, b: i32) -> i32{ - if a > b { a } else { b } - } - pub fn integer_break(n: i32) -> i32 { - let n = n as usize; - let mut dp = vec![0; n + 1]; - dp[2] = 1; - for i in 3..=n { - for j in 1..i - 1 { - dp[i] = Self::max(dp[i], Self::max(((i - j) * j) as i32, dp[i - j] * j as i32)); - } - } - dp[n] - } -} -``` - ### C ```c From 7111943ac00f9cea2c4899f0211b2d0fcadeef62 Mon Sep 17 00:00:00 2001 From: BanTanger <88583317+BanTanger@users.noreply.github.com> Date: Thu, 13 Apr 2023 22:18:21 +0800 Subject: [PATCH 1692/3019] =?UTF-8?q?Update=200347.=E5=89=8DK=E4=B8=AA?= =?UTF-8?q?=E9=AB=98=E9=A2=91=E5=85=83=E7=B4=A0.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 之前的 java 代码调用的 api 过于难记忆,不利于白板书写,于是将优先级队列存储数据结构从 map.setEntry 改为 int[] 数组,方便大家记忆理解书写 --- ...30\351\242\221\345\205\203\347\264\240.md" | 28 ++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git "a/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" "b/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" index 0d268d9bdc..6c8b51b1ad 100644 --- "a/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" +++ "b/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" @@ -188,7 +188,33 @@ class Solution { } } ``` - +简化版代码: +```java +class Solution { + public int[] topKFrequent(int[] nums, int k) { + // 优先级队列,为了避免复杂 api 操作,pq 存储数组 + // lambda 表达式设置优先级队列从大到小存储 o1 - o2 为从大到小,o2 - o1 反之 + PriorityQueue pq = new PriorityQueue<>((o1, o2) -> o1[1] - o2[1]); + int[] res = new int[k]; // 答案数组为 k 个元素 + Map map = new HashMap<>(); // 记录元素出现次数 + for(int num : nums) map.put(num, map.getOrDefault(num, 0) + 1); + for(var x : map.entrySet()) { // entrySet 获取 k-v Set 集合 + // 将 kv 转化成数组 + int[] tmp = new int[2]; + tmp[0] = x.getKey(); + tmp[1] = x.getValue(); + pq.offer(tmp); + if(pq.size() > k) { + pq.poll(); + } + } + for(int i = 0; i < k; i ++) { + res[i] = pq.poll()[0]; // 获取优先队列里的元素 + } + return res; + } +} +``` Python: ```python From 341b0aa672e9ca2d8a5b1cea2bc5ba307e795eda Mon Sep 17 00:00:00 2001 From: fwqaaq Date: Mon, 17 Apr 2023 10:37:39 +0800 Subject: [PATCH 1693/3019] =?UTF-8?q?Update=20problems/0746.=E4=BD=BF?= =?UTF-8?q?=E7=94=A8=E6=9C=80=E5=B0=8F=E8=8A=B1=E8=B4=B9=E7=88=AC=E6=A5=BC?= =?UTF-8?q?=E6=A2=AF.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" "b/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" index f11439c03c..31e7bd48c4 100644 --- "a/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" +++ "b/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" @@ -318,7 +318,7 @@ func min(a, b int) int { var minCostClimbingStairs = function(cost) { const dp = [0, 0] for (let i = 2; i <= cost.length; ++i) { - dp[i] = Math.min(dp[i -1] + cost[i - 1], dp[i - 2] + cost[i - 2]) + dp[i] = Math.min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]) } return dp[cost.length] }; From 9aaf02cc20156d385853f0d3f8c9eebc983bc9d7 Mon Sep 17 00:00:00 2001 From: sharky <1821984081@qq.com> Date: Tue, 18 Apr 2023 15:15:28 +0800 Subject: [PATCH 1694/3019] =?UTF-8?q?1005=E3=80=81K=E6=AC=A1=E5=8F=96?= =?UTF-8?q?=E5=8F=8D=E5=90=8E=E6=9C=80=E5=A4=A7=E5=8C=96=E7=9A=84=E6=95=B0?= =?UTF-8?q?=E7=BB=84=E5=92=8C=EF=BC=8C=E6=9A=B4=E5=8A=9B=E8=A7=A3=E6=B3=95?= =?UTF-8?q?=EF=BC=8Cjava?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...204\346\225\260\347\273\204\345\222\214.md" | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git "a/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" "b/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" index cdf42511b1..18b07b890e 100644 --- "a/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" +++ "b/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" @@ -145,7 +145,23 @@ class Solution { } } ``` - +```java +//暴力解法 +class Solution { + public int largestSumAfterKNegations(int[] nums, int k) { + int count = 0; + //循环k次 + for( int i = 0; i < k; i++ ){ + Arrays.sort( nums ); + nums[0] = -nums[0];//把最小值换成其相反数 + } + for ( int num : nums ){ + count += num;//累加 + } + return count; + } +} +``` ### Python ```python class Solution: From b7ea55c93b68391ecd87c39c06e2811f0ed6b98f Mon Sep 17 00:00:00 2001 From: Winson Huang Date: Tue, 18 Apr 2023 21:07:54 +0800 Subject: [PATCH 1695/3019] =?UTF-8?q?Update=200454.=E5=9B=9B=E6=95=B0?= =?UTF-8?q?=E7=9B=B8=E5=8A=A0II.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修改 Java 语言版本代码,让 HashMap 相关操作更简洁 --- ...33\233\346\225\260\347\233\270\345\212\240II.md" | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git "a/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" "b/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" index 411b60e872..abfc7c238f 100644 --- "a/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" +++ "b/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" @@ -102,21 +102,14 @@ class Solution { //统计两个数组中的元素之和,同时统计出现的次数,放入map for (int i : nums1) { for (int j : nums2) { - int tmp = map.getOrDefault(i + j, 0); - if (tmp == 0) { - map.put(i + j, 1); - } else { - map.replace(i + j, tmp + 1); - } + int sum = i + j; + map.put(sum, map.getOrDefault(sum, 0) + 1); } } //统计剩余的两个元素的和,在map中找是否存在相加为0的情况,同时记录次数 for (int i : nums3) { for (int j : nums4) { - int tmp = map.getOrDefault(0 - i - j, 0); - if (tmp != 0) { - res += tmp; - } + res += map.getOrDefault(0 - i - j, 0); } } return res; From 747563607292b4fc84452c4f45c2d0504531a171 Mon Sep 17 00:00:00 2001 From: Winson Huang Date: Tue, 18 Apr 2023 21:19:42 +0800 Subject: [PATCH 1696/3019] =?UTF-8?q?Update=200383.=E8=B5=8E=E9=87=91?= =?UTF-8?q?=E4=BF=A1.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 为 Java 语言版本的代码添加长度判断 --- "problems/0383.\350\265\216\351\207\221\344\277\241.md" | 4 ++++ 1 file changed, 4 insertions(+) diff --git "a/problems/0383.\350\265\216\351\207\221\344\277\241.md" "b/problems/0383.\350\265\216\351\207\221\344\277\241.md" index d9a184b643..a3f87d4afa 100644 --- "a/problems/0383.\350\265\216\351\207\221\344\277\241.md" +++ "b/problems/0383.\350\265\216\351\207\221\344\277\241.md" @@ -117,6 +117,10 @@ Java: ```Java class Solution { public boolean canConstruct(String ransomNote, String magazine) { + // shortcut + if (ransomNote.length() > magazine.length()) { + return false; + } // 定义一个哈希映射数组 int[] record = new int[26]; From 3f2a816f3096c6ccccba41c81b3975ca80f6d081 Mon Sep 17 00:00:00 2001 From: Lozakaka <102352821+Lozakaka@users.noreply.github.com> Date: Tue, 18 Apr 2023 18:23:24 -0400 Subject: [PATCH 1697/3019] =?UTF-8?q?Update=200112.=E8=B7=AF=E5=BE=84?= =?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 新增java 統一迭代法 --- ...57\345\276\204\346\200\273\345\222\214.md" | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git "a/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" "b/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" index 5958de93e6..b145788794 100644 --- "a/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" +++ "b/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" @@ -385,6 +385,42 @@ class solution { } } ``` +```Java 統一迭代法 + public boolean hasPathSum(TreeNode root, int targetSum) { + Stack treeNodeStack = new Stack<>(); + Stack sumStack = new Stack<>(); + + if(root == null) + return false; + treeNodeStack.add(root); + sumStack.add(root.val); + + while(!treeNodeStack.isEmpty()){ + TreeNode curr = treeNodeStack.peek(); + int tempsum = sumStack.pop(); + if(curr != null){ + treeNodeStack.pop(); + treeNodeStack.add(curr); + treeNodeStack.add(null); + sumStack.add(tempsum); + if(curr.right != null){ + treeNodeStack.add(curr.right); + sumStack.add(tempsum + curr.right.val); + } + if(curr.left != null){ + treeNodeStack.add(curr.left); + sumStack.add(tempsum + curr.left.val); + } + }else{ + treeNodeStack.pop(); + TreeNode temp = treeNodeStack.pop(); + if(temp.left == null && temp.right == null && tempsum == targetSum) + return true; + } + } + return false; + } +``` ### 0113.路径总和-ii From 0cfe55180439c77995abefaa02c5b61108203f3a Mon Sep 17 00:00:00 2001 From: asxy <17375702582@163.com> Date: Thu, 20 Apr 2023 11:14:43 +0800 Subject: [PATCH 1698/3019] =?UTF-8?q?Update=200647.=E5=9B=9E=E6=96=87?= =?UTF-8?q?=E5=AD=90=E4=B8=B2.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 回文子串添加java动态规划简单版本的代码 --- ...36\346\226\207\345\255\220\344\270\262.md" | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git "a/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" "b/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" index 90e6da9fbf..521c8c268e 100644 --- "a/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" +++ "b/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" @@ -267,6 +267,27 @@ class Solution { return ans; } } + +``` + +动态规划:简洁版 +```java +class Solution { + public int countSubstrings(String s) { + boolean[][] dp = new boolean[s.length()][s.length()]; + + int res = 0; + for (int i = s.length() - 1; i >= 0; i--) { + for (int j = i; j < s.length(); j++) { + if (s.charAt(i) == s.charAt(j) && (j - i <= 1 || dp[i + 1][j - 1])) { + res++; + dp[i][j] = true; + } + } + } + return res; + } +} ``` 中心扩散法: From fca305039005936bc9678c01d7573d6a2f8552ba Mon Sep 17 00:00:00 2001 From: asxy Date: Thu, 20 Apr 2023 11:47:39 +0800 Subject: [PATCH 1699/3019] =?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代码 --- ...47\347\232\204\347\237\251\345\275\242.md" | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git "a/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" "b/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" index eb06414334..f9a8350818 100644 --- "a/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" +++ "b/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" @@ -307,6 +307,33 @@ class Solution { } } ``` +单调栈精简 +```java +class Solution { + public int largestRectangleArea(int[] heights) { + int[] newHeight = new int[heights.length + 2]; + System.arraycopy(heights, 0, newHeight, 1, heights.length); + newHeight[heights.length+1] = 0; + newHeight[0] = 0; + + Stack stack = new Stack<>(); + stack.push(0); + + int res = 0; + for (int i = 1; i < newHeight.length; i++) { + while (newHeight[i] < newHeight[stack.peek()]) { + int mid = stack.pop(); + int w = i - stack.peek() - 1; + int h = newHeight[mid]; + res = Math.max(res, w * h); + } + stack.push(i); + + } + return res; + } +} +``` Python3: From f7bdc58b2802e8b81483a5c2f8023499a3d525c4 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Thu, 20 Apr 2023 01:18:03 -0500 Subject: [PATCH 1700/3019] =?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 修改 python 代码,dummy node --- ...76\350\256\241\351\223\276\350\241\250.md" | 71 ++++++++++--------- 1 file changed, 38 insertions(+), 33 deletions(-) diff --git "a/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" "b/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" index 5c78a12a7f..c72b73277a 100644 --- "a/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" +++ "b/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" @@ -486,15 +486,10 @@ class MyLinkedList { Python: ```python # 单链表 -class Node(object): - def __init__(self, x=0): - self.val = x - self.next = None - -class MyLinkedList(object): +class MyLinkedList1: def __init__(self): - self.head = Node() + self.dummy_head = Node()# 添加虚拟头指针,便于操作 self.size = 0 # 设置一个链表长度的属性,便于后续操作,注意每次增和删的时候都要更新 def get(self, index): @@ -504,7 +499,7 @@ class MyLinkedList(object): """ if index < 0 or index >= self.size: return -1 - cur = self.head.next + cur = self.dummy_head.next while(index): cur = cur.next index -= 1 @@ -516,8 +511,8 @@ class MyLinkedList(object): :rtype: None """ new_node = Node(val) - new_node.next = self.head.next - self.head.next = new_node + new_node.next = self.dummy_head.next + self.dummy_head.next = new_node self.size += 1 def addAtTail(self, val): @@ -526,7 +521,7 @@ class MyLinkedList(object): :rtype: None """ new_node = Node(val) - cur = self.head + cur = self.dummy_head while(cur.next): cur = cur.next cur.next = new_node @@ -548,12 +543,12 @@ class MyLinkedList(object): return node = Node(val) - pre = self.head + cur = self.dummy_head while(index): - pre = pre.next + cur = cur.next index -= 1 - node.next = pre.next - pre.next = node + node.next = cur.next + cur.next = node self.size += 1 def deleteAtIndex(self, index): @@ -563,7 +558,7 @@ class MyLinkedList(object): """ if index < 0 or index >= self.size: return - pre = self.head + pre = self.dummy_head while(index): pre = pre.next index -= 1 @@ -574,11 +569,10 @@ class MyLinkedList(object): # 相对于单链表, Node新增了prev属性 class Node: - def __init__(self, val): + def __init__(self, val=0, next = None, prev = None): self.val = val - self.prev = None - self.next = None - + self.next = next + self.prev = prev class MyLinkedList: @@ -601,6 +595,20 @@ class MyLinkedList: node = node.next return node + + def _update(self, prev: Node, next: Node, val: int) -> None: + """ + 更新节点 + :param prev: 相对于更新的前一个节点 + :param next: 相对于更新的后一个节点 + :param val: 要添加的节点值 + """ + # 计数累加 + self._count += 1 + node = Node(val) + prev.next, next.prev = node, node + node.prev, node.next = prev, next + def get(self, index: int) -> int: """ Get the value of the index-th node in the linked list. If the index is invalid, return -1. @@ -634,19 +642,6 @@ class MyLinkedList: node = self._get_node(index) self._update(node.prev, node, val) - def _update(self, prev: Node, next: Node, val: int) -> None: - """ - 更新节点 - :param prev: 相对于更新的前一个节点 - :param next: 相对于更新的后一个节点 - :param val: 要添加的节点值 - """ - # 计数累加 - self._count += 1 - node = Node(val) - prev.next, next.prev = node, node - node.prev, node.next = prev, next - def deleteAtIndex(self, index: int) -> None: """ Delete the index-th node in the linked list, if the index is valid. @@ -656,6 +651,16 @@ class MyLinkedList: # 计数-1 self._count -= 1 node.prev.next, node.next.prev = node.next, node.prev + + + +# Your MyLinkedList object will be instantiated and called as such: +# obj = MyLinkedList() +# param_1 = obj.get(index) +# obj.addAtHead(val) +# obj.addAtTail(val) +# obj.addAtIndex(index,val) +# obj.deleteAtIndex(index) ``` Go: From ad2acdb14ac6d633a0ad6e3b8f92d3e1f6c32881 Mon Sep 17 00:00:00 2001 From: Lozakaka <102352821+Lozakaka@users.noreply.github.com> Date: Thu, 20 Apr 2023 23:44:00 -0400 Subject: [PATCH 1701/3019] =?UTF-8?q?Update=200112.=E8=B7=AF=E5=BE=84?= =?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 add java iteration method for leetcode 113 (DFS统一迭代法) --- ...57\345\276\204\346\200\273\345\222\214.md" | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git "a/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" "b/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" index 5958de93e6..d8ea0a18f0 100644 --- "a/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" +++ "b/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" @@ -446,6 +446,52 @@ class Solution { } } ``` +```java +// 解法3 DFS统一迭代法 +class Solution { + public List> pathSum(TreeNode root, int targetSum) { + List> result = new ArrayList<>(); + Stack nodeStack = new Stack<>(); + Stack sumStack = new Stack<>(); + Stack> pathStack = new Stack<>(); + if(root == null) + return result; + nodeStack.add(root); + sumStack.add(root.val); + pathStack.add(new ArrayList<>()); + + while(!nodeStack.isEmpty()){ + TreeNode currNode = nodeStack.peek(); + int currSum = sumStack.pop(); + ArrayList currPath = pathStack.pop(); + if(currNode != null){ + nodeStack.pop(); + nodeStack.add(currNode); + nodeStack.add(null); + sumStack.add(currSum); + currPath.add(currNode.val); + pathStack.add(new ArrayList(currPath)); + if(currNode.right != null){ + nodeStack.add(currNode.right); + sumStack.add(currSum + currNode.right.val); + pathStack.add(new ArrayList(currPath)); + } + if(currNode.left != null){ + nodeStack.add(currNode.left); + sumStack.add(currSum + currNode.left.val); + pathStack.add(new ArrayList(currPath)); + } + }else{ + nodeStack.pop(); + TreeNode temp = nodeStack.pop(); + if(temp.left == null && temp.right == null && currSum == targetSum) + result.add(new ArrayList(currPath)); + } + } + return result; + } +} +``` ## python From 7a41318056f7aa10ef7d4653dd1c3fb988b64448 Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Fri, 21 Apr 2023 22:27:05 +0800 Subject: [PATCH 1702/3019] Update --- .../0047.\345\205\250\346\216\222\345\210\227II.md" | 13 +++++++++++++ ...\267\263\350\267\203\346\270\270\346\210\217.md" | 2 +- ...\220\210\345\271\266\345\214\272\351\227\264.md" | 1 - ...\267\257\345\276\204\346\200\273\345\222\214.md" | 2 +- ...\210\206\345\217\221\351\245\274\345\271\262.md" | 2 +- 5 files changed, 16 insertions(+), 4 deletions(-) diff --git "a/problems/0047.\345\205\250\346\216\222\345\210\227II.md" "b/problems/0047.\345\205\250\346\216\222\345\210\227II.md" index b4f7a4d8cb..b1908fb491 100644 --- "a/problems/0047.\345\205\250\346\216\222\345\210\227II.md" +++ "b/problems/0047.\345\205\250\346\216\222\345\210\227II.md" @@ -158,6 +158,19 @@ if (i > 0 && nums[i] == nums[i - 1] && used[i - 1] == true) { 所以我通过举[1,1,1]的例子,把这两个去重的逻辑分别抽象成树形结构,大家可以一目了然:为什么两种写法都可以以及哪一种效率更高! +这里可能大家又有疑惑,既然 `used[i - 1] == false`也行而`used[i - 1] == true`也行,那为什么还要写这个条件呢? + +直接这样写 不就完事了? + +```cpp +if (i > 0 && nums[i] == nums[i - 1]) { + continue; +} +``` + +其实并不行,一定要加上 `used[i - 1] == false`或者`used[i - 1] == true`,因为 used[i - 1] 要一直是 true 或者一直是false 才可以,而不是 一会是true 一会又是false。 所以这个条件要写上。 + + 是不是豁然开朗了!! ## 其他语言版本 diff --git "a/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" "b/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" index a898263de9..fa76bc2737 100644 --- "a/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" +++ "b/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" @@ -46,8 +46,8 @@ 如图: +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20230203105634.png) -![55.跳跃游戏](https://code-thinking-1253855093.file.myqcloud.com/pics/20201124154758229-20230310135019977.png) i每次移动只能在cover的范围内移动,每移动一个元素,cover得到该元素数值(新的覆盖范围)的补充,让i继续移动下去。 diff --git "a/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" "b/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" index d467ab1a29..08a3cb319f 100644 --- "a/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" +++ "b/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" @@ -106,7 +106,6 @@ class Solution { } } -} ``` ```java // 版本2 diff --git "a/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" "b/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" index e412d38e4e..43a623b5e3 100644 --- "a/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" +++ "b/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" @@ -17,7 +17,7 @@ 示例: 给定如下二叉树,以及目标和 sum = 22, -![112.路径总和1](https://img-blog.csdnimg.cn/20210203160355234.png) +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20230407210247.png) 返回 true, 因为存在目标和为 22 的根节点到叶子节点的路径 5->4->11->2。 diff --git "a/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" "b/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" index 63525b0394..e525175b9d 100644 --- "a/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" +++ "b/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" @@ -44,7 +44,7 @@ 如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20230203105634.png) +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20230405225628.png) 这个例子可以看出饼干9只有喂给胃口为7的小孩,这样才是整体最优解,并想不出反例,那么就可以撸代码了。 From 252e330a6b20fa13e81e4412c91f40547e0ba1b1 Mon Sep 17 00:00:00 2001 From: HOUSHENGREN <48871516+HOUSHENGREN@users.noreply.github.com> Date: Sun, 23 Apr 2023 14:36:27 +0800 Subject: [PATCH 1703/3019] =?UTF-8?q?Update=20=E5=88=B7=E5=8A=9B=E6=89=A3?= =?UTF-8?q?=E7=94=A8=E4=B8=8D=E7=94=A8=E5=BA=93=E5=87=BD=E6=95=B0.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit fix:文字错误 --- ...\270\215\347\224\250\345\272\223\345\207\275\346\225\260.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/\345\211\215\345\272\217/\345\210\267\345\212\233\346\211\243\347\224\250\344\270\215\347\224\250\345\272\223\345\207\275\346\225\260.md" "b/problems/\345\211\215\345\272\217/\345\210\267\345\212\233\346\211\243\347\224\250\344\270\215\347\224\250\345\272\223\345\207\275\346\225\260.md" index ae0940bfdc..04fce85611 100644 --- "a/problems/\345\211\215\345\272\217/\345\210\267\345\212\233\346\211\243\347\224\250\344\270\215\347\224\250\345\272\223\345\207\275\346\225\260.md" +++ "b/problems/\345\211\215\345\272\217/\345\210\267\345\212\233\346\211\243\347\224\250\344\270\215\347\224\250\345\272\223\345\207\275\346\225\260.md" @@ -24,5 +24,5 @@ 例如for循环里套一个字符串的insert,erase之类的操作,你说时间复杂度是多少呢,很明显是O(n^2)的时间复杂度了。 -在刷题的时候本着我说的标准来使用库函数,详细对大家回有所帮助! +在刷题的时候本着我说的标准来使用库函数,相信对大家回有所帮助! From b8f6df60c432fd85d9417e0ce138a90b4603527e Mon Sep 17 00:00:00 2001 From: Lozakaka <102352821+Lozakaka@users.noreply.github.com> Date: Sun, 23 Apr 2023 02:40:34 -0400 Subject: [PATCH 1704/3019] =?UTF-8?q?Update=200106.=E4=BB=8E=E4=B8=AD?= =?UTF-8?q?=E5=BA=8F=E4=B8=8E=E5=90=8E=E5=BA=8F=E9=81=8D=E5=8E=86=E5=BA=8F?= =?UTF-8?q?=E5=88=97=E6=9E=84=E9=80=A0=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 新增一java寫法 和卡哥的思路一樣的 --- ...40\344\272\214\345\217\211\346\240\221.md" | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git "a/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" "b/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" index adb374f957..8fc973e0f0 100644 --- "a/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" @@ -622,7 +622,42 @@ class Solution { } } ``` +```java +class Solution { + public TreeNode buildTree(int[] inorder, int[] postorder) { + if(postorder.length == 0 || inorder.length == 0) + return null; + return buildHelper(inorder, 0, inorder.length, postorder, 0, postorder.length); + + } + private TreeNode buildHelper(int[] inorder, int inorderStart, int inorderEnd, int[] postorder, int postorderStart, int postorderEnd){ + if(postorderStart == postorderEnd) + return null; + int rootVal = postorder[postorderEnd - 1]; + TreeNode root = new TreeNode(rootVal); + int middleIndex; + for (middleIndex = inorderStart; middleIndex < inorderEnd; middleIndex++){ + if(inorder[middleIndex] == rootVal) + break; + } + int leftInorderStart = inorderStart; + int leftInorderEnd = middleIndex; + int rightInorderStart = middleIndex + 1; + int rightInorderEnd = inorderEnd; + + + int leftPostorderStart = postorderStart; + int leftPostorderEnd = postorderStart + (middleIndex - inorderStart); + int rightPostorderStart = leftPostorderEnd; + int rightPostorderEnd = postorderEnd - 1; + root.left = buildHelper(inorder, leftInorderStart, leftInorderEnd, postorder, leftPostorderStart, leftPostorderEnd); + root.right = buildHelper(inorder, rightInorderStart, rightInorderEnd, postorder, rightPostorderStart, rightPostorderEnd); + + return root; + } +} +``` 105.从前序与中序遍历序列构造二叉树 ```java From 9558af957bd2077773a11fb4ebae7e432838c08a Mon Sep 17 00:00:00 2001 From: Charlie <1753524606@qq.com> Date: Sun, 23 Apr 2023 14:55:28 +0800 Subject: [PATCH 1705/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200028.=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0strStr=20Rust=E7=89=88=E6=9C=AC=E5=A4=9A=E4=BD=99?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E5=88=A0=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "problems/0028.\345\256\236\347\216\260strStr.md" | 4 ---- 1 file changed, 4 deletions(-) diff --git "a/problems/0028.\345\256\236\347\216\260strStr.md" "b/problems/0028.\345\256\236\347\216\260strStr.md" index 263c168995..2a81db8842 100644 --- "a/problems/0028.\345\256\236\347\216\260strStr.md" +++ "b/problems/0028.\345\256\236\347\216\260strStr.md" @@ -1314,7 +1314,6 @@ impl Solution { pub fn str_str(haystack: String, needle: String) -> i32 { let (haystack_len, needle_len) = (haystack.len(), needle.len()); - if haystack_len == 0 { return 0; } if haystack_len < needle_len { return -1;} let (haystack, needle) = (haystack.chars().collect::>(), needle.chars().collect::>()); let mut next: Vec = vec![0; haystack_len]; @@ -1355,9 +1354,6 @@ impl Solution { next } pub fn str_str(haystack: String, needle: String) -> i32 { - if needle.is_empty() { - return 0; - } if haystack.len() < needle.len() { return -1; } From f17c74ceec294a90f864a1a9a3836a03b4a752bb Mon Sep 17 00:00:00 2001 From: HOUSHENGREN <48871516+HOUSHENGREN@users.noreply.github.com> Date: Sun, 23 Apr 2023 15:14:25 +0800 Subject: [PATCH 1706/3019] =?UTF-8?q?Update=20=E5=88=B7=E5=8A=9B=E6=89=A3?= =?UTF-8?q?=E7=94=A8=E4=B8=8D=E7=94=A8=E5=BA=93=E5=87=BD=E6=95=B0.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit feat:修改文案 --- ...\270\215\347\224\250\345\272\223\345\207\275\346\225\260.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/\345\211\215\345\272\217/\345\210\267\345\212\233\346\211\243\347\224\250\344\270\215\347\224\250\345\272\223\345\207\275\346\225\260.md" "b/problems/\345\211\215\345\272\217/\345\210\267\345\212\233\346\211\243\347\224\250\344\270\215\347\224\250\345\272\223\345\207\275\346\225\260.md" index 04fce85611..7d0e34757b 100644 --- "a/problems/\345\211\215\345\272\217/\345\210\267\345\212\233\346\211\243\347\224\250\344\270\215\347\224\250\345\272\223\345\207\275\346\225\260.md" +++ "b/problems/\345\211\215\345\272\217/\345\210\267\345\212\233\346\211\243\347\224\250\344\270\215\347\224\250\345\272\223\345\207\275\346\225\260.md" @@ -24,5 +24,5 @@ 例如for循环里套一个字符串的insert,erase之类的操作,你说时间复杂度是多少呢,很明显是O(n^2)的时间复杂度了。 -在刷题的时候本着我说的标准来使用库函数,相信对大家回有所帮助! +在刷题的时候本着我说的标准来使用库函数,相信对大家会有所帮助! From ad871dae77cfed61609d3bffd14e2fd994ae7d1d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=93=88=E5=93=88=E5=93=88?= <76643786+Projecthappy@users.noreply.github.com> Date: Sun, 23 Apr 2023 18:22:29 +0800 Subject: [PATCH 1707/3019] =?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 为使用两个 Queue 实现添加新方法,方法将q1作为主要的队列,其元素排列顺序和出栈顺序相同,q2仅作为临时放置,push方法中在加入元素时先将q1中的元素依次出栈压入q2,然后将新加入的元素压入q1,再将q2中的元素依次出栈压入q1,其他方法可直接使用Queue中已有的方法。 --- ...27\345\256\236\347\216\260\346\240\210.md" | 38 ++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git "a/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" "b/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" index bad2faec27..29ef093375 100644 --- "a/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" +++ "b/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" @@ -166,7 +166,7 @@ public: Java: -使用两个 Queue 实现 +使用两个 Queue 实现方法1 ```java class MyStack { @@ -208,6 +208,42 @@ class MyStack { } ``` +使用两个 Queue 实现方法2 +```java +class MyStack { + //q1作为主要的队列,其元素排列顺序和出栈顺序相同 + Queue q1 = new ArrayDeque<>(); + //q2仅作为临时放置 + Queue q2 = new ArrayDeque<>(); + + public MyStack() { + + } + //在加入元素时先将q1中的元素依次出栈压入q2,然后将新加入的元素压入q1,再将q2中的元素依次出栈压入q1 + public void push(int x) { + while (q1.size() > 0) { + q2.add(q1.poll()); + } + q1.add(x); + while (q2.size() > 0) { + q1.add(q2.poll()); + } + } + + public int pop() { + return q1.poll(); + } + + public int top() { + return q1.peek(); + } + + public boolean empty() { + return q1.isEmpty(); + } +} +``` + 使用两个 Deque 实现 ```java class MyStack { From dd290cf33ba44e857021985197122a2982d76874 Mon Sep 17 00:00:00 2001 From: Binbin Date: Mon, 24 Apr 2023 14:28:47 +0800 Subject: [PATCH 1708/3019] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=200104.=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?.md=20=E9=87=8C=E7=9A=84=E9=94=99=E5=88=AB=E5=AD=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 后者 -> 或者 --- ...\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" "b/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" index 36578fd343..96169b3268 100644 --- "a/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" +++ "b/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" @@ -38,7 +38,7 @@ 本题可以使用前序(中左右),也可以使用后序遍历(左右中),使用前序求的就是深度,使用后序求的是高度。 * 二叉树节点的深度:指从根节点到该节点的最长简单路径边的条数或者节点数(取决于深度从0开始还是从1开始) -* 二叉树节点的高度:指从该节点到叶子节点的最长简单路径边的条数后者节点数(取决于高度从0开始还是从1开始) +* 二叉树节点的高度:指从该节点到叶子节点的最长简单路径边的条数或者节点数(取决于高度从0开始还是从1开始) **而根节点的高度就是二叉树的最大深度**,所以本题中我们通过后序求的根节点高度来求的二叉树最大深度。 From ce73cef055f17879a9ef8f58f8cabffd48ed7edb Mon Sep 17 00:00:00 2001 From: jimowo <1252480844@qq.com> Date: Mon, 24 Apr 2023 16:16:16 +0800 Subject: [PATCH 1709/3019] =?UTF-8?q?=E7=AE=97=E6=B3=95=E7=A9=BA=E9=97=B4?= =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...23\345\256\266\345\212\253\350\210\215.md" | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git "a/problems/0198.\346\211\223\345\256\266\345\212\253\350\210\215.md" "b/problems/0198.\346\211\223\345\256\266\345\212\253\350\210\215.md" index c25f3b8677..6e7f5ab6c6 100644 --- "a/problems/0198.\346\211\223\345\256\266\345\212\253\350\210\215.md" +++ "b/problems/0198.\346\211\223\345\256\266\345\212\253\350\210\215.md" @@ -136,6 +136,29 @@ class Solution { return dp[nums.length - 1]; } } + +// 空间优化 dp数组只存与计算相关的两次数据 +class Solution { + public int rob(int[] nums) { + if (nums.length == 1) { + return nums[0]; + } + // 初始化dp数组 + // 优化空间 dp数组只用2格空间 只记录与当前计算相关的前两个结果 + int[] dp = new int[2]; + dp[0] = nums[0]; + dp[1] = nums[0] > nums[1] ? nums[0] : nums[1]; + int res = 0; + // 遍历 + for (int i = 2; i < nums.length; i++) { + res = (dp[0] + nums[i]) > dp[1] ? (dp[0] + nums[i]) : dp[1]; + dp[0] = dp[1]; + dp[1] = res; + } + // 输出结果 + return dp[1]; + } +} ``` Python: @@ -220,3 +243,4 @@ function rob(nums: number[]): number { + From bb8e7312b64b13f98ca6c6ae88260a4f57375acd Mon Sep 17 00:00:00 2001 From: Lozakaka <102352821+Lozakaka@users.noreply.github.com> Date: Tue, 25 Apr 2023 03:25:45 -0400 Subject: [PATCH 1710/3019] =?UTF-8?q?Update=200098.=E9=AA=8C=E8=AF=81?= =?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 新增java 統一迭代法的寫法 有通過. AC --- ...11\346\220\234\347\264\242\346\240\221.md" | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git "a/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" index 95afe6805c..ccb6330558 100644 --- "a/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" +++ "b/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" @@ -259,6 +259,36 @@ public: ## Java +```Java +//使用統一迭代法 +class Solution { + public boolean isValidBST(TreeNode root) { + Stack stack = new Stack<>(); + TreeNode pre = null; + if(root != null) + stack.add(root); + while(!stack.isEmpty()){ + TreeNode curr = stack.peek(); + if(curr != null){ + stack.pop(); + if(curr.right != null) + stack.add(curr.right); + stack.add(curr); + stack.add(null); + if(curr.left != null) + stack.add(curr.left); + }else{ + stack.pop(); + TreeNode temp = stack.pop(); + if(pre != null && pre.val >= temp.val) + return false; + pre = temp; + } + } + return true; + } +} +``` ```Java class Solution { // 递归 From 75c7f940d112893dd6a1f89f844b710a87b202e1 Mon Sep 17 00:00:00 2001 From: Lozakaka <102352821+Lozakaka@users.noreply.github.com> Date: Tue, 25 Apr 2023 04:03:17 -0400 Subject: [PATCH 1711/3019] =?UTF-8?q?=E6=96=B0=E5=A2=9Ejava=20=E7=B5=B1?= =?UTF-8?q?=E4=B8=80=E8=BF=AD=E4=BB=A3=E6=B3=95-=E4=B8=AD=E5=BA=8F?= =?UTF-8?q?=E9=81=8D=E5=8E=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增java 統一迭代法-中序遍历 --- ...17\347\273\235\345\257\271\345\267\256.md" | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git "a/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" "b/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" index fa1430dec1..cd24c6faf1 100644 --- "a/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" +++ "b/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" @@ -174,6 +174,39 @@ class Solution { } } ``` +統一迭代法-中序遍历 +```Java +class Solution { + public int getMinimumDifference(TreeNode root) { + Stack stack = new Stack<>(); + TreeNode pre = null; + int result = Integer.MAX_VALUE; + + if(root != null) + stack.add(root); + while(!stack.isEmpty()){ + TreeNode curr = stack.peek(); + if(curr != null){ + stack.pop(); + if(curr.right != null) + stack.add(curr.right); + stack.add(curr); + stack.add(null); + if(curr.left != null) + stack.add(curr.left); + }else{ + stack.pop(); + TreeNode temp = stack.pop(); + if(pre != null) + result = Math.min(result, temp.val - pre.val); + pre = temp; + } + } + return result; + } +} +``` + 迭代法-中序遍历 ```java From c5c7dfb7fe0c0e7aa5c2115bed085d417d0726c0 Mon Sep 17 00:00:00 2001 From: zbb Date: Tue, 25 Apr 2023 19:45:48 +0800 Subject: [PATCH 1712/3019] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=200101.=E5=AF=B9?= =?UTF-8?q?=E7=A7=B0=E4=BA=8C=E5=8F=89=E6=A0=91.md=20=E9=87=8C=E7=9A=84?= =?UTF-8?q?=E9=94=99=E5=88=AB=E5=AD=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...57\271\347\247\260\344\272\214\345\217\211\346\240\221.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" "b/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" index b75e9ff2da..1594196bc9 100644 --- "a/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" @@ -88,7 +88,7 @@ else if (left->val != right->val) return false; // 注意这里我没有 * 比较二叉树外侧是否对称:传入的是左节点的左孩子,右节点的右孩子。 -* 比较内测是否对称,传入左节点的右孩子,右节点的左孩子。 +* 比较内侧是否对称,传入左节点的右孩子,右节点的左孩子。 * 如果左右都对称就返回true ,有一侧不对称就返回false 。 代码如下: @@ -157,7 +157,7 @@ public: **这个代码就很简洁了,但隐藏了很多逻辑,条理不清晰,而且递归三部曲,在这里完全体现不出来。** -**所以建议大家做题的时候,一定要想清楚逻辑,每一步做什么。把道题目所有情况想到位,相应的代码写出来之后,再去追求简洁代码的效果。** +**所以建议大家做题的时候,一定要想清楚逻辑,每一步做什么。把题目所有情况想到位,相应的代码写出来之后,再去追求简洁代码的效果。** ## 迭代法 From 7851e51c7345590977d3881424354d6be0dd8eae Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Thu, 27 Apr 2023 15:35:27 +0800 Subject: [PATCH 1713/3019] =?UTF-8?q?update=20=200077.=E7=BB=84=E5=90=88?= =?UTF-8?q?=EF=BC=9A=E6=B7=BB=E5=8A=A0=E5=A4=8D=E6=9D=82=E5=BA=A6=E5=88=86?= =?UTF-8?q?=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "problems/0077.\347\273\204\345\220\210.md" | 4 ++++ 1 file changed, 4 insertions(+) diff --git "a/problems/0077.\347\273\204\345\220\210.md" "b/problems/0077.\347\273\204\345\220\210.md" index 9c6d481ddb..3f222a17c2 100644 --- "a/problems/0077.\347\273\204\345\220\210.md" +++ "b/problems/0077.\347\273\204\345\220\210.md" @@ -218,6 +218,10 @@ public: } }; ``` +* 时间复杂度: O(n * 2^n) +* 空间复杂度: O(n) + + 还记得我们在[关于回溯算法,你该了解这些!](https://programmercarl.com/回溯算法理论基础.html)中给出的回溯法模板么? From e533cb9cd4a5048a933055d5dd02ad7dbf8a1d20 Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Thu, 27 Apr 2023 15:37:21 +0800 Subject: [PATCH 1714/3019] =?UTF-8?q?update=20=20=200077.=E7=BB=84?= =?UTF-8?q?=E5=90=88=E4=BC=98=E5=8C=96=EF=BC=9A=E6=B7=BB=E5=8A=A0=E5=A4=8D?= =?UTF-8?q?=E6=9D=82=E5=BA=A6=E5=88=86=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" | 4 ++++ 1 file changed, 4 insertions(+) diff --git "a/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" "b/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" index 9736549c57..0c816bc169 100644 --- "a/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" +++ "b/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" @@ -130,6 +130,10 @@ public: } }; ``` +* 时间复杂度: O(n * 2^n) +* 空间复杂度: O(n) + + # 总结 From 9a29e5c3be75185c6013aaa0cb252374fb80598d Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Thu, 27 Apr 2023 15:41:40 +0800 Subject: [PATCH 1715/3019] =?UTF-8?q?update=20=20=200216.=E7=BB=84?= =?UTF-8?q?=E5=90=88=E6=80=BB=E5=92=8CIII=EF=BC=9A=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E5=A4=8D=E6=9D=82=E5=BA=A6=E5=88=86=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" | 2 ++ 1 file changed, 2 insertions(+) diff --git "a/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" "b/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" index f631c3cdc8..f08d77eac1 100644 --- "a/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" +++ "b/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" @@ -235,6 +235,8 @@ public: } }; ``` +* 时间复杂度: O(n * 2^n) +* 空间复杂度: O(n) # 总结 From 025854e1678ba1e77a271b35a60159c1ad92ffbb Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Thu, 27 Apr 2023 16:02:29 +0800 Subject: [PATCH 1716/3019] =?UTF-8?q?update=20=20=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=EF=BC=9A=E6=B7=BB=E5=8A=A0=E5=A4=8D=E6=9D=82=E5=BA=A6?= =?UTF-8?q?=E5=88=86=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" | 2 ++ 1 file changed, 2 insertions(+) diff --git "a/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" "b/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" index d113549716..d506bb889e 100644 --- "a/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" +++ "b/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" @@ -183,6 +183,8 @@ public: } }; ``` +* 时间复杂度: O(3^m * 4^n),其中 m 是对应四个字母的数字个数,n 是对应三个字母的数字个数 +* 空间复杂度: O(3^m * 4^n) 一些写法,是把回溯的过程放在递归函数里了,例如如下代码,我可以写成这样:(注意注释中不一样的地方) From d3290c7e773f66514625e8d678ff7695ae3f0f99 Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Thu, 27 Apr 2023 16:07:21 +0800 Subject: [PATCH 1717/3019] =?UTF-8?q?update=20=20=200039.=E7=BB=84?= =?UTF-8?q?=E5=90=88=E6=80=BB=E5=92=8C=EF=BC=9A=E6=B7=BB=E5=8A=A0=E5=A4=8D?= =?UTF-8?q?=E6=9D=82=E5=BA=A6=E5=88=86=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" | 2 ++ 1 file changed, 2 insertions(+) diff --git "a/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" "b/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" index c4ee5ca6ca..e1e51923db 100644 --- "a/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" +++ "b/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" @@ -214,6 +214,8 @@ public: } }; ``` +* 时间复杂度: O(n * 2^n),注意这只是复杂度的上界,因为剪枝的存在,真实的时间复杂度远小于此 +* 空间复杂度: O(target) # 总结 From d68a1f633e532621ebd87578ae7c8daae4e5c36c Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Thu, 27 Apr 2023 16:08:26 +0800 Subject: [PATCH 1718/3019] =?UTF-8?q?update=20=20=200040.=E7=BB=84?= =?UTF-8?q?=E5=90=88=E6=80=BB=E5=92=8CII=EF=BC=9A=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E5=A4=8D=E6=9D=82=E5=BA=A6=E5=88=86=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" | 2 ++ 1 file changed, 2 insertions(+) diff --git "a/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" "b/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" index 83708df720..b708650ad0 100644 --- "a/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" +++ "b/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" @@ -214,6 +214,8 @@ public: }; ``` +* 时间复杂度: O(n * 2^n) +* 空间复杂度: O(n) ## 补充 From 65f059ac7a7168a8848bb7106f1050ce28afa862 Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Thu, 27 Apr 2023 16:27:02 +0800 Subject: [PATCH 1719/3019] =?UTF-8?q?update=20=200131.=E5=88=86=E5=89=B2?= =?UTF-8?q?=E5=9B=9E=E6=96=87=E4=B8=B2=20=EF=BC=9A=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E5=A4=8D=E6=9D=82=E5=BA=A6=E5=88=86=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" | 3 +++ 1 file changed, 3 insertions(+) diff --git "a/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" "b/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" index 30bba455fb..dfec7853d1 100644 --- "a/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" +++ "b/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" @@ -209,6 +209,9 @@ public: } }; ``` +* 时间复杂度: O(n * 2^n) +* 空间复杂度: O(n^2) + # 优化 上面的代码还存在一定的优化空间, 在于如何更高效的计算一个子字符串是否是回文字串。上述代码```isPalindrome```函数运用双指针的方法来判定对于一个字符串```s```, 给定起始下标和终止下标, 截取出的子字符串是否是回文字串。但是其中有一定的重复计算存在: From 33d5a6878e73800cae191d98276729c1ebb77860 Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Thu, 27 Apr 2023 16:33:52 +0800 Subject: [PATCH 1720/3019] =?UTF-8?q?=20update=20=20=200078.=E5=AD=90?= =?UTF-8?q?=E9=9B=86=EF=BC=9A=E6=B7=BB=E5=8A=A0=E5=A4=8D=E6=9D=82=E5=BA=A6?= =?UTF-8?q?=E5=88=86=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "problems/0078.\345\255\220\351\233\206.md" | 2 ++ 1 file changed, 2 insertions(+) diff --git "a/problems/0078.\345\255\220\351\233\206.md" "b/problems/0078.\345\255\220\351\233\206.md" index f26d0821e9..07418fbc12 100644 --- "a/problems/0078.\345\255\220\351\233\206.md" +++ "b/problems/0078.\345\255\220\351\233\206.md" @@ -149,6 +149,8 @@ public: }; ``` +* 时间复杂度: O(n * 2^n) +* 空间复杂度: O(n) 在注释中,可以发现可以不写终止条件,因为本来我们就要遍历整棵树。 From 3accc7602597a2d6c7af017326d8caf9cb30be16 Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Thu, 27 Apr 2023 16:34:55 +0800 Subject: [PATCH 1721/3019] =?UTF-8?q?update=20=20=200090.=E5=AD=90?= =?UTF-8?q?=E9=9B=86II=EF=BC=9A=E6=B7=BB=E5=8A=A0=E5=A4=8D=E6=9D=82?= =?UTF-8?q?=E5=BA=A6=E5=88=86=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "problems/0090.\345\255\220\351\233\206II.md" | 3 +++ 1 file changed, 3 insertions(+) diff --git "a/problems/0090.\345\255\220\351\233\206II.md" "b/problems/0090.\345\255\220\351\233\206II.md" index 1a9f8fda3e..63f75d294f 100644 --- "a/problems/0090.\345\255\220\351\233\206II.md" +++ "b/problems/0090.\345\255\220\351\233\206II.md" @@ -83,6 +83,9 @@ public: } }; ``` +* 时间复杂度: O(n * 2^n) +* 空间复杂度: O(n) + 使用set去重的版本。 ```CPP From 09975d3d380c3151538270fe8cac25d39a476281 Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Thu, 27 Apr 2023 16:37:53 +0800 Subject: [PATCH 1722/3019] =?UTF-8?q?update=20=20=200491.=E9=80=92?= =?UTF-8?q?=E5=A2=9E=E5=AD=90=E5=BA=8F=E5=88=97=EF=BC=9A=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E5=A4=8D=E6=9D=82=E5=BA=A6=E5=88=86=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" | 2 ++ 1 file changed, 2 insertions(+) diff --git "a/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" "b/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" index 436dbf01c8..d6c6b9c956 100644 --- "a/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" @@ -139,6 +139,8 @@ public: } }; ``` +* 时间复杂度: O(n * 2^n) +* 空间复杂度: O(n) ## 优化 From 9d581e86fe858577263597ec5b0a1aa5dda24c2e Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Thu, 27 Apr 2023 16:38:59 +0800 Subject: [PATCH 1723/3019] =?UTF-8?q?update=20=200046.=E5=85=A8=E6=8E=92?= =?UTF-8?q?=E5=88=97=20=EF=BC=9A=E6=B7=BB=E5=8A=A0=E5=A4=8D=E6=9D=82?= =?UTF-8?q?=E5=BA=A6=E5=88=86=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "problems/0046.\345\205\250\346\216\222\345\210\227.md" | 2 ++ 1 file changed, 2 insertions(+) diff --git "a/problems/0046.\345\205\250\346\216\222\345\210\227.md" "b/problems/0046.\345\205\250\346\216\222\345\210\227.md" index e08aec940b..fb70be4141 100644 --- "a/problems/0046.\345\205\250\346\216\222\345\210\227.md" +++ "b/problems/0046.\345\205\250\346\216\222\345\210\227.md" @@ -136,6 +136,8 @@ public: } }; ``` +* 时间复杂度: O(n!) +* 空间复杂度: O(n) ## 总结 From 1a9cb629ae87aa43a7eac4dea0a6732492a8a242 Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Thu, 27 Apr 2023 16:39:37 +0800 Subject: [PATCH 1724/3019] =?UTF-8?q?update=20=200047.=E5=85=A8=E6=8E=92?= =?UTF-8?q?=E5=88=97II=20=EF=BC=9A=E6=B7=BB=E5=8A=A0=E5=A4=8D=E6=9D=82?= =?UTF-8?q?=E5=BA=A6=E5=88=86=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "problems/0047.\345\205\250\346\216\222\345\210\227II.md" | 2 ++ 1 file changed, 2 insertions(+) diff --git "a/problems/0047.\345\205\250\346\216\222\345\210\227II.md" "b/problems/0047.\345\205\250\346\216\222\345\210\227II.md" index b1908fb491..3ff3fb8fcd 100644 --- "a/problems/0047.\345\205\250\346\216\222\345\210\227II.md" +++ "b/problems/0047.\345\205\250\346\216\222\345\210\227II.md" @@ -99,6 +99,8 @@ public: }; ``` +* 时间复杂度: O(n) +* 空间复杂度: O(n) ## 拓展 From 2a7f4d5d4b4107c0aa85960e0e46adb56d665def Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Thu, 27 Apr 2023 16:44:28 +0800 Subject: [PATCH 1725/3019] =?UTF-8?q?update=20=20=200051.N=E7=9A=87?= =?UTF-8?q?=E5=90=8E=EF=BC=9A=E6=B7=BB=E5=8A=A0=E5=A4=8D=E6=9D=82=E5=BA=A6?= =?UTF-8?q?=E5=88=86=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "problems/0051.N\347\232\207\345\220\216.md" | 3 +++ 1 file changed, 3 insertions(+) diff --git "a/problems/0051.N\347\232\207\345\220\216.md" "b/problems/0051.N\347\232\207\345\220\216.md" index bd1d1c9bec..54580cf76a 100644 --- "a/problems/0051.N\347\232\207\345\220\216.md" +++ "b/problems/0051.N\347\232\207\345\220\216.md" @@ -208,6 +208,9 @@ public: } }; ``` +* 时间复杂度: O(n!) +* 空间复杂度: O(n) + 可以看出,除了验证棋盘合法性的代码,省下来部分就是按照回溯法模板来的。 From 7f699b59167263645112138b8ff4a99e8c606846 Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Thu, 27 Apr 2023 17:15:12 +0800 Subject: [PATCH 1726/3019] =?UTF-8?q?update=20=20=200093.=E5=A4=8D?= =?UTF-8?q?=E5=8E=9FIP=E5=9C=B0=E5=9D=80=EF=BC=9A=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E5=A4=8D=E6=9D=82=E5=BA=A6=E5=88=86=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" | 2 ++ 1 file changed, 2 insertions(+) diff --git "a/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" "b/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" index 9d4d59180e..161fb96e31 100644 --- "a/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" +++ "b/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" @@ -244,6 +244,8 @@ public: }; ``` +* 时间复杂度: O(3^4),IP地址最多包含4个数字,每个数字最多有3种可能的分割方式,则搜索树的最大深度为4,每个节点最多有3个子节点。 +* 空间复杂度: O(n) # 总结 From 42cdaa2e9a2639dab6931a5733aabf6ed92df62a Mon Sep 17 00:00:00 2001 From: blockChain-Fans <33158355+1055373165@users.noreply.github.com> Date: Thu, 27 Apr 2023 23:34:50 +0800 Subject: [PATCH 1727/3019] =?UTF-8?q?Update=200035.=E6=90=9C=E7=B4=A2?= =?UTF-8?q?=E6=8F=92=E5=85=A5=E4=BD=8D=E7=BD=AE.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 返回值应该是 right+1 把 --- ...\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" "b/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" index 58340c21a1..efc875777b 100644 --- "a/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" +++ "b/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" @@ -274,7 +274,7 @@ func searchInsert(nums []int, target int) int { left = mid + 1 } } - return len(nums) + return right+1 } ``` From 31d2755d18a216384495f25654cd4510c360dadf Mon Sep 17 00:00:00 2001 From: xiaodi007 <334830452@qq.com> Date: Fri, 28 Apr 2023 11:17:08 +0800 Subject: [PATCH 1728/3019] fix 0343 py code --- .../0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" "b/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" index c2fbbdde68..812bf67bec 100644 --- "a/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" +++ "b/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" @@ -254,7 +254,7 @@ class Solution: # 假设对正整数 i 拆分出的第一个正整数是 j(1 <= j < i),则有以下两种方案: # 1) 将 i 拆分成 j 和 i−j 的和,且 i−j 不再拆分成多个正整数,此时的乘积是 j * (i-j) # 2) 将 i 拆分成 j 和 i−j 的和,且 i−j 继续拆分成多个正整数,此时的乘积是 j * dp[i-j] - for j in range(1, i / 2 + 1): + for j in range(1, i // 2 + 1): dp[i] = max(dp[i], max(j * (i - j), j * dp[i - j])) return dp[n] ``` From 14c25f2eeff8e024f822485c4fbdfddcb0c3710e Mon Sep 17 00:00:00 2001 From: fwqaaq Date: Fri, 28 Apr 2023 18:30:16 +0800 Subject: [PATCH 1729/3019] =?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=20about=20?= =?UTF-8?q?rust?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...47\241\20001\350\203\214\345\214\205-1.md" | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" index c45fc3d302..c25252488a 100644 --- "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" +++ "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" @@ -573,6 +573,39 @@ object Solution { } ``` +### Rust + +```rust +pub struct Solution; + +impl Solution { + pub fn wei_bag_problem1(weight: Vec, value: Vec, bag_size: usize) -> usize { + let mut dp = vec![vec![0; bag_size + 1]; weight.len()]; + for j in weight[0]..=weight.len() { + dp[0][j] = value[0]; + } + + for i in 1..weight.len() { + for j in 0..=bag_size { + match j < weight[i] { + true => dp[i][j] = dp[i - 1][j], + false => dp[i][j] = dp[i - 1][j].max(dp[i - 1][j - weight[i]] + value[i]), + } + } + } + dp[weight.len() - 1][bag_size] + } +} + +#[test] +fn test_wei_bag_problem1() { + println!( + "{}", + Solution::wei_bag_problem1(vec![1, 3, 4], vec![15, 20, 30], 4) + ); +} +``` +

From e6ad637e6475c73766f401b052a1c523d171d059 Mon Sep 17 00:00:00 2001 From: fwqaaq Date: Fri, 28 Apr 2023 18:50:56 +0800 Subject: [PATCH 1730/3019] =?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-2.md=20about=20?= =?UTF-8?q?rust?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...47\241\20001\350\203\214\345\214\205-2.md" | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" index baa4107f58..1ce90440b6 100644 --- "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" +++ "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" @@ -406,6 +406,34 @@ object Solution { } ``` +### Rust + +```rust +pub struct Solution; + +impl Solution { + pub fn wei_bag_problem2(weight: Vec, value: Vec, bag_size: usize) -> usize { + let mut dp = vec![0; bag_size + 1]; + for i in 0..weight.len() { + for j in (weight[i]..=bag_size).rev() { + if j >= weight[i] { + dp[j] = dp[j].max(dp[j - weight[i]] + value[i]); + } + } + } + dp[dp.len() - 1] + } +} + +#[test] +fn test_wei_bag_problem2() { + println!( + "{}", + Solution::wei_bag_problem1(vec![1, 3, 4], vec![15, 20, 30], 4) + ); +} +``` +

From d2650cc436980c2553003e3c7bdba2e8579aa53b Mon Sep 17 00:00:00 2001 From: fwqaaq Date: Fri, 28 Apr 2023 18:51:38 +0800 Subject: [PATCH 1731/3019] =?UTF-8?q?Update=20problems/=E8=83=8C=E5=8C=85?= =?UTF-8?q?=E7=90=86=E8=AE=BA=E5=9F=BA=E7=A1=8001=E8=83=8C=E5=8C=85-2.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" index 1ce90440b6..3b798334a6 100644 --- "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" +++ "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" @@ -429,7 +429,7 @@ impl Solution { fn test_wei_bag_problem2() { println!( "{}", - Solution::wei_bag_problem1(vec![1, 3, 4], vec![15, 20, 30], 4) + Solution::wei_bag_problem2(vec![1, 3, 4], vec![15, 20, 30], 4) ); } ``` From 3ff604055147700bd66ad8c83b43ee6f073e4265 Mon Sep 17 00:00:00 2001 From: lzxzz <1042183935@qq.com> Date: Sat, 29 Apr 2023 09:49:25 +0800 Subject: [PATCH 1732/3019] optimize --- ...02\273\351\207\215\345\244\215\351\241\271.md" | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git "a/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" "b/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" index 694f1a92dc..486d198b4d 100644 --- "a/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" +++ "b/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" @@ -264,14 +264,15 @@ javaScript: ```js var removeDuplicates = function(s) { - const stack = []; - for(const x of s) { - let c = null; - if(stack.length && x === (c = stack.pop())) continue; - c && stack.push(c); - stack.push(x); + const result = [] + for(const i of s){ + if(i === result[result.length-1]){ + result.pop() + }else{ + result.push(i) + } } - return stack.join(""); + return result.join('') }; ``` From 76d347076b1ff05769c6bbb8844027363608e017 Mon Sep 17 00:00:00 2001 From: fwqaaq Date: Sat, 29 Apr 2023 10:27:48 +0800 Subject: [PATCH 1733/3019] =?UTF-8?q?Update=200416.=E5=88=86=E5=89=B2?= =?UTF-8?q?=E7=AD=89=E5=92=8C=E5=AD=90=E9=9B=86.md=20about=20rust?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 去除不必要的方法 --- ...11\345\222\214\345\255\220\351\233\206.md" | 23 ++++++++----------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git "a/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" "b/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" index 8726bf95b8..8115e18ea9 100644 --- "a/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" +++ "b/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" @@ -406,24 +406,21 @@ var canPartition = function(nums) { ```Rust impl Solution { - fn max(a: usize, b: usize) -> usize { - if a > b { a } else { b } - } pub fn can_partition(nums: Vec) -> bool { - let nums = nums.iter().map(|x| *x as usize).collect::>(); - let mut sum = 0; - let mut dp: Vec = vec![0; 10001]; - for i in 0..nums.len() { - sum += nums[i]; + let sum = nums.iter().sum::() as usize; + if sum % 2 == 1 { + return false; } - if sum % 2 == 1 { return false; } let target = sum / 2; - for i in 0..nums.len() { - for j in (nums[i]..=target).rev() { - dp[j] = Self::max(dp[j], dp[j - nums[i]] + nums[i]); + let mut dp = vec![0; target + 1]; + for n in nums { + for j in (n as usize..=target).rev() { + dp[j] = dp[j].max(dp[j - n as usize] + n) } } - if dp[target] == target { return true; } + if dp[target] == target as i32 { + return true; + } false } } From da4116bcb60b3bf6efa7f44e8e20877e987fadfe Mon Sep 17 00:00:00 2001 From: Lozakaka <102352821+Lozakaka@users.noreply.github.com> Date: Sat, 29 Apr 2023 05:45:01 -0400 Subject: [PATCH 1734/3019] =?UTF-8?q?=E6=96=B0=E5=A2=9E=20Java=20=E7=B5=B1?= =?UTF-8?q?=E4=B8=80=E8=BF=AD=E4=BB=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增 Java 統一迭代法 --- ...55\347\232\204\344\274\227\346\225\260.md" | 53 +++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git "a/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" "b/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" index b7ef606fe6..e467bf8a23 100644 --- "a/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" +++ "b/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" @@ -472,6 +472,59 @@ class Solution { } } ``` +統一迭代法 +```Java +class Solution { + public int[] findMode(TreeNode root) { + int count = 0; + int maxCount = 0; + TreeNode pre = null; + LinkedList res = new LinkedList<>(); + Stack stack = new Stack<>(); + + if(root != null) + stack.add(root); + + while(!stack.isEmpty()){ + TreeNode curr = stack.peek(); + if(curr != null){ + stack.pop(); + if(curr.right != null) + stack.add(curr.right); + stack.add(curr); + stack.add(null); + if(curr.left != null) + stack.add(curr.left); + }else{ + stack.pop(); + TreeNode temp = stack.pop(); + if(pre == null) + count = 1; + else if(pre != null && pre.val == temp.val) + count++; + else + count = 1; + pre = temp; + if(count == maxCount) + res.add(temp.val); + if(count > maxCount){ + maxCount = count; + res.clear(); + res.add(temp.val); + } + } + } + int[] result = new int[res.size()]; + int i = 0; + for (int x : res){ + result[i] = x; + i++; + } + return result; + } +} +``` + ## Python From 513707ca713b2b199f8202e953b1a8dd2c40d447 Mon Sep 17 00:00:00 2001 From: skyclouds2001 <95597335+skyclouds2001@users.noreply.github.com> Date: Sun, 30 Apr 2023 14:24:26 +0800 Subject: [PATCH 1735/3019] =?UTF-8?q?=E9=93=BE=E8=A1=A8=E7=9B=B8=E4=BA=A4?= =?UTF-8?q?=E6=96=87=E6=A1=A3=E7=BB=93=E6=9E=84=E6=A0=BC=E5=BC=8F=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...51\223\276\350\241\250\347\233\270\344\272\244.md" | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git "a/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" "b/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" index 30f5c467c4..9e0c29f5da 100644 --- "a/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" +++ "b/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" @@ -101,8 +101,8 @@ public: ## 其他语言版本 +Java: -### Java ```Java public class Solution { public ListNode getIntersectionNode(ListNode headA, ListNode headB) { @@ -150,9 +150,9 @@ public class Solution { } ``` -### Python -```python +Python: +```python class Solution: def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> ListNode: lenA, lenB = 0, 0 @@ -179,7 +179,7 @@ class Solution: return None ``` -### Go +Go: ```go func getIntersectionNode(headA, headB *ListNode) *ListNode { @@ -240,7 +240,7 @@ func getIntersectionNode(headA, headB *ListNode) *ListNode { } ``` -### javaScript +JavaScript: ```js var getListLen = function(head) { @@ -352,6 +352,7 @@ ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) { ``` Scala: + ```scala object Solution { def getIntersectionNode(headA: ListNode, headB: ListNode): ListNode = { From 113d1192a92b50ad8154b4b7717cdb5d9186d7a0 Mon Sep 17 00:00:00 2001 From: Mrzhugq <84071063+Mrzhugq@users.noreply.github.com> Date: Sun, 30 Apr 2023 16:45:31 +0800 Subject: [PATCH 1736/3019] =?UTF-8?q?Update=200035.=E6=90=9C=E7=B4=A2?= =?UTF-8?q?=E6=8F=92=E5=85=A5=E4=BD=8D=E7=BD=AE.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 195行把空间复杂度写成时间复杂度了 --- ...64\242\346\217\222\345\205\245\344\275\215\347\275\256.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" "b/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" index 58340c21a1..a37d67f569 100644 --- "a/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" +++ "b/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" @@ -191,8 +191,8 @@ public: }; ``` -* 时间复杂度:$O(\log n)$ -* 时间复杂度:$O(1)$ +* 时间复杂度:O(log n) +* 空间复杂度:O(1) ## 总结 From 18a16f9faffb7b796d174fb150e3dd601f6f82f4 Mon Sep 17 00:00:00 2001 From: Jia Tan Date: Sun, 30 Apr 2023 20:24:32 +0000 Subject: [PATCH 1737/3019] Ignore .DS_Store files. --- .DS_Store | Bin 6148 -> 0 bytes .gitignore | 1 + 2 files changed, 1 insertion(+) delete mode 100644 .DS_Store create mode 100644 .gitignore diff --git a/.DS_Store b/.DS_Store deleted file mode 100644 index da03c1c1b207c3ee04079084ecb15dcfff97ef95..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHK%}T>S5T317Q;OJwLXQhx3-<3)^bl)(0V4`psf{T$m}X1UTBHSVD*@yHz(SRn%3w1`N_?k*PTX z=s*u5cO3N-(d77z49It9K_3Pnz=e13&kcl&V-IdW@S|a|_{35R>BXgGloVwt;#QN%@Vis8VsHj`Xe9O(bW6^; z=;?2>^71?{rY9N=vv=!y_4uZF|F|A+0!!OY6cR47cXj`MRB4$Rg_Eiph0d}LrjcXRUo z-}}7&|CmHQVt^R Date: Sun, 30 Apr 2023 13:40:16 -0700 Subject: [PATCH 1738/3019] =?UTF-8?q?Update=20=E4=BA=8C=E5=8F=89=E6=A0=91?= =?UTF-8?q?=E7=90=86=E8=AE=BA=E5=9F=BA=E7=A1=80.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...06\350\256\272\345\237\272\347\241\200.md" | 27 ++++++++++--------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" index 3afedc8249..dbf42ca4e4 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -195,15 +195,16 @@ Java: ```java public class TreeNode { int val; - TreeNode left; - TreeNode right; - TreeNode() {} - TreeNode(int val) { this.val = val; } - TreeNode(int val, TreeNode left, TreeNode right) { - this.val = val; - this.left = left; - this.right = right; - } + TreeNode left; + TreeNode right; + + TreeNode() {} + TreeNode(int val) { this.val = val; } + TreeNode(int val, TreeNode left, TreeNode right) { + this.val = val; + this.left = left; + this.right = right; + } } ``` @@ -212,10 +213,10 @@ Python: ```python class TreeNode: - def __init__(self, value): - self.value = value - self.left = None - self.right = None + def __init__(self, val, left = None, right = None): + self.val = val + self.left = left + self.right = right ``` Go: From 9617a8b3fedc3996645977df31104159864b3462 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Mon, 1 May 2023 15:46:15 -0500 Subject: [PATCH 1739/3019] =?UTF-8?q?Update=200102.=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=A0=91=E7=9A=84=E5=B1=82=E5=BA=8F=E9=81=8D=E5=8E=86.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...02\345\272\217\351\201\215\345\216\206.md" | 75 +++++++++++-------- 1 file changed, 44 insertions(+), 31 deletions(-) diff --git "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" index 26f0ae2d17..e777c2a4aa 100644 --- "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" +++ "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" @@ -171,47 +171,60 @@ python3代码: ```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 +from collections import deque class Solution: - """二叉树层序遍历迭代解法""" - - def levelOrder(self, root: TreeNode) -> List[List[int]]: - results = [] + def levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]: if not root: - return results - - from collections import deque - que = deque([root]) - - while que: - size = len(que) - result = [] - for _ in range(size): - cur = que.popleft() - result.append(cur.val) + return [] + queue = deque([root]) + result = [] + while queue: + level = [] + for _ in range(len(queue)): + cur = queue.popleft() + level.append(cur.val) if cur.left: - que.append(cur.left) + queue.append(cur.left) if cur.right: - que.append(cur.right) - results.append(result) - - return results + queue.append(cur.right) + result.append(level) + return result ``` - ```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 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 + def levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]: + levels = [] + self.helper(root, 0, levels) + return levels + + def helper(self, node, level, levels): + if not node: + return + if len(levels) == level: + levels.append([]) + levels[level].append(node.val) + self.helper(node.left, level + 1, levels) + self.helper(node.right, level + 1, levels) + + ``` + + go: ```go From d6b1f3e9538c67b5592a0d93aee4df70a652ab96 Mon Sep 17 00:00:00 2001 From: JaneyLin <105125897+janeyziqinglin@users.noreply.github.com> Date: Tue, 2 May 2023 23:28:44 -0400 Subject: [PATCH 1740/3019] =?UTF-8?q?Update=200674.=E6=9C=80=E9=95=BF?= =?UTF-8?q?=E8=BF=9E=E7=BB=AD=E9=80=92=E5=A2=9E=E5=BA=8F=E5=88=97.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit fix bug. --- ...\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" "b/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" index 79a8311d78..1e79b797d6 100644 --- "a/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" +++ "b/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" @@ -212,7 +212,7 @@ class Solution: return 0 result = 1 dp = [1] * len(nums) - for i in range(len(nums)-1): + for i in range(len(nums)): if nums[i+1] > nums[i]: #连续记录 dp[i+1] = dp[i] + 1 result = max(result, dp[i+1]) From f80761a43833de34dc355d48f729c64ecef63afb Mon Sep 17 00:00:00 2001 From: JaneyLin <105125897+janeyziqinglin@users.noreply.github.com> Date: Tue, 2 May 2023 23:34:57 -0400 Subject: [PATCH 1741/3019] =?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 result should be initialized to 1. --- ...\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" "b/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" index e8cb0b5f18..01d349496b 100644 --- "a/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" @@ -149,7 +149,7 @@ class Solution: if len(nums) <= 1: return len(nums) dp = [1] * len(nums) - result = 0 + result = 1 for i in range(1, len(nums)): for j in range(0, i): if nums[i] > nums[j]: From c76ed37fc487bc7da34403bbb484e9e42b582efb Mon Sep 17 00:00:00 2001 From: Lozakaka <102352821+Lozakaka@users.noreply.github.com> Date: Tue, 2 May 2023 23:55:58 -0400 Subject: [PATCH 1742/3019] adding java iteration method MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增java 迭代方法 --- ...11\346\220\234\347\264\242\346\240\221.md" | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git "a/problems/0669.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0669.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" index 18d8a0cc8d..5739f7622d 100644 --- "a/problems/0669.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" +++ "b/problems/0669.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" @@ -248,6 +248,8 @@ public: ## Java +**递归** + ```Java class Solution { public TreeNode trimBST(TreeNode root, int low, int high) { @@ -269,6 +271,46 @@ class Solution { ``` +**迭代** + +```Java +class Solution { + //iteration + public TreeNode trimBST(TreeNode root, int low, int high) { + if(root == null) + return null; + while(root != null && (root.val < low || root.val > high)){ + if(root.val < low) + root = root.right; + else + root = root.left; + } + + TreeNode curr = root; + + //deal with root's left sub-tree, and deal with the value smaller than low. + while(curr != null){ + while(curr.left != null && curr.left.val < low){ + curr.left = curr.left.right; + } + curr = curr.left; + } + //go back to root; + curr = root; + + //deal with root's righg sub-tree, and deal with the value bigger than high. + while(curr != null){ + while(curr.right != null && curr.right.val > high){ + curr.right = curr.right.left; + } + curr = curr.right; + } + return root; + } +} + +```` + ## Python **递归** From 424d5c224f229aaee353b3bbae8996b8e5dcbef2 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Wed, 3 May 2023 15:06:11 -0500 Subject: [PATCH 1743/3019] =?UTF-8?q?Update=200027.=E7=A7=BB=E9=99=A4?= =?UTF-8?q?=E5=85=83=E7=B4=A0.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\273\351\231\244\345\205\203\347\264\240.md" | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git "a/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" "b/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" index 91150c74b9..6dc6404e48 100644 --- "a/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" +++ "b/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" @@ -198,6 +198,7 @@ Python: ``` python 3 +(版本一)快慢指针法 class Solution: def removeElement(self, nums: List[int], val: int) -> int: # 快慢指针 @@ -213,7 +214,21 @@ class Solution: return slow ``` - +``` python 3 +(版本二)暴力递归法 +class Solution: + def removeElement(self, nums: List[int], val: int) -> int: + i, l = 0, len(nums) + while i < l: + if nums[i] == val: # 找到等于目标值的节点 + for j in range(i+1, l): # 移除该元素,并将后面元素向前平移 + nums[j - 1] = nums[j] + l -= 1 + i -= 1 + i += 1 + return l + +``` Go: From 53fbfc8339a6b61cb708ec87356e764db0f2b1ba Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Wed, 3 May 2023 15:08:17 -0500 Subject: [PATCH 1744/3019] =?UTF-8?q?Update=200027.=E7=A7=BB=E9=99=A4?= =?UTF-8?q?=E5=85=83=E7=B4=A0.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" "b/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" index 6dc6404e48..908011532a 100644 --- "a/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" +++ "b/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" @@ -215,7 +215,7 @@ class Solution: ``` ``` python 3 -(版本二)暴力递归法 +(版本二)暴力法 class Solution: def removeElement(self, nums: List[int], val: int) -> int: i, l = 0, len(nums) From 934dd4e3131485802edd5d7c45fd60dd4f8f2827 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Wed, 3 May 2023 15:19:23 -0500 Subject: [PATCH 1745/3019] =?UTF-8?q?Update=200977.=E6=9C=89=E5=BA=8F?= =?UTF-8?q?=E6=95=B0=E7=BB=84=E7=9A=84=E5=B9=B3=E6=96=B9.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...04\347\232\204\345\271\263\346\226\271.md" | 41 +++++++++++++------ 1 file changed, 28 insertions(+), 13 deletions(-) diff --git "a/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" "b/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" index 57f8de02af..4fbdd1cdac 100644 --- "a/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" +++ "b/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" @@ -140,22 +140,37 @@ class Solution { Python: ```Python +(版本一)双指针法 class Solution: def sortedSquares(self, nums: List[int]) -> List[int]: - n = len(nums) - i,j,k = 0,n - 1,n - 1 - ans = [-1] * n - while i <= j: - lm = nums[i] ** 2 - rm = nums[j] ** 2 - if lm > rm: - ans[k] = lm - i += 1 + l, r, i = 0, len(nums)-1, len(nums)-1 + res = [float('inf')] * len(nums) # 需要提前定义列表,存放结果 + while l <= r: + if nums[l] ** 2 < nums[r] ** 2: # 左右边界进行对比,找出最大值 + res[i] = nums[r] ** 2 + r -= 1 # 右指针往左移动 else: - ans[k] = rm - j -= 1 - k -= 1 - return ans + res[i] = nums[l] ** 2 + l += 1 # 左指针往右移动 + i -= 1 # 存放结果的指针需要往前平移一位 + return res +``` + +```Python +(版本二)暴力排序法 +class Solution: + def sortedSquares(self, nums: List[int]) -> List[int]: + for i in range(len(nums)): + nums[i] *= nums[i] + nums.sort() + return nums +``` + +```Python +(版本三)暴力排序法+列表推导法 +class Solution: + def sortedSquares(self, nums: List[int]) -> List[int]: + return sorted(x*x for x in nums) ``` Go: From 5f65e3ba24617dc81b199bcbb356f47517f7fbee Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Wed, 3 May 2023 15:32:36 -0500 Subject: [PATCH 1746/3019] =?UTF-8?q?Update=200209.=E9=95=BF=E5=BA=A6?= =?UTF-8?q?=E6=9C=80=E5=B0=8F=E7=9A=84=E5=AD=90=E6=95=B0=E7=BB=84.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...04\345\255\220\346\225\260\347\273\204.md" | 46 +++++++++++++++---- 1 file changed, 36 insertions(+), 10 deletions(-) diff --git "a/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" "b/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" index 5a8f91aff3..d7ae478033 100644 --- "a/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" +++ "b/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" @@ -173,18 +173,44 @@ class Solution { Python: ```python +(版本一)滑动窗口法 class Solution: def minSubArrayLen(self, s: int, nums: List[int]) -> int: - res = float("inf") # 定义一个无限大的数 - Sum = 0 # 滑动窗口数值之和 - i = 0 # 滑动窗口起始位置 - for j in range(len(nums)): - Sum += nums[j] - while Sum >= s: - res = min(res, j-i+1) - Sum -= nums[i] - i += 1 - return 0 if res == float("inf") else res + l = len(nums) + left = 0 + right = 0 + min_len = float('inf') + cur_sum = 0 #当前的累加值 + + while right < l: + cur_sum += nums[right] + + while cur_sum >= s: # 当前累加值大于目标值 + min_len = min(min_len, right - left + 1) + cur_sum -= nums[left] + left += 1 + + right += 1 + + return min_len if min_len != float('inf') else 0 +``` + +```python +(版本二)暴力法 +class Solution: + def minSubArrayLen(self, s: int, nums: List[int]) -> int: + l = len(nums) + min_len = float('inf') + + for i in range(l): + cur_sum = 0 + for j in range(i, l): + cur_sum += nums[j] + if cur_sum >= s: + min_len = min(min_len, j - i + 1) + break + + return min_len if min_len != float('inf') else 0 ``` Go: From f45b1f1d28a668e2c90ad66ac0d2141d59fc73ae Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Wed, 3 May 2023 16:19:13 -0500 Subject: [PATCH 1747/3019] =?UTF-8?q?Update=200203.=E7=A7=BB=E9=99=A4?= =?UTF-8?q?=E9=93=BE=E8=A1=A8=E5=85=83=E7=B4=A0.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...76\350\241\250\345\205\203\347\264\240.md" | 20 ++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git "a/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" "b/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" index b52f16ea23..6a0de2826c 100644 --- "a/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" +++ "b/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" @@ -307,21 +307,27 @@ public ListNode removeElements(ListNode head, int val) { Python: ```python +(版本一)虚拟头节点法 # Definition for singly-linked list. # class ListNode: # def __init__(self, val=0, next=None): # self.val = val # self.next = next class Solution: - def removeElements(self, head: ListNode, val: int) -> ListNode: - dummy_head = ListNode(next=head) #添加一个虚拟节点 - cur = dummy_head - while cur.next: - if cur.next.val == val: - cur.next = cur.next.next #删除cur.next节点 + def removeElements(self, head: Optional[ListNode], val: int) -> Optional[ListNode]: + # 创建虚拟头部节点以简化删除过程 + dummy_head = ListNode(next = head) + + # 遍历列表并删除值为val的节点 + current = dummy_head + while current.next: + if current.next.val == val: + current.next = current.next.next else: - cur = cur.next + current = current.next + return dummy_head.next + ``` Go: From 70d8379ff7fe99edbbd2d006b9b3d9a5068c66fc Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Wed, 3 May 2023 16:26:16 -0500 Subject: [PATCH 1748/3019] =?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 --- ...76\350\256\241\351\223\276\350\241\250.md" | 268 +++++++++--------- 1 file changed, 131 insertions(+), 137 deletions(-) diff --git "a/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" "b/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" index c72b73277a..aa04d0e1af 100644 --- "a/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" +++ "b/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" @@ -485,172 +485,166 @@ class MyLinkedList { Python: ```python -# 单链表 -class MyLinkedList1: - +(版本一)单链表法 +class ListNode: + def __init__(self, val=0, next=None): + self.val = val + self.next = next + +class MyLinkedList: def __init__(self): - self.dummy_head = Node()# 添加虚拟头指针,便于操作 - self.size = 0 # 设置一个链表长度的属性,便于后续操作,注意每次增和删的时候都要更新 - - def get(self, index): - """ - :type index: int - :rtype: int - """ + self.dummy_head = ListNode() + self.size = 0 + + def get(self, index: int) -> int: if index < 0 or index >= self.size: return -1 - cur = self.dummy_head.next - while(index): - cur = cur.next - index -= 1 - return cur.val - - def addAtHead(self, val): - """ - :type val: int - :rtype: None - """ - new_node = Node(val) - new_node.next = self.dummy_head.next - self.dummy_head.next = new_node + + current = self.dummy_head.next + for i in range(index): + current = current.next + + return current.val + + def addAtHead(self, val: int) -> None: + self.dummy_head.next = ListNode(val, self.dummy_head.next) self.size += 1 - def addAtTail(self, val): - """ - :type val: int - :rtype: None - """ - new_node = Node(val) - cur = self.dummy_head - while(cur.next): - cur = cur.next - cur.next = new_node + def addAtTail(self, val: int) -> None: + current = self.dummy_head + while current.next: + current = current.next + current.next = ListNode(val) self.size += 1 - def addAtIndex(self, index, val): - """ - :type index: int - :type val: int - :rtype: None - """ - if index < 0: - self.addAtHead(val) - return - elif index == self.size: - self.addAtTail(val) - return - elif index > self.size: + def addAtIndex(self, index: int, val: int) -> None: + if index < 0 or index > self.size: return - - node = Node(val) - cur = self.dummy_head - while(index): - cur = cur.next - index -= 1 - node.next = cur.next - cur.next = node - self.size += 1 - def deleteAtIndex(self, index): - """ - :type index: int - :rtype: None - """ + current = self.dummy_head + for i in range(index): + current = current.next + current.next = ListNode(val, current.next) + self.size += 1 + + def deleteAtIndex(self, index: int) -> None: if index < 0 or index >= self.size: return - pre = self.dummy_head - while(index): - pre = pre.next - index -= 1 - pre.next = pre.next.next + + current = self.dummy_head + for i in range(index): + current = current.next + current.next = current.next.next self.size -= 1 - -# 双链表 -# 相对于单链表, Node新增了prev属性 -class Node: - - def __init__(self, val=0, next = None, prev = None): + + +# Your MyLinkedList object will be instantiated and called as such: +# obj = MyLinkedList() +# param_1 = obj.get(index) +# obj.addAtHead(val) +# obj.addAtTail(val) +# obj.addAtIndex(index,val) +# obj.deleteAtIndex(index) +``` + + +```python +(版本二)双链表法 +class ListNode: + def __init__(self, val=0, prev=None, next=None): self.val = val - self.next = next self.prev = prev + self.next = next class MyLinkedList: - def __init__(self): - self._head, self._tail = Node(0), Node(0) # 虚拟节点 - self._head.next, self._tail.prev = self._tail, self._head - self._count = 0 # 添加的节点数 - - def _get_node(self, index: int) -> Node: - # 当index小于_count//2时, 使用_head查找更快, 反之_tail更快 - if index >= self._count // 2: - # 使用prev往前找 - node = self._tail - for _ in range(self._count - index): - node = node.prev - else: - # 使用next往后找 - node = self._head - for _ in range(index + 1): - node = node.next - return node - - - def _update(self, prev: Node, next: Node, val: int) -> None: - """ - 更新节点 - :param prev: 相对于更新的前一个节点 - :param next: 相对于更新的后一个节点 - :param val: 要添加的节点值 - """ - # 计数累加 - self._count += 1 - node = Node(val) - prev.next, next.prev = node, node - node.prev, node.next = prev, next + self.head = None + self.tail = None + self.size = 0 def get(self, index: int) -> int: - """ - Get the value of the index-th node in the linked list. If the index is invalid, return -1. - """ - if 0 <= index < self._count: - node = self._get_node(index) - return node.val - else: + if index < 0 or index >= self.size: return -1 + + if index < self.size // 2: + current = self.head + for i in range(index): + current = current.next + else: + current = self.tail + for i in range(self.size - index - 1): + current = current.prev + + return current.val def addAtHead(self, val: int) -> None: - """ - Add a node of value val before the first element of the linked list. After the insertion, the new node will be the first node of the linked list. - """ - self._update(self._head, self._head.next, val) + new_node = ListNode(val, None, self.head) + if self.head: + self.head.prev = new_node + else: + self.tail = new_node + self.head = new_node + self.size += 1 def addAtTail(self, val: int) -> None: - """ - Append a node of value val to the last element of the linked list. - """ - self._update(self._tail.prev, self._tail, val) + new_node = ListNode(val, self.tail, None) + if self.tail: + self.tail.next = new_node + else: + self.head = new_node + self.tail = new_node + self.size += 1 def addAtIndex(self, index: int, val: int) -> None: - """ - Add a node of value val before the index-th node in the linked list. If index equals to the length of linked list, the node will be appended to the end of linked list. If index is greater than the length, the node will not be inserted. - """ - if index < 0: - index = 0 - elif index > self._count: + if index < 0 or index > self.size: return - node = self._get_node(index) - self._update(node.prev, node, val) + + if index == 0: + self.addAtHead(val) + elif index == self.size: + self.addAtTail(val) + else: + if index < self.size // 2: + current = self.head + for i in range(index - 1): + current = current.next + else: + current = self.tail + for i in range(self.size - index): + current = current.prev + new_node = ListNode(val, current, current.next) + current.next.prev = new_node + current.next = new_node + self.size += 1 def deleteAtIndex(self, index: int) -> None: - """ - Delete the index-th node in the linked list, if the index is valid. - """ - if 0 <= index < self._count: - node = self._get_node(index) - # 计数-1 - self._count -= 1 - node.prev.next, node.next.prev = node.next, node.prev + if index < 0 or index >= self.size: + return + + if index == 0: + self.head = self.head.next + if self.head: + self.head.prev = None + else: + self.tail = None + elif index == self.size - 1: + self.tail = self.tail.prev + if self.tail: + self.tail.next = None + else: + self.head = None + else: + if index < self.size // 2: + current = self.head + for i in range(index): + current = current.next + else: + current = self.tail + for i in range(self.size - index - 1): + current = current.prev + current.prev.next = current.next + current.next.prev = current.prev + self.size -= 1 From 926008cf1390c596c7225f0f988723fe687a9408 Mon Sep 17 00:00:00 2001 From: Lozakaka <102352821+Lozakaka@users.noreply.github.com> Date: Wed, 3 May 2023 18:08:11 -0400 Subject: [PATCH 1749/3019] adding java iteraion MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增java統一迭代法 --- ...72\347\264\257\345\212\240\346\240\221.md" | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git "a/problems/0538.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md" "b/problems/0538.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md" index ad5310e150..e60d9a84e8 100644 --- "a/problems/0538.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md" +++ "b/problems/0538.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md" @@ -177,6 +177,8 @@ public: ## Java +**递归** + ```Java class Solution { int sum; @@ -198,6 +200,42 @@ class Solution { } } ``` +**迭代** + +```Java +class Solution { + //DFS iteraion統一迭代法 + public TreeNode convertBST(TreeNode root) { + int pre = 0; + Stack stack = new Stack<>(); + if(root == null) //edge case check + return null; + + stack.add(root); + + while(!stack.isEmpty()){ + TreeNode curr = stack.peek(); + //curr != null的狀況,只負責存node到stack中 + if(curr != null){ + stack.pop(); + if(curr.left != null) //左 + stack.add(curr.left); + stack.add(curr); //中 + stack.add(null); + if(curr.right != null) //右 + stack.add(curr.right); + }else{ + //curr == null的狀況,只負責做單層邏輯 + stack.pop(); + TreeNode temp = stack.pop(); + temp.val += pre; + pre = temp.val; + } + } + return root; + } +} +``` ## Python **递归** From 55ea26c5bdac70997c6ad9833448cdf3c1a7e0d1 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Wed, 3 May 2023 17:18:48 -0500 Subject: [PATCH 1750/3019] =?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 --- ...73\350\275\254\351\223\276\350\241\250.md" | 40 +++++-------------- 1 file changed, 11 insertions(+), 29 deletions(-) diff --git "a/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md" "b/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md" index d558e783fe..0425e18280 100644 --- "a/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md" +++ "b/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md" @@ -193,9 +193,9 @@ class Solution { } ``` -Python迭代法: +Python ```python -#双指针 +(版本一)双指针法 # Definition for singly-linked list. # class ListNode: # def __init__(self, val=0, next=None): @@ -205,7 +205,7 @@ class Solution: def reverseList(self, head: ListNode) -> ListNode: cur = head pre = None - while(cur!=None): + while cur: temp = cur.next # 保存一下 cur的下一个节点,因为接下来要改变cur->next cur.next = pre #反转 #更新pre、cur指针 @@ -217,6 +217,7 @@ class Solution: Python递归法: ```python +(版本二)递归法 # Definition for singly-linked list. # class ListNode: # def __init__(self, val=0, next=None): @@ -224,36 +225,17 @@ Python递归法: # self.next = next class Solution: def reverseList(self, head: ListNode) -> ListNode: - - def reverse(pre,cur): - if not cur: - return pre - - tmp = cur.next - cur.next = pre - - return reverse(cur,tmp) - - return reverse(None,head) + return self.reverse(head, None) + def reverse(self, cur: ListNode, pre: ListNode) -> ListNode: + if cur == None: + return pre + temp = cur.next + cur.next = pre + return self.reverse(temp, cur) ``` -Python递归法从后向前: -```python -# Definition for singly-linked list. -# class ListNode: -# def __init__(self, val=0, next=None): -# self.val = val -# self.next = next -class Solution: - def reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]: - if not head or not head.next: return head - p = self.reverseList(head.next) - head.next.next = head - head.next = None - return p -``` Go: From d92104209fecd89626df38414d03c78371f251e5 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Wed, 3 May 2023 17:20:34 -0500 Subject: [PATCH 1751/3019] =?UTF-8?q?Update=200024.=E4=B8=A4=E4=B8=A4?= =?UTF-8?q?=E4=BA=A4=E6=8D=A2=E9=93=BE=E8=A1=A8=E4=B8=AD=E7=9A=84=E8=8A=82?= =?UTF-8?q?=E7=82=B9.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...55\347\232\204\350\212\202\347\202\271.md" | 23 +++++++++---------- 1 file changed, 11 insertions(+), 12 deletions(-) diff --git "a/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" "b/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" index 4dc051aa74..2c171dde91 100644 --- "a/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" +++ "b/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" @@ -186,21 +186,20 @@ Python: class Solution: def swapPairs(self, head: ListNode) -> ListNode: - res = ListNode(next=head) - pre = res + dummy_head = ListNode(next=head) + current = dummy_head - # 必须有pre的下一个和下下个才能交换,否则说明已经交换结束了 - while pre.next and pre.next.next: - cur = pre.next - post = pre.next.next + # 必须有cur的下一个和下下个才能交换,否则说明已经交换结束了 + while current.next and current.next.next: + temp = current.next # 防止节点修改 + temp1 = current.next.next.next - # pre,cur,post对应最左,中间的,最右边的节点 - cur.next = post.next - post.next = cur - pre.next = post + current.next = current.next.next + current.next.next = temp + temp.next = temp1 + current = current.next.next + return dummy_head.next - pre = pre.next.next - return res.next ``` Go: From 190477400ebf0842343588c4e9e15c5eab412eb4 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Wed, 3 May 2023 17:22:46 -0500 Subject: [PATCH 1752/3019] =?UTF-8?q?Update=200019.=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E9=93=BE=E8=A1=A8=E7=9A=84=E5=80=92=E6=95=B0=E7=AC=ACN?= =?UTF-8?q?=E4=B8=AA=E8=8A=82=E7=82=B9.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...4N\344\270\252\350\212\202\347\202\271.md" | 28 ++++++++++++------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git "a/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" "b/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" index a11ff8bace..c6f5bfc781 100644 --- "a/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" +++ "b/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" @@ -127,21 +127,29 @@ Python: # def __init__(self, val=0, next=None): # self.val = val # self.next = next + class Solution: def removeNthFromEnd(self, head: ListNode, n: int) -> ListNode: - head_dummy = ListNode() - head_dummy.next = head - - slow, fast = head_dummy, head_dummy - while(n>=0): #fast先往前走n+1步 + # 创建一个虚拟节点,并将其下一个指针设置为链表的头部 + dummy_head = ListNode(0, head) + + # 创建两个指针,慢指针和快指针,并将它们初始化为虚拟节点 + slow = fast = dummy_head + + # 快指针比慢指针快 n+1 步 + for i in range(n+1): fast = fast.next - n -= 1 - while(fast!=None): + + # 移动两个指针,直到快速指针到达链表的末尾 + while fast: slow = slow.next fast = fast.next - #fast 走到结尾后,slow的下一个节点为倒数第N个节点 - slow.next = slow.next.next #删除 - return head_dummy.next + + # 通过更新第 (n-1) 个节点的 next 指针删除第 n 个节点 + slow.next = slow.next.next + + return dummy_head.next + ``` Go: ```Go From e4072d9a00b12c6de6949091378bdd8d95b5296c Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Wed, 3 May 2023 17:25:36 -0500 Subject: [PATCH 1753/3019] =?UTF-8?q?Update=20=E9=9D=A2=E8=AF=95=E9=A2=980?= =?UTF-8?q?2.07.=E9=93=BE=E8=A1=A8=E7=9B=B8=E4=BA=A4.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...76\350\241\250\347\233\270\344\272\244.md" | 63 ++++++++++++++++++- 1 file changed, 62 insertions(+), 1 deletion(-) diff --git "a/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" "b/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" index 30f5c467c4..4bcbd1f920 100644 --- "a/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" +++ "b/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" @@ -152,7 +152,7 @@ public class Solution { ### Python ```python - +(版本一)求长度,同时出发 class Solution: def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> ListNode: lenA, lenB = 0, 0 @@ -178,7 +178,68 @@ class Solution: curB = curB.next return None ``` +```python +(版本二)求长度,同时出发 (代码复用) +class Solution: + def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> ListNode: + lenA = self.getLength(headA) + lenB = self.getLength(headB) + + # 通过移动较长的链表,使两链表长度相等 + if lenA > lenB: + headA = self.moveForward(headA, lenA - lenB) + else: + headB = self.moveForward(headB, lenB - lenA) + + # 将两个头向前移动,直到它们相交 + while headA and headB: + if headA == headB: + return headA + headA = headA.next + headB = headB.next + + return None + + def getLength(self, head: ListNode) -> int: + length = 0 + while head: + length += 1 + head = head.next + return length + + def moveForward(self, head: ListNode, steps: int) -> ListNode: + while steps > 0: + head = head.next + steps -= 1 + return head +``` +```python +(版本三)等比例法 +# Definition for singly-linked list. +# class ListNode: +# def __init__(self, x): +# self.val = x +# self.next = None +class Solution: + def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> ListNode: + # 处理边缘情况 + if not headA or not headB: + return None + + # 在每个链表的头部初始化两个指针 + pointerA = headA + pointerB = headB + + # 遍历两个链表直到指针相交 + while pointerA != pointerB: + # 将指针向前移动一个节点 + pointerA = pointerA.next if pointerA else headB + pointerB = pointerB.next if pointerB else headA + + # 如果相交,指针将位于交点节点,如果没有交点,值为None + return pointerA +``` ### Go ```go From b2bfb8016642f388389250df57bad7e9cce82a3f Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Wed, 3 May 2023 17:27:27 -0500 Subject: [PATCH 1754/3019] =?UTF-8?q?Update=200142.=E7=8E=AF=E5=BD=A2?= =?UTF-8?q?=E9=93=BE=E8=A1=A8II.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\345\275\242\351\223\276\350\241\250II.md" | 50 +++++++++++++++---- 1 file changed, 40 insertions(+), 10 deletions(-) diff --git "a/problems/0142.\347\216\257\345\275\242\351\223\276\350\241\250II.md" "b/problems/0142.\347\216\257\345\275\242\351\223\276\350\241\250II.md" index 46df477705..e80a715a6c 100644 --- "a/problems/0142.\347\216\257\345\275\242\351\223\276\350\241\250II.md" +++ "b/problems/0142.\347\216\257\345\275\242\351\223\276\350\241\250II.md" @@ -221,25 +221,55 @@ public class Solution { Python: ```python +(版本一)快慢指针法 +# Definition for singly-linked list. +# class ListNode: +# def __init__(self, x): +# self.val = x +# self.next = None + + class Solution: def detectCycle(self, head: ListNode) -> ListNode: - slow, fast = head, head + slow = head + fast = head + while fast and fast.next: slow = slow.next fast = fast.next.next - # 如果相遇 + + # If there is a cycle, the slow and fast pointers will eventually meet if slow == fast: - p = head - q = slow - while p!=q: - p = p.next - q = q.next - #你也可以return q - return p - + # Move one of the pointers back to the start of the list + slow = head + while slow != fast: + slow = slow.next + fast = fast.next + return slow + # If there is no cycle, return None return None ``` +```python +(版本二)集合法 +# Definition for singly-linked list. +# class ListNode: +# def __init__(self, x): +# self.val = x +# self.next = None + +class Solution: + def detectCycle(self, head: ListNode) -> ListNode: + visited = set() + + while head: + if head in visited: + return head + visited.add(head) + head = head.next + + return None +``` Go: ```go From dd58553088514af1a1a019fb9e6d4b2e41b0aeb5 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Wed, 3 May 2023 19:26:39 -0500 Subject: [PATCH 1755/3019] =?UTF-8?q?Update=20=E4=BA=8C=E5=8F=89=E6=A0=91?= =?UTF-8?q?=E7=9A=84=E9=80=92=E5=BD=92=E9=81=8D=E5=8E=86.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...22\345\275\222\351\201\215\345\216\206.md" | 55 +++++++++---------- 1 file changed, 25 insertions(+), 30 deletions(-) diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" index 5a9a670add..8d5a5985e3 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" @@ -174,50 +174,45 @@ class Solution { Python: ```python # 前序遍历-递归-LC144_二叉树的前序遍历 +# 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 preorderTraversal(self, root: TreeNode) -> List[int]: - # 保存结果 - result = [] - - def traversal(root: TreeNode): - if root == None: - return - result.append(root.val) # 前序 - traversal(root.left) # 左 - traversal(root.right) # 右 - - traversal(root) - return result + if not root: + return [] + + left = self.preorderTraversal(root.left) + right = self.preorderTraversal(root.right) + + return [root.val] + left + right + # 中序遍历-递归-LC94_二叉树的中序遍历 class Solution: def inorderTraversal(self, root: TreeNode) -> List[int]: - result = [] + if root is None: + return [] - def traversal(root: TreeNode): - if root == None: - return - traversal(root.left) # 左 - result.append(root.val) # 中序 - traversal(root.right) # 右 + left = self.inorderTraversal(root.left) + right = self.inorderTraversal(root.right) - traversal(root) - return result + return left + [root.val] + right # 后序遍历-递归-LC145_二叉树的后序遍历 class Solution: def postorderTraversal(self, root: TreeNode) -> List[int]: - result = [] + if not root: + return [] - def traversal(root: TreeNode): - if root == None: - return - traversal(root.left) # 左 - traversal(root.right) # 右 - result.append(root.val) # 后序 + left = self.postorderTraversal(root.left) + right = self.postorderTraversal(root.right) - traversal(root) - return result + return left + right + [root.val] ``` Go: From dd1da7fc548c7ab7c1e0964f0ef50410be53e551 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Wed, 3 May 2023 19:27:58 -0500 Subject: [PATCH 1756/3019] =?UTF-8?q?Update=20=E4=BA=8C=E5=8F=89=E6=A0=91?= =?UTF-8?q?=E7=9A=84=E9=80=92=E5=BD=92=E9=81=8D=E5=8E=86.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\204\351\200\222\345\275\222\351\201\215\345\216\206.md" | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" index 8d5a5985e3..92f342f0db 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" @@ -191,7 +191,8 @@ class Solution: return [root.val] + left + right - +``` +```python # 中序遍历-递归-LC94_二叉树的中序遍历 class Solution: def inorderTraversal(self, root: TreeNode) -> List[int]: @@ -202,6 +203,9 @@ class Solution: right = self.inorderTraversal(root.right) return left + [root.val] + right +``` +```python + # 后序遍历-递归-LC145_二叉树的后序遍历 class Solution: From ce5b335b7258b7febb2dc831d68bfd3bb6161905 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Wed, 3 May 2023 19:30:53 -0500 Subject: [PATCH 1757/3019] =?UTF-8?q?Update=20=E4=BA=8C=E5=8F=89=E6=A0=91?= =?UTF-8?q?=E7=9A=84=E8=BF=AD=E4=BB=A3=E9=81=8D=E5=8E=86.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...04\350\277\255\344\273\243\351\201\215\345\216\206.md" | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" index 35cf4077a5..8b2414652c 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" @@ -258,7 +258,9 @@ class Solution: if node.left: stack.append(node.left) return result - +``` +```python + # 中序遍历-迭代-LC94_二叉树的中序遍历 class Solution: def inorderTraversal(self, root: TreeNode) -> List[int]: @@ -279,7 +281,9 @@ class Solution: # 取栈顶元素右结点 cur = cur.right return result - + ``` + ```python + # 后序遍历-迭代-LC145_二叉树的后序遍历 class Solution: def postorderTraversal(self, root: TreeNode) -> List[int]: From 0521f762d90b1af39fa4f134d219e2d208988e3b Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Wed, 3 May 2023 19:48:57 -0500 Subject: [PATCH 1758/3019] =?UTF-8?q?Update=200102.=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=A0=91=E7=9A=84=E5=B1=82=E5=BA=8F=E9=81=8D=E5=8E=86.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" index e777c2a4aa..29deee11a5 100644 --- "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" +++ "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" @@ -178,12 +178,11 @@ python3代码: # self.val = val # self.left = left # self.right = right -from collections import deque class Solution: def levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]: if not root: return [] - queue = deque([root]) + queue = collections.deque([root]) result = [] while queue: level = [] From 42f85c8a8f8c637dbb484ca0d0c9ab88973c3a0b Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Wed, 3 May 2023 19:56:26 -0500 Subject: [PATCH 1759/3019] =?UTF-8?q?Update=200102.=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=A0=91=E7=9A=84=E5=B1=82=E5=BA=8F=E9=81=8D=E5=8E=86.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...02\345\272\217\351\201\215\345\216\206.md" | 36 ++++++++++--------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" index 29deee11a5..a4164b2ca3 100644 --- "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" +++ "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" @@ -512,27 +512,29 @@ python代码: class Solution: """二叉树层序遍历II迭代解法""" +# 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 levelOrderBottom(self, root: TreeNode) -> List[List[int]]: - results = [] if not root: - return results - - from collections import deque - que = deque([root]) - - while que: - result = [] - for _ in range(len(que)): - cur = que.popleft() - result.append(cur.val) + return [] + queue = collections.deque([root]) + result = [] + while queue: + level = [] + for _ in range(len(queue)): + cur = queue.popleft() + level.append(cur.val) if cur.left: - que.append(cur.left) + queue.append(cur.left) if cur.right: - que.append(cur.right) - results.append(result) - - results.reverse() - return results + queue.append(cur.right) + result.append(level) + return result[::-1] ``` Java: From 52092d0153828a14179b41d041e99121a9b4f1f2 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Wed, 3 May 2023 20:01:07 -0500 Subject: [PATCH 1760/3019] =?UTF-8?q?Update=200102.=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=A0=91=E7=9A=84=E5=B1=82=E5=BA=8F=E9=81=8D=E5=8E=86.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...02\345\272\217\351\201\215\345\216\206.md" | 46 +++++++++---------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" index a4164b2ca3..fdfde82277 100644 --- "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" +++ "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" @@ -835,35 +835,35 @@ public: 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 rightSideView(self, root: TreeNode) -> List[int]: if not root: return [] - - # deque来自collections模块,不在力扣平台时,需要手动写入 - # 'from collections import deque' 导入 - # deque相比list的好处是,list的pop(0)是O(n)复杂度,deque的popleft()是O(1)复杂度 - - quene = deque([root]) - out_list = [] - - while quene: - # 每次都取最后一个node就可以了 - node = quene[-1] - out_list.append(node.val) - - # 执行这个遍历的目的是获取下一层所有的node - for _ in range(len(quene)): - node = quene.popleft() + + queue = collections.deque([root]) + right_view = [] + + while queue: + level_size = len(queue) + + for i in range(level_size): + node = queue.popleft() + + if i == level_size - 1: + right_view.append(node.val) + if node.left: - quene.append(node.left) + queue.append(node.left) if node.right: - quene.append(node.right) - - return out_list - -# 执行用时:36 ms, 在所有 Python3 提交中击败了89.47%的用户 -# 内存消耗:14.6 MB, 在所有 Python3 提交中击败了96.65%的用户 + queue.append(node.right) + + return right_view ``` From ae3fc9f57688e6369f593e6dab8e8f1d55a8c919 Mon Sep 17 00:00:00 2001 From: JaneyLin <105125897+janeyziqinglin@users.noreply.github.com> Date: Wed, 3 May 2023 21:02:58 -0400 Subject: [PATCH 1761/3019] =?UTF-8?q?Update=200053.=E6=9C=80=E5=A4=A7?= =?UTF-8?q?=E5=AD=90=E5=BA=8F=E5=92=8C=EF=BC=88=E5=8A=A8=E6=80=81=E8=A7=84?= =?UTF-8?q?=E5=88=92=EF=BC=89.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 题目已定义1 <= nums.length. --- ...\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" | 2 -- 1 file changed, 2 deletions(-) diff --git "a/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" "b/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" index c7d1b2fd7b..bd49091269 100644 --- "a/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" +++ "b/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" @@ -139,8 +139,6 @@ Python: ```python class Solution: def maxSubArray(self, nums: List[int]) -> int: - if len(nums) == 0: - return 0 dp = [0] * len(nums) dp[0] = nums[0] result = dp[0] From 95616fa9a8a147f3255ead5523af0a4de51844b9 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Wed, 3 May 2023 20:03:09 -0500 Subject: [PATCH 1762/3019] =?UTF-8?q?Update=200102.=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=A0=91=E7=9A=84=E5=B1=82=E5=BA=8F=E9=81=8D=E5=8E=86.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...02\345\272\217\351\201\215\345\216\206.md" | 47 ++++++++++++------- 1 file changed, 29 insertions(+), 18 deletions(-) diff --git "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" index fdfde82277..f4a5c466e3 100644 --- "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" +++ "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" @@ -1121,27 +1121,38 @@ python代码: class Solution: """二叉树层平均值迭代解法""" +# 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 averageOfLevels(self, root: TreeNode) -> List[float]: - results = [] if not root: - return results - - from collections import deque - que = deque([root]) - - while que: - size = len(que) - sum_ = 0 - for _ in range(size): - cur = que.popleft() - sum_ += cur.val - if cur.left: - que.append(cur.left) - if cur.right: - que.append(cur.right) - results.append(sum_ / size) + return [] - return results + queue = collections.deque([root]) + averages = [] + + while queue: + size = len(queue) + level_sum = 0 + + for i in range(size): + node = queue.popleft() + + + level_sum += node.val + + if node.left: + queue.append(node.left) + if node.right: + queue.append(node.right) + + averages.append(level_sum / size) + + return averages ``` java: From 7be18e2dd372a17288c8cb215b52dc5a06c1a240 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Wed, 3 May 2023 20:04:54 -0500 Subject: [PATCH 1763/3019] =?UTF-8?q?Update=200102.=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=A0=91=E7=9A=84=E5=B1=82=E5=BA=8F=E9=81=8D=E5=8E=86.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...02\345\272\217\351\201\215\345\216\206.md" | 46 +++++++++++-------- 1 file changed, 27 insertions(+), 19 deletions(-) diff --git "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" index f4a5c466e3..ed2c683d7a 100644 --- "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" +++ "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" @@ -1426,28 +1426,36 @@ public: python代码: ```python -class Solution: - """N叉树的层序遍历迭代法""" +""" +# Definition for a Node. +class Node: + def __init__(self, val=None, children=None): + self.val = val + self.children = children +""" +class Solution: def levelOrder(self, root: 'Node') -> List[List[int]]: - results = [] if not root: - return results - - from collections import deque - que = deque([root]) - - while que: - result = [] - for _ in range(len(que)): - cur = que.popleft() - result.append(cur.val) - # cur.children 是 Node 对象组成的列表,也可能为 None - if cur.children: - que.extend(cur.children) - results.append(result) - - return results + return [] + + result = [] + queue = collections.deque([root]) + + while queue: + level_size = len(queue) + level = [] + + for _ in range(level_size): + node = queue.popleft() + level.append(node.val) + + for child in node.children: + queue.append(child) + + result.append(level) + + return result ``` ```python From b794dccc5b40c1fa25dc2413edd0bbfda9e20aac Mon Sep 17 00:00:00 2001 From: JaneyLin <105125897+janeyziqinglin@users.noreply.github.com> Date: Wed, 3 May 2023 21:05:55 -0400 Subject: [PATCH 1764/3019] =?UTF-8?q?Update=200674.=E6=9C=80=E9=95=BF?= =?UTF-8?q?=E8=BF=9E=E7=BB=AD=E9=80=92=E5=A2=9E=E5=BA=8F=E5=88=97.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" "b/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" index 1e79b797d6..79a8311d78 100644 --- "a/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" +++ "b/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" @@ -212,7 +212,7 @@ class Solution: return 0 result = 1 dp = [1] * len(nums) - for i in range(len(nums)): + for i in range(len(nums)-1): if nums[i+1] > nums[i]: #连续记录 dp[i+1] = dp[i] + 1 result = max(result, dp[i+1]) From 994db141aa831866a5551d7c01c5d676252b9876 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Wed, 3 May 2023 20:06:39 -0500 Subject: [PATCH 1765/3019] =?UTF-8?q?Update=200102.=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=A0=91=E7=9A=84=E5=B1=82=E5=BA=8F=E9=81=8D=E5=8E=86.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...02\345\272\217\351\201\215\345\216\206.md" | 39 +++++++++++++------ 1 file changed, 27 insertions(+), 12 deletions(-) diff --git "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" index ed2c683d7a..6235ad21c0 100644 --- "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" +++ "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" @@ -1761,22 +1761,37 @@ public: 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 largestValues(self, root: TreeNode) -> List[int]: - if root is None: + if not root: return [] - queue = [root] - out_list = [] + + result = [] + queue = collections.deque([root]) + while queue: - length = len(queue) - in_list = [] - for _ in range(length): - curnode = queue.pop(0) - in_list.append(curnode.val) - if curnode.left: queue.append(curnode.left) - if curnode.right: queue.append(curnode.right) - out_list.append(max(in_list)) - return out_list + level_size = len(queue) + max_val = float('-inf') + + for _ in range(level_size): + node = queue.popleft() + max_val = max(max_val, node.val) + + if node.left: + queue.append(node.left) + + if node.right: + queue.append(node.right) + + result.append(max_val) + + return result ``` java代码: From ffab57f2c330f35a624bd7c9ce7dc9d444f0ff79 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Wed, 3 May 2023 20:09:12 -0500 Subject: [PATCH 1766/3019] =?UTF-8?q?Update=200102.=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=A0=91=E7=9A=84=E5=B1=82=E5=BA=8F=E9=81=8D=E5=8E=86.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...02\345\272\217\351\201\215\345\216\206.md" | 48 ++++++++++--------- 1 file changed, 26 insertions(+), 22 deletions(-) diff --git "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" index 6235ad21c0..47969b25fb 100644 --- "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" +++ "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" @@ -2096,36 +2096,40 @@ class Solution { python代码: ```python -# 层序遍历解法 +""" +# Definition for a Node. +class Node: + def __init__(self, val: int = 0, left: 'Node' = None, right: 'Node' = None, next: 'Node' = None): + self.val = val + self.left = left + self.right = right + self.next = next +""" class Solution: def connect(self, root: 'Node') -> 'Node': if not root: - return None - queue = [root] + return root + + queue = collections.deque([root]) + while queue: - n = len(queue) - for i in range(n): - node = queue.pop(0) + level_size = len(queue) + prev = None + + for i in range(level_size): + node = queue.popleft() + + if prev: + prev.next = node + + prev = node + if node.left: queue.append(node.left) + if node.right: queue.append(node.right) - if i == n - 1: - break - node.next = queue[0] - return root - -# 链表解法 -class Solution: - def connect(self, root: 'Node') -> 'Node': - first = root - while first: - cur = first - while cur: # 遍历每一层的节点 - if cur.left: cur.left.next = cur.right # 找左节点的next - if cur.right and cur.next: cur.right.next = cur.next.left # 找右节点的next - cur = cur.next # cur同层移动到下一节点 - first = first.left # 从本层扩展到下一层 + return root ``` From 65085c4e9bcf8c478fe67caad7dd0dceaa5911e0 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Wed, 3 May 2023 20:10:51 -0500 Subject: [PATCH 1767/3019] =?UTF-8?q?Update=200102.=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=A0=91=E7=9A=84=E5=B1=82=E5=BA=8F=E9=81=8D=E5=8E=86.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...02\345\272\217\351\201\215\345\216\206.md" | 44 ++++++++++++++----- 1 file changed, 32 insertions(+), 12 deletions(-) diff --git "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" index 47969b25fb..89e7a1265e 100644 --- "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" +++ "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" @@ -2381,21 +2381,41 @@ python代码: ```python # 层序遍历解法 +""" +# Definition for a Node. +class Node: + def __init__(self, val: int = 0, left: 'Node' = None, right: 'Node' = None, next: 'Node' = None): + self.val = val + self.left = left + self.right = right + self.next = next +""" + class Solution: def connect(self, root: 'Node') -> 'Node': if not root: - return None - queue = [root] - while queue: # 遍历每一层 - length = len(queue) - tail = None # 每一层维护一个尾节点 - for i in range(length): # 遍历当前层 - curnode = queue.pop(0) - if tail: - tail.next = curnode # 让尾节点指向当前节点 - tail = curnode # 让当前节点成为尾节点 - if curnode.left : queue.append(curnode.left) - if curnode.right: queue.append(curnode.right) + return root + + queue = collections.deque([root]) + + while queue: + level_size = len(queue) + prev = None + + for i in range(level_size): + node = queue.popleft() + + if prev: + prev.next = node + + prev = node + + if node.left: + queue.append(node.left) + + if node.right: + queue.append(node.right) + return root ``` From 61173277185bf7948ffb576212cc31fd383778e3 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Wed, 3 May 2023 20:12:16 -0500 Subject: [PATCH 1768/3019] =?UTF-8?q?Update=200102.=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=A0=91=E7=9A=84=E5=B1=82=E5=BA=8F=E9=81=8D=E5=8E=86.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...02\345\272\217\351\201\215\345\216\206.md" | 31 ++++++++++++------- 1 file changed, 19 insertions(+), 12 deletions(-) diff --git "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" index 89e7a1265e..13694207ac 100644 --- "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" +++ "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" @@ -2664,24 +2664,31 @@ class Solution { Python: ```python 3 +# 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 maxDepth(self, root: TreeNode) -> int: - if root == None: + if not root: return 0 - - queue_ = [root] + depth = 0 - while queue_: - length = len(queue_) - for i in range(length): - cur = queue_.pop(0) - sub.append(cur.val) - #子节点入队列 - if cur.left: queue_.append(cur.left) - if cur.right: queue_.append(cur.right) + queue = collections.deque([root]) + + while queue: depth += 1 - + for _ in range(len(queue)): + node = queue.popleft() + if node.left: + queue.append(node.left) + if node.right: + queue.append(node.right) + return depth + ``` Go: From de7c67c35a5d3d0e423072d0b7cb02876c628786 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Wed, 3 May 2023 20:13:38 -0500 Subject: [PATCH 1769/3019] =?UTF-8?q?Update=200102.=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=A0=91=E7=9A=84=E5=B1=82=E5=BA=8F=E9=81=8D=E5=8E=86.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...02\345\272\217\351\201\215\345\216\206.md" | 33 ++++++++++--------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" index 13694207ac..c2ad950814 100644 --- "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" +++ "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" @@ -2938,23 +2938,26 @@ Python 3: # self.right = right class Solution: def minDepth(self, root: TreeNode) -> int: - if root == None: + if not root: return 0 + depth = 0 + queue = collections.deque([root]) + + while queue: + depth += 1 + for _ in range(len(queue)): + node = queue.popleft() + + if not node.left and not node.right: + return depth + + if node.left: + queue.append(node.left) + + if node.right: + queue.append(node.right) - #根节点的深度为1 - queue_ = [(root,1)] - while queue_: - cur, depth = queue_.pop(0) - - if cur.left == None and cur.right == None: - return depth - #先左子节点,由于左子节点没有孩子,则就是这一层了 - if cur.left: - queue_.append((cur.left,depth + 1)) - if cur.right: - queue_.append((cur.right,depth + 1)) - - return 0 + return depth ``` Go: From 54bcab13e37ee1e609b567411b968bdb5a86abac Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Wed, 3 May 2023 20:25:30 -0500 Subject: [PATCH 1770/3019] =?UTF-8?q?Update=200226.=E7=BF=BB=E8=BD=AC?= =?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 --- ...54\344\272\214\345\217\211\346\240\221.md" | 161 +++++++++++++----- 1 file changed, 119 insertions(+), 42 deletions(-) diff --git "a/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" "b/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" index 16a5be577d..63baa409dd 100644 --- "a/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" @@ -314,81 +314,158 @@ class Solution { 递归法:前序遍历: ```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 invertTree(self, root: TreeNode) -> TreeNode: if not root: return None - root.left, root.right = root.right, root.left #中 - self.invertTree(root.left) #左 - self.invertTree(root.right) #右 + root.left, root.right = root.right, root.left + self.invertTree(root.left) + self.invertTree(root.right) + return root +``` + +迭代法:前序遍历: +```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 invertTree(self, root: TreeNode) -> TreeNode: + if not root: + return None + stack = [root] + while stack: + node = stack.pop() + node.left, node.right = node.right, node.left + if node.left: + stack.append(node.left) + if node.right: + stack.append(node.right) + return root +``` + + +递归法:中序遍历: +```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 invertTree(self, root: TreeNode) -> TreeNode: + if not root: + return None + self.invertTree(root.left) + root.left, root.right = root.right, root.left + self.invertTree(root.left) + return root +``` + +迭代法:中序遍历: +```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 invertTree(self, root: TreeNode) -> TreeNode: + if not root: + return None + stack = [root] + while stack: + node = stack.pop() + if node.left: + stack.append(node.left) + node.left, node.right = node.right, node.left + if node.left: + stack.append(node.left) return root ``` + 递归法:后序遍历: ```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 invertTree(self, root: TreeNode) -> TreeNode: - if root is None: + if not root: return None self.invertTree(root.left) self.invertTree(root.right) root.left, root.right = root.right, root.left - return root + return root ``` -迭代法:深度优先遍历(前序遍历): +迭代法:后序遍历: ```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 invertTree(self, root: TreeNode) -> TreeNode: if not root: - return root - st = [] - st.append(root) - while st: - node = st.pop() - node.left, node.right = node.right, node.left #中 - if node.right: - st.append(node.right) #右 + return None + stack = [root] + while stack: + node = stack.pop() if node.left: - st.append(node.left) #左 + stack.append(node.left) + if node.right: + stack.append(node.right) + node.left, node.right = node.right, node.left + return root ``` + + + + 迭代法:广度优先遍历(层序遍历): ```python -import collections +# 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 invertTree(self, root: TreeNode) -> TreeNode: - queue = collections.deque() #使用deque() - if root: - queue.append(root) + if not root: + return None + + queue = collections.deque([root]) while queue: - size = len(queue) - for i in range(size): + for i in range(len(queue)): node = queue.popleft() - node.left, node.right = node.right, node.left #节点处理 - if node.left: - queue.append(node.left) - if node.right: - queue.append(node.right) - return root -``` -迭代法:广度优先遍历(层序遍历),和之前的层序遍历写法一致: -```python -class Solution: - def invertTree(self, root: Optional[TreeNode]) -> Optional[TreeNode]: - if not root: return root - from collections import deque - que=deque([root]) - while que: - size=len(que) - for i in range(size): - cur=que.popleft() - cur.left, cur.right = cur.right, cur.left - if cur.left: que.append(cur.left) - if cur.right: que.append(cur.right) + node.left, node.right = node.right, node.left + if node.left: queue.append(node.left) + if node.right: queue.append(node.right) return root + ``` + ### Go 递归版本的前序遍历 From 918d0ec0faf27870212b11c4820d4ae956ba8da3 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Wed, 3 May 2023 20:40:43 -0500 Subject: [PATCH 1771/3019] =?UTF-8?q?Update=200101.=E5=AF=B9=E7=A7=B0?= =?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 --- ...60\344\272\214\345\217\211\346\240\221.md" | 40 +++++++++++-------- 1 file changed, 23 insertions(+), 17 deletions(-) diff --git "a/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" "b/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" index b75e9ff2da..81ca79a2e2 100644 --- "a/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" @@ -442,25 +442,31 @@ class Solution: 层次遍历 ```python class Solution: - def isSymmetric(self, root: Optional[TreeNode]) -> bool: + def isSymmetric(self, root: TreeNode) -> bool: if not root: return True - - que = [root] - while que: - this_level_length = len(que) - for i in range(this_level_length // 2): - # 要么其中一个是None但另外一个不是 - if (not que[i] and que[this_level_length - 1 - i]) or (que[i] and not que[this_level_length - 1 - i]): - return False - # 要么两个都不是None - if que[i] and que[i].val != que[this_level_length - 1 - i].val: - return False - for i in range(this_level_length): - if not que[i]: continue - que.append(que[i].left) - que.append(que[i].right) - que = que[this_level_length:] + + queue = collections.deque([root.left, root.right]) + + while queue: + level_size = len(queue) + + if level_size % 2 != 0: + return False + + level_vals = [] + for i in range(level_size): + node = queue.popleft() + if node: + level_vals.append(node.val) + queue.append(node.left) + queue.append(node.right) + else: + level_vals.append(None) + + if level_vals != level_vals[::-1]: + return False + return True ``` From aac7378cb62ed2ec36fc1012f0057844297bda67 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Wed, 3 May 2023 21:40:49 -0500 Subject: [PATCH 1772/3019] =?UTF-8?q?Update=200104.=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=A0=91=E7=9A=84=E6=9C=80=E5=A4=A7=E6=B7=B1=E5=BA=A6.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...00\345\244\247\346\267\261\345\272\246.md" | 25 ++++++++++++------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git "a/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" "b/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" index 36578fd343..2294c1d943 100644 --- "a/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" +++ "b/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" @@ -419,26 +419,33 @@ class solution: return 1 + max(self.maxdepth(root.left), self.maxdepth(root.right)) ``` -迭代法: +层序遍历迭代法: ```python -import collections -class solution: - def maxdepth(self, root: treenode) -> int: +# 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 maxDepth(self, root: TreeNode) -> int: if not root: return 0 - depth = 0 #记录深度 - queue = collections.deque() - queue.append(root) + + depth = 0 + queue = collections.deque([root]) + while queue: - size = len(queue) depth += 1 - for i in range(size): + for _ in range(len(queue)): node = queue.popleft() if node.left: queue.append(node.left) if node.right: queue.append(node.right) + return depth + ``` ### 559.n叉树的最大深度 From 5da51519b5692ef2f450ba38b6299452a00f3b22 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Wed, 3 May 2023 21:48:04 -0500 Subject: [PATCH 1773/3019] =?UTF-8?q?Update=200104.=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=A0=91=E7=9A=84=E6=9C=80=E5=A4=A7=E6=B7=B1=E5=BA=A6.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...34\200\345\244\247\346\267\261\345\272\246.md" | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git "a/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" "b/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" index 2294c1d943..c4d94d4d98 100644 --- "a/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" +++ "b/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" @@ -452,14 +452,17 @@ class Solution: 递归法: ```python -class solution: - def maxdepth(self, root: 'node') -> int: +class Solution: + def maxDepth(self, root: 'Node') -> int: if not root: return 0 - depth = 0 - for i in range(len(root.children)): - depth = max(depth, self.maxdepth(root.children[i])) - return depth + 1 + + max_depth = 1 + + for child in root.children: + max_depth = max(max_depth, self.maxDepth(child) + 1) + + return max_depth ``` 迭代法: From be27cc547daf4c82a048b71f201c93ed3b2b3e2e Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Wed, 3 May 2023 21:57:13 -0500 Subject: [PATCH 1774/3019] =?UTF-8?q?Update=200104.=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=A0=91=E7=9A=84=E6=9C=80=E5=A4=A7=E6=B7=B1=E5=BA=A6.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...00\345\244\247\346\267\261\345\272\246.md" | 33 ++++++++++++------- 1 file changed, 21 insertions(+), 12 deletions(-) diff --git "a/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" "b/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" index c4d94d4d98..c55ddb3f3d 100644 --- "a/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" +++ "b/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" @@ -467,22 +467,31 @@ class Solution: 迭代法: ```python -import collections -class solution: - def maxdepth(self, root: 'node') -> int: - queue = collections.deque() - if root: - queue.append(root) - depth = 0 #记录深度 +""" +# Definition for a Node. +class Node: + def __init__(self, val=None, children=None): + self.val = val + self.children = children +""" + +class Solution: + def maxDepth(self, root: TreeNode) -> int: + if not root: + return 0 + + depth = 0 + queue = collections.deque([root]) + while queue: - size = len(queue) depth += 1 - for i in range(size): + for _ in range(len(queue)): node = queue.popleft() - for j in range(len(node.children)): - if node.children[j]: - queue.append(node.children[j]) + for child in node.children: + queue.append(child) + return depth + ``` 使用栈来模拟后序遍历依然可以 From 1b1b51750db1afcb812ba1250ea4fdc3e0395425 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Wed, 3 May 2023 22:04:25 -0500 Subject: [PATCH 1775/3019] =?UTF-8?q?Update=200104.=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=A0=91=E7=9A=84=E6=9C=80=E5=A4=A7=E6=B7=B1=E5=BA=A6.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...00\345\244\247\346\267\261\345\272\246.md" | 48 ++++++++++--------- 1 file changed, 25 insertions(+), 23 deletions(-) diff --git "a/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" "b/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" index c55ddb3f3d..b6208169a4 100644 --- "a/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" +++ "b/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" @@ -494,30 +494,32 @@ class Solution: ``` -使用栈来模拟后序遍历依然可以 +使用栈 ```python -class solution: - def maxdepth(self, root: 'node') -> int: - st = [] - if root: - st.append(root) - depth = 0 - result = 0 - while st: - node = st.pop() - if node != none: - st.append(node) #中 - st.append(none) - depth += 1 - for i in range(len(node.children)): #处理孩子 - if node.children[i]: - st.append(node.children[i]) - - else: - node = st.pop() - depth -= 1 - result = max(result, depth) - return result +""" +# Definition for a Node. +class Node: + def __init__(self, val=None, children=None): + self.val = val + self.children = children +""" + +class Solution: + def maxDepth(self, root: 'Node') -> int: + if not root: + return 0 + + max_depth = 0 + + stack = [(root, 1)] + + while stack: + node, depth = stack.pop() + max_depth = max(max_depth, depth) + for child in node.children: + stack.append((child, depth + 1)) + + return max_depth ``` From 75d137eb1c0464de0321f611ed66125e322936e7 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Thu, 4 May 2023 00:23:53 -0500 Subject: [PATCH 1776/3019] =?UTF-8?q?Update=200111.=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=A0=91=E7=9A=84=E6=9C=80=E5=B0=8F=E6=B7=B1=E5=BA=A6.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...00\345\260\217\346\267\261\345\272\246.md" | 59 ++++++++++++------- 1 file changed, 39 insertions(+), 20 deletions(-) diff --git "a/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" "b/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" index de36c6f25a..bda12ff08b 100644 --- "a/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" +++ "b/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" @@ -300,44 +300,63 @@ class Solution { 递归法: ```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 minDepth(self, root: TreeNode) -> int: if not root: return 0 + if not root.left and not root.right: return 1 - - min_depth = 10**9 + + left_depth = float('inf') + right_depth = float('inf') + if root.left: - min_depth = min(self.minDepth(root.left), min_depth) # 获得左子树的最小高度 + left_depth = self.minDepth(root.left) if root.right: - min_depth = min(self.minDepth(root.right), min_depth) # 获得右子树的最小高度 - return min_depth + 1 + right_depth = self.minDepth(root.right) + + return 1 + min(left_depth, right_depth) + ``` 迭代法: ```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 minDepth(self, root: TreeNode) -> int: if not root: return 0 - que = deque() - que.append(root) - res = 1 - - while que: - for _ in range(len(que)): - node = que.popleft() - # 当左右孩子都为空的时候,说明是最低点的一层了,退出 + depth = 0 + queue = collections.deque([root]) + + while queue: + depth += 1 + for _ in range(len(queue)): + node = queue.popleft() + if not node.left and not node.right: - return res - if node.left is not None: - que.append(node.left) - if node.right is not None: - que.append(node.right) - res += 1 - return res + return depth + + if node.left: + queue.append(node.left) + + if node.right: + queue.append(node.right) + + return depth ``` From d15c54f43fe0df608d207f269e8bb589c5cebd3d Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Thu, 4 May 2023 00:26:20 -0500 Subject: [PATCH 1777/3019] =?UTF-8?q?Update=200111.=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=A0=91=E7=9A=84=E6=9C=80=E5=B0=8F=E6=B7=B1=E5=BA=A6.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...00\345\260\217\346\267\261\345\272\246.md" | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git "a/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" "b/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" index bda12ff08b..0c086f1bbb 100644 --- "a/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" +++ "b/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" @@ -359,6 +359,39 @@ class Solution: return depth ``` +迭代法: + +```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 minDepth(self, root: TreeNode) -> int: + if not root: + return 0 + + queue = collections.deque([(root, 1)]) + + while queue: + node, depth = queue.popleft() + + # Check if the node is a leaf node + if not node.left and not node.right: + return depth + + # Add left and right child to the queue + if node.left: + queue.append((node.left, depth+1)) + if node.right: + queue.append((node.right, depth+1)) + + return 0 + +``` ## Go From 3d59f732e0479c12657f5a6020b4ed5784222780 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Thu, 4 May 2023 01:35:13 -0500 Subject: [PATCH 1778/3019] =?UTF-8?q?Update=200222.=E5=AE=8C=E5=85=A8?= =?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=A0=91=E7=9A=84=E8=8A=82=E7=82=B9=E4=B8=AA?= =?UTF-8?q?=E6=95=B0.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...212\202\347\202\271\344\270\252\346\225\260.md" | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git "a/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" "b/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" index d89a9bcea6..795a6f3777 100644 --- "a/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" +++ "b/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" @@ -393,6 +393,20 @@ class Solution: # 利用完全二叉树特性 return 2**count-1 return 1+self.countNodes(root.left)+self.countNodes(root.right) ``` +完全二叉树写法3 +```python +class Solution: # 利用完全二叉树特性 + def countNodes(self, root: TreeNode) -> int: + if not root: return 0 + count = 0 + left = root.left; right = root.right + while left and right: + count+=1 + left = left.left; right = right.right + if not left and not right: # 如果同时到底说明是满二叉树,反之则不是 + return (2< Date: Thu, 4 May 2023 21:49:12 -0500 Subject: [PATCH 1779/3019] =?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 --- ...241\344\272\214\345\217\211\346\240\221.md" | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git "a/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" "b/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" index 804c95eb27..a3bc77fb11 100644 --- "a/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" @@ -532,6 +532,24 @@ class Solution: else: return 1 + max(left_height, right_height) ``` +递归法精简版: + +```python +class Solution: + def isBalanced(self, root: TreeNode) -> bool: + return self.height(root) != -1 + def height(self, node: TreeNode) -> int: + if not node: + return 0 + left = self.height(node.left) + if left == -1: + return -1 + right = self.height(node.right) + if right == -1 or abs(left - right) > 1: + return -1 + return max(left, right) + 1 +``` + 迭代法: From debaa5e4a0cb16a58f226e04b0865ce1b423f122 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Thu, 4 May 2023 22:54:49 -0500 Subject: [PATCH 1780/3019] =?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 --- ...00\346\234\211\350\267\257\345\276\204.md" | 65 +++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git "a/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" "b/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" index 8c542ceaa4..c396f4a0fb 100644 --- "a/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" +++ "b/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" @@ -468,6 +468,71 @@ 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 +import copy +from typing import List, Optional + +class Solution: + def binaryTreePaths(self, root: Optional[TreeNode]) -> List[str]: + if not root: + return [] + result = [] + self.generate_paths(root, [], result) + return result + + def generate_paths(self, node: TreeNode, path: List[int], result: List[str]) -> None: + path.append(node.val) + if not node.left and not node.right: + result.append('->'.join(map(str, path))) + if node.left: + self.generate_paths(node.left, copy.copy(path), result) + if node.right: + self.generate_paths(node.right, copy.copy(path), result) + path.pop() + + +``` +递归法+回溯(版本二) +```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 +import copy +from typing import List, Optional + +class Solution: + def binaryTreePaths(self, root: Optional[TreeNode]) -> List[str]: + if not root: + return [] + result = [] + self.generate_paths(root, [], result) + return result + + def generate_paths(self, node: TreeNode, path: List[int], result: List[str]) -> None: + if not node: + return + path.append(node.val) + if not node.left and not node.right: + result.append('->'.join(map(str, path))) + else: + self.generate_paths(node.left, copy.copy(path), result) + self.generate_paths(node.right, copy.copy(path), result) + path.pop() + +``` + 递归法+隐形回溯 ```Python # Definition for a binary tree node. From 3b0000a280b2e6a5b1bb033556cbc77e793736fb Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Thu, 4 May 2023 23:26:06 -0500 Subject: [PATCH 1781/3019] =?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 --- ...66\345\255\220\344\271\213\345\222\214.md" | 26 ++++++++++++------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git "a/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" "b/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" index cf5441c4c4..617978b743 100644 --- "a/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" +++ "b/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" @@ -250,19 +250,27 @@ class Solution { **递归后序遍历** ```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 sumOfLeftLeaves(self, root: TreeNode) -> int: - if not root: + def sumOfLeftLeaves(self, root: Optional[TreeNode]) -> int: + if not root: return 0 - left_left_leaves_sum = self.sumOfLeftLeaves(root.left) # 左 - right_left_leaves_sum = self.sumOfLeftLeaves(root.right) # 右 - - 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 + # 检查根节点的左子节点是否为叶节点 + if root.left and not root.left.left and not root.left.right: + left_val = root.left.val + else: + left_val = self.sumOfLeftLeaves(root.left) - return cur_left_leaf_val + left_left_leaves_sum + right_left_leaves_sum # 中 + # 递归地计算右子树左叶节点的和 + right_val = self.sumOfLeftLeaves(root.right) + + return left_val + right_val ``` **迭代** From efc06ad7fdebe84477904b05c2e97b0adce6bedc Mon Sep 17 00:00:00 2001 From: Logen <47022821+Logenleedev@users.noreply.github.com> Date: Fri, 5 May 2023 13:57:17 -0500 Subject: [PATCH 1782/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=96=B0=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 --- ...\345\244\247\345\205\203\347\264\240II.md" | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git "a/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" "b/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" index bf65120923..3fd4b3b6db 100644 --- "a/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" +++ "b/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" @@ -164,6 +164,7 @@ class Solution { Python: ```python +# 方法 1: class Solution: def nextGreaterElements(self, nums: List[int]) -> List[int]: dp = [-1] * len(nums) @@ -174,6 +175,26 @@ class Solution: stack.pop() stack.append(i%len(nums)) return dp + +# 方法 2: +class Solution: + def nextGreaterElement(self, nums1: List[int], nums2: List[int]) -> List[int]: + stack = [] + # 创建答案数组 + ans = [-1] * len(nums1) + for i in range(len(nums2)): + while len(stack) > 0 and nums2[i] > nums2[stack[-1]]: + # 判断 num1 是否有 nums2[stack[-1]]。如果没有这个判断会出现指针异常 + if nums2[stack[-1]] in nums1: + # 锁定 num1 检索的 index + index = nums1.index(nums2[stack[-1]]) + # 更新答案数组 + ans[index] = nums2[i] + # 弹出小元素 + # 这个代码一定要放在 if 外面。否则单调栈的逻辑就不成立了 + stack.pop() + stack.append(i) + return ans ``` Go: ```go From 4224c17e54e164141ca2f6a08978402ae115fea5 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Fri, 5 May 2023 19:18:26 -0500 Subject: [PATCH 1783/3019] =?UTF-8?q?Update=20=E9=9D=A2=E8=AF=95=E9=A2=980?= =?UTF-8?q?2.07.=E9=93=BE=E8=A1=A8=E7=9B=B8=E4=BA=A4.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...76\350\241\250\347\233\270\344\272\244.md" | 36 ++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git "a/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" "b/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" index 4bcbd1f920..dda7f2ad00 100644 --- "a/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" +++ "b/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" @@ -214,7 +214,41 @@ class Solution: return head ``` ```python -(版本三)等比例法 +(版本三)求长度,同时出发 (代码复用 + 精简) +class Solution: + def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> ListNode: + dis = self.getLength(headA) - self.getLength(headB) + + # 通过移动较长的链表,使两链表长度相等 + if dis > 0: + headA = self.moveForward(headA, dis) + else: + headB = self.moveForward(headB, abs(dis)) + + # 将两个头向前移动,直到它们相交 + while headA and headB: + if headA == headB: + return headA + headA = headA.next + headB = headB.next + + return None + + def getLength(self, head: ListNode) -> int: + length = 0 + while head: + length += 1 + head = head.next + return length + + def moveForward(self, head: ListNode, steps: int) -> ListNode: + while steps > 0: + head = head.next + steps -= 1 + return head +``` +```python +(版本四)等比例法 # Definition for singly-linked list. # class ListNode: # def __init__(self, x): From d590d268d717b0241c5d900f70e9356bf3c88903 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Fri, 5 May 2023 19:50:20 -0500 Subject: [PATCH 1784/3019] =?UTF-8?q?Update=200242.=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=8D.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...15\345\274\202\344\275\215\350\257\215.md" | 55 ++++++++++++++++--- 1 file changed, 47 insertions(+), 8 deletions(-) diff --git "a/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" "b/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" index 1006ea3552..0e5683c794 100644 --- "a/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" +++ "b/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" @@ -122,6 +122,21 @@ class Solution { ``` Python: +(版本一) 使用数组 +```python +class Solution: + def isAnagram(self, s: str, t: str) -> bool: + record = [0] * 26 + for i in range(len(s)): + record[ord(s[i]) - ord("a")] += 1 + for i in range(len(t)): + record[ord(t[i]) - ord("a")] -= 1 + for i in range(26): + if record[i] != 0: + return False + return True +``` +(版本二) 使用数组 ```python class Solution: def isAnagram(self, s: str, t: str) -> bool: @@ -138,12 +153,13 @@ class Solution: return True ``` -Python写法二(没有使用数组作为哈希表,只是介绍defaultdict这样一种解题思路): +(版本三) 使用defaultdict ```python +from collections import defaultdict + class Solution: def isAnagram(self, s: str, t: str) -> bool: - from collections import defaultdict s_dict = defaultdict(int) t_dict = defaultdict(int) @@ -156,17 +172,40 @@ class Solution: return s_dict == t_dict ``` -Python写法三(没有使用数组作为哈希表,只是介绍Counter这种更方便的解题思路): +(版本四) 使用字典 + +```python +class Solution: + def isAnagram(self, s: str, t: str) -> bool: + if len(s) != len(t): + return False + + hash_table_s = {} + hash_table_t = {} + + for i in range(len(s)): + hash_table_s[s[i]] = hash_table_s.get(s[i], 0) + 1 + hash_table_t[t[i]] = hash_table_t.get(t[i], 0) + 1 + + return hash_table_s == hash_table_t +``` + +(版本五) 使用排序 ```python -class Solution(object): +class Solution: def isAnagram(self, s: str, t: str) -> bool: - from collections import Counter - a_count = Counter(s) - b_count = Counter(t) - return a_count == b_count + return sorted(s) == sorted(t) ``` +(版本六) 使用Counter + +```python +from collections import Counter +class Solution: + def isAnagram(self, s: str, t: str) -> bool: + return Counter(s) == Counter(t) +``` Go: ```go From 3065cf38604dd672ad128a445b98c356604eb24e Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Fri, 5 May 2023 20:04:47 -0500 Subject: [PATCH 1785/3019] =?UTF-8?q?Update=200349.=E4=B8=A4=E4=B8=AA?= =?UTF-8?q?=E6=95=B0=E7=BB=84=E7=9A=84=E4=BA=A4=E9=9B=86.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...04\347\232\204\344\272\244\351\233\206.md" | 32 +++++++++++++------ 1 file changed, 23 insertions(+), 9 deletions(-) diff --git "a/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" "b/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" index 0da0e30c37..c2f6ef46ba 100644 --- "a/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" +++ "b/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" @@ -160,22 +160,29 @@ class Solution { ``` Python3: +(版本一) 使用字典和集合 ```python class Solution: def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]: - val_dict = {} - ans = [] + # 使用哈希表存储一个数组中的所有元素 + table = {} for num in nums1: - val_dict[num] = 1 - + table[num] = table.get(num, 0) + 1 + + # 使用集合存储结果 + res = set() for num in nums2: - if num in val_dict.keys() and val_dict[num] == 1: - ans.append(num) - val_dict[num] = 0 + if num in table: + res.add(num) + del table[num] - return ans + return list(res) +``` +(版本二) 使用数组 + +```python -class Solution: # 使用数组方法 +class Solution: def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]: count1 = [0]*1001 count2 = [0]*1001 @@ -190,7 +197,14 @@ class Solution: # 使用数组方法 return result ``` +(版本三) 使用集合 +```python +class Solution: + def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]: + return list(set(nums1) & set(nums2)) + +``` Go: ```go From eeae3282a87c334f726fc3c8cd5dabd5b71c4612 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Fri, 5 May 2023 20:25:46 -0500 Subject: [PATCH 1786/3019] =?UTF-8?q?Update=200202.=E5=BF=AB=E4=B9=90?= =?UTF-8?q?=E6=95=B0.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...2.\345\277\253\344\271\220\346\225\260.md" | 96 +++++++++++++++---- 1 file changed, 76 insertions(+), 20 deletions(-) diff --git "a/problems/0202.\345\277\253\344\271\220\346\225\260.md" "b/problems/0202.\345\277\253\344\271\220\346\225\260.md" index 5ac29e8639..7fe8cd8d75 100644 --- "a/problems/0202.\345\277\253\344\271\220\346\225\260.md" +++ "b/problems/0202.\345\277\253\344\271\220\346\225\260.md" @@ -108,23 +108,14 @@ class Solution { ``` Python: +(版本一)使用集合 ```python class Solution: - def isHappy(self, n: int) -> bool: - def calculate_happy(num): - sum_ = 0 - - # 从个位开始依次取,平方求和 - while num: - sum_ += (num % 10) ** 2 - num = num // 10 - return sum_ - - # 记录中间结果 + def isHappy(self, n: int) -> bool: record = set() while True: - n = calculate_happy(n) + n = self.get_sum(n) if n == 1: return True @@ -134,21 +125,86 @@ class Solution: else: record.add(n) -# python的另一种写法 - 通过字符串来计算各位平方和 + def get_sum(self,n: int) -> int: + new_num = 0 + while n: + n, r = divmod(n, 10) + new_num += r ** 2 + return new_num + ``` + (版本二)使用集合 + ```python +class Solution: + def isHappy(self, n: int) -> bool: + record = set() + while n not in record: + record.add(n) + new_num = 0 + n_str = str(n) + for i in n_str: + new_num+=int(i)**2 + if new_num==1: return True + else: n = new_num + return False +``` + (版本三)使用数组 + ```python class Solution: def isHappy(self, n: int) -> bool: record = [] while n not in record: record.append(n) - newn = 0 - nn = str(n) - for i in nn: - newn+=int(i)**2 - if newn==1: return True - n = newn + new_num = 0 + n_str = str(n) + for i in n_str: + new_num+=int(i)**2 + if new_num==1: return True + else: n = new_num return False ``` - + (版本四)使用快慢指针 + ```python +class Solution: + def isHappy(self, n: int) -> bool: + slow = n + fast = n + while self.get_sum(fast) != 1 and self.get_sum(self.get_sum(fast)): + slow = self.get_sum(slow) + fast = self.get_sum(self.get_sum(fast)) + if slow == fast: + return False + return True + def get_sum(self,n: int) -> int: + new_num = 0 + while n: + n, r = divmod(n, 10) + new_num += r ** 2 + return new_num +``` + (版本五)使用集合+精简 + ```python +class Solution: + def isHappy(self, n: int) -> bool: + seen = set() + while n != 1: + n = sum(int(i) ** 2 for i in str(n)) + if n in seen: + return False + seen.add(n) + return True +``` + (版本六)使用数组+精简 + ```python +class Solution: + def isHappy(self, n: int) -> bool: + seen = [] + while n != 1: + n = sum(int(i) ** 2 for i in str(n)) + if n in seen: + return False + seen.append(n) + return True +``` Go: ```go func isHappy(n int) bool { From 7118f36b66e1def134fda97e992affbd0c5cd79b Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Fri, 5 May 2023 20:38:05 -0500 Subject: [PATCH 1787/3019] =?UTF-8?q?Update=200001.=E4=B8=A4=E6=95=B0?= =?UTF-8?q?=E4=B9=8B=E5=92=8C.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...44\346\225\260\344\271\213\345\222\214.md" | 49 ++++++++++++++++++- 1 file changed, 48 insertions(+), 1 deletion(-) diff --git "a/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" "b/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" index eea3ba7a44..1af8787bab 100644 --- "a/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" @@ -151,7 +151,7 @@ public int[] twoSum(int[] nums, int target) { ``` Python: - +(版本一) 使用字典 ```python class Solution: def twoSum(self, nums: List[int], target: int) -> List[int]: @@ -163,6 +163,53 @@ class Solution: records[value] = index # 遍历当前元素,并在map中寻找是否有匹配的key return [] ``` +(版本二)使用集合 +```python +class Solution: + def twoSum(self, nums: List[int], target: int) -> List[int]: + #创建一个集合来存储我们目前看到的数字 + seen = set() + for i, num in enumerate(nums): + complement = target - num + if complement in seen: + return [nums.index(complement), i] + seen.add(num) +``` +(版本三)使用双指针 +```python +class Solution: + def twoSum(self, nums: List[int], target: int) -> List[int]: + # 对输入列表进行排序 + nums_sorted = sorted(nums) + + # 使用双指针 + left = 0 + right = len(nums_sorted) - 1 + while left < right: + current_sum = nums_sorted[left] + nums_sorted[right] + if current_sum == target: + # 如果和等于目标数,则返回两个数的下标 + left_index = nums.index(nums_sorted[left]) + right_index = nums.index(nums_sorted[right]) + if left_index == right_index: + right_index = nums[left_index+1:].index(nums_sorted[right]) + left_index + 1 + return [left_index, right_index] + elif current_sum < target: + # 如果总和小于目标,则将左侧指针向右移动 + left += 1 + else: + # 如果总和大于目标值,则将右指针向左移动 + right -= 1 +``` +(版本四)暴力法 +```python +class Solution: + def twoSum(self, nums: List[int], target: int) -> List[int]: + for i in range(len(nums)): + for j in range(i+1, len(nums)): + if nums[i] + nums[j] == target: + return [i,j] +``` Go: From 0905d2c7871daca4adb18566f86216a83e7894bc Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Fri, 5 May 2023 20:46:57 -0500 Subject: [PATCH 1788/3019] =?UTF-8?q?Update=200454.=E5=9B=9B=E6=95=B0?= =?UTF-8?q?=E7=9B=B8=E5=8A=A0II.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...3\233\346\225\260\347\233\270\345\212\240II.md" | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git "a/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" "b/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" index 411b60e872..7818c02b5d 100644 --- "a/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" +++ "b/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" @@ -125,11 +125,11 @@ class Solution { ``` Python: - +(版本一) 使用字典 ```python class Solution(object): def fourSumCount(self, nums1, nums2, nums3, nums4): - # use a dict to store the elements in nums1 and nums2 and their sum + # 使用字典存储nums1和nums2中的元素及其和 hashmap = dict() for n1 in nums1: for n2 in nums2: @@ -138,7 +138,7 @@ class Solution(object): else: hashmap[n1+n2] = 1 - # if the -(a+b) exists in nums3 and nums4, we shall add the count + # 如果 -(n1+n2) 存在于nums3和nums4, 存入结果 count = 0 for n3 in nums3: for n4 in nums4: @@ -149,20 +149,18 @@ class Solution(object): ``` - +(版本二)使用 defaultdict ```python +from collections import defaultdict class Solution: def fourSumCount(self, nums1: list, nums2: list, nums3: list, nums4: list) -> int: - from collections import defaultdict # You may use normal dict instead. rec, cnt = defaultdict(lambda : 0), 0 - # To store the summary of all the possible combinations of nums1 & nums2, together with their frequencies. for i in nums1: for j in nums2: rec[i+j] += 1 - # To add up the frequencies if the corresponding value occurs in the dictionary for i in nums3: for j in nums4: - cnt += rec.get(-(i+j), 0) # No matched key, return 0. + cnt += rec.get(-(i+j), 0) return cnt ``` From 5cff41ab09e2b3866f3245c3d06d61b3b432f485 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Fri, 5 May 2023 20:53:12 -0500 Subject: [PATCH 1789/3019] =?UTF-8?q?Update=200454.=E5=9B=9B=E6=95=B0?= =?UTF-8?q?=E7=9B=B8=E5=8A=A0II.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\346\225\260\347\233\270\345\212\240II.md" | 24 ++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git "a/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" "b/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" index 7818c02b5d..31f0504f12 100644 --- "a/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" +++ "b/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" @@ -149,7 +149,29 @@ class Solution(object): ``` -(版本二)使用 defaultdict +(版本二) 使用字典 +```python +class Solution(object): + def fourSumCount(self, nums1, nums2, nums3, nums4): + # 使用字典存储nums1和nums2中的元素及其和 + hashmap = dict() + for n1 in nums1: + for n2 in nums2: + hashmap[n1+n2] = hashmap.get(n1+n2, 0) + 1 + + # 如果 -(n1+n2) 存在于nums3和nums4, 存入结果 + count = 0 + for n3 in nums3: + for n4 in nums4: + key = - n3 - n4 + if key in hashmap: + count += hashmap[key] + return count + + + +``` +(版本三)使用 defaultdict ```python from collections import defaultdict class Solution: From 38bc7021c6f15136e32785398ad17fdab9098d2b Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Fri, 5 May 2023 21:05:34 -0500 Subject: [PATCH 1790/3019] =?UTF-8?q?Update=200383.=E8=B5=8E=E9=87=91?= =?UTF-8?q?=E4=BF=A1.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...3.\350\265\216\351\207\221\344\277\241.md" | 86 +++++++------------ 1 file changed, 31 insertions(+), 55 deletions(-) diff --git "a/problems/0383.\350\265\216\351\207\221\344\277\241.md" "b/problems/0383.\350\265\216\351\207\221\344\277\241.md" index d9a184b643..c2d80d8d89 100644 --- "a/problems/0383.\350\265\216\351\207\221\344\277\241.md" +++ "b/problems/0383.\350\265\216\351\207\221\344\277\241.md" @@ -142,34 +142,27 @@ class Solution { ``` -Python写法一(使用数组作为哈希表): - +(版本一)使用数组 ```python class Solution: def canConstruct(self, ransomNote: str, magazine: str) -> bool: - - arr = [0] * 26 - - for x in magazine: # 记录 magazine里各个字符出现次数 - arr[ord(x) - ord('a')] += 1 - - for x in ransomNote: # 在arr里对应的字符个数做--操作 - if arr[ord(x) - ord('a')] == 0: # 如果没有出现过直接返回 - return False - else: - arr[ord(x) - ord('a')] -= 1 - - return True + ransom_count = [0] * 26 + magazine_count = [0] * 26 + for c in ransomNote: + ransom_count[ord(c) - ord('a')] += 1 + for c in magazine: + magazine_count[ord(c) - ord('a')] += 1 + return all(ransom_count[i] <= magazine_count[i] for i in range(26)) ``` -Python写法二(使用defaultdict): +(版本二)使用defaultdict ```python +from collections import defaultdict + class Solution: def canConstruct(self, ransomNote: str, magazine: str) -> bool: - from collections import defaultdict - hashmap = defaultdict(int) for x in magazine: @@ -177,59 +170,42 @@ class Solution: for x in ransomNote: value = hashmap.get(x) - if value is None or value == 0: + if not value or not value: return False else: hashmap[x] -= 1 return True ``` - -Python写法三: +(版本三)使用字典 ```python -class Solution(object): - def canConstruct(self, ransomNote, magazine): - """ - :type ransomNote: str - :type magazine: str - :rtype: bool - """ - - # use a dict to store the number of letter occurance in ransomNote - hashmap = dict() - for s in ransomNote: - if s in hashmap: - hashmap[s] += 1 - else: - hashmap[s] = 1 - - # check if the letter we need can be found in magazine - for l in magazine: - if l in hashmap: - hashmap[l] -= 1 - - for key in hashmap: - if hashmap[key] > 0: +class Solution: + def canConstruct(self, ransomNote: str, magazine: str) -> bool: + counts = {} + for c in magazine: + counts[c] = counts.get(c, 0) + 1 + for c in ransomNote: + if c not in counts or counts[c] == 0: return False - + counts[c] -= 1 return True ``` +(版本四)使用Counter -Python写法四: +```python +from collections import Counter + +class Solution: + def canConstruct(self, ransomNote: str, magazine: str) -> bool: + return not Counter(ransomNote) - Counter(magazine) +``` +(版本五)使用count ```python class Solution: def canConstruct(self, ransomNote: str, magazine: str) -> bool: - c1 = collections.Counter(ransomNote) - c2 = collections.Counter(magazine) - x = c1 - c2 - #x只保留值大于0的符号,当c1里面的符号个数小于c2时,不会被保留 - #所以x只保留下了,magazine不能表达的 - if(len(x)==0): - return True - else: - return False + return all(ransomNote.count(c) <= magazine.count(c) for c in set(ransomNote)) ``` Go: From 1bc667eccdb247b9795e28a8793ec51fe9ed4883 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Fri, 5 May 2023 21:06:23 -0500 Subject: [PATCH 1791/3019] =?UTF-8?q?Update=200383.=E8=B5=8E=E9=87=91?= =?UTF-8?q?=E4=BF=A1.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "problems/0383.\350\265\216\351\207\221\344\277\241.md" | 1 + 1 file changed, 1 insertion(+) diff --git "a/problems/0383.\350\265\216\351\207\221\344\277\241.md" "b/problems/0383.\350\265\216\351\207\221\344\277\241.md" index c2d80d8d89..7572943786 100644 --- "a/problems/0383.\350\265\216\351\207\221\344\277\241.md" +++ "b/problems/0383.\350\265\216\351\207\221\344\277\241.md" @@ -206,6 +206,7 @@ class Solution: class Solution: def canConstruct(self, ransomNote: str, magazine: str) -> bool: return all(ransomNote.count(c) <= magazine.count(c) for c in set(ransomNote)) + ``` Go: From 2ddbe7f3404ca4c7e70cf3264b6ba4e02327ca78 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Fri, 5 May 2023 21:30:24 -0500 Subject: [PATCH 1792/3019] =?UTF-8?q?Update=200015.=E4=B8=89=E6=95=B0?= =?UTF-8?q?=E4=B9=8B=E5=92=8C.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...11\346\225\260\344\271\213\345\222\214.md" | 95 +++++++++++-------- 1 file changed, 53 insertions(+), 42 deletions(-) diff --git "a/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" "b/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" index 26c9eaa284..9cca779b21 100644 --- "a/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" @@ -298,61 +298,72 @@ class Solution { ``` Python: +(版本一) 双指针 ```Python class Solution: - def threeSum(self, nums): - ans = [] - n = len(nums) + def threeSum(self, nums: List[int]) -> List[List[int]]: + result = [] nums.sort() - # 找出a + b + c = 0 - # a = nums[i], b = nums[left], c = nums[right] - for i in range(n): - left = i + 1 - right = n - 1 - # 排序之后如果第一个元素已经大于零,那么无论如何组合都不可能凑成三元组,直接返回结果就可以了 - if nums[i] > 0: - break - if i >= 1 and nums[i] == nums[i - 1]: # 去重a + + for i in range(len(nums)): + # 如果第一个元素已经大于0,不需要进一步检查 + if nums[i] > 0: + return result + + # 跳过相同的元素以避免重复 + if i > 0 and nums[i] == nums[i - 1]: continue - while left < right: - total = nums[i] + nums[left] + nums[right] - if total > 0: - right -= 1 - elif total < 0: + + left = i + 1 + right = len(nums) - 1 + + while right > left: + sum_ = nums[i] + nums[left] + nums[right] + + if sum_ < 0: left += 1 + elif sum_ > 0: + right -= 1 else: - ans.append([nums[i], nums[left], nums[right]]) - # 去重逻辑应该放在找到一个三元组之后,对b 和 c去重 - while left != right and nums[left] == nums[left + 1]: left += 1 - while left != right and nums[right] == nums[right - 1]: right -= 1 - left += 1 + result.append([nums[i], nums[left], nums[right]]) + + # 跳过相同的元素以避免重复 + while right > left and nums[right] == nums[right - 1]: + right -= 1 + while right > left and nums[left] == nums[left + 1]: + left += 1 + right -= 1 - return ans + left += 1 + + return result ``` -Python (v3): +(版本二) 使用字典 ```python class Solution: def threeSum(self, nums: List[int]) -> List[List[int]]: - if len(nums) < 3: return [] - nums, res = sorted(nums), [] - for i in range(len(nums) - 2): - cur, l, r = nums[i], i + 1, len(nums) - 1 - if res != [] and res[-1][0] == cur: continue # Drop duplicates for the first time. - - while l < r: - if cur + nums[l] + nums[r] == 0: - res.append([cur, nums[l], nums[r]]) - # Drop duplicates for the second time in interation of l & r. Only used when target situation occurs, because that is the reason for dropping duplicates. - while l < r - 1 and nums[l] == nums[l + 1]: - l += 1 - while r > l + 1 and nums[r] == nums[r - 1]: - r -= 1 - if cur + nums[l] + nums[r] > 0: - r -= 1 + result = [] + nums.sort() + # 找出a + b + c = 0 + # a = nums[i], b = nums[j], c = -(a + b) + for i in range(len(nums)): + # 排序之后如果第一个元素已经大于零,那么不可能凑成三元组 + if nums[i] > 0: + break + if i > 0 and nums[i] == nums[i - 1]: #三元组元素a去重 + continue + d = {} + for j in range(i + 1, len(nums)): + if j > i + 2 and nums[j] == nums[j-1] == nums[j-2]: # 三元组元素b去重 + continue + c = 0 - (nums[i] + nums[j]) + if c in d: + result.append([nums[i], nums[j], c]) + d.pop(c) # 三元组元素c去重 else: - l += 1 - return res + d[nums[j]] = j + return result ``` Go: From a5bb942c95f405181ba311e14e1ad601bcfbf435 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Fri, 5 May 2023 21:35:49 -0500 Subject: [PATCH 1793/3019] =?UTF-8?q?Update=200018.=E5=9B=9B=E6=95=B0?= =?UTF-8?q?=E4=B9=8B=E5=92=8C.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...33\346\225\260\344\271\213\345\222\214.md" | 53 ++++++++++--------- 1 file changed, 29 insertions(+), 24 deletions(-) diff --git "a/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" "b/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" index 5f4c2ec920..8606b2ebd0 100644 --- "a/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" @@ -207,35 +207,40 @@ class Solution { ``` Python: +(版本一) 双指针 ```python -# 双指针法 -class Solution: - def fourSum(self, nums: List[int], target: int) -> List[List[int]]: - + def fourSum(self, nums: List[int], target: int) -> List[List[int]]: + result = [] nums.sort() - n = len(nums) - res = [] - for i in range(n): - if i > 0 and nums[i] == nums[i - 1]: continue # 对nums[i]去重 - for k in range(i+1, n): - if k > i + 1 and nums[k] == nums[k-1]: continue # 对nums[k]去重 - p = k + 1 - q = n - 1 - - while p < q: - if nums[i] + nums[k] + nums[p] + nums[q] > target: q -= 1 - elif nums[i] + nums[k] + nums[p] + nums[q] < target: p += 1 + for k in range(len(nums)): + if nums[k] > target and nums[k] >= 0: + break + if k > 0 and nums[k] == nums[k-1]: + continue + for i in range(k+1, len(nums)): + if nums[k] + nums[i] > target and nums[k] + nums[i] >= 0: + break + if i > k+1 and nums[i] == nums[i-1]: + continue + left, right = i+1, len(nums)-1 + while right > left: + if nums[k] + nums[i] + nums[left] + nums[right] > target: + right -= 1 + elif nums[k] + nums[i] + nums[left] + nums[right] < target: + left += 1 else: - res.append([nums[i], nums[k], nums[p], nums[q]]) - # 对nums[p]和nums[q]去重 - while p < q and nums[p] == nums[p + 1]: p += 1 - while p < q and nums[q] == nums[q - 1]: q -= 1 - p += 1 - q -= 1 - return res + result.append([nums[k], nums[i], nums[left], nums[right]]) + while right > left and nums[right] == nums[right-1]: + right -= 1 + while right > left and nums[left] == nums[left+1]: + left += 1 + right -= 1 + left += 1 + return result ``` +(版本二) 使用字典 + ```python -# 哈希表法 class Solution(object): def fourSum(self, nums, target): """ From dde92b1da3808200925d82f8f523da7b5cd93ca2 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Fri, 5 May 2023 21:36:38 -0500 Subject: [PATCH 1794/3019] =?UTF-8?q?Update=200018.=E5=9B=9B=E6=95=B0?= =?UTF-8?q?=E4=B9=8B=E5=92=8C.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...33\346\225\260\344\271\213\345\222\214.md" | 40 ++++++++++--------- 1 file changed, 22 insertions(+), 18 deletions(-) diff --git "a/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" "b/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" index 8606b2ebd0..4fee8358a6 100644 --- "a/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" @@ -209,34 +209,38 @@ class Solution { Python: (版本一) 双指针 ```python - def fourSum(self, nums: List[int], target: int) -> List[List[int]]: - result = [] +class Solution: + def fourSum(self, nums: List[int], target: int) -> List[List[int]]: nums.sort() - for k in range(len(nums)): - if nums[k] > target and nums[k] >= 0: + n = len(nums) + result = [] + for i in range(n): + if nums[i] > target and nums[i] > 0 and target > 0:# 剪枝(可省) break - if k > 0 and nums[k] == nums[k-1]: + if i > 0 and nums[i] == nums[i-1]:# 去重 continue - for i in range(k+1, len(nums)): - if nums[k] + nums[i] > target and nums[k] + nums[i] >= 0: + for j in range(i+1, n): + if nums[i] + nums[j] > target and target > 0: #剪枝(可省) break - if i > k+1 and nums[i] == nums[i-1]: + if j > i+1 and nums[j] == nums[j-1]: # 去重 continue - left, right = i+1, len(nums)-1 - while right > left: - if nums[k] + nums[i] + nums[left] + nums[right] > target: + left, right = j+1, n-1 + while left < right: + s = nums[i] + nums[j] + nums[left] + nums[right] + if s == target: + result.append([nums[i], nums[j], nums[left], nums[right]]) + while left < right and nums[left] == nums[left+1]: + left += 1 + while left < right and nums[right] == nums[right-1]: + right -= 1 + left += 1 right -= 1 - elif nums[k] + nums[i] + nums[left] + nums[right] < target: + elif s < target: left += 1 else: - result.append([nums[k], nums[i], nums[left], nums[right]]) - while right > left and nums[right] == nums[right-1]: - right -= 1 - while right > left and nums[left] == nums[left+1]: - left += 1 right -= 1 - left += 1 return result + ``` (版本二) 使用字典 From c4bc3197502473c5f14be392157bb83ddaa2dbeb Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Fri, 5 May 2023 21:39:52 -0500 Subject: [PATCH 1795/3019] =?UTF-8?q?Update=200018.=E5=9B=9B=E6=95=B0?= =?UTF-8?q?=E4=B9=8B=E5=92=8C.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...33\346\225\260\344\271\213\345\222\214.md" | 33 +++++++------------ 1 file changed, 11 insertions(+), 22 deletions(-) diff --git "a/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" "b/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" index 4fee8358a6..a4d41d9bf9 100644 --- "a/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" @@ -252,36 +252,25 @@ class Solution(object): :type target: int :rtype: List[List[int]] """ - # use a dict to store value:showtimes - hashmap = dict() - for n in nums: - if n in hashmap: - hashmap[n] += 1 - else: - hashmap[n] = 1 + # 创建一个字典来存储输入列表中每个数字的频率 + freq = {} + for num in nums: + freq[num] = freq.get(num, 0) + 1 - # good thing about using python is you can use set to drop duplicates. + # 创建一个集合来存储最终答案,并遍历4个数字的所有唯一组合 ans = set() - # ans = [] # save results by list() for i in range(len(nums)): for j in range(i + 1, len(nums)): for k in range(j + 1, len(nums)): val = target - (nums[i] + nums[j] + nums[k]) - if val in hashmap: - # make sure no duplicates. + if val in freq: + # 确保没有重复 count = (nums[i] == val) + (nums[j] == val) + (nums[k] == val) - if hashmap[val] > count: - ans_tmp = tuple(sorted([nums[i], nums[j], nums[k], val])) - ans.add(ans_tmp) - # Avoiding duplication in list manner but it cause time complexity increases - # if ans_tmp not in ans: - # ans.append(ans_tmp) - else: - continue - return list(ans) - # if used list() to save results, just - # return ans + if freq[val] > count: + ans.add(tuple(sorted([nums[i], nums[j], nums[k], val]))) + return [list(x) for x in ans] + ``` Go: From b617532ce9b7af1cd163a0ccccb1f956f77e8cd2 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Sat, 6 May 2023 01:55:48 -0500 Subject: [PATCH 1796/3019] =?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 --- ...13\350\247\222\347\232\204\345\200\274.md" | 104 +++++++++++------- 1 file changed, 66 insertions(+), 38 deletions(-) diff --git "a/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" "b/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" index 5ff254845d..26768c74dc 100644 --- "a/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" +++ "b/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" @@ -271,52 +271,80 @@ class Solution { ### Python - -递归: +(版本一)递归法 + 回溯 ```python class Solution: def findBottomLeftValue(self, root: TreeNode) -> int: - max_depth = -float("INF") - leftmost_val = 0 - - def __traverse(root, cur_depth): - nonlocal max_depth, leftmost_val - if not root.left and not root.right: - if cur_depth > max_depth: - max_depth = cur_depth - leftmost_val = root.val - if root.left: - cur_depth += 1 - __traverse(root.left, cur_depth) - cur_depth -= 1 - if root.right: - cur_depth += 1 - __traverse(root.right, cur_depth) - cur_depth -= 1 - - __traverse(root, 0) - return leftmost_val + self.max_depth = float('-inf') + self.result = None + self.traversal(root, 0) + return self.result + + def traversal(self, node, depth): + if not node.left and not node.right: + if depth > self.max_depth: + self.max_depth = depth + self.result = node.val + return + + if node.left: + depth += 1 + self.traversal(node.left, depth) + depth -= 1 + if node.right: + depth += 1 + self.traversal(node.right, depth) + depth -= 1 + ``` -迭代 - 层序遍历: +(版本二)递归法+精简 ```python class Solution: def findBottomLeftValue(self, root: TreeNode) -> int: - queue = deque() - if root: - queue.append(root) - result = 0 - while queue: - q_len = len(queue) - for i in range(q_len): - if i == 0: - result = queue[i].val - cur = queue.popleft() - if cur.left: - queue.append(cur.left) - if cur.right: - queue.append(cur.right) - return result + self.max_depth = float('-inf') + self.result = None + self.traversal(root, 0) + return self.result + + def traversal(self, node, depth): + if not node.left and not node.right: + if depth > self.max_depth: + self.max_depth = depth + self.result = node.val + return + + if node.left: + self.traversal(node.left, depth+1) + if node.right: + self.traversal(node.right, depth+1) +``` + +(版本三) 迭代法 +```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 +from collections import deque +class Solution: + def findBottomLeftValue(self, root: Optional[TreeNode]) -> int: + queue = deque([root]) + while queue: + size = len(queue) + leftmost = queue[0].val + for i in range(size): + node = queue.popleft() + if node.left: + queue.append(node.left) + if node.right: + queue.append(node.right) + if not queue: + return leftmost + + ``` ### Go From bb8b112ae0079dd0d09d6a075e17888616ba3a55 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Sat, 6 May 2023 16:51:15 -0500 Subject: [PATCH 1797/3019] =?UTF-8?q?Update=200344.=E5=8F=8D=E8=BD=AC?= =?UTF-8?q?=E5=AD=97=E7=AC=A6=E4=B8=B2.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...54\345\255\227\347\254\246\344\270\262.md" | 58 ++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git "a/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" "b/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" index 775cfc5872..03c82767d7 100644 --- "a/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" @@ -174,6 +174,7 @@ class Solution { ``` Python: +(版本一) 双指针 ```python class Solution: def reverseString(self, s: List[str]) -> None: @@ -190,7 +191,62 @@ class Solution: right -= 1 ``` - +(版本二) 使用栈 +```python +class Solution: + def reverseString(self, s: List[str]) -> None: + """ + Do not return anything, modify s in-place instead. + """ + stack = [] + for char in s: + stack.append(char) + for i in range(len(s)): + s[i] = stack.pop() + +``` +(版本三) 使用range +```python +class Solution: + def reverseString(self, s: List[str]) -> None: + """ + Do not return anything, modify s in-place instead. + """ + n = len(s) + for i in range(n // 2): + s[i], s[n - i - 1] = s[n - i - 1], s[i] + +``` +(版本四) 使用reversed +```python +class Solution: + def reverseString(self, s: List[str]) -> None: + """ + Do not return anything, modify s in-place instead. + """ + s[:] = reversed(s) + +``` +(版本五) 使用切片 +```python +class Solution: + def reverseString(self, s: List[str]) -> None: + """ + Do not return anything, modify s in-place instead. + """ + s[:] = s[::-1] + +``` +(版本六) 使用列表推导 +```python +class Solution: + def reverseString(self, s: List[str]) -> None: + """ + Do not return anything, modify s in-place instead. + """ + s[:] = [s[i] for i in range(len(s) - 1, -1, -1)] + +``` Go: ```Go func reverseString(s []byte) { From a37ae94618edd6104f9d0815bc0d97e185175f1e Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Sat, 6 May 2023 16:54:34 -0500 Subject: [PATCH 1798/3019] =?UTF-8?q?Update=200344.=E5=8F=8D=E8=BD=AC?= =?UTF-8?q?=E5=AD=97=E7=AC=A6=E4=B8=B2.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...17\215\350\275\254\345\255\227\347\254\246\344\270\262.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" "b/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" index 03c82767d7..1c74f9aa46 100644 --- "a/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" @@ -183,8 +183,8 @@ class Solution: """ left, right = 0, len(s) - 1 - # 该方法已经不需要判断奇偶数,经测试后时间空间复杂度比用 for i in range(right//2)更低 - # 推荐该写法,更加通俗易懂 + # 该方法已经不需要判断奇偶数,经测试后时间空间复杂度比用 for i in range(len(s)//2)更低 + # 因为while每次循环需要进行条件判断,而range函数不需要,直接生成数字,因此时间复杂度更低。推荐使用range while left < right: s[left], s[right] = s[right], s[left] left += 1 From abcedd41a87e6923cfd39705765cdd5716b31ad0 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Sat, 6 May 2023 16:59:12 -0500 Subject: [PATCH 1799/3019] =?UTF-8?q?Update=20=E5=89=91=E6=8C=87Offer05.?= =?UTF-8?q?=E6=9B=BF=E6=8D=A2=E7=A9=BA=E6=A0=BC.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...7Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" | 1 + 1 file changed, 1 insertion(+) diff --git "a/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" "b/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" index 2e1ee1de1b..833d46284b 100644 --- "a/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" +++ "b/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" @@ -266,6 +266,7 @@ func replaceSpace(s string) string { python: +####因为字符串是不可变类型,所以操作字符串需要将其转换为列表,因此空间复杂度不可能不为O(1) ```python class Solution: def replaceSpace(self, s: str) -> str: From 3958cc166a1ab090f0060e45bab41535170cd186 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Sat, 6 May 2023 16:59:48 -0500 Subject: [PATCH 1800/3019] =?UTF-8?q?Update=20=E5=89=91=E6=8C=87Offer05.?= =?UTF-8?q?=E6=9B=BF=E6=8D=A2=E7=A9=BA=E6=A0=BC.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...fer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" "b/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" index 833d46284b..d930702fc1 100644 --- "a/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" +++ "b/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" @@ -265,8 +265,8 @@ func replaceSpace(s string) string { -python: -####因为字符串是不可变类型,所以操作字符串需要将其转换为列表,因此空间复杂度不可能不为O(1) +#python: +#因为字符串是不可变类型,所以操作字符串需要将其转换为列表,因此空间复杂度不可能不为O(1) ```python class Solution: def replaceSpace(self, s: str) -> str: From 799325bacebd60e3088e5ab4a82ef599ba1d3e47 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Sat, 6 May 2023 17:00:54 -0500 Subject: [PATCH 1801/3019] =?UTF-8?q?Update=20=E5=89=91=E6=8C=87Offer05.?= =?UTF-8?q?=E6=9B=BF=E6=8D=A2=E7=A9=BA=E6=A0=BC.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...fer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" "b/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" index d930702fc1..a6c32d3054 100644 --- "a/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" +++ "b/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" @@ -265,8 +265,8 @@ func replaceSpace(s string) string { -#python: -#因为字符串是不可变类型,所以操作字符串需要将其转换为列表,因此空间复杂度不可能不为O(1) +# python: +# 因为字符串是不可变类型,所以操作字符串需要将其转换为列表,因此空间复杂度不可能不为O(1) ```python class Solution: def replaceSpace(self, s: str) -> str: From dc7ac6337d5ae0a462cc332a5a1a68de43095212 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Sat, 6 May 2023 17:01:39 -0500 Subject: [PATCH 1802/3019] =?UTF-8?q?Update=20=E5=89=91=E6=8C=87Offer05.?= =?UTF-8?q?=E6=9B=BF=E6=8D=A2=E7=A9=BA=E6=A0=BC.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...fer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" "b/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" index a6c32d3054..d86cc6dcf9 100644 --- "a/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" +++ "b/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" @@ -265,8 +265,8 @@ func replaceSpace(s string) string { -# python: -# 因为字符串是不可变类型,所以操作字符串需要将其转换为列表,因此空间复杂度不可能不为O(1) +python: +#### 因为字符串是不可变类型,所以操作字符串需要将其转换为列表,因此空间复杂度不可能不为O(1) ```python class Solution: def replaceSpace(self, s: str) -> str: From c09089accda7c3cc46bc283eb63edfc9563894ab Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Sat, 6 May 2023 17:10:18 -0500 Subject: [PATCH 1803/3019] =?UTF-8?q?Update=20=E5=89=91=E6=8C=87Offer05.?= =?UTF-8?q?=E6=9B=BF=E6=8D=A2=E7=A9=BA=E6=A0=BC.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...77\346\215\242\347\251\272\346\240\274.md" | 34 +++++++++++++++---- 1 file changed, 27 insertions(+), 7 deletions(-) diff --git "a/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" "b/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" index d86cc6dcf9..dbad781ef3 100644 --- "a/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" +++ "b/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" @@ -266,7 +266,8 @@ func replaceSpace(s string) string { python: -#### 因为字符串是不可变类型,所以操作字符串需要将其转换为列表,因此空间复杂度不可能不为O(1) +#### 因为字符串是不可变类型,所以操作字符串需要将其转换为列表,因此空间复杂度不可能为O(1) +(版本一)转换成列表,并且添加相匹配的空间,然后进行填充 ```python class Solution: def replaceSpace(self, s: str) -> str: @@ -291,14 +292,22 @@ class Solution: return ''.join(res) ``` - +(版本二)添加空列表,添加匹配的结果 +```python +class Solution: + def replaceSpace(self, s: str) -> str: + res = [] + for i in range(len(s)): + if s[i] == ' ': + res.append('%20') + else: + res.append(s[i]) + return ''.join(res) +``` +(版本三)使用切片 ```python class Solution: def replaceSpace(self, s: str) -> str: - # method 1 - Very rude - return "%20".join(s.split(" ")) - - # method 2 - Reverse the s when counting in for loop, then update from the end. n = len(s) for e, i in enumerate(s[::-1]): print(i, e) @@ -307,7 +316,18 @@ class Solution: print("") return s ``` - +(版本四)使用join + split +```python +class Solution: + def replaceSpace(self, s: str) -> str: + return "%20".join(s.split(" ")) +``` +(版本五)使用replace +```python +class Solution: + def replaceSpace(self, s: str) -> str: + return s.replace(' ', '%20') +``` javaScript: ```js From c75140d2572be2030e64a8aa18a7cc336b7a5a74 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Sat, 6 May 2023 17:26:08 -0500 Subject: [PATCH 1804/3019] =?UTF-8?q?Update=200151.=E7=BF=BB=E8=BD=AC?= =?UTF-8?q?=E5=AD=97=E7=AC=A6=E4=B8=B2=E9=87=8C=E7=9A=84=E5=8D=95=E8=AF=8D?= =?UTF-8?q?.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...14\347\232\204\345\215\225\350\257\215.md" | 142 +++--------------- 1 file changed, 24 insertions(+), 118 deletions(-) diff --git "a/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" "b/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" index 8fa7c77c9e..a323226416 100644 --- "a/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" +++ "b/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" @@ -434,134 +434,40 @@ class Solution { ``` python: - +(版本一)先删除空白,然后整个反转,最后单词反转。 +### 因为字符串是不可变类型,所以反转单词的时候,需要将其转换成列表,然后通过join函数再将其转换成列表,所以空间复杂度不是O(1) ```Python class Solution: - #1.去除多余的空格 - def trim_spaces(self, s): - n = len(s) - left = 0 - right = n-1 - - while left <= right and s[left] == ' ': #去除开头的空格 - left += 1 - while left <= right and s[right] == ' ': #去除结尾的空格 - right -= 1 - tmp = [] - while left <= right: #去除单词中间多余的空格 - if s[left] != ' ': - tmp.append(s[left]) - elif tmp[-1] != ' ': #当前位置是空格,但是相邻的上一个位置不是空格,则该空格是合理的 - tmp.append(s[left]) - left += 1 - return tmp - - #2.翻转字符数组 - def reverse_string(self, nums, left, right): - while left < right: - nums[left], nums[right] = nums[right], nums[left] - left += 1 - right -= 1 - return None - - #3.翻转每个单词 - def reverse_each_word(self, nums): - start = 0 - end = 0 - n = len(nums) - while start < n: - while end < n and nums[end] != ' ': - end += 1 - self.reverse_string(nums, start, end-1) - start = end + 1 - end += 1 - return None - -#4.翻转字符串里的单词 - def reverseWords(self, s): #测试用例:"the sky is blue" - l = self.trim_spaces(s) #输出:['t', 'h', 'e', ' ', 's', 'k', 'y', ' ', 'i', 's', ' ', 'b', 'l', 'u', 'e' - self.reverse_string(l, 0, len(l)-1) #输出:['e', 'u', 'l', 'b', ' ', 's', 'i', ' ', 'y', 'k', 's', ' ', 'e', 'h', 't'] - self.reverse_each_word(l) #输出:['b', 'l', 'u', 'e', ' ', 'i', 's', ' ', 's', 'k', 'y', ' ', 't', 'h', 'e'] - return ''.join(l) #输出:blue is sky the - + def reverseWords(self, s: str) -> str: + # 删除前后空白 + s = s.strip() + # 反转整个字符串 + s = s[::-1] + # 将字符串拆分为单词,并反转每个单词 + s = ' '.join(word[::-1] for word in s.split()) + return s ``` +(版本二)使用双指针 ```python class Solution: def reverseWords(self, s: str) -> str: - # method 1 - Rude but work & efficient method. - s_list = [i for i in s.split(" ") if len(i) > 0] - return " ".join(s_list[::-1]) - - # method 2 - Carlo's idea - def trim_head_tail_space(ss: str): - p = 0 - while p < len(ss) and ss[p] == " ": - p += 1 - return ss[p:] - - # Trim the head and tail space - s = trim_head_tail_space(s) - s = trim_head_tail_space(s[::-1])[::-1] - - pf, ps, s = 0, 0, s[::-1] # Reverse the string. - while pf < len(s): - if s[pf] == " ": - # Will not excede. Because we have clean the tail space. - if s[pf] == s[pf + 1]: - s = s[:pf] + s[pf + 1:] - continue - else: - s = s[:ps] + s[ps: pf][::-1] + s[pf:] - ps, pf = pf + 1, pf + 2 - else: - pf += 1 - return s[:ps] + s[ps:][::-1] # Must do the last step, because the last word is omit though the pointers are on the correct positions, + # 将字符串拆分为单词,即转换成列表类型 + words = s.split() + + # 反转单词 + left, right = 0, len(words) - 1 + while left < right: + words[left], words[right] = words[right], words[left] + left += 1 + right -= 1 + + # 将列表转换成字符串 + return " ".join(words) ``` -```python -class Solution: # 使用双指针法移除空格 - def reverseWords(self, s: str) -> str: - - def removeextraspace(s): - start = 0; end = len(s)-1 - while s[start]==' ': - start+=1 - while s[end]==' ': - end-=1 - news = list(s[start:end+1]) - slow = fast = 0 - while fast0 and news[fast]==news[fast-1]==' ': - fast+=1 - news[slow]=news[fast] - slow+=1; fast+=1 - #return "".join(news[:slow]) - return news[:slow] - - def reversestr(s): - left,right = 0,len(s)-1 - news = list(s) - while left Date: Sat, 6 May 2023 17:26:56 -0500 Subject: [PATCH 1805/3019] =?UTF-8?q?Update=200151.=E7=BF=BB=E8=BD=AC?= =?UTF-8?q?=E5=AD=97=E7=AC=A6=E4=B8=B2=E9=87=8C=E7=9A=84=E5=8D=95=E8=AF=8D?= =?UTF-8?q?.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" "b/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" index a323226416..062ccca538 100644 --- "a/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" +++ "b/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" @@ -435,7 +435,7 @@ class Solution { python: (版本一)先删除空白,然后整个反转,最后单词反转。 -### 因为字符串是不可变类型,所以反转单词的时候,需要将其转换成列表,然后通过join函数再将其转换成列表,所以空间复杂度不是O(1) +#### 因为字符串是不可变类型,所以反转单词的时候,需要将其转换成列表,然后通过join函数再将其转换成列表,所以空间复杂度不是O(1) ```Python class Solution: def reverseWords(self, s: str) -> str: From 7cfd38940249adb1f659da29b69edc2ae3083113 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Sat, 6 May 2023 17:52:08 -0500 Subject: [PATCH 1806/3019] =?UTF-8?q?Update=20=E5=89=91=E6=8C=87Offer58-II?= =?UTF-8?q?.=E5=B7=A6=E6=97=8B=E8=BD=AC=E5=AD=97=E7=AC=A6=E4=B8=B2.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...54\345\255\227\347\254\246\344\270\262.md" | 54 ++++++++++--------- 1 file changed, 28 insertions(+), 26 deletions(-) diff --git "a/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" "b/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" index f368514f4b..6cd8845609 100644 --- "a/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" @@ -142,15 +142,16 @@ class Solution { ``` python: +(版本一)使用切片 ```python -# 方法一:可以使用切片方法 class Solution: def reverseLeftWords(self, s: str, n: int) -> str: - return s[n:] + s[0:n] + return s[n:] + s[:n] ``` +(版本二)使用reversed + join + ```python -# 方法二:也可以使用上文描述的方法,有些面试中不允许使用切片,那就使用上文作者提到的方法 class Solution: def reverseLeftWords(self, s: str, n: int) -> str: s = list(s) @@ -161,32 +162,29 @@ class Solution: return "".join(s) ``` +(版本三)自定义reversed函数 ```python -# 方法三:如果连reversed也不让使用,那么自己手写一个 class Solution: - def reverseLeftWords(self, s: str, n: int) -> str: - def reverse_sub(lst, left, right): - while left < right: - lst[left], lst[right] = lst[right], lst[left] - left += 1 - right -= 1 + def reverseLeftWords(self, s: str, n: int) -> str: + s_list = list(s) - res = list(s) - end = len(res) - 1 - reverse_sub(res, 0, n - 1) - reverse_sub(res, n, end) - reverse_sub(res, 0, end) - return ''.join(res) + self.reverse(s_list, 0, n - 1) + self.reverse(s_list, n, len(s_list) - 1) + self.reverse(s_list, 0, len(s_list) - 1) -# 同方法二 -# 时间复杂度:O(n) -# 空间复杂度:O(n),python的string为不可变,需要开辟同样大小的list空间来修改 + return ''.join(s_list) + + def reverse(self, s, start, end): + while start < end: + s[start], s[end] = s[end], s[start] + start += 1 + end -= 1 ``` +(版本四)使用 模 +下标 ```python 3 -#方法四:考虑不能用切片的情况下,利用模+下标实现 class Solution: def reverseLeftWords(self, s: str, n: int) -> str: new_s = '' @@ -196,17 +194,21 @@ class Solution: return new_s ``` +(版本五)使用 模 + 切片 ```python 3 -# 方法五:另类的切片方法 class Solution: def reverseLeftWords(self, s: str, n: int) -> str: - n = len(s) - s = s + s - return s[k : n+k] + l = len(s) + # 复制输入字符串与它自己连接 + s = s + s + + # 计算旋转字符串的起始索引 + k = n % (l * 2) + + # 从连接的字符串中提取旋转后的字符串并返回 + return s[k : k + l] -# 时间复杂度:O(n) -# 空间复杂度:O(n) ``` Go: From 3cf55028680832e76c82f9f819443b79339f1d49 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Sat, 6 May 2023 19:39:34 -0500 Subject: [PATCH 1807/3019] =?UTF-8?q?Update=200028.=E5=AE=9E=E7=8E=B0strSt?= =?UTF-8?q?r.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0028.\345\256\236\347\216\260strStr.md" | 99 +++++++++++-------- 1 file changed, 59 insertions(+), 40 deletions(-) diff --git "a/problems/0028.\345\256\236\347\216\260strStr.md" "b/problems/0028.\345\256\236\347\216\260strStr.md" index 263c168995..5cc0499467 100644 --- "a/problems/0028.\345\256\236\347\216\260strStr.md" +++ "b/problems/0028.\345\256\236\347\216\260strStr.md" @@ -692,23 +692,38 @@ class Solution { ``` Python3: +(版本一)前缀表(不减一) + ```python -//暴力解法: -class Solution(object): - def strStr(self, haystack, needle): - """ - :type haystack: str - :type needle: str - :rtype: int - """ - m, n = len(haystack), len(needle) - for i in range(m): - if haystack[i:i+n] == needle: - return i - return -1 +class Solution: + def strStr(self, haystack: str, needle: str) -> int: + if len(needle) == 0: + return 0 + next = self.getNext(needle) + j = 0 + for i in range(len(haystack)): + while j >= 1 and haystack[i] != needle[j]: + j = next[j-1] + if haystack[i] == needle[j]: + j += 1 + if j == len(needle): + return i - len(needle) + 1 + return -1 + + def getNext(self, needle): + next = [0] * len(needle) + j = 0 + next[0] = j + for i in range(1, len(needle)): + while j >= 1 and needle[i] != needle[j]: + j = next[j-1] + if needle[i] == needle[j]: + j += 1 + next[i] = j + return next ``` +(版本二)前缀表(减一) ```python -// 方法一 class Solution: def strStr(self, haystack: str, needle: str) -> int: a = len(needle) @@ -739,8 +754,11 @@ class Solution: return next ``` + +(版本三)前缀表(减一) + + ```python -// 方法二 class Solution: def strStr(self, haystack: str, needle: str) -> int: a = len(needle) @@ -774,35 +792,36 @@ class Solution: return next ``` +(版本四)暴力法 +```python +class Solution(object): + def strStr(self, haystack, needle): + """ + :type haystack: str + :type needle: str + :rtype: int + """ + m, n = len(haystack), len(needle) + for i in range(m): + if haystack[i:i+n] == needle: + return i + return -1 +``` +(版本五)使用 index ```python -// 前缀表(不减一)Python实现 class Solution: def strStr(self, haystack: str, needle: str) -> int: - if len(needle) == 0: - return 0 - next = self.getNext(needle) - j = 0 - for i in range(len(haystack)): - while j >= 1 and haystack[i] != needle[j]: - j = next[j-1] - if haystack[i] == needle[j]: - j += 1 - if j == len(needle): - return i - len(needle) + 1 - return -1 - - def getNext(self, needle): - next = [0] * len(needle) - j = 0 - next[0] = j - for i in range(1, len(needle)): - while j >= 1 and needle[i] != needle[j]: - j = next[j-1] - if needle[i] == needle[j]: - j += 1 - next[i] = j - return next + try: + return haystack.index(needle) + except ValueError: + return -1 ``` +(版本六)使用 find +```python +class Solution: + def strStr(self, haystack: str, needle: str) -> int: + return haystack.find(needle) + Go: From 1fbd900c6a942b86d9c1d2f394ed89023e22a50d Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Sat, 6 May 2023 19:47:55 -0500 Subject: [PATCH 1808/3019] =?UTF-8?q?Update=200028.=E5=AE=9E=E7=8E=B0strSt?= =?UTF-8?q?r.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0028.\345\256\236\347\216\260strStr.md" | 131 ++++++------------ 1 file changed, 45 insertions(+), 86 deletions(-) diff --git "a/problems/0028.\345\256\236\347\216\260strStr.md" "b/problems/0028.\345\256\236\347\216\260strStr.md" index 5cc0499467..ff13db3910 100644 --- "a/problems/0028.\345\256\236\347\216\260strStr.md" +++ "b/problems/0028.\345\256\236\347\216\260strStr.md" @@ -692,107 +692,66 @@ class Solution { ``` Python3: -(版本一)前缀表(不减一) - +(版本一)前缀表(减一) ```python class Solution: - def strStr(self, haystack: str, needle: str) -> int: - if len(needle) == 0: - return 0 - next = self.getNext(needle) - j = 0 - for i in range(len(haystack)): - while j >= 1 and haystack[i] != needle[j]: - j = next[j-1] - if haystack[i] == needle[j]: - j += 1 - if j == len(needle): - return i - len(needle) + 1 - return -1 - - def getNext(self, needle): - next = [0] * len(needle) - j = 0 + def getNext(self, next, s): + j = -1 next[0] = j - for i in range(1, len(needle)): - while j >= 1 and needle[i] != needle[j]: - j = next[j-1] - if needle[i] == needle[j]: + for i in range(1, len(s)): + while j >= 0 and s[i] != s[j+1]: + j = next[j] + if s[i] == s[j+1]: j += 1 next[i] = j - return next -``` -(版本二)前缀表(减一) -```python -class Solution: + def strStr(self, haystack: str, needle: str) -> int: - a = len(needle) - b = len(haystack) - if a == 0: + if not needle: return 0 - next = self.getnext(a,needle) - p=-1 - for j in range(b): - while p >= 0 and needle[p+1] != haystack[j]: - p = next[p] - if needle[p+1] == haystack[j]: - p += 1 - if p == a-1: - return j-a+1 + next = [0] * len(needle) + self.getNext(next, needle) + j = -1 + for i in range(len(haystack)): + while j >= 0 and haystack[i] != needle[j+1]: + j = next[j] + if haystack[i] == needle[j+1]: + j += 1 + if j == len(needle) - 1: + return i - len(needle) + 1 return -1 - - def getnext(self,a,needle): - next = ['' for i in range(a)] - k = -1 - next[0] = k - for i in range(1, len(needle)): - while (k > -1 and needle[k+1] != needle[i]): - k = next[k] - if needle[k+1] == needle[i]: - k += 1 - next[i] = k - return next ``` - - -(版本三)前缀表(减一) - +(版本二)前缀表(不减一) ```python class Solution: + def getNext(self, next: List[int], s: str) -> None: + j = 0 + next[0] = 0 + for i in range(1, len(s)): + while j > 0 and s[i] != s[j]: + j = next[j - 1] + if s[i] == s[j]: + j += 1 + next[i] = j + def strStr(self, haystack: str, needle: str) -> int: - a = len(needle) - b = len(haystack) - if a == 0: + if len(needle) == 0: return 0 - i = j = 0 - next = self.getnext(a, needle) - while(i < b and j < a): - if j == -1 or needle[j] == haystack[i]: - i += 1 - j += 1 - else: - j = next[j] - if j == a: - return i-j - else: - return -1 - - def getnext(self, a, needle): - next = ['' for i in range(a)] - j, k = 0, -1 - next[0] = k - while(j < a-1): - if k == -1 or needle[k] == needle[j]: - k += 1 + next = [0] * len(needle) + self.getNext(next, needle) + j = 0 + for i in range(len(haystack)): + while j > 0 and haystack[i] != needle[j]: + j = next[j - 1] + if haystack[i] == needle[j]: j += 1 - next[j] = k - else: - k = next[k] - return next + if j == len(needle): + return i - len(needle) + 1 + return -1 ``` -(版本四)暴力法 + +(版本三)暴力法 ```python class Solution(object): def strStr(self, haystack, needle): @@ -807,7 +766,7 @@ class Solution(object): return i return -1 ``` -(版本五)使用 index +(版本四)使用 index ```python class Solution: def strStr(self, haystack: str, needle: str) -> int: @@ -816,7 +775,7 @@ class Solution: except ValueError: return -1 ``` -(版本六)使用 find +(版本五)使用 find ```python class Solution: def strStr(self, haystack: str, needle: str) -> int: From 995028d7c45099f71d9ef398ad92a8b655e0c4f9 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Sat, 6 May 2023 19:48:45 -0500 Subject: [PATCH 1809/3019] =?UTF-8?q?Update=200028.=E5=AE=9E=E7=8E=B0strSt?= =?UTF-8?q?r.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "problems/0028.\345\256\236\347\216\260strStr.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0028.\345\256\236\347\216\260strStr.md" "b/problems/0028.\345\256\236\347\216\260strStr.md" index ff13db3910..b18131f391 100644 --- "a/problems/0028.\345\256\236\347\216\260strStr.md" +++ "b/problems/0028.\345\256\236\347\216\260strStr.md" @@ -780,7 +780,7 @@ class Solution: class Solution: def strStr(self, haystack: str, needle: str) -> int: return haystack.find(needle) - +``` Go: From e8b4db9d7a5cf58e56e58254195cc2a98d926479 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Sat, 6 May 2023 19:49:19 -0500 Subject: [PATCH 1810/3019] =?UTF-8?q?Update=200028.=E5=AE=9E=E7=8E=B0strSt?= =?UTF-8?q?r.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "problems/0028.\345\256\236\347\216\260strStr.md" | 1 + 1 file changed, 1 insertion(+) diff --git "a/problems/0028.\345\256\236\347\216\260strStr.md" "b/problems/0028.\345\256\236\347\216\260strStr.md" index b18131f391..86308b4799 100644 --- "a/problems/0028.\345\256\236\347\216\260strStr.md" +++ "b/problems/0028.\345\256\236\347\216\260strStr.md" @@ -780,6 +780,7 @@ class Solution: class Solution: def strStr(self, haystack: str, needle: str) -> int: return haystack.find(needle) + ``` Go: From 5000a978fd41dd32a639935459365fd58e691c37 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Sat, 6 May 2023 20:05:02 -0500 Subject: [PATCH 1811/3019] =?UTF-8?q?Update=200459.=E9=87=8D=E5=A4=8D?= =?UTF-8?q?=E7=9A=84=E5=AD=90=E5=AD=97=E7=AC=A6=E4=B8=B2.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...20\345\255\227\347\254\246\344\270\262.md" | 39 +++++++++++++++++-- 1 file changed, 36 insertions(+), 3 deletions(-) diff --git "a/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" "b/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" index 98c02a2544..5d56ad18fb 100644 --- "a/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" @@ -264,8 +264,7 @@ class Solution { Python: -这里使用了前缀表统一减一的实现方式 - +(版本一) 前缀表 减一 ```python class Solution: def repeatedSubstringPattern(self, s: str) -> bool: @@ -289,7 +288,7 @@ class Solution: return nxt ``` -前缀表(不减一)的代码实现 +(版本二) 前缀表 不减一 ```python class Solution: @@ -314,6 +313,40 @@ class Solution: return nxt ``` + +(版本三) 使用 find + +```python +class Solution: + def repeatedSubstringPattern(self, s: str) -> bool: + n = len(s) + if n <= 1: + return False + ss = s[1:] + s[:-1] + print(ss.find(s)) + return ss.find(s) != -1 +``` + +(版本四) 暴力法 + +```python +class Solution: + def repeatedSubstringPattern(self, s: str) -> bool: + n = len(s) + if n <= 1: + return False + + substr = "" + for i in range(1, n//2 + 1): + if n % i == 0: + substr = s[:i] + if substr * (n//i) == s: + return True + + return False +``` + + Go: 这里使用了前缀表统一减一的实现方式 From f97ff3a1beeb938107bd76dfa38dac3c93430095 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E5=91=98Carl?= Date: Sun, 7 May 2023 09:28:28 +0800 Subject: [PATCH 1812/3019] =?UTF-8?q?Update=200151.=E7=BF=BB=E8=BD=AC?= =?UTF-8?q?=E5=AD=97=E7=AC=A6=E4=B8=B2=E9=87=8C=E7=9A=84=E5=8D=95=E8=AF=8D?= =?UTF-8?q?.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" "b/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" index 062ccca538..4474f1c613 100644 --- "a/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" +++ "b/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" @@ -435,7 +435,7 @@ class Solution { python: (版本一)先删除空白,然后整个反转,最后单词反转。 -#### 因为字符串是不可变类型,所以反转单词的时候,需要将其转换成列表,然后通过join函数再将其转换成列表,所以空间复杂度不是O(1) +**因为字符串是不可变类型,所以反转单词的时候,需要将其转换成列表,然后通过join函数再将其转换成列表,所以空间复杂度不是O(1)** ```Python class Solution: def reverseWords(self, s: str) -> str: From 3f45b56cef522ca54b648ded97a8d3b0c6a0f919 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E5=91=98Carl?= Date: Sun, 7 May 2023 09:47:01 +0800 Subject: [PATCH 1813/3019] =?UTF-8?q?Update=200242.=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=8D.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...15\345\274\202\344\275\215\350\257\215.md" | 68 +------------------ 1 file changed, 1 insertion(+), 67 deletions(-) diff --git "a/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" "b/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" index 0e5683c794..3f4b00dc30 100644 --- "a/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" +++ "b/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" @@ -122,21 +122,7 @@ class Solution { ``` Python: -(版本一) 使用数组 -```python -class Solution: - def isAnagram(self, s: str, t: str) -> bool: - record = [0] * 26 - for i in range(len(s)): - record[ord(s[i]) - ord("a")] += 1 - for i in range(len(t)): - record[ord(t[i]) - ord("a")] -= 1 - for i in range(26): - if record[i] != 0: - return False - return True -``` -(版本二) 使用数组 + ```python class Solution: def isAnagram(self, s: str, t: str) -> bool: @@ -153,59 +139,7 @@ class Solution: return True ``` -(版本三) 使用defaultdict - -```python -from collections import defaultdict - -class Solution: - def isAnagram(self, s: str, t: str) -> bool: - - s_dict = defaultdict(int) - t_dict = defaultdict(int) - - for x in s: - s_dict[x] += 1 - - for x in t: - t_dict[x] += 1 - - return s_dict == t_dict -``` -(版本四) 使用字典 - -```python -class Solution: - def isAnagram(self, s: str, t: str) -> bool: - if len(s) != len(t): - return False - - hash_table_s = {} - hash_table_t = {} - - for i in range(len(s)): - hash_table_s[s[i]] = hash_table_s.get(s[i], 0) + 1 - hash_table_t[t[i]] = hash_table_t.get(t[i], 0) + 1 - - return hash_table_s == hash_table_t -``` - -(版本五) 使用排序 -```python -class Solution: - def isAnagram(self, s: str, t: str) -> bool: - return sorted(s) == sorted(t) -``` -(版本六) 使用Counter - -```python -from collections import Counter - -class Solution: - def isAnagram(self, s: str, t: str) -> bool: - return Counter(s) == Counter(t) -``` Go: ```go From 6e88b2034d70d261a9cd0388cdcf906e50677195 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E5=91=98Carl?= Date: Sun, 7 May 2023 09:54:15 +0800 Subject: [PATCH 1814/3019] =?UTF-8?q?Update=200242.=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=8D.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...15\345\274\202\344\275\215\350\257\215.md" | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git "a/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" "b/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" index 3f4b00dc30..09674ecdaa 100644 --- "a/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" +++ "b/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" @@ -138,7 +138,31 @@ class Solution: return False return True ``` +Python写法二(没有使用数组作为哈希表,只是介绍defaultdict这样一种解题思路): +```python +class Solution: + def isAnagram(self, s: str, t: str) -> bool: + from collections import defaultdict + + s_dict = defaultdict(int) + t_dict = defaultdict(int) + for x in s: + s_dict[x] += 1 + + for x in t: + t_dict[x] += 1 + return s_dict == t_dict +``` +Python写法三(没有使用数组作为哈希表,只是介绍Counter这种更方便的解题思路): + +```python +class Solution(object): + def isAnagram(self, s: str, t: str) -> bool: + from collections import Counter + a_count = Counter(s) + b_count = Counter(t) + return a_count == b_count Go: From d2abce01594ae1bbd73889040c82b35455b3d93e Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Sat, 6 May 2023 22:54:54 -0500 Subject: [PATCH 1815/3019] =?UTF-8?q?Update=200112.=E8=B7=AF=E5=BE=84?= =?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 --- ...57\345\276\204\346\200\273\345\222\214.md" | 269 +++++++++++------- 1 file changed, 160 insertions(+), 109 deletions(-) diff --git "a/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" "b/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" index 5958de93e6..9ee2464ee4 100644 --- "a/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" +++ "b/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" @@ -451,140 +451,191 @@ class Solution { ### 0112.路径总和 -**递归** - +(版本一) 递归 ```python -class solution: - def haspathsum(self, root: treenode, targetsum: int) -> bool: - def isornot(root, targetsum) -> bool: - if (not root.left) and (not root.right) and targetsum == 0: - return true # 遇到叶子节点,并且计数为0 - if (not root.left) and (not root.right): - return false # 遇到叶子节点,计数不为0 - if root.left: - targetsum -= root.left.val # 左节点 - if isornot(root.left, targetsum): return true # 递归,处理左节点 - targetsum += root.left.val # 回溯 - if root.right: - targetsum -= root.right.val # 右节点 - if isornot(root.right, targetsum): return true # 递归,处理右节点 - targetsum += root.right.val # 回溯 - return false - - if root == none: - return false # 别忘记处理空treenode - else: - return isornot(root, targetsum - root.val) +# 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 traversal(self, cur: TreeNode, count: int) -> bool: + if not cur.left and not cur.right and count == 0: # 遇到叶子节点,并且计数为0 + return True + if not cur.left and not cur.right: # 遇到叶子节点直接返回 + return False + + if cur.left: # 左 + count -= cur.left.val + if self.traversal(cur.left, count): # 递归,处理节点 + return True + count += cur.left.val # 回溯,撤销处理结果 -class Solution: # 简洁版 - def hasPathSum(self, root: Optional[TreeNode], targetSum: int) -> bool: - if not root: return False - if root.left==root.right==None and root.val == targetSum: return True - return self.hasPathSum(root.left,targetSum-root.val) or self.hasPathSum(root.right,targetSum-root.val) + if cur.right: # 右 + count -= cur.right.val + if self.traversal(cur.right, count): # 递归,处理节点 + return True + count += cur.right.val # 回溯,撤销处理结果 + + return False + + def hasPathSum(self, root: TreeNode, sum: int) -> bool: + if root is None: + return False + return self.traversal(root, sum - root.val) ``` -**迭代 - 层序遍历** - +(版本二) 递归 + 精简 ```python -class solution: - def haspathsum(self, root: treenode, targetsum: int) -> bool: +# 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 hasPathSum(self, root: TreeNode, sum: int) -> bool: if not root: - return false - - stack = [] # [(当前节点,路径数值), ...] - stack.append((root, root.val)) - - while stack: - cur_node, path_sum = stack.pop() - - if not cur_node.left and not cur_node.right and path_sum == targetsum: - return true - - if cur_node.right: - stack.append((cur_node.right, path_sum + cur_node.right.val)) + return False + if not root.left and not root.right and sum == root.val: + return True + return self.hasPathSum(root.left, sum - root.val) or self.hasPathSum(root.right, sum - root.val) + +``` +(版本三) 迭代 +```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 hasPathSum(self, root: TreeNode, sum: int) -> bool: + if not root: + return False + # 此时栈里要放的是pair<节点指针,路径数值> + st = [(root, root.val)] + while st: + node, path_sum = st.pop() + # 如果该节点是叶子节点了,同时该节点的路径数值等于sum,那么就返回true + if not node.left and not node.right and path_sum == sum: + return True + # 右节点,压进去一个节点的时候,将该节点的路径数值也记录下来 + if node.right: + st.append((node.right, path_sum + node.right.val)) + # 左节点,压进去一个节点的时候,将该节点的路径数值也记录下来 + if node.left: + st.append((node.left, path_sum + node.left.val)) + return False + + + +``` - if cur_node.left: - stack.append((cur_node.left, path_sum + cur_node.left.val)) - return false -``` ### 0113.路径总和-ii -**递归** - +(版本一) 递归 ```python -class solution: - def pathsum(self, root: treenode, targetsum: int) -> list[list[int]]: - - def traversal(cur_node, remain): - if not cur_node.left and not cur_node.right: - if remain == 0: - result.append(path[:]) - return - - if cur_node.left: - path.append(cur_node.left.val) - traversal(cur_node.left, remain-cur_node.left.val) - path.pop() +# 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.result = [] + self.path = [] + + def traversal(self, cur, count): + if not cur.left and not cur.right and count == 0: # 遇到了叶子节点且找到了和为sum的路径 + self.result.append(self.path[:]) + return + + if not cur.left and not cur.right: # 遇到叶子节点而没有找到合适的边,直接返回 + return + + if cur.left: # 左 (空节点不遍历) + self.path.append(cur.left.val) + count -= cur.left.val + self.traversal(cur.left, count) # 递归 + count += cur.left.val # 回溯 + self.path.pop() # 回溯 + + if cur.right: # 右 (空节点不遍历) + self.path.append(cur.right.val) + count -= cur.right.val + self.traversal(cur.right, count) # 递归 + count += cur.right.val # 回溯 + self.path.pop() # 回溯 - if cur_node.right: - path.append(cur_node.right.val) - traversal(cur_node.right, remain-cur_node.right.val) - path.pop() + return - result, path = [], [] + def pathSum(self, root: TreeNode, sum: int) -> List[List[int]]: + self.result.clear() + self.path.clear() if not root: - return [] - path.append(root.val) - traversal(root, targetsum - root.val) - return result + return self.result + self.path.append(root.val) # 把根节点放进路径 + self.traversal(root, sum - root.val) + return self.result ``` -**迭代法,用第二个队列保存目前的总和与路径** - +(版本二) 递归 + 精简 ```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 pathSum(self, root: Optional[TreeNode], targetSum: int) -> List[List[int]]: - if not root: - return [] - que, temp = deque([root]), deque([(root.val, [root.val])]) + def pathSum(self, root: TreeNode, targetSum: int) -> List[List[int]]: + result = [] - while que: - for _ in range(len(que)): - node = que.popleft() - value, path = temp.popleft() - if (not node.left) and (not node.right): - if value == targetSum: - result.append(path) - if node.left: - que.append(node.left) - temp.append((node.left.val+value, path+[node.left.val])) - if node.right: - que.append(node.right) - temp.append((node.right.val+value, path+[node.right.val])) + self.traversal(root, targetSum, [], result) return result + def traversal(self,node, count, path, result): + if not node: + return + path.append(node.val) + count -= node.val + if not node.left and not node.right and count == 0: + result.append(list(path)) + self.traversal(node.left, count, path, result) + self.traversal(node.right, count, path, result) + path.pop() ``` - -**迭代法,前序遍历** - +(版本三) 迭代 ```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 pathSum(self, root: Optional[TreeNode], targetSum: int) -> List[List[int]]: - if not root: return [] - stack, path_stack,result = [[root,root.val]],[[root.val]],[] + def pathSum(self, root: TreeNode, targetSum: int) -> List[List[int]]: + if not root: + return [] + stack = [(root, [root.val])] + res = [] while stack: - cur,cursum = stack.pop() - path = path_stack.pop() - if cur.left==cur.right==None: - if cursum==targetSum: result.append(path) - if cur.right: - stack.append([cur.right,cursum+cur.right.val]) - path_stack.append(path+[cur.right.val]) - if cur.left: - stack.append([cur.left,cursum+cur.left.val]) - path_stack.append(path+[cur.left.val]) - return result + node, path = stack.pop() + if not node.left and not node.right and sum(path) == targetSum: + res.append(path) + if node.right: + stack.append((node.right, path + [node.right.val])) + if node.left: + stack.append((node.left, path + [node.left.val])) + return res + + + ``` ## go From 61d479ec47df5d3a1743c4de97ba0e4175954959 Mon Sep 17 00:00:00 2001 From: Lozakaka <102352821+Lozakaka@users.noreply.github.com> Date: Mon, 8 May 2023 15:59:31 -0400 Subject: [PATCH 1816/3019] improving java solution by using stringBuilder 1. improving java solution by using stringBuilder 2. adding explanation in the code --- ...\345\216\237IP\345\234\260\345\235\200.md" | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git "a/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" "b/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" index 9d4d59180e..7b15aad987 100644 --- "a/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" +++ "b/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" @@ -314,6 +314,47 @@ class Solution { return true; } } +//方法一:但使用stringBuilder,故优化时间、空间复杂度,因为向字符串插入字符时无需复制整个字符串,从而减少了操作的时间复杂度,也不用开新空间存subString,从而减少了空间复杂度。 +class Solution { + List result = new ArrayList<>(); + public List restoreIpAddresses(String s) { + StringBuilder sb = new StringBuilder(s); + backTracking(sb, 0, 0); + return result; + } + private void backTracking(StringBuilder s, int startIndex, int dotCount){ + if(dotCount == 3){ + if(isValid(s, startIndex, s.length() - 1)){ + result.add(s.toString()); + } + return; + } + for(int i = startIndex; i < s.length(); i++){ + if(isValid(s, startIndex, i)){ + s.insert(i + 1, '.'); + backTracking(s, i + 2, dotCount + 1); + s.deleteCharAt(i + 1); + }else{ + break; + } + } + } + //[start, end] + private boolean isValid(StringBuilder s, int start, int end){ + if(start > end) + return false; + if(s.charAt(start) == '0' && start != end) + return false; + int num = 0; + for(int i = start; i <= end; i++){ + int digit = s.charAt(i) - '0'; + num = num * 10 + digit; + if(num > 255) + return false; + } + return true; + } +} //方法二:比上面的方法时间复杂度低,更好地剪枝,优化时间复杂度 class Solution { @@ -358,6 +399,7 @@ class Solution { } ``` + ## python python2: From 898c42a990b57ab9824d53efd7a2b647dd2724d9 Mon Sep 17 00:00:00 2001 From: Lozakaka <102352821+Lozakaka@users.noreply.github.com> Date: Mon, 8 May 2023 18:10:28 -0400 Subject: [PATCH 1817/3019] =?UTF-8?q?=E6=96=B0=E5=A2=9Ejava=E7=94=A8set2k?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...36\345\255\220\345\272\217\345\210\227.md" | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git "a/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" "b/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" index 436dbf01c8..2a58f55072 100644 --- "a/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" @@ -203,6 +203,30 @@ public: ### Java +```Java +//using set, aligned with the unimproved method +class Solution { + List> result = new ArrayList<>(); + List path = new ArrayList<>(); + public List> findSubsequences(int[] nums) { + backTracking(nums, 0); + return result; + } + private void backTracking(int[] nums, int startIndex){ + if(path.size() >= 2) + result.add(new ArrayList<>(path)); + HashSet hs = new HashSet<>(); + for(int i = startIndex; i < nums.length; i++){ + if(!path.isEmpty() && path.get(path.size() -1 ) > nums[i] || hs.contains(nums[i])) + continue; + hs.add(nums[i]); + path.add(nums[i]); + backTracking(nums, i + 1); + path.remove(path.size() - 1); + } + } +} +``` ```java class Solution { From 40f8230fd86b475e87d970f973042a2b4cbee613 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Tue, 9 May 2023 00:20:58 -0500 Subject: [PATCH 1818/3019] =?UTF-8?q?Update=200106.=E4=BB=8E=E4=B8=AD?= =?UTF-8?q?=E5=BA=8F=E4=B8=8E=E5=90=8E=E5=BA=8F=E9=81=8D=E5=8E=86=E5=BA=8F?= =?UTF-8?q?=E5=88=97=E6=9E=84=E9=80=A0=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 代码重复 --- ...40\344\272\214\345\217\211\346\240\221.md" | 38 +------------------ 1 file changed, 2 insertions(+), 36 deletions(-) diff --git "a/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" "b/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" index adb374f957..89afad084a 100644 --- "a/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" @@ -400,8 +400,6 @@ public: }; ``` -## Python - # 105.从前序与中序遍历序列构造二叉树 @@ -657,38 +655,6 @@ class Solution { ## Python -```python -class Solution: - def buildTree(self, inorder: List[int], postorder: List[int]) -> Optional[TreeNode]: - # 第一步: 特殊情况讨论: 树为空. 或者说是递归终止条件 - if not postorder: - return - - # 第二步: 后序遍历的最后一个就是当前的中间节点 - root_val = postorder[-1] - root = TreeNode(root_val) - - # 第三步: 找切割点. - root_index = inorder.index(root_val) - - # 第四步: 切割inorder数组. 得到inorder数组的左,右半边. - left_inorder = inorder[:root_index] - right_inorder = inorder[root_index + 1:] - - # 第五步: 切割postorder数组. 得到postorder数组的左,右半边. - # ⭐️ 重点1: 中序数组大小一定跟后序数组大小是相同的. - left_postorder = postorder[:len(left_inorder)] - right_postorder = postorder[len(left_inorder): len(postorder) - 1] - - - # 第六步: 递归 - root.left = self.buildTree(left_inorder, left_postorder) - root.right = self.buildTree(right_inorder, right_postorder) - - # 第七步: 返回答案 - return root -``` - 105.从前序与中序遍历序列构造二叉树 ```python @@ -717,7 +683,7 @@ class Solution: # 第六步: 递归 root.left = self.buildTree(preorder_left, inorder_left) root.right = self.buildTree(preorder_right, inorder_right) - + # 第七步: 返回答案 return root ``` @@ -749,7 +715,7 @@ class Solution: # 第六步: 递归 root.left = self.buildTree(inorder_left, postorder_left) root.right = self.buildTree(inorder_right, postorder_right) - + # 第七步: 返回答案 return root ``` From 7eea41ee0e18381088bce52f7ea218e1ffc78c77 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Tue, 9 May 2023 14:04:22 -0500 Subject: [PATCH 1819/3019] =?UTF-8?q?Update=200654.=E6=9C=80=E5=A4=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 --- ...47\344\272\214\345\217\211\346\240\221.md" | 86 +++++++++++-------- 1 file changed, 52 insertions(+), 34 deletions(-) diff --git "a/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" "b/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" index 64b38b488e..224e75e44c 100644 --- "a/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" @@ -259,52 +259,70 @@ 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 constructMaximumBinaryTree(self, nums: List[int]) -> TreeNode: - if not nums: - return None - maxvalue = max(nums) - index = nums.index(maxvalue) + if len(nums) == 1: + return TreeNode(nums[0]) + node = TreeNode(0) + # 找到数组中最大的值和对应的下标 + maxValue = 0 + maxValueIndex = 0 + for i in range(len(nums)): + if nums[i] > maxValue: + maxValue = nums[i] + maxValueIndex = i + node.val = maxValue + # 最大值所在的下标左区间 构造左子树 + if maxValueIndex > 0: + new_list = nums[:maxValueIndex] + node.left = self.constructMaximumBinaryTree(new_list) + # 最大值所在的下标右区间 构造右子树 + if maxValueIndex < len(nums) - 1: + new_list = nums[maxValueIndex+1:] + node.right = self.constructMaximumBinaryTree(new_list) + return node - root = TreeNode(maxvalue) +``` +(版本二) 使用下标 +class Solution: + def traversal(self, nums: List[int], left: int, right: int) -> TreeNode: + if left >= right: + return None + maxValueIndex = left + for i in range(left + 1, right): + if nums[i] > nums[maxValueIndex]: + maxValueIndex = i + root = TreeNode(nums[maxValueIndex]) + root.left = self.traversal(nums, left, maxValueIndex) + root.right = self.traversal(nums, maxValueIndex + 1, right) + return root - left = nums[:index] - right = nums[index + 1:] + def constructMaximumBinaryTree(self, nums: List[int]) -> TreeNode: + return self.traversal(nums, 0, len(nums)) - root.left = self.constructMaximumBinaryTree(left) - root.right = self.constructMaximumBinaryTree(right) - return root +``` +(版本三) 使用切片 class Solution: - """最大二叉树 递归法""" - def constructMaximumBinaryTree(self, nums: List[int]) -> TreeNode: - return self.traversal(nums, 0, len(nums)) - - def traversal(self, nums: List[int], begin: int, end: int) -> TreeNode: - # 列表长度为0时返回空节点 - if begin == end: + if not nums: return None + max_val = max(nums) + max_index = nums.index(max_val) + node = TreeNode(max_val) + node.left = self.constructMaximumBinaryTree(nums[:max_index]) + node.right = self.constructMaximumBinaryTree(nums[max_index+1:]) + return node - # 找到最大的值和其对应的下标 - 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 ``` - ### Go From a45046be8a6387a0c4e7fbf6872c554b6a2f3249 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Tue, 9 May 2023 15:11:13 -0500 Subject: [PATCH 1820/3019] =?UTF-8?q?Update=200617.=E5=90=88=E5=B9=B6?= =?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 添加 创建 root节点 和 python queue的代码优化版本 --- ...66\344\272\214\345\217\211\346\240\221.md" | 67 ++++++++++++++++++- 1 file changed, 64 insertions(+), 3 deletions(-) diff --git "a/problems/0617.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md" "b/problems/0617.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md" index f98948f0f3..18a245c4db 100644 --- "a/problems/0617.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0617.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md" @@ -352,8 +352,7 @@ class Solution { ``` ### Python - -**递归法 - 前序遍历** +(版本一) 递归 - 前序 - 修改root1 ```python # Definition for a binary tree node. # class TreeNode: @@ -376,9 +375,34 @@ class Solution: return root1 # ⚠️ 注意: 本题我们重复使用了题目给出的节点而不是创建新节点. 节省时间, 空间. +``` +(版本二) 递归 - 前序 - 新建root +```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 mergeTrees(self, root1: TreeNode, root2: TreeNode) -> TreeNode: + # 递归终止条件: + # 但凡有一个节点为空, 就立刻返回另外一个. 如果另外一个也为None就直接返回None. + if not root1: + return root2 + if not root2: + return root1 + # 上面的递归终止条件保证了代码执行到这里root1, root2都非空. + root = TreeNode() # 创建新节点 + root.val += root1.val + root2.val# 中 + root.left = self.mergeTrees(root1.left, root2.left) #左 + root.right = self.mergeTrees(root1.right, root2.right) # 右 + + return root # ⚠️ 注意: 本题我们创建了新节点. + ``` -**迭代法** +(版本三) 迭代 ```python class Solution: def mergeTrees(self, root1: TreeNode, root2: TreeNode) -> TreeNode: @@ -413,7 +437,44 @@ class Solution: return root1 ``` +(版本四) 迭代 + 代码优化 +```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 +from collections import deque + +class Solution: + def mergeTrees(self, root1: TreeNode, root2: TreeNode) -> TreeNode: + if not root1: + return root2 + if not root2: + return root1 + + queue = deque() + queue.append((root1, root2)) + + while queue: + node1, node2 = queue.popleft() + node1.val += node2.val + if node1.left and node2.left: + queue.append((node1.left, node2.left)) + elif not node1.left: + node1.left = node2.left + + if node1.right and node2.right: + queue.append((node1.right, node2.right)) + elif not node1.right: + node1.right = node2.right + + return root1 + + +``` ### Go ```go From 2d06a685ea39c988ad48b1a6025c8476cc06a640 Mon Sep 17 00:00:00 2001 From: NeedyChild <100189185+NeedyChild@users.noreply.github.com> Date: Tue, 9 May 2023 15:22:33 -0700 Subject: [PATCH 1821/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200494.=E7=9B=AE?= =?UTF-8?q?=E6=A0=87=E5=92=8C.md=20Java=E7=89=88=E6=9C=AC=E7=9A=84?= =?UTF-8?q?=E4=BA=8C=E7=BB=B4=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 --- ...4.\347\233\256\346\240\207\345\222\214.md" | 79 +++++++++++++++++++ 1 file changed, 79 insertions(+) diff --git "a/problems/0494.\347\233\256\346\240\207\345\222\214.md" "b/problems/0494.\347\233\256\346\240\207\345\222\214.md" index cc2bc8df83..f8843d0855 100644 --- "a/problems/0494.\347\233\256\346\240\207\345\222\214.md" +++ "b/problems/0494.\347\233\256\346\240\207\345\222\214.md" @@ -292,6 +292,85 @@ class Solution { } ``` +易于理解的二维数组版本: +```java +class Solution { + public int findTargetSumWays(int[] nums, int target) { + + // 01背包应用之“有多少种不同的填满背包最大容量的方法“ + // 易于理解的二维数组解法及详细注释 + + int sum = 0; + for(int i = 0; i < nums.length; i++) { + sum += nums[i]; + } + + // 注意nums[i] >= 0的题目条件,意味着sum也是所有nums[i]的绝对值之和 + // 这里保证了sum + target一定是大于等于零的,也就是left大于等于零(毕竟我们定义left大于right) + if(sum < Math.abs(target)){ + return 0; + } + + // 利用二元一次方程组将left用target和sum表示出来(替换掉right组合),详见代码随想录对此题的分析 + // 如果所求的left数组和为小数,则作为整数数组的nums里的任何元素自然是没有办法凑出这个小数的 + if((sum + target) % 2 != 0) { + return 0; + } + + int left = (sum + target) / 2; + + // dp[i][j]:遍历到数组第i个数时, left为j时的能装满背包的方法总数 + int[][] dp = new int[nums.length][left + 1]; + + // 初始化最上行(dp[0][j]),当nums[0] == j时(注意nums[0]和j都一定是大于等于零的,因此不需要判断等于-j时的情况),有唯一一种取法可取到j,dp[0][j]此时等于1 + // 其他情况dp[0][j] = 0 + // java整数数组默认初始值为0 + for(int j = 0; j <= left; j++) { + if(nums[0] == j) { + dp[0][j] = 1; + } + } + + // 初始化最左列(dp[i][0]) + // 当从nums数组的索引0到i的部分有n个0时(n > 0),每个0可以取+/-,因此有2的n次方中可以取到j = 0的方案 + // n = 0说明当前遍历到的数组部分没有0全为正数,因此只有一种方案可以取到j = 0(就是所有数都不取) + int numZeros = 0; + for(int i = 0; i < nums.length; i++) { + if(nums[i] == 0) { + numZeros++; + } + dp[i][0] = (int) Math.pow(2, numZeros); + + } + + // 递推公式分析: + // 当nums[i] > j时,这时候nums[i]一定不能取,所以是dp[i - 1][j]种方案数 + // nums[i] <= j时,num[i]可取可不取,因此方案数是dp[i - 1][j] + dp[i - 1][j - nums[i]] + // 由递推公式可知,先遍历i或j都可 + for(int i = 1; i < nums.length; i++) { + for(int j = 1; j <= left; j++) { + if(nums[i] > j) { + dp[i][j] = dp[i - 1][j]; + } else { + dp[i][j] = dp[i - 1][j] + dp[i - 1][j - nums[i]]; + } + } + } + + // 打印dp数组 + // for(int i = 0; i < nums.length; i++) { + // for(int j = 0; j <= left; j++) { + // System.out.print(dp[i][j] + " "); + // } + // System.out.println(""); + // } + + return dp[nums.length - 1][left]; + + } +} +``` + ### Python ```python class Solution: From 3818de4610acd3a1a3e1a9794f3e6caa4320a9e9 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Tue, 9 May 2023 18:50:14 -0500 Subject: [PATCH 1822/3019] =?UTF-8?q?Update=200700.=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=90=9C=E7=B4=A2?= =?UTF-8?q?.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\221\344\270\255\347\232\204\346\220\234\347\264\242.md" | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git "a/problems/0700.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\220\234\347\264\242.md" "b/problems/0700.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\220\234\347\264\242.md" index 40724f48a8..13064f9717 100644 --- "a/problems/0700.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\220\234\347\264\242.md" +++ "b/problems/0700.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\220\234\347\264\242.md" @@ -230,7 +230,7 @@ class Solution { ### Python -递归法: +(方法一) 递归 ```python class Solution: @@ -250,12 +250,12 @@ class Solution: ``` -迭代法: +(方法二)迭代 ```python class Solution: def searchBST(self, root: TreeNode, val: int) -> TreeNode: - while root is not None: + while root: if val < root.val: root = root.left elif val > root.val: root = root.right else: return root From 38503ddc59e4554ac2316ca9c6e486b48285df8a Mon Sep 17 00:00:00 2001 From: fwqaaq Date: Fri, 12 May 2023 20:41:46 +0800 Subject: [PATCH 1823/3019] =?UTF-8?q?Update=201049.=E6=9C=80=E5=90=8E?= =?UTF-8?q?=E4=B8=80=E5=9D=97=E7=9F=B3=E5=A4=B4=E7=9A=84=E9=87=8D=E9=87=8F?= =?UTF-8?q?II.md=20about=20rust?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\347\232\204\351\207\215\351\207\217II.md" | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git "a/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" "b/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" index 210ce73738..a8150b1f04 100644 --- "a/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" +++ "b/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" @@ -379,8 +379,23 @@ object Solution { } ``` - - +### Rust + +```rust +impl Solution { + pub fn last_stone_weight_ii(stones: Vec) -> i32 { + let sum = stones.iter().sum::(); + let target = sum as usize / 2; + let mut dp = vec![0; target + 1]; + for s in stones { + for j in (s as usize..=target).rev() { + dp[j] = dp[j].max(dp[j - s as usize] + s); + } + } + sum - dp[target] * 2 + } +} +```

From db21086b42d3a7ff1d07dbe4bfbf3e94bd2301b8 Mon Sep 17 00:00:00 2001 From: fwqaaq Date: Fri, 12 May 2023 22:09:19 +0800 Subject: [PATCH 1824/3019] =?UTF-8?q?Update=200494.=E7=9B=AE=E6=A0=87?= =?UTF-8?q?=E5=92=8C.md=20about=20rust?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...4.\347\233\256\346\240\207\345\222\214.md" | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git "a/problems/0494.\347\233\256\346\240\207\345\222\214.md" "b/problems/0494.\347\233\256\346\240\207\345\222\214.md" index cc2bc8df83..e9e3337080 100644 --- "a/problems/0494.\347\233\256\346\240\207\345\222\214.md" +++ "b/problems/0494.\347\233\256\346\240\207\345\222\214.md" @@ -417,6 +417,32 @@ object Solution { } ``` +### Rust + +```rust +impl Solution { + pub fn find_target_sum_ways(nums: Vec, target: i32) -> i32 { + let sum = nums.iter().sum::(); + if target.abs() > sum { + return 0; + } + if (target + sum) % 2 == 1 { + return 0; + } + let size = (sum + target) as usize / 2; + let mut dp = vec![0; size + 1]; + dp[0] = 1; + for n in nums { + for s in (n as usize..=size).rev() { + // + dp[s] += dp[s - n as usize]; + } + } + dp[size] + } +} +``` +

From 03829cde0d626a5d77609b29d6a1581924e40800 Mon Sep 17 00:00:00 2001 From: fwqaaq Date: Fri, 12 May 2023 22:09:48 +0800 Subject: [PATCH 1825/3019] Apply suggestions from code review --- "problems/0494.\347\233\256\346\240\207\345\222\214.md" | 1 - 1 file changed, 1 deletion(-) diff --git "a/problems/0494.\347\233\256\346\240\207\345\222\214.md" "b/problems/0494.\347\233\256\346\240\207\345\222\214.md" index e9e3337080..c9f888920f 100644 --- "a/problems/0494.\347\233\256\346\240\207\345\222\214.md" +++ "b/problems/0494.\347\233\256\346\240\207\345\222\214.md" @@ -434,7 +434,6 @@ impl Solution { dp[0] = 1; for n in nums { for s in (n as usize..=size).rev() { - // dp[s] += dp[s - n as usize]; } } From 1ed8111a24113240dc7707bc0cc4e56c575482e3 Mon Sep 17 00:00:00 2001 From: Lozakaka <102352821+Lozakaka@users.noreply.github.com> Date: Mon, 15 May 2023 15:21:03 -0400 Subject: [PATCH 1826/3019] =?UTF-8?q?=E6=96=B0=E5=A2=9E=20```Java=20?= =?UTF-8?q?=E4=BB=A5=E6=AD=A3=E5=B8=B8=E9=A1=AF=E7=A4=BA=E4=BF=9D=E7=95=99?= =?UTF-8?q?=E5=AD=97=E9=A1=8F=E8=89=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增 ```Java 以正常顯示保留字顏色 --- ...\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" "b/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" index 41a1ede256..94c7940486 100644 --- "a/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" +++ "b/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" @@ -367,7 +367,7 @@ class MyStack { ``` 优化,使用一个 Queue 实现,但用卡哥的逻辑实现 -``` +```Java class MyStack { Queue queue; From 4948ef48f46d516a475f8bf57ab559b5a71513af Mon Sep 17 00:00:00 2001 From: Lozakaka <102352821+Lozakaka@users.noreply.github.com> Date: Wed, 17 May 2023 16:50:29 -0400 Subject: [PATCH 1827/3019] =?UTF-8?q?=E6=96=B0=E5=A2=9Ejava=E8=A7=A3?= =?UTF-8?q?=E6=B3=95=E4=B8=AD=20lambda=E4=BB=A5=E5=8F=8Alinkedlist.add?= =?UTF-8?q?=E7=9A=84=E8=A8=BB=E9=87=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增java解法中 lambda以及linkedlist.add的註釋 --- ...\230\351\207\215\345\273\272\351\230\237\345\210\227.md" | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git "a/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" "b/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" index 3f82d0bc20..67aef3ec1c 100644 --- "a/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" +++ "b/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" @@ -191,14 +191,14 @@ class Solution { public int[][] reconstructQueue(int[][] people) { // 身高从大到小排(身高相同k小的站前面) Arrays.sort(people, (a, b) -> { - if (a[0] == b[0]) return a[1] - b[1]; - return b[0] - a[0]; + if (a[0] == b[0]) return a[1] - b[1]; // a - b 是升序排列,故在a[0] == b[0]的狀況下,會根據k值升序排列 + return b[0] - a[0]; //b - a 是降序排列,在a[0] != b[0],的狀況會根據h值降序排列 }); LinkedList que = new LinkedList<>(); for (int[] p : people) { - que.add(p[1],p); + que.add(p[1],p); //Linkedlist.add(index, value),會將value插入到指定index裡。 } return que.toArray(new int[people.length][]); From 16f4a48bd6b0539c60eed95c4f2c54a052685386 Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Sat, 20 May 2023 15:30:25 +0800 Subject: [PATCH 1828/3019] update --- ...47\345\255\220\345\272\217\345\222\214.md" | 2 +- ...00\344\275\263\346\227\266\346\234\272.md" | 17 +++++++----- ...\344\275\263\346\227\266\346\234\272II.md" | 2 +- ...01\350\247\204\345\210\222\357\274\211.md" | 23 +++++++++------- ...344\275\263\346\227\266\346\234\272III.md" | 27 +++++++++++-------- ...\344\275\263\346\227\266\346\234\272IV.md" | 17 +++++++----- ...23\345\256\266\345\212\253\350\210\215.md" | 4 +++ ...\345\256\266\345\212\253\350\210\215II.md" | 25 ++++++++++------- ...53\345\206\267\345\206\273\346\234\237.md" | 4 +++ ...345\256\266\345\212\253\350\210\215III.md" | 5 ++++ ...01\350\247\204\345\210\222\357\274\211.md" | 5 ++++ ...04\346\225\260\347\273\204\345\222\214.md" | 23 ---------------- ...06\350\256\272\345\237\272\347\241\200.md" | 5 ++++ 13 files changed, 92 insertions(+), 67 deletions(-) diff --git "a/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" "b/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" index 48f8be29c1..39c5833287 100644 --- "a/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" +++ "b/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" @@ -124,7 +124,7 @@ public: ## 动态规划 -当然本题还可以用动态规划来做,当前[「代码随想录」](https://img-blog.csdnimg.cn/20201124161234338.png)主要讲解贪心系列,后续到动态规划系列的时候会详细讲解本题的 dp 方法。 +当然本题还可以用动态规划来做,在代码随想录动态规划章节我会详细介绍,如果大家想在想看,可以直接跳转:[动态规划版本详解](https://programmercarl.com/0053.%E6%9C%80%E5%A4%A7%E5%AD%90%E5%BA%8F%E5%92%8C%EF%BC%88%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92%EF%BC%89.html#%E6%80%9D%E8%B7%AF) 那么先给出我的 dp 代码如下,有时间的录友可以提前做一做: diff --git "a/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" "b/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" index 5b398f3fc7..753cb10692 100644 --- "a/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" +++ "b/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" @@ -14,16 +14,21 @@ 返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。 -示例 1: -输入:[7,1,5,3,6,4] -输出:5 +* 示例 1: +* 输入:[7,1,5,3,6,4] +* 输出:5 解释:在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格;同时,你不能在买入前卖出股票。 -示例 2: -输入:prices = [7,6,4,3,1] -输出:0 +* 示例 2: +* 输入:prices = [7,6,4,3,1] +* 输出:0 解释:在这种情况下, 没有交易完成, 所以最大利润为 0。 +# 算法公开课 + +**《代码随想录》算法视频公开课:[动态规划之 LeetCode:121.买卖股票的最佳时机1](https://www.bilibili.com/video/BV1Xe4y1u77q),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 + + ## 思路 diff --git "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" index e631c5e2ae..0d8ad608d7 100644 --- "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" +++ "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" @@ -102,7 +102,7 @@ public: ### 动态规划 -动态规划将在下一个系列详细讲解,本题解先给出我的 C++代码(带详细注释),感兴趣的同学可以自己先学习一下。 +动态规划将在下一个系列详细讲解,本题解先给出我的 C++代码(带详细注释),想先学习的话,可以看本篇:[122.买卖股票的最佳时机II(动态规划)](https://programmercarl.com/0122.%E4%B9%B0%E5%8D%96%E8%82%A1%E7%A5%A8%E7%9A%84%E6%9C%80%E4%BD%B3%E6%97%B6%E6%9C%BAII%EF%BC%88%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92%EF%BC%89.html#%E6%80%9D%E8%B7%AF) ```CPP class Solution { diff --git "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" index 2779083d89..146c6a4cb1 100644 --- "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" +++ "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" @@ -15,25 +15,30 @@ 注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。 -示例 1: -输入: [7,1,5,3,6,4] -输出: 7 +* 示例 1: +* 输入: [7,1,5,3,6,4] +* 输出: 7 解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4。随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6-3 = 3 。 -示例 2: -输入: [1,2,3,4,5] -输出: 4 +* 示例 2: +* 输入: [1,2,3,4,5] +* 输出: 4 解释: 在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。注意你不能在第 1 天和第 2 天接连购买股票,之后再将它们卖出。因为这样属于同时参与了多笔交易,你必须在再次购买前出售掉之前的股票。 -示例 3: -输入: [7,6,4,3,1] -输出: 0 +* 示例 3: +* 输入: [7,6,4,3,1] +* 输出: 0 解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。 提示: * 1 <= prices.length <= 3 * 10 ^ 4 * 0 <= prices[i] <= 10 ^ 4 +# 算法公开课 + +**《代码随想录》算法视频公开课:[动态规划,股票问题第二弹 | LeetCode:122.买卖股票的最佳时机II](https://www.bilibili.com/video/BV1D24y1Q7Ls),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 + + ## 思路 本题我们在讲解贪心专题的时候就已经讲解过了[贪心算法:买卖股票的最佳时机II](https://programmercarl.com/0122.买卖股票的最佳时机II.html),只不过没有深入讲解动态规划的解法,那么这次我们再好好分析一下动规的解法。 diff --git "a/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" "b/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" index 33157238ac..af6870d4cc 100644 --- "a/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" +++ "b/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" @@ -15,23 +15,23 @@ 注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。 -示例 1: -输入:prices = [3,3,5,0,0,3,1,4] -输出:6 +* 示例 1: +* 输入:prices = [3,3,5,0,0,3,1,4] +* 输出:6 解释:在第 4 天(股票价格 = 0)的时候买入,在第 6 天(股票价格 = 3)的时候卖出,这笔交易所能获得利润 = 3-0 = 3 。随后,在第 7 天(股票价格 = 1)的时候买入,在第 8 天 (股票价格 = 4)的时候卖出,这笔交易所能获得利润 = 4-1 = 3。 -示例 2: -输入:prices = [1,2,3,4,5] -输出:4 +* 示例 2: +* 输入:prices = [1,2,3,4,5] +* 输出:4 解释:在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4。注意你不能在第 1 天和第 2 天接连购买股票,之后再将它们卖出。因为这样属于同时参与了多笔交易,你必须在再次购买前出售掉之前的股票。 -示例 3: -输入:prices = [7,6,4,3,1] -输出:0 +* 示例 3: +* 输入:prices = [7,6,4,3,1] +* 输出:0 解释:在这个情况下, 没有交易完成, 所以最大利润为0。 -示例 4: -输入:prices = [1] +* 示例 4: +* 输入:prices = [1] 输出:0 提示: @@ -39,6 +39,11 @@ * 1 <= prices.length <= 10^5 * 0 <= prices[i] <= 10^5 +# 算法公开课 + +**《代码随想录》算法视频公开课:[动态规划,股票至多买卖两次,怎么求? | LeetCode:123.买卖股票最佳时机III](https://www.bilibili.com/video/BV1WG411K7AR),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 + + ## 思路 diff --git "a/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" "b/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" index f6744a2b36..37270664dd 100644 --- "a/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" +++ "b/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" @@ -14,14 +14,14 @@ 注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。 -示例 1: -输入:k = 2, prices = [2,4,1] -输出:2 +* 示例 1: +* 输入:k = 2, prices = [2,4,1] +* 输出:2 解释:在第 1 天 (股票价格 = 2) 的时候买入,在第 2 天 (股票价格 = 4) 的时候卖出,这笔交易所能获得利润 = 4-2 = 2。 -示例 2: -输入:k = 2, prices = [3,2,6,5,0,3] -输出:7 +* 示例 2: +* 输入:k = 2, prices = [3,2,6,5,0,3] +* 输出:7 解释:在第 2 天 (股票价格 = 2) 的时候买入,在第 3 天 (股票价格 = 6) 的时候卖出, 这笔交易所能获得利润 = 6-2 = 4。随后,在第 5 天 (股票价格 = 0) 的时候买入,在第 6 天 (股票价格 = 3) 的时候卖出, 这笔交易所能获得利润 = 3-0 = 3 。 @@ -31,6 +31,11 @@ * 0 <= prices.length <= 1000 * 0 <= prices[i] <= 1000 +# 算法公开课 + +**《代码随想录》算法视频公开课:[动态规划来决定最佳时机,至多可以买卖K次!| LeetCode:188.买卖股票最佳时机4](https://www.bilibili.com/video/BV16M411U7XJ),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 + + ## 思路 这道题目可以说是[动态规划:123.买卖股票的最佳时机III](https://programmercarl.com/0123.买卖股票的最佳时机III.html)的进阶版,这里要求至多有k次交易。 diff --git "a/problems/0198.\346\211\223\345\256\266\345\212\253\350\210\215.md" "b/problems/0198.\346\211\223\345\256\266\345\212\253\350\210\215.md" index c25f3b8677..b7cdc1ced2 100644 --- "a/problems/0198.\346\211\223\345\256\266\345\212\253\350\210\215.md" +++ "b/problems/0198.\346\211\223\345\256\266\345\212\253\350\210\215.md" @@ -31,6 +31,10 @@ * 0 <= nums.length <= 100 * 0 <= nums[i] <= 400 +# 算法公开课 + +**《代码随想录》算法视频公开课:[动态规划,偷不偷这个房间呢?| LeetCode:198.打家劫舍](https://www.bilibili.com/video/BV1Te411N7SX),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 + ## 思路 diff --git "a/problems/0213.\346\211\223\345\256\266\345\212\253\350\210\215II.md" "b/problems/0213.\346\211\223\345\256\266\345\212\253\350\210\215II.md" index becad06920..aebda7f53d 100644 --- "a/problems/0213.\346\211\223\345\256\266\345\212\253\350\210\215II.md" +++ "b/problems/0213.\346\211\223\345\256\266\345\212\253\350\210\215II.md" @@ -14,23 +14,28 @@ 示例 1: -输入:nums = [2,3,2] -输出:3 -解释:你不能先偷窃 1 号房屋(金额 = 2),然后偷窃 3 号房屋(金额 = 2), 因为他们是相邻的。 +* 输入:nums = [2,3,2] +* 输出:3 +* 解释:你不能先偷窃 1 号房屋(金额 = 2),然后偷窃 3 号房屋(金额 = 2), 因为他们是相邻的。 -示例 2: -输入:nums = [1,2,3,1] -输出:4 -解释:你可以先偷窃 1 号房屋(金额 = 1),然后偷窃 3 号房屋(金额 = 3)。偷窃到的最高金额 = 1 + 3 = 4 。 +* 示例 2: +* 输入:nums = [1,2,3,1] +* 输出:4 +* 解释:你可以先偷窃 1 号房屋(金额 = 1),然后偷窃 3 号房屋(金额 = 3)。偷窃到的最高金额 = 1 + 3 = 4 。 -示例 3: -输入:nums = [0] -输出:0 +* 示例 3: +* 输入:nums = [0] +* 输出:0 提示: * 1 <= nums.length <= 100 * 0 <= nums[i] <= 1000 +# 算法公开课 + +**《代码随想录》算法视频公开课:[动态规划,房间连成环了那还偷不偷呢?| LeetCode:213.打家劫舍II](https://www.bilibili.com/video/BV1oM411B7xq),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 + + ## 思路 这道题目和[198.打家劫舍](https://programmercarl.com/0198.打家劫舍.html)是差不多的,唯一区别就是成环了。 diff --git "a/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" "b/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" index d62e91c74a..a56d9b8464 100644 --- "a/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" +++ "b/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" @@ -20,6 +20,10 @@ * 输出: 3 * 解释: 对应的交易状态为: [买入, 卖出, 冷冻期, 买入, 卖出] +# 算法公开课 + +**《代码随想录》算法视频公开课:[动态规划来决定最佳时机,这次有冷冻期!| LeetCode:309.买卖股票的最佳时机含冷冻期](https://www.bilibili.com/video/BV1rP4y1D7ku),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 + ## 思路 diff --git "a/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" "b/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" index f75c4c88ad..ca8cea2369 100644 --- "a/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" +++ "b/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" @@ -16,6 +16,11 @@ ![337.打家劫舍III](https://code-thinking-1253855093.file.myqcloud.com/pics/20210223173849619.png) +# 算法公开课 + +**《代码随想录》算法视频公开课:[动态规划,房间连成树了,偷不偷呢?| LeetCode:337.打家劫舍3](https://www.bilibili.com/video/BV1H24y1Q7sY),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 + + ## 思路 这道题目和 [198.打家劫舍](https://programmercarl.com/0198.打家劫舍.html),[213.打家劫舍II](https://programmercarl.com/0213.打家劫舍II.html)也是如出一辙,只不过这个换成了树。 diff --git "a/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" "b/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" index 3973080778..12789934ff 100644 --- "a/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" +++ "b/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" @@ -32,6 +32,11 @@ * 0 < prices[i] < 50000. * 0 <= fee < 50000. +# 算法公开课 + +**《代码随想录》算法视频公开课:[动态规划来决定最佳时机,这次含手续费!| LeetCode:714.买卖股票的最佳时机含手续费](https://www.bilibili.com/video/BV1z44y1Z7UR),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 + + ## 思路 本题贪心解法:[贪心算法:买卖股票的最佳时机含手续费](https://programmercarl.com/0714.买卖股票的最佳时机含手续费.html) diff --git "a/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" "b/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" index 27a575c717..6252c697cd 100644 --- "a/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" +++ "b/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" @@ -130,29 +130,6 @@ class Solution { } ``` -```java -class Solution { - public int largestSumAfterKNegations(int[] A, int K) { - if (A.length == 1) return k % 2 == 0 ? A[0] : -A[0]; - Arrays.sort(A); - int sum = 0; - int idx = 0; - for (int i = 0; i < K; i++) { - if (i < A.length - 1 && A[idx] < 0) { - A[idx] = -A[idx]; - if (A[idx] >= Math.abs(A[idx + 1])) idx++; - continue; - } - A[idx] = -A[idx]; - } - - for (int i = 0; i < A.length; i++) { - sum += A[i]; - } - return sum; - } -} -``` ### Python ```python diff --git "a/problems/\345\212\250\346\200\201\350\247\204\345\210\222\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\345\212\250\346\200\201\350\247\204\345\210\222\347\220\206\350\256\272\345\237\272\347\241\200.md" index 77f01b1393..a99c069002 100644 --- "a/problems/\345\212\250\346\200\201\350\247\204\345\210\222\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\345\212\250\346\200\201\350\247\204\345\210\222\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -10,6 +10,11 @@ +## 算法公开课 + +**《代码随想录》算法视频公开课:[动态规划理论基础](https://www.bilibili.com/video/BV13Q4y197Wg),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 + + ## 什么是动态规划 动态规划,英文:Dynamic Programming,简称DP,如果某一问题有很多重叠子问题,使用动态规划是最有效的。 From b660360285c0fbf520106b7afd03f049bc0b6300 Mon Sep 17 00:00:00 2001 From: yujiahan2018 Date: Sat, 20 May 2023 19:29:45 +0800 Subject: [PATCH 1829/3019] =?UTF-8?q?Update=200718.=E6=9C=80=E9=95=BF?= =?UTF-8?q?=E9=87=8D=E5=A4=8D=E5=AD=90=E6=95=B0=E7=BB=84.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...15\345\255\220\346\225\260\347\273\204.md" | 52 ++++++++++++++++++- 1 file changed, 51 insertions(+), 1 deletion(-) diff --git "a/problems/0718.\346\234\200\351\225\277\351\207\215\345\244\215\345\255\220\346\225\260\347\273\204.md" "b/problems/0718.\346\234\200\351\225\277\351\207\215\345\244\215\345\255\220\346\225\260\347\273\204.md" index 08be67326e..31782d5d6c 100644 --- "a/problems/0718.\346\234\200\351\225\277\351\207\215\345\244\215\345\255\220\346\225\260\347\273\204.md" +++ "b/problems/0718.\346\234\200\351\225\277\351\207\215\345\244\215\345\255\220\346\225\260\347\273\204.md" @@ -198,7 +198,57 @@ public: 而且为了让 `if (dp[i][j] > result) result = dp[i][j];` 收集到全部结果,两层for训练一定从0开始遍历,这样需要加上 `&& i > 0 && j > 0`的判断。 -相对于版本一来说还是多写了不少代码。而且逻辑上也复杂了一些。 优势就是dp数组的定义,更直观一点。 +对于基础不牢的小白来说,在推导出转移方程后可能疑惑上述代码为什么要从`i=0,j=0`遍历而不是从`i=1,j=1`开始遍历,原因在于这里如果不是从`i=0,j=0`位置开始遍历,会漏掉如下样例结果: +```txt +nums1 = [70,39,25,40,7] +nums2 = [52,20,67,5,31] +``` + +当然,如果你愿意也可以使用如下代码,与上面那个c++是同一思路: +```java +class Solution { + public int findLength(int[] nums1, int[] nums2) { + int len1 = nums1.length; + int len2 = nums2.length; + int[][] result = new int[len1][len2]; + + int maxresult = Integer.MIN_VALUE; + + for(int i=0;i Date: Sat, 20 May 2023 19:31:51 +0800 Subject: [PATCH 1830/3019] =?UTF-8?q?Update=200198.=E6=89=93=E5=AE=B6?= =?UTF-8?q?=E5=8A=AB=E8=88=8D.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...23\345\256\266\345\212\253\350\210\215.md" | 35 +++++++++++++++++-- 1 file changed, 32 insertions(+), 3 deletions(-) diff --git "a/problems/0198.\346\211\223\345\256\266\345\212\253\350\210\215.md" "b/problems/0198.\346\211\223\345\256\266\345\212\253\350\210\215.md" index 6e682ec39e..7c8ba4db36 100644 --- "a/problems/0198.\346\211\223\345\256\266\345\212\253\350\210\215.md" +++ "b/problems/0198.\346\211\223\345\256\266\345\212\253\350\210\215.md" @@ -141,7 +141,36 @@ class Solution { } } -// 空间优化 dp数组只存与计算相关的两次数据 +// 使用滚动数组思想,优化空间 +// 分析本题可以发现,所求结果仅依赖于前两种状态,此时可以使用滚动数组思想将空间复杂度降低为3个空间 +class Solution { + public int rob(int[] nums) { + + int len = nums.length; + + if (len == 0) return 0; + else if (len == 1) return nums[0]; + else if (len == 2) return Math.max(nums[0],nums[1]); + + + int[] result = new int[3]; //存放选择的结果 + result[0] = nums[0]; + result[1] = Math.max(nums[0],nums[1]); + + + for(int i=2;i nums[1] ? nums[0] : nums[1]; + dp[1] = Math.max(nums[0],nums[1]); int res = 0; // 遍历 for (int i = 2; i < nums.length; i++) { - res = (dp[0] + nums[i]) > dp[1] ? (dp[0] + nums[i]) : dp[1]; + res = Math.max((dp[0] + nums[i]) , dp[1] ); dp[0] = dp[1]; dp[1] = res; } From f5329cd4b913d73f049e6b30f7d2a3a8a2a90770 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Mon, 22 May 2023 15:38:38 -0500 Subject: [PATCH 1831/3019] =?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 --- ...41\344\272\214\345\217\211\346\240\221.md" | 48 ++++++++++++++++++- 1 file changed, 46 insertions(+), 2 deletions(-) diff --git "a/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" "b/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" index a3bc77fb11..c0561e1097 100644 --- "a/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" @@ -553,6 +553,52 @@ class Solution: 迭代法: +```python +class Solution: + def getDepth(self, cur): + st = [] + if cur is not None: + st.append(cur) + depth = 0 + result = 0 + while st: + node = st[-1] + if node is not None: + st.pop() + st.append(node) # 中 + st.append(None) + depth += 1 + if node.right: + st.append(node.right) # 右 + if node.left: + st.append(node.left) # 左 + + else: + node = st.pop() + st.pop() + depth -= 1 + result = max(result, depth) + return result + + def isBalanced(self, root): + st = [] + if root is None: + return True + st.append(root) + while st: + node = st.pop() # 中 + if abs(self.getDepth(node.left) - self.getDepth(node.right)) > 1: + return False + if node.right: + st.append(node.right) # 右(空节点不入栈) + if node.left: + st.append(node.left) # 左(空节点不入栈) + return True + +``` + +迭代法精简版: + ```python class Solution: def isBalanced(self, root: Optional[TreeNode]) -> bool: @@ -576,8 +622,6 @@ class Solution: height_map[real_node] = 1 + max(left, right) return True ``` - - ### Go ```Go From 2024fc272af5811c3c594bf08959af2c9f62371d Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Mon, 22 May 2023 16:48:27 -0500 Subject: [PATCH 1832/3019] =?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 --- ...00\346\234\211\350\267\257\345\276\204.md" | 40 +++++++++---------- 1 file changed, 18 insertions(+), 22 deletions(-) diff --git "a/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" "b/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" index c396f4a0fb..4cafbded9f 100644 --- "a/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" +++ "b/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" @@ -473,31 +473,27 @@ class Solution { 递归法+回溯(版本一) ```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 -import copy -from typing import List, Optional - class Solution: - def binaryTreePaths(self, root: Optional[TreeNode]) -> List[str]: - if not root: - return [] + def traversal(self, cur, path, result): + path.append(cur.val) # 中 + if not cur.left and not cur.right: # 到达叶子节点 + sPath = '->'.join(map(str, path)) + result.append(sPath) + return + if cur.left: # 左 + self.traversal(cur.left, path, result) + path.pop() # 回溯 + if cur.right: # 右 + self.traversal(cur.right, path, result) + path.pop() # 回溯 + + def binaryTreePaths(self, root): result = [] - self.generate_paths(root, [], result) + path = [] + if not root: + return result + self.traversal(root, path, result) return result - - def generate_paths(self, node: TreeNode, path: List[int], result: List[str]) -> None: - path.append(node.val) - if not node.left and not node.right: - result.append('->'.join(map(str, path))) - if node.left: - self.generate_paths(node.left, copy.copy(path), result) - if node.right: - self.generate_paths(node.right, copy.copy(path), result) - path.pop() ``` From 9b770de8cccfee4588a4966086aa4f285c347d68 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Mon, 22 May 2023 17:07:10 -0500 Subject: [PATCH 1833/3019] =?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 --- ...46\211\200\346\234\211\350\267\257\345\276\204.md" | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git "a/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" "b/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" index 4cafbded9f..195b6f9422 100644 --- "a/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" +++ "b/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" @@ -497,7 +497,7 @@ class Solution: ``` -递归法+回溯(版本二) +递归法+隐形回溯(版本一) ```Python # Definition for a binary tree node. # class TreeNode: @@ -505,7 +505,6 @@ class Solution: # self.val = val # self.left = left # self.right = right -import copy from typing import List, Optional class Solution: @@ -523,13 +522,13 @@ class Solution: if not node.left and not node.right: result.append('->'.join(map(str, path))) else: - self.generate_paths(node.left, copy.copy(path), result) - self.generate_paths(node.right, copy.copy(path), result) - path.pop() + # path[:] 是隐藏回溯 + self.generate_paths(node.left, path[:], result) + self.generate_paths(node.right, path[:], result) ``` -递归法+隐形回溯 +递归法+隐形回溯(版本二) ```Python # Definition for a binary tree node. # class TreeNode: From 1a672740e99c000e44e1c5186bc57184b1f35b58 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Mon, 22 May 2023 17:14:09 -0500 Subject: [PATCH 1834/3019] =?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 --- ...200\346\234\211\350\267\257\345\276\204.md" | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git "a/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" "b/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" index 195b6f9422..31cbdb562f 100644 --- "a/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" +++ "b/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" @@ -512,19 +512,19 @@ class Solution: if not root: return [] result = [] - self.generate_paths(root, [], result) + self.traversal(root, [], result) return result - def generate_paths(self, node: TreeNode, path: List[int], result: List[str]) -> None: - if not node: + def traversal(self, cur: TreeNode, path: List[int], result: List[str]) -> None: + if not cur: return - path.append(node.val) - if not node.left and not node.right: + path.append(cur.val) + if not cur.left and not cur.right: result.append('->'.join(map(str, path))) - else: - # path[:] 是隐藏回溯 - self.generate_paths(node.left, path[:], result) - self.generate_paths(node.right, path[:], result) + if cur.left: + self.traversal(cur.left, path[:], result) + if cur.right: + self.traversal(cur.right, path[:], result) ``` From 2e81b18c5d92d99e7b50c35f0db76f8b824b3915 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Mon, 22 May 2023 19:04:11 -0500 Subject: [PATCH 1835/3019] =?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 --- ...4\346\211\200\346\234\211\350\267\257\345\276\204.md" | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git "a/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" "b/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" index 31cbdb562f..7bd56fbd0d 100644 --- "a/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" +++ "b/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" @@ -470,7 +470,7 @@ class Solution { ## Python: -递归法+回溯(版本一) +递归法+回溯 ```Python # Definition for a binary tree node. class Solution: @@ -561,16 +561,11 @@ class Solution: 迭代法: ```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)) + stack, path_st, result = [root], [str(root.val)], [] while stack: cur = stack.pop() From 117ef697fac9428f8982a9076a9f25445f1d72ee Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Mon, 22 May 2023 19:24:48 -0500 Subject: [PATCH 1836/3019] =?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 --- ...66\345\255\220\344\271\213\345\222\214.md" | 88 +++++++++++-------- 1 file changed, 52 insertions(+), 36 deletions(-) diff --git "a/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" "b/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" index 617978b743..aa2868df4e 100644 --- "a/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" +++ "b/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" @@ -247,8 +247,7 @@ class Solution { ### Python - -**递归后序遍历** +递归 ```python # Definition for a binary tree node. # class TreeNode: @@ -257,47 +256,64 @@ class Solution { # self.left = left # self.right = right class Solution: - def sumOfLeftLeaves(self, root: Optional[TreeNode]) -> int: - if not root: + def sumOfLeftLeaves(self, root): + if root is None: + return 0 + if root.left is None and root.right is None: return 0 - # 检查根节点的左子节点是否为叶节点 - if root.left and not root.left.left and not root.left.right: - left_val = root.left.val - else: - left_val = self.sumOfLeftLeaves(root.left) + leftValue = self.sumOfLeftLeaves(root.left) # 左 + if root.left and not root.left.left and not root.left.right: # 左子树是左叶子的情况 + leftValue = root.left.val - # 递归地计算右子树左叶节点的和 - right_val = self.sumOfLeftLeaves(root.right) - - return left_val + right_val + rightValue = self.sumOfLeftLeaves(root.right) # 右 + + sum_val = leftValue + rightValue # 中 + return sum_val ``` +递归精简版 -**迭代** ```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 sumOfLeftLeaves(self, root: TreeNode) -> int: - """ - Idea: Each time check current node's left node. - If current node don't have one, skip it. - """ - stack = [] - if root: - stack.append(root) - res = 0 - - while stack: - # 每次都把当前节点的左节点加进去. - cur_node = stack.pop() - if cur_node.left and not cur_node.left.left and not cur_node.left.right: - res += cur_node.left.val - - if cur_node.left: - stack.append(cur_node.left) - if cur_node.right: - stack.append(cur_node.right) - - return res + def sumOfLeftLeaves(self, root): + if root is None: + return 0 + leftValue = 0 + if root.left is not None and root.left.left is None and root.left.right is None: + leftValue = root.left.val + return leftValue + self.sumOfLeftLeaves(root.left) + self.sumOfLeftLeaves(root.right) +``` + +迭代法 +```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 sumOfLeftLeaves(self, root): + if root is None: + return 0 + st = [root] + result = 0 + while st: + node = st.pop() + if node.left and node.left.left is None and node.left.right is None: + result += node.left.val + if node.right: + st.append(node.right) + if node.left: + st.append(node.left) + return result + ``` ### Go From 1ac1a8c332fde5f37e848577fae4970e46c1d7e9 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Mon, 22 May 2023 19:42:19 -0500 Subject: [PATCH 1837/3019] =?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 --- ...70\213\350\247\222\347\232\204\345\200\274.md" | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git "a/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" "b/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" index 26768c74dc..743b0df9be 100644 --- "a/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" +++ "b/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" @@ -330,19 +330,24 @@ class Solution: # self.right = right from collections import deque class Solution: - def findBottomLeftValue(self, root: Optional[TreeNode]) -> int: - queue = deque([root]) + def findBottomLeftValue(self, root): + if root is None: + return 0 + queue = deque() + queue.append(root) + result = 0 while queue: size = len(queue) - leftmost = queue[0].val for i in range(size): node = queue.popleft() + if i == 0: + result = node.val if node.left: queue.append(node.left) if node.right: queue.append(node.right) - if not queue: - return leftmost + return result + ``` From 12634b2d89a00e25f2c3897a675c58922c93d0b0 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Mon, 22 May 2023 21:48:07 -0500 Subject: [PATCH 1838/3019] =?UTF-8?q?Update=200654.=E6=9C=80=E5=A4=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 --- ...4\200\345\244\247\344\272\214\345\217\211\346\240\221.md" | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git "a/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" "b/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" index 224e75e44c..07fbeb826f 100644 --- "a/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" @@ -292,6 +292,8 @@ class Solution: ``` (版本二) 使用下标 +```python + class Solution: def traversal(self, nums: List[int], left: int, right: int) -> TreeNode: if left >= right: @@ -309,7 +311,8 @@ class Solution: return self.traversal(nums, 0, len(nums)) -``` +```python + (版本三) 使用切片 class Solution: def constructMaximumBinaryTree(self, nums: List[int]) -> TreeNode: From 41cf3a4cdd276f52e2039a886ed21f0bdfa50444 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Mon, 22 May 2023 21:49:22 -0500 Subject: [PATCH 1839/3019] =?UTF-8?q?Update=200654.=E6=9C=80=E5=A4=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 --- ...4\200\345\244\247\344\272\214\345\217\211\346\240\221.md" | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git "a/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" "b/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" index 07fbeb826f..980523f5ec 100644 --- "a/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" @@ -292,7 +292,6 @@ class Solution: ``` (版本二) 使用下标 -```python class Solution: def traversal(self, nums: List[int], left: int, right: int) -> TreeNode: @@ -311,9 +310,11 @@ class Solution: return self.traversal(nums, 0, len(nums)) -```python (版本三) 使用切片 + +```python + class Solution: def constructMaximumBinaryTree(self, nums: List[int]) -> TreeNode: if not nums: From 7a544d95b8aa54cbb3e7457458fd4a67304048ae Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Mon, 22 May 2023 21:50:17 -0500 Subject: [PATCH 1840/3019] =?UTF-8?q?Update=200654.=E6=9C=80=E5=A4=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 --- ...234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git "a/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" "b/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" index 980523f5ec..33a9176ed1 100644 --- "a/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" @@ -292,6 +292,7 @@ class Solution: ``` (版本二) 使用下标 +```python class Solution: def traversal(self, nums: List[int], left: int, right: int) -> TreeNode: @@ -309,7 +310,7 @@ class Solution: def constructMaximumBinaryTree(self, nums: List[int]) -> TreeNode: return self.traversal(nums, 0, len(nums)) - + ``` (版本三) 使用切片 From 6498ee65f7d9d38e59d3e338bdbec9a79cb6a438 Mon Sep 17 00:00:00 2001 From: zdz <2549626703@qq.com> Date: Tue, 23 May 2023 22:36:43 +0800 Subject: [PATCH 1841/3019] =?UTF-8?q?fix=EF=BC=9A0123.=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?III=20=3D=E3=80=8B=E9=94=99=E8=AF=AF=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...4\346\234\200\344\275\263\346\227\266\346\234\272III.md" | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git "a/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" "b/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" index af6870d4cc..6ac9a576ea 100644 --- "a/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" +++ "b/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" @@ -242,9 +242,9 @@ class Solution { for (int i = 1; i < len; i++) { dp[i][1] = Math.max(dp[i - 1][1], -prices[i]); - dp[i][2] = Math.max(dp[i - 1][2], dp[i][1] + prices[i]); - dp[i][3] = Math.max(dp[i - 1][3], dp[i][2] - prices[i]); - dp[i][4] = Math.max(dp[i - 1][4], dp[i][3] + prices[i]); + dp[i][2] = Math.max(dp[i - 1][2], dp[i - 1][1] + prices[i]); + dp[i][3] = Math.max(dp[i - 1][3], dp[i - 1][2] - prices[i]); + dp[i][4] = Math.max(dp[i - 1][4], dp[i - 1][3] + prices[i]); } return dp[len - 1][4]; From 3058654e93415b39469468dabf4ac02907d04b71 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Tue, 23 May 2023 20:47:45 -0500 Subject: [PATCH 1842/3019] =?UTF-8?q?Update=200098.=E9=AA=8C=E8=AF=81?= =?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 --- ...11\346\220\234\347\264\242\346\240\221.md" | 178 +++++++++--------- 1 file changed, 87 insertions(+), 91 deletions(-) diff --git "a/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" index 95afe6805c..f2e148c239 100644 --- "a/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" +++ "b/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" @@ -341,117 +341,113 @@ class Solution { ## Python -**递归** - 利用BST中序遍历特性,把树"压缩"成数组 +递归法(版本一)利用中序递增性质,转换成数组 ```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 isValidBST(self, root: TreeNode) -> bool: - # 思路: 利用BST中序遍历的特性. - # 中序遍历输出的二叉搜索树节点的数值是有序序列 - candidate_list = [] - - def __traverse(root: TreeNode) -> None: - nonlocal candidate_list - if not root: - return - __traverse(root.left) - candidate_list.append(root.val) - __traverse(root.right) - - def __is_sorted(nums: list) -> bool: - for i in range(1, len(nums)): - if nums[i] <= nums[i - 1]: # ⚠️ 注意: Leetcode定义二叉搜索树中不能有重复元素 - return False - return True - - __traverse(root) - res = __is_sorted(candidate_list) - - return res + def __init__(self): + self.vec = [] + + def traversal(self, root): + if root is None: + return + self.traversal(root.left) + self.vec.append(root.val) # 将二叉搜索树转换为有序数组 + self.traversal(root.right) + + def isValidBST(self, root): + self.vec = [] # 清空数组 + self.traversal(root) + for i in range(1, len(self.vec)): + # 注意要小于等于,搜索树里不能有相同元素 + if self.vec[i] <= self.vec[i - 1]: + return False + return True + ``` -**递归** - 标准做法 +递归法(版本二)设定极小值,进行比较 ```python class Solution: - def isValidBST(self, root: TreeNode) -> bool: - # 规律: BST的中序遍历节点数值是从小到大. - cur_max = -float("INF") - def __isValidBST(root: TreeNode) -> bool: - nonlocal cur_max - - if not root: - return True - - is_left_valid = __isValidBST(root.left) - if cur_max < root.val: - cur_max = root.val - else: - return False - is_right_valid = __isValidBST(root.right) - - return is_left_valid and is_right_valid - return __isValidBST(root) + def __init__(self): + self.maxVal = float('-inf') # 因为后台测试数据中有int最小值 + + def isValidBST(self, root): + if root is None: + return True + + left = self.isValidBST(root.left) + # 中序遍历,验证遍历的元素是不是从小到大 + if self.maxVal < root.val: + self.maxVal = root.val + else: + return False + right = self.isValidBST(root.right) + + return left and right + ``` -**递归** - 避免初始化最小值做法: +递归法(版本三)直接取该树的最小值 ```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 isValidBST(self, root: TreeNode) -> bool: - # 规律: BST的中序遍历节点数值是从小到大. - pre = None - def __isValidBST(root: TreeNode) -> bool: - nonlocal pre - - if not root: - return True - - is_left_valid = __isValidBST(root.left) - if pre and pre.val>=root.val: return False - pre = root - is_right_valid = __isValidBST(root.right) - - return is_left_valid and is_right_valid - return __isValidBST(root) + def __init__(self): + self.pre = None # 用来记录前一个节点 + + def isValidBST(self, root): + if root is None: + return True + + left = self.isValidBST(root.left) + + if self.pre is not None and self.pre.val >= root.val: + return False + self.pre = root # 记录前一个节点 + + right = self.isValidBST(root.right) + return left and right + + + ``` +迭代法 ```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 isValidBST(self, root: TreeNode) -> bool: + def isValidBST(self, root): stack = [] cur = root - pre = None - while cur or stack: - if cur: # 指针来访问节点,访问到最底层 + pre = None # 记录前一个节点 + while cur is not None or len(stack) > 0: + if cur is not None: stack.append(cur) - cur = cur.left - else: # 逐一处理节点 - cur = stack.pop() - if pre and cur.val <= pre.val: # 比较当前节点和前节点的值的大小 + cur = cur.left # 左 + else: + cur = stack.pop() # 中 + if pre is not None and cur.val <= pre.val: return False - pre = cur - cur = cur.right + pre = cur # 保存前一个访问的结点 + cur = cur.right # 右 return True ``` -```python -# 遵循Carl的写法,只添加了节点判断的部分 -class Solution: - def isValidBST(self, root: TreeNode) -> bool: - # method 2 - que, pre = [], None - while root or que: - while root: - que.append(root) - root = root.left - root = que.pop() - # 对第一个节点只做记录,对后面的节点进行比较 - if pre is None: - pre = root.val - else: - if pre >= root.val: return False - pre = root.val - root = root.right - return True -``` + ## Go From 85e4c414571db69f8dd4c27c67928632845e65e4 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Tue, 23 May 2023 20:56:07 -0500 Subject: [PATCH 1843/3019] =?UTF-8?q?Update=200530.=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=90=9C=E7=B4=A2=E6=A0=91=E7=9A=84=E6=9C=80=E5=B0=8F=E7=BB=9D?= =?UTF-8?q?=E5=AF=B9=E5=B7=AE.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...17\347\273\235\345\257\271\345\267\256.md" | 100 ++++++++++-------- 1 file changed, 58 insertions(+), 42 deletions(-) diff --git "a/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" "b/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" index fa1430dec1..3fe57702e5 100644 --- "a/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" +++ "b/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" @@ -204,66 +204,82 @@ class Solution { ``` ## Python -递归 +递归法(版本一)利用中序递增,结合数组 ```python class Solution: - def getMinimumDifference(self, root: TreeNode) -> int: - res = [] - r = float("inf") - def buildaList(root): //把二叉搜索树转换成有序数组 - if not root: return None - if root.left: buildaList(root.left) //左 - res.append(root.val) //中 - if root.right: buildaList(root.right) //右 - return res - - buildaList(root) - for i in range(len(res)-1): // 统计有序数组的最小差值 - r = min(abs(res[i]-res[i+1]),r) - return r - - -class Solution: # 双指针法,不用数组 (同Carl写法) - 更快 - def getMinimumDifference(self, root: Optional[TreeNode]) -> int: - global pre,minval - pre = None - minval = 10**5 - self.traversal(root) - return minval + def __init__(self): + self.vec = [] - def traversal(self,root): - global pre,minval - if not root: return None + def traversal(self, root): + if root is None: + return self.traversal(root.left) - if pre and root.val-pre.val int: + def __init__(self): + self.result = float('inf') + self.pre = None + + def traversal(self, cur): + if cur is None: + return + self.traversal(cur.left) # 左 + if self.pre is not None: # 中 + self.result = min(self.result, cur.val - self.pre.val) + self.pre = cur # 记录前一个 + self.traversal(cur.right) # 右 + + def getMinimumDifference(self, root): + self.traversal(root) + return self.result + + +``` + +迭代法 +```python +class Solution: + def getMinimumDifference(self, root): stack = [] cur = root pre = None result = float('inf') - while cur or stack: - if cur: # 指针来访问节点,访问到最底层 - stack.append(cur) - cur = cur.left - else: # 逐一处理节点 + + while cur is not None or len(stack) > 0: + if cur is not None: + stack.append(cur) # 将访问的节点放进栈 + cur = cur.left # 左 + else: cur = stack.pop() - if pre: # 当前节点和前节点的值的差值 - result = min(result, abs(cur.val - pre.val)) + if pre is not None: # 中 + result = min(result, cur.val - pre.val) pre = cur - cur = cur.right + cur = cur.right # 右 + return result + + ``` - ## Go: 中序遍历,然后计算最小差值 From c5d1845f3f48ff7ccd78319fdb4481033b159df1 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Tue, 23 May 2023 21:06:32 -0500 Subject: [PATCH 1844/3019] =?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 --- ...55\347\232\204\344\274\227\346\225\260.md" | 136 +++++++++++------- 1 file changed, 83 insertions(+), 53 deletions(-) diff --git "a/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" "b/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" index b7ef606fe6..6dc8ed8332 100644 --- "a/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" +++ "b/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" @@ -475,8 +475,7 @@ class Solution { ## Python -> 递归法 -> 常量空间,递归产生的栈不算 +递归法(版本一)利用字典 ```python # Definition for a binary tree node. @@ -485,77 +484,108 @@ class Solution { # self.val = val # self.left = left # self.right = right +from collections import defaultdict + +class Solution: + def searchBST(self, cur, freq_map): + if cur is None: + return + freq_map[cur.val] += 1 # 统计元素频率 + self.searchBST(cur.left, freq_map) + self.searchBST(cur.right, freq_map) + + def findMode(self, root): + freq_map = defaultdict(int) # key:元素,value:出现频率 + result = [] + if root is None: + return result + self.searchBST(root, freq_map) + max_freq = max(freq_map.values()) + for key, freq in freq_map.items(): + if freq == max_freq: + result.append(key) + return result + +``` + +递归法(版本二)利用二叉搜索树性质 + +```python class Solution: def __init__(self): - self.pre = TreeNode() - self.count = 0 - self.max_count = 0 + self.maxCount = 0 # 最大频率 + self.count = 0 # 统计频率 + self.pre = None self.result = [] - def findMode(self, root: TreeNode) -> List[int]: - 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: + def searchBST(self, cur): + if cur is None: + return + + self.searchBST(cur.left) # 左 + # 中 + if self.pre is None: # 第一个节点 self.count = 1 - # 与前一个节点数值相同 - elif self.pre.val == cur.val: - self.count += 1 - # 与前一个节点数值不相同 - else: + elif self.pre.val == cur.val: # 与前一个节点数值相同 + self.count += 1 + else: # 与前一个节点数值不同 self.count = 1 - self.pre = cur + self.pre = cur # 更新上一个节点 - if self.count == self.max_count: + if self.count == self.maxCount: # 如果与最大值频率相同,放进result中 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) -``` + if self.count > self.maxCount: # 如果计数大于最大值频率 + self.maxCount = self.count # 更新最大频率 + self.result = [cur.val] # 很关键的一步,不要忘记清空result,之前result里的元素都失效了 + + self.searchBST(cur.right) # 右 + return + + def findMode(self, root): + self.count = 0 + self.maxCount = 0 + self.pre = None # 记录前一个节点 + self.result = [] -> 迭代法-中序遍历 -> 利用二叉搜索树特性,在历遍过程中更新结果,一次历遍 -> 但需要使用额外空间存储历遍的节点 + self.searchBST(root) + return self.result +``` +迭代法 ```python class Solution: - def findMode(self, root: TreeNode) -> List[int]: - stack = [] + def findMode(self, root): + st = [] cur = root pre = None - maxCount, count = 0, 0 - res = [] - while cur or stack: - if cur: # 指针来访问节点,访问到最底层 - stack.append(cur) - cur = cur.left - else: # 逐一处理节点 - cur = stack.pop() - if pre == None: # 第一个节点 + maxCount = 0 # 最大频率 + count = 0 # 统计频率 + result = [] + + while cur is not None or st: + if cur is not None: # 指针来访问节点,访问到最底层 + st.append(cur) # 将访问的节点放进栈 + cur = cur.left # 左 + else: + cur = st.pop() + if pre is None: # 第一个节点 count = 1 elif pre.val == cur.val: # 与前一个节点数值相同 count += 1 - else: + else: # 与前一个节点数值不同 count = 1 - if count == maxCount: - res.append(cur.val) - if count > maxCount: - maxCount = count - res.clear() - res.append(cur.val) + + if count == maxCount: # 如果和最大值相同,放进result中 + result.append(cur.val) + + if count > maxCount: # 如果计数大于最大值频率 + maxCount = count # 更新最大频率 + result = [cur.val] # 很关键的一步,不要忘记清空result,之前result里的元素都失效了 pre = cur - cur = cur.right - return res - + cur = cur.right # 右 + + return result ``` ## Go From daa5417db9ef711d219ca8e201c6dd0cd57c9a20 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Tue, 23 May 2023 21:11:37 -0500 Subject: [PATCH 1845/3019] =?UTF-8?q?Update=200236.=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=A0=91=E7=9A=84=E6=9C=80=E8=BF=91=E5=85=AC=E5=85=B1=E7=A5=96?= =?UTF-8?q?=E5=85=88.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...54\345\205\261\347\245\226\345\205\210.md" | 39 ++++++++++++++----- 1 file changed, 29 insertions(+), 10 deletions(-) diff --git "a/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" "b/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" index 33201def08..0ebd556669 100644 --- "a/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" +++ "b/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" @@ -274,25 +274,44 @@ 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: + def lowestCommonAncestor(self, root, p, q): + if root == q or root == p or root is None: return root - + left = self.lowestCommonAncestor(root.left, p, q) right = self.lowestCommonAncestor(root.right, p, q) - - if left and right: + + if left is not None and right is not None: return root - if left: + + if left is None and right is not None: + return right + elif left is not None and right is None: return left - return right + else: + return None ``` +递归法(版本二)精简 +```python +class Solution: + def lowestCommonAncestor(self, root, p, q): + if root == q or root == p or root is None: + return root + left = self.lowestCommonAncestor(root.left, p, q) + right = self.lowestCommonAncestor(root.right, p, q) + + if left is not None and right is not None: + return root + + if left is None: + return right + return left + +``` ## Go ```Go From e7b7aa8e4a85d49933ddfa14e4911cc8d0f72bfe Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Tue, 23 May 2023 21:16:37 -0500 Subject: [PATCH 1846/3019] =?UTF-8?q?Update=200235.=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=90=9C=E7=B4=A2=E6=A0=91=E7=9A=84=E6=9C=80=E8=BF=91=E5=85=AC?= =?UTF-8?q?=E5=85=B1=E7=A5=96=E5=85=88.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...54\345\205\261\347\245\226\345\205\210.md" | 45 ++++++++++++++----- 1 file changed, 34 insertions(+), 11 deletions(-) diff --git "a/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" "b/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" index 8353303aa3..9777bb0be8 100644 --- "a/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" +++ "b/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" @@ -275,34 +275,57 @@ class Solution { ## Python -递归法: +递归法(版本一) ```python class Solution: - """二叉搜索树的最近公共祖先 递归法""" + def traversal(self, cur, p, q): + if cur is None: + return cur + # 中 + if cur.val > p.val and cur.val > q.val: # 左 + left = self.traversal(cur.left, p, q) + if left is not None: + return left + + if cur.val < p.val and cur.val < q.val: # 右 + right = self.traversal(cur.right, p, q) + if right is not None: + return right + + return cur + + def lowestCommonAncestor(self, root, p, q): + return self.traversal(root, p, q) +``` - def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode': +迭代法(版本二)精简 +```python +class Solution: + def lowestCommonAncestor(self, root, p, q): 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: + elif root.val < p.val and root.val < q.val: return self.lowestCommonAncestor(root.right, p, q) - return root + else: + return root + ``` -迭代法: +迭代法 ```python class Solution: - """二叉搜索树的最近公共祖先 迭代法""" - - def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode': - while True: + def lowestCommonAncestor(self, root, p, q): + while root: 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 -``` + return None + +``` ## Go 递归法: From 511bf447936dbb628609c5b1cad23462f20ac817 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Tue, 23 May 2023 21:29:16 -0500 Subject: [PATCH 1847/3019] =?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 --- ...22\345\205\245\346\223\215\344\275\234.md" | 165 ++++++++---------- 1 file changed, 68 insertions(+), 97 deletions(-) diff --git "a/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" "b/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" index 4e834201bd..1ba7461fed 100644 --- "a/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" +++ "b/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" @@ -256,132 +256,103 @@ 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: - # 返回更新后的以当前root为根节点的新树,方便用于更新上一层的父子节点关系链 - - # Base Case - if not root: return TreeNode(val) - - # 单层递归逻辑: - if val < root.val: - # 将val插入至当前root的左子树中合适的位置 - # 并更新当前root的左子树为包含目标val的新左子树 - root.left = self.insertIntoBST(root.left, val) + def __init__(self): + self.parent = None + + def traversal(self, cur, val): + if cur is None: + node = TreeNode(val) + if val > self.parent.val: + self.parent.right = node + else: + self.parent.left = node + return - if root.val < val: - # 将val插入至当前root的右子树中合适的位置 - # 并更新当前root的右子树为包含目标val的新右子树 - root.right = self.insertIntoBST(root.right, val) + self.parent = cur + if cur.val > val: + self.traversal(cur.left, val) + if cur.val < val: + self.traversal(cur.right, val) - # 返回更新后的以当前root为根节点的新树 + def insertIntoBST(self, root, val): + self.parent = TreeNode(0) + if root is None: + return TreeNode(val) + self.traversal(root, val) return root + ``` -**递归法** - 无返回值 +递归法(版本二) ```python class Solution: - def insertIntoBST(self, root: TreeNode, val: int) -> TreeNode: - if not root: + def insertIntoBST(self, root, val): + if root is None: return TreeNode(val) parent = None - def __traverse(cur: TreeNode, val: int) -> None: - # 在函数运行的同时把新节点插入到该被插入的地方. - nonlocal parent - if not cur: - new_node = TreeNode(val) - if parent.val < val: - parent.right = new_node - else: - parent.left = new_node - return - - parent = cur # 重点: parent的作用只有运行到上面if not cur:才会发挥出来. - if cur.val < val: - __traverse(cur.right, val) - else: - __traverse(cur.left, val) - return - __traverse(root, val) - return root -``` - -**递归法** - 无返回值 - another easier way -```python -class Solution: - def insertIntoBST(self, root: Optional[TreeNode], val: int) -> Optional[TreeNode]: - newNode = TreeNode(val) - if not root: return newNode - - if not root.left and val < root.val: - root.left = newNode - if not root.right and val > root.val: - root.right = newNode - - if val < root.val: - self.insertIntoBST(root.left, val) - if val > root.val: - self.insertIntoBST(root.right, val) - + cur = root + while cur: + parent = cur + if val < cur.val: + cur = cur.left + else: + cur = cur.right + if val < parent.val: + parent.left = TreeNode(val) + else: + parent.right = TreeNode(val) return root ``` -**递归法** - 无返回值 有注释 不用Helper function +递归法(版本三) ```python class Solution: def insertIntoBST(self, root: Optional[TreeNode], val: int) -> Optional[TreeNode]: - if not root: # for root==None + if root is None or root.val == val: return TreeNode(val) - if root.valval: - if root.left==None: # found the parent + elif root.val > val: + if root.left is None: root.left = TreeNode(val) - else: # not found, keep searching + else: self.insertIntoBST(root.left, val) - # return the final tree + elif root.val < val: + if root.right is None: + root.right = TreeNode(val) + else: + self.insertIntoBST(root.right, val) return root ``` -**迭代法** -与无返回值的递归函数的思路大体一致 + + +迭代法 ```python class Solution: - def insertIntoBST(self, root: TreeNode, val: int) -> TreeNode: - if not root: - return TreeNode(val) - parent = None # 此步可以省略 - cur = root + def insertIntoBST(self, root, val): + if root is None: # 如果根节点为空,创建新节点作为根节点并返回 + node = TreeNode(val) + return node - # 用while循环不断地找新节点的parent - while cur: - parent = cur # 首先保存当前非空节点作为下一次迭代的父节点 - if cur.val < val: - cur = cur.right - elif cur.val > val: + cur = root + parent = root # 记录上一个节点,用于连接新节点 + while cur is not None: + parent = cur + if cur.val > val: cur = cur.left + else: + cur = cur.right + + node = TreeNode(val) + if val < parent.val: + parent.left = node # 将新节点连接到父节点的左子树 + else: + parent.right = node # 将新节点连接到父节点的右子树 - # 运行到这意味着已经跳出上面的while循环, - # 同时意味着新节点的parent已经被找到. - # parent已被找到, 新节点已经ready. 把两个节点黏在一起就好了. - if parent.val > val: - parent.left = TreeNode(val) - else: - parent.right = TreeNode(val) - return root + ``` ----- From 731d1ca8aa61b1b8969ead0c5cf8b7d8b21b55e6 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Tue, 23 May 2023 21:38:27 -0500 Subject: [PATCH 1848/3019] =?UTF-8?q?Update=200450.=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=90=9C=E7=B4=A2=E6=A0=91=E4=B8=AD=E7=9A=84?= =?UTF-8?q?=E8=8A=82=E7=82=B9.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...55\347\232\204\350\212\202\347\202\271.md" | 132 +++++++++--------- 1 file changed, 67 insertions(+), 65 deletions(-) diff --git "a/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" "b/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" index 2602b52873..d4dca1d41d 100644 --- "a/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" +++ "b/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" @@ -324,88 +324,90 @@ class Solution { ``` ## Python - +递归法(版本一) ```python class Solution: - def deleteNode(self, root: Optional[TreeNode], key: int) -> Optional[TreeNode]: - if not root : return None # 节点为空,返回 - if root.val < key : - root.right = self.deleteNode(root.right, key) - elif root.val > key : + def deleteNode(self, root, key): + if root is None: + return root + if root.val == key: + if root.left is None and root.right is None: + return None + elif root.left is None: + return root.right + elif root.right is None: + return root.left + else: + cur = root.right + while cur.left is not None: + cur = cur.left + cur.left = root.left + return root.right + if root.val > key: root.left = self.deleteNode(root.left, key) - else: - # 当前节点的左子树为空,返回当前的右子树 - if not root.left : return root.right - # 当前节点的右子树为空,返回当前的左子树 - if not root.right: return root.left - # 左右子树都不为空,找到右孩子的最左节点 记为p - node = root.right - while node.left : - node = node.left - # 将当前节点的左子树挂在p的左孩子上 - node.left = root.left - # 当前节点的右子树替换掉当前节点,完成当前节点的删除 - root = root.right + if root.val < key: + root.right = self.deleteNode(root.right, key) return root ``` -**普通二叉树的删除方式** +递归法(版本二) ```python class Solution: - def deleteNode(self, root: Optional[TreeNode], key: int) -> Optional[TreeNode]: - if not root: return root - if root.val == key: - if not root.right: # 这里第二次操作目标值:最终删除的作用 + def deleteNode(self, root, key): + if root is None: # 如果根节点为空,直接返回 + return root + if root.val == key: # 找到要删除的节点 + if root.right is None: # 如果右子树为空,直接返回左子树作为新的根节点 return root.left - tmp = root.right - while tmp.left: - tmp = tmp.left - root.val, tmp.val = tmp.val, root.val # 这里第一次操作目标值:交换目标值其右子树最左面节点。 - - root.left = self.deleteNode(root.left, key) - root.right = self.deleteNode(root.right, key) + cur = root.right + while cur.left: # 找到右子树中的最左节点 + cur = cur.left + root.val, cur.val = cur.val, root.val # 将要删除的节点值与最左节点值交换 + root.left = self.deleteNode(root.left, key) # 在左子树中递归删除目标节点 + root.right = self.deleteNode(root.right, key) # 在右子树中递归删除目标节点 return root + ``` **迭代法** ```python class Solution: - def deleteNode(self, root: Optional[TreeNode], key: int) -> Optional[TreeNode]: - # 找到节点后分两步,1. 把节点的左子树和右子树连起来,2. 把右子树跟父节点连起来 - # root is None - if not root: return root - p = root - last = None - while p: - if p.val==key: - # 1. connect left to right - # right is not None -> left is None | left is not None - if p.right: - if p.left: - node = p.right - while node.left: - node = node.left - node.left = p.left - right = p.right - else: - # right is None -> right=left - right = p.left - # 2. connect right to last - if last==None: - root = right - elif last.val>key: - last.left = right - else: - last.right = right - # 3. return + def deleteOneNode(self, target: TreeNode) -> TreeNode: + """ + 将目标节点(删除节点)的左子树放到目标节点的右子树的最左面节点的左孩子位置上 + 并返回目标节点右孩子为新的根节点 + 是动画里模拟的过程 + """ + if target is None: + return target + if target.right is None: + return target.left + cur = target.right + while cur.left: + cur = cur.left + cur.left = target.left + return target.right + + def deleteNode(self, root: TreeNode, key: int) -> TreeNode: + if root is None: + return root + cur = root + pre = None # 记录cur的父节点,用来删除cur + while cur: + if cur.val == key: break + pre = cur + if cur.val > key: + cur = cur.left else: - # Update last and continue - last = p - if p.val>key: - p = p.left - else: - p = p.right + cur = cur.right + if pre is None: # 如果搜索树只有头结点 + return self.deleteOneNode(cur) + # pre 要知道是删左孩子还是右孩子 + if pre.left and pre.left.val == key: + pre.left = self.deleteOneNode(cur) + if pre.right and pre.right.val == key: + pre.right = self.deleteOneNode(cur) return root ``` From 53652744d2aa05765a10ce824424ee1c06afc57c Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Tue, 23 May 2023 21:43:40 -0500 Subject: [PATCH 1849/3019] =?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 --- ...11\346\220\234\347\264\242\346\240\221.md" | 82 ++++++++++--------- 1 file changed, 45 insertions(+), 37 deletions(-) diff --git "a/problems/0669.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0669.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" index 18d8a0cc8d..95372d6196 100644 --- "a/problems/0669.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" +++ "b/problems/0669.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" @@ -271,64 +271,72 @@ 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 trimBST(self, root: TreeNode, low: int, high: int) -> TreeNode: - ''' - 确认递归函数参数以及返回值:返回更新后剪枝后的当前root节点 - ''' - # Base Case - if not root: return None - - # 单层递归逻辑 + if root is None: + return None if root.val < low: - # 若当前root节点小于左界:只考虑其右子树,用于替代更新后的其本身,抛弃其左子树整体 + # 寻找符合区间 [low, high] 的节点 return self.trimBST(root.right, low, high) - - if high < root.val: - # 若当前root节点大于右界:只考虑其左子树,用于替代更新后的其本身,抛弃其右子树整体 + if root.val > high: + # 寻找符合区间 [low, high] 的节点 return self.trimBST(root.left, low, high) + root.left = self.trimBST(root.left, low, high) # root.left 接入符合条件的左孩子 + root.right = self.trimBST(root.right, low, high) # root.right 接入符合条件的右孩子 + return root - if low <= root.val <= high: - root.left = self.trimBST(root.left, low, high) - root.right = self.trimBST(root.right, low, high) - # 返回更新后的剪枝过的当前节点root - return root ``` +递归法(版本二)精简 +```python +class Solution: + def trimBST(self, root: TreeNode, low: int, high: int) -> TreeNode: + if root is None: + return None + if root.val < low: + return self.trimBST(root.right, low, high) + if root.val > high: + return self.trimBST(root.left, low, high) + root.left = self.trimBST(root.left, low, high) + root.right = self.trimBST(root.right, low, high) + return root -**迭代** +``` + +迭代法 ```python class Solution: - def trimBST(self, root: Optional[TreeNode], low: int, high: int) -> Optional[TreeNode]: - if not root: return root - # 处理头结点,让root移动到[L, R] 范围内,注意是左闭右开 - while root and (root.val < low or root.val > high): - if root.val < low: # 小于L往右走 - root = root.right - else: # 大于R往左走 - root = root.left - # 此时root已经在[L, R] 范围内,处理左孩子元素小于L的情况 + def trimBST(self, root: TreeNode, L: int, R: int) -> TreeNode: + if not root: + return None + + # 处理头结点,让root移动到[L, R] 范围内,注意是左闭右闭 + while root and (root.val < L or root.val > R): + if root.val < L: + root = root.right # 小于L往右走 + else: + root = root.left # 大于R往左走 + cur = root + + # 此时root已经在[L, R] 范围内,处理左孩子元素小于L的情况 while cur: - while cur.left and cur.left.val < low: + while cur.left and cur.left.val < L: cur.left = cur.left.right cur = cur.left - # 此时root已经在[L, R] 范围内,处理右孩子大于R的情况 + cur = root + + # 此时root已经在[L, R] 范围内,处理右孩子大于R的情况 while cur: - while cur.right and cur.right.val > high: + while cur.right and cur.right.val > R: cur.right = cur.right.left cur = cur.right + return root + ``` ## Go From 76e3811c5e7d2299ff06c2aeb231f8fa78bcb957 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Tue, 23 May 2023 21:46:41 -0500 Subject: [PATCH 1850/3019] =?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 --- ...11\346\220\234\347\264\242\346\240\221.md" | 100 ++++++++---------- 1 file changed, 46 insertions(+), 54 deletions(-) diff --git "a/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" index 89778421d1..056ef3e268 100644 --- "a/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" +++ "b/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" @@ -316,73 +316,65 @@ 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 sortedArrayToBST(self, nums: List[int]) -> TreeNode: - ''' - 构造二叉树:重点是选取数组最中间元素为分割点,左侧是递归左区间;右侧是递归右区间 - 必然是平衡树 - 左闭右闭区间 - ''' - # 返回根节点 - 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 + root = TreeNode(nums[mid]) + root.left = self.traversal(nums, left, mid - 1) + root.right = self.traversal(nums, mid + 1, right) + return root + + def sortedArrayToBST(self, nums: List[int]) -> TreeNode: + root = self.traversal(nums, 0, len(nums) - 1) + return root + ``` -**迭代**(左闭右开) +迭代法 ```python +from collections import deque + class Solution: - def sortedArrayToBST(self, nums: List[int]) -> Optional[TreeNode]: - if len(nums) == 0: return None - root = TreeNode() # 初始化 - nodeSt = [root] - leftSt = [0] - rightSt = [len(nums)] - - while nodeSt: - node = nodeSt.pop() # 处理根节点 - left = leftSt.pop() - right = rightSt.pop() - mid = left + (right - left) // 2 - node.val = nums[mid] - - if left < mid: # 处理左区间 - node.left = TreeNode() - nodeSt.append(node.left) - leftSt.append(left) - rightSt.append(mid) - - if right > mid + 1: # 处理右区间 - node.right = TreeNode() - nodeSt.append(node.right) - leftSt.append(mid + 1) - rightSt.append(right) + def sortedArrayToBST(self, nums: List[int]) -> TreeNode: + if len(nums) == 0: + return None + root = TreeNode(0) # 初始根节点 + nodeQue = deque() # 放遍历的节点 + leftQue = deque() # 保存左区间下标 + rightQue = deque() # 保存右区间下标 + + nodeQue.append(root) # 根节点入队列 + leftQue.append(0) # 0为左区间下标初始位置 + rightQue.append(len(nums) - 1) # len(nums) - 1为右区间下标初始位置 + + while nodeQue: + curNode = nodeQue.popleft() + left = leftQue.popleft() + right = rightQue.popleft() + mid = left + (right - left) // 2 + + curNode.val = nums[mid] # 将mid对应的元素给中间节点 + + if left <= mid - 1: # 处理左区间 + curNode.left = TreeNode(0) + nodeQue.append(curNode.left) + leftQue.append(left) + rightQue.append(mid - 1) + + if right >= mid + 1: # 处理右区间 + curNode.right = TreeNode(0) + nodeQue.append(curNode.right) + leftQue.append(mid + 1) + rightQue.append(right) + return root + ``` ## Go From 14acf5a55469e766e05b74f2279132ce2a7b66d7 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Tue, 23 May 2023 21:57:22 -0500 Subject: [PATCH 1851/3019] =?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 --- ...72\347\264\257\345\212\240\346\240\221.md" | 53 +++++++++++++++++-- 1 file changed, 50 insertions(+), 3 deletions(-) diff --git "a/problems/0538.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md" "b/problems/0538.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md" index ad5310e150..ad4decc53f 100644 --- "a/problems/0538.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md" +++ "b/problems/0538.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md" @@ -200,8 +200,30 @@ 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 convertBST(self, root: TreeNode) -> TreeNode: + self.pre = 0 # 记录前一个节点的数值 + self.traversal(root) + return root + def traversal(self, cur): + if cur is None: + return + self.traversal(cur.right) + cur.val += self.pre + self.pre = cur.val + self.traversal(cur.left) + + +``` +递归法(版本二) ```python # Definition for a binary tree node. # class TreeNode: @@ -234,7 +256,32 @@ class Solution: return root ``` -**迭代** +迭代法(版本一) +```python +class Solution: + def __init__(self): + self.pre = 0 # 记录前一个节点的数值 + + def traversal(self, root): + stack = [] + cur = root + while cur or stack: + if cur: + stack.append(cur) + cur = cur.right # 右 + else: + cur = stack.pop() # 中 + cur.val += self.pre + self.pre = cur.val + cur = cur.left # 左 + + def convertBST(self, root): + self.pre = 0 + self.traversal(root) + return root + +``` +迭代法(版本二) ```python class Solution: def convertBST(self, root: Optional[TreeNode]) -> Optional[TreeNode]: From 450b3f2f15ab7afa7b18f835879dc1573249edee Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Wed, 24 May 2023 00:51:14 -0500 Subject: [PATCH 1852/3019] =?UTF-8?q?Update=200111.=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=A0=91=E7=9A=84=E6=9C=80=E5=B0=8F=E6=B7=B1=E5=BA=A6.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...00\345\260\217\346\267\261\345\272\246.md" | 108 +++++++++--------- 1 file changed, 56 insertions(+), 52 deletions(-) diff --git "a/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" "b/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" index 0c086f1bbb..ef59730e63 100644 --- "a/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" +++ "b/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" @@ -297,36 +297,72 @@ 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 minDepth(self, root: TreeNode) -> int: - if not root: + def getDepth(self, node): + if node is None: return 0 + leftDepth = self.getDepth(node.left) # 左 + rightDepth = self.getDepth(node.right) # 右 - if not root.left and not root.right: - return 1 + # 当一个左子树为空,右不为空,这时并不是最低点 + if node.left is None and node.right is not None: + return 1 + rightDepth - left_depth = float('inf') - right_depth = float('inf') + # 当一个右子树为空,左不为空,这时并不是最低点 + if node.left is not None and node.right is None: + return 1 + leftDepth - if root.left: - left_depth = self.minDepth(root.left) - if root.right: - right_depth = self.minDepth(root.right) - - return 1 + min(left_depth, right_depth) + result = 1 + min(leftDepth, rightDepth) + return result + + def minDepth(self, root): + return self.getDepth(root) ``` +递归法(版本二) -迭代法: +```python +class Solution: + def minDepth(self, root): + if root is None: + return 0 + if root.left is None and root.right is not None: + return 1 + self.minDepth(root.right) + if root.left is not None and root.right is None: + return 1 + self.minDepth(root.left) + return 1 + min(self.minDepth(root.left), self.minDepth(root.right)) + + +``` +递归法(版本三)前序 + +```python +class Solution: + def __init__(self): + self.result = float('inf') + + def getDepth(self, node, depth): + if node is None: + return + if node.left is None and node.right is None: + self.result = min(self.result, depth) + if node.left: + self.getDepth(node.left, depth + 1) + if node.right: + self.getDepth(node.right, depth + 1) + + def minDepth(self, root): + if root is None: + return 0 + self.getDepth(root, 1) + return self.result + + +``` +迭代法 ```python # Definition for a binary tree node. @@ -359,39 +395,7 @@ class Solution: return depth ``` -迭代法: - -```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 minDepth(self, root: TreeNode) -> int: - if not root: - return 0 - - queue = collections.deque([(root, 1)]) - - while queue: - node, depth = queue.popleft() - - # Check if the node is a leaf node - if not node.left and not node.right: - return depth - - # Add left and right child to the queue - if node.left: - queue.append((node.left, depth+1)) - if node.right: - queue.append((node.right, depth+1)) - - return 0 - -``` ## Go From 832897e4bbeb21c5906729257af347f6cd90c97c Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Wed, 24 May 2023 01:56:01 -0500 Subject: [PATCH 1853/3019] =?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 --- ...41\344\272\214\345\217\211\346\240\221.md" | 22 +++++++++---------- 1 file changed, 10 insertions(+), 12 deletions(-) diff --git "a/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" "b/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" index c0561e1097..e10a612afd 100644 --- "a/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" @@ -536,18 +536,16 @@ class Solution: ```python class Solution: - def isBalanced(self, root: TreeNode) -> bool: - return self.height(root) != -1 - def height(self, node: TreeNode) -> int: - if not node: - return 0 - left = self.height(node.left) - if left == -1: - return -1 - right = self.height(node.right) - if right == -1 or abs(left - right) > 1: - return -1 - return max(left, right) + 1 + def isBalanced(self, root: Optional[TreeNode]) -> bool: + return self.get_hight(root) != -1 + def get_hight(self, node): + if not node: + return 0 + left = self.get_hight(node.left) + right = self.get_hight(node.right) + if left == -1 or right == -1 or abs(left - right) > 1: + return -1 + return max(left, right) + 1 ``` From 2f86a5ce27078eff58b5d6e2765091ed01f04d94 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Wed, 24 May 2023 22:39:35 -0500 Subject: [PATCH 1854/3019] =?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 --- ...17\222\345\205\245\346\223\215\344\275\234.md" | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git "a/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" "b/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" index 1ba7461fed..fc4351babc 100644 --- "a/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" +++ "b/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" @@ -326,7 +326,22 @@ class Solution: return root ``` +递归法(版本四) +```python +class Solution: + def insertIntoBST(self, root, val): + if root is None: + node = TreeNode(val) + return node + + if root.val > val: + root.left = self.insertIntoBST(root.left, val) + if root.val < val: + root.right = self.insertIntoBST(root.right, val) + return root + +``` 迭代法 ```python From 3965f2590ce244b3e3eb922b922e74e58cf6941d Mon Sep 17 00:00:00 2001 From: eeee0717 <70054568+eeee0717@users.noreply.github.com> Date: Thu, 25 May 2023 15:51:34 +0800 Subject: [PATCH 1855/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0C#=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...4N\344\270\252\350\212\202\347\202\271.md" | 22 ++++++++++++ ...\345\275\242\351\223\276\350\241\250II.md" | 28 +++++++++++++++ ...76\350\241\250\345\205\203\347\264\240.md" | 35 +++++++++++++++++++ ...04\347\232\204\345\271\263\346\226\271.md" | 8 +++++ 4 files changed, 93 insertions(+) diff --git "a/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" "b/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" index c6f5bfc781..84eac96b84 100644 --- "a/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" +++ "b/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" @@ -412,6 +412,28 @@ struct ListNode* removeNthFromEnd(struct ListNode* head, int n) { ``` +C#: +```csharp +public class Solution { + public ListNode RemoveNthFromEnd(ListNode head, int n) { + ListNode dummpHead = new ListNode(0); + dummpHead.next = head; + var fastNode = dummpHead; + var slowNode = dummpHead; + while(n-- != 0 && fastNode != null) + { + fastNode = fastNode.next; + } + while(fastNode.next != null) + { + fastNode = fastNode.next; + slowNode = slowNode.next; + } + slowNode.next = slowNode.next.next; + return dummpHead.next; + } +} +```

diff --git "a/problems/0142.\347\216\257\345\275\242\351\223\276\350\241\250II.md" "b/problems/0142.\347\216\257\345\275\242\351\223\276\350\241\250II.md" index e80a715a6c..f87d2cd914 100644 --- "a/problems/0142.\347\216\257\345\275\242\351\223\276\350\241\250II.md" +++ "b/problems/0142.\347\216\257\345\275\242\351\223\276\350\241\250II.md" @@ -437,6 +437,34 @@ object Solution { } ``` +C#: +```CSharp +public class Solution +{ + public ListNode DetectCycle(ListNode head) + { + ListNode fast = head; + ListNode slow = head; + while (fast != null && fast.next != null) + { + slow = slow.next; + fast = fast.next.next; + if (fast == slow) + { + fast = head; + while (fast != slow) + { + fast = fast.next; + slow = slow.next; + } + return fast; + } + } + return null; + } +} +``` +

diff --git "a/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" "b/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" index 6a0de2826c..f875165826 100644 --- "a/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" +++ "b/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" @@ -596,6 +596,41 @@ class Solution { } ``` +C# +```CSharp +/** + * Definition for singly-linked list. + * public class ListNode { + * public int val; + * public ListNode next; + * public ListNode(int val=0, ListNode next=null) { + * this.val = val; + * this.next = next; + * } + * } + */ +public class Solution +{ + public ListNode RemoveElements(ListNode head, int val) + { + ListNode dummyHead = new ListNode(0,head); + ListNode temp = dummyHead; + while(temp.next != null) + { + if(temp.next.val == val) + { + temp.next = temp.next.next; + } + else + { + temp = temp.next; + } + } + return dummyHead.next; + } +} +``` +

diff --git "a/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" "b/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" index 4fbdd1cdac..a316096e20 100644 --- "a/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" +++ "b/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" @@ -488,6 +488,14 @@ public class Solution { return result; } } + +C# LINQ: +```csharp +public class Solution { + public int[] SortedSquares(int[] nums) { + return nums.Select(x => x * x).OrderBy(x => x).ToArray(); + } +} ```

From 343e0775eb6c10fc2ff7a487cd92381d577f1fb4 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Fri, 26 May 2023 02:17:43 -0500 Subject: [PATCH 1856/3019] =?UTF-8?q?Update=200216.=E7=BB=84=E5=90=88?= =?UTF-8?q?=E6=80=BB=E5=92=8CIII.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...345\220\210\346\200\273\345\222\214III.md" | 39 +++++++++---------- 1 file changed, 18 insertions(+), 21 deletions(-) diff --git "a/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" "b/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" index f631c3cdc8..5a2c1033a4 100644 --- "a/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" +++ "b/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" @@ -360,28 +360,25 @@ class Solution { ```py class Solution: - def __init__(self): - self.res = [] - self.sum_now = 0 - self.path = [] - - def combinationSum3(self, k: int, n: int) -> [[int]]: - self.backtracking(k, n, 1) - return self.res - - def backtracking(self, k: int, n: int, start_num: int): - if self.sum_now > n: # 剪枝 + def combinationSum3(self, k: int, n: int) -> List[List[int]]: + result = [] # 存放结果集 + self.backtracking(n, k, 0, 1, [], result) + return result + + def backtracking(self, targetSum, k, currentSum, startIndex, path, result): + if currentSum > targetSum: # 剪枝操作 + return # 如果path的长度等于k但currentSum不等于targetSum,则直接返回 + if len(path) == k: + if currentSum == targetSum: + result.append(path[:]) return - if len(self.path) == k: # len(path)==k时不管sum是否等于n都会返回 - if self.sum_now == n: - self.res.append(self.path[:]) - return - for i in range(start_num, 10 - (k - len(self.path)) + 1): - self.path.append(i) - self.sum_now += i - self.backtracking(k, n, i + 1) - self.path.pop() - self.sum_now -= i + for i in range(startIndex, 9 - (k - len(path)) + 2): # 剪枝 + currentSum += i # 处理 + path.append(i) # 处理 + self.backtracking(targetSum, k, currentSum, i + 1, path, result) # 注意i+1调整startIndex + currentSum -= i # 回溯 + path.pop() # 回溯 + ``` ## Go From 89e9d75cbf5c1b33cc1b86cb6ee38fc3b0dd382d Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Fri, 26 May 2023 02:24:01 -0500 Subject: [PATCH 1857/3019] =?UTF-8?q?Update=200077.=E7=BB=84=E5=90=88.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "problems/0077.\347\273\204\345\220\210.md" | 80 +++++++-------------- 1 file changed, 27 insertions(+), 53 deletions(-) diff --git "a/problems/0077.\347\273\204\345\220\210.md" "b/problems/0077.\347\273\204\345\220\210.md" index 9c6d481ddb..c4da4471c0 100644 --- "a/problems/0077.\347\273\204\345\220\210.md" +++ "b/problems/0077.\347\273\204\345\220\210.md" @@ -377,68 +377,42 @@ class Solution { ``` ### Python - -```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 - - for x in range(startidx, last_startidx + 1): - path.append(x) - backtracking(n, k, x + 1) # 递归 - path.pop() # 回溯 - - backtracking(n, k, 1) - return result -``` - +未剪枝优化 ```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 + 1): - path.append(i) - backtrack(n, k, i+1) - path.pop() - backtrack(n, k, 1) - return res + result = [] # 存放结果集 + self.backtracking(n, k, 1, [], result) + return result + def backtracking(self, n, k, startIndex, path, result): + if len(path) == k: + result.append(path[:]) + return + for i in range(startIndex, n + 1): # 需要优化的地方 + path.append(i) # 处理节点 + self.backtracking(n, k, i + 1, path, result) + path.pop() # 回溯,撤销处理的节点 + ``` -剪枝: + +剪枝优化: ```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 + result = [] # 存放结果集 + self.backtracking(n, k, 1, [], result) + return result + def backtracking(self, n, k, startIndex, path, result): + if len(path) == k: + result.append(path[:]) + return + for i in range(startIndex, n - (k - len(path)) + 2): # 优化的地方 + path.append(i) # 处理节点 + self.backtracking(n, k, i + 1, path, result) + path.pop() # 回溯,撤销处理的节点 + ``` ### Go From 4d48c45107d2286ab9d5bbd6ce1adddac816859a Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Fri, 26 May 2023 02:25:21 -0500 Subject: [PATCH 1858/3019] =?UTF-8?q?Update=200077.=E7=BB=84=E5=90=88?= =?UTF-8?q?=E4=BC=98=E5=8C=96.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...04\345\220\210\344\274\230\345\214\226.md" | 27 ++++++++++--------- 1 file changed, 15 insertions(+), 12 deletions(-) diff --git "a/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" "b/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" index 9736549c57..fc543eea79 100644 --- "a/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" +++ "b/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" @@ -179,18 +179,21 @@ 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 + result = [] # 存放结果集 + self.backtracking(n, k, 1, [], result) + return result + def backtracking(self, n, k, startIndex, path, result): + if len(path) == k: + result.append(path[:]) + return + for i in range(startIndex, n - (k - len(path)) + 2): # 优化的地方 + path.append(i) # 处理节点 + self.backtracking(n, k, i + 1, path, result) + path.pop() # 回溯,撤销处理的节点 + + + + ``` Go: ```Go From 847c60ac3c93af41eaba8bf8e48de71c5eb728ab Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Fri, 26 May 2023 06:41:01 -0500 Subject: [PATCH 1859/3019] =?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 --- ...27\346\257\215\347\273\204\345\220\210.md" | 203 +++++++++++------- 1 file changed, 129 insertions(+), 74 deletions(-) diff --git "a/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" "b/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" index d113549716..9f1473dbf7 100644 --- "a/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" +++ "b/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" @@ -285,99 +285,154 @@ class Solution { ``` ## Python -**回溯** +回溯 ```python class Solution: 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: str) -> List[str]: - self.answers.clear() - if not digits: return [] + self.letterMap = [ + "", # 0 + "", # 1 + "abc", # 2 + "def", # 3 + "ghi", # 4 + "jkl", # 5 + "mno", # 6 + "pqrs", # 7 + "tuv", # 8 + "wxyz" # 9 + ] + self.result = [] + self.s = "" + + def backtracking(self, digits, index): + if index == len(digits): + self.result.append(self.s) + return + digit = int(digits[index]) # 将索引处的数字转换为整数 + letters = self.letterMap[digit] # 获取对应的字符集 + for i in range(len(letters)): + self.s += letters[i] # 处理字符 + self.backtracking(digits, index + 1) # 递归调用,注意索引加1,处理下一个数字 + self.s = self.s[:-1] # 回溯,删除最后添加的字符 + + def letterCombinations(self, digits): + if len(digits) == 0: + return self.result self.backtracking(digits, 0) - return self.answers + return self.result + +``` +回溯精简(版本一) +```python +class Solution: + def __init__(self): + self.letterMap = [ + "", # 0 + "", # 1 + "abc", # 2 + "def", # 3 + "ghi", # 4 + "jkl", # 5 + "mno", # 6 + "pqrs", # 7 + "tuv", # 8 + "wxyz" # 9 + ] + self.result = [] - 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]] + def getCombinations(self, digits, index, s): + if index == len(digits): + self.result.append(s) + return + digit = int(digits[index]) + letters = self.letterMap[digit] for letter in letters: - self.answer += letter # 处理 - self.backtracking(digits, index + 1) # 递归至下一层 - self.answer = self.answer[:-1] # 回溯 + self.getCombinations(digits, index + 1, s + letter) + + def letterCombinations(self, digits): + if len(digits) == 0: + return self.result + self.getCombinations(digits, 0, "") + return self.result + ``` -**回溯简化** +回溯精简(版本二) ```python 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 + self.letterMap = [ + "", # 0 + "", # 1 + "abc", # 2 + "def", # 3 + "ghi", # 4 + "jkl", # 5 + "mno", # 6 + "pqrs", # 7 + "tuv", # 8 + "wxyz" # 9 + ] - 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]] + def getCombinations(self, digits, index, s, result): + if index == len(digits): + result.append(s) + return + digit = int(digits[index]) + letters = self.letterMap[digit] for letter in letters: - self.backtracking(digits, index + 1, answer + letter) # 递归至下一层 + 回溯 + self.getCombinations(digits, index + 1, s + letter, result) + + def letterCombinations(self, digits): + result = [] + if len(digits) == 0: + return result + self.getCombinations(digits, 0, "", result) + return result + + ``` -**使用itertools** + +回溯优化使用列表 ```python class Solution: - def letterCombinations(self, digits: str) -> List[str]: - import itertools - if not digits: - return list() - - phoneMap = { - "2": "abc", - "3": "def", - "4": "ghi", - "5": "jkl", - "6": "mno", - "7": "pqrs", - "8": "tuv", - "9": "wxyz", - } + def __init__(self): + self.letterMap = [ + "", # 0 + "", # 1 + "abc", # 2 + "def", # 3 + "ghi", # 4 + "jkl", # 5 + "mno", # 6 + "pqrs", # 7 + "tuv", # 8 + "wxyz" # 9 + ] + + def getCombinations(self, digits, index, path, result): + if index == len(digits): + result.append(''.join(path)) + return + digit = int(digits[index]) + letters = self.letterMap[digit] + for letter in letters: + path.append(letter) + self.getCombinations(digits, index + 1, path, result) + path.pop() + + def letterCombinations(self, digits): + result = [] + if len(digits) == 0: + return result + self.getCombinations(digits, 0, [], result) + return result + + - groups = (phoneMap[digit] for digit in digits) - return ["".join(combination) for combination in itertools.product(*groups)] ``` + ## Go 主要在于递归中传递下一个数字 From 2c514203087e51aa244ca3df18108e44d64f3f89 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Fri, 26 May 2023 10:28:01 -0500 Subject: [PATCH 1860/3019] =?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 --- ...04\345\220\210\346\200\273\345\222\214.md" | 130 +++++++++++------- 1 file changed, 78 insertions(+), 52 deletions(-) diff --git "a/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" "b/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" index c4ee5ca6ca..b603475589 100644 --- "a/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" +++ "b/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" @@ -271,75 +271,101 @@ class Solution { ## Python -**回溯** +回溯(版本一) ```python 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() - 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 + def backtracking(self, candidates, target, total, startIndex, path, result): + if total > target: return - if sum_ > target: + if total == target: + result.append(path[:]) 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() # 回溯 + for i in range(startIndex, len(candidates)): + total += candidates[i] + path.append(candidates[i]) + self.backtracking(candidates, target, total, i, path, result) # 不用i+1了,表示可以重复读取当前的数 + total -= candidates[i] + path.pop() + + def combinationSum(self, candidates, target): + result = [] + self.backtracking(candidates, target, 0, 0, [], result) + return result + ``` -**剪枝回溯** +回溯剪枝(版本一) ```python class Solution: - def __init__(self): - self.path = [] - self.paths = [] + def backtracking(self, candidates, target, total, startIndex, path, result): + if total == target: + result.append(path[:]) + return + + for i in range(startIndex, len(candidates)): + if total + candidates[i] > target: + break + total += candidates[i] + path.append(candidates[i]) + self.backtracking(candidates, target, total, i, path, result) + total -= candidates[i] + path.pop() + + def combinationSum(self, candidates, target): + result = [] + candidates.sort() # 需要排序 + self.backtracking(candidates, target, 0, 0, [], result) + return result + +``` + +回溯(版本二) + +```python +class Solution: def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]: - ''' - 因为本题没有组合数量限制,所以只要元素总和大于target就算结束 - ''' - self.path.clear() - self.paths.clear() + result =[] + self.backtracking(candidates, target, 0, [], result) + return result + def backtracking(self, candidates, target, startIndex, path, result): + if target == 0: + result.append(path[:]) + return + if target < 0: + return + for i in range(startIndex, len(candidates)): + path.append(candidates[i]) + self.backtracking(candidates, target - candidates[i], i, path, result) + path.pop() - # 为了剪枝需要提前进行排序 - 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 +```python +class Solution: + def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]: + result =[] + candidates.sort() + self.backtracking(candidates, target, 0, [], result) + return result + def backtracking(self, candidates, target, startIndex, path, result): + if target == 0: + result.append(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() # 回溯 + + for i in range(startIndex, len(candidates)): + if target - candidates[i] < 0: + break + path.append(candidates[i]) + self.backtracking(candidates, target - candidates[i], i, path, result) + path.pop() + ``` ## Go From 20db57f364270b9c6b9782b1bdaa675c6e1f7152 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Fri, 26 May 2023 11:10:46 -0500 Subject: [PATCH 1861/3019] =?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 --- ...\345\220\210\346\200\273\345\222\214II.md" | 141 +++++++++--------- 1 file changed, 70 insertions(+), 71 deletions(-) diff --git "a/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" "b/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" index 83708df720..be72d90361 100644 --- "a/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" +++ "b/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" @@ -354,93 +354,92 @@ class Solution { ``` ## Python -**回溯+巧妙去重(省去使用used** +回溯 ```python class Solution: - def __init__(self): - self.paths = [] - self.path = [] - def combinationSum2(self, candidates: List[int], target: int) -> List[List[int]]: - ''' - 类似于求三数之和,求四数之和,为了避免重复组合,需要提前进行数组排序 - ''' - 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[:]) + def backtracking(self, candidates, target, total, startIndex, path, result): + if total == target: + result.append(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]: + + for i in range(startIndex, len(candidates)): + if i > startIndex 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 + + if total + candidates[i] > target: + break + + total += candidates[i] + path.append(candidates[i]) + self.backtracking(candidates, target, total, i + 1, path, result) + total -= candidates[i] + path.pop() + + def combinationSum2(self, candidates, target): + result = [] + candidates.sort() + self.backtracking(candidates, target, 0, 0, [], result) + return result + ``` -**回溯+去重(使用used)** +回溯+去重(使用used) ```python 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[:]) + def backtracking(self, candidates, target, total, startIndex, used, path, result): + if total == target: + result.append(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: + + for i in range(startIndex, len(candidates)): + # 对于相同的数字,只选择第一个未被使用的数字,跳过其他相同数字 + if i > startIndex and candidates[i] == candidates[i - 1] and not used[i - 1]: 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 + if total + candidates[i] > target: + break + + total += candidates[i] + path.append(candidates[i]) + used[i] = True + self.backtracking(candidates, target, total, i + 1, used, path, result) + used[i] = False + total -= candidates[i] + path.pop() + + def combinationSum2(self, candidates, target): + used = [False] * len(candidates) + result = [] + candidates.sort() + self.backtracking(candidates, target, 0, 0, used, [], result) + return result + ``` +回溯优化 +```python +class Solution: + def combinationSum2(self, candidates: List[int], target: int) -> List[List[int]]: + candidates.sort() + results = [] + self.combinationSumHelper(candidates, target, 0, [], results) + return results + def combinationSumHelper(self, candidates, target, index, path, results): + if target == 0: + results.append(path[:]) + return + for i in range(index, len(candidates)): + if i > index and candidates[i] == candidates[i - 1]: + continue + if candidates[i] > target: + break + path.append(candidates[i]) + self.combinationSumHelper(candidates, target - candidates[i], i + 1, path, results) + path.pop() +``` ## Go 主要在于如何在回溯中去重 From 59742e5544055ea3f4830ff5fea98f7e26671385 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Fri, 26 May 2023 11:11:44 -0500 Subject: [PATCH 1862/3019] =?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 --- .../0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" "b/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" index be72d90361..1dd02b69cf 100644 --- "a/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" +++ "b/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" @@ -384,7 +384,7 @@ class Solution: return result ``` -回溯+去重(使用used) +回溯 使用used ```python class Solution: From a4dcbe67217574e6fd197ad0c9598177faec79e9 Mon Sep 17 00:00:00 2001 From: Lozakaka <102352821+Lozakaka@users.noreply.github.com> Date: Fri, 26 May 2023 18:05:09 -0400 Subject: [PATCH 1863/3019] =?UTF-8?q?=E6=96=B0=E5=A2=9Ejava=E4=BA=8C?= =?UTF-8?q?=E7=B6=AD"=E6=95=B4=E6=95=B8"=E6=95=B8=E7=B5=84=E7=9A=84?= =?UTF-8?q?=E8=A7=A3=E6=B3=95=E3=80=81=E5=84=AA=E5=8C=96=E4=B8=80=E7=B6=AD?= =?UTF-8?q?=E6=95=B8=E7=B5=84=E7=9A=84=E8=A7=A3=E6=B3=95(=E5=89=AA?= =?UTF-8?q?=E6=9E=9D)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 新增java二維"整數"數組的解法,原本是用boolean數組,有一點繞,故附上二維"整數"數組。 2. 優化一維數組的解法(剪枝),在每一次內層循環完後,立刻檢查dp[target] == target。實測時間複雜度: 26ms -> 20ms --- ...11\345\222\214\345\255\220\351\233\206.md" | 61 ++++++++++++++++++- 1 file changed, 60 insertions(+), 1 deletion(-) diff --git "a/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" "b/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" index 8115e18ea9..54d9061217 100644 --- "a/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" +++ "b/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" @@ -218,8 +218,12 @@ class Solution { 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]); + dp[j] = Math.max(dp[j], dp[j - nums[i]] + nums[i]); } + + //剪枝一下,每一次完成內層的for-loop,立即檢查是否dp[target] == target,優化時間複雜度(26ms -> 20ms) + if(dp[target] == target) + return true; } return dp[target] == target; } @@ -294,6 +298,61 @@ false true false false false true true false false false false false false true false false false true true false false false false true false true false false false true true false false false true true ``` +二維數組整數版本 +```Java +class Solution { + public boolean canPartition(int[] nums) { + //using 2-D DP array. + int len = nums.length; + //check edge cases; + if(len == 0) + return false; + + int sum = 0; + for (int num : nums) + sum += num; + //we only deal with even numbers. If sum is odd, return false; + if(sum % 2 == 1) + return false; + + int target = sum / 2; + int[][] dp = new int[nums.length][target + 1]; + + // for(int j = 0; j <= target; j++){ + // if(j < nums[0]) + // dp[0][j] = 0; + // else + // dp[0][j] = nums[0]; + // } + + //initialize dp array + for(int j = nums[0]; j <= target; j++){ + dp[0][j] = nums[0]; + } + + for(int i = 1; i < len; i++){ + for(int j = 0; j <= target; j++){ + if (j < nums[i]) + dp[i][j] = dp[i - 1][j]; + else + dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - nums[i]] + nums[i]); + } + } + + //print out DP array + // for(int x : dp){ + // System.out.print(x + ","); + // } + // System.out.print(" "+i+" row"+"\n"); + return dp[len - 1][target] == target; + } +} +//dp数组的打印结果 for test case 1. +0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +0, 1, 1, 1, 1, 5, 6, 6, 6, 6, 6, 6, +0, 1, 1, 1, 1, 5, 6, 6, 6, 6, 6, 11, +0, 1, 1, 1, 1, 5, 6, 6, 6, 6, 10, 11, +``` ### Python: ```python From 45863868708ba1c3260060fb5afa854fa6874184 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Fri, 26 May 2023 21:03:46 -0500 Subject: [PATCH 1864/3019] =?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 --- ...62\345\233\236\346\226\207\344\270\262.md" | 135 +++++++++++------- 1 file changed, 87 insertions(+), 48 deletions(-) diff --git "a/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" "b/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" index 30bba455fb..53f43eea68 100644 --- "a/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" +++ "b/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" @@ -349,12 +349,9 @@ class Solution { ``` ## Python -**回溯+正反序判断回文串** +回溯 基本版 ```python class Solution: - def __init__(self): - self.paths = [] - self.path = [] def partition(self, s: str) -> List[List[str]]: ''' @@ -363,76 +360,118 @@ class Solution: 当切割线迭代至字符串末尾,说明找到一种方法 类似组合问题,为了不重复切割同一位置,需要start_index来做标记下一轮递归的起始位置(切割线) ''' - self.path.clear() - self.paths.clear() - self.backtracking(s, 0) - return self.paths + result = [] + self.backtracking(s, 0, [], result) + return result - def backtracking(self, s: str, start_index: int) -> None: + def backtracking(self, s, start_index, path, result ): # Base Case - if start_index >= len(s): - self.paths.append(self.path[:]) + if start_index == len(s): + result.append(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() + if self.is_palindrome(s, start_index, i): + path.append(s[start_index:i+1]) + self.backtracking(s, i+1, path, result) # 递归纵向遍历:从下一处进行切割,判断其余是否仍为回文串 + path.pop() # 回溯 else: continue + + def is_palindrome(self, s: str, start: int, end: int) -> bool: + i: int = start + j: int = end + while i < j: + if s[i] != s[j]: + return False + i += 1 + j -= 1 + return True ``` -**回溯+函数判断回文串** +回溯+优化判定回文函数 ```python class Solution: - def __init__(self): - self.paths = [] - self.path = [] def partition(self, s: str) -> List[List[str]]: - ''' - 递归用于纵向遍历 - for循环用于横向遍历 - 当切割线迭代至字符串末尾,说明找到一种方法 - 类似组合问题,为了不重复切割同一位置,需要start_index来做标记下一轮递归的起始位置(切割线) - ''' - self.path.clear() - self.paths.clear() - self.backtracking(s, 0) - return self.paths + result = [] + self.backtracking(s, 0, [], result) + return result - def backtracking(self, s: str, start_index: int) -> None: + def backtracking(self, s, start_index, path, result ): # Base Case - if start_index >= len(s): - self.paths.append(self.path[:]) + if start_index == len(s): + result.append(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() # 回溯 + # 若反序和正序相同,意味着这是回文串 + if s[start_index: i + 1] == s[start_index: i + 1][::-1]: + path.append(s[start_index:i+1]) + self.backtracking(s, i+1, path, result) # 递归纵向遍历:从下一处进行切割,判断其余是否仍为回文串 + path.pop() # 回溯 else: continue +``` +回溯+高效判断回文子串 +```python +class Solution: + def partition(self, s: str) -> List[List[str]]: + result = [] + isPalindrome = [[False] * len(s) for _ in range(len(s))] # 初始化isPalindrome矩阵 + self.computePalindrome(s, isPalindrome) + self.backtracking(s, 0, [], result, isPalindrome) + return result + + def backtracking(self, s, startIndex, path, result, isPalindrome): + if startIndex >= len(s): + result.append(path[:]) + return - def is_palindrome(self, s: str, start: int, end: int) -> bool: - i: int = start - j: int = end - while i < j: - if s[i] != s[j]: - return False - i += 1 - j -= 1 - return True + for i in range(startIndex, len(s)): + if isPalindrome[startIndex][i]: # 是回文子串 + substring = s[startIndex:i + 1] + path.append(substring) + self.backtracking(s, i + 1, path, result, isPalindrome) # 寻找i+1为起始位置的子串 + path.pop() # 回溯过程,弹出本次已经填在的子串 + + def computePalindrome(self, s, isPalindrome): + for i in range(len(s) - 1, -1, -1): # 需要倒序计算,保证在i行时,i+1行已经计算好了 + for j in range(i, len(s)): + if j == i: + isPalindrome[i][j] = True + elif j - i == 1: + isPalindrome[i][j] = (s[i] == s[j]) + else: + isPalindrome[i][j] = (s[i] == s[j] and isPalindrome[i+1][j-1]) ``` +回溯+使用all函数判断回文子串 +```python +class Solution: + def partition(self, s: str) -> List[List[str]]: + result = [] + self.partition_helper(s, 0, [], result) + return result + def partition_helper(self, s, start_index, path, result): + if start_index == len(s): + result.append(path[:]) + return + + for i in range(start_index + 1, len(s) + 1): + sub = s[start_index:i] + if self.isPalindrome(sub): + path.append(sub) + self.partition_helper(s, i, path, result) + path.pop() + + def isPalindrome(self, s): + return all(s[i] == s[len(s) - 1 - i] for i in range(len(s) // 2)) + +``` ## Go ```go var ( From 78445d75573bd7d45e42a52cb1388a5f61449a73 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Fri, 26 May 2023 21:06:59 -0500 Subject: [PATCH 1865/3019] =?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 --- ...\206\345\211\262\345\233\236\346\226\207\344\270\262.md" | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git "a/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" "b/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" index 53f43eea68..a797a0b5fb 100644 --- "a/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" +++ "b/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" @@ -378,8 +378,7 @@ class Solution: path.append(s[start_index:i+1]) self.backtracking(s, i+1, path, result) # 递归纵向遍历:从下一处进行切割,判断其余是否仍为回文串 path.pop() # 回溯 - else: - continue + def is_palindrome(self, s: str, start: int, end: int) -> bool: i: int = start @@ -413,8 +412,7 @@ class Solution: path.append(s[start_index:i+1]) self.backtracking(s, i+1, path, result) # 递归纵向遍历:从下一处进行切割,判断其余是否仍为回文串 path.pop() # 回溯 - else: - continue + ``` 回溯+高效判断回文子串 ```python From 51c89762f6c9643f76da1ea7fb516ca204fd8634 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Sat, 27 May 2023 00:51:28 -0500 Subject: [PATCH 1866/3019] =?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 --- ...\345\216\237IP\345\234\260\345\235\200.md" | 134 ++++++++---------- 1 file changed, 56 insertions(+), 78 deletions(-) diff --git "a/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" "b/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" index 9d4d59180e..81192ce592 100644 --- "a/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" +++ "b/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" @@ -360,104 +360,82 @@ class Solution { ## python -python2: -```python -class Solution(object): - def restoreIpAddresses(self, s): - """ - :type s: str - :rtype: List[str] - """ - ans = [] - path = [] - def backtrack(path, startIndex): - if len(s) > 12: return [] - 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() - - backtrack([], 0) - return ans -``` - -python3: +回溯(版本一) ```python class Solution: - def __init__(self): - self.result = [] - 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[:]) + result = [] + self.backtracking(s, 0, 0, "", result) + return result + + def backtracking(self, s, start_index, point_num, current, result): + if point_num == 3: # 逗点数量为3时,分隔结束 + if self.is_valid(s, start_index, len(s) - 1): # 判断第四段子字符串是否合法 + current += s[start_index:] # 添加最后一段子字符串 + result.append(current) 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:] # 回溯 + if self.is_valid(s, start_index, i): # 判断 [start_index, i] 这个区间的子串是否合法 + sub = s[start_index:i + 1] + self.backtracking(s, i + 1, point_num + 1, current + sub + '.', result) 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: + + def is_valid(self, s, start, end): + if start > end: return False - if not 0 <= int(s[start:end+1]) <= 255: + if s[start] == '0' and start != end: # 0开头的数字不合法 return False + num = 0 + for i in range(start, end + 1): + if not s[i].isdigit(): # 遇到非数字字符不合法 + return False + num = num * 10 + int(s[i]) + if num > 255: # 如果大于255了不合法 + return False return True + ``` +回溯(版本二) -python3; 简单拼接版本(类似Leetcode131写法): ```python -class Solution: +class Solution: def restoreIpAddresses(self, s: str) -> List[str]: - global results, path results = [] - path = [] - self.backtracking(s,0) + self.backtracking(s, 0, [], results) return results - def backtracking(self,s,index): - global results,path - if index == len(s) and len(path)==4: - results.append('.'.join(path)) # 在连接时需要中间间隔符号的话就在''中间写上对应的间隔符 + def backtracking(self, s, index, path, results): + if index == len(s) and len(path) == 4: + results.append('.'.join(path)) + return + + if len(path) > 4: # 剪枝 return - for i in range(index,len(s)): - if len(path)>3: break # 剪枝 - temp = s[index:i+1] - if (int(temp)<256 and int(temp)>0 and temp[0]!='0') or (temp=='0'): - path.append(temp) - self.backtracking(s,i+1) - path.pop() + + for i in range(index, min(index + 3, len(s))): + if self.is_valid(s, index, i): + sub = s[index:i+1] + path.append(sub) + self.backtracking(s, i+1, path, results) + path.pop() + + def is_valid(self, s, start, end): + if start > end: + return False + if s[start] == '0' and start != end: # 0开头的数字不合法 + return False + num = int(s[start:end+1]) + return 0 <= num <= 255 + + + + ``` + + ## Go ```go From 41537211f86035ac58a7a0121e35d4838ebd61f2 Mon Sep 17 00:00:00 2001 From: fwqaaq Date: Sat, 27 May 2023 16:07:52 +0800 Subject: [PATCH 1867/3019] =?UTF-8?q?Update=200474.=E4=B8=80=E5=92=8C?= =?UTF-8?q?=E9=9B=B6.md=20about=20rust?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...4.\344\270\200\345\222\214\351\233\266.md" | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git "a/problems/0474.\344\270\200\345\222\214\351\233\266.md" "b/problems/0474.\344\270\200\345\222\214\351\233\266.md" index 6a178a254b..145f6ec193 100644 --- "a/problems/0474.\344\270\200\345\222\214\351\233\266.md" +++ "b/problems/0474.\344\270\200\345\222\214\351\233\266.md" @@ -491,6 +491,33 @@ object Solution { } ``` +### Rust + +```rust +impl Solution { + pub fn find_max_form(strs: Vec, m: i32, n: i32) -> i32 { + let (m, n) = (m as usize, n as usize); + let mut dp = vec![vec![0; n + 1]; m + 1]; + for s in strs { + let (mut one_num, mut zero_num) = (0, 0); + for c in s.chars() { + match c { + '0' => zero_num += 1, + '1' => one_num += 1, + _ => (), + } + } + for i in (zero_num..=m).rev() { + for j in (one_num..=n).rev() { + dp[i][j] = dp[i][j].max(dp[i - zero_num][j - one_num] + 1); + } + } + } + dp[m][n] + } +} +``` +

From 8b6e90d2e24bdec8574a213f16f81c049f7e5fb2 Mon Sep 17 00:00:00 2001 From: fwqaaq Date: Sat, 27 May 2023 17:36:47 +0800 Subject: [PATCH 1868/3019] =?UTF-8?q?Update=20=E8=83=8C=E5=8C=85=E9=97=AE?= =?UTF-8?q?=E9=A2=98=E7=90=86=E8=AE=BA=E5=9F=BA=E7=A1=80=E5=AE=8C=E5=85=A8?= =?UTF-8?q?=E8=83=8C=E5=8C=85.md=20about=20rust?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...14\345\205\250\350\203\214\345\214\205.md" | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" index e927aa2061..9a48cb71cf 100644 --- "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" +++ "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" @@ -388,6 +388,43 @@ object Solution { } ``` +Rust: + +```rust +impl Solution { + // 先遍历物品 + fn complete_pack() { + let (goods, bag_size) = (vec![(1, 15), (3, 20), (4, 30)], 4); + let mut dp = vec![0; bag_size + 1]; + for (weight, value) in goods { + for j in weight..=bag_size { + dp[j] = dp[j].max(dp[j - weight] + value); + } + } + println!("先遍历物品:{}", dp[bag_size]); + } + + // 先遍历背包 + fn complete_pack_after() { + let (goods, bag_size) = (vec![(1, 15), (3, 20), (4, 30)], 4); + let mut dp = vec![0; bag_size + 1]; + for i in 0..=bag_size { + for (weight, value) in &goods { + if i >= *weight { + dp[i] = dp[i].max(dp[i - weight] + value); + } + } + } + println!("先遍历背包:{}", dp[bag_size]); + } +} + +#[test] +fn test_complete_pack() { + Solution::complete_pack(); + Solution::complete_pack_after(); +} +```

From 73590631ec3e17e727cca5a56024a07967946668 Mon Sep 17 00:00:00 2001 From: fwqaaq Date: Sat, 27 May 2023 18:49:18 +0800 Subject: [PATCH 1869/3019] =?UTF-8?q?Update=200518.=E9=9B=B6=E9=92=B1?= =?UTF-8?q?=E5=85=91=E6=8D=A2II.md=20=E4=BC=98=E5=8C=96=20Rust?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\351\222\261\345\205\221\346\215\242II.md" | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git "a/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" "b/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" index c208754f77..8da351148b 100644 --- "a/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" +++ "b/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" @@ -282,17 +282,18 @@ func change(amount int, coins []int) int { Rust: ```rust -pub fn change(amount: i32, coins: Vec) -> i32 { - let amount = amount as usize; - let coins = coins.iter().map(|&c|c as usize).collect::>(); - let mut dp = vec![0usize; amount + 1]; - dp[0] = 1; - for i in 0..coins.len() { - for j in coins[i]..=amount { - dp[j] += dp[j - coins[i]]; +impl Solution { + pub fn change(amount: i32, coins: Vec) -> i32 { + let amount = amount as usize; + let mut dp = vec![0; amount + 1]; + dp[0] = 1; + for coin in coins { + for j in coin as usize..=amount { + dp[j] += dp[j - coin as usize]; + } } + dp[amount] } - dp[amount] as i32 } ``` From b76f5b6bffc6f53d81c7afdd6f05853f0577d68e Mon Sep 17 00:00:00 2001 From: fwqaaq Date: Sat, 27 May 2023 23:14:11 +0800 Subject: [PATCH 1870/3019] =?UTF-8?q?Update=200377.=E7=BB=84=E5=90=88?= =?UTF-8?q?=E6=80=BB=E5=92=8C=E2=85=A3.md=20=E4=BC=98=E5=8C=96=20rust?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\220\210\346\200\273\345\222\214\342\205\243.md" | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git "a/problems/0377.\347\273\204\345\220\210\346\200\273\345\222\214\342\205\243.md" "b/problems/0377.\347\273\204\345\220\210\346\200\273\345\222\214\342\205\243.md" index ee65972371..ec57906087 100644 --- "a/problems/0377.\347\273\204\345\220\210\346\200\273\345\222\214\342\205\243.md" +++ "b/problems/0377.\347\273\204\345\220\210\346\200\273\345\222\214\342\205\243.md" @@ -253,16 +253,17 @@ Rust ```Rust impl Solution { pub fn combination_sum4(nums: Vec, target: i32) -> i32 { - let mut dp = vec![0; target as usize + 1]; + let target = target as usize; + let mut dp = vec![0; target + 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]; + for i in 1..=target { + for &n in &nums { + if i >= n as usize { + dp[i] += dp[i - n as usize]; } } } - return dp[target as usize]; + dp[target] } } ``` From 824ce31f87024fb4d7cc4e4fccdb9c56a761d0cb Mon Sep 17 00:00:00 2001 From: fwqaaq Date: Sat, 27 May 2023 23:28:33 +0800 Subject: [PATCH 1871/3019] =?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=20about=20rust?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...14\345\214\205\347\211\210\346\234\254.md" | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git "a/problems/0070.\347\210\254\346\245\274\346\242\257\345\256\214\345\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md" "b/problems/0070.\347\210\254\346\245\274\346\242\257\345\256\214\345\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md" index 8f8bc9a649..5dde64098d 100644 --- "a/problems/0070.\347\210\254\346\245\274\346\242\257\345\256\214\345\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md" +++ "b/problems/0070.\347\210\254\346\245\274\346\242\257\345\256\214\345\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md" @@ -225,8 +225,25 @@ function climbStairs(n: number): number { }; ``` +Rust: - +```rust +impl Solution { + pub fn climb_stairs(n: i32) -> i32 { + let (n, m) = (n as usize, 2); + let mut dp = vec![0; n + 1]; + dp[0] = 1; + for i in 1..=n { + for j in 1..=m { + if i >= j { + dp[i] += dp[i - j]; + } + } + } + dp[n] + } +} +```

From d45c141cc676cf0ef55dccd85705f3eb5c8323a7 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Sat, 27 May 2023 18:38:57 -0500 Subject: [PATCH 1872/3019] =?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 --- "problems/0078.\345\255\220\351\233\206.md" | 36 ++++++++------------- 1 file changed, 14 insertions(+), 22 deletions(-) diff --git "a/problems/0078.\345\255\220\351\233\206.md" "b/problems/0078.\345\255\220\351\233\206.md" index f26d0821e9..ecc202b73b 100644 --- "a/problems/0078.\345\255\220\351\233\206.md" +++ "b/problems/0078.\345\255\220\351\233\206.md" @@ -206,28 +206,20 @@ class Solution { ## Python ```python class Solution: - def __init__(self): - self.path: List[int] = [] - self.paths: List[List[int]] = [] - - def subsets(self, nums: List[int]) -> List[List[int]]: - 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() # 回溯 + def subsets(self, nums): + result = [] + path = [] + self.backtracking(nums, 0, path, result) + return result + + def backtracking(self, nums, startIndex, path, result): + result.append(path[:]) # 收集子集,要放在终止添加的上面,否则会漏掉自己 + # if startIndex >= len(nums): # 终止条件可以不加 + # return + for i in range(startIndex, len(nums)): + path.append(nums[i]) + self.backtracking(nums, i + 1, path, result) + path.pop() ``` ## Go From 5801ae752325eddc69508dd3635fadc6b74abf69 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Sat, 27 May 2023 18:53:28 -0500 Subject: [PATCH 1873/3019] =?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 --- "problems/0090.\345\255\220\351\233\206II.md" | 124 +++++++++--------- 1 file changed, 61 insertions(+), 63 deletions(-) diff --git "a/problems/0090.\345\255\220\351\233\206II.md" "b/problems/0090.\345\255\220\351\233\206II.md" index 1a9f8fda3e..0df0600eaf 100644 --- "a/problems/0090.\345\255\220\351\233\206II.md" +++ "b/problems/0090.\345\255\220\351\233\206II.md" @@ -235,86 +235,84 @@ class Solution { } ``` -### Python + + +#### Python3 + +回溯 利用used数组去重 ```python class Solution: - def __init__(self): - self.paths = [] - self.path = [] - - def subsetsWithDup(self, nums: List[int]) -> List[List[int]]: - 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]: - # 当前后元素值相同时,跳入下一个循环,去重 + def subsetsWithDup(self, nums): + result = [] + path = [] + used = [False] * len(nums) + nums.sort() # 去重需要排序 + self.backtracking(nums, 0, used, path, result) + return result + + def backtracking(self, nums, startIndex, used, path, result): + result.append(path[:]) # 收集子集 + for i in range(startIndex, len(nums)): + # used[i - 1] == True,说明同一树枝 nums[i - 1] 使用过 + # used[i - 1] == False,说明同一树层 nums[i - 1] 使用过 + # 而我们要对同一树层使用过的元素进行跳过 + if i > 0 and nums[i] == nums[i - 1] and not used[i - 1]: continue - self.path.append(nums[i]) - self.backtracking(nums, i+1) - self.path.pop() + path.append(nums[i]) + used[i] = True + self.backtracking(nums, i + 1, used, path, result) + used[i] = False + path.pop() + ``` -#### Python3 +回溯 利用集合去重 -不使用used数组 ```python class Solution: - def subsetsWithDup(self, nums: List[int]) -> List[List[int]]: - res = [] + def subsetsWithDup(self, nums): + result = [] path = [] - nums.sort() # 去重需要先对数组进行排序 - - def backtracking(nums, startIndex): - # 终止条件 - res.append(path[:]) - if startIndex == len(nums): - return - - # for循环 - for i in range(startIndex, len(nums)): - # 数层去重 - if i > startIndex and nums[i] == nums[i-1]: # 去重 - continue - path.append(nums[i]) - backtracking(nums, i+1) - path.pop() - - backtracking(nums, 0) - return res + nums.sort() # 去重需要排序 + self.backtracking(nums, 0, path, result) + return result + + def backtracking(self, nums, startIndex, path, result): + result.append(path[:]) # 收集子集 + uset = set() + for i in range(startIndex, len(nums)): + if nums[i] in uset: + continue + uset.add(nums[i]) + path.append(nums[i]) + self.backtracking(nums, i + 1, path, result) + path.pop() + ``` -使用used数组 +回溯 利用递归的时候下一个startIndex是i+1而不是0去重 + ```python class Solution: - def subsetsWithDup(self, nums: List[int]) -> List[List[int]]: + def subsetsWithDup(self, nums): result = [] path = [] - nums.sort() - used = [0] * len(nums) - def backtrack(nums, startIdx): - result.append(path[:]) - for i in range(startIdx, len(nums)): - if i > startIdx and nums[i] == nums[i-1] and used[i-1] == 0: - continue - used[i] = 1 - path.append(nums[i]) - backtrack(nums, i+1) - path.pop() - used[i] = 0 - backtrack(nums, 0) + nums.sort() # 去重需要排序 + self.backtracking(nums, 0, path, result) return result -``` + def backtracking(self, nums, startIndex, path, result): + result.append(path[:]) # 收集子集 + for i in range(startIndex, len(nums)): + # 而我们要对同一树层使用过的元素进行跳过 + if i > startIndex and nums[i] == nums[i - 1]: + continue + path.append(nums[i]) + self.backtracking(nums, i + 1, path, result) + path.pop() + + +``` ### Go ```Go From eb72f2637195f8c50bff7660ba90ddf217654840 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Sat, 27 May 2023 19:17:26 -0500 Subject: [PATCH 1874/3019] =?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 --- ...36\345\255\220\345\272\217\345\210\227.md" | 106 +++++++----------- 1 file changed, 40 insertions(+), 66 deletions(-) diff --git "a/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" "b/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" index 436dbf01c8..56a70e8bc5 100644 --- "a/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" @@ -267,79 +267,53 @@ class Solution { ### Python python3 -**回溯** +回溯 利用set去重 ```python 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[:]) + def findSubsequences(self, nums): + result = [] + self.backtracking(nums, 0, [], result) + return result + + def backtracking(self, nums, startIndex, path, result): + if len(path) > 1: + result.append(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() + used = set() # 使用集合来进行去重操作 + for i in range(startIndex, len(nums)): + if path and nums[i] < path[-1]: + continue # 如果当前元素小于上一个元素,则跳过当前元素 + + if nums[i] in used: + continue # 如果当前元素已经使用过,则跳过当前元素 + + used.add(nums[i]) # 标记当前元素已经使用过 + self.backtracking(nums, i + 1, path + [nums[i]], result) + ``` -**回溯+哈希表去重** +回溯 利用哈希表去重 ```python 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[:]) + def findSubsequences(self, nums): + result = [] + path = [] + self.backtracking(nums, 0, path, result) + return result + + def backtracking(self, nums, startIndex, path, result): + if len(path) > 1: + result.append(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() + used = [0] * 201 # 使用数组来进行去重操作,题目说数值范围[-100, 100] + for i in range(startIndex, len(nums)): + if (path and nums[i] < path[-1]) or used[nums[i] + 100] == 1: + continue # 如果当前元素小于上一个元素,或者已经使用过当前元素,则跳过当前元素 + + used[nums[i] + 100] = 1 # 标记当前元素已经使用过 + path.append(nums[i]) # 将当前元素加入当前递增子序列 + self.backtracking(nums, i + 1, path, result) + path.pop() + ``` ### Go From 7e3fc8ea0d59a9a2c0e1765b62cc6e386cef5fdf Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Sat, 27 May 2023 19:17:50 -0500 Subject: [PATCH 1875/3019] =?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 --- ...\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" "b/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" index 56a70e8bc5..a805a2628b 100644 --- "a/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" @@ -266,7 +266,7 @@ class Solution { ### Python -python3 + 回溯 利用set去重 ```python class Solution: From a6c95b78e80f754dc901747046e06008710a639f Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Sat, 27 May 2023 19:21:17 -0500 Subject: [PATCH 1876/3019] =?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 --- ...36\345\255\220\345\272\217\345\210\227.md" | 24 ++++++++++--------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git "a/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" "b/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" index a805a2628b..50cb991879 100644 --- "a/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" @@ -272,23 +272,24 @@ class Solution { class Solution: def findSubsequences(self, nums): result = [] - self.backtracking(nums, 0, [], result) + path = [] + self.backtracking(nums, 0, path, result) return result - + def backtracking(self, nums, startIndex, path, result): if len(path) > 1: - result.append(path[:]) # 将当前路径的副本加入结果集 + result.append(path[:]) # 注意要使用切片将当前路径的副本加入结果集 + # 注意这里不要加return,要取树上的节点 - used = set() # 使用集合来进行去重操作 + uset = set() # 使用集合对本层元素进行去重 for i in range(startIndex, len(nums)): - if path and nums[i] < path[-1]: - continue # 如果当前元素小于上一个元素,则跳过当前元素 - - if nums[i] in used: - continue # 如果当前元素已经使用过,则跳过当前元素 + if (path and nums[i] < path[-1]) or nums[i] in uset: + continue - used.add(nums[i]) # 标记当前元素已经使用过 - self.backtracking(nums, i + 1, path + [nums[i]], result) + uset.add(nums[i]) # 记录这个元素在本层用过了,本层后面不能再用了 + path.append(nums[i]) + self.backtracking(nums, i + 1, path, result) + path.pop() ``` 回溯 利用哈希表去重 @@ -314,6 +315,7 @@ class Solution: self.backtracking(nums, i + 1, path, result) path.pop() + ``` ### Go From b033a08c13547a43f3ac4a873f65151987569e6a Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Sat, 27 May 2023 20:53:39 -0500 Subject: [PATCH 1877/3019] =?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 --- ...6.\345\205\250\346\216\222\345\210\227.md" | 73 ++++--------------- 1 file changed, 16 insertions(+), 57 deletions(-) diff --git "a/problems/0046.\345\205\250\346\216\222\345\210\227.md" "b/problems/0046.\345\205\250\346\216\222\345\210\227.md" index e08aec940b..029a98e376 100644 --- "a/problems/0046.\345\205\250\346\216\222\345\210\227.md" +++ "b/problems/0046.\345\205\250\346\216\222\345\210\227.md" @@ -213,68 +213,27 @@ class Solution { ``` ### Python -**回溯** +回溯 使用used ```python class Solution: - def __init__(self): - self.path = [] - self.paths = [] - - 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[:]) + def permute(self, nums): + result = [] + self.backtracking(nums, [], [False] * len(nums), result) + return result + + def backtracking(self, nums, path, used, result): + if len(path) == len(nums): + result.append(path[:]) return - - # 单层递归逻辑 - for i in range(0, len(nums)): # 从头开始搜索 - # 若遇到self.path里已收录的元素,跳过 - if usage_list[i] == True: + for i in range(len(nums)): + if used[i]: continue - usage_list[i] = True - self.path.append(nums[i]) - self.backtracking(nums, usage_list) # 纵向传递使用信息,去重 - self.path.pop() - usage_list[i] = False -``` -**回溯+丢掉usage_list** -```python -class Solution: - def __init__(self): - self.path = [] - self.paths = [] - - def permute(self, nums: List[int]) -> List[List[int]]: - ''' - 因为本题排列是有序的,这意味着同一层的元素可以重复使用,但同一树枝上不能重复使用 - 所以处理排列问题每层都需要从头搜索,故不再使用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 + used[i] = True + path.append(nums[i]) + self.backtracking(nums, path, used, result) + path.pop() + used[i] = False - # 单层递归逻辑 - 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 fd2608a38c99b2ff98130112c9c3a555b1be362d Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Sat, 27 May 2023 21:20:59 -0500 Subject: [PATCH 1878/3019] =?UTF-8?q?Update=200047.=E5=85=A8=E6=8E=92?= =?UTF-8?q?=E5=88=97II.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\345\205\250\346\216\222\345\210\227II.md" | 41 +++++++++---------- 1 file changed, 19 insertions(+), 22 deletions(-) diff --git "a/problems/0047.\345\205\250\346\216\222\345\210\227II.md" "b/problems/0047.\345\205\250\346\216\222\345\210\227II.md" index b4f7a4d8cb..de9b2bb486 100644 --- "a/problems/0047.\345\205\250\346\216\222\345\210\227II.md" +++ "b/problems/0047.\345\205\250\346\216\222\345\210\227II.md" @@ -208,28 +208,25 @@ class Solution { ```python class Solution: - def permuteUnique(self, nums: List[int]) -> List[List[int]]: - # res用来存放结果 - if not nums: return [] - res = [] - used = [0] * len(nums) - def backtracking(nums, used, path): - # 终止条件 - if len(path) == len(nums): - res.append(path.copy()) - return - for i in range(len(nums)): - if not used[i]: - if i>0 and nums[i] == nums[i-1] and not used[i-1]: - continue - used[i] = 1 - path.append(nums[i]) - backtracking(nums, used, path) - path.pop() - used[i] = 0 - # 记得给nums排序 - backtracking(sorted(nums),used,[]) - return res + def permuteUnique(self, nums): + nums.sort() # 排序 + result = [] + self.backtracking(nums, [], [False] * len(nums), result) + return result + + def backtracking(self, nums, path, used, result): + if len(path) == len(nums): + result.append(path[:]) + return + for i in range(len(nums)): + if (i > 0 and nums[i] == nums[i - 1] and not used[i - 1]) or used[i]: + continue + used[i] = True + path.append(nums[i]) + self.backtracking(nums, path, used, result) + path.pop() + used[i] = False + ``` ### Go From 19ecde0984c6bc4e383b2df72a47ff4032a77ca4 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Sat, 27 May 2023 21:49:43 -0500 Subject: [PATCH 1879/3019] =?UTF-8?q?Update=20=E5=9B=9E=E6=BA=AF=E7=AE=97?= =?UTF-8?q?=E6=B3=95=E5=8E=BB=E9=87=8D=E9=97=AE=E9=A2=98=E7=9A=84=E5=8F=A6?= =?UTF-8?q?=E4=B8=80=E7=A7=8D=E5=86=99=E6=B3=95.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...00\347\247\215\345\206\231\346\263\225.md" | 108 +++++++++--------- 1 file changed, 56 insertions(+), 52 deletions(-) diff --git "a/problems/\345\233\236\346\272\257\347\256\227\346\263\225\345\216\273\351\207\215\351\227\256\351\242\230\347\232\204\345\217\246\344\270\200\347\247\215\345\206\231\346\263\225.md" "b/problems/\345\233\236\346\272\257\347\256\227\346\263\225\345\216\273\351\207\215\351\227\256\351\242\230\347\232\204\345\217\246\344\270\200\347\247\215\345\206\231\346\263\225.md" index f39c3c74c3..4e09b9252a 100644 --- "a/problems/\345\233\236\346\272\257\347\256\227\346\263\225\345\216\273\351\207\215\351\227\256\351\242\230\347\232\204\345\217\246\344\270\200\347\247\215\345\206\231\346\263\225.md" +++ "b/problems/\345\233\236\346\272\257\347\256\227\346\263\225\345\216\273\351\207\215\351\227\256\351\242\230\347\232\204\345\217\246\344\270\200\347\247\215\345\206\231\346\263\225.md" @@ -356,76 +356,80 @@ Python: ```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 + def subsetsWithDup(self, nums): + nums.sort() # 去重需要排序 + result = [] + self.backtracking(nums, 0, [], result) + return result + + def backtracking(self, nums, startIndex, path, result): + result.append(path[:]) + used = set() + for i in range(startIndex, len(nums)): + if nums[i] in used: + continue + used.add(nums[i]) + path.append(nums[i]) + self.backtracking(nums, i + 1, path, result) + path.pop() + ``` **40. 组合总和 II** ```python class Solution: - def combinationSum2(self, candidates: List[int], target: int) -> List[List[int]]: - - res = [] + def combinationSum2(self, candidates, target): candidates.sort() + result = [] + self.backtracking(candidates, target, 0, 0, [], result) + return result + + def backtracking(self, candidates, target, sum, startIndex, path, result): + if sum == target: + result.append(path[:]) + return + used = set() + for i in range(startIndex, len(candidates)): + if sum + candidates[i] > target: + break + if candidates[i] in used: + continue + used.add(candidates[i]) + sum += candidates[i] + path.append(candidates[i]) + self.backtracking(candidates, target, sum, i + 1, path, result) + sum -= candidates[i] + path.pop() - 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 + def permuteUnique(self, nums): + nums.sort() # 排序 + result = [] + self.backtracking(nums, [False] * len(nums), [], result) + return result + + def backtracking(self, nums, used, path, result): + if len(path) == len(nums): + result.append(path[:]) + return + used_set = set() + for i in range(len(nums)): + if nums[i] in used_set: + continue + if not used[i]: + used_set.add(nums[i]) used[i] = True path.append(nums[i]) - backtracking() - used[i] = False + self.backtracking(nums, used, path, result) path.pop() - deduplicate.add(num) - - backtracking() + used[i] = False - return res ``` JavaScript: From 498395d07a6363198a99a530555c768432f1148d Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Sat, 27 May 2023 22:18:11 -0500 Subject: [PATCH 1880/3019] =?UTF-8?q?Update=200332.=E9=87=8D=E6=96=B0?= =?UTF-8?q?=E5=AE=89=E6=8E=92=E8=A1=8C=E7=A8=8B.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...11\346\216\222\350\241\214\347\250\213.md" | 124 +++++++++++------- 1 file changed, 74 insertions(+), 50 deletions(-) diff --git "a/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" "b/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" index 95e7d3ed5c..fa6414e9ac 100644 --- "a/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" +++ "b/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" @@ -347,64 +347,88 @@ class Solution { ``` ### python +回溯 使用used数组 ```python class Solution: def findItinerary(self, tickets: List[List[str]]) -> List[str]: - # defaultdic(list) 是为了方便直接append - tickets_dict = defaultdict(list) - for item in tickets: - tickets_dict[item[0]].append(item[1]) - # 给每一个机场的到达机场排序,小的在前面,在回溯里首先被pop(0)出去 - # 这样最先找的的path就是排序最小的答案,直接返回 - for airport in tickets_dict: tickets_dict[airport].sort() - ''' - tickets_dict里面的内容是这样的 - {'JFK': ['ATL', 'SFO'], 'SFO': ['ATL'], 'ATL': ['JFK', 'SFO']}) - ''' - path = ["JFK"] - def backtracking(start_point): - # 终止条件 - if len(path) == len(tickets) + 1: - return True - for _ in tickets_dict[start_point]: - #必须及时删除,避免出现死循环 - end_point = tickets_dict[start_point].pop(0) - path.append(end_point) - # 只要找到一个就可以返回了 - if backtracking(end_point): - return True - path.pop() - tickets_dict[start_point].append(end_point) - - backtracking("JFK") - return path -``` - -python - 使用used数组 - 神似之前几题写法 + tickets.sort() # 先排序,这样一旦找到第一个可行路径,一定是字母排序最小的 + used = [0] * len(tickets) + path = ['JFK'] + results = [] + self.backtracking(tickets, used, path, 'JFK', results) + return results[0] + + def backtracking(self, tickets, used, path, cur, results): + if len(path) == len(tickets) + 1: # 终止条件:路径长度等于机票数量+1 + results.append(path[:]) # 将当前路径添加到结果列表 + return True + + for i, ticket in enumerate(tickets): # 遍历机票列表 + if ticket[0] == cur and used[i] == 0: # 找到起始机场为cur且未使用过的机票 + used[i] = 1 # 标记该机票为已使用 + path.append(ticket[1]) # 将到达机场添加到路径中 + state = self.backtracking(tickets, used, path, ticket[1], results) # 递归搜索 + path.pop() # 回溯,移除最后添加的到达机场 + used[i] = 0 # 标记该机票为未使用 + if state: + return True # 只要找到一个可行路径就返回,不继续搜索 +``` +回溯 使用字典 ```python +from collections import defaultdict + class Solution: def findItinerary(self, tickets: List[List[str]]) -> List[str]: - global used,path,results - used = [0]*len(tickets) - path = ['JFK'] - results = [] - tickets.sort() # 先排序,这样一旦找到第一个可行路径,一定是字母排序最小的 - self.backtracking(tickets,'JFK') - return results[0] - def backtracking(self,tickets,cur): - if sum(used) == len(tickets): - results.append(path[:]) - return True # 只要找到就返回 - for i in range(len(tickets)): - if tickets[i][0]==cur and used[i]==0: - used[i]=1 - path.append(tickets[i][1]) - state = self.backtracking(tickets,tickets[i][1]) - path.pop() - used[i]=0 - if state: return True # 只要找到就返回,不继续搜索了 + targets = defaultdict(list) # 构建机场字典 + for ticket in tickets: + targets[ticket[0]].append(ticket[1]) + for airport in targets: + targets[airport].sort() # 对目的地列表进行排序 + + path = ["JFK"] # 起始机场为"JFK" + self.backtracking(targets, path, len(tickets)) + return path + + def backtracking(self, targets, path, ticketNum): + if len(path) == ticketNum + 1: + return True # 找到有效行程 + + airport = path[-1] # 当前机场 + destinations = targets[airport] # 当前机场可以到达的目的地列表 + for i, dest in enumerate(destinations): + targets[airport].pop(i) # 标记已使用的机票 + path.append(dest) # 添加目的地到路径 + if self.backtracking(targets, path, ticketNum): + return True # 找到有效行程 + targets[airport].insert(i, dest) # 回溯,恢复机票 + path.pop() # 移除目的地 + return False # 没有找到有效行程 + +``` +回溯 使用字典 逆序 +```python +from collections import defaultdict + +class Solution: + def findItinerary(self, tickets): + targets = defaultdict(list) # 创建默认字典,用于存储机场映射关系 + for ticket in tickets: + targets[ticket[0]].append(ticket[1]) # 将机票输入到字典中 + + for key in targets: + targets[key].sort(reverse=True) # 对到达机场列表进行字母逆序排序 + + result = [] + self.backtracking("JFK", targets, result) # 调用回溯函数开始搜索路径 + return result[::-1] # 返回逆序的行程路径 + + def backtracking(self, airport, targets, result): + while targets[airport]: # 当机场还有可到达的机场时 + next_airport = targets[airport].pop() # 弹出下一个机场 + self.backtracking(next_airport, targets, result) # 递归调用回溯函数进行深度优先搜索 + result.append(airport) # 将当前机场添加到行程路径中 ``` ### GO From 93e0a18f0f58363435f02267ce417a13ca6314f5 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Sun, 28 May 2023 02:52:41 -0500 Subject: [PATCH 1881/3019] =?UTF-8?q?Update=200051.N=E7=9A=87=E5=90=8E.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "problems/0051.N\347\232\207\345\220\216.md" | 83 ++++++++++---------- 1 file changed, 41 insertions(+), 42 deletions(-) diff --git "a/problems/0051.N\347\232\207\345\220\216.md" "b/problems/0051.N\347\232\207\345\220\216.md" index bd1d1c9bec..ab575bd826 100644 --- "a/problems/0051.N\347\232\207\345\220\216.md" +++ "b/problems/0051.N\347\232\207\345\220\216.md" @@ -348,48 +348,47 @@ class Solution { ```python class Solution: def solveNQueens(self, n: int) -> List[List[str]]: - if not n: return [] - board = [['.'] * n for _ in range(n)] - res = [] - def isVaild(board,row, col): - #判断同一列是否冲突 - for i in range(len(board)): - if board[i][col] == 'Q': - return False - # 判断左上角是否冲突 - i = row -1 - j = col -1 - while i>=0 and j>=0: - if board[i][j] == 'Q': - return False - i -= 1 - j -= 1 - # 判断右上角是否冲突 - i = row - 1 - j = col + 1 - while i>=0 and j < len(board): - if board[i][j] == 'Q': - return False - i -= 1 - j += 1 - return True - - def backtracking(board, row, n): - # 如果走到最后一行,说明已经找到一个解 - if row == n: - temp_res = [] - for temp in board: - temp_str = "".join(temp) - temp_res.append(temp_str) - res.append(temp_res) - for col in range(n): - if not isVaild(board, row, col): - continue - board[row][col] = 'Q' - backtracking(board, row+1, n) - board[row][col] = '.' - backtracking(board, 0, n) - return res + result = [] # 存储最终结果的二维字符串数组 + + chessboard = ['.' * n for _ in range(n)] # 初始化棋盘 + self.backtracking(n, 0, chessboard, result) # 回溯求解 + return [[''.join(row) for row in solution] for solution in result] # 返回结果集 + + def backtracking(self, n: int, row: int, chessboard: List[str], result: List[List[str]]) -> None: + if row == n: + result.append(chessboard[:]) # 棋盘填满,将当前解加入结果集 + return + + for col in range(n): + if self.isValid(row, col, chessboard): + chessboard[row] = chessboard[row][:col] + 'Q' + chessboard[row][col+1:] # 放置皇后 + self.backtracking(n, row + 1, chessboard, result) # 递归到下一行 + chessboard[row] = chessboard[row][:col] + '.' + chessboard[row][col+1:] # 回溯,撤销当前位置的皇后 + + def isValid(self, row: int, col: int, chessboard: List[str]) -> bool: + # 检查列 + for i in range(row): + if chessboard[i][col] == 'Q': + return False # 当前列已经存在皇后,不合法 + + # 检查 45 度角是否有皇后 + i, j = row - 1, col - 1 + while i >= 0 and j >= 0: + if chessboard[i][j] == 'Q': + return False # 左上方向已经存在皇后,不合法 + i -= 1 + j -= 1 + + # 检查 135 度角是否有皇后 + i, j = row - 1, col + 1 + while i >= 0 and j < len(chessboard): + if chessboard[i][j] == 'Q': + return False # 右上方向已经存在皇后,不合法 + i -= 1 + j += 1 + + return True # 当前位置合法 + ``` From ff5c98184ed3d01c1ef579d5df5c0d3906ac4f6b Mon Sep 17 00:00:00 2001 From: dd <593274462@qq.com> Date: Sun, 28 May 2023 22:42:49 +0800 Subject: [PATCH 1882/3019] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=201005.K?= =?UTF-8?q?=E6=AC=A1=E5=8F=96=E5=8F=8D=E5=90=8E=E6=9C=80=E5=A4=A7=E5=8C=96?= =?UTF-8?q?=E7=9A=84=E6=95=B0=E7=BB=84=E5=92=8C=20js=20=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E7=AE=AD=E5=A4=B4=E5=87=BD=E6=95=B0=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\226\347\232\204\346\225\260\347\273\204\345\222\214.md" | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git "a/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" "b/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" index 571bc2ac51..9759702ae2 100644 --- "a/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" +++ "b/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" @@ -189,9 +189,9 @@ var largestSumAfterKNegations = function(nums, k) { nums[nums.length-1] = - nums[nums.length-1] k--; } - return nums.reduce((a, b) => { - a + b - }) + + // 使用箭头函数的隐式返回值时,需使用简写省略花括号,否则要在 a + b 前加上 return + return nums.reduce((a, b) => a + b) }; // 版本二 (优化: 一次遍历) From 4a6e87f2f02c3d023c7ae2de7113abe808dd9a96 Mon Sep 17 00:00:00 2001 From: August <549392485@qq.com> Date: Sun, 28 May 2023 23:57:29 +0800 Subject: [PATCH 1883/3019] =?UTF-8?q?Update=200034.=E5=9C=A8=E6=8E=92?= =?UTF-8?q?=E5=BA=8F=E6=95=B0=E7=BB=84=E4=B8=AD=E6=9F=A5=E6=89=BE=E5=85=83?= =?UTF-8?q?=E7=B4=A0=E7=9A=84=E7=AC=AC=E4=B8=80=E4=B8=AA=E5=92=8C=E6=9C=80?= =?UTF-8?q?=E5=90=8E=E4=B8=80=E4=B8=AA=E4=BD=8D=E7=BD=AE.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" "b/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" index 7e58a870d8..e5266cd9ea 100644 --- "a/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" +++ "b/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" @@ -240,7 +240,7 @@ class Solution { while (left - 1 >= 0 && nums[left - 1] == nums[index]) { // 防止数组越界。逻辑短路,两个条件顺序不能换 left--; } - // 向左滑动,找右边界 + // 向右滑动,找右边界 while (right + 1 < nums.length && nums[right + 1] == nums[index]) { // 防止数组越界。 right++; } From 11581df17788327ea3114c1f98d332af2cd0d260 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Sun, 28 May 2023 17:58:11 -0500 Subject: [PATCH 1884/3019] =?UTF-8?q?Update=200455.=E5=88=86=E5=8F=91?= =?UTF-8?q?=E9=A5=BC=E5=B9=B2.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...06\345\217\221\351\245\274\345\271\262.md" | 43 ++++++++++--------- 1 file changed, 22 insertions(+), 21 deletions(-) diff --git "a/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" "b/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" index efadb43309..f32af57b58 100644 --- "a/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" +++ "b/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" @@ -177,32 +177,33 @@ class Solution { ``` ### Python - +贪心 大饼干优先 ```python class Solution: - # 思路1:优先考虑小胃口 - def findContentChildren(self, g: List[int], s: List[int]) -> int: - g.sort() - s.sort() - res = 0 - for i in range(len(s)): - if res = g[res]: #小饼干先喂饱小胃口 - res += 1 - return res -``` + def findContentChildren(self, g, s): + g.sort() # 将孩子的贪心因子排序 + s.sort() # 将饼干的尺寸排序 + index = len(s) - 1 # 饼干数组的下标,从最后一个饼干开始 + result = 0 # 满足孩子的数量 + for i in range(len(g)-1, -1, -1): # 遍历胃口,从最后一个孩子开始 + if index >= 0 and s[index] >= g[i]: # 遍历饼干 + result += 1 + index -= 1 + return result +``` +贪心 小饼干优先 ```python class Solution: - # 思路2:优先考虑大胃口 - def findContentChildren(self, g: List[int], s: List[int]) -> int: - g.sort() - s.sort() - start, count = len(s) - 1, 0 - for index in range(len(g) - 1, -1, -1): # 先喂饱大胃口 - if start >= 0 and g[index] <= s[start]: - start -= 1 - count += 1 - return count + def findContentChildren(self, g, s): + g.sort() # 将孩子的贪心因子排序 + s.sort() # 将饼干的尺寸排序 + index = 0 + for i in range(len(s)): # 遍历饼干 + if index < len(g) and g[index] <= s[i]: # 如果当前孩子的贪心因子小于等于当前饼干尺寸 + index += 1 # 满足一个孩子,指向下一个孩子 + return index # 返回满足的孩子数目 + ``` ### Go From 18a406e14fd4f5a0d4b5c1a1e3f37410ff5e3fce Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Sun, 28 May 2023 18:45:13 -0500 Subject: [PATCH 1885/3019] =?UTF-8?q?Update=200376.=E6=91=86=E5=8A=A8?= =?UTF-8?q?=E5=BA=8F=E5=88=97.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...06\345\212\250\345\272\217\345\210\227.md" | 87 ++++++++++++++----- 1 file changed, 64 insertions(+), 23 deletions(-) diff --git "a/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" "b/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" index ff388b5579..285a0280a5 100644 --- "a/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" +++ "b/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" @@ -305,21 +305,43 @@ class Solution { ### Python -**贪心** +贪心(版本一) + +```python +class Solution: + def wiggleMaxLength(self, nums): + if len(nums) <= 1: + return len(nums) # 如果数组长度为0或1,则返回数组长度 + curDiff = 0 # 当前一对元素的差值 + preDiff = 0 # 前一对元素的差值 + result = 1 # 记录峰值的个数,初始为1(默认最右边的元素被视为峰值) + for i in range(len(nums) - 1): + curDiff = nums[i + 1] - nums[i] # 计算下一个元素与当前元素的差值 + # 如果遇到一个峰值 + if (preDiff <= 0 and curDiff > 0) or (preDiff >= 0 and curDiff < 0): + result += 1 # 峰值个数加1 + preDiff = curDiff # 注意这里,只在摆动变化的时候更新preDiff + return result # 返回最长摆动子序列的长度 + +``` +贪心(版本二) ```python class Solution: def wiggleMaxLength(self, nums: List[int]) -> int: - preC,curC,res = 0,0,1 #题目里nums长度大于等于1,当长度为1时,其实到不了for循环里去,所以不用考虑nums长度 + if len(nums) <= 1: + return len(nums) # 如果数组长度为0或1,则返回数组长度 + preDiff,curDiff ,result = 0,0,1 #题目里nums长度大于等于1,当长度为1时,其实到不了for循环里去,所以不用考虑nums长度 for i in range(len(nums) - 1): - curC = nums[i + 1] - nums[i] - if curC * preC <= 0 and curC !=0: #差值为0时,不算摆动 - res += 1 - preC = curC #如果当前差值和上一个差值为一正一负时,才需要用当前差值替代上一个差值 - return res + curDiff = nums[i + 1] - nums[i] + if curDiff * preDiff <= 0 and curDiff !=0: #差值为0时,不算摆动 + result += 1 + preDiff = curDiff #如果当前差值和上一个差值为一正一负时,才需要用当前差值替代上一个差值 + return result + ``` -**动态规划** +动态规划(版本一) ```python class Solution: @@ -341,25 +363,44 @@ class Solution: return max(dp[-1][0], dp[-1][1]) ``` +动态规划(版本二) + ```python class Solution: - def wiggleMaxLength(self, nums: List[int]) -> int: - # up i作为波峰最长的序列长度 - # down i作为波谷最长的序列长度 - n = len(nums) - # 长度为0和1的直接返回长度 - if n<2: return n - for i in range(1,n): - if nums[i]>nums[i-1]: - # nums[i] 为波峰,1. 前面是波峰,up值不变,2. 前面是波谷,down值加1 - # 目前up值取两者的较大值(其实down+1即可,可以推理前一步down和up最多相差1,所以down+1>=up) - up = max(up, down+1) - elif nums[i] nums[i]: + dp[i][1] = max(dp[i][1], dp[j][0] + 1) # 如果前一个数比当前数大,可以形成一个上升峰值,更新dp[i][1] + for j in range(i): + if nums[j] < nums[i]: + dp[i][0] = max(dp[i][0], dp[j][1] + 1) # 如果前一个数比当前数小,可以形成一个下降峰值,更新dp[i][0] + return max(dp[-1][0], dp[-1][1]) # 返回最大的摆动序列长度 + ``` +动态规划(版本三)优化 + +```python +class Solution: + def wiggleMaxLength(self, nums): + if len(nums) <= 1: + return len(nums) # 如果数组长度为0或1,则返回数组长度 + + up = down = 1 # 记录上升和下降摆动序列的最大长度 + for i in range(1, len(nums)): + if nums[i] > nums[i-1]: + up = down + 1 # 如果当前数比前一个数大,则可以形成一个上升峰值 + elif nums[i] < nums[i-1]: + down = up + 1 # 如果当前数比前一个数小,则可以形成一个下降峰值 + + return max(up, down) # 返回上升和下降摆动序列的最大长度 + + +``` ### Go **贪心** From b2812eb707d9e2c5382781b23d5add54e8e1db63 Mon Sep 17 00:00:00 2001 From: fwqaaq Date: Mon, 29 May 2023 19:02:51 +0800 Subject: [PATCH 1886/3019] =?UTF-8?q?Update=200322.=E9=9B=B6=E9=92=B1?= =?UTF-8?q?=E5=85=91=E6=8D=A2.md=20about=20rust?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...66\351\222\261\345\205\221\346\215\242.md" | 24 ++++++++++++------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git "a/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" "b/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" index 0e3947dad3..28188349ff 100644 --- "a/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" +++ "b/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" @@ -315,18 +315,24 @@ func min(a, b int) int { Rust: ```rust -pub fn coin_change(coins: Vec, amount: i32) -> i32 { - let amount = amount as usize; - let mut dp = vec![i32::MAX; amount + 1]; - dp[0] = 0; - for i in 0..coins.len() { - for j in coins[i] as usize..=amount { - if dp[j - coins[i] as usize] != i32::MAX { - dp[j] = dp[j].min(dp[j - coins[i] as usize] + 1); +// 遍历物品 +impl Solution { + pub fn coin_change(coins: Vec, amount: i32) -> i32 { + let amount = amount as usize; + let mut dp = vec![i32::MAX; amount + 1]; + dp[0] = 0; + for coin in coins { + for i in coin as usize..=amount { + if dp[i - coin as usize] != i32::MAX { + dp[i] = dp[i].min(dp[i - coin as usize] + 1); + } } } + if dp[amount] == i32::MAX { + return -1; + } + dp[amount] } - if dp[amount] == i32::MAX { -1 } else { dp[amount] } } ``` From f45d4718c39c6d932ef32ff190c01be839a7d18d Mon Sep 17 00:00:00 2001 From: fwqaaq Date: Mon, 29 May 2023 19:10:46 +0800 Subject: [PATCH 1887/3019] =?UTF-8?q?Update=200322.=E9=9B=B6=E9=92=B1?= =?UTF-8?q?=E5=85=91=E6=8D=A2.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...66\351\222\261\345\205\221\346\215\242.md" | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git "a/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" "b/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" index 28188349ff..0f910451ed 100644 --- "a/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" +++ "b/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" @@ -336,6 +336,28 @@ impl Solution { } ``` +```rust +// 遍历背包 +impl Solution { + pub fn coin_change(coins: Vec, amount: i32) -> i32 { + let amount = amount as usize; + let mut dp = vec![i32::MAX; amount + 1]; + dp[0] = 0; + for i in 0..=amount { + for &coin in &coins { + if i >= coin as usize && dp[i - coin as usize] != i32::MAX { + dp[i] = dp[i].min(dp[i - coin as usize] + 1) + } + } + } + if dp[amount] == i32::MAX { + return -1; + } + dp[amount] + } +} +``` + Javascript: ```javascript const coinChange = (coins, amount) => { From 88f03c4abaf66141a2e507c746633af2cd93c7e6 Mon Sep 17 00:00:00 2001 From: fwqaaq Date: Mon, 29 May 2023 23:26:49 +0800 Subject: [PATCH 1888/3019] =?UTF-8?q?Update=200322.=E9=9B=B6=E9=92=B1?= =?UTF-8?q?=E5=85=91=E6=8D=A2.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...66\351\222\261\345\205\221\346\215\242.md" | 39 ++++++++++++++++++- 1 file changed, 37 insertions(+), 2 deletions(-) diff --git "a/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" "b/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" index 0f910451ed..7272b194c5 100644 --- "a/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" +++ "b/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" @@ -343,7 +343,7 @@ impl Solution { let amount = amount as usize; let mut dp = vec![i32::MAX; amount + 1]; dp[0] = 0; - for i in 0..=amount { + for i in 1..=amount { for &coin in &coins { if i >= coin as usize && dp[i - coin as usize] != i32::MAX { dp[i] = dp[i].min(dp[i - coin as usize] + 1) @@ -360,6 +360,7 @@ impl Solution { Javascript: ```javascript +// 遍历物品 const coinChange = (coins, amount) => { if(!amount) { return 0; @@ -368,7 +369,7 @@ const coinChange = (coins, amount) => { let dp = Array(amount + 1).fill(Infinity); dp[0] = 0; - for(let i =0; i < coins.length; i++) { + for(let i = 0; i < coins.length; i++) { for(let j = coins[i]; j <= amount; j++) { dp[j] = Math.min(dp[j - coins[i]] + 1, dp[j]); } @@ -378,9 +379,26 @@ const coinChange = (coins, amount) => { } ``` +```javascript +// 遍历背包 +var coinChange = function(coins, amount) { + const dp = Array(amount + 1).fill(Infinity) + dp[0] = 0 + for (let i = 1; i <= amount; i++) { + for (let j = 0; j < coins.length; j++) { + if (i >= coins[j] && dp[i - coins[j]] !== Infinity) { + dp[i] = Math.min(dp[i], dp[i - coins[j]] + 1) + } + } + } + return dp[amount] === Infinity ? -1 : dp[amount] +} +``` + TypeScript: ```typescript +// 遍历物品 function coinChange(coins: number[], amount: number): number { const dp: number[] = new Array(amount + 1).fill(Infinity); dp[0] = 0; @@ -394,6 +412,23 @@ function coinChange(coins: number[], amount: number): number { }; ``` +```typescript +// 遍历背包 +function coinChange(coins: number[], amount: number): number { + const dp: number[] = Array(amount + 1).fill(Infinity) + dp[0] = 0 + for (let i = 1; i <= amount; i++) { + for (let j = 0; j < coins.length; j++) { + if (i >= coins[j] && dp[i - coins[j]] !== Infinity) { + dp[i] = Math.min(dp[i], dp[i - coins[j]] + 1) + } + } + } + return dp[amount] === Infinity ? -1 : dp[amount] +} +``` + +

From 2a61ec45e6366c35189ead2b08914104c1df672e Mon Sep 17 00:00:00 2001 From: Logen <47022821+Logenleedev@users.noreply.github.com> Date: Mon, 29 May 2023 17:38:31 -0500 Subject: [PATCH 1889/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=A4=8D=E6=9D=82?= =?UTF-8?q?=E5=BA=A6=E5=88=86=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "problems/0047.\345\205\250\346\216\222\345\210\227II.md" | 2 ++ 1 file changed, 2 insertions(+) diff --git "a/problems/0047.\345\205\250\346\216\222\345\210\227II.md" "b/problems/0047.\345\205\250\346\216\222\345\210\227II.md" index b1908fb491..a1036b37ea 100644 --- "a/problems/0047.\345\205\250\346\216\222\345\210\227II.md" +++ "b/problems/0047.\345\205\250\346\216\222\345\210\227II.md" @@ -98,6 +98,8 @@ public: } }; +// 时间复杂度: 最差情况所有元素都是唯一的。复杂度和全排列1都是 O(n! * n) 对于 n 个元素一共有 n! 中排列方案。而对于每一个答案,我们需要 O(n) 去复制最终放到 result 数组 +// 空间复杂度: O(n) 回溯树的深度取决于我们有多少个元素 ``` ## 拓展 From 83a87ab5ad2f1dd0f81f3e779921a46c15d979f8 Mon Sep 17 00:00:00 2001 From: fwqaaq Date: Tue, 30 May 2023 16:28:09 +0800 Subject: [PATCH 1890/3019] =?UTF-8?q?Update=200279.=E5=AE=8C=E5=85=A8?= =?UTF-8?q?=E5=B9=B3=E6=96=B9=E6=95=B0.md=20about=20Rust?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...50\345\271\263\346\226\271\346\225\260.md" | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git "a/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" "b/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" index f5b23d2636..d573695181 100644 --- "a/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" +++ "b/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" @@ -345,6 +345,29 @@ function numSquares(n: number): number { }; ``` +Rust: + +```rust +// 先遍历背包 +impl Solution { + pub fn num_squares(n: i32) -> i32 { + let n = n as usize; + let mut dp = vec![i32::MAX; n + 1]; + dp[0] = 0; + for i in 0..=n { + let mut j = 1; + loop { + match j * j > i { + true => break, + false => dp[i] = dp[i].min(dp[i - j * j] + 1), + } + j += 1; + } + } + dp[n] + } +} +```

From a2ff242303546243f606e717e34ff8d2965eeb9d Mon Sep 17 00:00:00 2001 From: fwqaaq Date: Tue, 30 May 2023 18:30:14 +0800 Subject: [PATCH 1891/3019] =?UTF-8?q?Update=200279.=E5=AE=8C=E5=85=A8?= =?UTF-8?q?=E5=B9=B3=E6=96=B9=E6=95=B0.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...50\345\271\263\346\226\271\346\225\260.md" | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git "a/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" "b/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" index d573695181..1a0b55c02a 100644 --- "a/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" +++ "b/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" @@ -369,6 +369,27 @@ impl Solution { } ``` +```rust +// 先遍历物品 +impl Solution { + pub fn num_squares(n: i32) -> i32 { + let (n, mut goods) = (n as usize, 1); + let mut dp = vec![i32::MAX; n + 1]; + dp[0] = 0; + loop { + if goods * goods > n { + break; + } + for j in goods * goods..=n { + dp[j] = dp[j].min(dp[j - goods * goods] + 1); + } + goods += 1; + } + dp[n] + } +} +``` +

From 46495a7753ebf1eb603891229375e06fc1f05a07 Mon Sep 17 00:00:00 2001 From: fwqaaq Date: Tue, 30 May 2023 21:21:02 +0800 Subject: [PATCH 1892/3019] =?UTF-8?q?Update=200279.=E5=AE=8C=E5=85=A8?= =?UTF-8?q?=E5=B9=B3=E6=96=B9=E6=95=B0.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...05\250\345\271\263\346\226\271\346\225\260.md" | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git "a/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" "b/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" index 1a0b55c02a..71ab190637 100644 --- "a/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" +++ "b/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" @@ -331,6 +331,7 @@ var numSquares2 = function(n) { TypeScript: ```typescript +// 先遍历物品 function numSquares(n: number): number { const goodsNum: number = Math.floor(Math.sqrt(n)); const dp: number[] = new Array(n + 1).fill(Infinity); @@ -345,6 +346,20 @@ function numSquares(n: number): number { }; ``` +```rust +// 先遍历背包 +function numSquares(n: number): number { + const dp = Array(n + 1).fill(Infinity) + dp[0] = 0; + for(let i = 1; i <= n; i++){ + for(let j = 1; j * j <= i; j++){ + dp[i] = Math.min(dp[i], dp[i -j * j] + 1) + } + } + return dp[n] +}; +``` + Rust: ```rust From 3e18a30e36375046900278f7f09dc3ed53aa766f Mon Sep 17 00:00:00 2001 From: fwqaaq Date: Tue, 30 May 2023 22:15:23 +0800 Subject: [PATCH 1893/3019] =?UTF-8?q?Update=200139.=E5=8D=95=E8=AF=8D?= =?UTF-8?q?=E6=8B=86=E5=88=86.md=20about=20rust?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\225\350\257\215\346\213\206\345\210\206.md" | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git "a/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" "b/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" index 230942ef02..402ce132cf 100644 --- "a/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" +++ "b/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" @@ -464,7 +464,24 @@ function wordBreak(s: string, wordDict: string[]): boolean { }; ``` +Rust: +```rust +impl Solution { + pub fn word_break(s: String, word_dict: Vec) -> bool { + let mut dp = vec![false; s.len() + 1]; + dp[0] = true; + for i in 1..=s.len() { + for j in 0..i { + if word_dict.iter().any(|word| *word == s[j..i]) && dp[j] { + dp[i] = true; + } + } + } + dp[s.len()] + } +} +```

From 08823a26309c0bf87ecb90f680694f87255513bd Mon Sep 17 00:00:00 2001 From: rosethorn999 <24700793+rosethorn999@users.noreply.github.com> Date: Tue, 30 May 2023 12:44:16 -0700 Subject: [PATCH 1894/3019] chore: Missing language name --- "problems/0383.\350\265\216\351\207\221\344\277\241.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0383.\350\265\216\351\207\221\344\277\241.md" "b/problems/0383.\350\265\216\351\207\221\344\277\241.md" index c7469d65bf..e74cdf71fd 100644 --- "a/problems/0383.\350\265\216\351\207\221\344\277\241.md" +++ "b/problems/0383.\350\265\216\351\207\221\344\277\241.md" @@ -146,6 +146,7 @@ class Solution { ``` +Python: (版本一)使用数组 ```python class Solution: @@ -210,7 +211,6 @@ class Solution: class Solution: def canConstruct(self, ransomNote: str, magazine: str) -> bool: return all(ransomNote.count(c) <= magazine.count(c) for c in set(ransomNote)) - ``` Go: From be926a3c5b3e67023cf99f4f0311d091c01a7e08 Mon Sep 17 00:00:00 2001 From: fwqaaq Date: Wed, 31 May 2023 21:43:25 +0800 Subject: [PATCH 1895/3019] =?UTF-8?q?Update=200198.=E6=89=93=E5=AE=B6?= =?UTF-8?q?=E5=8A=AB=E8=88=8D.md=20about=20rust?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\223\345\256\266\345\212\253\350\210\215.md" | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git "a/problems/0198.\346\211\223\345\256\266\345\212\253\350\210\215.md" "b/problems/0198.\346\211\223\345\256\266\345\212\253\350\210\215.md" index 6e682ec39e..1ecd2eb716 100644 --- "a/problems/0198.\346\211\223\345\256\266\345\212\253\350\210\215.md" +++ "b/problems/0198.\346\211\223\345\256\266\345\212\253\350\210\215.md" @@ -250,7 +250,24 @@ function rob(nums: number[]): number { }; ``` +Rust: +```rust +impl Solution { + pub fn rob(nums: Vec) -> i32 { + if nums.len() == 1 { + return nums[0]; + } + let mut dp = vec![0; nums.len()]; + dp[0] = nums[0]; + dp[1] = nums[0].max(nums[1]); + for i in 2..nums.len() { + dp[i] = (dp[i - 2] + nums[i]).max(dp[i - 1]); + } + dp[nums.len() - 1] + } +} +```

From f22c658d365595a080ff5b516a3f2fca775e0ae6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=93=88=E5=93=88=E5=93=88?= <76643786+Projecthappy@users.noreply.github.com> Date: Wed, 31 May 2023 22:50:48 +0800 Subject: [PATCH 1896/3019] =?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 --- ...00\346\234\211\350\267\257\345\276\204.md" | 27 ++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git "a/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" "b/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" index 7bd56fbd0d..061535072d 100644 --- "a/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" +++ "b/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" @@ -390,6 +390,8 @@ public: ```Java //解法一 + +//方式一 class Solution { /** * 递归法 @@ -428,9 +430,32 @@ class Solution { } } } + +//方式二 +class Solution { + + List result = new ArrayList<>(); + + public List binaryTreePaths(TreeNode root) { + deal(root, ""); + return result; + } + + public void deal(TreeNode node, String s) { + if (node == null) + return; + if (node.left == null && node.right == null) { + result.add(new StringBuilder(s).append(node.val).toString()); + return; + } + String tmp = new StringBuilder(s).append(node.val).append("->").toString(); + deal(node.left, tmp); + deal(node.right, tmp); + } +} ``` ```java -// 解法2 +// 解法二 class Solution { /** * 迭代法 From d9887223965e84771503808e5685c1307998fabe Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Wed, 31 May 2023 23:44:40 -0500 Subject: [PATCH 1897/3019] =?UTF-8?q?Update=200053.=E6=9C=80=E5=A4=A7?= =?UTF-8?q?=E5=AD=90=E5=BA=8F=E5=92=8C.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...47\345\255\220\345\272\217\345\222\214.md" | 24 +++++++++++++++---- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git "a/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" "b/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" index 48f8be29c1..bc5e1d55b6 100644 --- "a/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" +++ "b/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" @@ -198,21 +198,35 @@ class Solution { ``` ### Python +暴力法 +```python +class Solution: + def maxSubArray(self, nums): + result = float('-inf') # 初始化结果为负无穷大 + count = 0 + for i in range(len(nums)): # 设置起始位置 + count = 0 + for j in range(i, len(nums)): # 从起始位置i开始遍历寻找最大值 + count += nums[j] + result = max(count, result) # 更新最大值 + return result +``` ```python class Solution: - def maxSubArray(self, nums: List[int]) -> int: - result = -float('inf') + def maxSubArray(self, nums): + result = float('-inf') # 初始化结果为负无穷大 count = 0 for i in range(len(nums)): count += nums[i] - if count > result: + if count > result: # 取区间累计的最大值(相当于不断确定最大子序终止位置) result = count - if count <= 0: + if count <= 0: # 相当于重置最大子序起始位置,因为遇到负数一定是拉低总和 count = 0 return result -``` + +``` ### Go ```go From d65f7a32da277ab0020c3104c6cc3f51b0e51998 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Thu, 1 Jun 2023 00:41:29 -0500 Subject: [PATCH 1898/3019] =?UTF-8?q?Update=200045.=E8=B7=B3=E8=B7=83?= =?UTF-8?q?=E6=B8=B8=E6=88=8FII.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\350\267\203\346\270\270\346\210\217II.md" | 101 ++++++++++-------- 1 file changed, 58 insertions(+), 43 deletions(-) diff --git "a/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" "b/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" index 8a9395824c..2f0349b2cc 100644 --- "a/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" +++ "b/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" @@ -205,66 +205,81 @@ class Solution { ``` ### Python - +贪心(版本一) ```python class Solution: - def jump(self, nums: List[int]) -> int: - if len(nums) == 1: return 0 - ans = 0 - curDistance = 0 - nextDistance = 0 + def jump(self, nums): + if len(nums) == 1: + return 0 + + cur_distance = 0 # 当前覆盖最远距离下标 + ans = 0 # 记录走的最大步数 + next_distance = 0 # 下一步覆盖最远距离下标 + for i in range(len(nums)): - nextDistance = max(i + nums[i], nextDistance) - if i == curDistance: - if curDistance != len(nums) - 1: - ans += 1 - curDistance = nextDistance - if nextDistance >= len(nums) - 1: break + next_distance = max(nums[i] + i, next_distance) # 更新下一步覆盖最远距离下标 + if i == cur_distance: # 遇到当前覆盖最远距离下标 + ans += 1 # 需要走下一步 + cur_distance = next_distance # 更新当前覆盖最远距离下标(相当于加油了) + if next_distance >= len(nums) - 1: # 当前覆盖最远距离达到数组末尾,不用再做ans++操作,直接结束 + break + return ans + ``` +贪心(版本二) ```python -# 贪心版本二 class Solution: - def jump(self, nums: List[int]) -> int: - if len(nums) == 1: - return 0 - curDistance, nextDistance = 0, 0 - step = 0 - for i in range(len(nums)-1): - nextDistance = max(nextDistance, nums[i]+i) - if i == curDistance: - curDistance = nextDistance - step += 1 - return step + def jump(self, nums): + cur_distance = 0 # 当前覆盖的最远距离下标 + ans = 0 # 记录走的最大步数 + next_distance = 0 # 下一步覆盖的最远距离下标 + + for i in range(len(nums) - 1): # 注意这里是小于len(nums) - 1,这是关键所在 + next_distance = max(nums[i] + i, next_distance) # 更新下一步覆盖的最远距离下标 + if i == cur_distance: # 遇到当前覆盖的最远距离下标 + cur_distance = next_distance # 更新当前覆盖的最远距离下标 + ans += 1 + + return ans + ``` +贪心(版本三) 类似‘55-跳跃游戏’写法 + ```python -# 贪心版本三 - 类似‘55-跳跃游戏’写法 class Solution: def jump(self, nums) -> int: - if len(nums)==1: return 0 - i = 0 - count = 0 - cover = 0 - while i<=cover: - for i in range(i,cover+1): - cover = max(nums[i]+i,cover) - if cover>=len(nums)-1: return count+1 - count+=1 + if len(nums)==1: # 如果数组只有一个元素,不需要跳跃,步数为0 + return 0 -``` + i = 0 # 当前位置 + count = 0 # 步数计数器 + cover = 0 # 当前能够覆盖的最远距离 + + while i <= cover: # 当前位置小于等于当前能够覆盖的最远距离时循环 + for i in range(i, cover+1): # 遍历从当前位置到当前能够覆盖的最远距离之间的所有位置 + cover = max(nums[i]+i, cover) # 更新当前能够覆盖的最远距离 + if cover >= len(nums)-1: # 如果当前能够覆盖的最远距离达到或超过数组的最后一个位置,直接返回步数+1 + return count+1 + count += 1 # 每一轮遍历结束后,步数+1 + +``` +动态规划 ```python -# 动态规划做法 class Solution: def jump(self, nums: List[int]) -> int: - result = [10**4+1]*len(nums) - result[0]=0 - for i in range(len(nums)): - for j in range(nums[i]+1): - if i+j Date: Thu, 1 Jun 2023 00:45:16 -0500 Subject: [PATCH 1899/3019] =?UTF-8?q?Update=201005.K=E6=AC=A1=E5=8F=96?= =?UTF-8?q?=E5=8F=8D=E5=90=8E=E6=9C=80=E5=A4=A7=E5=8C=96=E7=9A=84=E6=95=B0?= =?UTF-8?q?=E7=BB=84=E5=92=8C.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...204\346\225\260\347\273\204\345\222\214.md" | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git "a/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" "b/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" index 27a575c717..343bef04d9 100644 --- "a/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" +++ "b/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" @@ -155,17 +155,23 @@ class Solution { ``` ### Python +贪心 ```python class Solution: def largestSumAfterKNegations(self, A: List[int], K: int) -> int: - A = sorted(A, key=abs, reverse=True) # 将A按绝对值从大到小排列 - for i in range(len(A)): - if K > 0 and A[i] < 0: + A.sort(key=lambda x: abs(x), reverse=True) # 第一步:按照绝对值降序排序数组A + + for i in range(len(A)): # 第二步:执行K次取反操作 + if A[i] < 0 and K > 0: A[i] *= -1 K -= 1 - if K > 0: - A[-1] *= (-1)**K #取A最后一个数只需要写-1 - return sum(A) + + if K % 2 == 1: # 第三步:如果K还有剩余次数,将绝对值最小的元素取反 + A[-1] *= -1 + + result = sum(A) # 第四步:计算数组A的元素和 + return result + ``` ### Go From 648b0d2edc8cbf6c46b673f54ef610ba0524d5e3 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Thu, 1 Jun 2023 01:03:49 -0500 Subject: [PATCH 1900/3019] =?UTF-8?q?Update=200134.=E5=8A=A0=E6=B2=B9?= =?UTF-8?q?=E7=AB=99.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...4.\345\212\240\346\262\271\347\253\231.md" | 76 +++++++++++++------ 1 file changed, 53 insertions(+), 23 deletions(-) diff --git "a/problems/0134.\345\212\240\346\262\271\347\253\231.md" "b/problems/0134.\345\212\240\346\262\271\347\253\231.md" index f432bf0b1f..ad9acfbc80 100644 --- "a/problems/0134.\345\212\240\346\262\271\347\253\231.md" +++ "b/problems/0134.\345\212\240\346\262\271\347\253\231.md" @@ -249,44 +249,74 @@ class Solution { ``` ### Python +暴力法 +```python + +class Solution: + def canCompleteCircuit(self, gas: List[int], cost: List[int]) -> int: + for i in range(len(cost)): + rest = gas[i] - cost[i] # 记录剩余油量 + index = (i + 1) % len(cost) # 下一个加油站的索引 + + while rest > 0 and index != i: # 模拟以i为起点行驶一圈(如果有rest==0,那么答案就不唯一了) + rest += gas[index] - cost[index] # 更新剩余油量 + index = (index + 1) % len(cost) # 更新下一个加油站的索引 + + if rest >= 0 and index == i: # 如果以i为起点跑一圈,剩余油量>=0,并且回到起始位置 + return i # 返回起始位置i + + return -1 # 所有起始位置都无法环绕一圈,返回-1 + +``` +贪心(版本一) ```python -# 解法1 class Solution: def canCompleteCircuit(self, gas: List[int], cost: List[int]) -> int: - n = len(gas) - cur_sum = 0 - min_sum = float('inf') + curSum = 0 # 当前累计的剩余油量 + minFuel = float('inf') # 从起点出发,油箱里的油量最小值 - for i in range(n): - cur_sum += gas[i] - cost[i] - min_sum = min(min_sum, cur_sum) + for i in range(len(gas)): + rest = gas[i] - cost[i] + curSum += rest + if curSum < minFuel: + minFuel = curSum - if cur_sum < 0: return -1 - if min_sum >= 0: return 0 + if curSum < 0: + return -1 # 情况1:整个行程的总消耗大于总供给,无法完成一圈 - for j in range(n - 1, 0, -1): - min_sum += gas[j] - cost[j] - if min_sum >= 0: - return j + if minFuel >= 0: + return 0 # 情况2:从起点出发到任何一个加油站时油箱的剩余油量都不会小于0,可以从起点出发完成一圈 - return -1 -``` + for i in range(len(gas) - 1, -1, -1): + rest = gas[i] - cost[i] + minFuel += rest + if minFuel >= 0: + return i # 情况3:找到一个位置使得从该位置出发油箱的剩余油量不会小于0,返回该位置的索引 + + return -1 # 无法完成一圈 +``` +贪心(版本二) ```python -# 解法2 class Solution: def canCompleteCircuit(self, gas: List[int], cost: List[int]) -> int: - start = 0 - curSum = 0 - totalSum = 0 + curSum = 0 # 当前累计的剩余油量 + totalSum = 0 # 总剩余油量 + start = 0 # 起始位置 + for i in range(len(gas)): curSum += gas[i] - cost[i] totalSum += gas[i] - cost[i] - if curSum < 0: - curSum = 0 - start = i + 1 - if totalSum < 0: return -1 + + if curSum < 0: # 当前累计剩余油量curSum小于0 + start = i + 1 # 起始位置更新为i+1 + curSum = 0 # curSum重新从0开始累计 + + if totalSum < 0: + return -1 # 总剩余油量totalSum小于0,说明无法环绕一圈 return start + + ``` ### Go From cfb10d2e2a24324a319fec0986dee0ef465394fc Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Thu, 1 Jun 2023 01:35:04 -0500 Subject: [PATCH 1901/3019] =?UTF-8?q?Update=200135.=E5=88=86=E5=8F=91?= =?UTF-8?q?=E7=B3=96=E6=9E=9C.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...0\206\345\217\221\347\263\226\346\236\234.md" | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git "a/problems/0135.\345\210\206\345\217\221\347\263\226\346\236\234.md" "b/problems/0135.\345\210\206\345\217\221\347\263\226\346\236\234.md" index 1ba1563fb3..cf3ccc8e90 100644 --- "a/problems/0135.\345\210\206\345\217\221\347\263\226\346\236\234.md" +++ "b/problems/0135.\345\210\206\345\217\221\347\263\226\346\236\234.md" @@ -178,13 +178,21 @@ class Solution { class Solution: def candy(self, ratings: List[int]) -> int: candyVec = [1] * len(ratings) + + # 从前向后遍历,处理右侧比左侧评分高的情况 for i in range(1, len(ratings)): if ratings[i] > ratings[i - 1]: candyVec[i] = candyVec[i - 1] + 1 - for j in range(len(ratings) - 2, -1, -1): - if ratings[j] > ratings[j + 1]: - candyVec[j] = max(candyVec[j], candyVec[j + 1] + 1) - return sum(candyVec) + + # 从后向前遍历,处理左侧比右侧评分高的情况 + for i in range(len(ratings) - 2, -1, -1): + if ratings[i] > ratings[i + 1]: + candyVec[i] = max(candyVec[i], candyVec[i + 1] + 1) + + # 统计结果 + result = sum(candyVec) + return result + ``` ### Go From ba3c7ec19b6b2ad3f95f35ae55f25b2459d710b3 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Thu, 1 Jun 2023 01:37:41 -0500 Subject: [PATCH 1902/3019] =?UTF-8?q?Update=200860.=E6=9F=A0=E6=AA=AC?= =?UTF-8?q?=E6=B0=B4=E6=89=BE=E9=9B=B6.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...54\346\260\264\346\211\276\351\233\266.md" | 31 ++++++++++++++----- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git "a/problems/0860.\346\237\240\346\252\254\346\260\264\346\211\276\351\233\266.md" "b/problems/0860.\346\237\240\346\252\254\346\260\264\346\211\276\351\233\266.md" index d96e08797b..5046df121a 100644 --- "a/problems/0860.\346\237\240\346\252\254\346\260\264\346\211\276\351\233\266.md" +++ "b/problems/0860.\346\237\240\346\252\254\346\260\264\346\211\276\351\233\266.md" @@ -164,24 +164,39 @@ class Solution { ```python class Solution: def lemonadeChange(self, bills: List[int]) -> bool: - five, ten = 0, 0 + five = 0 + ten = 0 + twenty = 0 + for bill in bills: + # 情况一:收到5美元 if bill == 5: five += 1 - elif bill == 10: - if five < 1: return False - five -= 1 + + # 情况二:收到10美元 + if bill == 10: + if five <= 0: + return False ten += 1 - else: - if ten > 0 and five > 0: - ten -= 1 + five -= 1 + + # 情况三:收到20美元 + if bill == 20: + # 先尝试使用10美元和5美元找零 + if five > 0 and ten > 0: five -= 1 - elif five > 2: + ten -= 1 + #twenty += 1 + # 如果无法使用10美元找零,则尝试使用三张5美元找零 + elif five >= 3: five -= 3 + #twenty += 1 else: return False + return True + ``` ### Go From cd4d54616200a53d9a22fbd919edf905ad1d4dd1 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Thu, 1 Jun 2023 02:16:29 -0500 Subject: [PATCH 1903/3019] =?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 --- ...15\345\217\240\345\214\272\351\227\264.md" | 39 +++++++++++++++---- 1 file changed, 32 insertions(+), 7 deletions(-) diff --git "a/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" "b/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" index 37ef819d5b..61f42d4241 100644 --- "a/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" +++ "b/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" @@ -248,20 +248,45 @@ class Solution { ``` ### Python +贪心 基于左边界 ```python class Solution: def eraseOverlapIntervals(self, intervals: List[List[int]]) -> int: - if len(intervals) == 0: return 0 - intervals.sort(key=lambda x: x[1]) - count = 1 # 记录非交叉区间的个数 - end = intervals[0][1] # 记录区间分割点 + if not intervals: + return 0 + + intervals.sort(key=lambda x: x[0]) # 按照左边界升序排序 + count = 0 # 记录重叠区间数量 + for i in range(1, len(intervals)): - if end <= intervals[i][0]: + if intervals[i][0] < intervals[i - 1][1]: # 存在重叠区间 + intervals[i][1] = min(intervals[i - 1][1], intervals[i][1]) # 更新重叠区间的右边界 count += 1 - end = intervals[i][1] - return len(intervals) - count + + return count + ``` +贪心 基于左边界 把452.用最少数量的箭引爆气球代码稍做修改 +```python +class Solution: + def eraseOverlapIntervals(self, intervals: List[List[int]]) -> int: + if not intervals: + return 0 + + intervals.sort(key=lambda x: x[0]) # 按照左边界升序排序 + + result = 1 # 不重叠区间数量,初始化为1,因为至少有一个不重叠的区间 + + for i in range(1, len(intervals)): + if intervals[i][0] >= intervals[i - 1][1]: # 没有重叠 + result += 1 + else: # 重叠情况 + intervals[i][1] = min(intervals[i - 1][1], intervals[i][1]) # 更新重叠区间的右边界 + + return len(intervals) - result + +``` ### Go ```go func eraseOverlapIntervals(intervals [][]int) int { From 458f94b8b94b6e9252dc23dc11f6627a4272e2b8 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Thu, 1 Jun 2023 02:26:34 -0500 Subject: [PATCH 1904/3019] =?UTF-8?q?Update=200763.=E5=88=92=E5=88=86?= =?UTF-8?q?=E5=AD=97=E6=AF=8D=E5=8C=BA=E9=97=B4.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...27\346\257\215\345\214\272\351\227\264.md" | 111 +++++++----------- 1 file changed, 42 insertions(+), 69 deletions(-) diff --git "a/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" "b/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" index fbcafdc8cb..158f76d625 100644 --- "a/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" +++ "b/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" @@ -231,83 +231,56 @@ class Solution{ ``` ### Python +贪心(版本一) ```python class Solution: def partitionLabels(self, s: str) -> List[int]: - hash = [0] * 26 - for i in range(len(s)): - hash[ord(s[i]) - ord('a')] = i + last_occurrence = {} # 存储每个字符最后出现的位置 + for i, ch in enumerate(s): + last_occurrence[ch] = i + result = [] - left = 0 - right = 0 - for i in range(len(s)): - right = max(right, hash[ord(s[i]) - ord('a')]) - if i == right: - result.append(right - left + 1) - left = i + 1 - return result + start = 0 + end = 0 + for i, ch in enumerate(s): + end = max(end, last_occurrence[ch]) # 找到当前字符出现的最远位置 + if i == end: # 如果当前位置是最远位置,表示可以分割出一个区间 + result.append(end - start + 1) + start = i + 1 -# 解法二(不相交区间法) + return result + +``` +贪心(版本二)与452.用最少数量的箭引爆气球 (opens new window)、435.无重叠区间 (opens new window)相同的思路。 +```python class Solution: - def partitionLabels(self, s: str) -> List[int]: - # 记录每个字母出现的区间 - def getBord(s): - hash = [[-float('inf')] * 2 for _ in range(26)] - for i in range(len(s)): - if hash[ord(s[i]) - ord('a')][0] == -float('inf'): - hash[ord(s[i]) - ord('a')][0] = i - hash[ord(s[i]) - ord('a')][1] = i - # 去除字符串中未出现的字母所占用区间 - hash_filter = [] - for item in hash: - if item[0] != -float('inf'): hash_filter.append(item) - return hash_filter - - # 得到无重叠区间题意中的输入样例格式:区间列表 - hash = getBord(s) - # 按照左边界从小到大排序 - hash.sort(key= lambda x: x[0]) - res = [] - left = 0 - # 记录最大右边界 - right = hash[0][1] + def countLabels(self, s): + # 初始化一个长度为26的区间列表,初始值为负无穷 + hash = [[float('-inf'), float('-inf')] for _ in range(26)] + hash_filter = [] + for i in range(len(s)): + if hash[ord(s[i]) - ord('a')][0] == float('-inf'): + hash[ord(s[i]) - ord('a')][0] = i + hash[ord(s[i]) - ord('a')][1] = i for i in range(len(hash)): - # 一旦下一区间左边界大于当前右边界,即可认为出现分割点 - if hash[i][0] > right: - res.append(right - left + 1) - left = hash[i][0] - # 实时更新最大右边界 - right = max(right, hash[i][1]) - # 最右侧区间(字符串长度为1时的特殊情况也包含于其中) - res.append(right - left + 1) + if hash[i][0] != float('-inf'): + hash_filter.append(hash[i]) + return hash_filter + + def partitionLabels(self, s): + res = [] + hash = self.countLabels(s) + hash.sort(key=lambda x: x[0]) # 按左边界从小到大排序 + rightBoard = hash[0][1] # 记录最大右边界 + leftBoard = 0 + for i in range(1, len(hash)): + if hash[i][0] > rightBoard: # 出现分割点 + res.append(rightBoard - leftBoard + 1) + leftBoard = hash[i][0] + rightBoard = max(rightBoard, hash[i][1]) + res.append(rightBoard - leftBoard + 1) # 最右端 return res - -# 解法三:区间合并法 (结合下一题 56. Merge Intervals 的写法) -class Solution: # - def partitionLabels(self, s: str) -> List[int]: - aaa = list(set(s)) - #aaa.sort() - bbb = list(s) - ccc = [] - for i in reversed(bbb): - ccc.append(i) - intervals = [] - for i in range(len(aaa)): - intervals.append([bbb.index(aaa[i]),len(bbb)-ccc.index(aaa[i])-1]) - # 先求出各个字母的存在区间,之后利用区间合并方法得出所有不相邻的最大区间。 - intervals.sort(key = lambda x:x[0]) - newinterval = [] - left, right = intervals[0][0], intervals[0][1] - for i in range(1,len(intervals)): - if intervals[i][0] in range(left, right+1): - right = max(intervals[i][1],intervals[i-1][1],right) - left = min(intervals[i-1][0],left) - else: - newinterval.append(right-left+1) - left = intervals[i][0] - right = intervals[i][1] - newinterval.append(right-left+1) - return newinterval + ``` ### Go From 352b51d550a6edcc9b6355b8773b91d4f69cb507 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Thu, 1 Jun 2023 02:36:11 -0500 Subject: [PATCH 1905/3019] =?UTF-8?q?Update=200056.=E5=90=88=E5=B9=B6?= =?UTF-8?q?=E5=8C=BA=E9=97=B4.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...10\345\271\266\345\214\272\351\227\264.md" | 22 ++++++++++++------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git "a/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" "b/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" index 952d32afc2..ead2fb7587 100644 --- "a/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" +++ "b/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" @@ -141,18 +141,24 @@ class Solution { ### Python ```python class Solution: - def merge(self, intervals: List[List[int]]) -> List[List[int]]: - if len(intervals) == 0: return intervals - intervals.sort(key=lambda x: x[0]) + def merge(self, intervals): result = [] - result.append(intervals[0]) + if len(intervals) == 0: + return result # 区间集合为空直接返回 + + intervals.sort(key=lambda x: x[0]) # 按照区间的左边界进行排序 + + result.append(intervals[0]) # 第一个区间可以直接放入结果集中 + for i in range(1, len(intervals)): - last = result[-1] - if last[1] >= intervals[i][0]: - result[-1] = [last[0], max(last[1], intervals[i][1])] + if result[-1][1] >= intervals[i][0]: # 发现重叠区间 + # 合并区间,只需要更新结果集最后一个区间的右边界,因为根据排序,左边界已经是最小的 + result[-1][1] = max(result[-1][1], intervals[i][1]) else: - result.append(intervals[i]) + result.append(intervals[i]) # 区间不重叠 + return result + ``` ### Go From 41dd31d826218bef8b25890b9dc31744fc3b5dd7 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Thu, 1 Jun 2023 02:54:22 -0500 Subject: [PATCH 1906/3019] =?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 --- ...36\347\232\204\346\225\260\345\255\227.md" | 107 ++++++++++++++++-- 1 file changed, 100 insertions(+), 7 deletions(-) diff --git "a/problems/0738.\345\215\225\350\260\203\351\200\222\345\242\236\347\232\204\346\225\260\345\255\227.md" "b/problems/0738.\345\215\225\350\260\203\351\200\222\345\242\236\347\232\204\346\225\260\345\255\227.md" index 1cf8a0a61e..d88ebbb096 100644 --- "a/problems/0738.\345\215\225\350\260\203\351\200\222\345\242\236\347\232\204\346\225\260\345\255\227.md" +++ "b/problems/0738.\345\215\225\350\260\203\351\200\222\345\242\236\347\232\204\346\225\260\345\255\227.md" @@ -164,17 +164,110 @@ class Solution { ### Python: +暴力 ```python class Solution: - def monotoneIncreasingDigits(self, n: int) -> int: - a = list(str(n)) - for i in range(len(a)-1,0,-1): - if int(a[i]) < int(a[i-1]): - a[i-1] = str(int(a[i-1]) - 1) - a[i:] = '9' * (len(a) - i) #python不需要设置flag值,直接按长度给9就好了 - return int("".join(a)) + def checkNum(self, num): + max_digit = 10 + while num: + digit = num % 10 + if max_digit >= digit: + max_digit = digit + else: + return False + num //= 10 + return True + + def monotoneIncreasingDigits(self, N): + for i in range(N, 0, -1): + if self.checkNum(i): + return i + return 0 + +``` +贪心(版本一) +```python +class Solution: + def monotoneIncreasingDigits(self, N: int) -> int: + # 将整数转换为字符串 + strNum = str(N) + # flag用来标记赋值9从哪里开始 + # 设置为字符串长度,为了防止第二个for循环在flag没有被赋值的情况下执行 + flag = len(strNum) + + # 从右往左遍历字符串 + for i in range(len(strNum) - 1, 0, -1): + # 如果当前字符比前一个字符小,说明需要修改前一个字符 + if strNum[i - 1] > strNum[i]: + flag = i # 更新flag的值,记录需要修改的位置 + # 将前一个字符减1,以保证递增性质 + strNum = strNum[:i - 1] + str(int(strNum[i - 1]) - 1) + strNum[i:] + + # 将flag位置及之后的字符都修改为9,以保证最大的递增数字 + for i in range(flag, len(strNum)): + strNum = strNum[:i] + '9' + strNum[i + 1:] + + # 将最终的字符串转换回整数并返回 + return int(strNum) + +``` +贪心(版本二) +```python +class Solution: + def monotoneIncreasingDigits(self, N: int) -> int: + # 将整数转换为字符串 + strNum = list(str(N)) + + # 从右往左遍历字符串 + for i in range(len(strNum) - 1, 0, -1): + # 如果当前字符比前一个字符小,说明需要修改前一个字符 + if strNum[i - 1] > strNum[i]: + strNum[i - 1] = str(int(strNum[i - 1]) - 1) # 将前一个字符减1 + # 将修改位置后面的字符都设置为9,因为修改前一个字符可能破坏了递增性质 + for j in range(i, len(strNum)): + strNum[j] = '9' + + # 将列表转换为字符串,并将字符串转换为整数并返回 + return int(''.join(strNum)) + + ``` +贪心(版本三) +```python +class Solution: + def monotoneIncreasingDigits(self, N: int) -> int: + # 将整数转换为字符串 + strNum = list(str(N)) + + # 从右往左遍历字符串 + for i in range(len(strNum) - 1, 0, -1): + # 如果当前字符比前一个字符小,说明需要修改前一个字符 + if strNum[i - 1] > strNum[i]: + strNum[i - 1] = str(int(strNum[i - 1]) - 1) # 将前一个字符减1 + # 将修改位置后面的字符都设置为9,因为修改前一个字符可能破坏了递增性质 + strNum[i:] = '9' * (len(strNum) - i) + + # 将列表转换为字符串,并将字符串转换为整数并返回 + return int(''.join(strNum)) + +``` +贪心(版本四)精简 + +```python +class Solution: + def monotoneIncreasingDigits(self, N: int) -> int: + strNum = str(N) + for i in range(len(strNum) - 1, 0, -1): + # 如果当前字符比前一个字符小,说明需要修改前一个字符 + if strNum[i - 1] > strNum[i]: + # 将前一个字符减1,以保证递增性质 + # 使用字符串切片操作将修改后的前面部分与后面部分进行拼接 + strNum = strNum[:i - 1] + str(int(strNum[i - 1]) - 1) + '9' * (len(strNum) - i) + return int(strNum) + + +``` ### Go ```go func monotoneIncreasingDigits(N int) int { From 5b4249d4a853a77e9aed0af171204c9b8d0ee2ac Mon Sep 17 00:00:00 2001 From: liuyiwei <709224218@qq.com> Date: Thu, 1 Jun 2023 16:34:00 +0800 Subject: [PATCH 1907/3019] =?UTF-8?q?151.=E7=BF=BB=E8=BD=AC=E5=AD=97?= =?UTF-8?q?=E7=AC=A6=E4=B8=B2=E9=87=8C=E7=9A=84=E5=8D=95=E8=AF=8D=20?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E4=BD=BF=E7=94=A8=E4=BA=86=E7=A7=BB=E9=99=A4?= =?UTF-8?q?=E5=85=83=E7=B4=A0=E6=80=9D=E6=83=B3=E7=9A=84=20Go=20=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...14\347\232\204\345\215\225\350\257\215.md" | 50 ++++++++++++++++++- 1 file changed, 49 insertions(+), 1 deletion(-) diff --git "a/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" "b/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" index 4474f1c613..6dd3cd4975 100644 --- "a/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" +++ "b/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" @@ -467,9 +467,57 @@ class Solution: return " ".join(words) ``` - Go: +版本一: + +```go +func reverseWords(s string) string { + b := []byte(s) + + // 移除前面、中间、后面存在的多余空格 + slow := 0 + for i := 0; i < len(b); i++ { + if b[i] != ' ' { + if slow != 0 { + b[slow] = ' ' + slow++ + } + for i < len(b) && b[i] != ' ' { // 复制逻辑 + b[slow] = b[i] + slow++ + i++ + } + } + } + b = b[0:slow] + + // 翻转整个字符串 + reverse(b) + // 翻转每个单词 + last := 0 + for i := 0; i <= len(b); i++ { + if i == len(b) || b[i] == ' ' { + reverse(b[last:i]) + last = i + 1 + } + } + return string(b) +} + +func reverse(b []byte) { + left := 0 + right := len(b) - 1 + for left < right { + b[left], b[right] = b[right], b[left] + left++ + right-- + } +} +``` + +版本二: + ```go import ( "fmt" From ed4543b30042ab127a261b660054e54aaaf3102f Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Thu, 1 Jun 2023 04:03:00 -0500 Subject: [PATCH 1908/3019] =?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 --- ...47\344\272\214\345\217\211\346\240\221.md" | 128 ++++++++++++------ 1 file changed, 88 insertions(+), 40 deletions(-) diff --git "a/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" "b/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" index fdec56cafa..e2ba8ebffc 100644 --- "a/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" @@ -371,56 +371,104 @@ class Solution { ### Python - +贪心(版本一) ```python class Solution: - def minCameraCover(self, root: TreeNode) -> int: - # Greedy Algo: + # Greedy Algo: # 从下往上安装摄像头:跳过leaves这样安装数量最少,局部最优 -> 全局最优 # 先给leaves的父节点安装,然后每隔两层节点安装一个摄像头,直到Head # 0: 该节点未覆盖 # 1: 该节点有摄像头 # 2: 该节点有覆盖 + def minCameraCover(self, root: TreeNode) -> int: + # 定义递归函数 + result = [0] # 用于记录摄像头的安装数量 + if self.traversal(root, result) == 0: + result[0] += 1 + + return result[0] + + + def traversal(self, cur: TreeNode, result: List[int]) -> int: + if not cur: + return 2 + + left = self.traversal(cur.left, result) + right = self.traversal(cur.right, result) + + # 情况1: 左右节点都有覆盖 + if left == 2 and right == 2: + return 0 + + # 情况2: + # left == 0 && right == 0 左右节点无覆盖 + # left == 1 && right == 0 左节点有摄像头,右节点无覆盖 + # left == 0 && right == 1 左节点无覆盖,右节点有摄像头 + # left == 0 && right == 2 左节点无覆盖,右节点覆盖 + # left == 2 && right == 0 左节点覆盖,右节点无覆盖 + if left == 0 or right == 0: + result[0] += 1 + return 1 + + # 情况3: + # left == 1 && right == 2 左节点有摄像头,右节点有覆盖 + # left == 2 && right == 1 左节点有覆盖,右节点有摄像头 + # left == 1 && right == 1 左右节点都有摄像头 + if left == 1 or right == 1: + return 2 + - result = 0 - # 从下往上遍历:后序(左右中) - def traversal(curr: TreeNode) -> int: - nonlocal result - - if not curr: return 2 - left = traversal(curr.left) - right = traversal(curr.right) - - # Case 1: - # 左右节点都有覆盖 - if left == 2 and right == 2: - return 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 - - # 其他情况前段代码均已覆盖 - - if traversal(root) == 0: - result += 1 - - return result ``` +贪心(版本二)利用elif精简代码 +```python +class Solution: + # Greedy Algo: + # 从下往上安装摄像头:跳过leaves这样安装数量最少,局部最优 -> 全局最优 + # 先给leaves的父节点安装,然后每隔两层节点安装一个摄像头,直到Head + # 0: 该节点未覆盖 + # 1: 该节点有摄像头 + # 2: 该节点有覆盖 + def minCameraCover(self, root: TreeNode) -> int: + # 定义递归函数 + result = [0] # 用于记录摄像头的安装数量 + if self.traversal(root, result) == 0: + result[0] += 1 + + return result[0] + + + def traversal(self, cur: TreeNode, result: List[int]) -> int: + if not cur: + return 2 + + left = self.traversal(cur.left, result) + right = self.traversal(cur.right, result) + + # 情况1: 左右节点都有覆盖 + if left == 2 and right == 2: + return 0 + + # 情况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[0] += 1 + return 1 + + # 情况3: + # left == 1 && right == 2 左节点有摄像头,右节点有覆盖 + # left == 2 && right == 1 左节点有覆盖,右节点有摄像头 + # left == 1 && right == 1 左右节点都有摄像头 + else: + return 2 + + + +``` ### Go ```go From 28cf557d7c7bcf208764e083e4550c411f7c2ba0 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Thu, 1 Jun 2023 15:02:00 -0500 Subject: [PATCH 1909/3019] =?UTF-8?q?Update=200509.=E6=96=90=E6=B3=A2?= =?UTF-8?q?=E9=82=A3=E5=A5=91=E6=95=B0.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...42\351\202\243\345\245\221\346\225\260.md" | 30 ++++++++++++------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git "a/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" "b/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" index 08175058bb..195b68acec 100644 --- "a/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" +++ "b/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" @@ -203,18 +203,9 @@ class Solution { ``` ### Python +动态规划(版本一) ```python -class Solution: - def fib(self, n: int) -> int: - if n < 2: - return n - a, b, c = 0, 1, 0 - for i in range(1, n): - c = a + b - a, b = b, c - return c -# 动态规划 (注释版。无修饰) class Solution: def fib(self, n: int) -> int: @@ -238,7 +229,24 @@ class Solution: # 返回答案 return dp[n] -# 递归实现 +``` +动态规划(版本二) +```python +class Solution: + def fib(self, n: int) -> int: + if n < 2: + return n + a, b, c = 0, 1, 0 + for i in range(1, n): + c = a + b + a, b = b, c + return c + + +``` +递归(版本一) +```python + class Solution: def fib(self, n: int) -> int: if n < 2: From 69361bba979b9bc359a8ddfd43fc98014801c47f Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Thu, 1 Jun 2023 15:14:15 -0500 Subject: [PATCH 1910/3019] =?UTF-8?q?Update=200070.=E7=88=AC=E6=A5=BC?= =?UTF-8?q?=E6=A2=AF.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...0.\347\210\254\346\245\274\346\242\257.md" | 62 ++++++++++++++----- 1 file changed, 48 insertions(+), 14 deletions(-) diff --git "a/problems/0070.\347\210\254\346\245\274\346\242\257.md" "b/problems/0070.\347\210\254\346\245\274\346\242\257.md" index a06ee91e1d..64c7e403c0 100644 --- "a/problems/0070.\347\210\254\346\245\274\346\242\257.md" +++ "b/problems/0070.\347\210\254\346\245\274\346\242\257.md" @@ -251,32 +251,66 @@ class Solution { ``` ### Python - +动态规划(版本一) ```python # 空间复杂度为O(n)版本 class Solution: def climbStairs(self, n: int) -> int: - # dp[i] 为第 i 阶楼梯有多少种方法爬到楼顶 - dp = [0]*(n+1) - dp[0] = 1 + if n <= 1: + return n + + dp = [0] * (n + 1) dp[1] = 1 - for i in range(2, n+1): - dp[i] = dp[i-1] + dp[i-2] + dp[2] = 2 + + for i in range(3, n + 1): + dp[i] = dp[i - 1] + dp[i - 2] + return dp[n] -# 空间复杂度为O(1)版本 +``` +动态规划(版本二) +```python + +# 空间复杂度为O(3)版本 class Solution: def climbStairs(self, n: int) -> int: - dp = [0]*(n+1) - dp[0] = 1 + if n <= 1: + return n + + dp = [0] * 3 dp[1] = 1 - for i in range(2,n+1): - tmp = dp[0] + dp[1] - dp[0] = dp[1] - dp[1] = tmp - return dp[1] + dp[2] = 2 + + for i in range(3, n + 1): + total = dp[1] + dp[2] + dp[1] = dp[2] + dp[2] = total + + return dp[2] + ``` +动态规划(版本三) +```python +# 空间复杂度为O(1)版本 +class Solution: + def climbStairs(self, n: int) -> int: + if n <= 1: + return n + + prev1 = 1 + prev2 = 2 + + for i in range(3, n + 1): + total = prev1 + prev2 + prev1 = prev2 + prev2 = total + + return prev2 + + +``` ### Go ```Go func climbStairs(n int) int { From 8e7d9f579ca973454fdd11f6857f1bd29664db3a Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Thu, 1 Jun 2023 15:19:27 -0500 Subject: [PATCH 1911/3019] =?UTF-8?q?Update=200509.=E6=96=90=E6=B3=A2?= =?UTF-8?q?=E9=82=A3=E5=A5=91=E6=95=B0.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...42\351\202\243\345\245\221\346\225\260.md" | 38 +++++++++++++++---- 1 file changed, 31 insertions(+), 7 deletions(-) diff --git "a/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" "b/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" index 195b68acec..cdbf860cba 100644 --- "a/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" +++ "b/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" @@ -230,17 +230,41 @@ class Solution: return dp[n] ``` -动态规划(版本二) +态规划(版本二) ```python + class Solution: def fib(self, n: int) -> int: - if n < 2: + if n <= 1: return n - a, b, c = 0, 1, 0 - for i in range(1, n): - c = a + b - a, b = b, c - return c + + dp = [0, 1] + + for i in range(2, n + 1): + total = dp[0] + dp[1] + dp[0] = dp[1] + dp[1] = total + + return dp[1] + + +``` +动态规划(版本三) +```python +class Solution: + def fib(self, n: int) -> int: + if n <= 1: + return n + + prev1, prev2 = 0, 1 + + for _ in range(2, n + 1): + curr = prev1 + prev2 + prev1, prev2 = prev2, curr + + return prev2 + + ``` From b5494585fbff9e9ccb489674410c1f60401a9456 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Thu, 1 Jun 2023 15:19:56 -0500 Subject: [PATCH 1912/3019] =?UTF-8?q?Update=200509.=E6=96=90=E6=B3=A2?= =?UTF-8?q?=E9=82=A3=E5=A5=91=E6=95=B0.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" "b/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" index cdbf860cba..45a9cf6b57 100644 --- "a/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" +++ "b/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" @@ -230,7 +230,7 @@ class Solution: return dp[n] ``` -态规划(版本二) +动态规划(版本二) ```python class Solution: From 283b74478afc69b4f8d8e6e33a98dfa30d659372 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Thu, 1 Jun 2023 16:03:35 -0500 Subject: [PATCH 1913/3019] =?UTF-8?q?Update=200746.=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=E6=9C=80=E5=B0=8F=E8=8A=B1=E8=B4=B9=E7=88=AC=E6=A5=BC=E6=A2=AF?= =?UTF-8?q?.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...71\347\210\254\346\245\274\346\242\257.md" | 40 +++++++++++++------ 1 file changed, 28 insertions(+), 12 deletions(-) diff --git "a/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" "b/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" index d7258d4576..97d065ed2b 100644 --- "a/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" +++ "b/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" @@ -245,26 +245,42 @@ class Solution { ``` ### Python + +动态规划(版本一) ```python -# 第一步不支付费用 + class Solution: def minCostClimbingStairs(self, cost: List[int]) -> int: - n = len(cost) - dp = [0]*(n+1) # 到达前两步费用为0 - for i in range(2, n+1): - dp[i] = min(dp[i-1]+cost[i-1], dp[i-2]+cost[i-2]) - return dp[-1] + dp = [0] * (len(cost) + 1) + dp[0] = 0 # 初始值,表示从起点开始不需要花费体力 + dp[1] = 0 # 初始值,表示经过第一步不需要花费体力 + + for i in range(2, len(cost) + 1): + # 在第i步,可以选择从前一步(i-1)花费体力到达当前步,或者从前两步(i-2)花费体力到达当前步 + # 选择其中花费体力较小的路径,加上当前步的花费,更新dp数组 + dp[i] = min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]) + + return dp[len(cost)] # 返回到达楼顶的最小花费 + ``` +动态规划(版本二) + ```python -# 第一步支付费用 class Solution: def minCostClimbingStairs(self, cost: List[int]) -> int: - dp = [0] * (len(cost) + 1) - dp[0] = 0 - dp[1] = 0 + dp0 = 0 # 初始值,表示从起点开始不需要花费体力 + dp1 = 0 # 初始值,表示经过第一步不需要花费体力 + for i in range(2, len(cost) + 1): - dp[i] = min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i-2]) - return dp[len(cost)] + # 在第i步,可以选择从前一步(i-1)花费体力到达当前步,或者从前两步(i-2)花费体力到达当前步 + # 选择其中花费体力较小的路径,加上当前步的花费,得到当前步的最小花费 + dpi = min(dp1 + cost[i - 1], dp0 + cost[i - 2]) + + dp0 = dp1 # 更新dp0为前一步的值,即上一次循环中的dp1 + dp1 = dpi # 更新dp1为当前步的最小花费 + + return dp1 # 返回到达楼顶的最小花费 + ``` ### Go From 6128c57e151b55d433ee74135838c303a9694908 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Thu, 1 Jun 2023 17:13:23 -0500 Subject: [PATCH 1914/3019] =?UTF-8?q?Update=200062.=E4=B8=8D=E5=90=8C?= =?UTF-8?q?=E8=B7=AF=E5=BE=84.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...15\345\220\214\350\267\257\345\276\204.md" | 59 ++++++++++++++++++- 1 file changed, 56 insertions(+), 3 deletions(-) diff --git "a/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" "b/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" index bf4363692b..430dacdc70 100644 --- "a/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" +++ "b/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" @@ -287,17 +287,70 @@ public: ``` ### Python +递归 +```python +class Solution: + def uniquePaths(self, m: int, n: int) -> int: + if m == 1 or n == 1: + return 1 + return self.uniquePaths(m - 1, n) + self.uniquePaths(m, n - 1) +``` +动态规划(版本一) ```python -class Solution: # 动态规划 +class Solution: def uniquePaths(self, m: int, n: int) -> int: - dp = [[1 for i in range(n)] for j in range(m)] + # 创建一个二维列表用于存储唯一路径数 + dp = [[0] * n for _ in range(m)] + + # 设置第一行和第一列的基本情况 + for i in range(m): + dp[i][0] = 1 + for j in range(n): + dp[0][j] = 1 + + # 计算每个单元格的唯一路径数 for i in range(1, m): for j in range(1, n): - dp[i][j] = dp[i][j - 1] + dp[i - 1][j] + dp[i][j] = dp[i - 1][j] + dp[i][j - 1] + + # 返回右下角单元格的唯一路径数 return dp[m - 1][n - 1] + +``` +动态规划(版本二) +```python +class Solution: + def uniquePaths(self, m: int, n: int) -> int: + # 创建一个一维列表用于存储每列的唯一路径数 + dp = [1] * n + + # 计算每个单元格的唯一路径数 + for j in range(1, m): + for i in range(1, n): + dp[i] += dp[i - 1] + + # 返回右下角单元格的唯一路径数 + return dp[n - 1] ``` +数论 +```python +class Solution: + def uniquePaths(self, m: int, n: int) -> int: + numerator = 1 # 分子 + denominator = m - 1 # 分母 + count = m - 1 # 计数器,表示剩余需要计算的乘积项个数 + t = m + n - 2 # 初始乘积项 + while count > 0: + numerator *= t # 计算乘积项的分子部分 + t -= 1 # 递减乘积项 + while denominator != 0 and numerator % denominator == 0: + numerator //= denominator # 约简分子 + denominator -= 1 # 递减分母 + count -= 1 # 计数器减1,继续下一项的计算 + return numerator # 返回最终的唯一路径数 +``` ### Go ```Go From 906293efae7e1de646593c7ae560cab726b2662f Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Thu, 1 Jun 2023 17:48:22 -0500 Subject: [PATCH 1915/3019] =?UTF-8?q?Update=200063.=E4=B8=8D=E5=90=8C?= =?UTF-8?q?=E8=B7=AF=E5=BE=84II.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\345\220\214\350\267\257\345\276\204II.md" | 157 ++++++++++++------ 1 file changed, 109 insertions(+), 48 deletions(-) diff --git "a/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" "b/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" index 85130ab4e4..ac9cae75a7 100644 --- "a/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" +++ "b/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" @@ -271,69 +271,130 @@ class Solution { ### Python - +动态规划(版本一) ```python class Solution: - def uniquePathsWithObstacles(self, obstacleGrid: List[List[int]]) -> int: - # 构造一个DP table - row = len(obstacleGrid) - col = len(obstacleGrid[0]) - dp = [[0 for _ in range(col)] for _ in range(row)] - dp[0][0] = 0 if obstacleGrid[0][0] == 1 else 1 - if dp[0][0] == 0: - return 0 # 如果第一个格子就是障碍,return 0 - # 第一行 - for i in range(1, col): - if obstacleGrid[0][i] == 1: - # 遇到障碍物时,直接退出循环,后面默认都是0 + def uniquePathsWithObstacles(self, obstacleGrid): + m = len(obstacleGrid) + n = len(obstacleGrid[0]) + if obstacleGrid[m - 1][n - 1] == 1 or obstacleGrid[0][0] == 1: + return 0 + dp = [[0] * n for _ in range(m)] + for i in range(m): + if obstacleGrid[i][0] == 0: # 遇到障碍物时,直接退出循环,后面默认都是0 + dp[i][0] = 1 + else: break - dp[0][i] = 1 - - # 第一列 - for i in range(1, row): - if obstacleGrid[i][0] == 1: - # 遇到障碍物时,直接退出循环,后面默认都是0 + for j in range(n): + if obstacleGrid[0][j] == 0: + dp[0][j] = 1 + else: break - dp[i][0] = 1 - # print(dp) - - for i in range(1, row): - for j in range(1, col): - if obstacleGrid[i][j] == 0: - dp[i][j] = dp[i - 1][j] + dp[i][j - 1] - return dp[-1][-1] + for i in range(1, m): + for j in range(1, n): + if obstacleGrid[i][j] == 1: + continue + dp[i][j] = dp[i - 1][j] + dp[i][j - 1] + return dp[m - 1][n - 1] + ``` +动态规划(版本二) +```python +class Solution: + def uniquePathsWithObstacles(self, obstacleGrid): + m = len(obstacleGrid) # 网格的行数 + n = len(obstacleGrid[0]) # 网格的列数 + + if obstacleGrid[m - 1][n - 1] == 1 or obstacleGrid[0][0] == 1: + # 如果起点或终点有障碍物,直接返回0 + return 0 + + dp = [[0] * n for _ in range(m)] # 创建一个二维列表用于存储路径数 + + # 设置起点的路径数为1 + dp[0][0] = 1 if obstacleGrid[0][0] == 0 else 0 + + # 计算第一列的路径数 + for i in range(1, m): + if obstacleGrid[i][0] == 0: + dp[i][0] = dp[i - 1][0] + + # 计算第一行的路径数 + for j in range(1, n): + if obstacleGrid[0][j] == 0: + dp[0][j] = dp[0][j - 1] + + # 计算其他位置的路径数 + for i in range(1, m): + for j in range(1, n): + if obstacleGrid[i][j] == 1: + continue + dp[i][j] = dp[i - 1][j] + dp[i][j - 1] + + return dp[m - 1][n - 1] # 返回终点的路径数 + + +``` +动态规划(版本三) ```python class Solution: - """ - 使用一维dp数组 - """ + def uniquePathsWithObstacles(self, obstacleGrid): + if obstacleGrid[0][0] == 1: + return 0 + + dp = [0] * len(obstacleGrid[0]) # 创建一个一维列表用于存储路径数 + + # 初始化第一行的路径数 + for j in range(len(dp)): + if obstacleGrid[0][j] == 1: + dp[j] = 0 + elif j == 0: + dp[j] = 1 + else: + dp[j] = dp[j - 1] + + # 计算其他行的路径数 + for i in range(1, len(obstacleGrid)): + for j in range(len(dp)): + if obstacleGrid[i][j] == 1: + dp[j] = 0 + elif j != 0: + dp[j] = dp[j] + dp[j - 1] + + return dp[-1] # 返回最后一个元素,即终点的路径数 - def uniquePathsWithObstacles(self, obstacleGrid: List[List[int]]) -> int: - m, n = len(obstacleGrid), len(obstacleGrid[0]) +``` +动态规划(版本四) - # 初始化dp数组 - # 该数组缓存当前行 - curr = [0] * n +```python +class Solution: + def uniquePathsWithObstacles(self, obstacleGrid): + if obstacleGrid[0][0] == 1: + return 0 + + m, n = len(obstacleGrid), len(obstacleGrid[0]) + + dp = [0] * n # 创建一个一维列表用于存储路径数 + + # 初始化第一行的路径数 for j in range(n): if obstacleGrid[0][j] == 1: break - curr[j] = 1 + dp[j] = 1 - for i in range(1, m): # 从第二行开始 - for j in range(n): # 从第一列开始,因为第一列可能有障碍物 - # 有障碍物处无法通行,状态就设成0 + # 计算其他行的路径数 + for i in range(1, m): + if obstacleGrid[i][0] == 1: + dp[0] = 0 + for j in range(1, n): if obstacleGrid[i][j] == 1: - curr[j] = 0 - elif j > 0: - # 等价于 - # dp[i][j] = dp[i - 1][j] + dp[i][j - 1] - curr[j] = curr[j] + curr[j - 1] - # 隐含的状态更新 - # dp[i][0] = dp[i - 1][0] - - return curr[n - 1] + dp[j] = 0 + else: + dp[j] += dp[j - 1] + + return dp[-1] # 返回最后一个元素,即终点的路径数 + ``` From 32185d5f2d8b3873253da3b44cbb1fb2aaa86762 Mon Sep 17 00:00:00 2001 From: Lozakaka <102352821+Lozakaka@users.noreply.github.com> Date: Thu, 1 Jun 2023 19:44:43 -0400 Subject: [PATCH 1916/3019] =?UTF-8?q?=E7=B7=A8=E8=BC=AFJAVA=E8=A7=A3?= =?UTF-8?q?=E7=AD=94=E7=9A=84=E9=83=A8=E5=88=86=E5=85=A7=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 提供JAVA填充數組的函數Arrays.fill() 2. for loop中不需要if statement,並有用 // 解釋原因 --- ...14\345\205\250\345\271\263\346\226\271\346\225\260.md" | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git "a/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" "b/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" index f5b23d2636..82d02b302d 100644 --- "a/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" +++ "b/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" @@ -177,15 +177,19 @@ class Solution { for (int j = 0; j <= n; j++) { dp[j] = max; } + //如果不想要寫for-loop填充數組的話,也可以用JAVA內建的Arrays.fill()函數。 + //Arrays.fill(dp, Integer.MAX_VALUE); + //当和为0时,组合的个数为0 dp[0] = 0; // 遍历物品 for (int i = 1; i * i <= n; i++) { // 遍历背包 for (int j = i * i; j <= n; j++) { - if (dp[j - i * i] != max) { + //if (dp[j - i * i] != max) { dp[j] = Math.min(dp[j], dp[j - i * i] + 1); - } + //} + //不需要這個if statement,因爲在完全平方數這一題不會有"湊不成"的狀況發生( 一定可以用"1"來組成任何一個n),故comment掉這個if statement。 } } return dp[n]; From 442008bb8ecfa3f64c9c9402e4c59c46575a17ae Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Thu, 1 Jun 2023 22:44:10 -0500 Subject: [PATCH 1917/3019] =?UTF-8?q?Update=200343.=E6=95=B4=E6=95=B0?= =?UTF-8?q?=E6=8B=86=E5=88=86.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...64\346\225\260\346\213\206\345\210\206.md" | 66 ++++++++++++++++--- 1 file changed, 57 insertions(+), 9 deletions(-) diff --git "a/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" "b/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" index c2fbbdde68..f24e2985d5 100644 --- "a/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" +++ "b/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" @@ -245,20 +245,68 @@ class Solution { ``` ### Python +动态规划(版本一) ```python class Solution: - def integerBreak(self, n: int) -> int: - dp = [0] * (n + 1) - dp[2] = 1 + # 假设对正整数 i 拆分出的第一个正整数是 j(1 <= j < i),则有以下两种方案: + # 1) 将 i 拆分成 j 和 i−j 的和,且 i−j 不再拆分成多个正整数,此时的乘积是 j * (i-j) + # 2) 将 i 拆分成 j 和 i−j 的和,且 i−j 继续拆分成多个正整数,此时的乘积是 j * dp[i-j] + def integerBreak(self, n): + dp = [0] * (n + 1) # 创建一个大小为n+1的数组来存储计算结果 + dp[2] = 1 # 初始化dp[2]为1,因为当n=2时,只有一个切割方式1+1=2,乘积为1 + + # 从3开始计算,直到n for i in range(3, n + 1): - # 假设对正整数 i 拆分出的第一个正整数是 j(1 <= j < i),则有以下两种方案: - # 1) 将 i 拆分成 j 和 i−j 的和,且 i−j 不再拆分成多个正整数,此时的乘积是 j * (i-j) - # 2) 将 i 拆分成 j 和 i−j 的和,且 i−j 继续拆分成多个正整数,此时的乘积是 j * dp[i-j] - for j in range(1, i / 2 + 1): - dp[i] = max(dp[i], max(j * (i - j), j * dp[i - j])) - return dp[n] + # 遍历所有可能的切割点 + for j in range(1, i // 2 + 1): + + # 计算切割点j和剩余部分(i-j)的乘积,并与之前的结果进行比较取较大值 + + dp[i] = max(dp[i], max((i - j) * j, dp[i - j] * j)) + + return dp[n] # 返回最终的计算结果 + +``` +动态规划(版本二) +```python +class Solution: + def integerBreak(self, n): + if n <= 3: + return 1 * (n - 1) # 对于n小于等于3的情况,返回1 * (n - 1) + + dp = [0] * (n + 1) # 创建一个大小为n+1的数组来存储最大乘积结果 + dp[1] = 1 # 当n等于1时,最大乘积为1 + dp[2] = 2 # 当n等于2时,最大乘积为2 + dp[3] = 3 # 当n等于3时,最大乘积为3 + + # 从4开始计算,直到n + for i in range(4, n + 1): + # 遍历所有可能的切割点 + for j in range(1, i // 2 + 1): + # 计算切割点j和剩余部分(i - j)的乘积,并与之前的结果进行比较取较大值 + dp[i] = max(dp[i], dp[i - j] * dp[j]) + + return dp[n] # 返回整数拆分的最大乘积结果 + ``` +贪心 +```python +class Solution: + def integerBreak(self, n): + if n == 2: # 当n等于2时,只有一种拆分方式:1+1=2,乘积为1 + return 1 + if n == 3: # 当n等于3时,只有一种拆分方式:1+1+1=3,乘积为1 + return 2 + if n == 4: # 当n等于4时,有两种拆分方式:2+2=4和1+1+1+1=4,乘积都为4 + return 4 + result = 1 + while n > 4: + result *= 3 # 每次乘以3,因为3的乘积比其他数字更大 + n -= 3 # 每次减去3 + result *= n # 将剩余的n乘以最后的结果 + return result +``` ### Go ```go func integerBreak(n int) int { From 41224f61bd37979847ee6258cda1282aa227befe Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Thu, 1 Jun 2023 22:50:49 -0500 Subject: [PATCH 1918/3019] =?UTF-8?q?Update=200096.=E4=B8=8D=E5=90=8C?= =?UTF-8?q?=E7=9A=84=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 --- ...\217\211\346\220\234\347\264\242\346\240\221.md" | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git "a/problems/0096.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0096.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" index 9f41906d27..368a5747b1 100644 --- "a/problems/0096.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" +++ "b/problems/0096.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" @@ -197,12 +197,13 @@ class Solution { ```python class Solution: def numTrees(self, n: int) -> int: - dp = [0] * (n + 1) - dp[0], dp[1] = 1, 1 - for i in range(2, n + 1): - for j in range(1, i + 1): - dp[i] += dp[j - 1] * dp[i - j] - return dp[-1] + dp = [0] * (n + 1) # 创建一个长度为n+1的数组,初始化为0 + dp[0] = 1 # 当n为0时,只有一种情况,即空树,所以dp[0] = 1 + for i in range(1, n + 1): # 遍历从1到n的每个数字 + for j in range(1, i + 1): # 对于每个数字i,计算以i为根节点的二叉搜索树的数量 + dp[i] += dp[j - 1] * dp[i - j] # 利用动态规划的思想,累加左子树和右子树的组合数量 + return dp[n] # 返回以1到n为节点的二叉搜索树的总数量 + ``` ### Go From 477f4595749ea6d38b22f3bac14cdc35c8aa2191 Mon Sep 17 00:00:00 2001 From: fwqaaq Date: Fri, 2 Jun 2023 22:24:44 +0800 Subject: [PATCH 1919/3019] =?UTF-8?q?Update=200213.=E6=89=93=E5=AE=B6?= =?UTF-8?q?=E5=8A=AB=E8=88=8DII.md=20about=20rust?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\345\256\266\345\212\253\350\210\215II.md" | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git "a/problems/0213.\346\211\223\345\256\266\345\212\253\350\210\215II.md" "b/problems/0213.\346\211\223\345\256\266\345\212\253\350\210\215II.md" index 6395f3a884..494ad2bd7f 100644 --- "a/problems/0213.\346\211\223\345\256\266\345\212\253\350\210\215II.md" +++ "b/problems/0213.\346\211\223\345\256\266\345\212\253\350\210\215II.md" @@ -248,6 +248,35 @@ function robRange(nums: number[], start: number, end: number): number { } ``` +Rust: + +```rust +impl Solution { + pub fn rob(nums: Vec) -> i32 { + match nums.len() { + 1 => nums[0], + _ => Self::rob_range(&nums, 0, nums.len() - 2).max(Self::rob_range( + &nums, + 1, + nums.len() - 1, + )), + } + } + + pub fn rob_range(nums: &Vec, start: usize, end: usize) -> i32 { + if start == end { + return nums[start]; + } + let mut dp = vec![0; nums.len()]; + dp[start] = nums[start]; + dp[start + 1] = nums[start].max(nums[start + 1]); + for i in start + 2..=end { + dp[i] = dp[i - 1].max(dp[i - 2] + nums[i]); + } + dp[end] + } +} +```

From 6bb21c8e5b18ea720651c087ecbe350ffe87a371 Mon Sep 17 00:00:00 2001 From: fwqaaq Date: Sat, 3 Jun 2023 11:20:55 +0800 Subject: [PATCH 1920/3019] =?UTF-8?q?Update=200337.=E6=89=93=E5=AE=B6?= =?UTF-8?q?=E5=8A=AB=E8=88=8DIII.md=20about=20rust?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...345\256\266\345\212\253\350\210\215III.md" | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git "a/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" "b/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" index ca8cea2369..1708b7a1e8 100644 --- "a/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" +++ "b/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" @@ -490,6 +490,33 @@ function robNode(node: TreeNode | null): MaxValueArr { } ``` +### Rust + +动态规划: + +```rust +use std::cell::RefCell; +use std::rc::Rc; +impl Solution { + pub fn rob(root: Option>>) -> i32 { + let (v1, v2) = Self::rob_tree(&root); + v1.max(v2) + } + pub fn rob_tree(cur: &Option>>) -> (i32, i32) { + match cur { + None => (0, 0), + Some(node) => { + let left = Self::rob_tree(&node.borrow_mut().left); + let right = Self::rob_tree(&node.borrow_mut().right); + ( + left.0.max(left.1) + right.0.max(right.1), // 偷左右节点 + node.borrow().val + left.0 + right.0, // 偷父节点 + ) + } + } + } +} +```

From 2d66c713f06609bfcbfa6099b4e858686ae620a2 Mon Sep 17 00:00:00 2001 From: fwqaaq Date: Sat, 3 Jun 2023 13:58:57 +0800 Subject: [PATCH 1921/3019] =?UTF-8?q?Update=200121.=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?.md=20about=20rust?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...34\200\344\275\263\346\227\266\346\234\272.md" | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git "a/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" "b/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" index 753cb10692..be8630f584 100644 --- "a/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" +++ "b/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" @@ -510,7 +510,22 @@ public class Solution } ``` +Rust: +> 贪心 + +```rust +impl Solution { + pub fn max_profit(prices: Vec) -> i32 { + let (mut low, mut res) = (i32::MAX, 0); + for p in prices { + low = p.min(low); + res = res.max(p - low); + } + res + } +} +```

From b716a8ab44c06d9ff0b144774aa43b93efd75c90 Mon Sep 17 00:00:00 2001 From: fwqaaq Date: Sat, 3 Jun 2023 14:05:04 +0800 Subject: [PATCH 1922/3019] =?UTF-8?q?Update=200121.=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?.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...34\200\344\275\263\346\227\266\346\234\272.md" | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git "a/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" "b/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" index be8630f584..9c8a43902d 100644 --- "a/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" +++ "b/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" @@ -527,6 +527,21 @@ impl Solution { } ``` +> 动态规划 + +```rust +impl Solution { + pub fn max_profit(prices: Vec) -> i32 { + let mut dp = vec![-prices[0], 0]; + for p in prices { + dp[0] = dp[0].max(-p); + dp[1] = dp[1].max(dp[0] + p); + } + dp[1] + } +} +``` +

From 745e91e1e7043474e15ec790a89a472d0d25e279 Mon Sep 17 00:00:00 2001 From: fwqaaq Date: Sat, 3 Jun 2023 14:22:19 +0800 Subject: [PATCH 1923/3019] =?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=20=E4=BC=98=E5=8C=96=20Rust?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\344\275\263\346\227\266\346\234\272II.md" | 21 +++++++------------ 1 file changed, 7 insertions(+), 14 deletions(-) diff --git "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" index 0d8ad608d7..89c654fad1 100644 --- "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" +++ "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" @@ -322,13 +322,10 @@ function maxProfit(prices: number[]): number { ```Rust impl Solution { - fn max(a: i32, b: i32) -> i32 { - if a > b { a } else { b } - } pub fn max_profit(prices: Vec) -> i32 { let mut result = 0; for i in 1..prices.len() { - result += Self::max(prices[i] - prices[i - 1], 0); + result += (prices[i] - prices[i - 1]).max(0); } result } @@ -339,18 +336,14 @@ impl Solution { ```Rust impl Solution { - fn max(a: i32, b: i32) -> i32 { - if a > b { a } else { b } - } pub fn max_profit(prices: Vec) -> i32 { - let n = prices.len(); - let mut dp = vec![vec![0; 2]; n]; - dp[0][0] -= prices[0]; - for i in 1..n { - dp[i][0] = Self::max(dp[i - 1][0], dp[i - 1][1] - prices[i]); - dp[i][1] = Self::max(dp[i - 1][1], dp[i - 1][0] + prices[i]); + let mut dp = vec![vec![0; 2]; prices.len()]; + dp[0][0] = -prices[0]; + for i in 1..prices.len() { + dp[i][0] = dp[i - 1][0].max(dp[i - 1][1] - prices[i]); + dp[i][1] = dp[i - 1][1].max(dp[i - 1][0] + prices[i]); } - Self::max(dp[n - 1][0], dp[n - 1][1]) + dp[prices.len() - 1][1] } } ``` From fd7a98b8315eb56f07caac3cc586f6b96e3d246b Mon Sep 17 00:00:00 2001 From: fwqaaq Date: Sat, 3 Jun 2023 14:40:00 +0800 Subject: [PATCH 1924/3019] =?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=EF=BC=88=E5=8A=A8=E6=80=81=E8=A7=84=E5=88=92=EF=BC=89.md=20a?= =?UTF-8?q?bout=20rust?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...01\350\247\204\345\210\222\357\274\211.md" | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" index 146c6a4cb1..5976f25898 100644 --- "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" +++ "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" @@ -346,7 +346,52 @@ public class Solution } ``` +Rust: +> 贪心 + +```rust +impl Solution { + pub fn max_profit(prices: Vec) -> i32 { + let mut result = 0; + for i in 1..prices.len() { + result += (prices[i] - prices[i - 1]).max(0); + } + result + } +} +``` + +>动态规划 + +```rust +impl Solution { + pub fn max_profit(prices: Vec) -> i32 { + let mut dp = vec![vec![0; 2]; prices.len()]; + dp[0][0] = -prices[0]; + for i in 1..prices.len() { + dp[i][0] = dp[i - 1][0].max(dp[i - 1][1] - prices[i]); + dp[i][1] = dp[i - 1][1].max(dp[i - 1][0] + prices[i]); + } + dp[prices.len() - 1][1] + } +} +``` + +> 优化 + +```rust +impl Solution { + pub fn max_profit(prices: Vec) -> i32 { + let mut dp = vec![-prices[0], 0]; + for i in 1..=prices.len() { + dp[0] = dp[0].max(dp[1] - prices[i - 1]); + dp[1] = dp[1].max(dp[0] + prices[i - 1]); + } + dp[1] + } +} +```

From 2719dbdd0eeeaf534acf09f0a67d3f84bae84a04 Mon Sep 17 00:00:00 2001 From: fwqaaq Date: Sat, 3 Jun 2023 14:58:09 +0800 Subject: [PATCH 1925/3019] =?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=EF=BC=88=E5=8A=A8=E6=80=81=E8=A7=84=E5=88=92=EF=BC=89.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...250\346\200\201\350\247\204\345\210\222\357\274\211.md" | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" index 5976f25898..43e567c5bf 100644 --- "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" +++ "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" @@ -384,9 +384,10 @@ impl Solution { impl Solution { pub fn max_profit(prices: Vec) -> i32 { let mut dp = vec![-prices[0], 0]; - for i in 1..=prices.len() { - dp[0] = dp[0].max(dp[1] - prices[i - 1]); - dp[1] = dp[1].max(dp[0] + prices[i - 1]); + for p in prices { + // 可以看作 low、res + dp[0] = dp[0].max(dp[1] - p); + dp[1] = dp[1].max(dp[0] + p); } dp[1] } From 2a6a8da5e0e5d0949f92f8ef04aab26c5138770f Mon Sep 17 00:00:00 2001 From: fwqaaq Date: Sat, 3 Jun 2023 14:59:17 +0800 Subject: [PATCH 1926/3019] =?UTF-8?q?Update=20problems/0122.=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=BAII=EF=BC=88=E5=8A=A8=E6=80=81=E8=A7=84=E5=88=92?= =?UTF-8?q?=EF=BC=89.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...5\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" | 1 - 1 file changed, 1 deletion(-) diff --git "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" index 43e567c5bf..24e15024b5 100644 --- "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" +++ "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" @@ -385,7 +385,6 @@ impl Solution { pub fn max_profit(prices: Vec) -> i32 { let mut dp = vec![-prices[0], 0]; for p in prices { - // 可以看作 low、res dp[0] = dp[0].max(dp[1] - p); dp[1] = dp[1].max(dp[0] + p); } From 09ab0e48738d17c184c197d5043a2e8423d0686d Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Sat, 3 Jun 2023 20:10:36 -0500 Subject: [PATCH 1927/3019] =?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 --- ...47\241\20001\350\203\214\345\214\205-1.md" | 79 ++++++++++++------- 1 file changed, 52 insertions(+), 27 deletions(-) diff --git "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" index c25252488a..9df2fc4cb2 100644 --- "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" +++ "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" @@ -339,38 +339,63 @@ public class BagProblem { ``` ### python +无参数版 +```python +def test_2_wei_bag_problem1(): + weight = [1, 3, 4] + value = [15, 20, 30] + bagweight = 4 + + # 二维数组 + dp = [[0] * (bagweight + 1) for _ in range(len(weight))] + + # 初始化 + for j in range(weight[0], bagweight + 1): + dp[0][j] = value[0] + + # weight数组的大小就是物品个数 + for i in range(1, len(weight)): # 遍历物品 + for j in range(bagweight + 1): # 遍历背包容量 + if j < weight[i]: + dp[i][j] = dp[i - 1][j] + else: + dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]) + print(dp[len(weight) - 1][bagweight]) + +test_2_wei_bag_problem1() + +``` +有参数版 ```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)] - - # 初始化dp数组. - for i in range(rows): - dp[i][0] = 0 - first_item_weight, first_item_value = weight[0], value[0] - for j in range(1, cols): - if first_item_weight <= j: - dp[0][j] = first_item_value - - # 更新dp数组: 先遍历物品, 再遍历背包. - for i in range(1, len(weight)): - cur_weight, cur_val = weight[i], value[i] - for j in range(1, cols): - if cur_weight > j: # 说明背包装不下当前物品. - dp[i][j] = dp[i - 1][j] # 所以不装当前物品. - else: - # 定义dp数组: dp[i][j] 前i个物品里,放进容量为j的背包,价值总和最大是多少。 - dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - cur_weight]+ cur_val) - - print(dp) +def test_2_wei_bag_problem1(weight, value, bagweight): + # 二维数组 + dp = [[0] * (bagweight + 1) for _ in range(len(weight))] + # 初始化 + for j in range(weight[0], bagweight + 1): + dp[0][j] = value[0] + + # weight数组的大小就是物品个数 + for i in range(1, len(weight)): # 遍历物品 + for j in range(bagweight + 1): # 遍历背包容量 + if j < weight[i]: + dp[i][j] = dp[i - 1][j] + else: + dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]) + + return dp[len(weight) - 1][bagweight] if __name__ == "__main__": - bag_size = 4 - weight = [1, 3, 4] - value = [15, 20, 30] - test_2_wei_bag_problem1(bag_size, weight, value) + + weight = [1, 3, 4] + value = [15, 20, 30] + bagweight = 4 + + result = test_2_wei_bag_problem1(weight, value, bagweight) + print(result) + + ``` From 37fdbd369e16ab7739bfdfd46b9fd8dbcdf514b9 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Sat, 3 Jun 2023 22:59:37 -0500 Subject: [PATCH 1928/3019] =?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-2.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...47\241\20001\350\203\214\345\214\205-2.md" | 39 ++++++++++++++----- 1 file changed, 30 insertions(+), 9 deletions(-) diff --git "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" index 3b798334a6..d481e044c5 100644 --- "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" +++ "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" @@ -246,25 +246,46 @@ int main() { ### Python +无参版 ```python def test_1_wei_bag_problem(): weight = [1, 3, 4] value = [15, 20, 30] - bag_weight = 4 - # 初始化: 全为0 - dp = [0] * (bag_weight + 1) - - # 先遍历物品, 再遍历背包容量 - for i in range(len(weight)): - for j in range(bag_weight, weight[i] - 1, -1): - # 递归公式 + bagWeight = 4 + + # 初始化 + dp = [0] * (bagWeight + 1) + for i in range(len(weight)): # 遍历物品 + for j in range(bagWeight, weight[i] - 1, -1): # 遍历背包容量 dp[j] = max(dp[j], dp[j - weight[i]] + value[i]) - print(dp) + print(dp[bagWeight]) + test_1_wei_bag_problem() ``` +有参版 +```python +def test_1_wei_bag_problem(weight, value, bagWeight): + # 初始化 + dp = [0] * (bagWeight + 1) + for i in range(len(weight)): # 遍历物品 + for j in range(bagWeight, weight[i] - 1, -1): # 遍历背包容量 + dp[j] = max(dp[j], dp[j - weight[i]] + value[i]) + + return dp[bagWeight] + +if __name__ == "__main__": + + weight = [1, 3, 4] + value = [15, 20, 30] + bagweight = 4 + + result = test_1_wei_bag_problem(weight, value, bagweight) + print(result) + +``` ### Go ```go func test_1_wei_bag_problem(weight, value []int, bagWeight int) int { From 5ab0a94c7152431b23303a6e64dc18a07c9ed37f Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Sun, 4 Jun 2023 05:36:45 -0500 Subject: [PATCH 1929/3019] =?UTF-8?q?Update=200416.=E5=88=86=E5=89=B2?= =?UTF-8?q?=E7=AD=89=E5=92=8C=E5=AD=90=E9=9B=86.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...11\345\222\214\345\255\220\351\233\206.md" | 103 +++++++++++------- 1 file changed, 63 insertions(+), 40 deletions(-) diff --git "a/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" "b/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" index 8115e18ea9..bb210e29e2 100644 --- "a/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" +++ "b/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" @@ -296,62 +296,85 @@ false true false false false true true false false false true true ``` ### Python: +卡哥版 ```python -# 一维度数组解法 class Solution: def canPartition(self, nums: List[int]) -> bool: - target = sum(nums) - if target % 2 == 1: return False - target //= 2 - dp = [0] * (target + 1) - for i in range(len(nums)): - for j in range(target, nums[i] - 1, -1): - dp[j] = max(dp[j], dp[j - nums[i]] + nums[i]) - return target == dp[target] -``` + _sum = 0 + + # dp[i]中的i表示背包内总和 + # 题目中说:每个数组中的元素不会超过 100,数组的大小不会超过 200 + # 总和不会大于20000,背包最大只需要其中一半,所以10001大小就可以了 + dp = [0] * 10001 + for num in nums: + _sum += num + # 也可以使用内置函数一步求和 + # _sum = sum(nums) + if _sum % 2 == 1: + return False + target = _sum // 2 + + # 开始 0-1背包 + for num in nums: + for j in range(target, num - 1, -1): # 每一个元素一定是不可重复放入,所以从大到小遍历 + dp[j] = max(dp[j], dp[j - num] + num) + # 集合中的元素正好可以凑成总和target + if dp[target] == target: + return True + return False + +``` +二维DP版 ```python -# 二维度数组解法 class Solution: def canPartition(self, nums: List[int]) -> bool: - target = sum(nums) - nums = sorted(nums) + + total_sum = sum(nums) - # 做最初的判断 - if target % 2 != 0: + if total_sum % 2 != 0: return False - # 找到 target value 可以认为这个是背包的体积 - target = target // 2 + target_sum = total_sum // 2 + dp = [[False] * (target_sum + 1) for _ in range(len(nums) + 1)] - row = len(nums) - col = target + 1 + # 初始化第一行(空子集可以得到和为0) + for i in range(len(nums) + 1): + dp[i][0] = True - # 定义 dp table - dp = [[0 for _ in range(col)] for _ in range(row)] + for i in range(1, len(nums) + 1): + for j in range(1, target_sum + 1): + if j < nums[i - 1]: + # 当前数字大于目标和时,无法使用该数字 + dp[i][j] = dp[i - 1][j] + else: + # 当前数字小于等于目标和时,可以选择使用或不使用该数字 + dp[i][j] = dp[i - 1][j] or dp[i - 1][j - nums[i - 1]] - # 初始 dp value - for i in range(row): - dp[i][0] = 0 - - for j in range(1, target): - if nums[0] <= j: - dp[0][j] = nums[0] + return dp[len(nums)][target_sum] - # 遍历 先遍历物品再遍历背包 - for i in range(1, row): +``` +一维DP版 +```python +class Solution: + def canPartition(self, nums: List[int]) -> bool: - cur_weight = nums[i] - cur_value = nums[i] + total_sum = sum(nums) - for j in range(1, col): - if cur_weight > j: - dp[i][j] = dp[i - 1][j] - else: - dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - cur_weight] + cur_value) - - # 输出结果 - return dp[-1][col - 1] == target + if total_sum % 2 != 0: + return False + + target_sum = total_sum // 2 + dp = [False] * (target_sum + 1) + dp[0] = True + + for num in nums: + # 从target_sum逆序迭代到num,步长为-1 + for i in range(target_sum, num - 1, -1): + dp[i] = dp[i] or dp[i - num] + + return dp[target_sum] + ``` ### Go: From 212e8f8b393dac2730bf0136b09838cdbc4d24b8 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Sun, 4 Jun 2023 05:48:05 -0500 Subject: [PATCH 1930/3019] =?UTF-8?q?Update=200416.=E5=88=86=E5=89=B2?= =?UTF-8?q?=E7=AD=89=E5=92=8C=E5=AD=90=E9=9B=86.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...62\347\255\211\345\222\214\345\255\220\351\233\206.md" | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git "a/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" "b/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" index bb210e29e2..7f6e3d5b3b 100644 --- "a/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" +++ "b/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" @@ -349,7 +349,10 @@ class Solution: dp[i][j] = dp[i - 1][j] else: # 当前数字小于等于目标和时,可以选择使用或不使用该数字 - dp[i][j] = dp[i - 1][j] or dp[i - 1][j - nums[i - 1]] + # dp[i][j] = dp[i - 1][j] or dp[i - 1][j - nums[i - 1]] + + # 当前数字小于等于目标和时,可以选择使用或不使用该数字的最大值 + dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - nums[i - 1]]) return dp[len(nums)][target_sum] @@ -371,9 +374,10 @@ class Solution: for num in nums: # 从target_sum逆序迭代到num,步长为-1 for i in range(target_sum, num - 1, -1): - dp[i] = dp[i] or dp[i - num] + dp[i] = max(dp[i], dp[i - num]) # 可以将其改成 dp[i] = dp[i] or dp[i - num] return dp[target_sum] + ``` From cb9da4fa38d861567a67ef0bd8467461e9ef90ff Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Sun, 4 Jun 2023 05:48:34 -0500 Subject: [PATCH 1931/3019] =?UTF-8?q?Update=200416.=E5=88=86=E5=89=B2?= =?UTF-8?q?=E7=AD=89=E5=92=8C=E5=AD=90=E9=9B=86.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" "b/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" index 7f6e3d5b3b..341362baaa 100644 --- "a/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" +++ "b/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" @@ -351,7 +351,7 @@ class Solution: # 当前数字小于等于目标和时,可以选择使用或不使用该数字 # dp[i][j] = dp[i - 1][j] or dp[i - 1][j - nums[i - 1]] - # 当前数字小于等于目标和时,可以选择使用或不使用该数字的最大值 + # 当前数字小于等于目标和时,选择使用或不使用该数字的最大值 dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - nums[i - 1]]) return dp[len(nums)][target_sum] From 285b6ab370ea7e08d768574751e1971c3ff11810 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Sun, 4 Jun 2023 05:53:50 -0500 Subject: [PATCH 1932/3019] =?UTF-8?q?Update=200416.=E5=88=86=E5=89=B2?= =?UTF-8?q?=E7=AD=89=E5=92=8C=E5=AD=90=E9=9B=86.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...62\347\255\211\345\222\214\345\255\220\351\233\206.md" | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git "a/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" "b/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" index 341362baaa..1f12931274 100644 --- "a/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" +++ "b/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" @@ -349,10 +349,7 @@ class Solution: dp[i][j] = dp[i - 1][j] else: # 当前数字小于等于目标和时,可以选择使用或不使用该数字 - # dp[i][j] = dp[i - 1][j] or dp[i - 1][j - nums[i - 1]] - - # 当前数字小于等于目标和时,选择使用或不使用该数字的最大值 - dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - nums[i - 1]]) + dp[i][j] = dp[i - 1][j] or dp[i - 1][j - nums[i - 1]] return dp[len(nums)][target_sum] @@ -374,8 +371,7 @@ class Solution: for num in nums: # 从target_sum逆序迭代到num,步长为-1 for i in range(target_sum, num - 1, -1): - dp[i] = max(dp[i], dp[i - num]) # 可以将其改成 dp[i] = dp[i] or dp[i - num] - + dp[i] = dp[i] or dp[i - num] return dp[target_sum] From 980c98ca0d15304b701d4cfbcc52a1d59ab736bf Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Sun, 4 Jun 2023 06:27:03 -0500 Subject: [PATCH 1933/3019] =?UTF-8?q?Update=201049.=E6=9C=80=E5=90=8E?= =?UTF-8?q?=E4=B8=80=E5=9D=97=E7=9F=B3=E5=A4=B4=E7=9A=84=E9=87=8D=E9=87=8F?= =?UTF-8?q?II.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\347\232\204\351\207\215\351\207\217II.md" | 75 +++++++++++++++++-- 1 file changed, 68 insertions(+), 7 deletions(-) diff --git "a/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" "b/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" index a8150b1f04..a978b80262 100644 --- "a/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" +++ "b/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" @@ -224,18 +224,79 @@ class Solution { ``` ### Python: +卡哥版 ```python class Solution: def lastStoneWeightII(self, stones: List[int]) -> int: - sumweight = sum(stones) - target = sumweight // 2 - dp = [0] * (target + 1) - for i in range(len(stones)): - for j in range(target, stones[i] - 1, -1): - dp[j] = max(dp[j], dp[j - stones[i]] + stones[i]) - return sumweight - 2 * dp[target] + dp = [0] * 15001 + total_sum = sum(stones) + target = total_sum // 2 + + for stone in stones: # 遍历物品 + for j in range(target, stone - 1, -1): # 遍历背包 + dp[j] = max(dp[j], dp[j - stone] + stone) + + return total_sum - dp[target] - dp[target] + ``` +二维DP版 +```python +class Solution: + def lastStoneWeightII(self, stones: List[int]) -> int: + total_sum = sum(stones) + target = total_sum // 2 + + # 创建二维dp数组,行数为石头的数量加1,列数为target加1 + # dp[i][j]表示前i个石头能否组成总重量为j + dp = [[False] * (target + 1) for _ in range(len(stones) + 1)] + + # 初始化第一列,表示总重量为0时,前i个石头都能组成 + for i in range(len(stones) + 1): + dp[i][0] = True + + for i in range(1, len(stones) + 1): + for j in range(1, target + 1): + # 如果当前石头重量大于当前目标重量j,则无法选择该石头 + if stones[i - 1] > j: + dp[i][j] = dp[i - 1][j] + else: + # 可选择该石头或不选择该石头 + dp[i][j] = dp[i - 1][j] or dp[i - 1][j - stones[i - 1]] + + # 找到最大的重量i,使得dp[len(stones)][i]为True + # 返回总重量减去两倍的最接近总重量一半的重量 + for i in range(target, -1, -1): + if dp[len(stones)][i]: + return total_sum - 2 * i + + return 0 + +``` +一维DP版 +```python +class Solution: + def lastStoneWeightII(self, stones): + total_sum = sum(stones) + target = total_sum // 2 + dp = [False] * (target + 1) + dp[0] = True + + for stone in stones: + for j in range(target, stone - 1, -1): + # 判断当前重量是否可以通过选择之前的石头得到或选择当前石头和之前的石头得到 + dp[j] = dp[j] or dp[j - stone] + + for i in range(target, -1, -1): + if dp[i]: + # 返回剩余石头的重量,即总重量减去两倍的最接近总重量一半的重量 + return total_sum - 2 * i + + return 0 + + + +``` ### Go: ```go func lastStoneWeightII(stones []int) int { From 8b69827fca7cfe9bd6e2fff92d7774189b489a32 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Sun, 4 Jun 2023 07:01:19 -0500 Subject: [PATCH 1934/3019] =?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 --- ...4.\347\233\256\346\240\207\345\222\214.md" | 85 ++++++++++++++++--- 1 file changed, 75 insertions(+), 10 deletions(-) diff --git "a/problems/0494.\347\233\256\346\240\207\345\222\214.md" "b/problems/0494.\347\233\256\346\240\207\345\222\214.md" index c9f888920f..32931e6b1f 100644 --- "a/problems/0494.\347\233\256\346\240\207\345\222\214.md" +++ "b/problems/0494.\347\233\256\346\240\207\345\222\214.md" @@ -293,19 +293,84 @@ class Solution { ``` ### Python +回溯版 +```python +class Solution: + + + def backtracking(self, candidates, target, total, startIndex, path, result): + if total == target: + result.append(path[:]) # 将当前路径的副本添加到结果中 + # 如果 sum + candidates[i] > target,则停止遍历 + for i in range(startIndex, len(candidates)): + if total + candidates[i] > target: + break + total += candidates[i] + path.append(candidates[i]) + self.backtracking(candidates, target, total, i + 1, path, result) + total -= candidates[i] + path.pop() + + def findTargetSumWays(self, nums: List[int], target: int) -> int: + total = sum(nums) + if target > total: + return 0 # 此时没有方案 + if (target + total) % 2 != 0: + return 0 # 此时没有方案,两个整数相加时要注意数值溢出的问题 + bagSize = (target + total) // 2 # 转化为组合总和问题,bagSize就是目标和 + + # 以下是回溯法代码 + result = [] + nums.sort() # 需要对nums进行排序 + self.backtracking(nums, bagSize, 0, 0, [], result) + return len(result) + +``` +二维DP ```python class Solution: def findTargetSumWays(self, nums: List[int], target: int) -> int: - sumValue = sum(nums) - #注意边界条件为 target>sumValue or target<-sumValue or (sumValue + target) % 2 == 1 - if abs(target) > sumValue or (sumValue + target) % 2 == 1: return 0 - bagSize = (sumValue + target) // 2 - dp = [0] * (bagSize + 1) - dp[0] = 1 - for i in range(len(nums)): - for j in range(bagSize, nums[i] - 1, -1): - dp[j] += dp[j - nums[i]] - return dp[bagSize] + total_sum = sum(nums) # 计算nums的总和 + if abs(target) > total_sum: + return 0 # 此时没有方案 + if (target + total_sum) % 2 == 1: + return 0 # 此时没有方案 + target_sum = (target + total_sum) // 2 # 目标和 + + # 创建二维动态规划数组,行表示选取的元素数量,列表示累加和 + dp = [[0] * (target_sum + 1) for _ in range(len(nums) + 1)] + + # 初始化状态 + dp[0][0] = 1 + + # 动态规划过程 + for i in range(1, len(nums) + 1): + for j in range(target_sum + 1): + dp[i][j] = dp[i - 1][j] # 不选取当前元素 + if j >= nums[i - 1]: + dp[i][j] += dp[i - 1][j - nums[i - 1]] # 选取当前元素 + + return dp[len(nums)][target_sum] # 返回达到目标和的方案数 + + +``` +一维DP +```python +class Solution: + def findTargetSumWays(self, nums: List[int], target: int) -> int: + total_sum = sum(nums) # 计算nums的总和 + if abs(target) > total_sum: + return 0 # 此时没有方案 + if (target + total_sum) % 2 == 1: + return 0 # 此时没有方案 + target_sum = (target + total_sum) // 2 # 目标和 + dp = [0] * (target_sum + 1) # 创建动态规划数组,初始化为0 + dp[0] = 1 # 当目标和为0时,只有一种方案,即什么都不选 + for num in nums: + for j in range(target_sum, num - 1, -1): + dp[j] += dp[j - num] # 状态转移方程,累加不同选择方式的数量 + return dp[target_sum] # 返回达到目标和的方案数 + ``` ### Go From b9faa11851fa43443380efefade020a02e0744f4 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Sun, 4 Jun 2023 07:41:05 -0500 Subject: [PATCH 1935/3019] =?UTF-8?q?Update=200474.=E4=B8=80=E5=92=8C?= =?UTF-8?q?=E9=9B=B6.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...4.\344\270\200\345\222\214\351\233\266.md" | 28 +++++++++++++++---- 1 file changed, 22 insertions(+), 6 deletions(-) diff --git "a/problems/0474.\344\270\200\345\222\214\351\233\266.md" "b/problems/0474.\344\270\200\345\222\214\351\233\266.md" index 6a178a254b..145f64aaa2 100644 --- "a/problems/0474.\344\270\200\345\222\214\351\233\266.md" +++ "b/problems/0474.\344\270\200\345\222\214\351\233\266.md" @@ -210,19 +210,35 @@ class Solution { ``` ### Python +DP(版本一) ```python class Solution: def findMaxForm(self, strs: List[str], m: int, n: int) -> int: - dp = [[0] * (n + 1) for _ in range(m + 1)] # 默认初始化0 + dp = [[0] * (n + 1) for _ in range(m + 1)] # 创建二维动态规划数组,初始化为0 + for s in strs: # 遍历物品 + zeroNum = s.count('0') # 统计0的个数 + oneNum = len(s) - zeroNum # 统计1的个数 + for i in range(m, zeroNum - 1, -1): # 遍历背包容量且从后向前遍历 + for j in range(n, oneNum - 1, -1): + dp[i][j] = max(dp[i][j], dp[i - zeroNum][j - oneNum] + 1) # 状态转移方程 + return dp[m][n] + +``` +DP(版本二) +```python +class Solution: + def findMaxForm(self, strs: List[str], m: int, n: int) -> int: + dp = [[0] * (n + 1) for _ in range(m + 1)] # 创建二维动态规划数组,初始化为0 # 遍历物品 - for str in strs: - ones = str.count('1') - zeros = str.count('0') - # 遍历背包容量且从后向前遍历! + for s in strs: + ones = s.count('1') # 统计字符串中1的个数 + zeros = s.count('0') # 统计字符串中0的个数 + # 遍历背包容量且从后向前遍历 for i in range(m, zeros - 1, -1): for j in range(n, ones - 1, -1): - dp[i][j] = max(dp[i][j], dp[i - zeros][j - ones] + 1) + dp[i][j] = max(dp[i][j], dp[i - zeros][j - ones] + 1) # 状态转移方程 return dp[m][n] + ``` ### Go From e002075a39841cca40e9fc95c1e23fdf4fcf5e42 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Sun, 4 Jun 2023 07:52:08 -0500 Subject: [PATCH 1936/3019] =?UTF-8?q?Update=20=E8=83=8C=E5=8C=85=E9=97=AE?= =?UTF-8?q?=E9=A2=98=E7=90=86=E8=AE=BA=E5=9F=BA=E7=A1=80=E5=AE=8C=E5=85=A8?= =?UTF-8?q?=E8=83=8C=E5=8C=85.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...14\345\205\250\350\203\214\345\214\205.md" | 77 ++++++++++++++----- 1 file changed, 56 insertions(+), 21 deletions(-) diff --git "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" index e927aa2061..2dc45fdb77 100644 --- "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" +++ "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" @@ -222,44 +222,79 @@ private static void testCompletePackAnotherWay(){ Python: - +先遍历物品,再遍历背包(无参版) ```python -# 先遍历物品,再遍历背包 -def test_complete_pack1(): +def test_CompletePack(): weight = [1, 3, 4] value = [15, 20, 30] - bag_weight = 4 + bagWeight = 4 + dp = [0] * (bagWeight + 1) + for i in range(len(weight)): # 遍历物品 + for j in range(weight[i], bagWeight + 1): # 遍历背包容量 + dp[j] = max(dp[j], dp[j - weight[i]] + value[i]) + print(dp[bagWeight]) - dp = [0]*(bag_weight + 1) +test_CompletePack() - for i in range(len(weight)): - for j in range(weight[i], bag_weight + 1): +``` + +先遍历物品,再遍历背包(有参版) +```python +def test_CompletePack(weight, value, bagWeight): + dp = [0] * (bagWeight + 1) + for i in range(len(weight)): # 遍历物品 + for j in range(weight[i], bagWeight + 1): # 遍历背包容量 dp[j] = max(dp[j], dp[j - weight[i]] + value[i]) - - print(dp[bag_weight]) + return dp[bagWeight] -# 先遍历背包,再遍历物品 -def test_complete_pack2(): +if __name__ == "__main__": weight = [1, 3, 4] value = [15, 20, 30] - bag_weight = 4 + bagWeight = 4 + result = test_CompletePack(weight, value, bagWeight) + print(result) - dp = [0]*(bag_weight + 1) +``` +先遍历背包,再遍历物品(无参版) +```python +def test_CompletePack(): + weight = [1, 3, 4] + value = [15, 20, 30] + bagWeight = 4 - for j in range(bag_weight + 1): - for i in range(len(weight)): - if j >= weight[i]: dp[j] = max(dp[j], dp[j - weight[i]] + value[i]) - - print(dp[bag_weight]) + dp = [0] * (bagWeight + 1) + + for j in range(bagWeight + 1): # 遍历背包容量 + for i in range(len(weight)): # 遍历物品 + if j - weight[i] >= 0: + dp[j] = max(dp[j], dp[j - weight[i]] + value[i]) + + print(dp[bagWeight]) + +test_CompletePack() -if __name__ == '__main__': - test_complete_pack1() - test_complete_pack2() ``` +先遍历背包,再遍历物品(有参版) +```python +def test_CompletePack(weight, value, bagWeight): + dp = [0] * (bagWeight + 1) + for j in range(bagWeight + 1): # 遍历背包容量 + for i in range(len(weight)): # 遍历物品 + if j - weight[i] >= 0: + dp[j] = max(dp[j], dp[j - weight[i]] + value[i]) + return dp[bagWeight] + +if __name__ == "__main__": + weight = [1, 3, 4] + value = [15, 20, 30] + bagWeight = 4 + result = test_CompletePack(weight, value, bagWeight) + print(result) +``` Go: ```go From ea98e43831f3f735bc38b0e5a55f52fe38c5cdd5 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Sun, 4 Jun 2023 07:53:16 -0500 Subject: [PATCH 1937/3019] =?UTF-8?q?Update=20=E8=83=8C=E5=8C=85=E9=97=AE?= =?UTF-8?q?=E9=A2=98=E7=90=86=E8=AE=BA=E5=9F=BA=E7=A1=80=E5=AE=8C=E5=85=A8?= =?UTF-8?q?=E8=83=8C=E5=8C=85.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" | 3 +++ 1 file changed, 3 insertions(+) diff --git "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" index 2dc45fdb77..a559a51289 100644 --- "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" +++ "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" @@ -222,6 +222,9 @@ private static void testCompletePackAnotherWay(){ Python: + + + 先遍历物品,再遍历背包(无参版) ```python def test_CompletePack(): From d7eac13627675be325ca50ce7fa6370b3c589936 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Sun, 4 Jun 2023 10:13:13 -0500 Subject: [PATCH 1938/3019] =?UTF-8?q?Update=200377.=E7=BB=84=E5=90=88?= =?UTF-8?q?=E6=80=BB=E5=92=8C=E2=85=A3.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...10\346\200\273\345\222\214\342\205\243.md" | 30 ++++++++++++++----- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git "a/problems/0377.\347\273\204\345\220\210\346\200\273\345\222\214\342\205\243.md" "b/problems/0377.\347\273\204\345\220\210\346\200\273\345\222\214\342\205\243.md" index ee65972371..bb847489bc 100644 --- "a/problems/0377.\347\273\204\345\220\210\346\200\273\345\222\214\342\205\243.md" +++ "b/problems/0377.\347\273\204\345\220\210\346\200\273\345\222\214\342\205\243.md" @@ -175,22 +175,36 @@ class Solution { ``` Python: - +卡哥版 ```python class Solution: - def combinationSum4(self, nums, target): + def combinationSum4(self, nums: List[int], target: int) -> int: dp = [0] * (target + 1) dp[0] = 1 + for i in range(1, target + 1): # 遍历背包 + for j in range(len(nums)): # 遍历物品 + if i - nums[j] >= 0: + dp[i] += dp[i - nums[j]] + return dp[target] - for i in range(1, target+1): - for j in nums: - if i >= j: - dp[i] += dp[i - j] - - return dp[-1] ``` +优化版 + +```python +class Solution: + def combinationSum4(self, nums: List[int], target: int) -> int: + dp = [0] * (target + 1) # 创建动态规划数组,用于存储组合总数 + dp[0] = 1 # 初始化背包容量为0时的组合总数为1 + + for i in range(1, target + 1): # 遍历背包容量 + for j in nums: # 遍历物品列表 + if i >= j: # 当背包容量大于等于当前物品重量时 + dp[i] += dp[i - j] # 更新组合总数 + return dp[-1] # 返回背包容量为target时的组合总数 + +``` Go: ```go func combinationSum4(nums []int, target int) int { From 93952c67e170d338fbc4b017cf10563bf4887c92 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Sun, 4 Jun 2023 10:13:29 -0500 Subject: [PATCH 1939/3019] =?UTF-8?q?Update=200377.=E7=BB=84=E5=90=88?= =?UTF-8?q?=E6=80=BB=E5=92=8C=E2=85=A3.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\273\204\345\220\210\346\200\273\345\222\214\342\205\243.md" | 2 ++ 1 file changed, 2 insertions(+) diff --git "a/problems/0377.\347\273\204\345\220\210\346\200\273\345\222\214\342\205\243.md" "b/problems/0377.\347\273\204\345\220\210\346\200\273\345\222\214\342\205\243.md" index bb847489bc..b6b15386cc 100644 --- "a/problems/0377.\347\273\204\345\220\210\346\200\273\345\222\214\342\205\243.md" +++ "b/problems/0377.\347\273\204\345\220\210\346\200\273\345\222\214\342\205\243.md" @@ -175,6 +175,8 @@ class Solution { ``` Python: + + 卡哥版 ```python class Solution: From 245556b1c8e27f14854273383af529379007a360 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Sun, 4 Jun 2023 23:27:54 -0500 Subject: [PATCH 1940/3019] =?UTF-8?q?Update=200322.=E9=9B=B6=E9=92=B1?= =?UTF-8?q?=E5=85=91=E6=8D=A2.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...66\351\222\261\345\205\221\346\215\242.md" | 80 ++++++++++++++----- 1 file changed, 59 insertions(+), 21 deletions(-) diff --git "a/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" "b/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" index 0e3947dad3..903777cad4 100644 --- "a/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" +++ "b/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" @@ -216,38 +216,76 @@ class Solution { ``` Python: +先遍历物品 后遍历背包 +```python +class Solution: + def coinChange(self, coins: List[int], amount: int) -> int: + dp = [float('inf')] * (amount + 1) # 创建动态规划数组,初始值为正无穷大 + dp[0] = 0 # 初始化背包容量为0时的最小硬币数量为0 + + for coin in coins: # 遍历硬币列表,相当于遍历物品 + for i in range(coin, amount + 1): # 遍历背包容量 + if dp[i - coin] != float('inf'): # 如果dp[i - coin]不是初始值,则进行状态转移 + dp[i] = min(dp[i - coin] + 1, dp[i]) # 更新最小硬币数量 + + if dp[amount] == float('inf'): # 如果最终背包容量的最小硬币数量仍为正无穷大,表示无解 + return -1 + return dp[amount] # 返回背包容量为amount时的最小硬币数量 + +``` + +先遍历背包 后遍历物品 +```python +class Solution: + def coinChange(self, coins: List[int], amount: int) -> int: + dp = [float('inf')] * (amount + 1) # 创建动态规划数组,初始值为正无穷大 + dp[0] = 0 # 初始化背包容量为0时的最小硬币数量为0 + + for i in range(1, amount + 1): # 遍历背包容量 + for j in range(len(coins)): # 遍历硬币列表,相当于遍历物品 + if i - coins[j] >= 0 and dp[i - coins[j]] != float('inf'): # 如果dp[i - coins[j]]不是初始值,则进行状态转移 + dp[i] = min(dp[i - coins[j]] + 1, dp[i]) # 更新最小硬币数量 + + if dp[amount] == float('inf'): # 如果最终背包容量的最小硬币数量仍为正无穷大,表示无解 + return -1 + return dp[amount] # 返回背包容量为amount时的最小硬币数量 +``` +先遍历物品 后遍历背包(优化版) ```python class Solution: def coinChange(self, coins: List[int], amount: int) -> int: - '''版本一''' - # 初始化 - dp = [float("inf")]*(amount + 1) + dp = [float('inf')] * (amount + 1) dp[0] = 0 - # 遍历物品 + for coin in coins: - # 遍历背包 - for j in range(coin, amount + 1): - dp[j] = min(dp[j], dp[j - coin] + 1) - return dp[amount] if dp[amount] != float("inf") else -1 - - def coinChange1(self, coins: List[int], amount: int) -> int: - '''版本二''' - # 初始化 - dp = [float("inf")]*(amount + 1) - dp[0] = 0 - # 遍历物品 - for j in range(1, amount + 1): - # 遍历背包 - for coin in coins: - if j >= coin: - dp[j] = min(dp[j], dp[j - coin] + 1) - return dp[amount] if dp[amount] != float("inf") else -1 + for i in range(coin, amount + 1): + # 更新凑成金额 i 所需的最少硬币数量 + dp[i] = min(dp[i], dp[i - coin] + 1) + + return dp[amount] if dp[amount] != float('inf') else -1 + + ``` +先遍历背包 后遍历物品(优化版) +```python +class Solution: + def coinChange(self, coins: List[int], amount: int) -> int: + dp = [float('inf')] * (amount + 1) + dp[0] = 0 + for i in range(1, amount + 1): # 遍历背包容量 + for coin in coins: # 遍历物品 + if i - coin >= 0: + # 更新凑成金额 i 所需的最少硬币数量 + dp[i] = min(dp[i], dp[i - coin] + 1) + return dp[amount] if dp[amount] != float('inf') else -1 + +``` + Go: ```go // 版本一, 先遍历物品,再遍历背包 From beb0a51841fcf308e3044046b93009bf9ea38c82 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Sun, 4 Jun 2023 23:28:14 -0500 Subject: [PATCH 1941/3019] =?UTF-8?q?Update=200322.=E9=9B=B6=E9=92=B1?= =?UTF-8?q?=E5=85=91=E6=8D=A2.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" | 2 ++ 1 file changed, 2 insertions(+) diff --git "a/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" "b/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" index 903777cad4..76ccb234f7 100644 --- "a/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" +++ "b/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" @@ -216,6 +216,8 @@ class Solution { ``` Python: + + 先遍历物品 后遍历背包 ```python class Solution: From 0964e16991e4845f8e6dff468d7d0f0ad8a0d0c4 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Sun, 4 Jun 2023 23:32:42 -0500 Subject: [PATCH 1942/3019] =?UTF-8?q?Update=200322.=E9=9B=B6=E9=92=B1?= =?UTF-8?q?=E5=85=91=E6=8D=A2.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" "b/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" index 76ccb234f7..67b1a6d9cd 100644 --- "a/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" +++ "b/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" @@ -261,7 +261,7 @@ class Solution: dp[0] = 0 for coin in coins: - for i in range(coin, amount + 1): + for i in range(coin, amount + 1): # 进行优化,从能装得下的背包开始计算,则不需要进行比较 # 更新凑成金额 i 所需的最少硬币数量 dp[i] = min(dp[i], dp[i - coin] + 1) From 87e7b9def8de5dc5bb786c9744827e81108859f1 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Sun, 4 Jun 2023 23:58:00 -0500 Subject: [PATCH 1943/3019] =?UTF-8?q?Update=200279.=E5=AE=8C=E5=85=A8?= =?UTF-8?q?=E5=B9=B3=E6=96=B9=E6=95=B0.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...50\345\271\263\346\226\271\346\225\260.md" | 53 +++++++++++-------- 1 file changed, 31 insertions(+), 22 deletions(-) diff --git "a/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" "b/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" index f5b23d2636..b26f981ccf 100644 --- "a/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" +++ "b/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" @@ -217,36 +217,45 @@ class Solution { Python: +先遍历物品, 再遍历背包 ```python class Solution: def numSquares(self, n: int) -> int: - '''版本一,先遍历背包, 再遍历物品''' - # 初始化 - nums = [i**2 for i in range(1, n + 1) if i**2 <= n] - dp = [10**4]*(n + 1) + dp = [float('inf')] * (n + 1) dp[0] = 0 - # 遍历背包 - for j in range(1, n + 1): - # 遍历物品 - for num in nums: - if j >= num: - dp[j] = min(dp[j], dp[j - num] + 1) + + for i in range(1, n + 1): # 遍历背包 + for j in range(1, int(i ** 0.5) + 1): # 遍历物品 + # 更新凑成数字 i 所需的最少完全平方数数量 + dp[i] = min(dp[i], dp[i - j * j] + 1) + return dp[n] - - def numSquares1(self, n: int) -> int: - '''版本二, 先遍历物品, 再遍历背包''' - # 初始化 - nums = [i**2 for i in range(1, n + 1) if i**2 <= n] - dp = [10**4]*(n + 1) + +``` +其他版本 +```python +class Solution: + def numSquares(self, n: int) -> int: + # 创建动态规划数组,初始值为最大值 + dp = [float('inf')] * (n + 1) + # 初始化已知情况 dp[0] = 0 - # 遍历物品 - for num in nums: - # 遍历背包 - for j in range(num, n + 1): - dp[j] = min(dp[j], dp[j - num] + 1) + + # 遍历背包容量 + for i in range(1, n + 1): + # 遍历完全平方数作为物品 + j = 1 + while j * j <= i: + # 更新最少完全平方数的数量 + dp[i] = min(dp[i], dp[i - j * j] + 1) + j += 1 + + # 返回结果 return dp[n] -``` + + +``` Go: ```go // 版本一,先遍历物品, 再遍历背包 From 45037cec331a3c924a54a24a279e5d0b6d342361 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Mon, 5 Jun 2023 00:05:11 -0500 Subject: [PATCH 1944/3019] =?UTF-8?q?Update=200279.=E5=AE=8C=E5=85=A8?= =?UTF-8?q?=E5=B9=B3=E6=96=B9=E6=95=B0.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...5\250\345\271\263\346\226\271\346\225\260.md" | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git "a/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" "b/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" index b26f981ccf..80b69f0c92 100644 --- "a/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" +++ "b/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" @@ -231,6 +231,22 @@ class Solution: return dp[n] +``` +先遍历背包, 再遍历物品 +```python +class Solution: + def numSquares(self, n: int) -> int: + dp = [float('inf')] * (n + 1) + dp[0] = 0 + + for i in range(1, int(n ** 0.5) + 1): # 遍历物品 + for j in range(i * i, n + 1): # 遍历背包 + # 更新凑成数字 j 所需的最少完全平方数数量 + dp[j] = min(dp[j - i * i] + 1, dp[j]) + + return dp[n] + + ``` 其他版本 ```python From d8c51b2d362de5a72ec86a7df3f31e486aa8febf Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Mon, 5 Jun 2023 03:09:10 -0500 Subject: [PATCH 1945/3019] =?UTF-8?q?Update=200139.=E5=8D=95=E8=AF=8D?= =?UTF-8?q?=E6=8B=86=E5=88=86.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...25\350\257\215\346\213\206\345\210\206.md" | 56 +++++++++++++++---- 1 file changed, 44 insertions(+), 12 deletions(-) diff --git "a/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" "b/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" index 230942ef02..0f24c71ebe 100644 --- "a/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" +++ "b/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" @@ -337,10 +337,53 @@ class Solution { Python: +回溯 +```python +class Solution: + def backtracking(self, s: str, wordSet: set[str], startIndex: int) -> bool: + # 边界情况:已经遍历到字符串末尾,返回True + if startIndex >= len(s): + return True + + # 遍历所有可能的拆分位置 + for i in range(startIndex, len(s)): + word = s[startIndex:i + 1] # 截取子串 + if word in wordSet and self.backtracking(s, wordSet, i + 1): + # 如果截取的子串在字典中,并且后续部分也可以被拆分成单词,返回True + return True + + # 无法进行有效拆分,返回False + return False + + def wordBreak(self, s: str, wordDict: List[str]) -> bool: + wordSet = set(wordDict) # 转换为哈希集合,提高查找效率 + return self.backtracking(s, wordSet, 0) + +``` +DP(版本一) +```python +class Solution: + def wordBreak(self, s: str, wordDict: List[str]) -> bool: + wordSet = set(wordDict) + n = len(s) + dp = [False] * (n + 1) # dp[i] 表示字符串的前 i 个字符是否可以被拆分成单词 + dp[0] = True # 初始状态,空字符串可以被拆分成单词 + + for i in range(1, n + 1): + for j in range(i): + if dp[j] and s[j:i] in wordSet: + dp[i] = True # 如果 s[0:j] 可以被拆分成单词,并且 s[j:i] 在单词集合中存在,则 s[0:i] 可以被拆分成单词 + break + + return dp[n] + + +``` +DP(版本二) + ```python class Solution: def wordBreak(self, s: str, wordDict: List[str]) -> bool: - '''排列''' dp = [False]*(len(s) + 1) dp[0] = True # 遍历背包 @@ -351,17 +394,6 @@ class Solution: dp[j] = dp[j] or (dp[j - len(word)] and word == s[j - len(word):j]) return dp[len(s)] ``` -```python -class Solution: # 和视频中写法一致(和最上面C++写法一致) - def wordBreak(self, s: str, wordDict: List[str]) -> bool: - dp = [False]*(len(s)+1) - dp[0]=True - for j in range(1,len(s)+1): - for i in range(j): - word = s[i:j] - if word in wordDict and dp[i]: dp[j]=True - return dp[-1] -``` From de7879f26e10077522203378528fc02854d209e0 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Mon, 5 Jun 2023 03:12:19 -0500 Subject: [PATCH 1946/3019] =?UTF-8?q?Update=200139.=E5=8D=95=E8=AF=8D?= =?UTF-8?q?=E6=8B=86=E5=88=86.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" "b/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" index 0f24c71ebe..742fe06cb4 100644 --- "a/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" +++ "b/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" @@ -369,8 +369,8 @@ class Solution: dp = [False] * (n + 1) # dp[i] 表示字符串的前 i 个字符是否可以被拆分成单词 dp[0] = True # 初始状态,空字符串可以被拆分成单词 - for i in range(1, n + 1): - for j in range(i): + for i in range(1, n + 1): # 遍历背包 + for j in range(i): # 遍历单词 if dp[j] and s[j:i] in wordSet: dp[i] = True # 如果 s[0:j] 可以被拆分成单词,并且 s[j:i] 在单词集合中存在,则 s[0:i] 可以被拆分成单词 break From bdedd2df0f256b3b5d2c489fb558e92563822ce6 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Mon, 5 Jun 2023 07:46:22 -0500 Subject: [PATCH 1947/3019] =?UTF-8?q?Update=20=E8=83=8C=E5=8C=85=E9=97=AE?= =?UTF-8?q?=E9=A2=98=E7=90=86=E8=AE=BA=E5=9F=BA=E7=A1=80=E5=A4=9A=E9=87=8D?= =?UTF-8?q?=E8=83=8C=E5=8C=85.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...32\351\207\215\350\203\214\345\214\205.md" | 124 ++++++++++++++---- 1 file changed, 98 insertions(+), 26 deletions(-) diff --git "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\244\232\351\207\215\350\203\214\345\214\205.md" "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\244\232\351\207\215\350\203\214\345\214\205.md" index af10dab761..1a856bf5fa 100644 --- "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\244\232\351\207\215\350\203\214\345\214\205.md" +++ "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\244\232\351\207\215\350\203\214\345\214\205.md" @@ -194,55 +194,127 @@ public void testMultiPack2(){ Python: +改变物品数量为01背包格式(无参版) ```python -def test_multi_pack1(): - '''版本一:改变物品数量为01背包格式''' +def test_multi_pack(): weight = [1, 3, 4] value = [15, 20, 30] nums = [2, 3, 2] - bag_weight = 10 + bagWeight = 10 + + # 将数量大于1的物品展开 for i in range(len(nums)): - # 将物品展开数量为1 while nums[i] > 1: weight.append(weight[i]) value.append(value[i]) nums[i] -= 1 - - dp = [0]*(bag_weight + 1) - # 遍历物品 - for i in range(len(weight)): - # 遍历背包 - for j in range(bag_weight, weight[i] - 1, -1): + + dp = [0] * (bagWeight + 1) + for i in range(len(weight)): # 遍历物品 + for j in range(bagWeight, weight[i] - 1, -1): # 遍历背包容量 dp[j] = max(dp[j], dp[j - weight[i]] + value[i]) - - print(" ".join(map(str, dp))) + for j in range(bagWeight + 1): + print(dp[j], end=" ") + print() + + print(dp[bagWeight]) -def test_multi_pack2(): - '''版本:改变遍历个数''' + +test_multi_pack() + +``` + + +改变遍历个数(无参版) +```python +def test_multi_pack(): weight = [1, 3, 4] value = [15, 20, 30] nums = [2, 3, 2] - bag_weight = 10 + bagWeight = 10 + dp = [0] * (bagWeight + 1) + + for i in range(len(weight)): # 遍历物品 + for j in range(bagWeight, weight[i] - 1, -1): # 遍历背包容量 + # 以上为01背包,然后加一个遍历个数 + for k in range(1, nums[i] + 1): # 遍历个数 + if j - k * weight[i] >= 0: + dp[j] = max(dp[j], dp[j - k * weight[i]] + k * value[i]) + + # 打印一下dp数组 + for j in range(bagWeight + 1): + print(dp[j], end=" ") + print() + + print(dp[bagWeight]) + + +test_multi_pack() + +``` + + +改变物品数量为01背包格式(有参版) +```python +def test_multi_pack(weight, value, nums, bagWeight): + # 将数量大于1的物品展开 + for i in range(len(nums)): + while nums[i] > 1: + weight.append(weight[i]) + value.append(value[i]) + nums[i] -= 1 + + dp = [0] * (bagWeight + 1) + for i in range(len(weight)): # 遍历物品 + for j in range(bagWeight, weight[i] - 1, -1): # 遍历背包容量 + dp[j] = max(dp[j], dp[j - weight[i]] + value[i]) + for j in range(bagWeight + 1): + print(dp[j], end=" ") + print() + + print(dp[bagWeight]) - dp = [0]*(bag_weight + 1) - for i in range(len(weight)): - for j in range(bag_weight, weight[i] - 1, -1): - # 以上是01背包,加上遍历个数 - for k in range(1, nums[i] + 1): - if j - k*weight[i] >= 0: - dp[j] = max(dp[j], dp[j - k*weight[i]] + k*value[i]) - print(" ".join(map(str, dp))) -if __name__ == '__main__': - test_multi_pack1() - test_multi_pack2() +if __name__ == "__main__": + weight = [1, 3, 4] + value = [15, 20, 30] + nums = [2, 3, 2] + bagWeight = 10 + test_multi_pack(weight, value, nums, bagWeight) ``` +改变遍历个数(有参版) +```python +def test_multi_pack(weight, value, nums, bagWeight): + dp = [0] * (bagWeight + 1) + + for i in range(len(weight)): # 遍历物品 + for j in range(bagWeight, weight[i] - 1, -1): # 遍历背包容量 + # 以上为01背包,然后加一个遍历个数 + for k in range(1, nums[i] + 1): # 遍历个数 + if j - k * weight[i] >= 0: + dp[j] = max(dp[j], dp[j - k * weight[i]] + k * value[i]) + # 使用 join 函数打印 dp 数组 + print(' '.join(str(dp[j]) for j in range(bagWeight + 1))) + print(dp[bagWeight]) + + + + + +if __name__ == "__main__": + weight = [1, 3, 4] + value = [15, 20, 30] + nums = [2, 3, 2] + bagWeight = 10 + test_multi_pack(weight, value, nums, bagWeight) + +``` Go: ```go From c33556c440f24942f94a55a0a2f48a1abb300290 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Mon, 5 Jun 2023 07:54:00 -0500 Subject: [PATCH 1948/3019] =?UTF-8?q?Update=200198.=E6=89=93=E5=AE=B6?= =?UTF-8?q?=E5=8A=AB=E8=88=8D.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...23\345\256\266\345\212\253\350\210\215.md" | 62 ++++++++++++++----- 1 file changed, 48 insertions(+), 14 deletions(-) diff --git "a/problems/0198.\346\211\223\345\256\266\345\212\253\350\210\215.md" "b/problems/0198.\346\211\223\345\256\266\345\212\253\350\210\215.md" index 6e682ec39e..a2fbe8ce62 100644 --- "a/problems/0198.\346\211\223\345\256\266\345\212\253\350\210\215.md" +++ "b/problems/0198.\346\211\223\345\256\266\345\212\253\350\210\215.md" @@ -166,30 +166,64 @@ class Solution { ``` Python: +1维DP ```python class Solution: def rob(self, nums: List[int]) -> int: - if len(nums) == 0: + if len(nums) == 0: # 如果没有房屋,返回0 return 0 - if len(nums) == 1: + if len(nums) == 1: # 如果只有一个房屋,返回其金额 return nums[0] + + # 创建一个动态规划数组,用于存储最大金额 dp = [0] * len(nums) - dp[0] = nums[0] - dp[1] = max(nums[0], nums[1]) + dp[0] = nums[0] # 将dp的第一个元素设置为第一个房屋的金额 + dp[1] = max(nums[0], nums[1]) # 将dp的第二个元素设置为第一二个房屋中的金额较大者 + + # 遍历剩余的房屋 for i in range(2, len(nums)): - dp[i] = max(dp[i-2]+nums[i], dp[i-1]) - return dp[-1] + # 对于每个房屋,选择抢劫当前房屋和抢劫前一个房屋的最大金额 + dp[i] = max(dp[i - 2] + nums[i], dp[i - 1]) + + return dp[-1] # 返回最后一个房屋中可抢劫的最大金额 +``` +2维DP +```python +class Solution: + def rob(self, nums: List[int]) -> int: + if not nums: # 如果没有房屋,返回0 + return 0 + + n = len(nums) + dp = [[0, 0] for _ in range(n)] # 创建二维动态规划数组,dp[i][0]表示不抢劫第i个房屋的最大金额,dp[i][1]表示抢劫第i个房屋的最大金额 + + dp[0][1] = nums[0] # 抢劫第一个房屋的最大金额为第一个房屋的金额 + + for i in range(1, n): + dp[i][0] = max(dp[i-1][0], dp[i-1][1]) # 不抢劫第i个房屋,最大金额为前一个房屋抢劫和不抢劫的最大值 + dp[i][1] = dp[i-1][0] + nums[i] # 抢劫第i个房屋,最大金额为前一个房屋不抢劫的最大金额加上当前房屋的金额 + + return max(dp[n-1][0], dp[n-1][1]) # 返回最后一个房屋中可抢劫的最大金额 + ``` +优化版 ```python -class Solution: # 二维dp数组写法 +class Solution: def rob(self, nums: List[int]) -> int: - dp = [[0,0] for _ in range(len(nums))] - dp[0][1] = nums[0] - for i in range(1,len(nums)): - dp[i][0] = max(dp[i-1][1],dp[i-1][0]) - dp[i][1] = dp[i-1][0]+nums[i] - print(dp) - return max(dp[-1]) + if not nums: # 如果没有房屋,返回0 + return 0 + + prev_max = 0 # 上一个房屋的最大金额 + curr_max = 0 # 当前房屋的最大金额 + + for num in nums: + temp = curr_max # 临时变量保存当前房屋的最大金额 + curr_max = max(prev_max + num, curr_max) # 更新当前房屋的最大金额 + prev_max = temp # 更新上一个房屋的最大金额 + + return curr_max # 返回最后一个房屋中可抢劫的最大金额 + + ``` Go: ```Go From bc1324292575f7c67c7ed207b0fe5714244a5984 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Mon, 5 Jun 2023 07:54:20 -0500 Subject: [PATCH 1949/3019] =?UTF-8?q?Update=200198.=E6=89=93=E5=AE=B6?= =?UTF-8?q?=E5=8A=AB=E8=88=8D.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0198.\346\211\223\345\256\266\345\212\253\350\210\215.md" | 1 + 1 file changed, 1 insertion(+) diff --git "a/problems/0198.\346\211\223\345\256\266\345\212\253\350\210\215.md" "b/problems/0198.\346\211\223\345\256\266\345\212\253\350\210\215.md" index a2fbe8ce62..084aa301a4 100644 --- "a/problems/0198.\346\211\223\345\256\266\345\212\253\350\210\215.md" +++ "b/problems/0198.\346\211\223\345\256\266\345\212\253\350\210\215.md" @@ -166,6 +166,7 @@ class Solution { ``` Python: + 1维DP ```python class Solution: From 3b3d9c4d11328311f945a420f40a03cdb8a92512 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Mon, 5 Jun 2023 08:07:53 -0500 Subject: [PATCH 1950/3019] =?UTF-8?q?Update=200213.=E6=89=93=E5=AE=B6?= =?UTF-8?q?=E5=8A=AB=E8=88=8DII.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\345\256\266\345\212\253\350\210\215II.md" | 103 +++++++++++++----- 1 file changed, 78 insertions(+), 25 deletions(-) diff --git "a/problems/0213.\346\211\223\345\256\266\345\212\253\350\210\215II.md" "b/problems/0213.\346\211\223\345\256\266\345\212\253\350\210\215II.md" index 6395f3a884..3f532a410b 100644 --- "a/problems/0213.\346\211\223\345\256\266\345\212\253\350\210\215II.md" +++ "b/problems/0213.\346\211\223\345\256\266\345\212\253\350\210\215II.md" @@ -130,40 +130,93 @@ class Solution { ``` Python: + ```Python class Solution: def rob(self, nums: List[int]) -> int: - #在198入门级的打家劫舍问题上分两种情况考虑 - #一是不偷第一间房,二是不偷最后一间房 - if len(nums)==1:#题目中提示nums.length>=1,所以不需要考虑len(nums)==0的情况 + if len(nums) == 0: + return 0 + if len(nums) == 1: return nums[0] - val1=self.roblist(nums[1:])#不偷第一间房 - val2=self.roblist(nums[:-1])#不偷最后一间房 - return max(val1,val2) - - def roblist(self,nums): - l=len(nums) - dp=[0]*l - dp[0]=nums[0] - for i in range(1,l): - if i==1: - dp[i]=max(dp[i-1],nums[i]) - else: - dp[i]=max(dp[i-1],dp[i-2]+nums[i]) - return dp[-1] + + result1 = self.robRange(nums, 0, len(nums) - 2) # 情况二 + result2 = self.robRange(nums, 1, len(nums) - 1) # 情况三 + return max(result1, result2) + # 198.打家劫舍的逻辑 + def robRange(self, nums: List[int], start: int, end: int) -> int: + if end == start: + return nums[start] + + prev_max = nums[start] + curr_max = max(nums[start], nums[start + 1]) + + for i in range(start + 2, end + 1): + temp = curr_max + curr_max = max(prev_max + nums[i], curr_max) + prev_max = temp + + return curr_max + ``` +2维DP ```python -class Solution: # 二维dp数组写法 +class Solution: def rob(self, nums: List[int]) -> int: - if len(nums)<3: return max(nums) - return max(self.default(nums[:-1]),self.default(nums[1:])) - def default(self,nums): - dp = [[0,0] for _ in range(len(nums))] + if len(nums) < 3: + return max(nums) + + # 情况二:不抢劫第一个房屋 + result1 = self.robRange(nums[:-1]) + + # 情况三:不抢劫最后一个房屋 + result2 = self.robRange(nums[1:]) + + return max(result1, result2) + + def robRange(self, nums): + dp = [[0, 0] for _ in range(len(nums))] dp[0][1] = nums[0] - for i in range(1,len(nums)): - dp[i][0] = max(dp[i-1]) - dp[i][1] = dp[i-1][0] + nums[i] + + for i in range(1, len(nums)): + dp[i][0] = max(dp[i - 1]) + dp[i][1] = dp[i - 1][0] + nums[i] + return max(dp[-1]) + + + +``` + +优化版 +```python +class Solution: + def rob(self, nums: List[int]) -> int: + if not nums: # 如果没有房屋,返回0 + return 0 + + if len(nums) == 1: # 如果只有一个房屋,返回该房屋的金额 + return nums[0] + + # 情况二:不抢劫第一个房屋 + prev_max = 0 # 上一个房屋的最大金额 + curr_max = 0 # 当前房屋的最大金额 + for num in nums[1:]: + temp = curr_max # 临时变量保存当前房屋的最大金额 + curr_max = max(prev_max + num, curr_max) # 更新当前房屋的最大金额 + prev_max = temp # 更新上一个房屋的最大金额 + result1 = curr_max + + # 情况三:不抢劫最后一个房屋 + prev_max = 0 # 上一个房屋的最大金额 + curr_max = 0 # 当前房屋的最大金额 + for num in nums[:-1]: + temp = curr_max # 临时变量保存当前房屋的最大金额 + curr_max = max(prev_max + num, curr_max) # 更新当前房屋的最大金额 + prev_max = temp # 更新上一个房屋的最大金额 + result2 = curr_max + + return max(result1, result2) + ``` Go: From 4eadc742c74eb2c1b059cbac439110c13fe23b3d Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Tue, 6 Jun 2023 23:24:33 +0800 Subject: [PATCH 1951/3019] Update --- README.md | 2 +- ...01\350\247\204\345\210\222\357\274\211.md" | 11 ++- ...04\345\255\220\345\272\217\345\210\227.md" | 5 +- ...07\345\255\220\345\272\217\345\210\227.md" | 5 ++ ...55\345\255\220\345\272\217\345\210\227.md" | 12 ++- ...22\345\242\236\345\272\217\345\210\227.md" | 4 + ...27\344\275\231\350\277\236\346\216\245.md" | 70 ++++++++++------- ...\344\275\231\350\277\236\346\216\245II.md" | 25 +++++- ...15\345\255\220\346\225\260\347\273\204.md" | 5 ++ ...70\344\272\244\347\232\204\347\272\277.md" | 5 ++ ...61\345\255\220\345\272\217\345\210\227.md" | 23 +++--- ...30\345\234\250\350\267\257\345\276\204.md" | 78 ++++++++++--------- ...06\350\256\272\345\237\272\347\241\200.md" | 2 +- 13 files changed, 162 insertions(+), 85 deletions(-) diff --git a/README.md b/README.md index a31629607f..0172cb671b 100644 --- a/README.md +++ b/README.md @@ -492,7 +492,7 @@ 大家好,我是程序员Carl,哈工大师兄,《代码随想录》作者,先后在腾讯和百度从事后端技术研发,CSDN博客专家。对算法和C++后端技术有一定的见解,利用工作之余重新刷leetcode。 -加入「代码随想录」刷题小分队(微信群),可以扫下方二维码加我微信。 +加入「代码随想录」刷题小分队(微信群),可以扫下方二维码,加代码随想录客服微信。 如果是已工作,备注:姓名-城市-岗位-组队刷题。如果学生,备注:姓名-学校-年级-组队刷题。**备注没有自我介绍不通过哦** diff --git "a/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" "b/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" index c7d1b2fd7b..3117b1bf27 100644 --- "a/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" +++ "b/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" @@ -11,9 +11,14 @@ 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 示例: -输入: [-2,1,-3,4,-1,2,1,-5,4] -输出: 6 -解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。 +* 输入: [-2,1,-3,4,-1,2,1,-5,4] +* 输出: 6 +* 解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。 + +## 算法公开课 + +**《代码随想录》算法视频公开课:[看起来复杂,其实是简单动态规划 | LeetCode:53.最大子序和](https://www.bilibili.com/video/BV19V4y1F7b5),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 + ## 思路 diff --git "a/problems/0115.\344\270\215\345\220\214\347\232\204\345\255\220\345\272\217\345\210\227.md" "b/problems/0115.\344\270\215\345\220\214\347\232\204\345\255\220\345\272\217\345\210\227.md" index 6127f19045..8c82880d58 100644 --- "a/problems/0115.\344\270\215\345\220\214\347\232\204\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0115.\344\270\215\345\220\214\347\232\204\345\255\220\345\272\217\345\210\227.md" @@ -18,8 +18,9 @@ 提示: -0 <= s.length, t.length <= 1000 -s 和 t 由英文字母组成 +* 0 <= s.length, t.length <= 1000 +* s 和 t 由英文字母组成 + ## 思路 diff --git "a/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" "b/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" index e8cb0b5f18..e1f2bef814 100644 --- "a/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" @@ -31,6 +31,11 @@ * 1 <= nums.length <= 2500 * -10^4 <= nums[i] <= 104 +## 算法公开课 + +**《代码随想录》算法视频公开课:[动态规划之子序列问题,元素不连续!| LeetCode:300.最长递增子序列](https://www.bilibili.com/video/BV1ng411J7xP),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 + + ## 思路 首先通过本题大家要明确什么是子序列,“子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序”。 diff --git "a/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" "b/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" index 2fa647d200..c10114c05a 100644 --- "a/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" @@ -14,12 +14,12 @@ 字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace"是"abcde"的一个子序列,而"aec"不是)。 示例 1: -输入:s = "abc", t = "ahbgdc" -输出:true +* 输入:s = "abc", t = "ahbgdc" +* 输出:true 示例 2: -输入:s = "axc", t = "ahbgdc" -输出:false +* 输入:s = "axc", t = "ahbgdc" +* 输出:false 提示: @@ -28,6 +28,10 @@ 两个字符串都只由小写字符组成。 +# 算法公开课 + +**《代码随想录》算法视频公开课:[动态规划,用相似思路解决复杂问题 | LeetCode:392.判断子序列](https://www.bilibili.com/video/BV1tv4y1B7ym/),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 + ## 思路 diff --git "a/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" "b/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" index 79a8311d78..9f6601e72e 100644 --- "a/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" +++ "b/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" @@ -27,6 +27,10 @@ * 0 <= nums.length <= 10^4 * -10^9 <= nums[i] <= 10^9 +## 算法公开课 + +**《代码随想录》算法视频公开课:[动态规划之子序列问题,重点在于连续!| LeetCode:674.最长连续递增序列](https://www.bilibili.com/video/BV1bD4y1778v),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 + ## 思路 diff --git "a/problems/0684.\345\206\227\344\275\231\350\277\236\346\216\245.md" "b/problems/0684.\345\206\227\344\275\231\350\277\236\346\216\245.md" index e3002b65ef..97f100d042 100644 --- "a/problems/0684.\345\206\227\344\275\231\350\277\236\346\216\245.md" +++ "b/problems/0684.\345\206\227\344\275\231\350\277\236\346\216\245.md" @@ -39,8 +39,8 @@ 这里整理出我的并查集模板如下: ```CPP -int n = 1005; // 节点数量3 到 1000 -int father[1005]; +int n = 1005; // n根据题目中节点数量而定,一般比节点数量大一点就好 +vector father = vector (n, 0); // C++里的一种数组结构 // 并查集初始化 void init() { @@ -50,40 +50,58 @@ void init() { } // 并查集里寻根的过程 int find(int u) { - return u == father[u] ? u : father[u] = find(father[u]); -} -// 将v->u 这条边加入并查集 -void join(int u, int v) { - u = find(u); - v = find(v); - if (u == v) return ; - father[v] = u; + return u == father[u] ? u : father[u] = find(father[u]); // 路径压缩 } + // 判断 u 和 v是否找到同一个根 -bool same(int u, int v) { +bool isSame(int u, int v) { u = find(u); v = find(v); return u == v; } + +// 将v->u 这条边加入并查集 +void join(int u, int v) { + u = find(u); // 寻找u的根 + v = find(v); // 寻找v的根 + if (u == v) return ; // 如果发现根相同,则说明在一个集合,不用两个节点相连直接返回 + father[v] = u; +} + ``` -以上模板汇总,只要修改 n 和father数组的大小就可以了。 +以上模板 只要修改 n 就可以了,本题 节点数量不会超过1000。 并查集主要有三个功能。 1. 寻找根节点,函数:find(int u),也就是判断这个节点的祖先节点是哪个 2. 将两个节点接入到同一个集合,函数:join(int u, int v),将两个节点连在同一个根节点上 -3. 判断两个节点是否在同一个集合,函数:same(int u, int v),就是判断两个节点是不是同一个根节点 +3. 判断两个节点是否在同一个集合,函数:isSame(int u, int v),就是判断两个节点是不是同一个根节点 简单介绍并查集之后,我们再来看一下这道题目。 -题目说是无向图,返回一条可以删去的边,使得结果图是一个有着N个节点的树。 +题目说是无向图,返回一条可以删去的边,使得结果图是一个有着N个节点的树(即:只有一个根节点)。 如果有多个答案,则返回二维数组中最后出现的边。 -那么我们就可以从前向后遍历每一条边,边的两个节点如果不在同一个集合,就加入集合(即:同一个根节点)。 +那么我们就可以从前向后遍历每一条边(因为优先让前面的边连上),边的两个节点如果不在同一个集合,就加入集合(即:同一个根节点)。 + +如图所示: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20230604104720.png) + +节点A 和节点 B 不在同一个集合,那么就可以将两个 节点连在一起。 -如果边的两个节点已经出现在同一个集合里,说明着边的两个节点已经连在一起了,如果再加入这条边一定就出现环了。 + +(如果题目中说:如果有多个答案,则返回二维数组中最前出现的边。 那我们就要 从后向前遍历每一条边了) + +如果边的两个节点已经出现在同一个集合里,说明着边的两个节点已经连在一起了,再加入这条边一定就出现环了。 + +如图所示: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20230604104330.png) + +已经判断 节点A 和 节点B 在在同一个集合(同一个根),如果将 节点A 和 节点B 连在一起就一定会出现环。 这个思路清晰之后,代码就很好写了。 @@ -93,7 +111,7 @@ bool same(int u, int v) { class Solution { private: int n = 1005; // 节点数量3 到 1000 - int father[1005]; + vector father = vector (n, 0); // C++里的一种数组结构 // 并查集初始化 void init() { @@ -105,24 +123,22 @@ private: int find(int u) { return u == father[u] ? u : father[u] = find(father[u]); } - // 将v->u 这条边加入并查集 - void join(int u, int v) { - u = find(u); - v = find(v); - if (u == v) return ; - father[v] = u; - } - // 判断 u 和 v是否找到同一个根,本题用不上 - bool same(int u, int v) { + // 判断 u 和 v是否找到同一个根 + bool isSame(int u, int v) { u = find(u); v = find(v); return u == v; } + // 将v->u 这条边加入并查集 + void join(int u, int v) { + if (isSame(u, v)) return ; + father[v] = u; + } public: vector findRedundantConnection(vector>& edges) { init(); for (int i = 0; i < edges.size(); i++) { - if (same(edges[i][0], edges[i][1])) return edges[i]; + if (isSame(edges[i][0], edges[i][1])) return edges[i]; else join(edges[i][0], edges[i][1]); } return {}; diff --git "a/problems/0685.\345\206\227\344\275\231\350\277\236\346\216\245II.md" "b/problems/0685.\345\206\227\344\275\231\350\277\236\346\216\245II.md" index 5a0bd5d711..149eab0148 100644 --- "a/problems/0685.\345\206\227\344\275\231\350\277\236\346\216\245II.md" +++ "b/problems/0685.\345\206\227\344\275\231\350\277\236\346\216\245II.md" @@ -44,7 +44,6 @@ 且只有一个节点入度为2,为什么不看出度呢,出度没有意义,一棵树中随便一个父节点就有多个出度。 - 第三种情况是没有入度为2的点,那么图中一定出现了有向环(**注意这里强调是有向环!**) 如图: @@ -52,7 +51,27 @@ -首先先计算节点的入度,代码如下: +首先先计算节点的入度,这里不少录友在计算入度的时候就搞蒙了,分不清 edges[i][j] 表示的都是什么。 + +例如题目示例一给的是:edges = [[1,2],[1,3],[2,3]] + +那大家很自然就想 对应二维数组的数值是: edges[1][2] ,edges[1][3],edges[2][3],但又想不出来 edges[1][2] 数值又是什么呢? 越想约懵。 + +其实 edges = [[1,2],[1,3],[2,3]],表示的是 + +edges[0][0] = 1,edges[0][1] = 2, + +edges[1][0] = 1,edges[1][1] = 3, + +edges[2][0] = 2,edges[2][1] = 3, + +二维数组大家都学过,但是往往和图结合在一起的时候,就非常容易搞混,哪里是数组,哪里是下标了。 + +搞清楚之后,我们如何统计入度呢? + +即 edges[i][1] 表示的节点都是 箭头指向的节点,即这个几点有一个入度! (如果想统计出度,那么就是 edges[i][0])。 + +所以,统计入度的代码如下: ```cpp int inDegree[N] = {0}; // 记录节点入度 @@ -94,7 +113,7 @@ if (vec.size() > 0) { vector getRemoveEdge(const vector>& edges) ``` -此时 大家应该知道了,我们要实现两个最为关键的函数: +大家应该知道了,我们要实现两个最为关键的函数: * `isTreeAfterRemoveEdge()` 判断删一个边之后是不是树了 * `getRemoveEdge` 确定图中一定有了有向环,那么要找到需要删除的那条边 diff --git "a/problems/0718.\346\234\200\351\225\277\351\207\215\345\244\215\345\255\220\346\225\260\347\273\204.md" "b/problems/0718.\346\234\200\351\225\277\351\207\215\345\244\215\345\255\220\346\225\260\347\273\204.md" index 08be67326e..d654f2ba26 100644 --- "a/problems/0718.\346\234\200\351\225\277\351\207\215\345\244\215\345\255\220\346\225\260\347\273\204.md" +++ "b/problems/0718.\346\234\200\351\225\277\351\207\215\345\244\215\345\255\220\346\225\260\347\273\204.md" @@ -23,6 +23,11 @@ * 1 <= len(A), len(B) <= 1000 * 0 <= A[i], B[i] < 100 +## 算法公开课 + +**《代码随想录》算法视频公开课:[动态规划之子序列问题,想清楚DP数组的定义 | LeetCode:718.最长重复子数组](https://www.bilibili.com/video/BV178411H7hV),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 + + ## 思路 diff --git "a/problems/1035.\344\270\215\347\233\270\344\272\244\347\232\204\347\272\277.md" "b/problems/1035.\344\270\215\347\233\270\344\272\244\347\232\204\347\272\277.md" index 7b60abdda3..7142d75c09 100644 --- "a/problems/1035.\344\270\215\347\233\270\344\272\244\347\232\204\347\272\277.md" +++ "b/problems/1035.\344\270\215\347\233\270\344\272\244\347\232\204\347\272\277.md" @@ -17,6 +17,11 @@ ![1035.不相交的线](https://code-thinking-1253855093.file.myqcloud.com/pics/2021032116363533.png) +## 算法公开课 + +**《代码随想录》算法视频公开课:[动态规划之子序列问题,换汤不换药 | LeetCode:1035.不相交的线](https://www.bilibili.com/video/BV1h84y1x7MP),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 + + ## 思路 相信不少录友看到这道题目都没啥思路,我们来逐步分析一下。 diff --git "a/problems/1143.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" "b/problems/1143.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" index 730e9ad1f7..3799e81918 100644 --- "a/problems/1143.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/1143.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" @@ -18,25 +18,30 @@ 示例 1: -输入:text1 = "abcde", text2 = "ace" -输出:3 -解释:最长公共子序列是 "ace",它的长度为 3。 +* 输入:text1 = "abcde", text2 = "ace" +* 输出:3 +* 解释:最长公共子序列是 "ace",它的长度为 3。 示例 2: -输入:text1 = "abc", text2 = "abc" -输出:3 -解释:最长公共子序列是 "abc",它的长度为 3。 +* 输入:text1 = "abc", text2 = "abc" +* 输出:3 +* 解释:最长公共子序列是 "abc",它的长度为 3。 示例 3: -输入:text1 = "abc", text2 = "def" -输出:0 -解释:两个字符串没有公共子序列,返回 0。 +* 输入:text1 = "abc", text2 = "def" +* 输出:0 +* 解释:两个字符串没有公共子序列,返回 0。 提示: * 1 <= text1.length <= 1000 * 1 <= text2.length <= 1000 输入的字符串只含有小写英文字符。 +## 算法公开课 + +**《代码随想录》算法视频公开课:[动态规划子序列问题经典题目 | LeetCode:1143.最长公共子序列](https://www.bilibili.com/video/BV1ye4y1L7CQ),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 + + ## 思路 本题和[动态规划:718. 最长重复子数组](https://programmercarl.com/0718.最长重复子数组.html)区别在于这里不要求是连续的了,但要有相对顺序,即:"ace" 是 "abcde" 的子序列,但 "aec" 不是 "abcde" 的子序列。 diff --git "a/problems/1971.\345\257\273\346\211\276\345\233\276\344\270\255\346\230\257\345\220\246\345\255\230\345\234\250\350\267\257\345\276\204.md" "b/problems/1971.\345\257\273\346\211\276\345\233\276\344\270\255\346\230\257\345\220\246\345\255\230\345\234\250\350\267\257\345\276\204.md" index 3969456784..16c7cb1e85 100644 --- "a/problems/1971.\345\257\273\346\211\276\345\233\276\344\270\255\346\230\257\345\220\246\345\255\230\345\234\250\350\267\257\345\276\204.md" +++ "b/problems/1971.\345\257\273\346\211\276\345\233\276\344\270\255\346\230\257\345\220\246\345\255\230\345\234\250\350\267\257\345\276\204.md" @@ -3,6 +3,7 @@

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+ # 1971. 寻找图中是否存在路径 [题目链接](https://leetcode.cn/problems/find-if-path-exists-in-graph/) @@ -30,7 +31,7 @@ ## 思路 -这道题目也是并查集基础题目。 +本题是并查集基础题目。 首先要知道并查集可以解决什么问题呢? @@ -39,8 +40,8 @@ 这里整理出我的并查集模板如下: ```CPP -int n = 1005; // 节点数量3 到 1000 -int father[1005]; +int n = 1005; // n根据题目中节点数量而定,一般比节点数量大一点就好 +vector father = vector (n, 0); // C++里的一种数组结构 // 并查集初始化 void init() { @@ -50,79 +51,86 @@ void init() { } // 并查集里寻根的过程 int find(int u) { - return u == father[u] ? u : father[u] = find(father[u]); -} -// 将v->u 这条边加入并查集 -void join(int u, int v) { - u = find(u); - v = find(v); - if (u == v) return ; - father[v] = u; + return u == father[u] ? u : father[u] = find(father[u]); // 路径压缩 } + // 判断 u 和 v是否找到同一个根 -bool same(int u, int v) { +bool isSame(int u, int v) { u = find(u); v = find(v); return u == v; } + +// 将v->u 这条边加入并查集 +void join(int u, int v) { + u = find(u); // 寻找u的根 + v = find(v); // 寻找v的根 + if (u == v) return ; // 如果发现根相同,则说明在一个集合,不用两个节点相连直接返回 + father[v] = u; +} ``` -以上模板汇总,只要修改 n 和father数组的大小就可以了。 +以上模板中,只要修改 n 大小就可以,本科n不会超过2 * 10^5。 并查集主要有三个功能。 1. 寻找根节点,函数:find(int u),也就是判断这个节点的祖先节点是哪个 2. 将两个节点接入到同一个集合,函数:join(int u, int v),将两个节点连在同一个根节点上 -3. 判断两个节点是否在同一个集合,函数:same(int u, int v),就是判断两个节点是不是同一个根节点 +3. 判断两个节点是否在同一个集合,函数:isSame(int u, int v),就是判断两个节点是不是同一个根节点 简单介绍并查集之后,我们再来看一下这道题目。 -为什么说这道题目是并查集基础题目,因为 可以直接套用模板。 +为什么说这道题目是并查集基础题目,题目中各个点是双向图链接,那么判断 一个顶点到另一个顶点有没有有效路径其实就是看这两个顶点是否在同一个集合里。 + +如何算是同一个集合呢,有边连在一起,就算是一个集合。 + +此时我们就可以直接套用并查集模板。 使用join(int u, int v)将每条边加入到并查集。 -最后 same(int u, int v) 判断是否是同一个根 就可以里。 +最后 isSame(int u, int v) 判断是否是同一个根 就可以了。 -代码如下: +C++代码如下: -```c++ +```CPP class Solution { - private: - int n = 200005; // 节点数量 20000 - int father[200005]; + int n = 200005; // 节点数量 20000 + vector father = vector (n, 0); // C++里的一种数组结构 // 并查集初始化 void init() { - for (int i = 0; i < n; ++i) { - father[i] = i; + for (int i = 0; i < n; ++i) { father[i] = i; } } // 并查集里寻根的过程 int find(int u) { return u == father[u] ? u : father[u] = find(father[u]); } - // 将v->u 这条边加入并查集 - void join(int u, int v) { - u = find(u); - v = find(v); - if (u == v) return ; - father[v] = u; - } - // 判断 u 和 v是否找到同一个根,本题用不上 - bool same(int u, int v) { + + // 判断 u 和 v是否找到同一个根 + bool isSame(int u, int v) { u = find(u); v = find(v); return u == v; } + // 将v->u 这条边加入并查集 + void join(int u, int v) { + u = find(u); // 寻找u的根 + v = find(v); // 寻找v的根 + if (u == v) return ; // 如果发现根相同,则说明在一个集合,不用两个节点相连直接返回 + father[v] = u; + } + public: bool validPath(int n, vector>& edges, int source, int destination) { - init(); + init(); for (int i = 0; i < edges.size(); i++) { - join(edges[i][0], edges[i][1]); + join(edges[i][0], edges[i][1]); } - return same(source, destination); + return isSame(source, destination); + } }; ``` diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" index 3afedc8249..da139e060c 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -39,7 +39,7 @@ 什么是完全二叉树? -完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2^(h-1) 个节点。 +完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层(h从1开始),则该层包含 1~ 2^(h-1) 个节点。 **大家要自己看完全二叉树的定义,很多同学对完全二叉树其实不是真正的懂了。** From 22615387a5966b8930076b08abe29ae22ce8ce8a Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Tue, 6 Jun 2023 10:25:25 -0500 Subject: [PATCH 1952/3019] =?UTF-8?q?Update=200309.=E6=9C=80=E4=BD=B3?= =?UTF-8?q?=E4=B9=B0=E5=8D=96=E8=82=A1=E7=A5=A8=E6=97=B6=E6=9C=BA=E5=90=AB?= =?UTF-8?q?=E5=86=B7=E5=86=BB=E6=9C=9F.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...53\345\206\267\345\206\273\346\234\237.md" | 44 +++++++++++++++---- 1 file changed, 36 insertions(+), 8 deletions(-) diff --git "a/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" "b/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" index a56d9b8464..67f6d564c7 100644 --- "a/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" +++ "b/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" @@ -248,23 +248,51 @@ class Solution { ``` Python: - +版本一 ```python +from typing import List + class Solution: def maxProfit(self, prices: List[int]) -> int: n = len(prices) if n == 0: return 0 - dp = [[0] * 4 for _ in range(n)] - dp[0][0] = -prices[0] #持股票 + dp = [[0] * 4 for _ in range(n)] # 创建动态规划数组,4个状态分别表示持有股票、不持有股票且处于冷冻期、不持有股票且不处于冷冻期、不持有股票且当天卖出后处于冷冻期 + dp[0][0] = -prices[0] # 初始状态:第一天持有股票的最大利润为买入股票的价格 for i in range(1, n): - dp[i][0] = max(dp[i-1][0], max(dp[i-1][3], dp[i-1][1]) - prices[i]) - dp[i][1] = max(dp[i-1][1], dp[i-1][3]) - dp[i][2] = dp[i-1][0] + prices[i] - dp[i][3] = dp[i-1][2] - return max(dp[n-1][3], dp[n-1][1], dp[n-1][2]) + dp[i][0] = max(dp[i-1][0], max(dp[i-1][3], dp[i-1][1]) - prices[i]) # 当前持有股票的最大利润等于前一天持有股票的最大利润或者前一天不持有股票且不处于冷冻期的最大利润减去当前股票的价格 + dp[i][1] = max(dp[i-1][1], dp[i-1][3]) # 当前不持有股票且处于冷冻期的最大利润等于前一天持有股票的最大利润加上当前股票的价格 + dp[i][2] = dp[i-1][0] + prices[i] # 当前不持有股票且不处于冷冻期的最大利润等于前一天不持有股票的最大利润或者前一天处于冷冻期的最大利润 + dp[i][3] = dp[i-1][2] # 当前不持有股票且当天卖出后处于冷冻期的最大利润等于前一天不持有股票且不处于冷冻期的最大利润 + return max(dp[n-1][3], dp[n-1][1], dp[n-1][2]) # 返回最后一天不持有股票的最大利润 + ``` +版本二 +```python +class Solution: + def maxProfit(self, prices: List[int]) -> int: + n = len(prices) + if n < 2: + return 0 + + # 定义三种状态的动态规划数组 + dp = [[0] * 3 for _ in range(n)] + dp[0][0] = -prices[0] # 持有股票的最大利润 + dp[0][1] = 0 # 不持有股票,且处于冷冻期的最大利润 + dp[0][2] = 0 # 不持有股票,不处于冷冻期的最大利润 + + for i in range(1, n): + # 当前持有股票的最大利润等于前一天持有股票的最大利润或者前一天不持有股票且不处于冷冻期的最大利润减去当前股票的价格 + dp[i][0] = max(dp[i-1][0], dp[i-1][2] - prices[i]) + # 当前不持有股票且处于冷冻期的最大利润等于前一天持有股票的最大利润加上当前股票的价格 + dp[i][1] = dp[i-1][0] + prices[i] + # 当前不持有股票且不处于冷冻期的最大利润等于前一天不持有股票的最大利润或者前一天处于冷冻期的最大利润 + dp[i][2] = max(dp[i-1][2], dp[i-1][1]) + + # 返回最后一天不持有股票的最大利润 + return max(dp[-1][1], dp[-1][2]) +``` Go: ```go // 最佳买卖股票时机含冷冻期 动态规划 From d3a07fa1bd7c325188a416486daa7a85e6816680 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Tue, 6 Jun 2023 15:29:07 -0500 Subject: [PATCH 1953/3019] =?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 --- ...07\345\255\220\345\272\217\345\210\227.md" | 26 ++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git "a/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" "b/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" index 01d349496b..98d7b14ffb 100644 --- "a/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" @@ -141,7 +141,7 @@ class Solution { } } ``` - +DP Python: ```python class Solution: @@ -157,7 +157,31 @@ class Solution: result = max(result, dp[i]) #取长的子序列 return result ``` +贪心 +```python +class Solution: + def lengthOfLIS(self, nums: List[int]) -> int: + if len(nums) <= 1: + return len(nums) + + tails = [nums[0]] # 存储递增子序列的尾部元素 + for num in nums[1:]: + if num > tails[-1]: + tails.append(num) # 如果当前元素大于递增子序列的最后一个元素,直接加入到子序列末尾 + else: + # 使用二分查找找到当前元素在递增子序列中的位置,并替换对应位置的元素 + left, right = 0, len(tails) - 1 + while left < right: + mid = (left + right) // 2 + if tails[mid] < num: + left = mid + 1 + else: + right = mid + tails[left] = num + + return len(tails) # 返回递增子序列的长度 +``` Go: ```go // 动态规划求解 From a7d546ca2a6c7af9df378b3928c58f373177ed54 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Tue, 6 Jun 2023 15:29:32 -0500 Subject: [PATCH 1954/3019] =?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 --- ...70\212\345\215\207\345\255\220\345\272\217\345\210\227.md" | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git "a/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" "b/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" index 98d7b14ffb..5424933180 100644 --- "a/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" @@ -141,8 +141,10 @@ class Solution { } } ``` -DP + Python: + +DP ```python class Solution: def lengthOfLIS(self, nums: List[int]) -> int: From 4fab08d0306d82aef04379ef01b9b08aae65543a Mon Sep 17 00:00:00 2001 From: Terry Liu <102352821+Lozakaka@users.noreply.github.com> Date: Tue, 6 Jun 2023 19:09:57 -0400 Subject: [PATCH 1955/3019] =?UTF-8?q?=E6=8F=90=E4=BE=9BJAVA=E7=9A=842*2?= =?UTF-8?q?=E6=95=B8=E7=B5=84=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 原本的空間優化是直接優化成一維數組,故提供一個2*2數組的版本 --- ...00\344\275\263\346\227\266\346\234\272.md" | 25 ++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git "a/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" "b/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" index 753cb10692..794185da90 100644 --- "a/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" +++ "b/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" @@ -243,8 +243,27 @@ class Solution { } } ``` +> 动态规划:版本二(使用二維數組(和卡哥思路一致),下面還有使用一維滾動數組的更優化版本) -> 动态规划:版本二 +```Java +class Solution { + public int maxProfit(int[] prices) { + int len = prices.length; + int dp[][] = new int[2][2]; + + dp[0][0] = - prices[0]; + dp[0][1] = 0; + + for (int i = 1; i < len; i++){ + dp[i % 2][0] = Math.max(dp[(i - 1) % 2][0], - prices[i]); + dp[i % 2][1] = Math.max(dp[(i - 1) % 2][1], prices[i] + dp[(i - 1) % 2][0]); + } + return dp[(len - 1) % 2][1]; + } +} +``` + +> 动态规划:版本二(使用一維數組) ``` java class Solution { @@ -271,6 +290,10 @@ class Solution { } } ``` +```Java + +``` + Python: From 9287b6be6f3dbcae30e3d5e8c636af24b41a3a7c Mon Sep 17 00:00:00 2001 From: Terry Liu <102352821+Lozakaka@users.noreply.github.com> Date: Tue, 6 Jun 2023 19:25:22 -0400 Subject: [PATCH 1956/3019] =?UTF-8?q?=E6=96=B0=E5=A2=9EJAVA=202*2=E6=95=B8?= =?UTF-8?q?=E7=B5=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit //DP using 2*2 Array (下方還有使用一維滾動數組的更優化版本) --- ...\201\350\247\204\345\210\222\357\274\211.md" | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" index 146c6a4cb1..70ab8364c8 100644 --- "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" +++ "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" @@ -154,7 +154,24 @@ class Solution } } ``` +```java +//DP using 2*2 Array (下方還有使用一維滾動數組的更優化版本) +class Solution { + public int maxProfit(int[] prices) { + int dp[][] = new int [2][2]; + //dp[i][0]: holding the stock + //dp[i][1]: not holding the stock + dp[0][0] = - prices[0]; + dp[0][1] = 0; + for(int i = 1; i < prices.length; i++){ + dp[i % 2][0] = Math.max(dp[(i - 1) % 2][0], dp[(i - 1) % 2][1] - prices[i]); + dp[i % 2][1] = Math.max(dp[(i - 1) % 2][1], dp[(i - 1) % 2][0] + prices[i]); + } + return dp[(prices.length - 1) % 2][1]; + } +} +``` ```java // 优化空间 class Solution { From bc229e302b2ab74f4345f18bae6626543d91e0fd Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Wed, 7 Jun 2023 08:58:27 +0800 Subject: [PATCH 1957/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=9B=BE=E8=AE=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 24 ++++++++++++++++++- ...75\347\232\204\350\267\257\345\276\204.md" | 4 ++-- 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 0172cb671b..65156a862f 100644 --- a/README.md +++ b/README.md @@ -387,10 +387,32 @@ 4. [单调栈:42.接雨水](./problems/0042.接雨水.md) 5. [单调栈:84.柱状图中最大的矩形](./problems/0084.柱状图中最大的矩形.md) -(持续更新中....) ## 图论 +通知:开始更新图论内容,图论部分还没有其他语言版本,欢迎录友们提交PR,成为contributor + +### 深搜广搜 + +* [图论:深度优先搜索理论基础](./problems/图论深搜理论基础.md) +* [图论:797.所有可能的路径](./problems/0797.所有可能的路径.md) +* [图论:广度优先搜索理论基础](./problems/图论广索理论基础.md) +* [图论:200.岛屿数量.深搜版](./problems/0200.岛屿数量.深搜版.md) +* [图论:200.岛屿数量.广搜版](./problems/0200.岛屿数量.广搜版.md) +* [图论:695.岛屿的最大面积](./problems/0695.岛屿的最大面积.md) +* [图论:1020.飞地的数量](./problems/1020.飞地的数量.md) +* [图论:130.被围绕的区域](./problems/0130.被围绕的区域.md) +* [图论:417.太平洋大西洋水流问题](./problems/0417.太平洋大西洋水流问题.md) +* [图论:827.最大人工岛](./problems/0827.最大人工岛.md) +* [图论:127.单词接龙](./problems/0127.单词接龙.md) +* [图论:841.钥匙和房间](./problems/0841.钥匙和房间.md) +* [图论:463.岛屿的周长](./problems/0463.岛屿的周长.md) + +### 并查集 + +(持续更新中....) + + ## 十大排序 ## 数论 diff --git "a/problems/0797.\346\211\200\346\234\211\345\217\257\350\203\275\347\232\204\350\267\257\345\276\204.md" "b/problems/0797.\346\211\200\346\234\211\345\217\257\350\203\275\347\232\204\350\267\257\345\276\204.md" index 89643e0490..2ea4ae4760 100644 --- "a/problems/0797.\346\211\200\346\234\211\345\217\257\350\203\275\347\232\204\350\267\257\345\276\204.md" +++ "b/problems/0797.\346\211\200\346\234\211\345\217\257\350\203\275\347\232\204\350\267\257\345\276\204.md" @@ -159,7 +159,7 @@ public: ## 其他语言版本 -## Java +Java ```Java // 深度优先遍历 @@ -190,7 +190,7 @@ class Solution { } ``` -## Python +Python ```python class Solution: def __init__(self): From c652187f747a2b7546f45e0f29cc985b929a8454 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Wed, 7 Jun 2023 03:59:52 -0500 Subject: [PATCH 1958/3019] =?UTF-8?q?Update=200674.=E6=9C=80=E9=95=BF?= =?UTF-8?q?=E8=BF=9E=E7=BB=AD=E9=80=92=E5=A2=9E=E5=BA=8F=E5=88=97.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...22\345\242\236\345\272\217\345\210\227.md" | 23 +++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git "a/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" "b/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" index 79a8311d78..0d9866a009 100644 --- "a/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" +++ "b/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" @@ -204,7 +204,7 @@ public static int findLengthOfLCIS(int[] nums) { Python: -> 动态规划: +DP ```python class Solution: def findLengthOfLCIS(self, nums: List[int]) -> int: @@ -219,8 +219,27 @@ class Solution: return result ``` +DP(优化版) +```python +class Solution: + def findLengthOfLCIS(self, nums: List[int]) -> int: + if not nums: + return 0 + + max_length = 1 + current_length = 1 -> 贪心法: + for i in range(1, len(nums)): + if nums[i] > nums[i - 1]: + current_length += 1 + max_length = max(max_length, current_length) + else: + current_length = 1 + + return max_length + +``` +贪心 ```python class Solution: def findLengthOfLCIS(self, nums: List[int]) -> int: From accc97cc06aa605499160cc2ba4804382647b977 Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Wed, 7 Jun 2023 18:05:32 +0800 Subject: [PATCH 1959/3019] UPdate --- README.md | 6 ------ 1 file changed, 6 deletions(-) diff --git a/README.md b/README.md index 65156a862f..dd70d8cb6b 100644 --- a/README.md +++ b/README.md @@ -403,12 +403,6 @@ * [图论:1020.飞地的数量](./problems/1020.飞地的数量.md) * [图论:130.被围绕的区域](./problems/0130.被围绕的区域.md) * [图论:417.太平洋大西洋水流问题](./problems/0417.太平洋大西洋水流问题.md) -* [图论:827.最大人工岛](./problems/0827.最大人工岛.md) -* [图论:127.单词接龙](./problems/0127.单词接龙.md) -* [图论:841.钥匙和房间](./problems/0841.钥匙和房间.md) -* [图论:463.岛屿的周长](./problems/0463.岛屿的周长.md) - -### 并查集 (持续更新中....) From 8fb169701478cce21d5bfba761289479a0e27fbd Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Wed, 7 Jun 2023 05:26:40 -0500 Subject: [PATCH 1960/3019] =?UTF-8?q?Update=200718.=E6=9C=80=E9=95=BF?= =?UTF-8?q?=E9=87=8D=E5=A4=8D=E5=AD=90=E6=95=B0=E7=BB=84.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...15\345\255\220\346\225\260\347\273\204.md" | 96 +++++++++++++++---- 1 file changed, 79 insertions(+), 17 deletions(-) diff --git "a/problems/0718.\346\234\200\351\225\277\351\207\215\345\244\215\345\255\220\346\225\260\347\273\204.md" "b/problems/0718.\346\234\200\351\225\277\351\207\215\345\244\215\345\255\220\346\225\260\347\273\204.md" index 08be67326e..78ef7ddd85 100644 --- "a/problems/0718.\346\234\200\351\225\277\351\207\215\345\244\215\345\255\220\346\225\260\347\273\204.md" +++ "b/problems/0718.\346\234\200\351\225\277\351\207\215\345\244\215\345\255\220\346\225\260\347\273\204.md" @@ -247,37 +247,99 @@ class Solution { Python: -> 动态规划: +2维DP ```python class Solution: - def findLength(self, A: List[int], B: List[int]) -> int: - dp = [[0] * (len(B)+1) for _ in range(len(A)+1)] + def findLength(self, nums1: List[int], nums2: List[int]) -> int: + # 创建一个二维数组 dp,用于存储最长公共子数组的长度 + dp = [[0] * (len(nums2) + 1) for _ in range(len(nums1) + 1)] + # 记录最长公共子数组的长度 result = 0 - for i in range(1, len(A)+1): - for j in range(1, len(B)+1): - if A[i-1] == B[j-1]: - dp[i][j] = dp[i-1][j-1] + 1 - result = max(result, dp[i][j]) + + # 遍历数组 nums1 + for i in range(1, len(nums1) + 1): + # 遍历数组 nums2 + for j in range(1, len(nums2) + 1): + # 如果 nums1[i-1] 和 nums2[j-1] 相等 + if nums1[i - 1] == nums2[j - 1]: + # 在当前位置上的最长公共子数组长度为前一个位置上的长度加一 + dp[i][j] = dp[i - 1][j - 1] + 1 + # 更新最长公共子数组的长度 + if dp[i][j] > result: + result = dp[i][j] + + # 返回最长公共子数组的长度 return result + ``` -> 动态规划:滚动数组 +1维DP ```python class Solution: - def findLength(self, A: List[int], B: List[int]) -> int: - dp = [0] * (len(B) + 1) + def findLength(self, nums1: List[int], nums2: List[int]) -> int: + # 创建一个一维数组 dp,用于存储最长公共子数组的长度 + dp = [0] * (len(nums2) + 1) + # 记录最长公共子数组的长度 result = 0 - for i in range(1, len(A)+1): - for j in range(len(B), 0, -1): - if A[i-1] == B[j-1]: - dp[j] = dp[j-1] + 1 + + # 遍历数组 nums1 + for i in range(1, len(nums1) + 1): + # 用于保存上一个位置的值 + prev = 0 + # 遍历数组 nums2 + for j in range(1, len(nums2) + 1): + # 保存当前位置的值,因为会在后面被更新 + current = dp[j] + # 如果 nums1[i-1] 和 nums2[j-1] 相等 + if nums1[i - 1] == nums2[j - 1]: + # 在当前位置上的最长公共子数组长度为上一个位置的长度加一 + dp[j] = prev + 1 + # 更新最长公共子数组的长度 + if dp[j] > result: + result = dp[j] else: - dp[j] = 0 #注意这里不相等的时候要有赋0的操作 - result = max(result, dp[j]) + # 如果不相等,将当前位置的值置为零 + dp[j] = 0 + # 更新 prev 变量为当前位置的值,供下一次迭代使用 + prev = current + + # 返回最长公共子数组的长度 return result + ``` +2维DP 扩展 +```python +class Solution: + def findLength(self, nums1: List[int], nums2: List[int]) -> int: + # 创建一个二维数组 dp,用于存储最长公共子数组的长度 + dp = [[0] * (len(nums2) + 1) for _ in range(len(nums1) + 1)] + # 记录最长公共子数组的长度 + result = 0 + + # 对第一行和第一列进行初始化 + for i in range(len(nums1)): + if nums1[i] == nums2[0]: + dp[i + 1][1] = 1 + for j in range(len(nums2)): + if nums1[0] == nums2[j]: + dp[1][j + 1] = 1 + + # 填充dp数组 + for i in range(1, len(nums1) + 1): + for j in range(1, len(nums2) + 1): + if nums1[i - 1] == nums2[j - 1]: + # 如果 nums1[i-1] 和 nums2[j-1] 相等,则当前位置的最长公共子数组长度为左上角位置的值加一 + dp[i][j] = dp[i - 1][j - 1] + 1 + if dp[i][j] > result: + # 更新最长公共子数组的长度 + result = dp[i][j] + + # 返回最长公共子数组的长度 + return result + +``` Go: ```Go func findLength(A []int, B []int) int { From 0a742d83a49e942324163fc0e7642cd1dfd7010f Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Wed, 7 Jun 2023 05:32:55 -0500 Subject: [PATCH 1961/3019] =?UTF-8?q?Update=201143.=E6=9C=80=E9=95=BF?= =?UTF-8?q?=E5=85=AC=E5=85=B1=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 --- ...61\345\255\220\345\272\217\345\210\227.md" | 46 +++++++++++++++---- 1 file changed, 37 insertions(+), 9 deletions(-) diff --git "a/problems/1143.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" "b/problems/1143.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" index 730e9ad1f7..4b71256982 100644 --- "a/problems/1143.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/1143.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" @@ -198,21 +198,49 @@ class Solution { ``` Python: - +2维DP ```python class Solution: def longestCommonSubsequence(self, text1: str, text2: str) -> int: - len1, len2 = len(text1)+1, len(text2)+1 - dp = [[0 for _ in range(len1)] for _ in range(len2)] # 先对dp数组做初始化操作 - for i in range(1, len2): - for j in range(1, len1): # 开始列出状态转移方程 - if text1[j-1] == text2[i-1]: - dp[i][j] = dp[i-1][j-1]+1 + # 创建一个二维数组 dp,用于存储最长公共子序列的长度 + dp = [[0] * (len(text2) + 1) for _ in range(len(text1) + 1)] + + # 遍历 text1 和 text2,填充 dp 数组 + for i in range(1, len(text1) + 1): + for j in range(1, len(text2) + 1): + if text1[i - 1] == text2[j - 1]: + # 如果 text1[i-1] 和 text2[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[-1][-1] + # 如果 text1[i-1] 和 text2[j-1] 不相等,则当前位置的最长公共子序列长度为上方或左方的较大值 + dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]) + + # 返回最长公共子序列的长度 + return dp[len(text1)][len(text2)] + ``` +1维DP +```python +class Solution: + def longestCommonSubsequence(self, text1: str, text2: str) -> int: + m, n = len(text1), len(text2) + dp = [0] * (n + 1) # 初始化一维DP数组 + + for i in range(1, m + 1): + prev = 0 # 保存上一个位置的最长公共子序列长度 + for j in range(1, n + 1): + curr = dp[j] # 保存当前位置的最长公共子序列长度 + if text1[i - 1] == text2[j - 1]: + # 如果当前字符相等,则最长公共子序列长度加一 + dp[j] = prev + 1 + else: + # 如果当前字符不相等,则选择保留前一个位置的最长公共子序列长度中的较大值 + dp[j] = max(dp[j], dp[j - 1]) + prev = curr # 更新上一个位置的最长公共子序列长度 + + return dp[n] # 返回最后一个位置的最长公共子序列长度作为结果 +``` Go: ```Go From 5e1c10bfccc9409399872cbd0826461fee526e15 Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Wed, 7 Jun 2023 19:45:25 +0800 Subject: [PATCH 1962/3019] =?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 --- ...25\347\232\204\345\214\272\345\237\237.md" | 2 +- ...7.\346\267\261\346\220\234\347\211\210.md" | 2 +- ...64\346\265\201\351\227\256\351\242\230.md" | 2 +- ...77\347\232\204\345\221\250\351\225\277.md" | 3 + ...00\345\244\247\351\235\242\347\247\257.md" | 6 +- ...47\344\272\272\345\267\245\345\262\233.md" | 2 +- ...31\345\222\214\346\210\277\351\227\264.md" | 2 +- ...60\347\232\204\346\225\260\351\207\217.md" | 3 +- problems/qita/kstar.md | 131 ++++++++ problems/qita/xunlianying.md | 298 ++++++++++++++++++ ...06\350\256\272\345\237\272\347\241\200.md" | 2 +- ...06\350\256\272\345\237\272\347\241\200.md" | 2 +- 12 files changed, 444 insertions(+), 11 deletions(-) create mode 100644 problems/qita/kstar.md create mode 100644 problems/qita/xunlianying.md rename "problems/\345\233\276\350\256\272\345\271\277\347\264\242\347\220\206\350\256\272\345\237\272\347\241\200.md" => "problems/\345\233\276\350\256\272\345\271\277\346\220\234\347\220\206\350\256\272\345\237\272\347\241\200.md" (97%) diff --git "a/problems/0130.\350\242\253\345\233\264\347\273\225\347\232\204\345\214\272\345\237\237.md" "b/problems/0130.\350\242\253\345\233\264\347\273\225\347\232\204\345\214\272\345\237\237.md" index 7afa71b40f..abb68e199c 100644 --- "a/problems/0130.\350\242\253\345\233\264\347\273\225\347\232\204\345\214\272\345\237\237.md" +++ "b/problems/0130.\350\242\253\345\233\264\347\273\225\347\232\204\345\214\272\345\237\237.md" @@ -18,7 +18,7 @@ ## 思路 -这道题目和1020. 飞地的数量正好反过来了,[1020. 飞地的数量](https://leetcode.cn/problems/number-of-enclaves/solution/by-carlsun-2-7lt9/)是求 地图中间的空格数,而本题是要把地图中间的'O'都改成'X'。 +这道题目和1020. 飞地的数量正好反过来了,[1020. 飞地的数量](https://programmercarl.com/1020.%E9%A3%9E%E5%9C%B0%E7%9A%84%E6%95%B0%E9%87%8F.html)是求 地图中间的空格数,而本题是要把地图中间的'O'都改成'X'。 那么两题在思路上也是差不多的。 diff --git "a/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\346\267\261\346\220\234\347\211\210.md" "b/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\346\267\261\346\220\234\347\211\210.md" index 8680d2b1a3..6d42162a57 100644 --- "a/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\346\267\261\346\220\234\347\211\210.md" +++ "b/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\346\267\261\346\220\234\347\211\210.md" @@ -41,7 +41,7 @@ ### 深度优先搜索 -以下代码使用dfs实现,如果对dfs不太了解的话,建议先看这篇题解:[797.所有可能的路径](https://leetcode.cn/problems/all-paths-from-source-to-target/solution/by-carlsun-2-66pf/), +以下代码使用dfs实现,如果对dfs不太了解的话,建议先看这篇题解:[797.所有可能的路径](https://programmercarl.com/0797.%E6%89%80%E6%9C%89%E5%8F%AF%E8%83%BD%E7%9A%84%E8%B7%AF%E5%BE%84.html), C++代码如下: diff --git "a/problems/0417.\345\244\252\345\271\263\346\264\213\345\244\247\350\245\277\346\264\213\346\260\264\346\265\201\351\227\256\351\242\230.md" "b/problems/0417.\345\244\252\345\271\263\346\264\213\345\244\247\350\245\277\346\264\213\346\260\264\346\265\201\351\227\256\351\242\230.md" index ec22936577..35f3b4d6e3 100644 --- "a/problems/0417.\345\244\252\345\271\263\346\264\213\345\244\247\350\245\277\346\264\213\346\260\264\346\265\201\351\227\256\351\242\230.md" +++ "b/problems/0417.\345\244\252\345\271\263\346\264\213\345\244\247\350\245\277\346\264\213\346\260\264\346\265\201\351\227\256\351\242\230.md" @@ -140,7 +140,7 @@ public: 按照这样的逻辑,就可以写出如下遍历代码:(详细注释) -(如果对dfs基础内容就不懂,建议看 [「代码随想录」DFS算法精讲!](https://leetcode.cn/problems/all-paths-from-source-to-target/solution/by-carlsun-2-66pf/),还可以顺便解决 797. 所有可能的路径) +(如果对dfs基础内容就不懂,建议看 [「代码随想录」DFS算法精讲!](https://programmercarl.com/图论深搜理论基础.html),还可以顺便解决 [797. 所有可能的路径](https://programmercarl.com/0797.%E6%89%80%E6%9C%89%E5%8F%AF%E8%83%BD%E7%9A%84%E8%B7%AF%E5%BE%84.html)) ```CPP class Solution { diff --git "a/problems/0463.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" "b/problems/0463.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" index 2c3f2ec756..2f399f4016 100644 --- "a/problems/0463.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" +++ "b/problems/0463.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" @@ -3,6 +3,9 @@

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+ + + # 463. 岛屿的周长 [力扣题目链接](https://leetcode.cn/problems/island-perimeter/) diff --git "a/problems/0695.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" "b/problems/0695.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" index 581f30a852..e5deb897d6 100644 --- "a/problems/0695.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" +++ "b/problems/0695.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" @@ -35,8 +35,8 @@ 本题思路上比较简单,难点其实都是 dfs 和 bfs的理论基础,关于理论基础我在这里都有详细讲解 : -* [DFS理论基础](https://leetcode.cn/problems/all-paths-from-source-to-target/solution/by-carlsun-2-66pf/) -* [BFS理论基础](https://leetcode.cn/circle/discuss/V3FulB/) +* [DFS理论基础](https://programmercarl.com/图论深搜理论基础.html) +* [BFS理论基础](https://programmercarl.com/图论广搜理论基础.html) ## DFS @@ -136,7 +136,7 @@ public: ## BFS -关于广度优先搜索,如果大家还不了解的话,看这里:[广度优先搜索精讲](https://leetcode.cn/circle/discuss/V3FulB/) +关于广度优先搜索,如果大家还不了解的话,看这里:[广度优先搜索精讲](https://programmercarl.com/图论广搜理论基础.html) 本题BFS代码如下: diff --git "a/problems/0827.\346\234\200\345\244\247\344\272\272\345\267\245\345\262\233.md" "b/problems/0827.\346\234\200\345\244\247\344\272\272\345\267\245\345\262\233.md" index 45b2ef5ab9..9112fabde2 100644 --- "a/problems/0827.\346\234\200\345\244\247\344\272\272\345\267\245\345\262\233.md" +++ "b/problems/0827.\346\234\200\345\244\247\344\272\272\345\267\245\345\262\233.md" @@ -39,7 +39,7 @@ 每改变一个0的方格,都需要重新计算一个地图的最大面积,所以 整体时间复杂度为:n^4。 -如果对深度优先搜索不了解的录友,可以看这里:[深度优先搜索精讲](https://leetcode.cn/problems/all-paths-from-source-to-target/solution/by-carlsun-2-66pf/) +如果对深度优先搜索不了解的录友,可以看这里:[深度优先搜索精讲](https://programmercarl.com/图论深搜理论基础.html) ## 优化思路 diff --git "a/problems/0841.\351\222\245\345\214\231\345\222\214\346\210\277\351\227\264.md" "b/problems/0841.\351\222\245\345\214\231\345\222\214\346\210\277\351\227\264.md" index faf2b97f5d..00156d4ec3 100644 --- "a/problems/0841.\351\222\245\345\214\231\345\222\214\346\210\277\351\227\264.md" +++ "b/problems/0841.\351\222\245\345\214\231\345\222\214\346\210\277\351\227\264.md" @@ -56,7 +56,7 @@ 所以本题是一个有向图搜索全路径的问题。 只能用深搜(DFS)或者广搜(BFS)来搜。 -关于DFS的理论,如果大家有困惑,可以先看我这篇题解: [DFS理论基础](https://programmercarl.com/%E5%9B%BE%E8%AE%BA%E6%B7%B1%E6%90%9C%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html) +关于DFS的理论,如果大家有困惑,可以先看我这篇题解: [DFS理论基础](https://programmercarl.com/图论深搜理论基础.html) **以下dfs分析 大家一定要仔细看,本题有两种dfs的解法,很多题解没有讲清楚**。 看完之后 相信你对dfs会有更深的理解。 diff --git "a/problems/1020.\351\243\236\345\234\260\347\232\204\346\225\260\351\207\217.md" "b/problems/1020.\351\243\236\345\234\260\347\232\204\346\225\260\351\207\217.md" index f97678e872..e92b2412f3 100644 --- "a/problems/1020.\351\243\236\345\234\260\347\232\204\346\225\260\351\207\217.md" +++ "b/problems/1020.\351\243\236\345\234\260\347\232\204\346\225\260\351\207\217.md" @@ -42,7 +42,8 @@ 然后我们再去遍历这个地图,遇到有陆地的地方,去采用深搜或者广搜,边统计所有陆地。 -如果对深搜或者广搜不够了解,建议先看这里:[深度优先搜索精讲](https://leetcode.cn/problems/all-paths-from-source-to-target/solution/by-carlsun-2-66pf/),[广度优先搜索精讲](https://leetcode.cn/circle/discuss/V3FulB/) +如果对深搜或者广搜不够了解,建议先看这里:[深度优先搜索精讲](https://programmercarl.com/图论深搜理论基础.html),[广度优先搜索精讲](https://programmercarl.com/图论广搜理论基础.html)。 + 采用深度优先搜索的代码如下: diff --git a/problems/qita/kstar.md b/problems/qita/kstar.md new file mode 100644 index 0000000000..86983cab18 --- /dev/null +++ b/problems/qita/kstar.md @@ -0,0 +1,131 @@ +# 代码随想录知识星球 + +前一阵知识星球刚刚发布了[星球精华-大厂八股文(第三版)](https://programmercarl.com/other/kstar_baguwen.html) + +这份八股文,就有30w字,将近400张思维导图,表格,分析图,整个PDF将近900页的篇幅。 + +这些其实都是星球录友们,每日打卡的内容,但这我也仅仅是整理了一部分,因为信息量确实巨大。 + +目前星球里已经有将近1000 个精华帖: + +
+ +同时还有[计算机2023届求职薪资PDF](https://programmercarl.com/other/2022salary.html)等一些列独家资料,都在星期置顶帖里: + +
+ +星球里的录友都可以得到我1V1的指导,**我已经详细回答了7000+个问题**: (这个回答问题数量,可以看出我有劳模的潜质 哈哈) + +
+ +有的时候,大家还是需要过来人,给指点一点,甚至是“踹一脚” 就会想清楚很多。 + +
+ +不仅我回答问题,我还会邀请星球里各个方向的录友来和大家一起交流具体技术问题,这个就是星球导师计划: (如果想提问的话,也在星球置顶1可以找到链接) + +
+ +
+ +可以看看星球导师计划里具体的问答: + +
+ +同时我还给录友们至少修改了上千份的简历,我也总结了很多大家写简历上问题。在 「写简历」这个tab上,可以找到我总结的所有问题和简历模板 + +
+ +【专业技能】【项目经验】【自我评价】都应该怎么写,面试时候 自我介绍,应该怎么说,我都给出了我的建议: + +
+ + +如果你还在犹豫要不要加入的话,**可以进来体验三天,三天内点击知识星球APP右上角,可以自助全额退款**。 绝对不会坑大家! +
+ + +一些录友当初也是进来 白嫖一波资料,就退款跑了 哈哈哈,不过后面又加回来,例如这位录友: + +
+ +**星球里的资料仅仅是辅助,更重要的是星球里的这一圈人,你会发现 这个圈子的质量非常高!** + +不仅仅是 **211、985录友非常之多**,关键是大家都非常努力上进! + +这是知识星球APP里可以看到,录友们的日常打卡: + +
+ +刷星球上的内容,要刷朋友圈,刷抖音,有意义的多。 + +
+ +
+ +星球网页版是这样的: + +
+ +加入星球,是很多录友当年做的最有意义的一件事情 + +
+
+
+
+ +可以看看星球里的交流氛围: + +
+ +
+ +
+ +
+ +
+ +大家的很多疑问在星球置顶3,我都做了详细的整理,录友都说我是“整理狂魔”,不过大家懒,我就得勤劳一些。 + +
+ +星球置顶3的信息量非常大,不仅仅是整理各个求职方向的学习路线,还有大家的常见疑惑,我之前回答过的内容,都做了整理。 + +大家看完之后,其实对自己就会有明确的规划了。 + +
+ +给大家看看星球置顶帖3的部分内容,以下仅仅是部分截图: + +
+ +
+ +
+ +
+ + +大家加入星球后,一定要看星球置顶帖和精华帖的内容,你会发现这里很有优秀录友的帖子,包括:各种资料,学习路线,学习心得,规划,职场发展等等。 + +
+ +很多录友看完之后都更加明确了自己的方向。 + +
+ + +相对于其他星球,「代码随想录」知识星球到底怎么样,可以看看录友们是怎么说的。 + +
+ +最后也欢迎大家加入代码随想录[知识星球](https://mp.weixin.qq.com/s/wPaJumc8afuzWLo72yRlIw),**这里有很多优秀的人,有很多精彩的事!** + +
+ +这里依然给出10元代金券,微信扫领代金券加入,如果感觉不值得,**三天内知识星球APP右上角直接全额退款!** 无任何套路。 + +
+ + diff --git a/problems/qita/xunlianying.md b/problems/qita/xunlianying.md new file mode 100644 index 0000000000..0d8c1c83a6 --- /dev/null +++ b/problems/qita/xunlianying.md @@ -0,0 +1,298 @@ + +# 代码随想录算法训练营 + +> 训练营17期将在6月28日开营,目前可以报名,提前拉群,在群里等着开营就好! + +大家可以百度搜索:代码随想录算法训练营, 看看往期录友们在训练营里打卡总结的博客。 + +
+ +这是训练营里录友坚持到最后一天的打卡,大家可以看看他们的博客是每天都有记录的: + +* [训练营结束,深感坚持是最难的(Java-犯困-东南研二)](https://blog.csdn.net/weixin_57956443/article/details/128995318) +* [训练营一刷总结(Java-HQH-研二)](https://blog.csdn.net/weixin_43821876/article/details/128991822) +* [训练营总结,一群人才能走的更远(Java-Lixy-已工作南京)](https://blog.csdn.net/weixin_45368277/article/details/128997823) +* [训练营总结,中途🐑了,也坚持下来(C++-Jane-科大研二)](https://blog.csdn.net/Jane_10358/article/details/128977424) +* [这两个月有很多不可控因素,但依然坚持下来(java-hha-南工大二)](https://blog.csdn.net/qerwtrt4t/article/details/128975401) +* [训练营总结,最后坚持下来(C++ - 阿舟 - 已工作武汉)](https://blog.csdn.net/m0_74360161/article/details/129000723) +* [训练营总结,一刷知识点回顾(Java-魏-待就业)](https://blog.csdn.net/weixin_48111139/article/details/128973746) +* [在训练营中,零基础刷一遍的感受(C++-东风-东北大学研二)](https://blog.csdn.net/nightcood/article/details/128947111) + + +博客链接:[https://blog.csdn.net/m0_61724447/article/details/128443084](https://blog.csdn.net/m0_61724447/article/details/128443084) +
+ +博客链接:[https://juejin.cn/post/7170304080504586254](https://juejin.cn/post/7170304080504586254) +
+ +博客链接:[https://blog.csdn.net/weixin_44047621/article/details/128430623](https://blog.csdn.net/weixin_44047621/article/details/128430623) +
+ +博客链接:[https://blog.csdn.net/weixin_47467016/article/details/128460565](https://blog.csdn.net/weixin_47467016/article/details/128460565v) +
+ +也有一些录友,把总结发在训练营内部打卡表里,例如: + +昵称:java-低调-已工作 + +通过两个月的时间系统性的学习了算法,然后按照不同的题目去做分类,设计的刷题进度也很好,让自己有了一个质的提升,贵在坚持,好在自己也是坚持了下来,**通过自己的坚持,让自己养成了一个刷题的好习惯,这才是最难能可贵的**。 + +但是时间跨度有点大,还是要继续坚持之后自己去二刷,这样才能更好的巩固,把算法知识学习的更好。 + +--------- + +昵称:java-岂几岂几-毕业 + +收获真的很大,这是第一次刷算法题,清楚了面试高频题的题型,**巩固了之前摇摇欲坠的自学算法基础**。接下来计划是重刷随想录,并且补充上一亩三分地刷题区置顶贴里列出的题型,在巩固一刷的基础上增加做题量。 + +------------ + +昵称:python/go-ds-研三 + +跟着卡哥的训练营最大的收获就是把代码随想录都通读了一遍,因为进营之前就已经刷过不少力扣题了,但很多都是当时自己捣鼓出来或者看官方题解的。 + +而这一次的60天刷题,不管题目做没做过,都看过卡哥的代码随想录了,**这其中的区别也是最大的收获就是知识体系建立起来了**,越往后做题,条理越清晰。 + +即使有些题一刷还是做不太出来,但不再像之前自己做那样做题前后都是懵逼状态了,而是有一个清晰明了的判断了。 + +但coding能力还是有待改进,接下来要进行二刷,同时也祝卡哥的事业蒸蒸日上,代码随想录越办越好! + +------------ + +昵称:Python-ukn-研二 + +完美收官,有点小遗憾的是后面dp做得有点赶,没有沉下心来消化,接下来重点把自己不擅长的专题和重点专题二刷甚至三刷。 + +**跟着训练营练下来最大的感受是很有信心,有节奏有计划**,每过完一个专题,就多一分成就感,题感也越来越好,期待自己的规律二刷,谢谢一路坚持的小伙伴们!谢谢大佬助手和卡哥! + + +----------- + + +### 训练营的目的是什么? + +对于刷题,学算法,[《代码随想录》](https://programmercarl.com/other/publish.html)(programmercarl.com)已经把刷题顺序给大家列好了,大家跟着刷就行。 + +但即使这样,其实不少录友还会有很多疑问,不知道怎么用代码随想录,例如: + +* 卡哥,**有没有一起从0开始刷代码随想录的录友,想一起组个队** +* 卡哥您好,我是985准研一非科班,自学java, 然后现在在刷代码随想录,**请问需要每个题目的所有解法都掌握吗**?请教下卡哥正确的刷题姿势🙏 +* **我大概多久才能刷完代码随想录**? +* 二叉树,我只掌握 递归够用么? +* 很多解法,我是不是只用暴力就可以,**时间比较紧,我还要去掌握优化方法吗**? +* 卡哥,**请问跟着代码随想录刷题有答疑的服务吗**? 因为有的题目 自己写的怎么都不对,浪费很多时间,可能过来人指点一下立刻就知道。 +* 卡哥,我KMP太难了,我跳过可以吗? +* 卡哥,我进了刷题群,可是**大家刷题进度不尽相同,所以讨论起来经常不在一个频道上**。 +* 刚开始还看了一周代码随想录,后来又..摆烂了... **最近又重新再看代码随想录,然后卡住了又摆烂了好几天了**...... +* 卡哥,**我刷题很容易囫囵吞枣,虽然说代码随想录一刷,但很多内容根本没消化,在进度上欺骗自己**,好像一刷完了,但感觉自己理解的,不到30%。 +* 卡哥,**感觉之前刷的都忘了,能力没有什么提升,现在还是一道都不会做**。我一刷每道题都得先看看题解然后忘了再去看边看边写。 + +**以上这些是不是有戳中某些录友们的痛处**。 + +其实对于很多算法基础不太好的录友,即使资料已经很齐全,但还是需要一些规划和答疑。 + +而且在时间规划上,因为刚开始刷的录友,不知道 前方题目 是多大难度,所以 一开始计划 一天刷三道,往往因为遇到了一道难题,一天也解决不了,耽误了整体进度,甚至直接开始摆烂,下次再开始刷题可能就很久以后了...... + +所以 **代码随想录算法训练营** 帮助大家在规划时间内,有质量的完成代码随想录一刷。 + +我亲自给大家规划节奏,大家一起按照我的节奏来,规定时间内,一刷一定能把代码随想录所有内容吃透,然后大家自己去二刷,三刷就好了,师傅领进门修行在个人。 + +### 训练营提供一些什么呢? + +1.具体内容 + +针对代码随想录上,**195篇算法文章,主要题目150道**,手把手带大家刷完,帮大家做好详细刷题规划,每天布置刷题任务,监督博客记录总结。 + +任务布置 +
+ +每日规划: +
+ +训练营周期内,每天应该做哪些题目,同时我根据题目的难度,适当调整每天学习安排,不会是 每天固定3题的这种,而是根据难度而定。 + +我会告诉大家,哪些解法是一刷的时候必须掌握的,哪些解法可以二刷再去学习,哪些总结是必看的。 + +每日打卡: +
+ +关于如果debug自己的代码,训练营会给具体建议: +
+ +训练营群中每日讨论的重点内容都会做整理,在分享给大家训练营成员: +
+ +**同时每天做针对大家的疑问做详细答疑,保证大家消化当天的学习内容**。 + +2.**气氛气氛还是气氛** + +训练营中,**大家都是同一个基础,同一个进度刷题,每天刷题题目都是一样的**,这样的一个学习群,大家讨论起来更有意义。 +**还有会监督机制**,训练营的成员要注册一个自己的博客(自己搭建或者使用博客网站都可以),每天要去写今日刷题心得和总结,来进行打卡。 + +
+ +3.带大家写博客 + +很多录友平时刷题,或者学习技术,没有写博客的习惯,或者因为懒,就不写了。 + +但大家学了很多技术之后,发现 好像都忘了。。。 + +所以训练营会带着大家写博客,每天都要写博客,博客的标题,格式,我都帮大家规划好,倒逼自己养生记录的习惯。 + +因为训练营很多录友开始有了写博客的习惯,以下是一些录友博客的结尾部分: + +
+ +
+ +每天训练营群里会每天统计大家的博客情况。这样不仅可以监督自己总结,针对大家写的比较好的博客,会给予曝光,增加自己写博客的动力。 + +训练营里的录友们可以相互参考对方的博客,看谁总结的更好。 + +
+ + +4.关于答疑 + +很多录友可能担心自己的问题,得不到解决,或者在群里和大家讨论,也没人回复 导致自己因为小问题卡了很久,甚至直接摆烂好一阵子。 + +所以训练营里大家的问题,我都会做答疑。 + +估计训练营里的问题会比较多,我也可能回答不过来。所以我会找了算法能力很强的助手协助我给大家答疑,也就是说,**大家刷题遇到问题,不会有后顾之忧,当天的问题,当天一定会得到解决**。 + +
+ +当然训练营题目答疑,**仅限于 每天规划的题目**,并不会大家刷的其他算法题都做答疑,那样的话工作量很容易不可控(这里我也不会夸大承诺,欺骗大家报名之类的),如果是其他算法题可以在群里和大家交流。 + +### 训练营的资料是什么呢? + +**强调一下:训练营里所有的资料,都是我独立制作而且是开源免费的:即代码随想录网站(programmercarl.com),Github:https://github.com/youngyangyang04/leetcode-master和[代码随想录算法公开课](https://mp.weixin.qq.com/s/xncn6IHJGs45sJOChN6V_g)** + +训练营提供给大家的服务是**规划,监督,指导和答疑**。 + +至于代码随想录算法内容的质量如何,这个已经是有口皆碑了,基本是面试求职必刷的资料。 + +
+ +
+ +而且代码随想录开源的内容要比市面上 大家付费几百,上千元报的算法训练营的资料都要好的多。 + +毕竟内容是开源的,质量如何 大家自己去看就好。 + +### 训练营的学习方式 + +组织方式:一个学习微信群(180人左右),大家进群之后,等群公告就好,我会通知开始时间和每日刷题计划。 + +所需时间:训练营为期60天(两个月),群里每天会布置学习任务,只要大家跟上节奏,60天一定可以刷完代码随想录。 + +每日任务:需要花费3-4个小时左右的时间来完成。这是针对一般算法水平的学习速度来规划的时间,不同水平会有差异。 + +每周周日会休息一天,没跟上进度的录友,可以跟进度,跟上进度的录友可以复习或者适当放松一下。 + +监督机制:训练营里,每天会针对大家每天所刷的题目做答疑,同时也会有监督打卡机制,在群公告里会详细描述。 + +所需语言:**所有语种都可以**,毕竟代码随想录几乎支持所有主流语言,**也会针对大家所用的语言做针对性答疑**。 + +### 开营时间 + +**训练营开始常态化报名,即一直可以报名,当人满180人的时候,就开始新的一期**。 最新的一期可以看文章评论区。 + +### 训练营的价格 + +大家应该最关心的是价格了,**定价依然是268元**,注意这是两个月训练营的费用,而且是全程规划,指导,监督和答疑。 + +(对于[知识星球](https://programmercarl.com/other/kstar.html)里的录友的话,训练营会立减30元,也就是238元,后面如果推出其他服务,星球录友都相当于VIP,都会有优惠。当然如果你已经报了训练营,再去报知识星球,并不给再给大家优惠了,一定要先是星球成员,再报训练营才有优惠) + +大家能在市面上找到算法训练营都价格不菲,基本都是上千的单价,**而且内容和质量并没有 代码随想录 优质**。 + +后面一定会涨价的,**如果你确实需要有人带,有监督,给规划,有答疑,能花两个月时间更下来的话,还是早报早学习**。 + +### 我适合报名吗? + +符合一下特点的录友可以报名: + +* 基础比较差,没刷过代码随想录或者刚开始刷 +* 刷过一些代码随想录的题目了,感觉掌握不扎实,想用2个月时间系统重刷一遍 +* 自己刷题,**很容易遇到各种代码问题,需要有人答疑** +* 以前一刷过,但基本都忘了,想高质量二刷 +* **想找队友,一起从0刷代码随想录** +* 自控能力差,遇到点问题就容易躺好一阵子,需要别人监督学习 +* **想有一个规划时间,来刷完代码随想录** +* 不知道代码随想录中哪些解法是必备的,哪些解法是可以简单了解的 +* 刷题总会忘,感觉刷了和没刷差不多,**不擅长做总结,不擅长写博客记录心得**,自己也懒得写博客写总结 + +以下录友不合适报名: + +* 自学能力强,代码随想录资料都是开源的,刷题顺序也列好了,自学能力强的录友自己学就行 +* 有算法和代码基础,基本算法题遇到的问题,都能通过自己debug解决 +* 没有两个月时间,每天也不能抽出那么多时间学习算法 +* 算法0基础,基本的数据结构都没听说过,例如数组,链表。 +* 编程0基础,基本的编程语言还不会,因为训练营还是默认大家会熟悉所用编程语言里的各种容器的使用 + +**训练营不限编程语言**,任何语言都可以报名,都会答疑。 + + +### 常见疑问 + +**海外录友有时差可以报名吗**? + +可以的,一期就有很多海外的录友,有疑问在群里也会回复,而且群里讨论的重点内容,都会有总结,不用担心错过了精彩内容。 + +**已经工作的录友适合报名吗**? + +适合报名。对于工作的录友,每天未必说一定挤出3-4个小时来刷题。 + +对于时间充足的录友,要刷拓展题,要写博客作总结。 如果时间紧张,任务上是可以适当精简。 + +所以每日任务弹性还是比较大的,至少跟上进度保证每天的题目代码提交通过了,看看群里的讨论,自己理解加深了就可以。 + +工作的录友要学会挤时间,训练营一期录友有不少是工作的,他们是这么搞的: + +训练营每日晚上提前发布明天的任务, 他们第二天通勤 时候 可以先看题想思路,白天抽空看文章解析 看看思路是否一致,看看群里讨论内容,晚上下班可以一口气把当天的题目刷完。 + +加入训练营,每日对自己有一个压迫感,挤一挤 时间就有了。 + +对于工作的录友,我之前本来计划是安排一期 工作日题量小 休息日题量多一些的训练营,但通过一期发现,包括已经工作的录友,**大家休息日真的没有心思学习,甚至“比工作日更忙”**,所以理想很丰满,现实很骨感。 + +**要不要搞三个月四个月半年的训练营**? + +目前来看四个月以上的时间有点太长了,时间长价格也会高,毕竟要服务的时间长了。 + +而且刷题在于一鼓作气,把时间拉的太长,很多录友都是前期 动力十足,后面无论是 如何@ 如何公告 如果催大家 赶进度,大家都会无动于衷,从最终效果来看 战线不能太长。 + +所以没有逼自己一把 跟上进度的决心,就算搞一年时间的训练营,该放弃的还是会放弃。 + +至于三个月的训练营,是可以考虑的,不过安排时间还要待定。 + +### 报名方式 + +扫码支付268元。 (如果是[代码随想录知识星球](https://programmercarl.com/other/kstar.html)成员录友,只需要支付238元,提交客服的时候需提供知识星球截图,**注意一定要是代码随想录知识星球**) + +
+ +付款后,将付款截图发给客服,客服会在24h内统一回复,**所以大家发给客服信息不要急,当天一定会回复的**。 + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20230603175235.png) + +客服的联系方式就在大家的微信聊天窗口,不用担心突出聊天窗口错过消息,客服回复之后 会有微信提示的。 + +关于训练营的任何问题,可以在客服这里咨询! + + +### 最后 + +训练营其实算是代码随想录的一个补充,其内容都是免费开放的,有学习能力的录友自己学习就好。 + +单就从我的 [代码随想录算法公开课](https://mp.weixin.qq.com/s/xncn6IHJGs45sJOChN6V_g) 来说,质量如何,大家可以去看评论区,我完全可以把它做成付费的视频课,但我还是选择免费开放给大家,目前一周会更新四个算法视频,已经快把二叉树系列更完了。 + +之所以做训练营,是因为大家太多的问题,不是视频或者文章教程可以解决的,需要的是规划,组织,监督和答疑。 + +所以我才组织训练营,搞成付费的也是为了质量更高一些,同时也是因为需要一些门槛,要不然就和普通刷题群没什么区别了。 + +等大家跟着代码随想录训练营一路走下来之后,大家再回顾自己两个月学习的内容和总结的博客,**一定会发现 这个价格 物超所值**! + +关于训练营的任何疑问都可以扫码联系客服 + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20230603175235.png) + diff --git "a/problems/\345\233\276\350\256\272\345\271\277\347\264\242\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\345\233\276\350\256\272\345\271\277\346\220\234\347\220\206\350\256\272\345\237\272\347\241\200.md" similarity index 97% rename from "problems/\345\233\276\350\256\272\345\271\277\347\264\242\347\220\206\350\256\272\345\237\272\347\241\200.md" rename to "problems/\345\233\276\350\256\272\345\271\277\346\220\234\347\220\206\350\256\272\345\237\272\347\241\200.md" index d1bb14e055..1f3a13728f 100644 --- "a/problems/\345\233\276\350\256\272\345\271\277\347\264\242\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\345\233\276\350\256\272\345\271\277\346\220\234\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -8,7 +8,7 @@ > 号外!!代码随想录图论内容已经计划开更了! -在[深度优先搜索](https://leetcode.cn/problems/all-paths-from-source-to-target/solution/by-carlsun-2-66pf/)的讲解中,我们就讲过深度优先搜索和广度优先搜索的区别。 +在[深度优先搜索](https://programmercarl.com/图论深搜理论基础.html)的讲解中,我们就讲过深度优先搜索和广度优先搜索的区别。 广搜(bfs)是一圈一圈的搜索过程,和深搜(dfs)是一条路跑到黑然后在回溯。 diff --git "a/problems/\345\233\276\350\256\272\346\267\261\346\220\234\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\345\233\276\350\256\272\346\267\261\346\220\234\347\220\206\350\256\272\345\237\272\347\241\200.md" index 9f965abb2a..eb6a26fe6d 100644 --- "a/problems/\345\233\276\350\256\272\346\267\261\346\220\234\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\345\233\276\350\256\272\346\267\261\346\220\234\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -6,7 +6,7 @@ # 深度优先搜索理论基础 -录友们期待图论内容已久了,为什么鸽了这么久,主要是最近半年开始更新[代码随想录算法公开课](https://mp.weixin.qq.com/s/xncn6IHJGs45sJOChN6V_g),是开源在B站的算法视频,已经帮助非常多基础不好的录友学习算法。 +录友们期待图论内容已久了,为什么鸽了这么久,主要是最近半年开始更新[代码随想录算法公开课](https://www.bilibili.com/video/BV1fA4y1o715/),是开源在B站的算法视频,已经帮助非常多基础不好的录友学习算法。 录视频其实是非常累的,也要花很多时间,所以图论这边就没抽出时间来。 From 17a01cecefcdb2b71806a56bc6789686bcb755ac Mon Sep 17 00:00:00 2001 From: Terry Liu <102352821+Lozakaka@users.noreply.github.com> Date: Thu, 8 Jun 2023 17:38:49 -0400 Subject: [PATCH 1963/3019] =?UTF-8?q?=E6=96=B0=E5=A2=9Ejava=E8=A8=BB?= =?UTF-8?q?=E8=A7=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增java註解 if statement的解釋 --- ...5\250\350\203\214\345\214\205\347\211\210\346\234\254.md" | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git "a/problems/0070.\347\210\254\346\245\274\346\242\257\345\256\214\345\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md" "b/problems/0070.\347\210\254\346\245\274\346\242\257\345\256\214\345\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md" index 8f8bc9a649..bc5e350908 100644 --- "a/problems/0070.\347\210\254\346\245\274\346\242\257\345\256\214\345\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md" +++ "b/problems/0070.\347\210\254\346\245\274\346\242\257\345\256\214\345\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md" @@ -133,12 +133,13 @@ Java: class Solution { public int climbStairs(int n) { int[] dp = new int[n + 1]; - int m = 2; + int m = 2; //有兩個物品:itme1重量爲一,item2重量爲二 dp[0] = 1; for (int i = 1; i <= n; i++) { // 遍历背包 for (int j = 1; j <= m; j++) { //遍历物品 - if (i >= j) dp[i] += dp[i - j]; + if (i >= j) //當前的背包容量 大於 物品重量的時候,我們才需要記錄當前的這個裝得方法(方法數+) + dp[i] += dp[i - j]; } } From 652fa2bbb0a43799365df33544bf13638a6b8d20 Mon Sep 17 00:00:00 2001 From: Terry Liu <102352821+Lozakaka@users.noreply.github.com> Date: Fri, 9 Jun 2023 18:11:29 -0400 Subject: [PATCH 1964/3019] =?UTF-8?q?=E6=96=B0=E5=A2=9Ejava=202*2=20array?= =?UTF-8?q?=20solution?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...01\350\247\204\345\210\222\357\274\211.md" | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git "a/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" "b/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" index 12789934ff..1443f14710 100644 --- "a/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" +++ "b/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" @@ -154,6 +154,25 @@ class Solution { return dp[1]; } } +```Java +//使用 2*2 array +class Solution { + public int maxProfit(int[] prices, int fee) { + int dp[][] = new int[2][2]; + int len = prices.length; + //[i][0] = holding the stock + //[i][1] = not holding the stock + dp[0][0] = -prices[0]; + + for(int i = 1; i < len; i++){ + dp[i % 2][0] = Math.max(dp[(i - 1) % 2][0], dp[(i - 1) % 2][1] - prices[i]); + dp[i % 2][1] = Math.max(dp[(i - 1) % 2][1], dp[(i - 1) % 2][0] + prices[i] - fee); + } + + return dp[(len - 1) % 2][1]; + } +} +``` ``` Python: From 88162c3a77ad266002158c448a6dc4f934bb9dc6 Mon Sep 17 00:00:00 2001 From: Terry Liu <102352821+Lozakaka@users.noreply.github.com> Date: Fri, 9 Jun 2023 18:27:21 -0400 Subject: [PATCH 1965/3019] =?UTF-8?q?=E6=96=B0=E5=A2=9Ejava=202*4=20soluti?= =?UTF-8?q?on=20=E4=B8=A6=E9=99=84=E4=B8=8A=20=E5=B0=8D=E6=96=BC2-D=20arra?= =?UTF-8?q?y,=201-D=20array=E7=9A=84=E5=88=86=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...53\345\206\267\345\206\273\346\234\237.md" | 28 ++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git "a/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" "b/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" index a56d9b8464..83cd448acf 100644 --- "a/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" +++ "b/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" @@ -200,7 +200,33 @@ class Solution { } } ``` - +```java +//using 2*4 array for space optimization +//這裡稍微說一下,我在LeetCode提交的時候,2*4 2-D array的performance基本上和下面的1-D array performance差不多 +//都是time: 1ms, space: 40.X MB (其實 length*4 的 2-D array也僅僅是space:41.X MB,看起來不多) +//股票累的DP題目大致上都是這樣,就當作是一個延伸就好了。真的有人問如何優化,最起碼有東西可以講。 +class Solution { + /** + 1. [i][0] holding the stock + 2. [i][1] after cooldown but stil not buing the stock + 3. [i][2] selling the stock + 4. [i][3] cooldown + */ + public int maxProfit(int[] prices) { + int len = prices.length; + int dp[][] = new int [2][4]; + dp[0][0] = -prices[0]; + + for(int i = 1; i < len; i++){ + dp[i % 2][0] = Math.max(Math.max(dp[(i - 1) % 2][0], dp[(i - 1) % 2][1] - prices[i]), dp[(i - 1) % 2][3] - prices[i]); + dp[i % 2][1] = Math.max(dp[(i - 1) % 2][1], dp[(i - 1) % 2][3]); + dp[i % 2][2] = dp[(i - 1) % 2][0] + prices[i]; + dp[i % 2][3] = dp[(i - 1) % 2][2]; + } + return Math.max(Math.max(dp[(len - 1) % 2][1], dp[(len - 1) % 2][2]), dp[(len - 1) % 2][3]); + } +} +``` ```java // 一维数组优化 class Solution { From cef6de49f42d50d0c877f962f7355b48317510b0 Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Sat, 10 Jun 2023 16:54:54 +0800 Subject: [PATCH 1966/3019] debug --- ...684.\345\206\227\344\275\231\350\277\236\346\216\245.md" | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git "a/problems/0684.\345\206\227\344\275\231\350\277\236\346\216\245.md" "b/problems/0684.\345\206\227\344\275\231\350\277\236\346\216\245.md" index 97f100d042..177338dd6d 100644 --- "a/problems/0684.\345\206\227\344\275\231\350\277\236\346\216\245.md" +++ "b/problems/0684.\345\206\227\344\275\231\350\277\236\346\216\245.md" @@ -131,9 +131,11 @@ private: } // 将v->u 这条边加入并查集 void join(int u, int v) { - if (isSame(u, v)) return ; + u = find(u); // 寻找u的根 + v = find(v); // 寻找v的根 + if (u == v) return ; // 如果发现根相同,则说明在一个集合,不用两个节点相连直接返回 father[v] = u; - } +} public: vector findRedundantConnection(vector>& edges) { init(); From a32bbeb71a37153276d69412526819493ffe3bd5 Mon Sep 17 00:00:00 2001 From: Feegg <1468434504@qq.com> Date: Sun, 11 Jun 2023 02:13:01 +0800 Subject: [PATCH 1967/3019] =?UTF-8?q?=E5=AF=B90707=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E9=93=BE=E8=A1=A8=EF=BC=8Cgo=E7=89=88=E6=9C=AC=E5=8D=95?= =?UTF-8?q?=E9=93=BE=E8=A1=A8=E5=81=9A=E4=BA=86=E4=BF=AE=E6=94=B9=EF=BC=8C?= =?UTF-8?q?=E5=8E=9F=E6=9D=A5=E7=89=88=E6=9C=AC=E6=B2=A1=E6=9C=89=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E9=93=BE=E8=A1=A8=E6=8C=87=E5=AE=9Aindex=E4=B8=8B?= =?UTF-8?q?=E6=A0=87=E7=9A=84=E6=96=B9=E6=B3=95=EF=BC=8C=E5=B9=B6=E4=B8=94?= =?UTF-8?q?=E5=B7=B2=E6=9C=89=E7=9A=84=E5=9C=A8leetcode=E6=89=A7=E8=A1=8C?= =?UTF-8?q?=E6=9C=89=E8=AF=AF=EF=BC=8C=E5=81=9A=E4=BA=86=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E8=B0=83=E6=95=B4=EF=BC=8C=E5=9F=BA=E4=BA=8E=E5=8E=9F=E6=9D=A5?= =?UTF-8?q?=E7=9A=84=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...76\350\256\241\351\223\276\350\241\250.md" | 146 +++++++++++------- 1 file changed, 87 insertions(+), 59 deletions(-) diff --git "a/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" "b/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" index aa04d0e1af..b9f2795238 100644 --- "a/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" +++ "b/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" @@ -663,100 +663,128 @@ Go: //单链表实现 package main -import "fmt" +import ( + "fmt" +) -func main() { - var list = new(SingleLinkedList) - list.Init() - list.addAtHead(100) - list.addAtTail(242) - list.addAtTail(777) - list.addAtIndex(1, 99999) - list.printLinkedList() +type SingleNode struct { + Val int // 节点的值 + Next *SingleNode // 下一个节点的指针 } -// 单链表写法 // - -type SingleNode struct { - Val int - Next *SingleNode +type MyLinkedList struct { + dummyHead *SingleNode // 虚拟头节点 + Size int // 链表大小 } -type SingleLinkedList struct { - dummyHead *SingleNode - Size int +func main() { + list := Constructor() // 初始化链表 + list.AddAtHead(100) // 在头部添加元素 + list.AddAtTail(242) // 在尾部添加元素 + list.AddAtTail(777) // 在尾部添加元素 + list.AddAtIndex(1, 99999) // 在指定位置添加元素 + list.printLinkedList() // 打印链表 } -// 初始化链表 -func (list *SingleLinkedList) Init() *SingleLinkedList { - list.Size = 0 - list.dummyHead = new(SingleNode) - return list +/** Initialize your data structure here. */ +func Constructor() MyLinkedList { + newNode := &SingleNode{ // 创建新节点 + -999, + nil, + } + return MyLinkedList{ // 返回链表 + dummyHead: newNode, + Size: 0, + } + } -// 获取第index个节点数值 -func (list *SingleLinkedList) get(index int) int { - if list != nil || index < 0 || index > list.Size { +/** Get the value of the index-th node in the linked list. If the index is + invalid, return -1. */ +func (this *MyLinkedList) Get(index int) int { + /*if this != nil || index < 0 || index > this.Size { + return -1 + }*/ + if this == nil || index < 0 || index >= this.Size { // 如果索引无效则返回-1 return -1 } // 让cur等于真正头节点 - cur := list.dummyHead.Next - for i := 0; i < index; i++ { + cur := this.dummyHead.Next // 设置当前节点为真实头节点 + for i := 0; i < index; i++ { // 遍历到索引所在的节点 cur = cur.Next } - return cur.Val + return cur.Val // 返回节点值 } -// 在链表最前面插入一个节点 -func (list *SingleLinkedList) addAtHead(val int) { +/** Add a node of value val before the first element of the linked list. After + the insertion, the new node will be the first node of the linked list. */ +func (this *MyLinkedList) AddAtHead(val int) { // 以下两行代码可用一行代替 // newNode := new(SingleNode) // newNode.Val = val - newNode := &SingleNode{Val: val} - - newNode.Next = list.dummyHead.Next - list.dummyHead.Next = newNode - list.Size++ + newNode := &SingleNode{Val: val} // 创建新节点 + newNode.Next = this.dummyHead.Next // 新节点指向当前头节点 + this.dummyHead.Next = newNode // 新节点变为头节点 + this.Size++ // 链表大小增加1 } -// 在链表最后面插入一个节点 -func (list *SingleLinkedList) addAtTail(val int) { - newNode := &SingleNode{Val: val} - cur := list.dummyHead - for cur.Next != nil { +/** Append a node of value val to the last element of the linked list. */ +func (this *MyLinkedList) AddAtTail(val int) { + newNode := &SingleNode{Val: val} // 创建新节点 + cur := this.dummyHead // 设置当前节点为虚拟头节点 + for cur.Next != nil { // 遍历到最后一个节点 cur = cur.Next } - cur.Next = newNode - list.Size++ + cur.Next = newNode // 在尾部添加新节点 + this.Size++ // 链表大小增加1 } -// 打印链表 -func (list *SingleLinkedList) printLinkedList() { - cur := list.dummyHead - for cur.Next != nil { - fmt.Println(cur.Next.Val) +/** Add a node of value val before the index-th node in the linked list. If + index equals to the length of linked list, the node will be appended to the + end of linked list. If index is greater than the length, the node will not be + inserted. */ +func (this *MyLinkedList) AddAtIndex(index int, val int) { + if index < 0 { // 如果索引小于0,设置为0 + index = 0 + } else if index > this.Size { // 如果索引大于链表长度,直接返回 + return + } + + newNode := &SingleNode{Val: val} // 创建新节点 + cur := this.dummyHead // 设置当前节点为虚拟头节点 + for i := 0; i < index; i++ { // 遍历到指定索引的前一个节点 cur = cur.Next } + newNode.Next = cur.Next // 新节点指向原索引节点 + cur.Next = newNode // 原索引的前一个节点指向新节点 + this.Size++ // 链表大小增加1 } -// 在第index个节点之前插入新节点 -func (list *SingleLinkedList) addAtIndex(index int, val int) { - if index < 0 { - index = 0 - } else if index > list.Size { +/** Delete the index-th node in the linked list, if the index is valid. */ +func (this *MyLinkedList) DeleteAtIndex(index int) { + if index < 0 || index >= this.Size { // 如果索引无效则直接返回 return } - - newNode := &SingleNode{Val: val} - cur := list.dummyHead //用虚拟头节点不用考虑在头部插入的情况 - for i := 0; i < index; i++ { + cur := this.dummyHead // 设置当前节点为虚拟头节点 + for i := 0; i < index; i++ { // 遍历到要删除节点的前一个节点 cur = cur.Next } - newNode.Next = cur.Next - cur.Next = newNode - list.Size++ + if cur.Next != nil { + cur.Next = cur.Next.Next // 当前节点直接指向下下个节点,即删除了下一个节点 + } + this.Size-- // 注意删除节点后应将链表大小减一 +} + +// 打印链表 +func (list *MyLinkedList) printLinkedList() { + cur := list.dummyHead // 设置当前节点为虚拟头节点 + for cur.Next != nil { // 遍历链表 + fmt.Println(cur.Next.Val) // 打印节点值 + cur = cur.Next // 切换到下一个节点 + } } + ``` ```go From 50ed10475df9c62dae9e149a867a6f083a0dde04 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Mon, 12 Jun 2023 01:59:52 -0500 Subject: [PATCH 1968/3019] =?UTF-8?q?Update=200746.=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=E6=9C=80=E5=B0=8F=E8=8A=B1=E8=B4=B9=E7=88=AC=E6=A5=BC=E6=A2=AF?= =?UTF-8?q?.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...71\347\210\254\346\245\274\346\242\257.md" | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git "a/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" "b/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" index cd5e40e63d..9eaaa4e9fe 100644 --- "a/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" +++ "b/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" @@ -282,7 +282,35 @@ class Solution: return dp1 # 返回到达楼顶的最小花费 ``` +动态规划(版本三) +```python +class Solution: + def minCostClimbingStairs(self, cost: List[int]) -> int: + dp = [0] * len(cost) + dp[0] = cost[0] # 第一步有花费 + dp[1] = cost[1] + for i in range(2, len(cost)): + dp[i] = min(dp[i - 1], dp[i - 2]) + cost[i] + # 注意最后一步可以理解为不用花费,所以取倒数第一步,第二步的最少值 + return min(dp[-1], dp[-2]) + +``` +动态规划(版本四) + +```python +class Solution: + def minCostClimbingStairs(self, cost: List[int]) -> int: + n = len(cost) + prev_1 = cost[0] # 前一步的最小花费 + prev_2 = cost[1] # 前两步的最小花费 + for i in range(2, n): + current = min(prev_1, prev_2) + cost[i] # 当前位置的最小花费 + prev_1, prev_2 = prev_2, current # 更新前一步和前两步的最小花费 + return min(prev_1, prev_2) # 最后一步可以理解为不用花费,取倒数第一步和第二步的最少值 + + +``` ### Go ```Go func minCostClimbingStairs(cost []int) int { From 5527410f890ecfccdb017ce5aa5fc902328ab922 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Mon, 12 Jun 2023 02:59:20 -0500 Subject: [PATCH 1969/3019] =?UTF-8?q?Update=200063.=E4=B8=8D=E5=90=8C?= =?UTF-8?q?=E8=B7=AF=E5=BE=84II.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\345\220\214\350\267\257\345\276\204II.md" | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git "a/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" "b/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" index 7b5b44f00c..cb305b4189 100644 --- "a/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" +++ "b/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" @@ -397,7 +397,39 @@ class Solution: ``` +动态规划(版本五) +```python +class Solution: + def uniquePathsWithObstacles(self, obstacleGrid): + if obstacleGrid[0][0] == 1: + return 0 + + m, n = len(obstacleGrid), len(obstacleGrid[0]) + + dp = [0] * n # 创建一个一维列表用于存储路径数 + + # 初始化第一行的路径数 + for j in range(n): + if obstacleGrid[0][j] == 1: + break + dp[j] = 1 + + # 计算其他行的路径数 + for i in range(1, m): + if obstacleGrid[i][0] == 1: + dp[0] = 0 + for j in range(1, n): + if obstacleGrid[i][j] == 1: + dp[j] = 0 + continue + + dp[j] += dp[j - 1] + + return dp[-1] # 返回最后一个元素,即终点的路径数 + + +``` ### Go ```go From 072eb2aa471f025afdb690e57a23c0932b5a4697 Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Mon, 12 Jun 2023 03:32:07 -0500 Subject: [PATCH 1970/3019] =?UTF-8?q?Update=200343.=E6=95=B4=E6=95=B0?= =?UTF-8?q?=E6=8B=86=E5=88=86.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git "a/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" "b/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" index d70641dbe9..3ff8dedb03 100644 --- "a/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" +++ "b/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" @@ -262,10 +262,11 @@ class Solution: # 计算切割点j和剩余部分(i-j)的乘积,并与之前的结果进行比较取较大值 - dp[i] = max(dp[i], max((i - j) * j, dp[i - j] * j)) + dp[i] = max(dp[i], (i - j) * j, dp[i - j] * j) return dp[n] # 返回最终的计算结果 + ``` 动态规划(版本二) ```python From b1e8b17eb1bfd4e620b49037154693d4f9188a96 Mon Sep 17 00:00:00 2001 From: Terry Liu <102352821+Lozakaka@users.noreply.github.com> Date: Wed, 14 Jun 2023 18:30:56 -0400 Subject: [PATCH 1971/3019] =?UTF-8?q?=E6=96=B0=E5=A2=9Ejava=E4=B8=80?= =?UTF-8?q?=E7=B6=AD=E6=95=B8=E7=B5=84=E8=A7=A3=E6=B3=95=EF=BC=88=E5=BE=88?= =?UTF-8?q?=E5=8D=A1=E5=93=A5=E9=82=8F=E8=BC=AF=E4=B8=80=E8=87=B4=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 原本的那個版本不知道在寫什麼 --- ...\344\275\263\346\227\266\346\234\272IV.md" | 37 ++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git "a/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" "b/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" index 5bed5ecc5d..14f514a98f 100644 --- "a/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" +++ "b/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" @@ -227,7 +227,7 @@ class Solution { } } -//版本三:一维 dp数组 +//版本三:一维 dp数组 (下面有和卡哥邏輯一致的一維數組JAVA解法) class Solution { public int maxProfit(int k, int[] prices) { if(prices.length == 0){ @@ -259,6 +259,41 @@ class Solution { } } ``` +```JAVA +class Solution { + public int maxProfit(int k, int[] prices) { + + //edge cases + if(prices.length == 0 || k == 0) + return 0; + + + int dp[] = new int [k * 2 + 1]; + + //和卡哥邏輯一致,奇數天購入股票,故初始化只初始化奇數天。 + for(int i = 1; i < 2 * k + 1; i += 2){ + dp[i] = -prices[0]; + } + + for(int i = 1; i < prices.length; i++){ //i 從 1 開始,因爲第 i = 0 天已經透過初始化完成了。 + for(int j = 1; j < 2 * k + 1; j++){ //j 從 1 開始,因爲第 j = 0 天已經透過初始化完成了。 + //奇數天購買 + if(j % 2 == 1) + dp[j] = Math.max(dp[j], dp[j - 1] - prices[i]); + //偶數天賣出 + else + dp[j] = Math.max(dp[j], dp[j - 1] + prices[i]); + } + //打印DP數組 + //for(int x : dp) + // System.out.print(x +", "); + //System.out.println(); + } + //return 第2 * k次賣出的獲利。 + return dp[2 * k]; + } +} +``` Python: From 9c1988edec9d6eeca9db1bd558ad16410f40eaf6 Mon Sep 17 00:00:00 2001 From: Binbin Date: Thu, 15 Jun 2023 19:32:34 +0800 Subject: [PATCH 1972/3019] =?UTF-8?q?=E9=94=99=E5=88=AB=E5=AD=97=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=EF=BC=9A=E5=B7=B2=E7=BB=8F=E5=A1=AB=E5=9C=A8=E7=9A=84?= =?UTF-8?q?=E5=AD=90=E4=B8=B2=20->=20=E5=B7=B2=E7=BB=8F=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E7=9A=84=E5=AD=90=E4=B8=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...345\211\262\345\233\236\346\226\207\344\270\262.md" | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git "a/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" "b/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" index 636cf59c4b..92fed58a2e 100644 --- "a/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" +++ "b/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" @@ -118,7 +118,7 @@ for (int i = startIndex; i < s.size(); i++) { continue; } backtracking(s, i + 1); // 寻找i+1为起始位置的子串 - path.pop_back(); // 回溯过程,弹出本次已经填在的子串 + path.pop_back(); // 回溯过程,弹出本次已经添加的子串 } ``` @@ -189,7 +189,7 @@ private: continue; } backtracking(s, i + 1); // 寻找i+1为起始位置的子串 - path.pop_back(); // 回溯过程,弹出本次已经填在的子串 + path.pop_back(); // 回溯过程,弹出本次已经添加的子串 } } bool isPalindrome(const string& s, int start, int end) { @@ -245,7 +245,7 @@ private: continue; } backtracking(s, i + 1); // 寻找i+1为起始位置的子串 - path.pop_back(); // 回溯过程,弹出本次已经填在的子串 + path.pop_back(); // 回溯过程,弹出本次已经添加的子串 } } void computePalindrome(const string& s) { @@ -437,7 +437,7 @@ class Solution: substring = s[startIndex:i + 1] path.append(substring) self.backtracking(s, i + 1, path, result, isPalindrome) # 寻找i+1为起始位置的子串 - path.pop() # 回溯过程,弹出本次已经填在的子串 + path.pop() # 回溯过程,弹出本次已经添加的子串 def computePalindrome(self, s, isPalindrome): for i in range(len(s) - 1, -1, -1): # 需要倒序计算,保证在i行时,i+1行已经计算好了 @@ -497,7 +497,7 @@ func dfs(s string, start int) { if isPalindrome(str) { // 是回文子串 path = append(path, str) dfs(s, i+1) // 寻找i+1为起始位置的子串 - path = path[:len(path)-1] // 回溯过程,弹出本次已经填在的子串 + path = path[:len(path)-1] // 回溯过程,弹出本次已经添加的子串 } } } From 3becfab93f477723e4c3aee75da45989bebd0bb6 Mon Sep 17 00:00:00 2001 From: Terry Liu <102352821+Lozakaka@users.noreply.github.com> Date: Thu, 15 Jun 2023 17:58:09 -0400 Subject: [PATCH 1973/3019] =?UTF-8?q?=E8=AA=AA=E6=98=8EJAVA=20code?= =?UTF-8?q?=E9=9C=80=E8=A6=81=E6=B3=A8=E6=84=8F=E7=9A=84=E5=9C=B0=E6=96=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...7\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" | 1 + 1 file changed, 1 insertion(+) diff --git "a/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" "b/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" index 81f02ace98..8cc270ec64 100644 --- "a/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" +++ "b/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" @@ -177,6 +177,7 @@ Java: dp[i] = 1; } int res = 1; + //可以注意到,這邊的 i 是從 0 開始,所以會出現和卡哥的C++ code有差異的地方,在一些地方會看到有 i + 1 的偏移。 for (int i = 0; i < nums.length - 1; i++) { if (nums[i + 1] > nums[i]) { dp[i + 1] = dp[i] + 1; From 018c9cb96399a5005f6ed42e0eb69ebc07f24d97 Mon Sep 17 00:00:00 2001 From: Terry Liu <102352821+Lozakaka@users.noreply.github.com> Date: Thu, 15 Jun 2023 18:46:08 -0400 Subject: [PATCH 1974/3019] =?UTF-8?q?=E6=96=B0=E5=A2=9Ejava=202-D=20array?= =?UTF-8?q?=20=E5=BB=BA=E8=AD=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...5\254\345\205\261\345\255\220\345\272\217\345\210\227.md" | 5 +++++ 1 file changed, 5 insertions(+) diff --git "a/problems/1143.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" "b/problems/1143.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" index 2b5eed3d2d..68269b87c5 100644 --- "a/problems/1143.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/1143.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" @@ -144,6 +144,11 @@ Java: */ class Solution { public int longestCommonSubsequence(String text1, String text2) { + // char[] char1 = text1.toCharArray(); + // char[] char2 = text2.toCharArray(); + // 可以在一開始的時候就先把text1, text2 轉成char[],之後就不需要有這麼多爲了處理字串的調整 + // 就可以和卡哥的code更一致 + int[][] dp = new int[text1.length() + 1][text2.length() + 1]; // 先对dp数组做初始化操作 for (int i = 1 ; i <= text1.length() ; i++) { char char1 = text1.charAt(i - 1); From 342e7a597eb50c1570fdd713a237b761ab777bd6 Mon Sep 17 00:00:00 2001 From: Terry Liu <102352821+Lozakaka@users.noreply.github.com> Date: Fri, 16 Jun 2023 20:58:06 -0400 Subject: [PATCH 1975/3019] =?UTF-8?q?=E5=8A=A0=E5=85=A5B=E7=AB=99=E8=A6=96?= =?UTF-8?q?=E9=A0=BB=E7=B6=B2=E5=9D=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...4\345\210\240\351\231\244\346\223\215\344\275\234.md" | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git "a/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" "b/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" index 561ad2f238..054f452bf9 100644 --- "a/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" +++ "b/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" @@ -14,10 +14,15 @@ * 输入: "sea", "eat" * 输出: 2 -* 解释: 第一步将"sea"变为"ea",第二步将"eat"变为"ea" +* 解释: 第一步将"sea"变为"ea",第二步将"eat"变为"ea" -## 思路 +# 算法公开课 + +**《代码随想录》算法视频公开课:[动态规划之子序列,还是为了编辑距离做铺垫 | LeetCode:583.两个字符串的删除操(https://www.bilibili.com/video/BV1we4y157wB/),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 + + +## 思路 ### 动态规划一 本题和[动态规划:115.不同的子序列](https://programmercarl.com/0115.不同的子序列.html)相比,其实就是两个字符串都可以删除了,情况虽说复杂一些,但整体思路是不变的。 From c25a76587ec1028b0ab80607c2dcd14a15f18475 Mon Sep 17 00:00:00 2001 From: Terry Liu <102352821+Lozakaka@users.noreply.github.com> Date: Fri, 16 Jun 2023 21:23:27 -0400 Subject: [PATCH 1976/3019] =?UTF-8?q?=E6=96=B0=E5=A2=9Ejava=EF=BC=9A?= =?UTF-8?q?=E7=94=A8=E6=9C=80=E9=95=B7=E5=85=AC=E5=85=B1=E5=AD=90=E5=BA=8F?= =?UTF-8?q?=E5=88=97=E5=8F=8D=E6=8E=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增java:用最長公共子序列反推 --- ...40\351\231\244\346\223\215\344\275\234.md" | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git "a/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" "b/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" index 561ad2f238..3e225e8250 100644 --- "a/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" +++ "b/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" @@ -184,6 +184,31 @@ class Solution { } } ``` +```java +//DP - longest common subsequence (用最長公共子序列反推) +class Solution { + public int minDistance(String word1, String word2) { + char[] char1 = word1.toCharArray(); + char[] char2 = word2.toCharArray(); + + int len1 = char1.length; + int len2 = char2.length; + + int dp[][] = new int [len1 + 1][len2 + 1]; + + for(int i = 1; i <= len1; i++){ + for(int j = 1; j <= len2; j++){ + if(char1[i - 1] == char2[j - 1]) + dp[i][j] = dp[i - 1][j - 1] + 1; + else + dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]); + } + } + + return len1 + len2 - (2 * dp[len1][len2]);//和leetcode 1143只差在這一行。 + } +} +``` Python: From 517d9def4429b836bdb8e890d5f46309b0d7c0d0 Mon Sep 17 00:00:00 2001 From: Terry Liu <102352821+Lozakaka@users.noreply.github.com> Date: Sun, 18 Jun 2023 18:39:06 -0400 Subject: [PATCH 1977/3019] =?UTF-8?q?=E6=96=B0=E5=A2=9EB=E7=AB=99=E5=BD=B1?= =?UTF-8?q?=E7=89=87=E7=B6=B2=E5=9D=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增B站影片網址 --- .../0072.\347\274\226\350\276\221\350\267\235\347\246\273.md" | 2 ++ 1 file changed, 2 insertions(+) diff --git "a/problems/0072.\347\274\226\350\276\221\350\267\235\347\246\273.md" "b/problems/0072.\347\274\226\350\276\221\350\267\235\347\246\273.md" index cc4ab00cdc..703e891311 100644 --- "a/problems/0072.\347\274\226\350\276\221\350\267\235\347\246\273.md" +++ "b/problems/0072.\347\274\226\350\276\221\350\267\235\347\246\273.md" @@ -40,6 +40,8 @@ exection -> execution (插入 'u') * 0 <= word1.length, word2.length <= 500 * word1 和 word2 由小写英文字母组成 +# 算法公开课 +**《代码随想录》算法视频公开课:[动态规划终极绝杀! LeetCode:72.编辑距离](https://www.bilibili.com/video/BV1we4y157wB/),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 ## 思路 From 080dd35c79d0f4fe670ee0dd049c8422d67f94be Mon Sep 17 00:00:00 2001 From: Logen <47022821+Logenleedev@users.noreply.github.com> Date: Tue, 20 Jun 2023 08:15:43 +0800 Subject: [PATCH 1978/3019] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=A4=8D=E6=9D=82?= =?UTF-8?q?=E5=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "problems/0047.\345\205\250\346\216\222\345\210\227II.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0047.\345\205\250\346\216\222\345\210\227II.md" "b/problems/0047.\345\205\250\346\216\222\345\210\227II.md" index 6999b732dc..afede33a46 100644 --- "a/problems/0047.\345\205\250\346\216\222\345\210\227II.md" +++ "b/problems/0047.\345\205\250\346\216\222\345\210\227II.md" @@ -101,7 +101,7 @@ public: // 时间复杂度: 最差情况所有元素都是唯一的。复杂度和全排列1都是 O(n! * n) 对于 n 个元素一共有 n! 中排列方案。而对于每一个答案,我们需要 O(n) 去复制最终放到 result 数组 // 空间复杂度: O(n) 回溯树的深度取决于我们有多少个元素 ``` -* 时间复杂度: O(n) +* 时间复杂度: O(n! * n) * 空间复杂度: O(n) ## 拓展 From 346e927f6c8a98594b444233dede3bca8f6ad5eb Mon Sep 17 00:00:00 2001 From: Terry Liu <102352821+Lozakaka@users.noreply.github.com> Date: Tue, 20 Jun 2023 17:51:21 -0400 Subject: [PATCH 1979/3019] =?UTF-8?q?=E6=96=B0=E5=A2=9Ejava=E8=A7=A3?= =?UTF-8?q?=E6=B3=95=20for=20leetcode=205.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增java解法 for leetcode 5. 感覺卡哥可以提一下,其實在下一偏有提到,但是真的有關聯的這一篇沒有提到:這一題稍微改一下就能通過兩題,這一點我沒有寫在這個fork上。 --- ...36\346\226\207\345\255\220\344\270\262.md" | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git "a/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" "b/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" index e172de54d9..084b9f74e6 100644 --- "a/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" +++ "b/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" @@ -304,7 +304,38 @@ class Solution { } } ``` +LeetCode 5. Longest Palindromic Substring(LeetCode 647. 同一題的思路改一下、加一點,就能通過LeetCode 5) +```java +class Solution { + public String longestPalindrome(String s) { + //題目要求要return 最長的回文連續子串,故需要記錄當前最長的連續回文子串長度、最終起點、最終終點。 + int finalStart = 0; + int finalEnd = 0; + int finalLen = 0; + + char[] chars = s.toCharArray(); + int len = chars.length; + boolean[][] dp = new boolean[len][len]; + for (int i = len - 1; i >= 0; i--) { + for (int j = i; j < len; j++) { + if (chars[i] == chars[j] && (j - i <= 1 || dp[i + 1][j - 1])) + dp[i][j] = true; + //和LeetCode 647,差別就在這個if statement。 + //如果當前[i, j]範圍內的substring是回文子串(dp[i][j]) 且(&&) 長度大於當前要記錄的最終長度(j - i + 1 > finalLen) + //我們就更新 當前最長的連續回文子串長度、最終起點、最終終點 + if (dp[i][j] && j - i + 1 > finalLen) { + finalLen = j - i + 1; + finalStart = i; + finalEnd = j; + } + } + } + //String.substring這個method的用法是[起點, 終點),包含起點,不包含終點(左閉右開區間),故終點 + 1。 + return s.substring(finalStart, finalEnd + 1); + } +} +``` Python: From 1f31f092f1ec713a6df0f7617c39bc2107a9ba5f Mon Sep 17 00:00:00 2001 From: Ao Liu <63785048+Ao-Last@users.noreply.github.com> Date: Wed, 21 Jun 2023 17:38:00 +0800 Subject: [PATCH 1980/3019] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=200242.=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?.md=20md=E6=A0=BC=E5=BC=8F=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...5\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" | 1 + 1 file changed, 1 insertion(+) diff --git "a/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" "b/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" index 101dd6f255..4ea43947e8 100644 --- "a/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" +++ "b/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" @@ -163,6 +163,7 @@ class Solution(object): a_count = Counter(s) b_count = Counter(t) return a_count == b_count +``` Go: From b92fcc936e4515fd922e4f00ecfd0e0816f275b4 Mon Sep 17 00:00:00 2001 From: Terry Liu <102352821+Lozakaka@users.noreply.github.com> Date: Thu, 22 Jun 2023 03:13:04 -0400 Subject: [PATCH 1981/3019] =?UTF-8?q?=E8=A7=A3=E6=B1=BA=E8=B7=91=E6=9D=BF?= =?UTF-8?q?=E5=95=8F=E9=A1=8C=20+=20=E6=8F=90=E4=BE=9Bjava=E8=A7=A3?= =?UTF-8?q?=E6=B3=95(=E5=92=8C=E5=8D=A1=E5=93=A5=E9=82=8F=E8=BC=AF?= =?UTF-8?q?=E4=B8=80=E8=87=B4)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 跑版: 原本的code box 結束的```不見了,所以看不到結尾圖片。 新解法和原本JAVA解法的差異: 原版的應該是自己寫的DFS,邏輯大致一致,但還是有差異,故提供用卡哥C++ code改的版本 --- ...7.\346\267\261\346\220\234\347\211\210.md" | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git "a/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\346\267\261\346\220\234\347\211\210.md" "b/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\346\267\261\346\220\234\347\211\210.md" index 6d42162a57..c30ace1999 100644 --- "a/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\346\267\261\346\220\234\347\211\210.md" +++ "b/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\346\267\261\346\220\234\347\211\210.md" @@ -176,6 +176,48 @@ public void dfs(char[][] grid, int i, int j){ dfs(grid,i,j + 1); dfs(grid,i,j - 1); } +``` +```java +//graph - dfs (和卡哥的代碼邏輯一致) +class Solution { + boolean[][] visited; + int dir[][] = { + {0, 1}, //right + {1, 0}, //down + {-1, 0}, //up + {0, -1} //left + }; + public int numIslands(char[][] grid) { + int count = 0; + visited = new boolean[grid.length][grid[0].length]; + + for(int i = 0; i < grid.length; i++){ + for(int j = 0; j < grid[0].length; j++){ + if(visited[i][j] == false && grid[i][j] == '1'){ + count++; + dfs(grid, i, j); + } + } + } + return count; + } + + private void dfs(char[][]grid, int x, int y){ + if(visited[x][y] == true || grid[x][y] == '0') + return; + + visited[x][y] = true; + + for(int i = 0; i < 4; i++){ + int nextX = x + dir[i][0]; + int nextY = y + dir[i][1]; + if(nextX < 0 || nextY < 0 || nextX >= grid.length || nextY >= grid[0].length) + continue; + dfs(grid, nextX, nextY); + } + } +} +```

From 35a87bd56c87a642cd28f119be3814fe0e1bf63f Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Fri, 23 Jun 2023 12:14:15 -0500 Subject: [PATCH 1982/3019] =?UTF-8?q?Update=200416.=E5=88=86=E5=89=B2?= =?UTF-8?q?=E7=AD=89=E5=92=8C=E5=AD=90=E9=9B=86.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...55\211\345\222\214\345\255\220\351\233\206.md" | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git "a/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" "b/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" index 1f12931274..a1158d7eba 100644 --- "a/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" +++ "b/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" @@ -324,6 +324,21 @@ class Solution: return True return False +``` + +卡哥版(简化版) +```python +class Solution: + def canPartition(self, nums: List[int]) -> bool: + if sum(nums) % 2 != 0: + return False + target = sum(nums) // 2 + dp = [0] * (target + 1) + for num in nums: + for j in range(target, num-1, -1): + dp[j] = max(dp[j], dp[j-num] + num) + return dp[-1] == target + ``` 二维DP版 ```python From 71980306bf6f653145c0c0f0313a02bd8dd1a77f Mon Sep 17 00:00:00 2001 From: jianghongcheng <35664721+jianghongcheng@users.noreply.github.com> Date: Fri, 23 Jun 2023 12:58:24 -0500 Subject: [PATCH 1983/3019] =?UTF-8?q?Update=201049.=E6=9C=80=E5=90=8E?= =?UTF-8?q?=E4=B8=80=E5=9D=97=E7=9F=B3=E5=A4=B4=E7=9A=84=E9=87=8D=E9=87=8F?= =?UTF-8?q?II.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\264\347\232\204\351\207\215\351\207\217II.md" | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git "a/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" "b/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" index a978b80262..932029ab7a 100644 --- "a/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" +++ "b/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" @@ -238,6 +238,21 @@ class Solution: return total_sum - dp[target] - dp[target] +``` + +卡哥版(简化版) +```python +class Solution: + def lastStoneWeightII(self, stones): + total_sum = sum(stones) + target = total_sum // 2 + dp = [0] * (target + 1) + for stone in stones: + for j in range(target, stone - 1, -1): + dp[j] = max(dp[j], dp[j - stone] + stone) + return total_sum - 2* dp[-1] + + ``` 二维DP版 ```python From 33eca1635693f64d0eeb6d7c477093665dded20b Mon Sep 17 00:00:00 2001 From: Terry Liu <102352821+Lozakaka@users.noreply.github.com> Date: Sat, 24 Jun 2023 20:18:36 -0400 Subject: [PATCH 1984/3019] =?UTF-8?q?=E6=96=B0=E5=A2=9Ejava=E8=A7=A3?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 調整語言順序 2. 新增java - DFS, java - BFS解法 --- ...00\345\244\247\351\235\242\347\247\257.md" | 162 ++++++++++++++---- 1 file changed, 129 insertions(+), 33 deletions(-) diff --git "a/problems/0695.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" "b/problems/0695.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" index e5deb897d6..37a601bcf8 100644 --- "a/problems/0695.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" +++ "b/problems/0695.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" @@ -189,6 +189,135 @@ public: ``` # 其它语言版本 +## Java +### DFS +```java +// DFS +class Solution { + int[][] dir = { + {0, 1}, //right + {1, 0}, //down + {0, -1}, //left + {-1, 0} //up + }; + boolean visited[][]; + int count; + public int maxAreaOfIsland(int[][] grid) { + int res = 0; + visited = new boolean[grid.length][grid[0].length]; + for(int i = 0; i < grid.length; i++){ + for(int j = 0; j < grid[0].length; j++){ + if(visited[i][j] == false && grid[i][j] == 1){ + count = 0; + dfs(grid, i, j); + res = Math.max(res, count); + } + } + } + return res; + } + private void dfs(int[][] grid, int x, int y){ + if(visited[x][y] == true || grid[x][y] == 0) + return; + + visited[x][y] = true; + count++; + + for(int i = 0; i < 4; i++){ + int nextX = x + dir[i][0]; + int nextY = y + dir[i][1]; + + if(nextX < 0 || nextY < 0 || nextX >= grid.length || nextY >= grid[0].length) + continue; + dfs(grid, nextX, nextY); + } + } +} + + +``` +### BFS +```java +//BFS +class Solution { + int[][] dir = { + {0, 1}, {1, 0}, {0, -1}, {-1, 0} + }; + + int count; + boolean visited[][]; + + public int maxAreaOfIsland(int[][] grid) { + int res = 0; + visited = new boolean[grid.length][grid[0].length]; + + for(int i = 0; i < grid.length; i++){ + for(int j = 0; j < grid[0].length; j++){ + if(visited[i][j] == false && grid[i][j] == 1){ + count = 0; + bfs(grid, i, j); + res = Math.max(res, count); + } + } + } + return res; + } + private void bfs(int[][] grid, int x, int y){ + Queue que = new LinkedList<>(); + que.offer(x); + que.offer(y); + visited[x][y] = true; + count++; + + while(!que.isEmpty()){ + int currX = que.poll(); + int currY = que.poll(); + + for(int i = 0; i < 4; i++){ + int nextX = currX + dir[i][0]; + int nextY = currY + dir[i][1]; + + if(nextX < 0 || nextY < 0 || nextX >= grid.length || nextY >= grid[0].length) + continue; + if(visited[nextX][nextY] == false && grid[nextX][nextY] == 1){ + que.offer(nextX); + que.offer(nextY); + visited[nextX][nextY] = true; + count++; + } + } + } + } +} +``` +### DFS 優化(遇到島嶼後,就把他淹沒) +```java +//这里使用深度优先搜索 DFS 来完成本道题目。我们使用 DFS 计算一个岛屿的面积,同时维护计算过的最大的岛屿面积。同时,为了避免对岛屿重复计算,我们在 DFS 的时候对岛屿进行 “淹没” 操作,即将岛屿所占的地方置为 0。 +public int maxAreaOfIsland(int[][] grid) { + int res = 0; + for(int i = 0;i < grid.length;i++){ + for(int j = 0;j < grid[0].length;j++){ + //每遇到一个岛屿就计算这个岛屿的面积同时”淹没“这个岛屿 + if(grid[i][j] == 1){ + //每次计算一个岛屿的面积都要与res比较,维护最大的岛屿面积作为最后的答案 + res = Math.max(res,dfs(grid,i,j)); + } + } + } + return res; +} +public int dfs(int[][] grid,int i,int j){ + //搜索边界:i,j超过grid的范围或者当前元素为0,即当前所在的地方已经是海洋 + if(i < 0 || i >= grid.length || j < 0 || j >= grid[0].length || grid[i][j] == 0) return 0; + //淹没土地,防止后续被重复计算 + grid[i][j] = 0; + //递归的思路:要求当前土地(i,j)所在的岛屿的面积,则等于1加上下左右相邻的土地的总面积 + return 1 + dfs(grid,i - 1,j) + + dfs(grid,i + 1,j) + + dfs(grid,i,j + 1) + + dfs(grid,i,j - 1); +} +``` ## Python ### BFS @@ -261,39 +390,6 @@ class Solution: if 0 <= new_x < len(grid) and 0 <= new_y < len(grid[0]): self.dfs(grid, visited, new_x, new_y) ``` - - - -## Java - -这里使用深度优先搜索 DFS 来完成本道题目。我们使用 DFS 计算一个岛屿的面积,同时维护计算过的最大的岛屿面积。同时,为了避免对岛屿重复计算,我们在 DFS 的时候对岛屿进行 “淹没” 操作,即将岛屿所占的地方置为 0。 - -```java -public int maxAreaOfIsland(int[][] grid) { - int res = 0; - for(int i = 0;i < grid.length;i++){ - for(int j = 0;j < grid[0].length;j++){ - //每遇到一个岛屿就计算这个岛屿的面积同时”淹没“这个岛屿 - if(grid[i][j] == 1){ - //每次计算一个岛屿的面积都要与res比较,维护最大的岛屿面积作为最后的答案 - res = Math.max(res,dfs(grid,i,j)); - } - } - } - return res; -} -public int dfs(int[][] grid,int i,int j){ - //搜索边界:i,j超过grid的范围或者当前元素为0,即当前所在的地方已经是海洋 - if(i < 0 || i >= grid.length || j < 0 || j >= grid[0].length || grid[i][j] == 0) return 0; - //淹没土地,防止后续被重复计算 - grid[i][j] = 0; - //递归的思路:要求当前土地(i,j)所在的岛屿的面积,则等于1加上下左右相邻的土地的总面积 - return 1 + dfs(grid,i - 1,j) + - dfs(grid,i + 1,j) + - dfs(grid,i,j + 1) + - dfs(grid,i,j - 1); -} -```

From 2b3ce4453520a16bac6d65c2b3295cc65b90f00e Mon Sep 17 00:00:00 2001 From: Terry Liu <102352821+Lozakaka@users.noreply.github.com> Date: Sat, 24 Jun 2023 23:38:40 -0400 Subject: [PATCH 1985/3019] =?UTF-8?q?=E6=96=B0=E5=A2=9Ejava=E8=A7=A3?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...60\347\232\204\346\225\260\351\207\217.md" | 126 +++++++++++++++++- 1 file changed, 124 insertions(+), 2 deletions(-) diff --git "a/problems/1020.\351\243\236\345\234\260\347\232\204\346\225\260\351\207\217.md" "b/problems/1020.\351\243\236\345\234\260\347\232\204\346\225\260\351\207\217.md" index e92b2412f3..7538d774d2 100644 --- "a/problems/1020.\351\243\236\345\234\260\347\232\204\346\225\260\351\207\217.md" +++ "b/problems/1020.\351\243\236\345\234\260\347\232\204\346\225\260\351\207\217.md" @@ -149,7 +149,63 @@ public: ### Java -深度优先遍历版本: +深度优先遍历(没有终止条件 + 空間優化(淹沒島嶼,沒有使用visited數組)) +```java +//DFS +class Solution { + int count = 0; + int[][] dir ={ + {0, 1}, + {1, 0}, + {-1, 0}, + {0, -1} + }; + private void dfs(int[][] grid, int x, int y){ + if(grid[x][y] == 0) + return; + + grid[x][y] = 0; + count++; + + for(int i = 0; i < 4; i++){ + int nextX = x + dir[i][0]; + int nextY = y + dir[i][1]; + + if(nextX < 0 || nextY < 0 || nextX >= grid.length || nextY >= grid[0].length) + continue; + dfs(grid, nextX, nextY); + } + + } + + public int numEnclaves(int[][] grid) { + for(int i = 0; i < grid.length; i++){ + if(grid[i][0] == 1) + dfs(grid, i, 0); + if(grid[i][grid[0].length - 1] == 1) + dfs(grid, i, grid[0].length - 1); + } + //初始化的時候,j 的上下限有調整過,必免重複操作。 + for(int j = 1; j < grid[0].length - 1; j++){ + if(grid[0][j] == 1) + dfs(grid, 0, j); + if(grid[grid.length - 1][j] == 1) + dfs(grid, grid.length - 1, j); + } + count = 0; + + for(int i = 1; i < grid.length - 1; i++){ + for(int j = 1; j < grid[0].length - 1; j++){ + if(grid[i][j] == 1) + dfs(grid, i, j); + } + } + return count; + } +} +``` + +深度优先遍历(没有终止条件) ```java class Solution { @@ -206,7 +262,7 @@ class Solution { } ``` -广度优先遍历版本: +广度优先遍历(使用visited數組) ```java class Solution { @@ -269,6 +325,72 @@ class Solution { } ``` +廣度优先遍历(空間優化(淹沒島嶼,沒有使用visited數組)) +```java +//BFS +class Solution { + int count = 0; + int[][] dir ={ + {0, 1}, + {1, 0}, + {-1, 0}, + {0, -1} + }; + private void bfs(int[][] grid, int x, int y){ + Queue que = new LinkedList<>(); + que.offer(x); + que.offer(y); + count++; + grid[x][y] = 0; + + while(!que.isEmpty()){ + int currX = que.poll(); + int currY = que.poll(); + + for(int i = 0; i < 4; i++){ + int nextX = currX + dir[i][0]; + int nextY = currY + dir[i][1]; + + if(nextX < 0 || nextY < 0 || nextX >= grid.length || nextY >= grid[0].length) + continue; + + if(grid[nextX][nextY] == 1){ + que.offer(nextX); + que.offer(nextY); + count++; + grid[nextX][nextY] = 0; + } + } + } + } + + public int numEnclaves(int[][] grid) { + for(int i = 0; i < grid.length; i++){ + if(grid[i][0] == 1) + bfs(grid, i, 0); + if(grid[i][grid[0].length - 1] == 1) + bfs(grid, i, grid[0].length - 1); + } + for(int j = 1; j < grid[0].length; j++){ + if(grid[0][j] == 1) + bfs(grid, 0 , j); + if(grid[grid.length - 1][j] == 1) + bfs(grid, grid.length - 1, j); + } + count = 0; + for(int i = 1; i < grid.length - 1; i++){ + for(int j = 1; j < grid[0].length - 1; j++){ + if(grid[i][j] == 1) + bfs(grid,i ,j); + } + } + return count; + } +} + + +``` + ### Python 深度优先遍历 From cdc5a1e9e47690fee5c5f5b34d66f643d6e08907 Mon Sep 17 00:00:00 2001 From: Terry Liu <102352821+Lozakaka@users.noreply.github.com> Date: Mon, 26 Jun 2023 21:37:58 -0400 Subject: [PATCH 1986/3019] =?UTF-8?q?=E6=96=B0=E5=A2=9EJAVA=E8=A7=A3?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. java的BFS解法有寫一個helper function去呼叫 2. java's DFS with 終止條件 --- ...25\347\232\204\345\214\272\345\237\237.md" | 89 +++++++++++++++++++ 1 file changed, 89 insertions(+) diff --git "a/problems/0130.\350\242\253\345\233\264\347\273\225\347\232\204\345\214\272\345\237\237.md" "b/problems/0130.\350\242\253\345\233\264\347\273\225\347\232\204\345\214\272\345\237\237.md" index abb68e199c..e244873ba3 100644 --- "a/problems/0130.\350\242\253\345\233\264\347\273\225\347\232\204\345\214\272\345\237\237.md" +++ "b/problems/0130.\350\242\253\345\233\264\347\273\225\347\232\204\345\214\272\345\237\237.md" @@ -188,6 +188,54 @@ class Solution { } } ``` +```Java +//BFS(使用helper function) +class Solution { + int[][] dir ={{0, 1}, {1, 0}, {0, -1}, {-1, 0}}; + public void solve(char[][] board) { + for(int i = 0; i < board.length; i++){ + if(board[i][0] == 'O') bfs(board, i, 0); + if(board[i][board[0].length - 1] == 'O') bfs(board, i, board[0].length - 1); + } + + for(int j = 1 ; j < board[0].length - 1; j++){ + if(board[0][j] == 'O') bfs(board, 0, j); + if(board[board.length - 1][j] == 'O') bfs(board, board.length - 1, j); + } + + for(int i = 0; i < board.length; i++){ + for(int j = 0; j < board[0].length; j++){ + if(board[i][j] == 'O') board[i][j] = 'X'; + if(board[i][j] == 'A') board[i][j] = 'O'; + } + } + } + private void bfs(char[][] board, int x, int y){ + Queue que = new LinkedList<>(); + board[x][y] = 'A'; + que.offer(x); + que.offer(y); + + while(!que.isEmpty()){ + int currX = que.poll(); + int currY = que.poll(); + + for(int i = 0; i < 4; i++){ + int nextX = currX + dir[i][0]; + int nextY = currY + dir[i][1]; + + if(nextX < 0 || nextY < 0 || nextX >= board.length || nextY >= board[0].length) + continue; + if(board[nextX][nextY] == 'X'|| board[nextX][nextY] == 'A') + continue; + bfs(board, nextX, nextY); + } + } + } +} + +``` + ```Java // 深度优先遍历 // 使用 visited 数组进行标记 @@ -296,6 +344,47 @@ class Solution { } } ``` +```java +//DFS(有終止條件) +class Solution { + int[][] dir ={{0, 1}, {1, 0}, {0, -1}, {-1, 0}}; + public void solve(char[][] board) { + + for(int i = 0; i < board.length; i++){ + if(board[i][0] == 'O') dfs(board, i, 0); + if(board[i][board[0].length - 1] == 'O') dfs(board, i, board[0].length - 1); + } + + for(int j = 1 ; j < board[0].length - 1; j++){ + if(board[0][j] == 'O') dfs(board, 0, j); + if(board[board.length - 1][j] == 'O') dfs(board, board.length - 1, j); + } + + for(int i = 0; i < board.length; i++){ + for(int j = 0; j < board[0].length; j++){ + if(board[i][j] == 'O') board[i][j] = 'X'; + if(board[i][j] == 'A') board[i][j] = 'O'; + } + } + } + + private void dfs(char[][] board, int x, int y){ + if(board[x][y] == 'X'|| board[x][y] == 'A') + return; + board[x][y] = 'A'; + for(int i = 0; i < 4; i++){ + int nextX = x + dir[i][0]; + int nextY = y + dir[i][1]; + + if(nextX < 0 || nextY < 0 || nextX >= board.length || nextY >= board[0].length) + continue; + // if(board[nextX][nextY] == 'X'|| board[nextX][nextY] == 'A') + // continue; + dfs(board, nextX, nextY); + } + } +} +```

From f8f8539393813c4f4ec73427d5eb157acc641fe1 Mon Sep 17 00:00:00 2001 From: Yifan Liu <39271063+yifanliuu@users.noreply.github.com> Date: Thu, 29 Jun 2023 13:49:22 +0800 Subject: [PATCH 1987/3019] =?UTF-8?q?=E6=96=B0=E5=A2=9Epython=E8=A7=A3?= =?UTF-8?q?=E6=B3=95=E9=80=92=E5=BD=92=E7=89=88=200024.=E4=B8=A4=E4=B8=A4?= =?UTF-8?q?=E4=BA=A4=E6=8D=A2=E9=93=BE=E8=A1=A8=E4=B8=AD=E7=9A=84=E8=8A=82?= =?UTF-8?q?=E7=82=B9.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...55\347\232\204\350\212\202\347\202\271.md" | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git "a/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" "b/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" index ab204d8974..d7c03b645b 100644 --- "a/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" +++ "b/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" @@ -177,6 +177,30 @@ class Solution { ``` Python: +```python +# 递归版本 +# Definition for singly-linked list. +# class ListNode: +# def __init__(self, val=0, next=None): +# self.val = val +# self.next = next + +class Solution: + def swapPairs(self, head: Optional[ListNode]) -> Optional[ListNode]: + if head is None or head.next is None: + return head + + # 待翻转的两个node分别是pre和cur + pre = head + cur = head.next + next = head.next.next + + cur.next = pre # 交换 + pre.next = self.swapPairs(next) # 将以next为head的后续链表两两交换 + + return cur +``` + ```python # Definition for singly-linked list. # class ListNode: From 5085e78e601fa6450e80b0d5d9b060df26857dcb Mon Sep 17 00:00:00 2001 From: Leon He Date: Thu, 29 Jun 2023 11:25:27 -0700 Subject: [PATCH 1988/3019] =?UTF-8?q?Update=200200.=E5=B2=9B=E5=B1=BF?= =?UTF-8?q?=E6=95=B0=E9=87=8F.=E5=B9=BF=E6=90=9C=E7=89=88.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add python solution --- ...7.\345\271\277\346\220\234\347\211\210.md" | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git "a/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\345\271\277\346\220\234\347\211\210.md" "b/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\345\271\277\346\220\234\347\211\210.md" index 39af9f50a3..2bb0973a11 100644 --- "a/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\345\271\277\346\220\234\347\211\210.md" +++ "b/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\345\271\277\346\220\234\347\211\210.md" @@ -200,3 +200,44 @@ class Solution { +``` +### Python +BFS solution +```python +class Solution: + def __init__(self): + self.dirs = [[0, 1], [1, 0], [-1, 0], [0, -1]] + + def numIslands(self, grid: List[List[str]]) -> int: + m = len(grid) + n = len(grid[0]) + visited = [[False]*n for _ in range(m)] + res = 0 + for i in range(m): + for j in range(n): + if visited[i][j] == False and grid[i][j] == '1': + res += 1 + self.bfs(grid, i, j, visited) # Call bfs within this condition + return res + + def bfs(self, grid, i, j, visited): + q = deque() + q.append((i,j)) + visited[i][j] = True + while q: + x, y = q.popleft() + for k in range(4): + next_i = x + self.dirs[k][0] + next_j = y + self.dirs[k][1] + + if next_i < 0 or next_i >= len(grid): + continue + if next_j < 0 or next_j >= len(grid[0]): + continue + if visited[next_i][next_j]: + continue + if grid[next_i][next_j] == '0': + continue + q.append((next_i, next_j)) + visited[next_i][next_j] = True +``` From 6cd9b165290298868b6b86ca88693c5b77408841 Mon Sep 17 00:00:00 2001 From: Terry Liu <102352821+Lozakaka@users.noreply.github.com> Date: Thu, 29 Jun 2023 16:56:19 -0400 Subject: [PATCH 1989/3019] =?UTF-8?q?=E6=96=B0=E5=A2=9Ejava=20DFS=E8=A7=A3?= =?UTF-8?q?=E6=B3=95=E7=95=B6=E4=BD=9C=E5=BB=B6=E4=BC=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...77\347\232\204\345\221\250\351\225\277.md" | 47 +++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git "a/problems/0463.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" "b/problems/0463.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" index 2f399f4016..18f1d01eb2 100644 --- "a/problems/0463.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" +++ "b/problems/0463.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" @@ -142,6 +142,53 @@ class Solution { return landSum * 4 - cover * 2; } } +// 延伸 - 傳統DFS解法(使用visited數組)(遇到邊界 或是 海水 就edge ++) +class Solution { + int dir[][] ={ + {0, 1}, + {0, -1}, + {1, 0}, + {-1, 0} + }; + + boolean visited[][]; + int res = 0; + + public int islandPerimeter(int[][] grid) { + int row = grid.length; + int col = grid[0].length; + visited = new boolean[row][col]; + + int result = 0; + + for(int i = 0; i < row; i++){ + for(int j = 0; j < col; j++){ + if(visited[i][j] == false && grid[i][j] == 1) + result += dfs(grid, i, j); + } + } + return result; + } + + private int dfs(int[][] grid, int x, int y){ + //如果遇到 邊界(x < 0 || y < 0 || x >= grid.length || y >= grid[0].length)或是 遇到海水(grid[x][y] == 0)就return 1(edge + 1) + if(x < 0 || y < 0 || x >= grid.length || y >= grid[0].length || grid[x][y] == 0) + return 1; + //如果該地已經拜訪過,就return 0 避免重複計算 + if(visited[x][y]) + return 0; + int temp = 0; + visited[x][y] = true; + for(int i = 0; i < 4; i++){ + int nextX = x + dir[i][0]; + int nextY = y + dir[i][1]; + //用temp 把edge存起來 + temp +=dfs(grid, nextX, nextY); + } + return temp; + } +} + ``` Python: From c1b2141ea20e58b031c874f55c341fbfc8b69470 Mon Sep 17 00:00:00 2001 From: fwqaaq Date: Fri, 30 Jun 2023 10:22:49 +0800 Subject: [PATCH 1990/3019] =?UTF-8?q?Update=200123.=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?III.md=20about=20rust?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...344\275\263\346\227\266\346\234\272III.md" | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git "a/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" "b/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" index 6ac9a576ea..f5b959460a 100644 --- "a/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" +++ "b/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" @@ -413,7 +413,34 @@ function maxProfit(prices: number[]): number { }; ``` +Rust: +> 版本一 + +```rust +impl Solution { + pub fn max_profit(prices: Vec) -> i32 { + /* + * 定义 5 种状态: + * 0: 没有操作, 1: 第一次买入, 2: 第一次卖出, 3: 第二次买入, 4: 第二次卖出 + */ + let mut dp = vec![vec![0; 5]; prices.len()]; + dp[0][1] = -prices[0]; + dp[0][3] = -prices[0]; + + for (i, &p) in prices.iter().enumerate().skip(1) { + // 不操作 + // dp[i][0] = dp[i - 1][0]; + dp[i][1] = dp[i - 1][1].max(-p); + dp[i][2] = dp[i - 1][2].max(dp[i - 1][1] + p); + dp[i][3] = dp[i - 1][3].max(dp[i - 1][2] - p); + dp[i][4] = dp[i - 1][4].max(dp[i - 1][3] + p); + } + + dp[prices.len() - 1][4] + } +} +```

From 85daaae4656f0411eab2e1ec6ff1bbfa608120c1 Mon Sep 17 00:00:00 2001 From: fwqaaq Date: Fri, 30 Jun 2023 10:31:32 +0800 Subject: [PATCH 1991/3019] =?UTF-8?q?Update=200123.=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?III.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\344\275\263\346\227\266\346\234\272III.md" | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git "a/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" "b/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" index f5b959460a..7286e95770 100644 --- "a/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" +++ "b/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" @@ -442,6 +442,24 @@ impl Solution { } ``` +> 版本二(绕) + +```rust +impl Solution { + pub fn max_profit(prices: Vec) -> i32 { + let mut dp = vec![0, -prices[0], 0, -prices[0], 0]; + + for p in prices { + dp[1] = dp[1].max(-p); + dp[2] = dp[2].max(dp[1] + p); + dp[3] = dp[3].max(dp[2] - p); + dp[4] = dp[4].max(dp[3] + p); + } + dp[4] + } +} +``` +

From 2444c084b15fce271ac3639bca32bc579c594ad1 Mon Sep 17 00:00:00 2001 From: fwqaaq Date: Fri, 30 Jun 2023 11:33:23 +0800 Subject: [PATCH 1992/3019] =?UTF-8?q?Update=200188.=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?IV.md=20about=20rust?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\344\275\263\346\227\266\346\234\272IV.md" | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git "a/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" "b/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" index 5bed5ecc5d..8cfb4c1b5b 100644 --- "a/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" +++ "b/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" @@ -439,6 +439,28 @@ function maxProfit(k: number, prices: number[]): number { }; ``` +Rust: + +```rust +impl Solution { + pub fn max_profit(k: i32, prices: Vec) -> i32 { + let mut dp = vec![vec![0; 2 * k as usize + 1]; prices.len()]; + + for v in dp[0].iter_mut().skip(1).step_by(2) { + *v = -prices[0]; + } + + for (i, &p) in prices.iter().enumerate().skip(1) { + for j in (0..2 * k as usize - 1).step_by(2) { + dp[i][j + 1] = dp[i - 1][j + 1].max(dp[i - 1][j] - p); + dp[i][j + 2] = dp[i - 1][j + 2].max(dp[i - 1][j + 1] + p); + } + } + + dp[prices.len() - 1][2 * k as usize] + } +} +```

From 7d92df37eb7aca18042512789a286ec4eec3123a Mon Sep 17 00:00:00 2001 From: fwqaaq Date: Fri, 30 Jun 2023 12:36:36 +0800 Subject: [PATCH 1993/3019] =?UTF-8?q?Update=200309.=E6=9C=80=E4=BD=B3?= =?UTF-8?q?=E4=B9=B0=E5=8D=96=E8=82=A1=E7=A5=A8=E6=97=B6=E6=9C=BA=E5=90=AB?= =?UTF-8?q?=E5=86=B7=E5=86=BB=E6=9C=9F.md=20about=20rust?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...53\345\206\267\345\206\273\346\234\237.md" | 24 ++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git "a/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" "b/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" index d10e61b77a..cd71136ba6 100644 --- "a/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" +++ "b/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" @@ -455,7 +455,29 @@ function maxProfit(prices: number[]): number { }; ``` - +Rust: + +```rust +impl Solution { + pub fn max_profit(prices: Vec) -> i32 { + /* + * dp[i][0]: 持股状态; + * dp[i][1]: 无股状态,当天为非冷冻期; + * dp[i][2]: 无股状态,当天卖出; + * dp[i][3]: 无股状态,当天为冷冻期; + */ + let mut dp = vec![vec![0; 4]; prices.len()]; + dp[0][0] = -prices[0]; + for (i, &p) in prices.iter().enumerate().skip(1) { + dp[i][0] = dp[i - 1][0].max((dp[i - 1][3] - p).max(dp[i - 1][1] - p)); + dp[i][1] = dp[i - 1][1].max(dp[i - 1][3]); + dp[i][2] = dp[i - 1][0] + p; + dp[i][3] = dp[i - 1][2]; + } + *dp[prices.len() - 1].iter().skip(1).max().unwrap() + } +} +```

From e563783a71fe3de6564c7c01e8ffbfc961f3efee Mon Sep 17 00:00:00 2001 From: fwqaaq Date: Fri, 30 Jun 2023 12:52:41 +0800 Subject: [PATCH 1994/3019] =?UTF-8?q?Update=200714.=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?=E5=90=AB=E6=89=8B=E7=BB=AD=E8=B4=B9=EF=BC=88=E5=8A=A8=E6=80=81?= =?UTF-8?q?=E8=A7=84=E5=88=92=EF=BC=89.md=20=E4=BC=98=E5=8C=96=20Rust?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...01\350\247\204\345\210\222\357\274\211.md" | 29 +++++++++++++------ 1 file changed, 20 insertions(+), 9 deletions(-) diff --git "a/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" "b/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" index 1443f14710..9aa82d4ab2 100644 --- "a/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" +++ "b/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" @@ -270,18 +270,29 @@ impl Solution { **动态规划** ```Rust impl Solution { - fn max(a: i32, b: i32) -> i32 { - if a > b { a } else { b } + pub fn max_profit(prices: Vec, fee: i32) -> i32 { + let mut dp = vec![vec![0; 2]; prices.len()]; + dp[0][0] = -prices[0]; + for (i, &p) in prices.iter().enumerate().skip(1) { + dp[i][0] = dp[i - 1][0].max(dp[i - 1][1] - p); + dp[i][1] = dp[i - 1][1].max(dp[i - 1][0] + p - fee); + } + dp[prices.len() - 1][1] } +} +``` + +**动态规划优化** + +```rust +impl Solution { pub fn max_profit(prices: Vec, fee: i32) -> i32 { - let n = prices.len(); - let mut dp = vec![vec![0; 2]; n]; - dp[0][0] -= prices[0]; - for i in 1..n { - dp[i][0] = Self::max(dp[i - 1][0], dp[i - 1][1] - prices[i]); - dp[i][1] = Self::max(dp[i - 1][1], dp[i - 1][0] + prices[i] - fee); + let (mut low, mut res) = (-prices[0], 0); + for p in prices { + low = low.max(res - p); + res = res.max(p + low - fee); } - Self::max(dp[n - 1][0], dp[n - 1][1]) + res } } ``` From e452f183adde4732da370e14dc0379ebffd0bdbe Mon Sep 17 00:00:00 2001 From: fwqaaq Date: Fri, 30 Jun 2023 13:14:26 +0800 Subject: [PATCH 1995/3019] =?UTF-8?q?Update=200123.=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?III.md=20=E4=BD=BF=E7=94=A8=E5=85=83=E7=A5=96=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E5=91=BD=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...34\200\344\275\263\346\227\266\346\234\272III.md" | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git "a/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" "b/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" index 7286e95770..a646b7d517 100644 --- "a/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" +++ "b/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" @@ -447,15 +447,15 @@ impl Solution { ```rust impl Solution { pub fn max_profit(prices: Vec) -> i32 { - let mut dp = vec![0, -prices[0], 0, -prices[0], 0]; + let (mut one_buy, mut one_sale, mut two_buy, mut two_sale) = (-prices[0], 0, -prices[0], 0); for p in prices { - dp[1] = dp[1].max(-p); - dp[2] = dp[2].max(dp[1] + p); - dp[3] = dp[3].max(dp[2] - p); - dp[4] = dp[4].max(dp[3] + p); + one_buy = one_buy.max(-p); + one_sale = one_sale.max(p + one_buy); + two_buy = two_buy.max(one_sale - p); + two_sale = two_sale.max(two_buy + p); } - dp[4] + two_sale } } ``` From 53f077dc13f8a0076c94bd7db7bbeccd4815a9ff Mon Sep 17 00:00:00 2001 From: fwqaaq Date: Fri, 30 Jun 2023 13:15:33 +0800 Subject: [PATCH 1996/3019] Apply suggestions from code review --- ...\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" "b/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" index 9aa82d4ab2..042de94718 100644 --- "a/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" +++ "b/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" @@ -282,7 +282,7 @@ impl Solution { } ``` -**动态规划优化** +**动态规划空间优化** ```rust impl Solution { From c4a7033e50a8713808654ac4b179ca4883b4998f Mon Sep 17 00:00:00 2001 From: fwqaaq Date: Fri, 30 Jun 2023 13:45:44 +0800 Subject: [PATCH 1997/3019] =?UTF-8?q?Update=200188.=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?IV.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\344\275\263\346\227\266\346\234\272IV.md" | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git "a/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" "b/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" index 8cfb4c1b5b..fb1a689811 100644 --- "a/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" +++ "b/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" @@ -462,6 +462,33 @@ impl Solution { } ``` +空间优化: + +```rust +impl Solution { + pub fn max_profit(k: i32, prices: Vec) -> i32 { + let mut dp = vec![0; 2 * k as usize + 1]; + for v in dp.iter_mut().skip(1).step_by(2) { + *v = -prices[0]; + } + + for p in prices { + for i in 1..=2 * k as usize { + if i % 2 == 1 { + // 买入 + dp[i] = dp[i].max(dp[i - 1] - p); + continue; + } + // 卖出 + dp[i] = dp[i].max(dp[i - 1] + p); + } + } + + dp[2 * k as usize] + } +} +``` +

From d945a304c49f4f41de91b2794b35de0c5f79110b Mon Sep 17 00:00:00 2001 From: Binbin Date: Mon, 3 Jul 2023 19:29:44 +0800 Subject: [PATCH 1998/3019] =?UTF-8?q?=E9=94=99=E5=88=AB=E5=AD=97=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=EF=BC=9Arecode=20->=20record?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "problems/0383.\350\265\216\351\207\221\344\277\241.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/problems/0383.\350\265\216\351\207\221\344\277\241.md" "b/problems/0383.\350\265\216\351\207\221\344\277\241.md" index e74cdf71fd..70501469d8 100644 --- "a/problems/0383.\350\265\216\351\207\221\344\277\241.md" +++ "b/problems/0383.\350\265\216\351\207\221\344\277\241.md" @@ -88,7 +88,7 @@ public: return false; } for (int i = 0; i < magazine.length(); i++) { - // 通过recode数据记录 magazine里各个字符出现次数 + // 通过record数据记录 magazine里各个字符出现次数 record[magazine[i]-'a'] ++; } for (int j = 0; j < ransomNote.length(); j++) { @@ -218,7 +218,7 @@ Go: ```go func canConstruct(ransomNote string, magazine string) bool { record := make([]int, 26) - for _, v := range magazine { // 通过recode数据记录 magazine里各个字符出现次数 + for _, v := range magazine { // 通过record数据记录 magazine里各个字符出现次数 record[v-'a']++ } for _, v := range ransomNote { // 遍历ransomNote,在record里对应的字符个数做--操作 From dacd1a91d4c4cfeeeebd77b3840118f1ba61e02d Mon Sep 17 00:00:00 2001 From: ZKkkk Date: Tue, 4 Jul 2023 19:46:00 +0800 Subject: [PATCH 1999/3019] =?UTF-8?q?Update=201221.=E5=88=86=E5=89=B2?= =?UTF-8?q?=E5=B9=B3=E8=A1=A1=E5=AD=97=E7=AC=A6=E4=B8=B2.md=20about=20Type?= =?UTF-8?q?Script?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...41\241\345\255\227\347\254\246\344\270\262.md" | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git "a/problems/1221.\345\210\206\345\211\262\345\271\263\350\241\241\345\255\227\347\254\246\344\270\262.md" "b/problems/1221.\345\210\206\345\211\262\345\271\263\350\241\241\345\255\227\347\254\246\344\270\262.md" index b587514a41..2a7b092290 100644 --- "a/problems/1221.\345\210\206\345\211\262\345\271\263\350\241\241\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/1221.\345\210\206\345\211\262\345\271\263\350\241\241\345\255\227\347\254\246\344\270\262.md" @@ -156,6 +156,21 @@ var balancedStringSplit = function(s) { }; ``` +### TypeScript + +```ts +function balancedStringSplit(s: string): number { + let count: number = 0 + let res: number = 0 + for(let i of s){ + if(i === 'R') count++ + else count-- + if(count === 0) res++ + } + + return res +}; +```

From 4fe73f30dc793ace07e15b23ff0956eb221c5856 Mon Sep 17 00:00:00 2001 From: life <13122192336@163.com> Date: Wed, 5 Jul 2023 14:18:55 +0800 Subject: [PATCH 2000/3019] =?UTF-8?q?=E4=B9=A6=E5=86=99=E9=94=99=E8=AF=AF?= =?UTF-8?q?=EF=BC=8Cnull=E5=86=99=E6=88=90=E4=BA=86nullptr?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" "b/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" index 3d73598da9..28c5a4c037 100644 --- "a/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" +++ "b/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" @@ -51,7 +51,7 @@ TreeNode* deleteNode(TreeNode* root, int key) 遇到空返回,其实这也说明没找到删除的节点,遍历到空节点直接返回了 ``` -if (root == nullptr) return root; +if (root == null) return root; ``` * 确定单层递归的逻辑 From 751ba68faa3d16b45fce13e0ada8aac58d24e719 Mon Sep 17 00:00:00 2001 From: life <13122192336@163.com> Date: Wed, 5 Jul 2023 14:35:56 +0800 Subject: [PATCH 2001/3019] =?UTF-8?q?null=E5=86=99=E6=88=90=E4=BA=86nullpt?= =?UTF-8?q?r?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...55\347\232\204\350\212\202\347\202\271.md" | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git "a/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" "b/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" index 28c5a4c037..48737486d0 100644 --- "a/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" +++ "b/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" @@ -85,14 +85,14 @@ if (root == null) return root; if (root->val == key) { // 第二种情况:左右孩子都为空(叶子节点),直接删除节点, 返回NULL为根节点 // 第三种情况:其左孩子为空,右孩子不为空,删除节点,右孩子补位 ,返回右孩子为根节点 - if (root->left == nullptr) return root->right; + if (root->left == null) return root->right; // 第四种情况:其右孩子为空,左孩子不为空,删除节点,左孩子补位,返回左孩子为根节点 - else if (root->right == nullptr) return root->left; + else if (root->right == null) return root->left; // 第五种情况:左右孩子节点都不为空,则将删除节点的左子树放到删除节点的右子树的最左面节点的左孩子的位置 // 并返回删除节点右孩子为新的根节点。 else { TreeNode* cur = root->right; // 找右子树最左面的节点 - while(cur->left != nullptr) { + while(cur->left != null) { cur = cur->left; } cur->left = root->left; // 把要删除的节点(root)左子树放在cur的左孩子的位置 @@ -118,23 +118,23 @@ return root; class Solution { public: TreeNode* deleteNode(TreeNode* root, int key) { - if (root == nullptr) return root; // 第一种情况:没找到删除的节点,遍历到空节点直接返回了 + if (root == null) return root; // 第一种情况:没找到删除的节点,遍历到空节点直接返回了 if (root->val == key) { // 第二种情况:左右孩子都为空(叶子节点),直接删除节点, 返回NULL为根节点 - if (root->left == nullptr && root->right == nullptr) { + if (root->left == null && root->right == null) { ///! 内存释放 delete root; - return nullptr; + return null; } // 第三种情况:其左孩子为空,右孩子不为空,删除节点,右孩子补位 ,返回右孩子为根节点 - else if (root->left == nullptr) { + else if (root->left == null) { auto retNode = root->right; ///! 内存释放 delete root; return retNode; } // 第四种情况:其右孩子为空,左孩子不为空,删除节点,左孩子补位,返回左孩子为根节点 - else if (root->right == nullptr) { + else if (root->right == null) { auto retNode = root->left; ///! 内存释放 delete root; @@ -144,7 +144,7 @@ public: // 并返回删除节点右孩子为新的根节点。 else { TreeNode* cur = root->right; // 找右子树最左面的节点 - while(cur->left != nullptr) { + while(cur->left != null) { cur = cur->left; } cur->left = root->left; // 把要删除的节点(root)左子树放在cur的左孩子的位置 @@ -178,9 +178,9 @@ public: class Solution { public: TreeNode* deleteNode(TreeNode* root, int key) { - if (root == nullptr) return root; + if (root == null) return root; if (root->val == key) { - if (root->right == nullptr) { // 这里第二次操作目标值:最终删除的作用 + if (root->right == null) { // 这里第二次操作目标值:最终删除的作用 return root->left; } TreeNode *cur = root->right; @@ -211,8 +211,8 @@ private: // 并返回目标节点右孩子为新的根节点 // 是动画里模拟的过程 TreeNode* deleteOneNode(TreeNode* target) { - if (target == nullptr) return target; - if (target->right == nullptr) return target->left; + if (target == null) return target; + if (target->right == null) return target->left; TreeNode* cur = target->right; while (cur->left) { cur = cur->left; @@ -222,16 +222,16 @@ private: } public: TreeNode* deleteNode(TreeNode* root, int key) { - if (root == nullptr) return root; + if (root == null) return root; TreeNode* cur = root; - TreeNode* pre = nullptr; // 记录cur的父节点,用来删除cur + TreeNode* pre = null; // 记录cur的父节点,用来删除cur while (cur) { if (cur->val == key) break; pre = cur; if (cur->val > key) cur = cur->left; else cur = cur->right; } - if (pre == nullptr) { // 如果搜索树只有头结点 + if (pre == null) { // 如果搜索树只有头结点 return deleteOneNode(cur); } // pre 要知道是删左孩子还是右孩子 From d7753b31b6f66def80719e82cb7d8ddef3056a7e Mon Sep 17 00:00:00 2001 From: Liu Yongliang <41845017+tlylt@users.noreply.github.com> Date: Thu, 6 Jul 2023 23:14:49 +0800 Subject: [PATCH 2002/3019] =?UTF-8?q?Update=201002.=E6=9F=A5=E6=89=BE?= =?UTF-8?q?=E5=B8=B8=E7=94=A8=E5=AD=97=E7=AC=A6.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit fix formatting --- ...6\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md" | 1 + 1 file changed, 1 insertion(+) diff --git "a/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md" "b/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md" index 9ec3c6c4e8..a53148b313 100644 --- "a/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md" +++ "b/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md" @@ -16,6 +16,7 @@ 输入:words = ["bella","label","roller"] 输出:["e","l","l"] + 示例 2: 输入:words = ["cool","lock","cook"] From 873257dcd812b1d190f9decbf0fed64761d23933 Mon Sep 17 00:00:00 2001 From: Liu Yongliang <41845017+tlylt@users.noreply.github.com> Date: Sat, 8 Jul 2023 07:25:59 +0800 Subject: [PATCH 2003/3019] =?UTF-8?q?Update=200001.=E4=B8=A4=E6=95=B0?= =?UTF-8?q?=E4=B9=8B=E5=92=8C.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fix Python solution comment --- .../0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" "b/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" index ca62e3edc2..438fa352f8 100644 --- "a/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" @@ -160,7 +160,7 @@ class Solution: for index, value in enumerate(nums): if target - value in records: # 遍历当前元素,并在map中寻找是否有匹配的key return [records[target- value], index] - records[value] = index # 遍历当前元素,并在map中寻找是否有匹配的key + records[value] = index # 如果没找到匹配对,就把访问过的元素和下标加入到map中 return [] ``` (版本二)使用集合 From dba8820427c64b66add3b7ad053226e7d9943e53 Mon Sep 17 00:00:00 2001 From: Zhipeng Xu Date: Sat, 8 Jul 2023 10:43:24 +0800 Subject: [PATCH 2004/3019] =?UTF-8?q?Update=200739.=E6=AF=8F=E6=97=A5?= =?UTF-8?q?=E6=B8=A9=E5=BA=A6.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...17\346\227\245\346\270\251\345\272\246.md" | 22 ++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git "a/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" "b/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" index 749dc97235..d2da37371a 100644 --- "a/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" +++ "b/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" @@ -455,7 +455,27 @@ function dailyTemperatures(temperatures: number[]): number[] { }; ``` - +Rust: + +```rust +impl Solution { + /// 单调栈的本质是以空间换时间,记录之前已访问过的非递增子序列下标 + pub fn daily_temperatures(temperatures: Vec) -> Vec { + let mut res = vec![0; temperatures.len()]; + let mut stack = vec![]; + for (idx, &value) in temperatures.iter().enumerate() { + while !stack.is_empty() && temperatures[*stack.last().unwrap()] < value { + // 弹出,并计算res中对应位置的值 + let i = stack.pop().unwrap(); + res[i] = (idx - i) as i32; + } + // 入栈 + stack.push(idx) + } + res + } +} +```

From 965afc9af3dc5c0fb8932937770f8395c98b7b86 Mon Sep 17 00:00:00 2001 From: life <13122192336@163.com> Date: Sat, 8 Jul 2023 17:20:21 +0800 Subject: [PATCH 2005/3019] =?UTF-8?q?=E4=BF=AE=E6=94=B9java=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E8=A7=A3=E6=B3=95=E7=9A=84=E4=BD=8D=E7=BD=AE=EF=BC=8C?= =?UTF-8?q?=E9=80=82=E5=90=88=E5=9B=BE=E7=9A=84=E8=A7=A3=E6=B3=95=E6=94=BE?= =?UTF-8?q?=E5=9C=A8=E7=AC=AC=E4=B8=80=E4=B8=AA=EF=BC=8C=E7=AC=AC=E4=BA=8C?= =?UTF-8?q?=E4=B8=AA=E8=A7=A3=E6=B3=95=EF=BC=88=E9=9A=BE=E7=90=86=E8=A7=A3?= =?UTF-8?q?=E7=89=88=E6=9C=AC=EF=BC=89=E6=94=BE=E5=9C=A8=E5=85=B6=E5=90=8E?= =?UTF-8?q?=EF=BC=8C=E6=96=B0=E5=A2=9Ejava=E7=89=88=E6=9C=AC=E7=9A=84?= =?UTF-8?q?=E8=BF=AD=E4=BB=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...55\347\232\204\350\212\202\347\202\271.md" | 86 +++++++++++++++---- 1 file changed, 69 insertions(+), 17 deletions(-) diff --git "a/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" "b/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" index 48737486d0..d13c48e529 100644 --- "a/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" +++ "b/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" @@ -268,6 +268,34 @@ public: ## Java +```java +// 解法1(最好理解的版本) +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; + } +} +``` + + ```java class Solution { public TreeNode deleteNode(TreeNode root, int key) { @@ -296,33 +324,57 @@ 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 == null){ + return null; + } + //寻找对应的对应的前面的节点,以及他的前一个节点 + TreeNode cur = root; + TreeNode pre = null; + while (cur != null){ + if (cur.val < key){ + pre = cur; + cur = cur.right; + } else if (cur.val > key) { + pre = cur; + cur = cur.left; + }else { + break; } } - if (root.val > key) root.left = deleteNode(root.left, key); - if (root.val < key) root.right = deleteNode(root.right, key); + if (pre == null){ + return deleteOneNode(cur); + } + if (pre.left !=null && pre.left.val == key){ + pre.left = deleteOneNode(cur); + } + if (pre.right !=null && pre.right.val == key){ + pre.right = deleteOneNode(cur); + } return root; } + + public TreeNode deleteOneNode(TreeNode node){ + if (node == null){ + return null; + } + if (node.right == null){ + return node.left; + } + TreeNode cur = node.right; + while (cur.left !=null){ + cur = cur.left; + } + cur.left = node.left; + return node.right; + } } ``` + ## Python 递归法(版本一) ```python From 0fd7b04d5c0fac9a760af96d2d5de7f5beaeb896 Mon Sep 17 00:00:00 2001 From: life <13122192336@163.com> Date: Sat, 8 Jul 2023 17:42:19 +0800 Subject: [PATCH 2006/3019] =?UTF-8?q?=E6=92=A4=E5=9B=9E=E4=B9=8B=E5=89=8D?= =?UTF-8?q?=E7=9A=84nullptr?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...55\347\232\204\350\212\202\347\202\271.md" | 34 +++++++++---------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git "a/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" "b/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" index d13c48e529..e617cc69b6 100644 --- "a/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" +++ "b/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" @@ -51,7 +51,7 @@ TreeNode* deleteNode(TreeNode* root, int key) 遇到空返回,其实这也说明没找到删除的节点,遍历到空节点直接返回了 ``` -if (root == null) return root; +if (root == nullptr) return root; ``` * 确定单层递归的逻辑 @@ -85,14 +85,14 @@ if (root == null) return root; if (root->val == key) { // 第二种情况:左右孩子都为空(叶子节点),直接删除节点, 返回NULL为根节点 // 第三种情况:其左孩子为空,右孩子不为空,删除节点,右孩子补位 ,返回右孩子为根节点 - if (root->left == null) return root->right; + if (root->left == nullptr) return root->right; // 第四种情况:其右孩子为空,左孩子不为空,删除节点,左孩子补位,返回左孩子为根节点 - else if (root->right == null) return root->left; + else if (root->right == nullptr) return root->left; // 第五种情况:左右孩子节点都不为空,则将删除节点的左子树放到删除节点的右子树的最左面节点的左孩子的位置 // 并返回删除节点右孩子为新的根节点。 else { TreeNode* cur = root->right; // 找右子树最左面的节点 - while(cur->left != null) { + while(cur->left != nullptr) { cur = cur->left; } cur->left = root->left; // 把要删除的节点(root)左子树放在cur的左孩子的位置 @@ -118,23 +118,23 @@ return root; class Solution { public: TreeNode* deleteNode(TreeNode* root, int key) { - if (root == null) return root; // 第一种情况:没找到删除的节点,遍历到空节点直接返回了 + if (root == nullptr) return root; // 第一种情况:没找到删除的节点,遍历到空节点直接返回了 if (root->val == key) { // 第二种情况:左右孩子都为空(叶子节点),直接删除节点, 返回NULL为根节点 - if (root->left == null && root->right == null) { + if (root->left == nullptr && root->right == nullptr) { ///! 内存释放 delete root; - return null; + return nullptr; } // 第三种情况:其左孩子为空,右孩子不为空,删除节点,右孩子补位 ,返回右孩子为根节点 - else if (root->left == null) { + else if (root->left == nullptr) { auto retNode = root->right; ///! 内存释放 delete root; return retNode; } // 第四种情况:其右孩子为空,左孩子不为空,删除节点,左孩子补位,返回左孩子为根节点 - else if (root->right == null) { + else if (root->right == nullptr) { auto retNode = root->left; ///! 内存释放 delete root; @@ -144,7 +144,7 @@ public: // 并返回删除节点右孩子为新的根节点。 else { TreeNode* cur = root->right; // 找右子树最左面的节点 - while(cur->left != null) { + while(cur->left != nullptr) { cur = cur->left; } cur->left = root->left; // 把要删除的节点(root)左子树放在cur的左孩子的位置 @@ -178,9 +178,9 @@ public: class Solution { public: TreeNode* deleteNode(TreeNode* root, int key) { - if (root == null) return root; + if (root == nullptr) return root; if (root->val == key) { - if (root->right == null) { // 这里第二次操作目标值:最终删除的作用 + if (root->right == nullptr) { // 这里第二次操作目标值:最终删除的作用 return root->left; } TreeNode *cur = root->right; @@ -211,8 +211,8 @@ private: // 并返回目标节点右孩子为新的根节点 // 是动画里模拟的过程 TreeNode* deleteOneNode(TreeNode* target) { - if (target == null) return target; - if (target->right == null) return target->left; + if (target == nullptr) return target; + if (target->right == nullptr) return target->left; TreeNode* cur = target->right; while (cur->left) { cur = cur->left; @@ -222,16 +222,16 @@ private: } public: TreeNode* deleteNode(TreeNode* root, int key) { - if (root == null) return root; + if (root == nullptr) return root; TreeNode* cur = root; - TreeNode* pre = null; // 记录cur的父节点,用来删除cur + TreeNode* pre = nullptr; // 记录cur的父节点,用来删除cur while (cur) { if (cur->val == key) break; pre = cur; if (cur->val > key) cur = cur->left; else cur = cur->right; } - if (pre == null) { // 如果搜索树只有头结点 + if (pre == nullptr) { // 如果搜索树只有头结点 return deleteOneNode(cur); } // pre 要知道是删左孩子还是右孩子 From 1c7b15bbbc224e37f9341161f31a94cebe73dfb0 Mon Sep 17 00:00:00 2001 From: Zhipeng Xu Date: Sat, 8 Jul 2023 18:26:09 +0800 Subject: [PATCH 2007/3019] =?UTF-8?q?Update=200496.=E4=B8=8B=E4=B8=80?= =?UTF-8?q?=E4=B8=AA=E6=9B=B4=E5=A4=A7=E5=85=83=E7=B4=A0I.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...4\345\244\247\345\205\203\347\264\240I.md" | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git "a/problems/0496.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240I.md" "b/problems/0496.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240I.md" index 31c3ce4387..411a47df9b 100644 --- "a/problems/0496.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240I.md" +++ "b/problems/0496.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240I.md" @@ -387,6 +387,32 @@ function nextGreaterElement(nums1: number[], nums2: number[]): number[] { }; ``` +Rust + +```rust +impl Solution { + pub fn next_greater_element(nums1: Vec, nums2: Vec) -> Vec { + let mut ans = vec![-1; nums1.len()]; + use std::collections::HashMap; + let mut map = HashMap::new(); + for (idx, &i) in nums1.iter().enumerate() { + map.insert(i, idx); + } + let mut stack = vec![]; + for (idx, &i) in nums2.iter().enumerate() { + while !stack.is_empty() && nums2[*stack.last().unwrap()] < i { + let pos = stack.pop().unwrap(); + if let Some(&jdx) = map.get(&nums2[pos]) { + ans[jdx] = i; + } + } + stack.push(idx); + } + ans + } +} +``` +

From 85e2b18a1d9f5eba4704a3b585524ea54bc73c7d Mon Sep 17 00:00:00 2001 From: Zhipeng Xu Date: Sat, 8 Jul 2023 20:38:47 +0800 Subject: [PATCH 2008/3019] =?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 --- ...4\345\244\247\345\205\203\347\264\240II.md" | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git "a/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" "b/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" index 3fd4b3b6db..a090f32c3e 100644 --- "a/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" +++ "b/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" @@ -266,6 +266,24 @@ function nextGreaterElements(nums: number[]): number[] { }; ``` +Rust +```rust +impl Solution { + pub fn next_greater_elements(nums: Vec) -> Vec { + let mut ans = vec![-1; nums.len() * 2]; + let mut stack = vec![]; + let double = nums.repeat(2); + for (idx, &i) in double.iter().enumerate() { + while !stack.is_empty() && double[*stack.last().unwrap()] < i { + let pos = stack.pop().unwrap(); + ans[pos] = i; + } + stack.push(idx); + } + ans.into_iter().take(nums.len()).collect() + } +} +```

From 6e7e5e0fae032918f5288e86c177c3e40916c6e0 Mon Sep 17 00:00:00 2001 From: Zhipeng Xu Date: Sat, 8 Jul 2023 22:13:12 +0800 Subject: [PATCH 2009/3019] =?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 --- ...2.\346\216\245\351\233\250\346\260\264.md" | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git "a/problems/0042.\346\216\245\351\233\250\346\260\264.md" "b/problems/0042.\346\216\245\351\233\250\346\260\264.md" index db66095da2..833a7613e2 100644 --- "a/problems/0042.\346\216\245\351\233\250\346\260\264.md" +++ "b/problems/0042.\346\216\245\351\233\250\346\260\264.md" @@ -926,6 +926,56 @@ int trap(int* height, int heightSize) { * 空间复杂度 O(1) +Rust + +双指针 + +```rust +impl Solution { + pub fn trap(height: Vec) -> i32 { + let n = height.len(); + let mut max_left = vec![0; height.len()]; + let mut max_right = vec![0; height.len()]; + max_left.iter_mut().zip(max_right.iter_mut().rev()).enumerate().fold((0, 0), |(lm, rm), (idx, (x, y))| { + let lmax = lm.max(height[idx]); + let rmax = rm.max(height[n - 1 - idx]); + *x = lmax; *y = rmax; + (lmax, rmax) + }); + height.iter().enumerate().fold(0, |acc, (idx, x)| { + let h = max_left[idx].min(max_right[idx]); + if h > 0 { h - x + acc } else { acc } + }) + } +} +``` + +单调栈 + +```rust +impl Solution { + pub fn trap(height: Vec) -> i32 { + let mut stack = vec![]; + let mut ans = 0; + for (right_pos, &right_h) in height.iter().enumerate() { + while !stack.is_empty() && height[*stack.last().unwrap()] <= right_h { + let mid_pos = stack.pop().unwrap(); + if !stack.is_empty() { + let left_pos = *stack.last().unwrap(); + let left_h = height[left_pos]; + let top = std::cmp::min(left_h, right_h); + if top > height[mid_pos] { + ans += (top - height[mid_pos]) * (right_pos - left_pos - 1) as i32; + } + } + } + stack.push(right_pos); + } + ans + } +} +``` +

From cef827812ab2084e6d6c0437bff6fd4d2f0b2720 Mon Sep 17 00:00:00 2001 From: Zhipeng Xu Date: Sun, 9 Jul 2023 14:30:01 +0800 Subject: [PATCH 2010/3019] =?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 --- ...47\347\232\204\347\237\251\345\275\242.md" | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git "a/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" "b/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" index f9a8350818..bc82a860cc 100644 --- "a/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" +++ "b/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" @@ -670,6 +670,61 @@ function largestRectangleArea(heights: number[]): number { ``` +Rust + +双指针预处理 +```rust + +impl Solution { + pub fn largest_rectangle_area(v: Vec) -> i32 { + let n = v.len(); + let mut left_smaller_idx = vec![-1; n]; + let mut right_smaller_idx = vec![n as i32; n]; + for i in 1..n { + let mut mid = i as i32 - 1; + while mid >= 0 && v[mid as usize] >= v[i] { + mid = left_smaller_idx[mid as usize]; + } + left_smaller_idx[i] = mid; + } + for i in (0..n-1).rev() { + let mut mid = i + 1; + while mid < n && v[mid] >= v[i] { + mid = right_smaller_idx[mid] as usize; + } + right_smaller_idx[i] = mid as i32; + } + let mut res = 0; + for (idx, &e) in v.iter().enumerate() { + res = res.max((right_smaller_idx[idx] - left_smaller_idx[idx] - 1) * e); + } + dbg!(res) + } +} +``` + +单调栈 +```rust +impl Solution { + pub fn largest_rectangle_area1(mut v: Vec) -> i32 { + v.insert(0, 0); // 便于使第一个元素能够有左侧<=它的值 + v.push(0); // 便于在结束处理最后一个元素后清空残留在栈中的值 + let mut res = 0; + let mut stack = vec![]; // 递增的栈 + for (idx, &e) in v.iter().enumerate() { + while !stack.is_empty() && v[*stack.last().unwrap()] > e { + let pos = stack.pop().unwrap(); + let prev_pos = *stack.last().unwrap(); + let s = (idx - prev_pos - 1) as i32 * v[pos]; + res = res.max(s); + } + stack.push(idx); + } + res + } +} +``` +

From a31b5865df04e5004724995e2b36610ec45d9489 Mon Sep 17 00:00:00 2001 From: life <13122192336@163.com> Date: Mon, 10 Jul 2023 16:00:53 +0800 Subject: [PATCH 2011/3019] =?UTF-8?q?=E7=BB=84=E5=90=88=E6=96=B0=E5=A2=9Ej?= =?UTF-8?q?ava=E7=89=88=E6=9C=AC=E6=9C=AA=E5=89=AA=E6=9E=9D=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "problems/0077.\347\273\204\345\220\210.md" | 23 +++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git "a/problems/0077.\347\273\204\345\220\210.md" "b/problems/0077.\347\273\204\345\220\210.md" index 444e15ce74..8ade6e114f 100644 --- "a/problems/0077.\347\273\204\345\220\210.md" +++ "b/problems/0077.\347\273\204\345\220\210.md" @@ -351,7 +351,30 @@ public: ### Java: +未剪枝优化 +```java +class Solution { + List> result= new ArrayList<>(); + LinkedList path = new LinkedList<>(); + public List> combine(int n, int k) { + backtracking(n,k,1); + return result; + } + public void backtracking(int n,int k,int startIndex){ + if (path.size() == k){ + result.add(new ArrayList<>(path)); + return; + } + for (int i =startIndex;i<=n;i++){ + path.add(i); + backtracking(n,k,i+1); + path.removeLast(); + } + } +} +``` +剪枝优化: ```java class Solution { List> result = new ArrayList<>(); From 3ba32880fa55769ef99686ee42bd5b8da9bc077b Mon Sep 17 00:00:00 2001 From: "jingsong.zeng" Date: Tue, 11 Jul 2023 14:17:53 +0800 Subject: [PATCH 2012/3019] Add the dart implementation of 0704. --- ...14\345\210\206\346\237\245\346\211\276.md" | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git "a/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" "b/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" index 75135749bd..ba35867129 100644 --- "a/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" +++ "b/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" @@ -755,8 +755,56 @@ object Solution { } } ``` +**Dart:** + +```dart +(版本一)左闭右闭区间 +class Solution { + int search(List nums, int target) { + int left = 0; + int right = nums.length - 1; + while (left <= right) { + int middle = ((left + right)/2).truncate(); + switch (nums[middle].compareTo(target)) { + case 1: + right = middle - 1; + continue; + case -1: + left = middle + 1; + continue; + default: + return middle; + } + } + return -1; + } +} + +(版本二)左闭右开区间 +class Solution { + int search(List nums, int target) { + int left = 0; + int right = nums.length; + while (left < right) { + int middle = left + ((right - left) >> 1); + switch (nums[middle].compareTo(target)) { + case 1: + right = middle; + continue; + case -1: + left = middle + 1; + continue; + default: + return middle; + } + } + return -1; + } +} +``` +

From 886287eb27b94681d578248af3ac2b348ee7e94f Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Fri, 14 Jul 2023 11:12:45 +0800 Subject: [PATCH 2013/3019] =?UTF-8?q?=E5=B9=B6=E6=9F=A5=E9=9B=86=E5=9B=BE?= =?UTF-8?q?=E8=AE=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...06\350\256\272\345\237\272\347\241\200.md" | 433 ++++++++++++++++++ 1 file changed, 433 insertions(+) create mode 100644 "problems/\345\233\276\350\256\272\345\271\266\346\237\245\351\233\206\347\220\206\350\256\272\345\237\272\347\241\200.md" diff --git "a/problems/\345\233\276\350\256\272\345\271\266\346\237\245\351\233\206\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\345\233\276\350\256\272\345\271\266\346\237\245\351\233\206\347\220\206\350\256\272\345\237\272\347\241\200.md" new file mode 100644 index 0000000000..5cd753e9ba --- /dev/null +++ "b/problems/\345\233\276\350\256\272\345\271\266\346\237\245\351\233\206\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -0,0 +1,433 @@ + +# 并查集理论基础 + +图论中,关于深搜和广搜我们在这里:[钥匙和房间](https://mp.weixin.qq.com/s/E9NlJy9PW1oJuD8N2EURoQ) 已经更新完毕了。 + +接下来我们来讲一下并查集,首先当然是并查集理论基础。 + +## 背景 + +首先要知道并查集可以解决什么问题呢? + +并查集常用来解决连通性问题。 + +大白话就是当我们需要判断两个元素是否在同一个集合里的时候,我们就要想到用并查集。 + +并查集主要有两个功能: + +* 将两个元素添加到一个集合中。 +* 判断两个元素在不在同一个集合 + +接下来围绕并查集的这两个功能来展开讲解。 + +## 原理讲解 + +从代码层面,我们如何将两个元素添加到同一个集合中呢。 + +此时有录友会想到:可以把他放到同一个数组里或者set 或者 map 中,这样就表述两个元素在同一个集合。 + +那么问题来了,对这些元素分门别类,可不止一个集合,可能是很多集合,成百上千,那么要定义这么多个数组吗? + +有录友想,那可以定义一个二维数组。 + +但如果我们要判断两个元素是否在同一个集合里的时候 我们又能怎么办? 只能把而二维数组都遍历一遍。 + +而且每当想添加一个元素到某集合的时候,依然需要把把二维数组组都遍历一遍,才知道要放在哪个集合里。 + +这仅仅是一个粗略的思路,如果沿着这个思路去实现代码,非常复杂,因为管理集合还需要很多逻辑。 + +那么我们来换一个思路来看看。 + +我们将三个元素A,B,C (分别是数字)放在同一个集合,其实就是将三个元素连通在一起,如何连通呢。 + +只需要用一个一维数组来表示,即:father[A] = B,father[B] = C 这样就表述 A 与 B 与 C连通了(有向连通图)。 + +代码如下: + +``` CPP +// 将v,u 这条边加入并查集 +void join(int u, int v) { + u = find(u); // 寻找u的根 + v = find(v); // 寻找v的根 + if (u == v) return; // 如果发现根相同,则说明在一个集合,不用两个节点相连直接返回 + father[v] = u; +} +``` + +可能有录友想,这样我可以知道 A 连通 B,因为 A 是索引下标,根据 father[A]的数值就知道 A 连通 B。那怎么知道 B 连通 A呢? + +我们的目的是判断这三个元素是否在同一个集合里,知道 A 连通 B 就已经足够了。 + +这里要讲到寻根思路,只要 A ,B,C 在同一个根下就是同一个集合。 + +给出A元素,就可以通过 father[A] = B,father[B] = C,找到根为 C。 + +给出B元素,就可以通过 father[B] = C,找到根也为为 C,说明 A 和 B 是在同一个集合里。 +大家会想第一段代码里find函数是如何实现的呢?其实就是通过数组下标找到数组元素,一层一层寻根过程,代码如下: + +```CPP +// 并查集里寻根的过程 +int find(int u) { + if (u == father[u]) return u; // 如果根就是自己,直接返回 + else return find(father[u]); // 如果根不是自己,就根据数组下标一层一层向下找 +} + +``` + + +如何表示 C 也在同一个元素里呢? 我们需要 father[C] = C,即C的根也为C,这样就方便表示 A,B,C 都在同一个集合里了。 + +所以father数组初始化的时候要 father[i] = i,默认自己指向自己。 + +代码如下: + +```CPP +// 并查集初始化 +void init() { + for (int i = 0; i < n; ++i) { + father[i] = i; + } +} +``` + +最后我们如何判断两个元素是否在同一个集合里,如果通过 find函数 找到 两个元素属于同一个根的话,那么这两个元素就是同一个集合,代码如下: + + +```CPP +// 判断 u 和 v是否找到同一个根 +bool isSame(int u, int v) { + u = find(u); + v = find(v); + return u == v; +} +``` + +## 路径压缩 + +在实现 find 函数的过程中,我们知道,通过递归的方式,不断获取father数组下标对应的数值,最终找到这个集合的根。 + +搜索过程像是一个多叉树中从叶子到根节点的过程,如图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20230602102619.png) + +如果这棵多叉树高度很深的话,每次find函数 去寻找跟的过程就要递归很多次。 + +我们的目的只需要知道这些节点在同一个根下就可以,所以对这棵多叉树的构造只需要这样就可以了,如图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20230602103040.png) + +除了根节点其他所有节点都挂载根节点下,这样我们在寻根的时候就很快,只需要一步, + +如果我们想达到这样的效果,就需要 **路径压缩**,将非根节点的所有节点直接指向根节点。 +那么在代码层面如何实现呢? + +我们只需要在递归的过程中,让 father[u] 接住 递归函数 find(father[u]) 的返回结果。 + +因为 find 函数向上寻找根节点,father[u] 表述 u 的父节点,那么让 father[u] 直接获取 find函数 返回的根节点,这样就让节点 u 的父节点 变成根节点。 + +代码如下,注意看注释,路径压缩就一行代码: + +```CPP +// 并查集里寻根的过程 +int find(int u) { + if (u == father[u]) return u; + else return father[u] = find(father[u]); // 路径压缩 +} +``` + +以上代码在C++中,可以用三元表达式来精简一下,代码如下: + +```CPP +int find(int u) { + return u == father[u] ? u : father[u] = find(father[u]); +} + +``` + +相信不少录友在学习并查集的时候,对上面这三行代码实现的 find函数 很熟悉,但理解上却不够深入,仅仅知道这行代码很好用,不知道这里藏着路径压缩的过程。 + +所以对于算法初学者来说,直接看精简代码学习是不太友好的,往往忽略了很多细节。 + +## 代码模板 + +那么此时并查集的模板就出来了, 整体模板C++代码如下: + +```CPP +int n = 1005; // n根据题目中节点数量而定,一般比节点数量大一点就好 +vector father = vector (n, 0); // C++里的一种数组结构 + +// 并查集初始化 +void init() { + for (int i = 0; i < n; ++i) { + father[i] = i; + } +} +// 并查集里寻根的过程 +int find(int u) { + return u == father[u] ? u : father[u] = find(father[u]); // 路径压缩 +} + +// 判断 u 和 v是否找到同一个根 +bool isSame(int u, int v) { + u = find(u); + v = find(v); + return u == v; +} + +// 将v->u 这条边加入并查集 +void join(int u, int v) { + u = find(u); // 寻找u的根 + v = find(v); // 寻找v的根 + if (u == v) return ; // 如果发现根相同,则说明在一个集合,不用两个节点相连直接返回 + father[v] = u; +} +``` +通过模板,我们可以知道,并查集主要有三个功能。 + +1. 寻找根节点,函数:find(int u),也就是判断这个节点的祖先节点是哪个 +2. 将两个节点接入到同一个集合,函数:join(int u, int v),将两个节点连在同一个根节点上 +3. 判断两个节点是否在同一个集合,函数:isSame(int u, int v),就是判断两个节点是不是同一个根节点 + +## 常见误区 + +这里估计有录友会想,模板中的 join 函数里的这段代码: + +```CPP +u = find(u); // 寻找u的根 +v = find(v); // 寻找v的根 +if (u == v) return ; // 如果发现根相同,则说明在一个集合,不用两个节点相连直接返回 + +``` + +与 isSame 函数的实现是不是重复了? 如果抽象一下呢,代码如下: + +```CPP +// 判断 u 和 v是否找到同一个根 +bool isSame(int u, int v) { + u = find(u); + v = find(v); + return u == v; +} + +// 将v->u 这条边加入并查集 +void join(int u, int v) { + if (isSame) return ; // 如果发现根相同,则说明在一个集合,不用两个节点相连直接返回 + father[v] = u; +} +``` + +这样写可以吗? 好像看出去没问题,而且代码更精简了。 + +**其实这么写是有问题的**,在join函数中 我们需要寻找 u 和 v 的根,然后再进行连线在一起,而不是直接 用 u 和 v 连线在一起。 + +举一个例子: + +``` +join(1, 2); +join(3, 2); +``` + +此时构成的图是这样的: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20230525111307.png) + +此时问 1,3是否在同一个集合,我们调用 `join(1, 2); join(3, 2);` 很明显本意要表示 1,3是在同一个集合。 + +但我们来看一下代码逻辑,当我们调用 `isSame(1, 3)`的时候,find(1) 返回的是1,find(3)返回的是3。 `return 1 == 3` 返回的是false,代码告诉我们 1 和 3 不在同一个集合,这明显不符合我们的预期,所以问题出在哪里? + +问题出在我们精简的代码上,即 join 函数 一定要先 通过find函数寻根再进行关联。 + +如果find函数是这么实现,再来看一下逻辑过程。 + +```CPP +void join(int u, int v) { + u = find(u); // 寻找u的根 + v = find(v); // 寻找v的根 + if (u == v) return ; // 如果发现根相同,则说明在一个集合,不用两个节点相连直接返回 + father[v] = u; +} +``` + +分别将 这两对元素加入集合。 + +```CPP +join(1, 2); +join(3, 2); +``` + +当执行`join(3, 2)`的时候,会先通过find函数寻找 3的根为3,2的根为1 (第一个`join(1, 2)`,将2的根设置为1),所以最后是将1 指向 3。 + +构成的图是这样的: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20230525112101.png) + +因为在join函数里,我们有find函数进行寻根的过程,这样就保证元素 1,2,3在这个有向图里是强连通的。 + +此时我们在调用 `isSame(1, 3)`的时候,find(1) 返回的是3,find(3) 返回的也是3,`return 3 == 3` 返回的是true,即告诉我们 元素 1 和 元素3 是 在同一个集合里的。 + + + + +## 模拟过程 + +(**凸显途径合并的过程,每一个join都要画图**) + +不少录友在接触并查集模板之后,用起来很娴熟,因为模板确实相对固定,但是对并查集内部数据组织方式以及如何判断是否是同一个集合的原理很模糊。 + +通过以上讲解之后,我在带大家一步一步去画一下,并查集内部数据连接方式。 + +注意:为了让录友们了解基础并查集的操作,不至于混乱,**以下模拟过程中不考虑路径压缩的过程**,了解基础并查集操作后,路径压缩也很容易理解。 + +我们先通过一些列的join操作,将两两元素分别放入同一个集合中。 + +```CPP +join(1, 8); +join(3, 8); +join(1, 7); +join(8, 5); +join(6, 2); +join(2, 9); + +``` + +此时我们生成的的有向图为: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20230526122203.png) + +有录友可能想,`join(3, 8)` 在图中为什么 将 元素1 连向元素 3 而不是将 元素 8 连向 元素 3 呢? + +这一点 我在 「常见误区」标题下已经详细讲解了,因为在`join(int u, int v)`函数里 要分别对 u 和 v 寻根之后再进行关联。 + +大家看懂这个有向图后,相信应该知道如下函数的返回值了。 + +```CPP +cout << isSame(8, 7) << endl; +cout << isSame(7, 2) << endl; +``` + +返回值分别如下,表示,8 和 7 是同一个集合,而 7 和 2 不是同一个集合。 + +``` +true +false +``` + +## 拓展 + + +在「路径压缩」讲解中,我们知道如何靠压缩路径来缩短查询根节点的时间。 + +其实还有另一种方法:按秩(rank)合并。 + +rank表示树的高度,即树中结点层次的最大值。 + +例如两个集合(多叉树)需要合并,如图所示: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20230602172250.png) + +树1 rank 为2,树2 rank 为 3。那么合并两个集合,是 树1 合入 树2,还是 树2 合入 树1呢? + +我们来看两个不同方式合入的效果。 + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20230602172933.png) + +这里可以看出,树2 合入 树1 会导致整棵树的高度变的更高,而 树1 合入 树2 整棵树的高度 和 树2 保持一致。 + +所以在 join函数中如何合并两棵树呢? + +一定是 rank 小的树合入 到 rank大 的树,这样可以保证最后合成的树rank 最小,降低在树上查询的路径长度。 + +按秩合并的代码如下: + +```CPP +int n = 1005; // n根据题目中节点数量而定,一般比节点数量大一点就好 +vector father = vector (n, 0); // C++里的一种数组结构 +vector rank = vector (n, 1); // 初始每棵树的高度都为1 + +// 并查集初始化 +void init() { + for (int i = 0; i < n; ++i) { + father[i] = i; + rank[i] = 1; // 也可以不写 + } +} +// 并查集里寻根的过程 +int find(int u) { + return u == father[u] ? u : find(father[u]);// 注意这里不做路径压缩 +} + +// 判断 u 和 v是否找到同一个根 +bool isSame(int u, int v) { + u = find(u); + v = find(v); + return u == v; +} + +// 将v->u 这条边加入并查集 +void join(int u, int v) { + u = find(u); // 寻找u的根 + v = find(v); // 寻找v的根 + + if (rank[u] <= rank[v]) father[u] = v; // rank小的树合入到rank大的树 + else father[v] = u; + + if (rank[u] == rank[v] && u != v) rank[v]++; // 如果两棵树高度相同,则v的高度+1因为,方面 if (rank[u] <= rank[v]) father[u] = v; 注意是 <= +} +``` + +可以注意到在上面的模板代码中,我是没有做路径压缩的,因为一旦做路径压缩,rank记录的高度就不准了,根据rank来判断如何合并就没有意义。 + +也可以在 路径压缩的时候,再去实时修生rank的数值,但这样在代码实现上麻烦了不少,关键是收益很小。 + +其实我们在优化并查集查询效率的时候,只用路径压缩的思路就够了,不仅代码实现精简,而且效率足够高。 + +按秩合并的思路并没有将树形结构尽可能的扁平化,所以在整理效率上是没有路径压缩高的。 + +说到这里可能有录友会想,那在路径压缩的代码中,只有查询的过程 即 find 函数的执行过程中会有路径压缩,如果一直没有使用find函数,是不是相当于这棵树就没有路径压缩,导致查询效率依然很低呢? + +大家可以再去回顾使用路径压缩的 并查集模板,在isSame函数 和 join函数中,我们都调用了 find 函数来进行寻根操作。 + +也就是说,无论使用并查集模板里哪一个函数(除了init函数),都会有路径压缩的过程,第二次访问相同节点的时候,这个节点就是直连根节点的,即 第一次访问的时候它的路径就被压缩了。 + +**所以这里推荐大家直接使用路径压缩的并查集模板就好**,但按秩合并的优化思路我依然给大家讲清楚,有助于更深一步理解并查集的优化过程。 + +## 复杂度分析 + + +这里对路径压缩版并查集来做分析。 + +空间复杂度: O(n) ,申请一个father数组。 + +关于时间复杂度,如果想精确表达出来需要繁琐的数学证明,就不在本篇讲解范围内了,大家感兴趣可以自己去深入去研究。 + +这里做一个简单的分析思路。 + +路径压缩后的并查集时间复杂度在O(logn)与O(1)之间,且随着查询或者合并操作的增加,时间复杂度会越来越趋于O(1)。 + +了解到这个程度对于求职面试来说就够了。 + +在第一次查询的时候,相当于是n叉树上从叶子节点到根节点的查询过程,时间复杂度是logn,但路径压缩后,后面的查询操作都是O(1),而 join 函数 和 isSame函数 里涉及的查询操作也是一样的过程。 + + +## 总结 + +本篇我们讲解了并查集的背景、原理、两种优化方式(路径压缩,按秩合并),代码模板,常见误区,以及模拟过程。 + +要知道并查集解决什么问题,在什么场景下我们要想到使用并查集。 + + +接下来进一步优化并查集的执行效率,重点介绍了路径压缩的方式,另一种方法:按秩合并,我们在 「拓展」中讲解。 + +通过一步一步的原理讲解,最后给出并查集的模板,所有的并查集题目都在这个模板的基础上进行操作或者适当修改。 + +但只给出模板还是不够的,针对大家学习并查集的常见误区,详细讲解了模板代码的细节。 + +为了让录友们进一步了解并查集的运行过程,我们再通过具体用例模拟一遍代码过程并画出对应的内部数据连接图(有向图)。 + +这里也建议大家去模拟一遍才能对并查集理解的更到位。 + +如果对模板代码还是有点陌生,不用担心,接下来我会讲解对应LeetCode上的并查集题目,通过一系列题目练习,大家就会感受到这套模板有多么的好用! + +敬请期待 并查集题目精讲系列。 + + From ba5ecfecaf7160911e4d464c5aecdce1f6973146 Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Fri, 14 Jul 2023 11:13:00 +0800 Subject: [PATCH 2014/3019] Update --- ...\273\351\231\244\345\205\203\347\264\240.md" | 7 +++++-- ...72\346\227\213\347\237\251\351\230\265II.md" | 9 ++++++--- ...\276\350\241\250\345\205\203\347\264\240.md" | 4 ++++ ...\273\350\275\254\351\223\276\350\241\250.md" | 5 +++++ ...\204\345\255\220\346\225\260\347\273\204.md" | 13 ++++++++----- ...\220\345\255\227\347\254\246\344\270\262.md" | 16 ++++++++-------- ...\227\344\275\231\350\277\236\346\216\245.md" | 10 +++------- ...27\344\275\231\350\277\236\346\216\245II.md" | 4 ++-- ...\214\345\210\206\346\237\245\346\211\276.md" | 6 ++++-- ...\276\350\256\241\351\223\276\350\241\250.md" | 8 ++++++-- ...\204\347\232\204\345\271\263\346\226\271.md" | 17 ++++++++++------- ...\230\345\234\250\350\267\257\345\276\204.md" | 6 +++--- 12 files changed, 64 insertions(+), 41 deletions(-) diff --git "a/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" "b/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" index 908011532a..3d43a199b0 100644 --- "a/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" +++ "b/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" @@ -26,9 +26,12 @@ **你不需要考虑数组中超出新长度后面的元素。** -## 思路 -针对本题,我录制了视频讲解:[数组中移除元素并不容易!LeetCode:27. 移除元素](https://www.bilibili.com/video/BV12A4y1Z7LP),结合本题解一起看,事半功倍! +## 算法公开课 + +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[数组中移除元素并不容易!LeetCode:27. 移除元素](https://www.bilibili.com/video/BV12A4y1Z7LP),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 + +## 思路 有的同学可能说了,多余的元素,删掉不就得了。 diff --git "a/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" "b/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" index b4dad9c3de..fd40f3fc52 100644 --- "a/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" +++ "b/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" @@ -6,7 +6,7 @@ -## 59.螺旋矩阵II +# 59.螺旋矩阵II [力扣题目链接](https://leetcode.cn/problems/spiral-matrix-ii/) @@ -22,9 +22,12 @@ [ 7, 6, 5 ] ] -## 思路 -为了利于录友们理解,我特意录制了视频,[拿下螺旋矩阵!LeetCode:59.螺旋矩阵II](https://www.bilibili.com/video/BV1SL4y1N7mV),结合视频一起看,事半功倍! +## 算法公开课 + +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[拿下螺旋矩阵!LeetCode:59.螺旋矩阵II](https://www.bilibili.com/video/BV1SL4y1N7mV),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 + +## 思路 这道题目可以说在面试中出现频率较高的题目,**本题并不涉及到什么算法,就是模拟过程,但却十分考察对代码的掌控能力。** diff --git "a/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" "b/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" index f875165826..300f98e911 100644 --- "a/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" +++ "b/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" @@ -27,6 +27,10 @@ 输入:head = [7,7,7,7], val = 7 输出:[] +# 算法公开课 + +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[链表基础操作| LeetCode:203.移除链表元素](https://www.bilibili.com/video/BV18B4y1s7R9),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 + # 思路 diff --git "a/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md" "b/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md" index 0425e18280..c63c998dc7 100644 --- "a/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md" +++ "b/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md" @@ -17,6 +17,11 @@ 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL +# 算法公开课 + +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[帮你拿下反转链表 | LeetCode:206.反转链表](https://www.bilibili.com/video/BV1nB4y1i7eL),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 + + # 思路 本题我录制了B站视频,[帮你拿下反转链表 | LeetCode:206.反转链表](https://www.bilibili.com/video/BV1nB4y1i7eL),相信结合视频在看本篇题解,更有助于大家对链表的理解。 diff --git "a/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" "b/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" index d7ae478033..82d551ea44 100644 --- "a/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" +++ "b/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" @@ -13,9 +13,9 @@ 示例: -输入:s = 7, nums = [2,3,1,2,4,3] -输出:2 -解释:子数组 [4,3] 是该条件下的长度最小的子数组。 +* 输入:s = 7, nums = [2,3,1,2,4,3] +* 输出:2 +* 解释:子数组 [4,3] 是该条件下的长度最小的子数组。 提示: @@ -23,9 +23,12 @@ * 1 <= nums.length <= 10^5 * 1 <= nums[i] <= 10^5 -# 思路 +# 算法公开课 + +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[拿下滑动窗口! | LeetCode 209 长度最小的子数组](https://www.bilibili.com/video/BV1tZ4y1q7XE),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 -为了易于大家理解,我特意录制了B站视频[拿下滑动窗口! | LeetCode 209 长度最小的子数组](https://www.bilibili.com/video/BV1tZ4y1q7XE),结合视频看本题解,事半功倍! + +# 思路 ## 暴力解法 diff --git "a/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" "b/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" index 5d56ad18fb..e26d04ad87 100644 --- "a/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" @@ -16,18 +16,18 @@ 给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母,并且长度不超过10000。 示例 1: -输入: "abab" -输出: True -解释: 可由子字符串 "ab" 重复两次构成。 +* 输入: "abab" +* 输出: True +* 解释: 可由子字符串 "ab" 重复两次构成。 示例 2: -输入: "aba" -输出: False +* 输入: "aba" +* 输出: False 示例 3: -输入: "abcabcabcabc" -输出: True -解释: 可由子字符串 "abc" 重复四次构成。 (或者子字符串 "abcabc" 重复两次构成。) +* 输入: "abcabcabcabc" +* 输出: True +* 解释: 可由子字符串 "abc" 重复四次构成。 (或者子字符串 "abcabc" 重复两次构成。) # 思路 diff --git "a/problems/0684.\345\206\227\344\275\231\350\277\236\346\216\245.md" "b/problems/0684.\345\206\227\344\275\231\350\277\236\346\216\245.md" index 177338dd6d..c4d62d9b46 100644 --- "a/problems/0684.\345\206\227\344\275\231\350\277\236\346\216\245.md" +++ "b/problems/0684.\345\206\227\344\275\231\350\277\236\346\216\245.md" @@ -4,11 +4,8 @@

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

- - # 684.冗余连接 - [力扣题目链接](https://leetcode.cn/problems/redundant-connection/) 树可以看成是一个连通且 无环 的 无向 图。 @@ -78,7 +75,9 @@ void join(int u, int v) { 2. 将两个节点接入到同一个集合,函数:join(int u, int v),将两个节点连在同一个根节点上 3. 判断两个节点是否在同一个集合,函数:isSame(int u, int v),就是判断两个节点是不是同一个根节点 -简单介绍并查集之后,我们再来看一下这道题目。 +如果还不了解并查集,可以看这里:[并查集理论基础](https://programmercarl.com/图论并查集理论基础.html) + +我们再来看一下这道题目。 题目说是无向图,返回一条可以删去的边,使得结果图是一个有着N个节点的树(即:只有一个根节点)。 @@ -92,7 +91,6 @@ void join(int u, int v) { 节点A 和节点 B 不在同一个集合,那么就可以将两个 节点连在一起。 - (如果题目中说:如果有多个答案,则返回二维数组中最前出现的边。 那我们就要 从后向前遍历每一条边了) 如果边的两个节点已经出现在同一个集合里,说明着边的两个节点已经连在一起了,再加入这条边一定就出现环了。 @@ -151,8 +149,6 @@ public: 可以看出,主函数的代码很少,就判断一下边的两个节点在不在同一个集合就可以了。 -这里对并查集就不展开过多的讲解了,翻到了自己十年前写过了一篇并查集的文章[并查集学习](https://blog.csdn.net/youngyangyang04/article/details/6447435),哈哈,那时候还太年轻,写不咋地,有空我会重写并查集基础篇! - # 其他语言版本 diff --git "a/problems/0685.\345\206\227\344\275\231\350\277\236\346\216\245II.md" "b/problems/0685.\345\206\227\344\275\231\350\277\236\346\216\245II.md" index 149eab0148..8c56afdc08 100644 --- "a/problems/0685.\345\206\227\344\275\231\350\277\236\346\216\245II.md" +++ "b/problems/0685.\345\206\227\344\275\231\350\277\236\346\216\245II.md" @@ -104,7 +104,7 @@ if (vec.size() > 0) { } ``` -在来看情况三,明确没有入度为2的情况,那么一定有有向环,找到构成环的边就是要删除的边。 +在来看情况三,明确没有入度为2的情况,那么一定有向环,找到构成环的边就是要删除的边。 可以定义一个函数,代码如下: @@ -122,7 +122,7 @@ vector getRemoveEdge(const vector>& edges) **因为如果两个点所在的边在添加图之前如果就可以在并查集里找到了相同的根,那么这条边添加上之后 这个图一定不是树了** -这里对并查集就不展开过多的讲解了,翻到了自己十年前写过了一篇并查集的文章[并查集学习](https://blog.csdn.net/youngyangyang04/article/details/6447435),哈哈,那时候还太年轻,写不咋地,有空我会重写一篇! +如果还不了解并查集,可以看这里:[并查集理论基础](https://programmercarl.com/图论并查集理论基础.html) 本题C++代码如下:(详细注释了) diff --git "a/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" "b/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" index 75135749bd..c59ae868ce 100644 --- "a/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" +++ "b/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" @@ -33,10 +33,12 @@ * n 将在 [1, 10000]之间。 * nums 的每个元素都将在 [-9999, 9999]之间。 +## 算法公开课 + +***[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[手把手带你撕出正确的二分法](https://www.bilibili.com/video/BV1fA4y1o715),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 -## 思路 -为了易于大家理解,我还录制了视频,可以看这里:[B站:手把手带你撕出正确的二分法](https://www.bilibili.com/video/BV1fA4y1o715) +## 思路 **这道题目的前提是数组为有序数组**,同时题目还强调**数组中无重复元素**,因为一旦有重复元素,使用二分查找法返回的元素下标可能不是唯一的,这些都是使用二分法的前提条件,当大家看到题目描述满足如上条件的时候,可要想一想是不是可以用二分法了。 diff --git "a/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" "b/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" index aa04d0e1af..87e5f5a933 100644 --- "a/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" +++ "b/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" @@ -24,9 +24,13 @@ ![707示例](https://code-thinking-1253855093.file.myqcloud.com/pics/20200814200558953.png) -# 思路 -为了方便大家理解,我特意录制了视频:[帮你把链表操作学个通透!LeetCode:707.设计链表](https://www.bilibili.com/video/BV1FU4y1X7WD),结合视频在看本题解,事半功倍。 +# 算法公开课 + +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[帮你把链表操作学个通透!LeetCode:707.设计链表](https://www.bilibili.com/video/BV1FU4y1X7WD),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 + + +# 思路 如果对链表的基础知识还不太懂,可以看这篇文章:[关于链表,你该了解这些!](https://programmercarl.com/链表理论基础.html) diff --git "a/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" "b/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" index a316096e20..de06c41925 100644 --- "a/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" +++ "b/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" @@ -13,17 +13,20 @@ 给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。 示例 1: -输入:nums = [-4,-1,0,3,10] -输出:[0,1,9,16,100] -解释:平方后,数组变为 [16,1,0,9,100],排序后,数组变为 [0,1,9,16,100] +* 输入:nums = [-4,-1,0,3,10] +* 输出:[0,1,9,16,100] +* 解释:平方后,数组变为 [16,1,0,9,100],排序后,数组变为 [0,1,9,16,100] 示例 2: -输入:nums = [-7,-3,2,3,11] -输出:[4,9,9,49,121] +* 输入:nums = [-7,-3,2,3,11] +* 输出:[4,9,9,49,121] -# 思路 +# 算法公开课 + +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[双指针法经典题目!LeetCode:977.有序数组的平方](https://www.bilibili.com/video/BV1QB4y1D7ep),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 -针对本题,我录制了视频讲解:[双指针法经典题目!LeetCode:977.有序数组的平方](https://www.bilibili.com/video/BV1QB4y1D7ep),结合本题解一起看,事半功倍! + +# 思路 ## 暴力排序 diff --git "a/problems/1971.\345\257\273\346\211\276\345\233\276\344\270\255\346\230\257\345\220\246\345\255\230\345\234\250\350\267\257\345\276\204.md" "b/problems/1971.\345\257\273\346\211\276\345\233\276\344\270\255\346\230\257\345\220\246\345\255\230\345\234\250\350\267\257\345\276\204.md" index 16c7cb1e85..5f1d894333 100644 --- "a/problems/1971.\345\257\273\346\211\276\345\233\276\344\270\255\346\230\257\345\220\246\345\255\230\345\234\250\350\267\257\345\276\204.md" +++ "b/problems/1971.\345\257\273\346\211\276\345\233\276\344\270\255\346\230\257\345\220\246\345\255\230\345\234\250\350\267\257\345\276\204.md" @@ -31,9 +31,9 @@ ## 思路 -本题是并查集基础题目。 +本题是并查集基础题目。 如果还不了解并查集,可以看这里:[并查集理论基础](https://programmercarl.com/图论并查集理论基础.html) -首先要知道并查集可以解决什么问题呢? +并查集可以解决什么问题呢? 主要就是集合问题,两个节点在不在一个集合,也可以将两个节点添加到一个集合中。 @@ -70,7 +70,7 @@ void join(int u, int v) { } ``` -以上模板中,只要修改 n 大小就可以,本科n不会超过2 * 10^5。 +以上模板中,只要修改 n 大小就可以,本题n不会超过2 * 10^5。 并查集主要有三个功能。 From 0129bde1d87599790af4ad5dc32cc2cd05320e16 Mon Sep 17 00:00:00 2001 From: Nihilism <114405451+Nihilism0@users.noreply.github.com> Date: Fri, 14 Jul 2023 13:56:34 +0800 Subject: [PATCH 2015/3019] =?UTF-8?q?=E4=BC=98=E5=8C=96=200151.=E7=BF=BB?= =?UTF-8?q?=E8=BD=AC=E5=AD=97=E7=AC=A6=E4=B8=B2=E9=87=8C=E7=9A=84=E5=8D=95?= =?UTF-8?q?=E8=AF=8DGo=E7=A4=BA=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...214\347\232\204\345\215\225\350\257\215.md" | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git "a/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" "b/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" index 6dd3cd4975..ee944089d3 100644 --- "a/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" +++ "b/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" @@ -546,26 +546,28 @@ func reverseWords(s string) string { b = b[:slowIndex] } //2.反转整个字符串 - reverse(&b, 0, len(b)-1) + reverse(b) //3.反转单个单词 i单词开始位置,j单词结束位置 i := 0 for i < len(b) { j := i for ; j < len(b) && b[j] != ' '; j++ { } - reverse(&b, i, j-1) + reverse(b[i:j]) i = j i++ } return string(b) } -func reverse(b *[]byte, left, right int) { - for left < right { - (*b)[left], (*b)[right] = (*b)[right], (*b)[left] - left++ - right-- - } +func reverse(b []byte) { + left := 0 + right := len(b) - 1 + for left < right { + b[left], b[right] = b[right], b[left] + left++ + right-- + } } ``` From 8887adbb109acd58ac65bea198d1dc287d99db42 Mon Sep 17 00:00:00 2001 From: limuxuale0927 Date: Fri, 14 Jul 2023 21:52:24 +0800 Subject: [PATCH 2016/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200200.=E5=B2=9B?= =?UTF-8?q?=E5=B1=BF=E6=95=B0=E9=87=8F.=E5=B9=BF=E6=90=9C=E7=89=88.md=20Py?= =?UTF-8?q?thon3=20=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...7.\345\271\277\346\220\234\347\211\210.md" | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git "a/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\345\271\277\346\220\234\347\211\210.md" "b/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\345\271\277\346\220\234\347\211\210.md" index 39af9f50a3..4a990a445b 100644 --- "a/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\345\271\277\346\220\234\347\211\210.md" +++ "b/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\345\271\277\346\220\234\347\211\210.md" @@ -196,6 +196,41 @@ class Solution { } } ``` + +Python: + +```python +class Solution: + def numIslands(self, grid: List[List[str]]) -> int: + m, n = len(grid), len(grid[0]) + visited = [[False] * n for _ in range(m)] + dirs = [(-1, 0), (0, 1), (1, 0), (0, -1)] # 四个方向 + ans = 0 + + def bfs(x, y): + q = deque() + q.append([x, y]) + visited[x][y] = True + while q: + curx, cury = q.popleft() + for d in dirs: + nextx = curx + d[0] + nexty = cury + d[1] + if nextx < 0 or nextx >= m or nexty < 0 or nexty >= n: # 越界了,直接跳过 + continue + if visited[nextx][nexty] == False and grid[nextx][nexty] == "1": + q.append([nextx, nexty]) + visited[nextx][nexty] = True # 只要加入队列立刻标记 + + for i in range(m): + for j in range(n): + if grid[i][j] == "1" and not visited[i][j]: + ans += 1 # 遇到没访问过的陆地,+1 + bfs(i, j) # 将与其链接的陆地都标记上 true + + return ans +``` +

From 9b5c5ebeea85b133514ab42c0218b79e13599b45 Mon Sep 17 00:00:00 2001 From: limuxuale0927 Date: Fri, 14 Jul 2023 22:07:13 +0800 Subject: [PATCH 2017/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200200.=E5=B2=9B?= =?UTF-8?q?=E5=B1=BF=E6=95=B0=E9=87=8F.=E6=B7=B1=E6=90=9C=E7=89=88.md=20Py?= =?UTF-8?q?thon3=20=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...7.\346\267\261\346\220\234\347\211\210.md" | 61 +++++++++++++++++++ 1 file changed, 61 insertions(+) diff --git "a/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\346\267\261\346\220\234\347\211\210.md" "b/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\346\267\261\346\220\234\347\211\210.md" index c30ace1999..f610e32330 100644 --- "a/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\346\267\261\346\220\234\347\211\210.md" +++ "b/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\346\267\261\346\220\234\347\211\210.md" @@ -218,6 +218,67 @@ class Solution { } } ``` + +Python: + +```python +# 版本一 +class Solution: + def numIslands(self, grid: List[List[str]]) -> int: + m, n = len(grid), len(grid[0]) + visited = [[False] * n for _ in range(m)] + dirs = [(-1, 0), (0, 1), (1, 0), (0, -1)] # 四个方向 + result = 0 + + def dfs(x, y): + for d in dirs: + nextx = x + d[0] + nexty = y + d[1] + if nextx < 0 or nextx >= m or nexty < 0 or nexty >= n: # 越界了,直接跳过 + continue + if not visited[nextx][nexty] and grid[nextx][nexty] == '1': # 没有访问过的同时是陆地的 + visited[nextx][nexty] = True + dfs(nextx, nexty) + + for i in range(m): + for j in range(n): + if not visited[i][j] and grid[i][j] == '1': + visited[i][j] = True + result += 1 # 遇到没访问过的陆地,+1 + dfs(i, j) # 将与其链接的陆地都标记上 true + + return result +``` + +```python +# 版本二 +class Solution: + def numIslands(self, grid: List[List[str]]) -> int: + m, n = len(grid), len(grid[0]) + visited = [[False] * n for _ in range(m)] + dirs = [(-1, 0), (0, 1), (1, 0), (0, -1)] # 四个方向 + result = 0 + + def dfs(x, y): + if visited[x][y] or grid[x][y] == '0': + return # 终止条件:访问过的节点 或者 遇到海水 + visited[x][y] = True + for d in dirs: + nextx = x + d[0] + nexty = y + d[1] + if nextx < 0 or nextx >= m or nexty < 0 or nexty >= n: # 越界了,直接跳过 + continue + dfs(nextx, nexty) + + for i in range(m): + for j in range(n): + if not visited[i][j] and grid[i][j] == '1': + result += 1 # 遇到没访问过的陆地,+1 + dfs(i, j) # 将与其链接的陆地都标记上 true + + return result +``` +

From e5d3d1188555ea83aa00c156afcc249d4fd1fe42 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E5=91=98Carl?= Date: Sun, 16 Jul 2023 20:39:00 +0800 Subject: [PATCH 2018/3019] =?UTF-8?q?Update=200200.=E5=B2=9B=E5=B1=BF?= =?UTF-8?q?=E6=95=B0=E9=87=8F.=E5=B9=BF=E6=90=9C=E7=89=88.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...207\217.\345\271\277\346\220\234\347\211\210.md" | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git "a/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\345\271\277\346\220\234\347\211\210.md" "b/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\345\271\277\346\220\234\347\211\210.md" index 2bb0973a11..c20fe4f1aa 100644 --- "a/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\345\271\277\346\220\234\347\211\210.md" +++ "b/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\345\271\277\346\220\234\347\211\210.md" @@ -196,11 +196,8 @@ class Solution { } } ``` -

- - - -``` + +## 其他语言版本 ### Python BFS solution ```python @@ -241,3 +238,9 @@ class Solution: q.append((next_i, next_j)) visited[next_i][next_j] = True ``` + +

+ + + +``` From 5794b17ab4ccb5da0411896eda509c503014d7d6 Mon Sep 17 00:00:00 2001 From: TonySu Date: Sun, 16 Jul 2023 22:00:05 +0800 Subject: [PATCH 2019/3019] =?UTF-8?q?Update=200039.=E7=BB=84=E5=90=88?= =?UTF-8?q?=E6=80=BB=E5=92=8C.md,=20=E4=BF=AE=E5=A4=8DPython=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E7=9A=84=E4=B8=80=E4=B8=AAbug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Python 版本的回溯剪枝版本一当中, break 会终止整个for 循环,从而提前终止搜索,应该改成continue --- .../0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" "b/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" index 4d9466c3c0..e09a44e496 100644 --- "a/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" +++ "b/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" @@ -311,7 +311,7 @@ class Solution: for i in range(startIndex, len(candidates)): if total + candidates[i] > target: - break + continue total += candidates[i] path.append(candidates[i]) self.backtracking(candidates, target, total, i, path, result) From 3a76b3a85e097446ab5f9e7dbb6028bac81c75de Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Mon, 17 Jul 2023 11:52:50 +0800 Subject: [PATCH 2020/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200704.=E4=BA=8C?= =?UTF-8?q?=E5=88=86=E6=9F=A5=E6=89=BE=20=E6=8E=92=E7=89=88=E6=A0=BC?= =?UTF-8?q?=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...14\345\210\206\346\237\245\346\211\276.md" | 36 ++++++++++--------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git "a/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" "b/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" index c59ae868ce..d202dfa184 100644 --- "a/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" +++ "b/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" @@ -35,7 +35,7 @@ ## 算法公开课 -***[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[手把手带你撕出正确的二分法](https://www.bilibili.com/video/BV1fA4y1o715),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[手把手带你撕出正确的二分法](https://www.bilibili.com/video/BV1fA4y1o715),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 ## 思路 @@ -160,7 +160,7 @@ public: ## 其他语言版本 -**Java:** +### **Java:** (版本一)左闭右闭区间 @@ -206,7 +206,7 @@ class Solution { } ``` -**Python:** +### **Python:** (版本一)左闭右闭区间 @@ -246,7 +246,7 @@ class Solution: return -1 # 未找到目标值 ``` -**Go:** +### **Go:** (版本一)左闭右闭区间 @@ -288,7 +288,7 @@ func search(nums []int, target int) int { } ``` -**JavaScript:** +### **JavaScript:** (版本一)左闭右闭区间 [left, right] ```js @@ -345,7 +345,7 @@ var search = function(nums, target) { }; ``` -**TypeScript** +### **TypeScript** (版本一)左闭右闭区间 @@ -387,7 +387,7 @@ function search(nums: number[], target: number): number { }; ``` -**Ruby:** +### **Ruby:** ```ruby # (版本一)左闭右闭区间 @@ -425,7 +425,7 @@ def search(nums, target) end ``` -**Swift:** +### **Swift:** ```swift // (版本一)左闭右闭区间 @@ -479,7 +479,7 @@ func search(nums: [Int], target: Int) -> Int { ``` -**Rust:** +### **Rust:** ```rust # (版本一)左闭右闭区间 @@ -523,7 +523,8 @@ impl Solution { } ``` -**C:** +### **C:** + ```c // (版本一) 左闭右闭区间 [left, right] int search(int* nums, int numsSize, int target){ @@ -575,7 +576,8 @@ int search(int* nums, int numsSize, int target){ } ``` -**PHP:** +### **PHP:** + ```php // 左闭右闭区间 class Solution { @@ -607,7 +609,8 @@ class Solution { } ``` -**C#:** +### **C#:** + ```csharp //左闭右闭 public class Solution { @@ -652,7 +655,8 @@ public class Solution{ } ``` -**Kotlin:** +### **Kotlin:** + ```kotlin class Solution { fun search(nums: IntArray, target: Int): Int { @@ -682,9 +686,8 @@ class Solution { } ``` +### **Kotlin:** - -**Kotlin:** ```Kotlin // (版本一)左闭右开区间 class Solution { @@ -715,7 +718,7 @@ class Solution { } } ``` -**Scala:** +### **Scala:** (版本一)左闭右闭区间 ```scala @@ -763,3 +766,4 @@ object Solution { + From 948aca860da277d744c9fb130039fe96dd79491f Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Mon, 17 Jul 2023 14:59:20 +0800 Subject: [PATCH 2021/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200704.=E4=BA=8C?= =?UTF-8?q?=E5=88=86=E6=9F=A5=E6=89=BE=20=E6=8E=92=E7=89=88=E6=A0=BC?= =?UTF-8?q?=E5=BC=8F=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git "a/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" "b/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" index d202dfa184..52abf57851 100644 --- "a/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" +++ "b/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" @@ -5,7 +5,7 @@

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

-## 704. 二分查找 +# 704. 二分查找 [力扣题目链接](https://leetcode.cn/problems/binary-search/) @@ -766,4 +766,3 @@ object Solution { - From fdbc7442ac2b685414544f0af79d64c40da05d0f Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Mon, 17 Jul 2023 15:11:55 +0800 Subject: [PATCH 2022/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20027.=E7=A7=BB?= =?UTF-8?q?=E9=99=A4=E5=85=83=E7=B4=A0=20=E6=8E=92=E7=89=88=E6=A0=BC?= =?UTF-8?q?=E5=BC=8F=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...73\351\231\244\345\205\203\347\264\240.md" | 35 +++++++++++-------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git "a/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" "b/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" index 3d43a199b0..ce9eccf00b 100644 --- "a/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" +++ "b/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" @@ -5,7 +5,7 @@

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

-## 27. 移除元素 +# 27. 移除元素 [力扣题目链接](https://leetcode.cn/problems/remove-element/) @@ -159,8 +159,8 @@ public: ## 其他语言版本 +### Java: -Java: ```java class Solution { public int removeElement(int[] nums, int val) { @@ -197,7 +197,7 @@ class Solution { } ``` -Python: +### Python: ``` python 3 @@ -233,8 +233,8 @@ class Solution: ``` +### Go: -Go: ```go func removeElement(nums []int, val int) int { length:=len(nums) @@ -275,7 +275,8 @@ func removeElement(nums []int, val int) int { } ``` -JavaScript: +### JavaScript: + ```javascript //时间复杂度:O(n) //空间复杂度:O(1) @@ -290,7 +291,7 @@ var removeElement = (nums, val) => { }; ``` -TypeScript: +### TypeScript: ```typescript function removeElement(nums: number[], val: number): number { @@ -305,7 +306,7 @@ function removeElement(nums: number[], val: number): number { }; ``` -Ruby: +### Ruby: ```ruby def remove_element(nums, val) @@ -319,7 +320,8 @@ def remove_element(nums, val) i end ``` -Rust: +### Rust: + ```rust impl Solution { pub fn remove_element(nums: &mut Vec, val: i32) -> i32 { @@ -335,7 +337,7 @@ impl Solution { } ``` -Swift: +### Swift: ```swift func removeElement(_ nums: inout [Int], _ val: Int) -> Int { @@ -351,7 +353,8 @@ func removeElement(_ nums: inout [Int], _ val: Int) -> Int { } ``` -PHP: +### PHP: + ```php class Solution { /** @@ -375,7 +378,8 @@ class Solution { } ``` -C: +### C: + ```c int removeElement(int* nums, int numsSize, int val){ int slow = 0; @@ -391,7 +395,8 @@ int removeElement(int* nums, int numsSize, int val){ } ``` -Kotlin: +### Kotlin: + ```kotlin fun removeElement(nums: IntArray, `val`: Int): Int { var slowIndex = 0 // 初始化慢指针 @@ -402,7 +407,8 @@ fun removeElement(nums: IntArray, `val`: Int): Int { } ``` -Scala: +### Scala: + ```scala object Solution { def removeElement(nums: Array[Int], `val`: Int): Int = { @@ -418,7 +424,8 @@ object Solution { } ``` -C#: +### C#: + ```csharp public class Solution { public int RemoveElement(int[] nums, int val) { From ec101bebb24b9af7910c02b979b198c238ae12b1 Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Mon, 17 Jul 2023 15:21:00 +0800 Subject: [PATCH 2023/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200977.=E6=9C=89?= =?UTF-8?q?=E5=BA=8F=E6=95=B0=E7=BB=84=E7=9A=84=E5=B9=B3=E6=96=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...04\347\232\204\345\271\263\346\226\271.md" | 42 +++++++++++-------- 1 file changed, 25 insertions(+), 17 deletions(-) diff --git "a/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" "b/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" index de06c41925..4bee585ba8 100644 --- "a/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" +++ "b/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" @@ -21,14 +21,14 @@ * 输入:nums = [-7,-3,2,3,11] * 输出:[4,9,9,49,121] -# 算法公开课 +## 算法公开课 **[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[双指针法经典题目!LeetCode:977.有序数组的平方](https://www.bilibili.com/video/BV1QB4y1D7ep),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 -# 思路 +## 思路 -## 暴力排序 +### 暴力排序 最直观的想法,莫过于:每个数平方之后,排个序,美滋滋,代码如下: @@ -47,7 +47,7 @@ public: 这个时间复杂度是 O(n + nlogn), 可以说是O(nlogn)的时间复杂度,但为了和下面双指针法算法时间复杂度有鲜明对比,我记为 O(n + nlog n)。 -## 双指针法 +### 双指针法 数组其实是有序的, 只不过负数平方之后可能成为最大数了。 @@ -99,7 +99,8 @@ public: ## 其他语言版本 -Java: +### Java: + ```Java class Solution { public int[] sortedSquares(int[] nums) { @@ -141,7 +142,8 @@ class Solution { } ``` -Python: +### Python: + ```Python (版本一)双指针法 class Solution: @@ -176,7 +178,8 @@ class Solution: return sorted(x*x for x in nums) ``` -Go: +### Go: + ```Go func sortedSquares(nums []int) []int { n := len(nums) @@ -196,7 +199,8 @@ func sortedSquares(nums []int) []int { return ans } ``` -Rust +### Rust: + ```rust impl Solution { pub fn sorted_squares(nums: Vec) -> Vec { @@ -217,7 +221,8 @@ impl Solution { } } ``` -Javascript: +### Javascript: + ```Javascript /** * @param {number[]} nums @@ -242,7 +247,7 @@ var sortedSquares = function(nums) { }; ``` -Typescript: +### Typescript: 双指针法: @@ -277,7 +282,7 @@ function sortedSquares(nums: number[]): number[] { }; ``` -Swift: +### Swift: ```swift func sortedSquares(_ nums: [Int]) -> [Int] { @@ -305,7 +310,7 @@ func sortedSquares(_ nums: [Int]) -> [Int] { } ``` -Ruby: +### Ruby: ```ruby def sorted_squares(nums) @@ -323,8 +328,8 @@ def sorted_squares(nums) end ``` +### C: -C: ```c int* sortedSquares(int* nums, int numsSize, int* returnSize){ //返回的数组大小就是原数组大小 @@ -357,7 +362,8 @@ int* sortedSquares(int* nums, int numsSize, int* returnSize){ } ``` -PHP: +### PHP: + ```php class Solution { /** @@ -386,7 +392,7 @@ class Solution { } ``` -Kotlin: +### Kotlin: 双指针法 ```kotlin @@ -437,7 +443,7 @@ class Solution { } ``` -Scala: +### Scala: 双指针: ```scala @@ -473,7 +479,8 @@ object Solution { } ``` -C#: +### C#: + ```csharp public class Solution { public int[] SortedSquares(int[] nums) { @@ -504,3 +511,4 @@ public class Solution { + From 76c84efca0bcfab9e889bf97458dd6b6423e0f05 Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Mon, 17 Jul 2023 15:32:24 +0800 Subject: [PATCH 2024/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200209.=20?= =?UTF-8?q?=E9=95=BF=E5=BA=A6=E6=9C=80=E5=B0=8F=E7=9A=84=E5=AD=90=E6=95=B0?= =?UTF-8?q?=E7=BB=84=20=E6=8E=92=E7=89=88=E6=A0=BC=E5=BC=8F=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...04\345\255\220\346\225\260\347\273\204.md" | 41 +++++++++++-------- 1 file changed, 23 insertions(+), 18 deletions(-) diff --git "a/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" "b/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" index 82d551ea44..4b1d0e9608 100644 --- "a/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" +++ "b/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" @@ -23,14 +23,14 @@ * 1 <= nums.length <= 10^5 * 1 <= nums[i] <= 10^5 -# 算法公开课 +## 算法公开课 **[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[拿下滑动窗口! | LeetCode 209 长度最小的子数组](https://www.bilibili.com/video/BV1tZ4y1q7XE),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 -# 思路 +## 思路 -## 暴力解法 +### 暴力解法 这道题目暴力解法当然是 两个for循环,然后不断的寻找符合条件的子序列,时间复杂度很明显是O(n^2)。 @@ -64,7 +64,7 @@ public: 后面力扣更新了数据,暴力解法已经超时了。 -## 滑动窗口 +### 滑动窗口 接下来就开始介绍数组操作中另一个重要的方法:**滑动窗口**。 @@ -151,8 +151,8 @@ public: ## 其他语言版本 +### Java: -Java: ```java class Solution { @@ -173,7 +173,7 @@ class Solution { } ``` -Python: +### Python: ```python (版本一)滑动窗口法 @@ -216,7 +216,8 @@ class Solution: return min_len if min_len != float('inf') else 0 ``` -Go: +### Go: + ```go func minSubArrayLen(target int, nums []int) int { i := 0 @@ -242,8 +243,7 @@ func minSubArrayLen(target int, nums []int) int { } ``` - -JavaScript: +### JavaScript: ```js var minSubArrayLen = function(target, nums) { @@ -266,7 +266,7 @@ var minSubArrayLen = function(target, nums) { }; ``` -Typescript: +### Typescript: ```typescript function minSubArrayLen(target: number, nums: number[]): number { @@ -288,7 +288,7 @@ function minSubArrayLen(target: number, nums: number[]): number { }; ``` -Swift: +### Swift: ```swift func minSubArrayLen(_ target: Int, _ nums: [Int]) -> Int { @@ -309,7 +309,7 @@ func minSubArrayLen(_ target: Int, _ nums: [Int]) -> Int { } ``` -Rust: +### Rust: ```rust impl Solution { @@ -336,7 +336,8 @@ impl Solution { } ``` -PHP: +### PHP: + ```php // 双指针 - 滑动窗口 class Solution { @@ -365,7 +366,7 @@ class Solution { } ``` -Ruby: +### Ruby: ```ruby def min_sub_array_len(target, nums) @@ -383,8 +384,9 @@ def min_sub_array_len(target, nums) end ``` -C: +### C: 暴力解法: + ```c int minSubArrayLen(int target, int* nums, int numsSize){ //初始化最小长度为INT_MAX @@ -433,7 +435,8 @@ int minSubArrayLen(int target, int* nums, int numsSize){ } ``` -Kotlin: +### Kotlin: + ```kotlin class Solution { fun minSubArrayLen(target: Int, nums: IntArray): Int { @@ -485,7 +488,7 @@ class Solution { } } ``` -Scala: +### Scala: 滑动窗口: ```scala @@ -533,7 +536,8 @@ object Solution { } } ``` -C#: +### C#: + ```csharp public class Solution { public int MinSubArrayLen(int s, int[] nums) { @@ -559,3 +563,4 @@ public class Solution { + From 7a30d500cb5f328c3e4c952f2f9ae0ecb3382b45 Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Mon, 17 Jul 2023 15:47:48 +0800 Subject: [PATCH 2025/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20059.=E8=9E=BA?= =?UTF-8?q?=E6=97=8B=E7=9F=A9=E9=98=B5II=20=E6=8E=92=E7=89=88=E6=A0=BC?= =?UTF-8?q?=E5=BC=8F=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\346\227\213\347\237\251\351\230\265II.md" | 33 +++++++++++-------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git "a/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" "b/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" index fd40f3fc52..f03fcdad35 100644 --- "a/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" +++ "b/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" @@ -26,7 +26,7 @@ ## 算法公开课 **[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[拿下螺旋矩阵!LeetCode:59.螺旋矩阵II](https://www.bilibili.com/video/BV1SL4y1N7mV),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 - + ## 思路 这道题目可以说在面试中出现频率较高的题目,**本题并不涉及到什么算法,就是模拟过程,但却十分考察对代码的掌控能力。** @@ -125,15 +125,15 @@ public: ## 类似题目 -* 54.螺旋矩阵 -* 剑指Offer 29.顺时针打印矩阵 +* [54.螺旋矩阵](https://leetcode.cn/problems/spiral-matrix/) +* [剑指Offer 29.顺时针打印矩阵](https://leetcode.cn/problems/shun-shi-zhen-da-yin-ju-zhen-lcof/) ## 其他语言版本 -Java: +### Java: ```Java class Solution { @@ -176,7 +176,7 @@ class Solution { } ``` -python3: +### python3: ```python class Solution: @@ -207,7 +207,7 @@ class Solution: return nums ``` -javaScript +### JavaScript: ```javascript @@ -259,7 +259,7 @@ var generateMatrix = function(n) { ``` -TypeScript: +### TypeScript: ```typescript function generateMatrix(n: number): number[][] { @@ -304,7 +304,7 @@ function generateMatrix(n: number): number[][] { }; ``` -Go: +### Go: ```go package main @@ -397,7 +397,7 @@ func generateMatrix(n int) [][]int { } ``` -Swift: +### Swift: ```swift func generateMatrix(_ n: Int) -> [[Int]] { @@ -453,7 +453,7 @@ func generateMatrix(_ n: Int) -> [[Int]] { } ``` -Rust: +### Rust: ```rust impl Solution { @@ -506,7 +506,8 @@ impl Solution { } ``` -PHP: +### PHP: + ```php class Solution { /** @@ -548,7 +549,8 @@ class Solution { } ``` -C: +### C: + ```c int** generateMatrix(int n, int* returnSize, int** returnColumnSizes){ //初始化返回的结果数组的大小 @@ -607,7 +609,8 @@ int** generateMatrix(int n, int* returnSize, int** returnColumnSizes){ return ans; } ``` -Scala: +### Scala: + ```scala object Solution { def generateMatrix(n: Int): Array[Array[Int]] = { @@ -659,7 +662,8 @@ object Solution { } } ``` -C#: +### C#: + ```csharp public class Solution { public int[][] GenerateMatrix(int n) { @@ -688,3 +692,4 @@ public class Solution { + From 053632c31d05cae6391b29db2ec76f1945eb2cfe Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Mon, 17 Jul 2023 15:51:53 +0800 Subject: [PATCH 2026/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20=E6=95=B0?= =?UTF-8?q?=E7=BB=84=E6=80=BB=E7=BB=93=E7=AF=87=20=E6=8E=92=E7=89=88?= =?UTF-8?q?=E6=A0=BC=E5=BC=8F=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...3\204\346\200\273\347\273\223\347\257\207.md" | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git "a/problems/\346\225\260\347\273\204\346\200\273\347\273\223\347\257\207.md" "b/problems/\346\225\260\347\273\204\346\200\273\347\273\223\347\257\207.md" index ef962187fe..7550ce0254 100644 --- "a/problems/\346\225\260\347\273\204\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/\346\225\260\347\273\204\346\200\273\347\273\223\347\257\207.md" @@ -4,9 +4,9 @@

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+# 数组总结篇 - -# 数组理论基础 +## 数组理论基础 数组是非常基础的数据结构,在面试中,考察数组的题目一般在思维上都不难,主要是考察对代码的掌控能力 @@ -51,7 +51,7 @@ 所以**Java的二维数组在内存中不是 `3*4` 的连续地址空间,而是四条连续的地址空间组成!** -# 数组的经典题目 +## 数组的经典题目 在面试中,数组是必考的基础数据结构。 @@ -59,7 +59,7 @@ 我们之前一共讲解了四道经典数组题目,每一道题目都代表一个类型,一种思想。 -## 二分法 +### 二分法 [数组:每次遇到二分法,都是一看就会,一写就废](https://programmercarl.com/0704.二分查找.html) @@ -75,7 +75,7 @@ **二分法是算法面试中的常考题,建议通过这道题目,锻炼自己手撕二分的能力**。 -## 双指针法 +### 双指针法 * [数组:就移除个元素很难么?](https://programmercarl.com/0027.移除元素.html) @@ -91,7 +91,7 @@ 双指针法(快慢指针法)在数组和链表的操作中是非常常见的,很多考察数组和链表操作的面试题,都使用双指针法。 -## 滑动窗口 +### 滑动窗口 * [数组:滑动窗口拯救了你](https://programmercarl.com/0209.长度最小的子数组.html) @@ -107,7 +107,7 @@ 如果没有接触过这一类的方法,很难想到类似的解题思路,滑动窗口方法还是很巧妙的。 -## 模拟行为 +### 模拟行为 * [数组:这个循环可以转懵很多人!](https://programmercarl.com/0059.螺旋矩阵II.html) @@ -118,7 +118,7 @@ 相信大家有遇到过这种情况: 感觉题目的边界调节超多,一波接着一波的判断,找边界,拆了东墙补西墙,好不容易运行通过了,代码写的十分冗余,毫无章法,其实**真正解决题目的代码都是简洁的,或者有原则性的**,大家可以在这道题目中体会到这一点。 -# 总结 +## 总结 ![](https://code-thinking-1253855093.file.myqcloud.com/pics/数组总结.png) From a3cc34ef7413e7e80420674bd261e4de393f152c Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Mon, 17 Jul 2023 15:53:46 +0800 Subject: [PATCH 2027/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20=E6=95=B0?= =?UTF-8?q?=E7=BB=84=E7=90=86=E8=AE=BA=E5=9F=BA=E7=A1=80=20=E6=8E=92?= =?UTF-8?q?=E7=89=88=E6=A0=BC=E5=BC=8F=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\273\204\347\220\206\350\256\272\345\237\272\347\241\200.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/\346\225\260\347\273\204\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\346\225\260\347\273\204\347\220\206\350\256\272\345\237\272\347\241\200.md" index 67b7b20d1b..d104c883f7 100644 --- "a/problems/\346\225\260\347\273\204\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\346\225\260\347\273\204\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -6,7 +6,7 @@ -## 数组理论基础 +# 数组理论基础 数组是非常基础的数据结构,在面试中,考察数组的题目一般在思维上都不难,主要是考察对代码的掌控能力 From b51a1d89bf6b340f3a96ba7f109c1d481a887693 Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Tue, 18 Jul 2023 14:21:20 +0800 Subject: [PATCH 2028/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20=E9=93=BE?= =?UTF-8?q?=E8=A1=A8=E7=90=86=E8=AE=BA=E5=9F=BA=E7=A1=80=20=E6=8E=92?= =?UTF-8?q?=E7=89=88=E6=A0=BC=E5=BC=8F=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...06\350\256\272\345\237\272\347\241\200.md" | 36 +++++++++---------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git "a/problems/\351\223\276\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\351\223\276\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" index a09974df7c..da5a1b0244 100644 --- "a/problems/\351\223\276\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\351\223\276\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -16,15 +16,15 @@ 如图所示: ![链表1](https://code-thinking-1253855093.file.myqcloud.com/pics/20200806194529815.png) -# 链表的类型 +## 链表的类型 接下来说一下链表的几种类型: -## 单链表 +### 单链表 刚刚说的就是单链表。 -## 双链表 +### 双链表 单链表中的指针域只能指向节点的下一个节点。 @@ -35,7 +35,7 @@ 如图所示: ![链表2](https://code-thinking-1253855093.file.myqcloud.com/pics/20200806194559317.png) -## 循环链表 +### 循环链表 循环链表,顾名思义,就是链表首尾相连。 @@ -44,7 +44,7 @@ ![链表4](https://code-thinking-1253855093.file.myqcloud.com/pics/20200806194629603.png) -# 链表的存储方式 +## 链表的存储方式 了解完链表的类型,再来说一说链表在内存中的存储方式。 @@ -60,7 +60,7 @@ 这个链表起始节点为2, 终止节点为7, 各个节点分布在内存的不同地址空间上,通过指针串联在一起。 -# 链表的定义 +## 链表的定义 接下来说一说链表的定义。 @@ -100,9 +100,9 @@ head->val = 5; 所以如果不定义构造函数使用默认构造函数的话,在初始化的时候就不能直接给变量赋值! -# 链表的操作 +## 链表的操作 -## 删除节点 +### 删除节点 删除D节点,如图所示: @@ -116,7 +116,7 @@ head->val = 5; 其他语言例如Java、Python,就有自己的内存回收机制,就不用自己手动释放了。 -## 添加节点 +### 添加节点 如图所示: @@ -126,7 +126,7 @@ head->val = 5; 但是要注意,要是删除第五个节点,需要从头节点查找到第四个节点通过next指针进行删除操作,查找的时间复杂度是O(n)。 -# 性能分析 +## 性能分析 再把链表的特性和数组的特性进行一个对比,如图所示: @@ -143,8 +143,7 @@ head->val = 5; ## 其他语言版本 - -Java: +### Java: ```java public class ListNode { @@ -171,7 +170,7 @@ public class ListNode { } ``` -JavaScript: +### JavaScript: ```javascript class ListNode { @@ -184,7 +183,7 @@ class ListNode { } ``` -TypeScript: +### TypeScript: ```typescript class ListNode { @@ -197,7 +196,7 @@ class ListNode { } ``` -Python: +### Python: ```python class ListNode: @@ -206,7 +205,7 @@ class ListNode: self.next = next ``` -Go: +### Go: ```go type ListNode struct { @@ -215,7 +214,7 @@ type ListNode struct { } ``` -Scala: +### Scala: ```scala class ListNode(_x: Int = 0, _next: ListNode = null) { @@ -224,7 +223,7 @@ class ListNode(_x: Int = 0, _next: ListNode = null) { } ``` -Rust: +### Rust: ```rust #[derive(PartialEq, Eq, Clone, Debug)] @@ -246,3 +245,4 @@ impl ListNode { + From a78116889f705d9e7f72f927decb0a9e844bd807 Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Tue, 18 Jul 2023 14:28:12 +0800 Subject: [PATCH 2029/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200203.=E7=A7=BB?= =?UTF-8?q?=E9=99=A4=E9=93=BE=E8=A1=A8=E5=85=83=E7=B4=A0=20=E6=8E=92?= =?UTF-8?q?=E7=89=88=E6=A0=BC=E5=BC=8F=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...76\350\241\250\345\205\203\347\264\240.md" | 33 +++++++++---------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git "a/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" "b/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" index 300f98e911..f09c572b95 100644 --- "a/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" +++ "b/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" @@ -27,14 +27,12 @@ 输入:head = [7,7,7,7], val = 7 输出:[] -# 算法公开课 +## 算法公开课 **[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[链表基础操作| LeetCode:203.移除链表元素](https://www.bilibili.com/video/BV18B4y1s7R9),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 -# 思路 - -为了方便大家理解,我特意录制了视频:[链表基础操作| LeetCode:203.移除链表元素](https://www.bilibili.com/video/BV18B4y1s7R9),结合视频在看本题解,事半功倍。 +## 思路 这里以链表 1 4 2 4 来举例,移除元素4。 @@ -91,7 +89,7 @@ 最后呢在题目中,return 头结点的时候,别忘了 `return dummyNode->next;`, 这才是新的头结点 -# C++代码 +### C++代码 **直接使用原来的链表来进行移除节点操作:** @@ -159,7 +157,7 @@ public: ## 其他语言版本 -C: +### C: 用原来的链表操作: ```c @@ -227,7 +225,7 @@ struct ListNode* removeElements(struct ListNode* head, int val){ } ``` -Java: +### Java: ```java /** @@ -308,7 +306,7 @@ public ListNode removeElements(ListNode head, int val) { } ``` -Python: +### Python: ```python (版本一)虚拟头节点法 @@ -334,7 +332,7 @@ class Solution: ``` -Go: +### Go: ```go /** @@ -359,7 +357,7 @@ func removeElements(head *ListNode, val int) *ListNode { } ``` -javaScript: +### JavaScript: ```js /** @@ -381,7 +379,7 @@ var removeElements = function(head, val) { }; ``` -TypeScript: +### TypeScript: 版本一(在原链表上直接删除): @@ -437,7 +435,7 @@ function removeElements(head: ListNode | null, val: number): ListNode | null { }; ``` -Swift: +### Swift: ```swift /** @@ -465,7 +463,7 @@ func removeElements(_ head: ListNode?, _ val: Int) -> ListNode? { } ``` -PHP: +### PHP: ```php /** @@ -493,7 +491,7 @@ func removeElements(head *ListNode, val int) *ListNode { } ``` -RUST: +### Rust: ```rust // Definition for singly-linked list. @@ -531,7 +529,7 @@ impl Solution { } ``` -Scala: +### Scala: ```scala /** @@ -564,7 +562,7 @@ object Solution { } ``` -Kotlin: +### Kotlin: ```kotlin /** @@ -600,7 +598,8 @@ class Solution { } ``` -C# +### C# + ```CSharp /** * Definition for singly-linked list. From 61366ff59037d5f22f256e5bc410efd8a36a35d3 Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Tue, 18 Jul 2023 14:41:02 +0800 Subject: [PATCH 2030/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200707.=E8=AE=BE?= =?UTF-8?q?=E8=AE=A1=E9=93=BE=E8=A1=A8=20=E6=8E=92=E7=89=88=E6=A0=BC?= =?UTF-8?q?=E5=BC=8F=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...76\350\241\250\345\205\203\347\264\240.md" | 4 +-- ...76\350\256\241\351\223\276\350\241\250.md" | 34 ++++++++++--------- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git "a/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" "b/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" index f09c572b95..c8f802a183 100644 --- "a/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" +++ "b/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" @@ -88,9 +88,6 @@ 最后呢在题目中,return 头结点的时候,别忘了 `return dummyNode->next;`, 这才是新的头结点 - -### C++代码 - **直接使用原来的链表来进行移除节点操作:** ```CPP @@ -638,3 +635,4 @@ public class Solution + diff --git "a/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" "b/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" index 3f096a2246..c27f0107fb 100644 --- "a/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" +++ "b/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" @@ -25,12 +25,12 @@ ![707示例](https://code-thinking-1253855093.file.myqcloud.com/pics/20200814200558953.png) -# 算法公开课 +## 算法公开课 **[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[帮你把链表操作学个通透!LeetCode:707.设计链表](https://www.bilibili.com/video/BV1FU4y1X7WD),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 -# 思路 +## 思路 如果对链表的基础知识还不太懂,可以看这篇文章:[关于链表,你该了解这些!](https://programmercarl.com/链表理论基础.html) @@ -58,8 +58,6 @@ 下面采用的设置一个虚拟头结点(这样更方便一些,大家看代码就会感受出来)。 - -## 代码 ```CPP class MyLinkedList { public: @@ -167,7 +165,8 @@ private: ## 其他语言版本 -C: +### C: + ```C typedef struct MyLinkedList { int val; @@ -291,7 +290,8 @@ void myLinkedListFree(MyLinkedList* obj) { */ ``` -Java: +### Java: + ```Java //单链表 class ListNode { @@ -487,7 +487,8 @@ class MyLinkedList { */ ``` -Python: +### Python: + ```python (版本一)单链表法 class ListNode: @@ -661,7 +662,7 @@ class MyLinkedList: # obj.deleteAtIndex(index) ``` -Go: +### Go: ```go //单链表实现 @@ -915,7 +916,7 @@ func (this *MyLinkedList) DeleteAtIndex(index int) { } ``` -javaScript: +### JavaScript: ```js @@ -1055,7 +1056,8 @@ MyLinkedList.prototype.deleteAtIndex = function(index) { */ ``` -TypeScript: +### TypeScript: + ```TypeScript class ListNode { public val: number; @@ -1173,7 +1175,8 @@ class MyLinkedList { } ``` -Kotlin: +### Kotlin: + ```kotlin class MyLinkedList { @@ -1241,8 +1244,7 @@ class MyLinkedList { } ``` - -Swift: +### Swift: ```swift class MyLinkedList { @@ -1323,7 +1325,8 @@ class MyLinkedList { } ``` -Scala: +### Scala: + ```scala class ListNode(_x: Int = 0, _next: ListNode = null) { var next: ListNode = _next @@ -1393,7 +1396,7 @@ class MyLinkedList() { } ``` -Rust: +### Rust: ```rust #[derive(Debug)] @@ -1486,4 +1489,3 @@ impl MyLinkedList { - From 32bf073bc8c2fe08aabc9aaf0ef61184febfb0a8 Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Tue, 18 Jul 2023 14:50:44 +0800 Subject: [PATCH 2031/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200206.=E5=8F=8D?= =?UTF-8?q?=E8=BD=AC=E9=93=BE=E8=A1=A8=20=E6=8E=92=E7=89=88=E6=A0=BC?= =?UTF-8?q?=E5=BC=8F=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...15\350\275\254\351\223\276\350\241\250.md" | 745 ++++++++++++++++++ ...73\350\275\254\351\223\276\350\241\250.md" | 55 +- 2 files changed, 772 insertions(+), 28 deletions(-) create mode 100644 "problems/0206.\345\217\215\350\275\254\351\223\276\350\241\250.md" diff --git "a/problems/0206.\345\217\215\350\275\254\351\223\276\350\241\250.md" "b/problems/0206.\345\217\215\350\275\254\351\223\276\350\241\250.md" new file mode 100644 index 0000000000..5a57939af2 --- /dev/null +++ "b/problems/0206.\345\217\215\350\275\254\351\223\276\350\241\250.md" @@ -0,0 +1,745 @@ +

+ + + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+ + +> 反转链表的写法很简单,一些同学甚至可以背下来但过一阵就忘了该咋写,主要是因为没有理解真正的反转过程。 + +# 206.反转链表 + +[力扣题目链接](https://leetcode.cn/problems/reverse-linked-list/) + +题意:反转一个单链表。 + +示例: +输入: 1->2->3->4->5->NULL +输出: 5->4->3->2->1->NULL + +## 算法公开课 + +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[帮你拿下反转链表 | LeetCode:206.反转链表](https://www.bilibili.com/video/BV1nB4y1i7eL),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 + + +## 思路 + +如果再定义一个新的链表,实现链表元素的反转,其实这是对内存空间的浪费。 + +其实只需要改变链表的next指针的指向,直接将链表反转 ,而不用重新定义一个新的链表,如图所示: + + +![206_反转链表](https://code-thinking-1253855093.file.myqcloud.com/pics/20210218090901207.png) + +之前链表的头节点是元素1, 反转之后头结点就是元素5 ,这里并没有添加或者删除节点,仅仅是改变next指针的方向。 + +那么接下来看一看是如何反转的呢? + +我们拿有示例中的链表来举例,如动画所示:(纠正:动画应该是先移动pre,在移动cur) + +![](https://code-thinking.cdn.bcebos.com/gifs/206.%E7%BF%BB%E8%BD%AC%E9%93%BE%E8%A1%A8.gif) + +首先定义一个cur指针,指向头结点,再定义一个pre指针,初始化为null。 + +然后就要开始反转了,首先要把 cur->next 节点用tmp指针保存一下,也就是保存一下这个节点。 + +为什么要保存一下这个节点呢,因为接下来要改变 cur->next 的指向了,将cur->next 指向pre ,此时已经反转了第一个节点了。 + +接下来,就是循环走如下代码逻辑了,继续移动pre和cur指针。 + +最后,cur 指针已经指向了null,循环结束,链表也反转完毕了。 此时我们return pre指针就可以了,pre指针就指向了新的头结点。 + +### 双指针法 +```CPP +class Solution { +public: + ListNode* reverseList(ListNode* head) { + ListNode* temp; // 保存cur的下一个节点 + ListNode* cur = head; + ListNode* pre = NULL; + while(cur) { + temp = cur->next; // 保存一下 cur的下一个节点,因为接下来要改变cur->next + cur->next = pre; // 翻转操作 + // 更新pre 和 cur指针 + pre = cur; + cur = temp; + } + return pre; + } +}; +``` + +* 时间复杂度: O(n) +* 空间复杂度: O(1) + +### 递归法 + +递归法相对抽象一些,但是其实和双指针法是一样的逻辑,同样是当cur为空的时候循环结束,不断将cur指向pre的过程。 + +关键是初始化的地方,可能有的同学会不理解, 可以看到双指针法中初始化 cur = head,pre = NULL,在递归法中可以从如下代码看出初始化的逻辑也是一样的,只不过写法变了。 + +具体可以看代码(已经详细注释),**双指针法写出来之后,理解如下递归写法就不难了,代码逻辑都是一样的。** +```CPP +class Solution { +public: + ListNode* reverse(ListNode* pre,ListNode* cur){ + if(cur == NULL) return pre; + ListNode* temp = cur->next; + cur->next = pre; + // 可以和双指针法的代码进行对比,如下递归的写法,其实就是做了这两步 + // pre = cur; + // cur = temp; + return reverse(cur,temp); + } + ListNode* reverseList(ListNode* head) { + // 和双指针法初始化是一样的逻辑 + // ListNode* cur = head; + // ListNode* pre = NULL; + return reverse(NULL, head); + } + +}; +``` + +* 时间复杂度: O(n), 要递归处理链表的每个节点 +* 空间复杂度: O(n), 递归调用了 n 层栈空间 + +我们可以发现,上面的递归写法和双指针法实质上都是从前往后翻转指针指向,其实还有另外一种与双指针法不同思路的递归写法:从后往前翻转指针指向。 + +具体代码如下(带详细注释): + +```CPP +class Solution { +public: + 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; + } +}; +``` + +* 时间复杂度: O(n) +* 空间复杂度: O(n) + + +## 其他语言版本 + +### Java: + +```java +// 双指针 +class Solution { + public ListNode reverseList(ListNode head) { + ListNode prev = null; + ListNode cur = head; + ListNode temp = null; + while (cur != null) { + temp = cur.next;// 保存下一个节点 + cur.next = prev; + prev = cur; + cur = temp; + } + return prev; + } +} +``` + +```java +// 递归 +class Solution { + public ListNode reverseList(ListNode head) { + return reverse(null, head); + } + + private ListNode reverse(ListNode prev, ListNode cur) { + if (cur == null) { + return prev; + } + ListNode temp = null; + temp = cur.next;// 先保存下一个节点 + cur.next = prev;// 反转 + // 更新prev、cur位置 + // prev = cur; + // cur = temp; + return reverse(cur, temp); + } +} +``` + +```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 +(版本一)双指针法 +# Definition for singly-linked list. +# class ListNode: +# def __init__(self, val=0, next=None): +# self.val = val +# self.next = next +class Solution: + def reverseList(self, head: ListNode) -> ListNode: + cur = head + pre = None + while cur: + temp = cur.next # 保存一下 cur的下一个节点,因为接下来要改变cur->next + cur.next = pre #反转 + #更新pre、cur指针 + pre = cur + cur = temp + return pre +``` + +```python +(版本二)递归法 +# Definition for singly-linked list. +# class ListNode: +# def __init__(self, val=0, next=None): +# self.val = val +# self.next = next +class Solution: + def reverseList(self, head: ListNode) -> ListNode: + return self.reverse(head, None) + def reverse(self, cur: ListNode, pre: ListNode) -> ListNode: + if cur == None: + return pre + temp = cur.next + cur.next = pre + return self.reverse(temp, cur) + +``` + + + +### Go: + +```go +//双指针 +func reverseList(head *ListNode) *ListNode { + var pre *ListNode + cur := head + for cur != nil { + next := cur.Next + cur.Next = pre + pre = cur + cur = next + } + return pre +} + +//递归 +func reverseList(head *ListNode) *ListNode { + return help(nil, head) +} + +func help(pre, head *ListNode)*ListNode{ + if head == nil { + return pre + } + next := head.Next + head.Next = pre + return help(head, next) +} + +``` +### JavaScript: + +```js +/** + * @param {ListNode} head + * @return {ListNode} + */ + +// 双指针: +var reverseList = function(head) { + if(!head || !head.next) return head; + let temp = null, pre = null, cur = head; + while(cur) { + temp = cur.next; + cur.next = pre; + pre = cur; + cur = temp; + } + // temp = cur = null; + return pre; +}; + +// 递归: +var reverse = function(pre, head) { + if(!head) return pre; + const temp = head.next; + head.next = pre; + pre = head + return reverse(pre, temp); +} + +var reverseList = function(head) { + return reverse(null, head); +}; + +// 递归2 +var reverse = function(head) { + if(!head || !head.next) return head; + // 从后往前翻 + const pre = reverse(head.next); + head.next = pre.next; + pre.next = head; + return head; +} + +var reverseList = function(head) { + let cur = head; + while(cur && cur.next) { + cur = cur.next; + } + reverse(head); + return cur; +}; +``` + +### TypeScript: + +```typescript +// 双指针法 +function reverseList(head: ListNode | null): ListNode | null { + let preNode: ListNode | null = null, + curNode: ListNode | null = head, + tempNode: ListNode | null; + while (curNode) { + tempNode = curNode.next; + curNode.next = preNode; + preNode = curNode; + curNode = tempNode; + } + return preNode; +}; + +// 递归(从前往后翻转) +function reverseList(head: ListNode | null): ListNode | null { + function recur(preNode: ListNode | null, curNode: ListNode | null): ListNode | null { + if (curNode === null) return preNode; + let tempNode: ListNode | null = curNode.next; + curNode.next = preNode; + preNode = curNode; + curNode = tempNode; + return recur(preNode, curNode); + } + return recur(null, head); +}; + +// 递归(从后往前翻转) +function reverseList(head: ListNode | null): ListNode | null { + if (head === null) return null; + let newHead: ListNode | null; + function recur(node: ListNode | null, preNode: ListNode | null): void { + if (node.next === null) { + newHead = node; + newHead.next = preNode; + } else { + recur(node.next, node); + node.next = preNode; + } + } + recur(head, null); + return newHead; +}; +``` + +### Ruby: + +```ruby +# 双指针 +# Definition for singly-linked list. +# class ListNode +# attr_accessor :val, :next +# def initialize(val = 0, _next = nil) +# @val = val +# @next = _next +# end +# end +def reverse_list(head) + # return nil if head.nil? # 循环判断条件亦能起到相同作用因此不必单独判断 + cur, per = head, nil + until cur.nil? + tem = cur.next + cur.next = per + per = cur + cur = tem + end + per +end + +# 递归 +# Definition for singly-linked list. +# class ListNode +# attr_accessor :val, :next +# def initialize(val = 0, _next = nil) +# @val = val +# @next = _next +# end +# end +def reverse_list(head) + reverse(nil, head) +end + +def reverse(pre, cur) + return pre if cur.nil? + tem = cur.next + cur.next = pre + reverse(cur, tem) # 通过递归实现双指针法中的更新操作 +end +``` + +### Kotlin: + +```Kotlin +fun reverseList(head: ListNode?): ListNode? { + var pre: ListNode? = null + var cur = head + while (cur != null) { + val temp = cur.next + cur.next = pre + pre = cur + cur = temp + } + return pre +} +``` +```kotlin +/** + * Example: + * var li = ListNode(5) + * var v = li.`val` + * Definition for singly-linked list. + * class ListNode(var `val`: Int) { + * var next: ListNode? = null + * } + */ +class Solution { + fun reverseList(head: ListNode?): ListNode? { + // temp用来存储临时的节点 + var temp: ListNode? + // cur用来遍历链表 + var cur: ListNode? = head + // pre用来作为链表反转的工具 + // pre是比pre前一位的节点 + var pre: ListNode? = null + while (cur != null) { + // 临时存储原本cur的下一个节点 + temp = cur.next + // 使cur下一节点地址为它之前的 + cur.next = pre + // 之后随着cur的遍历移动pre + pre = cur; + // 移动cur遍历链表各个节点 + cur = temp; + } + // 由于开头使用pre为null,所以cur等于链表本身长度+1, + // 此时pre在cur前一位,所以此时pre为头节点 + return pre; + } +} +``` + +### Swift: + +```swift +/// 双指针法 (迭代) +/// - Parameter head: 头结点 +/// - Returns: 翻转后的链表头结点 +func reverseList(_ head: ListNode?) -> ListNode? { + if head == nil || head?.next == nil { + return head + } + var pre: ListNode? = nil + var cur: ListNode? = head + var temp: ListNode? = nil + while cur != nil { + temp = cur?.next + cur?.next = pre + pre = cur + cur = temp + } + return pre +} + +/// 递归 +/// - Parameter head: 头结点 +/// - Returns: 翻转后的链表头结点 +func reverseList2(_ head: ListNode?) -> ListNode? { + return reverse(pre: nil, cur: head) +} +func reverse(pre: ListNode?, cur: ListNode?) -> ListNode? { + if cur == nil { + return pre + } + let temp: ListNode? = cur?.next + cur?.next = pre + return reverse(pre: cur, cur: temp) +} +``` + +### C: +双指针法: + +```c +struct ListNode* reverseList(struct ListNode* head){ + //保存cur的下一个结点 + struct ListNode* temp; + //pre指针指向前一个当前结点的前一个结点 + struct ListNode* pre = NULL; + //用head代替cur,也可以再定义一个cur结点指向head。 + while(head) { + //保存下一个结点的位置 + temp = head->next; + //翻转操作 + head->next = pre; + //更新结点 + pre = head; + head = temp; + } + return pre; +} +``` + +递归法: +```c +struct ListNode* reverse(struct ListNode* pre, struct ListNode* cur) { + if(!cur) + return pre; + struct ListNode* temp = cur->next; + cur->next = pre; + //将cur作为pre传入下一层 + //将temp作为cur传入下一层,改变其指针指向当前cur + return reverse(cur, temp); +} + +struct ListNode* reverseList(struct ListNode* head){ + return reverse(NULL, head); +} +``` + + + +### PHP: + +```php +// 双指针法: +function reverseList($head) { + $cur = $head; + $pre = NULL; + while($cur){ + $temp = $cur->next; + $cur->next = $pre; + $pre = $cur; + $cur = $temp; + } + return $pre; + } +``` + +### Scala: +双指针法: + +```scala +object Solution { + def reverseList(head: ListNode): ListNode = { + var pre: ListNode = null + var cur = head + while (cur != null) { + var tmp = cur.next + cur.next = pre + pre = cur + cur = tmp + } + pre + } +} +``` +递归法: +```scala +object Solution { + def reverseList(head: ListNode): ListNode = { + reverse(null, head) + } + + def reverse(pre: ListNode, cur: ListNode): ListNode = { + if (cur == null) { + return pre // 如果当前cur为空,则返回pre + } + val tmp: ListNode = cur.next + cur.next = pre + reverse(cur, tmp) // 此时cur成为前一个节点,tmp是当前节点 + } + +} +``` + +### Rust: +双指针法: + +```rust +impl Solution { + pub fn reverse_list(head: Option>) -> Option> { + let mut cur = head; + let mut pre = None; + while let Some(mut node) = cur.take() { + cur = node.next; + node.next = pre; + pre = Some(node); + } + pre + } +} +``` + +递归法: + +```rust +impl Solution { + pub fn reverse_list(head: Option>) -> Option> { + fn rev( + mut head: Option>, + mut pre: Option>, + ) -> Option> { + if let Some(mut node) = head.take() { + let cur = node.next; + node.next = pre; + pre = Some(node); + return rev(cur, pre); + } + pre + } + rev(head, None) + } +} +``` +### C#: +三指针法, 感觉会更直观: + +```cs +public LinkNumbers Reverse() +{ + ///用三指针,写的过程中能够弥补二指针在翻转过程中的想象 + LinkNumbers pre = null; + var move = root; + var next = root; + + while (next != null) + { + next = next.linknext; + move.linknext = pre; + pre = move; + move = next; + } + root = pre; + return root; +} + +///LinkNumbers的定义 +public class LinkNumbers +{ + /// + /// 链表值 + /// + public int value { get; set; } + + /// + /// 链表指针 + /// + public LinkNumbers linknext { get; set; } +} +``` + +## 其他解法 + +### 使用虚拟头结点解决链表反转 + +> 使用虚拟头结点,通过头插法实现链表的反转(不需要栈) + +```java +// 迭代方法:增加虚头结点,使用头插法实现链表翻转 +public static ListNode reverseList1(ListNode head) { + // 创建虚头结点 + ListNode dumpyHead = new ListNode(-1); + dumpyHead.next = null; + // 遍历所有节点 + ListNode cur = head; + while(cur != null){ + ListNode temp = cur.next; + // 头插法 + cur.next = dumpyHead.next; + dumpyHead.next = cur; + cur = temp; + } + return dumpyHead.next; +} +``` + + + +### 使用栈解决反转链表的问题 + +* 首先将所有的结点入栈 +* 然后创建一个虚拟虚拟头结点,让cur指向虚拟头结点。然后开始循环出栈,每出来一个元素,就把它加入到以虚拟头结点为头结点的链表当中,最后返回即可。 + +```java +public ListNode reverseList(ListNode head) { + // 如果链表为空,则返回空 + if (head == null) return null; + // 如果链表中只有只有一个元素,则直接返回 + if (head.next == null) return head; + // 创建栈 每一个结点都入栈 + Stack stack = new Stack<>(); + ListNode cur = head; + while (cur != null) { + stack.push(cur); + cur = cur.next; + } + // 创建一个虚拟头结点 + ListNode pHead = new ListNode(0); + cur = pHead; + while (!stack.isEmpty()) { + ListNode node = stack.pop(); + cur.next = node; + cur = cur.next; + } + // 最后一个元素的next要赋值为空 + cur.next = null; + return pHead.next; +} +``` + +> 采用这种方法需要注意一点。就是当整个出栈循环结束以后,cur正好指向原来链表的第一个结点,而此时结点1中的next指向的是结点2,因此最后还需要`cur.next = null` +![image-20230117195418626](https://raw.githubusercontent.com/liyuxuan7762/MyImageOSS/master/md_images/image-20230117195418626.png) + +

+ + + diff --git "a/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md" "b/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md" index c63c998dc7..5a57939af2 100644 --- "a/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md" +++ "b/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md" @@ -17,14 +17,12 @@ 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL -# 算法公开课 +## 算法公开课 **[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[帮你拿下反转链表 | LeetCode:206.反转链表](https://www.bilibili.com/video/BV1nB4y1i7eL),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 -# 思路 - -本题我录制了B站视频,[帮你拿下反转链表 | LeetCode:206.反转链表](https://www.bilibili.com/video/BV1nB4y1i7eL),相信结合视频在看本篇题解,更有助于大家对链表的理解。 +## 思路 如果再定义一个新的链表,实现链表元素的反转,其实这是对内存空间的浪费。 @@ -51,9 +49,7 @@ 最后,cur 指针已经指向了null,循环结束,链表也反转完毕了。 此时我们return pre指针就可以了,pre指针就指向了新的头结点。 -# C++代码 - -## 双指针法 +### 双指针法 ```CPP class Solution { public: @@ -76,7 +72,7 @@ public: * 时间复杂度: O(n) * 空间复杂度: O(1) -## 递归法 +### 递归法 递归法相对抽象一些,但是其实和双指针法是一样的逻辑,同样是当cur为空的时候循环结束,不断将cur指向pre的过程。 @@ -137,8 +133,8 @@ public: ## 其他语言版本 +### Java: -Java: ```java // 双指针 class Solution { @@ -198,7 +194,8 @@ class Solution { } ``` -Python +### Python: + ```python (版本一)双指针法 # Definition for singly-linked list. @@ -219,8 +216,6 @@ class Solution: return pre ``` -Python递归法: - ```python (版本二)递归法 # Definition for singly-linked list. @@ -242,7 +237,7 @@ class Solution: -Go: +### Go: ```go //双指针 @@ -273,7 +268,7 @@ func help(pre, head *ListNode)*ListNode{ } ``` -javaScript: +### JavaScript: ```js /** @@ -328,7 +323,7 @@ var reverseList = function(head) { }; ``` -TypeScript: +### TypeScript: ```typescript // 双指针法 @@ -376,7 +371,7 @@ function reverseList(head: ListNode | null): ListNode | null { }; ``` -Ruby: +### Ruby: ```ruby # 双指针 @@ -421,7 +416,8 @@ def reverse(pre, cur) end ``` -Kotlin: +### Kotlin: + ```Kotlin fun reverseList(head: ListNode?): ListNode? { var pre: ListNode? = null @@ -471,7 +467,8 @@ class Solution { } ``` -Swift: +### Swift: + ```swift /// 双指针法 (迭代) /// - Parameter head: 头结点 @@ -508,8 +505,9 @@ func reverse(pre: ListNode?, cur: ListNode?) -> ListNode? { } ``` -C: +### C: 双指针法: + ```c struct ListNode* reverseList(struct ListNode* head){ //保存cur的下一个结点 @@ -549,7 +547,8 @@ struct ListNode* reverseList(struct ListNode* head){ -PHP: +### PHP: + ```php // 双指针法: function reverseList($head) { @@ -565,8 +564,9 @@ function reverseList($head) { } ``` -Scala: +### Scala: 双指针法: + ```scala object Solution { def reverseList(head: ListNode): ListNode = { @@ -601,7 +601,7 @@ object Solution { } ``` -Rust: +### Rust: 双指针法: ```rust @@ -640,7 +640,7 @@ impl Solution { } } ``` -C#: +### C#: 三指针法, 感觉会更直观: ```cs @@ -677,11 +677,11 @@ public class LinkNumbers } ``` +## 其他解法 +### 使用虚拟头结点解决链表反转 -## 使用虚拟头结点解决链表翻转 - -> 使用虚拟头结点,通过头插法实现链表的翻转(不需要栈) +> 使用虚拟头结点,通过头插法实现链表的反转(不需要栈) ```java // 迭代方法:增加虚头结点,使用头插法实现链表翻转 @@ -704,7 +704,7 @@ public static ListNode reverseList1(ListNode head) { -## 使用栈解决反转链表的问题 +### 使用栈解决反转链表的问题 * 首先将所有的结点入栈 * 然后创建一个虚拟虚拟头结点,让cur指向虚拟头结点。然后开始循环出栈,每出来一个元素,就把它加入到以虚拟头结点为头结点的链表当中,最后返回即可。 @@ -743,4 +743,3 @@ public ListNode reverseList(ListNode head) { - From 2acceb7474b60ad4aa16eef4b9bf94657ac85aeb Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Tue, 18 Jul 2023 15:00:29 +0800 Subject: [PATCH 2032/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20024.=E4=B8=A4?= =?UTF-8?q?=E4=B8=A4=E4=BA=A4=E6=8D=A2=E9=93=BE=E8=A1=A8=E4=B8=AD=E7=9A=84?= =?UTF-8?q?=E8=8A=82=E7=82=B9=20=E6=8E=92=E7=89=88=E6=A0=BC=E5=BC=8F?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...55\347\232\204\350\212\202\347\202\271.md" | 37 +- ...15\350\275\254\351\223\276\350\241\250.md" | 745 ------------------ 2 files changed, 23 insertions(+), 759 deletions(-) delete mode 100644 "problems/0206.\345\217\215\350\275\254\351\223\276\350\241\250.md" diff --git "a/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" "b/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" index d7c03b645b..c612c4b3b9 100644 --- "a/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" +++ "b/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" @@ -5,7 +5,7 @@

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

-## 24. 两两交换链表中的节点 +# 24. 两两交换链表中的节点 [力扣题目链接](https://leetcode.cn/problems/swap-nodes-in-pairs/) @@ -16,9 +16,11 @@ 24.两两交换链表中的节点-题意 -## 思路 +## 算法公开课 + +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[帮你把链表细节学清楚! | LeetCode:24. 两两交换链表中的节点](https://www.bilibili.com/video/BV1YT411g7br),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 -《代码随想录》算法公开课:[帮你把链表细节学清楚! | LeetCode:24. 两两交换链表中的节点](https://www.bilibili.com/video/BV1YT411g7br),相信结合视频在看本篇题解,更有助于大家对链表的理解。 +## 思路 这道题目正常模拟就可以了。 @@ -88,7 +90,8 @@ public: ## 其他语言版本 -C: +### C: + ```c /** * Definition for singly-linked list. @@ -132,7 +135,7 @@ struct ListNode* swapPairs(struct ListNode* head){ } ``` -Java: +### Java: ```Java // 递归版本 @@ -176,7 +179,8 @@ class Solution { } ``` -Python: +### Python: + ```python # 递归版本 # Definition for singly-linked list. @@ -226,7 +230,8 @@ class Solution: ``` -Go: +### Go: + ```go func swapPairs(head *ListNode) *ListNode { dummy := &ListNode{ @@ -262,7 +267,8 @@ func swapPairs(head *ListNode) *ListNode { } ``` -Javascript: +### Javascript: + ```javascript var swapPairs = function (head) { let ret = new ListNode(0, head), temp = ret; @@ -277,7 +283,7 @@ var swapPairs = function (head) { }; ``` -TypeScript: +### TypeScript: ```typescript function swapPairs(head: ListNode | null): ListNode | null { @@ -296,7 +302,7 @@ function swapPairs(head: ListNode | null): ListNode | null { }; ``` -Kotlin: +### Kotlin: ```kotlin fun swapPairs(head: ListNode?): ListNode? { @@ -316,7 +322,8 @@ fun swapPairs(head: ListNode?): ListNode? { } ``` -Swift: +### Swift: + ```swift func swapPairs(_ head: ListNode?) -> ListNode? { if head == nil || head?.next == nil { @@ -337,7 +344,8 @@ func swapPairs(_ head: ListNode?) -> ListNode? { return dummyHead.next } ``` -Scala: +### Scala: + ```scala // 虚拟头节点 object Solution { @@ -361,7 +369,8 @@ object Solution { } ``` -PHP: +### PHP: + ```php //虚拟头结点 function swapPairs($head) { @@ -404,7 +413,7 @@ function swapPairs($head) } ``` -Rust: +### Rust: ```rust // 虚拟头节点 diff --git "a/problems/0206.\345\217\215\350\275\254\351\223\276\350\241\250.md" "b/problems/0206.\345\217\215\350\275\254\351\223\276\350\241\250.md" deleted file mode 100644 index 5a57939af2..0000000000 --- "a/problems/0206.\345\217\215\350\275\254\351\223\276\350\241\250.md" +++ /dev/null @@ -1,745 +0,0 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

- - -> 反转链表的写法很简单,一些同学甚至可以背下来但过一阵就忘了该咋写,主要是因为没有理解真正的反转过程。 - -# 206.反转链表 - -[力扣题目链接](https://leetcode.cn/problems/reverse-linked-list/) - -题意:反转一个单链表。 - -示例: -输入: 1->2->3->4->5->NULL -输出: 5->4->3->2->1->NULL - -## 算法公开课 - -**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[帮你拿下反转链表 | LeetCode:206.反转链表](https://www.bilibili.com/video/BV1nB4y1i7eL),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 - - -## 思路 - -如果再定义一个新的链表,实现链表元素的反转,其实这是对内存空间的浪费。 - -其实只需要改变链表的next指针的指向,直接将链表反转 ,而不用重新定义一个新的链表,如图所示: - - -![206_反转链表](https://code-thinking-1253855093.file.myqcloud.com/pics/20210218090901207.png) - -之前链表的头节点是元素1, 反转之后头结点就是元素5 ,这里并没有添加或者删除节点,仅仅是改变next指针的方向。 - -那么接下来看一看是如何反转的呢? - -我们拿有示例中的链表来举例,如动画所示:(纠正:动画应该是先移动pre,在移动cur) - -![](https://code-thinking.cdn.bcebos.com/gifs/206.%E7%BF%BB%E8%BD%AC%E9%93%BE%E8%A1%A8.gif) - -首先定义一个cur指针,指向头结点,再定义一个pre指针,初始化为null。 - -然后就要开始反转了,首先要把 cur->next 节点用tmp指针保存一下,也就是保存一下这个节点。 - -为什么要保存一下这个节点呢,因为接下来要改变 cur->next 的指向了,将cur->next 指向pre ,此时已经反转了第一个节点了。 - -接下来,就是循环走如下代码逻辑了,继续移动pre和cur指针。 - -最后,cur 指针已经指向了null,循环结束,链表也反转完毕了。 此时我们return pre指针就可以了,pre指针就指向了新的头结点。 - -### 双指针法 -```CPP -class Solution { -public: - ListNode* reverseList(ListNode* head) { - ListNode* temp; // 保存cur的下一个节点 - ListNode* cur = head; - ListNode* pre = NULL; - while(cur) { - temp = cur->next; // 保存一下 cur的下一个节点,因为接下来要改变cur->next - cur->next = pre; // 翻转操作 - // 更新pre 和 cur指针 - pre = cur; - cur = temp; - } - return pre; - } -}; -``` - -* 时间复杂度: O(n) -* 空间复杂度: O(1) - -### 递归法 - -递归法相对抽象一些,但是其实和双指针法是一样的逻辑,同样是当cur为空的时候循环结束,不断将cur指向pre的过程。 - -关键是初始化的地方,可能有的同学会不理解, 可以看到双指针法中初始化 cur = head,pre = NULL,在递归法中可以从如下代码看出初始化的逻辑也是一样的,只不过写法变了。 - -具体可以看代码(已经详细注释),**双指针法写出来之后,理解如下递归写法就不难了,代码逻辑都是一样的。** -```CPP -class Solution { -public: - ListNode* reverse(ListNode* pre,ListNode* cur){ - if(cur == NULL) return pre; - ListNode* temp = cur->next; - cur->next = pre; - // 可以和双指针法的代码进行对比,如下递归的写法,其实就是做了这两步 - // pre = cur; - // cur = temp; - return reverse(cur,temp); - } - ListNode* reverseList(ListNode* head) { - // 和双指针法初始化是一样的逻辑 - // ListNode* cur = head; - // ListNode* pre = NULL; - return reverse(NULL, head); - } - -}; -``` - -* 时间复杂度: O(n), 要递归处理链表的每个节点 -* 空间复杂度: O(n), 递归调用了 n 层栈空间 - -我们可以发现,上面的递归写法和双指针法实质上都是从前往后翻转指针指向,其实还有另外一种与双指针法不同思路的递归写法:从后往前翻转指针指向。 - -具体代码如下(带详细注释): - -```CPP -class Solution { -public: - 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; - } -}; -``` - -* 时间复杂度: O(n) -* 空间复杂度: O(n) - - -## 其他语言版本 - -### Java: - -```java -// 双指针 -class Solution { - public ListNode reverseList(ListNode head) { - ListNode prev = null; - ListNode cur = head; - ListNode temp = null; - while (cur != null) { - temp = cur.next;// 保存下一个节点 - cur.next = prev; - prev = cur; - cur = temp; - } - return prev; - } -} -``` - -```java -// 递归 -class Solution { - public ListNode reverseList(ListNode head) { - return reverse(null, head); - } - - private ListNode reverse(ListNode prev, ListNode cur) { - if (cur == null) { - return prev; - } - ListNode temp = null; - temp = cur.next;// 先保存下一个节点 - cur.next = prev;// 反转 - // 更新prev、cur位置 - // prev = cur; - // cur = temp; - return reverse(cur, temp); - } -} -``` - -```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 -(版本一)双指针法 -# Definition for singly-linked list. -# class ListNode: -# def __init__(self, val=0, next=None): -# self.val = val -# self.next = next -class Solution: - def reverseList(self, head: ListNode) -> ListNode: - cur = head - pre = None - while cur: - temp = cur.next # 保存一下 cur的下一个节点,因为接下来要改变cur->next - cur.next = pre #反转 - #更新pre、cur指针 - pre = cur - cur = temp - return pre -``` - -```python -(版本二)递归法 -# Definition for singly-linked list. -# class ListNode: -# def __init__(self, val=0, next=None): -# self.val = val -# self.next = next -class Solution: - def reverseList(self, head: ListNode) -> ListNode: - return self.reverse(head, None) - def reverse(self, cur: ListNode, pre: ListNode) -> ListNode: - if cur == None: - return pre - temp = cur.next - cur.next = pre - return self.reverse(temp, cur) - -``` - - - -### Go: - -```go -//双指针 -func reverseList(head *ListNode) *ListNode { - var pre *ListNode - cur := head - for cur != nil { - next := cur.Next - cur.Next = pre - pre = cur - cur = next - } - return pre -} - -//递归 -func reverseList(head *ListNode) *ListNode { - return help(nil, head) -} - -func help(pre, head *ListNode)*ListNode{ - if head == nil { - return pre - } - next := head.Next - head.Next = pre - return help(head, next) -} - -``` -### JavaScript: - -```js -/** - * @param {ListNode} head - * @return {ListNode} - */ - -// 双指针: -var reverseList = function(head) { - if(!head || !head.next) return head; - let temp = null, pre = null, cur = head; - while(cur) { - temp = cur.next; - cur.next = pre; - pre = cur; - cur = temp; - } - // temp = cur = null; - return pre; -}; - -// 递归: -var reverse = function(pre, head) { - if(!head) return pre; - const temp = head.next; - head.next = pre; - pre = head - return reverse(pre, temp); -} - -var reverseList = function(head) { - return reverse(null, head); -}; - -// 递归2 -var reverse = function(head) { - if(!head || !head.next) return head; - // 从后往前翻 - const pre = reverse(head.next); - head.next = pre.next; - pre.next = head; - return head; -} - -var reverseList = function(head) { - let cur = head; - while(cur && cur.next) { - cur = cur.next; - } - reverse(head); - return cur; -}; -``` - -### TypeScript: - -```typescript -// 双指针法 -function reverseList(head: ListNode | null): ListNode | null { - let preNode: ListNode | null = null, - curNode: ListNode | null = head, - tempNode: ListNode | null; - while (curNode) { - tempNode = curNode.next; - curNode.next = preNode; - preNode = curNode; - curNode = tempNode; - } - return preNode; -}; - -// 递归(从前往后翻转) -function reverseList(head: ListNode | null): ListNode | null { - function recur(preNode: ListNode | null, curNode: ListNode | null): ListNode | null { - if (curNode === null) return preNode; - let tempNode: ListNode | null = curNode.next; - curNode.next = preNode; - preNode = curNode; - curNode = tempNode; - return recur(preNode, curNode); - } - return recur(null, head); -}; - -// 递归(从后往前翻转) -function reverseList(head: ListNode | null): ListNode | null { - if (head === null) return null; - let newHead: ListNode | null; - function recur(node: ListNode | null, preNode: ListNode | null): void { - if (node.next === null) { - newHead = node; - newHead.next = preNode; - } else { - recur(node.next, node); - node.next = preNode; - } - } - recur(head, null); - return newHead; -}; -``` - -### Ruby: - -```ruby -# 双指针 -# Definition for singly-linked list. -# class ListNode -# attr_accessor :val, :next -# def initialize(val = 0, _next = nil) -# @val = val -# @next = _next -# end -# end -def reverse_list(head) - # return nil if head.nil? # 循环判断条件亦能起到相同作用因此不必单独判断 - cur, per = head, nil - until cur.nil? - tem = cur.next - cur.next = per - per = cur - cur = tem - end - per -end - -# 递归 -# Definition for singly-linked list. -# class ListNode -# attr_accessor :val, :next -# def initialize(val = 0, _next = nil) -# @val = val -# @next = _next -# end -# end -def reverse_list(head) - reverse(nil, head) -end - -def reverse(pre, cur) - return pre if cur.nil? - tem = cur.next - cur.next = pre - reverse(cur, tem) # 通过递归实现双指针法中的更新操作 -end -``` - -### Kotlin: - -```Kotlin -fun reverseList(head: ListNode?): ListNode? { - var pre: ListNode? = null - var cur = head - while (cur != null) { - val temp = cur.next - cur.next = pre - pre = cur - cur = temp - } - return pre -} -``` -```kotlin -/** - * Example: - * var li = ListNode(5) - * var v = li.`val` - * Definition for singly-linked list. - * class ListNode(var `val`: Int) { - * var next: ListNode? = null - * } - */ -class Solution { - fun reverseList(head: ListNode?): ListNode? { - // temp用来存储临时的节点 - var temp: ListNode? - // cur用来遍历链表 - var cur: ListNode? = head - // pre用来作为链表反转的工具 - // pre是比pre前一位的节点 - var pre: ListNode? = null - while (cur != null) { - // 临时存储原本cur的下一个节点 - temp = cur.next - // 使cur下一节点地址为它之前的 - cur.next = pre - // 之后随着cur的遍历移动pre - pre = cur; - // 移动cur遍历链表各个节点 - cur = temp; - } - // 由于开头使用pre为null,所以cur等于链表本身长度+1, - // 此时pre在cur前一位,所以此时pre为头节点 - return pre; - } -} -``` - -### Swift: - -```swift -/// 双指针法 (迭代) -/// - Parameter head: 头结点 -/// - Returns: 翻转后的链表头结点 -func reverseList(_ head: ListNode?) -> ListNode? { - if head == nil || head?.next == nil { - return head - } - var pre: ListNode? = nil - var cur: ListNode? = head - var temp: ListNode? = nil - while cur != nil { - temp = cur?.next - cur?.next = pre - pre = cur - cur = temp - } - return pre -} - -/// 递归 -/// - Parameter head: 头结点 -/// - Returns: 翻转后的链表头结点 -func reverseList2(_ head: ListNode?) -> ListNode? { - return reverse(pre: nil, cur: head) -} -func reverse(pre: ListNode?, cur: ListNode?) -> ListNode? { - if cur == nil { - return pre - } - let temp: ListNode? = cur?.next - cur?.next = pre - return reverse(pre: cur, cur: temp) -} -``` - -### C: -双指针法: - -```c -struct ListNode* reverseList(struct ListNode* head){ - //保存cur的下一个结点 - struct ListNode* temp; - //pre指针指向前一个当前结点的前一个结点 - struct ListNode* pre = NULL; - //用head代替cur,也可以再定义一个cur结点指向head。 - while(head) { - //保存下一个结点的位置 - temp = head->next; - //翻转操作 - head->next = pre; - //更新结点 - pre = head; - head = temp; - } - return pre; -} -``` - -递归法: -```c -struct ListNode* reverse(struct ListNode* pre, struct ListNode* cur) { - if(!cur) - return pre; - struct ListNode* temp = cur->next; - cur->next = pre; - //将cur作为pre传入下一层 - //将temp作为cur传入下一层,改变其指针指向当前cur - return reverse(cur, temp); -} - -struct ListNode* reverseList(struct ListNode* head){ - return reverse(NULL, head); -} -``` - - - -### PHP: - -```php -// 双指针法: -function reverseList($head) { - $cur = $head; - $pre = NULL; - while($cur){ - $temp = $cur->next; - $cur->next = $pre; - $pre = $cur; - $cur = $temp; - } - return $pre; - } -``` - -### Scala: -双指针法: - -```scala -object Solution { - def reverseList(head: ListNode): ListNode = { - var pre: ListNode = null - var cur = head - while (cur != null) { - var tmp = cur.next - cur.next = pre - pre = cur - cur = tmp - } - pre - } -} -``` -递归法: -```scala -object Solution { - def reverseList(head: ListNode): ListNode = { - reverse(null, head) - } - - def reverse(pre: ListNode, cur: ListNode): ListNode = { - if (cur == null) { - return pre // 如果当前cur为空,则返回pre - } - val tmp: ListNode = cur.next - cur.next = pre - reverse(cur, tmp) // 此时cur成为前一个节点,tmp是当前节点 - } - -} -``` - -### Rust: -双指针法: - -```rust -impl Solution { - pub fn reverse_list(head: Option>) -> Option> { - let mut cur = head; - let mut pre = None; - while let Some(mut node) = cur.take() { - cur = node.next; - node.next = pre; - pre = Some(node); - } - pre - } -} -``` - -递归法: - -```rust -impl Solution { - pub fn reverse_list(head: Option>) -> Option> { - fn rev( - mut head: Option>, - mut pre: Option>, - ) -> Option> { - if let Some(mut node) = head.take() { - let cur = node.next; - node.next = pre; - pre = Some(node); - return rev(cur, pre); - } - pre - } - rev(head, None) - } -} -``` -### C#: -三指针法, 感觉会更直观: - -```cs -public LinkNumbers Reverse() -{ - ///用三指针,写的过程中能够弥补二指针在翻转过程中的想象 - LinkNumbers pre = null; - var move = root; - var next = root; - - while (next != null) - { - next = next.linknext; - move.linknext = pre; - pre = move; - move = next; - } - root = pre; - return root; -} - -///LinkNumbers的定义 -public class LinkNumbers -{ - /// - /// 链表值 - /// - public int value { get; set; } - - /// - /// 链表指针 - /// - public LinkNumbers linknext { get; set; } -} -``` - -## 其他解法 - -### 使用虚拟头结点解决链表反转 - -> 使用虚拟头结点,通过头插法实现链表的反转(不需要栈) - -```java -// 迭代方法:增加虚头结点,使用头插法实现链表翻转 -public static ListNode reverseList1(ListNode head) { - // 创建虚头结点 - ListNode dumpyHead = new ListNode(-1); - dumpyHead.next = null; - // 遍历所有节点 - ListNode cur = head; - while(cur != null){ - ListNode temp = cur.next; - // 头插法 - cur.next = dumpyHead.next; - dumpyHead.next = cur; - cur = temp; - } - return dumpyHead.next; -} -``` - - - -### 使用栈解决反转链表的问题 - -* 首先将所有的结点入栈 -* 然后创建一个虚拟虚拟头结点,让cur指向虚拟头结点。然后开始循环出栈,每出来一个元素,就把它加入到以虚拟头结点为头结点的链表当中,最后返回即可。 - -```java -public ListNode reverseList(ListNode head) { - // 如果链表为空,则返回空 - if (head == null) return null; - // 如果链表中只有只有一个元素,则直接返回 - if (head.next == null) return head; - // 创建栈 每一个结点都入栈 - Stack stack = new Stack<>(); - ListNode cur = head; - while (cur != null) { - stack.push(cur); - cur = cur.next; - } - // 创建一个虚拟头结点 - ListNode pHead = new ListNode(0); - cur = pHead; - while (!stack.isEmpty()) { - ListNode node = stack.pop(); - cur.next = node; - cur = cur.next; - } - // 最后一个元素的next要赋值为空 - cur.next = null; - return pHead.next; -} -``` - -> 采用这种方法需要注意一点。就是当整个出栈循环结束以后,cur正好指向原来链表的第一个结点,而此时结点1中的next指向的是结点2,因此最后还需要`cur.next = null` -![image-20230117195418626](https://raw.githubusercontent.com/liyuxuan7762/MyImageOSS/master/md_images/image-20230117195418626.png) - -

- - - From a64e11b09ad66f4a1ea22cdc3603e5cde85d88ef Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Tue, 18 Jul 2023 15:13:42 +0800 Subject: [PATCH 2033/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20019.=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=8E=92=E7=89=88=E6=A0=BC?= =?UTF-8?q?=E5=BC=8F=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...4N\344\270\252\350\212\202\347\202\271.md" | 39 ++++++++++++------- 1 file changed, 24 insertions(+), 15 deletions(-) diff --git "a/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" "b/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" index 84eac96b84..1c95ad5b2f 100644 --- "a/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" +++ "b/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" @@ -7,7 +7,7 @@ -## 19.删除链表的倒数第N个节点 +# 19.删除链表的倒数第N个节点 [力扣题目链接](https://leetcode.cn/problems/remove-nth-node-from-end-of-list/) @@ -31,10 +31,12 @@ 输入:head = [1,2], n = 1 输出:[1] +## 算法公开课 + +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html)::[链表遍历学清楚! | LeetCode:19.删除链表倒数第N个节点](https://www.bilibili.com/video/BV1vW4y1U7Gf),相信结合视频再看本篇题解,更有助于大家对链表的理解。** -## 思路 -《代码随想录》算法公开课:[链表遍历学清楚! | LeetCode:19.删除链表倒数第N个节点](https://www.bilibili.com/video/BV1vW4y1U7Gf),相信结合视频在看本篇题解,更有助于大家对链表的理解。 +## 思路 双指针的经典应用,如果要删除倒数第n个节点,让fast移动n步,然后让fast和slow同时移动,直到fast指向链表末尾。删掉slow所指向的节点就可以了。 @@ -93,7 +95,7 @@ public: ## 其他语言版本 -java: +### Java: ```java public ListNode removeNthFromEnd(ListNode head, int n){ @@ -120,7 +122,8 @@ public ListNode removeNthFromEnd(ListNode head, int n){ } ``` -Python: +### Python: + ```python # Definition for singly-linked list. # class ListNode: @@ -151,7 +154,8 @@ class Solution: return dummy_head.next ``` -Go: +### Go: + ```Go /** * Definition for singly-linked list. @@ -178,7 +182,7 @@ func removeNthFromEnd(head *ListNode, n int) *ListNode { } ``` -JavaScript: +### JavaScript: ```js /** @@ -198,7 +202,7 @@ var removeNthFromEnd = function(head, n) { return ret.next; }; ``` -TypeScript: +### TypeScript: 版本一(快慢指针法): @@ -263,7 +267,7 @@ function removeNthFromEnd(head: ListNode | null, n: number): ListNode | null { }; ``` -Kotlin: +### Kotlin: ```Kotlin fun removeNthFromEnd(head: ListNode?, n: Int): ListNode? { @@ -284,7 +288,8 @@ fun removeNthFromEnd(head: ListNode?, n: Int): ListNode? { } ``` -Swift: +### Swift: + ```swift func removeNthFromEnd(_ head: ListNode?, _ n: Int) -> ListNode? { if head == nil { @@ -309,8 +314,8 @@ func removeNthFromEnd(_ head: ListNode?, _ n: Int) -> ListNode? { } ``` +### PHP: -PHP: ```php function removeNthFromEnd($head, $n) { // 设置虚拟头节点 @@ -332,7 +337,8 @@ function removeNthFromEnd($head, $n) { } ``` -Scala: +### Scala: + ```scala object Solution { def removeNthFromEnd(head: ListNode, n: Int): ListNode = { @@ -356,7 +362,8 @@ object Solution { } ``` -Rust: +### Rust: + ```rust impl Solution { pub fn remove_nth_from_end(head: Option>, mut n: i32) -> Option> { @@ -377,7 +384,8 @@ impl Solution { } } ``` -C语言 +### C: + ```c /**c语言单链表的定义 * Definition for singly-linked list. @@ -412,7 +420,8 @@ struct ListNode* removeNthFromEnd(struct ListNode* head, int n) { ``` -C#: +### C#: + ```csharp public class Solution { public ListNode RemoveNthFromEnd(ListNode head, int n) { From 8eb214c06025e359d9c4a40d87d4e3075f5d8bdf Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Tue, 18 Jul 2023 15:23:24 +0800 Subject: [PATCH 2034/3019] =?UTF-8?q?=E9=9D=A2=E8=AF=95=E9=A2=98=2002.07.?= =?UTF-8?q?=E9=93=BE=E8=A1=A8=E7=9B=B8=E4=BA=A4=20=E6=8E=92=E7=89=88?= =?UTF-8?q?=E6=A0=BC=E5=BC=8F=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\276\350\241\250\347\233\270\344\272\244.md" | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git "a/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" "b/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" index 75e0311630..833eadca6a 100644 --- "a/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" +++ "b/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" @@ -34,6 +34,7 @@ ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211219221812.png)![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211219221812.png) + ## 思路 @@ -101,7 +102,7 @@ public: ## 其他语言版本 -Java: +### Java: ```Java public class Solution { @@ -150,8 +151,7 @@ public class Solution { } ``` - -Python: +### Python: ```python @@ -280,7 +280,7 @@ class Solution: return pointerA ``` -Go: +### Go: ```go func getIntersectionNode(headA, headB *ListNode) *ListNode { @@ -341,7 +341,7 @@ func getIntersectionNode(headA, headB *ListNode) *ListNode { } ``` -JavaScript: +### JavaScript: ```js var getListLen = function(head) { @@ -376,7 +376,7 @@ var getIntersectionNode = function(headA, headB) { }; ``` -TypeScript: +### TypeScript: ```typescript function getIntersectionNode(headA: ListNode | null, headB: ListNode | null): ListNode | null { @@ -413,7 +413,7 @@ function getIntersectionNode(headA: ListNode | null, headB: ListNode | null): Li }; ``` -C: +### C: ```c ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) { @@ -452,7 +452,7 @@ ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) { } ``` -Scala: +### Scala: ```scala object Solution { @@ -508,3 +508,4 @@ object Solution { + From 17d56ed722d41a8d463de2de71c72345a88a2df5 Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Tue, 18 Jul 2023 15:30:49 +0800 Subject: [PATCH 2035/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200142.=E7=8E=AF?= =?UTF-8?q?=E5=BD=A2=E9=93=BE=E8=A1=A8II=20=E6=8E=92=E7=89=88=E6=A0=BC?= =?UTF-8?q?=E5=BC=8F=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...57\345\275\242\351\223\276\350\241\250.md" | 11 +++---- ...\345\275\242\351\223\276\350\241\250II.md" | 30 +++++++++---------- 2 files changed, 21 insertions(+), 20 deletions(-) diff --git "a/problems/0141.\347\216\257\345\275\242\351\223\276\350\241\250.md" "b/problems/0141.\347\216\257\345\275\242\351\223\276\350\241\250.md" index 7d7121a0ba..b1f42ba979 100644 --- "a/problems/0141.\347\216\257\345\275\242\351\223\276\350\241\250.md" +++ "b/problems/0141.\347\216\257\345\275\242\351\223\276\350\241\250.md" @@ -70,7 +70,7 @@ public: ## 其他语言版本 -### Java +### Java: ```java public class Solution { @@ -90,7 +90,7 @@ public class Solution { } ``` -### Python +### Python: ```python class Solution: @@ -105,7 +105,7 @@ class Solution: return False ``` -### Go +### Go: ```go func hasCycle(head *ListNode) bool { @@ -125,7 +125,7 @@ func hasCycle(head *ListNode) bool { } ``` -### JavaScript +### JavaScript: ```js var hasCycle = function(head) { @@ -141,7 +141,7 @@ var hasCycle = function(head) { }; ``` -### TypeScript +### TypeScript: ```typescript function hasCycle(head: ListNode | null): boolean { @@ -163,3 +163,4 @@ function hasCycle(head: ListNode | null): boolean { + diff --git "a/problems/0142.\347\216\257\345\275\242\351\223\276\350\241\250II.md" "b/problems/0142.\347\216\257\345\275\242\351\223\276\350\241\250II.md" index f87d2cd914..d20101a706 100644 --- "a/problems/0142.\347\216\257\345\275\242\351\223\276\350\241\250II.md" +++ "b/problems/0142.\347\216\257\345\275\242\351\223\276\350\241\250II.md" @@ -11,7 +11,7 @@ > 找到有没有环已经很不容易了,还要让我找到环的入口? -## 142.环形链表II +# 142.环形链表II [力扣题目链接](https://leetcode.cn/problems/linked-list-cycle-ii/) @@ -24,9 +24,11 @@ ![循环链表](https://code-thinking-1253855093.file.myqcloud.com/pics/20200816110112704.png) -## 思路 +## 算法公开课 + +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[把环形链表讲清楚!| LeetCode:142.环形链表II](https://www.bilibili.com/video/BV1if4y1d7ob),相信结合视频在看本篇题解,更有助于大家对链表的理解。** -《代码随想录》算法公开课:[把环形链表讲清楚!| LeetCode:142.环形链表II](https://www.bilibili.com/video/BV1if4y1d7ob),相信结合视频在看本篇题解,更有助于大家对链表的理解。 +## 思路 这道题目,不仅考察对链表的操作,而且还需要一些数学运算。 @@ -148,7 +150,7 @@ public: * 时间复杂度: O(n),快慢指针相遇前,指针走的次数小于链表长度,快慢指针相遇后,两个index指针走的次数也小于链表长度,总体为走的次数小于 2n * 空间复杂度: O(1) -## 补充 +### 补充 在推理过程中,大家可能有一个疑问就是:**为什么第一次在环中相遇,slow的 步数 是 x+y 而不是 x + 若干环的长度 + y 呢?** @@ -190,8 +192,7 @@ public: ## 其他语言版本 - -Java: +### Java: ```java public class Solution { @@ -217,8 +218,7 @@ public class Solution { } ``` - -Python: +### Python: ```python (版本一)快慢指针法 @@ -270,7 +270,7 @@ class Solution: return None ``` -Go: +### Go: ```go func detectCycle(head *ListNode) *ListNode { @@ -290,7 +290,7 @@ func detectCycle(head *ListNode) *ListNode { } ``` -javaScript +### JavaScript ```js // 两种循环实现方式 @@ -334,7 +334,7 @@ var detectCycle = function(head) { }; ``` -TypeScript: +### TypeScript: ```typescript function detectCycle(head: ListNode | null): ListNode | null { @@ -356,7 +356,7 @@ function detectCycle(head: ListNode | null): ListNode | null { }; ``` -Swift: +### Swift: ```swift class Solution { @@ -391,7 +391,7 @@ extension ListNode: Equatable { } ``` -C: +### C: ```c ListNode *detectCycle(ListNode *head) { @@ -410,7 +410,7 @@ ListNode *detectCycle(ListNode *head) { } ``` -Scala: +### Scala: ```scala object Solution { @@ -437,7 +437,7 @@ object Solution { } ``` -C#: +### C#: ```CSharp public class Solution { From 28b58782375755eda70381aaab630e52b50992c8 Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Tue, 18 Jul 2023 15:33:00 +0800 Subject: [PATCH 2036/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20=E9=93=BE?= =?UTF-8?q?=E8=A1=A8=E6=80=BB=E7=BB=93=E7=AF=87=20=E6=8E=92=E7=89=88?= =?UTF-8?q?=E6=A0=BC=E5=BC=8F=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...3\276\350\241\250\346\200\273\347\273\223\347\257\207.md" | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git "a/problems/\351\223\276\350\241\250\346\200\273\347\273\223\347\257\207.md" "b/problems/\351\223\276\350\241\250\346\200\273\347\273\223\347\257\207.md" index cfbafc45b3..dacd4dee5d 100644 --- "a/problems/\351\223\276\350\241\250\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/\351\223\276\350\241\250\346\200\273\347\273\223\347\257\207.md" @@ -3,7 +3,7 @@

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

- +# 链表总结篇 ## 链表的理论基础 @@ -68,7 +68,7 @@ [链表:链表相交](https://programmercarl.com/面试题02.07.链表相交.html)使用双指针来找到两个链表的交点(引用完全相同,即:内存地址完全相同的交点) -## 环形链表 +### 环形链表 在[链表:环找到了,那入口呢?](https://programmercarl.com/0142.环形链表II.html)中,讲解了在链表如何找环,以及如何找环的入口位置。 @@ -100,3 +100,4 @@ + From a3a8182d28006fbc9d6003dc5907b543c1dba647 Mon Sep 17 00:00:00 2001 From: fwqaaq Date: Tue, 18 Jul 2023 15:42:47 +0800 Subject: [PATCH 2037/3019] =?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=20=E4=BC=98?= =?UTF-8?q?=E5=8C=96=20Rust=20=E5=92=8C=20Java?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\207\345\255\220\345\272\217\345\210\227.md" | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git "a/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" "b/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" index c58c3bf6c4..8287c77719 100644 --- "a/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" @@ -130,18 +130,16 @@ Java: class Solution { public int lengthOfLIS(int[] nums) { int[] dp = new int[nums.length]; + int res = 0; Arrays.fill(dp, 1); - for (int i = 0; i < dp.length; i++) { + for (int i = 1; i < dp.length; i++) { for (int j = 0; j < i; j++) { if (nums[i] > nums[j]) { dp[i] = Math.max(dp[i], dp[j] + 1); } + res = Math.max(res, dp[i]); } } - int res = 0; - for (int i = 0; i < dp.length; i++) { - res = Math.max(res, dp[i]); - } return res; } } @@ -291,7 +289,7 @@ function lengthOfLIS(nums: number[]): number { Rust: ```rust pub fn length_of_lis(nums: Vec) -> i32 { - let mut dp = vec![1; nums.len() + 1]; + let mut dp = vec![1; nums.len()]; let mut result = 1; for i in 1..nums.len() { for j in 0..i { @@ -306,13 +304,6 @@ pub fn length_of_lis(nums: Vec) -> i32 { ``` - - - - - - -

From 826554682f465da29414c4ad6aa9ba391a54e05a Mon Sep 17 00:00:00 2001 From: fwqaaq Date: Tue, 18 Jul 2023 16:51:54 +0800 Subject: [PATCH 2038/3019] =?UTF-8?q?Update=200674.=E6=9C=80=E9=95=BF?= =?UTF-8?q?=E8=BF=9E=E7=BB=AD=E9=80=92=E5=A2=9E=E5=BA=8F=E5=88=97.md=20abo?= =?UTF-8?q?ut=20rust?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...22\345\242\236\345\272\217\345\210\227.md" | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git "a/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" "b/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" index 8cc270ec64..58365df3a7 100644 --- "a/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" +++ "b/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" @@ -303,6 +303,9 @@ func findLengthOfLCIS(nums []int) int { ``` Rust: + +>动态规划 + ```rust pub fn find_length_of_lcis(nums: Vec) -> i32 { if nums.is_empty() { @@ -320,6 +323,25 @@ pub fn find_length_of_lcis(nums: Vec) -> i32 { } ``` +> 贪心 + +```rust +impl Solution { + pub fn find_length_of_lcis(nums: Vec) -> i32 { + let (mut res, mut count) = (1, 1); + for i in 1..nums.len() { + if nums[i] > nums[i - 1] { + count += 1; + res = res.max(count); + continue; + } + count = 1; + } + res + } +} +``` + Javascript: > 动态规划: From b42feba6057eab0cbb5f25709b3d5d77b3a073c3 Mon Sep 17 00:00:00 2001 From: fwqaaq Date: Tue, 18 Jul 2023 17:25:21 +0800 Subject: [PATCH 2039/3019] =?UTF-8?q?Update=200718.=E6=9C=80=E9=95=BF?= =?UTF-8?q?=E9=87=8D=E5=A4=8D=E5=AD=90=E6=95=B0=E7=BB=84.md=20about=20rust?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...15\345\255\220\346\225\260\347\273\204.md" | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git "a/problems/0718.\346\234\200\351\225\277\351\207\215\345\244\215\345\255\220\346\225\260\347\273\204.md" "b/problems/0718.\346\234\200\351\225\277\351\207\215\345\244\215\345\255\220\346\225\260\347\273\204.md" index 82bf4f59e2..5b5e7a6c87 100644 --- "a/problems/0718.\346\234\200\351\225\277\351\207\215\345\244\215\345\255\220\346\225\260\347\273\204.md" +++ "b/problems/0718.\346\234\200\351\225\277\351\207\215\345\244\215\345\255\220\346\225\260\347\273\204.md" @@ -537,6 +537,29 @@ function findLength(nums1: number[], nums2: number[]): number { }; ``` +Rust: + +> 滚动数组 + +```rust +impl Solution { + pub fn find_length(nums1: Vec, nums2: Vec) -> i32 { + let (mut res, mut dp) = (0, vec![0; nums2.len()]); + + for n1 in nums1 { + for j in (0..nums2.len()).rev() { + if n1 == nums2[j] { + dp[j] = if j == 0 { 1 } else { dp[j - 1] + 1 }; + res = res.max(dp[j]); + } else { + dp[j] = 0; + } + } + } + res + } +} +``` From 9807ea62e7d2001b9f5c86e9be08b2bce8d1871f Mon Sep 17 00:00:00 2001 From: fwqaaq Date: Tue, 18 Jul 2023 19:35:33 +0800 Subject: [PATCH 2040/3019] =?UTF-8?q?Update=201143.=E6=9C=80=E9=95=BF?= =?UTF-8?q?=E5=85=AC=E5=85=B1=E5=AD=90=E5=BA=8F=E5=88=97.md=20about=20rust?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...61\345\255\220\345\272\217\345\210\227.md" | 56 ++++++++++++++----- 1 file changed, 42 insertions(+), 14 deletions(-) diff --git "a/problems/1143.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" "b/problems/1143.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" index 68269b87c5..0bd8b1d606 100644 --- "a/problems/1143.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/1143.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" @@ -327,23 +327,51 @@ function longestCommonSubsequence(text1: string, text2: string): number { ``` Rust: + +二维 dp: + ```rust -pub fn longest_common_subsequence(text1: String, text2: String) -> i32 { - let (n, m) = (text1.len(), text2.len()); - let (s1, s2) = (text1.as_bytes(), text2.as_bytes()); - let mut dp = vec![0; m + 1]; - let mut last = vec![0; m + 1]; - for i in 1..=n { - dp.swap_with_slice(&mut last); - for j in 1..=m { - dp[j] = if s1[i - 1] == s2[j - 1] { - last[j - 1] + 1 - } else { - last[j].max(dp[j - 1]) - }; +impl Solution { + pub fn longest_common_subsequence(text1: String, text2: String) -> i32 { + let mut dp = vec![vec![0; text2.len() + 1]; text1.len() + 1]; + for (i, c1) in text1.chars().enumerate() { + for (j, c2) in text2.chars().enumerate() { + if c1 == c2 { + dp[i + 1][j + 1] = dp[i][j] + 1; + } else { + dp[i + 1][j + 1] = dp[i][j + 1].max(dp[i + 1][j]); + } + } + } + dp[text1.len()][text2.len()] + } +} +``` + +二维: + +```rust +impl Solution { + pub fn longest_common_subsequence(text1: String, text2: String) -> i32 { + let mut dp = vec![0; text2.len() + 1]; + for c1 in text1.chars() { + // 初始化 prev + let mut prev = 0; + + for (j, c2) in text2.chars().enumerate() { + let temp = dp[j + 1]; + if c1 == c2 { + // 使用上一次的状态,防止重复计算 + dp[j + 1] = prev + 1; + } else { + dp[j + 1] = dp[j + 1].max(dp[j]); + } + // 使用上一次的状态更新 prev + prev = temp; + } } + dp[text2.len()] } - dp[m] } ``` From 695f86743842282e5dae571220af28ee2cac704e Mon Sep 17 00:00:00 2001 From: fwqaaq Date: Tue, 18 Jul 2023 22:55:35 +0800 Subject: [PATCH 2041/3019] =?UTF-8?q?Update=201035.=E4=B8=8D=E7=9B=B8?= =?UTF-8?q?=E4=BA=A4=E7=9A=84=E7=BA=BF.md=20about=20rust?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...70\344\272\244\347\232\204\347\272\277.md" | 47 ++++++++++++++----- 1 file changed, 35 insertions(+), 12 deletions(-) diff --git "a/problems/1035.\344\270\215\347\233\270\344\272\244\347\232\204\347\272\277.md" "b/problems/1035.\344\270\215\347\233\270\344\272\244\347\232\204\347\272\277.md" index 7142d75c09..460644ae3e 100644 --- "a/problems/1035.\344\270\215\347\233\270\344\272\244\347\232\204\347\272\277.md" +++ "b/problems/1035.\344\270\215\347\233\270\344\272\244\347\232\204\347\272\277.md" @@ -155,21 +155,44 @@ func max(a, b int) int { Rust: ```rust -pub fn max_uncrossed_lines(nums1: Vec, nums2: Vec) -> i32 { - let (n, m) = (nums1.len(), nums2.len()); - let mut last = vec![0; m + 1]; // 记录滚动数组 - let mut dp = vec![0; m + 1]; - for i in 1..=n { - dp.swap_with_slice(&mut last); - for j in 1..=m { - if nums1[i - 1] == nums2[j - 1] { - dp[j] = last[j - 1] + 1; - } else { - dp[j] = last[j].max(dp[j - 1]); +impl Solution { + pub fn max_uncrossed_lines(nums1: Vec, nums2: Vec) -> i32 { + let mut dp = vec![vec![0; nums2.len() + 1]; nums1.len() + 1]; + for (i, num1) in nums1.iter().enumerate() { + for (j, num2) in nums2.iter().enumerate() { + if num1 == num2 { + dp[i + 1][j + 1] = dp[i][j] + 1; + } else { + dp[i + 1][j + 1] = dp[i][j + 1].max(dp[i + 1][j]); + } + } + } + dp[nums1.len()][nums2.len()] + } +} +``` + +> 滚动数组 + +```rust +impl Solution { + pub fn max_uncrossed_lines(nums1: Vec, nums2: Vec) -> i32 { + let mut dp = vec![0; nums2.len() + 1]; + for num1 in nums1 { + let mut prev = 0; + for (j, &num2) in nums2.iter().enumerate() { + let temp = dp[j + 1]; + if num1 == num2 { + // 使用上一次的状态,防止重复计算 + dp[j + 1] = prev + 1; + } else { + dp[j + 1] = dp[j + 1].max(dp[j]); + } + prev = temp; } } + dp[nums2.len()] } - dp[m] } ``` From e5d694da4d071b1286eb22db2477f55bb91b0cf6 Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Wed, 19 Jul 2023 10:33:50 +0800 Subject: [PATCH 2042/3019] Update --- ...\275\221\345\205\254\345\217\270\346\200\273\347\273\223.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/\345\211\215\345\272\217/\346\267\261\345\234\263\344\272\222\350\201\224\347\275\221\345\205\254\345\217\270\346\200\273\347\273\223.md" "b/problems/\345\211\215\345\272\217/\346\267\261\345\234\263\344\272\222\350\201\224\347\275\221\345\205\254\345\217\270\346\200\273\347\273\223.md" index f8c07016a4..52a8448b51 100644 --- "a/problems/\345\211\215\345\272\217/\346\267\261\345\234\263\344\272\222\350\201\224\347\275\221\345\205\254\345\217\270\346\200\273\347\273\223.md" +++ "b/problems/\345\211\215\345\272\217/\346\267\261\345\234\263\344\272\222\350\201\224\347\275\221\345\205\254\345\217\270\346\200\273\347\273\223.md" @@ -36,7 +36,7 @@ * 微众银行(总部深圳) * 招银科技(总部深圳) * 平安系列(平安科技、平安寿险、平安产险、平安金融、平安好医生等) -* Shopee(东南亚最大的电商平台,最近发展势头非常强劲) +* Shopee(21年有裁员风波) * 有赞(深圳) * 迅雷(总部深圳) * 金蝶(总部深圳) From 607e4ebd49c67b6ddd4fcdd91b248e74ed0ed75e Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Wed, 19 Jul 2023 14:18:19 +0800 Subject: [PATCH 2043/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20=E5=93=88?= =?UTF-8?q?=E5=B8=8C=E8=A1=A8=E7=90=86=E8=AE=BA=E5=9F=BA=E7=A1=80=20?= =?UTF-8?q?=E6=8E=92=E7=89=88=E6=A0=BC=E5=BC=8F=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" | 2 ++ 1 file changed, 2 insertions(+) diff --git "a/problems/\345\223\210\345\270\214\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\345\223\210\345\270\214\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" index 0ab17ec02b..3055875a11 100644 --- "a/problems/\345\223\210\345\270\214\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\345\223\210\345\270\214\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -8,6 +8,8 @@ +# 哈希表理论基础 + ## 哈希表 首先什么是 哈希表,哈希表(英文名字为Hash table,国内也有一些算法书籍翻译为散列表,大家看到这两个名称知道都是指hash table就可以了)。 From c628aa65d438aaf4933f2b029ae71c93e3cfce63 Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Wed, 19 Jul 2023 14:25:34 +0800 Subject: [PATCH 2044/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200242.=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?=20=E6=8E=92=E7=89=88=E6=A0=BC=E5=BC=8F=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...15\345\274\202\344\275\215\350\257\215.md" | 38 ++++++++++--------- 1 file changed, 20 insertions(+), 18 deletions(-) diff --git "a/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" "b/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" index 4ea43947e8..f47d8b05b6 100644 --- "a/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" +++ "b/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" @@ -7,7 +7,7 @@ > 数组就是简单的哈希表,但是数组的大小可不是无限开辟的 -## 242.有效的字母异位词 +# 242.有效的字母异位词 [力扣题目链接](https://leetcode.cn/problems/valid-anagram/) @@ -21,13 +21,14 @@ 输入: s = "rat", t = "car" 输出: false - **说明:** 你可以假设字符串只包含小写字母。 -## 思路 +## 算法公开课 -本题B站视频讲解版:[学透哈希表,数组使用有技巧!Leetcode:242.有效的字母异位词](https://www.bilibili.com/video/BV1YG411p7BA) +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[学透哈希表,数组使用有技巧!Leetcode:242.有效的字母异位词](https://www.bilibili.com/video/BV1YG411p7BA),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 + +## 思路 先看暴力的解法,两层for循环,同时还要记录字符是否重复出现,很明显时间复杂度是 O(n^2)。 @@ -88,12 +89,10 @@ public: * 时间复杂度: O(n) * 空间复杂度: O(1) - - ## 其他语言版本 +### Java: -Java: ```java /** * 242. 有效的字母异位词 字典解法 @@ -121,7 +120,7 @@ class Solution { } ``` -Python: +### Python: ```python class Solution: @@ -165,7 +164,7 @@ class Solution(object): return a_count == b_count ``` -Go: +### Go: ```go func isAnagram(s string, t string) bool { @@ -182,7 +181,7 @@ func isAnagram(s string, t string) bool { } ``` -javaScript: +### JavaScript: ```js /** @@ -218,7 +217,7 @@ var isAnagram = function(s, t) { }; ``` -TypeScript: +### TypeScript: ```typescript function isAnagram(s: string, t: string): boolean { @@ -233,7 +232,7 @@ function isAnagram(s: string, t: string): boolean { }; ``` -Swift: +### Swift: ```Swift func isAnagram(_ s: String, _ t: String) -> Bool { @@ -257,7 +256,8 @@ func isAnagram(_ s: String, _ t: String) -> Bool { } ``` -PHP: +### PHP: + ```php class Solution { /** @@ -292,7 +292,8 @@ class Solution { } ``` -Rust: +### Rust: + ```rust impl Solution { pub fn is_anagram(s: String, t: String) -> bool { @@ -312,8 +313,8 @@ impl Solution { } ``` +### Scala: -Scala: ```scala object Solution { def isAnagram(s: String, t: String): Boolean = { @@ -337,8 +338,8 @@ object Solution { } ``` +### C#: -C#: ```csharp public bool IsAnagram(string s, string t) { int sl=s.Length,tl=t.Length; @@ -360,11 +361,12 @@ C#: ## 相关题目 * [383.赎金信](https://programmercarl.com/0383.%E8%B5%8E%E9%87%91%E4%BF%A1.html) -* 49.字母异位词分组 -* 438.找到字符串中所有字母异位词 +* [49.字母异位词分组](https://leetcode.cn/problems/group-anagrams/) +* [438.找到字符串中所有字母异位词](https://leetcode.cn/problems/find-all-anagrams-in-a-string/)

+ From 19dfa98e4f936f4b5f73886e6c1503c07f913bf8 Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Wed, 19 Jul 2023 14:30:12 +0800 Subject: [PATCH 2045/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200349.=E4=B8=A4?= =?UTF-8?q?=E4=B8=AA=E6=95=B0=E7=BB=84=E7=9A=84=E4=BA=A4=E9=9B=86=20?= =?UTF-8?q?=E6=8E=92=E7=89=88=E6=A0=BC=E5=BC=8F=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...04\347\232\204\344\272\244\351\233\206.md" | 39 +++++++++++-------- 1 file changed, 22 insertions(+), 17 deletions(-) diff --git "a/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" "b/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" index c2f6ef46ba..8daf5a35ba 100644 --- "a/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" +++ "b/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" @@ -10,7 +10,7 @@ > 如果哈希值比较少、特别分散、跨度非常大,使用数组就造成空间的极大浪费! -## 349. 两个数组的交集 +# 349. 两个数组的交集 [力扣题目链接](https://leetcode.cn/problems/intersection-of-two-arrays/) @@ -22,9 +22,11 @@ 输出结果中的每个元素一定是唯一的。 我们可以不考虑输出结果的顺序。 -## 思路 +## 算法公开课 + +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html)::[学透哈希表,set使用有技巧!Leetcode:349. 两个数组的交集](https://www.bilibili.com/video/BV1ba411S7wu),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 -关于本题,我录制了讲解视频:[学透哈希表,set使用有技巧!Leetcode:349. 两个数组的交集](https://www.bilibili.com/video/BV1ba411S7wu),看视频配合题解,事半功倍。 +## 思路 这道题目,主要要学会使用一种哈希数据结构:unordered_set,这个数据结构可以解决很多类似的问题。 @@ -118,8 +120,7 @@ public: ## 其他语言版本 - -Java: +### Java: ```Java import java.util.HashSet; @@ -159,8 +160,9 @@ class Solution { } ``` -Python3: +### Python3: (版本一) 使用字典和集合 + ```python class Solution: def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]: @@ -206,7 +208,8 @@ class Solution: ``` -Go: +### Go: + ```go func intersection(nums1 []int, nums2 []int) []int { set:=make(map[int]struct{},0) // 用map模拟set @@ -227,7 +230,7 @@ func intersection(nums1 []int, nums2 []int) []int { } ``` -javaScript: +### JavaScript: ```js /** @@ -255,7 +258,7 @@ var intersection = function(nums1, nums2) { }; ``` -TypeScript: +### TypeScript: 版本一(正常解法): @@ -280,7 +283,7 @@ function intersection(nums1: number[], nums2: number[]): number[] { }; ``` -Swift: +### Swift: ```swift func intersection(_ nums1: [Int], _ nums2: [Int]) -> [Int] { @@ -298,7 +301,8 @@ func intersection(_ nums1: [Int], _ nums2: [Int]) -> [Int] { } ``` -PHP: +### PHP: + ```php class Solution { /** @@ -327,7 +331,8 @@ class Solution { } ``` -Rust: +### Rust: + ```rust use std::collections::HashSet; impl Solution { @@ -363,7 +368,8 @@ impl Solution { } ``` -C: +### C: + ```C int* intersection1(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize){ @@ -394,7 +400,7 @@ int* intersection1(int* nums1, int nums1Size, int* nums2, int nums2Size, int* re } ``` -Scala: +### Scala: 正常解法: ```scala @@ -439,8 +445,8 @@ object Solution { ``` +### C#: -C#: ```csharp public int[] Intersection(int[] nums1, int[] nums2) { if(nums1==null||nums1.Length==0||nums2==null||nums1.Length==0) @@ -461,11 +467,10 @@ C#: ``` ## 相关题目 -* 350.两个数组的交集 II +* [350.两个数组的交集 II](https://leetcode.cn/problems/intersection-of-two-arrays-ii/)

- From 764b3e9e51608baf17183a5e36cab0888a6e46f9 Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Wed, 19 Jul 2023 14:34:27 +0800 Subject: [PATCH 2046/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200202.=E5=BF=AB?= =?UTF-8?q?=E4=B9=90=E6=95=B0=20=E6=8E=92=E7=89=88=E6=A0=BC=E5=BC=8F?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...2.\345\277\253\344\271\220\346\225\260.md" | 42 +++++++++++-------- 1 file changed, 24 insertions(+), 18 deletions(-) diff --git "a/problems/0202.\345\277\253\344\271\220\346\225\260.md" "b/problems/0202.\345\277\253\344\271\220\346\225\260.md" index 7fe8cd8d75..4a77e2b67c 100644 --- "a/problems/0202.\345\277\253\344\271\220\346\225\260.md" +++ "b/problems/0202.\345\277\253\344\271\220\346\225\260.md" @@ -28,7 +28,7 @@ 6^2 + 8^2 = 100 1^2 + 0^2 + 0^2 = 1 -# 思路 +## 思路 这道题目看上去貌似一道数学问题,其实并不是! @@ -80,10 +80,10 @@ public: -# 其他语言版本 +## 其他语言版本 +### Java: -Java: ```java class Solution { public boolean isHappy(int n) { @@ -107,8 +107,9 @@ class Solution { } ``` -Python: +### Python: (版本一)使用集合 + ```python class Solution: def isHappy(self, n: int) -> bool: @@ -131,7 +132,7 @@ class Solution: n, r = divmod(n, 10) new_num += r ** 2 return new_num - ``` +``` (版本二)使用集合 ```python class Solution: @@ -146,7 +147,7 @@ class Solution: if new_num==1: return True else: n = new_num return False -``` + ``` (版本三)使用数组 ```python class Solution: @@ -161,7 +162,7 @@ class Solution: if new_num==1: return True else: n = new_num return False -``` + ``` (版本四)使用快慢指针 ```python class Solution: @@ -180,7 +181,7 @@ class Solution: n, r = divmod(n, 10) new_num += r ** 2 return new_num -``` + ``` (版本五)使用集合+精简 ```python class Solution: @@ -192,7 +193,7 @@ class Solution: return False seen.add(n) return True -``` + ``` (版本六)使用数组+精简 ```python class Solution: @@ -204,8 +205,9 @@ class Solution: return False seen.append(n) return True -``` -Go: + ``` +### Go: + ```go func isHappy(n int) bool { m := make(map[int]bool) @@ -225,7 +227,7 @@ func getSum(n int) int { } ``` -javaScript: +### JavaScript: ```js var isHappy = function (n) { @@ -303,7 +305,7 @@ var isHappy = function(n) { }; ``` -TypeScript: +### TypeScript: ```typescript function isHappy(n: number): boolean { @@ -322,7 +324,7 @@ function isHappy(n: number): boolean { }; ``` -Swift: +### Swift: ```swift // number 每个位置上的数字的平方和 @@ -355,7 +357,8 @@ func isHappy(_ n: Int) -> Bool { } ``` -PHP: +### PHP: + ```php class Solution { /** @@ -386,7 +389,8 @@ class Solution { } ``` -Rust: +### Rust: + ```Rust use std::collections::HashSet; impl Solution { @@ -416,7 +420,8 @@ impl Solution { } ``` -C: +### C: + ```C typedef struct HashNodeTag { int key; /* num */ @@ -473,8 +478,8 @@ object Solution { } ``` +### C#: -C#: ```csharp public class Solution { private int getSum(int n) { @@ -500,3 +505,4 @@ public class Solution { + From 23950d1c3e8541420eaca3f55f0896a84d3ba007 Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Wed, 19 Jul 2023 14:43:14 +0800 Subject: [PATCH 2047/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20001.=E4=B8=A4?= =?UTF-8?q?=E6=95=B0=E4=B9=8B=E5=92=8C=20=E6=8E=92=E7=89=88=E6=A0=BC?= =?UTF-8?q?=E5=BC=8F=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...44\346\225\260\344\271\213\345\222\214.md" | 41 +++++++++++-------- 1 file changed, 23 insertions(+), 18 deletions(-) diff --git "a/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" "b/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" index ca62e3edc2..e3fb0fb55f 100644 --- "a/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" @@ -5,7 +5,7 @@

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

-## 1. 两数之和 +# 1. 两数之和 [力扣题目链接](https://leetcode.cn/problems/two-sum/) @@ -21,10 +21,12 @@ 所以返回 [0, 1] +## 算法公开课 + +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[梦开始的地方,Leetcode:1.两数之和](https://www.bilibili.com/video/BV1aT41177mK),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 -## 思路 -建议看一下我录的这期视频:[梦开始的地方,Leetcode:1.两数之和](https://www.bilibili.com/video/BV1aT41177mK),结合本题解来学习,事半功倍。 +## 思路 很明显暴力的解法是两层for循环查找,时间复杂度是O(n^2)。 @@ -128,8 +130,8 @@ public: ## 其他语言版本 +### Java: -Java: ```java public int[] twoSum(int[] nums, int target) { int[] res = new int[2]; @@ -150,8 +152,9 @@ public int[] twoSum(int[] nums, int target) { } ``` -Python: +### Python: (版本一) 使用字典 + ```python class Solution: def twoSum(self, nums: List[int], target: int) -> List[int]: @@ -211,7 +214,7 @@ class Solution: return [i,j] ``` -Go: +### Go: ```go // 暴力解法 @@ -242,7 +245,7 @@ func twoSum(nums []int, target int) []int { } ``` -Rust +### Rust: ```rust use std::collections::HashMap; @@ -263,9 +266,7 @@ impl Solution { } } ``` -Rust - -``` +```rust use std::collections::HashMap; impl Solution { @@ -284,7 +285,7 @@ impl Solution { } ``` -Javascript +### Javascript: ```javascript var twoSum = function (nums, target) { @@ -299,7 +300,7 @@ var twoSum = function (nums, target) { }; ``` -TypeScript: +### TypeScript: ```typescript function twoSum(nums: number[], target: number): number[] { @@ -317,7 +318,7 @@ function twoSum(nums: number[], target: number): number[] { }; ``` -php +### php: ```php function twoSum(array $nums, int $target): array @@ -337,7 +338,8 @@ function twoSum(array $nums, int $target): array } ``` -Swift: +### Swift: + ```swift func twoSum(_ nums: [Int], _ target: Int) -> [Int] { // 值: 下标 @@ -353,8 +355,8 @@ func twoSum(_ nums: [Int], _ target: Int) -> [Int] { } ``` +### Scala: -Scala: ```scala object Solution { // 导入包 @@ -377,7 +379,8 @@ object Solution { } ``` -C#: +### C#: + ```csharp public class Solution { public int[] TwoSum(int[] nums, int target) { @@ -396,7 +399,8 @@ public class Solution { } ``` -Dart: +### Dart: + ```dart List twoSum(List nums, int target) { var tmp = []; @@ -411,7 +415,8 @@ List twoSum(List nums, int target) { } ``` -C: +### C: + ```c From 2948791011238baa02f6beda8bb496e8c52fb6de Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Wed, 19 Jul 2023 14:47:02 +0800 Subject: [PATCH 2048/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200454.=E5=9B=9B?= =?UTF-8?q?=E6=95=B0=E7=9B=B8=E5=8A=A0II=20=E6=8E=92=E7=89=88=E6=A0=BC?= =?UTF-8?q?=E5=BC=8F=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\346\225\260\347\233\270\345\212\240II.md" | 30 +++++++++++-------- 1 file changed, 18 insertions(+), 12 deletions(-) diff --git "a/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" "b/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" index 4a16d4f4a7..90c3733449 100644 --- "a/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" +++ "b/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" @@ -34,10 +34,12 @@ 1. (0, 0, 0, 1) -> A[0] + B[0] + C[0] + D[1] = 1 + (-2) + (-1) + 2 = 0 2. (1, 1, 0, 0) -> A[1] + B[1] + C[0] + D[0] = 2 + (-1) + (-1) + 0 = 0 +## 算法公开课 -# 思路 +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[学透哈希表,map使用有技巧!LeetCode:454.四数相加II](https://www.bilibili.com/video/BV1Md4y1Q7Yh),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 -本题视频讲解:[学透哈希表,map使用有技巧!LeetCode:454.四数相加II](https://www.bilibili.com/video/BV1Md4y1Q7Yh),结合视频在看本题解,事半功倍。 + +## 思路 本题咋眼一看好像和[0015.三数之和](https://programmercarl.com/0015.三数之和.html),[0018.四数之和](https://programmercarl.com/0018.四数之和.html)差不多,其实差很多。 @@ -92,8 +94,8 @@ public: ## 其他语言版本 +### Java: -Java: ```Java class Solution { public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) { @@ -117,8 +119,9 @@ class Solution { } ``` -Python: +### Python: (版本一) 使用字典 + ```python class Solution(object): def fourSumCount(self, nums1, nums2, nums3, nums4): @@ -179,7 +182,7 @@ class Solution: return cnt ``` -Go: +### Go: ```go func fourSumCount(nums1 []int, nums2 []int, nums3 []int, nums4 []int) int { @@ -201,7 +204,7 @@ func fourSumCount(nums1 []int, nums2 []int, nums3 []int, nums4 []int) int { } ``` -javaScript: +### JavaScript: ```js /** @@ -233,7 +236,7 @@ var fourSumCount = function(nums1, nums2, nums3, nums4) { }; ``` -TypeScript: +### TypeScript: ```typescript function fourSumCount(nums1: number[], nums2: number[], nums3: number[], nums4: number[]): number { @@ -258,7 +261,7 @@ function fourSumCount(nums1: number[], nums2: number[], nums3: number[], nums4: }; ``` -PHP: +### PHP: ```php class Solution { @@ -291,8 +294,8 @@ class Solution { } ``` +### Swift: -Swift: ```swift func fourSumCount(_ nums1: [Int], _ nums2: [Int], _ nums3: [Int], _ nums4: [Int]) -> Int { // ab和: ab和出现次数 @@ -316,7 +319,8 @@ func fourSumCount(_ nums1: [Int], _ nums2: [Int], _ nums3: [Int], _ nums4: [Int] } ``` -Rust: +### Rust: + ```rust use std::collections::HashMap; impl Solution { @@ -342,8 +346,8 @@ impl Solution { } ``` +### Scala: -Scala: ```scala object Solution { // 导包 @@ -380,7 +384,8 @@ object Solution { } ``` -C#: +### C#: + ```csharp public int FourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) { Dictionary dic = new Dictionary(); @@ -411,3 +416,4 @@ public int FourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) { + From 0922ede8c7ce3fedbd7494834beb224aa3da6311 Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Wed, 19 Jul 2023 14:49:56 +0800 Subject: [PATCH 2049/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200383.=E8=B5=8E?= =?UTF-8?q?=E9=87=91=E4=BF=A1=20=E6=8E=92=E7=89=88=E6=A0=BC=E5=BC=8F?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...3.\350\265\216\351\207\221\344\277\241.md" | 28 +++++++++++-------- 1 file changed, 16 insertions(+), 12 deletions(-) diff --git "a/problems/0383.\350\265\216\351\207\221\344\277\241.md" "b/problems/0383.\350\265\216\351\207\221\344\277\241.md" index e74cdf71fd..8122240ecc 100644 --- "a/problems/0383.\350\265\216\351\207\221\344\277\241.md" +++ "b/problems/0383.\350\265\216\351\207\221\344\277\241.md" @@ -34,7 +34,7 @@ canConstruct("aa", "aab") -> true * 第二点 “你可以假设两个字符串均只含有小写字母。” *说明只有小写字母*,这一点很重要 -## 暴力解法 +### 暴力解法 那么第一个思路其实就是暴力枚举了,两层for循环,不断去寻找,代码如下: @@ -66,7 +66,7 @@ public: 这里时间复杂度是比较高的,而且里面还有一个字符串删除也就是erase的操作,也是费时的,当然这段代码也可以过这道题。 -## 哈希解法 +### 哈希解法 因为题目所只有小写字母,那可以采用空间换取时间的哈希策略, 用一个长度为26的数组还记录magazine里字母出现的次数。 @@ -112,8 +112,8 @@ public: ## 其他语言版本 +### Java: -Java: ```Java class Solution { public boolean canConstruct(String ransomNote, String magazine) { @@ -146,8 +146,9 @@ class Solution { ``` -Python: +### Python: (版本一)使用数组 + ```python class Solution: def canConstruct(self, ransomNote: str, magazine: str) -> bool: @@ -213,7 +214,7 @@ class Solution: return all(ransomNote.count(c) <= magazine.count(c) for c in set(ransomNote)) ``` -Go: +### Go: ```go func canConstruct(ransomNote string, magazine string) bool { @@ -231,7 +232,7 @@ func canConstruct(ransomNote string, magazine string) bool { } ``` -javaScript: +### JavaScript: ```js /** @@ -254,7 +255,7 @@ var canConstruct = function(ransomNote, magazine) { }; ``` -TypeScript: +### TypeScript: ```typescript function canConstruct(ransomNote: string, magazine: string): boolean { @@ -275,8 +276,8 @@ function canConstruct(ransomNote: string, magazine: string): boolean { }; ``` +### PHP: -PHP: ```php class Solution { /** @@ -301,7 +302,8 @@ class Solution { } ``` -Swift: +### Swift: + ```swift func canConstruct(_ ransomNote: String, _ magazine: String) -> Bool { var record = Array(repeating: 0, count: 26); @@ -324,7 +326,8 @@ func canConstruct(_ ransomNote: String, _ magazine: String) -> Bool { } ``` -Rust: +### Rust: + ```rust impl Solution { pub fn can_construct(ransom_note: String, magazine: String) -> bool { @@ -347,7 +350,7 @@ impl Solution { } ``` -Scala: +### Scala: 版本一: 使用数组作为哈希表 ```scala @@ -411,8 +414,8 @@ object Solution { } ``` +### C#: -C#: ```csharp public bool CanConstruct(string ransomNote, string magazine) { if(ransomNote.Length > magazine.Length) return false; @@ -434,3 +437,4 @@ public bool CanConstruct(string ransomNote, string magazine) { + From eb2cdf24bf03dd143072a4260fb11b76ececcc37 Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Wed, 19 Jul 2023 14:55:09 +0800 Subject: [PATCH 2050/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200015.=E4=B8=89?= =?UTF-8?q?=E6=95=B0=E4=B9=8B=E5=92=8C=20=E6=8E=92=E7=89=88=E6=A0=BC?= =?UTF-8?q?=E5=BC=8F=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...11\346\225\260\344\271\213\345\222\214.md" | 55 +++++++++++-------- 1 file changed, 32 insertions(+), 23 deletions(-) diff --git "a/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" "b/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" index 9cca779b21..4951c90cf1 100644 --- "a/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" @@ -26,14 +26,15 @@ [-1, -1, 2] ] +## 算法公开课 -# 思路 - -针对本题,我录制了视频讲解:[梦破碎的地方!| LeetCode:15.三数之和](https://www.bilibili.com/video/BV1GW4y127qo),结合本题解一起看,事半功倍! +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[梦破碎的地方!| LeetCode:15.三数之和](https://www.bilibili.com/video/BV1GW4y127qo),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 **注意[0, 0, 0, 0] 这组数据** -## 哈希解法 +## 思路 + +### 哈希解法 两层for循环就可以确定 a 和b 的数值了,可以使用哈希法来确定 0-(a+b) 是否在 数组里出现过,其实这个思路是正确的,但是我们有一个非常棘手的问题,就是题目中说的不可以包含重复的三元组。 @@ -87,7 +88,7 @@ public: * 空间复杂度: O(n),额外的 set 开销 -## 双指针 +### 双指针 **其实这道题目使用哈希法并不十分合适**,因为在去重的操作中有很多细节需要注意,在面试中很难直接写出没有bug的代码。 @@ -166,9 +167,9 @@ public: * 空间复杂度: O(1) -## 去重逻辑的思考 +### 去重逻辑的思考 -### a的去重 +#### a的去重 说道去重,其实主要考虑三个数的去重。 a, b ,c, 对应的就是 nums[i],nums[left],nums[right] @@ -188,7 +189,7 @@ a 如果重复了怎么办,a是nums里遍历的元素,那么应该直接跳 if (nums[i] == nums[i + 1]) { // 去重操作 continue; } -``` +``` 那就我们就把 三元组中出现重复元素的情况直接pass掉了。 例如{-1, -1 ,2} 这组数据,当遍历到第一个-1 的时候,判断 下一个也是-1,那这组数据就pass了。 @@ -208,7 +209,7 @@ if (i > 0 && nums[i] == nums[i - 1]) { 这是一个非常细节的思考过程。 -### b与c的去重 +#### b与c的去重 很多同学写本题的时候,去重的逻辑多加了 对right 和left 的去重:(代码中注释部分) @@ -225,7 +226,7 @@ while (right > left) { } else { } } -``` +``` 但细想一下,这种去重其实对提升程序运行效率是没有帮助的。 @@ -238,7 +239,7 @@ while (right > left) { 所以这种去重 是可以不加的。 仅仅是 把去重的逻辑提前了而已。 -# 思考题 +## 思考题 既然三数之和可以使用双指针法,我们之前讲过的[1.两数之和](https://programmercarl.com/0001.两数之和.html),可不可以使用双指针法呢? @@ -254,8 +255,8 @@ while (right > left) { ## 其他语言版本 +### Java: -Java: ```Java class Solution { public List> threeSum(int[] nums) { @@ -297,8 +298,9 @@ class Solution { } ``` -Python: +### Python: (版本一) 双指针 + ```Python class Solution: def threeSum(self, nums: List[int]) -> List[List[int]]: @@ -366,7 +368,7 @@ class Solution: return result ``` -Go: +### Go: ```Go func threeSum(nums []int) [][]int { @@ -407,7 +409,7 @@ func threeSum(nums []int) [][]int { } ``` -javaScript: +### JavaScript: ```js var threeSum = function(nums) { @@ -512,7 +514,7 @@ var threeSum = function (nums) { }; ``` -TypeScript: +### TypeScript: ```typescript function threeSum(nums: number[]): number[][] { @@ -553,7 +555,8 @@ function threeSum(nums: number[]): number[][] { }; ``` -ruby: +### Ruby: + ```ruby def is_valid(strs) symbol_map = {')' => '(', '}' => '{', ']' => '['} @@ -571,8 +574,8 @@ def is_valid(strs) end ``` +### PHP: -PHP: ```php class Solution { /** @@ -613,7 +616,8 @@ class Solution { } ``` -Swift: +### Swift: + ```swift // 双指针法 func threeSum(_ nums: [Int]) -> [[Int]] { @@ -654,7 +658,8 @@ func threeSum(_ nums: [Int]) -> [[Int]] { } ``` -Rust: +### Rust: + ```Rust // 哈希解法 use std::collections::HashSet; @@ -718,7 +723,8 @@ impl Solution { } ``` -C: +### C: + ```C //qsort辅助cmp函数 int cmp(const void* ptr1, const void* ptr2) { @@ -792,7 +798,8 @@ int** threeSum(int* nums, int numsSize, int* returnSize, int** returnColumnSizes } ``` -C#: +### C#: + ```csharp public class Solution { @@ -850,7 +857,8 @@ public class Solution } } ``` -Scala: +### Scala: + ```scala object Solution { // 导包 @@ -898,3 +906,4 @@ object Solution { + From 3fe673d804209e55705b2b7206d86e3fc6e87e18 Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Wed, 19 Jul 2023 14:59:05 +0800 Subject: [PATCH 2051/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200018.=E5=9B=9B?= =?UTF-8?q?=E6=95=B0=E4=B9=8B=E5=92=8C=20=E6=8E=92=E7=89=88=E6=A0=BC?= =?UTF-8?q?=E5=BC=8F=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...33\346\225\260\344\271\213\345\222\214.md" | 41 ++++++++++--------- 1 file changed, 22 insertions(+), 19 deletions(-) diff --git "a/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" "b/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" index a4d41d9bf9..28c20b7acd 100644 --- "a/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" @@ -27,9 +27,11 @@ [-2, 0, 0, 2] ] -# 思路 +## 算法公开课 -针对本题,我录制了视频讲解:[难在去重和剪枝!| LeetCode:18. 四数之和](https://www.bilibili.com/video/BV1DS4y147US),结合本题解一起看,事半功倍! +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[难在去重和剪枝!| LeetCode:18. 四数之和](https://www.bilibili.com/video/BV1DS4y147US),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 + +## 思路 四数之和,和[15.三数之和](https://programmercarl.com/0015.三数之和.html)是一个思路,都是使用双指针法, 基本解法就是在[15.三数之和](https://programmercarl.com/0015.三数之和.html) 的基础上再套一层for循环。 @@ -141,22 +143,16 @@ if (nums[k] + nums[i] > target && nums[k] + nums[i] >= 0) { if (nums[k] + nums[i] > target && nums[i] >= 0) { break; } -``` +``` 因为只要 nums[k] + nums[i] > target,那么 nums[i] 后面的数都是正数的话,就一定 不符合条件了。 不过这种剪枝 其实有点 小绕,大家能够理解 文章给的完整代码的剪枝 就够了。 - - - - - - ## 其他语言版本 +### Java: -Java: ```Java class Solution { public List> fourSum(int[] nums, int target) { @@ -206,8 +202,9 @@ class Solution { } ``` -Python: +### Python: (版本一) 双指针 + ```python class Solution: def fourSum(self, nums: List[int], target: int) -> List[List[int]]: @@ -273,7 +270,8 @@ class Solution(object): ``` -Go: +### Go: + ```go func fourSum(nums []int, target int) [][]int { if len(nums) < 4 { @@ -323,7 +321,7 @@ func fourSum(nums []int, target int) [][]int { } ``` -javaScript: +### JavaScript: ```js /** @@ -359,7 +357,7 @@ var fourSum = function(nums, target) { }; ``` -TypeScript: +### TypeScript: ```typescript function fourSum(nums: number[], target: number): number[][] { @@ -400,7 +398,7 @@ function fourSum(nums: number[], target: number): number[][] { }; ``` -PHP: +### PHP: ```php class Solution { @@ -445,7 +443,8 @@ class Solution { } ``` -Swift: +### Swift: + ```swift func fourSum(_ nums: [Int], _ target: Int) -> [[Int]] { var res = [[Int]]() @@ -493,7 +492,8 @@ func fourSum(_ nums: [Int], _ target: Int) -> [[Int]] { } ``` -C#: +### C#: + ```csharp public class Solution { @@ -555,7 +555,8 @@ public class Solution } ``` -Rust: +### Rust: + ```Rust use std::cmp::Ordering; impl Solution { @@ -603,7 +604,8 @@ impl Solution { } ``` -Scala: +### Scala: + ```scala object Solution { // 导包 @@ -651,3 +653,4 @@ object Solution { + From ddee6adbbba4db9466cf720307b2e44f10e22140 Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Wed, 19 Jul 2023 15:01:01 +0800 Subject: [PATCH 2052/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20=E5=93=88?= =?UTF-8?q?=E5=B8=8C=E8=A1=A8=E6=80=BB=E7=BB=93=20=E6=8E=92=E7=89=88?= =?UTF-8?q?=E6=A0=BC=E5=BC=8F=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\214\350\241\250\346\200\273\347\273\223.md" | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git "a/problems/\345\223\210\345\270\214\350\241\250\346\200\273\347\273\223.md" "b/problems/\345\223\210\345\270\214\350\241\250\346\200\273\347\273\223.md" index 9ee84f991b..6750636305 100644 --- "a/problems/\345\223\210\345\270\214\350\241\250\346\200\273\347\273\223.md" +++ "b/problems/\345\223\210\345\270\214\350\241\250\346\200\273\347\273\223.md" @@ -7,8 +7,10 @@ > 哈希表总结篇如约而至 +# 哈希表总结篇 -# 哈希表理论基础 + +## 哈希表理论基础 在[关于哈希表,你该了解这些!](https://programmercarl.com/哈希表理论基础.html)中,我们介绍了哈希表的基础理论知识,不同于枯燥的讲解,这里介绍了都是对刷题有帮助的理论知识点。 @@ -32,9 +34,9 @@ **只有对这些数据结构的底层实现很熟悉,才能灵活使用,否则很容易写出效率低下的程序**。 -# 哈希表经典题目 +## 哈希表经典题目 -## 数组作为哈希表 +### 数组作为哈希表 一些应用场景就是为数组量身定做的。 @@ -51,7 +53,7 @@ **上面两道题目用map确实可以,但使用map的空间消耗要比数组大一些,因为map要维护红黑树或者符号表,而且还要做哈希函数的运算。所以数组更加简单直接有效!** -## set作为哈希表 +### set作为哈希表 在[349. 两个数组的交集](https://programmercarl.com/0349.两个数组的交集.html)中我们给出了什么时候用数组就不行了,需要用set。 @@ -75,7 +77,7 @@ std::set和std::multiset底层实现都是红黑树,std::unordered_set的底 在[202.快乐数](https://programmercarl.com/0202.快乐数.html)中,我们再次使用了unordered_set来判断一个数是否重复出现过。 -## map作为哈希表 +### map作为哈希表 在[1.两数之和](https://programmercarl.com/0001.两数之和.html)中map正式登场。 @@ -110,7 +112,7 @@ std::unordered_map 底层实现为哈希,std::map 和std::multimap 的底层 所以18. 四数之和,15.三数之和都推荐使用双指针法! -# 总结 +## 总结 对于哈希表的知识相信很多同学都知道,但是没有成体系。 @@ -123,9 +125,8 @@ std::unordered_map 底层实现为哈希,std::map 和std::multimap 的底层 - -

+ From 00ef6084c6ea18933e7a63923aad71addee70c6e Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Wed, 19 Jul 2023 15:32:11 +0800 Subject: [PATCH 2053/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200344.=E5=8F=8D?= =?UTF-8?q?=E8=BD=AC=E5=AD=97=E7=AC=A6=E4=B8=B2=20=E6=8E=92=E7=89=88?= =?UTF-8?q?=E6=A0=BC=E5=BC=8F=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...54\345\255\227\347\254\246\344\270\262.md" | 35 +++++++++++-------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git "a/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" "b/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" index 1c74f9aa46..8a4fed4574 100644 --- "a/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" @@ -26,10 +26,12 @@ 输入:["H","a","n","n","a","h"] 输出:["h","a","n","n","a","H"] +## 算法公开课 -# 思路 +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[字符串基础操作! | LeetCode:344.反转字符串](https://www.bilibili.com/video/BV1fV4y17748),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 -针对本题,我录制了视频讲解:[字符串基础操作! | LeetCode:344.反转字符串](https://www.bilibili.com/video/BV1fV4y17748),结合本题解一起看,事半功倍! + +## 思路 先说一说题外话: @@ -138,8 +140,8 @@ public: ## 其他语言版本 +### Java: -Java: ```Java class Solution { public void reverseString(char[] s) { @@ -173,8 +175,9 @@ class Solution { ``` -Python: +### Python: (版本一) 双指针 + ```python class Solution: def reverseString(self, s: List[str]) -> None: @@ -247,7 +250,8 @@ class Solution: s[:] = [s[i] for i in range(len(s) - 1, -1, -1)] ``` -Go: +### Go: + ```Go func reverseString(s []byte) { left := 0 @@ -260,7 +264,7 @@ func reverseString(s []byte) { } ``` -javaScript: +### JavaScript: ```js /** @@ -278,7 +282,7 @@ var reverse = function(s) { }; ``` -TypeScript: +### TypeScript: ```typescript /** @@ -299,7 +303,7 @@ function reverseString(s: string[]): void { }; ``` -Swift: +### Swift: ```swift // 双指针 - 元组 @@ -316,7 +320,8 @@ func reverseString(_ s: inout [Character]) { ``` -Rust: +### Rust: + ```Rust impl Solution { pub fn reverse_string(s: &mut Vec) { @@ -332,7 +337,8 @@ impl Solution { } ``` -C: +### C: + ```c void reverseString(char* s, int sSize){ int left = 0; @@ -347,7 +353,8 @@ void reverseString(char* s, int sSize){ } ``` -C#: +### C#: + ```csharp public class Solution { @@ -361,8 +368,8 @@ public class Solution } ``` +### PHP: -PHP: ```php // 双指针 // 一: @@ -392,7 +399,8 @@ function reverse(&$s, $start, $end) { } ``` -Scala: +### Scala: + ```scala object Solution { def reverseString(s: Array[Char]): Unit = { @@ -411,4 +419,3 @@ object Solution { - From 5cb250100b49e1b8109ddf01ba2109b257094b47 Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Wed, 19 Jul 2023 15:37:57 +0800 Subject: [PATCH 2054/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200541.=E5=8F=8D?= =?UTF-8?q?=E8=BD=AC=E5=AD=97=E7=AC=A6=E4=B8=B2=20=E6=8E=92=E7=89=88?= =?UTF-8?q?=E6=A0=BC=E5=BC=8F=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\345\255\227\347\254\246\344\270\262II.md" | 33 ++++++++++--------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git "a/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" "b/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" index 179395b3ac..80e662f9dd 100644 --- "a/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" +++ "b/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" @@ -23,9 +23,11 @@ 输入: s = "abcdefg", k = 2 输出: "bacdfeg" -# 思路 +## 算法公开课 -针对本题,我录制了视频讲解:[字符串操作进阶! | LeetCode:541. 反转字符串II](https://www.bilibili.com/video/BV1dT411j7NN),结合本题解一起看,事半功倍! +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[字符串操作进阶! | LeetCode:541. 反转字符串II](https://www.bilibili.com/video/BV1dT411j7NN),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 + +## 思路 这道题目其实也是模拟,实现题目中规定的反转规则就可以了。 @@ -42,8 +44,6 @@ 那么这里具体反转的逻辑我们要不要使用库函数呢,其实用不用都可以,使用reverse来实现反转也没毛病,毕竟不是解题关键部分。 -# C++代码 - 使用C++库函数reverse的版本如下: ```CPP @@ -129,7 +129,7 @@ public: ## 其他语言版本 -C: +### C: ```c char * reverseStr(char * s, int k){ @@ -152,7 +152,7 @@ char * reverseStr(char * s, int k){ } ``` -Java: +### Java: ```Java //解法一 @@ -256,7 +256,8 @@ class Solution { } } ``` -Python: +### Python: + ```python class Solution: def reverseStr(self, s: str, k: int) -> str: @@ -281,7 +282,7 @@ class Solution: return ''.join(res) ``` -Python3 (v2): +### Python3 (v2): ```python class Solution: @@ -296,7 +297,7 @@ class Solution: return s ``` -Go: +### Go: ```go func reverseStr(s string, k int) string { @@ -325,7 +326,7 @@ func reverse(b []byte) { } ``` -javaScript: +### JavaScript: ```js @@ -346,7 +347,7 @@ var reverseStr = function(s, k) { ``` -TypeScript: +### TypeScript: ```typescript function reverseStr(s: string, k: number): string { @@ -368,7 +369,7 @@ function reverseStr(s: string, k: number): string { }; ``` -Swift: +### Swift: ```swift func reverseStr(_ s: String, _ k: Int) -> String { @@ -388,7 +389,8 @@ func reverseStr(_ s: String, _ k: Int) -> String { } ``` -C#: +### C#: + ```csharp public class Solution { @@ -403,7 +405,7 @@ public class Solution } } ``` -Scala: +### Scala: 版本一: (正常解法) ```scala @@ -469,7 +471,7 @@ object Solution { } ``` -Rust: +### Rust: ```Rust impl Solution { @@ -503,4 +505,3 @@ impl Solution { - From 963eb8fc8e58094388bf6c0f27be7563d7a488b9 Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Wed, 19 Jul 2023 15:41:59 +0800 Subject: [PATCH 2055/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20=E5=89=91?= =?UTF-8?q?=E6=8C=87Offer05.=E6=9B=BF=E6=8D=A2=E7=A9=BA=E6=A0=BC=20?= =?UTF-8?q?=E6=8E=92=E7=89=88=E6=A0=BC=E5=BC=8F=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...77\346\215\242\347\251\272\346\240\274.md" | 29 ++++++++++--------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git "a/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" "b/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" index dbad781ef3..fed08a5346 100644 --- "a/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" +++ "b/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" @@ -15,7 +15,7 @@ 输入:s = "We are happy." 输出:"We%20are%20happy." -# 思路 +## 思路 如果想把这道题目做到极致,就不要只用额外的辅助空间了! @@ -86,7 +86,7 @@ public: * [142.环形链表II](https://programmercarl.com/0142.环形链表II.html) * [344.反转字符串](https://programmercarl.com/0344.反转字符串.html) -# 拓展 +## 拓展 这里也给大家拓展一下字符串和数组有什么差别, @@ -121,7 +121,8 @@ for (int i = 0; i < a.size(); i++) { ## 其他语言版本 -C: +### C: + ```C char* replaceSpace(char* s){ //统计空格数量 @@ -152,8 +153,8 @@ char* replaceSpace(char* s){ } ``` +### Java: -Java: ```Java //使用一个新的对象,复制 str,复制的过程对其判断,是空格则替换,否则直接复制,类似于数组复制 public static String replaceSpace(String s) { @@ -211,8 +212,8 @@ public String replaceSpace(String s) { } ``` +### Go: -Go: ```go // 遍历添加 func replaceSpace(s string) string { @@ -264,9 +265,10 @@ func replaceSpace(s string) string { +### python: + +因为字符串是不可变类型,所以操作字符串需要将其转换为列表,因此空间复杂度不可能为O(1) -python: -#### 因为字符串是不可变类型,所以操作字符串需要将其转换为列表,因此空间复杂度不可能为O(1) (版本一)转换成列表,并且添加相匹配的空间,然后进行填充 ```python class Solution: @@ -328,7 +330,7 @@ class Solution: def replaceSpace(self, s: str) -> str: return s.replace(' ', '%20') ``` -javaScript: +### JavaScript: ```js /** @@ -366,7 +368,7 @@ javaScript: }; ``` -TypeScript: +### TypeScript: ```typescript function replaceSpace(s: string): string { @@ -393,7 +395,7 @@ function replaceSpace(s: string): string { }; ``` -Swift: +### Swift: ```swift func replaceSpace(_ s: String) -> String { @@ -434,7 +436,7 @@ func replaceSpace(_ s: String) -> String { } ``` -Scala: +### Scala: 方式一: 双指针 ```scala @@ -491,8 +493,8 @@ object Solution { } ``` +### PHP: -PHP: ```php function replaceSpace($s){ $sLen = strlen($s); @@ -527,7 +529,7 @@ function spaceLen($s){ } ``` -Rust +### Rust: ```Rust impl Solution { @@ -563,3 +565,4 @@ impl Solution { + From e70ca923440e656d4c62761fcff2ff40e9c17b32 Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Wed, 19 Jul 2023 15:47:12 +0800 Subject: [PATCH 2056/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200151.=E5=8F=8D?= =?UTF-8?q?=E8=BD=AC=E5=AD=97=E7=AC=A6=E4=B8=B2=E4=B8=AD=E7=9A=84=E5=8D=95?= =?UTF-8?q?=E8=AF=8D=20=E6=8E=92=E7=89=88=E6=A0=BC=E5=BC=8F=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...14\347\232\204\345\215\225\350\257\215.md" | 29 ++++++++++--------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git "a/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" "b/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" index 6dd3cd4975..19ccb725a0 100644 --- "a/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" +++ "b/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" @@ -28,10 +28,11 @@ 输出: "example good a" 解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。 +## 算法公开课 -# 思路 +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[字符串复杂操作拿捏了! | LeetCode:151.翻转字符串里的单词](https://www.bilibili.com/video/BV1uT41177fX),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 -针对本题,我录制了视频讲解:[字符串复杂操作拿捏了! | LeetCode:151.翻转字符串里的单词](https://www.bilibili.com/video/BV1uT41177fX),结合本题解一起看,事半功倍! +## 思路 **这道题目可以说是综合考察了字符串的多种操作。** @@ -204,8 +205,7 @@ public: ## 其他语言版本 - -Java: +### Java: ```Java class Solution { @@ -433,9 +433,10 @@ class Solution { } ``` -python: +### python: (版本一)先删除空白,然后整个反转,最后单词反转。 **因为字符串是不可变类型,所以反转单词的时候,需要将其转换成列表,然后通过join函数再将其转换成列表,所以空间复杂度不是O(1)** + ```Python class Solution: def reverseWords(self, s: str) -> str: @@ -467,7 +468,7 @@ class Solution: return " ".join(words) ``` -Go: +### Go: 版本一: @@ -571,7 +572,8 @@ func reverse(b *[]byte, left, right int) { -javaScript: +### JavaScript: + ```js /** * @param {string} s @@ -630,7 +632,7 @@ function reverse(strArr, start, end) { } ``` -TypeScript: +### TypeScript: ```typescript function reverseWords(s: string): string { @@ -689,7 +691,7 @@ function reverseWords(s: string): string { }; ``` -Swift: +### Swift: ```swift func reverseWords(_ s: String) -> String { @@ -766,7 +768,7 @@ func reverseWord(_ s: inout [Character]) { } ``` -Scala: +### Scala: ```scala object Solution { @@ -824,8 +826,8 @@ object Solution { } ``` +### PHP: -PHP: ```php function reverseWords($s) { $this->removeExtraSpaces($s); @@ -872,7 +874,7 @@ function reverseString(&$s, $start, $end) { return ; } ``` -Rust: +### Rust: ```Rust // 根据C++版本二思路进行实现 @@ -924,7 +926,7 @@ pub fn remove_extra_spaces(s: &mut Vec) { } } ``` -C: +### C: ```C // 翻转字符串中指定范围的字符 @@ -972,3 +974,4 @@ char * reverseWords(char * s){ + From 370a4d1c05b1204c652c00bcb90702947df11795 Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Wed, 19 Jul 2023 15:50:44 +0800 Subject: [PATCH 2057/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20=E5=89=91?= =?UTF-8?q?=E6=8C=87Offer58-II.=E5=B7=A6=E6=97=8B=E8=BD=AC=E5=AD=97?= =?UTF-8?q?=E7=AC=A6=E4=B8=B2=20=E6=8E=92=E7=89=88=E6=A0=BC=E5=BC=8F?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...54\345\255\227\347\254\246\344\270\262.md" | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git "a/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" "b/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" index 6cd8845609..008b7915c3 100644 --- "a/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" @@ -24,7 +24,7 @@ 限制: 1 <= k < s.length <= 10000 -# 思路 +## 思路 为了让本题更有意义,提升一下本题难度:**不能申请额外空间,只能在本串上操作**。 @@ -71,7 +71,7 @@ public: 是不是发现这代码也太简单了,哈哈。 -# 总结 +## 总结 此时我们已经反转好多次字符串了,来一起回顾一下吧。 @@ -86,7 +86,7 @@ public: 好了,反转字符串一共就介绍到这里,相信大家此时对反转字符串的常见操作已经很了解了。 -# 题外话 +## 题外话 一些同学热衷于使用substr,来做这道题。 其实使用substr 和 反转 时间复杂度是一样的 ,都是O(n),但是使用substr申请了额外空间,所以空间复杂度是O(n),而反转方法的空间复杂度是O(1)。 @@ -96,7 +96,8 @@ public: ## 其他语言版本 -Java: +### Java: + ```java class Solution { public String reverseLeftWords(String s, int n) { @@ -141,7 +142,7 @@ class Solution { } ``` -python: +### python: (版本一)使用切片 ```python @@ -211,7 +212,7 @@ class Solution: ``` -Go: +### Go: ```go func reverseLeftWords(s string, n int) string { @@ -234,8 +235,7 @@ func reverse(b []byte, left, right int){ } ``` - -JavaScript: +### JavaScript: ```javascript var reverseLeftWords = function(s, n) { @@ -279,7 +279,7 @@ var reverseLeftWords = function (s, n) { }; ``` -TypeScript: +### TypeScript: ```typescript function reverseLeftWords(s: string, n: number): string { @@ -311,7 +311,7 @@ function reverseLeftWords(s: string, n: number): string { }; ``` -Swift: +### Swift: ```swift func reverseLeftWords(_ s: String, _ n: Int) -> String { @@ -358,8 +358,7 @@ function reverse(&$s, $start, $end) { } ``` - -Scala: +### Scala: ```scala object Solution { @@ -388,7 +387,7 @@ object Solution { } ``` -Rust: +### Rust: ```Rust impl Solution { @@ -419,3 +418,4 @@ impl Solution { + From 5acebcc6f70f37d675f03356ecfc2f8f43b5949b Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Wed, 19 Jul 2023 16:00:41 +0800 Subject: [PATCH 2058/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200028.=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0strStr=20=E6=8E=92=E7=89=88=E6=A0=BC=E5=BC=8F=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0028.\345\256\236\347\216\260strStr.md" | 51 +++++++++---------- 1 file changed, 25 insertions(+), 26 deletions(-) diff --git "a/problems/0028.\345\256\236\347\216\260strStr.md" "b/problems/0028.\345\256\236\347\216\260strStr.md" index ac984d1a59..53b57fd534 100644 --- "a/problems/0028.\345\256\236\347\216\260strStr.md" +++ "b/problems/0028.\345\256\236\347\216\260strStr.md" @@ -28,7 +28,7 @@ 对于本题而言,当 needle 是空字符串时我们应当返回 0 。这与C语言的 strstr() 以及 Java的 indexOf() 定义相符。 -# 思路 +## 思路 本题是KMP 经典题目。 @@ -60,13 +60,13 @@ KMP的经典思想就是:**当出现字符串不匹配时,可以记录一部 读完本篇可以顺便把leetcode上28.实现strStr()题目做了。 -# 什么是KMP +### 什么是KMP 说到KMP,先说一下KMP这个名字是怎么来的,为什么叫做KMP呢。 因为是由这三位学者发明的:Knuth,Morris和Pratt,所以取了三位学者名字的首字母。所以叫做KMP -# KMP有什么用 +### KMP有什么用 KMP主要应用在字符串匹配上。 @@ -84,7 +84,7 @@ KMP的主要思想是**当出现字符串不匹配时,可以知道一部分之 下面Carl就带大家把KMP的精髓,next数组弄清楚。 -# 什么是前缀表 +### 什么是前缀表 写过KMP的同学,一定都写过next数组,那么这个next数组究竟是个啥呢? @@ -122,7 +122,7 @@ next数组就是一个前缀表(prefix table)。 那么什么是前缀表:**记录下标i之前(包括i)的字符串中,有多大长度的相同前缀后缀。** -# 最长公共前后缀? +### 最长公共前后缀 文章中字符串的**前缀是指不包含最后一个字符的所有以第一个字符开头的连续子串**。 @@ -144,7 +144,7 @@ next数组就是一个前缀表(prefix table)。 等等.....。 -# 为什么一定要用前缀表 +### 为什么一定要用前缀表 这就是前缀表,那为啥就能告诉我们 上次匹配的位置,并跳过去呢? @@ -163,7 +163,7 @@ next数组就是一个前缀表(prefix table)。 **很多介绍KMP的文章或者视频并没有把为什么要用前缀表?这个问题说清楚,而是直接默认使用前缀表。** -# 如何计算前缀表 +### 如何计算前缀表 接下来就要说一说怎么计算前缀表。 @@ -205,7 +205,7 @@ next数组就是一个前缀表(prefix table)。 最后就在文本串中找到了和模式串匹配的子串了。 -# 前缀表与next数组 +### 前缀表与next数组 很多KMP算法的时间都是使用next数组来做回退操作,那么next数组与前缀表有什么关系呢? @@ -217,7 +217,7 @@ next数组就可以是前缀表,但是很多实现都是把前缀表统一减 后面我会提供两种不同的实现代码,大家就明白了。 -# 使用next数组来匹配 +### 使用next数组来匹配 **以下我们以前缀表统一减一之后的next数组来做演示**。 @@ -229,7 +229,7 @@ next数组就可以是前缀表,但是很多实现都是把前缀表统一减 ![KMP精讲4](https://code-thinking.cdn.bcebos.com/gifs/KMP%E7%B2%BE%E8%AE%B24.gif) -# 时间复杂度分析 +### 时间复杂度分析 其中n为文本串长度,m为模式串长度,因为在匹配的过程中,根据前缀表不断调整匹配的位置,可以看出匹配的过程是O(n),之前还要单独生成next数组,时间复杂度是O(m)。所以整个KMP算法的时间复杂度是O(n+m)的。 @@ -239,7 +239,7 @@ next数组就可以是前缀表,但是很多实现都是把前缀表统一减 都知道使用KMP算法,一定要构造next数组。 -# 构造next数组 +### 构造next数组 我们定义一个函数getNext来构建next数组,函数参数为指向next数组的指针,和一个字符串。 代码如下: @@ -338,7 +338,7 @@ void getNext(int* next, const string& s){ 得到了next数组之后,就要用这个来做匹配了。 -# 使用next数组来做匹配 +### 使用next数组来做匹配 在文本串s里 找是否出现过模式串t。 @@ -403,7 +403,7 @@ for (int i = 0; i < s.size(); i++) { // 注意i就从0开始 此时所有逻辑的代码都已经写出来了,力扣 28.实现strStr 题目的整体代码如下: -# 前缀表统一减一 C++代码实现 +### 前缀表统一减一 C++代码实现 ```CPP class Solution { @@ -447,7 +447,7 @@ public: * 时间复杂度: O(n + m) * 空间复杂度: O(m), 只需要保存字符串needle的前缀表 -# 前缀表(不减一)C++实现 +### 前缀表(不减一)C++实现 那么前缀表就不减一了,也不右移的,到底行不行呢? @@ -546,7 +546,7 @@ public: * 空间复杂度: O(m) -# 总结 +## 总结 我们介绍了什么是KMP,KMP可以解决什么问题,然后分析KMP算法里的next数组,知道了next数组就是前缀表,再分析为什么要是前缀表而不是什么其他表。 @@ -563,8 +563,7 @@ public: ## 其他语言版本 - -Java: +### Java: ```Java class Solution { @@ -691,8 +690,9 @@ class Solution { } ``` -Python3: +### Python3: (版本一)前缀表(减一) + ```python class Solution: def getNext(self, next, s): @@ -781,9 +781,9 @@ class Solution: def strStr(self, haystack: str, needle: str) -> int: return haystack.find(needle) -``` +``` -Go: +### Go: ```go // 方法一:前缀表使用减1实现 @@ -871,7 +871,7 @@ func strStr(haystack string, needle string) int { } ``` -JavaScript版本 +### JavaScript: > 前缀表统一减一 @@ -959,7 +959,7 @@ var strStr = function (haystack, needle) { }; ``` -TypeScript版本: +### TypeScript: > 前缀表统一减一 @@ -1036,7 +1036,7 @@ function strStr(haystack: string, needle: string): number { } ``` -Swift 版本 +### Swift: > 前缀表统一减一 @@ -1196,7 +1196,7 @@ func strStr(_ haystack: String, _ needle: String) -> Int { ``` -PHP: +### PHP: > 前缀表统一减一 ```php @@ -1272,7 +1272,7 @@ function getNext(&$next, $s){ } ``` -Rust: +### Rust: > 前缀表统一不减一 ```Rust @@ -1362,4 +1362,3 @@ impl Solution { - From 202dd382d29eb34f311d5f35f001255b2b770402 Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Wed, 19 Jul 2023 16:06:12 +0800 Subject: [PATCH 2059/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200459.=E9=87=8D?= =?UTF-8?q?=E5=A4=8D=E7=9A=84=E5=AD=97=E7=AC=A6=E4=B8=B2=20=E6=8E=92?= =?UTF-8?q?=E7=89=88=E6=A0=BC=E5=BC=8F=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...20\345\255\227\347\254\246\344\270\262.md" | 35 +++++++++---------- 1 file changed, 16 insertions(+), 19 deletions(-) diff --git "a/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" "b/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" index e26d04ad87..f99102ab45 100644 --- "a/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" @@ -5,8 +5,6 @@

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

- - > KMP算法还能干这个 # 459.重复的子字符串 @@ -29,9 +27,11 @@ * 输出: True * 解释: 可由子字符串 "abc" 重复四次构成。 (或者子字符串 "abcabc" 重复两次构成。) -# 思路 +## 算法公开课 + +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[字符串这么玩,可有点难度! | LeetCode:459.重复的子字符串](https://www.bilibili.com/video/BV1cg41127fw),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 -针对本题,我录制了视频讲解:[字符串这么玩,可有点难度! | LeetCode:459.重复的子字符串](https://www.bilibili.com/video/BV1cg41127fw),结合本题解一起看,事半功倍! +## 思路 暴力的解法, 就是一个for循环获取 子串的终止位置, 然后判断子串是否能重复构成字符串,又嵌套一个for循环,所以是O(n^2)的时间复杂度。 @@ -44,7 +44,7 @@ 主要讲一讲移动匹配 和 KMP两种方法。 -## 移动匹配 +### 移动匹配 当一个字符串s:abcabc,内部由重复的子串组成,那么这个字符串的结构一定是这样的: @@ -80,9 +80,9 @@ public: 如果我们做过 [28.实现strStr](https://programmercarl.com/0028.实现strStr.html) 题目的话,其实就知道,**实现一个 高效的算法来判断 一个字符串中是否出现另一个字符串是很复杂的**,这里就涉及到了KMP算法。 -## KMP +### KMP -### 为什么会使用KMP +#### 为什么会使用KMP 以下使用KMP方式讲解,强烈建议大家先把以下两个视频看了,理解KMP算法,再来看下面讲解,否则会很懵。 * [视频讲解版:帮你把KMP算法学个通透!(理论篇)](https://www.bilibili.com/video/BV1PD4y1o7nd/) @@ -105,7 +105,7 @@ KMP算法中next数组为什么遇到字符不匹配的时候可以找到上一 ![图三](https://code-thinking-1253855093.file.myqcloud.com/pics/20220728205249.png) -### 如何找到最小重复子串 +#### 如何找到最小重复子串 这里有同学就问了,为啥一定是开头的ab呢。 其实最关键还是要理解 最长相等前后缀,如图: @@ -123,7 +123,7 @@ KMP算法中next数组为什么遇到字符不匹配的时候可以找到上一 正是因为 最长相等前后缀的规则,当一个字符串由重复子串组成的,最长相等前后缀不包含的子串就是最小重复子串。 -### 简单推理 +#### 简单推理 这里再给出一个数学推导,就容易理解很多。 @@ -229,7 +229,7 @@ public: ## 其他语言版本 -Java: +### Java: ```java class Solution { @@ -261,8 +261,7 @@ class Solution { } ``` - -Python: +### Python: (版本一) 前缀表 减一 ```python @@ -346,8 +345,7 @@ class Solution: return False ``` - -Go: +### Go: 这里使用了前缀表统一减一的实现方式 @@ -405,7 +403,7 @@ func repeatedSubstringPattern(s string) bool { } ``` -JavaScript版本 +### JavaScript: > 前缀表统一减一 @@ -479,7 +477,7 @@ var repeatedSubstringPattern = function (s) { }; ``` -TypeScript: +### TypeScript: > 前缀表统一减一 @@ -539,8 +537,7 @@ function repeatedSubstringPattern(s: string): boolean { }; ``` - -Swift: +### Swift: > 前缀表统一减一 ```swift @@ -623,7 +620,7 @@ Swift: } ``` -Rust: +### Rust: >前缀表统一不减一 ```Rust From 4fe1f08acd1a7fe4a6af2ea4920ca97a284ce0c4 Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Wed, 19 Jul 2023 16:09:03 +0800 Subject: [PATCH 2060/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20=E5=AD=97?= =?UTF-8?q?=E7=AC=A6=E4=B8=B2=E6=80=BB=E7=BB=93=20=E6=8E=92=E7=89=88?= =?UTF-8?q?=E6=A0=BC=E5=BC=8F=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\254\246\344\270\262\346\200\273\347\273\223.md" | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git "a/problems/\345\255\227\347\254\246\344\270\262\346\200\273\347\273\223.md" "b/problems/\345\255\227\347\254\246\344\270\262\346\200\273\347\273\223.md" index c12d1764ad..5c2f016471 100644 --- "a/problems/\345\255\227\347\254\246\344\270\262\346\200\273\347\273\223.md" +++ "b/problems/\345\255\227\347\254\246\344\270\262\346\200\273\347\273\223.md" @@ -11,7 +11,7 @@ 那么这次我们来做一个总结。 -# 什么是字符串 +## 什么是字符串 字符串是若干字符组成的有限序列,也可以理解为是一个字符数组,但是很多语言对字符串做了特殊的规定,接下来我来说一说C/C++中的字符串。 @@ -42,7 +42,7 @@ for (int i = 0; i < a.size(); i++) { 所以想处理字符串,我们还是会定义一个string类型。 -# 要不要使用库函数 +## 要不要使用库函数 在文章[344.反转字符串](https://programmercarl.com/0344.反转字符串.html)中强调了**打基础的时候,不要太迷恋于库函数。** @@ -52,7 +52,7 @@ for (int i = 0; i < a.size(); i++) { **如果库函数仅仅是 解题过程中的一小部分,并且你已经很清楚这个库函数的内部实现原理的话,可以考虑使用库函数。** -# 双指针法 +## 双指针法 在[344.反转字符串](https://programmercarl.com/0344.反转字符串.html) ,我们使用双指针法实现了反转字符串的操作,**双指针法在数组,链表和字符串中很常用。** @@ -67,7 +67,7 @@ for (int i = 0; i < a.size(); i++) { 一些同学会使用for循环里调用库函数erase来移除元素,这其实是O(n^2)的操作,因为erase就是O(n)的操作,所以这也是典型的不知道库函数的时间复杂度,上来就用的案例了。 -# 反转系列 +## 反转系列 在反转上还可以在加一些玩法,其实考察的是对代码的掌控能力。 @@ -87,7 +87,7 @@ for (int i = 0; i < a.size(); i++) { 在[字符串:反转个字符串还有这个用处?](https://programmercarl.com/剑指Offer58-II.左旋转字符串.html)中,我们通过**先局部反转再整体反转**达到了左旋的效果。 -# KMP +## KMP KMP的主要思想是**当出现字符串不匹配时,可以知道一部分之前已经匹配的文本内容,可以利用这些信息避免从头再去做匹配了。** @@ -110,7 +110,7 @@ KMP的精髓所在就是前缀表,在[KMP精讲](https://programmercarl.com/00 其中主要**理解j=next[x]这一步最为关键!** -# 总结 +## 总结 字符串类类型的题目,往往想法比较简单,但是实现起来并不容易,复杂的字符串题目非常考验对代码的掌控能力。 @@ -128,3 +128,4 @@ KMP算法是字符串查找最重要的算法,但彻底理解KMP并不容易 + From 1a2c911194a6eb2e9c35f7f179b76553bd48f45c Mon Sep 17 00:00:00 2001 From: Wang Ben Date: Wed, 19 Jul 2023 17:41:44 +0800 Subject: [PATCH 2061/3019] =?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=20Go=20=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...7\272\347\216\260\346\254\241\346\225\260.md" | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git "a/problems/1207.\347\213\254\344\270\200\346\227\240\344\272\214\347\232\204\345\207\272\347\216\260\346\254\241\346\225\260.md" "b/problems/1207.\347\213\254\344\270\200\346\227\240\344\272\214\347\232\204\345\207\272\347\216\260\346\254\241\346\225\260.md" index 1a7a001989..d7423b2b7d 100644 --- "a/problems/1207.\347\213\254\344\270\200\346\227\240\344\272\214\347\232\204\345\207\272\347\216\260\346\254\241\346\225\260.md" +++ "b/problems/1207.\347\213\254\344\270\200\346\227\240\344\272\214\347\232\204\345\207\272\347\216\260\346\254\241\346\225\260.md" @@ -135,6 +135,22 @@ class Solution: Go: +```Go +func uniqueOccurrences(arr []int) bool { + count := make(map[int]int) // 统计数字出现的频率 + for _, v := range arr { + count[v] += 1 + } + fre := make(map[int]struct{}) // 看相同频率是否重复出现 + for _, v := range count { + if _, ok := fre[v]; ok { + return false + } + fre[v] = struct{}{} + } + return true +} +``` JavaScript: ``` javascript From c3ebc91d4db0fc5b86945b910babd8c4ad2328b2 Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Thu, 20 Jul 2023 14:27:16 +0800 Subject: [PATCH 2062/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20=E5=8F=8C?= =?UTF-8?q?=E6=8C=87=E9=92=88=E6=80=BB=E7=BB=93=20=E6=8E=92=E7=89=88?= =?UTF-8?q?=E6=A0=BC=E5=BC=8F=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...46\214\207\351\222\210\346\200\273\347\273\223.md" | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git "a/problems/\345\217\214\346\214\207\351\222\210\346\200\273\347\273\223.md" "b/problems/\345\217\214\346\214\207\351\222\210\346\200\273\347\273\223.md" index 04a8cb9af8..6621e0396b 100644 --- "a/problems/\345\217\214\346\214\207\351\222\210\346\200\273\347\273\223.md" +++ "b/problems/\345\217\214\346\214\207\351\222\210\346\200\273\347\273\223.md" @@ -8,7 +8,8 @@ 相信大家已经对双指针法很熟悉了,但是双指针法并不隶属于某一种数据结构,我们在讲解数组,链表,字符串都用到了双指针法,所有有必要针对双指针法做一个总结。 -# 数组篇 +# 双指针总结篇 +## 数组篇 在[数组:就移除个元素很难么?](https://programmercarl.com/0027.移除元素.html)中,原地移除数组上的元素,我们说到了数组上的元素,不能真正的删除,只能覆盖。 @@ -26,7 +27,7 @@ for (int i = 0; i < array.size(); i++) { 所以此时使用双指针法才展现出效率的优势:**通过两个指针在一个for循环下完成两个for循环的工作。** -# 字符串篇 +## 字符串篇 在[字符串:这道题目,使用库函数一行代码搞定](https://programmercarl.com/0344.反转字符串.html)中讲解了反转字符串,注意这里强调要原地反转,要不然就失去了题目的意义。 @@ -48,7 +49,7 @@ for (int i = 0; i < array.size(); i++) { **主要还是大家用erase用的比较随意,一定要注意for循环下用erase的情况,一般可以用双指针写效率更高!** -# 链表篇 +## 链表篇 翻转链表是现场面试,白纸写代码的好题,考察了候选者对链表以及指针的熟悉程度,而且代码也不长,适合在白纸上写。 @@ -62,7 +63,7 @@ for (int i = 0; i < array.size(); i++) { 那么找到环的入口,其实需要点简单的数学推理,我在文章中把找环的入口清清楚楚的推理的一遍,如果对找环入口不够清楚的同学建议自己看一看[链表:环找到了,那入口呢?](https://programmercarl.com/0142.环形链表II.html)。 -# N数之和篇 +## N数之和篇 在[哈希表:解决了两数之和,那么能解决三数之和么?](https://programmercarl.com/0015.三数之和.html)中,讲到使用哈希法可以解决1.两数之和的问题 @@ -87,7 +88,7 @@ for (int i = 0; i < array.size(); i++) { 同样的道理,五数之和,n数之和都是在这个基础上累加。 -# 总结 +## 总结 本文中一共介绍了leetcode上九道使用双指针解决问题的经典题目,除了链表一些题目一定要使用双指针,其他题目都是使用双指针来提高效率,一般是将O(n^2)的时间复杂度,降为$O(n)$。 From de770c60e5ae781a9e65071e03ba4876237ed6fb Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Thu, 20 Jul 2023 14:36:04 +0800 Subject: [PATCH 2063/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20=E6=A0=88?= =?UTF-8?q?=E4=B8=8E=E9=98=9F=E5=88=97=E7=90=86=E8=AE=BA=E5=9F=BA=E7=A1=80?= =?UTF-8?q?=20=E6=8E=92=E7=89=88=E6=A0=BC=E5=BC=8F=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...10\227\347\220\206\350\256\272\345\237\272\347\241\200.md" | 4 ++++ 1 file changed, 4 insertions(+) diff --git "a/problems/\346\240\210\344\270\216\351\230\237\345\210\227\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\346\240\210\344\270\216\351\230\237\345\210\227\347\220\206\350\256\272\345\237\272\347\241\200.md" index 0075deb6c2..ad748e489e 100644 --- "a/problems/\346\240\210\344\270\216\351\230\237\345\210\227\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\346\240\210\344\270\216\351\230\237\345\210\227\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -4,8 +4,11 @@

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+ > 来看看栈和队列不为人知的一面 +# 栈与队列理论基础 + 我想栈和队列的原理大家应该很熟悉了,队列是先进先出,栈是先进后出。 如图所示: @@ -93,3 +96,4 @@ std::queue> third; // 定义以list为底层容器的队列 + From 4b5e198b170bade71d565d8ba3f7e29543f3bbef Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Thu, 20 Jul 2023 14:40:33 +0800 Subject: [PATCH 2064/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200232.=E7=94=A8?= =?UTF-8?q?=E6=A0=88=E5=AE=9E=E7=8E=B0=E9=98=9F=E5=88=97=20=E6=8E=92?= =?UTF-8?q?=E7=89=88=E6=A0=BC=E5=BC=8F=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...36\347\216\260\351\230\237\345\210\227.md" | 31 ++++++++++--------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git "a/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" "b/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" index 4a57ee966b..c510fc12a6 100644 --- "a/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" +++ "b/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" @@ -36,10 +36,11 @@ queue.empty(); // 返回 false * 你所使用的语言也许不支持栈。你可以使用 list 或者 deque(双端队列)来模拟一个栈,只要是标准的栈操作即可。 * 假设所有操作都是有效的 (例如,一个空的队列不会调用 pop 或者 peek 操作)。 -## 思路 +## 算法公开课 -《代码随想录》算法公开课:[栈的基本操作! | LeetCode:232.用栈实现队列](https://www.bilibili.com/video/BV1nY4y1w7VC),相信结合视频再看本篇题解,更有助于大家对栈和队列的理解。 +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[栈的基本操作! | LeetCode:232.用栈实现队列](https://www.bilibili.com/video/BV1nY4y1w7VC),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 +## 思路 这是一道模拟题,不涉及到具体算法,考察的就是对栈和队列的掌握程度。 @@ -132,7 +133,7 @@ public: ## 其他语言版本 -Java: +### Java: ```java class MyQueue { @@ -179,8 +180,8 @@ class MyQueue { ``` +### Python: -Python: ```python class MyQueue: @@ -231,8 +232,8 @@ class MyQueue: ``` +### Go: -Go: ```Go type MyQueue struct { stackIn []int //输入栈 @@ -283,7 +284,7 @@ func (this *MyQueue) Empty() bool { } ``` - javaScript: +### JavaScript: ```js // 使用两个数组的栈方法(push, pop) 实现队列 @@ -338,7 +339,7 @@ MyQueue.prototype.empty = function() { }; ``` -TypeScript: +### TypeScript: ```typescript class MyQueue { @@ -374,7 +375,7 @@ class MyQueue { } ``` -Swift: +### Swift: ```swift class MyQueue { @@ -413,7 +414,8 @@ class MyQueue { } ``` -C: +### C: + ```C /* 1.两个type为int的数组(栈),大小为100 @@ -490,8 +492,8 @@ void myQueueFree(MyQueue* obj) { } ``` +### C#: -C#: ```csharp public class MyQueue { Stack inStack; @@ -534,7 +536,8 @@ public class MyQueue { -PHP: +### PHP: + ```php // SplStack 类通过使用一个双向链表来提供栈的主要功能。[PHP 5 >= 5.3.0, PHP 7, PHP 8] // https://www.php.net/manual/zh/class.splstack.php @@ -579,7 +582,8 @@ class MyQueue { } ``` -Scala: +### Scala: + ```scala class MyQueue() { import scala.collection.mutable @@ -621,7 +625,7 @@ class MyQueue() { } ``` -rust: +### Rust: ```rust struct MyQueue { @@ -666,4 +670,3 @@ impl MyQueue { - From c18dbf059544b7bd100ff101cc92a2ee241434e5 Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Thu, 20 Jul 2023 14:45:24 +0800 Subject: [PATCH 2065/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200225.=E7=94=A8?= =?UTF-8?q?=E9=98=9F=E5=88=97=E5=AE=9E=E7=8E=B0=E6=A0=88=20=E6=8E=92?= =?UTF-8?q?=E7=89=88=E6=A0=BC=E5=BC=8F=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...27\345\256\236\347\216\260\346\240\210.md" | 37 ++++++++++--------- 1 file changed, 19 insertions(+), 18 deletions(-) diff --git "a/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" "b/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" index 94c7940486..13b742f839 100644 --- "a/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" +++ "b/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" @@ -25,11 +25,11 @@ * 你所使用的语言也许不支持队列。 你可以使用 list 或者 deque(双端队列)来模拟一个队列 , 只要是标准的队列操作即可。 * 你可以假设所有操作都是有效的(例如, 对一个空的栈不会调用 pop 或者 top 操作)。 +## 算法公开课 -# 思路 +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[队列的基本操作! | LeetCode:225. 用队列实现栈](https://www.bilibili.com/video/BV1Fd4y1K7sm),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 - -《代码随想录》算法公开课:[队列的基本操作! | LeetCode:225. 用队列实现栈](https://www.bilibili.com/video/BV1Fd4y1K7sm),相信结合视频再看本篇题解,更有助于大家对链表的理解。 +## 思路 (这里要强调是单向队列) @@ -114,7 +114,7 @@ public: * 时间复杂度: push为O(n),其他为O(1) * 空间复杂度: O(n) -# 优化 +## 优化 其实这道题目就是用一个队列就够了。 @@ -162,9 +162,9 @@ public: * 空间复杂度: O(n) -# 其他语言版本 +## 其他语言版本 -Java: +### Java: 使用两个 Queue 实现方法1 ```java @@ -404,7 +404,7 @@ class MyStack { } ``` -Python: +### Python: ```python from collections import deque @@ -496,8 +496,7 @@ class MyStack: return not self.que ``` - -Go: +### Go: 使用两个队列实现 ```go @@ -628,9 +627,7 @@ func (this *MyStack) Empty() bool { */ ``` - - -javaScript: +### JavaScript: 使用数组(push, shift)模拟队列 @@ -740,7 +737,7 @@ MyStack.prototype.empty = function() { ``` -TypeScript: +### TypeScript: 版本一:使用两个队列模拟栈 @@ -812,7 +809,7 @@ class MyStack { } ``` -Swift +### Swift: ```Swift // 定义一个队列数据结构 @@ -931,8 +928,9 @@ class MyStack { } } ``` -Scala: +### Scala: 使用两个队列模拟栈: + ```scala import scala.collection.mutable @@ -1015,8 +1013,8 @@ class MyStack() { } ``` +### C#: -C#: ```csharp public class MyStack { Queue queue1; @@ -1051,8 +1049,9 @@ public class MyStack { } ``` -PHP -> 双对列 +### PHP: + +> 双队列 ```php // SplQueue 类通过使用一个双向链表来提供队列的主要功能。(PHP 5 >= 5.3.0, PHP 7, PHP 8) // https://www.php.net/manual/zh/class.splqueue.php @@ -1130,6 +1129,8 @@ class MyStack { } ``` +### Rust: + > rust:单队列 ```rust From a1ef2d03f64f6884fade8bfe5d2ed9dbceb129d8 Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Thu, 20 Jul 2023 14:49:03 +0800 Subject: [PATCH 2066/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20020.=E6=9C=89?= =?UTF-8?q?=E6=95=88=E7=9A=84=E6=8B=AC=E5=8F=B7=20=E6=8E=92=E7=89=88?= =?UTF-8?q?=E6=A0=BC=E5=BC=8F=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...10\347\232\204\346\213\254\345\217\267.md" | 39 +++++++++++-------- 1 file changed, 23 insertions(+), 16 deletions(-) diff --git "a/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" "b/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" index 213d61b795..045c79ee7f 100644 --- "a/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" +++ "b/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" @@ -39,12 +39,13 @@ * 输入: "{[]}" * 输出: true -# 思路 +## 算法公开课 -《代码随想录》算法视频公开课:[栈的拿手好戏!| LeetCode:20. 有效的括号](https://www.bilibili.com/video/BV1AF411w78g),相信结合视频在看本篇题解,更有助于大家对链表的理解。 +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[栈的拿手好戏!| LeetCode:20. 有效的括号](https://www.bilibili.com/video/BV1AF411w78g),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 +## 思路 -## 题外话 +### 题外话 **括号匹配是使用栈解决的经典问题。** @@ -68,7 +69,7 @@ cd a/b/c/../../ 这里我就不过多展开了,先来看题。 -## 进入正题 +### 进入正题 由于栈结构的特殊性,非常适合做对称匹配类的题目。 @@ -143,8 +144,8 @@ public: ## 其他语言版本 +### Java: -Java: ```Java class Solution { public boolean isValid(String s) { @@ -171,7 +172,8 @@ class Solution { } ``` -Python: +### Python: + ```python # 方法一,仅使用栈,更省空间 class Solution: @@ -213,7 +215,8 @@ class Solution: return True if not stack else False ``` -Go: +### Go: + ```Go func isValid(s string) bool { hash := map[byte]byte{')':'(', ']':'[', '}':'{'} @@ -235,7 +238,8 @@ func isValid(s string) bool { } ``` -Ruby: +### Ruby: + ```ruby def is_valid(strs) symbol_map = {')' => '(', '}' => '{', ']' => '['} @@ -253,7 +257,8 @@ def is_valid(strs) end ``` -Javascript: +### Javascript: + ```javascript var isValid = function (s) { const stack = []; @@ -296,7 +301,7 @@ var isValid = function(s) { }; ``` -TypeScript: +### TypeScript: 版本一:普通版 @@ -348,7 +353,7 @@ function isValid(s: string): boolean { }; ``` -Swift +### Swift: ```swift func isValid(_ s: String) -> Bool { @@ -373,7 +378,8 @@ func isValid(_ s: String) -> Bool { } ``` -C: +### C: + ```C //辅助函数:判断栈顶元素与输入的括号是否为一对。若不是,则返回False int notMatch(char par, char* stack, int stackTop) { @@ -414,8 +420,8 @@ bool isValid(char * s){ } ``` +### C#: -C#: ```csharp public class Solution { public bool IsValid(string s) { @@ -447,7 +453,8 @@ public class Solution { } ``` -PHP: +### PHP: + ```php // https://www.php.net/manual/zh/class.splstack.php class Solution @@ -475,8 +482,8 @@ class Solution } ``` +### Scala: -Scala: ```scala object Solution { import scala.collection.mutable @@ -499,7 +506,7 @@ object Solution { } ``` -rust: +### Rust: ```rust impl Solution { From 70888c2b6074fa28f291108b4225735f6c24126f Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Thu, 20 Jul 2023 14:53:33 +0800 Subject: [PATCH 2067/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=201047.=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E5=AD=97=E7=AC=A6=E4=B8=B2=E4=B8=AD=E7=9A=84=E6=89=80?= =?UTF-8?q?=E6=9C=89=E7=9B=B8=E9=82=BB=E9=87=8D=E5=A4=8D=E9=A1=B9=20?= =?UTF-8?q?=E6=8E=92=E7=89=88=E6=A0=BC=E5=BC=8F=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...73\351\207\215\345\244\215\351\241\271.md" | 37 ++++++++++--------- 1 file changed, 19 insertions(+), 18 deletions(-) diff --git "a/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" "b/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" index 486d198b4d..ad54f0f88e 100644 --- "a/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" +++ "b/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" @@ -5,8 +5,6 @@

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

- - > 匹配问题都是栈的强项 # 1047. 删除字符串中的所有相邻重复项 @@ -30,11 +28,13 @@ * 1 <= S.length <= 20000 * S 仅由小写英文字母组成。 -# 思路 +## 算法公开课 + +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[栈的好戏还要继续!| LeetCode:1047. 删除字符串中的所有相邻重复项](https://www.bilibili.com/video/BV12a411P7mw),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 -《代码随想录》算法视频公开课:[栈的好戏还要继续!| LeetCode:1047. 删除字符串中的所有相邻重复项](https://www.bilibili.com/video/BV12a411P7mw),相信结合视频在看本篇题解,更有助于大家对本题的理解。 +## 思路 -## 正题 +### 正题 本题要删除相邻相同元素,相对于[20. 有效的括号](https://programmercarl.com/0020.%E6%9C%89%E6%95%88%E7%9A%84%E6%8B%AC%E5%8F%B7.html)来说其实也是匹配问题,20. 有效的括号 是匹配左右括号,本题是匹配相邻元素,最后都是做消除的操作。 @@ -105,7 +105,7 @@ public: * 时间复杂度: O(n) * 空间复杂度: O(1),返回值不计空间复杂度 -## 题外话 +### 题外话 这道题目就像是我们玩过的游戏对对碰,如果相同的元素挨在一起就要消除。 @@ -125,8 +125,7 @@ public: ## 其他语言版本 - -Java: +### Java: 使用 Deque 作为堆栈 ```Java @@ -203,7 +202,8 @@ class Solution { } ``` -Python: +### Python: + ```python # 方法一,使用栈 class Solution: @@ -239,7 +239,7 @@ class Solution: return ''.join(res[0: slow]) ``` -Go: +### Go: ```go func removeDuplicates(s string) string { @@ -258,7 +258,7 @@ func removeDuplicates(s string) string { } ``` -javaScript: +### JavaScript: 法一:使用栈 @@ -295,7 +295,7 @@ var removeDuplicates = function(s) { }; ``` -TypeScript: +### TypeScript: ```typescript function removeDuplicates(s: string): string { @@ -318,7 +318,7 @@ function removeDuplicates(s: string): string { }; ``` -C: +### C: 方法一:使用栈 ```c @@ -371,7 +371,8 @@ char * removeDuplicates(char * s){ } ``` -Swift: +### Swift: + ```swift func removeDuplicates(_ s: String) -> String { var stack = [Character]() @@ -386,8 +387,8 @@ func removeDuplicates(_ s: String) -> String { } ``` +### C#: -C#: ```csharp public string RemoveDuplicates(string s) { //拿字符串直接作为栈,省去了栈还要转为字符串的操作 @@ -405,8 +406,8 @@ public string RemoveDuplicates(string s) { } ``` +### PHP: -PHP: ```php class Solution { function removeDuplicates($s) { @@ -431,8 +432,8 @@ class Solution { } ``` +### Scala: -Scala: ```scala object Solution { import scala.collection.mutable @@ -455,7 +456,7 @@ object Solution { } ``` -rust: +### Rust: ```rust impl Solution { From 7f4d74049ebc0d42930d5afe51b4c766295b0366 Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Thu, 20 Jul 2023 14:57:59 +0800 Subject: [PATCH 2068/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200150.=E9=80=86?= =?UTF-8?q?=E6=B3=A2=E5=85=B0=E8=A1=A8=E8=BE=BE=E5=BC=8F=E6=B1=82=E5=80=BC?= =?UTF-8?q?=20=E6=8E=92=E7=89=88=E6=A0=BC=E5=BC=8F=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...76\345\274\217\346\261\202\345\200\274.md" | 38 ++++++++++--------- 1 file changed, 21 insertions(+), 17 deletions(-) diff --git "a/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" "b/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" index 09cc4f96e3..663a68ea5c 100644 --- "a/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" +++ "b/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" @@ -5,8 +5,6 @@

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

- - > 这不仅仅是一道好题,也展现出计算机的思考方式 # 150. 逆波兰表达式求值 @@ -63,9 +61,13 @@ * 适合用栈操作运算:遇到数字则入栈;遇到运算符则取出栈顶两个数字进行计算,并将结果压入栈中。 -# 思路 +## 算法公开课 + +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[栈的最后表演! | LeetCode:150. 逆波兰表达式求值](https://www.bilibili.com/video/BV1kd4y1o7on),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 -《代码随想录》算法视频公开课:[栈的最后表演! | LeetCode:150. 逆波兰表达式求值](https://www.bilibili.com/video/BV1kd4y1o7on),相信结合视频再看本篇题解,更有助于大家对本题的理解。 +## 思路 + +### 正题 在上一篇文章中[1047.删除字符串中的所有相邻重复项](https://programmercarl.com/1047.删除字符串中的所有相邻重复项.html)提到了 递归就是用栈来实现的。 @@ -117,7 +119,7 @@ public: * 空间复杂度: O(n) -## 题外话 +### 题外话 我们习惯看到的表达式都是中缀表达式,因为符合我们的习惯,但是中缀表达式对于计算机来说就不是很友好了。 @@ -134,11 +136,9 @@ public: > During the 1970s and 1980s, Hewlett-Packard used RPN in all of their desktop and hand-held calculators, and continued to use it in some models into the 2020s. - - ## 其他语言版本 -java: +### Java: ```Java class Solution { @@ -164,7 +164,7 @@ class Solution { } ``` -python3 +### Python3: ```python from operator import add, sub, mul @@ -201,7 +201,8 @@ class Solution: ``` -Go: +### Go: + ```Go func evalRPN(tokens []string) int { stack := []int{} @@ -228,7 +229,7 @@ func evalRPN(tokens []string) int { } ``` -javaScript: +### JavaScript: ```js var evalRPN = function (tokens) { @@ -259,7 +260,7 @@ var evalRPN = function (tokens) { }; ``` -TypeScript: +### TypeScript: 普通版: @@ -324,7 +325,8 @@ function evalRPN(tokens: string[]): number { }; ``` -Swift: +### Swift: + ```Swift func evalRPN(_ tokens: [String]) -> Int { var stack = [Int]() @@ -357,7 +359,8 @@ func evalRPN(_ tokens: [String]) -> Int { } ``` -C#: +### C#: + ```csharp public int EvalRPN(string[] tokens) { int num; @@ -391,8 +394,8 @@ public int EvalRPN(string[] tokens) { } ``` +### PHP: -PHP: ```php class Solution { function evalRPN($tokens) { @@ -417,7 +420,8 @@ class Solution { } ``` -Scala: +### Scala: + ```scala object Solution { import scala.collection.mutable @@ -447,7 +451,7 @@ object Solution { } ``` -rust: +### Rust: ```rust impl Solution { From 5a6bf6d85534e304e73460d67db006f5c1475657 Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Thu, 20 Jul 2023 15:01:53 +0800 Subject: [PATCH 2069/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200239.=E6=BB=91?= =?UTF-8?q?=E5=8A=A8=E7=AA=97=E5=8F=A3=E6=9C=80=E5=A4=A7=E5=80=BC=20?= =?UTF-8?q?=E6=8E=92=E7=89=88=E6=A0=BC=E5=BC=8F=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...43\346\234\200\345\244\247\345\200\274.md" | 37 +++++++++++-------- 1 file changed, 21 insertions(+), 16 deletions(-) diff --git "a/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" "b/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" index f1c4b76ccf..6f420479eb 100644 --- "a/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" +++ "b/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" @@ -28,11 +28,11 @@ * -10^4 <= nums[i] <= 10^4 * 1 <= k <= nums.length +## 算法公开课 +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[单调队列正式登场!| LeetCode:239. 滑动窗口最大值](https://www.bilibili.com/video/BV1XS4y1p7qj),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 -# 思路 - -《代码随想录》算法视频公开课:[单调队列正式登场!| LeetCode:239. 滑动窗口最大值](https://www.bilibili.com/video/BV1XS4y1p7qj),相信结合视频在看本篇题解,更有助于大家对本题的理解。 +## 思路 这是使用单调队列的经典题目。 @@ -196,7 +196,7 @@ public: 空间复杂度因为我们定义一个辅助队列,所以是O(k)。 -# 扩展 +## 扩展 大家貌似对单调队列 都有一些疑惑,首先要明确的是,题解中单调队列里的pop和push接口,仅适用于本题哈。单调队列不是一成不变的,而是不同场景不同写法,总之要保证队列里单调递减或递增的原则,所以叫做单调队列。 不要以为本题中的单调队列实现就是固定的写法哈。 @@ -204,10 +204,10 @@ public: -# 其他语言版本 +## 其他语言版本 +### Java: -Java: ```Java //解法一 //自定义数组 @@ -298,7 +298,8 @@ class Solution { } ``` -Python: +### Python: + ```python from collections import deque @@ -338,8 +339,7 @@ class Solution: return result ``` - -Go: +### Go: ```go // 封装单调队列的方式解题 @@ -401,7 +401,8 @@ func maxSlidingWindow(nums []int, k int) []int { } ``` -Javascript: +### Javascript: + ```javascript /** * @param {number[]} nums @@ -449,7 +450,7 @@ var maxSlidingWindow = function (nums, k) { }; ``` -TypeScript: +### TypeScript: ```typescript function maxSlidingWindow(nums: number[], k: number): number[] { @@ -497,7 +498,9 @@ function maxSlidingWindow(nums: number[], k: number): number[] { }; ``` -Swift: +### Swift: + +解法一: ```Swift /// 双向链表 @@ -638,7 +641,8 @@ func maxSlidingWindow(_ nums: [Int], _ k: Int) -> [Int] { return result } ``` -Scala: +### Scala: + ```scala import scala.collection.mutable.ArrayBuffer object Solution { @@ -686,8 +690,8 @@ class MyQueue { } ``` +### PHP: -PHP: ```php class Solution { /** @@ -764,7 +768,8 @@ class MyQueue{ } ``` -C#: +### C#: + ```csharp class myDequeue{ private LinkedList linkedList = new LinkedList(); @@ -805,7 +810,7 @@ class myDequeue{ } ``` -rust: +### Rust: ```rust impl Solution { From 0e4f91d81d68b53269f33aa994ecab626202243b Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Thu, 20 Jul 2023 15:13:29 +0800 Subject: [PATCH 2070/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200347.=E5=89=8Dk?= =?UTF-8?q?=E4=B8=AA=E9=AB=98=E9=A2=91=E5=85=83=E7=B4=A0=20=E6=8E=92?= =?UTF-8?q?=E7=89=88=E6=A0=BC=E5=BC=8F=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...30\351\242\221\345\205\203\347\264\240.md" | 33 +++++++++++-------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git "a/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" "b/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" index 6c8b51b1ad..b3063111b4 100644 --- "a/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" +++ "b/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" @@ -5,8 +5,6 @@

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

- - > 前K个大数问题,老生常谈,不得不谈 # 347.前 K 个高频元素 @@ -29,9 +27,11 @@ * 题目数据保证答案唯一,换句话说,数组中前 k 个高频元素的集合是唯一的。 * 你可以按任意顺序返回答案。 -# 思路 +## 算法公开课 -《代码随想录》算法视频公开课:[优先级队列正式登场!大顶堆、小顶堆该怎么用?| LeetCode:347.前 K 个高频元素](https://www.bilibili.com/video/BV1Xg41167Lz),相信结合视频在看本篇题解,更有助于大家对本题的理解。 +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[优先级队列正式登场!大顶堆、小顶堆该怎么用?| LeetCode:347.前 K 个高频元素](https://www.bilibili.com/video/BV1Xg41167Lz),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 + +## 思路 这道题目主要涉及到如下三块内容: 1. 要统计元素出现频率 @@ -122,7 +122,7 @@ public: * 时间复杂度: O(nlogk) * 空间复杂度: O(n) -# 拓展 +## 拓展 大家对这个比较运算在建堆时是如何应用的,为什么左大于右就会建立小顶堆,反而建立大顶堆比较困惑。 确实 例如我们在写快排的cmp函数的时候,`return left>right` 就是从大到小,`return left + From f7b87e625a9fab65b30d19b5252aef26c869fbdb Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Thu, 20 Jul 2023 15:15:50 +0800 Subject: [PATCH 2071/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20=E6=A0=88?= =?UTF-8?q?=E4=B8=8E=E9=98=9F=E5=88=97=E6=80=BB=E7=BB=93=20=E6=8E=92?= =?UTF-8?q?=E7=89=88=E6=A0=BC=E5=BC=8F=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...37\345\210\227\346\200\273\347\273\223.md" | 23 ++++++++++--------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git "a/problems/\346\240\210\344\270\216\351\230\237\345\210\227\346\200\273\347\273\223.md" "b/problems/\346\240\210\344\270\216\351\230\237\345\210\227\346\200\273\347\273\223.md" index c313220165..31ce955489 100644 --- "a/problems/\346\240\210\344\270\216\351\230\237\345\210\227\346\200\273\347\273\223.md" +++ "b/problems/\346\240\210\344\270\216\351\230\237\345\210\227\346\200\273\347\273\223.md" @@ -3,9 +3,9 @@

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+# 栈与队列总结篇 - -# 栈与队列的理论基础 +## 栈与队列的理论基础 首先我们在[栈与队列:来看看栈和队列不为人知的一面](https://programmercarl.com/栈与队列理论基础.html)中讲解了栈和队列的理论基础。 @@ -37,9 +37,9 @@ **一个队列在模拟栈弹出元素的时候只要将队列头部的元素(除了最后一个元素外) 重新添加到队列尾部,此时在去弹出元素就是栈的顺序了。** -# 栈经典题目 +## 栈经典题目 -## 栈在系统中的应用 +### 栈在系统中的应用 如果还记得编译原理的话,编译器在 词法分析的过程中处理括号、花括号等这个符号的逻辑,就是使用了栈这种数据结构。 @@ -59,7 +59,7 @@ cd a/b/c/../../ **所以数据结构与算法的应用往往隐藏在我们看不到的地方!** -## 括号匹配问题 +### 括号匹配问题 在[栈与队列:系统中处处都是栈的应用](https://programmercarl.com/0020.有效的括号.html)中我们讲解了括号匹配问题。 @@ -75,23 +75,23 @@ cd a/b/c/../../ 这里还有一些技巧,在匹配左括号的时候,右括号先入栈,就只需要比较当前元素和栈顶相不相等就可以了,比左括号先入栈代码实现要简单的多了! -## 字符串去重问题 +### 字符串去重问题 在[栈与队列:匹配问题都是栈的强项](https://programmercarl.com/1047.删除字符串中的所有相邻重复项.html)中讲解了字符串去重问题。 1047. 删除字符串中的所有相邻重复项 思路就是可以把字符串顺序放到一个栈中,然后如果相同的话 栈就弹出,这样最后栈里剩下的元素都是相邻不相同的元素了。 -## 逆波兰表达式问题 +### 逆波兰表达式问题 在[栈与队列:有没有想过计算机是如何处理表达式的?](https://programmercarl.com/0150.逆波兰表达式求值.html)中讲解了求逆波兰表达式。 本题中每一个子表达式要得出一个结果,然后拿这个结果再进行运算,那么**这岂不就是一个相邻字符串消除的过程,和[栈与队列:匹配问题都是栈的强项](https://programmercarl.com/1047.删除字符串中的所有相邻重复项.html)中的对对碰游戏是不是就非常像了。** -# 队列的经典题目 +## 队列的经典题目 -## 滑动窗口最大值问题 +### 滑动窗口最大值问题 在[栈与队列:滑动窗口里求最大值引出一个重要数据结构](https://programmercarl.com/0239.滑动窗口最大值.html)中讲解了一种数据结构:单调队列。 @@ -119,7 +119,7 @@ cd a/b/c/../../ 我们用deque作为单调队列的底层数据结构,C++中deque是stack和queue默认的底层实现容器(这个我们之前已经讲过),deque是可以两边扩展的,而且deque里元素并不是严格的连续分布的。 -## 求前 K 个高频元素 +### 求前 K 个高频元素 在[栈与队列:求前 K 个高频元素和队列有啥关系?](https://programmercarl.com/0347.前K个高频元素.html)中讲解了求前 K 个高频元素。 @@ -143,7 +143,7 @@ cd a/b/c/../../ 所以排序的过程的时间复杂度是$O(\log k)$,整个算法的时间复杂度是$O(n\log k)$。 -# 总结 +## 总结 在栈与队列系列中,我们强调栈与队列的基础,也是很多同学容易忽视的点。 @@ -162,3 +162,4 @@ cd a/b/c/../../ + From c6bcd423d6bdab6375e3af8bc7c3c01bfc0518a1 Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Thu, 20 Jul 2023 15:48:05 +0800 Subject: [PATCH 2072/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20=E4=BA=8C?= =?UTF-8?q?=E5=8F=89=E6=A0=91=E7=90=86=E8=AE=BA=E5=9F=BA=E7=A1=80=20?= =?UTF-8?q?=E6=8E=92=E7=89=88=E6=A0=BC=E5=BC=8F=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...06\350\256\272\345\237\272\347\241\200.md" | 23 ++++++++++--------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" index 4098cf1f74..184dba604c 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -8,8 +8,11 @@ # 二叉树理论基础篇 +## 算法公开课 -《代码随想录》算法视频公开课:[关于二叉树,你该了解这些!](https://www.bilibili.com/video/BV1Hy4y1t7ij),相信结合视频在看本篇题解,更有助于大家对本题的理解。 +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[关于二叉树,你该了解这些!](https://www.bilibili.com/video/BV1Hy4y1t7ij),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 + +## 题目分类 题目分类大纲如下: @@ -189,8 +192,7 @@ struct TreeNode { ## 其他语言版本 - -Java: +### Java: ```java public class TreeNode { @@ -208,8 +210,7 @@ public class TreeNode { } ``` - -Python: +### Python: ```python class TreeNode: @@ -219,7 +220,7 @@ class TreeNode: self.right = right ``` -Go: +### Go: ```go type TreeNode struct { @@ -229,7 +230,7 @@ type TreeNode struct { } ``` -JavaScript: +### JavaScript: ```javascript function TreeNode(val, left, right) { @@ -239,7 +240,7 @@ function TreeNode(val, left, right) { } ``` -TypeScript: +### TypeScript: ```typescript class TreeNode { @@ -254,7 +255,7 @@ class TreeNode { } ``` -Swift: +### Swift: ```Swift class TreeNode { @@ -271,7 +272,7 @@ class TreeNode { } ``` -Scala: +### Scala: ```scala class TreeNode(_value: Int = 0, _left: TreeNode = null, _right: TreeNode = null) { @@ -281,7 +282,7 @@ class TreeNode(_value: Int = 0, _left: TreeNode = null, _right: TreeNode = null) } ``` -rust: +### Rust: ```rust #[derive(Debug, PartialEq, Eq)] From 7807b5e7989751cd9e5d2df8da6821438e01c378 Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Thu, 20 Jul 2023 15:53:16 +0800 Subject: [PATCH 2073/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20=E4=BA=8C?= =?UTF-8?q?=E5=8F=89=E6=A0=91=E7=9A=84=E9=80=92=E5=BD=92=E9=81=8D=E5=8E=86?= =?UTF-8?q?=20=E6=8E=92=E7=89=88=E6=A0=BC=E5=BC=8F=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...22\345\275\222\351\201\215\345\216\206.md" | 37 ++++++++++--------- 1 file changed, 19 insertions(+), 18 deletions(-) diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" index 92f342f0db..730b18ac6d 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" @@ -4,15 +4,15 @@

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

- +> 一看就会,一写就废! # 二叉树的递归遍历 +## 算法公开课 -《代码随想录》算法视频公开课:[每次写递归都要靠直觉? 这次带你学透二叉树的递归遍历!](https://www.bilibili.com/video/BV1Wh411S7xt),相信结合视频在看本篇题解,更有助于大家对本题的理解。 - +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[每次写递归都要靠直觉? 这次带你学透二叉树的递归遍历!](https://www.bilibili.com/video/BV1Wh411S7xt),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 -> 一看就会,一写就废! +## 思路 这次我们要好好谈一谈递归,为什么很多同学看递归算法都是“一看就会,一写就废”。 @@ -109,14 +109,10 @@ void traversal(TreeNode* cur, vector& vec) { 可能有同学感觉前后中序遍历的递归太简单了,要打迭代法(非递归),别急,我们明天打迭代法,打个通透! +## 其他语言版本 +### Java: - - -# 其他语言版本 - - -Java: ```Java // 前序遍历·递归·LC144_二叉树的前序遍历 class Solution { @@ -171,7 +167,8 @@ class Solution { } ``` -Python: +### Python: + ```python # 前序遍历-递归-LC144_二叉树的前序遍历 # Definition for a binary tree node. @@ -219,7 +216,7 @@ class Solution: return left + right + [root.val] ``` -Go: +### Go: 前序遍历: ```go @@ -273,7 +270,7 @@ func postorderTraversal(root *TreeNode) (res []int) { } ``` -Javascript版本: +### Javascript: 前序遍历: ```Javascript @@ -327,7 +324,7 @@ var postorderTraversal = function(root) { }; ``` -TypeScript: +### TypeScript: ```typescript // 前序遍历 @@ -370,7 +367,7 @@ function postorderTraversal(node: TreeNode | null): number[] { } ``` -C: +### C: ```c //前序遍历: @@ -422,8 +419,9 @@ int* postorderTraversal(struct TreeNode* root, int* returnSize){ } ``` -Swift: +### Swift: 前序遍历:(144.二叉树的前序遍历) + ```Swift func preorderTraversal(_ root: TreeNode?) -> [Int] { var res = [Int]() @@ -473,7 +471,10 @@ func postorder(_ root: TreeNode?, res: inout [Int]) { res.append(root!.val) } ``` -Scala: 前序遍历:(144.二叉树的前序遍历) +### Scala: + + 前序遍历:(144.二叉树的前序遍历) + ```scala object Solution { import scala.collection.mutable.ListBuffer @@ -525,7 +526,7 @@ object Solution { } ``` -rust: +### Rust: ```rust use std::cell::RefCell; From a13bb8292123ceded30c12bf7e713468fc29e50f Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Thu, 20 Jul 2023 16:07:52 +0800 Subject: [PATCH 2074/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20=E4=BA=8C?= =?UTF-8?q?=E5=8F=89=E6=A0=91=E7=9A=84=E8=BF=AD=E4=BB=A3=E9=81=8D=E5=8E=86?= =?UTF-8?q?=20=E6=8E=92=E7=89=88=E6=A0=BC=E5=BC=8F=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...55\344\273\243\351\201\215\345\216\206.md" | 50 +++++++++---------- 1 file changed, 24 insertions(+), 26 deletions(-) diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" index 8b2414652c..69007995f0 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" @@ -4,16 +4,17 @@

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+> 听说还可以用非递归的方式 # 二叉树的迭代遍历 -《代码随想录》算法视频公开课: -* [写出二叉树的非递归遍历很难么?(前序和后序)](https://www.bilibili.com/video/BV15f4y1W7i2) -* [写出二叉树的非递归遍历很难么?(中序))](https://www.bilibili.com/video/BV1Zf4y1a77g) -相信结合视频在看本篇题解,更有助于大家对本题的理解。 +## 算法公开课 +[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html): -> 听说还可以用非递归的方式 +* **[写出二叉树的非递归遍历很难么?(前序和后序)](https://www.bilibili.com/video/BV15f4y1W7i2)** +* **[写出二叉树的非递归遍历很难么?(中序))](https://www.bilibili.com/video/BV1Zf4y1a77g)** +**相信结合视频在看本篇题解,更有助于大家对本题的理解。** 看完本篇大家可以使用迭代法,再重新解决如下三道leetcode上的题目: @@ -21,13 +22,15 @@ * [94.二叉树的中序遍历](https://leetcode.cn/problems/binary-tree-inorder-traversal/) * [145.二叉树的后序遍历](https://leetcode.cn/problems/binary-tree-postorder-traversal/) +## 思路 + 为什么可以用迭代法(非递归的方式)来实现二叉树的前后中序遍历呢? 我们在[栈与队列:匹配问题都是栈的强项](https://programmercarl.com/1047.删除字符串中的所有相邻重复项.html)中提到了,**递归的实现就是:每一次递归调用都会把函数的局部变量、参数值和返回地址等压入调用栈中**,然后递归返回的时候,从栈顶弹出上一次递归的各项参数,所以这就是递归为什么可以返回上一层位置的原因。 此时大家应该知道我们用栈也可以是实现二叉树的前后中序遍历了。 -## 前序遍历(迭代法) +### 前序遍历(迭代法) 我们先看一下前序遍历。 @@ -69,7 +72,7 @@ public: 但接下来,**再用迭代法写中序遍历的时候,会发现套路又不一样了,目前的前序遍历的逻辑无法直接应用到中序遍历上。** -## 中序遍历(迭代法) +### 中序遍历(迭代法) 为了解释清楚,我说明一下 刚刚在迭代的过程中,其实我们有两个操作: @@ -112,7 +115,7 @@ public: ``` -## 后序遍历(迭代法) +### 后序遍历(迭代法) 再来看后序遍历,先序遍历是中左右,后续遍历是左右中,那么我们只需要调整一下先序遍历的代码顺序,就变成中右左的遍历顺序,然后在反转result数组,输出的结果顺序就是左右中了,如下图: @@ -142,7 +145,7 @@ public: ``` -# 总结 +## 总结 此时我们用迭代法写出了二叉树的前后中序遍历,大家可以看出前序和中序是完全两种代码风格,并不像递归写法那样代码稍做调整,就可以实现前后中序。 @@ -155,11 +158,9 @@ public: 当然可以,这种写法,还不是很好理解,我们将在下一篇文章里重点讲解,敬请期待! +## 其他语言版本 - -# 其他语言版本 - -Java: +### Java: ```java // 前序遍历顺序:中-左-右,入栈顺序:中-右-左 @@ -233,10 +234,7 @@ class Solution { } ``` - - - -Python: +### Python: ```python # 前序遍历-迭代-LC144_二叉树的前序遍历 @@ -281,7 +279,7 @@ class Solution: # 取栈顶元素右结点 cur = cur.right return result - ``` +``` ```python # 后序遍历-迭代-LC145_二叉树的后序遍历 @@ -303,10 +301,9 @@ class Solution: stack.append(node.right) # 将最终的数组翻转 return result[::-1] -``` - + ``` -Go: +### Go: > 迭代法前序遍历 @@ -400,7 +397,7 @@ func inorderTraversal(root *TreeNode) []int { } ``` -javaScript: +### JavaScript: ```js @@ -464,7 +461,7 @@ var postorderTraversal = function(root, res = []) { }; ``` -TypeScript: +### TypeScript: ```typescript // 前序遍历(迭代法) @@ -519,7 +516,7 @@ function postorderTraversal(root: TreeNode | null): number[] { }; ``` -Swift: +### Swift: ```swift // 前序遍历迭代法 @@ -578,7 +575,8 @@ func inorderTraversal(_ root: TreeNode?) -> [Int] { return result } ``` -Scala: +### Scala: + ```scala // 前序遍历(迭代法) object Solution { @@ -645,7 +643,7 @@ object Solution { } ``` -rust: +### Rust: ```rust use std::cell::RefCell; From cc510357c1fe6f0cf25fd4e800c2a89b03b4659f Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Thu, 20 Jul 2023 16:22:00 +0800 Subject: [PATCH 2075/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20=E4=BA=8C?= =?UTF-8?q?=E5=8F=89=E6=A0=91=E7=9A=84=E7=BB=9F=E4=B8=80=E8=BF=AD=E4=BB=A3?= =?UTF-8?q?=E6=B3=95=20=E6=8E=92=E7=89=88=E6=A0=BC=E5=BC=8F=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...00\350\277\255\344\273\243\346\263\225.md" | 34 +++++++++---------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\347\273\237\344\270\200\350\277\255\344\273\243\346\263\225.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\347\273\237\344\270\200\350\277\255\344\273\243\346\263\225.md" index 274642696c..8089af64ec 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\347\273\237\344\270\200\350\277\255\344\273\243\346\263\225.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\347\273\237\344\270\200\350\277\255\344\273\243\346\263\225.md" @@ -5,10 +5,11 @@

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+> 统一写法是一种什么感觉 # 二叉树的统一迭代法 -> 统一写法是一种什么感觉 +## 思路 此时我们在[二叉树:一入递归深似海,从此offer是路人](https://programmercarl.com/二叉树的递归遍历.html)中用递归的方式,实现了二叉树前中后序的遍历。 @@ -28,7 +29,7 @@ 如何标记呢,**就是要处理的节点放入栈之后,紧接着放入一个空指针作为标记。** 这种方法也可以叫做标记法。 -## 迭代法中序遍历 +### 迭代法中序遍历 中序遍历代码如下:(详细注释) @@ -71,7 +72,7 @@ public: 此时我们再来看前序遍历代码。 -## 迭代法前序遍历 +### 迭代法前序遍历 迭代法前序遍历代码如下: (**注意此时我们和中序遍历相比仅仅改变了两行代码的顺序**) @@ -102,7 +103,7 @@ public: }; ``` -## 迭代法后序遍历 +### 迭代法后序遍历 后续遍历代码如下: (**注意此时我们和中序遍历相比仅仅改变了两行代码的顺序**) @@ -143,15 +144,11 @@ public: 所以大家根据自己的个人喜好,对于二叉树的前中后序遍历,选择一种自己容易理解的递归和迭代法。 +## 其他语言版本 - - - -# 其他语言版本 - - -Java: +### Java: 迭代法前序遍历代码如下: + ```java class Solution { public List preorderTraversal(TreeNode root) { @@ -235,7 +232,7 @@ class Solution { } ``` -Python: +### Python: 迭代法前序遍历: ```python @@ -309,7 +306,8 @@ class Solution: return result ``` -Go: +### Go: + > 前序遍历统一迭代法 ```GO @@ -442,7 +440,7 @@ func postorderTraversal(root *TreeNode) []int { } ``` -javaScript: +### JavaScript: > 前序遍历统一迭代法 @@ -522,7 +520,7 @@ var postorderTraversal = function(root, res = []) { ``` -TypeScript: +### TypeScript: ```typescript // 前序遍历(迭代法) @@ -591,7 +589,8 @@ function postorderTraversal(root: TreeNode | null): number[] { return res; }; ``` -Scala: +### Scala: + ```scala // 前序遍历 object Solution { @@ -667,7 +666,7 @@ object Solution { } ``` -rust: +### Rust: ```rust impl Solution{ @@ -747,3 +746,4 @@ impl Solution{ + From 8e34d5ff5749229eeaa7dce33e1ed74c0dd992a2 Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Thu, 20 Jul 2023 19:17:38 +0800 Subject: [PATCH 2076/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200102.=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?=20=E6=8E=92=E7=89=88=E6=A0=BC=E5=BC=8F=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...02\345\272\217\351\201\215\345\216\206.md" | 284 +++++++++--------- 1 file changed, 149 insertions(+), 135 deletions(-) diff --git "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" index c2ad950814..ce9a247c1f 100644 --- "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" +++ "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" @@ -8,21 +8,23 @@ # 二叉树层序遍历登场! -《代码随想录》算法视频公开课:[讲透二叉树的层序遍历 | 广度优先搜索 | LeetCode:102.二叉树的层序遍历](https://www.bilibili.com/video/BV1GY4y1u7b2),相信结合视频在看本篇题解,更有助于大家对本题的理解。 +## 算法公开课 + +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[讲透二叉树的层序遍历 | 广度优先搜索 | LeetCode:102.二叉树的层序遍历](https://www.bilibili.com/video/BV1GY4y1u7b2),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 学会二叉树的层序遍历,可以一口气打完以下十题: -* 102.二叉树的层序遍历 -* 107.二叉树的层次遍历II -* 199.二叉树的右视图 -* 637.二叉树的层平均值 -* 429.N叉树的层序遍历 -* 515.在每个树行中找最大值 -* 116.填充每个节点的下一个右侧节点指针 -* 117.填充每个节点的下一个右侧节点指针II -* 104.二叉树的最大深度 -* 111.二叉树的最小深度 +* [102.二叉树的层序遍历](https://leetcode.cn/problems/binary-tree-level-order-traversal/) +* [107.二叉树的层次遍历II](https://leetcode.cn/problems/binary-tree-level-order-traversal-ii/) +* [199.二叉树的右视图](https://leetcode.cn/problems/binary-tree-right-side-view/) +* [637.二叉树的层平均值](https://leetcode.cn/problems/binary-tree-right-side-view/) +* [429.N叉树的层序遍历](https://leetcode.cn/problems/n-ary-tree-level-order-traversal/) +* [515.在每个树行中找最大值](https://leetcode.cn/problems/find-largest-value-in-each-tree-row/) +* [116.填充每个节点的下一个右侧节点指针](https://leetcode.cn/problems/populating-next-right-pointers-in-each-node/) +* [117.填充每个节点的下一个右侧节点指针II](https://leetcode.cn/problems/populating-next-right-pointers-in-each-node-ii/) +* [104.二叉树的最大深度](https://leetcode.cn/problems/maximum-depth-of-binary-tree/) +* [111.二叉树的最小深度](https://leetcode.cn/problems/minimum-depth-of-binary-tree/) @@ -31,7 +33,7 @@ -# 102.二叉树的层序遍历 +## 102.二叉树的层序遍历 [力扣题目链接](https://leetcode.cn/problems/binary-tree-level-order-traversal/) @@ -39,7 +41,7 @@ ![102.二叉树的层序遍历](https://code-thinking-1253855093.file.myqcloud.com/pics/20210203144842988.png) -思路: +### 思路 我们之前讲过了三篇关于二叉树的深度优先遍历的文章: @@ -63,7 +65,7 @@ 代码如下:**这份代码也可以作为二叉树层序遍历的模板,打十个就靠它了**。 -C++代码: +c++代码如下: ```CPP class Solution { @@ -111,7 +113,9 @@ public: }; ``` -java: +### 其他语言版本 + +#### Java: ```Java // 102.二叉树的层序遍历 @@ -167,7 +171,7 @@ class Solution { } ``` -python3代码: +#### Python: ```python @@ -219,12 +223,9 @@ class Solution: self.helper(node.left, level + 1, levels) self.helper(node.right, level + 1, levels) - ``` - - -go: +#### Go: ```go /** @@ -320,7 +321,7 @@ func levelOrder(root *TreeNode) (res [][]int) { } ``` -javascript代码: +#### Javascript: ```javascript var levelOrder = function(root) { @@ -350,7 +351,7 @@ var levelOrder = function(root) { ``` -TypeScript: +#### TypeScript: ```typescript function levelOrder(root: TreeNode | null): number[][] { @@ -377,7 +378,7 @@ function levelOrder(root: TreeNode | null): number[][] { }; ``` -Swift: +#### Swift: ```swift func levelOrder(_ root: TreeNode?) -> [[Int]] { @@ -403,7 +404,7 @@ func levelOrder(_ root: TreeNode?) -> [[Int]] { } ``` -Scala: +#### Scala: ```scala // 102.二叉树的层序遍历 @@ -430,7 +431,7 @@ object Solution { } ``` -Rust: +#### Rust: ```rust use std::cell::RefCell; @@ -466,7 +467,7 @@ impl Solution { **此时我们就掌握了二叉树的层序遍历了,那么如下九道力扣上的题目,只需要修改模板的两三行代码(不能再多了),便可打倒!** -# 107.二叉树的层次遍历 II +## 107.二叉树的层次遍历 II [力扣题目链接](https://leetcode.cn/problems/binary-tree-level-order-traversal-ii/) @@ -474,7 +475,7 @@ impl Solution { ![107.二叉树的层次遍历II](https://code-thinking-1253855093.file.myqcloud.com/pics/20210203151058308.png) -思路: +### 思路 相对于102.二叉树的层序遍历,就是最后把result数组反转一下就可以了。 @@ -506,7 +507,9 @@ public: }; ``` -python代码: +### 其他语言版本 + +#### Python: ```python class Solution: @@ -537,7 +540,7 @@ class Solution: return result[::-1] ``` -Java: +#### Java: ```java // 107. 二叉树的层序遍历 II @@ -618,12 +621,10 @@ class Solution { return ans; } -} -``` - +``` -go: +#### Go: ```GO /** @@ -662,7 +663,7 @@ func levelOrderBottom(root *TreeNode) [][]int { } ``` -javascript代码 +#### Javascript: ```javascript var levelOrderBottom = function(root) { @@ -688,7 +689,7 @@ var levelOrderBottom = function(root) { }; ``` -TypeScript: +#### TypeScript: ```typescript function levelOrderBottom(root: TreeNode | null): number[][] { @@ -711,7 +712,7 @@ function levelOrderBottom(root: TreeNode | null): number[][] { }; ``` -Swift: +#### Swift: ```swift func levelOrderBottom(_ root: TreeNode?) -> [[Int]] { @@ -737,8 +738,7 @@ func levelOrderBottom(_ root: TreeNode?) -> [[Int]] { } ``` - -Scala: +#### Scala: ```scala // 107.二叉树的层次遍历II @@ -764,7 +764,10 @@ object Solution { res.reverse.toList } -Rust: + +``` + +#### Rust: ```rust use std::cell::RefCell; @@ -796,7 +799,7 @@ impl Solution { } ``` -# 199.二叉树的右视图 +## 199.二叉树的右视图 [力扣题目链接](https://leetcode.cn/problems/binary-tree-right-side-view/) @@ -804,7 +807,7 @@ impl Solution { ![199.二叉树的右视图](https://code-thinking-1253855093.file.myqcloud.com/pics/20210203151307377.png) -思路: +### 思路 层序遍历的时候,判断是否遍历到单层的最后面的元素,如果是,就放进result数组中,随后返回result就可以了。 @@ -832,7 +835,9 @@ public: }; ``` -python代码: +### 其他语言版本 + +#### Python: ```python # Definition for a binary tree node. @@ -866,8 +871,7 @@ class Solution: return right_view ``` - -Java: +#### Java: ```java // 199.二叉树的右视图 @@ -911,7 +915,7 @@ public class N0199 { } ``` -go: +#### Go: ```GO /** @@ -945,8 +949,7 @@ func rightSideView(root *TreeNode) []int { } ``` - -javascript代码: +#### Javascript: ```javascript var rightSideView = function(root) { @@ -972,7 +975,7 @@ var rightSideView = function(root) { }; ``` -TypeScript: +#### TypeScript: ```typescript function rightSideView(root: TreeNode | null): number[] { @@ -992,7 +995,7 @@ function rightSideView(root: TreeNode | null): number[] { }; ``` -Swift: +#### Swift: ```swift func rightSideView(_ root: TreeNode?) -> [Int] { @@ -1017,7 +1020,7 @@ func rightSideView(_ root: TreeNode?) -> [Int] { } ``` -Scala: +#### Scala: ```scala // 199.二叉树的右视图 @@ -1043,7 +1046,7 @@ object Solution { } ``` -rust: +#### Rust: ```rust use std::cell::RefCell; @@ -1076,7 +1079,7 @@ impl Solution { } ``` -# 637.二叉树的层平均值 +## 637.二叉树的层平均值 [力扣题目链接](https://leetcode.cn/problems/average-of-levels-in-binary-tree/) @@ -1084,7 +1087,7 @@ impl Solution { ![637.二叉树的层平均值](https://code-thinking-1253855093.file.myqcloud.com/pics/20210203151350500.png) -思路: +### 思路 本题就是层序遍历的时候把一层求个总和在取一个均值。 @@ -1115,7 +1118,9 @@ public: ``` -python代码: +### 其他语言版本 + +#### Python: ```python class Solution: @@ -1155,7 +1160,7 @@ class Solution: return averages ``` -java: +#### Java: ```java // 637. 二叉树的层平均值 @@ -1197,7 +1202,7 @@ public class N0637 { } ``` -go: +#### Go: ```GO /** @@ -1235,7 +1240,7 @@ func averageOfLevels(root *TreeNode) []float64 { } ``` -javascript代码: +#### Javascript: ```javascript var averageOfLevels = function(root) { @@ -1262,7 +1267,7 @@ var averageOfLevels = function(root) { }; ``` -TypeScript: +#### TypeScript: ```typescript function averageOfLevels(root: TreeNode | null): number[] { @@ -1286,7 +1291,7 @@ function averageOfLevels(root: TreeNode | null): number[] { }; ``` -Swift: +#### Swift: ```swift func averageOfLevels(_ root: TreeNode?) -> [Double] { @@ -1313,7 +1318,7 @@ func averageOfLevels(_ root: TreeNode?) -> [Double] { } ``` -Scala: +#### Scala: ```scala // 637.二叉树的层平均值 @@ -1339,7 +1344,7 @@ object Solution { } ``` -rust: +#### Rust: ```rust use std::cell::RefCell; @@ -1372,7 +1377,7 @@ impl Solution { } ``` -# 429.N叉树的层序遍历 +## 429.N叉树的层序遍历 [力扣题目链接](https://leetcode.cn/problems/n-ary-tree-level-order-traversal/) @@ -1390,8 +1395,7 @@ impl Solution { [5,6] ] - -思路: +### 思路 这道题依旧是模板题,只不过一个节点有多个孩子了 @@ -1423,7 +1427,9 @@ public: }; ``` -python代码: +### 其他语言版本 + +#### Python: ```python """ @@ -1475,7 +1481,7 @@ class Solution: return result ``` -java: +#### Java: ```java // 429. N 叉树的层序遍历 @@ -1535,8 +1541,7 @@ public class N0429 { } ``` - -go: +#### Go: ```GO /** @@ -1567,7 +1572,7 @@ func levelOrder(root *Node) [][]int { } ``` -JavaScript代码: +#### JavaScript: ```JavaScript var levelOrder = function(root) { @@ -1596,7 +1601,7 @@ var levelOrder = function(root) { }; ``` -TypeScript: +#### TypeScript: ```typescript function levelOrder(root: Node | null): number[][] { @@ -1618,7 +1623,7 @@ function levelOrder(root: Node | null): number[][] { }; ``` -Swift: +#### Swift: ```swift func levelOrder(_ root: Node?) -> [[Int]] { @@ -1643,7 +1648,7 @@ func levelOrder(_ root: Node?) -> [[Int]] { } ``` -Scala: +#### Scala: ```scala // 429.N叉树的层序遍历 @@ -1672,7 +1677,7 @@ object Solution { } ``` -rust: +#### Rust: ```rust pub struct Solution; @@ -1720,7 +1725,7 @@ impl Solution { } ``` -# 515.在每个树行中找最大值 +## 515.在每个树行中找最大值 [力扣题目链接](https://leetcode.cn/problems/find-largest-value-in-each-tree-row/) @@ -1728,7 +1733,7 @@ impl Solution { ![515.在每个树行中找最大值](https://code-thinking-1253855093.file.myqcloud.com/pics/20210203151532153.png) -思路: +### 思路 层序遍历,取每一层的最大值 @@ -1758,7 +1763,9 @@ public: }; ``` -python代码: +### 其他语言版本 + +#### Python: ```python # Definition for a binary tree node. @@ -1794,7 +1801,7 @@ class Solution: return result ``` -java代码: +#### Java: ```java class Solution { @@ -1820,7 +1827,7 @@ class Solution { } ``` -go: +#### Go: ```GO /** @@ -1864,7 +1871,7 @@ func max(x, y int) int { } ``` -javascript代码: +#### Javascript: ```javascript var largestValues = function(root) { @@ -1890,7 +1897,7 @@ var largestValues = function(root) { }; ``` -TypeScript: +#### TypeScript: ```typescript function largestValues(root: TreeNode | null): number[] { @@ -1916,7 +1923,7 @@ function largestValues(root: TreeNode | null): number[] { }; ``` -Swift: +#### Swift: ```swift func largestValues(_ root: TreeNode?) -> [Int] { @@ -1943,7 +1950,7 @@ func largestValues(_ root: TreeNode?) -> [Int] { } ``` -Scala: +#### Scala: ```scala // 515.在每个树行中找最大值 @@ -1970,7 +1977,7 @@ object Solution { } ``` -rust: +#### Rust: ```rust use std::cell::RefCell; @@ -2002,7 +2009,7 @@ impl Solution { } ``` -# 116.填充每个节点的下一个右侧节点指针 +## 116.填充每个节点的下一个右侧节点指针 [力扣题目链接](https://leetcode.cn/problems/populating-next-right-pointers-in-each-node/) @@ -2024,7 +2031,7 @@ struct Node { ![116.填充每个节点的下一个右侧节点指针](https://code-thinking-1253855093.file.myqcloud.com/pics/20210203152044855.jpg) -思路: +### 思路 本题依然是层序遍历,只不过在单层遍历的时候记录一下本层的头部节点,然后在遍历的时候让前一个节点指向本节点就可以了 @@ -2063,7 +2070,9 @@ public: }; ``` -java代码: +### 其他语言版本 + +#### Java: ```java class Solution { @@ -2093,7 +2102,7 @@ class Solution { } ``` -python代码: +#### Python: ```python """ @@ -2133,7 +2142,7 @@ class Solution: return root ``` -go: +#### Go: ```GO /** @@ -2173,7 +2182,7 @@ func connect(root *Node) *Node { ``` -JavaScript: +#### JavaScript: ```javascript /** @@ -2209,7 +2218,7 @@ var connect = function(root) { ``` -TypeScript: +#### TypeScript: ```typescript function connect(root: Node | null): Node | null { @@ -2234,7 +2243,7 @@ function connect(root: Node | null): Node | null { }; ``` -Swift: +#### Swift: ```swift func connect(_ root: Node?) -> Node? { @@ -2266,7 +2275,7 @@ func connect(_ root: Node?) -> Node? { } ``` -Scala: +#### Scala: ```scala // 116.填充每个节点的下一个右侧节点指针 @@ -2297,11 +2306,11 @@ object Solution { } ``` -# 117.填充每个节点的下一个右侧节点指针II +## 117.填充每个节点的下一个右侧节点指针II [力扣题目链接](https://leetcode.cn/problems/populating-next-right-pointers-in-each-node-ii/) -思路: +### 思路 这道题目说是二叉树,但116题目说是完整二叉树,其实没有任何差别,一样的代码一样的逻辑一样的味道 @@ -2339,7 +2348,9 @@ public: }; ``` -Java 代码: +### 其他语言版本 + +#### Java: ```java // 二叉树之层次遍历 @@ -2377,7 +2388,7 @@ class Solution { } ``` -python代码: +#### Python: ```python # 层序遍历解法 @@ -2420,7 +2431,7 @@ class Solution: ``` -go: +#### Go: ```GO /** @@ -2459,7 +2470,7 @@ func connect(root *Node) *Node { } ``` -JavaScript: +#### JavaScript: ```javascript /** @@ -2494,7 +2505,7 @@ var connect = function(root) { }; ``` -TypeScript: +#### TypeScript: ```typescript function connect(root: Node | null): Node | null { @@ -2519,7 +2530,7 @@ function connect(root: Node | null): Node | null { }; ``` -Swift: +#### Swift: ```swift func connect(_ root: Node?) -> Node? { @@ -2551,7 +2562,7 @@ func connect(_ root: Node?) -> Node? { } ``` -Scala: +#### Scala: ```scala // 117.填充每个节点的下一个右侧节点指针II @@ -2582,7 +2593,7 @@ object Solution { } ``` -# 104.二叉树的最大深度 +## 104.二叉树的最大深度 [力扣题目链接](https://leetcode.cn/problems/maximum-depth-of-binary-tree/) @@ -2600,7 +2611,7 @@ object Solution { 返回它的最大深度 3 。 -思路: +### 思路 使用迭代法的话,使用层序遍历是最为合适的,因为最大的深度就是二叉树的层数,和层序遍历的方式极其吻合。 @@ -2635,7 +2646,9 @@ public: }; ``` -Java: +### 其他语言版本 + +#### Java: ```Java class Solution { @@ -2661,7 +2674,7 @@ class Solution { } ``` -Python: +#### Python: ```python 3 # Definition for a binary tree node. @@ -2691,7 +2704,7 @@ class Solution: ``` -Go: +#### Go: ```go /** @@ -2726,7 +2739,7 @@ func maxDepth(root *TreeNode) int { } ``` -JavaScript: +#### JavaScript: ```javascript /** @@ -2759,7 +2772,7 @@ var maxDepth = function(root) { }; ``` -TypeScript: +#### TypeScript: ```typescript function maxDepth(root: TreeNode | null): number { @@ -2779,7 +2792,7 @@ function maxDepth(root: TreeNode | null): number { }; ``` -Swift: +#### Swift: ```swift func maxDepth(_ root: TreeNode?) -> Int { @@ -2804,7 +2817,7 @@ func maxDepth(_ root: TreeNode?) -> Int { } ``` -Scala: +#### Scala: ```scala // 104.二叉树的最大深度 @@ -2829,7 +2842,7 @@ object Solution { } ``` -rust: +#### Rust: ```rust use std::cell::RefCell; @@ -2859,10 +2872,12 @@ impl Solution { } ``` -# 111.二叉树的最小深度 +## 111.二叉树的最小深度 [力扣题目链接](https://leetcode.cn/problems/minimum-depth-of-binary-tree/) +### 思路 + 相对于 104.二叉树的最大深度 ,本题还也可以使用层序遍历的方式来解决,思路是一样的。 **需要注意的是,只有当左右孩子都为空的时候,才说明遍历的最低点了。如果其中一个孩子为空则不是最低点** @@ -2895,7 +2910,9 @@ public: }; ``` -Java: +### 其他语言版本 + +#### Java: ```java class Solution { @@ -2925,9 +2942,7 @@ class Solution { } ``` - - -Python 3: +#### Python: ```python 3 # Definition for a binary tree node. @@ -2960,7 +2975,7 @@ class Solution: return depth ``` -Go: +#### Go: ```go /** @@ -2999,7 +3014,7 @@ func minDepth(root *TreeNode) int { } ``` -JavaScript: +#### JavaScript: ```javascript /** @@ -3035,7 +3050,7 @@ var minDepth = function(root) { }; ``` -TypeScript: +#### TypeScript: ```typescript function minDepth(root: TreeNode | null): number { @@ -3056,7 +3071,7 @@ function minDepth(root: TreeNode | null): number { }; ``` -Swift: +#### Swift: ```swift func minDepth(_ root: TreeNode?) -> Int { @@ -3082,7 +3097,7 @@ func minDepth(_ root: TreeNode?) -> Int { } ``` -Scala: +#### Scala: ```scala // 111.二叉树的最小深度 @@ -3108,7 +3123,7 @@ object Solution { } ``` -rust: +#### Rust: ```rust use std::cell::RefCell; @@ -3141,28 +3156,27 @@ impl Solution { } ``` -# 总结 +## 总结 二叉树的层序遍历,**就是图论中的广度优先搜索在二叉树中的应用**,需要借助队列来实现(此时又发现队列的一个应用了)。 来吧,一口气打十个: -* 102.二叉树的层序遍历 -* 107.二叉树的层次遍历II -* 199.二叉树的右视图 -* 637.二叉树的层平均值 -* 429.N叉树的层序遍历 -* 515.在每个树行中找最大值 -* 116.填充每个节点的下一个右侧节点指针 -* 117.填充每个节点的下一个右侧节点指针II -* 104.二叉树的最大深度 -* 111.二叉树的最小深度 +* [102.二叉树的层序遍历](https://leetcode.cn/problems/binary-tree-level-order-traversal/) +* [107.二叉树的层次遍历II](https://leetcode.cn/problems/binary-tree-level-order-traversal-ii/) +* [199.二叉树的右视图](https://leetcode.cn/problems/binary-tree-right-side-view/) +* [637.二叉树的层平均值](https://leetcode.cn/problems/binary-tree-right-side-view/) +* [429.N叉树的层序遍历](https://leetcode.cn/problems/n-ary-tree-level-order-traversal/) +* [515.在每个树行中找最大值](https://leetcode.cn/problems/find-largest-value-in-each-tree-row/) +* [116.填充每个节点的下一个右侧节点指针](https://leetcode.cn/problems/populating-next-right-pointers-in-each-node/) +* [117.填充每个节点的下一个右侧节点指针II](https://leetcode.cn/problems/populating-next-right-pointers-in-each-node-ii/) +* [104.二叉树的最大深度](https://leetcode.cn/problems/maximum-depth-of-binary-tree/) +* [111.二叉树的最小深度](https://leetcode.cn/problems/minimum-depth-of-binary-tree/) **致敬叶师傅!** - -

+ From 1abe3506ea6108a14d32b3176bb44674212cd9b1 Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Fri, 21 Jul 2023 14:19:58 +0800 Subject: [PATCH 2077/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200226.=E7=BF=BB?= =?UTF-8?q?=E8=BD=AC=E4=BA=8C=E5=8F=89=E6=A0=91=20=E6=8E=92=E7=89=88?= =?UTF-8?q?=E6=A0=BC=E5=BC=8F=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...54\344\272\214\345\217\211\346\240\221.md" | 33 ++++++++++--------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git "a/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" "b/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" index b3aea9ed29..1151778364 100644 --- "a/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" @@ -16,7 +16,11 @@ 这道题目背后有一个让程序员心酸的故事,听说 Homebrew的作者Max Howell,就是因为没在白板上写出翻转二叉树,最后被Google拒绝了。(真假不做判断,权当一个乐子哈) -# 题外话 +## 算法公开课 + +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[听说一位巨佬面Google被拒了,因为没写出翻转二叉树 | LeetCode:226.翻转二叉树](https://www.bilibili.com/video/BV1sP4y1f7q7),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 + +## 题外话 这道题目是非常经典的题目,也是比较简单的题目(至少一看就会)。 @@ -24,9 +28,7 @@ 如果做过这道题的同学也建议认真看完,相信一定有所收获! -# 思路 - -《代码随想录》算法视频公开课:[听说一位巨佬面Google被拒了,因为没写出翻转二叉树 | LeetCode:226.翻转二叉树](https://www.bilibili.com/video/BV1sP4y1f7q7),相信结合视频在看本篇题解,更有助于大家对本题的理解。 +## 思路 我们之前介绍的都是各种方式遍历二叉树,这次要翻转了,感觉还是有点懵逼。 @@ -49,7 +51,7 @@ 那么层序遍历可以不可以呢?**依然可以的!只要把每一个节点的左右孩子翻转一下的遍历方式都是可以的!** -## 递归法 +### 递归法 对于二叉树的递归法的前中后序遍历,已经在[二叉树:前中后序递归遍历](https://programmercarl.com/二叉树的递归遍历.html)详细讲解了。 @@ -102,9 +104,9 @@ public: }; ``` -## 迭代法 +### 迭代法 -### 深度优先遍历 +#### 深度优先遍历 [二叉树:听说递归能做的,栈也能做!](https://programmercarl.com/二叉树的迭代遍历.html)中给出了前中后序迭代方式的写法,所以本题可以很轻松的写出如下迭代法的代码: @@ -163,7 +165,7 @@ public: 如果上面这个代码看不懂,回顾一下文章[二叉树:前中后序迭代方式的统一写法](https://programmercarl.com/二叉树的统一迭代法.html)。 -### 广度优先遍历 +#### 广度优先遍历 也就是层序遍历,层数遍历也是可以翻转这棵树的,因为层序遍历也可以把每个节点的左右孩子都翻转一遍,代码如下: @@ -259,7 +261,7 @@ public: ## 其他语言版本 -### Java +### Java: ```Java //DFS递归 class Solution { @@ -310,7 +312,7 @@ class Solution { } ``` -### Python +### Python: 递归法:前序遍历: ```python @@ -466,7 +468,7 @@ class Solution: ``` -### Go +### Go: 递归版本的前序遍历 ```Go @@ -575,7 +577,7 @@ func invertTree(root *TreeNode) *TreeNode { } ``` -### JavaScript +### JavaScript: 使用递归版本的前序遍历 ```javascript @@ -783,7 +785,7 @@ function invertTree(root: TreeNode | null): TreeNode | null { }; ``` -### C +### C: 递归法 ```c @@ -961,7 +963,7 @@ object Solution { } ``` -### rust +### Rust: ```rust impl Solution { @@ -991,7 +993,7 @@ impl Solution { } ``` -### C# +### C#: ```csharp //递归 @@ -1042,3 +1044,4 @@ public class Solution { + From 49a38691744fbce62c7735a722b917448ab3e4a6 Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Fri, 21 Jul 2023 14:46:55 +0800 Subject: [PATCH 2078/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200101.=E5=AF=B9?= =?UTF-8?q?=E7=A7=B0=E4=BA=8C=E5=8F=89=E6=A0=91=20=E6=8E=92=E7=89=88?= =?UTF-8?q?=E6=A0=BC=E5=BC=8F=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...60\344\272\214\345\217\211\346\240\221.md" | 39 ++++++++++--------- 1 file changed, 21 insertions(+), 18 deletions(-) diff --git "a/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" "b/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" index 4418c62dc4..36b39740d0 100644 --- "a/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" @@ -13,9 +13,11 @@ ![101. 对称二叉树](https://code-thinking-1253855093.file.myqcloud.com/pics/20210203144607387.png) -# 思路 +## 算法公开课 -《代码随想录》算法视频公开课:[同时操作两个二叉树 | LeetCode:101. 对称二叉树](https://www.bilibili.com/video/BV1ue4y1Y7Mf),相信结合视频在看本篇题解,更有助于大家对本题的理解。 +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[同时操作两个二叉树 | LeetCode:101. 对称二叉树](https://www.bilibili.com/video/BV1ue4y1Y7Mf), 相信结合视频再看本篇题解,更有助于大家对本题的理解**。 + +## 思路 **首先想清楚,判断对称二叉树要比较的是哪两个节点,要比较的可不是左右节点!** @@ -41,7 +43,7 @@ 那么我们先来看看递归法的代码应该怎么写。 -## 递归法 +### 递归法 递归三部曲 @@ -159,13 +161,13 @@ public: **所以建议大家做题的时候,一定要想清楚逻辑,每一步做什么。把题目所有情况想到位,相应的代码写出来之后,再去追求简洁代码的效果。** -## 迭代法 +### 迭代法 这道题目我们也可以使用迭代法,但要注意,这里的迭代法可不是前中后序的迭代写法,因为本题的本质是判断两个树是否是相互翻转的,其实已经不是所谓二叉树遍历的前中后序的关系了。 这里我们可以使用队列来比较两个树(根节点的左右子树)是否相互翻转,(**注意这不是层序遍历**) -### 使用队列 +#### 使用队列 通过队列来判断根节点的左子树和右子树的内侧和外侧是否相等,如动画所示: @@ -207,7 +209,7 @@ public: }; ``` -### 使用栈 +#### 使用栈 细心的话,其实可以发现,这个迭代法,其实是把左右两个子树要比较的元素顺序放进一个容器,然后成对成对的取出来进行比较,那么其实使用栈也是可以的。 @@ -254,12 +256,12 @@ public: 这两道题目基本和本题是一样的,只要稍加修改就可以AC。 -* 100.相同的树 -* 572.另一个树的子树 +* [100.相同的树](https://leetcode.cn/problems/same-tree/) +* [572.另一个树的子树](https://leetcode.cn/problems/subtree-of-another-tree/) -# 其他语言版本 +## 其他语言版本 -Java +### Java: ```Java /** @@ -364,7 +366,7 @@ Java ``` -Python +### Python: 递归法: ```python @@ -470,7 +472,8 @@ class Solution: return True ``` -Go +### Go: + ```go /** * Definition for a binary tree node. @@ -521,8 +524,7 @@ func isSymmetric(root *TreeNode) bool { } ``` - -JavaScript +### JavaScript: 递归判断是否为对称二叉树: ```javascript @@ -610,7 +612,7 @@ var isSymmetric = function(root) { }; ``` -TypeScript: +### TypeScript: > 递归法 @@ -679,7 +681,7 @@ function isSymmetric(root: TreeNode | null): boolean { }; ``` -Swift: +### Swift: > 递归 ```swift @@ -761,7 +763,7 @@ func isSymmetric3(_ root: TreeNode?) -> Bool { } ``` -Scala +### Scala: > 递归: ```scala @@ -835,7 +837,7 @@ object Solution { } ``` -## Rust +### Rust: 递归: ```rust @@ -900,3 +902,4 @@ impl Solution { + From 4e77ae645077ade4306bbb1ef4219bc4e41c7d29 Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Fri, 21 Jul 2023 14:57:25 +0800 Subject: [PATCH 2079/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200104.=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?=20=E6=8E=92=E7=89=88=E6=A0=BC=E5=BC=8F=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...00\345\244\247\346\267\261\345\272\246.md" | 83 ++++++++++--------- 1 file changed, 45 insertions(+), 38 deletions(-) diff --git "a/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" "b/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" index 7130867bf9..0504437521 100644 --- "a/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" +++ "b/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" @@ -5,6 +5,7 @@

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+ # 104.二叉树的最大深度 [力扣题目链接](https://leetcode.cn/problems/maximum-depth-of-binary-tree/) @@ -23,17 +24,19 @@ 返回它的最大深度 3 。 -# 思路 +## 算法公开课 -看完本篇可以一起做了如下两道题目: +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[二叉树的高度和深度有啥区别?究竟用什么遍历顺序?很多录友搞不懂 | 104.二叉树的最大深度](https://www.bilibili.com/video/BV1Gd4y1V75u),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 -* 104.二叉树的最大深度 -* 559.n叉树的最大深度 +## 思路 + +看完本篇可以一起做了如下两道题目: -《代码随想录》算法视频公开课:[二叉树的高度和深度有啥区别?究竟用什么遍历顺序?很多录友搞不懂 | 104.二叉树的最大深度](https://www.bilibili.com/video/BV1Gd4y1V75u),相信结合视频在看本篇题解,更有助于大家对本题的理解。 +* [104.二叉树的最大深度](https://leetcode.cn/problems/maximum-depth-of-binary-tree/) +* [559.n叉树的最大深度](https://leetcode.cn/problems/maximum-depth-of-n-ary-tree/) -## 递归法 +### 递归法 本题可以使用前序(中左右),也可以使用后序遍历(左右中),使用前序求的就是深度,使用后序求的是高度。 @@ -164,7 +167,7 @@ public: }; ``` -## 迭代法 +### 迭代法 使用迭代法的话,使用层序遍历是最为合适的,因为最大的深度就是二叉树的层数,和层序遍历的方式极其吻合。 @@ -202,10 +205,11 @@ public: }; ``` - 那么我们可以顺便解决一下n叉树的最大深度问题 -# 559.n叉树的最大深度 +## 相关题目推荐 + +### 559.n叉树的最大深度 [力扣题目链接](https://leetcode.cn/problems/maximum-depth-of-n-ary-tree/) @@ -219,11 +223,11 @@ public: 我们应返回其最大深度,3。 -思路: +### 思路 依然可以提供递归法和迭代法,来解决这个问题,思路是和二叉树思路一样的,直接给出代码如下: -## 递归法 +#### 递归法 c++代码: @@ -240,7 +244,7 @@ public: } }; ``` -## 迭代法 +#### 迭代法 依然是层序遍历,代码如下: @@ -267,11 +271,11 @@ public: }; ``` -# 其他语言版本 +## 其他语言版本 -## java +### Java: -### 104.二叉树的最大深度 +104.二叉树的最大深度 ```java class solution { @@ -344,7 +348,8 @@ class solution { } ``` -### 559.n叉树的最大深度 +559.n叉树的最大深度 + ```java class Solution { /*递归法,后序遍历求root节点的高度*/ @@ -391,9 +396,9 @@ class solution { } ``` -## python +### Python : -### 104.二叉树的最大深度 +104.二叉树的最大深度 递归法: ```python @@ -448,7 +453,7 @@ class Solution: ``` -### 559.n叉树的最大深度 +559.n叉树的最大深度 递归法: ```python @@ -522,9 +527,10 @@ class Solution: return max_depth ``` +### Go: + +104.二叉树的最大深度 -## go -### 104.二叉树的最大深度 ```go /** * definition for a binary tree node. @@ -574,7 +580,7 @@ func maxdepth(root *treenode) int { ``` -### 559. n叉树的最大深度 +559. n叉树的最大深度 ```go func maxDepth(root *Node) int { @@ -598,9 +604,9 @@ func maxDepth(root *Node) int { } ``` -## javascript +### Javascript : -### 104.二叉树的最大深度 +104.二叉树的最大深度 ```javascript var maxdepth = function(root) { @@ -649,7 +655,7 @@ var maxDepth = function(root) { }; ``` -### 559.n叉树的最大深度 +559.n叉树的最大深度 N叉树的最大深度 递归写法 ```js @@ -683,9 +689,9 @@ var maxDepth = function(root) { }; ``` -## TypeScript +### TypeScript: -### 104.二叉树的最大深度 +104.二叉树的最大深度 ```typescript // 后续遍历(自下而上) @@ -728,7 +734,7 @@ function maxDepth(root: TreeNode | null): number { }; ``` -### 559.n叉树的最大深度 +559.n叉树的最大深度 ```typescript // 后续遍历(自下而上) @@ -756,9 +762,9 @@ function maxDepth(root: TreeNode | null): number { ``` -## C +### C: -### 104.二叉树的最大深度 +104.二叉树的最大深度 二叉树最大深度递归 ```c @@ -814,9 +820,9 @@ int maxDepth(struct TreeNode* root){ } ``` -## Swift +### Swift: -### 104.二叉树的最大深度 +104.二叉树的最大深度 ```swift // 递归 - 后序 @@ -856,7 +862,7 @@ func maxDepth(_ root: TreeNode?) -> Int { } ``` -### 559.n叉树的最大深度 +559.n叉树的最大深度 ```swift // 递归 @@ -893,9 +899,10 @@ func maxDepth1(_ root: Node?) -> Int { } ``` -## Scala +### Scala: + +104.二叉树的最大深度 -### 104.二叉树的最大深度 递归法: ```scala object Solution { @@ -934,7 +941,7 @@ object Solution { } ``` -### 559.n叉树的最大深度 +559.n叉树的最大深度 递归法: ```scala @@ -972,8 +979,8 @@ object Solution { } ``` -## rust -### 0104.二叉树的最大深度 +### Rust: +0104.二叉树的最大深度 递归: ```rust From 600a42730c360df82e626ce91e27efc00342b310 Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Fri, 21 Jul 2023 15:03:31 +0800 Subject: [PATCH 2080/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200111.=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?=20=E6=8E=92=E7=89=88=E6=A0=BC=E5=BC=8F=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...00\345\260\217\346\267\261\345\272\246.md" | 31 ++++++++++--------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git "a/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" "b/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" index a1fc8a9355..61f9beb785 100644 --- "a/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" +++ "b/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" @@ -26,9 +26,11 @@ 返回它的最小深度 2. -# 思路 +## 算法公开课 -《代码随想录》算法视频公开课:[看起来好像做过,一写就错! | LeetCode:111.二叉树的最小深度](https://www.bilibili.com/video/BV1QD4y1B7e2),相信结合视频在看本篇题解,更有助于大家对本题的理解。 +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[看起来好像做过,一写就错! | LeetCode:111.二叉树的最小深度](https://www.bilibili.com/video/BV1QD4y1B7e2),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 + +## 思路 看完了这篇[104.二叉树的最大深度](https://programmercarl.com/0104.二叉树的最大深度.html),再来看看如何求最小深度。 @@ -52,7 +54,7 @@ 什么是叶子节点,左右孩子都为空的节点才是叶子节点! -## 递归法 +### 递归法 来来来,一起递归三部曲: @@ -199,7 +201,7 @@ public: }; ``` -## 迭代法 +### 迭代法 相对于[104.二叉树的最大深度](https://programmercarl.com/0104.二叉树的最大深度.html),本题还可以使用层序遍历的方式来解决,思路是一样的。 @@ -237,10 +239,10 @@ public: ``` -# 其他语言版本 +## 其他语言版本 -## Java +### Java: ```Java class Solution { @@ -300,7 +302,7 @@ class Solution { } ``` -## Python +### Python : 递归法(版本一) @@ -400,9 +402,7 @@ class Solution: return depth ``` - - -## Go +### Go: ```go /** @@ -463,7 +463,7 @@ func minDepth(root *TreeNode) int { ``` -## JavaScript +### JavaScript: 递归法: @@ -509,7 +509,7 @@ var minDepth = function(root) { }; ``` -## TypeScript +### TypeScript: > 递归法 @@ -547,7 +547,7 @@ function minDepth(root: TreeNode | null): number { }; ``` -## Swift +### Swift: > 递归 ```Swift @@ -594,7 +594,7 @@ func minDepth(_ root: TreeNode?) -> Int { ``` -## Scala +### Scala: 递归法: ```scala @@ -633,7 +633,8 @@ object Solution { } ``` -rust: +### Rust: + ```rust impl Solution { // 递归 From 40f0e737046592e9b32075f7dad43b305158f90b Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Fri, 21 Jul 2023 15:08:43 +0800 Subject: [PATCH 2081/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200222.=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=20=E6=8E=92=E7=89=88=E6=A0=BC=E5=BC=8F?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...02\347\202\271\344\270\252\346\225\260.md" | 41 ++++++++++--------- 1 file changed, 21 insertions(+), 20 deletions(-) diff --git "a/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" "b/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" index 795a6f3777..d54f9b85d2 100644 --- "a/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" +++ "b/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" @@ -29,14 +29,17 @@ * 0 <= Node.val <= 5 * 10^4 * 题目数据保证输入的树是 完全二叉树 +## 算法公开课 -# 思路 +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[要理解普通二叉树和完全二叉树的区别! | LeetCode:222.完全二叉树节点的数量](https://www.bilibili.com/video/BV1eW4y1B7pD),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 + + +## 思路 -《代码随想录》算法视频公开课:[要理解普通二叉树和完全二叉树的区别! | LeetCode:222.完全二叉树节点的数量](https://www.bilibili.com/video/BV1eW4y1B7pD),相信结合视频在看本篇题解,更有助于大家对本题的理解。 本篇给出按照普通二叉树的求法以及利用完全二叉树性质的求法。 -## 普通二叉树 +### 普通二叉树 首先按照普通二叉树的逻辑来求。 @@ -44,7 +47,7 @@ 递归遍历的顺序依然是后序(左右中)。 -### 递归 +#### 递归 如果对求二叉树深度还不熟悉的话,看这篇:[二叉树:看看这些树的最大深度](https://programmercarl.com/0104.二叉树的最大深度.html)。 @@ -112,7 +115,7 @@ public: **网上基本都是这个精简的代码版本,其实不建议大家照着这个来写,代码确实精简,但隐藏了一些内容,连遍历的顺序都看不出来,所以初学者建议学习版本一的代码,稳稳的打基础**。 -### 迭代法 +#### 迭代 如果对求二叉树层序遍历还不熟悉的话,看这篇:[二叉树:层序遍历登场!](https://programmercarl.com/0102.二叉树的层序遍历.html)。 @@ -142,7 +145,7 @@ public: * 时间复杂度:O(n) * 空间复杂度:O(n) -## 完全二叉树 +### 完全二叉树 以上方法都是按照普通二叉树来做的,对于完全二叉树特性不了解的同学可以看这篇 [关于二叉树,你该了解这些!](https://programmercarl.com/二叉树理论基础.html),这篇详细介绍了各种二叉树的特性。 @@ -249,9 +252,9 @@ public: * 时间复杂度:O(log n × log n) * 空间复杂度:O(log n) -# 其他语言版本 +## 其他语言版本 -## Java +### Java: ```java class Solution { // 通用递归解法 @@ -312,7 +315,7 @@ class Solution { } ``` -## Python +### Python: 递归法: ```python @@ -408,7 +411,7 @@ class Solution: # 利用完全二叉树特性 return 1+self.countNodes(root.left)+self.countNodes(root.right) ``` -## Go +### Go: 递归版本 @@ -488,9 +491,7 @@ func countNodes(root *TreeNode) int { } ``` - - -## JavaScript: +### JavaScript: 递归版本 ```javascript @@ -559,7 +560,7 @@ var countNodes = function(root) { }; ``` -## TypeScrpt: +### TypeScrpt: > 递归法 @@ -614,7 +615,7 @@ function countNodes(root: TreeNode | null): number { }; ``` -## C: +### C: 递归法 ```c @@ -690,7 +691,7 @@ int countNodes(struct TreeNode* root){ } ``` -## Swift: +### Swift: > 递归 ```swift @@ -758,7 +759,7 @@ func countNodes(_ root: TreeNode?) -> Int { } ``` -## Scala +### Scala: 递归: ```scala @@ -821,9 +822,9 @@ object Solution { } ``` -rust: +### Rust: -// 递归 +递归 ```rust use std::cell::RefCell; use std::rc::Rc; @@ -838,7 +839,7 @@ impl Solution { } ``` -// 迭代 +迭代 ```rust use std::rc::Rc; use std::cell::RefCell; From ff6ff4adb86b80bc748c34f5f1c679f08d9c1ec2 Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Fri, 21 Jul 2023 15:12:28 +0800 Subject: [PATCH 2082/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200110.=E5=B9=B3?= =?UTF-8?q?=E8=A1=A1=E4=BA=8C=E5=8F=89=E6=A0=91=20=E6=8E=92=E7=89=88?= =?UTF-8?q?=E6=A0=BC=E5=BC=8F=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...241\344\272\214\345\217\211\346\240\221.md" | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git "a/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" "b/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" index e10a612afd..c7df9c8f19 100644 --- "a/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" @@ -33,8 +33,9 @@ 返回 false 。 +## 算法公开课 -**《代码随想录》算法视频公开课:[后序遍历求高度,高度判断是否平衡 | LeetCode:110.平衡二叉树](https://www.bilibili.com/video/BV1Ug411S7my),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[后序遍历求高度,高度判断是否平衡 | LeetCode:110.平衡二叉树](https://www.bilibili.com/video/BV1Ug411S7my),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 ## 题外话 @@ -357,7 +358,7 @@ public: ## 其他语言版本 -### Java +### Java: ```Java class Solution { @@ -498,7 +499,7 @@ class Solution { } ``` -### Python +### Python: 递归法: @@ -620,7 +621,7 @@ class Solution: height_map[real_node] = 1 + max(left, right) return True ``` -### Go +### Go: ```Go func isBalanced(root *TreeNode) bool { @@ -652,7 +653,7 @@ func max(a, b int) int { } ``` -### JavaScript +### JavaScript: 递归法: @@ -723,7 +724,7 @@ var isBalanced = function (root) { }; ``` -### TypeScript +### TypeScript: ```typescript // 递归法 @@ -741,7 +742,7 @@ function isBalanced(root: TreeNode | null): boolean { }; ``` -### C +### C: 递归法: @@ -876,7 +877,7 @@ func getHeight(_ root: TreeNode?) -> Int { } ``` -### rust +### Rust: 递归 @@ -912,3 +913,4 @@ impl Solution { + From 95b5bb195d5af819f553cafaede57fd4c990a96d Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Fri, 21 Jul 2023 15:18:37 +0800 Subject: [PATCH 2083/3019] =?UTF-8?q?0257.=E4=BA=8C=E5=8F=89=E6=A0=91?= =?UTF-8?q?=E7=9A=84=E6=89=80=E6=9C=89=E8=B7=AF=E5=BE=84=20=E6=8E=92?= =?UTF-8?q?=E7=89=88=E6=A0=BC=E5=BC=8F=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...00\346\234\211\350\267\257\345\276\204.md" | 43 +++++++++---------- 1 file changed, 20 insertions(+), 23 deletions(-) diff --git "a/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" "b/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" index 061535072d..44c0fd85e3 100644 --- "a/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" +++ "b/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" @@ -18,9 +18,11 @@ 示例: ![257.二叉树的所有路径1](https://code-thinking-1253855093.file.myqcloud.com/pics/2021020415161576.png) -# 思路 +## 算法公开课 -**《代码随想录》算法视频公开课:[递归中带着回溯,你感受到了没?| LeetCode:257. 二叉树的所有路径](https://www.bilibili.com/video/BV1ZG411G7Dh),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html)::[递归中带着回溯,你感受到了没?| LeetCode:257. 二叉树的所有路径](https://www.bilibili.com/video/BV1ZG411G7Dh),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 + +## 思路 这道题目要求从根节点到叶子的路径,所以需要前序遍历,这样才方便让父节点指向孩子节点,找到对应的路径。 @@ -32,7 +34,7 @@ 我们先使用递归的方式,来做前序遍历。**要知道递归和回溯就是一家的,本题也需要回溯。** -## 递归 +### 递归 1. 递归函数参数以及返回值 @@ -305,7 +307,7 @@ public: **综合以上,第二种递归的代码虽然精简但把很多重要的点隐藏在了代码细节里,第一种递归写法虽然代码多一些,但是把每一个逻辑处理都完整的展现出来了。** -## 拓展 +### 拓展 这里讲解本题解的写法逻辑以及一些更具体的细节,下面的讲解中,涉及到C++语法特性,如果不是C++的录友,就可以不看了,避免越看越晕。 @@ -328,7 +330,7 @@ public: 所以,第一个代码版本中,我才使用 vector 类型的path,这样方便给大家演示代码中回溯的操作。 vector类型的path,不管 每次 路径收集的数字是几位数,总之一定是int,所以就一次 pop_back就可以。 -## 迭代法 +### 迭代法 至于非递归的方式,我们可以依然可以使用前序遍历的迭代方式来模拟遍历路径的过程,对该迭代方式不了解的同学,可以看文章[二叉树:听说递归能做的,栈也能做!](https://programmercarl.com/二叉树的迭代遍历.html)和[二叉树:前中后序迭代方式统一写法](https://programmercarl.com/二叉树的统一迭代法.html)。 @@ -368,7 +370,7 @@ public: ``` 当然,使用java的同学,可以直接定义一个成员变量为object的栈`Stack stack = new Stack<>();`,这样就不用定义两个栈了,都放到一个栈里就可以了。 -# 总结 +## 总结 **本文我们开始初步涉及到了回溯,很多同学过了这道题目,可能都不知道自己其实使用了回溯,回溯和递归都是相伴相生的。** @@ -380,13 +382,9 @@ public: 对于本题充分了解递归与回溯的过程之后,有精力的同学可以再去实现迭代法。 +## 其他语言版本 - - - -# 其他语言版本 - -## Java: +### Java: ```Java //解法一 @@ -492,9 +490,9 @@ class Solution { } ``` --- -## Python: - - +### Python: + + 递归法+回溯 ```Python # Definition for a binary tree node. @@ -552,7 +550,7 @@ class Solution: self.traversal(cur.right, path[:], result) ``` - + 递归法+隐形回溯(版本二) ```Python # Definition for a binary tree node. @@ -610,7 +608,7 @@ class Solution: --- -## Go: +### Go: 递归法: @@ -672,7 +670,7 @@ func binaryTreePaths(root *TreeNode) []string { ``` --- -## JavaScript: +### JavaScript: 递归法: @@ -725,7 +723,7 @@ var binaryTreePaths = function(root) { }; ``` -## TypeScript: +### TypeScript: > 递归法 @@ -779,7 +777,7 @@ function binaryTreePaths(root: TreeNode | null): string[] { }; ``` -## Swift: +### Swift: > 递归/回溯 ```swift @@ -846,7 +844,7 @@ func binaryTreePaths(_ root: TreeNode?) -> [String] { } ``` -## Scala: +### Scala: 递归: ```scala @@ -876,7 +874,7 @@ object Solution { } ``` -rust: +### Rust: ```rust // 递归 @@ -907,4 +905,3 @@ impl Solution { - From a9039c0d2dd2c625c98009998677b20089b46524 Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Fri, 21 Jul 2023 17:39:36 +0800 Subject: [PATCH 2084/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20404.=E5=B7=A6?= =?UTF-8?q?=E5=8F=B6=E5=AD=90=E4=B9=8B=E5=92=8C=20=E6=8E=92=E7=89=88?= =?UTF-8?q?=E6=A0=BC=E5=BC=8F=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...66\345\255\220\344\271\213\345\222\214.md" | 29 ++++++++++--------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git "a/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" "b/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" index aa2868df4e..c1ad602d5f 100644 --- "a/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" +++ "b/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" @@ -16,9 +16,9 @@ ![404.左叶子之和1](https://code-thinking-1253855093.file.myqcloud.com/pics/20210204151927654.png) -## 视频讲解 +## 算法公开课 -**《代码随想录》算法视频公开课:[二叉树的题目中,总有一些规则让你找不到北 | LeetCode:404.左叶子之和](https://www.bilibili.com/video/BV1GY4y1K7z8),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html)::[二叉树的题目中,总有一些规则让你找不到北 | LeetCode:404.左叶子之和](https://www.bilibili.com/video/BV1GY4y1K7z8),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 ## 思路 @@ -48,7 +48,7 @@ if (node->left != NULL && node->left->left == NULL && node->left->right == NULL) } ``` -## 递归法 +### 递归法 递归的遍历顺序为后序遍历(左右中),是因为要通过递归函数的返回值来累加求取左叶子数值之和。 @@ -131,11 +131,11 @@ public: return leftValue + sumOfLeftLeaves(root->left) + sumOfLeftLeaves(root->right); } }; -``` +``` 精简之后的代码其实看不出来用的是什么遍历方式了,对于算法初学者以上根据第一个版本来学习。 -## 迭代法 +### 迭代法 本题迭代法使用前中后序都是可以的,只要把左叶子节点统计出来,就可以了,那么参考文章 [二叉树:听说递归能做的,栈也能做!](https://programmercarl.com/二叉树的迭代遍历.html)和[二叉树:迭代法统一写法](https://programmercarl.com/二叉树的统一迭代法.html)中的写法,可以写出一个前序遍历的迭代法。 @@ -177,7 +177,7 @@ public: ## 其他语言版本 -### Java +### Java: **递归** @@ -246,7 +246,7 @@ class Solution { ``` -### Python +### Python: 递归 ```python # Definition for a binary tree node. @@ -316,7 +316,7 @@ class Solution: ``` -### Go +### Go: **递归法** @@ -368,7 +368,7 @@ func sumOfLeftLeaves(root *TreeNode) int { ``` -### JavaScript +### JavaScript: **递归法** @@ -417,7 +417,7 @@ var sumOfLeftLeaves = function(root) { }; ``` -### TypeScript +### TypeScript: > 递归法 @@ -462,7 +462,7 @@ function sumOfLeftLeaves(root: TreeNode | null): number { }; ``` -### Swift +### Swift: **递归法** ```swift @@ -511,7 +511,7 @@ func sumOfLeftLeaves(_ root: TreeNode?) -> Int { } ``` -### C +### C: 递归法: ```c int sumOfLeftLeaves(struct TreeNode* root){ @@ -561,7 +561,7 @@ int sumOfLeftLeaves(struct TreeNode* root){ } ``` -### Scala +### Scala: **递归:** ```scala @@ -600,7 +600,7 @@ object Solution { } ``` -### Rust +### Rust: **递归** @@ -656,3 +656,4 @@ impl Solution { + From f3a370113058a82be88164ddeabf5443f82f62a0 Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Fri, 21 Jul 2023 17:41:28 +0800 Subject: [PATCH 2085/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20513.=E6=89=BE?= =?UTF-8?q?=E6=A0=91=E5=B7=A6=E4=B8=8B=E8=A7=92=E7=9A=84=E5=80=BC=20?= =?UTF-8?q?=E6=8E=92=E7=89=88=E6=A0=BC=E5=BC=8F=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...246\344\270\213\350\247\222\347\232\204\345\200\274.md" | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git "a/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" "b/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" index 743b0df9be..7ef934cc88 100644 --- "a/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" +++ "b/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" @@ -20,9 +20,9 @@ ![513.找树左下角的值1](https://code-thinking-1253855093.file.myqcloud.com/pics/20210204153017586.png) -## 视频讲解 +## 算法公开课 -**《代码随想录》算法视频公开课:[怎么找二叉树的左下角? 递归中又带回溯了,怎么办?| LeetCode:513.找二叉树左下角的值](https://www.bilibili.com/video/BV1424y1Z7pn),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[怎么找二叉树的左下角? 递归中又带回溯了,怎么办?| LeetCode:513.找二叉树左下角的值](https://www.bilibili.com/video/BV1424y1Z7pn),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 ## 思路 @@ -614,7 +614,7 @@ object Solution { } ``` -### rust +### Rust **层序遍历** @@ -689,3 +689,4 @@ impl Solution { + From bf6c4e7f7b3c8f118960362ab735f8e4977e0e58 Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Fri, 21 Jul 2023 17:53:29 +0800 Subject: [PATCH 2086/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200112.=E8=B7=AF?= =?UTF-8?q?=E5=BE=84=E6=80=BB=E5=92=8C=20=E6=8E=92=E7=89=88=E6=A0=BC?= =?UTF-8?q?=E5=BC=8F=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...57\345\276\204\346\200\273\345\222\214.md" | 75 ++++++++++--------- 1 file changed, 39 insertions(+), 36 deletions(-) diff --git "a/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" "b/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" index 39285a3bc1..240462b6ff 100644 --- "a/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" +++ "b/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" @@ -21,9 +21,9 @@ 返回 true, 因为存在目标和为 22 的根节点到叶子节点的路径 5->4->11->2。 -## 视频讲解 +## 算法公开课 -**《代码随想录》算法视频公开课:[拿不准的遍历顺序,搞不清的回溯过程,我太难了! | LeetCode:112. 路径总和](https://www.bilibili.com/video/BV19t4y1L7CR),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[拿不准的遍历顺序,搞不清的回溯过程,我太难了! | LeetCode:112. 路径总和](https://www.bilibili.com/video/BV19t4y1L7CR),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 ## 思路 @@ -32,8 +32,8 @@ 那么接下来我通过详细讲解如下两道题,来回答这个问题: -* 112.路径总和 -* 113.路径总和ii +* [112.路径总和](https://leetcode.cn/problems/path-sum/) +* [113.路径总和ii](https://leetcode.cn/problems/path-sum-ii/) 这道题我们要遍历从根节点到叶子节点的路径看看总和是不是目标和。 @@ -218,7 +218,9 @@ public: 如果大家完全理解了本题的递归方法之后,就可以顺便把leetcode上113. 路径总和ii做了。 -# 113. 路径总和ii +## 相关题目推荐 + +### 113. 路径总和ii [力扣题目链接](https://leetcode.cn/problems/path-sum-ii/) @@ -232,7 +234,7 @@ public: ![113.路径总和ii1.png](https://code-thinking-1253855093.file.myqcloud.com/pics/20210203160854654.png) -## 思路 +### 思路 113.路径总和ii要遍历整个树,找到所有路径,**所以递归函数不要返回值!** @@ -289,7 +291,7 @@ public: 至于113. 路径总和ii 的迭代法我并没有写,用迭代方式记录所有路径比较麻烦,也没有必要,如果大家感兴趣的话,可以再深入研究研究。 -## 总结 +### 总结 本篇通过leetcode上112. 路径总和 和 113. 路径总和ii 详细的讲解了 递归函数什么时候需要返回值,什么不需要返回值。 @@ -300,11 +302,11 @@ public: -# 其他语言版本 +## 其他语言版本 -## java +### Java -### 0112.路径总和 +#### 0112.路径总和 ```java class solution { @@ -422,7 +424,7 @@ class solution { } ``` -### 0113.路径总和-ii +#### 0113.路径总和-ii ```java class solution { @@ -529,9 +531,9 @@ class Solution { } ``` -## python +### Python -### 0112.路径总和 +#### 0112.路径总和 (版本一) 递归 ```python @@ -618,7 +620,7 @@ class Solution: -### 0113.路径总和-ii +#### 0113.路径总和-ii (版本一) 递归 ```python @@ -719,9 +721,9 @@ class Solution: ``` -## go +### Go -### 112. 路径总和 +#### 112. 路径总和 ```go //递归法 @@ -746,7 +748,7 @@ func hasPathSum(root *TreeNode, targetSum int) bool { } ``` -### 113. 路径总和 II +#### 113. 路径总和 II ```go /** @@ -786,9 +788,9 @@ func traverse(node *TreeNode, result *[][]int, currPath *[]int, targetSum int) { } ``` -## javascript +### Javascript -### 0112.路径总和 +#### 0112.路径总和 **递归** @@ -852,7 +854,7 @@ let hasPathSum = function(root, targetSum) { }; ``` -### 0113.路径总和-ii +#### 0113.路径总和-ii **递归** @@ -950,9 +952,9 @@ let pathSum = function(root, targetSum) { }; ``` -## TypeScript +### TypeScript -### 0112.路径总和 +#### 0112.路径总和 **递归法:** @@ -1034,7 +1036,7 @@ function hasPathSum(root: TreeNode | null, targetSum: number): boolean { }; ``` -### 0112.路径总和 ii +#### 0112.路径总和 ii **递归法:** @@ -1070,9 +1072,9 @@ function pathSum(root: TreeNode | null, targetSum: number): number[][] { }; ``` -## Swift +### Swift -### 0112.路径总和 +#### 0112.路径总和 **递归** @@ -1141,7 +1143,7 @@ func hasPathSum(_ root: TreeNode?, _ targetSum: Int) -> Bool { } ``` -### 0113.路径总和 II +#### 0113.路径总和 II **递归** @@ -1192,10 +1194,10 @@ func traversal(_ cur: TreeNode?, count: Int) { } ``` -## C +### C -> 0112.路径总和 -> 递归法: +#### 0112.路径总和 +递归法: ```c bool hasPathSum(struct TreeNode* root, int targetSum){ @@ -1252,7 +1254,7 @@ bool hasPathSum(struct TreeNode* root, int targetSum){ } ``` -> 0113.路径总和 II +#### 0113.路径总和 II ```c int** ret; @@ -1317,9 +1319,9 @@ int** pathSum(struct TreeNode* root, int targetSum, int* returnSize, int** retur } ``` -## Scala +### Scala -### 0112.路径总和 +#### 0112.路径总和 **递归:** @@ -1369,7 +1371,7 @@ object Solution { } ``` -### 0113.路径总和 II +#### 0113.路径总和 II **递归:** @@ -1405,9 +1407,9 @@ object Solution { } ``` -## rust +### Rust -### 112.路径总和.md +#### 0112.路径总和 递归: @@ -1461,7 +1463,7 @@ impl Solution { } ``` -### 113.路径总和-ii +#### 0113.路径总和-ii ```rust impl Solution { @@ -1514,3 +1516,4 @@ impl Solution { + From fe9323900758c0f056299728d1551ab57d1efab3 Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Fri, 21 Jul 2023 18:00:07 +0800 Subject: [PATCH 2087/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200106.=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?=20=E6=8E=92=E7=89=88=E6=A0=BC=E5=BC=8F=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...40\344\272\214\345\217\211\346\240\221.md" | 40 +++++++++---------- ...57\345\276\204\346\200\273\345\222\214.md" | 38 +++++++++--------- 2 files changed, 37 insertions(+), 41 deletions(-) diff --git "a/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" "b/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" index a0bab99974..0144fc5c05 100644 --- "a/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" @@ -29,9 +29,9 @@ ![106. 从中序与后序遍历序列构造二叉树1](https://code-thinking-1253855093.file.myqcloud.com/pics/20210203154316774.png) -# 视频讲解 +## 算法公开课 -**《代码随想录》算法视频公开课:[坑很多!来看看你掉过几次坑 | LeetCode:106.从中序与后序遍历序列构造二叉树](https://www.bilibili.com/video/BV1vW4y1i7dn),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[坑很多!来看看你掉过几次坑 | LeetCode:106.从中序与后序遍历序列构造二叉树](https://www.bilibili.com/video/BV1vW4y1i7dn),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 ## 思路 @@ -158,8 +158,6 @@ root->right = traversal(rightInorder, rightPostorder); 完整代码如下: -### C++完整代码 - ```CPP class Solution { private: @@ -281,8 +279,6 @@ public: 下面给出用下标索引写出的代码版本:(思路是一样的,只不过不用重复定义vector了,每次用下标索引来分割) -### C++优化版本 - ```CPP class Solution { private: @@ -400,8 +396,9 @@ public: }; ``` +## 相关题目推荐 -# 105.从前序与中序遍历序列构造二叉树 +### 105.从前序与中序遍历序列构造二叉树 [力扣题目链接](https://leetcode.cn/problems/construct-binary-tree-from-preorder-and-inorder-traversal/) @@ -418,7 +415,7 @@ public: ![105. 从前序与中序遍历序列构造二叉树](https://code-thinking-1253855093.file.myqcloud.com/pics/20210203154626672.png) -## 思路 +### 思路 本题和106是一样的道理。 @@ -547,7 +544,7 @@ public: }; ``` -# 思考题 +## 思考题 前序和中序可以唯一确定一棵二叉树。 @@ -569,7 +566,7 @@ tree2 的前序遍历是[1 2 3], 后序遍历是[3 2 1]。 所以前序和后序不能唯一确定一棵二叉树! -# 总结 +## 总结 之前我们讲的二叉树题目都是各种遍历二叉树,这次开始构造二叉树了,思路其实比较简单,但是真正代码实现出来并不容易。 @@ -585,9 +582,9 @@ tree2 的前序遍历是[1 2 3], 后序遍历是[3 2 1]。 -# 其他语言版本 +## 其他语言版本 -## Java +### Java 106.从中序与后序遍历序列构造二叉树 @@ -688,7 +685,7 @@ class Solution { } ``` -## Python +### Python 105.从前序与中序遍历序列构造二叉树 @@ -754,7 +751,7 @@ class Solution: return root ``` -## Go +### Go 106 从中序与后序遍历序列构造二叉树 @@ -833,9 +830,7 @@ func build(pre []int, in []int, root int, l, r int) *TreeNode { ``` - - -## JavaScript +### JavaScript ```javascript var buildTree = function(inorder, postorder) { @@ -863,7 +858,7 @@ var buildTree = function(preorder, inorder) { }; ``` -## TypeScript +### TypeScript > 106.从中序与后序遍历序列构造二叉树 @@ -969,7 +964,7 @@ function buildTree(preorder: number[], inorder: number[]): TreeNode | null { }; ``` -## C +### C 106 从中序与后序遍历序列构造二叉树 @@ -1047,7 +1042,7 @@ struct TreeNode* buildTree(int* preorder, int preorderSize, int* inorder, int in } ``` -## Swift +### Swift 105 从前序与中序遍历序列构造二叉树 @@ -1140,7 +1135,7 @@ class Solution_0106 { } ``` -## Scala +### Scala 106 从中序与后序遍历序列构造二叉树 @@ -1188,7 +1183,7 @@ object Solution { } ``` -## rust +### Rust 106 从中序与后序遍历序列构造二叉树 @@ -1238,3 +1233,4 @@ impl Solution { + diff --git "a/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" "b/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" index 240462b6ff..be03f719e1 100644 --- "a/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" +++ "b/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" @@ -306,7 +306,7 @@ public: ### Java -#### 0112.路径总和 +0112.路径总和 ```java class solution { @@ -424,7 +424,7 @@ class solution { } ``` -#### 0113.路径总和-ii +0113.路径总和-ii ```java class solution { @@ -533,7 +533,7 @@ class Solution { ### Python -#### 0112.路径总和 +0112.路径总和 (版本一) 递归 ```python @@ -620,7 +620,7 @@ class Solution: -#### 0113.路径总和-ii +0113.路径总和-ii (版本一) 递归 ```python @@ -723,7 +723,7 @@ class Solution: ``` ### Go -#### 112. 路径总和 +112. 路径总和 ```go //递归法 @@ -748,7 +748,7 @@ func hasPathSum(root *TreeNode, targetSum int) bool { } ``` -#### 113. 路径总和 II +113. 路径总和 II ```go /** @@ -790,7 +790,7 @@ func traverse(node *TreeNode, result *[][]int, currPath *[]int, targetSum int) { ### Javascript -#### 0112.路径总和 +0112.路径总和 **递归** @@ -854,7 +854,7 @@ let hasPathSum = function(root, targetSum) { }; ``` -#### 0113.路径总和-ii +0113.路径总和-ii **递归** @@ -954,7 +954,7 @@ let pathSum = function(root, targetSum) { ### TypeScript -#### 0112.路径总和 +0112.路径总和 **递归法:** @@ -1036,7 +1036,7 @@ function hasPathSum(root: TreeNode | null, targetSum: number): boolean { }; ``` -#### 0112.路径总和 ii +0112.路径总和 ii **递归法:** @@ -1074,7 +1074,7 @@ function pathSum(root: TreeNode | null, targetSum: number): number[][] { ### Swift -#### 0112.路径总和 +0112.路径总和 **递归** @@ -1143,7 +1143,7 @@ func hasPathSum(_ root: TreeNode?, _ targetSum: Int) -> Bool { } ``` -#### 0113.路径总和 II +0113.路径总和 II **递归** @@ -1196,7 +1196,8 @@ func traversal(_ cur: TreeNode?, count: Int) { ### C -#### 0112.路径总和 +0112.路径总和 + 递归法: ```c @@ -1254,7 +1255,7 @@ bool hasPathSum(struct TreeNode* root, int targetSum){ } ``` -#### 0113.路径总和 II +0113.路径总和 II ```c int** ret; @@ -1321,7 +1322,7 @@ int** pathSum(struct TreeNode* root, int targetSum, int* returnSize, int** retur ### Scala -#### 0112.路径总和 +0112.路径总和 **递归:** @@ -1371,7 +1372,7 @@ object Solution { } ``` -#### 0113.路径总和 II +0113.路径总和 II **递归:** @@ -1409,7 +1410,7 @@ object Solution { ### Rust -#### 0112.路径总和 +0112.路径总和 递归: @@ -1463,7 +1464,7 @@ impl Solution { } ``` -#### 0113.路径总和-ii +0113.路径总和-ii ```rust impl Solution { @@ -1516,4 +1517,3 @@ impl Solution { - From b4eefe985945fdeaf4e1e34ebbc90b74258d43e2 Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Fri, 21 Jul 2023 18:54:16 +0800 Subject: [PATCH 2088/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200654.=E6=9C=80?= =?UTF-8?q?=E5=A4=A7=E4=BA=8C=E5=8F=89=E6=A0=91=20=E6=8E=92=E7=89=88?= =?UTF-8?q?=E6=A0=BC=E5=BC=8F=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...200\345\244\247\344\272\214\345\217\211\346\240\221.md" | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git "a/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" "b/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" index 33a9176ed1..77d7980f3d 100644 --- "a/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" @@ -25,9 +25,9 @@ 给定的数组的大小在 [1, 1000] 之间。 -## 视频讲解 +## 算法公开课 -**《代码随想录》算法视频公开课:[又是构造二叉树,又有很多坑!| LeetCode:654.最大二叉树](https://www.bilibili.com/video/BV1MG411G7ox),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[又是构造二叉树,又有很多坑!| LeetCode:654.最大二叉树](https://www.bilibili.com/video/BV1MG411G7ox),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 ## 思路 @@ -310,7 +310,7 @@ class Solution: def constructMaximumBinaryTree(self, nums: List[int]) -> TreeNode: return self.traversal(nums, 0, len(nums)) - ``` +``` (版本三) 使用切片 @@ -587,3 +587,4 @@ impl Solution { + From eadc704c38816cfdb7f21f22d3489dc38ea5aecc Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Fri, 21 Jul 2023 20:18:53 +0800 Subject: [PATCH 2089/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200617.=E5=90=88?= =?UTF-8?q?=E5=B9=B6=E4=BA=8C=E5=8F=89=E6=A0=91=20=E6=8E=92=E7=89=88?= =?UTF-8?q?=E6=A0=BC=E5=BC=8F=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...0\345\271\266\344\272\214\345\217\211\346\240\221.md" | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git "a/problems/0617.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md" "b/problems/0617.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md" index 18a245c4db..44092aaebc 100644 --- "a/problems/0617.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0617.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md" @@ -19,9 +19,9 @@ 注意: 合并必须从两个树的根节点开始。 -# 视频讲解 +# 算法公开课 -**《代码随想录》算法视频公开课:[一起操作两个二叉树?有点懵!| LeetCode:617.合并二叉树](https://www.bilibili.com/video/BV1m14y1Y7JK),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[一起操作两个二叉树?有点懵!| LeetCode:617.合并二叉树](https://www.bilibili.com/video/BV1m14y1Y7JK),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 ## 思路 @@ -164,7 +164,7 @@ public: }; ``` -## 迭代法 +### 迭代法 使用迭代法,如何同时处理两棵树呢? @@ -716,7 +716,7 @@ object Solution { } ``` -### rust +### Rust 递归: @@ -793,4 +793,3 @@ impl Solution { - From ac239bc437cfa8de6859fa8a98cc04b9cf6d1d4c Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Fri, 21 Jul 2023 20:20:25 +0800 Subject: [PATCH 2090/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200700.=E4=BA=8C?= =?UTF-8?q?=E5=8F=89=E6=90=9C=E7=B4=A2=E6=A0=91=E4=B8=AD=E7=9A=84=E6=90=9C?= =?UTF-8?q?=E7=B4=A2=20=E6=8E=92=E7=89=88=E6=A0=BC=E5=BC=8F=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...221\344\270\255\347\232\204\346\220\234\347\264\242.md" | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git "a/problems/0700.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\220\234\347\264\242.md" "b/problems/0700.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\220\234\347\264\242.md" index 13064f9717..bc21bab872 100644 --- "a/problems/0700.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\220\234\347\264\242.md" +++ "b/problems/0700.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\220\234\347\264\242.md" @@ -18,9 +18,9 @@ 在上述示例中,如果要找的值是 5,但因为没有节点值为 5,我们应该返回 NULL。 -# 视频讲解 +## 算法公开课 -**《代码随想录》算法视频公开课:[不愧是搜索树,这次搜索有方向了!| LeetCode:700.二叉搜索树中的搜索](https://www.bilibili.com/video/BV1wG411g7sF),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[不愧是搜索树,这次搜索有方向了!| LeetCode:700.二叉搜索树中的搜索](https://www.bilibili.com/video/BV1wG411g7sF),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 ## 思路 @@ -415,7 +415,7 @@ object Solution { } ``` -### rust +### Rust 递归: @@ -469,3 +469,4 @@ impl Solution { + From 7746734d79d4726143375aaf1a8a8f835483346e Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Fri, 21 Jul 2023 20:22:33 +0800 Subject: [PATCH 2091/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200098.=E9=AA=8C?= =?UTF-8?q?=E8=AF=81=E4=BA=8C=E5=8F=89=E6=90=9C=E7=B4=A2=E6=A0=91=20?= =?UTF-8?q?=E6=8E=92=E7=89=88=E6=A0=BC=E5=BC=8F=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...11\346\220\234\347\264\242\346\240\221.md" | 29 ++++++++++--------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git "a/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" index 95b657a58f..a48ec0656b 100644 --- "a/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" +++ "b/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" @@ -20,18 +20,18 @@ ![98.验证二叉搜索树](https://code-thinking-1253855093.file.myqcloud.com/pics/20230310000750.png) -# 视频讲解 +## 算法公开课 -**《代码随想录》算法视频公开课:[你对二叉搜索树了解的还不够! | LeetCode:98.验证二叉搜索树](https://www.bilibili.com/video/BV18P411n7Q4),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[你对二叉搜索树了解的还不够! | LeetCode:98.验证二叉搜索树](https://www.bilibili.com/video/BV18P411n7Q4),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 -# 思路 +## 思路 要知道中序遍历下,输出的二叉搜索树节点的数值是有序序列。 有了这个特性,**验证二叉搜索树,就相当于变成了判断一个序列是不是递增的了。** -## 递归法 +### 递归法 可以递归中序遍历将二叉搜索树转变成一个数组,代码如下: @@ -211,7 +211,7 @@ public: 最后这份代码看上去整洁一些,思路也清晰。 -## 迭代法 +### 迭代法 可以用迭代法模拟二叉树中序遍历,对前中后序迭代法生疏的同学可以看这两篇[二叉树:听说递归能做的,栈也能做!](https://programmercarl.com/二叉树的迭代遍历.html),[二叉树:前中后序迭代方式统一写法](https://programmercarl.com/二叉树的统一迭代法.html) @@ -245,7 +245,7 @@ public: 在[二叉树:二叉搜索树登场!](https://programmercarl.com/0700.二叉搜索树中的搜索.html)中我们分明写出了痛哭流涕的简洁迭代法,怎么在这里不行了呢,因为本题是要验证二叉搜索树啊。 -# 总结 +## 总结 这道题目是一个简单题,但对于没接触过的同学还是有难度的。 @@ -254,10 +254,10 @@ public: 只要把基本类型的题目都做过,总结过之后,思路自然就开阔了。 -# 其他语言版本 +## 其他语言版本 -## Java +### Java ```Java //使用統一迭代法 @@ -369,7 +369,7 @@ class Solution { } ``` -## Python +### Python 递归法(版本一)利用中序递增性质,转换成数组 ```python @@ -479,7 +479,7 @@ class Solution: ``` -## Go +### Go ```Go func isValidBST(root *TreeNode) bool { @@ -526,7 +526,7 @@ func isValidBST(root *TreeNode) bool { } ``` -## JavaScript +### JavaScript 辅助数组解决 @@ -595,7 +595,7 @@ var isValidBST = function (root) { }; ``` -## TypeScript +### TypeScript > 辅助数组解决: @@ -637,7 +637,7 @@ function isValidBST(root: TreeNode | null): boolean { }; ``` -## Scala +### Scala 辅助数组解决: ```scala @@ -682,7 +682,7 @@ object Solution { } ``` -## rust +### Rust 递归: @@ -735,3 +735,4 @@ impl Solution { + From 74bbca292355dbc8ce9316329bfea503234ef0d6 Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Fri, 21 Jul 2023 20:26:08 +0800 Subject: [PATCH 2092/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200530.=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=B7=AE=20=E6=8E=92=E7=89=88=E6=A0=BC?= =?UTF-8?q?=E5=BC=8F=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...17\347\273\235\345\257\271\345\267\256.md" | 29 ++++++++++--------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git "a/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" "b/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" index 3e4391d62c..56911858dd 100644 --- "a/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" +++ "b/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" @@ -19,12 +19,12 @@ 提示:树中至少有 2 个节点。 -# 视频讲解 +## 算法公开课 -**《代码随想录》算法视频公开课:[二叉搜索树中,需要掌握如何双指针遍历!| LeetCode:530.二叉搜索树的最小绝对差](https://www.bilibili.com/video/BV1DD4y11779),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[二叉搜索树中,需要掌握如何双指针遍历!| LeetCode:530.二叉搜索树的最小绝对差](https://www.bilibili.com/video/BV1DD4y11779),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 -# 思路 +## 思路 题目中要求在二叉搜索树上任意两节点的差的绝对值的最小值。 @@ -32,7 +32,7 @@ 遇到在二叉搜索树上求什么最值啊,差值之类的,就把它想成在一个有序数组上求最值,求差值,这样就简单多了。 -## 递归 +### 递归 那么二叉搜索树采用中序遍历,其实就是一个有序数组。 @@ -102,7 +102,7 @@ public: 是不是看上去也并不复杂! -## 迭代 +### 迭代 看过这两篇[二叉树:听说递归能做的,栈也能做!](https://programmercarl.com/二叉树的迭代遍历.html),[二叉树:前中后序迭代方式的写法就不能统一一下么?](https://programmercarl.com/二叉树的统一迭代法.html)文章之后,不难写出两种中序遍历的迭代法。 @@ -135,7 +135,7 @@ public: }; ``` -# 总结 +## 总结 **遇到在二叉搜索树上求什么最值,求差值之类的,都要思考一下二叉搜索树可是有序的,要利用好这一特点。** @@ -145,10 +145,10 @@ public: -# 其他语言版本 +## 其他语言版本 -## Java +### Java 递归 ```java @@ -235,7 +235,7 @@ class Solution { } } ``` -## Python +### Python 递归法(版本一)利用中序递增,结合数组 ```python @@ -313,7 +313,7 @@ class Solution: ``` -## Go: +### Go 中序遍历,然后计算最小差值 ```go @@ -340,7 +340,7 @@ func getMinimumDifference(root *TreeNode) int { } ``` -## JavaScript +### JavaScript 递归 先转换为有序数组 ```javascript /** @@ -415,7 +415,7 @@ var getMinimumDifference = function(root) { } ``` -## TypeScript +### TypeScript > 辅助数组解决 @@ -482,7 +482,7 @@ function getMinimumDifference(root: TreeNode | null): number { }; ``` -## Scala +### Scala 构建二叉树的有序数组: @@ -561,7 +561,7 @@ object Solution { } ``` -## rust +### Rust 构建二叉树的有序数组: @@ -652,3 +652,4 @@ impl Solution { + From c1da5bb2339fbe525eaf1cc4f09702b1caefbc1d Mon Sep 17 00:00:00 2001 From: El nino Date: Sun, 23 Jul 2023 10:12:24 +0800 Subject: [PATCH 2093/3019] =?UTF-8?q?typo=EF=BC=9B=E4=B8=BA=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E5=9D=97=E6=B7=BB=E5=8A=A0=20cpp=20=E8=AF=AD=E8=A8=80?= =?UTF-8?q?=E9=AB=98=E4=BA=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...06\350\256\272\345\237\272\347\241\200.md" | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git "a/problems/\345\233\276\350\256\272\346\267\261\346\220\234\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\345\233\276\350\256\272\346\267\261\346\220\234\347\220\206\350\256\272\345\237\272\347\241\200.md" index eb6a26fe6d..af4073f077 100644 --- "a/problems/\345\233\276\350\256\272\346\267\261\346\220\234\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\345\233\276\350\256\272\346\267\261\346\220\234\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -16,13 +16,13 @@ ## dfs 与 bfs 区别 -提到深度优先搜索(dfs),就不得不说和广度优先有什么区别(bfs) +提到深度优先搜索(dfs),就不得不说和广度优先搜索(bfs)有什么区别 先来了解dfs的过程,很多录友可能对dfs(深度优先搜索),bfs(广度优先搜索)分不清。 先给大家说一下两者大概的区别: -* dfs是可一个方向去搜,不到黄河不回头,直到遇到绝境了,搜不下去了,在换方向(换方向的过程就涉及到了回溯)。 +* dfs是可一个方向去搜,不到黄河不回头,直到遇到绝境了,搜不下去了,再换方向(换方向的过程就涉及到了回溯)。 * bfs是先把本节点所连接的所有节点遍历一遍,走到下一个节点的时候,再把连接节点的所有节点遍历一遍,搜索方向更像是广度,四面八方的搜索过程。 当然以上讲的是,大体可以这么理解,接下来 我们详细讲解dfs,(bfs在用单独一篇文章详细讲解) @@ -60,26 +60,26 @@ 上图演示中,其实我并没有把 所有的 从节点1 到节点6的dfs(深度优先搜索)的过程都画出来,那样太冗余了,但 已经把dfs 关键的地方都涉及到了,关键就两点: -* 搜索方向,是认准一个方向搜,直到碰壁之后在换方向 +* 搜索方向,是认准一个方向搜,直到碰壁之后再换方向 * 换方向是撤销原路径,改为节点链接的下一个路径,回溯的过程。 ## 代码框架 -正式因为dfs搜索可一个方向,并需要回溯,所以用递归的方式来实现是最方便的。 +正是因为dfs搜索可一个方向,并需要回溯,所以用递归的方式来实现是最方便的。 -很多录友对回溯很陌生,建议先看看码随想录,[回溯算法章节](https://programmercarl.com/回溯算法理论基础.html)。 +很多录友对回溯很陌生,建议先看看代码随想录,[回溯算法章节](https://programmercarl.com/回溯算法理论基础.html)。 有递归的地方就有回溯,那么回溯在哪里呢? 就地递归函数的下面,例如如下代码: -``` +```cpp void dfs(参数) { 处理节点 dfs(图,选择的节点); // 递归 回溯,撤销处理结果 } -``` +``` 可以看到回溯操作就在递归函数的下面,递归和回溯是相辅相成的。 @@ -89,7 +89,7 @@ void dfs(参数) { 我们在回顾一下[回溯法](https://programmercarl.com/回溯算法理论基础.html)的代码框架: -``` +```cpp void backtracking(参数) { if (终止条件) { 存放结果; @@ -102,11 +102,11 @@ void backtracking(参数) { } } -``` +``` 回溯算法,其实就是dfs的过程,这里给出dfs的代码框架: -``` +```cpp void dfs(参数) { if (终止条件) { 存放结果; @@ -136,9 +136,9 @@ void dfs(参数) { 1. 确认递归函数,参数 -``` +```cpp void dfs(参数) -``` +``` 通常我们递归的时候,我们递归搜索需要了解哪些参数,其实也可以在写递归函数的时候,发现需要什么参数,再去补充就可以。 @@ -146,7 +146,7 @@ void dfs(参数) 例如这样: -``` +```cpp vector> result; // 保存符合条件的所有路径 vector path; // 起点到终点的路径 void dfs (图,目前搜索的节点) @@ -158,7 +158,7 @@ void dfs (图,目前搜索的节点) 终止条件很重要,很多同学写dfs的时候,之所以容易死循环,栈溢出等等这些问题,都是因为终止条件没有想清楚。 -``` +```cpp if (终止条件) { 存放结果; return; @@ -173,7 +173,7 @@ if (终止条件) { 一般这里就是一个for循环的操作,去遍历 目前搜索节点 所能到的所有节点。 -``` +```cpp for (选择:本节点所连接的其他节点) { 处理节点; dfs(图,选择的节点); // 递归 From b68e881a659e4ef56446db940fbf12a6a6a09207 Mon Sep 17 00:00:00 2001 From: El nino Date: Sun, 23 Jul 2023 11:08:46 +0800 Subject: [PATCH 2094/3019] typo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index dd70d8cb6b..5fe165a71c 100644 --- a/README.md +++ b/README.md @@ -396,7 +396,7 @@ * [图论:深度优先搜索理论基础](./problems/图论深搜理论基础.md) * [图论:797.所有可能的路径](./problems/0797.所有可能的路径.md) -* [图论:广度优先搜索理论基础](./problems/图论广索理论基础.md) +* [图论:广度优先搜索理论基础](./problems/图论广搜理论基础.md) * [图论:200.岛屿数量.深搜版](./problems/0200.岛屿数量.深搜版.md) * [图论:200.岛屿数量.广搜版](./problems/0200.岛屿数量.广搜版.md) * [图论:695.岛屿的最大面积](./problems/0695.岛屿的最大面积.md) From eb9c4e647becea279c985e73fd2d4864c002b4a4 Mon Sep 17 00:00:00 2001 From: fwqaaq Date: Sun, 23 Jul 2023 17:29:22 +0800 Subject: [PATCH 2095/3019] =?UTF-8?q?Update=200392.=E5=88=A4=E6=96=AD?= =?UTF-8?q?=E5=AD=90=E5=BA=8F=E5=88=97.md=20about=20rust?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...55\345\255\220\345\272\217\345\210\227.md" | 22 ++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git "a/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" "b/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" index c10114c05a..8bb078bd5d 100644 --- "a/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" @@ -258,9 +258,25 @@ func isSubsequence(s string, t string) bool { } ``` - - - +Rust: + +```rust +impl Solution { + pub fn is_subsequence(s: String, t: String) -> bool { + let mut dp = vec![vec![0; t.len() + 1]; s.len() + 1]; + for (i, char_s) in s.chars().enumerate() { + for (j, char_t) in t.chars().enumerate() { + if char_s == char_t { + dp[i + 1][j + 1] = dp[i][j] + 1; + continue; + } + dp[i + 1][j + 1] = dp[i + 1][j] + } + } + dp[s.len()][t.len()] == s.len() + } +} +```

From 503c83db8e9323fe4a94bd824a2b19ff617780d2 Mon Sep 17 00:00:00 2001 From: fwqaaq Date: Sun, 23 Jul 2023 17:53:05 +0800 Subject: [PATCH 2096/3019] =?UTF-8?q?Update=200392.=E5=88=A4=E6=96=AD?= =?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 --- ...55\345\255\220\345\272\217\345\210\227.md" | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git "a/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" "b/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" index 8bb078bd5d..700d682510 100644 --- "a/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" @@ -278,6 +278,30 @@ impl Solution { } ``` +> 滚动数组 + +```rust +impl Solution { + pub fn is_subsequence(s: String, t: String) -> bool { + let mut dp = vec![0; t.len() + 1]; + let (s, t) = (s.as_bytes(), t.as_bytes()); + for &byte_s in s { + let mut pre = 0; + for j in 0..t.len() { + let temp = dp[j + 1]; + if byte_s == t[j] { + dp[j + 1] = pre + 1; + } else { + dp[j + 1] = dp[j]; + } + pre = temp; + } + } + dp[t.len()] == s.len() + } +} +``` +

From 55b85b5251c7b4f2060795070341eaf4d97347d0 Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Sun, 23 Jul 2023 17:57:10 +0800 Subject: [PATCH 2097/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200501.=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=20=E6=8E=92=E7=89=88=E6=A0=BC=E5=BC=8F=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...55\347\232\204\344\274\227\346\225\260.md" | 35 ++++++++++--------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git "a/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" "b/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" index 1da323435b..efbabc4ab6 100644 --- "a/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" +++ "b/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" @@ -33,20 +33,20 @@ 进阶:你可以不使用额外的空间吗?(假设由递归产生的隐式调用栈的开销不被计算在内) -# 算法公开课 +## 算法公开课 -**《代码随想录》算法视频公开课:[不仅双指针,还有代码技巧可以惊艳到你! | LeetCode:501.二叉搜索树中的众数](https://www.bilibili.com/video/BV1fD4y117gp),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[不仅双指针,还有代码技巧可以惊艳到你! | LeetCode:501.二叉搜索树中的众数](https://www.bilibili.com/video/BV1fD4y117gp),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 -# 思路 +## 思路 这道题目呢,递归法我从两个维度来讲。 首先如果不是二叉搜索树的话,应该怎么解题,是二叉搜索树,又应该如何解题,两种方式做一个比较,可以加深大家对二叉树的理解。 -## 递归法 +### 递归法 -### 如果不是二叉搜索树 +#### 如果不是二叉搜索树 如果不是二叉搜索树,最直观的方法一定是把这个树都遍历了,用map统计频率,把频率排个序,最后取前面高频的元素的集合。 @@ -140,7 +140,7 @@ public: **所以如果本题没有说是二叉搜索树的话,那么就按照上面的思路写!** -### 是二叉搜索树 +#### 是二叉搜索树 **既然是搜索树,它中序遍历就是有序的**。 @@ -271,7 +271,7 @@ public: ``` -## 迭代法 +### 迭代法 只要把中序遍历转成迭代,中间节点的处理逻辑完全一样。 @@ -326,7 +326,7 @@ public: }; ``` -# 总结 +## 总结 本题在递归法中,我给出了如果是普通二叉树,应该怎么求众数。 @@ -345,10 +345,10 @@ public: > **需要强调的是 leetcode上的耗时统计是非常不准确的,看个大概就行,一样的代码耗时可以差百分之50以上**,所以leetcode的耗时统计别太当回事,知道理论上的效率优劣就行了。 -# 其他语言版本 +## 其他语言版本 -## Java +### Java 暴力法 @@ -472,7 +472,7 @@ class Solution { } } ``` -統一迭代法 +统一迭代法 ```Java class Solution { public int[] findMode(TreeNode root) { @@ -526,7 +526,7 @@ class Solution { ``` -## Python +### Python 递归法(版本一)利用字典 @@ -640,7 +640,7 @@ class Solution: return result ``` -## Go +### Go 计数法,不使用额外空间,利用二叉树性质,中序遍历 ```go @@ -676,7 +676,7 @@ func findMode(root *TreeNode) []int { } ``` -## JavaScript +### JavaScript 使用额外空间map的方法 ```javascript @@ -753,7 +753,7 @@ var findMode = function(root) { }; ``` -## TypeScript +### TypeScript > 辅助Map法 @@ -852,7 +852,7 @@ function findMode(root: TreeNode | null): number[] { }; ``` -## Scala +### Scala 暴力: ```scala @@ -923,7 +923,7 @@ object Solution { } ``` -## rust +### Rust 递归: @@ -1015,3 +1015,4 @@ pub fn find_mode(root: Option>>) -> Vec { + From 3a2490b92fe00b5e2b6acb602f33328b48e426ad Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Sun, 23 Jul 2023 18:41:57 +0800 Subject: [PATCH 2098/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=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=20=E6=8E=92=E7=89=88=E6=A0=BC=E5=BC=8F?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...54\345\205\261\347\245\226\345\205\210.md" | 25 ++++++++++--------- 1 file changed, 13 insertions(+), 12 deletions(-) diff --git "a/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" "b/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" index 0ebd556669..9db7409e04 100644 --- "a/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" +++ "b/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" @@ -34,12 +34,12 @@ * 所有节点的值都是唯一的。 * p、q 为不同节点且均存在于给定的二叉树中。 -# 算法公开课 +## 算法公开课 -**《代码随想录》算法视频公开课:[自底向上查找,有点难度! | LeetCode:236. 二叉树的最近公共祖先](https://www.bilibili.com/video/BV1jd4y1B7E2),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[自底向上查找,有点难度! | LeetCode:236. 二叉树的最近公共祖先](https://www.bilibili.com/video/BV1jd4y1B7E2),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 -# 思路 +## 思路 遇到这个题目首先想的是要是能自底向上查找就好了,这样就可以找到公共祖先了。 @@ -226,7 +226,7 @@ public: }; ``` -# 总结 +## 总结 这道题目刷过的同学未必真正了解这里面回溯的过程,以及结果是如何一层一层传上去的。 @@ -243,10 +243,10 @@ public: 本题没有给出迭代法,因为迭代法不适合模拟回溯的过程。理解递归的解法就够了。 -# 其他语言版本 +## 其他语言版本 -## Java +### Java ```Java class Solution { @@ -273,7 +273,7 @@ class Solution { ``` -## Python +### Python 递归法(版本一) ```python class Solution: @@ -312,7 +312,7 @@ class Solution: return left ``` -## Go +### Go ```Go func lowestCommonAncestor(root, p, q *TreeNode) *TreeNode { @@ -343,7 +343,7 @@ func lowestCommonAncestor(root, p, q *TreeNode) *TreeNode { } ``` -## JavaScript +### JavaScript ```javascript var lowestCommonAncestor = function(root, p, q) { @@ -370,7 +370,7 @@ var lowestCommonAncestor = function(root, p, q) { }; ``` -## TypeScript +### TypeScript ```typescript function lowestCommonAncestor(root: TreeNode | null, p: TreeNode | null, q: TreeNode | null): TreeNode | null { @@ -384,7 +384,7 @@ function lowestCommonAncestor(root: TreeNode | null, p: TreeNode | null, q: Tree }; ``` -## Scala +### Scala ```scala object Solution { @@ -404,7 +404,7 @@ object Solution { } ``` -## rust +### Rust ```rust impl Solution { @@ -436,3 +436,4 @@ impl Solution { + From 07e1ccca1925d16b5f9f58050d135d3a326b44af Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Sun, 23 Jul 2023 18:52:09 +0800 Subject: [PATCH 2099/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=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=20=E6=8E=92=E7=89=88?= =?UTF-8?q?=E6=A0=BC=E5=BC=8F=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...54\345\205\261\347\245\226\345\205\210.md" | 29 ++++++++++--------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git "a/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" "b/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" index 9777bb0be8..2b8af06017 100644 --- "a/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" +++ "b/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" @@ -36,11 +36,11 @@ * 所有节点的值都是唯一的。 * p、q 为不同节点且均存在于给定的二叉搜索树中。 -# 算法公开课 +## 算法公开课 -**《代码随想录》算法视频公开课:[二叉搜索树找祖先就有点不一样了!| 235. 二叉搜索树的最近公共祖先](https://www.bilibili.com/video/BV1Zt4y1F7ww?share_source=copy_web),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[二叉搜索树找祖先就有点不一样了!| 235. 二叉搜索树的最近公共祖先](https://www.bilibili.com/video/BV1Zt4y1F7ww?share_source=copy_web),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 -# 思路 +## 思路 做过[二叉树:公共祖先问题](https://programmercarl.com/0236.二叉树的最近公共祖先.html)题目的同学应该知道,利用回溯从底向上搜索,遇到一个节点的左子树里有p,右子树里有q,那么当前节点就是最近公共祖先。 @@ -71,7 +71,7 @@ 可以看出直接按照指定的方向,就可以找到节点8,为最近公共祖先,而且不需要遍历整棵树,找到结果直接返回! -## 递归法 +### 递归法 递归三部曲如下: @@ -203,7 +203,7 @@ public: }; ``` -## 迭代法 +### 迭代法 对于二叉搜索树的迭代法,大家应该在[二叉树:二叉搜索树登场!](https://programmercarl.com/0700.二叉搜索树中的搜索.html)就了解了。 @@ -229,7 +229,7 @@ public: 灵魂拷问:是不是又被简单的迭代法感动到痛哭流涕? -# 总结 +## 总结 对于二叉搜索树的最近祖先问题,其实要比[普通二叉树公共祖先问题](https://programmercarl.com/0236.二叉树的最近公共祖先.html)简单的多。 @@ -238,10 +238,10 @@ public: 最后给出了对应的迭代法,二叉搜索树的迭代法甚至比递归更容易理解,也是因为其有序性(自带方向性),按照目标区间找就行了。 -# 其他语言版本 +## 其他语言版本 -## Java +### Java 递归法: ```java @@ -273,7 +273,7 @@ class Solution { ``` -## Python +### Python 递归法(版本一) ```python @@ -326,7 +326,7 @@ class Solution: ``` -## Go +### Go 递归法: ```go @@ -350,7 +350,7 @@ func lowestCommonAncestor(root, p, q *TreeNode) *TreeNode { ``` -## JavaScript +### JavaScript 递归法: ```javascript @@ -391,7 +391,7 @@ var lowestCommonAncestor = function(root, p, q) { }; ``` -## TypeScript +### TypeScript > 递归法: @@ -422,7 +422,7 @@ function lowestCommonAncestor(root: TreeNode | null, p: TreeNode | null, q: Tree }; ``` -## Scala +### Scala 递归: @@ -453,7 +453,7 @@ object Solution { } ``` -## rust +### Rust 递归: @@ -519,3 +519,4 @@ impl Solution { + From 70271161fff40fb3ab1929dcb37b19e3efe469b0 Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Sun, 23 Jul 2023 18:54:12 +0800 Subject: [PATCH 2100/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200701.=E4=BA=8C?= =?UTF-8?q?=E5=8F=89=E6=90=9C=E7=B4=A2=E6=A0=91=E4=B8=AD=E7=9A=84=E6=8F=92?= =?UTF-8?q?=E5=85=A5=E6=93=8D=E4=BD=9C=20=E6=8E=92=E7=89=88=E6=A0=BC?= =?UTF-8?q?=E5=BC=8F=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...22\345\205\245\346\223\215\344\275\234.md" | 29 ++++++++++--------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git "a/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" "b/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" index fc4351babc..511d161c70 100644 --- "a/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" +++ "b/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" @@ -23,11 +23,11 @@ * -10^8 <= val <= 10^8 * 新值和原始二叉搜索树中的任意节点值都不同 -# 算法公开课 +## 算法公开课 -**《代码随想录》算法视频公开课:[原来这么简单? | LeetCode:701.二叉搜索树中的插入操作](https://www.bilibili.com/video/BV1Et4y1c78Y?share_source=copy_web),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[原来这么简单? | LeetCode:701.二叉搜索树中的插入操作](https://www.bilibili.com/video/BV1Et4y1c78Y?share_source=copy_web),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 -# 思路 +## 思路 这道题目其实是一道简单题目,**但是题目中的提示:有多种有效的插入方式,还可以重构二叉搜索树,一下子吓退了不少人**,瞬间感觉题目复杂了很多。 @@ -43,7 +43,7 @@ 接下来就是遍历二叉搜索树的过程了。 -## 递归 +### 递归 递归三部曲: @@ -165,7 +165,7 @@ public: **网上千篇一律的代码,可能会误导大家认为通过递归函数返回节点 这样的写法是天经地义,其实这里是有优化的!** -## 迭代 +### 迭代 再来看看迭代法,对二叉搜索树迭代写法不熟悉,可以看这篇:[二叉树:二叉搜索树登场!](https://programmercarl.com/0700.二叉搜索树中的搜索.html) @@ -198,7 +198,7 @@ public: }; ``` -# 总结 +## 总结 首先在二叉搜索树中的插入操作,大家不用恐惧其重构搜索树,其实根本不用重构。 @@ -207,9 +207,9 @@ public: 最后依然给出了迭代的方法,迭代的方法就需要记录当前遍历节点的父节点了,这个和没有返回值的递归函数实现的代码逻辑是一样的。 -# 其他语言版本 +## 其他语言版本 -## Java +### Java ```java class Solution { @@ -254,7 +254,7 @@ class Solution { } ``` ----- -## Python +### Python 递归法(版本一) ```python @@ -371,7 +371,7 @@ class Solution: ``` ----- -## Go +### Go 递归法 @@ -417,7 +417,7 @@ func insertIntoBST(root *TreeNode, val int) *TreeNode { } ``` ----- -## JavaScript +### JavaScript 有返回值的递归写法 @@ -530,7 +530,7 @@ var insertIntoBST = function (root, val) { }; ``` -## TypeScript +### TypeScript > 递归-有返回值 @@ -595,7 +595,7 @@ function insertIntoBST(root: TreeNode | null, val: number): TreeNode | null { ``` -## Scala +### Scala 递归: @@ -632,7 +632,7 @@ object Solution { } ``` -### rust +### Rust 迭代: @@ -697,3 +697,4 @@ impl Solution { + From 0f22ada3df0468334a45059a037ec6a7fa198d85 Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Sun, 23 Jul 2023 18:56:18 +0800 Subject: [PATCH 2101/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200450.=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=20=E6=8E=92=E7=89=88=E6=A0=BC?= =?UTF-8?q?=E5=BC=8F=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...55\347\232\204\350\212\202\347\202\271.md" | 31 ++++++++++--------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git "a/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" "b/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" index 3d73598da9..13599fd849 100644 --- "a/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" +++ "b/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" @@ -24,15 +24,15 @@ ![450.删除二叉搜索树中的节点](https://code-thinking-1253855093.file.myqcloud.com/pics/20201020171048265.png) -# 算法公开课 +## 算法公开课 -**《代码随想录》算法视频公开课:[调整二叉树的结构最难!| LeetCode:450.删除二叉搜索树中的节点](https://www.bilibili.com/video/BV1tP41177us?share_source=copy_web),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[调整二叉树的结构最难!| LeetCode:450.删除二叉搜索树中的节点](https://www.bilibili.com/video/BV1tP41177us?share_source=copy_web),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 -# 思路 +## 思路 搜索树的节点删除要比节点增加复杂的多,有很多情况需要考虑,做好心理准备。 -## 递归 +### 递归 递归三部曲: @@ -161,7 +161,7 @@ public: }; ``` -## 普通二叉树的删除方式 +### 普通二叉树的删除方式 这里我在介绍一种通用的删除,普通二叉树的删除方式(没有使用搜索树的特性,遍历整棵树),用交换值的操作来删除目标节点。 @@ -198,7 +198,7 @@ public: 这个代码是简短一些,思路也巧妙,但是不太好想,实操性不强,推荐第一种写法! -## 迭代法 +### 迭代法 删除节点的迭代法还是复杂一些的,但其本质我在递归法里都介绍了,最关键就是删除节点的操作(动画模拟的过程) @@ -246,7 +246,7 @@ public: }; ``` -# 总结 +## 总结 读完本篇,大家会发现二叉搜索树删除节点比增加节点复杂的多。 @@ -264,10 +264,10 @@ public: 迭代法其实不太容易写出来,所以如果是初学者的话,彻底掌握第一种递归写法就够了。 -# 其他语言版本 +## 其他语言版本 -## Java +### Java ```java class Solution { public TreeNode deleteNode(TreeNode root, int key) { @@ -323,7 +323,7 @@ class Solution { } ``` -## Python +### Python 递归法(版本一) ```python class Solution: @@ -411,7 +411,7 @@ class Solution: return root ``` -## Go +### Go ```Go // 递归版本 func deleteNode(root *TreeNode, key int) *TreeNode { @@ -497,7 +497,7 @@ func deleteNode(root *TreeNode, key int) *TreeNode { } ``` -## JavaScript +### JavaScript 递归 @@ -588,7 +588,7 @@ var deleteNode = function (root, key) { } ``` -## TypeScript +### TypeScript > 递归法: @@ -652,7 +652,7 @@ function deleteNode(root: TreeNode | null, key: number): TreeNode | null { }; ``` -## Scala +### Scala ```scala object Solution { @@ -682,7 +682,7 @@ object Solution { } ``` -## rust +### Rust ```rust impl Solution { @@ -720,3 +720,4 @@ impl Solution { + From f0ac0b2efd588164b74632e75a6c4358e2357781 Mon Sep 17 00:00:00 2001 From: fwqaaq Date: Sun, 23 Jul 2023 18:57:41 +0800 Subject: [PATCH 2102/3019] =?UTF-8?q?Update=200115.=E4=B8=8D=E5=90=8C?= =?UTF-8?q?=E7=9A=84=E5=AD=90=E5=BA=8F=E5=88=97.md=20about=20rust?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...04\345\255\220\345\272\217\345\210\227.md" | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git "a/problems/0115.\344\270\215\345\220\214\347\232\204\345\255\220\345\272\217\345\210\227.md" "b/problems/0115.\344\270\215\345\220\214\347\232\204\345\255\220\345\272\217\345\210\227.md" index 8c82880d58..56516132ba 100644 --- "a/problems/0115.\344\270\215\345\220\214\347\232\204\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0115.\344\270\215\345\220\214\347\232\204\345\255\220\345\272\217\345\210\227.md" @@ -311,7 +311,31 @@ function numDistinct(s: string, t: string): number { }; ``` +Rust: +```rust +impl Solution { + pub fn num_distinct(s: String, t: String) -> i32 { + if s.len() < t.len() { + return 0; + } + let mut dp = vec![vec![0; s.len() + 1]; t.len() + 1]; + // i = 0, t 为空字符串,s 作为子序列的个数为 1(删除 s 所有元素) + dp[0] = vec![1; s.len() + 1]; + for (i, char_t) in t.chars().enumerate() { + for (j, char_s) in s.chars().enumerate() { + if char_t == char_s { + // t 的前 i 个字符在 s 的前 j 个字符中作为子序列的个数 + dp[i + 1][j + 1] = dp[i][j] + dp[i + 1][j]; + continue; + } + dp[i + 1][j + 1] = dp[i + 1][j]; + } + } + dp[t.len()][s.len()] + } +} +```

From e14e2169c4c303d5e690705245230323774df795 Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Sun, 23 Jul 2023 18:58:10 +0800 Subject: [PATCH 2103/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200669.=E4=BF=AE?= =?UTF-8?q?=E5=89=AA=E4=BA=8C=E5=8F=89=E6=90=9C=E7=B4=A2=E6=A0=91=20?= =?UTF-8?q?=E6=8E=92=E7=89=88=E6=A0=BC=E5=BC=8F=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...11\346\220\234\347\264\242\346\240\221.md" | 29 ++++++++++--------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git "a/problems/0669.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0669.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" index 85922a1dd8..2cfbfefc60 100644 --- "a/problems/0669.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" +++ "b/problems/0669.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" @@ -20,17 +20,17 @@ ![669.修剪二叉搜索树1](https://code-thinking-1253855093.file.myqcloud.com/pics/20201014173219142.png) -# 算法公开课 +## 算法公开课 -**《代码随想录》算法视频公开课:[你修剪的方式不对,我来给你纠正一下!| LeetCode:669. 修剪二叉搜索树](https://www.bilibili.com/video/BV17P41177ud?share_source=copy_web),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[你修剪的方式不对,我来给你纠正一下!| LeetCode:669. 修剪二叉搜索树](https://www.bilibili.com/video/BV17P41177ud?share_source=copy_web),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 -# 思路 +## 思路 相信看到这道题目大家都感觉是一道简单题(事实上leetcode上也标明是简单)。 但还真的不简单! -## 递归法 +### 递归法 直接想法就是:递归处理,然后遇到 `root->val < low || root->val > high` 的时候直接return NULL,一波修改,赶紧利落。 @@ -188,7 +188,7 @@ public: 只看代码,其实不太好理解节点是如何移除的,这一块大家可以自己再模拟模拟! -## 迭代法 +### 迭代法 因为二叉搜索树的有序性,不需要使用栈模拟递归的过程。 @@ -233,7 +233,7 @@ public: }; ``` -# 总结 +## 总结 修剪二叉搜索树其实并不难,但在递归法中大家可看出我费了很大的功夫来讲解如何删除节点的,这个思路其实是比较绕的。 @@ -243,10 +243,10 @@ public: 本题我依然给出递归法和迭代法,初学者掌握递归就可以了,如果想进一步学习,就把迭代法也写一写。 -# 其他语言版本 +## 其他语言版本 -## Java +### Java **递归** @@ -311,7 +311,7 @@ class Solution { ```` -## Python +### Python 递归法(版本一) ```python @@ -381,7 +381,7 @@ class Solution: ``` -## Go +### Go ```go // 递归 @@ -436,7 +436,7 @@ func trimBST(root *TreeNode, low int, high int) *TreeNode { ``` -## JavaScript版本 +### JavaScript 迭代: @@ -492,7 +492,7 @@ var trimBST = function (root,low,high) { } ``` -## TypeScript +### TypeScript > 递归法 @@ -540,7 +540,7 @@ function trimBST(root: TreeNode | null, low: number, high: number): TreeNode | n }; ``` -## Scala +### Scala 递归法: @@ -557,7 +557,7 @@ object Solution { } ``` -## rust +### Rust // 递归 @@ -590,3 +590,4 @@ impl Solution { + From 572c08984f9ec9821383b3c9a51dbbf1684eb6af Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Sun, 23 Jul 2023 19:00:08 +0800 Subject: [PATCH 2104/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200108.=E5=B0=86?= =?UTF-8?q?=E6=9C=89=E5=BA=8F=E6=95=B0=E7=BB=84=E8=BD=AC=E6=8D=A2=E4=B8=BA?= =?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=90=9C=E7=B4=A2=E6=A0=91=20=E6=8E=92?= =?UTF-8?q?=E7=89=88=E6=A0=BC=E5=BC=8F=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...11\346\220\234\347\264\242\346\240\221.md" | 31 ++++++++++--------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git "a/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" index 056ef3e268..e699005edb 100644 --- "a/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" +++ "b/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" @@ -20,11 +20,11 @@ ![108.将有序数组转换为二叉搜索树](https://code-thinking-1253855093.file.myqcloud.com/pics/20201022164420763.png) -# 算法公开课 +## 算法公开课 -**《代码随想录》算法视频公开课:[构造平衡二叉搜索树!| LeetCode:108.将有序数组转换为二叉搜索树](https://www.bilibili.com/video/BV1uR4y1X7qL?share_source=copy_web),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[构造平衡二叉搜索树!| LeetCode:108.将有序数组转换为二叉搜索树](https://www.bilibili.com/video/BV1uR4y1X7qL?share_source=copy_web),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 -# 思路 +## 思路 做这道题目之前大家可以了解一下这几道: @@ -71,7 +71,7 @@ **这也是题目中强调答案不是唯一的原因。 理解这一点,这道题目算是理解到位了**。 -## 递归 +### 递归 递归三部曲: @@ -155,7 +155,7 @@ public: **注意:在调用traversal的时候传入的left和right为什么是0和nums.size() - 1,因为定义的区间为左闭右闭**。 -## 迭代法 +### 迭代法 迭代法可以通过三个队列来模拟,一个队列放遍历的节点,一个队列放左区间下标,一个队列放右区间下标。 @@ -203,7 +203,7 @@ public: }; ``` -# 总结 +## 总结 **在[二叉树:构造二叉树登场!](https://programmercarl.com/0106.从中序与后序遍历序列构造二叉树.html) 和 [二叉树:构造一棵最大的二叉树](https://programmercarl.com/0654.最大二叉树.html)之后,我们顺理成章的应该构造一下二叉搜索树了,一不小心还是一棵平衡二叉搜索树**。 @@ -216,10 +216,10 @@ public: 最后依然给出迭代的方法,其实就是模拟取中间元素,然后不断分割去构造二叉树的过程。 -# 其他语言版本 +## 其他语言版本 -## Java +### Java 递归: 左闭右开 [left,right) ```Java @@ -315,7 +315,7 @@ class Solution { } ``` -## Python +### Python 递归法 ```python class Solution: @@ -377,7 +377,7 @@ class Solution: ``` -## Go +### Go 递归(隐含回溯) @@ -396,7 +396,7 @@ func sortedArrayToBST(nums []int) *TreeNode { } ``` -## JavaScript +### JavaScript 递归 ```javascript @@ -453,7 +453,7 @@ var sortedArrayToBST = function(nums) { return root; }; ``` -## TypeScript +### TypeScript ```typescript function sortedArrayToBST(nums: number[]): TreeNode | null { @@ -469,7 +469,7 @@ function sortedArrayToBST(nums: number[]): TreeNode | null { }; ``` -## C +### C 递归 ```c @@ -490,7 +490,7 @@ struct TreeNode* sortedArrayToBST(int* nums, int numsSize) { } ``` -## Scala +### Scala 递归: @@ -511,7 +511,7 @@ object Solution { } ``` -## rust +### Rust 递归: @@ -536,3 +536,4 @@ impl Solution { + From 6bf34cd8ba3837d16013dd2ac78b5d632f3f2e22 Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Sun, 23 Jul 2023 19:02:05 +0800 Subject: [PATCH 2105/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200538.=E5=B0=86?= =?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=90=9C=E7=B4=A2=E6=A0=91=E8=BD=AC=E6=8D=A2?= =?UTF-8?q?=E4=B8=BA=E7=B4=AF=E5=8A=A0=E6=A0=91=20=E6=8E=92=E7=89=88?= =?UTF-8?q?=E6=A0=BC=E5=BC=8F=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...72\347\264\257\345\212\240\346\240\221.md" | 35 ++++++++++--------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git "a/problems/0538.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md" "b/problems/0538.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md" index 781763a4a5..c403c98f24 100644 --- "a/problems/0538.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md" +++ "b/problems/0538.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md" @@ -44,11 +44,11 @@ * 树中的所有值 互不相同 。 * 给定的树为二叉搜索树。 -# 算法公开课 +## 算法公开课 -**《代码随想录》算法视频公开课:[普大喜奔!二叉树章节已全部更完啦!| LeetCode:538.把二叉搜索树转换为累加树](https://www.bilibili.com/video/BV1d44y1f7wP?share_source=copy_web),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[普大喜奔!二叉树章节已全部更完啦!| LeetCode:538.把二叉搜索树转换为累加树](https://www.bilibili.com/video/BV1d44y1f7wP?share_source=copy_web),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 -# 思路 +## 思路 一看到累加树,相信很多小伙伴都会疑惑:如何累加?遇到一个节点,然后再遍历其他节点累加?怎么一想这么麻烦呢。 @@ -64,7 +64,7 @@ 那么知道如何遍历这个二叉树,也就迎刃而解了,**从树中可以看出累加的顺序是右中左,所以我们需要反中序遍历这个二叉树,然后顺序累加就可以了**。 -## 递归 +### 递归 遍历顺序如图所示: @@ -131,7 +131,7 @@ public: }; ``` -## 迭代法 +### 迭代法 迭代法其实就是中序模板题了,在[二叉树:前中后序迭代法](https://programmercarl.com/二叉树的迭代遍历.html)和[二叉树:前中后序统一方式迭代法](https://programmercarl.com/二叉树的统一迭代法.html)可以选一种自己习惯的写法。 @@ -166,17 +166,17 @@ public: }; ``` -# 总结 +## 总结 经历了前面各种二叉树增删改查的洗礼之后,这道题目应该比较简单了。 **好了,二叉树已经接近尾声了,接下来就是要对二叉树来一个大总结了**。 -# 其他语言版本 +## 其他语言版本 -## Java +### Java **递归** ```Java @@ -237,7 +237,7 @@ class Solution { } ``` -## Python +### Python 递归法(版本一) ```python # Definition for a binary tree node. @@ -318,7 +318,7 @@ class Solution: self.traversal(root) return root -``` +``` 迭代法(版本二) ```python class Solution: @@ -338,9 +338,9 @@ class Solution: pre = cur.val cur =cur.left return root -``` +``` -## Go +### Go 弄一个sum暂存其和值 ```go @@ -362,7 +362,7 @@ func traversal(cur *TreeNode) { } ``` -## JavaScript +### JavaScript 递归 ```javascript @@ -401,7 +401,7 @@ var convertBST = function (root) { }; ``` -##C +### C 递归 ```c @@ -422,7 +422,7 @@ struct TreeNode* convertBST(struct TreeNode* root){ } ``` -## TypeScript +### TypeScript > 递归法 @@ -462,7 +462,7 @@ function convertBST(root: TreeNode | null): TreeNode | null { }; ``` -## Scala +### Scala ```scala object Solution { @@ -481,7 +481,7 @@ object Solution { } ``` -## rust +### Rust 递归: @@ -535,3 +535,4 @@ impl Solution { + From 75390603854b899d5a164b0cf508ec393aaa3712 Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Sun, 23 Jul 2023 19:04:13 +0800 Subject: [PATCH 2106/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20=E4=BA=8C?= =?UTF-8?q?=E5=8F=89=E6=A0=91=E6=80=BB=E7=BB=93=E7=AF=87=20=E6=8E=92?= =?UTF-8?q?=E7=89=88=E6=A0=BC=E5=BC=8F=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...21\346\200\273\347\273\223\347\257\207.md" | 20 ++----------------- 1 file changed, 2 insertions(+), 18 deletions(-) diff --git "a/problems/\344\272\214\345\217\211\346\240\221\346\200\273\347\273\223\347\257\207.md" "b/problems/\344\272\214\345\217\211\346\240\221\346\200\273\347\273\223\347\257\207.md" index 4c742a6bbf..829495438d 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\346\200\273\347\273\223\347\257\207.md" @@ -92,7 +92,7 @@ * 递归:中序,双指针操作 * 迭代:模拟中序,逻辑相同 * [求二叉搜索树的众数](https://programmercarl.com/0501.二叉搜索树中的众数.html) - + * 递归:中序,清空结果集的技巧,遍历一遍便可求众数集合 * [二叉搜索树转成累加树](https://programmercarl.com/0538.把二叉搜索树转换为累加树.html) @@ -154,29 +154,13 @@ 这个图是 [代码随想录知识星球](https://programmercarl.com/other/kstar.html) 成员:[青](https://wx.zsxq.com/dweb2/index/footprint/185251215558842),所画,总结的非常好,分享给大家。 - **最后,二叉树系列就这么完美结束了,估计这应该是最长的系列了,感谢大家33天的坚持与陪伴,接下来我们又要开始新的系列了「回溯算法」!** - - -## 其他语言版本 - - -Java: - - -Python: - - -Go: - - - -

+ From aaa8cc2443a9a05e5af3acae67d7f593c7c34077 Mon Sep 17 00:00:00 2001 From: fwqaaq Date: Sun, 23 Jul 2023 19:40:19 +0800 Subject: [PATCH 2107/3019] =?UTF-8?q?Update=200115.=E4=B8=8D=E5=90=8C?= =?UTF-8?q?=E7=9A=84=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 --- ...04\345\255\220\345\272\217\345\210\227.md" | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git "a/problems/0115.\344\270\215\345\220\214\347\232\204\345\255\220\345\272\217\345\210\227.md" "b/problems/0115.\344\270\215\345\220\214\347\232\204\345\255\220\345\272\217\345\210\227.md" index 56516132ba..91f35291cb 100644 --- "a/problems/0115.\344\270\215\345\220\214\347\232\204\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0115.\344\270\215\345\220\214\347\232\204\345\255\220\345\272\217\345\210\227.md" @@ -337,6 +337,36 @@ impl Solution { } ``` +> 滚动数组 + +```rust +impl Solution { + pub fn num_distinct(s: String, t: String) -> i32 { + if s.len() < t.len() { + return 0; + } + let (s, t) = (s.into_bytes(), t.into_bytes()); + // 对于 t 为空字符串,s 作为子序列的个数为 1(删除 s 所有元素) + let mut dp = vec![1; s.len() + 1]; + for char_t in t { + // dp[i - 1][j - 1],dp[j + 1] 更新之前的值 + let mut pre = dp[0]; + // 当开始遍历 t,s 的前 0 个字符无法包含任意子序列 + dp[0] = 0; + for (j, &char_s) in s.iter().enumerate() { + let temp = dp[j + 1]; + if char_t == char_s { + dp[j + 1] = pre + dp[j]; + } else { + dp[j + 1] = dp[j]; + } + pre = temp; + } + } + dp[s.len()] + } +} +```

From 0a83ee2c20c1b1294a2de20f58526755caa785e8 Mon Sep 17 00:00:00 2001 From: fwqaaq Date: Sun, 23 Jul 2023 19:52:17 +0800 Subject: [PATCH 2108/3019] =?UTF-8?q?Update=200583.=E4=B8=A4=E4=B8=AA?= =?UTF-8?q?=E5=AD=97=E7=AC=A6=E4=B8=B2=E7=9A=84=E5=88=A0=E9=99=A4=E6=93=8D?= =?UTF-8?q?=E4=BD=9C.md=20about=20rust?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...40\351\231\244\346\223\215\344\275\234.md" | 26 ++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git "a/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" "b/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" index 48d15b0ba9..45e62f7d0f 100644 --- "a/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" +++ "b/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" @@ -368,7 +368,31 @@ function minDistance(word1: string, word2: string): number { }; ``` - +Rust: + +```rust +impl Solution { + pub fn min_distance(word1: String, word2: String) -> i32 { + let mut dp = vec![vec![0; word2.len() + 1]; word1.len() + 1]; + for i in 0..word1.len() { + dp[i + 1][0] = i + 1; + } + for j in 0..word2.len() { + dp[0][j + 1] = j + 1; + } + for (i, char1) in word1.chars().enumerate() { + for (j, char2) in word2.chars().enumerate() { + if char1 == char2 { + dp[i + 1][j + 1] = dp[i][j]; + continue; + } + dp[i + 1][j + 1] = dp[i][j + 1].min(dp[i + 1][j]) + 1; + } + } + dp[word1.len()][word2.len()] as i32 + } +} +```

From d6bf0c52cae3da2f9842ba2a30be15099cd53280 Mon Sep 17 00:00:00 2001 From: fwqaaq Date: Sun, 23 Jul 2023 20:00:17 +0800 Subject: [PATCH 2109/3019] =?UTF-8?q?Update=200583.=E4=B8=A4=E4=B8=AA?= =?UTF-8?q?=E5=AD=97=E7=AC=A6=E4=B8=B2=E7=9A=84=E5=88=A0=E9=99=A4=E6=93=8D?= =?UTF-8?q?=E4=BD=9C.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...40\351\231\244\346\223\215\344\275\234.md" | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git "a/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" "b/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" index 45e62f7d0f..8b5ded3b8d 100644 --- "a/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" +++ "b/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" @@ -394,6 +394,26 @@ impl Solution { } ``` +> 版本 2 + +```rust +impl Solution { + pub fn min_distance(word1: String, word2: String) -> i32 { + let mut dp = vec![vec![0; word2.len() + 1]; word1.len() + 1]; + for (i, char1) in word1.chars().enumerate() { + for (j, char2) in word2.chars().enumerate() { + if char1 == char2 { + dp[i + 1][j + 1] = dp[i][j] + 1; + continue; + } + dp[i + 1][j + 1] = dp[i][j + 1].max(dp[i + 1][j]); + } + } + (word1.len() + word2.len() - 2 * dp[word1.len()][word2.len()]) as i32 + } +} +``` +

From 6e613877f24394d2e4da3f97580d5e75be7d3b83 Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Mon, 24 Jul 2023 10:54:21 +0800 Subject: [PATCH 2110/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20=E5=9B=9E?= =?UTF-8?q?=E6=BA=AF=E7=AE=97=E6=B3=95=E7=90=86=E8=AE=BA=E5=9F=BA=E7=A1=80?= =?UTF-8?q?=20=E6=8E=92=E7=89=88=E6=A0=BC=E5=BC=8F=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...06\350\256\272\345\237\272\347\241\200.md" | 21 ++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git "a/problems/\345\233\236\346\272\257\347\256\227\346\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\345\233\236\346\272\257\347\256\227\346\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md" index f11dbaef52..dff1823c0c 100644 --- "a/problems/\345\233\236\346\272\257\347\256\227\346\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\345\233\236\346\272\257\347\256\227\346\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -6,13 +6,19 @@ # 回溯算法理论基础 -## 题目分类大纲如下: +## 题目分类 回溯算法大纲 -可以配合我的B站视频:[带你学透回溯算法(理论篇)](https://www.bilibili.com/video/BV1cy4y167mM/) 一起学习! +## 算法公开课 -## 什么是回溯法 + + +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[带你学透回溯算法(理论篇)](https://www.bilibili.com/video/BV1cy4y167mM/),相信结合视频再看本篇题解,更有助于大家对本题的理解。** + +## 理论基础 + +### 什么是回溯法 回溯法也可以叫做回溯搜索法,它是一种搜索的方式。 @@ -22,7 +28,7 @@ **所以以下讲解中,回溯函数也就是递归函数,指的都是一个函数**。 -## 回溯法的效率 +### 回溯法的效率 回溯法的性能如何呢,这里要和大家说清楚了,**虽然回溯法很难,很不好理解,但是回溯法并不是什么高效的算法**。 @@ -34,7 +40,7 @@ 此时大家应该好奇了,都什么问题,这么牛逼,只能暴力搜索。 -## 回溯法解决的问题 +### 回溯法解决的问题 回溯法,一般可以解决如下几种问题: @@ -55,7 +61,7 @@ 记住组合无序,排列有序,就可以了。 -## 如何理解回溯法 +### 如何理解回溯法 **回溯法解决的问题都可以抽象为树形结构**,是的,我指的是所有回溯法的问题都可以抽象为树形结构! @@ -66,7 +72,7 @@ 这块可能初学者还不太理解,后面的回溯算法解决的所有题目中,我都会强调这一点并画图举相应的例子,现在有一个印象就行。 -## 回溯法模板 +### 回溯法模板 这里给出Carl总结的回溯算法模板。 @@ -173,3 +179,4 @@ void backtracking(参数) { + From 6f3fdf7286c92830e0e9feff8fbdca90442af159 Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Mon, 24 Jul 2023 10:59:00 +0800 Subject: [PATCH 2111/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200077.=E7=BB=84?= =?UTF-8?q?=E5=90=88=20=E6=8E=92=E7=89=88=E6=A0=BC=E5=BC=8F=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "problems/0077.\347\273\204\345\220\210.md" | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git "a/problems/0077.\347\273\204\345\220\210.md" "b/problems/0077.\347\273\204\345\220\210.md" index 444e15ce74..702ffafe52 100644 --- "a/problems/0077.\347\273\204\345\220\210.md" +++ "b/problems/0077.\347\273\204\345\220\210.md" @@ -5,10 +5,6 @@

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

- - - - # 第77题. 组合 [力扣题目链接](https://leetcode.cn/problems/combinations/ ) @@ -27,13 +23,12 @@ [1,4], ] -# 算法公开课 +## 算法公开课 +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[带你学透回溯算法-组合问题(对应力扣题目:77.组合)](https://www.bilibili.com/video/BV1ti4y1L7cv),[组合问题的剪枝操作](https://www.bilibili.com/video/BV1wi4y157er),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 -**《代码随想录》算法视频公开课:[带你学透回溯算法-组合问题(对应力扣题目:77.组合)](https://www.bilibili.com/video/BV1ti4y1L7cv),[组合问题的剪枝操作](https://www.bilibili.com/video/BV1wi4y157er),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 - -# 思路 +## 思路 本题是回溯法的经典题目。 @@ -345,12 +340,10 @@ public: - - ## 其他语言版本 -### Java: +### Java ```java class Solution { @@ -451,7 +444,7 @@ func dfs(n int, k int, start int) { } ``` -### javascript +### Javascript 剪枝: From f5e50a919d84cc41b00843a403ad3b566ac521b2 Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Mon, 24 Jul 2023 11:02:27 +0800 Subject: [PATCH 2112/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20=E7=BB=84?= =?UTF-8?q?=E5=90=88=E4=BC=98=E5=8C=96=20=E6=8E=92=E7=89=88=E6=A0=BC?= =?UTF-8?q?=E5=BC=8F=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...04\345\220\210\344\274\230\345\214\226.md" | 34 ++++++++++--------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git "a/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" "b/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" index 3926d00694..9577d65f3c 100644 --- "a/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" +++ "b/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" @@ -7,8 +7,11 @@ # 77.组合优化 +## 算法公开课 -**《代码随想录》算法视频公开课:[组合问题的剪枝操作](https://www.bilibili.com/video/BV1wi4y157er),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[组合问题的剪枝操作](https://www.bilibili.com/video/BV1wi4y157er),相信结合视频在看本篇题解,更有助于大家对本题的理解。** + +## 思路 在[回溯算法:求组合问题!](https://programmercarl.com/0077.组合.html)中,我们通过回溯搜索法,解决了n个数中求k个数的组合问题。 @@ -46,7 +49,7 @@ public: }; ``` -# 剪枝优化 +## 剪枝优化 我们说过,回溯法虽然是暴力搜索,但也有时候可以有点剪枝优化一下的。 @@ -135,7 +138,7 @@ public: -# 总结 +## 总结 本篇我们针对求组合问题的回溯法代码做了剪枝优化,这个优化如果不画图的话,其实不好理解,也不好讲清楚。 @@ -143,14 +146,10 @@ public: **就酱,学到了就帮Carl转发一下吧,让更多的同学知道这里!** - - - - ## 其他语言版本 +### Java -Java: ```java class Solution { List> result = new ArrayList<>(); @@ -179,7 +178,8 @@ class Solution { } ``` -Python: +### Python + ```python class Solution: def combine(self, n: int, k: int) -> List[List[int]]: @@ -199,7 +199,8 @@ class Solution: ``` -Go: +### Go + ```Go var ( path []int @@ -227,7 +228,7 @@ func dfs(n int, k int, start int) { } ``` -javaScript: +### JavaScript ```js var combine = function(n, k) { @@ -249,7 +250,7 @@ var combine = function(n, k) { }; ``` -TypeScript: +### TypeScript ```typescript function combine(n: number, k: number): number[][] { @@ -270,7 +271,7 @@ function combine(n: number, k: number): number[][] { }; ``` -Rust: +### Rust ```Rust impl Solution { @@ -296,7 +297,7 @@ impl Solution { } ``` -C: +### C ```c int* path; @@ -351,7 +352,7 @@ int** combine(int n, int k, int* returnSize, int** returnColumnSizes){ } ``` -Swift: +### Swift ```swift func combine(_ n: Int, _ k: Int) -> [[Int]] { @@ -381,7 +382,7 @@ func combine(_ n: Int, _ k: Int) -> [[Int]] { } ``` -Scala: +### Scala ```scala object Solution { @@ -414,3 +415,4 @@ object Solution { + From f30fd2982b532281d156d7c7cd9a9c7471a0a134 Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Mon, 24 Jul 2023 11:08:32 +0800 Subject: [PATCH 2113/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200216.=E7=BB=84?= =?UTF-8?q?=E5=90=88=E6=80=BB=E5=92=8CIII=20=E6=8E=92=E7=89=88=E6=A0=BC?= =?UTF-8?q?=E5=BC=8F=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "problems/0077.\347\273\204\345\220\210.md" | 3 +- ...345\220\210\346\200\273\345\222\214III.md" | 34 +++++++++---------- 2 files changed, 18 insertions(+), 19 deletions(-) diff --git "a/problems/0077.\347\273\204\345\220\210.md" "b/problems/0077.\347\273\204\345\220\210.md" index 702ffafe52..7d71b51763 100644 --- "a/problems/0077.\347\273\204\345\220\210.md" +++ "b/problems/0077.\347\273\204\345\220\210.md" @@ -103,7 +103,7 @@ for (int i = 1; i <= n; i++) { 在[关于回溯算法,你该了解这些!](https://programmercarl.com/回溯算法理论基础.html)中我们提到了回溯法三部曲,那么我们按照回溯法三部曲开始正式讲解代码了。 -## 回溯法三部曲 +### 回溯法三部曲 * 递归函数的返回值以及参数 @@ -744,3 +744,4 @@ object Solution { + diff --git "a/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" "b/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" index 319b2eba71..4de7dc58f3 100644 --- "a/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" +++ "b/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" @@ -7,8 +7,6 @@ - - > 别看本篇选的是组合总和III,而不是组合总和,本题和上一篇77.组合相比难度刚刚好! # 216.组合总和III @@ -30,12 +28,12 @@ 输入: k = 3, n = 9 输出: [[1,2,6], [1,3,5], [2,3,4]] -# 算法公开课 +## 算法公开课 -**《代码随想录》算法视频公开课:[和组合问题有啥区别?回溯算法如何剪枝?| LeetCode:216.组合总和III](https://www.bilibili.com/video/BV1wg411873x),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[和组合问题有啥区别?回溯算法如何剪枝?| LeetCode:216.组合总和III](https://www.bilibili.com/video/BV1wg411873x),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 -# 思路 +## 思路 本题就是在[1,2,3,4,5,6,7,8,9]这个集合中找到和为n的k个数的组合。 @@ -54,7 +52,7 @@ 图中,可以看出,只有最后取到集合(1,3)和为4 符合条件。 -## 回溯三部曲 +### 回溯三部曲 * **确定递归函数参数** @@ -165,7 +163,7 @@ public: }; ``` -## 剪枝 +### 剪枝 这道题目,剪枝操作其实是很容易想到了,想必大家看上面的树形图的时候已经想到了。 @@ -238,7 +236,7 @@ public: * 时间复杂度: O(n * 2^n) * 空间复杂度: O(n) -# 总结 +## 总结 开篇就介绍了本题与[77.组合](https://programmercarl.com/0077.组合.html)的区别,相对来说加了元素总和的限制,如果做完[77.组合](https://programmercarl.com/0077.组合.html)再做本题在合适不过。 @@ -249,10 +247,10 @@ public: -# 其他语言版本 +## 其他语言版本 -## Java +### Java 模板方法 @@ -358,7 +356,7 @@ class Solution { } ``` -## Python +### Python ```py class Solution: @@ -383,7 +381,7 @@ class Solution: ``` -## Go +### Go 回溯+减枝 @@ -418,7 +416,7 @@ func dfs(k, n int, start int, sum int) { } ``` -## javaScript +### JavaScript ```js /** @@ -455,7 +453,7 @@ var combinationSum3 = function(k, n) { }; ``` -## TypeScript +### TypeScript ```typescript function combinationSum3(k: number, n: number): number[][] { @@ -479,7 +477,7 @@ function combinationSum3(k: number, n: number): number[][] { }; ``` -## Rust +### Rust ```Rust impl Solution { @@ -516,7 +514,7 @@ impl Solution { } ``` -## C +### C ```c int* path; @@ -575,7 +573,7 @@ int** combinationSum3(int k, int n, int* returnSize, int** returnColumnSizes){ } ``` -## Swift +### Swift ```swift func combinationSum3(_ count: Int, _ targetSum: Int) -> [[Int]] { @@ -607,7 +605,7 @@ func combinationSum3(_ count: Int, _ targetSum: Int) -> [[Int]] { } ``` -## Scala +### Scala ```scala object Solution { From 87b215dd2e46588f3c97b25ba4cd2e3b15dbff61 Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Mon, 24 Jul 2023 11:11:15 +0800 Subject: [PATCH 2114/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=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=20=E6=8E=92=E7=89=88=E6=A0=BC=E5=BC=8F=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...27\346\257\215\347\273\204\345\220\210.md" | 36 +++++++++---------- 1 file changed, 17 insertions(+), 19 deletions(-) diff --git "a/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" "b/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" index cf5e45207b..b3ba1e5e5c 100644 --- "a/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" +++ "b/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" @@ -21,12 +21,12 @@ 说明:尽管上面的答案是按字典序排列的,但是你可以任意选择答案输出的顺序。 -# 算法公开课 +## 算法公开课 -**《代码随想录》算法视频公开课:[还得用回溯算法!| LeetCode:17.电话号码的字母组合](https://www.bilibili.com/video/BV1yV4y1V7Ug),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html)::[还得用回溯算法!| LeetCode:17.电话号码的字母组合](https://www.bilibili.com/video/BV1yV4y1V7Ug),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 -# 思路 +## 思路 从示例上来说,输入"23",最直接的想法就是两层for循环遍历了吧,正好把组合的情况都输出了。 @@ -40,7 +40,7 @@ 2. 两个字母就两个for循环,三个字符我就三个for循环,以此类推,然后发现代码根本写不出来 3. 输入1 * #按键等等异常情况 -## 数字和字母如何映射 +### 数字和字母如何映射 可以使用map或者定义一个二维数组,例如:string letterMap[10],来做映射,我这里定义一个二维数组,代码如下: @@ -59,7 +59,7 @@ const string letterMap[10] = { }; ``` -## 回溯法来解决n个for循环的问题 +### 回溯法来解决n个for循环的问题 对于回溯法还不了解的同学看这篇:[关于回溯算法,你该了解这些!](https://programmercarl.com/回溯算法理论基础.html) @@ -134,9 +134,6 @@ for (int i = 0; i < letters.size(); i++) { **但是要知道会有这些异常,如果是现场面试中,一定要考虑到!** - -## C++代码 - 关键地方都讲完了,按照[关于回溯算法,你该了解这些!](https://programmercarl.com/回溯算法理论基础.html)中的回溯法模板,不难写出如下C++代码: @@ -233,7 +230,7 @@ public: 所以大家可以按照版本一来写就可以了。 -# 总结 +## 总结 本篇将题目的三个要点一一列出,并重点强调了和前面讲解过的[77. 组合](https://programmercarl.com/0077.组合.html)和[216.组合总和III](https://programmercarl.com/0216.组合总和III.html)的区别,本题是多个集合求组合,所以在回溯的搜索过程中,都有一些细节需要注意的。 @@ -241,10 +238,10 @@ public: -# 其他语言版本 +## 其他语言版本 -## Java +### Java ```Java class Solution { @@ -286,7 +283,7 @@ class Solution { } ``` -## Python +### Python 回溯 ```python class Solution: @@ -435,7 +432,7 @@ class Solution: -## Go +### Go 主要在于递归中传递下一个数字 @@ -470,7 +467,7 @@ func dfs(digits string, start int) { } ``` -## javaScript +### JavaScript ```js var letterCombinations = function(digits) { @@ -497,7 +494,7 @@ var letterCombinations = function(digits) { }; ``` -## TypeScript +### TypeScript ```typescript function letterCombinations(digits: string): string[] { @@ -531,7 +528,7 @@ function letterCombinations(digits: string): string[] { }; ``` -## Rust +### Rust ```Rust const map: [&str; 10] = [ @@ -563,7 +560,7 @@ impl Solution { } ``` -## C +### C ```c char* path; @@ -625,7 +622,7 @@ char ** letterCombinations(char * digits, int* returnSize){ } ``` -## Swift +### Swift ```swift func letterCombinations(_ digits: String) -> [String] { @@ -666,7 +663,7 @@ func letterCombinations(_ digits: String) -> [String] { } ``` -## Scala: +### Scala ```scala object Solution { @@ -702,3 +699,4 @@ object Solution { + From 2ed8beef418343adccc7ebc755a8c40159b6fe0d Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Mon, 24 Jul 2023 11:15:23 +0800 Subject: [PATCH 2115/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200039.=E7=BB=84?= =?UTF-8?q?=E5=90=88=E6=80=BB=E5=92=8C=20=E6=8E=92=E7=89=88=E6=A0=BC?= =?UTF-8?q?=E5=BC=8F=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...04\345\220\210\346\200\273\345\222\214.md" | 33 ++++++++++--------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git "a/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" "b/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" index 4d9466c3c0..2a36ce5adb 100644 --- "a/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" +++ "b/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" @@ -39,11 +39,11 @@ candidates 中的数字可以无限制重复被选取。 [3,5] ] -# 算法公开课 +## 算法公开课 -**《代码随想录》算法视频公开课:[Leetcode:39. 组合总和讲解](https://www.bilibili.com/video/BV1KT4y1M7HJ),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[Leetcode:39. 组合总和讲解](https://www.bilibili.com/video/BV1KT4y1M7HJ),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 -# 思路 +## 思路 题目中的**无限制重复被选取,吓得我赶紧想想 出现0 可咋办**,然后看到下面提示:1 <= candidates[i] <= 200,我就放心了。 @@ -57,7 +57,7 @@ candidates 中的数字可以无限制重复被选取。 而在[77.组合](https://programmercarl.com/0077.组合.html)和[216.组合总和III](https://programmercarl.com/0216.组合总和III.html) 中都可以知道要递归K层,因为要取k个元素的组合。 -## 回溯三部曲 +### 回溯三部曲 * 递归函数参数 @@ -156,7 +156,7 @@ public: }; ``` -## 剪枝优化 +### 剪枝优化 在这个树形结构中: @@ -217,7 +217,7 @@ public: * 时间复杂度: O(n * 2^n),注意这只是复杂度的上界,因为剪枝的存在,真实的时间复杂度远小于此 * 空间复杂度: O(target) -# 总结 +## 总结 本题和我们之前讲过的[77.组合](https://programmercarl.com/0077.组合.html)、[216.组合总和III](https://programmercarl.com/0216.组合总和III.html)有两点不同: @@ -238,10 +238,10 @@ public: -# 其他语言版本 +## 其他语言版本 -## Java +### Java ```Java // 剪枝优化 @@ -271,7 +271,7 @@ class Solution { } ``` -## Python +### Python 回溯(版本一) @@ -370,7 +370,7 @@ class Solution: ``` -## Go +### Go 主要在于递归中传递下一个数字 @@ -404,7 +404,7 @@ func dfs(candidates []int, start int, target int) { } ``` -## JavaScript +### JavaScript ```js var combinationSum = function(candidates, target) { @@ -430,7 +430,7 @@ var combinationSum = function(candidates, target) { }; ``` -## TypeScript +### TypeScript ```typescript function combinationSum(candidates: number[], target: number): number[][] { @@ -456,7 +456,7 @@ function combinationSum(candidates: number[], target: number): number[][] { }; ``` -## Rust +### Rust ```Rust impl Solution { @@ -485,7 +485,7 @@ impl Solution { } ``` -## C +### C ```c int* path; @@ -541,7 +541,7 @@ int** combinationSum(int* candidates, int candidatesSize, int target, int* retur } ``` -## Swift +### Swift ```swift func combinationSum(_ candidates: [Int], _ target: Int) -> [[Int]] { @@ -570,7 +570,7 @@ func combinationSum(_ candidates: [Int], _ target: Int) -> [[Int]] { } ``` -## Scala +### Scala ```scala object Solution { @@ -604,3 +604,4 @@ object Solution { + From c3827c43442ad816f4575d7d45958c36dfc92c8a Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Mon, 24 Jul 2023 11:17:47 +0800 Subject: [PATCH 2116/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200040.=E7=BB=84?= =?UTF-8?q?=E5=90=88=E6=80=BB=E5=92=8CII=20=E6=8E=92=E7=89=88=E6=A0=BC?= =?UTF-8?q?=E5=BC=8F=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\345\220\210\346\200\273\345\222\214II.md" | 39 ++++++++----------- 1 file changed, 17 insertions(+), 22 deletions(-) diff --git "a/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" "b/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" index 9094020ea9..33e4a46f51 100644 --- "a/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" +++ "b/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" @@ -41,13 +41,11 @@ candidates 中的每个数字在每个组合中只能使用一次。 ] ``` -# 算法公开课 +## 算法公开课 -**《代码随想录》算法视频公开课:[回溯算法中的去重,树层去重树枝去重,你弄清楚了没?| LeetCode:40.组合总和II](https://www.bilibili.com/video/BV12V4y1V73A),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[回溯算法中的去重,树层去重树枝去重,你弄清楚了没?| LeetCode:40.组合总和II](https://www.bilibili.com/video/BV12V4y1V73A),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 - - -# 思路 +## 思路 这道题目和[39.组合总和](https://programmercarl.com/0039.组合总和.html)如下区别: @@ -86,7 +84,7 @@ candidates 中的每个数字在每个组合中只能使用一次。 可以看到图中,每个节点相对于 [39.组合总和](https://mp.weixin.qq.com/s/FLg8G6EjVcxBjwCbzpACPw)我多加了used数组,这个used数组下面会重点介绍。 -## 回溯三部曲 +### 回溯三部曲 * **递归函数参数** @@ -217,7 +215,7 @@ public: * 时间复杂度: O(n * 2^n) * 空间复杂度: O(n) -## 补充 +### 补充 这里直接用startIndex来去重也是可以的, 就不用used数组了。 @@ -257,7 +255,7 @@ public: ``` -# 总结 +## 总结 本题同样是求组合总和,但就是因为其数组candidates有重复元素,而要求不能有重复的组合,所以相对于[39.组合总和](https://programmercarl.com/0039.组合总和.html)难度提升了不少。 @@ -265,14 +263,10 @@ public: 所以Carl有必要把去重的这块彻彻底底的给大家讲清楚,**就连“树层去重”和“树枝去重”都是我自创的词汇,希望对大家理解有帮助!** +## 其他语言版本 - - -# 其他语言版本 - - -## Java +### Java **使用标记数组** ```Java class Solution { @@ -355,7 +349,7 @@ class Solution { } ``` -## Python +### Python 回溯 ```python class Solution: @@ -442,7 +436,7 @@ class Solution: self.combinationSumHelper(candidates, target - candidates[i], i + 1, path, results) path.pop() ``` -## Go +### Go 主要在于如何在回溯中去重 **使用used数组** @@ -518,7 +512,7 @@ func dfs(candidates []int, start int, target int) { } } ``` -## javaScript +### JavaScript ```js /** @@ -588,7 +582,7 @@ var combinationSum2 = function(candidates, target) { }; ``` -## TypeScript +### TypeScript ```typescript function combinationSum2(candidates: number[], target: number): number[][] { @@ -619,7 +613,7 @@ function combinationSum2(candidates: number[], target: number): number[][] { }; ``` -## Rust +### Rust ```Rust impl Solution { @@ -654,7 +648,7 @@ impl Solution { } ``` -## C +### C ```c int* path; @@ -716,7 +710,7 @@ int** combinationSum2(int* candidates, int candidatesSize, int target, int* retu } ``` -## Swift +### Swift ```swift func combinationSum2(_ candidates: [Int], _ target: Int) -> [[Int]] { @@ -749,7 +743,7 @@ func combinationSum2(_ candidates: [Int], _ target: Int) -> [[Int]] { ``` -## Scala +### Scala ```scala object Solution { @@ -784,3 +778,4 @@ object Solution { + From 7bd8751a0cf255e17652065d4b1894344032ceb0 Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Mon, 24 Jul 2023 14:07:54 +0800 Subject: [PATCH 2117/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200131.=E5=88=86?= =?UTF-8?q?=E5=89=B2=E5=9B=9E=E6=96=87=E4=B8=B2=20=E6=8E=92=E7=89=88?= =?UTF-8?q?=E6=A0=BC=E5=BC=8F=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...62\345\233\236\346\226\207\344\270\262.md" | 37 +++++++++---------- 1 file changed, 18 insertions(+), 19 deletions(-) diff --git "a/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" "b/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" index 92fed58a2e..ca73e9f7ca 100644 --- "a/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" +++ "b/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" @@ -23,12 +23,12 @@ ["a","a","b"] ] -# 算法公开课 +## 算法公开课 -**《代码随想录》算法视频公开课:[131.分割回文串](https://www.bilibili.com/video/BV1c54y1e7k6),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[131.分割回文串](https://www.bilibili.com/video/BV1c54y1e7k6),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 -# 思路 +## 思路 本题这涉及到两个关键问题: @@ -58,7 +58,7 @@ 此时可以发现,切割问题的回溯搜索的过程和组合问题的回溯搜索的过程是差不多的。 -## 回溯三部曲 +### 回溯三部曲 * 递归函数参数 @@ -124,7 +124,7 @@ for (int i = startIndex; i < s.size(); i++) { **注意切割过的位置,不能重复切割,所以,backtracking(s, i + 1); 传入下一层的起始位置为i + 1**。 -## 判断回文子串 +### 判断回文子串 最后我们看一下回文子串要如何判断了,判断一个字符串是否是回文。 @@ -147,8 +147,6 @@ for (int i = startIndex; i < s.size(); i++) { 此时关键代码已经讲解完毕,整体代码如下(详细注释了) -## C++整体代码 - 根据Carl给出的回溯算法模板: ```CPP @@ -212,7 +210,7 @@ public: * 时间复杂度: O(n * 2^n) * 空间复杂度: O(n^2) -# 优化 +## 优化 上面的代码还存在一定的优化空间, 在于如何更高效的计算一个子字符串是否是回文字串。上述代码```isPalindrome```函数运用双指针的方法来判定对于一个字符串```s```, 给定起始下标和终止下标, 截取出的子字符串是否是回文字串。但是其中有一定的重复计算存在: @@ -272,7 +270,7 @@ public: ``` -# 总结 +## 总结 这道题目在leetcode上是中等,但可以说是hard的题目了,但是代码其实就是按照模板的样子来的。 @@ -306,10 +304,10 @@ public: -# 其他语言版本 +## 其他语言版本 -## Java +### Java ```Java class Solution { List> lists = new ArrayList<>(); @@ -351,7 +349,7 @@ class Solution { } ``` -## Python +### Python 回溯 基本版 ```python class Solution: @@ -473,7 +471,7 @@ class Solution: return all(s[i] == s[len(s) - 1 - i] for i in range(len(s) // 2)) ``` -## Go +### Go ```go var ( path []string // 放已经回文的子串 @@ -512,7 +510,7 @@ func isPalindrome(s string) bool { } ``` -## javaScript +### JavaScript ```js /** @@ -545,7 +543,7 @@ var partition = function(s) { }; ``` -## TypeScript +### TypeScript ```typescript function partition(s: string): string[][] { @@ -582,7 +580,7 @@ function partition(s: string): string[][] { }; ``` -## C +### C ```c char** path; @@ -679,7 +677,7 @@ char*** partition(char* s, int* returnSize, int** returnColumnSizes){ } ``` -## Swift +### Swift ```swift func partition(_ s: String) -> [[String]] { @@ -719,7 +717,7 @@ func partition(_ s: String) -> [[String]] { } ``` -## Rust +### Rust **回溯+函数判断回文串** ```Rust @@ -808,7 +806,7 @@ impl Solution { ``` -## Scala +### Scala ```scala object Solution { @@ -855,3 +853,4 @@ object Solution { + From 6f711891ba9df855e68147bc0f609753bd705cf7 Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Mon, 24 Jul 2023 14:11:47 +0800 Subject: [PATCH 2118/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200093.=E5=A4=8D?= =?UTF-8?q?=E5=8E=9FIP=E5=9C=B0=E5=9D=80=20=E6=8E=92=E7=89=88=E6=A0=BC?= =?UTF-8?q?=E5=BC=8F=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\345\216\237IP\345\234\260\345\235\200.md" | 41 ++++++++----------- 1 file changed, 17 insertions(+), 24 deletions(-) diff --git "a/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" "b/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" index 55e57dde5f..59cd92da59 100644 --- "a/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" +++ "b/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" @@ -40,16 +40,12 @@ * 0 <= s.length <= 3000 * s 仅由数字组成 -# 算法公开课 +## 算法公开课 -**《代码随想录》算法视频公开课:[93.复原IP地址](https://www.bilibili.com/video/BV1XP4y1U73i/),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[回溯算法如何分割字符串并判断是合法IP?| LeetCode:93.复原IP地址](https://www.bilibili.com/video/BV1XP4y1U73i/),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 -# 算法公开课 -**《代码随想录》算法视频公开课:[回溯算法如何分割字符串并判断是合法IP?| LeetCode:93.复原IP地址](https://www.bilibili.com/video/BV1XP4y1U73i/),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 - - -# 思路 +## 思路 做这道题目之前,最好先把[131.分割回文串](https://programmercarl.com/0131.分割回文串.html)这个做了。 @@ -63,7 +59,7 @@ ![93.复原IP地址](https://code-thinking-1253855093.file.myqcloud.com/pics/20201123203735933.png) -## 回溯三部曲 +### 回溯三部曲 * 递归参数 @@ -134,7 +130,7 @@ for (int i = startIndex; i < s.size(); i++) { } ``` -## 判断子串是否合法 +### 判断子串是否合法 最后就是在写一个判断段位是否是有效段位了。 @@ -169,8 +165,6 @@ bool isValid(const string& s, int start, int end) { } ``` -## C++代码 - 根据[关于回溯算法,你该了解这些!](https://programmercarl.com/回溯算法理论基础.html)给出的回溯算法模板: @@ -247,7 +241,7 @@ public: * 时间复杂度: O(3^4),IP地址最多包含4个数字,每个数字最多有3种可能的分割方式,则搜索树的最大深度为4,每个节点最多有3个子节点。 * 空间复杂度: O(n) -# 总结 +## 总结 在[131.分割回文串](https://programmercarl.com/0131.分割回文串.html)中我列举的分割字符串的难点,本题都覆盖了。 @@ -259,9 +253,9 @@ public: -# 其他语言版本 +## 其他语言版本 -## java +### Java ```java class Solution { @@ -402,7 +396,7 @@ class Solution { ``` -## python +### Python 回溯(版本一) ```python @@ -478,9 +472,7 @@ class Solution: ``` - - -## Go +### Go ```go var ( @@ -517,7 +509,7 @@ func dfs(s string, start int) { } ``` -## JavaScript +### JavaScript ```js /** @@ -547,7 +539,7 @@ var restoreIpAddresses = function(s) { }; ``` -## TypeScript +### TypeScript ```typescript function isValidIpSegment(str: string): boolean { @@ -586,7 +578,7 @@ function restoreIpAddresses(s: string): string[] { }; ``` -## Rust +### Rust ```Rust impl Solution { @@ -643,7 +635,7 @@ impl Solution { } ``` -## C +### C ```c //记录结果 char** result; @@ -719,7 +711,7 @@ char ** restoreIpAddresses(char * s, int* returnSize){ } ``` -## Swift +### Swift ```swift // 判断区间段是否合法 @@ -766,7 +758,7 @@ func restoreIpAddresses(_ s: String) -> [String] { } ``` -## Scala +### Scala ```scala object Solution { @@ -813,3 +805,4 @@ object Solution { + From 92695ceeddbc3b9c39d367bd522a44e1b37502b1 Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Mon, 24 Jul 2023 14:16:33 +0800 Subject: [PATCH 2119/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200078.=E5=AD=90?= =?UTF-8?q?=E9=9B=86=E9=97=AE=E9=A2=98=20=E6=8E=92=E7=89=88=E6=A0=BC?= =?UTF-8?q?=E5=BC=8F=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "problems/0078.\345\255\220\351\233\206.md" | 33 ++++++++++----------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git "a/problems/0078.\345\255\220\351\233\206.md" "b/problems/0078.\345\255\220\351\233\206.md" index 21009f6a36..5f3654deae 100644 --- "a/problems/0078.\345\255\220\351\233\206.md" +++ "b/problems/0078.\345\255\220\351\233\206.md" @@ -27,12 +27,12 @@   [] ] -# 算法公开课 +## 算法公开课 -**《代码随想录》算法视频公开课:[回溯算法解决子集问题,树上节点都是目标集和! | LeetCode:78.子集](https://www.bilibili.com/video/BV1U84y1q7Ci),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[回溯算法解决子集问题,树上节点都是目标集和! | LeetCode:78.子集](https://www.bilibili.com/video/BV1U84y1q7Ci),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 -# 思路 +## 思路 求子集问题和[77.组合](https://programmercarl.com/0077.组合.html)和[131.分割回文串](https://programmercarl.com/0131.分割回文串.html)又不一样了。 @@ -52,7 +52,7 @@ 从图中红线部分,可以看出**遍历这个树的时候,把所有节点都记录下来,就是要求的子集集合**。 -## 回溯三部曲 +### 回溯三部曲 * 递归函数参数 @@ -102,8 +102,6 @@ for (int i = startIndex; i < nums.size(); i++) { } ``` -## C++代码 - 根据[关于回溯算法,你该了解这些!](https://programmercarl.com/回溯算法理论基础.html)给出的回溯算法模板: ``` @@ -158,7 +156,7 @@ public: 并不会,因为每次递归的下一层就是从i+1开始的。 -# 总结 +## 总结 相信大家经过了 * 组合问题: @@ -178,10 +176,10 @@ public: **而组合问题、分割问题是收集树形结构中叶子节点的结果**。 -# 其他语言版本 +## 其他语言版本 -## Java +### Java ```java class Solution { List> result = new ArrayList<>();// 存放符合条件结果的集合 @@ -205,7 +203,7 @@ class Solution { } ``` -## Python +### Python ```python class Solution: def subsets(self, nums): @@ -224,7 +222,7 @@ class Solution: path.pop() ``` -## Go +### Go ```Go var ( path []int @@ -248,7 +246,7 @@ func dfs(nums []int, start int) { } ``` -## Javascript +### Javascript ```Javascript var subsets = function(nums) { @@ -267,7 +265,7 @@ var subsets = function(nums) { }; ``` -## TypeScript +### TypeScript ```typescript function subsets(nums: number[]): number[][] { @@ -287,7 +285,7 @@ function subsets(nums: number[]): number[][] { }; ``` -## Rust +### Rust ```Rust impl Solution { @@ -311,7 +309,7 @@ impl Solution { } ``` -## C +### C ```c int* path; @@ -369,7 +367,7 @@ int** subsets(int* nums, int numsSize, int* returnSize, int** returnColumnSizes) } ``` -## Swift +### Swift ```swift func subsets(_ nums: [Int]) -> [[Int]] { @@ -392,7 +390,7 @@ func subsets(_ nums: [Int]) -> [[Int]] { } ``` -## Scala +### Scala 思路一: 使用本题解思路 @@ -451,3 +449,4 @@ object Solution { + From cbec2c04ed9c107921834854f41b36dfd9cab785 Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Mon, 24 Jul 2023 14:50:02 +0800 Subject: [PATCH 2120/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200090.=E5=AD=90?= =?UTF-8?q?=E9=9B=86II=20=E6=8E=92=E7=89=88=E6=A0=BC=E5=BC=8F=E6=9B=B4?= =?UTF-8?q?=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "problems/0090.\345\255\220\351\233\206II.md" | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git "a/problems/0090.\345\255\220\351\233\206II.md" "b/problems/0090.\345\255\220\351\233\206II.md" index 3238ee52a2..88c8bdade6 100644 --- "a/problems/0090.\345\255\220\351\233\206II.md" +++ "b/problems/0090.\345\255\220\351\233\206II.md" @@ -3,8 +3,6 @@

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

- - # 90.子集II [力扣题目链接](https://leetcode.cn/problems/subsets-ii/) @@ -25,9 +23,9 @@ [] ] -# 算法公开课 +## 算法公开课 -**《代码随想录》算法视频公开课:[回溯算法解决子集问题,如何去重?| LeetCode:90.子集II](https://www.bilibili.com/video/BV1vm4y1F71J/),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[回溯算法解决子集问题,如何去重?| LeetCode:90.子集II](https://www.bilibili.com/video/BV1vm4y1F71J/),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 ## 思路 @@ -240,7 +238,7 @@ class Solution { -#### Python3 +### Python3 回溯 利用used数组去重 ```python @@ -646,3 +644,4 @@ object Solution { + From 322f817666b8bd7c65477a9168bb1db5c4f16410 Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Mon, 24 Jul 2023 14:51:29 +0800 Subject: [PATCH 2121/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200491.=E9=80=92?= =?UTF-8?q?=E5=A2=9E=E5=AD=90=E5=BA=8F=E5=88=97=20=E6=8E=92=E7=89=88?= =?UTF-8?q?=E6=A0=BC=E5=BC=8F=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...0\222\345\242\236\345\255\220\345\272\217\345\210\227.md" | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git "a/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" "b/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" index 4b21008ea5..e2011372f8 100644 --- "a/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" @@ -23,9 +23,9 @@ * 数组中的整数范围是 [-100,100]。 * 给定数组中可能包含重复数字,相等的数字应该被视为递增的一种情况。 -# 算法公开课 +## 算法公开课 -**《代码随想录》算法视频公开课:[回溯算法精讲,树层去重与树枝去重 | LeetCode:491.递增子序列](https://www.bilibili.com/video/BV1EG4y1h78v/),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[回溯算法精讲,树层去重与树枝去重 | LeetCode:491.递增子序列](https://www.bilibili.com/video/BV1EG4y1h78v/),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 ## 思路 @@ -619,4 +619,3 @@ object Solution { - From f08c25631fc39152caa4d3f78ffb6b0d02c3f2e5 Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Mon, 24 Jul 2023 14:54:15 +0800 Subject: [PATCH 2122/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20046.=E5=85=A8?= =?UTF-8?q?=E6=8E=92=E5=88=97=20=E6=8E=92=E7=89=88=E6=A0=BC=E5=BC=8F?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "problems/0046.\345\205\250\346\216\222\345\210\227.md" | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git "a/problems/0046.\345\205\250\346\216\222\345\210\227.md" "b/problems/0046.\345\205\250\346\216\222\345\210\227.md" index de1af64295..1f5263a79e 100644 --- "a/problems/0046.\345\205\250\346\216\222\345\210\227.md" +++ "b/problems/0046.\345\205\250\346\216\222\345\210\227.md" @@ -24,9 +24,9 @@ ] -# 算法公开课 +## 算法公开课 -**《代码随想录》算法视频公开课:[组合与排列的区别,回溯算法求解的时候,有何不同?| LeetCode:46.全排列](https://www.bilibili.com/video/BV19v4y1S79W/),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[组合与排列的区别,回溯算法求解的时候,有何不同?| LeetCode:46.全排列](https://www.bilibili.com/video/BV19v4y1S79W/),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 ## 思路 @@ -491,3 +491,4 @@ object Solution { + From f57b19df94a1ed5122571e4482796a8594053af6 Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Mon, 24 Jul 2023 14:55:37 +0800 Subject: [PATCH 2123/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200047.=E5=85=A8?= =?UTF-8?q?=E6=8E=92=E5=88=97II=20=E6=8E=92=E7=89=88=E6=A0=BC=E5=BC=8F?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0047.\345\205\250\346\216\222\345\210\227II.md" | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git "a/problems/0047.\345\205\250\346\216\222\345\210\227II.md" "b/problems/0047.\345\205\250\346\216\222\345\210\227II.md" index afede33a46..4fed8a5c8c 100644 --- "a/problems/0047.\345\205\250\346\216\222\345\210\227II.md" +++ "b/problems/0047.\345\205\250\346\216\222\345\210\227II.md" @@ -31,9 +31,9 @@ * 1 <= nums.length <= 8 * -10 <= nums[i] <= 10 -# 算法公开课 +## 算法公开课 -**《代码随想录》算法视频公开课:[回溯算法求解全排列,如何去重?| LeetCode:47.全排列 II](https://www.bilibili.com/video/BV1R84y1i7Tm/),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[回溯算法求解全排列,如何去重?| LeetCode:47.全排列 II](https://www.bilibili.com/video/BV1R84y1i7Tm/),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 ## 思路 @@ -58,7 +58,7 @@ 在[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 { @@ -170,7 +170,7 @@ if (i > 0 && nums[i] == nums[i - 1] && used[i - 1] == true) { if (i > 0 && nums[i] == nums[i - 1]) { continue; } -``` +``` 其实并不行,一定要加上 `used[i - 1] == false`或者`used[i - 1] == true`,因为 used[i - 1] 要一直是 true 或者一直是false 才可以,而不是 一会是true 一会又是false。 所以这个条件要写上。 @@ -179,7 +179,7 @@ if (i > 0 && nums[i] == nums[i - 1]) { ## 其他语言版本 -### java +### Java ```java class Solution { @@ -221,7 +221,7 @@ class Solution { } ``` -### python +Python ```python class Solution: @@ -526,3 +526,4 @@ object Solution { + From d9fc7a2d0e76b3439f68a165bcfe98553af4b7dd Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Mon, 24 Jul 2023 14:59:16 +0800 Subject: [PATCH 2124/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20=E5=9B=9E?= =?UTF-8?q?=E6=BA=AF=E7=AE=97=E6=B3=95=E5=8E=BB=E9=87=8D=E9=97=AE=E9=A2=98?= =?UTF-8?q?=E7=9A=84=E5=8F=A6=E4=B8=80=E7=A7=8D=E5=86=99=E6=B3=95=20?= =?UTF-8?q?=E6=8E=92=E7=89=88=E6=A0=BC=E5=BC=8F=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...4\270\200\347\247\215\345\206\231\346\263\225.md" | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git "a/problems/\345\233\236\346\272\257\347\256\227\346\263\225\345\216\273\351\207\215\351\227\256\351\242\230\347\232\204\345\217\246\344\270\200\347\247\215\345\206\231\346\263\225.md" "b/problems/\345\233\236\346\272\257\347\256\227\346\263\225\345\216\273\351\207\215\351\227\256\351\242\230\347\232\204\345\217\246\344\270\200\347\247\215\345\206\231\346\263\225.md" index 4e09b9252a..2be79805af 100644 --- "a/problems/\345\233\236\346\272\257\347\256\227\346\263\225\345\216\273\351\207\215\351\227\256\351\242\230\347\232\204\345\217\246\344\270\200\347\247\215\345\206\231\346\263\225.md" +++ "b/problems/\345\233\236\346\272\257\347\256\227\346\263\225\345\216\273\351\207\215\351\227\256\351\242\230\347\232\204\345\217\246\344\270\200\347\247\215\345\206\231\346\263\225.md" @@ -246,8 +246,7 @@ used数组可是全局变量,每层与每层之间公用一个used数组,所 ## 其他语言版本 - -Java: +### Java **47.全排列II** @@ -350,7 +349,7 @@ class Solution { } } ``` -Python: +### Python **90.子集II** @@ -432,7 +431,7 @@ class Solution: ``` -JavaScript: +### JavaScript **90.子集II** @@ -510,7 +509,7 @@ function permuteUnique(nums) { }; ``` -TypeScript: +### TypeScript **90.子集II** @@ -592,7 +591,7 @@ function permuteUnique(nums: number[]): number[][] { }; ``` -Rust: +### Rust **90.子集II**: @@ -713,3 +712,4 @@ impl Solution { + From 42c1bd94ab1bddac9f258730d26275ff6cfeeeec Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Mon, 24 Jul 2023 15:03:21 +0800 Subject: [PATCH 2125/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200332.=E9=87=8D?= =?UTF-8?q?=E6=96=B0=E5=AE=89=E6=8E=92=E8=A1=8C=E7=A8=8B=20=E6=8E=92?= =?UTF-8?q?=E7=89=88=E6=A0=BC=E5=BC=8F=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...11\346\216\222\350\241\214\347\250\213.md" | 29 ++++++++++--------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git "a/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" "b/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" index fa6414e9ac..3798b48d87 100644 --- "a/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" +++ "b/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" @@ -29,9 +29,11 @@ * 输出:["JFK","ATL","JFK","SFO","ATL","SFO"] * 解释:另一种有效的行程是 ["JFK","SFO","ATL","JFK","ATL","SFO"]。但是它自然排序更大更靠后。 -## 思路 +## 算法公开课 + +**如果对回溯算法基础还不了解的话,我还特意录制了一期视频,[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[带你学透回溯算法(理论篇)](https://www.bilibili.com/video/BV1cy4y167mM/)** 可以结合题解和视频一起看,希望对大家理解回溯算法有所帮助。 -**如果对回溯算法基础还不了解的话,我还特意录制了一期视频:[带你学透回溯算法(理论篇)](https://www.bilibili.com/video/BV1cy4y167mM/)** 可以结合题解和视频一起看,希望对大家理解回溯算法有所帮助。 +## 思路 这道题目还是很难的,之前我们用回溯法解决了如下问题:[组合问题](https://programmercarl.com/0077.组合.html),[分割问题](https://programmercarl.com/0093.复原IP地址.html),[子集问题](https://programmercarl.com/0078.子集.html),[排列问题](https://programmercarl.com/0046.全排列.html)。 @@ -53,7 +55,7 @@ 针对以上问题我来逐一解答! -## 如何理解死循环 +### 如何理解死循环 对于死循环,我来举一个有重复机场的例子: @@ -61,7 +63,7 @@ 为什么要举这个例子呢,就是告诉大家,出发机场和到达机场也会重复的,**如果在解题的过程中没有对集合元素处理好,就会死循环。** -## 该记录映射关系 +### 该记录映射关系 有多种解法,字母序靠前排在前面,让很多同学望而退步,如何该记录映射关系呢 ? @@ -90,7 +92,7 @@ unordered_map> targets:unordered_map<出发机场, ma **相当于说我不删,我就做一个标记!** -## 回溯法 +### 回溯法 这道题目我使用回溯法,那么下面按照我总结的回溯模板来: @@ -260,8 +262,8 @@ for (pairtarget : targets[result[result.size() - 1]]) ## 其他语言版本 -### java - +### Java + ```java class Solution { private LinkedList res; @@ -346,7 +348,7 @@ class Solution { } ``` -### python +### Python 回溯 使用used数组 ```python @@ -406,7 +408,7 @@ class Solution: path.pop() # 移除目的地 return False # 没有找到有效行程 -``` +``` 回溯 使用字典 逆序 ```python from collections import defaultdict @@ -430,8 +432,8 @@ class Solution: self.backtracking(next_airport, targets, result) # 递归调用回溯函数进行深度优先搜索 result.append(airport) # 将当前机场添加到行程路径中 ``` - -### GO + +### Go ```go type pair struct { target string @@ -577,7 +579,7 @@ function findItinerary(tickets: string[][]): string[] { }; ``` -### C语言 +### C ```C char **result; @@ -638,7 +640,7 @@ char ** findItinerary(char *** tickets, int ticketsSize, int* ticketsColSize, in return result; } ``` - + ### Swift 直接迭代tickets数组: @@ -791,3 +793,4 @@ impl Solution { + From f58a35db26a0fa4f4b4ae552e3713392b9e1d193 Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Mon, 24 Jul 2023 15:04:28 +0800 Subject: [PATCH 2126/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200051.N=E7=9A=87?= =?UTF-8?q?=E5=90=8E=20=E6=8E=92=E7=89=88=E6=A0=BC=E5=BC=8F=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "problems/0051.N\347\232\207\345\220\216.md" | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git "a/problems/0051.N\347\232\207\345\220\216.md" "b/problems/0051.N\347\232\207\345\220\216.md" index 13cdafb829..6bc4fa78c6 100644 --- "a/problems/0051.N\347\232\207\345\220\216.md" +++ "b/problems/0051.N\347\232\207\345\220\216.md" @@ -28,9 +28,9 @@ n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上, * 输入:n = 1 * 输出:[["Q"]] -# 算法公开课 +## 算法公开课 -**《代码随想录》算法视频公开课:[这就是传说中的N皇后? 回溯算法安排!| LeetCode:51.N皇后](https://www.bilibili.com/video/BV1Rd4y1c7Bq/),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[这就是传说中的N皇后? 回溯算法安排!| LeetCode:51.N皇后](https://www.bilibili.com/video/BV1Rd4y1c7Bq/),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 ## 思路 @@ -864,3 +864,4 @@ object Solution { + From dacd87b009f8a106172c4e07853bdf2b3aaf664f Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Mon, 24 Jul 2023 15:05:52 +0800 Subject: [PATCH 2127/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200051.N=E7=9A=87?= =?UTF-8?q?=E5=90=8EII=20=E6=8E=92=E7=89=88=E6=A0=BC=E5=BC=8F=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "problems/0052.N\347\232\207\345\220\216II.md" | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git "a/problems/0052.N\347\232\207\345\220\216II.md" "b/problems/0052.N\347\232\207\345\220\216II.md" index 90b920bac4..ac774c83f9 100644 --- "a/problems/0052.N\347\232\207\345\220\216II.md" +++ "b/problems/0052.N\347\232\207\345\220\216II.md" @@ -43,13 +43,11 @@ n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并   ".Q.."] ] -# 思路 +## 思路 详看:[51.N皇后](https://mp.weixin.qq.com/s/lU_QwCMj6g60nh8m98GAWg) ,基本没有区别 -# C++代码 - ```CPP class Solution { private: @@ -100,8 +98,9 @@ public: }; ``` -# 其他语言补充 -JavaScript +## 其他语言补充 +### JavaScript + ```javascript var totalNQueens = function(n) { let count = 0; @@ -146,7 +145,7 @@ var totalNQueens = function(n) { }; ``` -TypeScript: +### TypeScript ```typescript // 0-该格为空,1-该格有皇后 @@ -199,7 +198,7 @@ function checkValid(chess: GridStatus[][], i: number, j: number, n: number): boo } ``` -C +### C ```c //path[i]为在i行,path[i]列上存在皇后 @@ -258,7 +257,8 @@ int totalNQueens(int n){ return answer; } ``` -Java +### Java + ```java class Solution { int count = 0; @@ -310,4 +310,3 @@ class Solution { - From 028bfdc662a56e8f0c7ff17bd743a2d21fe0f016 Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Mon, 24 Jul 2023 15:11:08 +0800 Subject: [PATCH 2128/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200037.=E8=A7=A3?= =?UTF-8?q?=E6=95=B0=E7=8B=AC=20=E6=8E=92=E7=89=88=E6=A0=BC=E5=BC=8F?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0037.\350\247\243\346\225\260\347\213\254.md" | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git "a/problems/0037.\350\247\243\346\225\260\347\213\254.md" "b/problems/0037.\350\247\243\346\225\260\347\213\254.md" index 6edd3c5b5e..1763063eb7 100644 --- "a/problems/0037.\350\247\243\346\225\260\347\213\254.md" +++ "b/problems/0037.\350\247\243\346\225\260\347\213\254.md" @@ -6,8 +6,7 @@

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

- -如果对回溯法理论还不清楚的同学,可以先看这个视频[视频来了!!带你学透回溯算法(理论篇)](https://mp.weixin.qq.com/s/wDd5azGIYWjbU0fdua_qBg) +> 如果对回溯法理论还不清楚的同学,可以先看这个视频[视频来了!!带你学透回溯算法(理论篇)](https://mp.weixin.qq.com/s/wDd5azGIYWjbU0fdua_qBg) # 37. 解数独 @@ -35,11 +34,9 @@ * 你可以假设给定的数独只有唯一解。 * 给定数独永远是 9x9 形式的。 -# 算法公开课 - -**《代码随想录》算法视频公开课:[回溯算法二维递归?解数独不过如此!| LeetCode:37. 解数独](https://www.bilibili.com/video/BV1TW4y1471V/),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 - +## 算法公开课 +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[回溯算法二维递归?解数独不过如此!| LeetCode:37. 解数独](https://www.bilibili.com/video/BV1TW4y1471V/),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 ## 思路 @@ -764,3 +761,4 @@ object Solution { + From 93cba02a128b8aa9cd5982d36537a802dda03262 Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Mon, 24 Jul 2023 15:15:04 +0800 Subject: [PATCH 2129/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20=E5=9B=9E?= =?UTF-8?q?=E6=BA=AF=E6=80=BB=E7=BB=93=20=E6=8E=92=E7=89=88=E6=A0=BC?= =?UTF-8?q?=E5=BC=8F=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...36\346\272\257\346\200\273\347\273\223.md" | 49 ++++++++++--------- 1 file changed, 26 insertions(+), 23 deletions(-) diff --git "a/problems/\345\233\236\346\272\257\346\200\273\347\273\223.md" "b/problems/\345\233\236\346\272\257\346\200\273\347\273\223.md" index 21d78bc211..f2e46829cb 100644 --- "a/problems/\345\233\236\346\272\257\346\200\273\347\273\223.md" +++ "b/problems/\345\233\236\346\272\257\346\200\273\347\273\223.md" @@ -8,7 +8,9 @@ > 20张树形结构图、14道精选回溯题目,21篇回溯法精讲文章,由浅入深,一气呵成,这是全网最强回溯算法总结! -# 回溯法理论基础 +# 回溯总结篇 + +## 回溯法理论基础 转眼间[「代码随想录」](https://img-blog.csdnimg.cn/20200815195519696.png)里已经分享连续讲解了21天的回溯算法,是时候做一个大总结了,本篇高能,需要花费很大的精力来看! @@ -51,10 +53,10 @@ void backtracking(参数) { **事实证明这个模板会伴随整个回溯法系列!** -# 组合问题 - ## 组合问题 +### 组合问题 + 在[回溯算法:求组合问题!](https://programmercarl.com/0077.组合.html)中,我们开始用回溯法解决第一道题目:组合问题。 我在文中开始的时候给大家列举k层for循环例子,进而得出都是同样是暴力解法,为什么要用回溯法! @@ -82,9 +84,9 @@ void backtracking(参数) { **在for循环上做剪枝操作是回溯法剪枝的常见套路!** 后面的题目还会经常用到。 -## 组合总和 +### 组合总和 -### 组合总和(一) +#### 组合总和(一) 在[回溯算法:求组合总和!](https://programmercarl.com/0216.组合总和III.html)中,相当于 [回溯算法:求组合问题!](https://programmercarl.com/0077.组合.html)加了一个元素总和的限制。 @@ -99,7 +101,7 @@ void backtracking(参数) { 所以剪枝的代码可以在for循环加上 `i <= 9 - (k - path.size()) + 1` 的限制! -### 组合总和(二) +#### 组合总和(二) 在[回溯算法:求组合总和(二)](https://programmercarl.com/0039.组合总和.html)中讲解的组合总和问题,和[回溯算法:求组合问题!](https://programmercarl.com/0077.组合.html),[回溯算法:求组合总和!](https://programmercarl.com/0216.组合总和III.html)和区别是:本题没有数量要求,可以无限重复,但是有总和的限制,所以间接的也是有个数的限制。 @@ -128,7 +130,7 @@ for (int i = startIndex; i < candidates.size() && sum + candidates[i] <= target; ![39.组合总和1](https://code-thinking-1253855093.file.myqcloud.com/pics/20201118202115929.png) -### 组合总和(三) +#### 组合总和(三) 在[回溯算法:求组合总和(三)](https://programmercarl.com/0040.组合总和II.html)中集合元素会有重复,但要求解集不能包含重复的组合。 @@ -151,7 +153,7 @@ for (int i = startIndex; i < candidates.size() && sum + candidates[i] <= target; 对于去重,其实排列和子集问题也是一样的道理。 -## 多个集合求组合 +### 多个集合求组合 在[回溯算法:电话号码的字母组合](https://programmercarl.com/0017.电话号码的字母组合.html)中,开始用多个集合来求组合,还是熟悉的模板题目,但是有一些细节。 @@ -167,7 +169,7 @@ for (int i = startIndex; i < candidates.size() && sum + candidates[i] <= target; 其实本题不算难,但也处处是细节,还是要反复琢磨。 -# 切割问题 +## 切割问题 在[回溯算法:分割回文串](https://programmercarl.com/0131.分割回文串.html)中,我们开始讲解切割问题,虽然最后代码看起来好像是一道模板题,但是从分析到学会套用这个模板,是比较难的。 @@ -192,9 +194,9 @@ for (int i = startIndex; i < candidates.size() && sum + candidates[i] <= target; ![131.分割回文串](https://code-thinking-1253855093.file.myqcloud.com/pics/20201118202448642.png) -# 子集问题 +## 子集问题 -## 子集问题(一) +### 子集问题(一) 在[回溯算法:求子集问题!](https://programmercarl.com/0078.子集.html)中讲解了子集问题,**在树形结构中子集问题是要收集所有节点的结果,而组合问题是收集叶子节点的结果**。 @@ -219,7 +221,7 @@ if (startIndex >= nums.size()) { // 终止条件可以不加 } ``` -## 子集问题(二) +### 子集问题(二) 在[回溯算法:求子集问题(二)](https://programmercarl.com/0090.子集II.html)中,开始针对子集问题进行去重。 @@ -229,7 +231,7 @@ if (startIndex >= nums.size()) { // 终止条件可以不加 ![90.子集II](https://code-thinking-1253855093.file.myqcloud.com/pics/2020111217110449.png) -## 递增子序列 +### 递增子序列 在[回溯算法:递增子序列](https://programmercarl.com/0491.递增子序列.html)中,处处都能看到子集的身影,但处处是陷阱,值得好好琢磨琢磨! @@ -247,9 +249,9 @@ if (startIndex >= nums.size()) { // 终止条件可以不加 **相信这个图胜过千言万语的解释了**。 -# 排列问题 +## 排列问题 -## 排列问题(一) +### 排列问题(一) [回溯算法:排列问题!](https://programmercarl.com/0046.全排列.html) 又不一样了。 @@ -266,7 +268,7 @@ if (startIndex >= nums.size()) { // 终止条件可以不加 * 每层都是从0开始搜索而不是startIndex * 需要used数组记录path里都放了哪些元素了 -## 排列问题(二) +### 排列问题(二) 排列问题也要去重了,在[回溯算法:排列问题(二)](https://programmercarl.com/0047.全排列II.html)中又一次强调了“树层去重”和“树枝去重”。 @@ -290,7 +292,7 @@ if (startIndex >= nums.size()) { // 终止条件可以不加 本题used数组即是记录path里都放了哪些元素,同时也用来去重,一举两得。 -# 去重问题 +## 去重问题 以上我都是统一使用used数组来去重的,其实使用set也可以用来去重! @@ -310,7 +312,7 @@ if (startIndex >= nums.size()) { // 终止条件可以不加 used数组可是全局变量,每层与每层之间公用一个used数组,所以空间复杂度是O(n + n),最终空间复杂度还是O(n)。 -# 重新安排行程(图论额外拓展) +## 重新安排行程(图论额外拓展) 之前说过,有递归的地方就有回溯,深度优先搜索也是用递归来实现的,所以往往伴随着回溯。 @@ -327,9 +329,9 @@ used数组可是全局变量,每层与每层之间公用一个used数组,所 本题其实是一道深度优先搜索的题目,但是我完全使用回溯法的思路来讲解这道题题目,**算是给大家拓展一下思维方式,其实深搜和回溯也是分不开的,毕竟最终都是用递归**。 -# 棋盘问题 +## 棋盘问题 -## N皇后问题 +### N皇后问题 在[回溯算法:N皇后问题](https://programmercarl.com/0051.N皇后.html)中终于迎来了传说中的N皇后。 @@ -349,7 +351,7 @@ used数组可是全局变量,每层与每层之间公用一个used数组,所 -## 解数独问题 +### 解数独问题 在[回溯算法:解数独](https://programmercarl.com/0037.解数独.html)中要征服回溯法的最后一道山峰。 @@ -373,7 +375,7 @@ used数组可是全局变量,每层与每层之间公用一个used数组,所 **这样,解数独这么难的问题也被我们攻克了**。 -# 性能分析 +## 性能分析 **关于回溯算法的复杂度分析在网上的资料鱼龙混杂,一些所谓的经典面试书籍不讲回溯算法,算法书籍对这块也避而不谈,感觉就像是算法里模糊的边界**。 @@ -410,7 +412,7 @@ N皇后问题分析: **一般说道回溯算法的复杂度,都说是指数级别的时间复杂度,这也算是一个概括吧!** -# 总结 +## 总结 **[「代码随想录」](https://img-blog.csdnimg.cn/20200815195519696.png)历时21天,14道经典题目分析,20张树形图,21篇回溯法精讲文章,从组合到切割,从子集到排列,从棋盘问题到最后的复杂度分析**,至此收尾了。 @@ -449,3 +451,4 @@ N皇后问题分析: + From a7e35954b094020f7813d90d83a5d7f6ec869a23 Mon Sep 17 00:00:00 2001 From: fwqaaq Date: Mon, 24 Jul 2023 22:37:56 +0800 Subject: [PATCH 2130/3019] =?UTF-8?q?Update=200072.=E7=BC=96=E8=BE=91?= =?UTF-8?q?=E8=B7=9D=E7=A6=BB.md=20about=20rust?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...26\350\276\221\350\267\235\347\246\273.md" | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git "a/problems/0072.\347\274\226\350\276\221\350\267\235\347\246\273.md" "b/problems/0072.\347\274\226\350\276\221\350\267\235\347\246\273.md" index 703e891311..19e7aade7f 100644 --- "a/problems/0072.\347\274\226\350\276\221\350\267\235\347\246\273.md" +++ "b/problems/0072.\347\274\226\350\276\221\350\267\235\347\246\273.md" @@ -401,6 +401,34 @@ int minDistance(char * word1, char * word2){ } ``` +Rust: + +```rust +impl Solution { + pub fn min_distance(word1: String, word2: String) -> i32 { + let mut dp = vec![vec![0; word2.len() + 1]; word1.len() + 1]; + for i in 1..=word2.len() { + dp[0][i] = i; + } + + for (j, v) in dp.iter_mut().enumerate().skip(1) { + v[0] = j; + } + for (i, char1) in word1.chars().enumerate() { + for (j, char2) in word2.chars().enumerate() { + if char1 == char2 { + dp[i + 1][j + 1] = dp[i][j]; + continue; + } + dp[i + 1][j + 1] = dp[i][j + 1].min(dp[i + 1][j]).min(dp[i][j]) + 1; + } + } + + dp[word1.len()][word2.len()] as i32 + } +} +``` +

From 60bb5dc4fc2288182542422fce73691bc120608f Mon Sep 17 00:00:00 2001 From: fwqaaq Date: Mon, 24 Jul 2023 23:27:11 +0800 Subject: [PATCH 2131/3019] =?UTF-8?q?Update=200072.=E7=BC=96=E8=BE=91?= =?UTF-8?q?=E8=B7=9D=E7=A6=BB.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...26\350\276\221\350\267\235\347\246\273.md" | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git "a/problems/0072.\347\274\226\350\276\221\350\267\235\347\246\273.md" "b/problems/0072.\347\274\226\350\276\221\350\267\235\347\246\273.md" index 19e7aade7f..15f35f6c8e 100644 --- "a/problems/0072.\347\274\226\350\276\221\350\267\235\347\246\273.md" +++ "b/problems/0072.\347\274\226\350\276\221\350\267\235\347\246\273.md" @@ -429,6 +429,36 @@ impl Solution { } ``` +> 一维 dp + +```rust +impl Solution { + pub fn min_distance(word1: String, word2: String) -> i32 { + let mut dp = vec![0; word1.len() + 1]; + for (i, v) in dp.iter_mut().enumerate().skip(1) { + *v = i; + } + + for char2 in word2.chars() { + // 相当于 dp[i][0] 的初始化 + let mut pre = dp[0]; + dp[0] += 1; // j = 0, 将前 i 个字符变成空串的个数 + for (j, char1) in word1.chars().enumerate() { + let temp = dp[j + 1]; + if char1 == char2 { + dp[j + 1] = pre; + } else { + dp[j + 1] = dp[j + 1].min(dp[j]).min(pre) + 1; + } + pre = temp; + } + } + + dp[word1.len()] as i32 + } +} +``` +

From 69ad28ca0ecbcd726619d5aad81351d4e275db54 Mon Sep 17 00:00:00 2001 From: fwqaaq Date: Mon, 24 Jul 2023 23:57:57 +0800 Subject: [PATCH 2132/3019] =?UTF-8?q?Update=200647.=E5=9B=9E=E6=96=87?= =?UTF-8?q?=E5=AD=90=E4=B8=B2.md=20about=20rust?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...36\346\226\207\345\255\220\344\270\262.md" | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git "a/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" "b/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" index 084b9f74e6..35396192c0 100644 --- "a/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" +++ "b/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" @@ -517,8 +517,33 @@ function expandRange(s: string, left: number, right: number): number { } ``` +Rust: +> 双指针 + +```rust +impl Solution { + pub fn count_substrings(s: String) -> i32 { + let mut res = 0; + for i in 0..s.len() { + res += Self::extend(&s, i, i, s.len()); + res += Self::extend(&s, i, i + 1, s.len()); + } + res + } + + fn extend(s: &str, mut i: usize, mut j: usize, len: usize) -> i32 { + let mut res = 0; + while i < len && j < len && s[i..=i] == s[j..=j] { + res += 1; + i = i.wrapping_sub(1); + j += 1; + } + res + } +} +```

From 6011184b37f9e1d661edef1b124b5e195ef55bd9 Mon Sep 17 00:00:00 2001 From: fwqaaq Date: Tue, 25 Jul 2023 00:18:19 +0800 Subject: [PATCH 2133/3019] =?UTF-8?q?Update=200647.=E5=9B=9E=E6=96=87?= =?UTF-8?q?=E5=AD=90=E4=B8=B2.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...236\346\226\207\345\255\220\344\270\262.md" | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git "a/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" "b/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" index 35396192c0..52f12d9b03 100644 --- "a/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" +++ "b/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" @@ -519,6 +519,24 @@ function expandRange(s: string, left: number, right: number): number { Rust: +```rust +impl Solution { + pub fn count_substrings(s: String) -> i32 { + let mut dp = vec![vec![false; s.len()]; s.len()]; + let mut res = 0; + + for i in (0..s.len()).rev() { + for j in i..s.len() { + if s[i..=i] == s[j..=j] && (j - i <= 1 || dp[i + 1][j - 1]) { + dp[i][j] = true; + res += 1; + } + } + } + res + } +} +``` > 双指针 From 4822d8ff8cb71d4787a4d6a3f33ecba98fbc9be3 Mon Sep 17 00:00:00 2001 From: fwqaaq Date: Tue, 25 Jul 2023 00:45:10 +0800 Subject: [PATCH 2134/3019] =?UTF-8?q?Update=200516.=E6=9C=80=E9=95=BF?= =?UTF-8?q?=E5=9B=9E=E6=96=87=E5=AD=90=E5=BA=8F=E5=88=97.md=20about=20rust?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...07\345\255\220\345\272\217\345\210\227.md" | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git "a/problems/0516.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\345\272\217\345\210\227.md" "b/problems/0516.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\345\272\217\345\210\227.md" index fcdd57b0f4..2180bab8d9 100644 --- "a/problems/0516.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0516.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\345\272\217\345\210\227.md" @@ -274,7 +274,26 @@ function longestPalindromeSubseq(s: string): number { }; ``` - +Rust: + +```rust +impl Solution { + pub fn longest_palindrome_subseq(s: String) -> i32 { + let mut dp = vec![vec![0; s.len()]; s.len()]; + for i in (0..s.len()).rev() { + dp[i][i] = 1; + for j in i + 1..s.len() { + if s[i..=i] == s[j..=j] { + dp[i][j] = dp[i + 1][j - 1] + 2; + continue; + } + dp[i][j] = dp[i + 1][j].max(dp[i][j - 1]); + } + } + dp[0][s.len() - 1] + } +} +```

From 29c31ca76f32dfc8fc2ba7a593d4a82547ce55d7 Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Tue, 25 Jul 2023 14:46:09 +0800 Subject: [PATCH 2135/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20455.=E5=88=86?= =?UTF-8?q?=E5=8F=91=E9=A5=BC=E5=B9=B2=20=E6=8E=92=E7=89=88=E6=A0=BC?= =?UTF-8?q?=E5=BC=8F=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "problems/0052.N\347\232\207\345\220\216II.md" | 1 + .../0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git "a/problems/0052.N\347\232\207\345\220\216II.md" "b/problems/0052.N\347\232\207\345\220\216II.md" index ac774c83f9..29c2b58818 100644 --- "a/problems/0052.N\347\232\207\345\220\216II.md" +++ "b/problems/0052.N\347\232\207\345\220\216II.md" @@ -310,3 +310,4 @@ class Solution { + diff --git "a/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" "b/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" index ce1987ef1c..c9c1a8525d 100644 --- "a/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" +++ "b/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" @@ -30,9 +30,9 @@ - 0 <= s.length <= 3 \* 10^4 - 1 <= g[i], s[j] <= 2^31 - 1 -# 视频讲解 +## 算法公开课 -**《代码随想录》算法视频公开课:[贪心算法,你想先喂哪个小孩?| LeetCode:455.分发饼干](https://www.bilibili.com/video/BV1MM411b7cq),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[贪心算法,你想先喂哪个小孩?| LeetCode:455.分发饼干](https://www.bilibili.com/video/BV1MM411b7cq),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 ## 思路 From e713f9c90aee716d53a05b1cb6fb35a802f2d8fc Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Tue, 25 Jul 2023 14:48:15 +0800 Subject: [PATCH 2136/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200376.=E6=91=86?= =?UTF-8?q?=E5=8A=A8=E5=BA=8F=E5=88=97=20=E6=8E=92=E7=89=88=E6=A0=BC?= =?UTF-8?q?=E5=BC=8F=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\206\345\212\250\345\272\217\345\210\227.md" | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git "a/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" "b/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" index 08de23ae24..943dfe39b6 100644 --- "a/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" +++ "b/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" @@ -33,11 +33,13 @@ - 输入: [1,2,3,4,5,6,7,8,9] - 输出: 2 -# 视频讲解 +## 算法公开课 -**《代码随想录》算法视频公开课:[贪心算法,寻找摆动有细节!| LeetCode:376.摆动序列](https://www.bilibili.com/video/BV17M411b7NS),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[贪心算法,寻找摆动有细节!| LeetCode:376.摆动序列](https://www.bilibili.com/video/BV17M411b7NS),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 -## 思路 1(贪心解法) +## 思路 + +### 思路 1(贪心解法) 本题要求通过从原始序列中删除一些(也可以不删除)元素来获得子序列,剩下的元素保持其原始顺序。 @@ -69,7 +71,7 @@ 2. 情况二:数组首尾两端 3. 情况三:单调坡中有平坡 -### 情况一:上下坡中有平坡 +#### 情况一:上下坡中有平坡 例如 [1,2,2,2,1]这样的数组,如图: @@ -87,7 +89,7 @@ 所以我们记录峰值的条件应该是: `(preDiff <= 0 && curDiff > 0) || (preDiff >= 0 && curDiff < 0)`,为什么这里允许 prediff == 0 ,就是为了 上面我说的这种情况。 -### 情况二:数组首尾两端 +#### 情况二:数组首尾两端 所以本题统计峰值的时候,数组最左面和最右面如何统计呢? @@ -142,7 +144,7 @@ public: 所以此时我们要讨论情况三! -### 情况三:单调坡度有平坡 +#### 情况三:单调坡度有平坡 在版本一中,我们忽略了一种情况,即 如果在一个单调坡度上有平坡,例如[1,2,2,2,3,4],如图: @@ -187,7 +189,7 @@ public: ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20230108174452.png) -## 思路 2(动态规划) +### 思路 2(动态规划) 考虑用动态规划的思想来解决这个问题。 @@ -696,4 +698,3 @@ object Solution { - From fcd25819e9bb9b6bd8b44ea4664a2f9ac13ee37f Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Tue, 25 Jul 2023 14:49:56 +0800 Subject: [PATCH 2137/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20053.=E6=9C=80?= =?UTF-8?q?=E5=A4=A7=E5=AD=90=E5=BA=8F=E5=92=8C=20=E6=8E=92=E7=89=88?= =?UTF-8?q?=E6=A0=BC=E5=BC=8F=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...201\350\247\204\345\210\222\357\274\211.md" | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git "a/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" "b/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" index 6f3b368676..f1b6470985 100644 --- "a/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" +++ "b/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" @@ -17,7 +17,7 @@ ## 算法公开课 -**《代码随想录》算法视频公开课:[看起来复杂,其实是简单动态规划 | LeetCode:53.最大子序和](https://www.bilibili.com/video/BV19V4y1F7b5),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[看起来复杂,其实是简单动态规划 | LeetCode:53.最大子序和](https://www.bilibili.com/video/BV19V4y1F7b5),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 ## 思路 @@ -97,8 +97,8 @@ public: ## 其他语言版本 +### Java: -Java: ```java /** * 1.dp[i]代表当前下标对应的最大值 @@ -140,7 +140,8 @@ class Solution { } ``` -Python: +### Python: + ```python class Solution: def maxSubArray(self, nums: List[int]) -> int: @@ -153,7 +154,8 @@ class Solution: return result ``` -Go: +### Go: + ```Go // solution // 1, dp @@ -184,7 +186,7 @@ func max(a,b int) int{ } ``` -JavaScript: +### JavaScript: ```javascript const maxSubArray = nums => { @@ -203,8 +205,7 @@ const maxSubArray = nums => { }; ``` - -Scala: +### Scala: ```scala object Solution { @@ -221,7 +222,7 @@ object Solution { } ``` -TypeScript: +### TypeScript: ```typescript function maxSubArray(nums: number[]): number { @@ -244,3 +245,4 @@ function maxSubArray(nums: number[]): number { + From 7da76551ba655f419020fd596569c47b02bf53b4 Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Tue, 25 Jul 2023 14:53:02 +0800 Subject: [PATCH 2138/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200122.=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=BAII=20=E6=8E=92=E7=89=88=E6=A0=BC=E5=BC=8F=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...346\234\200\344\275\263\346\227\266\346\234\272II.md" | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" index 89c654fad1..2c2ab225fd 100644 --- "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" +++ "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" @@ -37,9 +37,9 @@ - 1 <= prices.length <= 3 \* 10 ^ 4 - 0 <= prices[i] <= 10 ^ 4 -# 视频讲解 +## 算法公开课 -**《代码随想录》算法视频公开课:[贪心算法也能解决股票问题!LeetCode:122.买卖股票最佳时机 II](https://www.bilibili.com/video/BV1ev4y1C7na),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[贪心算法也能解决股票问题!LeetCode:122.买卖股票最佳时机 II](https://www.bilibili.com/video/BV1ev4y1C7na),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 ## 思路 @@ -316,7 +316,7 @@ function maxProfit(prices: number[]): number { } ``` -### Rust +### Rust: 贪心: @@ -389,7 +389,7 @@ int maxProfit(int* prices, int pricesSize){ } ``` -### Scala +### Scala: 贪心: @@ -411,3 +411,4 @@ object Solution { + From 336884055c722c3c3e6ce43960d7eae176174087 Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Tue, 25 Jul 2023 14:55:04 +0800 Subject: [PATCH 2139/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200055.=E8=B7=B3?= =?UTF-8?q?=E8=B7=83=E6=B8=B8=E6=88=8F=20=E6=8E=92=E7=89=88=E6=A0=BC?= =?UTF-8?q?=E5=BC=8F=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" "b/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" index e54c20342b..bedb09abee 100644 --- "a/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" +++ "b/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" @@ -26,9 +26,9 @@ - 输出: false - 解释: 无论怎样,你总会到达索引为 3 的位置。但该位置的最大跳跃长度是 0 , 所以你永远不可能到达最后一个位置。 -# 视频讲解 +## 算法公开课 -**《代码随想录》算法视频公开课:[贪心算法,怎么跳跃不重要,关键在覆盖范围 | LeetCode:55.跳跃游戏](https://www.bilibili.com/video/BV1VG4y1X7kB),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[贪心算法,怎么跳跃不重要,关键在覆盖范围 | LeetCode:55.跳跃游戏](https://www.bilibili.com/video/BV1VG4y1X7kB),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 ## 思路 From a04f7f54746d70794d976c616ed630bbad6070b6 Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Tue, 25 Jul 2023 14:56:46 +0800 Subject: [PATCH 2140/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200045.=E8=B7=B3?= =?UTF-8?q?=E8=B7=83=E6=B8=B8=E6=88=8FII=20=E6=8E=92=E7=89=88=E6=A0=BC?= =?UTF-8?q?=E5=BC=8F=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...350\267\263\350\267\203\346\270\270\346\210\217II.md" | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git "a/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" "b/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" index 2f0349b2cc..02c8e4862e 100644 --- "a/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" +++ "b/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" @@ -25,9 +25,9 @@ 说明: 假设你总是可以到达数组的最后一个位置。 -# 视频讲解 +## 算法公开课 -**《代码随想录》算法视频公开课:[贪心算法,最少跳几步还得看覆盖范围 | LeetCode: 45.跳跃游戏 II](https://www.bilibili.com/video/BV1Y24y1r7XZ),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[贪心算法,最少跳几步还得看覆盖范围 | LeetCode: 45.跳跃游戏 II](https://www.bilibili.com/video/BV1Y24y1r7XZ),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 ## 思路 @@ -53,7 +53,7 @@ **图中覆盖范围的意义在于,只要红色的区域,最多两步一定可以到!(不用管具体怎么跳,反正一定可以跳到)** -## 方法一 +### 方法一 从图中可以看出来,就是移动下标达到了当前覆盖的最远距离下标时,步数就要加一,来增加覆盖距离。最后的步数就是最少步数。 @@ -90,7 +90,7 @@ public: * 空间复杂度: O(1) -## 方法二 +### 方法二 依然是贪心,思路和方法一差不多,代码可以简洁一些。 @@ -469,3 +469,4 @@ impl Solution { + From 9b3d4ac2454afb393931788ab3c8b4822189eef5 Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Tue, 25 Jul 2023 15:01:20 +0800 Subject: [PATCH 2141/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=201005.K=E6=AC=A1?= =?UTF-8?q?=E5=8F=96=E5=8F=8D=E5=90=8E=E6=9C=80=E5=A4=A7=E5=8C=96=E7=9A=84?= =?UTF-8?q?=E6=95=B0=E7=BB=84=E5=92=8C=20=E6=8E=92=E7=89=88=E6=A0=BC?= =?UTF-8?q?=E5=BC=8F=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...14\226\347\232\204\346\225\260\347\273\204\345\222\214.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" "b/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" index 4cf69d6f41..bed11c7a19 100644 --- "a/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" +++ "b/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" @@ -34,9 +34,9 @@ * 1 <= K <= 10000 * -100 <= A[i] <= 100 -# 视频讲解 +## 算法公开课 -**《代码随想录》算法视频公开课:[贪心算法,这不就是常识?还能叫贪心?LeetCode:1005.K次取反后最大化的数组和](https://www.bilibili.com/video/BV138411G7LY),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[贪心算法,这不就是常识?还能叫贪心?LeetCode:1005.K次取反后最大化的数组和](https://www.bilibili.com/video/BV138411G7LY),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 ## 思路 From 5b4a2e245b16fe3b6877f5d5c5a53f40be1048fd Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Tue, 25 Jul 2023 15:10:42 +0800 Subject: [PATCH 2142/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200134.=E5=8A=A0?= =?UTF-8?q?=E6=B2=B9=E7=AB=99=20=E6=8E=92=E7=89=88=E6=A0=BC=E5=BC=8F?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0134.\345\212\240\346\262\271\347\253\231.md" | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git "a/problems/0134.\345\212\240\346\262\271\347\253\231.md" "b/problems/0134.\345\212\240\346\262\271\347\253\231.md" index ad9acfbc80..2f9539e8a4 100644 --- "a/problems/0134.\345\212\240\346\262\271\347\253\231.md" +++ "b/problems/0134.\345\212\240\346\262\271\347\253\231.md" @@ -45,12 +45,14 @@ * 解释: 你不能从 0 号或 1 号加油站出发,因为没有足够的汽油可以让你行驶到下一个加油站。我们从 2 号加油站出发,可以获得 4 升汽油。 此时油箱有 = 0 + 4 = 4 升汽油。开往 0 号加油站,此时油箱有 4 - 3 + 2 = 3 升汽油。开往 1 号加油站,此时油箱有 3 - 3 + 3 = 3 升汽油。你无法返回 2 号加油站,因为返程需要消耗 4 升汽油,但是你的油箱只有 3 升汽油。因此,无论怎样,你都不可能绕环路行驶一周。 -# 视频讲解 +## 算法公开课 -**《代码随想录》算法视频公开课:[贪心算法,得这么加油才能跑完全程!LeetCode :134.加油站](https://www.bilibili.com/video/BV1jA411r7WX),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[贪心算法,得这么加油才能跑完全程!LeetCode :134.加油站](https://www.bilibili.com/video/BV1jA411r7WX),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 +## 思路 -## 暴力方法 + +### 暴力方法 暴力的方法很明显就是O(n^2)的,遍历每一个加油站为起点的情况,模拟一圈。 @@ -85,7 +87,7 @@ public: * 空间复杂度:O(1) -## 贪心算法(方法一) +### 贪心算法(方法一) 直接从全局进行贪心选择,情况如下: @@ -134,7 +136,7 @@ public: 但不管怎么说,解法毕竟还是巧妙的,不用过于执着于其名字称呼。 -## 贪心算法(方法二) +### 贪心算法(方法二) 可以换一个思路,首先如果总油量减去总消耗大于等于零那么一定可以跑完一圈,说明 各个站点的加油站 剩油量rest[i]相加一定是大于等于零的。 @@ -633,3 +635,4 @@ object Solution { + From 1cdbefd8ef2a8803136b4e038889e7f91df6936c Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Tue, 25 Jul 2023 15:11:55 +0800 Subject: [PATCH 2143/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200135.=E5=88=86?= =?UTF-8?q?=E5=8F=91=E7=B3=96=E6=9E=9C=20=E6=8E=92=E7=89=88=E6=A0=BC?= =?UTF-8?q?=E5=BC=8F=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...35.\345\210\206\345\217\221\347\263\226\346\236\234.md" | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git "a/problems/0135.\345\210\206\345\217\221\347\263\226\346\236\234.md" "b/problems/0135.\345\210\206\345\217\221\347\263\226\346\236\234.md" index cf3ccc8e90..d130bd6820 100644 --- "a/problems/0135.\345\210\206\345\217\221\347\263\226\346\236\234.md" +++ "b/problems/0135.\345\210\206\345\217\221\347\263\226\346\236\234.md" @@ -28,9 +28,9 @@ * 输出: 4 * 解释: 你可以分别给这三个孩子分发 1、2、1 颗糖果。第三个孩子只得到 1 颗糖果,这已满足上述两个条件。 -# 视频讲解 +## 算法公开课 -**《代码随想录》算法视频公开课:[贪心算法,两者兼顾很容易顾此失彼!LeetCode:135.分发糖果](https://www.bilibili.com/video/BV1ev4y1r7wN),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[贪心算法,两者兼顾很容易顾此失彼!LeetCode:135.分发糖果](https://www.bilibili.com/video/BV1ev4y1r7wN),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 ## 思路 @@ -234,7 +234,7 @@ func findMax(num1 int, num2 int) int { } ``` -### Javascript: +### Javascript ```Javascript var candy = function(ratings) { let candys = new Array(ratings.length).fill(1) @@ -376,3 +376,4 @@ object Solution { + From 4f85769d51e99718f3c8ea53b1eafdfc3f218771 Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Tue, 25 Jul 2023 15:15:18 +0800 Subject: [PATCH 2144/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200860.=E6=9F=A0?= =?UTF-8?q?=E6=AA=AC=E6=B0=B4=E6=89=BE=E9=9B=B6=20=E6=8E=92=E7=89=88?= =?UTF-8?q?=E6=A0=BC=E5=BC=8F=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...7\240\346\252\254\346\260\264\346\211\276\351\233\266.md" | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git "a/problems/0860.\346\237\240\346\252\254\346\260\264\346\211\276\351\233\266.md" "b/problems/0860.\346\237\240\346\252\254\346\260\264\346\211\276\351\233\266.md" index 5046df121a..50a0c31a50 100644 --- "a/problems/0860.\346\237\240\346\252\254\346\260\264\346\211\276\351\233\266.md" +++ "b/problems/0860.\346\237\240\346\252\254\346\260\264\346\211\276\351\233\266.md" @@ -50,9 +50,9 @@ * 0 <= bills.length <= 10000 * bills[i] 不是 5 就是 10 或是 20  -# 视频讲解 +## 算法公开课 -**《代码随想录》算法视频公开课:[贪心算法,看上去复杂,其实逻辑都是固定的!LeetCode:860.柠檬水找零](https://www.bilibili.com/video/BV12x4y1j7DD),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[贪心算法,看上去复杂,其实逻辑都是固定的!LeetCode:860.柠檬水找零](https://www.bilibili.com/video/BV12x4y1j7DD),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 ## 思路 @@ -403,3 +403,4 @@ object Solution { + From 1500bb9b3e289eb3d4a693b2efb9aa7f98ff2eb1 Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Tue, 25 Jul 2023 15:17:26 +0800 Subject: [PATCH 2145/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200406.=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?=20=E6=8E=92=E7=89=88=E6=A0=BC=E5=BC=8F=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...3\230\351\207\215\345\273\272\351\230\237\345\210\227.md" | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git "a/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" "b/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" index 60d1fcab03..9cd78fac62 100644 --- "a/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" +++ "b/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" @@ -37,9 +37,9 @@ 题目数据确保队列可以被重建 -# 视频讲解 +## 算法公开课 -**《代码随想录》算法视频公开课:[贪心算法,不要两边一起贪,会顾此失彼 | LeetCode:406.根据身高重建队列](https://www.bilibili.com/video/BV1EA411675Y),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[贪心算法,不要两边一起贪,会顾此失彼 | LeetCode:406.根据身高重建队列](https://www.bilibili.com/video/BV1EA411675Y),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 ## 思路 @@ -402,3 +402,4 @@ object Solution { + From d31e23f5f629564076e184969c093cec7c273dcd Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Tue, 25 Jul 2023 15:20:20 +0800 Subject: [PATCH 2146/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=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?=EF=BC=88vector=E5=8E=9F=E7=90=86=E8=AE=B2=E8=A7=A3)=20?= =?UTF-8?q?=E6=8E=92=E7=89=88=E6=A0=BC=E5=BC=8F=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...0\206\350\256\262\350\247\243\357\274\211.md" | 16 +++------------- 1 file changed, 3 insertions(+), 13 deletions(-) diff --git "a/problems/\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227\357\274\210vector\345\216\237\347\220\206\350\256\262\350\247\243\357\274\211.md" "b/problems/\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227\357\274\210vector\345\216\237\347\220\206\350\256\262\350\247\243\357\274\211.md" index 4f8cab8288..fdb4f58ba4 100644 --- "a/problems/\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227\357\274\210vector\345\216\237\347\220\206\350\256\262\350\247\243\357\274\211.md" +++ "b/problems/\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227\357\274\210vector\345\216\237\347\220\206\350\256\262\350\247\243\357\274\211.md" @@ -165,19 +165,9 @@ public: 相信在这里学习算法的录友们,都是想在软件行业长远发展的,都是要从事编程的工作,那么一定要深耕好一门编程语言,这个非常重要! - - - - ## 其他语言版本 - -Java: - - -Python: - -Rust: +### Rust ```rust // 版本二,使用list(链表) @@ -206,8 +196,7 @@ impl Solution{ } ``` - -Go: +### Go: Go中slice的`append`操作和C++中vector的扩容机制基本相同。 @@ -224,3 +213,4 @@ Go中slice的`append`操作和C++中vector的扩容机制基本相同。 + From eb320010a411c9420d83606314b0f4909f080d63 Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Tue, 25 Jul 2023 15:22:08 +0800 Subject: [PATCH 2147/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200452.=E7=94=A8?= =?UTF-8?q?=E6=9C=80=E5=B0=91=E6=95=B0=E9=87=8F=E7=9A=84=E7=AE=AD=E5=BC=95?= =?UTF-8?q?=E7=88=86=E6=B0=94=E7=90=83=20=E6=8E=92=E7=89=88=E6=A0=BC?= =?UTF-8?q?=E5=BC=8F=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...56\255\345\274\225\347\210\206\346\260\224\347\220\203.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" "b/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" index ff476f4152..90cd7085d1 100644 --- "a/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" +++ "b/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" @@ -42,9 +42,9 @@ * points[i].length == 2 * -2^31 <= xstart < xend <= 2^31 - 1 -# 视频讲解 +## 算法公开课 -**《代码随想录》算法视频公开课:[贪心算法,判断重叠区间问题 | LeetCode:452.用最少数量的箭引爆气球](https://www.bilibili.com/video/BV1SA41167xe),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[贪心算法,判断重叠区间问题 | LeetCode:452.用最少数量的箭引爆气球](https://www.bilibili.com/video/BV1SA41167xe),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 ## 思路 From 2acb91c29165ee618334689298681b607348d2df Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Tue, 25 Jul 2023 15:23:46 +0800 Subject: [PATCH 2148/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200435.=E6=97=A0?= =?UTF-8?q?=E9=87=8D=E5=8F=A0=E5=8C=BA=E9=97=B4=20=E6=8E=92=E7=89=88?= =?UTF-8?q?=E6=A0=BC=E5=BC=8F=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\207\215\345\217\240\345\214\272\351\227\264.md" | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git "a/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" "b/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" index 61f42d4241..c307532e4f 100644 --- "a/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" +++ "b/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" @@ -30,9 +30,9 @@ * 输出: 0 * 解释: 你不需要移除任何区间,因为它们已经是无重叠的了。 -# 视频讲解 +## 算法公开课 -**《代码随想录》算法视频公开课:[贪心算法,依然是判断重叠区间 | LeetCode:435.无重叠区间](https://www.bilibili.com/video/BV1A14y1c7E1),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[贪心算法,依然是判断重叠区间 | LeetCode:435.无重叠区间](https://www.bilibili.com/video/BV1A14y1c7E1),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 ## 思路 @@ -89,9 +89,9 @@ public: 大家此时会发现如此复杂的一个问题,代码实现却这么简单! +## 补充 - -## 补充(1) +### 补充(1) 左边界排序可不可以呢? @@ -144,7 +144,7 @@ public: ``` -## 补充(2) +### 补充(2) 本题其实和[452.用最少数量的箭引爆气球](https://programmercarl.com/0452.用最少数量的箭引爆气球.html)非常像,弓箭的数量就相当于是非交叉区间的数量,只要把弓箭那道题目代码里射爆气球的判断条件加个等号(认为[0,1][1,2]不是相邻区间),然后用总区间数减去弓箭数量 就是要移除的区间数量了。 @@ -311,7 +311,7 @@ func min(a, b int) int { } ``` -### Javascript: +### Javascript - 按右边界排序 ```Javascript var eraseOverlapIntervals = function(intervals) { @@ -447,3 +447,4 @@ impl Solution { + From 481cd1d137ce6497f874c07af8e8c3d007a40bf7 Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Tue, 25 Jul 2023 15:25:25 +0800 Subject: [PATCH 2149/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200763.=E5=88=92?= =?UTF-8?q?=E5=88=86=E5=AD=97=E6=AF=8D=E5=8C=BA=E9=97=B4=20=E6=8E=92?= =?UTF-8?q?=E7=89=88=E6=A0=BC=E5=BC=8F=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...0\206\345\255\227\346\257\215\345\214\272\351\227\264.md" | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git "a/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" "b/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" index 158f76d625..41314456c3 100644 --- "a/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" +++ "b/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" @@ -24,9 +24,9 @@ * S的长度在[1, 500]之间。 * S只包含小写字母 'a' 到 'z' 。 -# 视频讲解 +## 算法公开课 -**《代码随想录》算法视频公开课:[贪心算法,寻找最远的出现位置! LeetCode:763.划分字母区间](https://www.bilibili.com/video/BV18G4y1K7d5),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[贪心算法,寻找最远的出现位置! LeetCode:763.划分字母区间](https://www.bilibili.com/video/BV18G4y1K7d5),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 ## 思路 @@ -409,3 +409,4 @@ impl Solution { + From bde75d3a98b857f533773609d825b6247c6dfcb6 Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Tue, 25 Jul 2023 15:26:26 +0800 Subject: [PATCH 2150/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200056.=E5=90=88?= =?UTF-8?q?=E5=B9=B6=E5=8C=BA=E9=97=B4=20=E6=8E=92=E7=89=88=E6=A0=BC?= =?UTF-8?q?=E5=BC=8F=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git "a/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" "b/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" index 8705f840e2..95781b1a1d 100644 --- "a/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" +++ "b/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" @@ -22,9 +22,9 @@ * 解释: 区间 [1,4] 和 [4,5] 可被视为重叠区间。 * 注意:输入类型已于2019年4月15日更改。 请重置默认代码定义以获取新方法签名。 -# 视频讲解 +## 算法公开课 -**《代码随想录》算法视频公开课:[贪心算法,合并区间有细节!LeetCode:56.合并区间](https://www.bilibili.com/video/BV1wx4y157nD),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[贪心算法,合并区间有细节!LeetCode:56.合并区间](https://www.bilibili.com/video/BV1wx4y157nD),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 ## 思路 @@ -341,3 +341,4 @@ impl Solution { + From 3bbabf40845d916ddecaf7b9e1af60d8198bbc1b Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Tue, 25 Jul 2023 15:28:04 +0800 Subject: [PATCH 2151/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200738.=E5=8D=95?= =?UTF-8?q?=E8=B0=83=E9=80=92=E5=A2=9E=E7=9A=84=E6=95=B0=E5=AD=97=20?= =?UTF-8?q?=E6=8E=92=E7=89=88=E6=A0=BC=E5=BC=8F=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...42\236\347\232\204\346\225\260\345\255\227.md" | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git "a/problems/0738.\345\215\225\350\260\203\351\200\222\345\242\236\347\232\204\346\225\260\345\255\227.md" "b/problems/0738.\345\215\225\350\260\203\351\200\222\345\242\236\347\232\204\346\225\260\345\255\227.md" index d88ebbb096..c2215cf633 100644 --- "a/problems/0738.\345\215\225\350\260\203\351\200\222\345\242\236\347\232\204\346\225\260\345\255\227.md" +++ "b/problems/0738.\345\215\225\350\260\203\351\200\222\345\242\236\347\232\204\346\225\260\345\255\227.md" @@ -26,12 +26,14 @@ 说明: N 是在 [0, 10^9] 范围内的一个整数。 -# 视频讲解 +## 算法公开课 -**《代码随想录》算法视频公开课:[贪心算法,思路不难想,但代码不好写!LeetCode:738.单调自增的数字](https://www.bilibili.com/video/BV1Kv4y1x7tP),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[贪心算法,思路不难想,但代码不好写!LeetCode:738.单调自增的数字](https://www.bilibili.com/video/BV1Kv4y1x7tP),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 +## 思路 -## 暴力解法 + +### 暴力解法 题意很简单,那么首先想的就是暴力解法了,来我替大家暴力一波,结果自然是超时! @@ -62,7 +64,7 @@ public: * 时间复杂度:O(n × m) m为n的数字长度 * 空间复杂度:O(1) -## 贪心算法 +### 贪心算法 题目要求小于等于N的最大单调递增的整数,那么拿一个两位的数字来举例。 @@ -120,7 +122,7 @@ public: ## 其他语言版本 -### Java: +### Java ```java 版本1 class Solution { @@ -163,7 +165,7 @@ class Solution { ``` -### Python: +### Python 暴力 ```python class Solution: @@ -395,3 +397,4 @@ impl Solution { + From 9a8f9780f63e01a8a64edc9c74a9833994d2662a Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Tue, 25 Jul 2023 15:29:35 +0800 Subject: [PATCH 2152/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200968.=E7=9B=91?= =?UTF-8?q?=E6=8E=A7=E4=BA=8C=E5=8F=89=E6=A0=91=20=E6=8E=92=E7=89=88?= =?UTF-8?q?=E6=A0=BC=E5=BC=8F=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...3\221\346\216\247\344\272\214\345\217\211\346\240\221.md" | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git "a/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" "b/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" index e2ba8ebffc..be04bd4755 100644 --- "a/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" @@ -38,9 +38,9 @@ * 给定树的节点数的范围是 [1, 1000]。 * 每个节点的值都是 0。 -# 视频讲解 +## 算法公开课 -**《代码随想录》算法视频公开课:[贪心算法,二叉树与贪心的结合,有点难...... LeetCode:968.监督二叉树](https://www.bilibili.com/video/BV1SA411U75i),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[贪心算法,二叉树与贪心的结合,有点难...... LeetCode:968.监督二叉树](https://www.bilibili.com/video/BV1SA411U75i),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 ## 思路 @@ -732,3 +732,4 @@ impl Solution { + From f4a74a43d69c75f3e898c1900a989b8651e2456c Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Tue, 25 Jul 2023 15:31:11 +0800 Subject: [PATCH 2153/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20=E8=B4=AA?= =?UTF-8?q?=E5=BF=83=E7=AE=97=E6=B3=95=E6=80=BB=E7=BB=93=E7=AF=87=20?= =?UTF-8?q?=E6=8E=92=E7=89=88=E6=A0=BC=E5=BC=8F=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...7\256\227\346\263\225\346\200\273\347\273\223\347\257\207.md" | 1 + 1 file changed, 1 insertion(+) diff --git "a/problems/\350\264\252\345\277\203\347\256\227\346\263\225\346\200\273\347\273\223\347\257\207.md" "b/problems/\350\264\252\345\277\203\347\256\227\346\263\225\346\200\273\347\273\223\347\257\207.md" index d52e85513c..c375503d71 100644 --- "a/problems/\350\264\252\345\277\203\347\256\227\346\263\225\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/\350\264\252\345\277\203\347\256\227\346\263\225\346\200\273\347\273\223\347\257\207.md" @@ -154,3 +154,4 @@ Carl个人认为:如果找出局部最优并可以推出全局最优,就是 + From 0ffbe67f5a3e8e3108e95a526f3e142faac13477 Mon Sep 17 00:00:00 2001 From: han Date: Tue, 25 Jul 2023 16:24:55 +0800 Subject: [PATCH 2154/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A059.=E8=9E=BA?= =?UTF-8?q?=E6=97=8B=E7=9F=A9=E9=98=B5II=20Ruby=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\346\227\213\347\237\251\351\230\265II.md" | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git "a/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" "b/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" index f03fcdad35..73e9e4daea 100644 --- "a/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" +++ "b/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" @@ -688,6 +688,58 @@ public class Solution { } ``` +### Ruby#: +```ruby +def generate_matrix(n) + result = Array.new(n) { Array.new(n, 0) } + #循环次数 + loop_times = 0 + #步长 + step = n - 1 + val = 1 + + + while loop_times < n / 2 + #模拟从左向右 + for i in 0..step - 1 + #行数不变,列数变 + result[loop_times][i+loop_times] = val + val += 1 + end + + #模拟从上到下 + for i in 0..step - 1 + #列数不变,行数变 + result[i+loop_times][n-loop_times-1] = val + val += 1 + end + + #模拟从右到左 + for i in 0..step - 1 + #行数不变,列数变 + result[n-loop_times-1][n-loop_times-i-1] = val + val += 1 + end + + #模拟从下到上 + for i in 0..step - 1 + #列数不变,行数变 + result[n-loop_times-i-1][loop_times] = val + val += 1 + end + + loop_times += 1 + step -= 2 + end + + #如果是奇数,则填充最后一个元素 + result[n/2][n/2] = n**2 if n % 2 + + return result + +end +``` +

From 6ed304e9cdb3f8bd3ef74220190f808ffbcab79d Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Wed, 26 Jul 2023 14:51:45 +0800 Subject: [PATCH 2155/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20=E5=8A=A8?= =?UTF-8?q?=E6=80=81=E8=A7=84=E5=88=92=E7=90=86=E8=AE=BA=E5=9F=BA=E7=A1=80?= =?UTF-8?q?=20=E6=8E=92=E7=89=88=E6=A0=BC=E5=BC=8F=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...210\222\347\220\206\350\256\272\345\237\272\347\241\200.md" | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git "a/problems/\345\212\250\346\200\201\350\247\204\345\210\222\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\345\212\250\346\200\201\350\247\204\345\210\222\347\220\206\350\256\272\345\237\272\347\241\200.md" index a99c069002..bff26d1d34 100644 --- "a/problems/\345\212\250\346\200\201\350\247\204\345\210\222\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\345\212\250\346\200\201\350\247\204\345\210\222\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -12,7 +12,7 @@ ## 算法公开课 -**《代码随想录》算法视频公开课:[动态规划理论基础](https://www.bilibili.com/video/BV13Q4y197Wg),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[动态规划理论基础](https://www.bilibili.com/video/BV13Q4y197Wg),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 ## 什么是动态规划 @@ -135,3 +135,4 @@ + From b295b12d1abdacd0e3ba09d6a9395d494ede0b42 Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Wed, 26 Jul 2023 14:53:34 +0800 Subject: [PATCH 2156/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200509.=E6=96=90?= =?UTF-8?q?=E6=B3=A2=E9=82=A3=E5=A5=91=E6=95=B0=20=E6=8E=92=E7=89=88?= =?UTF-8?q?=E6=A0=BC=E5=BC=8F=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...220\346\263\242\351\202\243\345\245\221\346\225\260.md" | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git "a/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" "b/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" index 7ace072334..0c073db5bb 100644 --- "a/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" +++ "b/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" @@ -32,9 +32,9 @@ F(n) = F(n - 1) + F(n - 2),其中 n > 1 * 0 <= n <= 30 -# 视频讲解 +## 算法公开课 -**《代码随想录》算法视频公开课:[手把手带你入门动态规划 | leetcode:509.斐波那契数](https://www.bilibili.com/video/BV1f5411K7mo),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[手把手带你入门动态规划 | leetcode:509.斐波那契数](https://www.bilibili.com/video/BV1f5411K7mo),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 ## 思路 @@ -278,7 +278,7 @@ class Solution: return self.fib(n - 1) + self.fib(n - 2) ``` -### Go: +### Go ```Go func fib(n int) int { if n < 2 { @@ -479,3 +479,4 @@ public class Solution + From 9b24f3cdefe2ee2ca10eb97c2cef4224cd864622 Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Wed, 26 Jul 2023 14:56:48 +0800 Subject: [PATCH 2157/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200070.=E7=88=AC?= =?UTF-8?q?=E6=A5=BC=E6=A2=AF=20=E6=8E=92=E7=89=88=E6=A0=BC=E5=BC=8F?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0070.\347\210\254\346\245\274\346\242\257.md" | 5 +++-- ...203\214\345\214\205\347\211\210\346\234\254.md" | 14 +++++++------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git "a/problems/0070.\347\210\254\346\245\274\346\242\257.md" "b/problems/0070.\347\210\254\346\245\274\346\242\257.md" index 1b24e49150..1a1f7e31b5 100644 --- "a/problems/0070.\347\210\254\346\245\274\346\242\257.md" +++ "b/problems/0070.\347\210\254\346\245\274\346\242\257.md" @@ -29,9 +29,9 @@ * 1 阶 + 2 阶 * 2 阶 + 1 阶 -# 视频讲解 +## 算法公开课 -**《代码随想录》算法视频公开课:[带你学透动态规划-爬楼梯|LeetCode:70.爬楼梯)](https://www.bilibili.com/video/BV17h411h7UH),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[带你学透动态规划-爬楼梯|LeetCode:70.爬楼梯)](https://www.bilibili.com/video/BV17h411h7UH),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 ## 思路 @@ -522,3 +522,4 @@ impl Solution { + diff --git "a/problems/0070.\347\210\254\346\245\274\346\242\257\345\256\214\345\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md" "b/problems/0070.\347\210\254\346\245\274\346\242\257\345\256\214\345\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md" index 8c85985fba..4ca7a3710b 100644 --- "a/problems/0070.\347\210\254\346\245\274\346\242\257\345\256\214\345\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md" +++ "b/problems/0070.\347\210\254\346\245\274\346\242\257\345\256\214\345\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md" @@ -127,8 +127,8 @@ public: ## 其他语言版本 +### Java: -Java: ```java class Solution { public int climbStairs(int n) { @@ -148,7 +148,7 @@ class Solution { } ``` -Python3: +### Python3: ```python @@ -166,8 +166,8 @@ class Solution: return dp[n] ``` +### Go: -Go: ```go func climbStairs(n int) int { //定义 @@ -189,7 +189,8 @@ func climbStairs(n int) int { } ``` -JavaScript: +### JavaScript: + ```javascript var climbStairs = function(n) { const dp = new Array(n + 1).fill(0); @@ -206,7 +207,7 @@ var climbStairs = function(n) { }; ``` -TypeScript: +### TypeScript: ```typescript function climbStairs(n: number): number { @@ -226,7 +227,7 @@ function climbStairs(n: number): number { }; ``` -Rust: +### Rust: ```rust impl Solution { @@ -250,4 +251,3 @@ impl Solution { - From 86f794b11814568adac618f462076ad6b0d8edde Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Wed, 26 Jul 2023 14:58:05 +0800 Subject: [PATCH 2158/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200746.=E4=BD=BF?= =?UTF-8?q?=E7=94=A8=E6=9C=80=E5=B0=8F=E8=8A=B1=E8=B4=B9=E7=88=AC=E6=A5=BC?= =?UTF-8?q?=E6=A2=AF=20=E6=8E=92=E7=89=88=E6=A0=BC=E5=BC=8F=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...2\261\350\264\271\347\210\254\346\245\274\346\242\257.md" | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git "a/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" "b/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" index 9eaaa4e9fe..6fb518c371 100644 --- "a/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" +++ "b/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" @@ -37,9 +37,9 @@ * cost[i] 将会是一个整型数据,范围为 [0, 999] 。 -# 算法公开课 +## 算法公开课 -**《代码随想录》算法视频公开课:[动态规划开更了!| LeetCode:746. 使用最小花费爬楼梯](https://www.bilibili.com/video/BV16G411c7yZ/),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html)::[动态规划开更了!| LeetCode:746. 使用最小花费爬楼梯](https://www.bilibili.com/video/BV16G411c7yZ/),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 ----------- @@ -523,3 +523,4 @@ public class Solution + From 0e3500ed1c7b0d6db94d33b6d5db2a39424ac94b Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Wed, 26 Jul 2023 15:01:47 +0800 Subject: [PATCH 2159/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20=E5=8A=A8?= =?UTF-8?q?=E6=80=81=E8=A7=84=E5=88=92=20=E5=91=A8=E6=9C=AB=E6=80=BB?= =?UTF-8?q?=E7=BB=93=20=E6=8E=92=E7=89=88=E6=A0=BC=E5=BC=8F=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...0\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" | 1 + ...0\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" | 1 + ...0\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" | 1 + ...0\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" | 1 + 4 files changed, 4 insertions(+) diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20210107\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20210107\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" index b4baa4adb0..831ce348a1 100644 --- "a/problems/\345\221\250\346\200\273\347\273\223/20210107\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" +++ "b/problems/\345\221\250\346\200\273\347\273\223/20210107\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" @@ -1,3 +1,4 @@ +# 本周小结!(动态规划系列一) 这周我们正式开始动态规划的学习! diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20210114\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20210114\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" index a77efa2fd2..71cb49a9db 100644 --- "a/problems/\345\221\250\346\200\273\347\273\223/20210114\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" +++ "b/problems/\345\221\250\346\200\273\347\273\223/20210114\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" @@ -1,3 +1,4 @@ +# 本周小结!(动态规划系列二) ## 周一 diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20210225\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20210225\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" index 8fd292ed9a..e74dd6bea8 100644 --- "a/problems/\345\221\250\346\200\273\347\273\223/20210225\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" +++ "b/problems/\345\221\250\346\200\273\347\273\223/20210225\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" @@ -1,3 +1,4 @@ +# 本周小结!(动态规划系列六) 本周我们主要讲解了打家劫舍系列,这个系列也是dp解决的经典问题,那么来看看我们收获了哪些呢,一起来回顾一下吧。 diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20210304\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20210304\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" index b814e1b39e..ec442a3979 100644 --- "a/problems/\345\221\250\346\200\273\347\273\223/20210304\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" +++ "b/problems/\345\221\250\346\200\273\347\273\223/20210304\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" @@ -1,3 +1,4 @@ +# 本周小结!(动态规划系列七) 本周的主题就是股票系列,来一起回顾一下吧 From 126aaac841078b436f9d0e878a1bef1c0f8aeee1 Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Wed, 26 Jul 2023 15:06:55 +0800 Subject: [PATCH 2160/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20=E8=83=8C?= =?UTF-8?q?=E5=8C=85=E7=90=86=E8=AE=BA=E5=9F=BA=E7=A1=80=20=E6=8E=92?= =?UTF-8?q?=E7=89=88=E6=A0=BC=E5=BC=8F=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...47\241\20001\350\203\214\345\214\205-1.md" | 22 +++++++++---------- ...47\241\20001\350\203\214\345\214\205-2.md" | 14 +++++++----- 2 files changed, 19 insertions(+), 17 deletions(-) diff --git "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" index bd3191dca0..7511ac8715 100644 --- "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" +++ "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" @@ -8,8 +8,11 @@ # 动态规划:01背包理论基础 +## 算法公开课 -**《代码随想录》算法视频公开课:[带你学透0-1背包问题!](https://www.bilibili.com/video/BV1cg411g7Y6/),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[带你学透0-1背包问题!](https://www.bilibili.com/video/BV1cg411g7Y6/),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 + +## 思路 这周我们正式开始讲解背包问题! @@ -37,7 +40,7 @@ leetcode上没有纯01背包的问题,都是01背包应用方面的题目, 之前可能有些录友已经可以熟练写出背包了,但只要把这个文章仔细看完,相信你会意外收获! -## 01 背包 +### 01 背包 有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。**每件物品只能用一次**,求解将哪些物品装入背包里物品价值总和最大。 @@ -67,7 +70,7 @@ leetcode上没有纯01背包的问题,都是01背包应用方面的题目, 以下讲解和图示中出现的数字都是以这个例子为例。 -## 二维dp数组01背包 +### 二维dp数组01背包 依然动规五部曲分析一波。 @@ -226,9 +229,6 @@ dp[i-1][j]和dp[i - 1][j - weight[i]] 都在dp[i][j]的左上角方向(包括 主要就是自己没有动手推导一下dp数组的演变过程,如果推导明白了,代码写出来就算有问题,只要把dp数组打印出来,对比一下和自己推导的有什么差异,很快就可以发现问题了。 - -## 完整c++测试代码 - ```cpp void test_2_wei_bag_problem1() { vector weight = {1, 3, 4}; @@ -275,7 +275,7 @@ int main() { ## 其他语言版本 -### java +### Java ```java public class BagProblem { @@ -396,7 +396,8 @@ public class BagProblem { ``` -### python +### Python + 无参数版 ```python def test_2_wei_bag_problem1(): @@ -456,8 +457,7 @@ if __name__ == "__main__": ``` - -### go +### Go ```go func test_2_wei_bag_problem1(weight, value []int, bagweight int) int { @@ -498,7 +498,7 @@ func main() { } ``` -### javascript +### Javascript ```js function testWeightBagProblem (weight, value, size) { diff --git "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" index d481e044c5..019947e536 100644 --- "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" +++ "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" @@ -3,10 +3,13 @@

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

- # 动态规划:01背包理论基础(滚动数组) -**《代码随想录》算法视频公开课:[带你学透0-1背包问题!(滚动数组)](https://www.bilibili.com/video/BV1BU4y177kY/),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 +## 算法公开课 + +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[带你学透0-1背包问题!(滚动数组)](https://www.bilibili.com/video/BV1BU4y177kY/),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 + +## 思路 昨天[动态规划:关于01背包问题,你该了解这些!](https://programmercarl.com/背包理论基础01背包-1.html)中是用二维dp数组来讲解01背包。 @@ -29,7 +32,7 @@ 问背包能背的物品最大价值是多少? -## 一维dp数组(滚动数组) +### 一维dp数组(滚动数组) 对于背包问题其实状态都是可以压缩的。 @@ -154,8 +157,6 @@ dp[1] = dp[1 - weight[0]] + value[0] = 15 -## 一维dp01背包完整C++测试代码 - ```CPP void test_1_wei_bag_problem() { vector weight = {1, 3, 4}; @@ -318,7 +319,7 @@ func main() { } ``` -### javaScript +### JavaScript ```js @@ -459,3 +460,4 @@ fn test_wei_bag_problem2() { + From fc19feb04939aee16372c6a6880a4a0ee3373110 Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Wed, 26 Jul 2023 15:13:26 +0800 Subject: [PATCH 2161/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200416.=E5=88=86?= =?UTF-8?q?=E5=89=B2=E7=AD=89=E5=92=8C=E8=87=AA=E5=B7=B1=200474.=E4=B8=80?= =?UTF-8?q?=E5=92=8C=E9=9B=B6=200494.=E7=9B=AE=E6=A0=87=E5=92=8C=201049.?= =?UTF-8?q?=E6=9C=80=E5=90=8E=E4=B8=80=E5=9D=97=E7=9F=B3=E5=A4=B4=E7=9A=84?= =?UTF-8?q?=E9=87=8D=E9=87=8FII=20=E6=8E=92=E7=89=88=E6=A0=BC=E5=BC=8F?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\255\211\345\222\214\345\255\220\351\233\206.md" | 13 +++++++------ .../0474.\344\270\200\345\222\214\351\233\266.md" | 5 +++-- .../0494.\347\233\256\346\240\207\345\222\214.md" | 11 +++++------ ...44\264\347\232\204\351\207\215\351\207\217II.md" | 13 +++++++------ 4 files changed, 22 insertions(+), 20 deletions(-) diff --git "a/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" "b/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" index a886b99a6d..0657c010bb 100644 --- "a/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" +++ "b/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" @@ -30,9 +30,9 @@ * 1 <= nums.length <= 200 * 1 <= nums[i] <= 100 -# 算法公开课 +## 算法公开课 -**《代码随想录》算法视频公开课:[动态规划之背包问题,这个包能装满吗?| LeetCode:416.分割等和子集](https://www.bilibili.com/video/BV1rt4y1N7jE/),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[动态规划之背包问题,这个包能装满吗?| LeetCode:416.分割等和子集](https://www.bilibili.com/video/BV1rt4y1N7jE/),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 ## 思路 @@ -53,7 +53,7 @@ * [动态规划:关于01背包问题,你该了解这些!](https://programmercarl.com/背包理论基础01背包-1.html) * [动态规划:关于01背包问题,你该了解这些!(滚动数组)](https://programmercarl.com/背包理论基础01背包-2.html) -## 01背包问题 +### 01背包问题 背包问题,大家都知道,有N件物品和一个最多能背重量为W 的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品只能用一次,求解将哪些物品装入背包里物品价值总和最大。 @@ -479,7 +479,7 @@ func canPartition(nums []int) bool { } ``` -### javaScript: +### JavaScript: ```js var canPartition = function(nums) { @@ -499,7 +499,7 @@ var canPartition = function(nums) { ``` -### Rust +### Rust: ```Rust impl Solution { @@ -681,7 +681,7 @@ function canPartition(nums: number[]): boolean { }; ``` -### Scala +### Scala: 滚动数组: ```scala @@ -730,3 +730,4 @@ object Solution { + diff --git "a/problems/0474.\344\270\200\345\222\214\351\233\266.md" "b/problems/0474.\344\270\200\345\222\214\351\233\266.md" index 7c1206ef35..8f6197ac5c 100644 --- "a/problems/0474.\344\270\200\345\222\214\351\233\266.md" +++ "b/problems/0474.\344\270\200\345\222\214\351\233\266.md" @@ -34,9 +34,9 @@ * strs[i] 仅由 '0' 和 '1' 组成 * 1 <= m, n <= 100 -# 算法公开课 +## 算法公开课 -**《代码随想录》算法视频公开课:[装满这个背包最多用多少个物品?| LeetCode:474.一和零](https://www.bilibili.com/video/BV1rW4y1x7ZQ/),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[装满这个背包最多用多少个物品?| LeetCode:474.一和零](https://www.bilibili.com/video/BV1rW4y1x7ZQ/),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 ## 思路 @@ -538,3 +538,4 @@ impl Solution { + diff --git "a/problems/0494.\347\233\256\346\240\207\345\222\214.md" "b/problems/0494.\347\233\256\346\240\207\345\222\214.md" index 1902d5ed44..4a4e966c14 100644 --- "a/problems/0494.\347\233\256\346\240\207\345\222\214.md" +++ "b/problems/0494.\347\233\256\346\240\207\345\222\214.md" @@ -37,9 +37,9 @@ * 初始的数组的和不会超过 1000 。 * 保证返回的最终结果能被 32 位整数存下。 -# 算法公开课 +## 算法公开课 -**《代码随想录》算法视频公开课:[装满背包有多少种方法?| LeetCode:494.目标和](https://www.bilibili.com/video/BV1o8411j73x/),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[装满背包有多少种方法?| LeetCode:494.目标和](https://www.bilibili.com/video/BV1o8411j73x/),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 ## 思路 @@ -67,7 +67,7 @@ target是固定的,sum是固定的,left就可以求出来。 此时问题就是在集合nums中找出和为left的组合。 -## 回溯算法 +### 回溯算法 在回溯算法系列中,一起学过这道题目[回溯算法:39. 组合总和](https://programmercarl.com/0039.组合总和.html)的录友应该感觉很熟悉,这不就是组合总和问题么? @@ -118,7 +118,7 @@ public: 也可以使用记忆化回溯,但这里我就不在回溯上下功夫了,直接看动规吧 -## 动态规划 +### 动态规划 如何转化为01背包问题呢。 @@ -519,8 +519,6 @@ const findTargetSumWays = (nums, target) => { ### TypeScript -TypeScript: - ```ts function findTargetSumWays(nums: number[], target: number): number { // 把数组分成两个组合left, right.left + right = sum, left - right = target. @@ -590,3 +588,4 @@ impl Solution { + diff --git "a/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" "b/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" index 932029ab7a..cc66131734 100644 --- "a/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" +++ "b/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" @@ -35,9 +35,9 @@ * 1 <= stones.length <= 30 * 1 <= stones[i] <= 1000 -# 算法公开课 +## 算法公开课 -**《代码随想录》算法视频公开课:[这个背包最多能装多少?LeetCode:1049.最后一块石头的重量II](https://www.bilibili.com/video/BV14M411C7oV/),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[这个背包最多能装多少?LeetCode:1049.最后一块石头的重量II](https://www.bilibili.com/video/BV14M411C7oV/),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 ## 思路 @@ -341,7 +341,7 @@ func max(a, b int) int { } ``` -### JavaScript +### JavaScript: ```javascript /** @@ -364,7 +364,7 @@ var lastStoneWeightII = function (stones) { }; ``` -### C +### C: ```c #define MAX(a, b) (((a) > (b)) ? (a) : (b)) @@ -413,7 +413,7 @@ function lastStoneWeightII(stones: number[]): number { }; ``` -### Scala +### Scala: 滚动数组: ```scala @@ -455,7 +455,7 @@ object Solution { } ``` -### Rust +### Rust: ```rust impl Solution { @@ -477,3 +477,4 @@ impl Solution { + From 7ac217942fea957c2d8cfb579e81d80bbd590499 Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Wed, 26 Jul 2023 15:28:27 +0800 Subject: [PATCH 2162/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20=E5=AE=8C?= =?UTF-8?q?=E5=85=A8=E8=83=8C=E5=8C=85=E7=90=86=E8=AE=BA=E5=9F=BA=E7=A1=80?= =?UTF-8?q?=200139.=E5=8D=95=E8=AF=8D=E6=8B=86=E5=88=86=200279.=E5=AE=8C?= =?UTF-8?q?=E5=85=A8=E5=B9=B3=E6=96=B9=E6=95=B0=200322.=E9=9B=B6=E9=92=B1?= =?UTF-8?q?=E5=85=91=E6=8D=A2=200377.=E7=BB=84=E5=90=88=E6=80=BB=E5=92=8CI?= =?UTF-8?q?V=200518.=E9=9B=B6=E9=92=B1=E5=85=91=E6=8D=A2II=20=E5=A4=9A?= =?UTF-8?q?=E9=87=8D=E8=83=8C=E5=8C=85=E7=90=86=E8=AE=BA=E5=9F=BA=E7=A1=80?= =?UTF-8?q?=20=E8=83=8C=E5=8C=85=E6=80=BB=E7=BB=93=E7=AF=87=20=E6=8E=92?= =?UTF-8?q?=E7=89=88=E6=A0=BC=E5=BC=8F=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...25\350\257\215\346\213\206\345\210\206.md" | 23 ++++++++------- ...50\345\271\263\346\226\271\346\225\260.md" | 21 +++++++------- ...66\351\222\261\345\205\221\346\215\242.md" | 20 +++++++------ ...10\346\200\273\345\222\214\342\205\243.md" | 20 +++++++------ ...\351\222\261\345\205\221\346\215\242II.md" | 22 +++++++------- ...05\346\200\273\347\273\223\347\257\207.md" | 1 + ...32\351\207\215\350\203\214\345\214\205.md" | 10 +++---- ...14\345\205\250\350\203\214\345\214\205.md" | 29 ++++++++++--------- 8 files changed, 80 insertions(+), 66 deletions(-) diff --git "a/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" "b/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" index 0d88ba3681..d93288ae5a 100644 --- "a/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" +++ "b/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" @@ -33,9 +33,9 @@ * 输入: s = "catsandog", wordDict = ["cats", "dog", "sand", "and", "cat"] * 输出: false -# 算法公开课 +## 算法公开课 -**《代码随想录》算法视频公开课:[你的背包如何装满?| LeetCode:139.单词拆分](https://www.bilibili.com/video/BV1pd4y147Rh/),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[你的背包如何装满?| LeetCode:139.单词拆分](https://www.bilibili.com/video/BV1pd4y147Rh/),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 ## 思路 @@ -123,7 +123,7 @@ public: **这个代码就可以AC了,当然回溯算法不是本题的主菜,背包才是!** -## 背包问题 +### 背包问题 单词就是物品,字符串s就是背包,单词能否组成字符串s,就是问物品能不能把背包装满。 @@ -239,7 +239,7 @@ public: } }; -``` +``` 使用用例:s = "applepenapple", wordDict = ["apple", "pen"],对应的dp数组状态如下: @@ -259,8 +259,8 @@ public: ## 其他语言版本 +### Java: -Java: ```java class Solution { public boolean wordBreak(String s, List wordDict) { @@ -335,7 +335,7 @@ class Solution { } ``` -Python: +### Python: 回溯 ```python @@ -397,7 +397,8 @@ class Solution: -Go: +### Go: + ```Go func wordBreak(s string,wordDict []string) bool { wordDictSet := make(map[string]bool) @@ -433,7 +434,8 @@ func wordBreak(s string, wordDict []string) bool { } ``` -Javascript: +### JavaScript: + ```javascript const wordBreak = (s, wordDict) => { @@ -454,7 +456,7 @@ const wordBreak = (s, wordDict) => { } ``` -TypeScript: +### TypeScript: > 动态规划 @@ -496,7 +498,7 @@ function wordBreak(s: string, wordDict: string[]): boolean { }; ``` -Rust: +### Rust: ```rust impl Solution { @@ -519,3 +521,4 @@ impl Solution { + diff --git "a/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" "b/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" index 70ab8649fd..a0c138ee80 100644 --- "a/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" +++ "b/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" @@ -28,9 +28,9 @@ 提示: * 1 <= n <= 10^4 -# 算法公开课 +## 算法公开课 -**《代码随想录》算法视频公开课:[换汤不换药!| LeetCode:279.完全平方数](https://www.bilibili.com/video/BV12P411T7Br/),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[换汤不换药!| LeetCode:279.完全平方数](https://www.bilibili.com/video/BV12P411T7Br/),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 ## 思路 @@ -106,8 +106,6 @@ dp[5] = min(dp[4] + 1, dp[1] + 1) = 2 最后的dp[n]为最终结果。 -## C++代码 - 以上动规五部曲分析完毕C++代码如下: ```CPP @@ -165,8 +163,8 @@ public: ## 其他语言版本 +### Java: -Java: ```Java class Solution { // 版本一,先遍历物品, 再遍历背包 @@ -219,7 +217,7 @@ class Solution { } ``` -Python: +### Python: 先遍历物品, 再遍历背包 ```python @@ -276,7 +274,8 @@ class Solution: ``` -Go: +### Go: + ```go // 版本一,先遍历物品, 再遍历背包 func numSquares1(n int) int { @@ -327,7 +326,8 @@ func min(a, b int) int { } ``` -Javascript: +### Javascript: + ```Javascript // 先遍历物品,再遍历背包 var numSquares1 = function(n) { @@ -357,7 +357,7 @@ var numSquares2 = function(n) { }; ``` -TypeScript: +### TypeScript: ```typescript // 先遍历物品 @@ -389,7 +389,7 @@ function numSquares(n: number): number { }; ``` -Rust: +### Rust: ```rust // 先遍历背包 @@ -439,3 +439,4 @@ impl Solution { + diff --git "a/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" "b/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" index 1f3f4df27f..f32fd13e23 100644 --- "a/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" +++ "b/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" @@ -39,9 +39,9 @@ * 1 <= coins[i] <= 2^31 - 1 * 0 <= amount <= 10^4 -# 算法公开课 +## 算法公开课 -**《代码随想录》算法视频公开课:[装满背包最少的物品件数是多少?| LeetCode:322.零钱兑换](https://www.bilibili.com/video/BV14K411R7yv/),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[装满背包最少的物品件数是多少?| LeetCode:322.零钱兑换](https://www.bilibili.com/video/BV14K411R7yv/),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 @@ -110,7 +110,6 @@ dp[0] = 0; dp[amount]为最终结果。 -## C++代码 以上分析完毕,C++ 代码如下: ```CPP @@ -187,8 +186,8 @@ public: ## 其他语言版本 +### Java: -Java: ```Java class Solution { public int coinChange(int[] coins, int amount) { @@ -215,7 +214,7 @@ class Solution { } ``` -Python: +### Python: 先遍历物品 后遍历背包 @@ -288,7 +287,8 @@ class Solution: ``` -Go: +### Go: + ```go // 版本一, 先遍历物品,再遍历背包 func coinChange1(coins []int, amount int) int { @@ -352,7 +352,7 @@ func min(a, b int) int { ``` -Rust: +### Rust: ```rust // 遍历物品 @@ -398,7 +398,8 @@ impl Solution { } ``` -Javascript: +### Javascript: + ```javascript // 遍历物品 const coinChange = (coins, amount) => { @@ -435,7 +436,7 @@ var coinChange = function(coins, amount) { } ``` -TypeScript: +### TypeScript: ```typescript // 遍历物品 @@ -473,3 +474,4 @@ function coinChange(coins: number[], amount: number): number { + diff --git "a/problems/0377.\347\273\204\345\220\210\346\200\273\345\222\214\342\205\243.md" "b/problems/0377.\347\273\204\345\220\210\346\200\273\345\222\214\342\205\243.md" index bd43d52657..d9699c5407 100644 --- "a/problems/0377.\347\273\204\345\220\210\346\200\273\345\222\214\342\205\243.md" +++ "b/problems/0377.\347\273\204\345\220\210\346\200\273\345\222\214\342\205\243.md" @@ -31,9 +31,9 @@ 因此输出为 7。 -# 算法公开课 +## 算法公开课 -**《代码随想录》算法视频公开课:[装满背包有几种方法?求排列数?| LeetCode:377.组合总和IV](https://www.bilibili.com/video/BV1V14y1n7B6/),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[装满背包有几种方法?求排列数?| LeetCode:377.组合总和IV](https://www.bilibili.com/video/BV1V14y1n7B6/),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 ## 思路 @@ -154,8 +154,7 @@ C++测试用例有两个数相加超过int的数据,所以需要在if里加上 ## 其他语言版本 - -Java: +### Java: ```Java class Solution { @@ -174,7 +173,7 @@ class Solution { } ``` -Python: +### Python: 卡哥版 @@ -207,7 +206,8 @@ class Solution: ``` -Go: +### Go: + ```go func combinationSum4(nums []int, target int) int { //定义dp数组 @@ -226,7 +226,8 @@ func combinationSum4(nums []int, target int) int { } ``` -Javascript: +### Javascript: + ```javascript const combinationSum4 = (nums, target) => { @@ -245,7 +246,7 @@ const combinationSum4 = (nums, target) => { }; ``` -TypeScript: +### TypeScript: ```typescript function combinationSum4(nums: number[], target: number): number { @@ -264,7 +265,7 @@ function combinationSum4(nums: number[], target: number): number { }; ``` -Rust +### Rust: ```Rust impl Solution { @@ -289,3 +290,4 @@ impl Solution { + diff --git "a/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" "b/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" index 8da351148b..7c9f0fcefb 100644 --- "a/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" +++ "b/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" @@ -41,9 +41,9 @@ * 硬币种类不超过 500 种 * 结果符合 32 位符号整数 -# 算法公开课 +## 算法公开课 -**《代码随想录》算法视频公开课:[装满背包有多少种方法?组合与排列有讲究!| LeetCode:518.零钱兑换II](https://www.bilibili.com/video/BV1KM411k75j/),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[装满背包有多少种方法?组合与排列有讲究!| LeetCode:518.零钱兑换II](https://www.bilibili.com/video/BV1KM411k75j/),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 @@ -202,8 +202,8 @@ public: ## 其他语言版本 +### Java: -Java: ```Java class Solution { public int change(int amount, int[] coins) { @@ -242,7 +242,7 @@ class Solution { } ``` -Python: +### Python: ```python @@ -260,7 +260,8 @@ class Solution: -Go: +### Go: + ```go func change(amount int, coins []int) int { // 定义dp数组 @@ -280,7 +281,8 @@ func change(amount int, coins []int) int { } ``` -Rust: +### Rust: + ```rust impl Solution { pub fn change(amount: i32, coins: Vec) -> i32 { @@ -297,7 +299,8 @@ impl Solution { } ``` -Javascript: +### Javascript: + ```javascript const change = (amount, coins) => { let dp = Array(amount + 1).fill(0); @@ -313,7 +316,7 @@ const change = (amount, coins) => { } ``` -TypeScript: +### TypeScript: ```typescript function change(amount: number, coins: number[]): number { @@ -328,7 +331,7 @@ function change(amount: number, coins: number[]): number { }; ``` -Scala: +### Scala: ```scala object Solution { @@ -349,4 +352,3 @@ object Solution { - diff --git "a/problems/\350\203\214\345\214\205\346\200\273\347\273\223\347\257\207.md" "b/problems/\350\203\214\345\214\205\346\200\273\347\273\223\347\257\207.md" index c4e8cd9cff..9be93096fd 100644 --- "a/problems/\350\203\214\345\214\205\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/\350\203\214\345\214\205\346\200\273\347\273\223\347\257\207.md" @@ -106,3 +106,4 @@ + diff --git "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\244\232\351\207\215\350\203\214\345\214\205.md" "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\244\232\351\207\215\350\203\214\345\214\205.md" index 1a856bf5fa..50c2e5bf8c 100644 --- "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\244\232\351\207\215\350\203\214\345\214\205.md" +++ "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\244\232\351\207\215\350\203\214\345\214\205.md" @@ -144,8 +144,7 @@ int main() { ## 其他语言版本 - -Java: +### Java: ```Java public void testMultiPack1(){ @@ -192,7 +191,7 @@ public void testMultiPack2(){ } ``` -Python: +### Python: 改变物品数量为01背包格式(无参版) ```python @@ -315,7 +314,7 @@ if __name__ == "__main__": test_multi_pack(weight, value, nums, bagWeight) ``` -Go: +### Go: ```go package theory @@ -406,7 +405,7 @@ func Test_multiplePack(t *testing.T) { PASS ``` -TypeScript: +### TypeScript: > 版本一(改变数据源): @@ -469,3 +468,4 @@ testMultiPack(); + diff --git "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" index 088a3d50e9..ac4c4a1cbe 100644 --- "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" +++ "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" @@ -7,9 +7,13 @@ # 动态规划:完全背包理论基础 -**《代码随想录》算法视频公开课:[带你学透完全背包问题! ](https://www.bilibili.com/video/BV1uK411o7c9/),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 +## 算法公开课 -## 完全背包 +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[带你学透完全背包问题! ](https://www.bilibili.com/video/BV1uK411o7c9/),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 + +## 思路 + +### 完全背包 有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。**每件物品都有无限个(也就是可以放入背包多次)**,求解将哪些物品装入背包里物品价值总和最大。 @@ -113,8 +117,6 @@ for(int j = 0; j <= bagWeight; j++) { // 遍历背包容量 } ``` -## C++测试代码 - 完整的C++测试代码如下: ```CPP @@ -181,7 +183,7 @@ int main() { ## 其他语言版本 -Java: +### Java: ```java //先遍历物品,再遍历背包 @@ -221,9 +223,7 @@ private static void testCompletePackAnotherWay(){ -Python: - - +### Python: 先遍历物品,再遍历背包(无参版) ```python @@ -299,7 +299,8 @@ if __name__ == "__main__": ``` -Go: +### Go: + ```go // test_CompletePack1 先遍历物品, 在遍历背包 @@ -352,7 +353,8 @@ func main() { fmt.Println(test_CompletePack2(weight, price, 4)) } ``` -Javascript: +### Javascript: + ```Javascript // 先遍历物品,再遍历背包容量 function test_completePack1() { @@ -385,7 +387,7 @@ function test_completePack2() { } ``` -TypeScript: +### TypeScript: ```typescript // 先遍历物品,再遍历背包容量 @@ -404,7 +406,7 @@ function test_CompletePack(): void { test_CompletePack(); ``` -Scala: +### Scala: ```scala // 先遍历物品,再遍历背包容量 @@ -426,7 +428,7 @@ object Solution { } ``` -Rust: +### Rust: ```rust impl Solution { @@ -468,3 +470,4 @@ fn test_complete_pack() { + From 89571ea8f867a22ca0ff69017ea8b741e965c3c4 Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Wed, 26 Jul 2023 15:33:10 +0800 Subject: [PATCH 2163/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200198.=E6=89=93?= =?UTF-8?q?=E5=AE=B6=E5=8A=AB=E8=88=8D=200213.=E6=89=93=E5=AE=B6=E5=8A=AB?= =?UTF-8?q?=E8=88=8DII=200337.=E6=89=93=E5=AE=B6=E5=8A=AB=E8=88=8DIII=20?= =?UTF-8?q?=E6=8E=92=E7=89=88=E6=A0=BC=E5=BC=8F=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...223\345\256\266\345\212\253\350\210\215.md" | 18 +++++++++--------- ...3\345\256\266\345\212\253\350\210\215II.md" | 18 ++++++++++-------- ...\345\256\266\345\212\253\350\210\215III.md" | 5 +++-- 3 files changed, 22 insertions(+), 19 deletions(-) diff --git "a/problems/0198.\346\211\223\345\256\266\345\212\253\350\210\215.md" "b/problems/0198.\346\211\223\345\256\266\345\212\253\350\210\215.md" index 80902559a6..a7bc4c998e 100644 --- "a/problems/0198.\346\211\223\345\256\266\345\212\253\350\210\215.md" +++ "b/problems/0198.\346\211\223\345\256\266\345\212\253\350\210\215.md" @@ -31,9 +31,9 @@ * 0 <= nums.length <= 100 * 0 <= nums[i] <= 400 -# 算法公开课 +## 算法公开课 -**《代码随想录》算法视频公开课:[动态规划,偷不偷这个房间呢?| LeetCode:198.打家劫舍](https://www.bilibili.com/video/BV1Te411N7SX),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[动态规划,偷不偷这个房间呢?| LeetCode:198.打家劫舍](https://www.bilibili.com/video/BV1Te411N7SX),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 ## 思路 @@ -121,8 +121,8 @@ public: ## 其他语言版本 +### Java: -Java: ```Java // 动态规划 class Solution { @@ -194,7 +194,7 @@ class Solution { } ``` -Python: +### Python: 1维DP ```python @@ -255,7 +255,8 @@ class Solution: ``` -Go: +### Go: + ```Go func rob(nums []int) int { n := len(nums) @@ -275,7 +276,7 @@ func max(a, b int) int { } ``` -JavaScript: +### JavaScript: ```javascript const rob = nums => { @@ -291,7 +292,7 @@ const rob = nums => { }; ``` -TypeScript: +### TypeScript: ```typescript function rob(nums: number[]): number { @@ -314,7 +315,7 @@ function rob(nums: number[]): number { }; ``` -Rust: +### Rust: ```rust impl Solution { @@ -338,4 +339,3 @@ impl Solution { - diff --git "a/problems/0213.\346\211\223\345\256\266\345\212\253\350\210\215II.md" "b/problems/0213.\346\211\223\345\256\266\345\212\253\350\210\215II.md" index ee62b5745e..cd9d596d70 100644 --- "a/problems/0213.\346\211\223\345\256\266\345\212\253\350\210\215II.md" +++ "b/problems/0213.\346\211\223\345\256\266\345\212\253\350\210\215II.md" @@ -31,9 +31,9 @@ * 1 <= nums.length <= 100 * 0 <= nums[i] <= 1000 -# 算法公开课 +## 算法公开课 -**《代码随想录》算法视频公开课:[动态规划,房间连成环了那还偷不偷呢?| LeetCode:213.打家劫舍II](https://www.bilibili.com/video/BV1oM411B7xq),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[动态规划,房间连成环了那还偷不偷呢?| LeetCode:213.打家劫舍II](https://www.bilibili.com/video/BV1oM411B7xq),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 ## 思路 @@ -104,8 +104,8 @@ public: ## 其他语言版本 +### Java: -Java: ```Java class Solution { public int rob(int[] nums) { @@ -129,7 +129,7 @@ class Solution { } ``` -Python: +### Python: ```Python class Solution: @@ -219,7 +219,7 @@ class Solution: ``` -Go: +### Go: ```go // 打家劫舍Ⅱ 动态规划 @@ -257,7 +257,8 @@ func max(a, b int) int { } ``` -javascipt: +### JavaScript: + ```javascript var rob = function(nums) { const n = nums.length @@ -279,7 +280,7 @@ const robRange = (nums, start, end) => { return dp[end] } ``` -TypeScript: +### TypeScript: ```typescript function rob(nums: number[]): number { @@ -301,7 +302,7 @@ function robRange(nums: number[], start: number, end: number): number { } ``` -Rust: +### Rust: ```rust impl Solution { @@ -336,3 +337,4 @@ impl Solution { + diff --git "a/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" "b/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" index 1708b7a1e8..96d487e215 100644 --- "a/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" +++ "b/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" @@ -16,9 +16,9 @@ ![337.打家劫舍III](https://code-thinking-1253855093.file.myqcloud.com/pics/20210223173849619.png) -# 算法公开课 +## 算法公开课 -**《代码随想录》算法视频公开课:[动态规划,房间连成树了,偷不偷呢?| LeetCode:337.打家劫舍3](https://www.bilibili.com/video/BV1H24y1Q7sY),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[动态规划,房间连成树了,偷不偷呢?| LeetCode:337.打家劫舍3](https://www.bilibili.com/video/BV1H24y1Q7sY),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 ## 思路 @@ -523,3 +523,4 @@ impl Solution { + From 6b322684a4ebc096d71d36846496501f6e3ffefa Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Wed, 26 Jul 2023 15:55:12 +0800 Subject: [PATCH 2164/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20=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=E7=B3=BB=E5=88=97=20=E6=8E=92=E7=89=88=E6=A0=BC?= =?UTF-8?q?=E5=BC=8F=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...00\344\275\263\346\227\266\346\234\272.md" | 22 +++++++++---------- ...01\350\247\204\345\210\222\357\274\211.md" | 21 +++++++++--------- ...344\275\263\346\227\266\346\234\272III.md" | 17 +++++++------- ...\344\275\263\346\227\266\346\234\272IV.md" | 17 +++++++------- ...53\345\206\267\345\206\273\346\234\237.md" | 19 +++++++++------- ...01\350\247\204\345\210\222\357\274\211.md" | 21 ++++++++++-------- ...30\346\200\273\347\273\223\347\257\207.md" | 13 +---------- 7 files changed, 63 insertions(+), 67 deletions(-) diff --git "a/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" "b/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" index 0630515662..cbdf40e85c 100644 --- "a/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" +++ "b/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" @@ -24,11 +24,9 @@ * 输出:0 解释:在这种情况下, 没有交易完成, 所以最大利润为 0。 -# 算法公开课 - -**《代码随想录》算法视频公开课:[动态规划之 LeetCode:121.买卖股票的最佳时机1](https://www.bilibili.com/video/BV1Xe4y1u77q),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 - +## 算法公开课 +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[动态规划之 LeetCode:121.买卖股票的最佳时机1](https://www.bilibili.com/video/BV1Xe4y1u77q),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 ## 思路 @@ -202,7 +200,7 @@ public: ## 其他语言版本 -Java: +### Java: > 贪心法: @@ -294,8 +292,7 @@ class Solution { ``` - -Python: +### Python: > 贪心法: ```python @@ -351,7 +348,8 @@ class Solution: return dp1 ``` -Go: +### Go: + > 贪心法: ```Go func maxProfit(prices []int) int { @@ -418,7 +416,7 @@ func max(a, b int) int { } ``` -JavaScript: +### JavaScript: > 动态规划 @@ -454,7 +452,7 @@ var maxProfit = function(prices) { }; ``` -TypeScript: +### TypeScript: > 贪心法 @@ -492,7 +490,7 @@ function maxProfit(prices: number[]): number { }; ``` -C#: +### C#: > 贪心法 @@ -533,7 +531,7 @@ public class Solution } ``` -Rust: +### Rust: > 贪心 diff --git "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" index 02f8d287d0..6e08b57c1d 100644 --- "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" +++ "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" @@ -34,9 +34,9 @@ * 1 <= prices.length <= 3 * 10 ^ 4 * 0 <= prices[i] <= 10 ^ 4 -# 算法公开课 +## 算法公开课 -**《代码随想录》算法视频公开课:[动态规划,股票问题第二弹 | LeetCode:122.买卖股票的最佳时机II](https://www.bilibili.com/video/BV1D24y1Q7Ls),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[动态规划,股票问题第二弹 | LeetCode:122.买卖股票的最佳时机II](https://www.bilibili.com/video/BV1D24y1Q7Ls),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 ## 思路 @@ -133,8 +133,8 @@ public: ## 其他语言版本 +### Java: -Java: ```java // 动态规划 class Solution @@ -191,7 +191,7 @@ class Solution { } ``` -Python: +### Python: > 版本一: ```python @@ -221,7 +221,8 @@ class Solution: return dp[(length-1) % 2][1] ``` -Go: +### Go: + ```go // 买卖股票的最佳时机Ⅱ 动态规划 // 时间复杂度:O(n) 空间复杂度:O(n) @@ -250,7 +251,8 @@ func max(a, b int) int { } ``` -Javascript: +### JavaScript: + ```javascript // 方法一:动态规划(dp 数组) const maxProfit = (prices) => { @@ -290,7 +292,7 @@ const maxProfit = (prices) => { } ``` -TypeScript: +### TypeScript: > 动态规划 @@ -326,7 +328,7 @@ function maxProfit(prices: number[]): number { }; ``` -C#: +### C#: > 贪心法 @@ -363,7 +365,7 @@ public class Solution } ``` -Rust: +### Rust: > 贪心 @@ -414,4 +416,3 @@ impl Solution { - diff --git "a/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" "b/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" index a646b7d517..72dd90426c 100644 --- "a/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" +++ "b/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" @@ -39,9 +39,9 @@ * 1 <= prices.length <= 10^5 * 0 <= prices[i] <= 10^5 -# 算法公开课 +## 算法公开课 -**《代码随想录》算法视频公开课:[动态规划,股票至多买卖两次,怎么求? | LeetCode:123.买卖股票最佳时机III](https://www.bilibili.com/video/BV1WG411K7AR),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[动态规划,股票至多买卖两次,怎么求? | LeetCode:123.买卖股票最佳时机III](https://www.bilibili.com/video/BV1WG411K7AR),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 ## 思路 @@ -221,7 +221,7 @@ public: ## 其他语言版本 -Java: +### Java: ```java // 版本一 @@ -277,7 +277,7 @@ class Solution { } ``` -Python: +### Python: > 版本一: ```python @@ -314,7 +314,7 @@ class Solution: return dp[4] ``` -Go: +### Go: ```go func maxProfit(prices []int) int { @@ -344,7 +344,7 @@ func max(a, b int) int { } ``` -JavaScript: +### JavaScript: > 版本一: @@ -383,7 +383,7 @@ const maxProfit = prices => { }; ``` -TypeScript: +### TypeScript: > 版本一 @@ -413,7 +413,7 @@ function maxProfit(prices: number[]): number { }; ``` -Rust: +### Rust: > 版本一 @@ -465,3 +465,4 @@ impl Solution { + diff --git "a/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" "b/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" index 773a910a23..d4dc769893 100644 --- "a/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" +++ "b/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" @@ -31,9 +31,9 @@ * 0 <= prices.length <= 1000 * 0 <= prices[i] <= 1000 -# 算法公开课 +## 算法公开课 -**《代码随想录》算法视频公开课:[动态规划来决定最佳时机,至多可以买卖K次!| LeetCode:188.买卖股票最佳时机4](https://www.bilibili.com/video/BV16M411U7XJ),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[动态规划来决定最佳时机,至多可以买卖K次!| LeetCode:188.买卖股票最佳时机4](https://www.bilibili.com/video/BV16M411U7XJ),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 ## 思路 @@ -173,7 +173,7 @@ public: ## 其他语言版本 -Java: +### Java: ```java // 版本一: 三维 dp数组 @@ -295,7 +295,7 @@ class Solution { } ``` -Python: +### Python: 版本一 @@ -329,7 +329,7 @@ class Solution: dp[j] = max(dp[j],dp[j-1]+prices[i]) return dp[2*k] ``` -Go: +### Go: 版本一: @@ -404,7 +404,7 @@ func max188(a, b int) int { } ``` -Javascript: +### JavaScript: ```javascript // 方法一:动态规划 @@ -454,7 +454,7 @@ var maxProfit = function(k, prices) { }; ``` -TypeScript: +### TypeScript: ```typescript function maxProfit(k: number, prices: number[]): number { @@ -474,7 +474,7 @@ function maxProfit(k: number, prices: number[]): number { }; ``` -Rust: +### Rust: ```rust impl Solution { @@ -529,3 +529,4 @@ impl Solution { + diff --git "a/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" "b/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" index cd71136ba6..f4093b67e6 100644 --- "a/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" +++ "b/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" @@ -20,9 +20,9 @@ * 输出: 3 * 解释: 对应的交易状态为: [买入, 卖出, 冷冻期, 买入, 卖出] -# 算法公开课 +## 算法公开课 -**《代码随想录》算法视频公开课:[动态规划来决定最佳时机,这次有冷冻期!| LeetCode:309.买卖股票的最佳时机含冷冻期](https://www.bilibili.com/video/BV1rP4y1D7ku),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[动态规划来决定最佳时机,这次有冷冻期!| LeetCode:309.买卖股票的最佳时机含冷冻期](https://www.bilibili.com/video/BV1rP4y1D7ku),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 ## 思路 @@ -174,7 +174,7 @@ public: ## 其他语言版本 -Java: +### Java: ```java class Solution { @@ -273,8 +273,9 @@ class Solution { } ``` -Python: +### Python: 版本一 + ```python from typing import List @@ -319,7 +320,8 @@ class Solution: return max(dp[-1][1], dp[-1][2]) ``` -Go: +### Go: + ```go // 最佳买卖股票时机含冷冻期 动态规划 // 时间复杂度O(n) 空间复杂度O(n) @@ -355,7 +357,7 @@ func max(a, b int) int { } ``` -Javascript: +### Javascript: ```javascript const maxProfit = (prices) => { @@ -397,7 +399,7 @@ const maxProfit = (prices) => { }; ``` -TypeScript: +### TypeScript: > 版本一,与本文思路一致 @@ -455,7 +457,7 @@ function maxProfit(prices: number[]): number { }; ``` -Rust: +### Rust: ```rust impl Solution { @@ -484,3 +486,4 @@ impl Solution { + diff --git "a/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" "b/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" index 042de94718..7e8e3d7c61 100644 --- "a/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" +++ "b/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" @@ -32,9 +32,9 @@ * 0 < prices[i] < 50000. * 0 <= fee < 50000. -# 算法公开课 +## 算法公开课 -**《代码随想录》算法视频公开课:[动态规划来决定最佳时机,这次含手续费!| LeetCode:714.买卖股票的最佳时机含手续费](https://www.bilibili.com/video/BV1z44y1Z7UR),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[动态规划来决定最佳时机,这次含手续费!| LeetCode:714.买卖股票的最佳时机含手续费](https://www.bilibili.com/video/BV1z44y1Z7UR),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 ## 思路 @@ -97,8 +97,8 @@ public: ## 其他语言版本 +### Java: -Java: ```java /** * 卖出时支付手续费 @@ -173,9 +173,9 @@ class Solution { } } ``` -``` +### python + -Python: ```python class Solution: def maxProfit(self, prices: List[int], fee: int) -> int: @@ -188,7 +188,8 @@ class Solution: return max(dp[-1][0], dp[-1][1]) ``` -Go: +### Go: + ```go // 买卖股票的最佳时机含手续费 动态规划 // 时间复杂度O(n) 空间复杂度O(n) @@ -211,7 +212,8 @@ func max(a, b int) int { } ``` -Javascript: +### Javascript: + ```javascript const maxProfit = (prices,fee) => { let dp = Array.from(Array(prices.length), () => Array(2).fill(0)); @@ -224,7 +226,7 @@ const maxProfit = (prices,fee) => { } ``` -TypeScript: +### TypeScript: ```typescript function maxProfit(prices: number[], fee: number): number { @@ -245,8 +247,9 @@ function maxProfit(prices: number[], fee: number): number { }; ``` -Rust: +### Rust: **贪心** + ```Rust impl Solution { pub fn max_profit(prices: Vec, fee: i32) -> i32 { diff --git "a/problems/\345\212\250\346\200\201\350\247\204\345\210\222-\350\202\241\347\245\250\351\227\256\351\242\230\346\200\273\347\273\223\347\257\207.md" "b/problems/\345\212\250\346\200\201\350\247\204\345\210\222-\350\202\241\347\245\250\351\227\256\351\242\230\346\200\273\347\273\223\347\257\207.md" index 2b04b7b085..4df21fb761 100644 --- "a/problems/\345\212\250\346\200\201\350\247\204\345\210\222-\350\202\241\347\245\250\351\227\256\351\242\230\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/\345\212\250\346\200\201\350\247\204\345\210\222-\350\202\241\347\245\250\351\227\256\351\242\230\346\200\273\347\273\223\347\257\207.md" @@ -471,21 +471,10 @@ public: 「代码随想录」值得推荐给身边每一位学习算法的朋友同学们,关注后都会发现相见恨晚! -## 其他语言版本 - - -Java: - - -Python: - - -Go: - -

+ From 038d50957cff8e3e370a1812ff36afa5feb72945 Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Wed, 26 Jul 2023 15:58:53 +0800 Subject: [PATCH 2165/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200674.=E6=9C=80?= =?UTF-8?q?=E9=95=BF=E8=BF=9E=E7=BB=AD=E9=80=92=E5=A2=9E=E5=BA=8F=E5=88=97?= =?UTF-8?q?=20=E6=8E=92=E7=89=88=E6=A0=BC=E5=BC=8F=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...07\345\255\220\345\272\217\345\210\227.md" | 24 +++++++++---------- ...22\345\242\236\345\272\217\345\210\227.md" | 18 +++++++------- 2 files changed, 21 insertions(+), 21 deletions(-) diff --git "a/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" "b/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" index c58c3bf6c4..11cf13d9c5 100644 --- "a/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" @@ -33,7 +33,7 @@ ## 算法公开课 -**《代码随想录》算法视频公开课:[动态规划之子序列问题,元素不连续!| LeetCode:300.最长递增子序列](https://www.bilibili.com/video/BV1ng411J7xP),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html)::[动态规划之子序列问题,元素不连续!| LeetCode:300.最长递增子序列](https://www.bilibili.com/video/BV1ng411J7xP),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 ## 思路 @@ -124,8 +124,8 @@ public: ## 其他语言版本 +### Java: -Java: ```Java class Solution { public int lengthOfLIS(int[] nums) { @@ -147,7 +147,7 @@ class Solution { } ``` -Python: +### Python: DP ```python @@ -189,7 +189,8 @@ class Solution: return len(tails) # 返回递增子序列的长度 ``` -Go: +### Go: + ```go // 动态规划求解 func lengthOfLIS(nums []int) int { @@ -248,7 +249,8 @@ func lengthOfLIS(nums []int ) int { } ``` -Javascript +### Javascript: + ```javascript const lengthOfLIS = (nums) => { let dp = Array(nums.length).fill(1); @@ -267,7 +269,7 @@ const lengthOfLIS = (nums) => { }; ``` -TypeScript +### TypeScript: ```typescript function lengthOfLIS(nums: number[]): number { @@ -288,7 +290,8 @@ function lengthOfLIS(nums: number[]): number { }; ``` -Rust: +### Rust: + ```rust pub fn length_of_lis(nums: Vec) -> i32 { let mut dp = vec![1; nums.len() + 1]; @@ -307,13 +310,8 @@ pub fn length_of_lis(nums: Vec) -> i32 { - - - - - -

+ diff --git "a/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" "b/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" index 8cc270ec64..0c5e64b34e 100644 --- "a/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" +++ "b/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" @@ -29,7 +29,7 @@ ## 算法公开课 -**《代码随想录》算法视频公开课:[动态规划之子序列问题,重点在于连续!| LeetCode:674.最长连续递增序列](https://www.bilibili.com/video/BV1bD4y1778v),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[动态规划之子序列问题,重点在于连续!| LeetCode:674.最长连续递增序列](https://www.bilibili.com/video/BV1bD4y1778v),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 ## 思路 @@ -157,8 +157,7 @@ public: ## 其他语言版本 - -Java: +### Java: > 动态规划: ```java @@ -207,7 +206,7 @@ public static int findLengthOfLCIS(int[] nums) { } ``` -Python: +### Python: DP ```python @@ -261,7 +260,8 @@ class Solution: return result ``` -Go: +### Go: + > 动态规划: ```go func findLengthOfLCIS(nums []int) int { @@ -302,7 +302,8 @@ func findLengthOfLCIS(nums []int) int { } ``` -Rust: +### Rust: + ```rust pub fn find_length_of_lcis(nums: Vec) -> i32 { if nums.is_empty() { @@ -320,7 +321,7 @@ pub fn find_length_of_lcis(nums: Vec) -> i32 { } ``` -Javascript: +### Javascript: > 动态规划: ```javascript @@ -363,7 +364,7 @@ const findLengthOfLCIS = (nums) => { }; ``` -TypeScript: +### TypeScript: > 动态规划: @@ -409,3 +410,4 @@ function findLengthOfLCIS(nums: number[]): number { + From 9b0c0f20dcc1fd75af00188a04886dee7adc8c60 Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Wed, 26 Jul 2023 16:07:52 +0800 Subject: [PATCH 2166/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200392.=E5=88=A4?= =?UTF-8?q?=E6=96=AD=E5=AD=90=E5=BA=8F=E5=88=97=200718.=E6=9C=80=E9=95=BF?= =?UTF-8?q?=E9=87=8D=E5=A4=8D=E5=AD=90=E6=95=B0=E7=BB=84=201035.=E4=B8=8D?= =?UTF-8?q?=E7=9B=B8=E4=BA=A4=E7=9A=84=E7=BA=BF=201143.=E6=9C=80=E9=95=BF?= =?UTF-8?q?=E5=85=AC=E5=85=B1=E5=AD=90=E5=BA=8F=E5=88=97=20=E6=8E=92?= =?UTF-8?q?=E7=89=88=E6=A0=BC=E5=BC=8F=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...55\345\255\220\345\272\217\345\210\227.md" | 16 +++++++++------- ...15\345\255\220\346\225\260\347\273\204.md" | 18 +++++++++--------- ...70\344\272\244\347\232\204\347\272\277.md" | 17 +++++++++-------- ...61\345\255\220\345\272\217\345\210\227.md" | 19 ++++++++++++------- 4 files changed, 39 insertions(+), 31 deletions(-) diff --git "a/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" "b/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" index c10114c05a..6342a41f00 100644 --- "a/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" @@ -28,9 +28,9 @@ 两个字符串都只由小写字符组成。 -# 算法公开课 +## 算法公开课 -**《代码随想录》算法视频公开课:[动态规划,用相似思路解决复杂问题 | LeetCode:392.判断子序列](https://www.bilibili.com/video/BV1tv4y1B7ym/),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[动态规划,用相似思路解决复杂问题 | LeetCode:392.判断子序列](https://www.bilibili.com/video/BV1tv4y1B7ym/),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 ## 思路 @@ -149,8 +149,8 @@ public: ## 其他语言版本 +### Java: -Java: ```java class Solution { public boolean isSubsequence(String s, String t) { @@ -174,7 +174,8 @@ class Solution { } ``` -Python: +### Python: + ```python class Solution: def isSubsequence(self, s: str, t: str) -> bool: @@ -190,7 +191,7 @@ class Solution: return False ``` -JavaScript: +### JavaScript: ```javascript const isSubsequence = (s, t) => { @@ -213,7 +214,7 @@ const isSubsequence = (s, t) => { }; ``` -TypeScript: +### TypeScript: ```typescript function isSubsequence(s: string, t: string): boolean { @@ -237,7 +238,7 @@ function isSubsequence(s: string, t: string): boolean { }; ``` -Go: +### Go: ```go func isSubsequence(s string, t string) bool { @@ -266,3 +267,4 @@ func isSubsequence(s string, t string) bool { + diff --git "a/problems/0718.\346\234\200\351\225\277\351\207\215\345\244\215\345\255\220\346\225\260\347\273\204.md" "b/problems/0718.\346\234\200\351\225\277\351\207\215\345\244\215\345\255\220\346\225\260\347\273\204.md" index 82bf4f59e2..18cc02407f 100644 --- "a/problems/0718.\346\234\200\351\225\277\351\207\215\345\244\215\345\255\220\346\225\260\347\273\204.md" +++ "b/problems/0718.\346\234\200\351\225\277\351\207\215\345\244\215\345\255\220\346\225\260\347\273\204.md" @@ -25,9 +25,7 @@ ## 算法公开课 -**《代码随想录》算法视频公开课:[动态规划之子序列问题,想清楚DP数组的定义 | LeetCode:718.最长重复子数组](https://www.bilibili.com/video/BV178411H7hV),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 - - +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[动态规划之子序列问题,想清楚DP数组的定义 | LeetCode:718.最长重复子数组](https://www.bilibili.com/video/BV178411H7hV),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 ## 思路 @@ -126,7 +124,7 @@ public: * 时间复杂度:O(n × m),n 为A长度,m为B长度 * 空间复杂度:O(n × m) -## 滚动数组 +### 滚动数组 在如下图中: @@ -257,8 +255,8 @@ class Solution { ## 其他语言版本 +### Java: -Java: ```java // 版本一 class Solution { @@ -300,7 +298,7 @@ class Solution { } ``` -Python: +### Python: 2维DP ```python @@ -395,7 +393,8 @@ class Solution: ``` -Go: +### Go: + ```Go func findLength(A []int, B []int) int { m, n := len(A), len(B) @@ -442,7 +441,7 @@ func max(a, b int) int { } ``` -JavaScript: +### JavaScript: > 动态规划 @@ -489,7 +488,7 @@ const findLength = (nums1, nums2) => { } ``` -TypeScript: +### TypeScript: > 动态规划: @@ -544,3 +543,4 @@ function findLength(nums1: number[], nums2: number[]): number { + diff --git "a/problems/1035.\344\270\215\347\233\270\344\272\244\347\232\204\347\272\277.md" "b/problems/1035.\344\270\215\347\233\270\344\272\244\347\232\204\347\272\277.md" index 7142d75c09..74e94c842f 100644 --- "a/problems/1035.\344\270\215\347\233\270\344\272\244\347\232\204\347\272\277.md" +++ "b/problems/1035.\344\270\215\347\233\270\344\272\244\347\232\204\347\272\277.md" @@ -19,7 +19,7 @@ ## 算法公开课 -**《代码随想录》算法视频公开课:[动态规划之子序列问题,换汤不换药 | LeetCode:1035.不相交的线](https://www.bilibili.com/video/BV1h84y1x7MP),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[动态规划之子序列问题,换汤不换药 | LeetCode:1035.不相交的线](https://www.bilibili.com/video/BV1h84y1x7MP),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 ## 思路 @@ -82,8 +82,8 @@ public: ## 其他语言版本 +### Java: -Java: ```java class Solution { public int maxUncrossedLines(int[] nums1, int[] nums2) { @@ -106,7 +106,8 @@ Java: } ``` -Python: +### Python: + ```python class Solution: def maxUncrossedLines(self, A: List[int], B: List[int]) -> int: @@ -120,8 +121,7 @@ class Solution: return dp[-1][-1] ``` - -Golang: +### Go: ```go func maxUncrossedLines(A []int, B []int) int { @@ -152,7 +152,7 @@ func max(a, b int) int { } ``` -Rust: +### Rust: ```rust pub fn max_uncrossed_lines(nums1: Vec, nums2: Vec) -> i32 { @@ -173,7 +173,7 @@ pub fn max_uncrossed_lines(nums1: Vec, nums2: Vec) -> i32 { } ``` -JavaScript: +### JavaScript: ```javascript const maxUncrossedLines = (nums1, nums2) => { @@ -196,7 +196,7 @@ const maxUncrossedLines = (nums1, nums2) => { }; ``` -TypeScript: +### TypeScript: ```typescript function maxUncrossedLines(nums1: number[], nums2: number[]): number { @@ -224,3 +224,4 @@ function maxUncrossedLines(nums1: number[], nums2: number[]): number { + diff --git "a/problems/1143.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" "b/problems/1143.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" index 68269b87c5..260b085e14 100644 --- "a/problems/1143.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/1143.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" @@ -39,7 +39,7 @@ ## 算法公开课 -**《代码随想录》算法视频公开课:[动态规划子序列问题经典题目 | LeetCode:1143.最长公共子序列](https://www.bilibili.com/video/BV1ye4y1L7CQ),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[动态规划子序列问题经典题目 | LeetCode:1143.最长公共子序列](https://www.bilibili.com/video/BV1ye4y1L7CQ),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 ## 思路 @@ -136,7 +136,7 @@ public: ## 其他语言版本 -Java: +### Java: ```java /* @@ -207,8 +207,9 @@ class Solution { } ``` -Python: +### Python: 2维DP + ```python class Solution: def longestCommonSubsequence(self, text1: str, text2: str) -> int: @@ -252,7 +253,8 @@ class Solution: ``` -Go: +### Go: + ```Go func longestCommonSubsequence(text1 string, text2 string) int { t1 := len(text1) @@ -283,7 +285,8 @@ func max(a,b int)int { ``` -Javascript: +### JavaScript: + ```javascript const longestCommonSubsequence = (text1, text2) => { let dp = Array.from(Array(text1.length+1), () => Array(text2.length+1).fill(0)); @@ -302,7 +305,7 @@ const longestCommonSubsequence = (text1, text2) => { }; ``` -TypeScript: +### TypeScript: ```typescript function longestCommonSubsequence(text1: string, text2: string): number { @@ -326,7 +329,8 @@ function longestCommonSubsequence(text1: string, text2: string): number { }; ``` -Rust: +### Rust: + ```rust pub fn longest_common_subsequence(text1: String, text2: String) -> i32 { let (n, m) = (text1.len(), text2.len()); @@ -353,3 +357,4 @@ pub fn longest_common_subsequence(text1: String, text2: String) -> i32 { + From a0edc60d1fd08db91138daf430a97894a354bd98 Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Wed, 26 Jul 2023 16:21:21 +0800 Subject: [PATCH 2167/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20=E7=BC=96?= =?UTF-8?q?=E8=BE=91=E8=B7=9D=E7=A6=BB=E7=B3=BB=E5=88=97=20=E6=8E=92?= =?UTF-8?q?=E7=89=88=E6=A0=BC=E5=BC=8F=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...26\350\276\221\350\267\235\347\246\273.md" | 19 +++++++++++-------- ...04\345\255\220\345\272\217\345\210\227.md" | 18 ++++++++++-------- ...40\351\231\244\346\223\215\344\275\234.md" | 16 +++++++++------- ...11\346\255\245\351\223\272\345\236\253.md" | 8 ++------ 4 files changed, 32 insertions(+), 29 deletions(-) diff --git "a/problems/0072.\347\274\226\350\276\221\350\267\235\347\246\273.md" "b/problems/0072.\347\274\226\350\276\221\350\267\235\347\246\273.md" index 703e891311..1ed9a86083 100644 --- "a/problems/0072.\347\274\226\350\276\221\350\267\235\347\246\273.md" +++ "b/problems/0072.\347\274\226\350\276\221\350\267\235\347\246\273.md" @@ -40,8 +40,8 @@ exection -> execution (插入 'u') * 0 <= word1.length, word2.length <= 500 * word1 和 word2 由小写英文字母组成 -# 算法公开课 -**《代码随想录》算法视频公开课:[动态规划终极绝杀! LeetCode:72.编辑距离](https://www.bilibili.com/video/BV1we4y157wB/),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 +## 算法公开课 +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[动态规划终极绝杀! LeetCode:72.编辑距离](https://www.bilibili.com/video/BV1we4y157wB/),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 ## 思路 @@ -227,8 +227,8 @@ public: ## 其他语言版本 +### Java: -Java: ```java public int minDistance(String word1, String word2) { int m = word1.length(); @@ -256,7 +256,8 @@ public int minDistance(String word1, String word2) { } ``` -Python: +### Python: + ```python class Solution: def minDistance(self, word1: str, word2: str) -> int: @@ -274,7 +275,8 @@ class Solution: return dp[-1][-1] ``` -Go: +### Go: + ```Go func minDistance(word1 string, word2 string) int { m, n := len(word1), len(word2) @@ -310,8 +312,8 @@ func Min(args ...int) int { } ``` +### Javascript: -Javascript: ```javascript const minDistance = (word1, word2) => { let dp = Array.from(Array(word1.length + 1), () => Array(word2.length+1).fill(0)); @@ -338,7 +340,7 @@ const minDistance = (word1, word2) => { }; ``` -TypeScript: +### TypeScript: ```typescript function minDistance(word1: string, word2: string): number { @@ -373,7 +375,7 @@ function minDistance(word1: string, word2: string): number { }; ``` -C: +### C: ```c @@ -405,3 +407,4 @@ int minDistance(char * word1, char * word2){ + diff --git "a/problems/0115.\344\270\215\345\220\214\347\232\204\345\255\220\345\272\217\345\210\227.md" "b/problems/0115.\344\270\215\345\220\214\347\232\204\345\255\220\345\272\217\345\210\227.md" index 8c82880d58..d925c5dede 100644 --- "a/problems/0115.\344\270\215\345\220\214\347\232\204\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0115.\344\270\215\345\220\214\347\232\204\345\255\220\345\272\217\345\210\227.md" @@ -157,8 +157,8 @@ public: ## 其他语言版本 +### Java: -Java: ```java class Solution { public int numDistinct(String s, String t) { @@ -182,7 +182,8 @@ class Solution { } ``` -Python: +### Python: + ```python class Solution: def numDistinct(self, s: str, t: str) -> int: @@ -200,7 +201,8 @@ class Solution: return dp[-1][-1] ``` -Python3: +### Python3: + ```python class SolutionDP2: """ @@ -234,7 +236,8 @@ class SolutionDP2: return dp[-1] ``` -Go: +### Go: + ```go func numDistinct(s string, t string) int { dp:= make([][]int,len(s)+1) @@ -259,8 +262,8 @@ func numDistinct(s string, t string) int { } ``` +### Javascript: -Javascript: ```javascript const numDistinct = (s, t) => { let dp = Array.from(Array(s.length + 1), () => Array(t.length +1).fill(0)); @@ -283,7 +286,7 @@ const numDistinct = (s, t) => { }; ``` -TypeScript: +### TypeScript: ```typescript function numDistinct(s: string, t: string): number { @@ -312,9 +315,8 @@ function numDistinct(s: string, t: string): number { ``` - -

+ diff --git "a/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" "b/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" index 48d15b0ba9..505a4e33ee 100644 --- "a/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" +++ "b/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" @@ -17,9 +17,9 @@ * 解释: 第一步将"sea"变为"ea",第二步将"eat"变为"ea" -# 算法公开课 +## 算法公开课 -**《代码随想录》算法视频公开课:[动态规划之子序列,还是为了编辑距离做铺垫 | LeetCode:583.两个字符串的删除操(https://www.bilibili.com/video/BV1we4y157wB/),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[LeetCode:583.两个字符串的删除操](https://www.bilibili.com/video/BV1we4y157wB/),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 ## 思路 @@ -143,8 +143,8 @@ public: ## 其他语言版本 +### Java: -Java: ```java // dp数组中存储word1和word2最长相同子序列的长度 class Solution { @@ -215,8 +215,8 @@ class Solution { } ``` +### Python: -Python: ```python class Solution: def minDistance(self, word1: str, word2: str) -> int: @@ -234,7 +234,8 @@ class Solution: return dp[-1][-1] ``` -Go: +### Go: + ```go func minDistance(word1 string, word2 string) int { dp := make([][]int, len(word1)+1) @@ -267,7 +268,8 @@ func min(a, b int) int { return b } ``` -Javascript: +### Javascript: + ```javascript // 方法一 var minDistance = (word1, word2) => { @@ -309,7 +311,7 @@ var minDistance = function (word1, word2) { }; ``` -TypeScript: +### TypeScript: > dp版本一: diff --git "a/problems/\344\270\272\344\272\206\347\273\235\346\235\200\347\274\226\350\276\221\350\267\235\347\246\273\357\274\214\345\215\241\345\260\224\345\201\232\344\272\206\344\270\211\346\255\245\351\223\272\345\236\253.md" "b/problems/\344\270\272\344\272\206\347\273\235\346\235\200\347\274\226\350\276\221\350\267\235\347\246\273\357\274\214\345\215\241\345\260\224\345\201\232\344\272\206\344\270\211\346\255\245\351\223\272\345\236\253.md" index b8adffc775..50287ce20b 100644 --- "a/problems/\344\270\272\344\272\206\347\273\235\346\235\200\347\274\226\350\276\221\350\267\235\347\246\273\357\274\214\345\215\241\345\260\224\345\201\232\344\272\206\344\270\211\346\255\245\351\223\272\345\236\253.md" +++ "b/problems/\344\270\272\344\272\206\347\273\235\346\235\200\347\274\226\350\276\221\350\267\235\347\246\273\357\274\214\345\215\241\345\260\224\345\201\232\344\272\206\344\270\211\346\255\245\351\223\272\345\236\253.md" @@ -163,8 +163,8 @@ else { ## 其他语言版本 +### Java: -Java: ```java class Solution { public int minDistance(String word1, String word2) { @@ -193,11 +193,6 @@ class Solution { } ``` -Python: - - -Go: - @@ -205,3 +200,4 @@ Go: + From 4760924db0d9d5f53719ed36fe0b3d201cfb3c6f Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Wed, 26 Jul 2023 16:25:35 +0800 Subject: [PATCH 2168/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200516.=E6=9C=80?= =?UTF-8?q?=E9=95=BF=E5=9B=9E=E6=96=87=E5=AD=90=E5=BA=8F=E5=88=97=200647.?= =?UTF-8?q?=E5=9B=9E=E6=96=87=E5=AD=90=E4=B8=B2=20=E5=8A=A8=E6=80=81?= =?UTF-8?q?=E8=A7=84=E5=88=92=E6=80=BB=E7=BB=93=20=E6=8E=92=E7=89=88?= =?UTF-8?q?=E6=A0=BC=E5=BC=8F=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...07\345\255\220\345\272\217\345\210\227.md" | 13 ++++++------ ...36\346\226\207\345\255\220\344\270\262.md" | 21 ++++++++++++------- ...22\346\200\273\347\273\223\347\257\207.md" | 1 + 3 files changed, 20 insertions(+), 15 deletions(-) diff --git "a/problems/0516.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\345\272\217\345\210\227.md" "b/problems/0516.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\345\272\217\345\210\227.md" index fcdd57b0f4..8092758389 100644 --- "a/problems/0516.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0516.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\345\272\217\345\210\227.md" @@ -152,8 +152,7 @@ public: ## 其他语言版本 - -Java: +### Java: ```java public class Solution { @@ -175,8 +174,7 @@ public class Solution { } ``` - -Python: +### Python: ```python class Solution: @@ -193,7 +191,7 @@ class Solution: return dp[0][-1] ``` -Go: +### Go: ```Go func longestPalindromeSubseq(s string) int { @@ -222,7 +220,7 @@ func longestPalindromeSubseq(s string) int { } ``` -Javascript: +### Javascript: ```javascript const longestPalindromeSubseq = (s) => { @@ -247,7 +245,7 @@ const longestPalindromeSubseq = (s) => { }; ``` -TypeScript: +### TypeScript: ```typescript function longestPalindromeSubseq(s: string): number { @@ -281,3 +279,4 @@ function longestPalindromeSubseq(s: string): number { + diff --git "a/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" "b/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" index 084b9f74e6..fdf83736a0 100644 --- "a/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" +++ "b/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" @@ -26,11 +26,13 @@ 提示:输入的字符串长度不会超过 1000 。 -## 暴力解法 +## 思路 + +### 暴力解法 两层for循环,遍历区间起始位置和终止位置,然后还需要一层遍历判断这个区间是不是回文。所以时间复杂度:O(n^3) -## 动态规划 +### 动态规划 动规五部曲: @@ -187,7 +189,7 @@ public: * 时间复杂度:O(n^2) * 空间复杂度:O(n^2) -## 双指针法 +### 双指针法 动态规划的空间复杂度是偏高的,我们再看一下双指针法。 @@ -231,7 +233,7 @@ public: ## 其他语言版本 -Java: +### Java: 动态规划: @@ -337,7 +339,7 @@ class Solution { } ``` -Python: +### Python: > 动态规划: ```python @@ -390,7 +392,8 @@ class Solution: return res ``` -Go: +### Go: + ```Go func countSubstrings(s string) int { res:=0 @@ -416,7 +419,8 @@ func countSubstrings(s string) int { } ``` -Javascript +### Javascript: + > 动态规划 ```javascript const countSubstrings = (s) => { @@ -462,7 +466,7 @@ const countSubstrings = (s) => { } ``` -TypeScript: +### TypeScript: > 动态规划: @@ -524,3 +528,4 @@ function expandRange(s: string, left: number, right: number): number { + diff --git "a/problems/\345\212\250\346\200\201\350\247\204\345\210\222\346\200\273\347\273\223\347\257\207.md" "b/problems/\345\212\250\346\200\201\350\247\204\345\210\222\346\200\273\347\273\223\347\257\207.md" index 8a1531f8be..c86376d349 100644 --- "a/problems/\345\212\250\346\200\201\350\247\204\345\210\222\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/\345\212\250\346\200\201\350\247\204\345\210\222\346\200\273\347\273\223\347\257\207.md" @@ -136,3 +136,4 @@ + From b3d1a88fde09afa258b64812cf776674a024c534 Mon Sep 17 00:00:00 2001 From: Zhipeng Xu Date: Sat, 8 Jul 2023 20:38:47 +0800 Subject: [PATCH 2169/3019] =?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 --- ...4\345\244\247\345\205\203\347\264\240II.md" | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git "a/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" "b/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" index 3fd4b3b6db..a090f32c3e 100644 --- "a/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" +++ "b/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" @@ -266,6 +266,24 @@ function nextGreaterElements(nums: number[]): number[] { }; ``` +Rust +```rust +impl Solution { + pub fn next_greater_elements(nums: Vec) -> Vec { + let mut ans = vec![-1; nums.len() * 2]; + let mut stack = vec![]; + let double = nums.repeat(2); + for (idx, &i) in double.iter().enumerate() { + while !stack.is_empty() && double[*stack.last().unwrap()] < i { + let pos = stack.pop().unwrap(); + ans[pos] = i; + } + stack.push(idx); + } + ans.into_iter().take(nums.len()).collect() + } +} +```

From f3f549d317113718f61509a85937853d3a81a7f7 Mon Sep 17 00:00:00 2001 From: Zhipeng Xu Date: Sat, 8 Jul 2023 22:13:12 +0800 Subject: [PATCH 2170/3019] =?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 --- ...2.\346\216\245\351\233\250\346\260\264.md" | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git "a/problems/0042.\346\216\245\351\233\250\346\260\264.md" "b/problems/0042.\346\216\245\351\233\250\346\260\264.md" index db66095da2..833a7613e2 100644 --- "a/problems/0042.\346\216\245\351\233\250\346\260\264.md" +++ "b/problems/0042.\346\216\245\351\233\250\346\260\264.md" @@ -926,6 +926,56 @@ int trap(int* height, int heightSize) { * 空间复杂度 O(1) +Rust + +双指针 + +```rust +impl Solution { + pub fn trap(height: Vec) -> i32 { + let n = height.len(); + let mut max_left = vec![0; height.len()]; + let mut max_right = vec![0; height.len()]; + max_left.iter_mut().zip(max_right.iter_mut().rev()).enumerate().fold((0, 0), |(lm, rm), (idx, (x, y))| { + let lmax = lm.max(height[idx]); + let rmax = rm.max(height[n - 1 - idx]); + *x = lmax; *y = rmax; + (lmax, rmax) + }); + height.iter().enumerate().fold(0, |acc, (idx, x)| { + let h = max_left[idx].min(max_right[idx]); + if h > 0 { h - x + acc } else { acc } + }) + } +} +``` + +单调栈 + +```rust +impl Solution { + pub fn trap(height: Vec) -> i32 { + let mut stack = vec![]; + let mut ans = 0; + for (right_pos, &right_h) in height.iter().enumerate() { + while !stack.is_empty() && height[*stack.last().unwrap()] <= right_h { + let mid_pos = stack.pop().unwrap(); + if !stack.is_empty() { + let left_pos = *stack.last().unwrap(); + let left_h = height[left_pos]; + let top = std::cmp::min(left_h, right_h); + if top > height[mid_pos] { + ans += (top - height[mid_pos]) * (right_pos - left_pos - 1) as i32; + } + } + } + stack.push(right_pos); + } + ans + } +} +``` +

From 7aa2a3efea391bc30047c31d17b179fcdb99221d Mon Sep 17 00:00:00 2001 From: Zhipeng Xu Date: Sun, 9 Jul 2023 14:30:01 +0800 Subject: [PATCH 2171/3019] =?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 --- ...47\347\232\204\347\237\251\345\275\242.md" | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git "a/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" "b/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" index f9a8350818..bc82a860cc 100644 --- "a/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" +++ "b/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" @@ -670,6 +670,61 @@ function largestRectangleArea(heights: number[]): number { ``` +Rust + +双指针预处理 +```rust + +impl Solution { + pub fn largest_rectangle_area(v: Vec) -> i32 { + let n = v.len(); + let mut left_smaller_idx = vec![-1; n]; + let mut right_smaller_idx = vec![n as i32; n]; + for i in 1..n { + let mut mid = i as i32 - 1; + while mid >= 0 && v[mid as usize] >= v[i] { + mid = left_smaller_idx[mid as usize]; + } + left_smaller_idx[i] = mid; + } + for i in (0..n-1).rev() { + let mut mid = i + 1; + while mid < n && v[mid] >= v[i] { + mid = right_smaller_idx[mid] as usize; + } + right_smaller_idx[i] = mid as i32; + } + let mut res = 0; + for (idx, &e) in v.iter().enumerate() { + res = res.max((right_smaller_idx[idx] - left_smaller_idx[idx] - 1) * e); + } + dbg!(res) + } +} +``` + +单调栈 +```rust +impl Solution { + pub fn largest_rectangle_area1(mut v: Vec) -> i32 { + v.insert(0, 0); // 便于使第一个元素能够有左侧<=它的值 + v.push(0); // 便于在结束处理最后一个元素后清空残留在栈中的值 + let mut res = 0; + let mut stack = vec![]; // 递增的栈 + for (idx, &e) in v.iter().enumerate() { + while !stack.is_empty() && v[*stack.last().unwrap()] > e { + let pos = stack.pop().unwrap(); + let prev_pos = *stack.last().unwrap(); + let s = (idx - prev_pos - 1) as i32 * v[pos]; + res = res.max(s); + } + stack.push(idx); + } + res + } +} +``` +

From 0dc6bb5669981d25069fc338566e73b3a8e97828 Mon Sep 17 00:00:00 2001 From: han Date: Tue, 25 Jul 2023 16:24:55 +0800 Subject: [PATCH 2172/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A059.=E8=9E=BA?= =?UTF-8?q?=E6=97=8B=E7=9F=A9=E9=98=B5II=20Ruby=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\346\227\213\347\237\251\351\230\265II.md" | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git "a/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" "b/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" index f03fcdad35..73e9e4daea 100644 --- "a/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" +++ "b/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" @@ -688,6 +688,58 @@ public class Solution { } ``` +### Ruby#: +```ruby +def generate_matrix(n) + result = Array.new(n) { Array.new(n, 0) } + #循环次数 + loop_times = 0 + #步长 + step = n - 1 + val = 1 + + + while loop_times < n / 2 + #模拟从左向右 + for i in 0..step - 1 + #行数不变,列数变 + result[loop_times][i+loop_times] = val + val += 1 + end + + #模拟从上到下 + for i in 0..step - 1 + #列数不变,行数变 + result[i+loop_times][n-loop_times-1] = val + val += 1 + end + + #模拟从右到左 + for i in 0..step - 1 + #行数不变,列数变 + result[n-loop_times-1][n-loop_times-i-1] = val + val += 1 + end + + #模拟从下到上 + for i in 0..step - 1 + #列数不变,行数变 + result[n-loop_times-i-1][loop_times] = val + val += 1 + end + + loop_times += 1 + step -= 2 + end + + #如果是奇数,则填充最后一个元素 + result[n/2][n/2] = n**2 if n % 2 + + return result + +end +``` +

From 3933b49cb36eaacb1fca0d40861386722b32347e Mon Sep 17 00:00:00 2001 From: han Date: Wed, 26 Jul 2023 17:21:15 +0800 Subject: [PATCH 2173/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A01002.=E6=9F=A5?= =?UTF-8?q?=E6=89=BE=E5=B8=B8=E7=94=A8=E5=AD=97=E7=AC=A6=20Ruby=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...70\347\224\250\345\255\227\347\254\246.md" | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git "a/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md" "b/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md" index a53148b313..81b07b3943 100644 --- "a/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md" +++ "b/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md" @@ -518,6 +518,54 @@ impl Solution { } ``` +Ruby: +```ruby +def common_chars(words) + result = [] + #统计所有字符串里字符出现的最小频率 + hash = {} + #初始化标识 + is_first = true + + words.each do |word| + #记录共同字符 + chars = [] + word.split('').each do |chr| + #第一个字符串初始化 + if is_first + chars << chr + else + #字母之前出现过的最小次数 + if hash[chr] != nil && hash[chr] > 0 + hash[chr] -= 1 + chars << chr + end + end + end + + is_first = false + #清除hash,更新字符最小频率 + hash.clear + chars.each do |chr| + if hash[chr] != nil + hash[chr] += 1 + else + hash[chr] = 1 + end + end + end + + #字符最小频率hash转换为字符数组 + hash.keys.each do |key| + for i in 0..hash[key] - 1 + result << key + end + end + + return result +end +``` +

From 3f0966382e37245b96e7967f95e725f37c2cbdc6 Mon Sep 17 00:00:00 2001 From: leslieCHUENGT <1278207976@qq.com> Date: Thu, 27 Jul 2023 09:56:18 +0800 Subject: [PATCH 2174/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A00463=E5=B2=9B?= =?UTF-8?q?=E5=B1=BF=E7=9A=84=E5=91=A8=E9=95=BF=20TypeScript=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...77\347\232\204\345\221\250\351\225\277.md" | 98 +++++++++++++++++++ 1 file changed, 98 insertions(+) diff --git "a/problems/0463.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" "b/problems/0463.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" index 18f1d01eb2..35b89dcf87 100644 --- "a/problems/0463.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" +++ "b/problems/0463.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" @@ -300,6 +300,104 @@ var islandPerimeter = function(grid) { }; ``` +TypeScript: + +```typescript +/** + * 方法一:深度优先搜索(DFS) + * @param grid 二维网格地图,其中 grid[i][j] = 1 表示陆地, grid[i][j] = 0 表示水域 + * @returns 岛屿的周长 + */ +function islandPerimeter(grid: number[][]): number { + // 处理特殊情况:网格为空或行列数为 0,直接返回 0 + if (!grid || grid.length === 0 || grid[0].length === 0) { + return 0; + } + + // 获取网格的行数和列数 + const rows = grid.length; + const cols = grid[0].length; + let perimeter = 0; // 岛屿的周长 + + /** + * 深度优先搜索函数 + * @param i 当前格子的行索引 + * @param j 当前格子的列索引 + */ + const dfs = (i: number, j: number) => { + // 如果当前位置超出网格范围,或者当前位置是水域(grid[i][j] === 0),则周长增加1 + if (i < 0 || i >= rows || j < 0 || j >= cols || grid[i][j] === 0) { + perimeter++; + return; + } + + // 如果当前位置已经访问过(grid[i][j] === -1),则直接返回 + if (grid[i][j] === -1) { + return; + } + + // 标记当前位置为已访问(-1),避免重复计算 + grid[i][j] = -1; + + // 继续搜索上、下、左、右四个方向 + dfs(i + 1, j); + dfs(i - 1, j); + dfs(i, j + 1); + dfs(i, j - 1); + }; + + // 遍历整个网格,找到第一个陆地格子(grid[i][j] === 1),并以此为起点进行深度优先搜索 + for (let i = 0; i < rows; i++) { + for (let j = 0; j < cols; j++) { + if (grid[i][j] === 1) { + dfs(i, j); + break; + } + } + } + + return perimeter; +} + +/** + * 方法二:遍历每个陆地格子,统计周长 + * @param grid 二维网格地图,其中 grid[i][j] = 1 表示陆地, grid[i][j] = 0 表示水域 + * @returns 岛屿的周长 + */ +function islandPerimeter(grid: number[][]): number { + // 处理特殊情况:网格为空或行列数为 0,直接返回 0 + if (!grid || grid.length === 0 || grid[0].length === 0) { + return 0; + } + + // 获取网格的行数和列数 + const rows = grid.length; + const cols = grid[0].length; + let perimeter = 0; // 岛屿的周长 + + // 遍历整个网格 + for (let i = 0; i < rows; i++) { + for (let j = 0; j < cols; j++) { + // 如果当前格子是陆地(grid[i][j] === 1) + if (grid[i][j] === 1) { + perimeter += 4; // 周长先加上4个边 + + // 判断当前格子的上方是否也是陆地,如果是,则周长减去2个边 + if (i > 0 && grid[i - 1][j] === 1) { + perimeter -= 2; + } + + // 判断当前格子的左方是否也是陆地,如果是,则周长减去2个边 + if (j > 0 && grid[i][j - 1] === 1) { + perimeter -= 2; + } + } + } + } + + return perimeter; +} +```

From 7c9fcfe09d91fa4e5bc66ee6ab16fac7446426e0 Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Thu, 27 Jul 2023 14:12:11 +0800 Subject: [PATCH 2175/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20=E6=97=B6?= =?UTF-8?q?=E9=97=B4=E5=A4=8D=E6=9D=82=E5=BA=A6=20O(n)=E8=B6=85=E6=97=B6?= =?UTF-8?q?=20=E6=8B=8D=E7=89=88=E6=A0=BC=E5=BC=8F=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...57\345\244\232\345\244\247\357\274\237.md" | 22 +++++-------------- ...50\350\277\231\351\207\214\357\274\201.md" | 16 ++++---------- 2 files changed, 10 insertions(+), 28 deletions(-) diff --git "a/problems/O(n)\347\232\204\347\256\227\346\263\225\345\261\205\347\204\266\350\266\205\346\227\266\344\272\206\357\274\214\346\255\244\346\227\266\347\232\204n\347\251\266\347\253\237\346\230\257\345\244\232\345\244\247\357\274\237.md" "b/problems/O(n)\347\232\204\347\256\227\346\263\225\345\261\205\347\204\266\350\266\205\346\227\266\344\272\206\357\274\214\346\255\244\346\227\266\347\232\204n\347\251\266\347\253\237\346\230\257\345\244\232\345\244\247\357\274\237.md" index a488c0bad4..8be48f38c2 100644 --- "a/problems/O(n)\347\232\204\347\256\227\346\263\225\345\261\205\347\204\266\350\266\205\346\227\266\344\272\206\357\274\214\346\255\244\346\227\266\347\232\204n\347\251\266\347\253\237\346\230\257\345\244\232\345\244\247\357\274\237.md" +++ "b/problems/O(n)\347\232\204\347\256\227\346\263\225\345\261\205\347\204\266\350\266\205\346\227\266\344\272\206\357\274\214\346\255\244\346\227\266\347\232\204n\347\251\266\347\253\237\346\230\257\345\244\232\345\244\247\357\274\237.md" @@ -13,7 +13,7 @@ 计算机究竟1s可以执行多少次操作呢? 接下来探讨一下这个问题。 -# 超时是怎么回事 +## 超时是怎么回事 ![程序超时](https://code-thinking-1253855093.file.myqcloud.com/pics/20200729112716117.png) @@ -25,7 +25,7 @@ 如果n的规模已经足够让O(n)的算法运行时间超过了1s,就应该考虑log(n)的解法了。 -# 从硬件配置看计算机的性能 +## 从硬件配置看计算机的性能 计算机的运算速度主要看CPU的配置,以2015年MacPro为例,CPU配置:2.7 GHz Dual-Core Intel Core i5 。 @@ -44,7 +44,7 @@ 所以我们的程序在计算机上究竟1s真正能执行多少次操作呢? -# 做个测试实验 +## 做个测试实验 在写测试程序测1s内处理多大数量级数据的时候,有三点需要注意: @@ -155,7 +155,7 @@ O(nlogn)的算法,1s内大概计算机可以运行 2 * (10^7)次计算,符 至于O(log n)和O(n^3) 等等这些时间复杂度在1s内可以处理的多大的数据规模,大家可以自己写一写代码去测一下了。 -# 完整测试代码 +## 完整测试代码 ```CPP #include @@ -212,7 +212,7 @@ int main() { ``` -# 总结 +## 总结 本文详细分析了在leetcode上做题程序为什么会有超时,以及从硬件配置上大体知道CPU的执行速度,然后亲自做一个实验来看看O(n)的算法,跑一秒钟,这个n究竟是做大,最后给出不同时间复杂度,一秒内可以运算出来的n的大小。 @@ -220,17 +220,6 @@ int main() { 这样,大家应该对程序超时时候的数据规模有一个整体的认识了。 -## 其他语言版本 - - -Java: - - -Python: - - -Go: - @@ -238,3 +227,4 @@ Go: + diff --git "a/problems/\345\205\263\344\272\216\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\214\344\275\240\344\270\215\347\237\245\351\201\223\347\232\204\351\203\275\345\234\250\350\277\231\351\207\214\357\274\201.md" "b/problems/\345\205\263\344\272\216\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\214\344\275\240\344\270\215\347\237\245\351\201\223\347\232\204\351\203\275\345\234\250\350\277\231\351\207\214\357\274\201.md" index c479dddc67..95c7567c75 100644 --- "a/problems/\345\205\263\344\272\216\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\214\344\275\240\344\270\215\347\237\245\351\201\223\347\232\204\351\203\275\345\234\250\350\277\231\351\207\214\357\274\201.md" +++ "b/problems/\345\205\263\344\272\216\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\214\344\275\240\344\270\215\347\237\245\351\201\223\347\232\204\351\203\275\345\234\250\350\277\231\351\207\214\357\274\201.md" @@ -8,6 +8,8 @@ 所以重新整理的时间复杂度文章,正式和大家见面啦! +# 时间复杂度 + ## 究竟什么是时间复杂度 **时间复杂度是一个函数,它定性描述该算法的运行时间**。 @@ -145,7 +147,7 @@ O(2 × n^2 + 10 × n + 1000) < O(3 × n^2),所以说最后省略掉常数项 **当然这不是这道题目的最优解,我仅仅是用这道题目来讲解一下时间复杂度**。 -# 总结 +## 总结 本篇讲解了什么是时间复杂度,复杂度是用来干什么,以及数据规模对时间复杂度的影响。 @@ -157,17 +159,6 @@ O(2 × n^2 + 10 × n + 1000) < O(3 × n^2),所以说最后省略掉常数项 如果感觉「代码随想录」很不错,赶快推荐给身边的朋友同学们吧,他们发现和「代码随想录」相见恨晚! -## 其他语言版本 - - -Java: - - -Python: - - -Go: - @@ -175,3 +166,4 @@ Go: + From e0c5da76e6a616a1cf3da18059c59947a90f877d Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Thu, 27 Jul 2023 14:18:47 +0800 Subject: [PATCH 2176/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20=E5=8D=95?= =?UTF-8?q?=E8=B0=83=E6=A0=88=E7=B3=BB=E5=88=97=E9=A2=98=E7=9B=AE=20?= =?UTF-8?q?=E6=8E=92=E7=89=88=E6=A0=BC=E5=BC=8F=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...2.\346\216\245\351\233\250\346\260\264.md" | 20 +++++++-------- ...47\347\232\204\347\237\251\345\275\242.md" | 25 ++++++++++--------- ...4\345\244\247\345\205\203\347\264\240I.md" | 17 +++++++------ ...\345\244\247\345\205\203\347\264\240II.md" | 19 ++++++++------ ...17\346\227\245\346\270\251\345\272\246.md" | 15 +++++------ 5 files changed, 53 insertions(+), 43 deletions(-) diff --git "a/problems/0042.\346\216\245\351\233\250\346\260\264.md" "b/problems/0042.\346\216\245\351\233\250\346\260\264.md" index 833a7613e2..4f0682ba6f 100644 --- "a/problems/0042.\346\216\245\351\233\250\346\260\264.md" +++ "b/problems/0042.\346\216\245\351\233\250\346\260\264.md" @@ -29,7 +29,7 @@ * 输出:9 -# 思路 +## 思路 接雨水问题在面试中还是常见题目的,有必要好好讲一讲。 @@ -39,7 +39,7 @@ * 动态规划 * 单调栈 -## 暴力解法 +### 暴力解法 本题暴力解法也是也是使用双指针。 @@ -137,7 +137,7 @@ public: 力扣后面修改了后台测试数据,所以以上暴力解法超时了。 -## 双指针优化 +### 双指针优化 在暴力解法中,我们可以看到只要记录左边柱子的最高高度 和 右边柱子的最高高度,就可以计算当前位置的雨水面积,这就是通过列来计算。 @@ -184,7 +184,7 @@ public: }; ``` -## 单调栈解法 +### 单调栈解法 关于单调栈的理论基础,单调栈适合解决什么问题,单调栈的工作过程,大家可以先看这题讲解 [739. 每日温度](https://programmercarl.com/0739.每日温度.html)。 @@ -194,7 +194,7 @@ public: 而接雨水这道题目,我们正需要寻找一个元素,右边最大元素以及左边最大元素,来计算雨水面积。 -### 准备工作 +#### 准备工作 那么本题使用单调栈有如下几个问题: @@ -248,7 +248,7 @@ stack st; // 存着下标,计算的时候用下标对应的柱子高度 明确了如上几点,我们再来看处理逻辑。 -### 单调栈处理逻辑 +#### 单调栈处理逻辑 以下操作过程其实和 [739. 每日温度](https://programmercarl.com/0739.每日温度.html) 也是一样的,建议先做 [739. 每日温度](https://programmercarl.com/0739.每日温度.html)。 @@ -596,7 +596,7 @@ class Solution: ``` -### Go +### Go: ```go func trap(height []int) int { @@ -802,7 +802,7 @@ var trap = function(height) { }; ``` -### TypeScript +### TypeScript: 暴力解法: @@ -925,8 +925,7 @@ int trap(int* height, int heightSize) { * 时间复杂度 O(n) * 空间复杂度 O(1) - -Rust +### Rust: 双指针 @@ -980,3 +979,4 @@ impl Solution { + diff --git "a/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" "b/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" index bc82a860cc..4d949941cb 100644 --- "a/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" +++ "b/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" @@ -20,7 +20,7 @@ * 1 <= heights.length <=10^5 * 0 <= heights[i] <= 10^4 -# 思路 +## 思路 本题和[42. 接雨水](https://programmercarl.com/0042.接雨水.html),是遥相呼应的两道题目,建议都要仔细做一做,原理上有很多相同的地方,但细节上又有差异,更可以加深对单调栈的理解! @@ -28,7 +28,7 @@ 我们先来看一下暴力解法的解法: -## 暴力解法 +### 暴力解法 ```CPP class Solution { @@ -55,7 +55,7 @@ public: 如上代码并不能通过leetcode,超时了,因为时间复杂度是$O(n^2)$。 -## 双指针解法 +### 双指针解法 本题双指针的写法整体思路和[42. 接雨水](https://programmercarl.com/0042.接雨水.html)是一致的,但要比[42. 接雨水](https://programmercarl.com/0042.接雨水.html)难一些。 @@ -98,7 +98,7 @@ public: }; ``` -## 单调栈 +### 单调栈 本地单调栈的解法和接雨水的题目是遥相呼应的。 @@ -169,7 +169,7 @@ public: } }; -``` +``` 细心的录友会发现,我在 height数组上后,都加了一个元素0, 为什么这么做呢? @@ -229,7 +229,7 @@ public: ## 其他语言版本 -Java: +### Java: 暴力解法: ```java @@ -335,7 +335,7 @@ class Solution { } ``` -Python3: +### Python3: ```python @@ -468,7 +468,7 @@ class Solution: ``` -Go: +### Go: > 单调栈 @@ -506,7 +506,8 @@ func largestRectangleArea(heights []int) int { ``` -JavaScript: +### JavaScript: + ```javascript //双指针 js中运行速度最快 var largestRectangleArea = function(heights) { @@ -581,7 +582,7 @@ var largestRectangleArea = function(heights) { return maxArea; }; ``` -TypeScript: +### TypeScript: > 暴力法(会超时): @@ -669,8 +670,7 @@ function largestRectangleArea(heights: number[]): number { }; ``` - -Rust +### Rust: 双指针预处理 ```rust @@ -730,3 +730,4 @@ impl Solution { + diff --git "a/problems/0496.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240I.md" "b/problems/0496.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240I.md" index 411a47df9b..6bcafafba2 100644 --- "a/problems/0496.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240I.md" +++ "b/problems/0496.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240I.md" @@ -37,7 +37,7 @@ nums1 中数字 x 的下一个更大元素是指 x 在 nums2 中对应位 * nums1和nums2中所有整数 互不相同 * nums1 中的所有整数同样出现在 nums2 中 -# 思路 +## 思路 做本题之前,建议先做一下[739. 每日温度](https://programmercarl.com/0739.每日温度.html) @@ -191,7 +191,8 @@ public: 建议大家把情况一二三想清楚了,先写出版本一的代码,然后在其基础上在做精简! ## 其他语言版本 -Java +### Java + ```java class Solution { public int[] nextGreaterElement(int[] nums1, int[] nums2) { @@ -248,7 +249,8 @@ class Solution { } } ``` -Python3: +### Python3 + ```python class Solution: def nextGreaterElement(self, nums1: List[int], nums2: List[int]) -> List[int]: @@ -269,7 +271,7 @@ class Solution: return result ``` -Go: +### Go > 未精简版本 ```go @@ -335,7 +337,7 @@ func nextGreaterElement(nums1 []int, nums2 []int) []int { } ``` -JavaScript: +### JavaScript ```JS var nextGreaterElement = function (nums1, nums2) { @@ -358,7 +360,7 @@ var nextGreaterElement = function (nums1, nums2) { }; ``` -TypeScript: +### TypeScript ```typescript function nextGreaterElement(nums1: number[], nums2: number[]): number[] { @@ -387,7 +389,7 @@ function nextGreaterElement(nums1: number[], nums2: number[]): number[] { }; ``` -Rust +### Rust ```rust impl Solution { @@ -419,3 +421,4 @@ impl Solution { + diff --git "a/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" "b/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" index a090f32c3e..023e4d7e0e 100644 --- "a/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" +++ "b/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" @@ -22,7 +22,7 @@ * -10^9 <= nums[i] <= 10^9 -# 思路 +## 思路 做本题之前建议先做[739. 每日温度](https://programmercarl.com/0739.每日温度.html) 和 [496.下一个更大元素 I](https://programmercarl.com/0496.下一个更大元素I.html)。 @@ -138,7 +138,8 @@ public: ## 其他语言版本 -Java: +### Java: + ```Java class Solution { public int[] nextGreaterElements(int[] nums) { @@ -162,7 +163,8 @@ class Solution { } ``` -Python: +### Python: + ```python # 方法 1: class Solution: @@ -196,7 +198,8 @@ class Solution: stack.append(i) return ans ``` -Go: +### Go: + ```go func nextGreaterElements(nums []int) []int { length := len(nums) @@ -218,7 +221,7 @@ func nextGreaterElements(nums []int) []int { } ``` -JavaScript: +### JavaScript: ```JS /** @@ -242,7 +245,7 @@ var nextGreaterElements = function (nums) { return res; }; ``` -TypeScript: +### TypeScript: ```typescript function nextGreaterElements(nums: number[]): number[] { @@ -266,7 +269,8 @@ function nextGreaterElements(nums: number[]): number[] { }; ``` -Rust +### Rust: + ```rust impl Solution { pub fn next_greater_elements(nums: Vec) -> Vec { @@ -290,3 +294,4 @@ impl Solution { + diff --git "a/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" "b/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" index d2da37371a..fc1a80631c 100644 --- "a/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" +++ "b/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" @@ -211,8 +211,7 @@ public: ## 其他语言版本 - -Java: +### Java: ```java class Solution { @@ -270,7 +269,8 @@ class Solution { } ``` -Python: +### Python: + > 未精简版本 ```python @@ -307,7 +307,7 @@ class Solution: return answer ``` -Go: +### Go: > 暴力法 @@ -384,7 +384,7 @@ func dailyTemperatures(num []int) []int { } ``` -JavaScript: +### JavaScript: ```javascript // 版本一 @@ -429,7 +429,7 @@ var dailyTemperatures = function(temperatures) { }; ``` -TypeScript: +### TypeScript: > 精简版: @@ -455,7 +455,7 @@ function dailyTemperatures(temperatures: number[]): number[] { }; ``` -Rust: +### Rust: ```rust impl Solution { @@ -482,3 +482,4 @@ impl Solution { + From dc9fb7cb0bc7bff583e66bf3e3699af961f60a8c Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Thu, 27 Jul 2023 14:28:14 +0800 Subject: [PATCH 2177/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20=E6=95=B0?= =?UTF-8?q?=E7=BB=84=E9=A2=9D=E5=A4=96=E9=A2=98=E7=9B=AE=20=E6=8E=92?= =?UTF-8?q?=E7=89=88=E6=A0=BC=E5=BC=8F=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...13\350\275\254\346\225\260\347\273\204.md" | 15 ++++++------- ...3.\347\247\273\345\212\250\351\233\266.md" | 21 +++++++++---------- ...\345\272\217\346\225\260\347\273\204II.md" | 3 +-- ...61\350\204\211\346\225\260\347\273\204.md" | 17 ++++++++------- ...72\347\216\260\346\254\241\346\225\260.md" | 16 +++++++------- ...27\347\232\204\346\225\260\345\255\227.md" | 17 ++++++++------- 6 files changed, 46 insertions(+), 43 deletions(-) diff --git "a/problems/0189.\346\227\213\350\275\254\346\225\260\347\273\204.md" "b/problems/0189.\346\227\213\350\275\254\346\225\260\347\273\204.md" index 3581969439..d60612e92b 100644 --- "a/problems/0189.\346\227\213\350\275\254\346\225\260\347\273\204.md" +++ "b/problems/0189.\346\227\213\350\275\254\346\225\260\347\273\204.md" @@ -33,7 +33,7 @@ 向右旋转 2 步: [3,99,-1,-100]。 -# 思路 +## 思路 这道题目在字符串里其实很常见,我把字符串反转相关的题目列一下: @@ -83,9 +83,9 @@ public: ``` -# 其他语言版本 +## 其他语言版本 -## Java +### Java ```java class Solution { @@ -106,7 +106,7 @@ class Solution { } ``` -## Python +### Python 方法一:局部翻转 + 整体翻转 ```python @@ -139,7 +139,7 @@ class Solution: # 备注:这个方法会导致空间复杂度变成 O(n) 因为我们要创建一个 copy 数组。但是不失为一种思路。 ``` -## Go +### Go ```go func rotate(nums []int, k int) { @@ -157,7 +157,7 @@ func reverse(nums []int){ } ``` -## JavaScript +### JavaScript ```js var rotate = function (nums, k) { @@ -178,7 +178,7 @@ var rotate = function (nums, k) { }; ``` -## TypeScript +### TypeScript ```typescript function rotate(nums: number[], k: number): void { @@ -205,3 +205,4 @@ function reverseByRange(nums: number[], left: number, right: number): void { + diff --git "a/problems/0283.\347\247\273\345\212\250\351\233\266.md" "b/problems/0283.\347\247\273\345\212\250\351\233\266.md" index 22d6428c10..ee3f429150 100644 --- "a/problems/0283.\347\247\273\345\212\250\351\233\266.md" +++ "b/problems/0283.\347\247\273\345\212\250\351\233\266.md" @@ -3,10 +3,7 @@

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

- -# 动态规划:一样的套路,再求一次完全平方数 - -# 283. 移动零 +# 283. 移动零:动态规划:一样的套路,再求一次完全平方数 [力扣题目链接](https://leetcode.cn/problems/move-zeroes/) @@ -22,7 +19,7 @@ 尽量减少操作次数。 -# 思路 +## 思路 做这道题目之前,大家可以做一做[27.移除元素](https://programmercarl.com/0027.移除元素.html) @@ -58,9 +55,9 @@ public: }; ``` -# 其他语言版本 +## 其他语言版本 -Java: +### Java: ```java public void moveZeroes(int[] nums) { @@ -77,7 +74,7 @@ public void moveZeroes(int[] nums) { } ``` -Python: +### Python: ```python def moveZeroes(self, nums: List[int]) -> None: @@ -100,7 +97,7 @@ Python: fast += 1 ``` -Go: +### Go: ```go func moveZeroes(nums []int) { @@ -116,7 +113,8 @@ func moveZeroes(nums []int) { } ``` -JavaScript: +### JavaScript: + ```javascript var moveZeroes = function(nums) { let slow = 0; @@ -133,7 +131,7 @@ var moveZeroes = function(nums) { }; ``` -TypeScript: +### TypeScript: ```typescript function moveZeroes(nums: number[]): void { @@ -159,3 +157,4 @@ function moveZeroes(nums: number[]): void { + diff --git "a/problems/0922.\346\214\211\345\245\207\345\201\266\346\216\222\345\272\217\346\225\260\347\273\204II.md" "b/problems/0922.\346\214\211\345\245\207\345\201\266\346\216\222\345\272\217\346\225\260\347\273\204II.md" index c4654f16d1..72be8fa732 100644 --- "a/problems/0922.\346\214\211\345\245\207\345\201\266\346\216\222\345\272\217\346\225\260\347\273\204II.md" +++ "b/problems/0922.\346\214\211\345\245\207\345\201\266\346\216\222\345\272\217\346\225\260\347\273\204II.md" @@ -147,8 +147,6 @@ class Solution { } ``` -### java - ```java //方法一:采用额外的数组空间 class Solution { @@ -384,3 +382,4 @@ function sortArrayByParityII(nums: number[]): number[] { + diff --git "a/problems/0941.\346\234\211\346\225\210\347\232\204\345\261\261\350\204\211\346\225\260\347\273\204.md" "b/problems/0941.\346\234\211\346\225\210\347\232\204\345\261\261\350\204\211\346\225\260\347\273\204.md" index f43a210837..48c29eb479 100644 --- "a/problems/0941.\346\234\211\346\225\210\347\232\204\345\261\261\350\204\211\346\225\260\347\273\204.md" +++ "b/problems/0941.\346\234\211\346\225\210\347\232\204\345\261\261\350\204\211\346\225\260\347\273\204.md" @@ -33,7 +33,7 @@ * 输出:true -# 思路 +## 思路 判断是山峰,主要就是要严格的保存左边到中间,和右边到中间是递增的。 @@ -71,9 +71,9 @@ public: 如果想系统学一学双指针的话, 可以看一下这篇[双指针法:总结篇!](https://programmercarl.com/双指针总结.html) -# 其他语言版本 +## 其他语言版本 -## Java +### Java ```java class Solution { @@ -101,7 +101,7 @@ class Solution { } ``` -## Python3 +### Python3 ```python class Solution: @@ -118,7 +118,7 @@ class Solution: ``` -## Go +### Go ```go func validMountainArray(arr []int) bool { @@ -142,7 +142,7 @@ func validMountainArray(arr []int) bool { } ``` -## JavaScript +### JavaScript ```js var validMountainArray = function(arr) { @@ -157,7 +157,7 @@ var validMountainArray = function(arr) { }; ``` -## TypeScript +### TypeScript ```typescript function validMountainArray(arr: number[]): boolean { @@ -177,7 +177,7 @@ function validMountainArray(arr: number[]): boolean { }; ``` -## C# +### C# ```csharp public class Solution { @@ -201,3 +201,4 @@ public class Solution { + diff --git "a/problems/1207.\347\213\254\344\270\200\346\227\240\344\272\214\347\232\204\345\207\272\347\216\260\346\254\241\346\225\260.md" "b/problems/1207.\347\213\254\344\270\200\346\227\240\344\272\214\347\232\204\345\207\272\347\216\260\346\254\241\346\225\260.md" index 1a7a001989..83ebbcb7bc 100644 --- "a/problems/1207.\347\213\254\344\270\200\346\227\240\344\272\214\347\232\204\345\207\272\347\216\260\346\254\241\346\225\260.md" +++ "b/problems/1207.\347\213\254\344\270\200\346\227\240\344\272\214\347\232\204\345\207\272\347\216\260\346\254\241\346\225\260.md" @@ -31,7 +31,7 @@ * -1000 <= arr[i] <= 1000 -# 思路 +## 思路 这道题目数组在是哈希法中的经典应用,如果对数组在哈希法中的使用还不熟悉的同学可以看这两篇:[数组在哈希法中的应用](https://programmercarl.com/0242.有效的字母异位词.html)和[哈希法:383. 赎金信](https://programmercarl.com/0383.赎金信.html) @@ -71,9 +71,9 @@ public: }; ``` -# 其他语言版本 +## 其他语言版本 -Java: +### Java: ```java class Solution { @@ -97,7 +97,8 @@ class Solution { } ``` -Python: +### Python: + ```python # 方法 1: 数组在哈西法的应用 class Solution: @@ -133,10 +134,8 @@ class Solution: ``` +### JavaScript: -Go: - -JavaScript: ``` javascript // 方法一:使用数组记录元素出现次数 var uniqueOccurrences = function(arr) { @@ -171,7 +170,7 @@ var uniqueOccurrences = function(arr) { }; ``` -TypeScript: +### TypeScript: > 借用数组: @@ -209,3 +208,4 @@ function uniqueOccurrences(arr: number[]): boolean { + diff --git "a/problems/1365.\346\234\211\345\244\232\345\260\221\345\260\217\344\272\216\345\275\223\345\211\215\346\225\260\345\255\227\347\232\204\346\225\260\345\255\227.md" "b/problems/1365.\346\234\211\345\244\232\345\260\221\345\260\217\344\272\216\345\275\223\345\211\215\346\225\260\345\255\227\347\232\204\346\225\260\345\255\227.md" index 7c26876957..c706ba216e 100644 --- "a/problems/1365.\346\234\211\345\244\232\345\260\221\345\260\217\344\272\216\345\275\223\345\211\215\346\225\260\345\255\227\347\232\204\346\225\260\345\255\227.md" +++ "b/problems/1365.\346\234\211\345\244\232\345\260\221\345\260\217\344\272\216\345\275\223\345\211\215\346\225\260\345\255\227\347\232\204\346\225\260\345\255\227.md" @@ -39,7 +39,7 @@ * 2 <= nums.length <= 500 * 0 <= nums[i] <= 100 -# 思路 +## 思路 两层for循环暴力查找,时间复杂度明显为$O(n^2)$。 @@ -113,9 +113,9 @@ public: 可以排序之后加哈希,时间复杂度为$O(n\log n)$ -# 其他语言版本 +## 其他语言版本 -Java: +### Java: ```Java public int[] smallerNumbersThanCurrent(int[] nums) { @@ -136,7 +136,8 @@ public int[] smallerNumbersThanCurrent(int[] nums) { } ``` -Python: +### Python: + ```python class Solution: def smallerNumbersThanCurrent(self, nums: List[int]) -> List[int]: @@ -151,7 +152,8 @@ class Solution: return res ``` -Go: +### Go: + ```go func smallerNumbersThanCurrent(nums []int) []int { // map,key[数组中出现的数] value[比这个数小的个数] @@ -180,7 +182,8 @@ func smallerNumbersThanCurrent(nums []int) []int { } ``` -JavaScript: +### JavaScript: + ```javascript // 方法一:使用哈希表记录位置 var smallerNumbersThanCurrent = function(nums) { @@ -217,7 +220,7 @@ var smallerNumbersThanCurrent = function(nums) { }; ``` -TypeScript: +### TypeScript: > 暴力法: From 56f37806cac317895ca1785b2e526343ff07426d Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Thu, 27 Jul 2023 14:32:16 +0800 Subject: [PATCH 2178/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20=E5=93=88?= =?UTF-8?q?=E5=B8=8C=E8=A1=A8=E9=A2=9D=E5=A4=96=E9=A2=98=E7=9B=AE=20?= =?UTF-8?q?=E6=8E=92=E7=89=88=E6=A0=BC=E5=BC=8F=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...04\345\255\227\347\254\246\344\270\262.md" | 15 +++++----- ...36\346\226\207\351\223\276\350\241\250.md" | 1 + ...70\347\224\250\345\255\227\347\254\246.md" | 28 ++++++++++++------- 3 files changed, 27 insertions(+), 17 deletions(-) diff --git "a/problems/0205.\345\220\214\346\236\204\345\255\227\347\254\246\344\270\262.md" "b/problems/0205.\345\220\214\346\236\204\345\255\227\347\254\246\344\270\262.md" index a507638c35..e07ab746d9 100644 --- "a/problems/0205.\345\220\214\346\236\204\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/0205.\345\220\214\346\236\204\345\255\227\347\254\246\344\270\262.md" @@ -29,7 +29,7 @@ 提示:可以假设 s 和 t 长度相同。 -# 思路 +## 思路 字符串没有说都是小写字母之类的,所以用数组不合适了,用map来做映射。 @@ -61,9 +61,9 @@ public: ``` -# 其他语言版本 +## 其他语言版本 -## Java +### Java ```java class Solution { @@ -87,7 +87,7 @@ class Solution { } ``` -## Python +### Python ```python class Solution: @@ -110,7 +110,7 @@ class Solution: return True ``` -## Go +### Go ```go func isIsomorphic(s string, t string) bool { @@ -132,7 +132,7 @@ func isIsomorphic(s string, t string) bool { } ``` -## JavaScript +### JavaScript ```js var isIsomorphic = function(s, t) { @@ -156,7 +156,7 @@ var isIsomorphic = function(s, t) { }; ``` -## TypeScript +### TypeScript ```typescript function isIsomorphic(s: string, t: string): boolean { @@ -183,3 +183,4 @@ function isIsomorphic(s: string, t: string): boolean { + diff --git "a/problems/0234.\345\233\236\346\226\207\351\223\276\350\241\250.md" "b/problems/0234.\345\233\236\346\226\207\351\223\276\350\241\250.md" index 18b397e32f..fef942fc49 100644 --- "a/problems/0234.\345\233\236\346\226\207\351\223\276\350\241\250.md" +++ "b/problems/0234.\345\233\236\346\226\207\351\223\276\350\241\250.md" @@ -432,3 +432,4 @@ function reverseList(head: ListNode | null): ListNode | null { + diff --git "a/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md" "b/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md" index a53148b313..1138d7fc2f 100644 --- "a/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md" +++ "b/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md" @@ -30,7 +30,7 @@ words[i] 由小写英文字母组成 -# 思路 +## 思路 这道题意一起就有点绕,不是那么容易懂,其实就是26个小写字符中有字符 在所有字符串里都出现的话,就输出,重复的也算。 @@ -140,7 +140,7 @@ public: ## 其他语言版本 -Java: +### Java: ```Java class Solution { @@ -174,7 +174,8 @@ class Solution { } } ``` -Python +### Python + ```python class Solution: def commonChars(self, words: List[str]) -> List[str]: @@ -218,7 +219,8 @@ class Solution: return l ``` -javaScript +### JavaScript + ```js var commonChars = function (words) { let res = [] @@ -285,7 +287,8 @@ var commonChars = function(words) { } ``` -TypeScript +### TypeScript + ```ts console.time("test") let str: string = "" @@ -321,7 +324,8 @@ TypeScript return str.split("") ``` -GO +### GO + ```golang func commonChars(words []string) []string { length:=len(words) @@ -357,7 +361,8 @@ func min(a,b int)int{ } ``` -Swift: +### Swift: + ```swift func commonChars(_ words: [String]) -> [String] { var res = [String]() @@ -397,7 +402,8 @@ func commonChars(_ words: [String]) -> [String] { } ``` -C: +### C: + ```c //若两个哈希表定义为char数组(每个单词的最大长度不会超过100,因此可以用char表示),可以提高时间和空间效率 void updateHashTable(int* hashTableOne, int* hashTableTwo) { @@ -449,7 +455,8 @@ char ** commonChars(char ** words, int wordsSize, int* returnSize){ return ret; } ``` -Scala: +### Scala: + ```scala object Solution { def commonChars(words: Array[String]): List[String] = { @@ -483,7 +490,7 @@ object Solution { } ``` -Rust: +### Rust: ```rust impl Solution { @@ -522,3 +529,4 @@ impl Solution { + From bbb2a60f8a68bf03b466e3b567ada9cfcd06d24f Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Thu, 27 Jul 2023 14:37:16 +0800 Subject: [PATCH 2179/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20=E4=BA=8C?= =?UTF-8?q?=E5=8F=89=E6=A0=91=E9=A2=9D=E5=A4=96=E9=A2=98=E7=9B=AE=20?= =?UTF-8?q?=E6=8E=92=E7=89=88=E6=A0=BC=E5=BC=8F=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...70\345\220\214\347\232\204\346\240\221.md" | 21 +++++++++------- ...02\347\202\271\346\214\207\351\222\210.md" | 19 +++++++------- ...60\345\255\227\344\271\213\345\222\214.md" | 25 +++++++++++-------- ...21\345\217\230\345\271\263\350\241\241.md" | 18 +++++++------ 4 files changed, 47 insertions(+), 36 deletions(-) diff --git "a/problems/0100.\347\233\270\345\220\214\347\232\204\346\240\221.md" "b/problems/0100.\347\233\270\345\220\214\347\232\204\346\240\221.md" index 96acacf61c..56a6c8840f 100644 --- "a/problems/0100.\347\233\270\345\220\214\347\232\204\346\240\221.md" +++ "b/problems/0100.\347\233\270\345\220\214\347\232\204\346\240\221.md" @@ -19,7 +19,7 @@ ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210726173011.png) -# 思路 +## 思路 在[101.对称二叉树](https://programmercarl.com/0101.对称二叉树.html)中,我们讲到对于二叉树是否对称,要比较的是根节点的左子树与右子树是不是相互翻转的,理解这一点就知道了**其实我们要比较的是两个树(这两个树是根节点的左右子树)**,所以在递归遍历的过程中,也是要同时遍历两棵树。 @@ -115,7 +115,7 @@ public: 当然我可以把如上代码整理如下: -## 递归 +### 递归 ```CPP class Solution { @@ -134,7 +134,7 @@ public: }; ``` -## 迭代法 +### 迭代法 ```CPP class Solution { @@ -166,9 +166,9 @@ public: }; ``` -# 其他语言版本 +## 其他语言版本 -Java: +### Java: ```java // 递归法 @@ -205,7 +205,8 @@ class Solution { } } ``` -Python: +### Python: + ```python # 递归法 class Solution: @@ -236,7 +237,8 @@ class Solution: que.append(rightNode.right) return True ``` -Go: +### Go: + > 递归法 ```go func isSameTree(p *TreeNode, q *TreeNode) bool { @@ -258,7 +260,7 @@ func isSameTree(p *TreeNode, q *TreeNode) bool { } ``` -JavaScript: +### JavaScript: > 递归法 @@ -296,7 +298,7 @@ var isSameTree = (p, q) => { }; ``` -TypeScript: +### TypeScript: > 递归法-先序遍历 @@ -341,3 +343,4 @@ function isSameTree(p: TreeNode | null, q: TreeNode | null): boolean { + diff --git "a/problems/0116.\345\241\253\345\205\205\346\257\217\344\270\252\350\212\202\347\202\271\347\232\204\344\270\213\344\270\200\344\270\252\345\217\263\344\276\247\350\212\202\347\202\271\346\214\207\351\222\210.md" "b/problems/0116.\345\241\253\345\205\205\346\257\217\344\270\252\350\212\202\347\202\271\347\232\204\344\270\213\344\270\200\344\270\252\345\217\263\344\276\247\350\212\202\347\202\271\346\214\207\351\222\210.md" index 31bb6822cc..003ef75afe 100644 --- "a/problems/0116.\345\241\253\345\205\205\346\257\217\344\270\252\350\212\202\347\202\271\347\232\204\344\270\213\344\270\200\344\270\252\345\217\263\344\276\247\350\212\202\347\202\271\346\214\207\351\222\210.md" +++ "b/problems/0116.\345\241\253\345\205\205\346\257\217\344\270\252\350\212\202\347\202\271\347\232\204\344\270\213\344\270\200\344\270\252\345\217\263\344\276\247\350\212\202\347\202\271\346\214\207\351\222\210.md" @@ -30,7 +30,7 @@ struct Node { ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210727143202.png) -# 思路 +## 思路 注意题目提示内容,: * 你只能使用常量级额外空间。 @@ -38,7 +38,7 @@ struct Node { 基本上就是要求使用递归了,迭代的方式一定会用到栈或者队列。 -## 递归 +### 递归 一想用递归怎么做呢,虽然层序遍历是最直观的,但是递归的方式确实不好想。 @@ -83,7 +83,7 @@ public: }; ``` -## 迭代(层序遍历) +### 迭代(层序遍历) 本题使用层序遍历是最为直观的,如果对层序遍历不了解,看这篇:[二叉树:层序遍历登场!](https://programmercarl.com/0102.二叉树的层序遍历.html)。 @@ -114,9 +114,9 @@ public: }; ``` -# 其他语言版本 +## 其他语言版本 -## Java +### Java ```java // 递归法 @@ -169,7 +169,7 @@ class Solution { } ``` -## Python +### Python ```python # 递归法 @@ -210,7 +210,7 @@ class Solution: nodePre.next = None # 本层最后一个节点指向None return root ``` -## Go +### Go ```go // 迭代法 func connect(root *Node) *Node { @@ -259,7 +259,7 @@ func connect(root *Node) *Node { } ``` -## JavaScript +### JavaScript ```js const connect = root => { @@ -287,7 +287,7 @@ const connect = root => { }; ``` -## TypeScript +### TypeScript (注:命名空间‘Node’与typescript中内置类型冲突,这里改成了‘NodePro’) @@ -365,3 +365,4 @@ function connect(root: NodePro | null): NodePro | null { + diff --git "a/problems/0129.\346\261\202\346\240\271\345\210\260\345\217\266\345\255\220\350\212\202\347\202\271\346\225\260\345\255\227\344\271\213\345\222\214.md" "b/problems/0129.\346\261\202\346\240\271\345\210\260\345\217\266\345\255\220\350\212\202\347\202\271\346\225\260\345\255\227\344\271\213\345\222\214.md" index 445e108aa9..ebb36071cf 100644 --- "a/problems/0129.\346\261\202\346\240\271\345\210\260\345\217\266\345\255\220\350\212\202\347\202\271\346\225\260\345\255\227\344\271\213\345\222\214.md" +++ "b/problems/0129.\346\261\202\346\240\271\345\210\260\345\217\266\345\255\220\350\212\202\347\202\271\346\225\260\345\255\227\344\271\213\345\222\214.md" @@ -10,7 +10,7 @@ [力扣题目链接](https://leetcode.cn/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-路径总和) 做了。 @@ -24,7 +24,7 @@ 那么先按递归三部曲来分析: -## 递归三部曲 +### 递归三部曲 如果对递归三部曲不了解的话,可以看这里:[二叉树:前中后递归详解](https://programmercarl.com/二叉树的递归遍历.html) @@ -116,7 +116,7 @@ path.pop_back(); // 回溯 ``` **把回溯放在花括号外面了,世界上最遥远的距离,是你在花括号里,而我在花括号外!** 这就不对了。 -## 整体C++代码 +整体C++代码 关键逻辑分析完了,整体C++代码如下: @@ -162,16 +162,16 @@ public: }; ``` -# 总结 +## 总结 过于简洁的代码,很容易让初学者忽视了本题中回溯的精髓,甚至作者本身都没有想清楚自己用了回溯。 **我这里提供的代码把整个回溯过程充分体现出来,希望可以帮助大家看的明明白白!** -# 其他语言版本 +## 其他语言版本 -Java: +### Java: ```java class Solution { @@ -219,7 +219,8 @@ class Solution { } ``` -Python: +### Python: + ```python class Solution: def sumNumbers(self, root: TreeNode) -> int: @@ -246,7 +247,7 @@ class Solution: backtrace(root) return res ``` -Go: +### Go: ```go func sumNumbers(root *TreeNode) int { @@ -271,7 +272,8 @@ func dfs(root *TreeNode, tmpSum int, sum *int) { -JavaScript: +### JavaScript: + ```javascript var sumNumbers = function(root) { const listToInt = path => { @@ -315,7 +317,7 @@ var sumNumbers = function(root) { }; ``` -TypeScript: +### TypeScript: ```typescript function sumNumbers(root: TreeNode | null): number { @@ -351,7 +353,7 @@ function sumNumbers(root: TreeNode | null): number { }; ``` -C: +### C: ```c //sum记录总和 @@ -384,3 +386,4 @@ int sumNumbers(struct TreeNode* root){ + diff --git "a/problems/1382.\345\260\206\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\345\217\230\345\271\263\350\241\241.md" "b/problems/1382.\345\260\206\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\345\217\230\345\271\263\350\241\241.md" index 0f81745c36..57e56b8fe3 100644 --- "a/problems/1382.\345\260\206\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\345\217\230\345\271\263\350\241\241.md" +++ "b/problems/1382.\345\260\206\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\345\217\230\345\271\263\350\241\241.md" @@ -28,7 +28,7 @@ * 树节点的数目在 1 到 10^4 之间。 * 树节点的值互不相同,且在 1 到 10^5 之间。 -# 思路 +## 思路 这道题目,可以中序遍历把二叉树转变为有序数组,然后在根据有序数组构造平衡二叉搜索树。 @@ -71,9 +71,10 @@ public: }; ``` -# 其他语言版本 +## 其他语言版本 + +### Java: -Java: ```java class Solution { ArrayList res = new ArrayList(); @@ -99,7 +100,8 @@ class Solution { } } ``` -Python: +### Python: + ```python class Solution: def balanceBST(self, root: TreeNode) -> TreeNode: @@ -121,7 +123,7 @@ class Solution: traversal(root) return getTree(res, 0, len(res) - 1) ``` -Go: +### Go: ```go /** @@ -163,7 +165,8 @@ func balanceBST(root *TreeNode) *TreeNode { ``` -JavaScript: +### JavaScript: + ```javascript var balanceBST = function(root) { const res = []; @@ -188,7 +191,7 @@ var balanceBST = function(root) { }; ``` -TypeScript: +### TypeScript: ```typescript function balanceBST(root: TreeNode | null): TreeNode | null { @@ -218,3 +221,4 @@ function buildTree(arr: number[], left: number, right: number): TreeNode | null + From e9b0d46f3535546063192c170606bffa8ff75a32 Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Thu, 27 Jul 2023 14:41:58 +0800 Subject: [PATCH 2180/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20=E8=B4=AA?= =?UTF-8?q?=E5=BF=83=E4=B8=8E=E5=8A=A8=E6=80=81=E8=A7=84=E5=88=92=20?= =?UTF-8?q?=E9=A2=9D=E5=A4=96=E9=A2=98=E7=9B=AE=20=E6=8E=92=E7=89=88?= =?UTF-8?q?=E6=A0=BC=E5=BC=8F=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...36\346\226\207\345\255\220\344\270\262.md" | 23 ++++++++++--------- ...\345\233\236\346\226\207\344\270\262II.md" | 13 ++++++----- ...a2\345\217\202\350\256\256\351\231\242.md" | 17 +++++++------- ...27\347\232\204\344\270\252\346\225\260.md" | 13 ++++++----- 4 files changed, 35 insertions(+), 31 deletions(-) diff --git "a/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" "b/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" index b1987b87b3..614f60514c 100644 --- "a/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" +++ "b/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" @@ -30,17 +30,17 @@ * 输出:"a" -# 思路 +## 思路 本题和[647.回文子串](https://programmercarl.com/0647.回文子串.html) 差不多是一样的,但647.回文子串更基本一点,建议可以先做647.回文子串 -## 暴力解法 +### 暴力解法 两层for循环,遍历区间起始位置和终止位置,然后判断这个区间是不是回文。 时间复杂度:O(n^3) -## 动态规划 +### 动态规划 动规五部曲: @@ -208,7 +208,7 @@ public: * 时间复杂度:O(n^2) * 空间复杂度:O(n^2) -## 双指针 +### 双指针 动态规划的空间复杂度是偏高的,我们再看一下双指针法。 @@ -258,9 +258,9 @@ public: -# 其他语言版本 +## 其他语言版本 -Java: +### Java: ```java // 双指针 动态规划 @@ -327,7 +327,7 @@ class Solution { } ``` -Python: +### Python: ```python class Solution: @@ -377,7 +377,7 @@ class Solution: return s[start:end] ``` -Go: +### Go: ```go func longestPalindrome(s string) string { @@ -411,7 +411,7 @@ func longestPalindrome(s string) string { ``` -JavaScript: +### JavaScript: ```js //动态规划解法 @@ -527,7 +527,7 @@ var longestPalindrome = function(s) { }; ``` -C: +### C: 动态规划: ```c @@ -615,7 +615,7 @@ char * longestPalindrome(char * s){ } ``` -C#: +### C#: 動態規則: ```c# @@ -681,3 +681,4 @@ public class Solution { + diff --git "a/problems/0132.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262II.md" "b/problems/0132.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262II.md" index 9b164dfbb5..eb91a1899f 100644 --- "a/problems/0132.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262II.md" +++ "b/problems/0132.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262II.md" @@ -34,7 +34,7 @@ * 1 <= s.length <= 2000 * s 仅由小写英文字母组成 -# 思路 +## 思路 我们在讲解回溯法系列的时候,讲过了这道题目[回溯算法:131.分割回文串](https://programmercarl.com/0131.分割回文串.html)。 @@ -201,9 +201,9 @@ public: ``` -# 其他语言版本 +## 其他语言版本 -## Java +### Java ```java class Solution { @@ -257,7 +257,7 @@ class Solution { } ``` -## Python +### Python ```python class Solution: @@ -286,7 +286,7 @@ class Solution: return dp[-1] ``` -## Go +### Go ```go func minCut(s string) int { @@ -330,7 +330,7 @@ func min(i, j int) int { } ``` -## JavaScript +### JavaScript ```js var minCut = function(s) { @@ -376,3 +376,4 @@ var minCut = function(s) { + diff --git "a/problems/0649.Dota2\345\217\202\350\256\256\351\231\242.md" "b/problems/0649.Dota2\345\217\202\350\256\256\351\231\242.md" index a1420a66db..db6b43df8e 100644 --- "a/problems/0649.Dota2\345\217\202\350\256\256\351\231\242.md" +++ "b/problems/0649.Dota2\345\217\202\350\256\256\351\231\242.md" @@ -42,7 +42,7 @@ Dota2 参议院由来自两派的参议员组成。现在参议院希望对一 因此在第二轮只剩下第三个参议员拥有投票的权利,于是他可以宣布胜利。 -# 思路 +## 思路 这道题 题意太绕了,我举一个更形象的例子给大家捋顺一下。 @@ -70,7 +70,7 @@ Dota2 参议院由来自两派的参议员组成。现在参议院希望对一 如果对贪心算法理论基础还不了解的话,可以看看这篇:[关于贪心算法,你该了解这些!](https://programmercarl.com/贪心算法理论基础.html) ,相信看完之后对贪心就有基本的了解了。 -# 代码实现 +## 代码实现 实现代码,在每一轮循环的过程中,去过模拟优先消灭身后的对手,其实是比较麻烦的。 @@ -111,9 +111,9 @@ public: -# 其他语言版本 +## 其他语言版本 -## Java +### Java ```java class Solution { @@ -145,7 +145,7 @@ class Solution { } ``` -## Python +### Python ```python class Solution: @@ -173,7 +173,7 @@ class Solution: return "Radiant" if R else "Dire" ``` -## Go +### Go ```go @@ -214,7 +214,7 @@ func predictPartyVictory(senateStr string) string { } ``` -## JavaScript +### JavaScript ```js var predictPartyVictory = function(senateStr) { @@ -244,7 +244,7 @@ var predictPartyVictory = function(senateStr) { }; ``` -## TypeScript +### TypeScript ```typescript function predictPartyVictory(senate: string): string { @@ -287,3 +287,4 @@ function predictPartyVictory(senate: string): string { + diff --git "a/problems/0673.\346\234\200\351\225\277\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227\347\232\204\344\270\252\346\225\260.md" "b/problems/0673.\346\234\200\351\225\277\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227\347\232\204\344\270\252\346\225\260.md" index da80a4e039..0277f24989 100644 --- "a/problems/0673.\346\234\200\351\225\277\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227\347\232\204\344\270\252\346\225\260.md" +++ "b/problems/0673.\346\234\200\351\225\277\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227\347\232\204\344\270\252\346\225\260.md" @@ -24,7 +24,7 @@ * 解释: 最长递增子序列的长度是1,并且存在5个子序列的长度为1,因此输出5。 -# 思路 +## 思路 这道题可以说是 [300.最长上升子序列](https://programmercarl.com/0300.最长上升子序列.html) 的进阶版本 @@ -221,9 +221,9 @@ public: 还有O(nlog n)的解法,使用树状数组,今天有点忙就先不写了,感兴趣的同学可以自行学习一下,这里有我之前写的树状数组系列博客:https://blog.csdn.net/youngyangyang04/category_871105.html (十年前的陈年老文了) -# 其他语言版本 +## 其他语言版本 -## Java +### Java ```java class Solution { @@ -257,7 +257,7 @@ class Solution { } ``` -## Python +### Python ```python class Solution: @@ -286,7 +286,7 @@ class Solution: return result; ``` -## Go +### Go ```go @@ -332,7 +332,7 @@ func findNumberOfLIS(nums []int) int { } ``` -## JavaScript +### JavaScript ```js var findNumberOfLIS = function(nums) { @@ -364,3 +364,4 @@ var findNumberOfLIS = function(nums) { + From a5eb340ee630091b199407bea8d3191b546708a0 Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Thu, 27 Jul 2023 14:48:04 +0800 Subject: [PATCH 2181/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20=E5=9B=BE?= =?UTF-8?q?=E8=AE=BA=20=E5=B9=B6=E6=9F=A5=E9=9B=86=20=E6=A8=A1=E6=8B=9F=20?= =?UTF-8?q?=E4=BD=8D=E8=BF=90=E7=AE=97=20=E9=A2=9D=E5=A4=96=E9=A2=98?= =?UTF-8?q?=E7=9B=AE=20=E6=8E=92=E7=89=88=E6=A0=BC=E5=BC=8F=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...70\200\344\270\252\346\216\222\345\210\227.md" | 13 +++++++------ ...15\225\350\257\215\346\216\245\351\276\231.md" | 15 +++++++-------- ...61\277\347\232\204\345\221\250\351\225\277.md" | 13 ++++++++----- ...77\224\345\233\236\345\216\237\347\202\271.md" | 15 ++++++++------- ...06\227\344\275\231\350\277\236\346\216\245.md" | 13 +++++++------ ...\227\344\275\231\350\277\236\346\216\245II.md" | 11 ++++++----- ...25\260\347\233\256\346\216\222\345\272\217.md" | 15 ++++++++------- 7 files changed, 51 insertions(+), 44 deletions(-) diff --git "a/problems/0031.\344\270\213\344\270\200\344\270\252\346\216\222\345\210\227.md" "b/problems/0031.\344\270\213\344\270\200\344\270\252\346\216\222\345\210\227.md" index 34aa1086c0..3cfb673a29 100644 --- "a/problems/0031.\344\270\213\344\270\200\344\270\252\346\216\222\345\210\227.md" +++ "b/problems/0031.\344\270\213\344\270\200\344\270\252\346\216\222\345\210\227.md" @@ -34,7 +34,7 @@ * 输出:[1] -# 思路 +## 思路 一些同学可能手动写排列的顺序,都没有写对,那么写程序的话思路一定是有问题的了,我这里以1234为例子,把全排列都列出来。可以参考一下规律所在: @@ -92,9 +92,9 @@ public: }; ``` -# 其他语言版本 +## 其他语言版本 -## Java +### Java ```java class Solution { @@ -159,7 +159,7 @@ class Solution { } ``` -## Python +### Python >直接使用sorted()会开辟新的空间并返回一个新的list,故补充一个原地反转函数 ```python class Solution: @@ -191,7 +191,7 @@ class Solution: """ ``` -## Go +### Go ```go //卡尔的解法 @@ -216,7 +216,7 @@ func reverse(a []int,begin,end int){ } ``` -## JavaScript +### JavaScript ```js //卡尔的解法(吐槽一下JavaScript的sort和其他语言的不太一样,只想到了拷贝数组去排序再替换原数组来实现nums的[i + 1, nums.length)升序排序) @@ -272,3 +272,4 @@ var nextPermutation = function(nums) { + diff --git "a/problems/0127.\345\215\225\350\257\215\346\216\245\351\276\231.md" "b/problems/0127.\345\215\225\350\257\215\346\216\245\351\276\231.md" index 20ad518295..97bc66d096 100644 --- "a/problems/0127.\345\215\225\350\257\215\346\216\245\351\276\231.md" +++ "b/problems/0127.\345\215\225\350\257\215\346\216\245\351\276\231.md" @@ -29,7 +29,7 @@ * 解释:endWord "cog" 不在字典中,所以无法进行转换。 -# 思路 +## 思路 以示例1为例,从这个图中可以看出 hit 到 cog的路线,不止一条,有三条,一条是最短的长度为5,两条长度为6。 @@ -97,9 +97,9 @@ public: 当然本题也可以用双向BFS,就是从头尾两端进行搜索,大家感兴趣,可以自己去实现,这里就不再做详细讲解了。 -# 其他语言版本 +## 其他语言版本 -## Java +### Java ```java public int ladderLength(String beginWord, String endWord, List wordList) { @@ -196,7 +196,7 @@ class Solution { } ``` -## Python +### Python ``` class Solution: @@ -221,7 +221,7 @@ class Solution: queue.append(newWord) return 0 ``` -## Go +### Go ```go func ladderLength(beginWord string, endWord string, wordList []string) int { wordMap, que, depth := getWordMap(wordList, beginWord), []string{beginWord}, 0 @@ -274,7 +274,7 @@ func getCandidates(word string) []string { } ``` -## JavaScript +### JavaScript ```javascript var ladderLength = function(beginWord, endWord, wordList) { // 将wordList转成Set,提高查询速度 @@ -310,7 +310,7 @@ var ladderLength = function(beginWord, endWord, wordList) { }; ``` -## TypeScript +### TypeScript ```typescript function ladderLength( beginWord: string, @@ -364,4 +364,3 @@ function diffonechar(word1: string, word2: string): boolean { - diff --git "a/problems/0463.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" "b/problems/0463.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" index 18f1d01eb2..14fa98dc10 100644 --- "a/problems/0463.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" +++ "b/problems/0463.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" @@ -90,7 +90,7 @@ public: ## 其他语言版本 -Java: +### Java: ```java // 解法一 @@ -191,8 +191,8 @@ class Solution { ``` -Python: -### 解法1: +### Python: + 扫描每个cell,如果当前位置为岛屿 grid[i][j] == 1, 从当前位置判断四边方向,如果边界或者是水域,证明有边界存在,res矩阵的对应cell加一。 ```python @@ -228,7 +228,8 @@ class Solution: ``` -Go: +### Go: + ```go func islandPerimeter(grid [][]int) int { m, n := len(grid), len(grid[0]) @@ -249,7 +250,8 @@ func islandPerimeter(grid [][]int) int { } ``` -JavaScript: +### JavaScript: + ```javascript //解法一 var islandPerimeter = function(grid) { @@ -305,3 +307,4 @@ var islandPerimeter = function(grid) { + diff --git "a/problems/0657.\346\234\272\345\231\250\344\272\272\350\203\275\345\220\246\350\277\224\345\233\236\345\216\237\347\202\271.md" "b/problems/0657.\346\234\272\345\231\250\344\272\272\350\203\275\345\220\246\350\277\224\345\233\236\345\216\237\347\202\271.md" index ab4bf1525c..f0d3339173 100644 --- "a/problems/0657.\346\234\272\345\231\250\344\272\272\350\203\275\345\220\246\350\277\224\345\233\236\345\216\237\347\202\271.md" +++ "b/problems/0657.\346\234\272\345\231\250\344\272\272\350\203\275\345\220\246\350\277\224\345\233\236\345\216\237\347\202\271.md" @@ -29,7 +29,7 @@ -# 思路 +## 思路 这道题目还是挺简单的,大家不要想复杂了,一波哈希法又一波图论算法啥的,哈哈。 @@ -64,9 +64,9 @@ public: ``` -# 其他语言版本 +## 其他语言版本 -## Java +### Java ```java // 时间复杂度:O(n) @@ -86,7 +86,7 @@ class Solution { } ``` -## Python +### Python ```python # 时间复杂度:O(n) @@ -107,7 +107,7 @@ class Solution: return x == 0 and y == 0 ``` -## Go +### Go ```go func judgeCircle(moves string) bool { @@ -131,7 +131,7 @@ func judgeCircle(moves string) bool { } ``` -## JavaScript +### JavaScript ```js // 时间复杂度:O(n) @@ -150,7 +150,7 @@ var judgeCircle = function(moves) { ``` -## TypeScript +### TypeScript ```ts var judgeCircle = function (moves) { @@ -185,3 +185,4 @@ var judgeCircle = function (moves) { + diff --git "a/problems/0684.\345\206\227\344\275\231\350\277\236\346\216\245.md" "b/problems/0684.\345\206\227\344\275\231\350\277\236\346\216\245.md" index c4d62d9b46..8124cc7eea 100644 --- "a/problems/0684.\345\206\227\344\275\231\350\277\236\346\216\245.md" +++ "b/problems/0684.\345\206\227\344\275\231\350\277\236\346\216\245.md" @@ -25,7 +25,7 @@ * edges 中无重复元素 * 给定的图是连通的  -# 思路 +## 思路 这道题目也是并查集基础题目。 @@ -150,9 +150,9 @@ public: 可以看出,主函数的代码很少,就判断一下边的两个节点在不在同一个集合就可以了。 -# 其他语言版本 +## 其他语言版本 -## Java +### Java ```java class Solution { @@ -205,7 +205,7 @@ class Solution { } ``` -## Python +### Python ```python @@ -256,7 +256,7 @@ class Solution: return [] ``` -## Go +### Go ```go @@ -312,7 +312,7 @@ func findRedundantConnection(edges [][]int) []int { } ``` -## JavaScript +### JavaScript ```js const n = 1005; @@ -365,3 +365,4 @@ var findRedundantConnection = function(edges) { + diff --git "a/problems/0685.\345\206\227\344\275\231\350\277\236\346\216\245II.md" "b/problems/0685.\345\206\227\344\275\231\350\277\236\346\216\245II.md" index 8c56afdc08..31b2ad247e 100644 --- "a/problems/0685.\345\206\227\344\275\231\350\277\236\346\216\245II.md" +++ "b/problems/0685.\345\206\227\344\275\231\350\277\236\346\216\245II.md" @@ -213,9 +213,9 @@ public: ``` -# 其他语言版本 +## 其他语言版本 -## Java +### Java ```java @@ -335,7 +335,7 @@ class Solution { } ``` -## Python +### Python ```python @@ -426,7 +426,7 @@ class Solution: return self.getRemoveEdge(edges) ``` -## Go +### Go ```go @@ -527,7 +527,7 @@ func findRedundantDirectedConnection(edges [][]int) []int { ``` -## JavaScript +### JavaScript ```js const N = 1010; // 如题:二维数组大小的在3到1000范围内 @@ -623,3 +623,4 @@ var findRedundantDirectedConnection = function(edges) { + diff --git "a/problems/1356.\346\240\271\346\215\256\346\225\260\345\255\227\344\272\214\350\277\233\345\210\266\344\270\2131\347\232\204\346\225\260\347\233\256\346\216\222\345\272\217.md" "b/problems/1356.\346\240\271\346\215\256\346\225\260\345\255\227\344\272\214\350\277\233\345\210\266\344\270\2131\347\232\204\346\225\260\347\233\256\346\216\222\345\272\217.md" index b898b7f25c..cc7a7007c7 100644 --- "a/problems/1356.\346\240\271\346\215\256\346\225\260\345\255\227\344\272\214\350\277\233\345\210\266\344\270\2131\347\232\204\346\225\260\347\233\256\346\216\222\345\272\217.md" +++ "b/problems/1356.\346\240\271\346\215\256\346\225\260\345\255\227\344\272\214\350\277\233\345\210\266\344\270\2131\347\232\204\346\225\260\347\233\256\346\216\222\345\272\217.md" @@ -46,7 +46,7 @@ -# 思路 +## 思路 这道题其实是考察如何计算一个数的二进制中1的数量。 @@ -87,7 +87,7 @@ int bitCount(int n) { 下面我就使用方法二,来做这道题目: -## C++代码 + ```C++ class Solution { @@ -116,9 +116,9 @@ public: -# 其他语言版本 +## 其他语言版本 -## Java +### Java ```java class Solution { @@ -151,7 +151,7 @@ class Solution { -## Python +### Python ```python class Solution: @@ -167,7 +167,7 @@ class Solution: return count ``` -## Go +### Go ```go func sortByBits(arr []int) []int { @@ -205,7 +205,7 @@ func bitCount(n int) int { } ``` -## JavaScript +### JavaScript ```js var sortByBits = function(arr) { @@ -227,3 +227,4 @@ var sortByBits = function(arr) { + From 9693ad4e456bf583b96e1f8a5cb965ee0f6b4f63 Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Thu, 27 Jul 2023 15:40:30 +0800 Subject: [PATCH 2182/3019] Update --- README.md | 25 +- problems/qita/join.md | 249 ++++++++++++++++++ ...16\346\234\254\351\241\271\347\233\256.md" | 15 -- ...72\344\272\214\345\217\211\346\240\221.md" | 2 + ...CM\346\250\241\345\274\217\357\274\237.md" | 4 + ...43\347\240\201\351\243\216\346\240\274.md" | 2 +- 6 files changed, 263 insertions(+), 34 deletions(-) create mode 100644 problems/qita/join.md delete mode 100644 "problems/qita/\345\217\202\344\270\216\346\234\254\351\241\271\347\233\256.md" diff --git a/README.md b/README.md index dd70d8cb6b..e5eb97bc7a 100644 --- a/README.md +++ b/README.md @@ -5,11 +5,11 @@ > 1. **介绍** :本项目是一套完整的刷题计划,旨在帮助大家少走弯路,循序渐进学算法,[关注作者](#关于作者) > 2. **正式出版** :[《代码随想录》](https://programmercarl.com/other/publish.html) 。 > 3. **PDF版本** :[「代码随想录」算法精讲 PDF 版本](https://programmercarl.com/other/algo_pdf.html) 。 -> 4. **算法公开课** :[《代码随想录》算法视频公开课](https://www.bilibili.com/video/BV1fA4y1o715) 。 +> 4. **算法公开课** :[《代码随想录》算法视频公开课](https://www.programmercarl.com/other/gongkaike.html) 。 > 5. **最强八股文** :[代码随想录知识星球精华PDF](https://www.programmercarl.com/other/kstar_baguwen.html) 。 > 6. **刷题顺序** :README已经将刷题顺序排好了,按照顺序一道一道刷就可以。 > 7. **学习社区** :一起学习打卡/面试技巧/如何选择offer/大厂内推/职场规则/简历修改/技术分享/程序人生。欢迎加入[「代码随想录」知识星球](https://programmercarl.com/other/kstar.html) 。 -> 8. **提交代码** :本项目统一使用C++语言进行讲解,但已经有Java、Python、Go、JavaScript等等多语言版本,感谢[这里的每一位贡献者](https://github.com/youngyangyang04/leetcode-master/graphs/contributors),如果你也想贡献代码点亮你的头像,[点击这里](https://mp.weixin.qq.com/s/tqCxrMEU-ajQumL1i8im9A)了解提交代码的方式。 +> 8. **提交代码** :本项目统一使用C++语言进行讲解,但已经有Java、Python、Go、JavaScript等等多语言版本,感谢[这里的每一位贡献者](https://github.com/youngyangyang04/leetcode-master/graphs/contributors),如果你也想贡献代码点亮你的头像,[点击这里](https://www.programmercarl.com/qita/join.html)了解提交代码的方式。 > 9. **转载须知** :以下所有文章皆为我([程序员Carl](https://github.com/youngyangyang04))的原创。引用本项目文章请注明出处,发现恶意抄袭或搬运,会动用法律武器维护自己的权益。让我们一起维护一个良好的技术创作环境! @@ -51,19 +51,12 @@ ## 如何使用该刷题攻略 -电脑端还看不到留言,大家可以在公众号[「代码随想录」](https://img-blog.csdnimg.cn/20201124161234338.png),左下角有「刷题攻略」,这是手机版刷题攻略,看完就会发现有很多录友(代码随想录的朋友们)在文章下留言打卡,这份刷题顺序和题解已经陪伴了上万录友了,同时也说明文章的质量是经过上万人的考验! - -欢迎每一位学习算法的小伙伴加入到这个学习阵营来! - -**目前已经更新了,数组-> 链表-> 哈希表->字符串->栈与队列->树->回溯->贪心,八个专题了,正在讲解动态规划!** +按照先面的排列顺序,从数组开始刷起就可以了,顺序都安排好了,按顺序刷就好。 在刷题攻略中,每个专题开始都有理论基础篇,并不像是教科书般的理论介绍,而是从实战中归纳需要的基础知识。每个专题结束都有总结篇,最这个专题的归纳总结。 如果你是算法老手,这篇攻略也是复习的最佳资料,如果把每个系列对应的总结篇,快速过一遍,整个算法知识体系以及各种解法就重现脑海了。 - -目前「代码随想录」刷题攻略更新了:**200多篇文章,精讲了200道经典算法题目,共60w字的详细图解,大部分题目都搭配了20分钟左右的视频讲解**,视频质量很好,口碑很好,大家可以去看看,视频列表:[代码随想录视频讲解](https://www.bilibili.com/video/BV1fA4y1o715)。 - **这里每一篇题解,都是精品,值得仔细琢磨**。 我在题目讲解中统一使用C++,但你会发现下面几乎每篇题解都配有其他语言版本,Java、Python、Go、JavaScript等等,正是这些[热心小伙们](https://github.com/youngyangyang04/leetcode-master/graphs/contributors)贡献的代码,当然我也会严格把控代码质量。 @@ -100,14 +93,11 @@ * [程序员应该用什么用具来写文档?](./problems/前序/程序员写文档工具.md) * 求职 + * [ACM模式练习网站,卡码网](https://kamacoder.com/) * [程序员的简历应该这么写!!(附简历模板)](./problems/前序/程序员简历.md) + * [【专业技能】应该这样写!](https://programmercarl.com/other/jianlizhuanye.html) + * [【项目经历】应该这样写!](https://programmercarl.com/other/jianlixiangmu.html) * [BAT级别技术面试流程和注意事项都在这里了](./problems/前序/BAT级别技术面试流程和注意事项都在这里了.md) - * [北京有这些互联网公司,你都知道么?](./problems/前序/北京互联网公司总结.md) - * [上海有这些互联网公司,你都知道么?](./problems/前序/上海互联网公司总结.md) - * [深圳有这些互联网公司,你都知道么?](./problems/前序/深圳互联网公司总结.md) - * [广州有这些互联网公司,你都知道么?](./problems/前序/广州互联网公司总结.md) - * [成都有这些互联网公司,你都知道么?](./problems/前序/成都互联网公司总结.md) - * [杭州有这些互联网公司,你都知道么?](./problems/前序/杭州互联网公司总结.md) * 算法性能分析 * [关于时间复杂度,你不知道的都在这里!](./problems/前序/关于时间复杂度,你不知道的都在这里!.md) @@ -506,7 +496,7 @@ # 关于作者 -大家好,我是程序员Carl,哈工大师兄,《代码随想录》作者,先后在腾讯和百度从事后端技术研发,CSDN博客专家。对算法和C++后端技术有一定的见解,利用工作之余重新刷leetcode。 +大家好,我是程序员Carl,哈工大师兄,《代码随想录》作者,先后在腾讯和百度从事后端技术研发。对算法和C++后端技术有一定的见解,利用工作之余重新刷leetcode。 加入「代码随想录」刷题小分队(微信群),可以扫下方二维码,加代码随想录客服微信。 @@ -527,4 +517,3 @@
- diff --git a/problems/qita/join.md b/problems/qita/join.md new file mode 100644 index 0000000000..3b3e2d4029 --- /dev/null +++ b/problems/qita/join.md @@ -0,0 +1,249 @@ + + +# 如何在Github上提交PR(pull request) + + +* 如何提交代码 +* 合入不规范 + * 提交信息不规范 + * Markdown 代码格式 + * pull request里的commit数量 + * 代码注释 + * 说明具体是哪种方法 + * 代码规范 + * 代码逻辑 + * 处理冲突 + +以下在 [https://github.com/youngyangyang04/leetcode-master](https://github.com/youngyangyang04/leetcode-master) 上提交pr为为例 + +## 如何合入代码 + +首先来说一说如何合入代码,不少录友还不太会使用github,所以这里也做一下科普。 + +我特意申请一个新的Github账号,给大家做一个示范。 + +需要强调一下,一个commit就只更新一道题目,不要很多题目一起放在一个commit里,那样就很乱。 + +首先LeetCode-Master每天都有更新,如何保持你fork到自己的仓库是最新的版本呢。 + +点击这里Fetch upstream。 + +
+ +点击之后,这里就会显示最新的信息了 +
+ +注意这时是你的远端仓库为最新版本,本地还不是最新的,本地要git pull一下。 + +基于最新的版本,大家在去提交代码。 + +如何提交代码呢,首先把自己的代码提交到自己的fork的远端仓库中,然后open pull request,如图: + +
+ +点击 open pull request之后,就是如下画面,一个pull request有多个commit。 + +
+ +然后就是给pull request 添加备注,pull request是对本次commit的一个总结。如果一个pull request就一个commit,那么就和commit的备注保持一次。 然后点击 create pull request 就可以了 + +
+ +此时你就提交成功了,我会在项目中的pull requests 处理列表里看到你的请求。 +
+ +然后如果你发现自己的代码没有合入多半是有问题,如果有问题都有会在pull request里给出留言的, + +## 注意事项 + +### 提交信息不规范 + + +大家提交代码的时候有两个地方需要写备注,一个是commit,一个是pull request,pull request包好多个commit。 + +commit 说清楚本文件多了哪些修改,而pull request则是对本次合入的所有commit做一个总结性描述。 + +commit备注,举例:添加Rust python3,那么commit备注就是:添加0001两数之和 Rust python3 版本 + +而pull request 如果只有一个commit,那么就也是:添加0001两数之和 Rust python3 版本 + +如果是多个commit ,则把本次commit都描述一遍。 + +### Markdown 语法 + +关于 Markdown 代码格式,例如 添加C++代码,需要有代码块语法 + +\`\`\`C++ +C++代码 +\`\`\` + +例如这个commit,在添加java代码的时候,就直接添加代码 +
+ +正确的格式应该是这样: +
+ +一般发现问题,我也会在代码中给出评论: + +
+ +这样大家也可以学习一些 提交代码的规范方面的知识 + + +有的录友 是添加的代码块语法,但没有标记是哪种语言,这样的话 代码就不会针对某种语言高亮显示了,也比较影响阅读,例如: + +
+ +提交python代码的话,要注释好,是python2还是python3 + +例如这样: + +
+ +当然python2的话,只这么写就行 + +\`\`\`python +python代码 +\`\`\` + +### pull request里的commit数量 + + +有的录友是一个pull request 里有很多commit (一个commit是一道题目的代码)。 + +有的录友是一个pull request 里有有一个commit。 + +
+ +其实如果大家是平时一天写了两三道题目的话,那么分三个commit,一个pull request提交上来就行。 + +一个pull request 一个commit也可以,这样大家就会麻烦一点。 + +但注意一个pull request也不要放太多的commit,一旦有一道题目代码不合格,我没有合入,就这个pull request里影响其他所有代码的合入了。 + +### 代码注释 + +提交的代码最好要有注释,这样也方便读者理解。 + +例如这位录友,在提交Java代码的时候,按照题解的意思对Java版本的代码进行的注释,这就很棒👍 + +
+ +
+ +当然如果大家感觉 已有的代码 不符合以上要求的话,例如 代码思路不够清晰不够规范,注释不够友好,依然欢迎提交优化代码,要记得详细注释哦。 + +
+ +### 说明具体是哪种方法 + +有的题解有两种甚至三四种解法,在添加代码的时候,注释上也清楚具体是哪一种方法的版本。 + +下面这位录友做的就很好 + +
+ + +
+ +有的题解,是一起给出了多道题目的讲解,例如项目中0102.二叉树的层序遍历.md 中有八道题目,那么大家添加代码的时候 应该在代码注释上,或者 直接写上 是哪个题目的代码。 + + +### 代码规范 + + +大家提交代码要规范,当然代码可以在力扣上运行通过是最基本的。 + +虽然我主张没有绝对正确的代码风格,但既然是给LeetCode-Master提交代码,尽量遵循Google编程规范。 + +经常看我的代码的录友应该都知道,我的代码格严格按照 Google C++ 编程规范来的,这样看上去会比较整洁。 + +大家提交代码的时候遇到规范性问题,例如哪里应该由空格,哪里没有空格,可以参考我的代码来。 + +有一位录友在提交代码的时候会把之前的代码 做一下规范性的调整,这就很棒。 + +
+ +**代码规范从你我做起!** + + +### 代码逻辑 + +**提交的代码要按照题解思路来写**。 + +虽然大家自己发挥想象空间是好的,但是题解还是要一脉相承,读者看完题解,发现代码和题解不是一个思路的话,那和重新读代码有啥区别了。 + +所以和题解不是一个思路的代码,除非详细注释了自己的思路 或者 写一段自己代码的描述说明思路和优化的地方,否则我就不会通过合入了哈。 + +大家的代码 最好也将关键地方放上注释,这样有助于别人快速理解你的代码。 + + +### 处理冲突 + +在合入的过程中还要处理冲突的代码, 理解大家代码的思路,解决冲突,然后在力扣提交一下,确保是没问题。 + +例如同一道题目, 一位录友提交了, 我还没处理如何,另一位录友也对这道题也提交了代码,这样就会发生冲突 +
+ +大家提交代码的热情太高了,我有时候根本处理不过来,但我必须当天处理完,否则第二天代码冲突会越来越多。 +
+ +一天晚分别有两位录友提交了 30多道 java代码,全部冲突,解决冲突处理的我脖子疼[哭] + +那么在处理冲突的时候 保留谁的代码,删点谁的代码呢? + +我一定是看谁 代码逻辑和题解一致,代码风格好,注释友好,就保留谁的。 + +所以例如当你想提交Java代码的时候,即使发现该题解已经有Java版本了,只要你的代码写的好,一样可以提交,我评审合格一样可以合入代码库。 + + +### 不要做额外修改 + +确保这种额外文件不要提交。 + +
+ +还有添加不同方法的时候,直接用正文格式写,哪种方法就可以了,不要添加目录 ,例如这样,这样整篇文章目录结构就有影响了。 + +
+ +前面不要加 `## 前序遍历(迭代法)`,直接写`前序遍历(迭代法)`就可以了。 + +当然这里也没有给代码块标记上对应的语言,应该是 + +\`\`\` Go +Go语言代码 +\`\`\` + + +## 对代码保持敬畏 + +有的录友甚至提交的代码并不是本题的代码,虽然我是鼓励大家提交代码的,但是大家贡献代码的时候也要对 自己的代码有敬畏之心,自己的代码是要给很多读者看的。 + +* 代码运行无误 +* 写的够不够简洁 +* 注释清不清晰 +* 备注规不规范 + +这也是培养大家以后协调工作的一种能力。 + +## 优化 + +目前 leetcode-master中大部分题解已经补充了其他语言,但如果你发现了可以优化的地方,依然可以提交PR来优化。 + +甚至发现哪里有语病,也欢迎提交PR来修改,例如下面:就是把【下表】 纠正为【下标】 + +
+ +不用非要写出牛逼的代码才能提交PR,只要发现 文章中有任何问题,或者错别字,都欢迎提交PR,成为contributor。 + +
+ +## 特别注意 + +git add之前,要git diff 查看一下,本次提交所修改的代码是不是 自己修改的,是否 误删,或者误加的文件。 + +提交代码,不要使用git push -f 这种命令,要足够了解 -f 意味着什么。 + + + diff --git "a/problems/qita/\345\217\202\344\270\216\346\234\254\351\241\271\347\233\256.md" "b/problems/qita/\345\217\202\344\270\216\346\234\254\351\241\271\347\233\256.md" deleted file mode 100644 index 76a2c61e8a..0000000000 --- "a/problems/qita/\345\217\202\344\270\216\346\234\254\351\241\271\347\233\256.md" +++ /dev/null @@ -1,15 +0,0 @@ - -优化已有代码 -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210821161813.png) - -**push代码之前 一定要 先pull最新代码**,否则提交的pr可能会有删除其他录友代码的操作。 - -一个pr 不要修改过多文件,因为一旦有一个 文件修改有问题,就不能合入,影响其他文件的合入了。 - -git add之前,要git diff 查看一下,本次提交所修改的代码是不是 自己修改的,是否 误删,或者误加的文件。 - -提交代码,不要使用git push -f 这种命令,要足够了解 -f 意味着什么。 - - -不用非要写出牛逼的代码才能提交PR,只要发现 文章中有任何问题,或者错别字,都欢迎提交PR,成为contributor。 -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210927113149.png) diff --git "a/problems/\345\211\215\345\272\217/ACM\346\250\241\345\274\217\345\246\202\344\275\225\346\236\204\345\273\272\344\272\214\345\217\211\346\240\221.md" "b/problems/\345\211\215\345\272\217/ACM\346\250\241\345\274\217\345\246\202\344\275\225\346\236\204\345\273\272\344\272\214\345\217\211\346\240\221.md" index b64464031f..48781eda88 100644 --- "a/problems/\345\211\215\345\272\217/ACM\346\250\241\345\274\217\345\246\202\344\275\225\346\236\204\345\273\272\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/\345\211\215\345\272\217/ACM\346\250\241\345\274\217\345\246\202\344\275\225\346\236\204\345\273\272\344\272\214\345\217\211\346\240\221.md" @@ -1,6 +1,8 @@ # 力扣上如何自己构造二叉树输入用例? +**这里给大家推荐ACM模式练习网站**:[kamacoder.com](https://kamacoder.com),把上面的题目刷完,ACM模式就没问题了。 + 经常有录友问,二叉树的题目中输入用例在ACM模式下应该怎么构造呢? 力扣上的题目,输入用例就给了一个数组,怎么就能构造成二叉树呢? diff --git "a/problems/\345\211\215\345\272\217/\344\273\200\344\271\210\346\230\257\346\240\270\345\277\203\344\273\243\347\240\201\346\250\241\345\274\217\357\274\214\344\273\200\344\271\210\345\217\210\346\230\257ACM\346\250\241\345\274\217\357\274\237.md" "b/problems/\345\211\215\345\272\217/\344\273\200\344\271\210\346\230\257\346\240\270\345\277\203\344\273\243\347\240\201\346\250\241\345\274\217\357\274\214\344\273\200\344\271\210\345\217\210\346\230\257ACM\346\250\241\345\274\217\357\274\237.md" index 0b9d230ff9..0012f88e67 100644 --- "a/problems/\345\211\215\345\272\217/\344\273\200\344\271\210\346\230\257\346\240\270\345\277\203\344\273\243\347\240\201\346\250\241\345\274\217\357\274\214\344\273\200\344\271\210\345\217\210\346\230\257ACM\346\250\241\345\274\217\357\274\237.md" +++ "b/problems/\345\211\215\345\272\217/\344\273\200\344\271\210\346\230\257\346\240\270\345\277\203\344\273\243\347\240\201\346\250\241\345\274\217\357\274\214\344\273\200\344\271\210\345\217\210\346\230\257ACM\346\250\241\345\274\217\357\274\237.md" @@ -5,6 +5,10 @@ 什么是ACM输入模式呢? 就是自己构造输入数据格式,把要需要处理的容器填充好,OJ不会给你任何代码,包括include哪些函数都要自己写,最后也要自己控制返回数据的格式。 + +**这里给大家推荐ACM模式练习网站**:[kamacoder.com](https://kamacoder.com),把上面的题目刷完,ACM模式就没问题了。 + + 而力扣上是核心代码模式,就是把要处理的数据都已经放入容器里,可以直接写逻辑,例如这样: ```CPP diff --git "a/problems/\345\211\215\345\272\217/\344\273\243\347\240\201\351\243\216\346\240\274.md" "b/problems/\345\211\215\345\272\217/\344\273\243\347\240\201\351\243\216\346\240\274.md" index b508346080..8fd8b40ca9 100644 --- "a/problems/\345\211\215\345\272\217/\344\273\243\347\240\201\351\243\216\346\240\274.md" +++ "b/problems/\345\211\215\345\272\217/\344\273\243\347\240\201\351\243\216\346\240\274.md" @@ -29,7 +29,7 @@ 这里我简单说一说规范问题。 -**权威的C++规范以Google为主**,我给大家下载了一份中文版本,在公众号「代码随想录」后台回复:googlec++编程规范,就可以领取。(涉及到微信后台的回复,没更改) +**权威的C++规范以Google为主**,我给大家下载了一份中文版本,在公众号「代码随想录」后台回复:编程规范,就可以领取。 **具体的规范要以自己团队风格为主**,融入团队才是最重要的。 From 7ee623f4da4e6615f867d2456a6ec174362f0100 Mon Sep 17 00:00:00 2001 From: han Date: Thu, 27 Jul 2023 16:27:19 +0800 Subject: [PATCH 2183/3019] =?UTF-8?q?=E6=B7=BB=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=86=20Ruby?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...04\347\232\204\344\272\244\351\233\206.md" | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git "a/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" "b/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" index 8daf5a35ba..26a9286dc9 100644 --- "a/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" +++ "b/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" @@ -465,6 +465,25 @@ object Solution { } ``` + +###Ruby +```ruby +def intersection(nums1, nums2) + hash = {} + result = {} + + nums1.each do |num| + hash[num] = 1 if hash[num].nil? + end + + nums2.each do |num| + #取nums1和nums2交集 + result[num] = 1 if hash[num] != nil + end + + return result.keys +end +``` ## 相关题目 * [350.两个数组的交集 II](https://leetcode.cn/problems/intersection-of-two-arrays-ii/) From c6cf76bc00dfcb53a89115fe58ce0dde99390a53 Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Fri, 28 Jul 2023 10:31:10 +0800 Subject: [PATCH 2184/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20=E6=8E=92?= =?UTF-8?q?=E7=89=88=E6=A0=BC=E5=BC=8F=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...44\346\225\260\344\271\213\345\222\214.md" | 3 +- ...73\351\231\244\345\205\203\347\264\240.md" | 9 ++- ...47\345\255\220\345\272\217\345\222\214.md" | 14 ++-- ...72\346\227\213\347\237\251\351\230\265.md" | 2 +- ...\346\227\213\347\237\251\351\230\265II.md" | 2 +- ...15\345\220\214\350\267\257\345\276\204.md" | 4 +- ...\345\220\214\350\267\257\345\276\204II.md" | 4 +- "problems/0090.\345\255\220\351\233\206II.md" | 1 + ...11\346\220\234\347\264\242\346\240\221.md" | 4 +- ...14\347\232\204\345\215\225\350\257\215.md" | 3 +- ...\344\275\263\346\227\266\346\234\272IV.md" | 1 - ...7.\345\271\277\346\220\234\347\211\210.md" | 2 +- ...3.\347\247\273\345\212\250\351\233\266.md" | 1 + ...11\346\216\222\350\241\214\347\250\213.md" | 3 +- ...64\346\225\260\346\213\206\345\210\206.md" | 5 +- ...11\345\222\214\345\255\220\351\233\206.md" | 3 +- ...\345\244\247\345\205\203\347\264\240II.md" | 1 - ...66\344\272\214\345\217\211\346\240\221.md" | 3 +- ...00\345\244\247\351\235\242\347\247\257.md" | 23 +++--- ...14\345\210\206\346\237\245\346\211\276.md" | 5 +- ...53\346\211\213\347\273\255\350\264\271.md" | 5 +- ...75\347\232\204\350\267\257\345\276\204.md" | 11 +-- ...47\344\272\272\345\267\245\345\262\233.md" | 7 +- ...04\345\255\227\347\254\246\344\270\262.md" | 7 +- ...55\345\277\203\350\212\202\347\202\271.md" | 3 +- ...30\345\234\250\350\267\257\345\276\204.md" | 1 + ...11\346\255\245\351\223\272\345\236\253.md" | 1 - ...54\345\255\227\347\254\246\344\270\262.md" | 5 +- ...22\346\200\273\347\273\223\347\257\207.md" | 3 +- ...50\346\234\253\346\200\273\347\273\223.md" | 2 + ...37\345\210\227\346\200\273\347\273\223.md" | 1 + ...06\350\256\262\350\247\243\357\274\211.md" | 3 +- ...27\346\263\225\346\250\241\346\235\277.md" | 73 ++++++++++--------- ...47\241\20001\350\203\214\345\214\205-2.md" | 2 + ...50\346\200\273\347\273\223\347\257\207.md" | 1 + 35 files changed, 116 insertions(+), 102 deletions(-) diff --git "a/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" "b/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" index bf1e173ec6..712bc3f0df 100644 --- "a/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" @@ -318,7 +318,7 @@ function twoSum(nums: number[], target: number): number[] { }; ``` -### php: +### PhP: ```php function twoSum(array $nums, int $target): array @@ -501,3 +501,4 @@ int* twoSum(int* nums, int numsSize, int target, int* returnSize){ + diff --git "a/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" "b/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" index ce9eccf00b..40ee3a2eae 100644 --- "a/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" +++ "b/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" @@ -152,10 +152,10 @@ public: ## 相关题目推荐 -* 26.删除排序数组中的重复项 -* 283.移动零 -* 844.比较含退格的字符串 -* 977.有序数组的平方 +* [26.删除排序数组中的重复项](https://leetcode.cn/problems/remove-duplicates-from-sorted-array/) +* [283.移动零](https://leetcode.cn/problems/move-zeroes/) +* [844.比较含退格的字符串](https://leetcode.cn/problems/backspace-string-compare/) +* [977.有序数组的平方](https://leetcode.cn/problems/squares-of-a-sorted-array/) ## 其他语言版本 @@ -444,3 +444,4 @@ public class Solution { + diff --git "a/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" "b/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" index fe4e4ed3e7..639c54bc7e 100644 --- "a/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" +++ "b/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" @@ -16,11 +16,13 @@ - 输出: 6 - 解释:  连续子数组  [4,-1,2,1] 的和最大,为  6。 -# 视频讲解 +## 算法公开课 -**《代码随想录》算法视频公开课:[贪心算法的巧妙需要慢慢体会!LeetCode:53. 最大子序和](https://www.bilibili.com/video/BV1aY4y1Z7ya),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[贪心算法的巧妙需要慢慢体会!LeetCode:53. 最大子序和](https://www.bilibili.com/video/BV1aY4y1Z7ya),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 -## 暴力解法 +## 思路 + +### 暴力解法 暴力解法的思路,第一层 for 就是设置起始位置,第二层 for 循环遍历数组寻找最大值 @@ -48,7 +50,7 @@ public: 以上暴力的解法 C++勉强可以过,其他语言就不确定了。 -## 贪心解法 +### 贪心解法 **贪心贪的是哪里呢?** @@ -104,7 +106,7 @@ public: 当然题目没有说如果数组为空,应该返回什么,所以数组为空的话返回啥都可以了。 -## 常见误区 +### 常见误区 误区一: @@ -122,7 +124,7 @@ public: 其实并不会,因为还有一个变量 result 一直在更新 最大的连续和,只要有更大的连续和出现,result 就更新了,那么 result 已经把 4 更新了,后面 连续和变成 3,也不会对最后结果有影响。 -## 动态规划 +### 动态规划 当然本题还可以用动态规划来做,在代码随想录动态规划章节我会详细介绍,如果大家想在想看,可以直接跳转:[动态规划版本详解](https://programmercarl.com/0053.%E6%9C%80%E5%A4%A7%E5%AD%90%E5%BA%8F%E5%92%8C%EF%BC%88%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92%EF%BC%89.html#%E6%80%9D%E8%B7%AF) diff --git "a/problems/0054.\350\236\272\346\227\213\347\237\251\351\230\265.md" "b/problems/0054.\350\236\272\346\227\213\347\237\251\351\230\265.md" index a38e8237b9..d855f1a166 100644 --- "a/problems/0054.\350\236\272\346\227\213\347\237\251\351\230\265.md" +++ "b/problems/0054.\350\236\272\346\227\213\347\237\251\351\230\265.md" @@ -6,7 +6,7 @@ -## 54.螺旋矩阵 +# 54.螺旋矩阵 [力扣题目链接](https://leetcode.cn/problems/spiral-matrix/) diff --git "a/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" "b/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" index 73e9e4daea..78d9385a23 100644 --- "a/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" +++ "b/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" @@ -688,7 +688,7 @@ public class Solution { } ``` -### Ruby#: +### Ruby: ```ruby def generate_matrix(n) result = Array.new(n) { Array.new(n, 0) } diff --git "a/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" "b/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" index 5111e30e10..985c7575af 100644 --- "a/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" +++ "b/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" @@ -50,9 +50,9 @@ * 1 <= m, n <= 100 * 题目数据保证答案小于等于 2 * 10^9 -# 算法公开课 +## 算法公开课 -**《代码随想录》算法视频公开课:[动态规划中如何初始化很重要!| LeetCode:62.不同路径](https://www.bilibili.com/video/BV1ve4y1x7Eu/),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[动态规划中如何初始化很重要!| LeetCode:62.不同路径](https://www.bilibili.com/video/BV1ve4y1x7Eu/),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 ## 思路 diff --git "a/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" "b/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" index cb305b4189..3d243a7a8f 100644 --- "a/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" +++ "b/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" @@ -46,9 +46,9 @@ * 1 <= m, n <= 100 * obstacleGrid[i][j] 为 0 或 1 -# 算法公开课 +## 算法公开课 -**《代码随想录》算法视频公开课:[动态规划,这次遇到障碍了| LeetCode:63. 不同路径 II](https://www.bilibili.com/video/BV1Ld4y1k7c6/),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[动态规划,这次遇到障碍了| LeetCode:63. 不同路径 II](https://www.bilibili.com/video/BV1Ld4y1k7c6/),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 ## 思路 diff --git "a/problems/0090.\345\255\220\351\233\206II.md" "b/problems/0090.\345\255\220\351\233\206II.md" index 88c8bdade6..13080cd9e7 100644 --- "a/problems/0090.\345\255\220\351\233\206II.md" +++ "b/problems/0090.\345\255\220\351\233\206II.md" @@ -3,6 +3,7 @@

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+ # 90.子集II [力扣题目链接](https://leetcode.cn/problems/subsets-ii/) diff --git "a/problems/0096.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0096.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" index 368a5747b1..8d58cc5a87 100644 --- "a/problems/0096.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" +++ "b/problems/0096.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" @@ -16,9 +16,9 @@ ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210113161941835.png) -# 算法公开课 +## 算法公开课 -**《代码随想录》算法视频公开课:[动态规划找到子状态之间的关系很重要!| LeetCode:96.不同的二叉搜索树](https://www.bilibili.com/video/BV1eK411o7QA/),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[动态规划找到子状态之间的关系很重要!| LeetCode:96.不同的二叉搜索树](https://www.bilibili.com/video/BV1eK411o7QA/),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 ## 思路 diff --git "a/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" "b/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" index 19ccb725a0..f0ff674636 100644 --- "a/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" +++ "b/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" @@ -433,7 +433,7 @@ class Solution { } ``` -### python: +### Python: (版本一)先删除空白,然后整个反转,最后单词反转。 **因为字符串是不可变类型,所以反转单词的时候,需要将其转换成列表,然后通过join函数再将其转换成列表,所以空间复杂度不是O(1)** @@ -974,4 +974,3 @@ char * reverseWords(char * s){ - diff --git "a/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" "b/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" index d4dc769893..e4c5c48400 100644 --- "a/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" +++ "b/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" @@ -529,4 +529,3 @@ impl Solution { - diff --git "a/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\345\271\277\346\220\234\347\211\210.md" "b/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\345\271\277\346\220\234\347\211\210.md" index c20fe4f1aa..cd3ae70d71 100644 --- "a/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\345\271\277\346\220\234\347\211\210.md" +++ "b/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\345\271\277\346\220\234\347\211\210.md" @@ -197,7 +197,6 @@ class Solution { } ``` -## 其他语言版本 ### Python BFS solution ```python @@ -244,3 +243,4 @@ class Solution: ``` + diff --git "a/problems/0283.\347\247\273\345\212\250\351\233\266.md" "b/problems/0283.\347\247\273\345\212\250\351\233\266.md" index ee3f429150..42232cc0c6 100644 --- "a/problems/0283.\347\247\273\345\212\250\351\233\266.md" +++ "b/problems/0283.\347\247\273\345\212\250\351\233\266.md" @@ -3,6 +3,7 @@

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+ # 283. 移动零:动态规划:一样的套路,再求一次完全平方数 [力扣题目链接](https://leetcode.cn/problems/move-zeroes/) diff --git "a/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" "b/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" index 3798b48d87..2795e31384 100644 --- "a/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" +++ "b/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" @@ -31,7 +31,7 @@ ## 算法公开课 -**如果对回溯算法基础还不了解的话,我还特意录制了一期视频,[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[带你学透回溯算法(理论篇)](https://www.bilibili.com/video/BV1cy4y167mM/)** 可以结合题解和视频一起看,希望对大家理解回溯算法有所帮助。 +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[带你学透回溯算法(理论篇)](https://www.bilibili.com/video/BV1cy4y167mM/) ,相信结合视频再看本篇题解,更有助于大家对本题的理解。** ## 思路 @@ -793,4 +793,3 @@ impl Solution { - diff --git "a/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" "b/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" index 3ff8dedb03..cba82f6cae 100644 --- "a/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" +++ "b/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" @@ -22,9 +22,9 @@ * 说明: 你可以假设 n 不小于 2 且不大于 58。 -# 算法公开课 +## 算法公开课 -**《代码随想录》算法视频公开课:[动态规划,本题关键在于理解递推公式!| LeetCode:343. 整数拆分](https://www.bilibili.com/video/BV1Mg411q7YJ/),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[动态规划,本题关键在于理解递推公式!| LeetCode:343. 整数拆分](https://www.bilibili.com/video/BV1Mg411q7YJ/),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 ## 思路 @@ -473,3 +473,4 @@ object Solution { + diff --git "a/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" "b/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" index 0657c010bb..2b2be1037d 100644 --- "a/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" +++ "b/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" @@ -4,7 +4,7 @@

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

-## 416. 分割等和子集 +# 416. 分割等和子集 [力扣题目链接](https://leetcode.cn/problems/partition-equal-subset-sum/) @@ -730,4 +730,3 @@ object Solution { - diff --git "a/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" "b/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" index 023e4d7e0e..d211a68072 100644 --- "a/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" +++ "b/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" @@ -294,4 +294,3 @@ impl Solution { - diff --git "a/problems/0617.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md" "b/problems/0617.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md" index 44092aaebc..18839a2638 100644 --- "a/problems/0617.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0617.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md" @@ -19,7 +19,7 @@ 注意: 合并必须从两个树的根节点开始。 -# 算法公开课 +## 算法公开课 **[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[一起操作两个二叉树?有点懵!| LeetCode:617.合并二叉树](https://www.bilibili.com/video/BV1m14y1Y7JK),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 @@ -793,3 +793,4 @@ impl Solution { + diff --git "a/problems/0695.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" "b/problems/0695.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" index 37a601bcf8..186f044c40 100644 --- "a/problems/0695.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" +++ "b/problems/0695.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" @@ -22,7 +22,7 @@ * 输出:6 * 解释:答案不应该是 11 ,因为岛屿只能包含水平或垂直这四个方向上的 1 。 -# 思路 +## 思路 注意题目中每座岛屿只能由**水平方向和/或竖直方向上**相邻的陆地连接形成。 @@ -38,7 +38,7 @@ * [DFS理论基础](https://programmercarl.com/图论深搜理论基础.html) * [BFS理论基础](https://programmercarl.com/图论广搜理论基础.html) -## DFS +### DFS 很多同学,写dfs其实也是凭感觉来,有的时候dfs函数中写终止条件才能过,有的时候 dfs函数不写终止添加也能过! @@ -134,7 +134,7 @@ public: 以上两种写法的区别,我在题解: [DFS,BDF 你没注意的细节都给你列出来了!LeetCode:200. 岛屿数量](https://leetcode.cn/problems/number-of-islands/solution/by-carlsun-2-n72a/)做了详细介绍。 -## BFS +### BFS 关于广度优先搜索,如果大家还不了解的话,看这里:[广度优先搜索精讲](https://programmercarl.com/图论广搜理论基础.html) @@ -188,9 +188,9 @@ public: ``` -# 其它语言版本 -## Java -### DFS +## 其它语言版本 +### Java +#### DFS ```java // DFS class Solution { @@ -236,7 +236,7 @@ class Solution { ``` -### BFS +#### BFS ```java //BFS class Solution { @@ -290,7 +290,7 @@ class Solution { } } ``` -### DFS 優化(遇到島嶼後,就把他淹沒) +#### DFS 優化(遇到島嶼後,就把他淹沒) ```java //这里使用深度优先搜索 DFS 来完成本道题目。我们使用 DFS 计算一个岛屿的面积,同时维护计算过的最大的岛屿面积。同时,为了避免对岛屿重复计算,我们在 DFS 的时候对岛屿进行 “淹没” 操作,即将岛屿所占的地方置为 0。 public int maxAreaOfIsland(int[][] grid) { @@ -319,8 +319,8 @@ public int dfs(int[][] grid,int i,int j){ } ``` -## Python -### BFS +### Python +#### BFS ```python class Solution: def __init__(self): @@ -359,7 +359,7 @@ class Solution: self.count += 1 queue.append((new_x, new_y)) ``` -### DFS +#### DFS ```python class Solution: def __init__(self): @@ -394,3 +394,4 @@ class Solution: + diff --git "a/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" "b/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" index 52abf57851..2fc754bb4e 100644 --- "a/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" +++ "b/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" @@ -150,8 +150,8 @@ public: * [35.搜索插入位置](https://programmercarl.com/0035.搜索插入位置.html) * [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.有效的完全平方数 +* [69.x 的平方根](https://leetcode.cn/problems/sqrtx/) +* [367.有效的完全平方数](https://leetcode.cn/problems/valid-perfect-square/) @@ -766,3 +766,4 @@ object Solution { + diff --git "a/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271.md" "b/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271.md" index 52b2be3bcc..db39864908 100644 --- "a/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271.md" +++ "b/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271.md" @@ -39,7 +39,7 @@ 本题相对于[贪心算法:122.买卖股票的最佳时机II](https://programmercarl.com/0122.买卖股票的最佳时机II.html),多添加了一个条件就是手续费。 -## 贪心算法 +### 贪心算法 在[贪心算法:122.买卖股票的最佳时机II](https://programmercarl.com/0122.买卖股票的最佳时机II.html)中使用贪心策略不用关心具体什么时候买卖,只要收集每天的正利润,最后稳稳的就是最大利润了。 @@ -93,7 +93,7 @@ public: 大家也可以发现,情况三,那块代码是可以删掉的,我是为了让代码表达清晰,所以没有精简。 -## 动态规划 +### 动态规划 我在公众号「代码随想录」里将在下一个系列详细讲解动态规划,所以本题解先给出我的C++代码(带详细注释),感兴趣的同学可以自己先学习一下。 @@ -364,3 +364,4 @@ object Solution { + diff --git "a/problems/0797.\346\211\200\346\234\211\345\217\257\350\203\275\347\232\204\350\267\257\345\276\204.md" "b/problems/0797.\346\211\200\346\234\211\345\217\257\350\203\275\347\232\204\350\267\257\345\276\204.md" index 2ea4ae4760..ec8288c608 100644 --- "a/problems/0797.\346\211\200\346\234\211\345\217\257\350\203\275\347\232\204\350\267\257\345\276\204.md" +++ "b/problems/0797.\346\211\200\346\234\211\345\217\257\350\203\275\347\232\204\350\267\257\345\276\204.md" @@ -149,7 +149,7 @@ public: ``` -# 总结 +## 总结 本题是比较基础的深度优先搜索模板题,这种有向图路径问题,最合适使用深搜,当然本题也可以使用广搜,但广搜相对来说就麻烦了一些,需要记录一下路径。 @@ -159,7 +159,7 @@ public: ## 其他语言版本 -Java +### Java ```Java // 深度优先遍历 @@ -190,7 +190,8 @@ class Solution { } ``` -Python +### Python + ```python class Solution: def __init__(self): @@ -216,9 +217,9 @@ class Solution: self.path.pop() # 回溯 ``` -### Go + +

- diff --git "a/problems/0827.\346\234\200\345\244\247\344\272\272\345\267\245\345\262\233.md" "b/problems/0827.\346\234\200\345\244\247\344\272\272\345\267\245\345\262\233.md" index 9112fabde2..d78798253a 100644 --- "a/problems/0827.\346\234\200\345\244\247\344\272\272\345\267\245\345\262\233.md" +++ "b/problems/0827.\346\234\200\345\244\247\344\272\272\345\267\245\345\262\233.md" @@ -29,7 +29,7 @@ * 输出: 4 * 解释: 没有0可以让我们变成1,面积依然为 4。 -# 思路 +## 思路 本题的一个暴力想法,应该是遍历地图尝试 将每一个 0 改成1,然后去搜索地图中的最大的岛屿面积。 @@ -219,9 +219,9 @@ public: }; ``` -# 其他语言版本 +## 其他语言版本 -## Java +### Java ```Java class Solution { @@ -286,4 +286,3 @@ class Solution { - diff --git "a/problems/0844.\346\257\224\350\276\203\345\220\253\351\200\200\346\240\274\347\232\204\345\255\227\347\254\246\344\270\262.md" "b/problems/0844.\346\257\224\350\276\203\345\220\253\351\200\200\346\240\274\347\232\204\345\255\227\347\254\246\344\270\262.md" index ac56f6f990..c7f5220288 100644 --- "a/problems/0844.\346\257\224\350\276\203\345\220\253\351\200\200\346\240\274\347\232\204\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/0844.\346\257\224\350\276\203\345\220\253\351\200\200\346\240\274\347\232\204\345\255\227\347\254\246\344\270\262.md" @@ -38,7 +38,7 @@ 本文将给出 空间复杂度O(n)的栈模拟方法 以及空间复杂度是O(1)的双指针方法。 -## 普通方法(使用栈的思路) +### 普通方法(使用栈的思路) 这道题目一看就是要使用栈的节奏,这种匹配(消除)问题也是栈的擅长所在,跟着一起刷题的同学应该知道,在[栈与队列:匹配问题都是栈的强项](https://programmercarl.com/1047.删除字符串中的所有相邻重复项.html),我就已经提过了一次使用栈来做类似的事情了。 @@ -100,7 +100,7 @@ public: * 时间复杂度:O(n + m) * 空间复杂度:O(n + m) -## 优化方法(从后向前双指针) +### 优化方法(从后向前双指针) 当然还可以有使用 O(1) 的空间复杂度来解决该问题。 @@ -289,7 +289,7 @@ class Solution { } ``` -### python +### Python ```python class Solution: @@ -591,3 +591,4 @@ impl Solution { + diff --git "a/problems/1791.\346\211\276\345\207\272\346\230\237\345\236\213\345\233\276\347\232\204\344\270\255\345\277\203\350\212\202\347\202\271.md" "b/problems/1791.\346\211\276\345\207\272\346\230\237\345\236\213\345\233\276\347\232\204\344\270\255\345\277\203\350\212\202\347\202\271.md" index d44c14769e..9bcc7ef9ca 100644 --- "a/problems/1791.\346\211\276\345\207\272\346\230\237\345\236\213\345\233\276\347\232\204\344\270\255\345\277\203\350\212\202\347\202\271.md" +++ "b/problems/1791.\346\211\276\345\207\272\346\230\237\345\236\213\345\233\276\347\232\204\344\270\255\345\277\203\350\212\202\347\202\271.md" @@ -3,6 +3,7 @@

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+ # 1791.找出星型图的中心节点 [题目链接](https://leetcode.cn/problems/find-center-of-star-graph/) @@ -55,7 +56,7 @@ public: return -1; } }; -``` +``` 以上代码中没有使用 unordered_map,因为遍历的时候,开辟新空间会浪费时间,而采用 vector,这是 空间换时间的一种策略。 diff --git "a/problems/1971.\345\257\273\346\211\276\345\233\276\344\270\255\346\230\257\345\220\246\345\255\230\345\234\250\350\267\257\345\276\204.md" "b/problems/1971.\345\257\273\346\211\276\345\233\276\344\270\255\346\230\257\345\220\246\345\255\230\345\234\250\350\267\257\345\276\204.md" index 5f1d894333..29e50ab8b0 100644 --- "a/problems/1971.\345\257\273\346\211\276\345\233\276\344\270\255\346\230\257\345\220\246\345\255\230\345\234\250\350\267\257\345\276\204.md" +++ "b/problems/1971.\345\257\273\346\211\276\345\233\276\344\270\255\346\230\257\345\220\246\345\255\230\345\234\250\350\267\257\345\276\204.md" @@ -138,3 +138,4 @@ public: + diff --git "a/problems/\344\270\272\344\272\206\347\273\235\346\235\200\347\274\226\350\276\221\350\267\235\347\246\273\357\274\214\345\215\241\345\260\224\345\201\232\344\272\206\344\270\211\346\255\245\351\223\272\345\236\253.md" "b/problems/\344\270\272\344\272\206\347\273\235\346\235\200\347\274\226\350\276\221\350\267\235\347\246\273\357\274\214\345\215\241\345\260\224\345\201\232\344\272\206\344\270\211\346\255\245\351\223\272\345\236\253.md" index 50287ce20b..1982d44943 100644 --- "a/problems/\344\270\272\344\272\206\347\273\235\346\235\200\347\274\226\350\276\221\350\267\235\347\246\273\357\274\214\345\215\241\345\260\224\345\201\232\344\272\206\344\270\211\346\255\245\351\223\272\345\236\253.md" +++ "b/problems/\344\270\272\344\272\206\347\273\235\346\235\200\347\274\226\350\276\221\350\267\235\347\246\273\357\274\214\345\215\241\345\260\224\345\201\232\344\272\206\344\270\211\346\255\245\351\223\272\345\236\253.md" @@ -200,4 +200,3 @@ class Solution { - diff --git "a/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" "b/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" index 008b7915c3..a3fb7ab330 100644 --- "a/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" @@ -142,7 +142,7 @@ class Solution { } ``` -### python: +### Python: (版本一)使用切片 ```python @@ -338,7 +338,7 @@ func reverseString(_ s: inout [Character], startIndex: Int, endIndex: Int) { ``` -### PHP +### PHP: ```php function reverseLeftWords($s, $n) { @@ -418,4 +418,3 @@ impl Solution { - diff --git "a/problems/\345\212\250\346\200\201\350\247\204\345\210\222\346\200\273\347\273\223\347\257\207.md" "b/problems/\345\212\250\346\200\201\350\247\204\345\210\222\346\200\273\347\273\223\347\257\207.md" index c86376d349..e28bfd0472 100644 --- "a/problems/\345\212\250\346\200\201\350\247\204\345\210\222\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/\345\212\250\346\200\201\350\247\204\345\210\222\346\200\273\347\273\223\347\257\207.md" @@ -40,7 +40,7 @@ 好啦,我们再一起回顾一下,动态规划专题中我们都讲了哪些内容。 -## 动划基础 +## 动态规划基础 * [关于动态规划,你该了解这些!](https://programmercarl.com/动态规划理论基础.html) * [动态规划:斐波那契数](https://programmercarl.com/0509.斐波那契数.html) @@ -136,4 +136,3 @@ - diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20201030\345\233\236\346\272\257\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20201030\345\233\236\346\272\257\345\221\250\346\234\253\346\200\273\347\273\223.md" index 6127016111..7f6fd114b4 100644 --- "a/problems/\345\221\250\346\200\273\347\273\223/20201030\345\233\236\346\272\257\345\221\250\346\234\253\346\200\273\347\273\223.md" +++ "b/problems/\345\221\250\346\200\273\347\273\223/20201030\345\233\236\346\272\257\345\221\250\346\234\253\346\200\273\347\273\223.md" @@ -9,6 +9,8 @@ -------------------------- +# 本周小结!(回溯算法系列一) + ## 周一 本周我们正式开始了回溯算法系列,那么首先当然是概述。 diff --git "a/problems/\346\240\210\344\270\216\351\230\237\345\210\227\346\200\273\347\273\223.md" "b/problems/\346\240\210\344\270\216\351\230\237\345\210\227\346\200\273\347\273\223.md" index 31ce955489..e7f8ef86c6 100644 --- "a/problems/\346\240\210\344\270\216\351\230\237\345\210\227\346\200\273\347\273\223.md" +++ "b/problems/\346\240\210\344\270\216\351\230\237\345\210\227\346\200\273\347\273\223.md" @@ -3,6 +3,7 @@

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+ # 栈与队列总结篇 ## 栈与队列的理论基础 diff --git "a/problems/\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227\357\274\210vector\345\216\237\347\220\206\350\256\262\350\247\243\357\274\211.md" "b/problems/\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227\357\274\210vector\345\216\237\347\220\206\350\256\262\350\247\243\357\274\211.md" index fdb4f58ba4..4291c80c72 100644 --- "a/problems/\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227\357\274\210vector\345\216\237\347\220\206\350\256\262\350\247\243\357\274\211.md" +++ "b/problems/\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227\357\274\210vector\345\216\237\347\220\206\350\256\262\350\247\243\357\274\211.md" @@ -196,7 +196,7 @@ impl Solution{ } ``` -### Go: +### Go Go中slice的`append`操作和C++中vector的扩容机制基本相同。 @@ -213,4 +213,3 @@ Go中slice的`append`操作和C++中vector的扩容机制基本相同。 - diff --git "a/problems/\347\256\227\346\263\225\346\250\241\346\235\277.md" "b/problems/\347\256\227\346\263\225\346\250\241\346\235\277.md" index 59de69dfd7..21b7f93b1c 100644 --- "a/problems/\347\256\227\346\263\225\346\250\241\346\235\277.md" +++ "b/problems/\347\256\227\346\263\225\346\250\241\346\235\277.md" @@ -3,8 +3,11 @@

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+# 算法模板 -## 二分查找法 +## 算法模板 + +### 二分查找法 ```CPP class Solution { @@ -29,7 +32,7 @@ public: ``` -## KMP +### KMP ```CPP void kmp(int* next, const string& s){ @@ -47,7 +50,7 @@ void kmp(int* next, const string& s){ } ``` -## 二叉树 +### 二叉树 二叉树的定义: @@ -60,7 +63,7 @@ struct TreeNode { }; ``` -### 深度优先遍历(递归) +#### 深度优先遍历(递归) 前序遍历(中左右) ```CPP @@ -90,7 +93,7 @@ void traversal(TreeNode* cur, vector& vec) { } ``` -### 深度优先遍历(迭代法) +#### 深度优先遍历(迭代法) 相关题解:[0094.二叉树的中序遍历](https://github.com/youngyangyang04/leetcode/blob/master/problems/0094.二叉树的中序遍历.md) @@ -170,7 +173,7 @@ vector postorderTraversal(TreeNode* root) { return result; } ``` -### 广度优先遍历(队列) +#### 广度优先遍历(队列) 相关题解:[0102.二叉树的层序遍历](https://programmercarl.com/0102.二叉树的层序遍历.html) @@ -208,7 +211,7 @@ vector> levelOrder(TreeNode* root) { * [0111.二叉树的最小深度(迭代法)](https://programmercarl.com/0111.二叉树的最小深度.html) * [0222.完全二叉树的节点个数(迭代法)](https://programmercarl.com/0222.完全二叉树的节点个数.html) -### 二叉树深度 +#### 二叉树深度 ```CPP int getDepth(TreeNode* node) { @@ -217,7 +220,7 @@ int getDepth(TreeNode* node) { } ``` -### 二叉树节点数量 +#### 二叉树节点数量 ```CPP int countNodes(TreeNode* root) { @@ -226,7 +229,7 @@ int countNodes(TreeNode* root) { } ``` -## 回溯算法 +### 回溯算法 ```CPP void backtracking(参数) { if (终止条件) { @@ -243,7 +246,7 @@ void backtracking(参数) { ``` -## 并查集 +### 并查集 ```CPP int n = 1005; // 根据题意而定 @@ -278,9 +281,9 @@ void backtracking(参数) { (持续补充ing) ## 其他语言版本 -JavaScript: +### JavaScript: -## 二分查找法 +#### 二分查找法 使用左闭右闭区间 @@ -322,7 +325,7 @@ var search = function (nums, target) { }; ``` -## KMP +#### KMP ```javascript var kmp = function (next, s) { @@ -340,9 +343,9 @@ var kmp = function (next, s) { } ``` -## 二叉树 +#### 二叉树 -### 深度优先遍历(递归) +##### 深度优先遍历(递归) 二叉树节点定义: @@ -387,7 +390,7 @@ var postorder = function (root, list) { } ``` -### 深度优先遍历(迭代) +##### 深度优先遍历(迭代) 前序遍历(中左右): @@ -447,7 +450,7 @@ var postorderTraversal = function (root) { }; ``` -### 广度优先遍历(队列) +##### 广度优先遍历(队列) ```javascript var levelOrder = function (root) { @@ -469,7 +472,7 @@ var levelOrder = function (root) { }; ``` -### 二叉树深度 +##### 二叉树深度 ```javascript var getDepth = function (node) { @@ -478,7 +481,7 @@ var getDepth = function (node) { } ``` -### 二叉树节点数量 +##### 二叉树节点数量 ```javascript var countNodes = function (root) { @@ -487,7 +490,7 @@ var countNodes = function (root) { } ``` -## 回溯算法 +#### 回溯算法 ```javascript function backtracking(参数) { @@ -505,7 +508,7 @@ function backtracking(参数) { ``` -## 并查集 +#### 并查集 ```javascript let n = 1005; // 根据题意而定 @@ -536,9 +539,9 @@ function backtracking(参数) { } ``` -TypeScript: +### TypeScript: -## 二分查找法 +#### 二分查找法 使用左闭右闭区间 @@ -580,7 +583,7 @@ var search = function (nums: number[], target: number): number { }; ``` -## KMP +#### KMP ```typescript var kmp = function (next: number[], s: number): void { @@ -598,9 +601,9 @@ var kmp = function (next: number[], s: number): void { } ``` -## 二叉树 +#### 二叉树 -### 深度优先遍历(递归) +##### 深度优先遍历(递归) 二叉树节点定义: @@ -650,7 +653,7 @@ var postorder = function (root: TreeNode | null, list: number[]): void { } ``` -### 深度优先遍历(迭代) +##### 深度优先遍历(迭代) 前序遍历(中左右): @@ -710,7 +713,7 @@ var postorderTraversal = function (root: TreeNode | null): number[] { }; ``` -### 广度优先遍历(队列) +##### 广度优先遍历(队列) ```typescript var levelOrder = function (root: TreeNode | null): number[] { @@ -732,7 +735,7 @@ var levelOrder = function (root: TreeNode | null): number[] { }; ``` -### 二叉树深度 +##### 二叉树深度 ```typescript var getDepth = function (node: TreNode | null): number { @@ -741,7 +744,7 @@ var getDepth = function (node: TreNode | null): number { } ``` -### 二叉树节点数量 +##### 二叉树节点数量 ```typescript var countNodes = function (root: TreeNode | null): number { @@ -750,7 +753,7 @@ var countNodes = function (root: TreeNode | null): number { } ``` -## 回溯算法 +#### 回溯算法 ```typescript function backtracking(参数) { @@ -768,7 +771,7 @@ function backtracking(参数) { ``` -## 并查集 +#### 并查集 ```typescript let n: number = 1005; // 根据题意而定 @@ -801,9 +804,9 @@ function backtracking(参数) { Java: +### Python: -Python: -## 二分查找法 +#### 二分查找法 ```python def binarysearch(nums, target): low = 0 @@ -823,7 +826,7 @@ def binarysearch(nums, target): return -1 ``` -## KMP +#### KMP ```python def kmp(self, a, s): diff --git "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" index 019947e536..f60e261be0 100644 --- "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" +++ "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" @@ -3,8 +3,10 @@

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+ # 动态规划:01背包理论基础(滚动数组) + ## 算法公开课 **[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[带你学透0-1背包问题!(滚动数组)](https://www.bilibili.com/video/BV1BU4y177kY/),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 diff --git "a/problems/\351\223\276\350\241\250\346\200\273\347\273\223\347\257\207.md" "b/problems/\351\223\276\350\241\250\346\200\273\347\273\223\347\257\207.md" index dacd4dee5d..3f2f5c9792 100644 --- "a/problems/\351\223\276\350\241\250\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/\351\223\276\350\241\250\346\200\273\347\273\223\347\257\207.md" @@ -3,6 +3,7 @@

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+ # 链表总结篇 From 5dc3022bc5c6aa84fdd1ce255fad723200ffe059 Mon Sep 17 00:00:00 2001 From: slaier <30682486+slaier@users.noreply.github.com> Date: Sat, 29 Jul 2023 06:48:13 +0000 Subject: [PATCH 2185/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200202=E5=BF=AB?= =?UTF-8?q?=E4=B9=90=E6=95=B0=20C=20=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...2.\345\277\253\344\271\220\346\225\260.md" | 68 ++++++++++++++----- 1 file changed, 50 insertions(+), 18 deletions(-) diff --git "a/problems/0202.\345\277\253\344\271\220\346\225\260.md" "b/problems/0202.\345\277\253\344\271\220\346\225\260.md" index 4a77e2b67c..719672a281 100644 --- "a/problems/0202.\345\277\253\344\271\220\346\225\260.md" +++ "b/problems/0202.\345\277\253\344\271\220\346\225\260.md" @@ -423,29 +423,61 @@ impl Solution { ### C: ```C -typedef struct HashNodeTag { - int key; /* num */ - struct HashNodeTag *next; -}HashNode; - -/* Calcualte the hash key */ -static inline int hash(int key, int size) { - int index = key % size; - return (index > 0) ? (index) : (-index); -} - -/* Calculate the sum of the squares of its digits*/ -static inline int calcSquareSum(int num) { - unsigned int sum = 0; - while(num > 0) { - sum += (num % 10) * (num % 10); - num = num/10; +int get_sum(int n) { + int sum = 0; + div_t n_div = { .quot = n }; + while (n_div.quot != 0) { + n_div = div(n_div.quot, 10); + sum += n_div.rem * n_div.rem; } return sum; } +// (版本1)使用数组 +bool isHappy(int n) { + // sum = a1^2 + a2^2 + ... ak^2 + // first round: + // 1 <= k <= 10 + // 1 <= sum <= 1 + 81 * 9 = 730 + // second round: + // 1 <= k <= 3 + // 1 <= sum <= 36 + 81 * 2 = 198 + // third round: + // 1 <= sum <= 81 * 2 = 162 + // fourth round: + // 1 <= sum <= 81 * 2 = 162 + + uint8_t visited[163] = { 0 }; + int sum = get_sum(get_sum(n)); + int next_n = sum; + + while (next_n != 1) { + sum = get_sum(next_n); + + if (visited[sum]) return false; + + visited[sum] = 1; + next_n = sum; + }; + + return true; +} + +// (版本2)使用快慢指针 +bool isHappy(int n) { + int slow = n; + int fast = n; + + do { + slow = get_sum(slow); + fast = get_sum(get_sum(fast)); + } while (slow != fast); + + return (fast == 1); +} +``` -Scala: +### Scala: ```scala object Solution { // 引入mutable From dca8209aaf3276ba0d639165d13a27b21a24c498 Mon Sep 17 00:00:00 2001 From: Binbin Date: Mon, 31 Jul 2023 14:17:07 +0800 Subject: [PATCH 2186/3019] Fix typos and cleanups --- .../0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" | 2 +- "problems/0383.\350\265\216\351\207\221\344\277\241.md" | 2 +- ...72\257\345\221\250\346\234\253\346\200\273\347\273\223.md" | 2 +- ...23\210\345\270\214\350\241\250\346\200\273\347\273\223.md" | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git "a/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" "b/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" index cdf33c5812..37d5614e71 100644 --- "a/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" +++ "b/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" @@ -73,7 +73,7 @@ candidates 中的数字可以无限制重复被选取。 如果是多个集合取组合,各个集合之间相互不影响,那么就不用startIndex,例如:[17.电话号码的字母组合](https://programmercarl.com/0017.电话号码的字母组合.html) -**注意以上我只是说求组合的情况,如果是排列问题,又是另一套分析的套路,后面我再讲解排列的时候就重点介绍**。 +**注意以上我只是说求组合的情况,如果是排列问题,又是另一套分析的套路,后面我在讲解排列的时候会重点介绍**。 代码如下: diff --git "a/problems/0383.\350\265\216\351\207\221\344\277\241.md" "b/problems/0383.\350\265\216\351\207\221\344\277\241.md" index c15d1ac177..3de48ce3da 100644 --- "a/problems/0383.\350\265\216\351\207\221\344\277\241.md" +++ "b/problems/0383.\350\265\216\351\207\221\344\277\241.md" @@ -68,7 +68,7 @@ public: ### 哈希解法 -因为题目所只有小写字母,那可以采用空间换取时间的哈希策略, 用一个长度为26的数组还记录magazine里字母出现的次数。 +因为题目说只有小写字母,那可以采用空间换取时间的哈希策略,用一个长度为26的数组来记录magazine里字母出现的次数。 然后再用ransomNote去验证这个数组是否包含了ransomNote所需要的所有字母。 diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20201107\345\233\236\346\272\257\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20201107\345\233\236\346\272\257\345\221\250\346\234\253\346\200\273\347\273\223.md" index 76bd331bd4..3f1d10126e 100644 --- "a/problems/\345\221\250\346\200\273\347\273\223/20201107\345\233\236\346\272\257\345\221\250\346\234\253\346\200\273\347\273\223.md" +++ "b/problems/\345\221\250\346\200\273\347\273\223/20201107\345\233\236\346\272\257\345\221\250\346\234\253\346\200\273\347\273\223.md" @@ -17,7 +17,7 @@ 如果是多个集合取组合,各个集合之间相互不影响,那么就不用startIndex,例如:[回溯算法:电话号码的字母组合](https://programmercarl.com/0017.电话号码的字母组合.html) -**注意以上我只是说求组合的情况,如果是排列问题,又是另一套分析的套路,后面我再讲解排列的时候就重点介绍**。 +**注意以上我只是说求组合的情况,如果是排列问题,又是另一套分析的套路,后面我在讲解排列的时候会重点介绍**。 最后还给出了本题的剪枝优化,如下: diff --git "a/problems/\345\223\210\345\270\214\350\241\250\346\200\273\347\273\223.md" "b/problems/\345\223\210\345\270\214\350\241\250\346\200\273\347\273\223.md" index 6750636305..465ef9d1da 100644 --- "a/problems/\345\223\210\345\270\214\350\241\250\346\200\273\347\273\223.md" +++ "b/problems/\345\223\210\345\270\214\350\241\250\346\200\273\347\273\223.md" @@ -16,7 +16,7 @@ **一般来说哈希表都是用来快速判断一个元素是否出现集合里**。 -对于哈希表,要知道**哈希函数**和**哈希碰撞**在哈希表中的作用. +对于哈希表,要知道**哈希函数**和**哈希碰撞**在哈希表中的作用。 哈希函数是把传入的key映射到符号表的索引上。 @@ -88,7 +88,7 @@ std::set和std::multiset底层实现都是红黑树,std::unordered_set的底 map是一种``的结构,本题可以用key保存数值,用value在保存数值所在的下标。所以使用map最为合适。 -C++提供如下三种map::(详情请看[关于哈希表,你该了解这些!](https://programmercarl.com/哈希表理论基础.html)) +C++提供如下三种map:(详情请看[关于哈希表,你该了解这些!](https://programmercarl.com/哈希表理论基础.html)) * std::map * std::multimap From 5bd60c95b709ee5f56399c70ea6b93bd46d38a6b Mon Sep 17 00:00:00 2001 From: Martin <87409284+martinchiu@users.noreply.github.com> Date: Mon, 31 Jul 2023 22:44:59 +0800 Subject: [PATCH 2187/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=2054.=E8=9E=BA?= =?UTF-8?q?=E6=97=8B=E7=9F=A9=E9=98=B5=20Javascript=20=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...72\346\227\213\347\237\251\351\230\265.md" | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git "a/problems/0054.\350\236\272\346\227\213\347\237\251\351\230\265.md" "b/problems/0054.\350\236\272\346\227\213\347\237\251\351\230\265.md" index d855f1a166..c62eb2b12c 100644 --- "a/problems/0054.\350\236\272\346\227\213\347\237\251\351\230\265.md" +++ "b/problems/0054.\350\236\272\346\227\213\347\237\251\351\230\265.md" @@ -200,6 +200,58 @@ class Solution { } ``` +### Javascript +``` +/** + * @param {number[][]} matrix + * @return {number[]} + */ +var spiralOrder = function(matrix) { + let m = matrix.length + let n = matrix[0].length + + let startX = startY = 0 + let i = 0 + let arr = new Array(m*n).fill(0) + let offset = 1 + let loop = mid = Math.floor(Math.min(m,n) / 2) + while (loop--) { + let row = startX + let col = startY + // --> + for (; col < n + startY - offset; col++) { + arr[i++] = matrix[row][col] + } + // down + for (; row < m + startX - offset; row++) { + arr[i++] = matrix[row][col] + } + // <-- + for (; col > startY; col--) { + arr[i++] = matrix[row][col] + } + for (; row > startX; row--) { + arr[i++] = matrix[row][col] + } + startX++ + startY++ + offset += 2 + } + if (Math.min(m, n) % 2 === 1) { + if (n > m) { + for (let j = mid; j < mid + n - m + 1; j++) { + arr[i++] = matrix[mid][j] + } + } else { + for (let j = mid; j < mid + m - n + 1; j++) { + arr[i++] = matrix[j][mid] + } + } + } + return arr +}; +``` +

From 3f428289b2d6cc2cd75b163d1127ff374f7de116 Mon Sep 17 00:00:00 2001 From: fwqaaq Date: Sat, 5 Aug 2023 15:55:18 +0800 Subject: [PATCH 2188/3019] =?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=20=E4=BB=A3=E7=A0=81=E9=87=8D=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...47\347\232\204\347\237\251\345\275\242.md" | 56 ------------------- 1 file changed, 56 deletions(-) diff --git "a/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" "b/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" index 9b76229af0..9fb6a6b061 100644 --- "a/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" +++ "b/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" @@ -725,62 +725,6 @@ impl Solution { } ``` -Rust - -双指针预处理 -```rust - -impl Solution { - pub fn largest_rectangle_area(v: Vec) -> i32 { - let n = v.len(); - let mut left_smaller_idx = vec![-1; n]; - let mut right_smaller_idx = vec![n as i32; n]; - for i in 1..n { - let mut mid = i as i32 - 1; - while mid >= 0 && v[mid as usize] >= v[i] { - mid = left_smaller_idx[mid as usize]; - } - left_smaller_idx[i] = mid; - } - for i in (0..n-1).rev() { - let mut mid = i + 1; - while mid < n && v[mid] >= v[i] { - mid = right_smaller_idx[mid] as usize; - } - right_smaller_idx[i] = mid as i32; - } - let mut res = 0; - for (idx, &e) in v.iter().enumerate() { - res = res.max((right_smaller_idx[idx] - left_smaller_idx[idx] - 1) * e); - } - dbg!(res) - } -} -``` - -单调栈 -```rust -impl Solution { - pub fn largest_rectangle_area1(mut v: Vec) -> i32 { - v.insert(0, 0); // 便于使第一个元素能够有左侧<=它的值 - v.push(0); // 便于在结束处理最后一个元素后清空残留在栈中的值 - let mut res = 0; - let mut stack = vec![]; // 递增的栈 - for (idx, &e) in v.iter().enumerate() { - while !stack.is_empty() && v[*stack.last().unwrap()] > e { - let pos = stack.pop().unwrap(); - let prev_pos = *stack.last().unwrap(); - let s = (idx - prev_pos - 1) as i32 * v[pos]; - res = res.max(s); - } - stack.push(idx); - } - res - } -} -``` - -

From dc65f95f7beecb1f6b2ecf49665b4f3a89c6c904 Mon Sep 17 00:00:00 2001 From: wisuky <48423733+wisuky@users.noreply.github.com> Date: Sat, 5 Aug 2023 17:05:35 +0800 Subject: [PATCH 2189/3019] =?UTF-8?q?Update=200001.=E4=B8=A4=E6=95=B0?= =?UTF-8?q?=E4=B9=8B=E5=92=8C.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修改错别字 --- ...001.\344\270\244\346\225\260\344\271\213\345\222\214.md" | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git "a/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" "b/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" index 712bc3f0df..4e44d0c3f6 100644 --- "a/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" @@ -37,20 +37,20 @@ [242. 有效的字母异位词](https://www.programmercarl.com/0242.有效的字母异位词.html) 这道题目是用数组作为哈希表来解决哈希问题,[349. 两个数组的交集](https://www.programmercarl.com/0349.两个数组的交集.html)这道题目是通过set作为哈希表来解决哈希问题。 -首先我在强调一下 **什么时候使用哈希法**,当我们需要查询一个元素是否出现过,或者一个元素是否在集合里的时候,就要第一时间想到哈希法。 +首先我再强调一下 **什么时候使用哈希法**,当我们需要查询一个元素是否出现过,或者一个元素是否在集合里的时候,就要第一时间想到哈希法。 本题呢,我就需要一个集合来存放我们遍历过的元素,然后在遍历数组的时候去询问这个集合,某元素是否遍历过,也就是 是否出现在这个集合。 那么我们就应该想到使用哈希法了。 -因为本地,我们不仅要知道元素有没有遍历过,还要知道这个元素对应的下标,**需要使用 key value结构来存放,key来存元素,value来存下标,那么使用map正合适**。 +因为本题,我们不仅要知道元素有没有遍历过,还要知道这个元素对应的下标,**需要使用 key value结构来存放,key来存元素,value来存下标,那么使用map正合适**。 再来看一下使用数组和set来做哈希法的局限。 * 数组的大小是受限制的,而且如果元素很少,而哈希值太大会造成内存空间的浪费。 * set是一个集合,里面放的元素只能是一个key,而两数之和这道题目,不仅要判断y是否存在而且还要记录y的下标位置,因为要返回x 和 y的下标。所以set 也不能用。 -此时就要选择另一种数据结构:map ,map是一种key value的存储结构,可以用key保存数值,用value在保存数值所在的下标。 +此时就要选择另一种数据结构:map ,map是一种key value的存储结构,可以用key保存数值,用value再保存数值所在的下标。 C++中map,有三种类型: From d4810327aed53170c21c23f06e1fb6c54a184337 Mon Sep 17 00:00:00 2001 From: Liu Yongliang <41845017+tlylt@users.noreply.github.com> Date: Sun, 6 Aug 2023 10:25:37 +0800 Subject: [PATCH 2190/3019] =?UTF-8?q?Update=200459.=E9=87=8D=E5=A4=8D?= =?UTF-8?q?=E7=9A=84=E5=AD=90=E5=AD=97=E7=AC=A6=E4=B8=B2.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" "b/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" index f99102ab45..177c3878ba 100644 --- "a/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" @@ -52,7 +52,7 @@ 也就是由前后相同的子串组成。 -那么既然前面有相同的子串,后面有相同的子串,用 s + s,这样组成的字符串中,后面的子串做前串,前后的子串做后串,就一定还能组成一个s,如图: +那么既然前面有相同的子串,后面有相同的子串,用 s + s,这样组成的字符串中,后面的子串做前串,前面的子串做后串,就一定还能组成一个s,如图: ![图二](https://code-thinking-1253855093.file.myqcloud.com/pics/20220728104931.png) From 692647b03a1e14d895bbb24b5b98286c17100c73 Mon Sep 17 00:00:00 2001 From: wisuky <48423733+wisuky@users.noreply.github.com> Date: Sun, 6 Aug 2023 21:27:09 +0800 Subject: [PATCH 2191/3019] =?UTF-8?q?Update=200454.=E5=9B=9B=E6=95=B0?= =?UTF-8?q?=E7=9B=B8=E5=8A=A0II.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" "b/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" index 90c3733449..1c262c873d 100644 --- "a/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" +++ "b/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" @@ -41,7 +41,7 @@ ## 思路 -本题咋眼一看好像和[0015.三数之和](https://programmercarl.com/0015.三数之和.html),[0018.四数之和](https://programmercarl.com/0018.四数之和.html)差不多,其实差很多。 +本题乍眼一看好像和[0015.三数之和](https://programmercarl.com/0015.三数之和.html),[0018.四数之和](https://programmercarl.com/0018.四数之和.html)差不多,其实差很多。 **本题是使用哈希法的经典题目,而[0015.三数之和](https://programmercarl.com/0015.三数之和.html),[0018.四数之和](https://programmercarl.com/0018.四数之和.html)并不合适使用哈希法**,因为三数之和和四数之和这两道题目使用哈希法在不超时的情况下做到对结果去重是很困难的,很有多细节需要处理。 From 1f9f9c224cafb201ae71668a330a82a01105cfd5 Mon Sep 17 00:00:00 2001 From: wisuky <48423733+wisuky@users.noreply.github.com> Date: Tue, 8 Aug 2023 13:43:15 +0800 Subject: [PATCH 2192/3019] =?UTF-8?q?Update=200015.=E4=B8=89=E6=95=B0?= =?UTF-8?q?=E4=B9=8B=E5=92=8C.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...015.\344\270\211\346\225\260\344\271\213\345\222\214.md" | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git "a/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" "b/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" index 4951c90cf1..91fc9d685a 100644 --- "a/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" @@ -171,7 +171,7 @@ public: #### a的去重 -说道去重,其实主要考虑三个数的去重。 a, b ,c, 对应的就是 nums[i],nums[left],nums[right] +说到去重,其实主要考虑三个数的去重。 a, b ,c, 对应的就是 nums[i],nums[left],nums[right] a 如果重复了怎么办,a是nums里遍历的元素,那么应该直接跳过去。 @@ -181,7 +181,7 @@ a 如果重复了怎么办,a是nums里遍历的元素,那么应该直接跳 其实不一样! -都是和 nums[i]进行比较,是比较它的前一个,还是比较他的后一个。 +都是和 nums[i]进行比较,是比较它的前一个,还是比较它的后一个。 如果我们的写法是 这样: @@ -191,7 +191,7 @@ if (nums[i] == nums[i + 1]) { // 去重操作 } ``` -那就我们就把 三元组中出现重复元素的情况直接pass掉了。 例如{-1, -1 ,2} 这组数据,当遍历到第一个-1 的时候,判断 下一个也是-1,那这组数据就pass了。 +那我们就把 三元组中出现重复元素的情况直接pass掉了。 例如{-1, -1 ,2} 这组数据,当遍历到第一个-1 的时候,判断 下一个也是-1,那这组数据就pass了。 **我们要做的是 不能有重复的三元组,但三元组内的元素是可以重复的!** From eb75312e199aa9fa2a1c4f0212e2bcafd6676ddf Mon Sep 17 00:00:00 2001 From: guyinfei Date: Tue, 8 Aug 2023 16:02:54 +0800 Subject: [PATCH 2193/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200027.=E7=A7=BB?= =?UTF-8?q?=E9=99=A4=E5=85=83=E7=B4=A0=20JAVA=E7=89=88=E6=9C=AC=20?= =?UTF-8?q?=E7=9B=B8=E5=90=91=E5=8F=8C=E6=8C=87=E9=92=88=E6=B3=95=EF=BC=88?= =?UTF-8?q?=E7=89=88=E6=9C=AC=E4=BA=8C=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...73\351\231\244\345\205\203\347\264\240.md" | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git "a/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" "b/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" index 40ee3a2eae..1138ffd495 100644 --- "a/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" +++ "b/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" @@ -197,6 +197,26 @@ class Solution { } ``` +```java +// 相向双指针法(版本二) +class Solution { + public int removeElement(int[] nums, int val) { + int left = 0; + int right = nums.length - 1; + while(left <= right){ + if(nums[left] == val){ + nums[left] = nums[right]; + right--; + }else { + // 这里兼容了right指针指向的值与val相等的情况 + left++; + } + } + return left; + } +} +``` + ### Python: From d3eb234491ba63256ab8451ca16fd1084d24b8ff Mon Sep 17 00:00:00 2001 From: Jining Jiang <58833386+jjnnzb@users.noreply.github.com> Date: Tue, 8 Aug 2023 23:51:25 +0800 Subject: [PATCH 2194/3019] =?UTF-8?q?fix:=20=E8=A1=A8=E8=BF=B0=E4=BF=AE?= =?UTF-8?q?=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 应该是“其他”,而不是“其其他” --- ...\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" index 7511ac8715..79ad26a859 100644 --- "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" +++ "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" @@ -28,7 +28,7 @@ ![416.分割等和子集1](https://code-thinking-1253855093.file.myqcloud.com/pics/20210117171307407.png) -至于背包九讲其其他背包,面试几乎不会问,都是竞赛级别的了,leetcode上连多重背包的题目都没有,所以题库也告诉我们,01背包和完全背包就够用了。 +至于背包九讲其他背包,面试几乎不会问,都是竞赛级别的了,leetcode上连多重背包的题目都没有,所以题库也告诉我们,01背包和完全背包就够用了。 而完全背包又是也是01背包稍作变化而来,即:完全背包的物品数量是无限的。 From 6167408cd29d884bb8b74cc73b05ce7b6aac87ed Mon Sep 17 00:00:00 2001 From: han Date: Wed, 9 Aug 2023 12:06:32 +0800 Subject: [PATCH 2195/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A00018.=E5=9B=9B?= =?UTF-8?q?=E6=95=B0=E4=B9=8B=E5=92=8C=20Ruby=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...33\346\225\260\344\271\213\345\222\214.md" | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git "a/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" "b/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" index 28c20b7acd..17715b2e6f 100644 --- "a/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" @@ -649,6 +649,54 @@ object Solution { } } ``` +### Ruby: + +```ruby +def four_sum(nums, target) + #结果集 + result = [] + nums = nums.sort! + + for i in 0..nums.size - 1 + return result if i > 0 && nums[i] > target && nums[i] >= 0 + #对a进行去重 + next if i > 0 && nums[i] == nums[i - 1] + + for j in i + 1..nums.size - 1 + break if nums[i] + nums[j] > target && nums[i] + nums[j] >= 0 + #对b进行去重 + next if j > i + 1 && nums[j] == nums[j - 1] + left = j + 1 + right = nums.size - 1 + while left < right + sum = nums[i] + nums[j] + nums[left] + nums[right] + if sum > target + right -= 1 + elsif sum < target + left += 1 + else + result << [nums[i], nums[j], nums[left], nums[right]] + + #对c进行去重 + while left < right && nums[left] == nums[left + 1] + left += 1 + end + + #对d进行去重 + while left < right && nums[right] == nums[right - 1] + right -= 1 + end + + right -= 1 + left += 1 + end + end + end + end + + return result +end +```

From 7ae878753b3d700d14a3bfd0c55194c618b62a03 Mon Sep 17 00:00:00 2001 From: han Date: Thu, 10 Aug 2023 10:21:29 +0800 Subject: [PATCH 2196/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A01047.=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E5=AD=97=E7=AC=A6=E4=B8=B2=E4=B8=AD=E7=9A=84=E6=89=80?= =?UTF-8?q?=E6=9C=89=E7=9B=B8=E9=82=BB=E9=87=8D=E5=A4=8D=E9=A1=B9=20Ruby?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...73\351\207\215\345\244\215\351\241\271.md" | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git "a/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" "b/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" index ad54f0f88e..ffe1353039 100644 --- "a/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" +++ "b/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" @@ -475,6 +475,26 @@ impl Solution { } ``` +### Ruby + +```ruby +def remove_duplicates(s) + #数组模拟栈 + stack = [] + s.each_char do |chr| + if stack.empty? + stack.push chr + else + head = stack.pop + #重新进栈 + stack.push head, chr if head != chr + end + end + + return stack.join +end +``` +

From 86f2dcb46bbd7e243bee746c37f7cdeb448f004c Mon Sep 17 00:00:00 2001 From: TonySu Date: Thu, 10 Aug 2023 17:24:51 +0800 Subject: [PATCH 2197/3019] =?UTF-8?q?Update=200130.=E8=A2=AB=E5=9B=B4?= =?UTF-8?q?=E7=BB=95=E7=9A=84=E5=8C=BA=E5=9F=9F.md,=20=E5=A2=9E=E5=8A=A0Py?= =?UTF-8?q?thon3=20=E7=89=88=E6=9C=AC=E7=9A=84DFS=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 增加Python3 版本的DFS解法,在leetcode上测试通过。 --- ...25\347\232\204\345\214\272\345\237\237.md" | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git "a/problems/0130.\350\242\253\345\233\264\347\273\225\347\232\204\345\214\272\345\237\237.md" "b/problems/0130.\350\242\253\345\233\264\347\273\225\347\232\204\345\214\272\345\237\237.md" index e244873ba3..e8a1f02f69 100644 --- "a/problems/0130.\350\242\253\345\233\264\347\273\225\347\232\204\345\214\272\345\237\237.md" +++ "b/problems/0130.\350\242\253\345\233\264\347\273\225\347\232\204\345\214\272\345\237\237.md" @@ -385,6 +385,55 @@ class Solution { } } ``` +### Python3 + +```Python +// 深度优先遍历 +class Solution: + dir_list = [(0, 1), (0, -1), (1, 0), (-1, 0)] + def solve(self, board: List[List[str]]) -> None: + """ + Do not return anything, modify board in-place instead. + """ + row_size = len(board) + column_size = len(board[0]) + visited = [[False] * column_size for _ in range(row_size)] + # 从边缘开始,将边缘相连的O改成A。然后遍历所有,将A改成O,O改成X + # 第一行和最后一行 + for i in range(column_size): + if board[0][i] == "O" and not visited[0][i]: + self.dfs(board, 0, i, visited) + if board[row_size-1][i] == "O" and not visited[row_size-1][i]: + self.dfs(board, row_size-1, i, visited) + + # 第一列和最后一列 + for i in range(1, row_size-1): + if board[i][0] == "O" and not visited[i][0]: + self.dfs(board, i, 0, visited) + if board[i][column_size-1] == "O" and not visited[i][column_size-1]: + self.dfs(board, i, column_size-1, visited) + + for i in range(row_size): + for j in range(column_size): + if board[i][j] == "A": + board[i][j] = "O" + elif board[i][j] == "O": + board[i][j] = "X" + + + def dfs(self, board, x, y, visited): + if visited[x][y] or board[x][y] == "X": + return + visited[x][y] = True + board[x][y] = "A" + for i in range(4): + new_x = x + self.dir_list[i][0] + new_y = y + self.dir_list[i][1] + if new_x >= len(board) or new_y >= len(board[0]) or new_x < 0 or new_y < 0: + continue + self.dfs(board, new_x, new_y, visited) + +```

From 92051fac670c4c1e776d0afad4adadbc9c6dacfd Mon Sep 17 00:00:00 2001 From: Liu Yongliang <41845017+tlylt@users.noreply.github.com> Date: Sun, 13 Aug 2023 13:59:49 +0800 Subject: [PATCH 2198/3019] =?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 --- ...30\237\345\210\227\345\256\236\347\216\260\346\240\210.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" "b/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" index 13b742f839..3de300c781 100644 --- "a/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" +++ "b/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" @@ -111,7 +111,7 @@ public: } }; ``` -* 时间复杂度: push为O(n),其他为O(1) +* 时间复杂度: pop为O(n),其他为O(1) * 空间复杂度: O(n) ## 优化 @@ -158,7 +158,7 @@ public: } }; ``` -* 时间复杂度: push为O(n),其他为O(1) +* 时间复杂度: pop为O(n),其他为O(1) * 空间复杂度: O(n) From 0f458de25416863e592d419a35f535405610f9bf Mon Sep 17 00:00:00 2001 From: Terry Liu <102352821+Lozakaka@users.noreply.github.com> Date: Sun, 13 Aug 2023 22:59:49 -0400 Subject: [PATCH 2199/3019] =?UTF-8?q?=E6=96=B0=E5=A2=9Ejava=E8=A7=A3?= =?UTF-8?q?=E6=B3=95=EF=BC=88hashArray=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增java解法(hashArray) --- ...04\347\232\204\344\272\244\351\233\206.md" | 25 +++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git "a/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" "b/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" index 26a9286dc9..138067e360 100644 --- "a/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" +++ "b/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" @@ -121,7 +121,7 @@ public: ## 其他语言版本 ### Java: - +版本一:使用HashSet ```Java import java.util.HashSet; import java.util.Set; @@ -159,7 +159,28 @@ class Solution { } } ``` - +版本二:使用Hash數組 +```java +class Solution { + public int[] intersection(int[] nums1, int[] nums2) { + int[] hash1 = new int[1002]; + int[] hash2 = new int[1002]; + for(int i : nums1) + hash1[i]++; + for(int i : nums2) + hash2[i]++; + List resList = new ArrayList<>(); + for(int i = 0; i < 1002; i++) + if(hash1[i] > 0 && hash2[i] > 0) + resList.add(i); + int index = 0; + int res[] = new int[resList.size()]; + for(int i : resList) + res[index++] = i; + return res; + } +} +``` ### Python3: (版本一) 使用字典和集合 From 146c206ca1b28cdf7526d76c797ee0278b276080 Mon Sep 17 00:00:00 2001 From: Pika-Lee Date: Sun, 13 Aug 2023 23:21:06 -0700 Subject: [PATCH 2200/3019] =?UTF-8?q?Update=20=E4=BA=8C=E5=8F=89=E6=A0=91?= =?UTF-8?q?=E7=90=86=E8=AE=BA=E5=9F=BA=E7=A1=80.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit correct the text fault --- ...\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" index 184dba604c..e2c6d83c59 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -150,7 +150,7 @@ 最后再说一说二叉树中深度优先和广度优先遍历实现方式,我们做二叉树相关题目,经常会使用递归的方式来实现深度优先遍历,也就是实现前中后序遍历,使用递归是比较方便的。 -**之前我们讲栈与队列的时候,就说过栈其实就是递归的一种实现结构**,也就说前中后序遍历的逻辑其实都是可以借助栈使用非递归的方式来实现的。 +**之前我们讲栈与队列的时候,就说过栈其实就是递归的一种实现结构**,也就说前中后序遍历的逻辑其实都是可以借助栈使用递归的方式来实现的。 而广度优先遍历的实现一般使用队列来实现,这也是队列先进先出的特点所决定的,因为需要先进先出的结构,才能一层一层的来遍历二叉树。 From 6a2f01055c784d54059568f970b44d650be04e87 Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Tue, 15 Aug 2023 10:09:47 +0800 Subject: [PATCH 2201/3019] Update --- ...11\346\216\222\350\241\214\347\250\213.md" | 7 +- problems/qita/acm.md | 89 +++++++++++++++++++ ...06\350\256\272\345\237\272\347\241\200.md" | 2 +- 3 files changed, 92 insertions(+), 6 deletions(-) create mode 100644 problems/qita/acm.md diff --git "a/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" "b/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" index 3798b48d87..794a67fa40 100644 --- "a/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" +++ "b/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" @@ -237,13 +237,10 @@ public: ```cpp for (pair& target : targets[result[result.size() - 1]]) ``` -pair里要有const,因为map中的key是不可修改的,所以是`pair`。 -如果不加const,也可以复制一份pair,例如这么写: +一定要加上引用即 `& target`,因为后面有对 target.second 做减减操作,如果没有引用,单纯复制,这个结果就没记录下来,那最后的结果就不对了。 -```cpp -for (pairtarget : targets[result[result.size() - 1]]) -``` +加上引用之后,就必须在 string 前面加上 const,因为map中的key 是不可修改了,这就是语法规定了。 ## 总结 diff --git a/problems/qita/acm.md b/problems/qita/acm.md new file mode 100644 index 0000000000..1be0e924de --- /dev/null +++ b/problems/qita/acm.md @@ -0,0 +1,89 @@ + +# 如何练习ACM模式输入输入模式 | 如何准备笔试 | 卡码网 + +卡码网地址:[https://kamacoder.com](https://kamacoder.com) + +## 为什么卡码网 + +录友们在求职的时候会发现,很多公司的笔试题和面试题都是ACM模式, 而大家习惯去力扣刷题,力扣是核心代码模式。 + +当大家在做ACM模式的算法题的时候,需要自己处理数据的输入输出,**如果没有接触过的话,还是挺难的**。 + +[知识星球](https://programmercarl.com/other/kstar.html)里很多录友的日常打卡中,都表示被 ACM模式折磨过: + +

+ +
+ +
+ +
+ +
+ +所以我正式推出:**卡码网**([https://kamacoder.com](https://kamacoder.com)),**专门帮助大家练习ACM模式**。 + +那么之前大家去哪里练习ACM模式呢? + +去牛客做笔试真题,结果发现 ACM模式没练出来,题目倒是巨难,一点思路都没有,代码更没有写,ACM模式无从练起。 + +去洛谷,POJ上练习? 结果发现 题目超多,不知道从哪里开始刷,也没有一个循序渐进的刷题顺序。 + +**而卡码网上有我精选+制作的25道题目**!我还把25题的后台测试数据制作了一遍,保证大家练习的效果。 + +为什么题目不多,只有25道? + +因为大家练习ACM模式不需要那么多题目,有一个循序渐进的练习过程就好了。 + +这25道题目包含了数组、链表、哈希表、字符串、二叉树、动态规划以及图的的题目,常见的输入输出方式都覆盖了。 + +**这是最精华的25道题目**!。 + +## 卡码网长什么样 + +来看看这极简的界面,没有烂七八糟的功能,只有刷题! + +
+ +在「状态」这里可以看到 大家提交的代码和判题记录,目前卡码网([https://kamacoder.com](https://kamacoder.com))几乎无时无刻都有卡友在提交代码。 +看看大家周六晚上都在做什么,刷哪些题目。 + +
+ + +提交代码的界面是这样的,**目前支持所有主流刷题语言**。 + +
+ +## 题解 + +基本大家来卡码网([https://kamacoder.com](https://kamacoder.com))练习ACM模式,都是对输入输出不够了解的,所以想看现成的题解,看看究竟是怎么处理的。 + +所以我用C++把卡码网上25道题目的题解都写了,并发布到Github上: + +[https://github.com/youngyangyang04/kamacoder-solutions](https://github.com/youngyangyang04/kamacoder-solutions) + +
+ +**欢迎去Github上star,欢迎fork,也欢迎来Github仓库贡献其他语言版本,成为contributor**。 + +如果不懂如何和开源项目提交代码,[可以看这里](https://www.programmercarl.com/qita/join.html) + +目前已经有两位录友贡献C和Java版本了。 + +
+ +期待在Github(https://github.com/youngyangyang04/kamacoder-solutions) 的contributors上也出现你的头像。 + +目前题解只有C++代码吗? + +当然不是,大多数题目已经有了 Java、python、C版本。 **其他语言版本,就给录友们成为contributor的机会了**。 + +## 最后 + +卡码网地址:[https://kamacoder.com](https://kamacoder.com) + +快去体验吧,笔试之前最好 把卡码网25道题目都刷完。 + +期待录友们成为最早一批把卡码网刷爆的coder! + diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" index 184dba604c..e2c6d83c59 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -150,7 +150,7 @@ 最后再说一说二叉树中深度优先和广度优先遍历实现方式,我们做二叉树相关题目,经常会使用递归的方式来实现深度优先遍历,也就是实现前中后序遍历,使用递归是比较方便的。 -**之前我们讲栈与队列的时候,就说过栈其实就是递归的一种实现结构**,也就说前中后序遍历的逻辑其实都是可以借助栈使用非递归的方式来实现的。 +**之前我们讲栈与队列的时候,就说过栈其实就是递归的一种实现结构**,也就说前中后序遍历的逻辑其实都是可以借助栈使用递归的方式来实现的。 而广度优先遍历的实现一般使用队列来实现,这也是队列先进先出的特点所决定的,因为需要先进先出的结构,才能一层一层的来遍历二叉树。 From 77f448ec961c4547fb2e2a70356020e760ed7c55 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=93=88=E5=93=88=E5=93=88?= <76643786+Projecthappy@users.noreply.github.com> Date: Wed, 16 Aug 2023 14:38:49 +0800 Subject: [PATCH 2202/3019] =?UTF-8?q?0332.=E9=87=8D=E6=96=B0=E5=AE=89?= =?UTF-8?q?=E6=8E=92=E8=A1=8C=E7=A8=8B=EF=BC=8C=E6=B7=BB=E5=8A=A0java?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...11\346\216\222\350\241\214\347\250\213.md" | 78 +++++++++++++++++++ 1 file changed, 78 insertions(+) diff --git "a/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" "b/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" index fcdeae7bde..2498fbfe53 100644 --- "a/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" +++ "b/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" @@ -261,6 +261,84 @@ for (pair& target : targets[result[result.size() - 1]]) ### Java +```java +/* 首先遍历所有机票,将机票转换成map,其中起点作为key,终点按照字典顺序插入到终点的列表中 + 然后进入递归,递归中首先在result中加入当前位置,如果票用完了就说明这条路走通了 + 递归中遍历从当前位置出发的终点(也就是map中key为当前位置的列表),因为列表是有序的,因此只要出现能走通的路径,这条路径就是字典排序最低的 + 在遍历中,首先从map中移除当前的机票,将遍历到的终点作为起点进入下一层的递归中,如果发现当前机票往后走走不通,再把当前的机票加到map中*/ +class Solution { + //key为起点,value是有序的终点的列表 + Map> ticketMap = new HashMap<>(); + LinkedList result = new LinkedList<>(); + + public List findItinerary(List> tickets) { + //遍历tickets,存入ticketMap中 + for (List ticket : tickets) { + addNew(ticket.get(0), ticket.get(1)); + } + deal("JFK"); + return result; + } + + boolean deal(String currentLocation) { + result.add(currentLocation); + //机票全部用完,找到最小字符路径 + if (ticketMap.isEmpty()) { + return true; + } + //当前位置的终点列表 + LinkedList targetLocations = ticketMap.get(currentLocation); + //机票没用完,但是没有从当前位置出发的机票了,说明这条路走不通 + if (targetLocations == null) { + return false; + } + //终点列表中遍历到的终点 + String targetLocation; + //遍历从当前位置出发的机票 + for (int i = 0; i < targetLocations.size(); i++) { + targetLocation = targetLocations.get(i); + //删除map中的机票,如果当前位置只有一个终点,直接删除k,v,有多个终点则删除终点列表中当前的终点 + if (targetLocations.size() == 1) { + ticketMap.remove(currentLocation); + } else { + targetLocations.remove(i); + } + //递归 + if (deal(targetLocation)) { + return true; + } else { + //路线走不通,将机票重新加到map中 + addNew(currentLocation, targetLocation); + result.removeLast(); + } + } + return false; + } + + /** + * 在map中添加新元素 + * + * @param start 起点 + * @param end 终点 + */ + void addNew(String start, String end) { + LinkedList startAllEnd = ticketMap.get(start); + if (startAllEnd != null) { + for (int i = 0; i < startAllEnd.size() + 1; i++) { + if (i == startAllEnd.size() || end.compareTo(startAllEnd.get(i)) < 0) { + startAllEnd.add(i, end); + break; + } + } + } else { + LinkedList ends = new LinkedList<>(); + ends.add(end); + ticketMap.put(start, ends); + } + } +} +``` + ```java class Solution { private LinkedList res; From 00f2aa679318c12921ce974168ad3b7728bc0ac5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=93=88=E5=93=88=E5=93=88?= <76643786+Projecthappy@users.noreply.github.com> Date: Wed, 16 Aug 2023 15:28:28 +0800 Subject: [PATCH 2203/3019] =?UTF-8?q?0051.N=E7=9A=87=E5=90=8E=EF=BC=8Cjava?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=96=B0=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "problems/0051.N\347\232\207\345\220\216.md" | 52 ++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git "a/problems/0051.N\347\232\207\345\220\216.md" "b/problems/0051.N\347\232\207\345\220\216.md" index 6bc4fa78c6..71c40238ec 100644 --- "a/problems/0051.N\347\232\207\345\220\216.md" +++ "b/problems/0051.N\347\232\207\345\220\216.md" @@ -345,6 +345,58 @@ class Solution { } } ``` +```java +//该方法主要特点在于用一个一维数组暂存皇后的位置,数组下标代表行,数组下标的值代表列,并初始化一个长度为n-1,值全为'.'的模板字符串 +//在找到合法方案时,遍历数组,在模板字符串下标为数组值的位置插入Q +class Solution { + //结果 + List> result = new ArrayList<>(); + //储存皇后的位置,下标为行,值为列 + int[] queenIndex; + //棋盘中一行的字符串模板 + String template; + int size; + + public List> solveNQueens(int n) { + size = n; + template = ".".repeat(n - 1); + queenIndex = new int[n]; + deal(0); + return result; + } + + void deal(int index) { + //遍历当前行的所有位置(尝试在这行每个位置放置皇后) + for (int i = 0; i < size; i++) { + queenIndex[index] = i; + //检查在当前位置放置皇后是否合法 + if (check(index, i)) { + //如果当前的行是最后一行,就说明当前皇后的摆放已经是完整并且合法的,在结果集中加入当前的摆放方案 + if (index == size - 1) { + List tmp = new ArrayList<>(size); + //遍历当前的皇后位置,在模板字符串对应的位置加入Q,再加入到结果集中 + for (Integer integer : queenIndex) { + tmp.add(new StringBuilder(template).insert(integer, "Q").toString()); + } + result.add(tmp); + return; + } + //如果当前不是最后一行,还需要进入下一行 + deal(index + 1); + } + } + } + + boolean check(int rowIndex, int columnIndex) { + for (int i = 0; i < rowIndex; i++) { + if (queenIndex[i] == columnIndex || (Math.abs(queenIndex[i] - columnIndex) == Math.abs(i - rowIndex))) { + return false; + } + } + return true; + } +} +``` ### Python From b66eb1c7fddaafdf28e510bbfe59fdb5107c67b3 Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Fri, 18 Aug 2023 09:35:21 +0800 Subject: [PATCH 2204/3019] Update --- ...\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" | 2 +- ...\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" | 2 +- ...\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" index ce9a247c1f..51d030e784 100644 --- "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" +++ "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" @@ -18,7 +18,7 @@ * [102.二叉树的层序遍历](https://leetcode.cn/problems/binary-tree-level-order-traversal/) * [107.二叉树的层次遍历II](https://leetcode.cn/problems/binary-tree-level-order-traversal-ii/) * [199.二叉树的右视图](https://leetcode.cn/problems/binary-tree-right-side-view/) -* [637.二叉树的层平均值](https://leetcode.cn/problems/binary-tree-right-side-view/) +* [637.二叉树的层平均值](https://leetcode.cn/problems/average-of-levels-in-binary-tree/) * [429.N叉树的层序遍历](https://leetcode.cn/problems/n-ary-tree-level-order-traversal/) * [515.在每个树行中找最大值](https://leetcode.cn/problems/find-largest-value-in-each-tree-row/) * [116.填充每个节点的下一个右侧节点指针](https://leetcode.cn/problems/populating-next-right-pointers-in-each-node/) diff --git "a/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" "b/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" index 9db7409e04..edb5ea3ea7 100644 --- "a/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" +++ "b/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" @@ -133,7 +133,7 @@ left与right的逻辑处理; // 中 ![236.二叉树的最近公共祖先](https://code-thinking-1253855093.file.myqcloud.com/pics/2021020415105872.png) -就像图中一样直接返回7,多美滋滋。 +就像图中一样直接返回7。 但事实上还要遍历根节点右子树(即使此时已经找到了目标节点了),也就是图中的节点4、15、20。 diff --git "a/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" "b/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" index 4bee585ba8..5bdbcbc7e0 100644 --- "a/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" +++ "b/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" @@ -30,7 +30,7 @@ ### 暴力排序 -最直观的想法,莫过于:每个数平方之后,排个序,美滋滋,代码如下: +最直观的想法,莫过于:每个数平方之后,排个序,代码如下: ```CPP class Solution { From 4bd8f3ea32bb189de5919745e531a964b5fcd008 Mon Sep 17 00:00:00 2001 From: fwqaaq Date: Mon, 21 Aug 2023 16:07:53 +0800 Subject: [PATCH 2205/3019] =?UTF-8?q?Update=200496.=E4=B8=8B=E4=B8=80?= =?UTF-8?q?=E4=B8=AA=E6=9B=B4=E5=A4=A7=E5=85=83=E7=B4=A0I.md=20=E4=BC=98?= =?UTF-8?q?=E5=8C=96=20rust?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...4\345\244\247\345\205\203\347\264\240I.md" | 32 ++++++++++++------- 1 file changed, 20 insertions(+), 12 deletions(-) diff --git "a/problems/0496.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240I.md" "b/problems/0496.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240I.md" index 6bcafafba2..e02cfbd103 100644 --- "a/problems/0496.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240I.md" +++ "b/problems/0496.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240I.md" @@ -392,25 +392,33 @@ function nextGreaterElement(nums1: number[], nums2: number[]): number[] { ### Rust ```rust +use std::collections::HashMap; impl Solution { pub fn next_greater_element(nums1: Vec, nums2: Vec) -> Vec { - let mut ans = vec![-1; nums1.len()]; - use std::collections::HashMap; - let mut map = HashMap::new(); - for (idx, &i) in nums1.iter().enumerate() { - map.insert(i, idx); + let (mut res, mut map) = (vec![-1; nums1.len()], HashMap::new()); + if nums1.is_empty() { + return res; } + + nums1.into_iter().enumerate().for_each(|(v, k)| { + map.insert(k, v); + }); + let mut stack = vec![]; - for (idx, &i) in nums2.iter().enumerate() { - while !stack.is_empty() && nums2[*stack.last().unwrap()] < i { - let pos = stack.pop().unwrap(); - if let Some(&jdx) = map.get(&nums2[pos]) { - ans[jdx] = i; + for (i, &value) in nums2.iter().enumerate() { + while let Some(&top) = stack.last() { + if value <= nums2[top] { + break; + } + let stacked_index = stack.pop().unwrap(); + if let Some(&mapped_index) = map.get(&nums2[stacked_index]) { + res[mapped_index] = value; } } - stack.push(idx); + stack.push(i); } - ans + + res } } ``` From 7aae4f81bd83749333400144fa474c918addb7f4 Mon Sep 17 00:00:00 2001 From: fwqaaq Date: Mon, 21 Aug 2023 16:29:16 +0800 Subject: [PATCH 2206/3019] =?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=20about=20ru?= =?UTF-8?q?st?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\345\244\247\345\205\203\347\264\240II.md" | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git "a/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" "b/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" index d211a68072..e732b8203c 100644 --- "a/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" +++ "b/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" @@ -289,6 +289,28 @@ impl Solution { } ``` +> 版本二: + +```rust +impl Solution { + pub fn next_greater_elements(nums: Vec) -> Vec { + let (mut stack, mut res) = (vec![], vec![-1; nums.len()]); + + for i in 0..nums.len() * 2 { + while let Some(&top) = stack.last() { + if nums[i % nums.len()] <= nums[top] { + break; + } + let saved_index = stack.pop().unwrap(); + res[saved_index] = nums[i % nums.len()]; + } + stack.push(i % nums.len()); + } + + res + } +} +```

From 264b72f3c63c937e27262b7e92fba027eed6e93c Mon Sep 17 00:00:00 2001 From: fwqaaq Date: Mon, 21 Aug 2023 18:10:48 +0800 Subject: [PATCH 2207/3019] =?UTF-8?q?Update=200797.=E6=89=80=E6=9C=89?= =?UTF-8?q?=E5=8F=AF=E8=83=BD=E7=9A=84=E8=B7=AF=E5=BE=84.md=20about=20rust?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...75\347\232\204\350\267\257\345\276\204.md" | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git "a/problems/0797.\346\211\200\346\234\211\345\217\257\350\203\275\347\232\204\350\267\257\345\276\204.md" "b/problems/0797.\346\211\200\346\234\211\345\217\257\350\203\275\347\232\204\350\267\257\345\276\204.md" index ec8288c608..9d14bd7caa 100644 --- "a/problems/0797.\346\211\200\346\234\211\345\217\257\350\203\275\347\232\204\350\267\257\345\276\204.md" +++ "b/problems/0797.\346\211\200\346\234\211\345\217\257\350\203\275\347\232\204\350\267\257\345\276\204.md" @@ -217,7 +217,29 @@ class Solution: self.path.pop() # 回溯 ``` +### Rust + +```rust +impl Solution { + pub fn all_paths_source_target(graph: Vec>) -> Vec> { + let (mut res, mut path) = (vec![], vec![0]); + Self::dfs(&graph, &mut path, &mut res, 0); + res + } + pub fn dfs(graph: &Vec>, path: &mut Vec, res: &mut Vec>, node: usize) { + if node == graph.len() - 1 { + res.push(path.clone()); + return; + } + for &v in &graph[node] { + path.push(v); + Self::dfs(graph, path, res, v as usize); + path.pop(); + } + } +} +```

From 0f1505600e2c0ab505db9111923bad63ab4e41c1 Mon Sep 17 00:00:00 2001 From: fwqaaq Date: Mon, 21 Aug 2023 19:26:18 +0800 Subject: [PATCH 2208/3019] =?UTF-8?q?Update=200200.=E5=B2=9B=E5=B1=BF?= =?UTF-8?q?=E6=95=B0=E9=87=8F.=E5=B9=BF=E6=90=9C=E7=89=88.md=20about=20rus?= =?UTF-8?q?t?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...7.\345\271\277\346\220\234\347\211\210.md" | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git "a/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\345\271\277\346\220\234\347\211\210.md" "b/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\345\271\277\346\220\234\347\211\210.md" index 5b9d90aa31..8bbedb5965 100644 --- "a/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\345\271\277\346\220\234\347\211\210.md" +++ "b/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\345\271\277\346\220\234\347\211\210.md" @@ -240,6 +240,47 @@ class Solution: ``` +### Rust + +```rust + +use std::collections::VecDeque; +impl Solution { + const DIRECTIONS: [(i32, i32); 4] = [(0, 1), (1, 0), (-1, 0), (0, -1)]; + pub fn num_islands(grid: Vec>) -> i32 { + let mut visited = vec![vec![false; grid[0].len()]; grid.len()]; + let mut res = 0; + for (i, chars) in grid.iter().enumerate() { + for (j, &c) in chars.iter().enumerate() { + if !visited[i][j] && c == '1' { + res += 1; + Self::bfs(&grid, &mut visited, (i as i32, j as i32)); + } + } + } + res + } + + pub fn bfs(grid: &Vec>, visited: &mut Vec>, (x, y): (i32, i32)) { + let mut queue = VecDeque::new(); + queue.push_back((x, y)); + visited[x as usize][y as usize] = true; + while let Some((cur_x, cur_y)) = queue.pop_front() { + for (dx, dy) in Self::DIRECTIONS { + let (nx, ny) = (cur_x + dx, cur_y + dy); + if nx < 0 || nx >= grid.len() as i32 || ny < 0 || ny >= grid[0].len() as i32 { + continue; + } + let (nx, ny) = (nx as usize, ny as usize); + if grid[nx][ny] == '1' && !visited[nx][ny] { + visited[nx][ny] = true; + queue.push_back((nx as i32, ny as i32)); + } + } + } + } +} +```

From 0134c6c13c2543eb4b7ffb1ca83056b4e0f0be3f Mon Sep 17 00:00:00 2001 From: fwqaaq Date: Mon, 21 Aug 2023 19:30:02 +0800 Subject: [PATCH 2209/3019] =?UTF-8?q?Update=200200.=E5=B2=9B=E5=B1=BF?= =?UTF-8?q?=E6=95=B0=E9=87=8F.=E6=B7=B1=E6=90=9C=E7=89=88.md=20about?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...7.\346\267\261\346\220\234\347\211\210.md" | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git "a/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\346\267\261\346\220\234\347\211\210.md" "b/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\346\267\261\346\220\234\347\211\210.md" index f610e32330..aaead2a7b7 100644 --- "a/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\346\267\261\346\220\234\347\211\210.md" +++ "b/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\346\267\261\346\220\234\347\211\210.md" @@ -279,6 +279,42 @@ class Solution: return result ``` +Rust: + + +use std::collections::VecDeque; +impl Solution { + const DIRECTIONS: [(i32, i32); 4] = [(0, 1), (1, 0), (-1, 0), (0, -1)]; + pub fn num_islands(grid: Vec>) -> i32 { + let mut visited = vec![vec![false; grid[0].len()]; grid.len()]; + let mut res = 0; + for (i, chars) in grid.iter().enumerate() { + for (j, &c) in chars.iter().enumerate() { + if !visited[i][j] && c == '1' { + res += 1; + Self::dfs(&grid, &mut visited, (i as i32, j as i32)); + } + } + } + res + } + + pub fn dfs(grid: &Vec>, visited: &mut Vec>, (x, y): (i32, i32)) { + for (dx, dy) in Self::DIRECTIONS { + let (nx, ny) = (x + dx, y + dy); + if nx < 0 || nx >= grid.len() as i32 || ny < 0 || ny >= grid[0].len() as i32 { + continue; + } + let (nx, ny) = (nx as usize, ny as usize); + if grid[nx][ny] == '1' && !visited[nx][ny] { + visited[nx][ny] = true; + Self::dfs(grid, visited, (nx as i32, ny as i32)); + } + } + } + +} +

From b751d1f24d19daba1ff3b3ce4c39377d6d187a74 Mon Sep 17 00:00:00 2001 From: fwqaaq Date: Mon, 21 Aug 2023 19:30:59 +0800 Subject: [PATCH 2210/3019] Update --- ...5\260\351\207\217.\346\267\261\346\220\234\347\211\210.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\346\267\261\346\220\234\347\211\210.md" "b/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\346\267\261\346\220\234\347\211\210.md" index aaead2a7b7..905c0979fc 100644 --- "a/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\346\267\261\346\220\234\347\211\210.md" +++ "b/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\346\267\261\346\220\234\347\211\210.md" @@ -282,7 +282,7 @@ class Solution: Rust: -use std::collections::VecDeque; +```rust impl Solution { const DIRECTIONS: [(i32, i32); 4] = [(0, 1), (1, 0), (-1, 0), (0, -1)]; pub fn num_islands(grid: Vec>) -> i32 { @@ -312,8 +312,8 @@ impl Solution { } } } - } +```

From eedb042024fe26857c038a8bfc7490c9829462e5 Mon Sep 17 00:00:00 2001 From: fwqaaq Date: Mon, 21 Aug 2023 22:00:22 +0800 Subject: [PATCH 2211/3019] =?UTF-8?q?Update=200695.=E5=B2=9B=E5=B1=BF?= =?UTF-8?q?=E7=9A=84=E6=9C=80=E5=A4=A7=E9=9D=A2=E7=A7=AF.md=20about=20rust?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...00\345\244\247\351\235\242\347\247\257.md" | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git "a/problems/0695.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" "b/problems/0695.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" index 186f044c40..9ce4e56c37 100644 --- "a/problems/0695.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" +++ "b/problems/0695.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" @@ -390,6 +390,55 @@ class Solution: if 0 <= new_x < len(grid) and 0 <= new_y < len(grid[0]): self.dfs(grid, visited, new_x, new_y) ``` + +### Rust + +dfs: 版本一 + +```rust +impl Solution { + const DIRECTIONS: [(i32, i32); 4] = [(0, 1), (1, 0), (-1, 0), (0, -1)]; + + pub fn max_area_of_island(grid: Vec>) -> i32 { + let mut visited = vec![vec![false; grid[0].len()]; grid.len()]; + + let mut res = 0; + for (i, nums) in grid.iter().enumerate() { + for (j, &num) in nums.iter().enumerate() { + if !visited[i][j] && num == 1 { + let mut count = 1; + visited[i][j] = true; + Self::dfs(&grid, &mut visited, (i as i32, j as i32), &mut count); + res = res.max(count); + } + } + } + + res + } + + pub fn dfs( + grid: &Vec>, + visited: &mut [Vec], + (x, y): (i32, i32), + count: &mut i32, + ) { + for (dx, dy) in Self::DIRECTIONS { + let (nx, ny) = (x + dx, y + dy); + if nx < 0 || nx >= grid.len() as i32 || ny < 0 || ny >= grid[0].len() as i32 { + continue; + } + let (nx, ny) = (nx as usize, ny as usize); + if !visited[nx][ny] && grid[nx][ny] == 1 { + visited[nx][ny] = true; + *count += 1; + Self::dfs(grid, visited, (nx as i32, ny as i32), count); + } + } + } +} +``` +

From d02c6a7d178ed420dfa404e091b6f7da0118185f Mon Sep 17 00:00:00 2001 From: fwqaaq Date: Mon, 21 Aug 2023 22:09:24 +0800 Subject: [PATCH 2212/3019] =?UTF-8?q?Update=200695.=E5=B2=9B=E5=B1=BF?= =?UTF-8?q?=E7=9A=84=E6=9C=80=E5=A4=A7=E9=9D=A2=E7=A7=AF.md=20about=20rust?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...00\345\244\247\351\235\242\347\247\257.md" | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git "a/problems/0695.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" "b/problems/0695.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" index 9ce4e56c37..2d25c54ce0 100644 --- "a/problems/0695.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" +++ "b/problems/0695.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" @@ -439,6 +439,51 @@ impl Solution { } ``` +dfs: 版本二 + +```rust +impl Solution { + const DIRECTIONS: [(i32, i32); 4] = [(0, 1), (1, 0), (-1, 0), (0, -1)]; + + pub fn max_area_of_island(grid: Vec>) -> i32 { + let mut visited = vec![vec![false; grid[0].len()]; grid.len()]; + + let mut res = 0; + for (i, nums) in grid.iter().enumerate() { + for (j, &num) in nums.iter().enumerate() { + if !visited[i][j] && num == 1 { + let mut count = 0; + Self::dfs(&grid, &mut visited, (i as i32, j as i32), &mut count); + res = res.max(count); + } + } + } + + res + } + + pub fn dfs( + grid: &Vec>, + visited: &mut [Vec], + (x, y): (i32, i32), + count: &mut i32, + ) { + if visited[x as usize][y as usize] || grid[x as usize][y as usize] == 0 { + return; + } + visited[x as usize][y as usize] = true; + *count += 1; + for (dx, dy) in Self::DIRECTIONS { + let (nx, ny) = (x + dx, y + dy); + if nx < 0 || nx >= grid.len() as i32 || ny < 0 || ny >= grid[0].len() as i32 { + continue; + } + Self::dfs(grid, visited, (nx, ny), count); + } + } +} +``` +

From c7ec1d7705b108257983f1b192126f2bec2888b4 Mon Sep 17 00:00:00 2001 From: fwqaaq Date: Mon, 21 Aug 2023 22:27:28 +0800 Subject: [PATCH 2213/3019] =?UTF-8?q?Update=200695.=E5=B2=9B=E5=B1=BF?= =?UTF-8?q?=E7=9A=84=E6=9C=80=E5=A4=A7=E9=9D=A2=E7=A7=AF.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...00\345\244\247\351\235\242\347\247\257.md" | 47 +++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git "a/problems/0695.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" "b/problems/0695.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" index 2d25c54ce0..b8b2ea72f5 100644 --- "a/problems/0695.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" +++ "b/problems/0695.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" @@ -484,6 +484,53 @@ impl Solution { } ``` +bfs: + +```rust +use std::collections::VecDeque; +impl Solution { + const DIRECTIONS: [(i32, i32); 4] = [(0, 1), (1, 0), (-1, 0), (0, -1)]; + + pub fn max_area_of_island(grid: Vec>) -> i32 { + let mut visited = vec![vec![false; grid[0].len()]; grid.len()]; + + let mut res = 0; + for (i, nums) in grid.iter().enumerate() { + for (j, &num) in nums.iter().enumerate() { + if !visited[i][j] && num == 1 { + let mut count = 0; + Self::bfs(&grid, &mut visited, (i as i32, j as i32), &mut count); + res = res.max(count); + } + } + } + + res + } + + pub fn bfs(grid: &[Vec], visited: &mut [Vec], (x, y): (i32, i32), count: &mut i32) { + let mut queue = VecDeque::new(); + queue.push_back((x, y)); + visited[x as usize][y as usize] = true; + *count += 1; + while let Some((cur_x, cur_y)) = queue.pop_front() { + for (dx, dy) in Self::DIRECTIONS { + let (nx, ny) = (cur_x + dx, cur_y + dy); + if nx < 0 || nx >= grid.len() as i32 || ny < 0 || ny >= grid[0].len() as i32 { + continue; + } + let (nx, ny) = (nx as usize, ny as usize); + if !visited[nx][ny] && grid[nx][ny] == 1 { + visited[nx][ny] = true; + queue.push_back((nx as i32, ny as i32)); + *count += 1; + } + } + } + } +} +``` +

From 1a54008ef0456c41c9c20a2b0bb4438c284bee1f Mon Sep 17 00:00:00 2001 From: fwqaaq Date: Mon, 21 Aug 2023 22:32:55 +0800 Subject: [PATCH 2214/3019] Apply suggestions from code review --- ...32\204\346\234\200\345\244\247\351\235\242\347\247\257.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/problems/0695.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" "b/problems/0695.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" index b8b2ea72f5..3dd181a3ef 100644 --- "a/problems/0695.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" +++ "b/problems/0695.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" @@ -418,7 +418,7 @@ impl Solution { } pub fn dfs( - grid: &Vec>, + grid: &[Vec], visited: &mut [Vec], (x, y): (i32, i32), count: &mut i32, @@ -463,7 +463,7 @@ impl Solution { } pub fn dfs( - grid: &Vec>, + grid: &[Vec], visited: &mut [Vec], (x, y): (i32, i32), count: &mut i32, From 90ce46042d3835cb8ecff1689253e2786816ea9a Mon Sep 17 00:00:00 2001 From: fwqaaq Date: Mon, 21 Aug 2023 23:08:18 +0800 Subject: [PATCH 2215/3019] =?UTF-8?q?Update=201020.=E9=A3=9E=E5=9C=B0?= =?UTF-8?q?=E7=9A=84=E6=95=B0=E9=87=8F.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...60\347\232\204\346\225\260\351\207\217.md" | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git "a/problems/1020.\351\243\236\345\234\260\347\232\204\346\225\260\351\207\217.md" "b/problems/1020.\351\243\236\345\234\260\347\232\204\346\225\260\351\207\217.md" index 7538d774d2..1ef0796d98 100644 --- "a/problems/1020.\351\243\236\345\234\260\347\232\204\346\225\260\351\207\217.md" +++ "b/problems/1020.\351\243\236\345\234\260\347\232\204\346\225\260\351\207\217.md" @@ -491,6 +491,44 @@ class Solution: return ans ``` +### Rust + +dfs: + +```rust +impl Solution { + const DIRECTIONS: [(i32, i32); 4] = [(0, 1), (1, 0), (-1, 0), (0, -1)]; + + pub fn num_enclaves(mut grid: Vec>) -> i32 { + for i in 0..grid.len() { + for j in 0..grid[0].len() { + if (i == 0 || i == grid.len() - 1 || j == 0 || j == grid[0].len() - 1) + && grid[i][j] == 1 + { + Self::dfs(&mut grid, (i as i32, j as i32)); + } + } + } + grid.iter() + .map(|nums| nums.iter().filter(|&&num| num == 1).count() as i32) + .sum() + } + + pub fn dfs(grid: &mut [Vec], (x, y): (i32, i32)) { + grid[x as usize][y as usize] = 0; + for (dx, dy) in Self::DIRECTIONS { + let (nx, ny) = (x + dx, y + dy); + if nx < 0 || nx >= grid.len() as i32 || ny < 0 || ny >= grid[0].len() as i32 { + continue; + } + if grid[nx as usize][ny as usize] == 0 { + continue; + } + Self::dfs(grid, (nx, ny)); + } + } +} +``` ## 类似题目 From 1bc7ca5f8f364e5ae560854d32e6b96cb74408ec Mon Sep 17 00:00:00 2001 From: fwqaaq Date: Mon, 21 Aug 2023 23:15:44 +0800 Subject: [PATCH 2216/3019] =?UTF-8?q?Update=201020.=E9=A3=9E=E5=9C=B0?= =?UTF-8?q?=E7=9A=84=E6=95=B0=E9=87=8F.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...60\347\232\204\346\225\260\351\207\217.md" | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git "a/problems/1020.\351\243\236\345\234\260\347\232\204\346\225\260\351\207\217.md" "b/problems/1020.\351\243\236\345\234\260\347\232\204\346\225\260\351\207\217.md" index 1ef0796d98..29c237e57b 100644 --- "a/problems/1020.\351\243\236\345\234\260\347\232\204\346\225\260\351\207\217.md" +++ "b/problems/1020.\351\243\236\345\234\260\347\232\204\346\225\260\351\207\217.md" @@ -530,6 +530,51 @@ impl Solution { } ``` +bfs: + +```rust +use std::collections::VecDeque; +impl Solution { + const DIRECTIONS: [(i32, i32); 4] = [(0, 1), (1, 0), (-1, 0), (0, -1)]; + + pub fn num_enclaves(mut grid: Vec>) -> i32 { + for i in 0..grid.len() { + for j in 0..grid[0].len() { + if (i == 0 || i == grid.len() - 1 || j == 0 || j == grid[0].len() - 1) + && grid[i][j] == 1 + { + // Self::dfs(&mut grid, (i as i32, j as i32)); + Self::bfs(&mut grid, (i as i32, j as i32)); + } + } + } + grid.iter() + .map(|nums| nums.iter().filter(|&&num| num == 1).count() as i32) + .sum() + } + + pub fn bfs(grid: &mut [Vec], (x, y): (i32, i32)) { + let mut queue = VecDeque::new(); + queue.push_back((x, y)); + grid[x as usize][y as usize] = 0; + while let Some((cur_x, cur_y)) = queue.pop_front() { + for (dx, dy) in Self::DIRECTIONS { + let (nx, ny) = (cur_x + dx, cur_y + dy); + if nx < 0 || nx >= grid.len() as i32 || ny < 0 || ny >= grid[0].len() as i32 { + continue; + } + + if grid[nx as usize][ny as usize] == 0 { + continue; + } + queue.push_back((nx, ny)); + grid[nx as usize][ny as usize] = 0; + } + } + } +} +``` + ## 类似题目 From 88ca946a7dd25e78eb50730a1285476691152337 Mon Sep 17 00:00:00 2001 From: KingArthur0205 Date: Tue, 22 Aug 2023 15:00:45 +0800 Subject: [PATCH 2217/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200034.=E5=9C=A8?= =?UTF-8?q?=E6=8E=92=E5=BA=8F=E6=95=B0=E7=BB=84=E4=B8=AD=E6=9F=A5=E6=89=BE?= =?UTF-8?q?=E5=85=83=E7=B4=A0=E7=9A=84=E7=AC=AC=E4=B8=80=E4=B8=AA=E5=92=8C?= =?UTF-8?q?=E6=9C=80=E5=90=8E=E4=B8=80=E4=B8=AA=E4=BD=8D=E7=BD=AE.md=20C?= =?UTF-8?q?=E8=AF=AD=E8=A8=80=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...00\344\270\252\344\275\215\347\275\256.md" | 54 +++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git "a/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" "b/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" index e5266cd9ea..b412816686 100644 --- "a/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" +++ "b/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" @@ -739,6 +739,60 @@ class Solution { } ``` +### C +```c +int searchLeftBorder(int *nums, int numsSize, int target) { + int left = 0, right = numsSize - 1; + // 记录leftBorder没有被赋值的情况 + int leftBorder = -1; + // 边界为[left, right] + while (left <= right) { + // 更新middle值,等同于middle = (left + right) / 2 + int middle = left + ((right - left) >> 1); + // 若当前middle所指为target,将左边界设为middle,并向左继续寻找左边界 + if (nums[middle] == target) { + leftBorder = middle; + right = middle - 1; + } else if (nums[middle] > target) { + right = middle - 1; + } else { + left = middle + 1; + } + } + return leftBorder; +} +int searchRightBorder(int *nums, int numsSize, int target) { + int left = 0, right = numsSize - 1; + // 记录rightBorder没有被赋值的情况 + int rightBorder = -1; + while (left <= right) { + int middle = left + ((right - left) >> 1); + // 若当前middle所指为target,将右边界设为middle,并向右继续寻找右边界 + if (nums[middle] == target) { + rightBorder = middle; + left = middle + 1; + } else if (nums[middle] > target) { + right = middle - 1; + } else { + left = middle + 1; + } + } + return rightBorder; +} + +int* searchRange(int* nums, int numsSize, int target, int* returnSize){ + int leftBorder = searchLeftBorder(nums, numsSize, target); + int rightBorder = searchRightBorder(nums, numsSize, target); + + // 定义返回数组及数组大小 + *returnSize = 2; + int *resNums = (int*)malloc(sizeof(int) * 2); + resNums[0] = leftBorder; + resNums[1] = rightBorder; + return resNums; +} +``` +

From b985828838d53dc28eaf11316a2be5e0469e92d9 Mon Sep 17 00:00:00 2001 From: KingArthur0205 Date: Wed, 23 Aug 2023 12:19:29 +0800 Subject: [PATCH 2218/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A00283.=E6=BF=80?= =?UTF-8?q?=E5=8A=A8=E9=9B=B6=20C=E8=AF=AD=E8=A8=80=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...83.\347\247\273\345\212\250\351\233\266.md" | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git "a/problems/0283.\347\247\273\345\212\250\351\233\266.md" "b/problems/0283.\347\247\273\345\212\250\351\233\266.md" index 42232cc0c6..fc708844bd 100644 --- "a/problems/0283.\347\247\273\345\212\250\351\233\266.md" +++ "b/problems/0283.\347\247\273\345\212\250\351\233\266.md" @@ -151,6 +151,24 @@ function moveZeroes(nums: number[]): void { }; ``` +### C + +```c +void moveZeroes(int* nums, int numsSize){ + int fastIndex = 0, slowIndex = 0; + for (; fastIndex < numsSize; fastIndex++) { + if (nums[fastIndex] != 0) { + nums[slowIndex++] = nums[fastIndex]; + } + } + + // 将slowIndex之后的元素变为0 + for (; slowIndex < numsSize; slowIndex++) { + nums[slowIndex] = 0; + } +} +``` + From 660d7bcdc436c758e6094e178c8193eda7120418 Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Wed, 23 Aug 2023 15:12:47 +0800 Subject: [PATCH 2219/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E4=BB=A3=E7=A0=81=E9=9A=8F=E6=83=B3=E5=BD=95=E7=AE=97?= =?UTF-8?q?=E6=B3=95=E5=85=AC=E5=BC=80=E8=AF=BE=E9=93=BE=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...47\247\273\351\231\244\345\205\203\347\264\240.md" | 1 - "problems/0028.\345\256\236\347\216\260strStr.md" | 11 ++++++----- .../0042.\346\216\245\351\233\250\346\260\264.md" | 5 ++++- ...\267\263\350\267\203\346\270\270\346\210\217II.md" | 1 - ...\236\272\346\227\213\347\237\251\351\230\265II.md" | 1 - ...44\270\215\345\220\214\350\267\257\345\276\204.md" | 1 + ...\270\215\345\220\214\350\267\257\345\276\204II.md" | 1 + ...45\244\247\347\232\204\347\237\251\345\275\242.md" | 4 ++++ ...47\232\204\345\255\220\345\272\217\345\210\227.md" | 3 +++ ...47\232\204\345\255\220\346\225\260\347\273\204.md" | 1 - ...47\255\211\345\222\214\345\255\220\351\233\206.md" | 2 ++ ...6\233\264\345\244\247\345\205\203\347\264\240I.md" | 4 ++++ ...\233\264\345\244\247\345\205\203\347\264\240II.md" | 5 +++++ ...46\226\207\345\255\220\345\272\217\345\210\227.md" | 4 ++++ ...45\233\236\346\226\207\345\255\220\344\270\262.md" | 5 ++++- ...46\217\222\345\205\245\346\223\215\344\275\234.md" | 1 - ...46\257\217\346\227\245\346\270\251\345\272\246.md" | 4 ++++ ...46\240\221\346\200\273\347\273\223\347\257\207.md" | 1 - ...47\254\246\344\270\262\346\200\273\347\273\223.md" | 1 - ...47\220\206\350\256\272\345\237\272\347\241\200.md" | 3 +++ ...51\223\276\350\241\250\347\233\270\344\272\244.md" | 1 - 21 files changed, 45 insertions(+), 15 deletions(-) diff --git "a/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" "b/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" index 40ee3a2eae..3337d42e46 100644 --- "a/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" +++ "b/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" @@ -444,4 +444,3 @@ public class Solution { - diff --git "a/problems/0028.\345\256\236\347\216\260strStr.md" "b/problems/0028.\345\256\236\347\216\260strStr.md" index 53b57fd534..207a047d60 100644 --- "a/problems/0028.\345\256\236\347\216\260strStr.md" +++ "b/problems/0028.\345\256\236\347\216\260strStr.md" @@ -27,16 +27,16 @@ 当 needle 是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题。 对于本题而言,当 needle 是空字符串时我们应当返回 0 。这与C语言的 strstr() 以及 Java的 indexOf() 定义相符。 +## 算法公开课 -## 思路 - -本题是KMP 经典题目。 - -以下文字如果看不进去,可以看我的B站视频: +本题是KMP 经典题目。以下文字如果看不进去,可以看[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html),相信结合视频再看本篇题解,更有助于大家对本题的理解。 * [帮你把KMP算法学个通透!B站(理论篇)](https://www.bilibili.com/video/BV1PD4y1o7nd/) * [帮你把KMP算法学个通透!(求next数组代码篇)](https://www.bilibili.com/video/BV1M5411j7Xx) + +## 思路 + KMP的经典思想就是:**当出现字符串不匹配时,可以记录一部分之前已经匹配的文本内容,利用这些信息避免从头再去做匹配。** 本篇将以如下顺序来讲解KMP, @@ -1362,3 +1362,4 @@ impl Solution { + diff --git "a/problems/0042.\346\216\245\351\233\250\346\260\264.md" "b/problems/0042.\346\216\245\351\233\250\346\260\264.md" index 1f1a543b35..760ebc34a4 100644 --- "a/problems/0042.\346\216\245\351\233\250\346\260\264.md" +++ "b/problems/0042.\346\216\245\351\233\250\346\260\264.md" @@ -28,6 +28,10 @@ * 输入:height = [4,2,0,3,2,5] * 输出:9 +## 算法公开课 + +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[单调栈,经典来袭!LeetCode:42.接雨水](https://www.bilibili.com/video/BV1uD4y1u75P/),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 + ## 思路 @@ -1029,4 +1033,3 @@ impl Solution { - diff --git "a/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" "b/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" index 02c8e4862e..fbd848665b 100644 --- "a/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" +++ "b/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" @@ -469,4 +469,3 @@ impl Solution { - diff --git "a/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" "b/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" index 78d9385a23..515c4fb513 100644 --- "a/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" +++ "b/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" @@ -744,4 +744,3 @@ end - diff --git "a/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" "b/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" index 985c7575af..b7ce542ebe 100644 --- "a/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" +++ "b/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" @@ -559,3 +559,4 @@ public class Solution + diff --git "a/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" "b/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" index 3d243a7a8f..8b842858e7 100644 --- "a/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" +++ "b/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" @@ -739,3 +739,4 @@ object Solution { + diff --git "a/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" "b/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" index 9b76229af0..47ed0f3385 100644 --- "a/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" +++ "b/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" @@ -20,6 +20,10 @@ * 1 <= heights.length <=10^5 * 0 <= heights[i] <= 10^4 +## 算法公开课 + +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[单调栈,又一次经典来袭! LeetCode:84.柱状图中最大的矩形](https://www.bilibili.com/video/BV1Ns4y1o7uB/),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 + ## 思路 本题和[42. 接雨水](https://programmercarl.com/0042.接雨水.html),是遥相呼应的两道题目,建议都要仔细做一做,原理上有很多相同的地方,但细节上又有差异,更可以加深对单调栈的理解! diff --git "a/problems/0115.\344\270\215\345\220\214\347\232\204\345\255\220\345\272\217\345\210\227.md" "b/problems/0115.\344\270\215\345\220\214\347\232\204\345\255\220\345\272\217\345\210\227.md" index d925c5dede..b1de0cebbe 100644 --- "a/problems/0115.\344\270\215\345\220\214\347\232\204\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0115.\344\270\215\345\220\214\347\232\204\345\255\220\345\272\217\345\210\227.md" @@ -21,6 +21,9 @@ * 0 <= s.length, t.length <= 1000 * s 和 t 由英文字母组成 +## 算法公开课 + +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[动态规划之子序列,为了编辑距离做铺垫 | LeetCode:115.不同的子序列](https://www.bilibili.com/video/BV1fG4y1m75Q/),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 ## 思路 diff --git "a/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" "b/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" index 4b1d0e9608..afce264695 100644 --- "a/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" +++ "b/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" @@ -563,4 +563,3 @@ public class Solution { - diff --git "a/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" "b/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" index 2b2be1037d..81eb4c807a 100644 --- "a/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" +++ "b/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" @@ -4,6 +4,7 @@

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+ # 416. 分割等和子集 [力扣题目链接](https://leetcode.cn/problems/partition-equal-subset-sum/) @@ -730,3 +731,4 @@ object Solution { + diff --git "a/problems/0496.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240I.md" "b/problems/0496.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240I.md" index 6bcafafba2..f01d8333a3 100644 --- "a/problems/0496.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240I.md" +++ "b/problems/0496.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240I.md" @@ -37,6 +37,10 @@ nums1 中数字 x 的下一个更大元素是指 x 在 nums2 中对应位 * nums1和nums2中所有整数 互不相同 * nums1 中的所有整数同样出现在 nums2 中 +## 算法公开课 + +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[单调栈,套上一个壳子就有点绕了| LeetCode:496.下一个更大元素](https://www.bilibili.com/video/BV1jA411m7dX/),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 + ## 思路 做本题之前,建议先做一下[739. 每日温度](https://programmercarl.com/0739.每日温度.html) diff --git "a/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" "b/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" index d211a68072..3bddd29877 100644 --- "a/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" +++ "b/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" @@ -21,6 +21,10 @@ * 1 <= nums.length <= 10^4 * -10^9 <= nums[i] <= 10^9 +## 算法公开课 + +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[单调栈,成环了可怎么办?LeetCode:503.下一个更大元素II](https://www.bilibili.com/video/BV15y4y1o7Dw/),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 + ## 思路 @@ -294,3 +298,4 @@ impl Solution { + diff --git "a/problems/0516.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\345\272\217\345\210\227.md" "b/problems/0516.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\345\272\217\345\210\227.md" index 8092758389..7df2aa3d15 100644 --- "a/problems/0516.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0516.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\345\272\217\345\210\227.md" @@ -27,6 +27,10 @@ * 1 <= s.length <= 1000 * s 只包含小写英文字母 +## 算法公开课 + +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[动态规划再显神通,LeetCode:516.最长回文子序列](https://www.bilibili.com/video/BV1d8411K7W6/),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 + ## 思路 diff --git "a/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" "b/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" index fdf83736a0..0ed49bc1af 100644 --- "a/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" +++ "b/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" @@ -26,6 +26,10 @@ 提示:输入的字符串长度不会超过 1000 。 +## 算法公开课 + +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[动态规划,字符串性质决定了DP数组的定义 | LeetCode:647.回文子串](https://www.bilibili.com/video/BV17G4y1y7z9/),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 + ## 思路 ### 暴力解法 @@ -528,4 +532,3 @@ function expandRange(s: string, left: number, right: number): number { - diff --git "a/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" "b/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" index 511d161c70..1042b5a740 100644 --- "a/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" +++ "b/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" @@ -697,4 +697,3 @@ impl Solution { - diff --git "a/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" "b/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" index fc1a80631c..fdb11c63e3 100644 --- "a/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" +++ "b/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" @@ -17,6 +17,10 @@ 提示:气温 列表长度的范围是 [1, 30000]。每个气温的值的均为华氏度,都是在 [30, 100] 范围内的整数。 +## 算法公开课 + +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[单调栈,你该了解的,这里都讲了!LeetCode:739.每日温度](https://www.bilibili.com/video/BV1my4y1Z7jj/),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 + ## 思路 diff --git "a/problems/\344\272\214\345\217\211\346\240\221\346\200\273\347\273\223\347\257\207.md" "b/problems/\344\272\214\345\217\211\346\240\221\346\200\273\347\273\223\347\257\207.md" index 829495438d..739184bbf7 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\346\200\273\347\273\223\347\257\207.md" @@ -163,4 +163,3 @@ - diff --git "a/problems/\345\255\227\347\254\246\344\270\262\346\200\273\347\273\223.md" "b/problems/\345\255\227\347\254\246\344\270\262\346\200\273\347\273\223.md" index 5c2f016471..df4db78729 100644 --- "a/problems/\345\255\227\347\254\246\344\270\262\346\200\273\347\273\223.md" +++ "b/problems/\345\255\227\347\254\246\344\270\262\346\200\273\347\273\223.md" @@ -128,4 +128,3 @@ KMP算法是字符串查找最重要的算法,但彻底理解KMP并不容易 - diff --git "a/problems/\350\264\252\345\277\203\347\256\227\346\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\350\264\252\345\277\203\347\256\227\346\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md" index 0b90da6a7e..cac2929251 100644 --- "a/problems/\350\264\252\345\277\203\347\256\227\346\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\350\264\252\345\277\203\347\256\227\346\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -11,6 +11,9 @@ 贪心算法大纲 +## 算法公开课 + +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[贪心算法理论基础!](https://www.bilibili.com/video/BV1WK4y1R71x/),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 ## 什么是贪心 diff --git "a/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" "b/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" index 833eadca6a..5de9da5c06 100644 --- "a/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" +++ "b/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" @@ -508,4 +508,3 @@ object Solution { - From a99b89d002cf237ed7da4b8eabd3d142efe2e849 Mon Sep 17 00:00:00 2001 From: TFTree <83645868+TFTree@users.noreply.github.com> Date: Thu, 24 Aug 2023 08:22:19 +0800 Subject: [PATCH 2220/3019] =?UTF-8?q?=E5=B9=B6=E6=9F=A5=E9=9B=86=E9=85=8D?= =?UTF-8?q?=E5=9B=BE=E5=8B=98=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 正确的图片应该是9指向6而不是9指向2 --- ...\233\206\347\220\206\350\256\272\345\237\272\347\241\200.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/\345\233\276\350\256\272\345\271\266\346\237\245\351\233\206\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\345\233\276\350\256\272\345\271\266\346\237\245\351\233\206\347\220\206\350\256\272\345\237\272\347\241\200.md" index 5cd753e9ba..973c661e42 100644 --- "a/problems/\345\233\276\350\256\272\345\271\266\346\237\245\351\233\206\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\345\233\276\350\256\272\345\271\266\346\237\245\351\233\206\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -292,7 +292,7 @@ join(2, 9); 此时我们生成的的有向图为: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20230526122203.png) +![](https://cdn.tftree.top/others/jion.jpg) 有录友可能想,`join(3, 8)` 在图中为什么 将 元素1 连向元素 3 而不是将 元素 8 连向 元素 3 呢? From d69a1b161a902f99a2e65b04fa8fe8b977f1973f Mon Sep 17 00:00:00 2001 From: TFTree <83645868+TFTree@users.noreply.github.com> Date: Thu, 24 Aug 2023 08:55:23 +0800 Subject: [PATCH 2221/3019] =?UTF-8?q?=E5=B9=B6=E6=9F=A5=E9=9B=86=E7=90=86?= =?UTF-8?q?=E8=AE=BA=E5=9F=BA=E7=A1=80=E5=8B=98=E8=AF=AF(=E4=B8=8D?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=9B=BE=E7=89=87)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修改代码使其与图片内容吻合 --- ...233\206\347\220\206\350\256\272\345\237\272\347\241\200.md" | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git "a/problems/\345\233\276\350\256\272\345\271\266\346\237\245\351\233\206\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\345\233\276\350\256\272\345\271\266\346\237\245\351\233\206\347\220\206\350\256\272\345\237\272\347\241\200.md" index 5cd753e9ba..2f61b09d2f 100644 --- "a/problems/\345\233\276\350\256\272\345\271\266\346\237\245\351\233\206\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\345\233\276\350\256\272\345\271\266\346\237\245\351\233\206\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -285,9 +285,8 @@ join(1, 8); join(3, 8); join(1, 7); join(8, 5); -join(6, 2); join(2, 9); - +join(6, 2); ``` 此时我们生成的的有向图为: From aa1cc80e3cc394ca5b0207db84c1a3a790d035da Mon Sep 17 00:00:00 2001 From: KingArthur0205 Date: Thu, 24 Aug 2023 10:47:38 +0800 Subject: [PATCH 2222/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20=E9=93=BE?= =?UTF-8?q?=E8=A1=A8=E7=90=86=E8=AE=BA=E5=9F=BA=E7=A1=80=E9=93=BE=E8=A1=A8?= =?UTF-8?q?=E8=8A=82=E7=82=B9C=E8=AF=AD=E8=A8=80=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E5=AE=9A=E4=B9=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...347\220\206\350\256\272\345\237\272\347\241\200.md" | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git "a/problems/\351\223\276\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\351\223\276\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" index da5a1b0244..9dc4524269 100644 --- "a/problems/\351\223\276\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\351\223\276\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -241,6 +241,16 @@ impl ListNode { ``` +### C: + +```c +typedef struct ListNodeT { + int val; + struct ListNodeT next; +} ListNode; +``` + +

From 1e207bfc6b2f546c8a38ed005416076d0da9ef46 Mon Sep 17 00:00:00 2001 From: han Date: Thu, 24 Aug 2023 20:47:01 +0800 Subject: [PATCH 2223/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A00077.=E7=BB=84?= =?UTF-8?q?=E5=90=88=20Ruby=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "problems/0077.\347\273\204\345\220\210.md" | 29 +++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git "a/problems/0077.\347\273\204\345\220\210.md" "b/problems/0077.\347\273\204\345\220\210.md" index 8d448739c0..a7f00ffed9 100644 --- "a/problems/0077.\347\273\204\345\220\210.md" +++ "b/problems/0077.\347\273\204\345\220\210.md" @@ -764,6 +764,35 @@ object Solution { } ``` +### Ruby + +```ruby + +def combine(n, k) + result = [] + path = [] + backtracking(result, path, n, 1, k) + return result +end + +#剪枝优化 +def backtracking(result, path, n, j, k) + if path.size == k + result << path.map {|item| item} + return + end + + for i in j..(n-(k - path.size)) + 1 + #处理节点 + path << i + backtracking(result, path, n, i + 1, k) + #回溯,撤销处理过的节点 + path.pop + end +end + +``` +

From 2393f86448a3ae64514bfc4dea3ab0bb2d5fc8f0 Mon Sep 17 00:00:00 2001 From: hbm666 <1208415748@qq.com> Date: Sun, 27 Aug 2023 11:17:01 +0800 Subject: [PATCH 2224/3019] =?UTF-8?q?=E6=94=B9=E4=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\213\350\275\254\345\255\227\347\254\246\344\270\262.md" | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git "a/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" "b/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" index a3fb7ab330..f58135eb2b 100644 --- "a/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" @@ -120,8 +120,9 @@ class Solution { ``` ```java -//解法二:空间复杂度:O(1)。用原始数组来进行反转操作 -//思路为:先整个字符串反转,再反转前面的,最后反转后面 n 个 +// 解法二 +// 空间复杂度:O(n)。String 的 toCharArray() 方法底层会 new 一个和原字符串相同大小的 char 数组 +// 思路为:先整个字符串反转,再反转前面的,最后反转后面 n 个 class Solution { public String reverseLeftWords(String s, int n) { char[] chars = s.toCharArray(); @@ -418,3 +419,4 @@ impl Solution { + From a03b6a37de06660adabcb44fc32fdaed2fc54046 Mon Sep 17 00:00:00 2001 From: hbm666 <1208415748@qq.com> Date: Sun, 27 Aug 2023 11:52:13 +0800 Subject: [PATCH 2225/3019] =?UTF-8?q?=E5=86=8D=E6=AC=A1=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git "a/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" "b/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" index f58135eb2b..310f2092e1 100644 --- "a/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" @@ -418,5 +418,4 @@ impl Solution {

- - + \ No newline at end of file From a2f4933faa0dcaf2d4de49ab3d951f1e20261ca0 Mon Sep 17 00:00:00 2001 From: hbm666 <1208415748@qq.com> Date: Sun, 27 Aug 2023 11:54:02 +0800 Subject: [PATCH 2226/3019] =?UTF-8?q?=E5=86=8D=E6=AC=A1=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" "b/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" index 310f2092e1..a516213c3c 100644 --- "a/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" @@ -418,4 +418,4 @@ impl Solution {

- \ No newline at end of file + From fd5a171e886df7c9cd8090272f272b4e2a16fc5d Mon Sep 17 00:00:00 2001 From: hbm666 <1208415748@qq.com> Date: Sun, 27 Aug 2023 20:15:48 +0800 Subject: [PATCH 2227/3019] =?UTF-8?q?=E7=AC=AC=E4=BA=8C=E5=A4=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git "a/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" "b/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" index 0c1a526f38..bbd793d1ac 100644 --- "a/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" +++ "b/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" @@ -311,7 +311,7 @@ class Solution { ``` ```java -//解法三:双反转+移位,在原始数组上进行反转。空间复杂度O(1) +//解法三:双反转+移位,String 的 toCharArray() 方法底层会 new 一个和原字符串相同大小的 char 数组,空间复杂度:O(n) class Solution { /** * 思路: @@ -976,3 +976,4 @@ char * reverseWords(char * s){ + From 43e0fd9d7712453fd884d4a319c89e7f8edd0c9b Mon Sep 17 00:00:00 2001 From: hbm666 <1208415748@qq.com> Date: Sun, 27 Aug 2023 20:23:05 +0800 Subject: [PATCH 2228/3019] =?UTF-8?q?151.=E7=BF=BB=E8=BD=AC=E5=AD=97?= =?UTF-8?q?=E7=AC=A6=E4=B8=B2=E9=87=8C=E7=9A=84=E5=8D=95=E8=AF=8D=20-=20Ja?= =?UTF-8?q?va=E9=94=99=E8=AF=AF=E6=B3=A8=E9=87=8A=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...4\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" | 1 - 1 file changed, 1 deletion(-) diff --git "a/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" "b/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" index bbd793d1ac..111c07e4f5 100644 --- "a/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" +++ "b/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" @@ -976,4 +976,3 @@ char * reverseWords(char * s){ - From ca197783d20194a10202d9033e5b1ec6da3c9d2a Mon Sep 17 00:00:00 2001 From: Siqi Cao <90129698+gitcsq@users.noreply.github.com> Date: Sun, 27 Aug 2023 14:13:18 -0400 Subject: [PATCH 2229/3019] =?UTF-8?q?Update=20=E4=BF=AE=E6=AD=A3=200225.?= =?UTF-8?q?=E7=94=A8=E9=98=9F=E5=88=97=E5=AE=9E=E7=8E=B0=E6=A0=88=20python?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...27\345\256\236\347\216\260\346\240\210.md" | 37 +++++++++++++++++-- 1 file changed, 34 insertions(+), 3 deletions(-) diff --git "a/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" "b/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" index 13b742f839..14b7beb916 100644 --- "a/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" +++ "b/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" @@ -454,13 +454,34 @@ class MyStack: def top(self) -> int: """ + 写法一: 1. 首先确认不空 - 2. 我们仅有in会存放数据,所以返回第一个即可 + 2. 我们仅有in会存放数据,所以返回第一个即可(这里实际上用到了栈) + 写法二: + 1. 首先确认不空 + 2. 因为队列的特殊性,FIFO,所以我们只有在pop()的时候才会使用queue_out + 3. 先把queue_in中的所有元素(除了最后一个),依次出列放进queue_out + 4. 交换in和out,此时out里只有一个元素 + 5. 把out中的pop出来,即是原队列的最后一个,并使用temp变量暂存 + 6. 把temp追加到queue_in的末尾 """ + # 写法一: + # if self.empty(): + # return None + + # return self.queue_in[-1] # 这里实际上用到了栈,因为直接获取了queue_in的末尾元素 + + # 写法二: if self.empty(): return None + + for i in range(len(self.queue_in) - 1): + self.queue_out.append(self.queue_in.popleft()) - return self.queue_in[-1] + self.queue_in, self.queue_out = self.queue_out, self.queue_in + temp = self.queue_out.popleft() + self.queue_in.append(temp) + return temp def empty(self) -> bool: @@ -488,9 +509,19 @@ class MyStack: return self.que.popleft() def top(self) -> int: + # 写法一: + # if self.empty(): + # return None + # return self.que[-1] + + # 写法二: if self.empty(): return None - return self.que[-1] + for i in range(len(self.que)-1): + self.que.append(self.que.popleft()) + temp = self.que.popleft() + self.que.append(temp) + return temp def empty(self) -> bool: return not self.que From a01c3f78cf18a0eed0e236bdb48369c662e10b12 Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Mon, 28 Aug 2023 15:25:11 +0800 Subject: [PATCH 2230/3019] Update --- ...\236\272\346\227\213\347\237\251\351\230\265II.md" | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git "a/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" "b/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" index 78d9385a23..cab955b609 100644 --- "a/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" +++ "b/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" @@ -211,10 +211,6 @@ class Solution: ```javascript -/** - * @param {number} n - * @return {number[][]} - */ var generateMatrix = function(n) { let startX = startY = 0; // 起始位置 let loop = Math.floor(n/2); // 旋转圈数 @@ -226,11 +222,11 @@ var generateMatrix = function(n) { while (loop--) { let row = startX, col = startY; // 上行从左到右(左闭右开) - for (; col < startY + n - offset; col++) { + for (; col < n - offset; col++) { res[row][col] = count++; } // 右列从上到下(左闭右开) - for (; row < startX + n - offset; row++) { + for (; row < n - offset; row++) { res[row][col] = count++; } // 下行从右到左(左闭右开) @@ -247,7 +243,7 @@ var generateMatrix = function(n) { startY++; // 更新offset - offset += 2; + offset += 1; } // 如果n为奇数的话,需要单独给矩阵最中间的位置赋值 if (n % 2 === 1) { @@ -255,6 +251,7 @@ var generateMatrix = function(n) { } return res; }; + ``` From 99eb035fee885decbd4438145c3f48d28e981e23 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=93=88=E5=93=88=E5=93=88?= <76643786+Projecthappy@users.noreply.github.com> Date: Tue, 29 Aug 2023 11:12:04 +0800 Subject: [PATCH 2231/3019] =?UTF-8?q?Update=200051.N=E7=9A=87=E5=90=8E.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "problems/0051.N\347\232\207\345\220\216.md" | 52 -------------------- 1 file changed, 52 deletions(-) diff --git "a/problems/0051.N\347\232\207\345\220\216.md" "b/problems/0051.N\347\232\207\345\220\216.md" index 71c40238ec..6bc4fa78c6 100644 --- "a/problems/0051.N\347\232\207\345\220\216.md" +++ "b/problems/0051.N\347\232\207\345\220\216.md" @@ -345,58 +345,6 @@ class Solution { } } ``` -```java -//该方法主要特点在于用一个一维数组暂存皇后的位置,数组下标代表行,数组下标的值代表列,并初始化一个长度为n-1,值全为'.'的模板字符串 -//在找到合法方案时,遍历数组,在模板字符串下标为数组值的位置插入Q -class Solution { - //结果 - List> result = new ArrayList<>(); - //储存皇后的位置,下标为行,值为列 - int[] queenIndex; - //棋盘中一行的字符串模板 - String template; - int size; - - public List> solveNQueens(int n) { - size = n; - template = ".".repeat(n - 1); - queenIndex = new int[n]; - deal(0); - return result; - } - - void deal(int index) { - //遍历当前行的所有位置(尝试在这行每个位置放置皇后) - for (int i = 0; i < size; i++) { - queenIndex[index] = i; - //检查在当前位置放置皇后是否合法 - if (check(index, i)) { - //如果当前的行是最后一行,就说明当前皇后的摆放已经是完整并且合法的,在结果集中加入当前的摆放方案 - if (index == size - 1) { - List tmp = new ArrayList<>(size); - //遍历当前的皇后位置,在模板字符串对应的位置加入Q,再加入到结果集中 - for (Integer integer : queenIndex) { - tmp.add(new StringBuilder(template).insert(integer, "Q").toString()); - } - result.add(tmp); - return; - } - //如果当前不是最后一行,还需要进入下一行 - deal(index + 1); - } - } - } - - boolean check(int rowIndex, int columnIndex) { - for (int i = 0; i < rowIndex; i++) { - if (queenIndex[i] == columnIndex || (Math.abs(queenIndex[i] - columnIndex) == Math.abs(i - rowIndex))) { - return false; - } - } - return true; - } -} -``` ### Python From 7d770507c3217eb69bd0b15ec4a8eb6bfad56010 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=93=88=E5=93=88=E5=93=88?= <76643786+Projecthappy@users.noreply.github.com> Date: Tue, 29 Aug 2023 11:23:38 +0800 Subject: [PATCH 2232/3019] =?UTF-8?q?=E5=AE=8C=E5=96=84java=E6=96=B0?= =?UTF-8?q?=E6=96=B9=E6=B3=95=E7=9A=84=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...11\346\216\222\350\241\214\347\250\213.md" | 151 +++++++++--------- 1 file changed, 73 insertions(+), 78 deletions(-) diff --git "a/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" "b/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" index 2498fbfe53..ab144f43ce 100644 --- "a/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" +++ "b/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" @@ -261,84 +261,6 @@ for (pair& target : targets[result[result.size() - 1]]) ### Java -```java -/* 首先遍历所有机票,将机票转换成map,其中起点作为key,终点按照字典顺序插入到终点的列表中 - 然后进入递归,递归中首先在result中加入当前位置,如果票用完了就说明这条路走通了 - 递归中遍历从当前位置出发的终点(也就是map中key为当前位置的列表),因为列表是有序的,因此只要出现能走通的路径,这条路径就是字典排序最低的 - 在遍历中,首先从map中移除当前的机票,将遍历到的终点作为起点进入下一层的递归中,如果发现当前机票往后走走不通,再把当前的机票加到map中*/ -class Solution { - //key为起点,value是有序的终点的列表 - Map> ticketMap = new HashMap<>(); - LinkedList result = new LinkedList<>(); - - public List findItinerary(List> tickets) { - //遍历tickets,存入ticketMap中 - for (List ticket : tickets) { - addNew(ticket.get(0), ticket.get(1)); - } - deal("JFK"); - return result; - } - - boolean deal(String currentLocation) { - result.add(currentLocation); - //机票全部用完,找到最小字符路径 - if (ticketMap.isEmpty()) { - return true; - } - //当前位置的终点列表 - LinkedList targetLocations = ticketMap.get(currentLocation); - //机票没用完,但是没有从当前位置出发的机票了,说明这条路走不通 - if (targetLocations == null) { - return false; - } - //终点列表中遍历到的终点 - String targetLocation; - //遍历从当前位置出发的机票 - for (int i = 0; i < targetLocations.size(); i++) { - targetLocation = targetLocations.get(i); - //删除map中的机票,如果当前位置只有一个终点,直接删除k,v,有多个终点则删除终点列表中当前的终点 - if (targetLocations.size() == 1) { - ticketMap.remove(currentLocation); - } else { - targetLocations.remove(i); - } - //递归 - if (deal(targetLocation)) { - return true; - } else { - //路线走不通,将机票重新加到map中 - addNew(currentLocation, targetLocation); - result.removeLast(); - } - } - return false; - } - - /** - * 在map中添加新元素 - * - * @param start 起点 - * @param end 终点 - */ - void addNew(String start, String end) { - LinkedList startAllEnd = ticketMap.get(start); - if (startAllEnd != null) { - for (int i = 0; i < startAllEnd.size() + 1; i++) { - if (i == startAllEnd.size() || end.compareTo(startAllEnd.get(i)) < 0) { - startAllEnd.add(i, end); - break; - } - } - } else { - LinkedList ends = new LinkedList<>(); - ends.add(end); - ticketMap.put(start, ends); - } - } -} -``` - ```java class Solution { private LinkedList res; @@ -423,6 +345,79 @@ class Solution { } ``` +```java +/* 该方法是对第二个方法的改进,主要变化在于将某点的所有终点变更为链表的形式,优点在于 + 1.添加终点时直接在对应位置添加节点,避免了TreeMap增元素时的频繁调整 + 2.同时每次对终点进行增加删除查找时直接通过下标操作,避免hashMap反复计算hash*/ +class Solution { + //key为起点,value是有序的终点的列表 + Map> ticketMap = new HashMap<>(); + LinkedList result = new LinkedList<>(); + int total; + + public List findItinerary(List> tickets) { + total = tickets.size() + 1; + //遍历tickets,存入ticketMap中 + for (List ticket : tickets) { + addNew(ticket.get(0), ticket.get(1)); + } + deal("JFK"); + return result; + } + + boolean deal(String currentLocation) { + result.add(currentLocation); + //机票全部用完,找到最小字符路径 + if (result.size() == total) { + return true; + } + //当前位置的终点列表 + LinkedList targetLocations = ticketMap.get(currentLocation); + //没有从当前位置出发的机票了,说明这条路走不通 + if (targetLocations != null && !targetLocations.isEmpty()) { + //终点列表中遍历到的终点 + String targetLocation; + //遍历从当前位置出发的机票 + for (int i = 0; i < targetLocations.size(); i++) { + targetLocation = targetLocations.get(i); + //删除终点列表中当前的终点 + targetLocations.remove(i); + //递归 + if (deal(targetLocation)) { + return true; + } + //路线走不通,将机票重新加回去 + targetLocations.add(i, targetLocation); + result.removeLast(); + } + } + return false; + } + + /** + * 在map中按照字典顺序添加新元素 + * + * @param start 起点 + * @param end 终点 + */ + void addNew(String start, String end) { + LinkedList startAllEnd = ticketMap.getOrDefault(start, new LinkedList<>()); + if (!startAllEnd.isEmpty()) { + for (int i = 0; i < startAllEnd.size(); i++) { + if (end.compareTo(startAllEnd.get(i)) < 0) { + startAllEnd.add(i, end); + return; + } + } + startAllEnd.add(startAllEnd.size(), end); + } else { + startAllEnd.add(end); + ticketMap.put(start, startAllEnd); + } + } +} +``` + ### Python 回溯 使用used数组 From 4d532348fc1714de1cb07c0e28710b1228188aab Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Tue, 29 Aug 2023 19:12:30 +0800 Subject: [PATCH 2233/3019] Update --- ...77\347\232\204\345\221\250\351\225\277.md" | 31 +++++++++++++++++++ ...06\350\256\272\345\237\272\347\241\200.md" | 2 -- ...06\350\256\272\345\237\272\347\241\200.md" | 1 - 3 files changed, 31 insertions(+), 3 deletions(-) diff --git "a/problems/0463.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" "b/problems/0463.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" index 48e64d0bd2..2e954e30ad 100644 --- "a/problems/0463.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" +++ "b/problems/0463.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" @@ -10,6 +10,37 @@ [力扣题目链接](https://leetcode.cn/problems/island-perimeter/) +给定一个 row x col 的二维网格地图 grid ,其中:grid[i][j] = 1 表示陆地, grid[i][j] = 0 表示水域。 + +网格中的格子 水平和垂直 方向相连(对角线方向不相连)。整个网格被水完全包围,但其中恰好有一个岛屿(或者说,一个或多个表示陆地的格子相连组成的岛屿)。 + +岛屿中没有“湖”(“湖” 指水域在岛屿内部且不和岛屿周围的水相连)。格子是边长为 1 的正方形。网格为长方形,且宽度和高度均不超过 100 。计算这个岛屿的周长。 + + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20230829180848.png) + +* 输入:grid = [[0,1,0,0],[1,1,1,0],[0,1,0,0],[1,1,0,0]] +* 输出:16 +* 解释:它的周长是上面图片中的 16 个黄色的边 + + +示例 2: + +* 输入:grid = [[1]] +* 输出:4 + +示例 3: + +* 输入:grid = [[1,0]] +* 输出:4 + +提示: + +* row == grid.length +* col == grid[i].length +* 1 <= row, col <= 100 +* grid[i][j] 为 0 或 1 + ## 思路 岛屿问题最容易让人想到BFS或者DFS,但是这道题还真的没有必要,别把简单问题搞复杂了。 diff --git "a/problems/\345\233\276\350\256\272\345\271\266\346\237\245\351\233\206\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\345\233\276\350\256\272\345\271\266\346\237\245\351\233\206\347\220\206\350\256\272\345\237\272\347\241\200.md" index 5cd753e9ba..bc520e8ee8 100644 --- "a/problems/\345\233\276\350\256\272\345\271\266\346\237\245\351\233\206\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\345\233\276\350\256\272\345\271\266\346\237\245\351\233\206\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -1,8 +1,6 @@ # 并查集理论基础 -图论中,关于深搜和广搜我们在这里:[钥匙和房间](https://mp.weixin.qq.com/s/E9NlJy9PW1oJuD8N2EURoQ) 已经更新完毕了。 - 接下来我们来讲一下并查集,首先当然是并查集理论基础。 ## 背景 diff --git "a/problems/\345\233\276\350\256\272\345\271\277\346\220\234\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\345\233\276\350\256\272\345\271\277\346\220\234\347\220\206\350\256\272\345\237\272\347\241\200.md" index 1f3a13728f..64ca181b90 100644 --- "a/problems/\345\233\276\350\256\272\345\271\277\346\220\234\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\345\233\276\350\256\272\345\271\277\346\220\234\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -6,7 +6,6 @@ # 广度优先搜索理论基础 -> 号外!!代码随想录图论内容已经计划开更了! 在[深度优先搜索](https://programmercarl.com/图论深搜理论基础.html)的讲解中,我们就讲过深度优先搜索和广度优先搜索的区别。 From 076d87605e29d2474f89d2e7312d2a9a2fc69818 Mon Sep 17 00:00:00 2001 From: Shixiaocaia <68102662+shixiaocaia@users.noreply.github.com> Date: Wed, 30 Aug 2023 11:26:53 +0800 Subject: [PATCH 2234/3019] =?UTF-8?q?Update=200797.=E6=89=80=E6=9C=89?= =?UTF-8?q?=E5=8F=AF=E8=83=BD=E7=9A=84=E8=B7=AF=E5=BE=84=20Go=E5=86=99?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...75\347\232\204\350\267\257\345\276\204.md" | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git "a/problems/0797.\346\211\200\346\234\211\345\217\257\350\203\275\347\232\204\350\267\257\345\276\204.md" "b/problems/0797.\346\211\200\346\234\211\345\217\257\350\203\275\347\232\204\350\267\257\345\276\204.md" index ec8288c608..5c209f6030 100644 --- "a/problems/0797.\346\211\200\346\234\211\345\217\257\350\203\275\347\232\204\350\267\257\345\276\204.md" +++ "b/problems/0797.\346\211\200\346\234\211\345\217\257\350\203\275\347\232\204\350\267\257\345\276\204.md" @@ -217,6 +217,34 @@ class Solution: self.path.pop() # 回溯 ``` +### Go + +```go +func allPathsSourceTarget(graph [][]int) [][]int { + result := make([][]int, 0) + + var trace func(path []int, step int) + trace = func(path []int, step int){ + // 从0遍历到length-1 + if step == len(graph) - 1{ + tmp := make([]int, len(path)) + copy(tmp, path) + result = append(result, tmp) + return + } + + for i := 0; i < len(graph[step]); i++{ + next := append(path, graph[step][i]) + trace(next, graph[step][i]) + } + } + // 从0开始,开始push 0进去 + trace([]int{0}, 0) + return result +} + +``` +

From 0bfd53394e9062d284586319a50aaf6cc23755eb Mon Sep 17 00:00:00 2001 From: Shixiaocaia <68102662+shixiaocaia@users.noreply.github.com> Date: Wed, 30 Aug 2023 11:35:06 +0800 Subject: [PATCH 2235/3019] =?UTF-8?q?Update=200797.=E6=89=80=E6=9C=89?= =?UTF-8?q?=E5=8F=AF=E8=83=BD=E7=9A=84=E8=B7=AF=E5=BE=84=20Go=E5=86=99?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 更新函数名为dfs --- ...57\350\203\275\347\232\204\350\267\257\345\276\204.md" | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git "a/problems/0797.\346\211\200\346\234\211\345\217\257\350\203\275\347\232\204\350\267\257\345\276\204.md" "b/problems/0797.\346\211\200\346\234\211\345\217\257\350\203\275\347\232\204\350\267\257\345\276\204.md" index 5c209f6030..e97a6d0dbd 100644 --- "a/problems/0797.\346\211\200\346\234\211\345\217\257\350\203\275\347\232\204\350\267\257\345\276\204.md" +++ "b/problems/0797.\346\211\200\346\234\211\345\217\257\350\203\275\347\232\204\350\267\257\345\276\204.md" @@ -223,8 +223,8 @@ class Solution: func allPathsSourceTarget(graph [][]int) [][]int { result := make([][]int, 0) - var trace func(path []int, step int) - trace = func(path []int, step int){ + var dfs func(path []int, step int) + dfs = func(path []int, step int){ // 从0遍历到length-1 if step == len(graph) - 1{ tmp := make([]int, len(path)) @@ -235,11 +235,11 @@ func allPathsSourceTarget(graph [][]int) [][]int { for i := 0; i < len(graph[step]); i++{ next := append(path, graph[step][i]) - trace(next, graph[step][i]) + dfs(next, graph[step][i]) } } // 从0开始,开始push 0进去 - trace([]int{0}, 0) + dfs([]int{0}, 0) return result } From 6dcc537cef392a24caa636667f1bd4730d9f2898 Mon Sep 17 00:00:00 2001 From: Shixiaocaia <68102662+shixiaocaia@users.noreply.github.com> Date: Wed, 30 Aug 2023 11:56:10 +0800 Subject: [PATCH 2236/3019] =?UTF-8?q?Update=200200.=E5=B2=9B=E5=B1=BF?= =?UTF-8?q?=E6=95=B0=E9=87=8F.=E6=B7=B1=E6=90=9C=E7=89=88=20Go=20=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...7.\346\267\261\346\220\234\347\211\210.md" | 52 ++++++++++++++++++- 1 file changed, 51 insertions(+), 1 deletion(-) diff --git "a/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\346\267\261\346\220\234\347\211\210.md" "b/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\346\267\261\346\220\234\347\211\210.md" index f610e32330..ad4a6ede9b 100644 --- "a/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\346\267\261\346\220\234\347\211\210.md" +++ "b/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\346\267\261\346\220\234\347\211\210.md" @@ -219,7 +219,7 @@ class Solution { } ``` -Python: +### Python: ```python # 版本一 @@ -279,6 +279,56 @@ class Solution: return result ``` +### Go + +```go +func numIslands(grid [][]byte) int { + // 用1标记已访问 + visited := make([][]int, len(grid)) + for i := 0; i < len(visited); i++{ + visited[i] = make([]int, len(grid[0])) + } + + var bfs func(x, y int) + bfs = func(x, y int){ + stack := make([][]int, 0) + stack = append(stack, []int{x, y}) + moveX := []int{1, -1, 0, 0} + moveY := []int{0, 0, 1, -1} + + for len(stack) != 0{ + node := stack[len(stack) - 1] + stack = stack[:len(stack) - 1] + + for i := 0; i < 4; i++{ + dx := moveX[i] + node[0] + dy := moveY[i] + node[1] + if dx < 0 || dx >= len(grid) || dy < 0 || dy >= len(grid[0]) || visited[dx][dy] == 1{ + continue + } + visited[dx][dy] = 1 + if grid[dx][dy] == '1'{ + stack = append(stack, []int{dx,dy}) + } + } + } + } + + result := 0 + for i := 0; i < len(grid); i++{ + for j := 0; j < len(grid[0]); j++{ + if visited[i][j] == 0 && grid[i][j] == '1'{ + bfs(i, j) + visited[i][j] = 1 + result++ + } + } + } + + return result +} +``` +

From 6141fc92bb04dc9f09402b77341562efb8b952d7 Mon Sep 17 00:00:00 2001 From: han Date: Wed, 30 Aug 2023 16:28:31 +0800 Subject: [PATCH 2237/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A00017.=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=20Ruby=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...27\346\257\215\347\273\204\345\220\210.md" | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git "a/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" "b/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" index b3ba1e5e5c..90296efdc1 100644 --- "a/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" +++ "b/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" @@ -694,6 +694,44 @@ object Solution { } ``` +### Ruby +```ruby +def letter_combinations(digits) + letter_map = { + 2 => ['a','b','c'], + 3 => ['d','e','f'], + 4 => ['g','h','i'], + 5 => ['j','k','l'], + 6 => ['m','n','o'], + 7 => ['p','q','r','s'], + 8 => ['t','u','v'], + 9 => ['w','x','y','z'] + } + + result = [] + path = [] + + return result if digits.size == 0 + + backtracking(result, letter_map, digits.split(''), path, 0) + result +end + +def backtracking(result, letter_map, digits, path, index) + if path.size == digits.size + result << path.join('') + return + end + + hash[digits[index].to_i].each do |chr| + path << chr + #index + 1代表处理下一个数字 + backtracking(result, letter_map, digits, path, index + 1) + #回溯,撤销处理过的数字 + path.pop + end +end +```

From 9d32bab764755465017422aadab557c612e604e3 Mon Sep 17 00:00:00 2001 From: jinjjm <1185838762@qq.com> Date: Thu, 31 Aug 2023 22:14:16 +0800 Subject: [PATCH 2238/3019] =?UTF-8?q?js=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...7.\345\271\277\346\220\234\347\211\210.md" | 36 ++++++++++++++++++ ...7.\346\267\261\346\220\234\347\211\210.md" | 33 ++++++++++++++++ ...00\345\244\247\351\235\242\347\247\257.md" | 38 +++++++++++++++++++ ...75\347\232\204\350\267\257\345\276\204.md" | 22 +++++++++++ 4 files changed, 129 insertions(+) diff --git "a/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\345\271\277\346\220\234\347\211\210.md" "b/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\345\271\277\346\220\234\347\211\210.md" index 5b9d90aa31..5acdf6e2d7 100644 --- "a/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\345\271\277\346\220\234\347\211\210.md" +++ "b/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\345\271\277\346\220\234\347\211\210.md" @@ -239,6 +239,42 @@ class Solution: visited[next_i][next_j] = True ``` +### JavaScript +```javascript +var numIslands = function (grid) { + let dir = [[0, 1], [1, 0], [-1, 0], [0, -1]]; // 四个方向 + let bfs = (grid, visited, x, y) => { + let queue = []; + queue.push([x, y]); + visited[x][y] = true; + while (queue.length) { + let top = queue.shift();//取出队列头部元素 + console.log(top) + for (let i = 0; i < 4; i++) { + let nextX = top[0] + dir[i][0] + let nextY = top[1] + dir[i][1] + if (nextX < 0 || nextX >= grid.length || nextY < 0 || nextY >= grid[0].length) + continue; + if (!visited[nextX][nextY] && grid[nextX][nextY] === "1") { + queue.push([nextX, nextY]) + visited[nextX][nextY] = true + } + } + } + } + let visited = new Array(grid.length).fill().map(() => Array(grid[0].length).fill(false)) + let res = 0 + for (let i = 0; i < grid.length; i++) { + for (let j = 0; j < grid[i].length; j++) { + if (!visited[i][j] && grid[i][j] === "1") { + ++res; + bfs(grid, visited, i, j); + } + } + } + return res +}; +```

diff --git "a/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\346\267\261\346\220\234\347\211\210.md" "b/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\346\267\261\346\220\234\347\211\210.md" index f610e32330..b8f2c992c3 100644 --- "a/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\346\267\261\346\220\234\347\211\210.md" +++ "b/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\346\267\261\346\220\234\347\211\210.md" @@ -278,6 +278,39 @@ class Solution: return result ``` +### JavaScript + +```javascript +var numIslands = function (grid) { + let dir = [[0, 1], [1, 0], [-1, 0], [0, -1]]; // 四个方向 + + let dfs = (grid, visited, x, y) => { + for (let i = 0; i < 4; i++) { + let nextX = x + dir[i][0] + let nextY = y + dir[i][1] + if (nextX < 0 || nextX >= grid.length || nextY < 0 || nextY >= grid[0].length) + continue; + if (!visited[nextX][nextY] && grid[nextX][nextY] === "1") { + visited[nextX][nextY] = true + dfs(grid,visited,nextX,nextY) + } + } + } + let visited = new Array(grid.length).fill().map(() => Array(grid[0].length).fill(false)) + + let res = 0 + for (let i = 0; i < grid.length; i++) { + for (let j = 0; j < grid[i].length; j++) { + if (!visited[i][j] && grid[i][j] === "1") { + ++res; + visited[i][j] = true; + dfs(grid, visited, i, j); + } + } + } + return res +}; +```

diff --git "a/problems/0695.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" "b/problems/0695.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" index 186f044c40..894f3a7555 100644 --- "a/problems/0695.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" +++ "b/problems/0695.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" @@ -390,6 +390,44 @@ class Solution: if 0 <= new_x < len(grid) and 0 <= new_y < len(grid[0]): self.dfs(grid, visited, new_x, new_y) ``` +### JavaScript +```javascript +var maxAreaOfIsland = function (grid) { + let dir = [[0, 1], [1, 0], [-1, 0], [0, -1]]; // 四个方向 + + let visited = new Array(grid.length).fill().map(() => Array(grid[0].length).fill(false)) + + let dfs = (grid, visited, x, y, m) => { + for (let i = 0; i < 4; i++) { + let nextX = x + dir[i][0] + let nextY = y + dir[i][1] + if (nextX < 0 || nextX >= grid.length || nextY < 0 || nextY >= grid[0].length) + continue; + if (!visited[nextX][nextY] && grid[nextX][nextY] === 1) { + visited[nextX][nextY] = true + m = dfs(grid, visited, nextX, nextY,m+1) + } + } + return m + } + + let max = 0 + + for (let i = 0; i < grid.length; i++) { + for (let j = 0; j < grid[i].length; j++) { + if (!visited[i][j] && grid[i][j] === 1) { + // 深度优先 + visited[i][j] = true; + let m = dfs(grid, visited, i, j, 1); + if (m > max) max = m; + } + } + } + return max +}; +``` + +

diff --git "a/problems/0797.\346\211\200\346\234\211\345\217\257\350\203\275\347\232\204\350\267\257\345\276\204.md" "b/problems/0797.\346\211\200\346\234\211\345\217\257\350\203\275\347\232\204\350\267\257\345\276\204.md" index ec8288c608..6b47c42eea 100644 --- "a/problems/0797.\346\211\200\346\234\211\345\217\257\350\203\275\347\232\204\350\267\257\345\276\204.md" +++ "b/problems/0797.\346\211\200\346\234\211\345\217\257\350\203\275\347\232\204\350\267\257\345\276\204.md" @@ -217,6 +217,28 @@ class Solution: self.path.pop() # 回溯 ``` +### JavaScript +```javascript +var allPathsSourceTarget = function(graph) { + let res=[],path=[] + + function dfs(graph,start){ + if(start===graph.length-1){ + res.push([...path]) + return; + } + for(let i=0;i From 12cc9a310b3ef7aaa0857a73f5eb12084403c9bc Mon Sep 17 00:00:00 2001 From: Pika-Lee Date: Mon, 4 Sep 2023 03:52:43 -0700 Subject: [PATCH 2239/3019] =?UTF-8?q?Update=200235.=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=90=9C=E7=B4=A2=E6=A0=91=E7=9A=84=E6=9C=80=E8=BF=91=E5=85=AC?= =?UTF-8?q?=E5=85=B1=E7=A5=96=E5=85=88.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修改文中描述,与图片对应(当然也可以修改图片) --- ...21\345\205\254\345\205\261\347\245\226\345\205\210.md" | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git "a/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" "b/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" index 2b8af06017..b7e92e4e80 100644 --- "a/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" +++ "b/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" @@ -50,15 +50,15 @@ 因为是有序树,所有 如果 中间节点是 q 和 p 的公共祖先,那么 中节点的数组 一定是在 [p, q]区间的。即 中节点 > p && 中节点 < q 或者 中节点 > q && 中节点 < p。 -那么只要从上到下去遍历,遇到 cur节点是数值在[p, q]区间中则一定可以说明该节点cur就是q 和 p的公共祖先。 那问题来了,**一定是最近公共祖先吗**? +那么只要从上到下去遍历,遇到 cur节点是数值在[p, q]区间中则一定可以说明该节点cur就是p 和 q的公共祖先。 那问题来了,**一定是最近公共祖先吗**? -如图,我们从根节点搜索,第一次遇到 cur节点是数值在[p, q]区间中,即 节点5,此时可以说明 p 和 q 一定分别存在于 节点 5的左子树,和右子树中。 +如图,我们从根节点搜索,第一次遇到 cur节点是数值在[q, p]区间中,即 节点5,此时可以说明 q 和 p 一定分别存在于 节点 5的左子树,和右子树中。 ![235.二叉搜索树的最近公共祖先](https://code-thinking-1253855093.file.myqcloud.com/pics/20220926164214.png) -此时节点5是不是最近公共祖先? 如果 从节点5继续向左遍历,那么将错过成为q的祖先, 如果从节点5继续向右遍历则错过成为p的祖先。 +此时节点5是不是最近公共祖先? 如果 从节点5继续向左遍历,那么将错过成为p的祖先, 如果从节点5继续向右遍历则错过成为q的祖先。 -所以当我们从上向下去递归遍历,第一次遇到 cur节点是数值在[p, q]区间中,那么cur就是 p和q的最近公共祖先。 +所以当我们从上向下去递归遍历,第一次遇到 cur节点是数值在[q, p]区间中,那么cur就是 q和p的最近公共祖先。 理解这一点,本题就很好解了。 From 9ac418bf220641a1c076f576aed36c02b0f30010 Mon Sep 17 00:00:00 2001 From: Pika-Lee Date: Mon, 4 Sep 2023 03:56:33 -0700 Subject: [PATCH 2240/3019] =?UTF-8?q?Update=20=E4=BA=8C=E5=8F=89=E6=A0=91?= =?UTF-8?q?=E7=90=86=E8=AE=BA=E5=9F=BA=E7=A1=80.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit revert change of this file --- ...\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" index e2c6d83c59..184dba604c 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -150,7 +150,7 @@ 最后再说一说二叉树中深度优先和广度优先遍历实现方式,我们做二叉树相关题目,经常会使用递归的方式来实现深度优先遍历,也就是实现前中后序遍历,使用递归是比较方便的。 -**之前我们讲栈与队列的时候,就说过栈其实就是递归的一种实现结构**,也就说前中后序遍历的逻辑其实都是可以借助栈使用递归的方式来实现的。 +**之前我们讲栈与队列的时候,就说过栈其实就是递归的一种实现结构**,也就说前中后序遍历的逻辑其实都是可以借助栈使用非递归的方式来实现的。 而广度优先遍历的实现一般使用队列来实现,这也是队列先进先出的特点所决定的,因为需要先进先出的结构,才能一层一层的来遍历二叉树。 From 7e7e0cd0c71e5fb5d4032122ddec4ab70bfa6875 Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Tue, 5 Sep 2023 10:22:26 +0800 Subject: [PATCH 2241/3019] Update --- README.md | 8 ++++++++ ...5\217\211\346\220\234\347\264\242\346\240\221.md" | 2 +- ...5\217\211\346\220\234\347\264\242\346\240\221.md" | 4 ++-- ...5\211\262\345\233\236\346\226\207\344\270\262.md" | 2 +- ...216\257\345\275\242\351\223\276\350\241\250II.md" | 2 +- ...5\256\236\347\216\260\351\230\237\345\210\227.md" | 2 +- ...5\205\250\345\271\263\346\226\271\346\225\260.md" | 2 +- ...1\233\266\351\222\261\345\205\221\346\215\242.md" | 2 +- ...11\223\345\256\266\345\212\253\350\210\215III.md" | 2 +- ...6\221\206\345\212\250\345\272\217\345\210\227.md" | 1 - ...5\242\236\345\255\220\345\272\217\345\210\227.md" | 2 +- .../0494.\347\233\256\346\240\207\345\222\214.md" | 2 +- ...4\270\255\347\232\204\344\274\227\346\225\260.md" | 2 +- ...233\266\351\222\261\345\205\221\346\215\242II.md" | 2 +- ...0\277\224\345\233\236\345\216\237\347\202\271.md" | 2 +- ...6\217\222\345\205\245\346\223\215\344\275\234.md" | 2 +- problems/qita/kstar.md | 4 ++-- problems/qita/server.md | 4 ++-- ...5\234\250\350\277\231\351\207\214\357\274\201.md" | 4 ---- "problems/\345\211\215\345\272\217/vim.md" | 4 ++-- ...4\273\243\347\240\201\351\243\216\346\240\274.md" | 2 +- ...0\257\221\350\277\220\350\241\214\357\274\237.md" | 2 +- ...5\205\254\345\217\270\346\200\273\347\273\223.md" | 3 --- ...5\272\217\345\221\230\347\256\200\345\216\206.md" | 7 ------- ...5\244\215\346\235\202\345\272\246\357\274\201.md" | 2 +- ...0\275\254\345\255\227\347\254\246\344\270\262.md" | 2 +- ...5\221\250\346\234\253\346\200\273\347\273\223.md" | 2 +- ...5\221\250\346\234\253\346\200\273\347\273\223.md" | 2 +- ...5\221\250\346\234\253\346\200\273\347\273\223.md" | 2 +- ...5\221\250\346\234\253\346\200\273\347\273\223.md" | 2 +- ...5\221\250\346\234\253\346\200\273\347\273\223.md" | 6 ++---- ...5\221\250\346\234\253\346\200\273\347\273\223.md" | 2 +- ...5\221\250\346\234\253\346\200\273\347\273\223.md" | 2 +- ...5\221\250\346\234\253\346\200\273\347\273\223.md" | 2 +- ...5\221\250\346\234\253\346\200\273\347\273\223.md" | 12 ++++++------ ...5\221\250\346\234\253\346\200\273\347\273\223.md" | 6 ------ ...5\221\250\346\234\253\346\200\273\347\273\223.md" | 4 ++-- ...7\273\223\347\263\273\345\210\227\344\270\200.md" | 2 +- ...5\233\236\346\272\257\346\200\273\347\273\223.md" | 2 +- ...7\220\206\350\256\262\350\247\243\357\274\211.md" | 4 ++-- ...5\256\214\345\205\250\350\203\214\345\214\205.md" | 2 +- ...6\263\225\346\200\273\347\273\223\347\257\207.md" | 4 ++-- 42 files changed, 57 insertions(+), 72 deletions(-) diff --git a/README.md b/README.md index d3b4fe6603..bf55a0041b 100644 --- a/README.md +++ b/README.md @@ -393,6 +393,14 @@ * [图论:1020.飞地的数量](./problems/1020.飞地的数量.md) * [图论:130.被围绕的区域](./problems/0130.被围绕的区域.md) * [图论:417.太平洋大西洋水流问题](./problems/0417.太平洋大西洋水流问题.md) +* [图论:827.最大人工岛](./problems/0827.最大人工岛.md) +* [图论:127. 单词接龙](./problems/0127.单词接龙.md) +* [图论:841.钥匙和房间](./problems/841.钥匙和房间) +* [图论:463. 岛屿的周长](./problems/0463.岛屿的周长.md) +* [图论:并查集理论基础](./problems/) +* [图论:1971. 寻找图中是否存在路径](./problems/1971.寻找图中是否存在路径.md) +* [图论:684.冗余连接](./problems/0684.冗余连接.md) +* [图论:685.冗余连接II](./problems/0685.冗余连接II.md) (持续更新中....) diff --git "a/problems/0096.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0096.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" index 8d58cc5a87..d109165b50 100644 --- "a/problems/0096.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" +++ "b/problems/0096.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" @@ -159,7 +159,7 @@ public: 可以看出我依然还是用动规五部曲来进行分析,会把题目的方方面面都覆盖到! -**而且具体这五部分析是我自己平时总结的经验,找不出来第二个的,可能过一阵子 其他题解也会有动规五部曲了,哈哈**。 +**而且具体这五部分析是我自己平时总结的经验,找不出来第二个的,可能过一阵子 其他题解也会有动规五部曲了**。 当时我在用动规五部曲讲解斐波那契的时候,一些录友和我反应,感觉讲复杂了。 diff --git "a/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" index a48ec0656b..0a64266e2f 100644 --- "a/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" +++ "b/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" @@ -249,9 +249,9 @@ public: 这道题目是一个简单题,但对于没接触过的同学还是有难度的。 -所以初学者刚开始学习算法的时候,看到简单题目没有思路很正常,千万别怀疑自己智商,学习过程都是这样的,大家智商都差不多,哈哈。 +所以初学者刚开始学习算法的时候,看到简单题目没有思路很正常,千万别怀疑自己智商,学习过程都是这样的,大家智商都差不多。 -只要把基本类型的题目都做过,总结过之后,思路自然就开阔了。 +只要把基本类型的题目都做过,总结过之后,思路自然就开阔了,加油💪 ## 其他语言版本 diff --git "a/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" "b/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" index ca73e9f7ca..80ac284309 100644 --- "a/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" +++ "b/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" @@ -300,7 +300,7 @@ public: 所以本题应该是一道hard题目了。 -**可能刷过这道题目的录友都没感受到自己原来克服了这么多难点,就把这道题目AC了**,这应该叫做无招胜有招,人码合一,哈哈哈。 +**可能刷过这道题目的录友都没感受到自己原来克服了这么多难点,就把这道题目AC了**,这应该叫做无招胜有招,人码合一。 diff --git "a/problems/0142.\347\216\257\345\275\242\351\223\276\350\241\250II.md" "b/problems/0142.\347\216\257\345\275\242\351\223\276\350\241\250II.md" index d20101a706..a643fd7091 100644 --- "a/problems/0142.\347\216\257\345\275\242\351\223\276\350\241\250II.md" +++ "b/problems/0142.\347\216\257\345\275\242\351\223\276\350\241\250II.md" @@ -187,7 +187,7 @@ public: ## 总结 -这次可以说把环形链表这道题目的各个细节,完完整整的证明了一遍,说这是全网最详细讲解不为过吧,哈哈。 +这次可以说把环形链表这道题目的各个细节,完完整整的证明了一遍,说这是全网最详细讲解不为过吧。 ## 其他语言版本 diff --git "a/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" "b/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" index c510fc12a6..2437401060 100644 --- "a/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" +++ "b/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" @@ -127,7 +127,7 @@ public: 工作中如果发现某一个功能自己要经常用,同事们可能也会用到,自己就花点时间把这个功能抽象成一个好用的函数或者工具类,不仅自己方便,也方便了同事们。 -同事们就会逐渐认可你的工作态度和工作能力,自己的口碑都是这么一点一点积累起来的!在同事圈里口碑起来了之后,你就发现自己走上了一个正循环,以后的升职加薪才少不了你!哈哈哈 +同事们就会逐渐认可你的工作态度和工作能力,自己的口碑都是这么一点一点积累起来的!在同事圈里口碑起来了之后,你就发现自己走上了一个正循环,以后的升职加薪才少不了你! diff --git "a/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" "b/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" index a0c138ee80..a0e62d4800 100644 --- "a/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" +++ "b/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" @@ -156,7 +156,7 @@ public: 但如果没有按照「代码随想录」的题目顺序来做的话,做动态规划或者做背包问题,上来就做这道题,那还是挺难的! -经过前面的训练这道题已经是简单题了,哈哈哈 +经过前面的训练这道题已经是简单题了 diff --git "a/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" "b/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" index f32fd13e23..eae4ab3ac0 100644 --- "a/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" +++ "b/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" @@ -169,7 +169,7 @@ public: 这也是大多数同学学习动态规划的苦恼所在,有的时候递推公式很简单,难在遍历顺序上! -但最终又可以稀里糊涂的把题目过了,也不知道为什么这样可以过,反正就是过了,哈哈 +但最终又可以稀里糊涂的把题目过了,也不知道为什么这样可以过,反正就是过了。 那么这篇文章就把遍历顺序分析的清清楚楚。 diff --git "a/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" "b/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" index 96d487e215..3646488912 100644 --- "a/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" +++ "b/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" @@ -216,7 +216,7 @@ public: 只不过平时我们习惯了在一维数组或者二维数组上推导公式,一下子换成了树,就需要对树的遍历方式足够了解! -大家还记不记得我在讲解贪心专题的时候,讲到这道题目:[贪心算法:我要监控二叉树!](https://programmercarl.com/0968.监控二叉树.html),这也是贪心算法在树上的应用。**那我也可以把这个算法起一个名字,叫做树形贪心**,哈哈哈 +大家还记不记得我在讲解贪心专题的时候,讲到这道题目:[贪心算法:我要监控二叉树!](https://programmercarl.com/0968.监控二叉树.html),这也是贪心算法在树上的应用。**那我也可以把这个算法起一个名字,叫做树形贪心**。 “树形贪心”词汇从此诞生,来自「代码随想录」 diff --git "a/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" "b/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" index 943dfe39b6..5203d7d61a 100644 --- "a/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" +++ "b/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" @@ -4,7 +4,6 @@

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

-> 本周讲解了[贪心理论基础](https://programmercarl.com/贪心算法理论基础.html),以及第一道贪心的题目:[贪心算法:分发饼干](https://programmercarl.com/0455.分发饼干.html),可能会给大家一种贪心算法比较简单的错觉,好了,接下来几天的题目难度要上来了,哈哈。 # 376. 摆动序列 diff --git "a/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" "b/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" index e2011372f8..eb0be005ed 100644 --- "a/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" @@ -100,7 +100,7 @@ for (int i = startIndex; i < nums.size(); i++) { } ``` -**对于已经习惯写回溯的同学,看到递归函数上面的`uset.insert(nums[i]);`,下面却没有对应的pop之类的操作,应该很不习惯吧,哈哈** +**对于已经习惯写回溯的同学,看到递归函数上面的`uset.insert(nums[i]);`,下面却没有对应的pop之类的操作,应该很不习惯吧** **这也是需要注意的点,`unordered_set uset;` 是记录本层元素是否重复使用,新的一层uset都会重新定义(清空),所以要知道uset只负责本层!** diff --git "a/problems/0494.\347\233\256\346\240\207\345\222\214.md" "b/problems/0494.\347\233\256\346\240\207\345\222\214.md" index 4a4e966c14..a90a38f71d 100644 --- "a/problems/0494.\347\233\256\346\240\207\345\222\214.md" +++ "b/problems/0494.\347\233\256\346\240\207\345\222\214.md" @@ -51,7 +51,7 @@ 如果跟着「代码随想录」一起学过[回溯算法系列](https://programmercarl.com/回溯总结.html)的录友,看到这道题,应该有一种直觉,就是感觉好像回溯法可以爆搜出来。 -事实确实如此,下面我也会给出相应的代码,只不过会超时,哈哈。 +事实确实如此,下面我也会给出相应的代码,只不过会超时。 这道题目咋眼一看和动态规划背包啥的也没啥关系。 diff --git "a/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" "b/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" index efbabc4ab6..29b0926d4d 100644 --- "a/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" +++ "b/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" @@ -280,7 +280,7 @@ public: * [二叉树:前中后序迭代法](https://programmercarl.com/二叉树的迭代遍历.html) * [二叉树:前中后序统一风格的迭代方式](https://programmercarl.com/二叉树的统一迭代法.html) -下面我给出其中的一种中序遍历的迭代法,其中间处理逻辑一点都没有变(我从递归法直接粘过来的代码,连注释都没改,哈哈) +下面我给出其中的一种中序遍历的迭代法,其中间处理逻辑一点都没有变(我从递归法直接粘过来的代码,连注释都没改) 代码如下: diff --git "a/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" "b/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" index 7c9f0fcefb..5c6efdcb3f 100644 --- "a/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" +++ "b/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" @@ -184,7 +184,7 @@ public: * 空间复杂度: O(m) -是不是发现代码如此精简,哈哈 +是不是发现代码如此精简 ## 总结 diff --git "a/problems/0657.\346\234\272\345\231\250\344\272\272\350\203\275\345\220\246\350\277\224\345\233\236\345\216\237\347\202\271.md" "b/problems/0657.\346\234\272\345\231\250\344\272\272\350\203\275\345\220\246\350\277\224\345\233\236\345\216\237\347\202\271.md" index f0d3339173..ef58739122 100644 --- "a/problems/0657.\346\234\272\345\231\250\344\272\272\350\203\275\345\220\246\350\277\224\345\233\236\345\216\237\347\202\271.md" +++ "b/problems/0657.\346\234\272\345\231\250\344\272\272\350\203\275\345\220\246\350\277\224\345\233\236\345\216\237\347\202\271.md" @@ -31,7 +31,7 @@ ## 思路 -这道题目还是挺简单的,大家不要想复杂了,一波哈希法又一波图论算法啥的,哈哈。 +这道题目还是挺简单的,大家不要想复杂了,一波哈希法又一波图论算法之类的。 其实就是,x,y坐标,初始为0,然后: * if (moves[i] == 'U') y++; diff --git "a/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" "b/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" index 1042b5a740..265bbb5b0d 100644 --- "a/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" +++ "b/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" @@ -82,7 +82,7 @@ if (root == NULL) { 此时要明确,需要遍历整棵树么? -别忘了这是搜索树,遍历整棵搜索树简直是对搜索树的侮辱,哈哈。 +别忘了这是搜索树,遍历整棵搜索树简直是对搜索树的侮辱。 搜索树是有方向了,可以根据插入元素的数值,决定递归方向。 diff --git a/problems/qita/kstar.md b/problems/qita/kstar.md index 86983cab18..7d1b045c8e 100644 --- a/problems/qita/kstar.md +++ b/problems/qita/kstar.md @@ -14,7 +14,7 @@
-星球里的录友都可以得到我1V1的指导,**我已经详细回答了7000+个问题**: (这个回答问题数量,可以看出我有劳模的潜质 哈哈) +星球里的录友都可以得到我1V1的指导,**我已经详细回答了7000+个问题**: (这个回答问题数量,可以看出我有劳模的潜质 )
@@ -45,7 +45,7 @@
-一些录友当初也是进来 白嫖一波资料,就退款跑了 哈哈哈,不过后面又加回来,例如这位录友: +一些录友当初也是进来 白嫖一波资料,就退款跑了,不过后面又加回来,例如这位录友:
diff --git a/problems/qita/server.md b/problems/qita/server.md index d2e76d36af..7e214d7993 100644 --- a/problems/qita/server.md +++ b/problems/qita/server.md @@ -8,7 +8,7 @@ 这真是一个好问题,而且我一句两句还说不清楚,所以就专门发文来讲一讲。 -同时我还录制的一期视频,哈哈我的视频号,大家可以关注一波。 +同时我还录制的一期视频,我的视频号,大家可以关注一波。 一说到服务器,可能很多人都说搞分布式,做计算,搞爬虫,做程序后台服务,多人合作等等。 @@ -57,7 +57,7 @@ https://github.com/youngyangyang04/fileHttpServer -感兴趣的录友可以去学习一波,顺便给个star 哈哈 +感兴趣的录友可以去学习一波,顺便给个star。 ## 网站 diff --git "a/problems/\345\205\263\344\272\216\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\214\344\275\240\344\270\215\347\237\245\351\201\223\347\232\204\351\203\275\345\234\250\350\277\231\351\207\214\357\274\201.md" "b/problems/\345\205\263\344\272\216\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\214\344\275\240\344\270\215\347\237\245\351\201\223\347\232\204\351\203\275\345\234\250\350\277\231\351\207\214\357\274\201.md" index 95c7567c75..d212e8beae 100644 --- "a/problems/\345\205\263\344\272\216\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\214\344\275\240\344\270\215\347\237\245\351\201\223\347\232\204\351\203\275\345\234\250\350\277\231\351\207\214\357\274\201.md" +++ "b/problems/\345\205\263\344\272\216\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\214\344\275\240\344\270\215\347\237\245\351\201\223\347\232\204\351\203\275\345\234\250\350\277\231\351\207\214\357\274\201.md" @@ -4,10 +4,6 @@

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

-相信每一位录友都接触过时间复杂度,「代码随想录」已经也讲了一百多道经典题目了,是时候对时间复杂度来一个深度的剖析了,很早之前就写过一篇,当时文章还没有人看,Carl感觉有价值的东西值得让更多的人看到,哈哈。 - -所以重新整理的时间复杂度文章,正式和大家见面啦! - # 时间复杂度 ## 究竟什么是时间复杂度 diff --git "a/problems/\345\211\215\345\272\217/vim.md" "b/problems/\345\211\215\345\272\217/vim.md" index 5c5910d206..136a499338 100644 --- "a/problems/\345\211\215\345\272\217/vim.md" +++ "b/problems/\345\211\215\345\272\217/vim.md" @@ -7,7 +7,7 @@ 但这里我并不是说IDE不好用,IDE在 代码跟踪,引用跳转等等其实是很给力的,效率比vim高。 -我用vim的话,如果需要跟踪代码的话,就用ctag去跳转,虽然很不智能(是基于规则匹配,不是语义匹配),但加上我自己的智能就也能用(这里真的要看对代码的把握程度了,哈哈哈) +我用vim的话,如果需要跟踪代码的话,就用ctag去跳转,虽然很不智能(是基于规则匹配,不是语义匹配),但加上我自己的智能就也能用(这里真的要看对代码的把握程度了) 所以连跟踪代码都不用IDE的话,其他方面那我就更用不上IDE了。 @@ -99,5 +99,5 @@ Github地址:[https://github.com/youngyangyang04/PowerVim](https://github.com/ Gitee地址:[https://gitee.com/programmercarl/power-vim](https://gitee.com/programmercarl/power-vim) -最后,因为这个vim配置因为我一直没有宣传,所以star数量很少,哈哈哈,录友们去给个star吧,真正的开发利器,值得顶起来! +最后,因为这个vim配置因为我一直没有宣传,所以star数量很少,录友们去给个star吧,真正的开发利器,值得顶起来! diff --git "a/problems/\345\211\215\345\272\217/\344\273\243\347\240\201\351\243\216\346\240\274.md" "b/problems/\345\211\215\345\272\217/\344\273\243\347\240\201\351\243\216\346\240\274.md" index 8fd8b40ca9..95f4f129da 100644 --- "a/problems/\345\211\215\345\272\217/\344\273\243\347\240\201\351\243\216\346\240\274.md" +++ "b/problems/\345\211\215\345\272\217/\344\273\243\347\240\201\351\243\216\346\240\274.md" @@ -21,7 +21,7 @@ * 第二种情况:这个项目没赚到钱,半死不活的,代码还没有设计也没有规范,这样对技术人员的伤害就非常大了。 -**而不注重代码风格的团队,99.99%都是第二种情况**,如果你赶上了第一种情况,那就恭喜你了,本文下面的内容可以不用看了,哈哈。 +**而不注重代码风格的团队,99.99%都是第二种情况**,如果你赶上了第一种情况,那就恭喜你了,本文下面的内容可以不用看了。 ## 代码规范 diff --git "a/problems/\345\211\215\345\272\217/\345\212\233\346\211\243\344\270\212\347\232\204\344\273\243\347\240\201\346\203\263\345\234\250\346\234\254\345\234\260\347\274\226\350\257\221\350\277\220\350\241\214\357\274\237.md" "b/problems/\345\211\215\345\272\217/\345\212\233\346\211\243\344\270\212\347\232\204\344\273\243\347\240\201\346\203\263\345\234\250\346\234\254\345\234\260\347\274\226\350\257\221\350\277\220\350\241\214\357\274\237.md" index bcef3886e5..5b57d214db 100644 --- "a/problems/\345\211\215\345\272\217/\345\212\233\346\211\243\344\270\212\347\232\204\344\273\243\347\240\201\346\203\263\345\234\250\346\234\254\345\234\260\347\274\226\350\257\221\350\277\220\350\241\214\357\274\237.md" +++ "b/problems/\345\211\215\345\272\217/\345\212\233\346\211\243\344\270\212\347\232\204\344\273\243\347\240\201\346\203\263\345\234\250\346\234\254\345\234\260\347\274\226\350\257\221\350\277\220\350\241\214\357\274\237.md" @@ -53,7 +53,7 @@ int main() { 代码中可以看出,其实就是定义个main函数,构造个输入用例,然后定义一个solution变量,调用minCostClimbingStairs函数就可以了。 -此时大家就可以随意构造测试数据,然后想怎么打日志就怎么打日志,没有找不出的bug,哈哈。 +此时大家就可以随意构造测试数据,然后想怎么打日志就怎么打日志,没有找不出的bug。 diff --git "a/problems/\345\211\215\345\272\217/\345\214\227\344\272\254\344\272\222\350\201\224\347\275\221\345\205\254\345\217\270\346\200\273\347\273\223.md" "b/problems/\345\211\215\345\272\217/\345\214\227\344\272\254\344\272\222\350\201\224\347\275\221\345\205\254\345\217\270\346\200\273\347\273\223.md" index a10cab0654..7b42868e8f 100644 --- "a/problems/\345\211\215\345\272\217/\345\214\227\344\272\254\344\272\222\350\201\224\347\275\221\345\205\254\345\217\270\346\200\273\347\273\223.md" +++ "b/problems/\345\211\215\345\272\217/\345\214\227\344\272\254\344\272\222\350\201\224\347\275\221\345\205\254\345\217\270\346\200\273\347\273\223.md" @@ -94,9 +94,6 @@ * 自如网 * 汽车之家 -## 总结 - -可能是我写总结写习惯了,什么文章都要有一个总结,哈哈,那么我就总结一下。 北京的互联网氛围绝对是最好的(暂不讨论户口和房价问题),大家如果看了[深圳原来有这么多互联网公司,你都知道么?](https://programmercarl.com/前序/深圳互联网公司总结.html)这篇之后,**会发现北京互联网外企和二线互联网公司数量多的优势,在深圳的互联网公司断档比较严重,如果去不了为数不多的一线公司,可选择的余地就非常少了,而北京选择的余地就很多!** diff --git "a/problems/\345\211\215\345\272\217/\347\250\213\345\272\217\345\221\230\347\256\200\345\216\206.md" "b/problems/\345\211\215\345\272\217/\347\250\213\345\272\217\345\221\230\347\256\200\345\216\206.md" index 3e25b895f0..fc06c713a0 100644 --- "a/problems/\345\211\215\345\272\217/\347\250\213\345\272\217\345\221\230\347\256\200\345\216\206.md" +++ "b/problems/\345\211\215\345\272\217/\347\250\213\345\272\217\345\221\230\347\256\200\345\216\206.md" @@ -113,13 +113,6 @@ Carl校招社招都拿过大厂的offer,同时也看过很多应聘者的简 **好的简历是敲门砖,同时也不要在简历上花费过多的精力,好的简历以及面试技巧都是锦上添花**,真的求得心得的offer靠的还是真才实学。 -如何真才实学呢? 跟着「代码随想录」一起刷题呀,哈哈 - -大家此时可以再重审一遍自己的简历,如果发现哪里的不足,面试前要多准备多练习。 - -就酱,「代码随想录」就是这么干货,Carl多年积累的简历技巧都毫不保留的写出来了,如果感觉对你有帮助,就宣传一波「代码随想录」吧,值得大家的关注! - - -----------------------
diff --git "a/problems/\345\211\215\345\272\217/\351\200\232\350\277\207\344\270\200\351\201\223\351\235\242\350\257\225\351\242\230\347\233\256\357\274\214\350\256\262\344\270\200\350\256\262\351\200\222\345\275\222\347\256\227\346\263\225\347\232\204\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\201.md" "b/problems/\345\211\215\345\272\217/\351\200\232\350\277\207\344\270\200\351\201\223\351\235\242\350\257\225\351\242\230\347\233\256\357\274\214\350\256\262\344\270\200\350\256\262\351\200\222\345\275\222\347\256\227\346\263\225\347\232\204\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\201.md" index d8f07f1c59..1ea1e65be8 100644 --- "a/problems/\345\211\215\345\272\217/\351\200\232\350\277\207\344\270\200\351\201\223\351\235\242\350\257\225\351\242\230\347\233\256\357\274\214\350\256\262\344\270\200\350\256\262\351\200\222\345\275\222\347\256\227\346\263\225\347\232\204\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\201.md" +++ "b/problems/\345\211\215\345\272\217/\351\200\232\350\277\207\344\270\200\351\201\223\351\235\242\350\257\225\351\242\230\347\233\256\357\274\214\350\256\262\344\270\200\350\256\262\351\200\222\345\275\222\347\256\227\346\263\225\347\232\204\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\201.md" @@ -131,7 +131,7 @@ int function3(int x, int n) { return function3(x, n / 2) * function3(x, n / 2); } ``` -可以看出这道题目非常简单,但是又很考究算法的功底,特别是对递归的理解,这也是我面试别人的时候用过的一道题,所以整个情景我才写的如此逼真,哈哈。 +可以看出这道题目非常简单,但是又很考究算法的功底,特别是对递归的理解,这也是我面试别人的时候用过的一道题,所以整个情景我才写的如此逼真。 大厂面试的时候最喜欢用“简单题”来考察候选人的算法功底,注意这里的“简单题”可并不一定真的简单哦! diff --git "a/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" "b/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" index a3fb7ab330..82a968d431 100644 --- "a/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" @@ -69,7 +69,7 @@ public: * 时间复杂度: O(n) * 空间复杂度:O(1) -是不是发现这代码也太简单了,哈哈。 +是不是发现这代码也太简单了。 ## 总结 diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20200927\344\272\214\345\217\211\346\240\221\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20200927\344\272\214\345\217\211\346\240\221\345\221\250\346\234\253\346\200\273\347\273\223.md" index ff8f67d47d..594656ca23 100644 --- "a/problems/\345\221\250\346\200\273\347\273\223/20200927\344\272\214\345\217\211\346\240\221\345\221\250\346\234\253\346\200\273\347\273\223.md" +++ "b/problems/\345\221\250\346\200\273\347\273\223/20200927\344\272\214\345\217\211\346\240\221\345\221\250\346\234\253\346\200\273\347\273\223.md" @@ -135,7 +135,7 @@ public: 看完这篇文章,去leetcode上怒刷五题,文章中 编号107题目的样例图放错了(原谅我匆忙之间总是手抖),但不影响大家理解。 -只有同学发现leetcode上“515. 在每个树行中找最大值”,也是层序遍历的应用,依然可以分分钟解决,所以就是一鼓作气解决六道了,哈哈。 +只有同学发现leetcode上“515. 在每个树行中找最大值”,也是层序遍历的应用,依然可以分分钟解决,所以就是一鼓作气解决六道了。 **层序遍历遍历相对容易一些,只要掌握基本写法(也就是框架模板),剩下的就是在二叉树每一行遍历的时候做做逻辑修改。** diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20201017\344\272\214\345\217\211\346\240\221\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20201017\344\272\214\345\217\211\346\240\221\345\221\250\346\234\253\346\200\273\347\273\223.md" index f183924eee..bbb14502c0 100644 --- "a/problems/\345\221\250\346\200\273\347\273\223/20201017\344\272\214\345\217\211\346\240\221\345\221\250\346\234\253\346\200\273\347\273\223.md" +++ "b/problems/\345\221\250\346\200\273\347\273\223/20201017\344\272\214\345\217\211\346\240\221\345\221\250\346\234\253\346\200\273\347\273\223.md" @@ -70,7 +70,7 @@ **但可以遍历一遍就可以求众数集合,使用了适时清空结果集的方法**,这个方法还是很巧妙的。相信仔细读了文章的同学会惊呼其巧妙! -**所以大家不要看题目简单了,就不动手做了,我选的题目,一般不会简单到不用动手的程度,哈哈**。 +**所以大家不要看题目简单了,就不动手做了,我选的题目,一般不会简单到不用动手的程度**。 ## 周六 diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20201030\345\233\236\346\272\257\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20201030\345\233\236\346\272\257\345\221\250\346\234\253\346\200\273\347\273\223.md" index 7f6fd114b4..77db9708c0 100644 --- "a/problems/\345\221\250\346\200\273\347\273\223/20201030\345\233\236\346\272\257\345\221\250\346\234\253\346\200\273\347\273\223.md" +++ "b/problems/\345\221\250\346\200\273\347\273\223/20201030\345\233\236\346\272\257\345\221\250\346\234\253\346\200\273\347\273\223.md" @@ -98,7 +98,7 @@ 对于回溯法的整体框架,网上搜的文章这块一般都说不清楚,按照天上掉下来的代码对着讲解,不知道究竟是怎么来的,也不知道为什么要这么写。 -所以,录友们刚开始学回溯法,起跑姿势就很标准了,哈哈。 +所以,录友们刚开始学回溯法,起跑姿势就很标准了。 下周依然是回溯法,难度又要上升一个台阶了。 diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20201107\345\233\236\346\272\257\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20201107\345\233\236\346\272\257\345\221\250\346\234\253\346\200\273\347\273\223.md" index 3f1d10126e..9a447648d8 100644 --- "a/problems/\345\221\250\346\200\273\347\273\223/20201107\345\233\236\346\272\257\345\221\250\346\234\253\346\200\273\347\273\223.md" +++ "b/problems/\345\221\250\346\200\273\347\273\223/20201107\345\233\236\346\272\257\345\221\250\346\234\253\346\200\273\347\273\223.md" @@ -148,7 +148,7 @@ if (startIndex >= nums.size()) { // 终止条件可以不加 **我讲解每一种问题,都会和其他问题作对比,做分析,所以只要跟着细心琢磨相信对回溯又有新的认识**。 -最近这两天题目有点难度,刚刚开始学回溯算法的话,按照现在这个每天一题的速度来,确实有点快,学起来吃力非常正常,这些题目都是我当初学了好几个月才整明白的,哈哈。 +最近这两天题目有点难度,刚刚开始学回溯算法的话,按照现在这个每天一题的速度来,确实有点快,学起来吃力非常正常,这些题目都是我当初学了好几个月才整明白的。 **所以大家能跟上的话,已经很优秀了!** diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20201203\350\264\252\345\277\203\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20201203\350\264\252\345\277\203\345\221\250\346\234\253\346\200\273\347\273\223.md" index 2918246a77..9209efda71 100644 --- "a/problems/\345\221\250\346\200\273\347\273\223/20201203\350\264\252\345\277\203\345\221\250\346\234\253\346\200\273\347\273\223.md" +++ "b/problems/\345\221\250\346\200\273\347\273\223/20201203\350\264\252\345\277\203\345\221\250\346\234\253\346\200\273\347\273\223.md" @@ -66,7 +66,7 @@ ## 周四 -这道题目:[贪心算法:K次取反后最大化的数组和](https://programmercarl.com/1005.K次取反后最大化的数组和.html)就比较简单了,哈哈,用简单题来讲一讲贪心的思想。 +这道题目:[贪心算法:K次取反后最大化的数组和](https://programmercarl.com/1005.K次取反后最大化的数组和.html)就比较简单了,用简单题来讲一讲贪心的思想。 **这里其实用了两次贪心!** @@ -76,8 +76,6 @@ 第二次贪心:局部最优:只找数值最小的正整数进行反转,当前数值可以达到最大(例如正整数数组{5, 3, 1},反转1 得到-1 比 反转5得到的-5 大多了),全局最优:整个 数组和 达到最大。 -[贪心算法:K次取反后最大化的数组和](https://programmercarl.com/1005.K次取反后最大化的数组和.html)中的代码,最后while处理K的时候,其实直接判断奇偶数就可以了,文中给出的方式太粗暴了,哈哈,Carl大意了。 - 例外一位录友留言给出一个很好的建议,因为文中是使用快排,仔细看题,**题目中限定了数据范围是正负一百,所以可以使用桶排序**,这样时间复杂度就可以优化为$O(n)$了。但可能代码要复杂一些了。 @@ -85,7 +83,7 @@ 大家会发现本周的代码其实都简单,但思路却很巧妙,并不容易写出来。 -如果是第一次接触的话,其实很难想出来,就是接触过之后就会了,所以大家不用感觉自己想不出来而烦躁,哈哈。 +如果是第一次接触的话,其实很难想出来,就是接触过之后就会了,所以大家不用感觉自己想不出来而烦躁。 相信此时大家现在对贪心算法又有一个新的认识了,加油💪 diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20201210\345\244\215\346\235\202\345\272\246\345\210\206\346\236\220\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20201210\345\244\215\346\235\202\345\272\246\345\210\206\346\236\220\345\221\250\346\234\253\346\200\273\347\273\223.md" index 203e448655..cd3b2f1346 100644 --- "a/problems/\345\221\250\346\200\273\347\273\223/20201210\345\244\215\346\235\202\345\272\246\345\210\206\346\236\220\345\221\250\346\234\253\346\200\273\347\273\223.md" +++ "b/problems/\345\221\250\346\200\273\347\273\223/20201210\345\244\215\346\235\202\345\272\246\345\210\206\346\236\220\345\221\250\346\234\253\346\200\273\347\273\223.md" @@ -107,7 +107,7 @@ 本周讲解的内容都是经常被大家忽略的知识点,而通常这种知识点,才最能发现一位候选人的编程功底。 -因为之前一直都是在持续更新算法题目的文章,这周说一说算法性能分析,感觉也是换了换口味,哈哈。 +因为之前一直都是在持续更新算法题目的文章,这周说一说算法性能分析,感觉也是换了换口味。 同时大家也会发现,**大厂面试官最喜欢用“简单题”(就是看起来很简单,其实非常考验技术功底的题目),而不是要手撕红黑树之类的**。 diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20201217\350\264\252\345\277\203\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20201217\350\264\252\345\277\203\345\221\250\346\234\253\346\200\273\347\273\223.md" index fe4cc4a2ab..91f9656f48 100644 --- "a/problems/\345\221\250\346\200\273\347\273\223/20201217\350\264\252\345\277\203\345\221\250\346\234\253\346\200\273\347\273\223.md" +++ "b/problems/\345\221\250\346\200\273\347\273\223/20201217\350\264\252\345\277\203\345\221\250\346\234\253\346\200\273\347\273\223.md" @@ -95,7 +95,7 @@ 虽然有时候感觉贪心就是常识,但如果真正是常识性的题目,其实是模拟题,就不是贪心算法了!例如[贪心算法:加油站](https://programmercarl.com/0134.加油站.html)中的贪心方法一,其实我就认为不是贪心算法,而是直接从全局最优的角度上来模拟,因为方法里没有体现局部最优的过程。 -而且大家也会发现,贪心并没有想象中的那么简单,贪心往往妙的出其不意,触不及防!哈哈 +而且大家也会发现,贪心并没有想象中的那么简单,贪心往往妙的出其不意,触不及防!
diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20201224\350\264\252\345\277\203\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20201224\350\264\252\345\277\203\345\221\250\346\234\253\346\200\273\347\273\223.md" index 7436295af3..b37bba80dc 100644 --- "a/problems/\345\221\250\346\200\273\347\273\223/20201224\350\264\252\345\277\203\345\221\250\346\234\253\346\200\273\347\273\223.md" +++ "b/problems/\345\221\250\346\200\273\347\273\223/20201224\350\264\252\345\277\203\345\221\250\346\234\253\346\200\273\347\273\223.md" @@ -93,7 +93,7 @@ public: 本周的主题就是用贪心算法来解决区间问题,经过本周的学习,大家应该对区间的各种合并分割有一定程度的了解了。 -其实很多区间的合并操作看起来都是常识,其实贪心算法有时候就是常识,哈哈,但也别小看了贪心算法。 +其实很多区间的合并操作看起来都是常识,其实贪心算法有时候就是常识,但也别小看了贪心算法。 在[贪心算法:合并区间](https://programmercarl.com/0056.合并区间.html)中就说过,对于贪心算法,很多同学都是:「如果能凭常识直接做出来,就会感觉不到自己用了贪心, 一旦第一直觉想不出来, 可能就一直想不出来了」。 diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20210107\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20210107\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" index 831ce348a1..4cab00ccbd 100644 --- "a/problems/\345\221\250\346\200\273\347\273\223/20210107\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" +++ "b/problems/\345\221\250\346\200\273\347\273\223/20210107\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" @@ -18,7 +18,7 @@ 后序我们在讲解动规的题目时候,都离不开这五步! -本周都是简单题目,大家可能会感觉 按照这五部来好麻烦,凭感觉随手一写,直接就过,越到后面越会感觉,凭感觉这个事还是不靠谱的,哈哈。 +本周都是简单题目,大家可能会感觉 按照这五部来好麻烦,凭感觉随手一写,直接就过,越到后面越会感觉,凭感觉这个事还是不靠谱的。 最后我们讲了动态规划题目应该如何debug,相信一些录友做动规的题目,一旦报错也是凭感觉来改。 @@ -30,7 +30,7 @@ 2. 我打印dp数组的日志了么? 3. 打印出来了dp数组和我想的一样么? -哈哈,专治各种代码写出来了但AC不了的疑难杂症。 +专治各种代码写出来了但AC不了的疑难杂症。 ## 周二 @@ -60,7 +60,7 @@ for (int i = 3; i <= n; i++) { // 注意i是从3开始的 } ``` -这个可以是面试的一个小问题,哈哈,考察候选人对dp[i]定义的理解程度。 +这个可以是面试的一个小问题,考察候选人对dp[i]定义的理解程度。 这道题目还可以继续深化,就是一步一个台阶,两个台阶,三个台阶,直到 m个台阶,有多少种方法爬到n阶楼顶。 @@ -86,7 +86,7 @@ public: 代码中m表示最多可以爬m个台阶。 -**以上代码不能运行哈,我主要是为了体现只要把m换成2,粘过去,就可以AC爬楼梯这道题,不信你就粘一下试试,哈哈**。 +**以上代码不能运行哈,我主要是为了体现只要把m换成2,粘过去,就可以AC爬楼梯这道题,不信你就粘一下试试**。 **此时我就发现一个绝佳的大厂面试题**,第一道题就是单纯的爬楼梯,然后看候选人的代码实现,如果把dp[0]的定义成1了,就可以发难了,为什么dp[0]一定要初始化为1,此时可能候选人就要强行给dp[0]应该是1找各种理由。那这就是一个考察点了,对dp[i]的定义理解的不深入。 @@ -97,7 +97,7 @@ public: **其实大厂面试最喜欢问题的就是这种简单题,然后慢慢变化,在小细节上考察候选人**。 -这道绝佳的面试题我没有用过,如果录友们有面试别人的需求,就把这个套路拿去吧,哈哈哈。 +这道绝佳的面试题我没有用过,如果录友们有面试别人的需求,就把这个套路拿去吧。 我在[通过一道面试题目,讲一讲递归算法的时间复杂度!](https://programmercarl.com/前序/通过一道面试题目,讲一讲递归算法的时间复杂度!.html)中,以我自己面试别人的真实经历,通过求x的n次方 这么简单的题目,就可以考察候选人对算法性能以及递归的理解深度,录友们可以看看,绝对有收获! @@ -138,7 +138,7 @@ public: }; ``` -这么写看上去比较顺,但是就是感觉和题目描述的不太符。哈哈,也没有必要这么细扣题意了,大家只要知道,题目的意思反正就是要不是第一步不花费,要不是最后一步不花费,都可以。 +这么写看上去比较顺,但是就是感觉和题目描述的不太符。也没有必要这么细扣题意了,大家只要知道,题目的意思反正就是要不是第一步不花费,要不是最后一步不花费,都可以。 ## 总结 diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20210114\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20210114\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" index 71cb49a9db..ebc720caa0 100644 --- "a/problems/\345\221\250\346\200\273\347\273\223/20210114\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" +++ "b/problems/\345\221\250\346\200\273\347\273\223/20210114\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" @@ -151,12 +151,6 @@ n为5时候的dp数组状态如图: 我现在也陷入了纠结,题目一简单,就会有录友和我反馈说题目太简单了,题目一难,阅读量就特别低。 -我也好难那,哈哈哈。 - **但我还会坚持规划好的路线,难度循序渐进,并以面试经典题目为准,该简单的时候就是简单,同时也不会因为阅读量低就放弃有难度的题目!**。 -录友们看到这是不是得给个Carl点个赞啊[让我看看]。 - -预告,我们下周正式开始讲解背包问题,经典的不能再经典,也是比较难的一类动态规划的题目了,录友们上车抓稳咯。 -
diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20210225\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20210225\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" index e74dd6bea8..26d805bb3a 100644 --- "a/problems/\345\221\250\346\200\273\347\273\223/20210225\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" +++ "b/problems/\345\221\250\346\200\273\347\273\223/20210225\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" @@ -187,7 +187,7 @@ return {val2, val1}; 因为平时我们习惯了在一维数组或者二维数组上推导公式,一下子换成了树,就需要对树的遍历方式足够了解! -大家还记不记得我在讲解贪心专题的时候,讲到这道题目:[贪心算法:我要监控二叉树!](https://programmercarl.com/0968.监控二叉树.html),这也是贪心算法在树上的应用。**那我也可以把这个算法起一个名字,叫做树形贪心**,哈哈哈 +大家还记不记得我在讲解贪心专题的时候,讲到这道题目:[贪心算法:我要监控二叉树!](https://programmercarl.com/0968.监控二叉树.html),这也是贪心算法在树上的应用。**那我也可以把这个算法起一个名字,叫做树形贪心** “树形贪心”词汇从此诞生,来自「代码随想录」 @@ -301,7 +301,7 @@ public: 那么这里每一种情况 我在文章中都做了详细的介绍。 -周四我们开始讲解股票系列了,大家应该预测到了,我们下周的主题就是股票! 哈哈哈,多么浮躁的一个系列!敬请期待吧! +周四我们开始讲解股票系列了,大家应该预测到了,我们下周的主题就是股票!敬请期待吧! **代码随想录温馨提醒:投资有风险,入市需谨慎!** diff --git "a/problems/\345\221\250\346\200\273\347\273\223/\344\272\214\345\217\211\346\240\221\351\230\266\346\256\265\346\200\273\347\273\223\347\263\273\345\210\227\344\270\200.md" "b/problems/\345\221\250\346\200\273\347\273\223/\344\272\214\345\217\211\346\240\221\351\230\266\346\256\265\346\200\273\347\273\223\347\263\273\345\210\227\344\270\200.md" index f65f549705..52e2fec11f 100644 --- "a/problems/\345\221\250\346\200\273\347\273\223/\344\272\214\345\217\211\346\240\221\351\230\266\346\256\265\346\200\273\347\273\223\347\263\273\345\210\227\344\270\200.md" +++ "b/problems/\345\221\250\346\200\273\347\273\223/\344\272\214\345\217\211\346\240\221\351\230\266\346\256\265\346\200\273\347\273\223\347\263\273\345\210\227\344\270\200.md" @@ -139,7 +139,7 @@ public: 看完这篇文章,去leetcode上怒刷五题,文章中 编号107题目的样例图放错了(原谅我匆忙之间总是手抖),但不影响大家理解。 -只有同学发现leetcode上“515. 在每个树行中找最大值”,也是层序遍历的应用,依然可以分分钟解决,所以就是一鼓作气解决六道了,哈哈。 +只有同学发现leetcode上“515. 在每个树行中找最大值”,也是层序遍历的应用,依然可以分分钟解决,所以就是一鼓作气解决六道了。 **层序遍历遍历相对容易一些,只要掌握基本写法(也就是框架模板),剩下的就是在二叉树每一行遍历的时候做做逻辑修改。** diff --git "a/problems/\345\233\236\346\272\257\346\200\273\347\273\223.md" "b/problems/\345\233\236\346\272\257\346\200\273\347\273\223.md" index f2e46829cb..35b4c3f907 100644 --- "a/problems/\345\233\236\346\272\257\346\200\273\347\273\223.md" +++ "b/problems/\345\233\236\346\272\257\346\200\273\347\273\223.md" @@ -347,7 +347,7 @@ used数组可是全局变量,每层与每层之间公用一个used数组,所 **这里我明确给出了棋盘的宽度就是for循环的长度,递归的深度就是棋盘的高度,这样就可以套进回溯法的模板里了**。 -相信看完本篇[回溯算法:N皇后问题](https://programmercarl.com/0051.N皇后.html)也没那么难了,传说已经不是传说了,哈哈。 +相信看完本篇[回溯算法:N皇后问题](https://programmercarl.com/0051.N皇后.html)也没那么难了,传说已经不是传说了。 diff --git "a/problems/\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227\357\274\210vector\345\216\237\347\220\206\350\256\262\350\247\243\357\274\211.md" "b/problems/\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227\357\274\210vector\345\216\237\347\220\206\350\256\262\350\247\243\357\274\211.md" index 4291c80c72..5f9b46b373 100644 --- "a/problems/\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227\357\274\210vector\345\216\237\347\220\206\350\256\262\350\247\243\357\274\211.md" +++ "b/problems/\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227\357\274\210vector\345\216\237\347\220\206\350\256\262\350\247\243\357\274\211.md" @@ -154,13 +154,13 @@ public: 所以对于两种使用数组的方法一和方法三,也不好确定谁优,但一定都没有使用方法二链表的效率高! -一波分析之后,对于[贪心算法:根据身高重建队列](https://programmercarl.com/0406.根据身高重建队列.html) ,大家就安心使用链表吧!别折腾了,哈哈,相当于我替大家折腾了一下。 +一波分析之后,对于[贪心算法:根据身高重建队列](https://programmercarl.com/0406.根据身高重建队列.html) ,大家就安心使用链表吧!别折腾了,相当于我替大家折腾了一下。 ## 总结 大家应该发现了,编程语言中一个普通容器的insert,delete的使用,都可能对写出来的算法的有很大影响! -如果抛开语言谈算法,除非从来不用代码写算法纯分析,**否则的话,语言功底不到位O(n)的算法可以写出O(n^2)的性能**,哈哈。 +如果抛开语言谈算法,除非从来不用代码写算法纯分析,**否则的话,语言功底不到位O(n)的算法可以写出O(n^2)的性能**。 相信在这里学习算法的录友们,都是想在软件行业长远发展的,都是要从事编程的工作,那么一定要深耕好一门编程语言,这个非常重要! diff --git "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" index ac4c4a1cbe..a006cb0e20 100644 --- "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" +++ "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" @@ -173,7 +173,7 @@ int main() { 这个区别,我将在后面讲解具体leetcode题目中给大家介绍,因为这块如果不结合具题目,单纯的介绍原理估计很多同学会越看越懵! -别急,下一篇就是了!哈哈 +别急,下一篇就是了! 最后,**又可以出一道面试题了,就是纯完全背包,要求先用二维dp数组实现,然后再用一维dp数组实现,最后再问,两个for循环的先后是否可以颠倒?为什么?** 这个简单的完全背包问题,估计就可以难住不少候选人了。 diff --git "a/problems/\350\264\252\345\277\203\347\256\227\346\263\225\346\200\273\347\273\223\347\257\207.md" "b/problems/\350\264\252\345\277\203\347\256\227\346\263\225\346\200\273\347\273\223\347\257\207.md" index c375503d71..d49cdc5fb1 100644 --- "a/problems/\350\264\252\345\277\203\347\256\227\346\263\225\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/\350\264\252\345\277\203\347\256\227\346\263\225\346\200\273\347\273\223\347\257\207.md" @@ -17,7 +17,7 @@ 在刚刚讲过的回溯系列中,大家可以发现我是严格按照框架难度顺序循序渐进讲解的,**和贪心又不一样,因为回溯法如果题目顺序没选好,刷题效果会非常差!** -同样回溯系列也不允许简单困难交替着来,因为前后题目都是有因果关系的,**相信跟着刷过回溯系列的录友们都会明白我的良苦用心,哈哈**。 +同样回溯系列也不允许简单困难交替着来,因为前后题目都是有因果关系的,**相信跟着刷过回溯系列的录友们都会明白我的良苦用心**。 **每个系列都有每个系列的特点,我都会根据特点有所调整,大家看我每天的推送的题目,都不是随便找一个到就推送的,都是先有整体规划,然后反复斟酌具体题目的结果**。 @@ -116,7 +116,7 @@ Carl个人认为:如果找出局部最优并可以推出全局最优,就是 周总结里会对每周的题目中大家的疑问、相关难点或者笔误之类的进行复盘和总结。 -如果大家发现文章哪里有问题,那么在周总结里或者文章评论区一定进行了修正,保证不会因为我的笔误或者理解问题而误导大家,哈哈。 +如果大家发现文章哪里有问题,那么在周总结里或者文章评论区一定进行了修正,保证不会因为我的笔误或者理解问题而误导大家。 所以周总结一定要看! From 10b693a84d2aba4df15a78d716265de372113633 Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Tue, 5 Sep 2023 19:29:34 +0800 Subject: [PATCH 2242/3019] =?UTF-8?q?=E4=BF=AE=E6=94=B9=20=E7=BC=96?= =?UTF-8?q?=E8=BE=91=E8=B7=9D=E7=A6=BB=E5=85=AC=E5=BC=80=E8=AF=BE=E9=93=BE?= =?UTF-8?q?=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0072.\347\274\226\350\276\221\350\267\235\347\246\273.md" | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git "a/problems/0072.\347\274\226\350\276\221\350\267\235\347\246\273.md" "b/problems/0072.\347\274\226\350\276\221\350\267\235\347\246\273.md" index 2b5a1925dc..76553151e4 100644 --- "a/problems/0072.\347\274\226\350\276\221\350\267\235\347\246\273.md" +++ "b/problems/0072.\347\274\226\350\276\221\350\267\235\347\246\273.md" @@ -41,7 +41,7 @@ exection -> execution (插入 'u') * word1 和 word2 由小写英文字母组成 ## 算法公开课 -**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[动态规划终极绝杀! LeetCode:72.编辑距离](https://www.bilibili.com/video/BV1we4y157wB/),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[动态规划终极绝杀! LeetCode:72.编辑距离](https://www.bilibili.com/video/BV1qv4y1q78f/),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 ## 思路 @@ -465,4 +465,3 @@ impl Solution { - From 486792cba5260965a82285414425d3a1dab30eb7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8A=B1=E6=97=A0=E7=BC=BA?= Date: Wed, 6 Sep 2023 20:46:04 +0800 Subject: [PATCH 2243/3019] Update acm.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 更改错别字 --- problems/qita/acm.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/problems/qita/acm.md b/problems/qita/acm.md index 1be0e924de..999283564a 100644 --- a/problems/qita/acm.md +++ b/problems/qita/acm.md @@ -1,5 +1,5 @@ -# 如何练习ACM模式输入输入模式 | 如何准备笔试 | 卡码网 +# 如何练习ACM模式输入输出模式 | 如何准备笔试 | 卡码网 卡码网地址:[https://kamacoder.com](https://kamacoder.com) From 839afd119b4a22700a374f555a0ee8d1eebd9495 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E9=98=94?= Date: Sat, 9 Sep 2023 10:23:43 +0800 Subject: [PATCH 2244/3019] test --- ...\204\346\234\200\345\260\217\346\267\261\345\272\246.md" | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git "a/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" "b/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" index 61f9beb785..8b9d92e612 100644 --- "a/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" +++ "b/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" @@ -173,12 +173,12 @@ private: int result; void getdepth(TreeNode* node, int depth) { // 函数递归终止条件 - if (root == nullptr) { + if (node == nullptr) { return; } // 中,处理逻辑:判断是不是叶子结点 - if (root -> left == nullptr && root->right == nullptr) { - res = min(res, depth); + if (node -> left == nullptr && node->right == nullptr) { + result = min(result, depth); } if (node->left) { // 左 getdepth(node->left, depth + 1); From 655a513b3145aef9d96db0cdc3983b47572d19cf Mon Sep 17 00:00:00 2001 From: zl127LiamLi <143149260+zl127LiamLi@users.noreply.github.com> Date: Sat, 9 Sep 2023 20:42:36 -0500 Subject: [PATCH 2245/3019] 841 python3 add BFS solution.md --- ...31\345\222\214\346\210\277\351\227\264.md" | 27 ++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git "a/problems/0841.\351\222\245\345\214\231\345\222\214\346\210\277\351\227\264.md" "b/problems/0841.\351\222\245\345\214\231\345\222\214\346\210\277\351\227\264.md" index 00156d4ec3..b4785d1b02 100644 --- "a/problems/0841.\351\222\245\345\214\231\345\222\214\346\210\277\351\227\264.md" +++ "b/problems/0841.\351\222\245\345\214\231\345\222\214\346\210\277\351\227\264.md" @@ -324,7 +324,7 @@ class Solution { ### python3 ```python - +# 深度搜索优先 class Solution: def dfs(self, key: int, rooms: List[List[int]] , visited : List[bool] ) : if visited[key] : @@ -346,6 +346,31 @@ class Solution: return False return True +# 广度搜索优先 +class Solution: + def canVisitAllRooms(self, rooms: List[List[int]]) -> bool: + visited = [False] * len(rooms) + self.bfs(rooms, 0, visited) + + for room in visited: + if room == False: + return False + + return True + + def bfs(self, rooms, index, visited): + q = collections.deque() + q.append(index) + + visited[0] = True + + while len(q) != 0: + index = q.popleft() + for nextIndex in rooms[index]: + if visited[nextIndex] == False: + q.append(nextIndex) + visited[nextIndex] = True + ``` From 4b704d3efd411677309ca6769eb8281560111aa4 Mon Sep 17 00:00:00 2001 From: wisuky <48423733+wisuky@users.noreply.github.com> Date: Tue, 12 Sep 2023 20:06:47 +0800 Subject: [PATCH 2246/3019] =?UTF-8?q?Update=200028.=E5=AE=9E=E7=8E=B0strSt?= =?UTF-8?q?r.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Update 0028.实现strStr.md --- "problems/0028.\345\256\236\347\216\260strStr.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0028.\345\256\236\347\216\260strStr.md" "b/problems/0028.\345\256\236\347\216\260strStr.md" index 53b57fd534..04fef7fd00 100644 --- "a/problems/0028.\345\256\236\347\216\260strStr.md" +++ "b/problems/0028.\345\256\236\347\216\260strStr.md" @@ -207,7 +207,7 @@ next数组就是一个前缀表(prefix table)。 ### 前缀表与next数组 -很多KMP算法的时间都是使用next数组来做回退操作,那么next数组与前缀表有什么关系呢? +很多KMP算法的实现都是使用next数组来做回退操作,那么next数组与前缀表有什么关系呢? next数组就可以是前缀表,但是很多实现都是把前缀表统一减一(右移一位,初始位置为-1)之后作为next数组。 From a0462c4c2539c0b9f65acfc39b32e0bcd9d5a303 Mon Sep 17 00:00:00 2001 From: CH Ye Date: Fri, 15 Sep 2023 16:06:48 -0400 Subject: [PATCH 2247/3019] =?UTF-8?q?#=20=E6=B7=BB=E5=8A=A0=E4=BA=86=20197?= =?UTF-8?q?1.=20=E5=AF=BB=E6=89=BE=E5=9B=BE=E4=B8=AD=E6=98=AF=E5=90=A6?= =?UTF-8?q?=E5=AD=98=E5=9C=A8=E8=B7=AF=E5=BE=84=20=E7=9A=84Python=E5=B9=B6?= =?UTF-8?q?=E6=9F=A5=E9=9B=86=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...5\230\345\234\250\350\267\257\345\276\204.md" | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git "a/problems/1971.\345\257\273\346\211\276\345\233\276\344\270\255\346\230\257\345\220\246\345\255\230\345\234\250\350\267\257\345\276\204.md" "b/problems/1971.\345\257\273\346\211\276\345\233\276\344\270\255\346\230\257\345\220\246\345\255\230\345\234\250\350\267\257\345\276\204.md" index 29e50ab8b0..5660233cf6 100644 --- "a/problems/1971.\345\257\273\346\211\276\345\233\276\344\270\255\346\230\257\345\220\246\345\255\230\345\234\250\350\267\257\345\276\204.md" +++ "b/problems/1971.\345\257\273\346\211\276\345\233\276\344\270\255\346\230\257\345\220\246\345\255\230\345\234\250\350\267\257\345\276\204.md" @@ -134,6 +134,22 @@ public: } }; ``` + +PYTHON并查集解法如下: +```PYTHON +class Solution: + def validPath(self, n: int, edges: List[List[int]], source: int, destination: int) -> bool: + p = [i for i in range(n)] + def find(i): + if p[i] != i: + p[i] = find(p[i]) + return p[i] + for u, v in edges: + p[find(u)] = find(v) + return find(source) == find(destination) +``` + +

From 23ca9e43e5a15bdbbf69744515b94736ac1d3b0d Mon Sep 17 00:00:00 2001 From: CH Ye Date: Fri, 15 Sep 2023 16:09:38 -0400 Subject: [PATCH 2248/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=BA=86684.?= =?UTF-8?q?=E5=86=97=E4=BD=99=E8=BF=9E=E6=8E=A5=20=E7=9A=84Python=E5=B9=B6?= =?UTF-8?q?=E6=9F=A5=E9=9B=86=E7=AE=80=E6=B4=81=E5=86=99=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\227\344\275\231\350\277\236\346\216\245.md" | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git "a/problems/0684.\345\206\227\344\275\231\350\277\236\346\216\245.md" "b/problems/0684.\345\206\227\344\275\231\350\277\236\346\216\245.md" index 8124cc7eea..f5e84223b1 100644 --- "a/problems/0684.\345\206\227\344\275\231\350\277\236\346\216\245.md" +++ "b/problems/0684.\345\206\227\344\275\231\350\277\236\346\216\245.md" @@ -256,6 +256,23 @@ class Solution: return [] ``` +### Python简洁写法: + +```python +class Solution: + def findRedundantConnection(self, edges: List[List[int]]) -> List[int]: + n = len(edges) + p = [i for i in range(n+1)] + def find(i): + if p[i] != i: + p[i] = find(p[i]) + return p[i] + for u, v in edges: + if p[find(u)] == find(v): + return [u, v] + p[find(u)] = find(v) +``` + ### Go ```go From f1a65d7e2df65506a8165cd95ac3aed680cf5a11 Mon Sep 17 00:00:00 2001 From: ShuangmingMa <52561813+ShuangmingMa@users.noreply.github.com> Date: Sat, 16 Sep 2023 18:40:07 +0800 Subject: [PATCH 2249/3019] =?UTF-8?q?=E4=BF=AE=E6=94=B9=200503.=E4=B8=8B?= =?UTF-8?q?=E4=B8=80=E4=B8=AA=E6=9B=B4=E5=A4=A7=E5=85=83=E7=B4=A0II=20go?= =?UTF-8?q?=E7=89=88=E6=9C=AC=E4=B8=AD=E7=9A=84=E4=BB=A3=E7=A0=81=E9=94=99?= =?UTF-8?q?=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...70\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" "b/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" index c001df5076..b788968cee 100644 --- "a/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" +++ "b/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" @@ -207,7 +207,7 @@ class Solution: ```go func nextGreaterElements(nums []int) []int { length := len(nums) - result := make([]int,length,length) + result := make([]int,length) for i:=0;i Date: Sat, 16 Sep 2023 20:35:17 +0800 Subject: [PATCH 2250/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200042.=E6=8E=A5?= =?UTF-8?q?=E9=9B=A8=E6=B0=B4=20Go=E7=89=88=E6=9C=AC=E7=9A=84=E5=8D=95?= =?UTF-8?q?=E8=B0=83=E6=A0=88=E5=8E=8B=E7=BC=A9=E7=89=88=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...2.\346\216\245\351\233\250\346\260\264.md" | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git "a/problems/0042.\346\216\245\351\233\250\346\260\264.md" "b/problems/0042.\346\216\245\351\233\250\346\260\264.md" index 760ebc34a4..517ccb0b39 100644 --- "a/problems/0042.\346\216\245\351\233\250\346\260\264.md" +++ "b/problems/0042.\346\216\245\351\233\250\346\260\264.md" @@ -704,6 +704,45 @@ func min(x, y int) int { } ``` +单调栈压缩版: + +```go +func trap(height []int) int { + stack := make([]int, 0) + res := 0 + + // 无需事先将第一个柱子的坐标入栈,因为它会在该for循环的最后入栈 + for i := 0; i < len(height); i ++ { + // 满足栈不为空并且当前柱子高度大于栈顶对应的柱子高度的情况时 + for len(stack) > 0 && height[stack[len(stack) - 1]] < height[i] { + // 获得凹槽高度 + mid := height[stack[len(stack) - 1]] + // 凹槽坐标出栈 + stack = stack[: len(stack) - 1] + + // 如果栈不为空则此时栈顶元素为左侧柱子坐标 + if len(stack) > 0 { + // 求得雨水高度 + h := min(height[i], height[stack[len(stack) - 1]]) - mid + // 求得雨水宽度 + w := i - stack[len(stack) - 1] - 1 + res += h * w + } + } + // 如果栈为空或者当前柱子高度小于等于栈顶对应的柱子高度时入栈 + stack = append(stack, i) + } + return res +} + +func min(x, y int) int { + if x < y { + return x + } + return y +} +``` + ### JavaScript: ```javascript From c26fddc702a333a3ed36fa10ebbf0f71d617ce7b Mon Sep 17 00:00:00 2001 From: ShuangmingMa <52561813+ShuangmingMa@users.noreply.github.com> Date: Sat, 16 Sep 2023 22:33:02 +0800 Subject: [PATCH 2251/3019] =?UTF-8?q?=E4=BF=AE=E6=94=B9=200084.=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=20Go=E5=8D=95=E8=B0=83=E6=A0=88=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E7=9A=84=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...47\347\232\204\347\237\251\345\275\242.md" | 56 +++++++++---------- 1 file changed, 27 insertions(+), 29 deletions(-) diff --git "a/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" "b/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" index b54429ed22..97dab4f398 100644 --- "a/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" +++ "b/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" @@ -478,36 +478,34 @@ class Solution: ```go func largestRectangleArea(heights []int) int { - // 声明max并初始化为0 - max := 0 - // 使用切片实现栈 - stack := make([]int, 0) - // 数组头部加入0 - heights = append([]int{0}, heights...) - // 数组尾部加入0 - heights = append(heights, 0) - // 初始化栈,序号从0开始 - stack = append(stack, 0) - for i := 1; i < len(heights); i++ { - // 结束循环条件为:当即将入栈元素>top元素,也就是形成非单调递增的趋势 - for heights[stack[len(stack)-1]] > heights[i] { - // mid 是top - mid := stack[len(stack)-1] - // 出栈 - stack = stack[0 : len(stack)-1] - // left是top的下一位元素,i是将要入栈的元素 - left := stack[len(stack)-1] - // 高度x宽度 - tmp := heights[mid] * (i - left - 1) - if tmp > max { - max = tmp - } - } - stack = append(stack, i) - } - return max + max := 0 + // 使用切片实现栈 + stack := make([]int, 0) + // 数组头部加入0 + heights = append([]int{0}, heights...) + // 数组尾部加入0 + heights = append(heights, 0) + // 初始化栈,序号从0开始 + stack = append(stack, 0) + for i := 1; i < len(heights); i ++ { + // 结束循环条件为:当即将入栈元素>top元素,也就是形成非单调递增的趋势 + for heights[stack[len(stack) - 1]] > heights[i] { + // mid 是top + mid := stack[len(stack) - 1] + // 出栈 + stack = stack[0 : len(stack) - 1] + // left是top的下一位元素,i是将要入栈的元素 + left := stack[len(stack) - 1] + // 高度x宽度 + tmp := heights[mid] * (i - left - 1) + if tmp > max { + max = tmp + } + } + stack = append(stack, i) + } + return max } - ``` ### JavaScript: From babb21fad0ac7e9213ef811a1a04415561fd1acf Mon Sep 17 00:00:00 2001 From: km_yang Date: Mon, 18 Sep 2023 14:36:17 +0800 Subject: [PATCH 2252/3019] =?UTF-8?q?=E9=94=99=E5=88=AB=E5=AD=97=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=EF=BC=9A=E2=80=9C=E5=9C=A8=E2=80=9D->=E2=80=9C?= =?UTF-8?q?=E5=86=8D=E2=80=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\220\234\347\220\206\350\256\272\345\237\272\347\241\200.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/\345\233\276\350\256\272\345\271\277\346\220\234\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\345\233\276\350\256\272\345\271\277\346\220\234\347\220\206\350\256\272\345\237\272\347\241\200.md" index 64ca181b90..1174e239c1 100644 --- "a/problems/\345\233\276\350\256\272\345\271\277\346\220\234\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\345\233\276\350\256\272\345\271\277\346\220\234\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -9,7 +9,7 @@ 在[深度优先搜索](https://programmercarl.com/图论深搜理论基础.html)的讲解中,我们就讲过深度优先搜索和广度优先搜索的区别。 -广搜(bfs)是一圈一圈的搜索过程,和深搜(dfs)是一条路跑到黑然后在回溯。 +广搜(bfs)是一圈一圈的搜索过程,和深搜(dfs)是一条路跑到黑然后再回溯。 ## 广搜的使用场景 From 631b333c084b98bf23f8565789452f01a4fa61ae Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Tue, 19 Sep 2023 16:21:37 +0800 Subject: [PATCH 2253/3019] Update --- ...042.\346\216\245\351\233\250\346\260\264.md" | 4 ++-- ...63\350\267\203\346\270\270\346\210\217II.md" | 12 ++++++------ ...4\345\220\210\346\200\273\345\222\214III.md" | 4 ++-- ...\253\345\206\267\345\206\273\346\234\237.md" | 4 ++-- ...\255\347\232\204\344\274\227\346\225\260.md" | 2 +- ...\211\346\220\234\347\264\242\346\240\221.md" | 17 ----------------- ...\211\346\255\245\351\223\272\345\236\253.md" | 2 +- "problems/\345\211\215\345\272\217/vim.md" | 4 ++-- ...\206\350\256\272\345\237\272\347\241\200.md" | 2 +- 9 files changed, 17 insertions(+), 34 deletions(-) diff --git "a/problems/0042.\346\216\245\351\233\250\346\260\264.md" "b/problems/0042.\346\216\245\351\233\250\346\260\264.md" index 760ebc34a4..1090467dc1 100644 --- "a/problems/0042.\346\216\245\351\233\250\346\260\264.md" +++ "b/problems/0042.\346\216\245\351\233\250\346\260\264.md" @@ -39,8 +39,8 @@ 本文深度讲解如下三种方法: -* 双指针法 -* 动态规划 +* 暴力解法 +* 双指针优化 * 单调栈 ### 暴力解法 diff --git "a/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" "b/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" index fbd848665b..aab27b27ee 100644 --- "a/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" +++ "b/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" @@ -35,13 +35,13 @@ 但思路是相似的,还是要看最大覆盖范围。 -本题要计算最小步数,那么就要想清楚什么时候步数才一定要加一呢? +本题要计算最少步数,那么就要想清楚什么时候步数才一定要加一呢? -贪心的思路,局部最优:当前可移动距离尽可能多走,如果还没到终点,步数再加一。整体最优:一步尽可能多走,从而达到最小步数。 +贪心的思路,局部最优:当前可移动距离尽可能多走,如果还没到终点,步数再加一。整体最优:一步尽可能多走,从而达到最少步数。 思路虽然是这样,但在写代码的时候还不能真的能跳多远就跳多远,那样就不知道下一步最远能跳到哪里了。 -**所以真正解题的时候,要从覆盖范围出发,不管怎么跳,覆盖范围内一定是可以跳到的,以最小的步数增加覆盖范围,覆盖范围一旦覆盖了终点,得到的就是最小步数!** +**所以真正解题的时候,要从覆盖范围出发,不管怎么跳,覆盖范围内一定是可以跳到的,以最小的步数增加覆盖范围,覆盖范围一旦覆盖了终点,得到的就是最少步数!** **这里需要统计两个覆盖范围,当前这一步的最大覆盖和下一步最大覆盖**。 @@ -144,7 +144,7 @@ public: 但代码又十分简单,贪心就是这么巧妙。 -理解本题的关键在于:**以最小的步数增加最大的覆盖范围,直到覆盖范围覆盖了终点**,这个范围内最小步数一定可以跳到,不用管具体是怎么跳的,不纠结于一步究竟跳一个单位还是两个单位。 +理解本题的关键在于:**以最小的步数增加最大的覆盖范围,直到覆盖范围覆盖了终点**,这个范围内最少步数一定可以跳到,不用管具体是怎么跳的,不纠结于一步究竟跳一个单位还是两个单位。 ## 其他语言版本 @@ -276,9 +276,9 @@ class Solution: for i in range(len(nums)): # 遍历数组 for j in range(nums[i] + 1): # 在当前位置能够跳跃的范围内遍历 if i + j < len(nums): # 确保下一跳的位置不超过数组范围 - result[i + j] = min(result[i + j], result[i] + 1) # 更新到达下一跳位置的最小步数 + result[i + j] = min(result[i + j], result[i] + 1) # 更新到达下一跳位置的最少步数 - return result[-1] # 返回到达最后一个位置的最小步数 + return result[-1] # 返回到达最后一个位置的最少步数 ``` diff --git "a/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" "b/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" index 4de7dc58f3..c0cb8860c2 100644 --- "a/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" +++ "b/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" @@ -209,11 +209,11 @@ private: vector path; // 符合条件的结果 void backtracking(int targetSum, int k, int sum, int startIndex) { if (sum > targetSum) { // 剪枝操作 - return; // 如果path.size() == k 但sum != targetSum 直接返回 + return; } if (path.size() == k) { if (sum == targetSum) result.push_back(path); - return; + return; // 如果path.size() == k 但sum != targetSum 直接返回 } for (int i = startIndex; i <= 9 - (k - path.size()) + 1; i++) { // 剪枝 sum += i; // 处理 diff --git "a/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" "b/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" index f4093b67e6..0eb66fb543 100644 --- "a/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" +++ "b/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" @@ -240,9 +240,9 @@ class Solution { // 因为马上dp[0]和dp[2]的数据都会变 int temp = dp[0]; int temp1 = dp[2]; - dp[0] = Math.max(dp[0], Math.max(dp[3], dp[1]) - prices[i-1]); + dp[0] = Math.max(dp[0], Math.max(dp[3], dp[1]) - prices[i]); dp[1] = Math.max(dp[1], dp[3]); - dp[2] = temp + prices[i-1]; + dp[2] = temp + prices[i]; dp[3] = temp1; } return Math.max(dp[3],Math.max(dp[1],dp[2])); diff --git "a/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" "b/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" index 29b0926d4d..8881200f5d 100644 --- "a/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" +++ "b/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" @@ -261,7 +261,7 @@ public: vector findMode(TreeNode* root) { count = 0; maxCount = 0; - TreeNode* pre = NULL; // 记录前一个节点 + pre = NULL; // 记录前一个节点 result.clear(); searchBST(root); diff --git "a/problems/0669.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0669.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" index 2cfbfefc60..001865585d 100644 --- "a/problems/0669.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" +++ "b/problems/0669.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" @@ -330,23 +330,6 @@ class Solution: return root ``` -递归法(版本二)精简 -```python -class Solution: - def trimBST(self, root: TreeNode, low: int, high: int) -> TreeNode: - if root is None: - return None - if root.val < low: - return self.trimBST(root.right, low, high) - if root.val > high: - return self.trimBST(root.left, low, high) - root.left = self.trimBST(root.left, low, high) - root.right = self.trimBST(root.right, low, high) - return root - - -``` - 迭代法 ```python class Solution: diff --git "a/problems/\344\270\272\344\272\206\347\273\235\346\235\200\347\274\226\350\276\221\350\267\235\347\246\273\357\274\214\345\215\241\345\260\224\345\201\232\344\272\206\344\270\211\346\255\245\351\223\272\345\236\253.md" "b/problems/\344\270\272\344\272\206\347\273\235\346\235\200\347\274\226\350\276\221\350\267\235\347\246\273\357\274\214\345\215\241\345\260\224\345\201\232\344\272\206\344\270\211\346\255\245\351\223\272\345\236\253.md" index 1982d44943..442a505573 100644 --- "a/problems/\344\270\272\344\272\206\347\273\235\346\235\200\347\274\226\350\276\221\350\267\235\347\246\273\357\274\214\345\215\241\345\260\224\345\201\232\344\272\206\344\270\211\346\255\245\351\223\272\345\236\253.md" +++ "b/problems/\344\270\272\344\272\206\347\273\235\346\235\200\347\274\226\350\276\221\350\267\235\347\246\273\357\274\214\345\215\241\345\260\224\345\201\232\344\272\206\344\270\211\346\255\245\351\223\272\345\236\253.md" @@ -66,7 +66,7 @@ if (s[i - 1] == t[j - 1]) { ## 两个字符串的删除操作 -[动态规划:583.两个字符串的删除操作](https://programmercarl.com/0583.两个字符串的删除操作.html)给定两个单词 word1 和 word2,找到使得 word1 和 word2 相同所需的最小步数,每步可以删除任意一个字符串中的一个字符。 +[动态规划:583.两个字符串的删除操作](https://programmercarl.com/0583.两个字符串的删除操作.html)给定两个单词 word1 和 word2,找到使得 word1 和 word2 相同所需的最少步数,每步可以删除任意一个字符串中的一个字符。 本题和[动态规划:115.不同的子序列](https://programmercarl.com/0115.不同的子序列.html)相比,其实就是两个字符串可以都可以删除了,情况虽说复杂一些,但整体思路是不变的。 diff --git "a/problems/\345\211\215\345\272\217/vim.md" "b/problems/\345\211\215\345\272\217/vim.md" index 136a499338..581019995a 100644 --- "a/problems/\345\211\215\345\272\217/vim.md" +++ "b/problems/\345\211\215\345\272\217/vim.md" @@ -21,11 +21,11 @@ 使用VIM的话,本地,服务器,开发机,一刀流,无缝切换,爽不。 -IDE那么很吃内存,打开个IDE卡半天,用VIM就很轻便了,秒开有木有! +IDE那么很吃内存,打开个IDE卡半天,用VIM就很轻便了,秒开! 而且在我们日常开发中,工作年头多了,都会发现没有纯粹的C++,Java开发啥的,就是 C++也得写,Java也得写,有时候写Go起个http服务,写Python处理一下数据,写shell搞个自动部署,编译啥的。 **总是就是啥语言就得写,一些以项目需求为导向!** -写语言还要切换不同的IDE,熟悉不同的操作姿势,想想是不是很麻烦。 +写语言还要切换不同的IDE,熟悉不同的操作规则,想想是不是很麻烦。 听说好像现在有的IDE可以支持很多语言了,这个我还不太了解,但能确定的是,IDE支持的语言再多,也不会有vim多。 diff --git "a/problems/\345\233\276\350\256\272\345\271\266\346\237\245\351\233\206\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\345\233\276\350\256\272\345\271\266\346\237\245\351\233\206\347\220\206\350\256\272\345\237\272\347\241\200.md" index 54341ce227..2c14f49037 100644 --- "a/problems/\345\233\276\350\256\272\345\271\266\346\237\245\351\233\206\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\345\233\276\350\256\272\345\271\266\346\237\245\351\233\206\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -289,7 +289,7 @@ join(6, 2); 此时我们生成的的有向图为: -![](https://cdn.tftree.top/others/jion.jpg) +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20230910203210.png) 有录友可能想,`join(3, 8)` 在图中为什么 将 元素1 连向元素 3 而不是将 元素 8 连向 元素 3 呢? From e14fb76097d117785c0a3af852eaff7d5a174966 Mon Sep 17 00:00:00 2001 From: Junqiao Date: Sun, 24 Sep 2023 10:43:51 +0800 Subject: [PATCH 2254/3019] =?UTF-8?q?Update=200035.=E6=90=9C=E7=B4=A2?= =?UTF-8?q?=E6=8F=92=E5=85=A5=E4=BD=8D=E7=BD=AE.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...22\345\205\245\344\275\215\347\275\256.md" | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git "a/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" "b/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" index 04dd0cac76..80b7e40e4a 100644 --- "a/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" +++ "b/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" @@ -258,6 +258,37 @@ public int searchInsert(int[] nums, int target) { +### C# + +```go +public int SearchInsert(int[] nums, int target) { + + var left = 0; + var right = nums.Length - 1; + + while (left <= right) { + + var curr = (left + right) / 2; + + if (nums[curr] == target) + { + return curr; + } + + if (target > nums[curr]) { + left = curr + 1; + } + else { + right = curr - 1; + } + } + + return left; +} +``` + + + ### Golang ```go @@ -500,3 +531,4 @@ int searchInsert(int* nums, int numsSize, int target){ + From 949dd979f7ca88a12a9b364b38e4da2457b27691 Mon Sep 17 00:00:00 2001 From: Junqiao Date: Sun, 24 Sep 2023 11:43:43 +0800 Subject: [PATCH 2255/3019] =?UTF-8?q?Update=200034.=E5=9C=A8=E6=8E=92?= =?UTF-8?q?=E5=BA=8F=E6=95=B0=E7=BB=84=E4=B8=AD=E6=9F=A5=E6=89=BE=E5=85=83?= =?UTF-8?q?=E7=B4=A0=E7=9A=84=E7=AC=AC=E4=B8=80=E4=B8=AA=E5=92=8C=E6=9C=80?= =?UTF-8?q?=E5=90=8E=E4=B8=80=E4=B8=AA=E4=BD=8D=E7=BD=AE.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...00\344\270\252\344\275\215\347\275\256.md" | 61 +++++++++++++++++++ 1 file changed, 61 insertions(+) diff --git "a/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" "b/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" index b412816686..3bf90e3bbb 100644 --- "a/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" +++ "b/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" @@ -329,6 +329,67 @@ class Solution { } ``` +### C# + +```c# +public int[] SearchRange(int[] nums, int target) { + + var leftBorder = GetLeftBorder(nums, target); + var rightBorder = GetRightBorder(nums, target); + + if (leftBorder == -2 || rightBorder == -2) { + return new int[] {-1, -1}; + } + + if (rightBorder - leftBorder >=2) { + return new int[] {leftBorder + 1, rightBorder - 1}; + } + + return new int[] {-1, -1}; + +} + +public int GetLeftBorder(int[] nums, int target){ + var left = 0; + var right = nums.Length - 1; + var leftBorder = -2; + + while (left <= right) { + var mid = (left + right) / 2; + + if (target <= nums[mid]) { + right = mid - 1; + leftBorder = right; + } + else { + left = mid + 1; + } + } + + return leftBorder; +} + +public int GetRightBorder(int[] nums, int target){ + var left = 0; + var right = nums.Length - 1; + var rightBorder = -2; + + while (left <= right) { + var mid = (left + right) / 2; + + if (target >= nums[mid]) { + left = mid + 1; + rightBorder = left; + } + else { + right = mid - 1; + } + } + + return rightBorder; +} +``` + ### Python From afc9e07d516f7c284163ee71d9b64ed46ab11408 Mon Sep 17 00:00:00 2001 From: Xuan <854674282@qq.com> Date: Mon, 25 Sep 2023 10:21:33 +0800 Subject: [PATCH 2256/3019] =?UTF-8?q?Update=200343.=E6=95=B4=E6=95=B0?= =?UTF-8?q?=E6=8B=86=E5=88=86.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增0343.整数拆分.md PHP 版本 --- ...64\346\225\260\346\213\206\345\210\206.md" | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git "a/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" "b/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" index cba82f6cae..2e17caf553 100644 --- "a/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" +++ "b/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" @@ -469,6 +469,34 @@ object Solution { } ``` + +### PHP +```php +class Solution { + + /** + * @param Integer $n + * @return Integer + */ + function integerBreak($n) { + if($n == 0 || $n == 1) return 0; + if($n == 2) return 1; + + $dp = []; + $dp[0] = 0; + $dp[1] = 0; + $dp[2] = 1; + for($i=3;$i<=$n;$i++){ + for($j = 1;$j <= $i/2; $j++){ + $dp[$i] = max(($i-$j)*$j, $dp[$i-$j]*$j, $dp[$i]); + } + } + + return $dp[$n]; + } +} +``` +

From c2b6be723aab6f2b78fa5a0f3198bf6d37f0edbd Mon Sep 17 00:00:00 2001 From: zirs97 Date: Mon, 25 Sep 2023 22:54:57 +0800 Subject: [PATCH 2257/3019] =?UTF-8?q?=E4=BF=AE=E6=AD=A30019.=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=E7=9A=84Java=E4=BB=A3=E7=A0=81fast?= =?UTF-8?q?Index=E7=A7=BB=E5=8A=A8=E7=9A=84=E9=94=99=E8=AF=AF=E9=83=A8?= =?UTF-8?q?=E4=BB=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...5\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" "b/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" index 1c95ad5b2f..dbd053d141 100644 --- "a/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" +++ "b/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" @@ -105,8 +105,8 @@ public ListNode removeNthFromEnd(ListNode head, int n){ ListNode fastIndex = dummyNode; ListNode slowIndex = dummyNode; - //只要快慢指针相差 n 个结点即可 - for (int i = 0; i < n ; i++){ + // 只要快慢指针相差 n 个结点即可 + for (int i = 0; i <= n ; i++){ fastIndex = fastIndex.next; } From 5117a288422612c5e4a845d7ecdecff8448334d0 Mon Sep 17 00:00:00 2001 From: Bird Date: Thu, 28 Sep 2023 22:08:12 +0800 Subject: [PATCH 2258/3019] =?UTF-8?q?feat(0213=20=E6=89=93=E5=AE=B6?= =?UTF-8?q?=E5=8A=AB=E8=88=8D=E2=85=A1):=20=E4=BD=BFGo=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E6=9B=B4=E7=AC=A6=E5=90=88Go=E4=B9=A0=E6=83=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\345\256\266\345\212\253\350\210\215II.md" | 44 +++++++++++-------- 1 file changed, 25 insertions(+), 19 deletions(-) diff --git "a/problems/0213.\346\211\223\345\256\266\345\212\253\350\210\215II.md" "b/problems/0213.\346\211\223\345\256\266\345\212\253\350\210\215II.md" index cd9d596d70..385c58675e 100644 --- "a/problems/0213.\346\211\223\345\256\266\345\212\253\350\210\215II.md" +++ "b/problems/0213.\346\211\223\345\256\266\345\212\253\350\210\215II.md" @@ -225,32 +225,38 @@ class Solution: // 打家劫舍Ⅱ 动态规划 // 时间复杂度O(n) 空间复杂度O(n) func rob(nums []int) int { - if len(nums) == 1 { - return nums[0] + // 如果长度为0或1,那么有没有环的限制都一样 + if len(nums) <= 1 { + return robWithoutCircle(nums) } - if len(nums) == 2 { - return max(nums[0], nums[1]) - } - - result1 := robRange(nums, 0) - result2 := robRange(nums, 1) - return max(result1, result2) + + // 否则,去头或去尾,取最大 + res1 := robWithoutCircle(nums[:len(nums)-1]) + res2 := robWithoutCircle(nums[1:]) + + return max(res1, res2) } -// 偷盗指定的范围 -func robRange(nums []int, start int) int { +// 原始的打家劫舍版 +func robWithoutCircle(nums []int) int { + switch len(nums) { + case 0: return 0 + case 1: return nums[0] + } dp := make([]int, len(nums)) - dp[1] = nums[start] - - for i := 2; i < len(nums); i++ { - dp[i] = max(dp[i - 2] + nums[i - 1 + start], dp[i - 1]) + dp[0]=nums[0] + dp[1] = max(nums[0], nums[1]) + + for i:=2; i b { +func max(a, b int ) int { + if a>b { return a } return b From 546d3b601a2be997855a0d9da2c5af567ebbfaa5 Mon Sep 17 00:00:00 2001 From: Bird Date: Thu, 28 Sep 2023 22:13:00 +0800 Subject: [PATCH 2259/3019] =?UTF-8?q?feat(1356=20=E6=95=B0=E5=AD=97?= =?UTF-8?q?=E4=BA=8C=E8=BF=9B=E5=88=B61=E6=8E=92=E5=BA=8F):=20=E4=BD=BF?= =?UTF-8?q?=E7=94=A8Go=E5=86=85=E7=BD=AE=E6=8E=92=E5=BA=8F=E5=87=BD?= =?UTF-8?q?=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...60\347\233\256\346\216\222\345\272\217.md" | 41 ++++++++----------- 1 file changed, 17 insertions(+), 24 deletions(-) diff --git "a/problems/1356.\346\240\271\346\215\256\346\225\260\345\255\227\344\272\214\350\277\233\345\210\266\344\270\2131\347\232\204\346\225\260\347\233\256\346\216\222\345\272\217.md" "b/problems/1356.\346\240\271\346\215\256\346\225\260\345\255\227\344\272\214\350\277\233\345\210\266\344\270\2131\347\232\204\346\225\260\347\233\256\346\216\222\345\272\217.md" index cc7a7007c7..c2455cf043 100644 --- "a/problems/1356.\346\240\271\346\215\256\346\225\260\345\255\227\344\272\214\350\277\233\345\210\266\344\270\2131\347\232\204\346\225\260\347\233\256\346\216\222\345\272\217.md" +++ "b/problems/1356.\346\240\271\346\215\256\346\225\260\345\255\227\344\272\214\350\277\233\345\210\266\344\270\2131\347\232\204\346\225\260\347\233\256\346\216\222\345\272\217.md" @@ -171,36 +171,29 @@ class Solution: ```go func sortByBits(arr []int) []int { - var tmp int - for i := 0; i < len(arr); i++ { - for j := i+1; j < len(arr); j++ { - // 冒泡排序的手法,但是排序的规则从比大小变成了比位运算1的个数 - if isCmp(arr[i], arr[j]) { - tmp = arr[i] - arr[i] = arr[j] - arr[j] = tmp - } - } + // 是否arr[i]<=arr[j] + // 先比较1的数量,后比较值本身 + cmp := func(i, j int) bool { + c1, c2 := bitCount(arr[i]), bitCount(arr[j]) + if c1 == c2 { + return arr[i] <= arr[j] + } + return c1 <= c2 } - return arr -} -func isCmp(a, b int) bool { - bitA := bitCount(a) - bitB := bitCount(b) - if bitA == bitB { - return a > b - } else { - return bitA > bitB - } + // 调用库函数 + // 第一个参数是待排序切片,第二个是第i位是否小于第j位的函数 + sort.Slice(arr, cmp) + + return arr } -func bitCount(n int) int { - count := 0 - for n != 0 { - n &= (n-1) // 清除最低位的1 +func bitCount(num int) (count int) { + for num != 0 { + num &= num-1 // 每次运算将最右侧的1变成0 count++ } + return count } ``` From 82b20f2e6918a5c0b14dc3e46835f149d5c4e57a Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Tue, 3 Oct 2023 11:03:12 +0800 Subject: [PATCH 2260/3019] Update --- ...\277\203\345\221\250\346\234\253\346\200\273\347\273\223.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20201126\350\264\252\345\277\203\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20201126\350\264\252\345\277\203\345\221\250\346\234\253\346\200\273\347\273\223.md" index 1d5ca6afb6..cdfe4a96d2 100644 --- "a/problems/\345\221\250\346\200\273\347\273\223/20201126\350\264\252\345\277\203\345\221\250\346\234\253\346\200\273\347\273\223.md" +++ "b/problems/\345\221\250\346\200\273\347\273\223/20201126\350\264\252\345\277\203\345\221\250\346\234\253\346\200\273\347\273\223.md" @@ -90,7 +90,7 @@ public: 大家不要脑洞模拟哈,可以亲自构造一些测试数据试一试,就发现其实没有问题。 -数组都为负数,result记录的就是最小的负数,如果数组里有int最小值,那么最终result就是int最小值。 +数组都为负数,result记录的就是最大的负数,如果数组里有int最小值,那么最终result就是int最小值。 ## 总结 From e68557e03a312f6aa99c49a7fe7701b8befaa30c Mon Sep 17 00:00:00 2001 From: w830207 <44136372+w830207@users.noreply.github.com> Date: Tue, 3 Oct 2023 14:22:36 +0800 Subject: [PATCH 2261/3019] =?UTF-8?q?=E4=BF=AE=E6=AD=A30001.=E4=B8=A4?= =?UTF-8?q?=E6=95=B0=E4=B9=8B=E5=92=8Cdart?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 儘量給定類型 - 使用HashMap取代不適合的List --- ...44\346\225\260\344\271\213\345\222\214.md" | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git "a/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" "b/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" index 4e44d0c3f6..1785fe5ff1 100644 --- "a/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" @@ -402,16 +402,18 @@ public class Solution { ### Dart: ```dart -List twoSum(List nums, int target) { - var tmp = []; - for (var i = 0; i < nums.length; i++) { - var rest = target - nums[i]; - if(tmp.contains(rest)){ - return [tmp.indexOf(rest), i]; - } - tmp.add(nums[i]); +import 'dart:collection'; + +List twoSum(List nums, int target) { + HashMap hashMap = HashMap(); + for (int i = 0; i < nums.length; i++) { + int rest = target - nums[i]; + if (hashMap.containsKey(rest)) { + return [hashMap[rest]!, i]; } - return [0 , 0]; + hashMap.addEntries({nums[i]: i}.entries); + } + return []; } ``` From a8366adf1cbb7a8155a67f2d6d26db9a562acb6a Mon Sep 17 00:00:00 2001 From: wngtk <100271394+wngtk@users.noreply.github.com> Date: Tue, 3 Oct 2023 17:49:16 +0800 Subject: [PATCH 2262/3019] =?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-2.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fix typo --- ...\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" index f60e261be0..7827aa958d 100644 --- "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" +++ "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" @@ -133,7 +133,7 @@ dp[1] = dp[1 - weight[0]] + value[0] = 15 所以从后往前循环,每次取得状态不会和之前取得状态重合,这样每种物品就只取一次了。 -**那么问题又来了,为什么二维dp数组历的时候不用倒序呢?** +**那么问题又来了,为什么二维dp数组遍历的时候不用倒序呢?** 因为对于二维dp,dp[i][j]都是通过上一层即dp[i - 1][j]计算而来,本层的dp[i][j]并不会被覆盖! From 48692ef223361dbb3cc4cedf763c5ca9567c150f Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Wed, 4 Oct 2023 17:15:42 +0800 Subject: [PATCH 2263/3019] Update --- README.md | 1 + ...50\346\234\253\346\200\273\347\273\223.md" | 2 +- ...36\346\272\257\346\200\273\347\273\223.md" | 2 +- ...47\241\20001\350\203\214\345\214\205-1.md" | 52 +++++++++++++++++++ ...47\241\20001\350\203\214\345\214\205-2.md" | 47 ++++++++++++++++- ...14\345\205\250\350\203\214\345\214\205.md" | 39 ++++++++++++++ 6 files changed, 140 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index bf55a0041b..b43fa38cea 100644 --- a/README.md +++ b/README.md @@ -74,6 +74,7 @@ * 编程语言 * [C++面试&C++学习指南知识点整理](https://github.com/youngyangyang04/TechCPP) + * [C++语言基础课](https://kamacoder.com/course.php?course_id=1) * 项目 * [基于跳表的轻量级KV存储引擎](https://github.com/youngyangyang04/Skiplist-CPP) diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20201107\345\233\236\346\272\257\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20201107\345\233\236\346\272\257\345\221\250\346\234\253\346\200\273\347\273\223.md" index 9a447648d8..2d20a19702 100644 --- "a/problems/\345\221\250\346\200\273\347\273\223/20201107\345\233\236\346\272\257\345\221\250\346\234\253\346\200\273\347\273\223.md" +++ "b/problems/\345\221\250\346\200\273\347\273\223/20201107\345\233\236\346\272\257\345\221\250\346\234\253\346\200\273\347\273\223.md" @@ -31,7 +31,7 @@ for (int i = startIndex; i < candidates.size() && sum + candidates[i] <= target; 在[回溯算法:求组合总和(二)](https://programmercarl.com/0039.组合总和.html)第一个树形结构没有画出startIndex的作用,**这里这里纠正一下,准确的树形结构如图所示:** -![39.组合总和](https://code-thinking-1253855093.file.myqcloud.com/pics/20201123202227835.png) +![39.组合总和](https://code-thinking-1253855093.file.myqcloud.com/pics/20201223170730367.png) ## 周二 diff --git "a/problems/\345\233\236\346\272\257\346\200\273\347\273\223.md" "b/problems/\345\233\236\346\272\257\346\200\273\347\273\223.md" index 35b4c3f907..5d4c945075 100644 --- "a/problems/\345\233\236\346\272\257\346\200\273\347\273\223.md" +++ "b/problems/\345\233\236\346\272\257\346\200\273\347\273\223.md" @@ -116,8 +116,8 @@ void backtracking(参数) { **注意以上我只是说求组合的情况,如果是排列问题,又是另一套分析的套路**。 树形结构如下: +![39.组合总和](https://code-thinking-1253855093.file.myqcloud.com/pics/20201223170730367.png) -![39.组合总和](https://code-thinking-1253855093.file.myqcloud.com/pics/20201118152521990.png) 最后还给出了本题的剪枝优化,如下: diff --git "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" index 79ad26a859..bc5f2e5d67 100644 --- "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" +++ "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" @@ -8,6 +8,9 @@ # 动态规划:01背包理论基础 + +本题力扣上没有原题,大家可以去[卡码网第46题](https://kamacoder.com/problem.php?id=1046)去练习,题意是一样的。 + ## 算法公开课 **[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[带你学透0-1背包问题!](https://www.bilibili.com/video/BV1cg411g7Y6/),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 @@ -261,6 +264,55 @@ int main() { ``` +本题力扣上没有原题,大家可以去[卡码网第46题](https://kamacoder.com/problem.php?id=1046)去练习,题意是一样的,代码如下: + +```CPP + +//二维dp数组实现 +#include +using namespace std; + +int n, bagweight;// bagweight代表行李箱空间 +void solve() { + vector weight(n, 0); // 存储每件物品所占空间 + vector value(n, 0); // 存储每件物品价值 + for(int i = 0; i < n; ++i) { + cin >> weight[i]; + } + for(int j = 0; j < n; ++j) { + cin >> value[j]; + } + // dp数组, dp[i][j]代表行李箱空间为j的情况下,从下标为[0, i]的物品里面任意取,能达到的最大价值 + vector> dp(weight.size(), vector(bagweight + 1, 0)); + + // 初始化, 因为需要用到dp[i - 1]的值 + // j < weight[0]已在上方被初始化为0 + // j >= weight[0]的值就初始化为value[0] + for (int j = weight[0]; j <= bagweight; j++) { + dp[0][j] = value[0]; + } + + for(int i = 1; i < weight.size(); i++) { // 遍历科研物品 + for(int j = 0; j <= bagweight; j++) { // 遍历行李箱容量 + // 如果装不下这个物品,那么就继承dp[i - 1][j]的值 + if (j < weight[i]) dp[i][j] = dp[i - 1][j]; + // 如果能装下,就将值更新为 不装这个物品的最大值 和 装这个物品的最大值 中的 最大值 + // 装这个物品的最大值由容量为j - weight[i]的包任意放入序号为[0, i - 1]的最大值 + 该物品的价值构成 + else dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]); + } + } + cout << dp[weight.size() - 1][bagweight] << endl; +} + +int main() { + while(cin >> n >> bagweight) { + solve(); + } + return 0; +} + +``` + ## 总结 diff --git "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" index f60e261be0..3e2134b419 100644 --- "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" +++ "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" @@ -6,6 +6,7 @@ # 动态规划:01背包理论基础(滚动数组) +本题力扣上没有原题,大家可以去[卡码网第46题](https://kamacoder.com/problem.php?id=1046)去练习 ## 算法公开课 @@ -13,7 +14,6 @@ ## 思路 - 昨天[动态规划:关于01背包问题,你该了解这些!](https://programmercarl.com/背包理论基础01背包-1.html)中是用二维dp数组来讲解01背包。 今天我们就来说一说滚动数组,其实在前面的题目中我们已经用到过滚动数组了,就是把二维dp降为一维dp,一些录友当时还表示比较困惑。 @@ -159,6 +159,8 @@ dp[1] = dp[1 - weight[0]] + value[0] = 15 +C++代码如下: + ```CPP void test_1_wei_bag_problem() { vector weight = {1, 3, 4}; @@ -181,6 +183,49 @@ int main() { ``` +本题力扣上没有原题,大家可以去[卡码网第46题](https://kamacoder.com/problem.php?id=1046)去练习,题意是一样的,代码如下: + +```CPP +// 一维dp数组实现 +#include +#include +using namespace std; + +int main() { + // 读取 M 和 N + int M, N; + cin >> M >> N; + + vector costs(M); + vector values(M); + + for (int i = 0; i < M; i++) { + cin >> costs[i]; + } + for (int j = 0; j < M; j++) { + cin >> values[j]; + } + + // 创建一个动态规划数组dp,初始值为0 + vector dp(N + 1, 0); + + // 外层循环遍历每个类型的研究材料 + for (int i = 0; i < M; ++i) { + // 内层循环从 N 空间逐渐减少到当前研究材料所占空间 + for (int j = N; j >= costs[i]; --j) { + // 考虑当前研究材料选择和不选择的情况,选择最大值 + dp[j] = max(dp[j], dp[j - costs[i]] + values[i]); + } + } + + // 输出dp[N],即在给定 N 行李空间可以携带的研究材料最大价值 + cout << dp[N] << endl; + + return 0; +} + +``` + 可以看出,一维dp 的01背包,要比二维简洁的多! 初始化 和 遍历顺序相对简单了。 **所以我倾向于使用一维dp数组的写法,比较直观简洁,而且空间复杂度还降了一个数量级!** diff --git "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" index a006cb0e20..a173c6ddf9 100644 --- "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" +++ "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" @@ -7,6 +7,8 @@ # 动态规划:完全背包理论基础 +本题力扣上没有原题,大家可以去[卡码网第52题](https://kamacoder.com/problem.php?id=1046)去练习,题意是一样的。 + ## 算法公开课 **[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[带你学透完全背包问题! ](https://www.bilibili.com/video/BV1uK411o7c9/),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 @@ -162,6 +164,43 @@ int main() { ``` +本题力扣上没有原题,大家可以去[卡码网第46题](https://kamacoder.com/problem.php?id=1046)去练习,题意是一样的,C++代码如下: + +```cpp +#include +#include +using namespace std; + +// 先遍历背包,再遍历物品 +void test_CompletePack(vector weight, vector value, int bagWeight) { + + vector dp(bagWeight + 1, 0); + + for(int j = 0; j <= bagWeight; j++) { // 遍历背包容量 + for(int i = 0; i < weight.size(); i++) { // 遍历物品 + if (j - weight[i] >= 0) dp[j] = max(dp[j], dp[j - weight[i]] + value[i]); + } + } + cout << dp[bagWeight] << endl; +} +int main() { + int N, V; + cin >> N >> V; + vector weight; + vector value; + for (int i = 0; i < N; i++) { + int w; + int v; + cin >> w >> v; + weight.push_back(w); + value.push_back(v); + } + test_CompletePack(weight, value, V); + return 0; +} +``` + + ## 总结 From 9ca0d38d989f4712bf9e45bb11f7ff8d7452e037 Mon Sep 17 00:00:00 2001 From: INSSRumia <52827806+INSSRumia@users.noreply.github.com> Date: Thu, 5 Oct 2023 01:09:05 +0800 Subject: [PATCH 2264/3019] =?UTF-8?q?Update=200450.=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=90=9C=E7=B4=A2=E6=A0=91=E4=B8=AD=E7=9A=84?= =?UTF-8?q?=E8=8A=82=E7=82=B9.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加0450删除二叉搜索树中的节点 C# 版本 --- ...55\347\232\204\350\212\202\347\202\271.md" | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git "a/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" "b/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" index 18e5cb4cb1..13c25023a2 100644 --- "a/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" +++ "b/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" @@ -769,6 +769,38 @@ impl Solution { } ``` +### C# + +> 递归法: +```C# + public TreeNode DeleteNode(TreeNode root, int key) { + // 第一种情况:没找到删除的节点,遍历到空节点直接返回了 + if (root == null) return null; + if(key == root.val) { + //第二种情况:左右孩子都为空(叶子节点),直接删除节点, 返回NULL为根节点 + if(root.left == null && root.right == null) return null; + //第三种情况:其左孩子为空,右孩子不为空,删除节点,右孩子补位 ,返回右孩子为根节点 + if (root.left == null && root.right != null) return root.right; + //第四种情况:其右孩子为空,左孩子不为空,删除节点,左孩子补位,返回左孩子为根节点 + if (root.left != null && root.right == null) return root.left; + //第五种情况:左右孩子节点都不为空,则将删除节点的左子树放到删除节点的右子树的最左面节点的左孩子的位置 + // 并返回删除节点右孩子为新的根节点。 + if(root.left != null && root.right != null) { + TreeNode leftNode = root.right; // 找右子树最左面的节点 + while(leftNode.left != null) + leftNode = leftNode.left; + leftNode.left = root.left; // 把要删除的节点(root)左子树放在leftNode的左孩子的位置 + return root.right; // 返回旧root的右孩子作为新root + } + } + + if(root.val > key) root.left = DeleteNode(root.left, key); + if(root.val < key) root.right = DeleteNode(root.right, key); + + return root; + } +``` +

From 8973967dd10fbea86996f9df413aa1559c1dac53 Mon Sep 17 00:00:00 2001 From: ShuangmingMa <52561813+ShuangmingMa@users.noreply.github.com> Date: Sun, 8 Oct 2023 15:05:51 +0800 Subject: [PATCH 2265/3019] =?UTF-8?q?=E4=BF=AE=E6=94=B9=200392.=E5=88=A4?= =?UTF-8?q?=E6=96=AD=E5=AD=90=E5=BA=8F=E5=88=97.md=20Go=E4=BA=8C=E7=BB=B4D?= =?UTF-8?q?P=E6=A0=BC=E5=BC=8F=EF=BC=8C=E5=B9=B6=E5=A2=9E=E5=8A=A0Go?= =?UTF-8?q?=E4=B8=80=E7=BB=B4DP=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修改 0392.判断子序列.md Go二维DP格式,并增加Go一维DP解法 --- ...55\345\255\220\345\272\217\345\210\227.md" | 39 ++++++++++++++----- 1 file changed, 29 insertions(+), 10 deletions(-) diff --git "a/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" "b/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" index 12d3fa481f..cb9323c8a7 100644 --- "a/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" @@ -240,26 +240,45 @@ function isSubsequence(s: string, t: string): boolean { ### Go: +二维DP: + ```go func isSubsequence(s string, t string) bool { - dp := make([][]int,len(s)+1) - for i:=0;i= 1; j -- { + if t[i - 1] == s[j - 1] { + dp[j] = dp[j - 1] + 1 + } + } + } + return dp[len(s)] == len(s) +} +``` + + +### Rust: ```rust impl Solution { From d9e08a1bbfda8295273d99699c77267dcde85696 Mon Sep 17 00:00:00 2001 From: ShuangmingMa <52561813+ShuangmingMa@users.noreply.github.com> Date: Sun, 8 Oct 2023 15:16:06 +0800 Subject: [PATCH 2266/3019] =?UTF-8?q?=E4=BF=AE=E6=94=B9=200392.=E5=88=A4?= =?UTF-8?q?=E6=96=AD=E5=AD=90=E5=BA=8F=E5=88=97.md=20Go=E4=BA=8C=E7=BB=B4D?= =?UTF-8?q?P=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修改 0392.判断子序列.md Go二维DP格式 --- ...\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" "b/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" index cb9323c8a7..f7863c9499 100644 --- "a/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" @@ -250,7 +250,7 @@ func isSubsequence(s string, t string) bool { } for i := 1; i < len(dp); i ++{ for j := 1; j < len(dp[i]); j ++{ - if s[i - 1] == t[j-1] { + if s[i - 1] == t[j - 1] { dp[i][j] = dp[i - 1][j - 1] +1 }else{ dp[i][j] = dp[i][j - 1] From be11452af6c87e47243c8bb65aa86e517e1f4ab8 Mon Sep 17 00:00:00 2001 From: Logen <47022821+Logenleedev@users.noreply.github.com> Date: Sun, 8 Oct 2023 08:36:54 -0400 Subject: [PATCH 2267/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0python=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E4=B8=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...7.\346\267\261\346\220\234\347\211\210.md" | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git "a/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\346\267\261\346\220\234\347\211\210.md" "b/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\346\267\261\346\220\234\347\211\210.md" index c7649971d3..43eb66e172 100644 --- "a/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\346\267\261\346\220\234\347\211\210.md" +++ "b/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\346\267\261\346\220\234\347\211\210.md" @@ -278,6 +278,40 @@ class Solution: return result ``` +```python +# 我们用三个状态去标记每一个格子 +# 0 代表海水 +# 1 代表陆地 +# 2 代表已经访问的陆地 +class Solution: + def traversal(self, grid, i, j): + m = len(grid) + n = len(grid[0]) + + if i < 0 or j < 0 or i >= m or j >= n: + return # 越界了 + elif grid[i][j] == "2" or grid[i][j] == "0": + return + + grid[i][j] = "2" + self.traversal(grid, i - 1, j) # 往上走 + self.traversal(grid, i + 1, j) # 往下走 + self.traversal(grid, i, j - 1) # 往左走 + self.traversal(grid, i, j + 1) # 往右走 + + def numIslands(self, grid: List[List[str]]) -> int: + res = 0 + + + for i in range(len(grid)): + for j in range(len(grid[0])): + if grid[i][j] == "1": + res += 1 + self.traversal(grid, i, j) + + return res +``` + ### JavaScript ```javascript From 4a9c5a4385d6ac0f17981ad8fa8cd77c67585345 Mon Sep 17 00:00:00 2001 From: shengwang Date: Mon, 9 Oct 2023 11:00:53 +0800 Subject: [PATCH 2268/3019] =?UTF-8?q?=E4=BF=AE=E6=94=B9=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 --- ...41\250\344\270\255\347\232\204\350\212\202\347\202\271.md" | 4 ++-- ...31\244\351\223\276\350\241\250\345\205\203\347\264\240.md" | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git "a/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" "b/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" index c612c4b3b9..36f9b0cc9a 100644 --- "a/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" +++ "b/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" @@ -51,7 +51,7 @@ class Solution { public: ListNode* swapPairs(ListNode* head) { ListNode* dummyHead = new ListNode(0); // 设置一个虚拟头结点 - dummyHead->next = head; // 将虚拟头结点指向head,这样方面后面做删除操作 + dummyHead->next = head; // 将虚拟头结点指向head,这样方便后面做删除操作 ListNode* cur = dummyHead; while(cur->next != nullptr && cur->next->next != nullptr) { ListNode* tmp = cur->next; // 记录临时节点 @@ -160,7 +160,7 @@ class Solution { class Solution { public ListNode swapPairs(ListNode head) { ListNode dumyhead = new ListNode(-1); // 设置一个虚拟头结点 - dumyhead.next = head; // 将虚拟头结点指向head,这样方面后面做删除操作 + dumyhead.next = head; // 将虚拟头结点指向head,这样方便后面做删除操作 ListNode cur = dumyhead; ListNode temp; // 临时节点,保存两个节点后面的节点 ListNode firstnode; // 临时节点,保存两个节点之中的第一个节点 diff --git "a/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" "b/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" index c8f802a183..780f9c36ea 100644 --- "a/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" +++ "b/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" @@ -127,7 +127,7 @@ class Solution { public: ListNode* removeElements(ListNode* head, int val) { ListNode* dummyHead = new ListNode(0); // 设置一个虚拟头结点 - dummyHead->next = head; // 将虚拟头结点指向head,这样方面后面做删除操作 + dummyHead->next = head; // 将虚拟头结点指向head,这样方便后面做删除操作 ListNode* cur = dummyHead; while (cur->next != NULL) { if(cur->next->val == val) { From 7f1c040b282aed31f7c4e6d97721daa61c603c11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B5=B5=E4=BA=9A=E6=9D=B0?= <105789281+zyj1112@users.noreply.github.com> Date: Wed, 11 Oct 2023 15:42:12 +0800 Subject: [PATCH 2269/3019] =?UTF-8?q?Update=200054.=E8=9E=BA=E6=97=8B?= =?UTF-8?q?=E7=9F=A9=E9=98=B5.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...72\346\227\213\347\237\251\351\230\265.md" | 54 +++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git "a/problems/0054.\350\236\272\346\227\213\347\237\251\351\230\265.md" "b/problems/0054.\350\236\272\346\227\213\347\237\251\351\230\265.md" index c62eb2b12c..59771a671f 100644 --- "a/problems/0054.\350\236\272\346\227\213\347\237\251\351\230\265.md" +++ "b/problems/0054.\350\236\272\346\227\213\347\237\251\351\230\265.md" @@ -251,6 +251,60 @@ var spiralOrder = function(matrix) { return arr }; ``` +### Python + +```python +class Solution(object): + def spiralOrder(self, matrix): + """ + :type matrix: List[List[int]] + :rtype: List[int] + """ + if len(matrix)==0 or len(matrix[0])==0 : # 判定List是否为空 + return [] + row, col = len(matrix), len(matrix[0]) # 行数,列数 + loop = min(row, col) // 2 # 循环轮数 + stx, sty = 0, 0 # 起始x,y坐标 + i, j =0, 0 + count = 0 # 计数 + offset = 1 # 每轮减少的格子数 + result = [0]*(row*col) + while loop>0 :# 左闭右开 + i, j = stx, sty + while j < col - offset : # 从左到右 + result[count] = matrix[i][j] + count += 1 + j += 1 + while i < row - offset : # 从上到下 + result[count] = matrix[i][j] + count += 1 + i += 1 + while j>sty : # 从右到左 + result[count] = matrix[i][j] + count += 1 + j -= 1 + while i>stx : # 从下到上 + result[count] = matrix[i][j] + count += 1 + i -= 1 + stx += 1 + sty += 1 + offset += 1 + loop -= 1 + if min(row, col) % 2 == 1 : # 判定是否需要填充多出来的一行 + i = stx + if row < col : + while i < stx + col - row + 1 : + result[count] = matrix[stx][i] + count += 1 + i += 1 + else : + while i < stx + row - col + 1 : + result[count] = matrix[i][stx] + count += 1 + i += 1 + return result +``` From 4a3e9c6bbea4acbb73c6decd2693ba0aec164a33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B5=B5=E4=BA=9A=E6=9D=B0?= <105789281+zyj1112@users.noreply.github.com> Date: Thu, 12 Oct 2023 11:11:25 +0800 Subject: [PATCH 2270/3019] =?UTF-8?q?Update=200054.=E8=9E=BA=E6=97=8B?= =?UTF-8?q?=E7=9F=A9=E9=98=B5.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0054.\350\236\272\346\227\213\347\237\251\351\230\265.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/problems/0054.\350\236\272\346\227\213\347\237\251\351\230\265.md" "b/problems/0054.\350\236\272\346\227\213\347\237\251\351\230\265.md" index 59771a671f..44a7749d3f 100644 --- "a/problems/0054.\350\236\272\346\227\213\347\237\251\351\230\265.md" +++ "b/problems/0054.\350\236\272\346\227\213\347\237\251\351\230\265.md" @@ -260,7 +260,7 @@ class Solution(object): :type matrix: List[List[int]] :rtype: List[int] """ - if len(matrix)==0 or len(matrix[0])==0 : # 判定List是否为空 + if len(matrix) == 0 or len(matrix[0]) == 0 : # 判定List是否为空 return [] row, col = len(matrix), len(matrix[0]) # 行数,列数 loop = min(row, col) // 2 # 循环轮数 @@ -268,7 +268,7 @@ class Solution(object): i, j =0, 0 count = 0 # 计数 offset = 1 # 每轮减少的格子数 - result = [0]*(row*col) + result = [0] * (row * col) while loop>0 :# 左闭右开 i, j = stx, sty while j < col - offset : # 从左到右 From 284143192c1c2e39bb77a19dfcbebf000270ed16 Mon Sep 17 00:00:00 2001 From: HUAWEI Date: Thu, 12 Oct 2023 17:52:17 +0800 Subject: [PATCH 2271/3019] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=94=99=E5=88=AB?= =?UTF-8?q?=E5=AD=97=E2=80=9C=E8=B7=AF=E5=BE=84=E2=80=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\217\257\350\203\275\347\232\204\350\267\257\345\276\204.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0797.\346\211\200\346\234\211\345\217\257\350\203\275\347\232\204\350\267\257\345\276\204.md" "b/problems/0797.\346\211\200\346\234\211\345\217\257\350\203\275\347\232\204\350\267\257\345\276\204.md" index bcce931476..05b55b5b16 100644 --- "a/problems/0797.\346\211\200\346\234\211\345\217\257\350\203\275\347\232\204\350\267\257\345\276\204.md" +++ "b/problems/0797.\346\211\200\346\234\211\345\217\257\350\203\275\347\232\204\350\267\257\345\276\204.md" @@ -89,7 +89,7 @@ if (x == graph.size() - 1) { // 找到符合条件的一条路径 for (int i = 0; i < graph[x].size(); i++) { // 遍历节点n链接的所有节点 ``` -接下来就是将 选中的x所连接的节点,加入到 单一路劲来。 +接下来就是将 选中的x所连接的节点,加入到 单一路径来。 ```C++ path.push_back(graph[x][i]); // 遍历到的节点加入到路径中来 From 77d6e986bb37cb4cd6bb5b9e3bc039f608191902 Mon Sep 17 00:00:00 2001 From: slaier Date: Sun, 15 Oct 2023 21:27:03 +0800 Subject: [PATCH 2272/3019] =?UTF-8?q?=E4=BC=98=E5=8C=960332=E9=87=8D?= =?UTF-8?q?=E6=96=B0=E5=AE=89=E6=8E=92=E8=A1=8C=E7=A8=8B=20C=20=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 遍历所有ticket查找机场为O(n), 修改为使用hash表查找. --- ...11\346\216\222\350\241\214\347\250\213.md" | 130 +++++++++++------- 1 file changed, 84 insertions(+), 46 deletions(-) diff --git "a/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" "b/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" index ab144f43ce..d1fd46f68a 100644 --- "a/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" +++ "b/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" @@ -652,62 +652,100 @@ function findItinerary(tickets: string[][]): string[] { ### C ```C -char **result; -bool *used; -int g_found; - -int cmp(const void *str1, const void *str2) -{ - const char **tmp1 = *(char**)str1; - const char **tmp2 = *(char**)str2; - int ret = strcmp(tmp1[0], tmp2[0]); - if (ret == 0) { - return strcmp(tmp1[1], tmp2[1]); +typedef struct { + char *name; /* key */ + int cnt; /* 记录到达机场是否飞过了 */ + UT_hash_handle hh; /* makes this structure hashable */ +} to_airport_t; + +typedef struct { + char *name; /* key */ + to_airport_t *to_airports; + UT_hash_handle hh; /* makes this structure hashable */ +} from_airport_t; + +void to_airport_destroy(to_airport_t *airports) { + to_airport_t *airport, *tmp; + HASH_ITER(hh, airports, airport, tmp) { + HASH_DEL(airports, airport); + free(airport); } - return ret; } -void backtracting(char *** tickets, int ticketsSize, int* returnSize, char *start, char **result, bool *used) -{ - if (*returnSize == ticketsSize + 1) { - g_found = 1; - return; +void from_airport_destroy(from_airport_t *airports) { + from_airport_t *airport, *tmp; + HASH_ITER(hh, airports, airport, tmp) { + to_airport_destroy(airport->to_airports); + HASH_DEL(airports, airport); + free(airport); + } +} + +int name_sort(to_airport_t *a, to_airport_t *b) { + return strcmp(a->name, b->name); +} + +bool backtracking(from_airport_t *airports, int target_path_len, char **path, + int path_len) { + if (path_len == target_path_len) return true; + + from_airport_t *from_airport = NULL; + HASH_FIND_STR(airports, path[path_len - 1], from_airport); + if (!from_airport) return false; + + for (to_airport_t *to_airport = from_airport->to_airports; + to_airport != NULL; to_airport = to_airport->hh.next) { + if (to_airport->cnt == 0) continue; + to_airport->cnt--; + path[path_len] = to_airport->name; + if (backtracking(airports, target_path_len, path, path_len + 1)) + return true; + to_airport->cnt++; } + return false; +} + +char **findItinerary(char ***tickets, int ticketsSize, int *ticketsColSize, + int *returnSize) { + from_airport_t *airports = NULL; + + // 记录映射关系 for (int i = 0; i < ticketsSize; i++) { - if ((used[i] == false) && (strcmp(start, tickets[i][0]) == 0)) { - result[*returnSize] = (char*)malloc(sizeof(char) * 4); - memcpy(result[*returnSize], tickets[i][1], sizeof(char) * 4); - (*returnSize)++; - used[i] = true; - /*if ((*returnSize) == ticketsSize + 1) { - return; - }*/ - backtracting(tickets, ticketsSize, returnSize, tickets[i][1], result, used); - if (g_found) { - return; - } - (*returnSize)--; - used[i] = false; + from_airport_t *from_airport = NULL; + to_airport_t *to_airport = NULL; + HASH_FIND_STR(airports, tickets[i][0], from_airport); + if (!from_airport) { + from_airport = malloc(sizeof(from_airport_t)); + from_airport->name = tickets[i][0]; + from_airport->to_airports = NULL; + HASH_ADD_KEYPTR(hh, airports, from_airport->name, + strlen(from_airport->name), from_airport); + } + HASH_FIND_STR(from_airport->to_airports, tickets[i][1], to_airport); + if (!to_airport) { + to_airport = malloc(sizeof(to_airport_t)); + to_airport->name = tickets[i][1]; + to_airport->cnt = 0; + HASH_ADD_KEYPTR(hh, from_airport->to_airports, to_airport->name, + strlen(to_airport->name), to_airport); } + to_airport->cnt++; } - return; -} -char ** findItinerary(char *** tickets, int ticketsSize, int* ticketsColSize, int* returnSize){ - if (tickets == NULL || ticketsSize <= 0) { - return NULL; + // 机场排序 + for (from_airport *from_airport = airports; from_airport != NULL; + from_airport = from_airport->hh.next) { + HASH_SRT(hh, from_airport->to_airports, name_sort); } - result = malloc(sizeof(char*) * (ticketsSize + 1)); - used = malloc(sizeof(bool) * ticketsSize); - memset(used, false, sizeof(bool) * ticketsSize); - result[0] = malloc(sizeof(char) * 4); - memcpy(result[0], "JFK", sizeof(char) * 4); - g_found = 0; - *returnSize = 1; - qsort(tickets, ticketsSize, sizeof(tickets[0]), cmp); - backtracting(tickets, ticketsSize, returnSize, "JFK", result, used); + + char **path = malloc(sizeof(char *) * (ticketsSize + 1)); + path[0] = "JFK"; // 起始机场 + backtracking(airports, ticketsSize + 1, path, 1); + + from_airport_destroy(airports); + *returnSize = ticketsSize + 1; - return result; + return path; } ``` From a78f67721ad16532e3e914ffe5fc13799a61a0b8 Mon Sep 17 00:00:00 2001 From: Logen <47022821+Logenleedev@users.noreply.github.com> Date: Tue, 17 Oct 2023 07:37:39 -0400 Subject: [PATCH 2273/3019] =?UTF-8?q?add=20python=20=E6=A8=A1=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...06\350\256\272\345\237\272\347\241\200.md" | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git "a/problems/\345\233\276\350\256\272\345\271\277\346\220\234\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\345\233\276\350\256\272\345\271\277\346\220\234\347\220\206\350\256\272\345\237\272\347\241\200.md" index 1174e239c1..b2181052cf 100644 --- "a/problems/\345\233\276\350\256\272\345\271\277\346\220\234\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\345\233\276\350\256\272\345\271\277\346\220\234\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -110,6 +110,38 @@ if (!visited[nextx][nexty] && grid[nextx][nexty] == '1') { // 如果节点没被 ``` 就可以通过 [200.岛屿数量](https://leetcode.cn/problems/number-of-islands/solution/by-carlsun-2-n72a/) 这道题目,大家可以去体验一下。 +## 其他语言版本 + +### Python +```python +from collections import deque + +dir = [(0, 1), (1, 0), (-1, 0), (0, -1)] # 创建方向元素 + +def bfs(grid, visited, x, y): + + queue = deque() # 初始化队列 + queue.append((x, y)) # 放入第一个元素/起点 + visited[x][y] = True # 标记为访问过的节点 + + while queue: # 遍历队列里的元素 + + curx, cury = queue.popleft() # 取出第一个元素 + + for dx, dy in dir: # 遍历四个方向 + + nextx, nexty = curx + dx, cury + dy + + if nextx < 0 or nextx >= len(grid) or nexty < 0 or nexty >= len(grid[0]): # 越界了,直接跳过 + continue + + if not visited[nextx][nexty]: # 如果节点没被访问过 + queue.append((nextx, nexty)) # 加入队列 + visited[nextx][nexty] = True # 标记为访问过的节点 + +``` + + ## 总结 当然广搜还有很多细节需要注意的地方,后面我会针对广搜的题目还做针对性的讲解,因为在理论篇讲太多细节,可能会让刚学广搜的录友们越看越懵,所以细节方面针对具体题目在做讲解。 From 82e12be81e34a19987e34163a99df1fa8f7c74ac Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Thu, 19 Oct 2023 10:52:34 +0800 Subject: [PATCH 2274/3019] Update --- README.md | 3 ++- .../0072.\347\274\226\350\276\221\350\267\235\347\246\273.md" | 1 + ...25\260\347\273\204\347\232\204\344\272\244\351\233\206.md" | 2 +- ...41\200\345\256\214\345\205\250\350\203\214\345\214\205.md" | 4 ++-- 4 files changed, 6 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index b43fa38cea..60890f228a 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ > 1. **介绍** :本项目是一套完整的刷题计划,旨在帮助大家少走弯路,循序渐进学算法,[关注作者](#关于作者) > 2. **正式出版** :[《代码随想录》](https://programmercarl.com/other/publish.html) 。 > 3. **PDF版本** :[「代码随想录」算法精讲 PDF 版本](https://programmercarl.com/other/algo_pdf.html) 。 -> 4. **算法公开课** :[《代码随想录》算法视频公开课](https://www.programmercarl.com/other/gongkaike.html) 。 +> 4. **算法公开课** :[《代码随想录》算法视频公开课](https://www.bilibili.com/video/BV1fA4y1o715) 。 > 5. **最强八股文** :[代码随想录知识星球精华PDF](https://www.programmercarl.com/other/kstar_baguwen.html) 。 > 6. **刷题顺序** :README已经将刷题顺序排好了,按照顺序一道一道刷就可以。 > 7. **学习社区** :一起学习打卡/面试技巧/如何选择offer/大厂内推/职场规则/简历修改/技术分享/程序人生。欢迎加入[「代码随想录」知识星球](https://programmercarl.com/other/kstar.html) 。 @@ -75,6 +75,7 @@ * 编程语言 * [C++面试&C++学习指南知识点整理](https://github.com/youngyangyang04/TechCPP) * [C++语言基础课](https://kamacoder.com/course.php?course_id=1) + * [Java语言基础课](https://kamacoder.com/course.php?course_id=2) * 项目 * [基于跳表的轻量级KV存储引擎](https://github.com/youngyangyang04/Skiplist-CPP) diff --git "a/problems/0072.\347\274\226\350\276\221\350\267\235\347\246\273.md" "b/problems/0072.\347\274\226\350\276\221\350\267\235\347\246\273.md" index 76553151e4..777b851cca 100644 --- "a/problems/0072.\347\274\226\350\276\221\350\267\235\347\246\273.md" +++ "b/problems/0072.\347\274\226\350\276\221\350\267\235\347\246\273.md" @@ -41,6 +41,7 @@ exection -> execution (插入 'u') * word1 和 word2 由小写英文字母组成 ## 算法公开课 + **[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[动态规划终极绝杀! LeetCode:72.编辑距离](https://www.bilibili.com/video/BV1qv4y1q78f/),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 ## 思路 diff --git "a/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" "b/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" index 138067e360..d3a1e12f54 100644 --- "a/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" +++ "b/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" @@ -74,7 +74,7 @@ public: }; ``` -* 时间复杂度: O(mn) +* 时间复杂度: O(n + m) m 是最后要把 set转成vector * 空间复杂度: O(n) ## 拓展 diff --git "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" index a173c6ddf9..c6c856978a 100644 --- "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" +++ "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" @@ -7,7 +7,7 @@ # 动态规划:完全背包理论基础 -本题力扣上没有原题,大家可以去[卡码网第52题](https://kamacoder.com/problem.php?id=1046)去练习,题意是一样的。 +本题力扣上没有原题,大家可以去[卡码网第52题](https://kamacoder.com/problem.php?id=1052)去练习,题意是一样的。 ## 算法公开课 @@ -164,7 +164,7 @@ int main() { ``` -本题力扣上没有原题,大家可以去[卡码网第46题](https://kamacoder.com/problem.php?id=1046)去练习,题意是一样的,C++代码如下: +本题力扣上没有原题,大家可以去[卡码网第52题](https://kamacoder.com/problem.php?id=1052)去练习,题意是一样的,C++代码如下: ```cpp #include From a14785b0f42e2b8f67224c699044471a132e761b Mon Sep 17 00:00:00 2001 From: caveman <948238104@qq.com> Date: Thu, 19 Oct 2023 14:39:30 +0800 Subject: [PATCH 2275/3019] =?UTF-8?q?=E6=A0=88=E4=B8=8E=E9=98=9F=E5=88=97?= =?UTF-8?q?=E6=80=BB=E7=BB=93-=E9=94=99=E5=88=AB=E5=AD=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...351\230\237\345\210\227\346\200\273\347\273\223.md" | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git "a/problems/\346\240\210\344\270\216\351\230\237\345\210\227\346\200\273\347\273\223.md" "b/problems/\346\240\210\344\270\216\351\230\237\345\210\227\346\200\273\347\273\223.md" index e7f8ef86c6..4e08a887ee 100644 --- "a/problems/\346\240\210\344\270\216\351\230\237\345\210\227\346\200\273\347\273\223.md" +++ "b/problems/\346\240\210\344\270\216\351\230\237\345\210\227\346\200\273\347\273\223.md" @@ -25,8 +25,8 @@ 这个问题有两个陷阱: -* 陷阱1:栈是容器适配器,底层容器使用不同的容器,导致栈内数据在内存中是不是连续分布。 -* 陷阱2:缺省情况下,默认底层容器是deque,那么deque的在内存中的数据分布是什么样的呢? 答案是:不连续的,下文也会提到deque。 +* 陷阱1:栈是容器适配器,底层容器使用不同的容器,导致栈内数据在内存中不一定是连续分布的。 +* 陷阱2:缺省情况下,默认底层容器是deque,那么deque在内存中的数据分布是什么样的呢? 答案是:不连续的,下文也会提到deque。 所以这就是考察候选者基础知识扎不扎实的好问题。 @@ -42,7 +42,7 @@ ### 栈在系统中的应用 -如果还记得编译原理的话,编译器在 词法分析的过程中处理括号、花括号等这个符号的逻辑,就是使用了栈这种数据结构。 +如果还记得编译原理的话,编译器在词法分析的过程中处理括号、花括号等这个符号的逻辑,就是使用了栈这种数据结构。 再举个例子,linux系统中,cd这个进入目录的命令我们应该再熟悉不过了。 @@ -70,8 +70,8 @@ cd a/b/c/../../ 先来分析一下 这里有三种不匹配的情况, -1. 第一种情况,字符串里左方向的括号多余了 ,所以不匹配。 -2. 第二种情况,括号没有多余,但是 括号的类型没有匹配上。 +1. 第一种情况,字符串里左方向的括号多余了,所以不匹配。 +2. 第二种情况,括号没有多余,但是括号的类型没有匹配上。 3. 第三种情况,字符串里右方向的括号多余了,所以不匹配。 这里还有一些技巧,在匹配左括号的时候,右括号先入栈,就只需要比较当前元素和栈顶相不相等就可以了,比左括号先入栈代码实现要简单的多了! From 0cc023d180315f9abd9f4116afd3a71d0486e7cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E5=91=98Carl?= Date: Fri, 20 Oct 2023 09:41:12 +0800 Subject: [PATCH 2276/3019] =?UTF-8?q?Update=20=E5=9B=BE=E8=AE=BA=E5=B9=BF?= =?UTF-8?q?=E6=90=9C=E7=90=86=E8=AE=BA=E5=9F=BA=E7=A1=80.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...06\350\256\272\345\237\272\347\241\200.md" | 28 ++++++++++--------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git "a/problems/\345\233\276\350\256\272\345\271\277\346\220\234\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\345\233\276\350\256\272\345\271\277\346\220\234\347\220\206\350\256\272\345\237\272\347\241\200.md" index b2181052cf..b631f4f5c5 100644 --- "a/problems/\345\233\276\350\256\272\345\271\277\346\220\234\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\345\233\276\350\256\272\345\271\277\346\220\234\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -110,6 +110,21 @@ if (!visited[nextx][nexty] && grid[nextx][nexty] == '1') { // 如果节点没被 ``` 就可以通过 [200.岛屿数量](https://leetcode.cn/problems/number-of-islands/solution/by-carlsun-2-n72a/) 这道题目,大家可以去体验一下。 + + + +## 总结 + +当然广搜还有很多细节需要注意的地方,后面我会针对广搜的题目还做针对性的讲解,因为在理论篇讲太多细节,可能会让刚学广搜的录友们越看越懵,所以细节方面针对具体题目在做讲解。 + +本篇我们重点讲解了广搜的使用场景,广搜的过程以及广搜的代码框架。 + +其实在二叉树章节的[层序遍历](https://programmercarl.com/0102.%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E5%B1%82%E5%BA%8F%E9%81%8D%E5%8E%86.html)中,我们也讲过一次广搜,相当于是广搜在二叉树这种数据结构上的应用。 + +这次则从图论的角度上再详细讲解一次广度优先遍历。 + +相信看完本篇,大家会对广搜有一个基础性的认识,后面再来做对应的题目就会得心应手一些。 + ## 其他语言版本 ### Python @@ -142,19 +157,6 @@ def bfs(grid, visited, x, y): ``` -## 总结 - -当然广搜还有很多细节需要注意的地方,后面我会针对广搜的题目还做针对性的讲解,因为在理论篇讲太多细节,可能会让刚学广搜的录友们越看越懵,所以细节方面针对具体题目在做讲解。 - -本篇我们重点讲解了广搜的使用场景,广搜的过程以及广搜的代码框架。 - -其实在二叉树章节的[层序遍历](https://programmercarl.com/0102.%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E5%B1%82%E5%BA%8F%E9%81%8D%E5%8E%86.html)中,我们也讲过一次广搜,相当于是广搜在二叉树这种数据结构上的应用。 - -这次则从图论的角度上再详细讲解一次广度优先遍历。 - -相信看完本篇,大家会对广搜有一个基础性的认识,后面再来做对应的题目就会得心应手一些。 - -

From 194a827f8e4a2778084dafcd4e32e58a15e11712 Mon Sep 17 00:00:00 2001 From: mask <1429855087@qq.com> Date: Sun, 22 Oct 2023 11:47:42 +0800 Subject: [PATCH 2277/3019] =?UTF-8?q?Update=201971.=E5=AF=BB=E6=89=BE?= =?UTF-8?q?=E5=9B=BE=E4=B8=AD=E6=98=AF=E5=90=A6=E5=AD=98=E5=9C=A8=E8=B7=AF?= =?UTF-8?q?=E5=BE=84.md=20=E5=A2=9E=E5=8A=A0Java=E8=AF=AD=E8=A8=80?= =?UTF-8?q?=E7=89=88=E6=9C=AC=E9=A2=98=E8=A7=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...30\345\234\250\350\267\257\345\276\204.md" | 58 ++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git "a/problems/1971.\345\257\273\346\211\276\345\233\276\344\270\255\346\230\257\345\220\246\345\255\230\345\234\250\350\267\257\345\276\204.md" "b/problems/1971.\345\257\273\346\211\276\345\233\276\344\270\255\346\230\257\345\220\246\345\255\230\345\234\250\350\267\257\345\276\204.md" index 5660233cf6..27ee9147a8 100644 --- "a/problems/1971.\345\257\273\346\211\276\345\233\276\344\270\255\346\230\257\345\220\246\345\255\230\345\234\250\350\267\257\345\276\204.md" +++ "b/problems/1971.\345\257\273\346\211\276\345\233\276\344\270\255\346\230\257\345\220\246\345\255\230\345\234\250\350\267\257\345\276\204.md" @@ -135,7 +135,64 @@ public: }; ``` +## 其他语言版本 + +### Java: + +```java +class Solution { + + int[] father; + public boolean validPath(int n, int[][] edges, int source, int destination) { + father = new int[n]; + init(); + for (int i = 0; i < edges.length; i++) { + join(edges[i][0], edges[i][1]); + } + + return isSame(source, destination); + } + + // 并查集初始化 + public void init() { + for (int i = 0; i < father.length; i++) { + father[i] = i; + } + } + + // 并查集里寻根的过程 + public int find(int u) { + if (u == father[u]) { + return u; + } else { + father[u] = find(father[u]); + return father[u]; + } + } + + // 判断 u 和 v是否找到同一个根 + public boolean isSame(int u, int v) { + u = find(u); + v = find(v); + return u == v; + } + + // 将v->u 这条边加入并查集 + public void join(int u, int v) { + u = find(u); // 寻找u的根 + v = find(v); // 寻找v的根 + if (u == v) return; // 如果发现根相同,则说明在一个集合,不用两个节点相连直接返回 + + father[v] = u; + } + +} +``` + +### Python: + PYTHON并查集解法如下: + ```PYTHON class Solution: def validPath(self, n: int, edges: List[List[int]], source: int, destination: int) -> bool: @@ -154,4 +211,3 @@ class Solution: - From 097051e1bbd06e3302f832c8e0d9179cc54d6c02 Mon Sep 17 00:00:00 2001 From: dxiaofeng <106021460+dxiaofeng@users.noreply.github.com> Date: Tue, 24 Oct 2023 10:52:23 +0800 Subject: [PATCH 2278/3019] =?UTF-8?q?=E4=BF=AE=E6=AD=A30347.=E5=89=8DK?= =?UTF-8?q?=E4=B8=AA=E9=AB=98=E9=A2=91=E5=85=83=E7=B4=A0Java=E7=AE=80?= =?UTF-8?q?=E6=98=93=E7=89=88=E4=BB=A3=E7=A0=81=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git "a/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" "b/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" index b3063111b4..4830f9a3f2 100644 --- "a/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" +++ "b/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" @@ -193,7 +193,7 @@ class Solution { class Solution { public int[] topKFrequent(int[] nums, int k) { // 优先级队列,为了避免复杂 api 操作,pq 存储数组 - // lambda 表达式设置优先级队列从大到小存储 o1 - o2 为从大到小,o2 - o1 反之 + // lambda 表达式设置优先级队列从大到小存储 o1 - o2 为从小到大,o2 - o1 反之 PriorityQueue pq = new PriorityQueue<>((o1, o2) -> o1[1] - o2[1]); int[] res = new int[k]; // 答案数组为 k 个元素 Map map = new HashMap<>(); // 记录元素出现次数 @@ -204,6 +204,7 @@ class Solution { tmp[0] = x.getKey(); tmp[1] = x.getValue(); pq.offer(tmp); + // 下面的代码是根据小根堆实现的,我只保留优先队列的最后的k个,只要超出了k我就将最小的弹出,剩余的k个就是答案 if(pq.size() > k) { pq.poll(); } From 770c138a9aeb1340ec0721fefc8686d9aedb9f8c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E9=91=AB?= <2507932331@qq.com> Date: Tue, 24 Oct 2023 17:06:10 +0800 Subject: [PATCH 2279/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20111=EF=BC=9A?= =?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=A0=91=E7=9A=84=E6=9C=80=E5=B0=8F=E6=B7=B1?= =?UTF-8?q?=E5=BA=A6=20Java=E9=A2=98=E8=A7=A3=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...00\345\260\217\346\267\261\345\272\246.md" | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git "a/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" "b/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" index 8b9d92e612..c4e55a0740 100644 --- "a/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" +++ "b/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" @@ -268,6 +268,34 @@ class Solution { } ``` +```java +class Solution { + /** + * 递归法(思路来自二叉树最大深度的递归法) + * 该题求最小深度,最小深度为根节点到叶子节点的深度,所以在迭代到每个叶子节点时更新最小值。 + */ + int depth = 0; + // 定义最小深度,初始化最大值 + int minDepth = Integer.MAX_VALUE; + public int minDepth(TreeNode root) { + dep(root); + return minDepth == Integer.MAX_VALUE ? 0 : minDepth; + } + void dep(TreeNode root){ + if(root == null) return ; + // 递归开始,深度增加 + depth++; + dep(root.left); + dep(root.right); + // 该位置表示递归到叶子节点了,需要更新最小深度minDepth + if(root.left == null && root.right == null) + minDepth = Math.min(minDepth , depth); + // 递归结束,深度减小 + depth--; + } +} +``` + ```Java class Solution { /** From c4da16fd1abd3d3609eaa2f4cddf5d69dcaf320f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BB=BB=E7=BB=8D=E8=BE=B0?= Date: Tue, 24 Oct 2023 20:20:38 -0400 Subject: [PATCH 2280/3019] =?UTF-8?q?Problem=200827=20=E6=9C=80=E5=A4=A7?= =?UTF-8?q?=E4=BA=BA=E5=B7=A5=E5=B2=9B=E5=B1=BF=EF=BC=8C=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?python=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...47\344\272\272\345\267\245\345\262\233.md" | 62 +++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git "a/problems/0827.\346\234\200\345\244\247\344\272\272\345\267\245\345\262\233.md" "b/problems/0827.\346\234\200\345\244\247\344\272\272\345\267\245\345\262\233.md" index d78798253a..7206bf09e8 100644 --- "a/problems/0827.\346\234\200\345\244\247\344\272\272\345\267\245\345\262\233.md" +++ "b/problems/0827.\346\234\200\345\244\247\344\272\272\345\267\245\345\262\233.md" @@ -282,6 +282,68 @@ class Solution { } ``` +### Python + +```Python +class Solution(object): + # 可能的移动方向 + DIRECTIONS = [(1, 0), (-1, 0), (0, 1), (0, -1)] + + def exploreIsland(self, row, col, grid, visited, island_id): + """ + 从给定的单元格开始,使用深度优先搜索探索岛屿。 + """ + if (row < 0 or row >= len(grid) or col < 0 or col >= len(grid[0]) or + visited[row][col] or grid[row][col] == 0): + return 0 + + visited[row][col] = True + grid[row][col] = island_id + island_size = 1 + for dr, dc in self.DIRECTIONS: + island_size += self.exploreIsland(row + dr, col + dc, grid, visited, island_id) + return island_size + + def largestIsland(self, grid): + """ + 通过最多将一个0更改为1,找到可以形成的最大岛屿的大小。 + """ + rows, cols = len(grid), len(grid[0]) + island_sizes = {} + island_id = 2 # 从2开始标记岛屿(因为0代表水,1代表未被发现的陆地) + is_all_land = True + visited = [[False] * cols for _ in range(rows)] + + # 标记每个岛屿并存储其大小 + for r in range(rows): + for c in range(cols): + if grid[r][c] == 0: + is_all_land = False + elif not visited[r][c] and grid[r][c] == 1: + island_size = self.exploreIsland(r, c, grid, visited, island_id) + island_sizes[island_id] = island_size + island_id += 1 + + # 如果整个网格是陆地,则返回其大小 + if is_all_land: + return rows * cols + + # 计算可以通过将一个0更改为1来形成的最大岛屿 + max_island_size = 0 + for r in range(rows): + for c in range(cols): + if grid[r][c] == 0: + adjacent_islands = set() + for dr, dc in self.DIRECTIONS: + nr, nc = r + dr, c + dc + if 0 <= nr < rows and 0 <= nc < cols and grid[nr][nc] > 1: + adjacent_islands.add(grid[nr][nc]) + new_island_size = sum(island_sizes[island] for island in adjacent_islands) + 1 + max_island_size = max(max_island_size, new_island_size) + + return max_island_size +``` +

From 28d50d34c69714bbd11453451fc3fb7dedaad369 Mon Sep 17 00:00:00 2001 From: huawuque404 Date: Thu, 26 Oct 2023 19:15:25 +0800 Subject: [PATCH 2281/3019] Error changing Java code --- ...225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" "b/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" index dbd053d141..28bb61eea4 100644 --- "a/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" +++ "b/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" @@ -110,7 +110,7 @@ public ListNode removeNthFromEnd(ListNode head, int n){ fastIndex = fastIndex.next; } - while (fastIndex.next != null){ + while (fastIndex != null){ fastIndex = fastIndex.next; slowIndex = slowIndex.next; } From 54144f3a6b59bb8be22111a489d60edc49eeffa9 Mon Sep 17 00:00:00 2001 From: Relsola Date: Fri, 27 Oct 2023 19:49:03 +0800 Subject: [PATCH 2282/3019] =?UTF-8?q?Update=2098.=E9=AA=8C=E8=AF=81?= =?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=90=9C=E7=B4=A2=E6=A0=91.md=20=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0js=E5=92=8Cts=E8=BF=AD=E4=BB=A3=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...11\346\220\234\347\264\242\346\240\221.md" | 61 +++++++++++++++++++ 1 file changed, 61 insertions(+) diff --git "a/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" index 0a64266e2f..184060a5cd 100644 --- "a/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" +++ "b/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" @@ -595,6 +595,43 @@ var isValidBST = 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 {boolean} + */ +let pre = null; +var isValidBST = function (root) { + const queue = []; + let cur = root; + let pre = null; + while (cur !== null || queue.length !== 0) { + if (cur !== null) { + queue.push(cur); + cur = cur.left; + } else { + cur = queue.pop(); + if (pre !== null && cur.val <= pre.val) { + return false; + } + pre = cur; + cur = cur.right; + } + } + return true; +}; +``` + ### TypeScript > 辅助数组解决: @@ -637,6 +674,30 @@ function isValidBST(root: TreeNode | null): boolean { }; ``` +> 迭代法: + +```TypeScript +function isValidBST(root: TreeNode | null): boolean { + const queue: TreeNode[] = []; + let cur: TreeNode | null = root; + let pre: TreeNode | null = null; + while (cur !== null || queue.length !== 0) { + if (cur !== null) { + queue.push(cur); + cur = cur.left; + } else { + cur = queue.pop()!; + if (pre !== null && cur!.val <= pre.val) { + return false; + } + pre = cur; + cur = cur!.right; + } + } + return true; +} +``` + ### Scala 辅助数组解决: From 1f9f95c0b285f3953f77e1111c37e01e1683e2f8 Mon Sep 17 00:00:00 2001 From: yunfeidog <1844025705@qq.com> Date: Sat, 28 Oct 2023 17:56:52 +0800 Subject: [PATCH 2283/3019] =?UTF-8?q?Update0239=E6=BB=91=E5=8A=A8=E7=AA=97?= =?UTF-8?q?=E5=8F=A3=E6=9C=80=E5=A4=A7=E5=80=BC=EF=BC=9A=E5=AD=98=E5=9C=A8?= =?UTF-8?q?=E5=8D=95=E8=B0=83=E9=98=9F=E5=88=97=E5=B9=B6=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?C++=E5=8D=95=E8=B0=83=E9=98=9F=E5=88=97=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...43\346\234\200\345\244\247\345\200\274.md" | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git "a/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" "b/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" index 6f420479eb..dbd036eefc 100644 --- "a/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" +++ "b/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" @@ -65,6 +65,10 @@ public: 这么个队列香不香,要是有现成的这种数据结构是不是更香了! **可惜了,没有! 我们需要自己实现这么个队列。** +> 其实有这种数据结构的,在C++中,可以使用可以使用multiset这种数据结构作为单调队列 +> + 多重集合(`multiset`) 用以有序地存储元素的容器。允许存在相等的元素。 +> +> 在遍历原数组的时候,只需要把窗口的头元素加入到multiset中,然后把窗口的尾元素删除即可。因为multiset是有序的,并且提供了*rbegin(),可以直接获取窗口最大值。 然后再分析一下,队列里的元素一定是要排序的,而且要最大值放在出队口,要不然怎么知道最大值呢。 @@ -839,6 +843,24 @@ impl Solution { } ``` +### C++ +使用multiset作为单调队列 +```cpp +class Solution { +public: + vector maxSlidingWindow(vector& nums, int k) { + multiset st; + vector ans; + for (int i = 0; i < nums.size(); i++) { + if (i >= k) st.erase(st.find(nums[i - k])); + st.insert(nums[i]); + if (i >= k - 1) ans.push_back(*st.rbegin()); + } + return ans; + } +}; +``` +

From 1eb14f9fe287c4bacbdf788841b58e1819c3c0db Mon Sep 17 00:00:00 2001 From: xin Date: Sat, 28 Oct 2023 18:29:48 +0800 Subject: [PATCH 2284/3019] =?UTF-8?q?add:=201035.=E4=B8=8D=E7=9B=B8?= =?UTF-8?q?=E4=BA=A4=E7=BA=BF=E6=96=B0=E5=A2=9Etypescript=E6=BB=9A?= =?UTF-8?q?=E5=8A=A8=E6=95=B0=E7=BB=84=E5=86=99=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...70\344\272\244\347\232\204\347\272\277.md" | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git "a/problems/1035.\344\270\215\347\233\270\344\272\244\347\232\204\347\272\277.md" "b/problems/1035.\344\270\215\347\233\270\344\272\244\347\232\204\347\272\277.md" index ff9e5dc4e3..cccc7f8c59 100644 --- "a/problems/1035.\344\270\215\347\233\270\344\272\244\347\232\204\347\272\277.md" +++ "b/problems/1035.\344\270\215\347\233\270\344\272\244\347\232\204\347\272\277.md" @@ -221,6 +221,8 @@ const maxUncrossedLines = (nums1, nums2) => { ### TypeScript: +> 二维数组 + ```typescript function maxUncrossedLines(nums1: number[], nums2: number[]): number { /** @@ -243,6 +245,33 @@ function maxUncrossedLines(nums1: number[], nums2: number[]): number { }; ``` +> 滚动数组 +```typescript +function maxUncrossedLines(nums1: number[], nums2: number[]): number { + const len1 = nums1.length + const len2 = nums2.length + + const dp: number[] = new Array(len2 + 1).fill(0) + + for (let i = 1; i <= len1; i++) { + let prev: number = 0; + let temp: number = 0; + for (let j = 1; j <= len2; j++) { + // 保存当前状态未计算前的值 + temp = dp[j] + // 使用没有累加的值进行累加 + if (nums1[i - 1] === nums2[j - 1]) dp[j] = prev + 1 + // dp[j] 表示之前的 dp[i][j-1],dp[j-1] 表示 dp[i-1][j] + else dp[j] = Math.max(dp[j], dp[j - 1]) + // 下一个元素使用前一个状态未计算的值 + prev = temp + } + } + return dp[len2] +} +``` + +

From 22ac5d47548c0f6d8d1dcc2f0649c5bb297862c5 Mon Sep 17 00:00:00 2001 From: xin Date: Sat, 28 Oct 2023 18:31:15 +0800 Subject: [PATCH 2285/3019] =?UTF-8?q?fix:=200053.=E6=9C=80=E5=A4=A7?= =?UTF-8?q?=E5=AD=90=E5=BA=8F=E5=92=8C=E5=8E=9Ftypescript=E8=BF=87?= =?UTF-8?q?=E4=B8=8D=E4=BA=86leetcode=EF=BC=8C=E6=9B=B4=E6=96=B0=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...01\350\247\204\345\210\222\357\274\211.md" | 24 ++++++++++--------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git "a/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" "b/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" index f1b6470985..70ad7a8482 100644 --- "a/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" +++ "b/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" @@ -226,18 +226,20 @@ object Solution { ```typescript function maxSubArray(nums: number[]): number { - /** - dp[i]:以nums[i]结尾的最大和 - */ - const dp: number[] = [] - dp[0] = nums[0]; - let resMax: number = 0; - for (let i = 1; i < nums.length; i++) { - dp[i] = Math.max(dp[i - 1] + nums[i], nums[i]); - resMax = Math.max(resMax, dp[i]); + const len = nums.length + if (len === 1) return nums[0] + + const dp: number[] = new Array(len) + let resMax: number = dp[0] = nums[0] + + for (let i = 1; i < len; i++) { + dp[i] = Math.max(dp[i - 1] + nums[i], nums[i]) + // 注意值为负数的情况 + if (dp[i] > resMax) resMax = dp[i] } - return resMax; -}; + + return resMax +} ``` From ddaba36a1257d04feea3d695f9dd072e3911ced2 Mon Sep 17 00:00:00 2001 From: xin <59196051+xin0907@users.noreply.github.com> Date: Sun, 29 Oct 2023 11:35:39 +0800 Subject: [PATCH 2286/3019] =?UTF-8?q?Update=201035.=E4=B8=8D=E7=9B=B8?= =?UTF-8?q?=E4=BA=A4=E7=9A=84=E7=BA=BF.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 更新 1035.不相交的线 typescript 代码注释 --- ...215\347\233\270\344\272\244\347\232\204\347\272\277.md" | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git "a/problems/1035.\344\270\215\347\233\270\344\272\244\347\232\204\347\272\277.md" "b/problems/1035.\344\270\215\347\233\270\344\272\244\347\232\204\347\272\277.md" index cccc7f8c59..e0625a2ba3 100644 --- "a/problems/1035.\344\270\215\347\233\270\344\272\244\347\232\204\347\272\277.md" +++ "b/problems/1035.\344\270\215\347\233\270\344\272\244\347\232\204\347\272\277.md" @@ -257,13 +257,14 @@ function maxUncrossedLines(nums1: number[], nums2: number[]): number { let prev: number = 0; let temp: number = 0; for (let j = 1; j <= len2; j++) { - // 保存当前状态未计算前的值 + // 备份一下当前状态(经过上层迭代后的) temp = dp[j] - // 使用没有累加的值进行累加 + // prev 相当于 dp[j-1](累加了上层的状态) + // 如果单纯 dp[j-1] 则不会包含上层状态 if (nums1[i - 1] === nums2[j - 1]) dp[j] = prev + 1 // dp[j] 表示之前的 dp[i][j-1],dp[j-1] 表示 dp[i-1][j] else dp[j] = Math.max(dp[j], dp[j - 1]) - // 下一个元素使用前一个状态未计算的值 + // 继续使用上一层状态更新参数用于当前层下一个状态 prev = temp } } From ef1c72a36b6fcc11ad2e45ac48f12630f24e6cc9 Mon Sep 17 00:00:00 2001 From: xin Date: Sun, 29 Oct 2023 17:40:58 +0800 Subject: [PATCH 2287/3019] =?UTF-8?q?update:=20=E4=BC=98=E5=8C=96=200392.?= =?UTF-8?q?=E5=88=A4=E6=96=AD=E5=AD=90=E5=BA=8F=E5=88=97=20typescript=20?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...55\345\255\220\345\272\217\345\210\227.md" | 20 +++++++++---------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git "a/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" "b/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" index f7863c9499..8d1a020869 100644 --- "a/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" @@ -221,21 +221,19 @@ function isSubsequence(s: string, t: string): boolean { /** dp[i][j]: s的前i-1个,t的前j-1个,最长公共子序列的长度 */ - const sLen: number = s.length, - tLen: number = t.length; - const dp: number[][] = new Array(sLen + 1).fill(0) - .map(_ => new Array(tLen + 1).fill(0)); + const sLen = s.length + const tLen = t.length + const dp: number[][] = new Array(sLen + 1).fill(0).map(_ => new Array(tLen + 1).fill(0)) + for (let i = 1; i <= sLen; i++) { for (let j = 1; j <= tLen; j++) { - if (s[i - 1] === t[j - 1]) { - dp[i][j] = dp[i - 1][j - 1] + 1; - } else { - dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]); - } + if (s[i - 1] === t[j - 1]) dp[i][j] = dp[i - 1][j - 1] + 1 + // 只需要取 j-2 的 dp 值即可,不用考虑 i-2 + else dp[i][j] = dp[i][j - 1] } } - return dp[sLen][tLen] === s.length; -}; + return dp[sLen][tLen] === s.length +} ``` ### Go: From 74417c7695011c3c49d702f17cde22dfbce7aef3 Mon Sep 17 00:00:00 2001 From: xin Date: Sun, 29 Oct 2023 17:43:18 +0800 Subject: [PATCH 2288/3019] =?UTF-8?q?add:=200392.=E5=88=A4=E6=96=AD?= =?UTF-8?q?=E5=AD=90=E5=BA=8F=E5=88=97=20typescript=20=E6=96=B0=E5=A2=9E?= =?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 --- ...55\345\255\220\345\272\217\345\210\227.md" | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git "a/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" "b/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" index 8d1a020869..ebd567cbb7 100644 --- "a/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" @@ -216,6 +216,8 @@ const isSubsequence = (s, t) => { ### TypeScript: +> 二维数组 + ```typescript function isSubsequence(s: string, t: string): boolean { /** @@ -236,6 +238,31 @@ function isSubsequence(s: string, t: string): boolean { } ``` +> 滚动数组 +```typescript +function isSubsequence(s: string, t: string): boolean { + const sLen = s.length + const tLen = t.length + const dp: number[] = new Array(tLen + 1).fill(0) + + for (let i = 1; i <= sLen; i++) { + let prev: number = 0; + let temp: number = 0; + for (let j = 1; j <= tLen; j++) { + // 备份一下当前状态(经过上层迭代后的) + temp = dp[j] + // prev 相当于 dp[j-1](累加了上层的状态) + // 如果单纯 dp[j-1] 则不会包含上层状态 + if (s[i - 1] === t[j - 1]) dp[j] = prev + 1 + else dp[j] = dp[j - 1] + // 继续使用上一层状态更新参数用于当前层下一个状态 + prev = temp + } + } + return dp[tLen] === sLen +} +``` + ### Go: 二维DP: From 0c2948f0e6e5311ff04b8e1759019770b3cbbae3 Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Mon, 30 Oct 2023 11:29:04 +0800 Subject: [PATCH 2289/3019] Update --- ...13\346\260\264\346\265\201\351\227\256\351\242\230.md" | 8 ++++---- ...34\347\220\206\350\256\272\345\237\272\347\241\200.md" | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git "a/problems/0417.\345\244\252\345\271\263\346\264\213\345\244\247\350\245\277\346\264\213\346\260\264\346\265\201\351\227\256\351\242\230.md" "b/problems/0417.\345\244\252\345\271\263\346\264\213\345\244\247\350\245\277\346\264\213\346\260\264\346\265\201\351\227\256\351\242\230.md" index 35f3b4d6e3..6777e2d974 100644 --- "a/problems/0417.\345\244\252\345\271\263\346\264\213\345\244\247\350\245\277\346\264\213\346\260\264\346\265\201\351\227\256\351\242\230.md" +++ "b/problems/0417.\345\244\252\345\271\263\346\264\213\345\244\247\350\245\277\346\264\213\346\260\264\346\265\201\351\227\256\351\242\230.md" @@ -180,14 +180,14 @@ public: // 从最上最下行的节点出发,向高处遍历 for (int i = 0; i < n; i++) { - dfs (heights, pacific, i, 0); // 遍历最上行,接触太平洋 - dfs (heights, atlantic, i, m - 1); // 遍历最下行,接触大西洋 + dfs (heights, pacific, i, 0); // 遍历最左列,接触太平洋 + dfs (heights, atlantic, i, m - 1); // 遍历最右列,接触大西 } // 从最左最右列的节点出发,向高处遍历 for (int j = 0; j < m; j++) { - dfs (heights, pacific, 0, j); // 遍历最左列,接触太平洋 - dfs (heights, atlantic, n - 1, j); // 遍历最右列,接触大西洋 + dfs (heights, pacific, 0, j); // 遍历最上行,接触太平洋 + dfs (heights, atlantic, n - 1, j); // 遍历最下行,接触大西洋 } for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { diff --git "a/problems/\345\233\276\350\256\272\346\267\261\346\220\234\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\345\233\276\350\256\272\346\267\261\346\220\234\347\220\206\350\256\272\345\237\272\347\241\200.md" index af4073f077..7f847f8fae 100644 --- "a/problems/\345\233\276\350\256\272\346\267\261\346\220\234\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\345\233\276\350\256\272\346\267\261\346\220\234\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -142,7 +142,7 @@ void dfs(参数) 通常我们递归的时候,我们递归搜索需要了解哪些参数,其实也可以在写递归函数的时候,发现需要什么参数,再去补充就可以。 -一般情况,深搜需要 二维数组数组结构保存所有路径,需要一维数组保存单一路径,这种保存结果的数组,我们可以定义一个全局遍历,避免让我们的函数参数过多。 +一般情况,深搜需要 二维数组数组结构保存所有路径,需要一维数组保存单一路径,这种保存结果的数组,我们可以定义一个全局变量,避免让我们的函数参数过多。 例如这样: From c35a886d35eef5870ba2ab862b6c2da99e98bc31 Mon Sep 17 00:00:00 2001 From: Xiong Gu Date: Mon, 30 Oct 2023 21:09:36 -0400 Subject: [PATCH 2290/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A00827.=E6=9C=80?= =?UTF-8?q?=E5=A4=A7=E4=BA=BA=E5=B7=A5=E5=B2=9BPython3=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...47\344\272\272\345\267\245\345\262\233.md" | 65 +++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git "a/problems/0827.\346\234\200\345\244\247\344\272\272\345\267\245\345\262\233.md" "b/problems/0827.\346\234\200\345\244\247\344\272\272\345\267\245\345\262\233.md" index d78798253a..71b90a7810 100644 --- "a/problems/0827.\346\234\200\345\244\247\344\272\272\345\267\245\345\262\233.md" +++ "b/problems/0827.\346\234\200\345\244\247\344\272\272\345\267\245\345\262\233.md" @@ -282,6 +282,71 @@ class Solution { } ``` +### Python + +```python + +class Solution: + def largestIsland(self, grid: List[List[int]]) -> int: + visited = set() #标记访问过的位置 + m, n = len(grid), len(grid[0]) + res = 0 + island_size = 0 #用于保存当前岛屿的尺寸 + directions = [[0, 1], [0, -1], [1, 0], [-1, 0]] #四个方向 + islands_size = defaultdict(int) #保存每个岛屿的尺寸 + + def dfs(island_num, r, c): + visited.add((r, c)) + grid[r][c] = island_num #访问过的位置标记为岛屿编号 + nonlocal island_size + island_size += 1 + for i in range(4): + nextR = r + directions[i][0] + nextC = c + directions[i][1] + if (nextR not in range(m) or #行坐标越界 + nextC not in range(n) or #列坐标越界 + (nextR, nextC) in visited): #坐标已访问 + continue + if grid[nextR][nextC] == 1: #遇到有效坐标,进入下一个层搜索 + dfs(island_num, nextR, nextC) + + island_num = 2 #初始岛屿编号设为2, 因为grid里的数据有0和1, 所以从2开始编号 + all_land = True #标记是否整个地图都是陆地 + for r in range(m): + for c in range(n): + if grid[r][c] == 0: + all_land = False #地图里不全是陆地 + if (r, c) not in visited and grid[r][c] == 1: + island_size = 0 #遍历每个位置前重置岛屿尺寸为0 + dfs(island_num, r, c) + islands_size[island_num] = island_size #保存当前岛屿尺寸 + island_num += 1 #下一个岛屿编号加一 + if all_land: + return m * n #如果全是陆地, 返回地图面积 + + count = 0 #某个位置0变成1后当前岛屿尺寸 + #因为后续计算岛屿面积要往四个方向遍历,但某2个或3个方向的位置可能同属于一个岛, + #所以为避免重复累加,把已经访问过的岛屿编号加入到这个集合 + visited_island = set() #保存访问过的岛屿 + for r in range(m): + for c in range(n): + if grid[r][c] == 0: + count = 1 #把由0转换为1的位置计算到面积里 + visited_island.clear() #遍历每个位置前清空集合 + for i in range(4): + nearR = r + directions[i][0] + nearC = c + directions[i][1] + if nearR not in range(m) or nearC not in range(n): #周围位置越界 + continue + if grid[nearR][nearC] in visited_island: #岛屿已访问 + continue + count += islands_size[grid[nearR][nearC]] #累加连在一起的岛屿面积 + visited_island.add(grid[nearR][nearC]) #标记当前岛屿已访问 + res = max(res, count) + return res + +``` +

From 99b8b5744ef3aadb97da6ea9049ed2c1f53dbdc5 Mon Sep 17 00:00:00 2001 From: "Farmer.Chillax" <48387781+FarmerChillax@users.noreply.github.com> Date: Tue, 31 Oct 2023 23:02:44 +0800 Subject: [PATCH 2291/3019] =?UTF-8?q?Update=200242.=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=8D.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...15\345\274\202\344\275\215\350\257\215.md" | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git "a/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" "b/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" index f47d8b05b6..6eed90a73a 100644 --- "a/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" +++ "b/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" @@ -181,6 +181,31 @@ func isAnagram(s string, t string) bool { } ``` +Go 写法二(只对字符串遍历一次) +```go +func isAnagram(s string, t string) bool { + if len(s) != len(t) { + return false + } + records := [26]int{} + for index := 0; index < len(s); index++ { + if s[index] == t[index] { + continue + } + sCharIndex := s[index] - 'a' + records[sCharIndex]++ + tCharIndex := t[index] - 'a' + records[tCharIndex]-- + } + for _, record := range records { + if record != 0 { + return false + } + } + return true +} +``` + ### JavaScript: ```js From 6323296d76b6807e0794f233a93dda9e786ec0fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E5=91=98Carl?= Date: Sat, 4 Nov 2023 16:27:32 +0800 Subject: [PATCH 2292/3019] =?UTF-8?q?Update=200239.=E6=BB=91=E5=8A=A8?= =?UTF-8?q?=E7=AA=97=E5=8F=A3=E6=9C=80=E5=A4=A7=E5=80=BC.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...5\217\243\346\234\200\345\244\247\345\200\274.md" | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git "a/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" "b/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" index dbd036eefc..19ac12619e 100644 --- "a/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" +++ "b/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" @@ -62,13 +62,9 @@ public: 每次窗口移动的时候,调用que.pop(滑动窗口中移除元素的数值),que.push(滑动窗口添加元素的数值),然后que.front()就返回我们要的最大值。 -这么个队列香不香,要是有现成的这种数据结构是不是更香了! +这么个队列香不香,要是有现成的这种数据结构是不是更香了! -**可惜了,没有! 我们需要自己实现这么个队列。** -> 其实有这种数据结构的,在C++中,可以使用可以使用multiset这种数据结构作为单调队列 -> + 多重集合(`multiset`) 用以有序地存储元素的容器。允许存在相等的元素。 -> -> 在遍历原数组的时候,只需要把窗口的头元素加入到multiset中,然后把窗口的尾元素删除即可。因为multiset是有序的,并且提供了*rbegin(),可以直接获取窗口最大值。 +其实在C++中,可以使用 multiset 来模拟这个过程,文末提供这个解法仅针对C++,以下讲解我们还是靠自己来实现这个单调队列。 然后再分析一下,队列里的元素一定是要排序的,而且要最大值放在出队口,要不然怎么知道最大值呢。 @@ -845,6 +841,10 @@ impl Solution { ### C++ 使用multiset作为单调队列 + +多重集合(`multiset`) 用以有序地存储元素的容器。允许存在相等的元素。 + +在遍历原数组的时候,只需要把窗口的头元素加入到multiset中,然后把窗口的尾元素删除即可。因为multiset是有序的,并且提供了*rbegin(),可以直接获取窗口最大值。 ```cpp class Solution { public: From 559434172cacdda8f1cb324bd161eab21bf58bfe Mon Sep 17 00:00:00 2001 From: eeee0717 <70054568+eeee0717@users.noreply.github.com> Date: Mon, 6 Nov 2023 10:10:36 +0800 Subject: [PATCH 2293/3019] =?UTF-8?q?Update=20028.=E5=AE=9E=E7=8E=B0strStr?= =?UTF-8?q?=EF=BC=8C=E6=B7=BB=E5=8A=A0C#=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0028.\345\256\236\347\216\260strStr.md" | 66 +++++++++++++++++++ 1 file changed, 66 insertions(+) diff --git "a/problems/0028.\345\256\236\347\216\260strStr.md" "b/problems/0028.\345\256\236\347\216\260strStr.md" index 629ff014dd..bf4ad600c3 100644 --- "a/problems/0028.\345\256\236\347\216\260strStr.md" +++ "b/problems/0028.\345\256\236\347\216\260strStr.md" @@ -1358,6 +1358,72 @@ impl Solution { } ``` +>前缀表统一不减一 +```C# +public int StrStr(string haystack, string needle) +{ + if (string.IsNullOrEmpty(needle)) + return 0; + + if (needle.Length > haystack.Length || string.IsNullOrEmpty(haystack)) + return -1; + + return KMP(haystack, needle); +} + +public int KMP(string haystack, string needle) +{ + int[] next = GetNext(needle); + int i = 0, j = 0; + while (i < haystack.Length) + { + if (haystack[i] == needle[j]) + { + i++; + j++; + } + if (j == needle.Length) + return i-j; + else if (i < haystack.Length && haystack[i] != needle[j]) + if (j != 0) + { + j = next[j - 1]; + } + else + { + i++; + } + } + return -1; +} + +public int[] GetNext(string needle) +{ + int[] next = new int[needle.Length]; + next[0] = 0; + int i = 1, j = 0; + while (i < needle.Length) + { + if (needle[i] == needle[j]) + { + next[i++] = ++j; + } + else + { + if (j == 0) + { + next[i++] = 0; + } + else + { + j = next[j - 1]; + } + } + } + return next; +} +``` +

From 6316fff080e11124c6d56d45f931207cb0bfd9d4 Mon Sep 17 00:00:00 2001 From: eeee0717 <70054568+eeee0717@users.noreply.github.com> Date: Tue, 7 Nov 2023 09:13:15 +0800 Subject: [PATCH 2294/3019] =?UTF-8?q?Update=20707.=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E9=93=BE=E8=A1=A8=EF=BC=8C=E6=B7=BB=E5=8A=A0C#=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...76\350\256\241\351\223\276\350\241\250.md" | 71 +++++++++++++++++++ 1 file changed, 71 insertions(+) diff --git "a/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" "b/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" index c27f0107fb..a08227d9fc 100644 --- "a/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" +++ "b/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" @@ -1485,6 +1485,77 @@ impl MyLinkedList { } ``` +### C# +```C# +class ListNode +{ + public int val; + public ListNode next; + public ListNode(int val) { this.val = val; } +} +public class MyLinkedList +{ + ListNode dummyHead; + int count; + + public MyLinkedList() + { + dummyHead = new ListNode(0); + count = 0; + } + + public int Get(int index) + { + if (index < 0 || count <= index) return -1; + ListNode current = dummyHead; + for (int i = 0; i <= index; i++) + { + current = current.next; + } + return current.val; + } + + public void AddAtHead(int val) + { + AddAtIndex(0, val); + } + + public void AddAtTail(int val) + { + AddAtIndex(count, val); + } + + public void AddAtIndex(int index, int val) + { + if (index > count) return; + index = Math.Max(0, index); + count++; + ListNode tmp1 = dummyHead; + for (int i = 0; i < index; i++) + { + tmp1 = tmp1.next; + } + ListNode tmp2 = new ListNode(val); + tmp2.next = tmp1.next; + tmp1.next = tmp2; + } + + public void DeleteAtIndex(int index) + { + + if (index >= count || index < 0) return; + var tmp1 = dummyHead; + for (int i = 0; i < index; i++) + { + tmp1 = tmp1.next; + } + tmp1.next = tmp1.next.next; + count--; + + } +} +``` +

From 87a6e78e8106d769576ddc48770deb245f830fd0 Mon Sep 17 00:00:00 2001 From: eeee0717 <70054568+eeee0717@users.noreply.github.com> Date: Tue, 7 Nov 2023 09:15:40 +0800 Subject: [PATCH 2295/3019] =?UTF-8?q?Update=200024.=E4=BA=A4=E6=8D=A2?= =?UTF-8?q?=E9=93=BE=E8=A1=A8=E8=8A=82=E7=82=B9=EF=BC=8C=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?C#=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...55\347\232\204\350\212\202\347\202\271.md" | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git "a/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" "b/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" index 36f9b0cc9a..57034f4795 100644 --- "a/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" +++ "b/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" @@ -459,6 +459,40 @@ impl Solution { } ``` +### C# +```C# +// 虚拟头结点 +public ListNode SwapPairs(ListNode head) +{ + var dummyHead = new ListNode(); + dummyHead.next = head; + ListNode cur = dummyHead; + while (cur.next != null && cur.next.next != null) + { + ListNode tmp1 = cur.next; + ListNode tmp2 = cur.next.next.next; + + cur.next = cur.next.next; + cur.next.next = tmp1; + cur.next.next.next = tmp2; + + cur = cur.next.next; + } + return dummyHead.next; +} +``` +``` C# +// 递归 +public ListNode SwapPairs(ListNode head) +{ + if (head == null || head.next == null) return head; + var cur = head.next; + head.next = SwapPairs(head.next.next); + cur.next = head; + return cur; +} +``` +

From 451c045a6e293bd038815400de660d3d6d091873 Mon Sep 17 00:00:00 2001 From: eeee0717 <70054568+eeee0717@users.noreply.github.com> Date: Tue, 7 Nov 2023 09:17:40 +0800 Subject: [PATCH 2296/3019] =?UTF-8?q?Update=20=E9=9D=A2=E8=AF=95=E9=A2=980?= =?UTF-8?q?2.07=E9=93=BE=E8=A1=A8=E7=9B=B8=E4=BA=A4=EF=BC=8C=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0C#=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...223\276\350\241\250\347\233\270\344\272\244.md" | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git "a/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" "b/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" index 5de9da5c06..adeaa413aa 100644 --- "a/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" +++ "b/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" @@ -502,6 +502,20 @@ object Solution { } } ``` +### C# +```C# +public ListNode GetIntersectionNode(ListNode headA, ListNode headB) +{ + if (headA == null || headB == null) return null; + ListNode cur1 = headA, cur2 = headB; + while (cur1 != cur2) + { + cur1 = cur1 == null ? headB : cur1.next; + cur2 = cur2 == null ? headA : cur2.next; + } + return cur1; +} +```

From 4500cbd9bd1d603c99482fdccbfe1deff7417c15 Mon Sep 17 00:00:00 2001 From: eeee0717 <70054568+eeee0717@users.noreply.github.com> Date: Tue, 7 Nov 2023 09:20:04 +0800 Subject: [PATCH 2297/3019] =?UTF-8?q?Update=200151.=E7=BF=BB=E8=BD=AC?= =?UTF-8?q?=E5=AD=97=E7=AC=A6=E4=B8=B2=E9=87=8C=E7=9A=84=E5=8D=95=E8=AF=8D?= =?UTF-8?q?=EF=BC=8C=E6=B7=BB=E5=8A=A0C#=20LINQ=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...262\351\207\214\347\232\204\345\215\225\350\257\215.md" | 7 +++++++ 1 file changed, 7 insertions(+) diff --git "a/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" "b/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" index 111c07e4f5..d15bb5f321 100644 --- "a/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" +++ "b/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" @@ -972,6 +972,13 @@ char * reverseWords(char * s){ } ``` +### C# +```C# LINQ高级方法 +public string ReverseWords(string s) { + return string.Join(' ', s.Trim().Split(' ',StringSplitOptions.RemoveEmptyEntries).Reverse()); +} +``` +

From 69cc985a7c45fb41a901c26b2868d481f8b3e206 Mon Sep 17 00:00:00 2001 From: eeee0717 <70054568+eeee0717@users.noreply.github.com> Date: Tue, 7 Nov 2023 09:40:37 +0800 Subject: [PATCH 2298/3019] =?UTF-8?q?Update=200459.=E9=87=8D=E5=A4=8D?= =?UTF-8?q?=E7=9A=84=E5=AD=90=E5=AD=97=E7=AC=A6=E4=B8=B2=EF=BC=8C=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0C#=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...20\345\255\227\347\254\246\344\270\262.md" | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git "a/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" "b/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" index 177c3878ba..3245d94897 100644 --- "a/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" @@ -681,6 +681,32 @@ impl Solution { } } ``` +### C# +```C# +// 前缀表不减一 +public bool RepeatedSubstringPattern(string s) +{ + if (s.Length == 0) + return false; + int[] next = GetNext(s); + int len = s.Length; + if (next[len - 1] != 0 && len % (len - next[len - 1]) == 0) return true; + return false; +} +public int[] GetNext(string s) +{ + int[] next = Enumerable.Repeat(0, s.Length).ToArray(); + for (int i = 1, j = 0; i < s.Length; i++) + { + while (j > 0 && s[i] != s[j]) + j = next[j - 1]; + if (s[i] == s[j]) + j++; + next[i] = j; + } + return next; +} +```

From 4134c34c52d8ae16c9c60cd9778e1f98c6ed5a0b Mon Sep 17 00:00:00 2001 From: fwqaaq Date: Wed, 8 Nov 2023 21:07:35 +0800 Subject: [PATCH 2299/3019] =?UTF-8?q?Update=200704.=E4=BA=8C=E5=88=86?= =?UTF-8?q?=E6=9F=A5=E6=89=BE.md=20about=20Rust?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...14\345\210\206\346\237\245\346\211\276.md" | 42 +++++++++---------- 1 file changed, 19 insertions(+), 23 deletions(-) diff --git "a/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" "b/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" index ba5e538c74..46f529db52 100644 --- "a/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" +++ "b/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" @@ -481,41 +481,37 @@ func search(nums: [Int], target: Int) -> Int { ### **Rust:** -```rust -# (版本一)左闭右闭区间 +(版本一)左闭右开区间 +```rust impl Solution { pub fn search(nums: Vec, target: i32) -> i32 { - let mut left:usize = 0; - let mut right:usize = nums.len() - 1; - while left as i32 <= right as i32{ - let mid = (left + right) / 2; - if nums[mid] < target { - left = mid + 1; - } else if nums[mid] > target { - right = mid - 1; - } else { - return mid as i32; + let (mut left, mut right) = (0, nums.len()); + while left < right { + let mid = (right + left) / 2; + match nums[mid].cmp(&target) { + Ordering::Less => left = mid + 1, + Ordering::Greater => right = mid, + Ordering::Equal => return mid as i32, } } -1 } } +``` -# (版本二)左闭右开区间 +//(版本二)左闭右闭区间 +```rust impl Solution { pub fn search(nums: Vec, target: i32) -> i32 { - let mut left:usize = 0; - let mut right:usize = nums.len(); - while left < right { - let mid = (left + right) / 2; - if nums[mid] < target { - left = mid + 1; - } else if nums[mid] > target { - right = mid; - } else { - return mid as i32; + let (mut left, mut right) = (0, nums.len()); + while left <= right { + let mid = (right + left) / 2; + match nums[mid].cmp(&target) { + Ordering::Less => left = mid + 1, + Ordering::Greater => right = mid - 1, + Ordering::Equal => return mid as i32, } } -1 From 040f94472bbdd2212131661a85f4083fd6bc10be Mon Sep 17 00:00:00 2001 From: fwqaaq Date: Wed, 8 Nov 2023 21:09:36 +0800 Subject: [PATCH 2300/3019] Apply suggestions from code review --- .../0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" | 2 ++ 1 file changed, 2 insertions(+) diff --git "a/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" "b/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" index 46f529db52..590ec1b139 100644 --- "a/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" +++ "b/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" @@ -484,6 +484,7 @@ func search(nums: [Int], target: Int) -> Int { (版本一)左闭右开区间 ```rust +use std::cmp::Ordering; impl Solution { pub fn search(nums: Vec, target: i32) -> i32 { let (mut left, mut right) = (0, nums.len()); @@ -503,6 +504,7 @@ impl Solution { //(版本二)左闭右闭区间 ```rust +use std::cmp::Ordering; impl Solution { pub fn search(nums: Vec, target: i32) -> i32 { let (mut left, mut right) = (0, nums.len()); From 2caee6fe9ff27270346e2d27032b0cae3f59eba5 Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Thu, 9 Nov 2023 14:32:56 +0800 Subject: [PATCH 2301/3019] Update --- README.md | 6 +- ...0.\347\210\254\346\245\274\346\242\257.md" | 7 +- ...14\345\214\205\347\211\210\346\234\254.md" | 171 ++---- ...77\346\215\242\346\225\260\345\255\227.md" | 176 +++++++ ...13\345\255\227\347\254\246\344\270\262.md" | 181 +++++++ ...46\347\235\200\345\233\236\346\272\257.md" | 2 +- ...77\346\215\242\347\251\272\346\240\274.md" | 493 ++---------------- ...54\345\255\227\347\254\246\344\270\262.md" | 435 ++++------------ ...47\241\20001\350\203\214\345\214\205-1.md" | 2 +- ...47\241\20001\350\203\214\345\214\205-2.md" | 2 +- ...32\351\207\215\350\203\214\345\214\205.md" | 399 ++------------ ...14\345\205\250\350\203\214\345\214\205.md" | 2 +- 12 files changed, 614 insertions(+), 1262 deletions(-) create mode 100644 "problems/kama54.\346\233\277\346\215\242\346\225\260\345\255\227.md" create mode 100644 "problems/kama55.\345\217\263\346\227\213\345\255\227\347\254\246\344\270\262.md" diff --git a/README.md b/README.md index 60890f228a..c1296ed3db 100644 --- a/README.md +++ b/README.md @@ -152,9 +152,9 @@ 1. [字符串:344.反转字符串](./problems/0344.反转字符串.md) 2. [字符串:541.反转字符串II](./problems/0541.反转字符串II.md) -3. [字符串:替换空格](./problems/剑指Offer05.替换空格.md) +3. [字符串:替换数字](./problems/kama54.替换数字.md) 4. [字符串:151.翻转字符串里的单词](./problems/0151.翻转字符串里的单词.md) -5. [字符串:左旋转字符串](./problems/剑指Offer58-II.左旋转字符串.md) +5. [字符串:右旋字符串](./problems/kama55.右旋字符串.md) 6. [帮你把KMP算法学个通透](./problems/0028.实现strStr.md) 8. [字符串:459.重复的子字符串](./problems/0459.重复的子字符串.md) 9. [字符串:总结篇!](./problems/字符串总结.md) @@ -165,7 +165,7 @@ 1. [数组:27.移除元素](./problems/0027.移除元素.md) 2. [字符串:344.反转字符串](./problems/0344.反转字符串.md) -3. [字符串:替换空格](./problems/剑指Offer05.替换空格.md) +3. [字符串:替换数字](./problems/kama54.替换数字.md) 4. [字符串:151.翻转字符串里的单词](./problems/0151.翻转字符串里的单词.md) 5. [链表:206.翻转链表](./problems/0206.翻转链表.md) 6. [链表:19.删除链表的倒数第 N 个结点](./problems/0019.删除链表的倒数第N个节点.md) diff --git "a/problems/0070.\347\210\254\346\245\274\346\242\257.md" "b/problems/0070.\347\210\254\346\245\274\346\242\257.md" index 1a1f7e31b5..7a59221dc6 100644 --- "a/problems/0070.\347\210\254\346\245\274\346\242\257.md" +++ "b/problems/0070.\347\210\254\346\245\274\346\242\257.md" @@ -165,9 +165,12 @@ public: 这道题目还可以继续深化,就是一步一个台阶,两个台阶,三个台阶,直到 m个台阶,有多少种方法爬到n阶楼顶。 -这又有难度了,这其实是一个完全背包问题,但力扣上没有这种题目,所以后续我在讲解背包问题的时候,今天这道题还会从背包问题的角度上来再讲一遍。 如果想提前看一下,可以看这篇:[70.爬楼梯完全背包版本](https://programmercarl.com/0070.%E7%88%AC%E6%A5%BC%E6%A2%AF%E5%AE%8C%E5%85%A8%E8%83%8C%E5%8C%85%E7%89%88%E6%9C%AC.html) +这又有难度了,这其实是一个完全背包问题,但力扣上没有这种题目,大家可以去卡码网去做一下 [57. 爬楼梯](https://kamacoder.com/problempage.php?pid=1067) -这里我先给出我的实现代码: + +所以后续我在讲解背包问题的时候,今天这道题还会从背包问题的角度上来再讲一遍。 如果想提前看一下,可以看这篇:[70.爬楼梯完全背包版本](https://programmercarl.com/0070.%E7%88%AC%E6%A5%BC%E6%A2%AF%E5%AE%8C%E5%85%A8%E8%83%8C%E5%8C%85%E7%89%88%E6%9C%AC.html) + +这里我先给出本题的代码: ```CPP class Solution { diff --git "a/problems/0070.\347\210\254\346\245\274\346\242\257\345\256\214\345\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md" "b/problems/0070.\347\210\254\346\245\274\346\242\257\345\256\214\345\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md" index 4ca7a3710b..0da1ebeca5 100644 --- "a/problems/0070.\347\210\254\346\245\274\346\242\257\345\256\214\345\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md" +++ "b/problems/0070.\347\210\254\346\245\274\346\242\257\345\256\214\345\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md" @@ -4,30 +4,34 @@

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

-# 70. 爬楼梯 +# 70. 爬楼梯(进阶版) -[力扣题目链接](https://leetcode.cn/problems/climbing-stairs/) +[卡码网:57. 爬楼梯](https://kamacoder.com/problempage.php?pid=1067) -假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 +假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 -每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? +每次你可以爬至多m (1 <= m < n)个台阶。你有多少种不同的方法可以爬到楼顶呢? -注意:给定 n 是一个正整数。 +注意:给定 n 是一个正整数。 -示例 1: -输入: 2 -输出: 2 -解释: 有两种方法可以爬到楼顶。 -1. 1 阶 + 1 阶 -2. 2 阶 +输入描述:输入共一行,包含两个正整数,分别表示n, m + +输出描述:输出一个整数,表示爬到楼顶的方法数。 + +输入示例:3 2 + +输出示例:3 + +提示: + +当 m = 2,n = 3 时,n = 3 这表示一共有三个台阶,m = 2 代表你每次可以爬一个台阶或者两个台阶。 + +此时你有三种方法可以爬到楼顶。 + +* 1 阶 + 1 阶 + 1 阶段 +* 1 阶 + 2 阶 +* 2 阶 + 1 阶 -示例 2: -输入: 3 -输出: 3 -解释: 有三种方法可以爬到楼顶。 -1. 1 阶 + 1 阶 + 1 阶 -2. 1 阶 + 2 阶 -3. 2 阶 + 1 阶 ## 思路 @@ -35,11 +39,13 @@ **这次终于讲到了背包问题,我选择带录友们再爬一次楼梯!** -这道题目 我们在[动态规划:爬楼梯](https://programmercarl.com/0070.爬楼梯.html) 中已经讲过一次了,原题其实是一道简单动规的题目。 +这道题目 我们在[动态规划:爬楼梯](https://programmercarl.com/0070.爬楼梯.html) 中已经讲过一次了,这次我又给本题加点料,力扣上没有原题,所以可以在卡码网[57. 爬楼梯](https://kamacoder.com/problempage.php?pid=1067)上来刷这道题目。 -既然这么简单为什么还要讲呢,其实本题稍加改动就是一道面试好题。 +我们之前做的 爬楼梯 是只能至多爬两个台阶。 -**改为:一步一个台阶,两个台阶,三个台阶,.......,直到 m个台阶。问有多少种不同的方法可以爬到楼顶呢?** +这次**改为:一步一个台阶,两个台阶,三个台阶,.......,直到 m个台阶。问有多少种不同的方法可以爬到楼顶呢?** + +这又有难度了,这其实是一个完全背包问题。 1阶,2阶,.... m阶就是物品,楼顶就是背包。 @@ -86,27 +92,31 @@ 以上分析完毕,C++代码如下: ```CPP -class Solution { -public: - int climbStairs(int n) { +#include +#include +using namespace std; +int main() { + int n, m; + while (cin >> n >> m) { vector dp(n + 1, 0); dp[0] = 1; - for (int i = 1; i <= n; i++) { // 遍历背包 - for (int j = 1; j <= m; j++) { // 遍历物品 + for (int i = 1; i <= n; i++) { // 遍历物品 + for (int j = 1; j <= m; j++) { // 遍历背包 if (i - j >= 0) dp[i] += dp[i - j]; } } - return dp[n]; + cout << dp[n] << endl; } -}; +} ``` -* 时间复杂度: O(nm) +* 时间复杂度: O(n * m) * 空间复杂度: O(n) +代码中m表示最多可以爬m个台阶,代码中把m改成2就是 力扣:70.爬楼梯的解题思路。 +**当然注意 力扣是 核心代码模式,卡码网是ACM模式** -代码中m表示最多可以爬m个台阶,代码中把m改成2就是本题70.爬楼梯可以AC的代码了。 ## 总结 @@ -129,123 +139,22 @@ public: ### Java: -```java -class Solution { - public int climbStairs(int n) { - int[] dp = new int[n + 1]; - int m = 2; //有兩個物品:itme1重量爲一,item2重量爲二 - dp[0] = 1; - - for (int i = 1; i <= n; i++) { // 遍历背包 - for (int j = 1; j <= m; j++) { //遍历物品 - if (i >= j) //當前的背包容量 大於 物品重量的時候,我們才需要記錄當前的這個裝得方法(方法數+) - dp[i] += dp[i - j]; - } - } - - return dp[n]; - } -} -``` ### Python3: -```python -class Solution: - def climbStairs(self, n: int) -> int: - dp = [0]*(n + 1) - dp[0] = 1 - m = 2 - # 遍历背包 - for j in range(n + 1): - # 遍历物品 - for step in range(1, m + 1): - if j >= step: - dp[j] += dp[j - step] - return dp[n] -``` ### Go: -```go -func climbStairs(n int) int { - //定义 - dp := make([]int, n+1) - //初始化 - dp[0] = 1 - // 本题物品只有两个1,2 - m := 2 - // 遍历顺序 - for j := 1; j <= n; j++ { //先遍历背包 - for i := 1; i <= m; i++ { //再遍历物品 - if j >= i { - dp[j] += dp[j-i] - } - //fmt.Println(dp) - } - } - return dp[n] -} -``` ### JavaScript: -```javascript -var climbStairs = function(n) { - const dp = new Array(n + 1).fill(0); - const m = 2; - dp[0] = 1; - for(let i = 1; i <= n; i++){ - for(let j = 1; j <= m; j++){ - if(i >= j) { - dp[i] += dp[i - j]; - } - } - } - return dp[n]; -}; -``` ### TypeScript: -```typescript -function climbStairs(n: number): number { - const m: number = 2; // 本题m为2 - const dp: number[] = new Array(n + 1).fill(0); - dp[0] = 1; - // 遍历背包 - for (let i = 1; i <= n; i++) { - // 遍历物品 - for (let j = 1; j <= m; j++) { - if (j <= i) { - dp[i] += dp[i - j]; - } - } - } - return dp[n]; -}; -``` ### Rust: -```rust -impl Solution { - pub fn climb_stairs(n: i32) -> i32 { - let (n, m) = (n as usize, 2); - let mut dp = vec![0; n + 1]; - dp[0] = 1; - for i in 1..=n { - for j in 1..=m { - if i >= j { - dp[i] += dp[i - j]; - } - } - } - dp[n] - } -} -```

diff --git "a/problems/kama54.\346\233\277\346\215\242\346\225\260\345\255\227.md" "b/problems/kama54.\346\233\277\346\215\242\346\225\260\345\255\227.md" new file mode 100644 index 0000000000..80c87951aa --- /dev/null +++ "b/problems/kama54.\346\233\277\346\215\242\346\225\260\345\255\227.md" @@ -0,0 +1,176 @@ + +

+ + + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+ + +# 替换数字 + +[卡码网题目链接](https://kamacoder.com/problempage.php?pid=1064) + +给定一个字符串 s,它包含小写字母和数字字符,请编写一个函数,将字符串中的字母字符保持不变,而将每个数字字符替换为number。 + +例如,对于输入字符串 "a1b2c3",函数应该将其转换为 "anumberbnumbercnumber"。 + +对于输入字符串 "a5b",函数应该将其转换为 "anumberb" + +输入:一个字符串 s,s 仅包含小写字母和数字字符。 + +输出:打印一个新的字符串,其中每个数字字符都被替换为了number + +样例输入:a1b2c3 + +样例输出:anumberbnumbercnumber + +数据范围:1 <= s.length < 10000。 + +## 思路 + +如果想把这道题目做到极致,就不要只用额外的辅助空间了! (不过使用Java刷题的录友,一定要使用辅助空间,因为Java里的string不能修改) + +首先扩充数组到每个数字字符替换成 "number" 之后的大小。 + +例如 字符串 "a5b" 的长度为3,那么 将 数字字符变成字符串 "number" 之后的字符串为 "anumberb" 长度为 8。 + +如图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20231030165201.png) + +然后从后向前替换数字字符,也就是双指针法,过程如下:i指向新长度的末尾,j指向旧长度的末尾。 + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20231030173058.png) + +有同学问了,为什么要从后向前填充,从前向后填充不行么? + +从前向后填充就是O(n^2)的算法了,因为每次添加元素都要将添加元素之后的所有元素整体向后移动。 + +**其实很多数组填充类的问题,其做饭都是先预先给数组扩容带填充后的大小,然后在从后向前进行操作。** + +这么做有两个好处: + +1. 不用申请新数组。 +2. 从后向前填充元素,避免了从前向后填充元素时,每次添加元素都要将添加元素之后的所有元素向后移动的问题。 + +C++代码如下: + +```CPP +#include +using namespace std; +int main() { + string s; + while (cin >> s) { + int count = 0; // 统计数字的个数 + int sOldSize = s.size(); + for (int i = 0; i < s.size(); i++) { + if (s[i] >= '0' && s[i] <= '9') { + count++; + } + } + // 扩充字符串s的大小,也就是每个空格替换成"number"之后的大小 + s.resize(s.size() + count * 5); + int sNewSize = s.size(); + // 从后先前将空格替换为"number" + for (int i = sNewSize - 1, j = sOldSize - 1; j < i; i--, j--) { + if (s[j] > '9' || s[j] < '0') { + s[i] = s[j]; + } else { + s[i] = 'r'; + s[i - 1] = 'e'; + s[i - 2] = 'b'; + s[i - 3] = 'm'; + s[i - 4] = 'u'; + s[i - 5] = 'n'; + i -= 5; + } + } + cout << s << endl; + } +} + + +``` + +* 时间复杂度:O(n) +* 空间复杂度:O(1) + +此时算上本题,我们已经做了七道双指针相关的题目了分别是: + +* [27.移除元素](https://programmercarl.com/0027.移除元素.html) +* [15.三数之和](https://programmercarl.com/0015.三数之和.html) +* [18.四数之和](https://programmercarl.com/0018.四数之和.html) +* [206.翻转链表](https://programmercarl.com/0206.翻转链表.html) +* [142.环形链表II](https://programmercarl.com/0142.环形链表II.html) +* [344.反转字符串](https://programmercarl.com/0344.反转字符串.html) + +## 拓展 + +这里也给大家拓展一下字符串和数组有什么差别, + +字符串是若干字符组成的有限序列,也可以理解为是一个字符数组,但是很多语言对字符串做了特殊的规定,接下来我来说一说C/C++中的字符串。 + +在C语言中,把一个字符串存入一个数组时,也把结束符 '\0'存入数组,并以此作为该字符串是否结束的标志。 + +例如这段代码: + +``` +char a[5] = "asd"; +for (int i = 0; a[i] != '\0'; i++) { +} +``` + +在C++中,提供一个string类,string类会提供 size接口,可以用来判断string类字符串是否结束,就不用'\0'来判断是否结束。 + +例如这段代码: + +``` +string a = "asd"; +for (int i = 0; i < a.size(); i++) { +} +``` + +那么vector< char > 和 string 又有什么区别呢? + +其实在基本操作上没有区别,但是 string提供更多的字符串处理的相关接口,例如string 重载了+,而vector却没有。 + +所以想处理字符串,我们还是会定义一个string类型。 + + +## 其他语言版本 + +### C: + +### Java: + + +### Go: + + + +### python: + +### JavaScript: + + +### TypeScript: + + +### Swift: + + +### Scala: + + +### PHP: + + +### Rust: + + + +

+ + + + diff --git "a/problems/kama55.\345\217\263\346\227\213\345\255\227\347\254\246\344\270\262.md" "b/problems/kama55.\345\217\263\346\227\213\345\255\227\347\254\246\344\270\262.md" new file mode 100644 index 0000000000..afd29d7376 --- /dev/null +++ "b/problems/kama55.\345\217\263\346\227\213\345\255\227\347\254\246\344\270\262.md" @@ -0,0 +1,181 @@ + +

+ + + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+ + +# 右旋字符串 + +[卡码网题目链接](https://kamacoder.com/problempage.php?pid=1065) + +字符串的右旋转操作是把字符串尾部的若干个字符转移到字符串的前面。给定一个字符串 s 和一个正整数 k,请编写一个函数,将字符串中的后面 k 个字符移到字符串的前面,实现字符串的右旋转操作。 + +例如,对于输入字符串 "abcdefg" 和整数 2,函数应该将其转换为 "fgabcde"。 + +输入:输入共包含两行,第一行为一个正整数 k,代表右旋转的位数。第二行为字符串 s,代表需要旋转的字符串。 + +输出:输出共一行,为进行了右旋转操作后的字符串。 + +样例输入: + +``` +2 +abcdefg +``` + +样例输出: + +``` +fgabcde +``` + +数据范围:1 <= k < 10000, 1 <= s.length < 10000; + + +## 思路 + +为了让本题更有意义,提升一下本题难度:**不能申请额外空间,只能在本串上操作**。 (Java不能在字符串上修改,所以使用java一定要开辟新空间) + +不能使用额外空间的话,模拟在本串操作要实现右旋转字符串的功能还是有点困难的。 + +那么我们可以想一下上一题目[字符串:花式反转还不够!](https://programmercarl.com/0151.翻转字符串里的单词.html)中讲过,使用整体反转+局部反转就可以实现反转单词顺序的目的。 + + +本题中,我们需要将字符串右移n位,字符串相当于分成了两个部分,如果n为2,符串相当于分成了两个部分,如图: (length为字符串长度) + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20231106170143.png) + + +右移n位, 就是将第二段放在前面,第一段放在后面,先不考虑里面字符的顺序,是不是整体倒叙不就行了。如图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20231106171557.png) + +此时第一段和第二段的顺序是我们想要的,但里面的字符位置被我们倒叙,那么此时我们在把 第一段和第二段里面的字符再倒叙一把,这样字符顺序不就正确了。 如果: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20231106172058.png) + +其实,思路就是 通过 整体倒叙,把两段子串顺序颠倒,两个段子串里的的字符在倒叙一把,**负负得正**,这样就不影响子串里面字符的顺序了。 + +整体代码如下: + +```CPP +// 版本一 +#include +#include +using namespace std; +int main() { + int n; + string s; + cin >> n; + cin >> s; + int len = s.size(); //获取长度 + + reverse(s.begin(), s.end()); // 整体反转 + reverse(s.begin(), s.begin() + n); // 先反转前一段,长度n + reverse(s.begin() + n, s.end()); // 再反转后一段 + + cout << s << endl; + +} +``` + +那么整体反正的操作放在下面,先局部反转行不行? + +可以的,不过,要记得 控制好 局部反转的长度,如果先局部反转,那么先反转的子串长度就是 len - n,如图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20231106172534.png) + +代码如下: + +```CPP +// 版本二 +#include +#include +using namespace std; +int main() { + int n; + string s; + cin >> n; + cin >> s; + int len = s.size(); //获取长度 + reverse(s.begin(), s.begin() + len - n); // 先反转前一段,长度len-n ,注意这里是和版本一的区别 + reverse(s.begin() + len - n, s.end()); // 再反转后一段 + reverse(s.begin(), s.end()); // 整体反转 + cout << s << endl; + +} +``` + + +## 拓展 + +大家在做剑指offer的时候,会发现 剑指offer的题目是左反转,那么左反转和右反转 有什么区别呢? + +其实思路是一样一样的,就是反转的区间不同而已。如果本题是左旋转n,那么实现代码如下: + +```CPP +#include +#include +using namespace std; +int main() { + int n; + string s; + cin >> n; + cin >> s; + int len = s.size(); //获取长度 + reverse(s.begin(), s.begin() + n); // 反转第一段长度为n + reverse(s.begin() + n, s.end()); // 反转第二段长度为len-n + reverse(s.begin(), s.end()); // 整体反转 + cout << s << endl; + +} +``` + +大家可以感受一下 这份代码和 版本二的区别, 其实就是反转的区间不同而已。 + +那么左旋转的话,可以不可以先整体反转,例如想版本一的那样呢? + +当然可以。 + + + + +## 其他语言版本 + +### Java: + + + +### Python: + + +### Go: + + +### JavaScript: + + +### TypeScript: + + +### Swift: + + + +### PHP: + + +### Scala: + + +### Rust: + + + + +

+ + + diff --git "a/problems/\344\272\214\345\217\211\346\240\221\344\270\255\351\200\222\345\275\222\345\270\246\347\235\200\345\233\236\346\272\257.md" "b/problems/\344\272\214\345\217\211\346\240\221\344\270\255\351\200\222\345\275\222\345\270\246\347\235\200\345\233\236\346\272\257.md" index 9bf7405d06..67570bc8d6 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\344\270\255\351\200\222\345\275\222\345\270\246\347\235\200\345\233\236\346\272\257.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\344\270\255\351\200\222\345\275\222\345\270\246\347\235\200\345\233\236\346\272\257.md" @@ -621,7 +621,7 @@ func _binaryTreePaths3(_ root: TreeNode, res: inout [String], paths: inout [Int] > 100.相同的树 -```rsut +```rust use std::cell::RefCell; use std::rc::Rc; impl Solution { diff --git "a/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" "b/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" index fed08a5346..040be29983 100644 --- "a/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" +++ "b/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" @@ -5,73 +5,92 @@

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

-# 题目:剑指Offer 05.替换空格 +# 替换数字 -[力扣题目链接](https://leetcode.cn/problems/ti-huan-kong-ge-lcof/) +力扣已经将剑指offer题目下架,所以我在卡码网上给大家提供类似的题目来练习 -请实现一个函数,把字符串 s 中的每个空格替换成"%20"。 +[卡码网题目链接](https://kamacoder.com/problempage.php?pid=1064) -示例 1: -输入:s = "We are happy." -输出:"We%20are%20happy." +给定一个字符串 s,它包含小写字母和数字字符,请编写一个函数,将字符串中的字母字符保持不变,而将每个数字字符替换为number。 + +例如,对于输入字符串 "a1b2c3",函数应该将其转换为 "anumberbnumbercnumber"。 + +对于输入字符串 "a5b",函数应该将其转换为 "anumberb" + +输入:一个字符串 s,s 仅包含小写字母和数字字符。 + +输出:打印一个新的字符串,其中每个数字字符都被替换为了number + +样例输入:a1b2c3 + +样例输出:anumberbnumbercnumber + +数据范围:1 <= s.length < 10000。 ## 思路 -如果想把这道题目做到极致,就不要只用额外的辅助空间了! +如果想把这道题目做到极致,就不要只用额外的辅助空间了! (不过使用Java刷题的录友,一定要使用辅助空间,因为Java里的string不能修改) + +首先扩充数组到每个数字字符替换成 "number" 之后的大小。 + +例如 字符串 "a5b" 的长度为3,那么 将 数字字符变成字符串 "number" 之后的字符串为 "anumberb" 长度为 8。 -首先扩充数组到每个空格替换成"%20"之后的大小。 +如图: -然后从后向前替换空格,也就是双指针法,过程如下: +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20231030165201.png) -i指向新长度的末尾,j指向旧长度的末尾。 +然后从后向前替换数字字符,也就是双指针法,过程如下:i指向新长度的末尾,j指向旧长度的末尾。 -![替换空格](https://code-thinking.cdn.bcebos.com/gifs/%E6%9B%BF%E6%8D%A2%E7%A9%BA%E6%A0%BC.gif) +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20231030173058.png) 有同学问了,为什么要从后向前填充,从前向后填充不行么? -从前向后填充就是O(n^2)的算法了,因为每次添加元素都要将添加元素之后的所有元素向后移动。 +从前向后填充就是O(n^2)的算法了,因为每次添加元素都要将添加元素之后的所有元素整体向后移动。 -**其实很多数组填充类的问题,都可以先预先给数组扩容带填充后的大小,然后在从后向前进行操作。** +**其实很多数组填充类的问题,其做饭都是先预先给数组扩容带填充后的大小,然后在从后向前进行操作。** 这么做有两个好处: 1. 不用申请新数组。 2. 从后向前填充元素,避免了从前向后填充元素时,每次添加元素都要将添加元素之后的所有元素向后移动的问题。 -时间复杂度,空间复杂度均超过100%的用户。 - - - C++代码如下: ```CPP -class Solution { -public: - string replaceSpace(string s) { - int count = 0; // 统计空格的个数 +#include +using namespace std; +int main() { + string s; + while (cin >> s) { + int count = 0; // 统计数字的个数 int sOldSize = s.size(); for (int i = 0; i < s.size(); i++) { - if (s[i] == ' ') { + if (s[i] >= '0' && s[i] <= '9') { count++; } } - // 扩充字符串s的大小,也就是每个空格替换成"%20"之后的大小 - s.resize(s.size() + count * 2); + // 扩充字符串s的大小,也就是每个空格替换成"number"之后的大小 + s.resize(s.size() + count * 5); int sNewSize = s.size(); - // 从后先前将空格替换为"%20" + // 从后先前将空格替换为"number" for (int i = sNewSize - 1, j = sOldSize - 1; j < i; i--, j--) { - if (s[j] != ' ') { + if (s[j] > '9' || s[j] < '0') { s[i] = s[j]; } else { - s[i] = '0'; - s[i - 1] = '2'; - s[i - 2] = '%'; - i -= 2; + s[i] = 'r'; + s[i - 1] = 'e'; + s[i - 2] = 'b'; + s[i - 3] = 'm'; + s[i - 4] = 'u'; + s[i - 5] = 'n'; + i -= 5; } } - return s; + cout << s << endl; } -}; +} + + ``` * 时间复杂度:O(n) @@ -123,442 +142,32 @@ for (int i = 0; i < a.size(); i++) { ### C: -```C -char* replaceSpace(char* s){ - //统计空格数量 - int count = 0; - int len = strlen(s); - for (int i = 0; i < len; i++) { - if (s[i] == ' ') { - count++; - } - } - - //为新数组分配空间 - int newLen = len + count * 2; - char* result = malloc(sizeof(char) * newLen + 1); - //填充新数组并替换空格 - for (int i = len - 1, j = newLen - 1; i >= 0; i--, j--) { - if (s[i] != ' ') { - result[j] = s[i]; - } else { - result[j--] = '0'; - result[j--] = '2'; - result[j] = '%'; - } - } - result[newLen] = '\0'; - - return result; -} -``` - ### Java: -```Java -//使用一个新的对象,复制 str,复制的过程对其判断,是空格则替换,否则直接复制,类似于数组复制 -public static String replaceSpace(String s) { - if (s == null) { - return null; - } - //选用 StringBuilder 单线程使用,比较快,选不选都行 - StringBuilder sb = new StringBuilder(); - //使用 sb 逐个复制 s ,碰到空格则替换,否则直接复制 - for (int i = 0; i < s.length(); i++) { - //s.charAt(i) 为 char 类型,为了比较需要将其转为和 " " 相同的字符串类型 - //if (" ".equals(String.valueOf(s.charAt(i)))){} - if (s.charAt(i) == ' ') { - sb.append("%20"); - } else { - sb.append(s.charAt(i)); - } - } - return sb.toString(); - } - -//方式二:双指针法 -public String replaceSpace(String s) { - if(s == null || s.length() == 0){ - return s; - } - //扩充空间,空格数量2倍 - StringBuilder str = new StringBuilder(); - for (int i = 0; i < s.length(); i++) { - if(s.charAt(i) == ' '){ - str.append(" "); - } - } - //若是没有空格直接返回 - if(str.length() == 0){ - return s; - } - //有空格情况 定义两个指针 - int left = s.length() - 1;//左指针:指向原始字符串最后一个位置 - s += str.toString(); - int right = s.length()-1;//右指针:指向扩展字符串的最后一个位置 - char[] chars = s.toCharArray(); - while(left>=0){ - if(chars[left] == ' '){ - chars[right--] = '0'; - chars[right--] = '2'; - chars[right] = '%'; - }else{ - chars[right] = chars[left]; - } - left--; - right--; - } - return new String(chars); -} -``` ### Go: -```go -// 遍历添加 -func replaceSpace(s string) string { - b := []byte(s) - result := make([]byte, 0) - for i := 0; i < len(b); i++ { - if b[i] == ' ' { - result = append(result, []byte("%20")...) - } else { - result = append(result, b[i]) - } - } - return string(result) -} - -// 原地修改 -func replaceSpace(s string) string { - b := []byte(s) - length := len(b) - spaceCount := 0 - // 计算空格数量 - for _, v := range b { - if v == ' ' { - spaceCount++ - } - } - // 扩展原有切片 - resizeCount := spaceCount * 2 - tmp := make([]byte, resizeCount) - b = append(b, tmp...) - i := length - 1 - j := len(b) - 1 - for i >= 0 { - if b[i] != ' ' { - b[j] = b[i] - i-- - j-- - } else { - b[j] = '0' - b[j-1] = '2' - b[j-2] = '%' - i-- - j = j - 3 - } - } - return string(b) -} -``` - ### python: -因为字符串是不可变类型,所以操作字符串需要将其转换为列表,因此空间复杂度不可能为O(1) - -(版本一)转换成列表,并且添加相匹配的空间,然后进行填充 -```python -class Solution: - def replaceSpace(self, s: str) -> str: - counter = s.count(' ') - - res = list(s) - # 每碰到一个空格就多拓展两个格子,1 + 2 = 3个位置存’%20‘ - res.extend([' '] * counter * 2) - - # 原始字符串的末尾,拓展后的末尾 - left, right = len(s) - 1, len(res) - 1 - - while left >= 0: - if res[left] != ' ': - res[right] = res[left] - right -= 1 - else: - # [right - 2, right), 左闭右开 - res[right - 2: right + 1] = '%20' - right -= 3 - left -= 1 - return ''.join(res) - -``` -(版本二)添加空列表,添加匹配的结果 -```python -class Solution: - def replaceSpace(self, s: str) -> str: - res = [] - for i in range(len(s)): - if s[i] == ' ': - res.append('%20') - else: - res.append(s[i]) - return ''.join(res) -``` -(版本三)使用切片 -```python -class Solution: - def replaceSpace(self, s: str) -> str: - n = len(s) - for e, i in enumerate(s[::-1]): - print(i, e) - if i == " ": - s = s[: n - (e + 1)] + "%20" + s[n - e:] - print("") - return s -``` -(版本四)使用join + split -```python -class Solution: - def replaceSpace(self, s: str) -> str: - return "%20".join(s.split(" ")) -``` -(版本五)使用replace -```python -class Solution: - def replaceSpace(self, s: str) -> str: - return s.replace(' ', '%20') -``` ### JavaScript: -```js -/** - * @param {string} s - * @return {string} - */ - var replaceSpace = function(s) { - // 字符串转为数组 - const strArr = Array.from(s); - let count = 0; - - // 计算空格数量 - for(let i = 0; i < strArr.length; i++) { - if (strArr[i] === ' ') { - count++; - } - } - - let left = strArr.length - 1; - let right = strArr.length + count * 2 - 1; - - while(left >= 0) { - if (strArr[left] === ' ') { - strArr[right--] = '0'; - strArr[right--] = '2'; - strArr[right--] = '%'; - left--; - } else { - strArr[right--] = strArr[left--]; - } - } - - // 数组转字符串 - return strArr.join(''); -}; -``` ### TypeScript: -```typescript -function replaceSpace(s: string): string { - let arr: string[] = s.split(''); - let spaceNum: number = 0; - let oldLength: number = arr.length; - for (let i = 0; i < oldLength; i++) { - if (arr[i] === ' ') { - spaceNum++; - } - } - arr.length = oldLength + 2 * spaceNum; - let cur: number = oldLength - 1; - for (let i = arr.length - 1; i >= 0; i--, cur--) { - if (arr[cur] !== ' ') { - arr[i] = arr[cur] - } else { - arr[i] = '0'; - arr[--i] = '2'; - arr[--i] = '%'; - } - } - return arr.join(''); -}; -``` ### Swift: -```swift -func replaceSpace(_ s: String) -> String { - var strArr = Array(s) - var count = 0 - - // 统计空格的个数 - for i in strArr { - if i == " " { - count += 1 - } - } - // left 指向旧数组的最后一个元素 - var left = strArr.count - 1 - // right 指向扩容后数组的最后一个元素(这里还没对数组进行实际上的扩容) - var right = strArr.count + count * 2 - 1 - - // 实际对数组扩容 - for _ in 0..<(count * 2) { - strArr.append(" ") - } - - while left < right { - if strArr[left] == " " { - strArr[right] = "0" - strArr[right - 1] = "2" - strArr[right - 2] = "%" - left -= 1 - right -= 3 - } else { - strArr[right] = strArr[left] - left -= 1 - right -= 1 - } - } - - return String(strArr) -} -``` ### Scala: -方式一: 双指针 -```scala -object Solution { - def replaceSpace(s: String): String = { - var count = 0 - s.foreach(c => if (c == ' ') count += 1) // 统计空格的数量 - val sOldSize = s.length // 旧数组字符串长度 - val sNewSize = s.length + count * 2 // 新数组字符串长度 - val res = new Array[Char](sNewSize) // 新数组 - var index = sNewSize - 1 // 新数组索引 - // 逆序遍历 - for (i <- (0 until sOldSize).reverse) { - if (s(i) == ' ') { - res(index) = '0' - index -= 1 - res(index) = '2' - index -= 1 - res(index) = '%' - } else { - res(index) = s(i) - } - index -= 1 - } - res.mkString - } -} -``` -方式二: 使用一个集合,遇到空格就添加%20 -```scala -object Solution { - import scala.collection.mutable.ListBuffer - def replaceSpace(s: String): String = { - val res: ListBuffer[Char] = ListBuffer[Char]() - for (i <- s.indices) { - if (s(i) == ' ') { - res += '%' - res += '2' - res += '0' - }else{ - res += s(i) - } - } - res.mkString - } -} -``` -方式三: 使用map -```scala -object Solution { - def replaceSpace(s: String): String = { - s.map(c => if(c == ' ') "%20" else c).mkString - } - } -``` ### PHP: -```php -function replaceSpace($s){ - $sLen = strlen($s); - $moreLen = $this->spaceLen($s) * 2; - - $head = $sLen - 1; - $tail = $sLen + $moreLen - 1; - - $s = $s . str_repeat(' ', $moreLen); - while ($head != $tail) { - if ($s[$head] == ' ') { - $s[$tail--] = '0'; - $s[$tail--] = '2'; - $s[$tail] = '%'; - } else { - $s[$tail] = $s[$head]; - } - $head--; - $tail--; - } - return $s; -} -// 统计空格个数 -function spaceLen($s){ - $count = 0; - for ($i = 0; $i < strlen($s); $i++) { - if ($s[$i] == ' ') { - $count++; - } - } - return $count; -} -``` ### Rust: -```Rust -impl Solution { - pub fn replace_space(s: String) -> String { - let mut len: usize = s.len(); - let mut s = s.chars().collect::>(); - let mut count = 0; - for i in &s { - if i.is_ascii_whitespace() { - count += 1; - } - } - let mut new_len = len + count * 2; - s.resize(new_len, ' '); - while len < new_len { - len -= 1; - new_len -= 1; - if s[len].is_ascii_whitespace() { - s[new_len] = '0'; - s[new_len - 1] = '2'; - s[new_len - 2] = '%'; - new_len -= 2; - } - else { s[new_len] = s[len] } - } - s.iter().collect::() - } -} -```

diff --git "a/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" "b/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" index 43a0fe0849..138cf3a88d 100644 --- "a/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" @@ -5,413 +5,174 @@

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

-> 反转个字符串还有这么多用处? +# 右旋字符串 -# 题目:剑指Offer58-II.左旋转字符串 +力扣已经将剑指offer题目下架,所以在卡码网上给大家提供类似的题目来练习 -[力扣题目链接](https://leetcode.cn/problems/zuo-xuan-zhuan-zi-fu-chuan-lcof/) +[卡码网题目链接](https://kamacoder.com/problempage.php?pid=1065) -字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。 +字符串的右旋转操作是把字符串尾部的若干个字符转移到字符串的前面。给定一个字符串 s 和一个正整数 k,请编写一个函数,将字符串中的后面 k 个字符移到字符串的前面,实现字符串的右旋转操作。 -示例 1: -输入: s = "abcdefg", k = 2 -输出: "cdefgab" +例如,对于输入字符串 "abcdefg" 和整数 2,函数应该将其转换为 "fgabcde"。 -示例 2: -输入: s = "lrloseumgh", k = 6 -输出: "umghlrlose" +输入:输入共包含两行,第一行为一个正整数 k,代表右旋转的位数。第二行为字符串 s,代表需要旋转的字符串。 -限制: -1 <= k < s.length <= 10000 +输出:输出共一行,为进行了右旋转操作后的字符串。 -## 思路 +样例输入: -为了让本题更有意义,提升一下本题难度:**不能申请额外空间,只能在本串上操作**。 +``` +2 +abcdefg +``` -不能使用额外空间的话,模拟在本串操作要实现左旋转字符串的功能还是有点困难的。 +样例输出: +``` +fgabcde +``` -那么我们可以想一下上一题目[字符串:花式反转还不够!](https://programmercarl.com/0151.翻转字符串里的单词.html)中讲过,使用整体反转+局部反转就可以实现反转单词顺序的目的。 +数据范围:1 <= k < 10000, 1 <= s.length < 10000; -这道题目也非常类似,依然可以通过局部反转+整体反转 达到左旋转的目的。 -具体步骤为: +## 思路 -1. 反转区间为前n的子串 -2. 反转区间为n到末尾的子串 -3. 反转整个字符串 +为了让本题更有意义,提升一下本题难度:**不能申请额外空间,只能在本串上操作**。 (Java不能在字符串上修改,所以使用java一定要开辟新空间) -最后就可以达到左旋n的目的,而不用定义新的字符串,完全在本串上操作。 +不能使用额外空间的话,模拟在本串操作要实现右旋转字符串的功能还是有点困难的。 -例如 :示例1中 输入:字符串abcdefg,n=2 +那么我们可以想一下上一题目[字符串:花式反转还不够!](https://programmercarl.com/0151.翻转字符串里的单词.html)中讲过,使用整体反转+局部反转就可以实现反转单词顺序的目的。 -如图: - +本题中,我们需要将字符串右移n位,字符串相当于分成了两个部分,如果n为2,符串相当于分成了两个部分,如图: (length为字符串长度) -最终得到左旋2个单元的字符串:cdefgab +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20231106170143.png) -思路明确之后,那么代码实现就很简单了 -C++代码如下: +右移n位, 就是将第二段放在前面,第一段放在后面,先不考虑里面字符的顺序,是不是整体倒叙不就行了。如图: -```CPP -class Solution { -public: - string reverseLeftWords(string s, int n) { - reverse(s.begin(), s.begin() + n); - reverse(s.begin() + n, s.end()); - reverse(s.begin(), s.end()); - return s; - } -}; -``` -* 时间复杂度: O(n) -* 空间复杂度:O(1) +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20231106171557.png) -是不是发现这代码也太简单了。 +此时第一段和第二段的顺序是我们想要的,但里面的字符位置被我们倒叙,那么此时我们在把 第一段和第二段里面的字符再倒叙一把,这样字符顺序不就正确了。 如果: -## 总结 +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20231106172058.png) +其实,思路就是 通过 整体倒叙,把两段子串顺序颠倒,两个段子串里的的字符在倒叙一把,**负负得正**,这样就不影响子串里面字符的顺序了。 -此时我们已经反转好多次字符串了,来一起回顾一下吧。 +整体代码如下: -在这篇文章[344.反转字符串](https://programmercarl.com/0344.反转字符串.html),第一次讲到反转一个字符串应该怎么做,使用了双指针法。 +```CPP +// 版本一 +#include +#include +using namespace std; +int main() { + int n; + string s; + cin >> n; + cin >> s; + int len = s.size(); //获取长度 -然后发现[541. 反转字符串II](https://programmercarl.com/0541.反转字符串II.html),这里开始给反转加上了一些条件,当需要固定规律一段一段去处理字符串的时候,要想想在for循环的表达式上做做文章。 + reverse(s.begin(), s.end()); // 整体反转 + reverse(s.begin(), s.begin() + n); // 先反转前一段,长度n + reverse(s.begin() + n, s.end()); // 再反转后一段 -后来在[151.翻转字符串里的单词](https://programmercarl.com/0151.翻转字符串里的单词.html)中,要对一句话里的单词顺序进行反转,发现先整体反转再局部反转 是一个很妙的思路。 + cout << s << endl; -最后再讲到本题,本题则是先局部反转再 整体反转,与[151.翻转字符串里的单词](https://programmercarl.com/0151.翻转字符串里的单词.html)类似,但是也是一种新的思路。 +} +``` -好了,反转字符串一共就介绍到这里,相信大家此时对反转字符串的常见操作已经很了解了。 +那么整体反正的操作放在下面,先局部反转行不行? -## 题外话 +可以的,不过,要记得 控制好 局部反转的长度,如果先局部反转,那么先反转的子串长度就是 len - n,如图: -一些同学热衷于使用substr,来做这道题。 -其实使用substr 和 反转 时间复杂度是一样的 ,都是O(n),但是使用substr申请了额外空间,所以空间复杂度是O(n),而反转方法的空间复杂度是O(1)。 +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20231106172534.png) -**如果想让这套题目有意义,就不要申请额外空间。** +代码如下: +```CPP +// 版本二 +#include +#include +using namespace std; +int main() { + int n; + string s; + cin >> n; + cin >> s; + int len = s.size(); //获取长度 + reverse(s.begin(), s.begin() + len - n); // 先反转前一段,长度len-n ,注意这里是和版本一的区别 + reverse(s.begin() + len - n, s.end()); // 再反转后一段 + reverse(s.begin(), s.end()); // 整体反转 + cout << s << endl; -## 其他语言版本 +} +``` -### Java: -```java -class Solution { - public String reverseLeftWords(String s, int n) { - int len=s.length(); - StringBuilder sb=new StringBuilder(s); - reverseString(sb,0,n-1); - reverseString(sb,n,len-1); - return sb.reverse().toString(); - } - public void reverseString(StringBuilder sb, int start, int end) { - while (start < end) { - char temp = sb.charAt(start); - sb.setCharAt(start, sb.charAt(end)); - sb.setCharAt(end, temp); - start++; - end--; - } - } +## 拓展 + +大家在做剑指offer的时候,会发现 剑指offer的题目是左反转,那么左反转和右反转 有什么区别呢? + +其实思路是一样一样的,就是反转的区间不同而已。如果本题是左旋转n,那么实现代码如下: + +```CPP +#include +#include +using namespace std; +int main() { + int n; + string s; + cin >> n; + cin >> s; + int len = s.size(); //获取长度 + reverse(s.begin(), s.begin() + n); // 反转第一段长度为n + reverse(s.begin() + n, s.end()); // 反转第二段长度为len-n + reverse(s.begin(), s.end()); // 整体反转 + cout << s << endl; + } ``` -```java -// 解法二 -// 空间复杂度:O(n)。String 的 toCharArray() 方法底层会 new 一个和原字符串相同大小的 char 数组 -// 思路为:先整个字符串反转,再反转前面的,最后反转后面 n 个 -class Solution { - public String reverseLeftWords(String s, int n) { - char[] chars = s.toCharArray(); - reverse(chars, 0, chars.length - 1); - reverse(chars, 0, chars.length - 1 - n); - reverse(chars, chars.length - n, chars.length - 1); - return new String(chars); - } - - public void reverse(char[] chars, int left, int right) { - while (left < right) { - chars[left] ^= chars[right]; - chars[right] ^= chars[left]; - chars[left] ^= chars[right]; - left++; - right--; - } - } -``` +大家可以感受一下 这份代码和 版本二的区别, 其实就是反转的区间不同而已。 -### Python: -(版本一)使用切片 +那么左旋转的话,可以不可以先整体反转,例如想版本一的那样呢? -```python -class Solution: - def reverseLeftWords(self, s: str, n: int) -> str: - return s[n:] + s[:n] -``` -(版本二)使用reversed + join - -```python -class Solution: - def reverseLeftWords(self, s: str, n: int) -> str: - s = list(s) - s[0:n] = list(reversed(s[0:n])) - s[n:] = list(reversed(s[n:])) - s.reverse() - - return "".join(s) +当然可以。 -``` -(版本三)自定义reversed函数 - -```python -class Solution: - def reverseLeftWords(self, s: str, n: int) -> str: - s_list = list(s) - - self.reverse(s_list, 0, n - 1) - self.reverse(s_list, n, len(s_list) - 1) - self.reverse(s_list, 0, len(s_list) - 1) - - return ''.join(s_list) - - def reverse(self, s, start, end): - while start < end: - s[start], s[end] = s[end], s[start] - start += 1 - end -= 1 -``` -(版本四)使用 模 +下标 -```python 3 -class Solution: - def reverseLeftWords(self, s: str, n: int) -> str: - new_s = '' - for i in range(len(s)): - j = (i+n)%len(s) - new_s = new_s + s[j] - return new_s -``` -(版本五)使用 模 + 切片 - -```python 3 -class Solution: - def reverseLeftWords(self, s: str, n: int) -> str: - l = len(s) - # 复制输入字符串与它自己连接 - s = s + s - - # 计算旋转字符串的起始索引 - k = n % (l * 2) - - # 从连接的字符串中提取旋转后的字符串并返回 - return s[k : k + l] +## 其他语言版本 + +### Java: + + + +### Python: -``` ### Go: -```go -func reverseLeftWords(s string, n int) string { - b := []byte(s) - // 1. 反转前n个字符 - // 2. 反转第n到end字符 - // 3. 反转整个字符 - reverse(b, 0, n-1) - reverse(b, n, len(b)-1) - reverse(b, 0, len(b)-1) - return string(b) -} -// 切片是引用传递 -func reverse(b []byte, left, right int){ - for left < right{ - b[left], b[right] = b[right],b[left] - left++ - right-- - } -} -``` ### JavaScript: -```javascript -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); -}; -``` - -版本二(在原字符串上操作): - -```js -/** - * @param {string} s - * @param {number} n - * @return {string} - */ -var reverseLeftWords = function (s, n) { - /** Utils */ - function reverseWords(strArr, start, end) { - let temp; - while (start < end) { - temp = strArr[start]; - strArr[start] = strArr[end]; - strArr[end] = temp; - start++; - end--; - } - } - /** Main code */ - let strArr = s.split(''); - let length = strArr.length; - reverseWords(strArr, 0, length - 1); - reverseWords(strArr, 0, length - n - 1); - reverseWords(strArr, length - n, length - 1); - return strArr.join(''); -}; -``` ### TypeScript: -```typescript -function reverseLeftWords(s: string, n: number): string { - /** Utils */ - function reverseWords(strArr: string[], start: number, end: number): void { - let temp: string; - while (start < end) { - temp = strArr[start]; - strArr[start] = strArr[end]; - strArr[end] = temp; - start++; - end--; - } - } - /** Main code */ - let strArr: string[] = s.split(''); - let length: number = strArr.length; - reverseWords(strArr, 0, length - 1); - reverseWords(strArr, 0, length - n - 1); - reverseWords(strArr, length - n, length - 1); - return strArr.join(''); -}; -``` -方法二: -```typescript -// 拼接两个字符串,截取符合要求的部分 -function reverseLeftWords(s: string, n: number): string { - return (s+s).slice(n,s.length+n); -}; -``` ### Swift: -```swift -func reverseLeftWords(_ s: String, _ n: Int) -> String { - var ch = Array(s) - let len = ch.count - // 反转区间[0, n - 1] - reverseString(&ch, startIndex: 0, endIndex: n - 1) - // 反转区间[n, len - 1] - reverseString(&ch, startIndex: n, endIndex: len - 1) - // 反转区间[0, len - 1],也就是整个字符串反转 - reverseString(&ch, startIndex: 0, endIndex: len - 1) - return String(ch) -} - -func reverseString(_ s: inout [Character], startIndex: Int, endIndex: Int) { - var start = startIndex - var end = endIndex - while start < end { - (s[start], s[end]) = (s[end], s[start]) - start += 1 - end -= 1 - } -} -``` ### PHP: -```php -function reverseLeftWords($s, $n) { - $this->reverse($s,0,$n-1); //反转区间为前n的子串 - $this->reverse($s,$n,strlen($s)-1); //反转区间为n到末尾的子串 - $this->reverse($s,0,strlen($s)-1); //反转整个字符串 - return $s; -} - -// 按指定进行翻转 【array、string都可】 -function reverse(&$s, $start, $end) { - for ($i = $start, $j = $end; $i < $j; $i++, $j--) { - $tmp = $s[$i]; - $s[$i] = $s[$j]; - $s[$j] = $tmp; - } -} -``` ### Scala: -```scala -object Solution { - def reverseLeftWords(s: String, n: Int): String = { - var str = s.toCharArray // 转换为Array - // abcdefg => ba cdefg - reverseString(str, 0, n - 1) - // ba cdefg => ba gfedc - reverseString(str, n, str.length - 1) - // ba gfedc => cdefgab - reverseString(str, 0, str.length - 1) - // 最终返回,return关键字可以省略 - new String(str) - } - // 翻转字符串 - def reverseString(s: Array[Char], start: Int, end: Int): Unit = { - var (left, right) = (start, end) - while (left < right) { - var tmp = s(left) - s(left) = s(right) - s(right) = tmp - left += 1 - right -= 1 - } - } -} -``` ### Rust: -```Rust -impl Solution { - pub fn reverse(s: &mut Vec, mut begin: usize, mut end: usize){ - while begin < end { - let temp = s[begin]; - s[begin] = s[end]; - s[end] = temp; - begin += 1; - end -= 1; - } - } - pub fn reverse_left_words(s: String, n: i32) -> String { - let len = s.len(); - let mut s = s.chars().collect::>(); - let n = n as usize; - Self::reverse(&mut s, 0, n - 1); - Self::reverse(&mut s, n, len - 1); - Self::reverse(&mut s, 0, len - 1); - s.iter().collect::() - } -} -``` diff --git "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" index bc5f2e5d67..09fb97a9d8 100644 --- "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" +++ "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" @@ -9,7 +9,7 @@ # 动态规划:01背包理论基础 -本题力扣上没有原题,大家可以去[卡码网第46题](https://kamacoder.com/problem.php?id=1046)去练习,题意是一样的。 +本题力扣上没有原题,大家可以去[卡码网第46题](https://kamacoder.com/problempage.php?pid=1046)去练习,题意是一样的。 ## 算法公开课 diff --git "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" index 0b4f8450c2..674166a199 100644 --- "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" +++ "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" @@ -6,7 +6,7 @@ # 动态规划:01背包理论基础(滚动数组) -本题力扣上没有原题,大家可以去[卡码网第46题](https://kamacoder.com/problem.php?id=1046)去练习 +本题力扣上没有原题,大家可以去[卡码网第46题](https://kamacoder.com/problempage.php?pid=1046)去练习 ## 算法公开课 diff --git "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\244\232\351\207\215\350\203\214\345\214\205.md" "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\244\232\351\207\215\350\203\214\345\214\205.md" index 50c2e5bf8c..b19b52731a 100644 --- "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\244\232\351\207\215\350\203\214\345\214\205.md" +++ "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\244\232\351\207\215\350\203\214\345\214\205.md" @@ -7,6 +7,8 @@ # 动态规划:关于多重背包,你该了解这些! +本题力扣上没有原题,大家可以去[卡码网第56题](https://kamacoder.com/problempage.php?pid=1066)去练习,题意是一样的。 + 之前我们已经系统的讲解了01背包和完全背包,如果没有看过的录友,建议先把如下三篇文章仔细阅读一波。 * [动态规划:关于01背包问题,你该了解这些!](https://programmercarl.com/背包理论基础01背包-1.html) @@ -53,79 +55,96 @@ 毫无区别,这就转成了一个01背包问题了,且每个物品只用一次。 -这种方式来实现多重背包的代码如下: + +练习题目:[卡码网第56题,多重背包](https://kamacoder.com/problempage.php?pid=1066) + +代码如下: ```CPP -void test_multi_pack() { - vector weight = {1, 3, 4}; - vector value = {15, 20, 30}; - vector nums = {2, 3, 2}; - int bagWeight = 10; - for (int i = 0; i < nums.size(); i++) { - while (nums[i] > 1) { // nums[i]保留到1,把其他物品都展开 +// 超时了 +#include +#include +using namespace std; +int main() { + int bagWeight,n; + cin >> bagWeight >> n; + vector weight(n, 0); + vector value(n, 0); + vector nums(n, 0); + for (int i = 0; i < n; i++) cin >> weight[i]; + for (int i = 0; i < n; i++) cin >> value[i]; + for (int i = 0; i < n; i++) cin >> nums[i]; + + for (int i = 0; i < n; i++) { + while (nums[i] > 1) { // 物品数量不是一的,都展开 weight.push_back(weight[i]); value.push_back(value[i]); nums[i]--; } } - + vector dp(bagWeight + 1, 0); - for(int i = 0; i < weight.size(); i++) { // 遍历物品 + for(int i = 0; i < weight.size(); i++) { // 遍历物品,注意此时的物品数量不是n for(int j = bagWeight; j >= weight[i]; j--) { // 遍历背包容量 dp[j] = max(dp[j], dp[j - weight[i]] + value[i]); } - for (int j = 0; j <= bagWeight; j++) { - cout << dp[j] << " "; - } - cout << endl; } cout << dp[bagWeight] << endl; - -} -int main() { - test_multi_pack(); } +``` + +大家去提交之后,发现这个解法超时了,为什么呢,哪里耗时呢? + +耗时就在 这段代码: +```CPP +for (int i = 0; i < n; i++) { + while (nums[i] > 1) { // 物品数量不是一的,都展开 + weight.push_back(weight[i]); + value.push_back(value[i]); + nums[i]--; + } +} ``` -* 时间复杂度:O(m × n × k),m:物品种类个数,n背包容量,k单类物品数量 +如果物品数量很多的话,C++中,这种操作十分费时,主要消耗在vector的动态底层扩容上。(其实这里也可以优化,先把 所有物品数量都计算好,一起申请vector的空间。 + -也有另一种实现方式,就是把每种商品遍历的个数放在01背包里面在遍历一遍。 +这里也有另一种实现方式,就是把每种商品遍历的个数放在01背包里面在遍历一遍。 代码如下:(详看注释) +```CPP +#include +#include +using namespace std; +int main() { + int bagWeight,n; + cin >> bagWeight >> n; + vector weight(n, 0); + vector value(n, 0); + vector nums(n, 0); + for (int i = 0; i < n; i++) cin >> weight[i]; + for (int i = 0; i < n; i++) cin >> value[i]; + for (int i = 0; i < n; i++) cin >> nums[i]; -```CPP -void test_multi_pack() { - vector weight = {1, 3, 4}; - vector value = {15, 20, 30}; - vector nums = {2, 3, 2}; - int bagWeight = 10; vector dp(bagWeight + 1, 0); - - for(int i = 0; i < weight.size(); i++) { // 遍历物品 + for(int i = 0; i < n; i++) { // 遍历物品 for(int j = bagWeight; j >= weight[i]; j--) { // 遍历背包容量 // 以上为01背包,然后加一个遍历个数 for (int k = 1; k <= nums[i] && (j - k * weight[i]) >= 0; k++) { // 遍历个数 dp[j] = max(dp[j], dp[j - k * weight[i]] + k * value[i]); } } - // 打印一下dp数组 - for (int j = 0; j <= bagWeight; j++) { - cout << dp[j] << " "; - } - cout << endl; } + cout << dp[bagWeight] << endl; } -int main() { - test_multi_pack(); -} ``` -* 时间复杂度:O(m × n × k),m:物品种类个数,n背包容量,k单类物品数量 +时间复杂度:O(m × n × k),m:物品种类个数,n背包容量,k单类物品数量 从代码里可以看出是01背包里面在加一个for循环遍历一个每种商品的数量。 和01背包还是如出一辙的。 @@ -146,320 +165,14 @@ int main() { ### Java: -```Java -public void testMultiPack1(){ - // 版本一:改变物品数量为01背包格式 - List weight = new ArrayList<>(Arrays.asList(1, 3, 4)); - List value = new ArrayList<>(Arrays.asList(15, 20, 30)); - List nums = new ArrayList<>(Arrays.asList(2, 3, 2)); - int bagWeight = 10; - - for (int i = 0; i < nums.size(); i++) { - while (nums.get(i) > 1) { // 把物品展开为i - weight.add(weight.get(i)); - value.add(value.get(i)); - nums.set(i, nums.get(i) - 1); - } - } - - int[] dp = new int[bagWeight + 1]; - for(int i = 0; i < weight.size(); i++) { // 遍历物品 - for(int j = bagWeight; j >= weight.get(i); j--) { // 遍历背包容量 - dp[j] = Math.max(dp[j], dp[j - weight.get(i)] + value.get(i)); - } - System.out.println(Arrays.toString(dp)); - } -} - -public void testMultiPack2(){ - // 版本二:改变遍历个数 - int[] weight = new int[] {1, 3, 4}; - int[] value = new int[] {15, 20, 30}; - int[] nums = new int[] {2, 3, 2}; - int bagWeight = 10; - - int[] dp = new int[bagWeight + 1]; - for(int i = 0; i < weight.length; i++) { // 遍历物品 - for(int j = bagWeight; j >= weight[i]; j--) { // 遍历背包容量 - // 以上为01背包,然后加一个遍历个数 - for (int k = 1; k <= nums[i] && (j - k * weight[i]) >= 0; k++) { // 遍历个数 - dp[j] = Math.max(dp[j], dp[j - k * weight[i]] + k * value[i]); - } - System.out.println(Arrays.toString(dp)); - } - } -} -``` ### Python: -改变物品数量为01背包格式(无参版) -```python -def test_multi_pack(): - weight = [1, 3, 4] - value = [15, 20, 30] - nums = [2, 3, 2] - bagWeight = 10 - - # 将数量大于1的物品展开 - for i in range(len(nums)): - while nums[i] > 1: - weight.append(weight[i]) - value.append(value[i]) - nums[i] -= 1 - - dp = [0] * (bagWeight + 1) - for i in range(len(weight)): # 遍历物品 - for j in range(bagWeight, weight[i] - 1, -1): # 遍历背包容量 - dp[j] = max(dp[j], dp[j - weight[i]] + value[i]) - for j in range(bagWeight + 1): - print(dp[j], end=" ") - print() - - print(dp[bagWeight]) - - -test_multi_pack() - -``` - - -改变遍历个数(无参版) -```python -def test_multi_pack(): - weight = [1, 3, 4] - value = [15, 20, 30] - nums = [2, 3, 2] - bagWeight = 10 - dp = [0] * (bagWeight + 1) - - for i in range(len(weight)): # 遍历物品 - for j in range(bagWeight, weight[i] - 1, -1): # 遍历背包容量 - # 以上为01背包,然后加一个遍历个数 - for k in range(1, nums[i] + 1): # 遍历个数 - if j - k * weight[i] >= 0: - dp[j] = max(dp[j], dp[j - k * weight[i]] + k * value[i]) - - # 打印一下dp数组 - for j in range(bagWeight + 1): - print(dp[j], end=" ") - print() - - print(dp[bagWeight]) - - -test_multi_pack() - -``` - - -改变物品数量为01背包格式(有参版) -```python -def test_multi_pack(weight, value, nums, bagWeight): - # 将数量大于1的物品展开 - for i in range(len(nums)): - while nums[i] > 1: - weight.append(weight[i]) - value.append(value[i]) - nums[i] -= 1 - - dp = [0] * (bagWeight + 1) - for i in range(len(weight)): # 遍历物品 - for j in range(bagWeight, weight[i] - 1, -1): # 遍历背包容量 - dp[j] = max(dp[j], dp[j - weight[i]] + value[i]) - for j in range(bagWeight + 1): - print(dp[j], end=" ") - print() - - print(dp[bagWeight]) - - - - -if __name__ == "__main__": - weight = [1, 3, 4] - value = [15, 20, 30] - nums = [2, 3, 2] - bagWeight = 10 - test_multi_pack(weight, value, nums, bagWeight) -``` - - -改变遍历个数(有参版) -```python -def test_multi_pack(weight, value, nums, bagWeight): - dp = [0] * (bagWeight + 1) - - for i in range(len(weight)): # 遍历物品 - for j in range(bagWeight, weight[i] - 1, -1): # 遍历背包容量 - # 以上为01背包,然后加一个遍历个数 - for k in range(1, nums[i] + 1): # 遍历个数 - if j - k * weight[i] >= 0: - dp[j] = max(dp[j], dp[j - k * weight[i]] + k * value[i]) - - # 使用 join 函数打印 dp 数组 - print(' '.join(str(dp[j]) for j in range(bagWeight + 1))) - - print(dp[bagWeight]) - - - - - -if __name__ == "__main__": - weight = [1, 3, 4] - value = [15, 20, 30] - nums = [2, 3, 2] - bagWeight = 10 - test_multi_pack(weight, value, nums, bagWeight) - -``` ### Go: -```go -package theory - -import "log" - -// 多重背包可以化解为 01 背包 -func multiplePack(weight, value, nums []int, bagWeight int) int { - - for i := 0; i < len(nums); i++ { - for nums[i] > 1 { - weight = append(weight, weight[i]) - value = append(value, value[i]) - nums[i]-- - } - } - log.Println(weight) - log.Println(value) - - res := make([]int, bagWeight+1) - for i := 0; i < len(weight); i++ { - for j := bagWeight; j >= weight[i]; j-- { - res[j] = getMax(res[j], res[j-weight[i]]+value[i]) - } - log.Println(res) - } - - return res[bagWeight] -} -``` - -> 单元测试 - -```go -package theory - -import "testing" - -func Test_multiplePack(t *testing.T) { - type args struct { - weight []int - value []int - nums []int - bagWeight int - } - tests := []struct { - name string - args args - want int - }{ - { - name: "one", - args: args{ - weight: []int{1, 3, 4}, - value: []int{15, 20, 30}, - nums: []int{2, 3, 2}, - bagWeight: 10, - }, - want: 90, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - if got := multiplePack(tt.args.weight, tt.args.value, tt.args.nums, tt.args.bagWeight); got != tt.want { - t.Errorf("multiplePack() = %v, want %v", got, tt.want) - } - }) - } -} -``` - -> 输出 - -``` -=== RUN Test_multiplePack -=== RUN Test_multiplePack/one -2022/03/02 21:09:05 [1 3 4 1 3 3 4] -2022/03/02 21:09:05 [15 20 30 15 20 20 30] -2022/03/02 21:09:05 [0 15 15 15 15 15 15 15 15 15 15] -2022/03/02 21:09:05 [0 15 15 20 35 35 35 35 35 35 35] -2022/03/02 21:09:05 [0 15 15 20 35 45 45 50 65 65 65] -2022/03/02 21:09:05 [0 15 30 30 35 50 60 60 65 80 80] -2022/03/02 21:09:05 [0 15 30 30 35 50 60 60 70 80 80] -2022/03/02 21:09:05 [0 15 30 30 35 50 60 60 70 80 80] -2022/03/02 21:09:05 [0 15 30 30 35 50 60 60 70 80 90] ---- PASS: Test_multiplePack (0.00s) - --- PASS: Test_multiplePack/one (0.00s) -PASS -``` ### TypeScript: -> 版本一(改变数据源): - -```typescript -function testMultiPack() { - const bagSize: number = 10; - const weightArr: number[] = [1, 3, 4], - valueArr: number[] = [15, 20, 30], - amountArr: number[] = [2, 3, 2]; - for (let i = 0, length = amountArr.length; i < length; i++) { - while (amountArr[i] > 1) { - weightArr.push(weightArr[i]); - valueArr.push(valueArr[i]); - amountArr[i]--; - } - } - const goodsNum: number = weightArr.length; - const dp: number[] = new Array(bagSize + 1).fill(0); - // 遍历物品 - for (let i = 0; i < goodsNum; i++) { - // 遍历背包容量 - for (let j = bagSize; j >= weightArr[i]; j--) { - dp[j] = Math.max(dp[j], dp[j - weightArr[i]] + valueArr[i]); - } - } - console.log(dp); -} -testMultiPack(); -``` - -> 版本二(改变遍历方式): - -```typescript -function testMultiPack() { - const bagSize: number = 10; - const weightArr: number[] = [1, 3, 4], - valueArr: number[] = [15, 20, 30], - amountArr: number[] = [2, 3, 2]; - const goodsNum: number = weightArr.length; - const dp: number[] = new Array(bagSize + 1).fill(0); - // 遍历物品 - for (let i = 0; i < goodsNum; i++) { - // 遍历物品个数 - for (let j = 0; j < amountArr[i]; j++) { - // 遍历背包容量 - for (let k = bagSize; k >= weightArr[i]; k--) { - dp[k] = Math.max(dp[k], dp[k - weightArr[i]] + valueArr[i]); - } - } - } - console.log(dp); -} -testMultiPack(); -``` diff --git "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" index c6c856978a..92e944cc49 100644 --- "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" +++ "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" @@ -7,7 +7,7 @@ # 动态规划:完全背包理论基础 -本题力扣上没有原题,大家可以去[卡码网第52题](https://kamacoder.com/problem.php?id=1052)去练习,题意是一样的。 +本题力扣上没有原题,大家可以去[卡码网第52题](https://kamacoder.com/problempage.php?pid=1052)去练习,题意是一样的。 ## 算法公开课 From f520b1dc172dafbc4361c48e3df22b8da399a2c3 Mon Sep 17 00:00:00 2001 From: Wang ChaoLan <68094392+Junior-W@users.noreply.github.com> Date: Thu, 9 Nov 2023 17:20:12 +0800 Subject: [PATCH 2302/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20kama55.=E5=8F=B3?= =?UTF-8?q?=E6=97=8B=E5=AD=97=E7=AC=A6=E4=B8=B2.md=20Java=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...13\345\255\227\347\254\246\344\270\262.md" | 62 +++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git "a/problems/kama55.\345\217\263\346\227\213\345\255\227\347\254\246\344\270\262.md" "b/problems/kama55.\345\217\263\346\227\213\345\255\227\347\254\246\344\270\262.md" index afd29d7376..f384193001 100644 --- "a/problems/kama55.\345\217\263\346\227\213\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/kama55.\345\217\263\346\227\213\345\255\227\347\254\246\344\270\262.md" @@ -145,8 +145,70 @@ int main() { ## 其他语言版本 ### Java: +```Java +// 版本一 +import java.util.Scanner; + +public class Main { + public static void main(String[] args) { + Scanner in = new Scanner(System.in); + int n = Integer.parseInt(in.nextLine()); + String s = in.nextLine(); + + int len = s.length(); //获取字符串长度 + char[] chars = s.toCharArray(); + reverseString(chars, 0, len - 1); //反转整个字符串 + reverseString(chars, 0, n - 1); //反转前一段字符串,此时的字符串首尾尾是0,n - 1 + reverseString(chars, n, len - 1); //反转后一段字符串,此时的字符串首尾尾是n,len - 1 + + System.out.println(chars); + + } + + public static void reverseString(char[] ch, int start, int end) { + //异或法反转字符串,参照题目 344.反转字符串的解释 + while (start < end) { + ch[start] ^= ch[end]; + ch[end] ^= ch[start]; + ch[start] ^= ch[end]; + start++; + end--; + } + } +} + + +// 版本二 +import java.util.Scanner; + +public class Main { + public static void main(String[] args) { + Scanner in = new Scanner(System.in); + int n = Integer.parseInt(in.nextLine()); + String s = in.nextLine(); + int len = s.length(); //获取字符串长度 + char[] chars = s.toCharArray(); + reverseString(chars, 0, len - n - 1); //反转前一段字符串,此时的字符串首尾是0,len - n - 1 + reverseString(chars, len - n, len - 1); //反转后一段字符串,此时的字符串首尾是len - n,len - 1 + reverseString(chars, 0, len - 1); //反转整个字符串 + System.out.println(chars); + + } + + public static void reverseString(char[] ch, int start, int end) { + //异或法反转字符串,参照题目 344.反转字符串的解释 + while (start < end) { + ch[start] ^= ch[end]; + ch[end] ^= ch[start]; + ch[start] ^= ch[end]; + start++; + end--; + } + } +} +``` ### Python: From 139a4db4859f5b251d8df1e40d92c30587f44d28 Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Fri, 10 Nov 2023 17:52:08 +0800 Subject: [PATCH 2303/3019] Update --- ...24\345\217\221\346\265\201\347\250\213.md" | 60 ++++----- ...CM\346\250\241\345\274\217\357\274\237.md" | 114 +++++------------- 2 files changed, 58 insertions(+), 116 deletions(-) diff --git "a/problems/\345\211\215\345\272\217/\344\272\222\350\201\224\347\275\221\345\244\247\345\216\202\347\240\224\345\217\221\346\265\201\347\250\213.md" "b/problems/\345\211\215\345\272\217/\344\272\222\350\201\224\347\275\221\345\244\247\345\216\202\347\240\224\345\217\221\346\265\201\347\250\213.md" index 9616958dc5..ed526897e5 100644 --- "a/problems/\345\211\215\345\272\217/\344\272\222\350\201\224\347\275\221\345\244\247\345\216\202\347\240\224\345\217\221\346\265\201\347\250\213.md" +++ "b/problems/\345\211\215\345\272\217/\344\272\222\350\201\224\347\275\221\345\244\247\345\216\202\347\240\224\345\217\221\346\265\201\347\250\213.md" @@ -1,5 +1,7 @@ # 揭秘互联网大厂研发流程 +[B站:揭秘互联网大厂研发流程](https://www.bilibili.com/video/BV1KR4y1H7ST) + 很多录友会很好奇这么个事: * 大厂的研发流程应该是什么样的呢 @@ -8,17 +10,6 @@ 这次给大家介绍一波大厂的研发流程,让大家明明白白。 -同时我已经录制了视频,昨晚已经在B站首发了。 - -视频里讲的更清楚一点,因为我是没有草稿,先录的视频,然后在根据视频写的文章,写文章的时候,发现我视频里讲的太多了,码字实在是码不过来,所以这篇文字稿中每一个研发环节的解释稍稍精简了一下。 - -如果详细了解研发流程就直接看视频吧,**别告诉卡哥,你还没关注 「代码随想录」的B站,还不赶紧关注一波[机智]**。 - -重要重要重要: **要给三连呀!** - -[B站:揭秘互联网大厂研发流程](https://www.bilibili.com/video/BV1KR4y1H7ST) - - 其实对于几十人或者上百人一起开发一个项目的话,一个规范的研发流程是很重要的。 有的同学可能想,哪有这么多流程啊,就是写完代码,跑一下,没问题,然后就上线了。 @@ -33,15 +24,15 @@ 看需求文档,我们要根据需求文档来确定我们究竟要做什么。 -一些同学可能感觉 为什么还要用一个需求文档呢,你就告诉我做啥我就做啥不就完事了。 +一些同学可能感觉 为什么还要用一个需求文档呢,你就告诉我做啥我就做啥不就完事了? -其实需求文档一方面是倒逼产品经理去系统性的思考这个需求究竟有哪些功能,用来满足哪些用户的需求。 +需求文档一方面是**倒逼产品经理去系统性的思考这个需求究竟有哪些功能**,用来满足哪些用户的需求。 -另一方面,是保证我们在研发的时候,研发出来的功能是满足需求文档里所描述的。 +另一方面是**保证我们在研发的时候,研发出来的功能是满足需求文档里所描述的**。 如果是口头对接的话,很有可能就是你做出来的东西,产品经理看完感觉:这和我说的需求不一样啊!!这和我想的不一样啊!! -这样就是两个人相互甩锅,那这究竟是谁的锅呢。都没有一个证据,对吧。 +这样就是两个人相互“甩锅”,那这究竟是谁的锅呢。都没有一个证据,对吧。 所以说,有一个需求文档很重要。 @@ -67,13 +58,13 @@ 你说你一周的时间就能把它开发完,那为什么是一周呢,为什么不是两天,为什么不是两周呢。 -其实 和上面的领导汇报你的工作的时候 都要把自己的工作进行量化。 +其实 和上面的领导汇报你的工作的时候 **都要把自己的工作进行量化**。 那么这个功能有哪些难点,我们要克服这个难点,所需要花费的时间,都要有一个大体的量化。 -这样才能量化我们自己的工作,**领导其实不知道你的工作是简单 还是困难, 领导只在意最终结果**,所以你要展现给领导你的工作是有难度的是有挑战的。 +这样才能量化我们自己的工作,**领导其实不知道你的工作是简单 还是困难, 领导只在意最终结果**,所以你需要展现给领导你的工作是有难度的是有挑战的。 -而且这些也是我们年底用来晋升或者评职称的素材。 +而且**这些也是我们年底用来晋升或者评职称的素材**。 如果这些东西你自己都不在乎的话,谁还会帮你在乎呢。 @@ -108,7 +99,7 @@ 所以只要有交互,就要确定协议的数据格式。 -定协议要考虑到兼容,要考虑易于维护。 +**定协议要考虑到兼容,要考虑易于维护**。 ## 6.设计数据结构和算法 @@ -122,13 +113,19 @@ 为什么会这样呢? 一个很简单的例子,互联网研发讲究其实就是要快,例如一个功能2天就要开发完,如果算法都要自己去写的话,等都写完了,花都谢了。 +最关键的是,**你实现的算法 极大概率没有现成的算法接口安全性高**。 + +**开发中要学会才在巨人的肩膀上**。 + ## 7.预估一下容量 特别是后端开发,要估计出 我们自己模块大体需要多大磁盘,多大内存,多大带宽,多少核CPU。 这也是没有做过研发工作的同学经常忽略的,**因为大家好像默认 磁盘、内存、带宽、cpu是无穷的**。 -其实我们在设计一个模块的时候,这些都要评估的,不能模块一上线,把机器直接打爆了,例如 直接把带宽打满了,不仅影响自己的模块功能,还影响了机器上其他模块的运行。 +其实我们在设计一个模块的时候,这些都要评估的,不能模块一上线,把机器直接打爆了。 + +例如 直接把带宽打满了,不仅影响自己的模块功能,还影响了机器上其他模块的运行。 ## 8.考虑部署 @@ -139,7 +136,9 @@ 还有就是要弹性可伸缩,即我们的模块可不可以直接 部署多台机器来提高承载能力。 -如果用户量突然上来了,或者流量突然上来了,可以通过快速部署多台机器来抗住流量。而不是模块只能在单机上跑,多部署几台就发生各种问题。 +如果用户量突然上来了,或者流量突然上来了,可以通过快速部署多台机器来抗住流量。 + +而不是模块只能在单机上跑,多部署几台就发生各种问题。 **这才能说明是有足够强的风险意识的**。 @@ -170,19 +169,19 @@ 这里就有很多沟通工作了,因为其他同学可能手头有自己的活,那么就要协调一个时间来一起测试。 -这一步也是很费时间的,其费时关键是要等,要等其他同学有空和你联调,而且往往不是联调一次就能解决问题的。 +这一步也是很费时间的,**其费时关键是要等,要等其他同学有空和你联调或者是别人等你**,而且往往不是联调一次就能解决问题的。 所以 在评估开发时间的时候 也要考虑到联调的时间。 -这也是大厂研发效率低的地方,但上百人开发的项目,这种沟通上消耗也是在所难免的。 +这也是大厂研发效率低的地方,但上百人开发的项目,**这种沟通上消耗也是在所难免的**。 ## 13.交给测试 自己的代码,自己测 一般都测不出什么问题,需要交给测试同学来给你测一测。 -这里如果测试同学测出问题,你就要判断确实有问题还是 测试方式不对,如果有问题就要修改,在提给测试,反反复复这么几轮,直到测试同学测试没问题了。 +这里如果测试同学测出问题,你就要判断确实有问题还是 测试方式不对,如果有问题就要修改,再提给测试,反反复复这么几轮,直到测试同学测试没问题了。 -这个过程也是累心的。 +**这个过程也是累心的**。 ## 14.code review @@ -202,12 +201,15 @@ 其实合入主干是很重要的,经常是自己的代码没问题,但合入主干之后就有问题了。 -一般就是合入主干的时候有冲突,例如你从主干拉出一个分支,另一个同学从主干拉出一个分支,而且两个分支修改了同一个模块,如果另一个同学提前合入主干,你在合入主干的时候就会有代码冲突。 +一般就是合入主干的时候有冲突,例如你从主干拉出一个分支,另一个同学从主干拉出一个分支,而且两个分支修改了同一个模块,如果另一个同学提前合入主干,你再合入主干的时候就会有代码冲突。 在解决代码冲突的时候 就会修改别人的代码,这个过程很容易产生新的bug。 + **一般合入主干之后,测试同学还要重新跑一个全量测试,才能放心发布**。 +如果跑全量测试没有问题的话,才会松一口气(懂的人都懂)。 + ## 16.发布 最后一步就是发布了。 @@ -218,15 +220,15 @@ 用大白话来讲,就是把 本地的代码或者某台机器的代码,编译成可执行文件,然后更新到 线上的服务器(一个独立的集群,专门处理线上的流量)并运行起来。 -上线是最重要的一步了,也很容易出问题,因为一个大型项目,其上线的过程都非常复杂(要更新上百台机器的集群),而且要考虑线上新版和旧版本的兼容问题。 +上线是最重要的一步了,也很容易出问题,因为一个大型项目,其上线的过程都非常复杂(要更新上百台机器的集群),而且**要考虑线上新版和旧版本的兼容问题**。 这也是为什么大厂项目都选择深夜上线,**因为深夜在线用户最少,如果出问题,影响的用户会比较少,可以快速修复**。 所以大家经常看到 某大厂程序员深夜上线发布版本之类的。 -# 总结 +## 总结 -好了,整整讲了十六个步骤!​把大厂研发流程中 具体都有哪一步,为什么要这么做,都分析的很清楚了。 +好了,整整讲了十六个步骤!把大厂研发流程中 具体都有哪一步,为什么要这么做,都分析的很清楚了。 不过在大厂也不是所有部门都按照这个流程来的,每个部门都有自己玩法,各个部门也不太统一。 diff --git "a/problems/\345\211\215\345\272\217/\344\273\200\344\271\210\346\230\257\346\240\270\345\277\203\344\273\243\347\240\201\346\250\241\345\274\217\357\274\214\344\273\200\344\271\210\345\217\210\346\230\257ACM\346\250\241\345\274\217\357\274\237.md" "b/problems/\345\211\215\345\272\217/\344\273\200\344\271\210\346\230\257\346\240\270\345\277\203\344\273\243\347\240\201\346\250\241\345\274\217\357\274\214\344\273\200\344\271\210\345\217\210\346\230\257ACM\346\250\241\345\274\217\357\274\237.md" index 0012f88e67..313264fba2 100644 --- "a/problems/\345\211\215\345\272\217/\344\273\200\344\271\210\346\230\257\346\240\270\345\277\203\344\273\243\347\240\201\346\250\241\345\274\217\357\274\214\344\273\200\344\271\210\345\217\210\346\230\257ACM\346\250\241\345\274\217\357\274\237.md" +++ "b/problems/\345\211\215\345\272\217/\344\273\200\344\271\210\346\230\257\346\240\270\345\277\203\344\273\243\347\240\201\346\250\241\345\274\217\357\274\214\344\273\200\344\271\210\345\217\210\346\230\257ACM\346\250\241\345\274\217\357\274\237.md" @@ -1,120 +1,60 @@ # 什么是核心代码模式,什么又是ACM模式? -现在很多企业都在牛客上进行面试,**很多录友和我反馈说搞不懂牛客上输入代码的ACM模式**。 +很多录友刷了不少题了,到现在也没有搞清楚什么是 ACM模式,什么是核心代码模式。 -什么是ACM输入模式呢? 就是自己构造输入数据格式,把要需要处理的容器填充好,OJ不会给你任何代码,包括include哪些函数都要自己写,最后也要自己控制返回数据的格式。 +平时大家在力扣上刷题,就是 核心代码模式,即给你一个函数,直接写函数实现,例如这样: +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20231109193631.png) -**这里给大家推荐ACM模式练习网站**:[kamacoder.com](https://kamacoder.com),把上面的题目刷完,ACM模式就没问题了。 - +而ACM模式,是程序头文件,main函数,数据的输入输出都要自己处理,例如这样: -而力扣上是核心代码模式,就是把要处理的数据都已经放入容器里,可以直接写逻辑,例如这样: +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20231109193743.png) -```CPP -class Solution { -public: - int minimumTotal(vector>& triangle) { +大家可以发现 右边代码框什么都没有,程序从头到尾都需要自己实现,本题如果写完代码是这样的: (细心的录友可以发现和力扣上刷题是不一样的) - } -}; -``` +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20231109193931.png) -**如果大家从一开始学习算法就一直在力扣上的话,突然切到牛客网上的ACM模式会很不适应**。 -因为我上学的时候就搞ACM,在POJ(北大的在线判题系统)和ZOJ(浙大的在线判题系统)上刷过6、7百道题目了,对这种ACM模式就很熟悉。 +**如果大家从一开始学习算法就一直在力扣上的话,突然切到ACM模式会非常不适应**。 -接下来我给大家讲一下ACM模式应该如何写。 +知识星球里也有很多录友,因为不熟悉ACM模式在面试的过程中吃了不少亏。 -这里我拿牛客上 腾讯2020校园招聘-后台 的面试题目来举一个例子,本题我不讲解题思路,只是拿本题为例讲解ACM输入输出格式。 -题目描述: +
-由于业绩优秀,公司给小Q放了 n 天的假,身为工作狂的小Q打算在在假期中工作、锻炼或者休息。他有个奇怪的习惯:不会连续两天工作或锻炼。只有当公司营业时,小Q才能去工作,只有当健身房营业时,小Q才能去健身,小Q一天只能干一件事。给出假期中公司,健身房的营业情况,求小Q最少需要休息几天。 +
-输入描述: -第一行一个整数 表示放假天数 -第二行 n 个数 每个数为0或1,第 i 个数表示公司在第 i 天是否营业 -第三行 n 个数 每个数为0或1,第 i 个数表示健身房在第 i 天是否营业 -(1为营业 0为不营业) +
-输出描述: -一个整数,表示小Q休息的最少天数 +
-示例一: -输入: -4 -1 1 0 0 -0 1 1 0 +
-输出: -2 +## 面试究竟怎么考? +笔试的话,基本都是 ACM模式。 -这道题如果要是力扣上的核心代码模式,OJ应该直接给出如下代码: +面试的话,看情况,有的面试官会让你写一个函数实现就可以,此时就是核心代码模式。 -```CPP -class Solution { -public: - int getDays(vector& work, vector& gym) { - // 处理逻辑 - } -}; -``` +有的面试官会 给你一个编辑器,让你写完代码运行一下看看输出结果,此时就是ACM模式。 -以上代码中我们直接写核心逻辑就行了,work数组,gym数组都是填好的,直接拿来用就行,处理完之后 return 结果就完事了。 +有的录友想,那我平时在力扣刷题,写的是核心代码模式,我也可以运行,为啥一定要用ACM模式。 -那么看看ACM模式我们要怎么写呢。 +**大家在力扣刷题刷多了,已经忘了程序是如何运行的了**,力扣上写的代码,脱离力扣环境,那个函数,你怎么运行呢? -ACM模式要求写出来的代码是直接可以本地运行的,所以我们需要自己写include哪些库函数,构造输入用例,构造输出用例。 +想让程序在本地运行起来,是不是需要补充 库函数,是不是要补充main函数,是不是要补充数据的输入和输出。 那不就是ACM模式了。 -拿本题来说,为了让代码可以运行,需要include这些库函数: +综合来看,** ACM模式更考察综合代码能力, 核心代码模式是更聚焦算法的实现逻辑**。 -```CPP -#include -#include -using namespace std; -``` +## 去哪练习ACM模式? +这里给大家推荐卡码网: [kamacoder.com](https://kamacoder.com/) -然后开始写主函数,来处理输入用例了,示例一 是一个完整的测试用例,一般我们测了一个用例还要测第二个用例,所以用:while(cin>>n) 来输入数据。 +你只要能把卡码网首页的25道题目 都刷了 ,就把所有的ACM输入输出方式都练习到位了,不会有任何盲区。 -这里输入的n就是天数,得到天数之后,就可以来构造work数组和gym数组了。 +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20231109195056.png) -此时就已经完成了输入用例构建,然后就是处理逻辑了,最后返回结果。 +而且你不用担心,题目难度太大,直接给自己劝退,**卡码网的前25道题目都是我精心制作的,难度也是循序渐进的**,大家去刷一下就知道了。 -完整代码如下: -```CPP -#include -#include -using namespace std; -int main() { - int n; - while (cin >> n) { - vector gym(n); - vector work(n); - for (int i = 0; i < n; i++) cin >> work[i]; - for (int i = 0; i < n; i++) cin >> gym[i]; - int result = 0; - - // 处理逻辑 - - cout << result << endl; - } - return 0; -} -``` - -可以看出ACM模式要比核心代码模式多写不少代码,相对来说ACM模式更锻炼代码能力,而核心代码模式是把侧重点完全放在算法逻辑上。 - -**国内企业现在很多都用牛客来进行面试,所以这种ACM模式大家还有必要熟悉一下**,以免面试的时候因为输入输出搞不懂而错失offer。 - -如果大家有精力的话,也可以去POJ上去刷刷题,POJ是ACM选手首选OJ,输入模式也是ACM模式。 - - - - - ------------------------ -
From 09835e74442c5dfdd118e13ffc43c06da5e419d7 Mon Sep 17 00:00:00 2001 From: to_Geek Date: Fri, 10 Nov 2023 22:00:29 +0800 Subject: [PATCH 2304/3019] =?UTF-8?q?=F0=9F=93=9D=20Update=200383.?= =?UTF-8?q?=E8=B5=8E=E9=87=91=E4=BF=A1.md=20with=20python3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0383.\350\265\216\351\207\221\344\277\241.md" | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git "a/problems/0383.\350\265\216\351\207\221\344\277\241.md" "b/problems/0383.\350\265\216\351\207\221\344\277\241.md" index 3de48ce3da..b800c2320d 100644 --- "a/problems/0383.\350\265\216\351\207\221\344\277\241.md" +++ "b/problems/0383.\350\265\216\351\207\221\344\277\241.md" @@ -214,6 +214,19 @@ class Solution: return all(ransomNote.count(c) <= magazine.count(c) for c in set(ransomNote)) ``` +(版本六)使用count(简单易懂) + +```python3 +class Solution: + def canConstruct(self, ransomNote: str, magazine: str) -> bool: + for char in ransomNote: + if char in magazine and ransomNote.count(char) <= magazine.count(char): + continue + else: + return False + return True +``` + ### Go: ```go From 8945fd98094efe154431cb51a7edf01e3b50af60 Mon Sep 17 00:00:00 2001 From: eeee0717 <70054568+eeee0717@users.noreply.github.com> Date: Sat, 11 Nov 2023 09:12:17 +0800 Subject: [PATCH 2305/3019] =?UTF-8?q?Update.=E4=BA=8C=E5=8F=89=E6=A0=91?= =?UTF-8?q?=E7=9A=84=E9=80=92=E5=BD=92=E9=81=8D=E5=8E=86=EF=BC=8C=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0C#=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...22\345\275\222\351\201\215\345\216\206.md" | 54 +++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" index 730b18ac6d..6dad6e56de 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" @@ -565,6 +565,60 @@ impl Solution { } ``` +### C# +```C# +// 前序遍历 +public IList PreorderTraversal(TreeNode root) +{ + var res = new List(); + if (root == null) return res; + Traversal(root, res); + return res; + +} +public void Traversal(TreeNode cur, IList res) +{ + if (cur == null) return; + res.Add(cur.val); + Traversal(cur.left, res); + Traversal(cur.right, res); +} +``` +```C# +// 中序遍历 +public IList InorderTraversal(TreeNode root) +{ + var res = new List(); + if (root == null) return res; + Traversal(root, res); + return res; +} +public void Traversal(TreeNode cur, IList res) +{ + if (cur == null) return; + Traversal(cur.left, res); + res.Add(cur.val); + Traversal(cur.right, res); +} +``` +```C# +// 后序遍历 +public IList PostorderTraversal(TreeNode root) +{ + var res = new List(); + if (root == null) return res; + Traversal(root, res); + return res; +} +public void Traversal(TreeNode cur, IList res) +{ + if (cur == null) return; + Traversal(cur.left, res); + Traversal(cur.right, res); + res.Add(cur.val); +} +``` +

From 8435164338531108f6919bd64185db52a5eebd4f Mon Sep 17 00:00:00 2001 From: way <1012370241@qq.com> Date: Sat, 11 Nov 2023 11:16:33 +0800 Subject: [PATCH 2306/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0kama54.=E6=9B=BF?= =?UTF-8?q?=E6=8D=A2=E6=95=B0=E5=AD=97=20Java=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\277\346\215\242\346\225\260\345\255\227.md" | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git "a/problems/kama54.\346\233\277\346\215\242\346\225\260\345\255\227.md" "b/problems/kama54.\346\233\277\346\215\242\346\225\260\345\255\227.md" index 80c87951aa..d68bbc2c98 100644 --- "a/problems/kama54.\346\233\277\346\215\242\346\225\260\345\255\227.md" +++ "b/problems/kama54.\346\233\277\346\215\242\346\225\260\345\255\227.md" @@ -143,6 +143,23 @@ for (int i = 0; i < a.size(); i++) { ### Java: +```java +import java.util.Scanner; + +class Main { + public static void main(String[] args) { + Scanner in = new Scanner(System.in); + String s = in.nextLine(); + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < s.length(); i++) { + if (Character.isDigit(s.charAt(i))) { + sb.append("number"); + }else sb.append(s.charAt(i)); + } + System.out.println(sb); + } +} +``` ### Go: From 5d9d37f01d59b2fa95001018fb24e4b74e2a04f9 Mon Sep 17 00:00:00 2001 From: eeee0717 <70054568+eeee0717@users.noreply.github.com> Date: Sun, 12 Nov 2023 09:15:59 +0800 Subject: [PATCH 2307/3019] =?UTF-8?q?Update.=E4=BA=8C=E5=8F=89=E6=A0=91?= =?UTF-8?q?=E8=BF=AD=E4=BB=A3=E9=81=8D=E5=8E=86=EF=BC=8CC#=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...55\344\273\243\351\201\215\345\216\206.md" | 61 +++++++++++++++++++ 1 file changed, 61 insertions(+) diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" index 69007995f0..e39709b882 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" @@ -695,6 +695,67 @@ impl Solution { } } ``` +### C# +```C# +// 前序遍历 +public IList PreorderTraversal(TreeNode root) +{ + var st = new Stack(); + var res = new List(); + if (root == null) return res; + st.Push(root); + while (st.Count != 0) + { + var node = st.Pop(); + res.Add(node.val); + if (node.right != null) + st.Push(node.right); + if (node.left != null) + st.Push(node.left); + } + return res; +} + +// 中序遍历 +public IList InorderTraversal(TreeNode root) +{ + var st = new Stack(); + var res = new List(); + var cur = root; + while (st.Count != 0 || cur != null) + { + if (cur != null) + { + st.Push(cur); + cur = cur.left; + } + else + { + cur = st.Pop(); + res.Add(cur.val); + cur = cur.right; + } + } + return res; +} +// 后序遍历 +public IList PostorderTraversal(TreeNode root) +{ + var res = new List(); + var st = new Stack(); + if (root == null) return res; + st.Push(root); + while (st.Count != 0) + { + var cur = st.Pop(); + res.Add(cur.val); + if (cur.left != null) st.Push(cur.left); + if (cur.right != null) st.Push(cur.right); + } + res.Reverse(0, res.Count()); + return res; +} +```

From 8e463e0b64b02656c41202df52efe249319034e7 Mon Sep 17 00:00:00 2001 From: yihug <31957705+DanielChungYi@users.noreply.github.com> Date: Sun, 12 Nov 2023 12:15:44 +0900 Subject: [PATCH 2308/3019] =?UTF-8?q?[typo=20fix]:=20Update=20kama54.?= =?UTF-8?q?=E6=9B=BF=E6=8D=A2=E6=95=B0=E5=AD=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kama54.\346\233\277\346\215\242\346\225\260\345\255\227.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/kama54.\346\233\277\346\215\242\346\225\260\345\255\227.md" "b/problems/kama54.\346\233\277\346\215\242\346\225\260\345\255\227.md" index 80c87951aa..6147f2d1c6 100644 --- "a/problems/kama54.\346\233\277\346\215\242\346\225\260\345\255\227.md" +++ "b/problems/kama54.\346\233\277\346\215\242\346\225\260\345\255\227.md" @@ -46,7 +46,7 @@ 从前向后填充就是O(n^2)的算法了,因为每次添加元素都要将添加元素之后的所有元素整体向后移动。 -**其实很多数组填充类的问题,其做饭都是先预先给数组扩容带填充后的大小,然后在从后向前进行操作。** +**其实很多数组填充类的问题,其做法都是先预先给数组扩容带填充后的大小,然后在从后向前进行操作。** 这么做有两个好处: From ce2ffd073c20fa72c07df54b4566d285172276c4 Mon Sep 17 00:00:00 2001 From: to_Geek Date: Sun, 12 Nov 2023 23:44:17 +0800 Subject: [PATCH 2309/3019] =?UTF-8?q?=F0=9F=93=9D=20Update=200344.?= =?UTF-8?q?=E5=8F=8D=E8=BD=AC=E5=AD=97=E7=AC=A6=E4=B8=B2.md=20with=20pytho?= =?UTF-8?q?n3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...275\254\345\255\227\347\254\246\344\270\262.md" | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git "a/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" "b/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" index 8a4fed4574..44184c53bc 100644 --- "a/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" @@ -250,6 +250,20 @@ class Solution: s[:] = [s[i] for i in range(len(s) - 1, -1, -1)] ``` + +(版本七) 使用reverse() + +```python +class Solution: + def reverseString(self, s: List[str]) -> None: + """ + Do not return anything, modify s in-place instead. + """ + # 原地反转,无返回值 + s.reverse() + +``` + ### Go: ```Go From 436bd5a1a25d317824af0405bba0d023a7619a16 Mon Sep 17 00:00:00 2001 From: eeee0717 <70054568+eeee0717@users.noreply.github.com> Date: Mon, 13 Nov 2023 09:21:04 +0800 Subject: [PATCH 2310/3019] =?UTF-8?q?Update.=E7=BB=9F=E4=B8=80=E8=BF=AD?= =?UTF-8?q?=E4=BB=A3=E6=B3=95=EF=BC=8C=E6=B7=BB=E5=8A=A0C#=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...00\350\277\255\344\273\243\346\263\225.md" | 93 +++++++++++++++++++ 1 file changed, 93 insertions(+) diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\347\273\237\344\270\200\350\277\255\344\273\243\346\263\225.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\347\273\237\344\270\200\350\277\255\344\273\243\346\263\225.md" index 8089af64ec..ad79424da8 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\347\273\237\344\270\200\350\277\255\344\273\243\346\263\225.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\347\273\237\344\270\200\350\277\255\344\273\243\346\263\225.md" @@ -741,6 +741,99 @@ impl Solution{ } } ``` +### C# +```C# +// 前序遍历 +public IList PreorderTraversal(TreeNode root) +{ + var res = new List(); + var st = new Stack(); + if (root == null) return res; + st.Push(root); + while (st.Count != 0) + { + var node = st.Peek(); + if (node == null) + { + st.Pop(); + node = st.Peek(); + st.Pop(); + res.Add(node.val); + } + else + { + st.Pop(); + if (node.right != null) st.Push(node.right); + if (node.left != null) st.Push(node.left); + st.Push(node); + st.Push(null); + } + } + return res; +} +``` +```C# +// 中序遍历 +public IList InorderTraversal(TreeNode root) +{ + var res = new List(); + var st = new Stack(); + if (root == null) return res; + st.Push(root); + while (st.Count != 0) + { + var node = st.Peek(); + if (node == null) + { + st.Pop(); + node = st.Peek(); + st.Pop(); + res.Add(node.val); + } + else + { + st.Pop(); + if (node.right != null) st.Push(node.right); + st.Push(node); + st.Push(null); + if (node.left != null) st.Push(node.left); + } + } + return res; +} +``` + +```C# +// 后序遍历 +public IList PostorderTraversal(TreeNode root) +{ + var res = new List(); + var st = new Stack(); + if (root == null) return res; + st.Push(root); + while (st.Count != 0) + { + var node = st.Peek(); + if (node == null) + { + st.Pop(); + node = st.Peek(); + st.Pop(); + res.Add(node.val); + } + else + { + st.Pop(); + if (node.left != null) st.Push(node.left); + if (node.right != null) st.Push(node.right); + st.Push(node); + st.Push(null); + } + } + res.Reverse(0, res.Count); + return res; +} +```

From aad5029a1cb33461905df368c951bceeb2fbc797 Mon Sep 17 00:00:00 2001 From: eeee0717 <70054568+eeee0717@users.noreply.github.com> Date: Tue, 14 Nov 2023 09:11:17 +0800 Subject: [PATCH 2311/3019] =?UTF-8?q?Update=20102.=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=A0=91=E7=9A=84=E5=B1=82=E5=BA=8F=E9=81=8D=E5=8E=86=EF=BC=8C?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0C#=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...02\345\272\217\351\201\215\345\216\206.md" | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" index 51d030e784..e977279c56 100644 --- "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" +++ "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" @@ -462,6 +462,32 @@ impl Solution { } } ``` +### C# +```C# +public IList> LevelOrder(TreeNode root) +{ + var res = new List>(); + var que = new Queue(); + if (root == null) return res; + que.Enqueue(root); + while (que.Count != 0) + { + var size = que.Count; + var vec = new List(); + for (int i = 0; i < size; i++) + { + var cur = que.Dequeue(); + vec.Add(cur.val); + if (cur.left != null) que.Enqueue(cur.left); + if (cur.right != null) que.Enqueue(cur.right); + } + res.Add(vec); + + + } + return res; +} +``` **此时我们就掌握了二叉树的层序遍历了,那么如下九道力扣上的题目,只需要修改模板的两三行代码(不能再多了),便可打倒!** @@ -798,6 +824,31 @@ impl Solution { } } ``` +### C# +```C# +public IList> LevelOrderBottom(TreeNode root) +{ + var res = new List>(); + var que = new Queue(); + if (root == null) return res; + que.Enqueue(root); + while (que.Count != 0) + { + var size = que.Count; + var vec = new List(); + for (int i = 0; i < size; i++) + { + var cur = que.Dequeue(); + vec.Add(cur.val); + if (cur.left != null) que.Enqueue(cur.left); + if (cur.right != null) que.Enqueue(cur.right); + } + res.Add(vec); + } + res.Reverse(); + return res; +} +``` ## 199.二叉树的右视图 From bc988fb846ab845e61a748aad6e9ec79f0ab2339 Mon Sep 17 00:00:00 2001 From: changknn Date: Tue, 14 Nov 2023 09:58:16 +0800 Subject: [PATCH 2312/3019] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c1296ed3db..143a8ba205 100644 --- a/README.md +++ b/README.md @@ -397,7 +397,7 @@ * [图论:417.太平洋大西洋水流问题](./problems/0417.太平洋大西洋水流问题.md) * [图论:827.最大人工岛](./problems/0827.最大人工岛.md) * [图论:127. 单词接龙](./problems/0127.单词接龙.md) -* [图论:841.钥匙和房间](./problems/841.钥匙和房间) +* [图论:841.钥匙和房间](./problems/0841.钥匙和房间.md) * [图论:463. 岛屿的周长](./problems/0463.岛屿的周长.md) * [图论:并查集理论基础](./problems/) * [图论:1971. 寻找图中是否存在路径](./problems/1971.寻找图中是否存在路径.md) From 08a77b9e060985cbd25205144b8e86d57d8b61d4 Mon Sep 17 00:00:00 2001 From: changknn Date: Tue, 14 Nov 2023 11:00:01 +0800 Subject: [PATCH 2313/3019] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 143a8ba205..15b10bfa7a 100644 --- a/README.md +++ b/README.md @@ -399,7 +399,7 @@ * [图论:127. 单词接龙](./problems/0127.单词接龙.md) * [图论:841.钥匙和房间](./problems/0841.钥匙和房间.md) * [图论:463. 岛屿的周长](./problems/0463.岛屿的周长.md) -* [图论:并查集理论基础](./problems/) +* [图论:并查集理论基础](./problems/图论并查集理论基础.md) * [图论:1971. 寻找图中是否存在路径](./problems/1971.寻找图中是否存在路径.md) * [图论:684.冗余连接](./problems/0684.冗余连接.md) * [图论:685.冗余连接II](./problems/0685.冗余连接II.md) From 103256a36a20fa48514f3d6cb2516fecda681c68 Mon Sep 17 00:00:00 2001 From: xin Date: Wed, 15 Nov 2023 08:34:47 +0800 Subject: [PATCH 2314/3019] =?UTF-8?q?update:=20=E6=9B=B4=E6=96=B00104.?= =?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=A0=91=E7=9A=84=E6=9C=80=E5=A4=A7=E6=B7=B1?= =?UTF-8?q?=E5=BA=A6=E9=87=8C=E7=9A=84=20n=20=E5=8F=89=E6=A0=91=E6=9C=80?= =?UTF-8?q?=E5=A4=A7=E6=B7=B1=E5=BA=A6=E7=9A=84=20ts=20=E8=A7=A3=E6=B3=95?= =?UTF-8?q?=EF=BC=8C=E5=8E=9F=E6=9C=AC=E4=BB=A3=E7=A0=81=E4=B8=8D=E8=83=BD?= =?UTF-8?q?=E9=80=9A=E8=BF=87=20leetcode=20=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...00\345\244\247\346\267\261\345\272\246.md" | 42 ++++++++++++------- 1 file changed, 26 insertions(+), 16 deletions(-) diff --git "a/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" "b/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" index 0504437521..b115762e45 100644 --- "a/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" +++ "b/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" @@ -738,26 +738,36 @@ function maxDepth(root: TreeNode | null): number { ```typescript // 后续遍历(自下而上) -function maxDepth(root: TreeNode | null): number { - if (root === null) return 0; - return Math.max(maxDepth(root.left), maxDepth(root.right)) + 1; -}; +function maxDepth(root: Node | null): number { + if (root === null) return 0 + let depth = 0 + for (let i = 0; i < root.children.length; i++) { + depth = Math.max(depth, maxDepth(root.children[i])) + } + return depth + 1 +} // 前序遍历(自上而下) -function maxDepth(root: TreeNode | null): number { - function recur(node: TreeNode | null, count: number) { - if (node === null) { - resMax = resMax > count ? resMax : count; - return; +function maxDepth(root: Node | null): number { + if (root === null) return 0 + + let depth: number = 0 + const queue: Array = [] + queue.push(root) + + while (queue.length > 0) { + let len = queue.length + depth++ + for (let i = 0; i < len; i++) { + // 当前层遍历 + let curNode: Node | null = queue.shift()! + for (let j = 0; j < curNode.children.length; j++) { + if (curNode.children[j]) queue.push(curNode.children[j]) + } } - recur(node.left, count + 1); - recur(node.right, count + 1); } - let resMax: number = 0; - let count: number = 0; - recur(root, count); - return resMax; -}; + return depth +} ``` From dba4e9d00ec28ea484715bd5fa341ae8aed9ed98 Mon Sep 17 00:00:00 2001 From: eeee0717 <70054568+eeee0717@users.noreply.github.com> Date: Wed, 15 Nov 2023 08:57:19 +0800 Subject: [PATCH 2315/3019] =?UTF-8?q?Update226.=E7=BF=BB=E8=BD=AC=E4=BA=8C?= =?UTF-8?q?=E5=8F=89=E6=A0=91=EF=BC=8C=E7=AE=80=E5=8C=96C#=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...54\344\272\214\345\217\211\346\240\221.md" | 26 +++++-------------- 1 file changed, 7 insertions(+), 19 deletions(-) diff --git "a/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" "b/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" index 1151778364..8691953a3e 100644 --- "a/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" @@ -1018,25 +1018,13 @@ public class Solution { ```csharp //迭代 public class Solution { - public TreeNode InvertTree(TreeNode root) { - if (root == null) return null; - Stack stack=new Stack(); - stack.Push(root); - while(stack.Count>0) - { - TreeNode node = stack.Pop(); - swap(node); - if(node.right!=null) stack.Push(node.right); - if(node.left!=null) stack.Push(node.left); - } - return root; - } - - public void swap(TreeNode node) { - TreeNode temp = node.left; - node.left = node.right; - node.right = temp; - } +public TreeNode InvertTree(TreeNode root) { + if(root == null) return root; + (root.left,root.right) = (root.right, root.left); + InvertTree(root.left); + InvertTree(root.right); + return root; +} } ``` From b51573efa69a3e4fead79bbcba62c77f7ecedb09 Mon Sep 17 00:00:00 2001 From: eeee0717 <70054568+eeee0717@users.noreply.github.com> Date: Wed, 15 Nov 2023 09:16:04 +0800 Subject: [PATCH 2316/3019] =?UTF-8?q?Update101.=E5=AF=B9=E7=A7=B0=E4=BA=8C?= =?UTF-8?q?=E5=8F=89=E6=A0=91=EF=BC=8C=E6=B7=BB=E5=8A=A0C#=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...60\344\272\214\345\217\211\346\240\221.md" | 47 +++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git "a/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" "b/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" index 36b39740d0..1b777dd527 100644 --- "a/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" @@ -897,6 +897,53 @@ impl Solution { } } ``` +### C# +```C# +// 递归 +public bool IsSymmetric(TreeNode root) +{ + if (root == null) return true; + return Compare(root.left, root.right); +} +public bool Compare(TreeNode left, TreeNode right) +{ + if(left == null && right != null) return false; + else if(left != null && right == null ) return false; + else if(left == null && right == null) return true; + else if(left.val != right.val) return false; + + var outside = Compare(left.left, right.right); + var inside = Compare(left.right, right.left); + + return outside&&inside; +} +``` +``` C# +// 迭代法 +public bool IsSymmetric(TreeNode root) +{ + if (root == null) return true; + var st = new Stack(); + st.Push(root.left); + st.Push(root.right); + while (st.Count != 0) + { + var left = st.Pop(); + var right = st.Pop(); + if (left == null && right == null) + continue; + + if ((left == null || right == null || (left.val != right.val))) + return false; + + st.Push(left.left); + st.Push(right.right); + st.Push(left.right); + st.Push(right.left); + } + return true; +} +```

From 6df2c5ec5cc4659d5d129b8e71e3c66fbb156784 Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Wed, 15 Nov 2023 14:20:37 +0800 Subject: [PATCH 2317/3019] Update --- ...\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" | 2 +- ...\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" | 2 +- ...\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" index 09fb97a9d8..413d984c08 100644 --- "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" +++ "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" @@ -264,7 +264,7 @@ int main() { ``` -本题力扣上没有原题,大家可以去[卡码网第46题](https://kamacoder.com/problem.php?id=1046)去练习,题意是一样的,代码如下: +本题力扣上没有原题,大家可以去[卡码网第46题](https://kamacoder.com/problempage.php?pid=1046)去练习,题意是一样的,代码如下: ```CPP diff --git "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" index 674166a199..5630bc99d1 100644 --- "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" +++ "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" @@ -183,7 +183,7 @@ int main() { ``` -本题力扣上没有原题,大家可以去[卡码网第46题](https://kamacoder.com/problem.php?id=1046)去练习,题意是一样的,代码如下: +本题力扣上没有原题,大家可以去[卡码网第46题](https://kamacoder.com/problempage.php?pid=1046)去练习,题意是一样的,代码如下: ```CPP // 一维dp数组实现 diff --git "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" index 92e944cc49..efc56c50ac 100644 --- "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" +++ "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" @@ -164,7 +164,7 @@ int main() { ``` -本题力扣上没有原题,大家可以去[卡码网第52题](https://kamacoder.com/problem.php?id=1052)去练习,题意是一样的,C++代码如下: +本题力扣上没有原题,大家可以去[卡码网第52题](https://kamacoder.com/problempage.php?pid=1052)去练习,题意是一样的,C++代码如下: ```cpp #include From 3ffca338cafa5ba72d81048d762211488f7d19f7 Mon Sep 17 00:00:00 2001 From: eeee0717 <70054568+eeee0717@users.noreply.github.com> Date: Thu, 16 Nov 2023 09:12:06 +0800 Subject: [PATCH 2318/3019] =?UTF-8?q?Update104.=E4=BA=8C=E5=8F=89=E6=A0=91?= =?UTF-8?q?=E7=9A=84=E6=9C=80=E5=A4=A7=E6=B7=B1=E5=BA=A6=EF=BC=8C=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0C#=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...00\345\244\247\346\267\261\345\272\246.md" | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git "a/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" "b/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" index 0504437521..ab3ce52eff 100644 --- "a/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" +++ "b/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" @@ -1022,6 +1022,61 @@ impl Solution { max_depth } ``` +### C# +```C# +// 递归法 +public int MaxDepth(TreeNode root) { + if(root == null) return 0; + + int leftDepth = MaxDepth(root.left); + int rightDepth = MaxDepth(root.right); + + return 1 + Math.Max(leftDepth, rightDepth); +} +``` +```C# +// 前序遍历 +int result = 0; +public int MaxDepth(TreeNode root) +{ + if (root == null) return result; + GetDepth(root, 1); + return result; +} +public void GetDepth(TreeNode root, int depth) +{ + result = depth > result ? depth : result; + if (root.left == null && root.right == null) return; + + if (root.left != null) + GetDepth(root.left, depth + 1); + if (root.right != null) + GetDepth(root.right, depth + 1); + return; +} +``` +```C# +// 迭代法 +public int MaxDepth(TreeNode root) +{ + int depth = 0; + Queue que = new(); + if (root == null) return depth; + que.Enqueue(root); + while (que.Count != 0) + { + int size = que.Count; + depth++; + for (int i = 0; i < size; i++) + { + var node = que.Dequeue(); + if (node.left != null) que.Enqueue(node.left); + if (node.right != null) que.Enqueue(node.right); + } + } + return depth; +} +```

From bb66452ece363f599b89761269e7311a4654404a Mon Sep 17 00:00:00 2001 From: gdstzmy <79707886+gdstzmy@users.noreply.github.com> Date: Thu, 16 Nov 2023 15:04:46 +0800 Subject: [PATCH 2319/3019] =?UTF-8?q?Update=20kama54.=E6=9B=BF=E6=8D=A2?= =?UTF-8?q?=E6=95=B0=E5=AD=97.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...77\346\215\242\346\225\260\345\255\227.md" | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git "a/problems/kama54.\346\233\277\346\215\242\346\225\260\345\255\227.md" "b/problems/kama54.\346\233\277\346\215\242\346\225\260\345\255\227.md" index d68bbc2c98..a8c557929b 100644 --- "a/problems/kama54.\346\233\277\346\215\242\346\225\260\345\255\227.md" +++ "b/problems/kama54.\346\233\277\346\215\242\346\225\260\345\255\227.md" @@ -162,6 +162,27 @@ class Main { ``` ### Go: +````go +package main + +import "fmt" + +func main(){ + var strByte []byte + + fmt.Scanln(&strByte) + + for i := 0; i < len(strByte); i++{ + if strByte[i] <= '9' && strByte[i] >= '0' { + inserElement := []byte{'n','u','m','b','e','r'} + strByte = append(strByte[:i], append(inserElement, strByte[i+1:]...)...) + i = i + len(inserElement) -1 + } + } + + fmt.Printf(string(strByte)) +} +```` From 972ca2de45f2a85baa055122944cb9c6aa4bfdcc Mon Sep 17 00:00:00 2001 From: gdstzmy <79707886+gdstzmy@users.noreply.github.com> Date: Thu, 16 Nov 2023 16:46:36 +0800 Subject: [PATCH 2320/3019] =?UTF-8?q?Update=20kama55.=E5=8F=B3=E6=97=8B?= =?UTF-8?q?=E5=AD=97=E7=AC=A6=E4=B8=B2.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...13\345\255\227\347\254\246\344\270\262.md" | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git "a/problems/kama55.\345\217\263\346\227\213\345\255\227\347\254\246\344\270\262.md" "b/problems/kama55.\345\217\263\346\227\213\345\255\227\347\254\246\344\270\262.md" index f384193001..17c97eaa3c 100644 --- "a/problems/kama55.\345\217\263\346\227\213\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/kama55.\345\217\263\346\227\213\345\255\227\347\254\246\344\270\262.md" @@ -214,6 +214,34 @@ public class Main { ### Go: +```go +package main +import "fmt" + +func reverse (strByte []byte, l, r int){ + for l < r { + strByte[l], strByte[r] = strByte[r], strByte[l] + l++ + r-- + } +} + + +func main(){ + var str string + var target int + + fmt.Scanln(&target) + fmt.Scanln(&str) + strByte := []byte(str) + + reverse(strByte, 0, len(strByte) - 1) + reverse(strByte, 0, target - 1) + reverse(strByte, target, len(strByte) - 1) + + fmt.Printf(string(strByte)) +} +``` ### JavaScript: From cfc78c3c57d5d9a8c79df710c36979700fd43064 Mon Sep 17 00:00:00 2001 From: eeee0717 <70054568+eeee0717@users.noreply.github.com> Date: Fri, 17 Nov 2023 19:33:16 +0800 Subject: [PATCH 2321/3019] =?UTF-8?q?Update111.=E4=BA=8C=E5=8F=89=E6=A0=91?= =?UTF-8?q?=E7=9A=84=E6=9C=80=E5=B0=8F=E6=B7=B1=E5=BA=A6=EF=BC=8C=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0C#=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...00\345\260\217\346\267\261\345\272\246.md" | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git "a/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" "b/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" index c4e55a0740..b27df4a626 100644 --- "a/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" +++ "b/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" @@ -708,6 +708,49 @@ impl Solution { } } ``` +### C# +```C# +// 递归 +public int MinDepth(TreeNode root) +{ + if (root == null) return 0; + int left = MinDepth(root.left); + int right = MinDepth(root.right); + if (root.left == null && root.right != null) + return 1+right; + else if(root.left!=null && root.right == null) + return 1+left; + + int res = 1 + Math.Min(left, right); + return res; +} +``` +```C# +// 迭代 +public int MinDepth(TreeNode root) +{ + if (root == null) return 0; + int depth = 0; + var que = new Queue(); + que.Enqueue(root); + while (que.Count > 0) + { + int size = que.Count; + depth++; + for (int i = 0; i < size; i++) + { + var node = que.Dequeue(); + if (node.left != null) + que.Enqueue(node.left); + if (node.right != null) + que.Enqueue(node.right); + if (node.left == null && node.right == null) + return depth; + } + } + return depth; +} +```

From 0843f2282dbcc9597bf156870149632d80def198 Mon Sep 17 00:00:00 2001 From: eeee0717 <70054568+eeee0717@users.noreply.github.com> Date: Sat, 18 Nov 2023 09:48:26 +0800 Subject: [PATCH 2322/3019] =?UTF-8?q?Update=20222.=E5=AE=8C=E5=85=A8?= =?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=A0=91=E7=9A=84=E8=8A=82=E7=82=B9=E4=B8=AA?= =?UTF-8?q?=E6=95=B0=EF=BC=8C=E6=B7=BB=E5=8A=A0C#=E9=80=92=E5=BD=92?= =?UTF-8?q?=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...02\347\202\271\344\270\252\346\225\260.md" | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git "a/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" "b/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" index d54f9b85d2..ef6e88aaae 100644 --- "a/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" +++ "b/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" @@ -867,6 +867,31 @@ impl Solution { } } ``` +### C# +```C# +// 递归 +public int CountNodes(TreeNode root) +{ + if (root == null) return 0; + var left = root.left; + var right = root.right; + int leftDepth = 0, rightDepth = 0; + while (left != null) + { + left = left.left; + leftDepth++; + } + while (right != null) + { + right = right.right; + rightDepth++; + } + if (leftDepth == rightDepth) + return (int)Math.Pow(2, leftDepth+1) - 1; + return CountNodes(root.left) + CountNodes(root.right) + 1; + +} +```

From eb0504e5305ae37f3f6f569ebde423206ea11b0f Mon Sep 17 00:00:00 2001 From: eeee0717 <70054568+eeee0717@users.noreply.github.com> Date: Sun, 19 Nov 2023 08:49:19 +0800 Subject: [PATCH 2323/3019] =?UTF-8?q?Update=20110.=E5=B9=B3=E8=A1=A1?= =?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=A0=91=EF=BC=8C=E6=B7=BB=E5=8A=A0C#?= =?UTF-8?q?=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...41\344\272\214\345\217\211\346\240\221.md" | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git "a/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" "b/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" index c7df9c8f19..41669bff7f 100644 --- "a/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" @@ -908,6 +908,31 @@ impl Solution { } } ``` +### C# +```C# +public bool IsBalanced(TreeNode root) +{ + return GetHeight(root) == -1 ? false : true; +} +public int GetHeight(TreeNode root) +{ + if (root == null) return 0; + int left = GetHeight(root.left); + if (left == -1) return -1; + int right = GetHeight(root.right); + if (right == -1) return -1; + int res; + if (Math.Abs(left - right) > 1) + { + res = -1; + } + else + { + res = 1 + Math.Max(left, right); + } + return res; +} +```

From a9923f809d7f22b5271a09764788aa6f16fa430e Mon Sep 17 00:00:00 2001 From: eeee0717 <70054568+eeee0717@users.noreply.github.com> Date: Mon, 20 Nov 2023 09:48:41 +0800 Subject: [PATCH 2324/3019] =?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=EF=BC=8C?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0C#=E9=80=92=E5=BD=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...00\346\234\211\350\267\257\345\276\204.md" | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git "a/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" "b/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" index 44c0fd85e3..9ba165c798 100644 --- "a/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" +++ "b/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" @@ -900,6 +900,43 @@ impl Solution { } } ``` +### C# +```C# +public IList BinaryTreePaths(TreeNode root) +{ + List path = new(); + List res = new(); + if (root == null) return res; + Traversal(root, path, res); + return res; +} +public void Traversal(TreeNode node, List path, List res) +{ + path.Add(node.val); + if (node.left == null && node.right == null) + { + string sPath = ""; + for (int i = 0; i < path.Count - 1; i++) + { + sPath += path[i].ToString(); + sPath += "->"; + } + sPath += path[path.Count - 1].ToString(); + res.Add(sPath); + return; + } + if (node.left != null) + { + Traversal(node.left, path, res); + path.RemoveAt(path.Count-1); + } + if (node.right != null) + { + Traversal(node.right, path, res); + path.RemoveAt(path.Count-1); + } +} +```

From 34de1fd8b0fde25caef3626bf6a848f080607aed Mon Sep 17 00:00:00 2001 From: eeee0717 <70054568+eeee0717@users.noreply.github.com> Date: Tue, 21 Nov 2023 09:07:56 +0800 Subject: [PATCH 2325/3019] =?UTF-8?q?Update=20404.=E5=B7=A6=E5=8F=B6?= =?UTF-8?q?=E5=AD=90=E4=B9=8B=E5=92=8C=EF=BC=8C=E6=B7=BB=E5=8A=A0C#?= =?UTF-8?q?=E9=80=92=E5=BD=92=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\266\345\255\220\344\271\213\345\222\214.md" | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git "a/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" "b/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" index c1ad602d5f..6dfcc886bc 100644 --- "a/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" +++ "b/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" @@ -651,6 +651,23 @@ impl Solution { } } ``` +### C# +```C# +// 递归 +public int SumOfLeftLeaves(TreeNode root) +{ + if (root == null) return 0; + + int leftValue = SumOfLeftLeaves(root.left); + if (root.left != null && root.left.left == null && root.left.right == null) + { + leftValue += root.left.val; + } + int rightValue = SumOfLeftLeaves(root.right); + return leftValue + rightValue; + +} +```

From b1d56c8cffe8fb25fc9bbf7d8f5aa768491bb68d Mon Sep 17 00:00:00 2001 From: eeee0717 <70054568+eeee0717@users.noreply.github.com> Date: Wed, 22 Nov 2023 10:02:57 +0800 Subject: [PATCH 2326/3019] =?UTF-8?q?Update=200513.=E6=89=BE=E6=A0=91?= =?UTF-8?q?=E5=B7=A6=E4=B8=8B=E6=96=B9=E7=9A=84=E5=80=BC=EF=BC=8C=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0C#=E9=80=92=E5=BD=92=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...13\350\247\222\347\232\204\345\200\274.md" | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git "a/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" "b/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" index 7ef934cc88..0e2f426633 100644 --- "a/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" +++ "b/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" @@ -684,6 +684,38 @@ impl Solution { } } ``` +### C# +```C# +//递归 +int maxDepth = -1; +int res = 0; +public int FindBottomLeftValue(TreeNode root) +{ + Traversal(root, 0); + return res; +} +public void Traversal(TreeNode root, int depth) +{ + if (root.left == null && root.right == null) + { + if (depth > maxDepth) + { + maxDepth = depth; + res = root.val; + } + return; + } + if (root.left != null) + { + Traversal(root.left, depth + 1); + } + if (root.right != null) + { + Traversal(root.right, depth + 1); + } + return; +} +```

From 14906d78cb92a8bbfd034634c80daf1a5fa355f0 Mon Sep 17 00:00:00 2001 From: han854 <1229369094@qq.com> Date: Wed, 22 Nov 2023 16:08:00 +0800 Subject: [PATCH 2327/3019] =?UTF-8?q?=E4=BF=AE=E6=AD=A30070.=E7=88=AC?= =?UTF-8?q?=E6=A5=BC=E6=A2=AF=E5=AE=8C=E5=85=A8=E8=83=8C=E5=8C=85=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E4=BB=A3=E7=A0=81=E6=B3=A8=E9=87=8A=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...05\250\350\203\214\345\214\205\347\211\210\346\234\254.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/problems/0070.\347\210\254\346\245\274\346\242\257\345\256\214\345\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md" "b/problems/0070.\347\210\254\346\245\274\346\242\257\345\256\214\345\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md" index 0da1ebeca5..26af256973 100644 --- "a/problems/0070.\347\210\254\346\245\274\346\242\257\345\256\214\345\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md" +++ "b/problems/0070.\347\210\254\346\245\274\346\242\257\345\256\214\345\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md" @@ -100,8 +100,8 @@ int main() { while (cin >> n >> m) { vector dp(n + 1, 0); dp[0] = 1; - for (int i = 1; i <= n; i++) { // 遍历物品 - for (int j = 1; j <= m; j++) { // 遍历背包 + for (int i = 1; i <= n; i++) { // 遍历背包 + for (int j = 1; j <= m; j++) { // 遍历物品 if (i - j >= 0) dp[i] += dp[i - j]; } } From 0d993075669743879b59c8a549783604dbbb7b2f Mon Sep 17 00:00:00 2001 From: eeee0717 <70054568+eeee0717@users.noreply.github.com> Date: Thu, 23 Nov 2023 09:38:13 +0800 Subject: [PATCH 2328/3019] =?UTF-8?q?Update0112.=E8=B7=AF=E5=BE=84?= =?UTF-8?q?=E6=80=BB=E5=92=8C=EF=BC=8C=E6=B7=BB=E5=8A=A0C#=E9=80=92?= =?UTF-8?q?=E5=BD=92=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...50\267\257\345\276\204\346\200\273\345\222\214.md" | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git "a/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" "b/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" index be03f719e1..f1ce7637ba 100644 --- "a/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" +++ "b/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" @@ -1511,6 +1511,17 @@ impl Solution { } } +``` +### C# +```C# +// 0112.路径总和 +// 递归 +public bool HasPathSum(TreeNode root, int targetSum) +{ + if (root == null) return false; + if (root.left == null && root.right == null && targetSum == root.val) return true; + return HasPathSum(root.left, targetSum - root.val) || HasPathSum(root.right, targetSum - root.val); +} ```

From fe99dff9d328277913ab36703472e2f8a20b8fb6 Mon Sep 17 00:00:00 2001 From: John Li Date: Thu, 23 Nov 2023 19:01:59 +0800 Subject: [PATCH 2329/3019] =?UTF-8?q?Updata=20494=20=E4=BC=98=E5=8C=96?= =?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/0494.\347\233\256\346\240\207\345\222\214.md" | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git "a/problems/0494.\347\233\256\346\240\207\345\222\214.md" "b/problems/0494.\347\233\256\346\240\207\345\222\214.md" index a90a38f71d..1a4dda2b0a 100644 --- "a/problems/0494.\347\233\256\346\240\207\345\222\214.md" +++ "b/problems/0494.\347\233\256\346\240\207\345\222\214.md" @@ -325,10 +325,8 @@ class Solution { // 初始化最上行(dp[0][j]),当nums[0] == j时(注意nums[0]和j都一定是大于等于零的,因此不需要判断等于-j时的情况),有唯一一种取法可取到j,dp[0][j]此时等于1 // 其他情况dp[0][j] = 0 // java整数数组默认初始值为0 - for(int j = 0; j <= left; j++) { - if(nums[0] == j) { - dp[0][j] = 1; - } + if (nums[0] <= left) { + dp[0][nums[0]] = 1; } // 初始化最左列(dp[i][0]) From 9b40338d80bf51f41a14b5579bb61663ebb41d8c Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Fri, 24 Nov 2023 09:46:55 +0800 Subject: [PATCH 2330/3019] Update --- "problems/kama53.\345\257\273\345\256\235.md" | 155 ++++++++++++++++++ ...06\350\256\272\345\237\272\347\241\200.md" | 2 +- ...06\350\256\272\345\237\272\347\241\200.md" | 52 ++++-- 3 files changed, 196 insertions(+), 13 deletions(-) create mode 100644 "problems/kama53.\345\257\273\345\256\235.md" diff --git "a/problems/kama53.\345\257\273\345\256\235.md" "b/problems/kama53.\345\257\273\345\256\235.md" new file mode 100644 index 0000000000..b52ac374be --- /dev/null +++ "b/problems/kama53.\345\257\273\345\256\235.md" @@ -0,0 +1,155 @@ + + +如果你的图相对较小且比较密集,而且你更注重简单性和空间效率,数组实现可能更合适。 + +如果你的图规模较大,尤其是在稀疏图中,而且你更注重时间效率和通用性,优先级队列实现可能更合适。 + +其关键 在于弄清楚 minDist 的定义 + +```CPP + +#include +#include +#include +#include + +using namespace std; + +// 定义图的邻接矩阵表示 +const int INF = INT_MAX; // 表示无穷大 +typedef vector> Graph; + +// 使用Prim算法找到最小生成树 +void primMST(const Graph& graph, int startVertex) { + int V = graph.size(); + + // 存储顶点是否在最小生成树中 + vector inMST(V, false); + + // 存储最小生成树的边权重 + vector key(V, INF); + + // 优先队列,存储边权重和目标顶点 + priority_queue, vector>, greater>> pq; + + // 初始顶点的权重设为0,加入优先队列 + key[startVertex] = 0; + pq.push({0, startVertex}); + + while (!pq.empty()) { + // 从优先队列中取出权重最小的边 + int u = pq.top().second; + pq.pop(); + + // 将顶点u标记为在最小生成树中 + inMST[u] = true; + + // 遍历u的所有邻居 + for (int v = 0; v < V; ++v) { + // 如果v未在最小生成树中,且u到v的权重小于v的当前权重 + if (!inMST[v] && graph[u][v] < key[v]) { + // 更新v的权重为u到v的权重 + key[v] = graph[u][v]; + // 将(u, v)添加到最小生成树 + pq.push({key[v], v}); + } + } + } + + // 输出最小生成树的边 + cout << "Edges in the Minimum Spanning Tree:\n"; + for (int i = 1; i < V; ++i) { + cout << i << " - " << key[i] << " - " << i << "\n"; + } +} + +int main() { + // 例子:无向图的邻接矩阵表示 + Graph graph = { + {0, 2, 0, 6, 0}, + {2, 0, 3, 8, 5}, + {0, 3, 0, 0, 7}, + {6, 8, 0, 0, 9}, + {0, 5, 7, 9, 0} + }; + + // 从顶点0开始运行Prim算法 + primMST(graph, 0); + + return 0; +} +``` + + +```CPP +#include +#include +#include + +using namespace std; + +// 定义图的邻接矩阵表示 +const int INF = INT_MAX; // 表示无穷大 +typedef vector> Graph; + +// 使用Prim算法找到最小生成树 +void primMST(const Graph& graph, int startVertex) { + int V = graph.size(); + + // 存储顶点是否在最小生成树中 + vector inMST(V, false); + + // 存储每个顶点的权重 + vector key(V, INF); + + // 初始化起始顶点的权重为0 + key[startVertex] = 0; + + // 存储最小生成树的边权重 + vector parent(V, -1); + + // 构建最小生成树 + for (int count = 0; count < V - 1; ++count) { + // 从未在最小生成树中的顶点中找到权重最小的顶点 + int u = -1; + for (int v = 0; v < V; ++v) { + if (!inMST[v] && (u == -1 || key[v] < key[u])) { + u = v; + } + } + + // 将顶点u标记为在最小生成树中 + inMST[u] = true; + + // 更新u的邻居的权重和父节点 + for (int v = 0; v < V; ++v) { + if (graph[u][v] != 0 && !inMST[v] && graph[u][v] < key[v]) { + key[v] = graph[u][v]; + parent[v] = u; + } + } + } + + // 输出最小生成树的边 + cout << "Edges in the Minimum Spanning Tree:\n"; + for (int i = 1; i < V; ++i) { + cout << parent[i] << " - " << key[i] << " - " << i << "\n"; + } +} + +int main() { + // 例子:无向图的邻接矩阵表示 + Graph graph = { + {0, 2, 0, 6, 0}, + {2, 0, 3, 8, 5}, + {0, 3, 0, 0, 7}, + {6, 8, 0, 0, 9}, + {0, 5, 7, 9, 0} + }; + + // 从顶点0开始运行Prim算法 + primMST(graph, 0); + + return 0; +} +``` diff --git "a/problems/\345\223\210\345\270\214\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\345\223\210\345\270\214\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" index 3055875a11..e426c65791 100644 --- "a/problems/\345\223\210\345\270\214\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\345\223\210\345\270\214\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -42,7 +42,7 @@ 如果hashCode得到的数值大于 哈希表的大小了,也就是大于tableSize了,怎么办呢? -此时为了保证映射出来的索引数值都落在哈希表上,我们会在再次对数值做一个取模的操作,就要我们就保证了学生姓名一定可以映射到哈希表上了。 +此时为了保证映射出来的索引数值都落在哈希表上,我们会在再次对数值做一个取模的操作,这样我们就保证了学生姓名一定可以映射到哈希表上了。 此时问题又来了,哈希表我们刚刚说过,就是一个数组。 diff --git "a/problems/\345\233\276\350\256\272\345\271\266\346\237\245\351\233\206\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\345\233\276\350\256\272\345\271\266\346\237\245\351\233\206\347\220\206\350\256\272\345\237\272\347\241\200.md" index 2c14f49037..347bf58f13 100644 --- "a/problems/\345\233\276\350\256\272\345\271\266\346\237\245\351\233\206\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\345\233\276\350\256\272\345\271\266\346\237\245\351\233\206\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -274,27 +274,53 @@ join(3, 2); 通过以上讲解之后,我在带大家一步一步去画一下,并查集内部数据连接方式。 -注意:为了让录友们了解基础并查集的操作,不至于混乱,**以下模拟过程中不考虑路径压缩的过程**,了解基础并查集操作后,路径压缩也很容易理解。 +1、`join(1, 8);` -我们先通过一些列的join操作,将两两元素分别放入同一个集合中。 +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20231122112727.png) -```CPP -join(1, 8); -join(3, 8); -join(1, 7); -join(8, 5); -join(2, 9); -join(6, 2); -``` -此时我们生成的的有向图为: +2、`join(3, 8);` -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20230910203210.png) +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20231122113857.png) 有录友可能想,`join(3, 8)` 在图中为什么 将 元素1 连向元素 3 而不是将 元素 8 连向 元素 3 呢? 这一点 我在 「常见误区」标题下已经详细讲解了,因为在`join(int u, int v)`函数里 要分别对 u 和 v 寻根之后再进行关联。 +3、`join(1, 7);` + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20231122114108.png) + + +4、`join(8, 5);` + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20231122114847.png) + +这里8的根是3,那么 5 应该指向 8 的根 3,这里的原因,我们在上面「常见误区」已经讲过了。 但 为什么 图中 8 又直接指向了 3 了呢? + +**因为路经压缩了** + +即如下代码在寻找跟的过程中,会有路径压缩,减少 下次查询的路径长度。 + +``` +// 并查集里寻根的过程 +int find(int u) { + return u == father[u] ? u : father[u] = find(father[u]); // 路径压缩 +} +``` + +5、`join(2, 9);` + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20231122115000.png) + +6、`join(6, 9);` + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20231122115404.png) + +这里为什么是 2 指向了 6,因为 9的根为 2,所以用2指向6。 + + + 大家看懂这个有向图后,相信应该知道如下函数的返回值了。 ```CPP @@ -309,6 +335,8 @@ true false ``` + + ## 拓展 From 734616dff0402cf35029835fcf71c1ce2527509e Mon Sep 17 00:00:00 2001 From: eeee0717 <70054568+eeee0717@users.noreply.github.com> Date: Fri, 24 Nov 2023 19:01:11 +0800 Subject: [PATCH 2331/3019] =?UTF-8?q?Update=200106.=E6=B7=BB=E5=8A=A0C#?= =?UTF-8?q?=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\200\240\344\272\214\345\217\211\346\240\221.md" | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git "a/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" "b/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" index 0144fc5c05..dc517480a6 100644 --- "a/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" @@ -1228,6 +1228,19 @@ impl Solution { } } ``` +### C# +```C# +public TreeNode BuildTree(int[] inorder, int[] postorder) +{ + if (inorder.Length == 0 || postorder.Length == null) return null; + int rootValue = postorder.Last(); + TreeNode root = new TreeNode(rootValue); + int delimiterIndex = Array.IndexOf(inorder, rootValue); + root.left = BuildTree(inorder.Take(delimiterIndex).ToArray(), postorder.Take(delimiterIndex).ToArray()); + root.right = BuildTree(inorder.Skip(delimiterIndex + 1).ToArray(), postorder.Skip(delimiterIndex).Take(inorder.Length - delimiterIndex - 1).ToArray()); + return root; +} +```

From cbb3cf962c4d223296d760cfaaad89e484b77f86 Mon Sep 17 00:00:00 2001 From: eeee0717 <70054568+eeee0717@users.noreply.github.com> Date: Sat, 25 Nov 2023 09:55:40 +0800 Subject: [PATCH 2332/3019] =?UTF-8?q?Update=200654.=E6=9C=80=E5=A4=A7?= =?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=A0=91=EF=BC=8C=E6=B7=BB=E5=8A=A0C#?= =?UTF-8?q?=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...44\247\344\272\214\345\217\211\346\240\221.md" | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git "a/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" "b/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" index 77d7980f3d..6b343840f9 100644 --- "a/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" @@ -582,6 +582,21 @@ impl Solution { } } ``` +### C# +```C# +public TreeNode ConstructMaximumBinaryTree(int[] nums) +{ + if (nums.Length == 0) return null; + int rootValue = nums.Max(); + TreeNode root = new TreeNode(rootValue); + int rootIndex = Array.IndexOf(nums, rootValue); + + root.left = ConstructMaximumBinaryTree(nums.Take(rootIndex).ToArray()); + root.right = ConstructMaximumBinaryTree(nums.Skip(rootIndex + 1).ToArray()); + return root; + +} +```

From 26816ec04f90ffcfcf7c0377ac456938dddaa2e2 Mon Sep 17 00:00:00 2001 From: eeee0717 <70054568+eeee0717@users.noreply.github.com> Date: Sun, 26 Nov 2023 10:29:53 +0800 Subject: [PATCH 2333/3019] =?UTF-8?q?Update=200617.=E5=90=88=E5=B9=B6?= =?UTF-8?q?=E6=9C=80=E5=A4=A7=E4=BA=8C=E5=8F=89=E6=A0=91=EF=BC=8C=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0C#=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...271\266\344\272\214\345\217\211\346\240\221.md" | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git "a/problems/0617.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md" "b/problems/0617.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md" index 18839a2638..9efeb56db9 100644 --- "a/problems/0617.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0617.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md" @@ -788,6 +788,20 @@ impl Solution { } } ``` +### C# +```C# +public TreeNode MergeTrees(TreeNode root1, TreeNode root2) +{ + if (root1 == null) return root2; + if (root2 == null) return root1; + + root1.val += root2.val; + root1.left = MergeTrees(root1.left, root2.left); + root1.right = MergeTrees(root1.right, root2.right); + + return root1; +} +```

From ca89ca30975554cd3130eb6a2f6101c80723f99f Mon Sep 17 00:00:00 2001 From: eeee0717 Date: Mon, 27 Nov 2023 10:16:15 +0800 Subject: [PATCH 2334/3019] =?UTF-8?q?Update=200700.=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=90=9C=E7=B4=A2=E6=A0=91=EF=BC=8C=E6=B7=BB=E5=8A=A0C#?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...55\347\232\204\346\220\234\347\264\242.md" | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git "a/problems/0700.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\220\234\347\264\242.md" "b/problems/0700.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\220\234\347\264\242.md" index bc21bab872..65e6921915 100644 --- "a/problems/0700.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\220\234\347\264\242.md" +++ "b/problems/0700.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\220\234\347\264\242.md" @@ -464,6 +464,28 @@ impl Solution { } } ``` +### C# +```C# +// 递归 +public TreeNode SearchBST(TreeNode root, int val) +{ + if (root == null || root.val == val) return root; + if (root.val > val) return SearchBST(root.left, val); + if (root.val < val) return SearchBST(root.right, val); + return null; +} +// 迭代 +public TreeNode SearchBST(TreeNode root, int val) +{ + while (root != null) + { + if (root.val > val) root = root.left; + else if (root.val < val) root = root.right; + else return root; + } + return null; +} +```

From 7aef42def84ef94f198eedd85a946130319264da Mon Sep 17 00:00:00 2001 From: eeee0717 Date: Tue, 28 Nov 2023 10:17:25 +0800 Subject: [PATCH 2335/3019] =?UTF-8?q?Update=200098.=E9=AA=8C=E8=AF=81?= =?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=90=9C=E7=B4=A2=E6=A0=91=EF=BC=8C=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0C#=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...217\211\346\220\234\347\264\242\346\240\221.md" | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git "a/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" index 184060a5cd..319ad1aaa1 100644 --- "a/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" +++ "b/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" @@ -791,6 +791,20 @@ impl Solution { } } ``` +### C# +```C# +// 递归 +public long val = Int64.MinValue; +public bool IsValidBST(TreeNode root) +{ + if (root == null) return true; + bool left = IsValidBST(root.left); + if (root.val > val) val = root.val; + else return false; + bool right = IsValidBST(root.right); + return left && right; +} +```

From b19af70230cd250a6a675037c79bd693812c5dfe Mon Sep 17 00:00:00 2001 From: jycoast <42469825+jycoast@users.noreply.github.com> Date: Tue, 28 Nov 2023 10:38:26 +0800 Subject: [PATCH 2336/3019] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E9=94=99=E5=88=AB?= =?UTF-8?q?=E5=AD=97=E2=80=9C=E5=8F=88=E5=AD=A9=E5=AD=90=E2=80=9D=E4=B8=BA?= =?UTF-8?q?=E2=80=9C=E5=8F=B3=E5=AD=A9=E5=AD=90=E2=80=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" "b/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" index 3646488912..f616ec7417 100644 --- "a/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" +++ "b/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" @@ -266,7 +266,7 @@ class Solution { // 3.状态标记递归 // 执行用时:0 ms , 在所有 Java 提交中击败了 100% 的用户 - // 不偷:Max(左孩子不偷,左孩子偷) + Max(又孩子不偷,右孩子偷) + // 不偷:Max(左孩子不偷,左孩子偷) + Max(右孩子不偷,右孩子偷) // root[0] = Math.max(rob(root.left)[0], rob(root.left)[1]) + // Math.max(rob(root.right)[0], rob(root.right)[1]) // 偷:左孩子不偷+ 右孩子不偷 + 当前节点偷 From 1043b7740efd324cdfa53655cd897bb16ec4d159 Mon Sep 17 00:00:00 2001 From: Echo0701 <133868458+Echo0701@users.noreply.github.com> Date: Tue, 28 Nov 2023 21:51:45 +0800 Subject: [PATCH 2337/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B00070.=E7=88=AC?= =?UTF-8?q?=E6=A5=BC=E6=A2=AF=E5=AE=8C=E5=85=A8=E8=83=8C=E5=8C=85=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E7=9A=84=20Java=20=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 --- ...14\345\214\205\347\211\210\346\234\254.md" | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git "a/problems/0070.\347\210\254\346\245\274\346\242\257\345\256\214\345\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md" "b/problems/0070.\347\210\254\346\245\274\346\242\257\345\256\214\345\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md" index 26af256973..93a336ab93 100644 --- "a/problems/0070.\347\210\254\346\245\274\346\242\257\345\256\214\345\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md" +++ "b/problems/0070.\347\210\254\346\245\274\346\242\257\345\256\214\345\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md" @@ -139,6 +139,30 @@ int main() { ### Java: +```Java +import java.util.Scanner; +class climbStairs{ + public static void main(String [] args){ + Scanner sc=new Scanner(System.in); + int m, n; + while(sc.hasNextInt()){ + // 从键盘输入参数,中间用空格隔开 + n = sc.nextInt(); + m = sc.nextInt(); + + // 求排列问题,先遍历背包再遍历物品 + int[] dp = new int[n + 1]; + dp[0] = 1; + for (int j = 1; j <= n; j++) { + for (int i = 1; i <= m; i++) { + if (j - i >= 0) dp[j] += dp[j - i]; + } + } + System.out.println(dp[n]); + } + } +} +``` ### Python3: From 71dd313eebbda6936ee31323798ba6ca8f5d3941 Mon Sep 17 00:00:00 2001 From: Echo0701 <133868458+Echo0701@users.noreply.github.com> Date: Tue, 28 Nov 2023 22:06:53 +0800 Subject: [PATCH 2338/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B00070.=E7=88=AC?= =?UTF-8?q?=E6=A5=BC=E6=A2=AF=E5=AE=8C=E5=85=A8=E8=83=8C=E5=8C=85=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E7=9A=84=20Java=20=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 --- ...05\250\350\203\214\345\214\205\347\211\210\346\234\254.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/problems/0070.\347\210\254\346\245\274\346\242\257\345\256\214\345\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md" "b/problems/0070.\347\210\254\346\245\274\346\242\257\345\256\214\345\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md" index 93a336ab93..f8337cc048 100644 --- "a/problems/0070.\347\210\254\346\245\274\346\242\257\345\256\214\345\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md" +++ "b/problems/0070.\347\210\254\346\245\274\346\242\257\345\256\214\345\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md" @@ -143,9 +143,9 @@ int main() { import java.util.Scanner; class climbStairs{ public static void main(String [] args){ - Scanner sc=new Scanner(System.in); + Scanner sc = new Scanner(System.in); int m, n; - while(sc.hasNextInt()){ + while (sc.hasNextInt()) { // 从键盘输入参数,中间用空格隔开 n = sc.nextInt(); m = sc.nextInt(); From bc7f72cad70d1459f290a85f02447c43939606d3 Mon Sep 17 00:00:00 2001 From: eeee0717 Date: Wed, 29 Nov 2023 09:05:34 +0800 Subject: [PATCH 2339/3019] =?UTF-8?q?Update=20530.=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=90=9C=E7=B4=A2=E6=A0=91=E7=9A=84=E6=9C=80=E5=B0=8F=E7=BB=9D?= =?UTF-8?q?=E5=AF=B9=E5=B7=AE=EF=BC=8C=E6=B7=BB=E5=8A=A0C#=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...17\347\273\235\345\257\271\345\267\256.md" | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git "a/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" "b/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" index 56911858dd..f08df577d9 100644 --- "a/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" +++ "b/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" @@ -647,6 +647,27 @@ impl Solution { } } ``` +### C# +```C# +// 递归 +public class Solution +{ + public List res = new List(); + public int GetMinimumDifference(TreeNode root) + { + Traversal(root); + return res.SelectMany((x, i) => res.Skip(i + 1).Select(y => Math.Abs(x - y))).Min(); + + } + public void Traversal(TreeNode root) + { + if (root == null) return; + Traversal(root.left); + res.Add(root.val); + Traversal(root.right); + } +} +```

From 26df976d6297777e5f984746f72ad9f453e13e0b Mon Sep 17 00:00:00 2001 From: QZ-z <55394467+QZ-z@users.noreply.github.com> Date: Wed, 29 Nov 2023 13:17:40 +0800 Subject: [PATCH 2340/3019] =?UTF-8?q?Update=200019.=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E9=93=BE=E8=A1=A8=E7=9A=84=E5=80=92=E6=95=B0=E7=AC=ACN?= =?UTF-8?q?=E4=B8=AA=E8=8A=82=E7=82=B9.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修改java程序快指针代码,删除循环条件中的= --- ...225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" "b/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" index 28bb61eea4..f508b523e3 100644 --- "a/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" +++ "b/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" @@ -106,7 +106,7 @@ public ListNode removeNthFromEnd(ListNode head, int n){ ListNode slowIndex = dummyNode; // 只要快慢指针相差 n 个结点即可 - for (int i = 0; i <= n ; i++){ + for (int i = 0; i < n ; i++){ fastIndex = fastIndex.next; } From 22ae299a273f69ebbc7411309b9dfee3c2e2a9d3 Mon Sep 17 00:00:00 2001 From: Echo0701 <133868458+Echo0701@users.noreply.github.com> Date: Thu, 30 Nov 2023 18:48:52 +0800 Subject: [PATCH 2341/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E8=83=8C=E5=8C=85?= =?UTF-8?q?=E9=97=AE=E9=A2=98=E7=90=86=E8=AE=BA=E5=9F=BA=E7=A1=80=E5=A4=9A?= =?UTF-8?q?=E9=87=8D=E8=83=8C=E5=8C=85=E7=9A=84=20Java=20=E8=AF=AD?= =?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 --- ...32\351\207\215\350\203\214\345\214\205.md" | 38 ++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\244\232\351\207\215\350\203\214\345\214\205.md" "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\244\232\351\207\215\350\203\214\345\214\205.md" index b19b52731a..5d6440e3bf 100644 --- "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\244\232\351\207\215\350\203\214\345\214\205.md" +++ "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\244\232\351\207\215\350\203\214\345\214\205.md" @@ -165,7 +165,43 @@ int main() { ### Java: - +```Java +import java.util.Scanner; +class multi_pack{ + public static void main(String [] args) { + Scanner sc = new Scanner(System.in); + + /** + * bagWeight:背包容量 + * n:物品种类 + */ + int bagWeight, n; + + //获取用户输入数据,中间用空格隔开,回车键换行 + bagWeight = sc.nextInt(); + n = sc.nextInt(); + int[] weight = new int[n]; + int[] value = new int[n]; + int[] nums = new int[n]; + for (int i = 0; i < n; i++) weight[i] = sc.nextInt(); + for (int i = 0; i < n; i++) value[i] = sc.nextInt(); + for (int i = 0; i < n; i++) nums[i] = sc.nextInt(); + + int[] dp = new int[bagWeight + 1]; + + //先遍历物品再遍历背包,作为01背包处理 + for (int i = 0; i < n; i++) { + for (int j = bagWeight; j >= weight[i]; j--) { + //遍历每种物品的个数 + for (int k = 1; k <= nums[i] && (j - k * weight[i]) >= 0; k++) { + dp[j] = Math.max(dp[j], dp[j - k * weight[i]] + k * value[i]); + } + } + } + System.out.println(dp[bagWeight]); + } +} +``` ### Python: ### Go: From 0ed113487080dd4cf99d3048863f67c267af96aa Mon Sep 17 00:00:00 2001 From: eeee0717 Date: Sun, 3 Dec 2023 09:41:53 +0800 Subject: [PATCH 2342/3019] =?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?=EF=BC=8C=E6=B7=BB=E5=8A=A0C#=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...55\347\232\204\344\274\227\346\225\260.md" | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git "a/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" "b/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" index 8881200f5d..5b26d580b2 100644 --- "a/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" +++ "b/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" @@ -1009,6 +1009,46 @@ pub fn find_mode(root: Option>>) -> Vec { res } ``` +### C# +```C# +// 递归 +public class Solution +{ + public List res = new List(); + public int count = 0; + public int maxCount = 0; + public TreeNode pre = null; + public int[] FindMode(TreeNode root) + { + SearchBST(root); + return res.ToArray(); + } + public void SearchBST(TreeNode root) + { + if (root == null) return; + SearchBST(root.left); + if (pre == null) + count = 1; + else if (pre.val == root.val) + count++; + else + count = 1; + + pre = root; + if (count == maxCount) + { + res.Add(root.val); + } + else if (count > maxCount) + { + res.Clear(); + res.Add(root.val); + maxCount = count; + } + SearchBST(root.right); + } +} +```

From a0e2c5ceb06d9199bc6f2ce2eb0aa87a8ebf8fe4 Mon Sep 17 00:00:00 2001 From: eeee0717 Date: Mon, 4 Dec 2023 09:42:53 +0800 Subject: [PATCH 2343/3019] =?UTF-8?q?Update0236.=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=A0=91=E7=9A=84=E6=9C=80=E8=BF=91=E5=85=AC=E5=85=B1=E7=A5=96?= =?UTF-8?q?=E5=85=88=EF=BC=8C=E6=8F=90=E4=BA=A4C#=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\205\254\345\205\261\347\245\226\345\205\210.md" | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git "a/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" "b/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" index edb5ea3ea7..0e99f1c2fb 100644 --- "a/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" +++ "b/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" @@ -431,6 +431,19 @@ impl Solution { } } ``` +### C# +```C# +public TreeNode LowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) +{ + if (root == null || root == p || root == q) return root; + TreeNode left = LowestCommonAncestor(root.left, p, q); + TreeNode right = LowestCommonAncestor(root.right, p, q); + if (left != null && right != null) return root; + if (left == null && right != null) return right; + if (left != null && right == null) return left; + return null; +} +```

From 09e230bef32642e1e00f6223b83749a93989d70c Mon Sep 17 00:00:00 2001 From: eeee0717 Date: Tue, 5 Dec 2023 09:08:03 +0800 Subject: [PATCH 2344/3019] =?UTF-8?q?Update0235.=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=90=9C=E7=B4=A2=E6=A0=91=E7=9A=84=E6=9C=80=E8=BF=91=E5=85=AC?= =?UTF-8?q?=E5=85=B1=E7=A5=96=E5=85=88=EF=BC=8C=E6=B7=BB=E5=8A=A0C#?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...54\345\205\261\347\245\226\345\205\210.md" | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git "a/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" "b/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" index b7e92e4e80..b27a231e77 100644 --- "a/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" +++ "b/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" @@ -513,6 +513,31 @@ impl Solution { } } ``` +### C# +```C# +// 递归 +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; +} +// 迭代 +public TreeNode LowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) +{ + while (root != null) + { + if (root.val > p.val && root.val > q.val) + root = root.left; + else if (root.val < p.val && root.val < q.val) + root = root.right; + else return root; + } + return null; +} +```

From 29b7e23ac9d3c063e4e2c2e3ccf90cdf49eacf10 Mon Sep 17 00:00:00 2001 From: block <1181882120@qq.com> Date: Tue, 5 Dec 2023 09:57:09 +0800 Subject: [PATCH 2345/3019] Update minimum deepth doc --- ...\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" "b/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" index b27df4a626..465233493d 100644 --- "a/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" +++ "b/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" @@ -50,7 +50,7 @@ ![111.二叉树的最小深度](https://code-thinking.cdn.bcebos.com/pics/111.%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E6%9C%80%E5%B0%8F%E6%B7%B1%E5%BA%A6.png) -这就重新审题了,题目中说的是:**最小深度是从根节点到最近叶子节点的最短路径上的节点数量。**,注意是**叶子节点**。 +这就重新审题了,题目中说的是:**最小深度是从根节点到最近叶子节点的最短路径上的节点数量。**注意是**叶子节点**。 什么是叶子节点,左右孩子都为空的节点才是叶子节点! From a18bca36254163df96b811b8598f2d07081369ec Mon Sep 17 00:00:00 2001 From: LePing Huang <94521862+hlp777@users.noreply.github.com> Date: Tue, 5 Dec 2023 16:52:40 +0800 Subject: [PATCH 2346/3019] =?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 最新力扣新增测试案例 nums = [0] 预期输出 1 实际输出 0 就是nums.length == 0 时 要return 1 --- ...\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" "b/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" index 677c72c6dd..64f75291f5 100644 --- "a/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" @@ -130,7 +130,7 @@ public: class Solution { public int lengthOfLIS(int[] nums) { int[] dp = new int[nums.length]; - int res = 0; + int res = 1; Arrays.fill(dp, 1); for (int i = 1; i < dp.length; i++) { for (int j = 0; j < i; j++) { From 35322cb120cd2d64e1e760eb6662fa68dded9e2b Mon Sep 17 00:00:00 2001 From: eeee0717 Date: Wed, 6 Dec 2023 09:05:08 +0800 Subject: [PATCH 2347/3019] =?UTF-8?q?Update0701.=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=EF=BC=8C=E6=B7=BB=E5=8A=A0C#?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...46\217\222\345\205\245\346\223\215\344\275\234.md" | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git "a/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" "b/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" index 265bbb5b0d..98e60d5f5f 100644 --- "a/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" +++ "b/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" @@ -691,6 +691,17 @@ impl Solution { } } ``` +### C# +``` C# +// 递归 +public TreeNode InsertIntoBST(TreeNode root, int val) { + if (root == null) return new TreeNode(val); + + if (root.val > val) root.left = InsertIntoBST(root.left, val); + if (root.val < val) root.right = InsertIntoBST(root.right, val); + return root; +} +```

From be7fd6753a8b2a00ce24f1766c67e13f1d6ef69f Mon Sep 17 00:00:00 2001 From: freshield Date: Fri, 8 Dec 2023 06:56:25 +0800 Subject: [PATCH 2348/3019] =?UTF-8?q?=E6=96=B0=E5=A2=9E=EF=BC=9A=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E5=AD=97=E7=AC=A6=E4=B8=B2=E7=AB=A0=E8=8A=82=20->=20?= =?UTF-8?q?=E6=9B=BF=E6=8D=A2=E6=95=B0=E5=AD=97=E7=9A=84GO=E8=AF=AD?= =?UTF-8?q?=E8=A8=80=E5=8F=8C=E6=8C=87=E9=92=88=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...77\346\215\242\346\225\260\345\255\227.md" | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git "a/problems/kama54.\346\233\277\346\215\242\346\225\260\345\255\227.md" "b/problems/kama54.\346\233\277\346\215\242\346\225\260\345\255\227.md" index d5abbc4d8a..a7e0c7f099 100644 --- "a/problems/kama54.\346\233\277\346\215\242\346\225\260\345\255\227.md" +++ "b/problems/kama54.\346\233\277\346\215\242\346\225\260\345\255\227.md" @@ -183,6 +183,54 @@ func main(){ fmt.Printf(string(strByte)) } ```` +Go使用双指针解法 +````go +package main + +import "fmt" + +func replaceNumber(strByte []byte) string { + // 查看有多少字符 + numCount, oldSize := 0, len(strByte) + for i := 0; i < len(strByte); i++ { + if (strByte[i] <= '9') && (strByte[i] >= '0') { + numCount ++ + } + } + // 增加长度 + for i := 0; i < numCount; i++ { + strByte = append(strByte, []byte(" ")...) + } + tmpBytes := []byte("number") + // 双指针从后遍历 + leftP, rightP := oldSize-1, len(strByte)-1 + for leftP < rightP { + rightShift := 1 + // 如果是数字则加入number + if (strByte[leftP] <= '9') && (strByte[leftP] >= '0') { + for i, tmpByte := range tmpBytes { + strByte[rightP-len(tmpBytes)+i+1] = tmpByte + } + rightShift = len(tmpBytes) + } else { + strByte[rightP] = strByte[leftP] + } + // 更新指针 + rightP -= rightShift + leftP -= 1 + } + return string(strByte) +} + +func main(){ + var strByte []byte + fmt.Scanln(&strByte) + + newString := replaceNumber(strByte) + + fmt.Println(newString) +} +```` From 7692d6cc97a999016aa0bd023433a2e0975e262d Mon Sep 17 00:00:00 2001 From: eeee0717 Date: Fri, 8 Dec 2023 08:08:10 +0800 Subject: [PATCH 2349/3019] =?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=EF=BC=8C=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0C#?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\211\346\220\234\347\264\242\346\240\221.md" | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git "a/problems/0669.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0669.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" index 001865585d..229a2ab148 100644 --- "a/problems/0669.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" +++ "b/problems/0669.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" @@ -567,6 +567,23 @@ impl Solution { } } ``` +### C# +```C# +// 递归 +public TreeNode TrimBST(TreeNode root, int low, int high) +{ + if (root == null) return null; + if (root.val < low) + return TrimBST(root.right, low, high); + + if (root.val > high) + return TrimBST(root.left, low, high); + + root.left = TrimBST(root.left, low, high); + root.right = TrimBST(root.right, low, high); + return root; +} +```

From 3427281196aadee968f41e92ca9beca7aaf81211 Mon Sep 17 00:00:00 2001 From: freshield Date: Fri, 8 Dec 2023 12:36:49 +0800 Subject: [PATCH 2350/3019] =?UTF-8?q?Fix:=20=E4=BF=AE=E6=AD=A3markdown?= =?UTF-8?q?=E4=B8=AD=E7=9A=84tab=E4=B8=BA=E7=A9=BA=E6=A0=BC=EF=BC=8C?= =?UTF-8?q?=E6=8E=92=E9=99=A4=E6=98=BE=E7=A4=BA=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...77\346\215\242\346\225\260\345\255\227.md" | 68 +++++++++---------- 1 file changed, 34 insertions(+), 34 deletions(-) diff --git "a/problems/kama54.\346\233\277\346\215\242\346\225\260\345\255\227.md" "b/problems/kama54.\346\233\277\346\215\242\346\225\260\345\255\227.md" index a7e0c7f099..0f8daa2175 100644 --- "a/problems/kama54.\346\233\277\346\215\242\346\225\260\345\255\227.md" +++ "b/problems/kama54.\346\233\277\346\215\242\346\225\260\345\255\227.md" @@ -190,45 +190,45 @@ package main import "fmt" func replaceNumber(strByte []byte) string { - // 查看有多少字符 - numCount, oldSize := 0, len(strByte) - for i := 0; i < len(strByte); i++ { - if (strByte[i] <= '9') && (strByte[i] >= '0') { - numCount ++ - } - } - // 增加长度 - for i := 0; i < numCount; i++ { - strByte = append(strByte, []byte(" ")...) - } - tmpBytes := []byte("number") - // 双指针从后遍历 - leftP, rightP := oldSize-1, len(strByte)-1 - for leftP < rightP { - rightShift := 1 - // 如果是数字则加入number - if (strByte[leftP] <= '9') && (strByte[leftP] >= '0') { - for i, tmpByte := range tmpBytes { - strByte[rightP-len(tmpBytes)+i+1] = tmpByte - } - rightShift = len(tmpBytes) - } else { - strByte[rightP] = strByte[leftP] - } - // 更新指针 - rightP -= rightShift - leftP -= 1 - } - return string(strByte) + // 查看有多少字符 + numCount, oldSize := 0, len(strByte) + for i := 0; i < len(strByte); i++ { + if (strByte[i] <= '9') && (strByte[i] >= '0') { + numCount ++ + } + } + // 增加长度 + for i := 0; i < numCount; i++ { + strByte = append(strByte, []byte(" ")...) + } + tmpBytes := []byte("number") + // 双指针从后遍历 + leftP, rightP := oldSize-1, len(strByte)-1 + for leftP < rightP { + rightShift := 1 + // 如果是数字则加入number + if (strByte[leftP] <= '9') && (strByte[leftP] >= '0') { + for i, tmpByte := range tmpBytes { + strByte[rightP-len(tmpBytes)+i+1] = tmpByte + } + rightShift = len(tmpBytes) + } else { + strByte[rightP] = strByte[leftP] + } + // 更新指针 + rightP -= rightShift + leftP -= 1 + } + return string(strByte) } func main(){ - var strByte []byte - fmt.Scanln(&strByte) - + var strByte []byte + fmt.Scanln(&strByte) + newString := replaceNumber(strByte) - fmt.Println(newString) + fmt.Println(newString) } ```` From 5c20612aba9755626fe75688d367ebe68714d22e Mon Sep 17 00:00:00 2001 From: eat to 160 pounds <2915390277@qq.com> Date: Fri, 8 Dec 2023 20:27:07 +0800 Subject: [PATCH 2351/3019] =?UTF-8?q?feat:0322=E9=87=8D=E6=96=B0=E5=AE=89?= =?UTF-8?q?=E6=8E=92=E8=A1=8C=E7=A8=8B=20=E6=B7=BB=E5=8A=A0JavaScript?= =?UTF-8?q?=E7=89=88=E6=9C=AC=20=E5=A4=84=E7=90=86=E5=AF=B9=E8=B1=A1key?= =?UTF-8?q?=E6=97=A0=E5=BA=8F=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...11\346\216\222\350\241\214\347\250\213.md" | 70 +++++++++++++++++++ 1 file changed, 70 insertions(+) diff --git "a/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" "b/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" index d1fd46f68a..1473ed0505 100644 --- "a/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" +++ "b/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" @@ -562,6 +562,7 @@ func findItinerary(tickets [][]string) []string { ``` ### Javascript + ```Javascript var findItinerary = function(tickets) { @@ -605,6 +606,74 @@ var findItinerary = function(tickets) { ``` +**javascript版本二 处理对象key无序问题** + +```javascript +/** + * @param {string[][]} tickets + * @return {string[]} + */ +var findItinerary = function (tickets) { + const ans = ["JFK"]; + let map = {}; + // 整理每个站点的终点站信息 + tickets.forEach((t) => { + let targets = map[t[0]]; + if (!targets) { + targets = { [t[1]]: 0 }; + map[t[0]] = targets; + } + targets[t[1]] = (targets[t[1]] || 0) + 1; + }); + // 按照key字典序排序对象 + const sortObject = (obj) => { + const newObj = {}; + const keys = Object.keys(obj); + keys.sort((k1, k2) => (k1 < k2 ? -1 : 1)); + keys.forEach((key) => { + if (obj[key] !== null && typeof obj[key] === "object") { + newObj[key] = sortObject(obj[key]); + } else { + newObj[key] = obj[key]; + } + }); + return newObj; + }; + const backtrack = (tickets, targets) => { + if (ans.length === tickets.length + 1) { + return true; + } + const target = targets[ans[ans.length - 1]]; + // 没有下一站 + if (!target) { + return false; + } + // 或者在这里排序 + // const keyList = Object.keys(target).sort((k1, k2) => (k1 < k2 ? -1 : 1)); + const keyList = Object.keys(target); + for (const key of keyList) { + // 判断当前站是否还能飞 + if (target[key] > 0) { + target[key]--; + ans.push(key); + // 对象key有序 此时的行程就是字典序最小的 直接跳出 + if (backtrack(tickets, targets)) { + return true; + } + target[key]++; + ans.pop(); + } + } + return false; + }; + map = sortObject(map); + backtrack(tickets, map); + return ans; +}; +``` + + + ### TypeScript ```typescript @@ -901,3 +970,4 @@ impl Solution { + From c0c5e38d9ffe16161aceb6658ec515bd50ca57f3 Mon Sep 17 00:00:00 2001 From: eat to 160 pounds <2915390277@qq.com> Date: Fri, 8 Dec 2023 21:51:19 +0800 Subject: [PATCH 2352/3019] =?UTF-8?q?feat:=200051.N=E7=9A=87=E5=90=8E=20?= =?UTF-8?q?=E6=9B=B4=E7=AE=80=E6=B4=81=E6=B8=85=E6=99=B0=E7=9A=84javascrip?= =?UTF-8?q?t=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "problems/0051.N\347\232\207\345\220\216.md" | 114 ++++++++++--------- 1 file changed, 60 insertions(+), 54 deletions(-) diff --git "a/problems/0051.N\347\232\207\345\220\216.md" "b/problems/0051.N\347\232\207\345\220\216.md" index 6bc4fa78c6..f629079372 100644 --- "a/problems/0051.N\347\232\207\345\220\216.md" +++ "b/problems/0051.N\347\232\207\345\220\216.md" @@ -453,60 +453,66 @@ func isValid(n, row, col int, chessboard [][]string) bool { ### Javascript ```Javascript -var solveNQueens = function(n) { - function isValid(row, col, chessBoard, n) { - - for(let i = 0; i < row; i++) { - if(chessBoard[i][col] === 'Q') { - return false - } - } - - for(let i = row - 1, j = col - 1; i >= 0 && j >= 0; i--, j--) { - if(chessBoard[i][j] === 'Q') { - return false - } - } - - for(let i = row - 1, j = col + 1; i >= 0 && j < n; i--, j++) { - if(chessBoard[i][j] === 'Q') { - return false - } - } - return true - } - - function transformChessBoard(chessBoard) { - let chessBoardBack = [] - chessBoard.forEach(row => { - let rowStr = '' - row.forEach(value => { - rowStr += value - }) - chessBoardBack.push(rowStr) - }) - - return chessBoardBack - } - - let result = [] - function backtracing(row,chessBoard) { - if(row === n) { - result.push(transformChessBoard(chessBoard)) - return - } - for(let col = 0; col < n; col++) { - if(isValid(row, col, chessBoard, n)) { - chessBoard[row][col] = 'Q' - backtracing(row + 1,chessBoard) - chessBoard[row][col] = '.' - } - } - } - let chessBoard = new Array(n).fill([]).map(() => new Array(n).fill('.')) - backtracing(0,chessBoard) - return result - +/** + * @param {number} n + * @return {string[][]} + */ +var solveNQueens = function (n) { + const ans = []; + const path = []; + const matrix = new Array(n).fill(0).map(() => new Array(n).fill(".")); + // 判断是否能相互攻击 + const canAttack = (matrix, row, col) => { + let i; + let j; + // 判断正上方和正下方是否有皇后 + for (i = 0, j = col; i < n; i++) { + if (matrix[i][j] === "Q") { + return true; + } + } + // 判断正左边和正右边是否有皇后 + for (i = row, j = 0; j < n; j++) { + if (matrix[i][j] === "Q") { + return true; + } + } + // 判断左上方是否有皇后 + for (i = row - 1, j = col - 1; i >= 0 && j >= 0; i--, j--) { + if (matrix[i][j] === "Q") { + return true; + } + } + // 判断右上方是否有皇后 + for (i = row - 1, j = col + 1; i >= 0 && j < n; i--, j++) { + if (matrix[i][j] === "Q") { + return true; + } + } + return false; + }; + const backtrack = (matrix, row, col) => { + if (path.length === matrix.length) { + ans.push(path.slice()); + return; + } + for (let i = row; i < matrix.length; i++) { + for (let j = col; j < matrix.length; j++) { + // 当前位置会导致互相攻击 继续下一轮搜索 + if (canAttack(matrix, i, j)) { + continue; + } + matrix[i][j] = "Q"; + path.push(matrix[i].join("")); + // 另起一行搜索 同一行只能有一个皇后 + backtrack(matrix, i + 1, 0); + matrix[i][j] = "."; + path.pop(); + } + } + }; + backtrack(matrix, 0, 0); + return ans; }; ``` From 0e55c1b424c4dac5cb78c304f412fce9fec14e47 Mon Sep 17 00:00:00 2001 From: eeee0717 Date: Sat, 9 Dec 2023 09:35:59 +0800 Subject: [PATCH 2353/3019] =?UTF-8?q?Update0108.=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=EF=BC=8C=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?C#?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\211\346\220\234\347\264\242\346\240\221.md" | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git "a/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" index e699005edb..4ccfc5f1e1 100644 --- "a/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" +++ "b/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" @@ -530,6 +530,23 @@ impl Solution { } } ``` +### C# +```csharp +// 递归 +public TreeNode SortedArrayToBST(int[] nums) +{ + return Traversal(nums, 0, nums.Length - 1); +} +public TreeNode Traversal(int[] nums, int left, int right) +{ + if (left > right) return null; + int mid = left + (right - left) / 2; + TreeNode node = new TreeNode(nums[mid]); + node.left = Traversal(nums, left, mid - 1); + node.right = Traversal(nums, mid + 1, right); + return node; +} +```

From e59dbae465c5247ff044a7d7fecd0b1cb6e22efe Mon Sep 17 00:00:00 2001 From: eeee0717 Date: Sun, 10 Dec 2023 09:25:18 +0800 Subject: [PATCH 2354/3019] =?UTF-8?q?update538.=E6=8A=8A=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=90=9C=E7=B4=A2=E6=A0=91=E8=BD=AC=E6=8D=A2=E4=B8=BA=E7=B4=AF?= =?UTF-8?q?=E5=8A=A0=E6=A0=91=EF=BC=8C=E6=B7=BB=E5=8A=A0C#?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\272\347\264\257\345\212\240\346\240\221.md" | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git "a/problems/0538.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md" "b/problems/0538.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md" index c403c98f24..07cae1adb9 100644 --- "a/problems/0538.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md" +++ "b/problems/0538.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md" @@ -529,6 +529,23 @@ impl Solution { } } ``` +### C# +```C# +// 递归 +public class Solution +{ + int pre = 0; + public TreeNode ConvertBST(TreeNode root) + { + if (root == null) return null; + ConvertBST(root.right); + root.val += pre; + pre = root.val; + ConvertBST(root.left); + return root; + } +} +```

From 8de2e21d59d9fe68a9ac237affecf07b780c103f Mon Sep 17 00:00:00 2001 From: eeee0717 Date: Mon, 11 Dec 2023 09:35:55 +0800 Subject: [PATCH 2355/3019] =?UTF-8?q?Update0077.=E7=BB=84=E5=90=88?= =?UTF-8?q?=EF=BC=8C=E6=B7=BB=E5=8A=A0C#?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "problems/0077.\347\273\204\345\220\210.md" | 54 ++++++++++++++++++++- 1 file changed, 53 insertions(+), 1 deletion(-) diff --git "a/problems/0077.\347\273\204\345\220\210.md" "b/problems/0077.\347\273\204\345\220\210.md" index a7f00ffed9..8bca6f2496 100644 --- "a/problems/0077.\347\273\204\345\220\210.md" +++ "b/problems/0077.\347\273\204\345\220\210.md" @@ -792,7 +792,59 @@ def backtracking(result, path, n, j, k) end ``` - +### C# +```C# +// 暴力 +public class Solution +{ + public IList> res = new List>(); + public IList path = new List(); + public IList> Combine(int n, int k) + { + BackTracking(n, k, 1); + return res; + } + public void BackTracking(int n, int k, int start) + { + if (path.Count == k) + { + res.Add(new List(path)); + return; + } + for (int i = start; i <= n; i++) + { + path.Add(i); + BackTracking(n, k, i + 1); + path.RemoveAt(path.Count - 1); + } + } +} +// 剪枝 +public class Solution +{ + public IList> res = new List>(); + public IList path = new List(); + public IList> Combine(int n, int k) + { + BackTracking(n, k, 1); + return res; + } + public void BackTracking(int n, int k, int start) + { + if (path.Count == k) + { + res.Add(new List(path)); + return; + } + for (int i = start; i <= n - (k - path.Count) + 1; i++) + { + path.Add(i); + BackTracking(n, k, i + 1); + path.RemoveAt(path.Count - 1); + } + } +} +```

From d3e61f36abf8b40fa9afac4e7c414f13d8bfcec7 Mon Sep 17 00:00:00 2001 From: eeee0717 Date: Tue, 12 Dec 2023 09:20:04 +0800 Subject: [PATCH 2356/3019] =?UTF-8?q?Update0216.=E7=BB=84=E5=90=88?= =?UTF-8?q?=E6=80=BB=E5=92=8C3=EF=BC=8C=E6=B7=BB=E5=8A=A0C#?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...345\220\210\346\200\273\345\222\214III.md" | 61 ++++++++++++++++++- 1 file changed, 60 insertions(+), 1 deletion(-) diff --git "a/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" "b/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" index c0cb8860c2..ac28f9fcfa 100644 --- "a/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" +++ "b/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" @@ -633,7 +633,66 @@ object Solution { } } ``` - +### C# +```csharp +public class Solution +{ + public IList> res = new List>(); + public IList path = new List(); + public IList> CombinationSum3(int k, int n) + { + BackTracking(k, n, 0, 1); + return res; + } + public void BackTracking(int k, int n, int sum, int start) + { + if (path.Count == k) + { + if (sum == n) + res.Add(new List(path)); + return; + } + for (int i = start; i <= 9; i++) + { + sum += i; + path.Add(i); + BackTracking(k, n, sum, i + 1); + sum -= i; + path.RemoveAt(path.Count - 1); + } + } +} +// 剪枝 +public class Solution +{ + public IList> res = new List>(); + public IList path = new List(); + public IList> CombinationSum3(int k, int n) + { + BackTracking(k, n, 0, 1); + return res; + } + public void BackTracking(int k, int n, int sum, int start) + { + if (sum > n) + return; + if (path.Count == k) + { + if (sum == n) + res.Add(new List(path)); + return; + } + for (int i = start; i <= 9 - (k - path.Count) + 1; i++) + { + sum += i; + path.Add(i); + BackTracking(k, n, sum, i + 1); + sum -= i; + path.RemoveAt(path.Count - 1); + } + } +} +``` From c14df2f5779314078744090b62d9745f34de1d24 Mon Sep 17 00:00:00 2001 From: eeee0717 Date: Wed, 13 Dec 2023 09:45:51 +0800 Subject: [PATCH 2357/3019] =?UTF-8?q?Update0017.=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?=EF=BC=8C=E6=B7=BB=E5=8A=A0C#?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...27\346\257\215\347\273\204\345\220\210.md" | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git "a/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" "b/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" index 90296efdc1..a77bce4643 100644 --- "a/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" +++ "b/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" @@ -732,6 +732,38 @@ def backtracking(result, letter_map, digits, path, index) end end ``` +### C# +```C# +public class Solution +{ + public IList res = new List(); + public string s; + public string[] letterMap = new string[10] { "", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz" }; + public IList LetterCombinations(string digits) + { + if (digits.Length == 0) + return res; + BackTracking(digits, 0); + return res; + } + public void BackTracking(string digits, int index) + { + if (index == digits.Length) + { + res.Add(s); + return; + } + int digit = digits[index] - '0'; + string letters = letterMap[digit]; + for (int i = 0; i < letters.Length; i++) + { + s += letters[i]; + BackTracking(digits, index + 1); + s = s.Substring(0, s.Length - 1); + } + } +} +```

From 3b507ac7552655dc98ea198259103280e4601804 Mon Sep 17 00:00:00 2001 From: keepgogogo <57135073+keepgogogo@users.noreply.github.com> Date: Wed, 13 Dec 2023 19:04:26 +0800 Subject: [PATCH 2358/3019] =?UTF-8?q?0017.=E7=94=B5=E8=AF=9D=E5=8F=B7?= =?UTF-8?q?=E7=A0=81=E7=9A=84=E5=AD=97=E6=AF=8D=E7=BB=84=E5=90=88=E7=9A=84?= =?UTF-8?q?Java=E4=BB=A3=E7=A0=81=E6=B3=A8=E9=87=8A=E4=B8=AD=E5=B0=86Strin?= =?UTF-8?q?gBuilder=E5=86=99=E6=88=90=E4=BA=86StringBuild?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" "b/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" index 90296efdc1..076bb771ed 100644 --- "a/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" +++ "b/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" @@ -260,7 +260,7 @@ class Solution { } - //每次迭代获取一个字符串,所以会设计大量的字符串拼接,所以这里选择更为高效的 StringBuild + //每次迭代获取一个字符串,所以会设计大量的字符串拼接,所以这里选择更为高效的 StringBuilder StringBuilder temp = new StringBuilder(); //比如digits如果为"23",num 为0,则str表示2对应的 abc From dcc37da6034f3ad8166c9f06ee2ab75a3ad204e7 Mon Sep 17 00:00:00 2001 From: eeee0717 Date: Thu, 14 Dec 2023 10:01:34 +0800 Subject: [PATCH 2359/3019] =?UTF-8?q?Update0039.=E7=BB=84=E5=90=88?= =?UTF-8?q?=E7=BB=BC=E5=90=88=EF=BC=8C=E6=B7=BB=E5=8A=A0C#?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...04\345\220\210\346\200\273\345\222\214.md" | 60 +++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git "a/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" "b/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" index 37d5614e71..81558cc12c 100644 --- "a/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" +++ "b/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" @@ -598,6 +598,66 @@ object Solution { } } ``` +### C# +```csharp +public class Solution +{ + public IList> res = new List>(); + public IList path = new List(); + public IList> CombinationSum(int[] candidates, int target) + { + BackTracking(candidates, target, 0, 0); + return res; + } + public void BackTracking(int[] candidates, int target, int start, int sum) + { + if (sum > target) return; + if (sum == target) + { + res.Add(new List(path)); + return; + } + for (int i = start; i < candidates.Length; i++) + { + sum += candidates[i]; + path.Add(candidates[i]); + BackTracking(candidates, target, i, sum); + sum -= candidates[i]; + path.RemoveAt(path.Count - 1); + } + } +} + +// 剪枝优化 +public class Solution +{ + public IList> res = new List>(); + public IList path = new List(); + public IList> CombinationSum(int[] candidates, int target) + { + Array.Sort(candidates); + BackTracking(candidates, target, 0, 0); + return res; + } + public void BackTracking(int[] candidates, int target, int start, int sum) + { + if (sum > target) return; + if (sum == target) + { + res.Add(new List(path)); + return; + } + for (int i = start; i < candidates.Length && sum + candidates[i] <= target; i++) + { + sum += candidates[i]; + path.Add(candidates[i]); + BackTracking(candidates, target, i, sum); + sum -= candidates[i]; + path.RemoveAt(path.Count - 1); + } + } +} +```

From dd287478a1eaa1b2110a12775b3f72f77e9ed23a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B5=84=E6=B7=B1=E8=80=81=E8=90=8C=E6=96=B0?= <98251397+Kiro-Young@users.noreply.github.com> Date: Thu, 14 Dec 2023 14:50:53 +0800 Subject: [PATCH 2360/3019] =?UTF-8?q?Fix:=20=E4=BF=AE=E6=AD=A3=E6=A0=88?= =?UTF-8?q?=E4=B8=8E=E9=98=9F=E5=88=97=E6=80=BB=E7=BB=93.md=E7=9A=84?= =?UTF-8?q?=E4=B8=80=E5=A4=84=E9=94=99=E5=88=AB=E5=AD=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修正一处栈与队列总结.md的错别字,“本地”应该为“本题” --- ...\270\216\351\230\237\345\210\227\346\200\273\347\273\223.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/\346\240\210\344\270\216\351\230\237\345\210\227\346\200\273\347\273\223.md" "b/problems/\346\240\210\344\270\216\351\230\237\345\210\227\346\200\273\347\273\223.md" index 4e08a887ee..06a7827050 100644 --- "a/problems/\346\240\210\344\270\216\351\230\237\345\210\227\346\200\273\347\273\223.md" +++ "b/problems/\346\240\210\344\270\216\351\230\237\345\210\227\346\200\273\347\273\223.md" @@ -115,7 +115,7 @@ cd a/b/c/../../ **单调队列不是一成不变的,而是不同场景不同写法**,总之要保证队列里单调递减或递增的原则,所以叫做单调队列。 -**不要以为本地中的单调队列实现就是固定的写法。** +**不要以为本题中的单调队列实现就是固定的写法。** 我们用deque作为单调队列的底层数据结构,C++中deque是stack和queue默认的底层实现容器(这个我们之前已经讲过),deque是可以两边扩展的,而且deque里元素并不是严格的连续分布的。 From a9ed0d367200a4e85eed5f93a728fbed0f7f7b5e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B5=84=E6=B7=B1=E8=80=81=E8=90=8C=E6=96=B0?= <98251397+Kiro-Young@users.noreply.github.com> Date: Thu, 14 Dec 2023 14:59:16 +0800 Subject: [PATCH 2361/3019] =?UTF-8?q?Fix:=200347.=E5=89=8DK=E4=B8=AA?= =?UTF-8?q?=E9=AB=98=E9=A2=91=E5=85=83=E7=B4=A0.md=20Java=E9=83=A8?= =?UTF-8?q?=E5=88=86=E4=BB=A3=E7=A0=81=E9=A3=8E=E6=A0=BC=E8=A7=84=E8=8C=83?= =?UTF-8?q?=E6=94=B9=E8=BF=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fix: 0347.前K个高频元素.md Java部分代码风格规范改进;今天看示例代码觉得有点挤得难受,仔细看发现是未简化的讲解部分代码不少地方缺空格太拥挤,所以前来加一些空格便于阅读,未修改代码及其逻辑,仅方便阅读改进代码风格添加了些许空格 --- ...30\351\242\221\345\205\203\347\264\240.md" | 48 +++++++++---------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git "a/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" "b/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" index 4830f9a3f2..94b29eba3e 100644 --- "a/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" +++ "b/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" @@ -145,43 +145,43 @@ public: class Solution { //解法1:基于大顶堆实现 public int[] topKFrequent1(int[] nums, int k) { - Map map = new HashMap<>();//key为数组元素值,val为对应出现次数 - for(int num:nums){ - map.put(num,map.getOrDefault(num,0)+1); + Map map = new HashMap<>(); //key为数组元素值,val为对应出现次数 + for (int num : nums) { + map.put(num, map.getOrDefault(num,0) + 1); } - //在优先队列中存储二元组(num,cnt),cnt表示元素值num在数组中的出现次数 + //在优先队列中存储二元组(num, cnt),cnt表示元素值num在数组中的出现次数 //出现次数按从队头到队尾的顺序是从大到小排,出现次数最多的在队头(相当于大顶堆) - PriorityQueue pq = new PriorityQueue<>((pair1, pair2)->pair2[1]-pair1[1]); - for(Map.Entry entry:map.entrySet()){//大顶堆需要对所有元素进行排序 - pq.add(new int[]{entry.getKey(),entry.getValue()}); + PriorityQueue pq = new PriorityQueue<>((pair1, pair2) -> pair2[1] - pair1[1]); + for (Map.Entry entry : map.entrySet()) {//大顶堆需要对所有元素进行排序 + pq.add(new int[]{entry.getKey(), entry.getValue()}); } int[] ans = new int[k]; - for(int i=0;i map = new HashMap<>();//key为数组元素值,val为对应出现次数 - for(int num:nums){ - map.put(num,map.getOrDefault(num,0)+1); + Map map = new HashMap<>(); //key为数组元素值,val为对应出现次数 + for (int num : nums) { + map.put(num, map.getOrDefault(num, 0) + 1); } - //在优先队列中存储二元组(num,cnt),cnt表示元素值num在数组中的出现次数 + //在优先队列中存储二元组(num, cnt),cnt表示元素值num在数组中的出现次数 //出现次数按从队头到队尾的顺序是从小到大排,出现次数最低的在队头(相当于小顶堆) - PriorityQueue pq = new PriorityQueue<>((pair1,pair2)->pair1[1]-pair2[1]); - for(Map.Entry entry:map.entrySet()){//小顶堆只需要维持k个元素有序 - if(pq.size()pq.peek()[1]){//当前元素出现次数大于小顶堆的根结点(这k个元素中出现次数最少的那个) - pq.poll();//弹出队头(小顶堆的根结点),即把堆里出现次数最少的那个删除,留下的就是出现次数多的了 - pq.add(new int[]{entry.getKey(),entry.getValue()}); + PriorityQueue pq = new PriorityQueue<>((pair1, pair2) -> pair1[1] - pair2[1]); + for (Map.Entry entry : map.entrySet()) { //小顶堆只需要维持k个元素有序 + if (pq.size() < k) { //小顶堆元素个数小于k个时直接加 + pq.add(new int[]{entry.getKey(), entry.getValue()}); + } else { + if (entry.getValue() > pq.peek()[1]) { //当前元素出现次数大于小顶堆的根结点(这k个元素中出现次数最少的那个) + pq.poll(); //弹出队头(小顶堆的根结点),即把堆里出现次数最少的那个删除,留下的就是出现次数多的了 + pq.add(new int[]{entry.getKey(), entry.getValue()}); } } } int[] ans = new int[k]; - for(int i=k-1;i>=0;i--){//依次弹出小顶堆,先弹出的是堆的根,出现次数少,后面弹出的出现次数多 + for (int i = k - 1; i >= 0; i--) { //依次弹出小顶堆,先弹出的是堆的根,出现次数少,后面弹出的出现次数多 ans[i] = pq.poll()[0]; } return ans; @@ -197,8 +197,8 @@ class Solution { PriorityQueue pq = new PriorityQueue<>((o1, o2) -> o1[1] - o2[1]); int[] res = new int[k]; // 答案数组为 k 个元素 Map map = new HashMap<>(); // 记录元素出现次数 - for(int num : nums) map.put(num, map.getOrDefault(num, 0) + 1); - for(var x : map.entrySet()) { // entrySet 获取 k-v Set 集合 + for (int num : nums) map.put(num, map.getOrDefault(num, 0) + 1); + for (var x : map.entrySet()) { // entrySet 获取 k-v Set 集合 // 将 kv 转化成数组 int[] tmp = new int[2]; tmp[0] = x.getKey(); @@ -209,7 +209,7 @@ class Solution { pq.poll(); } } - for(int i = 0; i < k; i ++) { + for (int i = 0; i < k; i++) { res[i] = pq.poll()[0]; // 获取优先队列里的元素 } return res; From 2cd982fd0dd478fb20989ee2dd8c1d28377f5829 Mon Sep 17 00:00:00 2001 From: eeee0717 Date: Fri, 15 Dec 2023 10:36:34 +0800 Subject: [PATCH 2362/3019] =?UTF-8?q?Update0040.=E7=BB=84=E5=90=88?= =?UTF-8?q?=E6=80=BB=E5=92=8C2=EF=BC=8C=E6=B7=BB=E5=8A=A0C#?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\345\220\210\346\200\273\345\222\214II.md" | 34 ++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git "a/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" "b/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" index 33e4a46f51..994b04b82f 100644 --- "a/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" +++ "b/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" @@ -773,7 +773,39 @@ object Solution { } } ``` - +### C# +```csharp +public class Solution +{ + public List> res = new List>(); + public List path = new List(); + public IList> CombinationSum2(int[] candidates, int target) + { + + Array.Sort(candidates); + BackTracking(candidates, target, 0, 0); + return res; + } + public void BackTracking(int[] candidates, int target, int start, int sum) + { + if (sum > target) return; + if (sum == target) + { + res.Add(new List(path)); + return; + } + for (int i = start; i < candidates.Length && sum + candidates[i] <= target; i++) + { + if (i > start && candidates[i] == candidates[i - 1]) continue; + sum += candidates[i]; + path.Add(candidates[i]); + BackTracking(candidates, target, i + 1, sum); + sum -= candidates[i]; + path.RemoveAt(path.Count - 1); + } + } +} +```

From ed62561bc0c2e132380a2c5a548a87ad1461db3a Mon Sep 17 00:00:00 2001 From: RelishCoding <122661763+RelishCoding@users.noreply.github.com> Date: Fri, 15 Dec 2023 20:18:40 +0800 Subject: [PATCH 2363/3019] =?UTF-8?q?=E4=BC=98=E5=8C=96Java=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E6=BB=9A=E5=8A=A8=E6=95=B0=E7=BB=84=E8=A7=A3=E6=B3=95?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 个人觉得原解法中有冗余代码,具体原因一开始放issue里了:https://github.com/youngyangyang04/leetcode-master/issues/2364 --- ...4.\347\233\256\346\240\207\345\222\214.md" | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git "a/problems/0494.\347\233\256\346\240\207\345\222\214.md" "b/problems/0494.\347\233\256\346\240\207\345\222\214.md" index 1a4dda2b0a..2d38b4d06a 100644 --- "a/problems/0494.\347\233\256\346\240\207\345\222\214.md" +++ "b/problems/0494.\347\233\256\346\240\207\345\222\214.md" @@ -275,19 +275,23 @@ class Solution { public int findTargetSumWays(int[] nums, int target) { int sum = 0; for (int i = 0; i < nums.length; i++) sum += nums[i]; - //如果target过大 sum将无法满足 - if ( target < 0 && sum < -target) return 0; - if ((target + sum) % 2 != 0) return 0; - int size = (target + sum) / 2; - if(size < 0) size = -size; - int[] dp = new int[size + 1]; + + //如果target的绝对值大于sum,那么是没有方案的 + if (Math.abs(target) > sum) return 0; + //如果(target+sum)除以2的余数不为0,也是没有方案的 + if ((target + sum) % 2 == 1) return 0; + + int bagSize = (target + sum) / 2; + int[] dp = new int[bagSize + 1]; dp[0] = 1; + for (int i = 0; i < nums.length; i++) { - for (int j = size; j >= nums[i]; j--) { + for (int j = bagSize; j >= nums[i]; j--) { dp[j] += dp[j - nums[i]]; } } - return dp[size]; + + return dp[bagSize]; } } ``` From 69a38ff1d30e4eb245f6dcebf5c5d177b08e3ea4 Mon Sep 17 00:00:00 2001 From: eeee0717 Date: Sat, 16 Dec 2023 09:26:57 +0800 Subject: [PATCH 2364/3019] =?UTF-8?q?Update0131.=E5=88=86=E5=89=B2?= =?UTF-8?q?=E5=9B=9E=E6=96=87=E4=B8=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...62\345\233\236\346\226\207\344\270\262.md" | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git "a/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" "b/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" index 80ac284309..1d230ca8e4 100644 --- "a/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" +++ "b/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" @@ -847,6 +847,50 @@ object Solution { } } ``` +### CSharp +```csharp +public class Solution +{ + public IList> res = new List>(); + public IList path = new List(); + public IList> Partition(string s) + { + BackTracking(s, 0); + return res; + } + public void BackTracking(string s, int start) + { + if (start >= s.Length) + { + res.Add(new List(path)); + return; + } + + for (int i = start; i < s.Length; i++) + { + if (IsPalindrome(s, start, i)) + { + path.Add(s.Substring(start, i - start + 1)); + } + else + { + continue; + } + BackTracking(s, i + 1); + path.RemoveAt(path.Count - 1); + } + } + public bool IsPalindrome(string s, int start, int end) + { + for (int i = start, j = end; i < j; i++, j--) + { + if (s[i] != s[j]) + return false; + } + return true; + } +} +```

From 1675ea6fbee7adb3b1aefd20ea4cb9aa7ff23232 Mon Sep 17 00:00:00 2001 From: HQWQF <47740975+HQWQF@users.noreply.github.com> Date: Sat, 16 Dec 2023 16:57:54 +0800 Subject: [PATCH 2365/3019] =?UTF-8?q?Update=200024.=E4=B8=A4=E4=B8=A4?= =?UTF-8?q?=E4=BA=A4=E6=8D=A2=E9=93=BE=E8=A1=A8=E4=B8=AD=E7=9A=84=E8=8A=82?= =?UTF-8?q?=E7=82=B9.md=20=E4=BF=AE=E5=A4=8D=E6=B2=A1=E6=9C=89delete=20dum?= =?UTF-8?q?myHead=E7=9A=84=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit new了一个虚拟头结点,但没有delete它 --- ...41\250\344\270\255\347\232\204\350\212\202\347\202\271.md" | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git "a/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" "b/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" index 57034f4795..405f4183e9 100644 --- "a/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" +++ "b/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" @@ -63,7 +63,9 @@ public: cur = cur->next->next; // cur移动两位,准备下一轮交换 } - return dummyHead->next; + ListNode* result = dummyHead->next; + delete dummyHead; + return result; } }; ``` From 32843da4dc1ed914ff5e030e1c09fd4d76b0ff73 Mon Sep 17 00:00:00 2001 From: eeee0717 Date: Sun, 17 Dec 2023 09:49:30 +0800 Subject: [PATCH 2366/3019] =?UTF-8?q?Update0093.=E5=A4=8D=E5=8E=9FIP?= =?UTF-8?q?=E5=9C=B0=E5=9D=80=EF=BC=8C=E6=B7=BB=E5=8A=A0C#?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\345\216\237IP\345\234\260\345\235\200.md" | 47 +++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git "a/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" "b/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" index 59cd92da59..c662957a10 100644 --- "a/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" +++ "b/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" @@ -799,6 +799,53 @@ object Solution { } } ``` +### C# +```csharp +public class Solution +{ + public IList res = new List(); + public IList RestoreIpAddresses(string s) + { + if (s.Length < 4 || s.Length > 12) return res; + BackTracking(s, 0, 0); + return res; + } + public void BackTracking(string s, int start, int pointSum) + { + if (pointSum == 3) + { + if (IsValid(s, start, s.Length - 1)) + { + res.Add(s); + } + return; + } + for (int i = start; i < s.Length; i++) + { + if (IsValid(s, start, i)) + { + s = s.Insert(i + 1, "."); + BackTracking(s, i + 2, pointSum + 1); + s = s.Remove(i + 1, 1); + } + else break; + } + } + public bool IsValid(string s, int start, int end) + { + if (start > end) return false; + if (s[start] == '0' && start != end) return false; + int num = 0; + for (int i = start; i <= end; i++) + { + if (s[i] > '9' || s[i] < '0') return false; + num = num * 10 + s[i] - '0'; + if (num > 255) return false; + } + return true; + } +} +```

From 2d92b509e0689ce90e4460578de9772a459d3092 Mon Sep 17 00:00:00 2001 From: keepgogogo <57135073+keepgogogo@users.noreply.github.com> Date: Sun, 17 Dec 2023 14:00:00 +0800 Subject: [PATCH 2367/3019] =?UTF-8?q?=E5=9B=9E=E6=BA=AF=E7=AE=97=E6=B3=95?= =?UTF-8?q?=E7=AF=87=209=20=E5=88=86=E5=89=B2=E5=9B=9E=E6=96=87=E4=B8=B2?= =?UTF-8?q?=EF=BC=8CJava=E9=A2=98=E8=A7=A3=E7=A4=BA=E4=BE=8B=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E6=8F=90=E4=BE=9B=E4=BD=BF=E7=94=A8=E5=8A=A8=E6=80=81?= =?UTF-8?q?=E8=A7=84=E5=88=92=E4=BC=98=E5=8C=96=E5=9B=9E=E6=96=87=E4=B8=B2?= =?UTF-8?q?=E5=88=A4=E6=96=AD=E7=9A=84=E5=AE=9E=E7=8E=B0=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...62\345\233\236\346\226\207\344\270\262.md" | 59 +++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git "a/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" "b/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" index 1d230ca8e4..ca342d4bc6 100644 --- "a/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" +++ "b/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" @@ -349,6 +349,65 @@ class Solution { } ``` +### Java +回溯+动态规划优化回文串判断 +```Java +class Solution { + List> result; + LinkedList path; + boolean[][] dp; + + public List> partition(String s) { + result = new ArrayList<>(); + char[] str = s.toCharArray(); + path = new LinkedList<>(); + dp = new boolean[str.length + 1][str.length + 1]; + isPalindrome(str); + backtracking(s, 0); + return result; + } + + public void backtracking(String str, int startIndex) { + if (startIndex >= str.length()) { + //如果起始位置大于s的大小,说明找到了一组分割方案 + result.add(new ArrayList<>(path)); + } else { + for (int i = startIndex; i < str.length(); ++i) { + if (dp[startIndex][i]) { + //是回文子串,进入下一步递归 + //先将当前子串保存入path + path.addLast(str.substring(startIndex, i + 1)); + //起始位置后移,保证不重复 + backtracking(str, i + 1); + path.pollLast(); + } else { + //不是回文子串,跳过 + continue; + } + } + } + } + + //通过动态规划判断是否是回文串,参考动态规划篇 52 回文子串 + public void isPalindrome(char[] str) { + for (int i = 0; i <= str.length; ++i) { + dp[i][i] = true; + } + for (int i = 1; i < str.length; ++i) { + for (int j = i; j >= 0; --j) { + if (str[j] == str[i]) { + if (i - j <= 1) { + dp[j][i] = true; + } else if (dp[j + 1][i - 1]) { + dp[j][i] = true; + } + } + } + } + } +} +``` + ### Python 回溯 基本版 ```python From 5b5a05ada59333813312ebfe2f3f258cb9ea791f Mon Sep 17 00:00:00 2001 From: eeee0717 Date: Mon, 18 Dec 2023 09:23:42 +0800 Subject: [PATCH 2368/3019] =?UTF-8?q?Update0078.=E5=AD=90=E9=9B=86?= =?UTF-8?q?=EF=BC=8C=E6=B7=BB=E5=8A=A0C#?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "problems/0078.\345\255\220\351\233\206.md" | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git "a/problems/0078.\345\255\220\351\233\206.md" "b/problems/0078.\345\255\220\351\233\206.md" index 5f3654deae..06547e3df5 100644 --- "a/problems/0078.\345\255\220\351\233\206.md" +++ "b/problems/0078.\345\255\220\351\233\206.md" @@ -443,6 +443,27 @@ object Solution { } } ``` +### C# +```csharp +public class Solution { + public IList> res = new List>(); + public IList path = new List(); + public IList> Subsets(int[] nums) { + BackTracking(nums, 0); + return res; + } + public void BackTracking(int[] nums, int start){ + res.Add(new List(path)); + if(start > nums.Length) return; + for (int i = start; i < nums.Length; i++) + { + path.Add(nums[i]); + BackTracking(nums, i + 1); + path.RemoveAt(path.Count - 1); + } + } +} +```

From 7fdb7b17024bbfd7636dbc8100acb1687445b40b Mon Sep 17 00:00:00 2001 From: eeee0717 Date: Tue, 19 Dec 2023 09:32:06 +0800 Subject: [PATCH 2369/3019] =?UTF-8?q?Update0090.=E5=AD=90=E9=9B=862?= =?UTF-8?q?=EF=BC=8C=E6=B7=BB=E5=8A=A0C#?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "problems/0090.\345\255\220\351\233\206II.md" | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git "a/problems/0090.\345\255\220\351\233\206II.md" "b/problems/0090.\345\255\220\351\233\206II.md" index 13080cd9e7..9fc334a4d8 100644 --- "a/problems/0090.\345\255\220\351\233\206II.md" +++ "b/problems/0090.\345\255\220\351\233\206II.md" @@ -640,6 +640,31 @@ object Solution { } } ``` +### C# +```c# +public class Solution +{ + public IList> res = new List>(); + public IList path = new List(); + public IList> SubsetsWithDup(int[] nums) + { + Array.Sort(nums); + BackTracking(nums, 0); + return res; + } + public void BackTracking(int[] nums, int start) + { + res.Add(new List(path)); + for (int i = start; i < nums.Length; i++) + { + if (i > start && nums[i] == nums[i - 1]) continue; + path.Add(nums[i]); + BackTracking(nums, i + 1); + path.RemoveAt(path.Count - 1); + } + } +} +```

From f9342095c9b7d79d8c6debc165a193ddc3e39169 Mon Sep 17 00:00:00 2001 From: eeee0717 Date: Wed, 20 Dec 2023 09:26:14 +0800 Subject: [PATCH 2370/3019] =?UTF-8?q?Update0491.=E9=80=92=E5=A2=9E?= =?UTF-8?q?=E5=AD=90=E5=BA=8F=E5=88=97=EF=BC=8C=E6=B7=BB=E5=8A=A0C#?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...36\345\255\220\345\272\217\345\210\227.md" | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git "a/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" "b/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" index eb0be005ed..1aa69a3669 100644 --- "a/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" @@ -614,6 +614,32 @@ object Solution { } } ``` +### C# +```csharp +public class Solution { + public IList> res = new List>(); + public IList path = new List(); + public IList> FindSubsequences(int[] nums) { + BackTracking(nums, 0); + return res; + } + public void BackTracking(int[] nums, int start){ + if(path.Count >= 2){ + res.Add(new List(path)); + } + HashSet hs = new HashSet(); + for(int i = start; i < nums.Length; i++){ + if(path.Count > 0 && path[path.Count - 1] > nums[i] || hs.Contains(nums[i])){ + continue; + } + hs.Add(nums[i]); + path.Add(nums[i]); + BackTracking(nums, i + 1); + path.RemoveAt(path.Count - 1); + } + } +} +```

From 4ee74f12892497dce83ba6a2d7c74056d2d9216b Mon Sep 17 00:00:00 2001 From: block <1181882120@qq.com> Date: Wed, 20 Dec 2023 18:11:23 +0800 Subject: [PATCH 2371/3019] Correction document statement --- ...\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/\345\233\236\346\272\257\347\256\227\346\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\345\233\236\346\272\257\347\256\227\346\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md" index dff1823c0c..f22c67b137 100644 --- "a/problems/\345\233\236\346\272\257\347\256\227\346\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\345\233\236\346\272\257\347\256\227\346\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -65,7 +65,7 @@ **回溯法解决的问题都可以抽象为树形结构**,是的,我指的是所有回溯法的问题都可以抽象为树形结构! -因为回溯法解决的都是在集合中递归查找子集,**集合的大小就构成了树的宽度,递归的深度,都构成的树的深度**。 +因为回溯法解决的都是在集合中递归查找子集,**集合的大小就构成了树的宽度,递归的深度就构成了树的深度**。 递归就要有终止条件,所以必然是一棵高度有限的树(N叉树)。 From eff7a7a9b27cf76d530a253bdfb0b9824e768a3a Mon Sep 17 00:00:00 2001 From: eeee0717 Date: Thu, 21 Dec 2023 09:36:09 +0800 Subject: [PATCH 2372/3019] =?UTF-8?q?Update0046.=E5=85=A8=E6=8E=92?= =?UTF-8?q?=E5=88=97=EF=BC=8C=E6=B7=BB=E5=8A=A0C#?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...6.\345\205\250\346\216\222\345\210\227.md" | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git "a/problems/0046.\345\205\250\346\216\222\345\210\227.md" "b/problems/0046.\345\205\250\346\216\222\345\210\227.md" index 1f5263a79e..15e6ae162a 100644 --- "a/problems/0046.\345\205\250\346\216\222\345\210\227.md" +++ "b/problems/0046.\345\205\250\346\216\222\345\210\227.md" @@ -486,6 +486,37 @@ object Solution { } } ``` +### C# +```csharp +public class Solution +{ + public IList> res = new List>(); + public IList path = new List(); + public IList> Permute(int[] nums) + { + var used = new bool[nums.Length]; + BackTracking(nums, used); + return res; + } + public void BackTracking(int[] nums, bool[] used) + { + if (path.Count == nums.Length) + { + res.Add(new List(path)); + return; + } + for (int i = 0; i < nums.Length; i++) + { + if (used[i]) continue; + used[i] = true; + path.Add(nums[i]); + BackTracking(nums, used); + used[i] = false; + path.RemoveAt(path.Count - 1); + } + } +} +```

From 25a330fcdbc4b2e6958efa51143ce31f476dc60a Mon Sep 17 00:00:00 2001 From: cherrypicker Date: Thu, 21 Dec 2023 15:29:18 +0800 Subject: [PATCH 2373/3019] =?UTF-8?q?Update0704.=E4=BA=8C=E5=88=86?= =?UTF-8?q?=E6=9F=A5=E6=89=BE=20Go=E7=A4=BA=E4=BE=8B=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加注释、计算区间中点mid时使用位运算代替除法运算 --- ...14\345\210\206\346\237\245\346\211\276.md" | 72 ++++++++++++------- 1 file changed, 46 insertions(+), 26 deletions(-) diff --git "a/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" "b/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" index 590ec1b139..c3783aa33f 100644 --- "a/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" +++ "b/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" @@ -251,40 +251,60 @@ class Solution: (版本一)左闭右闭区间 ```go +// 时间复杂度 O(logn) func search(nums []int, target int) int { - high := len(nums)-1 - low := 0 - for low <= high { - mid := low + (high-low)/2 - if nums[mid] == target { - return mid - } else if nums[mid] > target { - high = mid-1 - } else { - low = mid+1 - } - } - return -1 + // 初始化左右边界 + left := 0 + right := len(nums) - 1 + + // 循环逐步缩小区间范围 + for left <= right { + // 求区间中点 + mid := left + (right-left)>>1 + + // 根据 nums[mid] 和 target 的大小关系 + // 调整区间范围 + if nums[mid] == target { + return mid + } else if nums[mid] < target { + left = mid + 1 + } else { + right = mid - 1 + } + } + + // 在输入数组内没有找到值等于 target 的元素 + return -1 } ``` (版本二)左闭右开区间 ```go +// 时间复杂度 O(logn) func search(nums []int, target int) int { - high := len(nums) - low := 0 - for low < high { - mid := low + (high-low)/2 - if nums[mid] == target { - return mid - } else if nums[mid] > target { - high = mid - } else { - low = mid+1 - } - } - return -1 + // 初始化左右边界 + left := 0 + right := len(nums) + + // 循环逐步缩小区间范围 + for left < right { + // 求区间中点 + mid := left + (right-left)>>1 + + // 根据 nums[mid] 和 target 的大小关系 + // 调整区间范围 + if nums[mid] == target { + return mid + } else if nums[mid] < target { + left = mid + 1 + } else { + right = mid + } + } + + // 在输入数组内没有找到值等于 target 的元素 + return -1 } ``` From 4516aaab6096e84f5fd7b526a135225c1b862570 Mon Sep 17 00:00:00 2001 From: cherrypicker Date: Thu, 21 Dec 2023 15:36:44 +0800 Subject: [PATCH 2374/3019] =?UTF-8?q?Update0027.=E7=A7=BB=E9=99=A4?= =?UTF-8?q?=E5=85=83=E7=B4=A0=20Go=E7=A4=BA=E4=BE=8B=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加注释、代码格式化 --- ...73\351\231\244\345\205\203\347\264\240.md" | 27 ++++++++++++------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git "a/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" "b/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" index 8522e785b9..dbde3d198c 100644 --- "a/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" +++ "b/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" @@ -256,17 +256,24 @@ class Solution: ### Go: ```go +// 快慢指针法 +// 时间复杂度 O(n) +// 空间复杂度 O(1) func removeElement(nums []int, val int) int { - length:=len(nums) - res:=0 - for i:=0;i Date: Thu, 21 Dec 2023 14:22:44 -0800 Subject: [PATCH 2375/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0Kama54.=E6=9B=BF?= =?UTF-8?q?=E6=8D=A2=E6=95=B0=E5=AD=97=E7=9A=84Python=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...346\233\277\346\215\242\346\225\260\345\255\227.md" | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git "a/problems/kama54.\346\233\277\346\215\242\346\225\260\345\255\227.md" "b/problems/kama54.\346\233\277\346\215\242\346\225\260\345\255\227.md" index 0f8daa2175..2b3d53de22 100644 --- "a/problems/kama54.\346\233\277\346\215\242\346\225\260\345\255\227.md" +++ "b/problems/kama54.\346\233\277\346\215\242\346\225\260\345\255\227.md" @@ -235,7 +235,15 @@ func main(){ ### python: - +```Python +class Solution: + def change(self, s): + lst = list(s) # Python里面的string也是不可改的,所以也是需要额外空间的。空间复杂度:O(n)。 + for i in range(len(lst)): + if lst[i].isdigit(): + lst[i] = "number" + return ''.join(lst) +``` ### JavaScript: From 1fbe05532511a96e48b118172ed5f9e2f21ad7c6 Mon Sep 17 00:00:00 2001 From: cherrypicker Date: Fri, 22 Dec 2023 10:02:23 +0800 Subject: [PATCH 2376/3019] =?UTF-8?q?Update0232.=E7=94=A8=E6=A0=88?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E9=98=9F=E5=88=97=20=E4=BC=98=E5=8C=96Go?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 使用切片模拟栈的实现,即 MyStack --- ...36\347\216\260\351\230\237\345\210\227.md" | 85 ++++++++++++------- 1 file changed, 55 insertions(+), 30 deletions(-) diff --git "a/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" "b/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" index 2437401060..41933ca4ba 100644 --- "a/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" +++ "b/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" @@ -235,52 +235,77 @@ class MyQueue: ### Go: ```Go +// 通过切片实现一个栈 +// 由于只是辅助实现算法题目,因此不做异常情况处理 +type MyStack []int + +func (s *MyStack) Push(v int) { + *s = append(*s, v) +} + +func (s *MyStack) Pop() int { + val := (*s)[len(*s)-1] + *s = (*s)[:len(*s)-1] + return val +} + +func (s *MyStack) Peek() int { + return (*s)[len(*s)-1] +} + +func (s *MyStack) Size() int { + return len(*s) +} + +func (s *MyStack) Empty() bool { + return s.Size() == 0 +} + +// ---------- 分界线 ---------- + type MyQueue struct { - stackIn []int //输入栈 - stackOut []int //输出栈 + stackIn *MyStack + stackOut *MyStack } + func Constructor() MyQueue { - return MyQueue{ - stackIn: make([]int, 0), - stackOut: make([]int, 0), + return MyQueue { + stackIn: &MyStack{}, + stackOut: &MyStack{}, } } -// 往输入栈做push -func (this *MyQueue) Push(x int) { - this.stackIn = append(this.stackIn, x) + +func (this *MyQueue) Push(x int) { + this.stackIn.Push(x) } -// 在输出栈做pop,pop时如果输出栈数据为空,需要将输入栈全部数据导入,如果非空,则可直接使用 + func (this *MyQueue) Pop() int { - inLen, outLen := len(this.stackIn), len(this.stackOut) - if outLen == 0 { - if inLen == 0 { - return -1 - } - for i := inLen - 1; i >= 0; i-- { - this.stackOut = append(this.stackOut, this.stackIn[i]) - } - this.stackIn = []int{} //导出后清空 - outLen = len(this.stackOut) //更新长度值 - } - val := this.stackOut[outLen-1] - this.stackOut = this.stackOut[:outLen-1] - return val + this.fillStackOut() + return this.stackOut.Pop() } + func (this *MyQueue) Peek() int { - val := this.Pop() - if val == -1 { - return -1 - } - this.stackOut = append(this.stackOut, val) - return val + this.fillStackOut() + return this.stackOut.Peek() } + func (this *MyQueue) Empty() bool { - return len(this.stackIn) == 0 && len(this.stackOut) == 0 + return this.stackIn.Empty() && this.stackOut.Empty() +} + +// fillStackOut 填充输出栈 +func (this *MyQueue) fillStackOut() { + if this.stackOut.Empty() { + for !this.stackIn.Empty() { + val := this.stackIn.Pop() + this.stackOut.Push(val) + } + } } ``` From f134c39c868c3b8a48389db6e11fe412904087b2 Mon Sep 17 00:00:00 2001 From: eeee0717 Date: Fri, 22 Dec 2023 10:17:21 +0800 Subject: [PATCH 2377/3019] =?UTF-8?q?Update=200047.=E5=85=A8=E6=8E=92?= =?UTF-8?q?=E5=88=972=EF=BC=8C=E6=B7=BB=E5=8A=A0C#?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\345\205\250\346\216\222\345\210\227II.md" | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git "a/problems/0047.\345\205\250\346\216\222\345\210\227II.md" "b/problems/0047.\345\205\250\346\216\222\345\210\227II.md" index 4fed8a5c8c..7f2c363889 100644 --- "a/problems/0047.\345\205\250\346\216\222\345\210\227II.md" +++ "b/problems/0047.\345\205\250\346\216\222\345\210\227II.md" @@ -521,6 +521,38 @@ object Solution { } } ``` +### C# +```csharp +public class Solution +{ + public List> res = new List>(); + public List path = new List(); + public IList> PermuteUnique(int[] nums) + { + Array.Sort(nums); + BackTracking(nums, new bool[nums.Length]); + return res; + } + public void BackTracking(int[] nums, bool[] used) + { + if (nums.Length == path.Count) + { + res.Add(new List(path)); + return; + } + for (int i = 0; i < nums.Length; i++) + { + if (i > 0 && nums[i] == nums[i - 1] && used[i - 1] == false) continue; + if (used[i]) continue; + path.Add(nums[i]); + used[i] = true; + BackTracking(nums, used); + path.RemoveAt(path.Count - 1); + used[i] = false; + } + } +} +```

From 9319ce9cdcab03027644ce1cff57b4060d53bc99 Mon Sep 17 00:00:00 2001 From: cherrypicker Date: Sat, 23 Dec 2023 08:34:38 +0800 Subject: [PATCH 2378/3019] =?UTF-8?q?Update0020.=E6=9C=89=E6=95=88?= =?UTF-8?q?=E7=9A=84=E6=8B=AC=E5=8F=B7=20Go=E7=A4=BA=E4=BE=8B=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 原有的实现已经足够简洁清晰,这个版本的代码增加了注释,提升了可读性。 --- ...10\347\232\204\346\213\254\345\217\267.md" | 50 +++++++++++++------ 1 file changed, 34 insertions(+), 16 deletions(-) diff --git "a/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" "b/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" index 045c79ee7f..17fbe2be2d 100644 --- "a/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" +++ "b/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" @@ -218,23 +218,41 @@ class Solution: ### Go: ```Go +// 思路: 使用栈来进行括号的匹配 +// 时间复杂度 O(n) +// 空间复杂度 O(n) func isValid(s string) bool { - hash := map[byte]byte{')':'(', ']':'[', '}':'{'} - stack := make([]byte, 0) - if s == "" { - return true - } - - for i := 0; i < len(s); i++ { - if s[i] == '(' || s[i] == '[' || s[i] == '{' { - stack = append(stack, s[i]) - } else if len(stack) > 0 && stack[len(stack)-1] == hash[s[i]] { - stack = stack[:len(stack)-1] - } else { - return false - } - } - return len(stack) == 0 + // 使用切片模拟栈的行为 + stack := make([]rune, 0) + + // m 用于记录某个右括号对应的左括号 + m := make(map[rune]rune) + m[')'] = '(' + m[']'] = '[' + m['}'] = '{' + + // 遍历字符串中的 rune + for _, c := range s { + // 左括号直接入栈 + if c == '(' || c == '[' || c == '{' { + stack = append(stack, c) + } else { + // 如果是右括号,先判断栈内是否还有元素 + if len(stack) == 0 { + return false + } + // 再判断栈顶元素是否能够匹配 + peek := stack[len(stack)-1] + if peek != m[c] { + return false + } + // 模拟栈顶弹出 + stack = stack[:len(stack)-1] + } + } + + // 若栈中不再包含元素,则能完全匹配 + return len(stack) == 0 } ``` From 69103f6c86fddc3d10ffe921dce8b93e259f71e2 Mon Sep 17 00:00:00 2001 From: eeee0717 Date: Sat, 23 Dec 2023 10:11:06 +0800 Subject: [PATCH 2379/3019] =?UTF-8?q?Update0051.N=E7=9A=87=E5=90=8E?= =?UTF-8?q?=EF=BC=8C=E6=B7=BB=E5=8A=A0C#?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "problems/0051.N\347\232\207\345\220\216.md" | 54 ++++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git "a/problems/0051.N\347\232\207\345\220\216.md" "b/problems/0051.N\347\232\207\345\220\216.md" index f629079372..1e1085401d 100644 --- "a/problems/0051.N\347\232\207\345\220\216.md" +++ "b/problems/0051.N\347\232\207\345\220\216.md" @@ -865,6 +865,60 @@ object Solution { } } ``` +### C# +```csharp +public class Solution +{ + public List> res = new(); + public IList> SolveNQueens(int n) + { + char[][] chessBoard = new char[n][]; + for (int i = 0; i < n; i++) + { + chessBoard[i] = new char[n]; + for (int j = 0; j < n; j++) + { + chessBoard[i][j] = '.'; + } + } + BackTracking(n, 0, chessBoard); + return res; + } + public void BackTracking(int n, int row, char[][] chessBoard) + { + if (row == n) + { + res.Add(chessBoard.Select(x => new string(x)).ToList()); + return; + } + for (int col = 0; col < n; col++) + { + if (IsValid(row, col, chessBoard, n)) + { + chessBoard[row][col] = 'Q'; + BackTracking(n, row + 1, chessBoard); + chessBoard[row][col] = '.'; + } + } + } + public bool IsValid(int row, int col, char[][] chessBoard, int n) + { + for (int i = 0; i < row; i++) + { + if (chessBoard[i][col] == 'Q') return false; + } + for (int i = row - 1, j = col - 1; i >= 0 && j >= 0; i--, j--) + { + if (chessBoard[i][j] == 'Q') return false; + } + for (int i = row - 1, j = col + 1; i >= 0 && j < n; i--, j++) + { + if (chessBoard[i][j] == 'Q') return false; + } + return true; + } +} +```

From 3bd387df7cde50b6fada28aa824841f4c842921d Mon Sep 17 00:00:00 2001 From: eeee0717 Date: Sun, 24 Dec 2023 09:42:46 +0800 Subject: [PATCH 2380/3019] =?UTF-8?q?Update0037.=E8=A7=A3=E6=95=B0?= =?UTF-8?q?=E7=8B=AC=EF=BC=8C=E6=B7=BB=E5=8A=A0C#?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...7.\350\247\243\346\225\260\347\213\254.md" | 53 +++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git "a/problems/0037.\350\247\243\346\225\260\347\213\254.md" "b/problems/0037.\350\247\243\346\225\260\347\213\254.md" index 1763063eb7..d96e59dfeb 100644 --- "a/problems/0037.\350\247\243\346\225\260\347\213\254.md" +++ "b/problems/0037.\350\247\243\346\225\260\347\213\254.md" @@ -756,6 +756,59 @@ object Solution { } } ``` +### C# +```csharp +public class Solution +{ + public void SolveSudoku(char[][] board) + { + BackTracking(board); + } + public bool BackTracking(char[][] board) + { + for (int i = 0; i < board.Length; i++) + { + for (int j = 0; j < board[0].Length; j++) + { + if (board[i][j] != '.') continue; + for (char k = '1'; k <= '9'; k++) + { + if (IsValid(board, i, j, k)) + { + board[i][j] = k; + if (BackTracking(board)) return true; + board[i][j] = '.'; + } + } + return false; + } + + } + return true; + } + public bool IsValid(char[][] board, int row, int col, char val) + { + for (int i = 0; i < 9; i++) + { + if (board[i][col] == val) return false; + } + for (int i = 0; i < 9; i++) + { + if (board[row][i] == val) return false; + } + 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] == val) return false; + } + } + return true; + } +} +```

From 689c086f3a4094e3eeb5e639b69126c29b626561 Mon Sep 17 00:00:00 2001 From: ZhangLiPeng <2353375282@qq.com> Date: Sun, 24 Dec 2023 14:44:08 +0800 Subject: [PATCH 2381/3019] =?UTF-8?q?=E4=BF=AE=E6=94=B9=20=E9=93=BE?= =?UTF-8?q?=E8=A1=A8=E6=80=BB=E7=BB=93=E7=AF=87.md=20=E7=9A=84=E6=96=87?= =?UTF-8?q?=E5=AD=97=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\223\276\350\241\250\346\200\273\347\273\223\347\257\207.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/\351\223\276\350\241\250\346\200\273\347\273\223\347\257\207.md" "b/problems/\351\223\276\350\241\250\346\200\273\347\273\223\347\257\207.md" index 3f2f5c9792..72d2b7ad87 100644 --- "a/problems/\351\223\276\350\241\250\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/\351\223\276\350\241\250\346\200\273\347\273\223\347\257\207.md" @@ -22,7 +22,7 @@ ### 虚拟头结点 -在[链表:听说用虚拟头节点会方便很多?](https://programmercarl.com/0203.移除链表元素.html)中,我们讲解了链表操作中一个非常总要的技巧:虚拟头节点。 +在[链表:听说用虚拟头节点会方便很多?](https://programmercarl.com/0203.移除链表元素.html)中,我们讲解了链表操作中一个非常重要的技巧:虚拟头节点。 链表的一大问题就是操作当前节点必须要找前一个节点才能操作。这就造成了,头结点的尴尬,因为头结点没有前一个节点了。 From 5fd8c8e6a7d2c8a5f25a0c5aaa0a942f1be3a24f Mon Sep 17 00:00:00 2001 From: ZhangLiPeng <2353375282@qq.com> Date: Sun, 24 Dec 2023 17:10:16 +0800 Subject: [PATCH 2382/3019] =?UTF-8?q?=E4=BF=AE=E6=94=B9=20=E9=93=BE?= =?UTF-8?q?=E8=A1=A8=E6=80=BB=E7=BB=93=E7=AF=87.md=20=E7=9A=84=E6=96=87?= =?UTF-8?q?=E5=AD=97=E7=BC=BA=E5=A4=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\223\276\350\241\250\346\200\273\347\273\223\347\257\207.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/\351\223\276\350\241\250\346\200\273\347\273\223\347\257\207.md" "b/problems/\351\223\276\350\241\250\346\200\273\347\273\223\347\257\207.md" index 72d2b7ad87..b2b1b7795f 100644 --- "a/problems/\351\223\276\350\241\250\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/\351\223\276\350\241\250\346\200\273\347\273\223\347\257\207.md" @@ -32,7 +32,7 @@ ### 链表的基本操作 -在[链表:一道题目考察了常见的五个操作!](https://programmercarl.com/0707.设计链表.html)中,我们通设计链表把链表常见的五个操作练习了一遍。 +在[链表:一道题目考察了常见的五个操作!](https://programmercarl.com/0707.设计链表.html)中,我们通过设计链表把链表常见的五个操作练习了一遍。 这是练习链表基础操作的非常好的一道题目,考察了: From 9cea1567fe338ec4842276c4e27e9d4933893bd3 Mon Sep 17 00:00:00 2001 From: eeee0717 Date: Mon, 25 Dec 2023 09:35:23 +0800 Subject: [PATCH 2383/3019] =?UTF-8?q?Update0455.=E5=88=86=E5=8F=91?= =?UTF-8?q?=E9=A5=BC=E5=B9=B2=EF=BC=8C=E6=B7=BB=E5=8A=A0C#?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...06\345\217\221\351\245\274\345\271\262.md" | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git "a/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" "b/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" index c9c1a8525d..778adc94a3 100644 --- "a/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" +++ "b/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" @@ -378,6 +378,28 @@ object Solution { } } ``` +### C# +```csharp +public class Solution +{ + public int FindContentChildren(int[] g, int[] s) + { + Array.Sort(g); + Array.Sort(s); + int index = s.Length - 1; + int res = 0; + for (int i = g.Length - 1; i >=0; i--) + { + if(index >=0 && s[index]>=g[i]) + { + res++; + index--; + } + } + return res; + } +} +```

From 95e8b279aef0dab41fce7210ad4f80fd74f8dca8 Mon Sep 17 00:00:00 2001 From: markwang Date: Mon, 25 Dec 2023 15:36:54 +0800 Subject: [PATCH 2384/3019] =?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=90=9C=E7=B4=A2?= =?UTF-8?q?=E6=A0=91=E7=9A=84=E6=9C=80=E8=BF=91=E5=85=AC=E5=85=B1=E7=A5=96?= =?UTF-8?q?=E5=85=88Go=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...54\345\205\261\347\245\226\345\205\210.md" | 31 ++++++++++++------- 1 file changed, 19 insertions(+), 12 deletions(-) diff --git "a/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" "b/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" index b27a231e77..08d25080db 100644 --- "a/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" +++ "b/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" @@ -48,7 +48,7 @@ 在有序树里,如果判断一个节点的左子树里有p,右子树里有q呢? -因为是有序树,所有 如果 中间节点是 q 和 p 的公共祖先,那么 中节点的数组 一定是在 [p, q]区间的。即 中节点 > p && 中节点 < q 或者 中节点 > q && 中节点 < p。 +因为是有序树,所以 如果 中间节点是 q 和 p 的公共祖先,那么 中节点的数组 一定是在 [p, q]区间的。即 中节点 > p && 中节点 < q 或者 中节点 > q && 中节点 < p。 那么只要从上到下去遍历,遇到 cur节点是数值在[p, q]区间中则一定可以说明该节点cur就是p 和 q的公共祖先。 那问题来了,**一定是最近公共祖先吗**? @@ -328,28 +328,35 @@ class Solution: ``` ### Go -递归法: +递归法 ```go func lowestCommonAncestor(root, p, q *TreeNode) *TreeNode { - if root == nil { - return nil + if root.Val > p.Val && root.Val > q.Val { + return lowestCommonAncestor(root.Left, p, q) + } else if root.Val < p.Val && root.Val < q.Val { + return lowestCommonAncestor(root.Right, p, q) + } else { + return root } - for { - if root.Val > p.Val && root.Val > q.Val { +} +``` + +迭代法 +```go +func lowestCommonAncestor(root, p, q *TreeNode) *TreeNode { + for root != nil { + if root.Val > p.Val && root.Val > q.Val { root = root.Left - } - if root.Val < p.Val && root.Val < q.Val { + } else if root.Val < p.Val && root.Val < q.Val { root = root.Right - } - if (root.Val - p.Val) * (root.Val - q.Val) <= 0 { + } else { return root } } - return root + return nil } ``` - ### JavaScript 递归法: From b22425c859269c5862149a8f736bcf0c3e5e00eb Mon Sep 17 00:00:00 2001 From: Relsola Date: Mon, 25 Dec 2023 22:55:12 +0800 Subject: [PATCH 2385/3019] =?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?=E5=8F=98=E9=87=8F=E5=90=8D=E9=94=99=E8=AF=AF=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E5=92=8C=E5=8F=AF=E8=AF=BB=E6=80=A7=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...47\347\232\204\347\237\251\345\275\242.md" | 66 +++++++++++-------- 1 file changed, 40 insertions(+), 26 deletions(-) diff --git "a/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" "b/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" index 97dab4f398..b836705ab5 100644 --- "a/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" +++ "b/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" @@ -515,27 +515,31 @@ func largestRectangleArea(heights []int) int { var largestRectangleArea = function(heights) { const len = heights.length; const minLeftIndex = new Array(len); - const maxRigthIndex = new Array(len); + const maxRightIndex = 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]; + while (t >= 0 && heights[t] >= heights[i]) { + t = minLeftIndex[t]; + } minLeftIndex[i] = t; } // 记录每个柱子 右边第一个小于该柱子的下标 - maxRigthIndex[len - 1] = len; // 注意这里初始化,防止下面while死循环 + maxRightIndex[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; + while (t <= n && heights[t] > heights[i]) { + t = maxRightIndex[t]; + } + maxRightIndex[i] = t; } // 求和 let maxArea = 0; for(let i = 0; i < len; i++){ - let sum = heights[i] * (maxRigthIndex[i] - minLeftIndex[i] - 1); + let sum = heights[i] * (maxRightIndex[i] - minLeftIndex[i] - 1); maxArea = Math.max(maxArea , sum); } return maxArea; @@ -543,27 +547,37 @@ var largestRectangleArea = function(heights) { //单调栈 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] + let maxArea = 0; + const stack = [0]; + heights.push(0); + const n = heights.length; + + for (let i = 1; i < n; i++) { + let top = stack.at(-1); + // 情况三 + if (heights[top] < heights[i]) { + stack.push(i); + } + // 情况二 + if (heights[top] === heights[i]) { + stack.pop(); // 这个可以加,可以不加,效果一样,思路不同 + stack.push(i); + } + // 情况一 + if (heights[top] > heights[i]) { + while (stack.length > 0 && heights[top] > heights[i]) { + // 栈顶元素出栈,并保存栈顶bar的索引 + const h = heights[stack.pop()]; + const left = stack.at(-1) ?? -1; + const w = i - left - 1; // 计算面积,并取最大面积 - maxArea = Math.max(maxArea, w * h); - } - stack.push(i);// 当前bar比栈顶bar高了,入栈 - } - } - return maxArea; + maxArea = Math.max(maxArea, w * h); + top = stack.at(-1); + } + stack.push(i); + } + } + return maxArea; }; //单调栈 简洁 From b01155fbf24ee11b8a45aa9b7e0f67f2398509c2 Mon Sep 17 00:00:00 2001 From: eeee0717 Date: Tue, 26 Dec 2023 09:11:30 +0800 Subject: [PATCH 2386/3019] =?UTF-8?q?docs:=E4=BF=AE=E6=94=B9=E9=94=99?= =?UTF-8?q?=E5=88=AB=E5=AD=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" "b/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" index 5203d7d61a..ceea31fe50 100644 --- "a/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" +++ "b/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" @@ -64,7 +64,7 @@ 在计算是否有峰值的时候,大家知道遍历的下标 i ,计算 prediff(nums[i] - nums[i-1]) 和 curdiff(nums[i+1] - nums[i]),如果`prediff < 0 && curdiff > 0` 或者 `prediff > 0 && curdiff < 0` 此时就有波动就需要统计。 -这是我们思考本题的一个大题思路,但本题要考虑三种情况: +这是我们思考本题的一个大体思路,但本题要考虑三种情况: 1. 情况一:上下坡中有平坡 2. 情况二:数组首尾两端 From 7924803206a0dc2b06b6d6f3c7281d9f56970a71 Mon Sep 17 00:00:00 2001 From: eeee0717 Date: Tue, 26 Dec 2023 09:12:03 +0800 Subject: [PATCH 2387/3019] =?UTF-8?q?Update0376.=E6=91=86=E5=8A=A8?= =?UTF-8?q?=E5=BA=8F=E5=88=97=EF=BC=8C=E6=B7=BB=E5=8A=A0C#?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...06\345\212\250\345\272\217\345\210\227.md" | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git "a/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" "b/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" index ceea31fe50..5c2241c805 100644 --- "a/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" +++ "b/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" @@ -692,6 +692,27 @@ object Solution { } } ``` +### C# +```csharp +public class Solution +{ + public int WiggleMaxLength(int[] nums) + { + if (nums.Length < 2) return nums.Length; + int curDiff = 0, preDiff = 0, res = 1; + for (int i = 0; i < nums.Length - 1; i++) + { + curDiff = nums[i + 1] - nums[i]; + if ((curDiff > 0 && preDiff <= 0) || (curDiff < 0 && preDiff >= 0)) + { + res++; + preDiff = curDiff; + } + } + return res; + } +} +```

From 54c3a74618182fc480334e1105bc3030948e208d Mon Sep 17 00:00:00 2001 From: block <1181882120@qq.com> Date: Tue, 26 Dec 2023 10:52:24 +0800 Subject: [PATCH 2388/3019] Update max array doc --- ...\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" "b/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" index bed11c7a19..27cabdc559 100644 --- "a/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" +++ "b/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" @@ -16,7 +16,7 @@ 示例 1: * 输入:A = [4,2,3], K = 1 * 输出:5 -* 解释:选择索引 (1,) ,然后 A 变为 [4,-2,3]。 +* 解释:选择索引 (1) ,然后 A 变为 [4,-2,3]。 示例 2: * 输入:A = [3,-1,0,2], K = 3 From a937b7674623ecbbe24e61d20d6af7d771ab6304 Mon Sep 17 00:00:00 2001 From: eeee0717 Date: Wed, 27 Dec 2023 09:49:34 +0800 Subject: [PATCH 2389/3019] =?UTF-8?q?Update0053.=E6=9C=80=E5=A4=A7?= =?UTF-8?q?=E5=AD=90=E5=BA=8F=E5=92=8C=EF=BC=8C=E6=B7=BB=E5=8A=A0C#?= =?UTF-8?q?=E8=B4=AA=E5=BF=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...47\345\255\220\345\272\217\345\222\214.md" | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git "a/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" "b/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" index 639c54bc7e..78c8b38222 100644 --- "a/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" +++ "b/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" @@ -406,6 +406,26 @@ object Solution { } } ``` +### C# +**贪心** +```csharp +public class Solution +{ + public int MaxSubArray(int[] nums) + { + int res = Int32.MinValue; + int count = 0; + for (int i = 0; i < nums.Length; i++) + { + count += nums[i]; + res = Math.Max(res, count); + if (count < 0) count = 0; + } + return res; + } +} +``` +

From 2368a622773736ee74f8d432f8cb891ec2f3c74c Mon Sep 17 00:00:00 2001 From: Relsola Date: Wed, 27 Dec 2023 19:23:37 +0800 Subject: [PATCH 2390/3019] =?UTF-8?q?Update=200200.=E5=B2=9B=E5=B1=BF?= =?UTF-8?q?=E6=95=B0=E9=87=8F.=E6=B7=B1=E6=90=9C=E7=89=88.md=20=E6=96=B0?= =?UTF-8?q?=E5=A2=9ETS=E6=B7=B1=E5=BA=A6=E6=90=9C=E7=B4=A2=E4=BC=98?= =?UTF-8?q?=E5=85=88=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...7.\346\267\261\346\220\234\347\211\210.md" | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git "a/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\346\267\261\346\220\234\347\211\210.md" "b/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\346\267\261\346\220\234\347\211\210.md" index 43eb66e172..a4b93c3d4e 100644 --- "a/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\346\267\261\346\220\234\347\211\210.md" +++ "b/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\346\267\261\346\220\234\347\211\210.md" @@ -346,6 +346,46 @@ var numIslands = function (grid) { }; ``` +### TypeScript + +```TypeScript +function numIslands(grid: string[][]): number { + // 四个方向 + const dir: number[][] = [[0, 1], [1, 0], [-1, 0], [0, -1]]; + const [m, n]: [number, number] = [grid.length, grid[0].length]; + + function dfs(grid: string[][], visited: boolean[][], x: number, y: number) { + for (let i = 0; i < 4; i++) { + let nextX: number = x + dir[i][0]; + let nextY: number = y + dir[i][1]; + // 越界了,直接跳过 + if (nextX < 0 || nextX >= m || nextY < 0 || nextY >= n) { + continue; + } + // 没有访问过同时是陆地 + if (!visited[nextX][nextY] && grid[nextX][nextY] === '1') { + visited[nextX][nextY] = true; + dfs(grid, visited, nextX, nextY); + } + } + } + + const visited: boolean[][] = Array.from({ length: m }, _ => new Array(n).fill(false)); + + let result: number = 0; + for (let i = 0; i < m; i++) { + for (let k = 0; k < n; k++) { + if (!visited[i][k] && grid[i][k] === '1') { + ++result; // 遇到没访问过的陆地,+1 + visited[i][k] = true; + dfs(grid, visited, i, k); // 将与其链接的陆地都标记上 true + } + } + } + return result; +} +``` + ### Go ```go From 22ebe65604be3b53c53503f64d1aa7ed3b0b220f Mon Sep 17 00:00:00 2001 From: Relsola Date: Wed, 27 Dec 2023 19:51:37 +0800 Subject: [PATCH 2391/3019] =?UTF-8?q?Update=20200.=E5=B2=9B=E5=B1=BF?= =?UTF-8?q?=E6=95=B0=E9=87=8F.=E5=B9=BF=E6=90=9C=E7=89=88.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...7.\345\271\277\346\220\234\347\211\210.md" | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git "a/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\345\271\277\346\220\234\347\211\210.md" "b/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\345\271\277\346\220\234\347\211\210.md" index e8ed60db68..a7dd117b3e 100644 --- "a/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\345\271\277\346\220\234\347\211\210.md" +++ "b/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\345\271\277\346\220\234\347\211\210.md" @@ -276,6 +276,52 @@ var numIslands = function (grid) { }; ``` +### TypeScript + +```TypeScript +function numIslands2(grid: string[][]): number { + // 四个方向 + const dir: number[][] = [[0, 1], [1, 0], [-1, 0], [0, -1]]; + const [m, n]: [number, number] = [grid.length, grid[0].length]; + + function dfs(grid: string[][], visited: boolean[][], x: number, y: number) { + const queue: number[][] = [[x, y]]; + while (queue.length !== 0) { + //取出队列头部元素 + const top: number[] = queue.shift()!; + for (let i = 0; i < 4; i++) { + const nextX: number = top[0] + dir[i][0]; + const nextY: number = top[1] + dir[i][1]; + // 越界了,直接跳过 + if (nextX < 0 || nextX >= m || nextY < 0 || nextY >= n) { + continue; + } + if (!visited[nextX][nextY] && grid[nextX][nextY] === '1') { + queue.push([nextX, nextY]); + // 只要加入队列立刻标记 + visited[nextX][nextY] = true; + } + } + } + } + + const visited: boolean[][] = Array.from({ length: m }, _ => new Array(n).fill(false)); + + let result = 0; + for (let i = 0; i < m; i++) { + for (let k = 0; k < n; k++) { + if (!visited[i][k] && grid[i][k] === '1') { + ++result; // 遇到没访问过的陆地,+1 + visited[i][k] = true; + dfs(grid, visited, i, k); // 将与其链接的陆地都标记上 true + } + } + } + return result; +} +``` + + ### Rust ```rust From 6eadd3eafc7c55b2bd945041e4752c09b20b69ed Mon Sep 17 00:00:00 2001 From: eeee0717 Date: Thu, 28 Dec 2023 10:03:01 +0800 Subject: [PATCH 2392/3019] =?UTF-8?q?Update.=E4=B9=B0=E5=8D=96=E8=82=A1?= =?UTF-8?q?=E7=A5=A8=E7=9A=84=E6=9C=80=E4=BD=B3=E6=97=B6=E6=9C=BA2?= =?UTF-8?q?=EF=BC=8C=E6=B7=BB=E5=8A=A0C#?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\200\344\275\263\346\227\266\346\234\272II.md" | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" index 2c2ab225fd..69706e369a 100644 --- "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" +++ "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" @@ -406,6 +406,21 @@ object Solution { } } ``` +### C# +```csharp +public class Solution +{ + public int MaxProfit(int[] prices) + { + int res = 0; + for (int i = 0; i < prices.Length - 1; i++) + { + res += Math.Max(0, prices[i + 1] - prices[i]); + } + return res; + } +} +```

From c0c03a88831bc6b1ed20e8cedb068cec7e624181 Mon Sep 17 00:00:00 2001 From: ENJOY <954395302@qq.com> Date: Thu, 28 Dec 2023 16:03:23 +0800 Subject: [PATCH 2393/3019] =?UTF-8?q?0704.=E4=BA=8C=E5=88=86=E6=9F=A5?= =?UTF-8?q?=E6=89=BE.md=EF=BC=9A=E4=BF=AE=E6=94=B9=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 --- .../0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" "b/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" index c3783aa33f..31e89ae344 100644 --- "a/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" +++ "b/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" @@ -2,7 +2,7 @@ -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 704. 二分查找 From b997d8108cd8fcf7b00e4b073f301f0bb9c447d2 Mon Sep 17 00:00:00 2001 From: ENJOY <954395302@qq.com> Date: Thu, 28 Dec 2023 16:49:49 +0800 Subject: [PATCH 2394/3019] =?UTF-8?q?=E5=85=B3=E4=BA=8E=E6=97=B6=E9=97=B4?= =?UTF-8?q?=E5=A4=8D=E6=9D=82=E5=BA=A6=EF=BC=8C=E4=BD=A0=E4=B8=8D=E7=9F=A5?= =?UTF-8?q?=E9=81=93=E7=9A=84=E9=83=BD=E5=9C=A8=E8=BF=99=E9=87=8C=EF=BC=81?= =?UTF-8?q?.md=EF=BC=9A=E4=BF=AE=E6=94=B9=E9=94=99=E5=88=AB=E5=AD=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...234\250\350\277\231\351\207\214\357\274\201.md" | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git "a/problems/\345\205\263\344\272\216\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\214\344\275\240\344\270\215\347\237\245\351\201\223\347\232\204\351\203\275\345\234\250\350\277\231\351\207\214\357\274\201.md" "b/problems/\345\205\263\344\272\216\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\214\344\275\240\344\270\215\347\237\245\351\201\223\347\232\204\351\203\275\345\234\250\350\277\231\351\207\214\357\274\201.md" index d212e8beae..a1e553d0bc 100644 --- "a/problems/\345\205\263\344\272\216\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\214\344\275\240\344\270\215\347\237\245\351\201\223\347\232\204\351\203\275\345\234\250\350\277\231\351\207\214\357\274\201.md" +++ "b/problems/\345\205\263\344\272\216\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\214\344\275\240\344\270\215\347\237\245\351\201\223\347\232\204\351\203\275\345\234\250\350\277\231\351\207\214\357\274\201.md" @@ -10,7 +10,7 @@ **时间复杂度是一个函数,它定性描述该算法的运行时间**。 -我们在软件开发中,时间复杂度就是用来方便开发者估算出程序运行的答题时间。 +我们在软件开发中,时间复杂度就是用来方便开发者估算出程序运行的大体时间。 那么该如何估计程序运行时间呢,通常会估算算法的操作单元数量来代表程序消耗的时间,这里默认CPU的每个单元运行消耗的时间都是相同的。 @@ -80,13 +80,13 @@ O(2*n^2 + 10*n) O(n^2 + n) ``` -只保留保留最高项,去掉数量级小一级的n (因为n^2 的数据规模远大于n),最终简化为: +只保留最高项,去掉数量级小一级的n (因为n^2 的数据规模远大于n),最终简化为: ``` O(n^2) ``` -如果这一步理解有困难,那也可以做提取n的操作,变成O(n(n+1)),省略加法常数项后也就别变成了: +如果这一步理解有困难,那也可以做提取n的操作,变成O(n(n+1)),省略加法常数项后也就变成了: ``` O(n^2) @@ -96,7 +96,7 @@ O(n^2) 也可以用另一种简化的思路,其实当n大于40的时候, 这个复杂度会恒小于O(3 × n^2), -O(2 × n^2 + 10 × n + 1000) < O(3 × n^2),所以说最后省略掉常数项系数最终时间复杂度也是O(n^2)。 +O(2 × n^2 + 10 × n + 1000) < O(3 × n^2),3 × n^2省略掉常数项系数,最终时间复杂度也是O(n^2)。 ## O(log n)中的log是以什么为底? @@ -127,7 +127,7 @@ O(2 × n^2 + 10 × n + 1000) < O(3 × n^2),所以说最后省略掉常数项 接下来再想一下其他解题思路。 -先排对n个字符串按字典序来排序,排序后n个字符串就是有序的,意味着两个相同的字符串就是挨在一起,然后在遍历一遍n个字符串,这样就找到两个相同的字符串了。 +先对n个字符串按字典序来排序,排序后n个字符串就是有序的,意味着两个相同的字符串就是挨在一起,然后再遍历一遍n个字符串,这样就找到两个相同的字符串了。 那看看这种算法的时间复杂度,快速排序时间复杂度为O(nlog n),依然要考虑字符串的长度是m,那么快速排序每次的比较都要有m次的字符比较的操作,就是O(m × n × log n)。 @@ -139,13 +139,13 @@ O(2 × n^2 + 10 × n + 1000) < O(3 × n^2),所以说最后省略掉常数项 所以先把字符串集合排序再遍历一遍找到两个相同字符串的方法要比直接暴力枚举的方式更快。 -这就是我们通过分析两种算法的时间复杂度得来的。 +这就是我们通过分析两种算法的时间复杂度得来的结论。 **当然这不是这道题目的最优解,我仅仅是用这道题目来讲解一下时间复杂度**。 ## 总结 -本篇讲解了什么是时间复杂度,复杂度是用来干什么,以及数据规模对时间复杂度的影响。 +本篇讲解了什么是时间复杂度,复杂度是用来干什么的,以及数据规模对时间复杂度的影响。 还讲解了被大多数同学忽略的大O的定义以及log究竟是以谁为底的问题。 From df11fce6e858ba356eb0a5c8c400634f37188434 Mon Sep 17 00:00:00 2001 From: wangzilong Date: Fri, 29 Dec 2023 10:56:48 +0800 Subject: [PATCH 2395/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200203.=E7=A7=BB?= =?UTF-8?q?=E9=99=A4=E9=93=BE=E8=A1=A8=E5=85=83=E7=B4=A0=20go=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E5=A2=9E=E5=8A=A0=E7=9B=B4=E6=8E=A5=E6=93=8D=E4=BD=9C?= =?UTF-8?q?=E5=8E=9F=E9=93=BE=E8=A1=A8=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...76\350\241\250\345\205\203\347\264\240.md" | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git "a/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" "b/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" index 780f9c36ea..d6d7e6c2ef 100644 --- "a/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" +++ "b/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" @@ -330,7 +330,40 @@ class Solution: ``` ### Go: +直接使用原链表 +```go +/** + * Definition for singly-linked list. + * type ListNode struct { + * Val int + * Next *ListNode + * } + */ +func removeElements(head *ListNode, val int) *ListNode { + + //依旧是先定义逻辑 + + //如果原链表的头节点为val的话,head=head.next,且为持续过程,防止头节点后面的节点也为Val + //这里前置循环 并且要判定head 是否为nil,防止出错 + for head != nil && head.Val == val {//由于leetcode代码运行方式,for循环条件判断前后顺序不能修改,下面的for循环也同样如此 + head = head.Next + } + cur := head + + for cur != nil && cur.Next != nil { + if cur.Next.Val == val { + cur.Next = cur.Next.Next + } else { + cur = cur.Next + } + } + return head + +} + +``` +虚拟头节点方式: ```go /** * Definition for singly-linked list. From 71f51fcde4f28abedc24f46c923e9a47b21799b9 Mon Sep 17 00:00:00 2001 From: Chenxue3 <115330251+XueshanChen@users.noreply.github.com> Date: Fri, 29 Dec 2023 20:15:58 +1300 Subject: [PATCH 2396/3019] =?UTF-8?q?Update=20=E9=93=BE=E8=A1=A8=E7=90=86?= =?UTF-8?q?=E8=AE=BA=E5=9F=BA=E7=A1=80.md=20=E6=B7=BB=E5=8A=A0C#=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...06\350\256\272\345\237\272\347\241\200.md" | 25 ++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git "a/problems/\351\223\276\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\351\223\276\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" index 9dc4524269..88e41d7d3b 100644 --- "a/problems/\351\223\276\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\351\223\276\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -250,9 +250,32 @@ typedef struct ListNodeT { } ListNode; ``` +### C# + +```c# +public class Node +{ + // 节点存储的数据 + public T Data { get; set; } + + // 指向下一个节点的引用 + public Node Next { get; set; } + + // 节点的构造函数,用于初始化节点 + public Node(T data) + { + Data = data; + Next = null; // 初始时没有下一个节点,因此设为 null + } +} +``` + + + + +

- From e209d3514302398515061906102cf3a42a4588ad Mon Sep 17 00:00:00 2001 From: eeee0717 Date: Fri, 29 Dec 2023 16:45:31 +0800 Subject: [PATCH 2397/3019] =?UTF-8?q?Update0055.=E8=B7=B3=E8=B7=83?= =?UTF-8?q?=E6=B8=B8=E6=88=8F=EF=BC=8C=E6=B7=BB=E5=8A=A0C#?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\263\350\267\203\346\270\270\346\210\217.md" | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git "a/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" "b/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" index bedb09abee..086fd64f5e 100644 --- "a/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" +++ "b/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" @@ -258,6 +258,23 @@ object Solution { } } ``` +### C# +```csharp +public class Solution +{ + public bool CanJump(int[] nums) + { + int cover = 0; + if (nums.Length == 1) return true; + for (int i = 0; i <= cover; i++) + { + cover = Math.Max(i + nums[i], cover); + if (cover >= nums.Length - 1) return true; + } + return false; + } +} +```

From a66e5e39ba70ab6d3fecaa29296d19245582ca00 Mon Sep 17 00:00:00 2001 From: eeee0717 Date: Sat, 30 Dec 2023 10:16:43 +0800 Subject: [PATCH 2398/3019] =?UTF-8?q?Update.0045=E8=B7=B3=E8=B7=83?= =?UTF-8?q?=E6=B8=B8=E6=88=8F2=EF=BC=8C=E6=B7=BB=E5=8A=A0C#=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E4=BA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\350\267\203\346\270\270\346\210\217II.md" | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git "a/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" "b/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" index aab27b27ee..e006caa2ca 100644 --- "a/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" +++ "b/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" @@ -464,6 +464,27 @@ impl Solution { } } ``` +### C# +```csharp +// 版本二 +public class Solution +{ + public int Jump(int[] nums) + { + int cur = 0, next = 0, step = 0; + for (int i = 0; i < nums.Length - 1; i++) + { + next = Math.Max(next, i + nums[i]); + if (i == cur) + { + cur = next; + step++; + } + } + return step; + } +} +```

From 85f8efeef6085920de4905787ae5773012e053a9 Mon Sep 17 00:00:00 2001 From: eeee0717 Date: Sun, 31 Dec 2023 09:35:51 +0800 Subject: [PATCH 2399/3019] =?UTF-8?q?Update1005.K=E6=AC=A1=E5=8F=96?= =?UTF-8?q?=E5=8F=8D=E5=90=8E=E6=9C=80=E5=A4=A7=E5=8C=96=E7=9A=84=E6=95=B0?= =?UTF-8?q?=E7=BB=84=E5=92=8C=EF=BC=8C=E6=B7=BB=E5=8A=A0C#?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...04\346\225\260\347\273\204\345\222\214.md" | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git "a/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" "b/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" index bed11c7a19..182402d25a 100644 --- "a/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" +++ "b/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" @@ -322,6 +322,29 @@ object Solution { } ``` +### C# +```csharp +public class Solution +{ + public int LargestSumAfterKNegations(int[] nums, int k) + { + int res = 0; + Array.Sort(nums, (a, b) => Math.Abs(b) - Math.Abs(a)); + for (int i = 0; i < nums.Length; i++) + { + if (nums[i] < 0 && k > 0) + { + nums[i] *= -1; + k--; + } + } + if (k % 2 == 1) nums[nums.Length - 1] *= -1; + foreach (var item in nums) res += item; + return res; + } +} +``` +

From c9bff6e42c5f61f1f1ca873131eb2de4aff01003 Mon Sep 17 00:00:00 2001 From: eeee0717 Date: Mon, 1 Jan 2024 10:34:33 +0800 Subject: [PATCH 2400/3019] =?UTF-8?q?Update0134.=E5=8A=A0=E6=B2=B9?= =?UTF-8?q?=E7=AB=99=EF=BC=8C=E6=B7=BB=E5=8A=A0C#?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...4.\345\212\240\346\262\271\347\253\231.md" | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git "a/problems/0134.\345\212\240\346\262\271\347\253\231.md" "b/problems/0134.\345\212\240\346\262\271\347\253\231.md" index 2f9539e8a4..c093023d5f 100644 --- "a/problems/0134.\345\212\240\346\262\271\347\253\231.md" +++ "b/problems/0134.\345\212\240\346\262\271\347\253\231.md" @@ -630,6 +630,29 @@ object Solution { } } ``` +### C# +```csharp +// 贪心算法,方法二 +public class Solution +{ + public int CanCompleteCircuit(int[] gas, int[] cost) + { + int curSum = 0, totalSum = 0, start = 0; + for (int i = 0; i < gas.Length; i++) + { + curSum += gas[i] - cost[i]; + totalSum += gas[i] - cost[i]; + if (curSum < 0) + { + start = i + 1; + curSum = 0; + } + } + if (totalSum < 0) return -1; + return start; + } +} +```

From 4f2b2b2618d522d73ef15ac200799453691170c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B6=9B=20=E9=99=88?= <761050293@qq.com> Date: Tue, 2 Jan 2024 09:50:19 +0800 Subject: [PATCH 2401/3019] =?UTF-8?q?Update0135.=E5=88=86=E5=8F=91?= =?UTF-8?q?=E7=B3=96=E6=9E=9C=EF=BC=8C=E6=B7=BB=E5=8A=A0C#?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...06\345\217\221\347\263\226\346\236\234.md" | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git "a/problems/0135.\345\210\206\345\217\221\347\263\226\346\236\234.md" "b/problems/0135.\345\210\206\345\217\221\347\263\226\346\236\234.md" index d130bd6820..210f4995dc 100644 --- "a/problems/0135.\345\210\206\345\217\221\347\263\226\346\236\234.md" +++ "b/problems/0135.\345\210\206\345\217\221\347\263\226\346\236\234.md" @@ -370,6 +370,35 @@ object Solution { } } ``` +### C# +```csharp +public class Solution +{ + public int Candy(int[] ratings) + { + int[] candies = new int[ratings.Length]; + for (int i = 0; i < candies.Length; i++) + { + candies[i] = 1; + } + for (int i = 1; i < ratings.Length; i++) + { + if (ratings[i] > ratings[i - 1]) + { + candies[i] = candies[i - 1] + 1; + } + } + for (int i = ratings.Length - 2; i >= 0; i--) + { + if (ratings[i] > ratings[i + 1]) + { + candies[i] = Math.Max(candies[i], candies[i + 1] + 1); + } + } + return candies.Sum(); + } +} +```

From e5c4e9ec16aedbbc403135997cbf01e05d69ed62 Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Tue, 2 Jan 2024 12:07:19 +0800 Subject: [PATCH 2402/3019] Update --- ...0.\347\210\254\346\245\274\346\242\257.md" | 2 - ...11\346\220\234\347\264\242\346\240\221.md" | 2 +- ...04\345\255\220\346\225\260\347\273\204.md" | 2 +- "problems/kama53.\345\257\273\345\256\235.md" | 573 ++++++++++++++---- 4 files changed, 464 insertions(+), 115 deletions(-) diff --git "a/problems/0070.\347\210\254\346\245\274\346\242\257.md" "b/problems/0070.\347\210\254\346\245\274\346\242\257.md" index 7a59221dc6..3bd9b001be 100644 --- "a/problems/0070.\347\210\254\346\245\274\346\242\257.md" +++ "b/problems/0070.\347\210\254\346\245\274\346\242\257.md" @@ -215,8 +215,6 @@ public: 所以不要轻视简单题,那种凭感觉就刷过去了,其实和没掌握区别不大,只有掌握方法论并说清一二三,才能触类旁通,举一反三哈! -就酱,循序渐进学算法,认准「代码随想录」! - ## 其他语言版本 diff --git "a/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" index e699005edb..9566b7b89a 100644 --- "a/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" +++ "b/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" @@ -38,7 +38,7 @@ 题目中说要转换为一棵高度平衡二叉搜索树。为什么强调要平衡呢? -因为只要给我们一个有序数组,如果强调平衡,都可以以线性结构来构造二叉搜索树。 +因为只要给我们一个有序数组,如果不强调平衡,都可以以线性结构来构造二叉搜索树。 例如 有序数组[-10,-3,0,5,9] 就可以构造成这样的二叉搜索树,如图。 diff --git "a/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" "b/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" index afce264695..5934d5e364 100644 --- "a/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" +++ "b/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" @@ -100,7 +100,7 @@ public: 窗口就是 满足其和 ≥ s 的长度最小的 连续 子数组。 -窗口的起始位置如何移动:如果当前窗口的值大于s了,窗口就要向前移动了(也就是该缩小了)。 +窗口的起始位置如何移动:如果当前窗口的值大于等于s了,窗口就要向前移动了(也就是该缩小了)。 窗口的结束位置如何移动:窗口的结束位置就是遍历数组的指针,也就是for循环里的索引。 diff --git "a/problems/kama53.\345\257\273\345\256\235.md" "b/problems/kama53.\345\257\273\345\256\235.md" index b52ac374be..08fc9a18c3 100644 --- "a/problems/kama53.\345\257\273\345\256\235.md" +++ "b/problems/kama53.\345\257\273\345\256\235.md" @@ -1,155 +1,506 @@ +思考一下边的权值为负数的情况 -如果你的图相对较小且比较密集,而且你更注重简单性和空间效率,数组实现可能更合适。 -如果你的图规模较大,尤其是在稀疏图中,而且你更注重时间效率和通用性,优先级队列实现可能更合适。 +# 寻宝 -其关键 在于弄清楚 minDist 的定义 +[卡码网:53. 寻宝](https://kamacoder.com/problempage.php?pid=1053) -```CPP +题目描述: -#include -#include -#include -#include +在世界的某个区域,有一些分散的神秘岛屿,每个岛屿上都有一种珍稀的资源或者宝藏。你是一名探险者,决定前往这些岛屿,但为了节省时间和资源,你希望规划一条最短的路径,以便在探索这些岛屿时尽量减少旅行的距离。 -using namespace std; +给定一张地图,其中包括了所有的岛屿,以及它们之间的距离。每个岛屿都需要被至少访问一次,你的目标是规划一条最短路径,以最小化探索路径的总距离,同时确保访问了所有岛屿。 + +输入描述: + +第一行包含两个整数V 和 E,V代表顶点数,E代表边数 。顶点编号是从1到V。例如:V=2,一个有两个顶点,分别是1和2。 + +接下来共有 E 行,每行三个整数 v1,v2 和 val,v1 和 v2 为边的起点和终点,val代表边的权值。 + +输出描述: + +输出联通所有岛屿的最小路径总距离 + +输入示例: + +``` +7 11 +1 2 1 +1 3 1 +1 5 2 +2 6 1 +2 4 2 +2 3 2 +3 4 1 +4 5 1 +5 6 2 +5 7 1 +6 7 1 +``` + +输出示例: + +6 + + +## 解题思路 + +本题是最小生成树的模板题,那么我们来讲一讲最小生成树。 + +最小生成树 可以使用 prim算法 也可以使用 kruskal算法计算出来。 + +本篇我们先讲解 prim算法。 + +最小生成树是所有节点的最小连通子图, 即:以最小的成本(边的权值)将图中所有节点链接到一起。 + +图中有n个节点,那么一定可以用 n - 1 条边将所有节点连接到一起。 + +那么如何选择 这 n-1 条边 就是 最小生成树算法的任务所在。 + +例如本题示例中的无向有权图为: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20231206164306.png) + +那么在这个图中,如何选取 n-1 条边 使得 图中所有节点连接到一起,并且边的权值和最小呢? + +(图中为n为7,即7个节点,那么只需要 n-1 即 6条边就可以讲所有顶点连接到一起) + +prim算法 是从节点的角度 采用贪心的策略 每次寻找距离 最小生成树最近的节点 并加入到最小生成树中。 + +prim算法核心就是三步,我称为**prim三部曲**,大家一定要熟悉这三步,代码相对会好些很多: + +1. 第一步,选距离生成树最近节点 +2. 第二步,最近节点加入生成树 +3. 第三步,更新非生成树节点到生成树的距离(即更新minDist数组) + +现在录友们会对这三步很陌生,不知道这是干啥的,没关系,下面将会画图举例来带大家把这**prim三部曲**理解到位。 + +在prim算法中,有一个数组特别重要,这里我起名为:minDist。 + +刚刚我有讲过 “每次寻找距离 最小生成树最近的节点 并加入到最小生成树中”,那么如何寻找距离最小生成树最近的节点呢? + +这就用到了 minDist 数组, 它用来作什么呢? + +**minDist数组 用来记录 每一个节点距离最小生成树的最近距离**。 理解这一点非常重要,这也是 prim算法最核心要点所在,很多录友看不懂prim算法的代码,都是因为没有理解透 这个数组的含义。 + +接下来,我们来通过一步一步画图,来带大家巩固 **prim三部曲** 以及 minDist数组 的作用。 + +(**示例中节点编号是从1开始,所以为了让大家看的不晕,minDist数组下标我也从 1 开始计数,下标0 就不使用了,这样 下标和节点标号就可以对应上了,避免大家搞混**) + + +### 1 初始状态 + +minDist 数组 里的数值初始化为 最大数,因为本题 节点距离不会超过 10000,所以 初始化最大数为 10001就可以。 + +相信这里录友就要问了,为什么这么做? + +现在 还没有最小生成树,默认每个节点距离最小生成树是最大的,这样后面我们在比较的时候,发现更近的距离,才能更新到 minDist 数组上。 + +如图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20231215105603.png) + +开始构造最小生成树 + +### 2 + +1、prim三部曲,第一步:选距离生成树最近节点 + +选择距离最小生成树最近的节点,加入到最小生成树,刚开始还没有最小生成树,所以随便选一个节点加入就好(因为每一个节点一定会在最小生成树里,所以随便选一个就好),那我们选择节点1 (符合遍历数组的习惯,第一个遍历的也是节点1) + +2、prim三部曲,第二步:最近节点加入生成树 + +此时 节点1 已经算最小生成树的节点。 + +3、prim三部曲,第三步:更新非生成树节点到生成树的距离(即更新minDist数组) + +接下来,我们要更新所有节点距离最小生成树的距离,如图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20231222102048.png) + + +注意下标0,我们就不管它了,下标 1 与节点 1 对应,这样可以避免大家把节点搞混。 + +此时所有非生成树的节点距离 最小生成树(节点1)的距离都已经跟新了 。 + +* 节点2 与 节点1 的距离为1,比原先的 距离值10001小,所以更新minDist[2]。 +* 节点3 和 节点1 的距离为1,比原先的 距离值10001小,所以更新minDist[3]。 +* 节点5 和 节点1 的距离为2,比原先的 距离值10001小,所以更新minDist[5]。 + +**注意图中我标记了 minDist数组里更新的权值**,是哪两个节点之间的权值,例如 minDist[2] =1 ,这个 1 是 节点1 与 节点2 之间的连线,清楚这一点对最后我们记录 最小生成树的权值总和很重要。 + +(我在后面依然会不断重复 prim三部曲,可能基础好的录友会感觉有点啰嗦,但也是让大家感觉这三部曲求解的过程) + +### 3 + +1、prim三部曲,第一步:选距离生成树最近节点 + +选取一个距离 最小生成树(节点1) 最近的非生成树里的节点,节点2,3,5 距离 最小生成树(节点1) 最近,选节点 2(其实选 节点3或者节点5都可以,距离一样的)加入最小生成树。 + +2、prim三部曲,第二步:最近节点加入生成树 + +此时 节点1 和 节点2,已经算最小生成树的节点。 + + +3、prim三部曲,第三步:更新非生成树节点到生成树的距离(即更新minDist数组) + +接下来,我们要更新节点距离最小生成树的距离,如图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20231222102431.png) + +此时所有非生成树的节点距离 最小生成树(节点1、节点2)的距离都已经跟新了 。 + +* 节点3 和 节点2 的距离为2,和原先的距离值1 小,所以不用更新。 +* 节点4 和 节点2 的距离为2,比原先的距离值10001小,所以更新minDist[4]。 +* 节点5 和 节点2 的距离为10001(不连接),所以不用更新。 +* 节点6 和 节点2 的距离为1,比原先的距离值10001小,所以更新minDist[6]。 + +### 4 + +1、prim三部曲,第一步:选距离生成树最近节点 + +选择一个距离 最小生成树(节点1、节点2) 最近的非生成树里的节点,节点3,6 距离 最小生成树(节点1、节点2) 最近,选节点3 (选节点6也可以,距离一样)加入最小生成树。 + +2、prim三部曲,第二步:最近节点加入生成树 + +此时 节点1 、节点2 、节点3 算是最小生成树的节点。 + + +3、prim三部曲,第三步:更新非生成树节点到生成树的距离(即更新minDist数组) + +接下来更新节点距离最小生成树的距离,如图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20231222102457.png) + +所有非生成树的节点距离 最小生成树(节点1、节点2、节点3 )的距离都已经跟新了 。 + +* 节点 4 和 节点 3的距离为 1,和原先的距离值 2 小,所以更新minDist[3]为1。 + +上面为什么我们只比较 节点4 和 节点3 的距离呢? + +因为节点3加入 最小生成树后,非 生成树节点 只有 节点 4 和 节点3是链接的,所以需要重新更新一下 节点4距离最小生成树的距离,其他节点距离最小生成树的距离 都不变。 + +### 5 + +1、prim三部曲,第一步:选距离生成树最近节点 + +继续选择一个距离 最小生成树(节点1、节点2、节点3) 最近的非生成树里的节点,为了巩固大家对 minDist数组的理解,这里我再啰嗦一遍: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20231217213516.png) + +**minDist数组 是记录了 所有非生成树节点距离生成树的最小距离**,所以 从数组里我们能看出来,非生成树节点 4 和 节点 6 距离 生成树最近。 + + +任选一个加入生成树,我们选 节点4(选节点6也行) 。 + +**注意**,我们根据 minDist数组,选取距离 生成树 最近的节点 加入生成树,那么 **minDist数组里记录的其实也是 最小生成树的边的权值**(我在图中把权值对应的是哪两个节点也标记出来了)。 + +如果大家不理解,可以跟着我们下面的讲解,看 minDist数组的变化, minDist数组 里记录的权值对应的哪条边。 + +理解这一点很重要,因为 最后我们要求 最小生成树里所有边的权值和。 + +2、prim三部曲,第二步:最近节点加入生成树 + +此时 节点1、节点2、节点3、节点4 算是 最小生成树的节点。 + +3、prim三部曲,第三步:更新非生成树节点到生成树的距离(即更新minDist数组) + +接下来更新节点距离最小生成树的距离,如图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20231222102618.png) -// 定义图的邻接矩阵表示 -const int INF = INT_MAX; // 表示无穷大 -typedef vector> Graph; +minDist数组已经更新了 所有非生成树的节点距离 最小生成树(节点1、节点2、节点3、节点4 )的距离 。 -// 使用Prim算法找到最小生成树 -void primMST(const Graph& graph, int startVertex) { - int V = graph.size(); +* 节点 5 和 节点 4的距离为 1,和原先的距离值 2 小,所以更新minDist[4]为1。 - // 存储顶点是否在最小生成树中 - vector inMST(V, false); +### 6 - // 存储最小生成树的边权重 - vector key(V, INF); +1、prim三部曲,第一步:选距离生成树最近节点 - // 优先队列,存储边权重和目标顶点 - priority_queue, vector>, greater>> pq; +继续选距离 最小生成树(节点1、节点2、节点3、节点4 )最近的非生成树里的节点,只有 节点 5 和 节点6。 - // 初始顶点的权重设为0,加入优先队列 - key[startVertex] = 0; - pq.push({0, startVertex}); - while (!pq.empty()) { - // 从优先队列中取出权重最小的边 - int u = pq.top().second; - pq.pop(); +选节点5 (选节点6也可以)加入 生成树。 - // 将顶点u标记为在最小生成树中 - inMST[u] = true; +2、prim三部曲,第二步:最近节点加入生成树 - // 遍历u的所有邻居 - for (int v = 0; v < V; ++v) { - // 如果v未在最小生成树中,且u到v的权重小于v的当前权重 - if (!inMST[v] && graph[u][v] < key[v]) { - // 更新v的权重为u到v的权重 - key[v] = graph[u][v]; - // 将(u, v)添加到最小生成树 - pq.push({key[v], v}); +节点1、节点2、节点3、节点4、节点5 算是 最小生成树的节点。 + +3、prim三部曲,第三步:更新非生成树节点到生成树的距离(即更新minDist数组) + +接下来更新节点距离最小生成树的距离,如图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20231222102646.png) + +minDist数组已经更新了 所有非生成树的节点距离 最小生成树(节点1、节点2、节点3、节点4 、节点5)的距离 。 + +* 节点 6 和 节点 5 距离为 2,比原先的距离值 1 大,所以不更新 +* 节点 7 和 节点 5 距离为 1,比原先的距离值 10001小,更新 minDist[7] + +### 7 + +1、prim三部曲,第一步:选距离生成树最近节点 + +继续选距离 最小生成树(节点1、节点2、节点3、节点4 、节点5)最近的非生成树里的节点,只有 节点 6 和 节点7。 + +2、prim三部曲,第二步:最近节点加入生成树 + +选节点6 (选节点7也行,距离一样的)加入生成树。 + +3、prim三部曲,第三步:更新非生成树节点到生成树的距离(即更新minDist数组) + +节点1、节点2、节点3、节点4、节点5、节点6 算是 最小生成树的节点 ,接下来更新节点距离最小生成树的距离,如图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20231222102732.png) + +这里就不在重复描述了,大家类推,最后,节点7加入生成树,如图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20231222102820.png) + +### 最后 + +最后我们就生成了一个 最小生成树, 绿色的边将所有节点链接到一起,并且 保证权值是最小的,因为我们在更新 minDist 数组的时候,都是选距离 最小生成树最近的点 加入到树中。 + +讲解上面的模拟过程的时候,我已经强调多次 minDist数组 是记录了 所有非生成树节点距离生成树的最小距离。 + +最后,minDist数组 也就是记录的是最小生成树所有边的权值。 + +我在图中,特别把 每条边的权值对应的是哪两个节点 标记出来(例如minDist[7] = 1,对应的是节点5 和 节点7之间的边,而不是 节点6 和 节点7),为了就是让大家清楚, minDist里的每一个值 对应的是哪条边。 + +那么我们要求最小生成树里边的权值总和 就是 把 最后的 minDist 数组 累加一起。 + +以下代码,我对 prim三部曲,做了重点注释,大家根据这三步,就可以 透彻理解prim。 + +```CPP +#include +#include +using namespace std; +int main() { + int v, e; + int x, y, k; + cin >> v >> e; + // 填一个默认最大值,题目描述val最大为10000 + vector> grid(v + 1, vector(v + 1, 10001)); + while (e--) { + cin >> x >> y >> k; + // 因为是双向图,所以两个方向都要填上 + grid[x][y] = k; + grid[y][x] = k; + + } + // 所有节点到最小生成树的最小距离 + vector minDist(v + 1, 10001); + + // 这个节点是否在树里 + vector isInTree(v + 1, false); + + // 我们只需要循环 n-1次,建立 n - 1条边,就可以把n个节点的图连在一起 + for (int i = 1; i < v; i++) { + + // 1、prim三部曲,第一步:选距离生成树最近节点 + int cur = -1; // 选中哪个节点 加入最小生成树 + for (int j = 1; j <= v; j++) { // 1 - v,顶点编号,这里下标从1开始 + // 选取最小生成树节点的条件: + // (1)不在最小生成树里 + // (2)距离最小生成树最近的节点 + // (3)只要不在最小生成树里,先默认选一个节点 ,在比较 哪一个是最小的 + // 理解条件3 很重要,才能理解这段代码:(cur == -1 || minDist[j] < minDist[cur]) + if (!isInTree[j] && (cur == -1 || minDist[j] < minDist[cur])) { + cur = j; + } + } + // 2、prim三部曲,第二步:最近节点(cur)加入生成树 + isInTree[cur] = true; + + // 3、prim三部曲,第三步:更新非生成树节点到生成树的距离(即更新minDist数组) + // cur节点加入之后, 最小生成树加入了新的节点,那么所有节点到 最小生成树的距离(即minDist数组)需要更新一下 + // 由于cur节点是新加入到最小生成树,那么只需要关心与 cur 相连的 非生成树节点 的距离 是否比 原来 非生成树节点到生成树节点的距离更小了呢 + for (int j = 1; j <= v; j++) { + // 更新的条件: + // (1)节点是 非生成树里的节点 + // (2)与cur相连的某节点的权值 比 该某节点距离最小生成树的距离小 + // 很多录友看到自己 就想不明白什么意思,其实就是 cur 是新加入 最小生成树的节点,那么 所有非生成树的节点距离生成树节点的最近距离 由于 cur的新加入,需要更新一下数据了 + if (!isInTree[j] && grid[cur][j] < minDist[j]) { + minDist[j] = grid[cur][j]; } } } - - // 输出最小生成树的边 - cout << "Edges in the Minimum Spanning Tree:\n"; - for (int i = 1; i < V; ++i) { - cout << i << " - " << key[i] << " - " << i << "\n"; + // 统计结果 + int result = 0; + for (int i = 2; i <= v; i++) { // 不计第一个顶点,因为统计的是边的权值,v个节点有 v-1条边 + result += minDist[i]; } + cout << result << endl; + } +``` -int main() { - // 例子:无向图的邻接矩阵表示 - Graph graph = { - {0, 2, 0, 6, 0}, - {2, 0, 3, 8, 5}, - {0, 3, 0, 0, 7}, - {6, 8, 0, 0, 9}, - {0, 5, 7, 9, 0} - }; - - // 从顶点0开始运行Prim算法 - primMST(graph, 0); - - return 0; +## 拓展 + +上面讲解的是记录了最小生成树 所有边的权值,如果让打印出来 最小生成树的每条边呢? 或者说 要把这个最小生成树画出来呢? + + +此时我们就需要把 最小生成树里每一条边记录下来。 + +此时有两个问题: + +* 1、用什么结构来记录 +* 2、如何记录 + +如果记录边,其实就是记录两个节点就可以,两个节点连成一条边。 + +如何记录两个节点呢? + +我们使用一维数组就可以记录。 parent[节点编号] = 节点编号, 这样就把一条边记录下来了。(当然如果节点编号非常大,可以考虑使用map) + +使用一维数组记录是有向边,不过我们这里不需要记录方向,所以只关注两条边是连接的就行。 + +parent数组初始化代码: + +```CPP +vector parent(v + 1, -1); +``` + +接下来就是第二个问题,如何记录? + +我们再来回顾一下 prim三部曲, + +1. 第一步,选距离生成树最近节点 +2. 第二步,最近节点加入生成树 +3. 第三步,更新非生成树节点到生成树的距离(即更新minDist数组) + +大家先思考一下,我们是在第几步,可以记录 最小生成树的边呢? + +在本面上半篇 我们讲解过:“我们根据 minDist数组,选组距离 生成树 最近的节点 加入生成树,那么 **minDist数组里记录的其实也是 最小生成树的边的权值**。” + +既然 minDist数组 记录了 最小生成树的边,是不是就是在更新 minDist数组 的时候,去更新parent数组来记录一下对应的边呢。 + + +所以 在 prim三部曲中的第三步,更新 parent数组,代码如下: + +```CPP +for (int j = 1; j <= v; j++) { + if (!isInTree[j] && grid[cur][j] < minDist[j]) { + minDist[j] = grid[cur][j]; + parent[j] = cur; // 记录最小生成树的边 (注意数组指向的顺序很重要) + } } ``` +代码中注释中,我强调了 数组指向的顺序很重要。 因为不少录友在这里会写成这样: `parent[cur] = j` 。 -```CPP -#include -#include -#include +这里估计大家会疑惑了,parent[节点编号A] = 节点编号B, 就表示A 和 B 相连,我们这里就不用在意方向,代码中 为什么 只能 `parent[j] = cur` 而不能 `parent[cur] = j` 这么写呢? -using namespace std; +如果写成 `parent[cur] = j`,在 for 循环中,有多个 j 满足要求, 那么 parent[cur] 就会被反复覆盖,因为 cur 是一个固定值。 -// 定义图的邻接矩阵表示 -const int INF = INT_MAX; // 表示无穷大 -typedef vector> Graph; +举个例子,cur = 1, 在 for循环中,可能 就 j = 2, j = 3,j =4 都符合条件,那么本来应该记录 节点1 与 节点 2、节点3、节点4相连的。 -// 使用Prim算法找到最小生成树 -void primMST(const Graph& graph, int startVertex) { - int V = graph.size(); +如果 `parent[cur] = j` 这么写,最后更新的逻辑是 parent[1] = 2, parent[1] = 3, parent[1] = 4, 最后只能记录 节点1 与节点 4 相连,其他相连情况都被覆盖了。 - // 存储顶点是否在最小生成树中 - vector inMST(V, false); +如果这么写 `parent[j] = cur`, 那就是 parent[2] = 1, parent[3] = 1, parent[4] = 1 ,这样 才能完整表示出 节点1 与 其他节点都是链接的,才没有被覆盖。 - // 存储每个顶点的权重 - vector key(V, INF); +主要问题也是我们使用了一维数组来记录。 - // 初始化起始顶点的权重为0 - key[startVertex] = 0; +如果是二维数组,来记录两个点链接,例如 parent[节点编号A][节点编号B] = 1 ,parent[节点编号B][节点编号A] = 1,来表示 节点A 与 节点B 相连,那就没有上面说的这个注意事项了,当然这么做的话,就是多开辟的内存空间。 - // 存储最小生成树的边权重 - vector parent(V, -1); +以下是输出最小生成树边的代码,不算最后输出, 就额外添加了两行代码,我都注释标记了: - // 构建最小生成树 - for (int count = 0; count < V - 1; ++count) { - // 从未在最小生成树中的顶点中找到权重最小的顶点 - int u = -1; - for (int v = 0; v < V; ++v) { - if (!inMST[v] && (u == -1 || key[v] < key[u])) { - u = v; +```CPP +#include +#include +using namespace std; +int main() { + int v, e; + int x, y, k; + cin >> v >> e; + vector> grid(v + 1, vector(v + 1, 10001)); + while (e--) { + cin >> x >> y >> k; + grid[x][y] = k; + grid[y][x] = k; + } + + vector minDist(v + 1, 10001); + vector isInTree(v + 1, false); + + //加上初始化 + vector parent(v + 1, -1); + + for (int i = 1; i < v; i++) { + int cur = -1; + for (int j = 1; j <= v; j++) { + if (!isInTree[j] && (cur == -1 || minDist[j] < minDist[cur])) { + cur = j; } } + isInTree[cur] = true; + for (int j = 1; j <= v; j++) { + if (!isInTree[j] && grid[cur][j] < minDist[j]) { + minDist[j] = grid[cur][j]; - // 将顶点u标记为在最小生成树中 - inMST[u] = true; - - // 更新u的邻居的权重和父节点 - for (int v = 0; v < V; ++v) { - if (graph[u][v] != 0 && !inMST[v] && graph[u][v] < key[v]) { - key[v] = graph[u][v]; - parent[v] = u; + parent[j] = cur; // 记录边 } } } - - // 输出最小生成树的边 - cout << "Edges in the Minimum Spanning Tree:\n"; - for (int i = 1; i < V; ++i) { - cout << parent[i] << " - " << key[i] << " - " << i << "\n"; + // 输出 最小生成树边的链接情况 + for (int i = 1; i <= v; i++) { + cout << i "->" parent[i] << endl; } } +``` + +按照本题示例,代码输入如下: -int main() { - // 例子:无向图的邻接矩阵表示 - Graph graph = { - {0, 2, 0, 6, 0}, - {2, 0, 3, 8, 5}, - {0, 3, 0, 0, 7}, - {6, 8, 0, 0, 9}, - {0, 5, 7, 9, 0} - }; - - // 从顶点0开始运行Prim算法 - primMST(graph, 0); - - return 0; -} ``` +1->-1 +2->1 +3->1 +4->3 +5->4 +6->2 +7->5 +``` + +注意,这里是无向图,我在输出上添加了箭头仅仅是为了方便大家看出是边的意思。 + +大家可以和我们本题最后生成的最小生成树的图 去对比一下 边的链接情况: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20231229115714.png) + +绿色的边 是最小生成树,和我们的 输出完全一致。 + +## 总结 + +此时我就把prim算法讲解完毕了,我们再来回顾一下。 + +关于 prim算法,我自创了三部曲,来帮助大家理解: + +1. 第一步,选距离生成树最近节点 +2. 第二步,最近节点加入生成树 +3. 第三步,更新非生成树节点到生成树的距离(即更新minDist数组) + +大家只要理解这三部曲, prim算法 至少是可以写出一个框架出来,然后在慢慢补充细节,这样不至于 自己在写prim的时候 两眼一抹黑 完全凭感觉去写。 +这也为什么很多录友感觉 prim算法比较难,而且每次学会来,隔一段时间 又不会写了,主要是 没有一个纲领。 + +理解这三部曲之后,更重要的 就是理解 minDist数组。 + +**minDist数组 是prim算法的灵魂,它帮助 prim算法完成最重要的一步,就是如何找到 距离最小生成树最近的点**。 + +再来帮大家回顾 minDist数组 的含义:记录 每一个节点距离最小生成树的最近距离。 + +理解 minDist数组 ,至少大家看prim算法的代码不会懵。 + +也正是 因为 minDist数组 的作用,我们根据 minDist数组,选取距离 生成树 最近的节点 加入生成树,那么 **minDist数组里记录的其实也是 最小生成树的边的权值**。 + +所以我们求 最小生成树的权值和 就是 计算后的 minDist数组 数值总和。 + +最后我们拓展了如何求职 最小生成树 的每一条边,其实 添加的代码很简单,主要是理解 为什么使用 parent数组 来记录边 以及 在哪里 更新parent数组。 + +同时,因为使用一维数组,数组的下标和数组 如何赋值很重要,不要搞反,导师结果被覆盖。 + +好了,以上为总结,录友们学习愉快。 + + + + From c736cffe22143965ffc50896ca5b11a3e65df536 Mon Sep 17 00:00:00 2001 From: zhqiao Date: Tue, 2 Jan 2024 21:16:29 +0800 Subject: [PATCH 2403/3019] =?UTF-8?q?0377=20=E6=96=B0=E5=A2=9Epython=20?= =?UTF-8?q?=E4=BA=8C=E7=BB=B4DP=E6=95=B0=E7=BB=84=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...10\346\200\273\345\222\214\342\205\243.md" | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git "a/problems/0377.\347\273\204\345\220\210\346\200\273\345\222\214\342\205\243.md" "b/problems/0377.\347\273\204\345\220\210\346\200\273\345\222\214\342\205\243.md" index d9699c5407..05f852b1c6 100644 --- "a/problems/0377.\347\273\204\345\220\210\346\200\273\345\222\214\342\205\243.md" +++ "b/problems/0377.\347\273\204\345\220\210\346\200\273\345\222\214\342\205\243.md" @@ -206,6 +206,34 @@ class Solution: ``` +二维DP版 +```python +class Solution: + def combinationSum4(self, nums: List[int], target: int) -> int: + # dp[][j]和为j的组合的总数 + dp = [[0] * (target+1) for _ in nums] + + for i in range(len(nums)): + dp[i][0] = 1 + + # 这里不能初始化dp[0][j]。dp[0][j]的值依赖于dp[-1][j-nums[0]] + + for j in range(1, target+1): + for i in range(len(nums)): + + if j - nums[i] >= 0: + dp[i][j] = ( + # 不放nums[i] + # i = 0 时,dp[-1][j]恰好为0,所以没有特殊处理 + dp[i-1][j] + + # 放nums[i]。对于和为j的组合,只有试过全部物品,才能知道有几种组合方式。所以取最后一个物品dp[-1][j-nums[i]] + dp[-1][j-nums[i]] + ) + else: + dp[i][j] = dp[i-1][j] + return dp[-1][-1] +``` + ### Go: ```go From 499d2afb618298ddb3e0e4f8d88f6f13284f0d97 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B6=9B=20=E9=99=88?= <761050293@qq.com> Date: Wed, 3 Jan 2024 09:21:34 +0800 Subject: [PATCH 2404/3019] =?UTF-8?q?Update=200860.=E6=9F=A0=E6=AA=AC?= =?UTF-8?q?=E6=B0=B4=E6=89=BE=E9=9B=B6=EF=BC=8C=E6=B7=BB=E5=8A=A0C#?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...54\346\260\264\346\211\276\351\233\266.md" | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git "a/problems/0860.\346\237\240\346\252\254\346\260\264\346\211\276\351\233\266.md" "b/problems/0860.\346\237\240\346\252\254\346\260\264\346\211\276\351\233\266.md" index 50a0c31a50..db70112d8f 100644 --- "a/problems/0860.\346\237\240\346\252\254\346\260\264\346\211\276\351\233\266.md" +++ "b/problems/0860.\346\237\240\346\252\254\346\260\264\346\211\276\351\233\266.md" @@ -397,6 +397,46 @@ object Solution { } } ``` +### C# +```csharp +public class Solution +{ + public bool LemonadeChange(int[] bills) + { + int five = 0, ten = 0, twenty = 0; + foreach (var bill in bills) + { + if (bill == 5) five++; + if (bill == 10) + { + if (five == 0) return false; + five--; + ten++; + } + if (bill == 20) + { + if (ten > 0 && five > 0) + { + ten--; + five--; + twenty++; + } + else if (five >= 3) + { + five -= 3; + twenty++; + } + else + { + return false; + } + + } + } + return true; + } +} +```

From d479e755cbd39cfdc5b3dd9ba97f3c5ffdf84604 Mon Sep 17 00:00:00 2001 From: Relsola Date: Wed, 3 Jan 2024 20:31:05 +0800 Subject: [PATCH 2405/3019] =?UTF-8?q?update=20130.=E8=A2=AB=E5=9B=B4?= =?UTF-8?q?=E7=BB=95=E7=9A=84=E5=8C=BA=E5=9F=9F=EF=BC=8C417.=E5=A4=AA?= =?UTF-8?q?=E5=B9=B3=E6=B4=8B=E5=A4=A7=E8=A5=BF=E6=B4=8B=E6=B0=B4=E6=B5=81?= =?UTF-8?q?=E9=97=AE=E9=A2=98=E6=96=B0=E5=A2=9E=20JS=20=E5=B9=BF=E6=90=9C?= =?UTF-8?q?=E5=92=8C=E6=B7=B1=E6=90=9C=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...25\347\232\204\345\214\272\345\237\237.md" | 126 ++++++++++++++++++ ...64\346\265\201\351\227\256\351\242\230.md" | 111 +++++++++++++++ 2 files changed, 237 insertions(+) diff --git "a/problems/0130.\350\242\253\345\233\264\347\273\225\347\232\204\345\214\272\345\237\237.md" "b/problems/0130.\350\242\253\345\233\264\347\273\225\347\232\204\345\214\272\345\237\237.md" index e8a1f02f69..8014c0c8bf 100644 --- "a/problems/0130.\350\242\253\345\233\264\347\273\225\347\232\204\345\214\272\345\237\237.md" +++ "b/problems/0130.\350\242\253\345\233\264\347\273\225\347\232\204\345\214\272\345\237\237.md" @@ -435,6 +435,132 @@ class Solution: ``` +### JavaScript +```JavaScript +/** + * @description 深度搜索优先 + * @param {character[][]} board + * @return {void} Do not return anything, modify board in-place instead. + */ +function solve(board) { + const dir = [[-1, 0], [1, 0], [0, -1], [0, 1]]; + const [rowSize, colSize] = [board.length, board[0].length]; + + function dfs(board, x, y) { + board[x][y] = 'A'; + for (let i = 0; i < 4; i++) { + const nextX = dir[i][0] + x; + const nextY = dir[i][1] + y; + if (nextX < 0 || nextX >= rowSize || nextY < 0 || nextY >= colSize) { + continue; + } + if (board[nextX][nextY] === 'O') { + dfs(board, nextX, nextY); + } + } + } + + for (let i = 0; i < rowSize; i++) { + if (board[i][0] === 'O') { + dfs(board, i, 0); + } + if (board[i][colSize - 1] === 'O') { + dfs(board, i, colSize - 1); + } + } + + for (let i = 1; i < colSize - 1; i++) { + if (board[0][i] === 'O') { + dfs(board, 0, i); + } + if (board[rowSize - 1][i] === 'O') { + dfs(board, rowSize - 1, i); + } + } + + for (let i = 0; i < rowSize; i++) { + for (let k = 0; k < colSize; k++) { + if (board[i][k] === 'A') { + board[i][k] = 'O'; + } else if (board[i][k] === 'O') { + board[i][k] = 'X'; + } + } + } +} + +/** + * @description 广度搜索优先 + * @param {character[][]} board + * @return {void} Do not return anything, modify board in-place instead. + */ +function solve(board) { + const dir = [[-1, 0], [1, 0], [0, -1], [0, 1]]; + const [rowSize, colSize] = [board.length, board[0].length]; + + function bfs(board, x, y) { + board[x][y] = 'A'; + const stack = [y, x]; + + while (stack.length !== 0) { + const top = [stack.pop(), stack.pop()]; + for (let i = 0; i < 4; i++) { + const nextX = dir[i][0] + top[0]; + const nextY = dir[i][1] + top[1]; + + if (nextX < 0 || nextX >= rowSize || nextY < 0 || nextY >= colSize) { + continue; + } + + if (board[nextX][nextY] === 'O') { + board[nextX][nextY] = 'A'; + stack.push(nextY, nextX); + } + } + } + + for (let i = 0; i < 4; i++) { + const nextX = dir[i][0] + x; + const nextY = dir[i][1] + y; + if (nextX < 0 || nextX >= rowSize || nextY < 0 || nextY >= colSize) { + continue; + } + if (board[nextX][nextY] === 'O') { + dfs(board, nextX, nextY); + } + } + } + + for (let i = 0; i < rowSize; i++) { + if (board[i][0] === 'O') { + bfs(board, i, 0); + } + if (board[i][colSize - 1] === 'O') { + bfs(board, i, colSize - 1); + } + } + + for (let i = 1; i < colSize - 1; i++) { + if (board[0][i] === 'O') { + bfs(board, 0, i); + } + if (board[rowSize - 1][i] === 'O') { + bfs(board, rowSize - 1, i); + } + } + + for (let i = 0; i < rowSize; i++) { + for (let k = 0; k < colSize; k++) { + if (board[i][k] === 'A') { + board[i][k] = 'O'; + } else if (board[i][k] === 'O') { + board[i][k] = 'X'; + } + } + } +} +``` +

diff --git "a/problems/0417.\345\244\252\345\271\263\346\264\213\345\244\247\350\245\277\346\264\213\346\260\264\346\265\201\351\227\256\351\242\230.md" "b/problems/0417.\345\244\252\345\271\263\346\264\213\345\244\247\350\245\277\346\264\213\346\260\264\346\265\201\351\227\256\351\242\230.md" index 6777e2d974..53ae14edfe 100644 --- "a/problems/0417.\345\244\252\345\271\263\346\264\213\345\244\247\350\245\277\346\264\213\346\260\264\346\265\201\351\227\256\351\242\230.md" +++ "b/problems/0417.\345\244\252\345\271\263\346\264\213\345\244\247\350\245\277\346\264\213\346\260\264\346\265\201\351\227\256\351\242\230.md" @@ -450,6 +450,117 @@ class Solution: return ans ``` +### JavaScript +```JavaScript +/** + * @description 深度搜索优先 + * @param {number[][]} heights + * @return {number[][]} + */ +function pacificAtlantic(heights) { + const dir = [[-1, 0], [0, -1], [1, 0], [0, 1]]; + const [rowSize, colSize] = [heights.length, heights[0].length]; + const visited = Array.from({ length: rowSize }, _ => + Array.from({ length: colSize }, _ => new Array(2).fill(false)) + ); + const result = []; + + function dfs(heights, visited, x, y, sign) { + if (visited[x][y][sign]) { + return; + } + visited[x][y][sign] = true; + for (let i = 0; i < 4; i++) { + const nextX = x + dir[i][0]; + const nextY = y + dir[i][1]; + if (nextX < 0 || nextX >= rowSize || nextY < 0 || nextY >= colSize) { + continue; + } + if (heights[x][y] > heights[nextX][nextY]) { + continue; + } + dfs(heights, visited, nextX, nextY, sign); + } + } + + for (let i = 0; i < rowSize; i++) { + dfs(heights, visited, i, 0, 0); + dfs(heights, visited, i, colSize - 1, 1); + } + + for (let i = 0; i < colSize; i++) { + dfs(heights, visited, 0, i, 0); + dfs(heights, visited, rowSize - 1, i, 1); + } + + for (let i = 0; i < rowSize; i++) { + for (let k = 0; k < colSize; k++) { + if (visited[i][k][0] && visited[i][k][1]) { + result.push([i, k]); + } + } + } + + return result; +} + +/** + * @description 广度搜索优先 + * @param {number[][]} heights + * @return {number[][]} + */ +function pacificAtlantic(heights) { + const dir = [[-1, 0], [0, -1], [1, 0], [0, 1]]; + const [rowSize, colSize] = [heights.length, heights[0].length]; + const visited = Array.from({ length: rowSize }, _ => + Array.from({ length: colSize }, _ => new Array(2).fill(false)) + ); + const result = []; + + function bfs(heights, visited, x, y, sign) { + if (visited[x][y][sign]) { + return; + } + visited[x][y][sign] = true; + const stack = [y, x]; + while (stack.length !== 0) { + [x, y] = [stack.pop(), stack.pop()]; + for (let i = 0; i < 4; i++) { + const nextX = x + dir[i][0]; + const nextY = y + dir[i][1]; + if (nextX < 0 || nextX >= rowSize || nextY < 0 || nextY >= colSize) { + continue; + } + if (heights[x][y] > heights[nextX][nextY] || visited[nextX][nextY][sign]) { + continue; + } + visited[nextX][nextY][sign] = true; + stack.push(nextY, nextX); + } + } + } + + for (let i = 0; i < rowSize; i++) { + bfs(heights, visited, i, 0, 0); + bfs(heights, visited, i, colSize - 1, 1); + } + + for (let i = 0; i < colSize; i++) { + bfs(heights, visited, 0, i, 0); + bfs(heights, visited, rowSize - 1, i, 1); + } + + for (let i = 0; i < rowSize; i++) { + for (let k = 0; k < colSize; k++) { + if (visited[i][k][0] && visited[i][k][1]) { + result.push([i, k]); + } + } + } + + return result; +} +``` From b05f66d853a42afa17bb98963c2fdf65c3bcd6a8 Mon Sep 17 00:00:00 2001 From: eeee0717 Date: Thu, 4 Jan 2024 10:41:09 +0800 Subject: [PATCH 2406/3019] =?UTF-8?q?Update0406.=E6=A0=B9=E6=8D=AE?= =?UTF-8?q?=E5=AE=A1=E7=A8=BF=E9=87=8D=E5=BB=BA=E9=98=9F=E5=88=97=EF=BC=8C?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0C#?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...15\345\273\272\351\230\237\345\210\227.md" | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git "a/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" "b/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" index 9cd78fac62..b0b02c1454 100644 --- "a/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" +++ "b/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" @@ -396,6 +396,29 @@ object Solution { } } ``` +### C# +```csharp +public class Solution +{ + public int[][] ReconstructQueue(int[][] people) + { + Array.Sort(people, (a, b) => + { + if (a[0] == b[0]) + { + return a[1] - b[1]; + } + return b[0] - a[0]; + }); + var res = new List(); + for (int i = 0; i < people.Length; i++) + { + res.Insert(people[i][1], people[i]); + } + return res.ToArray(); + } +} +```

From 709b5babf0c01f4aa35034ab45f948531e15964e Mon Sep 17 00:00:00 2001 From: eeee0717 Date: Thu, 4 Jan 2024 11:12:29 +0800 Subject: [PATCH 2407/3019] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8DC#=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E9=AB=98=E4=BA=AE=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\277\345\233\236\346\226\207\345\255\220\344\270\262.md" | 4 ++-- ...\204\345\255\227\346\257\215\347\273\204\345\220\210.md" | 2 +- ...\250\344\270\255\347\232\204\350\212\202\347\202\271.md" | 2 +- "problems/0028.\345\256\236\347\216\260strStr.md" | 2 +- ...\216\344\270\200\344\270\252\344\275\215\347\275\256.md" | 2 +- ...062.\344\270\215\345\220\214\350\267\257\345\276\204.md" | 2 +- "problems/0070.\347\210\254\346\245\274\346\242\257.md" | 2 +- "problems/0077.\347\273\204\345\220\210.md" | 2 +- "problems/0090.\345\255\220\351\233\206II.md" | 2 +- ...\214\345\217\211\346\220\234\347\264\242\346\240\221.md" | 2 +- ...\271\347\247\260\344\272\214\345\217\211\346\240\221.md" | 2 +- ...\204\345\261\202\345\272\217\351\201\215\345\216\206.md" | 4 ++-- ...\204\346\234\200\345\244\247\346\267\261\345\272\246.md" | 6 +++--- ...\204\351\200\240\344\272\214\345\217\211\346\240\221.md" | 2 +- ...\263\350\241\241\344\272\214\345\217\211\346\240\221.md" | 2 +- ...\204\346\234\200\345\260\217\346\267\261\345\272\246.md" | 4 ++-- ...112.\350\267\257\345\276\204\346\200\273\345\222\214.md" | 2 +- ...\262\351\207\214\347\232\204\345\215\225\350\257\215.md" | 2 +- ...\204\350\212\202\347\202\271\344\270\252\346\225\260.md" | 2 +- ...\221\345\205\254\345\205\261\347\245\226\345\205\210.md" | 2 +- ...\221\345\205\254\345\205\261\347\245\226\345\205\210.md" | 2 +- ...\204\346\211\200\346\234\211\350\267\257\345\276\204.md" | 2 +- ...\246\345\217\266\345\255\220\344\271\213\345\222\214.md" | 2 +- ...\221\344\270\255\347\232\204\350\212\202\347\202\271.md" | 2 +- ...\204\345\255\220\345\255\227\347\254\246\344\270\262.md" | 2 +- ...\221\344\270\255\347\232\204\344\274\227\346\225\260.md" | 2 +- ...\220\346\263\242\351\202\243\345\245\221\346\225\260.md" | 4 ++-- ...\246\344\270\213\350\247\222\347\232\204\345\200\274.md" | 2 +- ...\200\345\260\217\347\273\235\345\257\271\345\267\256.md" | 2 +- ...\242\344\270\272\347\264\257\345\212\240\346\240\221.md" | 2 +- ...\210\345\271\266\344\272\214\345\217\211\346\240\221.md" | 2 +- ...\200\345\244\247\344\272\214\345\217\211\346\240\221.md" | 2 +- ...\214\345\217\211\346\220\234\347\264\242\346\240\221.md" | 2 +- ...\221\344\270\255\347\232\204\346\220\234\347\264\242.md" | 2 +- ...707.\350\256\276\350\256\241\351\223\276\350\241\250.md" | 2 +- ...\261\350\264\271\347\210\254\346\245\274\346\242\257.md" | 2 +- ...\237\344\270\200\350\277\255\344\273\243\346\263\225.md" | 6 +++--- ...\204\350\277\255\344\273\243\351\201\215\345\216\206.md" | 2 +- ...\204\351\200\222\345\275\222\351\201\215\345\216\206.md" | 6 +++--- ....07.\351\223\276\350\241\250\347\233\270\344\272\244.md" | 2 +- 40 files changed, 50 insertions(+), 50 deletions(-) diff --git "a/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" "b/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" index 614f60514c..b13f9ac356 100644 --- "a/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" +++ "b/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" @@ -618,7 +618,7 @@ char * longestPalindrome(char * s){ ### C#: 動態規則: -```c# +```csharp public class Solution { public string LongestPalindrome(string s) { @@ -648,7 +648,7 @@ public class Solution { ``` 雙指針: -```C# +```csharp public class Solution { int maxlenth = 0; int left = 0; diff --git "a/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" "b/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" index 8a16008abf..cbd99f8d93 100644 --- "a/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" +++ "b/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" @@ -733,7 +733,7 @@ def backtracking(result, letter_map, digits, path, index) end ``` ### C# -```C# +```csharp public class Solution { public IList res = new List(); diff --git "a/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" "b/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" index 405f4183e9..b2a830a746 100644 --- "a/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" +++ "b/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" @@ -462,7 +462,7 @@ impl Solution { ``` ### C# -```C# +```csharp // 虚拟头结点 public ListNode SwapPairs(ListNode head) { diff --git "a/problems/0028.\345\256\236\347\216\260strStr.md" "b/problems/0028.\345\256\236\347\216\260strStr.md" index bf4ad600c3..25b8179951 100644 --- "a/problems/0028.\345\256\236\347\216\260strStr.md" +++ "b/problems/0028.\345\256\236\347\216\260strStr.md" @@ -1359,7 +1359,7 @@ impl Solution { ``` >前缀表统一不减一 -```C# +```csharp public int StrStr(string haystack, string needle) { if (string.IsNullOrEmpty(needle)) diff --git "a/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" "b/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" index 3bf90e3bbb..22936fef13 100644 --- "a/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" +++ "b/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" @@ -331,7 +331,7 @@ class Solution { ### C# -```c# +```csharp public int[] SearchRange(int[] nums, int target) { var leftBorder = GetLeftBorder(nums, target); diff --git "a/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" "b/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" index b7ce542ebe..5131fdbbbd 100644 --- "a/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" +++ "b/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" @@ -537,7 +537,7 @@ object Solution { ### c# -```c# +```csharp public class Solution { public int UniquePaths(int m, int n) diff --git "a/problems/0070.\347\210\254\346\245\274\346\242\257.md" "b/problems/0070.\347\210\254\346\245\274\346\242\257.md" index 7a59221dc6..d300683e1c 100644 --- "a/problems/0070.\347\210\254\346\245\274\346\242\257.md" +++ "b/problems/0070.\347\210\254\346\245\274\346\242\257.md" @@ -470,7 +470,7 @@ object Solution { ### C# -```c# +```csharp public class Solution { public int ClimbStairs(int n) { if(n<=2) return n; diff --git "a/problems/0077.\347\273\204\345\220\210.md" "b/problems/0077.\347\273\204\345\220\210.md" index 8bca6f2496..103fb627f5 100644 --- "a/problems/0077.\347\273\204\345\220\210.md" +++ "b/problems/0077.\347\273\204\345\220\210.md" @@ -793,7 +793,7 @@ end ``` ### C# -```C# +```csharp // 暴力 public class Solution { diff --git "a/problems/0090.\345\255\220\351\233\206II.md" "b/problems/0090.\345\255\220\351\233\206II.md" index 9fc334a4d8..1bb63a34d6 100644 --- "a/problems/0090.\345\255\220\351\233\206II.md" +++ "b/problems/0090.\345\255\220\351\233\206II.md" @@ -641,7 +641,7 @@ object Solution { } ``` ### C# -```c# +```csharp public class Solution { public IList> res = new List>(); diff --git "a/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" index 319ad1aaa1..88e1628243 100644 --- "a/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" +++ "b/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" @@ -792,7 +792,7 @@ impl Solution { } ``` ### C# -```C# +```csharp // 递归 public long val = Int64.MinValue; public bool IsValidBST(TreeNode root) diff --git "a/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" "b/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" index 1b777dd527..8442f0ab9e 100644 --- "a/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" @@ -898,7 +898,7 @@ impl Solution { } ``` ### C# -```C# +```csharp // 递归 public bool IsSymmetric(TreeNode root) { diff --git "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" index e977279c56..4411b5609f 100644 --- "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" +++ "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" @@ -463,7 +463,7 @@ impl Solution { } ``` ### C# -```C# +```csharp public IList> LevelOrder(TreeNode root) { var res = new List>(); @@ -825,7 +825,7 @@ impl Solution { } ``` ### C# -```C# +```csharp public IList> LevelOrderBottom(TreeNode root) { var res = new List>(); diff --git "a/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" "b/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" index b89dbf457c..f4c6cfc8f4 100644 --- "a/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" +++ "b/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" @@ -1033,7 +1033,7 @@ impl Solution { } ``` ### C# -```C# +```csharp // 递归法 public int MaxDepth(TreeNode root) { if(root == null) return 0; @@ -1044,7 +1044,7 @@ public int MaxDepth(TreeNode root) { return 1 + Math.Max(leftDepth, rightDepth); } ``` -```C# +```csharp // 前序遍历 int result = 0; public int MaxDepth(TreeNode root) @@ -1065,7 +1065,7 @@ public void GetDepth(TreeNode root, int depth) return; } ``` -```C# +```csharp // 迭代法 public int MaxDepth(TreeNode root) { diff --git "a/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" "b/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" index dc517480a6..0e0ab1d74f 100644 --- "a/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" @@ -1229,7 +1229,7 @@ impl Solution { } ``` ### C# -```C# +```csharp public TreeNode BuildTree(int[] inorder, int[] postorder) { if (inorder.Length == 0 || postorder.Length == null) return null; diff --git "a/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" "b/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" index 41669bff7f..40fdcd143d 100644 --- "a/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" @@ -909,7 +909,7 @@ impl Solution { } ``` ### C# -```C# +```csharp public bool IsBalanced(TreeNode root) { return GetHeight(root) == -1 ? false : true; diff --git "a/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" "b/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" index 465233493d..6d1632d593 100644 --- "a/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" +++ "b/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" @@ -709,7 +709,7 @@ impl Solution { } ``` ### C# -```C# +```csharp // 递归 public int MinDepth(TreeNode root) { @@ -725,7 +725,7 @@ public int MinDepth(TreeNode root) return res; } ``` -```C# +```csharp // 迭代 public int MinDepth(TreeNode root) { diff --git "a/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" "b/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" index f1ce7637ba..28134a7cf3 100644 --- "a/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" +++ "b/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" @@ -1513,7 +1513,7 @@ impl Solution { ``` ### C# -```C# +```csharp // 0112.路径总和 // 递归 public bool HasPathSum(TreeNode root, int targetSum) diff --git "a/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" "b/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" index d15bb5f321..520f17a7ec 100644 --- "a/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" +++ "b/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" @@ -973,7 +973,7 @@ char * reverseWords(char * s){ ``` ### C# -```C# LINQ高级方法 +```csharp LINQ高级方法 public string ReverseWords(string s) { return string.Join(' ', s.Trim().Split(' ',StringSplitOptions.RemoveEmptyEntries).Reverse()); } diff --git "a/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" "b/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" index ef6e88aaae..d93d2a3381 100644 --- "a/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" +++ "b/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" @@ -868,7 +868,7 @@ impl Solution { } ``` ### C# -```C# +```csharp // 递归 public int CountNodes(TreeNode root) { diff --git "a/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" "b/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" index b27a231e77..cec8a1dd2b 100644 --- "a/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" +++ "b/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" @@ -514,7 +514,7 @@ impl Solution { } ``` ### C# -```C# +```csharp // 递归 public TreeNode LowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { diff --git "a/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" "b/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" index 0e99f1c2fb..049f70c7ae 100644 --- "a/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" +++ "b/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" @@ -432,7 +432,7 @@ impl Solution { } ``` ### C# -```C# +```csharp public TreeNode LowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { if (root == null || root == p || root == q) return root; diff --git "a/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" "b/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" index 9ba165c798..4c6c92c5b4 100644 --- "a/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" +++ "b/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" @@ -901,7 +901,7 @@ impl Solution { } ``` ### C# -```C# +```csharp public IList BinaryTreePaths(TreeNode root) { List path = new(); diff --git "a/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" "b/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" index 6dfcc886bc..3d0f5a8abf 100644 --- "a/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" +++ "b/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" @@ -652,7 +652,7 @@ impl Solution { } ``` ### C# -```C# +```csharp // 递归 public int SumOfLeftLeaves(TreeNode root) { diff --git "a/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" "b/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" index 13c25023a2..8922a14e14 100644 --- "a/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" +++ "b/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" @@ -772,7 +772,7 @@ impl Solution { ### C# > 递归法: -```C# +```csharp public TreeNode DeleteNode(TreeNode root, int key) { // 第一种情况:没找到删除的节点,遍历到空节点直接返回了 if (root == null) return null; diff --git "a/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" "b/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" index 3245d94897..311e3a695e 100644 --- "a/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" @@ -682,7 +682,7 @@ impl Solution { } ``` ### C# -```C# +```csharp // 前缀表不减一 public bool RepeatedSubstringPattern(string s) { diff --git "a/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" "b/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" index 5b26d580b2..20627d1ad6 100644 --- "a/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" +++ "b/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" @@ -1010,7 +1010,7 @@ pub fn find_mode(root: Option>>) -> Vec { } ``` ### C# -```C# +```csharp // 递归 public class Solution { diff --git "a/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" "b/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" index 0c073db5bb..71c022bd34 100644 --- "a/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" +++ "b/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" @@ -439,7 +439,7 @@ object Solution { 动态规划: -```c# +```csharp public class Solution { public int Fib(int n) @@ -459,7 +459,7 @@ public class Solution 递归: -```c# +```csharp public class Solution { public int Fib(int n) diff --git "a/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" "b/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" index 0e2f426633..3cdcc80163 100644 --- "a/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" +++ "b/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" @@ -685,7 +685,7 @@ impl Solution { } ``` ### C# -```C# +```csharp //递归 int maxDepth = -1; int res = 0; diff --git "a/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" "b/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" index f08df577d9..82b3f5d4e9 100644 --- "a/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" +++ "b/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" @@ -648,7 +648,7 @@ impl Solution { } ``` ### C# -```C# +```csharp // 递归 public class Solution { diff --git "a/problems/0538.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md" "b/problems/0538.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md" index 07cae1adb9..7fcb5efd32 100644 --- "a/problems/0538.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md" +++ "b/problems/0538.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md" @@ -530,7 +530,7 @@ impl Solution { } ``` ### C# -```C# +```csharp // 递归 public class Solution { diff --git "a/problems/0617.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md" "b/problems/0617.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md" index 9efeb56db9..3478a2af5d 100644 --- "a/problems/0617.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0617.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md" @@ -789,7 +789,7 @@ impl Solution { } ``` ### C# -```C# +```csharp public TreeNode MergeTrees(TreeNode root1, TreeNode root2) { if (root1 == null) return root2; diff --git "a/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" "b/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" index 6b343840f9..f54558a68c 100644 --- "a/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" @@ -583,7 +583,7 @@ impl Solution { } ``` ### C# -```C# +```csharp public TreeNode ConstructMaximumBinaryTree(int[] nums) { if (nums.Length == 0) return null; diff --git "a/problems/0669.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0669.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" index 229a2ab148..916013c52c 100644 --- "a/problems/0669.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" +++ "b/problems/0669.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" @@ -568,7 +568,7 @@ impl Solution { } ``` ### C# -```C# +```csharp // 递归 public TreeNode TrimBST(TreeNode root, int low, int high) { diff --git "a/problems/0700.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\220\234\347\264\242.md" "b/problems/0700.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\220\234\347\264\242.md" index 65e6921915..9efb1e0519 100644 --- "a/problems/0700.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\220\234\347\264\242.md" +++ "b/problems/0700.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\220\234\347\264\242.md" @@ -465,7 +465,7 @@ impl Solution { } ``` ### C# -```C# +```csharp // 递归 public TreeNode SearchBST(TreeNode root, int val) { diff --git "a/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" "b/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" index a08227d9fc..fecdbc3cad 100644 --- "a/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" +++ "b/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" @@ -1486,7 +1486,7 @@ impl MyLinkedList { ``` ### C# -```C# +```csharp class ListNode { public int val; diff --git "a/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" "b/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" index 6fb518c371..d13ff19f5a 100644 --- "a/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" +++ "b/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" @@ -500,7 +500,7 @@ object Solution { ### C# -```c# +```csharp public class Solution { public int MinCostClimbingStairs(int[] cost) diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\347\273\237\344\270\200\350\277\255\344\273\243\346\263\225.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\347\273\237\344\270\200\350\277\255\344\273\243\346\263\225.md" index ad79424da8..ee4899b1b1 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\347\273\237\344\270\200\350\277\255\344\273\243\346\263\225.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\347\273\237\344\270\200\350\277\255\344\273\243\346\263\225.md" @@ -742,7 +742,7 @@ impl Solution{ } ``` ### C# -```C# +```csharp // 前序遍历 public IList PreorderTraversal(TreeNode root) { @@ -772,7 +772,7 @@ public IList PreorderTraversal(TreeNode root) return res; } ``` -```C# +```csharp // 中序遍历 public IList InorderTraversal(TreeNode root) { @@ -803,7 +803,7 @@ public IList InorderTraversal(TreeNode root) } ``` -```C# +```csharp // 后序遍历 public IList PostorderTraversal(TreeNode root) { diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" index e39709b882..35a01a7fbe 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" @@ -696,7 +696,7 @@ impl Solution { } ``` ### C# -```C# +```csharp // 前序遍历 public IList PreorderTraversal(TreeNode root) { diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" index 6dad6e56de..92a8341fae 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" @@ -566,7 +566,7 @@ impl Solution { ``` ### C# -```C# +```csharp // 前序遍历 public IList PreorderTraversal(TreeNode root) { @@ -584,7 +584,7 @@ public void Traversal(TreeNode cur, IList res) Traversal(cur.right, res); } ``` -```C# +```csharp // 中序遍历 public IList InorderTraversal(TreeNode root) { @@ -601,7 +601,7 @@ public void Traversal(TreeNode cur, IList res) Traversal(cur.right, res); } ``` -```C# +```csharp // 后序遍历 public IList PostorderTraversal(TreeNode root) { diff --git "a/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" "b/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" index adeaa413aa..d0967b8b86 100644 --- "a/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" +++ "b/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" @@ -503,7 +503,7 @@ object Solution { } ``` ### C# -```C# +```csharp public ListNode GetIntersectionNode(ListNode headA, ListNode headB) { if (headA == null || headB == null) return null; From 55d676e194180cb33564a7b3019068ccd1ad834f Mon Sep 17 00:00:00 2001 From: eeee0717 Date: Fri, 5 Jan 2024 14:08:10 +0800 Subject: [PATCH 2408/3019] =?UTF-8?q?Update=200452.=E7=94=A8=E6=9C=80?= =?UTF-8?q?=E5=B0=91=E6=95=B0=E9=87=8F=E7=9A=84=E7=AE=AD=E5=BC=95=E7=88=86?= =?UTF-8?q?=E6=B0=94=E7=90=83=EF=BC=8C=E6=B7=BB=E5=8A=A0C#?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...225\347\210\206\346\260\224\347\220\203.md" | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git "a/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" "b/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" index 90cd7085d1..cd57f83b26 100644 --- "a/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" +++ "b/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" @@ -332,6 +332,24 @@ object Solution { } } ``` +### C# +```csharp +public class Solution +{ + public int FindMinArrowShots(int[][] points) + { + if (points.Length == 0) return 0; + Array.Sort(points, (a, b) => a[0].CompareTo(b[0])); + int count = 1; + for (int i = 1; i < points.Length; i++) + { + if (points[i][0] > points[i - 1][1]) count++; + else points[i][1] = Math.Min(points[i][1], points[i - 1][1]); + } + return count; + } +} +```

From 6add8c3287ade5bbfefd6d7042863376cff1ca39 Mon Sep 17 00:00:00 2001 From: eeee0717 Date: Sat, 6 Jan 2024 09:33:13 +0800 Subject: [PATCH 2409/3019] =?UTF-8?q?Update=200435.=E6=97=A0=E9=87=8D?= =?UTF-8?q?=E5=8F=A0=E5=8C=BA=E9=97=B4=EF=BC=8C=E6=B7=BB=E5=8A=A0C#?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...15\345\217\240\345\214\272\351\227\264.md" | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git "a/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" "b/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" index c307532e4f..1a33f98ea6 100644 --- "a/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" +++ "b/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" @@ -441,6 +441,27 @@ impl Solution { } } ``` +### C# +```csharp +public class Solution +{ + public int EraseOverlapIntervals(int[][] intervals) + { + if (intervals.Length == 0) return 0; + Array.Sort(intervals, (a, b) => a[1].CompareTo(b[1])); + int res = 1, end = intervals[0][1]; + for (int i = 1; i < intervals.Length; i++) + { + if (end <= intervals[i][0]) + { + end = intervals[i][1]; + res++; + } + } + return intervals.Length - res; + } +} +```

From 30af534ee95204e51da960ba3787bfa3b90d14b9 Mon Sep 17 00:00:00 2001 From: dengyongchi Date: Sat, 6 Jan 2024 10:56:02 +0800 Subject: [PATCH 2410/3019] =?UTF-8?q?feat:=20=E5=85=B3=E4=BA=8E=E5=9B=BE?= =?UTF-8?q?=E7=AC=AC1971=E9=A2=98js=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...30\345\234\250\350\267\257\345\276\204.md" | 121 ++++++++++++++---- 1 file changed, 99 insertions(+), 22 deletions(-) diff --git "a/problems/1971.\345\257\273\346\211\276\345\233\276\344\270\255\346\230\257\345\220\246\345\255\230\345\234\250\350\267\257\345\276\204.md" "b/problems/1971.\345\257\273\346\211\276\345\233\276\344\270\255\346\230\257\345\220\246\345\255\230\345\234\250\350\267\257\345\276\204.md" index 27ee9147a8..132b0181c0 100644 --- "a/problems/1971.\345\257\273\346\211\276\345\233\276\344\270\255\346\230\257\345\220\246\345\255\230\345\234\250\350\267\257\345\276\204.md" +++ "b/problems/1971.\345\257\273\346\211\276\345\233\276\344\270\255\346\230\257\345\220\246\345\255\230\345\234\250\350\267\257\345\276\204.md" @@ -4,30 +4,28 @@

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

-# 1971. 寻找图中是否存在路径 +# 1971. 寻找图中是否存在路径 [题目链接](https://leetcode.cn/problems/find-if-path-exists-in-graph/) -有一个具有 n个顶点的 双向 图,其中每个顶点标记从 0 到 n - 1(包含 0 和 n - 1)。图中的边用一个二维整数数组 edges 表示,其中 edges[i] = [ui, vi] 表示顶点 ui 和顶点 vi 之间的双向边。 每个顶点对由 最多一条 边连接,并且没有顶点存在与自身相连的边。 +有一个具有 n 个顶点的 双向 图,其中每个顶点标记从 0 到 n - 1(包含 0 和 n - 1)。图中的边用一个二维整数数组 edges 表示,其中 edges[i] = [ui, vi] 表示顶点 ui 和顶点 vi 之间的双向边。 每个顶点对由 最多一条 边连接,并且没有顶点存在与自身相连的边。 请你确定是否存在从顶点 start 开始,到顶点 end 结束的 有效路径 。 -给你数组 edges 和整数 n、start和end,如果从 start 到 end 存在 有效路径 ,则返回 true,否则返回 false 。 - - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20220705101442.png) +给你数组 edges 和整数 n、start 和 end,如果从 start 到 end 存在 有效路径 ,则返回 true,否则返回 false 。 +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20220705101442.png) 提示: -* 1 <= n <= 2 * 10^5 -* 0 <= edges.length <= 2 * 10^5 -* edges[i].length == 2 -* 0 <= ui, vi <= n - 1 -* ui != vi -* 0 <= start, end <= n - 1 -* 不存在双向边 -* 不存在指向顶点自身的边 +- 1 <= n <= 2 \* 10^5 +- 0 <= edges.length <= 2 \* 10^5 +- edges[i].length == 2 +- 0 <= ui, vi <= n - 1 +- ui != vi +- 0 <= start, end <= n - 1 +- 不存在双向边 +- 不存在指向顶点自身的边 ## 思路 @@ -70,7 +68,7 @@ void join(int u, int v) { } ``` -以上模板中,只要修改 n 大小就可以,本题n不会超过2 * 10^5。 +以上模板中,只要修改 n 大小就可以,本题 n 不会超过 2 \* 10^5。 并查集主要有三个功能。 @@ -80,17 +78,17 @@ void join(int u, int v) { 简单介绍并查集之后,我们再来看一下这道题目。 -为什么说这道题目是并查集基础题目,题目中各个点是双向图链接,那么判断 一个顶点到另一个顶点有没有有效路径其实就是看这两个顶点是否在同一个集合里。 +为什么说这道题目是并查集基础题目,题目中各个点是双向图链接,那么判断 一个顶点到另一个顶点有没有有效路径其实就是看这两个顶点是否在同一个集合里。 -如何算是同一个集合呢,有边连在一起,就算是一个集合。 +如何算是同一个集合呢,有边连在一起,就算是一个集合。 -此时我们就可以直接套用并查集模板。 +此时我们就可以直接套用并查集模板。 -使用join(int u, int v)将每条边加入到并查集。 +使用 join(int u, int v)将每条边加入到并查集。 -最后 isSame(int u, int v) 判断是否是同一个根 就可以了。 +最后 isSame(int u, int v) 判断是否是同一个根 就可以了。 -C++代码如下: +C++代码如下: ```CPP class Solution { @@ -191,7 +189,7 @@ class Solution { ### Python: -PYTHON并查集解法如下: +PYTHON 并查集解法如下: ```PYTHON class Solution: @@ -206,6 +204,85 @@ class Solution: return find(source) == find(destination) ``` +### Javascript: + +Javascript 并查集解法如下: + +```Javascript +class unionF{ + constructor(n){ + this.count = n + this.roots = new Array(n).fill(0).map((item,index)=>index) + } + + findRoot(x){ + if(this.roots[x]!==x){ + this.roots[x] = this.findRoot(this.roots[x]) + } + return this.roots[x] + } + + union(x,y){ + const rx = this.findRoot(x) + const ry = this.findRoot(y) + this.roots[rx] = ry + this.count-- + } + + isConnected(x,y){ + return this.findRoot(x)===this.findRoot(y) + } +} + +var validPath = function(n, edges, source, destination) { + const UF = new unionF(n) + for(const [s,t] of edges){ + UF.union(s,t) + } + return UF.isConnected(source,destination) +}; +``` + +Javascript 双向 bfs 解法如下: + +```Javascript +var validPath = function(n, edges, source, destination) { + const graph = new Array(n).fill(0).map(()=>[]) + for(const [s,t] of edges){ + graph[s].push(t) + graph[t].push(s) + } + + const visited = new Array(n).fill(false) + function bfs(start,end,graph){ + const startq = [start] + const endq = [end] + while(startq.length&&endq.length){ + const slen = startq.length + for(let i = 0;i From 39f25c499818ef9da78a1c09264738e68292b96f Mon Sep 17 00:00:00 2001 From: CUI Date: Sat, 6 Jan 2024 15:01:08 +0800 Subject: [PATCH 2411/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0go=E8=AF=AD?= =?UTF-8?q?=E8=A8=80=E8=B4=AA=E5=BF=83=E4=BC=98=E5=8C=96=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E5=9C=A80045.=E8=B7=B3=E8=B7=83=E6=B8=B8=E6=88=8FII.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\350\267\203\346\270\270\346\210\217II.md" | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git "a/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" "b/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" index e006caa2ca..d290f55e80 100644 --- "a/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" +++ "b/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" @@ -285,6 +285,34 @@ class Solution: ### Go + +```go +/** + * @date: 2024 Jan 06 + * @time: 13:44 + * @author: Chris +**/ +// 贪心算法优化版 + +// 记录步骤规则:每超过上一次可达最大范围,需要跳跃一次,次数+1 +// 记录位置:i == lastDistance + 1 +func jump(nums []int) int { + // 根据题目规则,初始位置为nums[0] + lastDistance := 0 // 上一次覆盖范围 + curDistance := 0 // 当前覆盖范围(可达最大范围) + minStep := 0 // 记录最少跳跃次数 + + for i := 0; i < len(nums); i++ { + if i == lastDistance+1 { // 在上一次可达范围+1的位置,记录步骤 + minStep++ // 跳跃次数+1 + lastDistance = curDistance // 记录时才可以更新 + } + curDistance = max(nums[i]+i, curDistance) // 更新当前可达的最大范围 + } + return minStep +} +``` + ```go // 贪心版本一 func jump(nums []int) int { From 93ab9befe85fdd3056765b3414b8b442a7f2258d Mon Sep 17 00:00:00 2001 From: Chenxue3 <115330251+XueshanChen@users.noreply.github.com> Date: Sat, 6 Jan 2024 23:51:02 +1300 Subject: [PATCH 2412/3019] =?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=20=E5=A2=9E=E5=8A=A0C#?= =?UTF-8?q?=E5=8D=95=E9=98=9F=E5=88=97=E5=AE=9E=E7=8E=B0=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...27\345\256\236\347\216\260\346\240\210.md" | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git "a/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" "b/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" index d89bf44bf4..6900e66869 100644 --- "a/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" +++ "b/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" @@ -1046,6 +1046,8 @@ class MyStack() { ### C#: +> 双队列 + ```csharp public class MyStack { Queue queue1; @@ -1080,6 +1082,54 @@ public class MyStack { } ``` +> 单队列 + +```c# +/* + * @lc app=leetcode id=225 lang=csharp + * 版本二:单队列 + * [225] Implement Stack using Queues + */ + +// @lc code=start +public class MyStack { + Queue myQueue; + public MyStack() { + myQueue = new Queue(); + } + + public void Push(int x) { + myQueue.Enqueue(x); + } + + //使用一个队列实现 + public int Pop() { + //一个队列在模拟栈弹出元素的时候只要将队列头部的元素(除了最后一个元素外) 重新添加到队列尾部,此时再去弹出元素就是栈的顺序了。 + for (var i = 0; i < myQueue.Count-1; i++) + { + myQueue.Enqueue(myQueue.Dequeue()); + } + return myQueue.Dequeue(); + } + + //复用Pop()的代码 + public int Top() { + int res = Pop(); + myQueue.Enqueue(res); + return res; + } + + public bool Empty() { + return (myQueue.Count == 0); + } +} + +// @lc code=end + +``` + + + ### PHP: > 双队列 @@ -1203,3 +1253,4 @@ impl MyStack { + From e4db0542d4d8703df031e9e6a158a02a3467b219 Mon Sep 17 00:00:00 2001 From: nuo Date: Sun, 7 Jan 2024 05:07:06 +0800 Subject: [PATCH 2413/3019] =?UTF-8?q?=E4=BF=AE=E6=94=B9=EF=BC=9A=E5=8E=9F?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E4=BD=BF=E7=94=A8=E4=BA=86=E9=9D=9E=E7=BC=96?= =?UTF-8?q?=E8=AF=91=E6=9C=9F=E5=B8=B8=E9=87=8F=E5=A3=B0=E6=98=8E=E6=95=B0?= =?UTF-8?q?=E7=BB=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 现将int next[needle.size()];替换为vector next(needle.size()); --- "problems/0028.\345\256\236\347\216\260strStr.md" | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git "a/problems/0028.\345\256\236\347\216\260strStr.md" "b/problems/0028.\345\256\236\347\216\260strStr.md" index bf4ad600c3..27ef761c5d 100644 --- "a/problems/0028.\345\256\236\347\216\260strStr.md" +++ "b/problems/0028.\345\256\236\347\216\260strStr.md" @@ -425,8 +425,8 @@ public: if (needle.size() == 0) { return 0; } - int next[needle.size()]; - getNext(next, needle); + vector next(needle.size()); + getNext(&next[0], needle); int j = -1; // // 因为next数组里记录的起始位置为-1 for (int i = 0; i < haystack.size(); i++) { // 注意i就从0开始 while(j >= 0 && haystack[i] != needle[j + 1]) { // 不匹配 @@ -524,8 +524,8 @@ public: if (needle.size() == 0) { return 0; } - int next[needle.size()]; - getNext(next, needle); + vector next(needle.size()); + getNext(&next[0], needle); int j = 0; for (int i = 0; i < haystack.size(); i++) { while(j > 0 && haystack[i] != needle[j]) { @@ -1428,4 +1428,3 @@ public int[] GetNext(string needle) - From 20f331f9043725ad9c39d27bf9912c441b6bcf48 Mon Sep 17 00:00:00 2001 From: eeee0717 Date: Sun, 7 Jan 2024 10:04:45 +0800 Subject: [PATCH 2414/3019] =?UTF-8?q?Update=200763.=E5=88=92=E5=88=86?= =?UTF-8?q?=E5=AD=97=E7=AC=A6=E5=8C=BA=E9=97=B4=EF=BC=8C=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?C#?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...27\346\257\215\345\214\272\351\227\264.md" | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git "a/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" "b/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" index 41314456c3..4e9ec578bc 100644 --- "a/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" +++ "b/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" @@ -404,6 +404,32 @@ impl Solution { } } ``` +### C# +```csharp +public class Solution +{ + public IList PartitionLabels(string s) + { + int[] location = new int[27]; + for (int i = 0; i < s.Length; i++) + { + location[s[i] - 'a'] = i; + } + List res = new List(); + int left = 0, right = 0; + for (int i = 0; i < s.Length; i++) + { + right = Math.Max(right, location[s[i] - 'a']); + if (i == right) + { + res.Add(right - left + 1); + left = i + 1; + } + } + return res; + } +} +```

From 98827c14d0efdceaeb6ebed14f82c4c196e01f5c Mon Sep 17 00:00:00 2001 From: eeee0717 Date: Mon, 8 Jan 2024 10:10:12 +0800 Subject: [PATCH 2415/3019] =?UTF-8?q?Update=200056.=E5=90=88=E5=B9=B6?= =?UTF-8?q?=E5=8C=BA=E9=97=B4=EF=BC=8C=E6=B7=BB=E5=8A=A0C#?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...10\345\271\266\345\214\272\351\227\264.md" | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git "a/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" "b/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" index 95781b1a1d..122e783a27 100644 --- "a/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" +++ "b/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" @@ -336,6 +336,32 @@ impl Solution { } } ``` +### C# +```csharp +public class Solution +{ + public int[][] Merge(int[][] intervals) + { + if (intervals.Length == 0) + return intervals; + Array.Sort(intervals, (a, b) => a[0] - b[0]); + List> res = new List>(); + res.Add(intervals[0].ToList()); + for (int i = 1; i < intervals.Length; i++) + { + if (res[res.Count - 1][1] >= intervals[i][0]) + { + res[res.Count - 1][1] = Math.Max(res[res.Count - 1][1], intervals[i][1]); + } + else + { + res.Add(intervals[i].ToList()); + } + } + return res.Select(x => x.ToArray()).ToArray(); + } +} +```

From 474392c521ceb53ea8eba405fb4335771047ba14 Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Mon, 8 Jan 2024 15:35:22 +0800 Subject: [PATCH 2416/3019] Update --- "problems/kama53.\345\257\273\345\256\235.md" | 3 - problems/qita/shejimoshi.md | 55 +++++++++++++++++++ 2 files changed, 55 insertions(+), 3 deletions(-) create mode 100644 problems/qita/shejimoshi.md diff --git "a/problems/kama53.\345\257\273\345\256\235.md" "b/problems/kama53.\345\257\273\345\256\235.md" index 08fc9a18c3..3a4b8b274c 100644 --- "a/problems/kama53.\345\257\273\345\256\235.md" +++ "b/problems/kama53.\345\257\273\345\256\235.md" @@ -1,7 +1,4 @@ -思考一下边的权值为负数的情况 - - # 寻宝 [卡码网:53. 寻宝](https://kamacoder.com/problempage.php?pid=1053) diff --git a/problems/qita/shejimoshi.md b/problems/qita/shejimoshi.md new file mode 100644 index 0000000000..cf980e45f6 --- /dev/null +++ b/problems/qita/shejimoshi.md @@ -0,0 +1,55 @@ + +关于设计模式的学习,大家应该还是看书或者看博客,但却没有一个边学边练的学习环境。 + +学完了一种设计模式 是不是应该去练一练? + +所以卡码网 针对 23种设计,**推出了 23道编程题目,来帮助大家练习设计模式**。 + +

+ +这里的23到编程题目对应了 23种这几模式。 例如第一题,小明的购物车,就是单例模式: + +
+ +区别于网上其他教程,本教程的特点是: + +* **23种设计模式全覆盖**,涵盖了所有Gang of Four设计模式,包括创建型、结构型和行为型设计模式。 +* 通过23道简单而实用的例子,**以刷算法题的形式了解每种设计模式的概念、结构和应用场景**。 +* **为每个设计模式提供清晰的文字解释、结构图和代码演示**,帮助你更好地理解和实践。 +* **难度安排循序渐进**,从基础的、常用的设计模式逐步深入。 + +这样的一个学习体验,要收费吗? + +**免费的**! + +相信录友们可能还没有这种学习设计模式的体验,快去卡码网(kamacoder.com)上体验吧。 + +23道 设计模式的题目给大家出了,那么是不是得安排上对应的讲解? + +**当然安排**! + +针对每道题目,还给大家编写了一套 23种设计模式精讲,已经开源到Github上: + +> https://github.com/youngyangyang04/kama-DesignPattern + +支持Java,Python,Go,C++ 版本,也欢迎大家去Github上提交PR,补充其他语言版本。 + +所以题解也免费开放给录友! + +同时还给全部整理到PDF上,这份PDF,我们写的很用心了,来个大家截个图: + +
+ +
+ +
+ +
+ +关于设计模式的题目,大家现在就可以去 卡码网(kamacoder)去做了。 + +关于这23道题目对应 设计模式精讲 PDF,也免费分享给录友们,大家可以加我的企业微信获取: +
+ +已经有我企业微信的录友,直接发:设计模式,这四个字就好,我会直接发你。 + From 383239d847b25523c086618a1582fe508b804c2a Mon Sep 17 00:00:00 2001 From: sss1h <49825610+sss1h@users.noreply.github.com> Date: Mon, 8 Jan 2024 22:43:05 +0800 Subject: [PATCH 2417/3019] =?UTF-8?q?=E6=9B=B4=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/qita/join.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/problems/qita/join.md b/problems/qita/join.md index 3b3e2d4029..a2698e66cf 100644 --- a/problems/qita/join.md +++ b/problems/qita/join.md @@ -156,9 +156,9 @@ python代码 虽然我主张没有绝对正确的代码风格,但既然是给LeetCode-Master提交代码,尽量遵循Google编程规范。 -经常看我的代码的录友应该都知道,我的代码格严格按照 Google C++ 编程规范来的,这样看上去会比较整洁。 +经常看我的代码的录友应该都知道,我的代码风格严格按照 Google C++ 编程规范来的,这样看上去会比较整洁。 -大家提交代码的时候遇到规范性问题,例如哪里应该由空格,哪里没有空格,可以参考我的代码来。 +大家提交代码的时候遇到规范性问题,例如哪里应该有空格,哪里没有空格,可以参考我的代码来。 有一位录友在提交代码的时候会把之前的代码 做一下规范性的调整,这就很棒。 From 22f42b079bcdee143d32fc905636371cd0ad9aec Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Tue, 9 Jan 2024 10:13:33 +0800 Subject: [PATCH 2418/3019] Update --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 15b10bfa7a..b25b102dfe 100644 --- a/README.md +++ b/README.md @@ -76,6 +76,7 @@ * [C++面试&C++学习指南知识点整理](https://github.com/youngyangyang04/TechCPP) * [C++语言基础课](https://kamacoder.com/course.php?course_id=1) * [Java语言基础课](https://kamacoder.com/course.php?course_id=2) + * [23种设计模式](https://github.com/youngyangyang04/kama-DesignPattern) * 项目 * [基于跳表的轻量级KV存储引擎](https://github.com/youngyangyang04/Skiplist-CPP) From 6b38053a63c0a1896ac6ec7905fc17a0a770f91b Mon Sep 17 00:00:00 2001 From: eeee0717 Date: Tue, 9 Jan 2024 10:47:42 +0800 Subject: [PATCH 2419/3019] =?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=EF=BC=8C=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0C#?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...36\347\232\204\346\225\260\345\255\227.md" | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git "a/problems/0738.\345\215\225\350\260\203\351\200\222\345\242\236\347\232\204\346\225\260\345\255\227.md" "b/problems/0738.\345\215\225\350\260\203\351\200\222\345\242\236\347\232\204\346\225\260\345\255\227.md" index c2215cf633..400dc90daa 100644 --- "a/problems/0738.\345\215\225\350\260\203\351\200\222\345\242\236\347\232\204\346\225\260\345\255\227.md" +++ "b/problems/0738.\345\215\225\350\260\203\351\200\222\345\242\236\347\232\204\346\225\260\345\255\227.md" @@ -392,6 +392,30 @@ impl Solution { } } ``` +### C# +```csharp +public class Solution +{ + public int MonotoneIncreasingDigits(int n) + { + char[] s = n.ToString().ToCharArray(); + int flag = s.Length; + for (int i = s.Length - 1; i > 0; i--) + { + if (s[i - 1] > s[i]) + { + flag = i; + s[i - 1]--; + } + } + for (int i = flag; i < s.Length; i++) + { + s[i] = '9'; + } + return int.Parse(new string(s)); + } +} +```

From f292cbaf2ed861021db70f6b4c2aba7d028f2d64 Mon Sep 17 00:00:00 2001 From: eeee0717 Date: Wed, 10 Jan 2024 10:02:48 +0800 Subject: [PATCH 2420/3019] =?UTF-8?q?Update=200968.=E7=9B=91=E6=8E=A7?= =?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=A0=91=EF=BC=8C=E6=B7=BB=E5=8A=A0C#?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...47\344\272\214\345\217\211\346\240\221.md" | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git "a/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" "b/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" index be04bd4755..305f3ae555 100644 --- "a/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" @@ -726,6 +726,31 @@ impl Solution { } } +``` +### C# +```csharp +public class Solution +{ + public int res = 0; + public int MinCameraCover(TreeNode root) + { + if (Traversal(root) == 0) res++; + return res; + } + public int Traversal(TreeNode cur) + { + if (cur == null) return 2; + int left = Traversal(cur.left); + int right = Traversal(cur.right); + if (left == 2 && right == 2) return 0; + else if (left == 0 || right == 0) + { + res++; + return 1; + } + else return 2; + } +} ```

From 650e33bc709f59df007625ff524906c4bd59585c Mon Sep 17 00:00:00 2001 From: Chenxue3 <115330251+XueshanChen@users.noreply.github.com> Date: Thu, 11 Jan 2024 14:50:59 +1300 Subject: [PATCH 2421/3019] =?UTF-8?q?update=20=E4=BA=8C=E5=8F=89=E6=A0=91?= =?UTF-8?q?=E7=90=86=E8=AE=BA=E5=9F=BA=E7=A1=80.md=20=E5=A2=9E=E5=8A=A0C#?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...7\220\206\350\256\272\345\237\272\347\241\200.md" | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" index e2c6d83c59..50d592a24c 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -302,9 +302,19 @@ impl TreeNode { } } } -``` +``` +```c# +public class TreeNode +{ + public int val; + public TreeNode left; + public TreeNode right; + public TreeNode(int x) { val = x; } +} +```

+ From f6557d7ddc15aff15dfe4b5dcc956aca98e7324c Mon Sep 17 00:00:00 2001 From: fwqaaq Date: Thu, 11 Jan 2024 15:31:33 +0800 Subject: [PATCH 2422/3019] =?UTF-8?q?Update=200200.=E5=B2=9B=E5=B1=BF?= =?UTF-8?q?=E6=95=B0=E9=87=8F.=E6=B7=B1=E6=90=9C=E7=89=88.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...7.\346\267\261\346\220\234\347\211\210.md" | 71 ++++++++----------- 1 file changed, 31 insertions(+), 40 deletions(-) diff --git "a/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\346\267\261\346\220\234\347\211\210.md" "b/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\346\267\261\346\220\234\347\211\210.md" index a4b93c3d4e..7431fbefba 100644 --- "a/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\346\267\261\346\220\234\347\211\210.md" +++ "b/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\346\267\261\346\220\234\347\211\210.md" @@ -389,50 +389,41 @@ function numIslands(grid: string[][]): number { ### Go ```go + +var DIRECTIONS = [4][2]int{{-1, 0}, {0, -1}, {1, 0}, {0, 1}} + func numIslands(grid [][]byte) int { - // 用1标记已访问 - visited := make([][]int, len(grid)) - for i := 0; i < len(visited); i++{ - visited[i] = make([]int, len(grid[0])) - } + res := 0 - var bfs func(x, y int) - bfs = func(x, y int){ - stack := make([][]int, 0) - stack = append(stack, []int{x, y}) - moveX := []int{1, -1, 0, 0} - moveY := []int{0, 0, 1, -1} - - for len(stack) != 0{ - node := stack[len(stack) - 1] - stack = stack[:len(stack) - 1] - - for i := 0; i < 4; i++{ - dx := moveX[i] + node[0] - dy := moveY[i] + node[1] - if dx < 0 || dx >= len(grid) || dy < 0 || dy >= len(grid[0]) || visited[dx][dy] == 1{ - continue - } - visited[dx][dy] = 1 - if grid[dx][dy] == '1'{ - stack = append(stack, []int{dx,dy}) - } - } - } - } + visited := make([][]bool, len(grid)) + for i := 0; i < len(grid); i++ { + visited[i] = make([]bool, len(grid[0])) + } - result := 0 - for i := 0; i < len(grid); i++{ - for j := 0; j < len(grid[0]); j++{ - if visited[i][j] == 0 && grid[i][j] == '1'{ - bfs(i, j) - visited[i][j] = 1 - result++ - } - } - } + for i, rows := range grid { + for j, v := range rows { + if v == '1' && !visited[i][j] { + res++ + dfs(grid, visited, i, j) + } + } + } + + return res +} + +func dfs(grid [][]byte, visited [][]bool, i, j int) { + for _, d := range DIRECTIONS { + x, y := i+d[0], j+d[1] + if x < 0 || x >= len(grid) || y < 0 || y >= len(grid[0]) { + continue + } + if grid[x][y] == '1' && !visited[x][y] { + visited[x][y] = true + dfs(grid, visited, x, y) + } + } - return result } ``` From 0dc7f2f76565da3796830987274f7e8c7e2e4002 Mon Sep 17 00:00:00 2001 From: fwqaaq Date: Thu, 11 Jan 2024 16:56:54 +0800 Subject: [PATCH 2423/3019] =?UTF-8?q?Update=200200.=E5=B2=9B=E5=B1=BF?= =?UTF-8?q?=E6=95=B0=E9=87=8F.=E5=B9=BF=E6=90=9C=E7=89=88.md=20for=20golan?= =?UTF-8?q?g?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...7.\345\271\277\346\220\234\347\211\210.md" | 45 ++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git "a/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\345\271\277\346\220\234\347\211\210.md" "b/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\345\271\277\346\220\234\347\211\210.md" index a7dd117b3e..5c77ed0597 100644 --- "a/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\345\271\277\346\220\234\347\211\210.md" +++ "b/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\345\271\277\346\220\234\347\211\210.md" @@ -321,11 +321,54 @@ function numIslands2(grid: string[][]): number { } ``` +### Go + +```go + +var DIRECTIONS = [4][2]int{{-1, 0}, {0, -1}, {1, 0}, {0, 1}} + +func numIslands(grid [][]byte) int { + res := 0 + + visited := make([][]bool, len(grid)) + for i := 0; i < len(grid); i++ { + visited[i] = make([]bool, len(grid[0])) + } + + for i, rows := range grid { + for j, v := range rows { + if v == '1' && !visited[i][j] { + res++ + bfs(grid, visited, i, j) + } + } + } + return res +} + +func bfs(grid [][]byte, visited [][]bool, i, j int) { + queue := [][2]int{{i, j}} + visited[i][j] = true // 标记已访问,循环中标记会导致重复 + for len(queue) > 0 { + cur := queue[0] + queue = queue[1:] + for _, d := range DIRECTIONS { + x, y := cur[0]+d[0], cur[1]+d[1] + if x < 0 || x >= len(grid) || y < 0 || y >= len(grid[0]) { + continue + } + if grid[x][y] == '1' && !visited[x][y] { + visited[x][y] = true + queue = append(queue, [2]int{x, y}) + } + } + } +} +``` ### Rust ```rust - use std::collections::VecDeque; impl Solution { const DIRECTIONS: [(i32, i32); 4] = [(0, 1), (1, 0), (-1, 0), (0, -1)]; From 26fc4c41720aee859956309caa97bd6434120840 Mon Sep 17 00:00:00 2001 From: fwqaaq Date: Thu, 11 Jan 2024 16:58:01 +0800 Subject: [PATCH 2424/3019] =?UTF-8?q?Update=200200.=E5=B2=9B=E5=B1=BF?= =?UTF-8?q?=E6=95=B0=E9=87=8F.=E5=B9=BF=E6=90=9C=E7=89=88.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...5\260\351\207\217.\345\271\277\346\220\234\347\211\210.md" | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git "a/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\345\271\277\346\220\234\347\211\210.md" "b/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\345\271\277\346\220\234\347\211\210.md" index 5c77ed0597..85471f73b5 100644 --- "a/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\345\271\277\346\220\234\347\211\210.md" +++ "b/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\345\271\277\346\220\234\347\211\210.md" @@ -199,7 +199,9 @@ class Solution { ### Python + BFS solution + ```python class Solution: def __init__(self): @@ -240,6 +242,7 @@ class Solution: ``` ### JavaScript + ```javascript var numIslands = function (grid) { let dir = [[0, 1], [1, 0], [-1, 0], [0, -1]]; // 四个方向 @@ -324,7 +327,6 @@ function numIslands2(grid: string[][]): number { ### Go ```go - var DIRECTIONS = [4][2]int{{-1, 0}, {0, -1}, {1, 0}, {0, 1}} func numIslands(grid [][]byte) int { From 26c4004d74c2480a96722a563a5dd724cedb1e71 Mon Sep 17 00:00:00 2001 From: fwqaaq Date: Thu, 11 Jan 2024 17:40:16 +0800 Subject: [PATCH 2425/3019] Apply suggestions from code review --- ...225\260\351\207\217.\346\267\261\346\220\234\347\211\210.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\346\267\261\346\220\234\347\211\210.md" "b/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\346\267\261\346\220\234\347\211\210.md" index 7431fbefba..18442943ad 100644 --- "a/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\346\267\261\346\220\234\347\211\210.md" +++ "b/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\346\267\261\346\220\234\347\211\210.md" @@ -413,13 +413,13 @@ func numIslands(grid [][]byte) int { } func dfs(grid [][]byte, visited [][]bool, i, j int) { + visited[x][y] = true for _, d := range DIRECTIONS { x, y := i+d[0], j+d[1] if x < 0 || x >= len(grid) || y < 0 || y >= len(grid[0]) { continue } if grid[x][y] == '1' && !visited[x][y] { - visited[x][y] = true dfs(grid, visited, x, y) } } From a0790023246d80328b377517a1d83b7580fa7dc7 Mon Sep 17 00:00:00 2001 From: fwqaaq Date: Thu, 11 Jan 2024 18:00:20 +0800 Subject: [PATCH 2426/3019] =?UTF-8?q?Update=200695.=E5=B2=9B=E5=B1=BF?= =?UTF-8?q?=E7=9A=84=E6=9C=80=E5=A4=A7=E9=9D=A2=E7=A7=AF.md=20for=20go?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...00\345\244\247\351\235\242\347\247\257.md" | 144 ++++++++++++++++++ 1 file changed, 144 insertions(+) diff --git "a/problems/0695.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" "b/problems/0695.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" index 74470ae5e6..a87acb8231 100644 --- "a/problems/0695.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" +++ "b/problems/0695.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" @@ -428,6 +428,150 @@ var maxAreaOfIsland = function (grid) { }; ``` +### Go + +dsf: 版本一 + +```go +var DIRECTIONS = [4][2]int{{-1, 0}, {0, -1}, {1, 0}, {0, 1}} +var count int = 0 + +func maxAreaOfIsland(grid [][]int) int { + res := 0 + visited := make([][]bool, len(grid)) + for i := 0; i < len(grid); i++ { + visited[i] = make([]bool, len(grid[0])) + } + + for i, rows := range grid { + for j, v := range rows { + if v == 1 && !visited[i][j] { + // 第一种写法,重制 count,必定有 1 个 + count = 1 + dfs(grid, visited, i, j) + res = max(res, count) + } + + } + } + + return res +} + +// 第一种写法 +func dfs(grid [][]int, visited [][]bool, i, j int) { + visited[i][j] = true // 标记已访问,循环中未标记会导致重复 + for _, d := range DIRECTIONS { + x, y := i+d[0], j+d[1] + if x < 0 || x >= len(grid) || y < 0 || y >= len(grid[0]) { + continue + } + if grid[x][y] == 1 && !visited[x][y] { + count++ + dfs(grid, visited, x, y) + } + } +} +``` + +dfs:版本二 + +```go +var DIRECTIONS = [4][2]int{{-1, 0}, {0, -1}, {1, 0}, {0, 1}} +var count int = 0 + +func maxAreaOfIsland(grid [][]int) int { + res := 0 + visited := make([][]bool, len(grid)) + for i := 0; i < len(grid); i++ { + visited[i] = make([]bool, len(grid[0])) + } + + for i, rows := range grid { + for j, v := range rows { + if v == 1 && !visited[i][j] { + // 第二种写法 + count = 0 + dfs(grid, visited, i, j) + res = max(res, count) + } + + } + } + + return res +} + +// 第二种写法 +func dfs(grid [][]int, visited [][]bool, i, j int) { + if visited[i][j] || grid[i][j] == 0 { + return + } + visited[i][j] = true + count++ + for _, d := range DIRECTIONS { + x, y := i+d[0], j+d[1] + if x < 0 || x >= len(grid) || y < 0 || y >= len(grid[0]) { + continue + } + dfs(grid, visited, x, y) + } +} +``` + +bfs: + +```go +var DIRECTIONS = [4][2]int{{-1, 0}, {0, -1}, {1, 0}, {0, 1}} +var count int = 0 + +func maxAreaOfIsland(grid [][]int) int { + res := 0 + visited := make([][]bool, len(grid)) + for i := 0; i < len(grid); i++ { + visited[i] = make([]bool, len(grid[0])) + } + + for i, rows := range grid { + for j, v := range rows { + if v == 1 && !visited[i][j] { + // 第一种写法,重制 count,必定有 1 个 + // count = 1 + // 第二种写法以及 bfs + count = 0 + // dfs(grid, visited, i, j) + bfs(grid, visited, i, j) + res = max(res, count) + } + + } + } + + return res +} + +// bfs +func bfs(grid [][]int, visited [][]bool, i, j int) { + visited[i][j] = true + count++ + queue := [][2]int{{i, j}} + for len(queue) > 0 { + cur := queue[0] + queue = queue[1:] + for _, d := range DIRECTIONS { + x, y := cur[0]+d[0], cur[1]+d[1] + if x < 0 || x >= len(grid) || y < 0 || y >= len(grid[0]) { + continue + } + if grid[x][y] == 1 && !visited[x][y] { + count++ + queue = append(queue, [2]int{x, y}) + visited[x][y] = true + } + } + } +} +``` ### Rust From 909971eb8b9bb5befb1c6ef25b08b754d09b3435 Mon Sep 17 00:00:00 2001 From: fwqaaq Date: Thu, 11 Jan 2024 18:01:34 +0800 Subject: [PATCH 2427/3019] =?UTF-8?q?Update=200695.=E5=B2=9B=E5=B1=BF?= =?UTF-8?q?=E7=9A=84=E6=9C=80=E5=A4=A7=E9=9D=A2=E7=A7=AF.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...32\204\346\234\200\345\244\247\351\235\242\347\247\257.md" | 4 ---- 1 file changed, 4 deletions(-) diff --git "a/problems/0695.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" "b/problems/0695.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" index a87acb8231..87b1b5bbbb 100644 --- "a/problems/0695.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" +++ "b/problems/0695.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" @@ -535,11 +535,7 @@ func maxAreaOfIsland(grid [][]int) int { for i, rows := range grid { for j, v := range rows { if v == 1 && !visited[i][j] { - // 第一种写法,重制 count,必定有 1 个 - // count = 1 - // 第二种写法以及 bfs count = 0 - // dfs(grid, visited, i, j) bfs(grid, visited, i, j) res = max(res, count) } From b13487089cb782412c156836be0dc00fef53d1da Mon Sep 17 00:00:00 2001 From: Chenxue3 <115330251+XueshanChen@users.noreply.github.com> Date: Thu, 11 Jan 2024 23:41:09 +1300 Subject: [PATCH 2428/3019] =?UTF-8?q?update=200116.=E5=A1=AB=E5=85=85?= =?UTF-8?q?=E6=AF=8F=E4=B8=AA=E8=8A=82=E7=82=B9=E7=9A=84=E4=B8=8B=E4=B8=80?= =?UTF-8?q?=E4=B8=AA=E5=8F=B3=E4=BE=A7=E8=8A=82=E7=82=B9=E6=8C=87=E9=92=88?= =?UTF-8?q?.md=20=E5=A2=9E=E5=8A=A0C#=E8=BF=AD=E4=BB=A3=E5=92=8C=E9=80=92?= =?UTF-8?q?=E5=BD=92=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...02\347\202\271\346\214\207\351\222\210.md" | 77 +++++++++++++++++++ ...22\345\275\222\351\201\215\345\216\206.md" | 1 + 2 files changed, 78 insertions(+) diff --git "a/problems/0116.\345\241\253\345\205\205\346\257\217\344\270\252\350\212\202\347\202\271\347\232\204\344\270\213\344\270\200\344\270\252\345\217\263\344\276\247\350\212\202\347\202\271\346\214\207\351\222\210.md" "b/problems/0116.\345\241\253\345\205\205\346\257\217\344\270\252\350\212\202\347\202\271\347\232\204\344\270\213\344\270\200\344\270\252\345\217\263\344\276\247\350\212\202\347\202\271\346\214\207\351\222\210.md" index 003ef75afe..60ea9210a2 100644 --- "a/problems/0116.\345\241\253\345\205\205\346\257\217\344\270\252\350\212\202\347\202\271\347\232\204\344\270\213\344\270\200\344\270\252\345\217\263\344\276\247\350\212\202\347\202\271\346\214\207\351\222\210.md" +++ "b/problems/0116.\345\241\253\345\205\205\346\257\217\344\270\252\350\212\202\347\202\271\347\232\204\344\270\213\344\270\200\344\270\252\345\217\263\344\276\247\350\212\202\347\202\271\346\214\207\351\222\210.md" @@ -358,7 +358,84 @@ function connect(root: NodePro | null): NodePro | null { }; ``` +```csharp +//递归 +public class Solution { + public Node Connect(Node root) { + if (root == null) { + return null; + } + + ConnectNodes(root.left, root.right); + + return root; + } + + private void ConnectNodes(Node node1, Node node2) { + if (node1 == null || node2 == null) { + return; + } + + // 将左子节点的 next 指向右子节点 + node1.next = node2; + + // 递归连接当前节点的左右子节点 + ConnectNodes(node1.left, node1.right); + ConnectNodes(node2.left, node2.right); + + // 连接跨越父节点的两个子树 + ConnectNodes(node1.right, node2.left); + } +} + + +// 迭代 +public class Solution +{ + public Node Connect(Node root) + { + Queue que = new Queue(); + + if (root != null) + { + que.Enqueue(root); + } + while (que.Count > 0) + { + + var queSize = que.Count; + for (int i = 0; i < queSize; i++) + { + var cur = que.Dequeue(); + + // 当这个节点不是这一层的最后的节点 + if (i != queSize - 1) + { + // 当前节点指向下一个节点 + cur.next = que.Peek(); + } + // 否则指向空 + else + { + cur.next = null; + } + + if (cur.left != null) + { + que.Enqueue(cur.left); + } + if (cur.right != null) + { + que.Enqueue(cur.right); + } + } + } + + return root; + } +} +```

diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" index 6dad6e56de..b6dd7b6f1f 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" @@ -623,3 +623,4 @@ public void Traversal(TreeNode cur, IList res) + From e36c15a01cf93e4ea2d30545c485f6c6969650aa Mon Sep 17 00:00:00 2001 From: sss1h <49825610+sss1h@users.noreply.github.com> Date: Thu, 11 Jan 2024 21:43:31 +0800 Subject: [PATCH 2429/3019] =?UTF-8?q?Update=20kama54.=E6=9B=BF=E6=8D=A2?= =?UTF-8?q?=E6=95=B0=E5=AD=97.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...77\346\215\242\346\225\260\345\255\227.md" | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git "a/problems/kama54.\346\233\277\346\215\242\346\225\260\345\255\227.md" "b/problems/kama54.\346\233\277\346\215\242\346\225\260\345\255\227.md" index 2b3d53de22..f5e30a704f 100644 --- "a/problems/kama54.\346\233\277\346\215\242\346\225\260\345\255\227.md" +++ "b/problems/kama54.\346\233\277\346\215\242\346\225\260\345\255\227.md" @@ -56,36 +56,36 @@ C++代码如下: ```CPP -#include +#include using namespace std; int main() { string s; while (cin >> s) { + int sOldIndex = s.size() - 1; int count = 0; // 统计数字的个数 - int sOldSize = s.size(); for (int i = 0; i < s.size(); i++) { if (s[i] >= '0' && s[i] <= '9') { count++; } } - // 扩充字符串s的大小,也就是每个空格替换成"number"之后的大小 + // 扩充字符串s的大小,也就是将每个数字替换成"number"之后的大小 s.resize(s.size() + count * 5); - int sNewSize = s.size(); - // 从后先前将空格替换为"number" - for (int i = sNewSize - 1, j = sOldSize - 1; j < i; i--, j--) { - if (s[j] > '9' || s[j] < '0') { - s[i] = s[j]; + int sNewIndex = s.size() - 1; + // 从后往前将数字替换为"number" + while (sOldIndex >= 0) { + if (s[sOldIndex] >= '0' && s[sOldIndex] <= '9') { + s[sNewIndex--] = 'r'; + s[sNewIndex--] = 'e'; + s[sNewIndex--] = 'b'; + s[sNewIndex--] = 'm'; + s[sNewIndex--] = 'u'; + s[sNewIndex--] = 'n'; } else { - s[i] = 'r'; - s[i - 1] = 'e'; - s[i - 2] = 'b'; - s[i - 3] = 'm'; - s[i - 4] = 'u'; - s[i - 5] = 'n'; - i -= 5; + s[sNewIndex--] = s[sOldIndex]; } + sOldIndex--; } - cout << s << endl; + cout << s << endl; } } From 49690a1712142e0739797b34c7422b155b6ae4e5 Mon Sep 17 00:00:00 2001 From: WmW Date: Fri, 12 Jan 2024 16:43:39 +0800 Subject: [PATCH 2430/3019] =?UTF-8?q?update=20455.=E5=88=86=E5=8F=91?= =?UTF-8?q?=E9=A5=BC=E5=B9=B2;=20=E4=BB=A3=E7=A0=81=E6=8A=A5=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...0\206\345\217\221\351\245\274\345\271\262.md" | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git "a/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" "b/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" index 778adc94a3..da4fd392b9 100644 --- "a/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" +++ "b/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" @@ -73,9 +73,9 @@ public: } }; ``` -* 时间复杂度:O(nlogn) -* 空间复杂度:O(1) +- 时间复杂度:O(nlogn) +- 空间复杂度:O(1) 从代码中可以看出我用了一个 index 来控制饼干数组的遍历,遍历饼干并没有再起一个 for 循环,而是采用自减的方式,这也是常用的技巧。 @@ -119,9 +119,9 @@ public: } }; ``` -* 时间复杂度:O(nlogn) -* 空间复杂度:O(1) +- 时间复杂度:O(nlogn) +- 空间复杂度:O(1) 细心的录友可以发现,这种写法,两个循环的顺序改变了,先遍历的饼干,在遍历的胃口,这是因为遍历顺序变了,我们是从小到大遍历。 @@ -177,7 +177,9 @@ class Solution { ``` ### Python + 贪心 大饼干优先 + ```python class Solution: def findContentChildren(self, g, s): @@ -192,7 +194,9 @@ class Solution: return result ``` + 贪心 小饼干优先 + ```python class Solution: def findContentChildren(self, g, s): @@ -229,7 +233,7 @@ func findContentChildren(g []int, s []int) int { ### Rust ```rust -pub fn find_content_children(mut children: Vec, mut cookie: Vec) -> i32 { +pub fn find_content_children(mut children: Vec, mut cookies: Vec) -> i32 { children.sort(); cookies.sort(); @@ -378,7 +382,9 @@ object Solution { } } ``` + ### C# + ```csharp public class Solution { From f25f062407a045d083e40d3174c8dc156636eb79 Mon Sep 17 00:00:00 2001 From: WmW Date: Fri, 12 Jan 2024 16:45:27 +0800 Subject: [PATCH 2431/3019] =?UTF-8?q?update=20455.=E5=88=86=E5=8F=91?= =?UTF-8?q?=E9=A5=BC=E5=B9=B2;=20=E4=BB=A3=E7=A0=81=E6=8A=A5=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...210\206\345\217\221\351\245\274\345\271\262.md" | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git "a/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" "b/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" index da4fd392b9..6ae206dba2 100644 --- "a/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" +++ "b/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" @@ -73,9 +73,9 @@ public: } }; ``` +* 时间复杂度:O(nlogn) +* 空间复杂度:O(1) -- 时间复杂度:O(nlogn) -- 空间复杂度:O(1) 从代码中可以看出我用了一个 index 来控制饼干数组的遍历,遍历饼干并没有再起一个 for 循环,而是采用自减的方式,这也是常用的技巧。 @@ -119,9 +119,9 @@ public: } }; ``` +* 时间复杂度:O(nlogn) +* 空间复杂度:O(1) -- 时间复杂度:O(nlogn) -- 空间复杂度:O(1) 细心的录友可以发现,这种写法,两个循环的顺序改变了,先遍历的饼干,在遍历的胃口,这是因为遍历顺序变了,我们是从小到大遍历。 @@ -177,9 +177,7 @@ class Solution { ``` ### Python - 贪心 大饼干优先 - ```python class Solution: def findContentChildren(self, g, s): @@ -194,9 +192,7 @@ class Solution: return result ``` - 贪心 小饼干优先 - ```python class Solution: def findContentChildren(self, g, s): @@ -382,9 +378,7 @@ object Solution { } } ``` - ### C# - ```csharp public class Solution { From 29eb6f680f73bcee4d7039864be8bf1d58179adf Mon Sep 17 00:00:00 2001 From: Chenxue3 <115330251+XueshanChen@users.noreply.github.com> Date: Fri, 12 Jan 2024 21:45:48 +1300 Subject: [PATCH 2432/3019] =?UTF-8?q?update=200104.=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=A0=91=E7=9A=84=E6=9C=80=E5=A4=A7=E6=B7=B1=E5=BA=A6.md:=20Ad?= =?UTF-8?q?d=20559.n=E5=8F=89=E6=A0=91=E7=9A=84=E6=9C=80=E5=A4=A7=E6=B7=B1?= =?UTF-8?q?=E5=BA=A6=20C#=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...00\345\244\247\346\267\261\345\272\246.md" | 72 +++++++++++++++++++ 1 file changed, 72 insertions(+) diff --git "a/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" "b/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" index f4c6cfc8f4..1f55f197e5 100644 --- "a/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" +++ "b/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" @@ -1033,6 +1033,9 @@ impl Solution { } ``` ### C# + +0104.二叉树的最大深度 + ```csharp // 递归法 public int MaxDepth(TreeNode root) { @@ -1088,7 +1091,76 @@ public int MaxDepth(TreeNode root) } ``` +559.n叉树的最大深度 +递归法 +```csharp + /* + 递归法 + */ + public class Solution { + public int MaxDepth(Node root) { + int res = 0; + /* 终止条件 */ + if(root == null){ + return 0; + } + + /* logic */ + // 遍历当前节点的子节点 + for (int i = 0; i < root.children.Count; i++) + { + res = Math.Max(res, MaxDepth(root.children[i])); + } + return res + 1; + } + } + // @lc code=end +``` + 迭代法(层序遍历) +```csharp + /* + 迭代法 + */ + public class Solution + { + public int MaxDepth(Node root) + { + Queue que = new Queue(); // 使用泛型队列存储节点 + + int res = 0; + + if(root != null){ + que.Enqueue(root); // 将根节点加入队列 + } + while (que.Count > 0) + { + int size = que.Count; // 获取当前层的节点数 + res++; // 深度加一 + + for (int i = 0; i < size; i++) + { + // 每一层的遍历 + + var curNode = que.Dequeue(); // 取出队列中的节点 + for (int j = 0; j < curNode.children.Count; j++) + { + if (curNode.children[j] != null) + { + que.Enqueue(curNode.children[j]); // 将子节点加入队列 + } + } + } + } + + return res; // 返回树的最大深度 + + } + } +``` + +

+ From 8618c4491541b7ed4ef945952f1646909a6005d5 Mon Sep 17 00:00:00 2001 From: eeee0717 Date: Sat, 13 Jan 2024 10:50:06 +0800 Subject: [PATCH 2433/3019] =?UTF-8?q?Update=200062.=E4=B8=8D=E5=90=8C?= =?UTF-8?q?=E8=B7=AF=E5=BE=84=EF=BC=8C=E6=B7=BB=E5=8A=A0C#?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...15\345\220\214\350\267\257\345\276\204.md" | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git "a/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" "b/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" index 5131fdbbbd..207a66ee80 100644 --- "a/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" +++ "b/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" @@ -536,8 +536,29 @@ object Solution { ``` ### c# +```csharp +// 二维数组 +public class Solution +{ + public int UniquePaths(int m, int n) + { + int[,] dp = new int[m, n]; + for (int i = 0; i < m; i++) dp[i, 0] = 1; + for (int j = 0; j < n; j++) dp[0, j] = 1; + for (int i = 1; i < m; i++) + { + for (int j = 1; j < n; j++) + { + dp[i, j] = dp[i - 1, j] + dp[i, j - 1]; + } + } + return dp[m - 1, n - 1]; + } +} +``` ```csharp +// 一维数组 public class Solution { public int UniquePaths(int m, int n) From 5fbb5fdc2ca45d5e210f4f7a043a9da52ca1a1d3 Mon Sep 17 00:00:00 2001 From: David Gao Date: Sat, 13 Jan 2024 20:44:21 -0500 Subject: [PATCH 2434/3019] =?UTF-8?q?0322.=E9=87=8D=E6=96=B0=E5=AE=89?= =?UTF-8?q?=E6=8E=92=E8=A1=8C=E7=A8=8B.md=20=E8=A7=A3=E5=86=B3python?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E5=9D=97=20=E5=9B=9E=E6=BA=AF=E4=BD=BF?= =?UTF-8?q?=E7=94=A8=E5=AD=97=E5=85=B8=E6=96=B9=E6=B3=95=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E8=B6=85=E6=97=B6=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...11\346\216\222\350\241\214\347\250\213.md" | 55 ++++++++++--------- 1 file changed, 29 insertions(+), 26 deletions(-) diff --git "a/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" "b/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" index 1473ed0505..036cfc51b5 100644 --- "a/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" +++ "b/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" @@ -449,34 +449,37 @@ class Solution: ``` 回溯 使用字典 ```python -from collections import defaultdict - class Solution: def findItinerary(self, tickets: List[List[str]]) -> List[str]: - targets = defaultdict(list) # 构建机场字典 - for ticket in tickets: - targets[ticket[0]].append(ticket[1]) - for airport in targets: - targets[airport].sort() # 对目的地列表进行排序 - - path = ["JFK"] # 起始机场为"JFK" - self.backtracking(targets, path, len(tickets)) - return path - - def backtracking(self, targets, path, ticketNum): - if len(path) == ticketNum + 1: - return True # 找到有效行程 - - airport = path[-1] # 当前机场 - destinations = targets[airport] # 当前机场可以到达的目的地列表 - for i, dest in enumerate(destinations): - targets[airport].pop(i) # 标记已使用的机票 - path.append(dest) # 添加目的地到路径 - if self.backtracking(targets, path, ticketNum): - return True # 找到有效行程 - targets[airport].insert(i, dest) # 回溯,恢复机票 - path.pop() # 移除目的地 - return False # 没有找到有效行程 + self.adj = {} + + # sort by the destination alphabetically + # 根据航班每一站的重点字母顺序排序 + tickets.sort(key=lambda x:x[1]) + + # get all possible connection for each destination + # 罗列每一站的下一个可选项 + for u,v in tickets: + if u in self.adj: self.adj[u].append(v) + else: self.adj[u] = [v] + + # 从JFK出发 + self.result = [] + self.dfs("JFK") # start with JFK + + return self.result[::-1] # reverse to get the result + + def dfs(self, s): + # if depart city has flight and the flight can go to another city + while s in self.adj and len(self.adj[s]) > 0: + # 找到s能到哪里,选能到的第一个机场 + v = self.adj[s][0] # we go to the 1 choice of the city + # 在之后的可选项机场中去掉这个机场 + self.adj[s].pop(0) # get rid of this choice since we used it + # 从当前的新出发点开始 + self.dfs(v) # we start from the new airport + + self.result.append(s) # after append, it will back track to last node, thus the result list is in reversed order ``` 回溯 使用字典 逆序 From 08617fdff7d13cd4dcd8f512baccfdad5f64f766 Mon Sep 17 00:00:00 2001 From: eeee0717 Date: Sun, 14 Jan 2024 09:55:53 +0800 Subject: [PATCH 2435/3019] =?UTF-8?q?Update=200063.=E4=B8=8D=E5=90=8C?= =?UTF-8?q?=E8=B7=AF=E5=BE=842=EF=BC=8C=E6=B7=BB=E5=8A=A0C#?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\345\220\214\350\267\257\345\276\204II.md" | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git "a/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" "b/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" index 8b842858e7..8c208ea865 100644 --- "a/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" +++ "b/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" @@ -734,6 +734,30 @@ object Solution { } } ``` +### C# +```csharp +public class Solution +{ + public int UniquePathsWithObstacles(int[][] obstacleGrid) + { + int m = obstacleGrid.Length; + int n = obstacleGrid[0].Length; + int[,] dp = new int[m, n]; + if (obstacleGrid[0][0] == 1 || obstacleGrid[m - 1][n - 1] == 1) return 0; + for (int i = 0; i < m && obstacleGrid[i][0] == 0; i++) dp[i, 0] = 1; + for (int j = 0; j < n && obstacleGrid[0][j] == 0; j++) dp[0, j] = 1; + for (int i = 1; i < m; i++) + { + for (int j = 1; j < n; j++) + { + if (obstacleGrid[i][j] == 1) continue; + dp[i, j] = dp[i - 1, j] + dp[i, j - 1]; + } + } + return dp[m - 1, n - 1]; + } +} +```

From 0076152aecfff72cae6c53f4c36b29faee62e47d Mon Sep 17 00:00:00 2001 From: eeee0717 Date: Mon, 15 Jan 2024 09:52:08 +0800 Subject: [PATCH 2436/3019] =?UTF-8?q?Update=200343.=E6=95=B4=E6=95=B0?= =?UTF-8?q?=E6=8B=86=E5=88=86=EF=BC=8C=E6=B7=BB=E5=8A=A0C#?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...64\346\225\260\346\213\206\345\210\206.md" | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git "a/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" "b/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" index 2e17caf553..bbbd5c6379 100644 --- "a/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" +++ "b/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" @@ -496,6 +496,25 @@ class Solution { } } ``` +### C# +```csharp +public class Solution +{ + public int IntegerBreak(int n) + { + int[] dp = new int[n + 1]; + dp[2] = 1; + for (int i = 3; i <= n; i++) + { + for (int j = 1; j <= i / 2; j++) + { + dp[i] = Math.Max(dp[i],Math.Max(j*(i-j),j*dp[i-j])); + } + } + return dp[n]; + } +} +```

From 4f1c28d3c1f1ee32c78dd0a6c96f228895a92b25 Mon Sep 17 00:00:00 2001 From: fwqaaq Date: Mon, 15 Jan 2024 10:36:33 +0800 Subject: [PATCH 2437/3019] =?UTF-8?q?Update=201020.=E9=A3=9E=E5=9C=B0?= =?UTF-8?q?=E7=9A=84=E6=95=B0=E9=87=8F.md=20about=20golang?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...60\347\232\204\346\225\260\351\207\217.md" | 54 +++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git "a/problems/1020.\351\243\236\345\234\260\347\232\204\346\225\260\351\207\217.md" "b/problems/1020.\351\243\236\345\234\260\347\232\204\346\225\260\351\207\217.md" index 29c237e57b..679c1ca9cd 100644 --- "a/problems/1020.\351\243\236\345\234\260\347\232\204\346\225\260\351\207\217.md" +++ "b/problems/1020.\351\243\236\345\234\260\347\232\204\346\225\260\351\207\217.md" @@ -491,6 +491,60 @@ class Solution: return ans ``` +### Go + +dfs: + +```go +var DIRECTIONS = [4][2]int{{-1, 0}, {0, -1}, {1, 0}, {0, 1}} +var count int = 0 + +func numEnclaves(grid [][]int) int { + rows, cols := len(grid), len(grid[0]) + // 行 + for i := range grid[0] { + if grid[0][i] == 1 { + dfs(grid, 0, i) + } + if grid[rows-1][i] == 1 { + dfs(grid, rows-1, i) + } + } + // 列 + for j := range grid { + if grid[j][0] == 1 { + dfs(grid, j, 0) + } + if grid[j][cols-1] == 1 { + dfs(grid, j, cols-1) + } + } + count = 0 + for i := range grid { + for j := range grid[0] { + if grid[i][j] == 1 { + dfs(grid, i, j) + } + } + } + return count +} + +func dfs(grid [][]int, i, j int) { + grid[i][j] = 0 + count++ + for _, d := range DIRECTIONS { + x, y := i+d[0], j+d[1] + if x < 0 || x >= len(grid) || y < 0 || y >= len(grid[0]) { + continue + } + if grid[x][y] == 1 { + dfs(grid, x, y) + } + } +} +``` + ### Rust dfs: From 8823181498afb51aac908159d0cb1b31caa5b1fc Mon Sep 17 00:00:00 2001 From: fwqaaq Date: Mon, 15 Jan 2024 10:41:57 +0800 Subject: [PATCH 2438/3019] =?UTF-8?q?Update=201020.=E9=A3=9E=E5=9C=B0?= =?UTF-8?q?=E7=9A=84=E6=95=B0=E9=87=8F.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...60\347\232\204\346\225\260\351\207\217.md" | 60 +++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git "a/problems/1020.\351\243\236\345\234\260\347\232\204\346\225\260\351\207\217.md" "b/problems/1020.\351\243\236\345\234\260\347\232\204\346\225\260\351\207\217.md" index 679c1ca9cd..3488777ad2 100644 --- "a/problems/1020.\351\243\236\345\234\260\347\232\204\346\225\260\351\207\217.md" +++ "b/problems/1020.\351\243\236\345\234\260\347\232\204\346\225\260\351\207\217.md" @@ -545,6 +545,66 @@ func dfs(grid [][]int, i, j int) { } ``` +bfs: + +```go +var DIRECTIONS = [4][2]int{{-1, 0}, {0, -1}, {1, 0}, {0, 1}} +var count int = 0 + +func numEnclaves(grid [][]int) int { + rows, cols := len(grid), len(grid[0]) + // 行 + for i := range grid[0] { + if grid[0][i] == 1 { + bfs(grid, 0, i) + } + if grid[rows-1][i] == 1 { + bfs(grid, rows-1, i) + } + } + // 列 + for j := range grid { + if grid[j][0] == 1 { + bfs(grid, j, 0) + } + if grid[j][cols-1] == 1 { + bfs(grid, j, cols-1) + } + } + count = 0 + for i := range grid { + for j := range grid[0] { + if grid[i][j] == 1 { + bfs(grid, i, j) + } + } + } + return count +} + +func bfs(grid [][]int, i, j int) { + queue := [][]int{} + queue = append(queue, []int{i, j}) + grid[i][j] = 0 + count++ + for len(queue) > 0 { + cur := queue[0] + queue = queue[1:] + for _, d := range DIRECTIONS { + x, y := cur[0]+d[0], cur[1]+d[1] + if x < 0 || x >= len(grid) || y < 0 || y >= len(grid[0]) { + continue + } + if grid[x][y] == 1 { + count++ + queue = append(queue, []int{x, y}) + grid[x][y] = 0 + } + } + } +} +``` + ### Rust dfs: From 73c06613f7f9614df170667aa6bef87f0dcca3d4 Mon Sep 17 00:00:00 2001 From: fwqaaq Date: Mon, 15 Jan 2024 17:24:43 +0800 Subject: [PATCH 2439/3019] =?UTF-8?q?Update=200130.=E8=A2=AB=E5=9B=B4?= =?UTF-8?q?=E7=BB=95=E7=9A=84=E5=8C=BA=E5=9F=9F.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...25\347\232\204\345\214\272\345\237\237.md" | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git "a/problems/0130.\350\242\253\345\233\264\347\273\225\347\232\204\345\214\272\345\237\237.md" "b/problems/0130.\350\242\253\345\233\264\347\273\225\347\232\204\345\214\272\345\237\237.md" index 8014c0c8bf..e2185a1789 100644 --- "a/problems/0130.\350\242\253\345\233\264\347\273\225\347\232\204\345\214\272\345\237\237.md" +++ "b/problems/0130.\350\242\253\345\233\264\347\273\225\347\232\204\345\214\272\345\237\237.md" @@ -561,6 +561,58 @@ function solve(board) { } ``` +### Go + +```dfs +var DIRECTIONS = [4][2]int{{-1, 0}, {0, -1}, {1, 0}, {0, 1}} + +func solve(board [][]byte) { + rows, cols := len(board), len(board[0]) + // 列 + for i := 0; i < rows; i++ { + if board[i][0] == 'O' { + dfs(board, i, 0) + } + if board[i][cols-1] == 'O' { + dfs(board, i, cols-1) + } + } + // 行 + for j := 0; j < cols; j++ { + if board[0][j] == 'O' { + dfs(board, 0, j) + } + if board[rows-1][j] == 'O' { + dfs(board, rows-1, j) + } + } + + for _, r := range board { + for j, c := range r { + if c == 'A' { + r[j] = 'O' + } + if c == 'O' { + r[j] = 'X' + } + } + } +} + +func dfs(board [][]byte, i, j int) { + board[i][j] = 'A' + for _, d := range DIRECTIONS { + x, y := i+d[0], j+d[1] + if x < 0 || x >= len(board) || y < 0 || y >= len(board[0]) { + continue + } + if board[x][y] == 'O' { + dfs(board, x, y) + } + } +} +``` +

From 52496f8fd6e65aa5073f48fcc6a545f18dffd218 Mon Sep 17 00:00:00 2001 From: fwqaaq Date: Mon, 15 Jan 2024 17:29:34 +0800 Subject: [PATCH 2440/3019] =?UTF-8?q?Update=200130.=E8=A2=AB=E5=9B=B4?= =?UTF-8?q?=E7=BB=95=E7=9A=84=E5=8C=BA=E5=9F=9F.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...25\347\232\204\345\214\272\345\237\237.md" | 62 ++++++++++++++++++- 1 file changed, 61 insertions(+), 1 deletion(-) diff --git "a/problems/0130.\350\242\253\345\233\264\347\273\225\347\232\204\345\214\272\345\237\237.md" "b/problems/0130.\350\242\253\345\233\264\347\273\225\347\232\204\345\214\272\345\237\237.md" index e2185a1789..352face80d 100644 --- "a/problems/0130.\350\242\253\345\233\264\347\273\225\347\232\204\345\214\272\345\237\237.md" +++ "b/problems/0130.\350\242\253\345\233\264\347\273\225\347\232\204\345\214\272\345\237\237.md" @@ -563,7 +563,9 @@ function solve(board) { ### Go -```dfs +dfs: + +```go var DIRECTIONS = [4][2]int{{-1, 0}, {0, -1}, {1, 0}, {0, 1}} func solve(board [][]byte) { @@ -613,6 +615,64 @@ func dfs(board [][]byte, i, j int) { } ``` +bfs: + +```go +var DIRECTIONS = [4][2]int{{-1, 0}, {0, -1}, {1, 0}, {0, 1}} + +func solve(board [][]byte) { + rows, cols := len(board), len(board[0]) + // 列 + for i := 0; i < rows; i++ { + if board[i][0] == 'O' { + bfs(board, i, 0) + } + if board[i][cols-1] == 'O' { + bfs(board, i, cols-1) + } + } + // 行 + for j := 0; j < cols; j++ { + if board[0][j] == 'O' { + bfs(board, 0, j) + } + if board[rows-1][j] == 'O' { + bfs(board, rows-1, j) + } + } + + for _, r := range board { + for j, c := range r { + if c == 'A' { + r[j] = 'O' + } + if c == 'O' { + r[j] = 'X' + } + } + } +} + +func bfs(board [][]byte, i, j int) { + queue := [][]int{{i, j}} + board[i][j] = 'A' + for len(queue) > 0 { + cur := queue[0] + queue = queue[1:] + for _, d := range DIRECTIONS { + x, y := cur[0]+d[0], cur[1]+d[1] + if x < 0 || x >= len(board) || y < 0 || y >= len(board[0]) { + continue + } + if board[x][y] == 'O' { + board[x][y] = 'A' + queue = append(queue, []int{x, y}) + } + } + } +} +``` +

From 69377ddec1366c81dbe9343147e2c64de7bf3368 Mon Sep 17 00:00:00 2001 From: maolu Date: Mon, 15 Jan 2024 17:48:20 +0800 Subject: [PATCH 2441/3019] =?UTF-8?q?=E5=8A=A0=E5=85=A5=E6=96=B0=E8=A7=A3?= =?UTF-8?q?=E6=B3=95=EF=BC=9A=E8=9E=BA=E6=97=8B=E7=9F=A9=E9=98=B5=E5=AE=9A?= =?UTF-8?q?=E4=B9=894=E4=B8=AA=E8=BE=B9=E7=95=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/.gitignore | 8 ++++ .idea/encodings.xml | 4 ++ .../inspectionProfiles/profiles_settings.xml | 6 +++ .idea/leetcode-master.iml | 8 ++++ .idea/misc.xml | 4 ++ .idea/modules.xml | 8 ++++ .idea/vcs.xml | 6 +++ ...72\346\227\213\347\237\251\351\230\265.md" | 41 +++++++++++++++++ ...\346\227\213\347\237\251\351\230\265II.md" | 44 +++++++++++++++++++ 9 files changed, 129 insertions(+) create mode 100644 .idea/.gitignore create mode 100644 .idea/encodings.xml create mode 100644 .idea/inspectionProfiles/profiles_settings.xml create mode 100644 .idea/leetcode-master.iml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/vcs.xml diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000000..13566b81b0 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000000..15a15b218a --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 0000000000..105ce2da2d --- /dev/null +++ b/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/.idea/leetcode-master.iml b/.idea/leetcode-master.iml new file mode 100644 index 0000000000..d0876a78d0 --- /dev/null +++ b/.idea/leetcode-master.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000000..4d51924373 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000000..7c250acde5 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000000..35eb1ddfbb --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git "a/problems/0054.\350\236\272\346\227\213\347\237\251\351\230\265.md" "b/problems/0054.\350\236\272\346\227\213\347\237\251\351\230\265.md" index 44a7749d3f..85e6a9364b 100644 --- "a/problems/0054.\350\236\272\346\227\213\347\237\251\351\230\265.md" +++ "b/problems/0054.\350\236\272\346\227\213\347\237\251\351\230\265.md" @@ -306,6 +306,47 @@ class Solution(object): return result ``` +版本二:定义四个边界 +```python +class Solution(object): + def spiralOrder(self, matrix): + """ + :type matrix: List[List[int]] + :rtype: List[int] + """ + if not matrix: + return [] + + rows = len(matrix) + cols = len(matrix[0]) + top, bottom, left, right = 0, rows - 1, 0, cols - 1 + print_list = [] + + while top <= bottom and left <= right: + # 从左到右 + for i in range(left, right + 1): + print_list.append(matrix[top][i]) + top += 1 + + # 从上到下 + for i in range(top, bottom + 1): + print_list.append(matrix[i][right]) + right -= 1 + + # 从右到左 + if top <= bottom: + for i in range(right, left - 1, -1): + print_list.append(matrix[bottom][i]) + bottom -= 1 + + # 从下到上 + if left <= right: + for i in range(bottom, top - 1, -1): + print_list.append(matrix[i][left]) + left += 1 + + return print_list +```

diff --git "a/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" "b/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" index 58378ffcf2..8823a0d808 100644 --- "a/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" +++ "b/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" @@ -207,6 +207,50 @@ class Solution: return nums ``` +版本二:定义四个边界 +```python +class Solution(object): + def generateMatrix(self, n): + if n <= 0: + return [] + + # 初始化 n x n 矩阵 + matrix = [[0]*n for _ in range(n)] + + # 初始化边界和起始值 + top, bottom, left, right = 0, n-1, 0, n-1 + num = 1 + + while top <= bottom and left <= right: + # 从左到右填充上边界 + for i in range(left, right + 1): + matrix[top][i] = num + num += 1 + top += 1 + + # 从上到下填充右边界 + for i in range(top, bottom + 1): + matrix[i][right] = num + num += 1 + right -= 1 + + # 从右到左填充下边界 + + for i in range(right, left - 1, -1): + matrix[bottom][i] = num + num += 1 + bottom -= 1 + + # 从下到上填充左边界 + + for i in range(bottom, top - 1, -1): + matrix[i][left] = num + num += 1 + left += 1 + + return matrix +``` + ### JavaScript: ```javascript From 0e34b46a1777988cf1e618d4e227d02b7f1a82ae Mon Sep 17 00:00:00 2001 From: maolu Date: Mon, 15 Jan 2024 18:03:02 +0800 Subject: [PATCH 2442/3019] =?UTF-8?q?=E5=88=A0=E9=99=A4.idea?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/.gitignore | 8 -------- .idea/encodings.xml | 4 ---- .idea/inspectionProfiles/profiles_settings.xml | 6 ------ .idea/leetcode-master.iml | 8 -------- .idea/misc.xml | 4 ---- .idea/modules.xml | 8 -------- .idea/vcs.xml | 6 ------ 7 files changed, 44 deletions(-) delete mode 100644 .idea/.gitignore delete mode 100644 .idea/encodings.xml delete mode 100644 .idea/inspectionProfiles/profiles_settings.xml delete mode 100644 .idea/leetcode-master.iml delete mode 100644 .idea/misc.xml delete mode 100644 .idea/modules.xml delete mode 100644 .idea/vcs.xml diff --git a/.idea/.gitignore b/.idea/.gitignore deleted file mode 100644 index 13566b81b0..0000000000 --- a/.idea/.gitignore +++ /dev/null @@ -1,8 +0,0 @@ -# Default ignored files -/shelf/ -/workspace.xml -# Editor-based HTTP Client requests -/httpRequests/ -# Datasource local storage ignored files -/dataSources/ -/dataSources.local.xml diff --git a/.idea/encodings.xml b/.idea/encodings.xml deleted file mode 100644 index 15a15b218a..0000000000 --- a/.idea/encodings.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml deleted file mode 100644 index 105ce2da2d..0000000000 --- a/.idea/inspectionProfiles/profiles_settings.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - \ No newline at end of file diff --git a/.idea/leetcode-master.iml b/.idea/leetcode-master.iml deleted file mode 100644 index d0876a78d0..0000000000 --- a/.idea/leetcode-master.iml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml deleted file mode 100644 index 4d51924373..0000000000 --- a/.idea/misc.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml deleted file mode 100644 index 7c250acde5..0000000000 --- a/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 35eb1ddfbb..0000000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file From 47688ba24829cab212fa9d3d911199cbe8afee57 Mon Sep 17 00:00:00 2001 From: Chenxue3 <71321839+Chenxue3@users.noreply.github.com> Date: Mon, 15 Jan 2024 23:10:46 +1300 Subject: [PATCH 2443/3019] =?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=20-=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0C#=E8=BF=AD=E4=BB=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...13\350\247\222\347\232\204\345\200\274.md" | 48 ++++++++++++++++++- 1 file changed, 47 insertions(+), 1 deletion(-) diff --git "a/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" "b/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" index 3cdcc80163..d897bba13a 100644 --- "a/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" +++ "b/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" @@ -716,9 +716,55 @@ public void Traversal(TreeNode root, int depth) return; } ``` +```csharp +/* + * @lc app=leetcode id=513 lang=csharp + * 迭代法 + * [513] Find Bottom Left Tree Value + */ + +// @lc code=start +public class Solution +{ + public int FindBottomLeftValue(TreeNode root) + { + Queue que = new Queue(); + + if (root != null) + { + que.Enqueue(root); + } + + int ans = 0; + while (que.Count != 0) + { + + int size = que.Count; + for (var i = 0; i < size; i++) + { + var curNode = que.Peek(); + que.Dequeue(); + if(i == 0){ + ans = curNode.val; + } + if (curNode.left != null) + { + que.Enqueue(curNode.left); + } + if (curNode.right != null) + { + que.Enqueue(curNode.right); + } + } + + } + return ans; + } +} +// @lc code=end +```

- From 5ad279f73717ba8c7194a0b238a8bb5a0d97b2e7 Mon Sep 17 00:00:00 2001 From: fwqaaq Date: Mon, 15 Jan 2024 18:11:30 +0800 Subject: [PATCH 2444/3019] =?UTF-8?q?Update=200130.=E8=A2=AB=E5=9B=B4?= =?UTF-8?q?=E7=BB=95=E7=9A=84=E5=8C=BA=E5=9F=9F.md=20for=20rust?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...25\347\232\204\345\214\272\345\237\237.md" | 119 ++++++++++++++++++ 1 file changed, 119 insertions(+) diff --git "a/problems/0130.\350\242\253\345\233\264\347\273\225\347\232\204\345\214\272\345\237\237.md" "b/problems/0130.\350\242\253\345\233\264\347\273\225\347\232\204\345\214\272\345\237\237.md" index 352face80d..1ddaaa7f83 100644 --- "a/problems/0130.\350\242\253\345\233\264\347\273\225\347\232\204\345\214\272\345\237\237.md" +++ "b/problems/0130.\350\242\253\345\233\264\347\273\225\347\232\204\345\214\272\345\237\237.md" @@ -593,6 +593,7 @@ func solve(board [][]byte) { for j, c := range r { if c == 'A' { r[j] = 'O' + continue } if c == 'O' { r[j] = 'X' @@ -645,6 +646,7 @@ func solve(board [][]byte) { for j, c := range r { if c == 'A' { r[j] = 'O' + continue } if c == 'O' { r[j] = 'X' @@ -673,6 +675,123 @@ func bfs(board [][]byte, i, j int) { } ``` +### Rust + +bfs: + +```rust +impl Solution { + const DIRECTIONS: [(isize, isize); 4] = [(0, 1), (0, -1), (1, 0), (-1, 0)]; + pub fn solve(board: &mut Vec>) { + let (rows, cols) = (board.len(), board[0].len()); + // 列 + for i in 0..rows { + if board[i][0] == 'O' { + Self::dfs(board, i, 0); + } + if board[i][cols - 1] == 'O' { + Self::dfs(board, i, cols - 1); + } + } + //行 + for j in 0..cols { + if board[0][j] == 'O' { + Self::dfs(board, 0, j); + } + if board[rows - 1][j] == 'O' { + Self::dfs(board, rows - 1, j); + } + } + + for v in board.iter_mut() { + for c in v.iter_mut() { + if *c == 'A' { + *c = 'O'; + continue; + } + if *c == 'O' { + *c = 'X'; + } + } + } + } + + pub fn dfs(board: &mut [Vec], i: usize, j: usize) { + board[i][j] = 'A'; + for (d1, d2) in Self::DIRECTIONS { + let (x, y) = (i as isize + d1, j as isize + d2); + if x < 0 || x >= board.len() as isize || y < 0 || y >= board[0].len() as isize { + continue; + } + let (x, y) = (x as usize, y as usize); + if board[x][y] == 'O' { + Self::dfs(board, x, y); + } + } + } +} +``` + +bfs: + +```rust +use std::collections::VecDeque; +impl Solution { + const DIRECTIONS: [(isize, isize); 4] = [(0, 1), (0, -1), (1, 0), (-1, 0)]; + pub fn solve(board: &mut Vec>) { + let (rows, cols) = (board.len(), board[0].len()); + // 列 + for i in 0..rows { + if board[i][0] == 'O' { + Self::bfs(board, i, 0); + } + if board[i][cols - 1] == 'O' { + Self::bfs(board, i, cols - 1); + } + } + //行 + for j in 0..cols { + if board[0][j] == 'O' { + Self::bfs(board, 0, j); + } + if board[rows - 1][j] == 'O' { + Self::bfs(board, rows - 1, j); + } + } + + for v in board.iter_mut() { + for c in v.iter_mut() { + if *c == 'A' { + *c = 'O'; + continue; + } + if *c == 'O' { + *c = 'X'; + } + } + } + } + + pub fn bfs(board: &mut [Vec], i: usize, j: usize) { + let mut queue = VecDeque::from([(i, j)]); + board[i][j] = 'A'; + while let Some((i, j)) = queue.pop_front() { + for (d1, d2) in Self::DIRECTIONS { + let (x, y) = (i as isize + d1, j as isize + d2); + if x < 0 || x >= board.len() as isize || y < 0 || y >= board[0].len() as isize { + continue; + } + let (x, y) = (x as usize, y as usize); + if board[x][y] == 'O' { + board[x][y] = 'A'; + queue.push_back((x, y)); + } + } + } + } +} +``` +

From c6d7c78dee47ee1eded34779c53227c3f49eeef8 Mon Sep 17 00:00:00 2001 From: Chenxue3 <71321839+Chenxue3@users.noreply.github.com> Date: Tue, 16 Jan 2024 01:37:06 +1300 Subject: [PATCH 2445/3019] =?UTF-8?q?0112.=E8=B7=AF=E5=BE=84=E6=80=BB?= =?UTF-8?q?=E5=92=8C.md=20=E6=B7=BB=E5=8A=A00113=20=E8=B7=AF=E5=BE=84?= =?UTF-8?q?=E6=80=BB=E5=92=8CII=20C#=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...57\345\276\204\346\200\273\345\222\214.md" | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git "a/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" "b/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" index 28134a7cf3..d45be3bd82 100644 --- "a/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" +++ "b/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" @@ -1523,8 +1523,64 @@ public bool HasPathSum(TreeNode root, int targetSum) return HasPathSum(root.left, targetSum - root.val) || HasPathSum(root.right, targetSum - root.val); } ``` +0113.路径总和: +```csharp +/* + * @lc app=leetcode id=113 lang=csharp + * 0113.路径总和 II + * [113] Path Sum II + * 递归法 + */ +public class Solution { + private List> result = new List>(); + private List path = new List(); + + // Main function to find paths with the given sum + public IList> PathSum(TreeNode root, int targetSum) { + result.Clear(); + path.Clear(); + if (root == null) return result.Select(list => list as IList).ToList(); + path.Add(root.val); // Add the root node to the path + traversal(root, targetSum - root.val); // Start the traversal + return result.Select(list => list as IList).ToList(); + } + + // Recursive function to traverse the tree and find paths + private void traversal(TreeNode node, int count) { + // If a leaf node is reached and the target sum is achieved + if (node.left == null && node.right == null && count == 0) { + result.Add(new List(path)); // Add a copy of the path to the result + return; + } + + // If a leaf node is reached and the target sum is not achieved, or if it's not a leaf node + if (node.left == null && node.right == null) return; + + // Traverse the left subtree + if (node.left != null) { + path.Add(node.left.val); + count -= node.left.val; + traversal(node.left, count); // Recursive call + count += node.left.val; // Backtrack + path.RemoveAt(path.Count - 1); // Backtrack + } + + // Traverse the right subtree + if (node.right != null) { + path.Add(node.right.val); + count -= node.right.val; + traversal(node.right, count); // Recursive call + count += node.right.val; // Backtrack + path.RemoveAt(path.Count - 1); // Backtrack + } + } +} + +// @lc code=end +```

+ From 57025dcf3765174b867bc9710b57acf8a85b5a92 Mon Sep 17 00:00:00 2001 From: eeee0717 Date: Tue, 16 Jan 2024 11:11:28 +0800 Subject: [PATCH 2446/3019] =?UTF-8?q?Update=200096.=E4=B8=8D=E5=90=8C?= =?UTF-8?q?=E7=9A=84=E4=BA=8C=E5=8F=89=E6=90=9C=E7=B4=A2=E6=A0=91=EF=BC=8C?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0C#?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...11\346\220\234\347\264\242\346\240\221.md" | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git "a/problems/0096.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0096.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" index d109165b50..15b99083e0 100644 --- "a/problems/0096.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" +++ "b/problems/0096.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" @@ -328,6 +328,25 @@ object Solution { } } ``` +### C# +```csharp +public class Solution +{ + public int NumTrees(int n) + { + int[] dp = new int[n + 1]; + dp[0] = 1; + for (int i = 1; i <= n; i++) + { + for (int j = 1; j <= i; j++) + { + dp[i] += dp[j - 1] * dp[i - j]; + } + } + return dp[n]; + } +} +```

From b19b832edf8cbe20ce3a9736e292c06b9d4fe979 Mon Sep 17 00:00:00 2001 From: fwqaaq Date: Tue, 16 Jan 2024 14:00:17 +0800 Subject: [PATCH 2447/3019] =?UTF-8?q?Update=200417.=E5=A4=AA=E5=B9=B3?= =?UTF-8?q?=E6=B4=8B=E5=A4=A7=E8=A5=BF=E6=B4=8B=E6=B0=B4=E6=B5=81=E9=97=AE?= =?UTF-8?q?=E9=A2=98.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...64\346\265\201\351\227\256\351\242\230.md" | 102 ++++++++++++++++++ 1 file changed, 102 insertions(+) diff --git "a/problems/0417.\345\244\252\345\271\263\346\264\213\345\244\247\350\245\277\346\264\213\346\260\264\346\265\201\351\227\256\351\242\230.md" "b/problems/0417.\345\244\252\345\271\263\346\264\213\345\244\247\350\245\277\346\264\213\346\260\264\346\265\201\351\227\256\351\242\230.md" index 53ae14edfe..21f8a1ca03 100644 --- "a/problems/0417.\345\244\252\345\271\263\346\264\213\345\244\247\350\245\277\346\264\213\346\260\264\346\265\201\351\227\256\351\242\230.md" +++ "b/problems/0417.\345\244\252\345\271\263\346\264\213\345\244\247\350\245\277\346\264\213\346\260\264\346\265\201\351\227\256\351\242\230.md" @@ -562,7 +562,109 @@ function pacificAtlantic(heights) { } ``` +### go + +dfs: + +```go +var DIRECTIONS = [4][2]int{{-1, 0}, {1, 0}, {0, -1}, {0, 1}} + +func pacificAtlantic(heights [][]int) [][]int { + res := make([][]int, 0) + pacific := make([][]bool, len(heights)) + atlantic := make([][]bool, len(heights)) + for i := 0; i < len(heights); i++ { + pacific[i] = make([]bool, len(heights[0])) + atlantic[i] = make([]bool, len(heights[0])) + } + // 列 + for i := 0; i < len(heights); i++ { + dfs(heights, pacific, i, 0) + dfs(heights, atlantic, i, len(heights[0])-1) + } + // 行 + for j := 0; j < len(heights[0]); j++ { + dfs(heights, pacific, 0, j) + dfs(heights, atlantic, len(heights)-1, j) + } + + for i := 0; i < len(heights); i++ { + for j := 0; j < len(heights[0]); j++ { + if pacific[i][j] && atlantic[i][j] { + res = append(res, []int{i, j}) + } + } + } + + return res +} + +func dfs(heights [][]int, visited [][]bool, i, j int) { + visited[i][j] = true + for _, d := range DIRECTIONS { + x, y := i+d[0], j+d[1] + if x < 0 || x >= len(heights) || y < 0 || y >= len(heights[0]) || heights[i][j] > heights[x][y] || visited[x][y] { + continue + } + + dfs(heights, visited, x, y) + } +} +``` +bfs: + +```go +var DIRECTIONS = [4][2]int{{-1, 0}, {1, 0}, {0, -1}, {0, 1}} + +func pacificAtlantic(heights [][]int) [][]int { + res := make([][]int, 0) + pacific := make([][]bool, len(heights)) + atlantic := make([][]bool, len(heights)) + for i := 0; i < len(heights); i++ { + pacific[i] = make([]bool, len(heights[0])) + atlantic[i] = make([]bool, len(heights[0])) + } + // 列 + for i := 0; i < len(heights); i++ { + bfs(heights, pacific, i, 0) + bfs(heights, atlantic, i, len(heights[0])-1) + } + // 行 + for j := 0; j < len(heights[0]); j++ { + bfs(heights, pacific, 0, j) + bfs(heights, atlantic, len(heights)-1, j) + } + + for i := 0; i < len(heights); i++ { + for j := 0; j < len(heights[0]); j++ { + if pacific[i][j] && atlantic[i][j] { + res = append(res, []int{i, j}) + } + } + } + + return res +} + +func bfs(heights [][]int, visited [][]bool, i, j int) { + queue := make([][]int, 0) + queue = append(queue, []int{i, j}) + visited[i][j] = true + for len(queue) > 0 { + cur := queue[0] + queue = queue[1:] + for _, d := range DIRECTIONS { + x, y := cur[0]+d[0], cur[1]+d[1] + if x < 0 || x >= len(heights) || y < 0 || y >= len(heights[0]) || heights[cur[0]][cur[1]] > heights[x][y] || visited[x][y] { + continue + } + queue = append(queue, []int{x, y}) + visited[x][y] = true + } + } +} +```

From f9c2d9677bdf6432c87b4c91b4596fc634599c93 Mon Sep 17 00:00:00 2001 From: fwqaaq Date: Tue, 16 Jan 2024 14:35:10 +0800 Subject: [PATCH 2448/3019] =?UTF-8?q?Update=200417.=E5=A4=AA=E5=B9=B3?= =?UTF-8?q?=E6=B4=8B=E5=A4=A7=E8=A5=BF=E6=B4=8B=E6=B0=B4=E6=B5=81=E9=97=AE?= =?UTF-8?q?=E9=A2=98.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...64\346\265\201\351\227\256\351\242\230.md" | 104 ++++++++++++++++++ 1 file changed, 104 insertions(+) diff --git "a/problems/0417.\345\244\252\345\271\263\346\264\213\345\244\247\350\245\277\346\264\213\346\260\264\346\265\201\351\227\256\351\242\230.md" "b/problems/0417.\345\244\252\345\271\263\346\264\213\345\244\247\350\245\277\346\264\213\346\260\264\346\265\201\351\227\256\351\242\230.md" index 21f8a1ca03..8fe0f1b426 100644 --- "a/problems/0417.\345\244\252\345\271\263\346\264\213\345\244\247\350\245\277\346\264\213\346\260\264\346\265\201\351\227\256\351\242\230.md" +++ "b/problems/0417.\345\244\252\345\271\263\346\264\213\345\244\247\350\245\277\346\264\213\346\260\264\346\265\201\351\227\256\351\242\230.md" @@ -666,6 +666,110 @@ func bfs(heights [][]int, visited [][]bool, i, j int) { } ``` +### Rust + +dfs: + +```rust +impl Solution { + const DIRECTIONS: [(isize, isize); 4] = [(0, 1), (0, -1), (1, 0), (-1, 0)]; + pub fn pacific_atlantic(heights: Vec>) -> Vec> { + let (m, n) = (heights.len(), heights[0].len()); + let mut res = vec![]; + let (mut pacific, mut atlantic) = (vec![vec![false; n]; m], vec![vec![false; n]; m]); + + // 列 + for i in 0..m { + Self::dfs(&heights, &mut pacific, i, 0); + Self::dfs(&heights, &mut atlantic, i, n - 1); + } + + for j in 0..n { + Self::dfs(&heights, &mut pacific, 0, j); + Self::dfs(&heights, &mut atlantic, m - 1, j); + } + + for i in 0..m { + for j in 0..n { + if pacific[i][j] && atlantic[i][j] { + res.push(vec![i as i32, j as i32]); + } + } + } + + res + } + + pub fn dfs(heights: &[Vec], visited: &mut [Vec], i: usize, j: usize) { + visited[i][j] = true; + for (dx, dy) in Self::DIRECTIONS { + let (x, y) = (i as isize + dx, j as isize + dy); + if x < 0 || x >= heights.len() as isize || y < 0 || y >= heights[0].len() as isize { + continue; + } + let (x, y) = (x as usize, y as usize); + if !visited[x][y] && heights[x][y] >= heights[i][j] { + Self::dfs(heights, visited, x, y); + } + } + } +} +``` + +bfs: + +```rust +use std::collections::VecDeque; + +impl Solution { + const DIRECTIONS: [(isize, isize); 4] = [(0, 1), (0, -1), (1, 0), (-1, 0)]; + pub fn pacific_atlantic(heights: Vec>) -> Vec> { + let (m, n) = (heights.len(), heights[0].len()); + let mut res = vec![]; + let (mut pacific, mut atlantic) = (vec![vec![false; n]; m], vec![vec![false; n]; m]); + + // 列 + for i in 0..m { + Self::bfs(&heights, &mut pacific, i, 0); + Self::bfs(&heights, &mut atlantic, i, n - 1); + } + + for j in 0..n { + Self::bfs(&heights, &mut pacific, 0, j); + Self::bfs(&heights, &mut atlantic, m - 1, j); + } + + for i in 0..m { + for j in 0..n { + if pacific[i][j] && atlantic[i][j] { + res.push(vec![i as i32, j as i32]); + } + } + } + + res + } + + pub fn bfs(heights: &[Vec], visited: &mut [Vec], i: usize, j: usize) { + let mut queue = VecDeque::from([(i, j)]); + visited[i][j] = true; + while let Some((i, j)) = queue.pop_front() { + for (dx, dy) in Self::DIRECTIONS { + let (x, y) = (i as isize + dx, j as isize + dy); + if x < 0 || x >= heights.len() as isize || y < 0 || y >= heights[0].len() as isize { + continue; + } + let (x, y) = (x as usize, y as usize); + if !visited[x][y] && heights[x][y] >= heights[i][j] { + queue.push_back((x, y)); + visited[x][y] = true; + } + } + } + } +} +``` +

From 480d0d1f281e4ec87ff206cd399e469284fe8fca Mon Sep 17 00:00:00 2001 From: Yao Zu <1796381757@qq.com> Date: Tue, 16 Jan 2024 20:52:46 +0800 Subject: [PATCH 2449/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200383.=E8=B5=8E?= =?UTF-8?q?=E9=87=91=E4=BF=A1.md=20Python=E7=89=88=E6=9C=AC=E5=85=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 原代码块语言为python3,代码随想录网站无法正常渲染,改为python --- "problems/0383.\350\265\216\351\207\221\344\277\241.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0383.\350\265\216\351\207\221\344\277\241.md" "b/problems/0383.\350\265\216\351\207\221\344\277\241.md" index b800c2320d..93ade51e45 100644 --- "a/problems/0383.\350\265\216\351\207\221\344\277\241.md" +++ "b/problems/0383.\350\265\216\351\207\221\344\277\241.md" @@ -216,7 +216,7 @@ class Solution: (版本六)使用count(简单易懂) -```python3 +```python class Solution: def canConstruct(self, ransomNote: str, magazine: str) -> bool: for char in ransomNote: From 064e582b1e74826e3b60b379aff9c3ee3c41d689 Mon Sep 17 00:00:00 2001 From: eeee0717 Date: Wed, 17 Jan 2024 10:37:45 +0800 Subject: [PATCH 2450/3019] =?UTF-8?q?Update=200416.=E5=88=86=E5=89=B2?= =?UTF-8?q?=E7=AD=89=E5=92=8C=E5=AD=90=E9=9B=86=EF=BC=8C=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?C#?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...11\345\222\214\345\255\220\351\233\206.md" | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git "a/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" "b/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" index 81eb4c807a..71e01ae392 100644 --- "a/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" +++ "b/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" @@ -726,7 +726,35 @@ object Solution { } } ``` +### C# +```csharp +public class Solution +{ + public bool CanPartition(int[] nums) + { + int sum = 0; + int[] dp = new int[10001]; + foreach (int num in nums) + { + sum += num; + } + if (sum % 2 == 1) return false; + int tartget = sum / 2; + for (int i = 0; i < nums.Length; i++) + { + for (int j = tartget; j >= nums[i]; j--) + { + dp[j] = Math.Max(dp[j], dp[j - nums[i]] + nums[i]); + } + } + if (dp[tartget] == tartget) + return true; + + return false; + } +} +```

From f0ac6f599c459a87c96f3adda3f9dce898bef810 Mon Sep 17 00:00:00 2001 From: WmW Date: Wed, 17 Jan 2024 10:48:03 +0800 Subject: [PATCH 2451/3019] =?UTF-8?q?update:=200435.=E6=97=A0=E9=87=8D?= =?UTF-8?q?=E5=8F=A0=E5=8C=BA=E9=97=B4=EF=BC=8Crust=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E6=8A=A5=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...15\345\217\240\345\214\272\351\227\264.md" | 191 ++++++++++-------- 1 file changed, 103 insertions(+), 88 deletions(-) diff --git "a/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" "b/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" index 1a33f98ea6..0bfda5fcaa 100644 --- "a/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" +++ "b/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" @@ -4,7 +4,6 @@

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

- # 435. 无重叠区间 [力扣题目链接](https://leetcode.cn/problems/non-overlapping-intervals/) @@ -16,19 +15,22 @@ 区间 [1,2] 和 [2,3] 的边界相互“接触”,但没有相互重叠。 示例 1: -* 输入: [ [1,2], [2,3], [3,4], [1,3] ] -* 输出: 1 -* 解释: 移除 [1,3] 后,剩下的区间没有重叠。 + +- 输入: [ [1,2], [2,3], [3,4], [1,3] ] +- 输出: 1 +- 解释: 移除 [1,3] 后,剩下的区间没有重叠。 示例 2: -* 输入: [ [1,2], [1,2], [1,2] ] -* 输出: 2 -* 解释: 你需要移除两个 [1,2] 来使剩下的区间没有重叠。 + +- 输入: [ [1,2], [1,2], [1,2] ] +- 输出: 2 +- 解释: 你需要移除两个 [1,2] 来使剩下的区间没有重叠。 示例 3: -* 输入: [ [1,2], [2,3] ] -* 输出: 0 -* 解释: 你不需要移除任何区间,因为它们已经是无重叠的了。 + +- 输入: [ [1,2], [2,3] ] +- 输出: 0 +- 解释: 你不需要移除任何区间,因为它们已经是无重叠的了。 ## 算法公开课 @@ -38,7 +40,7 @@ **相信很多同学看到这道题目都冥冥之中感觉要排序,但是究竟是按照右边界排序,还是按照左边界排序呢?** -其实都可以。主要就是为了让区间尽可能的重叠。 +其实都可以。主要就是为了让区间尽可能的重叠。 **我来按照右边界排序,从左向右记录非交叉区间的个数。最后用区间总数减去非交叉区间的个数就是需要移除的区间个数了**。 @@ -48,17 +50,17 @@ ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20230201164134.png) -区间,1,2,3,4,5,6都按照右边界排好序。 +区间,1,2,3,4,5,6 都按照右边界排好序。 -当确定区间 1 和 区间2 重叠后,如何确定是否与 区间3 也重贴呢? +当确定区间 1 和 区间 2 重叠后,如何确定是否与 区间 3 也重贴呢? -就是取 区间1 和 区间2 右边界的最小值,因为这个最小值之前的部分一定是 区间1 和区间2 的重合部分,如果这个最小值也触达到区间3,那么说明 区间 1,2,3都是重合的。 +就是取 区间 1 和 区间 2 右边界的最小值,因为这个最小值之前的部分一定是 区间 1 和区间 2 的重合部分,如果这个最小值也触达到区间 3,那么说明 区间 1,2,3 都是重合的。 -接下来就是找大于区间1结束位置的区间,是从区间4开始。**那有同学问了为什么不从区间5开始?别忘了已经是按照右边界排序的了**。 +接下来就是找大于区间 1 结束位置的区间,是从区间 4 开始。**那有同学问了为什么不从区间 5 开始?别忘了已经是按照右边界排序的了**。 -区间4结束之后,再找到区间6,所以一共记录非交叉区间的个数是三个。 +区间 4 结束之后,再找到区间 6,所以一共记录非交叉区间的个数是三个。 -总共区间个数为6,减去非交叉区间的个数3。移除区间的最小数量就是3。 +总共区间个数为 6,减去非交叉区间的个数 3。移除区间的最小数量就是 3。 C++代码如下: @@ -84,8 +86,9 @@ public: } }; ``` -* 时间复杂度:O(nlog n) ,有一个快排 -* 空间复杂度:O(n),有一个快排,最差情况(倒序)时,需要n次递归调用。因此确实需要O(n)的栈空间 + +- 时间复杂度:O(nlog n) ,有一个快排 +- 空间复杂度:O(n),有一个快排,最差情况(倒序)时,需要 n 次递归调用。因此确实需要 O(n)的栈空间 大家此时会发现如此复杂的一个问题,代码实现却这么简单! @@ -93,11 +96,11 @@ public: ### 补充(1) -左边界排序可不可以呢? +左边界排序可不可以呢? -也是可以的,只不过 左边界排序我们就是直接求 重叠的区间,count为记录重叠区间数。 +也是可以的,只不过 左边界排序我们就是直接求 重叠的区间,count 为记录重叠区间数。 -```CPP +```CPP class Solution { public: static bool cmp (const vector& a, const vector& b) { @@ -108,9 +111,9 @@ public: sort(intervals.begin(), intervals.end(), cmp); int count = 0; // 注意这里从0开始,因为是记录重叠区间 int end = intervals[0][1]; // 记录区间分割点 - for (int i = 1; i < intervals.size(); i++) { + for (int i = 1; i < intervals.size(); i++) { if (intervals[i][0] >= end) end = intervals[i][1]; // 无重叠的情况 - else { // 重叠情况 + else { // 重叠情况 end = min(end, intervals[i][1]); count++; } @@ -120,9 +123,9 @@ public: }; ``` -其实代码还可以精简一下, 用 intervals[i][1] 替代 end变量,只判断 重叠情况就好 +其实代码还可以精简一下, 用 intervals[i][1] 替代 end 变量,只判断 重叠情况就好 -```CPP +```CPP class Solution { public: static bool cmp (const vector& a, const vector& b) { @@ -148,14 +151,14 @@ public: 本题其实和[452.用最少数量的箭引爆气球](https://programmercarl.com/0452.用最少数量的箭引爆气球.html)非常像,弓箭的数量就相当于是非交叉区间的数量,只要把弓箭那道题目代码里射爆气球的判断条件加个等号(认为[0,1][1,2]不是相邻区间),然后用总区间数减去弓箭数量 就是要移除的区间数量了。 -把[452.用最少数量的箭引爆气球](https://programmercarl.com/0452.用最少数量的箭引爆气球.html)代码稍做修改,就可以AC本题。 +把[452.用最少数量的箭引爆气球](https://programmercarl.com/0452.用最少数量的箭引爆气球.html)代码稍做修改,就可以 AC 本题。 ```CPP class Solution { public: // 按照区间右边界排序 static bool cmp (const vector& a, const vector& b) { - return a[1] < b[1]; // 右边界排序 + return a[1] < b[1]; // 右边界排序 } int eraseOverlapIntervals(vector>& intervals) { if (intervals.size() == 0) return 0; @@ -175,7 +178,8 @@ public: }; ``` -这里按照 左边界排序,或者按照右边界排序,都可以AC,原理是一样的。 +这里按照 左边界排序,或者按照右边界排序,都可以 AC,原理是一样的。 + ```CPP class Solution { public: @@ -204,8 +208,8 @@ public: ## 其他语言版本 +### Java -### Java ```java class Solution { public int eraseOverlapIntervals(int[][] intervals) { @@ -219,7 +223,7 @@ class Solution { continue; }else{ count++; - } + } } return intervals.length - count; } @@ -227,6 +231,7 @@ class Solution { ``` 按左边排序,不管右边顺序。相交的时候取最小的右边。 + ```java class Solution { public int eraseOverlapIntervals(int[][] intervals) { @@ -247,47 +252,53 @@ class Solution { } ``` -### Python +### Python + 贪心 基于左边界 + ```python class Solution: def eraseOverlapIntervals(self, intervals: List[List[int]]) -> int: if not intervals: return 0 - + intervals.sort(key=lambda x: x[0]) # 按照左边界升序排序 count = 0 # 记录重叠区间数量 - + for i in range(1, len(intervals)): if intervals[i][0] < intervals[i - 1][1]: # 存在重叠区间 intervals[i][1] = min(intervals[i - 1][1], intervals[i][1]) # 更新重叠区间的右边界 count += 1 - + return count ``` -贪心 基于左边界 把452.用最少数量的箭引爆气球代码稍做修改 + +贪心 基于左边界 把 452.用最少数量的箭引爆气球代码稍做修改 + ```python class Solution: def eraseOverlapIntervals(self, intervals: List[List[int]]) -> int: if not intervals: return 0 - + intervals.sort(key=lambda x: x[0]) # 按照左边界升序排序 - + result = 1 # 不重叠区间数量,初始化为1,因为至少有一个不重叠的区间 - + for i in range(1, len(intervals)): if intervals[i][0] >= intervals[i - 1][1]: # 没有重叠 result += 1 else: # 重叠情况 intervals[i][1] = min(intervals[i - 1][1], intervals[i][1]) # 更新重叠区间的右边界 - + return len(intervals) - result ``` -### Go + +### Go + ```go func eraseOverlapIntervals(intervals [][]int) int { sort.Slice(intervals, func(i, j int) bool { @@ -312,7 +323,9 @@ func min(a, b int) int { ``` ### Javascript + - 按右边界排序 + ```Javascript var eraseOverlapIntervals = function(intervals) { intervals.sort((a, b) => { @@ -329,27 +342,29 @@ var eraseOverlapIntervals = function(intervals) { count += 1 } } - + 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] - } +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 -} + } + // count 记录的是最大非重复区间的个数 + return intervals.length - count; +}; ``` ### TypeScript @@ -358,43 +373,43 @@ var eraseOverlapIntervals = function(intervals) { ```typescript function eraseOverlapIntervals(intervals: number[][]): number { - const length = intervals.length; - if (length === 0) return 0; - intervals.sort((a, b) => a[1] - b[1]); - let right: number = intervals[0][1]; - let count: number = 1; - for (let i = 1; i < length; i++) { - if (intervals[i][0] >= right) { - count++; - right = intervals[i][1]; - } + const length = intervals.length; + if (length === 0) return 0; + intervals.sort((a, b) => a[1] - b[1]); + let right: number = intervals[0][1]; + let count: number = 1; + for (let i = 1; i < length; i++) { + if (intervals[i][0] >= right) { + count++; + right = intervals[i][1]; } - return length - count; -}; + } + return length - count; +} ``` > 按左边界排序,从左往右遍历 ```typescript function eraseOverlapIntervals(intervals: number[][]): number { - if (intervals.length === 0) return 0; - intervals.sort((a, b) => a[0] - b[0]); - let right: number = intervals[0][1]; - let tempInterval: number[]; - let resCount: number = 0; - for (let i = 1, length = intervals.length; i < length; i++) { - tempInterval = intervals[i]; - if (tempInterval[0] >= right) { - // 未重叠 - right = tempInterval[1]; - } else { - // 有重叠,移除当前interval和前一个interval中右边界更大的那个 - right = Math.min(right, tempInterval[1]); - resCount++; - } + if (intervals.length === 0) return 0; + intervals.sort((a, b) => a[0] - b[0]); + let right: number = intervals[0][1]; + let tempInterval: number[]; + let resCount: number = 0; + for (let i = 1, length = intervals.length; i < length; i++) { + tempInterval = intervals[i]; + if (tempInterval[0] >= right) { + // 未重叠 + right = tempInterval[1]; + } else { + // 有重叠,移除当前interval和前一个interval中右边界更大的那个 + right = Math.min(right, tempInterval[1]); + resCount++; } - return resCount; -}; + } + return resCount; +} ``` ### Scala @@ -423,7 +438,7 @@ object Solution { ```Rust impl Solution { - pub fn erase_overlap_intervals(intervals: Vec>) -> i32 { + pub fn erase_overlap_intervals(mut intervals: Vec>) -> i32 { if intervals.is_empty() { return 0; } @@ -441,7 +456,9 @@ impl Solution { } } ``` + ### C# + ```csharp public class Solution { @@ -463,9 +480,7 @@ public class Solution } ``` -

- From 49e386d20ba95edeffba686584a6b123597ddbba Mon Sep 17 00:00:00 2001 From: eeee0717 Date: Thu, 18 Jan 2024 10:28:55 +0800 Subject: [PATCH 2452/3019] =?UTF-8?q?Update=201049.=E6=9C=80=E5=90=8E?= =?UTF-8?q?=E4=B8=80=E5=9D=97=E7=9F=B3=E5=A4=B4=E7=9A=84=E9=87=8D=E9=87=8F?= =?UTF-8?q?2=EF=BC=8C=E6=B7=BB=E5=8A=A0C#?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\347\232\204\351\207\215\351\207\217II.md" | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git "a/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" "b/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" index cc66131734..4c3c01a037 100644 --- "a/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" +++ "b/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" @@ -472,6 +472,30 @@ impl Solution { } } ``` +### C# +```csharp +public class Solution +{ + public int LastStoneWeightII(int[] stones) + { + int[] dp = new int[15001]; + int sum = 0; + foreach (int stone in stones) + { + sum += stone; + } + int target = sum / 2; + for (int i = 0; i < stones.Length; i++) + { + for (int j = target; j >= stones[i]; j--) + { + dp[j] = Math.Max(dp[j], dp[j - stones[i]] + stones[i]); + } + } + return sum - 2 * dp[target]; + } +} +```

From d8abbca4a877c4acd34744add2c69f940a4c5e38 Mon Sep 17 00:00:00 2001 From: qjd1774 Date: Thu, 18 Jan 2024 11:32:48 +0800 Subject: [PATCH 2453/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0kama54.=E6=9B=BF?= =?UTF-8?q?=E6=8D=A2=E6=95=B0=E5=AD=97.md=20Javascript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...77\346\215\242\346\225\260\345\255\227.md" | 53 +++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git "a/problems/kama54.\346\233\277\346\215\242\346\225\260\345\255\227.md" "b/problems/kama54.\346\233\277\346\215\242\346\225\260\345\255\227.md" index 2b3d53de22..130c42f7a0 100644 --- "a/problems/kama54.\346\233\277\346\215\242\346\225\260\345\255\227.md" +++ "b/problems/kama54.\346\233\277\346\215\242\346\225\260\345\255\227.md" @@ -245,7 +245,60 @@ class Solution: return ''.join(lst) ``` ### JavaScript: +```js +const readline = require("readline"); + +const rl = readline.createInterface({ + input: process.stdin, + output: process.stdout +}) + +function main() { + const num0 = "0".charCodeAt(); + const num9 = "9".charCodeAt(); + const a = "a".charCodeAt(); + const z = "z".charCodeAt(); + function isAZ(str) { + return str >= a && str <= z; + } + function isNumber(str) { + return str >= num0 && str <= num9; + } + rl.on("line", (input) => { + let n = 0; + for (let i = 0; i < input.length; i++) { + const val = input[i].charCodeAt(); + if (isNumber(val)) { + n+= 6; + } + if (isAZ(val)) { + n++; + } + } + const ans = new Array(n).fill(0); + let index = input.length - 1; + for (let i = n - 1; i >= 0; i--) { + const val = input[index].charCodeAt(); + if (isAZ(val)) { + ans[i] = input[index]; + } + if (isNumber(val)) { + ans[i] = "r"; + ans[i - 1] = "e"; + ans[i - 2] = "b"; + ans[i - 3] = "m"; + ans[i - 4] = "u"; + ans[i - 5] = "n"; + i -= 5; + } + index--; + } + console.log(ans.join("")); + }) +} +main(); +``` ### TypeScript: From 017a4ce4ad985c09fe31a3d92d6cf0dab24e0bf9 Mon Sep 17 00:00:00 2001 From: WmW Date: Thu, 18 Jan 2024 14:20:40 +0800 Subject: [PATCH 2454/3019] =?UTF-8?q?update:=200435.=E6=97=A0=E9=87=8D?= =?UTF-8?q?=E5=8F=A0=E5=8C=BA=E9=97=B4=EF=BC=8Crust=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E6=8A=A5=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...15\345\217\240\345\214\272\351\227\264.md" | 188 ++++++++---------- 1 file changed, 86 insertions(+), 102 deletions(-) diff --git "a/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" "b/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" index 0bfda5fcaa..cf9996ddef 100644 --- "a/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" +++ "b/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" @@ -4,6 +4,7 @@

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+ # 435. 无重叠区间 [力扣题目链接](https://leetcode.cn/problems/non-overlapping-intervals/) @@ -15,22 +16,19 @@ 区间 [1,2] 和 [2,3] 的边界相互“接触”,但没有相互重叠。 示例 1: - -- 输入: [ [1,2], [2,3], [3,4], [1,3] ] -- 输出: 1 -- 解释: 移除 [1,3] 后,剩下的区间没有重叠。 +* 输入: [ [1,2], [2,3], [3,4], [1,3] ] +* 输出: 1 +* 解释: 移除 [1,3] 后,剩下的区间没有重叠。 示例 2: - -- 输入: [ [1,2], [1,2], [1,2] ] -- 输出: 2 -- 解释: 你需要移除两个 [1,2] 来使剩下的区间没有重叠。 +* 输入: [ [1,2], [1,2], [1,2] ] +* 输出: 2 +* 解释: 你需要移除两个 [1,2] 来使剩下的区间没有重叠。 示例 3: - -- 输入: [ [1,2], [2,3] ] -- 输出: 0 -- 解释: 你不需要移除任何区间,因为它们已经是无重叠的了。 +* 输入: [ [1,2], [2,3] ] +* 输出: 0 +* 解释: 你不需要移除任何区间,因为它们已经是无重叠的了。 ## 算法公开课 @@ -40,7 +38,7 @@ **相信很多同学看到这道题目都冥冥之中感觉要排序,但是究竟是按照右边界排序,还是按照左边界排序呢?** -其实都可以。主要就是为了让区间尽可能的重叠。 +其实都可以。主要就是为了让区间尽可能的重叠。 **我来按照右边界排序,从左向右记录非交叉区间的个数。最后用区间总数减去非交叉区间的个数就是需要移除的区间个数了**。 @@ -50,17 +48,17 @@ ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20230201164134.png) -区间,1,2,3,4,5,6 都按照右边界排好序。 +区间,1,2,3,4,5,6都按照右边界排好序。 -当确定区间 1 和 区间 2 重叠后,如何确定是否与 区间 3 也重贴呢? +当确定区间 1 和 区间2 重叠后,如何确定是否与 区间3 也重贴呢? -就是取 区间 1 和 区间 2 右边界的最小值,因为这个最小值之前的部分一定是 区间 1 和区间 2 的重合部分,如果这个最小值也触达到区间 3,那么说明 区间 1,2,3 都是重合的。 +就是取 区间1 和 区间2 右边界的最小值,因为这个最小值之前的部分一定是 区间1 和区间2 的重合部分,如果这个最小值也触达到区间3,那么说明 区间 1,2,3都是重合的。 -接下来就是找大于区间 1 结束位置的区间,是从区间 4 开始。**那有同学问了为什么不从区间 5 开始?别忘了已经是按照右边界排序的了**。 +接下来就是找大于区间1结束位置的区间,是从区间4开始。**那有同学问了为什么不从区间5开始?别忘了已经是按照右边界排序的了**。 -区间 4 结束之后,再找到区间 6,所以一共记录非交叉区间的个数是三个。 +区间4结束之后,再找到区间6,所以一共记录非交叉区间的个数是三个。 -总共区间个数为 6,减去非交叉区间的个数 3。移除区间的最小数量就是 3。 +总共区间个数为6,减去非交叉区间的个数3。移除区间的最小数量就是3。 C++代码如下: @@ -86,9 +84,8 @@ public: } }; ``` - -- 时间复杂度:O(nlog n) ,有一个快排 -- 空间复杂度:O(n),有一个快排,最差情况(倒序)时,需要 n 次递归调用。因此确实需要 O(n)的栈空间 +* 时间复杂度:O(nlog n) ,有一个快排 +* 空间复杂度:O(n),有一个快排,最差情况(倒序)时,需要n次递归调用。因此确实需要O(n)的栈空间 大家此时会发现如此复杂的一个问题,代码实现却这么简单! @@ -96,11 +93,11 @@ public: ### 补充(1) -左边界排序可不可以呢? +左边界排序可不可以呢? -也是可以的,只不过 左边界排序我们就是直接求 重叠的区间,count 为记录重叠区间数。 +也是可以的,只不过 左边界排序我们就是直接求 重叠的区间,count为记录重叠区间数。 -```CPP +```CPP class Solution { public: static bool cmp (const vector& a, const vector& b) { @@ -111,9 +108,9 @@ public: sort(intervals.begin(), intervals.end(), cmp); int count = 0; // 注意这里从0开始,因为是记录重叠区间 int end = intervals[0][1]; // 记录区间分割点 - for (int i = 1; i < intervals.size(); i++) { + for (int i = 1; i < intervals.size(); i++) { if (intervals[i][0] >= end) end = intervals[i][1]; // 无重叠的情况 - else { // 重叠情况 + else { // 重叠情况 end = min(end, intervals[i][1]); count++; } @@ -123,9 +120,9 @@ public: }; ``` -其实代码还可以精简一下, 用 intervals[i][1] 替代 end 变量,只判断 重叠情况就好 +其实代码还可以精简一下, 用 intervals[i][1] 替代 end变量,只判断 重叠情况就好 -```CPP +```CPP class Solution { public: static bool cmp (const vector& a, const vector& b) { @@ -151,14 +148,14 @@ public: 本题其实和[452.用最少数量的箭引爆气球](https://programmercarl.com/0452.用最少数量的箭引爆气球.html)非常像,弓箭的数量就相当于是非交叉区间的数量,只要把弓箭那道题目代码里射爆气球的判断条件加个等号(认为[0,1][1,2]不是相邻区间),然后用总区间数减去弓箭数量 就是要移除的区间数量了。 -把[452.用最少数量的箭引爆气球](https://programmercarl.com/0452.用最少数量的箭引爆气球.html)代码稍做修改,就可以 AC 本题。 +把[452.用最少数量的箭引爆气球](https://programmercarl.com/0452.用最少数量的箭引爆气球.html)代码稍做修改,就可以AC本题。 ```CPP class Solution { public: // 按照区间右边界排序 static bool cmp (const vector& a, const vector& b) { - return a[1] < b[1]; // 右边界排序 + return a[1] < b[1]; // 右边界排序 } int eraseOverlapIntervals(vector>& intervals) { if (intervals.size() == 0) return 0; @@ -178,8 +175,7 @@ public: }; ``` -这里按照 左边界排序,或者按照右边界排序,都可以 AC,原理是一样的。 - +这里按照 左边界排序,或者按照右边界排序,都可以AC,原理是一样的。 ```CPP class Solution { public: @@ -208,8 +204,8 @@ public: ## 其他语言版本 -### Java +### Java ```java class Solution { public int eraseOverlapIntervals(int[][] intervals) { @@ -223,7 +219,7 @@ class Solution { continue; }else{ count++; - } + } } return intervals.length - count; } @@ -231,7 +227,6 @@ class Solution { ``` 按左边排序,不管右边顺序。相交的时候取最小的右边。 - ```java class Solution { public int eraseOverlapIntervals(int[][] intervals) { @@ -252,53 +247,47 @@ class Solution { } ``` -### Python - +### Python 贪心 基于左边界 - ```python class Solution: def eraseOverlapIntervals(self, intervals: List[List[int]]) -> int: if not intervals: return 0 - + intervals.sort(key=lambda x: x[0]) # 按照左边界升序排序 count = 0 # 记录重叠区间数量 - + for i in range(1, len(intervals)): if intervals[i][0] < intervals[i - 1][1]: # 存在重叠区间 intervals[i][1] = min(intervals[i - 1][1], intervals[i][1]) # 更新重叠区间的右边界 count += 1 - + return count ``` - -贪心 基于左边界 把 452.用最少数量的箭引爆气球代码稍做修改 - +贪心 基于左边界 把452.用最少数量的箭引爆气球代码稍做修改 ```python class Solution: def eraseOverlapIntervals(self, intervals: List[List[int]]) -> int: if not intervals: return 0 - + intervals.sort(key=lambda x: x[0]) # 按照左边界升序排序 - + result = 1 # 不重叠区间数量,初始化为1,因为至少有一个不重叠的区间 - + for i in range(1, len(intervals)): if intervals[i][0] >= intervals[i - 1][1]: # 没有重叠 result += 1 else: # 重叠情况 intervals[i][1] = min(intervals[i - 1][1], intervals[i][1]) # 更新重叠区间的右边界 - + return len(intervals) - result ``` - -### Go - +### Go ```go func eraseOverlapIntervals(intervals [][]int) int { sort.Slice(intervals, func(i, j int) bool { @@ -323,9 +312,7 @@ func min(a, b int) int { ``` ### Javascript - - 按右边界排序 - ```Javascript var eraseOverlapIntervals = function(intervals) { intervals.sort((a, b) => { @@ -342,29 +329,27 @@ var eraseOverlapIntervals = function(intervals) { count += 1 } } - + 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]; +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; -}; + // count 记录的是最大非重复区间的个数 + return intervals.length - count +} ``` ### TypeScript @@ -373,43 +358,43 @@ var eraseOverlapIntervals = function (intervals) { ```typescript function eraseOverlapIntervals(intervals: number[][]): number { - const length = intervals.length; - if (length === 0) return 0; - intervals.sort((a, b) => a[1] - b[1]); - let right: number = intervals[0][1]; - let count: number = 1; - for (let i = 1; i < length; i++) { - if (intervals[i][0] >= right) { - count++; - right = intervals[i][1]; + const length = intervals.length; + if (length === 0) return 0; + intervals.sort((a, b) => a[1] - b[1]); + let right: number = intervals[0][1]; + let count: number = 1; + for (let i = 1; i < length; i++) { + if (intervals[i][0] >= right) { + count++; + right = intervals[i][1]; + } } - } - return length - count; -} + return length - count; +}; ``` > 按左边界排序,从左往右遍历 ```typescript function eraseOverlapIntervals(intervals: number[][]): number { - if (intervals.length === 0) return 0; - intervals.sort((a, b) => a[0] - b[0]); - let right: number = intervals[0][1]; - let tempInterval: number[]; - let resCount: number = 0; - for (let i = 1, length = intervals.length; i < length; i++) { - tempInterval = intervals[i]; - if (tempInterval[0] >= right) { - // 未重叠 - right = tempInterval[1]; - } else { - // 有重叠,移除当前interval和前一个interval中右边界更大的那个 - right = Math.min(right, tempInterval[1]); - resCount++; + if (intervals.length === 0) return 0; + intervals.sort((a, b) => a[0] - b[0]); + let right: number = intervals[0][1]; + let tempInterval: number[]; + let resCount: number = 0; + for (let i = 1, length = intervals.length; i < length; i++) { + tempInterval = intervals[i]; + if (tempInterval[0] >= right) { + // 未重叠 + right = tempInterval[1]; + } else { + // 有重叠,移除当前interval和前一个interval中右边界更大的那个 + right = Math.min(right, tempInterval[1]); + resCount++; + } } - } - return resCount; -} + return resCount; +}; ``` ### Scala @@ -456,9 +441,7 @@ impl Solution { } } ``` - ### C# - ```csharp public class Solution { @@ -480,6 +463,7 @@ public class Solution } ``` +

From e0b0078eea56b6af0e18487e428fa78ff93313ec Mon Sep 17 00:00:00 2001 From: eeee0717 Date: Fri, 19 Jan 2024 10:02:55 +0800 Subject: [PATCH 2455/3019] =?UTF-8?q?Update=200494.=E7=9B=AE=E6=A0=87?= =?UTF-8?q?=E5=92=8C=EF=BC=8C=E6=B7=BB=E5=8A=A0C#?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...4.\347\233\256\346\240\207\345\222\214.md" | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git "a/problems/0494.\347\233\256\346\240\207\345\222\214.md" "b/problems/0494.\347\233\256\346\240\207\345\222\214.md" index 2d38b4d06a..e7a05d45c3 100644 --- "a/problems/0494.\347\233\256\346\240\207\345\222\214.md" +++ "b/problems/0494.\347\233\256\346\240\207\345\222\214.md" @@ -585,6 +585,33 @@ impl Solution { } } ``` +### C# +```csharp +public class Solution +{ + public int FindTargetSumWays(int[] nums, int target) + { + int sum = 0; + foreach (int num in nums) + { + sum += num; + } + if (Math.Abs(target) > sum) return 0; + if ((sum + target) % 2 == 1) return 0; + int bagSize = (sum + target) / 2; + int[] dp = new int[bagSize + 1]; + dp[0] = 1; + for (int i = 0; i < nums.Length; i++) + { + for (int j = bagSize; j >= nums[i]; j--) + { + dp[j] += dp[j - nums[i]]; + } + } + return dp[bagSize]; + } +} +```

From fddab1a7f4442e7cebf70f118b6157c6dfb3d67e Mon Sep 17 00:00:00 2001 From: eeee0717 Date: Sat, 20 Jan 2024 09:51:00 +0800 Subject: [PATCH 2456/3019] =?UTF-8?q?Update=200474.=E4=B8=80=E5=92=8C?= =?UTF-8?q?=E9=9B=B6=EF=BC=8C=E6=B7=BB=E5=8A=A0C#?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...4.\344\270\200\345\222\214\351\233\266.md" | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git "a/problems/0474.\344\270\200\345\222\214\351\233\266.md" "b/problems/0474.\344\270\200\345\222\214\351\233\266.md" index 8f6197ac5c..904d941e9d 100644 --- "a/problems/0474.\344\270\200\345\222\214\351\233\266.md" +++ "b/problems/0474.\344\270\200\345\222\214\351\233\266.md" @@ -533,6 +533,33 @@ impl Solution { } } ``` +### C# +```csharp +public class Solution +{ + public int FindMaxForm(string[] strs, int m, int n) + { + int[,] dp = new int[m + 1, n + 1]; + foreach (string str in strs) + { + int zero = 0, one = 0; + foreach (char c in str) + { + if (c == '0') zero++; + else one++; + } + for (int i = m; i >= zero; i--) + { + for (int j = n; j >= one; j--) + { + dp[i, j] = Math.Max(dp[i, j], dp[i - zero, j - one] + 1); + } + } + } + return dp[m, n]; + } +} +```

From af4056827594bdc1db564a91cc86d196e5a48a6d Mon Sep 17 00:00:00 2001 From: EmmIons <48384706+EmmIons@users.noreply.github.com> Date: Sat, 20 Jan 2024 18:02:03 +0800 Subject: [PATCH 2457/3019] =?UTF-8?q?Update=200518.=E9=9B=B6=E9=92=B1?= =?UTF-8?q?=E5=85=91=E6=8D=A2II.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit java版本二维dp数组代码逻辑优化, 原版本的二维dp数组和一维dp数组的逻辑并不对应. --- ...\351\222\261\345\205\221\346\215\242II.md" | 28 +++++++++++-------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git "a/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" "b/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" index 5c6efdcb3f..fa10454164 100644 --- "a/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" +++ "b/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" @@ -224,20 +224,26 @@ class Solution { // 二维dp数组版本,方便理解 class Solution { public int change(int amount, int[] coins) { - int[][] dp = new int[coins.length][amount + 1]; - // 只有一种硬币的情况 - for (int i = 0; i <= amount; i += coins[0]) { - dp[0][i] = 1; + int[][] dp = new int[coins.length][amount+1]; + + // 初始化边界值 + for(int i = 0; i < coins.length; i++){ + // 第一列的初始值为1 + dp[i][0] = 1; + } + for(int j = coins[0]; j <= amount; j++){ + // 初始化第一行 + dp[0][j] += dp[0][j-coins[0]]; } - for (int i = 1; i < coins.length; i++) { - for (int j = 0; j <= amount; j++) { - // 第i种硬币使用0~k次,求和 - for (int k = 0; k * coins[i] <= j; k++) { - dp[i][j] += dp[i - 1][j - k * coins[i]]; - } + + for(int i = 1; i < coins.length; i++){ + for(int j = 1; j <= amount; j++){ + if(j < coins[i]) dp[i][j] = dp[i-1][j]; + else dp[i][j] = dp[i][j-coins[i]] + dp[i-1][j]; } } - return dp[coins.length - 1][amount]; + + return dp[coins.length-1][amount]; } } ``` From bcfa9202eba667e24df0512b842fa13669f36924 Mon Sep 17 00:00:00 2001 From: eeee0717 Date: Sun, 21 Jan 2024 10:29:39 +0800 Subject: [PATCH 2458/3019] =?UTF-8?q?Update=200518.=E9=9B=B6=E9=92=B1?= =?UTF-8?q?=E5=85=91=E6=8D=A22=EF=BC=8C=E6=B7=BB=E5=8A=A0C#?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\351\222\261\345\205\221\346\215\242II.md" | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git "a/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" "b/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" index 5c6efdcb3f..9fbe8ba32f 100644 --- "a/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" +++ "b/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" @@ -347,6 +347,26 @@ object Solution { } } ``` +### C# +```csharp +public class Solution +{ + public int Change(int amount, int[] coins) + { + int[] dp = new int[amount + 1]; + dp[0] = 1; + for (int i = 0; i < coins.Length; i++) + { + for (int j = coins[i]; j <= amount; j++) + { + if (j >= coins[i]) + dp[j] += dp[j - coins[i]]; + } + } + return dp[amount]; + } +} +```

From 68cdbdbb90f2d5a7a32278804f77663198e35a43 Mon Sep 17 00:00:00 2001 From: 0zz10 <56071597+0zz10@users.noreply.github.com> Date: Sun, 21 Jan 2024 15:40:51 -0800 Subject: [PATCH 2459/3019] =?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 move second solution to 0496.下一个更大元素I --- ...\345\244\247\345\205\203\347\264\240II.md" | 21 ------------------- 1 file changed, 21 deletions(-) diff --git "a/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" "b/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" index b788968cee..6df83fb208 100644 --- "a/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" +++ "b/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" @@ -170,7 +170,6 @@ class Solution { ### Python: ```python -# 方法 1: class Solution: def nextGreaterElements(self, nums: List[int]) -> List[int]: dp = [-1] * len(nums) @@ -181,26 +180,6 @@ class Solution: stack.pop() stack.append(i%len(nums)) return dp - -# 方法 2: -class Solution: - def nextGreaterElement(self, nums1: List[int], nums2: List[int]) -> List[int]: - stack = [] - # 创建答案数组 - ans = [-1] * len(nums1) - for i in range(len(nums2)): - while len(stack) > 0 and nums2[i] > nums2[stack[-1]]: - # 判断 num1 是否有 nums2[stack[-1]]。如果没有这个判断会出现指针异常 - if nums2[stack[-1]] in nums1: - # 锁定 num1 检索的 index - index = nums1.index(nums2[stack[-1]]) - # 更新答案数组 - ans[index] = nums2[i] - # 弹出小元素 - # 这个代码一定要放在 if 外面。否则单调栈的逻辑就不成立了 - stack.pop() - stack.append(i) - return ans ``` ### Go: From 17a6cb3989befb0d6124f2854c17854dd46d62a1 Mon Sep 17 00:00:00 2001 From: 0zz10 <56071597+0zz10@users.noreply.github.com> Date: Sun, 21 Jan 2024 15:43:00 -0800 Subject: [PATCH 2460/3019] =?UTF-8?q?Update=200496.=E4=B8=8B=E4=B8=80?= =?UTF-8?q?=E4=B8=AA=E6=9B=B4=E5=A4=A7=E5=85=83=E7=B4=A0I.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Move solution from 0503.下一个更大元素II --- ...4\345\244\247\345\205\203\347\264\240I.md" | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git "a/problems/0496.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240I.md" "b/problems/0496.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240I.md" index 45797fb69a..d97a3e8482 100644 --- "a/problems/0496.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240I.md" +++ "b/problems/0496.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240I.md" @@ -256,6 +256,7 @@ class Solution { ### Python3 ```python +# 版本一 class Solution: def nextGreaterElement(self, nums1: List[int], nums2: List[int]) -> List[int]: result = [-1]*len(nums1) @@ -273,6 +274,26 @@ class Solution: stack.pop() stack.append(i) return result + +# 版本二 +class Solution: + def nextGreaterElement(self, nums1: List[int], nums2: List[int]) -> List[int]: + stack = [] + # 创建答案数组 + ans = [-1] * len(nums1) + for i in range(len(nums2)): + while len(stack) > 0 and nums2[i] > nums2[stack[-1]]: + # 判断 num1 是否有 nums2[stack[-1]]。如果没有这个判断会出现指针异常 + if nums2[stack[-1]] in nums1: + # 锁定 num1 检索的 index + index = nums1.index(nums2[stack[-1]]) + # 更新答案数组 + ans[index] = nums2[i] + # 弹出小元素 + # 这个代码一定要放在 if 外面。否则单调栈的逻辑就不成立了 + stack.pop() + stack.append(i) + return ans ``` ### Go From 9eb2bec1b01e0baa9254401c732a6fb86d55df39 Mon Sep 17 00:00:00 2001 From: eeee0717 Date: Mon, 22 Jan 2024 10:32:00 +0800 Subject: [PATCH 2461/3019] =?UTF-8?q?Update=200377.=E7=BB=84=E5=90=88?= =?UTF-8?q?=E7=BB=BC=E5=90=884=EF=BC=8C=E6=B7=BB=E5=8A=A0C#?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...10\346\200\273\345\222\214\342\205\243.md" | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git "a/problems/0377.\347\273\204\345\220\210\346\200\273\345\222\214\342\205\243.md" "b/problems/0377.\347\273\204\345\220\210\346\200\273\345\222\214\342\205\243.md" index 05f852b1c6..a840ec9bcc 100644 --- "a/problems/0377.\347\273\204\345\220\210\346\200\273\345\222\214\342\205\243.md" +++ "b/problems/0377.\347\273\204\345\220\210\346\200\273\345\222\214\342\205\243.md" @@ -312,6 +312,28 @@ impl Solution { } } ``` +### C# +```csharp +public class Solution +{ + public int CombinationSum4(int[] nums, int target) + { + int[] dp = new int[target + 1]; + dp[0] = 1; + for (int i = 0; i <= target; i++) + { + for (int j = 0; j < nums.Length; j++) + { + if (i >= nums[j] && dp[i] < int.MaxValue - dp[i - nums[j]]) + { + dp[i] += dp[i - nums[j]]; + } + } + } + return dp[target]; + } +} +```

From d8f076ef514737ff4ad9247a7380ba2f7c8c7515 Mon Sep 17 00:00:00 2001 From: tlylt Date: Tue, 23 Jan 2024 07:41:36 +0800 Subject: [PATCH 2462/3019] Add two versions of intersection function in Go --- ...04\347\232\204\344\272\244\351\233\206.md" | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git "a/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" "b/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" index 26a9286dc9..25c4e702a6 100644 --- "a/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" +++ "b/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" @@ -210,6 +210,8 @@ class Solution: ### Go: +(版本一)使用字典和集合 + ```go func intersection(nums1 []int, nums2 []int) []int { set:=make(map[int]struct{},0) // 用map模拟set @@ -230,6 +232,28 @@ func intersection(nums1 []int, nums2 []int) []int { } ``` +(版本二)使用数组 + +```go +func intersection(nums1 []int, nums2 []int) []int { + count1 := make([]int, 1001, 1001) + count2 := make([]int, 1001, 1001) + res := make([]int, 0) + for _, v := range nums1 { + count1[v] = 1 + } + for _, v := range nums2 { + count2[v] = 1 + } + for i := 0; i <= 1000; i++ { + if count1[i] + count2[i] == 2 { + res = append(res, i) + } + } + return res +} +``` + ### JavaScript: ```js From b0dbf080646b57157fa285559b748a2c8fc8a452 Mon Sep 17 00:00:00 2001 From: 0zz10 <56071597+0zz10@users.noreply.github.com> Date: Mon, 22 Jan 2024 20:45:36 -0800 Subject: [PATCH 2463/3019] =?UTF-8?q?Update=200127.=E5=8D=95=E8=AF=8D?= =?UTF-8?q?=E6=8E=A5=E9=BE=99.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fix syntax highlight --- .../0127.\345\215\225\350\257\215\346\216\245\351\276\231.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0127.\345\215\225\350\257\215\346\216\245\351\276\231.md" "b/problems/0127.\345\215\225\350\257\215\346\216\245\351\276\231.md" index 97bc66d096..6f8933101e 100644 --- "a/problems/0127.\345\215\225\350\257\215\346\216\245\351\276\231.md" +++ "b/problems/0127.\345\215\225\350\257\215\346\216\245\351\276\231.md" @@ -198,7 +198,7 @@ class Solution { ### Python -``` +```python class Solution: def ladderLength(self, beginWord: str, endWord: str, wordList: List[str]) -> int: wordSet = set(wordList) From e7e7c4665fe172bcaebed116bb16c3f39e0bc73c Mon Sep 17 00:00:00 2001 From: SteveL <66228787+stevenleon99@users.noreply.github.com> Date: Tue, 23 Jan 2024 21:51:52 -0500 Subject: [PATCH 2464/3019] =?UTF-8?q?Update=200059.=E8=9E=BA=E6=97=8B?= =?UTF-8?q?=E7=9F=A9=E9=98=B5II.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit while (loop --) { i = startx; j = starty; // 下面开始的四个for就是模拟转了一圈 // 模拟填充上行从左到右(左闭右开) for (j; j < n - offset; j++) { res[i][j] = count++; } // 模拟填充右列从上到下(左闭右开) for (i; i < n - offset; i++) { res[i][j] = count++; } --- ...9.\350\236\272\346\227\213\347\237\251\351\230\265II.md" | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git "a/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" "b/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" index 58378ffcf2..60281d48f6 100644 --- "a/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" +++ "b/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" @@ -87,11 +87,11 @@ public: // 下面开始的四个for就是模拟转了一圈 // 模拟填充上行从左到右(左闭右开) - for (j = starty; j < n - offset; j++) { - res[startx][j] = count++; + for (j; j < n - offset; j++) { + res[i][j] = count++; } // 模拟填充右列从上到下(左闭右开) - for (i = startx; i < n - offset; i++) { + for (i; i < n - offset; i++) { res[i][j] = count++; } // 模拟填充下行从右到左(左闭右开) From 671714fc4736f857977fdb355079bc1d7140ca44 Mon Sep 17 00:00:00 2001 From: Lina Date: Wed, 24 Jan 2024 21:23:21 +0000 Subject: [PATCH 2465/3019] =?UTF-8?q?=E6=8C=89=E7=85=A7=E8=A7=A3=E9=A2=98?= =?UTF-8?q?=E6=80=9D=E8=B7=AF=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81=E5=8F=8A?= =?UTF-8?q?=E5=8F=98=E9=87=8F=E5=90=8D=E7=A7=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\346\227\213\347\237\251\351\230\265II.md" | 59 +++++++++++-------- 1 file changed, 34 insertions(+), 25 deletions(-) diff --git "a/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" "b/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" index 58378ffcf2..a34af5e3f5 100644 --- "a/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" +++ "b/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" @@ -138,42 +138,51 @@ public: ```Java class Solution { public int[][] generateMatrix(int n) { - int loop = 0; // 控制循环次数 - int[][] res = new int[n][n]; - int start = 0; // 每次循环的开始点(start, start) - int count = 1; // 定义填充数字 - int i, j; - - while (loop++ < n / 2) { // 判断边界后,loop从1开始 - // 模拟上侧从左到右 - for (j = start; j < n - loop; j++) { - res[start][j] = count++; + int[][] nums = new int[n][n]; + int startX = 0, startY = 0; // 每一圈的起始点 + int offset = 1; + int count = 1; // 矩阵中需要填写的数字 + int loop = 1; // 记录当前的圈数 + int i, j; // j 代表列, i 代表行; + + while (loop <= n / 2) { + + // 顶部 + // 左闭右开,所以判断循环结束时, j 不能等于 n - offset + for (j = startY; j < n - offset; j++) { + nums[startX][j] = count++; } - // 模拟右侧从上到下 - for (i = start; i < n - loop; i++) { - res[i][j] = count++; + // 右列 + // 左闭右开,所以判断循环结束时, i 不能等于 n - offset + for (i = startX; i < n - offset; i++) { + nums[i][j] = count++; } - // 模拟下侧从右到左 - for (; j >= loop; j--) { - res[i][j] = count++; + // 底部 + // 左闭右开,所以判断循环结束时, j != startY + for (; j > startY; j--) { + nums[i][j] = count++; } - // 模拟左侧从下到上 - for (; i >= loop; i--) { - res[i][j] = count++; + // 左列 + // 左闭右开,所以判断循环结束时, i != startX + for (; i > startX; i--) { + nums[i][j] = count++; } - start++; + startX++; + startY++; + offset++; + loop++; } - - if (n % 2 == 1) { - res[start][start] = count; + if (n % 2 == 1) { // n 为奇数时,单独处理矩阵中心的值 + nums[startX][startY] = count; } - - return res; + return nums; } } + + ``` ### python3: From e51ce46b75cae98e8b69bac491151f0a347d10e8 Mon Sep 17 00:00:00 2001 From: zhouzheng Date: Fri, 26 Jan 2024 11:18:54 +0800 Subject: [PATCH 2466/3019] =?UTF-8?q?update:=2070.=20=E7=88=AC=E6=A5=BC?= =?UTF-8?q?=E6=A2=AF=E8=BF=9B=E9=98=B6=E7=89=88=EF=BC=8C=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=20go=20=E8=AF=AD=E8=A8=80=E9=A2=98=E8=A7=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...14\345\214\205\347\211\210\346\234\254.md" | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git "a/problems/0070.\347\210\254\346\245\274\346\242\257\345\256\214\345\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md" "b/problems/0070.\347\210\254\346\245\274\346\242\257\345\256\214\345\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md" index f8337cc048..4fa294cfe2 100644 --- "a/problems/0070.\347\210\254\346\245\274\346\242\257\345\256\214\345\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md" +++ "b/problems/0070.\347\210\254\346\245\274\346\242\257\345\256\214\345\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md" @@ -169,7 +169,32 @@ class climbStairs{ ### Go: +```go +func climbStairs(n int, m int) int { + dp := make([]int, n+1) + dp[0] = 1 + for i := 1; i <= n; i++ { + for j := 1; j <= m; j++ { + if i-j >= 0 { + dp[i] += dp[i-j] + } + } + } + return dp[n] +} +func main() { + // 读取输入n,m + reader := bufio.NewReader(os.Stdin) + input, _ := reader.ReadString('\n') + input = strings.TrimSpace(input) + nv := strings.Split(input, " ") + n, _ := strconv.Atoi(nv[0]) + m, _ := strconv.Atoi(nv[1]) + result := climbStairs(n, m) + fmt.Println(result) +} +``` ### JavaScript: From abc86e9a7d66851ada0e54f74efd50b9ce5da8f2 Mon Sep 17 00:00:00 2001 From: Heeqw <124508798+Heeqw@users.noreply.github.com> Date: Sat, 27 Jan 2024 17:05:04 +0800 Subject: [PATCH 2467/3019] =?UTF-8?q?Update=20=E9=9D=A2=E8=AF=95=E9=A2=980?= =?UTF-8?q?2.07.=E9=93=BE=E8=A1=A8=E7=9B=B8=E4=BA=A4.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 增加了一种java语言的同步移动方法 --- ...276\350\241\250\347\233\270\344\272\244.md" | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git "a/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" "b/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" index d0967b8b86..e2905d49be 100644 --- "a/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" +++ "b/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" @@ -105,6 +105,7 @@ public: ### Java: ```Java +(版本一)先行移动长链表实现同步移动 public class Solution { public ListNode getIntersectionNode(ListNode headA, ListNode headB) { ListNode curA = headA; @@ -149,6 +150,23 @@ public class Solution { } } + +(版本二) 合并链表实现同步移动 +public class Solution { + public ListNode getIntersectionNode(ListNode headA, ListNode headB) { + // p1 指向 A 链表头结点,p2 指向 B 链表头结点 + ListNode p1 = headA, p2 = headB; + while (p1 != p2) { + // p1 走一步,如果走到 A 链表末尾,转到 B 链表 + if (p1 == null) p1 = headB; + else p1 = p1.next; + // p2 走一步,如果走到 B 链表末尾,转到 A 链表 + if (p2 == null) p2 = headA; + else p2 = p2.next; + } + return p1; + } +} ``` ### Python: From 8b35191534307420814a486d232b11027cc85504 Mon Sep 17 00:00:00 2001 From: qiuzidian <115708838+qiuzidian@users.noreply.github.com> Date: Mon, 29 Jan 2024 21:37:01 +0800 Subject: [PATCH 2468/3019] =?UTF-8?q?Update=200454.=E5=9B=9B=E6=95=B0?= =?UTF-8?q?=E7=9B=B8=E5=8A=A0II.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 增加c语言版本解法 --- ...\346\225\260\347\233\270\345\212\240II.md" | 70 +++++++++++++++++++ 1 file changed, 70 insertions(+) diff --git "a/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" "b/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" index 1c262c873d..3baeade533 100644 --- "a/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" +++ "b/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" @@ -412,6 +412,76 @@ public int FourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) { return res; } ``` +### C: + +```c +// 哈希表大小 +const int HASH_SIZE = 101; + +typedef struct node +{ + int val; + int count; + struct node *next; +}node, *HashMap; + +// 哈希表插入 +void hash_insert(HashMap hashmap[], int val){ + int idx = val < 0 ? (-val) % HASH_SIZE : val % HASH_SIZE, count = 0; + node *p = hashmap[idx]; + while (p->next != NULL) { + p = p->next; + if (p->val == val){ + (p->count)++; + return; + } + } + node *new = malloc(sizeof(node)); + new->val = val; + new->count = 1; + new->next = NULL; + p->next = new; + return; +} + +// 哈希表查找 +int hash_search(HashMap hashmap[], int val){ + int idx = val < 0 ? (-val) % HASH_SIZE : val % HASH_SIZE; + node *p = hashmap[idx]; + while (p->next != NULL){ + p = p->next; + if (p->val == val) return p->count; + } + return 0; +} + +int fourSumCount(int* nums1, int nums1Size, int* nums2, int nums2Size, int* nums3, int nums3Size, int* nums4, int nums4Size){ + // 初始化哈希表 + HashMap hashmap[HASH_SIZE]; + for (int i = 0; i < HASH_SIZE; i++){ + hashmap[i] = malloc(sizeof(node)); + hashmap[i]->next = NULL; + } + + // 统计两个数组元素之和的负值和出现的次数,放到哈希表中 + int count = 0, num; + for (int i=0; i From 2f2e6856dbda03d1580b4301bf62dee04b0f641b Mon Sep 17 00:00:00 2001 From: qiuzidian <115708838+qiuzidian@users.noreply.github.com> Date: Mon, 29 Jan 2024 22:08:52 +0800 Subject: [PATCH 2469/3019] =?UTF-8?q?Update=200454.=E5=9B=9B=E6=95=B0?= =?UTF-8?q?=E7=9B=B8=E5=8A=A0II.md=EF=BC=8C=E8=A7=84=E8=8C=83=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\346\225\260\347\233\270\345\212\240II.md" | 23 +++++++++---------- 1 file changed, 11 insertions(+), 12 deletions(-) diff --git "a/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" "b/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" index 3baeade533..a0bf84da83 100644 --- "a/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" +++ "b/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" @@ -418,20 +418,19 @@ public int FourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) { // 哈希表大小 const int HASH_SIZE = 101; -typedef struct node -{ +typedef struct node { int val; int count; struct node *next; -}node, *HashMap; +} node, *HashMap; // 哈希表插入 -void hash_insert(HashMap hashmap[], int val){ +void hash_insert(HashMap hashmap[], int val) { int idx = val < 0 ? (-val) % HASH_SIZE : val % HASH_SIZE, count = 0; node *p = hashmap[idx]; while (p->next != NULL) { p = p->next; - if (p->val == val){ + if (p->val == val) { (p->count)++; return; } @@ -445,10 +444,10 @@ void hash_insert(HashMap hashmap[], int val){ } // 哈希表查找 -int hash_search(HashMap hashmap[], int val){ +int hash_search(HashMap hashmap[], int val) { int idx = val < 0 ? (-val) % HASH_SIZE : val % HASH_SIZE; node *p = hashmap[idx]; - while (p->next != NULL){ + while (p->next != NULL) { p = p->next; if (p->val == val) return p->count; } @@ -458,23 +457,23 @@ int hash_search(HashMap hashmap[], int val){ int fourSumCount(int* nums1, int nums1Size, int* nums2, int nums2Size, int* nums3, int nums3Size, int* nums4, int nums4Size){ // 初始化哈希表 HashMap hashmap[HASH_SIZE]; - for (int i = 0; i < HASH_SIZE; i++){ + for (int i = 0; i < HASH_SIZE; i++) { hashmap[i] = malloc(sizeof(node)); hashmap[i]->next = NULL; } // 统计两个数组元素之和的负值和出现的次数,放到哈希表中 int count = 0, num; - for (int i=0; i Date: Mon, 29 Jan 2024 22:18:50 +0800 Subject: [PATCH 2470/3019] =?UTF-8?q?Update=200383.=E8=B5=8E=E9=87=91?= =?UTF-8?q?=E4=BF=A1.md=EF=BC=8C=E6=B7=BB=E5=8A=A0c=E8=AF=AD=E8=A8=80?= =?UTF-8?q?=E7=89=88=E6=9C=AC=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...3.\350\265\216\351\207\221\344\277\241.md" | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git "a/problems/0383.\350\265\216\351\207\221\344\277\241.md" "b/problems/0383.\350\265\216\351\207\221\344\277\241.md" index b800c2320d..1dbf5de009 100644 --- "a/problems/0383.\350\265\216\351\207\221\344\277\241.md" +++ "b/problems/0383.\350\265\216\351\207\221\344\277\241.md" @@ -445,6 +445,25 @@ public bool CanConstruct(string ransomNote, string magazine) { return true; } +``` + +### C: + +```c +bool canConstruct(char* ransomNote, char* magazine) { + // 定义哈希映射数组 + int hashmap[26] = {0}; + // 对magazine中字符计数 + while (*magazine != '\0') hashmap[*magazine++ % 26]++; + // 遍历ransomNote,对应的字符自减,小于0说明该字符magazine没有或不足够表示 + while (*ransomNote != '\0') hashmap[*ransomNote++ % 26]--; + // 如果数组中存在负数,说明ransomNote不能由magazine里面的字符构成 + for (int i = 0; i < 26; i++) { + if (hashmap[i] < 0) return false; + } + return true; +} + ```

From 586b8efd38f2ee919c38b207d7fcb0a442def32c Mon Sep 17 00:00:00 2001 From: Heeqw <124508798+Heeqw@users.noreply.github.com> Date: Mon, 29 Jan 2024 23:39:32 +0800 Subject: [PATCH 2471/3019] =?UTF-8?q?Update=200001.=E4=B8=A4=E6=95=B0?= =?UTF-8?q?=E4=B9=8B=E5=92=8C.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 增加java语言版本的双指针法 --- ...44\346\225\260\344\271\213\345\222\214.md" | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git "a/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" "b/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" index 1785fe5ff1..80218cb535 100644 --- "a/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" @@ -133,6 +133,7 @@ public: ### Java: ```java +//使用哈希表 public int[] twoSum(int[] nums, int target) { int[] res = new int[2]; if(nums == null || nums.length == 0){ @@ -151,6 +152,43 @@ public int[] twoSum(int[] nums, int target) { return res; } ``` +```java +//使用双指针 +public int[] twoSum(int[] nums, int target) { + int m=0,n=0,k,board=0; + int[] res=new int[2]; + int[] tmp1=new int[nums.length]; + //备份原本下标的nums数组 + System.arraycopy(nums,0,tmp1,0,nums.length); + //将nums排序 + Arrays.sort(nums); + //双指针 + for(int i=0,j=nums.length-1;itarget) + j--; + else if(nums[i]+nums[j]==target){ + m=i; + n=j; + break; + } + } + //找到nums[m]在tmp1数组中的下标 + for(k=0;k Date: Mon, 29 Jan 2024 13:42:49 -0800 Subject: [PATCH 2472/3019] fix: Correct function type --- ...\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" "b/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" index b691a45a0b..2a11f9f4b7 100644 --- "a/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" +++ "b/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" @@ -298,7 +298,7 @@ class Solution: return self.traversal(root, p, q) ``` -迭代法(版本二)精简 +递归法(版本二)精简 ```python class Solution: def lowestCommonAncestor(self, root, p, q): From 1bd8143bb241fbe0b1ce998e740902da5bfe839e Mon Sep 17 00:00:00 2001 From: Heeqw <124508798+Heeqw@users.noreply.github.com> Date: Tue, 30 Jan 2024 16:27:08 +0800 Subject: [PATCH 2473/3019] =?UTF-8?q?Update=200015.=E4=B8=89=E6=95=B0?= =?UTF-8?q?=E4=B9=8B=E5=92=8C.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 增加了java语言版本的哈希解法 --- ...11\346\225\260\344\271\213\345\222\214.md" | 38 ++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git "a/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" "b/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" index 91fc9d685a..bf165788f8 100644 --- "a/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" @@ -256,7 +256,7 @@ while (right > left) { ## 其他语言版本 ### Java: - +(版本一) 双指针 ```Java class Solution { public List> threeSum(int[] nums) { @@ -297,7 +297,43 @@ class Solution { } } ``` +(版本二) 使用哈希集合 +```Java +class Solution { + public List> threeSum(int[] nums) { + List> result = new ArrayList<>(); + Arrays.sort(nums); + for (int i = 0; i < nums.length; i++) { + // 如果第一个元素大于零,不可能凑成三元组 + if (nums[i] > 0) { + return result; + } + // 三元组元素a去重 + if (i > 0 && nums[i] == nums[i - 1]) { + continue; + } + + HashSet set = new HashSet<>(); + for (int j = i + 1; j < nums.length; j++) { + // 三元组元素b去重 + if (j > i + 2 && nums[j] == nums[j - 1] && nums[j - 1] == nums[j - 2]) { + continue; + } + + int c = -nums[i] - nums[j]; + if (set.contains(c)) { + result.add(Arrays.asList(nums[i], nums[j], c)); + set.remove(c); // 三元组元素c去重 + } else { + set.add(nums[j]); + } + } + } + return result; + } +} +``` ### Python: (版本一) 双指针 From 51481e11f50bb4596c15cc719313d43686a0987d Mon Sep 17 00:00:00 2001 From: sss1h <49825610+sss1h@users.noreply.github.com> Date: Fri, 2 Feb 2024 11:06:31 +0800 Subject: [PATCH 2474/3019] =?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 这里与“补充”部分重复了,建议删掉 --- "problems/0090.\345\255\220\351\233\206II.md" | 7 ------- 1 file changed, 7 deletions(-) diff --git "a/problems/0090.\345\255\220\351\233\206II.md" "b/problems/0090.\345\255\220\351\233\206II.md" index 1bb63a34d6..6d618978a8 100644 --- "a/problems/0090.\345\255\220\351\233\206II.md" +++ "b/problems/0090.\345\255\220\351\233\206II.md" @@ -158,13 +158,6 @@ public: 其实这道题目的知识点,我们之前都讲过了,如果之前讲过的子集问题和去重问题都掌握的好,这道题目应该分分钟AC。 -当然本题去重的逻辑,也可以这么写 - -```cpp -if (i > startIndex && nums[i] == nums[i - 1] ) { - continue; -} -``` ## 其他语言版本 From e9a0259345d77c9b9d9e27132040da858d238f44 Mon Sep 17 00:00:00 2001 From: BanTanger <1290288968@qq.com> Date: Mon, 5 Feb 2024 12:28:07 +0800 Subject: [PATCH 2475/3019] =?UTF-8?q?=E7=AE=80=E5=8C=96=E5=88=86=E6=94=AF?= =?UTF-8?q?=E9=80=BB=E8=BE=91=EF=BC=8C=E5=A6=82=E6=9E=9C=E7=94=A8=E4=BA=86?= =?UTF-8?q?=20return=20=E5=B0=B1=E4=B8=8D=E7=94=A8=20if=20else=20=E6=8E=A7?= =?UTF-8?q?=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...47\344\272\214\345\217\211\346\240\221.md" | 37 ++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git "a/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" "b/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" index 305f3ae555..9743ca2b80 100644 --- "a/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" @@ -369,8 +369,44 @@ class Solution { } ``` +简化分支版本: + +```java +class Solution { + static int ans; + public int minCameraCover(TreeNode root) { + ans = 0; // 初始化 + if(f(root) == 0) ans ++; + return ans; + } + // 定义 f 函数有三种返回值情况 + // 0:表示 x 节点没有被相机监控,只能依靠父节点放相机 + // 1:表示 x 节点被相机监控,但相机不是放在自身节点上 + // 2:表示 x 节点被相机监控,但相机放在自身节点上 + public static int f(TreeNode x) { + if(x == null) return 1; // 空树认为被监控,但没有相机 + // 左右递归到最深处 + int l = f(x.left); + int r = f(x.right); + // 有任意一个子节点为空,就需要当前节点放相机,不然以后没机会 + if(l == 0 || r == 0) { + ans ++; // 放相机 + return 2; + } + // 贪心策略,左右子树都被监控,且没有监控到当前节点, + // 那么最有利的情况就是将相机放置在当前节点父节点上, + // 因为这样能多监控可能的子树节点和父父节点 + if(l == 1 && r == 1) return 0; + // 剩下情况就是左右子树有可能为 2,即当前节点被监控 + return 1; + } +} +``` + + ### Python + 贪心(版本一) ```python class Solution: @@ -757,4 +793,3 @@ public class Solution - From f618d35d8e39830d643177eda182944741427a6f Mon Sep 17 00:00:00 2001 From: Daixing Zhou <43519171+zhoudaixing@users.noreply.github.com> Date: Mon, 5 Feb 2024 15:59:20 +0800 Subject: [PATCH 2476/3019] =?UTF-8?q?=E5=A2=9E=E5=8A=A00347=E5=89=8DK?= =?UTF-8?q?=E4=B8=AA=E9=AB=98=E9=A2=91=E5=85=83=E7=B4=A0=E7=9A=84JavaScrip?= =?UTF-8?q?t=E4=BD=BF=E7=94=A8=E4=BC=98=E5=85=88=E9=98=9F=E5=88=97?= =?UTF-8?q?=E5=BA=93=E7=9A=84=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...30\351\242\221\345\205\203\347\264\240.md" | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git "a/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" "b/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" index 94b29eba3e..93d605f5fe 100644 --- "a/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" +++ "b/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" @@ -324,6 +324,34 @@ func topKFrequent(nums []int, k int) []int { ### JavaScript: +解法一: +Leetcode 提供了优先队列的库,具体文档可以参见 [@datastructures-js/priority-queue](https://github.com/datastructures-js/priority-queue/blob/v5/README.md)。 + +```js +var topKFrequent = function (nums, k) { + const map = new Map(); + const res = []; + //使用 map 统计元素出现频率 + for (const num of nums) { + map.set(num, (map.get(num) || 0) + 1); + } + //创建小顶堆 + const heap = new PriorityQueue({ + compare: (a, b) => a.value - b.value + }) + for (const [key, value] of map) { + heap.enqueue({ key, value }); + if (heap.size() > k) heap.dequeue(); + } + //处理输出 + while (heap.size()) res.push(heap.dequeue().key); + return res; +}; +``` + +解法二: +手写实现优先队列 + ```js // js 没有堆 需要自己构造 class Heap { From 3d90f1ed267ebc68f523c8221677115f74aa8912 Mon Sep 17 00:00:00 2001 From: sss1h <49825610+sss1h@users.noreply.github.com> Date: Mon, 5 Feb 2024 16:31:15 +0800 Subject: [PATCH 2477/3019] =?UTF-8?q?Update=2020201126=E8=B4=AA=E5=BF=83?= =?UTF-8?q?=E5=91=A8=E6=9C=AB=E6=80=BB=E7=BB=93.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 代码没有高亮显示 --- ...\277\203\345\221\250\346\234\253\346\200\273\347\273\223.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20201126\350\264\252\345\277\203\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20201126\350\264\252\345\277\203\345\221\250\346\234\253\346\200\273\347\273\223.md" index cdfe4a96d2..3494a32074 100644 --- "a/problems/\345\221\250\346\200\273\347\273\223/20201126\350\264\252\345\277\203\345\221\250\346\234\253\346\200\273\347\273\223.md" +++ "b/problems/\345\221\250\346\200\273\347\273\223/20201126\350\264\252\345\277\203\345\221\250\346\234\253\346\200\273\347\273\223.md" @@ -69,7 +69,7 @@ 代码很简单,但是思路却比较难。还需要反复琢磨。 针对[贪心算法:最大子序和](https://programmercarl.com/0053.最大子序和.html)文章中给出的贪心代码如下; -``` +```cpp class Solution { public: int maxSubArray(vector& nums) { From c2cf9f854182541e915a94619fc8cba0b48445d1 Mon Sep 17 00:00:00 2001 From: Ryanhuang88 <145511591+Ryanhuang88@users.noreply.github.com> Date: Tue, 13 Feb 2024 22:02:49 -0500 Subject: [PATCH 2478/3019] Update join.md --- problems/qita/join.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/problems/qita/join.md b/problems/qita/join.md index a2698e66cf..62dec674d5 100644 --- a/problems/qita/join.md +++ b/problems/qita/join.md @@ -111,7 +111,7 @@ python代码 有的录友是一个pull request 里有很多commit (一个commit是一道题目的代码)。 -有的录友是一个pull request 里有有一个commit。 +有的录友是一个pull request 里只有一个commit。

From 64edc63251e8862fc98cfe9635f360cccada4ceb Mon Sep 17 00:00:00 2001 From: Ryanhuang88 <145511591+Ryanhuang88@users.noreply.github.com> Date: Tue, 13 Feb 2024 22:07:05 -0500 Subject: [PATCH 2479/3019] =?UTF-8?q?Update=200685.=E5=86=97=E4=BD=99?= =?UTF-8?q?=E8=BF=9E=E6=8E=A5II.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0685.\345\206\227\344\275\231\350\277\236\346\216\245II.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0685.\345\206\227\344\275\231\350\277\236\346\216\245II.md" "b/problems/0685.\345\206\227\344\275\231\350\277\236\346\216\245II.md" index 31b2ad247e..0cad5ad581 100644 --- "a/problems/0685.\345\206\227\344\275\231\350\277\236\346\216\245II.md" +++ "b/problems/0685.\345\206\227\344\275\231\350\277\236\346\216\245II.md" @@ -81,7 +81,7 @@ for (int i = 0; i < n; i++) { } ``` -前两种入度为2的情况,一定是删除指向入度为2的节点的两条边其中的一条,如果删了一条,判断这个图是一个树,那么这条边就是答案,同时注意要从后向前遍历,因为如果两天边删哪一条都可以成为树,就删最后那一条。 +前两种入度为2的情况,一定是删除指向入度为2的节点的两条边其中的一条,如果删了一条,判断这个图是一个树,那么这条边就是答案,同时注意要从后向前遍历,因为如果两条边删哪一条都可以成为树,就删最后那一条。 代码如下: From e8e2f249632170cbd25ef874e9875c84784d1440 Mon Sep 17 00:00:00 2001 From: anini <1660470561@qq.com> Date: Sat, 17 Feb 2024 12:42:10 +0800 Subject: [PATCH 2480/3019] =?UTF-8?q?Update=201002.=E6=9F=A5=E6=89=BE?= =?UTF-8?q?=E5=B8=B8=E7=94=A8=E5=AD=97=E7=AC=A6.md=20=E6=9B=B4=E6=96=B0Go?= =?UTF-8?q?=E7=89=88=E6=9C=AC-=E6=9B=B4=E6=96=B0=E4=B8=BA=E4=B8=8EC++?= =?UTF-8?q?=E7=9B=B8=E5=90=8C=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/.gitignore | 8 +++ ...70\347\224\250\345\255\227\347\254\246.md" | 68 +++++++++++-------- 2 files changed, 46 insertions(+), 30 deletions(-) create mode 100644 .idea/.gitignore diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000000..13566b81b0 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git "a/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md" "b/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md" index 57fa7dae1f..8d81e3f8a0 100644 --- "a/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md" +++ "b/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md" @@ -327,37 +327,45 @@ var commonChars = function(words) { ### GO ```golang -func commonChars(words []string) []string { - length:=len(words) - fre:=make([][]int,0)//统计每个字符串的词频 - res:=make([]string,0) - //统计词频 - for i:=0;i 0 { + s := string('a' + i) // rune -> string + result = append(result, s) + hash[i]-- + } + } + + return result } -func min(a,b int)int{ - if a>b{ - return b - } - return a + +func min(a, b int) int { + if a < b { + return a + } + return b } ``` From df8878b79192527f3d8617e09c93227340d03c10 Mon Sep 17 00:00:00 2001 From: gdstzmy <79707886+gdstzmy@users.noreply.github.com> Date: Tue, 20 Feb 2024 18:09:07 +0800 Subject: [PATCH 2481/3019] =?UTF-8?q?Update=200053.=E6=9C=80=E5=A4=A7?= =?UTF-8?q?=E5=AD=90=E5=BA=8F=E5=92=8C.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加go语言贪心法 --- ...247\345\255\220\345\272\217\345\222\214.md" | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git "a/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" "b/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" index 78c8b38222..74ff2ca40d 100644 --- "a/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" +++ "b/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" @@ -230,7 +230,25 @@ class Solution: ``` ### Go +贪心法 +```go +func maxSubArray(nums []int) int { + max := nums[0] + count := 0 + for i := 0; i < len(nums); i++{ + count += nums[i] + if count > max{ + max = count + } + if count < 0 { + count = 0 + } + } + return max +} +``` +动态规划 ```go func maxSubArray(nums []int) int { maxSum := nums[0] From 13edf8d8aa64be5d4e34d64186098c734ba71035 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E5=91=98Carl?= Date: Thu, 22 Feb 2024 14:40:15 +0800 Subject: [PATCH 2482/3019] Delete .idea/.gitignore --- .idea/.gitignore | 8 -------- 1 file changed, 8 deletions(-) delete mode 100644 .idea/.gitignore diff --git a/.idea/.gitignore b/.idea/.gitignore deleted file mode 100644 index 13566b81b0..0000000000 --- a/.idea/.gitignore +++ /dev/null @@ -1,8 +0,0 @@ -# Default ignored files -/shelf/ -/workspace.xml -# Editor-based HTTP Client requests -/httpRequests/ -# Datasource local storage ignored files -/dataSources/ -/dataSources.local.xml From 2c160f31c511429053e33f9c8216e49d90b98360 Mon Sep 17 00:00:00 2001 From: zhaohanyan Date: Thu, 22 Feb 2024 12:05:47 -0500 Subject: [PATCH 2483/3019] =?UTF-8?q?Update=20kama55.=E5=8F=B3=E6=97=8B?= =?UTF-8?q?=E5=AD=97=E7=AC=A6=E4=B8=B2.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加python解法,已在kama上测试通过 --- ...346\227\213\345\255\227\347\254\246\344\270\262.md" | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git "a/problems/kama55.\345\217\263\346\227\213\345\255\227\347\254\246\344\270\262.md" "b/problems/kama55.\345\217\263\346\227\213\345\255\227\347\254\246\344\270\262.md" index 17c97eaa3c..38e37322ee 100644 --- "a/problems/kama55.\345\217\263\346\227\213\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/kama55.\345\217\263\346\227\213\345\255\227\347\254\246\344\270\262.md" @@ -211,7 +211,17 @@ public class Main { ``` ### Python: +```Python +#注意:python中字符串是不可变的,所以使用python一定要创建新的字符串 +#获取输入的数字k和字符串 +k = int(input()) +s = input() + +#通过切片反转第一段和第二段字符串 +s = s[len(s)-k:] + s[:len(s)-k] +print(s) +``` ### Go: ```go From c4ad2ec22e01bc0cdfde6dbbea91748e20bbdf16 Mon Sep 17 00:00:00 2001 From: zhaohanyan Date: Thu, 22 Feb 2024 12:10:18 -0500 Subject: [PATCH 2484/3019] =?UTF-8?q?Update=20kama55.=E5=8F=B3=E6=97=8B?= =?UTF-8?q?=E5=AD=97=E7=AC=A6=E4=B8=B2.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 注解更清晰 --- ...217\263\346\227\213\345\255\227\347\254\246\344\270\262.md" | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git "a/problems/kama55.\345\217\263\346\227\213\345\255\227\347\254\246\344\270\262.md" "b/problems/kama55.\345\217\263\346\227\213\345\255\227\347\254\246\344\270\262.md" index 38e37322ee..7137186042 100644 --- "a/problems/kama55.\345\217\263\346\227\213\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/kama55.\345\217\263\346\227\213\345\255\227\347\254\246\344\270\262.md" @@ -212,13 +212,12 @@ public class Main { ### Python: ```Python -#注意:python中字符串是不可变的,所以使用python一定要创建新的字符串 - #获取输入的数字k和字符串 k = int(input()) s = input() #通过切片反转第一段和第二段字符串 +#注意:python中字符串是不可变的,所以也需要额外空间 s = s[len(s)-k:] + s[:len(s)-k] print(s) ``` From a45fd00a27d03000eb3b327d94abd007ee0ae305 Mon Sep 17 00:00:00 2001 From: lhp <932606153@qq.com> Date: Fri, 23 Feb 2024 10:54:04 +0800 Subject: [PATCH 2485/3019] =?UTF-8?q?0827:=E6=9C=80=E5=A4=A7=E4=BA=BA?= =?UTF-8?q?=E5=B7=A5=E5=B2=9B----=E6=B7=BB=E5=8A=A0js=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...47\344\272\272\345\267\245\345\262\233.md" | 65 +++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git "a/problems/0827.\346\234\200\345\244\247\344\272\272\345\267\245\345\262\233.md" "b/problems/0827.\346\234\200\345\244\247\344\272\272\345\267\245\345\262\233.md" index 4feb78ded7..3f32dd7aa1 100644 --- "a/problems/0827.\346\234\200\345\244\247\344\272\272\345\267\245\345\262\233.md" +++ "b/problems/0827.\346\234\200\345\244\247\344\272\272\345\267\245\345\262\233.md" @@ -348,6 +348,71 @@ class Solution: ``` +### JavaScript + +```JavaScript + +var largestIsland = function(grid) { +let res = 0; +const m = grid.length; +const n = grid[0].length; +const tag = new Array(n).fill().map(_ => new Array(m).fill(0)); +const area = new Map(); +const dir = [[0,1],[0,-1],[1,0],[-1,0]]; +const dfs = (grid,tag,x,y,mark) => { + let res = 1; + tag[x][y] = mark; + for(let i = 0; i < dir.length; i++) { + let nextX = x + dir[i][0]; + let nextY = y + dir[i][1]; + if(nextX < 0 || nextX >= m || nextY < 0 || nextY >= n) { + continue; + } + if(grid[nextX][nextY] === 1 && tag[nextX][nextY] === 0) { + res += dfs(grid,tag,nextX,nextY,mark); + } + } + return res; +} +let mark = 2; +//将岛屿用mark标记 +for(let i = 0; i < m; i++) { + for(let j = 0; j < n; j++) { + if(grid[i][j] === 1 && tag[i][j] === 0) { + area.set(mark,dfs(grid,tag,i,j,mark)); + res = Math.max(res,area.get(mark)); + mark++; + } + } +} +//将一个非岛屿格子变为岛屿 +for(let i = 0; i < m; i++) { + for(let j = 0; j < n; j++) { + if(grid[i][j] === 0) { + let z = 1; + const connected = new Set(); + for(let k = 0; k < dir.length; k++) { + let nextX = i + dir[k][0]; + let nextY = j + dir[k][1]; + if(nextX < 0 || nextX >= m || nextY < 0 || nextY >= n || tag[nextX][nextY] === 0 || connected.has(tag[nextX][nextY])) { + continue; + } + z += area.get(tag[nextX][nextY]); + connected.add(tag[nextX][nextY]); + } + res = Math.max(res,z); + } + } +} +return res; +}; + + +``` + + + +

From ea13bb2d2ef23790fa775386537692650b3cbc6c Mon Sep 17 00:00:00 2001 From: "435962415@qq.com" Date: Fri, 23 Feb 2024 12:00:50 +0800 Subject: [PATCH 2486/3019] =?UTF-8?q?=C2=96827.=E6=9C=80=E5=A4=A7=E4=BA=BA?= =?UTF-8?q?=E5=B7=A5=E5=B2=9B=20=E6=B7=BB=E5=8A=A0go=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...47\344\272\272\345\267\245\345\262\233.md" | 91 +++++++++++++++++++ 1 file changed, 91 insertions(+) diff --git "a/problems/0827.\346\234\200\345\244\247\344\272\272\345\267\245\345\262\233.md" "b/problems/0827.\346\234\200\345\244\247\344\272\272\345\267\245\345\262\233.md" index 4feb78ded7..cac67676b9 100644 --- "a/problems/0827.\346\234\200\345\244\247\344\272\272\345\267\245\345\262\233.md" +++ "b/problems/0827.\346\234\200\345\244\247\344\272\272\345\267\245\345\262\233.md" @@ -346,6 +346,97 @@ class Solution: return res +``` + +### Go + +```go +func largestIsland(grid [][]int) int { + dir := [][]int{{0, 1}, {1, 0}, {-1, 0}, {0, -1}} + n := len(grid) + m := len(grid[0]) + area := 0 + visited := make([][]bool, n) + for i := 0; i < n; i++ { + visited[i] = make([]bool, m) + } + gridNum := make(map[int]int, 0) // 记录每一个岛屿的面积 + mark := 2 // 记录每个岛屿的编号 + isAllGrid := true + res := 0 // 标记是否整个地图都是陆地 + + var dfs func(grid [][]int, visited [][]bool, x, y, mark int) + dfs = func(grid [][]int, visited [][]bool, x, y, mark int) { + // 终止条件:访问过的节点 或者 遇到海水 + if visited[x][y] || grid[x][y] == 0 { + return + } + visited[x][y] = true // 标记访问过 + grid[x][y] = mark // 给陆地标记新标签 + area++ + for i := 0; i < 4; i++ { + nextX := x + dir[i][0] + nextY := y + dir[i][1] + if nextX < 0 || nextX >= len(grid) || nextY < 0 || nextY >= len(grid[0]) { + continue + } + dfs(grid, visited, nextX, nextY, mark) + } + } + + for i := 0; i < n; i++ { + for j := 0; j < m; j++ { + if grid[i][j] == 0 { + isAllGrid = false + } + if !visited[i][j] && grid[i][j] == 1 { + area = 0 + dfs(grid, visited, i, j, mark) // 将与其链接的陆地都标记上 true + gridNum[mark] = area // 记录每一个岛屿的面积 + mark++ // 更新下一个岛屿编号 + } + } + } + if isAllGrid { + return n * m + } + // 根据添加陆地的位置,计算周边岛屿面积之和 + visitedGrid := make(map[int]struct{}) // 标记访问过的岛屿 + for i := 0; i < n; i++ { + for j := 0; j < m; j++ { + count := 1 // 记录连接之后的岛屿数量 + visitedGrid = make(map[int]struct{}) // 每次使用时,清空 + if grid[i][j] == 0 { + for k := 0; k < 4; k++ { + // 计算相邻坐标 + nearI := i + dir[k][0] + nearJ := j + dir[k][1] + if nearI < 0 || nearI >= len(grid) || nearJ < 0 || nearJ >= len(grid[0]) { + continue + } + // 添加过的岛屿不要重复添加 + if _, ok := visitedGrid[grid[nearI][nearJ]]; ok { + continue + } + // 把相邻四面的岛屿数量加起来 + count += gridNum[grid[nearI][nearJ]] + // 标记该岛屿已经添加过 + visitedGrid[grid[nearI][nearJ]] = struct{}{} + } + } + res = max827(res, count) + } + } + return res +} + +func max827(x, y int) int { + if x > y { + return x + } + return y +} + ```

From b4f55e72745f4f6fbf27dd4bdb2201f1b430b9f2 Mon Sep 17 00:00:00 2001 From: zhangchang Date: Sat, 24 Feb 2024 22:46:14 +0800 Subject: [PATCH 2487/3019] =?UTF-8?q?=E4=BC=98=E5=8C=96Python=E9=80=92?= =?UTF-8?q?=E5=BD=92=E6=97=B6=E6=89=80=E9=9C=80=E8=A6=81=E7=9A=84=E5=86=85?= =?UTF-8?q?=E5=AD=98=E5=BC=80=E9=94=80=E5=92=8C=E6=97=B6=E9=97=B4=E6=B6=88?= =?UTF-8?q?=E8=80=97=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...22\345\275\222\351\201\215\345\216\206.md" | 54 +++++++++++-------- 1 file changed, 33 insertions(+), 21 deletions(-) diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" index edd55aad3c..4621d4a739 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" @@ -180,26 +180,34 @@ class Solution { class Solution: def preorderTraversal(self, root: TreeNode) -> List[int]: - if not root: - return [] - - left = self.preorderTraversal(root.left) - right = self.preorderTraversal(root.right) - - return [root.val] + left + right + res = [] + + def dfs(node): + if node is None: + return + + res.append(node.val) + dfs(node.left) + dfs(node.right) + + return res ``` ```python # 中序遍历-递归-LC94_二叉树的中序遍历 class Solution: def inorderTraversal(self, root: TreeNode) -> List[int]: - if root is None: - return [] - - left = self.inorderTraversal(root.left) - right = self.inorderTraversal(root.right) - - return left + [root.val] + right + res = [] + + def dfs(node): + if node is None: + return + + dfs(node.left) + res.append(node.val) + dfs(node.right) + + return res ``` ```python @@ -207,13 +215,17 @@ class Solution: # 后序遍历-递归-LC145_二叉树的后序遍历 class Solution: def postorderTraversal(self, root: TreeNode) -> List[int]: - if not root: - return [] - - left = self.postorderTraversal(root.left) - right = self.postorderTraversal(root.right) - - return left + right + [root.val] + res = [] + + def dfs(node): + if node is None: + return + + dfs(node.left) + dfs(node.right) + res.append(node.val) + + return res ``` ### Go: From f5fc6baddca9af176b77648229ae26fd4bae137e Mon Sep 17 00:00:00 2001 From: meifannao Date: Sun, 25 Feb 2024 22:12:35 +0800 Subject: [PATCH 2488/3019] =?UTF-8?q?0647.=E5=9B=9E=E6=96=87=E5=AD=90?= =?UTF-8?q?=E4=B8=B2=E6=B7=BB=E5=8A=A0Golang=E7=9A=84=E5=8F=8C=E6=8C=87?= =?UTF-8?q?=E9=92=88=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...36\346\226\207\345\255\220\344\270\262.md" | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git "a/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" "b/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" index d94d18c5c0..4887ff8311 100644 --- "a/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" +++ "b/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" @@ -397,6 +397,7 @@ class Solution: ``` ### Go: +> 动态规划: ```Go func countSubstrings(s string) int { @@ -422,6 +423,47 @@ func countSubstrings(s string) int { return res } ``` +> 动态规划:简洁版 +```Go +func countSubstrings(s string) int { + res := 0 + dp := make([][]bool, len(s)) + for i := 0; i < len(s); i++ { + dp[i] = make([]bool, len(s)) + } + + for i := len(s) - 1; i >= 0; i-- { + for j := i; j < len(s); j++ { + if s[i] == s[j] && (j-i <= 1 || dp[i+1][j-1]) { + res++ + dp[i][j] = true + } + } + } + return res +} +``` + +> 双指针法: +```Go +func countSubstrings(s string) int { + extend := func(i, j int) int { + res := 0 + for i >= 0 && j < len(s) && s[i] == s[j] { + i -- + j ++ + res ++ + } + return res + } + res := 0 + for i := 0; i < len(s); i++ { + res += extend(i, i) // 以i为中心 + res += extend(i, i+1) // 以i和i+1为中心 + } + return res +} +``` ### Javascript: From 9c5b5676ee221d11280f66b1456ae82822154871 Mon Sep 17 00:00:00 2001 From: Han <90488412+HanCai98@users.noreply.github.com> Date: Sun, 25 Feb 2024 22:48:39 -0500 Subject: [PATCH 2489/3019] =?UTF-8?q?correct=20typo=20in=200200.=E5=B2=9B?= =?UTF-8?q?=E5=B1=BF=E6=95=B0=E9=87=8F.=E6=B7=B1=E6=90=9C=E7=89=88.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...225\260\351\207\217.\346\267\261\346\220\234\347\211\210.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\346\267\261\346\220\234\347\211\210.md" "b/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\346\267\261\346\220\234\347\211\210.md" index 18442943ad..83d295bd5b 100644 --- "a/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\346\267\261\346\220\234\347\211\210.md" +++ "b/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\346\267\261\346\220\234\347\211\210.md" @@ -37,7 +37,7 @@ 在遇到标记过的陆地节点和海洋节点的时候直接跳过。 这样计数器就是最终岛屿的数量。 -那么如果把节点陆地所能遍历到的陆地都标记上呢,就可以使用 DFS,BFS或者并查集。 +那么如何把节点陆地所能遍历到的陆地都标记上呢,就可以使用 DFS,BFS或者并查集。 ### 深度优先搜索 From bf863d2d8c0e5316ba1d41e1a22f76f883ff8bc1 Mon Sep 17 00:00:00 2001 From: heroding77 <2441145504@qq.com> Date: Mon, 26 Feb 2024 16:04:47 +0800 Subject: [PATCH 2490/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A00027=E7=A7=BB?= =?UTF-8?q?=E9=99=A4=E5=85=83=E7=B4=A0=20python3=20=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...73\351\231\244\345\205\203\347\264\240.md" | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git "a/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" "b/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" index dbde3d198c..2a2005d736 100644 --- "a/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" +++ "b/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" @@ -253,6 +253,27 @@ class Solution: ``` +``` python 3 +# 相向双指针法 +# 时间复杂度 O(n) +# 空间复杂度 O(1) +class Solution: + def removeElement(self, nums: List[int], val: int) -> int: + n = len(nums) + left, right = 0, n - 1 + while left <= right: + while left <= right and nums[left] != val: + left += 1 + while left <= right and nums[right] == val: + right -= 1 + if left < right: + nums[left] = nums[right] + left += 1 + right -= 1 + return left + +``` + ### Go: ```go From 415b031025b725cf7ccd109b16716920afb7ccc6 Mon Sep 17 00:00:00 2001 From: a12bb <2713204748@qq.com> Date: Mon, 26 Feb 2024 20:47:23 +0800 Subject: [PATCH 2491/3019] =?UTF-8?q?Update=200045.=E8=B7=B3=E8=B7=83?= =?UTF-8?q?=E6=B8=B8=E6=88=8FII.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 0045.跳跃游戏||新增C语言实现 --- ...\350\267\203\346\270\270\346\210\217II.md" | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git "a/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" "b/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" index d290f55e80..c6433ea86c 100644 --- "a/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" +++ "b/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" @@ -492,7 +492,34 @@ impl Solution { } } ``` +### C + +```c +#define max(a, b) ((a) > (b) ? (a) : (b)) + +int jump(int* nums, int numsSize) { + if(numsSize == 1){ + return 0; + } + int count = 0; + // 记录当前能走的最远距离 + int curDistance = 0; + // 记录下一步能走的最远距离 + int nextDistance = 0; + for(int i = 0; i < numsSize; i++){ + nextDistance = max(i + nums[i], nextDistance); + // 下标到了当前的最大距离 + if(i == nextDistance){ + count++; + curDistance = nextDistance; + } + } + return count; +} +``` + ### C# + ```csharp // 版本二 public class Solution @@ -518,3 +545,4 @@ public class Solution + From 3fc2fb99545d84f7965bec15e14ac7ae98754c94 Mon Sep 17 00:00:00 2001 From: sss1h <49825610+sss1h@users.noreply.github.com> Date: Tue, 27 Feb 2024 15:03:50 +0800 Subject: [PATCH 2492/3019] =?UTF-8?q?Update=20=E5=9B=BE=E8=AE=BA=E5=B9=B6?= =?UTF-8?q?=E6=9F=A5=E9=9B=86=E7=90=86=E8=AE=BA=E5=9F=BA=E7=A1=80.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修正错别字和语病 --- ...06\347\220\206\350\256\272\345\237\272\347\241\200.md" | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git "a/problems/\345\233\276\350\256\272\345\271\266\346\237\245\351\233\206\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\345\233\276\350\256\272\345\271\266\346\237\245\351\233\206\347\220\206\350\256\272\345\237\272\347\241\200.md" index 347bf58f13..a65d480760 100644 --- "a/problems/\345\233\276\350\256\272\345\271\266\346\237\245\351\233\206\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\345\233\276\350\256\272\345\271\266\346\237\245\351\233\206\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -108,7 +108,7 @@ bool isSame(int u, int v) { ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20230602102619.png) -如果这棵多叉树高度很深的话,每次find函数 去寻找跟的过程就要递归很多次。 +如果这棵多叉树高度很深的话,每次find函数 去寻找根的过程就要递归很多次。 我们的目的只需要知道这些节点在同一个根下就可以,所以对这棵多叉树的构造只需要这样就可以了,如图: @@ -300,7 +300,7 @@ join(3, 2); **因为路经压缩了** -即如下代码在寻找跟的过程中,会有路径压缩,减少 下次查询的路径长度。 +即如下代码在寻找根的过程中,会有路径压缩,减少 下次查询的路径长度。 ``` // 并查集里寻根的过程 @@ -396,7 +396,7 @@ void join(int u, int v) { if (rank[u] <= rank[v]) father[u] = v; // rank小的树合入到rank大的树 else father[v] = u; - if (rank[u] == rank[v] && u != v) rank[v]++; // 如果两棵树高度相同,则v的高度+1因为,方面 if (rank[u] <= rank[v]) father[u] = v; 注意是 <= + if (rank[u] == rank[v] && u != v) rank[v]++; // 如果两棵树高度相同,则v的高度+1因为,上面 if (rank[u] <= rank[v]) father[u] = v; 注意是 <= } ``` @@ -423,7 +423,7 @@ void join(int u, int v) { 空间复杂度: O(n) ,申请一个father数组。 -关于时间复杂度,如果想精确表达出来需要繁琐的数学证明,就不在本篇讲解范围内了,大家感兴趣可以自己去深入去研究。 +关于时间复杂度,如果想精确表达出来需要繁琐的数学证明,就不在本篇讲解范围内了,大家感兴趣可以自己去深入研究。 这里做一个简单的分析思路。 From 94e50d08b9be536ade4694b78c2310bfbd43f128 Mon Sep 17 00:00:00 2001 From: sss1h <49825610+sss1h@users.noreply.github.com> Date: Tue, 27 Feb 2024 15:36:59 +0800 Subject: [PATCH 2493/3019] =?UTF-8?q?Update=200685.=E5=86=97=E4=BD=99?= =?UTF-8?q?=E8=BF=9E=E6=8E=A5II.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加cpp代码高亮 --- ...685.\345\206\227\344\275\231\350\277\236\346\216\245II.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/problems/0685.\345\206\227\344\275\231\350\277\236\346\216\245II.md" "b/problems/0685.\345\206\227\344\275\231\350\277\236\346\216\245II.md" index 0cad5ad581..c07dda3a78 100644 --- "a/problems/0685.\345\206\227\344\275\231\350\277\236\346\216\245II.md" +++ "b/problems/0685.\345\206\227\344\275\231\350\277\236\346\216\245II.md" @@ -69,7 +69,7 @@ edges[2][0] = 2,edges[2][1] = 3, 搞清楚之后,我们如何统计入度呢? -即 edges[i][1] 表示的节点都是 箭头指向的节点,即这个几点有一个入度! (如果想统计出度,那么就是 edges[i][0])。 +即 edges[i][1] 表示的节点都是 箭头指向的节点,即这个节点有一个入度! (如果想统计出度,那么就是 edges[i][0])。 所以,统计入度的代码如下: @@ -108,7 +108,7 @@ if (vec.size() > 0) { 可以定义一个函数,代码如下: -``` +```cpp // 在有向图里找到删除的那条边,使其变成树,返回值就是要删除的边 vector getRemoveEdge(const vector>& edges) ``` From c88104b1af80e11ce78ff84147016421b905910c Mon Sep 17 00:00:00 2001 From: sss1h <49825610+sss1h@users.noreply.github.com> Date: Tue, 27 Feb 2024 20:25:03 +0800 Subject: [PATCH 2494/3019] =?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 添加代码高亮 --- ...217\211\346\220\234\347\264\242\346\240\221.md" | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git "a/problems/0669.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0669.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" index 916013c52c..6824c7e29a 100644 --- "a/problems/0669.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" +++ "b/problems/0669.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" @@ -79,7 +79,7 @@ public: 代码如下: -``` +```cpp TreeNode* trimBST(TreeNode* root, int low, int high) ``` @@ -87,7 +87,7 @@ TreeNode* trimBST(TreeNode* root, int low, int high) 修剪的操作并不是在终止条件上进行的,所以就是遇到空节点返回就可以了。 -``` +```cpp if (root == nullptr ) return nullptr; ``` @@ -97,7 +97,7 @@ if (root == nullptr ) return nullptr; 代码如下: -``` +```cpp if (root->val < low) { TreeNode* right = trimBST(root->right, low, high); // 寻找符合区间[low, high]的节点 return right; @@ -108,7 +108,7 @@ if (root->val < low) { 代码如下: -``` +```cpp if (root->val > high) { TreeNode* left = trimBST(root->left, low, high); // 寻找符合区间[low, high]的节点 return left; @@ -119,7 +119,7 @@ if (root->val > high) { 最后返回root节点,代码如下: -``` +```cpp root->left = trimBST(root->left, low, high); // root->left接入符合条件的左孩子 root->right = trimBST(root->right, low, high); // root->right接入符合条件的右孩子 return root; @@ -133,7 +133,7 @@ return root; 如下代码相当于把节点0的右孩子(节点2)返回给上一层, -``` +```cpp if (root->val < low) { TreeNode* right = trimBST(root->right, low, high); // 寻找符合区间[low, high]的节点 return right; @@ -142,7 +142,7 @@ if (root->val < low) { 然后如下代码相当于用节点3的左孩子 把下一层返回的 节点0的右孩子(节点2) 接住。 -``` +``` cpp root->left = trimBST(root->left, low, high); ``` From a518db03dd3265f53d98d2277f5da12323363958 Mon Sep 17 00:00:00 2001 From: sss1h <49825610+sss1h@users.noreply.github.com> Date: Tue, 27 Feb 2024 20:26:06 +0800 Subject: [PATCH 2495/3019] =?UTF-8?q?Update=200450.=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=90=9C=E7=B4=A2=E6=A0=91=E4=B8=AD=E7=9A=84?= =?UTF-8?q?=E8=8A=82=E7=82=B9.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加代码高亮 --- ...\221\344\270\255\347\232\204\350\212\202\347\202\271.md" | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git "a/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" "b/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" index 8922a14e14..60dae7b977 100644 --- "a/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" +++ "b/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" @@ -42,7 +42,7 @@ 代码如下: -``` +```cpp TreeNode* deleteNode(TreeNode* root, int key) ``` @@ -50,7 +50,7 @@ TreeNode* deleteNode(TreeNode* root, int key) 遇到空返回,其实这也说明没找到删除的节点,遍历到空节点直接返回了 -``` +```cpp if (root == nullptr) return root; ``` @@ -106,7 +106,7 @@ if (root->val == key) { 这里相当于把新的节点返回给上一层,上一层就要用 root->left 或者 root->right接住,代码如下: -``` +```cpp if (root->val > key) root->left = deleteNode(root->left, key); if (root->val < key) root->right = deleteNode(root->right, key); return root; From 6fdcc59aec48b8c3bb02dcc90b6709fd2ae566d2 Mon Sep 17 00:00:00 2001 From: sss1h <49825610+sss1h@users.noreply.github.com> Date: Tue, 27 Feb 2024 20:26:57 +0800 Subject: [PATCH 2496/3019] =?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 添加代码高亮 --- ...04\346\217\222\345\205\245\346\223\215\344\275\234.md" | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git "a/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" "b/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" index 98e60d5f5f..5cb0de9911 100644 --- "a/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" +++ "b/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" @@ -59,7 +59,7 @@ 代码如下: -``` +```cpp TreeNode* insertIntoBST(TreeNode* root, int val) ``` @@ -69,7 +69,7 @@ TreeNode* insertIntoBST(TreeNode* root, int val) 代码如下: -``` +```cpp if (root == NULL) { TreeNode* node = new TreeNode(val); return node; @@ -88,7 +88,7 @@ if (root == NULL) { 代码如下: -``` +```cpp if (root->val > val) root->left = insertIntoBST(root->left, val); if (root->val < val) root->right = insertIntoBST(root->right, val); return root; @@ -120,7 +120,7 @@ public: 那么递归函数定义如下: -``` +```cpp TreeNode* parent; // 记录遍历节点的父节点 void traversal(TreeNode* cur, int val) ``` From 2da3afe8a9c576fdb7f4d784b92e0fd7ce9b3074 Mon Sep 17 00:00:00 2001 From: sss1h <49825610+sss1h@users.noreply.github.com> Date: Tue, 27 Feb 2024 21:28:45 +0800 Subject: [PATCH 2497/3019] Update gitserver.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修正错别字和语病 --- problems/qita/gitserver.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/problems/qita/gitserver.md b/problems/qita/gitserver.md index 9ee06ae4d9..f410898860 100644 --- a/problems/qita/gitserver.md +++ b/problems/qita/gitserver.md @@ -138,7 +138,7 @@ passwd gitpassword 创建`.ssh` 目录,如果`.ssh` 已经存在了,可以忽略这一项 -为啥用配置ssh公钥呢,同学们记不记得我急使用github上传上传代码的时候也要把自己的公钥配置上github上 +为啥用配置ssh公钥呢,同学们记不记得我使用github上传代码的时候也要把自己的公钥配置上github上 这也是方面每次操作git仓库的时候不用再去输入密码 @@ -186,7 +186,7 @@ cd /home/git/.ssh/ cat id_rsa.pub >> authorized_keys ``` -如何看我们配置的密钥是否成功呢, 在客户点直接登录git服务器,看看是否是免密登陆 +如何看我们配置的密钥是否成功呢, 在客户端直接登录git服务器,看看是否是免密登陆 ``` ssh git@git服务器ip ``` From e361eddeddf3c86ed53b360861fb90703d7e95ce Mon Sep 17 00:00:00 2001 From: sss1h <49825610+sss1h@users.noreply.github.com> Date: Tue, 27 Feb 2024 21:58:01 +0800 Subject: [PATCH 2498/3019] =?UTF-8?q?Update=20=E5=9B=BE=E8=AE=BA=E5=B9=B6?= =?UTF-8?q?=E6=9F=A5=E9=9B=86=E7=90=86=E8=AE=BA=E5=9F=BA=E7=A1=80.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修正语病 --- ...\233\206\347\220\206\350\256\272\345\237\272\347\241\200.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/\345\233\276\350\256\272\345\271\266\346\237\245\351\233\206\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\345\233\276\350\256\272\345\271\266\346\237\245\351\233\206\347\220\206\350\256\272\345\237\272\347\241\200.md" index a65d480760..6a1456e950 100644 --- "a/problems/\345\233\276\350\256\272\345\271\266\346\237\245\351\233\206\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\345\233\276\350\256\272\345\271\266\346\237\245\351\233\206\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -396,7 +396,7 @@ void join(int u, int v) { if (rank[u] <= rank[v]) father[u] = v; // rank小的树合入到rank大的树 else father[v] = u; - if (rank[u] == rank[v] && u != v) rank[v]++; // 如果两棵树高度相同,则v的高度+1因为,上面 if (rank[u] <= rank[v]) father[u] = v; 注意是 <= + if (rank[u] == rank[v] && u != v) rank[v]++; // 如果两棵树高度相同,则v的高度+1,因为上面 if (rank[u] <= rank[v]) father[u] = v; 注意是 <= } ``` From bf256aad79dcb8efcab4adfa60cc05d3a9c03f1f Mon Sep 17 00:00:00 2001 From: sss1h <49825610+sss1h@users.noreply.github.com> Date: Tue, 27 Feb 2024 21:59:12 +0800 Subject: [PATCH 2499/3019] Update gitserver.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修正语病 --- problems/qita/gitserver.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/problems/qita/gitserver.md b/problems/qita/gitserver.md index f410898860..caf93ec6ec 100644 --- a/problems/qita/gitserver.md +++ b/problems/qita/gitserver.md @@ -138,7 +138,7 @@ passwd gitpassword 创建`.ssh` 目录,如果`.ssh` 已经存在了,可以忽略这一项 -为啥用配置ssh公钥呢,同学们记不记得我使用github上传代码的时候也要把自己的公钥配置上github上 +为啥用配置ssh公钥呢,同学们记不记得我使用github上传代码的时候也要把自己的公钥配置上传到github上 这也是方面每次操作git仓库的时候不用再去输入密码 From af5741fbaad53da909a759f3f16765aa0049278c Mon Sep 17 00:00:00 2001 From: sss1h <49825610+sss1h@users.noreply.github.com> Date: Tue, 27 Feb 2024 22:43:48 +0800 Subject: [PATCH 2500/3019] =?UTF-8?q?Update=20On=E7=9A=84=E7=AE=97?= =?UTF-8?q?=E6=B3=95=E5=B1=85=E7=84=B6=E8=B6=85=E6=97=B6=E4=BA=86=EF=BC=8C?= =?UTF-8?q?=E6=AD=A4=E6=97=B6=E7=9A=84n=E7=A9=B6=E7=AB=9F=E6=98=AF?= =?UTF-8?q?=E5=A4=9A=E5=A4=A7=EF=BC=9F.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修正错别字 --- ...\253\237\346\230\257\345\244\232\345\244\247\357\274\237.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/\345\211\215\345\272\217/On\347\232\204\347\256\227\346\263\225\345\261\205\347\204\266\350\266\205\346\227\266\344\272\206\357\274\214\346\255\244\346\227\266\347\232\204n\347\251\266\347\253\237\346\230\257\345\244\232\345\244\247\357\274\237.md" "b/problems/\345\211\215\345\272\217/On\347\232\204\347\256\227\346\263\225\345\261\205\347\204\266\350\266\205\346\227\266\344\272\206\357\274\214\346\255\244\346\227\266\347\232\204n\347\251\266\347\253\237\346\230\257\345\244\232\345\244\247\357\274\237.md" index 8b0934c582..df48832358 100644 --- "a/problems/\345\211\215\345\272\217/On\347\232\204\347\256\227\346\263\225\345\261\205\347\204\266\350\266\205\346\227\266\344\272\206\357\274\214\346\255\244\346\227\266\347\232\204n\347\251\266\347\253\237\346\230\257\345\244\232\345\244\247\357\274\237.md" +++ "b/problems/\345\211\215\345\272\217/On\347\232\204\347\256\227\346\263\225\345\261\205\347\204\266\350\266\205\346\227\266\344\272\206\357\274\214\346\255\244\346\227\266\347\232\204n\347\251\266\347\253\237\346\230\257\345\244\232\345\244\247\357\274\237.md" @@ -29,7 +29,7 @@ 所以 1GHz = 10亿Hz,表示CPU可以一秒脉冲10亿次(有10亿个时钟周期),这里不要简单理解一个时钟周期就是一次CPU运算。 -例如1 + 2 = 3,cpu要执行四次才能完整这个操作,步骤一:把1放入寄存机,步骤二:把2放入寄存器,步骤三:做加法,步骤四:保存3。 +例如1 + 2 = 3,cpu要执行四次才能完整这个操作,步骤一:把1放入寄存器,步骤二:把2放入寄存器,步骤三:做加法,步骤四:保存3。 而且计算机的cpu也不会只运行我们自己写的程序上,同时cpu也要执行计算机的各种进程任务等等,我们的程序仅仅是其中的一个进程而已。 From 7ac6785eb3f7450ffda868ea3149bb7bdfa6b965 Mon Sep 17 00:00:00 2001 From: sss1h <49825610+sss1h@users.noreply.github.com> Date: Tue, 27 Feb 2024 22:49:34 +0800 Subject: [PATCH 2501/3019] =?UTF-8?q?Update=20On=E7=9A=84=E7=AE=97?= =?UTF-8?q?=E6=B3=95=E5=B1=85=E7=84=B6=E8=B6=85=E6=97=B6=E4=BA=86=EF=BC=8C?= =?UTF-8?q?=E6=AD=A4=E6=97=B6=E7=9A=84n=E7=A9=B6=E7=AB=9F=E6=98=AF?= =?UTF-8?q?=E5=A4=9A=E5=A4=A7=EF=BC=9F.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修正语病 --- ...\253\237\346\230\257\345\244\232\345\244\247\357\274\237.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/\345\211\215\345\272\217/On\347\232\204\347\256\227\346\263\225\345\261\205\347\204\266\350\266\205\346\227\266\344\272\206\357\274\214\346\255\244\346\227\266\347\232\204n\347\251\266\347\253\237\346\230\257\345\244\232\345\244\247\357\274\237.md" "b/problems/\345\211\215\345\272\217/On\347\232\204\347\256\227\346\263\225\345\261\205\347\204\266\350\266\205\346\227\266\344\272\206\357\274\214\346\255\244\346\227\266\347\232\204n\347\251\266\347\253\237\346\230\257\345\244\232\345\244\247\357\274\237.md" index df48832358..d5710d5ae2 100644 --- "a/problems/\345\211\215\345\272\217/On\347\232\204\347\256\227\346\263\225\345\261\205\347\204\266\350\266\205\346\227\266\344\272\206\357\274\214\346\255\244\346\227\266\347\232\204n\347\251\266\347\253\237\346\230\257\345\244\232\345\244\247\357\274\237.md" +++ "b/problems/\345\211\215\345\272\217/On\347\232\204\347\256\227\346\263\225\345\261\205\347\204\266\350\266\205\346\227\266\344\272\206\357\274\214\346\255\244\346\227\266\347\232\204n\347\251\266\347\253\237\346\230\257\345\244\232\345\244\247\357\274\237.md" @@ -52,7 +52,7 @@ * 火箭科学家需要大致知道一枚试射火箭的着陆点是在大海里还是在城市中; * 医学研究者需要知道一次药物测试是会杀死还是会治愈实验对象; -所以**任何开发计算机程序员的软件工程师都应该能够估计这个程序的运行时间是一秒钟还是一年**。 +所以**任何开发计算机程序的软件工程师都应该能够估计这个程序的运行时间是一秒钟还是一年**。 这个是最基本的,所以以上误差就不算事了。 From 190dd0e54a45208983d3e7c8a3437221b01f0270 Mon Sep 17 00:00:00 2001 From: Jamie He Date: Wed, 28 Feb 2024 06:06:07 +0000 Subject: [PATCH 2502/3019] =?UTF-8?q?used=20=E6=95=B0=E7=BB=84=E8=B6=85?= =?UTF-8?q?=E6=97=B6=EF=BC=8C=20=E7=A7=BB=E9=99=A4=E7=9B=B8=E5=85=B3?= =?UTF-8?q?=E7=AD=94=E6=A1=88=E3=80=820332.=E9=87=8D=E6=96=B0=E5=AE=89?= =?UTF-8?q?=E6=8E=92=E8=A1=8C=E7=A8=8B.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...11\346\216\222\350\241\214\347\250\213.md" | 26 ------------------- 1 file changed, 26 deletions(-) diff --git "a/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" "b/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" index 036cfc51b5..61fa82f552 100644 --- "a/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" +++ "b/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" @@ -419,32 +419,6 @@ class Solution { ``` ### Python -回溯 使用used数组 - -```python -class Solution: - def findItinerary(self, tickets: List[List[str]]) -> List[str]: - tickets.sort() # 先排序,这样一旦找到第一个可行路径,一定是字母排序最小的 - used = [0] * len(tickets) - path = ['JFK'] - results = [] - self.backtracking(tickets, used, path, 'JFK', results) - return results[0] - - def backtracking(self, tickets, used, path, cur, results): - if len(path) == len(tickets) + 1: # 终止条件:路径长度等于机票数量+1 - results.append(path[:]) # 将当前路径添加到结果列表 - return True - - for i, ticket in enumerate(tickets): # 遍历机票列表 - if ticket[0] == cur and used[i] == 0: # 找到起始机场为cur且未使用过的机票 - used[i] = 1 # 标记该机票为已使用 - path.append(ticket[1]) # 将到达机场添加到路径中 - state = self.backtracking(tickets, used, path, ticket[1], results) # 递归搜索 - path.pop() # 回溯,移除最后添加的到达机场 - used[i] = 0 # 标记该机票为未使用 - if state: - return True # 只要找到一个可行路径就返回,不继续搜索 ``` 回溯 使用字典 From da5be794f9f7923197465570c56870a4dda735b7 Mon Sep 17 00:00:00 2001 From: Jamie He Date: Wed, 28 Feb 2024 06:10:39 +0000 Subject: [PATCH 2503/3019] =?UTF-8?q?Update=200332.=E9=87=8D=E6=96=B0?= =?UTF-8?q?=E5=AE=89=E6=8E=92=E8=A1=8C=E7=A8=8B.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git "a/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" "b/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" index 61fa82f552..6c8a481435 100644 --- "a/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" +++ "b/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" @@ -418,8 +418,7 @@ class Solution { } ``` -### Python - +### Python ``` 回溯 使用字典 ```python From f926ac8f390f63236426ca29f2bfd63ad98685c9 Mon Sep 17 00:00:00 2001 From: Tiana <51739436+tianci-zhang@users.noreply.github.com> Date: Thu, 29 Feb 2024 18:45:42 +0800 Subject: [PATCH 2504/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A00070.=E7=88=AC?= =?UTF-8?q?=E6=A5=BC=E6=A2=AF=E5=AE=8C=E5=85=A8=E8=83=8C=E5=8C=85=E7=89=88?= =?UTF-8?q?=E6=9C=AC.md=20Python3=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加0070.爬楼梯完全背包版本.md Python3代码 --- ...203\214\345\214\205\347\211\210\346\234\254.md" | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git "a/problems/0070.\347\210\254\346\245\274\346\242\257\345\256\214\345\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md" "b/problems/0070.\347\210\254\346\245\274\346\242\257\345\256\214\345\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md" index 4fa294cfe2..622b1117e7 100644 --- "a/problems/0070.\347\210\254\346\245\274\346\242\257\345\256\214\345\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md" +++ "b/problems/0070.\347\210\254\346\245\274\346\242\257\345\256\214\345\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md" @@ -165,7 +165,21 @@ class climbStairs{ ``` ### Python3: +```python3 +def climbing_stairs(n,m): + dp = [0]*(n+1) # 背包总容量 + dp[0] = 1 + # 排列题,注意循环顺序,背包在外物品在内 + for j in range(1,n+1): + for i in range(1,m+1): + if j>=i: + dp[j] += dp[j-i] # 这里i就是重量而非index + return dp[n] +if __name__ == '__main__': + n,m = list(map(int,input().split(' '))) + print(climbing_stairs(n,m)) +``` ### Go: From dd242cfbb5339ef8d03b0911da3b57d9b2da9bed Mon Sep 17 00:00:00 2001 From: a12bb <2713204748@qq.com> Date: Thu, 29 Feb 2024 19:52:04 +0800 Subject: [PATCH 2505/3019] =?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 0435.无重叠区间C语言实现 --- ...15\345\217\240\345\214\272\351\227\264.md" | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git "a/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" "b/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" index cf9996ddef..b668e86046 100644 --- "a/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" +++ "b/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" @@ -441,7 +441,37 @@ impl Solution { } } ``` +### C + +```c +// 按照区间右边界排序 +int cmp(const void * var1, const void * var2){ + return (*(int **) var1)[1] - (*(int **) var2)[1]; +} + +int eraseOverlapIntervals(int** intervals, int intervalsSize, int* intervalsColSize) { + if(intervalsSize == 0){ + return 0; + } + qsort(intervals, intervalsSize, sizeof (int *), cmp); + // 记录非重叠的区间数量 + int count = 1; + // 记录区间分割点 + int end = intervals[0][1]; + for(int i = 1; i < intervalsSize; i++){ + if(end <= intervals[i][0]){ + end = intervals[i][1]; + count++; + } + } + return intervalsSize - count; +} +``` + + + ### C# + ```csharp public class Solution { @@ -468,3 +498,4 @@ public class Solution + From 3c4632315c64a4ed47857dd66a8e86bba77e19cd Mon Sep 17 00:00:00 2001 From: a12bb <2713204748@qq.com> Date: Thu, 29 Feb 2024 20:14:04 +0800 Subject: [PATCH 2506/3019] =?UTF-8?q?Update=200763.=E5=88=92=E5=88=86?= =?UTF-8?q?=E5=AD=97=E6=AF=8D=E5=8C=BA=E9=97=B4.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 0763.划分字母区间增加C语言实现 --- ...27\346\257\215\345\214\272\351\227\264.md" | 32 ++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git "a/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" "b/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" index 4e9ec578bc..8b0ca7b802 100644 --- "a/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" +++ "b/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" @@ -404,7 +404,38 @@ impl Solution { } } ``` +### C + +```c +#define max(a, b) ((a) > (b) ? (a) : (b)) + +int* partitionLabels(char* s, int* returnSize) { + // 记录每个字符最远出现的位置 + int last[26] = {0}; + int len = strlen(s); + for (int i = 0; i < len; ++i) { + last[s[i] - 'a'] = i; + } + int left = 0, right = 0; + int * partition = malloc(sizeof (int ) * len); + // 初始化值 + *returnSize = 0; + for(int i = 0; i < len; i++){ + right = max(right, last[s[i] - 'a']); + // 到达最远位置,加入答案,并且更新左边下标 + if(i == right){ + partition[(*returnSize)++] = right - left + 1; + left = i + 1; + } + } + return partition; +} +``` + + + ### C# + ```csharp public class Solution { @@ -435,4 +466,3 @@ public class Solution - From 48e65c1de98e473f9a3e93161f0f484c5b13ed1e Mon Sep 17 00:00:00 2001 From: a12bb <2713204748@qq.com> Date: Thu, 29 Feb 2024 20:44:07 +0800 Subject: [PATCH 2507/3019] =?UTF-8?q?Update=200056.=E5=90=88=E5=B9=B6?= =?UTF-8?q?=E5=8C=BA=E9=97=B4.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 0056.合并区间新增C语言实现 --- ...10\345\271\266\345\214\272\351\227\264.md" | 43 ++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git "a/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" "b/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" index 122e783a27..f9d6f65468 100644 --- "a/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" +++ "b/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" @@ -336,7 +336,49 @@ impl Solution { } } ``` +### C + +```c +#define max(a, b) ((a) > (b) ? (a) : (b)) + +// 根据左边界进行排序 +int cmp(const void * var1, const void * var2){ + int *v1 = *(int **) var1; + int *v2 = *(int **) var2; + return v1[0] - v2[0]; +} + +int** merge(int** intervals, int intervalsSize, int* intervalsColSize, int* returnSize, int** returnColumnSizes) { + int ** result = malloc(sizeof (int *) * intervalsSize); + * returnColumnSizes = malloc(sizeof (int ) * intervalsSize); + for(int i = 0; i < intervalsSize; i++){ + result[i] = malloc(sizeof (int ) * 2); + } + qsort(intervals, intervalsSize, sizeof (int *), cmp); + int count = 0; + for(int i = 0; i < intervalsSize; i++){ + // 记录区间的左右边界 + int L = intervals[i][0], R = intervals[i][1]; + // 如果count为0或者前一区间的右区间小于此时的左边,加入结果中 + if (count == 0 || result[count - 1][1] < L) { + returnColumnSizes[0][count] = 2; + result[count][0] = L; + result[count][1] = R; + count++; + } + else{ // 更新右边界的值 + result[count - 1][1] = max(R, result[count - 1][1]); + } + } + *returnSize = count; + return result; +} +``` + + + ### C# + ```csharp public class Solution { @@ -367,4 +409,3 @@ public class Solution - From 64399ddf6f997b627615a82e791ff50bcf3c2811 Mon Sep 17 00:00:00 2001 From: a12bb <2713204748@qq.com> Date: Thu, 29 Feb 2024 20:55:06 +0800 Subject: [PATCH 2508/3019] =?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 0738.单调递增的数字增加C语言实现 --- ...36\347\232\204\346\225\260\345\255\227.md" | 27 ++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git "a/problems/0738.\345\215\225\350\260\203\351\200\222\345\242\236\347\232\204\346\225\260\345\255\227.md" "b/problems/0738.\345\215\225\350\260\203\351\200\222\345\242\236\347\232\204\346\225\260\345\255\227.md" index 400dc90daa..4a8a6e087d 100644 --- "a/problems/0738.\345\215\225\350\260\203\351\200\222\345\242\236\347\232\204\346\225\260\345\255\227.md" +++ "b/problems/0738.\345\215\225\350\260\203\351\200\222\345\242\236\347\232\204\346\225\260\345\255\227.md" @@ -392,7 +392,33 @@ impl Solution { } } ``` +### C + +```c +int monotoneIncreasingDigits(int n) { + char str[11]; + // 将数字转换为字符串 + sprintf(str, "%d", n); + int len = strlen(str); + int flag = strlen(str); + for(int i = len - 1; i > 0; i--){ + if(str[i] < str[i - 1]){ + str[i - 1]--; + flag = i; + } + } + for(int i = flag; i < len; i++){ + str[i] = '9'; + } + // 字符串转数字 + return atoi(str); +} +``` + + + ### C# + ```csharp public class Solution { @@ -421,4 +447,3 @@ public class Solution - From a1e8af39a8ab834c08ba163be920c29add7d513f Mon Sep 17 00:00:00 2001 From: lavaicer <52038323+lavaicer@users.noreply.github.com> Date: Sat, 2 Mar 2024 01:31:30 +0000 Subject: [PATCH 2509/3019] =?UTF-8?q?=E4=BC=98=E5=8C=96=2019.=20=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?=20N=20=E4=B8=AA=E7=BB=93=E7=82=B9=20go=20=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...4N\344\270\252\350\212\202\347\202\271.md" | 25 ++++++++----------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git "a/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" "b/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" index f508b523e3..d04df9f39a 100644 --- "a/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" +++ "b/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" @@ -165,20 +165,17 @@ class Solution: * } */ func removeNthFromEnd(head *ListNode, n int) *ListNode { - dummyHead := &ListNode{} - dummyHead.Next = head - cur := head - prev := dummyHead - i := 1 - for cur != nil { - cur = cur.Next - if i > n { - prev = prev.Next - } - i++ - } - prev.Next = prev.Next.Next - return dummyHead.Next + dummyNode := &ListNode{0, head} + fast, slow := dummyNode, dummyNode + for i := 0; i <= n; i++ { // 注意<=,否则快指针为空时,慢指针正好在倒数第n个上面 + fast = fast.Next + } + for fast != nil { + fast = fast.Next + slow = slow.Next + } + slow.Next = slow.Next.Next + return dummyNode.Next } ``` From 832e425ce6942a82115badb6d2286ec09690a5c5 Mon Sep 17 00:00:00 2001 From: "435962415@qq.com" Date: Sat, 2 Mar 2024 17:50:19 +0800 Subject: [PATCH 2510/3019] =?UTF-8?q?=C2=961971.=20=E5=AF=BB=E6=89=BE?= =?UTF-8?q?=E5=9B=BE=E4=B8=AD=E6=98=AF=E5=90=A6=E5=AD=98=E5=9C=A8=E8=B7=AF?= =?UTF-8?q?=E5=BE=84=20=E6=B7=BB=E5=8A=A0go=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...30\345\234\250\350\267\257\345\276\204.md" | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git "a/problems/1971.\345\257\273\346\211\276\345\233\276\344\270\255\346\230\257\345\220\246\345\255\230\345\234\250\350\267\257\345\276\204.md" "b/problems/1971.\345\257\273\346\211\276\345\233\276\344\270\255\346\230\257\345\220\246\345\255\230\345\234\250\350\267\257\345\276\204.md" index 132b0181c0..89a2a1fe87 100644 --- "a/problems/1971.\345\257\273\346\211\276\345\233\276\344\270\255\346\230\257\345\220\246\345\255\230\345\234\250\350\267\257\345\276\204.md" +++ "b/problems/1971.\345\257\273\346\211\276\345\233\276\344\270\255\346\230\257\345\220\246\345\255\230\345\234\250\350\267\257\345\276\204.md" @@ -284,6 +284,48 @@ var validPath = function(n, edges, source, destination) { }; ``` +### Go + +```go +func validPath(n int, edges [][]int, source int, destination int) bool { + n = 200005 + father := make([]int, n) + // 并查集初始化 + for i := 0; i < n; i++ { + father[i] = i + } + + var find func(u int) int // 并查集里寻根的过程 + find = func(u int) int { + // 如果根就是自己,直接返回 + // 如果根不是自己,就根据数组下标一层一层向下找 + if u == father[u] { + return u + } + return find(father[u]) + } + + var join func(u, v int) // 将 v->u 这条边加入并查集 + join = func(u, v int) { + u = find(u) + v = find(v) + if u == v { + return + } + father[v] = u + } + + for i := 0; i < len(edges); i++ { + join(edges[i][0], edges[i][1]) + } + + source = find(source) + destination = find(destination) + return source == destination +} + +``` +

From c1ecf1b8ada80975ea91cb8a2d70f740bad0106c Mon Sep 17 00:00:00 2001 From: yangzhaoMP Date: Wed, 6 Mar 2024 11:06:37 +0800 Subject: [PATCH 2511/3019] =?UTF-8?q?=E6=8E=A5=E9=9B=A8=E6=B0=B4=20Java=20?= =?UTF-8?q?=E5=8F=8C=E6=8C=87=E9=92=88=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...2.\346\216\245\351\233\250\346\260\264.md" | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git "a/problems/0042.\346\216\245\351\233\250\346\260\264.md" "b/problems/0042.\346\216\245\351\233\250\346\260\264.md" index 73d787b13c..6d92d2b380 100644 --- "a/problems/0042.\346\216\245\351\233\250\346\260\264.md" +++ "b/problems/0042.\346\216\245\351\233\250\346\260\264.md" @@ -440,6 +440,33 @@ class Solution { } ``` +双指针优化 +```java +class Solution { + public int trap(int[] height) { + if (height.length <= 2) { + return 0; + } + // 从两边向中间寻找最值 + int maxLeft = height[0], maxRight = height[height.length - 1]; + int l = 1, r = height.length - 2; + int res = 0; + while (l <= r) { + // 不确定上一轮是左边移动还是右边移动,所以两边都需更新最值 + maxLeft = Math.max(maxLeft, height[l]); + maxRight = Math.max(maxRight, height[r]); + // 最值较小的一边所能装的水量已定,所以移动较小的一边。 + if (maxLeft < maxRight) { + res += maxLeft - height[l ++]; + } else { + res += maxRight - height[r --]; + } + } + return res; + } +} +``` + 单调栈法 ```java From 571ddaa69d9ea4bd80dcad2b70ffc25ce84f78ae Mon Sep 17 00:00:00 2001 From: yangzhaoMP Date: Wed, 6 Mar 2024 11:41:56 +0800 Subject: [PATCH 2512/3019] =?UTF-8?q?=E5=8A=A8=E6=80=81=E8=A7=84=E5=88=92?= =?UTF-8?q?=20=E7=88=AC=E6=A5=BC=E6=A2=AF=E6=9C=80=E5=B0=8F=E8=B4=B9?= =?UTF-8?q?=E7=8E=87=20java=20=E7=8A=B6=E6=80=81=E5=8E=8B=E7=BC=A9?= =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...271\347\210\254\346\245\274\346\242\257.md" | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git "a/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" "b/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" index d13ff19f5a..6320ed89a7 100644 --- "a/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" +++ "b/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" @@ -244,6 +244,24 @@ class Solution { } ``` +```Java +// 状态压缩,使用三个变量来代替数组 +class Solution { + public int minCostClimbingStairs(int[] cost) { + // 以下三个变量分别表示前两个台阶的最少费用、前一个的、当前的。 + int beforeTwoCost = 0, beforeOneCost = 0, currentCost = 0; + // 前两个台阶不需要费用就能上到,因此从下标2开始;因为最后一个台阶需要跨越,所以需要遍历到cost.length + for (int i = 2; i <= cost.length; i ++) { + // 此处遍历的是cost[i - 1],不会越界 + currentCost = Math.min(beforeOneCost + cost[i - 1], beforeTwoCost + cost[i - 2]); + beforeTwoCost = beforeOneCost; + beforeOneCost = currentCost; + } + return currentCost; + } +} +``` + ### Python 动态规划(版本一) From 86ff0f2a35549d75d45ae873394514e812ab8436 Mon Sep 17 00:00:00 2001 From: yangzhaoMP Date: Wed, 6 Mar 2024 11:54:19 +0800 Subject: [PATCH 2513/3019] =?UTF-8?q?=E5=8A=A8=E6=80=81=E8=A7=84=E5=88=92?= =?UTF-8?q?=20=E4=B8=8D=E5=90=8C=E8=B7=AF=E5=BE=84=20java=20=E7=8A=B6?= =?UTF-8?q?=E6=80=81=E5=8E=8B=E7=BC=A9=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...215\345\220\214\350\267\257\345\276\204.md" | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git "a/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" "b/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" index 207a66ee80..32c64a12c9 100644 --- "a/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" +++ "b/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" @@ -285,6 +285,24 @@ public: } ``` +状态压缩 +```java +class Solution { + public int uniquePaths(int m, int n) { + // 在二维dp数组中,当前值的计算只依赖正上方和正左方,因此可以压缩成一维数组。 + int[] dp = new int[n]; + // 初始化,第一行只能从正左方跳过来,所以只有一条路径。 + Arrays.fill(dp, 1); + for (int i = 1; i < m; i ++) { + // 第一列也只有一条路,不用迭代,所以从第二列开始 + for (int j = 1; j < n; j ++) { + dp[j] += dp[j - 1]; // dp[j] = dp[j] (正上方)+ dp[j - 1] (正左方) + } + } + return dp[n - 1]; + } +} +``` ### Python 递归 From 9932bebde8bb219d3a63b1c3e5881e4c72efa9ad Mon Sep 17 00:00:00 2001 From: yangzhaoMP Date: Wed, 6 Mar 2024 12:56:20 +0800 Subject: [PATCH 2514/3019] =?UTF-8?q?=E5=8A=A8=E6=80=81=E8=A7=84=E5=88=92?= =?UTF-8?q?=20=E4=B9=B0=E5=8D=96=E8=82=A1=E7=A5=A8=20java=20=E6=A0=BC?= =?UTF-8?q?=E5=BC=8F=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" | 3 --- 1 file changed, 3 deletions(-) diff --git "a/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" "b/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" index cbdf40e85c..dafdbbeda2 100644 --- "a/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" +++ "b/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" @@ -287,9 +287,6 @@ class Solution { return dp[1]; } } -``` -```Java - ``` ### Python: From 1474a28a53ffe259d61aefcc822fa7e3e4959d44 Mon Sep 17 00:00:00 2001 From: yangzhaoMP Date: Wed, 6 Mar 2024 14:59:28 +0800 Subject: [PATCH 2515/3019] =?UTF-8?q?=E5=8A=A8=E6=80=81=E8=A7=84=E5=88=92?= =?UTF-8?q?=20=E6=9C=80=E9=95=BF=E8=BF=9E=E7=BB=AD=E9=80=92=E5=A2=9E?= =?UTF-8?q?=E5=BA=8F=E5=88=97=20java=20=E5=8A=A8=E6=80=81=E8=A7=84?= =?UTF-8?q?=E5=88=92=E7=8A=B6=E6=80=81=E5=8E=8B=E7=BC=A9=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...222\345\242\236\345\272\217\345\210\227.md" | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git "a/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" "b/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" index 485e321c99..14a5e89557 100644 --- "a/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" +++ "b/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" @@ -186,7 +186,23 @@ public: return res; } ``` - +> 动态规划状态压缩 +```java +class Solution { + public int findLengthOfLCIS(int[] nums) { + // 记录以 前一个元素结尾的最长连续递增序列的长度 和 以当前 结尾的...... + int beforeOneMaxLen = 1, currentMaxLen = 0; + // res 赋最小值返回的最小值1 + int res = 1; + for (int i = 1; i < nums.length; i ++) { + currentMaxLen = nums[i] > nums[i - 1] ? beforeOneMaxLen + 1 : 1; + beforeOneMaxLen = currentMaxLen; + res = Math.max(res, currentMaxLen); + } + return res; + } +} +``` > 贪心法: ```Java From 58595806a0d8fec2c810231bfa96951784add6f0 Mon Sep 17 00:00:00 2001 From: yangzhaoMP Date: Wed, 6 Mar 2024 16:03:39 +0800 Subject: [PATCH 2516/3019] =?UTF-8?q?=E5=8A=A8=E6=80=81=E8=A7=84=E5=88=92?= =?UTF-8?q?=20=E5=88=A4=E6=96=AD=E5=AD=90=E5=BA=8F=E5=88=97=20java=20?= =?UTF-8?q?=E5=8A=A8=E6=80=81=E8=A7=84=E5=88=92=E7=8A=B6=E6=80=81=E5=8E=8B?= =?UTF-8?q?=E7=BC=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...55\345\255\220\345\272\217\345\210\227.md" | 57 +++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git "a/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" "b/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" index ebd567cbb7..caca8cb86c 100644 --- "a/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" @@ -173,6 +173,63 @@ class Solution { } } ``` +> 修改遍历顺序后,可以利用滚动数组,对dp数组进行压缩 +```java +class Solution { + public boolean isSubsequence(String s, String t) { + // 修改遍历顺序,外圈遍历t,内圈遍历s。使得dp的推算只依赖正上方和左上方,方便压缩。 + int[][] dp = new int[t.length() + 1][s.length() + 1]; + for (int i = 1; i < dp.length; i++) { // 遍历t字符串 + for (int j = 1; j < dp[i].length; j++) { // 遍历s字符串 + if (t.charAt(i - 1) == s.charAt(j - 1)) { + dp[i][j] = dp[i - 1][j - 1] + 1; + } else { + dp[i][j] = dp[i - 1][j]; + } + } + System.out.println(Arrays.toString(dp[i])); + } + return dp[t.length()][s.length()] == s.length(); + } +} +``` +> 状态压缩 +```java +class Solution { + public boolean isSubsequence(String s, String t) { + int[] dp = new int[s.length() + 1]; + for (int i = 0; i < t.length(); i ++) { + // 需要使用上一轮的dp[j - 1],所以使用倒序遍历 + for (int j = dp.length - 1; j > 0; j --) { + // i遍历的是t字符串,j遍历的是dp数组,dp数组的长度比s的大1,因此需要减1。 + if (t.charAt(i) == s.charAt(j - 1)) { + dp[j] = dp[j - 1] + 1; + } + } + } + return dp[s.length()] == s.length(); + } +} +``` +> 将dp定义为boolean类型,dp[i]直接表示s.substring(0, i)是否为t的子序列 + +```java +class Solution { + public boolean isSubsequence(String s, String t) { + boolean[] dp = new boolean[s.length() + 1]; + // 表示 “” 是t的子序列 + dp[0] = true; + for (int i = 0; i < t.length(); i ++) { + for (int j = dp.length - 1; j > 0; j --) { + if (t.charAt(i) == s.charAt(j - 1)) { + dp[j] = dp[j - 1]; + } + } + } + return dp[dp.length - 1]; + } +} +``` ### Python: From 40b392588699b33a750101ab63adbb3b6f4f6860 Mon Sep 17 00:00:00 2001 From: OrangeLiuSSE <143183385+OrangeLiuSSE@users.noreply.github.com> Date: Thu, 7 Mar 2024 10:45:09 +0800 Subject: [PATCH 2517/3019] =?UTF-8?q?Update=200347.=E5=89=8DK=E4=B8=AA?= =?UTF-8?q?=E9=AB=98=E9=A2=91=E5=85=83=E7=B4=A0.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...30\351\242\221\345\205\203\347\264\240.md" | 27 ++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git "a/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" "b/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" index 93d605f5fe..b340e1855b 100644 --- "a/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" +++ "b/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" @@ -218,7 +218,7 @@ class Solution { ``` ### Python: - +解法一: ```python #时间复杂度:O(nlogk) #空间复杂度:O(n) @@ -246,6 +246,31 @@ class Solution: result[i] = heapq.heappop(pri_que)[1] return result ``` +解法二: +```python +class Solution: + def topKFrequent(self, nums: List[int], k: int) -> List[int]: + # 使用字典统计数字出现次数 + time_dict = defaultdict(int) + for num in nums: + time_dict[num] += 1 + # 更改字典,key为出现次数,value为相应的数字的集合 + index_dict = defaultdict(list) + for key in time_dict: + index_dict[time_dict[key]].append(key) + # 排序 + key = list(index_dict.keys()) + key.sort() + result = [] + cnt = 0 + # 获取前k项 + while key and cnt != k: + result += index_dict[key[-1]] + cnt += len(index_dict[key[-1]]) + key.pop() + + return result[0: k] +``` ### Go: From d5ba33471ca102dd009aeae95365ea64bab5cbb4 Mon Sep 17 00:00:00 2001 From: code_more <59354339+worshipone@users.noreply.github.com> Date: Thu, 7 Mar 2024 15:40:05 +0800 Subject: [PATCH 2518/3019] =?UTF-8?q?Update=20kama54.=E6=9B=BF=E6=8D=A2?= =?UTF-8?q?=E6=95=B0=E5=AD=97.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修改kama54.替换数字中的java实例代码思路流程,与为C++代码保持一致 --- ...77\346\215\242\346\225\260\345\255\227.md" | 43 +++++++++++++++---- 1 file changed, 34 insertions(+), 9 deletions(-) diff --git "a/problems/kama54.\346\233\277\346\215\242\346\225\260\345\255\227.md" "b/problems/kama54.\346\233\277\346\215\242\346\225\260\345\255\227.md" index f03e575d1d..092b1df052 100644 --- "a/problems/kama54.\346\233\277\346\215\242\346\225\260\345\255\227.md" +++ "b/problems/kama54.\346\233\277\346\215\242\346\225\260\345\255\227.md" @@ -146,17 +146,42 @@ for (int i = 0; i < a.size(); i++) { ```java import java.util.Scanner; -class Main { - public static void main(String[] args) { - Scanner in = new Scanner(System.in); - String s = in.nextLine(); - StringBuilder sb = new StringBuilder(); +public class Main { + + public static String replaceNumber(String s) { + int count = 0; // 统计数字的个数 + int sOldSize = s.length(); for (int i = 0; i < s.length(); i++) { - if (Character.isDigit(s.charAt(i))) { - sb.append("number"); - }else sb.append(s.charAt(i)); + if(Character.isDigit(s.charAt(i))){ + count++; + } } - System.out.println(sb); + // 扩充字符串s的大小,也就是每个空格替换成"number"之后的大小 + char[] newS = new char[s.length() + count * 5]; + int sNewSize = newS.length; + // 将旧字符串的内容填入新数组 + System.arraycopy(s.toCharArray(), 0, newS, 0, sOldSize); + // 从后先前将空格替换为"number" + for (int i = sNewSize - 1, j = sOldSize - 1; j < i; j--, i--) { + if (!Character.isDigit(newS[j])) { + newS[i] = newS[j]; + } else { + newS[i] = 'r'; + newS[i - 1] = 'e'; + newS[i - 2] = 'b'; + newS[i - 3] = 'm'; + newS[i - 4] = 'u'; + newS[i - 5] = 'n'; + i -= 5; + } + } + return new String(newS); + }; + public static void main(String[] args) { + Scanner scanner = new Scanner(System.in); + String s = scanner.next(); + System.out.println(replaceNumber(s)); + scanner.close(); } } ``` From d6a37be6f21083a1e4bcae7fe167c1bca583fee4 Mon Sep 17 00:00:00 2001 From: a12bb <2713204748@qq.com> Date: Thu, 7 Mar 2024 20:03:10 +0800 Subject: [PATCH 2519/3019] =?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 0494.目标和新增C语言实现 --- ...4.\347\233\256\346\240\207\345\222\214.md" | 36 ++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git "a/problems/0494.\347\233\256\346\240\207\345\222\214.md" "b/problems/0494.\347\233\256\346\240\207\345\222\214.md" index e7a05d45c3..8d1a34e5f5 100644 --- "a/problems/0494.\347\233\256\346\240\207\345\222\214.md" +++ "b/problems/0494.\347\233\256\346\240\207\345\222\214.md" @@ -585,7 +585,42 @@ impl Solution { } } ``` +```c +int getSum(int * nums, int numsSize){ + int sum = 0; + for(int i = 0; i < numsSize; i++){ + sum += nums[i]; + } + return sum; +} + +int findTargetSumWays(int* nums, int numsSize, int target) { + int sum = getSum(nums, numsSize); + int diff = sum - target; + // 两种情况不满足 + if(diff < 0 || diff % 2 != 0){ + return 0; + } + int bagSize = diff / 2; + int dp[numsSize + 1][bagSize + 1]; + dp[0][0] = 1; + for(int i = 1; i <= numsSize; i++){ + int num = nums[i - 1]; + for(int j = 0; j <= bagSize; j++){ + dp[i][j] = dp[i - 1][j]; + if(j >= num){ + dp[i][j] += dp[i - 1][j - num]; + } + } + } + return dp[numsSize][bagSize]; +} +``` + + + ### C# + ```csharp public class Solution { @@ -617,4 +652,3 @@ public class Solution - From 0a30cd7a2664cc8198635bf0c69447abe3c57fa4 Mon Sep 17 00:00:00 2001 From: a12bb <2713204748@qq.com> Date: Thu, 7 Mar 2024 20:04:45 +0800 Subject: [PATCH 2520/3019] =?UTF-8?q?Update=200474.=E4=B8=80=E5=92=8C?= =?UTF-8?q?=E9=9B=B6.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 0474.一和零新增C语言实现 --- ...4.\344\270\200\345\222\214\351\233\266.md" | 33 ++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git "a/problems/0474.\344\270\200\345\222\214\351\233\266.md" "b/problems/0474.\344\270\200\345\222\214\351\233\266.md" index 904d941e9d..7e04ae1eb0 100644 --- "a/problems/0474.\344\270\200\345\222\214\351\233\266.md" +++ "b/problems/0474.\344\270\200\345\222\214\351\233\266.md" @@ -533,7 +533,39 @@ impl Solution { } } ``` +```c +#define max(a, b) ((a) > (b) ? (a) : (b)) + +int findMaxForm(char** strs, int strsSize, int m, int n) { + int dp[m + 1][n + 1]; + memset(dp, 0, sizeof (int ) * (m + 1) * (n + 1)); + for(int i = 0; i < strsSize; i++){ + // 统计0和1的数量 + int count0 = 0; + int count1 = 0; + char *str = strs[i]; + while (*str != '\0'){ + if(*str == '0'){ + count0++; + } else{ + count1++; + } + str++; + } + for(int j = m; j >= count0; j--){ + for(int k = n; k >= count1; k--){ + dp[j][k] = max(dp[j][k], dp[j - count0][k - count1] + 1); + } + } + } + return dp[m][n]; +} +``` + + + ### C# + ```csharp public class Solution { @@ -565,4 +597,3 @@ public class Solution - From 4e7637556b14e6600a73928269d324bc227e08ab Mon Sep 17 00:00:00 2001 From: a12bb <2713204748@qq.com> Date: Thu, 7 Mar 2024 20:13:39 +0800 Subject: [PATCH 2521/3019] =?UTF-8?q?Update=200518.=E9=9B=B6=E9=92=B1?= =?UTF-8?q?=E5=85=91=E6=8D=A2II.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 0518.零钱兑换II新增C语言实现 --- ...\351\222\261\345\205\221\346\215\242II.md" | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git "a/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" "b/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" index da1c475565..59fdf6cd25 100644 --- "a/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" +++ "b/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" @@ -353,7 +353,28 @@ object Solution { } } ``` +## C + +```c +int change(int amount, int* coins, int coinsSize) { + int dp[amount + 1]; + memset(dp, 0, sizeof (dp)); + dp[0] = 1; + // 遍历物品 + for(int i = 0; i < coinsSize; i++){ + // 遍历背包 + for(int j = coins[i]; j <= amount; j++){ + dp[j] += dp[j - coins[i]]; + } + } + return dp[amount]; +} +``` + + + ### C# + ```csharp public class Solution { @@ -378,3 +399,4 @@ public class Solution + From 12365a3a4fcd4a38633921df6c942c8a7c7536f9 Mon Sep 17 00:00:00 2001 From: a12bb <2713204748@qq.com> Date: Thu, 7 Mar 2024 20:15:51 +0800 Subject: [PATCH 2522/3019] =?UTF-8?q?Update=200474.=E4=B8=80=E5=92=8C?= =?UTF-8?q?=E9=9B=B6.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "problems/0474.\344\270\200\345\222\214\351\233\266.md" | 3 +++ 1 file changed, 3 insertions(+) diff --git "a/problems/0474.\344\270\200\345\222\214\351\233\266.md" "b/problems/0474.\344\270\200\345\222\214\351\233\266.md" index 7e04ae1eb0..af50fa5cbc 100644 --- "a/problems/0474.\344\270\200\345\222\214\351\233\266.md" +++ "b/problems/0474.\344\270\200\345\222\214\351\233\266.md" @@ -533,6 +533,8 @@ impl Solution { } } ``` +## C + ```c #define max(a, b) ((a) > (b) ? (a) : (b)) @@ -597,3 +599,4 @@ public class Solution + From 702916f35626f98841b0700b8bce8688e8fc7c7a Mon Sep 17 00:00:00 2001 From: a12bb <2713204748@qq.com> Date: Thu, 7 Mar 2024 20:16:56 +0800 Subject: [PATCH 2523/3019] =?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.\347\233\256\346\240\207\345\222\214.md" | 3 +++ 1 file changed, 3 insertions(+) diff --git "a/problems/0494.\347\233\256\346\240\207\345\222\214.md" "b/problems/0494.\347\233\256\346\240\207\345\222\214.md" index 8d1a34e5f5..02edad4d8b 100644 --- "a/problems/0494.\347\233\256\346\240\207\345\222\214.md" +++ "b/problems/0494.\347\233\256\346\240\207\345\222\214.md" @@ -585,6 +585,8 @@ impl Solution { } } ``` +## C + ```c int getSum(int * nums, int numsSize){ int sum = 0; @@ -652,3 +654,4 @@ public class Solution + From a55dca64eda06deac1fac7e291df3a2694006cce Mon Sep 17 00:00:00 2001 From: a12bb <2713204748@qq.com> Date: Fri, 8 Mar 2024 22:40:51 +0800 Subject: [PATCH 2524/3019] =?UTF-8?q?=E6=96=B0=E5=A2=9EC=E8=AF=AD=E8=A8=80?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...50\345\271\263\346\226\271\346\225\260.md" | 25 +++++++++++++++- ...66\351\222\261\345\205\221\346\215\242.md" | 30 ++++++++++++++++++- 2 files changed, 53 insertions(+), 2 deletions(-) diff --git "a/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" "b/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" index a0e62d4800..f7c06dbd87 100644 --- "a/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" +++ "b/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" @@ -389,6 +389,30 @@ function numSquares(n: number): number { }; ``` +## C + +```c +#define min(a, b) ((a) > (b) ? (b) : (a)) + +int numSquares(int n) { + int* dp = (int*)malloc(sizeof(int) * (n + 1)); + for (int j = 0; j < n + 1; j++) { + dp[j] = INT_MAX; + } + dp[0] = 0; + // 遍历背包 + for (int i = 0; i <= n; ++i) { + // 遍历物品 + for (int j = 1; j * j <= i; ++j) { + dp[i] = min(dp[i - j * j] + 1, dp[i]); + } + } + return dp[n]; +} +``` + + + ### Rust: ```rust @@ -439,4 +463,3 @@ impl Solution { - diff --git "a/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" "b/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" index eae4ab3ac0..156b5ff36d 100644 --- "a/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" +++ "b/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" @@ -352,6 +352,35 @@ func min(a, b int) int { ``` +## C + +```c +#define min(a, b) ((a) > (b) ? (b) : (a)) + +int coinChange(int* coins, int coinsSize, int amount) { + int* dp = (int*)malloc(sizeof(int) * (amount + 1)); + for (int j = 0; j < amount + 1; j++) { + dp[j] = INT_MAX; + } + dp[0] = 0; + // 遍历背包 + for(int i = 0; i <= amount; i++){ + // 遍历物品 + for(int j = 0; j < coinsSize; j++){ + if(i - coins[j] >= 0 && dp[i - coins[j]] != INT_MAX){ + dp[i] = min(dp[i], dp[i - coins[j]] + 1); + } + } + } + if(dp[amount] == INT_MAX){ + return -1; + } + return dp[amount]; +} +``` + + + ### Rust: ```rust @@ -474,4 +503,3 @@ function coinChange(coins: number[], amount: number): number { - From 6bae30472cf1e0380c3a6652b877ff7777d3f993 Mon Sep 17 00:00:00 2001 From: a12bb <2713204748@qq.com> Date: Fri, 8 Mar 2024 22:42:26 +0800 Subject: [PATCH 2525/3019] =?UTF-8?q?Update=200377.=E7=BB=84=E5=90=88?= =?UTF-8?q?=E6=80=BB=E5=92=8C=E2=85=A3.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增C语言实现 --- ...10\346\200\273\345\222\214\342\205\243.md" | 22 ++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git "a/problems/0377.\347\273\204\345\220\210\346\200\273\345\222\214\342\205\243.md" "b/problems/0377.\347\273\204\345\220\210\346\200\273\345\222\214\342\205\243.md" index a840ec9bcc..6f81bffef9 100644 --- "a/problems/0377.\347\273\204\345\220\210\346\200\273\345\222\214\342\205\243.md" +++ "b/problems/0377.\347\273\204\345\220\210\346\200\273\345\222\214\342\205\243.md" @@ -312,7 +312,28 @@ impl Solution { } } ``` +### C + +```c +int combinationSum4(int* nums, int numsSize, int target) { + int dp[target + 1]; + memset(dp, 0, sizeof (dp )); + dp[0] = 1; + for(int i = 0; i <= target; i++){ + for(int j = 0; j < numsSize; j++){ + if(i - nums[j] >= 0 && dp[i] < INT_MAX - dp[i - nums[j]]){ + dp[i] += dp[i - nums[j]]; + } + } + } + return dp[target]; +} +``` + + + ### C# + ```csharp public class Solution { @@ -340,4 +361,3 @@ public class Solution - From 40eda312e63be74f9f37c2697548b9c802969f9c Mon Sep 17 00:00:00 2001 From: paigeman <53284808+paigeman@users.noreply.github.com> Date: Sat, 9 Mar 2024 10:28:31 +0800 Subject: [PATCH 2526/3019] fix typos show some LaTeX formula correctly --- ...0\257\345\244\232\345\244\247\357\274\237.md" | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git "a/problems/\345\211\215\345\272\217/On\347\232\204\347\256\227\346\263\225\345\261\205\347\204\266\350\266\205\346\227\266\344\272\206\357\274\214\346\255\244\346\227\266\347\232\204n\347\251\266\347\253\237\346\230\257\345\244\232\345\244\247\357\274\237.md" "b/problems/\345\211\215\345\272\217/On\347\232\204\347\256\227\346\263\225\345\261\205\347\204\266\350\266\205\346\227\266\344\272\206\357\274\214\346\255\244\346\227\266\347\232\204n\347\251\266\347\253\237\346\230\257\345\244\232\345\244\247\357\274\237.md" index 8b0934c582..72ca4160dd 100644 --- "a/problems/\345\211\215\345\272\217/On\347\232\204\347\256\227\346\263\225\345\261\205\347\204\266\350\266\205\346\227\266\344\272\206\357\274\214\346\255\244\346\227\266\347\232\204n\347\251\266\347\253\237\346\230\257\345\244\232\345\244\247\357\274\237.md" +++ "b/problems/\345\211\215\345\272\217/On\347\232\204\347\256\227\346\263\225\345\261\205\347\204\266\350\266\205\346\227\266\344\272\206\357\274\214\346\255\244\346\227\266\347\232\204n\347\251\266\347\253\237\346\230\257\345\244\232\345\244\247\357\274\237.md" @@ -14,9 +14,9 @@ 也就是说程序运行的时间超过了规定的时间,一般OJ(online judge)的超时时间就是1s,也就是用例数据输入后最多要1s内得到结果,暂时还不清楚leetcode的判题规则,下文为了方便讲解,暂定超时时间就是1s。 -如果写出了一个$O(n)$的算法 ,其实可以估算出来n是多大的时候算法的执行时间就会超过1s了。 +如果写出了一个 $O(n)$ 的算法 ,其实可以估算出来n是多大的时候算法的执行时间就会超过1s了。 -如果n的规模已经足够让$O(n)$的算法运行时间超过了1s,就应该考虑log(n)的解法了。 +如果n的规模已经足够让 $O(n)$ 的算法运行时间超过了1s,就应该考虑log(n)的解法了。 ## 从硬件配置看计算机的性能 @@ -60,7 +60,7 @@ 测试硬件:2015年MacPro,CPU配置:2.7 GHz Dual-Core Intel Core i5 -实现三个函数,时间复杂度分别是 $O(n)$ , $O(n^2)$, $O(n\log n)$,使用加法运算来统一测试。 +实现三个函数,时间复杂度分别是 $O(n)$ , $O(n^2)$ , $O(n\log n)$ ,使用加法运算来统一测试。 ```CPP // O(n) @@ -126,19 +126,19 @@ int main() { ![程序超时2](https://code-thinking-1253855093.file.myqcloud.com/pics/20200729200018460-20230310124315093.png) -O(n)的算法,1s内大概计算机可以运行 5 * (10^8)次计算,可以推测一下$O(n^2)$ 的算法应该1s可以处理的数量级的规模是 5 * (10^8)开根号,实验数据如下。 +O(n)的算法,1s内大概计算机可以运行 5 * (10^8)次计算,可以推测一下 $O(n^2)$ 的算法应该1s可以处理的数量级的规模是 5 * (10^8)开根号,实验数据如下。 ![程序超时3](https://code-thinking-1253855093.file.myqcloud.com/pics/2020072919590970-20230310124318532.png) O(n^2)的算法,1s内大概计算机可以运行 22500次计算,验证了刚刚的推测。 -在推测一下$O(n\log n)$的话, 1s可以处理的数据规模是什么呢? +在推测一下 $O(n\log n)$ 的话, 1s可以处理的数据规模是什么呢? -理论上应该是比 $O(n)$少一个数量级,因为$\log n$的复杂度 其实是很快,看一下实验数据。 +理论上应该是比 $O(n)$ 少一个数量级,因为 $\log n$ 的复杂度 其实是很快,看一下实验数据。 ![程序超时4](https://code-thinking-1253855093.file.myqcloud.com/pics/20200729195729407-20230310124322232.png) -$O(n\log n)$的算法,1s内大概计算机可以运行 2 * (10^7)次计算,符合预期。 +$O(n\log n)$ 的算法,1s内大概计算机可以运行 2 * (10^7)次计算,符合预期。 这是在我个人PC上测出来的数据,不能说是十分精确,但数量级是差不多的,大家也可以在自己的计算机上测一下。 @@ -263,7 +263,7 @@ public class TimeComplexity { ## 总结 -本文详细分析了在leetcode上做题程序为什么会有超时,以及从硬件配置上大体知道CPU的执行速度,然后亲自做一个实验来看看$O(n)$的算法,跑一秒钟,这个n究竟是做大,最后给出不同时间复杂度,一秒内可以运算出来的n的大小。 +本文详细分析了在leetcode上做题程序为什么会有超时,以及从硬件配置上大体知道CPU的执行速度,然后亲自做一个实验来看看 $O(n)$ 的算法,跑一秒钟,这个n究竟是做大,最后给出不同时间复杂度,一秒内可以运算出来的n的大小。 建议录友们也都自己做一做实验,测一测,看看是不是和我的测出来的结果差不多。 From d6bc92e2142fa0534f1b06b4c4f9895ae6c1ffeb Mon Sep 17 00:00:00 2001 From: paigeman <53284808+paigeman@users.noreply.github.com> Date: Sat, 9 Mar 2024 11:16:19 +0800 Subject: [PATCH 2527/3019] fix typos show some LaTeX formula normally --- ...\220\345\221\250\346\234\253\346\200\273\347\273\223.md" | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20201210\345\244\215\346\235\202\345\272\246\345\210\206\346\236\220\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20201210\345\244\215\346\235\202\345\272\246\345\210\206\346\236\220\345\221\250\346\234\253\346\200\273\347\273\223.md" index cd3b2f1346..461219f2da 100644 --- "a/problems/\345\221\250\346\200\273\347\273\223/20201210\345\244\215\346\235\202\345\272\246\345\210\206\346\236\220\345\221\250\346\234\253\346\200\273\347\273\223.md" +++ "b/problems/\345\221\250\346\200\273\347\273\223/20201210\345\244\215\346\235\202\345\272\246\345\210\206\346\236\220\345\221\250\346\234\253\346\200\273\347\273\223.md" @@ -54,10 +54,10 @@ 文中涉及如下问题: * 究竟什么是大O?大O表示什么意思?严格按照大O的定义来说,快排应该是$O(n^2)$的算法! -* $O(n^2)$的算法为什么有时候比$O(n)$的算法更优? +* $O(n^2)$ 的算法为什么有时候比 $O(n)$ 的算法更优? * 什么时间复杂度为什么可以忽略常数项? * 如何简化复杂的时间复杂度表达式,原理是什么? -* $O(\log n)$中的log究竟是以谁为底? +* $O(\log n)$ 中的log究竟是以谁为底? 这些问题大家可能懵懵懂懂的了解一些,但一细问又答不上来。 @@ -96,7 +96,7 @@ 文中给出了四个版本的代码实现,并逐一分析了其时间复杂度。 -此时大家就会发现,同一道题目,同样使用递归算法,有的同学会写出了O(n)的代码,有的同学就写出了$O(\log n)$的代码。 +此时大家就会发现,同一道题目,同样使用递归算法,有的同学会写出了O(n)的代码,有的同学就写出了 $O(\log n)$ 的代码。 其本质是要对递归的时间复杂度有清晰的认识,才能运用递归来有效的解决问题! From 356b2c6778eb9f8bec347cb6bf68648d4d749ee3 Mon Sep 17 00:00:00 2001 From: paigeman <53284808+paigeman@users.noreply.github.com> Date: Sat, 9 Mar 2024 11:19:34 +0800 Subject: [PATCH 2528/3019] fix typos show some LaTeX formula normally --- ...\207\240\344\270\252\347\226\221\351\227\256\357\274\237.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/\345\211\215\345\272\217/\345\205\263\344\272\216\347\251\272\351\227\264\345\244\215\346\235\202\345\272\246\357\274\214\345\217\257\350\203\275\346\234\211\345\207\240\344\270\252\347\226\221\351\227\256\357\274\237.md" "b/problems/\345\211\215\345\272\217/\345\205\263\344\272\216\347\251\272\351\227\264\345\244\215\346\235\202\345\272\246\357\274\214\345\217\257\350\203\275\346\234\211\345\207\240\344\270\252\347\226\221\351\227\256\357\274\237.md" index 19384fd980..b669049293 100644 --- "a/problems/\345\211\215\345\272\217/\345\205\263\344\272\216\347\251\272\351\227\264\345\244\215\346\235\202\345\272\246\357\274\214\345\217\257\350\203\275\346\234\211\345\207\240\344\270\252\347\226\221\351\227\256\357\274\237.md" +++ "b/problems/\345\211\215\345\272\217/\345\205\263\344\272\216\347\251\272\351\227\264\345\244\215\346\235\202\345\272\246\357\274\214\345\217\257\350\203\275\346\234\211\345\207\240\344\270\252\347\226\221\351\227\256\357\274\237.md" @@ -32,7 +32,7 @@ 同样在工程实践中,计算机的内存空间也不是无限的,需要工程师对软件运行时所使用的内存有一个大体评估,这都需要用到算法空间复杂度的分析。 -来看一下例子,什么时候的空间复杂度是$O(1)$呢,C++代码如下: +来看一下例子,什么时候的空间复杂度是 $O(1)$ 呢,C++代码如下: ```CPP int j = 0; From 89ee2d263f02ea91ba8f5bc6e1fe73f38b306584 Mon Sep 17 00:00:00 2001 From: paigeman <53284808+paigeman@users.noreply.github.com> Date: Sat, 9 Mar 2024 11:35:37 +0800 Subject: [PATCH 2529/3019] fix typo show some LaTeX formula correctly --- ...\244\215\346\235\202\345\272\246\345\210\206\346\236\220.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/\345\211\215\345\272\217/\351\200\222\345\275\222\347\256\227\346\263\225\347\232\204\346\227\266\351\227\264\344\270\216\347\251\272\351\227\264\345\244\215\346\235\202\345\272\246\345\210\206\346\236\220.md" "b/problems/\345\211\215\345\272\217/\351\200\222\345\275\222\347\256\227\346\263\225\347\232\204\346\227\266\351\227\264\344\270\216\347\251\272\351\227\264\345\244\215\346\235\202\345\272\246\345\210\206\346\236\220.md" index aacc456857..39513a9155 100644 --- "a/problems/\345\211\215\345\272\217/\351\200\222\345\275\222\347\256\227\346\263\225\347\232\204\346\227\266\351\227\264\344\270\216\347\251\272\351\227\264\345\244\215\346\235\202\345\272\246\345\210\206\346\236\220.md" +++ "b/problems/\345\211\215\345\272\217/\351\200\222\345\275\222\347\256\227\346\263\225\347\232\204\346\227\266\351\227\264\344\270\216\347\251\272\351\227\264\345\244\215\346\235\202\345\272\246\345\210\206\346\236\220.md" @@ -191,7 +191,7 @@ int main() 因为每次递归所需的空间都被压到调用栈里(这是内存管理里面的数据结构,和算法里的栈原理是一样的),一次递归结束,这个栈就是就是把本次递归的数据弹出去。所以这个栈最大的长度就是递归的深度。 -此时可以分析这段递归的空间复杂度,从代码中可以看出每次递归所需要的空间大小都是一样的,所以每次递归中需要的空间是一个常量,并不会随着n的变化而变化,每次递归的空间复杂度就是$O(1)$。 +此时可以分析这段递归的空间复杂度,从代码中可以看出每次递归所需要的空间大小都是一样的,所以每次递归中需要的空间是一个常量,并不会随着n的变化而变化,每次递归的空间复杂度就是 $O(1)$ 。 在看递归的深度是多少呢?如图所示: From 216f9db871f5c08a8b44573c678eab3915aa9f49 Mon Sep 17 00:00:00 2001 From: a12bb <2713204748@qq.com> Date: Sat, 9 Mar 2024 17:15:37 +0800 Subject: [PATCH 2530/3019] =?UTF-8?q?Update=200139.=E5=8D=95=E8=AF=8D?= =?UTF-8?q?=E6=8B=86=E5=88=86.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 0139.单词拆分新增C语言实现 --- ...25\350\257\215\346\213\206\345\210\206.md" | 28 ++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git "a/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" "b/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" index d93288ae5a..a3d59ec718 100644 --- "a/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" +++ "b/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" @@ -498,6 +498,33 @@ function wordBreak(s: string, wordDict: string[]): boolean { }; ``` +### C + +```c +bool wordBreak(char* s, char** wordDict, int wordDictSize) { + int len = strlen(s); + // 初始化 + bool dp[len + 1]; + memset(dp, false, sizeof (dp)); + dp[0] = true; + for (int i = 1; i < len + 1; ++i) { + for(int j = 0; j < wordDictSize; j++){ + int wordLen = strlen(wordDict[j]); + // 分割点是由i和字典单词长度决定 + int k = i - wordLen; + if(k < 0){ + continue; + } + // 这里注意要限制长度,故用strncmp + dp[i] = (dp[k] && !strncmp(s + k, wordDict[j], wordLen)) || dp[i]; + } + } + return dp[len]; +} +``` + + + ### Rust: ```rust @@ -521,4 +548,3 @@ impl Solution { - From dd80ba7af9435c17df28c34496811c465cbfef19 Mon Sep 17 00:00:00 2001 From: Jamie He Date: Sun, 10 Mar 2024 02:43:38 +0000 Subject: [PATCH 2531/3019] =?UTF-8?q?Update=200343.=E6=95=B4=E6=95=B0?= =?UTF-8?q?=E6=8B=86=E5=88=86.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Comment 错了 --- .../0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" "b/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" index bbbd5c6379..aaa758e63e 100644 --- "a/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" +++ "b/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" @@ -296,7 +296,7 @@ class Solution: def integerBreak(self, n): if n == 2: # 当n等于2时,只有一种拆分方式:1+1=2,乘积为1 return 1 - if n == 3: # 当n等于3时,只有一种拆分方式:1+1+1=3,乘积为1 + if n == 3: # 当n等于3时,只有一种拆分方式:2+1=3,乘积为2 return 2 if n == 4: # 当n等于4时,有两种拆分方式:2+2=4和1+1+1+1=4,乘积都为4 return 4 From 448f9ff77d76515cab7837d89c8425e518b45a51 Mon Sep 17 00:00:00 2001 From: cn-hideyoshi <54949420+cn-hideyoshi@users.noreply.github.com> Date: Sun, 10 Mar 2024 13:32:12 +0800 Subject: [PATCH 2532/3019] =?UTF-8?q?Update=200203.=E7=A7=BB=E9=99=A4?= =?UTF-8?q?=E9=93=BE=E8=A1=A8=E5=85=83=E7=B4=A0.md=20=E6=B7=BB=E5=8A=A0php?= =?UTF-8?q?=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 203.移除链表元素.md 添加php解法 --- ...76\350\241\250\345\205\203\347\264\240.md" | 74 ++++++++++++++----- 1 file changed, 57 insertions(+), 17 deletions(-) diff --git "a/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" "b/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" index d6d7e6c2ef..3b04b1b266 100644 --- "a/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" +++ "b/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" @@ -497,27 +497,67 @@ func removeElements(_ head: ListNode?, _ val: Int) -> ListNode? { ```php /** - * Definition for singly-linked list. - * type ListNode struct { - * Val int - * Next *ListNode + * Definition for a singly-linked list. + * class ListNode { + * public $val = 0; + * public $next = null; + * function __construct($val = 0, $next = null) { + * $this->val = $val; + * $this->next = $next; + * } * } */ - // 虚拟头+双指针 -func removeElements(head *ListNode, val int) *ListNode { - dummyHead := &ListNode{} - dummyHead.Next = head - pred := dummyHead - cur := head - for cur != nil { - if cur.Val == val { - pred.Next = cur.Next - } else { - pred = cur + +//版本一(在原链表上直接删除): +class Solution { + + /** + * @param ListNode $head + * @param Integer $val + * @return ListNode + */ + function removeElements($head, $val) + { + if ($head == null) { + return null; } - cur = cur.Next + + $now = $head; + while ($now->next != null) { + if ($now->next->val == $val) { + $now->next = $now->next->next; + } else { + $now = $now->next; + } + } + if ($head->val == $val) { + return $head->next; + } + return $head; + } +} + +//版本二(虚拟头结点方式): +class Solution { + + /** + * @param ListNode $head + * @param Integer $val + * @return ListNode + */ + function removeElements($head, $val) + { + $dummyHead = new ListNode(0, $head); + $now = $dummyHead; + while ($now->next != null){ + if ($now->next->val == $val) { + $now->next = $now->next->next; + } else { + $now = $now->next; + } + } + return $dummyHead->next; } - return dummyHead.Next } ``` From bc6189e9e9898c72180f1787f7614e0c95d0181f Mon Sep 17 00:00:00 2001 From: a12bb <2713204748@qq.com> Date: Sun, 10 Mar 2024 17:50:38 +0800 Subject: [PATCH 2533/3019] =?UTF-8?q?Update=200198.=E6=89=93=E5=AE=B6?= =?UTF-8?q?=E5=8A=AB=E8=88=8D.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 0198.打家劫舍新增C语言实现 --- ...23\345\256\266\345\212\253\350\210\215.md" | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git "a/problems/0198.\346\211\223\345\256\266\345\212\253\350\210\215.md" "b/problems/0198.\346\211\223\345\256\266\345\212\253\350\210\215.md" index a7bc4c998e..480222ef12 100644 --- "a/problems/0198.\346\211\223\345\256\266\345\212\253\350\210\215.md" +++ "b/problems/0198.\346\211\223\345\256\266\345\212\253\350\210\215.md" @@ -315,6 +315,31 @@ function rob(nums: number[]): number { }; ``` +### C + +```c +#define max(a, b) ((a) > (b) ? (a) : (b)) + +int rob(int* nums, int numsSize) { + if(numsSize == 0){ + return 0; + } + if(numsSize == 1){ + return nums[0]; + } + // dp初始化 + int dp[numsSize]; + dp[0] = nums[0]; + dp[1] = max(nums[0], nums[1]); + for(int i = 2; i < numsSize; i++){ + dp[i] = max(dp[i - 1], dp[i - 2] + nums[i]); + } + return dp[numsSize - 1]; +} +``` + + + ### Rust: ```rust @@ -339,3 +364,4 @@ impl Solution { + From 2cee392d8e4ad3064a8d437017bb4e8895ad7477 Mon Sep 17 00:00:00 2001 From: a12bb <2713204748@qq.com> Date: Sun, 10 Mar 2024 17:56:42 +0800 Subject: [PATCH 2534/3019] =?UTF-8?q?Update=200213.=E6=89=93=E5=AE=B6?= =?UTF-8?q?=E5=8A=AB=E8=88=8DII.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 0213.打家劫舍||新增C语言实现 --- ...\345\256\266\345\212\253\350\210\215II.md" | 29 ++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git "a/problems/0213.\346\211\223\345\256\266\345\212\253\350\210\215II.md" "b/problems/0213.\346\211\223\345\256\266\345\212\253\350\210\215II.md" index 385c58675e..ba996f2bf4 100644 --- "a/problems/0213.\346\211\223\345\256\266\345\212\253\350\210\215II.md" +++ "b/problems/0213.\346\211\223\345\256\266\345\212\253\350\210\215II.md" @@ -308,6 +308,34 @@ function robRange(nums: number[], start: number, end: number): number { } ``` +### C + +```c +#define max(a, b) ((a) > (b) ? (a) : (b)) + +// 198.打家劫舍的逻辑 +int robRange(int* nums, int start, int end, int numsSize) { + if (end == start) return nums[start]; + int dp[numsSize]; + dp[start] = nums[start]; + dp[start + 1] = max(nums[start], nums[start + 1]); + for (int i = start + 2; i <= end; i++) { + dp[i] = max(dp[i - 2] + nums[i], dp[i - 1]); + } + return dp[end]; +} + +int rob(int* nums, int numsSize) { + if (numsSize == 0) return 0; + if (numsSize == 1) return nums[0]; + int result1 = robRange(nums, 0, numsSize - 2, numsSize); // 情况二 + int result2 = robRange(nums, 1, numsSize - 1, numsSize); // 情况三 + return max(result1, result2); +} +``` + + + ### Rust: ```rust @@ -343,4 +371,3 @@ impl Solution { - From 0dc2180cee3c015a91ab0906858f544efadd7d24 Mon Sep 17 00:00:00 2001 From: a12bb <2713204748@qq.com> Date: Sun, 10 Mar 2024 21:44:04 +0800 Subject: [PATCH 2535/3019] =?UTF-8?q?Update=200337.=E6=89=93=E5=AE=B6?= =?UTF-8?q?=E5=8A=AB=E8=88=8DIII.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 0337.打家劫舍|||新增C语言实现 --- ...345\256\266\345\212\253\350\210\215III.md" | 28 ++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git "a/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" "b/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" index f616ec7417..61b9f99c6f 100644 --- "a/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" +++ "b/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" @@ -490,6 +490,33 @@ function robNode(node: TreeNode | null): MaxValueArr { } ``` +### C + +```c +int *robTree(struct TreeNode *node) { + int* amounts = (int*) malloc(sizeof(int) * 2); + memset(amounts, 0, sizeof(int) * 2); + if(node == NULL){ + return amounts; + } + int * left = robTree(node->left); + int * right = robTree(node->right); + // 偷当前节点 + amounts[1] = node->val + left[0] + right[0]; + // 不偷当前节点 + amounts[0] = max(left[0], left[1]) + max(right[0], right[1]); + return amounts; +} + +int rob(struct TreeNode* root) { + int * dp = robTree(root); + // 0代表不偷当前节点可以获得的最大值,1表示偷当前节点可以获取的最大值 + return max(dp[0], dp[1]); +} +``` + + + ### Rust 动态规划: @@ -523,4 +550,3 @@ impl Solution { - From b6e458bcfa3be2f8b7f282f5918f9bc26512e9fd Mon Sep 17 00:00:00 2001 From: a12bb <2713204748@qq.com> Date: Sun, 10 Mar 2024 21:47:48 +0800 Subject: [PATCH 2536/3019] =?UTF-8?q?Update=200121.=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?.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 0121.买卖股票的最佳时机新增C语言实现 --- ...00\344\275\263\346\227\266\346\234\272.md" | 47 ++++++++++++++++++- 1 file changed, 46 insertions(+), 1 deletion(-) diff --git "a/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" "b/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" index cbdf40e85c..fb548cbc91 100644 --- "a/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" +++ "b/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" @@ -531,6 +531,52 @@ public class Solution } ``` +### C: + +> 贪心 + +```c +#define max(a, b) ((a) > (b) ? (a) : (b)) +#define min(a, b) ((a) > (b) ? (b) : (a)) + +int maxProfit(int* prices, int pricesSize) { + int low = INT_MIN; + int result = 0; + for(int i = 0; i < pricesSize; i++){ + low = min(low, prices[i]); + result = max(result, prices[i] - low); + } + return result; +} +``` + +> 动态规划 + +```c +#define max(a, b) ((a) > (b) ? (a) : (b)) + +int maxProfit(int* prices, int pricesSize){ + if(pricesSize == 0){ + return 0; + } + // dp初始化 + int ** dp = malloc(sizeof (int *) * pricesSize); + for(int i = 0; i < pricesSize; i++){ + dp[i] = malloc(sizeof (int ) * 2); + } + // 下标0表示持有股票的情况下的最大现金,下标1表示不持有股票的情况下获得的最大现金 + dp[0][0] = -prices[0]; + dp[0][1] = 0; + for(int i = 1; i < pricesSize; i++){ + dp[i][0] = max(dp[i - 1][0], - prices[i]); + dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] + prices[i]); + } + return dp[pricesSize - 1][1]; +} +``` + + + ### Rust: > 贪心 @@ -568,4 +614,3 @@ impl Solution { - From 410dff4d908a4e992a2a3dc1d583706d684c04c2 Mon Sep 17 00:00:00 2001 From: XD <1296586920@qq.com> Date: Tue, 12 Mar 2024 13:18:06 +0800 Subject: [PATCH 2537/3019] =?UTF-8?q?Update=200104.=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=A0=91=E7=9A=84=E6=9C=80=E5=A4=A7=E6=B7=B1=E5=BA=A6=E4=B8=AD?= =?UTF-8?q?=E5=85=B3=E4=BA=8Esolution=E5=A4=A7=E5=B0=8F=E5=86=99=E9=97=AE?= =?UTF-8?q?=E9=A2=98.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修改了solution大小写问题,即solution改为Solution,力扣官网提交是需要大写的 --- ...00\345\244\247\346\267\261\345\272\246.md" | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git "a/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" "b/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" index 1f55f197e5..12d5640555 100644 --- "a/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" +++ "b/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" @@ -77,7 +77,7 @@ return depth; 所以整体c++代码如下: ```CPP -class solution { +class Solution { public: int getdepth(TreeNode* node) { if (node == NULL) return 0; @@ -94,7 +94,7 @@ public: 代码精简之后c++代码如下: ```CPP -class solution { +class Solution { public: int maxDepth(TreeNode* root) { if (root == null) return 0; @@ -110,7 +110,7 @@ public: 本题当然也可以使用前序,代码如下:(**充分表现出求深度回溯的过程**) ```CPP -class solution { +class Solution { public: int result; void getdepth(TreeNode* node, int depth) { @@ -144,7 +144,7 @@ public: 注意以上代码是为了把细节体现出来,简化一下代码如下: ```CPP -class solution { +class Solution { public: int result; void getdepth(TreeNode* node, int depth) { @@ -183,7 +183,7 @@ public: c++代码如下: ```CPP -class solution { +class Solution { public: int maxDepth(TreeNode* root) { if (root == NULL) return 0; @@ -232,7 +232,7 @@ public: c++代码: ```CPP -class solution { +class Solution { public: int maxDepth(Node* root) { if (root == 0) return 0; @@ -249,7 +249,7 @@ public: 依然是层序遍历,代码如下: ```CPP -class solution { +class Solution { public: int maxDepth(Node* root) { queue que; @@ -278,7 +278,7 @@ public: 104.二叉树的最大深度 ```java -class solution { +class Solution { /** * 递归法 */ @@ -319,7 +319,7 @@ class Solution { ``` ```java -class solution { +class Solution { /** * 迭代法,使用层序遍历 */ @@ -369,7 +369,7 @@ class Solution { ``` ```java -class solution { +class Solution { /** * 迭代法,使用层序遍历 */ @@ -402,7 +402,7 @@ class solution { 递归法: ```python -class solution: +class Solution: def maxdepth(self, root: treenode) -> int: return self.getdepth(root) @@ -417,7 +417,7 @@ class solution: 递归法:精简代码 ```python -class solution: +class Solution: def maxdepth(self, root: treenode) -> int: if not root: return 0 From cb58e8afa198a4b9abf57e0e3d76383d850b2d43 Mon Sep 17 00:00:00 2001 From: sss1h <49825610+sss1h@users.noreply.github.com> Date: Tue, 12 Mar 2024 20:20:00 +0800 Subject: [PATCH 2538/3019] =?UTF-8?q?Update=200019.=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E9=93=BE=E8=A1=A8=E7=9A=84=E5=80=92=E6=95=B0=E7=AC=ACN?= =?UTF-8?q?=E4=B8=AA=E8=8A=82=E7=82=B9.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 更正代码错误 --- ...225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" "b/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" index f508b523e3..2fcfd283b1 100644 --- "a/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" +++ "b/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" @@ -82,7 +82,7 @@ public: // ListNode *tmp = slow->next; C++释放内存的逻辑 // slow->next = tmp->next; - // delete nth; + // delete tmp; return dummyHead->next; } From 57e56c508b567c453945b3398dc84c83002d6ec0 Mon Sep 17 00:00:00 2001 From: a12bb <2713204748@qq.com> Date: Tue, 12 Mar 2024 21:39:58 +0800 Subject: [PATCH 2539/3019] =?UTF-8?q?Update=200714.=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?=E5=90=AB=E6=89=8B=E7=BB=AD=E8=B4=B9=EF=BC=88=E5=8A=A8=E6=80=81?= =?UTF-8?q?=E8=A7=84=E5=88=92=EF=BC=89.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 0714.买卖股票的最佳时机含手续费新增C语言实现 --- ...01\350\247\204\345\210\222\357\274\211.md" | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git "a/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" "b/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" index 7e8e3d7c61..88ba9271c8 100644 --- "a/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" +++ "b/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" @@ -247,7 +247,29 @@ function maxProfit(prices: number[], fee: number): number { }; ``` +### C: + +```c +#define max(a, b) ((a) > (b) ? (a) : (b)) + +// dp[i][0] 表示第i天持有股票所省最多现金。 +// dp[i][1] 表示第i天不持有股票所得最多现金 +int maxProfit(int* prices, int pricesSize, int fee) { + int dp[pricesSize][2]; + dp[0][0] = -prices[0]; + dp[0][1] = 0; + for (int i = 1; i < pricesSize; ++i) { + dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] - prices[i]); + dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] + prices[i] - fee); + } + return dp[pricesSize - 1][1]; +} +``` + + + ### Rust: + **贪心** ```Rust @@ -304,3 +326,4 @@ impl Solution { + From 1b9ae455df706c170e6af3c73543a15f8fdbef79 Mon Sep 17 00:00:00 2001 From: a12bb <2713204748@qq.com> Date: Tue, 12 Mar 2024 21:43:13 +0800 Subject: [PATCH 2540/3019] =?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=EF=BC=88=E5=8A=A8=E6=80=81=E8=A7=84=E5=88=92=EF=BC=89.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 0122.买卖股票的最佳时机II新增C语言实现 --- ...01\350\247\204\345\210\222\357\274\211.md" | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" index 6e08b57c1d..24c7f16823 100644 --- "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" +++ "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" @@ -365,6 +365,49 @@ public class Solution } ``` +### C: + +> 动态规划 + +```c +#define max(a, b) ((a) > (b) ? (a) : (b)) + +int maxProfit(int* prices, int pricesSize){ + int **dp = malloc(sizeof (int *) * pricesSize); + for (int i = 0; i < pricesSize; ++i) { + dp[i] = malloc(sizeof (int ) * 2); + } + // 0表示持有该股票所得最大,1表示不持有所得最大 + dp[0][0] = -prices[0]; + dp[0][1] = 0; + for (int i = 1; i < pricesSize; ++i) { + dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] - prices[i]); + dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] + prices[i]); + } + return dp[pricesSize - 1][1]; +} +``` + +> 贪心 + +```c +int maxProfit(int* prices, int pricesSize) { + if(pricesSize == 0){ + return 0; + } + int result = 0; + for(int i = 1; i < pricesSize; i++){ + // 如果今天股票价格大于昨天,代表有利润 + if(prices[i] > prices[i - 1]){ + result += prices[i] - prices[i - 1]; + } + } + return result; +} +``` + + + ### Rust: > 贪心 @@ -416,3 +459,4 @@ impl Solution { + From d40d61e265e33deddc2d84daacd52eb85afb5496 Mon Sep 17 00:00:00 2001 From: a12bb <2713204748@qq.com> Date: Tue, 12 Mar 2024 21:44:50 +0800 Subject: [PATCH 2541/3019] =?UTF-8?q?Update=200123.=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?III.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 0123.买卖股票的最佳时机III新增C语言实现 --- ...344\275\263\346\227\266\346\234\272III.md" | 29 ++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git "a/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" "b/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" index 72dd90426c..18f19c5192 100644 --- "a/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" +++ "b/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" @@ -413,6 +413,34 @@ function maxProfit(prices: number[]): number { }; ``` +### C: + +```c +#define max(a, b) ((a) > (b) ? (a) : (b)) +#define min(a, b) ((a) > (b) ? (b) : (a)) + +int maxProfit(int* prices, int pricesSize) { + int buy1 = prices[0], buy2 = prices[0]; + int profit1 = 0, profit2 = 0; + for (int i = 0; i < pricesSize; ++i) { + // 寻找最低点买入 + buy1 = min(buy1, prices[i]); + // 找到第一次交易的最大盈利,并不断维护这一最大值 + profit1 = max(profit1, prices[i] - buy1); + + // 寻找第二次交易的最低投资点,并且考虑前一次交易的成本 + // 当前价格 - 第一次操作的盈利=新的投入成本( + // 为了让盈利最大,要寻找最小的成本) + buy2 = min(buy2, prices[i] - profit1); + // 第二次卖出后的盈利:当前价格减去成本,不断维护这一最大的总利润 + profit2 = max(profit2, prices[i] - buy2); + } + return profit2; +} +``` + + + ### Rust: > 版本一 @@ -465,4 +493,3 @@ impl Solution { - From d91656d036e536637138ebe7c51c8a37eda01bc2 Mon Sep 17 00:00:00 2001 From: a12bb <2713204748@qq.com> Date: Tue, 12 Mar 2024 21:46:06 +0800 Subject: [PATCH 2542/3019] =?UTF-8?q?Update=200188.=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?IV.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 0188.买卖股票的最佳时机IV新增C语言实现 --- ...\344\275\263\346\227\266\346\234\272IV.md" | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git "a/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" "b/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" index e4c5c48400..2521749fc9 100644 --- "a/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" +++ "b/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" @@ -474,6 +474,34 @@ function maxProfit(k: number, prices: number[]): number { }; ``` +### C: + +```c +#define max(a, b) ((a) > (b) ? (a) : (b)) + +int maxProfit(int k, int* prices, int pricesSize) { + if(pricesSize == 0){ + return 0; + } + + int dp[pricesSize][2 * k + 1]; + memset(dp, 0, sizeof(int) * pricesSize * (2 * k + 1)); + for (int j = 1; j < 2 * k; j += 2) { + dp[0][j] = -prices[0]; + } + + for (int i = 1;i < pricesSize; i++) {//枚举股票 + for (int j = 0; j < 2 * k - 1; j += 2) { //更新每一次买入卖出 + dp[i][j + 1] = max(dp[i - 1][j + 1], dp[i - 1][j] - prices[i]); + dp[i][j + 2] = max(dp[i - 1][j + 2], dp[i - 1][j + 1] + prices[i]); + } + } + return dp[pricesSize - 1][2 * k]; +} +``` + + + ### Rust: ```rust @@ -529,3 +557,4 @@ impl Solution { + From ec899d684b31e7fee9ba80836ec9683084d5dacb Mon Sep 17 00:00:00 2001 From: a12bb <2713204748@qq.com> Date: Tue, 12 Mar 2024 21:47:38 +0800 Subject: [PATCH 2543/3019] =?UTF-8?q?Update=200309.=E6=9C=80=E4=BD=B3?= =?UTF-8?q?=E4=B9=B0=E5=8D=96=E8=82=A1=E7=A5=A8=E6=97=B6=E6=9C=BA=E5=90=AB?= =?UTF-8?q?=E5=86=B7=E5=86=BB=E6=9C=9F.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 0309.最佳买卖股票时机含冷冻期新增C语言实现 --- ...53\345\206\267\345\206\273\346\234\237.md" | 35 ++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git "a/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" "b/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" index 0eb66fb543..9dc35bdf52 100644 --- "a/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" +++ "b/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" @@ -457,6 +457,40 @@ function maxProfit(prices: number[]): number { }; ``` +### C: + +```c +#define max(a, b) ((a) > (b) ? (a) : (b)) + +/** + * 状态一:持有股票状态(今天买入股票, + * 或者是之前就买入了股票然后没有操作,一直持有) + * 不持有股票状态,这里就有两种卖出股票状态 + * 状态二:保持卖出股票的状态(两天前就卖出了股票,度过一天冷冻期。 + * 或者是前一天就是卖出股票状态,一直没操作) + * 状态三:今天卖出股票 + * 状态四:今天为冷冻期状态,但冷冻期状态不可持续,只有一天! + + */ +int maxProfit(int* prices, int pricesSize) { + if(pricesSize == 0){ + return 0; + } + int dp[pricesSize][4]; + memset(dp, 0, sizeof (int ) * pricesSize * 4); + dp[0][0] = -prices[0]; + for (int i = 1; i < pricesSize; ++i) { + dp[i][0] = max(dp[i - 1][0], max(dp[i - 1][1] - prices[i], dp[i - 1][3] - prices[i])); + dp[i][1] = max(dp[i - 1][1], dp[i - 1][3]); + dp[i][2] = dp[i - 1][0] + prices[i]; + dp[i][3] = dp[i - 1][2]; + } + return max(dp[pricesSize - 1][1], max(dp[pricesSize - 1][2], dp[pricesSize - 1][3])); +} +``` + + + ### Rust: ```rust @@ -486,4 +520,3 @@ impl Solution { - From 5f07ae3b033644dc6cbcf96c23eeef136ed4a5b0 Mon Sep 17 00:00:00 2001 From: a12bb <2713204748@qq.com> Date: Wed, 13 Mar 2024 22:00:54 +0800 Subject: [PATCH 2544/3019] =?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 0300.最长上升子序列的新增C语言实现 --- ...07\345\255\220\345\272\217\345\210\227.md" | 31 ++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git "a/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" "b/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" index 64f75291f5..6d82eae1e9 100644 --- "a/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" @@ -288,6 +288,36 @@ function lengthOfLIS(nums: number[]): number { }; ``` +### C: + +```c +#define max(a, b) ((a) > (b) ? (a) : (b)) + +int lengthOfLIS(int* nums, int numsSize) { + if(numsSize <= 1){ + return numsSize; + } + int dp[numsSize]; + for(int i = 0; i < numsSize; i++){ + dp[i]=1; + } + int result = 1; + for (int i = 1; i < numsSize; ++i) { + for (int j = 0; j < i; ++j) { + if(nums[i] > nums[j]){ + dp[i] = max(dp[i], dp[j] + 1); + } + if(dp[i] > result){ + result = dp[i]; + } + } + } + return result; +} +``` + + + ### Rust: ```rust @@ -311,4 +341,3 @@ pub fn length_of_lis(nums: Vec) -> i32 { - From bf457f49bb1961bc0013283b8b9678363a9a7207 Mon Sep 17 00:00:00 2001 From: a12bb <2713204748@qq.com> Date: Wed, 13 Mar 2024 22:04:23 +0800 Subject: [PATCH 2545/3019] =?UTF-8?q?Update=200674.=E6=9C=80=E9=95=BF?= =?UTF-8?q?=E8=BF=9E=E7=BB=AD=E9=80=92=E5=A2=9E=E5=BA=8F=E5=88=97.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 0674.最长连续递增序列新增C语言实现 --- ...22\345\242\236\345\272\217\345\210\227.md" | 52 ++++++++++++++++++- 1 file changed, 51 insertions(+), 1 deletion(-) diff --git "a/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" "b/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" index 485e321c99..ece629447c 100644 --- "a/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" +++ "b/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" @@ -425,6 +425,57 @@ function findLengthOfLCIS(nums: number[]): number { }; ``` +### C: + +> 动态规划: + +```c +int findLengthOfLCIS(int* nums, int numsSize) { + if(numsSize == 0){ + return 0; + } + int dp[numsSize]; + for(int i = 0; i < numsSize; i++){ + dp[i] = 1; + } + int result = 1; + for (int i = 1; i < numsSize; ++i) { + if(nums[i] > nums[i - 1]){ + dp[i] = dp[i - 1] + 1; + } + if(dp[i] > result){ + result = dp[i]; + } + } + return result; +} +``` + + + +> 贪心: + +```c +int findLengthOfLCIS(int* nums, int numsSize) { + int result = 1; + int count = 1; + if(numsSize == 0){ + return result; + } + for (int i = 1; i < numsSize; ++i) { + if(nums[i] > nums[i - 1]){ + count++; + } else{ + count = 1; + } + if(count > result){ + result = count; + } + } + return result; +} +``` + @@ -432,4 +483,3 @@ function findLengthOfLCIS(nums: number[]): number { - From 00a5515bad938f6c3ff32e3f88c5639346c0f947 Mon Sep 17 00:00:00 2001 From: a12bb <2713204748@qq.com> Date: Wed, 13 Mar 2024 22:05:38 +0800 Subject: [PATCH 2546/3019] =?UTF-8?q?Update=200718.=E6=9C=80=E9=95=BF?= =?UTF-8?q?=E9=87=8D=E5=A4=8D=E5=AD=90=E6=95=B0=E7=BB=84.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 0178.最长重复子数组新增C语言实现 --- ...15\345\255\220\346\225\260\347\273\204.md" | 22 ++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git "a/problems/0718.\346\234\200\351\225\277\351\207\215\345\244\215\345\255\220\346\225\260\347\273\204.md" "b/problems/0718.\346\234\200\351\225\277\351\207\215\345\244\215\345\255\220\346\225\260\347\273\204.md" index 272cf2b2a4..e00b3dedf3 100644 --- "a/problems/0718.\346\234\200\351\225\277\351\207\215\345\244\215\345\255\220\346\225\260\347\273\204.md" +++ "b/problems/0718.\346\234\200\351\225\277\351\207\215\345\244\215\345\255\220\346\225\260\347\273\204.md" @@ -560,10 +560,30 @@ impl Solution { } ``` +### C: + +```c +int findLength(int* nums1, int nums1Size, int* nums2, int nums2Size) { + int dp[nums1Size + 1][nums2Size + 1]; + memset(dp, 0, sizeof(dp)); + int result = 0; + for (int i = 1; i <= nums1Size; ++i) { + for (int j = 1; j <= nums2Size; ++j) { + if(nums1[i - 1] == nums2[j - 1]){ + dp[i][j] = dp[i - 1][j - 1] + 1; + } + if(dp[i][j] > result){ + result = dp[i][j]; + } + } + } + return result; +} +``` +

- From fac689939f7c6a31f11198a4ecccfa3d0f2bee6a Mon Sep 17 00:00:00 2001 From: a12bb <2713204748@qq.com> Date: Wed, 13 Mar 2024 22:08:15 +0800 Subject: [PATCH 2547/3019] =?UTF-8?q?Update=201143.=E6=9C=80=E9=95=BF?= =?UTF-8?q?=E5=85=AC=E5=85=B1=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 1143.最长公共子序列新增C语言实现 --- ...61\345\255\220\345\272\217\345\210\227.md" | 24 ++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git "a/problems/1143.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" "b/problems/1143.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" index f33391c3e6..12bd90f8f4 100644 --- "a/problems/1143.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/1143.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" @@ -376,10 +376,32 @@ impl Solution { } ``` +### C: + +```c +#define max(a, b) ((a) > (b) ? (a) : (b)) + +int longestCommonSubsequence(char* text1, char* text2) { + int text1Len = strlen(text1); + int text2Len = strlen(text2); + int dp[text1Len + 1][text2Len + 1]; + memset(dp, 0, sizeof (dp)); + for (int i = 1; i <= text1Len; ++i) { + for (int j = 1; j <= text2Len; ++j) { + if(text1[i - 1] == text2[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[text1Len][text2Len]; +} +``` +

- From a79bf97d72b1ede1c9c6f6874f705b056677a4b8 Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Thu, 14 Mar 2024 12:09:57 +0800 Subject: [PATCH 2548/3019] Update --- ...7.\350\247\243\346\225\260\347\213\254.md" | 2 +- ...\350\267\203\346\270\270\346\210\217II.md" | 2 +- ...66\350\277\237\346\227\266\351\227\264.md" | 1230 +++++++++++++++++ ...34\347\232\204\350\210\252\347\217\255.md" | 44 + ...17\202\344\274\232dijkstra\345\240\206.md" | 651 +++++++++ ...74\232dijkstra\346\234\264\347\264\240.md" | 733 ++++++++++ ...ama53.\345\257\273\345\256\235-Kruskal.md" | 400 ++++++ .../kama53.\345\257\273\345\256\235-prim.md" | 55 +- problems/qita/shejimoshi.md | 2 + 9 files changed, 3096 insertions(+), 23 deletions(-) create mode 100644 "problems/0743.\347\275\221\347\273\234\345\273\266\350\277\237\346\227\266\351\227\264.md" create mode 100644 "problems/0787.K\347\253\231\344\270\255\350\275\254\345\206\205\346\234\200\344\276\277\345\256\234\347\232\204\350\210\252\347\217\255.md" create mode 100644 "problems/kama47.\345\217\202\344\274\232dijkstra\345\240\206.md" create mode 100644 "problems/kama47.\345\217\202\344\274\232dijkstra\346\234\264\347\264\240.md" create mode 100644 "problems/kama53.\345\257\273\345\256\235-Kruskal.md" rename "problems/kama53.\345\257\273\345\256\235.md" => "problems/kama53.\345\257\273\345\256\235-prim.md" (93%) diff --git "a/problems/0037.\350\247\243\346\225\260\347\213\254.md" "b/problems/0037.\350\247\243\346\225\260\347\213\254.md" index d96e59dfeb..b5f54b1f8f 100644 --- "a/problems/0037.\350\247\243\346\225\260\347\213\254.md" +++ "b/problems/0037.\350\247\243\346\225\260\347\213\254.md" @@ -87,7 +87,7 @@ bool backtracking(vector>& board) ![37.解数独](https://code-thinking-1253855093.file.myqcloud.com/pics/2020111720451790-20230310131822254.png) -在树形图中可以看出我们需要的是一个二维的递归(也就是两个for循环嵌套着递归) +在树形图中可以看出我们需要的是一个二维的递归 (一行一列) **一个for循环遍历棋盘的行,一个for循环遍历棋盘的列,一行一列确定下来之后,递归遍历这个位置放9个数字的可能性!** diff --git "a/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" "b/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" index e006caa2ca..01a9320dc3 100644 --- "a/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" +++ "b/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" @@ -4,7 +4,7 @@

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

-> 相对于[贪心算法:跳跃游戏](https://mp.weixin.qq.com/s/606_N9j8ACKCODoCbV1lSA)难了不少,做好心里准备! +> 相对于[贪心算法:跳跃游戏](https://mp.weixin.qq.com/s/606_N9j8ACKCODoCbV1lSA)难了不少,做好心理准备! # 45.跳跃游戏 II diff --git "a/problems/0743.\347\275\221\347\273\234\345\273\266\350\277\237\346\227\266\351\227\264.md" "b/problems/0743.\347\275\221\347\273\234\345\273\266\350\277\237\346\227\266\351\227\264.md" new file mode 100644 index 0000000000..d94406091b --- /dev/null +++ "b/problems/0743.\347\275\221\347\273\234\345\273\266\350\277\237\346\227\266\351\227\264.md" @@ -0,0 +1,1230 @@ + +# 743.网络延迟时间 + +https://leetcode.cn/problems/network-delay-time/description/ + + +有 n 个网络节点,标记为 1 到 n。 + +给你一个列表 times,表示信号经过 有向 边的传递时间。 times[i] = (ui, vi, wi),其中 ui 是源节点,vi 是目标节点, wi 是一个信号从源节点传递到目标节点的时间。 + +现在,从某个节点 K 发出一个信号。需要多久才能使所有节点都收到信号?如果不能使所有节点收到信号,返回 -1 。 + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240229104105.png) + +提示: + +* 1 <= k <= n <= 100 +* 1 <= times.length <= 6000 +* times[i].length == 3 +* 1 <= ui, vi <= n +* ui != vi +* 0 <= wi <= 100 +* 所有 (ui, vi) 对都 互不相同(即,不含重复边) + +# dijkstra 精讲 + +本题就是求最短路,最短路是图论中的经典问题即:给出一个有向图,一个起点,一个终点,问起点到终点的最短路径。 + +接下来,我们来详细讲解最短路算法中的 dijkstra 算法。 + +dijkstra算法:在有权图(权值非负数)中求从起点到其他节点的最短路径算法。 + +需要注意两点: + +* dijkstra 算法可以同时求 起点到所有节点的最短路径 +* 权值不能为负数 + +(这两点后面我们会讲到) + +如本题示例中的图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240125162647.png) + +起点(节点1)到终点(节点7) 的最短路径是 图中 标记绿线的部分。 + +最短路径的权值为12。 + +其实 dijkstra 算法 和 我们之前讲解的prim算法思路非常接近,如果大家认真学过[prim算法](https://mp.weixin.qq.com/s/yX936hHC6Z10K36Vm1Wl9w),那么理解 Dijkstra 算法会相对容易很多。(这也是我要先讲prim再讲dijkstra的原因) + +dijkstra 算法 同样是贪心的思路,不断寻找距离 源点最近的没有访问过的节点。 + +这里我也给出 **dijkstra三部曲**: + +1. 第一步,选源点到哪个节点近且该节点未被访问过 +2. 第二步,该最近节点被标记访问过 +3. 第三步,更新非访问节点到源点的距离(即更新minDist数组) + +大家此时已经会发现,这和prim算法 怎么这么像呢。 + +我在[prim算法](https://mp.weixin.qq.com/s/yX936hHC6Z10K36Vm1Wl9w)讲解中也给出了三部曲。 prim 和 dijkstra 确实很像,思路也是类似的,这一点我在后面还会详细来讲。 + +在dijkstra算法中,同样有一个数组很重要,起名为:minDist。 + +**minDist数组 用来记录 每一个节点距离源点的最小距离**。 + +理解这一点很重要,也是理解 dijkstra 算法的核心所在。 + +大家现在看着可能有点懵,不知道什么意思。 + +没关系,先让大家有一个印象,对理解后面讲解有帮助。 + +我们先来画图看一下 dijkstra 的工作过程,以本题示例为例: (以下为朴素版dijkstra的思路) + +(**示例中节点编号是从1开始,所以为了让大家看的不晕,minDist数组下标我也从 1 开始计数,下标0 就不使用了,这样 下标和节点标号就可以对应上了,避免大家搞混**) + +## 朴素版dijkstra + +### 模拟过程 + +----------- + +0、初始化 + +minDist数组数值初始化为int最大值。 + +这里在强点一下 **minDist数组的含义:记录所有节点到源点的最短路径**,那么初始化的时候就应该初始为最大值,这样才能在后续出现最短路径的时候及时更新。 + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240130115306.png) + +(图中,max 表示默认值,节点0 不做处理,统一从下标1 开始计算,这样下标和节点数值统一, 方便大家理解,避免搞混) + +源点(节点1) 到自己的距离为0,所以 minDist[1] = 0 + +此时所有节点都没有被访问过,所以 visited数组都为0 + +--------------- + +以下为dijkstra 三部曲 + +1、选源点到哪个节点近且该节点未被访问过 + +源点距离源点最近,距离为0,且未被访问。 + +2、该最近节点被标记访问过 + +标记源点访问过 + +3、更新非访问节点到源点的距离(即更新minDist数组) ,如图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240130115421.png) + + +更新 minDist数组,即:源点(节点1) 到 节点2 和 节点3的距离。 + +* 源点到节点2的最短距离为1,小于原minDist[2]的数值max,更新minDist[2] = 1 +* 源点到节点3的最短距离为4,小于原minDist[3]的数值max,更新minDist[4] = 4 + +可能有录友问:为啥和 minDist[2] 比较? + +再强调一下 minDist[2] 的含义,它表示源点到节点2的最短距离,那么目前我们得到了 源点到节点2的最短距离为1,小于默认值max,所以更新。 minDist[3]的更新同理 + + +------------- + +1、选源点到哪个节点近且该节点未被访问过 + +未访问过的节点中,源点到节点2距离最近,选节点2 + +2、该最近节点被标记访问过 + +节点2被标记访问过 + +3、更新非访问节点到源点的距离(即更新minDist数组) ,如图: + + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240130121240.png) + +更新 minDist数组,即:源点(节点1) 到 节点6 、 节点3 和 节点4的距离。 + +**为什么更新这些节点呢? 怎么不更新其他节点呢**? + +因为 源点(节点1)通过 已经计算过的节点(节点2) 可以链接到的节点 有 节点3,节点4和节点6. + + +更新 minDist数组: + +* 源点到节点6的最短距离为5,小于原minDist[6]的数值max,更新minDist[6] = 5 +* 源点到节点3的最短距离为3,小于原minDist[3]的数值4,更新minDist[3] = 3 +* 源点到节点4的最短距离为6,小于原minDist[4]的数值max,更新minDist[4] = 6 + + + +------------------- + +1、选源点到哪个节点近且该节点未被访问过 + +未访问过的节点中,源点距离哪些节点最近,怎么算的? + +其实就是看 minDist数组里的数值,minDist 记录了 源点到所有节点的最近距离,结合visited数组筛选出未访问的节点就好。 + +从 上面的图,或者 从minDist数组中,我们都能看出 未访问过的节点中,源点(节点1)到节点3距离最近。 + + +2、该最近节点被标记访问过 + +节点3被标记访问过 + +3、更新非访问节点到源点的距离(即更新minDist数组) ,如图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240130120434.png) + +由于节点3的加入,那么源点可以有新的路径链接到节点4 所以更新minDist数组: + +更新 minDist数组: + +* 源点到节点4的最短距离为5,小于原minDist[4]的数值6,更新minDist[4] = 5 + +------------------ + +1、选源点到哪个节点近且该节点未被访问过 + +距离源点最近且没有被访问过的节点,有节点4 和 节点6,距离源点距离都是 5 (minDist[4] = 5,minDist[6] = 5) ,选哪个节点都可以。 + +2、该最近节点被标记访问过 + +节点4被标记访问过 + +3、更新非访问节点到源点的距离(即更新minDist数组) ,如图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240201105335.png) + +由于节点4的加入,那么源点可以链接到节点5 所以更新minDist数组: + +* 源点到节点5的最短距离为8,小于原minDist[5]的数值max,更新minDist[5] = 8 + +-------------- + +1、选源点到哪个节点近且该节点未被访问过 + +距离源点最近且没有被访问过的节点,是节点6,距离源点距离是 5 (minDist[6] = 5) + + +2、该最近节点被标记访问过 + +节点6 被标记访问过 + + +3、更新非访问节点到源点的距离(即更新minDist数组) ,如图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240201110250.png) + +由于节点6的加入,那么源点可以链接到节点7 所以 更新minDist数组: + +* 源点到节点7的最短距离为14,小于原minDist[7]的数值max,更新minDist[7] = 14 + + + +------------------- + +1、选源点到哪个节点近且该节点未被访问过 + +距离源点最近且没有被访问过的节点,是节点5,距离源点距离是 8 (minDist[5] = 8) + +2、该最近节点被标记访问过 + +节点5 被标记访问过 + +3、更新非访问节点到源点的距离(即更新minDist数组) ,如图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240201110651.png) + +由于节点5的加入,那么源点有新的路径可以链接到节点7 所以 更新minDist数组: + +* 源点到节点7的最短距离为12,小于原minDist[7]的数值14,更新minDist[7] = 12 + +----------------- + +1、选源点到哪个节点近且该节点未被访问过 + +距离源点最近且没有被访问过的节点,是节点7(终点),距离源点距离是 12 (minDist[7] = 12) + +2、该最近节点被标记访问过 + +节点7 被标记访问过 + +3、更新非访问节点到源点的距离(即更新minDist数组) ,如图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240201110920.png) + +节点7加入,但节点7到节点7的距离为0,所以 不用更新minDist数组 + +-------------------- + +最后我们要求起点(节点1) 到终点 (节点7)的距离。 + +再来回顾一下minDist数组的含义:记录 每一个节点距离源点的最小距离。 + +那么起到(节点1)到终点(节点7)的最短距离就是 minDist[7] ,按上面举例讲解来说,minDist[7] = 12,节点1 到节点7的最短路径为 12。 + +路径如图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240201111352.png) + +在上面的讲解中,每一步 我都是按照 dijkstra 三部曲来讲解的,理解了这三部曲,代码也就好懂的。 + +### 代码实现 + +本题代码如下,里面的 三部曲 我都做了注释,大家按照我上面的讲解 来看如下代码: + +```CPP +class Solution { +public: + int networkDelayTime(vector>& times, int n, int k) { + + // 注意题目中给的二维数组并不是领接矩阵 + // 需要邻接矩阵来存图 + // 因为本题处理方式是节点标号从1开始,所以数组的大小都是 n+1 + vector> grid(n + 1, vector(n + 1, INT_MAX)); + for(int i = 0; i < times.size(); i++){ + int p1 = times[i][0]; + int p2 = times[i][1]; + grid[p1][p2] = times[i][2]; + } + + // 存储从源点到每个节点的最短距离 + std::vector minDist(n + 1, INT_MAX); + + // 记录顶点是否被访问过 + std::vector visited(n + 1, false); + + minDist[k] = 0; // 起始点到自身的距离为0 + for (int i = 1; i <= n; i++) { + + int minVal = INT_MAX; + int cur = 1; + + // 遍历每个节点,选择未被访问的节点集合中哪个节点到源点的距离最小 + for (int v = 1; v <= n; ++v) { + if (!visited[v] && minDist[v] <= minVal) { + minVal = minDist[v]; + cur = v; + } + } + + visited[cur] = true; // 标记该顶点已被访问 + + for (int v = 1; v <= n; v++) { + if (!visited[v] && grid[cur][v] != INT_MAX && minDist[cur] + grid[cur][v] < minDist[v]) { + minDist[v] = minDist[cur] + grid[cur][v]; + } + } + + + } + // 源点到最远的节点的时间,也就是寻找 源点到所有节点最短路径的最大值 + int result = 0; + for (int i = 1; i <= n; i++) { + if (minDist[i] == INT_MAX) return -1;// 没有路径 + result = max(minDist[i], result); + } + return result; + + } +}; +``` + +* 时间复杂度:O(n^2) +* 空间复杂度:O(n^2) + +### debug方法 + +写这种题目难免会有各种各样的问题,我们如何发现自己的代码是否有问题呢? + +最好的方式就是打日志,本题的话,就是将 minDist 数组打印出来,就可以很明显发现 哪里出问题了。 + +每次选择节点后,minDist数组的变化是否符合预期 ,是否和我上面讲的逻辑是对应的。 + +例如本题,如果想debug的话,打印日志可以这样写: + + +```CPP +class Solution { +public: + int networkDelayTime(vector>& times, int n, int k) { + + // 注意题目中给的二维数组并不是领接矩阵 + // 需要邻接矩阵来存图 + // 因为本题处理方式是节点标号从1开始,所以数组的大小都是 n+1 + vector> grid(n + 1, vector(n + 1, INT_MAX)); + for(int i = 0; i < times.size(); i++){ + int p1 = times[i][0]; + int p2 = times[i][1]; + grid[p1][p2] = times[i][2]; + } + + // 存储从源点到每个节点的最短距离 + std::vector minDist(n + 1, INT_MAX); + + // 记录顶点是否被访问过 + std::vector visited(n + 1, false); + + minDist[k] = 0; // 起始点到自身的距离为0 + for (int i = 1; i <= n; i++) { + + int minVal = INT_MAX; + int cur = 1; + + // 遍历每个节点,选择未被访问的节点集合中哪个节点到源点的距离最小 + for (int v = 1; v <= n; ++v) { + if (!visited[v] && minDist[v] <= minVal) { + minVal = minDist[v]; + cur = v; + } + } + + visited[cur] = true; // 标记该顶点已被访问 + + for (int v = 1; v <= n; v++) { + if (!visited[v] && grid[cur][v] != INT_MAX && minDist[cur] + grid[cur][v] < minDist[v]) { + minDist[v] = minDist[cur] + grid[cur][v]; + } + } + // 打印日志: + cout << "select:" << cur << endl; + for (int v = 1; v <= n; v++) cout << v << ":" << minDist[v] << " "; + cout << endl << endl;; + + + + } + // 源点到最远的节点的时间,也就是寻找 源点到所有节点最短路径的最大值 + int result = 0; + for (int i = 1; i <= n; i++) { + if (minDist[i] == INT_MAX) return -1;// 没有路径 + result = max(minDist[i], result); + } + return result; + + } +}; + + +``` + +打印后的结果: + +``` +select:2 +1:1 2:0 3:1 4:2147483647 + +select:3 +1:1 2:0 3:1 4:2 + +select:1 +1:1 2:0 3:1 4:2 + +select:4 +1:1 2:0 3:1 4:2 +``` + +打印日志可以和上面我讲解的过程进行对比,每一步的结果是完全对应的。 + +所以如果大家如果代码有问题,打日志来debug是最好的方法 + +### 出现负数 + +如果图中边的权值为负数,dijkstra 还合适吗? + +看一下这个图: (有负权值) + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240227104334.png) + +节点1 到 节点5 的最短路径 应该是 节点1 -> 节点2 -> 节点3 -> 节点4 -> 节点5 + +那我们来看dijkstra 求解的路径是什么样的,继续dijkstra 三部曲来模拟 :(dijkstra模拟过程上面已经详细讲过,以下只模拟重要过程,例如如何初始化就省略讲解了) + +----------- + +初始化: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240227104801.png) + +--------------- + +1、选源点到哪个节点近且该节点未被访问过 + +源点距离源点最近,距离为0,且未被访问。 + +2、该最近节点被标记访问过 + +标记源点访问过 + +3、更新非访问节点到源点的距离(即更新minDist数组) ,如图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240227110217.png) + +更新 minDist数组,即:源点(节点1) 到 节点2 和 节点3的距离。 + +* 源点到节点2的最短距离为100,小于原minDist[2]的数值max,更新minDist[2] = 100 +* 源点到节点3的最短距离为1,小于原minDist[3]的数值max,更新minDist[4] = 1 + +------------------- + +1、选源点到哪个节点近且该节点未被访问过 + +源点距离节点3最近,距离为1,且未被访问。 + +2、该最近节点被标记访问过 + +标记节点3访问过 + +3、更新非访问节点到源点的距离(即更新minDist数组) ,如图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240227110330.png) + +由于节点3的加入,那么源点可以有新的路径链接到节点4 所以更新minDist数组: + +* 源点到节点4的最短距离为2,小于原minDist[4]的数值max,更新minDist[4] = 2 + +-------------- + +1、选源点到哪个节点近且该节点未被访问过 + +源点距离节点4最近,距离为2,且未被访问。 + +2、该最近节点被标记访问过 + +标记节点4访问过 + +3、更新非访问节点到源点的距离(即更新minDist数组) ,如图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240227110346.png) + +由于节点4的加入,那么源点可以有新的路径链接到节点5 所以更新minDist数组: + +* 源点到节点5的最短距离为3,小于原minDist[5]的数值max,更新minDist[5] = 5 + +------------ + +1、选源点到哪个节点近且该节点未被访问过 + +源点距离节点5最近,距离为3,且未被访问。 + +2、该最近节点被标记访问过 + +标记节点5访问过 + +3、更新非访问节点到源点的距离(即更新minDist数组) ,如图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240227110405.png) + +节点5的加入,而节点5 没有链接其他节点, 所以不用更新minDist数组,仅标记节点5被访问过了 + +------------ + +1、选源点到哪个节点近且该节点未被访问过 + +源点距离节点2最近,距离为100,且未被访问。 + +2、该最近节点被标记访问过 + +标记节点2访问过 + +3、更新非访问节点到源点的距离(即更新minDist数组) ,如图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240227110711.png) + +-------------- + +至此dijkstra的模拟过程就结束了,根据最后的minDist数组,我们求 节点1 到 节点5 的最短路径的权值总和为 3,路径: 节点1 -> 节点3 -> 节点4 -> 节点5 + +通过以上的过程模拟,我们可以发现 之所以 没有走有负权值的最短路径 是因为 在 访问 节点 2 的时候,节点 3 已经访问过了,就不会再更新了。 + +那有录友可能会想: 我可以改代码逻辑啊,访问过的节点,也让它继续访问不就好了? + +那么访问过的节点还能继续访问会不会有死循环的出现呢?控制逻辑不让其死循环?那特殊情况自己能都想清楚吗?(可以试试,实践出真知) + +对于负权值的出现,大家可以针对某一个场景 不断去修改 dijkstra 的代码,**但最终会发现只是 拆了东墙补西墙**,对dijkstra的补充逻辑只能满足某特定场景最短路求解。 + +对于求解带有负权值的最短路问题,可以使用 Floyd 算法 ,我在后序会详细讲解。 + +## dijkstra与prim算法的区别 + +> 这里再次提示,需要先看我的 [prim算法精讲](https://mp.weixin.qq.com/s/yX936hHC6Z10K36Vm1Wl9w) ,否则可能不知道我下面讲的是什么。 + +大家可以发现 dijkstra的代码看上去 怎么和 prim算法这么像呢。 + +其实代码大体不差,唯一区别在 三部曲中的 第三步: 更新minDist数组 + +因为**prim是求 非访问节点到最小生成树的最小距离,而 dijkstra是求 非访问节点到源点的最小距离**。 + +prim 更新 minDist数组的写法: + + +```CPP +for (int j = 1; j <= v; j++) { + if (!isInTree[j] && grid[cur][j] < minDist[j]) { + minDist[j] = grid[cur][j]; + } +} +``` + +因为 minDist表示 节点到最小生成树的最小距离,所以 新节点cur的加入,只需要 使用 grid[cur][j] ,grid[cur][j] 就表示 cur 加入生成树后,生成树到 节点j 的距离。 + +dijkstra 更新 minDist数组的写法: + +```CPP +for (int v = 1; v <= n; v++) { + if (!visited[v] && grid[cur][v] != INT_MAX && minDist[cur] + grid[cur][v] < minDist[v]) { + minDist[v] = minDist[cur] + grid[cur][v]; + } +} +``` + +因为 minDist表示 节点到源点的最小距离,所以 新节点 cur 的加入,需要使用 源点到cur的距离 (minDist[cur]) + cur 到 节点 v 的距离 (grid[cur][v]),才是 源点到节点v的距离。 + +此时大家可能不禁要想 prim算法 可以有负权值吗? + +当然可以! + +录友们可以自己思考思考一下,这是为什么? + +这里我提示一下:prim算法只需要将节点以最小权值和链接在一起,不涉及到单一路径。 + + + +## 总结 + +本篇,我们深入讲解的dijkstra算法,详细模拟其工作的流程。 + +这里我给出了 **dijkstra 三部曲 来 帮助大家理解 该算法**,不至于 每次写 dijkstra 都是黑盒操作,没有框架没有章法。 + +在给出的代码中,我也按照三部曲的逻辑来给大家注释,只要理解这三部曲,即使 过段时间 对 dijkstra 算法有些遗忘,依然可以写出一个框架出来,然后再去调试细节。 + +对于图论算法,一般代码都比较长,很难写出代码直接可以提交通过,都需要一个debug的过程,所以 **学习如何debug 非常重要**! + +这也是我为什么 在本文中 单独用来讲解 debug方法。 + +本题求的是最短路径和是多少,**同时我们也要掌握 如何把最短路径打印出来**。 + +我还写了大篇幅来讲解 负权值的情况, 只有画图带大家一步一步去 看 出现负权值 dijkstra的求解过程,才能帮助大家理解,问题出在哪里。 + +如果我直接讲:是**因为访问过的节点 不能再访问,导致错过真正的最短路**,我相信大家都不知道我在说啥。 + +最后我还讲解了 dijkstra 和 prim 算法的 相同 与 不同之处, 我在图论的讲解安排中 先讲 prim算法 再讲 dijkstra 是有目的的, **理解这两个算法的相同与不同之处 有助于大家学习的更深入**。 + +而不是 学了 dijkstra 就只看 dijkstra, 算法之间 都是有联系的,多去思考 算法之间的相互联系,会帮助大家思考的更深入,掌握的更彻底。 + +本篇写了这么长,我也只讲解了 朴素版dijkstra,**关于 堆优化dijkstra,我会在下一篇再来给大家详细讲解**。 + + + +## 堆优化版本dijkstra + +> 本篇我们来讲解 堆优化版dijkstra,看本篇之前,一定要先看 我讲解的 朴素版dijkstra,否则本篇会有部分内容看不懂。 + +在上一篇中,我们讲解了朴素版的dijkstra,该解法的时间复杂度为 O(n^2),可以看出时间复杂度 只和 n (节点数量)有关系。 + +如果n很大的话,我们可以换一个角度来优先性能。 + +在 讲解 最小生成树的时候,我们 讲了两个算法,[prim算法](https://mp.weixin.qq.com/s/yX936hHC6Z10K36Vm1Wl9w)(从点的角度来求最小生成树)、[Kruskal算法](https://mp.weixin.qq.com/s/rUVaBjCES_4eSjngceT5bw)(从边的角度来求最小生成树) + +这么在n 很大的时候,也有另一个思考维度,即:从边的数量出发。 + +当 n 很大,边 的数量 也很多的时候(稠密图),那么 上述解法没问题。 + +但 n 很大,边 的数量 很小的时候(稀疏图),是不是可以换成从边的角度来求最短路呢? + +毕竟边的数量少。 + +有的录友可能会想,n (节点数量)很大,边不就多吗? 怎么会边的数量少呢? + +别忘了,谁也没有规定 节点之间一定要有边连接着,例如有一万个节点,只有一条边,这也是一张图。 + +了解背景之后,再来看 解法思路。 + +### 图的存储 + +首先是 图的存储。 + +关于图的存储 主流有两种方式: 邻接矩阵和邻接表 + +#### 邻接矩阵 + +邻接矩阵 使用 二维数组来表示图结构。 邻接矩阵是从节点的角度来表示图,有多少节点就申请多大的二维数组。 + +例如: grid[2][5] = 6,表示 节点 2 链接 节点5 为有向图,节点2 指向 节点5,边的权值为6 (套在题意里,可能是距离为6 或者 消耗为6 等等) + +如果想表示无向图,即:grid[2][5] = 6,grid[5][2] = 6,表示节点2 与 节点5 相互连通,权值为6。 + + +如图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240222110025.png) + +在一个 n (节点数)为8 的图中,就需要申请 8 * 8 这么大的空间,有一条双向边,即:grid[2][5] = 6,grid[5][2] = 6 + +这种表达方式(邻接矩阵) 在 边少,节点多的情况下,会导致申请过大的二维数组,造成空间浪费。 + +而且在寻找节点链接情况的时候,需要遍历整个矩阵,即 n * n 的时间复杂度,同样造成时间浪费。 + +邻接矩阵的优点: + +* 表达方式简单,易于理解 +* 检查任意两个顶点间是否存在边的操作非常快 +* 适合稠密图,在边数接近顶点数平方的图中,邻接矩阵是一种空间效率较高的表示方法。 + +缺点: + +* 遇到稀疏图,会导致申请过大的二维数组造成空间浪费 且遍历 边 的时候需要遍历整个n * n矩阵,造成时间浪费 + +#### 邻接表 + +邻接表 使用 数组 + 链表的方式来表示。 邻接表是从边的数量来表示图,有多少边 才会申请对应大小的链表。 + +邻接表的构造如图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240223103713.png) + +这里表达的图是: + +* 节点1 指向 节点3 和 节点5 +* 节点2 指向 节点4、节点3、节点5 +* 节点3 指向 节点4,节点4指向节点1。 + +有多少边 邻接表才会申请多少个对应的链表节点。 + +从图中可以直观看出 使用 数组 + 链表 来表达 边的链接情况 。 + +邻接表的优点: + +* 对于稀疏图的存储,只需要存储边,空间利用率高 +* 遍历节点链接情况相对容易 + +缺点: + +* 检查任意两个节点间是否存在边,效率相对低,需要 O(V)时间,V表示某节点链接其他节点的数量。 +* 实现相对复杂,不易理解 + +#### 本题图的存储 + +接下来我们继续按照稀疏图的角度来分析本题。 + +在第一个版本的实现思路中,我们提到了三部曲: + +1. 第一步,选源点到哪个节点近且该节点未被访问过 +2. 第二步,该最近节点被标记访问过 +3. 第三步,更新非访问节点到源点的距离(即更新minDist数组) + +在第一个版本的代码中,这三部曲是套在一个 for 循环里,为什么? + +因为我们是从节点的角度来解决问题。 + +三部曲中第一步(选源点到哪个节点近且该节点未被访问过),这个操作本身需要for循环遍历 minDist 来寻找最近的节点。 + +同时我们需要 遍历所有 未访问过的节点,所以 我们从 节点角度出发,代码会有两层for循环,代码是这样的: (注意代码中的注释,标记两层for循环的用处) + +```CPP + +for (int i = 1; i <= n; i++) { // 遍历所有节点,第一层for循环 + + int minVal = INT_MAX; + int cur = 1; + + // 1、选距离源点最近且未访问过的节点 , 第二层for循环 + for (int v = 1; v <= n; ++v) { + if (!visited[v] && minDist[v] < minVal) { + minVal = minDist[v]; + cur = v; + } + } + + visited[cur] = true; // 2、标记该节点已被访问 + + // 3、第三步,更新非访问节点到源点的距离(即更新minDist数组) + for (int v = 1; v <= n; v++) { + if (!visited[v] && grid[cur][v] != INT_MAX && minDist[cur] + grid[cur][v] < minDist[v]) { + minDist[v] = minDist[cur] + grid[cur][v]; + } + } + +} +``` + +那么当从 边 的角度出发, 在处理 三部曲里的第一步(选源点到哪个节点近且该节点未被访问过)的时候 ,我们可以不用去遍历所有节点了。 + +而且 直接把 边(带权值)加入到 小顶堆(利用堆来自动排序),那么每次我们从 堆顶里 取出 边 自然就是 距离源点最近的节点所在的边。 + +这样我们就不需要两层for循环来寻找最近的节点了。 + +了解了大体思路,我们再来看代码实现。 + +首先是 如何使用 邻接表来表述图结构,这是摆在很多录友面前的第一个难题。 + +邻接表用 数组+链表 来表示,代码如下:(C++中 vector 为数组,list 为链表, 定义了 n+1 这么大的数组空间) + +```CPP +vector> grid(n + 1); +``` + +不少录友,不知道 如何定义的数据结构,怎么表示邻接表的,我来给大家画一个图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240223103713.png) + +图中邻接表表示: + +* 节点1 指向 节点3 和 节点5 +* 节点2 指向 节点4、节点3、节点5 +* 节点3 指向 节点4 +* 节点4 指向 节点1 + +大家发现图中的边没有权值,而本题中 我们的边是有权值的,权值怎么表示?在哪里表示? + +所以 在`vector> grid(n + 1);` 中 就不能使用int了,而是需要一个键值对 来存两个数字,一个数表示节点,一个数表示 指向该节点的这条边的权值。 + +那么 代码可以改成这样: (pair 为键值对,可以存放两个int) + +```CPP +vector>> grid(n + 1); +``` + +举例来给大家展示 该代码表达的数据 如下: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240223103904.png) + +* 节点1 指向 节点3 权值为 1 +* 节点1 指向 节点5 权值为 2 +* 节点2 指向 节点4 权值为 7 +* 节点2 指向 节点3 权值为 6 +* 节点2 指向 节点5 权值为 3 +* 节点3 指向 节点4 权值为 3 +* 节点5 指向 节点1 权值为 10 + +这样 我们就把图中权值表示出来了。 + +但是在代码中 使用 `pair` 很容易让我们搞混了,第一个int 表示什么,第二个int表示什么,导致代码可读性很差,或者说别人看你的代码看不懂。 + +那么 可以 定一个类 来取代 `pair` + +类(或者说是结构体)定义如下: + +```CPP +struct Edge { + int to; // 邻接顶点 + int val; // 边的权重 + + Edge(int t, int w): to(t), val(w) {} // 构造函数 +}; +``` + +这个类里有两个成员变量,有对应的命名,这样不容易搞混 两个int的含义。 + +所以 本题中邻接表的定义如下: + +```CPP +struct Edge { + int to; // 链接的节点 + int val; // 边的权重 + + Edge(int t, int w): to(t), val(w) {} // 构造函数 +}; + +vector> grid(n + 1); // 邻接表 + +``` + +(我们在下面的讲解中会直接使用这个邻接表的代码表示方式) + +### 堆优化细节 + +其实思路依然是 dijkstra 三部曲: + +1. 第一步,选源点到哪个节点近且该节点未被访问过 +2. 第二步,该最近节点被标记访问过 +3. 第三步,更新非访问节点到源点的距离(即更新minDist数组) + +只不过之前是 通过遍历节点来遍历边,通过两层for循环来寻找距离源点最近节点。 这次我们直接遍历边,且通过堆来对边进行排序,达到直接选择距离源点最近节点。 + +先来看一下针对这三部曲,如果用 堆来优化。 + +那么三部曲中的第一步(选源点到哪个节点近且该节点未被访问过),我们如何选? + +我们要选择距离源点近的节点(即:该边的权值最小),所以 我们需要一个 小顶堆 来帮我们对边的权值排序,每次从小顶堆堆顶 取边就是权值最小的边。 + +C++定义小顶堆,可以用优先级队列实现,代码如下: + +```CPP +// 小顶堆 +class mycomparison { +public: + bool operator()(const pair& lhs, const pair& rhs) { + return lhs.second > rhs.second; + } +}; +// 优先队列中存放 pair<节点编号,源点到该节点的权值> +priority_queue, vector>, mycomparison> pq; +``` + +(`pair`中 第二个int 为什么要存 源点到该节点的权值,因为 这个小顶堆需要按照权值来排序) + + +有了小顶堆自动对边的权值排序,那我们只需要直接从 堆里取堆顶元素(小顶堆中,最小的权值在上面),就可以取到离源点最近的节点了 (未访问过的节点,不会加到堆里进行排序) + +所以三部曲中的第一步,我们不用 for循环去遍历,直接取堆顶元素: + +```CPP +// pair<节点编号,源点到该节点的权值> +pair cur = pq.top(); pq.pop(); + +``` + +第二步(该最近节点被标记访问过) 这个就是将 节点做访问标记,和 朴素dijkstra 一样 ,代码如下: + +```CPP +// 2. 第二步,该最近节点被标记访问过 +visited[cur.first] = true; + +``` + +(`cur.first` 是指取 `pair` 里的第一个int,即节点编号 ) + +第三步(更新非访问节点到源点的距离),这里的思路 也是 和朴素dijkstra一样的。 + +但很多录友对这里是最懵的,主要是因为两点: + +* 没有理解透彻 dijkstra 的思路 +* 没有理解 邻接表的表达方式 + +我们来回顾一下 朴素dijkstra 在这一步的代码和思路(如果没看过我讲解的朴素版dijkstra,这里会看不懂) + +```CPP + +// 3、第三步,更新非访问节点到源点的距离(即更新minDist数组) +for (int v = 1; v <= n; v++) { + if (!visited[v] && grid[cur][v] != INT_MAX && minDist[cur] + grid[cur][v] < minDist[v]) { + minDist[v] = minDist[cur] + grid[cur][v]; + } +} +``` + +其中 for循环是用来做什么的? 是为了 找到 节点cur 链接指向了哪些节点,因为使用邻接矩阵的表达方式 所以把所有节点遍历一遍。 + +而在邻接表中,我们可以以相对高效的方式知道一个节点链接指向哪些节点。 + +再回顾一下邻接表的构造(数组 + 链表): + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240223103713.png) + +假如 加入的cur 是节点 2, 那么 grid[2] 表示的就是图中第二行链表。 (grid数组的构造我们在 上面 「图的存储」中讲过) + +所以在邻接表中,我们要获取 节点cur 链接指向哪些节点,就是遍历 grid[cur节点编号] 这个链表。 + +这个遍历方式,C++代码如下: + +```CPP +for (Edge edge : grid[cur.first]) +``` + +(如果不知道 Edge 是什么,看上面「图的存储」中邻接表的讲解) + +`cur.first` 就是cur节点编号, 参考上面pair的定义: pair<节点编号,源点到该节点的权值> + +接下来就是更新 非访问节点到源点的距离,代码实现和 朴素dijkstra 是一样的,代码如下: + +```CPP +// 3. 第三步,更新非访问节点到源点的距离(即更新minDist数组) +for (Edge edge : grid[cur.first]) { // 遍历 cur指向的节点,cur指向的节点为 edge + // cur指向的节点edge.to,这条边的权值为 edge.val + if (!visited[edge.to] && minDist[cur.first] + edge.val < minDist[edge.to]) { // 更新minDist + minDist[edge.to] = minDist[cur.first] + edge.val; + pq.push(pair(edge.to, minDist[edge.to])); + } +} +``` + +但为什么思路一样,有的录友能写出朴素dijkstra,但堆优化这里的逻辑就是写不出来呢? + +**主要就是因为对邻接表的表达方式不熟悉**! + +以上代码中,cur 链接指向的节点编号 为 edge.to, 这条边的权值为 edge.val ,如果对这里模糊的就再回顾一下 Edge的定义: + +```CPP +struct Edge { + int to; // 邻接顶点 + int val; // 边的权重 + + Edge(int t, int w): to(t), val(w) {} // 构造函数 +}; +``` + +确定该节点没有被访问过,`!visited[edge.to]` , 目前 源点到cur.first的最短距离(minDist) + cur.first 到 edge.to 的距离 (edge.val) 是否 小于 minDist已经记录的 源点到 edge.to 的距离 (minDist[edge.to]) + +如果是的话,就开始更新操作。 + +即: + +```CPP +if (!visited[edge.to] && minDist[cur.first] + edge.val < minDist[edge.to]) { // 更新minDist + minDist[edge.to] = minDist[cur.first] + edge.val; + pq.push(pair(edge.to, minDist[edge.to])); // 由于cur节点的加入,而新链接的边,加入到优先级队里中 +} + +``` + +同时,由于cur节点的加入,源点又有可以新链接到的边,将这些边加入到优先级队里中。 + + +以上代码思路 和 朴素版dijkstra 是一样一样的,主要区别是两点: + +* 邻接表的表示方式不同 +* 使用优先级队列(小顶堆)来对新链接的边排序 + +### 代码实现 + +堆优化dijkstra完整代码如下: + +```CPP +class Solution { +public: + // 小顶堆 + class mycomparison { + public: + bool operator()(const pair& lhs, const pair& rhs) { + return lhs.second > rhs.second; + } + }; + // 定义一个结构体来表示带权重的边 + struct Edge { + int to; // 邻接顶点 + int val; // 边的权重 + + Edge(int t, int w): to(t), val(w) {} // 构造函数 + }; + int networkDelayTime(vector>& times, int n, int k) { + + + std::vector> grid(n + 1); + for(int i = 0; i < times.size(); i++){ + int p1 = times[i][0]; + int p2 = times[i][1]; + // p1 指向 p2,权值为 times[i][2] + grid[p1].push_back(Edge(p2, times[i][2])); + } + + // 存储从源点到每个节点的最短距离 + std::vector minDist(n + 1, INT_MAX); + + // 记录顶点是否被访问过 + std::vector visited(n + 1, false); + + // 优先队列中存放 pair<节点,源点到该节点的距离> + priority_queue, vector>, mycomparison> pq; + + pq.push(pair(k, 0)); + minDist[k] = 0; // 这个不要忘了 + + while (!pq.empty()) { + // <节点, 源点到该节点的距离> + // 1. 第一步,选源点到哪个节点近且该节点未被访问过 (通过优先级队列来实现) + pair cur = pq.top(); pq.pop(); + + if (visited[cur.first]) continue; + + // 2. 第二步,该最近节点被标记访问过 + visited[cur.first] = true; + + + // 3. 第三步,更新非访问节点到源点的距离(即更新minDist数组) + for (Edge edge : grid[cur.first]) { // 遍历 cur指向的节点,cur指向的节点为 edge + // cur指向的节点edge.to,这条边的权值为 edge.val + if (!visited[edge.to] && minDist[cur.first] + edge.val < minDist[edge.to]) { // 更新minDist + minDist[edge.to] = minDist[cur.first] + edge.val; + pq.push(pair(edge.to, minDist[edge.to])); + } + } + + } + + // 源点到最远的节点的时间,也就是寻找 源点到所有节点最短路径的最大值 + int result = 0; + for (int i = 1; i <= n; i++) { + if (minDist[i] == INT_MAX) return -1;// 没有路径 + result = max(minDist[i], result); + } + return result; + + } +}; + +``` + +* 时间复杂度:O(ElogE) E 为边的数量 +* 空间复杂度:O(N + E) N 为节点的数量 + +堆优化的时间复杂度 只和边的数量有关 和节点数无关,在 优先级队列中 放的也是边。 + +以上代码中,`while (!pq.empty())` 里套了 `for (Edge edge : grid[cur.first])` + +`for` 里 遍历的是 当前节点 cur 所连接边。 + +那 当前节点cur 所连接的边 也是不固定的, 这就让大家分不清,这时间复杂度究竟是多少? + +其实 `for (Edge edge : grid[cur.first])` 里最终的数据走向 是 给队列里添加边。 + +那么跳出局部代码,整个队列 一定是 所有边添加了一次,同时也弹出了一次。 + +所以边添加一次时间复杂度是 O(E), `while (!pq.empty())` 里每次都要弹出一个边来进行操作,在优先级队列(小顶堆)中 弹出一个元素的时间复杂度是 O(logE) ,这是堆排序的时间复杂度。 + +(当然小顶堆里 是 添加元素的时候 排序,还是 取数元素的时候排序,这个无所谓,时间复杂度都是O(E),总是是一定要排序的,而小顶堆里也不会滞留元素,有多少元素添加 一定就有多少元素弹出) + +所以 该算法整体时间复杂度为 O(ElogE) + +网上的不少分析 会把 n (节点的数量)算进来,这个分析是有问题的,举一个极端例子,在n 为 10000,且是有一条边的 图里,以上代码,大家感觉执行了多少次? + +`while (!pq.empty())` 中的 pq 存的是边,其实只执行了一次。 + +所以该算法时间复杂度 和 节点没有关系。 + +至于空间复杂度,邻接表是 数组 + 链表 数组的空间 是 N ,有E条边 就申请对应多少个链表节点,所以是 复杂度是 N + E + +## 拓展 + +当然也有录友可能想 堆优化dijkstra 中 我为什么一定要用邻接表呢,我就用邻接矩阵 行不行 ? + +也行的。 + +但 正是因为稀疏图,所以我们使用堆优化的思路, 如果我们还用 邻接矩阵 去表达这个图的话,就是 一个高效的算法 使用了低效的数据结构,那么 整体算法效率 依然是低的。 + +如果还不清楚为什么要使用 邻接表,可以再看看上面 我在 「图的存储」标题下的讲解。 + +这里我也给出 邻接矩阵版本的堆优化dijkstra代码: + +```CPP +class Solution { +public: + // 小顶堆(按照中的v 来从小到大排序) + class mycomparison { + public: + bool operator()(const pair& lhs, const pair& rhs) { + return lhs.second > rhs.second; + } + }; + int networkDelayTime(vector>& times, int n, int k) { + + // 注意题目中给的二维数组并不是邻接矩阵 + // 需要邻接矩阵来存图 + // 因为本题处理方式是节点标号从1开始,所以数组的大小都是 n+1 + vector> grid(n + 1, vector(n + 1, INT_MAX)); + for(int i = 0; i < times.size(); i++){ + int p1 = times[i][0]; + int p2 = times[i][1]; + grid[p1][p2] = times[i][2]; + } + + // 存储从源点到每个节点的最短距离 + std::vector minDist(n + 1, INT_MAX); + + // 记录顶点是否被访问过 + std::vector visited(n + 1, false); + + // 优先队列中存放 [节点,源点到该节点的距离] + priority_queue, vector>, mycomparison> pq; + + pq.push(pair(k, 0)); + minDist[k] = 0; // 这个不要忘了 + + while (!pq.empty()) { + // <节点, 源点到该节点的距离> + // 1、选距离源点最近且未访问过的节点 + pair cur = pq.top(); pq.pop(); + + if (visited[cur.first]) continue; + + // 2、标记该节点已被访问 + visited[cur.first] = true; + + // 3、第三步,更新非访问节点到源点的距离(即更新minDist数组) + // 遍历 cur 可以链接的节点,更新 minDist[j] + for (int j = 1; j <= n; j++) { + if (!visited[j] && grid[cur.first][j] != INT_MAX && (minDist[cur.first] + grid[cur.first][j] < minDist[j])) { + minDist[j] = minDist[cur.first] + grid[cur.first][j]; + pq.push(pair(j, minDist[j])); + } + } + } + + // 源点到最远的节点的时间,也就是寻找 源点到所有节点最短路径的最大值 + int result = 0; + for (int i = 1; i <= n; i++) { + if (minDist[i] == INT_MAX) return -1;// 没有路径 + result = max(minDist[i], result); + } + + + return result; + + } +}; + +``` + +* 时间复杂度:O(E * (N + logE)) E为边的数量,N为节点数量 +* 空间复杂度:O(log(N^2)) + +`while (!pq.empty())` 时间复杂度为 E ,while 里面 每次取元素 时间复杂度 为 logE,和 一个for循环 时间复杂度 为 N 。 + +所以整体是 E * (N + logE) + + +## 总结 + +在学习一种优化思路的时候,首先就要知道为什么要优化,遇到了什么问题。 + +正如我在开篇就给大家交代清楚 堆优化方式的背景。 + +堆优化的整体思路和 朴素版是大体一样的,区别是 堆优化从边的角度触发,且利用堆来排序。 + +很多录友别说写堆优化 就是看 堆优化的代码也看的很懵。 + +主要是因为两点: + +* 不熟悉邻接表的表达方式 +* 对dijkstra的实现思路还是不熟 + +这是我为什么 本篇花了大力气来讲解 图的存储,就是为了让大家彻底理解邻接表以及邻接表的代码写法。 + +至于 dijkstra的实现思路 ,朴素版 和 堆优化版本 都是 按照 dijkstra 三部曲来的。 + +理解了三部曲,dijkstra 的思路就是清晰的。 + +针对邻接表版本代码 我做了详细的 时间复杂度分析,也让录友们清楚,相对于 朴素版,时间都优化到哪了。 + +最后 我也给出了 邻接矩阵的版本代码,分析了这一版本的必要性以及时间复杂度。 + +至此通过 两篇dijkstra的文章,终于把 dijkstra 讲完了,如果大家对我讲解里所涉及的内容都吃透的话,详细对 dijkstra 算法也就理解到位了。 + + +# Bellman_ford + +```CPP +class Solution { +public: + + int networkDelayTime(vector>& times, int n, int k) { + vector minDist(n + 1 , INT_MAX/2); + minDist[k] = 0; + vector minDist_copy(n); // 用来记录每一次遍历的结果 + for (int i = 1; i <= n + 1; i++) { + minDist_copy = minDist; // 获取上一次计算的结果 + for (auto &f : times) { + int from = f[0]; + int to = f[1]; + int price = f[2]; + if (minDist[to] > minDist_copy[from] + price) minDist[to] = minDist_copy[from] + price; + } + + } + int result = 0; + for (int i = 1;i <= n; i++) { + if (minDist[i] == INT_MAX/2) return -1;// 没有路径 + result = max(minDist[i], result); + } + + return result; + + } +}; + +``` + diff --git "a/problems/0787.K\347\253\231\344\270\255\350\275\254\345\206\205\346\234\200\344\276\277\345\256\234\347\232\204\350\210\252\347\217\255.md" "b/problems/0787.K\347\253\231\344\270\255\350\275\254\345\206\205\346\234\200\344\276\277\345\256\234\347\232\204\350\210\252\347\217\255.md" new file mode 100644 index 0000000000..c7b6236b78 --- /dev/null +++ "b/problems/0787.K\347\253\231\344\270\255\350\275\254\345\206\205\346\234\200\344\276\277\345\256\234\347\232\204\350\210\252\347\217\255.md" @@ -0,0 +1,44 @@ + + +```CPP +class Solution { +public: + int findCheapestPrice(int n, vector>& flights, int src, int dst, int k) { + vector minDist(n , INT_MAX/2); + minDist[src] = 0; + vector minDist_copy(n); // 用来记录每一次遍历的结果 + for (int i = 1; i <= k + 1; i++) { + minDist_copy = minDist; // 获取上一次计算的结果 + for (auto &f : flights) { + int from = f[0]; + int to = f[1]; + int price = f[2]; + if (minDist[to] > minDist_copy[from] + price) minDist[to] = minDist_copy[from] + price; + } + + } + int result = minDist[dst] == INT_MAX/2 ? -1 : minDist[dst]; + return result; + } +}; +``` + +```CPP +class Solution { +public: + int findCheapestPrice(int n, vector>& flights, int src, int dst, int k) { + vector minDist(n , INT_MAX/2); + minDist[src] = 0; + for (int i = 1; i <= k + 1; i++) { + for (auto &f : flights) { + int from = f[0]; + int to = f[1]; + int price = f[2]; + if (minDist[to] > minDist[from] + price) minDist[to] = minDist[from] + price; + } + } + int result = minDist[dst] == INT_MAX/2 ? -1 : minDist[dst]; + return result; + } +}; +``` diff --git "a/problems/kama47.\345\217\202\344\274\232dijkstra\345\240\206.md" "b/problems/kama47.\345\217\202\344\274\232dijkstra\345\240\206.md" new file mode 100644 index 0000000000..0cb5930182 --- /dev/null +++ "b/problems/kama47.\345\217\202\344\274\232dijkstra\345\240\206.md" @@ -0,0 +1,651 @@ + +# dijkstra(堆优化版)精讲 + +[题目链接](https://kamacoder.com/problempage.php?pid=1047) + +【题目描述】 + +小明是一位科学家,他需要参加一场重要的国际科学大会,以展示自己的最新研究成果。 + +小明的起点是第一个车站,终点是最后一个车站。然而,途中的各个车站之间的道路状况、交通拥堵程度以及可能的自然因素(如天气变化)等不同,这些因素都会影响每条路径的通行时间。 + +小明希望能选择一条花费时间最少的路线,以确保他能够尽快到达目的地。 + +【输入描述】 + +第一行包含两个正整数,第一个正整数 N 表示一共有 N 个公共汽车站,第二个正整数 M 表示有 M 条公路。 + +接下来为 M 行,每行包括三个整数,S、E 和 V,代表了从 S 车站可以单向直达 E 车站,并且需要花费 V 单位的时间。 + +【输出描述】 + +输出一个整数,代表小明在途中和其他科学家和科研团队交流所花费的最少时间。 + +输入示例 + +``` +7 9 +1 2 1 +1 3 4 +2 3 2 +2 4 5 +3 4 2 +4 5 3 +2 6 4 +5 7 4 +6 7 9 +``` + +输出示例:12 + +【提示信息】 + +能够到达的情况: + +如下图所示,起始车站为 1 号车站,终点车站为 7 号车站,绿色路线为最短的路线,路线总长度为 12,则输出 12。 + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240227101345.png) + +不能到达的情况: + +如下图所示,当从起始车站不能到达终点车站时,则输出 -1。 + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240227101401.png) + +数据范围: + +1 <= N <= 500; +1 <= M <= 5000; + + +## 思路 + +> 本篇我们来讲解 堆优化版dijkstra,看本篇之前,一定要先看 我讲解的 朴素版dijkstra,否则本篇会有部分内容看不懂。 + +在上一篇中,我们讲解了朴素版的dijkstra,该解法的时间复杂度为 O(n^2),可以看出时间复杂度 只和 n (节点数量)有关系。 + +如果n很大的话,我们可以换一个角度来优先性能。 + +在 讲解 最小生成树的时候,我们 讲了两个算法,[prim算法](https://mp.weixin.qq.com/s/yX936hHC6Z10K36Vm1Wl9w)(从点的角度来求最小生成树)、[Kruskal算法](https://mp.weixin.qq.com/s/rUVaBjCES_4eSjngceT5bw)(从边的角度来求最小生成树) + +这么在n 很大的时候,也有另一个思考维度,即:从边的数量出发。 + +当 n 很大,边 的数量 也很多的时候(稠密图),那么 上述解法没问题。 + +但 n 很大,边 的数量 很小的时候(稀疏图),是不是可以换成从边的角度来求最短路呢? + +毕竟边的数量少。 + +有的录友可能会想,n (节点数量)很大,边不就多吗? 怎么会边的数量少呢? + +别忘了,谁也没有规定 节点之间一定要有边连接着,例如有一万个节点,只有一条边,这也是一张图。 + +了解背景之后,再来看 解法思路。 + +### 图的存储 + +首先是 图的存储。 + +关于图的存储 主流有两种方式: 邻接矩阵和邻接表 + +#### 邻接矩阵 + +邻接矩阵 使用 二维数组来表示图结构。 邻接矩阵是从节点的角度来表示图,有多少节点就申请多大的二维数组。 + +例如: grid[2][5] = 6,表示 节点 2 链接 节点5 为有向图,节点2 指向 节点5,边的权值为6 (套在题意里,可能是距离为6 或者 消耗为6 等等) + +如果想表示无向图,即:grid[2][5] = 6,grid[5][2] = 6,表示节点2 与 节点5 相互连通,权值为6。 + + +如图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240222110025.png) + +在一个 n (节点数)为8 的图中,就需要申请 8 * 8 这么大的空间,有一条双向边,即:grid[2][5] = 6,grid[5][2] = 6 + +这种表达方式(邻接矩阵) 在 边少,节点多的情况下,会导致申请过大的二维数组,造成空间浪费。 + +而且在寻找节点链接情况的时候,需要遍历整个矩阵,即 n * n 的时间复杂度,同样造成时间浪费。 + +邻接矩阵的优点: + +* 表达方式简单,易于理解 +* 检查任意两个顶点间是否存在边的操作非常快 +* 适合稠密图,在边数接近顶点数平方的图中,邻接矩阵是一种空间效率较高的表示方法。 + +缺点: + +* 遇到稀疏图,会导致申请过大的二维数组造成空间浪费 且遍历 边 的时候需要遍历整个n * n矩阵,造成时间浪费 + +#### 邻接表 + +邻接表 使用 数组 + 链表的方式来表示。 邻接表是从边的数量来表示图,有多少边 才会申请对应大小的链表。 + +邻接表的构造如图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240223103713.png) + +这里表达的图是: + +* 节点1 指向 节点3 和 节点5 +* 节点2 指向 节点4、节点3、节点5 +* 节点3 指向 节点4,节点4指向节点1。 + +有多少边 邻接表才会申请多少个对应的链表节点。 + +从图中可以直观看出 使用 数组 + 链表 来表达 边的链接情况 。 + +邻接表的优点: + +* 对于稀疏图的存储,只需要存储边,空间利用率高 +* 遍历节点链接情况相对容易 + +缺点: + +* 检查任意两个节点间是否存在边,效率相对低,需要 O(V)时间,V表示某节点链接其他节点的数量。 +* 实现相对复杂,不易理解 + +#### 本题图的存储 + +接下来我们继续按照稀疏图的角度来分析本题。 + +在第一个版本的实现思路中,我们提到了三部曲: + +1. 第一步,选源点到哪个节点近且该节点未被访问过 +2. 第二步,该最近节点被标记访问过 +3. 第三步,更新非访问节点到源点的距离(即更新minDist数组) + +在第一个版本的代码中,这三部曲是套在一个 for 循环里,为什么? + +因为我们是从节点的角度来解决问题。 + +三部曲中第一步(选源点到哪个节点近且该节点未被访问过),这个操作本身需要for循环遍历 minDist 来寻找最近的节点。 + +同时我们需要 遍历所有 未访问过的节点,所以 我们从 节点角度出发,代码会有两层for循环,代码是这样的: (注意代码中的注释,标记两层for循环的用处) + +```CPP + +for (int i = 1; i <= n; i++) { // 遍历所有节点,第一层for循环 + + int minVal = INT_MAX; + int cur = 1; + + // 1、选距离源点最近且未访问过的节点 , 第二层for循环 + for (int v = 1; v <= n; ++v) { + if (!visited[v] && minDist[v] < minVal) { + minVal = minDist[v]; + cur = v; + } + } + + visited[cur] = true; // 2、标记该节点已被访问 + + // 3、第三步,更新非访问节点到源点的距离(即更新minDist数组) + for (int v = 1; v <= n; v++) { + if (!visited[v] && grid[cur][v] != INT_MAX && minDist[cur] + grid[cur][v] < minDist[v]) { + minDist[v] = minDist[cur] + grid[cur][v]; + } + } + +} +``` + +那么当从 边 的角度出发, 在处理 三部曲里的第一步(选源点到哪个节点近且该节点未被访问过)的时候 ,我们可以不用去遍历所有节点了。 + +而且 直接把 边(带权值)加入到 小顶堆(利用堆来自动排序),那么每次我们从 堆顶里 取出 边 自然就是 距离源点最近的节点所在的边。 + +这样我们就不需要两层for循环来寻找最近的节点了。 + +了解了大体思路,我们再来看代码实现。 + +首先是 如何使用 邻接表来表述图结构,这是摆在很多录友面前的第一个难题。 + +邻接表用 数组+链表 来表示,代码如下:(C++中 vector 为数组,list 为链表, 定义了 n+1 这么大的数组空间) + +```CPP +vector> grid(n + 1); +``` + +不少录友,不知道 如何定义的数据结构,怎么表示邻接表的,我来给大家画一个图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240223103713.png) + +图中邻接表表示: + +* 节点1 指向 节点3 和 节点5 +* 节点2 指向 节点4、节点3、节点5 +* 节点3 指向 节点4 +* 节点4 指向 节点1 + +大家发现图中的边没有权值,而本题中 我们的边是有权值的,权值怎么表示?在哪里表示? + +所以 在`vector> grid(n + 1);` 中 就不能使用int了,而是需要一个键值对 来存两个数字,一个数表示节点,一个数表示 指向该节点的这条边的权值。 + +那么 代码可以改成这样: (pair 为键值对,可以存放两个int) + +```CPP +vector>> grid(n + 1); +``` + +举例来给大家展示 该代码表达的数据 如下: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240223103904.png) + +* 节点1 指向 节点3 权值为 1 +* 节点1 指向 节点5 权值为 2 +* 节点2 指向 节点4 权值为 7 +* 节点2 指向 节点3 权值为 6 +* 节点2 指向 节点5 权值为 3 +* 节点3 指向 节点4 权值为 3 +* 节点5 指向 节点1 权值为 10 + +这样 我们就把图中权值表示出来了。 + +但是在代码中 使用 `pair` 很容易让我们搞混了,第一个int 表示什么,第二个int表示什么,导致代码可读性很差,或者说别人看你的代码看不懂。 + +那么 可以 定一个类 来取代 `pair` + +类(或者说是结构体)定义如下: + +```CPP +struct Edge { + int to; // 邻接顶点 + int val; // 边的权重 + + Edge(int t, int w): to(t), val(w) {} // 构造函数 +}; +``` + +这个类里有两个成员变量,有对应的命名,这样不容易搞混 两个int的含义。 + +所以 本题中邻接表的定义如下: + +```CPP +struct Edge { + int to; // 链接的节点 + int val; // 边的权重 + + Edge(int t, int w): to(t), val(w) {} // 构造函数 +}; + +vector> grid(n + 1); // 邻接表 + +``` + +(我们在下面的讲解中会直接使用这个邻接表的代码表示方式) + +### 堆优化细节 + +其实思路依然是 dijkstra 三部曲: + +1. 第一步,选源点到哪个节点近且该节点未被访问过 +2. 第二步,该最近节点被标记访问过 +3. 第三步,更新非访问节点到源点的距离(即更新minDist数组) + +只不过之前是 通过遍历节点来遍历边,通过两层for循环来寻找距离源点最近节点。 这次我们直接遍历边,且通过堆来对边进行排序,达到直接选择距离源点最近节点。 + +先来看一下针对这三部曲,如果用 堆来优化。 + +那么三部曲中的第一步(选源点到哪个节点近且该节点未被访问过),我们如何选? + +我们要选择距离源点近的节点(即:该边的权值最小),所以 我们需要一个 小顶堆 来帮我们对边的权值排序,每次从小顶堆堆顶 取边就是权值最小的边。 + +C++定义小顶堆,可以用优先级队列实现,代码如下: + +```CPP +// 小顶堆 +class mycomparison { +public: + bool operator()(const pair& lhs, const pair& rhs) { + return lhs.second > rhs.second; + } +}; +// 优先队列中存放 pair<节点编号,源点到该节点的权值> +priority_queue, vector>, mycomparison> pq; +``` + +(`pair`中 第二个int 为什么要存 源点到该节点的权值,因为 这个小顶堆需要按照权值来排序) + + +有了小顶堆自动对边的权值排序,那我们只需要直接从 堆里取堆顶元素(小顶堆中,最小的权值在上面),就可以取到离源点最近的节点了 (未访问过的节点,不会加到堆里进行排序) + +所以三部曲中的第一步,我们不用 for循环去遍历,直接取堆顶元素: + +```CPP +// pair<节点编号,源点到该节点的权值> +pair cur = pq.top(); pq.pop(); + +``` + +第二步(该最近节点被标记访问过) 这个就是将 节点做访问标记,和 朴素dijkstra 一样 ,代码如下: + +```CPP +// 2. 第二步,该最近节点被标记访问过 +visited[cur.first] = true; + +``` + +(`cur.first` 是指取 `pair` 里的第一个int,即节点编号 ) + +第三步(更新非访问节点到源点的距离),这里的思路 也是 和朴素dijkstra一样的。 + +但很多录友对这里是最懵的,主要是因为两点: + +* 没有理解透彻 dijkstra 的思路 +* 没有理解 邻接表的表达方式 + +我们来回顾一下 朴素dijkstra 在这一步的代码和思路(如果没看过我讲解的朴素版dijkstra,这里会看不懂) + +```CPP + +// 3、第三步,更新非访问节点到源点的距离(即更新minDist数组) +for (int v = 1; v <= n; v++) { + if (!visited[v] && grid[cur][v] != INT_MAX && minDist[cur] + grid[cur][v] < minDist[v]) { + minDist[v] = minDist[cur] + grid[cur][v]; + } +} +``` + +其中 for循环是用来做什么的? 是为了 找到 节点cur 链接指向了哪些节点,因为使用邻接矩阵的表达方式 所以把所有节点遍历一遍。 + +而在邻接表中,我们可以以相对高效的方式知道一个节点链接指向哪些节点。 + +再回顾一下邻接表的构造(数组 + 链表): + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240223103713.png) + +假如 加入的cur 是节点 2, 那么 grid[2] 表示的就是图中第二行链表。 (grid数组的构造我们在 上面 「图的存储」中讲过) + +所以在邻接表中,我们要获取 节点cur 链接指向哪些节点,就是遍历 grid[cur节点编号] 这个链表。 + +这个遍历方式,C++代码如下: + +```CPP +for (Edge edge : grid[cur.first]) +``` + +(如果不知道 Edge 是什么,看上面「图的存储」中邻接表的讲解) + +`cur.first` 就是cur节点编号, 参考上面pair的定义: pair<节点编号,源点到该节点的权值> + +接下来就是更新 非访问节点到源点的距离,代码实现和 朴素dijkstra 是一样的,代码如下: + +```CPP +// 3. 第三步,更新非访问节点到源点的距离(即更新minDist数组) +for (Edge edge : grid[cur.first]) { // 遍历 cur指向的节点,cur指向的节点为 edge + // cur指向的节点edge.to,这条边的权值为 edge.val + if (!visited[edge.to] && minDist[cur.first] + edge.val < minDist[edge.to]) { // 更新minDist + minDist[edge.to] = minDist[cur.first] + edge.val; + pq.push(pair(edge.to, minDist[edge.to])); + } +} +``` + +但为什么思路一样,有的录友能写出朴素dijkstra,但堆优化这里的逻辑就是写不出来呢? + +**主要就是因为对邻接表的表达方式不熟悉**! + +以上代码中,cur 链接指向的节点编号 为 edge.to, 这条边的权值为 edge.val ,如果对这里模糊的就再回顾一下 Edge的定义: + +```CPP +struct Edge { + int to; // 邻接顶点 + int val; // 边的权重 + + Edge(int t, int w): to(t), val(w) {} // 构造函数 +}; +``` + +确定该节点没有被访问过,`!visited[edge.to]` , 目前 源点到cur.first的最短距离(minDist) + cur.first 到 edge.to 的距离 (edge.val) 是否 小于 minDist已经记录的 源点到 edge.to 的距离 (minDist[edge.to]) + +如果是的话,就开始更新操作。 + +即: + +```CPP +if (!visited[edge.to] && minDist[cur.first] + edge.val < minDist[edge.to]) { // 更新minDist + minDist[edge.to] = minDist[cur.first] + edge.val; + pq.push(pair(edge.to, minDist[edge.to])); // 由于cur节点的加入,而新链接的边,加入到优先级队里中 +} + +``` + +同时,由于cur节点的加入,源点又有可以新链接到的边,将这些边加入到优先级队里中。 + + +以上代码思路 和 朴素版dijkstra 是一样一样的,主要区别是两点: + +* 邻接表的表示方式不同 +* 使用优先级队列(小顶堆)来对新链接的边排序 + +### 代码实现 + +堆优化dijkstra完整代码如下: + +```CPP +#include +#include +#include +#include +#include +using namespace std; +// 小顶堆 +class mycomparison { +public: + bool operator()(const pair& lhs, const pair& rhs) { + return lhs.second > rhs.second; + } +}; +// 定义一个结构体来表示带权重的边 +struct Edge { + int to; // 邻接顶点 + int val; // 边的权重 + + Edge(int t, int w): to(t), val(w) {} // 构造函数 +}; + +int main() { + int n, m, p1, p2, val; + cin >> n >> m; + + vector> grid(n + 1); + + for(int i = 0; i < m; i++){ + cin >> p1 >> p2 >> val; + // p1 指向 p2,权值为 val + grid[p1].push_back(Edge(p2, val)); + + } + + int start = 1; // 起点 + int end = n; // 终点 + + // 存储从源点到每个节点的最短距离 + std::vector minDist(n + 1, INT_MAX); + + // 记录顶点是否被访问过 + std::vector visited(n + 1, false); + + // 优先队列中存放 pair<节点,源点到该节点的权值> + priority_queue, vector>, mycomparison> pq; + + + // 初始化队列,源点到源点的距离为0,所以初始为0 + pq.push(pair(start, 0)); + + minDist[start] = 0; // 起始点到自身的距离为0 + + while (!pq.empty()) { + // 1. 第一步,选源点到哪个节点近且该节点未被访问过 (通过优先级队列来实现) + // <节点, 源点到该节点的距离> + pair cur = pq.top(); pq.pop(); + + if (visited[cur.first]) continue; + + // 2. 第二步,该最近节点被标记访问过 + visited[cur.first] = true; + + // 3. 第三步,更新非访问节点到源点的距离(即更新minDist数组) + for (Edge edge : grid[cur.first]) { // 遍历 cur指向的节点,cur指向的节点为 edge + // cur指向的节点edge.to,这条边的权值为 edge.val + if (!visited[edge.to] && minDist[cur.first] + edge.val < minDist[edge.to]) { // 更新minDist + minDist[edge.to] = minDist[cur.first] + edge.val; + pq.push(pair(edge.to, minDist[edge.to])); + } + } + + } + + if (minDist[end] == INT_MAX) cout << -1 << endl; // 不能到达终点 + else cout << minDist[end] << endl; // 到达终点最短路径 +} + +``` + +* 时间复杂度:O(ElogE) E 为边的数量 +* 空间复杂度:O(N + E) N 为节点的数量 + +堆优化的时间复杂度 只和边的数量有关 和节点数无关,在 优先级队列中 放的也是边。 + +以上代码中,`while (!pq.empty())` 里套了 `for (Edge edge : grid[cur.first])` + +`for` 里 遍历的是 当前节点 cur 所连接边。 + +那 当前节点cur 所连接的边 也是不固定的, 这就让大家分不清,这时间复杂度究竟是多少? + +其实 `for (Edge edge : grid[cur.first])` 里最终的数据走向 是 给队列里添加边。 + +那么跳出局部代码,整个队列 一定是 所有边添加了一次,同时也弹出了一次。 + +所以边添加一次时间复杂度是 O(E), `while (!pq.empty())` 里每次都要弹出一个边来进行操作,在优先级队列(小顶堆)中 弹出一个元素的时间复杂度是 O(logE) ,这是堆排序的时间复杂度。 + +(当然小顶堆里 是 添加元素的时候 排序,还是 取数元素的时候排序,这个无所谓,时间复杂度都是O(E),总是是一定要排序的,而小顶堆里也不会滞留元素,有多少元素添加 一定就有多少元素弹出) + +所以 该算法整体时间复杂度为 O(ElogE) + +网上的不少分析 会把 n (节点的数量)算进来,这个分析是有问题的,举一个极端例子,在n 为 10000,且是有一条边的 图里,以上代码,大家感觉执行了多少次? + +`while (!pq.empty())` 中的 pq 存的是边,其实只执行了一次。 + +所以该算法时间复杂度 和 节点没有关系。 + +至于空间复杂度,邻接表是 数组 + 链表 数组的空间 是 N ,有E条边 就申请对应多少个链表节点,所以是 复杂度是 N + E + +## 拓展 + +当然也有录友可能想 堆优化dijkstra 中 我为什么一定要用邻接表呢,我就用邻接矩阵 行不行 ? + +也行的。 + +但 正是因为稀疏图,所以我们使用堆优化的思路, 如果我们还用 邻接矩阵 去表达这个图的话,就是 一个高效的算法 使用了低效的数据结构,那么 整体算法效率 依然是低的。 + +如果还不清楚为什么要使用 邻接表,可以再看看上面 我在 「图的存储」标题下的讲解。 + +这里我也给出 邻接矩阵版本的堆优化dijkstra代码: + +```CPP +#include +#include +#include +#include +using namespace std; +// 小顶堆 +class mycomparison { +public: + bool operator()(const pair& lhs, const pair& rhs) { + return lhs.second > rhs.second; + } +}; + +int main() { + int n, m, p1, p2, val; + cin >> n >> m; + + vector> grid(n + 1, vector(n + 1, INT_MAX)); + + for(int i = 0; i < m; i++){ + cin >> p1 >> p2 >> val; + // p1 指向 p2,权值为 val + grid[p1][p2] = val; + } + + int start = 1; // 起点 + int end = n; // 终点 + + // 存储从源点到每个节点的最短距离 + std::vector minDist(n + 1, INT_MAX); + + // 记录顶点是否被访问过 + std::vector visited(n + 1, false); + + // 优先队列中存放 pair<节点,源点到该节点的距离> + priority_queue, vector>, mycomparison> pq; + + + // 初始化队列,源点到源点的距离为0,所以初始为0 + pq.push(pair(start, 0)); + + minDist[start] = 0; // 起始点到自身的距离为0 + + while (!pq.empty()) { + // <节点, 源点到该节点的距离> + // 1、选距离源点最近且未访问过的节点 + pair cur = pq.top(); pq.pop(); + + if (visited[cur.first]) continue; + + visited[cur.first] = true; // 2、标记该节点已被访问 + + // 3、第三步,更新非访问节点到源点的距离(即更新minDist数组) + for (int j = 1; j <= n; j++) { + if (!visited[j] && grid[cur.first][j] != INT_MAX && (minDist[cur.first] + grid[cur.first][j] < minDist[j])) { + minDist[j] = minDist[cur.first] + grid[cur.first][j]; + pq.push(pair(j, minDist[j])); + } + } + } + + if (minDist[end] == INT_MAX) cout << -1 << endl; // 不能到达终点 + else cout << minDist[end] << endl; // 到达终点最短路径 + +} + +``` + +* 时间复杂度:O(E * (N + logE)) E为边的数量,N为节点数量 +* 空间复杂度:O(log(N^2)) + +`while (!pq.empty())` 时间复杂度为 E ,while 里面 每次取元素 时间复杂度 为 logE,和 一个for循环 时间复杂度 为 N 。 + +所以整体是 E * (N + logE) + + +## 总结 + +在学习一种优化思路的时候,首先就要知道为什么要优化,遇到了什么问题。 + +正如我在开篇就给大家交代清楚 堆优化方式的背景。 + +堆优化的整体思路和 朴素版是大体一样的,区别是 堆优化从边的角度触发,且利用堆来排序。 + +很多录友别说写堆优化 就是看 堆优化的代码也看的很懵。 + +主要是因为两点: + +* 不熟悉邻接表的表达方式 +* 对dijkstra的实现思路还是不熟 + +这是我为什么 本篇花了大力气来讲解 图的存储,就是为了让大家彻底理解邻接表以及邻接表的代码写法。 + +至于 dijkstra的实现思路 ,朴素版 和 堆优化版本 都是 按照 dijkstra 三部曲来的。 + +理解了三部曲,dijkstra 的思路就是清晰的。 + +针对邻接表版本代码 我做了详细的 时间复杂度分析,也让录友们清楚,相对于 朴素版,时间都优化到哪了。 + +最后 我也给出了 邻接矩阵的版本代码,分析了这一版本的必要性以及时间复杂度。 + +至此通过 两篇dijkstra的文章,终于把 dijkstra 讲完了,如果大家对我讲解里所涉及的内容都吃透的话,详细对 dijkstra 算法也就理解到位了。 + + + diff --git "a/problems/kama47.\345\217\202\344\274\232dijkstra\346\234\264\347\264\240.md" "b/problems/kama47.\345\217\202\344\274\232dijkstra\346\234\264\347\264\240.md" new file mode 100644 index 0000000000..957d471afd --- /dev/null +++ "b/problems/kama47.\345\217\202\344\274\232dijkstra\346\234\264\347\264\240.md" @@ -0,0 +1,733 @@ + +# dijkstra(朴素版)精讲 + +[题目链接](https://kamacoder.com/problempage.php?pid=1047) + +【题目描述】 + +小明是一位科学家,他需要参加一场重要的国际科学大会,以展示自己的最新研究成果。 + +小明的起点是第一个车站,终点是最后一个车站。然而,途中的各个车站之间的道路状况、交通拥堵程度以及可能的自然因素(如天气变化)等不同,这些因素都会影响每条路径的通行时间。 + +小明希望能选择一条花费时间最少的路线,以确保他能够尽快到达目的地。 + +【输入描述】 + +第一行包含两个正整数,第一个正整数 N 表示一共有 N 个公共汽车站,第二个正整数 M 表示有 M 条公路。 + +接下来为 M 行,每行包括三个整数,S、E 和 V,代表了从 S 车站可以单向直达 E 车站,并且需要花费 V 单位的时间。 + +【输出描述】 + +输出一个整数,代表小明在途中和其他科学家和科研团队交流所花费的最少时间。 + +输入示例 + +``` +7 9 +1 2 1 +1 3 4 +2 3 2 +2 4 5 +3 4 2 +4 5 3 +2 6 4 +5 7 4 +6 7 9 +``` + +输出示例:12 + +【提示信息】 + +能够到达的情况: + +如下图所示,起始车站为 1 号车站,终点车站为 7 号车站,绿色路线为最短的路线,路线总长度为 12,则输出 12。 + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240227101345.png) + +不能到达的情况: + +如下图所示,当从起始车站不能到达终点车站时,则输出 -1。 + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240227101401.png) + +数据范围: + +1 <= N <= 500; +1 <= M <= 5000; + +## 思路 + +本题就是求最短路,最短路是图论中的经典问题即:给出一个有向图,一个起点,一个终点,问起点到终点的最短路径。 + +接下来,我们来详细讲解最短路算法中的 dijkstra 算法。 + +dijkstra算法:在有权图(权值非负数)中求从起点到其他节点的最短路径算法。 + +需要注意两点: + +* dijkstra 算法可以同时求 起点到所有节点的最短路径 +* 权值不能为负数 + +(这两点后面我们会讲到) + +如本题示例中的图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240125162647.png) + +起点(节点1)到终点(节点7) 的最短路径是 图中 标记绿线的部分。 + +最短路径的权值为12。 + +其实 dijkstra 算法 和 我们之前讲解的prim算法思路非常接近,如果大家认真学过[prim算法](https://mp.weixin.qq.com/s/yX936hHC6Z10K36Vm1Wl9w),那么理解 Dijkstra 算法会相对容易很多。(这也是我要先讲prim再讲dijkstra的原因) + +dijkstra 算法 同样是贪心的思路,不断寻找距离 源点最近的没有访问过的节点。 + +这里我也给出 **dijkstra三部曲**: + +1. 第一步,选源点到哪个节点近且该节点未被访问过 +2. 第二步,该最近节点被标记访问过 +3. 第三步,更新非访问节点到源点的距离(即更新minDist数组) + +大家此时已经会发现,这和prim算法 怎么这么像呢。 + +我在[prim算法](https://mp.weixin.qq.com/s/yX936hHC6Z10K36Vm1Wl9w)讲解中也给出了三部曲。 prim 和 dijkstra 确实很像,思路也是类似的,这一点我在后面还会详细来讲。 + +在dijkstra算法中,同样有一个数组很重要,起名为:minDist。 + +**minDist数组 用来记录 每一个节点距离源点的最小距离**。 + +理解这一点很重要,也是理解 dijkstra 算法的核心所在。 + +大家现在看着可能有点懵,不知道什么意思。 + +没关系,先让大家有一个印象,对理解后面讲解有帮助。 + +我们先来画图看一下 dijkstra 的工作过程,以本题示例为例: (以下为朴素版dijkstra的思路) + +(**示例中节点编号是从1开始,所以为了让大家看的不晕,minDist数组下标我也从 1 开始计数,下标0 就不使用了,这样 下标和节点标号就可以对应上了,避免大家搞混**) + +## 朴素版dijkstra + +### 模拟过程 + +----------- + +0、初始化 + +minDist数组数值初始化为int最大值。 + +这里在强点一下 **minDist数组的含义:记录所有节点到源点的最短路径**,那么初始化的时候就应该初始为最大值,这样才能在后续出现最短路径的时候及时更新。 + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240130115306.png) + +(图中,max 表示默认值,节点0 不做处理,统一从下标1 开始计算,这样下标和节点数值统一, 方便大家理解,避免搞混) + +源点(节点1) 到自己的距离为0,所以 minDist[1] = 0 + +此时所有节点都没有被访问过,所以 visited数组都为0 + +--------------- + +以下为dijkstra 三部曲 + +1、选源点到哪个节点近且该节点未被访问过 + +源点距离源点最近,距离为0,且未被访问。 + +2、该最近节点被标记访问过 + +标记源点访问过 + +3、更新非访问节点到源点的距离(即更新minDist数组) ,如图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240130115421.png) + + +更新 minDist数组,即:源点(节点1) 到 节点2 和 节点3的距离。 + +* 源点到节点2的最短距离为1,小于原minDist[2]的数值max,更新minDist[2] = 1 +* 源点到节点3的最短距离为4,小于原minDist[3]的数值max,更新minDist[4] = 4 + +可能有录友问:为啥和 minDist[2] 比较? + +再强调一下 minDist[2] 的含义,它表示源点到节点2的最短距离,那么目前我们得到了 源点到节点2的最短距离为1,小于默认值max,所以更新。 minDist[3]的更新同理 + + +------------- + +1、选源点到哪个节点近且该节点未被访问过 + +未访问过的节点中,源点到节点2距离最近,选节点2 + +2、该最近节点被标记访问过 + +节点2被标记访问过 + +3、更新非访问节点到源点的距离(即更新minDist数组) ,如图: + + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240130121240.png) + +更新 minDist数组,即:源点(节点1) 到 节点6 、 节点3 和 节点4的距离。 + +**为什么更新这些节点呢? 怎么不更新其他节点呢**? + +因为 源点(节点1)通过 已经计算过的节点(节点2) 可以链接到的节点 有 节点3,节点4和节点6. + + +更新 minDist数组: + +* 源点到节点6的最短距离为5,小于原minDist[6]的数值max,更新minDist[6] = 5 +* 源点到节点3的最短距离为3,小于原minDist[3]的数值4,更新minDist[3] = 3 +* 源点到节点4的最短距离为6,小于原minDist[4]的数值max,更新minDist[4] = 6 + + + +------------------- + +1、选源点到哪个节点近且该节点未被访问过 + +未访问过的节点中,源点距离哪些节点最近,怎么算的? + +其实就是看 minDist数组里的数值,minDist 记录了 源点到所有节点的最近距离,结合visited数组筛选出未访问的节点就好。 + +从 上面的图,或者 从minDist数组中,我们都能看出 未访问过的节点中,源点(节点1)到节点3距离最近。 + + +2、该最近节点被标记访问过 + +节点3被标记访问过 + +3、更新非访问节点到源点的距离(即更新minDist数组) ,如图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240130120434.png) + +由于节点3的加入,那么源点可以有新的路径链接到节点4 所以更新minDist数组: + +更新 minDist数组: + +* 源点到节点4的最短距离为5,小于原minDist[4]的数值6,更新minDist[4] = 5 + +------------------ + +1、选源点到哪个节点近且该节点未被访问过 + +距离源点最近且没有被访问过的节点,有节点4 和 节点6,距离源点距离都是 5 (minDist[4] = 5,minDist[6] = 5) ,选哪个节点都可以。 + +2、该最近节点被标记访问过 + +节点4被标记访问过 + +3、更新非访问节点到源点的距离(即更新minDist数组) ,如图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240201105335.png) + +由于节点4的加入,那么源点可以链接到节点5 所以更新minDist数组: + +* 源点到节点5的最短距离为8,小于原minDist[5]的数值max,更新minDist[5] = 8 + +-------------- + +1、选源点到哪个节点近且该节点未被访问过 + +距离源点最近且没有被访问过的节点,是节点6,距离源点距离是 5 (minDist[6] = 5) + + +2、该最近节点被标记访问过 + +节点6 被标记访问过 + + +3、更新非访问节点到源点的距离(即更新minDist数组) ,如图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240201110250.png) + +由于节点6的加入,那么源点可以链接到节点7 所以 更新minDist数组: + +* 源点到节点7的最短距离为14,小于原minDist[7]的数值max,更新minDist[7] = 14 + + + +------------------- + +1、选源点到哪个节点近且该节点未被访问过 + +距离源点最近且没有被访问过的节点,是节点5,距离源点距离是 8 (minDist[5] = 8) + +2、该最近节点被标记访问过 + +节点5 被标记访问过 + +3、更新非访问节点到源点的距离(即更新minDist数组) ,如图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240201110651.png) + +由于节点5的加入,那么源点有新的路径可以链接到节点7 所以 更新minDist数组: + +* 源点到节点7的最短距离为12,小于原minDist[7]的数值14,更新minDist[7] = 12 + +----------------- + +1、选源点到哪个节点近且该节点未被访问过 + +距离源点最近且没有被访问过的节点,是节点7(终点),距离源点距离是 12 (minDist[7] = 12) + +2、该最近节点被标记访问过 + +节点7 被标记访问过 + +3、更新非访问节点到源点的距离(即更新minDist数组) ,如图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240201110920.png) + +节点7加入,但节点7到节点7的距离为0,所以 不用更新minDist数组 + +-------------------- + +最后我们要求起点(节点1) 到终点 (节点7)的距离。 + +再来回顾一下minDist数组的含义:记录 每一个节点距离源点的最小距离。 + +那么起到(节点1)到终点(节点7)的最短距离就是 minDist[7] ,按上面举例讲解来说,minDist[7] = 12,节点1 到节点7的最短路径为 12。 + +路径如图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240201111352.png) + +在上面的讲解中,每一步 我都是按照 dijkstra 三部曲来讲解的,理解了这三部曲,代码也就好懂的。 + +### 代码实现 + +本题代码如下,里面的 三部曲 我都做了注释,大家按照我上面的讲解 来看如下代码: + +```CPP +#include +#include +#include +using namespace std; +int main() { + int n, m, p1, p2, val; + cin >> n >> m; + + vector> grid(n + 1, vector(n + 1, INT_MAX)); + for(int i = 0; i < m; i++){ + cin >> p1 >> p2 >> val; + grid[p1][p2] = val; + } + + int start = 1; + int end = n; + + // 存储从源点到每个节点的最短距离 + std::vector minDist(n + 1, INT_MAX); + + // 记录顶点是否被访问过 + std::vector visited(n + 1, false); + + minDist[start] = 0; // 起始点到自身的距离为0 + + for (int i = 1; i <= n; i++) { // 遍历所有节点 + + int minVal = INT_MAX; + int cur = 1; + + // 1、选距离源点最近且未访问过的节点 + for (int v = 1; v <= n; ++v) { + if (!visited[v] && minDist[v] < minVal) { + minVal = minDist[v]; + cur = v; + } + } + + visited[cur] = true; // 2、标记该节点已被访问 + + // 3、第三步,更新非访问节点到源点的距离(即更新minDist数组) + for (int v = 1; v <= n; v++) { + if (!visited[v] && grid[cur][v] != INT_MAX && minDist[cur] + grid[cur][v] < minDist[v]) { + minDist[v] = minDist[cur] + grid[cur][v]; + } + } + + } + + if (minDist[end] == INT_MAX) cout << -1 << endl; // 不能到达终点 + else cout << minDist[end] << endl; // 到达终点最短路径 + +} +``` + +* 时间复杂度:O(n^2) +* 空间复杂度:O(n^2) + +### debug方法 + +写这种题目难免会有各种各样的问题,我们如何发现自己的代码是否有问题呢? + +最好的方式就是打日志,本题的话,就是将 minDist 数组打印出来,就可以很明显发现 哪里出问题了。 + +每次选择节点后,minDist数组的变化是否符合预期 ,是否和我上面讲的逻辑是对应的。 + +例如本题,如果想debug的话,打印日志可以这样写: + + +```CPP +#include +#include +#include +using namespace std; +int main() { + int n, m, p1, p2, val; + cin >> n >> m; + + vector> grid(n + 1, vector(n + 1, INT_MAX)); + for(int i = 0; i < m; i++){ + cin >> p1 >> p2 >> val; + grid[p1][p2] = val; + } + + int start = 1; + int end = n; + + std::vector minDist(n + 1, INT_MAX); + + std::vector visited(n + 1, false); + + minDist[start] = 0; + for (int i = 1; i <= n; i++) { + + int minVal = INT_MAX; + int cur = 1; + + + for (int v = 1; v <= n; ++v) { + if (!visited[v] && minDist[v] < minVal) { + minVal = minDist[v]; + cur = v; + } + } + + visited[cur] = true; + + for (int v = 1; v <= n; v++) { + if (!visited[v] && grid[cur][v] != INT_MAX && minDist[cur] + grid[cur][v] < minDist[v]) { + minDist[v] = minDist[cur] + grid[cur][v]; + } + } + + // 打印日志: + cout << "select:" << cur << endl; + for (int v = 1; v <= n; v++) cout << v << ":" << minDist[v] << " "; + cout << endl << endl;; + + } + if (minDist[end] == INT_MAX) cout << -1 << endl; + else cout << minDist[end] << endl; + +} + +``` + +打印后的结果: + +``` +select:1 +1:0 2:1 3:4 4:2147483647 5:2147483647 6:2147483647 7:2147483647 + +select:2 +1:0 2:1 3:3 4:6 5:2147483647 6:5 7:2147483647 + +select:3 +1:0 2:1 3:3 4:5 5:2147483647 6:5 7:2147483647 + +select:4 +1:0 2:1 3:3 4:5 5:8 6:5 7:2147483647 + +select:6 +1:0 2:1 3:3 4:5 5:8 6:5 7:14 + +select:5 +1:0 2:1 3:3 4:5 5:8 6:5 7:12 + +select:7 +1:0 2:1 3:3 4:5 5:8 6:5 7:12 +``` + +打印日志可以和上面我讲解的过程进行对比,每一步的结果是完全对应的。 + +所以如果大家如果代码有问题,打日志来debug是最好的方法 + +### 如何求路径 + +如果题目要求把最短路的路径打印出来,应该怎么办呢? + +这里还是有一些“坑”的,本题打印路径和 prim 打印路径是一样的,我在 [prim算法精讲](https://mp.weixin.qq.com/s/yX936hHC6Z10K36Vm1Wl9w) 【拓展】中 已经详细讲解了。 + +在这里就不再赘述。 + +打印路径只需要添加 几行代码, 打印路径的代码我都加上的日志,如下: + +```CPP +#include +#include +#include +using namespace std; +int main() { + int n, m, p1, p2, val; + cin >> n >> m; + + vector> grid(n + 1, vector(n + 1, INT_MAX)); + for(int i = 0; i < m; i++){ + cin >> p1 >> p2 >> val; + grid[p1][p2] = val; + } + + int start = 1; + int end = n; + + std::vector minDist(n + 1, INT_MAX); + + std::vector visited(n + 1, false); + + minDist[start] = 0; + + //加上初始化 + vector parent(n + 1, -1); + + for (int i = 1; i <= n; i++) { + + int minVal = INT_MAX; + int cur = 1; + + for (int v = 1; v <= n; ++v) { + if (!visited[v] && minDist[v] < minVal) { + minVal = minDist[v]; + cur = v; + } + } + + visited[cur] = true; + + for (int v = 1; v <= n; v++) { + if (!visited[v] && grid[cur][v] != INT_MAX && minDist[cur] + grid[cur][v] < minDist[v]) { + minDist[v] = minDist[cur] + grid[cur][v]; + parent[v] = cur; // 记录边 + } + } + + } + + // 输出最短情况 + for (int i = 1; i <= n; i++) { + cout << parent[i] << "->" << i << endl; + } +} +``` + +打印结果: + +``` +-1->1 +1->2 +2->3 +3->4 +4->5 +2->6 +5->7 +``` + +对应如图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240201111352.png) + +### 出现负数 + +如果图中边的权值为负数,dijkstra 还合适吗? + +看一下这个图: (有负权值) + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240227104334.png) + +节点1 到 节点5 的最短路径 应该是 节点1 -> 节点2 -> 节点3 -> 节点4 -> 节点5 + +那我们来看dijkstra 求解的路径是什么样的,继续dijkstra 三部曲来模拟 :(dijkstra模拟过程上面已经详细讲过,以下只模拟重要过程,例如如何初始化就省略讲解了) + +----------- + +初始化: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240227104801.png) + +--------------- + +1、选源点到哪个节点近且该节点未被访问过 + +源点距离源点最近,距离为0,且未被访问。 + +2、该最近节点被标记访问过 + +标记源点访问过 + +3、更新非访问节点到源点的距离(即更新minDist数组) ,如图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240227110217.png) + +更新 minDist数组,即:源点(节点1) 到 节点2 和 节点3的距离。 + +* 源点到节点2的最短距离为100,小于原minDist[2]的数值max,更新minDist[2] = 100 +* 源点到节点3的最短距离为1,小于原minDist[3]的数值max,更新minDist[4] = 1 + +------------------- + +1、选源点到哪个节点近且该节点未被访问过 + +源点距离节点3最近,距离为1,且未被访问。 + +2、该最近节点被标记访问过 + +标记节点3访问过 + +3、更新非访问节点到源点的距离(即更新minDist数组) ,如图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240227110330.png) + +由于节点3的加入,那么源点可以有新的路径链接到节点4 所以更新minDist数组: + +* 源点到节点4的最短距离为2,小于原minDist[4]的数值max,更新minDist[4] = 2 + +-------------- + +1、选源点到哪个节点近且该节点未被访问过 + +源点距离节点4最近,距离为2,且未被访问。 + +2、该最近节点被标记访问过 + +标记节点4访问过 + +3、更新非访问节点到源点的距离(即更新minDist数组) ,如图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240227110346.png) + +由于节点4的加入,那么源点可以有新的路径链接到节点5 所以更新minDist数组: + +* 源点到节点5的最短距离为3,小于原minDist[5]的数值max,更新minDist[5] = 5 + +------------ + +1、选源点到哪个节点近且该节点未被访问过 + +源点距离节点5最近,距离为3,且未被访问。 + +2、该最近节点被标记访问过 + +标记节点5访问过 + +3、更新非访问节点到源点的距离(即更新minDist数组) ,如图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240227110405.png) + +节点5的加入,而节点5 没有链接其他节点, 所以不用更新minDist数组,仅标记节点5被访问过了 + +------------ + +1、选源点到哪个节点近且该节点未被访问过 + +源点距离节点2最近,距离为100,且未被访问。 + +2、该最近节点被标记访问过 + +标记节点2访问过 + +3、更新非访问节点到源点的距离(即更新minDist数组) ,如图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240227110711.png) + +-------------- + +至此dijkstra的模拟过程就结束了,根据最后的minDist数组,我们求 节点1 到 节点5 的最短路径的权值总和为 3,路径: 节点1 -> 节点3 -> 节点4 -> 节点5 + +通过以上的过程模拟,我们可以发现 之所以 没有走有负权值的最短路径 是因为 在 访问 节点 2 的时候,节点 3 已经访问过了,就不会再更新了。 + +那有录友可能会想: 我可以改代码逻辑啊,访问过的节点,也让它继续访问不就好了? + +那么访问过的节点还能继续访问会不会有死循环的出现呢?控制逻辑不让其死循环?那特殊情况自己能都想清楚吗?(可以试试,实践出真知) + +对于负权值的出现,大家可以针对某一个场景 不断去修改 dijkstra 的代码,**但最终会发现只是 拆了东墙补西墙**,对dijkstra的补充逻辑只能满足某特定场景最短路求解。 + +对于求解带有负权值的最短路问题,可以使用 Bellman-Ford 算法 ,我在后序会详细讲解。 + +## dijkstra与prim算法的区别 + +> 这里再次提示,需要先看我的 [prim算法精讲](https://mp.weixin.qq.com/s/yX936hHC6Z10K36Vm1Wl9w) ,否则可能不知道我下面讲的是什么。 + +大家可以发现 dijkstra的代码看上去 怎么和 prim算法这么像呢。 + +其实代码大体不差,唯一区别在 三部曲中的 第三步: 更新minDist数组 + +因为**prim是求 非访问节点到最小生成树的最小距离,而 dijkstra是求 非访问节点到源点的最小距离**。 + +prim 更新 minDist数组的写法: + + +```CPP +for (int j = 1; j <= v; j++) { + if (!isInTree[j] && grid[cur][j] < minDist[j]) { + minDist[j] = grid[cur][j]; + } +} +``` + +因为 minDist表示 节点到最小生成树的最小距离,所以 新节点cur的加入,只需要 使用 grid[cur][j] ,grid[cur][j] 就表示 cur 加入生成树后,生成树到 节点j 的距离。 + +dijkstra 更新 minDist数组的写法: + +```CPP +for (int v = 1; v <= n; v++) { + if (!visited[v] && grid[cur][v] != INT_MAX && minDist[cur] + grid[cur][v] < minDist[v]) { + minDist[v] = minDist[cur] + grid[cur][v]; + } +} +``` + +因为 minDist表示 节点到源点的最小距离,所以 新节点 cur 的加入,需要使用 源点到cur的距离 (minDist[cur]) + cur 到 节点 v 的距离 (grid[cur][v]),才是 源点到节点v的距离。 + +此时大家可能不禁要想 prim算法 可以有负权值吗? + +当然可以! + +录友们可以自己思考思考一下,这是为什么? + +这里我提示一下:prim算法只需要将节点以最小权值和链接在一起,不涉及到单一路径。 + + + +## 总结 + +本篇,我们深入讲解的dijkstra算法,详细模拟其工作的流程。 + +这里我给出了 **dijkstra 三部曲 来 帮助大家理解 该算法**,不至于 每次写 dijkstra 都是黑盒操作,没有框架没有章法。 + +在给出的代码中,我也按照三部曲的逻辑来给大家注释,只要理解这三部曲,即使 过段时间 对 dijkstra 算法有些遗忘,依然可以写出一个框架出来,然后再去调试细节。 + +对于图论算法,一般代码都比较长,很难写出代码直接可以提交通过,都需要一个debug的过程,所以 **学习如何debug 非常重要**! + +这也是我为什么 在本文中 单独用来讲解 debug方法。 + +本题求的是最短路径和是多少,**同时我们也要掌握 如何把最短路径打印出来**。 + +我还写了大篇幅来讲解 负权值的情况, 只有画图带大家一步一步去 看 出现负权值 dijkstra的求解过程,才能帮助大家理解,问题出在哪里。 + +如果我直接讲:是**因为访问过的节点 不能再访问,导致错过真正的最短路**,我相信大家都不知道我在说啥。 + +最后我还讲解了 dijkstra 和 prim 算法的 相同 与 不同之处, 我在图论的讲解安排中 先讲 prim算法 再讲 dijkstra 是有目的的, **理解这两个算法的相同与不同之处 有助于大家学习的更深入**。 + +而不是 学了 dijkstra 就只看 dijkstra, 算法之间 都是有联系的,多去思考 算法之间的相互联系,会帮助大家思考的更深入,掌握的更彻底。 + +本篇写了这么长,我也只讲解了 朴素版dijkstra,**关于 堆优化dijkstra,我会在下一篇再来给大家详细讲解**。 + +加油 + + + diff --git "a/problems/kama53.\345\257\273\345\256\235-Kruskal.md" "b/problems/kama53.\345\257\273\345\256\235-Kruskal.md" new file mode 100644 index 0000000000..1e6cbbb909 --- /dev/null +++ "b/problems/kama53.\345\257\273\345\256\235-Kruskal.md" @@ -0,0 +1,400 @@ + +# 寻宝 + +[卡码网:53. 寻宝](https://kamacoder.com/problempage.php?pid=1053) + +题目描述: + +在世界的某个区域,有一些分散的神秘岛屿,每个岛屿上都有一种珍稀的资源或者宝藏。国王打算在这些岛屿上建公路,方便运输。 + +不同岛屿之间,路途距离不同,国王希望你可以规划建公路的方案,如何可以以最短的总公路距离将 所有岛屿联通起来。 + +给定一张地图,其中包括了所有的岛屿,以及它们之间的距离。以最小化公路建设长度,确保可以链接到所有岛屿。 + +输入描述: + +第一行包含两个整数V 和 E,V代表顶点数,E代表边数 。顶点编号是从1到V。例如:V=2,一个有两个顶点,分别是1和2。 + +接下来共有 E 行,每行三个整数 v1,v2 和 val,v1 和 v2 为边的起点和终点,val代表边的权值。 + +输出描述: + +输出联通所有岛屿的最小路径总距离 + +输入示例: + +``` +7 11 +1 2 1 +1 3 1 +1 5 2 +2 6 1 +2 4 2 +2 3 2 +3 4 1 +4 5 1 +5 6 2 +5 7 1 +6 7 1 +``` + +输出示例: + +6 + +## 解题思路 + +在上一篇 我们讲解了 prim算法求解 最小生成树,本篇我们来讲解另一个算法:Kruskal,同样可以求最小生成树。 + +**prim 算法是维护节点的集合,而 Kruskal 是维护边的集合**。 + +上来就这么说,大家应该看不太懂,这里是先让大家有这么个印象,带着这个印象在看下文,理解的会更到位一些。 + +kruscal的思路: + +* 边的权值排序,因为要优先选最小的边加入到生成树里 +* 遍历排序后的边 + * 如果边首尾的两个节点在同一个集合,说明如果连上这条边图中会出现环 + * 如果边首尾的两个节点不在同一个集合,加入到最小生成树,并把两个节点加入同一个集合 + +下面我们画图举例说明kruscal的工作过程。 + +依然以示例中,如下这个图来举例。 + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240111113514.png) + +将图中的边按照权值有小到大排序,这样从贪心的角度来说,优先选 权值小的边加入到 最小生成树中。 + +排序后的边顺序为[(1,2) (4,5) (1,3) (2,6) (3,4) (6,7) (5,7) (1,5) (3,2) (2,4) (5,6)] + +> (1,2) 表示节点1 与 节点2 之间的边。权值相同的边,先后顺序无所谓。 + +**开始从头遍历排序后的边**。 + +-------- + +选边(1,2),节点1 和 节点2 不在同一个集合,所以生成树可以添加边(1,2),并将 节点1,节点2 放在同一个集合。 + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240111114204.png) + +-------- + +选边(4,5),节点4 和 节点 5 不在同一个集合,生成树可以添加边(4,5) ,并将节点4,节点5 放到同一个集合。 + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240111120458.png) + +**大家判断两个节点是否在同一个集合,就看图中两个节点是否有绿色的粗线连着就行** + +------ + +(这里在强调一下,以下选边是按照上面排序好的边的数组来选择的) + +选边(1,3),节点1 和 节点3 不在同一个集合,生成树添加边(1,3),并将节点1,节点3 放到同一个集合。 + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240112105834.png) + +--------- + +选边(2,6),节点2 和 节点6 不在同一个集合,生成树添加边(2,6),并将节点2,节点6 放到同一个集合。 + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240112110214.png) + +-------- + +选边(3,4),节点3 和 节点4 不在同一个集合,生成树添加边(3,4),并将节点3,节点4 放到同一个集合。 + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240112110450.png) + +---------- + +选边(6,7),节点6 和 节点7 不在同一个集合,生成树添加边(6,7),并将 节点6,节点7 放到同一个集合。 + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240112110637.png) + +----------- + +选边(5,7),节点5 和 节点7 在同一个集合,不做计算。 + +选边(1,5),两个节点在同一个集合,不做计算。 + +后面遍历 边(3,2),(2,4),(5,6) 同理,都因两个节点已经在同一集合,不做计算。 + + +------- + +此时 我们就已经生成了一个最小生成树,即: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240112110637.png) + +在上面的讲解中,看图的话 大家知道如何判断 两个节点 是否在同一个集合(是否有绿色的线连在一起),以及如何把两个节点加入集合(就在图中把两个节点连上) + +**但在代码中,如果将两个节点加入同一个集合,又如何判断两个节点是否在同一个集合呢**? + +这里就涉及到我们之前讲解的[并查集](https://www.programmercarl.com/%E5%9B%BE%E8%AE%BA%E5%B9%B6%E6%9F%A5%E9%9B%86%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html)。 + +我们在并查集开篇的时候就讲了,并查集主要就两个功能: + +* 将两个元素添加到一个集合中 +* 判断两个元素在不在同一个集合 + +大家发现这正好符合 Kruskal算法的需求,这也是为什么 **我要先讲并查集,再讲 Kruskal**。 + +关于 并查集,我已经在[并查集精讲](https://www.programmercarl.com/%E5%9B%BE%E8%AE%BA%E5%B9%B6%E6%9F%A5%E9%9B%86%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html) 详细讲解过了,所以这里不再赘述,我们直接用。 + +本题代码如下,已经详细注释: + +```CPP + +#include +#include +#include + +using namespace std; + +// l,r为 边两边的节点,val为边的数值 +struct Edge { + int l, r, val; +}; + +// 节点数量 +int n = 10001; +// 并查集标记节点关系的数组 +vector father(n, -1); // 节点编号是从1开始的,n要大一些 + +// 并查集初始化 +void init() { + for (int i = 0; i < n; ++i) { + father[i] = i; + } +} + +// 并查集的查找操作 +int find(int u) { + return u == father[u] ? u : father[u] = find(father[u]); // 路径压缩 +} + +// 并查集的加入集合 +void join(int u, int v) { + u = find(u); // 寻找u的根 + v = find(v); // 寻找v的根 + if (u == v) return ; // 如果发现根相同,则说明在一个集合,不用两个节点相连直接返回 + father[v] = u; +} + +int main() { + + int v, e; + int v1, v2, val; + vector edges; + int result_val = 0; + cin >> v >> e; + while (e--) { + cin >> v1 >> v2 >> val; + edges.push_back({v1, v2, val}); + } + + // 执行Kruskal算法 + // 按边的权值对边进行从小到大排序 + sort(edges.begin(), edges.end(), [](const Edge& a, const Edge& b) { + return a.val < b.val; + }); + + // 并查集初始化 + init(); + + // 从头开始遍历边 + for (Edge edge : edges) { + // 并查集,搜出两个节点的祖先 + int x = find(edge.l); + int y = find(edge.r); + + // 如果祖先不同,则不在同一个集合 + if (x != y) { + result_val += edge.val; // 这条边可以作为生成树的边 + join(x, y); // 两个节点加入到同一个集合 + } + } + cout << result_val << endl; + return 0; +} + +``` + +时间复杂度:nlogn (快排) + logn (并查集) ,所以最后依然是 nlogn 。n为边的数量。 + +关于并查集时间复杂度,可以看我在 [并查集理论基础](https://programmercarl.com/%E5%9B%BE%E8%AE%BA%E5%B9%B6%E6%9F%A5%E9%9B%86%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html) 的讲解。 + +## 拓展一 + +如果题目要求将最小生成树的边输出的话,应该怎么办呢? + +Kruskal 算法 输出边的话,相对prim 要容易很多,因为 Kruskal 本来就是直接操作边,边的结构自然清晰,不用像 prim一样 需要再节点练成线输出边 (因为prim是对节点操作,而 Kruskal是对边操作,这是本质区别) + +本题中,边的结构为: + +```CPP +struct Edge { + int l, r, val; +}; +``` + +那么我们只需要找到 在哪里把生成树的边保存下来就可以了。 + +当判断两个节点不在同一个集合的时候,这两个节点的边就加入到最小生成树, 所以添加边的操作在这里: + +```CPP +vector result; // 存储最小生成树的边 +// 如果祖先不同,则不在同一个集合 +if (x != y) { + result.push_back(edge); // 记录最小生成树的边 + result_val += edge.val; // 这条边可以作为生成树的边 + join(x, y); // 两个节点加入到同一个集合 +} +``` + +整体代码如下,为了突出重点,我仅仅将 打印最小生成树的部分代码注释了,大家更容易看到哪些改动。 + +```CPP +#include +#include +#include + +using namespace std; + +struct Edge { + int l, r, val; +}; + + +int n = 10001; + +vector father(n, -1); + +void init() { + for (int i = 0; i < n; ++i) { + father[i] = i; + } +} + +int find(int u) { + return u == father[u] ? u : father[u] = find(father[u]); +} + +void join(int u, int v) { + u = find(u); + v = find(v); + if (u == v) return ; + father[v] = u; +} + +int main() { + + int v, e; + int v1, v2, val; + vector edges; + int result_val = 0; + cin >> v >> e; + while (e--) { + cin >> v1 >> v2 >> val; + edges.push_back({v1, v2, val}); + } + + sort(edges.begin(), edges.end(), [](const Edge& a, const Edge& b) { + return a.val < b.val; + }); + + vector result; // 存储最小生成树的边 + + init(); + + for (Edge edge : edges) { + + int x = find(edge.l); + int y = find(edge.r); + + + if (x != y) { + result.push_back(edge); // 保存最小生成树的边 + result_val += edge.val; + join(x, y); + } + } + + // 打印最小生成树的边 + for (Edge edge : result) { + cout << edge.l << " - " << edge.r << " : " << edge.val << endl; + } + + return 0; +} + + +``` + +按照题目中的示例,打印边的输出为: + +``` +1 - 2 : 1 +1 - 3 : 1 +2 - 6 : 1 +3 - 4 : 1 +4 - 5 : 1 +5 - 7 : 1 +``` + +大家可能发现 怎么和我们 模拟画的图不一样,差别在于 代码生成的最小生成树中 节点5 和 节点7相连的。 + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240116163014.png) + + +其实造成这个差别 是对边排序的时候 权值相同的边先后顺序的问题导致的,无论相同权值边的顺序是什么样的,最后都能得出最小生成树。 + + +## 拓展二 + + +此时我们已经讲完了 Kruskal 和 prim 两个解法来求最小生成树。 + +什么情况用哪个算法更合适呢。 + +Kruskal 与 prim 的关键区别在于,prim维护的是节点的集合,而 Kruskal 维护的是边的集合。 +如果 一个图中,节点多,但边相对较少,那么使用Kruskal 更优。 + +有录友可能疑惑,一个图里怎么可能节点多,边却少呢? + +节点未必一定要连着边那, 例如 这个图,大家能明显感受到边没有那么多对吧,但节点数量 和 上述我们讲的例子是一样的。 + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240116152211.png) + +为什么边少的话,使用 Kruskal 更优呢? + +因为 Kruskal 是对边进行排序的后 进行操作是否加入到最小生成树。 + +边如果少,那么遍历操作的次数就少。 + +在节点数量固定的情况下,图中的边越少,Kruskal 需要遍历的边也就越少。 + +而 prim 算法是对节点进行操作的,节点数量越少,prim算法效率就越少。 + +所以在 稀疏图中,用Kruskal更优。 在稠密图中,用prim算法更优。 + +> 边数量较少为稀疏图,接近或等于完全图(所有节点皆相连)为稠密图 + + +Prim 算法 时间复杂度为 O(n^2),其中 n 为节点数量,它的运行效率和图中边树无关,适用稠密图。 + +Kruskal算法 时间复杂度 为 nlogn,其中n 为边的数量,适用稀疏图。 + +## 总结 + +如果学过了并查集,其实 kruskal 比 prim更好理解一些。 + +本篇,我们依然通过模拟 Kruskal 算法的过程,来带大家一步步了解其工作过程。 + +在 拓展一 中讲解了 如何输出最小生成树的边。 + +在拓展二 中讲解了 prim 和 Kruskal的区别。 + +录友们可以细细体会。 + + diff --git "a/problems/kama53.\345\257\273\345\256\235.md" "b/problems/kama53.\345\257\273\345\256\235-prim.md" similarity index 93% rename from "problems/kama53.\345\257\273\345\256\235.md" rename to "problems/kama53.\345\257\273\345\256\235-prim.md" index 3a4b8b274c..9959954aef 100644 --- "a/problems/kama53.\345\257\273\345\256\235.md" +++ "b/problems/kama53.\345\257\273\345\256\235-prim.md" @@ -5,9 +5,11 @@ 题目描述: -在世界的某个区域,有一些分散的神秘岛屿,每个岛屿上都有一种珍稀的资源或者宝藏。你是一名探险者,决定前往这些岛屿,但为了节省时间和资源,你希望规划一条最短的路径,以便在探索这些岛屿时尽量减少旅行的距离。 +在世界的某个区域,有一些分散的神秘岛屿,每个岛屿上都有一种珍稀的资源或者宝藏。国王打算在这些岛屿上建公路,方便运输。 -给定一张地图,其中包括了所有的岛屿,以及它们之间的距离。每个岛屿都需要被至少访问一次,你的目标是规划一条最短路径,以最小化探索路径的总距离,同时确保访问了所有岛屿。 +不同岛屿之间,路途距离不同,国王希望你可以规划建公路的方案,如何可以以最短的总公路距离将 所有岛屿联通起来。 + +给定一张地图,其中包括了所有的岛屿,以及它们之间的距离。以最小化公路建设长度,确保可以链接到所有岛屿。 输入描述: @@ -133,7 +135,7 @@ minDist 数组 里的数值初始化为 最大数,因为本题 节点距离不 1、prim三部曲,第一步:选距离生成树最近节点 -选取一个距离 最小生成树(节点1) 最近的非生成树里的节点,节点2,3,5 距离 最小生成树(节点1) 最近,选节点 2(其实选 节点3或者节点5都可以,距离一样的)加入最小生成树。 +选取一个距离 最小生成树(节点1) 最近的非生成树里的节点,节点2,3,5 距离 最小生成树(节点1) 最近,选节点 2(其实选 节点3或者节点2都可以,距离一样的)加入最小生成树。 2、prim三部曲,第二步:最近节点加入生成树 @@ -272,6 +274,8 @@ minDist数组已经更新了 所有非生成树的节点距离 最小生成树 ```CPP #include #include +#include + using namespace std; int main() { int v, e; @@ -296,28 +300,28 @@ int main() { for (int i = 1; i < v; i++) { // 1、prim三部曲,第一步:选距离生成树最近节点 - int cur = -1; // 选中哪个节点 加入最小生成树 + int cur = -1; // 选中哪个节点 加入最小生成树 + int minVal = INT_MAX; for (int j = 1; j <= v; j++) { // 1 - v,顶点编号,这里下标从1开始 - // 选取最小生成树节点的条件: + // 选取最小生成树节点的条件: // (1)不在最小生成树里 - // (2)距离最小生成树最近的节点 - // (3)只要不在最小生成树里,先默认选一个节点 ,在比较 哪一个是最小的 - // 理解条件3 很重要,才能理解这段代码:(cur == -1 || minDist[j] < minDist[cur]) - if (!isInTree[j] && (cur == -1 || minDist[j] < minDist[cur])) { + // (2)距离最小生成树最近的节点 + if (!isInTree[j] && minDist[j] < minVal) { + minVal = minDist[j]; cur = j; } } - // 2、prim三部曲,第二步:最近节点(cur)加入生成树 + // 2、prim三部曲,第二步:最近节点(cur)加入生成树 isInTree[cur] = true; // 3、prim三部曲,第三步:更新非生成树节点到生成树的距离(即更新minDist数组) // cur节点加入之后, 最小生成树加入了新的节点,那么所有节点到 最小生成树的距离(即minDist数组)需要更新一下 - // 由于cur节点是新加入到最小生成树,那么只需要关心与 cur 相连的 非生成树节点 的距离 是否比 原来 非生成树节点到生成树节点的距离更小了呢 - for (int j = 1; j <= v; j++) { - // 更新的条件: - // (1)节点是 非生成树里的节点 - // (2)与cur相连的某节点的权值 比 该某节点距离最小生成树的距离小 - // 很多录友看到自己 就想不明白什么意思,其实就是 cur 是新加入 最小生成树的节点,那么 所有非生成树的节点距离生成树节点的最近距离 由于 cur的新加入,需要更新一下数据了 + // 由于cur节点是新加入到最小生成树,那么只需要关心与 cur 相连的 非生成树节点 的距离 是否比 原来 非生成树节点到生成树节点的距离更小了呢 + for (int j = 1; j <= v; j++) { + // 更新的条件: + // (1)节点是 非生成树里的节点 + // (2)与cur相连的某节点的权值 比 该某节点距离最小生成树的距离小 + // 很多录友看到自己 就想不明白什么意思,其实就是 cur 是新加入 最小生成树的节点,那么 所有非生成树的节点距离生成树节点的最近距离 由于 cur的新加入,需要更新一下数据了 if (!isInTree[j] && grid[cur][j] < minDist[j]) { minDist[j] = grid[cur][j]; } @@ -325,14 +329,17 @@ int main() { } // 统计结果 int result = 0; - for (int i = 2; i <= v; i++) { // 不计第一个顶点,因为统计的是边的权值,v个节点有 v-1条边 + for (int i = 2; i <= v; i++) { // 不计第一个顶点,因为统计的是边的权值,v个节点有 v-1条边 result += minDist[i]; } cout << result << endl; } + ``` +时间复杂度为 O(n^2),其中 n 为节点数量。 + ## 拓展 上面讲解的是记录了最小生成树 所有边的权值,如果让打印出来 最小生成树的每条边呢? 或者说 要把这个最小生成树画出来呢? @@ -406,6 +413,8 @@ for (int j = 1; j <= v; j++) { ```CPP #include #include +#include + using namespace std; int main() { int v, e; @@ -426,11 +435,14 @@ int main() { for (int i = 1; i < v; i++) { int cur = -1; - for (int j = 1; j <= v; j++) { - if (!isInTree[j] && (cur == -1 || minDist[j] < minDist[cur])) { + int minVal = INT_MAX; + for (int j = 1; j <= v; j++) { + if (!isInTree[j] && minDist[j] < minVal) { + minVal = minDist[j]; cur = j; } } + isInTree[cur] = true; for (int j = 1; j <= v; j++) { if (!isInTree[j] && grid[cur][j] < minDist[j]) { @@ -440,11 +452,12 @@ int main() { } } } - // 输出 最小生成树边的链接情况 + // 输出 最小生成树边的链接情况 for (int i = 1; i <= v; i++) { - cout << i "->" parent[i] << endl; + cout << i << "->" << parent[i] << endl; } } + ``` 按照本题示例,代码输入如下: diff --git a/problems/qita/shejimoshi.md b/problems/qita/shejimoshi.md index cf980e45f6..d5342c6132 100644 --- a/problems/qita/shejimoshi.md +++ b/problems/qita/shejimoshi.md @@ -1,4 +1,6 @@ +# 23种设计模式精讲 | 配套练习题 | 卡码网 + 关于设计模式的学习,大家应该还是看书或者看博客,但却没有一个边学边练的学习环境。 学完了一种设计模式 是不是应该去练一练? From 8ba68a4d6fe0ed3497967591b3b45e25b228a5da Mon Sep 17 00:00:00 2001 From: kkkkevx <108632304+kkkkevx@users.noreply.github.com> Date: Thu, 14 Mar 2024 11:27:41 -0700 Subject: [PATCH 2549/3019] =?UTF-8?q?Update=200028.=E5=AE=9E=E7=8E=B0strSt?= =?UTF-8?q?r.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0028.\345\256\236\347\216\260strStr.md" | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git "a/problems/0028.\345\256\236\347\216\260strStr.md" "b/problems/0028.\345\256\236\347\216\260strStr.md" index 8d0cc52559..e195ef9b98 100644 --- "a/problems/0028.\345\256\236\347\216\260strStr.md" +++ "b/problems/0028.\345\256\236\347\216\260strStr.md" @@ -564,6 +564,38 @@ public: ## 其他语言版本 ### Java: +```Java +class Solution { + /** + 牺牲空间,换取最直白的暴力法 + 时间复杂度 O(n * m) + 空间 O(n + m) + */ + public int strStr(String haystack, String needle) { + // 获取 haystack 和 needle 的长度 + int n = haystack.length(), m = needle.length(); + // 将字符串转换为字符数组,方便索引操作 + char[] s = haystack.toCharArray(), p = needle.toCharArray(); + + // 遍历 haystack 字符串 + for (int i = 0; i < n - m + 1; i++) { + // 初始化匹配的指针 + int a = i, b = 0; + // 循环检查 needle 是否在当前位置开始匹配 + while (b < m && s[a] == p[b]) { + // 如果当前字符匹配,则移动指针 + a++; + b++; + } + // 如果 b 等于 m,说明 needle 已经完全匹配,返回当前位置 i + if (b == m) return i; + } + + // 如果遍历完毕仍未找到匹配的子串,则返回 -1 + return -1; + } +} +``` ```Java class Solution { From 6e550159d50f2719d561f0bcd98b08cc7f093394 Mon Sep 17 00:00:00 2001 From: Dan Date: Fri, 15 Mar 2024 11:47:33 +1100 Subject: [PATCH 2550/3019] =?UTF-8?q?Update=200024.=E4=B8=A4=E4=B8=A4?= =?UTF-8?q?=E4=BA=A4=E6=8D=A2=E9=93=BE=E8=A1=A8=E4=B8=AD=E7=9A=84=E8=8A=82?= =?UTF-8?q?=E7=82=B9.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加javascript递归版本实现 --- ...70\255\347\232\204\350\212\202\347\202\271.md" | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git "a/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" "b/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" index b2a830a746..aa39de5fb3 100644 --- "a/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" +++ "b/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" @@ -285,6 +285,21 @@ var swapPairs = function (head) { }; ``` +```javascript +// 递归版本 +var swapPairs = function (head) { + if (head == null || head.next == null) { + return head; + } + + let after = head.next; + head.next = swapPairs(after.next); + after.next = head; + + return after; +}; +``` + ### TypeScript: ```typescript From 20216736e5daf5828bf45d1d04e238057074b7fa Mon Sep 17 00:00:00 2001 From: alfiechen Date: Fri, 15 Mar 2024 23:26:45 +0800 Subject: [PATCH 2551/3019] =?UTF-8?q?Update=200035.=E6=90=9C=E7=B4=A2?= =?UTF-8?q?=E6=8F=92=E5=85=A5=E4=BD=8D=E7=BD=AE=20-=20=E6=B7=BB=E5=8A=A0Py?= =?UTF-8?q?thon3=20=E7=AC=AC=E4=BA=8C=E7=A8=AE=E4=BA=8C=E5=88=86=E6=B3=95?= =?UTF-8?q?=20-=20=E5=B7=A6=E9=97=AD=E5=8F=B3=E5=BC=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...22\345\205\245\344\275\215\347\275\256.md" | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git "a/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" "b/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" index 80b7e40e4a..c969d73034 100644 --- "a/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" +++ "b/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" @@ -332,6 +332,7 @@ impl Solution { ### Python ```python +# 第一种二分法: [left, right]左闭右闭区间 class Solution: def searchInsert(self, nums: List[int], target: int) -> int: left, right = 0, len(nums) - 1 @@ -348,6 +349,26 @@ class Solution: return right + 1 ``` +```python +# 第二种二分法: [left, right)左闭右开区间 +class Solution: + def searchInsert(self, nums: List[int], target: int) -> int: + left = 0 + right = len(nums) + + while (left < right): + middle = (left + right) // 2 + + if nums[middle] > target: + right = middle + elif nums[middle] < target: + left = middle + 1 + else: + return middle + + return right +``` + ### JavaScript ```js From e4ebc6b08f73f06b00b97f59cd0ec9eaa679d1da Mon Sep 17 00:00:00 2001 From: baiye959 <3383522774@qq.com> Date: Sat, 16 Mar 2024 17:21:28 +0800 Subject: [PATCH 2552/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0kama54=E6=9B=BF?= =?UTF-8?q?=E6=8D=A2=E6=95=B0=E5=AD=97=20Java=20=E7=89=88=E6=9C=AC=20?= =?UTF-8?q?=E8=A7=A3=E6=B3=95=E4=BA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...77\346\215\242\346\225\260\345\255\227.md" | 38 ++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git "a/problems/kama54.\346\233\277\346\215\242\346\225\260\345\255\227.md" "b/problems/kama54.\346\233\277\346\215\242\346\225\260\345\255\227.md" index f03e575d1d..7dc22c0a85 100644 --- "a/problems/kama54.\346\233\277\346\215\242\346\225\260\345\255\227.md" +++ "b/problems/kama54.\346\233\277\346\215\242\346\225\260\345\255\227.md" @@ -142,7 +142,7 @@ for (int i = 0; i < a.size(); i++) { ### C: ### Java: - +解法一 ```java import java.util.Scanner; @@ -160,6 +160,42 @@ class Main { } } ``` +解法二 +```java +// 为了还原题目本意,先把原数组复制到扩展长度后的新数组,然后不再使用原数组、原地对新数组进行操作。 +import java.util.*; + +public class Main { + public static void main(String[] args) { + Scanner sc = new Scanner(System.in); + String s = sc.next(); + int len = s.length(); + for (int i = 0; i < s.length(); i++) { + if (s.charAt(i) >= 0 && s.charAt(i) <= '9') { + len += 5; + } + } + + char[] ret = new char[len]; + for (int i = 0; i < s.length(); i++) { + ret[i] = s.charAt(i); + } + for (int i = s.length() - 1, j = len - 1; i >= 0; i--) { + if ('0' <= ret[i] && ret[i] <= '9') { + ret[j--] = 'r'; + ret[j--] = 'e'; + ret[j--] = 'b'; + ret[j--] = 'm'; + ret[j--] = 'u'; + ret[j--] = 'n'; + } else { + ret[j--] = ret[i]; + } + } + System.out.println(ret); + } +} +``` ### Go: ````go From 77a4de1f41b5078aa4dcfbdf169b5f9474b40198 Mon Sep 17 00:00:00 2001 From: Yanshi XU Date: Sat, 16 Mar 2024 18:00:50 +0800 Subject: [PATCH 2553/3019] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BA=86=E5=8A=9B?= =?UTF-8?q?=E6=89=A3=E9=A2=98=E7=9B=AE=E7=9A=84=E9=93=BE=E6=8E=A5:=2020201?= =?UTF-8?q?003=E4=BA=8C=E5=8F=89=E6=A0=91=E5=91=A8=E6=9C=AB=E6=80=BB?= =?UTF-8?q?=E7=BB=93.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 增加了力扣题目的链接 --- ...40\221\345\221\250\346\234\253\346\200\273\347\273\223.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20201003\344\272\214\345\217\211\346\240\221\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20201003\344\272\214\345\217\211\346\240\221\345\221\250\346\234\253\346\200\273\347\273\223.md" index 57416775fb..4b73e663b4 100644 --- "a/problems/\345\221\250\346\200\273\347\273\223/20201003\344\272\214\345\217\211\346\240\221\345\221\250\346\234\253\346\200\273\347\273\223.md" +++ "b/problems/\345\221\250\346\200\273\347\273\223/20201003\344\272\214\345\217\211\346\240\221\345\221\250\346\234\253\346\200\273\347\273\223.md" @@ -14,8 +14,8 @@ 而本题的迭代法中我们使用了队列,需要注意的是这不是层序遍历,而且仅仅通过一个容器来成对的存放我们要比较的元素,认识到这一点之后就发现:用队列,用栈,甚至用数组,都是可以的。 那么做完本题之后,在看如下两个题目。 -* 100.相同的树 -* 572.另一个树的子树 +* [100.相同的树](https://leetcode.cn/problems/same-tree/description/) +* [572.另一个树的子树](https://leetcode.cn/problems/subtree-of-another-tree/) **[二叉树:我对称么?](https://programmercarl.com/0101.对称二叉树.html)中的递归法和迭代法只需要稍作修改其中一个树的遍历顺序,便可刷了100.相同的树。** From cff7999479528160b104ae8f7709456a1f193ecc Mon Sep 17 00:00:00 2001 From: Yanshi XU Date: Sat, 16 Mar 2024 18:02:00 +0800 Subject: [PATCH 2554/3019] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=94=99=E5=88=AB?= =?UTF-8?q?=E5=AD=97:=2020201003=E4=BA=8C=E5=8F=89=E6=A0=91=E5=91=A8?= =?UTF-8?q?=E6=9C=AB=E6=80=BB=E7=BB=93.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修改错别字 --- ...\240\221\345\221\250\346\234\253\346\200\273\347\273\223.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20201003\344\272\214\345\217\211\346\240\221\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20201003\344\272\214\345\217\211\346\240\221\345\221\250\346\234\253\346\200\273\347\273\223.md" index 4b73e663b4..ea5082244c 100644 --- "a/problems/\345\221\250\346\200\273\347\273\223/20201003\344\272\214\345\217\211\346\240\221\345\221\250\346\234\253\346\200\273\347\273\223.md" +++ "b/problems/\345\221\250\346\200\273\347\273\223/20201003\344\272\214\345\217\211\346\240\221\345\221\250\346\234\253\346\200\273\347\273\223.md" @@ -13,7 +13,7 @@ 而本题的迭代法中我们使用了队列,需要注意的是这不是层序遍历,而且仅仅通过一个容器来成对的存放我们要比较的元素,认识到这一点之后就发现:用队列,用栈,甚至用数组,都是可以的。 -那么做完本题之后,在看如下两个题目。 +那么做完本题之后,再看如下两个题目。 * [100.相同的树](https://leetcode.cn/problems/same-tree/description/) * [572.另一个树的子树](https://leetcode.cn/problems/subtree-of-another-tree/) From 29ba4f47e31b289b8cc8b7dc3902ba2f6d7396d4 Mon Sep 17 00:00:00 2001 From: paigeman <53284808+paigeman@users.noreply.github.com> Date: Tue, 19 Mar 2024 11:28:21 +0800 Subject: [PATCH 2555/3019] =?UTF-8?q?Update=200024.=E4=B8=A4=E4=B8=A4?= =?UTF-8?q?=E4=BA=A4=E6=8D=A2=E9=93=BE=E8=A1=A8=E4=B8=AD=E7=9A=84=E8=8A=82?= =?UTF-8?q?=E7=82=B9.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" "b/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" index b2a830a746..67bf70f3da 100644 --- "a/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" +++ "b/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" @@ -81,7 +81,7 @@ public: 上面的代码我第一次提交执行用时8ms,打败6.5%的用户,差点吓到我了。 -心想应该没有更好的方法了吧,也就$O(n)$的时间复杂度,重复提交几次,这样了: +心想应该没有更好的方法了吧,也就 $O(n)$ 的时间复杂度,重复提交几次,这样了: ![24.两两交换链表中的节点](https://code-thinking.cdn.bcebos.com/pics/24.%E4%B8%A4%E4%B8%A4%E4%BA%A4%E6%8D%A2%E9%93%BE%E8%A1%A8%E4%B8%AD%E7%9A%84%E8%8A%82%E7%82%B9.png) From 311b2f4fde6b4f980029bf2f4d71b7854d69d6d2 Mon Sep 17 00:00:00 2001 From: gemaxis Date: Tue, 19 Mar 2024 12:58:18 +0800 Subject: [PATCH 2556/3019] =?UTF-8?q?Update=200024.=E4=B8=A4=E4=B8=A4?= =?UTF-8?q?=E4=BA=A4=E6=8D=A2=E9=93=BE=E8=A1=A8=E4=B8=AD=E7=9A=84=E8=8A=82?= =?UTF-8?q?=E7=82=B9.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\255\347\232\204\350\212\202\347\202\271.md" | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git "a/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" "b/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" index b2a830a746..3d330f1731 100644 --- "a/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" +++ "b/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" @@ -181,6 +181,23 @@ class Solution { } ``` +```java +// 将步骤 2,3 交换顺序,这样不用定义 temp 节点 +public ListNode swapPairs(ListNode head) { + ListNode dummy = new ListNode(0, head); + ListNode cur = dummy; + while (cur.next != null && cur.next.next != null) { + ListNode node1 = cur.next;// 第 1 个节点 + ListNode node2 = cur.next.next;// 第 2 个节点 + cur.next = node2; // 步骤 1 + node1.next = node2.next;// 步骤 3 + node2.next = node1;// 步骤 2 + cur = cur.next.next; + } + return dummy.next; +} +``` + ### Python: ```python From dbac875d31de722ff7c90bac778364956511b821 Mon Sep 17 00:00:00 2001 From: markwang Date: Tue, 19 Mar 2024 16:25:36 +0800 Subject: [PATCH 2557/3019] =?UTF-8?q?27.=20=E7=A7=BB=E9=99=A4=E5=85=83?= =?UTF-8?q?=E7=B4=A0Go=E7=89=88=E6=9C=AC=E6=9A=B4=E5=8A=9B=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...73\351\231\244\345\205\203\347\264\240.md" | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git "a/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" "b/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" index 2a2005d736..967a759653 100644 --- "a/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" +++ "b/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" @@ -276,6 +276,24 @@ class Solution: ### Go: +```go +// 暴力法 +// 时间复杂度 O(n^2) +// 空间复杂度 O(1) +func removeElement(nums []int, val int) int { + size := len(nums) + for i := 0; i < size; i ++ { + if nums[i] == val { + for j := i + 1; j < size; j ++ { + nums[j - 1] = nums[j] + } + i -- + size -- + } + } + return size +} +``` ```go // 快慢指针法 // 时间复杂度 O(n) @@ -318,7 +336,6 @@ func removeElement(nums []int, val int) int { right-- } } - fmt.Println(nums) return left } ``` From 7117871beef8e1754107123a27047bd03354cd67 Mon Sep 17 00:00:00 2001 From: Yubin Li Date: Tue, 19 Mar 2024 20:40:46 +0800 Subject: [PATCH 2558/3019] =?UTF-8?q?Correct=20typo=20in=200102.=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?.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" index 4411b5609f..457050d508 100644 --- "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" +++ "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" @@ -129,7 +129,7 @@ class Solution { return resList; } - //DFS--递归方式 + //BFS--递归方式 public void checkFun01(TreeNode node, Integer deep) { if (node == null) return; deep++; From 12bc134af8987659efeb76a973ffb3206ca9d59d Mon Sep 17 00:00:00 2001 From: Shuai Date: Sat, 23 Mar 2024 15:50:42 +0800 Subject: [PATCH 2559/3019] test --- .../0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git "a/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" "b/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" index 81558cc12c..3b562f5a1e 100644 --- "a/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" +++ "b/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" @@ -311,7 +311,7 @@ class Solution: for i in range(startIndex, len(candidates)): if total + candidates[i] > target: - continue + break total += candidates[i] path.append(candidates[i]) self.backtracking(candidates, target, total, i, path, result) @@ -664,4 +664,3 @@ public class Solution - From 0e1cc6d2771113ef0caeed9a26ec0e7e590e91e7 Mon Sep 17 00:00:00 2001 From: Meliodas417 <76930518+Meliodas417@users.noreply.github.com> Date: Sun, 24 Mar 2024 11:07:42 -0500 Subject: [PATCH 2560/3019] =?UTF-8?q?Update=200150.=E9=80=86=E6=B3=A2?= =?UTF-8?q?=E5=85=B0=E8=A1=A8=E8=BE=BE=E5=BC=8F=E6=B1=82=E5=80=BC.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 除法逻辑不完整,假如是5/2=2没问题,但如果是-5/2,会向下取整,就变成-3了,可以单独定义一个函数。 底下最先弹出的数字实际上是最后进入的数字,也就是运算符右边的操作数,而第二个弹出的数字是第一个进入的数字,即运算符左边的操作数。stack.append(operation(op2, op1)) --- ...76\345\274\217\346\261\202\345\200\274.md" | 41 +++++++++++++------ 1 file changed, 29 insertions(+), 12 deletions(-) diff --git "a/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" "b/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" index 663a68ea5c..fd4d072616 100644 --- "a/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" +++ "b/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" @@ -169,8 +169,12 @@ class Solution { ```python from operator import add, sub, mul -class Solution: - op_map = {'+': add, '-': sub, '*': mul, '/': lambda x, y: int(x / y)} +def div(x, y): + # 使用整数除法的向零取整方式 + return int(x / y) if x * y > 0 else -(abs(x) // abs(y)) + +class Solution(object): + op_map = {'+': add, '-': sub, '*': mul, '/': div} def evalRPN(self, tokens: List[str]) -> int: stack = [] @@ -186,18 +190,31 @@ class Solution: 另一种可行,但因为使用eval相对较慢的方法: ```python -class Solution: - def evalRPN(self, tokens: List[str]) -> int: +from operator import add, sub, mul + +def div(x, y): + # 使用整数除法的向零取整方式 + return int(x / y) if x * y > 0 else -(abs(x) // abs(y)) + +class Solution(object): + op_map = {'+': add, '-': sub, '*': mul, '/': div} + + def evalRPN(self, tokens): + """ + :type tokens: List[str] + :rtype: int + """ stack = [] - for item in tokens: - if item not in {"+", "-", "*", "/"}: - stack.append(item) + for token in tokens: + if token in self.op_map: + op1 = stack.pop() + op2 = stack.pop() + operation = self.op_map[token] + stack.append(operation(op2, op1)) else: - first_num, second_num = stack.pop(), stack.pop() - stack.append( - int(eval(f'{second_num} {item} {first_num}')) # 第一个出来的在运算符后面 - ) - return int(stack.pop()) # 如果一开始只有一个数,那么会是字符串形式的 + stack.append(int(token)) + return stack.pop() + ``` From 8e216326b6858568acc3379db71817218a8e80c4 Mon Sep 17 00:00:00 2001 From: paigeman <53284808+paigeman@users.noreply.github.com> Date: Mon, 25 Mar 2024 09:27:19 +0800 Subject: [PATCH 2561/3019] =?UTF-8?q?Update=20=E5=8F=8C=E6=8C=87=E9=92=88?= =?UTF-8?q?=E6=80=BB=E7=BB=93.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\217\214\346\214\207\351\222\210\346\200\273\347\273\223.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/\345\217\214\346\214\207\351\222\210\346\200\273\347\273\223.md" "b/problems/\345\217\214\346\214\207\351\222\210\346\200\273\347\273\223.md" index 6621e0396b..95832a787b 100644 --- "a/problems/\345\217\214\346\214\207\351\222\210\346\200\273\347\273\223.md" +++ "b/problems/\345\217\214\346\214\207\351\222\210\346\200\273\347\273\223.md" @@ -90,7 +90,7 @@ for (int i = 0; i < array.size(); i++) { ## 总结 -本文中一共介绍了leetcode上九道使用双指针解决问题的经典题目,除了链表一些题目一定要使用双指针,其他题目都是使用双指针来提高效率,一般是将O(n^2)的时间复杂度,降为$O(n)$。 +本文中一共介绍了leetcode上九道使用双指针解决问题的经典题目,除了链表一些题目一定要使用双指针,其他题目都是使用双指针来提高效率,一般是将O(n^2)的时间复杂度,降为 $O(n)$ 。 建议大家可以把文中涉及到的题目在好好做一做,琢磨琢磨,基本对双指针法就不在话下了。 From f9ef9e9f20d97b8a1097905ca48ecad24fe8bdaf Mon Sep 17 00:00:00 2001 From: departever <2233492563@qq.com> Date: Mon, 25 Mar 2024 15:36:53 +0800 Subject: [PATCH 2562/3019] =?UTF-8?q?=E5=B0=86java=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E8=B5=8E=E9=87=91=E4=BF=A1=E4=B8=AD=E7=9A=84=E6=B3=A8=E9=87=8A?= =?UTF-8?q?=E7=9A=84=E6=80=BB=E5=AD=97=E4=BF=AE=E6=94=B9=E4=B8=AD=E5=AD=97?= =?UTF-8?q?=E4=BE=BF=E4=BA=8E=E7=90=86=E8=A7=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "problems/0383.\350\265\216\351\207\221\344\277\241.md" | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git "a/problems/0383.\350\265\216\351\207\221\344\277\241.md" "b/problems/0383.\350\265\216\351\207\221\344\277\241.md" index ff5aafed62..ca877f0a8b 100644 --- "a/problems/0383.\350\265\216\351\207\221\344\277\241.md" +++ "b/problems/0383.\350\265\216\351\207\221\344\277\241.md" @@ -133,7 +133,7 @@ class Solution { record[c - 'a'] -= 1; } - // 如果数组中存在负数,说明ransomNote字符串总存在magazine中没有的字符 + // 如果数组中存在负数,说明ransomNote字符串中存在magazine中没有的字符 for(int i : record){ if(i < 0){ return false; @@ -469,4 +469,3 @@ bool canConstruct(char* ransomNote, char* magazine) { - From 10af2bdde48a77285aaeae879fadf3b59ce123de Mon Sep 17 00:00:00 2001 From: alain Date: Mon, 25 Mar 2024 16:24:29 +0800 Subject: [PATCH 2563/3019] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=BA=8C=E5=88=86?= =?UTF-8?q?=E6=B3=95=20Rust=20=E7=A4=BA=E4=BE=8B=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...14\345\210\206\346\237\245\346\211\276.md" | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git "a/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" "b/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" index 31e89ae344..8ff6a6fcdb 100644 --- "a/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" +++ "b/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" @@ -501,19 +501,19 @@ func search(nums: [Int], target: Int) -> Int { ### **Rust:** -(版本一)左闭右开区间 +(版本一)左闭右闭区间 ```rust use std::cmp::Ordering; impl Solution { pub fn search(nums: Vec, target: i32) -> i32 { - let (mut left, mut right) = (0, nums.len()); - while left < right { + let (mut left, mut right) = (0_i32, nums.len() as i32 - 1); + while left <= right { let mid = (right + left) / 2; - match nums[mid].cmp(&target) { + match nums[mid as usize].cmp(&target) { Ordering::Less => left = mid + 1, - Ordering::Greater => right = mid, - Ordering::Equal => return mid as i32, + Ordering::Greater => right = mid - 1, + Ordering::Equal => return mid, } } -1 @@ -521,19 +521,19 @@ impl Solution { } ``` -//(版本二)左闭右闭区间 +//(版本二)左闭右开区间 ```rust use std::cmp::Ordering; impl Solution { pub fn search(nums: Vec, target: i32) -> i32 { - let (mut left, mut right) = (0, nums.len()); - while left <= right { + let (mut left, mut right) = (0_i32, nums.len() as i32); + while left < right { let mid = (right + left) / 2; - match nums[mid].cmp(&target) { + match nums[mid as usize].cmp(&target) { Ordering::Less => left = mid + 1, - Ordering::Greater => right = mid - 1, - Ordering::Equal => return mid as i32, + Ordering::Greater => right = mid, + Ordering::Equal => return mid, } } -1 From 8452d5f06743e037eac7dab0898e7ed4e5a2f2af Mon Sep 17 00:00:00 2001 From: Henry Zheng <1204831218@qq.com> Date: Tue, 26 Mar 2024 11:23:25 +0800 Subject: [PATCH 2564/3019] add a new python version --- ...204\347\232\204\345\271\263\346\226\271.md" | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git "a/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" "b/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" index 5bdbcbc7e0..bb311ca2cd 100644 --- "a/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" +++ "b/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" @@ -178,6 +178,24 @@ class Solution: return sorted(x*x for x in nums) ``` +```Python +(版本四) 双指针+ 反转列表 +class Solution: + def sortedSquares(self, nums: List[int]) -> List[int]: + #根据list的先进排序在先原则 + #将nums的平方按从大到小的顺序添加进新的list + #最后反转list + new_list = [] + left, right = 0 , len(nums) -1 + while left <= right: + if abs(nums[left]) <= abs(nums[right]): + new_list.append(nums[right] ** 2) + right -= 1 + else: + new_list.append(nums[left] ** 2) + left += 1 + return new_list[::-1] + ### Go: ```Go From 92850e8a47b1c7ecba1aef99fdbc38bf2d9a52e9 Mon Sep 17 00:00:00 2001 From: WilsonKuo <78621847+WilsonKuo@users.noreply.github.com> Date: Tue, 26 Mar 2024 14:55:16 +0800 Subject: [PATCH 2565/3019] =?UTF-8?q?Update=200203.=E7=A7=BB=E9=99=A4?= =?UTF-8?q?=E9=93=BE=E8=A1=A8=E5=85=83=E7=B4=A0.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Typo : std::men::replace -> std::mem::replace --- ...\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" "b/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" index d6d7e6c2ef..5baaef079b 100644 --- "a/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" +++ "b/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" @@ -545,7 +545,7 @@ impl Solution { let mut dummyHead = Box::new(ListNode::new(0)); dummyHead.next = head; let mut cur = dummyHead.as_mut(); - // 使用take()替换std::men::replace(&mut node.next, None)达到相同的效果,并且更普遍易读 + // 使用take()替换std::mem::replace(&mut node.next, None)达到相同的效果,并且更普遍易读 while let Some(nxt) = cur.next.take() { if nxt.val == val { cur.next = nxt.next; From 5ec766c81b2758341dd039f5204fd4f73c29164e Mon Sep 17 00:00:00 2001 From: paigeman <53284808+paigeman@users.noreply.github.com> Date: Tue, 26 Mar 2024 20:22:40 +0800 Subject: [PATCH 2566/3019] =?UTF-8?q?Update=20=E6=A0=88=E4=B8=8E=E9=98=9F?= =?UTF-8?q?=E5=88=97=E6=80=BB=E7=BB=93.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\270\216\351\230\237\345\210\227\346\200\273\347\273\223.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/\346\240\210\344\270\216\351\230\237\345\210\227\346\200\273\347\273\223.md" "b/problems/\346\240\210\344\270\216\351\230\237\345\210\227\346\200\273\347\273\223.md" index 06a7827050..1a1fdbd21a 100644 --- "a/problems/\346\240\210\344\270\216\351\230\237\345\210\227\346\200\273\347\273\223.md" +++ "b/problems/\346\240\210\344\270\216\351\230\237\345\210\227\346\200\273\347\273\223.md" @@ -142,7 +142,7 @@ cd a/b/c/../../ 本题就要**使用优先级队列来对部分频率进行排序。** 注意这里是对部分数据进行排序而不需要对所有数据排序! -所以排序的过程的时间复杂度是$O(\log k)$,整个算法的时间复杂度是$O(n\log k)$。 +所以排序的过程的时间复杂度是 $O(\log k)$ ,整个算法的时间复杂度是 $O(n\log k)$ 。 ## 总结 From e56494b0828ae4d1cee61b48f03da00d0a13bc3c Mon Sep 17 00:00:00 2001 From: alain Date: Wed, 27 Mar 2024 15:28:42 +0800 Subject: [PATCH 2567/3019] =?UTF-8?q?fix=200035=5F=E6=90=9C=E7=B4=A2?= =?UTF-8?q?=E6=8F=92=E5=85=A5=E4=BD=8D=E7=BD=AE=20Rust=20=E7=A4=BA?= =?UTF-8?q?=E4=BE=8B=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...222\345\205\245\344\275\215\347\275\256.md" | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git "a/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" "b/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" index 80b7e40e4a..34415524c6 100644 --- "a/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" +++ "b/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" @@ -313,18 +313,18 @@ func searchInsert(nums []int, target int) int { ```rust impl Solution { - pub fn search_insert(nums: Vec, target: i32) -> i32 { - let mut left = 0; - let mut right = nums.len(); - while left < right { + pub fn search_insert(nums: Vec, target: i32) -> i32 { + use std::cmp::Ordering::{Equal, Greater, Less}; + let (mut left, mut right) = (0, nums.len() as i32 - 1); + while left <= right { let mid = (left + right) / 2; - match nums[mid].cmp(&target) { - Ordering::Less => left = mid + 1, - Ordering::Equal => return ((left + right) / 2) as i32, - Ordering::Greater => right = mid, + match nums[mid as usize].cmp(&target) { + Less => left = mid + 1, + Equal => return mid, + Greater => right = mid - 1, } } - ((left + right) / 2) as i32 + right + 1 } } ``` From 304e85eaae8b5fd658e552abda950c17cab9f5c6 Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Thu, 28 Mar 2024 17:12:11 +0800 Subject: [PATCH 2568/3019] Update --- README.md | 19 +++---------------- 1 file changed, 3 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index b25b102dfe..212a8b2a4e 100644 --- a/README.md +++ b/README.md @@ -507,24 +507,11 @@ # 关于作者 -大家好,我是程序员Carl,哈工大师兄,《代码随想录》作者,先后在腾讯和百度从事后端技术研发。对算法和C++后端技术有一定的见解,利用工作之余重新刷leetcode。 +大家好,我是程序员Carl,哈工大师兄,《代码随想录》作者,先后在腾讯和百度从事后端技术底层技术研发。 -加入「代码随想录」刷题小分队(微信群),可以扫下方二维码,加代码随想录客服微信。 - -如果是已工作,备注:姓名-城市-岗位-组队刷题。如果学生,备注:姓名-学校-年级-组队刷题。**备注没有自我介绍不通过哦** +# PDF下载 +添加如下企业微信,会自动发送给大家PDF版本,顺便可以选择是否加入刷题群。
- -# 公众号 - -更多精彩文章持续更新,微信搜索:「代码随想录」第一时间围观,关注后回复:666,可以获得我的所有算法专题原创PDF。 - -**来看看就知道了,你会发现相见恨晚!** - - - -
- - From a0cfe9e7c883db1fea7d168e8aac4f14c504ebc8 Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Thu, 28 Mar 2024 17:14:50 +0800 Subject: [PATCH 2569/3019] Update --- ...73\351\231\244\345\205\203\347\264\240.md" | 29 ------------------- 1 file changed, 29 deletions(-) diff --git "a/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" "b/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" index dbde3d198c..3aadb67e83 100644 --- "a/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" +++ "b/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" @@ -119,35 +119,6 @@ public: * 时间复杂度:O(n) * 空间复杂度:O(1) -```CPP -/** -* 相向双指针方法,基于元素顺序可以改变的题目描述改变了元素相对位置,确保了移动最少元素 -* 时间复杂度:O(n) -* 空间复杂度:O(1) -*/ -class Solution { -public: - int removeElement(vector& nums, int val) { - int leftIndex = 0; - int rightIndex = nums.size() - 1; - while (leftIndex <= rightIndex) { - // 找左边等于val的元素 - while (leftIndex <= rightIndex && nums[leftIndex] != val){ - ++leftIndex; - } - // 找右边不等于val的元素 - while (leftIndex <= rightIndex && nums[rightIndex] == val) { - -- rightIndex; - } - // 将右边不等于val的元素覆盖左边等于val的元素 - if (leftIndex < rightIndex) { - nums[leftIndex++] = nums[rightIndex--]; - } - } - return leftIndex; // leftIndex一定指向了最终数组末尾的下一个元素 - } -}; -``` ## 相关题目推荐 From e3c4c20e5e08e7e8e10108315f517414297c30e0 Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Thu, 28 Mar 2024 20:33:27 +0800 Subject: [PATCH 2570/3019] Update --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 212a8b2a4e..7c26d2c924 100644 --- a/README.md +++ b/README.md @@ -511,7 +511,9 @@ # PDF下载 -添加如下企业微信,会自动发送给大家PDF版本,顺便可以选择是否加入刷题群。 +添加如下企业微信,会自动发送给大家PDF版本,顺便可以选择是否加入刷题群。 + +添加微信记得备注,如果是已工作,备注:姓名-城市-岗位。如果学生,备注:姓名-学校-年级。**备注没有自我介绍不通过哦**
From 20db66e8fb5dbc39d7772184e19a98eb412f930e Mon Sep 17 00:00:00 2001 From: Henry Zheng <1204831218@qq.com> Date: Fri, 29 Mar 2024 11:11:39 +0800 Subject: [PATCH 2571/3019] =?UTF-8?q?update=200151.=E7=BF=BB=E8=BD=AC?= =?UTF-8?q?=E5=AD=97=E7=AC=A6=E4=B8=B2=E9=87=8C=E7=9A=84=E5=8D=95=E8=AF=8D?= =?UTF-8?q?=20python=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...262\351\207\214\347\232\204\345\215\225\350\257\215.md" | 7 +++++++ 1 file changed, 7 insertions(+) diff --git "a/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" "b/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" index 520f17a7ec..7a37ad075a 100644 --- "a/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" +++ "b/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" @@ -467,6 +467,13 @@ class Solution: # 将列表转换成字符串 return " ".join(words) ``` +(版本三) 拆分字符串 + 反转列表 +```python +class Solution: + def reverseWords(self, s): + words = s.split() #type(words) --- list + words = words[::-1] # 反转单词 + return ' '.join(words) #列表转换成字符串 ### Go: From e5c4d56d01713495d0287b7a0a381e326f1b34f7 Mon Sep 17 00:00:00 2001 From: Henry Zheng <1204831218@qq.com> Date: Fri, 29 Mar 2024 11:26:09 +0800 Subject: [PATCH 2572/3019] =?UTF-8?q?update=20kama55.=E5=8F=B3=E6=97=8B?= =?UTF-8?q?=E5=AD=97=E7=AC=A6=E4=B8=B2.md=20python=20=E5=88=87=E7=89=87?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...263\346\227\213\345\255\227\347\254\246\344\270\262.md" | 7 +++++++ 1 file changed, 7 insertions(+) diff --git "a/problems/kama55.\345\217\263\346\227\213\345\255\227\347\254\246\344\270\262.md" "b/problems/kama55.\345\217\263\346\227\213\345\255\227\347\254\246\344\270\262.md" index 7137186042..0188918e00 100644 --- "a/problems/kama55.\345\217\263\346\227\213\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/kama55.\345\217\263\346\227\213\345\255\227\347\254\246\344\270\262.md" @@ -222,6 +222,13 @@ s = s[len(s)-k:] + s[:len(s)-k] print(s) ``` +```Python 切片法 +k = int(input()) +s = input() + +print(s[-k:] + s[:-k]) +``` + ### Go: ```go package main From ee99a72d18c6134c314337f7ac66f9232b9d4a61 Mon Sep 17 00:00:00 2001 From: heystone999 <52831724+heystone999@users.noreply.github.com> Date: Sat, 30 Mar 2024 15:51:43 -0400 Subject: [PATCH 2573/3019] =?UTF-8?q?feat(problem):=20=E6=9B=B4=E6=96=B001?= =?UTF-8?q?08.=E5=B0=86=E6=9C=89=E5=BA=8F=E6=95=B0=E7=BB=84=E8=BD=AC?= =?UTF-8?q?=E6=8D=A2=E4=B8=BA=E4=BA=8C=E5=8F=89=E6=90=9C=E7=B4=A2=E6=A0=91?= =?UTF-8?q?=E3=80=82=E6=B7=BB=E5=8A=A0=E4=BA=86Python=E9=80=92=E5=BD=92?= =?UTF-8?q?=E7=9A=84=E7=B2=BE=E7=AE=80=E7=89=88=EF=BC=8C=E8=87=AA=E8=BA=AB?= =?UTF-8?q?=E8=B0=83=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...5\217\211\346\220\234\347\264\242\346\240\221.md" | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git "a/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" index 9fa684cfdf..dd2245db2f 100644 --- "a/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" +++ "b/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" @@ -334,6 +334,18 @@ class Solution: return root ``` +递归 精简(自身调用) +```python +class Solution: + def sortedArrayToBST(self, nums: List[int]) -> Optional[TreeNode]: + if not nums: + return + mid = len(nums) // 2 + root = TreeNode(nums[mid]) + root.left = self.sortedArrayToBST(nums[:mid]) + root.right = self.sortedArrayToBST(nums[mid + 1 :]) + return root +``` 迭代法 ```python From 96e9fcb3adc8676fd6ea0671d0ddbb7d9291eaeb Mon Sep 17 00:00:00 2001 From: jiyongchao Date: Sun, 31 Mar 2024 11:19:54 +0800 Subject: [PATCH 2574/3019] =?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 --- ...32\204\345\255\227\346\257\215\347\273\204\345\220\210.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" "b/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" index cbd99f8d93..0ad26bfda3 100644 --- "a/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" +++ "b/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" @@ -260,7 +260,7 @@ class Solution { } - //每次迭代获取一个字符串,所以会设计大量的字符串拼接,所以这里选择更为高效的 StringBuilder + //每次迭代获取一个字符串,所以会涉及大量的字符串拼接,所以这里选择更为高效的 StringBuilder StringBuilder temp = new StringBuilder(); //比如digits如果为"23",num 为0,则str表示2对应的 abc @@ -274,7 +274,7 @@ class Solution { String str = numString[digits.charAt(num) - '0']; for (int i = 0; i < str.length(); i++) { temp.append(str.charAt(i)); - //c + //递归,处理下一层 backTracking(digits, numString, num + 1); //剔除末尾的继续尝试 temp.deleteCharAt(temp.length() - 1); From 9437047fae6056b05e731f16eb3d7625b9c5bed5 Mon Sep 17 00:00:00 2001 From: LingFenglong <2808021998@qq.com> Date: Sun, 31 Mar 2024 21:55:19 +0800 Subject: [PATCH 2575/3019] =?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 Fix 300. 最长递增子序列 Java版本添加参数数组长度判断,现在可以AC --- ...270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git "a/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" "b/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" index 6d82eae1e9..199ae59e4b 100644 --- "a/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" @@ -129,6 +129,7 @@ public: ```Java class Solution { public int lengthOfLIS(int[] nums) { + if (nums.length <= 1) return nums.length; int[] dp = new int[nums.length]; int res = 1; Arrays.fill(dp, 1); @@ -137,8 +138,8 @@ class Solution { if (nums[i] > nums[j]) { dp[i] = Math.max(dp[i], dp[j] + 1); } - res = Math.max(res, dp[i]); } + res = Math.max(res, dp[i]); } return res; } From 0c2cc182304c826ef49e25dceffe4e6dc1187762 Mon Sep 17 00:00:00 2001 From: Junhao Qu <869142649qq@gmail.com> Date: Mon, 1 Apr 2024 22:25:54 -0700 Subject: [PATCH 2576/3019] fix java version for linked list 19 --- ...225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" "b/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" index c7a2cfcb3f..167b44ba8b 100644 --- "a/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" +++ "b/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" @@ -106,7 +106,7 @@ public ListNode removeNthFromEnd(ListNode head, int n){ ListNode slowIndex = dummyNode; // 只要快慢指针相差 n 个结点即可 - for (int i = 0; i < n ; i++){ + for (int i = 0; i <= n ; i++){ fastIndex = fastIndex.next; } From 3193d16f53372a6bd9d294538a83ef3e5d92a87f Mon Sep 17 00:00:00 2001 From: matthew <1123957599@qq.com> Date: Tue, 2 Apr 2024 14:53:01 +0800 Subject: [PATCH 2577/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A00279.=E5=AE=8C?= =?UTF-8?q?=E5=85=A8=E5=B9=B3=E6=96=B9=E6=95=B0=20Python=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...50\345\271\263\346\226\271\346\225\260.md" | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git "a/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" "b/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" index f7c06dbd87..1b29626f7a 100644 --- "a/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" +++ "b/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" @@ -271,7 +271,27 @@ class Solution: # 返回结果 return dp[n] +``` +```python +class Solution(object): + def numSquares(self, n): + # 先把可以选的数准备好,更好理解 + nums, num = [], 1 + while num ** 2 <= n: + nums.append(num ** 2) + num += 1 + # dp数组初始化 + dp = [float('inf')] * (n + 1) + dp[0] = 0 + # 遍历准备好的完全平方数 + for i in range(len(nums)): + # 遍历背包容量 + for j in range(nums[i], n+1): + dp[j] = min(dp[j], dp[j-nums[i]]+1) + # 返回结果 + return dp[-1] + ``` ### Go: From c25c409c50096583962da6257e4edecc521d5fd7 Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Tue, 2 Apr 2024 16:55:47 +0800 Subject: [PATCH 2578/3019] Update --- ...7.\350\257\276\347\250\213\350\241\250.md" | 51 +++ ...66\350\277\237\346\227\266\351\227\264.md" | 17 +- ...34\347\232\204\350\210\252\347\217\255.md" | 136 ++++++- ...21\347\232\204\345\237\216\345\270\202.md" | 46 +++ ...7\347\211\251\350\277\220\350\276\223I.md" | 371 ++++++++++++++++++ ...\347\211\251\350\277\220\350\276\223II.md" | 150 +++++++ ...347\211\251\350\277\220\350\276\223III.md" | 125 ++++++ ...17\345\221\230\347\256\200\345\216\206.md" | 8 +- 8 files changed, 891 insertions(+), 13 deletions(-) create mode 100644 "problems/0207.\350\257\276\347\250\213\350\241\250.md" create mode 100644 "problems/1334.\351\230\210\345\200\274\350\267\235\347\246\273\345\206\205\351\202\273\345\261\205\346\234\200\345\260\221\347\232\204\345\237\216\345\270\202.md" create mode 100644 "problems/kama94.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I.md" create mode 100644 "problems/kama95.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223II.md" create mode 100644 "problems/kama96.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223III.md" diff --git "a/problems/0207.\350\257\276\347\250\213\350\241\250.md" "b/problems/0207.\350\257\276\347\250\213\350\241\250.md" new file mode 100644 index 0000000000..18c4684081 --- /dev/null +++ "b/problems/0207.\350\257\276\347\250\213\350\241\250.md" @@ -0,0 +1,51 @@ + +拓扑排序指的是一种 解决问题的大体思路, 而具体算法,可能是 广搜 可能是深搜。 + +大家可能发现 各式各样的解法,纠结哪个是拓扑排序? + +只要能在把 有向无环图 进行线性排序 的算法 都可以叫做 拓扑排序。 + +引用与任务调度,课程安排等等。 + +为什么 + + +----- + +「拓扑排序」是专门应用于有向图的算法; + +把一个 有向无环图 转成 线性的排序 就叫 拓扑排序。 + +拓扑排序(Kahn 算法,其实就是广度优先遍历的思路) + +这道题的做法同样适用于第 210 题。 + +------------------ + +``` +vector inDegree(numCourses); +unordered_map> map; +for (int i = 0; i < prerequisites.size(); i++) { + inDegree[prerequisites[i][0]]++;//当前课程入度值+1 + map[prerequisites[i][1]].push_back(prerequisites[i][0]);//添加依赖他的后续课 +} +queue Qu; +for (int i = 0; i < numCourses; i++) { + if (inDegree[i] == 0) Qu.push(i);//所有入度为0的课入列 +} +int count = 0; +while (Qu.size()) { + int selected = Qu.front(); //当前选的课 + Qu.pop();//出列 + count++;//选课数+1 + vector toEnQueue = map[selected];//获取这门课对应的后续课 + if (toEnQueue.size()) { //确实有后续课 + for (int i = 0; i < toEnQueue.size(); i++) { + inDegree[toEnQueue[i]]--; //依赖它的后续课的入度-1 + if (inDegree[toEnQueue[i]] == 0) Qu.push(toEnQueue[i]); //如果因此减为0,入列 + } + } +} +if (count == numCourses) return true; +return false; +``` diff --git "a/problems/0743.\347\275\221\347\273\234\345\273\266\350\277\237\346\227\266\351\227\264.md" "b/problems/0743.\347\275\221\347\273\234\345\273\266\350\277\237\346\227\266\351\227\264.md" index d94406091b..e631951a9e 100644 --- "a/problems/0743.\347\275\221\347\273\234\345\273\266\350\277\237\346\227\266\351\227\264.md" +++ "b/problems/0743.\347\275\221\347\273\234\345\273\266\350\277\237\346\227\266\351\227\264.md" @@ -1194,8 +1194,7 @@ public: 至此通过 两篇dijkstra的文章,终于把 dijkstra 讲完了,如果大家对我讲解里所涉及的内容都吃透的话,详细对 dijkstra 算法也就理解到位了。 - -# Bellman_ford +这里在给出本题的Bellman_ford解法,关于 Bellman_ford ,后面我会专门来讲解的,Bellman_ford 有其独特的应用场景 ```CPP class Solution { @@ -1204,27 +1203,25 @@ public: int networkDelayTime(vector>& times, int n, int k) { vector minDist(n + 1 , INT_MAX/2); minDist[k] = 0; - vector minDist_copy(n); // 用来记录每一次遍历的结果 + //vector minDist_copy(n); // 用来记录每一次遍历的结果 for (int i = 1; i <= n + 1; i++) { - minDist_copy = minDist; // 获取上一次计算的结果 + //minDist_copy = minDist; // 获取上一次计算的结果 for (auto &f : times) { int from = f[0]; int to = f[1]; - int price = f[2]; - if (minDist[to] > minDist_copy[from] + price) minDist[to] = minDist_copy[from] + price; - } + int price = f[2]; + if (minDist[to] > minDist[from] + price) minDist[to] = minDist[from] + price; + } } - int result = 0; + int result = 0; for (int i = 1;i <= n; i++) { if (minDist[i] == INT_MAX/2) return -1;// 没有路径 result = max(minDist[i], result); } - return result; } }; - ``` diff --git "a/problems/0787.K\347\253\231\344\270\255\350\275\254\345\206\205\346\234\200\344\276\277\345\256\234\347\232\204\350\210\252\347\217\255.md" "b/problems/0787.K\347\253\231\344\270\255\350\275\254\345\206\205\346\234\200\344\276\277\345\256\234\347\232\204\350\210\252\347\217\255.md" index c7b6236b78..1ece7116f2 100644 --- "a/problems/0787.K\347\253\231\344\270\255\350\275\254\345\206\205\346\234\200\344\276\277\345\256\234\347\232\204\350\210\252\347\217\255.md" +++ "b/problems/0787.K\347\253\231\344\270\255\350\275\254\345\206\205\346\234\200\344\276\277\345\256\234\347\232\204\350\210\252\347\217\255.md" @@ -1,4 +1,21 @@ +# 787. K 站中转内最便宜的航班 + +有 n 个城市通过一些航班连接。给你一个数组 flights ,其中 flights[i] = [fromi, toi, pricei] ,表示该航班都从城市 fromi 开始,以价格 pricei 抵达 toi。 + +现在给定所有的城市和航班,以及出发城市 src 和目的地 dst,你的任务是找到出一条最多经过 k 站中转的路线,使得从 src 到 dst 的 价格最便宜 ,并返回该价格。 如果不存在这样的路线,则输出 -1。 + + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240319103900.png) + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240319103919.png) + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240319104026.png) + + +## 思路 + + ```CPP class Solution { @@ -13,7 +30,8 @@ public: int from = f[0]; int to = f[1]; int price = f[2]; - if (minDist[to] > minDist_copy[from] + price) minDist[to] = minDist_copy[from] + price; + minDist[to] = min(minDist_copy[from] + price, minDist[to]); + // if (minDist[to] > minDist_copy[from] + price) minDist[to] = minDist_copy[from] + price; } } @@ -23,6 +41,8 @@ public: }; ``` +下面是典型的错误写法 + ```CPP class Solution { public: @@ -42,3 +62,117 @@ public: } }; ``` + + +----------- + +SPFA + + +class Solution { +struct Edge { + int to; // 链接的节点 + int val; // 边的权重 + + Edge(int t, int w): to(t), val(w) {} // 构造函数 +}; + +public: + int findCheapestPrice(int n, vector>& flights, int src, int dst, int k) { + vector minDist(n , INT_MAX/2); + vector> grid(n + 1); // 邻接表 + for (auto &f : flights) { + int from = f[0]; + int to = f[1]; + int price = f[2]; + grid[from].push_back(Edge(to, price)); + + } + minDist[src] = 0; + vector minDist_copy(n); // 用来记录每一次遍历的结果 + k++; + queue que; + que.push(src); + std::vector visited(n + 1, false); // 可加,可不加,加了效率高一些,防止重复访问 + int que_size; + while (k-- && !que.empty()) { + + minDist_copy = minDist; // 获取上一次计算的结果 + que_size = que.size(); + while (que_size--) { // 这个while循环的设计实在是妙啊 + int node = que.front(); que.pop(); + for (Edge edge : grid[node]) { + int from = node; + int to = edge.to; + int price = edge.val; + if (minDist[to] > minDist_copy[from] + price) { + minDist[to] = minDist_copy[from] + price; + que.push(to); + } + } + + } + } + int result = minDist[dst] == INT_MAX/2 ? -1 : minDist[dst]; + return result; + } +}; + + +----------------- + +队列加上 visited 不能重复访问 + +class Solution { +struct Edge { + int to; // 链接的节点 + int val; // 边的权重 + + Edge(int t, int w): to(t), val(w) {} // 构造函数 +}; + +public: + int findCheapestPrice(int n, vector>& flights, int src, int dst, int k) { + vector minDist(n , INT_MAX/2); + vector> grid(n + 1); // 邻接表 + for (auto &f : flights) { + int from = f[0]; + int to = f[1]; + int price = f[2]; + grid[from].push_back(Edge(to, price)); + + } + minDist[src] = 0; + vector minDist_copy(n); // 用来记录每一次遍历的结果 + k++; + queue que; + que.push(src); + int que_size; + while (k-- && !que.empty()) { + // 注意这个数组放的位置 + vector visited(n + 1, false); // 可加,可不加,加了效率高一些,防止队列里重复访问,其数值已经算过了 + minDist_copy = minDist; // 获取上一次计算的结果 + que_size = que.size(); + while (que_size--) { + int node = que.front(); que.pop(); + for (Edge edge : grid[node]) { + int from = node; + int to = edge.to; + int price = edge.val; + if (minDist[to] > minDist_copy[from] + price) { + minDist[to] = minDist_copy[from] + price; + if(visited[to]) continue; // 不用重复放入队列,但需要重复计算,所以放在这里位置 + visited[to] = true; + que.push(to); + } + } + + } + } + int result = minDist[dst] == INT_MAX/2 ? -1 : minDist[dst]; + return result; + } +}; + + + diff --git "a/problems/1334.\351\230\210\345\200\274\350\267\235\347\246\273\345\206\205\351\202\273\345\261\205\346\234\200\345\260\221\347\232\204\345\237\216\345\270\202.md" "b/problems/1334.\351\230\210\345\200\274\350\267\235\347\246\273\345\206\205\351\202\273\345\261\205\346\234\200\345\260\221\347\232\204\345\237\216\345\270\202.md" new file mode 100644 index 0000000000..2156ee041d --- /dev/null +++ "b/problems/1334.\351\230\210\345\200\274\350\267\235\347\246\273\345\206\205\351\202\273\345\261\205\346\234\200\345\260\221\347\232\204\345\237\216\345\270\202.md" @@ -0,0 +1,46 @@ + +floyd + + +class Solution { +public: + int findTheCity(int n, vector>& edges, int distanceThreshold) { + vector> grid(n, vector(n, 10005)); // 因为边的最大距离是10^4 + + // 节点到自己的距离为0 + for (int i = 0; i < n; i++) grid[i][i] = 0; + // 构造邻接矩阵 + for (const vector& e : edges) { + int from = e[0]; + int to = e[1]; + int val = e[2]; + grid[from][to] = val; + grid[to][from] = val; // 注意这里是双向图 + } + + // 开始 floyd + // 思考 为什么 p 要放在最外面一层 + for (int p = 0; p < n; p++) { + for (int i = 0; i < n; i++) { + for (int j = 0; j < n; j++) { + grid[i][j] = min(grid[i][j], grid[i][p] + grid[p][j]); + } + } + } + + int result = 0; + int count = n + 10; // 记录所有城市在范围内连接的最小城市数量 + for (int i = 0; i < n; i++) { + int curCount = 0; // 统计一个城市在范围内可以连接几个城市 + for (int j = 0; j < n; j++) { + if (i != j && grid[i][j] <= distanceThreshold) curCount++; + // cout << "i:" << i << ", j:" << j << ", val: " << grid[i][j] << endl; + } + if (curCount <= count) { // 注意这里是 <= + count = curCount; + result = i; + } + } + return result; + } +}; diff --git "a/problems/kama94.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I.md" "b/problems/kama94.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I.md" new file mode 100644 index 0000000000..836ac34562 --- /dev/null +++ "b/problems/kama94.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I.md" @@ -0,0 +1,371 @@ + +# 94. 城市间货物运输 I + +[题目链接](https://kamacoder.com/problempage.php?pid=1152) + +题目描述 + +某国为促进城市间经济交流,决定对货物运输提供补贴。共有 n 个编号为 1 到 n 的城市,通过道路网络连接,网络中的道路仅允许从某个城市单向通行到另一个城市,不能反向通行。 + + +网络中的道路都有各自的运输成本和政府补贴,道路的权值计算方式为:运输成本 - 政府补贴。权值为正表示扣除了政府补贴后运输货物仍需支付的费用;权值为负则表示政府的补贴超过了支出的运输成本,实际表现为运输过程中还能赚取一定的收益。 + + +请找出从城市 1 到城市 n 的所有可能路径中,综合政府补贴后的最低运输成本。如果最低运输成本是一个负数,它表示在遵循最优路径的情况下,运输过程中反而能够实现盈利。 + + +城市 1 到城市 n 之间可能会出现没有路径的情况,同时保证道路网络中不存在任何负权回路。 + +输入描述 + +第一行包含两个正整数,第一个正整数 n 表示该国一共有 n 个城市,第二个整数 m 表示这些城市中共有 m 条道路。 + +接下来为 m 行,每行包括三个整数,s、t 和 v,表示 s 号城市运输货物到达 t 号城市,道路权值为 v(单向图)。 + +输出描述 + +如果能够从城市 1 到连通到城市 n, 请输出一个整数,表示运输成本。如果该整数是负数,则表示实现了盈利。如果从城市 1 没有路径可达城市 n,请输出 "unconnected"。 + +输入示例: + +``` +6 7 +5 6 -2 +1 2 1 +5 3 1 +2 5 2 +2 4 -3 +4 6 4 +1 3 5 +``` + +## 思路 + +本题依然是最短路问题,求 从 节点1 到节点n 的最小费用。 但本题不同之处在于 边的权值是有负数的。 + +从 节点1 到节点n 的最小费用也可以是负数,费用如果是负数 则表示 运输的过程中 政府补贴大于运输成本。 + +在求单源最短路的方法中,使用dijkstra 的话,则要求图中边的权值都为正数。 + +我们在 [kama47.参会dijkstra朴素](./kama47.参会dijkstra朴素.md) 中专门有讲解,为什么有边为负数 使用dijkstra就不行了。 + +本题是经典的带负权值的单源最短路问题,此时就轮到Bellman_ford登场了,接下来我们来详细介绍Bellman_ford 算法 如何解决这类问题。 + +> 该算法是由 R.Bellman 和L.Ford 在20世纪50年代末期发明的算法,故称为Bellman_ford算法。 + +**Bellman_ford算法的核心思想是 对所有边进行松弛n-1次操作(n为节点数量),从而求得目标最短路**。 + + +看到这里,估计大家都比较晕了,为什么是 n-1 次,那“松弛”这两个字究竟是个啥意思? + +我们先来说什么是 “松弛”。 + +《算法四》里面把这个操作叫做 “放松”, 英文版里叫做 “relax the edge” + +所以大家翻译过来,就是 “放松” 或者 “松弛” 。 + +但《算法四》没有具体去讲这个 “放松” 究竟是个啥? 网上的题解也没有讲题解里的 “松弛这条边,松弛所有边”等等 里面的 “松弛” 究竟是什么意思? + +这里我给大家举一个例子,每条边有起点、终点和边的权值。例如一条边,节点A 到 节点B 权值为value,如图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240327102620.png) + +minDist[B] 表示 到达B节点 最小权值,minDist[B] 有哪些状态可以推出来? + +状态一: minDist[A] + value 可以推出 minDist[B] +状态二: minDist[B]本身就有权值 (可能是其他边链接的节点B 例如节点C,以至于 dp[B]记录了其他边到dp[B]的权值) + +那么minDist[B] 应为如何取舍。 + +本题我们要求最小权值,那么 这两个状态我们就取最小的 + +``` +if (minDist[B] > minDist[A] + value) minDist[B] = minDist[A] + value + +``` + +也就是说,如果 通过 A 到 B 这条边可以获得更短的到达B节点的路径,即如果 `minDist[B] > minDist[A] + value`,那么我们就更新 `minDist[B] = minDist[A] + value` ,**这个过程就叫做 “松弛**” 。 + +以上讲了这么多,其实都是围绕以下这句代码展开: + +``` +if (minDist[B] > minDist[A] + value) minDist[B] = minDist[A] + value + +``` + +**这句代码就是 Bellman_ford算法的核心操作**。 + +以上代码也可以这么写:`minDist[B] = min(minDist[A] + value, minDist[B]) ` + +如果大家看过代码随想录的动态规划章节,会发现 无论是背包问题还是子序列问题,这段代码(递推公式)出现频率非常高的。 + +其实 Bellman_ford算法 也是采用了动态规划的思想,即:将一个问题分解成多个决策阶段,通过状态之间的递归关系最后计算出全局最优解。 + +(如果理解不了动态规划的思想也无所谓,理解我上面讲的松弛操作就好) + +**那么为什么是 n - 1次 松弛呢**? + +这里要给大家模拟一遍 Bellman_ford 的算法才行,接下来我们来看看对所有边松弛 n -1 次的操作是什么样的。 + +我们依然使用**minDist数组来表达 起点到各个节点的最短距离**,例如minDist[3] = 5 表示起点到达节点3 的最小距离为5 + +### 模拟过程 + +初始化过程。 + +起点为节点1, 起点到起点的距离为0,所以 minDist[1] 初始化为0 + +如图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240328104119.png) + +其他节点对应的minDist初始化为max,因为我们要求最小距离,那么还没有计算过的节点 默认是一个最大数,这样才能更新最小距离。 + + +对所有边 进行第一次松弛: (什么是松弛,在上面我已经详细讲过) + +以示例给出的所有边为例: + +``` +5 6 -2 +1 2 1 +5 3 1 +2 5 2 +2 4 -3 +4 6 4 +1 3 5 +``` + +接下来我们来松弛一遍所有的边。 + +边:节点5 -> 节点6,权值为-2 ,minDist[5] 还是默认数值max,所以不能基于 节点5 去更新节点6,如图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240329113537.png) + +(在复习一下,minDist[5] 表示起点到节点5的最短距离) + + +边:节点1 -> 节点2,权值为1 ,minDist[2] > minDist[1] + 1 ,更新 minDist[2] = minDist[1] + 1 = 0 + 1 = 1 ,如图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240329113703.png) + +边:节点5 -> 节点3,权值为1 ,minDist[5] 还是默认数值max,所以不能基于节点5去更新节点3 如图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240329113827.png) + + +边:节点2 -> 节点5,权值为2 ,minDist[5] > minDist[2] + 2 (经过上面的计算minDist[2]已经不是默认值,而是 1),更新 minDist[5] = minDist[2] + 2 = 1 + 2 = 3 ,如图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240329113927.png) + + +边:节点2 -> 节点4,权值为-3 ,minDist[4] > minDist[2] + 2,更新 minDist[4] = minDist[2] + (-3) = 1 + (-3) = -2 ,如图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240329114036.png) + +边:节点4 -> 节点6,权值为4 ,minDist[6] > minDist[4] + 4,更新 minDist[6] = minDist[4] + 4 = -2 + 4 = 2 + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240329114120.png) + +边:节点1 -> 节点3,权值为5 ,minDist[3] > minDist[1] + 5,更新 minDist[3] = minDist[1] + 5 = 0 + 5 = 5 ,如图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240329114324.png) + +-------- + +以上是对所有边进行一次松弛之后的结果。 + +那么需要对所有边松弛几次才能得到 起点(节点1) 到终点(节点6)的最短距离呢? + +**对所有边松弛一次,相当于计算 起点到达 与起点一条边相连的节点 的最短距离**。 + +上面的距离中,我们得到里 起点达到 与起点一条边相邻的节点2 和 节点3 的最短距离,分别是 minDist[2] 和 minDist[3] + +这里有录友疑惑了 minDist[3] = 5,分明不是 起点到达 节点3 的最短距离,节点1 -> 节点2 -> 节点5 -> 节点3 这条路线 距离才是4。 + +注意我上面讲的是 **对所有边松弛一次,相当于计算 起点到达 与起点一条边相连的节点 的最短距离**,这里 说的是 一条边相连的节点。 + +与起点(节点1)一条边相邻的节点,到达节点2 最短距离是 1,到达节点3 最短距离是5。 + +而 节点1 -> 节点2 -> 节点5 -> 节点3 这条路线 是 与起点 三条边相连的路线了。 + +所以对所有边松弛一次 能得到 与起点 一条边相连的节点最短距离。 + +那对所有边松弛两次 可以得到与起点 两条边相连的节点的最短距离。 + +那对所有边松弛三次 可以得到与起点 三条边相连的节点的最短距离,这个时候,我们就能得到到达节点3真正的最短距离,也就是 节点1 -> 节点2 -> 节点5 -> 节点3 这条路线。 + +那么再回归刚刚的问题,**需要对所有边松弛几次才能得到 起点(节点1) 到终点(节点6)的最短距离呢**? + +节点数量为n,那么起点到终点,最多是 n-1 条边相连。 + +那么无论图是什么样的,边是什么样的顺序,我们对所有边松弛 n-1 次 就一定能得到 起点到达 终点的最短距离。 + +其实也同时计算出了,起点 到达 所有节点的最短距离,因为所有节点与起点连接的变数最多也就是 n-1条边。 + +截止到这里,Bellman_ford 的核心算法思路,大家就了解的差不多了。 + +共有两个关键点。 + +* “松弛”究竟是个啥 +* 为什么要对所有边松弛 n - 1 次 (n为节点个数) + +那么Bellman_ford的解题解题过程其实就是对所有边松弛 n-1 次,然后得出得到终点的最短路径。 + + + +### 代码 + +理解上面讲解的内容,代码就更容易写了,本题代码如下:(详细注释) + +```CPP +#include +#include +#include +#include +using namespace std; + +int main() { + int n, m, p1, p2, val; + cin >> n >> m; + + vector> grid; + + // 将所有边保存起来 + for(int i = 0; i < m; i++){ + cin >> p1 >> p2 >> val; + // p1 指向 p2,权值为 val + grid.push_back({p1, p2, val}); + + } + int start = 1; // 起点 + int end = n; // 终点 + + vector minDist(n + 1 , INT_MAX); + minDist[start] = 0; + for (int i = 1; i < n; i++) { // 对所有边 松弛 n-1 次 + for (vector &side : grid) { // 每一次松弛,都是对所有边进行松弛 + int from = side[0]; // 边的出发点 + int to = side[1]; // 边的到达点 + int price = side[2]; // 边的权值 + // 松弛操作 + // minDist[from] != INT_MAX 防止从未计算过的节点出发 + if (minDist[from] != INT_MAX && minDist[to] > minDist[from] + price) { + minDist[to] = minDist[from] + price; + } + } + } + if (minDist[end] == INT_MAX) cout << "unconnected" << endl; // 不能到达终点 + else cout << minDist[end] << endl; // 到达终点最短路径 + +} +``` + +### 拓展 + +有录友可能会想,那我 松弛 n 次,松弛 n + 1次,松弛 2 * n 次会怎么样? + +其实没啥影响,结果不会变的,因为 题目中说了 “同时保证道路网络中不存在任何负权回路” 也就是图中没有 负权回路(在有向图中出现有向环 且环的总权值为负数)。 + +那么我们只要松弛 n - 1次 就一定能得到结果,没必要在松弛更多次了。 + +这里有疑惑的录友,可以加上打印 minDist数组 的日志,尝试一下,看看松弛 n 次会怎么样。 +你会发现 松弛 大于 n - 1次,minDist数组 就不会变化了。 + +这里我给出打印日志的代码: + +```CPP +#include +#include +#include +#include +using namespace std; + +int main() { + int n, m, p1, p2, val; + cin >> n >> m; + + vector> grid; + + // 将所有边保存起来 + for(int i = 0; i < m; i++){ + cin >> p1 >> p2 >> val; + // p1 指向 p2,权值为 val + grid.push_back({p1, p2, val}); + + } + int start = 1; // 起点 + int end = n; // 终点 + + vector minDist(n + 1 , INT_MAX); + minDist[start] = 0; + for (int i = 1; i < n; i++) { // 对所有边 松弛 n-1 次 + for (vector &side : grid) { // 每一次松弛,都是对所有边进行松弛 + int from = side[0]; // 边的出发点 + int to = side[1]; // 边的到达点 + int price = side[2]; // 边的权值 + // 松弛操作 + // minDist[from] != INT_MAX 防止从未计算过的节点出发 + if (minDist[from] != INT_MAX && minDist[to] > minDist[from] + price) { + minDist[to] = minDist[from] + price; + } + } + cout << "对所有边松弛 " << i << "次" << endl; + for (int k = 1; k <= n; k++) { + cout << minDist[k] << " "; + } + cout << endl; + } + if (minDist[end] == INT_MAX) cout << "unconnected" << endl; // 不能到达终点 + else cout << minDist[end] << endl; // 到达终点最短路径 + +} + +``` + +通过打日志,大家发现,怎么对所有边进行第二次松弛以后结果就 不再变化了,那根本就不用松弛 n - 1啊? + +这是本题的样例的特殊性, 松弛 n-1次 是保证对任何图 都能最后求得到终点的最小距离。 + +如果还想不明白 我再举一个例子,用以下测试用例再跑一下。 + + +``` +6 5 +5 6 1 +4 5 1 +3 4 1 +2 3 1 +1 2 1 +``` + +打印结果: + +``` +对所有边松弛 1次 +0 1 2147483647 2147483647 2147483647 2147483647 +对所有边松弛 2次 +0 1 2 2147483647 2147483647 2147483647 +对所有边松弛 3次 +0 1 2 3 2147483647 2147483647 +对所有边松弛 4次 +0 1 2 3 4 2147483647 +对所有边松弛 5次 +0 1 2 3 4 5 +``` + +你会发现到 n-1 次 打印出最后的最短路结果。 + +关于上面的讲解,大家已经要多写代码去实验,验证自己的想法。 + +至于 负权回路 ,我在下一篇会专门讲解这种情况,大家有个印象就好。 + + +## 总结 + +Bellman_ford 是可以计算 负权值的单源最短路算法。 + +其算法核心思路是对 所有边进行 n-1 次 松弛。 + +弄清楚 什么是 松弛? 为什么要 n-1 次? 对理解Bellman_ford 非常重要。 + diff --git "a/problems/kama95.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223II.md" "b/problems/kama95.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223II.md" new file mode 100644 index 0000000000..7a76d3615d --- /dev/null +++ "b/problems/kama95.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223II.md" @@ -0,0 +1,150 @@ + +# 95. 城市间货物运输 II + +[题目链接](https://kamacoder.com/problempage.php?pid=1153) + +【题目描述】 + +某国为促进城市间经济交流,决定对货物运输提供补贴。共有 n 个编号为 1 到 n 的城市,通过道路网络连接,网络中的道路仅允许从某个城市单向通行到另一个城市,不能反向通行。 + +网络中的道路都有各自的运输成本和政府补贴,道路的权值计算方式为:运输成本 - 政府补贴。权值为正表示扣除了政府补贴后运输货物仍需支付的费用; + +权值为负则表示政府的补贴超过了支出的运输成本,实际表现为运输过程中还能赚取一定的收益。 + +然而,在评估从城市 1 到城市 n 的所有可能路径中综合政府补贴后的最低运输成本时,存在一种情况:图中可能出现负权回路。 + +负权回路是指一系列道路的总权值为负,这样的回路使得通过反复经过回路中的道路,理论上可以无限地减少总成本或无限地增加总收益。 + +为了避免货物运输商采用负权回路这种情况无限的赚取政府补贴,算法还需检测这种特殊情况。 + +请找出从城市 1 到城市 n 的所有可能路径中,综合政府补贴后的最低运输成本。同时能够检测并适当处理负权回路的存在。 + +城市 1 到城市 n 之间可能会出现没有路径的情况 + +【输入描述】 + +第一行包含两个正整数,第一个正整数 n 表示该国一共有 n 个城市,第二个整数 m 表示这些城市中共有 m 条道路。 + +接下来为 m 行,每行包括三个整数,s、t 和 v,表示 s 号城市运输货物到达 t 号城市,道路权值为 v。 + +【输出描述】 + +如果没有发现负权回路,则输出一个整数,表示从城市 1 到城市 n 的最低运输成本(包括政府补贴)。 + +如果该整数是负数,则表示实现了盈利。如果发现了负权回路的存在,则输出 "circle"。如果从城市 1 无法到达城市 n,则输出 "unconnected"。 + + +输入示例 + +``` +4 4 +1 2 -1 +2 3 1 +3 1 -1 +3 4 1 +``` + +输出示例 + +``` +circle +``` + +## 思路 + +本题是 [kama94.城市间货物运输I](./kama94.城市间货物运输I.md) 延伸题目。 + +本题是要我们判断 负权回路,也就是图中出现环且环上的边总权值为负数。 + +如果在这样的图中求最短路的话, 就会在这个环里无限循环 (也是负数+负数 只会越来越小),无法求出最短路径。 + +所以对于 在有负权值的图中求最短路,都需要先看看这个图里有没有负权回路。 + +接下来我们来看 如何使用 bellman_ford 算法来判断 负权回路。 + +在 [kama94.城市间货物运输I](./kama94.城市间货物运输I.md) 中 我们讲了 bellman_ford 算法的核心就是一句话:对 所有边 进行 n-1 次松弛。 同时文中的 【拓展】部分, 我们也讲了 松弛n次以上 会怎么样? + +在没有负权回路的图中,松弛 n 次以上 ,结果不会有变化。 + +但本题有 负权回路,如果松弛 n 次,结果就会有变化了,因为 有负权回路 就是可以无限最短路径(一直绕圈,就可以一直得到无限小的最短距离)。 + +那么每松弛一次,都会更新最短路径,所以结果会一直有变化。 + +(如果对于 bellman_ford 不了解的录友,建议详细看这里:[kama94.城市间货物运输I](./kama94.城市间货物运输I.md)) + +以上为理论分析,接下来我们再画图举例。 + +我们拿题目中示例来画一个图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240402103135.png) + +图中 节点1 到 节点4 的最短路径是多少(题目中的最低运输成本) (注意边可以为负数的) + +节点1 -> 节点2 -> 节点3 -> 节点4,这样的路径总成本为 -1 + 1 + 1 = 1 + +而图中有负权回路: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240402103712.png) + +那么我们在负权回路中多绕一圈,我们的最短路径 是不是就更小了 (也就是更低的运输成本) + +节点1 -> 节点2 -> 节点3 -> 节点1 -> 节点2 -> 节点3 -> 节点4,这样的路径总成本 (-1) + 1 + (-1) + (-1) + 1 + (-1) + 1 = -1 + +如果在负权回路多绕两圈,三圈,无穷圈,那么我们的总成本就会无限小, 如果要求最小成本的话,你会发现本题就无解了。 + +在 bellman_ford 算法中,松弛 n-1 次所有的边 就可以求得 起点到任何节点的最短路径,松弛 n 次以上,minDist数组(记录起到到其他节点的最短距离)中的结果也不会有改变 (如果对 bellman_ford 算法 不了解,也不知道 minDist 是什么,建议详看上篇讲解[kama94.城市间货物运输I](./kama94.城市间货物运输I.md)) + +而本题有负权回路的情况下,一直都会有更短的最短路,所以 松弛 第n次,minDist数组 也会发生改变。 + +那么解决本题的 核心思路,就是在 [kama94.城市间货物运输I](./kama94.城市间货物运输I.md) 的基础上,再多松弛一次,看minDist数组 是否发生变化。 + +代码和 [kama94.城市间货物运输I](./kama94.城市间货物运输I.md) 基本是一样的,如下:(关键地方已注释) + +```CPP +#include +#include +#include +#include +using namespace std; + +int main() { + int n, m, p1, p2, val; + cin >> n >> m; + + vector> grid; + + for(int i = 0; i < m; i++){ + cin >> p1 >> p2 >> val; + // p1 指向 p2,权值为 val + grid.push_back({p1, p2, val}); + + } + int start = 1; // 起点 + int end = n; // 终点 + + vector minDist(n + 1 , INT_MAX); + minDist[start] = 0; + bool flag = false; + for (int i = 1; i <= n; i++) { // 这里我们松弛n次,最后一次判断负权回路 + for (vector &side : grid) { + int from = side[0]; + int to = side[1]; + int price = side[2]; + if (i < n) { + if (minDist[from] != INT_MAX && minDist[to] > minDist[from] + price) minDist[to] = minDist[from] + price; + } else { // 多加一次松弛判断负权回路 + if (minDist[from] != INT_MAX && minDist[to] > minDist[from] + price) flag = true; + + } + } + + } + + if (flag) cout << "circle" << endl; + else if (minDist[end] == INT_MAX) { + cout << "unconnected" << endl; + } else { + cout << minDist[end] << endl; + } +} +``` diff --git "a/problems/kama96.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223III.md" "b/problems/kama96.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223III.md" new file mode 100644 index 0000000000..1fdba49a37 --- /dev/null +++ "b/problems/kama96.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223III.md" @@ -0,0 +1,125 @@ + +# 96. 城市间货物运输 III + +[题目链接](https://kamacoder.com/problempage.php?pid=1154) + +【题目描述】 + +某国为促进城市间经济交流,决定对货物运输提供补贴。共有 n 个编号为 1 到 n 的城市,通过道路网络连接,网络中的道路仅允许从某个城市单向通行到另一个城市,不能反向通行。 + +网络中的道路都有各自的运输成本和政府补贴,道路的权值计算方式为:运输成本 - 政府补贴。 + +权值为正表示扣除了政府补贴后运输货物仍需支付的费用; + +权值为负则表示政府的补贴超过了支出的运输成本,实际表现为运输过程中还能赚取一定的收益。 + +请计算在最多经过 k 个城市的条件下,从城市 src 到城市 dst 的最低运输成本。 + +【输入描述】 + +第一行包含两个正整数,第一个正整数 n 表示该国一共有 n 个城市,第二个整数 m 表示这些城市中共有 m 条道路。 + +接下来为 m 行,每行包括三个整数,s、t 和 v,表示 s 号城市运输货物到达 t 号城市,道路权值为 v。 + +最后一行包含三个正整数,src、dst、和 k,src 和 dst 为城市编号,从 src 到 dst 经过的城市数量限制。 + +【输出描述】 + +输出一个整数,表示从城市 src 到城市 dst 的最低运输成本,如果无法在给定经过城市数量限制下找到从 src 到 dst 的路径,则输出 "unreachable",表示不存在符合条件的运输方案。 + +输入示例: + +``` +6 7 +1 2 1 +2 4 -3 +2 5 2 +1 3 5 +3 5 1 +4 6 4 +5 6 -2 +2 6 1 +``` + +输出示例: + +``` +0 +``` + +## 思路 + +本题为单源有限最短路问题,同样是 [kama94.城市间货物运输I](./kama94.城市间货物运输I.md) 延伸题目。 + +在 [kama94.城市间货物运输I](./kama94.城市间货物运输I.md) 中我们讲了:**对所有边松弛一次,相当于计算 起点到达 与起点一条边相连的节点 的最短距离**。 + +节点数量为n,那么起点到终点,最多是 n-1 条边相连。 那么对所有边松弛 n-1 次 就一定能得到 起点到达 终点的最短距离。 + +(如果对以上讲解看不懂,建议详看 [kama94.城市间货物运输I](./kama94.城市间货物运输I.md) ) + +本题是最多经过 k 个城市, 那么是 k + 1条边相连的节点。 这里可能有录友想不懂为什么是k + 1,来看这个图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240402115614.png) + +图中,节点2 最多已经经过2个节点 到达节点4,那么中间是有多少条边呢,是 3 条边对吧。 + +所以本题就是求,起点最多经过k + 1 条边到达终点的最短距离。 + + +对所有边松弛一次,相当于计算 起点到达 与起点一条边相连的节点 的最短距离,那么对所有边松弛 k + 1次,就是求 起点到达 与起点k + 1条边相连的节点的 最短距离。 + +如果 终点数值没有被计算覆盖,那就是无法到达。 + +**注意**: 本题是 [kama94.城市间货物运输I](./kama94.城市间货物运输I.md) 的拓展题,如果对 bellman_ford 没有深入了解,强烈建议先看 [kama94.城市间货物运输I](./kama94.城市间货物运输I.md) 再做本题。 + +理解以上内容,其实本题代码就很容易了,bellman_ford 标准写法是松弛 n-1 次,本题就松弛 k + 1次就好。 + +如果大家理解后,建议先自己写写代码,提交一下看看,因为 这里还有一个坑,如果不自己去试试,体会就不够深刻了。 + + + +代码如下: (关键地方详细注释) + +```CPP +#include +#include +#include +#include +using namespace std; + +int main() { + int src, dst,k ,p1, p2, val ,m , n; + + cin >> n >> m; + + vector> grid; + + for(int i = 0; i < m; i++){ + cin >> p1 >> p2 >> val; + // p1 指向 p2,权值为 val + grid.push_back({p1, p2, val}); + } + + cin >> src >> dst >> k; + + vector minDist(n + 1 , INT_MAX); + minDist[src] = 0; + vector minDist_copy(n + 1); // 用来记录每一次遍历的结果 + for (int i = 1; i <= k + 1; i++) { + minDist_copy = minDist; // 获取上一次计算的结果 + for (vector &side : grid) { + int from = side[0]; + int to = side[1]; + int price = side[2]; + //cout << f[0] << " " << f[1] << " " << f[2] << endl; + if (minDist_copy[from] != INT_MAX && minDist[to] > minDist_copy[from] + price) minDist[to] = minDist_copy[from] + price; + } + + } + + if (minDist[dst] == INT_MAX) cout << "unreachable" << endl; // 不能到达终点 + else cout << minDist[dst] << endl; // 到达终点最短路径 + +} + +``` diff --git "a/problems/\345\211\215\345\272\217/\347\250\213\345\272\217\345\221\230\347\256\200\345\216\206.md" "b/problems/\345\211\215\345\272\217/\347\250\213\345\272\217\345\221\230\347\256\200\345\216\206.md" index fc06c713a0..7fbfa1fd2b 100644 --- "a/problems/\345\211\215\345\272\217/\347\250\213\345\272\217\345\221\230\347\256\200\345\216\206.md" +++ "b/problems/\345\211\215\345\272\217/\347\250\213\345\272\217\345\221\230\347\256\200\345\216\206.md" @@ -99,7 +99,7 @@ Carl校招社招都拿过大厂的offer,同时也看过很多应聘者的简 面试只有短短的30分钟或者一个小时,如何把自己掌握的技术更好的展现给面试官呢,博客、github都是很好的选择,如果把这些放在简历上,面试官一定会看的,这都是加分项。 -## 简历模板 +## 领取方式 最后福利,把我的简历模板贡献出来!如下图所示。 @@ -107,7 +107,11 @@ Carl校招社招都拿过大厂的offer,同时也看过很多应聘者的简 这里是简历模板中Markdown的代码:[https://github.com/youngyangyang04/Markdown-Resume-Template](https://github.com/youngyangyang04/Markdown-Resume-Template) ,可以fork到自己Github仓库上,按照这个模板来修改自己的简历。 -**Word版本的简历,大家可以在公众号「代码随想录」后台回复:简历模板,就可以获取!** +**Word版本的简历,添加如下企业微信,通过之后就会发你word版本**。 + +
+ +如果已经有我的企业微信,直接回复:简历模板,就可以了。 ## 总结 From fb03de4c4ed82d239102718565c4734e01a211ac Mon Sep 17 00:00:00 2001 From: carlvine500 Date: Tue, 2 Apr 2024 17:46:11 +0800 Subject: [PATCH 2579/3019] =?UTF-8?q?Update=200236.=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=A0=91=E7=9A=84=E6=9C=80=E8=BF=91=E5=85=AC=E5=85=B1=E7=A5=96?= =?UTF-8?q?=E5=85=88.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 0236 java简洁迭代解法 --- ...54\345\205\261\347\245\226\345\205\210.md" | 43 ++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git "a/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" "b/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" index 049f70c7ae..7e0a12fa01 100644 --- "a/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" +++ "b/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" @@ -247,7 +247,7 @@ public: ### Java - +递归 ```Java class Solution { public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { @@ -271,6 +271,47 @@ class Solution { } } +``` +迭代 +```Java +class Solution { + public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { + int max = Integer.MAX_VALUE; + Stack st = new Stack<>(); + TreeNode cur = root, pre = null; + while (cur != null || !st.isEmpty()) { + while (cur != null) { + st.push(cur); + cur = cur.left; + } + cur = st.pop(); + if (cur.right == null || cur.right == pre) { + // p/q是 中/左 或者 中/右 , 返回中 + if (cur == p || cur == q) { + if ((cur.left != null && cur.left.val == max) || (cur.right != null && cur.right.val == max)) { + return cur; + } + cur.val = max; + } + // p/q是 左/右 , 返回中 + if (cur.left != null && cur.left.val == max && cur.right != null && cur.right.val == max) { + return cur; + } + // MAX_VALUE 往上传递 + if ((cur.left != null && cur.left.val == max) || (cur.right != null && cur.right.val == max)) { + cur.val = max; + } + pre = cur; + cur = null; + } else { + st.push(cur); + cur = cur.right; + } + } + return null; + } +} + ``` ### Python From 1810d98f8149fa219ea9289bd014c3c3c52857e7 Mon Sep 17 00:00:00 2001 From: carlvine500 Date: Tue, 2 Apr 2024 17:59:18 +0800 Subject: [PATCH 2580/3019] =?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 0037.解数独 java bitmap解法 --- ...7.\350\247\243\346\225\260\347\213\254.md" | 68 ++++++++++++++++++- 1 file changed, 67 insertions(+), 1 deletion(-) diff --git "a/problems/0037.\350\247\243\346\225\260\347\213\254.md" "b/problems/0037.\350\247\243\346\225\260\347\213\254.md" index b5f54b1f8f..4dc15006aa 100644 --- "a/problems/0037.\350\247\243\346\225\260\347\213\254.md" +++ "b/problems/0037.\350\247\243\346\225\260\347\213\254.md" @@ -224,7 +224,7 @@ public: ### Java - +解法一: ```java class Solution { public void solveSudoku(char[][] board) { @@ -291,7 +291,73 @@ class Solution { } } ``` +解法二(bitmap标记) +``` +class Solution{ + int[] rowBit = new int[9]; + int[] colBit = new int[9]; + int[] square9Bit = new int[9]; + + public void solveSudoku(char[][] board) { + // 1 10 11 + for (int y = 0; y < board.length; y++) { + for (int x = 0; x < board[y].length; x++) { + int numBit = 1 << (board[y][x] - '1'); + rowBit[y] ^= numBit; + colBit[x] ^= numBit; + square9Bit[(y / 3) * 3 + x / 3] ^= numBit; + } + } + backtrack(board, 0); + } + + public boolean backtrack(char[][] board, int n) { + if (n >= 81) { + return true; + } + + // 快速算出行列编号 n/9 n%9 + int row = n / 9; + int col = n % 9; + + if (board[row][col] != '.') { + return backtrack(board, n + 1); + } + + for (char c = '1'; c <= '9'; c++) { + int numBit = 1 << (c - '1'); + if (!isValid(numBit, row, col)) continue; + { + board[row][col] = c; // 当前的数字放入到数组之中, + rowBit[row] ^= numBit; // 第一行rowBit[0],第一个元素eg: 1 , 0^1=1,第一个元素:4, 100^1=101,... + colBit[col] ^= numBit; + square9Bit[(row / 3) * 3 + col / 3] ^= numBit; + } + if (backtrack(board, n + 1)) return true; + { + board[row][col] = '.'; // 不满足条件,回退成'.' + rowBit[row] &= ~numBit; // 第一行rowBit[0],第一个元素eg: 1 , 101&=~1==>101&111111110==>100 + colBit[col] &= ~numBit; + square9Bit[(row / 3) * 3 + col / 3] &= ~numBit; + } + } + return false; + } + + boolean isValid(int numBit, int row, int col) { + // 左右 + if ((rowBit[row] & numBit) > 0) return false; + // 上下 + if ((colBit[col] & numBit) > 0) return false; + // 9宫格: 快速算出第n个九宫格,编号[0,8] , 编号=(row / 3) * 3 + col / 3 + if ((square9Bit[(row / 3) * 3 + col / 3] & numBit) > 0) return false; + return true; + } + +} + +``` ### Python ```python From 0422b137a2b04e74f757b2564a5e5bed3e921d2f Mon Sep 17 00:00:00 2001 From: ShimenTian <64670708+ShimenTian@users.noreply.github.com> Date: Tue, 2 Apr 2024 22:35:58 +0800 Subject: [PATCH 2581/3019] =?UTF-8?q?Update=20=E5=85=B3=E4=BA=8E=E6=97=B6?= =?UTF-8?q?=E9=97=B4=E5=A4=8D=E6=9D=82=E5=BA=A6=EF=BC=8C=E4=BD=A0=E4=B8=8D?= =?UTF-8?q?=E7=9F=A5=E9=81=93=E7=9A=84=E9=83=BD=E5=9C=A8=E8=BF=99=E9=87=8C?= =?UTF-8?q?=EF=BC=81.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\275\345\234\250\350\277\231\351\207\214\357\274\201.md" | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git "a/problems/\345\211\215\345\272\217/\345\205\263\344\272\216\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\214\344\275\240\344\270\215\347\237\245\351\201\223\347\232\204\351\203\275\345\234\250\350\277\231\351\207\214\357\274\201.md" "b/problems/\345\211\215\345\272\217/\345\205\263\344\272\216\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\214\344\275\240\344\270\215\347\237\245\351\201\223\347\232\204\351\203\275\345\234\250\350\277\231\351\207\214\357\274\201.md" index 9d00a0f2a0..61f0a7ef6a 100644 --- "a/problems/\345\211\215\345\272\217/\345\205\263\344\272\216\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\214\344\275\240\344\270\215\347\237\245\351\201\223\347\232\204\351\203\275\345\234\250\350\277\231\351\207\214\357\274\201.md" +++ "b/problems/\345\211\215\345\272\217/\345\205\263\344\272\216\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\214\344\275\240\344\270\215\347\237\245\351\201\223\347\232\204\351\203\275\345\234\250\350\277\231\351\207\214\357\274\201.md" @@ -19,7 +19,7 @@ **时间复杂度是一个函数,它定性描述该算法的运行时间**。 -我们在软件开发中,时间复杂度就是用来方便开发者估算出程序运行的答题时间。 +我们在软件开发中,时间复杂度就是用来方便开发者估算出程序运行的大体时间。 那么该如何估计程序运行时间呢,通常会估算算法的操作单元数量来代表程序消耗的时间,这里默认CPU的每个单元运行消耗的时间都是相同的。 @@ -42,7 +42,7 @@ 我们主要关心的还是一般情况下的数据形式。 -**面试中说道算法的时间复杂度是多少指的都是一般情况**。但是如果面试官和我们深入探讨一个算法的实现以及性能的时候,就要时刻想着数据用例的不一样,时间复杂度也是不同的,这一点是一定要注意的。 +**面试中说的算法的时间复杂度是多少指的都是一般情况**。但是如果面试官和我们深入探讨一个算法的实现以及性能的时候,就要时刻想着数据用例的不一样,时间复杂度也是不同的,这一点是一定要注意的。 ## 不同数据规模的差异 @@ -61,7 +61,7 @@ 例如上图中20就是那个点,n只要大于20 常数项系数已经不起决定性作用了。 -**所以我们说的时间复杂度都是省略常数项系数的,是因为一般情况下都是默认数据规模足够的大,基于这样的事实,给出的算法时间复杂的的一个排行如下所示**: +**所以我们说的时间复杂度都是省略常数项系数的,是因为一般情况下都是默认数据规模足够的大,基于这样的事实,给出的算法时间复杂度的一个排行如下所示**: O(1)常数阶 < O(logn)对数阶 < O(n)线性阶 < O(nlogn)线性对数阶 < O(n^2)平方阶 < O(n^3)立方阶 < O(2^n)指数阶 From 6dd9d117ffc60cb6854f26814b05aa5be2033e84 Mon Sep 17 00:00:00 2001 From: matthew <1123957599@qq.com> Date: Tue, 2 Apr 2024 23:58:58 +0800 Subject: [PATCH 2582/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A00139.=E5=8D=95?= =?UTF-8?q?=E8=AF=8D=E6=8B=86=E5=88=86=20Python=20DP=E5=89=AA=E6=9E=9D?= =?UTF-8?q?=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...25\350\257\215\346\213\206\345\210\206.md" | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git "a/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" "b/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" index a3d59ec718..5ad0fcb005 100644 --- "a/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" +++ "b/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" @@ -394,7 +394,28 @@ class Solution: dp[j] = dp[j] or (dp[j - len(word)] and word == s[j - len(word):j]) return dp[len(s)] ``` +DP(剪枝) +```python +class Solution(object): + def wordBreak(self, s, wordDict): + + # 先对单词按长度排序 + wordDict.sort(key=lambda x: len(x)) + n = len(s) + dp = [False] * (n + 1) + dp[0] = True + # 遍历背包 + for i in range(1, n + 1): + # 遍历单词 + for word in wordDict: + # 简单的 “剪枝” + if len(word) > i: + break + dp[i] = dp[i] or (dp[i - len(word)] and s[i - len(word): i] == word) + return dp[-1] + +``` ### Go: From fda18c06b7221b1c7bddd6b4115de5549e4fd5a4 Mon Sep 17 00:00:00 2001 From: matthew <1123957599@qq.com> Date: Wed, 3 Apr 2024 22:23:48 +0800 Subject: [PATCH 2583/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20=E8=83=8C?= =?UTF-8?q?=E5=8C=85=E9=97=AE=E9=A2=98=E7=90=86=E8=AE=BA=E5=9F=BA=E7=A1=80?= =?UTF-8?q?=E5=A4=9A=E9=87=8D=E8=83=8C=E5=8C=85=20Python=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...32\351\207\215\350\203\214\345\214\205.md" | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\244\232\351\207\215\350\203\214\345\214\205.md" "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\244\232\351\207\215\350\203\214\345\214\205.md" index 5d6440e3bf..29f157fbcc 100644 --- "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\244\232\351\207\215\350\203\214\345\214\205.md" +++ "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\244\232\351\207\215\350\203\214\345\214\205.md" @@ -204,6 +204,29 @@ class multi_pack{ ``` ### Python: +```python + +C, N = input().split(" ") +C, N = int(C), int(N) + +# value数组需要判断一下非空不然过不了 +weights = [int(x) for x in input().split(" ")] +values = [int(x) for x in input().split(" ") if x] +nums = [int(x) for x in input().split(" ")] + +dp = [0] * (C + 1) +# 遍历背包容量 +for i in range(N): + for j in range(C, weights[i] - 1, -1): + for k in range(1, nums[i] + 1): + # 遍历 k,如果已经大于背包容量直接跳出循环 + if k * weights[i] > j: + break + dp[j] = max(dp[j], dp[j - weights[i] * k] + values[i] * k) +print(dp[-1]) + +``` + ### Go: From 616258da2083e1c9943364acbc98cfdc83d0e0fc Mon Sep 17 00:00:00 2001 From: Xiong Gu Date: Thu, 4 Apr 2024 14:57:42 -0400 Subject: [PATCH 2584/3019] add dfs function operation in the main traversal function --- ...2\204\351\200\222\345\275\222\351\201\215\345\216\206.md" | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" index 4621d4a739..e22e1bf343 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" @@ -189,7 +189,7 @@ class Solution: res.append(node.val) dfs(node.left) dfs(node.right) - + dfs(root) return res ``` @@ -207,6 +207,7 @@ class Solution: res.append(node.val) dfs(node.right) + dfs(root) return res ``` ```python @@ -224,7 +225,7 @@ class Solution: dfs(node.left) dfs(node.right) res.append(node.val) - + dfs(root) return res ``` From 2d0b16c92d6aaebf49b56d996a4ea5dd7651e8ac Mon Sep 17 00:00:00 2001 From: Xiong Gu Date: Thu, 4 Apr 2024 15:00:23 -0400 Subject: [PATCH 2585/3019] formatting the former commit --- ...32\204\351\200\222\345\275\222\351\201\215\345\216\206.md" | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" index e22e1bf343..b18067e8b7 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" @@ -189,6 +189,7 @@ class Solution: res.append(node.val) dfs(node.left) dfs(node.right) + dfs(root) return res @@ -206,7 +207,7 @@ class Solution: dfs(node.left) res.append(node.val) dfs(node.right) - + dfs(root) return res ``` @@ -225,6 +226,7 @@ class Solution: dfs(node.left) dfs(node.right) res.append(node.val) + dfs(root) return res ``` From 1c4b9a252fd004a9ec3771b6dbfc707818e4f1d4 Mon Sep 17 00:00:00 2001 From: matthew <1123957599@qq.com> Date: Sat, 6 Apr 2024 10:38:12 +0800 Subject: [PATCH 2586/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A00583=20=E4=B8=A4?= =?UTF-8?q?=E4=B8=AA=E5=AD=97=E7=AC=A6=E4=B8=B2=E7=9A=84=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E6=93=8D=E4=BD=9C=20Python=E8=A7=A3=E6=B3=952?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...40\351\231\244\346\223\215\344\275\234.md" | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git "a/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" "b/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" index 7dbb8ef542..4816c37cc2 100644 --- "a/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" +++ "b/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" @@ -234,6 +234,25 @@ class Solution: return dp[-1][-1] ``` +> 版本 2 + +```python +class Solution(object): + def minDistance(self, word1, word2): + m, n = len(word1), len(word2) + + # dp 求解两字符串最长公共子序列 + dp = [[0] * (n+1) for _ in range(m+1)] + for i in range(1, m+1): + for j in range(1, n+1): + if word1[i-1] == word2[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 m + n - 2 * dp[-1][-1] +``` ### Go: ```go From 7df5157aab58935f0dd9784e4968bd73f1facbdf Mon Sep 17 00:00:00 2001 From: Jasen Chao <68803975+JasenChao@users.noreply.github.com> Date: Sat, 6 Apr 2024 15:09:55 +0800 Subject: [PATCH 2587/3019] =?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 Fix typos --- "problems/0494.\347\233\256\346\240\207\345\222\214.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0494.\347\233\256\346\240\207\345\222\214.md" "b/problems/0494.\347\233\256\346\240\207\345\222\214.md" index 02edad4d8b..f030ae77e3 100644 --- "a/problems/0494.\347\233\256\346\240\207\345\222\214.md" +++ "b/problems/0494.\347\233\256\346\240\207\345\222\214.md" @@ -101,7 +101,7 @@ public: int sum = 0; for (int i = 0; i < nums.size(); i++) sum += nums[i]; if (S > sum) return 0; // 此时没有方案 - if ((S + sum) % 2) return 0; // 此时没有方案,两个int相加的时候要各位小心数值溢出的问题 + if ((S + sum) % 2) return 0; // 此时没有方案,两个int相加的时候要格外小心数值溢出的问题 int bagSize = (S + sum) / 2; // 转变为组合总和问题,bagsize就是要求的和 // 以下为回溯法代码 From 74d38fc6965445e35946d06300d60ff2c5d0a130 Mon Sep 17 00:00:00 2001 From: Jingqi Sun <71240100+xiaoqingma0@users.noreply.github.com> Date: Sat, 6 Apr 2024 22:06:39 +0800 Subject: [PATCH 2588/3019] =?UTF-8?q?Update=20=E5=93=88=E5=B8=8C=E8=A1=A8?= =?UTF-8?q?=E7=90=86=E8=AE=BA=E5=9F=BA=E7=A1=80.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修改typo,优化句子表达。 --- ...\250\347\220\206\350\256\272\345\237\272\347\241\200.md" | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git "a/problems/\345\223\210\345\270\214\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\345\223\210\345\270\214\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" index e426c65791..816f673e91 100644 --- "a/problems/\345\223\210\345\270\214\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\345\223\210\345\270\214\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -12,11 +12,11 @@ ## 哈希表 -首先什么是 哈希表,哈希表(英文名字为Hash table,国内也有一些算法书籍翻译为散列表,大家看到这两个名称知道都是指hash table就可以了)。 +首先什么是哈希表,哈希表(英文名字为Hash table,国内也有一些算法书籍翻译为散列表,大家看到这两个名称知道都是指hash table就可以了)。 > 哈希表是根据关键码的值而直接进行访问的数据结构。 -这么这官方的解释可能有点懵,其实直白来讲其实数组就是一张哈希表。 +这么官方的解释可能有点懵,其实直白来讲其实数组就是一张哈希表。 哈希表中关键码就是数组的索引下标,然后通过下标直接访问数组中的元素,如下图所示: @@ -113,7 +113,7 @@ std::unordered_map 底层实现为哈希表,std::map 和std::multimap 的底 其他语言例如:java里的HashMap ,TreeMap 都是一样的原理。可以灵活贯通。 -虽然std::set、std::multiset 的底层实现是红黑树,不是哈希表,std::set、std::multiset 使用红黑树来索引和存储,不过给我们的使用方式,还是哈希法的使用方式,即key和value。所以使用这些数据结构来解决映射问题的方法,我们依然称之为哈希法。 map也是一样的道理。 +虽然std::set和std::multiset 的底层实现基于红黑树而非哈希表,它们通过红黑树来索引和存储数据。不过给我们的使用方式,还是哈希法的使用方式,即依靠键(key)来访问值(value)。所以使用这些数据结构来解决映射问题的方法,我们依然称之为哈希法。std::map也是一样的道理。 这里在说一下,一些C++的经典书籍上 例如STL源码剖析,说到了hash_set hash_map,这个与unordered_set,unordered_map又有什么关系呢? From e2b92184a88e4d5287e982cd97d4a425cf88acbc Mon Sep 17 00:00:00 2001 From: kankan-web <2728360489@qq.com> Date: Sun, 7 Apr 2024 21:25:29 +0800 Subject: [PATCH 2589/3019] =?UTF-8?q?Update=200770.=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?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...14\345\214\205\347\211\210\346\234\254.md" | 27 +++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git "a/problems/0070.\347\210\254\346\245\274\346\242\257\345\256\214\345\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md" "b/problems/0070.\347\210\254\346\245\274\346\242\257\345\256\214\345\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md" index 622b1117e7..fd5c24fb2b 100644 --- "a/problems/0070.\347\210\254\346\245\274\346\242\257\345\256\214\345\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md" +++ "b/problems/0070.\347\210\254\346\245\274\346\242\257\345\256\214\345\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md" @@ -211,10 +211,33 @@ func main() { ``` ### JavaScript: - +```javaScript +var climbStairs = function (n) { + let dp = new Array(n + 1).fill(0); + dp[0] = 1; + // 排列题,注意循环顺序,背包在外物品在内 + for (let j = 1; j <= n; j++) {//遍历背包 + for (let i = 1; i <= 2; i++) {//遍历物品 + if (j - i >= 0) dp[j] = dp[j] + dp[j - i]; + } + } + return dp[n]; +} +``` ### TypeScript: - +```typescript +var climbStairs = function (n: number): number { + let dp: number[] = new Array(n + 1).fill(0); + dp[0] = 1; + for (let j = 1; j <= n; j++) {//遍历背包 + for (let i = 1; i <= 2; i++) {//遍历物品 + if (j - i >= 0) dp[j] = dp[j] + dp[j - i]; + } + } + return dp[n]; +} +``` ### Rust: From c5a6c3e4104bb7a17a55edc44db6cbf7c55e642e Mon Sep 17 00:00:00 2001 From: markwang Date: Mon, 8 Apr 2024 17:12:03 +0800 Subject: [PATCH 2590/3019] =?UTF-8?q?977.=E6=9C=89=E5=BA=8F=E6=95=B0?= =?UTF-8?q?=E7=BB=84=E7=9A=84=E5=B9=B3=E6=96=B9Go=E6=8E=92=E5=BA=8F?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...47\273\204\347\232\204\345\271\263\346\226\271.md" | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git "a/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" "b/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" index 5bdbcbc7e0..a39902b341 100644 --- "a/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" +++ "b/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" @@ -181,6 +181,17 @@ class Solution: ### Go: ```Go +// 排序法 +func sortedSquares(nums []int) []int { + for i, val := range nums { + nums[i] *= val + } + sort.Ints(nums) + return nums +} +``` +```Go +// 双指针法 func sortedSquares(nums []int) []int { n := len(nums) i, j, k := 0, n-1, n-1 From 2dce5252c01dc934795bf93723d2229a05f33405 Mon Sep 17 00:00:00 2001 From: "beChild.pu" <1351402134@qq.com> Date: Tue, 9 Apr 2024 09:47:06 +0800 Subject: [PATCH 2591/3019] =?UTF-8?q?Update:=20=E4=BF=AE=E5=A4=8D=E5=8E=9F?= =?UTF-8?q?Java=E7=89=88=E6=9C=AC=E6=8A=A5=E7=A9=BA=E6=8C=87=E9=92=88?= =?UTF-8?q?=E5=BC=82=E5=B8=B8(NullPointerException)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...4N\344\270\252\350\212\202\347\202\271.md" | 42 +++++++++++-------- 1 file changed, 24 insertions(+), 18 deletions(-) diff --git "a/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" "b/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" index c7a2cfcb3f..9e180f753e 100644 --- "a/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" +++ "b/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" @@ -98,27 +98,33 @@ public: ### Java: ```java -public ListNode removeNthFromEnd(ListNode head, int n){ - ListNode dummyNode = new ListNode(0); - dummyNode.next = head; - - ListNode fastIndex = dummyNode; - ListNode slowIndex = dummyNode; +class Solution { + public ListNode removeNthFromEnd(ListNode head, int n) { + //新建一个虚拟头节点指向head + ListNode dummyNode = new ListNode(0); + dummyNode.next = head; + //快慢指针指向虚拟头节点 + ListNode fastIndex = dummyNode; + ListNode slowIndex = dummyNode; + + // 只要快慢指针相差 n 个结点即可 + for (int i = 0; i <= n; i++) { + fastIndex = fastIndex.next; + } - // 只要快慢指针相差 n 个结点即可 - for (int i = 0; i < n ; i++){ - fastIndex = fastIndex.next; - } + while (fastIndex != null) { + fastIndex = fastIndex.next; + slowIndex = slowIndex.next; + } - while (fastIndex != null){ - fastIndex = fastIndex.next; - slowIndex = slowIndex.next; + // 此时 slowIndex 的位置就是待删除元素的前一个位置。 + // 具体情况可自己画一个链表长度为 3 的图来模拟代码来理解 + // 检查 slowIndex.next 是否为 null,以避免空指针异常 + if (slowIndex.next != null) { + slowIndex.next = slowIndex.next.next; + } + return dummyNode.next; } - - //此时 slowIndex 的位置就是待删除元素的前一个位置。 - //具体情况可自己画一个链表长度为 3 的图来模拟代码来理解 - slowIndex.next = slowIndex.next.next; - return dummyNode.next; } ``` From a8de2463bca5f60de2474629e2fb96f356b5979a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E5=91=98Carl?= Date: Tue, 9 Apr 2024 15:31:53 +0800 Subject: [PATCH 2592/3019] Delete .gitignore --- .gitignore | 1 - 1 file changed, 1 deletion(-) delete mode 100644 .gitignore diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 6a3e68da15..0000000000 --- a/.gitignore +++ /dev/null @@ -1 +0,0 @@ -**/.DS_Store \ No newline at end of file From 65bf739ef28c16d9c7e13047af658c1850a46287 Mon Sep 17 00:00:00 2001 From: qiufeihong2018 <15058301288@163.com> Date: Tue, 9 Apr 2024 16:32:23 +0800 Subject: [PATCH 2593/3019] =?UTF-8?q?fix:=20=E7=BA=A0=E6=AD=A3=20target=20?= =?UTF-8?q?=E7=9A=84=E6=8B=BC=E5=86=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...20\216\344\270\200\344\270\252\344\275\215\347\275\256.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" "b/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" index 22936fef13..9afb9941a9 100644 --- "a/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" +++ "b/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" @@ -233,7 +233,7 @@ class Solution { if (index == -1) { // nums 中不存在 target,直接返回 {-1, -1} return new int[] {-1, -1}; // 匿名数组 } - // nums 中存在 targe,则左右滑动指针,来找到符合题意的区间 + // nums 中存在 target,则左右滑动指针,来找到符合题意的区间 int left = index; int right = index; // 向左滑动,找左边界 @@ -450,7 +450,7 @@ class Solution: return -1 index = binarySearch(nums, target) if index == -1:return [-1, -1] # nums 中不存在 target,直接返回 {-1, -1} - # nums 中存在 targe,则左右滑动指针,来找到符合题意的区间 + # nums 中存在 target,则左右滑动指针,来找到符合题意的区间 left, right = index, index # 向左滑动,找左边界 while left -1 >=0 and nums[left - 1] == target: left -=1 From baab80473377952f85095a4ec4aeee2febc2101c Mon Sep 17 00:00:00 2001 From: skylarkkk <116788771+skylarkkk@users.noreply.github.com> Date: Wed, 10 Apr 2024 17:00:59 +0800 Subject: [PATCH 2594/3019] =?UTF-8?q?Update=20=E4=BA=8C=E5=8F=89=E6=A0=91?= =?UTF-8?q?=E7=9A=84=E9=80=92=E5=BD=92=E9=81=8D=E5=8E=86.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\204\351\200\222\345\275\222\351\201\215\345\216\206.md" | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" index 4621d4a739..3fc1d24105 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" @@ -189,7 +189,7 @@ class Solution: res.append(node.val) dfs(node.left) dfs(node.right) - + dfs(root) return res ``` @@ -206,7 +206,7 @@ class Solution: dfs(node.left) res.append(node.val) dfs(node.right) - + dfs(root) return res ``` ```python @@ -224,7 +224,7 @@ class Solution: dfs(node.left) dfs(node.right) res.append(node.val) - + dfs(root) return res ``` From 6b8b526dbfd646b46a997d4c001c248e11b2c10f Mon Sep 17 00:00:00 2001 From: qiufeihong2018 <15058301288@163.com> Date: Thu, 11 Apr 2024 17:20:55 +0800 Subject: [PATCH 2595/3019] =?UTF-8?q?refactor:=20=E4=BC=98=E5=8C=96=200209?= =?UTF-8?q?.=E9=95=BF=E5=BA=A6=E6=9C=80=E5=B0=8F=E7=9A=84=E5=AD=90?= =?UTF-8?q?=E6=95=B0=E7=BB=84.md=20=E7=9A=84=20Typescript=20=E5=86=99?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...04\345\255\220\346\225\260\347\273\204.md" | 29 +++++++++---------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git "a/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" "b/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" index 5934d5e364..d2dfe1ee9e 100644 --- "a/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" +++ "b/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" @@ -270,22 +270,21 @@ var minSubArrayLen = function(target, nums) { ```typescript function minSubArrayLen(target: number, nums: number[]): number { - let left: number = 0, right: number = 0; - let res: number = nums.length + 1; - let sum: number = 0; - while (right < nums.length) { - sum += nums[right]; - if (sum >= target) { - // 不断移动左指针,直到不能再缩小为止 - while (sum - nums[left] >= target) { - sum -= nums[left++]; - } - res = Math.min(res, right - left + 1); - } - right++; + let left: number = 0, + res: number = Infinity, + subLen: number = 0, + sum: number = 0; + for (let right: number = 0; right < nums.length; right++) { + sum += nums[right]; + while (sum >= target) { + subLen = right - left + 1; + res = Math.min(res, subLen); + sum -= nums[left]; + left++; } - return res === nums.length + 1 ? 0 : res; -}; + } + return res === Infinity ? 0 : res; +} ``` ### Swift: From d811a8ee78f6ec724f17e98780a0dccba85498ed Mon Sep 17 00:00:00 2001 From: wbingb Date: Thu, 11 Apr 2024 22:37:08 +0800 Subject: [PATCH 2596/3019] Summary: Added an iterative implementation of the find function in the union-find template to prevent stack overflow problems caused by recursive calls. --- .obsidian/app.json | 1 + .obsidian/appearance.json | 3 + .obsidian/core-plugins-migration.json | 30 ++++ .obsidian/core-plugins.json | 20 +++ .obsidian/workspace.json | 147 ++++++++++++++++++ ...30\345\234\250\350\267\257\345\276\204.md" | 24 ++- 6 files changed, 222 insertions(+), 3 deletions(-) create mode 100644 .obsidian/app.json create mode 100644 .obsidian/appearance.json create mode 100644 .obsidian/core-plugins-migration.json create mode 100644 .obsidian/core-plugins.json create mode 100644 .obsidian/workspace.json diff --git a/.obsidian/app.json b/.obsidian/app.json new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/.obsidian/app.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/.obsidian/appearance.json b/.obsidian/appearance.json new file mode 100644 index 0000000000..c8c365d89b --- /dev/null +++ b/.obsidian/appearance.json @@ -0,0 +1,3 @@ +{ + "accentColor": "" +} \ No newline at end of file diff --git a/.obsidian/core-plugins-migration.json b/.obsidian/core-plugins-migration.json new file mode 100644 index 0000000000..436f43cf56 --- /dev/null +++ b/.obsidian/core-plugins-migration.json @@ -0,0 +1,30 @@ +{ + "file-explorer": true, + "global-search": true, + "switcher": true, + "graph": true, + "backlink": true, + "canvas": true, + "outgoing-link": true, + "tag-pane": true, + "properties": false, + "page-preview": true, + "daily-notes": true, + "templates": true, + "note-composer": true, + "command-palette": true, + "slash-command": false, + "editor-status": true, + "bookmarks": true, + "markdown-importer": false, + "zk-prefixer": false, + "random-note": false, + "outline": true, + "word-count": true, + "slides": false, + "audio-recorder": false, + "workspaces": false, + "file-recovery": true, + "publish": false, + "sync": false +} \ No newline at end of file diff --git a/.obsidian/core-plugins.json b/.obsidian/core-plugins.json new file mode 100644 index 0000000000..9405bfdc22 --- /dev/null +++ b/.obsidian/core-plugins.json @@ -0,0 +1,20 @@ +[ + "file-explorer", + "global-search", + "switcher", + "graph", + "backlink", + "canvas", + "outgoing-link", + "tag-pane", + "page-preview", + "daily-notes", + "templates", + "note-composer", + "command-palette", + "editor-status", + "bookmarks", + "outline", + "word-count", + "file-recovery" +] \ No newline at end of file diff --git a/.obsidian/workspace.json b/.obsidian/workspace.json new file mode 100644 index 0000000000..144fe03fdc --- /dev/null +++ b/.obsidian/workspace.json @@ -0,0 +1,147 @@ +{ + "main": { + "id": "14608cf8b641f651", + "type": "split", + "children": [ + { + "id": "7b559c19d2418ebd", + "type": "tabs", + "children": [ + { + "id": "a006865600bc4e20", + "type": "leaf", + "state": { + "type": "empty", + "state": {} + } + } + ] + } + ], + "direction": "vertical" + }, + "left": { + "id": "340e6a79c670a47b", + "type": "split", + "children": [ + { + "id": "c5f81ca398c18cda", + "type": "tabs", + "children": [ + { + "id": "51f9f8f44ecceb89", + "type": "leaf", + "state": { + "type": "file-explorer", + "state": { + "sortOrder": "alphabetical" + } + } + }, + { + "id": "0cff567244d7cff5", + "type": "leaf", + "state": { + "type": "search", + "state": { + "query": "1971", + "matchingCase": false, + "explainSearch": false, + "collapseAll": false, + "extraContext": false, + "sortOrder": "alphabetical" + } + } + }, + { + "id": "209574c920774a4d", + "type": "leaf", + "state": { + "type": "bookmarks", + "state": {} + } + } + ], + "currentTab": 1 + } + ], + "direction": "horizontal", + "width": 300 + }, + "right": { + "id": "93ce8f4c11893983", + "type": "split", + "children": [ + { + "id": "da8cbb56e5ee7c52", + "type": "tabs", + "children": [ + { + "id": "dfccbc1ebc0bb831", + "type": "leaf", + "state": { + "type": "backlink", + "state": { + "collapseAll": false, + "extraContext": false, + "sortOrder": "alphabetical", + "showSearch": false, + "searchQuery": "", + "backlinkCollapsed": false, + "unlinkedCollapsed": true + } + } + }, + { + "id": "9d2201419a111fe4", + "type": "leaf", + "state": { + "type": "outgoing-link", + "state": { + "linksCollapsed": false, + "unlinkedCollapsed": true + } + } + }, + { + "id": "dc86ccf1b01bc02c", + "type": "leaf", + "state": { + "type": "tag", + "state": { + "sortOrder": "frequency", + "useHierarchy": true + } + } + }, + { + "id": "ec512545d2a7f2e5", + "type": "leaf", + "state": { + "type": "outline", + "state": {} + } + } + ] + } + ], + "direction": "horizontal", + "width": 300, + "collapsed": true + }, + "left-ribbon": { + "hiddenItems": { + "switcher:打开快速切换": false, + "graph:查看关系图谱": false, + "canvas:新建白板": false, + "daily-notes:打开/创建今天的日记": false, + "templates:插入模板": false, + "command-palette:打开命令面板": false + } + }, + "active": "a006865600bc4e20", + "lastOpenFiles": [ + "problems/1971.寻找图中是否存在路径.md", + "README.md" + ] +} \ No newline at end of file diff --git "a/problems/1971.\345\257\273\346\211\276\345\233\276\344\270\255\346\230\257\345\220\246\345\255\230\345\234\250\350\267\257\345\276\204.md" "b/problems/1971.\345\257\273\346\211\276\345\233\276\344\270\255\346\230\257\345\220\246\345\255\230\345\234\250\350\267\257\345\276\204.md" index 89a2a1fe87..4123c03e25 100644 --- "a/problems/1971.\345\257\273\346\211\276\345\233\276\344\270\255\346\230\257\345\220\246\345\255\230\345\234\250\350\267\257\345\276\204.md" +++ "b/problems/1971.\345\257\273\346\211\276\345\233\276\344\270\255\346\230\257\345\220\246\345\255\230\345\234\250\350\267\257\345\276\204.md" @@ -47,11 +47,22 @@ void init() { father[i] = i; } } -// 并查集里寻根的过程 +// 并查集里寻根的过程,这里递归调用当题目数据过多,递归调用可能会发生栈溢出 + int find(int u) { return u == father[u] ? u : father[u] = find(father[u]); // 路径压缩 } +// 使用迭代的方法可以避免栈溢出问题 +int find(int x) { + while (x != parent[x]) { + // 路径压缩,直接将x链接到其祖先节点,减少树的高度 + parent[x] = parent[parent[x]]; + x = parent[x]; + } +return x; +} + // 判断 u 和 v是否找到同一个根 bool isSame(int u, int v) { u = find(u); @@ -84,6 +95,8 @@ void join(int u, int v) { 此时我们就可以直接套用并查集模板。 +本题在join函数调用find函数时如果是递归调用会发生栈溢出提示,建议使用迭代方法 + 使用 join(int u, int v)将每条边加入到并查集。 最后 isSame(int u, int v) 判断是否是同一个根 就可以了。 @@ -102,8 +115,13 @@ private: } } // 并查集里寻根的过程 - int find(int u) { - return u == father[u] ? u : father[u] = find(father[u]); + int find(int x) { + while (x != parent[x]) { + // 路径压缩,直接将x链接到其祖先节点,减少树的高度 + parent[x] = parent[parent[x]]; + x = parent[x]; + } + return x; } // 判断 u 和 v是否找到同一个根 From f835589049f3beb25925d615d5fa25d7998243fc Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Fri, 12 Apr 2024 10:37:17 +0800 Subject: [PATCH 2597/3019] Update --- README.md | 4 +- ...75\347\232\204\350\267\257\345\276\204.md" | 10 +- ...30\345\234\250\350\267\257\345\276\204.md" | 11 +- ...17\202\344\274\232dijkstra\345\240\206.md" | 0 ...74\232dijkstra\346\234\264\347\264\240.md" | 0 ...a0053.\345\257\273\345\256\235-Kruskal.md" | 2 +- ...kama0053.\345\257\273\345\256\235-prim.md" | 2 +- ...77\346\215\242\346\225\260\345\255\227.md" | 0 ...13\345\255\227\347\254\246\344\270\262.md" | 0 ...\211\251\350\277\220\350\276\223I-SPFA.md" | 286 +++++++++++++ ...7\347\211\251\350\277\220\350\276\223I.md" | 14 +- ...\347\211\251\350\277\220\350\276\223II.md" | 3 + ...347\211\251\350\277\220\350\276\223III.md" | 392 ++++++++++++++++++ ...16\351\200\233\345\205\254\345\233\255.md" | 57 +++ ...347\211\251\350\277\220\350\276\223III.md" | 125 ------ problems/qita/xunlianying.md | 77 +++- ...50\350\277\231\351\207\214\357\274\201.md" | 165 -------- 17 files changed, 818 insertions(+), 330 deletions(-) rename "problems/kama47.\345\217\202\344\274\232dijkstra\345\240\206.md" => "problems/kama0047.\345\217\202\344\274\232dijkstra\345\240\206.md" (100%) rename "problems/kama47.\345\217\202\344\274\232dijkstra\346\234\264\347\264\240.md" => "problems/kama0047.\345\217\202\344\274\232dijkstra\346\234\264\347\264\240.md" (100%) rename "problems/kama53.\345\257\273\345\256\235-Kruskal.md" => "problems/kama0053.\345\257\273\345\256\235-Kruskal.md" (99%) rename "problems/kama53.\345\257\273\345\256\235-prim.md" => "problems/kama0053.\345\257\273\345\256\235-prim.md" (99%) rename "problems/kama54.\346\233\277\346\215\242\346\225\260\345\255\227.md" => "problems/kama0054.\346\233\277\346\215\242\346\225\260\345\255\227.md" (100%) rename "problems/kama55.\345\217\263\346\227\213\345\255\227\347\254\246\344\270\262.md" => "problems/kama0055.\345\217\263\346\227\213\345\255\227\347\254\246\344\270\262.md" (100%) create mode 100644 "problems/kama0094.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I-SPFA.md" rename "problems/kama94.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I.md" => "problems/kama0094.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I.md" (95%) rename "problems/kama95.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223II.md" => "problems/kama0095.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223II.md" (97%) create mode 100644 "problems/kama0096.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223III.md" create mode 100644 "problems/kama0097.\345\260\217\346\230\216\351\200\233\345\205\254\345\233\255.md" delete mode 100644 "problems/kama96.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223III.md" delete mode 100644 "problems/\345\205\263\344\272\216\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\214\344\275\240\344\270\215\347\237\245\351\201\223\347\232\204\351\203\275\345\234\250\350\277\231\351\207\214\357\274\201.md" diff --git a/README.md b/README.md index 7c26d2c924..a30e0423fe 100644 --- a/README.md +++ b/README.md @@ -3,8 +3,8 @@ 👉 推荐 [Gitee同步](https://gitee.com/programmercarl/leetcode-master) > 1. **介绍** :本项目是一套完整的刷题计划,旨在帮助大家少走弯路,循序渐进学算法,[关注作者](#关于作者) -> 2. **正式出版** :[《代码随想录》](https://programmercarl.com/other/publish.html) 。 -> 3. **PDF版本** :[「代码随想录」算法精讲 PDF 版本](https://programmercarl.com/other/algo_pdf.html) 。 +> 2. **正式出版** :[《代码随想录》](https://programmercarl.com/qita/publish.html) 。 +> 3. **PDF版本** :[「代码随想录」算法精讲 PDF 版本](https://programmercarl.com/qita/algo_pdf.html) 。 > 4. **算法公开课** :[《代码随想录》算法视频公开课](https://www.bilibili.com/video/BV1fA4y1o715) 。 > 5. **最强八股文** :[代码随想录知识星球精华PDF](https://www.programmercarl.com/other/kstar_baguwen.html) 。 > 6. **刷题顺序** :README已经将刷题顺序排好了,按照顺序一道一道刷就可以。 diff --git "a/problems/0797.\346\211\200\346\234\211\345\217\257\350\203\275\347\232\204\350\267\257\345\276\204.md" "b/problems/0797.\346\211\200\346\234\211\345\217\257\350\203\275\347\232\204\350\267\257\345\276\204.md" index 05b55b5b16..4b46d65909 100644 --- "a/problems/0797.\346\211\200\346\234\211\345\217\257\350\203\275\347\232\204\350\267\257\345\276\204.md" +++ "b/problems/0797.\346\211\200\346\234\211\345\217\257\350\203\275\347\232\204\350\267\257\345\276\204.md" @@ -52,7 +52,7 @@ graph[i] 是一个从节点 i 可以访问的所有节点的列表(即从节 至于 单一路径,和路径集合可以放在全局变量,那么代码是这样的: -```c++ +```CPP vector> result; // 收集符合条件的路径 vector path; // 0节点到终点的路径 // x:目前遍历的节点 @@ -71,7 +71,7 @@ void dfs (vector>& graph, int x) 所以 但 x 等于 graph.size() - 1 的时候就找到一条有效路径。 代码如下: -```c++ +```CPP // 要求从节点 0 到节点 n-1 的路径并输出,所以是 graph.size() - 1 if (x == graph.size() - 1) { // 找到符合条件的一条路径 result.push_back(path); // 收集有效路径 @@ -104,13 +104,13 @@ path.push_back(graph[x][i]); // 遍历到的节点加入到路径中来 进入下一层递归 -```C++ +```CPP dfs(graph, graph[x][i]); // 进入下一层递归 ``` 最后就是回溯的过程,撤销本次添加节点的操作。 该过程整体代码: -```C++ +```CPP for (int i = 0; i < graph[x].size(); i++) { // 遍历节点n链接的所有节点 path.push_back(graph[x][i]); // 遍历到的节点加入到路径中来 dfs(graph, graph[x][i]); // 进入下一层递归 @@ -120,7 +120,7 @@ for (int i = 0; i < graph[x].size(); i++) { // 遍历节点n链接的所有节 本题整体代码如下: -```c++ +```CPP class Solution { private: vector> result; // 收集符合条件的路径 diff --git "a/problems/1971.\345\257\273\346\211\276\345\233\276\344\270\255\346\230\257\345\220\246\345\255\230\345\234\250\350\267\257\345\276\204.md" "b/problems/1971.\345\257\273\346\211\276\345\233\276\344\270\255\346\230\257\345\220\246\345\255\230\345\234\250\350\267\257\345\276\204.md" index 89a2a1fe87..5463ec7288 100644 --- "a/problems/1971.\345\257\273\346\211\276\345\233\276\344\270\255\346\230\257\345\220\246\345\255\230\345\234\250\350\267\257\345\276\204.md" +++ "b/problems/1971.\345\257\273\346\211\276\345\233\276\344\270\255\346\230\257\345\220\246\345\255\230\345\234\250\350\267\257\345\276\204.md" @@ -16,16 +16,7 @@ ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20220705101442.png) -提示: - -- 1 <= n <= 2 \* 10^5 -- 0 <= edges.length <= 2 \* 10^5 -- edges[i].length == 2 -- 0 <= ui, vi <= n - 1 -- ui != vi -- 0 <= start, end <= n - 1 -- 不存在双向边 -- 不存在指向顶点自身的边 + ## 思路 diff --git "a/problems/kama47.\345\217\202\344\274\232dijkstra\345\240\206.md" "b/problems/kama0047.\345\217\202\344\274\232dijkstra\345\240\206.md" similarity index 100% rename from "problems/kama47.\345\217\202\344\274\232dijkstra\345\240\206.md" rename to "problems/kama0047.\345\217\202\344\274\232dijkstra\345\240\206.md" diff --git "a/problems/kama47.\345\217\202\344\274\232dijkstra\346\234\264\347\264\240.md" "b/problems/kama0047.\345\217\202\344\274\232dijkstra\346\234\264\347\264\240.md" similarity index 100% rename from "problems/kama47.\345\217\202\344\274\232dijkstra\346\234\264\347\264\240.md" rename to "problems/kama0047.\345\217\202\344\274\232dijkstra\346\234\264\347\264\240.md" diff --git "a/problems/kama53.\345\257\273\345\256\235-Kruskal.md" "b/problems/kama0053.\345\257\273\345\256\235-Kruskal.md" similarity index 99% rename from "problems/kama53.\345\257\273\345\256\235-Kruskal.md" rename to "problems/kama0053.\345\257\273\345\256\235-Kruskal.md" index 1e6cbbb909..1d0c9c83e8 100644 --- "a/problems/kama53.\345\257\273\345\256\235-Kruskal.md" +++ "b/problems/kama0053.\345\257\273\345\256\235-Kruskal.md" @@ -1,5 +1,5 @@ -# 寻宝 +# kruskal算法精讲 [卡码网:53. 寻宝](https://kamacoder.com/problempage.php?pid=1053) diff --git "a/problems/kama53.\345\257\273\345\256\235-prim.md" "b/problems/kama0053.\345\257\273\345\256\235-prim.md" similarity index 99% rename from "problems/kama53.\345\257\273\345\256\235-prim.md" rename to "problems/kama0053.\345\257\273\345\256\235-prim.md" index 9959954aef..4d3d9bd829 100644 --- "a/problems/kama53.\345\257\273\345\256\235-prim.md" +++ "b/problems/kama0053.\345\257\273\345\256\235-prim.md" @@ -1,5 +1,5 @@ -# 寻宝 +# prim算法精讲 [卡码网:53. 寻宝](https://kamacoder.com/problempage.php?pid=1053) diff --git "a/problems/kama54.\346\233\277\346\215\242\346\225\260\345\255\227.md" "b/problems/kama0054.\346\233\277\346\215\242\346\225\260\345\255\227.md" similarity index 100% rename from "problems/kama54.\346\233\277\346\215\242\346\225\260\345\255\227.md" rename to "problems/kama0054.\346\233\277\346\215\242\346\225\260\345\255\227.md" diff --git "a/problems/kama55.\345\217\263\346\227\213\345\255\227\347\254\246\344\270\262.md" "b/problems/kama0055.\345\217\263\346\227\213\345\255\227\347\254\246\344\270\262.md" similarity index 100% rename from "problems/kama55.\345\217\263\346\227\213\345\255\227\347\254\246\344\270\262.md" rename to "problems/kama0055.\345\217\263\346\227\213\345\255\227\347\254\246\344\270\262.md" diff --git "a/problems/kama0094.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I-SPFA.md" "b/problems/kama0094.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I-SPFA.md" new file mode 100644 index 0000000000..634a33a04e --- /dev/null +++ "b/problems/kama0094.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I-SPFA.md" @@ -0,0 +1,286 @@ + +# Bellman_ford 队列优化算法(又名SPFA) + +[卡码网: 94. 城市间货物运输 I](https://kamacoder.com/problempage.php?pid=1152) + +题目描述 + +某国为促进城市间经济交流,决定对货物运输提供补贴。共有 n 个编号为 1 到 n 的城市,通过道路网络连接,网络中的道路仅允许从某个城市单向通行到另一个城市,不能反向通行。 + + +网络中的道路都有各自的运输成本和政府补贴,道路的权值计算方式为:运输成本 - 政府补贴。权值为正表示扣除了政府补贴后运输货物仍需支付的费用;权值为负则表示政府的补贴超过了支出的运输成本,实际表现为运输过程中还能赚取一定的收益。 + + +请找出从城市 1 到城市 n 的所有可能路径中,综合政府补贴后的最低运输成本。如果最低运输成本是一个负数,它表示在遵循最优路径的情况下,运输过程中反而能够实现盈利。 + + +城市 1 到城市 n 之间可能会出现没有路径的情况,同时保证道路网络中不存在任何负权回路。 + +输入描述 + +第一行包含两个正整数,第一个正整数 n 表示该国一共有 n 个城市,第二个整数 m 表示这些城市中共有 m 条道路。 + +接下来为 m 行,每行包括三个整数,s、t 和 v,表示 s 号城市运输货物到达 t 号城市,道路权值为 v(单向图)。 + +输出描述 + +如果能够从城市 1 到连通到城市 n, 请输出一个整数,表示运输成本。如果该整数是负数,则表示实现了盈利。如果从城市 1 没有路径可达城市 n,请输出 "unconnected"。 + +输入示例: + +``` +6 7 +5 6 -2 +1 2 1 +5 3 1 +2 5 2 +2 4 -3 +4 6 4 +1 3 5 +``` + +## 思路 + +本题我们来系统讲解 Bellman_ford 队列优化算法 ,也叫SPFA算法(Shortest Path Faster Algorithm)。 + +> SPFA的称呼来自 1994年西南交通大学段凡丁的论文,其实Bellman_ford 提出后不久 (20世纪50年代末期) 就有队列优化的版本,国际上不承认这个算法是是国内提出的。 所以国际上一般称呼 算法为 Bellman_ford 队列优化算法(Queue improved Bellman-Ford) + +大家知道以上来历,知道 SPFA 和 Bellman_ford 队列优化算法 指的都是一个算法就好。 + +如果大家还不够了解 Bellman_ford 算法,强烈建议按照《代码随想录》的顺序学习,否则可能看不懂下面的讲解。 + +大家可以发现 Bellman_ford 算法每次松弛 都是对所有边进行松弛。 + +但真正有效的松弛,是基于已经计算过的节点在做的松弛。 + +给大家举一个例子: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240328104119.png) + +本图中,对所有边进行松弛,真正有效的松弛,只有松弛 边(节点1->节点2) 和 边(节点1->节点5) 。 + +而松弛 边(节点4->节点6) ,边(节点5->节点3)等等 都是无效的操作,因为 节点4 和 节点 5 都是没有被计算过的节点。 + + +所以 Bellman_ford 算法 每次都是对所有边进行松弛,其实是多做了一些无用功。 + +**只需要对 上一次松弛的时候更新过的节点作为出发节点所连接的边 进行松弛就够了**。 + +基于以上思路,如何记录 上次松弛的时候更新过的节点呢? + +用队列来记录。 + +接下来来举例这个队列是如何工作的。 + +以示例给出的所有边为例: + +``` +5 6 -2 +1 2 1 +5 3 1 +2 5 2 +2 4 -3 +4 6 4 +1 3 5 +``` + +我们依然使用**minDist数组来表达 起点到各个节点的最短距离**,例如minDist[3] = 5 表示起点到达节点3 的最小距离为5 + +初始化,起点为节点1, 起点到起点的最短距离为0,所以minDist[1] 为 0。 将节点1 加入队列 (下次松弛送节点1开始) + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240411115555.png) + +------------ + +从队列里取出节点1,松弛节点1 作为出发点链接的边(节点1 -> 节点2)和边(节点1 -> 节点3) + +边:节点1 -> 节点2,权值为1 ,minDist[2] > minDist[1] + 1 ,更新 minDist[2] = minDist[1] + 1 = 0 + 1 = 1 。 + +边:节点1 -> 节点3,权值为5 ,minDist[3] > minDist[1] + 5,更新 minDist[3] = minDist[1] + 5 = 0 + 5 = 5。 + +将节点2,节点3 加入队列,如图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240411115544.png) + + +----------------- + + +从队列里取出节点2,松弛节点2 作为出发点链接的边(节点2 -> 节点4)和边(节点2 -> 节点5) + +边:节点2 -> 节点4,权值为1 ,minDist[4] > minDist[2] + (-3) ,更新 minDist[4] = minDist[2] + (-3) = 1 + (-3) = -2 。 + +边:节点2 -> 节点5,权值为2 ,minDist[5] > minDist[2] + 2 ,更新 minDist[5] = minDist[2] + 2 = 1 + 2 = 3 。 + + +将节点4,节点5 加入队列,如图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240411115527.png) + + +-------------------- + + +从队列里出去节点3,松弛节点3 作为出发点链接的边。 + +因为没有从节点3作为出发点的边,所以这里就从队列里取出节点3就好,不用做其他操作,如图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240411115515.png) + + +------------ + +从队列中取出节点4,松弛节点4作为出发点链接的边(节点4 -> 节点6) + +边:节点4 -> 节点6,权值为4 ,minDist[6] > minDist[4] + 4,更新 minDist[6] = minDist[4] + 4 = -2 + 4 = 2 。 + +讲节点6加入队列 + +如图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240411115451.png) + + +--------------- + +从队列中取出节点5,松弛节点5作为出发点链接的边(节点5 -> 节点3),边(节点5 -> 节点6) + +边:节点5 -> 节点3,权值为1 ,minDist[3] > minDist[5] + 1 ,更新 minDist[3] = minDist[5] + 1 = 3 + 1 = 4 + +边:节点5 -> 节点6,权值为-2 ,minDist[6] > minDist[5] + (-2) ,更新 minDist[6] = minDist[5] + (-2) = 3 - 2 = 1 + +如图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240411115436.png) + + +因为节点3,和 节点6 都曾经加入过队列,不用重复加入,避免重复计算。 + + +-------------- + +从队列中取出节点6,松弛节点6 作为出发点链接的边。 + +节点6作为终点,没有可以出发的边。 + +所以直接从队列中取出,如图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240411115424.png) + + +---------- + +这样我们就完成了基于队列优化的bellman_ford的算法模拟过程。 + +大家可以发现 基于队列优化的算法,要比bellman_ford 算法 减少很多无用的松弛情况,特别是对于边树众多的大图 优化效果明显。 + +了解了大体流程,我们再看代码应该怎么写。 + +在上面模拟过程中,我们每次都要知道 一个节点作为出发点 链接了哪些节点。 + +如果想方便这道这些数据,就需要使用邻接表来存储这个图,如果对于邻接表不了解的话,可以看 [kama0047.参会dijkstra堆](./kama0047.参会dijkstra堆.md) 中 图的存储 部分。 + + +代码如下: + +```CPP +#include +#include +#include +#include +#include +using namespace std; + +struct Edge { //邻接表 + int to; // 链接的节点 + int val; // 边的权重 + + Edge(int t, int w): to(t), val(w) {} // 构造函数 +}; + + +int main() { + int n, m, p1, p2, val; + cin >> n >> m; + + vector> grid(n + 1); // 邻接表 + + // 将所有边保存起来 + for(int i = 0; i < m; i++){ + cin >> p1 >> p2 >> val; + // p1 指向 p2,权值为 val + grid[p1].push_back(Edge(p2, val)); + } + int start = 1; // 起点 + int end = n; // 终点 + + vector minDist(n + 1 , INT_MAX); + minDist[start] = 0; + + queue que; + que.push(start); + int que_size; + while (!que.empty()) { + // 注意这个数组放的位置 + vector visited(n + 1, false); // 可加,可不加,加了效率高一些,防止队列里重复访问,其数值已经算过了 + que_size = que.size(); + + int node = que.front(); que.pop(); + + for (Edge edge : grid[node]) { + int from = node; + int to = edge.to; + int price = edge.val; + if (minDist[to] > minDist[from] + price) { // 开始松弛 + minDist[to] = minDist[from] + price; + if(visited[to]) continue; // 节点不用重复放入队列,但节点需要重复计算,所以放在这里位置 + visited[to] = true; + que.push(to); + } + } + + } + + if (minDist[end] == INT_MAX) cout << "unconnected" << endl; // 不能到达终点 + else cout << minDist[end] << endl; // 到达终点最短路径 +} +``` + +代码中有一点需要注意,即 `if(visited[to]) continue;` 这段代码放的位置。 + + +一些录友可能写成这样: + +```CPP +if (minDist[to] > minDist[from] + price) { // 开始松弛 + if(visited[to]) continue; + minDist[to] = minDist[from] + price; + visited[to] = true; + que.push(to); +} +``` + +这是不对了,我们仅仅是控制节点不用重复加入队列,但对于边的松弛,节点数值的更新,是要重复计算的,要不然如何 不断更新最短路径呢? + +所以 `if(visited[to]) continue;` 应该放在这里: + +```CPP +if (minDist[to] > minDist[from] + price) { // 开始松弛 + minDist[to] = minDist[from] + price; + if(visited[to]) continue; // 仅仅控制节点不要重复加入队列 + visited[to] = true; + que.push(to); +} +``` + + + + +## 拓展 + +关于 加visited 方式节点重复方便,可能也有录友认为,加上 visited 也是防止 如果图中出现了环的话,会导致的 队列里一直不为空。 + + + + + diff --git "a/problems/kama94.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I.md" "b/problems/kama0094.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I.md" similarity index 95% rename from "problems/kama94.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I.md" rename to "problems/kama0094.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I.md" index 836ac34562..50c59ea7c0 100644 --- "a/problems/kama94.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I.md" +++ "b/problems/kama0094.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I.md" @@ -1,7 +1,7 @@ # 94. 城市间货物运输 I -[题目链接](https://kamacoder.com/problempage.php?pid=1152) +[卡码网: 94. 城市间货物运输 I](https://kamacoder.com/problempage.php?pid=1152) 题目描述 @@ -159,7 +159,7 @@ if (minDist[B] > minDist[A] + value) minDist[B] = minDist[A] + value ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240329113927.png) -边:节点2 -> 节点4,权值为-3 ,minDist[4] > minDist[2] + 2,更新 minDist[4] = minDist[2] + (-3) = 1 + (-3) = -2 ,如图: +边:节点2 -> 节点4,权值为-3 ,minDist[4] > minDist[2] + (-3),更新 minDist[4] = minDist[2] + (-3) = 1 + (-3) = -2 ,如图: ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240329114036.png) @@ -261,6 +261,16 @@ int main() { } ``` +* 时间复杂度: O(N * E) , N为节点数量,E为图中边的数量 +* 空间复杂度: O(N) ,即 minDist 数组所开辟的空间 + +关于空间复杂度,可能有录友疑惑,代码中数组grid不也开辟空间了吗? 为什么只算minDist数组的空间呢? + +grid数组是用来存图的,这是题目描述中必须要使用的空间,而不是我们算法所使用的空间。 + +我们在讲空间复杂度的时候,一般都是说,我们这个算法的空间复杂度。 + + ### 拓展 有录友可能会想,那我 松弛 n 次,松弛 n + 1次,松弛 2 * n 次会怎么样? diff --git "a/problems/kama95.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223II.md" "b/problems/kama0095.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223II.md" similarity index 97% rename from "problems/kama95.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223II.md" rename to "problems/kama0095.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223II.md" index 7a76d3615d..e9387c7312 100644 --- "a/problems/kama95.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223II.md" +++ "b/problems/kama0095.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223II.md" @@ -148,3 +148,6 @@ int main() { } } ``` + +* 时间复杂度: O(N * E) , N为节点数量,E为图中边的数量 +* 空间复杂度: O(N) ,即 minDist 数组所开辟的空间 diff --git "a/problems/kama0096.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223III.md" "b/problems/kama0096.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223III.md" new file mode 100644 index 0000000000..10fb03803a --- /dev/null +++ "b/problems/kama0096.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223III.md" @@ -0,0 +1,392 @@ + +# 96. 城市间货物运输 III + +[题目链接](https://kamacoder.com/problempage.php?pid=1154) + +【题目描述】 + +某国为促进城市间经济交流,决定对货物运输提供补贴。共有 n 个编号为 1 到 n 的城市,通过道路网络连接,网络中的道路仅允许从某个城市单向通行到另一个城市,不能反向通行。 + +网络中的道路都有各自的运输成本和政府补贴,道路的权值计算方式为:运输成本 - 政府补贴。 + +权值为正表示扣除了政府补贴后运输货物仍需支付的费用; + +权值为负则表示政府的补贴超过了支出的运输成本,实际表现为运输过程中还能赚取一定的收益。 + +请计算在最多经过 k 个城市的条件下,从城市 src 到城市 dst 的最低运输成本。 + +【输入描述】 + +第一行包含两个正整数,第一个正整数 n 表示该国一共有 n 个城市,第二个整数 m 表示这些城市中共有 m 条道路。 + +接下来为 m 行,每行包括三个整数,s、t 和 v,表示 s 号城市运输货物到达 t 号城市,道路权值为 v。 + +最后一行包含三个正整数,src、dst、和 k,src 和 dst 为城市编号,从 src 到 dst 经过的城市数量限制。 + +【输出描述】 + +输出一个整数,表示从城市 src 到城市 dst 的最低运输成本,如果无法在给定经过城市数量限制下找到从 src 到 dst 的路径,则输出 "unreachable",表示不存在符合条件的运输方案。 + +输入示例: + +``` +6 7 +1 2 1 +2 4 -3 +2 5 2 +1 3 5 +3 5 1 +4 6 4 +5 6 -2 +2 6 1 +``` + +输出示例: + +``` +0 +``` + +## 思路 + +本题为单源有限最短路问题,同样是 [kama94.城市间货物运输I](./kama94.城市间货物运输I.md) 延伸题目。 + +注意题目中描述是 **最多经过 k 个城市的条件下,而不是一定经过k个城市,也可以经过的城市数量比k小,但要最短的路径**。 + +在 [kama94.城市间货物运输I](./kama94.城市间货物运输I.md) 中我们讲了:**对所有边松弛一次,相当于计算 起点到达 与起点一条边相连的节点 的最短距离**。 + +节点数量为n,起点到终点,最多是 n-1 条边相连。 那么对所有边松弛 n-1 次 就一定能得到 起点到达 终点的最短距离。 + +(如果对以上讲解看不懂,建议详看 [kama94.城市间货物运输I](./kama94.城市间货物运输I.md) ) + +本题是最多经过 k 个城市, 那么是 k + 1条边相连的节点。 这里可能有录友想不懂为什么是k + 1,来看这个图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240402115614.png) + +图中,节点2 最多已经经过2个节点 到达节点4,那么中间是有多少条边呢,是 3 条边对吧。 + +所以本题就是求,起点最多经过k + 1 条边到达终点的最短距离。 + +对所有边松弛一次,相当于计算 起点到达 与起点一条边相连的节点 的最短距离,那么对所有边松弛 k + 1次,就是求 起点到达 与起点k + 1条边相连的节点的 最短距离。 + +**注意**: 本题是 [kama94.城市间货物运输I](./kama94.城市间货物运输I.md) 的拓展题,如果对 bellman_ford 没有深入了解,强烈建议先看 [kama94.城市间货物运输I](./kama94.城市间货物运输I.md) 再做本题。 + +理解以上内容,其实本题代码就很容易了,bellman_ford 标准写法是松弛 n-1 次,本题就松弛 k + 1次就好。 + +此时我们可以写出如下代码: + +```CPP +// 版本一 +#include +#include +#include +#include +using namespace std; + +int main() { + int src, dst,k ,p1, p2, val ,m , n; + + cin >> n >> m; + + vector> grid; + + for(int i = 0; i < m; i++){ + cin >> p1 >> p2 >> val; + // p1 指向 p2,权值为 val + grid.push_back({p1, p2, val}); + } + + cin >> src >> dst >> k; + + vector minDist(n + 1 , INT_MAX); + minDist[src] = 0; + for (int i = 1; i <= k + 1; i++) { // 对所有边松弛 k + 1次 + for (vector &side : grid) { + int from = side[0]; + int to = side[1]; + int price = side[2]; + if (minDist[from] != INT_MAX && minDist[to] > minDist[from] + price) minDist[to] = minDist[from] + price; + } + + } + + if (minDist[dst] == INT_MAX) cout << "unreachable" << endl; // 不能到达终点 + else cout << minDist[dst] << endl; // 到达终点最短路径 + +} + +``` + +以上代码 标准 bellman_ford 写法,松弛 k + 1次,看上去没什么问题。 + +但大家提交后,居然没通过! + +这是为什么呢? + +接下来我们拿这组数据来举例: + +``` +4 4 +1 2 -1 +2 3 1 +3 1 -1 +3 4 1 +1 4 3 +``` + +(**注意上面的示例是有负权回路的,只有带负权回路的图才能说明问题**) + +> 负权回路是指一条道路的总权值为负,这样的回路使得通过反复经过回路中的道路,理论上可以无限地减少总成本或无限地增加总收益。 + +正常来说,这组数据输出应该是 1,但以上代码输出的是 -2。 + + +在讲解原因的时候,强烈建议大家,先把 minDist数组打印出来,看看minDist数组是不是按照自己的想法变化的,这样更容易理解我接下来的讲解内容。 (**一定要动手,实践出真实,脑洞模拟不靠谱**) + +打印的代码可以是这样: + +```CPP +#include +#include +#include +#include +using namespace std; + +int main() { + int src, dst,k ,p1, p2, val ,m , n; + + cin >> n >> m; + + vector> grid; + + for(int i = 0; i < m; i++){ + cin >> p1 >> p2 >> val; + // p1 指向 p2,权值为 val + grid.push_back({p1, p2, val}); + } + + cin >> src >> dst >> k; + + vector minDist(n + 1 , INT_MAX); + minDist[src] = 0; + for (int i = 1; i <= k + 1; i++) { // 对所有边松弛 k + 1次 + for (vector &side : grid) { + int from = side[0]; + int to = side[1]; + int price = side[2]; + if (minDist[from] != INT_MAX && minDist[to] > minDist[from] + price) minDist[to] = minDist[from] + price; + } + // 打印 minDist 数组 + for (int j = 1; j <= n; j++) cout << minDist[j] << " "; + cout << endl; + + } + + if (minDist[dst] == INT_MAX) cout << "unreachable" << endl; // 不能到达终点 + else cout << minDist[dst] << endl; // 到达终点最短路径 + +} + +``` + +接下来,我按照上面的示例带大家 画图举例 对所有边松弛一次 的效果图。 + +起点为节点1, 起点到起点的距离为0,所以 minDist[1] 初始化为0 ,如图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240409111940.png) + +其他节点对应的minDist初始化为max,因为我们要求最小距离,那么还没有计算过的节点 默认是一个最大数,这样才能更新最小距离。 + +当我们开始对所有边开始第一次松弛: + +边:节点1 -> 节点2,权值为-1 ,minDist[2] > minDist[1] + (-1),更新 minDist[2] = minDist[1] + (-1) = 0 - 1 = -1 ,如图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240409111914.png) + + +边:节点2 -> 节点3,权值为1 ,minDist[3] > minDist[2] + 1 ,更新 minDist[3] = minDist[2] + 1 = -1 + 1 = 0 ,如图: +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240409111903.png) + + +边:节点3 -> 节点1,权值为-1 ,minDist[1] > minDist[3] + (-1),更新 minDist[1] = 0 + (-1) = -1 ,如图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240409111849.png) + + +边:节点3 -> 节点4,权值为1 ,minDist[4] > minDist[3] + 1,更新 minDist[4] = 0 + (-1) = -1 ,如图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240409111837.png) + + +以上是对所有边进行的第一次松弛,最后 minDist数组为 :-1 -1 0 1 ,(从下标1算起) + +后面几次松弛我就不挨个画图了,过程大同小异,我直接给出minDist数组的变化: + +所有边进行的第二次松弛,minDist数组为 : -2 -2 -1 0 +所有边进行的第三次松弛,minDist数组为 : -3 -3 -2 -1 +所有边进行的第四次松弛,minDist数组为 : -4 -4 -3 -2 (本示例中k为3,所以松弛4次) + +最后计算的结果minDist[4] = -2,即 起点到 节点4,最多经过 3 个节点的最短距离是 -2,但 正确的结果应该是 1,即路径:节点1 -> 节点2 -> 节点3 -> 节点4。 + +理论上来说,**对所有边松弛一次,相当于计算 起点到达 与起点一条边相连的节点 的最短距离**。 + +对所有边松弛两次,相当于计算 起点到达 与起点两条边相连的节点的最短距离。 + +对所有边松弛三次,以此类推。 + +但在对所有边松弛第一次的过程中,大家会发现,不仅仅 与起点一条边相连的节点更新了,所有节点都更新了。 + +而且对所有边的后面几次松弛,同样是更新了所有的节点,说明 至多经过k 个节点 这个限制 根本没有限制住,每个节点的数值都被更新了。 + +这是为什么? + +在上面画图距离中,对所有边进行第一次松弛,在计算 边(节点2 -> 节点3) 的时候,更新了 节点3。 + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240409111903.png) + +理论上来说节点3 应该在对所有边第二次松弛的时候才更新。 这因为当时是基于已经计算好的 节点2(minDist[2])来做计算了。 + +minDist[2]在计算边:(节点1 -> 节点2)的时候刚刚被赋值为 -1。 + +这样就造成了一个情况,即:计算minDist数组的时候,基于了本次松弛的 minDist数值,而不是上一次 松弛时候minDist的数值。 +所以在每次计算 minDist 时候,要基于 对所有边上一次松弛的 minDist 数值才行,所以我们要记录上一次松弛的minDist。 + +代码修改如下: (关键地方已经注释) + +```CPP +// 版本二 +#include +#include +#include +#include +using namespace std; + +int main() { + int src, dst,k ,p1, p2, val ,m , n; + + cin >> n >> m; + + vector> grid; + + for(int i = 0; i < m; i++){ + cin >> p1 >> p2 >> val; + grid.push_back({p1, p2, val}); + } + + cin >> src >> dst >> k; + + vector minDist(n + 1 , INT_MAX); + minDist[src] = 0; + vector minDist_copy(n + 1); // 用来记录上一次遍历的结果 + for (int i = 1; i <= k + 1; i++) { + minDist_copy = minDist; // 获取上一次计算的结果 + for (vector &side : grid) { + int from = side[0]; + int to = side[1]; + int price = side[2]; + // 注意使用 minDist_copy 来计算 minDist + if (minDist_copy[from] != INT_MAX && minDist[to] > minDist_copy[from] + price) { + minDist[to] = minDist_copy[from] + price; + } + } + } + if (minDist[dst] == INT_MAX) cout << "unreachable" << endl; // 不能到达终点 + else cout << minDist[dst] << endl; // 到达终点最短路径 + +} + +``` + +* 时间复杂度: O(K * E) , K为至多经过K个节点,E为图中边的数量 +* 空间复杂度: O(N) ,即 minDist 数组所开辟的空间 + +## 拓展一(边的顺序的影响) + +其实边的顺序会影响我们每一次拓展的结果。 + +我来给大家举个例子。 + +我上面讲解中,给出的示例是这样的: +``` +4 4 +1 2 -1 +2 3 1 +3 1 -1 +3 4 1 +1 4 3 +``` + +我将示例中边的顺序改一下,给成: + +``` +4 4 +3 1 -1 +3 4 1 +2 3 1 +1 2 -1 +1 4 3 +``` + +所构成是图是一样的,都是如下的这个图,但给出的边的顺序是不一样的。 + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240410154340.png) + +再用版本一的代码是运行一下,发现结果输出是 1, 是对的。 + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240410154940.png) + +分明刚刚输出的结果是 -2,是错误的,怎么 一样的图,这次输出的结果就对了呢? + +其实这是和示例中给出的边的顺序是有关的, + +我们按照我修改后的示例再来模拟 对所有边的第一次拓展情况。 + +初始化: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240410155545.png) + +边:节点3 -> 节点1,权值为-1 ,节点3还没有被计算过,节点1 不更新。 + +边:节点3 -> 节点4,权值为1 ,节点3还没有被计算过,节点4 不更新。 + +边:节点2 -> 节点3,权值为 1 ,节点2还没有被计算过,节点3 不更新。 + +边:节点1 -> 节点2,权值为 -1 ,minDist[2] > minDist[1] + (-1),更新 minDist[2] = 0 + (-1) = -1 ,如图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240410160046.png) + +以上是对所有边 松弛一次的状态。 + +可以发现 同样的图,边的顺序不一样,使用版本一的代码 每次松弛更新的节点也是不一样的。 + +而边的顺序是随机的,是题目给我们的,所以本题我们才需要 记录上一次松弛的minDist,来保障 每一次对所有边松弛的结果。 + + +## 拓展二(本题本质) + +那么前面讲解过的 [94.城市间货物运输I](./kama94.城市间货物运输I.md) 和 [95.城市间货物运输II](./kama95.城市间货物运输II.md) 也是bellman_ford经典算法,也没使用 minDist_copy,怎么就没问题呢? + +> 如果没看过我上面这两篇讲解的话,建议详细学习上面两篇,在看我下面讲的区别,否则容易看不懂。 + +[94.城市间货物运输I](./kama94.城市间货物运输I.md), 是没有 负权回路的,那么 多松弛多少次,对结果都没有影响。 + +求 节点1 到 节点n 的最短路径,松弛n-1 次就够了,松弛 大于 n-1次,结果也不会变。 + +那么在对所有边进行第一次松弛的时候,如果基于 最近计算的 minDist 来计算 minDist (相当于多做松弛了),也是对最终结果没影响。 + +[95.城市间货物运输II](./kama95.城市间货物运输II.md) 是判断是否有 负权回路,一旦有负权回路, 对所有边松弛 n -1 次以后,在做松弛 minDist 数值一定会变,根据这一点是判断是否有负权回路。 + +所以 在对所有边进行第一次松弛的时候,如果基于 最近计算的 minDist 来计算 minDist (相当于多做松弛了),对最后判断是否有负权回路同样没有影响。 + +你可以理解 minDist的数组其实是不准确了,但它只要变化了就可以让我们来判断 是否有 负权回路。 + + +那么本题 为什么计算minDist 一定要基于上次 的 minDist 数值。 + +其关键在于本题的两个因素: + +* 本题可以有负权回路,说明只要多做松弛,结果是会变的。 +* 本题要求最多经过k个节点,对松弛次数是有限制的。 + +如果本题中 没有负权回路的测试用例, 那版本一的代码就可以过了,也就不用我费这么大口舌去讲解的这个坑了。 + diff --git "a/problems/kama0097.\345\260\217\346\230\216\351\200\233\345\205\254\345\233\255.md" "b/problems/kama0097.\345\260\217\346\230\216\351\200\233\345\205\254\345\233\255.md" new file mode 100644 index 0000000000..1000eed75d --- /dev/null +++ "b/problems/kama0097.\345\260\217\346\230\216\351\200\233\345\205\254\345\233\255.md" @@ -0,0 +1,57 @@ + +# Floyd 算法精讲 + +[卡码网:97. 小明逛公园](https://kamacoder.com/problempage.php?pid=1155) + +【题目描述】 + +小明喜欢去公园散步,公园内布置了许多的景点,相互之间通过小路连接,小明希望在观看景点的同时,能够节省体力,走最短的路径。 + + +给定一个公园景点图,图中有 N 个景点(编号为 1 到 N),以及 M 条双向道路连接着这些景点。每条道路上行走的距离都是已知的。 + + +小明有 Q 个观景计划,每个计划都有一个起点 start 和一个终点 end,表示他想从景点 start 前往景点 end。由于小明希望节省体力,他想知道每个观景计划中从起点到终点的最短路径长度。 请你帮助小明计算出每个观景计划的最短路径长度。 + +【输入描述】 + +第一行包含两个整数 N, M, 分别表示景点的数量和道路的数量。 + +接下来的 M 行,每行包含三个整数 u, v, w,表示景点 u 和景点 v 之间有一条长度为 w 的双向道路。 + +接下里的一行包含一个整数 Q,表示观景计划的数量。 + +接下来的 Q 行,每行包含两个整数 start, end,表示一个观景计划的起点和终点。 + +【输出描述】 + +对于每个观景计划,输出一行表示从起点到终点的最短路径长度。如果两个景点之间不存在路径,则输出 -1。 + +【输入示例】 + +7 3 +1 2 4 +2 5 6 +3 6 8 +2 +1 2 +2 3 + +【输出示例】 + +4 +-1 + +【提示信息】 + +从 1 到 2 的路径长度为 4,2 到 3 之间并没有道路。 + +1 <= N, M, Q <= 1000. + +## 思路 + +本题是经典的多源最短路问题。 + +我们之前讲解过的算法,dijkstra, + + diff --git "a/problems/kama96.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223III.md" "b/problems/kama96.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223III.md" deleted file mode 100644 index 1fdba49a37..0000000000 --- "a/problems/kama96.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223III.md" +++ /dev/null @@ -1,125 +0,0 @@ - -# 96. 城市间货物运输 III - -[题目链接](https://kamacoder.com/problempage.php?pid=1154) - -【题目描述】 - -某国为促进城市间经济交流,决定对货物运输提供补贴。共有 n 个编号为 1 到 n 的城市,通过道路网络连接,网络中的道路仅允许从某个城市单向通行到另一个城市,不能反向通行。 - -网络中的道路都有各自的运输成本和政府补贴,道路的权值计算方式为:运输成本 - 政府补贴。 - -权值为正表示扣除了政府补贴后运输货物仍需支付的费用; - -权值为负则表示政府的补贴超过了支出的运输成本,实际表现为运输过程中还能赚取一定的收益。 - -请计算在最多经过 k 个城市的条件下,从城市 src 到城市 dst 的最低运输成本。 - -【输入描述】 - -第一行包含两个正整数,第一个正整数 n 表示该国一共有 n 个城市,第二个整数 m 表示这些城市中共有 m 条道路。 - -接下来为 m 行,每行包括三个整数,s、t 和 v,表示 s 号城市运输货物到达 t 号城市,道路权值为 v。 - -最后一行包含三个正整数,src、dst、和 k,src 和 dst 为城市编号,从 src 到 dst 经过的城市数量限制。 - -【输出描述】 - -输出一个整数,表示从城市 src 到城市 dst 的最低运输成本,如果无法在给定经过城市数量限制下找到从 src 到 dst 的路径,则输出 "unreachable",表示不存在符合条件的运输方案。 - -输入示例: - -``` -6 7 -1 2 1 -2 4 -3 -2 5 2 -1 3 5 -3 5 1 -4 6 4 -5 6 -2 -2 6 1 -``` - -输出示例: - -``` -0 -``` - -## 思路 - -本题为单源有限最短路问题,同样是 [kama94.城市间货物运输I](./kama94.城市间货物运输I.md) 延伸题目。 - -在 [kama94.城市间货物运输I](./kama94.城市间货物运输I.md) 中我们讲了:**对所有边松弛一次,相当于计算 起点到达 与起点一条边相连的节点 的最短距离**。 - -节点数量为n,那么起点到终点,最多是 n-1 条边相连。 那么对所有边松弛 n-1 次 就一定能得到 起点到达 终点的最短距离。 - -(如果对以上讲解看不懂,建议详看 [kama94.城市间货物运输I](./kama94.城市间货物运输I.md) ) - -本题是最多经过 k 个城市, 那么是 k + 1条边相连的节点。 这里可能有录友想不懂为什么是k + 1,来看这个图: - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240402115614.png) - -图中,节点2 最多已经经过2个节点 到达节点4,那么中间是有多少条边呢,是 3 条边对吧。 - -所以本题就是求,起点最多经过k + 1 条边到达终点的最短距离。 - - -对所有边松弛一次,相当于计算 起点到达 与起点一条边相连的节点 的最短距离,那么对所有边松弛 k + 1次,就是求 起点到达 与起点k + 1条边相连的节点的 最短距离。 - -如果 终点数值没有被计算覆盖,那就是无法到达。 - -**注意**: 本题是 [kama94.城市间货物运输I](./kama94.城市间货物运输I.md) 的拓展题,如果对 bellman_ford 没有深入了解,强烈建议先看 [kama94.城市间货物运输I](./kama94.城市间货物运输I.md) 再做本题。 - -理解以上内容,其实本题代码就很容易了,bellman_ford 标准写法是松弛 n-1 次,本题就松弛 k + 1次就好。 - -如果大家理解后,建议先自己写写代码,提交一下看看,因为 这里还有一个坑,如果不自己去试试,体会就不够深刻了。 - - - -代码如下: (关键地方详细注释) - -```CPP -#include -#include -#include -#include -using namespace std; - -int main() { - int src, dst,k ,p1, p2, val ,m , n; - - cin >> n >> m; - - vector> grid; - - for(int i = 0; i < m; i++){ - cin >> p1 >> p2 >> val; - // p1 指向 p2,权值为 val - grid.push_back({p1, p2, val}); - } - - cin >> src >> dst >> k; - - vector minDist(n + 1 , INT_MAX); - minDist[src] = 0; - vector minDist_copy(n + 1); // 用来记录每一次遍历的结果 - for (int i = 1; i <= k + 1; i++) { - minDist_copy = minDist; // 获取上一次计算的结果 - for (vector &side : grid) { - int from = side[0]; - int to = side[1]; - int price = side[2]; - //cout << f[0] << " " << f[1] << " " << f[2] << endl; - if (minDist_copy[from] != INT_MAX && minDist[to] > minDist_copy[from] + price) minDist[to] = minDist_copy[from] + price; - } - - } - - if (minDist[dst] == INT_MAX) cout << "unreachable" << endl; // 不能到达终点 - else cout << minDist[dst] << endl; // 到达终点最短路径 - -} - -``` diff --git a/problems/qita/xunlianying.md b/problems/qita/xunlianying.md index 0d8c1c83a6..f13290f302 100644 --- a/problems/qita/xunlianying.md +++ b/problems/qita/xunlianying.md @@ -1,7 +1,9 @@ # 代码随想录算法训练营 -> 训练营17期将在6月28日开营,目前可以报名,提前拉群,在群里等着开营就好! +::: tip 通知 +训练营35期,将于 4月3日开营,目前可以报名,报名后提前拉群,在群里等着开营就好。 +::: 大家可以百度搜索:代码随想录算法训练营, 看看往期录友们在训练营里打卡总结的博客。 @@ -9,14 +11,39 @@ 这是训练营里录友坚持到最后一天的打卡,大家可以看看他们的博客是每天都有记录的: -* [训练营结束,深感坚持是最难的(Java-犯困-东南研二)](https://blog.csdn.net/weixin_57956443/article/details/128995318) +* [这种方式,有效逼我坚持下来(C++-小飞-嘉院大三)(精华)](https://blog.csdn.net/weixin_60353640/article/details/133797799) +* [完成比完美重要(Java-小姜-已工作/南京)(精华)](https://xie.infoq.cn/article/3d07b4040ceab0f546d66e3e1) +* [已经刷了500题的基础,参加训练营依然收获满满(Java-怪懒懒-求职)(精华)](https://blog.csdn.net/2301_78266314/article/details/132144046) + +* [算法超级弱,最后坚持下来了(Java-信任呢-上大研二)(精华)](https://blog.csdn.net/xinrenne/article/details/133267089) +* [第一次比较完整的刷题训练经历,群里氛围超级好(JAVA-雷贯三十三重天-北航研二)(精华)](https://blog.csdn.net/qq_44120129/article/details/133230372) +* [我全程坚持下来,还是很有成就感的(python-wj-待业)(精华)](https://blog.csdn.net/u013441272/article/details/133229421) + +* [一点基础都没有,坚持下来了(C++ 润 大二)(精华)](https://blog.csdn.net/m0_74583479/article/details/132776719) +* [这个钱花的很值得(C++-GMZ-研一)(精华)](https://blog.csdn.net/weixin_43303286/article/details/132796571) +* [看着名单里录友都在坚持,自己也要坚持(C++-凯-湖工大研三)(精华)](https://blog.csdn.net/weixin_62453859/article/details/132788830) + +* [一刷心得(Java-小何同学-广财大二)(精华)](https://juejin.cn/post/7272250890597531684) +* [花钱买服务、买环境、买时间(Java-古今-大工研二)(精华)](https://blog.csdn.net/dannky_Z/article/details/132532049) +* [一刷心得(java-唔哩凹-大三)(精华)](https://blog.csdn.net/iwtup/article/details/132545456) + +* [训练营结束有点不舍,坚持最久的一件事(C++-徐一-中科院研二)(精华)](https://blog.csdn.net/weixin_46108098/article/details/132158352) +* [同学推荐,报名训练营,坚持下来了(c++-刘浩-沈自所-研二)(精华)](https://blog.csdn.net/qq1156148707/article/details/132155446) + +* [每日的刷题训练真的艰难,但坚持下来了(C++-五-已工作福建)(精华)](https://blog.csdn.net/weixin_44952586/article/details/131909720) +* [加入训练营,就是因为这个气氛,只靠自己很难坚持(cpp-Lord HouSton-cqu研二)(精华)](https://blog.csdn.net/HSL13594379250/article/details/131889934) +* [很幸运,我坚持下来了,感觉收货满满(java-李-UCAS研0)(精华)](https://blog.csdn.net/ResNet156/article/details/131920163) +* [谈谈自己的收获,养成了写博客的习惯(java-翌-研二)(精华)](https://blog.csdn.net/weixin_47460244/article/details/131912316) + +* [养成了刷题的习惯(C++-热心市民C先生-南理工研一)(精华)](https://blog.csdn.net/qqq1521902442/article/details/131614999) +* [工作也坚持下来(Python-Hongying-已工作杭州)(精华)](https://blog.csdn.net/weixin_42286468/article/details/131628069) +* [入营不亏(C++-小叶子-云财研二)(精华)](https://blog.csdn.net/dream_aleaf/article/details/131613667) + * [训练营一刷总结(Java-HQH-研二)](https://blog.csdn.net/weixin_43821876/article/details/128991822) * [训练营总结,一群人才能走的更远(Java-Lixy-已工作南京)](https://blog.csdn.net/weixin_45368277/article/details/128997823) * [训练营总结,中途🐑了,也坚持下来(C++-Jane-科大研二)](https://blog.csdn.net/Jane_10358/article/details/128977424) * [这两个月有很多不可控因素,但依然坚持下来(java-hha-南工大二)](https://blog.csdn.net/qerwtrt4t/article/details/128975401) * [训练营总结,最后坚持下来(C++ - 阿舟 - 已工作武汉)](https://blog.csdn.net/m0_74360161/article/details/129000723) -* [训练营总结,一刷知识点回顾(Java-魏-待就业)](https://blog.csdn.net/weixin_48111139/article/details/128973746) -* [在训练营中,零基础刷一遍的感受(C++-东风-东北大学研二)](https://blog.csdn.net/nightcood/article/details/128947111) 博客链接:[https://blog.csdn.net/m0_61724447/article/details/128443084](https://blog.csdn.net/m0_61724447/article/details/128443084) @@ -69,7 +96,7 @@ ----------- -### 训练营的目的是什么? +## 训练营的目的是什么? 对于刷题,学算法,[《代码随想录》](https://programmercarl.com/other/publish.html)(programmercarl.com)已经把刷题顺序给大家列好了,大家跟着刷就行。 @@ -97,7 +124,7 @@ 我亲自给大家规划节奏,大家一起按照我的节奏来,规定时间内,一刷一定能把代码随想录所有内容吃透,然后大家自己去二刷,三刷就好了,师傅领进门修行在个人。 -### 训练营提供一些什么呢? +## 训练营提供一些什么呢? 1.具体内容 @@ -180,7 +207,7 @@ 毕竟内容是开源的,质量如何 大家自己去看就好。 -### 训练营的学习方式 +## 训练营的学习方式 组织方式:一个学习微信群(180人左右),大家进群之后,等群公告就好,我会通知开始时间和每日刷题计划。 @@ -194,11 +221,11 @@ 所需语言:**所有语种都可以**,毕竟代码随想录几乎支持所有主流语言,**也会针对大家所用的语言做针对性答疑**。 -### 开营时间 +## 开营时间 -**训练营开始常态化报名,即一直可以报名,当人满180人的时候,就开始新的一期**。 最新的一期可以看文章评论区。 +**训练营开始常态化报名,即一直可以报名,当人满180人的时候,就开始新的一期**。 最新的一期可以看文章评论区,或者文章开头。 -### 训练营的价格 +## 训练营的价格 大家应该最关心的是价格了,**定价依然是268元**,注意这是两个月训练营的费用,而且是全程规划,指导,监督和答疑。 @@ -208,7 +235,7 @@ 后面一定会涨价的,**如果你确实需要有人带,有监督,给规划,有答疑,能花两个月时间更下来的话,还是早报早学习**。 -### 我适合报名吗? +## 我适合报名吗? 符合一下特点的录友可以报名: @@ -233,7 +260,7 @@ **训练营不限编程语言**,任何语言都可以报名,都会答疑。 -### 常见疑问 +## 常见疑问 **海外录友有时差可以报名吗**? @@ -265,22 +292,29 @@ 至于三个月的训练营,是可以考虑的,不过安排时间还要待定。 -### 报名方式 +## 报名方式 + +* 正常支付,价格:268 (支付成功后,支付记录发给客服 +* 知识星球录友支付,价格:238 (支付成功后,[代码随想录知识星球](https://programmercarl.com/other/kstar.html)截图 和 支付记录发给客服 +* 往期算法训练营录友再次报名,价格:130 (支付成功后,往期训练营群或者支付记录 和 本次支付记录发给客服 -扫码支付268元。 (如果是[代码随想录知识星球](https://programmercarl.com/other/kstar.html)成员录友,只需要支付238元,提交客服的时候需提供知识星球截图,**注意一定要是代码随想录知识星球**) +(**注意一定要是[代码随想录知识星球](https://programmercarl.com/other/kstar.html)成员才会有优惠**) + +支付宝支付如下:
-付款后,将付款截图发给客服,客服会在24h内统一回复,**所以大家发给客服信息不要急,当天一定会回复的**。 +[微信支付点击这里](https://www.programmercarl.com/other/weixinzhifu.html) -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20230603175235.png) +付款后,将付款截图发给客服,客服会在24h内统一回复,**所以大家发给客服信息不要急,当天一定会回复的**。 -客服的联系方式就在大家的微信聊天窗口,不用担心突出聊天窗口错过消息,客服回复之后 会有微信提示的。 +
关于训练营的任何问题,可以在客服这里咨询! -### 最后 + +## 最后 训练营其实算是代码随想录的一个补充,其内容都是免费开放的,有学习能力的录友自己学习就好。 @@ -294,5 +328,10 @@ 关于训练营的任何疑问都可以扫码联系客服 -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20230603175235.png) +
+ + + + + diff --git "a/problems/\345\205\263\344\272\216\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\214\344\275\240\344\270\215\347\237\245\351\201\223\347\232\204\351\203\275\345\234\250\350\277\231\351\207\214\357\274\201.md" "b/problems/\345\205\263\344\272\216\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\214\344\275\240\344\270\215\347\237\245\351\201\223\347\232\204\351\203\275\345\234\250\350\277\231\351\207\214\357\274\201.md" deleted file mode 100644 index a1e553d0bc..0000000000 --- "a/problems/\345\205\263\344\272\216\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\214\344\275\240\344\270\215\347\237\245\351\201\223\347\232\204\351\203\275\345\234\250\350\277\231\351\207\214\357\274\201.md" +++ /dev/null @@ -1,165 +0,0 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

- -# 时间复杂度 - -## 究竟什么是时间复杂度 - -**时间复杂度是一个函数,它定性描述该算法的运行时间**。 - -我们在软件开发中,时间复杂度就是用来方便开发者估算出程序运行的大体时间。 - -那么该如何估计程序运行时间呢,通常会估算算法的操作单元数量来代表程序消耗的时间,这里默认CPU的每个单元运行消耗的时间都是相同的。 - -假设算法的问题规模为n,那么操作单元数量便用函数f(n)来表示,随着数据规模n的增大,算法执行时间的增长率和f(n)的增长率相同,这称作为算法的渐近时间复杂度,简称时间复杂度,记为 O(f(n))。 - -## 什么是大O - -这里的大O是指什么呢,说到时间复杂度,**大家都知道O(n),O(n^2),却说不清什么是大O**。 - -算法导论给出的解释:**大O用来表示上界的**,当用它作为算法的最坏情况运行时间的上界,就是对任意数据输入的运行时间的上界。 - -同样算法导论给出了例子:拿插入排序来说,插入排序的时间复杂度我们都说是O(n^2) 。 - -输入数据的形式对程序运算时间是有很大影响的,在数据本来有序的情况下时间复杂度是O(n),但如果数据是逆序的话,插入排序的时间复杂度就是O(n^2),也就对于所有输入情况来说,最坏是O(n^2) 的时间复杂度,所以称插入排序的时间复杂度为O(n^2)。 - -同样的同理再看一下快速排序,都知道快速排序是O(nlog n),但是当数据已经有序情况下,快速排序的时间复杂度是O(n^2) 的,**所以严格从大O的定义来讲,快速排序的时间复杂度应该是O(n^2)**。 - -**但是我们依然说快速排序是O(nlog n)的时间复杂度,这个就是业内的一个默认规定,这里说的O代表的就是一般情况,而不是严格的上界**。如图所示: -![时间复杂度4,一般情况下的时间复杂度](https://code-thinking-1253855093.file.myqcloud.com/pics/20200728185745611.png) - -我们主要关心的还是一般情况下的数据形式。 - -**面试中说道算法的时间复杂度是多少指的都是一般情况**。但是如果面试官和我们深入探讨一个算法的实现以及性能的时候,就要时刻想着数据用例的不一样,时间复杂度也是不同的,这一点是一定要注意的。 - - -## 不同数据规模的差异 - -如下图中可以看出不同算法的时间复杂度在不同数据输入规模下的差异。 - -![时间复杂度,不同数据规模的差异](https://code-thinking-1253855093.file.myqcloud.com/pics/20200728191447384.png) - -在决定使用哪些算法的时候,不是时间复杂越低的越好(因为简化后的时间复杂度忽略了常数项等等),要考虑数据规模,如果数据规模很小甚至可以用O(n^2)的算法比O(n)的更合适(在有常数项的时候)。 - -就像上图中 O(5n^2) 和 O(100n) 在n为20之前 很明显 O(5n^2)是更优的,所花费的时间也是最少的。 - -那为什么在计算时间复杂度的时候要忽略常数项系数呢,也就说O(100n) 就是O(n)的时间复杂度,O(5n^2) 就是O(n^2)的时间复杂度,而且要默认O(n) 优于O(n^2) 呢 ? - -这里就又涉及到大O的定义,**因为大O就是数据量级突破一个点且数据量级非常大的情况下所表现出的时间复杂度,这个数据量也就是常数项系数已经不起决定性作用的数据量**。 - -例如上图中20就是那个点,n只要大于20 常数项系数已经不起决定性作用了。 - -**所以我们说的时间复杂度都是省略常数项系数的,是因为一般情况下都是默认数据规模足够的大,基于这样的事实,给出的算法时间复杂的的一个排行如下所示**: - -O(1) 常数阶 < O(\log n) 对数阶 < O(n) 线性阶 < O(n^2) 平方阶 < O(n^3) 立方阶 < O(2^n)指数阶 - -但是也要注意大常数,如果这个常数非常大,例如10^7 ,10^9 ,那么常数就是不得不考虑的因素了。 - -## 复杂表达式的化简 - -有时候我们去计算时间复杂度的时候发现不是一个简单的O(n) 或者O(n^2), 而是一个复杂的表达式,例如: - -``` -O(2*n^2 + 10*n + 1000) -``` - -那这里如何描述这个算法的时间复杂度呢,一种方法就是简化法。 - -去掉运行时间中的加法常数项 (因为常数项并不会因为n的增大而增加计算机的操作次数)。 - -``` -O(2*n^2 + 10*n) -``` - -去掉常数系数(上文中已经详细讲过为什么可以去掉常数项的原因)。 - -``` -O(n^2 + n) -``` - -只保留最高项,去掉数量级小一级的n (因为n^2 的数据规模远大于n),最终简化为: - -``` -O(n^2) -``` - -如果这一步理解有困难,那也可以做提取n的操作,变成O(n(n+1)),省略加法常数项后也就变成了: - -``` -O(n^2) -``` - -所以最后我们说:这个算法的算法时间复杂度是O(n^2) 。 - - -也可以用另一种简化的思路,其实当n大于40的时候, 这个复杂度会恒小于O(3 × n^2), -O(2 × n^2 + 10 × n + 1000) < O(3 × n^2),3 × n^2省略掉常数项系数,最终时间复杂度也是O(n^2)。 - -## O(log n)中的log是以什么为底? - -平时说这个算法的时间复杂度是logn的,那么一定是log 以2为底n的对数么? - -其实不然,也可以是以10为底n的对数,也可以是以20为底n的对数,**但我们统一说 logn,也就是忽略底数的描述**。 - -为什么可以这么做呢?如下图所示: - -![时间复杂度1.png](https://code-thinking-1253855093.file.myqcloud.com/pics/20200728191447349.png) - - -假如有两个算法的时间复杂度,分别是log以2为底n的对数和log以10为底n的对数,那么这里如果还记得高中数学的话,应该不能理解`以2为底n的对数 = 以2为底10的对数 * 以10为底n的对数`。 - -而以2为底10的对数是一个常数,在上文已经讲述了我们计算时间复杂度是忽略常数项系数的。 - -抽象一下就是在时间复杂度的计算过程中,log以i为底n的对数等于log 以j为底n的对数,所以忽略了i,直接说是logn。 - -这样就应该不难理解为什么忽略底数了。 - -## 举一个例子 - -通过这道面试题目,来分析一下时间复杂度。题目描述:找出n个字符串中相同的两个字符串(假设这里只有两个相同的字符串)。 - -如果是暴力枚举的话,时间复杂度是多少呢,是O(n^2)么? - -这里一些同学会忽略了字符串比较的时间消耗,这里并不像int 型数字做比较那么简单,除了n^2次的遍历次数外,字符串比较依然要消耗m次操作(m也就是字母串的长度),所以时间复杂度是O(m × n × n)。 - -接下来再想一下其他解题思路。 - -先对n个字符串按字典序来排序,排序后n个字符串就是有序的,意味着两个相同的字符串就是挨在一起,然后再遍历一遍n个字符串,这样就找到两个相同的字符串了。 - -那看看这种算法的时间复杂度,快速排序时间复杂度为O(nlog n),依然要考虑字符串的长度是m,那么快速排序每次的比较都要有m次的字符比较的操作,就是O(m × n × log n)。 - -之后还要遍历一遍这n个字符串找出两个相同的字符串,别忘了遍历的时候依然要比较字符串,所以总共的时间复杂度是 O(m × n × log n + n × m)。 - -我们对O(m × n × log n + n × m)进行简化操作,把m × n提取出来变成O(m × n × (log n + 1)),再省略常数项最后的时间复杂度是O(m × n × log n)。 - -最后很明显O(m × n × log n) 要优于O(m × n × n)! - -所以先把字符串集合排序再遍历一遍找到两个相同字符串的方法要比直接暴力枚举的方式更快。 - -这就是我们通过分析两种算法的时间复杂度得来的结论。 - -**当然这不是这道题目的最优解,我仅仅是用这道题目来讲解一下时间复杂度**。 - -## 总结 - -本篇讲解了什么是时间复杂度,复杂度是用来干什么的,以及数据规模对时间复杂度的影响。 - -还讲解了被大多数同学忽略的大O的定义以及log究竟是以谁为底的问题。 - -再分析了如何简化复杂的时间复杂度,最后举一个具体的例子,把本篇的内容串起来。 - -相信看完本篇,大家对时间复杂度的认识会深刻很多! - -如果感觉「代码随想录」很不错,赶快推荐给身边的朋友同学们吧,他们发现和「代码随想录」相见恨晚! - - - - -

- - - - From ff75974e30459b23a44d18a9180e8c9def80de46 Mon Sep 17 00:00:00 2001 From: qiufeihong2018 <15058301288@163.com> Date: Fri, 12 Apr 2024 16:33:29 +0800 Subject: [PATCH 2598/3019] =?UTF-8?q?fix:=20update=20=E6=95=B0=E7=BB=84?= =?UTF-8?q?=E6=80=BB=E7=BB=93=E7=AF=87=E5=92=8C=E6=95=B0=E7=BB=84=E7=90=86?= =?UTF-8?q?=E8=AE=BA=E5=9F=BA=E7=A1=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\225\260\347\273\204\346\200\273\347\273\223\347\257\207.md" | 2 +- ...\273\204\347\220\206\350\256\272\345\237\272\347\241\200.md" | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git "a/problems/\346\225\260\347\273\204\346\200\273\347\273\223\347\257\207.md" "b/problems/\346\225\260\347\273\204\346\200\273\347\273\223\347\257\207.md" index 7550ce0254..d6a4e5401f 100644 --- "a/problems/\346\225\260\347\273\204\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/\346\225\260\347\273\204\346\200\273\347\273\223\347\257\207.md" @@ -16,7 +16,7 @@ **数组是存放在连续内存空间上的相同类型数据的集合。** -数组可以方便的通过下标索引的方式获取到下标下对应的数据。 +数组可以方便的通过下标索引的方式获取到下标对应的数据。 举一个字符数组的例子,如图所示: diff --git "a/problems/\346\225\260\347\273\204\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\346\225\260\347\273\204\347\220\206\350\256\272\345\237\272\347\241\200.md" index d104c883f7..1eb5b3f5a6 100644 --- "a/problems/\346\225\260\347\273\204\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\346\225\260\347\273\204\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -16,7 +16,7 @@ **数组是存放在连续内存空间上的相同类型数据的集合。** -数组可以方便的通过下标索引的方式获取到下标下对应的数据。 +数组可以方便的通过下标索引的方式获取到下标对应的数据。 举一个字符数组的例子,如图所示: From 3c9d6c408ac7286f19ddc096623b4454b3e8765c Mon Sep 17 00:00:00 2001 From: qiufeihong2018 <15058301288@163.com> Date: Fri, 12 Apr 2024 16:40:11 +0800 Subject: [PATCH 2599/3019] =?UTF-8?q?fix:=20update=20=E6=95=B0=E7=BB=84?= =?UTF-8?q?=E6=80=BB=E7=BB=93=E7=AF=87=E5=92=8C=E6=95=B0=E7=BB=84=E7=90=86?= =?UTF-8?q?=E8=AE=BA=E5=9F=BA=E7=A1=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\225\260\347\273\204\346\200\273\347\273\223\347\257\207.md" | 2 +- ...\273\204\347\220\206\350\256\272\345\237\272\347\241\200.md" | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git "a/problems/\346\225\260\347\273\204\346\200\273\347\273\223\347\257\207.md" "b/problems/\346\225\260\347\273\204\346\200\273\347\273\223\347\257\207.md" index d6a4e5401f..646580368b 100644 --- "a/problems/\346\225\260\347\273\204\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/\346\225\260\347\273\204\346\200\273\347\273\223\347\257\207.md" @@ -27,7 +27,7 @@ * **数组下标都是从0开始的。** * **数组内存空间的地址是连续的** -正是**因为数组的在内存空间的地址是连续的,所以我们在删除或者增添元素的时候,就难免要移动其他元素的地址。** +正是**因为数组在内存空间的地址是连续的,所以我们在删除或者增添元素的时候,就难免要移动其他元素的地址。** 例如删除下标为3的元素,需要对下标为3的元素后面的所有元素都要做移动操作,如图所示: diff --git "a/problems/\346\225\260\347\273\204\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\346\225\260\347\273\204\347\220\206\350\256\272\345\237\272\347\241\200.md" index 1eb5b3f5a6..3492f4cc8c 100644 --- "a/problems/\346\225\260\347\273\204\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\346\225\260\347\273\204\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -29,7 +29,7 @@ * **数组下标都是从0开始的。** * **数组内存空间的地址是连续的** -正是**因为数组的在内存空间的地址是连续的,所以我们在删除或者增添元素的时候,就难免要移动其他元素的地址。** +正是**因为数组在内存空间的地址是连续的,所以我们在删除或者增添元素的时候,就难免要移动其他元素的地址。** 例如删除下标为3的元素,需要对下标为3的元素后面的所有元素都要做移动操作,如图所示: From 23c24d357e73eed31a46b58bf9bbc55047bfd2b7 Mon Sep 17 00:00:00 2001 From: WanpengXu Date: Fri, 12 Apr 2024 21:17:30 +0800 Subject: [PATCH 2600/3019] =?UTF-8?q?fix:=20=E4=BF=AE=E6=AD=A3=200015.?= =?UTF-8?q?=E4=B8=89=E6=95=B0=E4=B9=8B=E5=92=8C.md=20=E4=B8=AD=E7=9A=84?= =?UTF-8?q?=E4=B8=A5=E9=87=8D=E8=A1=A8=E8=BF=B0=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...11\346\225\260\344\271\213\345\222\214.md" | 55 ++++++++++++------- 1 file changed, 34 insertions(+), 21 deletions(-) diff --git "a/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" "b/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" index bf165788f8..edd22ec103 100644 --- "a/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" @@ -50,36 +50,49 @@ ```CPP class Solution { public: + // 在一个数组中找到3个数形成的三元组,它们的和为0,不能重复使用(三数下标互不相同),且三元组不能重复。 + // 理论解法:a+b+c(存储)==0(检索) <=> c(存储)==0-(a+b)(检索) + // 实际解法:a+b+c(存储)==0(检索) <=> b(存储)==0-(a+c)(检索) vector> threeSum(vector& nums) { - vector> result; + // 本解法的内层循环一边存储一边检索,所以被存储的应该是b,而不是c + vector> res; sort(nums.begin(), nums.end()); - // 找出a + b + c = 0 - // a = nums[i], b = nums[j], c = -(a + b) + + // 如果只有正数,不可能形成和为0的三元组 + if (nums[0] > 0) + return res; + for (int i = 0; i < nums.size(); i++) { - // 排序之后如果第一个元素已经大于零,那么不可能凑成三元组 - if (nums[i] > 0) { - break; - } - if (i > 0 && nums[i] == nums[i - 1]) { //三元组元素a去重 + // [a, a, ...] 如果本轮a和上轮a相同,那么找到的b,c也是相同的,所以去重a + if (i > 0 && nums[i] == nums[i - 1]) continue; - } - unordered_set set; - for (int j = i + 1; j < nums.size(); j++) { - if (j > i + 2 - && nums[j] == nums[j-1] - && nums[j-1] == nums[j-2]) { // 三元组元素b去重 + + // 这个st的作用是存储b + unordered_set st; + + for (int k = i + 1; k < nums.size(); k++) { + // [(-2x), ..., (x), (x), x, x, x, ...] + // eg. [0, 0, 0] + // eg. [-4, 2, 2] + // eg. [(-4), -1, 0, 0, 1, (2), (2), {2}, {2}, 3, 3] + // 去重b=c时的b和c,即第三个x到最后一个x需要被跳过 + if (k > i + 2 && nums[k] == nums[k - 1] && nums[k - 1] == nums[k - 2]) continue; + + // a+b+c=0 <=> b=0-(a+c) + int target = 0 - (nums[i] + nums[k]); + if (st.find(target) != st.end()) { + res.push_back({nums[i], target, nums[k]}); // nums[k]成为c + // 内层循环中,a固定,如果find到了和上轮一样的b,那么c也就和上轮一样,所以去重b + st.erase(target); } - int c = 0 - (nums[i] + nums[j]); - if (set.find(c) != set.end()) { - result.push_back({nums[i], nums[j], c}); - set.erase(c);// 三元组元素c去重 - } else { - set.insert(nums[j]); + else { + st.insert(nums[k]); // nums[k]成为b } } } - return result; + + return res; } }; ``` From c71a9b00eb103a13e78c8ba3d807c758cde5a127 Mon Sep 17 00:00:00 2001 From: WanpengXu Date: Fri, 12 Apr 2024 22:14:08 +0800 Subject: [PATCH 2601/3019] =?UTF-8?q?fix:=20=E4=BF=AE=E6=AD=A3=200015.?= =?UTF-8?q?=E4=B8=89=E6=95=B0=E4=B9=8B=E5=92=8C.md=20=E4=B8=AD=E7=9A=84?= =?UTF-8?q?=E4=B8=A5=E9=87=8D=E8=A1=A8=E8=BF=B0=E9=94=99=E8=AF=AF=EF=BC=88?= =?UTF-8?q?update:=20=E7=BB=9F=E4=B8=80=E5=8F=98=E9=87=8F=E5=90=8D?= =?UTF-8?q?=EF=BC=8C=E5=9B=9E=E9=80=80=E5=8E=BB=E9=87=8D=E9=80=BB=E8=BE=91?= =?UTF-8?q?=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...11\346\225\260\344\271\213\345\222\214.md" | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git "a/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" "b/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" index edd22ec103..0d47bf4815 100644 --- "a/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" @@ -55,20 +55,20 @@ public: // 实际解法:a+b+c(存储)==0(检索) <=> b(存储)==0-(a+c)(检索) vector> threeSum(vector& nums) { // 本解法的内层循环一边存储一边检索,所以被存储的应该是b,而不是c - vector> res; + vector> result; sort(nums.begin(), nums.end()); - - // 如果只有正数,不可能形成和为0的三元组 - if (nums[0] > 0) - return res; for (int i = 0; i < nums.size(); i++) { + // 如果a是正数,a 0) + break; + // [a, a, ...] 如果本轮a和上轮a相同,那么找到的b,c也是相同的,所以去重a if (i > 0 && nums[i] == nums[i - 1]) continue; - // 这个st的作用是存储b - unordered_set st; + // 这个set的作用是存储b + unordered_set set; for (int k = i + 1; k < nums.size(); k++) { // [(-2x), ..., (x), (x), x, x, x, ...] @@ -81,18 +81,18 @@ public: // a+b+c=0 <=> b=0-(a+c) int target = 0 - (nums[i] + nums[k]); - if (st.find(target) != st.end()) { - res.push_back({nums[i], target, nums[k]}); // nums[k]成为c + if (set.find(target) != set.end()) { + result.push_back({nums[i], target, nums[k]}); // nums[k]成为c // 内层循环中,a固定,如果find到了和上轮一样的b,那么c也就和上轮一样,所以去重b - st.erase(target); + set.erase(target); } else { - st.insert(nums[k]); // nums[k]成为b + set.insert(nums[k]); // nums[k]成为b } } } - return res; + return result; } }; ``` From bdc06a4960a6ce17c4a279e9f0b8220a2a2b059f Mon Sep 17 00:00:00 2001 From: 502y <53784463+502y@users.noreply.github.com> Date: Sat, 13 Apr 2024 09:51:06 +0800 Subject: [PATCH 2602/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200027.=E7=A7=BB?= =?UTF-8?q?=E9=99=A4=E5=85=83=E7=B4=A0.md=20Dart=E7=9B=B8=E5=90=91?= =?UTF-8?q?=E5=8F=8C=E6=8C=87=E9=92=88=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...73\351\231\244\345\205\203\347\264\240.md" | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git "a/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" "b/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" index cb342586d9..5f681c5f8a 100644 --- "a/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" +++ "b/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" @@ -476,6 +476,32 @@ public class Solution { } ``` +###Dart: +```dart +int removeElement(List nums, int val) { + //相向双指针法 + var left = 0; + var right = nums.length - 1; + while (left <= right) { + //寻找左侧的val,将其被右侧非val覆盖 + if (nums[left] == val) { + while (nums[right] == val&&left<=right) { + right--; + if (right < 0) { + return 0; + } + } + nums[left] = nums[right--]; + } else { + left++; + } + } + //覆盖后可以将0至left部分视为所需部分 + return left; +} + +``` +

From a68d7c99370b6e2dd20c6485c1c408b8b0bf5327 Mon Sep 17 00:00:00 2001 From: Nicolas Leigh Date: Thu, 18 Apr 2024 13:21:39 +0800 Subject: [PATCH 2603/3019] =?UTF-8?q?Update=200001.=E4=B8=A4=E6=95=B0?= =?UTF-8?q?=E4=B9=8B=E5=92=8C.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add a break statement to break the for-loop in the Typescript solution. --- .../0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" | 1 + 1 file changed, 1 insertion(+) diff --git "a/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" "b/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" index 80218cb535..d40cade805 100644 --- "a/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" @@ -349,6 +349,7 @@ function twoSum(nums: number[], target: number): number[] { index = helperMap.get(target - nums[i]); if (index !== undefined) { resArr = [i, index]; + break; } helperMap.set(nums[i], i); } From 62cfba1210951f64a726567170705ecbf1866886 Mon Sep 17 00:00:00 2001 From: Shuxiao Wang Date: Fri, 19 Apr 2024 09:52:36 +0200 Subject: [PATCH 2604/3019] =?UTF-8?q?=E8=A7=A3=E5=86=B3=20`0063.=E4=B8=8D?= =?UTF-8?q?=E5=90=8C=E8=B7=AF=E5=BE=84II.md`=20=E7=A4=BA=E4=BE=8B=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E7=BC=A9=E8=BF=9B=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" "b/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" index 8c208ea865..2419b6a8fd 100644 --- "a/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" +++ "b/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" @@ -145,7 +145,7 @@ public: int uniquePathsWithObstacles(vector>& obstacleGrid) { int m = obstacleGrid.size(); int n = obstacleGrid[0].size(); - if (obstacleGrid[m - 1][n - 1] == 1 || obstacleGrid[0][0] == 1) //如果在起点或终点出现了障碍,直接返回0 + if (obstacleGrid[m - 1][n - 1] == 1 || obstacleGrid[0][0] == 1) //如果在起点或终点出现了障碍,直接返回0 return 0; vector> dp(m, vector(n, 0)); for (int i = 0; i < m && obstacleGrid[i][0] == 0; i++) dp[i][0] = 1; From 9fdaeb5b9075ed5195e828d9426c1dd98a7212ec Mon Sep 17 00:00:00 2001 From: Vox Dai Date: Sun, 21 Apr 2024 09:16:13 +0800 Subject: [PATCH 2605/3019] =?UTF-8?q?Update=200111.=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=A0=91=E7=9A=84=E6=9C=80=E5=B0=8F=E6=B7=B1=E5=BA=A6.md=20/?= =?UTF-8?q?=20Fix=20typo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 部分Markdown代码块没有标注语言导致代码没有高亮 --- ...\204\346\234\200\345\260\217\346\267\261\345\272\246.md" | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git "a/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" "b/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" index 6d1632d593..9619b75b40 100644 --- "a/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" +++ "b/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" @@ -64,7 +64,7 @@ 代码如下: -``` +```CPP int getDepth(TreeNode* node) ``` @@ -74,14 +74,14 @@ int getDepth(TreeNode* node) 代码如下: -``` +```CPP if (node == NULL) return 0; ``` 3. 确定单层递归的逻辑 这块和求最大深度可就不一样了,一些同学可能会写如下代码: -``` +```CPP int leftDepth = getDepth(node->left); int rightDepth = getDepth(node->right); int result = 1 + min(leftDepth, rightDepth); From 19b76720a2277f7ca8a72ffdf7e1a7c810bfe951 Mon Sep 17 00:00:00 2001 From: Vox Dai Date: Sun, 21 Apr 2024 09:37:42 +0800 Subject: [PATCH 2606/3019] =?UTF-8?q?Update=20'''0222.=E5=AE=8C=E5=85=A8?= =?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=A0=91=E7=9A=84=E8=8A=82=E7=82=B9=E4=B8=AA?= =?UTF-8?q?=E6=95=B0.md'''=20Fix=20Typo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修复部分代码块无高亮 --- ...\204\350\212\202\347\202\271\344\270\252\346\225\260.md" | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git "a/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" "b/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" index d93d2a3381..69403607c3 100644 --- "a/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" +++ "b/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" @@ -54,7 +54,7 @@ 1. 确定递归函数的参数和返回值:参数就是传入树的根节点,返回就返回以该节点为根节点二叉树的节点数量,所以返回值为int类型。 代码如下: -``` +```CPP int getNodesNum(TreeNode* cur) { ``` @@ -62,7 +62,7 @@ int getNodesNum(TreeNode* cur) { 代码如下: -``` +```CPP if (cur == NULL) return 0; ``` @@ -70,7 +70,7 @@ if (cur == NULL) return 0; 代码如下: -``` +```CPP int leftNum = getNodesNum(cur->left); // 左 int rightNum = getNodesNum(cur->right); // 右 int treeNum = leftNum + rightNum + 1; // 中 From 183704ff5b90ffb7420ffd23d9d62a0800af3a1d Mon Sep 17 00:00:00 2001 From: Vox Dai Date: Sun, 21 Apr 2024 10:19:11 +0800 Subject: [PATCH 2607/3019] =?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=20/?= =?UTF-8?q?=20Fix=20typo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修复部分代码块无高亮 --- ...04\346\211\200\346\234\211\350\267\257\345\276\204.md" | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git "a/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" "b/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" index 4c6c92c5b4..fb2b0d144f 100644 --- "a/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" +++ "b/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" @@ -40,7 +40,7 @@ 要传入根节点,记录每一条路径的path,和存放结果集的result,这里递归不需要返回值,代码如下: -``` +```CPP void traversal(TreeNode* cur, vector& path, vector& result) ``` @@ -48,7 +48,7 @@ void traversal(TreeNode* cur, vector& path, vector& result) 在写递归的时候都习惯了这么写: -``` +```CPP if (cur == NULL) { 终止处理逻辑 } @@ -59,7 +59,7 @@ if (cur == NULL) { **那么什么时候算是找到了叶子节点?** 是当 cur不为空,其左右孩子都为空的时候,就找到叶子节点。 所以本题的终止条件是: -``` +```CPP if (cur->left == NULL && cur->right == NULL) { 终止处理逻辑 } @@ -102,7 +102,7 @@ if (cur->left == NULL && cur->right == NULL) { // 遇到叶子节点 所以递归前要加上判断语句,下面要递归的节点是否为空,如下 -``` +```CPP if (cur->left) { traversal(cur->left, path, result); } From 1f94655e9a3f2a91075b43477ef2cbe648891083 Mon Sep 17 00:00:00 2001 From: qiufeihong2018 <15058301288@163.com> Date: Tue, 23 Apr 2024 15:26:56 +0800 Subject: [PATCH 2608/3019] =?UTF-8?q?refactor:=20=E4=BC=98=E5=8C=960019.?= =?UTF-8?q?=E5=88=A0=E9=99=A4=E9=93=BE=E8=A1=A8=E7=9A=84=E5=80=92=E6=95=B0?= =?UTF-8?q?=E7=AC=ACN=E4=B8=AA=E8=8A=82=E7=82=B9.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...4N\344\270\252\350\212\202\347\202\271.md" | 24 +++++++++++-------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git "a/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" "b/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" index 9e180f753e..4a973edb73 100644 --- "a/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" +++ "b/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" @@ -22,10 +22,12 @@ 输入:head = [1,2,3,4,5], n = 2 输出:[1,2,3,5] + 示例 2: 输入:head = [1], n = 1 输出:[] + 示例 3: 输入:head = [1,2], n = 1 @@ -193,16 +195,18 @@ func removeNthFromEnd(head *ListNode, n int) *ListNode { * @param {number} n * @return {ListNode} */ -var removeNthFromEnd = function(head, n) { - let ret = new ListNode(0, head), - slow = fast = ret; - while(n--) fast = fast.next; - while (fast.next !== null) { - fast = fast.next; - slow = slow.next - }; - slow.next = slow.next.next; - return ret.next; +var removeNthFromEnd = function (head, n) { + // 创建哨兵节点,简化解题逻辑 + let dummyHead = new ListNode(0, head); + let fast = dummyHead; + let slow = dummyHead; + while (n--) fast = fast.next; + while (fast.next !== null) { + slow = slow.next; + fast = fast.next; + } + slow.next = slow.next.next; + return dummyHead.next; }; ``` ### TypeScript: From 956e8530f1323ce404788844d8ac7272bdf6cc74 Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Wed, 24 Apr 2024 16:08:28 +0800 Subject: [PATCH 2609/3019] Update --- ...50\345\271\263\346\226\271\346\225\260.md" | 6 +- ...16\351\200\233\345\205\254\345\233\255.md" | 57 --- ...17\202\344\274\232dijkstra\345\240\206.md" | 8 +- ...74\232dijkstra\346\234\264\347\264\240.md" | 2 +- .../0053.\345\257\273\345\256\235-Kruskal.md" | 0 .../0053.\345\257\273\345\256\235-prim.md" | 0 ...77\346\215\242\346\225\260\345\255\227.md" | 0 ...13\345\255\227\347\254\246\344\270\262.md" | 0 ...\211\251\350\277\220\350\276\223I-SPFA.md" | 138 +++++-- ...7\347\211\251\350\277\220\350\276\223I.md" | 3 + ...\347\211\251\350\277\220\350\276\223II.md" | 89 ++++- ...347\211\251\350\277\220\350\276\223III.md" | 211 +++++++++- ...16\351\200\233\345\205\254\345\233\255.md" | 367 ++++++++++++++++++ 13 files changed, 768 insertions(+), 113 deletions(-) delete mode 100644 "problems/kama0097.\345\260\217\346\230\216\351\200\233\345\205\254\345\233\255.md" rename "problems/kama0047.\345\217\202\344\274\232dijkstra\345\240\206.md" => "problems/kamacoder/0047.\345\217\202\344\274\232dijkstra\345\240\206.md" (98%) rename "problems/kama0047.\345\217\202\344\274\232dijkstra\346\234\264\347\264\240.md" => "problems/kamacoder/0047.\345\217\202\344\274\232dijkstra\346\234\264\347\264\240.md" (99%) rename "problems/kama0053.\345\257\273\345\256\235-Kruskal.md" => "problems/kamacoder/0053.\345\257\273\345\256\235-Kruskal.md" (100%) rename "problems/kama0053.\345\257\273\345\256\235-prim.md" => "problems/kamacoder/0053.\345\257\273\345\256\235-prim.md" (100%) rename "problems/kama0054.\346\233\277\346\215\242\346\225\260\345\255\227.md" => "problems/kamacoder/0054.\346\233\277\346\215\242\346\225\260\345\255\227.md" (100%) rename "problems/kama0055.\345\217\263\346\227\213\345\255\227\347\254\246\344\270\262.md" => "problems/kamacoder/0055.\345\217\263\346\227\213\345\255\227\347\254\246\344\270\262.md" (100%) rename "problems/kama0094.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I-SPFA.md" => "problems/kamacoder/0094.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I-SPFA.md" (57%) rename "problems/kama0094.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I.md" => "problems/kamacoder/0094.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I.md" (98%) rename "problems/kama0095.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223II.md" => "problems/kamacoder/0095.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223II.md" (72%) rename "problems/kama0096.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223III.md" => "problems/kamacoder/0096.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223III.md" (68%) create mode 100644 "problems/kamacoder/0097.\345\260\217\346\230\216\351\200\233\345\205\254\345\233\255.md" diff --git "a/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" "b/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" index f7c06dbd87..b71b69f473 100644 --- "a/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" +++ "b/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" @@ -219,7 +219,7 @@ class Solution { ### Python: -先遍历物品, 再遍历背包 +先遍历背包, 再遍历物品 ```python class Solution: def numSquares(self, n: int) -> int: @@ -234,7 +234,7 @@ class Solution: return dp[n] ``` -先遍历背包, 再遍历物品 +先遍历物品, 再遍历背包 ```python class Solution: def numSquares(self, n: int) -> int: @@ -389,7 +389,7 @@ function numSquares(n: number): number { }; ``` -## C +### C ```c #define min(a, b) ((a) > (b) ? (b) : (a)) diff --git "a/problems/kama0097.\345\260\217\346\230\216\351\200\233\345\205\254\345\233\255.md" "b/problems/kama0097.\345\260\217\346\230\216\351\200\233\345\205\254\345\233\255.md" deleted file mode 100644 index 1000eed75d..0000000000 --- "a/problems/kama0097.\345\260\217\346\230\216\351\200\233\345\205\254\345\233\255.md" +++ /dev/null @@ -1,57 +0,0 @@ - -# Floyd 算法精讲 - -[卡码网:97. 小明逛公园](https://kamacoder.com/problempage.php?pid=1155) - -【题目描述】 - -小明喜欢去公园散步,公园内布置了许多的景点,相互之间通过小路连接,小明希望在观看景点的同时,能够节省体力,走最短的路径。 - - -给定一个公园景点图,图中有 N 个景点(编号为 1 到 N),以及 M 条双向道路连接着这些景点。每条道路上行走的距离都是已知的。 - - -小明有 Q 个观景计划,每个计划都有一个起点 start 和一个终点 end,表示他想从景点 start 前往景点 end。由于小明希望节省体力,他想知道每个观景计划中从起点到终点的最短路径长度。 请你帮助小明计算出每个观景计划的最短路径长度。 - -【输入描述】 - -第一行包含两个整数 N, M, 分别表示景点的数量和道路的数量。 - -接下来的 M 行,每行包含三个整数 u, v, w,表示景点 u 和景点 v 之间有一条长度为 w 的双向道路。 - -接下里的一行包含一个整数 Q,表示观景计划的数量。 - -接下来的 Q 行,每行包含两个整数 start, end,表示一个观景计划的起点和终点。 - -【输出描述】 - -对于每个观景计划,输出一行表示从起点到终点的最短路径长度。如果两个景点之间不存在路径,则输出 -1。 - -【输入示例】 - -7 3 -1 2 4 -2 5 6 -3 6 8 -2 -1 2 -2 3 - -【输出示例】 - -4 --1 - -【提示信息】 - -从 1 到 2 的路径长度为 4,2 到 3 之间并没有道路。 - -1 <= N, M, Q <= 1000. - -## 思路 - -本题是经典的多源最短路问题。 - -我们之前讲解过的算法,dijkstra, - - diff --git "a/problems/kama0047.\345\217\202\344\274\232dijkstra\345\240\206.md" "b/problems/kamacoder/0047.\345\217\202\344\274\232dijkstra\345\240\206.md" similarity index 98% rename from "problems/kama0047.\345\217\202\344\274\232dijkstra\345\240\206.md" rename to "problems/kamacoder/0047.\345\217\202\344\274\232dijkstra\345\240\206.md" index 0cb5930182..b93138a78a 100644 --- "a/problems/kama0047.\345\217\202\344\274\232dijkstra\345\240\206.md" +++ "b/problems/kamacoder/0047.\345\217\202\344\274\232dijkstra\345\240\206.md" @@ -19,7 +19,7 @@ 【输出描述】 -输出一个整数,代表小明在途中和其他科学家和科研团队交流所花费的最少时间。 +输出一个整数,代表小明从起点到终点所花费的最小时间。 输入示例 @@ -519,7 +519,7 @@ int main() { 所以边添加一次时间复杂度是 O(E), `while (!pq.empty())` 里每次都要弹出一个边来进行操作,在优先级队列(小顶堆)中 弹出一个元素的时间复杂度是 O(logE) ,这是堆排序的时间复杂度。 -(当然小顶堆里 是 添加元素的时候 排序,还是 取数元素的时候排序,这个无所谓,时间复杂度都是O(E),总是是一定要排序的,而小顶堆里也不会滞留元素,有多少元素添加 一定就有多少元素弹出) +(当然小顶堆里 是 添加元素的时候 排序,还是 取数元素的时候排序,这个无所谓,时间复杂度都是O(E),总之是一定要排序的,而小顶堆里也不会滞留元素,有多少元素添加 一定就有多少元素弹出) 所以 该算法整体时间复杂度为 O(ElogE) @@ -537,7 +537,7 @@ int main() { 也行的。 -但 正是因为稀疏图,所以我们使用堆优化的思路, 如果我们还用 邻接矩阵 去表达这个图的话,就是 一个高效的算法 使用了低效的数据结构,那么 整体算法效率 依然是低的。 +但 正是因为稀疏图,所以我们使用堆优化的思路, 如果我们还用 邻接矩阵 去表达这个图的话,就是 **一个高效的算法 使用了低效的数据结构,那么 整体算法效率 依然是低的**。 如果还不清楚为什么要使用 邻接表,可以再看看上面 我在 「图的存储」标题下的讲解。 @@ -626,7 +626,7 @@ int main() { 正如我在开篇就给大家交代清楚 堆优化方式的背景。 -堆优化的整体思路和 朴素版是大体一样的,区别是 堆优化从边的角度触发,且利用堆来排序。 +堆优化的整体思路和 朴素版是大体一样的,区别是 堆优化从边的角度出发且利用堆来排序。 很多录友别说写堆优化 就是看 堆优化的代码也看的很懵。 diff --git "a/problems/kama0047.\345\217\202\344\274\232dijkstra\346\234\264\347\264\240.md" "b/problems/kamacoder/0047.\345\217\202\344\274\232dijkstra\346\234\264\347\264\240.md" similarity index 99% rename from "problems/kama0047.\345\217\202\344\274\232dijkstra\346\234\264\347\264\240.md" rename to "problems/kamacoder/0047.\345\217\202\344\274\232dijkstra\346\234\264\347\264\240.md" index 957d471afd..295d3aec15 100644 --- "a/problems/kama0047.\345\217\202\344\274\232dijkstra\346\234\264\347\264\240.md" +++ "b/problems/kamacoder/0047.\345\217\202\344\274\232dijkstra\346\234\264\347\264\240.md" @@ -19,7 +19,7 @@ 【输出描述】 -输出一个整数,代表小明在途中和其他科学家和科研团队交流所花费的最少时间。 +输出一个整数,代表小明从起点到终点所花费的最小时间。 输入示例 diff --git "a/problems/kama0053.\345\257\273\345\256\235-Kruskal.md" "b/problems/kamacoder/0053.\345\257\273\345\256\235-Kruskal.md" similarity index 100% rename from "problems/kama0053.\345\257\273\345\256\235-Kruskal.md" rename to "problems/kamacoder/0053.\345\257\273\345\256\235-Kruskal.md" diff --git "a/problems/kama0053.\345\257\273\345\256\235-prim.md" "b/problems/kamacoder/0053.\345\257\273\345\256\235-prim.md" similarity index 100% rename from "problems/kama0053.\345\257\273\345\256\235-prim.md" rename to "problems/kamacoder/0053.\345\257\273\345\256\235-prim.md" diff --git "a/problems/kama0054.\346\233\277\346\215\242\346\225\260\345\255\227.md" "b/problems/kamacoder/0054.\346\233\277\346\215\242\346\225\260\345\255\227.md" similarity index 100% rename from "problems/kama0054.\346\233\277\346\215\242\346\225\260\345\255\227.md" rename to "problems/kamacoder/0054.\346\233\277\346\215\242\346\225\260\345\255\227.md" diff --git "a/problems/kama0055.\345\217\263\346\227\213\345\255\227\347\254\246\344\270\262.md" "b/problems/kamacoder/0055.\345\217\263\346\227\213\345\255\227\347\254\246\344\270\262.md" similarity index 100% rename from "problems/kama0055.\345\217\263\346\227\213\345\255\227\347\254\246\344\270\262.md" rename to "problems/kamacoder/0055.\345\217\263\346\227\213\345\255\227\347\254\246\344\270\262.md" diff --git "a/problems/kama0094.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I-SPFA.md" "b/problems/kamacoder/0094.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I-SPFA.md" similarity index 57% rename from "problems/kama0094.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I-SPFA.md" rename to "problems/kamacoder/0094.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I-SPFA.md" index 634a33a04e..f41d6fd121 100644 --- "a/problems/kama0094.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I-SPFA.md" +++ "b/problems/kamacoder/0094.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I-SPFA.md" @@ -1,7 +1,7 @@ # Bellman_ford 队列优化算法(又名SPFA) -[卡码网: 94. 城市间货物运输 I](https://kamacoder.com/problempage.php?pid=1152) +[卡码网:94. 城市间货物运输 I](https://kamacoder.com/problempage.php?pid=1152) 题目描述 @@ -16,6 +16,8 @@ 城市 1 到城市 n 之间可能会出现没有路径的情况,同时保证道路网络中不存在任何负权回路。 +> 负权回路是指一系列道路的总权值为负,这样的回路使得通过反复经过回路中的道路,理论上可以无限地减少总成本或无限地增加总收益。 + 输入描述 第一行包含两个正整数,第一个正整数 n 表示该国一共有 n 个城市,第二个整数 m 表示这些城市中共有 m 条道路。 @@ -68,7 +70,7 @@ 基于以上思路,如何记录 上次松弛的时候更新过的节点呢? -用队列来记录。 +用队列来记录。(其实用栈也行,对元素顺序没有要求) 接下来来举例这个队列是如何工作的。 @@ -115,7 +117,7 @@ 将节点4,节点5 加入队列,如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240411115527.png) +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240412110348.png) -------------------- @@ -125,7 +127,7 @@ 因为没有从节点3作为出发点的边,所以这里就从队列里取出节点3就好,不用做其他操作,如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240411115515.png) +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240412110420.png) ------------ @@ -138,7 +140,7 @@ 如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240411115451.png) +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240412110445.png) --------------- @@ -151,10 +153,13 @@ 如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240411115436.png) +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240412110509.png) + + +因为节点3,和 节点6 都曾经加入过队列,不用重复加入,避免重复计算。 -因为节点3,和 节点6 都曾经加入过队列,不用重复加入,避免重复计算。 +在代码中我们可以用一个数组 visited 来记录入过队列的元素,加入过队列的元素,不再重复入队列。 -------------- @@ -172,16 +177,16 @@ 这样我们就完成了基于队列优化的bellman_ford的算法模拟过程。 -大家可以发现 基于队列优化的算法,要比bellman_ford 算法 减少很多无用的松弛情况,特别是对于边树众多的大图 优化效果明显。 +大家可以发现 基于队列优化的算法,要比bellman_ford 算法 减少很多无用的松弛情况,特别是对于边数众多的大图 优化效果明显。 了解了大体流程,我们再看代码应该怎么写。 在上面模拟过程中,我们每次都要知道 一个节点作为出发点 链接了哪些节点。 -如果想方便这道这些数据,就需要使用邻接表来存储这个图,如果对于邻接表不了解的话,可以看 [kama0047.参会dijkstra堆](./kama0047.参会dijkstra堆.md) 中 图的存储 部分。 +如果想方便知道这些数据,就需要使用邻接表来存储这个图,如果对于邻接表不了解的话,可以看 [kama0047.参会dijkstra堆](./kama0047.参会dijkstra堆.md) 中 图的存储 部分。 -代码如下: +整体代码如下: ```CPP #include @@ -218,24 +223,19 @@ int main() { minDist[start] = 0; queue que; - que.push(start); - int que_size; + que.push(start); // 队列里放入起点 + while (!que.empty()) { - // 注意这个数组放的位置 - vector visited(n + 1, false); // 可加,可不加,加了效率高一些,防止队列里重复访问,其数值已经算过了 - que_size = que.size(); int node = que.front(); que.pop(); for (Edge edge : grid[node]) { int from = node; int to = edge.to; - int price = edge.val; - if (minDist[to] > minDist[from] + price) { // 开始松弛 - minDist[to] = minDist[from] + price; - if(visited[to]) continue; // 节点不用重复放入队列,但节点需要重复计算,所以放在这里位置 - visited[to] = true; - que.push(to); + int value = edge.val; + if (minDist[to] > minDist[from] + value) { // 开始松弛 + minDist[to] = minDist[from] + value; + que.push(to); } } @@ -244,41 +244,103 @@ int main() { if (minDist[end] == INT_MAX) cout << "unconnected" << endl; // 不能到达终点 else cout << minDist[end] << endl; // 到达终点最短路径 } + ``` -代码中有一点需要注意,即 `if(visited[to]) continue;` 这段代码放的位置。 +## 效率分析 + +队列优化版Bellman_ford 的时间复杂度 并不稳定,效率高低依赖于图的结构。 + +例如 如果是一个双向图,且每一个节点和所有其他节点都相连的话,那么该算法的时间复杂度就接近于 Bellman_ford 的 O(N * E) N 为节点数量,E为边的数量。 + +在这种图中,每一个节点都会重复加入队列 n - 1次,因为 这种图中 每个节点 都有 n-1 条指向该节点的边,每条边指向该节点,就需要加入一次队列。(如果这里看不懂,可以在重温一下代码逻辑) + +至于为什么 双向图且每一个节点和所有其他节点都相连的话,每个节点 都有 n-1 条指向该节点的边, 我再来举个例子,如图: + +[](https://code-thinking-1253855093.file.myqcloud.com/pics/20240416104138.png) + +图中 每个节点都与其他所有节点相连,节点数n 为 4,每个节点都有3条指向该节点的边,即入度为3。 +n为其他数值的时候,也是一样的。 -一些录友可能写成这样: +当然这种图是比较极端的情况,也是最稠密的图。 + +所以如果图越稠密,则 SPFA的效率越接近与 Bellman_ford。 + +反之,图越稀疏,SPFA的效率就越高。 + +一般来说,SPFA 的时间复杂度为 O(K * N) K 为不定值,因为 节点需要计入几次队列取决于 图的稠密度。 + +如果图是一条线形图且单向的话,每个节点的入度为1,那么只需要加入一次队列,这样时间复杂度就是 O(N)。 + +所以 SPFA 在最坏的情况下是 O(N * E),但 一般情况下 时间复杂度为 O(K * N)。 + +尽管如此,**以上分析都是 理论上的时间复杂度分析**。 + +并没有计算 出队列 和 入队列的时间消耗。 因为这个在不同语言上 时间消耗也是不一定的。 + +以C++为例,以下两端代码理论上,时间复杂度都是 O(n) : ```CPP -if (minDist[to] > minDist[from] + price) { // 开始松弛 - if(visited[to]) continue; - minDist[to] = minDist[from] + price; - visited[to] = true; - que.push(to); +for (long long i = 0; i < n; i++) { + k++; } -``` - -这是不对了,我们仅仅是控制节点不用重复加入队列,但对于边的松弛,节点数值的更新,是要重复计算的,要不然如何 不断更新最短路径呢? -所以 `if(visited[to]) continue;` 应该放在这里: +``` ```CPP -if (minDist[to] > minDist[from] + price) { // 开始松弛 - minDist[to] = minDist[from] + price; - if(visited[to]) continue; // 仅仅控制节点不要重复加入队列 - visited[to] = true; - que.push(to); +for (long long i = 0; i < n; i++) { + que.push(i); + que.front(); + que.pop(); } + ``` +在 MacBook Pro (13-inch, M1, 2020) 机器上分别测试这两段代码的时间消耗情况: + +* n = 10^4,第一段代码的时间消耗:1ms,第二段代码的时间消耗: 4 ms +* n = 10^5,第一段代码的时间消耗:1ms,第二段代码的时间消耗: 13 ms +* n = 10^6,第一段代码的时间消耗:4ms,第二段代码的时间消耗: 59 ms +* n = 10^7,第一段代码的时间消耗: 24ms,第二段代码的时间消耗: 463 ms +* n = 10^8,第一段代码的时间消耗: 135ms,第二段代码的时间消耗: 4268 ms + +在这里就可以看出 出队列和入队列 其实也是十分耗时的。 + +SPFA(队列优化版Bellman_ford) 在理论上 时间复杂度更胜一筹,但实际上,也要看图的稠密程度,如果 图很大且非常稠密的情况下,虽然 SPFA的时间复杂度接近Bellman_ford,但实际时间消耗 可能是 SPFA耗时更多。 +针对这种情况,我在后面题目讲解中,会特别加入稠密图的测试用例来给大家讲解。 ## 拓展 -关于 加visited 方式节点重复方便,可能也有录友认为,加上 visited 也是防止 如果图中出现了环的话,会导致的 队列里一直不为空。 +这里可能有录友疑惑,`while (!que.empty())` 队里里 会不会造成死循环? 例如 图中有环,这样一直有元素加入到队列里? + +其实有环的情况,要看它是 正权回路 还是 负全回路。 + +题目描述中,已经说了,本题没有 负权回路 。 + +如图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240412111849.png) + +正权回路 就是有环,但环的总权值为正数。 + +在有环且只有正权回路的情况下,即使元素重复加入队列,最后,也会因为 所有边都松弛后,节点数值(minDist数组)不在发生变化了 而终止。 + +(而且有重复元素加入队列是正常的,多条路径到达同一个节点,节点必要要选择一个最短的路径,而这个节点就会重复加入队列进行判断,选一个最短的) + +在[0094.城市间货物运输I](./0094.城市间货物运输I.md) 中我们讲过对所有边 最多松弛 n -1 次,就一定可以求出所有起点到所有节点的最小距离即 minDist数组。 + +即使再松弛n次以上, 所有起点到所有节点的最小距离(minDist数组) 不会再变了。 (这里如果不理解,建议认真看[0094.城市间货物运输I](./0094.城市间货物运输I.md)讲解) + +所以本题我们使用队列优化,有元素重复加入队列,也会因为最后 minDist数组 不会在发生变化而终止。 + +节点再加入队列,需要有松弛的行为, 而 每个节点已经都计算出来 起点到该节点的最短路径,那么就不会有 执行这个判断条件`if (minDist[to] > minDist[from] + value)`,从而不会有新的节点加入到队列。 + +但如果本题有 负权回路,那情况就不一样了,我在下一题目讲解中,会重点讲解 负权回路 带来的变化。 + + diff --git "a/problems/kama0094.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I.md" "b/problems/kamacoder/0094.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I.md" similarity index 98% rename from "problems/kama0094.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I.md" rename to "problems/kamacoder/0094.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I.md" index 50c59ea7c0..0ce00bbf1d 100644 --- "a/problems/kama0094.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I.md" +++ "b/problems/kamacoder/0094.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I.md" @@ -16,6 +16,8 @@ 城市 1 到城市 n 之间可能会出现没有路径的情况,同时保证道路网络中不存在任何负权回路。 +> 负权回路是指一系列道路的总权值为负,这样的回路使得通过反复经过回路中的道路,理论上可以无限地减少总成本或无限地增加总收益。 + 输入描述 第一行包含两个正整数,第一个正整数 n 表示该国一共有 n 个城市,第二个整数 m 表示这些城市中共有 m 条道路。 @@ -55,6 +57,7 @@ **Bellman_ford算法的核心思想是 对所有边进行松弛n-1次操作(n为节点数量),从而求得目标最短路**。 +## 什么叫做松弛 看到这里,估计大家都比较晕了,为什么是 n-1 次,那“松弛”这两个字究竟是个啥意思? diff --git "a/problems/kama0095.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223II.md" "b/problems/kamacoder/0095.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223II.md" similarity index 72% rename from "problems/kama0095.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223II.md" rename to "problems/kamacoder/0095.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223II.md" index e9387c7312..1dd14f5816 100644 --- "a/problems/kama0095.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223II.md" +++ "b/problems/kamacoder/0095.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223II.md" @@ -11,7 +11,7 @@ 权值为负则表示政府的补贴超过了支出的运输成本,实际表现为运输过程中还能赚取一定的收益。 -然而,在评估从城市 1 到城市 n 的所有可能路径中综合政府补贴后的最低运输成本时,存在一种情况:图中可能出现负权回路。 +然而,在评估从城市 1 到城市 n 的所有可能路径中综合政府补贴后的最低运输成本时,存在一种情况:**图中可能出现负权回路**。 负权回路是指一系列道路的总权值为负,这样的回路使得通过反复经过回路中的道路,理论上可以无限地减少总成本或无限地增加总收益。 @@ -151,3 +151,90 @@ int main() { * 时间复杂度: O(N * E) , N为节点数量,E为图中边的数量 * 空间复杂度: O(N) ,即 minDist 数组所开辟的空间 + +## 拓展 + +本题可不可 使用 队列优化版的bellman_ford(SPFA)呢? + +上面的解法中,我们对所有边松弛了n-1次后,在松弛一次,如果出现minDist出现变化就判断有负权回路。 + +如果使用 SPFA 那么节点都是进队列的,那么节点进入队列几次后 足够判断该图是否有负权回路呢? + +在 [0094.城市间货物运输I-SPFA](./0094.城市间货物运输I-SPFA) 中,我们讲过 在极端情况下,即:所有节点都与其他节点相连,每个节点的入度为 n-1 (n为节点数量),所以每个节点最多加入 n-1 次队列。 + +那么如果节点加入队列的次数 超过了 n-1次 ,那么该图就一定有负权回路。 + +所以本题也是可以使用 SPFA 来做的。 代码如下: + +```CPP +#include +#include +#include +#include +#include +using namespace std; + +struct Edge { //邻接表 + int to; // 链接的节点 + int val; // 边的权重 + + Edge(int t, int w): to(t), val(w) {} // 构造函数 +}; + + +int main() { + int n, m, p1, p2, val; + cin >> n >> m; + + vector> grid(n + 1); // 邻接表 + + // 将所有边保存起来 + for(int i = 0; i < m; i++){ + cin >> p1 >> p2 >> val; + // p1 指向 p2,权值为 val + grid[p1].push_back(Edge(p2, val)); + } + int start = 1; // 起点 + int end = n; // 终点 + + vector minDist(n + 1 , INT_MAX); + minDist[start] = 0; + + queue que; + que.push(start); // 队列里放入起点 + + vector count(n+1, 0); // 记录节点加入队列几次 + count[start]++; + + bool flag = false; + while (!que.empty()) { + + int node = que.front(); que.pop(); + + for (Edge edge : grid[node]) { + int from = node; + int to = edge.to; + int value = edge.val; + if (minDist[to] > minDist[from] + value) { // 开始松弛 + minDist[to] = minDist[from] + value; + que.push(to); + count[to]++; + if (count[to] == n) {// 如果加入队列次数超过 n-1次 就说明该图与负权回路 + flag = true; + while (!que.empty()) que.pop(); + break; + } + } + } + } + + if (flag) cout << "circle" << endl; + else if (minDist[end] == INT_MAX) { + cout << "unconnected" << endl; + } else { + cout << minDist[end] << endl; + } + +} + +``` diff --git "a/problems/kama0096.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223III.md" "b/problems/kamacoder/0096.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223III.md" similarity index 68% rename from "problems/kama0096.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223III.md" rename to "problems/kamacoder/0096.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223III.md" index 10fb03803a..c9d97a9d8e 100644 --- "a/problems/kama0096.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223III.md" +++ "b/problems/kamacoder/0096.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223III.md" @@ -65,7 +65,7 @@ 图中,节点2 最多已经经过2个节点 到达节点4,那么中间是有多少条边呢,是 3 条边对吧。 -所以本题就是求,起点最多经过k + 1 条边到达终点的最短距离。 +所以本题就是求:起点最多经过k + 1 条边到达终点的最短距离。 对所有边松弛一次,相当于计算 起点到达 与起点一条边相连的节点 的最短距离,那么对所有边松弛 k + 1次,就是求 起点到达 与起点k + 1条边相连的节点的 最短距离。 @@ -339,7 +339,7 @@ int main() { 其实这是和示例中给出的边的顺序是有关的, -我们按照我修改后的示例再来模拟 对所有边的第一次拓展情况。 +我们按照修改后的示例再来模拟 对所有边的第一次拓展情况。 初始化: @@ -366,20 +366,17 @@ int main() { 那么前面讲解过的 [94.城市间货物运输I](./kama94.城市间货物运输I.md) 和 [95.城市间货物运输II](./kama95.城市间货物运输II.md) 也是bellman_ford经典算法,也没使用 minDist_copy,怎么就没问题呢? -> 如果没看过我上面这两篇讲解的话,建议详细学习上面两篇,在看我下面讲的区别,否则容易看不懂。 +> 如果没看过我上面这两篇讲解的话,建议详细学习上面两篇,再看我下面讲的区别,否则容易看不懂。 [94.城市间货物运输I](./kama94.城市间货物运输I.md), 是没有 负权回路的,那么 多松弛多少次,对结果都没有影响。 求 节点1 到 节点n 的最短路径,松弛n-1 次就够了,松弛 大于 n-1次,结果也不会变。 -那么在对所有边进行第一次松弛的时候,如果基于 最近计算的 minDist 来计算 minDist (相当于多做松弛了),也是对最终结果没影响。 +那么在对所有边进行第一次松弛的时候,如果基于 本次计算的 minDist 来计算 minDist (相当于多做松弛了),也是对最终结果没影响。 -[95.城市间货物运输II](./kama95.城市间货物运输II.md) 是判断是否有 负权回路,一旦有负权回路, 对所有边松弛 n -1 次以后,在做松弛 minDist 数值一定会变,根据这一点是判断是否有负权回路。 - -所以 在对所有边进行第一次松弛的时候,如果基于 最近计算的 minDist 来计算 minDist (相当于多做松弛了),对最后判断是否有负权回路同样没有影响。 - -你可以理解 minDist的数组其实是不准确了,但它只要变化了就可以让我们来判断 是否有 负权回路。 +[95.城市间货物运输II](./kama95.城市间货物运输II.md) 是判断是否有 负权回路,一旦有负权回路, 对所有边松弛 n-1 次以后,在做松弛 minDist 数值一定会变,根据这一点来判断是否有负权回路。 +所以,[95.城市间货物运输II](./kama95.城市间货物运输II.md) 只需要判断minDist数值变化了就行,而 minDist 的数值对不对,并不是我们关心的。 那么本题 为什么计算minDist 一定要基于上次 的 minDist 数值。 @@ -390,3 +387,199 @@ int main() { 如果本题中 没有负权回路的测试用例, 那版本一的代码就可以过了,也就不用我费这么大口舌去讲解的这个坑了。 +## 拓展三(SPFA) + +本题也可以用 SPFA来做,关于 SPFA ,已经在这里 [0094.城市间货物运输I-SPFA](./0094.城市间货物运输I-SPFA.md) 有详细讲解。 + +使用SPFA算法解决本题的时候,关键在于 如何控制松弛k次。 + +其实实现不难,但有点技巧,可以用一个变量 que_size 记录每一轮松弛入队列的所有节点数量。 + +下一轮松弛的时候,就把队列里 que_size 个节点都弹出来,就是上一轮松弛入队列的节点。 + +代码如下(详细注释) + +```CPP +#include +#include +#include +#include +#include +using namespace std; + +struct Edge { //邻接表 + int to; // 链接的节点 + int val; // 边的权重 + + Edge(int t, int w): to(t), val(w) {} // 构造函数 +}; + + +int main() { + int n, m, p1, p2, val; + cin >> n >> m; + + vector> grid(n + 1); // 邻接表 + + // 将所有边保存起来 + for(int i = 0; i < m; i++){ + cin >> p1 >> p2 >> val; + // p1 指向 p2,权值为 val + grid[p1].push_back(Edge(p2, val)); + } + int start, end, k; + cin >> start >> end >> k; + + k++; + + vector minDist(n + 1 , INT_MAX); + vector minDist_copy(n + 1); // 用来记录每一次遍历的结果 + + minDist[start] = 0; + + queue que; + que.push(start); // 队列里放入起点 + + int que_size; + while (k-- && !que.empty()) { + + minDist_copy = minDist; // 获取上一次计算的结果 + que_size = que.size(); // 记录上次入队列的节点个数 + while (que_size--) { // 上一轮松弛入队列的节点,这次对应的边都要做松弛 + int node = que.front(); que.pop(); + for (Edge edge : grid[node]) { + int from = node; + int to = edge.to; + int price = edge.val; + if (minDist[to] > minDist_copy[from] + price) { + minDist[to] = minDist_copy[from] + price; + que.push(to); + } + } + + } + } + if (minDist[end] == INT_MAX) cout << "unreachable" << endl; + else cout << minDist[end] << endl; + +} + +``` + +时间复杂度: O(K * H) H 为不确定数,取决于 图的稠密度,但H 一定是小于等于 E 的 + +关于 SPFA的是时间复杂度分析,我在[0094.城市间货物运输I-SPFA](./0094.城市间货物运输I-SPFA.md) 有详细讲解 + +但大家会发现,以上代码大家提交后,怎么耗时这么多? + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240418113308.png) + +理论上,SPFA的时间复杂度不是要比 bellman_ford 更优吗? + +怎么耗时多了这么多呢? + +以上代码有一个可以改进的点,每一轮松弛中,重复节点可以不用入队列。 + +因为重复节点入队列,下次从队列里取节点的时候,该节点要取很多次,而且都是重复计算。 + +所以代码可以优化成这样: + +```CPP +#include +#include +#include +#include +#include +using namespace std; + +struct Edge { //邻接表 + int to; // 链接的节点 + int val; // 边的权重 + + Edge(int t, int w): to(t), val(w) {} // 构造函数 +}; + + +int main() { + int n, m, p1, p2, val; + cin >> n >> m; + + vector> grid(n + 1); // 邻接表 + + // 将所有边保存起来 + for(int i = 0; i < m; i++){ + cin >> p1 >> p2 >> val; + // p1 指向 p2,权值为 val + grid[p1].push_back(Edge(p2, val)); + } + int start, end, k; + cin >> start >> end >> k; + + k++; + + vector minDist(n + 1 , INT_MAX); + vector minDist_copy(n + 1); // 用来记录每一次遍历的结果 + + minDist[start] = 0; + + queue que; + que.push(start); // 队列里放入起点 + + int que_size; + while (k-- && !que.empty()) { + + vector visited(n + 1, false); // 每一轮松弛中,控制节点不用重复入队列 + minDist_copy = minDist; + que_size = que.size(); + while (que_size--) { + int node = que.front(); que.pop(); + for (Edge edge : grid[node]) { + int from = node; + int to = edge.to; + int price = edge.val; + if (minDist[to] > minDist_copy[from] + price) { + minDist[to] = minDist_copy[from] + price; + if(visited[to]) continue; // 不用重复放入队列,但需要重复松弛,所以放在这里位置 + visited[to] = true; + que.push(to); + } + } + + } + } + if (minDist[end] == INT_MAX) cout << "unreachable" << endl; + else cout << minDist[end] << endl; +} +``` + +以上代码提交后,耗时情况: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240418113952.png) + +大家发现 依然远比 bellman_ford 的代码版本 耗时高。 + +这又是为什么呢? + +可以发现耗时主要是在 第8组数据上: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240418114511.png) + +其实第八组数据是我特别制作的一个 稠密大图,该图有250个节点和10000条边, 在这种情况下, SPFA 的时间复杂度 是接近与 bellman_ford的。 + +但因为 SPFA 节点的进出队列操作,耗时很大,所以相同的时间复杂度的情况下,SPFA 实际上更耗时了。 + +这一点我在 [0094.城市间货物运输I-SPFA](./0094.城市间货物运输I-SPFA.md) 有分析,感兴趣的录友再回头去看看。 + +## 总结 + +本题是单源有限最短路问题,也是 bellman_ford的一个拓展问题,如果理解bellman_ford 其实思路比较容易理解,但有很多细节。 + +例如 为什么要用 minDist_copy 来记录上一轮 松弛的结果。 这也是本篇我为什么花了这么大篇幅讲解的关键所在。 + +接下来,还给大家多了三个拓展: + +* 边的顺序的影响 +* 本题的本质 +* SPFA的解法 + +学透了以上三个拓展,相信大家会对bellman_ford有更深入的理解。 diff --git "a/problems/kamacoder/0097.\345\260\217\346\230\216\351\200\233\345\205\254\345\233\255.md" "b/problems/kamacoder/0097.\345\260\217\346\230\216\351\200\233\345\205\254\345\233\255.md" new file mode 100644 index 0000000000..b2afc482fd --- /dev/null +++ "b/problems/kamacoder/0097.\345\260\217\346\230\216\351\200\233\345\205\254\345\233\255.md" @@ -0,0 +1,367 @@ + +# Floyd 算法精讲 + +[卡码网:97. 小明逛公园](https://kamacoder.com/problempage.php?pid=1155) + +【题目描述】 + +小明喜欢去公园散步,公园内布置了许多的景点,相互之间通过小路连接,小明希望在观看景点的同时,能够节省体力,走最短的路径。 + + +给定一个公园景点图,图中有 N 个景点(编号为 1 到 N),以及 M 条双向道路连接着这些景点。每条道路上行走的距离都是已知的。 + + +小明有 Q 个观景计划,每个计划都有一个起点 start 和一个终点 end,表示他想从景点 start 前往景点 end。由于小明希望节省体力,他想知道每个观景计划中从起点到终点的最短路径长度。 请你帮助小明计算出每个观景计划的最短路径长度。 + +【输入描述】 + +第一行包含两个整数 N, M, 分别表示景点的数量和道路的数量。 + +接下来的 M 行,每行包含三个整数 u, v, w,表示景点 u 和景点 v 之间有一条长度为 w 的双向道路。 + +接下里的一行包含一个整数 Q,表示观景计划的数量。 + +接下来的 Q 行,每行包含两个整数 start, end,表示一个观景计划的起点和终点。 + +【输出描述】 + +对于每个观景计划,输出一行表示从起点到终点的最短路径长度。如果两个景点之间不存在路径,则输出 -1。 + +【输入示例】 + +7 3 +1 2 4 +2 5 6 +3 6 8 +2 +1 2 +2 3 + +【输出示例】 + +4 +-1 + +【提示信息】 + +从 1 到 2 的路径长度为 4,2 到 3 之间并没有道路。 + +1 <= N, M, Q <= 1000. + +## 思路 + +本题是经典的多源最短路问题。 + +在这之前我们讲解过,dijkstra朴素版、dijkstra堆优化、Bellman算法、Bellman队列优化(SPFA) 都是单源最短路,即只能有一个起点。 + +而本题是多源最短路,即 求多个起点到多个终点的多条最短路径。 + +通过本题,我们来系统讲解一个新的最短路算法-Floyd 算法。 + +Floyd 算法对边的权值正负没有要求,都可以处理。 + +Floyd算法核心思想是动态规划。 + +例如我们再求节点1 到 节点9 的最短距离,用二维数组来表示即:grid[1][9],如果最短距离是10 ,那就是 grid[1][9] = 10。 + +那 节点1 到 节点9 的最短距离 是不是可以由 节点1 到节点5的最短距离 + 节点5到节点9的最短距离组成呢? + +即 grid[1][9] = grid[1][5] + grid[5][9] + +节点1 到节点5的最短距离 是不是可以有 节点1 到 节点3的最短距离 + 节点3 到 节点5 的最短距离组成呢? + +即 grid[1][5] = grid[1][3] + grid[3][5] + +以此类推,节点1 到 节点3的最短距离 可以由更小的区间组成。 + +那么这样我们是不是就找到了,子问题推导求出整体最优方案的递归关系呢。 + +而节点1 到 节点9 的最短距离 可以由 节点1 到节点5的最短距离 + 节点5到节点9的最短距离组成, 也可以有 节点1 到节点7的最短距离 + 节点7 到节点9的最短距离的距离组成。 + +那么选哪个呢? + +是不是 要选一个最小的,毕竟是求最短路。 + +此时我们已经接近明确递归公式了。 + +之前在讲解动态规划的时候,给出过动规五部曲: + +* 确定dp数组(dp table)以及下标的含义 +* 确定递推公式 +* dp数组如何初始化 +* 确定遍历顺序 +* 举例推导dp数组 + +那么接下来我们还是用这五部来给大家讲解 Floyd。 + +1、确定dp数组(dp table)以及下标的含义 + +这里我们用 grid数组来存图,那就把dp数组命名为 grid。 + +grid[i][j][k] = m,表示 节点i 到 节点j 以[1...k] 集合为中间节点的最短距离为m。 + +可能有录友会想: 节点i 到 节点j 的最短距离为m,这句话可以理解,但 以[1...k]集合为中间节点 理解不辽。 + +节点i 到 节点j 的最短路径中 一定是经过很多节点,那么这个集合用[1...k] 来表示。 + +k不能单独指某个节点,因为谁说 节点i 到节点j的最短路径中 一定只有一个节点呢,所以k 一定要表示一个集合,即[1...k] ,表示节点1 到 节点k 一共k个节点的集合。 + + +2、确定递推公式 + +在上面的分析中我们已经初步感受到了递推的关系。 + +我们分两种情况: + +1. 节点i 到 节点j 的最短路径经过节点k +2. 节点i 到 节点j 的最短路径不经过节点k + +对于第一种情况,`grid[i][j][k] = grid[i][k][k - 1] + grid[k][j][k - 1]` + +节点i 到 节点k 的最短距离 是不经过节点k,中间节点集合为[1...k-1],所以 表示为`grid[i][k][k - 1]` + +节点k 到 节点j 的最短距离 也是不经过节点k,中间节点集合为[1...k-1],所以表示为 `grid[k][j][k - 1]` + +第二种情况,`grid[i][j][k] = grid[i][j][k - 1]` + +如果节点i 到 节点j的最短距离 不经过节点k,那么 中间节点集合[1...k-1],表示为 `grid[i][j][k - 1]` + +因为我们是求最短路,对于这两种情况自然是取最小值。 + +即: `grid[i][j][k] = min(grid[i][k][k - 1] + grid[k][j][k - 1], grid[i][j][k - 1])` + + +3、dp数组如何初始化 + +grid[i][j][k] = m,表示 节点i 到 节点j 以[1...k] 集合为中间节点的最短距离为m。 + +刚开始初始化k 是不确定的。 + +例如题目中只是输入边(节点2 -> 节点6,权值为3),那么grid[2][6][k] = 3,k需要填什么呢? + +把k 填成1,那如何上来就知道 节点2 经过节点1 到达节点6的最短距离是3 呢。 + +所以 只能 把k 赋值为 0,本题 节点0 是无意义的,节点是从1 到 n。 + +这样我们在下一轮计算的时候,就可以根据 grid[i][j][0] 来计算 grid[i][j][1],此时的 grid[i][j][1] 就是 节点i 经过节点1 到达 节点j 的最小距离了。 + + + + +**初始化这里要画图,对后面的遍历顺序理解很重要** + +所以初始化: + +```CPP +vector>> grid(n + 1, vector>(n + 1, vector(n + 1, 10005))); // C++定义了一个三位数组,10005是因为边的最大距离是10^4 + +for(int i = 0; i < m; i++){ + cin >> p1 >> p2 >> val; + grid[p1][p2][0] = val; + grid[p2][p1][0] = val; // 注意这里是双向图 +} + +``` + +grid数组中其他元素数值应该初始化多少呢? + +本题求的是最小值,所以输入数据没有涉及到的节点的情况都应该初始为一个最大数。 + +这样才不会影响,每次计算去最小值的时候,初始值对计算结果的影响。 + +所以grid数组的定义可以是: + +```CPP +// C++写法,定义了一个三位数组,10005是因为边的最大距离是10^4 +vector>> grid(n + 1, vector>(n + 1, vector(n + 1, 10005))); + +``` + +4、确定遍历顺序 + +从递推公式:`grid[i][j][k] = min(grid[i][k][k - 1] + grid[k][j][k - 1], grid[i][j][k - 1])` 可以看出,我们需要三个for循环,分别遍历i,j 和k + +而 k 依赖于 k - 1, i 和j 的到 并不依赖与 i - 1 或者 j - 1 等等。 + +那么这三个for的嵌套顺序应该是什么样的呢? + +我们来看初始化,我们是把 k =0 的 i 和j 对应的数值都初始化了,这样才能去计算 k = 1 的时候 i 和 j 对应的数值。 + +这就好比是一个三维坐标,i 和j 是平层,而k 是 垂直向上 的。 + +遍历的顺序是从底向上 一层一层去遍历。 + +所以遍历k 的for循环一定是在最外面,这样才能 水平方向一层一层去遍历。如图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240424120109.png) + +至于遍历 i 和 j 的话,for 循环的先后顺序无所谓。 + +代码如下: + +```CPP +for (int k = 1; k <= n; k++) { + for (int i = 1; i <= n; i++) { + for (int j = 1; j <= n; j++) { + grid[i][j][k] = min(grid[i][j][k-1], grid[i][k][k-1] + grid[k][j][k-1]); + } + } +} +``` + +有录友可能想,难道 遍历k 放在最里层就不行吗? + +k 放在最里层,代码是这样: + +```CPP +for (int i = 1; i <= n; i++) { + for (int j = 1; j <= n; j++) { + for (int k = 1; k <= n; k++) { + grid[i][j][k] = min(grid[i][j][k-1], grid[i][k][k-1] + grid[k][j][k-1]); + } + } +} +``` + +此时就遍历了 j 与 k 形成一个平面,i 则是纵面,那遍历 就是这样的: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240424115827.png) + + +而我们初始化,是 k 为0,然后 i 和 j 形成的平面做初始化,如果以 k 和 j 形成的平面去遍历,就造成了 递推公式 用不上上一轮计算的结果,从而导致结果不对(初始化的结果只能用上一部分,因为初始化是 i 与j 形成的平面)。 + +我再给大家举一个测试用例 + +``` +5 4 +1 2 10 +1 3 1 +3 4 1 +4 2 1 +1 +1 2 +``` + +就是图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240424120942.png) + +就节点1 到 节点 2 的最短距离,运行结果是 10 ,但正确的结果很明显是3。 + +为什么呢? + +因为 k 放在最里面,先就把 节点1 和 节点 2 的最短距离就确定了,后面再也不会计算节点 1 和 节点 2的距离,同时也不会基于 初始化或者之前计算过的结果来计算,即不会考虑 节点1 到 节点3, 节点3 到节点 4,节点4到节点2 的距离。 + + +而遍历k 的for循环如果放在中间呢,同样是 j 与k 行程一个平面,i 是纵面,遍历的也是这样: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240424115827.png) + + +同样不能完全用上初始化 和 上一层计算的结果。 + +很多录友对于 floyd算法的遍历顺序搞不懂,其实 是没有从三维的角度去思考,同时我把三维立体图给大家画出来,遍历顺序标出来,大家就很容易想明白,为什么 k 放在最外层 才能用上 初始化和上一轮计算的结果了。 + + + + +```CPP +#include +#include +#include +using namespace std; + +int main() { + int n, m, p1, p2, val; + cin >> n >> m; + + vector>> grid(n + 1, vector>(n + 1, vector(n + 1, 10005))); // 因为边的最大距离是10^4 + for(int i = 0; i < m; i++){ + cin >> p1 >> p2 >> val; + grid[p1][p2][0] = val; + grid[p2][p1][0] = val; // 注意这里是双向图 + + } + // 开始 floyd + for (int k = 1; k <= n; k++) { + for (int i = 1; i <= n; i++) { + for (int j = 1; j <= n; j++) { + grid[i][j][k] = min(grid[i][j][k-1], grid[i][k][k-1] + grid[k][j][k-1]); + } + } + } + // 输出结果 + int z, start, end; + cin >> z; + while (z--) { + cin >> start >> end; + if (grid[start][end][n] == 10005) cout << -1 << endl; + else cout << grid[start][end][n] << endl; + } +} + +``` + + + +# 拓展 负权回路 + +本题可以有负数,但不能出现负权回路 + +--------- + +floyd n^3 + +同样多源汇最短路算法 Floyd 也是基于动态规划 + +Floyd 算法可以用来解决多源最短路径问题,它会计算图中每两个点之间的最短路径。 + + Floyd 算法对边权的正负没有限制要求(可处理正负权边的图),且能利用 Floyd 算法可能够对图中负环进行判定 + +LeetCode-1334. 阈值距离内邻居最少的城市 + +https://leetcode.cn/problems/find-the-city-with-the-smallest-number-of-neighbors-at-a-threshold-distance/description/ + +----------- + + +```CPP +#include +#include +#include +using namespace std; + +int main() { + int n, m, p1, p2, val; + cin >> n >> m; + + vector> grid(n, vector(n, 10005)); // 因为边的最大距离是10^4 + + for(int i = 0; i < m; i++){ + cin >> p1 >> p2 >> val; + grid[p1][p2] = val; + grid[p2][p1] = val; // 注意这里是双向图 + + } + // 开始 floyd + for (int p = 0; p < n; p++) { + for (int i = 0; i < n; i++) { + for (int j = 0; j < n; j++) { + grid[i][j] = min(grid[i][j], grid[i][p] + grid[p][j]); + } + } + } + // 输出结果 + int z, start, end; + cin >> z; + while (z--) { + cin >> start >> end; + if (grid[start][end] == 10005) cout << -1 << endl; + else cout << grid[start][end] << endl; + } +} + + +``` + + From baf021f2f54727a94236d94b1463f82d722cd7c6 Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Wed, 24 Apr 2024 16:26:49 +0800 Subject: [PATCH 2610/3019] Update --- ...3\344\274\240\346\265\267\346\212\245.jpg" | Bin 286579 -> 154265 bytes ...11\346\225\260\344\271\213\345\222\214.md" | 2 -- 2 files changed, 2 deletions(-) diff --git "a/pics/\347\275\221\347\253\231\346\230\237\347\220\203\345\256\243\344\274\240\346\265\267\346\212\245.jpg" "b/pics/\347\275\221\347\253\231\346\230\237\347\220\203\345\256\243\344\274\240\346\265\267\346\212\245.jpg" index b0325d8733f1e94f803e9e44e0d1b4e5a0cd570b..547d570418908e1ea34b0cee9034a05fd38071c1 100644 GIT binary patch literal 154265 zcmbTd1yCHp*FCy;AS48L2<{qO0|eK_o!}PS9YTPF;O_3Q5M*(8cXxMpS>V6<>G!>= z_v*bjRQKHJ+jVCyv%7UppWCnVuj_yhG7{1f02mkm00#O8cwGXB0TAI45E0-J5fKoP zkPzRXd_X}#Mn=JUkB0gI7Yh#$7Yhf6fS8JufRKU+2j?T>M+#~hI(j;MQYKa=T2?Ar zI@-TMV33fIP~M9MV9{aV&|zM?0i@99M1c9n z0r=Me0}BUzUZgk3C~u(?z#jmxFmQ0N@NftS@bJ*tK2SdZ9vuOLj79I(iOHE^Z!PKCv(25|UEVGAgQS>Kd9_ z+QufPX66=_R!+_?u5Rugo`FAtfQN>0hi&C4$+EGjOks;&Xo*3~yO zc6N35^!D`+3{Fl>&&+*GIYQsXAgLTB^sSw*?~;)N%f&!||H$nBU1Hz=e`WTc#QvMtA^;T*2Kw^g&;i1LN4E2dw)+r+e0f6uyudi} z+y;Ghku?w_V`-o9Vsm|igl-ES$VU^N@ZkwGJ{=Iu)rOc#9xoQ5dR-tP(m8M!DJJSW zs9THMQ%v^LMS?s@U1GhG0~z~0A;$%KKs@|pW|fc4zOoH!he&8=fbit5@X6LSXuNFC z>0FS3eHkI)psjIz7KN{Tj;Au^64K9{|Mrj9W>T9#45{Rci~7L;{&mzVfSKOJCOfhe zZEx)16+lC$+8jZW-wC_qS2;$y2YGQ3?P4k_=dF^dJvgbb)UI>3myZ$2 zIDY8uAOU{pz6@A~rE~6TJgJ26swlMK#c&DzAOID##dB0V-+~T??tZoI&Im51wX|&v zP1L%;t~6j%HH-|9Y^ySInfB?|gf3CBoTVHuP3|B&b~60Jitr32i}eu6sCk;f%o!kE z6|}5n+trsOuc~P&q+f`&b8q|vj>?F$9sC*=Acc6aF!11@AWkmSOmL{3>(F-DcToyB z7m7#63%MxVE1WDwRoG1vy5Lw1mFK^g2GNCWc^f#(@}X@#kH3JY57^$?@WI<{M5b(> zg)DlD8`|!DjAesZgD&2+S57eRkzS4ppj?}^%!@S~sO#_W>5a;b+IfG81!%9%$o{#B zx-MA$V%G9oer2d_(N<@vzVP0W9b_8=DWCXVJXTkDRdOzeDK~SY<@m$qzF3Rg5jzDQpe6}XC`a;XzVcVF z{JPgI_Bf%3KEqpamA#d=MH)NXdd_@}Armz}m!k5Z7CxHh@3dJ$@+qdtuYi^mvwWX| z1rJx(64YZ4lS4M(p~{el{jEBF#O$(dbYhE0;gaV5?17gr_wrDBcHxz{e5~6 zOTQDOsQ5s>_jc_-+VvIChC;Vy|3m@~%M_Fr<(Cw70r#6cZ1CK~@S`}RuwIgO z=G8u+=h+tg$rVwL-<#9eZyPR_84`8uz_q|D(pF@l0ez(08Q3i8cN=QwDKAs!(&n*T zg7p8eYa5Ol;qX5pQh~AmQIcRMlTH=E*#Rk0bJV!|Y?Oo5Qqg?aYSc7FMlTvl`@u5+b5$AwMT}$cQ$M11QAl`C-ie_YQng!pPDZGv?{K0Ct zxei?z?oQdeaQ;?UJAr&WBteMqMH_9hjGuBGpRe@2wRUq-iCfIwxa6JfkrAQ8E;Zhz z#O$LhCv357wT;8D0&7jVcig-5B?Y`au&isFMI}4ga5Pczso%3pJddcojU8zZ`D&y_ zYp~`@p}`R5E1;Aj@Z?CxH3qR3l^3qXRPPm#zd)JieQ_@7_)a=owvu2W0+~nm(O0w- zMq_?cRcL5_3SC~caBRl*n?I^mOR^N_s6_AEM1|$eMg%G#%wb_>zTx3V#p6S!1v%D9|}!zzVg z$@N*zON#UJoK@~BNV+#!Di0G8&`xcI&TdA84!;n_mF5-EdwL*$nsoQQ2V;z~B0%_0SJ*P0ZE9}sGg=;u_@i}||J4!f(PyRlf z>E}pb$Xb!EIdkiqOL0w4<}{!~L|5hBTDv$<5G4m!*9kkrQD%mWNCwYWuPl>p@CV%X z5c1?4QVsF?Y401Y*e2>Vx(YLX(-DHa0{m}EJnaVTKJAsFpLO(5#%9vL=t3qdd2dNy za#fbT{3^^dc?Fb3Yb?d;Mkk&zyIejc9OQ6ik*I}XvJNHt8(b87cOaZ@KNP|TKB(4) z6Z(V+!+vx_b5K1we^YPQ!f~2A?>W~XBhXx&$*FHZ7?Hw$Z0Y1f7h@^WLu zdua=o&FQ#4wT1W`0d56SV;@%r!?WI$`DFe&JWtI z=zdO)Ae#%$Qc^}D_7p9Ey{NwoWIkJp*U$wE%rN?{bt%as@NbR1l{5i_$*s328 z5(#&F$t+n}a=9&f5Qg_+cqW>V6KCVQ6zJW_Dah({EY8{b(lPJddaXlLjrekUadRe1 zyBIn&#;h{%6Kk&T_G9&sR> z5@$X`V7_CeGPoJ-Yl0Zir6G{pD9E8!Wq0%Q72u(}b+Ck$Sn1FrbeW=sC*oOU^26af zTXfn>ym5)m&1QW%?Mz_d3^CDijI#I}-P#4DbDxb9D@wVUwWqL;1()pU%7d%?Ls0^_hg=f%|pt-?$DEf1~u^Wx?m?gaV-Pl8|M^nQ39@ zEP9w}KPZQ?ok$240rGPavHZ1Za{_{}fS=!rV=2Kv8*G3KZ2^A}KD9sP2y06Dm7nXM zn>H*+!=q%=36G>(9-}?s1wE zqMc)wJiC#NeFfOO!zHaY-)C$*i8DB2IZ-+KSfb+IB^KnLs8t1jiveelX;Zu=eOF#+ zcaL90pp|+iP4*Zo-nEdKE!InbiH%&gz(#|2C2k>JZh7ff+6K1E``*S2Uj^4y50O_S z$@Ll}0RNMSySY;5 z8sjWG>6v$D`UErTos4_AwdjRJV%g`agT|n;LrL*(q=U6F>m<#7^cJbO@9FYX#CFr( z!J^RSB=zKk(gJc~LIK*ed07bmy~y#0djHWdLTR%^pf8K{AI`tC6Jq}3{P!djI?KO~ zP(a=fS`%ND%A%cbXrg>-E~)U8EhVnNk8py#6=^OWTc+cuJGEsogz;ZL+!Pah@Gy7< zs3|W6MhW@OFuDn8b={Q~hW@^@t`H>>j*E*JPUhIr7doMBP`UFcsAk(HSQP4W9=NNu z@OWkbe5$FtDD)oY)o*qP=RJ8CFYWkSR8dW2J30vM2(n9;F(X{ zptVpq+-d=xl5iH#(cIZmuULWoR6F2Kn@-qAfgqWtznk@r zWHU#3+(7DNnAssxrlryxf$z_bBG{VLL#LPl7%fAk$fSXodZnGIJDEg+o-`_QrqYKO z1?$1-@FV}U1wX%r@ICxjSk2fGX|i6K>x0l}HDiQ02OxSH!l4Ie9YbiPtl>5q6QVp? zco%*FF3g<6fm(ip2j$`q0R3jFfy1Yw9PJo2H40v#c=hAaZ>Fv=Dp>s+O57ZU4xEU^ z-0_CAS8iS!s)jaU8^DHgV?voKOn1-_ts%T75?nbHVA%DRiO08uqBq`}M&b+7v!D*O zX|^Q8pd4%Y^Z;kft=EXP+7~`7P~Y-yQTjcWHZWUd{Js_}5?eB2nxy6A@?zrGX{6wN z1&BxPBN!f0_;?pJ;nFc!BsvSMVz1ha)7NGHyaVIARZ#c0|O(;^3Y$ z7;@rVzg_P$NM*FCmnJnx$azWCsTP@snS3)|grawj*TS^eiFWkJMYkH_g zeK+p$q{i0f_>U{3ff$jVNlMYlYRKjNZaeKzgy0bu6Z@1xjg$%HiWGa_cuHNNzV5*% z5NPSw37(1Uij^*gMnG!eo2Dtxi0UN9+8iTo0T0t($5xl$P1(5L*)FKxa*BFkP$Y@E zNl0Axfh;IrY~n%V4?2XpUbBv;=E_Ui!)7Ldz8Q6xzS75`b}i<;4sG}_4gSDice`)t=3$yz>zcp>Z>#g>Dx3r2Mkor@t*j8SL2N8g{m~$?V=5( zL~M%?KZ)=>_w*0eWf#q04*VK>tRqCr!Hm4RpPJ=4rLf_<3sLy$XK=6xE);TSxZ$|h zn@G~%`qJp-t~wCUoOCKke}3`C%V#R5EMv2D@a{w3juk26xL--;Q`h(lY`Lavo;5># zcue12pm!k!B2_lN+_LwqkquQfOc1krJ)38h5hsT+4%7;6g{$)m5Gs9CpC#A8sZ#C1-_wa;| zcPlK;k87JVi<7&hX3}Y|^390s&K4aA?ih*6J zB(3qVt@`}>=acV41ed-lHwC|Z9&=0#m{#$TkWOdJn1UF2;jV#NHJ<|0-!DL&6=S7uB#MEz2@P0B; zp}jiQbA{(QZ-bUI&skntKGdDR0zMpE7e_ukP9xZ7o>W}!VfO%e6jNxvXggFR8A1S0G)_&p5f`j|$Aj8f}9>>goCHq~G zCiE~&*SRv*4NV3(n~2X*e+C8H!#yXmtNwJ>#bmmsOiXws9~SB6bFl#b>GOL4>B0L8if%6?6w{!?x!lD$QPz99P1bu3b4UC>-^gv3Zp>#dT5|HWhl~y z31x#Kc52!lD5PK1)+J!IfT3ek==ggdZG*0x-198>yh2|r-~U`cTR_n^L|9uGZ5E2) z4LTFgvk)f~Aau~Maw)v|kbTHL3~z3V!D!?t)UOM@GZdmrLwjvNJ`|$oLs7T#Boyw; ziZgvgq5V6Q6N<@S` z^QX(m;s)YQcHr{BfsTNA*1ot+;rXBaEqGUx@wwWYflp zO^au0UEo_tU?j*R{WQDia4NB}p`jspj4Y|v59O``{$=D&gGBd*z6D)!y2EbZZpc^d z^abyTl8xuQ+7H(>&xAUXg zRNm99d+8cWYB{_D1m9ave}>Da#bUeC-C}AbxR+TY(Fi$~5H!ZlYehSUeD(0;jM?_;VBfjZTDs`cO7 zA1yB0`|dY+IQx!Bt2Kg8KfD6W_4O9}y<+Qq!PhWYlQ3BtLZY+KJoIcAh-=biR`*e( zBAPT`ICn`X?#(yH&=^{CbC=)Dl|_diJ!N63~TQ&rO}*9&#p z%Zhg78LpM^8in^_TNS^q<)aOxINzGCm$kV^f_&6A4T4@UFEB{!EI&M?XOPuI4mPv& z30KPxGhf{+T#ba8{Pw7~%M#v_<1o*@XW6m~c7ZNIGyD#oI*n9IJl&h(JgiNu977pE z{lzH9PW)b^VvH2S-B|m)XCY9lGG(FTsYhYznseM8bF=W500li0Xh>HpaHP4A0_$u! z1nw*^igkVJN}vCHYl|ynGb`avnJGBSeSyNe%qQG)7#C&T@eRet#~Iz=6ei`}q<72~ zA8M2*|+nm;`rR>->?cqbx?sFO` zO1tbl5}FV=u2Z4#l&y-2>?(I0Bc!w^M0e869rbB`sge?fQ=S3dN3`DhHgKiw?9sMs zbHzJsw}b*KkDrZ2@86|RW!I0N-JnlA+`ROfZ^4|)x-gS;#mJ}|5^<|G#w_J8-9B~4XgwP zJkH!wb3s2yli4Zc5;yp_*z242C)~8&6ALJb6Y+Ne{k$CKUox2_0LH;Yk1B)M`aFU` z9#wH5pNZNZ-}0pwX+OULRv~o#lWy8Xl`q8Lfx)__xopvAYwAr-TwIIiDSHTlRp5~- z3lc;wR=9_RAty}P)7InRhaJM9x~s?f7lRuUU$8o_z@J0+QKy^Iv7cEe{wJ{%LO;}$ zvvZl3@nHT7y8a7PM$BwNQPiNcWOyg>u1yW@rj*(Wq^E>_&}mxXm@FgnQk6nR>1a?rhEdlu^8-P3%M&&9h8pd53PX zxYSw{_MeUxYn+2|5)d%Y_^>HRry#dwI-0-rM9BJ?T0CwLo5--osC{e+(u}q9Vyes% zG77wwEHY6sFeF=y_4*I^DGgzFj;{iJu*=IYVc6F*w39zPWZ)%Bk5jM=wZ|f@G0`P2(gA+s-7-6Pn8G(WTFVBYbK-jgPS@TRjRVeGf)$Ou}s9z9tEU z^dtLpwc*`k3X$8jLN`P_vKn{!xW_BZHq$x~gbQ6u$NrzZyM+yQOlr6-;wDJR2?xru z!Hr5*tdKPgr`D>fhxZ1gQ5A6kK;NsW3D}b`7h=mFr}Z>dQ&&MoLQfhtv_*Byi{6P3 zRVJEBxe={1aDjx|_F%Yb$%$4!8PAXLZZZ%z(9Z90jpJ-W8R395%Ox$rAxrYA+mAEI zo6f5f&pZ2q?gi%N{UMM?wWRH}D__L?xd?WmD)ksrhC+tIZ1}^vH$V6p+~6QjsyN+! zls_TgwvDH#GoEr9LqE1P`AQ!3Q0EDx_QW~6_rC&!K@O^g<|mIm3y;Ka)dp)#LE_v? z54mTwWu+37y4}mfSpnBakF!UR*$p2J#7br1`;>MxQaZ8I&!8(51y0N9NQ3D#ftol2 zF^G^@z{OOHxQ5g$+*Dqi<(WuCp!aLGTE7>RSLkynv8go*hOf%7WRHm6K zWv(*NClsM!@4l+=3i>Sh3{v<7wnZ> zErYZ#8at*Czh|}m4J#^n@$y^J%BEfM+Q!zYpAi=ryJPnTA7dEkpHFOUoeH`SoIMsj z47z=+R>E^d$d_8i(lNraX+F*tgQK4Nfqn-C^efyz0;k?s`LlbUKFUd}TI8M1w~8#N zA}lO;XK6y@=}DO^!p?pe81I4wo2bEgHB8_X6w2ocYDJm_ZZbCnjqm_K-H< zei;20mBF2}ddu*N!Xv-^7u^SQ^jAQQL+~p=XeQL~$?!_?ajazta$WZHd&9NM$oGVu zLa4Bn->jBW#XMJ>aSxXpJ_z7TbD(?bJJYHcJw>43ODFs*nV_tb;iqbBzyJ#Jz`;_h zRC&zg(jd4ROp)`Pqj=W{m9RKfCg4-Yk=ofd;HGv$wIE8+(XZRUrR)5&Ah^j@RS?CYr3daDaaF7TUrBW3c#z;Uwmkl*ks%P zb8Fxy=^5H+LFpxsm*gwGEIyuL81z!&Q*u4II*RYs=lC zLB)_zw$JY%77)w7#BHrNvNs(%@Sj*v)g+WnytC^sWdqv(`QLYz{R^X@3JG2klpq0U z|J9%hhCfaOT|-e`ETTU#WdK9!g8TnNZzf?D*lI}st3q^yT_1iURC@CSQB8ET$0h={3LxJkX zvRBIGGoi#ZM6AdsRTi9ac`!zX=y^v2_N3`T3*>A2ogZ-p)c7;0@cs_Z1L;o%$eVb5 zgtT)O*(O&@5+&eDIx;=7A#X%APVvLN!;`?547I&5vn$G{&Pj^D)XhNDLi=5CxJB)v zTAunjZM)_)%1kH#i309ndMMz|z0ingi9*W%=s`8reJfPq8n;i|6}u0C_`n@o?-Uzp zxLu7G%oBTGt&Es)PKR28MBQ)z_Vtx1q=HnrWx4UiI_K6G5cUusC0^~=?q-zjHDsAf z*v-wRK4-Opzr&I2rh{Ad@oS+Y8HxK|v&iaqg&&2kVJ1M6q%u)5A@$|f&VdD%om!Gk zQn~pLI;Sbtbhn(p-yIcdx4heZxkmWOIf5oX$GAGDRvmnZgV+5#%?HiuVQ*9TcnvE@ zb__{zM|$9iF);AB5bVQPWxkpz9%N0LvN#)Aa&M>1^_X9F>&8|`82st|7FA@|_%F57OE1HC~yT_bNTwc0aH8&p1-!Qm79H@+}KYX?0XRQ&Lov#HcsU zRLseXhP7q1WxoEU=*a)l&7j)Zf{A8S(|MLjO7eiXlVEVHZGUdr8YsMWV;I!Q(&A9Z z&EiCtU?k16{rKdme2D9)uQ$N>gD8y|k(D0hzHEq?QSRhcy>IsGA7D0N+fU>Xc4-{W z6$%94bgW{zT@L|eT~N7=UUK`;7oFhtEjVK9?`f*(sg?Vbsnb0drVzK3?@VP)lju;g z!05Skd8C*51EQC=uprJ{bj;%Slir-TN*G38UjzyM>zv5C4>gl@x03d<6b375m~bo7 z`CMC2As){H!RGmS{M(WJCX$Q%wXR~VJ{PD?6=mvHj*M-a3`+?lF9{MSRDIu>;lX)5 z^u^bQ-{3O`P@D|`>)$L#R{HbX9wMMPEL6&rL1d!(t12>K!62$a!XKt&*fUq^u*$gX zA$u(-Wk~&w3}cS1uYhy;H+tBO-c_E{#-7}xpU%{U)CIywwUt99Ru-@aRM1AsoVkL; ztMP>F8oPvL3_fNyJIOzB-zf+a7*LB7@j?#OczsITp1vz9n(>bi7>2%NuR zo`g=Ynx6?-mFK?Y%>A()eL1V9doqNlg|G2Fp1Zt@DNC}t>ngM9rtEjr0Anh-VQwu4Wurt!ESLJfP6Njt8-lDQtP|rOKZRoKR+;&3>hhf*T(;fM zmTR5d^>iF|=CoE{ny-=4KZ{G7^8Vg2jPdjeEpc$(-du@x&@CSp_c^8#2`1v3K5zOg zFdx9ieg3FgtT6$@1I)^V^;{tozKX^8`>!= zQyde77JYHizZ8)0C|&^|O;7KU+c#QR-Z9ltg2)vTxI5;vlky#{Wvi9XH*r%@pLN&K z${7--OqVuw%;;V7HX>VGF9K-3QzpQGn{%nX(liJQPXaZjm~COuM31fGp zRZGk3>AJ{;O5L4W97ay09j@{SxFikZGow#KkPfs9;U&Vo86D_o_YeUD7_@R{B! zrOYNN5@0JQagG`m1Y`%twoVGb)!J;;CL$AslI?!)r?G8o1>y7z<2zHI72zN1?ly~@ zU6~K=nS%VTFY!P8`nMw19K0QD(5fmfivTuf&r`~}FNbgX?*7mje_eDU-CPTs8yVnL z$n`T%y`We*I(8>6mrLaHP7MF~IQ%H(+LT01 zh8PnP)>!)iWAy%}N5&tYxQVvC=(zt1`DQn*%_;KCWM-qp_dpReFKZuwJ|s&sby)0I_m?VERb{PTKOjYgK>rQ}B9m8H%Vl_DPY|TRK(aanj$7>qIBF|Ge)YAI>Fv zWzR0s!^fy-@di&24I~lf#@?onT;8C?$*=ub`t};*O4vk8^09x3!^)7VTAkD#E>d4y zxP0Py>xEO|V#UV0dd2__vb9>>qq_5>Nt&g(#9D3JYEgQ3@yogkzOZ(Gn;nH#-7CPd z`h_#Uz&pc=BvgcSwAy9-eLh@;IEC=9R{)Xve8ZC*HgC&J8;s#*OLOeeGx=&%fSujv z7i#?cHk-yU!bT!!(UG=X$jOv>u6JiLXz!%Bu7pl_LpJ$Ya(8g&`4up9P1`JX0w1~I z?RRsK`2K4PFpRv?h_3Fv@@Gk95#e;5mM}eeUV~<%ce<);+)c#9qbn(`!+A+M$pyVf z<{NY4=buz>TG&o%mvyoeP+e5U)t;Hjl_gl7vg6}*F1CF+hH|}fsrPYDxV|k1?~y)R zU7rug{LuZqXJ2eOb-`Ovdn$&}AUO(KE3)P98-ne))>FszZ2+B{0ixN_cYl%L6PevT zvTdcpFGfH{v8Vp%Mw*C?JsZL(ZXASdh{vxIA^9<~K=`pYTcXS*Z*=C^>_qK-W*;v5 z68nN!vUEoWK5%|U>iF!eqke|cTE{qjJ^JeAY~Gj@#NIo)C7Vo93r3@edi!-taLiBP z6_9SD|ehEZe~k3t-Re#RGn$9-?9kh)*MNFc$mYN)ok6?`;vxA z04mZ4cWb1iPo8{7SooG&8GDFev$`l|j2D2E9NvBU0y76&-=d)6Q@p4}%V6uzPc3xI z4-Ly(QtD|b(TioHuY0%j2$5fVzm%%SiRt9idKQDG?*-*d+WR*av#XPJ`}q0l!ltYLZ5|N3tH&yZ&f#wH)l&v4hJBEvJ5?WoP8IH z)NAc&>Q!RfA_QoSSY}0C7%O^jSssjS^T(#IK{~GQ@X%&_Rj$kHEyfry8G0mJ^IVVN z02Tf#Er)TlN5lsd2xzONF^freHcug^nVza*jIt=@iWguTr{OdzssXAJqAJEYsaL?| zDAkcP+mh{0W0Vfob~VMF$w@e?^i9#}fP1jy7zI=sqrBlGWe?i^sf$r7gCxUg_ArS) zATsbcwQ2WBO{uwrg<>)*^{x)1U+Ca#*6c4UC&hJ37uTm>*f{)4?(N$VmU6jI`bJ1^ z!1S+xe&GBo02bxeafezjJF+}qohu5wLG-?)#!NT@ah6L=zl2FB0j0DOG{ zLT!r?0G`k^)K2;I84(Q(wavoDVIr-dMP1_fSa1GO+tr^-?vIfWN{goqEhGDF-&29LmF_p@vZ+RP(C&pDtDQfm(kIORi_@?p983{o3)0kt5!P@yHT;T*Q?aW)qGn@&l zPgR-&OTsxDn3v3sj^efB|$WIk`bo-}~xIvY%FK}DNc|7B2zT+6iFp=KI#Tl-vX=SE12ugeJbOHk*?Q z$D2OIqay=V$cOuaRw{o>zM&GU@i2-EfpcLHM}L}U?s7mrv?QO%YkGYK@3%OX3SJ!a zGmW+A^7THkyS9}CDtFk08c~l<5o|jg9jMUJmR4;jsF5;aFEr@-g>vq%slN0Dgd`R3 zN{JA=Klo{vmO#Et&MCyrHwRzYqRWt=8S5M584SDvkSR4ZnDKX=T9US?fnic3QuyDs_O9D|if|83KocSH8< z!`dK_;H{c*qY=;1xNq~5hNSU&i(*&fP5N^#(=@si_gDW8MI?%S>uJ!}&_#scH?ur* zL2AX7eTc1FXg_|C;oJ#%p{J`C(}}aVStD}$AOO}UOV+)V3K5$W(VGtOb0TO<{;EOH zdQj+Z#6M-Be|!g_%*ib;|4dp63F>I~=kaUh&Eqv_WTzX>ZoDag985*)%5z?@B)jPW zqzZ%eEtk+632bldT3IdgHSTq=iDuVSIhs(61(PO!wrEa^EIV5nthRZpE97(5=$J0t zQPP*Nr5Jv^5m2f^t%9y(o{ru(Hl?K^K_aHz8LULzzz#%ZU8d%Sn+@Np^>5TDd0$x*lVKBXU?5Xy0t&=bI<`N)8{!kjZOr|q~4eET4CEz2{i&s4VQo0aONrH z@HX`EQ$k@A0`~MbDWceq>n@zRHl(M+5v+k(w8%swn4=EYAtucB+{Jg(#6CP;U z!jCe(7dB4HR*%3ucOcP)rQJN!*NC$m3p@!>?Gz7Q4UBQ-<{VC(vPm`JkK#M^+i8zV zuMALl4(2=`tCwb-2%e(C$*El~Xjr-(e7xoKo$5Ll`x%|C)@q5=He0r`m_JRsDIY^N z*qD)1)SB%^#?_zti&P*t-`GtMCxkDqgvDjSg|aRAYfVEu;0^B3FCRsaS_;yK`T6cO zKEq5wDNZb%)AGK|9#EaYD*#jFda06WX6HB;#$CzN7h8r|m_iK++tSvcb#aP5Jrn)=0{ZmG!*`xnzrEXTFG7ut17?B25|2kde|3!;~I3vOxZ_A zk4TUJfrSO(RhhsT43o=_%_LO{TU+G}Lo+ke!$Pb(#b~w0_tpu{rb3p|E)##0cVs$@ zj+BsK>1QkRc z%|Kd^ISeUx7}pn01q}q6)Z&QGNRw41X%_iSHqS#Zc(Z&mF9ylJbL37DVc_WUx<|Rd zDfnl;%$*mnqxL>$P13H|7e9ioX=Ja1$WnkX%SGSOfdrR&r?{JOXYWk8r6qm;&eJ#i z$7#1vvlJsf_<`aw9h~l4!&ks;$!RY~=8DJ*SpIVShoI)>E5Lo>Gh|LZbmgu2L66>4 z4hvn>^CZ6F29V?P7~!qv5b0og!Kl$MIHK_3g`1OSYa#)kr)tlbU2UvI{M=W7H25QPS*8B62PxKKBGSt)s*yKv(;EUtIO=b`zat z;`ur-S9G2JU@N-PfMhEan9GeTe?oG1{-js4n?~3X^Z;hyZ#=e4}UA}Ox5o(c8 zlPljwRx{3zmT~ctEEJpnEWRS=p(w)66iR2MmP&d?kf{44d8vDzTiBvO?)R2TqiUy= zxYo46c2RsOVvSQZ*xb~sSm@Y~(I{@Ecki3^UE{P<{pBp>p@LKi@W41D-<+o9fN~d3m)(b>yTuqh?*k+Cr{dYPO9uz`y9b<*dEf-~qhD90k`D>2WOgvVx_mhwHpSGm>yP--ve$XTa026eo*OHsOGWmDC;%2Kvlmc#~lezj2BN zX@mGNBHg-oncq5j-hpf~&)65^&_+Y|4_$+eT>fy)(gAe!B-MAUF7w=|E-MfeQ zV@i9mJW;O?g@yB}N66kD4mao@X-;=XOe%Uf-#;yw)1*0H^HhLZ-*__zcBXvu3@#-Y zC>w6*AU(voCAlwmT1V=fFvilSoXZ(m4&?g7GnVivs!v#-Vc**Q54#6P2(R;(sO}PW z&*^@^_LM!6e$9X>dRU5?2GNNYK}0ce6^0_GnC7f9(;#TXF=mYOIuF+MQ4O`B*lJRb z_l*KQp$?t7VKWiI#N@SO_opzgIa!31&McS|z(D2XEGI&cB_)gmmV^3tV-SJ`ENtLp zl6o1s9D~#w*KwTuCD~9$cEQ$Z8E0a?aD z(0`{`{YuT(siF~9{Q6MWtL4cpj?UIN7<#TZAJ=DtK%?*R)@Ow-Yc{w+2-MEX*@=WplkgDGF(pBlwI)W;foXF=ej3bZ4x#`07O%1SODcK$$v zZ}+%8IKFh_An;onc&S`Z^Elhh6ccG3m8ubH_k!YnEVHs<7cyvpBzENH2mzDRmxk&% zz>ciM{Zknq!F<^m#vz={cm>Pb9~M(PG*5j2kFzcq4wk8g%kff|c20ZJx$dU!+sfr( zs)6&Nrc!cqD*aFT(!{^hP*cLZmo>&@j+}iHk-ZvI35aitsL-`P4d>!(Y{O(u9qC=0 zhBBXX8>cyss7;j_R{KlZ;fbFe_DyHpxHdC>*`o6*x-#daasHlP{ZU^m&1UseCP-W~ zjXgFEE`x#Ic1muruybO+GmW0X^2@m7$J4CooHo&%sqf}piqbrPpel-$85U3+0s2Be z1M)fIlwc>7CzW6)QpBLF2`FU&BTtr}$KmgS1(ZYlnlW8Zkx$D}I6q-z+dmI?mk=K6 zrP5kcKO$C$TPn7TAFz)=G`8;u!s}4h2_?FESE8r`5aGUAR3?g#uk);$ znVnx7*Ha@*>nBskXk^h({7C9qXchXb^up`GpdwVMV0 z49D-Y_X;3SxA*SbYS=rFQayurKG3@+j~-FGlJl1NShxDDlcwfQVX2qydvK=M2$k1H z`PK3mY%sD&+4itk)1!aH@7Vr~;f$DMPTdih)-dxb<<&4(wdK3bVcp(=7CC?q6uA|e z5uhuE<|z?{rhFw_tv|Ot; zZy6Rx)O8Cs5Huu&0Kp|d(BKlhk>J6lgC{`H5ZtAM6I_D3y9IZru>^+^orb#Cb-UsIBC%;uGA97vp2@ z(Bga8un9ukr6LkJ$EWu+SgmfeC+iVpVM2F@vKA0XsJ?M z;JM#KDG;~g7WO?!Nhw{{koZxM{&6O3SFOhF=r}7aLDBfhH^|umJal?mgz1Y`*FEG!@k0IUhiG@~GZ7&oR|2)D+oT*FlIpV=17vkLSGKkIAJ zwkZaCFsK!irTh`Ps?Kz^o2jZEbl#bvTx4eujX?6GsV?JIr_;@JS(enl$*+obSmAN&|^Sz z))YTRE&M8$qp_#4*c5HZWbcFIlTDA%p?v;Q21Eyu?HIvW8b7sb5o%g151y{EV^lfr zU+<+rkLaRX6UN0swvW9ggyk{H(GK*=ZA$bdALc}{3UwQAVjJu`ivDXDV$^DeJ5o!^o7z&xn#t8Q$xeHRhI|jo z1<{=6dEi=2;^sfBY6tI|hMm`}bxK>DO-4za3vdlSrg{D^)GV8kEZ)@H z(P>^K%*{d9c9@bo-0b@cK4 zBgdQ^Y-kQ#Va<5xnqa%FGayoV>^e%aF*ub*d0VYdiY9lqf_*gV7%E!tiw;c}nVZ*R-#4a&eH=wRwkI&;f{ zMnOR7g#ND?MnTsvCD_4s(kla_VeCM!z;cBg`!TC<~l*aE<@CDn!#J^k_eJX zT`Fzv*3u5zSHl&m6qQ<6Me>FiVloGrYsK;10)vGrs3T2ML6_x`q_P=8R^ue@t2E5d zsAq!I>{OD7zi6K?lj3ZJQtO&5cr7Z(xc6Hn#zfV|j#tL8^=e1=N}9NusOrg>yv{=p zn+_=(dodBa>{m$b*82Sk1$u6BIku*Lrm+08q^Ei^wzn1!EWtRmVNJIYDsJ1`j{f&W zumi0u44tRf6gc+U5T0Je6z#~B>0yNed6DXe#S|Z?D=zEJ;9zmK1R)3Wz7?x!Purvu z1&aL5JGHHb%*~h3GMFjSS*Y?Z@7TvgHRohuA7)>w>UANK-i-6(tCMOJkLgZ!!Q?%e zt-?lqp#up}(WB9CDL26T_m14fPU&@-an->3StB5=s*`jH(mZdU z=3CFKHHuh}9HX0f%dh|~!lj_n76US7XrV3D8(<2rugmOb%(XQRPNlT!Z_S^3d;{vb z-fBhpQh}g^2QmAQn1*Ymu%Kb5m=-_^YUe{SR)LVH(A^XAs998@-3omeUqpf+i&WUB z4;{gmvoF^rNa!=H zV`uqt@^d4a^3O0TYn<%g{XR(9u_@nd&16g)Q~jHpaBZKKma>28O-hH7W;&ftEiZ>J zZgh4Fc`(Y-(x2A#8UpGRKKN|$6`_uJuks8r*=s%5R&cZz)yd#xq8 zQcC7XDLfAombdx3^-c$4e{tc=Xb&10D^l{O zM*Zq;vb`}qc02d%R{;)@LqM7~<}51s$V(z?$+Dq{OfdSp%4vg%5tY@v=ABHjYk?tZ z&4Qr*s~wrI7iQr`8a&sFp8(`gj^|3#%t2a(M=; zzgtWbwDET~9PZz>3d>b74n+2z)M z-?W{&SgI(mXvFF13*77gaoIMSY_j<)kjpL$>IzI;nR_=%<}R^}6?l^!GcBp|vFrHs zHqlT{>qBlY-BQK5w(;}145G=R?RwK%^$AFoyM#2`8+4%bqBd&`twzSODVG;lm$_EW zj!=C<{hz}D83-uL$ig&B`6ox=4trm{F(hkIMy>sn>StBWdkGn~7e{-FUq3(_9n&*iMf(IdOzp-a z27JzE!R+m8BJ~~w0+Cw|K>s-}k`j?M?ePHk)ff#%E`Wty&f{Kl8Q^5HZ*Nn$_yVa{ z?JEy~*;$%6V9e?hXp7|2kgV8N@g4=dAm0`%$R4lRjtn@@FHZNo@udvZ4Sf{~@~+XU zkhquO>JlI_+uPLpd~!Z3sW8av2$N<0`Rd&h|LI629jw;4aVw^qs%39xYFgU13x5Na z1-c)s``AHFPfWvWG^1Zz$MJSJ#1gLkbujYP7T^l^UJfdnNOK`k`-`f=7%hq}m?9AU ziahNU{bd!tDRuH4wS-cHq5zHQ^DBlnC*35WUrM&?!mNOT0U~g&a0b(ds?0R>e8(lm z_Y3$GH&KK5@Jq3PhtB5?gW&a@){@XMn?kp6;C-)+{jSww?T3?6JWFMwtSeof(N?8= ze&6DUidlvUJ8`sXnABBqR(b{{Shre4vRiQdlB#an&2O6imvi#F-Xz^|$SpKW<;-YTvrAs>hM6MH)dorK!TT+#Vh8K^Wn#MX9YrL=f$ z#OL&HJsXX2;>MwKCG#Ib(sX`rcg|t(jPr~=f)w&y3CR21eZ`M%@yC!(Q@mR-Wfm8P z>9X1LMtiDO0}Zdf()~pIDmoTrr5c(!`S3G4iTxeB^e=*iYhCiv>3l;XWM zXFtdauf>iRgBXCrB6vwNz=EsORA%X!(c zmVNbHWH(pkdUF1Y%-=$Ju1Z|^4->jA2{FEji^ZGUhZ~D*y7FDbKZ2Z-9B(KdcIVK0 z(1h{F$Ot!M4#dMlK156xsq@jX)`7Lm-yplC*ECXfVlHavF$72ftJ2w^W7;*E)O{7JdegLZ(*cA_|t9m;d)Db5& z4f%$KBjV7b?L5fb&;>>O)j4$tneUe(^!!U6mS$%66}?)1Y{?HS#mt8s$qjS$$(Y72 zRUx8uEt?WFg$0SewNuJp^fj^jZDq=4^9YsHP)VNVl)kSN=@BV#r7oAN!Y3OP?5=$6 zZQ0e@7?y!eDat&rVWs6g-4?ocyx-f{J8R$DT0&7TY9-p2-;@NnGNIXyO`TT8eft>R za{5fdmHbVJuVAc3oUUd-%8pORrmwJ=)`Kgp0Ds9t6xyEFIBu+hPXv<4YESZg3prT-{HWQCNLE ziFn>LmW~uJX@r#!{%ucr!OWtgCDZ=y!eEy2ZbF;8r(1c)l&kJjnZxg_rD2P46))&2 zizxH8A(>{>=k$@M2);?P*udcL`B5d)mBtzA1q&a;^?FgR7|I)HqI5xp5QR`Zinz4G zGwvF%CPK8|A0Uh=eiGF++K~z|_EVKYj(yyMx>UM_Y#H&mN#DrI))OyiCl;kxycWq! zda!J|Yx2V@M}m2~oLMqtq`_t!<<^$Dikli^8#7t4_RN0+%$rKK&FmW(F;b!%!3=^2 zO5%Uqf-XbHoc_Ffi|^pM(Ps2s&KM==nY0a|c4r6Vig(I9Lvn;Ow~axcsLrEdvPxg! z3o|NSeDid2_faJJed$c>lKLCVBu^Z%HN9o3fdizTbx`Hm_}!*MK&$SnFtrn zu{N_?fQV}=;tS8O2w^J@H8~+~OZm<`qM-0yTxVE5pV-aJPwJV#eJiaBv_1@9i3-1e zxa}YO13(wckN*>s#fbx8jr0Er(EfK{qbTcI6taQ%{|B)6@8tiVoBu?pX(5g!p_$d} z*x$KPM~Ai7fw+;dDx%YqC@(2+C_=-#qQ*cTt#3sB?>B@WjmJ|I#A?g9dMB~B{Vek)NY>O8Nj|G! zq%jc<#R%&uPAKDIFOAstAr&-g>gO8iJQqFYz?N4_5aO$*I@v)j`{HJyP75>Y@kh2A(o;J$Ey?dHPHmwy)3c z{Ym!>kM2d?vKB2ya~BgX4pX-l-I+Wzeh|pE6%XVWv8_0SJMoFCeg8+_*A2o;R)!lR zwNw(sCGG(KkJ8c-kGiauT2mwqw#Kf#zF-jf0inJ}ZUc(Z-x>8?JO7D<1dI81EE~9m zPc*F8@`;Jfo36QHW1C-vGUaiW&dcO7WU|ZtCcPiR;L)@wXVy+9b(EM(p329m-b!g& znz!Pg{p7BW82>_Fa#OY8M6wR{`c5fVw-iEAUXH4|sS)a1pJHX4zhXc4z@@T>L*CaUDUau+&jnw< z&q*ucjTKh34rq+>a$iU@4L8d#S__vY%LxZ@sY9xtE-Wve=f%b;egZmX=f9}Unb0^~ z0|f}GfJ*%TPJU2I6KcHxx+=iJ{`dAew;Ut(`|HM#0Tg9Q4-K|_#?81OA`5%9-!Bs9 zf~9m6L{&pJ!_o(PJT+X+w|;8GXV3*xcuYl9!-m6M^LM#|UL(M4%(%G~7Fu8K3wgJU zRYsUAxwsQon#EJwBsAQfv>F(<7JIEuCa?sUjCE#Pj@uS7X z6uuOOdB(9?v`TFy2{(dUU0Sg?rO?=Z%7jQ7STxt#LV(ME%{XKo+` zD%Ae~QumZUWuEktm%i*!rrLYGf7=u#8R;{$DiMz&+8VZ2m9;%nb8p>Fv6EXk4*4l~ zC*P&J%&g)@bpB&A-TY`yR#xXmTP#|doiG)X%nl)ISkd-yBRS=^fTS)5U%4z%#MtJTIm3N;Y7q$?@d>K4(@Ixk~zDfoG2AbB*Yq@z2R z2xC#`d4E|yYPDh3DGPR&CU_Y$^qhy}LL)-Cdh(b^be?LT?hEg5J~_IG&pErtSQf9q zx16RgBnsStwbm*OhV$2?U*#nuCNgR5uvWF4=(%XiCD%Xnd(3>4C9BdbxSD&euzcD{ zDT6YU5l{N^br;2T@iKqdcY#7#p$*gA?W>AH8Ii?0`t_NWSrfi@%~KWqGV5wFicg<9 z*cDoq;;wUL`=CPbX#pN@R*OYg4PRwH+&q~YIZ(YWLPcwLv&+X6p$4#2Td?saX zZd20TWbm@6qJ3Sm!_Gma{CR1O=ZaA#0)@UJ?(%hfm>h|NeBZ|w@n|Wl4)^BCuj>!j z+nbEwHT8w6l)Vb_c(l+SJQXD$X3O(^Yew_Uz_f1(B$EMA359!|^1L%tO674k}* z-nRm!E|y#3CBhW5`3hnaZFd}dB-4p+ITmf!=FkWbidu)W%+H}A$A$amEY*?Q1@+?O z)QbjndHF|NRB|B|3Xo%6Q40$7=hAE*g(PPGCi3ucd2t*M4JDDw0x}GauT#qJt_mx4 zskcc8N9I(E49Ux-Xw51(JLh}Et_*US9G+_z^CaZc7R;zhU=scwXj9#;2f3nI#i z8QL8@RFxz-t)uZSjI6Uhj89xQaFsjFNPWmHSN>eT{Gv*7li-ls!qEUHh|JpI(ypd` zPj9oBvbW-O1Bu$yj89_4UItCw%iWZ~wnc*x_UED@`*_vmglgY1IhIA0q+I#bwp>u( zajL8u?P$EvL9L{!{YxOYbfZE)b-nTSW7Ox%d^#(8(-2=(j(i3I#+f`@6P^Gx0?6uWLm( z?j_J@s~{MVgpZ)?OsPjuSAY>h%R*6zj5X7U46c^0<)xBcLj@u}GtIP3sk6BvCl7yW zyCcyDHHbW)oy-X)@MMc_yU*?d;c@m|4$wPel5QXpz!`uUv+^-1R`268qkP`hFJ2ujR9xV;NE6r#4@B0x>^81)~4YHm&Bb z{z$h{HhtMXN@piL^!?fVkm&a&QJAs6VbtZX%MZQU&K!-z7|ymHy7_I`M(46GI{}V* zw!mk^hk{D!5fs8skc>CCIov*Pim|2q$HuE+Z2baO-&@l_w6=3`MMY4SEvO8W+hEuY7=GFJ`zVu>9un zAjJ|b#i4sHhZKc-0Taw5-xnbEHL-n2gDB;CX`V(_vPe-Cu;qUXa|#0Y*aLD@uWfmhUoHEbdQSi|URfXO*iwfl-m%jUbM`f=G5l-RcS=LVX=M z<}zqf+3k;=WDZlule8Z7!Yirw-FQk~_f?wJoqJ;?`@wqG!2Ys>3QqOFyEn1D{Qgr# zn-=W+UuzB9m)4~MMNgGKLSK3WsY|o@XJ7vb^r`7i5`1E+y(>txVT6qkx4k6CHmG@R z5OGBTsni{!569Pb9Mt)n0bJ%6YBQlsXlT7cMoG`6&^V&fOyW-TJERPwKI+y7)CenC zpI2`d8e8x1=vNQl)F!m49dFHrhF)v=eAp_=kI@w*d#6t7;jeSopXIcmX1~ch?jJO7 z2N`={-A<#=AGT4+4pXlSyPS6RI{frkKtQnTvO@b2)Mr!EJcXLOlcx*{S|`pLQZ^r_}*(nNguWwYvpzE3$1c3CXD0X?wRTtGoqC4=ls z-d`-V31$Ky=ZfL?lhS~f5oQM9;un=qrkzL`dt$Qv!SRA>?h;X|(4NaSEE;+p|4z)7 zbA-}pY4R`7XAIXi0U}+KCg;C`FlJl;>yiEI>HnU%yf_TyX0BC5`^7X+F#iAQVOW|} zwLN6l#r7xiz8arsQD6#gm~CL*fbq|SXE!Rj#HX)~i@I+lMwF?%OgP%B6uVov?m zC{V~g8FNh$D1uhW{Ak>o zOpn{j>v(7#d_le{Y&%*UWaR3@x@Up$6ew2i*|3B*bXbtsjBVLeypGzZBVPbahW?3| z+1NiWMjH9wwP&nvyq|r|Q#|lS7n54@sRnI3yl~CTPsa29Z;r7hr(W0Xd8d!o(L*t1 zJzho|W?*1AouS-CCI-S(Nl#Oc17GJ&`p6;OMKm z5oKIf&7vdJ4j<{YuW9_F5FTv~-O$>(g;B)I{$D;OeB(g@UpzB>Xiu$RF@vW{vWv3| zNObeehm1xJLOA4}x{uRB8=xd@lY2iWz1J{lx^Gb zjBvIk_-*OzNLiTbxz&yGW$?8O_AVyUUn?ZwQ!TE@7W4ehxUONawN0+xysUN8>j+IQ zv<$AP2iA}?*Ir73?xVLael72_0vV7`UrXNID~)-$(oM8psGc>1wbNQX%iTS?7M7Jt zGLB|fwNva+7u*HY8Mp@c5L%|_=tbCc)K=Wxeg!)OKdb->MPK_PHI)pH_m?GR>iKy} znf@8?qWXp6r!$HMZHt(=-+xE^VsJ;x$nCg=l^e8b+uy3S?;wx7CeIXmT&aj=KAp)1 zYf9iH6-bb+N->&k!1W4eA68lC#mM0mqrDlFe#j+>mi~p1(Ge5-*%it@6F#P)kybI* zg#!ksdGD6N*G-MWv=rYxr@I(awg&DzLqnO&+E5CGX)!m|7PYRmBKVmGMW4Ah1%fRV z9yFT9kN6tY8aIg!rp6s_q&R4<@&JRxj5g*&PJSv`-Lox@GIi)o9&9Nlx!8)oSvl1a zTBKlH+aN_>SzA9%sSKh=qW)2A1m*y~5!*N#PedC^03)J+#C8zK?ibwk|nb(-U=4un88(L?NqyB#Lw-A#Fd z>5tT#mK&KF;5H);eJ}DEwoM)02i@tV=UQnZ@2OSAziO<*tvAA;8P9wGqV4j}9UvI} z6*{lay}`f6$~du7K0=q=Rm!t(aqKBS6BH?^EbY|=U|IzYhg`TO~u~ zg;dK!>0HetC~L}P1%pqJr0%-hnmjJnL?#+({>@szR6U?=P{+k1V*7>M9kKdZLqP3f zSUFTl9#c~<(B%=-F2T@BjwGIGvn?8>sBiW@ifzIA%PO;J?jLPGN!_D=64g${7*LB< z*-@Ku3~BtRa7)VvDy6srFXh3B2_4-gq+@xZm-3t>rp~&@K}IC)I?g-^%yqvBCY&}JWpbHG%l&x$$>(&OkD@`0Y_?Nf(nG?0&L>SlZa}2$SmCZ#z z>XpR7eN#p<*I)q!#-q7ejQ2G|x#!Q6b@-Sq!cCHfIE?q;YpZAY5^OgkJ`Of2Xcxt@ zFgy%we(Vz$=xp&Lhz!V;2Yz0ozC(*bV5dHU!g7&B!2!@+LhvbrEs`Z<^K#s1Ufuhd zCVXXe(r%RgX6L?RcPDD5Fm+?ppY}&GxmuF%&C5j$@P{hua-c1{t4^aHP=k?AegiX) z8qjjX-E_#$03JjITuIhTb=^%ZmwQL4cA8(FY&?R3mu=20JxWaq&d7i@Ir!fBwe$U6 zH+uEgV&)E259Z3O!Lyi53PG>=o;x{HF%M_#u`?MSe~U$l8{-~)@pU#8L0azzjf61F z@F`lnX^!Pp`(D}@2=e$elQhun3uzLTIO zVrmcaP8e9y|8}MpTB{N)aN(40p!X0%06ko<@*&*wkf~l3#%!A``(_@I7b=smM6xMJ zS9D3+Ea-)|mMn%0{sdkM;5e`NyCxX_2NJsFV*Ci|k%B{zzRf!i@UTZv!LwEyR`;0OU>t6rYj0+6WrMz}qGYmnuxF0F?XM?m)9GZZ z>#Un*_$>_zSTcKM_|Gv^qzvJjCMdoL)@|@ys;u=RhZm5D7%`;;~9B;=+ zQK?8rLc~tV(S~q>vM7qBl*a>QxrqvxeDImW#wJCI9eXsl`5FD?x4C=XKM~qTG!hUV9O}o=)#>;?(?xY57*FA2vbyULJg@*;+l-pE1MVm7TLxJ+c zc62qS|NiciaC{E+zw7hsv(K^S3M)hH3<}7Go&JjTxX1a(w-RdjJdV3=X{*FEhUIA< z-BQp;yk1D%Wu+LrWrJYtfzRol01(fR_u8gWU*TV}9mM?+3%IVBPx7$T-wD(i(&lZa z^0GjUv8Zo^J_EXp4qk8y65KhD6eLmS_dV4Q!z zyIE)a=i|7mGc+>P(Bq`M@?`8gM#m#4HW|2G4tRQ@IHqGx*6CW#yK^?gBjjsbn~~os zVYtemn@X3;w+~qyBUIFrhgzYjss69K_KVu^);G>8CG*MbBM#k9%LNsFr*|AKt=lLX zp7tHpm)pM?{y0?K_ckDb36jlN!8%(S4Cl#`$U=Z8W|-bPF7`GM)C-z_Ub!S%gv7BL zNlir@74KM|LA%GTXH%5(MdrQxYJX$9Z#*o#ufZ_f-eX~QjF)e_>_zzLWtI*CuQ;#=cc{1R|I2Mx-C*?U&s^Mst-M^qed{NLy=IYj{9R3ByCiw<{`LDs_E*8 z=$!cf`s5b4hWN7o*UNu9W=`+B5YNzhdrG~?N}xemoE5INi$>|@gtBsX10gS7k{F+LJAK%?|DG;GU5Orc09W4= z;;5IlUr{Am9{yp@u8 zFT25rKp6PAOds;9T?u`@O3n~`C_IZp`fz}SJ?y5$xMPs*H^{qsVBWeWW4g;j0}f&_ zd={ilzqn$KZ2x3*psN4TORv?L$BHaZ&kaLViH%<`@xam}60`Jl$tqo#%w_csUT6Wj*gk=e|B@C#=HYS`df7|EKV zXG^KwMYLiGcM(hLs(FS_UAzZ=fD>P?u10+FB@pB2W7_>Ej)puvYf%-l?GZKBbchvt z%hb8*H-d@LQgUWApQw5NE}-@R{m(&Z`Od@ClSdFYbH3|m`8oY_D7Fzo0XbrzC_cp} zSWX)Hx#E=?Ebp7jE^9#zd~U-ALvHIeRJ3XX9}&gpS=nOj9ICit@sHdT(^&0%8v6 za;^=8;Betyb`w(HW4IS@^^yQ`<`=4PJo4to=nUyz`M%;= zl=N3ZZM-O3YL!#723K-!5q^i}UuiES)9{U$-6UcCVk~~!1{}S_R`rMYtp~Rnf}|Ve znxD3hUb1MaLd@r!AVc`OU?Sc*kzqC?)t~<3eB7E3QdO8|rJ3_9q~*ap%hZ)~c|d;| zU)yI7c>A7OV_%4M>jW+*#{CEywXVEBvv~yd0;mHUv)}0U2pG(K*gD`ThTVmq@7-L* zvUA!EA3*{B8ytx1W?)gNS1Sl5>eFa1fS$>iHM&_}cm(~({i}IMwM;o$WKo%5qzNB% z!XZzc#w@0K4=w70P~pNOirEj2Tt4Z=Hjw=chn_8Ur(|nX37sB$L+ET|#HLrNYqv`X zlqQ_K7Z(-Gqo41y4%6Eb>$uf}pEEQ;uQynvo0rekn?B(ci9WMH=r_MJ6iOHyeba4O zKfXXpA6;z@GTlszOX<(q8k>*PaFwPGn3tbve{IPbzeMvqVxh zYvIqf2A`M`{8mfu*`p>E5iN{0o2-L;vOmv*P9OMy=gE6;vY=+xXh;-d0Q(p!t+mnq z7UM9qB#X~;<*aSMDyA8Dg1Wk~%la3(hIKmn06GMp{H-YY=;Q2|Qa~5;H{55OiUfx6 zcaFNh`F8|a1TQ!Uyh~mNUBQQ*IWr<&Q;`CrEoJb-Jt4Fke=YM41&~IqG|%n_cz=yT zlF{{0U*gVyPZo_32Gpm(v4EY;s)3dS;@b7Sl~aGXIr6(U^rnyc)bBq}IZ7~R`T_9y z-pvH*n*w{d2f!zQ{r_*rVm_q~B5}-~_rZ}p=gmB=L~uNU#1(B3o(RhaRk8a2_o-x$ z@YihDC!MoIb3z_LM+zzcvIYK7)|&>TD3TZ2-ErFSfWp>sc5;@x|M{wV1^BH1&dPED zrV$_7N6B7X?$Og)(DgyBJ0lntP!IYFZL6a zmNw2t4nmlemBXO>nc_ktMv0EMUs77eV`|HNJqs}M&ErUE-13l`0a16N%Wc-};mlisCg{Od$EAFE70|u8 zd%cK7$xb@kiJSH1b95>n994kUlIU~C>pObd(@xo3TQ^RV@N{-0mMK1&NC>YjE>^bE zZ?Dl@WE!7H4NLQ^xM7ApNvc`$Lk!a7Dj-*HGPc9?#Ts#8rj8645BSN%1G1J+Z z&X_Pm^3!*Z5@-61Ikfz*5^EeJ@be?vRt-l#Uv^9;%FNxmWq0oPZsuQw!>Ico7^+%JY?Bq;kF$FfQHZFFl_Z@;;*2YVKKF`aeQ zwwh(iH`0g+=$J5~iVJh@&>c*f2qJlEf?)kA;oA4Q^P5i_lRb#ODS6EHao|S1bhDDc z!RV+Rso$Z&&5>Dx^i*kPG%d7p}$e7l@7&WlzqZP>>Mb|7;Ro66~yxW0! zvOMp3z(|Kb@J3wNtUdDdYAk_hN078K-s=r#^;s<_J!ek=-$>F;=CUk9k1F`G;=L{3 z)FlgZb(JYbx^@VVq)tL-63EN>PSaG=05BB>FRQO$e7Or&A@6D7#M)^ zFe83a+dSm(n2(ayQ&>I$o00r!)gQu#W3l)?BTSjfHl}@-&(&I%@^6IccI3xoMPf=Z zwCFJ?Zx0}~!lKH@2j8M7Dg`zV1zm4n-N%393Jp@zn$IENKFN8jdZ*s8gpr_jj=!h*Ls5p`kesf8 z7yNNyIlkTGig3(TI_h|gRd>_X72Dj})t>!{U2*gS=(ktL=?`inxPO`TWbtdX0iJ1H zZ2=%!mV#7x`J7>1b9^rhWn8c?YM7J36INLUCtg&@u4Y6%WUfv($J?`A203^hQL`W^ zfbjx5wy4{(zajwxVpVSd= zn|dYPAG9c`)9Cgo z+Wy?4qMxyiT#Q;q``!oRZ0x4M(wMVL#DR`uGf`hS;#}wEkqJ28hqAUdnO9` zsGSep-W^F8hZS1P$_coqgZV};D{4B=-It$@Q)JYu0)re#``r<<$y>3fzs$YQWZeLw ztS0_*XzH3KU}^=2=83sujX&_WFd+dN-{(TG+O97B*v7476E9=%dd$oPU|FjH-Nk4eo%3`5>~Apl>JgLzUWb{e5H~Yo zr6vUPo$++v04~r72u4Tl`|*#%%&|PvCXUn3!2y0y+}U!tib4GuRiJH=E`Bh%>4yvQ z$P%B-BAT0uhTc=lJ7l0^-hoU?c)Fz#BJfcbQ zIe%so)8)-IVP4T%^_(FTSI(|0U1Z25Flo-QPV}RCJDx@n?mnYX=$LUQk#HbS+Q4KKxDxT^F?^rx*_TnqvZCoxy>BJX z9iN%I6rm_r-4=DM-x-Tnj9S^h6lHa~2bI0~>S1Y~XtL>|ej+zt1 z_d27yTa^dYwo%xf)}QLtB_owzIN!e6%nS5T;KuYTd94t4Wm4$*Z|0YMZa!*#npq)M z(DtFeq(_h?MfhQdfg!Ul>aB`1B{ORebWPRm;l2;xQdf*F;IpC|wwP|ET?wylJeIoY z9S67i=~~!(S2MofK`JS_(`79VE<|?xeiF@HrW17|$f`3Ix~lb;TBAe{Bi@}nmosW^ zy%``ySewJ{X0P!A>Yh${$Ausot;!}1&o{`+3oJet*Am`^V@W&dh(2y7xkI+ zJWz&z4&8kTNk-62mpK^`wJjGr)XxCHj?;2yOswWcRCaNz)LK+Xsrj{yF-)(yUK_9W zxJio!KdtzyGhgB7)8ah1qx*W;Z<&t_LCo~`*!AJF-2C>lp^zMw(Ocu8mdpr&i$lNJ_wb zOjHkvfB`(|EWuiv%39r&ANYlv53+~x;VW?z3(CGME*N*VQP+#;l&u&4Ljti9MJT1K z{(t}-UHHsPn7qOa|6R`R9|9yXI2gJ!3b4f;05&>vo`S#YCxeD*AJzV4U)MACjp%0C zaj_5Qx-2{S0k{;2P_B)l?Wd$igpV6^`wuzVZDKH@h2PI`bdp@djZ{-fxD9_HQ3w#$ zIT5aEe|O5ICG;;5hqoOqhSK*Oz3g7L#fAdIvR3k9hZ~4z9*|IWvB9-+-Bk*b@;CNZ zSaKEbu2pN%Tcunh$KT^UT&i3a_lv&dz^eOtM-}TU?Y?6NAwDZuIWoenyX;r!YQ?jY zK*rBQ7|(2x@(n-02LNpxkLF1we2Ss8Owb;6pO}ZV$XqiFD=~x>TF$!G1Y4BnxTn#e zhnB?JXCNTS$WiDyXc~I33*Dt{=^%p+WCEyf7Jz?uY^8GmQQ?xjsRECnuz>$wTLW4^ zxANgG3P8G92(#0(M^K_D1o%pR<=UIcRq!6!&taUR zeNBoq9{`Kuv^{~0W>VA{)x*2qYHqWM(FC|$P;Y|^#^Dex9f$rMHl_BLW-$YsFj*)#YVRfUe(LQQ#S0Oyr0lI`lcHirz zdChWc_Nu6t_?TR>!4Md2R-t=^LE)6gpVeDZ>Vk%8rO5|b%j~n>{(+&0@5^6SrZ|I% z-BanBn+V5b}3DO z2!a^Fvfni-$*dT?mUtcMj3OKKf@u|6NR51_1f3Uy-kPs92H(#DvG8I1azR`n<6?E4 z(T%a%1Iw41I-?fb7k4xjUjh`1$EuZ_M4C6Q{m$6N`xCP*ha7z1u^N#}I5V@|C!t8j zGuf!J%XBRpntCYDNF)FOt3oHL`q%yT3LkjWczD3Mb(&`hS|ecT8^aho9B9V0yLOiqO65M z7CYhcxIgI4b6-E9?uGRE5T7=~Yx>D5GG>Fu`ro9<(X9+b5g>hPu; zk0+VmM6|!6z8SEZQ;mbjaNrXjj+T{fDS0B5WsL3~j2;M?J5K!&lHoQ{y|%t{&ZOUw zTHqitDtN+ZzY7`Qe2G37X>g(NjZB_=3q~KFF`dssprPD5RY@wH=lRAh^9YkMxx}Ih z>cUKZ0dN2~*FzUkKYX4{iD;G1FXO&Mu6 z#M|U>|9pX;=JLn-kDFyiXs>uv-iwu5!c7W)cPAjOt9O7jJ69$n@u=aADdK>pCZXf* z&B0#iNw*i~^Vj#YJQY`M41ZkxPBg0hocedS8l^wS#6&B5;A@TkaC!^a99n;P1a$)C zEd8yru=&q3VqE%rVJzL>wi`m^HeSDzq86x_M3OFVAcMkG5SU@d3+NTFdOP66bsaubPWAqamoY#LyOww+$s(l{mL5_F z@q)60&kW=d2WjxJPB+w3s&ioa&ko%OR=hz+TXW8)?h^sJ#fn*z{R;lH|KBS>|D&)j zYoR8Mkrb8OE&`Y8b$|n%zc)c!{TcT%y`xJU?N1gV-xgQQF$im}oB6t7wP~V>xMiA(@4ZYIOSkZsg=kYOLxafHrWp8e$)86QnUC7!y!LuL5JGZu}t z>0Dmiq&v=4Oj77hiHV?D0lwB$_6S-Xhr+k0PyG>k$n6?{XqE;Tf_RsW-bWBg8L_pZ z*WZn;IzN*;=HeW9+?gTMw2^Xiw6EXqe14UtZr@w2j<3z6^T|MKV1fHOj;+CPUL&NS zECR?n|BuJFhIapf19?#K)Jz1?J2=pAPleYDA5gzRPc>K86jLfcpLY%dZ3`Ie-tc82 z$bg`lA{Y4r8U|gQfdamm2#30kHFGZjZf7ZtB5_g?Oh7(0{Y(St`wk3eu|3UAsrHP7eHDZldn~L7f>n2a3h!AQRV0v$N}cA?@68TGP$~ z9b*6nZ*(9_KHNtgdIhk)9)>j)mSlcIwrnH6yd%bmv}QAsKqwHUsrI}f&idf7_%$TZ zDPpgH;nYaGV~}-`wFjZ|2zs**L$;SgVLQK#af!xv-qFMLF3g9~N{qG{ z^Xr?Peh;24H7NShBghMo9{%PHFI5;9{e=~al^gVCfx-%3HVX|E=s2POaufmPJ<4p0 z5i%E?3mYY87huE_e0YpO&g{qvzLzvc$HsQTZp$8j>{I8DqikdiBeDX+6svb86Kz7j zHY0=66+|Yct}5q-*KQ;E&Ri<=7nR~HQX?fZDwgv$A3;Jl`=`U;d9)sFm*@pOi{=!G zmrtbCs6c2S@BLIH8KXGR#$u(n|KI}T=TvIbo^(+u)snPZ6oOaT7r2AGA?Es83{lmz+Ip6jo|Ptp_b z$WmcYa$Ycjo0R6nr-?d}t)?(zkyQTTeeAALtNhcaLqL&1t#as}2AcFvDx7eiteIL% zme?BZa;+`{vTJaylbOB|+$I)$BIVkMl*YU$4|vG&;+GxGw_3e_YYueza?f;3*_OfP z38!26)`rkaH(?4>~{J+S; zGl0}1RtJ*(|F}rhkN>zx@P9FzC~u)BOB}^jck2M17Zd_;ooIYf_W&u!9`}!01pgOJ z2~cv)sld&Q`v@9)2}3@N|LYvUd9eRY;=6aLc;&g!PVg%yTe5?Q{JnbJ0G^N(o5>RN zP8t_u&)FQvFtmn@6(QacPxw_)cH!_T-f3kqYp9xV8@Bw!L5CG*BRD-3jE1_1G2gS4YWh&Us6=M>yi_V?E`!jl8Lo0BBwVU# zdzidnr=MPlMx89YS=k|iw%lG-)e>|!L|$tCQi2;BKUflL0H_EjK=6vluKh?L!nhkF zT@@Wfi$}=rW9BQ~^SU)0-SI9{w#4zwJv;p-QfuC@3Qc#1r+EEp7PhMs%r)}}jyw`u zS#5KetxPp%*_hqpyO=$^0uNU#WPI*NDz1tYfM4y; z?EfE}y?H#8Vc$2bD5Oj!dyG(ukdUlX$zBOrvP~rkMfTmaS+Y$CWgA(u4%yc!Ym|M< z)-ZNMW-wzgbM_ov*L~gheZ9~7+|TEI|G>x0oW~q<&hPjw-|ufhcvFFuSpUET-#wP! zqI#o9pE35^=4_6-b2HtIfB;BzYtw*&>O{%IXp!o0PQB<`tisvJTZ=|lZPL9|TwK0w zt4OuPV1Q#EL_zJ%pM`p90JGKD#W6M#l14I~QttYww?~lHSAjc@+FUOLQgrUNZ424B zeZaY}hGJ1XqbVNK_1;uSFN=5^R`9)c{RD{oxJDJ#T_(&`D(8}n)S)`@0lI&9+vH`y{c!kO#dc>OK$o_vv~3CzrH7(1_jI9z zA-Y7;H!|*x%v9O@ __xzc58P%KP~@0KN(+R+vxNQJ83sHCpG8@ozW@4?^>(k_43 z4ED6+8wx+6(J|$F1W-#MiG_~S(uWT4O+0xGiPqgTbCn#LE!LMr9qaIoS^Dm2RuL%W zu*oV~diu=5Cb?w&YW2q2ZNf`fisCUUYFy=B1G6`ZyyV7k9xrU81CK@mE>TGUF6~F# z0hQ6h5SpPp7nv_zoU9!?gDXcpnG!@*xNMXOYOK}tPO%DU0aM@HL&{^Y048Q%4)7G5 zV;Gql+hMphkY3|x=AD*Bmxwp4eyYE;HB+t1=CjjX|V|HKvQ)J_3TpM+ts;QwPUz$psJ0?0f&4q^r ztw6-f`iCj1PeJw-eoK*v+6MG8Ia#A(k99a}@;73}(bojA!3B)(Kkkg9PTPO~kTsZ9 z*;ly#y6hX-Hi0xUp;;5(5-c+8Lb<}4aJc_y^tT?v#K!Vp=wc0^b_3F9X4ZTR$wwk> z9pyh1k7yoy5QVwG6dTI4C0ar3*4U5w_Q3<#PAo7Lr~OU6uiY}LSI&9d^^J^uiQBNI zz_vkenk~uQuv%M<>8GAw@W)WjiBAs@p#yTZ{aSF-=RuDg!r{z;nnPj-x2@hX z54$MxTSFhRs6KC|X$fvzM+bDAFUE1YYkpE(qio8CHe4;BS+yzcmP9%W{V4ljeD(Z| zrDK?;0k%0#N~q||sGvbh#nha2_`?VB+|y=YR+jiOpB0u<=luJ*oUyBzkDBxq25yZt z@12QT#*{Xr`Bn)+4K{DB(WB$^>BHJgP~k%4f3YDYI7om)7uMgups+7U+?nb?WgmL$R7Y=6%Uv*p z*+<55p=BTYI{O}OyN7M}L7pqR&LB%_$){C`^`eYady(2rnKy)#XsedxxvcV#P}KV; zt}~b0pFPv*Gw0^7bFcsTyO?h{CIw^ME&lBKfIji$Afn zc@18Y@j-b`+5tyj_#sTJMhbGl3{(LZ&TXXuq|Ca06a3O?lk`an)^ET?tuW{QucpUA zhFH=BiCq)Wh^VqG4uCwZKy; zkUen+G>7=xAmV@exf6F9xSVa7XpVCifD=J=&k6nM( zCeR*^2+?5*Hl4%m_f$R|x7Ruj`b2-odXZ9i+#UPT;MKy4$p?5uz0ty_$Tc6eTfTVBz4l0HP;!|NNX#!$MRcKM;! zPQy}2J>JCm$?NzOyWLSGlCcfI>x)mIzAM`s(gQI>8*GP_YXx0yL}%L+zVXbtCwQM; z{nybqjPDB!V+1jIrJ1hnHCpGRA&&k*S}25X7oS0PA9;rOyejH2`mX#%IQmG;nk_nC zHqFk9cYD?za4;rG}91_+vu{EeD@=P(xGMzI<)h6A>oVqWS1|YwM3&(%b|__8&^gXI-~q^!EpBcJ2x!8PH_? zyEtH7|r>aN4F@vHmrD%}#3fh2Biv=Y-(!e%g@&lvAMW z;JzoFk1Z#6>3QhBi1o&fSzE3>$(58MN~3hlp^MfTyK?|iXk55j0kW%yr)Qrn*Jll7 z$@&v3bqEBZwXPJ9)E-nb3LK2m6`5 zb4prIjQ3xQuhLe2pi|m0=ez{xCLZ(kX{p{#ojXwdCe@+d8=fw;h;q@?E5%KgVbA0MGC28olN*YW;oh4QT?jds= zjI!w}s{3-}#ygRy7lRS+H5|`OHN5WSVWg)BxO_$|S2%2%K-@$>ES!<{laE4K71)n} z%hRQP`f^j=X|VX30=?af@wyY)hU0&_T6{0&>;b~W+i>0=KZCuWc!`HD4suiIx?);d ze5QQN<4yLAq~h5+a$>&Uv!;jSiNK=C>GH!EEce!r=r%vEx!M$U70G_JYHD1qT%dBC z;^pI$+Ie_Z#6WHDODX}*bXViTqeOGWs|1kh=?MBIa*yZ?3vD?Xp1VZ5k@`Iv9lau;m^5kGAZ{)cI?pN%uYBT3|96Hq<{M|TQ0d=$s?frGed0rOE&xU>U-dU>$E0+D*78b5&{2abUc2>CZIW-A4sH%0h905bs z?Zn+EHXS6aO9$VYEtuUdHiL+!j%PBT;DvDy9vib*dmC(pQ=#hR#IU8`ozo>;P4p2t z0AjLHn8ss^2-0>*;B1i}4%Q^Dr&z%u+T1PO;QBUKnfv*izl+#PWtmcYkQZ*)!Z92% zu7lXSkPj(2S@IN9`4zs?T)f!$+9BP^+>7$xV=jxmzz`H;XS!95Y0+5A4(~Eedxt|E z3Z>URar0*IovdBN)~;D-cwNeTTx-wqjRFtV5E-T4bXAA2+(nm|=U!`Zor^8+WGS2W z+?Mz`>geUhol{ZGd-43U){v=*%uoE{gHNPIO3On>M&wQ&{dC>v=b;VR7~Aum!osET zFTxt^)$0mSXAmT~{|c@=tl?ggS}~WD5$$WSB7M>DWv8?f=ByqU&%}g;k0tQKIZ&;* z&F{BBr~qWG&HN@QiQxK*eq;t;ZeU+H>12ZY;GytLt0Miyoe%rIz;96|(c`=zSBP^I zxBdf3_pT8Z{WvOcOzjoK%llW{6W^oOB0-dKXPsu; zUg>^{`xPMzDc^B{5VVJXmUu6~%aE0He&u%m;DVXv2_F%Q z%0ine_ISb1{GEOfmrxA2vIhLFvecxGJ}Ctgf;e`6#N~Izl+5G6v6Dq_@y)OEpHSbz zZ=EBOz7vXi^3R)hWlxu{gkRad{1!9Nc*r+|E&JI}#=KPeqE=vei7(2!l&nKNFb4%^ zKGY4@`w>}N_S|q5X|Sa7P~}pzL!K3E%Br0U@k{;ZUVJ=l)KoHcH+A@2jSDg}f`mpp zF8J1cz4IbPe6IuDw6$UwYn|-2;I00vv`GZ@4PAm7&BpAqV^abRKBDeT6_-0%KHbW; z4~dEv?O3(=#7|`*R5hHQ#&h{*>DDK;6v>E%G~_?k>We1nWF3{GQ5CcxXc zMlDC>VgYtbN(G?ZD>KCQu#4qni=Xq6wu(36$3J;`E_L}GtjuGR_#La}+y{aKy{> z%Vil6#>JX!;iI$)*lwfiA13Aw07lvvax=&Oys_;h1>k|1qqNFDOlqJu4F><45g8t6 z3DU3p@enH-l1Uo*_!C=rV_X0K`bu=MW@(V6L!FT=FF+{6+ORu|;Ji%xg0sE^kZ4W9 zD18$^AS5*u*)zyV=+(-g`alE;N4u^ejp|kZ*Us+xdu>O8T02J-+s02$Za1mlSgJOr z&lU?ENBGUZGI)R{-iBkKq0llhj- zR>jZay&jls=uqrBg;NSA$?Z&Egbw)g>3eT~_!^l{y}i$xOmYqF?Ch%`1Q3o&y zsji8&nyUmyA9zS6}er(hR0m)h4Z6i`ij)QZqrh{w>dn}#u zsN*tU3ry2o#-gy|x^?zy%)eiWrfCKOm3&1V0nra_$dOZ85u1xSC_Jdps7ppf3w(h$ z4pvYRtLyNgp#V$mrk;-p!E?&R%a$?c}ensjNBW(wHl=%-6 zupxWK4aD|e5|}psZ1Yhw@)dIPDGq+|qx>;`ptE2jjOtA!!1sLqFpXD6pGmXIEI5-t zmj3;Pt=1>{BOd>d;ZJ=Hy`tukJ`-~Fj$#Op@kZ|k!)a z7wdk~RmrOQufBR$3p9Sely_)H zcK?w9{qOx@L-*pI$;aA$Eum$7O|FXev-2U`WMBI&`gk&^PVB4j2W*O(AV3T`dJFU< zA_C3xCVqCPifXc?q}w09aysl#_TgV)5lx)u2gwFLjAd&XjG)^U2Q zVzDYxuq``cQKRT;rF|2aGI_fuqm?GLFJ_1a_3B&FL}YNeq7k6s5o0 zwGFAcASMytMmur)adX~7I3l1-wjP+hM@4fSqhAWB^sPW_xKVMGZC>aN_nIQ14|vrb z<3N{BB6r2jU1X;(m*Tk5h3v`-A2ce2bK@Gy2Y4k$YO&!R&{+fs2}a-HciBtgYH{KC zjZ?HRs38{|!kaARUr`Pi+SVw72nKx-N9#x5LcItw@vqZhfr}r-`d}Z0fz(Mb8#*me zNVy6}j*4vI;CK!jxq>M6*p@@J#`5m9aqXfk`}@DM)2%9IFMS5Giqg{YfbX7uiSmC8 z^r|rT?2vi9x<7os297kee?qG)+*9{xa02U_oC((of&RhJiL+mp#Ef>$)d_E!o@RdJ zwEAGFcF-y#h}idJcI;5ZT!TEPHJ42`^V_rHJ9e$`4L1;Di~?%=FM{se)}Z+pQg;KG zEFc&%LjrXCDbH~13lDrQ1e(m;lm!vTBWOeqxw_ZT7-PO}rwlBw);&~n9w=qmvj&s| zwGefb{uG=rx4|!i&=?gb4_WyITmp|gTwD)M=s-2EBDQ26{3@||80Ui6L7aG-3KRQ?R z|L0x%d#@`?2`SMf(Hx*4q_UUshsg;sbBAUH1(l%I_sqf0ILe`%8IaY0VU(b0HenFh z(LeQ&M?a^2M-I)Qg(`fqG(cTiNW|}OwknTmICK8)p`RtrUu=Op{JL5@ac>p%P_CzM zC)o8vs$}ZoV`zKXM%tApHE1g8bO5n-7PB8USH6P!ZG&3+io6}M6EH1HPgFOAYJo$t z)Q0^O;#+CD(E9+>EbA1Vzv>v}WT0Wp$PllIB#eKzt6wu}V{R++5o(Ejfseg2*b3)b zN6d~Nv5CbkCMIFNy~Y-kZ~;#JwE?ormhFWRpD!ky?VQ4hIFG`QDb%wxj);$(Uz-zQ z7e`9P|9rlW_2+0&;Q5AH9O+DoTYy?M7w$uyo<;dd{pp98dk2t=9MoJImJyUkDZ;$M zZ`|6#>^c8o%CfB^4SFON&9#2jRyiJM(O5g!aLmucUM+F6u$?8gYJ{nV^fqCecM;8CQDYkRCJIejW2kghc^?9PX zSTLI??k|zkbcFx^9Z1S*MHs&0>^*=$$}E zk6ITDD055ZeMU7)&#dnJ`78cMsoMsIa1P2-oR@?FttE&JW0^0v}IuHsvf zoAcQy{0Cr{CrRe5YgX1|#h4F%4i91{c@7ZFS?=ro?ihIIH0XN8bLDjYs&di98iy{f zMjpTH%`5+QU!1e2w}|Il)JT}(0{$31pupGAI&@%sV8Ge$-d)qVBdNbdV%UVj7Hy8Z z8T>jU=W6#Eh@({terx{#?ysrL`uq7%eH{AW3|$7+FnI$(vmS3p%n9WM1C!fk0&9P2 zhuGj8#7O|BuaMO&V##@R!5@gfXcJ(dGI#*U@*L=v5JS!v*_vnx{Zcez;vsyX!2#lx zshqg=&+Gmk|L?`9K9!aY6gi)|)wa3-Tm+scPcvz#f(jl|`?OZ5?iaD`d~5vI3IyrR zcc84m-N}fUQ!^mT-yt7-LW#bb`rzRwY0OK`u$k|BO83ZqP230 zCz9t?NJEn*wJS}$m?tZhQ|;~<5u4J&Cfwh4N3$)OXeV|f=2Z+7jI?e8u>F5)vhqJY z_IHTU-^ML`6~;#T&86VC*30I8JuMy%4lU4`@jRG~YNQo*uN$;*KEK~s;MuY+-v3kR zDN2s|0m-OWy2>YxU#FY@fb&o~Arbo3auW6J+?Zu;_~kj^QY6L+`!m7jf}97N)M-n; zc2`yGU%wy5zAJd^7ooAX8UTYT!3{o0KRbTr-8h)r=OsAIXLhoU_jb*yAq#``mb3qf zojE(R!0>g26gGv%OXFSr-kSSaj8+d=WuhCmok#S?g*|+H98v=V!3aP}JcKg=j-mhW zrh|qj;T#J260u^@fs^H>O!p^hOW?B|^fz+Ad=OAe(zb5Xy`et8&J27U3Sm@MW*2p7 z82>&L$Em|yUHokHRhofV$-8%U`CGYVWcjbV7ItpfyWhUd+L!ZBAV^GZ)*6+2*B)1O zEoVELj}CBh=SUrbcPt=iYxf)x2e%$y@ZunTul{`^{4K=9wL5B)OA~9cbkXR|vMh(q zCIpVqIp)yKIrqi4&k>F-q@SW?5!MAAx9dzp(d?x)hSCEZJ|DhF)O*sONfpxMKCUG5 zLcko9)V@0fZ0Hq4Pbn8cHri|KhKh9Q z@qOFp&;N)*s1I{CDwciDG5Q?<`4)BSv_dM$ zt{`{<<(*?)rMt<0m~xLEL+`D-QcBzxXCGd>Chd7nNR?ma8s^(M$ZKg_=Zhh`rN-U@ zZpaGmeYZ+vmxT$+ts^4CggGmtjb)E4w{nK+z6MPuMlQDLR)$7s_%bk+_7$|e<03~V z@I|p~9&az7XPt>M9|;uBipa}dR`E_c8fj2k`8jegk$m2Hhe?v+){CE9j+{3W@mhq3 z=U6|N)Ul3ORP!OIqS$FpMAL?yhO+Q15Shlo>u`&|YJ_mGWslmR{TH!mOUo6dLFUfpn0RGy0QAsk;Z@zviQ)v5}J{QmsZp`wE) z7_*)5mRQ;-+SlVcEqW$j2Ci9NQ||cX_{E0nrTiVnLC#Ama#p5U0@z>jAv#CUd;($Z z@EuwceL61%6D6N@uC9@PebFk9_||#stdKJzf51xgmt>~K1M)mNVhd0ZT7)$H6=JXP zQruL<&##Lj@kFG)qd%N#`1N4v#2eJ-sZ{^+b9TGQWK5*Qo&g~geGjh?a4#gDvBQq| z2u}!-Ae3@7Tc+w?INmt~%QR23y%4qP-JhB#SiXoEn|tbd6lPeCW(eBiJfKY1kC5ps zV6Z#zWEi6!xMh}9_R#xp{a@J@!)DUG?ERxa)M5^4?v647@}Sqw%jX}CcH=%*)59p3 z-EBagj}CMxV~-bEXAh`5p$=(yGYS?>Ye|$$s-8U}`31wdPr>=VeWv3`;Q*glRPZ6z zEvytHs}o22kn32h%tMyAl`=VseUZSB8u}uom3q0>CLOtV#h|*y@(JQsJsxDaWx*Kl z%}eP*)qAonNLa20r3SS}#1L&^dzxJu{TbKTCks{Is(0<9M+b>b@41%wB6WdpkZx9n zrhA%MRIdx%59YGVIgwX<+Fj_BH3k3^XZ}KwSS84G#9WN*4C!G(CVh|LypB;Lnwyah z=xvSy)M(dVOHsf6?>X`>7#Q3fYXQ)Cf1g(TMZ-ha89q=0FnIk>ZMzXOfoM@=tA>4; zc}--?w!pP}R=p~>7HcKhn3sE;mr=})c{-$+ga^bb-D#NUHYZ*l_9aeg5g%G7H$uN} z=h9`#ma@j>7F((Ol`6qZ#^yb5vkQ$W(XM&pahj`5L+Mv%fp4Bp-&1riA3rnXuiL`J zV1jQC2dU05RD>k1mX%gBX}KQKzPxoZnKrU#R#!`=<`wC9S1Bb9bh_BwarEcJm>EnvD+ucYGyxua&1R^>YmO&GO84+>}w&SrBt5WU&{sDqmf> zLqdjl!MInD4xf=SQx_a+?{8d3D3Wplp4|r;v1}>^{jvgvs+2Y;W9a~Fnb#5IG zo2@Lq;vSVa_eYKHJ{V5AY=GPOZIwqm^A9!<JMw?DUlN?djNI zyPjv<;U__2D_O8@z*qBDWo=BqOS0pQfVPzJY#t z<98L&6l@XqvjX)4em_&rJ@)4dsBu!GD7-VW5ZY&9dzpMfn1|H;yUO1|0+t@)AQr|5y{_}~ngf1MLLQ1qVvWaZ= z>F(IW`&@E+8>KrbOBvHaL4`w#`$ugs5UCxRt*l5IE)s{1`7Z>n^= z9jRksZHD7C(2FBDBZ! zC$YByqi+MvNF`W;A>Y`Uc&A>z3RAz-wHU-Ngc)V-*~Os3(cU8+SFMA~2(&F%p}Wfh zFWBwh(55Bw;t2OEdGj@|w}rEV!yt1u0Q zjH|y9pIEeRsQCpA;wSq_+?f z(;R*HV+g!y;+j9h)0?8RVA)U38#D}R1khgCJ^e&S)>Ssv8L0Z@zEqYu`CQE8_`_7P z%`@6v5a=Q{jLxG-l0b(>6vKD|FGRN5o~j=fG)am&hoSpYU`IzCsu)MR? z9s(4x(;vV6g&Sfy7omC`5Dc0l_mokcG9Yj%8AL5Ts)hYeFujHlUx#RF7G|q+8IE{U7TG0Xu0As>j2qz(~XrZvZ1= z^cT0I?i&g^;MJF1;Nm`7uv`&47aw?s7O!yg#4q6p-Jkbkw`z68CLbjPO9dKe9cqGW zUH!s*;~i|#w&ro0SI{k>r;5R_N17Fa3$e5xL9&vi^@C{7fq-N%=|CKR-;k1O6rqtP zJVUAd+x_(4oM2S|NfK?T^jQSwY3jUlTM;L zkGSdm>vaG<{I@m!A1^$cwc-XJ$@N40+x2lK1lMD9y+Ord2c3opvxe%67sqvDGYhe5 zi_FX;O(B`7&tfC%9{7GxZ&jRuA1_w?)O4mPKgTgCNmwt`VlHMX`&w644WC-Xw)?p& z#ZD%RW^%80gnEHt4yh$eLC*n7@Nx{*o*FDkzxClzTjtS@I>)%Ol6W!h4({MHHL zMKzcWErEQdyU!_UJ5ku%Qo;E$;al(J9r?DP`&p`;Sw9;}Y_(r-$a_gV?o`}_tsVKp z1P8Sv9!WdJLCPOd-;TFHH9%-GA_&+6tPj0!rzF?Qn)iSg(cR9JeUf<9pkevsTcNuh zf+*g54E>R4`-UsuRnJY;kyFPc`sXI>vr(Dp;_6u z2UVK~4dnLL*OxKH4$$y@lU9{8!yxfOJNVVf-`LEGr!u431H}qNwpQ`=C>l^OtyDPAOS_!Jl1ur7n4U~cQ2Tm$v^a%X%btJoP*AzIxmso3_m@3VNr=8p#$VD9Rp6^J4{zYQ(mSo z_Wy+SZ>*1PLswL=j6gJl#r)G00IA>Me=BV$uHL4>&g8ZC$}!#{=9EgnS`EnEW7r(2 z|D6J;rRx;JUQ5j)SI>f8z_0EM%4El#wXd%^-~U!{ep34)+lso>YQc_d3uiugfnI+A z?pROUaw<5dTo`+|lGiRHX}aniYG}phJ4791959KWPCX2opNJzLRj~po;9m9-7Vj(0 zmYa08d}7R5uzfaf<4gtsdg@y+TS5bXpgV_XZJXmuYd zKg*VOGjq8~c*r$w{kC86)9m;Amrf*H)7Jj=LAY`yk$0pnq$a(cAQ;XrqQ@0#LW^jo zrFcrK9Vo7a&Z^<|R$qg}mwc5A`pf(CFRgj7Qg81i@5Ny1z@vprYKzHa!!egu&FMAm z_2|K=HCCZ_Fk&*bU}KRioGO$VzK)u0pJlYrqXSb&QjpG515haiWcGBBeE>klmEgbO zbIx=47sw4&CnRMF)U?V;StHt`$nX}2dhmb0V`C4seFx7FMO_pGA?1RpjJAVb^6UyaG|7M%~sS%)9H7kT5`_WUF7!XT{^ z-!~(jSyz*e%7Mr~f|&rM2B{p!$8x^lHeUB8(8r}E5$%%Hj5XE{fD~x;*XjY zUxX!M@5@pM%!5wtXsqbmf3o2YTXaiSxal;2=m)upYvd#QVV<>5n7` zAfOK2`vq=nHJXukV}Kq+f+lWNg%ZEqHuN~@6lYMW;eL>Pq0!Z7pn_rOKurkA!6&6* z9)~=fNOj<6<^Mu2L_o)ooWP-A)dxVK?q8r#@_y>PXID=6ZM2jQ2G!g~1LyBL6%Wy3 z&@>AiCvGWy0+0vCMn9sOr2rPX&k;#u2Rq=>p^K*fMGiUtB8Rbm)7ddY7!Si@nGRrp z|Hoy{{R2|{KP{sWq_+*~W_nRG59li3`wwshai)$A{X8-Zxn&3(iuG_}A8zIZX`8|H z7tTe4zD*gvCM|$Lc>AAw`R5}4+g8c~?Pd)RtTYMNmiGq=@}vcw!OP5F+n*Y>wV2~i zBVogEOUyZ_X>ruw)=&|&0O+}jIkX?xq1J)j?E0{gB)b?IP*b8dy^LTS^gLl%EXRCs zizuza#fforbw2jAO(aS*p7>magpe%tE$MQbkB;G2?OH@by-sjKZpqsAYd}IQJ!rzL zA?2VRUsQxZxwo@lI3QDAHl?W(+w;lgKl4i4bCW&1a+Bj)+oXNN*7nUB9`&^{?kDtB z@>J-}_#|A{-4Tfjn%Ago$%|}~RbaoU@o~N`)P%|wbCo(~%BOE7dU9ZLYkk}t()-Jt zjiW3(X{sR4VOgh0?uM`Lh>QZ8*Tn!%>jPJ zfy_BA9*5ulXmXj0)i3=~qJ5RBIPp3%ilTGoTpsrW+`psz$nuPi7Ad43$c5`8auC*v z+ZJEQ-miFhcfld@SZm08`fMroBB`mCEOB)}bYM$LU4LYl9|IrzTFpa@TYB7fwafpY zu#?=-?g)YH_tWf`p0E=UMnhZo{390E8dzs^FPOLZU%lrm{Wwa8pasxRr3ej~)@bo^ zr&A|*?5LN0nIUG2ai3OvxWMt8CiA)RG)KrD!>oRMb)YI5^o1ekf}+tM1$~!vZ~6V;-3pYXI`MyF2*Tu zX;9{yxM_w>_X7y^xwSQRH4|dTIZ#y$3&!Pb#mLzsXZB{Qqt1f@_tl*E&bL{rM!1MG zfL4o|C2tib3hOI9)H%kpiY~yFui_Sa@DStB&Py^6VqE49+#$gRV`J;$*_+_R|9zpEY%dZ{0O)N&12n{fE=(iYec z2Qt=}_KM)_%1V2%Xi_WE8U0r0mmch@twKT?+U9Oyx*QqbW>)82ZJ$kZ|J5UvqP^)N zZUE+boYdA<=hWT3198zJXS#!bj5{Yk!rU+Ld&sW#?wJ11SyuQts>bAq;n%7CPpwSr z$S&n|dIH)TO3Yzz8QZ&@ukacP{WRiCZVKT*B1nO>19R0Vd@*Lk%@;(*OmB&E=4Erx zY^0>&POYJ6rS3rc^02wa!w+8;qeklkRjQ+d;f_tlqKRm?@tV$Udf{T>3@Ss#v6Vc zfmo#xH-Yiye&HfqdNzUQe>Ft4(7H_eu_A2ff7GGA>J=Rkf z)i*7bMsJUe-}LeVq|@#Cvek@-$&_W2+i&KFQc`1BXAL6|Wr6C9H0Lw2*sq!~`MhL! z$7MJ=$7cjXCc+pV$a$ocZ--4vYp_V&P~NxWmqdZ7K0kX>60*j)JFgTP(kNk2Eq3FC zF-G-?*Zr-PW`yBiA&C@!(HBICn6pM#OaE$0hk z=dB>hXVt(4W{PM-3H~emxZ0D6^*D-j>c;2>pO`R&M0PsYlkltC``1uMSJox2-7CNH z3cvUyp0-cl_xqEG7~#Ft_Db@{iE|$v?{N-HRiVgjh&`nl(It1@GLL`tyfaJY3}Z3wTU#kLLa4Ca->x1`l3 z;WFHzSkGkB(0mxOs@SvFO`O z#q57El)U56J`Q~(yS9^->#q221w0bHq`rUghv zPLmP+iVA5e6MBPBi_VK}tQGf(axM;G+}#ap3%wEujouS2$*0@1d^TD5V$`O;EoP!O zzpzk?owgFHbPlW+s-dXQ>uai#fRnhXS^KCraoz*MmPmyRE5MICnyEZ(qfC~ikOamj ztrOq9in`Q4s4V2x?Tx80++Aa40KX&I+=mp_TuhLDBpqPpTG8@=`&jQe@r}vKijt2W`n0u$4m+HuPf#(Rv z<4j-ntdYA+*asy)#9VkCcw{8yKdT{H?TOdoLmz|N;W7R4F zHU0tZq5_U|?7l%vDJ~$&w^Re=KXo(qnm>TCB_}|Kk>M4IWXfZyt0%dUO}!~i+`c3l z=kCUu=M0J(KBAuMD&@lIk(Q^p40zlPY=qgLbc)q zeeJyFF1BZ&+jEMS2B=Q$rjj1@=|{*5uCyWribtbp`8D&r(|EBh?orJ>tp*-)8$6VY z?c-IYjto9PGD;0~IZ>4jhYzZTvRH>4~! zx(%pr$cO7uz5t7UGo8m=d~5h)!_AEmZ~T_XuniwG2+pxw@H3aiQ~U<88%*^d;m9> zOpAva<{(qFi9;CySH4YuP63^-y171>R6{R%@U1X(+No_kX zs@TbZz0v2(8fS+fLF<)qfw763&m^W6^l!<%c=i0MNR)6R@ow9-JcQ=u>dPAxjW_#2 z2l6F6uh&GkZTo=L%?mne8~wxT5?$ElW*TQpauI`!Pz%E4*(rpW9ULi(m0KPchDlO4i9@lQ=QXt>1o8kl!!Hl~uZP-_w+W%9*yUdr8+x)t!H^<$!c911!j-}2Ohn9ZFA|#MaYsn(`sWV#A=^N+F5wd| zt&WK5ViocArGcHUzX5l$N};sf^VIwKYPPraA*ucCxNX8S+=RK_tBScVVTEvyZ}2pC z9GjYmr_F_xm+- zt)hH$>n75j%pJyHSrchEs!3r`acS!Q&?!zK52*1H_wtGoXVB%X4g-L0x*9hOLn4z? zPUgq0Cl%j)@Z-Ftl*e3pa_gjdT})+zKwO>Nr(|yjd4i$fEW zzKh#89U#yNpy1*e*PUGqkTyJB>NV}VOA_)}#dp7pJkGvZr~RMXyLBwu=D=6?W{^AJ z5FpmKkaU;Y6@v9?yOMOFTS^xZGtRzNP%t&e^g8;t;74ihtqV8)B zp(wq33|>%No(1s}n{k@}&_UssaI|52N~gEfO6+etAo?SuJUYV~g%1PEtX53?1lr~o zwLj8oQd|6*Hap8hH(OP5`Akgg^i%k)h5;GZg@89dZpqm2?W-0OGzyX$Xo7>9j7(6I zf$FL|Yv#otVtMEwZ+q{~(GnD~0=3HxzOnKodK^)9cTEWjb$&|&rcG3+m*E}xhv`}g zj_M9hx(%QLY{2R7>-Ml~5(^aW$UAiQggLKf#ZCY<6A%&;w*VmlRK!Pt1;aKh7qE>6 z@ICNxMzLi}#rI9W-sSI!OR3iYsaqkH1k^epb?|5ap^>T@42j?~1|xPU>qvf$(_g2% z)y5oGKNG9j0xMQd2`N=?36X8BNF8651VR?+;=j&qo=G>q*mAPt{M;X=@7mBS@>WTN zd%nr_9{JZMLjS&l6?_i}?PwOn1L|X+pw>G8me$DCfjWF%v0r*2{&RKq2RG|<&C_oK24v5nT1d{+$TZB@vCd-& zq;~$-rngYd<77lJnnC+Jb!=4S64t(WxexDXE@wU7b@8)=*z&5gW~w*65JTkp{dD#I zPuj%4?P#<`Dc(s~2+-i(JKH>E`g__37p~l59U48iXBJCEz&N3Y_)h0clA-Y7J`}MT z#^9+O3rWqL>ao6Y!noA;*Sc{jX?SfR!fwx|&aWm`>7dbesJdG`%{&6tJVDke#xQ7z zS)}GsA^lPoVK#MQn;O6GA0|!>IrZ1w)duzPo!?QtO3G1-jJRipBZXY&v^>t-5<0i^ z!;oebe3nuUVrAC9{jx%;31}+>XeiO%)X`f*Uuk5l3Ix5|_9+*?)ORXQ@8q;(Om;E> zG*L{$n7`RzrAy;Z_yZxrzxvxs`akz!u6EZO&)syYwy!8|r2mRp?YWn?QQvj8x8PT8 zda6nF+Vy>z6@#KYNr}thzYWi5uP>kiBydI(F|h0E*;(Bl>DI9cXaJdo)c$KX@et4Y zo4v}Uf873&ju()qGmca7Q6Gh7kGc7V+E{+FLUWI-Wd~(#Y_t>(LlZrZM zqo+6JD;dPL0vjnyaBLk{uoEMoxoPDlF2Vm~Q_LO*?7|nGOa@l5b&V;M^tHf(dJz^KKWl->!YLi}4eyLaFQ?Uu^N0{+?9R zzqM>laj3jzI2(Zlnb7Dk#1bnwwbPQQ5U+;wRkiJ9lG|lKryb#%0h?fP!tB5RLyHxq zMH41mg?*{bP!Id`t7BJ=Tf6jZ#(x!S3~;53YMcb_wr~o7LGz&#v<9gen!TQAzruVh zoBe&K4=kSQ=X4Gcejjhmm$I0+k4YL7Z4jJQY#yU)5BwHq$-YGTc4g&CLhlyVkCiE% zl92z{(k$ls-JAyFweId|{MeM!6%<*=fJk{kiNfldn!)T1Cs+=%AXCN9!OYBbECm*Fo#GnX9- z>`98OUHo61eRot--L@|Zil~4zL0VK01Ox=6m#Bz{2na|oQB;aZFVZ6-AYHnE5&>ya zq5{$rAas=8dkDRUnuH|ZTYl%9`_8@hy*tKxe>fau@4eXUti9HpzcOd00C+PCU!;4r ze98>BdzqLOGj5h{SRT#$SW=dGeWT|9P;R?hK(XzZP3Utxt9C3+d@fRut!3x)xYCh{ z>X9=1SL0ta&cIJ%oFsCj6mi;1^$U+`LfxxbJ#xx#ZAurC!X-9Z)D}bsg#0fD(UUbG z!g^ED`Z59&pgCyNK?W;bg3}z7w3A3QF#`&qIHJ%rh(nMf&}3gLy_8$^(4> z5f6hit?}^XyQl=D1e|3}9eW<7KNQ5~Q`?*=J?t!g1MgxdK3|;5sViV0pLug3)^CXm zSycGK@SBz;v3ugcrOtkEl8`X1D77nUo=S7XiXocF<2h#s2r?K$N5)d|xwgxf-kE=( z;#)ncMus^Sq2+eugsvIV7Be+Ww0d4o(4QC4C`mjg4mKAwiBAt7Le&~B`itfzde75~ z{+~yR|J#u@Nh~=|4tAmJ2=EUb3eZ2jQjq4Vjva7Y7*Uv>ikhb;uL+mHDS5(iFPg?Y+XYA6PgKiv&Z#j#isPk zu>tDaJ$Fa;Gd}6=EIrg(y7;5z@(Heob;sZC@mI`PXMB7aE6O&XJT`%dMjZ#Y1?F3W zA|M_jp;&jq8EOdbFB+O9ph*_{4Y+O{AAc%b7It(5`A5eZ1bF>=7QxejgE=uL7Pso5 zges%$|F4(ww4%?euoe1fn*R7POztX*G82eU>yqBI`Eo4b14lc&DGf+2$kZ3;!yPE~ zavZ@>4KNpodJ`&D6JYy>rdr{{k8Ojxm*o7$_~xUCs(!!&wMf1&d&GRI#WVe7rGa>( z!L+~FQ)jp6tNW#K^?vNQE*_cK;-p+pA9)N{6et8NSE^?Bt=0;KMfcoawDiqnPlngB zP#C@8jQ4&La9=0x-HwWoyhwBO9i*ziDH&Z(1}$MKX}MASW3sqM#)+ztz&7%ETYO}^ zjv?Dps!R1NEBtiW5~#LWEE#-=1`33HXGQy0H#PGZJrmk8zBUgvPxYT1eL;i@7%B5# zgv6Myo;vs{NT}4pD{fcD?pxg%Kl7ts??QA(*_NVWH*>BZQ!t*sIaAm%x%UQ-^ziD1 zUzPNpv;${J1P*J-fdCDTq z&}nLkbZ3k=IxgAo*%P<6Qm~sWTp1RxH|dr8`*1{OQ&-HL{u~v9{G~2UwmnxcrNlx zz~`z_y2PWz=+Hg-$-{=>S8wWnIaK`~%dwzxGDkp{W`Mc_tp`-?Ak{h((u~;M$b--1 zg9);t#_JGt>}^XR4tDNZ>~#~p$YJ*!YK?+!P*htr(zk+8v_0NEt{`4vY7-_^p?^*I zbWZOvKKCw`D`iR?r_{nDmth?HM;jixWtof$8g6d9y2e7?7hWq6Yj&-1)-1T+F8A^D ztyYo`drMEWBu<(axUp%ryJd3Gl1yqdlc&N87Aq9R8a2jv?OLF0Gd?C76*U7-D}A3= z?Y#S>eb(veXx#l>2*FYfOlE|WB$bT*a|UyvL6JgnJsGgeW9Fd5g8}GP7vSDJ@%Zp&`0hq72r58? zH@7wp#l9kN9v#97^bay{slm92G>!G>lefh`cN|=}7*z3lKQdhNTb|Eqz*9WUWAiTU zi+-9Hp(H;07JTXY)9${DiIlE4=-)bibO?Sj=f&pqyWd7vGEAANgT-J0je?)uKhAjg zcC(br)4_AiR$%!-QlRaVb&-!F>zx~t%@#y1rx`ner>fGcj;jJNm1Q^^ifdV^cGXWl zY(GkDB)Zx9YL1cE2v5L9eZAO7z%iVYa+{LZ@6ANU$?J`h2~7(eS}$o^hgICgF1*2b z`a&O8dwHwC8(vey$`}o#beGOwW=*cv3;MFskAhbd5^;hWRcWkOVVjALq0rloBWk=a zD$Qp?JSplA-)nhErq#a*rDv6nrT@k;rdw>g9&2WpWHi>#@7F&fg%>cb?G3o%Rp9U| z%7f>k!CIC3EWcVe@b(~^;u(K`9Nsx2{v+q^y?67+rQ&z}hqoGF zjAn!)J-lv_A1;p7$iN~&o}fR;t{_kA**w@3tC?x^_`1KZy7=iBNz4A zF_!v}<+ZnWapqQu3oE-F^;Nje)UBXnAQ}%C%v2h24iY0!XLS2UOXFSQc|Ohx^DGGL z&~ERSmf`3_^G3=|CCVqfGxW>f(-bIrI-eplF{@q=bkxRc1E~7x39ejP!rYH#RyKHBAxAu$ex1s2S4Cn zgB5+%LcSdW+gZ>>LhD46xvNcf;O&P2A7qGSepe}a{9k;mbMhU{hf}@gN^DH*t#7gG z;wX-Go1fQnp!fSLp6j@$>F2F#r^Vv8qVn-E3*`xB>My<>|1Qe9c}pP7S!N)X-Vk<& zd^KUyg=Qsw#=OT#MT+>`HahDuGb7-zmc-?ToGbX`I!>yr^uev+J@tX1bhml##N6dz zze+ygTOr)-r=Q;*tNf711JJ`m--_$j{^_Ur`_q3N{lEPGr!)5{FdSX4i82m; z${|RqpS#WI9qX~{-8qNvD-VJERyV9hROB7;}q6*`Dpnpkb0jCM(yy=9u`9{YEtcUyMI<8jI02EPk!>q?b1QT2UhG09&ZU*vlZLV z!^1BnK{j}bUZt#Wwll_uLTQm-~ZRmlR& zkRv(N^YMW#SF$57XB#t-1wus$P;G1V#z_4q2#$H3-|zB8r@7{M1S}PnO5(!F@8W>q zg$2l@tn$}EE-qN60|o(;co}1cQ@dOcAe>95-=`tbw=6Pf!q^=w)&PI;NgyyKrYIZN zX;=9^cyy%tbx@%aL~WWZ{y1D#DG)D$=L1>guBGZmVA&gJ835CeL^0P{=Om_jt!33X+>s?Qrdiy{^9q zF?COYEH+fMDEa!;jt^|kI1Af#AS&_dCd2H7a|`$Qak6_Gz6Qol{7F`G!2i#2BJ_`o z>zPkJrp6`mhHv?l&6I8Bdslb_PnpQNhGW0fX$Bh_TEWcM59!-$P|3vseE4Q}$lfQV zm!Ux;*YWQI`FzNlS(ocuG5Qtgfy;y9dB)`_Qljm;G?sRV2e0;u;gMx+ILc+5=JrC| zL2!kOV#T#Nt_zw|#%lp{}X{n#lF;KyWaPx!6 zZO&?W1Ru5EcejF%?B`7pn<=V2Nx_8hkkv6N8Y->aL3rFoyG>3$q8LA{_@$4PEx zKrry*zp44^12D?3%KcJNG>?*fz$xNL1Dv&_P8_?uH;}8cDd@m&^g&`S@F$4|dU_d+ z^`3zDvckv=5V8))nZ=j^r_hVG14}jn53Ip)A@F5b899zH9N*k6+T`O?>Cyb3u7PaV zI-!>tB&l?9RH6Dx(AoFzD}YK%kI)Y=z;D|wlrsnLLjX*2BTIh4j3efN#rS_;0^Gho zXZC18Y;>F+h?lH^`tLNR5xpn*2Zj;;8^d`rJ451J2k>Je^#-c)I;mXm>UL@imx{*R z86EK(g%{;{@RvSZ=h4r|qd#=Bj&^J$OWK{tZ*$lv&Ng)_DJ?Y;u#U{)rGY9PMs8q! zgSNF-Os^^nGzUQuGR=M(l@#SfL=k+yXw^x|+u@*Sg*C1pWk?vRfxT0@^K9E`j`G}( z)HLW+`OfbuB-hO*NT!Ubgk8rnuH}y>Mi6AgiqK@Qp?0!4NSGbx^hmoPVHTZS@#hyi zg2LOGjldbn;F&tsG)3tWMo_Y z_L|e7dob}4f;H@I)3GkdVS3rfbei-HKuy7k;T90`p`-a`+WlA4nR(1v6 zmDJY&imAEFfu3Jyx=c%7J|2+}UwpW7&D?qav40rLj;PCqWaM8oySOrcL)4N5KqiO^One2<|Yy3Gx`pjz_x7mjs3Sa7a; zf~%L;e=}iPjsB7R&P8;w&&JlkZ}zhSt|X9sN^B9%Nys(_B8Qa!i%=B02A=n7v}s$Qws>@9L7L9U><%zK>kH@#ZVLU zCz$}`2REsQpy6hNk||@{<_fyrU%_a1v+8@lmq~x=b1qI1{vCR^!KZ3D=|sa8IAeeX zmS=HLxLm$h{o)7fn<@)}ybFW76Cb1fM@E|>Ta@`&V|qT;G2?Ydj8nw;+*mvDD5Esp z%K&3O)LT?-J6;2cuomLKusvCJrvYYZ%k!jFouw;~-DAID%Q#3P;9}XxV}#N6q=;it zsTEc)MHykObnyyXP_uQroix9R&LEG3tj^Z z$}uzd=mtSHNqa71kBE>OcV3H|gEw!hg%5xGi^d*76g9V_xQG1xR~z2@Ryp8#8f0jArJsB+uSznniVxuNZ?bS;{^dwf=mv<8uIf6)w<~G&cqbli}UEK{}BSiu^hygx}kJ3L(=L14@{@Xo?jBs zG1++!nf~uP@TRknNbc5Nnw|UxzVMI9n@>x8>>5Er%_$F70i-XGgS(qln-qo}WDUlH4Amt4+?uwdl?$fVZ56o;+b(~DW6c3@A9655xBvyfjrBPFjjDXn z>xos#4p*Lms`6qkJn-HiFh6L8L2@br$6EOO`{@%}+N-@{6A!k#kfCbgbs84+)=gf9 z@2^y+y@p1bAPF$NRITmBPx+JOPO^0jY~|0A1)1F5E0l<@QTE9zC{J~&dE1{Fi^J?W zj1fr-;@x66CFkuEE7bMx5b`_v{nGpcm-kT2nTJZnyR_g$?j}Nd%Hi~h;U`CTZlypJ z0x${Dyv%LRBIqB(pbNd7;egh0ZBTKqXB&La=NzN>s{7vd@lS);6|3oL_>9TME9O9v z?qsWLpqp;?2gp^jHoh7)aSd0z86jP^ z^8NcLpAeQr>NqG}I_TDO^8{$B^&Ahy%B9Y=f2kWVR)w0i-ibsDPWLlYGLR#=F83=1 zt`}*3;?y6$V|@2)wDc)OI%Ca96~%m?3_ZE@FUqewVvVqKYG2{`>eF=|O_`!YRK7KX zWwonsJf4N06k7Pa1lENJz5F>sWcfW7`eI}zVOiOeH!<@EbA+Eui09j0HQv#TqOglv zg_goH_gtk52lpGgrIsCginyxP41XpD6qaREiqL~T{uClSVMJ>dL1goUkha15rBM>l zGsov|He5O%=uKK(be;e4t8Kyg?TO`jB^t4nIDjp;r+o&C@>>W=+%f-T@%Z(Y)lw&< z-!3dxjhi~qJ77`~=QR}0I_ut>nNL0LOFCaV02|Kk<9Xotnod47!u}UL#J!rHO43Kz zIGUT{Qsg6_nZz_28(*N~{~Tgvc;BJrV{c-J4u=|(&-9G-wscRSWgFjcI?8G?LGC&Y zwnHrkUFz7WCgijBkPu&zA4V39_54Pz6zCQp%=FO{myUmvMTGkep(8hM)U!O}_Uhd| zZ|g3=vb5RmpR8Jw$pkPEPOKQ@^vbjba?2T(R%+(j56OS5d>We{R#&m?-NUxI3~f~7 zF5fPVPVsKgk_p)T<=06?HF(l~I~2@(%l&(JKL)D)L*B2X)1ratm~(L;JChd4B+e1R zvcJXpLg2x6OhvQErSUiHGb(laTjicB1H-k?75a@8aJoi3c6Rubo;x+$^9e6rU7uKe zc**}kvlS=z7r$Dn;`@Qh!wGtOe@pp`!4nGy*sdI>o#5ZRQvr3U$`P%7%)1=dx8?t?I|bc7E&yEK!!zb-aYK&- zHozEPT}XfYZoy!Sizp3mK(K5A`SjKDnf0VM($PEj%Th*Z_9oVX2_uDsN(_p*w@#|? zg@Mmg_2c98u0f6GI@-91eoGv4kg|jH-)cogHNg!(ql1GJ)S&|esM2tZgRYj0X!+Aq zQ~W)#L-U!J30339wSoDKxtdDmoxQ{`oP$k1eGKaJNJ(t+Zspspmp3FM%DQkH;#VRy z-|O(=uNCnqKT{ickD2tFH{M^IP1Ka-5>b}%r*b}<+54l8KMn#xHeFau3EA&7B6k{k zaG!L%tx4?+sw`|1bFgZf)~B@fm~b;^+I zpmeki0fE^9T-kFTgMP8CBh9qlz1BVpK#fs9KW52Naarkz5go7zaR%&f4HRkhF(G$mvd!L*@I3@|HPZBdI-zonu4LwRzA$t^V#7RR!Fw8#*2-K|w(0X@MN6 z9n1y|znB@auMQOl7qI@#{CY{ppjkFNe{pkxI$J|Fa+08GmS*y!WPVHGo^!ze)V z%kCxndJy8wA*agqHE!LqetvWp-f;~`=Sl&SWK%C!*L4sLZraQrgp+{1>}{cOhtr|w zZ~j3ie}IhM3);#|6b2pJzz=aAFp zS?l~8?^6Wj4Z4J&UtxHjS4ADGqwf+xTv4t*1fznaa%tQsKzUUSn zF5ee*z4^(MdNa{X2QSuizZvdW*ycu;PrULJgu-PR^o9jKF>-&=u&O&G1ih`?D{<6& zZOvW#TFbF?l}$6Dwl7EE;%r>)XowZm>Srs|aF>~2hGGSjQ6=^MZ@|;&gO^dh3AV=p zC7h85Uz-7F`mDSR-Qya9g0JsSdxcMX5YpKfh$P_OkSzTkX!t9Ndfo-R*P`(4^Dcjg zpMQ*p{Kt5YKwB#kGv%bLUMG|)6i2WNq^E{(=Pv;6iA{6F6kMJ#GDja;s>^0p2_vnR zK&Wp|I7|>yZ&xdXm<@bUb*;Rrw~&shp?vZT3l1%|)3V;)-Uom{cxVYxpxPSy;?9 zYW37&Z5$o>+@Ol`+;3&$sv#$#$o|_K+;UnExhY0xND#O1&h#lZY-&s*429%6q}Z~Gh4Kn1`GOW3=`o^cTeaJf-0F7s&( z=rnKK0_;w^T$h~|Qew~Z{kr`%Izf-d zq#JP|z~2q0V=c)*Fq9c1W<2wR;&(5uGe5JmgT~!5IaRGJAkuNmDox1@F_+)G_Q@C& zj!hbWzbLoh&BO}T`|w8Zo6CzsS)QA;!7HZxr?#iip?jxZUc}rF@?D^k!wZ4df7EX= z1INtifMTnBqodg!zhqO$e)>W?pDqLM*|_fd7uO$UdHd|!u6B$9-6Zn_Aw&1P{D{2k z_~vw%^J;DTO6|pYrmFo?Wh(ntICKeT2*{!cFntW*P4m6br8bbnputqagW7}h+kh4% zy!eaea1~0Gh`66by>wS*S&}TW#RTu^&Ihz38%WY}sO*Peprtkix zC?5qT4T2FyrGTBHWpF$qclEsIRw(z0uq-Fv6Rp|LE0dq!?7u`;NN2aO(&ESAyNJNs zsiOzQOD_KyIFnQ2i`ZLAy|Yv!X#4TchBz{>>O<6@9g@LsU_3EBQ3kRVh} z$#C>im+?QJRwv+G{~iZ+bO^@b)c<`4In6_hO?^vGZi4REx=Q3)r0S9$VBDv8NIH-Gaqg0?3#$K-Dg5eJPt3GCmZAMKjM-xADLl{p%wbC4B^m+uH>e@&b` zUE=HOls~TJ6{uo-(8t(wt(4=DUjnEI_#EFTgbu&A{lLZ{Kk2qho&oza9H^n>x8rjl z+wMufAv24A^@KU1IEzB5W|?wY?I4R2AWN3qWLWLb?V;S_^O?5A@kIB@Zud0alQizl z(QF?*)?g2<9Qt0Ev#pRKiFiHwx}3L^ut~>0D#-=_ zp72d~g>Jny^MRtP_V1Eq#m#Uvu~~(Vq{t3mH#h%RVstmhY_wEFg9j3O{YLtrXY2SN zZ}$QZMR|;>X}XEsjpI`5s{RNJ??@Bmgw_j8v)^2zznuBB{Ct7)5BVca=xeq7IK%i> zX;UUwX+OmMt(^NknHC?t@({Hw{v&A}#c*4)i=!FOIoS9YVO84TWax)B(5m#h7cvti zHK}cf=bD^QjP-dMcE@eV^lXT^ajNKp$om^P%P$)7aS<=cVmb92SmsN_C$HtWjrZuk z?W>|MIuSgKqAdDe?sJ_Q^El^ztb2I5i*Qa8YaNIm!6eK$c$0=|m3ht?*jEcYW!ViL z4H+4P9K84{-{E;jz}M^pj9KMUVSo;vm$X@Tub=fn=gg~afiDirInf9`4=ec%W-liP zhtJD$@x}Tg(sa5UkIo*8+(MmMJK*klU7YnTQrWk7@RrJ{>$J=um<}OPVI%kxnkjkTP)Iyu7fDY^FE1Hb zt*J%QpS!fLs^h=VcD`-pp@ZtWt5T2r2f+6eWvVQVkj+KF9rvE$^cE;9qu7+2*?L^P(1z@3`lU&r?FYP+;0kM-s zK77Oh;22Lzp*R=vJ9+5-v?S$pE%Vp_Rm&FfFTJK+G$9i6vPUO7Arkw&S6teD*mPWx zUHV%ieZ7kQO~~aHG2z#0*L$A2(s?KR8eXD}lTc5B-t^vGcbrD;gp9~8Au5DJcYg8< zR9e%MWV`9--cob$9K8XmBdN{S9A$OaxMwAk6>yg|W|#Qu>(Rw zW9Ar7?mnn$U=wbi4{YNt3ZjREIliT22ABwilv)y?<{qaK3@))k_C1*Est?1$pKO74{SR6^+2lZWlz_(WUm_e>|El>VtqTn%&-67!Pa(im?Fk1T>nESnH>s$zngh z5uys#Ms6#LpUrgosOnwou0`TUnD6I-G#9b^7tLxZTTA63_jG}ZO!ob!?zAsV9EXS1 zvW`)YJP$5>S?Ks~8R@*0g@r)8s$|g|6RHU*6_qhryZGi(p2fBT`nZOXI+I9hpPX@x zZBf?f=-qgWThA+4G^coC{Ehqw%)yxwP(u1kpPmgiYAu-N-tfiby^`FK(I5!MU00<< zMS(1UOh?-z_Q&auzy!Zhlpfa>Ub7uy?*Q=Ws}(g9#J^~qy06m+yQEIi&eVI@tW>Hp zePkbeV(UKqumasOby*%uZod#-9iz98{Jgg0Bwz_+39#tjzfo~?F~uiI106K=m9vyS zKR1xg>VxS{Q`$UAeP#A`dT5nMHmVH%AdU8@EFHV}Dg^*_d*?g_?<>$wz zWX(*7b1BnZa~m1*$ptTZGEuf)5|}X_A5DJhTc}*SkUA{nGeWkOBp#sv!`KemenIE( z@SdS9>d9LmqA~fg7zumyn)+R)75(p@8$;g(XyYX@*|f#0Bg0LB)37aE;Dj5ZMpr4e zVygl-Q!YvRbcV8mKDZx&#h#kt)Gf~ylcAl(Xcq*ir))0#O8jsoZK|e>^_Vb~goGo{ z5RN%pG^Z!Gukhukz-M(q(DxkaSptB+V;oc&(4v<77Y+LjPf&!jCK6GRWCa z*5B(&NwA~K`7IZxa}<~c+OHQtw^l)`WXTD@ATF&kACb^Fn2OIU?62|tPvyfX;q7um z-P+LN!v$NItxkCQ$`b{w7<%lzUs?tIXHq6Ng-4!k}wp~ zk9v%M6;i=`f)F;KJ7im)?#p3&a%?P>j`Sne2btezmpKI40`z59*0v;PM!CLryP zg$MO73r{*_d>0S9Fcn6i13Ua<&l5h7cWR<5C{{vpNj_P?O;1FGuJYUOADX9S+AoHT zTxeg}u-;XPI?H;0iGe#sc=R+;9!p756DK4VzmVU)GWA*d7hNZxmR-{uW^0DFUZa6< zmFfpydy*{=taxyU5SJm1Ux$94Z#O19jtM{?O-gOLS^~a&25Gd;f9kXA*KgUlc033x5Y;aw3c8bQNO0*7b>f6=ZFu zl@dN`z~$-b4h?R1b5Azfu$Nzga@K)w67;s)>Vo5qx(Vo3?)=E%AulQC?9uOfS58yb z?G%N3jlJ_d3amAqJPLZel%zSrw5AZEOs5R|X)}}epky)0QvksElLqC29OY|vuD-0B zR%?cCGxZpu4Ql~C4Gf_r^V`-FK$y2UHRgU&L6q?cq4FSPmllK7xgOiJc!=nfrRHxJ zDTOxyi8&?3SgwEUYoTqL1Z8RA2HTYufju6y-^PY0bnCw%RGeuv4u;yNMFP0NB< zFdfWUAFp=%n)`ih8OBtnQ*0$W)mfU#+gz*CT$G@zd(MNv3o^1uHIBd#46EfzYNd&J zXw|Nuaf2BrBpogsE5V(?{qtPMOGQUjXxFa@^NdsmE|)_3h) z_@pHQk@VqgG>?msD0SLPD;}OZ!PMa)a=TMkT0yaGAM^@mheV;#pc;l2cn&X^IZY=6 z6!9A==6EwaU}mo;BG5qtgA67)W{@VCzB zdQO+D$KrFsvAMc{5$@ZSS)Ty^YKX=n{&Zu8n#)tDaO!1L;s{wi&t6HerZh`#LeOdg zcVaj5Lt9C}%v{eqsvsf0@Dm&6ddKtpj*qR#aL>(WL0#)=9~bjvK7NWfn7_Zl?=Yvs zZf_oCCYSRhQ1qFynX=L)`nuN`SV}Yreo-nD*Z#{D9=yRwF#c{HZ zVSDDm_R*Coq6J0ARs9EbQ-In@`oo-k0+h_^YVE$$F_n59HHS-v!E(xRnpC*?$^i#= zeYck}XGQdL3PRbSW)CqCRsv76hqd*zgTa^{L+qnBW@lKL9=(3Z zq_{O*Mr9zII;LITo{4%c;)kyJS(_Rnq%caPN_vc}S#Mb;xY&BONCa!JKjQvd5yRfG z7&*&vV{qs+wSM@h_e3@f{l|lW!LNlqZN;sK02W8-+UVJ)2@nUT!$#15FI~ z9A1*$@V8eaD$=G$9tcYNzWySrYM@rqhy?oE$3mcQncwYu*3z*`vw zj>K9IokLixgS`>PM>DarZFr6?eg+^_kO6@L@)UH>e540{PUWe5)Yj+t4V#~pm1nPEeiik))^yH2KWqPl8%hPgh`{=!(@l7NW!af13j7s&CKEGJh^v$xSTT<& zEy=$X_(ZhJNqX}xq@Bdl8{1k9=O>)Rv}hf?ed179Kw~L7ufX^56=|Q>d#>`+qzl_s z!Q3r=Uo4E?Cu6R(gpyy_-MfZqeXH=vA`bP6;I3PrwJ>WGrWR)#6j0);DNO z>^-%rc1Wmi+}pVtLKI$TsaYu-@qI#TaYI!aI@GFo&_VJTuE*s1DctwgeXxr+k{~|J zt48n;Znw3h!;{_VOx!}|C%-PdCqaz%ITk?G%c*q;3*&UW+NA+>-y621B-*0}Om8N1 z_G0YNdJqeq4-v8V7WMs#-c-tY=ncI|$g=-18UJbSm!dG;mpIXFlW5tQP^Dda(z?6e zm)hsq#_cqS{dhKVRZjpnDMWo}z2dhtqq_Dd32`B-j?0K%63e7FQXa1veq)PuC2znW z%JqU&XPt`9YCd_fF5~9#eoqKW8+ zL(4f(7G(QG4uE3qr2-?b>~88h0Ji>BMD4J4<3(FDlzD4kT*#}cEVI*~v_2N|UeiW7 zavM4}L$zi8yIV{7H}nNB>dBsGpd=?75N4DCklcL@NEA*Vh!W8lHAxq`fV+cUUS*tB z33HNHI~FKQDogYO{WVhl0vTub)p`NV((`W>)#9k!xAjQp!CTU>MIA9y6C-R>FK#d9 zeED?jBIo-XYIfs?PVH+kA<$30bqUJEIn)0e*J5>~25+Z-1YX#9fapi=^PmYk8I)G) z-FiRBv4uxe0hPA@=FiFaFBYDid^~@-8jF2)G^%e9#lcezR`JW-c z1v=r)#3VH~LQ`8K;-nC|-qlv#z4)BnV)C{E|8!mzoXH1fOh^qZAcR;~C0wKEV$Af!Kgdj{a^#a-TK~^k_GiAE+3pXC=3CY z5hlf3NklK5;bSF8CwPV523+4ZzlRe;3&YBLM{~>6;bD2$ z%8A}h!x6^IyN$f_(dRUrR+_fv(9Qla+J;OwK5!}D@e_PZ{?6>t9ay$uy_$9VIrhGKg+WwqX{q>PO9qe0WJZ-`2~Y5UnKcpF&S*i&_g}2xhm<3X z`%4~n$QHfng4ASwK4PlFn+<2JPsKPG9Yih-jb~;##!;w|NBT8lV-pv{kg zFEh|_B0vPoD2b7qxUmcm0C5*u8j2hBXA)h;R_{L>LUw#_AYUbf77~=3|5Sr?X!)}9 ztRCZRFX;U0{F10gg1g@$DkEm7&y0)X$$L#VYd*YK<9DC@2doWW(<^EaLe?2=F!B00 z7xf;Gj{xvPvrIS5NuKigSSOw1EBE7fD+aNzlbJb_nk%~JYt{GY#cq+z@_D2zVJ2Iy za#jq_noPij14thc~863$J>MyBNbSas(YCDni{aV(C`Hyim^ag>U0bO%eqB``=>3LD^(l+mt z)-NzWFhZOps6WKlhqhFpO1LK-Oe2*o5+?50y?+!v3(3dbA5miaVW$rkv3J~C&0^tz zA_*1G4cAKyH#*uCx~pBeov#a3t14Z>&IE4+2tN}{d`2oRI$CMKY96vt5JCBc>-0%^ z;W$KinYO>9!!_4)bcwgKeN1T)85i1ubeUzR2m*5zrDZp~mDb%xrxlwXEG_O>93WdjO^dhH)GMY(~YJ9zzNehju#yi!!i+lWE(JAi!v}RBSGW1Ca zA#bP6qC!TKu?U@FmFO6*vHFF7vAj^t*Zs1HX1s??ZABSDz_kN1A!MwY>zH)mQ1Ee( zSGEc$8%u=)6sMsB-kRaR9fx6?Z;*7-dvdk`q>@j*=95K`%&$;G=&gA;S>wsR;;S2^ zL1j)jmY*OFvVSi4wloZAWLZGb)tNn(a3G?(0z|H0MLTVWLGMzE;4|(2u+u#tyrRM@ zT#ks4Kjyi?g-NvvrnVEM6Fxx$b18|;Z*AEeU=BYoHHYp@v~KDIvRS{%2Tjyo%AT=k zcagoDGHsMbtKzR^aH^XPRNV=yy}mbfV?fbSSH_`vXKS3Es!^g$MMDqn7La+e$U>=2 zBu~^uRD`VYJDyN^0}e7JB+n9k$9&tf&(wj*Y0 z>tEJB)8QPEF7^9H?C1014(J>8NT<}n#7_VTG-MQV0=j&OnR-&&Y-T$zKow*O=|~DC z?jJ;458$MBfz}lba40-S+)$pw{<{P5NsyG&iDye|2jzN1YpU!(I@}#4<^#?}XuX3? z`fDBpgYCekM6wadEJk}!q92}>q6Wuz4u)V|LN7n$Z!-HnwJ8W8F|ZGx4^&?}^F4mn z3W80Ik!>6B>|tL0_T$cTNjFbTn&3W5(nuviy~$kjt+-G{Z&m`A5L|X>-j4X~r0>CT zlpiHMNw`^i5Q1?8A#z&^DyP&;OqoxA$nw6r_N_v31`Vzo4`n)_4ltr{7YIAG%wY7; z`A;hlumyPxp~o!@egMy|;x)Aq`U#yTg^*u7fb*QL`il79XN`C>&)J=q#Hy>w{5y-( z;=?mHAH=kM%}*yK{ZQ$Bg66K!%R5=In!0)eaV36;s6BSPP`E_ewGBFVB^jksU5?-e z(p-U$M?)s0S5C|ES(znLJ1TBkE%2@n{nX78M}4m=9^A6^A7A=@?^AKZ3#~}hse4^1 zMbx@8q}oUx#hmemp7<4M(yX+Rg6d85~FL~S+wS#9kv8Az!X>gHhSJt z#aGR9%k_V&*8eJw5^~!WX$?v%e$n?Z@_UJBtb46m0-*?hyseR2Yr%HN&eCEc1c3YU zmAgn5!Yiy;562qw9Fk)zY??9=u(1ih)mA90;x?zF-d00aJZFaOnKqq|yyt~AJOO+P#{2vs^<`_XG9$h{IN=rMLRWllBPwfVpz%%Mwpmdr$v z7i0$3Ll4<9LH=fcbx!N-@(+#6NuE#MH*DWRauMotdS)RJa-_}F3lCHVnrSR;;ihU_l}Zr%w_SrcF^O`;E1o_{^4xJvFg~@0eur20 z-BtuO6_$=V{eWD##dnG_FlA+B^-C*#?(TbpJAjx}e6bmD4toPL?FtFDrOFR+RlqRs z2k9x`*!`K9QywH$*6&q3mRxghi4|XofT_p#sHfwav6EJPBX3JHqe&sNsCS<5V=Le9 zRi(e|5%Nn2bgV%;rThvk9QR~6E5`fyRQ&DFe6LrGDt=BlYa%(?ou{U{S!aoTleP!sW8-Ke`9pMC|`BHTV8s&JCFOLpeF#{1+Xi3lRA@ z`+rhSPyY|c{zXT{p0Rbad8NsSFNe3#dVs()8w8$3-zcA;^C_l)jY99qSjM#?iRYZ* zYsE0qxzgIdtA|)T2d4t0vG+G%qryW+_c}%FO9cu*j&)j^te;~+2*(_bTaAZs{CX}! z85pIWL|G8*3ML6MZ6=xgLt6JruN)~F&tAi9%Huu;3G}0?kS8f$>X=5ZGjli;1dOs@ z8UMT*l0(siyW~3E%@-_vZp_>FeF~y)ZGum1O3>!^N!2vgUbDPGwRZ2U7v$QkBBPQk zwh=A3=9-I@weR_Kf8XxP{DE|UW*w3uH}BD%yD928=wKAFB(&0A2-u(-{L+01!^CF4 zsjs1FdgPz9RCCG7f^`Q(xmADTcGH3MtjfThNSTpEI_jIcoHn&ngDUc0<5+#JcAbkM zx4k*GdoxhqKmY3i$rDF@iZfF&`695!YSmNXTgMyh#D39J1JbN#;L+x{vucoZ<@<`k zM_Z&v^|t(*JtQkxrre^v`IUk8wfL!v{5IznG*#PpLrALGj&ems z9dC>?vha!=|JC6wpdT7teTkj*Xm2ZPZJj~1C56&gN60vX6 z{)mXr<^B3oDO5qwkHYxG_V>qPS2#Cy%B^_xh2Q6$CG_jxe5mVB!WCllP||R2(s7h_ z&CsS7pW~6XneCvE18t{}yGkQvGWszH^f#;llynB65Ar#qe9FPl8ukjeTX`DJCVTZh zUh~HbCF6{*zVLBxxk_7=x4Uy@a!aMsOiIk11;DQ(jBWgj<~pM=F#qEKzUT<#C7v%} zd#B2Qqh}nLb+}V0$FBh|&QH*Iuwr1Na9^=LMmN0F!pGxw#V4VkedVLJ>d6VpkBkjh zPw^Tf>2rNvktJgEsKMvqhZEqA&L9lIZD}AV2ZR1E9G@t0@GsK0`j|_;GwGfZiWP=^ zjxiw?7M4qL_{^@z4g0anOFEq<+Hac@>zLiY7)!>GjpU;wH%gbjzZtfFx^s9(OF}08 zBZ<{*ANeJSmO%C?y2EWnE}|fxy}mAx_TCk;HcI8Mz=+05I}2Ni^AZzEAH~eB?4d#@J2l- zAQlNc9qZ^4YGbk|yJc8kt2=+cM{UN~yARGs1cb1l8CFBj*ZL8_`ZNKB0WP}ybdXB?mI z**k+@ihWYUt)5bHSU$Z$PRw5r=1sb2QW!MQzd?Z0!FGo?=;s*#q$G^-saVM{==~g!|6=UDnK5p5(FU_y+oPly+p6kO%Pr5GNTS==681P=f2PTJm>SC^PWHElaI`vwfA0o z?X|w^dtKk_;(30pI^yFjXvO{H@{t_4I&?Z_-y@;=&$F#q+g+!4tzKn{WDQhhD8fu~ z*uJFmPSe(KTDEdjofT@iTXF2}w#ZJK86&ITyl#Osw&mIg<<2=_A{(8Z|xq~^OCg>S`7i}a9H zJxuQ5O7^TN1Vc@yygWp8W6; z@~c08;%|~TQj?ak8Kr-49DY2J%VGTMldf@huO&!!Vvet&sBJ%%UU>2kiyHs;=N@L# z(M^4U*0X)#s0+hJ6GH6=F#8Wc2?^FHDe&f`DY6@x@i~99?W@yuo-GkDX-NjZ0CdOA z()5wFh&#q0iKheJPj+oR-h;NLjR2JaaVZzderRl1J^Fzk5$lIt7;Umeqk>PGc<;y5 zRB54}VC7xAz2{R>T6VvOz&ngpc5*6boo+wM7MNCbbd>hGgF&VscC1~%j!M#`py~D@ zo1got4e4?Owk)4k#Q2MK{wUWnhm;iRFnwiFNxYqvQN7=rSObzSeZU~XSJjYqjV=p* z)w*^5oxrJ`oxuGM6xbIE`!fLZF6YNPurZ*HWL(ugd`9w_WgOdB@4=Iu_8ZftvSd=% zF4I?$a@GLZ?XYaQM(0B!hGchho0;}`dSCy>8;~H=#g9tpc}SqIUKiwOiRe-d&@;BI zL0N+MSF^*!<7V;pxKoYts)VH~UoX$V>i{>=uA`3>v^33c5@NIC-fSUee1W>Xi#Oo| zobf$Ive(aiUpiSbHz0-AN!Fn*)t}_WWvvEQ@Ls(b{k6!nVqb+Jc7w`$(-p`8akX?2 z#)wz_L`9N6Ju+H_4V)!}CTp4%$5}MMwrTct2bayp219T@G1nAnF&OU^Q3|jt)T2f4-K$?^8$>T`>S9ObvF@E$H_pCg zq;-R+xA83PXpRoBH+i@s$DsV|6;*Z?pS8a|tMEwv%9@%Y2*$}8UuhG#}Vy43&tn1EaA)01S{_-`;s&)oo|1xx1A-tWy)N(;k& zF0}e8*8jJ}ZnJ`)f2~bGp8I(SRxwvrw!-{^m8w!?R)6m>ajH^G<=+7iY!Ox@i zV)mQ|gGDfc>0f*NS!#X6vo6H@f5-u%s%7!9ia5z>w)N=z(Ieqe0R#65xVEmP2}*tK zNwCNiNml98(u(<<-()|s)X|~4a-;rPexoLH+3!sqhLEkQ`Iz8^vDrEyGv57spGe#; z)b)Z>*0Y6iIl^npE~`rNmA2Pq9-id6r(INE@QThKFefW!2&z3qSr?K~;q|(0YZ9Ya z$AxjW`_8424Ju=*+lK?x&@u7mRXkc*D>8X2g}0x_eVfWs?AFCV#kTJG*BX`?KN&gX zL_1gD<4;h8#hCM}(N7J`aRg(iF8TE;PW!*=TI7LpAi!Wq2Yo z`N$$F*ok#-*!i}Jh?{-DW@8LA?yhfu#RFhx`m&vS@p7oTl* zBf=85ws^In3n$)-|90VYnS{Wyb;8@-lgD%|!%=yw~9D z(F*frO9p&0Mtv;F{|AD3`&w)7O09+@nj^7v&Poc(1*>^hO+3KvoouljHl0AS{V?oS zRmfe~UIx;TcFkT!$krWJdjp^XC=BB}rhpo`K?~V1EIZ(D5vHIWfx0b`U)PGc%zJwf zetK4Ea~=Ym?EgN}5{?ps^_EXSe#3ASWnim5OU6}Y*mzx>{i;v2t7n|ktYNhy#E(HC zKFoN`Jz*^O2U|e>SD>2XSGS+F1Qft4HSVHdo#*{d3z(>tAj!UYmHG}9_UV_n>>c$n zTA1#x5RmZe1>LGUq4=$)#cZBQ^GsF<_XpDTi|DsaW=u2F*MMqzC&r7sfEip|W$v5v zi|^`S5wSt;NYWF8Fq*%MX(Vs23mG|SpqNUQ9uubE5^NkS4{SYKdDd`3y)wP0JN3Ug zM^Y!a1r#ixEHZ!J?fNLhuCe5MsdPFQBi1 zLmAE95z#94ELBis*2^t*wO<|(?)Jk6eLL!f$H*%4wJI~Bo~9ZX!tQH*xcbepoBeTj z@$z7B3FE%<1$^(N?U#c2+FkHY$SSGD$Ai6H7=dh|>gcWqvOK5!jjz_j2Gnf0OR-sC zFUgK=-<^2>s(%QS2-v?x^+0I&BLn57hZ4`5Jm`VMWxe`Rf6m?|<=NEJ9X2=K%90Pa zCB-`lym*lzyTSoz=$aG*i@UX5K|l2Y8z=TSaTmxpE%Vg*%w!ba=84R-&{)j!=>$c2 z`)>klK|EKj#)0dNhI%7Q^@{@1sxg9VmOp3C>}D$fk0n_9g2i^(Gn-*k^zruI-roLG zM46O@$bvdxi*?OQy|D14Du*NFRaHBe@1v={V79M1&0QnP0e4PHXjz8)dbQ8-a_PzNoLTFRub@$6-3He?d7AJbC-8Z{U zdXCv02CUD%dq0?!DU2TEyT=P3{$SHU2kGAiRiB6$+gjw zT{RH(doIC1e&G4N23Qa$tBycjf)Q3J>W}*QUy8J{4E*9xP+MEnA4>o^0bI@@CtHQE zB)5aWj|hVfl@l_L<2R1?!#?R4;f=D_(p~naE7m89AYvdjgc& z9R1y={i`HT(`W?P9m6>|k)$|9{=bTjF=zk|ZdIlRvSj}!IJo;ia4^u{p)NqK4am2R zk9xNAPrO1?Mk%Me3#rl_F#D*ab~RTK?KLnTz`L3d06q*o=-30K7?~?Kj2fsyIi4&Q z;54tiQtH3jP-MLqB(4>z z2L{>~<%?TIo`^<^k9sfJ|dtWz^{NY5U7-3_n6DP1zuhivn77=n`(yEzO`FBqvnd;%FESm4*k#`bLR?m}XxJ5| zHhH#EpLy_P7h}%}YwHxRU4)?7=U2M)wYS@TpM$2eLwuyIWBOtbe*g(@egY~}6pY=u zVfk*LuFL8XB}wYIRz3LbJ=bH|ym{<0y=&1hNY|gxrzokpd!jEEv!|MKH>|N{N1ky#LVA6sWb<%LCzFmo@dViqiqJ{YT5}_RGf6p)Zz1_2QQs)`ZGY(79It-}e0@L(mC6xblm%j>U=J$^>^n>lBvSe{8X8HxTI&cN zd}1Dy@eH?$AA}&PDjW>my}2vy@%s1rA$k*t>TAemr92_?-vyRg-rDO&v5wql#Ptk-pWmPzO{MUoOwsTq$mN5D*!9oID=@qTJwXl*NLjOwf*cv zun(7*(0y6K#<%5vnf|`B@^YO5s28%bz;r(fw;Xr#T!_7OXd{@Uyyq>A)~PBOE4H%S zVH`4Cn;X$yE>_z)t#st6{MvNh8y;yHY#aQ}kEFF_?V>Bd#c9dHtXpP>@EXD7lD@$z(iis{CEm>Tc?;8J^r?Ej@s{Ag~_F@G&lLSf( z-QtY7>{TXm_Q^<@zPKuk$dq{cGnZ%x^8m_2PU?DAA$UBTo_XeYBE-{_*0;p;@yOYm z6gLNm=SJaamx1_f+zyDWfcgpYo@!jyLEpOHnxO5#p>j zy+g~w%G_RbhJp$MZ50A=+cGO`02YwCP(~qeB*2mABUJej#y(33AMUe!ap3R|L8RX# z007Gd0aNa5LZ#SMp0rD=`)W(smx_b40G|va>b$r)JAMMsv&vZHm@+4-T$vJ6RO|D7qNd z4R(Z_vbO=9B4~{BI+wc20M>x6fWPNA!*{GgKlXDlr+jZ7&H0DG@BAME1)yFo(svTJ ztq9al2kYfE;j+qE9++YxH|3Qq=Zu3@qD~6WmN~C7qPfRX-o2_fs*;8)c@-^9GvurRnsBigfAg5|d>$-sbqOy zp{ZZueKz2mzeX9J;~K98uUm{ws9CtX0Xk1m#p(pb`JT6}gXn!L?2KvF6p4;&8FcG^ z`%6-q#ph%OkZ(e&qz#!_Tz2^JUmzGmY4Q8B(FJc04!!VPn6x#jyH8y_mrrlK<}wsA zudT=qhnfFF&`j)QMTKYlmNFe^c&8@0>CIdNRe4m?`OaQ;NY)U)9(J~PQcm4dMw+S6+PB8P(J^*nV`(BPe{3~SDa!; z)xHuwMRxxJb+oU`ALCUL-TE0+tr*)C{~H0D>{W z*SOs>%5H$Co&R6RFYGV!i*RG#>jB#XM7?exhN`UZm~25?b;~&fI$RO0rM>4yC%mtG zqgm1dU0N7`MXF4l>|l@~fvjk@X0h(EQaybq^fzTfNdjp{yC}p9$8L{A)&G)@bdhEGHUaLt@4)NBi`KtkB8w**8K5|67>U(ro|B&NK}2n&%#)xcOSwf>e^_;JCL1!#GK#O{DBl9A z-gGq2rtC8A=6@=rI(L^NtPx<6Mx-{_H8gwfN%4ore+#;`?>s&pnAfB`-X9}Cr_cKr zJq0u>|LRo!A3wBoud-sqACjrkeeN_B6mRJ+02##O5=_ZW($093yp*^X}{F6zCy`66fG6>&I z$mX8!g)g=7^qAg@`r!F7PSUW!5Liq%%Ecfs+ za~q`-V>}h6xL_BpPFXovwCt()lgnn83AdadY}a<@Zs%PU(od@X)b1H_rk|N|Y;9vH zLnvpu0$gPF;*mxvFDt8TnXJt(z1Ao3ox4ZAR!j7nkMz)#eb7 zbX!1s5Iv!9nO97q?eOELKS#s0qNDc`BgVsLjon~&PL%1lR8nBeE8Pg}B_z%(n7+CZ zZCL?|Icqc(ayXVM6C?rG?re$SPds9eiS2e|s4=r^L-TVo7=HEnPY9I~%}gNYZH_!s zp4pWId!r-=47lSocu{oZsMjKnGC{<0$ErM^(dP|(afJnj)R*&h*SL(IG|DINHJ))w zZS7SUvBQ-}9C2o z(5FhER9~oZWO<*06(6bq!xQmibaA2iuyKAMm)&U#gep^cUzp*)SY&a80G@*-fubsT zx)qeueb!*Ki|h)ci6VOQTpN|+)P9})rF)if;4miMl&GN?V?2FtpxiTzqw812Bfg}K zBN z)GJH4i$Lmp*CeyLdOW=zxQvud#VFlHuGE^aR;JZB@)t-d=?*l(Tiyiy{e z@b8FkWiIp`)0D}`40vt+#q}-)TDC+vJFhjWX;xn4Qq%x zhnFhleQYUwT({Mr>hR;7Hx{SPkzQ%D)(~4XeUuOhR+xNhf^CV6N=-@N&|7anAav5l zTviaFEKmGNz)%e1LS5QEr=nRiWjE0>9Uf zmJGUrZmndu^-q5HghdB)qh=rUrJA)eI3bqOn-RI_cc?j=POzLna= zZIU%|egA@2oiB()hZV)w{KnR>eJFD_(#eY(x87Y#3)GIxn>t=em@mxpNIr08qkWm2 zjP&vUvoQ&F#$H#&HD@tLN7*@t3--N(-cS( z>ZHUiew2?f?je83OSfS)GpRI5GZuYX5H=e|OX%#weGd$@r61*-`*;v@{`V?;* z1SFty&kppKRVNVAto?HowJtoMobs`#Y!2vcjH31w^+Vq^3PJp7R4P#Nz<40JPLQaw z`ca;8i!h*-W4Q~CJVq#b`xH$KV8!bi(Xbv0tzO1;&*z$UtRb8ObGO>$=jE>=5H9p9 zmV}rT=hZBRWv#TQKC0e+uH5j=cTkJ>Hk>bm4!hc{y6|%2t!isRx7*Te?f0id1|c`b zPnF0JMpOcQ4C-(TjiCd&b`fXzuO*5mY8n1k00Kx@c&nIzJEl@DFc_Ol?zYiEja*Hm z*Md~h%sh!S0P}eeA%gyWf;n0(e$AV!ypZ_5k6&gRaqsaS3Js_r@aJ^x~e{JBH zG@8GC73qCbAxru%tU!K-jeR4s%4mGb-8nE5&?heK=42CmUP2zx7knImIH z&{ASKm{D9xr%0}uI^hTzuTVMW_^Faa-!i_* z>>D6+VM;(CR~ApkB#T?8qG4&927N5>aa?I2H9nTN0!fHsDYMHC|QZYYXt+;nk zv9VZY!DVdV-$O<6cqiU{SG}q-b(*1wOn%@beV??)Dz@5jO+z*L>4ab6Crx#hbsq4` zL^y^X0(E)3Dx0u5<@IQ^NT*XVG$jeL`Y9mxn6&W}@fep5=A6w48vAg>vvBX%aYeN} zb@*^FKM;3}t*eJJ_9?S^IJ5ji;A|3pujaz-#aKH;Olai1K5Jq-K&WfPQ$k%zgIA|o zZAGFvGmZ+u#UTVm4d(yE|y=+$gtc90_OmviXGW zBq!bBX-+u`&$NvV2#r}rxpghm`r=QWmiQX8e-1qZDR|*d^C#}&CXhE*{D~|)dV1AI zHY3?j*s|g7uy28nW!rB~ZH4_QI;l8V|8ZY2b)POXNisCkzA)%(Vco(`eMKoChE%~M z$@|R206lOsG!bJ64R7Vj!>B_UGK4dFZs9g6PBggA?2fQ)Lb-AWmVt#MhdydDYTj)H zfLpaeUsg%ay}B…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⁣HC!?R$t*0-vvC(0XAaYyw5{;5%s<( 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 ISBDS$50FolivR!s literal 286579 zcmeFYby!s2|1Y|Sp(UgR36%yZ329WM#Sx@anqlZ}R3s#&mF^Tqx&+UvF7>zyn1UTbZ*`gt`6+*FiRkOd$R0Qdm@09W&Xvy403 z8~~J+0S*8FZ~;sR4S)qAkOh#0-2NBKLf8Q4A36pA1i=B!zj>a6<#htJ{gL^r#7M{Z zhXY489r_Q(h`46G+6IJQSlT(;Ia%7--{I%x1%#g{C}Uo01k)eP{0H6~p$q#J36x>3 zzsCExg?{3DwQv(xL0a1Ig(^%|;hD^zK#0*s_V(5oHvz!L*4a^2?#Uf3ZJj$fD*y(7 z4Nw8B0HKkIll|itFP>fN{HOe*|KH2e*dO14VXkXk|C0aL0I8{&lL;8S9>{KN>SSUA z;;#UJnQUV3=nMeZ*K|fVXZvgX8pPy|po1Wey~Y-Q;rwfC{1_P;CYDB~AinnfzKxCDHU0=&fs&vTPvK7X)M}v?fl{V7mg8Am%kSda49s zS`f?HT0ejGH{IAAE~@}yaI|2!!<`k>Kzs|t!Ddb}FaPFAceGRe+ZINZxuf*szv<}GW`HY5zxbE>mn;`x{-@UUj|2i(0WH`7N`N(Z?*d{oQ05xJX-?A?MSiD30k36;v_ET(mY*}n}Od3o{ zOfk%7;PnxhA7Bb&iu@DDfB3Ohum-Ufutu@wuznfB-#Y%cHc|%Wz=-~8Lo={_|4Un7 zvVb}TF`r;cfZ9RLn3R|_02ihJXy-Ae6lhrxq)PuC;dQJ0(irhg*<{?i+O^WpL0 zVc=2WJ;G!A?~+6uM1uds`=_n{YfJv+tMR|>{f`I#cl-aTfdi(XpGyDs#@`-5gQ4Zn zPG}3X3)%p!2JS$cp*7H6XyY~h+rI3d-nIDGn(7~a5MaN+|K<57-s>K}ws}21oOp|P z*LlzX(&B99?hKA+K-$jU!x3&_>3rug_;xV6qhM>oegDn_-Ukl=;QC#2%>w}YDu3P~ z5X#>F(EMisK%)8T>Z<-fG{t5BD18V{|Jwi1*n|OqJuJ|&33 znMMuJ1B?J07|#Ph2oM7v0WyFh00YzjZNLB=ua@9AcLdx3Z{Q6O2!w)f<2WD@NCUEf ze4rR81FC@rpatjvdVn9mC@=|*o@HPYKmkX<83Y2sfe=E-Ak+{B2s4Be@&Fz0yhlE0+A&HO-NCBi2QVVH;bU_9ozaaCFb;us%6a$JufI*Hy zhrxougCUIZ7()p|4MQKp0>c5r6XP951ja{In6PhCt(?na~nw9oWyq&^hQ9^aK+dlMM3?CKot@r6tJ|gEU?_L0f*_CJE5R>`-~X41{to8vbRNytd}NMIy3Bw-|l zBwZwHq&TE3q%x$Yr0+{kEeEYC ztru+;Z7=O19X*{Koju(rx;DBkdP@37^j7q-^iA~Z3}g(F3~+{6hGvG1I}~>w-?6^) z@y@q9sJpax8IpnY@{bm?oI< zn1z`wnG={hnU7gmSu|OKSgKjpSZ}c^uzIoLXJWuLhBEi9=>{*{BT^DT=<1>nDBQIERiQ7ej*JbC!#{4&Z1?a zzs0!35MqU5YvQcpX5!i6ixT%Fj3hE7<|OY(zLHFroRhjMWh9j;weX1Xk?Et{N2`z7 zA6q^C{CMXH?-R!-l~0bPMWubDzdnUNm3tcUv|ol)MqMURW=8g&tc7fmEJ{vL&P(pA zJeItYe3bmS0-b`1LV*HG@u8xR;x{D%rI$*HN(;|8o;g0NQ^rtMRE|-edd~dZ_IWi7 zfGNOYVAC&HUpTy|SHV_!p^~JsqROZ0t=jpL?4{w$!k0&CPt+pSCe_*0UDR7Oh&A*y z3N(&2pK3;H&S~*z`DpcM(`duBYjkjQG<0%x4s~U8<8+tx1oZ;-#`IbB-SxW+Xbh|k z8V!jJjSS0QVZG9PRru=M2xgRNbZD$#oNSCTkv2&%*))A*8f&_4CSewBwrVb69&Ns6 zAz=|?v2H148E?4-mxd?8cdg{D(yWdVFhm~W%39MJX@hI?%BI$q)D~g;&5qvA-EPpH z(>~CC&Oy{6&H?49u{qkH%I-C}@TKv5u3pkv^8kXTS!FlI13xc@!>`%mvLLrg=uLwQ5vL(juZ!n(ux z!as&zMVLqQM+!xze!%`<`(Z3fDk?vkB-%52F-AG2D)vrnNbEtJVO&?dKzv#Peu7KF z+{b4hYd$f3`ta#I(K2x~=}8hYnKt=-@^Ol3%24W~)RHv1w9vHEba?vD47rS|OqR^} zEbJ`Ttd(qy?9LqFoPu1M+|b;MJlnjveAWDK1rG}f3TX=?i!h2@iq=2teg0AWw78~( zt0V(Si46S$d~x}*QTnQMtW2q_wOqKoq=LC3xst3hqzY2yQH83ute&gUt{JRVtZl6m ztE;T%uFq?@+mO^q(HPl;-}J8Os@b#o@T>jTtrm-x#a6@C$u_OFk#8#B`rDP-zjw%X zv~@o2Z2m6sy`f9AtF~LXyShiHr>a-5x3W*Lud-jLziQy&K+O-4A9aJ`gH1zHLoLHk zhdV|TMtVk{j}DHhkNq6i8=w1W`g84<^{?Ft*NL;q*Hc(iA=5Xf<7a4RGH2Omk#jb9OwMw z1^Y$arPAfpmCepglf*A65 zz9#=S{MUZ*x&mB7043o1U1bYg-HZdkmuvuF0reB>0l*7F08kSFF!=fZ&3{Ayz{#8+ zT=9SjLICblux75V_Q5?HP7DBCe7L$g%e=a}$O88hQvmSQ_OCtYH8VE2-$+-uFt#zi zzWeX#ul*@V{U^r%UV@SH^9x*y{a?zfuK)=yMg)#56mk#1Ab~(hAXnc22GBPwa6tp6 ze+)q|pqNBdH|CIi}WtvV{9@NBb<8<6RWMNPxZ!pg?ZAs{I9P*_A%`l*bpoVik^ zVrph?VF|Z#a&~cbbNBG{e-{uK6#PCUIwm$QKH=l1#LTShoZP(pg2J-$ipr|$n%cV7 zwr}kno!`51YVEiMu; zE(}aeC??KzTo4R5FhfZ&vF`F=lRj3#F>)Zg_uvgK`ID%O(iS{MepM8OvEv{_2f$g3Io|qQZcH-eO>YT?GXbxYD~$*f`)~4NTyo>`%h| zlklz+xQ6;WU4cp<*OE{u7WjJu7aRAVs{i%!Y8pJCa=DrS2%r#fFhNNGDd2LnQuvwu z;-zn!+=0uwQl|cwYD3lwm(q#0470-`jSuZbzh)*^`Lq0Hxn^p8Bt62r4Q1k@aro*^ zBX!UO>K^l(Z6wMDzfY?_sYD8j$Q+1qJ(*?+uqeCRYpuuQNNm{s3BjCG+^ghRKUdd3 z#xO%)QC(FnqHm!n_DPm0aLf&V3Fgeh4lP|T>efp6W%uCq% z3cwZQ!3#>BekOKAQMc)`(dhQH!%;_g>bq!3ju*>j+yvz73sKFObMrbXPv)GQkL$v+ zM(0f9rBOLtnCE$2vp#JBX042Qi;Y{6!xAwCTE?0mTZOGgXqq=UmEaTa*8$PmBeKO?txw0K$ zcGZi(w%lAtVg}CfNH|S{CZ*e8_pD&$SOupi$4d$p75e-tar%@We?kAv{mLDR|<%fc+)g!Gzej-MqWS$oY%$Im!SQ zp1{~vqTlayw9h?B#YVyjW6B*elK_3|EEbSW3E7<;V7t{Do-?&gJ@at^VJ4)U z_Xr$nR-<%iGN$K?C8@{Xa|=Bj%V=n-9v9#ee<}$RFEzApqBHD zP^-J!hVWo39%bVK=6wxtU`QgGIhkDQme(p!u~bz(y=3-3=b#;kxRA}WJC7|)cv5I1 zbe`?+(|e7Z7?062qrTNqOyXJ?56&Ha7eP{l>@3`VFMv4bn7|NkIhXO&q;v{PVO6Z8 zaPQ{00*-dBfF*Uci(ibt1j-o=QXJh|#T~7UMNSYtdQFYBXw9kGbI#N+fx5&HpG=M3 zV|*sony$tDl7w#iBcslK1*a>(d%QY8HGr9_nIo;QyVKO9JK79)DqNeZUxDY%L2mwIkPaqpWNgaDfS>*BTWwd3K;MaRt zIB(_qU`$q#&3EQZM;^B1ez@lu^5O2odm^Irco&FVK^~3ojYOIYQo&O5^eE-SBRoG& zW3O`O&RS&u74SwV4VCIUq6Pb;Y@Zj+#+*Amn61|%kQCeyET#A z24}0(D>@>D2L7UR>3ZpvjRe&I+w79x328Y#O@<66Z;N%C(mW-5?i*@!^9koQ#3jsl z{oa1Oh%3%KCs#KEeS~zylbEB1UScBVh=Y7-;7t_phcusrjwSCk+Suv3Zg8no-+y{a z;%|_3W{6O6UtMHLK-qsEoYbADyiC_juYxrZ=lX00p}V|_t6RbuVW^Kid+w&&A z3E%6&CYmiQ_B^p+Rw9;_vU+|QGK*TRjhf4m#(9#UQ>N-0e+6*%EO|^H2b+y?xy(j- z7EDV8A7T$zIQyL(Rsz`cKPjZX7Bky=KlWNkF+0|^bf{{(dtwrG@&LNokK?)MXC+ny zBS1GRpgrc{Z-&LG^5k$I50;qe7a!gkukw~eJ4kf;pG%-3)~ob4_xuo>L_{=Vx1K*5 zu<4}r)GSxchQCsq7}E9NLEHGi{78CWJYiKw@xC8scf*^^OVZ$W3m1x$?agG_4w>E0 zx@@N!e#oT+1Z5aS>YTbgM;(XxvTDou7593Jr9Y{E6?l*A*d$kOr~&bnCLypv-394w zz59dD-AT3vA;Eo<7fB1XT+HaASh^J6&Fi#_)X7bn@52jB$VCvWW3X}b;C`R-q%~=D zkF!+#e8OW!;pP*wX}c%so5S%lF;Q7MPP=QXxwWp|&Nr{hCum-%dcnvmAMxAHB==zg zZIpM18||yp#2uRk8&ul-f#0r@p^}&_&$7Hwfo-0+=78h_v?0oHZZ%-*Ktl9X={KqF zTpVGIfWJsT|4i*{py=<{;x8Apw|)8GZW>57j2ZV95+1w6$|Hfz;iK~8WR3Vizqn3u zCeFuWtFamM-F+oT`;z5J3vR8%!JdYnvL>=U-vx1z=wV!-yvF&n+%v~pMZb(X<1uM1 zOX^Q2vExcOq>dIZq`jM=87yAh#d(t*VmVc$Tjw)+8l|J6PnA0PVpqK|mUZjcKxZ}*_SAYwH5~kIXc|15s*Kj>Sl#-LS6<^+ap&N^y^M{P z{3+L}l!Ms}@fnkbvufe&Ng45hSLCeR)@M;)7Xbw~f(JRBTnv2!$B5kq7cI5EG1dz8 z=LTt3yaz8rRu1_cj_;qQv@fx~7!8~gYK7Q6OO;z!X)6>*u!VWY)XEr~Tpn7jDU+fd z@@hrkRIa~`^a3N9j;r531t@Rfi{f7RR_>#d^-u@AyE*69u!_&)2HKSreyCQM;fjb6 zy^GN0t;CHec$G5r{A&zn^>OKl2GJ+0k|9L5JkH0FBMM|m7nAGzBdJElfMA9lq+x%| zi|}I7S(!?equSjXqHfReE@OLzh3KkSQl*6L=bn$Hgr?6XUsfewv~w>H+*mJixL-FF zde-Xa3d^gsoi)(cgB|JfFFo^Keeg)=K3s%|s8>TfYFJ_;>E5mWxe!ORq^jfle#qY0| zGal}OwZLwdt6Zone_IVO^q-E%Qi|$r64vI6VJ@wRN z(SIq_x6bj=b1+M3tDX6F$sR&ma^31IX*4S^i^n%6`Mk=&B1J0FTZABJ`$uKR@H>L0 z3V)4ZuHRHzLnYZ-`az$_E(TLa$2N%PliEod13L`J19mu*q74bG;uqVR*bEu_r0N_x zls|q#TWcY0qe_X%#p7z8+@FectxVzNh23<%FPlnS7_Y zj&$I%@b_|nmS15ltnpw#ajkOgkdEPbg63N?hdlXAkwx*XD5=n9o%nsl=pHq0`y%H_ z3+gLC-ChLK69bWsDk(yENOVNymmJhweCzh&rSqdX*+O#UZ8N`3vDGR5rBwclr5PEb zl(9aBbff7}N0fi_*3Qwl)X?K|EzN(`eZ0dr#j^qhgn^9&(iAfVn2M zn(gh69y9;M;qIj~;!Ck1Cq$*#XT2qYRfm6aENx@*HI+ML$ojL8CN?Wh7KZQfvK~1f zlD+c<68Cb)Q6=#TNOO6$E#{#(ZUFm!U=rkhE?&@gb`=!SH2%Eq@b#vo_VL<>fb(!ro94cz^QOkP^3X{(GTBS zIZ$GEO6G{Ol8)f%&F46Vp1WU0eVTOTNVr^A4kl5O;lr^GjybRePh|hBLRB4_nm z+8Y|pP-p$wiJ4oU=xv&PqWSj$(UB&mUCc}FFQvQ1Iaxk+dsu;6_g4F4Z}pfARZBAb z($#Sv&_Mf{J!rrGslFnrHbNI(Yr6W@p@TCP7SePFO|f8(O3ipxoNZ7pz;*8mC?fnp zw&hVGn%Wbk{!MW(p>ATGZLR5GbU-$-pnu)S#Dm9^{qSA2At#AD>zvO_+)C8g1}UT;yP~hp~pBA918EMeZ(#`9; zFH0%2LmeTN zbD)bhtwz}<SRdA*G2CWBQ{90}e5%Vy_XN-EAFyWF>hCTFzC&quqta5X3=PQwp1Eh=zSxz1Pu? z^B|F;kfN|;b)~*qM_Dl$Lk}rN4#C~DFja&P??vXcDF2t)PJ^JmLR8m+ggE9d?YBt_ z#ACuiZX@?drYF0~=H)w<>DpZizr@YZ zv$r*-3`lC>y=>r%P$_P1@1y3PT%Q@p=UL z-Qt^`yaKX$OfG+vWN^*O&lXPDojs51dOq}MYLN~_Xg2#x3vR$wxtkjvSKc_m{IZi2 z<#Zr;5tC`VHkc05{_b4d3m$UGeJ7kMQBMw-f#S`rg&2 z+~cHj<6;q1&`s?G$G-V(_7%@nf&%^yI!U7+e84&NISav<@MT&93u`$<8?E zh#p35XGG8Kc&4TVr$DJ0ZBO60-%Wz$XPSZ8(c%deDlBrt5{UTf+TgJIHLnxnqhCIr zJX=;xR#!j<&g&hfCe)NeS64uo_wi)AD{j7MM1v*-HMY)De)eE)N9FEmYUNr)US`OC zQD=OS+{iKo-7^Yqi{j#A{(*C~qMXfB+oD_DU3cC^4HN1n9!0`GYxxA!B-q|Or7@(M z$jzBQnSbx+L9%ZmxscE%nys@Ei8a?T$2)b5j8|htSWF1`Y|h|^!%CUf$X zxmQK+|I+VD-w3bTbm9Q)^CUP++?mFlD?I!b7y7CMe7Z-|=-jP1Czt9gE=DqhjixUv z2YylxfXma4D0u`J&RF`8*&vC74-Z!<|5-KH8WN#mc0{9Pbh;cFphBG`a)Ch0;i zeenG(dn~6vC0|Rv{KCAON#ouiUag)xg^6B{Wto1ZqnB!kjRk|jk6 zFJNTgp46*!KqEQ&D2kQG=}TG3ZDG!z>K_Ez@9mjQgt#;N5W-spJjR!p5~vqGXTNxA z-%#vXf#MSUJtIMPEX=C0v#s^^ws7ocUdMNYQ%*1Rs#AC)SSHEE(>&vKKl*#fd!m#d zM@pI)*?nh>*_P#Klr%I7LMN57i%q{HX$W#mYw|e4Mh=iXJ`x`2ee}KP2CZxG%~x}d zR>C*4Dtq6ZPZ1%kC3sBZ9@bUQ9iDwps%MO%vYb4}&ee*oWkPWb{2D3fR23W9#OHWp zu!5hoGJd+z48`Mn!~1n5rsoQfS{hB`@*B7UN+SO%8e>x88k+YnmFW#n!0rC$6U3$8 zg|o+>D@6B?#Naac^4_x=h;LrK0>fwZDpu{`M^6A6P!2vZE9x#zWgW0P@ZA76}e-$WQ|2K{~EbX`Y8g z^T~ykO}Nr>>J_khn2!6FEf4ZjEdxuOSP=+gEfxnv)!yLc1z@~p#Dxj60nRxE6k>^h zRe>Pyt%VTJTn_<&V>L!~P!YoNnnIH$HyePwQF;VWFXTa?oY+v>Y8GrD2yzCG4pi!{a`{Wkm*ux^PcF+X6EL1*7w}Kv}eH zODb!2>h#4&+T7}j-f)S8t||K}UHKH(aRnPSYIB_MkL}K(66h_8-{SsPkbPYK# z+MPY8OF6ScP`xC^f_oao+$g8O;97zX$E?5D_%6@v{@Gje3c%sM0$P+C}Ei51-xAWZ74M`GKJ@P%a7>EpM8(3-bW7|ZGO4T;$A&P^SocAww0ULyt_;HIoXbS z({Nd4ZWb*Pbcv6chtGKpkhJ7?lFntL3Z{3Iefm(7mqd#f1qXiRGP_i*6XqrFFH7T| zS+Qs$=qs6!m!ACRozkXpgGd(PJwfKZFTRZ&BMYaW6a(aUB4>>5rN*9~?0-$8 zKBrhb!#!lc+!WFot$*EpbHhyXy}=`WM^3MW`1f=S>d^! zFE7OS4pd|?@Yyn7|If12)sM>&F1ySxiIeT|4~W0?VmxoGR&P}7A5ET~urR#>ge2p> zp13s;#~maM%&d`9)!Y4YR|NTNxU!K`YuuSmn66wI!5r3hk$sE$ zbetj^?cmILrYx)oC@eh)TO_Q>$3Y^R=Wbf-Sj8^(BAufZxcgkMh)z!JQ z<0;j0p~Gc2e?Y|-Rk!ho=?X9VoM z)8d2hHK_>#wJ`PO$STcv)H*#=*^_bCzS`C+fZXVf$T?>ojzSLvMy8B_#r5=y_X%G< zJdhcWE{ao)o)I!!aTc;ynokSfbvHoyWzO;sSUG&PcEs7#p;D;~8){hW(W~H3dzKc} zj9ag$W@%NVOFA9vQvm^c>J0t_&4E%*OE2O~2E~Fy%0d^JDy1$ISrk zSM!|k-n3)0vO^fkJcMu6KCE7KpxPOix5HZAN}$YR$N%^v@;5!7 z)}Xt>-0R|;mVil&m$T3>#Y<(?)x7XTFPjMH%J-RU&E|ld_wRJuxin^6hop*12Qjw` zC~6%_S|6Vj&$Gae!^Py;`MWp78wctoD-(<@QpKhbAIyF7C4wkKH;!nqKOEB(L8HDJ zDBJkkI)&=yu^w~k)vCXU6v);I_37RC^;PpungLvp&T9C1tr_3R?=WkMRysqyUAhm| zsB;4~v-jLn4%<3)E={F5F~TzSubxDACZ~BG@P1TkQP|n?sN|>anaWNr?Qs;(9t4p5UE8yD|5G<-*8?W?<%bU}JosKCg zq-WsAxSLZUJYlx7)4$=aMdg+xy(NzelSN({sl`50>LUJ-PQjPLU3KwW&nK5YV^E2v z$mL-Z{;EWTlfmsP0Iwq_*Zp_LECupK_Cy%Jw$7Vrz2(Ns-wcYUitZ0pUEs)a%7n`g zSHO)+*4Y;ssuV>p@{nbr?|fZ@meLlSr0@>bB}KiR(^ST^t^kXTiKLk(4{U6cw6jHO zWc4}quF$yZ;JM#!;OG;s(IwwoL%`C7ORi)zL_e)5pOfb2A za?~7jC?H+Xu=yk}3F5gcpcU@;^6bf~Zli=-#r?F)N#~GV&qr8yFeKL!Q5a zi<>#6d$Yc=6)ft!>>PF_2-VekP%iIBl2|<-85|1QCG>uTKK@*_c?FPeM8gw#CA^V! z*=}DM*AsuD2~i~sL6?-xyT5=LEA6)v=F4#_kUWut?}BqOk7aEeY{%PHAMP?p>6%v4CI3u;VgNO>fgSak|UzU93np3n6NU1$n5>Z;wp) zV2ldR5`TSX_}$kybeM5UO|z}ru%Upndt9aIy>oS1R8R2N9ugJJ0&S;C7t9Hjs;=f0 zM4nS7YI?b|?K(z!(jgYA8Tv#iN#UmBc-SMUX{6l`yNdB4uEUer{?cX^@ROiKio2?h zm?qx>8azeh!cjtJpuQ4wfDdK)H?p^~h!!W3P>uISDt!#+OLE0)T!Nb>t%+~zIlWnP z-`0!Mvrw9FovmHfG#HC6M)kp&r|G=lq*Lw==R76VA8nT4cVdsj?BAbqMP^GjN!`r5$ty|ihtyep=V_h;Z02k33IJ@5oFFq^!B-v-(mnM+L z0?R1zlMA`MN#ZJ62R)n+O^*b>74GV<&AmDarB&tYD~_pL47~u zIEn*q>q2~UYJgR!>Xyvv@D+emU9aZVo7Q(Pn|G?__;^4O&M@JehIt>id7a9U-Ycc^ zoWsV|$S7AE?b&OtEo<6o5^)&IPvQTLPq1JkVT{(RA6Xw1bWuy5*5%(;H?*ueJa;0! zkkFe4FA!YG5M0N~TwOlZ(9bEJsm=F;Z`#EM&tB+9l@sYfpUnFyaU-F=YZepsZ zpl>Zzyt3A8sPZRPL&(>q-9DGo>OgUcg;3_`srzp{WNBafAd+@9+ggfr-^WHdrtwM5 z90{(}X$FhK=8Iow2S>EJZcDjAqy0FJ#}MJ&vqx@ZFI?D0(B`quFqns~f-hS@U`}wO zHRg#G*W%E$we#NXa2?J8+)b`!Lv5)~CVW!vM6Wdjer(WGmbp(%op{ETQdYCia=3d= z@5&a#KPPd?0(Wbx?Z5jxJ}%TT?Q$t8i)PeC4fac|=ZoO%w%cn2u#YXhyqH`L$)71^ zJ}VI0?8Di4I3^ibG1ZtR8rd`Kvd&td`)%CGDwRQW`D1$rC1*{i0Wl#ualdL5S?r<< zqtH#(75ceDbyk)!cX_X|NXv^W%4%2c?7iP0lAH+AKPr6gWWZCfzPB#PNYC(Lr>x0X ziC%VT-r=z1IeXgzyD?*MXhlp&%-V!PE28`P@#QhUSIVzv>*}GoqcJeQLao8W86o>-28Q8t8Y#;^OB4TjP3V3HVQ`d#x~t<3!P8J z_~v&)gHuF?^Nuo{8^PBWOW5q&8Q$9ZAzN|Ak`H^ozL~y>Jg>kRUN*N1@ z{|5Pi(N~IngHPp8hK)z>Tmg~cqUP^m$C)3N7}gC2(h<8e>w{JrtM(Cg2k$n+&NRpD zg%GN_c&{8tSCSdCyefxg;;S>C^nI}p_t4C^E&T~Tp@Trrj-X(8`hD{Q6kP?)7!%tM z8RXO6<7^rvE!qfAp*hy?o(u%pJ>BJTLh!9J1R{E^?{g!)T?*Dn-f-x(GmR}Bxb({( zw>yu`uz?Q`|8Jf>w^Q!TaRsbkyVlNONHi)--j0bNa#s*z>vm{P*=ZJNBvxXO;V8|o zgd1Ms^zOrgXULj<2rA!Rl=8RL@wq7%U33L-&s}UCEi|%>FLt)t1@{oY^L8+=4u3t^ z1aPO;o{saESaG3n)MB3PiqgTpO5U4#w#Z$z-1$TVAkl8RiAJEnRiY{k2SIgH`@xP6 z%eJ1mCDX}ksb?t8A8JLdd0gD;=ct6%)g?O~BVA(rkM-+*7Q(-K%nz&jd1Rd@raRkG z?m6JJh2OfUY*MS~pG!Zyb>W9!>X85N%{k%2Q1M5Ye65$ycuNhQseWmFETq_}z={V^vfMNmT>DT5G^dS7{@nRI8IxfT_emg`O|XCzr#$k_ybXTOvP zYv$tu|5WPh=WR0ipw1?~!Gkm5hI+Q#i2imji3U?@X8QI$MBlyUk;{ADMq>gznEXoF z1$*4cAlYyt>NmgNfaln#VYSF-V=ljgHB_vJy(RG1>zwUc?s)hAJY;04`7-q}WH&%T zhj!AV*r2hvsClAH;(kYp;w@iG*+W{j>WP=bwx_>zbABx|R4|0wh&$~TiwkBcTt?1! zsC~Qw?0Fc9z4x1}iC^Ya8u1|c_g zH4`>`f>8PW-t1;2&mYx{+1k3W9tXb}SU31(;sEzppd(Y&oV3Z6;To}+Mfim~?5+=@ zjS+p4y--U3Y-wZv>Q6ibIL(5t8y%Q_TSXebh{Cf!F8h9pHcIyK(p>*Z@Q@kTs7?vi ztl`U$w6J09Rj`v5Cacme6|xHH@~dqZ3*_g4vXswBC+TUS(CYZ@kHD*h1nA=~_!%*99# z2IM$ZcJp`G_~cw}jx1?nor3P3ltAxVe~QOoo0wRw8e%|~r$VR{!<-x&D_H)fF?-`b=W>y_6r@-Zd4bWALxF>;w6Vs6f>E^kk);8+aTV~+H$L29T^P#r+KL+mh zZ$`Hlo<8Y*hk=On@<6d>oQqsn9&v~#id5RD8skc#EIkYy4bj-y2ei@zT543IKZ`(gmw~)O8URPmxi2_Wtno(%1?${Z;5iJn~b&W!IiYUiM=7`Q`qGy*d?t9@nS5 z!U^3CQM+G@%N=yIZWJrNcTnqf;Vz+fwA#M)tRZU48e^1A@(jX0)}2LKji&Z&&CS3! z4-foM;7UU2xQqo)aa_3x`5&WAXHQrD#w3$9V=*f~5+YZ*+_ioMEzUF3zH< zZ(~+|D~LUpG(9?1zae(p<3WBsbIYb7nW%8c11%5jE*qchdc)d{x*yRiGO`tBCkIEj z!}Y6t3%;ml+-7EP~I>PV4ux z_bE+3RcWbIlT20(;9DAL8TQV+%^$jZ_BS$R-n<^4rdCwV*Wi0d}xXKNiHE@x8BpB2_R zrKOfXDvHf3=`7PP;uB8#QjEegTYho4u&$jtq;|gBxqgdCedA=CKHm$ z>Qmb1V&xGvl5yvceJ5v8x;&F!N7Kv;jm zm7a`es~5;CU~bOv=j|iyhlwxUKcK61stK@CKLv(~9$Bo9HOIjw+AfJoFN!W%a>j$2 zAn>u7o5Rz;Oj5AV-UdZzjqit}?2b$>vi#t)WOA9_%&3ln1*OS^j>>~>|>h{$yc2*3|V9>;iOq5-#6aAj0|2?H zDj~_IG1M;HP8sZ^d?*!vBMmKZe2Ew8V1CqvU3&Y=e0$6H5<~Fp$6vv3E~)xd_viY! z=xFx0uxBh&vZ5$i5#;8>Gf94BFGz^Q5RxCAysLRmU3<-vAt(NKv zT5LYQ4LXh`jpn~UwC+n0`t2yn^u6;h>3HZxjK5*@ETx}G^F;HJYvY+zI}av82Z|J1 zuKK`pae&Qv(VPUkBxf?Ofl;4xqF5t8Cn@hXg_?ZUt!ata!TjKxnQ&L-^J&^b9Ln%$ z@S?!aBE?(+Ht!ZDD8XWhdqV1_(rKK%(427v{JMQfRCrO?M6K7JbvY<%)*LP{8!Hed zUK9YWF&b+wK~8jD5{`m%$HsRgfl73`GeBydVsusG3Q!n=Mb}TFLx_ktPh2m`{pJRF zCWz;A0%k*{%oxa|7jFxb*R3B*ch}ucLM(wbfn5)2A0D4IT` z-lM-c&Vo-EU)XZ9cB{;J)3BzFIK1M*xSLC{b%C=;TkU}|^gZJ%A6#MNt~Gk}jMsO_ zudMog(o=Nbyv@tj@ej4?9t+M-)W9>oMVx(PeKYt3KeG@Z`ne1g;5pJ+5_>5+T;0iEM(pS9^W+Q=6G1ZvU+&cq@(FHgf!kSI}CTf16 zVGB>&z8Y{ObKKfVx*&xUn>h`$jx}e6<8)AphG#!K8p=lXXDlYN5JlwG7_}6~z)V7% zm#N^4!})1|IN?#sjfex=0m^_M1ROK%hlJPjE48O;4nt= zPXzvU%q^`4;xA*CN2*_G5cnEc<(rU-#0K2xUo>FY=xgs{?z!KZ`YZ;^J8_)lff)u~$zRBJ8=PmO-U_ZC+^r^*-jAn0a^&3k{jQnd zl6TF}Y?S9Pp`yy^tVhAuDe}1|xV>$rTPznjd+6_aX*ts~c6J__v_OBebs4o9!EAV9 z);#B9?>VHJ{;KGdMAP1H)Q?;4zSh`xE zxEE?#Kg69=5$5l||5h{~nOT{HM^I3x;~=h7&6q*av5`oa_WmwS--k(2!m<*F7{jz( z9O8Z#a@3H)*bSL66@9Y3wT53Ft`Fn9L~JHA`n&SwJgm};si&t;Ly8#Tdzlm8we?}W zo@37KGA-4$hBI=<>h3F?6KD%W(I zh9tjduHc9fKY{7w!56q}arSIpy3TycJ~J(p$=MS~HGD3?DPt$lV9JxQLF{=l5u=*F zG0%A>P;I#6%DGqKo~yu}Q#89(jdT3Y5$Ew?3FAU|@ig-F&h&%5r@IXSo+kI|-EG5L z*z-E%ioARUH9O*27Qdcm3+-VO+irDxMi;v0J&!4n^xU^Q8?sYNnQ{?NUZF+n#7@jS zIKQ`zPL(EXO2~9?n0oS1K_bLTqpiji_`;ww=TaXi$#yvrYVWUB8$QnX&hbIpK}mO; zQvIkik{F#j-8o@n{WK&CJ&4nrClz5u=({kk`RRc0J}1`!1LBLH_M0AL=`F@}gR#3k z8&eS+-%R>o&eLNtJwKw|Av3lvV^9$s*J-_nh9_e#Q_{6|(@zAes z+w+FEtX%m^X16x?z7xBfuSz{q_IbJZE^r@KUY9^jzUSdVhcBA8X~=}g74eqKagWxf zxHI-YNPEwqCZn(IH#StNAV>$LccgbBBE3oPL_}&R(tDyJAYHnGfRxY!QbLE&5fG5x zOX!`18X&}z|MR@_p68r7@2B%2Gs(=p_w3wd@3q%&UDqx6|598z)1P&zu62E zheD^8M|VLO-`nZcDTLg%oeb;Y^u+r~jhAWc_rzP*=MG8TbKr4+yeTv-{qC%&rKY$3o=uL-muC)&fk^hzON9N~rHTMdLof|nE8uiIh> zsfh7)YCcU|oJ&)7KdRMY?rMym_UjY%^WK6j{+XPh(WzScjes*|o4G9!N^f zd3BlCMQLnF?S;mPNKcS%0*2SOO#hC$prdjul9_+|SBSD^!4pCv}4O2mL&PjjkeYir9G@Ee2RuQYu>4_)^CWv$`ATAIEK9h$AH%aTsf z92Pf)`~$cpU!)s^RPpSJE$>)QmKv8y8yF`cQEqXi{X8cc``l58up&-mq&CAr|JBv6W=XUT4O%weM>wDtp#M{ql@~@o7{Fgt2)>! z{CT6btSNT@qnZsrt$Ayhd9<9h5ZAThD!Z4Sv_w8lU1XlkOLwEdeKiHI-nN*B5ua)^ z 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 z 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 用哈希表解决了[两数之和](https://programmercarl.com/0001.两数之和.html),那么三数之和呢? - # 第15题. 三数之和 [力扣题目链接](https://leetcode.cn/problems/3sum/) From ffbeed09713707790b81a1239ffae7188b885bae Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Wed, 24 Apr 2024 16:55:33 +0800 Subject: [PATCH 2611/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=8E=92=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 17 ++-------- ...44\346\225\260\344\271\213\345\222\214.md" | 6 ++-- ...36\346\226\207\345\255\220\344\270\262.md" | 6 ++-- ...11\346\225\260\344\271\213\345\222\214.md" | 6 ++-- ...27\346\257\215\347\273\204\345\220\210.md" | 6 ++-- ...33\346\225\260\344\271\213\345\222\214.md" | 6 ++-- ...4N\344\270\252\350\212\202\347\202\271.md" | 4 +-- ...10\347\232\204\346\213\254\345\217\267.md" | 4 +-- ...55\347\232\204\350\212\202\347\202\271.md" | 4 +-- ...73\351\231\244\345\205\203\347\264\240.md" | 4 +-- .../0028.\345\256\236\347\216\260strStr.md" | 4 +-- ...00\344\270\252\346\216\222\345\210\227.md" | 6 ++-- ...00\344\270\252\344\275\215\347\275\256.md" | 6 ++-- ...22\345\205\245\344\275\215\347\275\256.md" | 8 ++--- ...7.\350\247\243\346\225\260\347\213\254.md" | 8 ++--- ...04\345\220\210\346\200\273\345\222\214.md" | 8 ++--- ...\345\220\210\346\200\273\345\222\214II.md" | 6 ++-- ...2.\346\216\245\351\233\250\346\260\264.md" | 6 ++-- ...\350\267\203\346\270\270\346\210\217II.md" | 6 ++-- ...6.\345\205\250\346\216\222\345\210\227.md" | 6 ++-- ...\345\205\250\346\216\222\345\210\227II.md" | 8 ++--- "problems/0051.N\347\232\207\345\220\216.md" | 6 ++-- .../0052.N\347\232\207\345\220\216II.md" | 6 ++-- ...47\345\255\220\345\272\217\345\222\214.md" | 4 +-- ...01\350\247\204\345\210\222\357\274\211.md" | 6 ++-- ...72\346\227\213\347\237\251\351\230\265.md" | 4 +-- ...63\350\267\203\346\270\270\346\210\217.md" | 4 +-- ...10\345\271\266\345\214\272\351\227\264.md" | 4 +-- ...\346\227\213\347\237\251\351\230\265II.md" | 4 +-- ...15\345\220\214\350\267\257\345\276\204.md" | 8 ++--- ...\345\220\214\350\267\257\345\276\204II.md" | 8 ++--- ...0.\347\210\254\346\245\274\346\242\257.md" | 6 ++-- ...14\345\214\205\347\211\210\346\234\254.md" | 4 +-- ...26\350\276\221\350\267\235\347\246\273.md" | 4 +-- "problems/0077.\347\273\204\345\220\210.md" | 8 ++--- ...04\345\220\210\344\274\230\345\214\226.md" | 6 ++-- "problems/0078.\345\255\220\351\233\206.md" | 6 ++-- ...47\347\232\204\347\237\251\345\275\242.md" | 6 ++-- "problems/0090.\345\255\220\351\233\206II.md" | 6 ++-- ...\345\216\237IP\345\234\260\345\235\200.md" | 6 ++-- ...11\346\220\234\347\264\242\346\240\221.md" | 6 ++-- ...11\346\220\234\347\264\242\346\240\221.md" | 6 ++-- ...70\345\220\214\347\232\204\346\240\221.md" | 6 ++-- ...60\344\272\214\345\217\211\346\240\221.md" | 6 ++-- ...02\345\272\217\351\201\215\345\216\206.md" | 8 ++--- ...00\345\244\247\346\267\261\345\272\246.md" | 6 ++-- ...40\344\272\214\345\217\211\346\240\221.md" | 8 ++--- ...11\346\220\234\347\264\242\346\240\221.md" | 6 ++-- ...41\344\272\214\345\217\211\346\240\221.md" | 8 ++--- ...00\345\260\217\346\267\261\345\272\246.md" | 4 +-- ...57\345\276\204\346\200\273\345\222\214.md" | 8 ++--- ...04\345\255\220\345\272\217\345\210\227.md" | 6 ++-- ...02\347\202\271\346\214\207\351\222\210.md" | 6 ++-- ...00\344\275\263\346\227\266\346\234\272.md" | 4 +-- ...\344\275\263\346\227\266\346\234\272II.md" | 6 ++-- ...01\350\247\204\345\210\222\357\274\211.md" | 6 ++-- ...344\275\263\346\227\266\346\234\272III.md" | 4 +-- ...25\350\257\215\346\216\245\351\276\231.md" | 4 +-- ...60\345\255\227\344\271\213\345\222\214.md" | 6 ++-- ...25\347\232\204\345\214\272\345\237\237.md" | 6 ++-- ...62\345\233\236\346\226\207\344\270\262.md" | 6 ++-- ...\345\233\236\346\226\207\344\270\262II.md" | 6 ++-- ...4.\345\212\240\346\262\271\347\253\231.md" | 6 ++-- ...06\345\217\221\347\263\226\346\236\234.md" | 6 ++-- ...25\350\257\215\346\213\206\345\210\206.md" | 4 +-- ...57\345\275\242\351\223\276\350\241\250.md" | 6 ++-- ...\345\275\242\351\223\276\350\241\250II.md" | 6 ++-- ...15\346\216\222\351\223\276\350\241\250.md" | 4 +-- ...76\345\274\217\346\261\202\345\200\274.md" | 4 +-- ...14\347\232\204\345\215\225\350\257\215.md" | 4 +-- ...70\344\272\244\351\223\276\350\241\250.md" | 4 +-- ...\344\275\263\346\227\266\346\234\272IV.md" | 6 ++-- ...13\350\275\254\346\225\260\347\273\204.md" | 6 ++-- ...23\345\256\266\345\212\253\350\210\215.md" | 6 ++-- ...7.\345\271\277\346\220\234\347\211\210.md" | 8 ++--- ...7.\346\267\261\346\220\234\347\211\210.md" | 4 +-- ...2.\345\277\253\344\271\220\346\225\260.md" | 6 ++-- ...76\350\241\250\345\205\203\347\264\240.md" | 8 ++--- ...04\345\255\227\347\254\246\344\270\262.md" | 6 ++-- ...73\350\275\254\351\223\276\350\241\250.md" | 4 +-- ...7.\350\257\276\347\250\213\350\241\250.md" | 10 +++++- ...04\345\255\220\346\225\260\347\273\204.md" | 4 +-- ...\345\256\266\345\212\253\350\210\215II.md" | 4 +-- ...345\220\210\346\200\273\345\222\214III.md" | 6 ++-- ...02\347\202\271\344\270\252\346\225\260.md" | 6 ++-- ...27\345\256\236\347\216\260\346\240\210.md" | 6 ++-- ...54\344\272\214\345\217\211\346\240\221.md" | 6 ++-- ...36\347\216\260\351\230\237\345\210\227.md" | 4 +-- ...36\346\226\207\351\223\276\350\241\250.md" | 6 ++-- ...54\345\205\261\347\245\226\345\205\210.md" | 6 ++-- ...54\345\205\261\347\245\226\345\205\210.md" | 6 ++-- ...43\346\234\200\345\244\247\345\200\274.md" | 4 +-- ...15\345\274\202\344\275\215\350\257\215.md" | 6 ++-- ...00\346\234\211\350\267\257\345\276\204.md" | 4 +-- ...50\345\271\263\346\226\271\346\225\260.md" | 4 +-- ...3.\347\247\273\345\212\250\351\233\266.md" | 6 ++-- ...07\345\255\220\345\272\217\345\210\227.md" | 4 +-- ...53\345\206\267\345\206\273\346\234\237.md" | 4 +-- ...66\351\222\261\345\205\221\346\215\242.md" | 4 +-- ...11\346\216\222\350\241\214\347\250\213.md" | 6 ++-- ...345\256\266\345\212\253\350\210\215III.md" | 4 +-- ...64\346\225\260\346\213\206\345\210\206.md" | 6 ++-- ...54\345\255\227\347\254\246\344\270\262.md" | 4 +-- ...30\351\242\221\345\205\203\347\264\240.md" | 6 ++-- ...04\347\232\204\344\272\244\351\233\206.md" | 4 +-- ...06\345\212\250\345\272\217\345\210\227.md" | 4 +-- ...10\346\200\273\345\222\214\342\205\243.md" | 4 +-- ...3.\350\265\216\351\207\221\344\277\241.md" | 6 ++-- ...55\345\255\220\345\272\217\345\210\227.md" | 6 ++-- ...66\345\255\220\344\271\213\345\222\214.md" | 6 ++-- ...15\345\273\272\351\230\237\345\210\227.md" | 6 ++-- ...11\345\222\214\345\255\220\351\233\206.md" | 6 ++-- ...64\346\265\201\351\227\256\351\242\230.md" | 4 +-- ...15\345\217\240\345\214\272\351\227\264.md" | 6 ++-- ...55\347\232\204\350\212\202\347\202\271.md" | 6 ++-- ...25\347\210\206\346\260\224\347\220\203.md" | 4 +-- ...\346\225\260\347\233\270\345\212\240II.md" | 6 ++-- ...06\345\217\221\351\245\274\345\271\262.md" | 4 +-- ...20\345\255\227\347\254\246\344\270\262.md" | 4 +-- ...77\347\232\204\345\221\250\351\225\277.md" | 6 ++-- ...4.\344\270\200\345\222\214\351\233\266.md" | 6 ++-- ...36\345\255\220\345\272\217\345\210\227.md" | 5 ++- ...4.\347\233\256\346\240\207\345\222\214.md" | 6 ++-- ...4\345\244\247\345\205\203\347\264\240I.md" | 6 ++-- ...55\347\232\204\344\274\227\346\225\260.md" | 6 ++-- ...\345\244\247\345\205\203\347\264\240II.md" | 6 ++-- ...42\351\202\243\345\245\221\346\225\260.md" | 6 ++-- ...13\350\247\222\347\232\204\345\200\274.md" | 4 +-- ...07\345\255\220\345\272\217\345\210\227.md" | 8 ++--- ...\351\222\261\345\205\221\346\215\242II.md" | 6 ++-- ...17\347\273\235\345\257\271\345\267\256.md" | 6 ++-- ...72\347\264\257\345\212\240\346\240\221.md" | 6 ++-- ...\345\255\227\347\254\246\344\270\262II.md" | 4 +-- ...40\351\231\244\346\223\215\344\275\234.md" | 4 +-- ...66\344\272\214\345\217\211\346\240\221.md" | 6 ++-- ...36\346\226\207\345\255\220\344\270\262.md" | 4 +-- ...a2\345\217\202\350\256\256\351\231\242.md" | 6 ++-- ...47\344\272\214\345\217\211\346\240\221.md" | 6 ++-- ...24\345\233\236\345\216\237\347\202\271.md" | 6 ++-- ...11\346\220\234\347\264\242\346\240\221.md" | 8 ++--- ...27\347\232\204\344\270\252\346\225\260.md" | 6 ++-- ...22\345\242\236\345\272\217\345\210\227.md" | 4 +-- ...27\344\275\231\350\277\236\346\216\245.md" | 6 ++-- ...\344\275\231\350\277\236\346\216\245II.md" | 6 ++-- ...00\345\244\247\351\235\242\347\247\257.md" | 6 ++-- ...55\347\232\204\346\220\234\347\264\242.md" | 6 ++-- ...22\345\205\245\346\223\215\344\275\234.md" | 4 +-- ...14\345\210\206\346\237\245\346\211\276.md" | 6 ++-- ...76\350\256\241\351\223\276\350\241\250.md" | 4 +-- ...53\346\211\213\347\273\255\350\264\271.md" | 6 ++-- ...01\350\247\204\345\210\222\357\274\211.md" | 6 ++-- ...15\345\255\220\346\225\260\347\273\204.md" | 4 +-- ...55\345\277\203\347\264\242\345\274\225.md" | 4 +-- ...36\347\232\204\346\225\260\345\255\227.md" | 4 +-- ...17\346\227\245\346\270\251\345\272\246.md" | 8 ++--- ...71\347\210\254\346\245\274\346\242\257.md" | 6 ++-- ...27\346\257\215\345\214\272\351\227\264.md" | 4 +-- ...34\347\232\204\350\210\252\347\217\255.md" | 10 +++++- ...75\347\232\204\350\267\257\345\276\204.md" | 4 +-- ...47\344\272\272\345\267\245\345\262\233.md" | 4 +-- ...31\345\222\214\346\210\277\351\227\264.md" | 4 +-- ...04\345\255\227\347\254\246\344\270\262.md" | 6 ++-- ...54\346\260\264\346\211\276\351\233\266.md" | 6 ++-- ...\345\272\217\346\225\260\347\273\204II.md" | 6 ++-- ...77\346\214\211\351\224\256\345\205\245.md" | 4 +-- ...61\350\204\211\346\225\260\347\273\204.md" | 6 ++-- ...47\344\272\214\345\217\211\346\240\221.md" | 6 ++-- ...04\347\232\204\345\271\263\346\226\271.md" | 6 ++-- ...70\347\224\250\345\255\227\347\254\246.md" | 6 ++-- ...04\346\225\260\347\273\204\345\222\214.md" | 4 +-- ...60\347\232\204\346\225\260\351\207\217.md" | 6 ++-- ...70\344\272\244\347\232\204\347\272\277.md" | 6 ++-- ...73\351\207\215\345\244\215\351\241\271.md" | 6 ++-- ...\347\232\204\351\207\215\351\207\217II.md" | 6 ++-- ...61\345\255\220\345\272\217\345\210\227.md" | 4 +-- ...72\347\216\260\346\254\241\346\225\260.md" | 6 ++-- ...41\345\255\227\347\254\246\344\270\262.md" | 4 +-- ...77\347\232\204\346\225\260\347\233\256.md" | 8 ++--- ...21\347\232\204\345\237\216\345\270\202.md" | 9 +++++ ...60\347\233\256\346\216\222\345\272\217.md" | 6 ++-- ...27\347\232\204\346\225\260\345\255\227.md" | 4 +-- ...21\345\217\230\345\271\263\350\241\241.md" | 6 ++-- ...55\345\277\203\350\212\202\347\202\271.md" | 4 +-- ...30\345\234\250\350\267\257\345\276\204.md" | 4 +-- ...57\345\244\232\345\244\247\357\274\237.md" | 8 ++--- problems/toolgithub.sh | 34 +++++++++++++------ ...11\346\255\245\351\223\272\345\236\253.md" | 4 +-- ...46\347\235\200\345\233\236\346\272\257.md" | 4 +-- ...21\346\200\273\347\273\223\347\257\207.md" | 4 +-- ...06\350\256\272\345\237\272\347\241\200.md" | 8 ++--- ...00\350\277\255\344\273\243\346\263\225.md" | 6 ++-- ...55\344\273\243\351\201\215\345\216\206.md" | 4 +-- ...22\345\275\222\351\201\215\345\216\206.md" | 6 ++-- ...77\346\215\242\347\251\272\346\240\274.md" | 6 ++-- ...54\345\255\227\347\254\246\344\270\262.md" | 4 +-- ...30\346\200\273\347\273\223\347\257\207.md" | 6 ++-- ...22\346\200\273\347\273\223\347\257\207.md" | 4 +-- ...06\350\256\272\345\237\272\347\241\200.md" | 6 ++-- ...07\351\222\210\346\200\273\347\273\223.md" | 4 +-- ...14\350\241\250\346\200\273\347\273\223.md" | 6 ++-- ...06\350\256\272\345\237\272\347\241\200.md" | 6 ++-- ...36\346\272\257\346\200\273\347\273\223.md" | 8 ++--- ...00\347\247\215\345\206\231\346\263\225.md" | 6 ++-- ...06\350\256\272\345\237\272\347\241\200.md" | 6 ++-- ...06\350\256\272\345\237\272\347\241\200.md" | 9 +++++ ...06\350\256\272\345\237\272\347\241\200.md" | 4 +-- ...06\350\256\272\345\237\272\347\241\200.md" | 4 +-- ...46\344\270\262\346\200\273\347\273\223.md" | 4 +-- ...04\346\200\273\347\273\223\347\257\207.md" | 4 +-- ...06\350\256\272\345\237\272\347\241\200.md" | 4 +-- ...37\345\210\227\346\200\273\347\273\223.md" | 6 ++-- ...06\350\256\272\345\237\272\347\241\200.md" | 6 ++-- ...06\350\256\262\350\247\243\357\274\211.md" | 6 ++-- ...27\346\263\225\346\250\241\346\235\277.md" | 4 +-- ...05\346\200\273\347\273\223\347\257\207.md" | 6 ++-- ...47\241\20001\350\203\214\345\214\205-1.md" | 6 ++-- ...47\241\20001\350\203\214\345\214\205-2.md" | 6 ++-- ...32\351\207\215\350\203\214\345\214\205.md" | 6 ++-- ...14\345\205\250\350\203\214\345\214\205.md" | 6 ++-- ...25\346\200\273\347\273\223\347\257\207.md" | 6 ++-- ...06\350\256\272\345\237\272\347\241\200.md" | 4 +-- ...50\346\200\273\347\273\223\347\257\207.md" | 6 ++-- ...06\350\256\272\345\237\272\347\241\200.md" | 6 ++-- ...76\350\241\250\347\233\270\344\272\244.md" | 4 +-- 224 files changed, 658 insertions(+), 624 deletions(-) diff --git a/README.md b/README.md index a30e0423fe..9e88dfb781 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ @@ -78,18 +78,6 @@ * [Java语言基础课](https://kamacoder.com/course.php?course_id=2) * [23种设计模式](https://github.com/youngyangyang04/kama-DesignPattern) -* 项目 - * [基于跳表的轻量级KV存储引擎](https://github.com/youngyangyang04/Skiplist-CPP) - * [Nosql数据库注入攻击系统](https://github.com/youngyangyang04/NoSQLAttack) - -* 编程素养 - * [看了这么多代码,谈一谈代码风格!](./problems/前序/代码风格.md) - * [力扣上的代码想在本地编译运行?](./problems/前序/力扣上的代码想在本地编译运行?.md) - * [什么是核心代码模式,什么又是ACM模式?](./problems/前序/什么是核心代码模式,什么又是ACM模式?.md) - * [刷题要不要用库函数](./problems/前序/刷力扣用不用库函数.md) - * [ACM模式如何构造二叉树](./problems/前序/ACM模式如何构建二叉树.md) - * [解密互联网大厂研发流程](./problems/前序/互联网大厂研发流程.md) - * 工具 * [一站式vim配置](https://github.com/youngyangyang04/PowerVim) * [保姆级Git入门教程,万字详解](https://mp.weixin.qq.com/s/Q_O0ey4C9tryPZaZeJocbA) @@ -106,7 +94,6 @@ * [关于时间复杂度,你不知道的都在这里!](./problems/前序/关于时间复杂度,你不知道的都在这里!.md) * [O(n)的算法居然超时了,此时的n究竟是多大?](./problems/前序/On的算法居然超时了,此时的n究竟是多大?.md) * [通过一道面试题目,讲一讲递归算法的时间复杂度!](./problems/前序/通过一道面试题目,讲一讲递归算法的时间复杂度!.md) - * [本周小结!(算法性能分析系列一)](./problems/周总结/20201210复杂度分析周末总结.md) * [关于空间复杂度,可能有几个疑问?](./problems/前序/关于空间复杂度,可能有几个疑问?.md) * [递归算法的时间与空间复杂度分析!](./problems/前序/递归算法的时间与空间复杂度分析.md) * [刷了这么多题,你了解自己代码的内存消耗么?](./problems/前序/刷了这么多题,你了解自己代码的内存消耗么?.md) @@ -499,7 +486,7 @@ # 贡献者 -[点此这里](https://github.com/youngyangyang04/leetcode-master/graphs/contributors)查看LeetCode-Master的所有贡献者。感谢他们补充了LeetCode-Master的其他语言版本,让更多的读者收益于此项目。 +[点此这里](https://github.com/youngyangyang04/leetcode-master/graphs/contributors)查看LeetCode-Master的所有贡献者。感谢他们补充了LeetCode-Master的其他语言版本,让更多的读者受益于此项目。 # Star 趋势 diff --git "a/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" "b/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" index 80218cb535..b3db2438c0 100644 --- "a/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 1. 两数之和 @@ -537,8 +537,8 @@ int* twoSum(int* nums, int numsSize, int target, int* returnSize){ return NULL; } ``` +

- diff --git "a/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" "b/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" index b13f9ac356..a13daf1e2f 100644 --- "a/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" +++ "b/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

@@ -677,8 +677,8 @@ public class Solution { } ``` +

- diff --git "a/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" "b/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" index 90b29cf703..ae21838540 100644 --- "a/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

@@ -936,8 +936,8 @@ object Solution { } } ``` +

- diff --git "a/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" "b/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" index cbd99f8d93..e25d15d5ad 100644 --- "a/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" +++ "b/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 17.电话号码的字母组合 @@ -765,8 +765,8 @@ public class Solution } ``` +

- diff --git "a/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" "b/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" index 17715b2e6f..89bc2a8bf5 100644 --- "a/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

> 一样的道理,能解决四数之和 @@ -697,8 +697,8 @@ def four_sum(nums, target) return result end ``` +

- diff --git "a/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" "b/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" index 9e180f753e..c3d1994536 100644 --- "a/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" +++ "b/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

diff --git "a/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" "b/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" index 17fbe2be2d..d310f4153c 100644 --- "a/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" +++ "b/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

diff --git "a/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" "b/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" index b2a830a746..6de04dc6ca 100644 --- "a/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" +++ "b/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 24. 两两交换链表中的节点 diff --git "a/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" "b/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" index cb342586d9..f052d45e94 100644 --- "a/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" +++ "b/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 27. 移除元素 diff --git "a/problems/0028.\345\256\236\347\216\260strStr.md" "b/problems/0028.\345\256\236\347\216\260strStr.md" index 8d0cc52559..86dd5e3d21 100644 --- "a/problems/0028.\345\256\236\347\216\260strStr.md" +++ "b/problems/0028.\345\256\236\347\216\260strStr.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

> 在一个串中查找是否出现过另一个串,这是KMP的看家本领。 diff --git "a/problems/0031.\344\270\213\344\270\200\344\270\252\346\216\222\345\210\227.md" "b/problems/0031.\344\270\213\344\270\200\344\270\252\346\216\222\345\210\227.md" index 3cfb673a29..48af8d0da1 100644 --- "a/problems/0031.\344\270\213\344\270\200\344\270\252\346\216\222\345\210\227.md" +++ "b/problems/0031.\344\270\213\344\270\200\344\270\252\346\216\222\345\210\227.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

@@ -268,8 +268,8 @@ var nextPermutation = function(nums) { ``` +

- diff --git "a/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" "b/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" index 9afb9941a9..16adcdf19c 100644 --- "a/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" +++ "b/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 34. 在排序数组中查找元素的第一个和最后一个位置 @@ -854,8 +854,8 @@ int* searchRange(int* nums, int numsSize, int target, int* returnSize){ } ``` +

- diff --git "a/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" "b/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" index 80b7e40e4a..76b5f4a249 100644 --- "a/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" +++ "b/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" @@ -1,9 +1,9 @@ -

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+ @@ -527,8 +527,8 @@ int searchInsert(int* nums, int numsSize, int target){ } ``` +

- diff --git "a/problems/0037.\350\247\243\346\225\260\347\213\254.md" "b/problems/0037.\350\247\243\346\225\260\347\213\254.md" index b5f54b1f8f..7611d98235 100644 --- "a/problems/0037.\350\247\243\346\225\260\347\213\254.md" +++ "b/problems/0037.\350\247\243\346\225\260\347\213\254.md" @@ -1,9 +1,9 @@ -

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+ > 如果对回溯法理论还不清楚的同学,可以先看这个视频[视频来了!!带你学透回溯算法(理论篇)](https://mp.weixin.qq.com/s/wDd5azGIYWjbU0fdua_qBg) @@ -810,8 +810,8 @@ public class Solution } ``` +

- diff --git "a/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" "b/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" index 81558cc12c..4c86bc2fa7 100644 --- "a/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" +++ "b/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" @@ -1,9 +1,9 @@ -

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+ @@ -660,8 +660,8 @@ public class Solution ``` +

- diff --git "a/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" "b/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" index 994b04b82f..22cf726d8c 100644 --- "a/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" +++ "b/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

> 这篇可以说是全网把组合问题如何去重,讲的最清晰的了! @@ -806,8 +806,8 @@ public class Solution } } ``` +

- diff --git "a/problems/0042.\346\216\245\351\233\250\346\260\264.md" "b/problems/0042.\346\216\245\351\233\250\346\260\264.md" index 6d92d2b380..0484f830f6 100644 --- "a/problems/0042.\346\216\245\351\233\250\346\260\264.md" +++ "b/problems/0042.\346\216\245\351\233\250\346\260\264.md" @@ -1,9 +1,9 @@ -

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+ diff --git "a/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" "b/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" index 6f4d3b16d9..3eeec2689c 100644 --- "a/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" +++ "b/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

> 相对于[贪心算法:跳跃游戏](https://mp.weixin.qq.com/s/606_N9j8ACKCODoCbV1lSA)难了不少,做好心理准备! @@ -541,8 +541,8 @@ public class Solution } ``` +

- diff --git "a/problems/0046.\345\205\250\346\216\222\345\210\227.md" "b/problems/0046.\345\205\250\346\216\222\345\210\227.md" index 15e6ae162a..638a2a7c45 100644 --- "a/problems/0046.\345\205\250\346\216\222\345\210\227.md" +++ "b/problems/0046.\345\205\250\346\216\222\345\210\227.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 46.全排列 @@ -518,8 +518,8 @@ public class Solution } ``` +

- diff --git "a/problems/0047.\345\205\250\346\216\222\345\210\227II.md" "b/problems/0047.\345\205\250\346\216\222\345\210\227II.md" index 7f2c363889..56006a7744 100644 --- "a/problems/0047.\345\205\250\346\216\222\345\210\227II.md" +++ "b/problems/0047.\345\205\250\346\216\222\345\210\227II.md" @@ -1,9 +1,9 @@ -

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+ @@ -554,8 +554,8 @@ public class Solution } ``` +

- diff --git "a/problems/0051.N\347\232\207\345\220\216.md" "b/problems/0051.N\347\232\207\345\220\216.md" index 1e1085401d..6ced679cd4 100644 --- "a/problems/0051.N\347\232\207\345\220\216.md" +++ "b/problems/0051.N\347\232\207\345\220\216.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 51. N皇后 @@ -920,8 +920,8 @@ public class Solution } ``` +

- diff --git "a/problems/0052.N\347\232\207\345\220\216II.md" "b/problems/0052.N\347\232\207\345\220\216II.md" index 29c2b58818..271484a4ee 100644 --- "a/problems/0052.N\347\232\207\345\220\216II.md" +++ "b/problems/0052.N\347\232\207\345\220\216II.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

@@ -306,8 +306,8 @@ class Solution { } } ``` +

- diff --git "a/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" "b/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" index 74ff2ca40d..551c39bfac 100644 --- "a/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" +++ "b/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 53. 最大子序和 diff --git "a/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" "b/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" index 70ad7a8482..38a3a11818 100644 --- "a/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" +++ "b/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 53. 最大子序和 @@ -243,8 +243,8 @@ function maxSubArray(nums: number[]): number { ``` +

- diff --git "a/problems/0054.\350\236\272\346\227\213\347\237\251\351\230\265.md" "b/problems/0054.\350\236\272\346\227\213\347\237\251\351\230\265.md" index 85e6a9364b..4d54ccd6d7 100644 --- "a/problems/0054.\350\236\272\346\227\213\347\237\251\351\230\265.md" +++ "b/problems/0054.\350\236\272\346\227\213\347\237\251\351\230\265.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

diff --git "a/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" "b/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" index 086fd64f5e..01fd951384 100644 --- "a/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" +++ "b/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 55. 跳跃游戏 diff --git "a/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" "b/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" index f9d6f65468..134a9028a6 100644 --- "a/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" +++ "b/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 56. 合并区间 diff --git "a/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" "b/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" index 7f73bc488d..c59ec0333f 100644 --- "a/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" +++ "b/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

diff --git "a/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" "b/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" index 32c64a12c9..b451704b4c 100644 --- "a/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" +++ "b/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" @@ -1,9 +1,9 @@ -

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+ # 62.不同路径 @@ -594,8 +594,8 @@ public class Solution +

- diff --git "a/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" "b/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" index 8c208ea865..e2b17d88a9 100644 --- "a/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" +++ "b/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" @@ -1,9 +1,9 @@ -

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+ # 63. 不同路径 II @@ -759,8 +759,8 @@ public class Solution } ``` +

- diff --git "a/problems/0070.\347\210\254\346\245\274\346\242\257.md" "b/problems/0070.\347\210\254\346\245\274\346\242\257.md" index 67bbdd7b81..1d0b192fe4 100644 --- "a/problems/0070.\347\210\254\346\245\274\346\242\257.md" +++ "b/problems/0070.\347\210\254\346\245\274\346\242\257.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 70. 爬楼梯 @@ -519,8 +519,8 @@ impl Solution { } ``` +

- diff --git "a/problems/0070.\347\210\254\346\245\274\346\242\257\345\256\214\345\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md" "b/problems/0070.\347\210\254\346\245\274\346\242\257\345\256\214\345\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md" index 622b1117e7..0810557dca 100644 --- "a/problems/0070.\347\210\254\346\245\274\346\242\257\345\256\214\345\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md" +++ "b/problems/0070.\347\210\254\346\245\274\346\242\257\345\256\214\345\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 70. 爬楼梯(进阶版) diff --git "a/problems/0072.\347\274\226\350\276\221\350\267\235\347\246\273.md" "b/problems/0072.\347\274\226\350\276\221\350\267\235\347\246\273.md" index 777b851cca..b8de8bdcc7 100644 --- "a/problems/0072.\347\274\226\350\276\221\350\267\235\347\246\273.md" +++ "b/problems/0072.\347\274\226\350\276\221\350\267\235\347\246\273.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 72. 编辑距离 diff --git "a/problems/0077.\347\273\204\345\220\210.md" "b/problems/0077.\347\273\204\345\220\210.md" index 103fb627f5..9bbb4455db 100644 --- "a/problems/0077.\347\273\204\345\220\210.md" +++ "b/problems/0077.\347\273\204\345\220\210.md" @@ -1,9 +1,9 @@ -

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+ # 第77题. 组合 @@ -845,8 +845,8 @@ public class Solution } } ``` +

- diff --git "a/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" "b/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" index 9577d65f3c..0fa568afe9 100644 --- "a/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" +++ "b/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

@@ -411,8 +411,8 @@ object Solution { } ``` +

- diff --git "a/problems/0078.\345\255\220\351\233\206.md" "b/problems/0078.\345\255\220\351\233\206.md" index 06547e3df5..1415f2d27b 100644 --- "a/problems/0078.\345\255\220\351\233\206.md" +++ "b/problems/0078.\345\255\220\351\233\206.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 78.子集 @@ -466,8 +466,8 @@ public class Solution { ``` +

- diff --git "a/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" "b/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" index b836705ab5..1c4d7f591f 100644 --- "a/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" +++ "b/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 84.柱状图中最大的矩形 @@ -741,8 +741,8 @@ impl Solution { } ``` +

- diff --git "a/problems/0090.\345\255\220\351\233\206II.md" "b/problems/0090.\345\255\220\351\233\206II.md" index 6d618978a8..03bbd1dca3 100644 --- "a/problems/0090.\345\255\220\351\233\206II.md" +++ "b/problems/0090.\345\255\220\351\233\206II.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 90.子集II @@ -659,8 +659,8 @@ public class Solution } ``` +

- diff --git "a/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" "b/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" index c662957a10..73d5e3c3b2 100644 --- "a/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" +++ "b/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

@@ -848,8 +848,8 @@ public class Solution ``` +

- diff --git "a/problems/0096.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0096.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" index 15b99083e0..e0e773100e 100644 --- "a/problems/0096.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" +++ "b/problems/0096.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" @@ -1,9 +1,9 @@ -

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+ # 96.不同的二叉搜索树 diff --git "a/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" index 88e1628243..023eeea50a 100644 --- "a/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" +++ "b/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 98.验证二叉搜索树 @@ -806,8 +806,8 @@ public bool IsValidBST(TreeNode root) } ``` +

- diff --git "a/problems/0100.\347\233\270\345\220\214\347\232\204\346\240\221.md" "b/problems/0100.\347\233\270\345\220\214\347\232\204\346\240\221.md" index 56a6c8840f..7268b9f083 100644 --- "a/problems/0100.\347\233\270\345\220\214\347\232\204\346\240\221.md" +++ "b/problems/0100.\347\233\270\345\220\214\347\232\204\346\240\221.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

@@ -339,8 +339,8 @@ function isSameTree(p: TreeNode | null, q: TreeNode | null): boolean { +

- diff --git "a/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" "b/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" index 8442f0ab9e..063b542945 100644 --- "a/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 101. 对称二叉树 @@ -945,8 +945,8 @@ public bool IsSymmetric(TreeNode root) } ``` +

- diff --git "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" index 4411b5609f..6cdb741454 100644 --- "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" +++ "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" @@ -1,9 +1,9 @@ -

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+ # 二叉树层序遍历登场! @@ -3226,8 +3226,8 @@ impl Solution { **致敬叶师傅!** +

- diff --git "a/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" "b/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" index 1f55f197e5..49bdeb168f 100644 --- "a/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" +++ "b/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

@@ -1159,8 +1159,8 @@ public int MaxDepth(TreeNode root) ``` +

- diff --git "a/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" "b/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" index 0e0ab1d74f..3518343fc4 100644 --- "a/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" @@ -1,9 +1,9 @@ -

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+ @@ -1242,8 +1242,8 @@ public TreeNode BuildTree(int[] inorder, int[] postorder) } ``` +

- diff --git "a/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" index 9fa684cfdf..666595e0bb 100644 --- "a/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" +++ "b/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

> 构造二叉搜索树,一不小心就平衡了 @@ -549,8 +549,8 @@ public TreeNode Traversal(int[] nums, int left, int right) ``` +

- diff --git "a/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" "b/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" index 40fdcd143d..dd05bdd6af 100644 --- "a/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" @@ -1,9 +1,9 @@ -

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+ @@ -934,8 +934,8 @@ public int GetHeight(TreeNode root) } ``` +

- diff --git "a/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" "b/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" index 6d1632d593..35640ef691 100644 --- "a/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" +++ "b/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

> 和求最大深度一个套路? diff --git "a/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" "b/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" index d45be3bd82..2beb8a7fa3 100644 --- "a/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" +++ "b/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" @@ -1,9 +1,9 @@ -

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+ # 112. 路径总和 @@ -1579,8 +1579,8 @@ public class Solution { // @lc code=end ``` +

- diff --git "a/problems/0115.\344\270\215\345\220\214\347\232\204\345\255\220\345\272\217\345\210\227.md" "b/problems/0115.\344\270\215\345\220\214\347\232\204\345\255\220\345\272\217\345\210\227.md" index 96ab2583f1..8682b88d13 100644 --- "a/problems/0115.\344\270\215\345\220\214\347\232\204\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0115.\344\270\215\345\220\214\347\232\204\345\255\220\345\272\217\345\210\227.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 115.不同的子序列 @@ -375,8 +375,8 @@ impl Solution { ``` +

- diff --git "a/problems/0116.\345\241\253\345\205\205\346\257\217\344\270\252\350\212\202\347\202\271\347\232\204\344\270\213\344\270\200\344\270\252\345\217\263\344\276\247\350\212\202\347\202\271\346\214\207\351\222\210.md" "b/problems/0116.\345\241\253\345\205\205\346\257\217\344\270\252\350\212\202\347\202\271\347\232\204\344\270\213\344\270\200\344\270\252\345\217\263\344\276\247\350\212\202\347\202\271\346\214\207\351\222\210.md" index 60ea9210a2..ca36ac6f3e 100644 --- "a/problems/0116.\345\241\253\345\205\205\346\257\217\344\270\252\350\212\202\347\202\271\347\232\204\344\270\213\344\270\200\344\270\252\345\217\263\344\276\247\350\212\202\347\202\271\346\214\207\351\222\210.md" +++ "b/problems/0116.\345\241\253\345\205\205\346\257\217\344\270\252\350\212\202\347\202\271\347\232\204\344\270\213\344\270\200\344\270\252\345\217\263\344\276\247\350\212\202\347\202\271\346\214\207\351\222\210.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 116. 填充每个节点的下一个右侧节点指针 @@ -438,8 +438,8 @@ public class Solution ``` +

- diff --git "a/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" "b/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" index 60fbc5cc8e..e9aea0e6c6 100644 --- "a/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" +++ "b/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 121. 买卖股票的最佳时机 diff --git "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" index 69706e369a..e255723d2a 100644 --- "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" +++ "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 122.买卖股票的最佳时机 II @@ -422,8 +422,8 @@ public class Solution } ``` +

- diff --git "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" index 24c7f16823..f0dff50506 100644 --- "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" +++ "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 122.买卖股票的最佳时机II @@ -455,8 +455,8 @@ impl Solution { } ``` +

- diff --git "a/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" "b/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" index 18f19c5192..d06b4f8022 100644 --- "a/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" +++ "b/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 123.买卖股票的最佳时机III diff --git "a/problems/0127.\345\215\225\350\257\215\346\216\245\351\276\231.md" "b/problems/0127.\345\215\225\350\257\215\346\216\245\351\276\231.md" index 6f8933101e..00d7d4cfc4 100644 --- "a/problems/0127.\345\215\225\350\257\215\346\216\245\351\276\231.md" +++ "b/problems/0127.\345\215\225\350\257\215\346\216\245\351\276\231.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 127. 单词接龙 diff --git "a/problems/0129.\346\261\202\346\240\271\345\210\260\345\217\266\345\255\220\350\212\202\347\202\271\346\225\260\345\255\227\344\271\213\345\222\214.md" "b/problems/0129.\346\261\202\346\240\271\345\210\260\345\217\266\345\255\220\350\212\202\347\202\271\346\225\260\345\255\227\344\271\213\345\222\214.md" index ebb36071cf..90dfd0618f 100644 --- "a/problems/0129.\346\261\202\346\240\271\345\210\260\345\217\266\345\255\220\350\212\202\347\202\271\346\225\260\345\255\227\344\271\213\345\222\214.md" +++ "b/problems/0129.\346\261\202\346\240\271\345\210\260\345\217\266\345\255\220\350\212\202\347\202\271\346\225\260\345\255\227\344\271\213\345\222\214.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

@@ -382,8 +382,8 @@ int sumNumbers(struct TreeNode* root){ } ``` +

- diff --git "a/problems/0130.\350\242\253\345\233\264\347\273\225\347\232\204\345\214\272\345\237\237.md" "b/problems/0130.\350\242\253\345\233\264\347\273\225\347\232\204\345\214\272\345\237\237.md" index 1ddaaa7f83..8ef8d5b280 100644 --- "a/problems/0130.\350\242\253\345\233\264\347\273\225\347\232\204\345\214\272\345\237\237.md" +++ "b/problems/0130.\350\242\253\345\233\264\347\273\225\347\232\204\345\214\272\345\237\237.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 130. 被围绕的区域 @@ -792,8 +792,8 @@ impl Solution { } ``` +

- diff --git "a/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" "b/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" index ca342d4bc6..822d4399f1 100644 --- "a/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" +++ "b/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

> 切割问题其实是一种组合问题! @@ -952,8 +952,8 @@ public class Solution ``` +

- diff --git "a/problems/0132.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262II.md" "b/problems/0132.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262II.md" index eb91a1899f..85e047f2b7 100644 --- "a/problems/0132.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262II.md" +++ "b/problems/0132.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262II.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

@@ -372,8 +372,8 @@ var minCut = function(s) { ``` +

- diff --git "a/problems/0134.\345\212\240\346\262\271\347\253\231.md" "b/problems/0134.\345\212\240\346\262\271\347\253\231.md" index c093023d5f..c88b43b199 100644 --- "a/problems/0134.\345\212\240\346\262\271\347\253\231.md" +++ "b/problems/0134.\345\212\240\346\262\271\347\253\231.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 134. 加油站 @@ -654,8 +654,8 @@ public class Solution } ``` +

- diff --git "a/problems/0135.\345\210\206\345\217\221\347\263\226\346\236\234.md" "b/problems/0135.\345\210\206\345\217\221\347\263\226\346\236\234.md" index 210f4995dc..6805857e8c 100644 --- "a/problems/0135.\345\210\206\345\217\221\347\263\226\346\236\234.md" +++ "b/problems/0135.\345\210\206\345\217\221\347\263\226\346\236\234.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 135. 分发糖果 @@ -401,8 +401,8 @@ public class Solution ``` +

- diff --git "a/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" "b/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" index a3d59ec718..f19626d09d 100644 --- "a/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" +++ "b/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

diff --git "a/problems/0141.\347\216\257\345\275\242\351\223\276\350\241\250.md" "b/problems/0141.\347\216\257\345\275\242\351\223\276\350\241\250.md" index b1f42ba979..ac6565763f 100644 --- "a/problems/0141.\347\216\257\345\275\242\351\223\276\350\241\250.md" +++ "b/problems/0141.\347\216\257\345\275\242\351\223\276\350\241\250.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 141. 环形链表 @@ -159,8 +159,8 @@ function hasCycle(head: ListNode | null): boolean { +

- diff --git "a/problems/0142.\347\216\257\345\275\242\351\223\276\350\241\250II.md" "b/problems/0142.\347\216\257\345\275\242\351\223\276\350\241\250II.md" index a643fd7091..d97b160b91 100644 --- "a/problems/0142.\347\216\257\345\275\242\351\223\276\350\241\250II.md" +++ "b/problems/0142.\347\216\257\345\275\242\351\223\276\350\241\250II.md" @@ -1,9 +1,9 @@ -

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+ diff --git "a/problems/0143.\351\207\215\346\216\222\351\223\276\350\241\250.md" "b/problems/0143.\351\207\215\346\216\222\351\223\276\350\241\250.md" index 0b3be9a0f1..8707543190 100644 --- "a/problems/0143.\351\207\215\346\216\222\351\223\276\350\241\250.md" +++ "b/problems/0143.\351\207\215\346\216\222\351\223\276\350\241\250.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 143.重排链表 diff --git "a/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" "b/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" index 663a68ea5c..7cadc46592 100644 --- "a/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" +++ "b/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

> 这不仅仅是一道好题,也展现出计算机的思考方式 diff --git "a/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" "b/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" index 520f17a7ec..34b099a22d 100644 --- "a/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" +++ "b/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

diff --git "a/problems/0160.\347\233\270\344\272\244\351\223\276\350\241\250.md" "b/problems/0160.\347\233\270\344\272\244\351\223\276\350\241\250.md" index bf62ab30b5..d4422bd8ba 100644 --- "a/problems/0160.\347\233\270\344\272\244\351\223\276\350\241\250.md" +++ "b/problems/0160.\347\233\270\344\272\244\351\223\276\350\241\250.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

同:[链表:链表相交](https://programmercarl.com/面试题02.07.链表相交.html)

diff --git "a/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" "b/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" index 2521749fc9..def6927756 100644 --- "a/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" +++ "b/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 188.买卖股票的最佳时机IV @@ -553,8 +553,8 @@ impl Solution { ``` +

- diff --git "a/problems/0189.\346\227\213\350\275\254\346\225\260\347\273\204.md" "b/problems/0189.\346\227\213\350\275\254\346\225\260\347\273\204.md" index d60612e92b..b47ee4b91f 100644 --- "a/problems/0189.\346\227\213\350\275\254\346\225\260\347\273\204.md" +++ "b/problems/0189.\346\227\213\350\275\254\346\225\260\347\273\204.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 189. 旋转数组 @@ -201,8 +201,8 @@ function reverseByRange(nums: number[], left: number, right: number): void { +

- diff --git "a/problems/0198.\346\211\223\345\256\266\345\212\253\350\210\215.md" "b/problems/0198.\346\211\223\345\256\266\345\212\253\350\210\215.md" index 480222ef12..032204bbce 100644 --- "a/problems/0198.\346\211\223\345\256\266\345\212\253\350\210\215.md" +++ "b/problems/0198.\346\211\223\345\256\266\345\212\253\350\210\215.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 198.打家劫舍 @@ -360,8 +360,8 @@ impl Solution { ``` +

- diff --git "a/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\345\271\277\346\220\234\347\211\210.md" "b/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\345\271\277\346\220\234\347\211\210.md" index 85471f73b5..00e4efd894 100644 --- "a/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\345\271\277\346\220\234\347\211\210.md" +++ "b/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\345\271\277\346\220\234\347\211\210.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 200. 岛屿数量 @@ -408,9 +408,9 @@ impl Solution { } } ``` +``` +

-``` - diff --git "a/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\346\267\261\346\220\234\347\211\210.md" "b/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\346\267\261\346\220\234\347\211\210.md" index 83d295bd5b..4657920334 100644 --- "a/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\346\267\261\346\220\234\347\211\210.md" +++ "b/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\346\267\261\346\220\234\347\211\210.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 200. 岛屿数量 diff --git "a/problems/0202.\345\277\253\344\271\220\346\225\260.md" "b/problems/0202.\345\277\253\344\271\220\346\225\260.md" index 719672a281..409a7471d4 100644 --- "a/problems/0202.\345\277\253\344\271\220\346\225\260.md" +++ "b/problems/0202.\345\277\253\344\271\220\346\225\260.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

@@ -533,8 +533,8 @@ public class Solution { } } ``` +

- diff --git "a/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" "b/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" index d6d7e6c2ef..18ae160bfd 100644 --- "a/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" +++ "b/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" @@ -1,9 +1,9 @@ -

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+ @@ -664,8 +664,8 @@ public class Solution } ``` +

- diff --git "a/problems/0205.\345\220\214\346\236\204\345\255\227\347\254\246\344\270\262.md" "b/problems/0205.\345\220\214\346\236\204\345\255\227\347\254\246\344\270\262.md" index e07ab746d9..e416d9ceda 100644 --- "a/problems/0205.\345\220\214\346\236\204\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/0205.\345\220\214\346\236\204\345\255\227\347\254\246\344\270\262.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 205. 同构字符串 @@ -179,8 +179,8 @@ function isIsomorphic(s: string, t: string): boolean { +

- diff --git "a/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md" "b/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md" index 5a57939af2..430bebe59b 100644 --- "a/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md" +++ "b/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

> 反转链表的写法很简单,一些同学甚至可以背下来但过一阵就忘了该咋写,主要是因为没有理解真正的反转过程。 diff --git "a/problems/0207.\350\257\276\347\250\213\350\241\250.md" "b/problems/0207.\350\257\276\347\250\213\350\241\250.md" index 18c4684081..6a8eb23b84 100644 --- "a/problems/0207.\350\257\276\347\250\213\350\241\250.md" +++ "b/problems/0207.\350\257\276\347\250\213\350\241\250.md" @@ -1,3 +1,8 @@ +

+ + + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

拓扑排序指的是一种 解决问题的大体思路, 而具体算法,可能是 广搜 可能是深搜。 @@ -20,7 +25,6 @@ 这道题的做法同样适用于第 210 题。 ------------------- ``` vector inDegree(numCourses); @@ -49,3 +53,7 @@ while (Qu.size()) { if (count == numCourses) return true; return false; ``` +

+ + + diff --git "a/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" "b/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" index 5934d5e364..0a742f958b 100644 --- "a/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" +++ "b/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 209.长度最小的子数组 diff --git "a/problems/0213.\346\211\223\345\256\266\345\212\253\350\210\215II.md" "b/problems/0213.\346\211\223\345\256\266\345\212\253\350\210\215II.md" index ba996f2bf4..05ebd1ad09 100644 --- "a/problems/0213.\346\211\223\345\256\266\345\212\253\350\210\215II.md" +++ "b/problems/0213.\346\211\223\345\256\266\345\212\253\350\210\215II.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 213.打家劫舍II diff --git "a/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" "b/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" index ac28f9fcfa..861b6c6634 100644 --- "a/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" +++ "b/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" @@ -1,9 +1,9 @@ -

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+ diff --git "a/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" "b/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" index d93d2a3381..745a27e879 100644 --- "a/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" +++ "b/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 222.完全二叉树的节点个数 @@ -893,8 +893,8 @@ public int CountNodes(TreeNode root) } ``` +

- diff --git "a/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" "b/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" index 6900e66869..c7dc52f1cc 100644 --- "a/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" +++ "b/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

@@ -1249,8 +1249,8 @@ impl MyStack { } ``` +

- diff --git "a/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" "b/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" index 8691953a3e..824968f0f3 100644 --- "a/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 226.翻转二叉树 @@ -1028,8 +1028,8 @@ public TreeNode InvertTree(TreeNode root) { } ``` +

- diff --git "a/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" "b/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" index 41933ca4ba..e8a3d2ec33 100644 --- "a/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" +++ "b/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

> 工作上一定没人这么搞,但是考察对栈、队列理解程度的好题 diff --git "a/problems/0234.\345\233\236\346\226\207\351\223\276\350\241\250.md" "b/problems/0234.\345\233\236\346\226\207\351\223\276\350\241\250.md" index fef942fc49..1356b7da3b 100644 --- "a/problems/0234.\345\233\236\346\226\207\351\223\276\350\241\250.md" +++ "b/problems/0234.\345\233\236\346\226\207\351\223\276\350\241\250.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 234.回文链表 @@ -428,8 +428,8 @@ function reverseList(head: ListNode | null): ListNode | null { +

- diff --git "a/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" "b/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" index 2a11f9f4b7..597c2dffd3 100644 --- "a/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" +++ "b/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 235. 二叉搜索树的最近公共祖先 @@ -547,8 +547,8 @@ public TreeNode LowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) ``` +

- diff --git "a/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" "b/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" index 049f70c7ae..1ad9850be1 100644 --- "a/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" +++ "b/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

> 本来是打算将二叉树和二叉搜索树的公共祖先问题一起讲,后来发现篇幅过长了,只能先说一说二叉树的公共祖先问题。 @@ -445,8 +445,8 @@ public TreeNode LowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) } ``` +

- diff --git "a/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" "b/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" index 19ac12619e..23bf615b4a 100644 --- "a/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" +++ "b/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

diff --git "a/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" "b/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" index 6eed90a73a..ac03ddbb40 100644 --- "a/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" +++ "b/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

> 数组就是简单的哈希表,但是数组的大小可不是无限开辟的 @@ -390,8 +390,8 @@ object Solution { * [438.找到字符串中所有字母异位词](https://leetcode.cn/problems/find-all-anagrams-in-a-string/) +

- diff --git "a/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" "b/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" index 4c6c92c5b4..f64e52d9f4 100644 --- "a/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" +++ "b/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

> 以为只用了递归,其实还用了回溯 diff --git "a/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" "b/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" index b71b69f473..0b732b349b 100644 --- "a/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" +++ "b/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 279.完全平方数 diff --git "a/problems/0283.\347\247\273\345\212\250\351\233\266.md" "b/problems/0283.\347\247\273\345\212\250\351\233\266.md" index fc708844bd..4d8fd9a155 100644 --- "a/problems/0283.\347\247\273\345\212\250\351\233\266.md" +++ "b/problems/0283.\347\247\273\345\212\250\351\233\266.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 283. 移动零:动态规划:一样的套路,再求一次完全平方数 @@ -172,8 +172,8 @@ void moveZeroes(int* nums, int numsSize){ +

- diff --git "a/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" "b/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" index 6d82eae1e9..19c129dfca 100644 --- "a/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 300.最长递增子序列 diff --git "a/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" "b/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" index 9dc35bdf52..5a38111ad5 100644 --- "a/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" +++ "b/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 309.最佳买卖股票时机含冷冻期 diff --git "a/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" "b/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" index 156b5ff36d..0ed5cf688e 100644 --- "a/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" +++ "b/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 322. 零钱兑换 diff --git "a/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" "b/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" index 6c8a481435..144672a9aa 100644 --- "a/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" +++ "b/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

> 这也可以用回溯法? 其实深搜和回溯也是相辅相成的,毕竟都用递归。 @@ -942,8 +942,8 @@ impl Solution { } ``` +

- diff --git "a/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" "b/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" index 61b9f99c6f..7aae5cbf2a 100644 --- "a/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" +++ "b/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 337.打家劫舍 III diff --git "a/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" "b/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" index aaa758e63e..205b220144 100644 --- "a/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" +++ "b/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 343. 整数拆分 @@ -516,8 +516,8 @@ public class Solution } ``` +

- diff --git "a/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" "b/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" index 44184c53bc..793c9af362 100644 --- "a/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

diff --git "a/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" "b/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" index b340e1855b..34d9f82c1b 100644 --- "a/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" +++ "b/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

> 前K个大数问题,老生常谈,不得不谈 @@ -603,8 +603,8 @@ impl Solution { } ``` +

- diff --git "a/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" "b/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" index 9902fff880..e17e940f5f 100644 --- "a/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" +++ "b/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

diff --git "a/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" "b/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" index 5c2241c805..9e6714ce9d 100644 --- "a/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" +++ "b/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 376. 摆动序列 diff --git "a/problems/0377.\347\273\204\345\220\210\346\200\273\345\222\214\342\205\243.md" "b/problems/0377.\347\273\204\345\220\210\346\200\273\345\222\214\342\205\243.md" index 6f81bffef9..e96f8dc646 100644 --- "a/problems/0377.\347\273\204\345\220\210\346\200\273\345\222\214\342\205\243.md" +++ "b/problems/0377.\347\273\204\345\220\210\346\200\273\345\222\214\342\205\243.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 377. 组合总和 Ⅳ diff --git "a/problems/0383.\350\265\216\351\207\221\344\277\241.md" "b/problems/0383.\350\265\216\351\207\221\344\277\241.md" index ff5aafed62..768771c333 100644 --- "a/problems/0383.\350\265\216\351\207\221\344\277\241.md" +++ "b/problems/0383.\350\265\216\351\207\221\344\277\241.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

@@ -465,8 +465,8 @@ bool canConstruct(char* ransomNote, char* magazine) { } ``` +

- diff --git "a/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" "b/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" index caca8cb86c..92246e4f9b 100644 --- "a/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 392.判断子序列 @@ -404,8 +404,8 @@ impl Solution { } ``` +

- diff --git "a/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" "b/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" index 3d0f5a8abf..1ba71dc94f 100644 --- "a/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" +++ "b/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 404.左叶子之和 @@ -669,8 +669,8 @@ public int SumOfLeftLeaves(TreeNode root) } ``` +

- diff --git "a/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" "b/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" index b0b02c1454..b7e94543e6 100644 --- "a/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" +++ "b/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 406.根据身高重建队列 @@ -421,8 +421,8 @@ public class Solution ``` +

- diff --git "a/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" "b/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" index 71e01ae392..4d2e6bf656 100644 --- "a/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" +++ "b/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 416. 分割等和子集 @@ -755,8 +755,8 @@ public class Solution } } ``` +

- diff --git "a/problems/0417.\345\244\252\345\271\263\346\264\213\345\244\247\350\245\277\346\264\213\346\260\264\346\265\201\351\227\256\351\242\230.md" "b/problems/0417.\345\244\252\345\271\263\346\264\213\345\244\247\350\245\277\346\264\213\346\260\264\346\265\201\351\227\256\351\242\230.md" index 8fe0f1b426..b8448e936d 100644 --- "a/problems/0417.\345\244\252\345\271\263\346\264\213\345\244\247\350\245\277\346\264\213\346\260\264\346\265\201\351\227\256\351\242\230.md" +++ "b/problems/0417.\345\244\252\345\271\263\346\264\213\345\244\247\350\245\277\346\264\213\346\260\264\346\265\201\351\227\256\351\242\230.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

diff --git "a/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" "b/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" index b668e86046..209616024e 100644 --- "a/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" +++ "b/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 435. 无重叠区间 @@ -494,8 +494,8 @@ public class Solution ``` +

- diff --git "a/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" "b/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" index 60dae7b977..f6057f44a5 100644 --- "a/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" +++ "b/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

> 二叉搜索树删除节点就涉及到结构调整了 @@ -801,8 +801,8 @@ impl Solution { } ``` +

- diff --git "a/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" "b/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" index cd57f83b26..318c3035ce 100644 --- "a/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" +++ "b/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 452. 用最少数量的箭引爆气球 diff --git "a/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" "b/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" index a0bf84da83..db9a9e430c 100644 --- "a/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" +++ "b/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

> 需要哈希的地方都能找到map的身影 @@ -481,8 +481,8 @@ int fourSumCount(int* nums1, int nums1Size, int* nums2, int nums2Size, int* nums return count; } ``` +

- diff --git "a/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" "b/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" index 6ae206dba2..91ed40b422 100644 --- "a/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" +++ "b/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 455.分发饼干 diff --git "a/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" "b/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" index 311e3a695e..1028bf1ea2 100644 --- "a/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

> KMP算法还能干这个 diff --git "a/problems/0463.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" "b/problems/0463.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" index 2e954e30ad..5261d6c2ae 100644 --- "a/problems/0463.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" +++ "b/problems/0463.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

@@ -432,8 +432,8 @@ function islandPerimeter(grid: number[][]): number { } ``` +

- diff --git "a/problems/0474.\344\270\200\345\222\214\351\233\266.md" "b/problems/0474.\344\270\200\345\222\214\351\233\266.md" index af50fa5cbc..47b34a0f31 100644 --- "a/problems/0474.\344\270\200\345\222\214\351\233\266.md" +++ "b/problems/0474.\344\270\200\345\222\214\351\233\266.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 474.一和零 @@ -595,8 +595,8 @@ public class Solution } ``` +

- diff --git "a/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" "b/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" index 1aa69a3669..8f642a5fc9 100644 --- "a/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

> 和子集问题有点像,但又处处是陷阱 @@ -206,7 +206,6 @@ public: ### Java ```Java -//using set, aligned with the unimproved method class Solution { List> result = new ArrayList<>(); List path = new ArrayList<>(); diff --git "a/problems/0494.\347\233\256\346\240\207\345\222\214.md" "b/problems/0494.\347\233\256\346\240\207\345\222\214.md" index 02edad4d8b..cacf6dfa18 100644 --- "a/problems/0494.\347\233\256\346\240\207\345\222\214.md" +++ "b/problems/0494.\347\233\256\346\240\207\345\222\214.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

@@ -650,8 +650,8 @@ public class Solution } ``` +

- diff --git "a/problems/0496.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240I.md" "b/problems/0496.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240I.md" index d97a3e8482..54182d3018 100644 --- "a/problems/0496.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240I.md" +++ "b/problems/0496.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240I.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 496.下一个更大元素 I @@ -450,8 +450,8 @@ impl Solution { +

- diff --git "a/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" "b/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" index 20627d1ad6..93b3fb5400 100644 --- "a/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" +++ "b/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

> 二叉树上应该怎么求,二叉搜索树上又应该怎么求? @@ -1051,8 +1051,8 @@ public class Solution ``` +

- diff --git "a/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" "b/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" index 6df83fb208..62066d8521 100644 --- "a/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" +++ "b/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 503.下一个更大元素II @@ -295,8 +295,8 @@ impl Solution { } ``` +

- diff --git "a/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" "b/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" index 71c022bd34..21b07802f1 100644 --- "a/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" +++ "b/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 509. 斐波那契数 @@ -475,8 +475,8 @@ public class Solution +

- diff --git "a/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" "b/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" index d897bba13a..d69ceb6f51 100644 --- "a/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" +++ "b/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 513.找树左下角的值 diff --git "a/problems/0516.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\345\272\217\345\210\227.md" "b/problems/0516.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\345\272\217\345\210\227.md" index 44bdec1f19..af36b94d29 100644 --- "a/problems/0516.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0516.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\345\272\217\345\210\227.md" @@ -1,9 +1,9 @@ -

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+ # 516.最长回文子序列 @@ -298,8 +298,8 @@ impl Solution { ``` +

- diff --git "a/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" "b/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" index 59fdf6cd25..255912d62b 100644 --- "a/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" +++ "b/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

@@ -395,8 +395,8 @@ public class Solution } ``` +

- diff --git "a/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" "b/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" index 82b3f5d4e9..7fe64ad21d 100644 --- "a/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" +++ "b/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

> 利用二叉搜索树的特性搞起! @@ -669,8 +669,8 @@ public class Solution } ``` +

- diff --git "a/problems/0538.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md" "b/problems/0538.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md" index 7fcb5efd32..b95b585485 100644 --- "a/problems/0538.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md" +++ "b/problems/0538.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 538.把二叉搜索树转换为累加树 @@ -548,8 +548,8 @@ public class Solution ``` +

- diff --git "a/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" "b/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" index 80e662f9dd..3e304fabc0 100644 --- "a/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" +++ "b/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

diff --git "a/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" "b/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" index 7dbb8ef542..7bb7ceffc8 100644 --- "a/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" +++ "b/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 583. 两个字符串的删除操作 diff --git "a/problems/0617.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md" "b/problems/0617.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md" index 3478a2af5d..530350ac69 100644 --- "a/problems/0617.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0617.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 617.合并二叉树 @@ -803,8 +803,8 @@ public TreeNode MergeTrees(TreeNode root1, TreeNode root2) } ``` +

- diff --git "a/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" "b/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" index 4887ff8311..2011bee3e5 100644 --- "a/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" +++ "b/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 647. 回文子串 diff --git "a/problems/0649.Dota2\345\217\202\350\256\256\351\231\242.md" "b/problems/0649.Dota2\345\217\202\350\256\256\351\231\242.md" index db6b43df8e..1540a60173 100644 --- "a/problems/0649.Dota2\345\217\202\350\256\256\351\231\242.md" +++ "b/problems/0649.Dota2\345\217\202\350\256\256\351\231\242.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

@@ -283,8 +283,8 @@ function predictPartyVictory(senate: string): string { +

- diff --git "a/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" "b/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" index f54558a68c..fed9b2b991 100644 --- "a/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 654.最大二叉树 @@ -598,8 +598,8 @@ public TreeNode ConstructMaximumBinaryTree(int[] nums) } ``` +

- diff --git "a/problems/0657.\346\234\272\345\231\250\344\272\272\350\203\275\345\220\246\350\277\224\345\233\236\345\216\237\347\202\271.md" "b/problems/0657.\346\234\272\345\231\250\344\272\272\350\203\275\345\220\246\350\277\224\345\233\236\345\216\237\347\202\271.md" index ef58739122..eccfef3a21 100644 --- "a/problems/0657.\346\234\272\345\231\250\344\272\272\350\203\275\345\220\246\350\277\224\345\233\236\345\216\237\347\202\271.md" +++ "b/problems/0657.\346\234\272\345\231\250\344\272\272\350\203\275\345\220\246\350\277\224\345\233\236\345\216\237\347\202\271.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 657. 机器人能否返回原点 @@ -181,8 +181,8 @@ var judgeCircle = function (moves) { ``` +

- diff --git "a/problems/0669.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0669.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" index 6824c7e29a..aef8465943 100644 --- "a/problems/0669.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" +++ "b/problems/0669.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" @@ -1,9 +1,9 @@ -

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+ @@ -586,8 +586,8 @@ public TreeNode TrimBST(TreeNode root, int low, int high) ``` +

- diff --git "a/problems/0673.\346\234\200\351\225\277\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227\347\232\204\344\270\252\346\225\260.md" "b/problems/0673.\346\234\200\351\225\277\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227\347\232\204\344\270\252\346\225\260.md" index 0277f24989..0366ee8063 100644 --- "a/problems/0673.\346\234\200\351\225\277\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227\347\232\204\344\270\252\346\225\260.md" +++ "b/problems/0673.\346\234\200\351\225\277\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227\347\232\204\344\270\252\346\225\260.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 673.最长递增子序列的个数 @@ -360,8 +360,8 @@ var findNumberOfLIS = function(nums) { ``` +

- diff --git "a/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" "b/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" index 0ca8a4c913..cebb552bf8 100644 --- "a/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" +++ "b/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 674. 最长连续递增序列 diff --git "a/problems/0684.\345\206\227\344\275\231\350\277\236\346\216\245.md" "b/problems/0684.\345\206\227\344\275\231\350\277\236\346\216\245.md" index f5e84223b1..6d5f2bc4fe 100644 --- "a/problems/0684.\345\206\227\344\275\231\350\277\236\346\216\245.md" +++ "b/problems/0684.\345\206\227\344\275\231\350\277\236\346\216\245.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 684.冗余连接 @@ -378,8 +378,8 @@ var findRedundantConnection = function(edges) { +

- diff --git "a/problems/0685.\345\206\227\344\275\231\350\277\236\346\216\245II.md" "b/problems/0685.\345\206\227\344\275\231\350\277\236\346\216\245II.md" index c07dda3a78..3f489d82b7 100644 --- "a/problems/0685.\345\206\227\344\275\231\350\277\236\346\216\245II.md" +++ "b/problems/0685.\345\206\227\344\275\231\350\277\236\346\216\245II.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 685.冗余连接II @@ -619,8 +619,8 @@ var findRedundantDirectedConnection = function(edges) { +

- diff --git "a/problems/0695.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" "b/problems/0695.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" index 87b1b5bbbb..11b638d4d6 100644 --- "a/problems/0695.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" +++ "b/problems/0695.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 695. 岛屿的最大面积 @@ -708,8 +708,8 @@ impl Solution { } } ``` +

- diff --git "a/problems/0700.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\220\234\347\264\242.md" "b/problems/0700.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\220\234\347\264\242.md" index 9efb1e0519..5c1b9c43fd 100644 --- "a/problems/0700.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\220\234\347\264\242.md" +++ "b/problems/0700.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\220\234\347\264\242.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 700.二叉搜索树中的搜索 @@ -487,8 +487,8 @@ public TreeNode SearchBST(TreeNode root, int val) } ``` +

- diff --git "a/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" "b/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" index 5cb0de9911..6b9e58347d 100644 --- "a/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" +++ "b/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 701.二叉搜索树中的插入操作 diff --git "a/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" "b/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" index 31e89ae344..43ede76948 100644 --- "a/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" +++ "b/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 704. 二分查找 @@ -828,8 +828,8 @@ class Solution { } ``` +

- diff --git "a/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" "b/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" index fecdbc3cad..47771d2889 100644 --- "a/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" +++ "b/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

> 听说这道题目把链表常见的五个操作都覆盖了? diff --git "a/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271.md" "b/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271.md" index db39864908..88b03d9d76 100644 --- "a/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271.md" +++ "b/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 714. 买卖股票的最佳时机含手续费 @@ -360,8 +360,8 @@ object Solution { } ``` +

- diff --git "a/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" "b/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" index 88ba9271c8..73714147e0 100644 --- "a/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" +++ "b/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 714.买卖股票的最佳时机含手续费 @@ -322,8 +322,8 @@ impl Solution { } ``` +

- diff --git "a/problems/0718.\346\234\200\351\225\277\351\207\215\345\244\215\345\255\220\346\225\260\347\273\204.md" "b/problems/0718.\346\234\200\351\225\277\351\207\215\345\244\215\345\255\220\346\225\260\347\273\204.md" index e00b3dedf3..6c8e7101a1 100644 --- "a/problems/0718.\346\234\200\351\225\277\351\207\215\345\244\215\345\255\220\346\225\260\347\273\204.md" +++ "b/problems/0718.\346\234\200\351\225\277\351\207\215\345\244\215\345\255\220\346\225\260\347\273\204.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 718. 最长重复子数组 diff --git "a/problems/0724.\345\257\273\346\211\276\346\225\260\347\273\204\347\232\204\344\270\255\345\277\203\347\264\242\345\274\225.md" "b/problems/0724.\345\257\273\346\211\276\346\225\260\347\273\204\347\232\204\344\270\255\345\277\203\347\264\242\345\274\225.md" index 9ed8535e0d..a66a445083 100644 --- "a/problems/0724.\345\257\273\346\211\276\346\225\260\347\273\204\347\232\204\344\270\255\345\277\203\347\264\242\345\274\225.md" +++ "b/problems/0724.\345\257\273\346\211\276\346\225\260\347\273\204\347\232\204\344\270\255\345\277\203\347\264\242\345\274\225.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 724.寻找数组的中心下标 diff --git "a/problems/0738.\345\215\225\350\260\203\351\200\222\345\242\236\347\232\204\346\225\260\345\255\227.md" "b/problems/0738.\345\215\225\350\260\203\351\200\222\345\242\236\347\232\204\346\225\260\345\255\227.md" index 4a8a6e087d..3d46d5ad04 100644 --- "a/problems/0738.\345\215\225\350\260\203\351\200\222\345\242\236\347\232\204\346\225\260\345\255\227.md" +++ "b/problems/0738.\345\215\225\350\260\203\351\200\222\345\242\236\347\232\204\346\225\260\345\255\227.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 738.单调递增的数字 diff --git "a/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" "b/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" index fdb11c63e3..45af52868f 100644 --- "a/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" +++ "b/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" @@ -1,9 +1,9 @@ -

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+ @@ -482,8 +482,8 @@ impl Solution { ``` +

- diff --git "a/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" "b/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" index 6320ed89a7..753a104d97 100644 --- "a/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" +++ "b/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

@@ -537,8 +537,8 @@ public class Solution +

- diff --git "a/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" "b/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" index 8b0ca7b802..5218692735 100644 --- "a/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" +++ "b/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 763.划分字母区间 diff --git "a/problems/0787.K\347\253\231\344\270\255\350\275\254\345\206\205\346\234\200\344\276\277\345\256\234\347\232\204\350\210\252\347\217\255.md" "b/problems/0787.K\347\253\231\344\270\255\350\275\254\345\206\205\346\234\200\344\276\277\345\256\234\347\232\204\350\210\252\347\217\255.md" index 1ece7116f2..9c0a8e7f27 100644 --- "a/problems/0787.K\347\253\231\344\270\255\350\275\254\345\206\205\346\234\200\344\276\277\345\256\234\347\232\204\350\210\252\347\217\255.md" +++ "b/problems/0787.K\347\253\231\344\270\255\350\275\254\345\206\205\346\234\200\344\276\277\345\256\234\347\232\204\350\210\252\347\217\255.md" @@ -1,3 +1,8 @@ +

+ + + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 787. K 站中转内最便宜的航班 @@ -119,7 +124,6 @@ public: }; ------------------ 队列加上 visited 不能重复访问 @@ -176,3 +180,7 @@ public: +

+ + + diff --git "a/problems/0797.\346\211\200\346\234\211\345\217\257\350\203\275\347\232\204\350\267\257\345\276\204.md" "b/problems/0797.\346\211\200\346\234\211\345\217\257\350\203\275\347\232\204\350\267\257\345\276\204.md" index 4b46d65909..40e1bbe73e 100644 --- "a/problems/0797.\346\211\200\346\234\211\345\217\257\350\203\275\347\232\204\350\267\257\345\276\204.md" +++ "b/problems/0797.\346\211\200\346\234\211\345\217\257\350\203\275\347\232\204\350\267\257\345\276\204.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 797.所有可能的路径 diff --git "a/problems/0827.\346\234\200\345\244\247\344\272\272\345\267\245\345\262\233.md" "b/problems/0827.\346\234\200\345\244\247\344\272\272\345\267\245\345\262\233.md" index 7930c7a18a..e452e4e395 100644 --- "a/problems/0827.\346\234\200\345\244\247\344\272\272\345\267\245\345\262\233.md" +++ "b/problems/0827.\346\234\200\345\244\247\344\272\272\345\267\245\345\262\233.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 827.最大人工岛 diff --git "a/problems/0841.\351\222\245\345\214\231\345\222\214\346\210\277\351\227\264.md" "b/problems/0841.\351\222\245\345\214\231\345\222\214\346\210\277\351\227\264.md" index b4785d1b02..b78693b446 100644 --- "a/problems/0841.\351\222\245\345\214\231\345\222\214\346\210\277\351\227\264.md" +++ "b/problems/0841.\351\222\245\345\214\231\345\222\214\346\210\277\351\227\264.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

diff --git "a/problems/0844.\346\257\224\350\276\203\345\220\253\351\200\200\346\240\274\347\232\204\345\255\227\347\254\246\344\270\262.md" "b/problems/0844.\346\257\224\350\276\203\345\220\253\351\200\200\346\240\274\347\232\204\345\255\227\347\254\246\344\270\262.md" index c7f5220288..c32cdd339b 100644 --- "a/problems/0844.\346\257\224\350\276\203\345\220\253\351\200\200\346\240\274\347\232\204\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/0844.\346\257\224\350\276\203\345\220\253\351\200\200\346\240\274\347\232\204\345\255\227\347\254\246\344\270\262.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 844.比较含退格的字符串 @@ -587,8 +587,8 @@ impl Solution { } ``` +

- diff --git "a/problems/0860.\346\237\240\346\252\254\346\260\264\346\211\276\351\233\266.md" "b/problems/0860.\346\237\240\346\252\254\346\260\264\346\211\276\351\233\266.md" index db70112d8f..804ff13c12 100644 --- "a/problems/0860.\346\237\240\346\252\254\346\260\264\346\211\276\351\233\266.md" +++ "b/problems/0860.\346\237\240\346\252\254\346\260\264\346\211\276\351\233\266.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 860.柠檬水找零 @@ -439,8 +439,8 @@ public class Solution ``` +

- diff --git "a/problems/0922.\346\214\211\345\245\207\345\201\266\346\216\222\345\272\217\346\225\260\347\273\204II.md" "b/problems/0922.\346\214\211\345\245\207\345\201\266\346\216\222\345\272\217\346\225\260\347\273\204II.md" index 72be8fa732..1ac6800c08 100644 --- "a/problems/0922.\346\214\211\345\245\207\345\201\266\346\216\222\345\272\217\346\225\260\347\273\204II.md" +++ "b/problems/0922.\346\214\211\345\245\207\345\201\266\346\216\222\345\272\217\346\225\260\347\273\204II.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

@@ -378,8 +378,8 @@ function sortArrayByParityII(nums: number[]): number[] { }; ``` +

- diff --git "a/problems/0925.\351\225\277\346\214\211\351\224\256\345\205\245.md" "b/problems/0925.\351\225\277\346\214\211\351\224\256\345\205\245.md" index 11edecd0d1..f4a8fa8e52 100644 --- "a/problems/0925.\351\225\277\346\214\211\351\224\256\345\205\245.md" +++ "b/problems/0925.\351\225\277\346\214\211\351\224\256\345\205\245.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 925.长按键入 diff --git "a/problems/0941.\346\234\211\346\225\210\347\232\204\345\261\261\350\204\211\346\225\260\347\273\204.md" "b/problems/0941.\346\234\211\346\225\210\347\232\204\345\261\261\350\204\211\346\225\260\347\273\204.md" index 48c29eb479..9f63f441c2 100644 --- "a/problems/0941.\346\234\211\346\225\210\347\232\204\345\261\261\350\204\211\346\225\260\347\273\204.md" +++ "b/problems/0941.\346\234\211\346\225\210\347\232\204\345\261\261\350\204\211\346\225\260\347\273\204.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 941.有效的山脉数组 @@ -197,8 +197,8 @@ public class Solution { ``` +

- diff --git "a/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" "b/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" index 9743ca2b80..d59496c87d 100644 --- "a/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" @@ -1,9 +1,9 @@ -

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+ diff --git "a/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" "b/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" index 5bdbcbc7e0..f89ad44926 100644 --- "a/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" +++ "b/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

> 双指针风骚起来,也是无敌 @@ -507,8 +507,8 @@ public class Solution { } } ``` +

- diff --git "a/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md" "b/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md" index 8d81e3f8a0..f938c2b734 100644 --- "a/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md" +++ "b/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

@@ -581,8 +581,8 @@ def common_chars(words) end ``` +

- diff --git "a/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" "b/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" index 498015d0cd..fa27d3b7c3 100644 --- "a/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" +++ "b/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 1005.K次取反后最大化的数组和 diff --git "a/problems/1020.\351\243\236\345\234\260\347\232\204\346\225\260\351\207\217.md" "b/problems/1020.\351\243\236\345\234\260\347\232\204\346\225\260\351\207\217.md" index 3488777ad2..59610c6801 100644 --- "a/problems/1020.\351\243\236\345\234\260\347\232\204\346\225\260\351\207\217.md" +++ "b/problems/1020.\351\243\236\345\234\260\347\232\204\346\225\260\351\207\217.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 1020. 飞地的数量 @@ -695,8 +695,8 @@ impl Solution { * 1254. 统计封闭岛屿的数目 +

- diff --git "a/problems/1035.\344\270\215\347\233\270\344\272\244\347\232\204\347\272\277.md" "b/problems/1035.\344\270\215\347\233\270\344\272\244\347\232\204\347\272\277.md" index e0625a2ba3..8ee52c5d48 100644 --- "a/problems/1035.\344\270\215\347\233\270\344\272\244\347\232\204\347\272\277.md" +++ "b/problems/1035.\344\270\215\347\233\270\344\272\244\347\232\204\347\272\277.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 1035.不相交的线 @@ -273,8 +273,8 @@ function maxUncrossedLines(nums1: number[], nums2: number[]): number { ``` +

- diff --git "a/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" "b/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" index ffe1353039..4aa0e95478 100644 --- "a/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" +++ "b/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

> 匹配问题都是栈的强项 @@ -495,8 +495,8 @@ def remove_duplicates(s) end ``` +

- diff --git "a/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" "b/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" index 4c3c01a037..4f2cc9e350 100644 --- "a/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" +++ "b/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 1049.最后一块石头的重量II @@ -497,8 +497,8 @@ public class Solution } ``` +

- diff --git "a/problems/1143.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" "b/problems/1143.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" index 12bd90f8f4..7fa7bb68e1 100644 --- "a/problems/1143.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/1143.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 1143.最长公共子序列 diff --git "a/problems/1207.\347\213\254\344\270\200\346\227\240\344\272\214\347\232\204\345\207\272\347\216\260\346\254\241\346\225\260.md" "b/problems/1207.\347\213\254\344\270\200\346\227\240\344\272\214\347\232\204\345\207\272\347\216\260\346\254\241\346\225\260.md" index 2ccd30c376..5c5f92c339 100644 --- "a/problems/1207.\347\213\254\344\270\200\346\227\240\344\272\214\347\232\204\345\207\272\347\216\260\346\254\241\346\225\260.md" +++ "b/problems/1207.\347\213\254\344\270\200\346\227\240\344\272\214\347\232\204\345\207\272\347\216\260\346\254\241\346\225\260.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 1207.独一无二的出现次数 @@ -224,8 +224,8 @@ func uniqueOccurrences(arr []int) bool { +

- diff --git "a/problems/1221.\345\210\206\345\211\262\345\271\263\350\241\241\345\255\227\347\254\246\344\270\262.md" "b/problems/1221.\345\210\206\345\211\262\345\271\263\350\241\241\345\255\227\347\254\246\344\270\262.md" index 2a7b092290..a32ca98ffc 100644 --- "a/problems/1221.\345\210\206\345\211\262\345\271\263\350\241\241\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/1221.\345\210\206\345\211\262\345\271\263\350\241\241\345\255\227\347\254\246\344\270\262.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 1221. 分割平衡字符串 diff --git "a/problems/1254.\347\273\237\350\256\241\345\260\201\351\227\255\345\262\233\345\261\277\347\232\204\346\225\260\347\233\256.md" "b/problems/1254.\347\273\237\350\256\241\345\260\201\351\227\255\345\262\233\345\261\277\347\232\204\346\225\260\347\233\256.md" index dc8fda41f1..3d7b9fe96c 100644 --- "a/problems/1254.\347\273\237\350\256\241\345\260\201\351\227\255\345\262\233\345\261\277\347\232\204\346\225\260\347\233\256.md" +++ "b/problems/1254.\347\273\237\350\256\241\345\260\201\351\227\255\345\262\233\345\261\277\347\232\204\346\225\260\347\233\256.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 1254. 统计封闭岛屿的数目 @@ -134,9 +134,9 @@ var closedIsland = function(grid) { ``` + +

- - diff --git "a/problems/1334.\351\230\210\345\200\274\350\267\235\347\246\273\345\206\205\351\202\273\345\261\205\346\234\200\345\260\221\347\232\204\345\237\216\345\270\202.md" "b/problems/1334.\351\230\210\345\200\274\350\267\235\347\246\273\345\206\205\351\202\273\345\261\205\346\234\200\345\260\221\347\232\204\345\237\216\345\270\202.md" index 2156ee041d..d8d8861f47 100644 --- "a/problems/1334.\351\230\210\345\200\274\350\267\235\347\246\273\345\206\205\351\202\273\345\261\205\346\234\200\345\260\221\347\232\204\345\237\216\345\270\202.md" +++ "b/problems/1334.\351\230\210\345\200\274\350\267\235\347\246\273\345\206\205\351\202\273\345\261\205\346\234\200\345\260\221\347\232\204\345\237\216\345\270\202.md" @@ -1,3 +1,8 @@ +

+ + + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

floyd @@ -44,3 +49,7 @@ public: return result; } }; +

+ + + diff --git "a/problems/1356.\346\240\271\346\215\256\346\225\260\345\255\227\344\272\214\350\277\233\345\210\266\344\270\2131\347\232\204\346\225\260\347\233\256\346\216\222\345\272\217.md" "b/problems/1356.\346\240\271\346\215\256\346\225\260\345\255\227\344\272\214\350\277\233\345\210\266\344\270\2131\347\232\204\346\225\260\347\233\256\346\216\222\345\272\217.md" index c2455cf043..9cfb674328 100644 --- "a/problems/1356.\346\240\271\346\215\256\346\225\260\345\255\227\344\272\214\350\277\233\345\210\266\344\270\2131\347\232\204\346\225\260\347\233\256\346\216\222\345\272\217.md" +++ "b/problems/1356.\346\240\271\346\215\256\346\225\260\345\255\227\344\272\214\350\277\233\345\210\266\344\270\2131\347\232\204\346\225\260\347\233\256\346\216\222\345\272\217.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

@@ -216,8 +216,8 @@ var sortByBits = function(arr) { ``` +

- diff --git "a/problems/1365.\346\234\211\345\244\232\345\260\221\345\260\217\344\272\216\345\275\223\345\211\215\346\225\260\345\255\227\347\232\204\346\225\260\345\255\227.md" "b/problems/1365.\346\234\211\345\244\232\345\260\221\345\260\217\344\272\216\345\275\223\345\211\215\346\225\260\345\255\227\347\232\204\346\225\260\345\255\227.md" index c706ba216e..94c1eb77c9 100644 --- "a/problems/1365.\346\234\211\345\244\232\345\260\221\345\260\217\344\272\216\345\275\223\345\211\215\346\225\260\345\255\227\347\232\204\346\225\260\345\255\227.md" +++ "b/problems/1365.\346\234\211\345\244\232\345\260\221\345\260\217\344\272\216\345\275\223\345\211\215\346\225\260\345\255\227\347\232\204\346\225\260\345\255\227.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

diff --git "a/problems/1382.\345\260\206\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\345\217\230\345\271\263\350\241\241.md" "b/problems/1382.\345\260\206\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\345\217\230\345\271\263\350\241\241.md" index 57e56b8fe3..120cafffd3 100644 --- "a/problems/1382.\345\260\206\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\345\217\230\345\271\263\350\241\241.md" +++ "b/problems/1382.\345\260\206\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\345\217\230\345\271\263\350\241\241.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 1382.将二叉搜索树变平衡 @@ -217,8 +217,8 @@ function buildTree(arr: number[], left: number, right: number): TreeNode | null +

- diff --git "a/problems/1791.\346\211\276\345\207\272\346\230\237\345\236\213\345\233\276\347\232\204\344\270\255\345\277\203\350\212\202\347\202\271.md" "b/problems/1791.\346\211\276\345\207\272\346\230\237\345\236\213\345\233\276\347\232\204\344\270\255\345\277\203\350\212\202\347\202\271.md" index 9bcc7ef9ca..e3db794706 100644 --- "a/problems/1791.\346\211\276\345\207\272\346\230\237\345\236\213\345\233\276\347\232\204\344\270\255\345\277\203\350\212\202\347\202\271.md" +++ "b/problems/1791.\346\211\276\345\207\272\346\230\237\345\236\213\345\233\276\347\232\204\344\270\255\345\277\203\350\212\202\347\202\271.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 1791.找出星型图的中心节点 diff --git "a/problems/1971.\345\257\273\346\211\276\345\233\276\344\270\255\346\230\257\345\220\246\345\255\230\345\234\250\350\267\257\345\276\204.md" "b/problems/1971.\345\257\273\346\211\276\345\233\276\344\270\255\346\230\257\345\220\246\345\255\230\345\234\250\350\267\257\345\276\204.md" index 5463ec7288..24e81992f0 100644 --- "a/problems/1971.\345\257\273\346\211\276\345\233\276\344\270\255\346\230\257\345\220\246\345\255\230\345\234\250\350\267\257\345\276\204.md" +++ "b/problems/1971.\345\257\273\346\211\276\345\233\276\344\270\255\346\230\257\345\220\246\345\255\230\345\234\250\350\267\257\345\276\204.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 1971. 寻找图中是否存在路径 diff --git "a/problems/O(n)\347\232\204\347\256\227\346\263\225\345\261\205\347\204\266\350\266\205\346\227\266\344\272\206\357\274\214\346\255\244\346\227\266\347\232\204n\347\251\266\347\253\237\346\230\257\345\244\232\345\244\247\357\274\237.md" "b/problems/O(n)\347\232\204\347\256\227\346\263\225\345\261\205\347\204\266\350\266\205\346\227\266\344\272\206\357\274\214\346\255\244\346\227\266\347\232\204n\347\251\266\347\253\237\346\230\257\345\244\232\345\244\247\357\274\237.md" index 8be48f38c2..a5dab942c8 100644 --- "a/problems/O(n)\347\232\204\347\256\227\346\263\225\345\261\205\347\204\266\350\266\205\346\227\266\344\272\206\357\274\214\346\255\244\346\227\266\347\232\204n\347\251\266\347\253\237\346\230\257\345\244\232\345\244\247\357\274\237.md" +++ "b/problems/O(n)\347\232\204\347\256\227\346\263\225\345\261\205\347\204\266\350\266\205\346\227\266\344\272\206\357\274\214\346\255\244\346\227\266\347\232\204n\347\251\266\347\253\237\346\230\257\345\244\232\345\244\247\357\274\237.md" @@ -1,9 +1,9 @@ -

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+ # 程序提交之后为什么会超时?O(n)的算法会超时,n究竟是多大? @@ -223,8 +223,8 @@ int main() { +

- diff --git a/problems/toolgithub.sh b/problems/toolgithub.sh index ebe9c7df7d..9e005f0c0e 100644 --- a/problems/toolgithub.sh +++ b/problems/toolgithub.sh @@ -7,21 +7,35 @@ ######################################################################### #!/bin/bash +#

+# +# +# +#

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+ +# +#

+# +# +# + for i in *.md do if [[ $i != 'README.md' ]] then # 移除开头 - # sed -i '' '/align/d;/\"\"><\/a>/d;/<\/p>/d;/<\/a>/d;/20210924105952.png/d;/_blank/d' $i - # # 移除结尾 - # sed -i '' '/--------------/d;/训练营/d;' $i - # # 添加开头 - # # 记得从后向前添加 - # ex -sc '1i|

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

' -cx $i - # ex -sc '1i|' -cx $i - # ex -sc '1i| ' -cx $i - # ex -sc '1i|' -cx $i - # ex -sc '1i|

' -cx $i + sed -i '' '/align/d;/\"\"><\/a>/d;/<\/p>/d;/<\/a>/d;/20210924105952.png/d;/_blank/d' $i + # 移除结尾 + sed -i '' '/训练营/d;/网站星球宣传海报/d' $i + + + # 添加开头 + # 记得从后向前添加 + ex -sc '1i|

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

' -cx $i + ex -sc '1i|' -cx $i + ex -sc '1i| ' -cx $i + ex -sc '1i|' -cx $i + ex -sc '1i|

' -cx $i # echo '## 其他语言版本' >> $i # echo '\n' >> $i # echo 'Java:' >> $i diff --git "a/problems/\344\270\272\344\272\206\347\273\235\346\235\200\347\274\226\350\276\221\350\267\235\347\246\273\357\274\214\345\215\241\345\260\224\345\201\232\344\272\206\344\270\211\346\255\245\351\223\272\345\236\253.md" "b/problems/\344\270\272\344\272\206\347\273\235\346\235\200\347\274\226\350\276\221\350\267\235\347\246\273\357\274\214\345\215\241\345\260\224\345\201\232\344\272\206\344\270\211\346\255\245\351\223\272\345\236\253.md" index 442a505573..c2f5efd96d 100644 --- "a/problems/\344\270\272\344\272\206\347\273\235\346\235\200\347\274\226\350\276\221\350\267\235\347\246\273\357\274\214\345\215\241\345\260\224\345\201\232\344\272\206\344\270\211\346\255\245\351\223\272\345\236\253.md" +++ "b/problems/\344\270\272\344\272\206\347\273\235\346\235\200\347\274\226\350\276\221\350\267\235\347\246\273\357\274\214\345\215\241\345\260\224\345\201\232\344\272\206\344\270\211\346\255\245\351\223\272\345\236\253.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 动态规划之编辑距离总结篇 diff --git "a/problems/\344\272\214\345\217\211\346\240\221\344\270\255\351\200\222\345\275\222\345\270\246\347\235\200\345\233\236\346\272\257.md" "b/problems/\344\272\214\345\217\211\346\240\221\344\270\255\351\200\222\345\275\222\345\270\246\347\235\200\345\233\236\346\272\257.md" index 67570bc8d6..42d78ae39f 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\344\270\255\351\200\222\345\275\222\345\270\246\347\235\200\345\233\236\346\272\257.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\344\270\255\351\200\222\345\275\222\345\270\246\347\235\200\345\233\236\346\272\257.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 二叉树:以为使用了递归,其实还隐藏着回溯 diff --git "a/problems/\344\272\214\345\217\211\346\240\221\346\200\273\347\273\223\347\257\207.md" "b/problems/\344\272\214\345\217\211\346\240\221\346\200\273\347\273\223\347\257\207.md" index 739184bbf7..8db40d6560 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\346\200\273\347\273\223\347\257\207.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 二叉树:总结篇!(需要掌握的二叉树技能都在这里了) diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" index 50d592a24c..c665827791 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -1,9 +1,9 @@ -

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+ # 二叉树理论基础篇 @@ -313,8 +313,8 @@ public class TreeNode public TreeNode(int x) { val = x; } } ``` +

- diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\347\273\237\344\270\200\350\277\255\344\273\243\346\263\225.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\347\273\237\344\270\200\350\277\255\344\273\243\346\263\225.md" index ee4899b1b1..13c507375b 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\347\273\237\344\270\200\350\277\255\344\273\243\346\263\225.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\347\273\237\344\270\200\350\277\255\344\273\243\346\263\225.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

> 统一写法是一种什么感觉 @@ -835,8 +835,8 @@ public IList PostorderTraversal(TreeNode root) } ``` +

- diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" index 35a01a7fbe..8549bac154 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

> 听说还可以用非递归的方式 diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" index 4621d4a739..11a3d716e4 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

> 一看就会,一写就废! @@ -631,8 +631,8 @@ public void Traversal(TreeNode cur, IList res) } ``` +

- diff --git "a/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" "b/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" index 040be29983..f5803cb452 100644 --- "a/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" +++ "b/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 替换数字 @@ -170,8 +170,8 @@ for (int i = 0; i < a.size(); i++) { +

- diff --git "a/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" "b/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" index 138cf3a88d..e32f4ce15d 100644 --- "a/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 右旋字符串 diff --git "a/problems/\345\212\250\346\200\201\350\247\204\345\210\222-\350\202\241\347\245\250\351\227\256\351\242\230\346\200\273\347\273\223\347\257\207.md" "b/problems/\345\212\250\346\200\201\350\247\204\345\210\222-\350\202\241\347\245\250\351\227\256\351\242\230\346\200\273\347\273\223\347\257\207.md" index 4df21fb761..7927deb7d7 100644 --- "a/problems/\345\212\250\346\200\201\350\247\204\345\210\222-\350\202\241\347\245\250\351\227\256\351\242\230\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/\345\212\250\346\200\201\350\247\204\345\210\222-\350\202\241\347\245\250\351\227\256\351\242\230\346\200\273\347\273\223\347\257\207.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# Leetcode股票问题总结篇! @@ -473,8 +473,8 @@ public: +

- diff --git "a/problems/\345\212\250\346\200\201\350\247\204\345\210\222\346\200\273\347\273\223\347\257\207.md" "b/problems/\345\212\250\346\200\201\350\247\204\345\210\222\346\200\273\347\273\223\347\257\207.md" index e28bfd0472..3dda376855 100644 --- "a/problems/\345\212\250\346\200\201\350\247\204\345\210\222\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/\345\212\250\346\200\201\350\247\204\345\210\222\346\200\273\347\273\223\347\257\207.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 动态规划最强总结篇! diff --git "a/problems/\345\212\250\346\200\201\350\247\204\345\210\222\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\345\212\250\346\200\201\350\247\204\345\210\222\347\220\206\350\256\272\345\237\272\347\241\200.md" index bff26d1d34..c9420d24eb 100644 --- "a/problems/\345\212\250\346\200\201\350\247\204\345\210\222\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\345\212\250\346\200\201\350\247\204\345\210\222\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 动态规划理论基础 @@ -131,8 +131,8 @@ 今天我们开始新的征程了,你准备好了么? +

- diff --git "a/problems/\345\217\214\346\214\207\351\222\210\346\200\273\347\273\223.md" "b/problems/\345\217\214\346\214\207\351\222\210\346\200\273\347\273\223.md" index 6621e0396b..02a8f98629 100644 --- "a/problems/\345\217\214\346\214\207\351\222\210\346\200\273\347\273\223.md" +++ "b/problems/\345\217\214\346\214\207\351\222\210\346\200\273\347\273\223.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

> 又是一波总结 diff --git "a/problems/\345\223\210\345\270\214\350\241\250\346\200\273\347\273\223.md" "b/problems/\345\223\210\345\270\214\350\241\250\346\200\273\347\273\223.md" index 465ef9d1da..cde23ad138 100644 --- "a/problems/\345\223\210\345\270\214\350\241\250\346\200\273\347\273\223.md" +++ "b/problems/\345\223\210\345\270\214\350\241\250\346\200\273\347\273\223.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

> 哈希表总结篇如约而至 @@ -125,8 +125,8 @@ std::unordered_map 底层实现为哈希,std::map 和std::multimap 的底层 +

- diff --git "a/problems/\345\223\210\345\270\214\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\345\223\210\345\270\214\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" index e426c65791..de18447017 100644 --- "a/problems/\345\223\210\345\270\214\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\345\223\210\345\270\214\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -1,9 +1,9 @@ -

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+ diff --git "a/problems/\345\233\236\346\272\257\346\200\273\347\273\223.md" "b/problems/\345\233\236\346\272\257\346\200\273\347\273\223.md" index 5d4c945075..8d9b78c4b9 100644 --- "a/problems/\345\233\236\346\272\257\346\200\273\347\273\223.md" +++ "b/problems/\345\233\236\346\272\257\346\200\273\347\273\223.md" @@ -1,9 +1,9 @@ -

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+ > 20张树形结构图、14道精选回溯题目,21篇回溯法精讲文章,由浅入深,一气呵成,这是全网最强回溯算法总结! @@ -447,8 +447,8 @@ N皇后问题分析: **回溯算法系列正式结束,新的系列终将开始,录友们准备开启新的征程!** +

- diff --git "a/problems/\345\233\236\346\272\257\347\256\227\346\263\225\345\216\273\351\207\215\351\227\256\351\242\230\347\232\204\345\217\246\344\270\200\347\247\215\345\206\231\346\263\225.md" "b/problems/\345\233\236\346\272\257\347\256\227\346\263\225\345\216\273\351\207\215\351\227\256\351\242\230\347\232\204\345\217\246\344\270\200\347\247\215\345\206\231\346\263\225.md" index 2be79805af..96dfeffec3 100644 --- "a/problems/\345\233\236\346\272\257\347\256\227\346\263\225\345\216\273\351\207\215\351\227\256\351\242\230\347\232\204\345\217\246\344\270\200\347\247\215\345\206\231\346\263\225.md" +++ "b/problems/\345\233\236\346\272\257\347\256\227\346\263\225\345\216\273\351\207\215\351\227\256\351\242\230\347\232\204\345\217\246\344\270\200\347\247\215\345\206\231\346\263\225.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 回溯算法去重问题的另一种写法 @@ -708,8 +708,8 @@ impl Solution { } ``` +

- diff --git "a/problems/\345\233\236\346\272\257\347\256\227\346\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\345\233\236\346\272\257\347\256\227\346\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md" index f22c67b137..862fb101a1 100644 --- "a/problems/\345\233\236\346\272\257\347\256\227\346\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\345\233\236\346\272\257\347\256\227\346\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 回溯算法理论基础 @@ -175,8 +175,8 @@ void backtracking(参数) { +

- diff --git "a/problems/\345\233\276\350\256\272\345\271\266\346\237\245\351\233\206\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\345\233\276\350\256\272\345\271\266\346\237\245\351\233\206\347\220\206\350\256\272\345\237\272\347\241\200.md" index 6a1456e950..6a9cc1aca2 100644 --- "a/problems/\345\233\276\350\256\272\345\271\266\346\237\245\351\233\206\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\345\233\276\350\256\272\345\271\266\346\237\245\351\233\206\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -1,3 +1,8 @@ +

+ + + +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 并查集理论基础 @@ -456,3 +461,7 @@ void join(int u, int v) { 敬请期待 并查集题目精讲系列。 +

+ + + diff --git "a/problems/\345\233\276\350\256\272\345\271\277\346\220\234\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\345\233\276\350\256\272\345\271\277\346\220\234\347\220\206\350\256\272\345\237\272\347\241\200.md" index b631f4f5c5..51a82944ea 100644 --- "a/problems/\345\233\276\350\256\272\345\271\277\346\220\234\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\345\233\276\350\256\272\345\271\277\346\220\234\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 广度优先搜索理论基础 diff --git "a/problems/\345\233\276\350\256\272\346\267\261\346\220\234\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\345\233\276\350\256\272\346\267\261\346\220\234\347\220\206\350\256\272\345\237\272\347\241\200.md" index 7f847f8fae..9e8d90a3db 100644 --- "a/problems/\345\233\276\350\256\272\346\267\261\346\220\234\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\345\233\276\350\256\272\346\267\261\346\220\234\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 深度优先搜索理论基础 diff --git "a/problems/\345\255\227\347\254\246\344\270\262\346\200\273\347\273\223.md" "b/problems/\345\255\227\347\254\246\344\270\262\346\200\273\347\273\223.md" index df4db78729..7da9791400 100644 --- "a/problems/\345\255\227\347\254\246\344\270\262\346\200\273\347\273\223.md" +++ "b/problems/\345\255\227\347\254\246\344\270\262\346\200\273\347\273\223.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 字符串:总结篇 diff --git "a/problems/\346\225\260\347\273\204\346\200\273\347\273\223\347\257\207.md" "b/problems/\346\225\260\347\273\204\346\200\273\347\273\223\347\257\207.md" index 7550ce0254..2a2681abed 100644 --- "a/problems/\346\225\260\347\273\204\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/\346\225\260\347\273\204\346\200\273\347\273\223\347\257\207.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 数组总结篇 diff --git "a/problems/\346\225\260\347\273\204\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\346\225\260\347\273\204\347\220\206\350\256\272\345\237\272\347\241\200.md" index d104c883f7..05451b3cd3 100644 --- "a/problems/\346\225\260\347\273\204\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\346\225\260\347\273\204\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

diff --git "a/problems/\346\240\210\344\270\216\351\230\237\345\210\227\346\200\273\347\273\223.md" "b/problems/\346\240\210\344\270\216\351\230\237\345\210\227\346\200\273\347\273\223.md" index 06a7827050..090beff6b5 100644 --- "a/problems/\346\240\210\344\270\216\351\230\237\345\210\227\346\200\273\347\273\223.md" +++ "b/problems/\346\240\210\344\270\216\351\230\237\345\210\227\346\200\273\347\273\223.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 栈与队列总结篇 @@ -159,8 +159,8 @@ cd a/b/c/../../ 好了,栈与队列我们就总结到这里了,接下来Carl就要带大家开启新的篇章了,大家加油! +

- diff --git "a/problems/\346\240\210\344\270\216\351\230\237\345\210\227\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\346\240\210\344\270\216\351\230\237\345\210\227\347\220\206\350\256\272\345\237\272\347\241\200.md" index ad748e489e..21c61a4c8b 100644 --- "a/problems/\346\240\210\344\270\216\351\230\237\345\210\227\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\346\240\210\344\270\216\351\230\237\345\210\227\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

> 来看看栈和队列不为人知的一面 @@ -92,8 +92,8 @@ std::queue> third; // 定义以list为底层容器的队列 +

- diff --git "a/problems/\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227\357\274\210vector\345\216\237\347\220\206\350\256\262\350\247\243\357\274\211.md" "b/problems/\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227\357\274\210vector\345\216\237\347\220\206\350\256\262\350\247\243\357\274\211.md" index 5f9b46b373..70a9a97a19 100644 --- "a/problems/\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227\357\274\210vector\345\216\237\347\220\206\350\256\262\350\247\243\357\274\211.md" +++ "b/problems/\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227\357\274\210vector\345\216\237\347\220\206\350\256\262\350\247\243\357\274\211.md" @@ -1,9 +1,9 @@ -

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+ diff --git "a/problems/\347\256\227\346\263\225\346\250\241\346\235\277.md" "b/problems/\347\256\227\346\263\225\346\250\241\346\235\277.md" index 21b7f93b1c..0d32cebb2d 100644 --- "a/problems/\347\256\227\346\263\225\346\250\241\346\235\277.md" +++ "b/problems/\347\256\227\346\263\225\346\250\241\346\235\277.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 算法模板 ## 算法模板 diff --git "a/problems/\350\203\214\345\214\205\346\200\273\347\273\223\347\257\207.md" "b/problems/\350\203\214\345\214\205\346\200\273\347\273\223\347\257\207.md" index 9be93096fd..651a92a804 100644 --- "a/problems/\350\203\214\345\214\205\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/\350\203\214\345\214\205\346\200\273\347\273\223\347\257\207.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 听说背包问题很难? 这篇总结篇来拯救你了 @@ -102,8 +102,8 @@ +

- diff --git "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" index 413d984c08..fa11fb94bc 100644 --- "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" +++ "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" @@ -1,9 +1,9 @@ -

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+ # 动态规划:01背包理论基础 diff --git "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" index 5630bc99d1..b5838c5df8 100644 --- "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" +++ "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 动态规划:01背包理论基础(滚动数组) @@ -503,8 +503,8 @@ fn test_wei_bag_problem2() { } ``` +

- diff --git "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\244\232\351\207\215\350\203\214\345\214\205.md" "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\244\232\351\207\215\350\203\214\345\214\205.md" index 5d6440e3bf..da1ee02ff5 100644 --- "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\244\232\351\207\215\350\203\214\345\214\205.md" +++ "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\244\232\351\207\215\350\203\214\345\214\205.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 动态规划:关于多重背包,你该了解这些! @@ -213,8 +213,8 @@ class multi_pack{ +

- diff --git "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" index efc56c50ac..3a50ee7bbf 100644 --- "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" +++ "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 动态规划:完全背包理论基础 @@ -505,8 +505,8 @@ fn test_complete_pack() { } ``` +

- diff --git "a/problems/\350\264\252\345\277\203\347\256\227\346\263\225\346\200\273\347\273\223\347\257\207.md" "b/problems/\350\264\252\345\277\203\347\256\227\346\263\225\346\200\273\347\273\223\347\257\207.md" index d49cdc5fb1..14d82151c9 100644 --- "a/problems/\350\264\252\345\277\203\347\256\227\346\263\225\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/\350\264\252\345\277\203\347\256\227\346\263\225\346\200\273\347\273\223\347\257\207.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 贪心算法总结篇 @@ -150,8 +150,8 @@ Carl个人认为:如果找出局部最优并可以推出全局最优,就是 +

- diff --git "a/problems/\350\264\252\345\277\203\347\256\227\346\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\350\264\252\345\277\203\347\256\227\346\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md" index cac2929251..f042c0acf3 100644 --- "a/problems/\350\264\252\345\277\203\347\256\227\346\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\350\264\252\345\277\203\347\256\227\346\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 关于贪心算法,你该了解这些! diff --git "a/problems/\351\223\276\350\241\250\346\200\273\347\273\223\347\257\207.md" "b/problems/\351\223\276\350\241\250\346\200\273\347\273\223\347\257\207.md" index b2b1b7795f..7da0d2de3c 100644 --- "a/problems/\351\223\276\350\241\250\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/\351\223\276\350\241\250\346\200\273\347\273\223\347\257\207.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 链表总结篇 @@ -97,8 +97,8 @@ +

- diff --git "a/problems/\351\223\276\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\351\223\276\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" index 88e41d7d3b..d131380728 100644 --- "a/problems/\351\223\276\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\351\223\276\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -1,9 +1,9 @@ -

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+ diff --git "a/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" "b/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" index e2905d49be..b0f2e8eaea 100644 --- "a/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" +++ "b/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" @@ -1,8 +1,8 @@

- + -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 面试题 02.07. 链表相交 From 07c0dedbb269ed680a5b2d4e870d26bff1ffce47 Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Wed, 24 Apr 2024 17:23:45 +0800 Subject: [PATCH 2612/3019] Update --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 9e88dfb781..5389c89a9b 100644 --- a/README.md +++ b/README.md @@ -177,8 +177,9 @@ ## 二叉树 + 题目分类大纲如下: -二叉树大纲 +二叉树大纲 1. [关于二叉树,你该了解这些!](./problems/二叉树理论基础.md) 2. [二叉树:二叉树的递归遍历](./problems/二叉树的递归遍历.md) @@ -220,7 +221,7 @@ 题目分类大纲如下: -回溯算法大纲 +回溯算法大纲 1. [关于回溯算法,你该了解这些!](./problems/回溯算法理论基础.md) 2. [回溯算法:77.组合](./problems/0077.组合.md) From 00a4cdc161413dccf044b3b573a3d87cacf276d0 Mon Sep 17 00:00:00 2001 From: zhengprince Date: Thu, 25 Apr 2024 15:21:13 +0800 Subject: [PATCH 2613/3019] =?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.\347\233\256\346\240\207\345\222\214.md" | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git "a/problems/0494.\347\233\256\346\240\207\345\222\214.md" "b/problems/0494.\347\233\256\346\240\207\345\222\214.md" index cacf6dfa18..a3d79d2bb5 100644 --- "a/problems/0494.\347\233\256\346\240\207\345\222\214.md" +++ "b/problems/0494.\347\233\256\346\240\207\345\222\214.md" @@ -173,9 +173,9 @@ dp[j] 表示:填满j(包括j)这么大容积的包,有dp[j]种方法 * 已经有一个1(nums[i]) 的话,有 dp[4]种方法 凑成 容量为5的背包。 * 已经有一个2(nums[i]) 的话,有 dp[3]种方法 凑成 容量为5的背包。 -* 已经有一个3(nums[i]) 的话,有 dp[2]中方法 凑成 容量为5的背包 -* 已经有一个4(nums[i]) 的话,有 dp[1]中方法 凑成 容量为5的背包 -* 已经有一个5 (nums[i])的话,有 dp[0]中方法 凑成 容量为5的背包 +* 已经有一个3(nums[i]) 的话,有 dp[2]种方法 凑成 容量为5的背包 +* 已经有一个4(nums[i]) 的话,有 dp[1]种方法 凑成 容量为5的背包 +* 已经有一个5 (nums[i])的话,有 dp[0]种方法 凑成 容量为5的背包 那么凑整dp[5]有多少方法呢,也就是把 所有的 dp[j - nums[i]] 累加起来。 From f755ecc5fcce894cdbcc9c7eadfaf7bb123a3b1b Mon Sep 17 00:00:00 2001 From: qiufeihong2018 <15058301288@163.com> Date: Thu, 25 Apr 2024 17:34:06 +0800 Subject: [PATCH 2614/3019] =?UTF-8?q?refactor:=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=A0=91=E7=9A=84=E9=80=92=E5=BD=92=E9=81=8D?= =?UTF-8?q?=E5=8E=86.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...22\345\275\222\351\201\215\345\216\206.md" | 111 ++++++++++++------ 1 file changed, 75 insertions(+), 36 deletions(-) diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" index 4621d4a739..ac42f69fed 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" @@ -48,7 +48,7 @@ void traversal(TreeNode* cur, vector& vec) if (cur == NULL) return; ``` -3. **确定单层递归的逻辑**:前序遍历是中左右的循序,所以在单层递归的逻辑,是要先取中节点的数值,代码如下: +3. **确定单层递归的逻辑**:前序遍历是中左右的顺序,所以在单层递归的逻辑,是要先取中节点的数值,代码如下: ```cpp vec.push_back(cur->val); // 中 @@ -287,52 +287,91 @@ func postorderTraversal(root *TreeNode) (res []int) { 前序遍历: ```Javascript var preorderTraversal = function(root) { - let res=[]; - const dfs=function(root){ - if(root===null)return ; - //先序遍历所以从父节点开始 - res.push(root.val); - //递归左子树 - dfs(root.left); - //递归右子树 - dfs(root.right); - } - //只使用一个参数 使用闭包进行存储结果 - dfs(root); - return res; +// 第一种 +// let res=[]; +// const dfs=function(root){ +// if(root===null)return ; +// //先序遍历所以从父节点开始 +// res.push(root.val); +// //递归左子树 +// dfs(root.left); +// //递归右子树 +// dfs(root.right); +// } +// //只使用一个参数 使用闭包进行存储结果 +// dfs(root); +// return res; +// 第二种 + return root + ? [ + // 前序遍历:中左右 + root.val, + // 递归左子树 + ...preorderTraversal(root.left), + // 递归右子树 + ...preorderTraversal(root.right), + ] + : []; }; ``` 中序遍历 ```javascript var inorderTraversal = function(root) { - let res=[]; - const dfs=function(root){ - if(root===null){ - return ; - } - dfs(root.left); - res.push(root.val); - dfs(root.right); - } - dfs(root); - return res; +// 第一种 + + // let res=[]; + // const dfs=function(root){ + // if(root===null){ + // return ; + // } + // dfs(root.left); + // res.push(root.val); + // dfs(root.right); + // } + // dfs(root); + // return res; + +// 第二种 + return root + ? [ + // 中序遍历:左中右 + // 递归左子树 + ...inorderTraversal(root.left), + root.val, + // 递归右子树 + ...inorderTraversal(root.right), + ] + : []; }; ``` 后序遍历 ```javascript var postorderTraversal = function(root) { - let res=[]; - const dfs=function(root){ - if(root===null){ - return ; - } - dfs(root.left); - dfs(root.right); - res.push(root.val); - } - dfs(root); - return res; + // 第一种 + // let res=[]; + // const dfs=function(root){ + // if(root===null){ + // return ; + // } + // dfs(root.left); + // dfs(root.right); + // res.push(root.val); + // } + // dfs(root); + // return res; + + // 第二种 + // 后续遍历:左右中 + return root + ? [ + // 递归左子树 + ...postorderTraversal(root.left), + // 递归右子树 + ...postorderTraversal(root.right), + root.val, + ] + : []; }; ``` From 5955c1de5dc8811b30c29c49121cb8ad42ff32c4 Mon Sep 17 00:00:00 2001 From: yawebNW <38253154+yawebNW@users.noreply.github.com> Date: Fri, 26 Apr 2024 11:48:33 +0800 Subject: [PATCH 2615/3019] =?UTF-8?q?Update=200332.=E9=87=8D=E6=96=B0?= =?UTF-8?q?=E5=AE=89=E6=8E=92=E8=A1=8C=E7=A8=8B.md=20=E6=9B=B4=E6=96=B0jav?= =?UTF-8?q?a=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit java最后一个方法新增去重逻辑,原代码遇到循环时会无限递归 --- ...\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" | 2 ++ 1 file changed, 2 insertions(+) diff --git "a/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" "b/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" index 144672a9aa..bc453c51ee 100644 --- "a/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" +++ "b/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" @@ -379,6 +379,8 @@ class Solution { String targetLocation; //遍历从当前位置出发的机票 for (int i = 0; i < targetLocations.size(); i++) { + //去重,否则在最后一个测试用例中遇到循环时会无限递归 + if(i > 0 && targetLocations.get(i).equals(targetLocations.get(i - 1))) continue; targetLocation = targetLocations.get(i); //删除终点列表中当前的终点 targetLocations.remove(i); From c3ca80645400a5a87767020d66af6c981db5336d Mon Sep 17 00:00:00 2001 From: francisshzhu Date: Fri, 26 Apr 2024 12:50:59 +0800 Subject: [PATCH 2616/3019] =?UTF-8?q?=E4=BF=AE=E6=94=B90332.=E9=87=8D?= =?UTF-8?q?=E6=96=B0=E5=AE=89=E6=8E=92=E8=A1=8C=E7=A8=8B.md=20=E4=B8=ADpyt?= =?UTF-8?q?hon=E8=A7=A3=E6=B3=95=E7=9A=84markdown=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...6\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" | 1 - 1 file changed, 1 deletion(-) diff --git "a/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" "b/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" index 144672a9aa..bbe3a001e7 100644 --- "a/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" +++ "b/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" @@ -419,7 +419,6 @@ class Solution { ``` ### Python -``` 回溯 使用字典 ```python class Solution: From 1c390b3562b03be7a24933455b76a9187996ff72 Mon Sep 17 00:00:00 2001 From: xqsrpanz Date: Fri, 26 Apr 2024 18:01:03 +0800 Subject: [PATCH 2617/3019] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=BA=86=20JavaScr?= =?UTF-8?q?ipt=20=E8=A7=A3=E6=B3=95=E4=BA=8C=EF=BC=8C=E5=A0=86=20pop=20?= =?UTF-8?q?=E6=96=B9=E6=B3=95=E6=97=A0=E6=B3=95=E5=A4=84=E7=90=86=E6=95=B0?= =?UTF-8?q?=E7=BB=84=E9=95=BF=E5=BA=A6=20<=3D=201=20=E7=9A=84=E8=BE=B9?= =?UTF-8?q?=E7=95=8C=E6=83=85=E5=86=B5=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\252\351\253\230\351\242\221\345\205\203\347\264\240.md" | 6 ++++++ 1 file changed, 6 insertions(+) diff --git "a/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" "b/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" index 34d9f82c1b..8a219c6a41 100644 --- "a/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" +++ "b/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" @@ -405,6 +405,11 @@ class Heap { // 获取堆顶元素并移除 pop() { + // 边界情况,只有一个元素或没有元素应直接弹出 + if (this.size() <= 1) { + return this.queue.pop() + } + // 堆顶元素 const out = this.queue[0]; @@ -608,3 +613,4 @@ impl Solution { + From bcdf3e4ecdf352ee5f6a9d539bd980c66c3ea93e Mon Sep 17 00:00:00 2001 From: xqsrpanz <129468278+xqsrpanz@users.noreply.github.com> Date: Fri, 26 Apr 2024 19:45:18 +0800 Subject: [PATCH 2618/3019] =?UTF-8?q?Update=200347.=E5=89=8DK=E4=B8=AA?= =?UTF-8?q?=E9=AB=98=E9=A2=91=E5=85=83=E7=B4=A0.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 修复了 JavaScript 解法二,堆 pop 方法无法处理数组长度 <= 1 的边界情况的问题 2. 删除了有误导性的条件判断。事实上,被删除的表达式永远为真(searchChild !== undefined)。原作者想表达的意思可能是 this.queue[searchChild] !== undefined,而实际上,这个判断也是不必要的,这种情况会被后续的 this.compare(index, searchChild) > 0 判断排除。但鉴于本项目的教程性质,直接去除可能会导致语义不清,考虑酌情将原处替换为 this.queue[searchChild] !== undefined 或直接删除 --- ...\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" "b/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" index 8a219c6a41..cca9b0edce 100644 --- "a/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" +++ "b/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" @@ -421,7 +421,7 @@ class Heap { let left = 1; // left 是左子节点下标 left + 1 则是右子节点下标 let searchChild = this.compare(left, left + 1) > 0 ? left + 1 : left; - while (searchChild !== undefined && this.compare(index, searchChild) > 0) { // 注意compare参数顺序 + while (this.compare(index, searchChild) > 0) { // 注意compare参数顺序 [this.queue[index], this.queue[searchChild]] = [this.queue[searchChild], this.queue[index]]; // 更新下标 From 9356debd174b412729496b9ee254597967d551b2 Mon Sep 17 00:00:00 2001 From: Haoting <1165101405@qq.com> Date: Sat, 27 Apr 2024 17:08:54 +0800 Subject: [PATCH 2619/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A00104=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?=20C=E8=AF=AD=E8=A8=80=E8=BF=AD=E4=BB=A3=E6=B3=95=E2=80=94?= =?UTF-8?q?=E2=80=94=E5=90=8E=E5=BA=8F=E9=81=8D=E5=8E=86=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...00\345\244\247\346\267\261\345\272\246.md" | 37 ++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git "a/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" "b/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" index 0f93cb0fc1..607e195b42 100644 --- "a/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" +++ "b/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" @@ -829,7 +829,42 @@ int maxDepth(struct TreeNode* root){ return depth; } ``` - +二叉树最大深度迭代——后序遍历实现 +```c +int maxDepth(struct TreeNode *root) +{ + if(root == NULL) + return 0; + struct TreeNode *stack[10000] = {}; + int top = -1; + struct TreeNode *p = root, *r = NULL; // r指向上一个被访问的结点 + int depth = 0, maxDepth = -1; + while(p != NULL || top >= 0) + { + if(p != NULL) + { + stack[++top] = p; + depth++; + p = p->left; + } + else + { + p = stack[top]; + if(p->right != NULL && p->right != r) // 右子树未被访问 + p = p->right; + else + { + if(depth >= maxDepth) maxDepth = depth; + p = stack[top--]; + depth--; + r = p; + p = NULL; + } + } + } + return maxDepth; +} +``` ### Swift: 104.二叉树的最大深度 From 8dcfd4f319c219fca9db3268f3cecff3a3156b59 Mon Sep 17 00:00:00 2001 From: Haoting <1165101405@qq.com> Date: Sat, 27 Apr 2024 17:10:20 +0800 Subject: [PATCH 2620/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A00055=E5=8F=B3?= =?UTF-8?q?=E6=97=8B=E5=AD=97=E7=AC=A6=E4=B8=B2=20C=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 --- ...13\345\255\227\347\254\246\344\270\262.md" | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git "a/problems/kamacoder/0055.\345\217\263\346\227\213\345\255\227\347\254\246\344\270\262.md" "b/problems/kamacoder/0055.\345\217\263\346\227\213\345\255\227\347\254\246\344\270\262.md" index 7137186042..22be955f47 100644 --- "a/problems/kamacoder/0055.\345\217\263\346\227\213\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/kamacoder/0055.\345\217\263\346\227\213\345\255\227\347\254\246\344\270\262.md" @@ -253,6 +253,47 @@ func main(){ ``` +### C: +```C +#include +#include + +void reverse(char *s, int left, int right) +{ + while(left <= right) + { + char c = s[left]; + s[left] = s[right]; + s[right] = c; + left++; + right--; + } +} + +void rightRotate(char *s, int k) +{ + int len = strlen(s); + // 先局部反转再整体反转 + reverse(s, 0, len - k - 1); // 反转前部分 + reverse(s, len - k, len - 1); // 反转后部分:后k位 + reverse(s, 0, len - 1); // 整体反转 +} + +int main() +{ + + int k; + scanf("%d", &k); + char s[10000]; + scanf("%s", s); + + rightRotate(s, k); + printf("%s\n", s); + + return 0; +} +``` + ### JavaScript: From b06601c58c08a8647c64af82034e41f1b06d8618 Mon Sep 17 00:00:00 2001 From: markwang Date: Sun, 28 Apr 2024 15:18:01 +0800 Subject: [PATCH 2621/3019] =?UTF-8?q?54.=E8=9E=BA=E6=97=8B=E7=9F=A9?= =?UTF-8?q?=E9=98=B5=E5=A2=9E=E5=8A=A0Go=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...72\346\227\213\347\237\251\351\230\265.md" | 76 +++++++++++++++++++ 1 file changed, 76 insertions(+) diff --git "a/problems/0054.\350\236\272\346\227\213\347\237\251\351\230\265.md" "b/problems/0054.\350\236\272\346\227\213\347\237\251\351\230\265.md" index 4d54ccd6d7..175ae14745 100644 --- "a/problems/0054.\350\236\272\346\227\213\347\237\251\351\230\265.md" +++ "b/problems/0054.\350\236\272\346\227\213\347\237\251\351\230\265.md" @@ -348,6 +348,82 @@ class Solution(object): return print_list ``` +### Go: + +```go +func spiralOrder(matrix [][]int) []int { + rows := len(matrix) + if rows == 0 { + return []int{} + } + columns := len(matrix[0]) + if columns == 0 { + return []int{} + } + res := make([]int, rows * columns) + startx, starty := 0, 0 // 定义每循环一个圈的起始位置 + loop := min(rows, columns) / 2 + mid := min(rows, columns) / 2 + count := 0 // 用来给矩阵中每一个空格赋值 + offset := 1 // 每一圈循环,需要控制每一条边遍历的长度 + for loop > 0 { + i, j := startx, starty + + // 模拟填充上行从左到右(左闭右开) + for ; j < starty + columns - offset; j++ { + res[count] = matrix[startx][j] + count++ + } + // 模拟填充右列从上到下(左闭右开) + for ; i < startx + rows - offset; i++ { + res[count] = matrix[i][j] + count++ + } + // 模拟填充下行从右到左(左闭右开) + for ; j > starty; j-- { + res[count] = matrix[i][j] + count++ + } + // 模拟填充左列从下到上(左闭右开) + for ; i > startx; i-- { + res[count] = matrix[i][starty] + count++ + } + + // 第二圈开始的时候,起始位置要各自加1, 例如:第一圈起始位置是(0, 0),第二圈起始位置是(1, 1) + startx++ + starty++ + + // offset 控制每一圈里每一条边遍历的长度 + offset += 2 + loop-- + } + + // 如果min(rows, columns)为奇数的话,需要单独给矩阵最中间的位置赋值 + if min(rows, columns) % 2 == 1 { + if rows > columns { + for i := mid; i < mid + rows - columns + 1; i++ { + res[count] = matrix[i][mid] + count++ + } + } else { + for i := mid; i < mid + columns - rows + 1; i++ { + res[count] = matrix[mid][i] + count++ + } + } + } + return res +} + +func min(x, y int) int { + if x < y { + return x + } + return y +} +``` +

From fda179fd7f0789e33f65b6bc5cb1c517a8a83104 Mon Sep 17 00:00:00 2001 From: markwang Date: Sun, 28 Apr 2024 15:21:11 +0800 Subject: [PATCH 2622/3019] =?UTF-8?q?54.=E8=9E=BA=E6=97=8B=E7=9F=A9?= =?UTF-8?q?=E9=98=B5=E5=A2=9E=E5=8A=A0Go=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0054.\350\236\272\346\227\213\347\237\251\351\230\265.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0054.\350\236\272\346\227\213\347\237\251\351\230\265.md" "b/problems/0054.\350\236\272\346\227\213\347\237\251\351\230\265.md" index 175ae14745..022eed66f8 100644 --- "a/problems/0054.\350\236\272\346\227\213\347\237\251\351\230\265.md" +++ "b/problems/0054.\350\236\272\346\227\213\347\237\251\351\230\265.md" @@ -348,7 +348,7 @@ class Solution(object): return print_list ``` -### Go: +### Go ```go func spiralOrder(matrix [][]int) []int { From 8150d654ba7291b60b8d3a344abc015cd5f8c8c3 Mon Sep 17 00:00:00 2001 From: Yunliuyu <96341845+YShelter@users.noreply.github.com> Date: Sun, 28 Apr 2024 22:47:33 +0800 Subject: [PATCH 2623/3019] =?UTF-8?q?Update=200142.=E7=8E=AF=E5=BD=A2?= =?UTF-8?q?=E9=93=BE=E8=A1=A8II.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 错别字,再看本篇内容 --- .../0142.\347\216\257\345\275\242\351\223\276\350\241\250II.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0142.\347\216\257\345\275\242\351\223\276\350\241\250II.md" "b/problems/0142.\347\216\257\345\275\242\351\223\276\350\241\250II.md" index d97b160b91..7cda58c396 100644 --- "a/problems/0142.\347\216\257\345\275\242\351\223\276\350\241\250II.md" +++ "b/problems/0142.\347\216\257\345\275\242\351\223\276\350\241\250II.md" @@ -26,7 +26,7 @@ ## 算法公开课 -**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[把环形链表讲清楚!| LeetCode:142.环形链表II](https://www.bilibili.com/video/BV1if4y1d7ob),相信结合视频在看本篇题解,更有助于大家对链表的理解。** +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[把环形链表讲清楚!| LeetCode:142.环形链表II](https://www.bilibili.com/video/BV1if4y1d7ob),相信结合视频再看本篇题解,更有助于大家对链表的理解。** ## 思路 From 2e489ea3bbe82a96a88e2c55ae92e19f8564f936 Mon Sep 17 00:00:00 2001 From: Jeff Lin Date: Sun, 28 Apr 2024 15:58:38 -0700 Subject: [PATCH 2624/3019] =?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 更正时间复杂度说明。 --- ...\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" "b/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" index e25d15d5ad..3b26066ae4 100644 --- "a/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" +++ "b/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" @@ -180,7 +180,7 @@ public: } }; ``` -* 时间复杂度: O(3^m * 4^n),其中 m 是对应四个字母的数字个数,n 是对应三个字母的数字个数 +* 时间复杂度: O(3^m * 4^n),其中 m 是对应三个字母的数字个数,n 是对应四个字母的数字个数 * 空间复杂度: O(3^m * 4^n) 一些写法,是把回溯的过程放在递归函数里了,例如如下代码,我可以写成这样:(注意注释中不一样的地方) From 5ee2f42edb5765f6e28f2022fbcd257f27914b06 Mon Sep 17 00:00:00 2001 From: qiufeihong2018 <15058301288@163.com> Date: Mon, 29 Apr 2024 16:12:38 +0800 Subject: [PATCH 2625/3019] =?UTF-8?q?refactor:=200102.=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=A0=91=E7=9A=84=E5=B1=82=E5=BA=8F=E9=81=8D=E5=8E=86.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...02\345\272\217\351\201\215\345\216\206.md" | 42 ++++++++++--------- ...06\350\256\272\345\237\272\347\241\200.md" | 2 +- 2 files changed, 23 insertions(+), 21 deletions(-) diff --git "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" index 4411b5609f..d834eef7e1 100644 --- "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" +++ "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" @@ -692,27 +692,29 @@ func levelOrderBottom(root *TreeNode) [][]int { #### Javascript: ```javascript -var levelOrderBottom = function(root) { - let res = [], queue = []; - queue.push(root); - while(queue.length && root!==null) { - // 存放当前层级节点数组 - let curLevel = []; - // 计算当前层级节点数量 - let length = queue.length; - while(length--) { - let node = queue.shift(); - // 把当前层节点存入curLevel数组 - curLevel.push(node.val); - // 把下一层级的左右节点存入queue队列 - node.left && queue.push(node.left); - node.right && queue.push(node.right); - } - // 从数组前头插入值,避免最后反转数组,减少运算时间 - res.unshift(curLevel); - } - return res; +var levelOrderBottom = function (root) { + let res = [], + queue = []; + queue.push(root); + while (queue.length && root !== null) { + // 存放当前层级节点数组 + let curLevel = []; + // 计算当前层级节点数量 + let length = queue.length; + while (length--) { + let node = queue.shift(); + // 把当前层节点存入curLevel数组 + curLevel.push(node.val); + // 把下一层级的左右节点存入queue队列 + node.left && queue.push(node.left); + node.right && queue.push(node.right); + } + // 从数组前头插入值,避免最后反转数组,减少运算时间 + res.unshift(curLevel); + } + return res; }; + ``` #### TypeScript: diff --git "a/problems/\345\233\276\350\256\272\346\267\261\346\220\234\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\345\233\276\350\256\272\346\267\261\346\220\234\347\220\206\350\256\272\345\237\272\347\241\200.md" index 7f847f8fae..15c5af3a64 100644 --- "a/problems/\345\233\276\350\256\272\346\267\261\346\220\234\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\345\233\276\350\256\272\346\267\261\346\220\234\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -71,7 +71,7 @@ 有递归的地方就有回溯,那么回溯在哪里呢? -就地递归函数的下面,例如如下代码: +就递归函数的下面,例如如下代码: ```cpp void dfs(参数) { From d7863c9dbfb124c93a1e4d589827b8397448553c Mon Sep 17 00:00:00 2001 From: qiufeihong2018 <15058301288@163.com> Date: Mon, 29 Apr 2024 16:36:42 +0800 Subject: [PATCH 2626/3019] =?UTF-8?q?refactor:=200102.=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=A0=91=E7=9A=84=E5=B1=82=E5=BA=8F=E9=81=8D=E5=8E=86.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" index d834eef7e1..b9943f3982 100644 --- "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" +++ "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" @@ -1142,7 +1142,7 @@ impl Solution { ### 思路 -本题就是层序遍历的时候把一层求个总和在取一个均值。 +本题就是层序遍历的时候把一层求个总和再取一个均值。 C++代码: From 4ca945f998d047eb7a0d9ea9308e53f46fd274fa Mon Sep 17 00:00:00 2001 From: qiufeihong2018 <15058301288@163.com> Date: Mon, 29 Apr 2024 17:08:26 +0800 Subject: [PATCH 2627/3019] =?UTF-8?q?refactor:=200102.=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=A0=91=E7=9A=84=E5=B1=82=E5=BA=8F=E9=81=8D=E5=8E=86.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...02\345\272\217\351\201\215\345\216\206.md" | 78 ++++++++++--------- 1 file changed, 40 insertions(+), 38 deletions(-) diff --git "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" index b9943f3982..0a98ab88a3 100644 --- "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" +++ "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" @@ -1297,26 +1297,26 @@ func averageOfLevels(root *TreeNode) []float64 { ```javascript var averageOfLevels = function(root) { - //层级平均值 - let res = [], queue = []; - queue.push(root); - - while(queue.length && root!==null) { - //每一层节点个数 - let length = queue.length; - //sum记录每一层的和 - let sum = 0; - for(let i=0; i < length; i++) { - let node = queue.shift(); - sum += node.val; - node.left && queue.push(node.left); - node.right && queue.push(node.right); - } - //每一层的平均值存入数组res - res.push(sum/length); + let res = [], + queue = []; + queue.push(root); + while (queue.length) { + // 每一层节点个数; + let lengthLevel = queue.length, + len = queue.length, + // sum记录每一层的和; + sum = 0; + while (lengthLevel--) { + const node = queue.shift(); + sum += node.val; + // 队列存放下一层节点 + node.left && queue.push(node.left); + node.right && queue.push(node.right); } - - return res; + // 求平均值 + res.push(sum / len); + } + return res; }; ``` @@ -1927,26 +1927,28 @@ func max(x, y int) int { #### Javascript: ```javascript -var largestValues = function(root) { - //使用层序遍历 - let res = [], queue = []; - queue.push(root); - - while(root !== null && queue.length) { - //设置max初始值就是队列的第一个元素 - let max = queue[0].val; - let length = queue.length; - while(length--) { - let node = queue.shift(); - max = max > node.val ? max : node.val; - node.left && queue.push(node.left); - node.right && queue.push(node.right); - } - //把每一层的最大值放到res数组 - res.push(max); - } - +var largestValues = function (root) { + let res = [], + queue = []; + queue.push(root); + if (root === null) { return res; + } + while (queue.length) { + let lengthLevel = queue.length, + // 初始值设为负无穷大 + max = -Infinity; + while (lengthLevel--) { + const node = queue.shift(); + // 在当前层中找到最大值 + max = Math.max(max, node.val); + // 找到下一层的节点 + node.left && queue.push(node.left); + node.right && queue.push(node.right); + } + res.push(max); + } + return res; }; ``` From 2d37cd39e02789d09387b5dc1176fd8f71adf769 Mon Sep 17 00:00:00 2001 From: qiufeihong2018 <15058301288@163.com> Date: Mon, 29 Apr 2024 18:19:48 +0800 Subject: [PATCH 2628/3019] =?UTF-8?q?refactor:=200102.=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=A0=91=E7=9A=84=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 --- ...02\345\272\217\351\201\215\345\216\206.md" | 30 ++++++++++--------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" index 0a98ab88a3..1cb916b41c 100644 --- "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" +++ "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" @@ -2809,21 +2809,23 @@ func maxDepth(root *TreeNode) int { * @param {TreeNode} root * @return {number} */ -var maxDepth = function(root) { - // 最大的深度就是二叉树的层数 - if (root === null) return 0; - let queue = [root]; - let height = 0; - while (queue.length) { - let n = queue.length; - height++; - for (let i=0; i Date: Tue, 30 Apr 2024 18:16:57 +0800 Subject: [PATCH 2629/3019] =?UTF-8?q?docs:=20=E3=80=900055=E5=8F=B3?= =?UTF-8?q?=E6=97=8B=E5=AD=97=E7=AC=A6=E4=B8=B2=E3=80=91JavaScript?= =?UTF-8?q?=E9=83=A8=E5=88=86=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...13\345\255\227\347\254\246\344\270\262.md" | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git "a/problems/kamacoder/0055.\345\217\263\346\227\213\345\255\227\347\254\246\344\270\262.md" "b/problems/kamacoder/0055.\345\217\263\346\227\213\345\255\227\347\254\246\344\270\262.md" index 7137186042..a9f57192e4 100644 --- "a/problems/kamacoder/0055.\345\217\263\346\227\213\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/kamacoder/0055.\345\217\263\346\227\213\345\255\227\347\254\246\344\270\262.md" @@ -254,7 +254,37 @@ func main(){ ### JavaScript: +```javascript +// JS中字符串内不可单独修改 + +// 右旋转 +function reverseLeftWords(s, k) { + const reverse = (sList, start, end) => { + for (let i = start, j = end; i < j; i++, j--) { + [sList[i], sList[j]] = [sList[j], sList[i]]; + } + } + const sList = Array.from(s); + reverse(sList, 0, sList.length - k - 1); + reverse(sList, sList.length - k, sList.length - 1); + reverse(sList, 0, sList.length - 1); + return sList.join(''); +} +// 左旋转 +var reverseLeftWords = function(s, n) { + const reverse = (sList, start, end) => { + for (let i = start, j = end; i < j; i++, j--) { + [sList[i], sList[j]] = [sList[j], sList[i]]; + } + } + const sList = s.split(''); + reverse(sList, 0, n - 1); + reverse(sList, n, sList.length - 1); + reverse(sList, 0, sList.length - 1); + return sList.join(''); +}; +``` ### TypeScript: From 3e5c1705c2cda8cdb6acd9c7581b16d81fd4b77d Mon Sep 17 00:00:00 2001 From: qiufeihong2018 <15058301288@163.com> Date: Wed, 1 May 2024 16:08:36 +0800 Subject: [PATCH 2630/3019] =?UTF-8?q?refactor:=200077.=E7=BB=84=E5=90=88.m?= =?UTF-8?q?d?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "problems/0077.\347\273\204\345\220\210.md" | 26 +++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git "a/problems/0077.\347\273\204\345\220\210.md" "b/problems/0077.\347\273\204\345\220\210.md" index 103fb627f5..35ed5fad49 100644 --- "a/problems/0077.\347\273\204\345\220\210.md" +++ "b/problems/0077.\347\273\204\345\220\210.md" @@ -469,6 +469,32 @@ func dfs(n int, k int, start int) { ``` ### Javascript +未剪枝: + +```js +var combine = function (n, k) { + // 回溯法 + let result = [], + path = []; + let backtracking = (_n, _k, startIndex) => { + // 终止条件 + if (path.length === _k) { + result.push(path.slice()); + return; + } + // 循环本层集合元素 + for (let i = startIndex; i <= _n; i++) { + path.push(i); + // 递归 + backtracking(_n, _k, i + 1); + // 回溯操作 + path.pop(); + } + }; + backtracking(n, k, 1); + return result; +}; +``` 剪枝: From d1d7cdeecd2922b86edccb7cfd135117a5926a60 Mon Sep 17 00:00:00 2001 From: qiufeihong2018 <15058301288@163.com> Date: Wed, 1 May 2024 19:10:32 +0800 Subject: [PATCH 2631/3019] =?UTF-8?q?refactor:=200077.=E7=BB=84=E5=90=88.m?= =?UTF-8?q?d?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "problems/0077.\347\273\204\345\220\210.md" | 38 ++++++++++++--------- 1 file changed, 21 insertions(+), 17 deletions(-) diff --git "a/problems/0077.\347\273\204\345\220\210.md" "b/problems/0077.\347\273\204\345\220\210.md" index 35ed5fad49..f394b3d84c 100644 --- "a/problems/0077.\347\273\204\345\220\210.md" +++ "b/problems/0077.\347\273\204\345\220\210.md" @@ -499,24 +499,28 @@ var combine = function (n, k) { 剪枝: ```javascript -let result = [] -let path = [] -var combine = function(n, k) { - result = [] - combineHelper(n, k, 1) - return result +var combine = function (n, k) { + // 回溯法 + let result = [], + path = []; + let backtracking = (_n, _k, startIndex) => { + // 终止条件 + if (path.length === _k) { + result.push(path.slice()); + return; + } + // 循环本层集合元素 + for (let i = startIndex; i <= _n - (_k - path.length) + 1; i++) { + path.push(i); + // 递归 + backtracking(_n, _k, i + 1); + // 回溯操作 + path.pop(); + } + }; + backtracking(n, k, 1); + return result; }; -const combineHelper = (n, k, startIndex) => { - if (path.length === k) { - result.push([...path]) - return - } - for (let i = startIndex; i <= n - (k - path.length) + 1; ++i) { - path.push(i) - combineHelper(n, k, i + 1) - path.pop() - } -} ``` ### TypeScript From 5e6a657d90fe9a3ba7c86aa8505898e0f7ed739b Mon Sep 17 00:00:00 2001 From: qiufeihong2018 <15058301288@163.com> Date: Wed, 1 May 2024 19:51:01 +0800 Subject: [PATCH 2632/3019] =?UTF-8?q?refactor:=200216.=E7=BB=84=E5=90=88?= =?UTF-8?q?=E6=80=BB=E5=92=8CIII.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...345\220\210\346\200\273\345\222\214III.md" | 93 ++++++++++++++----- 1 file changed, 68 insertions(+), 25 deletions(-) diff --git "a/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" "b/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" index ac28f9fcfa..d331726e55 100644 --- "a/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" +++ "b/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" @@ -417,6 +417,7 @@ func dfs(k, n int, start int, sum int) { ``` ### JavaScript +- 未剪枝: ```js /** @@ -424,32 +425,74 @@ func dfs(k, n int, start int, sum int) { * @param {number} n * @return {number[][]} */ -var combinationSum3 = function(k, n) { - let res = []; - let path = []; - let sum = 0; - const dfs = (path,index) => { - // 剪枝操作 - if (sum > n){ - return - } - if (path.length == k) { - if(sum == n){ - res.push([...path]); - return - } - } - for (let i = index; i <= 9 - (k-path.length) + 1;i++) { - path.push(i); - sum = sum + i; - index += 1; - dfs(path,index); - sum -= i - path.pop() - } +var combinationSum3 = function (k, n) { + // 回溯法 + let result = [], + path = []; + const backtracking = (_k, targetSum, sum, startIndex) => { + // 终止条件 + if (path.length === _k) { + if (sum === targetSum) { + result.push(path.slice()); + } + // 如果总和不相等,就直接返回 + return; } - dfs(path,1); - return res + + // 循环当前节点,因为只使用数字1到9,所以最大是9 + for (let i = startIndex; i <= 9; i++) { + path.push(i); + sum += i; + // 回调函数 + backtracking(_k, targetSum, sum, i + 1); + // 回溯 + sum -= i; + path.pop(); + } + }; + backtracking(k, n, 0, 1); + return result; +}; +``` + +- 剪枝: + +```js +/** + * @param {number} k + * @param {number} n + * @return {number[][]} + */ +var combinationSum3 = function (k, n) { + // 回溯法 + let result = [], + path = []; + const backtracking = (_k, targetSum, sum, startIndex) => { + if (sum > targetSum) { + return; + } + // 终止条件 + if (path.length === _k) { + if (sum === targetSum) { + result.push(path.slice()); + } + // 如果总和不相等,就直接返回 + return; + } + + // 循环当前节点,因为只使用数字1到9,所以最大是9 + for (let i = startIndex; i <= 9 - (_k - path.length) + 1; i++) { + path.push(i); + sum += i; + // 回调函数 + backtracking(_k, targetSum, sum, i + 1); + // 回溯 + sum -= i; + path.pop(); + } + }; + backtracking(k, n, 0, 1); + return result; }; ``` From d488652a135250c82fb9c8e984922ba834665e14 Mon Sep 17 00:00:00 2001 From: Yunliuyu <96341845+YShelter@users.noreply.github.com> Date: Thu, 2 May 2024 21:45:01 +0800 Subject: [PATCH 2633/3019] =?UTF-8?q?Update=200454.=E5=9B=9B=E6=95=B0?= =?UTF-8?q?=E7=9B=B8=E5=8A=A0II.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 又是错别字,在 -> 再 碎碎念:这样子可以吗? --- ...454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" "b/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" index db9a9e430c..83dea97e7e 100644 --- "a/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" +++ "b/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" @@ -54,7 +54,7 @@ 1. 首先定义 一个unordered_map,key放a和b两数之和,value 放a和b两数之和出现的次数。 2. 遍历大A和大B数组,统计两个数组元素之和,和出现的次数,放到map中。 3. 定义int变量count,用来统计 a+b+c+d = 0 出现的次数。 -4. 在遍历大C和大D数组,找到如果 0-(c+d) 在map中出现过的话,就用count把map中key对应的value也就是出现次数统计出来。 +4. 再遍历大C和大D数组,找到如果 0-(c+d) 在map中出现过的话,就用count把map中key对应的value也就是出现次数统计出来。 5. 最后返回统计值 count 就可以了 C++代码: @@ -71,7 +71,7 @@ public: } } int count = 0; // 统计a+b+c+d = 0 出现的次数 - // 在遍历大C和大D数组,找到如果 0-(c+d) 在map中出现过的话,就把map中key对应的value也就是出现次数统计出来。 + // 再遍历大C和大D数组,找到如果 0-(c+d) 在map中出现过的话,就把map中key对应的value也就是出现次数统计出来。 for (int c : C) { for (int d : D) { if (umap.find(0 - (c + d)) != umap.end()) { From fffec6ec918a3d45950497e14778882b258c73ff Mon Sep 17 00:00:00 2001 From: heystone999 <52831724+heystone999@users.noreply.github.com> Date: Fri, 3 May 2024 17:50:11 -0400 Subject: [PATCH 2634/3019] =?UTF-8?q?style:=20=E4=BB=A3=E7=A0=81highlight?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...43\236\345\234\260\347\232\204\346\225\260\351\207\217.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/problems/1020.\351\243\236\345\234\260\347\232\204\346\225\260\351\207\217.md" "b/problems/1020.\351\243\236\345\234\260\347\232\204\346\225\260\351\207\217.md" index 3488777ad2..5063139fe0 100644 --- "a/problems/1020.\351\243\236\345\234\260\347\232\204\346\225\260\351\207\217.md" +++ "b/problems/1020.\351\243\236\345\234\260\347\232\204\346\225\260\351\207\217.md" @@ -395,7 +395,7 @@ class Solution { 深度优先遍历 -```Python3 +```Python class Solution: def __init__(self): self.position = [[-1, 0], [0, 1], [1, 0], [0, -1]] # 四个方向 @@ -442,7 +442,7 @@ class Solution: 广度优先遍历 -```Python3 +```Python class Solution: def __init__(self): self.position = [[-1, 0], [0, 1], [1, 0], [0, -1]] # 四个方向 From cd03a5b79a5deb90e444d46ba4c22cffd9478440 Mon Sep 17 00:00:00 2001 From: markwang Date: Tue, 7 May 2024 10:57:05 +0800 Subject: [PATCH 2635/3019] =?UTF-8?q?15.=E4=B8=89=E6=95=B0=E4=B9=8B?= =?UTF-8?q?=E5=92=8C=E5=A2=9E=E5=8A=A0Go=E5=93=88=E5=B8=8C=E8=A7=A3?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...11\346\225\260\344\271\213\345\222\214.md" | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git "a/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" "b/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" index ae21838540..f7146907b4 100644 --- "a/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" @@ -403,6 +403,7 @@ class Solution: ``` ### Go: +(版本一) 双指针 ```Go func threeSum(nums []int) [][]int { @@ -442,6 +443,42 @@ func threeSum(nums []int) [][]int { return res } ``` +(版本二) 哈希解法 + +```Go +func threeSum(nums []int) [][]int { + res := make([][]int, 0) + sort.Ints(nums) + // 找出a + b + c = 0 + // a = nums[i], b = nums[j], c = -(a + b) + for i := 0; i < len(nums); i++ { + // 排序之后如果第一个元素已经大于零,那么不可能凑成三元组 + if nums[i] > 0 { + break + } + // 三元组元素a去重 + if i > 0 && nums[i] == nums[i-1] { + continue + } + set := make(map[int]struct{}) + for j := i + 1; j < len(nums); j++ { + // 三元组元素b去重 + if j > i + 2 && nums[j] == nums[j-1] && nums[j-1] == nums[j-2] { + continue + } + c := -nums[i] - nums[j] + if _, ok := set[c]; ok { + res = append(res, []int{nums[i], nums[j], c}) + // 三元组元素c去重 + delete(set, c) + } else { + set[nums[j]] = struct{}{} + } + } + } + return res +} +``` ### JavaScript: From fa6c8d2e98240323085e9970c5016a951f916eff Mon Sep 17 00:00:00 2001 From: ray <109325327+raydemo1@users.noreply.github.com> Date: Wed, 8 May 2024 18:45:21 +0800 Subject: [PATCH 2636/3019] =?UTF-8?q?Update=200102.=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=A0=91=E7=9A=84=E5=B1=82=E5=BA=8F=E9=81=8D=E5=8E=86.md=20Pyt?= =?UTF-8?q?hon=E5=B1=82=E5=BA=8F=E9=81=8D=E5=8E=86=E9=80=92=E5=BD=92?= =?UTF-8?q?=E6=B3=95=E6=9B=B4=E7=AE=80=E6=B4=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...02\345\272\217\351\201\215\345\216\206.md" | 28 +++++++++++-------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" index ab6b07bfcf..cdc7a7837a 100644 --- "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" +++ "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" @@ -201,7 +201,7 @@ class Solution: return result ``` ```python -# 递归法 +#递归法 # Definition for a binary tree node. # class TreeNode: # def __init__(self, val=0, left=None, right=None): @@ -210,18 +210,24 @@ class Solution: # self.right = right class Solution: def levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]: + if not root: + return [] + levels = [] - self.helper(root, 0, levels) + + def traverse(node, level): + if not node: + return + + if len(levels) == level: + levels.append([]) + + levels[level].append(node.val) + traverse(node.left, level + 1) + traverse(node.right, level + 1) + + traverse(root, 0) return levels - - def helper(self, node, level, levels): - if not node: - return - if len(levels) == level: - levels.append([]) - levels[level].append(node.val) - self.helper(node.left, level + 1, levels) - self.helper(node.right, level + 1, levels) ``` From 60ec1b83e2d697fdf5f31118509f362e42d50664 Mon Sep 17 00:00:00 2001 From: coffeeboy <114488340+zp-coffee@users.noreply.github.com> Date: Fri, 10 May 2024 10:20:57 +0800 Subject: [PATCH 2637/3019] =?UTF-8?q?Update=20=E4=BA=8C=E5=8F=89=E6=A0=91?= =?UTF-8?q?=E7=9A=84=E8=BF=AD=E4=BB=A3=E9=81=8D=E5=8E=86.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 更新排版以及修改一个错别字 --- ...32\204\350\277\255\344\273\243\351\201\215\345\216\206.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" index 8549bac154..5f59c38897 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" @@ -117,7 +117,7 @@ public: ### 后序遍历(迭代法) -再来看后序遍历,先序遍历是中左右,后续遍历是左右中,那么我们只需要调整一下先序遍历的代码顺序,就变成中右左的遍历顺序,然后在反转result数组,输出的结果顺序就是左右中了,如下图: +再来看后序遍历,先序遍历是中左右,后序遍历是左右中,那么我们只需要调整一下先序遍历的代码顺序,就变成中右左的遍历顺序,然后在反转result数组,输出的结果顺序就是左右中了,如下图: ![前序到后序](https://code-thinking-1253855093.file.myqcloud.com/pics/20200808200338924.png) @@ -153,7 +153,7 @@ public: 上面这句话,可能一些同学不太理解,建议自己亲手用迭代法,先写出来前序,再试试能不能写出中序,就能理解了。 -**那么问题又来了,难道 二叉树前后中序遍历的迭代法实现,就不能风格统一么(即前序遍历 改变代码顺序就可以实现中序 和 后序)?** +**那么问题又来了,难道二叉树前后中序遍历的迭代法实现,就不能风格统一么(即前序遍历改变代码顺序就可以实现中序 和 后序)?** 当然可以,这种写法,还不是很好理解,我们将在下一篇文章里重点讲解,敬请期待! From 12fffbeaa86bfc293caf22b4b5fc05d4e929d738 Mon Sep 17 00:00:00 2001 From: wbingb Date: Wed, 15 May 2024 10:39:13 +0800 Subject: [PATCH 2638/3019] =?UTF-8?q?=E5=88=A0=E9=99=A4=E5=A4=9A=E4=BD=99?= =?UTF-8?q?=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .obsidian/app.json | 1 - .obsidian/appearance.json | 3 - .obsidian/core-plugins-migration.json | 30 ------ .obsidian/core-plugins.json | 20 ---- .obsidian/workspace.json | 147 -------------------------- 5 files changed, 201 deletions(-) delete mode 100644 .obsidian/app.json delete mode 100644 .obsidian/appearance.json delete mode 100644 .obsidian/core-plugins-migration.json delete mode 100644 .obsidian/core-plugins.json delete mode 100644 .obsidian/workspace.json diff --git a/.obsidian/app.json b/.obsidian/app.json deleted file mode 100644 index 9e26dfeeb6..0000000000 --- a/.obsidian/app.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/.obsidian/appearance.json b/.obsidian/appearance.json deleted file mode 100644 index c8c365d89b..0000000000 --- a/.obsidian/appearance.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "accentColor": "" -} \ No newline at end of file diff --git a/.obsidian/core-plugins-migration.json b/.obsidian/core-plugins-migration.json deleted file mode 100644 index 436f43cf56..0000000000 --- a/.obsidian/core-plugins-migration.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "file-explorer": true, - "global-search": true, - "switcher": true, - "graph": true, - "backlink": true, - "canvas": true, - "outgoing-link": true, - "tag-pane": true, - "properties": false, - "page-preview": true, - "daily-notes": true, - "templates": true, - "note-composer": true, - "command-palette": true, - "slash-command": false, - "editor-status": true, - "bookmarks": true, - "markdown-importer": false, - "zk-prefixer": false, - "random-note": false, - "outline": true, - "word-count": true, - "slides": false, - "audio-recorder": false, - "workspaces": false, - "file-recovery": true, - "publish": false, - "sync": false -} \ No newline at end of file diff --git a/.obsidian/core-plugins.json b/.obsidian/core-plugins.json deleted file mode 100644 index 9405bfdc22..0000000000 --- a/.obsidian/core-plugins.json +++ /dev/null @@ -1,20 +0,0 @@ -[ - "file-explorer", - "global-search", - "switcher", - "graph", - "backlink", - "canvas", - "outgoing-link", - "tag-pane", - "page-preview", - "daily-notes", - "templates", - "note-composer", - "command-palette", - "editor-status", - "bookmarks", - "outline", - "word-count", - "file-recovery" -] \ No newline at end of file diff --git a/.obsidian/workspace.json b/.obsidian/workspace.json deleted file mode 100644 index 144fe03fdc..0000000000 --- a/.obsidian/workspace.json +++ /dev/null @@ -1,147 +0,0 @@ -{ - "main": { - "id": "14608cf8b641f651", - "type": "split", - "children": [ - { - "id": "7b559c19d2418ebd", - "type": "tabs", - "children": [ - { - "id": "a006865600bc4e20", - "type": "leaf", - "state": { - "type": "empty", - "state": {} - } - } - ] - } - ], - "direction": "vertical" - }, - "left": { - "id": "340e6a79c670a47b", - "type": "split", - "children": [ - { - "id": "c5f81ca398c18cda", - "type": "tabs", - "children": [ - { - "id": "51f9f8f44ecceb89", - "type": "leaf", - "state": { - "type": "file-explorer", - "state": { - "sortOrder": "alphabetical" - } - } - }, - { - "id": "0cff567244d7cff5", - "type": "leaf", - "state": { - "type": "search", - "state": { - "query": "1971", - "matchingCase": false, - "explainSearch": false, - "collapseAll": false, - "extraContext": false, - "sortOrder": "alphabetical" - } - } - }, - { - "id": "209574c920774a4d", - "type": "leaf", - "state": { - "type": "bookmarks", - "state": {} - } - } - ], - "currentTab": 1 - } - ], - "direction": "horizontal", - "width": 300 - }, - "right": { - "id": "93ce8f4c11893983", - "type": "split", - "children": [ - { - "id": "da8cbb56e5ee7c52", - "type": "tabs", - "children": [ - { - "id": "dfccbc1ebc0bb831", - "type": "leaf", - "state": { - "type": "backlink", - "state": { - "collapseAll": false, - "extraContext": false, - "sortOrder": "alphabetical", - "showSearch": false, - "searchQuery": "", - "backlinkCollapsed": false, - "unlinkedCollapsed": true - } - } - }, - { - "id": "9d2201419a111fe4", - "type": "leaf", - "state": { - "type": "outgoing-link", - "state": { - "linksCollapsed": false, - "unlinkedCollapsed": true - } - } - }, - { - "id": "dc86ccf1b01bc02c", - "type": "leaf", - "state": { - "type": "tag", - "state": { - "sortOrder": "frequency", - "useHierarchy": true - } - } - }, - { - "id": "ec512545d2a7f2e5", - "type": "leaf", - "state": { - "type": "outline", - "state": {} - } - } - ] - } - ], - "direction": "horizontal", - "width": 300, - "collapsed": true - }, - "left-ribbon": { - "hiddenItems": { - "switcher:打开快速切换": false, - "graph:查看关系图谱": false, - "canvas:新建白板": false, - "daily-notes:打开/创建今天的日记": false, - "templates:插入模板": false, - "command-palette:打开命令面板": false - } - }, - "active": "a006865600bc4e20", - "lastOpenFiles": [ - "problems/1971.寻找图中是否存在路径.md", - "README.md" - ] -} \ No newline at end of file From 96359371d8668d1648cce37b2cfe3614fd01a49b Mon Sep 17 00:00:00 2001 From: markwang Date: Wed, 15 May 2024 10:52:59 +0800 Subject: [PATCH 2639/3019] =?UTF-8?q?459.=E9=87=8D=E5=A4=8D=E7=9A=84?= =?UTF-8?q?=E5=AD=90=E5=AD=97=E7=AC=A6=E4=B8=B2=E5=A2=9E=E5=8A=A0Go?= =?UTF-8?q?=E7=A7=BB=E5=8A=A8=E5=8C=B9=E9=85=8D=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...5\255\220\345\255\227\347\254\246\344\270\262.md" | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git "a/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" "b/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" index 1028bf1ea2..5142579681 100644 --- "a/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" @@ -403,6 +403,18 @@ func repeatedSubstringPattern(s string) bool { } ``` +移动匹配 + +```go +func repeatedSubstringPattern(s string) bool { + if len(s) == 0 { + return false + } + t := s + s + return strings.Contains(t[1:len(t)-1], s) +} +``` + ### JavaScript: > 前缀表统一减一 From 94a4e812655c462115234246d9cf2cb2bcdbbc8b Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Wed, 15 May 2024 11:35:26 +0800 Subject: [PATCH 2640/3019] Update --- README.md | 13 +- ...7.\350\257\276\347\250\213\350\241\250.md" | 66 +-- ...\350\257\276\347\250\213\350\241\250II.md" | 39 ++ ...57\344\273\266\346\236\204\345\273\272.md" | 337 +++++++++++++ ...7\347\211\251\350\277\220\350\276\223I.md" | 49 +- ...\347\211\251\350\277\220\350\276\223II.md" | 4 +- ...347\211\251\350\277\220\350\276\223III.md" | 65 ++- ...16\351\200\233\345\205\254\345\233\255.md" | 128 +++-- ...57\350\276\276\350\267\257\345\276\204.md" | 471 ++++++++++++++++++ ...06\350\256\272\345\237\272\347\241\200.md" | 0 ...06\350\256\272\345\237\272\347\241\200.md" | 0 ...72\346\200\273\347\273\223\347\257\207.md" | 31 ++ ...06\350\256\272\345\237\272\347\241\200.md" | 0 ...06\350\256\272\345\237\272\347\241\200.md" | 222 +++++++++ ...30\346\200\273\347\273\223\347\257\207.md" | 48 ++ .../ACM\346\250\241\345\274\217.md" | 0 ...05\345\255\230\346\266\210\350\200\227.md" | 0 ...26\350\257\221\350\277\220\350\241\214.md" | 0 ...64\345\244\215\346\235\202\345\272\246.md" | 0 ...64\345\244\215\346\235\202\345\272\246.md" | 0 ...27\346\263\225\350\266\205\346\227\266.md" | 0 ...64\345\244\215\346\235\202\345\272\246.md" | 0 22 files changed, 1367 insertions(+), 106 deletions(-) create mode 100644 "problems/0210.\350\257\276\347\250\213\350\241\250II.md" create mode 100644 "problems/kamacoder/00.\350\275\257\344\273\266\346\236\204\345\273\272.md" create mode 100644 "problems/kamacoder/0098.\346\211\200\346\234\211\345\217\257\350\276\276\350\267\257\345\276\204.md" rename "problems/\345\233\276\350\256\272\345\271\266\346\237\245\351\233\206\347\220\206\350\256\272\345\237\272\347\241\200.md" => "problems/kamacoder/\345\233\276\350\256\272\345\271\266\346\237\245\351\233\206\347\220\206\350\256\272\345\237\272\347\241\200.md" (100%) rename "problems/\345\233\276\350\256\272\345\271\277\346\220\234\347\220\206\350\256\272\345\237\272\347\241\200.md" => "problems/kamacoder/\345\233\276\350\256\272\345\271\277\346\220\234\347\220\206\350\256\272\345\237\272\347\241\200.md" (100%) create mode 100644 "problems/kamacoder/\345\233\276\350\256\272\346\200\273\347\273\223\347\257\207.md" rename "problems/\345\233\276\350\256\272\346\267\261\346\220\234\347\220\206\350\256\272\345\237\272\347\241\200.md" => "problems/kamacoder/\345\233\276\350\256\272\346\267\261\346\220\234\347\220\206\350\256\272\345\237\272\347\241\200.md" (100%) create mode 100644 "problems/kamacoder/\345\233\276\350\256\272\347\220\206\350\256\272\345\237\272\347\241\200.md" create mode 100644 "problems/kamacoder/\346\234\200\347\237\255\350\267\257\351\227\256\351\242\230\346\200\273\347\273\223\347\257\207.md" rename "problems/\345\211\215\345\272\217/\344\273\200\344\271\210\346\230\257\346\240\270\345\277\203\344\273\243\347\240\201\346\250\241\345\274\217\357\274\214\344\273\200\344\271\210\345\217\210\346\230\257ACM\346\250\241\345\274\217\357\274\237.md" => "problems/\345\211\215\345\272\217/ACM\346\250\241\345\274\217.md" (100%) rename "problems/\345\211\215\345\272\217/\345\210\267\344\272\206\350\277\231\344\271\210\345\244\232\351\242\230\357\274\214\344\275\240\344\272\206\350\247\243\350\207\252\345\267\261\344\273\243\347\240\201\347\232\204\345\206\205\345\255\230\346\266\210\350\200\227\344\271\210\357\274\237.md" => "problems/\345\211\215\345\272\217/\345\206\205\345\255\230\346\266\210\350\200\227.md" (100%) rename "problems/\345\211\215\345\272\217/\345\212\233\346\211\243\344\270\212\347\232\204\344\273\243\347\240\201\346\203\263\345\234\250\346\234\254\345\234\260\347\274\226\350\257\221\350\277\220\350\241\214\357\274\237.md" => "problems/\345\211\215\345\272\217/\345\212\233\346\211\243\344\270\212\347\232\204\344\273\243\347\240\201\345\234\250\346\234\254\345\234\260\347\274\226\350\257\221\350\277\220\350\241\214.md" (100%) rename "problems/\345\211\215\345\272\217/\345\205\263\344\272\216\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\214\344\275\240\344\270\215\347\237\245\351\201\223\347\232\204\351\203\275\345\234\250\350\277\231\351\207\214\357\274\201.md" => "problems/\345\211\215\345\272\217/\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246.md" (100%) rename "problems/\345\211\215\345\272\217/\345\205\263\344\272\216\347\251\272\351\227\264\345\244\215\346\235\202\345\272\246\357\274\214\345\217\257\350\203\275\346\234\211\345\207\240\344\270\252\347\226\221\351\227\256\357\274\237.md" => "problems/\345\211\215\345\272\217/\347\251\272\351\227\264\345\244\215\346\235\202\345\272\246.md" (100%) rename "problems/\345\211\215\345\272\217/On\347\232\204\347\256\227\346\263\225\345\261\205\347\204\266\350\266\205\346\227\266\344\272\206\357\274\214\346\255\244\346\227\266\347\232\204n\347\251\266\347\253\237\346\230\257\345\244\232\345\244\247\357\274\237.md" => "problems/\345\211\215\345\272\217/\347\256\227\346\263\225\350\266\205\346\227\266.md" (100%) rename "problems/\345\211\215\345\272\217/\351\200\232\350\277\207\344\270\200\351\201\223\351\235\242\350\257\225\351\242\230\347\233\256\357\274\214\350\256\262\344\270\200\350\256\262\351\200\222\345\275\222\347\256\227\346\263\225\347\232\204\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\201.md" => "problems/\345\211\215\345\272\217/\351\200\222\345\275\222\347\256\227\346\263\225\347\232\204\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246.md" (100%) diff --git a/README.md b/README.md index 5389c89a9b..e94b428578 100644 --- a/README.md +++ b/README.md @@ -74,8 +74,7 @@ * 编程语言 * [C++面试&C++学习指南知识点整理](https://github.com/youngyangyang04/TechCPP) - * [C++语言基础课](https://kamacoder.com/course.php?course_id=1) - * [Java语言基础课](https://kamacoder.com/course.php?course_id=2) + * [编程语言基础课](https://kamacoder.com/courseshop.php) * [23种设计模式](https://github.com/youngyangyang04/kama-DesignPattern) * 工具 @@ -91,12 +90,12 @@ * [BAT级别技术面试流程和注意事项都在这里了](./problems/前序/BAT级别技术面试流程和注意事项都在这里了.md) * 算法性能分析 - * [关于时间复杂度,你不知道的都在这里!](./problems/前序/关于时间复杂度,你不知道的都在这里!.md) - * [O(n)的算法居然超时了,此时的n究竟是多大?](./problems/前序/On的算法居然超时了,此时的n究竟是多大?.md) - * [通过一道面试题目,讲一讲递归算法的时间复杂度!](./problems/前序/通过一道面试题目,讲一讲递归算法的时间复杂度!.md) - * [关于空间复杂度,可能有几个疑问?](./problems/前序/关于空间复杂度,可能有几个疑问?.md) + * [关于时间复杂度,你不知道的都在这里!](./problems/前序/时间复杂度.md) + * [O(n)的算法居然超时了,此时的n究竟是多大?](./problems/前序/算法超时.md) + * [通过一道面试题目,讲一讲递归算法的时间复杂度!](./problems/前序/递归算法的时间复杂度.md) + * [关于空间复杂度,可能有几个疑问?](./problems/前序/空间复杂度.md) * [递归算法的时间与空间复杂度分析!](./problems/前序/递归算法的时间与空间复杂度分析.md) - * [刷了这么多题,你了解自己代码的内存消耗么?](./problems/前序/刷了这么多题,你了解自己代码的内存消耗么?.md) + * [刷了这么多题,你了解自己代码的内存消耗么?](./problems/前序/内存消耗.md) ## 数组 diff --git "a/problems/0207.\350\257\276\347\250\213\350\241\250.md" "b/problems/0207.\350\257\276\347\250\213\350\241\250.md" index 6a8eb23b84..dff0b18eb0 100644 --- "a/problems/0207.\350\257\276\347\250\213\350\241\250.md" +++ "b/problems/0207.\350\257\276\347\250\213\350\241\250.md" @@ -12,10 +12,6 @@ 引用与任务调度,课程安排等等。 -为什么 - - ------ 「拓扑排序」是专门应用于有向图的算法; @@ -26,32 +22,42 @@ 这道题的做法同样适用于第 210 题。 -``` -vector inDegree(numCourses); -unordered_map> map; -for (int i = 0; i < prerequisites.size(); i++) { - inDegree[prerequisites[i][0]]++;//当前课程入度值+1 - map[prerequisites[i][1]].push_back(prerequisites[i][0]);//添加依赖他的后续课 -} -queue Qu; -for (int i = 0; i < numCourses; i++) { - if (inDegree[i] == 0) Qu.push(i);//所有入度为0的课入列 -} -int count = 0; -while (Qu.size()) { - int selected = Qu.front(); //当前选的课 - Qu.pop();//出列 - count++;//选课数+1 - vector toEnQueue = map[selected];//获取这门课对应的后续课 - if (toEnQueue.size()) { //确实有后续课 - for (int i = 0; i < toEnQueue.size(); i++) { - inDegree[toEnQueue[i]]--; //依赖它的后续课的入度-1 - if (inDegree[toEnQueue[i]] == 0) Qu.push(toEnQueue[i]); //如果因此减为0,入列 - } - } -} -if (count == numCourses) return true; -return false; +```CPP +class Solution { +public: + bool canFinish(int numCourses, vector>& prerequisites) { + vector inDegree(numCourses, 0); + unordered_map> umap; + for (int i = 0; i < prerequisites.size(); i++) { + + // prerequisites[i][0] 是 课程入度,prerequisites[i][1] 是课程出度 + // 即: 上课prerequisites[i][0] 之前,必须先上课prerequisites[i][1] + // prerequisites[i][1] -> prerequisites[i][0] + inDegree[prerequisites[i][0]]++;//当前课程入度值+1 + umap[prerequisites[i][1]].push_back(prerequisites[i][0]); // 添加 prerequisites[i][1] 指向的课程 + } + queue que; + for (int i = 0; i < numCourses; i++) { + if (inDegree[i] == 0) que.push(i); // 所有入度为0,即为 开头课程 加入队列 + } + int count = 0; + while (que.size()) { + int cur = que.front(); //当前选的课 + que.pop(); + count++; // 选课数+1 + vector courses = umap[cur]; //获取这门课指向的课程,也就是这么课的后续课 + if (courses.size()) { // 有后续课 + for (int i = 0; i < courses.size(); i++) { + inDegree[courses[i]]--; // 它的后续课的入度-1 + if (inDegree[courses[i]] == 0) que.push(courses[i]); // 如果入度为0,加入队列 + } + } + } + if (count == numCourses) return true; + return false; + + } +}; ```

diff --git "a/problems/0210.\350\257\276\347\250\213\350\241\250II.md" "b/problems/0210.\350\257\276\347\250\213\350\241\250II.md" new file mode 100644 index 0000000000..2d2e242941 --- /dev/null +++ "b/problems/0210.\350\257\276\347\250\213\350\241\250II.md" @@ -0,0 +1,39 @@ + +```CPP +class Solution { +public: + vector findOrder(int numCourses, vector>& prerequisites) { + vector inDegree(numCourses, 0); + vector result; + unordered_map> umap; + for (int i = 0; i < prerequisites.size(); i++) { + + // prerequisites[i][0] 是 课程入度,prerequisites[i][1] 是课程出度 + // 即: 上课prerequisites[i][0] 之前,必须先上课prerequisites[i][1] + // prerequisites[i][1] -> prerequisites[i][0] + inDegree[prerequisites[i][0]]++;//当前课程入度值+1 + umap[prerequisites[i][1]].push_back(prerequisites[i][0]); // 添加 prerequisites[i][1] 指向的课程 + } + queue que; + for (int i = 0; i < numCourses; i++) { + if (inDegree[i] == 0) que.push(i); // 所有入度为0,即为 开头课程 加入队列 + } + int count = 0; + while (que.size()) { + int cur = que.front(); //当前选的课 + que.pop(); + count++; // 选课数+1 + result.push_back(cur); + vector courses = umap[cur]; //获取这门课指向的课程,也就是这么课的后续课 + if (courses.size()) { // 有后续课 + for (int i = 0; i < courses.size(); i++) { + inDegree[courses[i]]--; // 它的后续课的入度-1 + if (inDegree[courses[i]] == 0) que.push(courses[i]); // 如果入度为0,加入队列 + } + } + } + if (count == numCourses) return result; + else return vector(); + } +}; +``` diff --git "a/problems/kamacoder/00.\350\275\257\344\273\266\346\236\204\345\273\272.md" "b/problems/kamacoder/00.\350\275\257\344\273\266\346\236\204\345\273\272.md" new file mode 100644 index 0000000000..7229489b6a --- /dev/null +++ "b/problems/kamacoder/00.\350\275\257\344\273\266\346\236\204\345\273\272.md" @@ -0,0 +1,337 @@ + +# 拓扑排序精讲 + +[卡码网:软件构建](https://kamacoder.com/problempage.php?pid=1191) + +题目描述: + +某个大型软件项目的构建系统拥有 N 个文件,文件编号从 0 到 N - 1,在这些文件中,某些文件依赖于其他文件的内容,这意味着如果文件 A 依赖于文件 B,则必须在处理文件 A 之前处理文件 B (0 <= A, B <= N - 1)。请编写一个算法,用于确定文件处理的顺序。 + +输入描述: + +第一行输入两个正整数 M, N。表示 N 个文件之间拥有 M 条依赖关系。 + +后续 M 行,每行两个正整数 S 和 T,表示 T 文件依赖于 S 文件。 + +输出描述: + +输出共一行,如果能处理成功,则输出文件顺序,用空格隔开。 + +如果不能成功处理(相互依赖),则输出 -1。 + +输入示例: + +``` +5 4 +0 1 +0 2 +1 3 +2 4 +``` + +输出示例: + +0 1 2 3 4 + +提示信息: + +文件依赖关系如下: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240510192157.png) + +所以,文件处理的顺序除了示例中的顺序,还存在 + +0 2 4 1 3 + +0 2 1 3 4 + +等等合法的顺序。 + +数据范围: + +* 0 <= N <= 10 ^ 5 +* 1 <= M <= 10 ^ 9 + + +## 拓扑排序的背景 + +本题是拓扑排序的经典题目。 + +一聊到 拓扑排序,一些录友可能会想这是排序,不会想到这是图论算法。 + +其实拓扑排序是经典的图论问题。 + +先说说 拓扑排序的应用场景。 + +大学排课,例如 先上A课,才能上B课,上了B课才能上C课,上了A课才能上D课,等等一系列这样的依赖顺序。 问给规划出一条 完整的上课顺序。 + +拓扑排序在文件处理上也有应用,我们在做项目安装文件包的时候,经常发现 复杂的文件依赖关系, A依赖B,B依赖C,B依赖D,C依赖E 等等。 + +如果给出一条线性的依赖顺序来下载这些文件呢? + +有录友想上面的例子都很简单啊,我一眼能给排序出来。 + +那如果上面的依赖关系是一百对呢,一千对甚至上万个依赖关系,这些依赖关系中可能还有循环依赖,你如何发现循环依赖呢,又如果排出线性顺序呢。 + +所以 拓扑排序就是专门解决这类问题的。 + +概括来说,**给出一个 有向图,把这个有向图转成线性的排序 就叫拓扑排序**。 + +当然拓扑排序也要检测这个有向图 是否有环,即存在循环依赖的情况,因为这种情况是不能做线性排序的。 + +所以**拓扑排序也是图论中判断有向无环图的常用方法**。 + +------------ + + +## 拓扑排序的思路 + +拓扑排序指的是一种 解决问题的大体思路, 而具体算法,可能是广搜也可能是深搜。 + +大家可能发现 各式各样的解法,纠结哪个是拓扑排序? + +其实只要能在把 有向无环图 进行线性排序 的算法 都可以叫做 拓扑排序。 + +实现拓扑排序的算法有两种:卡恩算法(BFS)和DFS + +> 卡恩1962年提出这种解决拓扑排序的思路 + +一般来说我们只需要掌握 BFS (广度优先搜索)就可以了,清晰易懂,如果还想多了解一些,可以再去学一下 DFS 的思路,但 DFS 不是本篇重点。 + +接下来我们来讲解BFS的实现思路。 + +以题目中示例为例如图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240510110836.png) + +做拓扑排序的话,如果肉眼去找开头的节点,一定能找到 节点0 吧,都知道要从节点0 开始。 + +但为什么我们能找到 节点0呢,因为我们肉眼看着 这个图就是从 节点0出发的。 + +作为出发节点,它有什么特征? + +你看节点0 的入度 为0 出度为2, 也就是 没有边指向它,而它有两条边是指出去的。 + +> 节点的入度表示 有多少条边指向它,节点的出度表示有多少条边 从该节点出发。 + +所以当我们做拓扑排序的时候,应该优先找 入度为 0 的节点,只有入度为0,它才是出发节点。 +**理解以上内容很重要**! + +接下来我给出 拓扑排序的过程,其实就两步: + +1. 找到入度为0 的节点,加入结果集 +2. 将该节点从图中移除 + +循环以上两步,直到 所有节点都在图中被移除了。 + +结果集的顺序,就是我们想要的拓扑排序顺序 (结果集里顺序可能不唯一) + +## 模拟过程 + +用本题的示例来模拟一下这一过程: + + +1、找到入度为0 的节点,加入结果集 + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240510113110.png) + +2、将该节点从图中移除 + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240510113142.png) + +---------------- + +1、找到入度为0 的节点,加入结果集 + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240510113345.png) + +这里大家会发现,节点1 和 节点2 入度都为0, 选哪个呢? + +选哪个都行,所以这也是为什么拓扑排序的结果是不唯一的。 + +2、将该节点从图中移除 + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240510113640.png) + +--------------- + +1、找到入度为0 的节点,加入结果集 + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240510113853.png) + +节点2 和 节点3 入度都为0,选哪个都行,这里选节点2 + +2、将该节点从图中移除 + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240510114004.png) + +-------------- + +后面的过程一样的,节点3 和 节点4,入度都为0,选哪个都行。 + +最后结果集为: 0 1 2 3 4 。当然结果不唯一的。 + +## 判断有环 + +如果有 有向环怎么办呢?例如这个图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240510115115.png) + +这个图,我们只能将入度为0 的节点0 接入结果集。 + +之后,节点1、2、3、4 形成了环,找不到入度为0 的节点了,所以此时结果集里只有一个元素。 +那么如果我们发现结果集元素个数 不等于 图中节点个数,我们就可以认定图中一定有 有向环! +这也是拓扑排序判断有向环的方法。 + +通过以上过程的模拟大家会发现这个拓扑排序好像不难,还有点简单。 + +## 写代码 + +理解思想后,确实不难,但代码写起来也不容易。 + +为了每次可以找到所有节点的入度信息,我们要在初始话的时候,就把每个节点的入度 和 每个节点的依赖关系做统计。 + +代码如下: + +```CPP +cin >> n >> m; +vector inDegree(n, 0); // 记录每个文件的入度 +vector result; // 记录结果 +unordered_map> umap; // 记录文件依赖关系 + +while (m--) { + // s->t,先有s才能有t + cin >> s >> t; + inDegree[t]++; // t的入度加一 + umap[s].push_back(t); // 记录s指向哪些文件 +} + +``` + +找入度为0 的节点,我们需要用一个队列放存放。 + +因为每次寻找入度为0的节点,不一定只有一个节点,可能很多节点入度都为0,所以要将这些入度为0的节点放到队列里,依次去处理。 + +代码如下: + +```CPP + +queue que; +for (int i = 0; i < n; i++) { + // 入度为0的节点,可以作为开头,先加入队列 + if (inDegree[i] == 0) que.push(i); +} +``` + +开始从队列里遍历入度为0 的节点,将其放入结果集。 + +```CPP + +while (que.size()) { + int cur = que.front(); // 当前选中的节点 + que.pop(); + result.push_back(cur); + // 将该节点从图中移除 + +} +``` + +这里面还有一个很重要的过程,如何把这个入度为0的节点从图中移除呢? + +首先我们为什么要把节点从图中移除? + +为的是将 该节点作为出发点所连接的边删掉。 + +删掉的目的是什么呢? + +要把 该节点作为出发点所连接的节点的 入度 减一。 + +如果这里不理解,看上面的模拟过程第一步: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240510113110.png) + +这事节点1 和 节点2 的入度为 1。 + +将节点0删除后,图为这样: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240510113142.png) + +那么 节点0 作为出发点 所连接的节点的入度 就都做了 减一 的操作。 + +此时 节点1 和 节点 2 的入度都为0, 这样才能作为下一轮选取的节点。 + +所以,我们在代码实现的过程中,本质是要将 该节点作为出发点所连接的节点的 入度 减一 就可以了,这样好能根据入度找下一个节点,不用真在图里把这个节点删掉。 + +该过程代码如下: + + +```CPP + +while (que.size()) { + int cur = que.front(); // 当前选中的节点 + que.pop(); + result.push_back(cur); + // 将该节点从图中移除 + vector files = umap[cur]; //获取cur指向的节点 + if (files.size()) { // 如果cur有指向的节点 + for (int i = 0; i < files.size(); i++) { // 遍历cur指向的节点 + inDegree[files[i]] --; // cur指向的节点入度都做减一操作 + // 如果指向的节点减一之后,入度为0,说明是我们要选取的下一个节点,放入队列。 + if(inDegree[files[i]] == 0) que.push(files[i]); + } + } + +} +``` + +最后代码如下: + + +```CPP +#include +#include +#include +#include +using namespace std; +int main() { + int m, n, s, t; + cin >> n >> m; + vector inDegree(n, 0); // 记录每个节点的入度 + + unordered_map> umap;// 记录节点依赖关系 + vector result; // 记录结果 + + while (m--) { + // s->t,先有s才能有t + cin >> s >> t; + inDegree[t]++; // t的入度加一 + umap[s].push_back(t); // 记录s指向哪些节点 + } + queue que; + for (int i = 0; i < n; i++) { + // 入度为0的节点,可以作为开头,先加入队列 + if (inDegree[i] == 0) que.push(i); + //cout << inDegree[i] << endl; + } + // int count = 0; + while (que.size()) { + int cur = que.front(); // 当前选中的节点 + que.pop(); + //count++; + result.push_back(cur); + vector files = umap[cur]; //获取该节点指向的节点 + if (files.size()) { // cur有后续节点 + for (int i = 0; i < files.size(); i++) { + inDegree[files[i]] --; // cur的指向的节点入度-1 + if(inDegree[files[i]] == 0) que.push(files[i]); + } + } + } + // 判断是否有有向环 + if (result.size() == n) { + // 注意输出格式,最后一个元素后面没有空格 + for (int i = 0; i < n - 2; i++) cout << result[i] << " "; + cout << result[n - 1]; + } else cout << -1 << endl; +} +``` diff --git "a/problems/kamacoder/0094.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I.md" "b/problems/kamacoder/0094.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I.md" index 0ce00bbf1d..dc9b46f338 100644 --- "a/problems/kamacoder/0094.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I.md" +++ "b/problems/kamacoder/0094.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I.md" @@ -1,18 +1,21 @@ -# 94. 城市间货物运输 I +# Bellman_ford 算法精讲 -[卡码网: 94. 城市间货物运输 I](https://kamacoder.com/problempage.php?pid=1152) +[卡码网:94. 城市间货物运输 I](https://kamacoder.com/problempage.php?pid=1152) 题目描述 某国为促进城市间经济交流,决定对货物运输提供补贴。共有 n 个编号为 1 到 n 的城市,通过道路网络连接,网络中的道路仅允许从某个城市单向通行到另一个城市,不能反向通行。 -网络中的道路都有各自的运输成本和政府补贴,道路的权值计算方式为:运输成本 - 政府补贴。权值为正表示扣除了政府补贴后运输货物仍需支付的费用;权值为负则表示政府的补贴超过了支出的运输成本,实际表现为运输过程中还能赚取一定的收益。 +网络中的道路都有各自的运输成本和政府补贴,道路的权值计算方式为:运输成本 - 政府补贴。 +权值为正表示扣除了政府补贴后运输货物仍需支付的费用;权值为负则表示政府的补贴超过了支出的运输成本,实际表现为运输过程中还能赚取一定的收益。 -请找出从城市 1 到城市 n 的所有可能路径中,综合政府补贴后的最低运输成本。如果最低运输成本是一个负数,它表示在遵循最优路径的情况下,运输过程中反而能够实现盈利。 +请找出从城市 1 到城市 n 的所有可能路径中,综合政府补贴后的最低运输成本。 + +如果最低运输成本是一个负数,它表示在遵循最优路径的情况下,运输过程中反而能够实现盈利。 城市 1 到城市 n 之间可能会出现没有路径的情况,同时保证道路网络中不存在任何负权回路。 @@ -41,17 +44,19 @@ 1 3 5 ``` +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240509200224.png) + ## 思路 -本题依然是最短路问题,求 从 节点1 到节点n 的最小费用。 但本题不同之处在于 边的权值是有负数的。 +本题依然是单源最短路问题,求 从 节点1 到节点n 的最小费用。 **但本题不同之处在于 边的权值是有负数了**。 从 节点1 到节点n 的最小费用也可以是负数,费用如果是负数 则表示 运输的过程中 政府补贴大于运输成本。 在求单源最短路的方法中,使用dijkstra 的话,则要求图中边的权值都为正数。 -我们在 [kama47.参会dijkstra朴素](./kama47.参会dijkstra朴素.md) 中专门有讲解,为什么有边为负数 使用dijkstra就不行了。 +我们在 [dijkstra朴素版](./0047.参会dijkstra朴素.md) 中专门有讲解:为什么有边为负数 使用dijkstra就不行了。 -本题是经典的带负权值的单源最短路问题,此时就轮到Bellman_ford登场了,接下来我们来详细介绍Bellman_ford 算法 如何解决这类问题。 +**本题是经典的带负权值的单源最短路问题,此时就轮到Bellman_ford登场了**,接下来我们来详细介绍Bellman_ford 算法 如何解决这类问题。 > 该算法是由 R.Bellman 和L.Ford 在20世纪50年代末期发明的算法,故称为Bellman_ford算法。 @@ -67,7 +72,7 @@ 所以大家翻译过来,就是 “放松” 或者 “松弛” 。 -但《算法四》没有具体去讲这个 “放松” 究竟是个啥? 网上的题解也没有讲题解里的 “松弛这条边,松弛所有边”等等 里面的 “松弛” 究竟是什么意思? +但《算法四》没有具体去讲这个 “放松” 究竟是个啥? 网上很多题解也没有讲题解里的 “松弛这条边,松弛所有边”等等 里面的 “松弛” 究竟是什么意思? 这里我给大家举一个例子,每条边有起点、终点和边的权值。例如一条边,节点A 到 节点B 权值为value,如图: @@ -76,13 +81,13 @@ minDist[B] 表示 到达B节点 最小权值,minDist[B] 有哪些状态可以推出来? 状态一: minDist[A] + value 可以推出 minDist[B] -状态二: minDist[B]本身就有权值 (可能是其他边链接的节点B 例如节点C,以至于 dp[B]记录了其他边到dp[B]的权值) +状态二: minDist[B]本身就有权值 (可能是其他边链接的节点B 例如节点C,以至于 minDist[B]记录了其他边到minDist[B]的权值) -那么minDist[B] 应为如何取舍。 +minDist[B] 应为如何取舍。 本题我们要求最小权值,那么 这两个状态我们就取最小的 -``` +```CPP if (minDist[B] > minDist[A] + value) minDist[B] = minDist[A] + value ``` @@ -108,7 +113,7 @@ if (minDist[B] > minDist[A] + value) minDist[B] = minDist[A] + value **那么为什么是 n - 1次 松弛呢**? -这里要给大家模拟一遍 Bellman_ford 的算法才行,接下来我们来看看对所有边松弛 n -1 次的操作是什么样的。 +这里要给大家模拟一遍 Bellman_ford 的算法才行,接下来我们来看看对所有边松弛 n - 1 次的操作是什么样的。 我们依然使用**minDist数组来表达 起点到各个节点的最短距离**,例如minDist[3] = 5 表示起点到达节点3 的最小距离为5 @@ -204,19 +209,18 @@ if (minDist[B] > minDist[A] + value) minDist[B] = minDist[A] + value 那么无论图是什么样的,边是什么样的顺序,我们对所有边松弛 n-1 次 就一定能得到 起点到达 终点的最短距离。 -其实也同时计算出了,起点 到达 所有节点的最短距离,因为所有节点与起点连接的变数最多也就是 n-1条边。 +其实也同时计算出了,起点 到达 所有节点的最短距离,因为所有节点与起点连接的边数最多也就是 n-1 条边。 截止到这里,Bellman_ford 的核心算法思路,大家就了解的差不多了。 共有两个关键点。 -* “松弛”究竟是个啥 -* 为什么要对所有边松弛 n - 1 次 (n为节点个数) +* “松弛”究竟是个啥? +* 为什么要对所有边松弛 n - 1 次 (n为节点个数) ? 那么Bellman_ford的解题解题过程其实就是对所有边松弛 n-1 次,然后得出得到终点的最短路径。 - ### 代码 理解上面讲解的内容,代码就更容易写了,本题代码如下:(详细注释) @@ -271,7 +275,7 @@ int main() { grid数组是用来存图的,这是题目描述中必须要使用的空间,而不是我们算法所使用的空间。 -我们在讲空间复杂度的时候,一般都是说,我们这个算法的空间复杂度。 +我们在讲空间复杂度的时候,一般都是说,我们这个算法所用的空间复杂度。 ### 拓展 @@ -283,6 +287,7 @@ grid数组是用来存图的,这是题目描述中必须要使用的空间, 那么我们只要松弛 n - 1次 就一定能得到结果,没必要在松弛更多次了。 这里有疑惑的录友,可以加上打印 minDist数组 的日志,尝试一下,看看松弛 n 次会怎么样。 + 你会发现 松弛 大于 n - 1次,minDist数组 就不会变化了。 这里我给出打印日志的代码: @@ -336,9 +341,9 @@ int main() { ``` -通过打日志,大家发现,怎么对所有边进行第二次松弛以后结果就 不再变化了,那根本就不用松弛 n - 1啊? +通过打日志,大家发现,怎么对所有边进行第二次松弛以后结果就 不再变化了,那根本就不用松弛 n - 1 ? -这是本题的样例的特殊性, 松弛 n-1次 是保证对任何图 都能最后求得到终点的最小距离。 +这是本题的样例的特殊性, 松弛 n-1 次 是保证对任何图 都能最后求得到终点的最小距离。 如果还想不明白 我再举一个例子,用以下测试用例再跑一下。 @@ -367,11 +372,11 @@ int main() { 0 1 2 3 4 5 ``` -你会发现到 n-1 次 打印出最后的最短路结果。 +你会发现到 n-1 次 才打印出最后的最短路结果。 -关于上面的讲解,大家已经要多写代码去实验,验证自己的想法。 +关于上面的讲解,大家一定要多写代码去实验,验证自己的想法。 -至于 负权回路 ,我在下一篇会专门讲解这种情况,大家有个印象就好。 +**至于 负权回路 ,我在下一篇会专门讲解这种情况,大家有个印象就好**。 ## 总结 diff --git "a/problems/kamacoder/0095.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223II.md" "b/problems/kamacoder/0095.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223II.md" index 1dd14f5816..3200efb377 100644 --- "a/problems/kamacoder/0095.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223II.md" +++ "b/problems/kamacoder/0095.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223II.md" @@ -1,7 +1,7 @@ -# 95. 城市间货物运输 II +# bellman_ford之判断负权回路 -[题目链接](https://kamacoder.com/problempage.php?pid=1153) +[卡码网:95. 城市间货物运输 II](https://kamacoder.com/problempage.php?pid=1153) 【题目描述】 diff --git "a/problems/kamacoder/0096.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223III.md" "b/problems/kamacoder/0096.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223III.md" index c9d97a9d8e..f7533e024f 100644 --- "a/problems/kamacoder/0096.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223III.md" +++ "b/problems/kamacoder/0096.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223III.md" @@ -1,7 +1,7 @@ -# 96. 城市间货物运输 III +# bellman_ford之单源有限最短路 -[题目链接](https://kamacoder.com/problempage.php?pid=1154) +[卡码网:96. 城市间货物运输 III](https://kamacoder.com/problempage.php?pid=1154) 【题目描述】 @@ -560,26 +560,73 @@ int main() { 这又是为什么呢? -可以发现耗时主要是在 第8组数据上: - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240418114511.png) - -其实第八组数据是我特别制作的一个 稠密大图,该图有250个节点和10000条边, 在这种情况下, SPFA 的时间复杂度 是接近与 bellman_ford的。 +对于后台数据,我特别制作的一个稠密大图,该图有250个节点和10000条边, 在这种情况下, SPFA 的时间复杂度 是接近与 bellman_ford的。 但因为 SPFA 节点的进出队列操作,耗时很大,所以相同的时间复杂度的情况下,SPFA 实际上更耗时了。 这一点我在 [0094.城市间货物运输I-SPFA](./0094.城市间货物运输I-SPFA.md) 有分析,感兴趣的录友再回头去看看。 +## 拓展四(能否用dijkstra) + +本题能否使用 dijkstra 算法呢? + +dijkstra 是贪心的思路 每一次搜索都只会找距离源点最近的非访问过的节点。 + +如果限制最多访问k个节点,那么 dijkstra 未必能在有限次就能到达终点,即使在经过k个节点确实可以到达终点的情况下。 + +这么说大家会感觉有点抽象,我用 [dijkstra朴素版精讲](./0047.参会dijkstra朴素.md) 里的示例在举例说明: (如果没看过我讲的[dijkstra朴素版精讲](./0047.参会dijkstra朴素.md),建议去仔细看一下,否则下面讲解容易看不懂) + + +在以下这个图中,求节点1 到 节点7 最多经过2个节点 的最短路是多少呢? + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240508112249.png) + +最短路显然是: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240508112416.png) + +最多经过2个节点,也就是3条边相连的路线:节点1 -> 节点2 -> 节点6-> 节点7 + +如果是 dijkstra 求解的话,求解过程是这样的: (下面是dijkstra的模拟过程,我精简了很多,如果看不懂,一定要先看[dijkstra朴素版精讲](./0047.参会dijkstra朴素.md)) + +初始化如图所示: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240130115306.png) + +找距离源点最近且没有被访问过的节点,先找节点1 + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240130115421.png) + + +距离源点最近且没有被访问过的节点,找节点2: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240130121240.png) + +距离源点最近且没有被访问过的节点,找到节点3: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240130120434.png) + +距离源点最近且没有被访问过的节点,找到节点4: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240201105335.png) + +此时最多经过2个节点的搜索就完毕了,但结果中minDist[7] (即节点7的结果)并没有被更。 + +那么 dijkstra 会告诉我们 节点1 到 节点7 最多经过2个节点的情况下是不可到达的。 + +通过以上模拟过程,大家应该能感受到 dijkstra 贪心的过程,正是因为 贪心,所以 dijkstra 找不到 节点1 -> 节点2 -> 节点6-> 节点7 这条路径。 + ## 总结 本题是单源有限最短路问题,也是 bellman_ford的一个拓展问题,如果理解bellman_ford 其实思路比较容易理解,但有很多细节。 例如 为什么要用 minDist_copy 来记录上一轮 松弛的结果。 这也是本篇我为什么花了这么大篇幅讲解的关键所在。 -接下来,还给大家多了三个拓展: +接下来,还给大家做了四个拓展: * 边的顺序的影响 * 本题的本质 * SPFA的解法 +* 能否用dijkstra -学透了以上三个拓展,相信大家会对bellman_ford有更深入的理解。 +学透了以上四个拓展,相信大家会对bellman_ford有更深入的理解。 diff --git "a/problems/kamacoder/0097.\345\260\217\346\230\216\351\200\233\345\205\254\345\233\255.md" "b/problems/kamacoder/0097.\345\260\217\346\230\216\351\200\233\345\205\254\345\233\255.md" index b2afc482fd..7e69994961 100644 --- "a/problems/kamacoder/0097.\345\260\217\346\230\216\351\200\233\345\205\254\345\233\255.md" +++ "b/problems/kamacoder/0097.\345\260\217\346\230\216\351\200\233\345\205\254\345\233\255.md" @@ -58,7 +58,7 @@ 通过本题,我们来系统讲解一个新的最短路算法-Floyd 算法。 -Floyd 算法对边的权值正负没有要求,都可以处理。 +**Floyd 算法对边的权值正负没有要求,都可以处理**。 Floyd算法核心思想是动态规划。 @@ -76,7 +76,7 @@ Floyd算法核心思想是动态规划。 那么这样我们是不是就找到了,子问题推导求出整体最优方案的递归关系呢。 -而节点1 到 节点9 的最短距离 可以由 节点1 到节点5的最短距离 + 节点5到节点9的最短距离组成, 也可以有 节点1 到节点7的最短距离 + 节点7 到节点9的最短距离的距离组成。 +节点1 到 节点9 的最短距离 可以由 节点1 到节点5的最短距离 + 节点5到节点9的最短距离组成, 也可以有 节点1 到节点7的最短距离 + 节点7 到节点9的最短距离的距离组成。 那么选哪个呢? @@ -100,11 +100,15 @@ Floyd算法核心思想是动态规划。 grid[i][j][k] = m,表示 节点i 到 节点j 以[1...k] 集合为中间节点的最短距离为m。 -可能有录友会想: 节点i 到 节点j 的最短距离为m,这句话可以理解,但 以[1...k]集合为中间节点 理解不辽。 +可能有录友会想,凭什么就这么定义呢? -节点i 到 节点j 的最短路径中 一定是经过很多节点,那么这个集合用[1...k] 来表示。 +节点i 到 节点j 的最短距离为m,这句话可以理解,但 以[1...k]集合为中间节点就理解不辽了。 -k不能单独指某个节点,因为谁说 节点i 到节点j的最短路径中 一定只有一个节点呢,所以k 一定要表示一个集合,即[1...k] ,表示节点1 到 节点k 一共k个节点的集合。 +节点i 到 节点j 的最短路径中 一定是经过很多节点,那么这个集合用[1...k] 来表示。 + +你可以反过来想,节点i 到 节点j 中间一定经过很多节点,那么你能用什么方式来表述中间这么多节点呢? + +所以 这里的k不能单独指某个节点,k 一定要表示一个集合,即[1...k] ,表示节点1 到 节点k 一共k个节点的集合。 2、确定递推公式 @@ -139,18 +143,20 @@ grid[i][j][k] = m,表示 节点i 到 节点j 以[1...k] 集合为中间节点 例如题目中只是输入边(节点2 -> 节点6,权值为3),那么grid[2][6][k] = 3,k需要填什么呢? -把k 填成1,那如何上来就知道 节点2 经过节点1 到达节点6的最短距离是3 呢。 +把k 填成1,那如何上来就知道 节点2 经过节点1 到达节点6的最短距离是多少 呢。 所以 只能 把k 赋值为 0,本题 节点0 是无意义的,节点是从1 到 n。 这样我们在下一轮计算的时候,就可以根据 grid[i][j][0] 来计算 grid[i][j][1],此时的 grid[i][j][1] 就是 节点i 经过节点1 到达 节点j 的最小距离了。 +grid数组是一个三维数组,那么我们初始化的数据在 i 与 j 构成的平层,如图: +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240425104247.png) -**初始化这里要画图,对后面的遍历顺序理解很重要** +红色的 底部一层是我们初始化好的数据,注意:从三维角度去看初始化的数据很重要,下面我们在聊遍历顺序的时候还会再讲。 -所以初始化: +所以初始化代码: ```CPP vector>> grid(n + 1, vector>(n + 1, vector(n + 1, 10005))); // C++定义了一个三位数组,10005是因为边的最大距离是10^4 @@ -167,7 +173,7 @@ grid数组中其他元素数值应该初始化多少呢? 本题求的是最小值,所以输入数据没有涉及到的节点的情况都应该初始为一个最大数。 -这样才不会影响,每次计算去最小值的时候,初始值对计算结果的影响。 +这样才不会影响,每次计算去最小值的时候 初始值对计算结果的影响。 所以grid数组的定义可以是: @@ -191,7 +197,7 @@ vector>> grid(n + 1, vector>(n + 1, vector(n 遍历的顺序是从底向上 一层一层去遍历。 -所以遍历k 的for循环一定是在最外面,这样才能 水平方向一层一层去遍历。如图: +所以遍历k 的for循环一定是在最外面,这样才能一层一层去遍历。如图: ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240424120109.png) @@ -228,7 +234,7 @@ for (int i = 1; i <= n; i++) { ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240424115827.png) -而我们初始化,是 k 为0,然后 i 和 j 形成的平面做初始化,如果以 k 和 j 形成的平面去遍历,就造成了 递推公式 用不上上一轮计算的结果,从而导致结果不对(初始化的结果只能用上一部分,因为初始化是 i 与j 形成的平面)。 +而我们初始化的数据 是 k 为0, i 和 j 形成的平面做初始化,如果以 k 和 j 形成的平面去一层一层遍历,就造成了 递推公式 用不上上一轮计算的结果,从而导致结果不对(初始化的部分是 i 与j 形成的平面,在初始部分有讲过)。 我再给大家举一个测试用例 @@ -246,23 +252,54 @@ for (int i = 1; i <= n; i++) { ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240424120942.png) -就节点1 到 节点 2 的最短距离,运行结果是 10 ,但正确的结果很明显是3。 +求节点1 到 节点 2 的最短距离,运行结果是 10 ,但正确的结果很明显是3。 为什么呢? -因为 k 放在最里面,先就把 节点1 和 节点 2 的最短距离就确定了,后面再也不会计算节点 1 和 节点 2的距离,同时也不会基于 初始化或者之前计算过的结果来计算,即不会考虑 节点1 到 节点3, 节点3 到节点 4,节点4到节点2 的距离。 +因为 k 放在最里面,先就把 节点1 和 节点 2 的最短距离就确定了,后面再也不会计算节点 1 和 节点 2的距离,同时也不会基于 初始化或者之前计算过的结果来计算,即:不会考虑 节点1 到 节点3, 节点3 到节点 4,节点4到节点2 的距离。 + + +造成这一原因,是 在三维立体坐标中, 我们初始化的是 i 和 i 在k 为0 所构成的平面,但遍历的时候 是以 j 和 k构成的平面以 i 为垂直方向去层次遍历。 而遍历k 的for循环如果放在中间呢,同样是 j 与k 行程一个平面,i 是纵面,遍历的也是这样: ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240424115827.png) - 同样不能完全用上初始化 和 上一层计算的结果。 -很多录友对于 floyd算法的遍历顺序搞不懂,其实 是没有从三维的角度去思考,同时我把三维立体图给大家画出来,遍历顺序标出来,大家就很容易想明白,为什么 k 放在最外层 才能用上 初始化和上一轮计算的结果了。 +根据这个情况再举一个例子: + +``` +5 2 +1 2 1 +2 3 10 +1 +1 3 +``` + +图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240425112636.png) +求 节点1 到节点3 的最短距离,如果k循环放中间,程序的运行结果是 -1,也就是不能到达节点3。 +在计算 grid[i][j][k] 的时候,需要基于 grid[i][k][k-1] 和 grid[k][j][k-1]的数值。 + +也就是 计算 grid[1][3][2] (表示节点1 到 节点3,经过节点2) 的时候,需要基于 grid[1][2][1] 和 grid[2][3][1]的数值,而 我们初始化,只初始化了 k为0 的那一层。 + +造成这一原因 依然是 在三维立体坐标中, 我们初始化的是 i 和 j 在k 为0 所构成的平面,但遍历的时候 是以 j 和 k构成的平面以 i 为垂直方向去层次遍历。 + + +很多录友对于 floyd算法的遍历顺序搞不懂,**其实 是没有从三维的角度去思考**,同时我把三维立体图给大家画出来,遍历顺序标出来,大家就很容易想明白,为什么 k 放在最外层 才能用上 初始化和上一轮计算的结果了。 + +5、举例推导dp数组 + +这里涉及到 三维矩阵,可以一层一层打印出来去分析,例如k=0 的这一层,k = 1的这一层,但一起把三维带数据的图画出来其实不太好画。 + +## 代码如下 + +以上分析完毕,最后代码如下: ```CPP @@ -300,42 +337,43 @@ int main() { } } -``` - +``` +## 空间优化 -# 拓展 负权回路 +这里 我们可以做一下 空间上的优化,从滚动数组的角度来看,我们定义一个 grid[n + 1][ n + 1][2] 这么大的数组就可以,因为k 只是依赖于 k-1的状态,并不需要记录k-2,k-3,k-4 等等这些状态。 -本题可以有负数,但不能出现负权回路 +那么我们只需要记录 grid[i][j][1] 和 grid[i][j][0] 就好,之后就是 grid[i][j][1] 和 grid[i][j][0] 交替滚动。 ---------- +在进一步想,如果本层计算(本层计算即k相同,从三维角度来讲) gird[i][j] 用到了 本层中刚计算好的 grid[i][k] 会有什么问题吗? -floyd n^3 +如果 本层刚计算好的 grid[i][k] 比上一层 (即k-1层)计算的 grid[i][k] 小,说明确实有 i 到 k 的更短路径,那么基于 更小的 grid[i][k] 去计算 gird[i][j] 没有问题。 -同样多源汇最短路算法 Floyd 也是基于动态规划 +如果 本层刚计算好的 grid[i][k] 比上一层 (即k-1层)计算的 grid[i][k] 大, 这不可能,因为这样也不会做更新 grid[i][k]的操作。 -Floyd 算法可以用来解决多源最短路径问题,它会计算图中每两个点之间的最短路径。 +所以本层计算中,使用了本层计算过的 grid[i][k] 和 grid[k][j] 是没问题的。 - Floyd 算法对边权的正负没有限制要求(可处理正负权边的图),且能利用 Floyd 算法可能够对图中负环进行判定 +那么就没必要区分,grid[i][k] 和 grid[k][j] 是 属于 k - 1 层的呢,还是 k 层的。 -LeetCode-1334. 阈值距离内邻居最少的城市 +所以递归公式可以为: -https://leetcode.cn/problems/find-the-city-with-the-smallest-number-of-neighbors-at-a-threshold-distance/description/ +```CPP +grid[i][j] = min(grid[i][j], grid[i][k] + grid[k][j]); +``` ------------ +基于二维数组的本题代码为: -```CPP +```CPP #include #include -#include using namespace std; int main() { int n, m, p1, p2, val; cin >> n >> m; - vector> grid(n, vector(n, 10005)); // 因为边的最大距离是10^4 + vector> grid(n + 1, vector(n + 1, 10005)); // 因为边的最大距离是10^4 for(int i = 0; i < m; i++){ cin >> p1 >> p2 >> val; @@ -344,10 +382,10 @@ int main() { } // 开始 floyd - for (int p = 0; p < n; p++) { - for (int i = 0; i < n; i++) { - for (int j = 0; j < n; j++) { - grid[i][j] = min(grid[i][j], grid[i][p] + grid[p][j]); + for (int k = 1; k <= n; k++) { + for (int i = 1; i <= n; i++) { + for (int j = 1; j <= n; j++) { + grid[i][j] = min(grid[i][j], grid[i][k] + grid[k][j]); } } } @@ -355,13 +393,31 @@ int main() { int z, start, end; cin >> z; while (z--) { - cin >> start >> end; + cin >> start >> end; if (grid[start][end] == 10005) cout << -1 << endl; else cout << grid[start][end] << endl; } } - ``` +* 时间复杂度: O(n^3) +* 空间复杂度:O(n^2) + +## 总结 + +本期如果上来只用二维数组来讲的话,其实更容易,但遍历顺序那里用二维数组其实是讲不清楚的,所以我直接用三维数组来讲,目的是将遍历顺序这里讲清楚。 + +理解了遍历顺序才是floyd算法最精髓的地方。 + + +floyd算法的时间复杂度相对较高,适合 稠密图且源点较多的情况。 + +如果是稀疏图,floyd是从节点的角度去计算了,例如 图中节点数量是 1000,就一条边,那 floyd的时间复杂度依然是 O(n^3) 。 + +如果 源点少,其实可以 多次dijsktra 求源点到终点。 + + + + diff --git "a/problems/kamacoder/0098.\346\211\200\346\234\211\345\217\257\350\276\276\350\267\257\345\276\204.md" "b/problems/kamacoder/0098.\346\211\200\346\234\211\345\217\257\350\276\276\350\267\257\345\276\204.md" new file mode 100644 index 0000000000..0aa12fb61e --- /dev/null +++ "b/problems/kamacoder/0098.\346\211\200\346\234\211\345\217\257\350\276\276\350\267\257\345\276\204.md" @@ -0,0 +1,471 @@ + +# 98. 所有可达路径 + +[卡码网题目链接(ACM模式)](https://kamacoder.com/problempage.php?pid=1170) + +【题目描述】 + +给定一个有 n 个节点的有向无环图,节点编号从 1 到 n。请编写一个函数,找出并返回所有从节点 1 到节点 n 的路径。每条路径应以节点编号的列表形式表示。 + +【输入描述】 + +第一行包含两个整数 N,M,表示图中拥有 N 个节点,M 条边 + +后续 M 行,每行包含两个整数 s 和 t,表示图中的 s 节点与 t 节点中有一条路径 + +【输出描述】 + +输出所有的可达路径,路径中所有节点的后面跟一个空格,每条路径独占一行,存在多条路径,路径输出的顺序可任意。 + +如果不存在任何一条路径,则输出 -1。 + +【输入示例】 + +``` +5 5 +1 3 +3 5 +1 2 +2 4 +4 5 +``` + +【输出示例】 + +``` +1 3 5 +1 2 4 5 +``` + +提示信息 + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240514103953.png) + +用例解释: + +有五个节点,其中的从 1 到达 5 的路径有两个,分别是 1 -> 3 -> 5 和 1 -> 2 -> 4 -> 5。 + +因为拥有多条路径,所以输出结果为: + +``` +1 3 5 +1 2 4 5 +``` + +或 + +``` +1 2 4 5 +1 3 5 +``` + +都算正确。 + +数据范围: + +* 图中不存在自环 +* 图中不存在平行边 +* 1 <= N <= 100 +* 1 <= M <= 500 + + +## 插曲 + +这道题目是深度优先搜索,比较好的入门题。 + +如果对深度优先搜索还不够了解,可以先看这里:[深度优先搜索的理论基础](https://programmercarl.com/图论深搜理论基础.html) + +我依然总结了深搜三部曲,如果按照代码随想录刷题的录友,应该刷过 二叉树的递归三部曲,回溯三部曲。 + +**大家可能有疑惑,深搜 和 二叉树和回溯算法 有什么区别呢**? 什么时候用深搜 什么时候用回溯? + +我在讲解[二叉树理论基础](https://programmercarl.com/二叉树理论基础.html)的时候,提到过,**二叉树的前中后序遍历其实就是深搜在二叉树这种数据结构上的应用**。 + +那么回溯算法呢,**其实 回溯算法就是 深搜,只不过 我们给他一个更细分的定义,叫做回溯算法**。 + +那有的录友可能说:那我以后称回溯算法为深搜,是不是没毛病? + +理论上来说,没毛病,但 就像是 二叉树 你不叫它二叉树,叫它数据结构,有问题不? 也没问题对吧。 + +建议是 有细分的场景,还是称其细分场景的名称。 所以回溯算法可以独立出来,但回溯确实就是深搜。 + +## 图的存储 + +在[图论理论基础篇]() + + + +## 深度优先搜索 + +接下来我们使用深搜三部曲来分析题目: + +1. 确认递归函数,参数 + +首先我们dfs函数一定要存一个图,用来遍历的,还要存一个目前我们遍历的节点,定义为x + +至于 单一路径,和路径集合可以放在全局变量,那么代码是这样的: + +```CPP +vector> result; // 收集符合条件的路径 +vector path; // 0节点到终点的路径 +// x:目前遍历的节点 +// graph:存当前的图 +void dfs (vector>& graph, int x) +``` + +2. 确认终止条件 + +什么时候我们就找到一条路径了? + +当目前遍历的节点 为 最后一个节点的时候 就找到了一条 从出发点到终止点的路径。 + +----------- +当前遍历的节点,我们定义为x,最后一点节点 就是 graph.size() - 1(因为题目描述是找出所有从节点 0 到节点 n-1 的路径并输出)。 + +所以 但 x 等于 graph.size() - 1 的时候就找到一条有效路径。 代码如下: + +------- + +```CPP +// 要求从节点 0 到节点 n-1 的路径并输出,所以是 graph.size() - 1 +if (x == graph.size() - 1) { // 找到符合条件的一条路径 + result.push_back(path); // 收集有效路径 + return; +} +``` + +3. 处理目前搜索节点出发的路径 + +接下来是走 当前遍历节点x的下一个节点。 + +首先是要找到 x节点链接了哪些节点呢? 遍历方式是这样的: + +```c++ +for (int i = 0; i < graph[x].size(); i++) { // 遍历节点n链接的所有节点 +``` + +接下来就是将 选中的x所连接的节点,加入到 单一路径来。 + +```C++ +path.push_back(graph[x][i]); // 遍历到的节点加入到路径中来 + +``` + +一些录友可以疑惑这里如果找到x 链接的节点的,例如如果x目前是节点0,那么目前的过程就是这样的: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20221204111937.png) + +二维数组中,graph[x][i] 都是x链接的节点,当前遍历的节点就是 `graph[x][i]` 。 + +进入下一层递归 + +```CPP +dfs(graph, graph[x][i]); // 进入下一层递归 +``` + +最后就是回溯的过程,撤销本次添加节点的操作。 该过程整体代码: + +```CPP +for (int i = 0; i < graph[x].size(); i++) { // 遍历节点n链接的所有节点 + path.push_back(graph[x][i]); // 遍历到的节点加入到路径中来 + dfs(graph, graph[x][i]); // 进入下一层递归 + path.pop_back(); // 回溯,撤销本节点 +} +``` + +本题整体代码如下: + +```CPP +class Solution { +private: + vector> result; // 收集符合条件的路径 + vector path; // 0节点到终点的路径 + // x:目前遍历的节点 + // graph:存当前的图 + void dfs (vector>& graph, int x) { + // 要求从节点 0 到节点 n-1 的路径并输出,所以是 graph.size() - 1 + if (x == graph.size() - 1) { // 找到符合条件的一条路径 + result.push_back(path); + return; + } + for (int i = 0; i < graph[x].size(); i++) { // 遍历节点n链接的所有节点 + path.push_back(graph[x][i]); // 遍历到的节点加入到路径中来 + dfs(graph, graph[x][i]); // 进入下一层递归 + path.pop_back(); // 回溯,撤销本节点 + } + } +public: + vector> allPathsSourceTarget(vector>& graph) { + path.push_back(0); // 无论什么路径已经是从0节点出发 + dfs(graph, 0); // 开始遍历 + return result; + } +}; + +``` + +## 总结 + +本题是比较基础的深度优先搜索模板题,这种有向图路径问题,最合适使用深搜,当然本题也可以使用广搜,但广搜相对来说就麻烦了一些,需要记录一下路径。 + +而深搜和广搜都适合解决颜色类的问题,例如岛屿系列,其实都是 遍历+标记,所以使用哪种遍历都是可以的。 + +至于广搜理论基础,我们在下一篇在好好讲解,敬请期待! + +## 其他语言版本 + +### Java + +```Java +// 深度优先遍历 +class Solution { + List> ans; // 用来存放满足条件的路径 + List cnt; // 用来保存 dfs 过程中的节点值 + + public void dfs(int[][] graph, int node) { + if (node == graph.length - 1) { // 如果当前节点是 n - 1,那么就保存这条路径 + ans.add(new ArrayList<>(cnt)); + return; + } + for (int index = 0; index < graph[node].length; index++) { + int nextNode = graph[node][index]; + cnt.add(nextNode); + dfs(graph, nextNode); + cnt.remove(cnt.size() - 1); // 回溯 + } + } + + public List> allPathsSourceTarget(int[][] graph) { + ans = new ArrayList<>(); + cnt = new ArrayList<>(); + cnt.add(0); // 注意,0 号节点要加入 cnt 数组中 + dfs(graph, 0); + return ans; + } +} +``` + +### Python + +```python +class Solution: + def __init__(self): + self.result = [] + self.path = [0] + + def allPathsSourceTarget(self, graph: List[List[int]]) -> List[List[int]]: + if not graph: return [] + + self.dfs(graph, 0) + return self.result + + def dfs(self, graph, root: int): + if root == len(graph) - 1: # 成功找到一条路径时 + # ***Python的list是mutable类型*** + # ***回溯中必须使用Deep Copy*** + self.result.append(self.path[:]) + return + + for node in graph[root]: # 遍历节点n的所有后序节点 + self.path.append(node) + self.dfs(graph, node) + self.path.pop() # 回溯 +``` + + +### JavaScript +```javascript +var allPathsSourceTarget = function(graph) { + let res=[],path=[] + + function dfs(graph,start){ + if(start===graph.length-1){ + res.push([...path]) + return; + } + for(let i=0;i>) -> Vec> { + let (mut res, mut path) = (vec![], vec![0]); + Self::dfs(&graph, &mut path, &mut res, 0); + res + } + + pub fn dfs(graph: &Vec>, path: &mut Vec, res: &mut Vec>, node: usize) { + if node == graph.len() - 1 { + res.push(path.clone()); + return; + } + for &v in &graph[node] { + path.push(v); + Self::dfs(graph, path, res, v as usize); + path.pop(); + } + } +} +``` + +

+ + + + + +邻接矩阵 + +```CPP +#include +#include +using namespace std; +vector> result; // 收集符合条件的路径 +vector path; // 1节点到终点的路径 + +void dfs (const vector>& graph, int x, int n) { + + // 要求从节点 1 到节点 n 的路径并输出,所以是 graph.size() + if (x == n) { // 找到符合条件的一条路径 + result.push_back(path); + return; + } + + for (int i = 1; i <= n; i++) { // 遍历节点x链接的所有节点 + if (graph[x][i] == 1) { // 找到 x链接的节点 + path.push_back(i); // 遍历到的节点加入到路径中来 + dfs(graph, i, n); // 进入下一层递归 + path.pop_back(); // 回溯,撤销本节点 + } + } +} + +int main() { + + + int n, m, s, t; + + cin >> n >> m; + + // 节点编号从1到n,所以申请 n+1 这么大的数组 + vector> graph(n + 1, vector(n + 1, 0)); + + while (m--) { + cin >> s >> t; + // 使用临近矩阵 表示无线图,1 表示 s 与 t 是相连的 + graph[s][t] = 1; + } + path.push_back(1); // 无论什么路径已经是从0节点出发 + + dfs(graph, 1, n); // 开始遍历 + + // 输出结果 + if (result.size() == 0) cout << -1 << endl; + for (const vector &pa : result) { + for (int i = 0; i < pa.size(); i++) { + cout << pa[i] << " "; + } + cout << endl; + } +} +``` + + + +邻接表 + +```CPP +#include +#include +#include +using namespace std; + +vector> result; // 收集符合条件的路径 +vector path; // 1节点到终点的路径 + +void dfs (const vector>& graph, int x, int n) { + + // 要求从节点 1 到节点 n 的路径并输出,所以是 graph.size() + if (x == n) { // 找到符合条件的一条路径 + result.push_back(path); + return; + } + for (int i : graph[x]) { // 找到 x链接的节点 + path.push_back(i); // 遍历到的节点加入到路径中来 + dfs(graph, i, n); // 进入下一层递归 + path.pop_back(); // 回溯,撤销本节点 + } +} + +int main() { + + + int n, m, s, t; + + cin >> n >> m; + + // 节点编号从1到n,所以申请 n+1 这么大的数组 + vector> graph(n + 1); // 邻接表 + while (m--) { + cin >> s >> t; + // 使用邻接表 ,表示 s -> t 是相连的 + graph[s].push_back(t); + + } + + path.push_back(1); // 无论什么路径已经是从0节点出发 + + dfs(graph, 1, n); // 开始遍历 + + //输出结果 + if (result.size() == 0) cout << -1 << endl; + for (const vector &pa : result) { + for (int i = 0; i < pa.size(); i++) { + cout << pa[i] << " "; + } + cout << endl; + } +} + +``` diff --git "a/problems/\345\233\276\350\256\272\345\271\266\346\237\245\351\233\206\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/kamacoder/\345\233\276\350\256\272\345\271\266\346\237\245\351\233\206\347\220\206\350\256\272\345\237\272\347\241\200.md" similarity index 100% rename from "problems/\345\233\276\350\256\272\345\271\266\346\237\245\351\233\206\347\220\206\350\256\272\345\237\272\347\241\200.md" rename to "problems/kamacoder/\345\233\276\350\256\272\345\271\266\346\237\245\351\233\206\347\220\206\350\256\272\345\237\272\347\241\200.md" diff --git "a/problems/\345\233\276\350\256\272\345\271\277\346\220\234\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/kamacoder/\345\233\276\350\256\272\345\271\277\346\220\234\347\220\206\350\256\272\345\237\272\347\241\200.md" similarity index 100% rename from "problems/\345\233\276\350\256\272\345\271\277\346\220\234\347\220\206\350\256\272\345\237\272\347\241\200.md" rename to "problems/kamacoder/\345\233\276\350\256\272\345\271\277\346\220\234\347\220\206\350\256\272\345\237\272\347\241\200.md" diff --git "a/problems/kamacoder/\345\233\276\350\256\272\346\200\273\347\273\223\347\257\207.md" "b/problems/kamacoder/\345\233\276\350\256\272\346\200\273\347\273\223\347\257\207.md" new file mode 100644 index 0000000000..bee1001dc8 --- /dev/null +++ "b/problems/kamacoder/\345\233\276\350\256\272\346\200\273\347\273\223\347\257\207.md" @@ -0,0 +1,31 @@ + +# 图论总结篇 + +从深搜广搜 到并查集,从最小生成树到拓扑排序, 最后是最短路算法系列。 + +至此算上本篇,一共30篇文章,图论之旅就在此收官了。 + + +## 深搜与广搜 + +深搜与广搜是图论里基本的搜索方法,大家需要掌握三点: + +* 搜索方式:深搜是可一个方向搜,不到黄河不回头。 广搜是围绕这起点一圈一圈的去搜。 +* 代码模板:需要熟练掌握深搜和广搜的基本写法。 +* 应用场景:图论题目基本上可以即用深搜也可以广搜,无疑是用哪个方便而已 + +深搜注意事项 + +广搜注意事项 + +## 并查集 + +## 最小生成树 + +## 拓扑排序 + +## 最短路算法 + + + +算法4,只讲解了 Dijkstra,SPFA (Bellman-Ford算法基于队列) 和 拓扑排序, diff --git "a/problems/\345\233\276\350\256\272\346\267\261\346\220\234\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/kamacoder/\345\233\276\350\256\272\346\267\261\346\220\234\347\220\206\350\256\272\345\237\272\347\241\200.md" similarity index 100% rename from "problems/\345\233\276\350\256\272\346\267\261\346\220\234\347\220\206\350\256\272\345\237\272\347\241\200.md" rename to "problems/kamacoder/\345\233\276\350\256\272\346\267\261\346\220\234\347\220\206\350\256\272\345\237\272\347\241\200.md" diff --git "a/problems/kamacoder/\345\233\276\350\256\272\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/kamacoder/\345\233\276\350\256\272\347\220\206\350\256\272\345\237\272\347\241\200.md" new file mode 100644 index 0000000000..be42a5fc7c --- /dev/null +++ "b/problems/kamacoder/\345\233\276\350\256\272\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -0,0 +1,222 @@ + +# 图论理论基础 + +这一篇我们正式开始图论! + +## 图的基本概念 + +二维坐标中,两点可以连成线,多个点连成的线就构成了图。 + +当然图也可以就一个节点,甚至没有节点(空图) + +### 图的种类 + +整体上一般分为 有向图 和 无向图。 + +有向图是指 图中边是有方向的: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240510195737.png) + +无向图是指 图中边没有方向: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240510195451.png) + +加权有向图,就是图中边是有权值的,例如: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240510195821.png) + +加权无向图也是同理。 + +### 度 + +无向图中有几条边连接该节点,该节点就有几度。 + +例如,该无向图中,节点4的度为5,节点6的度为3。 + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240511115029.png) + +在有向图中,每个节点有出度和入度。 + +出度:从该节点出发的边的个数。 + +入度:指向该节点边的个数。 + +例如,该有向图中,节点3的入度为2,出度为1,节点1的入度为0,出度为2。 + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240511115235.png) + + +## 连通性 + +在图中表示节点的连通情况,我们称之为连通性。 + +### 连通图 + +在无向图中,任何两个节点都是可以到达的,我们称之为连通图 ,如图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240511102351.png) + +如果有节点不能到达其他节点,则为非连通图,如图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240511102449.png) + +节点1 不能到达节点4。 + +### 强连通图 + +在有向图中,任何两个节点是可以相互到达的,我们称之为 强连通图。 + +这里有录友可能想,这和无向图中的连通图有什么区别,不是一样的吗? + +我们来看这个有向图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240511104531.png) + +这个图是强连通图吗? + +初步一看,好像这节点都连着呢,但这不是强连通图,节点1 可以到节点5,但节点5 不能到 节点1 。 + +强连通图是在有向图中**任何两个节点是可以相互到达** + +下面这个有向图才是强连通图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240511113101.png) + + +### 连通分量 + +在无向图中的极大连通子图称之为该图的一个连通分量。 + +只看概念大家可能不理解,我来画个图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240511111559.png) + +该无向图中 节点1、节点2、节点5 构成的子图就是 该无向图中的一个连通分量,该子图所有节点都是相互可达到的。 + +同理,节点3、节点4、节点6 构成的子图 也是该无向图中的一个连通分量。 + +那么无向图中 节点3 、节点4 构成的子图 是该无向图的联通分量吗? + +不是! + +因为必须是极大联通子图才能是连通分量,所以 必须是节点3、节点4、节点6 构成的子图才是连通分量。 + +在图论中,连通分量是一个很重要的概念,例如岛屿问题(后面章节会有专门讲解)其实就是求连通分量。 + +### 强连通分量 + +在有向图中极大强连通子图称之为该图的强连通分量。 + +如图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240511112951.png) + +节点1、节点2、节点3、节点4、节点5 构成的子图是强连通分量,因为这是强连通图,也是极大图。 + +节点6、节点7、节点8 构成的子图 不是强连通分量,因为这不是强连通图,节点8 不能达到节点6。 + +节点1、节点2、节点5 构成的子图 也不是 强连通分量,因为这不是极大图。 + + +## 图的构造 + +我们如何用代码来表示一个图呢? + +一般使用邻接表、邻接矩阵 或者用类来表示。 + +主流是 邻接表和邻接矩阵。 + +### 邻接矩阵 + +邻接矩阵 使用 二维数组来表示图结构。 邻接矩阵是从节点的角度来表示图,有多少节点就申请多大的二维数组。 + +例如: grid[2][5] = 6,表示 节点 2 连接 节点5 为有向图,节点2 指向 节点5,边的权值为6。 + +如果想表示无向图,即:grid[2][5] = 6,grid[5][2] = 6,表示节点2 与 节点5 相互连通,权值为6。 + +如图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240222110025.png) + +在一个 n (节点数)为8 的图中,就需要申请 8 * 8 这么大的空间。 + +图中有一条双向边,即:grid[2][5] = 6,grid[5][2] = 6 + +这种表达方式(邻接矩阵) 在 边少,节点多的情况下,会导致申请过大的二维数组,造成空间浪费。 + +而且在寻找节点连接情况的时候,需要遍历整个矩阵,即 n * n 的时间复杂度,同样造成时间浪费。 + +邻接矩阵的优点: + +* 表达方式简单,易于理解 +* 检查任意两个顶点间是否存在边的操作非常快 +* 适合稠密图,在边数接近顶点数平方的图中,邻接矩阵是一种空间效率较高的表示方法。 + +缺点: + +* 遇到稀疏图,会导致申请过大的二维数组造成空间浪费 且遍历 边 的时候需要遍历整个n * n矩阵,造成时间浪费 + +### 邻接表 + +邻接表 使用 数组 + 链表的方式来表示。 邻接表是从边的数量来表示图,有多少边 才会申请对应大小的链表。 + +邻接表的构造如图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240223103713.png) + +这里表达的图是: + +* 节点1 指向 节点3 和 节点5 +* 节点2 指向 节点4、节点3、节点5 +* 节点3 指向 节点4 +* 节点4指向节点1 + +有多少边 邻接表才会申请多少个对应的链表节点。 + +从图中可以直观看出 使用 数组 + 链表 来表达 边的连接情况 。 + +邻接表的优点: + +* 对于稀疏图的存储,只需要存储边,空间利用率高 +* 遍历节点连接情况相对容易 + +缺点: + +* 检查任意两个节点间是否存在边,效率相对低,需要 O(V)时间,V表示某节点连接其他节点的数量。 +* 实现相对复杂,不易理解 + + +**以上大家可能理解比较模糊,没关系**,因为大家还没做过图论的题目,对于图的表达没有概念。 + +这里我先不给出具体的实现代码,大家先有个初步印象,在后面算法题实战中,我还会讲到具体代码实现,等带大家做算法题,写了代码之后,自然就理解了。 + +## 图的遍历方式 + +图的遍历方式基本是两大类: + +* 深度优先搜索(dfs) +* 广度优先搜索(bfs) + +在讲解二叉树章节的时候,其实就已经讲过这两种遍历方式。 + +二叉树的递归遍历,是dfs 在二叉树上的遍历方式。 + +二叉树的层序遍历,是bfs 在二叉树上的遍历方式。 + +dfs 和 bfs 一种搜索算法,可以在不同的数据结构上进行搜索,在二叉树章节里是在二叉树这样的数据结构上搜索。 + +而在图论章节,则是在图(邻接表或邻接矩阵)上进行搜索。 + +## 总结 + +以上知识点 大家先有个印象,上面提到的每个知识点,其实都需要大篇幅才能讲明白的。 + +我这里先给大家做一个概括,后面章节会针对每个知识点都会有对应的算法题和针对性的讲解,大家再去深入学习。 + +图论是非常庞大的知识体系,上面的内容还不足以概括图论内容,仅仅是理论基础而已。 + +在图论章节我会带大家深入讲解 深度优先搜索(DFS)、广度优先搜索(BFS)、并查集、拓扑排序、最小生成树系列、最短路算法系列等等。 + +敬请期待! + + diff --git "a/problems/kamacoder/\346\234\200\347\237\255\350\267\257\351\227\256\351\242\230\346\200\273\347\273\223\347\257\207.md" "b/problems/kamacoder/\346\234\200\347\237\255\350\267\257\351\227\256\351\242\230\346\200\273\347\273\223\347\257\207.md" new file mode 100644 index 0000000000..7f4ee6f87d --- /dev/null +++ "b/problems/kamacoder/\346\234\200\347\237\255\350\267\257\351\227\256\351\242\230\346\200\273\347\273\223\347\257\207.md" @@ -0,0 +1,48 @@ + +# 最短路算法总结篇 + +至此已经讲解了四大最短路算法,分别是Dijkstra、Bellman_ford、SPFA 和 Floyd。 + +针对这四大最短路算法,我用了七篇长文才彻底讲清楚,分别是: + +* dijkstra朴素版 +* dijkstra堆优化版 +* Bellman_ford +* Bellman_ford 队列优化算法(又名SPFA) +* bellman_ford 算法判断负权回路 +* bellman_ford之单源有限最短路 +* Floyd 算法精讲 + + +最短路算法比较复杂,而且各自有各自的应用场景,我来用一张表把讲过的最短路算法的使用场景都展现出来: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240508121355.png) + + +可能有同学感觉:这个表太复杂了,我记也记不住。 + +其实记不住的原因还是对 这几个最短路算法没有深刻的理解。 + +这里我给大家一个大体使用场景的分析: + +如果遇到单源且边为正数,直接Dijkstra。 + +至于 使用朴素版还是 堆优化版 还是取决于图的稠密度, 多少节点多少边算是稠密图,多少算是稀疏图,这个没有量化,如果想量化只能写出两个版本然后做实验去测试,不同的判题机得出的结果还不太一样。 + +一般情况下,可以直接用堆优化版本。 + +如果遇到单源边可为负数,直接 Bellman-Ford,同样 SPFA 还是 Bellman-Ford 取决于图的稠密度。 + +一般情况下,直接用 SPFA。 + +如果有负权回路,优先 Bellman-Ford, 如果是有限节点最短路 也优先 Bellman-Ford,理由是写代码比较方便。 + +如果是遇到多源点求最短路,直接 Floyd。 + +除非 源点特别少,且边都是正数,那可以 多次 Dijkstra 求出最短路径,但这种情况很少,一般出现多个源点了,就是想让你用 Floyd 了。 + + + + + + diff --git "a/problems/\345\211\215\345\272\217/\344\273\200\344\271\210\346\230\257\346\240\270\345\277\203\344\273\243\347\240\201\346\250\241\345\274\217\357\274\214\344\273\200\344\271\210\345\217\210\346\230\257ACM\346\250\241\345\274\217\357\274\237.md" "b/problems/\345\211\215\345\272\217/ACM\346\250\241\345\274\217.md" similarity index 100% rename from "problems/\345\211\215\345\272\217/\344\273\200\344\271\210\346\230\257\346\240\270\345\277\203\344\273\243\347\240\201\346\250\241\345\274\217\357\274\214\344\273\200\344\271\210\345\217\210\346\230\257ACM\346\250\241\345\274\217\357\274\237.md" rename to "problems/\345\211\215\345\272\217/ACM\346\250\241\345\274\217.md" diff --git "a/problems/\345\211\215\345\272\217/\345\210\267\344\272\206\350\277\231\344\271\210\345\244\232\351\242\230\357\274\214\344\275\240\344\272\206\350\247\243\350\207\252\345\267\261\344\273\243\347\240\201\347\232\204\345\206\205\345\255\230\346\266\210\350\200\227\344\271\210\357\274\237.md" "b/problems/\345\211\215\345\272\217/\345\206\205\345\255\230\346\266\210\350\200\227.md" similarity index 100% rename from "problems/\345\211\215\345\272\217/\345\210\267\344\272\206\350\277\231\344\271\210\345\244\232\351\242\230\357\274\214\344\275\240\344\272\206\350\247\243\350\207\252\345\267\261\344\273\243\347\240\201\347\232\204\345\206\205\345\255\230\346\266\210\350\200\227\344\271\210\357\274\237.md" rename to "problems/\345\211\215\345\272\217/\345\206\205\345\255\230\346\266\210\350\200\227.md" diff --git "a/problems/\345\211\215\345\272\217/\345\212\233\346\211\243\344\270\212\347\232\204\344\273\243\347\240\201\346\203\263\345\234\250\346\234\254\345\234\260\347\274\226\350\257\221\350\277\220\350\241\214\357\274\237.md" "b/problems/\345\211\215\345\272\217/\345\212\233\346\211\243\344\270\212\347\232\204\344\273\243\347\240\201\345\234\250\346\234\254\345\234\260\347\274\226\350\257\221\350\277\220\350\241\214.md" similarity index 100% rename from "problems/\345\211\215\345\272\217/\345\212\233\346\211\243\344\270\212\347\232\204\344\273\243\347\240\201\346\203\263\345\234\250\346\234\254\345\234\260\347\274\226\350\257\221\350\277\220\350\241\214\357\274\237.md" rename to "problems/\345\211\215\345\272\217/\345\212\233\346\211\243\344\270\212\347\232\204\344\273\243\347\240\201\345\234\250\346\234\254\345\234\260\347\274\226\350\257\221\350\277\220\350\241\214.md" diff --git "a/problems/\345\211\215\345\272\217/\345\205\263\344\272\216\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\214\344\275\240\344\270\215\347\237\245\351\201\223\347\232\204\351\203\275\345\234\250\350\277\231\351\207\214\357\274\201.md" "b/problems/\345\211\215\345\272\217/\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246.md" similarity index 100% rename from "problems/\345\211\215\345\272\217/\345\205\263\344\272\216\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\214\344\275\240\344\270\215\347\237\245\351\201\223\347\232\204\351\203\275\345\234\250\350\277\231\351\207\214\357\274\201.md" rename to "problems/\345\211\215\345\272\217/\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246.md" diff --git "a/problems/\345\211\215\345\272\217/\345\205\263\344\272\216\347\251\272\351\227\264\345\244\215\346\235\202\345\272\246\357\274\214\345\217\257\350\203\275\346\234\211\345\207\240\344\270\252\347\226\221\351\227\256\357\274\237.md" "b/problems/\345\211\215\345\272\217/\347\251\272\351\227\264\345\244\215\346\235\202\345\272\246.md" similarity index 100% rename from "problems/\345\211\215\345\272\217/\345\205\263\344\272\216\347\251\272\351\227\264\345\244\215\346\235\202\345\272\246\357\274\214\345\217\257\350\203\275\346\234\211\345\207\240\344\270\252\347\226\221\351\227\256\357\274\237.md" rename to "problems/\345\211\215\345\272\217/\347\251\272\351\227\264\345\244\215\346\235\202\345\272\246.md" diff --git "a/problems/\345\211\215\345\272\217/On\347\232\204\347\256\227\346\263\225\345\261\205\347\204\266\350\266\205\346\227\266\344\272\206\357\274\214\346\255\244\346\227\266\347\232\204n\347\251\266\347\253\237\346\230\257\345\244\232\345\244\247\357\274\237.md" "b/problems/\345\211\215\345\272\217/\347\256\227\346\263\225\350\266\205\346\227\266.md" similarity index 100% rename from "problems/\345\211\215\345\272\217/On\347\232\204\347\256\227\346\263\225\345\261\205\347\204\266\350\266\205\346\227\266\344\272\206\357\274\214\346\255\244\346\227\266\347\232\204n\347\251\266\347\253\237\346\230\257\345\244\232\345\244\247\357\274\237.md" rename to "problems/\345\211\215\345\272\217/\347\256\227\346\263\225\350\266\205\346\227\266.md" diff --git "a/problems/\345\211\215\345\272\217/\351\200\232\350\277\207\344\270\200\351\201\223\351\235\242\350\257\225\351\242\230\347\233\256\357\274\214\350\256\262\344\270\200\350\256\262\351\200\222\345\275\222\347\256\227\346\263\225\347\232\204\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\201.md" "b/problems/\345\211\215\345\272\217/\351\200\222\345\275\222\347\256\227\346\263\225\347\232\204\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246.md" similarity index 100% rename from "problems/\345\211\215\345\272\217/\351\200\232\350\277\207\344\270\200\351\201\223\351\235\242\350\257\225\351\242\230\347\233\256\357\274\214\350\256\262\344\270\200\350\256\262\351\200\222\345\275\222\347\256\227\346\263\225\347\232\204\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246\357\274\201.md" rename to "problems/\345\211\215\345\272\217/\351\200\222\345\275\222\347\256\227\346\263\225\347\232\204\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246.md" From 7ab1e2df30503803cb97a14a4a1b37ac781d6cfa Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Fri, 17 May 2024 10:18:25 +0800 Subject: [PATCH 2641/3019] Update --- ...57\350\276\276\350\267\257\345\276\204.md" | 369 ++++++++---------- ...60\351\207\217\345\271\277\346\220\234.md" | 186 +++++++++ ...60\351\207\217\346\267\261\346\220\234.md" | 179 +++++++++ ...06\350\256\272\345\237\272\347\241\200.md" | 11 - ...06\350\256\272\345\237\272\347\241\200.md" | 11 - ...72\346\200\273\347\273\223\347\257\207.md" | 2 + ...06\350\256\272\345\237\272\347\241\200.md" | 9 - 7 files changed, 520 insertions(+), 247 deletions(-) create mode 100644 "problems/kamacoder/0099.\345\262\233\345\261\277\347\232\204\346\225\260\351\207\217\345\271\277\346\220\234.md" create mode 100644 "problems/kamacoder/0099.\345\262\233\345\261\277\347\232\204\346\225\260\351\207\217\346\267\261\346\220\234.md" diff --git "a/problems/kamacoder/0098.\346\211\200\346\234\211\345\217\257\350\276\276\350\267\257\345\276\204.md" "b/problems/kamacoder/0098.\346\211\200\346\234\211\345\217\257\350\276\276\350\267\257\345\276\204.md" index 0aa12fb61e..0573d0817e 100644 --- "a/problems/kamacoder/0098.\346\211\200\346\234\211\345\217\257\350\276\276\350\267\257\345\276\204.md" +++ "b/problems/kamacoder/0098.\346\211\200\346\234\211\345\217\257\350\276\276\350\267\257\345\276\204.md" @@ -3,6 +3,8 @@ [卡码网题目链接(ACM模式)](https://kamacoder.com/problempage.php?pid=1170) +[力扣题目讲解以及题目链接(核心代码模式)](https://programmercarl.com/0797.%E6%89%80%E6%9C%89%E5%8F%AF%E8%83%BD%E7%9A%84%E8%B7%AF%E5%BE%84.html#%E6%80%9D%E8%B7%AF) + 【题目描述】 给定一个有 n 个节点的有向无环图,节点编号从 1 到 n。请编写一个函数,找出并返回所有从节点 1 到节点 n 的路径。每条路径应以节点编号的列表形式表示。 @@ -19,6 +21,8 @@ 如果不存在任何一条路径,则输出 -1。 +注意输出的序列中,最后一个节点后面没有空格! 例如正确的答案是 `1 3 5`,而不是 `1 3 5 `, 5后面没有空格! + 【输入示例】 ``` @@ -81,7 +85,7 @@ 我在讲解[二叉树理论基础](https://programmercarl.com/二叉树理论基础.html)的时候,提到过,**二叉树的前中后序遍历其实就是深搜在二叉树这种数据结构上的应用**。 -那么回溯算法呢,**其实 回溯算法就是 深搜,只不过 我们给他一个更细分的定义,叫做回溯算法**。 +那么回溯算法呢,**其实 回溯算法就是 深搜,只不过针对某一搜索场景 我们给他一个更细分的定义,叫做回溯算法**。 那有的录友可能说:那我以后称回溯算法为深搜,是不是没毛病? @@ -91,271 +95,194 @@ ## 图的存储 -在[图论理论基础篇]() +在[图论理论基础篇](./图论理论基础.md) 中我们讲到了 两种 图的存储方式:邻接表 和 邻接矩阵。 +本题我们将带大家分别实现这两个图的存储方式。 +### 邻接矩阵 -## 深度优先搜索 - -接下来我们使用深搜三部曲来分析题目: +邻接矩阵 使用 二维数组来表示图结构。 邻接矩阵是从节点的角度来表示图,有多少节点就申请多大的二维数组。 -1. 确认递归函数,参数 +本题我们会有n 个节点,因为节点标号是从1开始的,为了节点标号和下标对齐,我们申请 n + 1 * n + 1 这么大的二维数组。 -首先我们dfs函数一定要存一个图,用来遍历的,还要存一个目前我们遍历的节点,定义为x +```CPP +vector> graph(n + 1, vector(n + 1, 0)); +``` -至于 单一路径,和路径集合可以放在全局变量,那么代码是这样的: +输入m个边,构造方式如下: ```CPP -vector> result; // 收集符合条件的路径 -vector path; // 0节点到终点的路径 -// x:目前遍历的节点 -// graph:存当前的图 -void dfs (vector>& graph, int x) +while (m--) { + cin >> s >> t; + // 使用邻接矩阵 ,1 表示 节点s 指向 节点t + graph[s][t] = 1; +} ``` -2. 确认终止条件 +### 邻接表 -什么时候我们就找到一条路径了? +邻接表 使用 数组 + 链表的方式来表示。 邻接表是从边的数量来表示图,有多少边 才会申请对应大小的链表。 + +邻接表的构造相对邻接矩阵难理解一些。 -当目前遍历的节点 为 最后一个节点的时候 就找到了一条 从出发点到终止点的路径。 +我在 [图论理论基础篇](./图论理论基础.md) 举了一个例子: ------------ -当前遍历的节点,我们定义为x,最后一点节点 就是 graph.size() - 1(因为题目描述是找出所有从节点 0 到节点 n-1 的路径并输出)。 -所以 但 x 等于 graph.size() - 1 的时候就找到一条有效路径。 代码如下: +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240223103713.png) -------- +这里表达的图是: + +* 节点1 指向 节点3 和 节点5 +* 节点2 指向 节点4、节点3、节点5 +* 节点3 指向 节点4 +* 节点4指向节点1 + +我们需要构造一个数组,数组里的元素是一个链表。 + +C++写法: ```CPP -// 要求从节点 0 到节点 n-1 的路径并输出,所以是 graph.size() - 1 -if (x == graph.size() - 1) { // 找到符合条件的一条路径 - result.push_back(path); // 收集有效路径 - return; +// 节点编号从1到n,所以申请 n+1 这么大的数组 +vector> graph(n + 1); // 邻接表,list为C++里的链表 +``` + +输入m个边,构造方式如下: + +```CPP +while (m--) { + cin >> s >> t; + // 使用邻接表 ,表示 s -> t 是相连的 + graph[s].push_back(t); } ``` -3. 处理目前搜索节点出发的路径 +本题我们使用邻接表 或者 邻接矩阵都可以,因为后台数据并没有对图的大小以及稠密度做很大的区分。 -接下来是走 当前遍历节点x的下一个节点。 +以下我们使用邻接矩阵的方式来讲解,文末我也会给出 使用邻接表的整体代码。 -首先是要找到 x节点链接了哪些节点呢? 遍历方式是这样的: +**注意邻接表 和 邻接矩阵的写法都要掌握**! -```c++ -for (int i = 0; i < graph[x].size(); i++) { // 遍历节点n链接的所有节点 -``` +## 深度优先搜索 -接下来就是将 选中的x所连接的节点,加入到 单一路径来。 +本题是深度优先搜索的基础题目,关于深搜我在[图论深搜理论基础](./图论深搜理论基础.md) 已经有详细的讲解,图文并茂。 -```C++ -path.push_back(graph[x][i]); // 遍历到的节点加入到路径中来 +关于本题我会直接使用深搜三部曲来分析,如果对深搜不够了解,建议先看 [图论深搜理论基础](./图论深搜理论基础.md)。 -``` +深搜三部曲来分析题目: -一些录友可以疑惑这里如果找到x 链接的节点的,例如如果x目前是节点0,那么目前的过程就是这样的: +1. 确认递归函数,参数 -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20221204111937.png) +首先我们dfs函数一定要存一个图,用来遍历的,需要存一个目前我们遍历的节点,定义为x。 -二维数组中,graph[x][i] 都是x链接的节点,当前遍历的节点就是 `graph[x][i]` 。 +还需要存一个n,表示终点,我们遍历的时候,用来判断当 x==n 时候 标明找到了终点。 -进入下一层递归 +(其实在递归函数的参数 不容易一开始就确定了,一般是在写函数体的时候发现缺什么,参加就补什么) + +至于 单一路径 和 路径集合 可以放在全局变量,那么代码是这样的: ```CPP -dfs(graph, graph[x][i]); // 进入下一层递归 +vector> result; // 收集符合条件的路径 +vector path; // 0节点到终点的路径 +// x:目前遍历的节点 +// graph:存当前的图 +// n:终点 +void dfs (const vector>& graph, int x, int n) { ``` -最后就是回溯的过程,撤销本次添加节点的操作。 该过程整体代码: +2. 确认终止条件 + +什么时候我们就找到一条路径了? + +当目前遍历的节点 为 最后一个节点 n 的时候 就找到了一条 从出发点到终止点的路径。 ```CPP -for (int i = 0; i < graph[x].size(); i++) { // 遍历节点n链接的所有节点 - path.push_back(graph[x][i]); // 遍历到的节点加入到路径中来 - dfs(graph, graph[x][i]); // 进入下一层递归 - path.pop_back(); // 回溯,撤销本节点 +// 当前遍历的节点x 到达节点n +if (x == n) { // 找到符合条件的一条路径 + result.push_back(path); + return; } ``` -本题整体代码如下: +3. 处理目前搜索节点出发的路径 -```CPP -class Solution { -private: - vector> result; // 收集符合条件的路径 - vector path; // 0节点到终点的路径 - // x:目前遍历的节点 - // graph:存当前的图 - void dfs (vector>& graph, int x) { - // 要求从节点 0 到节点 n-1 的路径并输出,所以是 graph.size() - 1 - if (x == graph.size() - 1) { // 找到符合条件的一条路径 - result.push_back(path); - return; - } - for (int i = 0; i < graph[x].size(); i++) { // 遍历节点n链接的所有节点 - path.push_back(graph[x][i]); // 遍历到的节点加入到路径中来 - dfs(graph, graph[x][i]); // 进入下一层递归 - path.pop_back(); // 回溯,撤销本节点 - } - } -public: - vector> allPathsSourceTarget(vector>& graph) { - path.push_back(0); // 无论什么路径已经是从0节点出发 - dfs(graph, 0); // 开始遍历 - return result; - } -}; +接下来是走 当前遍历节点x的下一个节点。 + +首先是要找到 x节点指向了哪些节点呢? 遍历方式是这样的: +```c++ +for (int i = 1; i <= n; i++) { // 遍历节点x链接的所有节点 + if (graph[x][i] == 1) { // 找到 x指向的节点,就是节点i + } +} ``` -## 总结 +接下来就是将 选中的x所指向的节点,加入到 单一路径来。 -本题是比较基础的深度优先搜索模板题,这种有向图路径问题,最合适使用深搜,当然本题也可以使用广搜,但广搜相对来说就麻烦了一些,需要记录一下路径。 +```C++ +path.push_back(i); // 遍历到的节点加入到路径中来 -而深搜和广搜都适合解决颜色类的问题,例如岛屿系列,其实都是 遍历+标记,所以使用哪种遍历都是可以的。 +``` -至于广搜理论基础,我们在下一篇在好好讲解,敬请期待! -## 其他语言版本 +进入下一层递归 + +```CPP +dfs(graph, i, n); // 进入下一层递归 +``` -### Java +最后就是回溯的过程,撤销本次添加节点的操作。 -```Java -// 深度优先遍历 -class Solution { - List> ans; // 用来存放满足条件的路径 - List cnt; // 用来保存 dfs 过程中的节点值 +为什么要有回溯,我在[图论深搜理论基础](./图论深搜理论基础.md) 也有详细的讲解。 - public void dfs(int[][] graph, int node) { - if (node == graph.length - 1) { // 如果当前节点是 n - 1,那么就保存这条路径 - ans.add(new ArrayList<>(cnt)); - return; - } - for (int index = 0; index < graph[node].length; index++) { - int nextNode = graph[node][index]; - cnt.add(nextNode); - dfs(graph, nextNode); - cnt.remove(cnt.size() - 1); // 回溯 - } - } +该过程整体代码: - public List> allPathsSourceTarget(int[][] graph) { - ans = new ArrayList<>(); - cnt = new ArrayList<>(); - cnt.add(0); // 注意,0 号节点要加入 cnt 数组中 - dfs(graph, 0); - return ans; +```CPP +for (int i = 1; i <= n; i++) { // 遍历节点x链接的所有节点 + if (graph[x][i] == 1) { // 找到 x链接的节点 + path.push_back(i); // 遍历到的节点加入到路径中来 + dfs(graph, i, n); // 进入下一层递归 + path.pop_back(); // 回溯,撤销本节点 } } ``` -### Python - -```python -class Solution: - def __init__(self): - self.result = [] - self.path = [0] - - def allPathsSourceTarget(self, graph: List[List[int]]) -> List[List[int]]: - if not graph: return [] - - self.dfs(graph, 0) - return self.result - - def dfs(self, graph, root: int): - if root == len(graph) - 1: # 成功找到一条路径时 - # ***Python的list是mutable类型*** - # ***回溯中必须使用Deep Copy*** - self.result.append(self.path[:]) - return - - for node in graph[root]: # 遍历节点n的所有后序节点 - self.path.append(node) - self.dfs(graph, node) - self.path.pop() # 回溯 -``` +## 打印结果 +ACM格式大家在输出结果的时候,要关注看看格式问题,特别是字符串,有的题目说的是每个元素后面都有空格,有的题目说的是 每个元素间有空格,最后一个元素没有空格。 -### JavaScript -```javascript -var allPathsSourceTarget = function(graph) { - let res=[],path=[] +有的题目呢,压根没说,那只能提交去试一试了。 - function dfs(graph,start){ - if(start===graph.length-1){ - res.push([...path]) - return; - } - for(let i=0;i>) -> Vec> { - let (mut res, mut path) = (vec![], vec![0]); - Self::dfs(&graph, &mut path, &mut res, 0); - res - } +以上代码中,结果都存在了 result数组里(二维数组,每一行是一个结果),最后将其打印出来。(重点看注释) - pub fn dfs(graph: &Vec>, path: &mut Vec, res: &mut Vec>, node: usize) { - if node == graph.len() - 1 { - res.push(path.clone()); - return; - } - for &v in &graph[node] { - path.push(v); - Self::dfs(graph, path, res, v as usize); - path.pop(); - } +```CPP +// 输出结果 +if (result.size() == 0) cout << -1 << endl; +for (const vector &pa : result) { + for (int i = 0; i < pa.size() - 1; i++) { // 这里指打印到倒数第二个 + cout << pa[i] << " "; } + cout << pa[pa.size() - 1] << endl; // 这里再打印倒数第一个,控制最后一个元素后面没有空格 } ``` -

- - - +## 本题代码 +### 邻接矩阵写法 -邻接矩阵 ```CPP #include @@ -365,13 +292,11 @@ vector> result; // 收集符合条件的路径 vector path; // 1节点到终点的路径 void dfs (const vector>& graph, int x, int n) { - - // 要求从节点 1 到节点 n 的路径并输出,所以是 graph.size() + // 当前遍历的节点x 到达节点n if (x == n) { // 找到符合条件的一条路径 result.push_back(path); return; } - for (int i = 1; i <= n; i++) { // 遍历节点x链接的所有节点 if (graph[x][i] == 1) { // 找到 x链接的节点 path.push_back(i); // 遍历到的节点加入到路径中来 @@ -382,10 +307,7 @@ void dfs (const vector>& graph, int x, int n) { } int main() { - - int n, m, s, t; - cin >> n >> m; // 节点编号从1到n,所以申请 n+1 这么大的数组 @@ -393,27 +315,26 @@ int main() { while (m--) { cin >> s >> t; - // 使用临近矩阵 表示无线图,1 表示 s 与 t 是相连的 + // 使用邻接矩阵 表示无线图,1 表示 s 与 t 是相连的 graph[s][t] = 1; } - path.push_back(1); // 无论什么路径已经是从0节点出发 + path.push_back(1); // 无论什么路径已经是从0节点出发 dfs(graph, 1, n); // 开始遍历 // 输出结果 if (result.size() == 0) cout << -1 << endl; for (const vector &pa : result) { - for (int i = 0; i < pa.size(); i++) { + for (int i = 0; i < pa.size() - 1; i++) { cout << pa[i] << " "; } - cout << endl; + cout << pa[pa.size() - 1] << endl; } } -``` - +``` -邻接表 +### 邻接表写法 ```CPP #include @@ -426,12 +347,11 @@ vector path; // 1节点到终点的路径 void dfs (const vector>& graph, int x, int n) { - // 要求从节点 1 到节点 n 的路径并输出,所以是 graph.size() if (x == n) { // 找到符合条件的一条路径 result.push_back(path); return; } - for (int i : graph[x]) { // 找到 x链接的节点 + for (int i : graph[x]) { // 找到 x指向的节点 path.push_back(i); // 遍历到的节点加入到路径中来 dfs(graph, i, n); // 进入下一层递归 path.pop_back(); // 回溯,撤销本节点 @@ -439,10 +359,7 @@ void dfs (const vector>& graph, int x, int n) { } int main() { - - int n, m, s, t; - cin >> n >> m; // 节点编号从1到n,所以申请 n+1 这么大的数组 @@ -455,17 +372,37 @@ int main() { } path.push_back(1); // 无论什么路径已经是从0节点出发 - dfs(graph, 1, n); // 开始遍历 - //输出结果 + // 输出结果 if (result.size() == 0) cout << -1 << endl; for (const vector &pa : result) { - for (int i = 0; i < pa.size(); i++) { + for (int i = 0; i < pa.size() - 1; i++) { cout << pa[i] << " "; } - cout << endl; + cout << pa[pa.size() - 1] << endl; } } ``` + +## 总结 + +本题是一道简单的深搜题目,也可以说是模板题,和 [力扣797. 所有可能的路径](https://leetcode.cn/problems/all-paths-from-source-to-target/description/) 思路是一样一样的。 + +很多录友做力扣的时候,轻松就把代码写出来了, 但做面试笔试的时候,遇到这样的题就写不出来了。 + +在力扣上刷题不用考虑图的存储方式,也不用考虑输出的格式。 + +而这些都是 ACM 模式题目的知识点(图的存储方式)和细节(输出的格式) + +所以我才会特别制作ACM题目,同样也重点去讲解图的存储和遍历方式,来帮大家去练习。 + +对于这种有向图路径问题,最合适使用深搜,当然本题也可以使用广搜,但广搜相对来说就麻烦了一些,需要记录一下路径。 + +而深搜和广搜都适合解决颜色类的问题,例如岛屿系列,其实都是 遍历+标记,所以使用哪种遍历都是可以的。 + +至于广搜理论基础,我们在下一篇在好好讲解,敬请期待! + + + diff --git "a/problems/kamacoder/0099.\345\262\233\345\261\277\347\232\204\346\225\260\351\207\217\345\271\277\346\220\234.md" "b/problems/kamacoder/0099.\345\262\233\345\261\277\347\232\204\346\225\260\351\207\217\345\271\277\346\220\234.md" new file mode 100644 index 0000000000..dfcf062f90 --- /dev/null +++ "b/problems/kamacoder/0099.\345\262\233\345\261\277\347\232\204\346\225\260\351\207\217\345\271\277\346\220\234.md" @@ -0,0 +1,186 @@ + +# 99. 岛屿数量 + +[卡码网题目链接(ACM模式)](https://kamacoder.com/problempage.php?pid=1171) + +[力扣题目讲解以及题目链接(核心代码模式)](https://programmercarl.com/0200.%E5%B2%9B%E5%B1%BF%E6%95%B0%E9%87%8F.%E5%B9%BF%E6%90%9C%E7%89%88.html) + +题目描述: + +给定一个由 1(陆地)和 0(水)组成的矩阵,你需要计算岛屿的数量。岛屿由水平方向或垂直方向上相邻的陆地连接而成,并且四周都是水域。你可以假设矩阵外均被水包围。 + +输入描述: + +第一行包含两个整数 N, M,表示矩阵的行数和列数。 + +后续 N 行,每行包含 M 个数字,数字为 1 或者 0。 + +输出描述: + +输出一个整数,表示岛屿的数量。如果不存在岛屿,则输出 0。 + +输入示例: + +``` +4 5 +1 1 0 0 0 +1 1 0 0 0 +0 0 1 0 0 +0 0 0 1 1 +``` + +输出示例: + +3 + +提示信息 + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240516111613.png) + +根据测试案例中所展示,岛屿数量共有 3 个,所以输出 3。 + +数据范围: + +* 1 <= N, M <= 50 + + +## 思路 + +注意题目中每座岛屿只能由**水平方向和/或竖直方向上**相邻的陆地连接形成。 + +也就是说斜角度链接是不算了, 例如示例二,是三个岛屿,如图: + +![图一](https://code-thinking-1253855093.file.myqcloud.com/pics/20220726094200.png) + +这道题题目是 DFS,BFS,并查集,基础题目。 + +本题思路,是用遇到一个没有遍历过的节点陆地,计数器就加一,然后把该节点陆地所能遍历到的陆地都标记上。 + +在遇到标记过的陆地节点和海洋节点的时候直接跳过。 这样计数器就是最终岛屿的数量。 + +那么如果把节点陆地所能遍历到的陆地都标记上呢,就可以使用 DFS,BFS或者并查集。 + +### 广度优先搜索 + +不少同学用广搜做这道题目的时候,超时了。 这里有一个广搜中很重要的细节: + +根本原因是**只要 加入队列就代表 走过,就需要标记,而不是从队列拿出来的时候再去标记走过**。 + +很多同学可能感觉这有区别吗? + +如果从队列拿出节点,再去标记这个节点走过,就会发生下图所示的结果,会导致很多节点重复加入队列。 + +![图二](https://code-thinking-1253855093.file.myqcloud.com/pics/20220727100846.png) + +超时写法 (从队列中取出节点再标记) + +```CPP +int dir[4][2] = {0, 1, 1, 0, -1, 0, 0, -1}; // 四个方向 +void bfs(vector>& grid, vector>& visited, int x, int y) { + queue> que; + que.push({x, y}); + while(!que.empty()) { + pair cur = que.front(); que.pop(); + int curx = cur.first; + int cury = cur.second; + visited[curx][cury] = true; // 从队列中取出在标记走过 + for (int i = 0; i < 4; i++) { + int nextx = curx + dir[i][0]; + int nexty = cury + dir[i][1]; + if (nextx < 0 || nextx >= grid.size() || nexty < 0 || nexty >= grid[0].size()) continue; // 越界了,直接跳过 + if (!visited[nextx][nexty] && grid[nextx][nexty] == '1') { + que.push({nextx, nexty}); + } + } + } + +} +``` + + +加入队列 就代表走过,立刻标记,正确写法: + +```CPP +int dir[4][2] = {0, 1, 1, 0, -1, 0, 0, -1}; // 四个方向 +void bfs(vector>& grid, vector>& visited, int x, int y) { + queue> que; + que.push({x, y}); + visited[x][y] = true; // 只要加入队列,立刻标记 + while(!que.empty()) { + pair cur = que.front(); que.pop(); + int curx = cur.first; + int cury = cur.second; + for (int i = 0; i < 4; i++) { + int nextx = curx + dir[i][0]; + int nexty = cury + dir[i][1]; + if (nextx < 0 || nextx >= grid.size() || nexty < 0 || nexty >= grid[0].size()) continue; // 越界了,直接跳过 + if (!visited[nextx][nexty] && grid[nextx][nexty] == '1') { + que.push({nextx, nexty}); + visited[nextx][nexty] = true; // 只要加入队列立刻标记 + } + } + } + +} +``` + +以上两个版本其实,其实只有细微区别,就是 `visited[x][y] = true;` 放在的地方,这取决于我们对 代码中队列的定义,队列中的节点就表示已经走过的节点。 **所以只要加入队列,立即标记该节点走过**。 + +本题完整广搜代码: + +```CPP +#include +#include +#include +using namespace std; + +int dir[4][2] = {0, 1, 1, 0, -1, 0, 0, -1}; // 四个方向 +void bfs(const vector>& grid, vector>& visited, int x, int y) { + queue> que; + que.push({x, y}); + visited[x][y] = true; // 只要加入队列,立刻标记 + while(!que.empty()) { + pair cur = que.front(); que.pop(); + int curx = cur.first; + int cury = cur.second; + for (int i = 0; i < 4; i++) { + int nextx = curx + dir[i][0]; + int nexty = cury + dir[i][1]; + if (nextx < 0 || nextx >= grid.size() || nexty < 0 || nexty >= grid[0].size()) continue; // 越界了,直接跳过 + if (!visited[nextx][nexty] && grid[nextx][nexty] == 1) { + que.push({nextx, nexty}); + visited[nextx][nexty] = true; // 只要加入队列立刻标记 + } + } + } +} + + +int main() { + int n, m; + cin >> n >> m; + vector> grid(n, vector(m, 0)); + for (int i = 0; i < n; i++) { + for (int j = 0; j < m; j++) { + cin >> grid[i][j]; + } + } + + vector> visited(n, vector(m, false)); + + int result = 0; + for (int i = 0; i < n; i++) { + for (int j = 0; j < m; j++) { + if (!visited[i][j] && grid[i][j] == 1) { + result++; // 遇到没访问过的陆地,+1 + bfs(grid, visited, i, j); // 将与其链接的陆地都标记上 true + } + } + } + + + cout << result << endl; +} + +``` + diff --git "a/problems/kamacoder/0099.\345\262\233\345\261\277\347\232\204\346\225\260\351\207\217\346\267\261\346\220\234.md" "b/problems/kamacoder/0099.\345\262\233\345\261\277\347\232\204\346\225\260\351\207\217\346\267\261\346\220\234.md" new file mode 100644 index 0000000000..310676105f --- /dev/null +++ "b/problems/kamacoder/0099.\345\262\233\345\261\277\347\232\204\346\225\260\351\207\217\346\267\261\346\220\234.md" @@ -0,0 +1,179 @@ + +# 99. 岛屿数量 + +[卡码网题目链接(ACM模式)](https://kamacoder.com/problempage.php?pid=1171) + +[力扣题目讲解以及题目链接(核心代码模式)](https://programmercarl.com/0200.%E5%B2%9B%E5%B1%BF%E6%95%B0%E9%87%8F.%E6%B7%B1%E6%90%9C%E7%89%88.html) + +题目描述: + +给定一个由 1(陆地)和 0(水)组成的矩阵,你需要计算岛屿的数量。岛屿由水平方向或垂直方向上相邻的陆地连接而成,并且四周都是水域。你可以假设矩阵外均被水包围。 + +输入描述: + +第一行包含两个整数 N, M,表示矩阵的行数和列数。 + +后续 N 行,每行包含 M 个数字,数字为 1 或者 0。 + +输出描述: + +输出一个整数,表示岛屿的数量。如果不存在岛屿,则输出 0。 + +输入示例: + +``` +4 5 +1 1 0 0 0 +1 1 0 0 0 +0 0 1 0 0 +0 0 0 1 1 +``` + +输出示例: + +3 + +提示信息 + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240516111613.png) + +根据测试案例中所展示,岛屿数量共有 3 个,所以输出 3。 + +数据范围: + +* 1 <= N, M <= 50 + +## 思路 + +注意题目中每座岛屿只能由**水平方向和/或竖直方向上**相邻的陆地连接形成。 + +也就是说斜角度链接是不算了, 例如示例二,是三个岛屿,如图: + +![图一](https://code-thinking-1253855093.file.myqcloud.com/pics/20220726094200.png) + +这道题题目是 DFS,BFS,并查集,基础题目。 + +本题思路,是用遇到一个没有遍历过的节点陆地,计数器就加一,然后把该节点陆地所能遍历到的陆地都标记上。 + +在遇到标记过的陆地节点和海洋节点的时候直接跳过。 这样计数器就是最终岛屿的数量。 + +那么如何把节点陆地所能遍历到的陆地都标记上呢,就可以使用 DFS,BFS或者并查集。 + +### 深度优先搜索 + +以下代码使用dfs实现,如果对dfs不太了解的话,**建议按照代码随想录的讲解顺序学习**。 + +C++代码如下: + +```CPP +// 版本一 +#include +#include +using namespace std; + +int dir[4][2] = {0, 1, 1, 0, -1, 0, 0, -1}; // 四个方向 +void dfs(const vector>& grid, vector>& visited, int x, int y) { + for (int i = 0; i < 4; i++) { + int nextx = x + dir[i][0]; + int nexty = y + dir[i][1]; + if (nextx < 0 || nextx >= grid.size() || nexty < 0 || nexty >= grid[0].size()) continue; // 越界了,直接跳过 + if (!visited[nextx][nexty] && grid[nextx][nexty] == 1) { // 没有访问过的 同时 是陆地的 + + visited[nextx][nexty] = true; + dfs(grid, visited, nextx, nexty); + } + } +} + +int main() { + int n, m; + cin >> n >> m; + vector> grid(n, vector(m, 0)); + for (int i = 0; i < n; i++) { + for (int j = 0; j < m; j++) { + cin >> grid[i][j]; + } + } + + vector> visited(n, vector(m, false)); + + int result = 0; + for (int i = 0; i < n; i++) { + for (int j = 0; j < m; j++) { + if (!visited[i][j] && grid[i][j] == 1) { + visited[i][j] = true; + result++; // 遇到没访问过的陆地,+1 + dfs(grid, visited, i, j); // 将与其链接的陆地都标记上 true + } + } + } + + cout << result << endl; +} +``` + +很多录友可能有疑惑,为什么 以上代码中的dfs函数,没有终止条件呢? 感觉递归没有终止很危险。 + +其实终止条件 就写在了 调用dfs的地方,如果遇到不合法的方向,直接不会去调用dfs。 + +当然也可以这么写: + +```CPP +// 版本二 +#include +#include +using namespace std; +int dir[4][2] = {0, 1, 1, 0, -1, 0, 0, -1}; // 四个方向 +void dfs(const vector>& grid, vector>& visited, int x, int y) { + if (visited[x][y] || grid[x][y] == 0) return; // 终止条件:访问过的节点 或者 遇到海水 + visited[x][y] = true; // 标记访问过 + for (int i = 0; i < 4; i++) { + int nextx = x + dir[i][0]; + int nexty = y + dir[i][1]; + if (nextx < 0 || nextx >= grid.size() || nexty < 0 || nexty >= grid[0].size()) continue; // 越界了,直接跳过 + dfs(grid, visited, nextx, nexty); + } +} + +int main() { + int n, m; + cin >> n >> m; + vector> grid(n, vector(m, 0)); + for (int i = 0; i < n; i++) { + for (int j = 0; j < m; j++) { + cin >> grid[i][j]; + } + } + + vector> visited(n, vector(m, false)); + + int result = 0; + for (int i = 0; i < n; i++) { + for (int j = 0; j < m; j++) { + if (!visited[i][j] && grid[i][j] == 1) { + result++; // 遇到没访问过的陆地,+1 + dfs(grid, visited, i, j); // 将与其链接的陆地都标记上 true + } + } + } + cout << result << endl; +} +``` + +这里大家应该能看出区别了,无疑就是版本一中 调用dfs 的条件判断 放在了 版本二 的 终止条件位置上。 + +**版本一的写法**是 :下一个节点是否能合法已经判断完了,传进dfs函数的就是合法节点。 + +**版本二的写法**是:不管节点是否合法,上来就dfs,然后在终止条件的地方进行判断,不合法再return。 + +**理论上来讲,版本一的效率更高一些**,因为避免了 没有意义的递归调用,在调用dfs之前,就做合法性判断。 但从写法来说,可能版本二 更利于理解一些。(不过其实都差不太多) + +很多同学看了同一道题目,都是dfs,写法却不一样,**有时候有终止条件,有时候连终止条件都没有,其实这就是根本原因,两种写法而已**。 + + +## 总结 + +其实本题是 dfs,bfs 模板题,但正是因为是模板题,所以大家或者一些题解把重要的细节都很忽略了,我这里把大家没注意的但以后会踩的坑 都给列出来了。 + +本篇我只给出的dfs的写法,大家发现我写的还是比较细的,那么后面我再单独给出本题的bfs写法,虽然是模板题,但依然有很多注意的点,敬请期待! + diff --git "a/problems/kamacoder/\345\233\276\350\256\272\345\271\266\346\237\245\351\233\206\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/kamacoder/\345\233\276\350\256\272\345\271\266\346\237\245\351\233\206\347\220\206\350\256\272\345\237\272\347\241\200.md" index 6a9cc1aca2..3bf45f77f1 100644 --- "a/problems/kamacoder/\345\233\276\350\256\272\345\271\266\346\237\245\351\233\206\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/kamacoder/\345\233\276\350\256\272\345\271\266\346\237\245\351\233\206\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -1,9 +1,3 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

- # 并查集理论基础 接下来我们来讲一下并查集,首先当然是并查集理论基础。 @@ -460,8 +454,3 @@ void join(int u, int v) { 敬请期待 并查集题目精讲系列。 - -

- - - diff --git "a/problems/kamacoder/\345\233\276\350\256\272\345\271\277\346\220\234\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/kamacoder/\345\233\276\350\256\272\345\271\277\346\220\234\347\220\206\350\256\272\345\237\272\347\241\200.md" index 51a82944ea..c494e0d0e2 100644 --- "a/problems/kamacoder/\345\233\276\350\256\272\345\271\277\346\220\234\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/kamacoder/\345\233\276\350\256\272\345\271\277\346\220\234\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -1,9 +1,3 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

- # 广度优先搜索理论基础 @@ -156,8 +150,3 @@ def bfs(grid, visited, x, y): ``` - -

- - - diff --git "a/problems/kamacoder/\345\233\276\350\256\272\346\200\273\347\273\223\347\257\207.md" "b/problems/kamacoder/\345\233\276\350\256\272\346\200\273\347\273\223\347\257\207.md" index bee1001dc8..92b3581d53 100644 --- "a/problems/kamacoder/\345\233\276\350\256\272\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/kamacoder/\345\233\276\350\256\272\346\200\273\347\273\223\347\257\207.md" @@ -16,6 +16,8 @@ 深搜注意事项 +同样是深搜模板题,会有两种写法, + 广搜注意事项 ## 并查集 diff --git "a/problems/kamacoder/\345\233\276\350\256\272\346\267\261\346\220\234\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/kamacoder/\345\233\276\350\256\272\346\267\261\346\220\234\347\220\206\350\256\272\345\237\272\347\241\200.md" index 27464aabe4..2be97057bf 100644 --- "a/problems/kamacoder/\345\233\276\350\256\272\346\267\261\346\220\234\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/kamacoder/\345\233\276\350\256\272\346\267\261\346\220\234\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -1,8 +1,3 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

# 深度优先搜索理论基础 @@ -199,7 +194,3 @@ for (选择:本节点所连接的其他节点) { 后面我也会给大家安排具体练习的题目,依旧是代码随想录的风格,循序渐进由浅入深! -

- - - From f5a5d2005e394f0d5de2adf9d88f839796f3267b Mon Sep 17 00:00:00 2001 From: GP Date: Sat, 18 May 2024 13:05:11 +0800 Subject: [PATCH 2642/3019] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BA=86=E4=B8=80?= =?UTF-8?q?=E7=89=88=E6=9B=B4=E9=80=9A=E4=BF=97=E6=98=93=E6=87=82=E7=9A=84?= =?UTF-8?q?Java=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...72\346\227\213\347\237\251\351\230\265.md" | 73 +++++++++++++++++++ 1 file changed, 73 insertions(+) diff --git "a/problems/0054.\350\236\272\346\227\213\347\237\251\351\230\265.md" "b/problems/0054.\350\236\272\346\227\213\347\237\251\351\230\265.md" index 4d54ccd6d7..d7cfc7bf27 100644 --- "a/problems/0054.\350\236\272\346\227\213\347\237\251\351\230\265.md" +++ "b/problems/0054.\350\236\272\346\227\213\347\237\251\351\230\265.md" @@ -200,6 +200,79 @@ class Solution { } ``` +```java +class Solution { + public List spiralOrder(int[][] matrix) { + List res = new ArrayList<>(); // 存放结果 + if (matrix.length == 0 || matrix[0].length == 0) + return res; + int rows = matrix.length, columns = matrix[0].length; + int startx = 0, starty = 0; // 定义每循环一个圈的起始位置 + int loop = 0; // 循环次数 + int offset = 1; // 每一圈循环,需要控制每一条边遍历的长度 + while (loop < Math.min(rows, columns) / 2) { + int i = startx; + int j = starty; + // 模拟填充上行从左到右(左闭右开) + for (; j < columns - offset; j++) { + res.add(matrix[i][j]); + } + // 模拟填充右列从上到下(左闭右开) + for (; i < rows - offset; i++) { + res.add(matrix[i][j]); + } + // 模拟填充下行从右到左(左闭右开) + for (; j > starty; j--) { + res.add(matrix[i][j]); + } + // 模拟填充左列从下到上(左闭右开) + for (; i > startx; i--) { + res.add(matrix[i][j]); + } + + // 起始位置加1 循环次数加1 并控制每条边遍历的长度 + startx++; + starty++; + offset++; + loop++; + } + + // 如果列或行中的最小值为奇数 则一定有未遍历的部分 + // 可以自行画图理解 + if (Math.min(rows, columns) % 2 == 1) { + // 当行大于列时 未遍历的部分是列 + // (startx, starty)即下一个要遍历位置 从该位置出发 遍历完未遍历的列 + // 遍历次数为rows - columns + 1 + if (rows > columns) { + for (int i = 0; i < rows - columns + 1; i++) { + res.add(matrix[startx++][starty]); + } + } else { + // 此处与上面同理 遍历完未遍历的行 + for (int i = 0; i < columns - rows + 1; i++) { + res.add(matrix[startx][starty++]); + } + } + } + + return res; + } +} +``` + + + + + + + + + + + + + + ### Javascript ``` /** From 00c9165e3ca52cebaa3449cc996a43fdd4184c93 Mon Sep 17 00:00:00 2001 From: GPFE05 <113404586+GPFE05@users.noreply.github.com> Date: Sun, 19 May 2024 11:06:26 +0800 Subject: [PATCH 2643/3019] =?UTF-8?q?Update=200054.=E8=9E=BA=E6=97=8B?= =?UTF-8?q?=E7=9F=A9=E9=98=B5.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\236\272\346\227\213\347\237\251\351\230\265.md" | 13 ------------- 1 file changed, 13 deletions(-) diff --git "a/problems/0054.\350\236\272\346\227\213\347\237\251\351\230\265.md" "b/problems/0054.\350\236\272\346\227\213\347\237\251\351\230\265.md" index d7cfc7bf27..96d17413c4 100644 --- "a/problems/0054.\350\236\272\346\227\213\347\237\251\351\230\265.md" +++ "b/problems/0054.\350\236\272\346\227\213\347\237\251\351\230\265.md" @@ -260,19 +260,6 @@ class Solution { } ``` - - - - - - - - - - - - - ### Javascript ``` /** From 784ed2a68c2eb3a790bda49dc5fbbee797f99fbe Mon Sep 17 00:00:00 2001 From: Henry Zheng <1204831218@qq.com> Date: Mon, 20 May 2024 08:51:59 +0800 Subject: [PATCH 2644/3019] =?UTF-8?q?Update=20#0455=20=E5=88=86=E5=8F=91?= =?UTF-8?q?=E9=A5=BC=E5=B9=B2=20=E6=A0=88=20=E5=A4=A7=E9=A5=BC=E5=B9=B2?= =?UTF-8?q?=E4=BC=98=E5=85=88=20&=20#700=20=E4=BA=8C=E5=8F=89=E6=90=9C?= =?UTF-8?q?=E7=B4=A2=E6=A0=91=E4=B8=AD=E7=9A=84=E6=90=9C=E7=B4=A2=20?= =?UTF-8?q?=E6=A0=88-=E9=81=8D=E5=8E=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...06\345\217\221\351\245\274\345\271\262.md" | 20 ++++++++++++++++++- ...55\347\232\204\346\220\234\347\264\242.md" | 20 +++++++++++++++++++ 2 files changed, 39 insertions(+), 1 deletion(-) diff --git "a/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" "b/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" index 6ae206dba2..b6f5bae54b 100644 --- "a/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" +++ "b/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" @@ -206,8 +206,26 @@ class Solution: ``` -### Go +栈 大饼干优先 +```python +from collecion import deque +class Solution: + def findContentChildren(self, g: List[int], s: List[int]) -> int: + #思路,饼干和孩子按从大到小排序,依次从栈中取出,若满足条件result += 1 否则将饼干栈顶元素重新返回 + result = 0 + queue_g = deque(sorted(g, reverse = True)) + queue_s = deque(sorted(s, reverse = True)) + while queue_g and queue_s: + child = queue_g.popleft() + cookies = queue_s.popleft() + if child <= cookies: + result += 1 + else: + queue_s.appendleft(cookies) + return result +``` +### Go ```golang //排序后,局部最优 func findContentChildren(g []int, s []int) int { diff --git "a/problems/0700.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\220\234\347\264\242.md" "b/problems/0700.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\220\234\347\264\242.md" index 9efb1e0519..58ada3cb0f 100644 --- "a/problems/0700.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\220\234\347\264\242.md" +++ "b/problems/0700.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\220\234\347\264\242.md" @@ -262,6 +262,26 @@ class Solution: return None ``` +(方法三) 栈-遍历 +```python +class Solution: + def searchBST(self, root: TreeNode, val: int) -> TreeNode: + stack = [root] + while stack: + node = stack.pop() + # 根据TreeNode的定义 + # node携带有三类信息 node.left/node.right/node.val + # 找到val直接返回node 即是找到了该节点为根的子树 + # 此处node.left/node.right/val的前后顺序可打乱 + if node.val == val: + return node + if node.right: + stack.append(node.right) + if node.left: + stack.append(node.left) + return None +``` + ### Go From c8ef172319234d388730cc835dbd9214c48ea82c Mon Sep 17 00:00:00 2001 From: Minxi Yan <77104028+Yan0613@users.noreply.github.com> Date: Mon, 20 May 2024 13:53:15 +0800 Subject: [PATCH 2645/3019] =?UTF-8?q?Update=200454.=E5=9B=9B=E6=95=B0?= =?UTF-8?q?=E7=9B=B8=E5=8A=A0II.md=EF=BC=8C=E4=BF=AE=E6=94=B9=E5=9B=9B?= =?UTF-8?q?=E6=95=B0=E7=9B=B8=E5=8A=A0IIGo=E7=89=88=E6=9C=AC=E7=9A=84?= =?UTF-8?q?=E8=A7=A3=E7=AD=94=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修改四数相加IIGo版本的解答代码,修改原版代码中的逻辑问题,使其通过leetcode的代码测试。 --- ...\346\225\260\347\233\270\345\212\240II.md" | 36 +++++++++++-------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git "a/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" "b/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" index db9a9e430c..b73901f8ee 100644 --- "a/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" +++ "b/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" @@ -185,22 +185,28 @@ class Solution: ### Go: ```go -func fourSumCount(nums1 []int, nums2 []int, nums3 []int, nums4 []int) int { - m := make(map[int]int) //key:a+b的数值,value:a+b数值出现的次数 - count := 0 - // 遍历nums1和nums2数组,统计两个数组元素之和,和出现的次数,放到map中 +func fourSumCount(nums1 []int, nums2 []int, nums3 []int, nums4 []int) int { + m := make(map[int]int) + count := 0 + + // 构建nums1和nums2的和的map for _, v1 := range nums1 { - for _, v2 := range nums2 { - m[v1+v2]++ - } - } - // 遍历nums3和nums4数组,找到如果 0-(c+d) 在map中出现过的话,就把map中key对应的value也就是出现次数统计出来 - for _, v3 := range nums3 { - for _, v4 := range nums4 { - count += m[-v3-v4] - } - } - return count + for _, v2 := range nums2 { + m[v1+v2]++ + } + } + + // 遍历nums3和nums4,检查-c-d是否在map中 + for _, v3 := range nums3 { + for _, v4 := range nums4 { + sum := -v3 - v4 + if countVal, ok := m[sum]; ok { + count += countVal + } + } + } + + return count } ``` From 5073196a1083da5322dde47177f4af08ced9b4f1 Mon Sep 17 00:00:00 2001 From: iteng <1475208984@qq.com> Date: Sat, 25 May 2024 17:26:43 +0800 Subject: [PATCH 2646/3019] =?UTF-8?q?=E8=B0=83=E6=8D=A2leftNode=E3=80=81ri?= =?UTF-8?q?ghtNode?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git "a/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" "b/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" index 063b542945..31c24fc5aa 100644 --- "a/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" @@ -224,8 +224,8 @@ public: st.push(root->left); st.push(root->right); while (!st.empty()) { - TreeNode* leftNode = st.top(); st.pop(); TreeNode* rightNode = st.top(); st.pop(); + TreeNode* leftNode = st.top(); st.pop(); if (!leftNode && !rightNode) { continue; } @@ -950,3 +950,4 @@ public bool IsSymmetric(TreeNode root) + From 49aee514ef7c4bf647f85810d013ed633eaf4d4c Mon Sep 17 00:00:00 2001 From: Scarlett-HS <88608721+Scarlett-HS@users.noreply.github.com> Date: Sat, 25 May 2024 21:32:01 -0400 Subject: [PATCH 2647/3019] =?UTF-8?q?=E7=BB=99=200474.=E4=B8=80=E5=92=8C?= =?UTF-8?q?=E9=9B=B6=20=E6=B7=BB=E5=8A=A0=E4=BA=86CPP=E7=9A=84=E4=B8=89?= =?UTF-8?q?=E7=BB=B4=E6=95=B0=E7=BB=84=E5=AE=9E=E7=8E=B0=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...4.\344\270\200\345\222\214\351\233\266.md" | 82 +++++++++++++++++++ 1 file changed, 82 insertions(+) diff --git "a/problems/0474.\344\270\200\345\222\214\351\233\266.md" "b/problems/0474.\344\270\200\345\222\214\351\233\266.md" index 47b34a0f31..7b46abeece 100644 --- "a/problems/0474.\344\270\200\345\222\214\351\233\266.md" +++ "b/problems/0474.\344\270\200\345\222\214\351\233\266.md" @@ -159,7 +159,89 @@ public: * 时间复杂度: O(kmn),k 为strs的长度 * 空间复杂度: O(mn) +C++: +使用三维数组的版本 +```CPP +class Solution { +public: + int findMaxForm(vector& strs, int m, int n) { + int num_of_str = strs.size(); + + vector>> dp(num_of_str, vector>(m + 1,vector(n + 1, 0))); + + /* dp[i][j][k] represents, if choosing items among strs[0] to strs[i] to form a subset, + what is the maximum size of this subset such that there are no more than m 0's and n 1's in this subset. + Each entry of dp[i][j][k] is initialized with 0 + + transition formula: + using x[i] to indicates the number of 0's in strs[i] + using y[i] to indicates the number of 1's in strs[i] + + dp[i][j][k] = max(dp[i-1][j][k], dp[i-1][j - x[i]][k - y[i]] + 1) + + */ + + + // num_of_zeros records the number of 0's for each str + // num_of_ones records the number of 1's for each str + // find the number of 0's and the number of 1's for each str in strs + vector num_of_zeros; + vector num_of_ones; + for (auto& str : strs){ + int count_of_zero = 0; + int count_of_one = 0; + for (char &c : str){ + if(c == '0') count_of_zero ++; + else count_of_one ++; + } + num_of_zeros.push_back(count_of_zero); + num_of_ones.push_back(count_of_one); + + } + + + // num_of_zeros[0] indicates the number of 0's for str[0] + // num_of_ones[0] indiates the number of 1's for str[1] + + // initialize the 1st plane of dp[i][j][k], i.e., dp[0][j][k] + // if num_of_zeros[0] > m or num_of_ones[0] > n, no need to further initialize dp[0][j][k], + // because they have been intialized to 0 previously + if(num_of_zeros[0] <= m && num_of_ones[0] <= n){ + // for j < num_of_zeros[0] or k < num_of_ones[0], dp[0][j][k] = 0 + for(int j = num_of_zeros[0]; j <= m; j++){ + for(int k = num_of_ones[0]; k <= n; k++){ + dp[0][j][k] = 1; + } + } + } + + /* if j - num_of_zeros[i] >= 0 and k - num_of_ones[i] >= 0: + dp[i][j][k] = max(dp[i-1][j][k], dp[i-1][j - num_of_zeros[i]][k - num_of_ones[i]] + 1) + else: + dp[i][j][k] = dp[i-1][j][k] + */ + + for (int i = 1; i < num_of_str; i++){ + int count_of_zeros = num_of_zeros[i]; + int count_of_ones = num_of_ones[i]; + for (int j = 0; j <= m; j++){ + for (int k = 0; k <= n; k++){ + if( j < count_of_zeros || k < count_of_ones){ + dp[i][j][k] = dp[i-1][j][k]; + }else{ + dp[i][j][k] = max(dp[i-1][j][k], dp[i-1][j - count_of_zeros][k - count_of_ones] + 1); + } + } + } + + } + + return dp[num_of_str-1][m][n]; + + } +}; +``` ## 总结 From 4fa3e4d9b0a39254aecf4597b3bb916218405e6d Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Sun, 26 May 2024 10:02:54 +0800 Subject: [PATCH 2648/3019] Update --- ...47\344\272\272\345\267\245\345\262\233.md" | 2 +- ...\211\251\350\277\220\350\276\223I-SPFA.md" | 39 +-- ...60\351\207\217\345\271\277\346\220\234.md" | 11 +- ...00\345\244\247\351\235\242\347\247\257.md" | 221 ++++++++++++++ ...04\346\200\273\351\235\242\347\247\257.md" | 180 +++++++++++ ...11\346\262\241\345\255\244\345\262\233.md" | 133 ++++++++ ...64\346\265\201\351\227\256\351\242\230.md" | 279 +++++++++++++++++ ...00\345\244\247\345\262\233\345\261\277.md" | 254 ++++++++++++++++ ...50\345\217\257\350\276\276\346\200\247.md" | 284 ++++++++++++++++++ ...77\347\232\204\345\221\250\351\225\277.md" | 154 ++++++++++ ...72\346\200\273\347\273\223\347\257\207.md" | 29 +- 11 files changed, 1561 insertions(+), 25 deletions(-) create mode 100644 "problems/kamacoder/0100.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" create mode 100644 "problems/kamacoder/0101.\345\255\244\345\262\233\347\232\204\346\200\273\351\235\242\347\247\257.md" create mode 100644 "problems/kamacoder/0102.\346\262\211\346\262\241\345\255\244\345\262\233.md" create mode 100644 "problems/kamacoder/0103.\346\260\264\346\265\201\351\227\256\351\242\230.md" create mode 100644 "problems/kamacoder/0104.\345\273\272\351\200\240\346\234\200\345\244\247\345\262\233\345\261\277.md" create mode 100644 "problems/kamacoder/0105.\346\234\211\345\220\221\345\233\276\347\232\204\345\256\214\345\205\250\345\217\257\350\276\276\346\200\247.md" create mode 100644 "problems/kamacoder/0106.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" diff --git "a/problems/0827.\346\234\200\345\244\247\344\272\272\345\267\245\345\262\233.md" "b/problems/0827.\346\234\200\345\244\247\344\272\272\345\267\245\345\262\233.md" index e452e4e395..d24eaacc50 100644 --- "a/problems/0827.\346\234\200\345\244\247\344\272\272\345\267\245\345\262\233.md" +++ "b/problems/0827.\346\234\200\345\244\247\344\272\272\345\267\245\345\262\233.md" @@ -39,7 +39,7 @@ 每改变一个0的方格,都需要重新计算一个地图的最大面积,所以 整体时间复杂度为:n^4。 -如果对深度优先搜索不了解的录友,可以看这里:[深度优先搜索精讲](https://programmercarl.com/图论深搜理论基础.html) +如果对深度优先搜索不了解的录友,可以看这里:[深度优先搜索精讲](https://programmercarl.com/kamacoder/图论深搜理论基础.html) ## 优化思路 diff --git "a/problems/kamacoder/0094.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I-SPFA.md" "b/problems/kamacoder/0094.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I-SPFA.md" index f41d6fd121..ec35fa9d98 100644 --- "a/problems/kamacoder/0094.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I-SPFA.md" +++ "b/problems/kamacoder/0094.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I-SPFA.md" @@ -8,11 +8,14 @@ 某国为促进城市间经济交流,决定对货物运输提供补贴。共有 n 个编号为 1 到 n 的城市,通过道路网络连接,网络中的道路仅允许从某个城市单向通行到另一个城市,不能反向通行。 -网络中的道路都有各自的运输成本和政府补贴,道路的权值计算方式为:运输成本 - 政府补贴。权值为正表示扣除了政府补贴后运输货物仍需支付的费用;权值为负则表示政府的补贴超过了支出的运输成本,实际表现为运输过程中还能赚取一定的收益。 +网络中的道路都有各自的运输成本和政府补贴,道路的权值计算方式为:运输成本 - 政府补贴。 +权值为正表示扣除了政府补贴后运输货物仍需支付的费用;权值为负则表示政府的补贴超过了支出的运输成本,实际表现为运输过程中还能赚取一定的收益。 -请找出从城市 1 到城市 n 的所有可能路径中,综合政府补贴后的最低运输成本。如果最低运输成本是一个负数,它表示在遵循最优路径的情况下,运输过程中反而能够实现盈利。 +请找出从城市 1 到城市 n 的所有可能路径中,综合政府补贴后的最低运输成本。 + +如果最低运输成本是一个负数,它表示在遵循最优路径的情况下,运输过程中反而能够实现盈利。 城市 1 到城市 n 之间可能会出现没有路径的情况,同时保证道路网络中不存在任何负权回路。 @@ -41,11 +44,11 @@ 1 3 5 ``` -## 思路 +## 背景 本题我们来系统讲解 Bellman_ford 队列优化算法 ,也叫SPFA算法(Shortest Path Faster Algorithm)。 -> SPFA的称呼来自 1994年西南交通大学段凡丁的论文,其实Bellman_ford 提出后不久 (20世纪50年代末期) 就有队列优化的版本,国际上不承认这个算法是是国内提出的。 所以国际上一般称呼 算法为 Bellman_ford 队列优化算法(Queue improved Bellman-Ford) +> SPFA的称呼来自 1994年西南交通大学段凡丁的论文,其实Bellman_ford 提出后不久 (20世纪50年代末期) 就有队列优化的版本,国际上不承认这个算法是是国内提出的。 所以国际上一般称呼 该算法为 Bellman_ford 队列优化算法(Queue improved Bellman-Ford) 大家知道以上来历,知道 SPFA 和 Bellman_ford 队列优化算法 指的都是一个算法就好。 @@ -72,6 +75,8 @@ 用队列来记录。(其实用栈也行,对元素顺序没有要求) +## 模拟过程 + 接下来来举例这个队列是如何工作的。 以示例给出的所有边为例: @@ -88,19 +93,19 @@ 我们依然使用**minDist数组来表达 起点到各个节点的最短距离**,例如minDist[3] = 5 表示起点到达节点3 的最小距离为5 -初始化,起点为节点1, 起点到起点的最短距离为0,所以minDist[1] 为 0。 将节点1 加入队列 (下次松弛送节点1开始) +初始化,起点为节点1, 起点到起点的最短距离为0,所以minDist[1] 为 0。 将节点1 加入队列 (下次松弛从节点1开始) ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240411115555.png) ------------ -从队列里取出节点1,松弛节点1 作为出发点链接的边(节点1 -> 节点2)和边(节点1 -> 节点3) +从队列里取出节点1,松弛节点1 作为出发点连接的边(节点1 -> 节点2)和边(节点1 -> 节点3) 边:节点1 -> 节点2,权值为1 ,minDist[2] > minDist[1] + 1 ,更新 minDist[2] = minDist[1] + 1 = 0 + 1 = 1 。 边:节点1 -> 节点3,权值为5 ,minDist[3] > minDist[1] + 5,更新 minDist[3] = minDist[1] + 5 = 0 + 5 = 5。 -将节点2,节点3 加入队列,如图: +将节点2、节点3 加入队列,如图: ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240411115544.png) @@ -108,7 +113,7 @@ ----------------- -从队列里取出节点2,松弛节点2 作为出发点链接的边(节点2 -> 节点4)和边(节点2 -> 节点5) +从队列里取出节点2,松弛节点2 作为出发点连接的边(节点2 -> 节点4)和边(节点2 -> 节点5) 边:节点2 -> 节点4,权值为1 ,minDist[4] > minDist[2] + (-3) ,更新 minDist[4] = minDist[2] + (-3) = 1 + (-3) = -2 。 @@ -123,7 +128,7 @@ -------------------- -从队列里出去节点3,松弛节点3 作为出发点链接的边。 +从队列里出去节点3,松弛节点3 作为出发点连接的边。 因为没有从节点3作为出发点的边,所以这里就从队列里取出节点3就好,不用做其他操作,如图: @@ -132,11 +137,11 @@ ------------ -从队列中取出节点4,松弛节点4作为出发点链接的边(节点4 -> 节点6) +从队列中取出节点4,松弛节点4作为出发点连接的边(节点4 -> 节点6) 边:节点4 -> 节点6,权值为4 ,minDist[6] > minDist[4] + 4,更新 minDist[6] = minDist[4] + 4 = -2 + 4 = 2 。 -讲节点6加入队列 +将节点6加入队列 如图: @@ -145,7 +150,7 @@ --------------- -从队列中取出节点5,松弛节点5作为出发点链接的边(节点5 -> 节点3),边(节点5 -> 节点6) +从队列中取出节点5,松弛节点5作为出发点连接的边(节点5 -> 节点3),边(节点5 -> 节点6) 边:节点5 -> 节点3,权值为1 ,minDist[3] > minDist[5] + 1 ,更新 minDist[3] = minDist[5] + 1 = 3 + 1 = 4 @@ -157,14 +162,14 @@ -因为节点3,和 节点6 都曾经加入过队列,不用重复加入,避免重复计算。 +因为节点3 和 节点6 都曾经加入过队列,不用重复加入,避免重复计算。 在代码中我们可以用一个数组 visited 来记录入过队列的元素,加入过队列的元素,不再重复入队列。 -------------- -从队列中取出节点6,松弛节点6 作为出发点链接的边。 +从队列中取出节点6,松弛节点6 作为出发点连接的边。 节点6作为终点,没有可以出发的边。 @@ -181,7 +186,7 @@ 了解了大体流程,我们再看代码应该怎么写。 -在上面模拟过程中,我们每次都要知道 一个节点作为出发点 链接了哪些节点。 +在上面模拟过程中,我们每次都要知道 一个节点作为出发点连接了哪些节点。 如果想方便知道这些数据,就需要使用邻接表来存储这个图,如果对于邻接表不了解的话,可以看 [kama0047.参会dijkstra堆](./kama0047.参会dijkstra堆.md) 中 图的存储 部分。 @@ -279,7 +284,7 @@ n为其他数值的时候,也是一样的。 并没有计算 出队列 和 入队列的时间消耗。 因为这个在不同语言上 时间消耗也是不一定的。 -以C++为例,以下两端代码理论上,时间复杂度都是 O(n) : +以C++为例,以下两段代码理论上,时间复杂度都是 O(n) : ```CPP for (long long i = 0; i < n; i++) { @@ -316,7 +321,7 @@ SPFA(队列优化版Bellman_ford) 在理论上 时间复杂度更胜一筹 这里可能有录友疑惑,`while (!que.empty())` 队里里 会不会造成死循环? 例如 图中有环,这样一直有元素加入到队列里? -其实有环的情况,要看它是 正权回路 还是 负全回路。 +其实有环的情况,要看它是 正权回路 还是 负权回路。 题目描述中,已经说了,本题没有 负权回路 。 diff --git "a/problems/kamacoder/0099.\345\262\233\345\261\277\347\232\204\346\225\260\351\207\217\345\271\277\346\220\234.md" "b/problems/kamacoder/0099.\345\262\233\345\261\277\347\232\204\346\225\260\351\207\217\345\271\277\346\220\234.md" index dfcf062f90..e7a0a8f3ac 100644 --- "a/problems/kamacoder/0099.\345\262\233\345\261\277\347\232\204\346\225\260\351\207\217\345\271\277\346\220\234.md" +++ "b/problems/kamacoder/0099.\345\262\233\345\261\277\347\232\204\346\225\260\351\207\217\345\271\277\346\220\234.md" @@ -54,14 +54,16 @@ 这道题题目是 DFS,BFS,并查集,基础题目。 -本题思路,是用遇到一个没有遍历过的节点陆地,计数器就加一,然后把该节点陆地所能遍历到的陆地都标记上。 +本题思路:遇到一个没有遍历过的节点陆地,计数器就加一,然后把该节点陆地所能遍历到的陆地都标记上。 -在遇到标记过的陆地节点和海洋节点的时候直接跳过。 这样计数器就是最终岛屿的数量。 +再遇到标记过的陆地节点和海洋节点的时候直接跳过。 这样计数器就是最终岛屿的数量。 那么如果把节点陆地所能遍历到的陆地都标记上呢,就可以使用 DFS,BFS或者并查集。 ### 广度优先搜索 +如果不熟悉广搜,建议先看 [广搜理论基础](./图论广搜理论基础.md)。 + 不少同学用广搜做这道题目的时候,超时了。 这里有一个广搜中很重要的细节: 根本原因是**只要 加入队列就代表 走过,就需要标记,而不是从队列拿出来的时候再去标记走过**。 @@ -72,7 +74,7 @@ ![图二](https://code-thinking-1253855093.file.myqcloud.com/pics/20220727100846.png) -超时写法 (从队列中取出节点再标记) +超时写法 (从队列中取出节点再标记,注意代码注释的地方) ```CPP int dir[4][2] = {0, 1, 1, 0, -1, 0, 0, -1}; // 四个方向 @@ -98,7 +100,7 @@ void bfs(vector>& grid, vector>& visited, int x, int y ``` -加入队列 就代表走过,立刻标记,正确写法: +加入队列 就代表走过,立刻标记,正确写法: (注意代码注释的地方) ```CPP int dir[4][2] = {0, 1, 1, 0, -1, 0, 0, -1}; // 四个方向 @@ -155,7 +157,6 @@ void bfs(const vector>& grid, vector>& visited, int x, } } - int main() { int n, m; cin >> n >> m; diff --git "a/problems/kamacoder/0100.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" "b/problems/kamacoder/0100.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" new file mode 100644 index 0000000000..6f8a9ed86a --- /dev/null +++ "b/problems/kamacoder/0100.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" @@ -0,0 +1,221 @@ + +# 100. 岛屿的最大面积 + +[卡码网题目链接(ACM模式)](https://kamacoder.com/problempage.php?pid=1172) + +[力扣题目链接](https://programmercarl.com/0695.%E5%B2%9B%E5%B1%BF%E7%9A%84%E6%9C%80%E5%A4%A7%E9%9D%A2%E7%A7%AF.html#%E6%80%9D%E8%B7%AF) + +题目描述 + +给定一个由 1(陆地)和 0(水)组成的矩阵,计算岛屿的最大面积。岛屿面积的计算方式为组成岛屿的陆地的总数。岛屿由水平方向或垂直方向上相邻的陆地连接而成,并且四周都是水域。你可以假设矩阵外均被水包围。 + +输入描述 + +第一行包含两个整数 N, M,表示矩阵的行数和列数。后续 N 行,每行包含 M 个数字,数字为 1 或者 0,表示岛屿的单元格。 + +输出描述 + +输出一个整数,表示岛屿的最大面积。如果不存在岛屿,则输出 0。 + +输入示例 + +``` +4 5 +1 1 0 0 0 +1 1 0 0 0 +0 0 1 0 0 +0 0 0 1 1 +``` + +输出示例 + +4 + +提示信息 + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240517103410.png) + +样例输入中,岛屿的最大面积为 4。 + +数据范围: + +* 1 <= M, N <= 50。 + + +## 思路 + +注意题目中每座岛屿只能由**水平方向和/或竖直方向上**相邻的陆地连接形成。 + +也就是说斜角度链接是不算了, 例如示例二,是三个岛屿,如图: + +![图一](https://code-thinking-1253855093.file.myqcloud.com/pics/20220726094200.png) + +这道题目也是 dfs bfs基础类题目,就是搜索每个岛屿上“1”的数量,然后取一个最大的。 + +本题思路上比较简单,难点其实都是 dfs 和 bfs的理论基础,关于理论基础我在这里都有详细讲解 : + +* [DFS理论基础](https://programmercarl.com/kamacoder/图论深搜理论基础.html) +* [BFS理论基础](https://programmercarl.com/kamacoder/图论广搜理论基础.html) + +### DFS + +很多同学写dfs其实也是凭感觉来的,有的时候dfs函数中写终止条件才能过,有的时候 dfs函数不写终止添加也能过! + +这里其实涉及到dfs的两种写法。 + +写法一,dfs只处理下一个节点,即在主函数遇到岛屿就计数为1,dfs处理接下来的相邻陆地 + +```CPP +// 版本一 +#include +#include +using namespace std; +int count; +int dir[4][2] = {0, 1, 1, 0, -1, 0, 0, -1}; // 四个方向 +void dfs(vector>& grid, vector>& visited, int x, int y) { + for (int i = 0; i < 4; i++) { + int nextx = x + dir[i][0]; + int nexty = y + dir[i][1]; + if (nextx < 0 || nextx >= grid.size() || nexty < 0 || nexty >= grid[0].size()) continue; // 越界了,直接跳过 + if (!visited[nextx][nexty] && grid[nextx][nexty] == 1) { // 没有访问过的 同时 是陆地的 + visited[nextx][nexty] = true; + count++; + dfs(grid, visited, nextx, nexty); + } + } +} + +int main() { + int n, m; + cin >> n >> m; + vector> grid(n, vector(m, 0)); + for (int i = 0; i < n; i++) { + for (int j = 0; j < m; j++) { + cin >> grid[i][j]; + } + } + vector> visited(n, vector(m, false)); + int result = 0; + for (int i = 0; i < n; i++) { + for (int j = 0; j < m; j++) { + if (!visited[i][j] && grid[i][j] == 1) { + count = 1; // 因为dfs处理下一个节点,所以这里遇到陆地了就先计数,dfs处理接下来的相邻陆地 + visited[i][j] = true; + dfs(grid, visited, i, j); // 将与其链接的陆地都标记上 true + result = max(result, count); + } + } + } + cout << result << endl; + +} +``` + +写法二,dfs处理当前节点,即在主函数遇到岛屿就计数为0,dfs处理接下来的全部陆地 + +dfs +```CPP +// 版本二 +#include +#include +using namespace std; + +int count; +int dir[4][2] = {0, 1, 1, 0, -1, 0, 0, -1}; // 四个方向 +void dfs(vector>& grid, vector>& visited, int x, int y) { + if (visited[x][y] || grid[x][y] == 0) return; // 终止条件:访问过的节点 或者 遇到海水 + visited[x][y] = true; // 标记访问过 + count++; + for (int i = 0; i < 4; i++) { + int nextx = x + dir[i][0]; + int nexty = y + dir[i][1]; + if (nextx < 0 || nextx >= grid.size() || nexty < 0 || nexty >= grid[0].size()) continue; // 越界了,直接跳过 + dfs(grid, visited, nextx, nexty); + } +} + +int main() { + int n, m; + cin >> n >> m; + vector> grid(n, vector(m, 0)); + for (int i = 0; i < n; i++) { + for (int j = 0; j < m; j++) { + cin >> grid[i][j]; + } + } + vector> visited = vector>(n, vector(m, false)); + int result = 0; + for (int i = 0; i < n; i++) { + for (int j = 0; j < m; j++) { + if (!visited[i][j] && grid[i][j] == 1) { + count = 0; // 因为dfs处理当前节点,所以遇到陆地计数为0,进dfs之后在开始从1计数 + dfs(grid, visited, i, j); // 将与其链接的陆地都标记上 true + result = max(result, count); + } + } + } + cout << result << endl; +} +``` + +大家通过注释可以发现,两种写法,版本一,在主函数遇到陆地就计数为1,接下来的相邻陆地都在dfs中计算。 + +版本二 在主函数遇到陆地 计数为0,也就是不计数,陆地数量都去dfs里做计算。 + +这也是为什么大家看了很多 dfs的写法 ,发现写法怎么都不一样呢? 其实这就是根本原因。 + + +### BFS + +关于广度优先搜索,如果大家还不了解的话,看这里:[广度优先搜索精讲](https://programmercarl.com/kamacoder/图论广搜理论基础.html) + +本题BFS代码如下: + +```CPP +class Solution { +private: + int count; + int dir[4][2] = {0, 1, 1, 0, -1, 0, 0, -1}; // 四个方向 + void bfs(vector>& grid, vector>& visited, int x, int y) { + queue que; + que.push(x); + que.push(y); + visited[x][y] = true; // 加入队列就意味节点是陆地可到达的点 + count++; + while(!que.empty()) { + int xx = que.front();que.pop(); + int yy = que.front();que.pop(); + for (int i = 0 ;i < 4; i++) { + int nextx = xx + dir[i][0]; + int nexty = yy + dir[i][1]; + if (nextx < 0 || nextx >= grid.size() || nexty < 0 || nexty >= grid[0].size()) continue; // 越界 + if (!visited[nextx][nexty] && grid[nextx][nexty] == 1) { // 节点没有被访问过且是陆地 + visited[nextx][nexty] = true; + count++; + que.push(nextx); + que.push(nexty); + } + } + } + } + +public: + int maxAreaOfIsland(vector>& grid) { + int n = grid.size(), m = grid[0].size(); + vector> visited = vector>(n, vector(m, false)); + int result = 0; + for (int i = 0; i < n; i++) { + for (int j = 0; j < m; j++) { + if (!visited[i][j] && grid[i][j] == 1) { + count = 0; + bfs(grid, visited, i, j); // 将与其链接的陆地都标记上 true + result = max(result, count); + } + } + } + return result; + } +}; + +``` + diff --git "a/problems/kamacoder/0101.\345\255\244\345\262\233\347\232\204\346\200\273\351\235\242\347\247\257.md" "b/problems/kamacoder/0101.\345\255\244\345\262\233\347\232\204\346\200\273\351\235\242\347\247\257.md" new file mode 100644 index 0000000000..602fb97738 --- /dev/null +++ "b/problems/kamacoder/0101.\345\255\244\345\262\233\347\232\204\346\200\273\351\235\242\347\247\257.md" @@ -0,0 +1,180 @@ + +# 101. 孤岛的总面积 + +[卡码网题目链接(ACM模式)](https://kamacoder.com/problempage.php?pid=1173) + +题目描述 + +给定一个由 1(陆地)和 0(水)组成的矩阵,岛屿指的是由水平或垂直方向上相邻的陆地单元格组成的区域,且完全被水域单元格包围。孤岛是那些位于矩阵内部、所有单元格都不接触边缘的岛屿。 + + +现在你需要计算所有孤岛的总面积,岛屿面积的计算方式为组成岛屿的陆地的总数。 + +输入描述 + +第一行包含两个整数 N, M,表示矩阵的行数和列数。之后 N 行,每行包含 M 个数字,数字为 1 或者 0。 + +输出描述 + +输出一个整数,表示所有孤岛的总面积,如果不存在孤岛,则输出 0。 + +输入示例 + +``` +4 5 +1 1 0 0 0 +1 1 0 0 0 +0 0 1 0 0 +0 0 0 1 1 +``` + + +输出示例: + +1 + +提示信息: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240517105557.png) + +在矩阵中心部分的岛屿,因为没有任何一个单元格接触到矩阵边缘,所以该岛屿属于孤岛,总面积为 1。 + + +数据范围: + +1 <= M, N <= 50。 + +## 思路 + +本题使用dfs,bfs,并查集都是可以的。 + +本题要求找到不靠边的陆地面积,那么我们只要从周边找到陆地然后 通过 dfs或者bfs 将周边靠陆地且相邻的陆地都变成海洋,然后再去重新遍历地图 统计此时还剩下的陆地就可以了。 + +如图,在遍历地图周围四个边,靠地图四边的陆地,都为绿色, + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20220830104632.png) + +在遇到地图周边陆地的时候,将1都变为0,此时地图为这样: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20220830104651.png) + +然后我们再去遍历这个地图,遇到有陆地的地方,去采用深搜或者广搜,边统计所有陆地。 + +如果对深搜或者广搜不够了解,建议先看这里:[深度优先搜索精讲](https://programmercarl.com/kamacoder/图论深搜理论基础.html),[广度优先搜索精讲](https://programmercarl.com/kamacoder/图论广搜理论基础.html)。 + + +采用深度优先搜索的代码如下: + +```CPP +#include +#include +using namespace std; +int dir[4][2] = {-1, 0, 0, -1, 1, 0, 0, 1}; // 保存四个方向 +int count; // 统计符合题目要求的陆地空格数量 +void dfs(vector>& grid, int x, int y) { + grid[x][y] = 0; + count++; + for (int i = 0; i < 4; i++) { // 向四个方向遍历 + int nextx = x + dir[i][0]; + int nexty = y + dir[i][1]; + // 超过边界 + if (nextx < 0 || nextx >= grid.size() || nexty < 0 || nexty >= grid[0].size()) continue; + // 不符合条件,不继续遍历 + if (grid[nextx][nexty] == 0) continue; + + dfs (grid, nextx, nexty); + } + return; +} + +int main() { + int n, m; + cin >> n >> m; + vector> grid(n, vector(m, 0)); + for (int i = 0; i < n; i++) { + for (int j = 0; j < m; j++) { + cin >> grid[i][j]; + } + } + + // 从左侧边,和右侧边 向中间遍历 + for (int i = 0; i < n; i++) { + if (grid[i][0] == 1) dfs(grid, i, 0); + if (grid[i][m - 1] == 1) dfs(grid, i, m - 1); + } + // 从上边和下边 向中间遍历 + for (int j = 0; j < m; j++) { + if (grid[0][j] == 1) dfs(grid, 0, j); + if (grid[n - 1][j] == 1) dfs(grid, n - 1, j); + } + count = 0; + for (int i = 0; i < n; i++) { + for (int j = 0; j < m; j++) { + if (grid[i][j] == 1) dfs(grid, i, j); + } + } + cout << count << endl; +} +``` + +采用广度优先搜索的代码如下: + +```CPP +#include +#include +#include +using namespace std; +int count = 0; +int dir[4][2] = {0, 1, 1, 0, -1, 0, 0, -1}; // 四个方向 +void bfs(vector>& grid, int x, int y) { + queue> que; + que.push({x, y}); + grid[x][y] = 0; // 只要加入队列,立刻标记 + count++; + while(!que.empty()) { + pair cur = que.front(); que.pop(); + int curx = cur.first; + int cury = cur.second; + for (int i = 0; i < 4; i++) { + int nextx = curx + dir[i][0]; + int nexty = cury + dir[i][1]; + if (nextx < 0 || nextx >= grid.size() || nexty < 0 || nexty >= grid[0].size()) continue; // 越界了,直接跳过 + if (grid[nextx][nexty] == 1) { + que.push({nextx, nexty}); + count++; + grid[nextx][nexty] = 0; // 只要加入队列立刻标记 + } + } + } +} + +int main() { + int n, m; + cin >> n >> m; + vector> grid(n, vector(m, 0)); + for (int i = 0; i < n; i++) { + for (int j = 0; j < m; j++) { + cin >> grid[i][j]; + } + } + // 从左侧边,和右侧边 向中间遍历 + for (int i = 0; i < n; i++) { + if (grid[i][0] == 1) bfs(grid, i, 0); + if (grid[i][m - 1] == 1) bfs(grid, i, m - 1); + } + // 从上边和下边 向中间遍历 + for (int j = 0; j < m; j++) { + if (grid[0][j] == 1) bfs(grid, 0, j); + if (grid[n - 1][j] == 1) bfs(grid, n - 1, j); + } + count = 0; + for (int i = 0; i < n; i++) { + for (int j = 0; j < m; j++) { + if (grid[i][j] == 1) bfs(grid, i, j); + } + } + + cout << count << endl; +} +``` + diff --git "a/problems/kamacoder/0102.\346\262\211\346\262\241\345\255\244\345\262\233.md" "b/problems/kamacoder/0102.\346\262\211\346\262\241\345\255\244\345\262\233.md" new file mode 100644 index 0000000000..4c7491f716 --- /dev/null +++ "b/problems/kamacoder/0102.\346\262\211\346\262\241\345\255\244\345\262\233.md" @@ -0,0 +1,133 @@ + +# 102. 沉没孤岛 + +[卡码网题目链接(ACM模式)](https://kamacoder.com/problempage.php?pid=1174) + +题目描述: + +给定一个由 1(陆地)和 0(水)组成的矩阵,岛屿指的是由水平或垂直方向上相邻的陆地单元格组成的区域,且完全被水域单元格包围。孤岛是那些位于矩阵内部、所有单元格都不接触边缘的岛屿。 + + +现在你需要将所有孤岛“沉没”,即将孤岛中的所有陆地单元格(1)转变为水域单元格(0)。 + +输入描述: + +第一行包含两个整数 N, M,表示矩阵的行数和列数。 + +之后 N 行,每行包含 M 个数字,数字为 1 或者 0,表示岛屿的单元格。 + +输出描述 + +输出将孤岛“沉没”之后的岛屿矩阵。 + +输入示例: + +``` +4 5 +1 1 0 0 0 +1 1 0 0 0 +0 0 1 0 0 +0 0 0 1 1 +``` + +输出示例: + +``` +1 1 0 0 0 +1 1 0 0 0 +0 0 0 0 0 +0 0 0 1 1 +``` + +提示信息: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240517110932.png) + +将孤岛沉没: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240517110953.png) + +数据范围: + +1 <= M, N <= 50 + +## 思路 + +这道题目和[0101.孤岛的总面积](https://kamacoder.com/problempage.php?pid=1173)正好反过来了,[0101.孤岛的总面积](https://kamacoder.com/problempage.php?pid=1173)是求 地图中间的空格数,而本题是要把地图中间的 1 都改成 0 。 + +那么两题在思路上也是差不多的。 + +思路依然是从地图周边出发,将周边空格相邻的陆地都做上标记,然后在遍历一遍地图,遇到 陆地 且没做过标记的,那么都是地图中间的 陆地 ,全部改成水域就行。 + +有的录友可能想,我在定义一个 visited 二维数组,单独标记周边的陆地,然后遍历地图的时候同时对 数组board 和 数组visited 进行判断,决定 陆地是否变成水域。 + +这样做其实就有点麻烦了,不用额外定义空间了,标记周边的陆地,可以直接改陆地为其他特殊值作为标记。 + +步骤一:深搜或者广搜将地图周边的 1 (陆地)全部改成 2 (特殊标记) + +步骤二:将水域中间 1 (陆地)全部改成 水域(0) + +步骤三:将之前标记的 2 改为 1 (陆地) + +如图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240517113813.png) + +整体C++代码如下,以下使用dfs实现,其实遍历方式dfs,bfs都是可以的。 + +```CPP +#include +#include +using namespace std; +int dir[4][2] = {-1, 0, 0, -1, 1, 0, 0, 1}; // 保存四个方向 +void dfs(vector>& grid, int x, int y) { + grid[x][y] = 2; + for (int i = 0; i < 4; i++) { // 向四个方向遍历 + int nextx = x + dir[i][0]; + int nexty = y + dir[i][1]; + // 超过边界 + if (nextx < 0 || nextx >= grid.size() || nexty < 0 || nexty >= grid[0].size()) continue; + // 不符合条件,不继续遍历 + if (grid[nextx][nexty] == 0 || grid[nextx][nexty] == 2) continue; + dfs (grid, nextx, nexty); + } + return; +} + +int main() { + int n, m; + cin >> n >> m; + vector> grid(n, vector(m, 0)); + for (int i = 0; i < n; i++) { + for (int j = 0; j < m; j++) { + cin >> grid[i][j]; + } + } + + // 步骤一: + // 从左侧边,和右侧边 向中间遍历 + for (int i = 0; i < n; i++) { + if (grid[i][0] == 1) dfs(grid, i, 0); + if (grid[i][m - 1] == 1) dfs(grid, i, m - 1); + } + + // 从上边和下边 向中间遍历 + for (int j = 0; j < m; j++) { + if (grid[0][j] == 1) dfs(grid, 0, j); + if (grid[n - 1][j] == 1) dfs(grid, n - 1, j); + } + // 步骤二、步骤三 + for (int i = 0; i < n; i++) { + for (int j = 0; j < m; j++) { + if (grid[i][j] == 1) grid[i][j] = 0; + if (grid[i][j] == 2) grid[i][j] = 1; + } + } + for (int i = 0; i < n; i++) { + for (int j = 0; j < m; j++) { + cout << grid[i][j] << " "; + } + cout << endl; + } +} +``` diff --git "a/problems/kamacoder/0103.\346\260\264\346\265\201\351\227\256\351\242\230.md" "b/problems/kamacoder/0103.\346\260\264\346\265\201\351\227\256\351\242\230.md" new file mode 100644 index 0000000000..8f99beae1f --- /dev/null +++ "b/problems/kamacoder/0103.\346\260\264\346\265\201\351\227\256\351\242\230.md" @@ -0,0 +1,279 @@ + +# 103. 水流问题 + +[卡码网题目链接(ACM模式)](https://kamacoder.com/problempage.php?pid=1175) + +题目描述: + +现有一个 N × M 的矩阵,每个单元格包含一个数值,这个数值代表该位置的相对高度。矩阵的左边界和上边界被认为是第一组边界,而矩阵的右边界和下边界被视为第二组边界。 + + +矩阵模拟了一个地形,当雨水落在上面时,水会根据地形的倾斜向低处流动,但只能从较高或等高的地点流向较低或等高并且相邻(上下左右方向)的地点。我们的目标是确定那些单元格,从这些单元格出发的水可以达到第一组边界和第二组边界。 + +输入描述: + +第一行包含两个整数 N 和 M,分别表示矩阵的行数和列数。 + +后续 N 行,每行包含 M 个整数,表示矩阵中的每个单元格的高度。 + +输出描述: + +输出共有多行,每行输出两个整数,用一个空格隔开,表示可达第一组边界和第二组边界的单元格的坐标,输出顺序任意。 + +输入示例: + +``` +5 5 +1 3 1 2 4 +1 2 1 3 2 +2 4 7 2 1 +4 5 6 1 1 +1 4 1 2 1 +``` + +输出示例: + +``` +0 4 +1 3 +2 2 +3 0 +3 1 +3 2 +4 0 +4 1 +``` + +提示信息: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240517115816.png) + +图中的蓝色方块上的雨水既能流向第一组边界,也能流向第二组边界。所以最终答案为所有蓝色方块的坐标。 + + +数据范围: + +1 <= M, N <= 50 + +## 思路 + +一个比较直白的想法,其实就是 遍历每个点,然后看这个点 能不能同时到达第一组边界和第二组边界。 + +至于遍历方式,可以用dfs,也可以用bfs,以下用dfs来举例。 + +那么这种思路的实现代码如下: + +```CPP +#include +#include +using namespace std; +int n, m; +int dir[4][2] = {-1, 0, 0, -1, 1, 0, 0, 1}; + +// 从 x,y 出发 把可以走的地方都标记上 +void dfs(vector>& grid, vector>& visited, int x, int y) { + if (visited[x][y]) return; + + visited[x][y] = true; + + for (int i = 0; i < 4; i++) { + int nextx = x + dir[i][0]; + int nexty = y + dir[i][1]; + if (nextx < 0 || nextx >= n || nexty < 0 || nexty >= m) continue; + if (grid[x][y] < grid[nextx][nexty]) continue; // 高度不合适 + + dfs (grid, visited, nextx, nexty); + } + return; +} +bool isResult(vector>& grid, int x, int y) { + vector> visited(n, vector(m, false)); + + // 深搜,将x,y出发 能到的节点都标记上。 + dfs(grid, visited, x, y); + bool isFirst = false; + bool isSecond = false; + + // 以下就是判断x,y出发,是否到达第一组边界和第二组边界 + // 第一边界的上边 + for (int j = 0; j < m; j++) { + if (visited[0][j]) { + isFirst = true; + break; + } + } + // 第一边界的左边 + for (int i = 0; i < n; i++) { + if (visited[i][0]) { + isFirst = true; + break; + } + } + // 第二边界右边 + for (int j = 0; j < m; j++) { + if (visited[n - 1][j]) { + isSecond = true; + break; + } + } + // 第二边界下边 + for (int i = 0; i < n; i++) { + if (visited[i][m - 1]) { + isSecond = true; + break; + } + } + if (isFirst && isSecond) return true; + return false; +} + + +int main() { + cin >> n >> m; + vector> grid(n, vector(m, 0)); + for (int i = 0; i < n; i++) { + for (int j = 0; j < m; j++) { + cin >> grid[i][j]; + } + } + // 遍历每一个点,看是否能同时到达第一组边界和第二组边界 + for (int i = 0; i < n; i++) { + for (int j = 0; j < m; j++) { + if (isResult(grid, i, j)) { + cout << i << " " << j << endl; + } + } + } +} + +``` + +这种思路很直白,但很明显,以上代码超时了。 来看看时间复杂度。 + +遍历每一个节点,是 m * n,遍历每一个节点的时候,都要做深搜,深搜的时间复杂度是: m * n + +那么整体时间复杂度 就是 O(m^2 * n^2) ,这是一个四次方的时间复杂度。 + +## 优化 + +那么我们可以 反过来想,从第一组边界上的节点 逆流而上,将遍历过的节点都标记上。 + +同样从第二组边界的边上节点 逆流而上,将遍历过的节点也标记上。 + +然后**两方都标记过的节点就是既可以流太平洋也可以流大西洋的节点**。 + +从第一组边界边上节点出发,如图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240522120036.png) + + +从第二组边界上节点出发,如图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240522120122.png) + +按照这样的逻辑,就可以写出如下遍历代码:(详细注释) + + +```CPP +#include +#include +using namespace std; +int n, m; +int dir[4][2] = {-1, 0, 0, -1, 1, 0, 0, 1}; +void dfs(vector>& grid, vector>& visited, int x, int y) { + if (visited[x][y]) return; + + visited[x][y] = true; + + for (int i = 0; i < 4; i++) { + int nextx = x + dir[i][0]; + int nexty = y + dir[i][1]; + if (nextx < 0 || nextx >= n || nexty < 0 || nexty >= m) continue; + if (grid[x][y] > grid[nextx][nexty]) continue; // 注意:这里是从低向高遍历 + + dfs (grid, visited, nextx, nexty); + } + return; +} + + + +int main() { + + cin >> n >> m; + vector> grid(n, vector(m, 0)); + + for (int i = 0; i < n; i++) { + for (int j = 0; j < m; j++) { + cin >> grid[i][j]; + } + } + // 标记从第一组边界上的节点出发,可以遍历的节点 + vector> firstBorder(n, vector(m, false)); + + // 标记从第一组边界上的节点出发,可以遍历的节点 + vector> secondBorder(n, vector(m, false)); + + // 从最上和最下行的节点出发,向高处遍历 + for (int i = 0; i < n; i++) { + dfs (grid, firstBorder, i, 0); // 遍历最左列,接触第一组边界 + dfs (grid, secondBorder, i, m - 1); // 遍历最右列,接触第二组边界 + } + + // 从最左和最右列的节点出发,向高处遍历 + for (int j = 0; j < m; j++) { + dfs (grid, firstBorder, 0, j); // 遍历最上行,接触第一组边界 + dfs (grid, secondBorder, n - 1, j); // 遍历最下行,接触第二组边界 + } + for (int i = 0; i < n; i++) { + for (int j = 0; j < m; j++) { + // 如果这个节点,从第一组边界和第二组边界出发都遍历过,就是结果 + if (firstBorder[i][j] && secondBorder[i][j]) cout << i << " " << j << endl;; + } + } + + +} + +``` + + +时间复杂度分析, 关于dfs函数搜索的过程 时间复杂度是 O(n * m),这个大家比较容易想。 + +关键看主函数,那么每次dfs的时候,上面还是有for循环的。 + +第一个for循环,时间复杂度是:n * (n * m) 。 + +第二个for循环,时间复杂度是:m * (n * m)。 + +所以本题看起来 时间复杂度好像是 : n * (n * m) + m * (n * m) = (m * n) * (m + n) 。 + +其实这是一个误区,大家再自己看 dfs函数的实现,其实 有visited函数记录 走过的节点,而走过的节点是不会再走第二次的。 + +所以 调用dfs函数,**只要参数传入的是 数组 firstBorder,那么地图中 每一个节点其实就遍历一次,无论你调用多少次**。 + +同理,调用dfs函数,只要 参数传入的是 数组 secondBorder,地图中每个节点也只会遍历一次。 + +所以,以下这段代码的时间复杂度是 2 * n * m。 地图用每个节点就遍历了两次,参数传入 firstBorder 的时候遍历一次,参数传入 secondBorder 的时候遍历一次。 + +```CPP +// 从最上和最下行的节点出发,向高处遍历 +for (int i = 0; i < n; i++) { + dfs (grid, firstBorder, i, 0); // 遍历最左列,接触第一组边界 + dfs (grid, secondBorder, i, m - 1); // 遍历最右列,接触第二组边界 +} + +// 从最左和最右列的节点出发,向高处遍历 +for (int j = 0; j < m; j++) { + dfs (grid, firstBorder, 0, j); // 遍历最上行,接触第一组边界 + dfs (grid, secondBorder, n - 1, j); // 遍历最下行,接触第二组边界 +} +``` + +那么本题整体的时间复杂度其实是: 2 * n * m + n * m ,所以最终时间复杂度为 O(n * m) 。 + +空间复杂度为:O(n * m) 这个就不难理解了。开了几个 n * m 的数组。 + + + + diff --git "a/problems/kamacoder/0104.\345\273\272\351\200\240\346\234\200\345\244\247\345\262\233\345\261\277.md" "b/problems/kamacoder/0104.\345\273\272\351\200\240\346\234\200\345\244\247\345\262\233\345\261\277.md" new file mode 100644 index 0000000000..927b20b2d3 --- /dev/null +++ "b/problems/kamacoder/0104.\345\273\272\351\200\240\346\234\200\345\244\247\345\262\233\345\261\277.md" @@ -0,0 +1,254 @@ + +# 104.建造最大岛屿 + +[卡码网题目链接(ACM模式)](https://kamacoder.com/problempage.php?pid=1176) + +题目描述: + +给定一个由 1(陆地)和 0(水)组成的矩阵,你最多可以将矩阵中的一格水变为一块陆地,在执行了此操作之后,矩阵中最大的岛屿面积是多少。 + +岛屿面积的计算方式为组成岛屿的陆地的总数。岛屿是被水包围,并且通过水平方向或垂直方向上相邻的陆地连接而成的。你可以假设矩阵外均被水包围。 + +输入描述: + +第一行包含两个整数 N, M,表示矩阵的行数和列数。之后 N 行,每行包含 M 个数字,数字为 1 或者 0,表示岛屿的单元格。 + +输出描述: + +输出一个整数,表示最大的岛屿面积。如果矩阵中不存在岛屿,则输出 0。 + +输入示例: + +``` +4 5 +1 1 0 0 0 +1 1 0 0 0 +0 0 1 0 0 +0 0 0 1 1 +``` + +输出示例 + +6 + +提示信息 + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240522154055.png) + + +对于上面的案例,有两个位置可将 0 变成 1,使得岛屿的面积最大,即 6。 + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240522154110.png) + + +数据范围: + +1 <= M, N <= 50。 + + +## 思路 + +本题的一个暴力想法,应该是遍历地图尝试 将每一个 0 改成1,然后去搜索地图中的最大的岛屿面积。 + +计算地图的最大面积:遍历地图 + 深搜岛屿,时间复杂度为 n * n。 + +(其实使用深搜还是广搜都是可以的,其目的就是遍历岛屿做一个标记,相当于染色,那么使用哪个遍历方式都行,以下我用深搜来讲解) + +每改变一个0的方格,都需要重新计算一个地图的最大面积,所以 整体时间复杂度为:n^4。 + +## 优化思路 + +其实每次深搜遍历计算最大岛屿面积,我们都做了很多重复的工作。 + +只要用一次深搜把每个岛屿的面积记录下来就好。 + +第一步:一次遍历地图,得出各个岛屿的面积,并做编号记录。可以使用map记录,key为岛屿编号,value为岛屿面积 + +第二步:再遍历地图,遍历0的方格(因为要将0变成1),并统计该1(由0变成的1)周边岛屿面积,将其相邻面积相加在一起,遍历所有 0 之后,就可以得出 选一个0变成1 之后的最大面积。 + +拿如下地图的岛屿情况来举例: (1为陆地) + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20220829104834.png) + +第一步,则遍历题目,并将岛屿到编号和面积上的统计,过程如图所示: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20220829105644.png) + + +本过程代码如下: + +```CPP +int dir[4][2] = {0, 1, 1, 0, -1, 0, 0, -1}; // 四个方向 +void dfs(vector>& grid, vector>& visited, int x, int y, int mark) { + if (visited[x][y] || grid[x][y] == 0) return; // 终止条件:访问过的节点 或者 遇到海水 + visited[x][y] = true; // 标记访问过 + grid[x][y] = mark; // 给陆地标记新标签 + count++; + for (int i = 0; i < 4; i++) { + int nextx = x + dir[i][0]; + int nexty = y + dir[i][1]; + if (nextx < 0 || nextx >= grid.size() || nexty < 0 || nexty >= grid[0].size()) continue; // 越界了,直接跳过 + dfs(grid, visited, nextx, nexty, mark); + } +} + +int largestIsland(vector>& grid) { + int n = grid.size(), m = grid[0].size(); + vector> visited = vector>(n, vector(m, false)); // 标记访问过的点 + unordered_map gridNum; + int mark = 2; // 记录每个岛屿的编号 + bool isAllGrid = true; // 标记是否整个地图都是陆地 + for (int i = 0; i < n; i++) { + for (int j = 0; j < m; j++) { + if (grid[i][j] == 0) isAllGrid = false; + if (!visited[i][j] && grid[i][j] == 1) { + count = 0; + dfs(grid, visited, i, j, mark); // 将与其链接的陆地都标记上 true + gridNum[mark] = count; // 记录每一个岛屿的面积 + mark++; // 记录下一个岛屿编号 + } + } + } +} +``` + + +这个过程时间复杂度 n * n 。可能有录友想:分明是两个for循环下面套这一个dfs,时间复杂度怎么回事 n * n呢? + +其实大家可以仔细看一下代码,**n * n这个方格地图中,每个节点我们就遍历一次,并不会重复遍历**。 + +第二步过程如图所示: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20220829105249.png) + +也就是遍历每一个0的方格,并统计其相邻岛屿面积,最后取一个最大值。 + +这个过程的时间复杂度也为 n * n。 + +所以整个解法的时间复杂度,为 n * n + n * n 也就是 n^2。 + +当然这里还有一个优化的点,就是 可以不用 visited数组,因为有mark来标记,所以遍历过的grid[i][j]是不等于1的。 + +代码如下: + +```CPP +int dir[4][2] = {0, 1, 1, 0, -1, 0, 0, -1}; // 四个方向 +void dfs(vector>& grid, int x, int y, int mark) { + if (grid[x][y] != 1 || grid[x][y] == 0) return; // 终止条件:访问过的节点 或者 遇到海水 + grid[x][y] = mark; // 给陆地标记新标签 + count++; + for (int i = 0; i < 4; i++) { + int nextx = x + dir[i][0]; + int nexty = y + dir[i][1]; + if (nextx < 0 || nextx >= n || nexty < 0 || nexty >= m) continue; // 越界了,直接跳过 + dfs(grid, nextx, nexty, mark); + } +} + +int main() { + cin >> n >> m; + vector> grid(n, vector(m, 0)); + + for (int i = 0; i < n; i++) { + for (int j = 0; j < m; j++) { + cin >> grid[i][j]; + } + } + unordered_map gridNum; + int mark = 2; // 记录每个岛屿的编号 + bool isAllGrid = true; // 标记是否整个地图都是陆地 + for (int i = 0; i < n; i++) { + for (int j = 0; j < m; j++) { + if (grid[i][j] == 0) isAllGrid = false; + if (grid[i][j] == 1) { + count = 0; + dfs(grid, i, j, mark); // 将与其链接的陆地都标记上 true + gridNum[mark] = count; // 记录每一个岛屿的面积 + mark++; // 记录下一个岛屿编号 + } + } + } +``` + +不过为了让各个变量各司其事,代码清晰一些,完整代码还是使用visited数组来标记。 + +最后,整体代码如下: + +```CPP +#include +#include +#include +#include +using namespace std; +int n, m; +int count; + +int dir[4][2] = {0, 1, 1, 0, -1, 0, 0, -1}; // 四个方向 +void dfs(vector>& grid, vector>& visited, int x, int y, int mark) { + if (visited[x][y] || grid[x][y] == 0) return; // 终止条件:访问过的节点 或者 遇到海水 + visited[x][y] = true; // 标记访问过 + grid[x][y] = mark; // 给陆地标记新标签 + count++; + for (int i = 0; i < 4; i++) { + int nextx = x + dir[i][0]; + int nexty = y + dir[i][1]; + if (nextx < 0 || nextx >= n || nexty < 0 || nexty >= m) continue; // 越界了,直接跳过 + dfs(grid, visited, nextx, nexty, mark); + } +} + +int main() { + cin >> n >> m; + vector> grid(n, vector(m, 0)); + + for (int i = 0; i < n; i++) { + for (int j = 0; j < m; j++) { + cin >> grid[i][j]; + } + } + vector> visited(n, vector(m, false)); // 标记访问过的点 + unordered_map gridNum; + int mark = 2; // 记录每个岛屿的编号 + bool isAllGrid = true; // 标记是否整个地图都是陆地 + for (int i = 0; i < n; i++) { + for (int j = 0; j < m; j++) { + if (grid[i][j] == 0) isAllGrid = false; + if (!visited[i][j] && grid[i][j] == 1) { + count = 0; + dfs(grid, visited, i, j, mark); // 将与其链接的陆地都标记上 true + gridNum[mark] = count; // 记录每一个岛屿的面积 + mark++; // 记录下一个岛屿编号 + } + } + } + if (isAllGrid) { + cout << n * m << endl; // 如果都是陆地,返回全面积 + return 0; // 结束程序 + } + + // 以下逻辑是根据添加陆地的位置,计算周边岛屿面积之和 + int result = 0; // 记录最后结果 + unordered_set visitedGrid; // 标记访问过的岛屿 + for (int i = 0; i < n; i++) { + for (int j = 0; j < m; j++) { + count = 1; // 记录连接之后的岛屿数量 + visitedGrid.clear(); // 每次使用时,清空 + if (grid[i][j] == 0) { + for (int k = 0; k < 4; k++) { + int neari = i + dir[k][1]; // 计算相邻坐标 + int nearj = j + dir[k][0]; + if (neari < 0 || neari >= n || nearj < 0 || nearj >= m) continue; + if (visitedGrid.count(grid[neari][nearj])) continue; // 添加过的岛屿不要重复添加 + // 把相邻四面的岛屿数量加起来 + count += gridNum[grid[neari][nearj]]; + visitedGrid.insert(grid[neari][nearj]); // 标记该岛屿已经添加过 + } + } + result = max(result, count); + } + } + cout << result << endl; + +} +``` + diff --git "a/problems/kamacoder/0105.\346\234\211\345\220\221\345\233\276\347\232\204\345\256\214\345\205\250\345\217\257\350\276\276\346\200\247.md" "b/problems/kamacoder/0105.\346\234\211\345\220\221\345\233\276\347\232\204\345\256\214\345\205\250\345\217\257\350\276\276\346\200\247.md" new file mode 100644 index 0000000000..81f4f6f0ac --- /dev/null +++ "b/problems/kamacoder/0105.\346\234\211\345\220\221\345\233\276\347\232\204\345\256\214\345\205\250\345\217\257\350\276\276\346\200\247.md" @@ -0,0 +1,284 @@ + +# 105.有向图的完全可达性 + +[卡码网题目链接(ACM模式)](https://kamacoder.com/problempage.php?pid=1177) + +【题目描述】 + +给定一个有向图,包含 N 个节点,节点编号分别为 1,2,...,N。现从 1 号节点开始,如果可以从 1 号节点的边可以到达任何节点,则输出 1,否则输出 -1。 + +【输入描述】 + +第一行包含两个正整数,表示节点数量 N 和边的数量 K。 后续 K 行,每行两个正整数 s 和 t,表示从 s 节点有一条边单向连接到 t 节点。 + +【输出描述】 + +如果可以从 1 号节点的边可以到达任何节点,则输出 1,否则输出 -1。 + +【输入示例】 + +``` +4 4 +1 2 +2 1 +1 3 +3 4 +``` + +【输出示例】 + +1 + +【提示信息】 + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240522174707.png) + +从 1 号节点可以到达任意节点,输出 1。 + +数据范围: + +* 1 <= N <= 100; +* 1 <= K <= 2000。 + +## 思路 + +本题给我们是一个有向图, 意识到这是有向图很重要! + +接下来我们再画一个图,从图里可以直观看出来,节点6 是 不能到达节点1 的 + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240522175451.png) + +这就很容易让我们想起岛屿问题,只要发现独立的岛,就是不可到达的。 + +**但本题是有向图**,在有向图中,即使所有节点都是链接的,但依然不可能从0出发遍历所有边。 + +例如上图中,节点1 可以到达节点2,但节点2是不能到达节点1的。 + +所以本题是一个**有向图搜索全路径的问题**。 只能用深搜(DFS)或者广搜(BFS)来搜。 + +**以下dfs分析 大家一定要仔细看,本题有两种dfs的解法,很多题解没有讲清楚**。 看完之后 相信你对dfs会有更深的理解。 + +深搜三部曲: + +1. 确认递归函数,参数 + +需要传入地图,需要知道当前我们拿到的key,以至于去下一个房间。 + +同时还需要一个数组,用来记录我们都走过了哪些房间,这样好知道最后有没有把所有房间都遍历的,可以定义一个一维数组。 + +所以 递归函数参数如下: + +```C++ +// key 当前得到的可以 +// visited 记录访问过的房间 +void dfs(const vector>& graph, int key, vector& visited) { +``` + +2. 确认终止条件 + +遍历的时候,什么时候终止呢? + +这里有一个很重要的逻辑,就是在递归中,**我们是处理当前访问的节点,还是处理下一个要访问的节点**。 + +这决定 终止条件怎么写。 + +首先明确,本题中什么叫做处理,就是 visited数组来记录访问过的节点,该节点默认 数组里元素都是false,把元素标记为true就是处理 本节点了。 + +如果我们是处理当前访问的节点,当前访问的节点如果是 true ,说明是访问过的节点,那就终止本层递归,如果不是true,我们就把它赋值为true,因为这是我们处理本层递归的节点。 + +代码就是这样: + +```C++ +// 写法一:处理当前访问的节点 +void dfs(const vector>& graph, int key, vector& visited) { + if (visited[key]) { + return; + } + visited[key] = true; + list keys = graph[key]; + for (int key : keys) { + // 深度优先搜索遍历 + dfs(graph, key, visited); + } +} +``` + +如果我们是处理下一层访问的节点,而不是当前层。那么就要在 深搜三部曲中第三步:处理目前搜索节点出发的路径的时候对 节点进行处理。 + +这样的话,就不需要终止条件,而是在 搜索下一个节点的时候,直接判断 下一个节点是否是我们要搜的节点。 + +代码就是这样的: + +```C++ +// 写法二:处理下一个要访问的节点 +void dfs(const vector>& graph, int key, vector& visited) { + list keys = rooms[key]; + for (int key : keys) { + if (visited[key] == false) { // 确认下一个是没访问过的节点 + visited[key] = true; + dfs(rooms, key, visited); + } + } +} +``` + +可以看出,**如何看待 我们要访问的节点,直接决定了两种不一样的写法**,很多录友对这一块很模糊,可能做过这道题,但没有思考到这个维度上。 + + +3. 处理目前搜索节点出发的路径 + +其实在上面,深搜三部曲 第二部,就已经讲了,因为终止条件的两种写法, 直接决定了两种不一样的递归写法。 + +这里还有细节: + +看上面两个版本的写法中, 好像没有发现回溯的逻辑。 + +我们都知道,有递归就有回溯,回溯就在递归函数的下面, 那么之前我们做的dfs题目,都需要回溯操作,例如:[0098.所有可达路径](./0098.所有可达路径), **为什么本题就没有回溯呢?** + +代码中可以看到dfs函数下面并没有回溯的操作。 + +此时就要在思考本题的要求了,本题是需要判断 1节点 是否能到所有节点,那么我们就没有必要回溯去撤销操作了,只要遍历过的节点一律都标记上。 + +**那什么时候需要回溯操作呢?** + +当我们需要搜索一条可行路径的时候,就需要回溯操作了,因为没有回溯,就没法“调头”, 如果不理解的话,去看我写的 [0098.所有可达路径](./0098.所有可达路径.md) 的题解。 + + +以上分析完毕,DFS整体实现C++代码如下: + +```CPP +// 写法一:dfs 处理当前访问的节点 +#include +#include +#include +using namespace std; + +void dfs(const vector>& graph, int key, vector& visited) { + if (visited[key]) { + return; + } + visited[key] = true; + list keys = graph[key]; + for (int key : keys) { + // 深度优先搜索遍历 + dfs(graph, key, visited); + } +} + +int main() { + int n, m, s, t; + cin >> n >> m; + + // 节点编号从1到n,所以申请 n+1 这么大的数组 + vector> graph(n + 1); // 邻接表 + while (m--) { + cin >> s >> t; + // 使用邻接表 ,表示 s -> t 是相连的 + graph[s].push_back(t); + } + vector visited(n + 1, false); + dfs(graph, 1, visited); + //检查是否都访问到了 + for (int i = 1; i <= n; i++) { + if (visited[i] == false) { + cout << -1 << endl; + return 0; + } + } + cout << 1 << endl; +} + +``` + +**第二种写法注意有注释的地方是和写法一的区别** + +```c++ +写法二:dfs处理下一个要访问的节点 +#include +#include +#include +using namespace std; + +void dfs(const vector>& graph, int key, vector& visited) { + list keys = rooms[key]; + for (int key : keys) { + if (visited[key] == false) { // 确认下一个是没访问过的节点 + visited[key] = true; + dfs(rooms, key, visited); + } + } +} + +int main() { + int n, m, s, t; + cin >> n >> m; + + vector> graph(n + 1); + while (m--) { + cin >> s >> t; + graph[s].push_back(t); + + } + vector visited(n + 1, false); + + visited[0] = true; // 节点1 预先处理 + dfs(graph, 1, visited); + + for (int i = 1; i <= n; i++) { + if (visited[i] == false) { + cout << -1 << endl; + return 0; + } + } + cout << 1 << endl; +} + +``` + +本题我也给出 BFS C++代码,[BFS理论基础](https://programmercarl.com/kamacoder/%E5%9B%BE%E8%AE%BA%E6%B7%B1%E6%90%9C%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html),代码如下: + +```CPP +#include +#include +#include +#include +using namespace std; + +int main() { + int n, m, s, t; + cin >> n >> m; + + vector> graph(n + 1); + while (m--) { + cin >> s >> t; + graph[s].push_back(t); + + } + vector visited(n + 1, false); + visited[1] = true; // 1 号房间开始 + queue que; + que.push(1); // 1 号房间开始 + + // 广度优先搜索的过程 + while (!que.empty()) { + int key = que.front(); que.pop(); + list keys = graph[key]; + for (int key : keys) { + if (!visited[key]) { + que.push(key); + visited[key] = true; + } + } + } + + for (int i = 1; i <= n; i++) { + if (visited[i] == false) { + cout << -1 << endl; + return 0; + } + } + cout << 1 << endl; +} + +``` + diff --git "a/problems/kamacoder/0106.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" "b/problems/kamacoder/0106.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" new file mode 100644 index 0000000000..4a81922d43 --- /dev/null +++ "b/problems/kamacoder/0106.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" @@ -0,0 +1,154 @@ + +# 106. 岛屿的周长 + +题目描述 + +给定一个由 1(陆地)和 0(水)组成的矩阵,岛屿是被水包围,并且通过水平方向或垂直方向上相邻的陆地连接而成的。 + + +你可以假设矩阵外均被水包围。在矩阵中恰好拥有一个岛屿,假设组成岛屿的陆地边长都为 1,请计算岛屿的周长。岛屿内部没有水域。 + +输入描述 + +第一行包含两个整数 N, M,表示矩阵的行数和列数。之后 N 行,每行包含 M 个数字,数字为 1 或者 0,表示岛屿的单元格。 + +输出描述 + +输出一个整数,表示岛屿的周长。 + +输入示例 + +``` +5 5 +0 0 0 0 0 +0 1 0 1 0 +0 1 1 1 0 +0 1 1 1 0 +0 0 0 0 0 +``` + +输出示例 + +14 + +提示信息 + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240524115244.png) + +岛屿的周长为 14。 + +数据范围: + +1 <= M, N <= 50。 + +## 思路 + +岛屿问题最容易让人想到BFS或者DFS,但本题确实还用不上。 + +为了避免大家惯性思维,所以给大家安排了这道题目。 + +### 解法一: + +遍历每一个空格,遇到岛屿则计算其上下左右的空格情况。 + +如果该陆地上下左右的空格是有水域,则说明是一条边,如图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240524115933.png) + +陆地的右边空格是水域,则说明找到一条边。 + + +如果该陆地上下左右的空格出界了,则说明是一条边,如图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240524120105.png) + +该录友的下边空格出界了,则说明找到一条边。 + + +C++代码如下:(详细注释) + +```CPP +#include +#include +using namespace std; +int main() { + int n, m; + cin >> n >> m; + vector> grid(n, vector(m, 0)); + for (int i = 0; i < n; i++) { + for (int j = 0; j < m; j++) { + cin >> grid[i][j]; + } + } + int direction[4][2] = {0, 1, 1, 0, -1, 0, 0, -1}; + int result = 0; + for (int i = 0; i < n; i++) { + for (int j = 0; j < m; j++) { + if (grid[i][j] == 1) { + for (int k = 0; k < 4; k++) { // 上下左右四个方向 + int x = i + direction[k][0]; + int y = j + direction[k][1]; // 计算周边坐标x,y + if (x < 0 // x在边界上 + || x >= grid.size() // x在边界上 + || y < 0 // y在边界上 + || y >= grid[0].size() // y在边界上 + || grid[x][y] == 0) { // x,y位置是水域 + result++; + } + } + } + } + } + cout << result << endl; + +} +``` + +### 解法二: + +计算出总的岛屿数量,总的变数为:岛屿数量 * 4 + +因为有一对相邻两个陆地,边的总数就要减2,如图,有两个陆地相邻,总变数就要减2 + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240524120855.png) + + +那么只需要在计算出相邻岛屿的数量就可以了,相邻岛屿数量为cover。 + +结果 result = 岛屿数量 * 4 - cover * 2; + + +C++代码如下:(详细注释) + +```CPP +#include +#include +using namespace std; +int main() { + int n, m; + cin >> n >> m; + vector> grid(n, vector(m, 0)); + for (int i = 0; i < n; i++) { + for (int j = 0; j < m; j++) { + cin >> grid[i][j]; + } + } + int sum = 0; // 陆地数量 + int cover = 0; // 相邻数量 + for (int i = 0; i < n; i++) { + for (int j = 0; j < m; j++) { + if (grid[i][j] == 1) { + sum++; // 统计总的陆地数量 + // 统计上边相邻陆地 + if(i - 1 >= 0 && grid[i - 1][j] == 1) cover++; + // 统计左边相邻陆地 + if(j - 1 >= 0 && grid[i][j - 1] == 1) cover++; + // 为什么没统计下边和右边? 因为避免重复计算 + } + } + } + + cout << sum * 4 - cover * 2 << endl; + +} +``` diff --git "a/problems/kamacoder/\345\233\276\350\256\272\346\200\273\347\273\223\347\257\207.md" "b/problems/kamacoder/\345\233\276\350\256\272\346\200\273\347\273\223\347\257\207.md" index 92b3581d53..65816bb1ec 100644 --- "a/problems/kamacoder/\345\233\276\350\256\272\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/kamacoder/\345\233\276\350\256\272\346\200\273\347\273\223\347\257\207.md" @@ -5,6 +5,12 @@ 至此算上本篇,一共30篇文章,图论之旅就在此收官了。 +在[0098.所有可达路径](./0098.所有可达路径.md) ,我们接触了两种图的存储方式,邻接表和邻接矩阵,数量掌握两种图的存储方式很重要。 + +这也是大家习惯在核心代码模式下刷题 经常忽略的 知识点。因为在力扣上刷题不需要掌握图的存储方式。 + + + ## 深搜与广搜 @@ -14,11 +20,30 @@ * 代码模板:需要熟练掌握深搜和广搜的基本写法。 * 应用场景:图论题目基本上可以即用深搜也可以广搜,无疑是用哪个方便而已 -深搜注意事项 同样是深搜模板题,会有两种写法, -广搜注意事项 + +在[0099.岛屿的数量深搜.md](./0099.岛屿的数量深搜.md) 和 [0105.有向图的完全可达性](./0105.有向图的完全可达性.md),涉及到dfs的两种写法。 + +我们对dfs函数的定义是 是处理当前节点 还是处理下一个节点 很重要,决定了两种dfs的写法。 + +这也是为什么很多录友看到不同的dfs写法,结果发现提交都能过的原因。 + +而深搜还有细节,有的深搜题目需要回溯,有的就不用回溯, + +需要计算路径的问题,一般需要回溯,如果只是染色问题 就不需要回溯。 + +例如: [0105.有向图的完全可达性](./0105.有向图的完全可达性.md) 深搜就不需要回溯,而 [0098.所有可达路径](./0098.所有可达路径.md) 中的递归就需要回溯,文章中都有详细讲解 + + + +注意:以上说的是不需要回溯,不是没有回溯,只要有递归就会有回溯,只是我们是否需要用到回溯这个过程 才是要考虑的 + + +广搜注意事项,很多录友写广搜超时了。 + +深搜和广搜是图论的基础,也有很多变形,我在图论里用最大岛屿问题,讲了很多 ## 并查集 From 6ef77329949055714d0d263ff762e898ac38233d Mon Sep 17 00:00:00 2001 From: Nicolas Leigh Date: Sun, 26 May 2024 11:07:12 +0800 Subject: [PATCH 2649/3019] =?UTF-8?q?Add=20JavaScript=20solution=20to=20th?= =?UTF-8?q?e=20problem=201020.=E9=A3=9E=E5=9C=B0=E7=9A=84=E6=95=B0?= =?UTF-8?q?=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...60\347\232\204\346\225\260\351\207\217.md" | 58 +++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git "a/problems/1020.\351\243\236\345\234\260\347\232\204\346\225\260\351\207\217.md" "b/problems/1020.\351\243\236\345\234\260\347\232\204\346\225\260\351\207\217.md" index 59610c6801..5f1995a5ce 100644 --- "a/problems/1020.\351\243\236\345\234\260\347\232\204\346\225\260\351\207\217.md" +++ "b/problems/1020.\351\243\236\345\234\260\347\232\204\346\225\260\351\207\217.md" @@ -605,6 +605,63 @@ func bfs(grid [][]int, i, j int) { } ``` +### JavaScript + +```js +/** + * @param {number[][]} grid + * @return {number} + */ +var numEnclaves = function (grid) { + let row = grid.length; + let col = grid[0].length; + let count = 0; + + // Check the first and last row, if there is a 1, then change all the connected 1s to 0 and don't count them. + for (let j = 0; j < col; j++) { + if (grid[0][j] === 1) { + dfs(0, j, false); + } + if (grid[row - 1][j] === 1) { + dfs(row - 1, j, false); + } + } + + // Check the first and last column, if there is a 1, then change all the connected 1s to 0 and don't count them. + for (let i = 0; i < row; i++) { + if (grid[i][0] === 1) { + dfs(i, 0, false); + } + if (grid[i][col - 1] === 1) { + dfs(i, col - 1, false); + } + } + + // Check the rest of the grid, if there is a 1, then change all the connected 1s to 0 and count them. + for (let i = 1; i < row - 1; i++) { + for (let j = 1; j < col - 1; j++) { + dfs(i, j, true); + } + } + + function dfs(i, j, isCounting) { + let condition = i < 0 || i >= grid.length || j < 0 || j >= grid[0].length || grid[i][j] === 0; + + if (condition) return; + if (isCounting) count++; + + grid[i][j] = 0; + + dfs(i - 1, j, isCounting); + dfs(i + 1, j, isCounting); + dfs(i, j - 1, isCounting); + dfs(i, j + 1, isCounting); + } + + return count; +}; +``` + ### Rust dfs: @@ -700,3 +757,4 @@ impl Solution { + From e3e96203b74e036492d6c2984ca8d82344b9f585 Mon Sep 17 00:00:00 2001 From: liao junwu Date: Sun, 26 May 2024 11:31:28 +0800 Subject: [PATCH 2650/3019] [0018 fourSum]add C version add C version for 0018: fourSum problem Signed-off-by: liao junwu --- ...33\346\225\260\344\271\213\345\222\214.md" | 90 +++++++++++++++++++ 1 file changed, 90 insertions(+) diff --git "a/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" "b/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" index 89bc2a8bf5..9c8bb4fe24 100644 --- "a/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" @@ -151,6 +151,96 @@ if (nums[k] + nums[i] > target && nums[i] >= 0) { ## 其他语言版本 +### C: + +```C +/* qsort */ +static int cmp(const void* arg1, const void* arg2) { + int a = *(int *)arg1; + int b = *(int *)arg2; + return (a > b); +} + +int** fourSum(int* nums, int numsSize, int target, int* returnSize, int** returnColumnSizes) { + + /* 对nums数组进行排序 */ + qsort(nums, numsSize, sizeof(int), cmp); + + int **res = (int **)malloc(sizeof(int *) * 40000); + int index = 0; + + /* k */ + for (int k = 0; k < numsSize - 3; k++) { /* 第一级 */ + + /* k剪枝 */ + if ((nums[k] > target) && (nums[k] >= 0)) { + break; + } + /* k去重 */ + if ((k > 0) && (nums[k] == nums[k - 1])) { + continue; + } + + /* i */ + for (int i = k + 1; i < numsSize - 2; i++) { /* 第二级 */ + + /* i剪枝 */ + if ((nums[k] + nums[i] > target) && (nums[i] >= 0)) { + break; + } + /* i去重 */ + if ((i > (k + 1)) && (nums[i] == nums[i - 1])) { + continue; + } + + /* left and right */ + int left = i + 1; + int right = numsSize - 1; + + while (left < right) { + + /* 防止大数溢出 */ + long long val = (long long)nums[k] + nums[i] + nums[left] + nums[right]; + if (val > target) { + right--; + } else if (val < target) { + left++; + } else { + int *res_tmp = (int *)malloc(sizeof(int) * 4); + res_tmp[0] = nums[k]; + res_tmp[1] = nums[i]; + res_tmp[2] = nums[left]; + res_tmp[3] = nums[right]; + res[index++] = res_tmp; + + /* right去重 */ + while ((right > left) && (nums[right] == nums[right - 1])) { + right--; + } + /* left去重 */ + while ((left < right) && (nums[left] == nums[left + 1])) { + left++; + } + + /* 更新right与left */ + left++, right--; + } + } + } + } + + /* 返回值处理 */ + *returnSize = index; + + int *column = (int *)malloc(sizeof(int) * index); + for (int i = 0; i < index; i++) { + column[i] = 4; + } + *returnColumnSizes = column; + return res; +} +``` + ### Java: ```Java From 692f63a77e55a2b1141b4eac78634db306eb4ec9 Mon Sep 17 00:00:00 2001 From: alanx15a2 Date: Thu, 30 May 2024 12:00:12 +0800 Subject: [PATCH 2651/3019] =?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=A0=91=E7=9A=84?= =?UTF-8?q?=E9=80=92=E5=BD=92=E9=81=8D=E5=8E=86=20add=20php=20version?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...22\345\275\222\351\201\215\345\216\206.md" | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" index a1d49e985e..f2a97f4de0 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" @@ -671,6 +671,62 @@ public void Traversal(TreeNode cur, IList res) } ``` +### PHP +```php +// 144.前序遍历 +function preorderTraversal($root) { + $output = []; + $this->traversal($root, $output); + return $output; +} + +function traversal($root, array &$output) { + if ($root->val === null) { + return; + } + + $output[] = $root->val; + $this->traversal($root->left, $output); + $this->traversal($root->right, $output); +} +``` +```php +// 94.中序遍历 +function inorderTraversal($root) { + $output = []; + $this->traversal($root, $output); + return $output; +} + +function traversal($root, array &$output) { + if ($root->val === null) { + return; + } + + $this->traversal($root->left, $output); + $output[] = $root->val; + $this->traversal($root->right, $output); +} +``` +```php +// 145.后序遍历 +function postorderTraversal($root) { + $output = []; + $this->traversal($root, $output); + return $output; +} + +function traversal($root, array &$output) { + if ($root->val === null) { + return; + } + + $this->traversal($root->left, $output); + $this->traversal($root->right, $output); + $output[] = $root->val; +} +``` +

From 5fabc5c1e09f0372bfedbc5c92bb2ccbd73cf8da Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Fri, 31 May 2024 10:12:41 +0800 Subject: [PATCH 2652/3019] Update --- ...27\344\275\231\350\277\236\346\216\245.md" | 2 +- ...77\347\232\204\345\221\250\351\225\277.md" | 6 +- ...50\347\232\204\350\267\257\345\276\204.md" | 155 +++++++++++ ...27\344\275\231\350\277\236\346\216\245.md" | 128 ++++++++++ ...\344\275\231\350\277\236\346\216\245II.md" | 240 ++++++++++++++++++ ...46\344\270\262\346\216\245\351\276\231.md" | 149 +++++++++++ ...57\344\273\266\346\236\204\345\273\272.md" | 0 ...72\346\200\273\347\273\223\347\257\207.md" | 56 +++- ...06\350\256\272\345\237\272\347\241\200.md" | 3 +- 9 files changed, 720 insertions(+), 19 deletions(-) create mode 100644 "problems/kamacoder/0107.\345\257\273\346\211\276\345\255\230\345\234\250\347\232\204\350\267\257\345\276\204.md" create mode 100644 "problems/kamacoder/0108.\345\206\227\344\275\231\350\277\236\346\216\245.md" create mode 100644 "problems/kamacoder/0109.\345\206\227\344\275\231\350\277\236\346\216\245II.md" create mode 100644 "problems/kamacoder/0110.\345\255\227\347\254\246\344\270\262\346\216\245\351\276\231.md" rename "problems/kamacoder/00.\350\275\257\344\273\266\346\236\204\345\273\272.md" => "problems/kamacoder/0117.\350\275\257\344\273\266\346\236\204\345\273\272.md" (100%) diff --git "a/problems/0684.\345\206\227\344\275\231\350\277\236\346\216\245.md" "b/problems/0684.\345\206\227\344\275\231\350\277\236\346\216\245.md" index 6d5f2bc4fe..7808549036 100644 --- "a/problems/0684.\345\206\227\344\275\231\350\277\236\346\216\245.md" +++ "b/problems/0684.\345\206\227\344\275\231\350\277\236\346\216\245.md" @@ -75,7 +75,7 @@ void join(int u, int v) { 2. 将两个节点接入到同一个集合,函数:join(int u, int v),将两个节点连在同一个根节点上 3. 判断两个节点是否在同一个集合,函数:isSame(int u, int v),就是判断两个节点是不是同一个根节点 -如果还不了解并查集,可以看这里:[并查集理论基础](https://programmercarl.com/图论并查集理论基础.html) +如果还不了解并查集,可以看这里:[并查集理论基础](https://programmercarl.com/kamacoder/图论并查集理论基础.html) 我们再来看一下这道题目。 diff --git "a/problems/kamacoder/0106.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" "b/problems/kamacoder/0106.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" index 4a81922d43..4e285a9eec 100644 --- "a/problems/kamacoder/0106.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" +++ "b/problems/kamacoder/0106.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" @@ -1,6 +1,8 @@ # 106. 岛屿的周长 +[卡码网题目链接(ACM模式)](https://kamacoder.com/problempage.php?pid=1178) + 题目描述 给定一个由 1(陆地)和 0(水)组成的矩阵,岛屿是被水包围,并且通过水平方向或垂直方向上相邻的陆地连接而成的。 @@ -108,16 +110,14 @@ int main() { 计算出总的岛屿数量,总的变数为:岛屿数量 * 4 -因为有一对相邻两个陆地,边的总数就要减2,如图,有两个陆地相邻,总变数就要减2 +因为有一对相邻两个陆地,边的总数就要减2,如图红线部分,有两个陆地相邻,总边数就要减2 ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240524120855.png) - 那么只需要在计算出相邻岛屿的数量就可以了,相邻岛屿数量为cover。 结果 result = 岛屿数量 * 4 - cover * 2; - C++代码如下:(详细注释) ```CPP diff --git "a/problems/kamacoder/0107.\345\257\273\346\211\276\345\255\230\345\234\250\347\232\204\350\267\257\345\276\204.md" "b/problems/kamacoder/0107.\345\257\273\346\211\276\345\255\230\345\234\250\347\232\204\350\267\257\345\276\204.md" new file mode 100644 index 0000000000..d769518098 --- /dev/null +++ "b/problems/kamacoder/0107.\345\257\273\346\211\276\345\255\230\345\234\250\347\232\204\350\267\257\345\276\204.md" @@ -0,0 +1,155 @@ + +# 107. 寻找存在的路径 + +[卡码网题目链接(ACM模式)](https://kamacoder.com/problempage.php?pid=1179) + +题目描述 + +给定一个包含 n 个节点的无向图中,节点编号从 1 到 n (含 1 和 n )。 + +你的任务是判断是否有一条从节点 source 出发到节点 destination 的路径存在。 + +输入描述 + +第一行包含两个正整数 N 和 M,N 代表节点的个数,M 代表边的个数。  + +后续 M 行,每行两个正整数 s 和 t,代表从节点 s 与节点 t 之间有一条边。 + +最后一行包含两个正整数,代表起始节点 source 和目标节点 destination。 + +输出描述 + +输出一个整数,代表是否存在从节点 source 到节点 destination 的路径。如果存在,输出 1;否则,输出 0。 + +输入示例 + +``` +5 4 +1 2 +1 3 +2 4 +3 4 +1 4 +``` + +输出示例 + +1 + +提示信息 + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240527104432.png) + +数据范围: + +1 <= M, N <= 100。 + +## 思路 + +本题是并查集基础题目。 如果还不了解并查集,可以看这里:[并查集理论基础](https://programmercarl.com/kamacoder/图论并查集理论基础.html) + +并查集可以解决什么问题呢? + +主要就是集合问题,**两个节点在不在一个集合,也可以将两个节点添加到一个集合中**。 + +这里整理出我的并查集模板如下: + +```CPP +int n = 1005; // n根据题目中节点数量而定,一般比节点数量大一点就好 +vector father = vector (n, 0); // C++里的一种数组结构 + +// 并查集初始化 +void init() { + for (int i = 0; i < n; ++i) { + father[i] = i; + } +} +// 并查集里寻根的过程 +int find(int u) { + return u == father[u] ? u : father[u] = find(father[u]); // 路径压缩 +} + +// 判断 u 和 v是否找到同一个根 +bool isSame(int u, int v) { + u = find(u); + v = find(v); + return u == v; +} + +// 将v->u 这条边加入并查集 +void join(int u, int v) { + u = find(u); // 寻找u的根 + v = find(v); // 寻找v的根 + if (u == v) return ; // 如果发现根相同,则说明在一个集合,不用两个节点相连直接返回 + father[v] = u; +} +``` + +以上模板中,只要修改 n 大小就可以。 + +并查集主要有三个功能: + +1. 寻找根节点,函数:find(int u),也就是判断这个节点的祖先节点是哪个 +2. 将两个节点接入到同一个集合,函数:join(int u, int v),将两个节点连在同一个根节点上 +3. 判断两个节点是否在同一个集合,函数:isSame(int u, int v),就是判断两个节点是不是同一个根节点 + +简单介绍并查集之后,我们再来看一下这道题目。 + +为什么说这道题目是并查集基础题目,题目中各个点是双向图链接,那么判断 一个顶点到另一个顶点有没有有效路径其实就是看这两个顶点是否在同一个集合里。 + +如何算是同一个集合呢,有边连在一起,就算是一个集合。 + +此时我们就可以直接套用并查集模板。 + +使用 join(int u, int v)将每条边加入到并查集。 + +最后 isSame(int u, int v) 判断是否是同一个根 就可以了。 + +C++代码如下: + +```CPP +#include +#include +using namespace std; + +int n; // 节点数量 +vector father = vector (101, 0); // 按照节点大小定义数组大小 + +// 并查集初始化 +void init() { + for (int i = 1; i <= n; i++) father[i] = i; +} +// 并查集里寻根的过程 +int find(int u) { + return u == father[u] ? u : father[u] = find(father[u]); +} + +// 判断 u 和 v是否找到同一个根 +bool isSame(int u, int v) { + u = find(u); + v = find(v); + return u == v; +} + +// 将v->u 这条边加入并查集 +void join(int u, int v) { + u = find(u); // 寻找u的根 + v = find(v); // 寻找v的根 + if (u == v) return ; // 如果发现根相同,则说明在一个集合,不用两个节点相连直接返回 + father[v] = u; +} + +int main() { + int m, s, t, source, destination; + cin >> n >> m; + init(); + while (m--) { + cin >> s >> t; + join(s, t); + } + cin >> source >> destination; + if (isSame(source, destination)) cout << 1 << endl; + else cout << 0 << endl; +} +``` + diff --git "a/problems/kamacoder/0108.\345\206\227\344\275\231\350\277\236\346\216\245.md" "b/problems/kamacoder/0108.\345\206\227\344\275\231\350\277\236\346\216\245.md" new file mode 100644 index 0000000000..de0a0c6fca --- /dev/null +++ "b/problems/kamacoder/0108.\345\206\227\344\275\231\350\277\236\346\216\245.md" @@ -0,0 +1,128 @@ + +# 108. 冗余连接 + +[卡码网题目链接(ACM模式)](https://kamacoder.com/problempage.php?pid=1181) + +题目描述 + +树可以看成是一个图(拥有 n 个节点和 n - 1 条边的连通无环无向图)。 + +现给定一个拥有 n 个节点(节点编号从 1 到 n)和 n 条边的连通无向图,请找出一条可以删除的边,删除后图可以变成一棵树。 + +输入描述 + +第一行包含一个整数 N,表示图的节点个数和边的个数。 + +后续 N 行,每行包含两个整数 s 和 t,表示图中 s 和 t 之间有一条边。 + +输出描述 + +输出一条可以删除的边。如果有多个答案,请删除标准输入中最后出现的那条边。 + +输入示例 + +``` +3 +1 2 +2 3 +1 3 +``` + +输出示例 + +1 3 + +提示信息 + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240527110320.png) + +图中的 1 2,2 3,1 3 等三条边在删除后都能使原图变为一棵合法的树。但是 1 3 由于是标准输出里最后出现的那条边,所以输出结果为 1 3 + +数据范围: + +1 <= N <= 1000. + +## 思路 + +这道题目也是并查集基础题目。 + +这里我依然降调一下,并查集可以解决什么问题:两个节点是否在一个集合,也可以将两个节点添加到一个集合中。 + +如果还不了解并查集,可以看这里:[并查集理论基础](https://programmercarl.com/图论并查集理论基础.html) + +我们再来看一下这道题目。 + +题目说是无向图,返回一条可以删去的边,使得结果图是一个有着N个节点的树(即:只有一个根节点)。 + +如果有多个答案,则返回二维数组中最后出现的边。 + +那么我们就可以从前向后遍历每一条边(因为优先让前面的边连上),边的两个节点如果不在同一个集合,就加入集合(即:同一个根节点)。 + +如图所示: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20230604104720.png) + +节点A 和节点 B 不在同一个集合,那么就可以将两个 节点连在一起。 + +如果边的两个节点已经出现在同一个集合里,说明着边的两个节点已经连在一起了,再加入这条边一定就出现环了。 + +如图所示: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20230604104330.png) + +已经判断 节点A 和 节点B 在在同一个集合(同一个根),如果将 节点A 和 节点B 连在一起就一定会出现环。 + +这个思路清晰之后,代码就很好写了。 + +并查集C++代码如下: + +```CPP +#include +#include +using namespace std; +int n; // 节点数量 +vector father(1001, 0); // 按照节点大小范围定义数组 + +// 并查集初始化 +void init() { + for (int i = 0; i <= n; ++i) { + father[i] = i; + } +} +// 并查集里寻根的过程 +int find(int u) { + return u == father[u] ? u : father[u] = find(father[u]); +} +// 判断 u 和 v是否找到同一个根 +bool isSame(int u, int v) { + u = find(u); + v = find(v); + return u == v; +} +// 将v->u 这条边加入并查集 +void join(int u, int v) { + u = find(u); // 寻找u的根 + v = find(v); // 寻找v的根 + if (u == v) return ; // 如果发现根相同,则说明在一个集合,不用两个节点相连直接返回 + father[v] = u; +} + +int main() { + int s, t; + cin >> n; + init(); + for (int i = 0; i < n; i++) { + cin >> s >> t; + if (isSame(s, t)) { + cout << s << " " << t << endl; + return 0; + } else { + join(s, t); + } + } +} +``` + +可以看出,主函数的代码很少,就判断一下边的两个节点在不在同一个集合就可以了。 + + diff --git "a/problems/kamacoder/0109.\345\206\227\344\275\231\350\277\236\346\216\245II.md" "b/problems/kamacoder/0109.\345\206\227\344\275\231\350\277\236\346\216\245II.md" new file mode 100644 index 0000000000..4f3bbf0a05 --- /dev/null +++ "b/problems/kamacoder/0109.\345\206\227\344\275\231\350\277\236\346\216\245II.md" @@ -0,0 +1,240 @@ + +# 109. 冗余连接II + +[卡码网题目链接(ACM模式)](https://kamacoder.com/problempage.php?pid=1182) + +题目描述 + +有向树指满足以下条件的有向图。该树只有一个根节点,所有其他节点都是该根节点的后继。该树除了根节点之外的每一个节点都有且只有一个父节点,而根节点没有父节点。有向树拥有 n 个节点和 n - 1 条边。 + + +输入一个有向图,该图由一个有着 n 个节点(节点编号 从 1 到 n),n 条边,请返回一条可以删除的边,使得删除该条边之后该有向图可以被当作一颗有向树。 + +输入描述 + +第一行输入一个整数 N,表示有向图中节点和边的个数。 + +后续 N 行,每行输入两个整数 s 和 t,代表 s 节点有一条连接 t 节点的单向边 + +输出描述 + +输出一条可以删除的边,若有多条边可以删除,请输出标准输入中最后出现的一条边。 + +输入示例 + +``` +3 +1 2 +1 3 +2 3 +``` + +输出示例 + +2 3 + +提示信息 + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240527112633.png) + +在删除 2 3 后有向图可以变为一棵合法的有向树,所以输出 2 3 + +数据范围: + +1 <= N <= 1000. + +## 思路 + +本题与 [108.冗余连接](./0108.冗余连接.md) 类似,但本题是一个有向图,有向图相对要复杂一些。 + +本题的本质是 :有一个有向图,是由一颗有向树 + 一条有向边组成的 (所以此时这个图就不能称之为有向树),现在让我们找到那条边 把这条边删了,让这个图恢复为有向树。 + +还有“**若有多条边可以删除,请输出标准输入中最后出现的一条边**”,这说明在两条边都可以删除的情况下,要删顺序靠后的边! + +我们来想一下 有向树的性质,如果是有向树的话,只有根节点入度为0,其他节点入度都为1(因为该树除了根节点之外的每一个节点都有且只有一个父节点,而根节点没有父节点)。 + +所以情况一:如果我们找到入度为2的点,那么删一条指向该节点的边就行了。 + +如图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240527115807.png) + +找到了节点3 的入度为2,删 1 -> 3 或者 2 -> 3 。选择删顺序靠后便可。 + +但 入度为2 还有一种情况,情况二,只能删特定的一条边,如图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240527151456.png) + +节点3 的入度为 2,但在删除边的时候,只能删 这条边(节点1 -> 节点3),如果删这条边(节点4 -> 节点3),那么删后本图也不是有向树了(因为找不到根节点)。 + +综上,如果发现入度为2的节点,我们需要判断 删除哪一条边,删除后本图能成为有向树。如果是删哪个都可以,优先删顺序靠后的边。 + + +情况三: 如果没有入度为2的点,说明 图中有环了(注意是有向环)。 + +如图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240527120531.png) + +对于情况二,删掉构成环的边就可以了。 + + +## 写代码 + +把每条边记录下来,并统计节点入度: + +```cpp + int s, t; + vector> edges; + cin >> n; + vector inDegree(n + 1, 0); // 记录节点入度 + for (int i = 0; i < n; i++) { + cin >> s >> t; + inDegree[t]++; + edges.push_back({s, t}); + } + + +``` + +前两种入度为2的情况,一定是删除指向入度为2的节点的两条边其中的一条,如果删了一条,判断这个图是一个树,那么这条边就是答案。 + +同时注意要从后向前遍历,因为如果两条边删哪一条都可以成为树,就删最后那一条。 + +代码如下: + +```cpp +vector vec; // 记录入度为2的边(如果有的话就两条边) +// 找入度为2的节点所对应的边,注意要倒序,因为优先删除最后出现的一条边 +for (int i = n - 1; i >= 0; i--) { + if (inDegree[edges[i][1]] == 2) { + vec.push_back(i); + } +} +if (vec.size() > 0) { + // 放在vec里的边已经按照倒叙放的,所以这里就优先删vec[0]这条边 + if (isTreeAfterRemoveEdge(edges, vec[0])) { + cout << edges[vec[0]][0] << " " << edges[vec[0]][1]; + } else { + cout << edges[vec[1]][0] << " " << edges[vec[1]][1]; + } + return 0; +} +``` + +再来看情况三,明确没有入度为2的情况,那么一定有向环,找到构成环的边就是要删除的边。 + +可以定义一个函数,代码如下: + +```cpp +// 在有向图里找到删除的那条边,使其变成树 +void getRemoveEdge(const vector>& edges) +``` + +大家应该知道了,我们要解决本题要实现两个最为关键的函数: + +* `isTreeAfterRemoveEdge()` 判断删一个边之后是不是有向树 +* `getRemoveEdge()` 确定图中一定有了有向环,那么要找到需要删除的那条边 + +此时就用到**并查集**了。 + +如果还不了解并查集,可以看这里:[并查集理论基础](https://programmercarl.com/kamacoder/图论并查集理论基础.html) + +`isTreeAfterRemoveEdge()` 判断删一个边之后是不是有向树: 将所有边的两端节点分别加入并查集,遇到要 要删除的边则跳过,如果遇到即将加入并查集的边的两端节点 本来就在并查集了,说明构成了环。 + +如果顺利将所有边的两端节点(除了要删除的边)加入了并查集,则说明 删除该条边 还是一个有向树 + +`getRemoveEdge()`确定图中一定有了有向环,那么要找到需要删除的那条边: 将所有边的两端节点分别加入并查集,如果遇到即将加入并查集的边的两端节点 本来就在并查集了,说明构成了环。 + +本题C++代码如下:(详细注释了) + + +```cpp +#include +#include +using namespace std; +int n; +vector father (1001, 0); +// 并查集初始化 +void init() { + for (int i = 1; i <= n; ++i) { + father[i] = i; + } +} +// 并查集里寻根的过程 +int find(int u) { + return u == father[u] ? u : father[u] = find(father[u]); +} +// 将v->u 这条边加入并查集 +void join(int u, int v) { + u = find(u); + v = find(v); + if (u == v) return ; + father[v] = u; +} +// 判断 u 和 v是否找到同一个根 +bool same(int u, int v) { + u = find(u); + v = find(v); + return u == v; +} + +// 在有向图里找到删除的那条边,使其变成树 +void getRemoveEdge(const vector>& edges) { + init(); // 初始化并查集 + for (int i = 0; i < n; i++) { // 遍历所有的边 + if (same(edges[i][0], edges[i][1])) { // 构成有向环了,就是要删除的边 + cout << edges[i][0] << " " << edges[i][1]; + return; + } else { + join(edges[i][0], edges[i][1]); + } + } +} + +// 删一条边之后判断是不是树 +bool isTreeAfterRemoveEdge(const vector>& edges, int deleteEdge) { + init(); // 初始化并查集 + for (int 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; +} + +int main() { + int s, t; + vector> edges; + cin >> n; + vector inDegree(n + 1, 0); // 记录节点入度 + for (int i = 0; i < n; i++) { + cin >> s >> t; + inDegree[t]++; + edges.push_back({s, t}); + } + + vector vec; // 记录入度为2的边(如果有的话就两条边) + // 找入度为2的节点所对应的边,注意要倒序,因为优先删除最后出现的一条边 + for (int i = n - 1; i >= 0; i--) { + if (inDegree[edges[i][1]] == 2) { + vec.push_back(i); + } + } + if (vec.size() > 0) { + // 放在vec里的边已经按照倒叙放的,所以这里就优先删vec[0]这条边 + if (isTreeAfterRemoveEdge(edges, vec[0])) { + cout << edges[vec[0]][0] << " " << edges[vec[0]][1]; + } else { + cout << edges[vec[1]][0] << " " << edges[vec[1]][1]; + } + return 0; + } + + // 处理情况三 + // 明确没有入度为2的情况,那么一定有有向环,找到构成环的边返回就可以了 + getRemoveEdge(edges); +} +``` diff --git "a/problems/kamacoder/0110.\345\255\227\347\254\246\344\270\262\346\216\245\351\276\231.md" "b/problems/kamacoder/0110.\345\255\227\347\254\246\344\270\262\346\216\245\351\276\231.md" new file mode 100644 index 0000000000..81c1a33dca --- /dev/null +++ "b/problems/kamacoder/0110.\345\255\227\347\254\246\344\270\262\346\216\245\351\276\231.md" @@ -0,0 +1,149 @@ + +# 110. 字符串接龙 + +[卡码网题目链接(ACM模式)](https://kamacoder.com/problempage.php?pid=1182) + +题目描述 + +字典 strList 中从字符串 beginStr 和 endStr 的转换序列是一个按下述规格形成的序列: + +1. 序列中第一个字符串是 beginStr。 + +2. 序列中最后一个字符串是 endStr。 + +3. 每次转换只能改变一个字符。 + +4. 转换过程中的中间字符串必须是字典 strList 中的字符串。 + +给你两个字符串 beginStr 和 endStr 和一个字典 strList,找到从 beginStr 到 endStr 的最短转换序列中的字符串数目。如果不存在这样的转换序列,返回 0。 + +输入描述 + +第一行包含一个整数 N,表示字典 strList 中的字符串数量。 第二行包含两个字符串,用空格隔开,分别代表 beginStr 和 endStr。 后续 N 行,每行一个字符串,代表 strList 中的字符串。 + +输出描述 + +输出一个整数,代表从 beginStr 转换到 endStr 需要的最短转换序列中的字符串数量。如果不存在这样的转换序列,则输出 0。 + +输入示例 + +``` +6 +abc def +efc +dbc +ebc +dec +dfc +yhn +``` + +输出示例 + +4 + +提示信息 + +从 startStr 到 endStr,在 strList 中最短的路径为 abc -> dbc -> dec -> def,所以输出结果为 4 + +数据范围: + +2 <= N <= 500 + +

+ +

+ + +## 思路 + +以示例1为例,从这个图中可以看出 abc 到 def的路线 不止一条,但最短的一条路径上是4个节点。 + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240529121038.png) + +本题只需要求出最短路径的长度就可以了,不用找出具体路径。 + +所以这道题要解决两个问题: + +* 图中的线是如何连在一起的 +* 起点和终点的最短路径长度 + +首先题目中并没有给出点与点之间的连线,而是要我们自己去连,条件是字符只能差一个。 + +所以判断点与点之间的关系,需要判断是不是差一个字符,**如果差一个字符,那就是有链接**。 + +然后就是求起点和终点的最短路径长度,**这里无向图求最短路,广搜最为合适,广搜只要搜到了终点,那么一定是最短的路径**。因为广搜就是以起点中心向四周扩散的搜索。 + +**本题如果用深搜,会比较麻烦,要在到达终点的不同路径中选则一条最短路**。 而广搜只要达到终点,一定是最短路。 + +另外需要有一个注意点: + +* 本题是一个无向图,需要用标记位,标记着节点是否走过,否则就会死循环! +* 使用set来检查字符串是否出现在字符串集合里更快一些 + +C++代码如下:(详细注释) + +```CPP +#include +#include +#include +#include +#include +#include +using namespace std; +int main() { + string beginStr, endStr, str; + int n; + cin >> n; + unordered_set strSet; + cin >> beginStr >> endStr; + for (int i = 0; i < n; i++) { + cin >> str; + strSet.insert(str); + } + + // 记录strSet里的字符串是否被访问过,同时记录路径长度 + unordered_map visitMap; // <记录的字符串,路径长度> + + // 初始化队列 + queue que; + que.push(beginStr); + + // 初始化visitMap + visitMap.insert(pair(beginStr, 1)); + + while(!que.empty()) { + string word = que.front(); + que.pop(); + int path = visitMap[word]; // 这个字符串在路径中的长度 + + // 开始在这个str中,挨个字符去替换 + for (int i = 0; i < word.size(); i++) { + string newWord = word; // 用一个新字符串替换str,因为每次要置换一个字符 + + // 遍历26的字母 + for (int j = 0 ; j < 26; j++) { + newWord[i] = j + 'a'; + if (newWord == endStr) { // 发现替换字母后,字符串与终点字符串相同 + cout << path + 1 << endl; // 找到了路径 + return 0; + } + // 字符串集合里出现了newWord,并且newWord没有被访问过 + if (strSet.find(newWord) != strSet.end() + && visitMap.find(newWord) == visitMap.end()) { + // 添加访问信息,并将新字符串放到队列中 + visitMap.insert(pair(newWord, path + 1)); + que.push(newWord); + } + } + } + } + + // 没找到输出0 + cout << 0 << endl; + +} +``` + +当然本题也可以用双向BFS,就是从头尾两端进行搜索,大家感兴趣,可以自己去实现,这里就不再做详细讲解了。 + diff --git "a/problems/kamacoder/00.\350\275\257\344\273\266\346\236\204\345\273\272.md" "b/problems/kamacoder/0117.\350\275\257\344\273\266\346\236\204\345\273\272.md" similarity index 100% rename from "problems/kamacoder/00.\350\275\257\344\273\266\346\236\204\345\273\272.md" rename to "problems/kamacoder/0117.\350\275\257\344\273\266\346\236\204\345\273\272.md" diff --git "a/problems/kamacoder/\345\233\276\350\256\272\346\200\273\347\273\223\347\257\207.md" "b/problems/kamacoder/\345\233\276\350\256\272\346\200\273\347\273\223\347\257\207.md" index 65816bb1ec..aa360bab1d 100644 --- "a/problems/kamacoder/\345\233\276\350\256\272\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/kamacoder/\345\233\276\350\256\272\346\200\273\347\273\223\347\257\207.md" @@ -3,50 +3,78 @@ 从深搜广搜 到并查集,从最小生成树到拓扑排序, 最后是最短路算法系列。 -至此算上本篇,一共30篇文章,图论之旅就在此收官了。 +至此算上本篇,一共32篇文章,图论之旅就在此收官了。 -在[0098.所有可达路径](./0098.所有可达路径.md) ,我们接触了两种图的存储方式,邻接表和邻接矩阵,数量掌握两种图的存储方式很重要。 - -这也是大家习惯在核心代码模式下刷题 经常忽略的 知识点。因为在力扣上刷题不需要掌握图的存储方式。 +在[0098.所有可达路径](./0098.所有可达路径.md) ,我们接触了两种图的存储方式,邻接表和邻接矩阵,掌握两种图的存储方式很重要。 +图的存储方式也是大家习惯在核心代码模式下刷题 经常忽略的 知识点。因为在力扣上刷题不需要掌握图的存储方式。 +## 深搜与广搜 +在二叉树章节中,其实我们讲过了 深搜和广搜在二叉树上的搜索过程。 -## 深搜与广搜 +在图论章节中,深搜与广搜就是在图这个数据结构上的搜索过程。 深搜与广搜是图论里基本的搜索方法,大家需要掌握三点: * 搜索方式:深搜是可一个方向搜,不到黄河不回头。 广搜是围绕这起点一圈一圈的去搜。 * 代码模板:需要熟练掌握深搜和广搜的基本写法。 -* 应用场景:图论题目基本上可以即用深搜也可以广搜,无疑是用哪个方便而已 - +* 应用场景:图论题目基本上可以即用深搜也可用广搜,无疑是用哪个方便而已 -同样是深搜模板题,会有两种写法, +### 注意事项 +需要注意的是,同样是深搜模板题,会有两种写法。 在[0099.岛屿的数量深搜.md](./0099.岛屿的数量深搜.md) 和 [0105.有向图的完全可达性](./0105.有向图的完全可达性.md),涉及到dfs的两种写法。 -我们对dfs函数的定义是 是处理当前节点 还是处理下一个节点 很重要,决定了两种dfs的写法。 +**我们对dfs函数的定义是 是处理当前节点 还是处理下一个节点 很重要**,决定了两种dfs的写法。 这也是为什么很多录友看到不同的dfs写法,结果发现提交都能过的原因。 -而深搜还有细节,有的深搜题目需要回溯,有的就不用回溯, +而深搜还有细节,有的深搜题目需要用到回溯的过程,有的就不用回溯的过程, -需要计算路径的问题,一般需要回溯,如果只是染色问题 就不需要回溯。 +一般是需要计算路径的问题 需要回溯,如果只是染色问题(岛屿问题系列) 就不需要回溯。 例如: [0105.有向图的完全可达性](./0105.有向图的完全可达性.md) 深搜就不需要回溯,而 [0098.所有可达路径](./0098.所有可达路径.md) 中的递归就需要回溯,文章中都有详细讲解 +注意:以上说的是不需要回溯,不是没有回溯,只要有递归就会有回溯,只是我们是否需要用到回溯这个过程,这是需要考虑的。 +很多录友写出来的广搜可能超时了, 例如题目:[0099.岛屿的数量广搜](./0099.岛屿的数量广搜.md) -注意:以上说的是不需要回溯,不是没有回溯,只要有递归就会有回溯,只是我们是否需要用到回溯这个过程 才是要考虑的 +根本原因是**只要 加入队列就代表 走过,就需要标记,而不是从队列拿出来的时候再去标记走过**。 +具体原因,我在[0099.岛屿的数量广搜](./0099.岛屿的数量广搜.md) 中详细讲了。 -广搜注意事项,很多录友写广搜超时了。 +在深搜与广搜的讲解中,为了防止惯性思维,我特别加入了题目 [0106.岛屿的周长](./0106.岛屿的周长.md),提醒大家,看到类似的题目,也不要上来就想着深搜和广搜。 -深搜和广搜是图论的基础,也有很多变形,我在图论里用最大岛屿问题,讲了很多 +还有一些图的问题,在题目描述中,是没有图的,需要我们自己构建一个图,例如 [0110.字符串接龙](./0110.字符串接龙.md),题目中连线都没有,需要我们自己去思考 什么样的两个字符串可以连成线。 ## 并查集 +并查集相对来说是比较复杂的数据结构,其实他的代码不长,但想彻底学透并查集,需要从多个维度入手, + +我在理论基础篇的时候 讲解如下重点: + +* 为什么要用并查集,怎么不用个二维数据,或者set、map之类的。 +* 并查集能解决那些问题,哪些场景会用到并查集 +* 并查集原理以及代码实现 +* 并查集写法的常见误区 +* 带大家去模拟一遍并查集的过程 +* 路径压缩的过程 +* 时间复杂度分析 + +上面这几个维度 大家都去思考了,并查集基本就学明白了。 + +其实理论基础篇就算是给大家出了一道裸的并查集题目了,所以在后面的题目安排中,会稍稍的拔高一些,重点在于并查集的应用上。 + + + +[0108.冗余连接](./0108.冗余连接.md), [0109.冗余连接II](./0109.冗余连接II.md) + +后面的两道题目,[0108.冗余连接](./0108.冗余连接.md) 和 + + + ## 最小生成树 ## 拓扑排序 diff --git "a/problems/kamacoder/\345\233\276\350\256\272\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/kamacoder/\345\233\276\350\256\272\347\220\206\350\256\272\345\237\272\347\241\200.md" index be42a5fc7c..18d63e2d7b 100644 --- "a/problems/kamacoder/\345\233\276\350\256\272\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/kamacoder/\345\233\276\350\256\272\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -124,7 +124,8 @@ 一般使用邻接表、邻接矩阵 或者用类来表示。 -主流是 邻接表和邻接矩阵。 +主要是 朴素存储、邻接表和邻接矩阵。 + ### 邻接矩阵 From c3753198fefae41ebc5832d2539b86a50bf504ba Mon Sep 17 00:00:00 2001 From: XZY <1214807740@qq.com> Date: Sun, 2 Jun 2024 16:18:34 +0800 Subject: [PATCH 2653/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200055.=E5=8F=B3?= =?UTF-8?q?=E6=97=8B=E5=AD=97=E7=AC=A6=E4=B8=B2.md=20JavaScript=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...13\345\255\227\347\254\246\344\270\262.md" | 65 ++++++++++++------- 1 file changed, 41 insertions(+), 24 deletions(-) diff --git "a/problems/kamacoder/0055.\345\217\263\346\227\213\345\255\227\347\254\246\344\270\262.md" "b/problems/kamacoder/0055.\345\217\263\346\227\213\345\255\227\347\254\246\344\270\262.md" index 4dea19a832..6f176a573a 100644 --- "a/problems/kamacoder/0055.\345\217\263\346\227\213\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/kamacoder/0055.\345\217\263\346\227\213\345\255\227\347\254\246\344\270\262.md" @@ -298,33 +298,50 @@ int main() ```javascript // JS中字符串内不可单独修改 -// 右旋转 -function reverseLeftWords(s, k) { - const reverse = (sList, start, end) => { - for (let i = start, j = end; i < j; i++, j--) { - [sList[i], sList[j]] = [sList[j], sList[i]]; - } - } - const sList = Array.from(s); - reverse(sList, 0, sList.length - k - 1); - reverse(sList, sList.length - k, sList.length - 1); - reverse(sList, 0, sList.length - 1); - return sList.join(''); +const readline = require('readline') + +const rl = readline.createInterface({ + input: process.stdin, + output: process.stdout +}) + +const inputs = []; // 存储输入 + +rl.on('line', function(data) { + inputs.push(data); + +}).on('close', function() { + const res = deal(inputs); + // 打印结果 + console.log(res); +}) + +// 对传入的数据进行处理 +function deal(inputs) { + let [k, s] = inputs; + const len = s.length - 1; + k = parseInt(k); + str = s.split(''); + + str = reverseStr(str, 0, len - k) + str = reverseStr(str, len - k + 1, len) + str = reverseStr(str, 0, len) + + return str.join(''); } -// 左旋转 -var reverseLeftWords = function(s, n) { - const reverse = (sList, start, end) => { - for (let i = start, j = end; i < j; i++, j--) { - [sList[i], sList[j]] = [sList[j], sList[i]]; +// 根据提供的范围进行翻转 +function reverseStr(s, start, end) { + + while (start < end) { + [s[start], s[end]] = [s[end], s[start]] + + start++; + end--; } - } - const sList = s.split(''); - reverse(sList, 0, n - 1); - reverse(sList, n, sList.length - 1); - reverse(sList, 0, sList.length - 1); - return sList.join(''); -}; + + return s; +} ``` ### TypeScript: From 081e27db222d0b3775b84bed6e3629d5de8b96b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=9C=E7=BE=BD?= <90547641+xCk27x@users.noreply.github.com> Date: Mon, 3 Jun 2024 01:23:58 +0800 Subject: [PATCH 2654/3019] =?UTF-8?q?Update=200063.=E4=B8=8D=E5=90=8C?= =?UTF-8?q?=E8=B7=AF=E5=BE=84II.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增TypeScript的一維dp解法 --- ...\345\220\214\350\267\257\345\276\204II.md" | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git "a/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" "b/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" index 6819c19f5e..78507a8483 100644 --- "a/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" +++ "b/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" @@ -550,6 +550,27 @@ function uniquePathsWithObstacles(obstacleGrid: number[][]): number { }; ``` +// 版本二: dp改為使用一維陣列,從終點開始遍歷 +```typescript +function uniquePathsWithObstacles2(obstacleGrid: number[][]): number { + const m = obstacleGrid.length; + const n = obstacleGrid[0].length; + + const dp: number[] = new Array(n).fill(0); + dp[n - 1] = 1; + + // 由下而上,右而左進行遍歷 + for (let i = m - 1; i >= 0; i--) { + for (let j = n - 1; j >= 0; j--) { + if (obstacleGrid[i][j] === 1) dp[j] = 0; + else dp[j] = dp[j] + (dp[j + 1] || 0); + } + } + + return dp[0]; +}; +``` + ### Rust ```Rust From 89f9573f63158c46b02d15d2249bc1caa2c6da49 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=9C=E7=BE=BD?= <90547641+xCk27x@users.noreply.github.com> Date: Mon, 3 Jun 2024 01:29:33 +0800 Subject: [PATCH 2655/3019] =?UTF-8?q?Update=200063.=E4=B8=8D=E5=90=8C?= =?UTF-8?q?=E8=B7=AF=E5=BE=84II.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修正typescript方法2的函數名稱 --- .../0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" "b/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" index 78507a8483..daf3d8c5a1 100644 --- "a/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" +++ "b/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" @@ -552,7 +552,7 @@ function uniquePathsWithObstacles(obstacleGrid: number[][]): number { // 版本二: dp改為使用一維陣列,從終點開始遍歷 ```typescript -function uniquePathsWithObstacles2(obstacleGrid: number[][]): number { +function uniquePathsWithObstacles(obstacleGrid: number[][]): number { const m = obstacleGrid.length; const n = obstacleGrid[0].length; From f47eaf1e465d42608cd91ac545a0e4766bae07fe Mon Sep 17 00:00:00 2001 From: markwang Date: Mon, 3 Jun 2024 10:51:44 +0800 Subject: [PATCH 2656/3019] =?UTF-8?q?1047.=E5=88=A0=E9=99=A4=E5=AD=97?= =?UTF-8?q?=E7=AC=A6=E4=B8=B2=E4=B8=AD=E7=9A=84=E6=89=80=E6=9C=89=E7=9B=B8?= =?UTF-8?q?=E9=82=BB=E9=87=8D=E5=A4=8D=E9=A1=B9=E5=A2=9E=E5=8A=A0Go?= =?UTF-8?q?=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...73\351\207\215\345\244\215\351\241\271.md" | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git "a/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" "b/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" index 4aa0e95478..7232008a2c 100644 --- "a/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" +++ "b/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" @@ -241,6 +241,33 @@ class Solution: ### Go: +使用栈 +```go +func removeDuplicates(s string) string { + stack := make([]rune, 0) + for _, val := range s { + if len(stack) == 0 || val != stack[len(stack)-1] { + stack = append(stack, val) + } else { + stack = stack[:len(stack)-1] + } + } + var res []rune + for len(stack) != 0 { // 将栈中元素放到result字符串汇总 + res = append(res, stack[len(stack)-1]) + stack = stack[:len(stack)-1] + } + // 此时字符串需要反转一下 + l, r := 0, len(res)-1 + for l < r { + res[l], res[r] = res[r], res[l] + l++ + r-- + } + return string(res) +} +``` +拿字符串直接作为栈,省去了栈还要转为字符串的操作 ```go func removeDuplicates(s string) string { var stack []byte From b5a5340d1a964254325dc4ed64507c3460a9d3b9 Mon Sep 17 00:00:00 2001 From: mengyi Date: Wed, 5 Jun 2024 19:08:31 -0400 Subject: [PATCH 2657/3019] add curly braces and comments to advoid confusion --- ...14\345\210\206\346\237\245\346\211\276.md" | 20 +++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git "a/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" "b/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" index 5604cd56f3..d86146d63a 100644 --- "a/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" +++ "b/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" @@ -174,13 +174,17 @@ class Solution { int left = 0, right = nums.length - 1; while (left <= right) { int mid = left + ((right - left) >> 1); - if (nums[mid] == target) + if (nums[mid] == target) { return mid; - else if (nums[mid] < target) + } + else if (nums[mid] < target) { left = mid + 1; - else if (nums[mid] > target) + } + else { // nums[mid] > target right = mid - 1; + } } + // 未找到目标值 return -1; } } @@ -194,13 +198,17 @@ class Solution { int left = 0, right = nums.length; while (left < right) { int mid = left + ((right - left) >> 1); - if (nums[mid] == target) + if (nums[mid] == target) { return mid; - else if (nums[mid] < target) + } + else if (nums[mid] < target) { left = mid + 1; - else if (nums[mid] > target) + } + else { // nums[mid] > target right = mid; + } } + // 未找到目标值 return -1; } } From f96b0cf776e3ea6c06bf1e2471a5822437f973c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=BA=B7=E5=AE=87?= <746294093@qq.com> Date: Thu, 6 Jun 2024 14:24:52 +0800 Subject: [PATCH 2658/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A00053.=E6=9B=BF?= =?UTF-8?q?=E6=8D=A2=E6=95=B0=E5=AD=97.md=20PHP=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...77\346\215\242\346\225\260\345\255\227.md" | 37 ++++++++++++++++++- 1 file changed, 35 insertions(+), 2 deletions(-) diff --git "a/problems/kamacoder/0054.\346\233\277\346\215\242\346\225\260\345\255\227.md" "b/problems/kamacoder/0054.\346\233\277\346\215\242\346\225\260\345\255\227.md" index 45a0aa5461..ec5fcc63c6 100644 --- "a/problems/kamacoder/0054.\346\233\277\346\215\242\346\225\260\345\255\227.md" +++ "b/problems/kamacoder/0054.\346\233\277\346\215\242\346\225\260\345\255\227.md" @@ -369,9 +369,43 @@ main(); ### Scala: - ### PHP: +```php += 0) { + if (is_numeric($s[$oldLen])) { + $s[$newLen--] = 'r'; + $s[$newLen--] = 'e'; + $s[$newLen--] = 'b'; + $s[$newLen--] = 'm'; + $s[$newLen--] = 'u'; + $s[$newLen--] = 'n'; + } else { + $s[$newLen--] = $s[$oldLen]; + } + $oldLen--; +} + +echo $s; +?> +``` + + + ### Rust: @@ -381,4 +415,3 @@ main(); - From 3cba050e372565e3d982940c000f33e476e4924c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=BA=B7=E5=AE=87?= <746294093@qq.com> Date: Thu, 6 Jun 2024 16:22:11 +0800 Subject: [PATCH 2659/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A00055.=E5=8F=B3?= =?UTF-8?q?=E6=97=8B=E5=AD=97=E7=AC=A6=E4=B8=B2.md=20PHP=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...13\345\255\227\347\254\246\344\270\262.md" | 29 ++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git "a/problems/kamacoder/0055.\345\217\263\346\227\213\345\255\227\347\254\246\344\270\262.md" "b/problems/kamacoder/0055.\345\217\263\346\227\213\345\255\227\347\254\246\344\270\262.md" index 4dea19a832..1444bcae89 100644 --- "a/problems/kamacoder/0055.\345\217\263\346\227\213\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/kamacoder/0055.\345\217\263\346\227\213\345\255\227\347\254\246\344\270\262.md" @@ -23,7 +23,7 @@ ``` 2 abcdefg -``` +``` 样例输出: @@ -336,6 +336,32 @@ var reverseLeftWords = function(s, n) { ### PHP: +```php + +``` + ### Scala: @@ -349,3 +375,4 @@ var reverseLeftWords = function(s, n) { + From 104d4e336d3b5461f6685c75ff0d096168a95515 Mon Sep 17 00:00:00 2001 From: Joey Date: Sun, 9 Jun 2024 20:31:48 +1000 Subject: [PATCH 2660/3019] =?UTF-8?q?Update=2020201010=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=A0=91=E5=91=A8=E6=9C=AB=E6=80=BB=E7=BB=93.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\240\221\345\221\250\346\234\253\346\200\273\347\273\223.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20201010\344\272\214\345\217\211\346\240\221\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20201010\344\272\214\345\217\211\346\240\221\345\221\250\346\234\253\346\200\273\347\273\223.md" index 391a463102..5f5f688a13 100644 --- "a/problems/\345\221\250\346\200\273\347\273\223/20201010\344\272\214\345\217\211\346\240\221\345\221\250\346\234\253\346\200\273\347\273\223.md" +++ "b/problems/\345\221\250\346\200\273\347\273\223/20201010\344\272\214\345\217\211\346\240\221\345\221\250\346\234\253\346\200\273\347\273\223.md" @@ -55,7 +55,7 @@ **构造二叉树有三个注意的点:** -* 分割时候,坚持区间不变量原则,左闭右开,或者左闭又闭。 +* 分割时候,坚持区间不变量原则,左闭右开,或者左闭右闭。 * 分割的时候,注意后序 或者 前序已经有一个节点作为中间节点了,不能继续使用了。 * 如何使用切割后的后序数组来切合中序数组?利用中序数组大小一定是和后序数组的大小相同这一特点来进行切割。 From ddc8e2de604813772abe857bd7e7906ef2837fa0 Mon Sep 17 00:00:00 2001 From: mengyi Date: Sun, 9 Jun 2024 21:30:32 -0400 Subject: [PATCH 2661/3019] update project 203 java version solution --- ...76\350\241\250\345\205\203\347\264\240.md" | 54 ++++++++++--------- 1 file changed, 30 insertions(+), 24 deletions(-) diff --git "a/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" "b/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" index efcc6414fe..64124fbb3c 100644 --- "a/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" +++ "b/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" @@ -224,9 +224,10 @@ struct ListNode* removeElements(struct ListNode* head, int val){ ### Java: +用原来的链表操作: ```java /** - * 添加虚节点方式 + * 方法1 * 时间复杂度 O(n) * 空间复杂度 O(1) * @param head @@ -234,25 +235,22 @@ struct ListNode* removeElements(struct ListNode* head, int val){ * @return */ public ListNode removeElements(ListNode head, int val) { - if (head == null) { - return head; + while(head!=null && head.val==val) { + head = head.next; } - // 因为删除可能涉及到头节点,所以设置dummy节点,统一操作 - ListNode dummy = new ListNode(-1, head); - ListNode pre = dummy; - ListNode cur = head; - while (cur != null) { - if (cur.val == val) { - pre.next = cur.next; + ListNode curr = head; + while(curr!=null && curr.next !=null) { + if(curr.next.val == val){ + curr.next = curr.next.next; } else { - pre = cur; + curr = curr.next; } - cur = cur.next; } - return dummy.next; + return head; } + /** - * 不添加虚拟节点方式 + * 方法1 * 时间复杂度 O(n) * 空间复杂度 O(1) * @param head @@ -280,8 +278,13 @@ public ListNode removeElements(ListNode head, int val) { } return head; } + +``` + +设置一个虚拟头结点: + +```java /** - * 不添加虚拟节点and pre Node方式 * 时间复杂度 O(n) * 空间复杂度 O(1) * @param head @@ -289,18 +292,21 @@ public ListNode removeElements(ListNode head, int val) { * @return */ public ListNode removeElements(ListNode head, int val) { - while(head!=null && head.val==val){ - head = head.next; - } - ListNode curr = head; - while(curr!=null){ - while(curr.next!=null && curr.next.val == val){ - curr.next = curr.next.next; + // 设置一个虚拟的头结点 + ListNode dummy = new ListNode(); + dummy.next = head; + + ListNode cur = dummy; + while (cur.next != null) { + if (cur.next.val == val) { + cur.next = cur.next.next; + } else { + cur = cur.next; } - curr = curr.next; } - return head; + return dummy.next; } + ``` ### Python: From 4257be7d3175ff459157145082215b33790f45b1 Mon Sep 17 00:00:00 2001 From: mengyi Date: Sun, 9 Jun 2024 21:44:59 -0400 Subject: [PATCH 2662/3019] update problem 707 java version solution --- ...76\350\256\241\351\223\276\350\241\250.md" | 32 +++++++++++++------ 1 file changed, 22 insertions(+), 10 deletions(-) diff --git "a/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" "b/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" index 47771d2889..a247b17839 100644 --- "a/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" +++ "b/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" @@ -328,14 +328,29 @@ class MyLinkedList { return currentNode.val; } - //在链表最前面插入一个节点,等价于在第0个元素前添加 public void addAtHead(int val) { - addAtIndex(0, val); + ListNode newNode = new ListNode(val); + newNode.next = head.next; + head.next = newNode; + size++; + + // 在链表最前面插入一个节点,等价于在第0个元素前添加 + // addAtIndex(0, val); } - //在链表的最后插入一个节点,等价于在(末尾+1)个元素前添加 + public void addAtTail(int val) { - addAtIndex(size, val); + ListNode newNode = new ListNode(val); + ListNode cur = head; + while (cur.next != null) { + cur = cur.next; + } + + cur.next = newNode; + size++; + + // 在链表的最后插入一个节点,等价于在(末尾+1)个元素前添加 + // addAtIndex(size, val); } // 在第 index 个节点之前插入一个新节点,例如index为0,那么新插入的节点为链表的新头节点。 @@ -407,7 +422,7 @@ class MyLinkedList { public int get(int index) { //判断index是否有效 - if(index<0 || index>=size){ + if(index>=size){ return -1; } ListNode cur = this.head; @@ -441,10 +456,7 @@ class MyLinkedList { if(index>size){ return; } - //index小于0 - if(index<0){ - index = 0; - } + size++; //找到前驱 ListNode pre = this.head; @@ -462,7 +474,7 @@ class MyLinkedList { public void deleteAtIndex(int index) { //判断索引是否有效 - if(index<0 || index>=size){ + if(index>=size){ return; } //删除操作 From 3b9fa3f074b1d39cbfb7000b8a19124a8794f3cb Mon Sep 17 00:00:00 2001 From: mengyi Date: Mon, 10 Jun 2024 17:56:59 -0400 Subject: [PATCH 2663/3019] update running map solution in Java --- .DS_Store | Bin 0 -> 6148 bytes ...44\346\225\260\344\271\213\345\222\214.md" | 18 ++++++++++++++++++ 2 files changed, 18 insertions(+) create mode 100644 .DS_Store diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..f89600e9deb6f2c531cd456675779b0e188cf6e0 GIT binary patch literal 6148 zcmeHKyG{c^3>-s>lW0;>?l0sIR#EtZ`~X6rGQyC-DdB+wn*x~JCecVr~FDINk;1x$4@br_v zJ?uAm?`5L0Qa}nw0VyB_q`mri^f33h5x+WE_ literal 0 HcmV?d00001 diff --git "a/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" "b/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" index 580fa3e2c9..044eac1424 100644 --- "a/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" @@ -152,6 +152,24 @@ public int[] twoSum(int[] nums, int target) { return res; } ``` + +```java +//使用哈希表方法2 +public int[] twoSum(int[] nums, int target) { + Map indexMap = new HashMap<>(); + + for(int i = 0; i < nums.length; i++){ + int balance = target - nums[i]; // 记录当前的目标值的余数 + if(indexMap.containsKey(balance)){ // 查找当前的map中是否有满足要求的值 + return new int []{i, indexMap.get(balance)}; // 如果有,返回目标值 + } else{ + indexMap.put(nums[i], i); // 如果没有,把访问过的元素和下标加入map中 + } + } + return null; +} +``` + ```java //使用双指针 public int[] twoSum(int[] nums, int target) { From 96f4622dcf91e4888a8ab86f4022fe11ecba67d7 Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Thu, 13 Jun 2024 10:29:09 +0800 Subject: [PATCH 2664/3019] =?UTF-8?q?=E5=9B=BE=E8=AE=BA=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...11\346\216\222\350\241\214\347\250\213.md" | 3 - ...17\202\344\274\232dijkstra\345\240\206.md" | 30 +- ...74\232dijkstra\346\234\264\347\264\240.md" | 36 +- .../0053.\345\257\273\345\256\235-Kruskal.md" | 32 +- .../0053.\345\257\273\345\256\235-prim.md" | 28 +- ...\211\251\350\277\220\350\276\223I-SPFA.md" | 26 ++ ...7\347\211\251\350\277\220\350\276\223I.md" | 26 ++ ...\347\211\251\350\277\220\350\276\223II.md" | 27 ++ ...347\211\251\350\277\220\350\276\223III.md" | 27 ++ ...16\351\200\233\345\205\254\345\233\255.md" | 23 ++ ...57\350\276\276\350\267\257\345\276\204.md" | 35 +- ...60\351\207\217\345\271\277\346\220\234.md" | 29 +- ...60\351\207\217\346\267\261\346\220\234.md" | 28 +- ...00\345\244\247\351\235\242\347\247\257.md" | 31 +- ...04\346\200\273\351\235\242\347\247\257.md" | 31 +- ...11\346\262\241\345\255\244\345\262\233.md" | 27 ++ ...64\346\265\201\351\227\256\351\242\230.md" | 27 ++ ...00\345\244\247\345\262\233\345\261\277.md" | 27 ++ ...50\345\217\257\350\276\276\346\200\247.md" | 27 ++ ...77\347\232\204\345\221\250\351\225\277.md" | 27 ++ ...50\347\232\204\350\267\257\345\276\204.md" | 27 ++ ...27\344\275\231\350\277\236\346\216\245.md" | 29 +- ...\344\275\231\350\277\236\346\216\245II.md" | 27 ++ ...46\344\270\262\346\216\245\351\276\231.md" | 27 ++ ...57\344\273\266\346\236\204\345\273\272.md" | 55 ++- ...47\346\225\260\345\207\217\346\263\225.md" | 89 +++++ ...43\346\234\200\345\244\247\345\200\274.md" | 127 ++++++ ...60\347\273\204\346\236\204\351\200\240.md" | 52 +++ ...76\345\215\216\345\270\226\345\255\220.md" | 38 ++ ...04\346\234\200\345\244\247\345\222\214.md" | 66 ++++ ...7\232\204\346\224\273\345\207\273astar.md" | 361 ++++++++++++++++++ ...06\350\256\272\345\237\272\347\241\200.md" | 10 +- ...06\350\256\272\345\237\272\347\241\200.md" | 56 +-- ...72\346\200\273\347\273\223\347\257\207.md" | 69 +++- ...06\350\256\272\345\237\272\347\241\200.md" | 10 +- ...30\346\200\273\347\273\223\347\257\207.md" | 15 +- ...06\350\256\272\345\237\272\347\241\200.md" | 3 +- 37 files changed, 1496 insertions(+), 112 deletions(-) create mode 100644 "problems/kamacoder/0121.\345\244\247\346\225\260\345\207\217\346\263\225.md" create mode 100644 "problems/kamacoder/0122.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" create mode 100644 "problems/kamacoder/0123.\345\260\217\347\272\242\347\232\204\346\225\260\347\273\204\346\236\204\351\200\240.md" create mode 100644 "problems/kamacoder/0124.\347\262\276\345\215\216\345\270\226\345\255\220.md" create mode 100644 "problems/kamacoder/0125.\350\277\236\347\273\255\345\255\220\346\225\260\347\273\204\346\234\200\345\244\247\345\222\214.md" create mode 100644 "problems/kamacoder/0126.\351\252\221\345\243\253\347\232\204\346\224\273\345\207\273astar.md" diff --git "a/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" "b/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" index a34490ea1b..1d9c524b13 100644 --- "a/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" +++ "b/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" @@ -253,9 +253,6 @@ for (pair& target : targets[result[result.size() - 1]]) 如果最终代码,发现照着回溯法模板画的话好像也能画出来,但难就难如何知道可以使用回溯,以及如果套进去,所以我再写了这么长的一篇来详细讲解。 -就酱,很多录友表示和「代码随想录」相见恨晚,那么帮Carl宣传一波吧,让更多同学知道这里! - - ## 其他语言版本 diff --git "a/problems/kamacoder/0047.\345\217\202\344\274\232dijkstra\345\240\206.md" "b/problems/kamacoder/0047.\345\217\202\344\274\232dijkstra\345\240\206.md" index b93138a78a..a0778d2db8 100644 --- "a/problems/kamacoder/0047.\345\217\202\344\274\232dijkstra\345\240\206.md" +++ "b/problems/kamacoder/0047.\345\217\202\344\274\232dijkstra\345\240\206.md" @@ -1,7 +1,7 @@ # dijkstra(堆优化版)精讲 -[题目链接](https://kamacoder.com/problempage.php?pid=1047) +[卡码网:47. 参加科学大会](https://kamacoder.com/problempage.php?pid=1047) 【题目描述】 @@ -66,7 +66,7 @@ 如果n很大的话,我们可以换一个角度来优先性能。 -在 讲解 最小生成树的时候,我们 讲了两个算法,[prim算法](https://mp.weixin.qq.com/s/yX936hHC6Z10K36Vm1Wl9w)(从点的角度来求最小生成树)、[Kruskal算法](https://mp.weixin.qq.com/s/rUVaBjCES_4eSjngceT5bw)(从边的角度来求最小生成树) +在 讲解 最小生成树的时候,我们 讲了两个算法,[prim算法](./0053.寻宝-prim.md)(从点的角度来求最小生成树)、[Kruskal算法](./0053.寻宝-Kruskal.md)(从边的角度来求最小生成树) 这么在n 很大的时候,也有另一个思考维度,即:从边的数量出发。 @@ -649,3 +649,29 @@ int main() { +## 其他语言版本 + +### Java + +### Python + +### Go + +### Rust + +### Javascript + +### TypeScript + +### PhP + +### Swift + +### Scala + +### C# + +### Dart + +### C + diff --git "a/problems/kamacoder/0047.\345\217\202\344\274\232dijkstra\346\234\264\347\264\240.md" "b/problems/kamacoder/0047.\345\217\202\344\274\232dijkstra\346\234\264\347\264\240.md" index 295d3aec15..10474f1318 100644 --- "a/problems/kamacoder/0047.\345\217\202\344\274\232dijkstra\346\234\264\347\264\240.md" +++ "b/problems/kamacoder/0047.\345\217\202\344\274\232dijkstra\346\234\264\347\264\240.md" @@ -1,7 +1,7 @@ # dijkstra(朴素版)精讲 -[题目链接](https://kamacoder.com/problempage.php?pid=1047) +[卡码网:47. 参加科学大会](https://kamacoder.com/problempage.php?pid=1047) 【题目描述】 @@ -80,7 +80,7 @@ dijkstra算法:在有权图(权值非负数)中求从起点到其他节点 最短路径的权值为12。 -其实 dijkstra 算法 和 我们之前讲解的prim算法思路非常接近,如果大家认真学过[prim算法](https://mp.weixin.qq.com/s/yX936hHC6Z10K36Vm1Wl9w),那么理解 Dijkstra 算法会相对容易很多。(这也是我要先讲prim再讲dijkstra的原因) +其实 dijkstra 算法 和 我们之前讲解的prim算法思路非常接近,如果大家认真学过[prim算法](./0053.寻宝-prim.md),那么理解 Dijkstra 算法会相对容易很多。(这也是我要先讲prim再讲dijkstra的原因) dijkstra 算法 同样是贪心的思路,不断寻找距离 源点最近的没有访问过的节点。 @@ -92,7 +92,7 @@ dijkstra 算法 同样是贪心的思路,不断寻找距离 源点最近的没 大家此时已经会发现,这和prim算法 怎么这么像呢。 -我在[prim算法](https://mp.weixin.qq.com/s/yX936hHC6Z10K36Vm1Wl9w)讲解中也给出了三部曲。 prim 和 dijkstra 确实很像,思路也是类似的,这一点我在后面还会详细来讲。 +我在[prim算法](./0053.寻宝-prim.md)讲解中也给出了三部曲。 prim 和 dijkstra 确实很像,思路也是类似的,这一点我在后面还会详细来讲。 在dijkstra算法中,同样有一个数组很重要,起名为:minDist。 @@ -462,7 +462,7 @@ select:7 如果题目要求把最短路的路径打印出来,应该怎么办呢? -这里还是有一些“坑”的,本题打印路径和 prim 打印路径是一样的,我在 [prim算法精讲](https://mp.weixin.qq.com/s/yX936hHC6Z10K36Vm1Wl9w) 【拓展】中 已经详细讲解了。 +这里还是有一些“坑”的,本题打印路径和 prim 打印路径是一样的,我在 [prim算法精讲](./0053.寻宝-prim.md) 【拓展】中 已经详细讲解了。 在这里就不再赘述。 @@ -660,7 +660,7 @@ int main() { ## dijkstra与prim算法的区别 -> 这里再次提示,需要先看我的 [prim算法精讲](https://mp.weixin.qq.com/s/yX936hHC6Z10K36Vm1Wl9w) ,否则可能不知道我下面讲的是什么。 +> 这里再次提示,需要先看我的 [prim算法精讲](./0053.寻宝-prim.md) ,否则可能不知道我下面讲的是什么。 大家可以发现 dijkstra的代码看上去 怎么和 prim算法这么像呢。 @@ -731,3 +731,29 @@ for (int v = 1; v <= n; v++) { +## 其他语言版本 + +### Java + +### Python + +### Go + +### Rust + +### Javascript + +### TypeScript + +### PhP + +### Swift + +### Scala + +### C# + +### Dart + +### C + diff --git "a/problems/kamacoder/0053.\345\257\273\345\256\235-Kruskal.md" "b/problems/kamacoder/0053.\345\257\273\345\256\235-Kruskal.md" index 1d0c9c83e8..527f0e70b8 100644 --- "a/problems/kamacoder/0053.\345\257\273\345\256\235-Kruskal.md" +++ "b/problems/kamacoder/0053.\345\257\273\345\256\235-Kruskal.md" @@ -130,7 +130,7 @@ kruscal的思路: **但在代码中,如果将两个节点加入同一个集合,又如何判断两个节点是否在同一个集合呢**? -这里就涉及到我们之前讲解的[并查集](https://www.programmercarl.com/%E5%9B%BE%E8%AE%BA%E5%B9%B6%E6%9F%A5%E9%9B%86%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html)。 +这里就涉及到我们之前讲解的[并查集](./图论并查集理论基础.md)。 我们在并查集开篇的时候就讲了,并查集主要就两个功能: @@ -139,7 +139,7 @@ kruscal的思路: 大家发现这正好符合 Kruskal算法的需求,这也是为什么 **我要先讲并查集,再讲 Kruskal**。 -关于 并查集,我已经在[并查集精讲](https://www.programmercarl.com/%E5%9B%BE%E8%AE%BA%E5%B9%B6%E6%9F%A5%E9%9B%86%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html) 详细讲解过了,所以这里不再赘述,我们直接用。 +关于 并查集,我已经在[并查集精讲](./图论并查集理论基础.md) 详细讲解过了,所以这里不再赘述,我们直接用。 本题代码如下,已经详细注释: @@ -374,7 +374,7 @@ Kruskal 与 prim 的关键区别在于,prim维护的是节点的集合,而 K 在节点数量固定的情况下,图中的边越少,Kruskal 需要遍历的边也就越少。 -而 prim 算法是对节点进行操作的,节点数量越少,prim算法效率就越少。 +而 prim 算法是对节点进行操作的,节点数量越少,prim算法效率就越优。 所以在 稀疏图中,用Kruskal更优。 在稠密图中,用prim算法更优。 @@ -398,3 +398,29 @@ Kruskal算法 时间复杂度 为 nlogn,其中n 为边的数量,适用稀疏 录友们可以细细体会。 +## 其他语言版本 + +### Java + +### Python + +### Go + +### Rust + +### Javascript + +### TypeScript + +### PhP + +### Swift + +### Scala + +### C# + +### Dart + +### C + diff --git "a/problems/kamacoder/0053.\345\257\273\345\256\235-prim.md" "b/problems/kamacoder/0053.\345\257\273\345\256\235-prim.md" index 4d3d9bd829..f1b3b721bf 100644 --- "a/problems/kamacoder/0053.\345\257\273\345\256\235-prim.md" +++ "b/problems/kamacoder/0053.\345\257\273\345\256\235-prim.md" @@ -507,10 +507,36 @@ int main() { 最后我们拓展了如何求职 最小生成树 的每一条边,其实 添加的代码很简单,主要是理解 为什么使用 parent数组 来记录边 以及 在哪里 更新parent数组。 -同时,因为使用一维数组,数组的下标和数组 如何赋值很重要,不要搞反,导师结果被覆盖。 +同时,因为使用一维数组,数组的下标和数组 如何赋值很重要,不要搞反,导致结果被覆盖。 好了,以上为总结,录友们学习愉快。 +## 其他语言版本 + +### Java + +### Python + +### Go + +### Rust + +### Javascript + +### TypeScript + +### PhP + +### Swift + +### Scala + +### C# + +### Dart + +### C + diff --git "a/problems/kamacoder/0094.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I-SPFA.md" "b/problems/kamacoder/0094.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I-SPFA.md" index ec35fa9d98..eb3204b612 100644 --- "a/problems/kamacoder/0094.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I-SPFA.md" +++ "b/problems/kamacoder/0094.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I-SPFA.md" @@ -347,6 +347,32 @@ SPFA(队列优化版Bellman_ford) 在理论上 时间复杂度更胜一筹 +## 其他语言版本 + +### Java + +### Python + +### Go + +### Rust + +### Javascript + +### TypeScript + +### PhP + +### Swift + +### Scala + +### C# + +### Dart + +### C + diff --git "a/problems/kamacoder/0094.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I.md" "b/problems/kamacoder/0094.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I.md" index dc9b46f338..7cadc37888 100644 --- "a/problems/kamacoder/0094.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I.md" +++ "b/problems/kamacoder/0094.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I.md" @@ -387,3 +387,29 @@ Bellman_ford 是可以计算 负权值的单源最短路算法。 弄清楚 什么是 松弛? 为什么要 n-1 次? 对理解Bellman_ford 非常重要。 +## 其他语言版本 + +### Java + +### Python + +### Go + +### Rust + +### Javascript + +### TypeScript + +### PhP + +### Swift + +### Scala + +### C# + +### Dart + +### C + diff --git "a/problems/kamacoder/0095.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223II.md" "b/problems/kamacoder/0095.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223II.md" index 3200efb377..ea7065792f 100644 --- "a/problems/kamacoder/0095.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223II.md" +++ "b/problems/kamacoder/0095.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223II.md" @@ -238,3 +238,30 @@ int main() { } ``` + +## 其他语言版本 + +### Java + +### Python + +### Go + +### Rust + +### Javascript + +### TypeScript + +### PhP + +### Swift + +### Scala + +### C# + +### Dart + +### C + diff --git "a/problems/kamacoder/0096.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223III.md" "b/problems/kamacoder/0096.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223III.md" index f7533e024f..2b9f44fcb7 100644 --- "a/problems/kamacoder/0096.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223III.md" +++ "b/problems/kamacoder/0096.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223III.md" @@ -630,3 +630,30 @@ dijkstra 是贪心的思路 每一次搜索都只会找距离源点最近的非 * 能否用dijkstra 学透了以上四个拓展,相信大家会对bellman_ford有更深入的理解。 + +## 其他语言版本 + +### Java + +### Python + +### Go + +### Rust + +### Javascript + +### TypeScript + +### PhP + +### Swift + +### Scala + +### C# + +### Dart + +### C + diff --git "a/problems/kamacoder/0097.\345\260\217\346\230\216\351\200\233\345\205\254\345\233\255.md" "b/problems/kamacoder/0097.\345\260\217\346\230\216\351\200\233\345\205\254\345\233\255.md" index 7e69994961..f4b53acfaa 100644 --- "a/problems/kamacoder/0097.\345\260\217\346\230\216\351\200\233\345\205\254\345\233\255.md" +++ "b/problems/kamacoder/0097.\345\260\217\346\230\216\351\200\233\345\205\254\345\233\255.md" @@ -418,6 +418,29 @@ floyd算法的时间复杂度相对较高,适合 稠密图且源点较多的 如果 源点少,其实可以 多次dijsktra 求源点到终点。 +## 其他语言版本 +### Java +### Python + +### Go + +### Rust + +### Javascript + +### TypeScript + +### PhP + +### Swift + +### Scala + +### C# + +### Dart + +### C diff --git "a/problems/kamacoder/0098.\346\211\200\346\234\211\345\217\257\350\276\276\350\267\257\345\276\204.md" "b/problems/kamacoder/0098.\346\211\200\346\234\211\345\217\257\350\276\276\350\267\257\345\276\204.md" index 0573d0817e..ca4f117c19 100644 --- "a/problems/kamacoder/0098.\346\211\200\346\234\211\345\217\257\350\276\276\350\267\257\345\276\204.md" +++ "b/problems/kamacoder/0098.\346\211\200\346\234\211\345\217\257\350\276\276\350\267\257\345\276\204.md" @@ -3,8 +3,6 @@ [卡码网题目链接(ACM模式)](https://kamacoder.com/problempage.php?pid=1170) -[力扣题目讲解以及题目链接(核心代码模式)](https://programmercarl.com/0797.%E6%89%80%E6%9C%89%E5%8F%AF%E8%83%BD%E7%9A%84%E8%B7%AF%E5%BE%84.html#%E6%80%9D%E8%B7%AF) - 【题目描述】 给定一个有 n 个节点的有向无环图,节点编号从 1 到 n。请编写一个函数,找出并返回所有从节点 1 到节点 n 的路径。每条路径应以节点编号的列表形式表示。 @@ -406,3 +404,36 @@ int main() { +## 其他语言版本 + +### Java + +### Python + +### Go + +### Rust + +### Javascript + +### TypeScript + +### PhP + +### Swift + +### Scala + +### C# + +### Dart + +### C + + + + + + + + diff --git "a/problems/kamacoder/0099.\345\262\233\345\261\277\347\232\204\346\225\260\351\207\217\345\271\277\346\220\234.md" "b/problems/kamacoder/0099.\345\262\233\345\261\277\347\232\204\346\225\260\351\207\217\345\271\277\346\220\234.md" index e7a0a8f3ac..993c01f225 100644 --- "a/problems/kamacoder/0099.\345\262\233\345\261\277\347\232\204\346\225\260\351\207\217\345\271\277\346\220\234.md" +++ "b/problems/kamacoder/0099.\345\262\233\345\261\277\347\232\204\346\225\260\351\207\217\345\271\277\346\220\234.md" @@ -3,8 +3,6 @@ [卡码网题目链接(ACM模式)](https://kamacoder.com/problempage.php?pid=1171) -[力扣题目讲解以及题目链接(核心代码模式)](https://programmercarl.com/0200.%E5%B2%9B%E5%B1%BF%E6%95%B0%E9%87%8F.%E5%B9%BF%E6%90%9C%E7%89%88.html) - 题目描述: 给定一个由 1(陆地)和 0(水)组成的矩阵,你需要计算岛屿的数量。岛屿由水平方向或垂直方向上相邻的陆地连接而成,并且四周都是水域。你可以假设矩阵外均被水包围。 @@ -185,3 +183,30 @@ int main() { ``` + +## 其他语言版本 + +### Java + +### Python + +### Go + +### Rust + +### Javascript + +### TypeScript + +### PhP + +### Swift + +### Scala + +### C# + +### Dart + +### C + diff --git "a/problems/kamacoder/0099.\345\262\233\345\261\277\347\232\204\346\225\260\351\207\217\346\267\261\346\220\234.md" "b/problems/kamacoder/0099.\345\262\233\345\261\277\347\232\204\346\225\260\351\207\217\346\267\261\346\220\234.md" index 310676105f..7fac4cb8f9 100644 --- "a/problems/kamacoder/0099.\345\262\233\345\261\277\347\232\204\346\225\260\351\207\217\346\267\261\346\220\234.md" +++ "b/problems/kamacoder/0099.\345\262\233\345\261\277\347\232\204\346\225\260\351\207\217\346\267\261\346\220\234.md" @@ -3,7 +3,6 @@ [卡码网题目链接(ACM模式)](https://kamacoder.com/problempage.php?pid=1171) -[力扣题目讲解以及题目链接(核心代码模式)](https://programmercarl.com/0200.%E5%B2%9B%E5%B1%BF%E6%95%B0%E9%87%8F.%E6%B7%B1%E6%90%9C%E7%89%88.html) 题目描述: @@ -177,3 +176,30 @@ int main() { 本篇我只给出的dfs的写法,大家发现我写的还是比较细的,那么后面我再单独给出本题的bfs写法,虽然是模板题,但依然有很多注意的点,敬请期待! + +## 其他语言版本 + +### Java + +### Python + +### Go + +### Rust + +### Javascript + +### TypeScript + +### PhP + +### Swift + +### Scala + +### C# + +### Dart + +### C + diff --git "a/problems/kamacoder/0100.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" "b/problems/kamacoder/0100.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" index 6f8a9ed86a..2e2ed4f349 100644 --- "a/problems/kamacoder/0100.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" +++ "b/problems/kamacoder/0100.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" @@ -3,8 +3,6 @@ [卡码网题目链接(ACM模式)](https://kamacoder.com/problempage.php?pid=1172) -[力扣题目链接](https://programmercarl.com/0695.%E5%B2%9B%E5%B1%BF%E7%9A%84%E6%9C%80%E5%A4%A7%E9%9D%A2%E7%A7%AF.html#%E6%80%9D%E8%B7%AF) - 题目描述 给定一个由 1(陆地)和 0(水)组成的矩阵,计算岛屿的最大面积。岛屿面积的计算方式为组成岛屿的陆地的总数。岛屿由水平方向或垂直方向上相邻的陆地连接而成,并且四周都是水域。你可以假设矩阵外均被水包围。 @@ -167,7 +165,7 @@ int main() { ### BFS -关于广度优先搜索,如果大家还不了解的话,看这里:[广度优先搜索精讲](https://programmercarl.com/kamacoder/图论广搜理论基础.html) +关于广度优先搜索,如果大家还不了解的话,看这里:[广度优先搜索精讲](./图论广搜理论基础.md) 本题BFS代码如下: @@ -219,3 +217,30 @@ public: ``` + +## 其他语言版本 + +### Java + +### Python + +### Go + +### Rust + +### Javascript + +### TypeScript + +### PhP + +### Swift + +### Scala + +### C# + +### Dart + +### C + diff --git "a/problems/kamacoder/0101.\345\255\244\345\262\233\347\232\204\346\200\273\351\235\242\347\247\257.md" "b/problems/kamacoder/0101.\345\255\244\345\262\233\347\232\204\346\200\273\351\235\242\347\247\257.md" index 602fb97738..5be256117f 100644 --- "a/problems/kamacoder/0101.\345\255\244\345\262\233\347\232\204\346\200\273\351\235\242\347\247\257.md" +++ "b/problems/kamacoder/0101.\345\255\244\345\262\233\347\232\204\346\200\273\351\235\242\347\247\257.md" @@ -1,7 +1,7 @@ # 101. 孤岛的总面积 -[卡码网题目链接(ACM模式)](https://kamacoder.com/problempage.php?pid=1173) +[卡码网:101. 孤岛的总面积](https://kamacoder.com/problempage.php?pid=1173) 题目描述 @@ -60,7 +60,7 @@ 然后我们再去遍历这个地图,遇到有陆地的地方,去采用深搜或者广搜,边统计所有陆地。 -如果对深搜或者广搜不够了解,建议先看这里:[深度优先搜索精讲](https://programmercarl.com/kamacoder/图论深搜理论基础.html),[广度优先搜索精讲](https://programmercarl.com/kamacoder/图论广搜理论基础.html)。 +如果对深搜或者广搜不够了解,建议先看这里:[深度优先搜索精讲](./图论深搜理论基础.md),[广度优先搜索精讲](./图论广搜理论基础.md)。 采用深度优先搜索的代码如下: @@ -178,3 +178,30 @@ int main() { } ``` + +## 其他语言版本 + +### Java + +### Python + +### Go + +### Rust + +### Javascript + +### TypeScript + +### PhP + +### Swift + +### Scala + +### C# + +### Dart + +### C + diff --git "a/problems/kamacoder/0102.\346\262\211\346\262\241\345\255\244\345\262\233.md" "b/problems/kamacoder/0102.\346\262\211\346\262\241\345\255\244\345\262\233.md" index 4c7491f716..43666325f2 100644 --- "a/problems/kamacoder/0102.\346\262\211\346\262\241\345\255\244\345\262\233.md" +++ "b/problems/kamacoder/0102.\346\262\211\346\262\241\345\255\244\345\262\233.md" @@ -131,3 +131,30 @@ int main() { } } ``` + +## 其他语言版本 + +### Java + +### Python + +### Go + +### Rust + +### Javascript + +### TypeScript + +### PhP + +### Swift + +### Scala + +### C# + +### Dart + +### C + diff --git "a/problems/kamacoder/0103.\346\260\264\346\265\201\351\227\256\351\242\230.md" "b/problems/kamacoder/0103.\346\260\264\346\265\201\351\227\256\351\242\230.md" index 8f99beae1f..0f461edb3c 100644 --- "a/problems/kamacoder/0103.\346\260\264\346\265\201\351\227\256\351\242\230.md" +++ "b/problems/kamacoder/0103.\346\260\264\346\265\201\351\227\256\351\242\230.md" @@ -276,4 +276,31 @@ for (int j = 0; j < m; j++) { +## 其他语言版本 + +### Java + +### Python + +### Go + +### Rust + +### Javascript + +### TypeScript + +### PhP + +### Swift + +### Scala + +### C# + +### Dart + +### C + + diff --git "a/problems/kamacoder/0104.\345\273\272\351\200\240\346\234\200\345\244\247\345\262\233\345\261\277.md" "b/problems/kamacoder/0104.\345\273\272\351\200\240\346\234\200\345\244\247\345\262\233\345\261\277.md" index 927b20b2d3..a1be8fb12a 100644 --- "a/problems/kamacoder/0104.\345\273\272\351\200\240\346\234\200\345\244\247\345\262\233\345\261\277.md" +++ "b/problems/kamacoder/0104.\345\273\272\351\200\240\346\234\200\345\244\247\345\262\233\345\261\277.md" @@ -252,3 +252,30 @@ int main() { } ``` + +## 其他语言版本 + +### Java + +### Python + +### Go + +### Rust + +### Javascript + +### TypeScript + +### PhP + +### Swift + +### Scala + +### C# + +### Dart + +### C + diff --git "a/problems/kamacoder/0105.\346\234\211\345\220\221\345\233\276\347\232\204\345\256\214\345\205\250\345\217\257\350\276\276\346\200\247.md" "b/problems/kamacoder/0105.\346\234\211\345\220\221\345\233\276\347\232\204\345\256\214\345\205\250\345\217\257\350\276\276\346\200\247.md" index 81f4f6f0ac..9903b6d7b4 100644 --- "a/problems/kamacoder/0105.\346\234\211\345\220\221\345\233\276\347\232\204\345\256\214\345\205\250\345\217\257\350\276\276\346\200\247.md" +++ "b/problems/kamacoder/0105.\346\234\211\345\220\221\345\233\276\347\232\204\345\256\214\345\205\250\345\217\257\350\276\276\346\200\247.md" @@ -282,3 +282,30 @@ int main() { ``` + +## 其他语言版本 + +### Java + +### Python + +### Go + +### Rust + +### Javascript + +### TypeScript + +### PhP + +### Swift + +### Scala + +### C# + +### Dart + +### C + diff --git "a/problems/kamacoder/0106.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" "b/problems/kamacoder/0106.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" index 4e285a9eec..2233c2db96 100644 --- "a/problems/kamacoder/0106.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" +++ "b/problems/kamacoder/0106.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" @@ -152,3 +152,30 @@ int main() { } ``` + +## 其他语言版本 + +### Java + +### Python + +### Go + +### Rust + +### Javascript + +### TypeScript + +### PhP + +### Swift + +### Scala + +### C# + +### Dart + +### C + diff --git "a/problems/kamacoder/0107.\345\257\273\346\211\276\345\255\230\345\234\250\347\232\204\350\267\257\345\276\204.md" "b/problems/kamacoder/0107.\345\257\273\346\211\276\345\255\230\345\234\250\347\232\204\350\267\257\345\276\204.md" index d769518098..30b8e58701 100644 --- "a/problems/kamacoder/0107.\345\257\273\346\211\276\345\255\230\345\234\250\347\232\204\350\267\257\345\276\204.md" +++ "b/problems/kamacoder/0107.\345\257\273\346\211\276\345\255\230\345\234\250\347\232\204\350\267\257\345\276\204.md" @@ -153,3 +153,30 @@ int main() { } ``` + +## 其他语言版本 + +### Java + +### Python + +### Go + +### Rust + +### Javascript + +### TypeScript + +### PhP + +### Swift + +### Scala + +### C# + +### Dart + +### C + diff --git "a/problems/kamacoder/0108.\345\206\227\344\275\231\350\277\236\346\216\245.md" "b/problems/kamacoder/0108.\345\206\227\344\275\231\350\277\236\346\216\245.md" index de0a0c6fca..4e8ea4cfcf 100644 --- "a/problems/kamacoder/0108.\345\206\227\344\275\231\350\277\236\346\216\245.md" +++ "b/problems/kamacoder/0108.\345\206\227\344\275\231\350\277\236\346\216\245.md" @@ -48,7 +48,7 @@ 这里我依然降调一下,并查集可以解决什么问题:两个节点是否在一个集合,也可以将两个节点添加到一个集合中。 -如果还不了解并查集,可以看这里:[并查集理论基础](https://programmercarl.com/图论并查集理论基础.html) +如果还不了解并查集,可以看这里:[并查集理论基础](./图论并查集理论基础.md) 我们再来看一下这道题目。 @@ -126,3 +126,30 @@ int main() { 可以看出,主函数的代码很少,就判断一下边的两个节点在不在同一个集合就可以了。 + +## 其他语言版本 + +### Java + +### Python + +### Go + +### Rust + +### Javascript + +### TypeScript + +### PhP + +### Swift + +### Scala + +### C# + +### Dart + +### C + diff --git "a/problems/kamacoder/0109.\345\206\227\344\275\231\350\277\236\346\216\245II.md" "b/problems/kamacoder/0109.\345\206\227\344\275\231\350\277\236\346\216\245II.md" index 4f3bbf0a05..09b6118b64 100644 --- "a/problems/kamacoder/0109.\345\206\227\344\275\231\350\277\236\346\216\245II.md" +++ "b/problems/kamacoder/0109.\345\206\227\344\275\231\350\277\236\346\216\245II.md" @@ -238,3 +238,30 @@ int main() { getRemoveEdge(edges); } ``` + +## 其他语言版本 + +### Java + +### Python + +### Go + +### Rust + +### Javascript + +### TypeScript + +### PhP + +### Swift + +### Scala + +### C# + +### Dart + +### C + diff --git "a/problems/kamacoder/0110.\345\255\227\347\254\246\344\270\262\346\216\245\351\276\231.md" "b/problems/kamacoder/0110.\345\255\227\347\254\246\344\270\262\346\216\245\351\276\231.md" index 81c1a33dca..cac33c2304 100644 --- "a/problems/kamacoder/0110.\345\255\227\347\254\246\344\270\262\346\216\245\351\276\231.md" +++ "b/problems/kamacoder/0110.\345\255\227\347\254\246\344\270\262\346\216\245\351\276\231.md" @@ -147,3 +147,30 @@ int main() { 当然本题也可以用双向BFS,就是从头尾两端进行搜索,大家感兴趣,可以自己去实现,这里就不再做详细讲解了。 + +## 其他语言版本 + +### Java + +### Python + +### Go + +### Rust + +### Javascript + +### TypeScript + +### PhP + +### Swift + +### Scala + +### C# + +### Dart + +### C + diff --git "a/problems/kamacoder/0117.\350\275\257\344\273\266\346\236\204\345\273\272.md" "b/problems/kamacoder/0117.\350\275\257\344\273\266\346\236\204\345\273\272.md" index 7229489b6a..1cd9a983b1 100644 --- "a/problems/kamacoder/0117.\350\275\257\344\273\266\346\236\204\345\273\272.md" +++ "b/problems/kamacoder/0117.\350\275\257\344\273\266\346\236\204\345\273\272.md" @@ -1,7 +1,7 @@ # 拓扑排序精讲 -[卡码网:软件构建](https://kamacoder.com/problempage.php?pid=1191) +[卡码网:117. 软件构建](https://kamacoder.com/problempage.php?pid=1191) 题目描述: @@ -128,7 +128,7 @@ ## 模拟过程 -用本题的示例来模拟一下这一过程: +用本题的示例来模拟这一过程: 1、找到入度为0 的节点,加入结果集 @@ -180,7 +180,9 @@ 这个图,我们只能将入度为0 的节点0 接入结果集。 之后,节点1、2、3、4 形成了环,找不到入度为0 的节点了,所以此时结果集里只有一个元素。 + 那么如果我们发现结果集元素个数 不等于 图中节点个数,我们就可以认定图中一定有 有向环! + 这也是拓扑排序判断有向环的方法。 通过以上过程的模拟大家会发现这个拓扑排序好像不难,还有点简单。 @@ -296,42 +298,69 @@ using namespace std; int main() { int m, n, s, t; cin >> n >> m; - vector inDegree(n, 0); // 记录每个节点的入度 + vector inDegree(n, 0); // 记录每个文件的入度 - unordered_map> umap;// 记录节点依赖关系 + unordered_map> umap;// 记录文件依赖关系 vector result; // 记录结果 while (m--) { // s->t,先有s才能有t cin >> s >> t; inDegree[t]++; // t的入度加一 - umap[s].push_back(t); // 记录s指向哪些节点 + umap[s].push_back(t); // 记录s指向哪些文件 } queue que; for (int i = 0; i < n; i++) { - // 入度为0的节点,可以作为开头,先加入队列 + // 入度为0的文件,可以作为开头,先加入队列 if (inDegree[i] == 0) que.push(i); //cout << inDegree[i] << endl; } // int count = 0; while (que.size()) { - int cur = que.front(); // 当前选中的节点 + int cur = que.front(); // 当前选中的文件 que.pop(); //count++; result.push_back(cur); - vector files = umap[cur]; //获取该节点指向的节点 - if (files.size()) { // cur有后续节点 + vector files = umap[cur]; //获取该文件指向的文件 + if (files.size()) { // cur有后续文件 for (int i = 0; i < files.size(); i++) { - inDegree[files[i]] --; // cur的指向的节点入度-1 + inDegree[files[i]] --; // cur的指向的文件入度-1 if(inDegree[files[i]] == 0) que.push(files[i]); } } } - // 判断是否有有向环 if (result.size() == n) { - // 注意输出格式,最后一个元素后面没有空格 - for (int i = 0; i < n - 2; i++) cout << result[i] << " "; + for (int i = 0; i < n - 1; i++) cout << result[i] << " "; cout << result[n - 1]; } else cout << -1 << endl; + + } ``` + +## 其他语言版本 + +### Java + +### Python + +### Go + +### Rust + +### Javascript + +### TypeScript + +### PhP + +### Swift + +### Scala + +### C# + +### Dart + +### C + diff --git "a/problems/kamacoder/0121.\345\244\247\346\225\260\345\207\217\346\263\225.md" "b/problems/kamacoder/0121.\345\244\247\346\225\260\345\207\217\346\263\225.md" new file mode 100644 index 0000000000..a36f2cbbe7 --- /dev/null +++ "b/problems/kamacoder/0121.\345\244\247\346\225\260\345\207\217\346\263\225.md" @@ -0,0 +1,89 @@ + +# 大数减法 + +本题测试数据超过int 和 longlong了,所以考察的使用 string 来模拟 两个大数的 加减操作。 + +当然如果使用python或者Java 使用库函数都可以水过。 + +使用字符串来模拟过程,需要处理以下几个问题: + +* 负号处理:要考虑正负数的处理,如果大数相减的结果是负数,需要在结果前加上负号。 +* 大数比较:在进行减法之前,需要确定哪个数大,以便知道结果是否需要添加负号。 +* 位数借位:处理大数相减时的借位问题,这类似于手动减法。 + +```CPP +#include +#include +#include +using namespace std; + +// 比较两个字符串表示的数字,返回1表示a > b,0表示a == b,-1表示a < b +int compareStrings(const string& a, const string& b) { + if (a.length() > b.length()) return 1; + if (a.length() < b.length()) return -1; + return a.compare(b); +} + +// 去除字符串左侧的前导零 +string removeLeadingZeros(const string& num) { + size_t start = 0; + while (start < num.size() && num[start] == '0') { + start++; + } + return start == num.size() ? "0" : num.substr(start); +} + +// 大数相减,假设a >= b +string subtractStrings(const string& a, const string& b) { + string result; + int len1 = a.length(), len2 = b.length(); + int carry = 0; + + for (int i = 0; i < len1; i++) { + int digitA = a[len1 - 1 - i] - '0'; + int digitB = i < len2 ? b[len2 - 1 - i] - '0' : 0; + + int digit = digitA - digitB - carry; + if (digit < 0) { + digit += 10; + carry = 1; + } else { + carry = 0; + } + + result.push_back(digit + '0'); + } + + // 去除结果中的前导零 + reverse(result.begin(), result.end()); + return removeLeadingZeros(result); +} + +string subtractLargeNumbers(const string& num1, const string& num2) { + string a = num1, b = num2; + + // 比较两个数的大小 + int cmp = compareStrings(a, b); + + if (cmp == 0) { + return "0"; // 如果两个数相等,结果为0 + } else if (cmp < 0) { + // 如果a < b,交换它们并在结果前加上负号 + swap(a, b); + return "-" + subtractStrings(a, b); + } else { + return subtractStrings(a, b); + } +} + +int main() { + string num1, num2; + cin >> num1 >> num2; + + string result = subtractLargeNumbers(num1, num2); + cout << result << endl; + + return 0; +} + +``` diff --git "a/problems/kamacoder/0122.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" "b/problems/kamacoder/0122.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" new file mode 100644 index 0000000000..7820d01e59 --- /dev/null +++ "b/problems/kamacoder/0122.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" @@ -0,0 +1,127 @@ + +# 滑动窗口最大值 + +本题是 [代码随想录:滑动窗口最大值](https://www.programmercarl.com/0239.%E6%BB%91%E5%8A%A8%E7%AA%97%E5%8F%A3%E6%9C%80%E5%A4%A7%E5%80%BC.html) 的升级版。 + +在[代码随想录:滑动窗口最大值](https://www.programmercarl.com/0239.%E6%BB%91%E5%8A%A8%E7%AA%97%E5%8F%A3%E6%9C%80%E5%A4%A7%E5%80%BC.html) 中详细讲解了如何求解 滑动窗口的最大值。 + +那么求滑动窗口的最小值原理也是一样的, 大家稍加思考,把优先级队列里的 大于 改成小于 就行了。 + +求最大值的优先级队列(从大到小) +``` +while (!que.empty() && value > que.back()) { +``` + +求最小值的优先级队列(从小到大) +``` +while (!que.empty() && value > que.back()) { +``` + +这样在滑动窗口里 最大值最小值都求出来了,遍历一遍找出 差值最大的就好。 + +至于输入,需要一波字符串处理,比较考察基本功。 + +CPP代码如下: + +```CPP +#include +#include +#include +#include +#include +using namespace std; +class MyBigQueue { //单调队列(从大到小) +public: + deque que; // 使用deque来实现单调队列 + // 每次弹出的时候,比较当前要弹出的数值是否等于队列出口元素的数值,如果相等则弹出。 + // 同时pop之前判断队列当前是否为空。 + void pop(int value) { + if (!que.empty() && value == que.front()) { + que.pop_front(); + } + } + // 如果push的数值大于入口元素的数值,那么就将队列后端的数值弹出,直到push的数值小于等于队列入口元素的数值为止。 + // 这样就保持了队列里的数值是单调从大到小的了。 + void push(int value) { + while (!que.empty() && value > que.back()) { + que.pop_back(); + } + que.push_back(value); + + } + // 查询当前队列里的最大值 直接返回队列前端也就是front就可以了。 + int front() { + return que.front(); + } +}; + +class MySmallQueue { //单调队列(从小到大) +public: + deque que; + + void pop(int value) { + if (!que.empty() && value == que.front()) { + que.pop_front(); + } + } + + // 和上面队列的区别是这里换成了小于, + void push(int value) { + while (!que.empty() && value < que.back()) { + que.pop_back(); + } + que.push_back(value); + + } + + int front() { + return que.front(); + } +}; + +int main() { + string input; + + getline(cin, input); + + vector nums; + int k; + + // 找到并截取nums的部分 + int numsStart = input.find('['); + int numsEnd = input.find(']'); + string numsStr = input.substr(numsStart + 1, numsEnd - numsStart - 1); + // cout << numsStr << endl; + + // 用字符串流处理nums字符串,提取数字 + stringstream ss(numsStr); + string temp; + while (getline(ss, temp, ',')) { + nums.push_back(stoi(temp)); + } + + // 找到并提取k的值 + int kStart = input.find("k = ") + 4; + k = stoi(input.substr(kStart)); + + MyBigQueue queB; // 获取区间最大值 + MySmallQueue queS; // 获取区间最小值 + // vector result; + for (int i = 0; i < k; i++) { // 先将前k的元素放进队列 + queB.push(nums[i]); + queS.push(nums[i]); + } + + int result = queB.front() - queS.front(); + for (int i = k; i < nums.size(); i++) { + queB.pop(nums[i - k]); // 滑动窗口移除最前面元素 + queB.push(nums[i]); // 滑动窗口前加入最后面的元素 + + queS.pop(nums[i - k]); + queS.push(nums[i]); + + result = max (result, queB.front() - queS.front()); + } + cout << result << endl; +} +``` diff --git "a/problems/kamacoder/0123.\345\260\217\347\272\242\347\232\204\346\225\260\347\273\204\346\236\204\351\200\240.md" "b/problems/kamacoder/0123.\345\260\217\347\272\242\347\232\204\346\225\260\347\273\204\346\236\204\351\200\240.md" new file mode 100644 index 0000000000..ef66dec8bc --- /dev/null +++ "b/problems/kamacoder/0123.\345\260\217\347\272\242\347\232\204\346\225\260\347\273\204\346\236\204\351\200\240.md" @@ -0,0 +1,52 @@ + +121. 小红的数组构造 + +本题大家不要想着真去模拟数组的情况,那样就想复杂了。 + +数组只能是:1k、2k、3k ... (n-1)k、nk,这样 总和就是最小的。 + +注意最后的和可能超过int,所以用 long long。 + +代码如下: + +```CPP +#include +using namespace std; +int main () { + long long result = 0; + int n, k; + cin >> n >> k; + for (int i = 1; i <= n; i++) { + result += i * k; + } + cout << result << endl; +} +``` + +优化思路: + + +由于要计算1到n的整数之和,可以利用等差数列求和公式来优化计算。 + +和公式:1 + 2 + 3 + ... + n = n * (n + 1) / 2 + +因此,总和 result = k * (n * (n + 1) / 2) + +```CPP + +#include +using namespace std; + +int main() { + long long result = 0; + int n, k; + cin >> n >> k; + + // 使用等差数列求和公式进行计算 + result = k * (n * (n + 1LL) / 2); + + cout << result << endl; + return 0; +} + +``` diff --git "a/problems/kamacoder/0124.\347\262\276\345\215\216\345\270\226\345\255\220.md" "b/problems/kamacoder/0124.\347\262\276\345\215\216\345\270\226\345\255\220.md" new file mode 100644 index 0000000000..2855c89efa --- /dev/null +++ "b/problems/kamacoder/0124.\347\262\276\345\215\216\345\270\226\345\255\220.md" @@ -0,0 +1,38 @@ + + +# 122.精华帖子 + + +开辟一个数组,默认都是0,把精华帖标记为1. + +使用前缀和,快速计算出,k 范围内 有多少个精华帖。 + +前缀和要特别注意区间问题,即 vec[i+k] - vec[i] 求得区间和是 (i, i + k] 这个区间,注意这是一个左开右闭的区间。 + +所以前缀和 很容易漏掉 vec[0] 这个数值的计算 + +```CPP +#include +#include +using namespace std; +int main() { + int n, m, k, l, r; + cin >> n >> m >> k; + vector vec(n); + while (m--) { + cin >> l >> r; + for (int i = l; i < r; i++) vec[i] = 1; + } + int result = 0; + for (int i = 0; i < k; i++) result += vec[i]; // 提前预处理result,包含vec[0]的区间,否则前缀和容易漏掉这个区间 + + for (int i = 1; i < n; i++) { + vec[i] += vec[i - 1]; + } + + for (int i = 0; i < n - k; i++) { + result = max (result, vec[i + k] - vec[i]); + } + cout << result << endl; +} +``` diff --git "a/problems/kamacoder/0125.\350\277\236\347\273\255\345\255\220\346\225\260\347\273\204\346\234\200\345\244\247\345\222\214.md" "b/problems/kamacoder/0125.\350\277\236\347\273\255\345\255\220\346\225\260\347\273\204\346\234\200\345\244\247\345\222\214.md" new file mode 100644 index 0000000000..32833b2fb2 --- /dev/null +++ "b/problems/kamacoder/0125.\350\277\236\347\273\255\345\255\220\346\225\260\347\273\204\346\234\200\345\244\247\345\222\214.md" @@ -0,0 +1,66 @@ + +# 123.连续子数组最大和 + +这道题目可以说是 [代码随想录,动态规划:最大子序和](https://www.programmercarl.com/0053.%E6%9C%80%E5%A4%A7%E5%AD%90%E5%BA%8F%E5%92%8C%EF%BC%88%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92%EF%BC%89.html) 的升级版。 + +题目求的是 可以替换一个数字 之后 的 连续子数组最大和。 + +如果替换的是数组下标 i 的元素。 + +那么可以用 [代码随想录,动态规划:最大子序和](https://www.programmercarl.com/0053.%E6%9C%80%E5%A4%A7%E5%AD%90%E5%BA%8F%E5%92%8C%EF%BC%88%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92%EF%BC%89.html) 的方法,先求出 [0 - i) 区间的 最大子序和 dp1 和 (i, n)的最大子序和dp2 。 + +然后在遍历一遍i, 计算 dp1 + dp2 + vec[i] 的最大值就可以。 + +正序遍历,求出 [0 - i) 区间的 最大子序,dp[ i - 1] 表示 是 包括下标i - 1(以vec[i - 1]为结尾)的最大连续子序列和为dp[i - 1]。 + +所以 在计算区间 (i, n)即 dp2 的时候,我们要倒叙。 因为我们求的是以 包括下标i + 1 为起始位置的最大连续子序列和为dp[i + 1]。 + +这样 dp1 + dp2 + vec[i] 才是一个完整区间。 + +这里就体现出对 dp数组定义的把控,本题如果对 dp数组含义理解不清,其实是不容易做出来的。 + +代码: + +```CPP +#include +#include +#include +using namespace std; +int main() { + int t, n, x; + cin >> t; + while (t--) { + cin >> n >> x; + vector vec(n); + for (int i = 0; i < n; i++) cin >> vec[i]; + vector dp1(n); + dp1[0] = vec[0]; + int res = vec[0]; + // 从前向后统计最大子序和 + for (int i = 1; i < n; i++) { + dp1[i] = max(dp1[i - 1] + vec[i], vec[i]); // 状态转移公式 + res = max(res, dp1[i]); + } + + res = max(res, vec[n - 1]); + // 从后向前统计最大子序和 + vector dp2(n); + dp2[n - 1] = vec[n - 1]; + for (int i = n - 2; i >= 0; i--) { + dp2[i] = max(dp2[i + 1] + vec[i], vec[i]); + + } + + for (int i = 0 ; i < n ; i++) { + int dp1res = 0; + if (i > 0) dp1res = max(dp1[i-1], 0); + int dp2res = 0; + if (i < n - 1 ) dp2res = max(dp2[i+1], 0); + + res = max(res, dp1res + dp2res + x); + } + cout << res << endl; + } + +} +``` diff --git "a/problems/kamacoder/0126.\351\252\221\345\243\253\347\232\204\346\224\273\345\207\273astar.md" "b/problems/kamacoder/0126.\351\252\221\345\243\253\347\232\204\346\224\273\345\207\273astar.md" new file mode 100644 index 0000000000..fe510ae25c --- /dev/null +++ "b/problems/kamacoder/0126.\351\252\221\345\243\253\347\232\204\346\224\273\345\207\273astar.md" @@ -0,0 +1,361 @@ + +# A * 算法精讲 (A star算法) + +[卡码网:126. 骑士的攻击](https://kamacoder.com/problempage.php?pid=1203) + +题目描述 + +在象棋中,马和象的移动规则分别是“马走日”和“象走田”。现给定骑士的起始坐标和目标坐标,要求根据骑士的移动规则,计算从起点到达目标点所需的最短步数。 + +棋盘大小 1000 x 1000(棋盘的 x 和 y 坐标均在 [1, 1000] 区间内,包含边界) + +输入描述 + +第一行包含一个整数 n,表示测试用例的数量。 + +接下来的 n 行,每行包含四个整数 a1, a2, b1, b2,分别表示骑士的起始位置 (a1, a2) 和目标位置 (b1, b2)。 + +输出描述 + +输出共 n 行,每行输出一个整数,表示骑士从起点到目标点的最短路径长度。 + +输入示例 + +``` +6 +5 2 5 4 +1 1 2 2 +1 1 8 8 +1 1 8 7 +2 1 3 3 +4 6 4 6 +``` + +输出示例 + +``` +2 +4 +6 +5 +1 +0 +``` + +## 思路 + +我们看到这道题目的第一个想法就是广搜,这也是最经典的广搜类型题目。 + +这里我直接给出广搜的C++代码: + +```CPP +#include +#include +#include +using namespace std; +int moves[1001][1001]; +int dir[8][2]={-2,-1,-2,1,-1,2,1,2,2,1,2,-1,1,-2,-1,-2}; +void bfs(int a1,int a2, int b1, int b2) +{ + queue q; + q.push(a1); + q.push(a2); + while(!q.empty()) + { + int m=q.front(); q.pop(); + int n=q.front(); q.pop(); + if(m == b1 && n == b2) + break; + for(int i=0;i<8;i++) + { + int mm=m + dir[i][0]; + int nn=n + dir[i][1]; + if(mm < 1 || mm > 1000 || nn < 1 || nn > 1000) + continue; + if(!moves[mm][nn]) + { + moves[mm][nn]=moves[m][n]+1; + q.push(mm); + q.push(nn); + } + } + } +} + +int main() +{ + int n, a1, a2, b1, b2; + cin >> n; + while (n--) { + cin >> a1 >> a2 >> b1 >> b2; + memset(moves,0,sizeof(moves)); + bfs(a1, a2, b1, b2); + cout << moves[b1][b2] << endl; + } + return 0; +} + +``` + +提交后,大家会发现,超时了。 + +因为本题地图足够大,且 n 也有可能很大,导致有非常多的查询。 + +我们来看一下广搜的搜索过程,如图,红色是起点,绿色是终点,黄色是要遍历的点,最后从 起点 找到 达到终点的最短路径是棕色。 + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240611143712.png) + +可以看出 广搜中,做了很多无用的遍历, 黄色的格子是广搜遍历到的点。 + +这里我们能不能让便利方向,向这终点的方向去遍历呢? + +这样我们就可以避免很多无用遍历。 + + +## Astar + +Astar 是一种 广搜的改良版。 有的是 Astar是 dijkstra 的改良版。 + +其实只是场景不同而已 我们在搜索最短路的时候, 如果是无权图(边的权值都是1) 那就用广搜,代码简洁,时间效率和 dijkstra 差不多 (具体要取决于图的稠密) + +如果是有权图(边有不同的权值),优先考虑 dijkstra。 + +而 Astar 关键在于 启发式函数, 也就是 影响 广搜或者 dijkstra 从 容器(队列)里取元素的优先顺序。 + +以下,我用BFS版本的A * 来进行讲解。 + +在BFS中,我们想搜索,从起点到终点的最短路径,要一层一层去遍历。 + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240611143712.png) + +如果 使用A * 的话,其搜索过程是这样的,如图,图中着色的都是我们要遍历的点。 + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240611195223.png) + + +(上面两图中 最短路长度都是8,只是走的方式不同而已) + +大家可以发现 **BFS 是没有目的性的 一圈一圈去搜索, 而 A * 是有方向性的去搜索**。 + +看出 A * 可以节省很多没有必要的遍历步骤。 + +为了让大家可以明显看到区别,我将 BFS 和 A * 制作成可视化动图,大家可以自己看看动图,效果更好。 + +地址:https://kamacoder.com/tools/knight.html + +那么 A * 为什么可以有方向性的去搜索,它的如何知道方向呢? + +**其关键在于 启发式函数**。 + +那么启发式函数落实到代码处,如果指引搜索的方向? + +在本篇开篇中给出了BFS代码,指引 搜索的方向的关键代码在这里: + +```CPP +int m=q.front();q.pop(); +int n=q.front();q.pop(); +``` + +从队列里取出什么元素,接下来就是从哪里开始搜索。 + +**所以 启发式函数 要影响的就是队列里元素的排序**! + +这是影响BFS搜索方向的关键。 + +对队列里节点进行排序,就需要给每一个节点权值,如何计算权值呢? + +每个节点的权值为F,给出公式为:F = G + H + +G:起点达到目前遍历节点的距离 + +F:目前遍历的节点到达终点的距离 + +起点达到目前遍历节点的距离 + 目前遍历的节点到达终点的距离 就是起点到达终点的距离。 + +本题的图是无权网格状,在计算两点距离通常有如下三种计算方式: + +1. 曼哈顿距离,计算方式: d = abs(x1-x2)+abs(y1-y2) +2. 欧氏距离(欧拉距离) ,计算方式:d = sqrt( (x1-x2)^2 + (y1-y2)^2 ) +3. 切比雪夫距离,计算方式:d = max(abs(x1 - x2), abs(y1 - y2)) + +x1, x2 为起点坐标,y1, y2 为终点坐标 ,abs 为求绝对值,sqrt 为求开根号, + +选择哪一种距离计算方式 也会导致 A * 算法的结果不同。 + +本题,采用欧拉距离才能最大程度体现 点与点之间的距离。 + +所以 使用欧拉距离计算 和 广搜搜出来的最短路的节点数是一样的。 (路径可能不同,但路径上的节点数是相同的) + +我在制作动画演示的过程中,分别给出了曼哈顿、欧拉以及契比雪夫 三种计算方式下,A * 算法的寻路过程,大家可以自己看看看其区别。 + +动画地址:https://kamacoder.com/tools/knight.html + +计算出来 F 之后,按照 F 的 大小,来选去出队列的节点。 + +可以使用 优先级队列 帮我们排好序,每次出队列,就是F最大的节点。 + +实现代码如下:(启发式函数 采用 欧拉距离计算方式) + +```CPP +#include +#include +#include +using namespace std; +int moves[1001][1001]; +int dir[8][2]={-2,-1,-2,1,-1,2,1,2,2,1,2,-1,1,-2,-1,-2}; +int b1, b2; +// F = G + H +// G = 从起点到该节点路径消耗 +// H = 该节点到终点的预估消耗 + +struct Knight{ + int x,y; + int g,h,f; + bool operator < (const Knight & k) const{ // 重载运算符, 从小到大排序 + return k.f < f; + } +}; + +priority_queue que; + +int Heuristic(const Knight& k) { // 欧拉距离 + return (k.x - b1) * (k.x - b1) + (k.y - b2) * (k.y - b2); // 统一不开根号,这样可以提高精度 +} +void astar(const Knight& k) +{ + Knight cur, next; + que.push(k); + while(!que.empty()) + { + cur=que.top(); que.pop(); + if(cur.x == b1 && cur.y == b2) + break; + for(int i = 0; i < 8; i++) + { + next.x = cur.x + dir[i][0]; + next.y = cur.y + dir[i][1]; + if(next.x < 1 || next.x > 1000 || next.y < 1 || next.y > 1000) + continue; + if(!moves[next.x][next.y]) + { + moves[next.x][next.y] = moves[cur.x][cur.y] + 1; + + // 开始计算F + next.g = cur.g + 5; // 统一不开根号,这样可以提高精度,马走日,1 * 1 + 2 * 2 = 5 + next.h = Heuristic(next); + next.f = next.g + next.h; + que.push(next); + } + } + } +} + +int main() +{ + int n, a1, a2; + cin >> n; + while (n--) { + cin >> a1 >> a2 >> b1 >> b2; + memset(moves,0,sizeof(moves)); + Knight start; + start.x = a1; + start.y = a2; + start.g = 0; + start.h = Heuristic(start); + start.f = start.g + start.h; + astar(start); + while(!que.empty()) que.pop(); // 队列清空 + cout << moves[b1][b2] << endl; + } + return 0; +} + +``` + +## 复杂度分析 + +A * 算法的时间复杂度 其实是不好去量化的,因为他取决于 启发式函数怎么写。 + +最坏情况下,A * 退化成广搜,算法的时间复杂度 是 O(n * 2),n 为节点数量。 + +最佳情况,是从起点直接到终点,时间复杂度为 O(dlogd),d 为起点到终点的深度。 + +因为在搜索的过程中也需要堆排序,所以是 O(dlogd)。 + +实际上 A * 的时间复杂度是介于 最优 和最坏 情况之间, 可以 非常粗略的认为 A * 算法的时间复杂度是 O(nlogn) ,n 为节点数量。 + +A * 算法的空间复杂度 O(b ^ d) ,d 为起点到终点的深度,b 是 图中节点间的连接数量,本题因为是无权网格图,所以 节点间连接数量为 4。 + + +## 拓展 + +如果本题大家使用 曼哈顿距离 或者 切比雪夫距离 计算的话,可以提交试一试,有的最短路结果是并不是最短的。 + +原因也是 曼哈顿 和 切比雪夫这两种计算方式在 本题的网格地图中,都没有体现出点到点的真正距离! + +可能有些录友找到类似的题目,例如 [poj 2243](http://poj.org/problem?id=2243),使用 曼哈顿距离 提交也过了, 那是因为题目中的地图太小了,仅仅是一张 8 * 8的地图,根本看不出来 不同启发式函数写法的区别。 + +A * 算法 并不是一个明确的最短路算法,**A * 算法搜的路径如何,完全取决于 启发式函数怎么写**。 + +**A * 算法并不能保证一定是最短路**,因为在设计 启发式函数的时候,要考虑 时间效率与准确度之间的一个权衡。 + +虽然本题中,A * 算法得到是最短路,也是因为本题 启发式函数 和 地图结构都是最简单的。 + +例如在游戏中,在地图很大、不同路径权值不同、有障碍 且多个游戏单位在地图中寻路的情况,如果要计算准确最短路,耗时很大,会给玩家一种卡顿的感觉。 + +而真实玩家在玩游戏的时候,并不要求一定是最短路,次短路也是可以的 (玩家不一定能感受出来,及时感受出来也不是很在意),只要奔着目标走过去 大体就可以接受。 + +所以 在游戏开发设计中,**保证运行效率的情况下,A * 算法中的启发式函数 设计往往不是最短路,而是接近最短路的 次短路设计**。 + +大家如果玩 LOL,或者 王者荣耀 可以回忆一下:如果 从很远的地方点击 让英雄直接跑过去 是 跑的路径是不靠谱的,所以玩家们才会在 距离英雄尽可能近的位置去点击 让英雄跑过去。 + +## A * 的缺点 + +大家看上述 A * 代码的时候,可以看到 我们想 队列里添加了很多节点,但真正从队列里取出来的 仅仅是 靠启发式函数判断 距离终点最近的节点。 + +相对了 普通BFS,A * 算法只从 队列里取出 距离终点最近的节点。 + +那么问题来了,A * 在一次路径搜索中,大量不需要访问的节点都在队列里,会造成空间的过度消耗。 + +IDA * 算法 对这一空间增长问题进行了优化,关于 IDA * 算法,本篇不再做讲解,感兴趣的录友可以自行找资料学习。 + +另外还有一种场景 是 A * 解决不了的。 + +如果题目中,给出 多个可能的目标,然后在这多个目标中 选择最近的目标,这种 A * 就不擅长了, A * 只擅长给出明确的目标 然后找到最短路径。 + +如果是多个目标找最近目标(特别是潜在目标数量很多的时候),可以考虑 Dijkstra ,BFS 或者 Floyd。 + + +## 其他语言版本 + +### Java + +### Python + +### Go + +### Rust + +### Javascript + +### TypeScript + +### PhP + +### Swift + +### Scala + +### C# + +### Dart + +### C + + + + + + + + diff --git "a/problems/kamacoder/\345\233\276\350\256\272\345\271\266\346\237\245\351\233\206\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/kamacoder/\345\233\276\350\256\272\345\271\266\346\237\245\351\233\206\347\220\206\350\256\272\345\237\272\347\241\200.md" index 3bf45f77f1..e463b95600 100644 --- "a/problems/kamacoder/\345\233\276\350\256\272\345\271\266\346\237\245\351\233\206\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/kamacoder/\345\233\276\350\256\272\345\271\266\346\237\245\351\233\206\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -29,7 +29,7 @@ 但如果我们要判断两个元素是否在同一个集合里的时候 我们又能怎么办? 只能把而二维数组都遍历一遍。 -而且每当想添加一个元素到某集合的时候,依然需要把把二维数组组都遍历一遍,才知道要放在哪个集合里。 +而且每当想添加一个元素到某集合的时候,依然需要把把二维数组都遍历一遍,才知道要放在哪个集合里。 这仅仅是一个粗略的思路,如果沿着这个思路去实现代码,非常复杂,因为管理集合还需要很多逻辑。 @@ -208,7 +208,7 @@ bool isSame(int u, int v) { // 将v->u 这条边加入并查集 void join(int u, int v) { - if (isSame) return ; // 如果发现根相同,则说明在一个集合,不用两个节点相连直接返回 + if (isSame(u, v)) return ; // 如果发现根相同,则说明在一个集合,不用两个节点相连直接返回 father[v] = u; } ``` @@ -219,7 +219,7 @@ void join(int u, int v) { 举一个例子: -``` +```CPP join(1, 2); join(3, 2); ``` @@ -271,7 +271,7 @@ join(3, 2); 不少录友在接触并查集模板之后,用起来很娴熟,因为模板确实相对固定,但是对并查集内部数据组织方式以及如何判断是否是同一个集合的原理很模糊。 -通过以上讲解之后,我在带大家一步一步去画一下,并查集内部数据连接方式。 +通过以上讲解之后,我再带大家一步一步去画一下,并查集内部数据连接方式。 1、`join(1, 8);` @@ -301,7 +301,7 @@ join(3, 2); 即如下代码在寻找根的过程中,会有路径压缩,减少 下次查询的路径长度。 -``` +```CPP // 并查集里寻根的过程 int find(int u) { return u == father[u] ? u : father[u] = find(father[u]); // 路径压缩 diff --git "a/problems/kamacoder/\345\233\276\350\256\272\345\271\277\346\220\234\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/kamacoder/\345\233\276\350\256\272\345\271\277\346\220\234\347\220\206\350\256\272\345\237\272\347\241\200.md" index c494e0d0e2..d791d2c0ff 100644 --- "a/problems/kamacoder/\345\233\276\350\256\272\345\271\277\346\220\234\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/kamacoder/\345\233\276\350\256\272\345\271\277\346\220\234\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -1,7 +1,6 @@ # 广度优先搜索理论基础 - -在[深度优先搜索](https://programmercarl.com/图论深搜理论基础.html)的讲解中,我们就讲过深度优先搜索和广度优先搜索的区别。 +在[深度优先搜索](./图论深搜理论基础.md)的讲解中,我们就讲过深度优先搜索和广度优先搜索的区别。 广搜(bfs)是一圈一圈的搜索过程,和深搜(dfs)是一条路跑到黑然后再回溯。 @@ -88,28 +87,12 @@ void bfs(vector>& grid, vector>& visited, int x, int y } ``` -以上模板代码,就是可以直接拿来做 [200.岛屿数量](https://leetcode.cn/problems/number-of-islands/solution/by-carlsun-2-n72a/) 这道题目,唯一区别是 针对地图 grid 中有数字1的地方去做一个遍历。 - -即: - -``` -if (!visited[nextx][nexty]) { // 如果节点没被访问过 -``` - -改为 - -``` -if (!visited[nextx][nexty] && grid[nextx][nexty] == '1') { // 如果节点没被访问过且节点是可遍历的 - -``` -就可以通过 [200.岛屿数量](https://leetcode.cn/problems/number-of-islands/solution/by-carlsun-2-n72a/) 这道题目,大家可以去体验一下。 - - - ## 总结 -当然广搜还有很多细节需要注意的地方,后面我会针对广搜的题目还做针对性的讲解,因为在理论篇讲太多细节,可能会让刚学广搜的录友们越看越懵,所以细节方面针对具体题目在做讲解。 +当然广搜还有很多细节需要注意的地方,后面我会针对广搜的题目还做针对性的讲解。 + +**因为在理论篇讲太多细节,可能会让刚学广搜的录友们越看越懵**,所以细节方面针对具体题目在做讲解。 本篇我们重点讲解了广搜的使用场景,广搜的过程以及广搜的代码框架。 @@ -119,34 +102,3 @@ if (!visited[nextx][nexty] && grid[nextx][nexty] == '1') { // 如果节点没被 相信看完本篇,大家会对广搜有一个基础性的认识,后面再来做对应的题目就会得心应手一些。 -## 其他语言版本 - -### Python -```python -from collections import deque - -dir = [(0, 1), (1, 0), (-1, 0), (0, -1)] # 创建方向元素 - -def bfs(grid, visited, x, y): - - queue = deque() # 初始化队列 - queue.append((x, y)) # 放入第一个元素/起点 - visited[x][y] = True # 标记为访问过的节点 - - while queue: # 遍历队列里的元素 - - curx, cury = queue.popleft() # 取出第一个元素 - - for dx, dy in dir: # 遍历四个方向 - - nextx, nexty = curx + dx, cury + dy - - if nextx < 0 or nextx >= len(grid) or nexty < 0 or nexty >= len(grid[0]): # 越界了,直接跳过 - continue - - if not visited[nextx][nexty]: # 如果节点没被访问过 - queue.append((nextx, nexty)) # 加入队列 - visited[nextx][nexty] = True # 标记为访问过的节点 - -``` - diff --git "a/problems/kamacoder/\345\233\276\350\256\272\346\200\273\347\273\223\347\257\207.md" "b/problems/kamacoder/\345\233\276\350\256\272\346\200\273\347\273\223\347\257\207.md" index aa360bab1d..d89d6411e9 100644 --- "a/problems/kamacoder/\345\233\276\350\256\272\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/kamacoder/\345\233\276\350\256\272\346\200\273\347\273\223\347\257\207.md" @@ -3,7 +3,7 @@ 从深搜广搜 到并查集,从最小生成树到拓扑排序, 最后是最短路算法系列。 -至此算上本篇,一共32篇文章,图论之旅就在此收官了。 +至此算上本篇,一共30篇文章,图论之旅就在此收官了。 在[0098.所有可达路径](./0098.所有可达路径.md) ,我们接触了两种图的存储方式,邻接表和邻接矩阵,掌握两种图的存储方式很重要。 @@ -67,20 +67,79 @@ 其实理论基础篇就算是给大家出了一道裸的并查集题目了,所以在后面的题目安排中,会稍稍的拔高一些,重点在于并查集的应用上。 +例如 并查集可以判断这个图是否是树,因为树的话,只有一个根,符合并查集判断集合的逻辑,题目:[0108.冗余连接](./0108.冗余连接.md)。 +在[0109.冗余连接II](./0109.冗余连接II.md) 中 对有向树的判断难度更大一些,需要考虑的情况比较多。 -[0108.冗余连接](./0108.冗余连接.md), [0109.冗余连接II](./0109.冗余连接II.md) -后面的两道题目,[0108.冗余连接](./0108.冗余连接.md) 和 +## 最小生成树 +最小生成树是所有节点的最小连通子图, 即:以最小的成本(边的权值)将图中所有节点链接到一起。 +最小生成树算法,有prim 和 kruskal。 + +**prim 算法是维护节点的集合,而 Kruskal 是维护边的集合**。 + +在 稀疏图中,用Kruskal更优。 在稠密图中,用prim算法更优。 + +> 边数量较少为稀疏图,接近或等于完全图(所有节点皆相连)为稠密图 + +Prim 算法 时间复杂度为 O(n^2),其中 n 为节点数量,它的运行效率和图中边树无关,适用稠密图。 + +Kruskal算法 时间复杂度 为 O(nlogn),其中n 为边的数量,适用稀疏图。 + +关于 prim算法,我自创了三部曲,来帮助大家理解: + +1. 第一步,选距离生成树最近节点 +2. 第二步,最近节点加入生成树 +3. 第三步,更新非生成树节点到生成树的距离(即更新minDist数组) + +大家只要理解这三部曲, prim算法 至少是可以写出一个框架出来,然后在慢慢补充细节,这样不至于 自己在写prim的时候 两眼一抹黑 完全凭感觉去写。 + +**minDist数组 是prim算法的灵魂,它帮助 prim算法完成最重要的一步,就是如何找到 距离最小生成树最近的点**。 + +kruscal的主要思路: + +* 边的权值排序,因为要优先选最小的边加入到生成树里 +* 遍历排序后的边 + * 如果边首尾的两个节点在同一个集合,说明如果连上这条边图中会出现环 + * 如果边首尾的两个节点不在同一个集合,加入到最小生成树,并把两个节点加入同一个集合 + +而判断节点是否在一个集合 以及将两个节点放入同一个集合,正是并查集的擅长所在。 + +所以 Kruskal 是需要用到并查集的。 + +这也是我在代码随想录图论编排上 为什么要先 讲解 并查集 在讲解 最小生成树。 -## 最小生成树 ## 拓扑排序 +拓扑排序 是在图上的一种排序。 + +概括来说,**给出一个 有向图,把这个有向图转成线性的排序 就叫拓扑排序**。 + +同样,拓扑排序也可以检测这个有向图 是否有环,即存在循环依赖的情况。 + +拓扑排序的一些应用场景,例如:大学排课,文件下载依赖 等等。 + +只要记住如下两步拓扑排序的过程,代码就容易写了: + +1. 找到入度为0 的节点,加入结果集 +2. 将该节点从图中移除 + ## 最短路算法 +最短路算法是图论中,比较复杂的算法,而且不同的最短路算法都有不同的应用场景。 + +我在 [最短路算法总结篇](./最短路问题总结篇.md) 里已经做了一个高度的概括。 + +大家要时常温故而知新,才能透彻理解各个最短路算法。 + + +## 总结 + +到最后,图论终于剧终了,相信这是市面上大家能看到最全最细致的图论讲解教程。 +图论也是我 《代码随想录》所有章节里 所费精力最大的一个章节。 -算法4,只讲解了 Dijkstra,SPFA (Bellman-Ford算法基于队列) 和 拓扑排序, +只为了不负录友们的期待。 大家加油💪🏻 diff --git "a/problems/kamacoder/\345\233\276\350\256\272\346\267\261\346\220\234\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/kamacoder/\345\233\276\350\256\272\346\267\261\346\220\234\347\220\206\350\256\272\345\237\272\347\241\200.md" index 2be97057bf..efe833a7e1 100644 --- "a/problems/kamacoder/\345\233\276\350\256\272\346\267\261\346\220\234\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/kamacoder/\345\233\276\350\256\272\346\267\261\346\220\234\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -62,7 +62,7 @@ 正是因为dfs搜索可一个方向,并需要回溯,所以用递归的方式来实现是最方便的。 -很多录友对回溯很陌生,建议先看看代码随想录,[回溯算法章节](https://programmercarl.com/回溯算法理论基础.html)。 +很多录友对回溯很陌生,建议先看看代码随想录,[回溯算法章节](../回溯算法理论基础.md)。 有递归的地方就有回溯,那么回溯在哪里呢? @@ -78,11 +78,11 @@ void dfs(参数) { 可以看到回溯操作就在递归函数的下面,递归和回溯是相辅相成的。 -在讲解[二叉树章节](https://programmercarl.com/二叉树理论基础.html)的时候,二叉树的递归法其实就是dfs,而二叉树的迭代法,就是bfs(广度优先搜索) +在讲解[二叉树章节](../二叉树理论基础.md)的时候,二叉树的递归法其实就是dfs,而二叉树的迭代法,就是bfs(广度优先搜索) 所以**dfs,bfs其实是基础搜索算法,也广泛应用与其他数据结构与算法中**。 -我们在回顾一下[回溯法](https://programmercarl.com/回溯算法理论基础.html)的代码框架: +我们在回顾一下[回溯法](../回溯算法理论基础.md)的代码框架: ```cpp void backtracking(参数) { @@ -123,9 +123,9 @@ void dfs(参数) { ## 深搜三部曲 -在 [二叉树递归讲解](https://programmercarl.com/%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E9%80%92%E5%BD%92%E9%81%8D%E5%8E%86.html)中,给出了递归三部曲。 +在 [二叉树递归讲解](../二叉树的递归遍历.md)中,给出了递归三部曲。 -[回溯算法](https://programmercarl.com/回溯算法理论基础.html)讲解中,给出了 回溯三部曲。 +[回溯算法](../回溯算法理论基础.md)讲解中,给出了 回溯三部曲。 其实深搜也是一样的,深搜三部曲如下: diff --git "a/problems/kamacoder/\346\234\200\347\237\255\350\267\257\351\227\256\351\242\230\346\200\273\347\273\223\347\257\207.md" "b/problems/kamacoder/\346\234\200\347\237\255\350\267\257\351\227\256\351\242\230\346\200\273\347\273\223\347\257\207.md" index 7f4ee6f87d..54f9153900 100644 --- "a/problems/kamacoder/\346\234\200\347\237\255\350\267\257\351\227\256\351\242\230\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/kamacoder/\346\234\200\347\237\255\350\267\257\351\227\256\351\242\230\346\200\273\347\273\223\347\257\207.md" @@ -12,12 +12,15 @@ * bellman_ford 算法判断负权回路 * bellman_ford之单源有限最短路 * Floyd 算法精讲 +* 启发式搜索:A * 算法 最短路算法比较复杂,而且各自有各自的应用场景,我来用一张表把讲过的最短路算法的使用场景都展现出来: ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240508121355.png) +(因为A * 属于启发式搜索,和上面最短路算法并不是一类,不适合一起对比,所以没有放在一起) + 可能有同学感觉:这个表太复杂了,我记也记不住。 @@ -25,23 +28,25 @@ 这里我给大家一个大体使用场景的分析: -如果遇到单源且边为正数,直接Dijkstra。 +**如果遇到单源且边为正数,直接Dijkstra**。 -至于 使用朴素版还是 堆优化版 还是取决于图的稠密度, 多少节点多少边算是稠密图,多少算是稀疏图,这个没有量化,如果想量化只能写出两个版本然后做实验去测试,不同的判题机得出的结果还不太一样。 +至于 **使用朴素版还是 堆优化版 还是取决于图的稠密度**, 多少节点多少边算是稠密图,多少算是稀疏图,这个没有量化,如果想量化只能写出两个版本然后做实验去测试,不同的判题机得出的结果还不太一样。 一般情况下,可以直接用堆优化版本。 -如果遇到单源边可为负数,直接 Bellman-Ford,同样 SPFA 还是 Bellman-Ford 取决于图的稠密度。 +**如果遇到单源边可为负数,直接 Bellman-Ford**,同样 SPFA 还是 Bellman-Ford 取决于图的稠密度。 一般情况下,直接用 SPFA。 -如果有负权回路,优先 Bellman-Ford, 如果是有限节点最短路 也优先 Bellman-Ford,理由是写代码比较方便。 +**如果有负权回路,优先 Bellman-Ford**, 如果是有限节点最短路 也优先 Bellman-Ford,理由是写代码比较方便。 -如果是遇到多源点求最短路,直接 Floyd。 +**如果是遇到多源点求最短路,直接 Floyd**。 除非 源点特别少,且边都是正数,那可以 多次 Dijkstra 求出最短路径,但这种情况很少,一般出现多个源点了,就是想让你用 Floyd 了。 +对于A * ,由于其高效性,所以在实际工程应用中使用最为广泛 ,由于其 结果的不唯一性,也就是可能是次短路的特性,一般不适合作为算法题。 +游戏开发、地图导航、数据包路由等都广泛使用 A * 算法。 diff --git "a/problems/\346\225\260\347\273\204\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\346\225\260\347\273\204\347\220\206\350\256\272\345\237\272\347\241\200.md" index 76e618c29d..e6d25c15e6 100644 --- "a/problems/\346\225\260\347\273\204\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\346\225\260\347\273\204\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -42,8 +42,7 @@ 那么二维数组直接上图,大家应该就知道怎么回事了 -![算法通关数组2](https://code-thinking.cdn.bcebos.com/pics/%E7%AE%97%E6%B3%95%E9%80%9A%E5%85%B3%E6%95%B0%E7%BB%842.png) - +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240606105522.png) **那么二维数组在内存的空间地址是连续的么?** From 0f6ea64f68857ea7c080b820f31b88f622cab276 Mon Sep 17 00:00:00 2001 From: Jack Lin Date: Sat, 15 Jun 2024 15:11:24 +0800 Subject: [PATCH 2665/3019] Update 0242: Add C solution --- ...15\345\274\202\344\275\215\350\257\215.md" | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git "a/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" "b/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" index ac03ddbb40..61488f03fd 100644 --- "a/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" +++ "b/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" @@ -383,6 +383,31 @@ object Solution { } ``` +### C + +```c +bool isAnagram(char* s, char* t) { + int len1 = strlen(s), len2 = strlen(t); + if (len1 != len2) { + return false; + } + + int map1[26] = {0}, map2[26] = {0}; + for (int i = 0; i < len1; i++) { + map1[s[i] - 'a'] += 1; + map2[t[i] - 'a'] += 1; + } + + for (int i = 0; i < 26; i++) { + if (map1[i] != map2[i]) { + return false; + } + } + + return true; +} +``` + ## 相关题目 * [383.赎金信](https://programmercarl.com/0383.%E8%B5%8E%E9%87%91%E4%BF%A1.html) From 1d206949dd3649f997868536b66b0d268e365965 Mon Sep 17 00:00:00 2001 From: lesleyzhao Date: Sun, 16 Jun 2024 13:27:11 +0800 Subject: [PATCH 2666/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0417=E4=B8=ADCarl?= =?UTF-8?q?=E9=A2=98=E8=A7=A3C++=E4=BB=A3=E7=A0=81=E9=87=8C=E7=9A=84?= =?UTF-8?q?=E6=B3=A8=E9=87=8A=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\213\346\260\264\346\265\201\351\227\256\351\242\230.md" | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git "a/problems/0417.\345\244\252\345\271\263\346\264\213\345\244\247\350\245\277\346\264\213\346\260\264\346\265\201\351\227\256\351\242\230.md" "b/problems/0417.\345\244\252\345\271\263\346\264\213\345\244\247\350\245\277\346\264\213\346\260\264\346\265\201\351\227\256\351\242\230.md" index b8448e936d..5218b571aa 100644 --- "a/problems/0417.\345\244\252\345\271\263\346\264\213\345\244\247\350\245\277\346\264\213\346\260\264\346\265\201\351\227\256\351\242\230.md" +++ "b/problems/0417.\345\244\252\345\271\263\346\264\213\345\244\247\350\245\277\346\264\213\346\260\264\346\265\201\351\227\256\351\242\230.md" @@ -177,14 +177,14 @@ public: // 记录从大西洋出发,可以遍历的节点 vector> atlantic = vector>(n, vector(m, false)); - - // 从最上最下行的节点出发,向高处遍历 + + // 从最左最右列的节点出发,向高处遍历 for (int i = 0; i < n; i++) { dfs (heights, pacific, i, 0); // 遍历最左列,接触太平洋 dfs (heights, atlantic, i, m - 1); // 遍历最右列,接触大西 } - // 从最左最右列的节点出发,向高处遍历 + // 从最上最下行的节点出发,向高处遍历 for (int j = 0; j < m; j++) { dfs (heights, pacific, 0, j); // 遍历最上行,接触太平洋 dfs (heights, atlantic, n - 1, j); // 遍历最下行,接触大西洋 From 51f7960963061ad15bde0ff90067913d62b960ca Mon Sep 17 00:00:00 2001 From: lesleyzhao Date: Sun, 16 Jun 2024 13:50:09 +0800 Subject: [PATCH 2667/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0417Java=20DFS?= =?UTF-8?q?=E8=B7=9FCarl=20C++=E4=BB=A3=E7=A0=81=E6=80=9D=E8=B7=AF?= =?UTF-8?q?=E6=9B=B4=E4=B8=80=E8=87=B4=E7=9A=84=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...64\346\265\201\351\227\256\351\242\230.md" | 67 +++++++++++++++++++ 1 file changed, 67 insertions(+) diff --git "a/problems/0417.\345\244\252\345\271\263\346\264\213\345\244\247\350\245\277\346\264\213\346\260\264\346\265\201\351\227\256\351\242\230.md" "b/problems/0417.\345\244\252\345\271\263\346\264\213\345\244\247\350\245\277\346\264\213\346\260\264\346\265\201\351\227\256\351\242\230.md" index 5218b571aa..5156ce2289 100644 --- "a/problems/0417.\345\244\252\345\271\263\346\264\213\345\244\247\350\245\277\346\264\213\346\260\264\346\265\201\351\227\256\351\242\230.md" +++ "b/problems/0417.\345\244\252\345\271\263\346\264\213\345\244\247\350\245\277\346\264\213\346\260\264\346\265\201\351\227\256\351\242\230.md" @@ -297,6 +297,73 @@ class Solution { } ``` +```Java +class Solution { + + // 和Carl题解更加符合的Java DFS + private int[][] directions = {{-1, 0}, {1, 0}, {0, 1}, {0, -1}}; + + /** + * @param heights 题目给定的二维数组 + * @param m 当前位置的行号 + * @param n 当前位置的列号 + * @param visited 记录这个位置可以到哪条河 + */ + + public void dfs(int[][] heights, boolean[][] visited, int m, int n){ + if(visited[m][n]) return; + visited[m][n] = true; + + for(int[] dir: directions){ + int nextm = m + dir[0]; + int nextn = n + dir[1]; + //出了2D array的边界,continue + if(nextm < 0||nextm == heights.length||nextn <0||nextn== heights[0].length) continue; + //下一个位置比当下位置还要低,跳过,继续找下一个更高的位置 + if(heights[m][n] > heights[nextm][nextn]) continue; + dfs(heights, visited, nextm, nextn); + } + } + + + public List> pacificAtlantic(int[][] heights) { + int m = heights.length; + int n = heights[0].length; + + // 记录从太平洋边出发,可以遍历的节点 + boolean[][] pacific = new boolean[m][n]; + // 记录从大西洋出发,可以遍历的节点 + boolean[][] atlantic = new boolean[m][n]; + + // 从最左最右列的节点出发,向高处遍历 + for(int i = 0; i> result = new ArrayList<>(); + for(int a = 0; a pair = new ArrayList<>(); + pair.add(a); + pair.add(b); + result.add(pair); + } + } + } + return result; + } +} +``` + 广度优先遍历: ```Java From 9aca3b5ca46a3bd39bbf9e15568b5bc390d55466 Mon Sep 17 00:00:00 2001 From: jycathy Date: Sun, 16 Jun 2024 17:32:38 +0800 Subject: [PATCH 2668/3019] fix prob.1207 --- ...272\347\216\260\346\254\241\346\225\260.md" | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git "a/problems/1207.\347\213\254\344\270\200\346\227\240\344\272\214\347\232\204\345\207\272\347\216\260\346\254\241\346\225\260.md" "b/problems/1207.\347\213\254\344\270\200\346\227\240\344\272\214\347\232\204\345\207\272\347\216\260\346\254\241\346\225\260.md" index 5c5f92c339..cd89522e4e 100644 --- "a/problems/1207.\347\213\254\344\270\200\346\227\240\344\272\214\347\232\204\345\207\272\347\216\260\346\254\241\346\225\260.md" +++ "b/problems/1207.\347\213\254\344\270\200\346\227\240\344\272\214\347\232\204\345\207\272\347\216\260\346\254\241\346\225\260.md" @@ -40,9 +40,9 @@ 回归本题,**本题强调了-1000 <= arr[i] <= 1000**,那么就可以用数组来做哈希,arr[i]作为哈希表(数组)的下标,那么arr[i]可以是负数,怎么办?负数不能做数组下标。 -**此时可以定义一个2000大小的数组,例如int count[2002];**,统计的时候,将arr[i]统一加1000,这样就可以统计arr[i]的出现频率了。 +**此时可以定义一个2001大小的数组,例如int count[2001];**,统计的时候,将arr[i]统一加1000,这样就可以统计arr[i]的出现频率了。 -题目中要求的是是否有相同的频率出现,那么需要再定义一个哈希表(数组)用来记录频率是否重复出现过,bool fre[1002]; 定义布尔类型的就可以了,**因为题目中强调1 <= arr.length <= 1000,所以哈希表大小为1000就可以了**。 +题目中要求的是是否有相同的频率出现,那么需要再定义一个哈希表(数组)用来记录频率是否重复出现过,bool fre[1001]; 定义布尔类型的就可以了,**因为题目中强调1 <= arr.length <= 1000,所以哈希表大小为1000就可以了**。 如图所示: @@ -55,11 +55,11 @@ C++代码如下: class Solution { public: bool uniqueOccurrences(vector& arr) { - int count[2002] = {0}; // 统计数字出现的频率 + int count[2001] = {0}; // 统计数字出现的频率 for (int i = 0; i < arr.size(); i++) { count[arr[i] + 1000]++; } - bool fre[1002] = {false}; // 看相同频率是否重复出现 + bool fre[1001] = {false}; // 看相同频率是否重复出现 for (int i = 0; i <= 2000; i++) { if (count[i]) { if (fre[count[i]] == false) fre[count[i]] = true; @@ -78,7 +78,7 @@ public: ```java class Solution { public boolean uniqueOccurrences(int[] arr) { - int[] count = new int[2002]; + int[] count = new int[2001]; for (int i = 0; i < arr.length; i++) { count[arr[i] + 1000]++; // 防止负数作为下标 } @@ -103,10 +103,10 @@ class Solution { # 方法 1: 数组在哈西法的应用 class Solution: def uniqueOccurrences(self, arr: List[int]) -> bool: - count = [0] * 2002 + count = [0] * 2001 for i in range(len(arr)): count[arr[i] + 1000] += 1 # 防止负数作为下标 - freq = [False] * 1002 # 标记相同频率是否重复出现 + freq = [False] * 1001 # 标记相同频率是否重复出现 for i in range(2001): if count[i] > 0: if freq[count[i]] == False: @@ -139,12 +139,12 @@ class Solution: ``` javascript // 方法一:使用数组记录元素出现次数 var uniqueOccurrences = function(arr) { - const count = new Array(2002).fill(0);// -1000 <= arr[i] <= 1000 + const count = new Array(2001).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 + const fre = new Array(1001).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;//之前未出现过,标记为出现 From 2514a7abbbb7d8290324b767212466260586805d Mon Sep 17 00:00:00 2001 From: MrYoungg <151980452+MrYoungg@users.noreply.github.com> Date: Mon, 17 Jun 2024 00:02:15 +0800 Subject: [PATCH 2669/3019] =?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 --- ...27\345\256\236\347\216\260\346\240\210.md" | 47 ++++++++++++++++--- 1 file changed, 41 insertions(+), 6 deletions(-) diff --git "a/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" "b/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" index c7dc52f1cc..8b9abd35a8 100644 --- "a/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" +++ "b/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" @@ -72,6 +72,7 @@ class MyStack { public: queue que1; queue que2; // 辅助队列,用来备份 + /** Initialize your data structure here. */ MyStack() { @@ -100,9 +101,28 @@ public: return result; } - /** Get the top element. */ - int top() { - return que1.back(); + /** Get the top element. + ** Can not use back() direactly. + */ + int top(){ + int size = que1.size(); + size--; + while (size--){ + // 将que1 导入que2,但要留下最后一个元素 + que2.push(que1.front()); + que1.pop(); + } + + int result = que1.front(); // 留下的最后一个元素就是要回返的值 + que2.push(que1.front()); // 获取值后将最后一个元素也加入que2中,保持原本的结构不变 + que1.pop(); + + que1 = que2; // 再将que2赋值给que1 + while (!que2.empty()){ + // 清空que2 + que2.pop(); + } + return result; } /** Returns whether the stack is empty. */ @@ -126,14 +146,17 @@ C++优化代码 class MyStack { public: queue que; + /** Initialize your data structure here. */ MyStack() { } + /** Push element x onto stack. */ void push(int x) { que.push(x); } + /** Removes the element on top of the stack and returns that element. */ int pop() { int size = que.size(); @@ -147,9 +170,21 @@ public: return result; } - /** Get the top element. */ - int top() { - return que.back(); + /** Get the top element. + ** Can not use back() direactly. + */ + int top(){ + int size = que.size(); + size--; + while (size--){ + // 将队列头部的元素(除了最后一个元素外) 重新添加到队列尾部 + que.push(que.front()); + que.pop(); + } + int result = que.front(); // 此时获得的元素就是栈顶的元素了 + que.push(que.front()); // 将获取完的元素也重新添加到队列尾部,保证数据结构没有变化 + que.pop(); + return result; } /** Returns whether the stack is empty. */ From c4a3fe083fb5f40e232922413195f0cf8856a10f Mon Sep 17 00:00:00 2001 From: MrYoungg <151980452+MrYoungg@users.noreply.github.com> Date: Mon, 17 Jun 2024 10:18:19 +0800 Subject: [PATCH 2670/3019] =?UTF-8?q?Update=200150.=E9=80=86=E6=B3=A2?= =?UTF-8?q?=E5=85=B0=E8=A1=A8=E8=BE=BE=E5=BC=8F=E6=B1=82=E5=80=BC.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" "b/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" index d05f67bc48..48e99c5baa 100644 --- "a/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" +++ "b/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" @@ -82,7 +82,7 @@ 如动画所示: ![150.逆波兰表达式求值](https://code-thinking.cdn.bcebos.com/gifs/150.逆波兰表达式求值.gif) -相信看完动画大家应该知道,这和[1047. 删除字符串中的所有相邻重复项](https://programmercarl.com/1047.删除字符串中的所有相邻重复项.html)是差不错的,只不过本题不要相邻元素做消除了,而是做运算! +相信看完动画大家应该知道,这和[1047. 删除字符串中的所有相邻重复项](https://programmercarl.com/1047.删除字符串中的所有相邻重复项.html)是差不多的,只不过本题不要相邻元素做消除了,而是做运算! C++代码如下: From 4e6052698dccfe08529b39729f77c0da27f06345 Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Mon, 17 Jun 2024 11:53:52 +0800 Subject: [PATCH 2671/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=9B=BE=E8=AE=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 51 +++++++----- ...17\202\344\274\232dijkstra\345\240\206.md" | 2 + ...74\232dijkstra\346\234\264\347\264\240.md" | 2 + .../0053.\345\257\273\345\256\235-Kruskal.md" | 2 + .../0053.\345\257\273\345\256\235-prim.md" | 2 + ...77\346\215\242\346\225\260\345\255\227.md" | 13 --- ...13\345\255\227\347\254\246\344\270\262.md" | 11 --- ...\211\251\350\277\220\350\276\223I-SPFA.md" | 2 + ...7\347\211\251\350\277\220\350\276\223I.md" | 2 + ...\347\211\251\350\277\220\350\276\223II.md" | 2 + ...347\211\251\350\277\220\350\276\223III.md" | 2 + ...16\351\200\233\345\205\254\345\233\255.md" | 2 + ...57\350\276\276\350\267\257\345\276\204.md" | 2 + ...60\351\207\217\345\271\277\346\220\234.md" | 2 + ...60\351\207\217\346\267\261\346\220\234.md" | 2 + ...00\345\244\247\351\235\242\347\247\257.md" | 2 + ...04\346\200\273\351\235\242\347\247\257.md" | 2 + ...11\346\262\241\345\255\244\345\262\233.md" | 2 + ...64\346\265\201\351\227\256\351\242\230.md" | 2 + ...00\345\244\247\345\262\233\345\261\277.md" | 2 + ...50\345\217\257\350\276\276\346\200\247.md" | 4 +- ...77\347\232\204\345\221\250\351\225\277.md" | 2 + ...50\347\232\204\350\267\257\345\276\204.md" | 2 + ...27\344\275\231\350\277\236\346\216\245.md" | 2 + ...\344\275\231\350\277\236\346\216\245II.md" | 2 + ...46\344\270\262\346\216\245\351\276\231.md" | 2 + ...57\344\273\266\346\236\204\345\273\272.md" | 2 + ...47\346\225\260\345\207\217\346\263\225.md" | 2 + ...13\347\263\225\345\210\207\345\211\262.md" | 49 ++++++++++++ ...46\344\270\262\345\217\230\346\215\242.md" | 79 +++++++++++++++++++ ...21\344\270\212\346\237\223\350\211\262.md" | 5 ++ ...22\345\210\227\350\257\242\351\227\256.md" | 29 +++++++ ...16\350\265\260\345\205\254\350\267\257.md" | 30 +++++++ 33 files changed, 275 insertions(+), 44 deletions(-) create mode 100644 "problems/kamacoder/0129.\345\260\217\347\276\216\347\232\204\350\233\213\347\263\225\345\210\207\345\211\262.md" create mode 100644 "problems/kamacoder/0130.\345\260\217\347\276\216\347\232\204\345\255\227\347\254\246\344\270\262\345\217\230\346\215\242.md" create mode 100644 "problems/kamacoder/0131.\345\260\217\347\276\216\347\232\204\346\240\221\344\270\212\346\237\223\350\211\262.md" create mode 100644 "problems/kamacoder/\345\260\217\347\276\216\347\232\204\346\216\222\345\210\227\350\257\242\351\227\256.md" create mode 100644 "problems/kamacoder/\345\260\217\347\276\216\350\265\260\345\205\254\350\267\257.md" diff --git a/README.md b/README.md index e94b428578..4c570c050d 100644 --- a/README.md +++ b/README.md @@ -372,25 +372,38 @@ 通知:开始更新图论内容,图论部分还没有其他语言版本,欢迎录友们提交PR,成为contributor -### 深搜广搜 - -* [图论:深度优先搜索理论基础](./problems/图论深搜理论基础.md) -* [图论:797.所有可能的路径](./problems/0797.所有可能的路径.md) -* [图论:广度优先搜索理论基础](./problems/图论广搜理论基础.md) -* [图论:200.岛屿数量.深搜版](./problems/0200.岛屿数量.深搜版.md) -* [图论:200.岛屿数量.广搜版](./problems/0200.岛屿数量.广搜版.md) -* [图论:695.岛屿的最大面积](./problems/0695.岛屿的最大面积.md) -* [图论:1020.飞地的数量](./problems/1020.飞地的数量.md) -* [图论:130.被围绕的区域](./problems/0130.被围绕的区域.md) -* [图论:417.太平洋大西洋水流问题](./problems/0417.太平洋大西洋水流问题.md) -* [图论:827.最大人工岛](./problems/0827.最大人工岛.md) -* [图论:127. 单词接龙](./problems/0127.单词接龙.md) -* [图论:841.钥匙和房间](./problems/0841.钥匙和房间.md) -* [图论:463. 岛屿的周长](./problems/0463.岛屿的周长.md) -* [图论:并查集理论基础](./problems/图论并查集理论基础.md) -* [图论:1971. 寻找图中是否存在路径](./problems/1971.寻找图中是否存在路径.md) -* [图论:684.冗余连接](./problems/0684.冗余连接.md) -* [图论:685.冗余连接II](./problems/0685.冗余连接II.md) +1. [图论:理论基础](./problems/kamacoder/图论理论基础.md) +2. [图论:深度优先搜索理论基础](./problems/kamacoder/图论深搜理论基础.md) +3. [图论:所有可达路径](./problems/kamacoder/0098.所有可达路径.md) +4. [图论:广度优先搜索理论基础](./problems/kamacoder/图论广搜理论基础.md) +5. [图论:岛屿数量.深搜版](./problems/kamacoder/0099.岛屿的数量深搜.md) +6. [图论:岛屿数量.广搜版](./problems/kamacoder/0099.岛屿的数量广搜.md) +7. [图论:岛屿的最大面积](./problems/kamacoder/0100.岛屿的最大面积.md) +8. [图论:孤岛的总面积](./problems/kamacoder/0101.孤岛的总面积.md) +9. [图论:沉没孤岛](./problems/kamacoder/0102.沉没孤岛.md) +10. [图论:水流问题](./problems/kamacoder/0103.水流问题.md) +11. [图论:建造最大岛屿](./problems/kamacoder/0104.建造最大岛屿.md) +12. [图论:字符串接龙](./problems/kamacoder/0110.字符串接龙.md) +13. [图论:有向图的完全可达性](./problems/kamacoder/0105.有向图的完全可达性.md) +14. [图论:岛屿的周长](./problems/kamacoder/0106.岛屿的周长.md) +15. [图论:并查集理论基础](./problems/kamacoder/图论并查集理论基础.md) +16. [图论:寻找存在的路径](./problems/kamacoder/0107.寻找存在的路径.md) +17. [图论:冗余连接](./problems/kamacoder/0108.冗余连接.md) +18. [图论:冗余连接II](./problems/kamacoder/0109.冗余连接II.md) +19. [图论:最小生成树之prim](./problems/kamacoder/0053.寻宝-prim.md) +20. [图论:最小生成树之kruskal](./problems/kamacoder/0053.寻宝-Kruskal.md) +21. [图论:拓扑排序](./problems/kamacoder/0117.软件构建.md) +22. [图论:dijkstra(朴素版)](./problems/kamacoder/0047.参会dijkstra朴素.md) +23. [图论:dijkstra(堆优化版)](./problems/kamacoder/0047.参会dijkstra堆.md) +24. [图论:Bellman_ford 算法](./problems/kamacoder/0094.城市间货物运输I.md) +25. [图论:Bellman_ford 队列优化算法(又名SPFA)](./problems/kamacoder/0094.城市间货物运输I-SPFA.md) +26. [图论:Bellman_ford之判断负权回路](./problems/kamacoder/0095.城市间货物运输II.md) +27. [图论:Bellman_ford之单源有限最短路](./problems/kamacoder/0095.城市间货物运输II.md) +28. [图论:Floyd 算法](./problems/kamacoder/0097.小明逛公园.md) +29. [图论:A * 算法](./problems/kamacoder/0126.骑士的攻击astar.md) +30. [图论:最短路算法总结篇](./problems/kamacoder/最短路问题总结篇.md) +31. [图论:图论总结篇](./problems/kamacoder/图论总结篇.md) + (持续更新中....) diff --git "a/problems/kamacoder/0047.\345\217\202\344\274\232dijkstra\345\240\206.md" "b/problems/kamacoder/0047.\345\217\202\344\274\232dijkstra\345\240\206.md" index a0778d2db8..6050758240 100644 --- "a/problems/kamacoder/0047.\345\217\202\344\274\232dijkstra\345\240\206.md" +++ "b/problems/kamacoder/0047.\345\217\202\344\274\232dijkstra\345\240\206.md" @@ -1,4 +1,6 @@ +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+ # dijkstra(堆优化版)精讲 [卡码网:47. 参加科学大会](https://kamacoder.com/problempage.php?pid=1047) diff --git "a/problems/kamacoder/0047.\345\217\202\344\274\232dijkstra\346\234\264\347\264\240.md" "b/problems/kamacoder/0047.\345\217\202\344\274\232dijkstra\346\234\264\347\264\240.md" index 10474f1318..5b214a3454 100644 --- "a/problems/kamacoder/0047.\345\217\202\344\274\232dijkstra\346\234\264\347\264\240.md" +++ "b/problems/kamacoder/0047.\345\217\202\344\274\232dijkstra\346\234\264\347\264\240.md" @@ -1,4 +1,6 @@ +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+ # dijkstra(朴素版)精讲 [卡码网:47. 参加科学大会](https://kamacoder.com/problempage.php?pid=1047) diff --git "a/problems/kamacoder/0053.\345\257\273\345\256\235-Kruskal.md" "b/problems/kamacoder/0053.\345\257\273\345\256\235-Kruskal.md" index 527f0e70b8..a97409aa3a 100644 --- "a/problems/kamacoder/0053.\345\257\273\345\256\235-Kruskal.md" +++ "b/problems/kamacoder/0053.\345\257\273\345\256\235-Kruskal.md" @@ -1,4 +1,6 @@ +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+ # kruskal算法精讲 [卡码网:53. 寻宝](https://kamacoder.com/problempage.php?pid=1053) diff --git "a/problems/kamacoder/0053.\345\257\273\345\256\235-prim.md" "b/problems/kamacoder/0053.\345\257\273\345\256\235-prim.md" index f1b3b721bf..782bd143dd 100644 --- "a/problems/kamacoder/0053.\345\257\273\345\256\235-prim.md" +++ "b/problems/kamacoder/0053.\345\257\273\345\256\235-prim.md" @@ -1,4 +1,6 @@ +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+ # prim算法精讲 [卡码网:53. 寻宝](https://kamacoder.com/problempage.php?pid=1053) diff --git "a/problems/kamacoder/0054.\346\233\277\346\215\242\346\225\260\345\255\227.md" "b/problems/kamacoder/0054.\346\233\277\346\215\242\346\225\260\345\255\227.md" index 45a0aa5461..32d777483e 100644 --- "a/problems/kamacoder/0054.\346\233\277\346\215\242\346\225\260\345\255\227.md" +++ "b/problems/kamacoder/0054.\346\233\277\346\215\242\346\225\260\345\255\227.md" @@ -1,11 +1,4 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

- - # 替换数字 [卡码网题目链接](https://kamacoder.com/problempage.php?pid=1064) @@ -376,9 +369,3 @@ main(); ### Rust: - -

- - - - diff --git "a/problems/kamacoder/0055.\345\217\263\346\227\213\345\255\227\347\254\246\344\270\262.md" "b/problems/kamacoder/0055.\345\217\263\346\227\213\345\255\227\347\254\246\344\270\262.md" index 4dea19a832..28ee5e308e 100644 --- "a/problems/kamacoder/0055.\345\217\263\346\227\213\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/kamacoder/0055.\345\217\263\346\227\213\345\255\227\347\254\246\344\270\262.md" @@ -1,9 +1,4 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

# 右旋字符串 @@ -343,9 +338,3 @@ var reverseLeftWords = function(s, n) { ### Rust: - - -

- - - diff --git "a/problems/kamacoder/0094.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I-SPFA.md" "b/problems/kamacoder/0094.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I-SPFA.md" index eb3204b612..2480b12c0a 100644 --- "a/problems/kamacoder/0094.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I-SPFA.md" +++ "b/problems/kamacoder/0094.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I-SPFA.md" @@ -1,4 +1,6 @@ +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+ # Bellman_ford 队列优化算法(又名SPFA) [卡码网:94. 城市间货物运输 I](https://kamacoder.com/problempage.php?pid=1152) diff --git "a/problems/kamacoder/0094.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I.md" "b/problems/kamacoder/0094.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I.md" index 7cadc37888..f72bfc00a4 100644 --- "a/problems/kamacoder/0094.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I.md" +++ "b/problems/kamacoder/0094.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I.md" @@ -1,4 +1,6 @@ +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+ # Bellman_ford 算法精讲 [卡码网:94. 城市间货物运输 I](https://kamacoder.com/problempage.php?pid=1152) diff --git "a/problems/kamacoder/0095.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223II.md" "b/problems/kamacoder/0095.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223II.md" index ea7065792f..4eab01a8ec 100644 --- "a/problems/kamacoder/0095.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223II.md" +++ "b/problems/kamacoder/0095.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223II.md" @@ -1,4 +1,6 @@ +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+ # bellman_ford之判断负权回路 [卡码网:95. 城市间货物运输 II](https://kamacoder.com/problempage.php?pid=1153) diff --git "a/problems/kamacoder/0096.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223III.md" "b/problems/kamacoder/0096.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223III.md" index 2b9f44fcb7..96f9a9c81e 100644 --- "a/problems/kamacoder/0096.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223III.md" +++ "b/problems/kamacoder/0096.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223III.md" @@ -1,4 +1,6 @@ +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+ # bellman_ford之单源有限最短路 [卡码网:96. 城市间货物运输 III](https://kamacoder.com/problempage.php?pid=1154) diff --git "a/problems/kamacoder/0097.\345\260\217\346\230\216\351\200\233\345\205\254\345\233\255.md" "b/problems/kamacoder/0097.\345\260\217\346\230\216\351\200\233\345\205\254\345\233\255.md" index f4b53acfaa..5465c356f9 100644 --- "a/problems/kamacoder/0097.\345\260\217\346\230\216\351\200\233\345\205\254\345\233\255.md" +++ "b/problems/kamacoder/0097.\345\260\217\346\230\216\351\200\233\345\205\254\345\233\255.md" @@ -1,4 +1,6 @@ +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+ # Floyd 算法精讲 [卡码网:97. 小明逛公园](https://kamacoder.com/problempage.php?pid=1155) diff --git "a/problems/kamacoder/0098.\346\211\200\346\234\211\345\217\257\350\276\276\350\267\257\345\276\204.md" "b/problems/kamacoder/0098.\346\211\200\346\234\211\345\217\257\350\276\276\350\267\257\345\276\204.md" index ca4f117c19..c4cfc8f9a4 100644 --- "a/problems/kamacoder/0098.\346\211\200\346\234\211\345\217\257\350\276\276\350\267\257\345\276\204.md" +++ "b/problems/kamacoder/0098.\346\211\200\346\234\211\345\217\257\350\276\276\350\267\257\345\276\204.md" @@ -1,4 +1,6 @@ +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+ # 98. 所有可达路径 [卡码网题目链接(ACM模式)](https://kamacoder.com/problempage.php?pid=1170) diff --git "a/problems/kamacoder/0099.\345\262\233\345\261\277\347\232\204\346\225\260\351\207\217\345\271\277\346\220\234.md" "b/problems/kamacoder/0099.\345\262\233\345\261\277\347\232\204\346\225\260\351\207\217\345\271\277\346\220\234.md" index 993c01f225..fc7f38e913 100644 --- "a/problems/kamacoder/0099.\345\262\233\345\261\277\347\232\204\346\225\260\351\207\217\345\271\277\346\220\234.md" +++ "b/problems/kamacoder/0099.\345\262\233\345\261\277\347\232\204\346\225\260\351\207\217\345\271\277\346\220\234.md" @@ -1,4 +1,6 @@ +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+ # 99. 岛屿数量 [卡码网题目链接(ACM模式)](https://kamacoder.com/problempage.php?pid=1171) diff --git "a/problems/kamacoder/0099.\345\262\233\345\261\277\347\232\204\346\225\260\351\207\217\346\267\261\346\220\234.md" "b/problems/kamacoder/0099.\345\262\233\345\261\277\347\232\204\346\225\260\351\207\217\346\267\261\346\220\234.md" index 7fac4cb8f9..37f7086a2b 100644 --- "a/problems/kamacoder/0099.\345\262\233\345\261\277\347\232\204\346\225\260\351\207\217\346\267\261\346\220\234.md" +++ "b/problems/kamacoder/0099.\345\262\233\345\261\277\347\232\204\346\225\260\351\207\217\346\267\261\346\220\234.md" @@ -1,4 +1,6 @@ +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+ # 99. 岛屿数量 [卡码网题目链接(ACM模式)](https://kamacoder.com/problempage.php?pid=1171) diff --git "a/problems/kamacoder/0100.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" "b/problems/kamacoder/0100.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" index 2e2ed4f349..19292be7a4 100644 --- "a/problems/kamacoder/0100.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" +++ "b/problems/kamacoder/0100.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" @@ -1,4 +1,6 @@ +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+ # 100. 岛屿的最大面积 [卡码网题目链接(ACM模式)](https://kamacoder.com/problempage.php?pid=1172) diff --git "a/problems/kamacoder/0101.\345\255\244\345\262\233\347\232\204\346\200\273\351\235\242\347\247\257.md" "b/problems/kamacoder/0101.\345\255\244\345\262\233\347\232\204\346\200\273\351\235\242\347\247\257.md" index 5be256117f..b300b58ca4 100644 --- "a/problems/kamacoder/0101.\345\255\244\345\262\233\347\232\204\346\200\273\351\235\242\347\247\257.md" +++ "b/problems/kamacoder/0101.\345\255\244\345\262\233\347\232\204\346\200\273\351\235\242\347\247\257.md" @@ -1,4 +1,6 @@ +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+ # 101. 孤岛的总面积 [卡码网:101. 孤岛的总面积](https://kamacoder.com/problempage.php?pid=1173) diff --git "a/problems/kamacoder/0102.\346\262\211\346\262\241\345\255\244\345\262\233.md" "b/problems/kamacoder/0102.\346\262\211\346\262\241\345\255\244\345\262\233.md" index 43666325f2..5491a8e3d8 100644 --- "a/problems/kamacoder/0102.\346\262\211\346\262\241\345\255\244\345\262\233.md" +++ "b/problems/kamacoder/0102.\346\262\211\346\262\241\345\255\244\345\262\233.md" @@ -1,4 +1,6 @@ +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+ # 102. 沉没孤岛 [卡码网题目链接(ACM模式)](https://kamacoder.com/problempage.php?pid=1174) diff --git "a/problems/kamacoder/0103.\346\260\264\346\265\201\351\227\256\351\242\230.md" "b/problems/kamacoder/0103.\346\260\264\346\265\201\351\227\256\351\242\230.md" index 0f461edb3c..259321b685 100644 --- "a/problems/kamacoder/0103.\346\260\264\346\265\201\351\227\256\351\242\230.md" +++ "b/problems/kamacoder/0103.\346\260\264\346\265\201\351\227\256\351\242\230.md" @@ -1,4 +1,6 @@ +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+ # 103. 水流问题 [卡码网题目链接(ACM模式)](https://kamacoder.com/problempage.php?pid=1175) diff --git "a/problems/kamacoder/0104.\345\273\272\351\200\240\346\234\200\345\244\247\345\262\233\345\261\277.md" "b/problems/kamacoder/0104.\345\273\272\351\200\240\346\234\200\345\244\247\345\262\233\345\261\277.md" index a1be8fb12a..b68e44424b 100644 --- "a/problems/kamacoder/0104.\345\273\272\351\200\240\346\234\200\345\244\247\345\262\233\345\261\277.md" +++ "b/problems/kamacoder/0104.\345\273\272\351\200\240\346\234\200\345\244\247\345\262\233\345\261\277.md" @@ -1,4 +1,6 @@ +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+ # 104.建造最大岛屿 [卡码网题目链接(ACM模式)](https://kamacoder.com/problempage.php?pid=1176) diff --git "a/problems/kamacoder/0105.\346\234\211\345\220\221\345\233\276\347\232\204\345\256\214\345\205\250\345\217\257\350\276\276\346\200\247.md" "b/problems/kamacoder/0105.\346\234\211\345\220\221\345\233\276\347\232\204\345\256\214\345\205\250\345\217\257\350\276\276\346\200\247.md" index 9903b6d7b4..dfaa3be8ca 100644 --- "a/problems/kamacoder/0105.\346\234\211\345\220\221\345\233\276\347\232\204\345\256\214\345\205\250\345\217\257\350\276\276\346\200\247.md" +++ "b/problems/kamacoder/0105.\346\234\211\345\220\221\345\233\276\347\232\204\345\256\214\345\205\250\345\217\257\350\276\276\346\200\247.md" @@ -1,4 +1,6 @@ +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+ # 105.有向图的完全可达性 [卡码网题目链接(ACM模式)](https://kamacoder.com/problempage.php?pid=1177) @@ -192,7 +194,7 @@ int main() { **第二种写法注意有注释的地方是和写法一的区别** -```c++ +```CPP 写法二:dfs处理下一个要访问的节点 #include #include diff --git "a/problems/kamacoder/0106.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" "b/problems/kamacoder/0106.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" index 2233c2db96..340630398f 100644 --- "a/problems/kamacoder/0106.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" +++ "b/problems/kamacoder/0106.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" @@ -1,4 +1,6 @@ +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+ # 106. 岛屿的周长 [卡码网题目链接(ACM模式)](https://kamacoder.com/problempage.php?pid=1178) diff --git "a/problems/kamacoder/0107.\345\257\273\346\211\276\345\255\230\345\234\250\347\232\204\350\267\257\345\276\204.md" "b/problems/kamacoder/0107.\345\257\273\346\211\276\345\255\230\345\234\250\347\232\204\350\267\257\345\276\204.md" index 30b8e58701..906609c99a 100644 --- "a/problems/kamacoder/0107.\345\257\273\346\211\276\345\255\230\345\234\250\347\232\204\350\267\257\345\276\204.md" +++ "b/problems/kamacoder/0107.\345\257\273\346\211\276\345\255\230\345\234\250\347\232\204\350\267\257\345\276\204.md" @@ -1,4 +1,6 @@ +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+ # 107. 寻找存在的路径 [卡码网题目链接(ACM模式)](https://kamacoder.com/problempage.php?pid=1179) diff --git "a/problems/kamacoder/0108.\345\206\227\344\275\231\350\277\236\346\216\245.md" "b/problems/kamacoder/0108.\345\206\227\344\275\231\350\277\236\346\216\245.md" index 4e8ea4cfcf..7088413967 100644 --- "a/problems/kamacoder/0108.\345\206\227\344\275\231\350\277\236\346\216\245.md" +++ "b/problems/kamacoder/0108.\345\206\227\344\275\231\350\277\236\346\216\245.md" @@ -1,4 +1,6 @@ +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+ # 108. 冗余连接 [卡码网题目链接(ACM模式)](https://kamacoder.com/problempage.php?pid=1181) diff --git "a/problems/kamacoder/0109.\345\206\227\344\275\231\350\277\236\346\216\245II.md" "b/problems/kamacoder/0109.\345\206\227\344\275\231\350\277\236\346\216\245II.md" index 09b6118b64..9c2f403941 100644 --- "a/problems/kamacoder/0109.\345\206\227\344\275\231\350\277\236\346\216\245II.md" +++ "b/problems/kamacoder/0109.\345\206\227\344\275\231\350\277\236\346\216\245II.md" @@ -1,4 +1,6 @@ +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+ # 109. 冗余连接II [卡码网题目链接(ACM模式)](https://kamacoder.com/problempage.php?pid=1182) diff --git "a/problems/kamacoder/0110.\345\255\227\347\254\246\344\270\262\346\216\245\351\276\231.md" "b/problems/kamacoder/0110.\345\255\227\347\254\246\344\270\262\346\216\245\351\276\231.md" index cac33c2304..84b1dd6551 100644 --- "a/problems/kamacoder/0110.\345\255\227\347\254\246\344\270\262\346\216\245\351\276\231.md" +++ "b/problems/kamacoder/0110.\345\255\227\347\254\246\344\270\262\346\216\245\351\276\231.md" @@ -1,4 +1,6 @@ +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+ # 110. 字符串接龙 [卡码网题目链接(ACM模式)](https://kamacoder.com/problempage.php?pid=1182) diff --git "a/problems/kamacoder/0117.\350\275\257\344\273\266\346\236\204\345\273\272.md" "b/problems/kamacoder/0117.\350\275\257\344\273\266\346\236\204\345\273\272.md" index 1cd9a983b1..5d1edf97cd 100644 --- "a/problems/kamacoder/0117.\350\275\257\344\273\266\346\236\204\345\273\272.md" +++ "b/problems/kamacoder/0117.\350\275\257\344\273\266\346\236\204\345\273\272.md" @@ -1,4 +1,6 @@ +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+ # 拓扑排序精讲 [卡码网:117. 软件构建](https://kamacoder.com/problempage.php?pid=1191) diff --git "a/problems/kamacoder/0121.\345\244\247\346\225\260\345\207\217\346\263\225.md" "b/problems/kamacoder/0121.\345\244\247\346\225\260\345\207\217\346\263\225.md" index a36f2cbbe7..84d55249fd 100644 --- "a/problems/kamacoder/0121.\345\244\247\346\225\260\345\207\217\346\263\225.md" +++ "b/problems/kamacoder/0121.\345\244\247\346\225\260\345\207\217\346\263\225.md" @@ -1,4 +1,6 @@ +

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+ # 大数减法 本题测试数据超过int 和 longlong了,所以考察的使用 string 来模拟 两个大数的 加减操作。 diff --git "a/problems/kamacoder/0129.\345\260\217\347\276\216\347\232\204\350\233\213\347\263\225\345\210\207\345\211\262.md" "b/problems/kamacoder/0129.\345\260\217\347\276\216\347\232\204\350\233\213\347\263\225\345\210\207\345\211\262.md" new file mode 100644 index 0000000000..84bbbd6f94 --- /dev/null +++ "b/problems/kamacoder/0129.\345\260\217\347\276\216\347\232\204\350\233\213\347\263\225\345\210\207\345\211\262.md" @@ -0,0 +1,49 @@ + +前缀和 + +```CPP + +#include +#include +#include + +using namespace std; +int main () { + int n, m; + cin >> n >> m; + int sum = 0; + vector> vec(n, vector(m, 0)) ; + for (int i = 0; i < n; i++) { + for (int j = 0; j < m; j++) { + cin >> vec[i][j]; + sum += vec[i][j]; + } + } + // 统计横向 + vector horizontal(n, 0); + for (int i = 0; i < n; i++) { + for (int j = 0 ; j < m; j++) { + horizontal[i] += vec[i][j]; + } + } + // 统计纵向 + vector vertical(m , 0); + for (int j = 0; j < m; j++) { + for (int i = 0 ; i < n; i++) { + vertical[j] += vec[i][j]; + } + } + int result = INT_MAX; + int horizontalCut = 0; + for (int i = 0 ; i < n; i++) { + horizontalCut += horizontal[i]; + result = min(result, abs(sum - horizontalCut - horizontalCut)); + } + int verticalCut = 0; + for (int j = 0; j < m; j++) { + verticalCut += vertical[j]; + result = min(result, abs(sum - verticalCut - verticalCut)); + } + cout << result << endl; +} +``` diff --git "a/problems/kamacoder/0130.\345\260\217\347\276\216\347\232\204\345\255\227\347\254\246\344\270\262\345\217\230\346\215\242.md" "b/problems/kamacoder/0130.\345\260\217\347\276\216\347\232\204\345\255\227\347\254\246\344\270\262\345\217\230\346\215\242.md" new file mode 100644 index 0000000000..cd889995ec --- /dev/null +++ "b/problems/kamacoder/0130.\345\260\217\347\276\216\347\232\204\345\255\227\347\254\246\344\270\262\345\217\230\346\215\242.md" @@ -0,0 +1,79 @@ + +# 130.小美的字符串变换 + +本题是[岛屿数量](./0099.岛屿的数量广搜.md)的进阶版,主要思路和代码都是一样的,统计一个图里岛屿的数量,也是染色问题。 + +1、 先枚举各个可能出现的矩阵 +2、 针对矩阵经行广搜染色(深搜,并查集一样可以) +3、 统计岛屿数量最小的数量。 + +```CPP +#include +#include +#include +#include +using namespace std; + +// 广搜代码同 卡码网:99. 岛屿数量 +int dir[4][2] = {0, 1, 1, 0, -1, 0, 0, -1}; // 四个方向 +void bfs(const vector>& grid, vector>& visited, int x, int y, char a) { + queue> que; + que.push({x, y}); + visited[x][y] = true; // 只要加入队列,立刻标记 + while(!que.empty()) { + pair cur = que.front(); que.pop(); + int curx = cur.first; + int cury = cur.second; + for (int i = 0; i < 4; i++) { + int nextx = curx + dir[i][0]; + int nexty = cury + dir[i][1]; + if (nextx < 0 || nextx >= grid.size() || nexty < 0 || nexty >= grid[0].size()) continue; // 越界了,直接跳过 + if (!visited[nextx][nexty] && grid[nextx][nexty] == a) { + que.push({nextx, nexty}); + visited[nextx][nexty] = true; // 只要加入队列立刻标记 + } + } + } +} + + +int main() { + int n; + string s; + cin >> n; + int result = INT_MAX; + cin >> s; + for (int k = 1; k < n; k++) { + if (n % k != 0) continue; + // 计算出 矩阵的 行 和 列 + int x = n / k; + int y = k; + //cout << x << " " << y << endl; + vector> vec(x, vector(y, 0)); + // 填装矩阵 + int sCount = 0; + for (int i = 0; i < x; i++) { + for (int j = 0; j < y; j++) { + vec[i][j] = s[sCount++]; + } + } + + // 开始广搜染色 + vector> visited(x, vector(y, false)); + int count = 0; + for (int i = 0; i < x; i++) { + for (int j = 0; j < y; j++) { + + if (!visited[i][j]) { + count++; // 遇到没访问过的陆地,+1 + bfs(vec, visited, i, j, vec[i][j]); // 将与其链接的陆地都标记上 true + } + } + } + // 取岛屿数量最少的 + result = min (result, count); + + } + cout << result << endl; +} +``` diff --git "a/problems/kamacoder/0131.\345\260\217\347\276\216\347\232\204\346\240\221\344\270\212\346\237\223\350\211\262.md" "b/problems/kamacoder/0131.\345\260\217\347\276\216\347\232\204\346\240\221\344\270\212\346\237\223\350\211\262.md" new file mode 100644 index 0000000000..1f5212b0e5 --- /dev/null +++ "b/problems/kamacoder/0131.\345\260\217\347\276\216\347\232\204\346\240\221\344\270\212\346\237\223\350\211\262.md" @@ -0,0 +1,5 @@ +# 131. 小美的树上染色 + +贪心的思路 : https://blog.csdn.net/weixin_43739821/article/details/136299012 + +dp思路:https://www.cnblogs.com/ganyq/p/18111114 diff --git "a/problems/kamacoder/\345\260\217\347\276\216\347\232\204\346\216\222\345\210\227\350\257\242\351\227\256.md" "b/problems/kamacoder/\345\260\217\347\276\216\347\232\204\346\216\222\345\210\227\350\257\242\351\227\256.md" new file mode 100644 index 0000000000..0e58e39a90 --- /dev/null +++ "b/problems/kamacoder/\345\260\217\347\276\216\347\232\204\346\216\222\345\210\227\350\257\242\351\227\256.md" @@ -0,0 +1,29 @@ + +小美的排列询问 + +注意 x 和y 不分先后 + +```CPP + +#include +#include +using namespace std; +int main() { + int n, x, y; + cin >> n; + vector vec(n, 0); + for (int i =0; i < n; i++) { + cin >> vec[i]; + } + cin >> x >> y; + for (int i = 0; i < n - 1; i++) { + if (x == vec[i] && y == vec[i + 1]) || (y == vec[i] && x == vec[i + 1]) ) { + cout << "Yes" << endl; + return 0; + } + } + cout << "No" << endl; + +} + +``` diff --git "a/problems/kamacoder/\345\260\217\347\276\216\350\265\260\345\205\254\350\267\257.md" "b/problems/kamacoder/\345\260\217\347\276\216\350\265\260\345\205\254\350\267\257.md" new file mode 100644 index 0000000000..7d63b7510b --- /dev/null +++ "b/problems/kamacoder/\345\260\217\347\276\216\350\265\260\345\205\254\350\267\257.md" @@ -0,0 +1,30 @@ + + +两个注意点 + +1. x 可以比 y 大,题目没规定 x 和y 的大小顺序 +2. 累计相加的数可能超过int + + +```CPP +#include +#include +using namespace std; +int main () { + int n; + cin >> n; + vector vec(2* n + 1, 0); + for (int i = 1; i <= n; i++) { + cin >> vec[i]; + vec[n + i] = vec[i]; + } + int x, y; + cin >> x >> y; + int xx = min(x ,y); // 注意点1:x 可以比 y 大 + int yy = max(x, y); + long long a = 0, b = 0; // 注意点2:相加的数可能超过int + for (int i = xx; i < yy; i++) a += vec[i]; + for (int i = yy; i < xx + n; i++ ) b += vec[i]; + cout << min(a, b) << endl; +} +``` From 1cf800b89f3785d2cfd7b0dc040da4f294e0682d Mon Sep 17 00:00:00 2001 From: markwang Date: Tue, 18 Jun 2024 17:10:19 +0800 Subject: [PATCH 2672/3019] =?UTF-8?q?102.=E4=BA=8C=E5=8F=89=E6=A0=91?= =?UTF-8?q?=E7=9A=84=E5=B1=82=E5=BA=8F=E9=81=8D=E5=8E=86=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?Go=E4=BD=BF=E7=94=A8=E5=88=87=E7=89=87=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...02\345\272\217\351\201\215\345\216\206.md" | 31 ++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" index 17832e44ff..3385289894 100644 --- "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" +++ "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" @@ -265,7 +265,7 @@ func levelOrder(root *TreeNode) [][]int { ```go /** -102. 二叉树的层序遍历 +102. 二叉树的层序遍历 使用container包 */ func levelOrder(root *TreeNode) [][]int { res := [][]int{} @@ -296,6 +296,35 @@ func levelOrder(root *TreeNode) [][]int { return res } +/** + 102. 二叉树的层序遍历 使用切片 +*/ +func levelOrder(root *TreeNode) [][]int { + res := make([][]int, 0) + if root == nil { + return res + } + queue := make([]*TreeNode, 0) + queue = append(queue, root) + for len(queue) > 0 { + size := len(queue) + level := make([]int, 0) + for i := 0; i < size; i++ { + node := queue[0] + queue = queue[1:] + level = append(level, node.Val) + if node.Left != nil { + queue = append(queue, node.Left) + } + if node.Right != nil { + queue = append(queue, node.Right) + } + } + res = append(res, level) + } + return res +} + /** 102. 二叉树的层序遍历:使用切片模拟队列,易理解 */ From b2f5b319876dc1852d320c13135e307f91bac5f1 Mon Sep 17 00:00:00 2001 From: markwang Date: Thu, 20 Jun 2024 10:23:22 +0800 Subject: [PATCH 2673/3019] =?UTF-8?q?102.=E4=BA=8C=E5=8F=89=E6=A0=91?= =?UTF-8?q?=E7=9A=84=E5=B1=82=E5=BA=8F=E9=81=8D=E5=8E=86=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?Go=E4=BD=BF=E7=94=A8=E5=88=87=E7=89=87=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...02\345\272\217\351\201\215\345\216\206.md" | 265 +++++++++++++++++- 1 file changed, 264 insertions(+), 1 deletion(-) diff --git "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" index 3385289894..cad324148d 100644 --- "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" +++ "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" @@ -724,6 +724,41 @@ func levelOrderBottom(root *TreeNode) [][]int { } ``` +```GO +// 使用切片作为队列 +func levelOrderBottom(root *TreeNode) [][]int { + res := make([][]int, 0) + if root == nil { + return res + } + queue := make([]*TreeNode, 0) + queue = append(queue, root) + for len(queue) > 0 { + size := len(queue) + level := make([]int, 0) + for i := 0; i < size; i++ { + node := queue[0] + queue = queue[1:] + level = append(level, node.Val) + if node.Left != nil { + queue = append(queue, node.Left) + } + if node.Right != nil { + queue = append(queue, node.Right) + } + } + res = append(res, level) + } + l, r := 0, len(res)-1 + for l < r { + res[l], res[r] = res[r], res[l] + l++ + r-- + } + return res +} +``` + #### Javascript: ```javascript @@ -1037,6 +1072,35 @@ func rightSideView(root *TreeNode) []int { } ``` +```GO +// 使用切片作为队列 +func rightSideView(root *TreeNode) []int { + res := make([]int, 0) + if root == nil { + return res + } + queue := make([]*TreeNode, 0) + queue = append(queue, root) + for len(queue) > 0 { + size := len(queue) + for i := 0; i < size; i++ { + node := queue[0] + queue = queue[1:] + if node.Left != nil { + queue = append(queue, node.Left) + } + if node.Right != nil { + queue = append(queue, node.Right) + } + if i == size-1 { + res = append(res, node.Val) + } + } + } + return res +} +``` + #### Javascript: ```javascript @@ -1328,6 +1392,35 @@ func averageOfLevels(root *TreeNode) []float64 { } ``` +```GO +// 使用切片作为队列 +func averageOfLevels(root *TreeNode) []float64 { + res := make([]float64, 0) + if root == nil { + return res + } + queue := make([]*TreeNode, 0) + queue = append(queue, root) + for len(queue) > 0 { + size := len(queue) + sum := 0 + for i := 0; i < size; i++ { + node := queue[0] + queue = queue[1:] + sum += node.Val + if node.Left != nil { + queue = append(queue, node.Left) + } + if node.Right != nil { + queue = append(queue, node.Right) + } + } + res = append(res, float64(sum)/float64(size)) + } + return res +} +``` + #### Javascript: ```javascript @@ -1660,6 +1753,32 @@ func levelOrder(root *Node) [][]int { } ``` +```GO +// 使用切片作为队列 +func levelOrder(root *Node) [][]int { + res := make([][]int, 0) + if root == nil { + return res + } + queue := make([]*Node, 0) + queue = append(queue, root) + for len(queue) > 0 { + size := len(queue) + level := make([]int, 0) + for i := 0; i < size; i++ { + node := queue[0] + queue = queue[1:] + level = append(level, node.Val) + if len(node.Children) > 0 { + queue = append(queue, node.Children...) + } + } + res = append(res, level) + } + return res +} +``` + #### JavaScript: ```JavaScript @@ -1959,6 +2078,37 @@ func max(x, y int) int { } ``` +```GO +// 使用切片作为队列 +func largestValues(root *TreeNode) []int { + res := make([]int, 0) + if root == nil { + return res + } + queue := make([]*TreeNode, 0) + queue = append(queue, root) + for len(queue) > 0 { + size := len(queue) + maxValue := math.MinInt64 + for i := 0; i < size; i++ { + node := queue[0] + queue = queue[1:] + if node.Val > maxValue { + maxValue = node.Val + } + if node.Left != nil { + queue = append(queue, node.Left) + } + if node.Right != nil { + queue = append(queue, node.Right) + } + } + res = append(res, maxValue) + } + return res +} +``` + #### Javascript: ```javascript @@ -2272,6 +2422,34 @@ func connect(root *Node) *Node { ``` +```GO +// 使用切片作为队列 +func connect(root *Node) *Node { + if root == nil { + return root + } + queue := make([]*Node, 0) + queue = append(queue, root) + for len(queue) > 0 { + size := len(queue) + for i := 0; i < size; i++ { + node := queue[i] + if i != size - 1 { + queue[i].Next = queue[i+1] + } + if node.Left != nil { + queue = append(queue, node.Left) + } + if node.Right != nil { + queue = append(queue, node.Right) + } + } + queue = queue[size:] + } + return root +} +``` + #### JavaScript: ```javascript @@ -2560,6 +2738,34 @@ func connect(root *Node) *Node { } ``` +```GO +// 使用切片作为队列 +func connect(root *Node) *Node { + if root == nil { + return root + } + queue := make([]*Node, 0) + queue = append(queue, root) + for len(queue) > 0 { + size := len(queue) + for i := 0; i < size; i++ { + node := queue[i] + if i != size - 1 { + queue[i].Next = queue[i+1] + } + if node.Left != nil { + queue = append(queue, node.Left) + } + if node.Right != nil { + queue = append(queue, node.Right) + } + } + queue = queue[size:] + } + return root +} +``` + #### JavaScript: ```javascript @@ -2829,6 +3035,33 @@ func maxDepth(root *TreeNode) int { } ``` +```go +// 使用切片作为队列 +func maxDepth(root *TreeNode) int { + if root == nil { + return 0 + } + depth := 0 + queue := make([]*TreeNode, 0) + queue = append(queue, root) + for len(queue) > 0 { + size := len(queue) + for i := 0; i < size; i++ { + node := queue[0] + queue = queue[1:] + if node.Left != nil { + queue = append(queue, node.Left) + } + if node.Right != nil { + queue = append(queue, node.Right) + } + } + depth++ + } + return depth +} +``` + #### JavaScript: ```javascript @@ -3102,7 +3335,37 @@ func minDepth(root *TreeNode) int { ans++//记录层数 } - return ans+1 + return ans +} +``` + +```go +// 使用切片作为队列 +func minDepth(root *TreeNode) int { + if root == nil { + return 0 + } + depth := 0 + queue := make([]*TreeNode, 0) + queue = append(queue, root) + for len(queue) > 0 { + size := len(queue) + depth++ + for i := 0; i < size; i++ { + node := queue[0] + queue = queue[1:] + if node.Left != nil { + queue = append(queue, node.Left) + } + if node.Right != nil { + queue = append(queue, node.Right) + } + if node.Left == nil && node.Right == nil { + return depth + } + } + } + return depth } ``` From 0e068f95f2ab7e4aedc25fcafe03c8389096a698 Mon Sep 17 00:00:00 2001 From: wutao Date: Thu, 20 Jun 2024 16:44:42 -0400 Subject: [PATCH 2674/3019] =?UTF-8?q?java=E5=8D=95=E9=93=BE=E8=A1=A8?= =?UTF-8?q?=E7=89=88=E6=9C=AC=E4=B8=AD=EF=BC=8C=E5=9B=A0=E4=B8=BA=E6=9C=89?= =?UTF-8?q?=E8=99=9A=E6=8B=9F=E5=A4=B4=E8=8A=82=E7=82=B9=EF=BC=8C=E6=89=80?= =?UTF-8?q?=E4=BB=A5=E4=B8=8D=E7=94=A8=E5=AF=B9Index=3D0=E7=9A=84=E6=83=85?= =?UTF-8?q?=E5=86=B5=E8=BF=9B=E8=A1=8C=E7=89=B9=E6=AE=8A=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git "a/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" "b/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" index 47771d2889..fe8a53004f 100644 --- "a/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" +++ "b/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" @@ -365,10 +365,7 @@ class MyLinkedList { return; } size--; - if (index == 0) { - head = head.next; - return; - } + //因为有虚拟头节点,所以不用对Index=0的情况进行特殊处理 ListNode pred = head; for (int i = 0; i < index ; i++) { pred = pred.next; From 26a5b0cc214cb89c22aaf549869d391e33949057 Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Mon, 24 Jun 2024 17:13:15 +0800 Subject: [PATCH 2675/3019] update --- ...17\202\344\274\232dijkstra\345\240\206.md" | 98 +++++++++++++ ...74\232dijkstra\346\234\264\347\264\240.md" | 67 +++++++++ ...57\350\276\276\350\267\257\345\276\204.md" | 13 ++ ...46\344\270\262\346\216\245\351\276\231.md" | 2 +- ...66\350\241\214\345\210\227\345\274\217.md" | 27 ++++ .../0112.\346\214\221\346\210\230boss.md" | 26 ++++ ...04\345\271\263\345\235\207\346\225\260.md" | 29 ++++ ...04\350\243\205\346\211\213\346\234\272.md" | 67 +++++++++ ...7\232\204\346\224\273\345\207\273astar.md" | 2 +- ...22\345\210\227\350\257\242\351\227\256.md" | 4 +- ...16\350\265\260\345\205\254\350\267\257.md" | 7 +- ...13\347\263\225\345\210\207\345\211\262.md" | 4 +- ...46\344\270\262\345\217\230\346\215\242.md" | 1 - ...21\344\270\212\346\237\223\350\211\262.md" | 133 +++++++++++++++++- .../\345\244\271\345\220\203\346\227\227.md" | 47 +++++++ 15 files changed, 518 insertions(+), 9 deletions(-) create mode 100644 "problems/kamacoder/0111.\346\236\204\351\200\240\344\272\214\351\230\266\350\241\214\345\210\227\345\274\217.md" create mode 100644 "problems/kamacoder/0112.\346\214\221\346\210\230boss.md" create mode 100644 "problems/kamacoder/0114.\345\260\217\346\254\247\347\232\204\345\271\263\345\235\207\346\225\260.md" create mode 100644 "problems/kamacoder/0115.\347\273\204\350\243\205\346\211\213\346\234\272.md" rename "problems/kamacoder/\345\260\217\347\276\216\347\232\204\346\216\222\345\210\227\350\257\242\351\227\256.md" => "problems/kamacoder/0127.\345\260\217\347\276\216\347\232\204\346\216\222\345\210\227\350\257\242\351\227\256.md" (87%) rename "problems/kamacoder/\345\260\217\347\276\216\350\265\260\345\205\254\350\267\257.md" => "problems/kamacoder/0128.\345\260\217\347\276\216\350\265\260\345\205\254\350\267\257.md" (69%) create mode 100644 "problems/kamacoder/\345\244\271\345\220\203\346\227\227.md" diff --git "a/problems/kamacoder/0047.\345\217\202\344\274\232dijkstra\345\240\206.md" "b/problems/kamacoder/0047.\345\217\202\344\274\232dijkstra\345\240\206.md" index 6050758240..0452615a61 100644 --- "a/problems/kamacoder/0047.\345\217\202\344\274\232dijkstra\345\240\206.md" +++ "b/problems/kamacoder/0047.\345\217\202\344\274\232dijkstra\345\240\206.md" @@ -655,6 +655,104 @@ int main() { ### Java +```Java + +import java.util.*; + +class Edge { + int to; // 邻接顶点 + int val; // 边的权重 + + Edge(int to, int val) { + this.to = to; + this.val = val; + } +} + +class MyComparison implements Comparator> { + @Override + public int compare(Pair lhs, Pair rhs) { + return Integer.compare(lhs.second, rhs.second); + } +} + +class Pair { + public final U first; + public final V second; + + public Pair(U first, V second) { + this.first = first; + this.second = second; + } +} + +public class Main { + public static void main(String[] args) { + Scanner scanner = new Scanner(System.in); + int n = scanner.nextInt(); + int m = scanner.nextInt(); + + List> grid = new ArrayList<>(n + 1); + for (int i = 0; i <= n; i++) { + grid.add(new ArrayList<>()); + } + + for (int i = 0; i < m; i++) { + int p1 = scanner.nextInt(); + int p2 = scanner.nextInt(); + int val = scanner.nextInt(); + grid.get(p1).add(new Edge(p2, val)); + } + + int start = 1; // 起点 + int end = n; // 终点 + + // 存储从源点到每个节点的最短距离 + int[] minDist = new int[n + 1]; + Arrays.fill(minDist, Integer.MAX_VALUE); + + // 记录顶点是否被访问过 + boolean[] visited = new boolean[n + 1]; + + // 优先队列中存放 Pair<节点,源点到该节点的权值> + PriorityQueue> pq = new PriorityQueue<>(new MyComparison()); + + // 初始化队列,源点到源点的距离为0,所以初始为0 + pq.add(new Pair<>(start, 0)); + + minDist[start] = 0; // 起始点到自身的距离为0 + + while (!pq.isEmpty()) { + // 1. 第一步,选源点到哪个节点近且该节点未被访问过(通过优先级队列来实现) + // <节点, 源点到该节点的距离> + Pair cur = pq.poll(); + + if (visited[cur.first]) continue; + + // 2. 第二步,该最近节点被标记访问过 + visited[cur.first] = true; + + // 3. 第三步,更新非访问节点到源点的距离(即更新minDist数组) + for (Edge edge : grid.get(cur.first)) { // 遍历 cur指向的节点,cur指向的节点为 edge + // cur指向的节点edge.to,这条边的权值为 edge.val + if (!visited[edge.to] && minDist[cur.first] + edge.val < minDist[edge.to]) { // 更新minDist + minDist[edge.to] = minDist[cur.first] + edge.val; + pq.add(new Pair<>(edge.to, minDist[edge.to])); + } + } + } + + if (minDist[end] == Integer.MAX_VALUE) { + System.out.println(-1); // 不能到达终点 + } else { + System.out.println(minDist[end]); // 到达终点最短路径 + } + } +} + +``` + + ### Python ### Go diff --git "a/problems/kamacoder/0047.\345\217\202\344\274\232dijkstra\346\234\264\347\264\240.md" "b/problems/kamacoder/0047.\345\217\202\344\274\232dijkstra\346\234\264\347\264\240.md" index 5b214a3454..7328882a1c 100644 --- "a/problems/kamacoder/0047.\345\217\202\344\274\232dijkstra\346\234\264\347\264\240.md" +++ "b/problems/kamacoder/0047.\345\217\202\344\274\232dijkstra\346\234\264\347\264\240.md" @@ -737,6 +737,73 @@ for (int v = 1; v <= n; v++) { ### Java +```Java +import java.util.Arrays; +import java.util.Scanner; + +public class Main { + public static void main(String[] args) { + Scanner scanner = new Scanner(System.in); + int n = scanner.nextInt(); + int m = scanner.nextInt(); + + int[][] grid = new int[n + 1][n + 1]; + for (int i = 0; i <= n; i++) { + Arrays.fill(grid[i], Integer.MAX_VALUE); + } + + for (int i = 0; i < m; i++) { + int p1 = scanner.nextInt(); + int p2 = scanner.nextInt(); + int val = scanner.nextInt(); + grid[p1][p2] = val; + } + + int start = 1; + int end = n; + + // 存储从源点到每个节点的最短距离 + int[] minDist = new int[n + 1]; + Arrays.fill(minDist, Integer.MAX_VALUE); + + // 记录顶点是否被访问过 + boolean[] visited = new boolean[n + 1]; + + minDist[start] = 0; // 起始点到自身的距离为0 + + for (int i = 1; i <= n; i++) { // 遍历所有节点 + + int minVal = Integer.MAX_VALUE; + int cur = 1; + + // 1、选距离源点最近且未访问过的节点 + for (int v = 1; v <= n; ++v) { + if (!visited[v] && minDist[v] < minVal) { + minVal = minDist[v]; + cur = v; + } + } + + visited[cur] = true; // 2、标记该节点已被访问 + + // 3、第三步,更新非访问节点到源点的距离(即更新minDist数组) + for (int v = 1; v <= n; v++) { + if (!visited[v] && grid[cur][v] != Integer.MAX_VALUE && minDist[cur] + grid[cur][v] < minDist[v]) { + minDist[v] = minDist[cur] + grid[cur][v]; + } + } + } + + if (minDist[end] == Integer.MAX_VALUE) { + System.out.println(-1); // 不能到达终点 + } else { + System.out.println(minDist[end]); // 到达终点最短路径 + } + } +} + +``` + ### Python ### Go diff --git "a/problems/kamacoder/0098.\346\211\200\346\234\211\345\217\257\350\276\276\350\267\257\345\276\204.md" "b/problems/kamacoder/0098.\346\211\200\346\234\211\345\217\257\350\276\276\350\267\257\345\276\204.md" index c4cfc8f9a4..159cdb9f04 100644 --- "a/problems/kamacoder/0098.\346\211\200\346\234\211\345\217\257\350\276\276\350\267\257\345\276\204.md" +++ "b/problems/kamacoder/0098.\346\211\200\346\234\211\345\217\257\350\276\276\350\267\257\345\276\204.md" @@ -75,6 +75,19 @@ ## 插曲 +------------- + +本题和力扣 [797.所有可能的路径](https://leetcode.cn/problems/all-paths-from-source-to-target/description/) 是一样的,录友了解深度优先搜索之后,这道题目就是模板题,是送分题。 + +力扣是核心代码模式,把图的存储方式给大家定义好了,只需要写出深搜的核心代码就可以。 + +如果笔试的时候出一道原题 (笔试都是ACM模式,部分面试也是ACM模式),不少熟练刷力扣的录友都难住了,因为不知道图应该怎么存,也不知道自己存的图如何去遍历。 + +所以这也是为什么我要让大家练习 ACM模式 + +-------- + + 这道题目是深度优先搜索,比较好的入门题。 如果对深度优先搜索还不够了解,可以先看这里:[深度优先搜索的理论基础](https://programmercarl.com/图论深搜理论基础.html) diff --git "a/problems/kamacoder/0110.\345\255\227\347\254\246\344\270\262\346\216\245\351\276\231.md" "b/problems/kamacoder/0110.\345\255\227\347\254\246\344\270\262\346\216\245\351\276\231.md" index 84b1dd6551..5a60dbb7df 100644 --- "a/problems/kamacoder/0110.\345\255\227\347\254\246\344\270\262\346\216\245\351\276\231.md" +++ "b/problems/kamacoder/0110.\345\255\227\347\254\246\344\270\262\346\216\245\351\276\231.md" @@ -3,7 +3,7 @@ # 110. 字符串接龙 -[卡码网题目链接(ACM模式)](https://kamacoder.com/problempage.php?pid=1182) +[卡码网题目链接(ACM模式)](https://kamacoder.com/problempage.php?pid=1183) 题目描述 diff --git "a/problems/kamacoder/0111.\346\236\204\351\200\240\344\272\214\351\230\266\350\241\214\345\210\227\345\274\217.md" "b/problems/kamacoder/0111.\346\236\204\351\200\240\344\272\214\351\230\266\350\241\214\345\210\227\345\274\217.md" new file mode 100644 index 0000000000..efb304ebd1 --- /dev/null +++ "b/problems/kamacoder/0111.\346\236\204\351\200\240\344\272\214\351\230\266\350\241\214\345\210\227\345\274\217.md" @@ -0,0 +1,27 @@ + +# 111. 构造二阶行列式 + +暴力模拟就好,每个数不超过 20, 暴力枚举其实也没多大。 + +```CPP +#include +using namespace std; +int main() { + int n; + cin >> n; + for (int x = 1; x <= 20; x++) { + for (int y = 1; y <= 20; y++) { + for (int i = 1; i <= 20; i++) { + for (int j = 1; j <= 20; j++) { + if ((x * j - y * i) == n) { + cout << x << " " << y << endl; + cout << i << " " << j << endl; + return 0; + } + } + } + } + } + cout << -1 << endl; +} +``` diff --git "a/problems/kamacoder/0112.\346\214\221\346\210\230boss.md" "b/problems/kamacoder/0112.\346\214\221\346\210\230boss.md" new file mode 100644 index 0000000000..781fb6e802 --- /dev/null +++ "b/problems/kamacoder/0112.\346\214\221\346\210\230boss.md" @@ -0,0 +1,26 @@ + +# 112. 挑战boss + +本题题意有点绕,注意看一下 题目描述中的【提示信息】,但是在笔试中,是不给这样的提示信息的。 + +简单模拟: + +```CPP +#include +using namespace std; +int main() { + int n, a, b, k = 0; + cin >> n >> a >> b; + string s; + cin >> s; + int result = 0; + for (int i = 0; i < s.size(); i++) { + int cur = a + k * b; + result += cur; + ++k; + if (s[i] == 'x') k = 0; + } + cout << result << endl; + return 0; +} +``` diff --git "a/problems/kamacoder/0114.\345\260\217\346\254\247\347\232\204\345\271\263\345\235\207\346\225\260.md" "b/problems/kamacoder/0114.\345\260\217\346\254\247\347\232\204\345\271\263\345\235\207\346\225\260.md" new file mode 100644 index 0000000000..1188d9159d --- /dev/null +++ "b/problems/kamacoder/0114.\345\260\217\346\254\247\347\232\204\345\271\263\345\235\207\346\225\260.md" @@ -0,0 +1,29 @@ + +# 114. 小欧的平均数 + +这道题非常的脑筋急转弯, 读题都要理解半天。 + +初步读题,感觉好像是求 如何最小加减,得到三个数的平均数。 + +但题意不是这样的。 + +小欧的说的三个数平衡,只是三个数里 任何两个数 相加都能被2整除, 那么 也就是说,这三个数 要么都是 奇数,要么都是偶数,才能达到小欧所说的平衡。 + +所以题目要求的,就是,三个数,最小加减1 几次 可以让三个数都变成奇数,或者都变成偶数。 + +所以最终的结果 不是1 就是0,没有其他的。 + +录友可能想,题目出的这么绕干啥? 没办法,企业的笔试题就是这样的。 + +```CPP +#include +#include +using namespace std; +int main() { + int x, y, z; + cin >> x >> y >> z; + int count = (x % 2 == 0) + (y % 2 == 0) + (z % 2 == 0); + cout << min(3 - count, count); +} +``` + diff --git "a/problems/kamacoder/0115.\347\273\204\350\243\205\346\211\213\346\234\272.md" "b/problems/kamacoder/0115.\347\273\204\350\243\205\346\211\213\346\234\272.md" new file mode 100644 index 0000000000..8cae4a78a5 --- /dev/null +++ "b/problems/kamacoder/0115.\347\273\204\350\243\205\346\211\213\346\234\272.md" @@ -0,0 +1,67 @@ + +# 115. 组装手机 + +这道题是比较难得哈希表题目。 把代码随想录哈希表章节理解透彻,做本题没问题。 + +思路是 + +1. 用哈希表记录 外壳售价 和 手机零件售价 出现的次数 +2. 记录总和出现的次数 +3. 遍历总和,减去 外壳售价,看 手机零件售价出现了几次 +4. 最后累加,取最大值 + +有一个需要注意的点: 数字可以重复,在计算个数的时候,如果计算重复的数字 + +例如 如果输入是 + +``` +4 +1 1 1 1 +1 1 1 1 +``` +那么输出应该是 4, 外壳售价 和 手机零件售价 是可以重复的。 + +代码如下: + +```CPP +#include +#include +#include +#include +using namespace std; +int main() { + int n; + cin >> n; + vector aVec(n, 0); + vector bVec(n, 0); + unordered_map aUmap; + unordered_map bUmap; + for (int i = 0; i < n; i++) { + cin >> aVec[i]; + aUmap[aVec[i]]++; + } + for (int i = 0; i < n; i++) { + cin >> bVec[i]; + bUmap[bVec[i]]++; + } + unordered_set uset; + for (int i = 0; i < n; i++) { + for (int j = 0; j < n; j++){ + uset.insert(aVec[i] + bVec[j]); + } + } + int result = 0; + for (int sum : uset) { + //cout << p.first << endl; + int count = 0; + for (pair p : aUmap) { + //cout << p.first - aVec[i] << endl; + if (sum - p.first > 0 && bUmap[sum - p.first] != 0) { + count += min(bUmap[sum - p.first], p.second); + } + } + result = max(result, count); + } + cout << result << endl; +} +``` diff --git "a/problems/kamacoder/0126.\351\252\221\345\243\253\347\232\204\346\224\273\345\207\273astar.md" "b/problems/kamacoder/0126.\351\252\221\345\243\253\347\232\204\346\224\273\345\207\273astar.md" index fe510ae25c..1ee44aace3 100644 --- "a/problems/kamacoder/0126.\351\252\221\345\243\253\347\232\204\346\224\273\345\207\273astar.md" +++ "b/problems/kamacoder/0126.\351\252\221\345\243\253\347\232\204\346\224\273\345\207\273astar.md" @@ -192,7 +192,7 @@ x1, x2 为起点坐标,y1, y2 为终点坐标 ,abs 为求绝对值,sqrt 计算出来 F 之后,按照 F 的 大小,来选去出队列的节点。 -可以使用 优先级队列 帮我们排好序,每次出队列,就是F最大的节点。 +可以使用 优先级队列 帮我们排好序,每次出队列,就是F最小的节点。 实现代码如下:(启发式函数 采用 欧拉距离计算方式) diff --git "a/problems/kamacoder/\345\260\217\347\276\216\347\232\204\346\216\222\345\210\227\350\257\242\351\227\256.md" "b/problems/kamacoder/0127.\345\260\217\347\276\216\347\232\204\346\216\222\345\210\227\350\257\242\351\227\256.md" similarity index 87% rename from "problems/kamacoder/\345\260\217\347\276\216\347\232\204\346\216\222\345\210\227\350\257\242\351\227\256.md" rename to "problems/kamacoder/0127.\345\260\217\347\276\216\347\232\204\346\216\222\345\210\227\350\257\242\351\227\256.md" index 0e58e39a90..3be7f75bf8 100644 --- "a/problems/kamacoder/\345\260\217\347\276\216\347\232\204\346\216\222\345\210\227\350\257\242\351\227\256.md" +++ "b/problems/kamacoder/0127.\345\260\217\347\276\216\347\232\204\346\216\222\345\210\227\350\257\242\351\227\256.md" @@ -1,7 +1,7 @@ -小美的排列询问 +# 小美的排列询问 -注意 x 和y 不分先后 +模拟题,注意 x 和y 不分先后 ```CPP diff --git "a/problems/kamacoder/\345\260\217\347\276\216\350\265\260\345\205\254\350\267\257.md" "b/problems/kamacoder/0128.\345\260\217\347\276\216\350\265\260\345\205\254\350\267\257.md" similarity index 69% rename from "problems/kamacoder/\345\260\217\347\276\216\350\265\260\345\205\254\350\267\257.md" rename to "problems/kamacoder/0128.\345\260\217\347\276\216\350\265\260\345\205\254\350\267\257.md" index 7d63b7510b..dea68b9090 100644 --- "a/problems/kamacoder/\345\260\217\347\276\216\350\265\260\345\205\254\350\267\257.md" +++ "b/problems/kamacoder/0128.\345\260\217\347\276\216\350\265\260\345\205\254\350\267\257.md" @@ -1,6 +1,11 @@ +# 小美走公路 -两个注意点 +在处理环形情况的时候,很多录友容易算懵了,不是多算一个数,就是少算一个数。 + +这里这样的题目,最好的方式是将 两个环展开,首尾相连,这样我们就可以通过 直线的思维去解题了 + +两个注意点: 1. x 可以比 y 大,题目没规定 x 和y 的大小顺序 2. 累计相加的数可能超过int diff --git "a/problems/kamacoder/0129.\345\260\217\347\276\216\347\232\204\350\233\213\347\263\225\345\210\207\345\211\262.md" "b/problems/kamacoder/0129.\345\260\217\347\276\216\347\232\204\350\233\213\347\263\225\345\210\207\345\211\262.md" index 84bbbd6f94..ae77478f13 100644 --- "a/problems/kamacoder/0129.\345\260\217\347\276\216\347\232\204\350\233\213\347\263\225\345\210\207\345\211\262.md" +++ "b/problems/kamacoder/0129.\345\260\217\347\276\216\347\232\204\350\233\213\347\263\225\345\210\207\345\211\262.md" @@ -1,5 +1,7 @@ -前缀和 +# 小美的蛋糕切割 + +二维前缀和,不了解前缀和的录友 可以自行查一下,是一个很容易理解的算法思路 ```CPP diff --git "a/problems/kamacoder/0130.\345\260\217\347\276\216\347\232\204\345\255\227\347\254\246\344\270\262\345\217\230\346\215\242.md" "b/problems/kamacoder/0130.\345\260\217\347\276\216\347\232\204\345\255\227\347\254\246\344\270\262\345\217\230\346\215\242.md" index cd889995ec..9f9d789930 100644 --- "a/problems/kamacoder/0130.\345\260\217\347\276\216\347\232\204\345\255\227\347\254\246\344\270\262\345\217\230\346\215\242.md" +++ "b/problems/kamacoder/0130.\345\260\217\347\276\216\347\232\204\345\255\227\347\254\246\344\270\262\345\217\230\346\215\242.md" @@ -36,7 +36,6 @@ void bfs(const vector>& grid, vector>& visited, int x, } } - int main() { int n; string s; diff --git "a/problems/kamacoder/0131.\345\260\217\347\276\216\347\232\204\346\240\221\344\270\212\346\237\223\350\211\262.md" "b/problems/kamacoder/0131.\345\260\217\347\276\216\347\232\204\346\240\221\344\270\212\346\237\223\350\211\262.md" index 1f5212b0e5..36b3c38cc2 100644 --- "a/problems/kamacoder/0131.\345\260\217\347\276\216\347\232\204\346\240\221\344\270\212\346\237\223\350\211\262.md" +++ "b/problems/kamacoder/0131.\345\260\217\347\276\216\347\232\204\346\240\221\344\270\212\346\237\223\350\211\262.md" @@ -1,5 +1,134 @@ # 131. 小美的树上染色 -贪心的思路 : https://blog.csdn.net/weixin_43739821/article/details/136299012 +本题为树形dp 稍有难度,主要在于 递推公式上。 + +dp数组的定义: + +dp[cur][1] :当前节点染色,那么当前节点为根节点及其左右子节点中,可以染色的最大数量 + +dp[cur][0] :当前节点不染色,那么当前节点为根节点及其左右子节点中,可以染色的最大数量 + +关于 dp转移方程 + +1、 情况一: + +如果当前节点不染色,那就去 子节点 染色 或者 不染色的最大值。 + +`dp[cur][0] += max(dp[child][0], dp[child][1]);` + + +2、情况二: + +那么当前节点染色的话,这种情况就不好想了。 + +首先这不是二叉树,每一个节点都有可能 会有n个子节点。 + +所以我们要分别讨论,每一个子节点的情况 对父节点的影响。 + +那么父节点 针对每种情况,就要去 最大值, 也就是 `dp[cur][1] = max(dp[cur][1], 每个自孩子的情况)` + +如图,假如节点1 是我们要计算的父节点,节点2是我们这次要计算的子节点。 + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240617204601.png) + +选中一个节点2 作为我们这次计算的子节点,父节点染色的话,子节点必染色。 + +接下来就是计算 父节点1和该子节点2染色的话, 以子节点2 为根的 染色节点的最大数量 。 + +是:节点2不染色 且 以节点2为根节点的最大 染色数量 + 2, + 2 是因为 节点 1 和 节点2 要颜色了,染色节点增加两个。 + +代码:`dp[child][0] + 2` + +细心的录友会发现,那我们只计算了 红色框里面的,那么框外 最大的染色数量是多少呢? + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240617205709.png) + + +先看 作为子节点的节点2 为根节点的最大染色数量是多少? 取一个最值,即 节点2染色 或者 不染色取最大值。 + +代码:`max(dp[child][0], dp[child][1])` + +那么红框以外的 染色最大节点数量 就是 `dp[cur][0] - max(dp[child][0], dp[child][1])` + +(cur是节点1,child是节点2) + +红框以外的染色最大数量 + 父节点1和该子节点2染色的话 以子节点2 为根的 染色节点的最大数量 就是 节点1 染色的最大节点数量。 + +代码: + +`dp[cur][1] = max(dp[cur][1], dp[cur][0] - max(dp[child][0], dp[child][1]) + dp[child][0] + 2);` + +整体代码如下: + +```CPP + +#include +#include +#include +#include +#include + +using namespace std; + +int maxN = 10005; +vector> dp (maxN, vector(2, 0)); +vector> grid(maxN); // 邻接表 +vector value(maxN); // 存储每个节点的权值 + + +// 在树上进行动态规划的函数 +void dpOnTheTree(int cur) { + + for (int child : grid[cur]) { + // 后序遍历,从下向上计算 + dpOnTheTree(child); + // 情况一 + dp[cur][0] += max(dp[child][0], dp[child][1]); + + } + + // 计算dp[1] - 当前节点染色 + for (int child : grid[cur]) { + long mul = value[cur] * value[child]; // 当前节点和相邻节点权值的乘积 + long sqrtNum = (long) sqrt(mul); + + if (sqrtNum * sqrtNum == mul) { // 如果乘积是完全平方数 + // 情况二 + // dp[cur][0] 表示所有子节点 染色或者不染色的 最大染色数量 + // max(dp[child][0], dp[child][1]) 需要染色节点的孩子节点的最大染色数量 + // dp[cur][0] - max(dp[child][0], dp[child][1]) 除了要染色的节点及其子节点,其他孩子的最大染色数量 + // 最后 + dp[child][0] + 2 , 就是本节点染色的最大染色节点数量 + dp[cur][1] = max(dp[cur][1], dp[cur][0] - max(dp[child][0], dp[child][1]) + dp[child][0] + 2); + } + } + +} + +int main() { + + int n; + cin >> n; // 输入节点数量 + + // 读取节点权值 + for (int i = 1; i <= n; ++i) { + cin >> value[i]; + } + + // 构建树的邻接表 + for (int i = 1; i < n; ++i) { + int x, y; + cin >> x >> y; + grid[x].push_back(y); + } + + // 从根节点(节点1)开始进行动态规划 + dpOnTheTree(1); + + // 输出最大染色节点数量 + cout << max(dp[1][0], dp[1][1]) << endl; + + return 0; +} + +``` -dp思路:https://www.cnblogs.com/ganyq/p/18111114 diff --git "a/problems/kamacoder/\345\244\271\345\220\203\346\227\227.md" "b/problems/kamacoder/\345\244\271\345\220\203\346\227\227.md" new file mode 100644 index 0000000000..a53568dd9c --- /dev/null +++ "b/problems/kamacoder/\345\244\271\345\220\203\346\227\227.md" @@ -0,0 +1,47 @@ + +#include + +using namespace std; + +int main() { + int t = 0; + + cin >> t; + + while(t--) { + vector grid(3, ""); + int a = 0; + int b = 0; + for(int i = 0; i < 3; i++) { + cin >> grid[i]; + if(grid[i] == "o*o") { + a++; + } else if(grid[i] == "*o*") { + b++; + } + } + // 判断列 + for(int i = 0; i < 3; i++) { + string line(1, grid[0][i]); + line += grid[1][i]; + line += grid[2][i]; + + if(line == "o*o") { + a++; + } else if(line == "*o*") { + b++; + } + } + if((a && b) || (!a && !b)) { + cout << "draw" << endl; + } + if(a && !b) { + cout << "yukan" << endl; + } + if(!a && b) { + cout << "kou" << endl; + } + } + + return 0; +} From 5cb1a4c202018e2cd77d081e72f65dd801a8ed9f Mon Sep 17 00:00:00 2001 From: lizhuo Date: Mon, 24 Jun 2024 18:43:39 +0800 Subject: [PATCH 2676/3019] =?UTF-8?q?doc=EF=BC=9A=E3=80=8A=E5=A6=82?= =?UTF-8?q?=E4=BD=95=E5=9C=A8Github=E4=B8=8A=E6=8F=90=E4=BA=A4PR=E3=80=8B?= =?UTF-8?q?=E6=96=87=E5=AD=97=E7=BC=BA=E5=B0=91=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/qita/join.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/problems/qita/join.md b/problems/qita/join.md index 62dec674d5..c7e17588bf 100644 --- a/problems/qita/join.md +++ b/problems/qita/join.md @@ -188,7 +188,7 @@ python代码 大家提交代码的热情太高了,我有时候根本处理不过来,但我必须当天处理完,否则第二天代码冲突会越来越多。
-一天晚分别有两位录友提交了 30多道 java代码,全部冲突,解决冲突处理的我脖子疼[哭] +一天晚上分别有两位录友提交了 30多道 java代码,全部冲突,解决冲突处理的我脖子疼[哭] 那么在处理冲突的时候 保留谁的代码,删点谁的代码呢? From 2b6c2b509822ac66726f4b839349e499f009dd08 Mon Sep 17 00:00:00 2001 From: SusanAIFF <50587627+SusanAIFF@users.noreply.github.com> Date: Wed, 26 Jun 2024 15:43:39 +0800 Subject: [PATCH 2677/3019] =?UTF-8?q?Update=200101.=E5=AD=A4=E5=B2=9B?= =?UTF-8?q?=E7=9A=84=E6=80=BB=E9=9D=A2=E7=A7=AF.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 更新了101.孤岛总面积 - python 广搜实现版本 --- ...04\346\200\273\351\235\242\347\247\257.md" | 51 ++++++++++++++++++- 1 file changed, 50 insertions(+), 1 deletion(-) diff --git "a/problems/kamacoder/0101.\345\255\244\345\262\233\347\232\204\346\200\273\351\235\242\347\247\257.md" "b/problems/kamacoder/0101.\345\255\244\345\262\233\347\232\204\346\200\273\351\235\242\347\247\257.md" index b300b58ca4..25de67ecd2 100644 --- "a/problems/kamacoder/0101.\345\255\244\345\262\233\347\232\204\346\200\273\351\235\242\347\247\257.md" +++ "b/problems/kamacoder/0101.\345\255\244\345\262\233\347\232\204\346\200\273\351\235\242\347\247\257.md" @@ -186,7 +186,56 @@ int main() { ### Java ### Python - +```python +from collections import deque + +# 处理输入 +n, m = list(map(int, input().strip().split())) +g = [] +for _ in range(n): + row = list(map(int, input().strip().split())) + g.append(row) + +# 定义四个方向、孤岛面积(遍历完边缘后会被重置) +directions = [[0,1], [1,0], [-1,0], [0,-1]] +count = 0 + +# 广搜 +def bfs(r, c): + global count + q = deque() + q.append((r, c)) + g[r][c] = 0 + count += 1 + + while q: + r, c = q.popleft() + for di in directions: + next_r = r + di[0] + next_c = c + di[1] + if next_c < 0 or next_c >= m or next_r < 0 or next_r >= n: + continue + if g[next_r][next_c] == 1: + q.append((next_r, next_c)) + g[next_r][next_c] = 0 + count += 1 + + +for i in range(n): + if g[i][0] == 1: bfs(i, 0) + if g[i][m-1] == 1: bfs(i, m-1) + +for i in range(m): + if g[0][i] == 1: bfs(0, i) + if g[n-1][i] == 1: bfs(n-1, i) + +count = 0 +for i in range(n): + for j in range(m): + if g[i][j] == 1: bfs(i, j) + +print(count) +``` ### Go ### Rust From c4eb2cb824f8415e28519911abd0780cdae899eb Mon Sep 17 00:00:00 2001 From: Erudito Soul <20226472@stu.neu.edu.cn> Date: Wed, 26 Jun 2024 21:17:00 +0800 Subject: [PATCH 2678/3019] =?UTF-8?q?Update=200098.=E6=89=80=E6=9C=89?= =?UTF-8?q?=E5=8F=AF=E8=BE=BE=E8=B7=AF=E5=BE=84.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 提供了Java和Python版本代码 --- ...57\350\276\276\350\267\257\345\276\204.md" | 179 +++++++++++++++++- 1 file changed, 178 insertions(+), 1 deletion(-) diff --git "a/problems/kamacoder/0098.\346\211\200\346\234\211\345\217\257\350\276\276\350\267\257\345\276\204.md" "b/problems/kamacoder/0098.\346\211\200\346\234\211\345\217\257\350\276\276\350\267\257\345\276\204.md" index c4cfc8f9a4..3a1ae6851d 100644 --- "a/problems/kamacoder/0098.\346\211\200\346\234\211\345\217\257\350\276\276\350\267\257\345\276\204.md" +++ "b/problems/kamacoder/0098.\346\211\200\346\234\211\345\217\257\350\276\276\350\267\257\345\276\204.md" @@ -409,9 +409,186 @@ int main() { ## 其他语言版本 ### Java +#### 邻接矩阵写法 +```java +import java.util.ArrayList; +import java.util.List; +import java.util.Scanner; + +public class Main { + static List> result = new ArrayList<>(); // 收集符合条件的路径 + static List path = new ArrayList<>(); // 1节点到终点的路径 + + public static void dfs(int[][] graph, int x, int n) { + // 当前遍历的节点x 到达节点n + if (x == n) { // 找到符合条件的一条路径 + result.add(new ArrayList<>(path)); + return; + } + for (int i = 1; i <= n; i++) { // 遍历节点x链接的所有节点 + if (graph[x][i] == 1) { // 找到 x链接的节点 + path.add(i); // 遍历到的节点加入到路径中来 + dfs(graph, i, n); // 进入下一层递归 + path.remove(path.size() - 1); // 回溯,撤销本节点 + } + } + } -### Python + public static void main(String[] args) { + Scanner scanner = new Scanner(System.in); + int n = scanner.nextInt(); + int m = scanner.nextInt(); + + // 节点编号从1到n,所以申请 n+1 这么大的数组 + int[][] graph = new int[n + 1][n + 1]; + + for (int i = 0; i < m; i++) { + int s = scanner.nextInt(); + int t = scanner.nextInt(); + // 使用邻接矩阵表示无向图,1 表示 s 与 t 是相连的 + graph[s][t] = 1; + } + + path.add(1); // 无论什么路径已经是从1节点出发 + dfs(graph, 1, n); // 开始遍历 + + // 输出结果 + if (result.isEmpty()) System.out.println(-1); + for (List pa : result) { + for (int i = 0; i < pa.size() - 1; i++) { + System.out.print(pa.get(i) + " "); + } + System.out.println(pa.get(pa.size() - 1)); + } + } +} +``` + +#### 邻接表写法 +```java +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; +import java.util.Scanner; + +public class Main { + static List> result = new ArrayList<>(); // 收集符合条件的路径 + static List path = new ArrayList<>(); // 1节点到终点的路径 + + public static void dfs(List> graph, int x, int n) { + if (x == n) { // 找到符合条件的一条路径 + result.add(new ArrayList<>(path)); + return; + } + for (int i : graph.get(x)) { // 找到 x指向的节点 + path.add(i); // 遍历到的节点加入到路径中来 + dfs(graph, i, n); // 进入下一层递归 + path.remove(path.size() - 1); // 回溯,撤销本节点 + } + } + + public static void main(String[] args) { + Scanner scanner = new Scanner(System.in); + int n = scanner.nextInt(); + int m = scanner.nextInt(); + + // 节点编号从1到n,所以申请 n+1 这么大的数组 + List> graph = new ArrayList<>(n + 1); + for (int i = 0; i <= n; i++) { + graph.add(new LinkedList<>()); + } + + while (m-- > 0) { + int s = scanner.nextInt(); + int t = scanner.nextInt(); + // 使用邻接表表示 s -> t 是相连的 + graph.get(s).add(t); + } + path.add(1); // 无论什么路径已经是从1节点出发 + dfs(graph, 1, n); // 开始遍历 + + // 输出结果 + if (result.isEmpty()) System.out.println(-1); + for (List pa : result) { + for (int i = 0; i < pa.size() - 1; i++) { + System.out.print(pa.get(i) + " "); + } + System.out.println(pa.get(pa.size() - 1)); + } + } +} +``` +### Python +#### 邻接矩阵写法 +``` python +def dfs(graph, x, n, path, result): + if x == n: + result.append(path.copy()) + return + for i in range(1, n + 1): + if graph[x][i] == 1: + path.append(i) + dfs(graph, i, n, path, result) + path.pop() + +def main(): + n, m = map(int, input().split()) + graph = [[0] * (n + 1) for _ in range(n + 1)] + + for _ in range(m): + s, t = map(int, input().split()) + graph[s][t] = 1 + + result = [] + dfs(graph, 1, n, [1], result) + + if not result: + print(-1) + else: + for path in result: + print(' '.join(map(str, path))) + +if __name__ == "__main__": + main() +``` + +#### 邻接表写法 +``` python +from collections import defaultdict + +result = [] # 收集符合条件的路径 +path = [] # 1节点到终点的路径 + +def dfs(graph, x, n): + if x == n: # 找到符合条件的一条路径 + result.append(path.copy()) + return + for i in graph[x]: # 找到 x指向的节点 + path.append(i) # 遍历到的节点加入到路径中来 + dfs(graph, i, n) # 进入下一层递归 + path.pop() # 回溯,撤销本节点 + +def main(): + n, m = map(int, input().split()) + + graph = defaultdict(list) # 邻接表 + for _ in range(m): + s, t = map(int, input().split()) + graph[s].append(t) + + path.append(1) # 无论什么路径已经是从1节点出发 + dfs(graph, 1, n) # 开始遍历 + + # 输出结果 + if not result: + print(-1) + for pa in result: + print(' '.join(map(str, pa))) + +if __name__ == "__main__": + main() +``` ### Go ### Rust From 718d3c065a351547f1c95a1941372b40e36e07e8 Mon Sep 17 00:00:00 2001 From: SteveL <66228787+stevenleon99@users.noreply.github.com> Date: Thu, 27 Jun 2024 07:33:01 -0400 Subject: [PATCH 2679/3019] =?UTF-8?q?Update=200018.=E5=9B=9B=E6=95=B0?= =?UTF-8?q?=E4=B9=8B=E5=92=8C.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit add 剪枝 to the second for loop --- ...0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" | 5 +++++ 1 file changed, 5 insertions(+) diff --git "a/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" "b/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" index 9c8bb4fe24..8e34713d37 100644 --- "a/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" @@ -262,6 +262,11 @@ class Solution { for (int j = i + 1; j < nums.length; j++) { + // nums[i]+nums[j] > target 直接返回, 剪枝操作 + if (nums[i]+nums[j] > 0 && nums[i]+nums[j] > target) { + return result; + } + if (j > i + 1 && nums[j - 1] == nums[j]) { // 对nums[j]去重 continue; } From 686c3a5580fa79b5c22a2b783301f82b41769e8d Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Sun, 30 Jun 2024 15:46:16 +0800 Subject: [PATCH 2680/3019] Update --- ...8.\345\214\272\351\227\264\345\222\214.md" | 191 ++++++++++++++++++ ...50\345\217\257\350\276\276\346\200\247.md" | 2 +- ...7\232\204\346\224\273\345\207\273astar.md" | 5 + ...2.\345\244\271\345\220\203\346\227\227.md" | 47 +++++ ...17\347\272\242\344\271\260\350\215\257.md" | 48 +++++ ...00\345\260\217\346\255\245\346\225\260.md" | 77 +++++++ .../\345\244\271\345\220\203\346\227\227.md" | 47 ----- ...62\345\244\204\347\220\206\345\231\250.md" | 50 +++++ ...02\347\202\271\345\210\227\350\241\250.md" | 47 +++++ 9 files changed, 466 insertions(+), 48 deletions(-) create mode 100644 "problems/kamacoder/0058.\345\214\272\351\227\264\345\222\214.md" create mode 100644 "problems/kamacoder/0132.\345\244\271\345\220\203\346\227\227.md" create mode 100644 "problems/kamacoder/0133.\345\260\217\347\272\242\344\271\260\350\215\257.md" create mode 100644 "problems/kamacoder/0134.\347\232\207\345\220\216\347\247\273\345\212\250\347\232\204\346\234\200\345\260\217\346\255\245\346\225\260.md" delete mode 100644 "problems/kamacoder/\345\244\271\345\220\203\346\227\227.md" create mode 100644 "problems/kamacoder/\345\255\227\347\254\246\344\270\262\345\244\204\347\220\206\345\231\250.md" create mode 100644 "problems/kamacoder/\350\216\267\345\217\226\350\277\236\351\200\232\347\232\204\347\233\270\351\202\273\350\212\202\347\202\271\345\210\227\350\241\250.md" diff --git "a/problems/kamacoder/0058.\345\214\272\351\227\264\345\222\214.md" "b/problems/kamacoder/0058.\345\214\272\351\227\264\345\222\214.md" new file mode 100644 index 0000000000..a4bb54e940 --- /dev/null +++ "b/problems/kamacoder/0058.\345\214\272\351\227\264\345\222\214.md" @@ -0,0 +1,191 @@ + +# 58. 区间和 + +[题目链接](https://kamacoder.com/problempage.php?pid=1070) + +题目描述 + +给定一个整数数组 Array,请计算该数组在每个指定区间内元素的总和。 + +输入描述 + +第一行输入为整数数组 Array 的长度 n,接下来 n 行,每行一个整数,表示数组的元素。随后的输入为需要计算总和的区间,直至文件结束。 + +输出描述 + +输出每个指定区间内元素的总和。 + +输入示例 + +``` +5 +1 +2 +3 +4 +5 +0 1 +1 3 +``` + +输出示例 + +``` +3 +9 +``` + +数据范围: + +0 < n <= 100000 + +## 思路 + +本题我们来讲解 数组 上常用的解题技巧:前缀和 + +首先来看本题,我们最直观的想法是什么? + +那就是给一个区间,然后 把这个区间的和都累加一遍不就得了,是一道简单不能再简单的题目。 + +代码如下: + +```CPP +#include +#include +using namespace std; +int main() { + int n, a, b; + cin >> n; + vector vec(n); + for (int i = 0; i < n; i++) cin >> vec[i]; + while (cin >> a >> b) { + int sum = 0; + // 累加区间 a 到 b 的和 + for (int i = a; i <= b; i++) sum += vec[i]; + cout << sum << endl; + } +} +``` + +代码一提交,发现超时了..... + +我在制作本题的时候,特别制作了大数据量查询,卡的就是这种暴力解法。 + +来举一个极端的例子,如果我查询m次,每次查询的范围都是从0 到 n - 1 + +那么该算法的时间复杂度是 O(n * m) m 是查询的次数 + +如果查询次数非常大的话,这个时间复杂度也是非常大的。 + +接下来我们来引入前缀和,看看前缀和如何解决这个问题。 + +前缀和的思想是重复利用计算过的子数组之和,从而降低区间查询需要累加计算的次数。 + +**前缀和 在涉及计算区间和的问题时非常有用**! + +前缀和的思路其实很简单,我给大家举个例子很容易就懂了。 + +例如,我们要统计 vec[i] 这个数组上的区间和。 + +我们先做累加,即 p[i] 表示 下标 0 到 i 的 vec[i] 累加 之和。 + +如图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240627110604.png) + + +如果,我们想统计,在vec数组上 下标 2 到下标 5 之间的累加和,那是不是就用 p[5] - p[1] 就可以了。 + +为什么呢? + +p[1] = vec[0] + vec[1]; + +p[5] = vec[0] + vec[1] + vec[2] + vec[3] + vec[4] + vec[5]; + +p[5] - p[1] = vec[2] + vec[3] + vec[4] + vec[5]; + +这不就是我们要求的 下标 2 到下标 5 之间的累加和吗。 + +如图所示: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240627111319.png) + +p[5] - p[1] 就是 红色部分的区间和。 + +而 p 数组是我们之前就计算好的累加和,所以后面每次求区间和的之后 我们只需要 O(1)的操作。 + + + +```CPP +#include +#include +using namespace std; +int main() { + int n, a, b; + cin >> n; + vector vec(n); + vector p(n); + int presum = 0; + for (int i = 0; i < n; i++) { + cin >> vec[i]; + presum += vec[i]; + p[i] = presum; + } + + while (cin >> a >> b) { + int sum; + if (a == 0) sum = p[b]; + else sum = p[b] - p[a - 1]; + cout << sum << endl; + } +} + +``` + +```CPP +#include +#include +using namespace std; +int main() { + int n, a, b; + cin >> n; + vector vec(n); + vector p(n); + int presum = 0; + for (int i = 0; i < n; i++) { + scanf("%d", &vec[i]); + presum += vec[i]; + p[i] = presum; + } + + while (~scanf("%d%d", &a, &b)) { + int sum; + if (a == 0) sum = p[b]; + else sum = p[b] - p[a - 1]; + printf("%d\n", sum); + } +} + +``` + +```CPP + +#include +using namespace std; + + +int main(){ + int n, a, b; + cin >> n; + vector vec(n + 1); + vector p(n + 1, 0); + for(int i = 1; i <= n; i++) { + scanf("%d", &vec[i]); + p[i] = p[i - 1] + vec[i]; + } + while(~scanf("%d%d", &a, &b)){ + printf("%d\n", p[b + 1] - p[a]); + } + return 0; +} +``` diff --git "a/problems/kamacoder/0105.\346\234\211\345\220\221\345\233\276\347\232\204\345\256\214\345\205\250\345\217\257\350\276\276\346\200\247.md" "b/problems/kamacoder/0105.\346\234\211\345\220\221\345\233\276\347\232\204\345\256\214\345\205\250\345\217\257\350\276\276\346\200\247.md" index dfaa3be8ca..03048825c5 100644 --- "a/problems/kamacoder/0105.\346\234\211\345\220\221\345\233\276\347\232\204\345\256\214\345\205\250\345\217\257\350\276\276\346\200\247.md" +++ "b/problems/kamacoder/0105.\346\234\211\345\220\221\345\233\276\347\232\204\345\256\214\345\205\250\345\217\257\350\276\276\346\200\247.md" @@ -24,7 +24,7 @@ 1 2 2 1 1 3 -3 4 +2 4 ``` 【输出示例】 diff --git "a/problems/kamacoder/0126.\351\252\221\345\243\253\347\232\204\346\224\273\345\207\273astar.md" "b/problems/kamacoder/0126.\351\252\221\345\243\253\347\232\204\346\224\273\345\207\273astar.md" index 1ee44aace3..26f4529bc7 100644 --- "a/problems/kamacoder/0126.\351\252\221\345\243\253\347\232\204\346\224\273\345\207\273astar.md" +++ "b/problems/kamacoder/0126.\351\252\221\345\243\253\347\232\204\346\224\273\345\207\273astar.md" @@ -7,6 +7,10 @@ 在象棋中,马和象的移动规则分别是“马走日”和“象走田”。现给定骑士的起始坐标和目标坐标,要求根据骑士的移动规则,计算从起点到达目标点所需的最短步数。 +骑士移动规则如图,红色是起始位置,黄色是骑士可以走的地方。 + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240626104833.png) + 棋盘大小 1000 x 1000(棋盘的 x 和 y 坐标均在 [1, 1000] 区间内,包含边界) 输入描述 @@ -42,6 +46,7 @@ 0 ``` + ## 思路 我们看到这道题目的第一个想法就是广搜,这也是最经典的广搜类型题目。 diff --git "a/problems/kamacoder/0132.\345\244\271\345\220\203\346\227\227.md" "b/problems/kamacoder/0132.\345\244\271\345\220\203\346\227\227.md" new file mode 100644 index 0000000000..2ec50bfb12 --- /dev/null +++ "b/problems/kamacoder/0132.\345\244\271\345\220\203\346\227\227.md" @@ -0,0 +1,47 @@ + +# 132. 夹吃棋 + +[题目链接](https://kamacoder.com/problempage.php?pid=1209) + +这道题是模拟题,但很多录友可能想复杂了。 + +行方向,白棋吃,只有这样的布局 `o*o`,黑棋吃,只有这样的布局 `*o*` + +列方向也是同理的。 + +想到这一点,本题的代码就容易写了, C++代码如下: + +```CPP +#include +#include +using namespace std; +int main() { + int n; + cin >> n; + while (n--) { + int black = 0, white = 0; + vector grid(3, ""); + // 判断行 + for (int i = 0; i < 3; i++) { + cin >> grid[i]; + if (grid[i] == "o*o") white++; + if (grid[i] == "*o*") black++; + } + // 判断列 + for (int i = 0; i < 3; i++) { + string s; + s += grid[0][i]; + s += grid[1][i]; + s += grid[2][i]; + if (s == "o*o") white++; + if (s == "*o*") black++; + } + // 如果一个棋盘的局面没有一方被夹吃或者黑白双方都被对面夹吃,则认为是平局 + if ((!white && !black) || (white && black)) cout << "draw" << endl; + // 白棋赢 + else if (white && !black) cout << "yukan" << endl; + // 黑棋赢 + else cout << "kou" << endl; + } +} +``` diff --git "a/problems/kamacoder/0133.\345\260\217\347\272\242\344\271\260\350\215\257.md" "b/problems/kamacoder/0133.\345\260\217\347\272\242\344\271\260\350\215\257.md" new file mode 100644 index 0000000000..2b144fa5c5 --- /dev/null +++ "b/problems/kamacoder/0133.\345\260\217\347\272\242\344\271\260\350\215\257.md" @@ -0,0 +1,48 @@ + +# 133. 小红买药 + +[题目链接](https://kamacoder.com/problempage.php?pid=1210) + +本题是一道直观的模拟题,但也并不简单,很多情况容易漏了,笔试现场可能要多错几次 才能把情况都想到。 + +主要是三个情况: + +* 小红没症状,药有副作用,统计加一,同时要给小红标记上症状 +* 小红有症状,药治不了,同时也没副症状 ,这时也要统计加一 +* 小红有症状,药可以治,给小红取消症状标记 + + +```CPP +#include +#include +using namespace std; +int main() { + int n, m, q, u; + cin >> n; + string s; + cin >> s; + cin >> m; + vector a(m + 1); // 因为后面u是从1开始的 + vector b(m + 1); + for (int i = 1; i <= m; i++) { + cin >> a[i] >> b[i]; + } + cin >> q; + while (q--) { + cin >> u; + int num = 0; + for (int i = 0; i < n; i++) { + // s 没症状,但b给了副作用,统计num的同时,要给s标记上症状 + if (s[i] == '0' && b[u][i] == '1') { + num ++; + s[i] = '1'; + } + // s 有症状,但 a治不了,b也没副症状 + else if (s[i] == '1' && a[u][i] == '0' && a[u][i] == '0') num++; + // s 有症状,a 可以治 + else if (s[i] == '1' && a[u][i] == '1') s[i] = '0'; + } + cout << num << endl; + } +} +``` diff --git "a/problems/kamacoder/0134.\347\232\207\345\220\216\347\247\273\345\212\250\347\232\204\346\234\200\345\260\217\346\255\245\346\225\260.md" "b/problems/kamacoder/0134.\347\232\207\345\220\216\347\247\273\345\212\250\347\232\204\346\234\200\345\260\217\346\255\245\346\225\260.md" new file mode 100644 index 0000000000..ca681df412 --- /dev/null +++ "b/problems/kamacoder/0134.\347\232\207\345\220\216\347\247\273\345\212\250\347\232\204\346\234\200\345\260\217\346\255\245\346\225\260.md" @@ -0,0 +1,77 @@ + +# 134. 皇后移动的最小步数 + +[题目链接](https://kamacoder.com/problempage.php?pid=1211) + +本题和 [代码随想录-不同路径](https://www.programmercarl.com/0062.%E4%B8%8D%E5%90%8C%E8%B7%AF%E5%BE%84.html) 有一些类似。 + +关键是弄清楚递推公式 + +一共分三个情况, + +情况一,向右移动: + +然后从 (i, j) 再向右走 到 (i, k)。 无论k 多大,步数只加1 : + +`dp[i][k] = dp[i][j] + 1` + +那么 `dp[i][k]` 也有可能 从其他方向得到,例如 从上到下, 或者斜上方到达 dp[i][k] + +本题我们要求最小步数,所以取最小值:`dp[i][k] = min(dp[i][k], dp[i][j] + 1);` + +情况二,向下移动: + +从 (i, j) 再向下走 到 (k, j)。 无论k 多大,步数只加1 : + +`dp[k][j] = dp[i][j] + 1;` + +同理 `dp[i][k]` 也有可能 从其他方向得到,取最小值:`dp[k][j] = min(dp[k][j], dp[i][j] + 1);` + +情况三,右下方移动: + +从 (i, j) 再向右下方移动 到 (i + k, j + k)。 无论k 多大,步数只加1 : + +`dp[i + k][j + k] = dp[i][j] + 1` + +同理 `dp[i + k][j + k]` 也有可能 从其他方向得到,取最小值:`dp[i + k][j + k] = min(dp[i + k][j + k], dp[i][j] + 1);` + + +```CPP +#include +#include +using namespace std; +const int INF = 4e6; // 最多步数也就是 2000 * 2000 +int main() { + int n, m; + cin >> n >> m; + vector> grid(n, vector(m)); + for (int i = 0; i < n; i++) { + for (int j = 0; j < m; j++) { + cin >> grid[i][j]; + } + } + vector> dp(n, vector(m, INF)); + dp[0][0] = 0; + for (int i = 0; i < n; i++) { + for (int j = 0; j < m; j++) { + if (grid[i][j] == '*') continue; + // 向右移动k个格子 + for (int k = j + 1; k < m && grid[i][k] == '.'; k++) { + dp[i][k] = min(dp[i][k], dp[i][j] + 1); + } + // 向下移动 k个格子 + for (int k = i + 1; k < n && grid[k][j] == '.'; k++) { + dp[k][j] = min(dp[k][j], dp[i][j] + 1); + } + // 向右下移动k个格子 + for (int k = 1; i + k < n && j + k < m && grid[i + k][j + k] == '.'; k++) { + dp[i + k][j + k] = min(dp[i + k][j + k], dp[i][j] + 1); + } + } + } + if (dp[n - 1][m - 1] == INF) cout << -1 << endl; + else cout << dp[n - 1][m - 1] << endl; +} +``` + + diff --git "a/problems/kamacoder/\345\244\271\345\220\203\346\227\227.md" "b/problems/kamacoder/\345\244\271\345\220\203\346\227\227.md" deleted file mode 100644 index a53568dd9c..0000000000 --- "a/problems/kamacoder/\345\244\271\345\220\203\346\227\227.md" +++ /dev/null @@ -1,47 +0,0 @@ - -#include - -using namespace std; - -int main() { - int t = 0; - - cin >> t; - - while(t--) { - vector grid(3, ""); - int a = 0; - int b = 0; - for(int i = 0; i < 3; i++) { - cin >> grid[i]; - if(grid[i] == "o*o") { - a++; - } else if(grid[i] == "*o*") { - b++; - } - } - // 判断列 - for(int i = 0; i < 3; i++) { - string line(1, grid[0][i]); - line += grid[1][i]; - line += grid[2][i]; - - if(line == "o*o") { - a++; - } else if(line == "*o*") { - b++; - } - } - if((a && b) || (!a && !b)) { - cout << "draw" << endl; - } - if(a && !b) { - cout << "yukan" << endl; - } - if(!a && b) { - cout << "kou" << endl; - } - } - - return 0; -} diff --git "a/problems/kamacoder/\345\255\227\347\254\246\344\270\262\345\244\204\347\220\206\345\231\250.md" "b/problems/kamacoder/\345\255\227\347\254\246\344\270\262\345\244\204\347\220\206\345\231\250.md" new file mode 100644 index 0000000000..bdd8222ed5 --- /dev/null +++ "b/problems/kamacoder/\345\255\227\347\254\246\344\270\262\345\244\204\347\220\206\345\231\250.md" @@ -0,0 +1,50 @@ + + +```CPP +#include +using namespace std; + int main() { + int index = 0; + long long optNum; + string s; + string cmd; + while(cin >> cmd){ + //cout << s << endl; + if(cmd == "insert"){ + string buff; + cin >> buff; + s.insert(index, buff); + index += buff.size(); + } + else if(cmd == "move"){ + cin >> optNum; + if(optNum > 0 && index + optNum <= s.size()) index += optNum; + if(optNum < 0 && index >= -optNum) index += optNum; + } + else if(cmd == "delete"){ + cin >> optNum; + if(index >= optNum && optNum != 0){ + s.erase(index - optNum, optNum); + index -= optNum; + } + } + else if(cmd == "copy"){ + if(index > 0) { + string tmp = s.substr(0, index); + s.insert(index, tmp); + } + } + else if(cmd == "end"){ + for(int i = 0; i < index; i++) { + cout << s[i]; + } + cout << '|'; + for(int i = index; i < s.size(); i++){ + cout << s[i]; + } + break; + } + } + return 0; + } +``` diff --git "a/problems/kamacoder/\350\216\267\345\217\226\350\277\236\351\200\232\347\232\204\347\233\270\351\202\273\350\212\202\347\202\271\345\210\227\350\241\250.md" "b/problems/kamacoder/\350\216\267\345\217\226\350\277\236\351\200\232\347\232\204\347\233\270\351\202\273\350\212\202\347\202\271\345\210\227\350\241\250.md" new file mode 100644 index 0000000000..791b6b6819 --- /dev/null +++ "b/problems/kamacoder/\350\216\267\345\217\226\350\277\236\351\200\232\347\232\204\347\233\270\351\202\273\350\212\202\347\202\271\345\210\227\350\241\250.md" @@ -0,0 +1,47 @@ + + + +```CPP +#include +#include +#include +#include +using namespace std; +int main() { + unordered_set uset; + int n, a; + cin >> n; + while (n--) { + cin >> a; + uset.insert(a); + } + int m, x, vlan_id; + long long tb; + vector vecTB; + cin >> m; + while(m--) { + cin >> tb; + cin >> x; + vector vecVlan_id(x); + for (int i = 0; i < x; i++) { + cin >> vecVlan_id[i]; + } + for (int i = 0; i < x; i++) { + if (uset.find(vecVlan_id[i]) != uset.end()) { + vecTB.push_back(tb); + break; + } + } + + } + + cout << vecTB.size() << endl; + if (vecTB.size() != 0) { + sort(vecTB.begin(), vecTB.end()); + for (int i = 0; i < vecTB.size() ; i++) cout << vecTB[i] << " "; + } + + +} + +``` From 2b93089f56765f3f48872e657a6c742e689c901f Mon Sep 17 00:00:00 2001 From: KaiserTT <116904940+KaiserTT@users.noreply.github.com> Date: Mon, 1 Jul 2024 13:06:09 +0800 Subject: [PATCH 2681/3019] add 0117 Java and Python --- ...57\344\273\266\346\236\204\345\273\272.md" | 101 +++++++++++++++++- 1 file changed, 100 insertions(+), 1 deletion(-) diff --git "a/problems/kamacoder/0117.\350\275\257\344\273\266\346\236\204\345\273\272.md" "b/problems/kamacoder/0117.\350\275\257\344\273\266\346\236\204\345\273\272.md" index 5d1edf97cd..05cb735815 100644 --- "a/problems/kamacoder/0117.\350\275\257\344\273\266\346\236\204\345\273\272.md" +++ "b/problems/kamacoder/0117.\350\275\257\344\273\266\346\236\204\345\273\272.md" @@ -167,7 +167,7 @@ ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240510114004.png) --------------- +-------------- 后面的过程一样的,节点3 和 节点4,入度都为0,选哪个都行。 @@ -344,8 +344,107 @@ int main() { ### Java +```java +import java.util.*; + + +public class Main { + public static void main(String[] args) { + Scanner scanner = new Scanner(System.in); + int n = scanner.nextInt(); + int m = scanner.nextInt(); + + List> umap = new ArrayList<>(); // 记录文件依赖关系 + int[] inDegree = new int[n]; // 记录每个文件的入度 + + for (int i = 0; i < n; i++) + umap.add(new ArrayList<>()); + + for (int i = 0; i < m; i++) { + int s = scanner.nextInt(); + int t = scanner.nextInt(); + umap.get(s).add(t); // 记录s指向哪些文件 + inDegree[t]++; // t的入度加一 + } + + Queue queue = new LinkedList<>(); + for (int i = 0; i < n; i++) { + if (inDegree[i] == 0) { + // 入度为0的文件,可以作为开头,先加入队列 + queue.add(i); + } + } + + List result = new ArrayList<>(); + + // 拓扑排序 + while (!queue.isEmpty()) { + int cur = queue.poll(); // 当前选中的文件 + result.add(cur); + for (int file : umap.get(cur)) { + inDegree[file]--; // cur的指向的文件入度-1 + if (inDegree[file] == 0) { + queue.add(file); + } + } + } + + if (result.size() == n) { + for (int i = 0; i < result.size(); i++) { + System.out.print(result.get(i)); + if (i < result.size() - 1) { + System.out.print(" "); + } + } + } else { + System.out.println(-1); + } + } +} +``` + + + ### Python +```python +from collections import deque, defaultdict + +def topological_sort(n, edges): + inDegree = [0] * n # inDegree 记录每个文件的入度 + umap = defaultdict(list) # 记录文件依赖关系 + + # 构建图和入度表 + for s, t in edges: + inDegree[t] += 1 + umap[s].append(t) + + # 初始化队列,加入所有入度为0的节点 + queue = deque([i for i in range(n) if inDegree[i] == 0]) + result = [] + + while queue: + cur = queue.popleft() # 当前选中的文件 + result.append(cur) + for file in umap[cur]: # 获取该文件指向的文件 + inDegree[file] -= 1 # cur的指向的文件入度-1 + if inDegree[file] == 0: + queue.append(file) + + if len(result) == n: + print(" ".join(map(str, result))) + else: + print(-1) + + +if __name__ == "__main__": + n, m = map(int, input().split()) + edges = [tuple(map(int, input().split())) for _ in range(m)] + topological_sort(n, edges) +``` + + + ### Go ### Rust From db2fca022ecde6d1af4f8f0a30dc2607ee7c27b5 Mon Sep 17 00:00:00 2001 From: kr <963689810@qq.com> Date: Mon, 1 Jul 2024 15:12:42 +0800 Subject: [PATCH 2682/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A00078.=E5=AD=90?= =?UTF-8?q?=E9=9B=86=20Rust=E7=AC=AC=E4=BA=8C=E7=A7=8D=E6=80=9D=E8=B7=AF?= =?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/0078.\345\255\220\351\233\206.md" | 25 +++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git "a/problems/0078.\345\255\220\351\233\206.md" "b/problems/0078.\345\255\220\351\233\206.md" index 1415f2d27b..723d99a18b 100644 --- "a/problems/0078.\345\255\220\351\233\206.md" +++ "b/problems/0078.\345\255\220\351\233\206.md" @@ -287,6 +287,7 @@ function subsets(nums: number[]): number[][] { ### Rust +思路一:使用本题的标准解法,递归回溯。 ```Rust impl Solution { fn backtracking(result: &mut Vec>, path: &mut Vec, nums: &Vec, start_index: usize) { @@ -308,6 +309,30 @@ impl Solution { } } ``` +思路二:使用二进制枚举,n个元素的子集问题一共是$2^n$种情况。如果我们使用一个二进制数字,每一位根据0和1来决定是选取该元素与否,那么一共也是$2^n$的情况,正好可以一一对应,所以我们可以不使用递归,直接利用循环枚举完成子集问题。 +这种方法的优点在于效率高,不需要递归调用,并且代码容易编写。缺点则是过滤某些非法情况时会比递归方法难写一点,不过在子集问题中不存在这个问题。 +```Rust +impl Solution { + pub fn subsets(nums: Vec) -> Vec> { + let n = nums.len(); + // 预分配2^n空间 + let mut result = Vec::with_capacity(1 << n); + // 二进制枚举,2^n种情况 + for i in 0..(1 << n) { + let mut subset = Vec::new(); + for j in 0..n { + // 枚举该二进制数字的每一位 + // 如果该位是1,对应位置上的元素加入子集,否则跳过 + if i & (1 << j) != 0 { + subset.push(nums[j]); + } + } + result.push(subset); + } + result + } +} +``` ### C From 45ad945e63e90b45ef063d6c7dcc3cbc7ad60b2f Mon Sep 17 00:00:00 2001 From: SusanAIFF Date: Tue, 2 Jul 2024 18:02:39 +0800 Subject: [PATCH 2683/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E4=BA=86prim?= =?UTF-8?q?=E5=AF=BB=E5=AE=9D=E7=9A=84python=E5=86=99=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 更新了prim寻宝的python写法 --- .../0053.\345\257\273\345\256\235-prim.md" | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git "a/problems/kamacoder/0053.\345\257\273\345\256\235-prim.md" "b/problems/kamacoder/0053.\345\257\273\345\256\235-prim.md" index 782bd143dd..18256db81c 100644 --- "a/problems/kamacoder/0053.\345\257\273\345\256\235-prim.md" +++ "b/problems/kamacoder/0053.\345\257\273\345\256\235-prim.md" @@ -521,6 +521,40 @@ int main() { ### Java ### Python +```python +# 接收输入 +v, e = list(map(int, input().strip().split())) +# 按照常规的邻接矩阵存储图信息,不可达的初始化为10001 +graph = [[10001] * (v+1) for _ in range(v+1)] +for _ in range(e): + x, y, w = list(map(int, input().strip().split())) + graph[x][y] = w + graph[y][x] = w + +# 定义加入生成树的标记数组和未加入生成树的最近距离 +visited = [False] * (v + 1) +minDist = [10001] * (v + 1) + +# 循环 n - 1 次,建立 n - 1 条边 +# 从节点视角来看:每次选中一个节点加入树,更新剩余的节点到树的最短距离, +# 这一步其实蕴含了确定下一条选取的边,计入总路程 ans 的计算 +for _ in range(1, v + 1): + min_val = 10002 + cur = -1 + for j in range(1, v + 1): + if visited[j] == False and minDist[j] < min_val: + cur = j + min_val = minDist[j] + visited[cur] = True + for j in range(1, v + 1): + if visited[j] == False and minDist[j] > graph[cur][j]: + minDist[j] = graph[cur][j] + +ans = 0 +for i in range(2, v + 1): + ans += minDist[i] +print(ans) +``` ### Go From 2d62adc079f920e0bea4abce8f209cc7507c633e Mon Sep 17 00:00:00 2001 From: markwang Date: Thu, 4 Jul 2024 15:50:30 +0800 Subject: [PATCH 2684/3019] =?UTF-8?q?110.=E5=B9=B3=E8=A1=A1=E4=BA=8C?= =?UTF-8?q?=E5=8F=89=E6=A0=91=E5=A2=9E=E5=8A=A0Go=E8=BF=AD=E4=BB=A3?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...41\344\272\214\345\217\211\346\240\221.md" | 60 +++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git "a/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" "b/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" index dd05bdd6af..f8071333f0 100644 --- "a/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" @@ -623,6 +623,8 @@ class Solution: ``` ### Go: +递归法 + ```Go func isBalanced(root *TreeNode) bool { h := getHeight(root) @@ -653,6 +655,64 @@ func max(a, b int) int { } ``` +迭代法 + +```Go +func isBalanced(root *TreeNode) bool { + st := make([]*TreeNode, 0) + if root == nil { + return true + } + st = append(st, root) + for len(st) > 0 { + node := st[len(st)-1] + st = st[:len(st)-1] + if math.Abs(float64(getDepth(node.Left)) - float64(getDepth(node.Right))) > 1 { + return false + } + if node.Right != nil { + st = append(st, node.Right) + } + if node.Left != nil { + st = append(st, node.Left) + } + } + return true +} + +func getDepth(cur *TreeNode) int { + st := make([]*TreeNode, 0) + if cur != nil { + st = append(st, cur) + } + depth := 0 + result := 0 + for len(st) > 0 { + node := st[len(st)-1] + if node != nil { + st = st[:len(st)-1] + st = append(st, node, nil) + depth++ + if node.Right != nil { + st = append(st, node.Right) + } + if node.Left != nil { + st = append(st, node.Left) + } + } else { + st = st[:len(st)-1] + node = st[len(st)-1] + st = st[:len(st)-1] + depth-- + } + if result < depth { + result = depth + } + } + return result +} +``` + ### JavaScript: 递归法: From 72c1db1c8a3ab41ec12791d153bc27d7c269d2b7 Mon Sep 17 00:00:00 2001 From: ForsakenDelusion <144082461+ForsakenDelusion@users.noreply.github.com> Date: Sat, 6 Jul 2024 11:15:55 +0800 Subject: [PATCH 2685/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B00707.=E8=AE=BE?= =?UTF-8?q?=E8=AE=A1=E9=93=BE=E8=A1=A8=20=E6=96=B0=E5=A2=9ECPP=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E7=9A=84=E5=8F=8C=E9=93=BE=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...76\350\256\241\351\223\276\350\241\250.md" | 134 ++++++++++++++++++ 1 file changed, 134 insertions(+) diff --git "a/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" "b/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" index a247b17839..1dbcdc60e9 100644 --- "a/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" +++ "b/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" @@ -165,6 +165,140 @@ private: ## 其他语言版本 +### C++双链表法: + +```CPP +//采用循环虚拟结点的双链表实现 +class MyLinkedList { +public: + // 定义双向链表节点结构体 + struct DList { + int elem; // 节点存储的元素 + DList *next; // 指向下一个节点的指针 + DList *prev; // 指向上一个节点的指针 + // 构造函数,创建一个值为elem的新节点 + DList(int elem) : elem(elem), next(nullptr), prev(nullptr) {}; + }; + + // 构造函数,初始化链表 + MyLinkedList() { + sentinelNode = new DList(0); // 创建哨兵节点,不存储有效数据 + sentinelNode->next = sentinelNode; // 哨兵节点的下一个节点指向自身,形成循环 + sentinelNode->prev = sentinelNode; // 哨兵节点的上一个节点指向自身,形成循环 + size = 0; // 初始化链表大小为0 + } + + // 获取链表中第index个节点的值 + int get(int index) { + if (index > (size - 1) || index < 0) { // 检查索引是否超出范围 + return -1; // 如果超出范围,返回-1 + } + int num; + int mid = size >> 1; // 计算链表中部位置 + DList *curNode = sentinelNode; // 从哨兵节点开始 + if (index < mid) { // 如果索引小于中部位置,从前往后遍历 + for (int i = 0; i < index + 1; i++) { + curNode = curNode->next; // 移动到目标节点 + } + } else { // 如果索引大于等于中部位置,从后往前遍历 + for (int i = 0; i < size - index; i++) { + curNode = curNode->prev; // 移动到目标节点 + } + } + num = curNode->elem; // 获取目标节点的值 + return num; // 返回节点的值 + } + + // 在链表头部添加节点 + void addAtHead(int val) { + DList *newNode = new DList(val); // 创建新节点 + DList *next = sentinelNode->next; // 获取当前头节点的下一个节点 + newNode->prev = sentinelNode; // 新节点的上一个节点指向哨兵节点 + newNode->next = next; // 新节点的下一个节点指向原来的头节点 + size++; // 链表大小加1 + sentinelNode->next = newNode; // 哨兵节点的下一个节点指向新节点 + next->prev = newNode; // 原来的头节点的上一个节点指向新节点 + } + + // 在链表尾部添加节点 + void addAtTail(int val) { + DList *newNode = new DList(val); // 创建新节点 + DList *prev = sentinelNode->prev; // 获取当前尾节点的上一个节点 + newNode->next = sentinelNode; // 新节点的下一个节点指向哨兵节点 + newNode->prev = prev; // 新节点的上一个节点指向原来的尾节点 + size++; // 链表大小加1 + sentinelNode->prev = newNode; // 哨兵节点的上一个节点指向新节点 + prev->next = newNode; // 原来的尾节点的下一个节点指向新节点 + } + + // 在链表中的第index个节点之前添加值为val的节点 + void addAtIndex(int index, int val) { + if (index > size) { // 检查索引是否超出范围 + return; // 如果超出范围,直接返回 + } + if (index <= 0) { // 如果索引为0或负数,在头部添加节点 + addAtHead(val); + return; + } + int num; + int mid = size >> 1; // 计算链表中部位置 + DList *curNode = sentinelNode; // 从哨兵节点开始 + if (index < mid) { // 如果索引小于中部位置,从前往后遍历 + for (int i = 0; i < index; i++) { + curNode = curNode->next; // 移动到目标位置的前一个节点 + } + DList *temp = curNode->next; // 获取目标位置的节点 + DList *newNode = new DList(val); // 创建新节点 + curNode->next = newNode; // 在目标位置前添加新节点 + temp->prev = newNode; // 目标位置的节点的前一个节点指向新节点 + newNode->next = temp; // 新节点的下一个节点指向目标位置的结点 + newNode->prev = curNode; // 新节点的上一个节点指向当前节点 + } else { // 如果索引大于等于中部位置,从后往前遍历 + for (int i = 0; i < size - index; i++) { + curNode = curNode->prev; // 移动到目标位置的后一个节点 + } + DList *temp = curNode->prev; // 获取目标位置的节点 + DList *newNode = new DList(val); // 创建新节点 + curNode->prev = newNode; // 在目标位置后添加新节点 + temp->next = newNode; // 目标位置的节点的下一个节点指向新节点 + newNode->prev = temp; // 新节点的上一个节点指向目标位置的节点 + newNode->next = curNode; // 新节点的下一个节点指向当前节点 + } + size++; // 链表大小加1 + } + + // 删除链表中的第index个节点 + void deleteAtIndex(int index) { + if (index > (size - 1) || index < 0) { // 检查索引是否超出范围 + return; // 如果超出范围,直接返回 + } + int num; + int mid = size >> 1; // 计算链表中部位置 + DList *curNode = sentinelNode; // 从哨兵节点开始 + if (index < mid) { // 如果索引小于中部位置,从前往后遍历 + for (int i = 0; i < index; i++) { + curNode = curNode->next; // 移动到目标位置的前一个节点 + } + DList *next = curNode->next->next; // 获取目标位置的下一个节点 + curNode->next = next; // 删除目标位置的节点 + next->prev = curNode; // 目标位置的下一个节点的前一个节点指向当前节点 + } else { // 如果索引大于等于中部位置,从后往前遍历 + for (int i = 0; i < size - index - 1; i++) { + curNode = curNode->prev; // 移动到目标位置的后一个节点 + } + DList *prev = curNode->prev->prev; // 获取目标位置的下一个节点 + curNode->prev = prev; // 删除目标位置的节点 + prev->next = curNode; // 目标位置的下一个节点的下一个节点指向当前节点 + } + size--; // 链表大小减1 + } + +private: + int size; // 链表的大小 + DList *sentinelNode; // 哨兵节点的指针 +}; +``` + ### C: ```C From 290e15e69e41d06f07c44ea70f01f009034c81cf Mon Sep 17 00:00:00 2001 From: yunskj Date: Tue, 9 Jul 2024 21:25:11 +0800 Subject: [PATCH 2686/3019] =?UTF-8?q?Update=200977.=E6=9C=89=E5=BA=8F?= =?UTF-8?q?=E6=95=B0=E7=BB=84=E7=9A=84=E5=B9=B3=E6=96=B9.md=20=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0Java=E6=8E=92=E5=BA=8F=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 977.有序数组的平方Java排序法 --- ...7\273\204\347\232\204\345\271\263\346\226\271.md" | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git "a/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" "b/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" index b10620d032..7119dda585 100644 --- "a/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" +++ "b/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" @@ -100,6 +100,18 @@ public: ## 其他语言版本 ### Java: +排序法 +```Java +class Solution { + public int[] sortedSquares(int[] nums) { + for (int i = 0; i < nums.length; i++) { + nums[i] = nums[i] * nums[i]; + } + Arrays.sort(nums); + return nums; + } +} +``` ```Java class Solution { From 6fd1df5bd7c6e665d6caf56368bf0289c2c27cdc Mon Sep 17 00:00:00 2001 From: markwang Date: Wed, 10 Jul 2024 10:19:39 +0800 Subject: [PATCH 2687/3019] =?UTF-8?q?404.=E5=B7=A6=E5=8F=B6=E5=AD=90?= =?UTF-8?q?=E4=B9=8B=E5=92=8C=E5=A2=9E=E5=8A=A0Go=E9=80=92=E5=BD=92?= =?UTF-8?q?=E7=B2=BE=E7=AE=80=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...17\266\345\255\220\344\271\213\345\222\214.md" | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git "a/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" "b/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" index 1ba71dc94f..66aff68f2e 100644 --- "a/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" +++ "b/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" @@ -337,6 +337,21 @@ func sumOfLeftLeaves(root *TreeNode) int { } ``` +**递归精简版** + +```go +func sumOfLeftLeaves(root *TreeNode) int { + if root == nil { + return 0 + } + leftValue := 0 + if root.Left != nil && root.Left.Left == nil && root.Left.Right == nil { + leftValue = root.Left.Val + } + return leftValue + sumOfLeftLeaves(root.Left) + sumOfLeftLeaves(root.Right) +} +``` + **迭代法(前序遍历)** ```go From 354359409cd03574336c3e5f1ea4764159ccf2ba Mon Sep 17 00:00:00 2001 From: MrYoungg <151980452+MrYoungg@users.noreply.github.com> Date: Wed, 10 Jul 2024 11:21:38 +0800 Subject: [PATCH 2688/3019] =?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 --- ...237\272\347\241\20001\350\203\214\345\214\205-1.md" | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" index fa11fb94bc..a92faf3d75 100644 --- "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" +++ "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" @@ -118,7 +118,7 @@ dp[0][j],即:i为0,存放编号0的物品的时候,各个容量的背包 代码初始化如下: -``` +```CPP for (int j = 0 ; j < weight[0]; j++) { // 当然这一步,如果把dp数组预先初始化为0了,这一步就可以省略,但很多同学应该没有想清楚这一点。 dp[0][j] = 0; } @@ -147,7 +147,7 @@ dp[0][j] 和 dp[i][0] 都已经初始化了,那么其他下标应该初始化 最后初始化代码如下: -``` +```CPP // 初始化 dp vector> dp(weight.size(), vector(bagweight + 1, 0)); for (int j = weight[0]; j <= bagweight; j++) { @@ -171,7 +171,7 @@ for (int j = weight[0]; j <= bagweight; j++) { 那么我先给出先遍历物品,然后遍历背包重量的代码。 -``` +```CPP // weight数组的大小 就是物品个数 for(int i = 1; i < weight.size(); i++) { // 遍历物品 for(int j = 0; j <= bagweight; j++) { // 遍历背包容量 @@ -186,7 +186,7 @@ for(int i = 1; i < weight.size(); i++) { // 遍历物品 例如这样: -``` +```CPP // weight数组的大小 就是物品个数 for(int j = 0; j <= bagweight; j++) { // 遍历背包容量 for(int i = 1; i < weight.size(); i++) { // 遍历物品 @@ -232,7 +232,7 @@ dp[i-1][j]和dp[i - 1][j - weight[i]] 都在dp[i][j]的左上角方向(包括 主要就是自己没有动手推导一下dp数组的演变过程,如果推导明白了,代码写出来就算有问题,只要把dp数组打印出来,对比一下和自己推导的有什么差异,很快就可以发现问题了。 -```cpp +```CPP void test_2_wei_bag_problem1() { vector weight = {1, 3, 4}; vector value = {15, 20, 30}; From 5a19fc16d20b18e18377257b16231123971dd3b4 Mon Sep 17 00:00:00 2001 From: XZY <1214807740@qq.com> Date: Wed, 10 Jul 2024 16:07:47 +0800 Subject: [PATCH 2689/3019] =?UTF-8?q?fix:=20=E4=BF=AE=E6=94=B9=E4=B8=AD?= =?UTF-8?q?=E6=96=87=E5=8D=95=E8=AF=8D=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" | 2 +- .../0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" | 2 +- ...\232\204\345\220\271\346\257\233\346\261\202\347\226\265.md" | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git "a/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" "b/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" index f256d15c45..9ee7bef38a 100644 --- "a/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" @@ -41,7 +41,7 @@ 首先通过本题大家要明确什么是子序列,“子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序”。 本题也是代码随想录中子序列问题的第一题,如果没接触过这种题目的话,本题还是很难的,甚至想暴力去搜索也不知道怎么搜。 -子序列问题是动态规划解决的经典问题,当前下标i的递增子序列长度,其实和i之前的下表j的子序列长度有关系,那又是什么样的关系呢。 +子序列问题是动态规划解决的经典问题,当前下标i的递增子序列长度,其实和i之前的下标j的子序列长度有关系,那又是什么样的关系呢。 接下来,我们依然用动规五部曲来详细分析一波: diff --git "a/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" "b/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" index 2011bee3e5..89e4ad1166 100644 --- "a/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" +++ "b/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" @@ -55,7 +55,7 @@ dp[i] 和 dp[i-1] ,dp[i + 1] 看上去都没啥关系。 我们在判断字符串S是否是回文,那么如果我们知道 s[1],s[2],s[3] 这个子串是回文的,那么只需要比较 s[0]和s[4]这两个元素是否相同,如果相同的话,这个字符串s 就是回文串。 -那么此时我们是不是能找到一种递归关系,也就是判断一个子字符串(字符串的下表范围[i,j])是否回文,依赖于,子字符串(下表范围[i + 1, j - 1])) 是否是回文。 +那么此时我们是不是能找到一种递归关系,也就是判断一个子字符串(字符串下标范围[i,j])是否回文,依赖于,子字符串(下标范围[i + 1, j - 1])) 是否是回文。 所以为了明确这种递归关系,我们的dp数组是要定义成一位二维dp数组。 diff --git "a/problems/\345\211\215\345\272\217/\347\274\226\347\250\213\347\264\240\345\205\273\351\203\250\345\210\206\347\232\204\345\220\271\346\257\233\346\261\202\347\226\265.md" "b/problems/\345\211\215\345\272\217/\347\274\226\347\250\213\347\264\240\345\205\273\351\203\250\345\210\206\347\232\204\345\220\271\346\257\233\346\261\202\347\226\265.md" index 6099747a92..edb62bc8b5 100644 --- "a/problems/\345\211\215\345\272\217/\347\274\226\347\250\213\347\264\240\345\205\273\351\203\250\345\210\206\347\232\204\345\220\271\346\257\233\346\261\202\347\226\265.md" +++ "b/problems/\345\211\215\345\272\217/\347\274\226\347\250\213\347\264\240\345\205\273\351\203\250\345\210\206\347\232\204\345\220\271\346\257\233\346\261\202\347\226\265.md" @@ -25,7 +25,7 @@ index_{left}=(\sum_{i=0}^{i=k}2^i)+2*m-1-1=2^{k+1}+2m-3 $$ - - 故左孩子的下表为$index_{left}=index_{father}\times2+1$,同理可得到右子孩子的索引关系。也可以直接在左子孩子的基础上`+1`。 + - 故左孩子的下标为$index_{left}=index_{father}\times2+1$,同理可得到右子孩子的索引关系。也可以直接在左子孩子的基础上`+1`。 From 423ed9899e4a7400eaade4abaa270ff1548d9079 Mon Sep 17 00:00:00 2001 From: markwang Date: Thu, 11 Jul 2024 09:05:30 +0800 Subject: [PATCH 2690/3019] =?UTF-8?q?112.=E8=B7=AF=E5=BE=84=E6=80=BB?= =?UTF-8?q?=E5=92=8C=E5=A2=9E=E5=8A=A0Go=E9=80=92=E5=BD=92=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...57\345\276\204\346\200\273\345\222\214.md" | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git "a/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" "b/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" index 2beb8a7fa3..6709a2fbd2 100644 --- "a/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" +++ "b/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" @@ -727,6 +727,48 @@ class Solution: ```go //递归法 +/** + * Definition for a binary tree node. + * type TreeNode struct { + * Val int + * Left *TreeNode + * Right *TreeNode + * } + */ +func hasPathSum(root *TreeNode, targetSum int) bool { + if root == nil { + return false + } + return traversal(root, targetSum - root.Val) +} + +func traversal(cur *TreeNode, count int) bool { + if cur.Left == nil && cur.Right == nil && count == 0 { + return true + } + if cur.Left == nil && cur.Right == nil { + return false + } + if cur.Left != nil { + count -= cur.Left.Val + if traversal(cur.Left, count) { + return true + } + count += cur.Left.Val + } + if cur.Right != nil { + count -= cur.Right.Val + if traversal(cur.Right, count) { + return true + } + count += cur.Right.Val + } + return false +} +``` + +```go +//递归法精简 /** * Definition for a binary tree node. * type TreeNode struct { From 9b9adf6100bb2d8b3e2703b5f573af05a8890d15 Mon Sep 17 00:00:00 2001 From: eat to 160 pounds <2915390277@qq.com> Date: Sat, 13 Jul 2024 15:10:24 +0800 Subject: [PATCH 2691/3019] =?UTF-8?q?feat(0309):=20=E5=8F=A6=E4=B8=80?= =?UTF-8?q?=E7=A7=8D=E7=8A=B6=E6=80=81=E5=AE=9A=E4=B9=89=E6=80=9D=E8=B7=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...53\345\206\267\345\206\273\346\234\237.md" | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git "a/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" "b/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" index 5a38111ad5..95689a4805 100644 --- "a/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" +++ "b/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" @@ -359,6 +359,26 @@ func max(a, b int) int { ### Javascript: +> 不同的状态定义 感觉更容易理解些 +```javascript +function maxProfit(prices) { + // 第i天状态 持股 卖出 非冷冻期(不持股) 处于冷冻期 + const dp = new Array(prices.length).fill(0).map(() => [0, 0, 0, 0]); + dp[0][0] = -prices[0]; + for (let i = 1; i < prices.length; i++) { + // 持股 + dp[i][0] = Math.max(dp[i - 1][0], dp[i - 1][2] - prices[i]); + // 卖出 + dp[i][1] = dp[i - 1][0] + prices[i]; + // 非冷冻期(不持股) + dp[i][2] = Math.max(dp[i - 1][2], dp[i - 1][1]); + // 冷冻期(上一天卖出) + dp[i][3] = dp[i - 1][1]; + } + return Math.max(...dp.pop()); +}; +``` + ```javascript const maxProfit = (prices) => { if(prices.length < 2) { From afbcb1d98bd5a0e40f9f65d1ced60e62c286fbf2 Mon Sep 17 00:00:00 2001 From: XZY <1214807740@qq.com> Date: Mon, 15 Jul 2024 12:14:43 +0800 Subject: [PATCH 2692/3019] =?UTF-8?q?Update=20121.=20=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?.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...00\344\275\263\346\227\266\346\234\272.md" | 22 ++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git "a/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" "b/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" index e9aea0e6c6..df586ff99f 100644 --- "a/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" +++ "b/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" @@ -466,7 +466,7 @@ function maxProfit(prices: number[]): number { }; ``` -> 动态规划 +> 动态规划:版本一 ```typescript function maxProfit(prices: number[]): number { @@ -487,6 +487,26 @@ function maxProfit(prices: number[]): number { }; ``` +> 动态规划:版本二 + +```typescript +// dp[i][0] 表示第i天持有股票所得最多现金 +// dp[i][1] 表示第i天不持有股票所得最多现金 +function maxProfit(prices: number[]): number { + const dp:number[][] = Array(2).fill(0).map(item => Array(2)); + dp[0][0] = -prices[0]; + dp[0][1] = 0; + + for (let i = 1; i < prices.length; i++) { + dp[i % 2][0] = Math.max(dp[(i - 1) % 2][0], -prices[i]); + dp[i % 2][1] = Math.max(dp[(i - 1) % 2][1], dp[(i - 1) % 2][0] + prices[i]); + } + + // 返回不持有股票的最大现金 + return dp[(prices.length-1) % 2][1]; +}; +``` + ### C#: > 贪心法 From 06a089e780e1be6206e58ed052b6615ee0cb7dc2 Mon Sep 17 00:00:00 2001 From: Jack Lin Date: Mon, 15 Jul 2024 15:25:31 +0800 Subject: [PATCH 2693/3019] =?UTF-8?q?0406.=E6=A0=B9=E6=8D=AE=E8=BA=AB?= =?UTF-8?q?=E9=AB=98=E9=87=8D=E5=BB=BA=E9=98=9F=E5=88=97.md:=20Fix=20typo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" "b/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" index b7e94543e6..d92a7f3f58 100644 --- "a/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" +++ "b/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" @@ -87,7 +87,7 @@ 回归本题,整个插入过程如下: 排序完的people: -[[7,0], [7,1], [6,1], [5,0], [5,2],[4,4]] +[[7,0], [7,1], [6,1], [5,0], [5,2], [4,4]] 插入的过程: * 插入[7,0]:[[7,0]] From 2c322293830aca64b1e329fb6595503acf845610 Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Mon, 15 Jul 2024 16:49:16 +0800 Subject: [PATCH 2694/3019] Update --- README.md | 1 + ...55\344\271\260\345\234\237\345\234\260.md" | 386 ++++++++++++++++++ ...17\202\344\274\232dijkstra\345\240\206.md" | 152 +++++++ ...74\232dijkstra\346\234\264\347\264\240.md" | 57 +++ .../0053.\345\257\273\345\256\235-Kruskal.md" | 137 +++++++ .../0053.\345\257\273\345\256\235-prim.md" | 132 ++++++ ...8.\345\214\272\351\227\264\345\222\214.md" | 104 ++++- ...\347\211\251\350\277\220\350\276\223II.md" | 2 +- ...347\211\251\350\277\220\350\276\223III.md" | 2 +- ...57\350\276\276\350\267\257\345\276\204.md" | 2 +- ...50\345\217\257\350\276\276\346\200\247.md" | 10 +- ...02\347\202\271\345\210\227\350\241\250.md" | 147 +++++++ ...62\345\244\204\347\220\206\345\231\250.md" | 148 +++++++ ...10\346\201\257\344\274\240\350\276\223.md" | 192 +++++++++ ...9.\345\217\257\347\210\261\344\270\262.md" | 101 +++++ ...40\351\231\244\346\200\273\345\222\214.md" | 30 ++ ...347\224\250ACM\346\250\241\345\274\217.md" | 93 +++++ ...06\350\256\272\345\237\272\347\241\200.md" | 2 + ...75\344\272\214\345\217\211\346\240\221.md" | 104 +++++ ...62\345\244\204\347\220\206\345\231\250.md" | 50 --- .../\345\256\214\347\276\216\346\225\260.md" | 29 ++ ...72\351\227\264\347\277\273\350\275\254.md" | 109 +++++ ...14\345\200\274\350\267\257\345\276\204.md" | 81 ++++ ...02\347\202\271\345\210\227\350\241\250.md" | 47 --- 24 files changed, 1996 insertions(+), 122 deletions(-) create mode 100644 "problems/kamacoder/0044.\345\274\200\345\217\221\345\225\206\350\264\255\344\271\260\345\234\237\345\234\260.md" create mode 100644 "problems/kamacoder/0135.\350\216\267\345\217\226\350\277\236\351\200\232\347\232\204\347\233\270\351\202\273\350\212\202\347\202\271\345\210\227\350\241\250.md" create mode 100644 "problems/kamacoder/0136.\345\255\227\347\254\246\344\270\262\345\244\204\347\220\206\345\231\250.md" create mode 100644 "problems/kamacoder/0137.\346\266\210\346\201\257\344\274\240\350\276\223.md" create mode 100644 "problems/kamacoder/0139.\345\217\257\347\210\261\344\270\262.md" create mode 100644 "problems/kamacoder/\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\346\234\200\345\260\217ASCII\345\210\240\351\231\244\346\200\273\345\222\214.md" create mode 100644 "problems/kamacoder/\345\233\276\350\256\272\344\270\272\344\273\200\344\271\210\347\224\250ACM\346\250\241\345\274\217.md" create mode 100644 "problems/kamacoder/\345\245\275\344\272\214\345\217\211\346\240\221.md" delete mode 100644 "problems/kamacoder/\345\255\227\347\254\246\344\270\262\345\244\204\347\220\206\345\231\250.md" create mode 100644 "problems/kamacoder/\345\256\214\347\276\216\346\225\260.md" create mode 100644 "problems/kamacoder/\345\260\217\347\272\242\347\232\204\345\214\272\351\227\264\347\277\273\350\275\254.md" create mode 100644 "problems/kamacoder/\346\234\200\351\225\277\345\220\214\345\200\274\350\267\257\345\276\204.md" delete mode 100644 "problems/kamacoder/\350\216\267\345\217\226\350\277\236\351\200\232\347\232\204\347\233\270\351\202\273\350\212\202\347\202\271\345\210\227\350\241\250.md" diff --git a/README.md b/README.md index 4c570c050d..19d1bebbef 100644 --- a/README.md +++ b/README.md @@ -105,6 +105,7 @@ 3. [数组:27.移除元素](./problems/0027.移除元素.md) 4. [数组:977.有序数组的平方](./problems/0977.有序数组的平方.md) 5. [数组:209.长度最小的子数组](./problems/0209.长度最小的子数组.md) +6. [数组:区间和](./problems/kamacoder/0058.区间和.md) 6. [数组:59.螺旋矩阵II](./problems/0059.螺旋矩阵II.md) 7. [数组:总结篇](./problems/数组总结篇.md) diff --git "a/problems/kamacoder/0044.\345\274\200\345\217\221\345\225\206\350\264\255\344\271\260\345\234\237\345\234\260.md" "b/problems/kamacoder/0044.\345\274\200\345\217\221\345\225\206\350\264\255\344\271\260\345\234\237\345\234\260.md" new file mode 100644 index 0000000000..73e9e8c5f4 --- /dev/null +++ "b/problems/kamacoder/0044.\345\274\200\345\217\221\345\225\206\350\264\255\344\271\260\345\234\237\345\234\260.md" @@ -0,0 +1,386 @@ + +# 44. 开发商购买土地 + +【题目描述】 + +在一个城市区域内,被划分成了n * m个连续的区块,每个区块都拥有不同的权值,代表着其土地价值。目前,有两家开发公司,A 公司和 B 公司,希望购买这个城市区域的土地。 + +现在,需要将这个城市区域的所有区块分配给 A 公司和 B 公司。 + +然而,由于城市规划的限制,只允许将区域按横向或纵向划分成两个子区域,而且每个子区域都必须包含一个或多个区块。 + +为了确保公平竞争,你需要找到一种分配方式,使得 A 公司和 B 公司各自的子区域内的土地总价值之差最小。 + +注意:区块不可再分。 + +【输入描述】 + +第一行输入两个正整数,代表 n 和 m。 + +接下来的 n 行,每行输出 m 个正整数。 + +输出描述 + +请输出一个整数,代表两个子区域内土地总价值之间的最小差距。 + +【输入示例】 + +3 3 +1 2 3 +2 1 3 +1 2 3 + +【输出示例】 + +0 + +【提示信息】 + +如果将区域按照如下方式划分: + +1 2 | 3 +2 1 | 3 +1 2 | 3 + +两个子区域内土地总价值之间的最小差距可以达到 0。 + +【数据范围】: + +* 1 <= n, m <= 100; +* n 和 m 不同时为 1。 + +## 思路 + +看到本题,大家如果想暴力求解,应该是 n^3 的时间复杂度, + +一个 for 枚举分割线, 嵌套 两个for 去累加区间里的和。 + +如果本题要求 任何两个行(或者列)之间的数值总和,大家在[0058.区间和](./0058.区间和.md) 的基础上 应该知道怎么求。 + +就是前缀和的思路,先统计好,前n行的和 q[n],如果要求矩阵 a 行到 b行 之间的总和,那么就 q[b] - q[a - 1]就好。 + +至于为什么是 a - 1,大家去看 [0058.区间和](./0058.区间和.md) 的分析,使用 前缀和 要注意 区间左右边的开闭情况。 + +本题也可以使用 前缀和的思路来求解,先将 行方向,和 列方向的和求出来,这样可以方便知道 划分的两个区间的和。 + +代码如下: + + +```CPP +#include +#include +#include + +using namespace std; +int main () { + int n, m; + cin >> n >> m; + int sum = 0; + vector> vec(n, vector(m, 0)) ; + for (int i = 0; i < n; i++) { + for (int j = 0; j < m; j++) { + cin >> vec[i][j]; + sum += vec[i][j]; + } + } + // 统计横向 + vector horizontal(n, 0); + for (int i = 0; i < n; i++) { + for (int j = 0 ; j < m; j++) { + horizontal[i] += vec[i][j]; + } + } + // 统计纵向 + vector vertical(m , 0); + for (int j = 0; j < m; j++) { + for (int i = 0 ; i < n; i++) { + vertical[j] += vec[i][j]; + } + } + int result = INT_MAX; + int horizontalCut = 0; + for (int i = 0 ; i < n; i++) { + horizontalCut += horizontal[i]; + result = min(result, abs(sum - horizontalCut - horizontalCut)); + } + int verticalCut = 0; + for (int j = 0; j < m; j++) { + verticalCut += vertical[j]; + result = min(result, abs(sum - verticalCut - verticalCut)); + } + cout << result << endl; +} + +``` + +时间复杂度: O(n^2) + +其实本题可以在暴力求解的基础上,优化一下,就不用前缀和了,在行向遍历的时候,遇到行末尾就统一一下, 在列向遍历的时候,遇到列末尾就统计一下。 + +时间复杂度也是 O(n^2) + +代码如下: + +```CPP +#include +#include +#include + +using namespace std; +int main () { + int n, m; + cin >> n >> m; + int sum = 0; + vector> vec(n, vector(m, 0)) ; + for (int i = 0; i < n; i++) { + for (int j = 0; j < m; j++) { + cin >> vec[i][j]; + sum += vec[i][j]; + } + } + + int result = INT_MAX; + int count = 0; // 统计遍历过的行 + for (int i = 0; i < n; i++) { + for (int j = 0 ; j < m; j++) { + count += vec[i][j]; + // 遍历到行末尾时候开始统计 + if (j == m - 1) result = min (result, abs(sum - count - count)); + + } + } + + count = 0; // 统计遍历过的列 + for (int j = 0; j < m; j++) { + for (int i = 0 ; i < n; i++) { + count += vec[i][j]; + // 遍历到列末尾的时候开始统计 + if (i == n - 1) result = min (result, abs(sum - count - count)); + } + } + cout << result << endl; +} + +``` + + + +## 其他语言版本 + +### Java + +前缀和 + +```Java +import java.util.Scanner; + +public class Main { + public static void main(String[] args) { + Scanner scanner = new Scanner(System.in); + int n = scanner.nextInt(); + int m = scanner.nextInt(); + int sum = 0; + int[][] vec = new int[n][m]; + for (int i = 0; i < n; i++) { + for (int j = 0; j < m; j++) { + vec[i][j] = scanner.nextInt(); + sum += vec[i][j]; + } + } + + // 统计横向 + int[] horizontal = new int[n]; + for (int i = 0; i < n; i++) { + for (int j = 0; j < m; j++) { + horizontal[i] += vec[i][j]; + } + } + + // 统计纵向 + int[] vertical = new int[m]; + for (int j = 0; j < m; j++) { + for (int i = 0; i < n; i++) { + vertical[j] += vec[i][j]; + } + } + + int result = Integer.MAX_VALUE; + int horizontalCut = 0; + for (int i = 0; i < n; i++) { + horizontalCut += horizontal[i]; + result = Math.min(result, Math.abs(sum - 2 * horizontalCut)); + } + + int verticalCut = 0; + for (int j = 0; j < m; j++) { + verticalCut += vertical[j]; + result = Math.min(result, Math.abs(sum - 2 * verticalCut)); + } + + System.out.println(result); + scanner.close(); + } +} + +``` + +优化暴力 + +```Java +import java.util.Scanner; + +public class Main { + public static void main(String[] args) { + Scanner scanner = new Scanner(System.in); + int n = scanner.nextInt(); + int m = scanner.nextInt(); + int sum = 0; + int[][] vec = new int[n][m]; + for (int i = 0; i < n; i++) { + for (int j = 0; j < m; j++) { + vec[i][j] = scanner.nextInt(); + sum += vec[i][j]; + } + } + + int result = Integer.MAX_VALUE; + int count = 0; // 统计遍历过的行 + + // 行切分 + for (int i = 0; i < n; i++) { + for (int j = 0; j < m; j++) { + count += vec[i][j]; + // 遍历到行末尾时候开始统计 + if (j == m - 1) { + result = Math.min(result, Math.abs(sum - 2 * count)); + } + } + } + + count = 0; + // 列切分 + for (int j = 0; j < m; j++) { + for (int i = 0; i < n; i++) { + count += vec[i][j]; + // 遍历到列末尾时候开始统计 + if (i == n - 1) { + result = Math.min(result, Math.abs(sum - 2 * count)); + } + } + } + + System.out.println(result); + scanner.close(); + } +} + +``` + +### python + +前缀和 +```python +def main(): + import sys + input = sys.stdin.read + data = input().split() + + idx = 0 + n = int(data[idx]) + idx += 1 + m = int(data[idx]) + idx += 1 + sum = 0 + vec = [] + for i in range(n): + row = [] + for j in range(m): + num = int(data[idx]) + idx += 1 + row.append(num) + sum += num + vec.append(row) + + # 统计横向 + horizontal = [0] * n + for i in range(n): + for j in range(m): + horizontal[i] += vec[i][j] + + # 统计纵向 + vertical = [0] * m + for j in range(m): + for i in range(n): + vertical[j] += vec[i][j] + + result = float('inf') + horizontalCut = 0 + for i in range(n): + horizontalCut += horizontal[i] + result = min(result, abs(sum - 2 * horizontalCut)) + + verticalCut = 0 + for j in range(m): + verticalCut += vertical[j] + result = min(result, abs(sum - 2 * verticalCut)) + + print(result) + +if __name__ == "__main__": + main() + + +``` + +优化暴力 + +```python +def main(): + import sys + input = sys.stdin.read + data = input().split() + + idx = 0 + n = int(data[idx]) + idx += 1 + m = int(data[idx]) + idx += 1 + sum = 0 + vec = [] + for i in range(n): + row = [] + for j in range(m): + num = int(data[idx]) + idx += 1 + row.append(num) + sum += num + vec.append(row) + + result = float('inf') + + count = 0 + # 行切分 + for i in range(n): + + for j in range(m): + count += vec[i][j] + # 遍历到行末尾时候开始统计 + if j == m - 1: + result = min(result, abs(sum - 2 * count)) + + count = 0 + # 列切分 + for j in range(m): + + for i in range(n): + count += vec[i][j] + # 遍历到列末尾时候开始统计 + if i == n - 1: + result = min(result, abs(sum - 2 * count)) + + print(result) + +if __name__ == "__main__": + main() + +``` diff --git "a/problems/kamacoder/0047.\345\217\202\344\274\232dijkstra\345\240\206.md" "b/problems/kamacoder/0047.\345\217\202\344\274\232dijkstra\345\240\206.md" index 0452615a61..9905a420c8 100644 --- "a/problems/kamacoder/0047.\345\217\202\344\274\232dijkstra\345\240\206.md" +++ "b/problems/kamacoder/0047.\345\217\202\344\274\232dijkstra\345\240\206.md" @@ -755,8 +755,160 @@ public class Main { ### Python +```python +import heapq + +class Edge: + def __init__(self, to, val): + self.to = to + self.val = val + +def dijkstra(n, m, edges, start, end): + grid = [[] for _ in range(n + 1)] + + for p1, p2, val in edges: + grid[p1].append(Edge(p2, val)) + + minDist = [float('inf')] * (n + 1) + visited = [False] * (n + 1) + + pq = [] + heapq.heappush(pq, (0, start)) + minDist[start] = 0 + + while pq: + cur_dist, cur_node = heapq.heappop(pq) + + if visited[cur_node]: + continue + + visited[cur_node] = True + + for edge in grid[cur_node]: + if not visited[edge.to] and cur_dist + edge.val < minDist[edge.to]: + minDist[edge.to] = cur_dist + edge.val + heapq.heappush(pq, (minDist[edge.to], edge.to)) + + return -1 if minDist[end] == float('inf') else minDist[end] + +# 输入 +n, m = map(int, input().split()) +edges = [tuple(map(int, input().split())) for _ in range(m)] +start = 1 # 起点 +end = n # 终点 + +# 运行算法并输出结果 +result = dijkstra(n, m, edges, start, end) +print(result) + +``` + ### Go +```go +package main + +import ( + "container/heap" + "fmt" + "math" +) + +// Edge 表示带权重的边 +type Edge struct { + to, val int +} + +// PriorityQueue 实现一个小顶堆 +type Item struct { + node, dist int +} + +type PriorityQueue []*Item + +func (pq PriorityQueue) Len() int { return len(pq) } + +func (pq PriorityQueue) Less(i, j int) bool { + return pq[i].dist < pq[j].dist +} + +func (pq PriorityQueue) Swap(i, j int) { + pq[i], pq[j] = pq[j], pq[i] +} + +func (pq *PriorityQueue) Push(x interface{}) { + *pq = append(*pq, x.(*Item)) +} + +func (pq *PriorityQueue) Pop() interface{} { + old := *pq + n := len(old) + item := old[n-1] + *pq = old[0 : n-1] + return item +} + +func dijkstra(n, m int, edges [][]int, start, end int) int { + grid := make([][]Edge, n+1) + for _, edge := range edges { + p1, p2, val := edge[0], edge[1], edge[2] + grid[p1] = append(grid[p1], Edge{to: p2, val: val}) + } + + minDist := make([]int, n+1) + for i := range minDist { + minDist[i] = math.MaxInt64 + } + visited := make([]bool, n+1) + + pq := &PriorityQueue{} + heap.Init(pq) + heap.Push(pq, &Item{node: start, dist: 0}) + minDist[start] = 0 + + for pq.Len() > 0 { + cur := heap.Pop(pq).(*Item) + + if visited[cur.node] { + continue + } + + visited[cur.node] = true + + for _, edge := range grid[cur.node] { + if !visited[edge.to] && minDist[cur.node]+edge.val < minDist[edge.to] { + minDist[edge.to] = minDist[cur.node] + edge.val + heap.Push(pq, &Item{node: edge.to, dist: minDist[edge.to]}) + } + } + } + + if minDist[end] == math.MaxInt64 { + return -1 + } + return minDist[end] +} + +func main() { + var n, m int + fmt.Scan(&n, &m) + + edges := make([][]int, m) + for i := 0; i < m; i++ { + var p1, p2, val int + fmt.Scan(&p1, &p2, &val) + edges[i] = []int{p1, p2, val} + } + + start := 1 // 起点 + end := n // 终点 + + result := dijkstra(n, m, edges, start, end) + fmt.Println(result) +} + +``` + ### Rust ### Javascript diff --git "a/problems/kamacoder/0047.\345\217\202\344\274\232dijkstra\346\234\264\347\264\240.md" "b/problems/kamacoder/0047.\345\217\202\344\274\232dijkstra\346\234\264\347\264\240.md" index 7328882a1c..e904b9217e 100644 --- "a/problems/kamacoder/0047.\345\217\202\344\274\232dijkstra\346\234\264\347\264\240.md" +++ "b/problems/kamacoder/0047.\345\217\202\344\274\232dijkstra\346\234\264\347\264\240.md" @@ -806,6 +806,63 @@ public class Main { ### Python +``` +import sys + +def dijkstra(n, m, edges, start, end): + # 初始化邻接矩阵 + grid = [[float('inf')] * (n + 1) for _ in range(n + 1)] + for p1, p2, val in edges: + grid[p1][p2] = val + + # 初始化距离数组和访问数组 + minDist = [float('inf')] * (n + 1) + visited = [False] * (n + 1) + + minDist[start] = 0 # 起始点到自身的距离为0 + + for _ in range(1, n + 1): # 遍历所有节点 + minVal = float('inf') + cur = -1 + + # 选择距离源点最近且未访问过的节点 + for v in range(1, n + 1): + if not visited[v] and minDist[v] < minVal: + minVal = minDist[v] + cur = v + + if cur == -1: # 如果找不到未访问过的节点,提前结束 + break + + visited[cur] = True # 标记该节点已被访问 + + # 更新未访问节点到源点的距离 + for v in range(1, n + 1): + if not visited[v] and grid[cur][v] != float('inf') and minDist[cur] + grid[cur][v] < minDist[v]: + minDist[v] = minDist[cur] + grid[cur][v] + + return -1 if minDist[end] == float('inf') else minDist[end] + +if __name__ == "__main__": + input = sys.stdin.read + data = input().split() + n, m = int(data[0]), int(data[1]) + edges = [] + index = 2 + for _ in range(m): + p1 = int(data[index]) + p2 = int(data[index + 1]) + val = int(data[index + 2]) + edges.append((p1, p2, val)) + index += 3 + start = 1 # 起点 + end = n # 终点 + + result = dijkstra(n, m, edges, start, end) + print(result) + +``` + ### Go ### Rust diff --git "a/problems/kamacoder/0053.\345\257\273\345\256\235-Kruskal.md" "b/problems/kamacoder/0053.\345\257\273\345\256\235-Kruskal.md" index a97409aa3a..e8b8e1ffd3 100644 --- "a/problems/kamacoder/0053.\345\257\273\345\256\235-Kruskal.md" +++ "b/problems/kamacoder/0053.\345\257\273\345\256\235-Kruskal.md" @@ -404,8 +404,145 @@ Kruskal算法 时间复杂度 为 nlogn,其中n 为边的数量,适用稀疏 ### Java +```Java +import java.util.*; + +class Edge { + int l, r, val; + + Edge(int l, int r, int val) { + this.l = l; + this.r = r; + this.val = val; + } +} + +public class Main { + private static int n = 10001; + private static int[] father = new int[n]; + + // 并查集初始化 + public static void init() { + for (int i = 0; i < n; i++) { + father[i] = i; + } + } + + // 并查集的查找操作 + public static int find(int u) { + if (u == father[u]) return u; + return father[u] = find(father[u]); + } + + // 并查集的加入集合 + public static void join(int u, int v) { + u = find(u); + v = find(v); + if (u == v) return; + father[v] = u; + } + + public static void main(String[] args) { + Scanner scanner = new Scanner(System.in); + int v = scanner.nextInt(); + int e = scanner.nextInt(); + List edges = new ArrayList<>(); + int result_val = 0; + + for (int i = 0; i < e; i++) { + int v1 = scanner.nextInt(); + int v2 = scanner.nextInt(); + int val = scanner.nextInt(); + edges.add(new Edge(v1, v2, val)); + } + + // 执行Kruskal算法 + edges.sort(Comparator.comparingInt(edge -> edge.val)); + + // 并查集初始化 + init(); + + // 从头开始遍历边 + for (Edge edge : edges) { + int x = find(edge.l); + int y = find(edge.r); + + if (x != y) { + result_val += edge.val; + join(x, y); + } + } + System.out.println(result_val); + scanner.close(); + } +} + +``` + ### Python +```python +class Edge: + def __init__(self, l, r, val): + self.l = l + self.r = r + self.val = val + +n = 10001 +father = list(range(n)) + +def init(): + global father + father = list(range(n)) + +def find(u): + if u != father[u]: + father[u] = find(father[u]) + return father[u] + +def join(u, v): + u = find(u) + v = find(v) + if u != v: + father[v] = u + +def kruskal(v, edges): + edges.sort(key=lambda edge: edge.val) + init() + result_val = 0 + + for edge in edges: + x = find(edge.l) + y = find(edge.r) + if x != y: + result_val += edge.val + join(x, y) + + return result_val + +if __name__ == "__main__": + import sys + input = sys.stdin.read + data = input().split() + + v = int(data[0]) + e = int(data[1]) + + edges = [] + index = 2 + for _ in range(e): + v1 = int(data[index]) + v2 = int(data[index + 1]) + val = int(data[index + 2]) + edges.append(Edge(v1, v2, val)) + index += 3 + + result_val = kruskal(v, edges) + print(result_val) + +``` + + ### Go ### Rust diff --git "a/problems/kamacoder/0053.\345\257\273\345\256\235-prim.md" "b/problems/kamacoder/0053.\345\257\273\345\256\235-prim.md" index 782bd143dd..7eab3f5f0f 100644 --- "a/problems/kamacoder/0053.\345\257\273\345\256\235-prim.md" +++ "b/problems/kamacoder/0053.\345\257\273\345\256\235-prim.md" @@ -520,8 +520,140 @@ int main() { ### Java +```Java +import java.util.*; + +public class Main { + public static void main(String[] args) { + Scanner scanner = new Scanner(System.in); + int v = scanner.nextInt(); + int e = scanner.nextInt(); + + // 初始化邻接矩阵,所有值初始化为一个大值,表示无穷大 + int[][] grid = new int[v + 1][v + 1]; + for (int i = 0; i <= v; i++) { + Arrays.fill(grid[i], 10001); + } + + // 读取边的信息并填充邻接矩阵 + for (int i = 0; i < e; i++) { + int x = scanner.nextInt(); + int y = scanner.nextInt(); + int k = scanner.nextInt(); + grid[x][y] = k; + grid[y][x] = k; + } + + // 所有节点到最小生成树的最小距离 + int[] minDist = new int[v + 1]; + Arrays.fill(minDist, 10001); + + // 记录节点是否在树里 + boolean[] isInTree = new boolean[v + 1]; + + // Prim算法主循环 + for (int i = 1; i < v; i++) { + int cur = -1; + int minVal = Integer.MAX_VALUE; + + // 选择距离生成树最近的节点 + for (int j = 1; j <= v; j++) { + if (!isInTree[j] && minDist[j] < minVal) { + minVal = minDist[j]; + cur = j; + } + } + + // 将最近的节点加入生成树 + isInTree[cur] = true; + + // 更新非生成树节点到生成树的距离 + for (int j = 1; j <= v; j++) { + if (!isInTree[j] && grid[cur][j] < minDist[j]) { + minDist[j] = grid[cur][j]; + } + } + } + + // 统计结果 + int result = 0; + for (int i = 2; i <= v; i++) { + result += minDist[i]; + } + System.out.println(result); + scanner.close(); + } +} + +``` + ### Python +```python +def prim(v, e, edges): + import sys + import heapq + + # 初始化邻接矩阵,所有值初始化为一个大值,表示无穷大 + grid = [[10001] * (v + 1) for _ in range(v + 1)] + + # 读取边的信息并填充邻接矩阵 + for edge in edges: + x, y, k = edge + grid[x][y] = k + grid[y][x] = k + + # 所有节点到最小生成树的最小距离 + minDist = [10001] * (v + 1) + + # 记录节点是否在树里 + isInTree = [False] * (v + 1) + + # Prim算法主循环 + for i in range(1, v): + cur = -1 + minVal = sys.maxsize + + # 选择距离生成树最近的节点 + for j in range(1, v + 1): + if not isInTree[j] and minDist[j] < minVal: + minVal = minDist[j] + cur = j + + # 将最近的节点加入生成树 + isInTree[cur] = True + + # 更新非生成树节点到生成树的距离 + for j in range(1, v + 1): + if not isInTree[j] and grid[cur][j] < minDist[j]: + minDist[j] = grid[cur][j] + + # 统计结果 + result = sum(minDist[2:v+1]) + return result + +if __name__ == "__main__": + import sys + input = sys.stdin.read + data = input().split() + + v = int(data[0]) + e = int(data[1]) + + edges = [] + index = 2 + for _ in range(e): + x = int(data[index]) + y = int(data[index + 1]) + k = int(data[index + 2]) + edges.append((x, y, k)) + index += 3 + + result = prim(v, e, edges) + print(result) + +``` + ### Go ### Rust diff --git "a/problems/kamacoder/0058.\345\214\272\351\227\264\345\222\214.md" "b/problems/kamacoder/0058.\345\214\272\351\227\264\345\222\214.md" index a4bb54e940..0e478c68b0 100644 --- "a/problems/kamacoder/0058.\345\214\272\351\227\264\345\222\214.md" +++ "b/problems/kamacoder/0058.\345\214\272\351\227\264\345\222\214.md" @@ -93,7 +93,6 @@ int main() { ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240627110604.png) - 如果,我们想统计,在vec数组上 下标 2 到下标 5 之间的累加和,那是不是就用 p[5] - p[1] 就可以了。 为什么呢? @@ -114,7 +113,11 @@ p[5] - p[1] 就是 红色部分的区间和。 而 p 数组是我们之前就计算好的累加和,所以后面每次求区间和的之后 我们只需要 O(1)的操作。 +**特别注意**: 在使用前缀和求解的时候,要特别注意 求解区间。 + +如上图,如果我们要求 区间下标 [2, 5] 的区间和,那么应该是 p[5] - p[1],而不是 p[5] - p[2]。 +很多录友在使用前缀和的时候,分不清前缀和的区间,建议画一画图,模拟一下 思路会更清晰。 ```CPP #include @@ -142,6 +145,8 @@ int main() { ``` +C++ 代码 面对大量数据 读取 输出操作,最好用scanf 和 printf,耗时会小很多: + ```CPP #include #include @@ -168,24 +173,89 @@ int main() { ``` -```CPP +## 其他语言版本 -#include -using namespace std; +### Java +```Java -int main(){ - int n, a, b; - cin >> n; - vector vec(n + 1); - vector p(n + 1, 0); - for(int i = 1; i <= n; i++) { - scanf("%d", &vec[i]); - p[i] = p[i - 1] + vec[i]; - } - while(~scanf("%d%d", &a, &b)){ - printf("%d\n", p[b + 1] - p[a]); +import java.util.Scanner; + +public class Main { + public static void main(String[] args) { + Scanner scanner = new Scanner(System.in); + + int n = scanner.nextInt(); + int[] vec = new int[n]; + int[] p = new int[n]; + + int presum = 0; + for (int i = 0; i < n; i++) { + vec[i] = scanner.nextInt(); + presum += vec[i]; + p[i] = presum; + } + + while (scanner.hasNextInt()) { + int a = scanner.nextInt(); + int b = scanner.nextInt(); + + int sum; + if (a == 0) { + sum = p[b]; + } else { + sum = p[b] - p[a - 1]; + } + System.out.println(sum); + } + + scanner.close(); } - return 0; -} +} + + +``` + +### Python + +```python + +import sys +input = sys.stdin.read + +def main(): + data = input().split() + index = 0 + n = int(data[index]) + index += 1 + vec = [] + for i in range(n): + vec.append(int(data[index + i])) + index += n + + p = [0] * n + presum = 0 + for i in range(n): + presum += vec[i] + p[i] = presum + + results = [] + while index < len(data): + a = int(data[index]) + b = int(data[index + 1]) + index += 2 + + if a == 0: + sum_value = p[b] + else: + sum_value = p[b] - p[a - 1] + + results.append(sum_value) + + for result in results: + print(result) + +if __name__ == "__main__": + main() + ``` diff --git "a/problems/kamacoder/0095.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223II.md" "b/problems/kamacoder/0095.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223II.md" index 4eab01a8ec..5bc4be7b22 100644 --- "a/problems/kamacoder/0095.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223II.md" +++ "b/problems/kamacoder/0095.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223II.md" @@ -78,7 +78,7 @@ circle 我们拿题目中示例来画一个图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240402103135.png) +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240705161426.png) 图中 节点1 到 节点4 的最短路径是多少(题目中的最低运输成本) (注意边可以为负数的) diff --git "a/problems/kamacoder/0096.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223III.md" "b/problems/kamacoder/0096.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223III.md" index 96f9a9c81e..feaaa1f3c3 100644 --- "a/problems/kamacoder/0096.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223III.md" +++ "b/problems/kamacoder/0096.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223III.md" @@ -65,7 +65,7 @@ ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240402115614.png) -图中,节点2 最多已经经过2个节点 到达节点4,那么中间是有多少条边呢,是 3 条边对吧。 +图中,节点1 最多已经经过2个节点 到达节点4,那么中间是有多少条边呢,是 3 条边对吧。 所以本题就是求:起点最多经过k + 1 条边到达终点的最短距离。 diff --git "a/problems/kamacoder/0098.\346\211\200\346\234\211\345\217\257\350\276\276\350\267\257\345\276\204.md" "b/problems/kamacoder/0098.\346\211\200\346\234\211\345\217\257\350\276\276\350\267\257\345\276\204.md" index 159cdb9f04..1b6f662eba 100644 --- "a/problems/kamacoder/0098.\346\211\200\346\234\211\345\217\257\350\276\276\350\267\257\345\276\204.md" +++ "b/problems/kamacoder/0098.\346\211\200\346\234\211\345\217\257\350\276\276\350\267\257\345\276\204.md" @@ -83,7 +83,7 @@ 如果笔试的时候出一道原题 (笔试都是ACM模式,部分面试也是ACM模式),不少熟练刷力扣的录友都难住了,因为不知道图应该怎么存,也不知道自己存的图如何去遍历。 -所以这也是为什么我要让大家练习 ACM模式 +所以这也是为什么我要让大家练习 ACM模式,也是我为什么 在代码随想录图论讲解中,不惜自己亲自出题,让大家统一练习ACM模式。 -------- diff --git "a/problems/kamacoder/0105.\346\234\211\345\220\221\345\233\276\347\232\204\345\256\214\345\205\250\345\217\257\350\276\276\346\200\247.md" "b/problems/kamacoder/0105.\346\234\211\345\220\221\345\233\276\347\232\204\345\256\214\345\205\250\345\217\257\350\276\276\346\200\247.md" index 03048825c5..226d0f13c5 100644 --- "a/problems/kamacoder/0105.\346\234\211\345\220\221\345\233\276\347\232\204\345\256\214\345\205\250\345\217\257\350\276\276\346\200\247.md" +++ "b/problems/kamacoder/0105.\346\234\211\345\220\221\345\233\276\347\232\204\345\256\214\345\205\250\345\217\257\350\276\276\346\200\247.md" @@ -114,11 +114,11 @@ void dfs(const vector>& graph, int key, vector& visited) { ```C++ // 写法二:处理下一个要访问的节点 void dfs(const vector>& graph, int key, vector& visited) { - list keys = rooms[key]; + list keys = graph[key]; for (int key : keys) { if (visited[key] == false) { // 确认下一个是没访问过的节点 visited[key] = true; - dfs(rooms, key, visited); + dfs(graph, key, visited); } } } @@ -202,11 +202,11 @@ int main() { using namespace std; void dfs(const vector>& graph, int key, vector& visited) { - list keys = rooms[key]; + list keys = graph[key]; for (int key : keys) { if (visited[key] == false) { // 确认下一个是没访问过的节点 visited[key] = true; - dfs(rooms, key, visited); + dfs(graph, key, visited); } } } @@ -223,7 +223,7 @@ int main() { } vector visited(n + 1, false); - visited[0] = true; // 节点1 预先处理 + visited[1] = true; // 节点1 预先处理 dfs(graph, 1, visited); for (int i = 1; i <= n; i++) { diff --git "a/problems/kamacoder/0135.\350\216\267\345\217\226\350\277\236\351\200\232\347\232\204\347\233\270\351\202\273\350\212\202\347\202\271\345\210\227\350\241\250.md" "b/problems/kamacoder/0135.\350\216\267\345\217\226\350\277\236\351\200\232\347\232\204\347\233\270\351\202\273\350\212\202\347\202\271\345\210\227\350\241\250.md" new file mode 100644 index 0000000000..c1aa38e132 --- /dev/null +++ "b/problems/kamacoder/0135.\350\216\267\345\217\226\350\277\236\351\200\232\347\232\204\347\233\270\351\202\273\350\212\202\347\202\271\345\210\227\350\241\250.md" @@ -0,0 +1,147 @@ + +# 135. 获取连通的相邻节点列表 + +本题是一个 “阅读理解”题,其实题目的算法很简单,但理解题意很费劲。 + +题目描述中的【提示信息】 是我后加上去了,华为笔试的时候没有这个 【提示信息】。 + +相信没有 【提示信息】大家理解题意 平均要多用半个小时。 + +思路: + +1. 将第一行数据加入set中 +2. 后面输出数据,判断是否在 set里 +3. 最后把结果排个序 + + +```CPP +#include +#include +#include +#include +using namespace std; +int main() { + unordered_set uset; + int n, a; + cin >> n; + while (n--) { + cin >> a; + uset.insert(a); + } + int m, x, vlan_id; + long long tb; + vector vecTB; + cin >> m; + while(m--) { + cin >> tb; + cin >> x; + vector vecVlan_id(x); + for (int i = 0; i < x; i++) { + cin >> vecVlan_id[i]; + } + for (int i = 0; i < x; i++) { + if (uset.find(vecVlan_id[i]) != uset.end()) { + vecTB.push_back(tb); + break; + } + } + + } + cout << vecTB.size() << endl; + if (vecTB.size() != 0) { + sort(vecTB.begin(), vecTB.end()); + for (int i = 0; i < vecTB.size() ; i++) cout << vecTB[i] << " "; + } +} + +``` + +## 其他语言版本 + +### Java + +```Java +import java.util.*; + +public class Main { + public static void main(String[] args) { + Scanner scanner = new Scanner(System.in); + Set uset = new HashSet<>(); + int n = scanner.nextInt(); + while (n-- > 0) { + int a = scanner.nextInt(); + uset.add(a); + } + + int m = scanner.nextInt(); + List vecTB = new ArrayList<>(); + while (m-- > 0) { + long tb = scanner.nextLong(); + int x = scanner.nextInt(); + List vecVlan_id = new ArrayList<>(); + for (int i = 0; i < x; i++) { + vecVlan_id.add(scanner.nextInt()); + } + for (int vlanId : vecVlan_id) { + if (uset.contains(vlanId)) { + vecTB.add(tb); + break; + } + } + } + + System.out.println(vecTB.size()); + if (!vecTB.isEmpty()) { + Collections.sort(vecTB); + for (long tb : vecTB) { + System.out.print(tb + " "); + } + } + } +} + +``` + +### Python + +```python +def main(): + import sys + input = sys.stdin.read + data = input().split() + + index = 0 + n = int(data[index]) + index += 1 + uset = set() + for _ in range(n): + a = int(data[index]) + index += 1 + uset.add(a) + + m = int(data[index]) + index += 1 + vecTB = [] + while m > 0: + tb = int(data[index]) + index += 1 + x = int(data[index]) + index += 1 + vecVlan_id = [] + for _ in range(x): + vecVlan_id.append(int(data[index])) + index += 1 + for vlan_id in vecVlan_id: + if vlan_id in uset: + vecTB.append(tb) + break + m -= 1 + + print(len(vecTB)) + if vecTB: + vecTB.sort() + print(" ".join(map(str, vecTB))) + +if __name__ == "__main__": + main() +``` diff --git "a/problems/kamacoder/0136.\345\255\227\347\254\246\344\270\262\345\244\204\347\220\206\345\231\250.md" "b/problems/kamacoder/0136.\345\255\227\347\254\246\344\270\262\345\244\204\347\220\206\345\231\250.md" new file mode 100644 index 0000000000..1c58f4abaf --- /dev/null +++ "b/problems/kamacoder/0136.\345\255\227\347\254\246\344\270\262\345\244\204\347\220\206\345\231\250.md" @@ -0,0 +1,148 @@ + +# 字符串处理器 + +纯模拟,但情况比较多,非常容易 空指针异常。 + +大家要注意,边界问题 以及 负数问题。 + +整体代码如下: + +```CPP +#include +using namespace std; + int main() { + int index = 0; + long long optNum; + string s; + string cmd; + while(cin >> cmd){ + //cout << s << endl; + if(cmd == "insert") { + string buff; + cin >> buff; + s.insert(index, buff); + index += buff.size(); + } + else if(cmd == "move") { + cin >> optNum; + if(optNum > 0 && index + optNum <= s.size()) index += optNum; + if(optNum < 0 && index >= -optNum) index += optNum; + } + else if(cmd == "delete") { + cin >> optNum; + if(index >= optNum && optNum > 0){ + s.erase(index - optNum, optNum); + index -= optNum; + } + } + else if(cmd == "copy") { + if(index > 0) { + string tmp = s.substr(0, index); + s.insert(index, tmp); + } + } + else if(cmd == "end") { + for(int i = 0; i < index; i++) { + cout << s[i]; + } + cout << '|'; + for(int i = index; i < s.size(); i++) cout << s[i]; + + break; + } + } + return 0; +} + +``` + +## 其他语言版本 + +### Java + +```Java +import java.util.Scanner; + +public class Main { + public static void main(String[] args) { + Scanner scanner = new Scanner(System.in); + StringBuilder s = new StringBuilder(); + int index = 0; + int optNum; + + while (true) { + String cmd = scanner.next(); + if (cmd.equals("insert")) { + String buff = scanner.next(); + s.insert(index, buff); + index += buff.length(); + } else if (cmd.equals("move")) { + optNum = scanner.nextInt(); + if (optNum > 0 && index + optNum <= s.length()) index += optNum; + if (optNum < 0 && index >= -optNum) index += optNum; + } else if (cmd.equals("delete")) { + optNum = scanner.nextInt(); + if (index >= optNum && optNum > 0) { + s.delete(index - optNum, index); + index -= optNum; + } + } else if (cmd.equals("copy")) { + if (index > 0) { + String tmp = s.substring(0, index); + s.insert(index, tmp); + } + } else if (cmd.equals("end")) { + System.out.print(s.substring(0, index) + '|' + s.substring(index)); + break; + } + } + scanner.close(); + } +} +``` + +### Python + +```python +def main(): + import sys + input = sys.stdin.read + data = input().split() + s = "" + index = 0 + i = 0 + + while i < len(data): + cmd = data[i] + i += 1 + if cmd == "insert": + buff = data[i] + i += 1 + s = s[:index] + buff + s[index:] + index += len(buff) + elif cmd == "move": + optNum = int(data[i]) + i += 1 + if optNum > 0 and index + optNum <= len(s): + index += optNum + elif optNum < 0 and index >= -optNum: + index += optNum + elif cmd == "delete": + optNum = int(data[i]) + i += 1 + if index >= optNum and optNum > 0: + s = s[:index - optNum] + s[index:] + index -= optNum + elif cmd == "copy": + if index > 0: + tmp = s[:index] + s = s[:index] + tmp + s[index:] + elif cmd == "end": + print(s[:index] + '|' + s[index:]) + break + +if __name__ == "__main__": + main() + + +``` diff --git "a/problems/kamacoder/0137.\346\266\210\346\201\257\344\274\240\350\276\223.md" "b/problems/kamacoder/0137.\346\266\210\346\201\257\344\274\240\350\276\223.md" new file mode 100644 index 0000000000..a1519bc6b0 --- /dev/null +++ "b/problems/kamacoder/0137.\346\266\210\346\201\257\344\274\240\350\276\223.md" @@ -0,0 +1,192 @@ + +# 137. 消息传输 + +这道题目,普通广搜就可以解决。 + +这里说一下几点注意事项: + +1、 题目描述中,注意 n 是列数,m是行数 + +这是造成很多录友周赛的时候提交 返回 【运行错误】的罪魁祸首,如果 输入用例是 正方形,那没问题,如果后台输入用例是矩形, n 和 m 搞反了,就会数组越界。 + +矩阵是 m * n ,但输入的顺序却是 先输入n 再输入 m。 + +这会让很多人把矩阵的 n 和 m 搞反。 + +其实规范出题,就应该是n 行,m列,然后 先输入n,在输入m。 + +只能说 大厂出题的人,也不是专业出题的,所以会在 非算法方面一不小心留下很多 “bug”,消耗大家的精力。 + +2、再写广搜的时候,可能担心会无限循环 + +即 A 走到 B,B又走到A,A又走到B ,这种情况,一般来说 广搜都是用一个 visit数组来标记的。 + +但本题不用,因为 不会重复走的,题图里的信号都是正数,根据距离判断大小 可以保证不走回头路。 + +```CPP +#include +#include +#include +using namespace std; +const int inf = 1e6; +int main () { + int n, m, startx, starty; + cin >> n >> m; + cin >> startx >> starty; + vector> grid(m, vector(n)); + vector> dis(m, vector(n, inf)); + for (int i = 0; i < m; i++) { + for (int j = 0; j < n; j++) { + cin >> grid[i][j]; + } + } + queue> que; + int dir[4][2] = {0, 1, 1, 0, -1, 0, 0, -1}; + que.push(pair(startx, starty)); + dis[startx][starty] = 0; + while(!que.empty()) { + pair cur = que.front(); que.pop(); + for (int i = 0; i < 4; i++) { + int newx = cur.first + dir[i][1]; + int newy = cur.second + dir[i][0]; + if (newx < 0 || newx >= m || newy < 0 || newy >= n || grid[cur.first][cur.second] == 0) continue; + + if (dis[newx][newy] > dis[cur.first][cur.second] + grid[cur.first][cur.second]) { + dis[newx][newy] = dis[cur.first][cur.second] + grid[cur.first][cur.second]; + que.push(pair(newx, newy)); + } + } + } + int result = 0; + for (int i = 0; i < m; i++) { + for (int j = 0; j < n; j++) { + if (dis[i][j] == inf) { + cout << -1 << endl; + return 0; + } + result = max(result, dis[i][j]); + } + } + cout << result << endl; +} +``` + +## 其他语言版本 + +### Java + +```Java +import java.util.*; + +public class Main { + static final int INF = 1000000; + + public static void main(String[] args) { + Scanner scanner = new Scanner(System.in); + int n = scanner.nextInt(); + int m = scanner.nextInt(); + int startX = scanner.nextInt(); + int startY = scanner.nextInt(); + + int[][] grid = new int[m][n]; + int[][] dis = new int[m][n]; + + for (int i = 0; i < m; i++) { + Arrays.fill(dis[i], INF); + for (int j = 0; j < n; j++) { + grid[i][j] = scanner.nextInt(); + } + } + + Queue queue = new LinkedList<>(); + int[][] directions = {{0, 1}, {1, 0}, {-1, 0}, {0, -1}}; + + queue.add(new int[]{startX, startY}); + dis[startX][startY] = 0; + + while (!queue.isEmpty()) { + int[] current = queue.poll(); + for (int[] dir : directions) { + int newX = current[0] + dir[0]; + int newY = current[1] + dir[1]; + if (newX >= 0 && newX < m && newY >= 0 && newY < n && grid[current[0]][current[1]] != 0) { + if (dis[newX][newY] > dis[current[0]][current[1]] + grid[current[0]][current[1]]) { + dis[newX][newY] = dis[current[0]][current[1]] + grid[current[0]][current[1]]; + queue.add(new int[]{newX, newY}); + } + } + } + } + + int result = 0; + for (int i = 0; i < m; i++) { + for (int j = 0; j < n; j++) { + if (dis[i][j] == INF) { + System.out.println(-1); + return; + } + result = Math.max(result, dis[i][j]); + } + } + + System.out.println(result); + scanner.close(); + } +} +``` + +### Python + +```Python +from collections import deque + +inf = 1000000 + +def main(): + import sys + input = sys.stdin.read + data = input().split() + index = 0 + + n = int(data[index]) + m = int(data[index+1]) + startx = int(data[index+2]) + starty = int(data[index+3]) + index += 4 + + grid = [] + dis = [[inf] * n for _ in range(m)] + + for i in range(m): + grid.append([int(data[index+j]) for j in range(n)]) + index += n + + directions = [(0, 1), (1, 0), (-1, 0), (0, -1)] + queue = deque() + queue.append((startx, starty)) + dis[startx][starty] = 0 + + while queue: + curx, cury = queue.popleft() + for dx, dy in directions: + newx, newy = curx + dx, cury + dy + if 0 <= newx < m and 0 <= newy < n and grid[curx][cury] != 0: + if dis[newx][newy] > dis[curx][cury] + grid[curx][cury]: + dis[newx][newy] = dis[curx][cury] + grid[curx][cury] + queue.append((newx, newy)) + + result = 0 + for i in range(m): + for j in range(n): + if dis[i][j] == inf: + print(-1) + return + result = max(result, dis[i][j]) + + print(result) + +if __name__ == "__main__": + main() + + +``` diff --git "a/problems/kamacoder/0139.\345\217\257\347\210\261\344\270\262.md" "b/problems/kamacoder/0139.\345\217\257\347\210\261\344\270\262.md" new file mode 100644 index 0000000000..9ff0b684d7 --- /dev/null +++ "b/problems/kamacoder/0139.\345\217\257\347\210\261\344\270\262.md" @@ -0,0 +1,101 @@ + +# 可爱串 + +整体思路,就含有 子序列的字符串数量 减去 含有子串的字符串数量。 + +因为子序列数量已经是包含子串数量的。 剩下的就是 只有子序列 且没有子串的 字符串数量。 + + +需要注意我们求的不是 长度为 i 的字符串里有多少个 red 子序列。 + +**而是 可以有多少个 长度为i 的字符串 含有子序列 red** + +同理,可以有多少个长度为i的字符串含有 red 子串 + +认清这一点很重要! + +### 求子串 + +dp2[i][3] 长度为i 且 含有子串 red 的字符串数量 有多少 + +dp2[i][2] 长度为i 且 含有子串 re 的字符串数量有多少 + +dp2[i][1] 长度为 i 且 含有子串 r 的字符串数量有多少 + +dp2[1][0] 长度为 i 且 含有 只有 de, ee , e, d的字符串的字符串数量有多少。 + +```CPP +// 求子串 +dp2[0][0] = 1; +for(int i = 1;i <= n; i++) { + dp2[i][0] = (dp2[i - 1][2] + dp2[i - 1][1] + dp2[i - 1][0] * 2) % mod; // 含有 re 的可以把 r改成d, 含有r 的可以改成 + dp2[i][1] = (dp2[i - 1][2] + dp2[i - 1][1] + dp2[i - 1][0]) % mod; + dp2[i][2] = (dp2[i - 1][1]); + dp2[i][3] = (dp2[i - 1][3] * 3 + dp2[i - 1][2]) % mod; +} +`` + +### 求子序列 + +dp1[i][3] 长度为i 且 含有子序列 red 的字符串数量 有多少 + +dp2[i][2] 长度为i 且 含有子序列 re 的字符串数量有多少 + +dp2[i][1] 长度为 i 且 含有子序列 r 的字符串数量有多少 + +dp2[1][0] 长度为 i 且 含有 只含有 e 和 d 的字符串的字符串数量有多少。 + +```CPP + +// 求子序列 +dp1[0][0]=1; +for(int i=1;i<=n;i++) +{ + dp1[i][0] = (dp1[i - 1][0] * 2) % mod; + dp1[i][1] = (dp1[i - 1][0] + dp1[i - 1][1] * 2) % mod; + dp1[i][2] = (dp1[i - 1][1] + dp1[i - 1][2] * 2) % mod; + dp1[i][3] = (dp1[i - 1][2] + dp1[i - 1][3] * 3) % mod; +} +``` + + + +```CPP + +#include +using namespace std; + +using ll=long long; +const int mod=1e9+7; + +int main() +{ + int n; + + cin>>n; + vector> dp1(n + 1,vector (4,0)); + vector> dp2(n + 1,vector (4,0)); + // 求子串 + dp2[0][0] = 1; + for(int i = 1;i <= n; i++) { + dp2[i][0] = (dp2[i - 1][2] + dp2[i - 1][1] + dp2[i - 1][0] * 2) % mod; + dp2[i][1] = (dp2[i - 1][2] + dp2[i - 1][1] + dp2[i - 1][0]) % mod; + dp2[i][2] = (dp2[i - 1][1]); + dp2[i][3] = (dp2[i - 1][3] * 3 + dp2[i - 1][2]) % mod; + } + + // 求子序列 + dp1[0][0]=1; + for(int i=1;i<=n;i++) + { + dp1[i][0] = (dp1[i - 1][0] * 2) % mod; + dp1[i][1] = (dp1[i - 1][0] + dp1[i - 1][1] * 2) % mod; + dp1[i][2] = (dp1[i - 1][1] + dp1[i - 1][2] * 2) % mod; + dp1[i][3] = (dp1[i - 1][2] + dp1[i - 1][3] * 3) % mod; + } + + cout<<(dp1[n][3] - dp2[n][3])%mod; + +} + +``` diff --git "a/problems/kamacoder/\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\346\234\200\345\260\217ASCII\345\210\240\351\231\244\346\200\273\345\222\214.md" "b/problems/kamacoder/\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\346\234\200\345\260\217ASCII\345\210\240\351\231\244\346\200\273\345\222\214.md" new file mode 100644 index 0000000000..5425a605b8 --- /dev/null +++ "b/problems/kamacoder/\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\346\234\200\345\260\217ASCII\345\210\240\351\231\244\346\200\273\345\222\214.md" @@ -0,0 +1,30 @@ + + +本题和[代码随想录:两个字符串的删除操作](https://www.programmercarl.com/0583.%E4%B8%A4%E4%B8%AA%E5%AD%97%E7%AC%A6%E4%B8%B2%E7%9A%84%E5%88%A0%E9%99%A4%E6%93%8D%E4%BD%9C.html) 思路基本是一样的。 + + +```CPP +#include +#include +using namespace std; +int main() { + string s1, s2; + cin >> s1 >> s2; + vector> dp(s1.size() + 1, vector(s2.size() + 1, 0)); + + // s1 如果变成空串的最小删除ASCLL值综合 + for (int i = 1; i <= s1.size(); i++) dp[i][0] = dp[i - 1][0] + s1[i - 1]; + // s2 如果变成空串的最小删除ASCLL值综合 + for (int j = 1; j <= s2.size(); j++) dp[0][j] = dp[0][j - 1] + s2[j - 1]; + + for (int i = 1; i <= s1.size(); i++) { + for (int j = 1; j <= s2.size(); j++) { + if (s1[i - 1] == s2[j - 1]) dp[i][j] = dp[i - 1][j - 1]; + else dp[i][j] = min(dp[i - 1][j] + s1[i - 1], dp[i][j - 1] + s2[j - 1]); + } + } + cout << dp[s1.size()][s2.size()] << endl; + +} +``` + diff --git "a/problems/kamacoder/\345\233\276\350\256\272\344\270\272\344\273\200\344\271\210\347\224\250ACM\346\250\241\345\274\217.md" "b/problems/kamacoder/\345\233\276\350\256\272\344\270\272\344\273\200\344\271\210\347\224\250ACM\346\250\241\345\274\217.md" new file mode 100644 index 0000000000..362ea9714a --- /dev/null +++ "b/problems/kamacoder/\345\233\276\350\256\272\344\270\272\344\273\200\344\271\210\347\224\250ACM\346\250\241\345\274\217.md" @@ -0,0 +1,93 @@ + + + +# 图论为什么统一使用ACM模式 + +代码随想录图论章节给大家统一换成ACM输入输出模式。 + +图论是在笔试还有面试中,通常都是以ACM模式来考察大家,而大家习惯在力扣刷题(核心代码模式),核心代码模式对图的存储和输出都隐藏了。 + +而图论题目的输出输出 相对其他类型题目来说是最难处理的。 + +ACM模式是最考察候选人对代码细节把控程度的, 图的构成,图的输出,这些只有ACM输入输出模式才能体现出来。 + +### 输入的细节 + +图论的输入难在 图的存储结构,**如果没有练习过 邻接表和邻接矩阵 ,很多录友是写不出来的**。 + +而力扣上是直接给好现成的 数据结构,可以直接用,所以练习不到图的输入,也练习不到邻接表和邻接矩阵。 + +**如果连邻接表 和 邻接矩阵都不知道或者写不出来的话,可以说 图论没有入门**。 + +举个例子,对于力扣 [797.所有可能的路径](https://leetcode.cn/problems/all-paths-from-source-to-target/description/) ,录友了解深度优先搜索之后,这道题目就是模板题,是送分题。 + +如果面试的时候出一道原题 (笔试都是ACM模式,部分面试也是ACM模式),不少熟练刷力扣的录友都难住了,**因为不知道图应该怎么存,也不知道自己存的图如何去遍历**。 + +即使面试的时候,有的面试官,让你用核心代码模式做题,当你写出代码后,**面试官补充一句:这个图 你是怎么存的**? + +难道和面试官说:我只知道图的算法,但我不知道图怎么存。 + +后面大家在刷 代码随想录图论第一题[98. 所有可达路径](./0098.所有可达路径.md) 的时候,就可以感受到图存储的难点所在。 + +所以这也是为什么我要让大家练习 ACM模式,也是我为什么 在代码随想录图论讲解中,不惜自己亲自出题,让大家统一练习ACM模式。 + +### 输出的细节 + +同样,图论的输出也有细节,例如 求节点1 到节点5的所有路径, 输出可能是: + +``` +1 2 4 5 +1 3 5 +``` + +表示有两条路可以到节点5, 那储存这个结果需要二维数组,最后在一起输出,力扣是直接return数组就好了,但 ACM模式要求我们自己输出,这里有就细节了。 + +就拿 只输出一行数据,输出 `1 2 4 5` 来说, + +很多录友代码可能直接就这么写了: + +```CPP +for (int i = 0 ; i < result.size(); i++) { + cout << result[i] << " "; +} +``` + +这么写输出的结果是 `1 2 4 5 `, 发现结果是对的,一提交,发现OJ返回 格式错误 或者 结果错误。 + +如果没练习过这种输出方式的录友,就开始怀疑了,这结果一样一样的,怎么就不对,我在力扣上提交都是对的! + +**大家要注意,5 后面要不要有空格**! + +上面这段代码输出,5后面是加上了空格了,如果判题机判断 结果的长度,标准答案`1 2 4 5`长度是7,而上面代码输出的长度是 8,很明显就是不对的。 + +所以正确的写法应该是: + +```CPP +for (int i = 0 ; i < result.size() - 1; i++) { + cout << result[i] << " "; +} +cout << result[result.size() - 1]; +``` + +这么写,最后一个元素后面就没有空格了。 + +这是很多录友经常疏忽的,也是大家刷习惯了 力扣(核心代码模式)根本不会注意到的细节。 + +**同样在工程开发中,这些细节都是影响系统稳定运行的因素之一**。 + +**ACM模式 除了考验算法思路,也考验 大家对 代码的把控力度**, 而 核心代码模式 只注重算法的解题思路,所以输入输出这些就省略掉了。 + + +### 其他 + +**大家如果熟练ACM模式,那么核心代码模式没问题,但反过来就不一定了**。 + +而且我在讲解图论的时候,最头疼的就是找题,在力扣上 找题总是找不到符合思路且来完整表达算法精髓的题目。 + +特别是最短路算法相关的题目,例如 Bellman_ford系列 ,Floyd ,A * 等等总是找不到符合思路的题目。 + +索性统一我自己来出题,这其中也是巨大的工作量。为了给大家带来极致的学习体验,我在很多细节上都下了功夫。 + +等大家将图论刷完,就会感受到我的良苦用心。加油 + + diff --git "a/problems/kamacoder/\345\233\276\350\256\272\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/kamacoder/\345\233\276\350\256\272\347\220\206\350\256\272\345\237\272\347\241\200.md" index 18d63e2d7b..50c3615733 100644 --- "a/problems/kamacoder/\345\233\276\350\256\272\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/kamacoder/\345\233\276\350\256\272\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -3,6 +3,8 @@ 这一篇我们正式开始图论! +代码随想录图论中的算法题目将统一使用ACM模式,[为什么要使用ACM模式](./图论为什么用ACM模式.md) + ## 图的基本概念 二维坐标中,两点可以连成线,多个点连成的线就构成了图。 diff --git "a/problems/kamacoder/\345\245\275\344\272\214\345\217\211\346\240\221.md" "b/problems/kamacoder/\345\245\275\344\272\214\345\217\211\346\240\221.md" new file mode 100644 index 0000000000..fe48f2fd46 --- /dev/null +++ "b/problems/kamacoder/\345\245\275\344\272\214\345\217\211\346\240\221.md" @@ -0,0 +1,104 @@ + +本题和 [96.不同的二叉搜索树](https://www.programmercarl.com/0096.%E4%B8%8D%E5%90%8C%E7%9A%84%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91.html) 比较像 + +* 取模这里很容易出错 +* 过程中所用到的数值都有可能超过int,所以要改用longlong + +```CPP +#include +#include +using namespace std; + +long long mod = 1e9 + 7; +long long dp(int t, vector& memory) { + if (t % 2 == 0) return 0; + if (t == 1) return 1; + if (memory[t] != -1) return memory[t]; + + long long result = 0; + // 枚举左右子树节点的数量 + for (int i = 1; i < t; i += 2) { + long long leftNum = dp(i, memory); // 左子树节点数量为i + long long rightNum = dp(t - i - 1, memory); // 右子树节点数量为t - i - 1 + result += (leftNum * rightNum) % mod; // 注意这里是乘的关系 + result %= mod; + } + memory[t] = result; + return result; +} +int main() { + int n; + cin >> n; + vector memory(n + 1, -1); + cout << dp(n, memory) << endl; +} +``` + + +```CPP +#include +#include +#include + +using namespace std; + +const int MOD = 1000000007; + +int main() { + int num; + cin >> num; + + if (num % 2 == 0) { + cout << 0 << endl; + return 0; + } + + vector dp(num + 1, 0); + dp[1] = 1; + + for (int i = 3; i <= num; i += 2) { + for (int j = 1; j <= i - 2; j += 2) { + dp[i] = (dp[i] + dp[j] * dp[i - 1 - j]) % MOD; + } + } + + cout << dp[num] << endl; + return 0; +} + +``` + + +第二题的代码 + +#include +using namespace std; + +long fastexp(long base,long n,long mod){ + long answer = 1; + while(n > 0){ + if(n % 2 == 1){ + answer = (answer * base) % mod; + } + base = (base * base) % mod; + n /= 2; + } + return answer; +} +int kawaiiStrings(int n) { + // write code here + std::vector f(n + 1), g(n + 1), h(n + 1); + long mod = 1000000007; + for (long i = 2; i <= n; i++) g[i] = (g[i - 1] * 2 + (i - 1) * fastexp(2,i-2,mod)) % mod; + for (long i = 3; i <= n; i++) f[i] = ((f[i - 1] * 3) % mod + g[i - 1]) % mod; + for (long i = 3; i <= n; i++) h[i] = (fastexp(3, i - 3, mod) + h[i - 1] * 3 - h[i - 3]) % mod; + return (f[n]-h[n]+mod)%mod; + +} + +int main(){ + int n; + cin >> n; + cout << kawaiiStrings(n) << endl; + return 0; +} diff --git "a/problems/kamacoder/\345\255\227\347\254\246\344\270\262\345\244\204\347\220\206\345\231\250.md" "b/problems/kamacoder/\345\255\227\347\254\246\344\270\262\345\244\204\347\220\206\345\231\250.md" deleted file mode 100644 index bdd8222ed5..0000000000 --- "a/problems/kamacoder/\345\255\227\347\254\246\344\270\262\345\244\204\347\220\206\345\231\250.md" +++ /dev/null @@ -1,50 +0,0 @@ - - -```CPP -#include -using namespace std; - int main() { - int index = 0; - long long optNum; - string s; - string cmd; - while(cin >> cmd){ - //cout << s << endl; - if(cmd == "insert"){ - string buff; - cin >> buff; - s.insert(index, buff); - index += buff.size(); - } - else if(cmd == "move"){ - cin >> optNum; - if(optNum > 0 && index + optNum <= s.size()) index += optNum; - if(optNum < 0 && index >= -optNum) index += optNum; - } - else if(cmd == "delete"){ - cin >> optNum; - if(index >= optNum && optNum != 0){ - s.erase(index - optNum, optNum); - index -= optNum; - } - } - else if(cmd == "copy"){ - if(index > 0) { - string tmp = s.substr(0, index); - s.insert(index, tmp); - } - } - else if(cmd == "end"){ - for(int i = 0; i < index; i++) { - cout << s[i]; - } - cout << '|'; - for(int i = index; i < s.size(); i++){ - cout << s[i]; - } - break; - } - } - return 0; - } -``` diff --git "a/problems/kamacoder/\345\256\214\347\276\216\346\225\260.md" "b/problems/kamacoder/\345\256\214\347\276\216\346\225\260.md" new file mode 100644 index 0000000000..1f801d7666 --- /dev/null +++ "b/problems/kamacoder/\345\256\214\347\276\216\346\225\260.md" @@ -0,0 +1,29 @@ + +```CPP +#include +#include +using namespace std; +int countOnes(long long num) { + int zeroCount = 0; + while (num > 0) { + if (num % 10 != 0) { // 检查最低位是否为0 + zeroCount++; + } + num /= 10; // 移除最低位 + } + return zeroCount; +} +int main() { + int n; + cin >> n; + vector vec(n); + for (int i = 0; i < n; i++) cin >> vec[i]; + int result = 0; + for (int i = 0; i < n; i++) { + for (int j = i + 1; j < n; j++) { + if (countOnes(vec[i] * vec[j]) == 1) result++; + } + } + cout << result << endl; +} +``` diff --git "a/problems/kamacoder/\345\260\217\347\272\242\347\232\204\345\214\272\351\227\264\347\277\273\350\275\254.md" "b/problems/kamacoder/\345\260\217\347\272\242\347\232\204\345\214\272\351\227\264\347\277\273\350\275\254.md" new file mode 100644 index 0000000000..fd9f6ab356 --- /dev/null +++ "b/problems/kamacoder/\345\260\217\347\272\242\347\232\204\345\214\272\351\227\264\347\277\273\350\275\254.md" @@ -0,0 +1,109 @@ + + + +import java.util.Scanner; + +public class Main { + + public static void main(String[] args) { + Scanner sc = new Scanner(System.in); + int n = sc.nextInt(); + int[] a = new int[n]; + int[] b = new int[n]; + + for (int i = 0; i < n; i++) { + a[i] = sc.nextInt(); + } + + for (int i = 0; i < n; i++) { + b[i] = sc.nextInt(); + } + + int p = -1, s = -1; + for (int i = 0; i < n; i++) { + if (a[i] == b[i]) p = i; + else break; + } + + for (int j = n - 1 ; j >= 0 ; j--) { + if (a[j] == b[j]) s = j; + else break; + } + + + boolean[][] dp = new boolean[n][n]; + int res = 0; + + for (int j = 0; j < n; j++) { + for (int i = j ; i >= 0 ; i--) { + if (i == j) dp[i][j] = a[i] == b[i]; + else if (i + 1 == j) dp[i][j] = (a[i] == b[j] && a[j] == b[i]); + else { + dp[i][j] = dp[i+1][j-1] && (a[i] == b[j] && a[j] == b[i]); + } + if (dp[i][j] && (i == 0 || p >= i-1) && (j == n - 1 || j+1 >= s)) res++; + } + } + System.out.println(res); + } + +} + + +import java.util.Scanner; + +public class Main { + public static void main(String[] args) { + Scanner sc = new Scanner(System.in); + int n = sc.nextInt(); + + int[] a = new int[n]; + int[] b = new int[n]; + + for (int i = 0; i < n; i++) { + a[i] = sc.nextInt(); + } + + for (int i = 0; i < n; i++) { + b[i] = sc.nextInt(); + } + + int count = 0; + + // 遍历所有可能的区间 + for (int left = 0; left < n; left++) { + for (int right = left; right < n; right++) { + // 检查翻转区间 [left, right] 后,a 是否可以变成 b + if (canTransform(a, b, left, right)) { + count++; + } + } + } + + System.out.println(count); + } + + private static boolean canTransform(int[] a, int[] b, int left, int right) { + // 提前检查翻转区间的值是否可以匹配 + for (int i = left, j = right; i <= right; i++, j--) { + if (a[i] != b[j]) { + return false; + } + } + + // 检查翻转区间外的值是否匹配 + for (int i = 0; i < left; i++) { + if (a[i] != b[i]) { + return false; + } + } + + for (int i = right + 1; i < a.length; i++) { + if (a[i] != b[i]) { + return false; + } + } + + return true; + } +} diff --git "a/problems/kamacoder/\346\234\200\351\225\277\345\220\214\345\200\274\350\267\257\345\276\204.md" "b/problems/kamacoder/\346\234\200\351\225\277\345\220\214\345\200\274\350\267\257\345\276\204.md" new file mode 100644 index 0000000000..68aeb84505 --- /dev/null +++ "b/problems/kamacoder/\346\234\200\351\225\277\345\220\214\345\200\274\350\267\257\345\276\204.md" @@ -0,0 +1,81 @@ + + + + +```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* constructBinaryTree(const vector& levelOrder) { + if (levelOrder.empty()) return NULL; + + TreeNode* root = new TreeNode(stoi(levelOrder[0])); + queue q; + q.push(root); + int i = 1; + + while (!q.empty() && i < levelOrder.size()) { + TreeNode* current = q.front(); + q.pop(); + + if (i < levelOrder.size() && levelOrder[i] != "null") { + current->left = new TreeNode(stoi(levelOrder[i])); + q.push(current->left); + } + i++; + + if (i < levelOrder.size() && levelOrder[i] != "null") { + current->right = new TreeNode(stoi(levelOrder[i])); + q.push(current->right); + } + i++; + } + + return root; +} + +int result = 0; +int dfs(TreeNode* node) { + if (node == NULL) return 0; + int leftPath = dfs(node->left); + int rightPath = dfs(node->right); + + int leftNum = 0, rightNum = 0; + if (node->left != NULL && node->left->val == node->val) { + leftNum = leftPath + 1; + } + if (node->right != NULL && node->right->val == node->val) { + rightNum = rightPath + 1; + } + result = max(result, leftNum + rightNum); + return max(leftNum, rightNum); + +} + + +int main() { + int n; + cin >> n; + vector levelOrder(n); + for (int i = 0; i < n ; i++) cin >> levelOrder[i]; + + TreeNode* root = constructBinaryTree(levelOrder); + dfs(root); + cout << result << endl; + + return 0; +} +``` + diff --git "a/problems/kamacoder/\350\216\267\345\217\226\350\277\236\351\200\232\347\232\204\347\233\270\351\202\273\350\212\202\347\202\271\345\210\227\350\241\250.md" "b/problems/kamacoder/\350\216\267\345\217\226\350\277\236\351\200\232\347\232\204\347\233\270\351\202\273\350\212\202\347\202\271\345\210\227\350\241\250.md" deleted file mode 100644 index 791b6b6819..0000000000 --- "a/problems/kamacoder/\350\216\267\345\217\226\350\277\236\351\200\232\347\232\204\347\233\270\351\202\273\350\212\202\347\202\271\345\210\227\350\241\250.md" +++ /dev/null @@ -1,47 +0,0 @@ - - - -```CPP -#include -#include -#include -#include -using namespace std; -int main() { - unordered_set uset; - int n, a; - cin >> n; - while (n--) { - cin >> a; - uset.insert(a); - } - int m, x, vlan_id; - long long tb; - vector vecTB; - cin >> m; - while(m--) { - cin >> tb; - cin >> x; - vector vecVlan_id(x); - for (int i = 0; i < x; i++) { - cin >> vecVlan_id[i]; - } - for (int i = 0; i < x; i++) { - if (uset.find(vecVlan_id[i]) != uset.end()) { - vecTB.push_back(tb); - break; - } - } - - } - - cout << vecTB.size() << endl; - if (vecTB.size() != 0) { - sort(vecTB.begin(), vecTB.end()); - for (int i = 0; i < vecTB.size() ; i++) cout << vecTB[i] << " "; - } - - -} - -``` From 3848c96acd298f3b3593bb78eeb91dd1377a7d82 Mon Sep 17 00:00:00 2001 From: kimoge <1579457263@qq.com> Date: Mon, 15 Jul 2024 23:12:22 +0800 Subject: [PATCH 2695/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B00097=5F=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0Python3=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...16\351\200\233\345\205\254\345\233\255.md" | 64 ++++++++++++++++++- 1 file changed, 63 insertions(+), 1 deletion(-) diff --git "a/problems/kamacoder/0097.\345\260\217\346\230\216\351\200\233\345\205\254\345\233\255.md" "b/problems/kamacoder/0097.\345\260\217\346\230\216\351\200\233\345\205\254\345\233\255.md" index 5465c356f9..e8d92cc29f 100644 --- "a/problems/kamacoder/0097.\345\260\217\346\230\216\351\200\233\345\205\254\345\233\255.md" +++ "b/problems/kamacoder/0097.\345\260\217\346\230\216\351\200\233\345\205\254\345\233\255.md" @@ -339,7 +339,7 @@ int main() { } } -``` +``` ## 空间优化 @@ -426,6 +426,68 @@ floyd算法的时间复杂度相对较高,适合 稠密图且源点较多的 ### Python +基于三维数组的Floyd + +```python +if __name__ == '__main__': + max_int = 10005 # 设置最大路径,因为边最大距离为10^4 + + n, m = map(int, input().split()) + + grid = [[[max_int] * (n+1) for _ in range(n+1)] for _ in range(n+1)] # 初始化三维dp数组 + + for _ in range(m): + p1, p2, w = map(int, input().split()) + grid[p1][p2][0] = w + grid[p2][p1][0] = w + + # 开始floyd + for k in range(1, n+1): + for i in range(1, n+1): + for j in range(1, n+1): + grid[i][j][k] = min(grid[i][j][k-1], grid[i][k][k-1] + grid[k][j][k-1]) + + # 输出结果 + z = int(input()) + for _ in range(z): + start, end = map(int, input().split()) + if grid[start][end][n] == max_int: + print(-1) + else: + print(grid[start][end][n]) +``` + +基于二维数组的Floyd + +```python +if __name__ == '__main__': + max_int = 10005 # 设置最大路径,因为边最大距离为10^4 + + n, m = map(int, input().split()) + + grid = [[max_int]*(n+1) for _ in range(n+1)] # 初始化二维dp数组 + + for _ in range(m): + p1, p2, val = map(int, input().split()) + grid[p1][p2] = val + grid[p2][p1] = val + + # 开始floyd + for k in range(1, n+1): + for i in range(1, n+1): + for j in range(1, n+1): + grid[i][j] = min(grid[i][j], grid[i][k] + grid[k][j]) + + # 输出结果 + z = int(input()) + for _ in range(z): + start, end = map(int, input().split()) + if grid[start][end] == max_int: + print(-1) + else: + print(grid[start][end]) +``` + ### Go ### Rust From 42987012694e2370572ed30ff5ff6f201e613c02 Mon Sep 17 00:00:00 2001 From: markwang Date: Tue, 16 Jul 2024 10:33:07 +0800 Subject: [PATCH 2696/3019] =?UTF-8?q?106.=E4=BB=8E=E4=B8=AD=E5=BA=8F?= =?UTF-8?q?=E4=B8=8E=E5=90=8E=E5=BA=8F=E9=81=8D=E5=8E=86=E5=BA=8F=E5=88=97?= =?UTF-8?q?=E6=9E=84=E9=80=A0=E4=BA=8C=E5=8F=89=E6=A0=91=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?Go=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...40\344\272\214\345\217\211\346\240\221.md" | 108 ++++++++++++++++++ 1 file changed, 108 insertions(+) diff --git "a/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" "b/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" index 3518343fc4..bde61a7551 100644 --- "a/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" @@ -794,6 +794,60 @@ func rebuild(inorder []int, postorder []int, rootIdx int, l, r int) *TreeNode { } ``` +```go +/** + * Definition for a binary tree node. + * type TreeNode struct { + * Val int + * Left *TreeNode + * Right *TreeNode + * } + */ +func buildTree(inorder []int, postorder []int) *TreeNode { + if len(postorder) == 0 { + return nil + } + + // 后序遍历数组最后一个元素,就是当前的中间节点 + rootValue := postorder[len(postorder)-1] + root := &TreeNode{Val:rootValue} + + // 叶子结点 + if len(postorder) == 1 { + return root + } + + // 找到中序遍历的切割点 + var delimiterIndex int + for delimiterIndex = 0; delimiterIndex < len(inorder); delimiterIndex++ { + if inorder[delimiterIndex] == rootValue { + break; + } + } + + // 切割中序数组 + // 左闭右开区间:[0, delimiterIndex) + leftInorder := inorder[:delimiterIndex] + // [delimiterIndex + 1, end) + rightInorder := inorder[delimiterIndex+1:] + + // postorder 舍弃末尾元素 + postorder = postorder[:len(postorder)-1] + + // 切割后序数组 + // 依然左闭右开,注意这里使用了左中序数组大小作为切割点 + // [0, len(leftInorder)) + leftPostorder := postorder[:len(leftInorder)] + // [len(leftInorder), end) + rightPostorder := postorder[len(leftInorder):] + + root.Left = buildTree(leftInorder, leftPostorder) + root.Right = buildTree(rightInorder, rightPostorder) + + return root +} +``` + 105 从前序与中序遍历序列构造二叉树 ```go @@ -829,6 +883,60 @@ func build(pre []int, in []int, root int, l, r int) *TreeNode { } ``` +```go +/** + * Definition for a binary tree node. + * type TreeNode struct { + * Val int + * Left *TreeNode + * Right *TreeNode + * } + */ +func buildTree(preorder []int, inorder []int) *TreeNode { + if len(preorder) == 0 { + return nil + } + + // 前序遍历数组第一个元素,就是当前的中间节点 + rootValue := preorder[0] + root := &TreeNode{Val:rootValue} + + // 叶子结点 + if len(preorder) == 1 { + return root + } + + // 找到中序遍历的切割点 + var delimiterIndex int + for delimiterIndex = 0; delimiterIndex < len(inorder); delimiterIndex++ { + if inorder[delimiterIndex] == rootValue { + break + } + } + + // 切割中序数组 + // 左闭右开区间:[0, delimiterIndex) + leftInorder := inorder[:delimiterIndex] + // [delimiterIndex + 1, end) + rightInorder := inorder[delimiterIndex+1:] + + // preorder 舍弃首位元素 + preorder = preorder[1:] + + // 切割前序数组 + // 依然左闭右开,注意这里使用了左中序数组大小作为切割点 + // [0, len(leftInorder)) + leftPreorder := preorder[:len(leftInorder)] + // [len(leftInorder), end) + rightPreorder := preorder[len(leftInorder):] + + root.Left = buildTree(leftPreorder, leftInorder) + root.Right = buildTree(rightPreorder, rightInorder) + + return root +} +``` + ### JavaScript From 5db796f3e2643db83e6829a0d7cfb459bb9781b5 Mon Sep 17 00:00:00 2001 From: kimoge <1579457263@qq.com> Date: Wed, 17 Jul 2024 09:53:30 +0800 Subject: [PATCH 2697/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=8D=A1=E7=A0=81?= =?UTF-8?q?=E7=BD=910099.=E5=B2=9B=E5=B1=BF=E7=9A=84=E6=95=B0=E9=87=8F?= =?UTF-8?q?=E6=B7=B1=E6=90=9C=EF=BC=8C=E6=B7=BB=E5=8A=A0Python3=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...60\351\207\217\346\267\261\346\220\234.md" | 94 +++++++++++++++++++ 1 file changed, 94 insertions(+) diff --git "a/problems/kamacoder/0099.\345\262\233\345\261\277\347\232\204\346\225\260\351\207\217\346\267\261\346\220\234.md" "b/problems/kamacoder/0099.\345\262\233\345\261\277\347\232\204\346\225\260\351\207\217\346\267\261\346\220\234.md" index 37f7086a2b..94ce8d5b9c 100644 --- "a/problems/kamacoder/0099.\345\262\233\345\261\277\347\232\204\346\225\260\351\207\217\346\267\261\346\220\234.md" +++ "b/problems/kamacoder/0099.\345\262\233\345\261\277\347\232\204\346\225\260\351\207\217\346\267\261\346\220\234.md" @@ -185,6 +185,100 @@ int main() { ### Python +版本一 + +```python +direction = [[0, 1], [1, 0], [0, -1], [-1, 0]] # 四个方向:上、右、下、左 + + +def dfs(grid, visited, x, y): + """ + 对一块陆地进行深度优先遍历并标记 + """ + for i, j in direction: + next_x = x + i + next_y = y + j + # 下标越界,跳过 + if next_x < 0 or next_x >= len(grid) or next_y < 0 or next_y >= len(grid[0]): + continue + # 未访问的陆地,标记并调用深度优先搜索 + if not visited[next_x][next_y] and grid[next_x][next_y] == 1: + visited[next_x][next_y] = True + dfs(grid, visited, next_x, next_y) + + +if __name__ == '__main__': + # 版本一 + n, m = map(int, input().split()) + + # 邻接矩阵 + grid = [] + for i in range(n): + grid.append(list(map(int, input().split()))) + + # 访问表 + visited = [[False] * m for _ in range(n)] + + res = 0 + for i in range(n): + for j in range(m): + # 判断:如果当前节点是陆地,res+1并标记访问该节点,使用深度搜索标记相邻陆地。 + if grid[i][j] == 1 and not visited[i][j]: + res += 1 + visited[i][j] = True + dfs(grid, visited, i, j) + + print(res) +``` + +版本二 + +```python +direction = [[0, 1], [1, 0], [0, -1], [-1, 0]] # 四个方向:上、右、下、左 + + +def dfs(grid, visited, x, y): + """ + 对一块陆地进行深度优先遍历并标记 + """ + # 与版本一的差别,在调用前增加判断终止条件 + if visited[x][y] or grid[x][y] == 0: + return + visited[x][y] = True + + for i, j in direction: + next_x = x + i + next_y = y + j + # 下标越界,跳过 + if next_x < 0 or next_x >= len(grid) or next_y < 0 or next_y >= len(grid[0]): + continue + # 由于判断条件放在了方法首部,此处直接调用dfs方法 + dfs(grid, visited, next_x, next_y) + + +if __name__ == '__main__': + # 版本二 + n, m = map(int, input().split()) + + # 邻接矩阵 + grid = [] + for i in range(n): + grid.append(list(map(int, input().split()))) + + # 访问表 + visited = [[False] * m for _ in range(n)] + + res = 0 + for i in range(n): + for j in range(m): + # 判断:如果当前节点是陆地,res+1并标记访问该节点,使用深度搜索标记相邻陆地。 + if grid[i][j] == 1 and not visited[i][j]: + res += 1 + dfs(grid, visited, i, j) + + print(res) +``` + ### Go ### Rust From 750ce672ea5ff0dafe96cde854d8f0aeedacfb51 Mon Sep 17 00:00:00 2001 From: wangya <1264178545@qq.com> Date: Wed, 17 Jul 2024 14:05:50 +0800 Subject: [PATCH 2698/3019] =?UTF-8?q?fix:=20=E5=8D=A1=E7=A0=81=E7=BD=91010?= =?UTF-8?q?6.=E5=B2=9B=E5=B1=BF=E7=9A=84=E5=91=A8=E9=95=BF=20=E8=A1=A8?= =?UTF-8?q?=E8=BF=B0=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/kamacoder/0106.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" "b/problems/kamacoder/0106.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" index 340630398f..48400a95f6 100644 --- "a/problems/kamacoder/0106.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" +++ "b/problems/kamacoder/0106.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" @@ -66,7 +66,7 @@ ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240524120105.png) -该录友的下边空格出界了,则说明找到一条边。 +该陆地的下边空格出界了,则说明找到一条边。 C++代码如下:(详细注释) From 7aa230ed40e7583a61ec6b6fb38500b17c0dfe27 Mon Sep 17 00:00:00 2001 From: wangya <1264178545@qq.com> Date: Wed, 17 Jul 2024 14:13:19 +0800 Subject: [PATCH 2699/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20=E5=8D=A1?= =?UTF-8?q?=E7=A0=81=E7=BD=910098.=E6=89=80=E6=9C=89=E5=8F=AF=E8=BE=BE?= =?UTF-8?q?=E8=B7=AF=E5=BE=84=20JS=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...57\350\276\276\350\267\257\345\276\204.md" | 146 +++++++++++++++++- 1 file changed, 142 insertions(+), 4 deletions(-) diff --git "a/problems/kamacoder/0098.\346\211\200\346\234\211\345\217\257\350\276\276\350\267\257\345\276\204.md" "b/problems/kamacoder/0098.\346\211\200\346\234\211\345\217\257\350\276\276\350\267\257\345\276\204.md" index 073d1a2e21..3281303dec 100644 --- "a/problems/kamacoder/0098.\346\211\200\346\234\211\345\217\257\350\276\276\350\267\257\345\276\204.md" +++ "b/problems/kamacoder/0098.\346\211\200\346\234\211\345\217\257\350\276\276\350\267\257\345\276\204.md" @@ -75,7 +75,7 @@ ## 插曲 -------------- +------------- 本题和力扣 [797.所有可能的路径](https://leetcode.cn/problems/all-paths-from-source-to-target/description/) 是一样的,录友了解深度优先搜索之后,这道题目就是模板题,是送分题。 @@ -475,7 +475,7 @@ public class Main { } } } -``` +``` #### 邻接表写法 ```java @@ -564,7 +564,7 @@ def main(): if __name__ == "__main__": main() -``` +``` #### 邻接表写法 ``` python @@ -608,6 +608,145 @@ if __name__ == "__main__": ### Javascript +#### 邻接矩阵写法 + +```javascript +const r1 = require('readline').createInterface({ input: process.stdin }); +// 创建readline接口 +let iter = r1[Symbol.asyncIterator](); +// 创建异步迭代器 +const readline = async ()=>(await iter.next()).value; + + +let graph; +let N, M; +// 收集符合条件的路径 +let result = []; +// 1节点到终点的路径 +let path = []; + +// 创建邻接矩阵,初始化邻接矩阵 +async function initGraph(){ + let line; + + line = await readline(); + [N, M] = line.split(' ').map(i => parseInt(i)) + graph = new Array(N + 1).fill(0).map(() => new Array(N + 1).fill(0)) + + while(M--){ + line = await readline() + const strArr = line ? line.split(' ').map(i => parseInt(i)) : undefined + strArr ? graph[strArr[0]][strArr[1]] = 1 : null + } +}; + +// 深度搜索 +function dfs(graph, x, n){ + // 当前遍历节点为x, 到达节点为n + if(x == n){ + result.push([...path]) + return + } + for(let i = 1 ; i <= n ; i++){ + if(graph[x][i] == 1){ + path.push(i) + dfs(graph, i, n ) + path.pop(i) + } + } +}; + +(async function(){ + // 创建邻接矩阵,初始化邻接矩阵 + await initGraph(); + + // 从节点1开始深度搜索 + path.push(1); + + // 深度搜索 + dfs(graph, 1, N ); + + // 输出 + if(result.length > 0){ + result.forEach(i => { + console.log(i.join(' ')) + }) + }else{ + console.log(-1) + } + +})(); + +``` + + + +#### 邻接表写法 + +```javascript +const r1 = require('readline').createInterface({ input: process.stdin }); +// 创建readline接口 +let iter = r1[Symbol.asyncIterator](); +// 创建异步迭代器 +const readline = async () => (await iter.next()).value; + +let graph; +let N, M; + +// 收集符合条件的路径 +let result = []; +// 1节点到终点的路径 +let path = []; + +// 创建邻接表,初始化邻接表 +async function initGraph() { + let line; + line = await readline(); + [N, M] = line.split(' ').map(i => parseInt(i)) + graph = new Array(N + 1).fill(0).map(() => new Array()) + + while (line = await readline()) { + const strArr = line.split(' ').map(i => parseInt(i)) + strArr ? graph[strArr[0]].push(strArr[1]) : null + } +}; + +// 深度搜索 +async function dfs(graph, x, n) { + // 当前遍历节点为x, 到达节点为n + if (x == n) { + result.push([...path]) + return + } + + graph[x].forEach(i => { + path.push(i) + dfs(graph, i, n) + path.pop(i) + }) +}; + +(async function () { + // 创建邻接表,初始化邻接表 + await initGraph(); + + // 从节点1开始深度搜索 + path.push(1); + + // 深度搜索 + dfs(graph, 1, N); + + // 输出 + if (result.length > 0) { + result.forEach(i => { + console.log(i.join(' ')) + }) + } else { + console.log(-1) + } +})(); +``` + ### TypeScript ### PhP @@ -628,4 +767,3 @@ if __name__ == "__main__": - From 08a437eb3a2114316b4f4881d2311dcf983c7e08 Mon Sep 17 00:00:00 2001 From: wangya <1264178545@qq.com> Date: Wed, 17 Jul 2024 14:20:18 +0800 Subject: [PATCH 2700/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20=E5=8D=A1?= =?UTF-8?q?=E7=A0=81=E7=BD=910099.=E5=B2=9B=E5=B1=BF=E7=9A=84=E6=95=B0?= =?UTF-8?q?=E9=87=8F=E5=B9=BF=E6=90=9C=200099.=E5=B2=9B=E5=B1=BF=E7=9A=84?= =?UTF-8?q?=E6=95=B0=E9=87=8F=E6=B7=B1=E6=90=9C=20JS=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...60\351\207\217\345\271\277\346\220\234.md" | 81 +++++++++++++++++++ ...60\351\207\217\346\267\261\346\220\234.md" | 75 +++++++++++++++++ 2 files changed, 156 insertions(+) diff --git "a/problems/kamacoder/0099.\345\262\233\345\261\277\347\232\204\346\225\260\351\207\217\345\271\277\346\220\234.md" "b/problems/kamacoder/0099.\345\262\233\345\261\277\347\232\204\346\225\260\351\207\217\345\271\277\346\220\234.md" index fc7f38e913..b9bdb79695 100644 --- "a/problems/kamacoder/0099.\345\262\233\345\261\277\347\232\204\346\225\260\351\207\217\345\271\277\346\220\234.md" +++ "b/problems/kamacoder/0099.\345\262\233\345\261\277\347\232\204\346\225\260\351\207\217\345\271\277\346\220\234.md" @@ -198,6 +198,87 @@ int main() { ### Javascript +```javascript +const r1 = require('readline').createInterface({ input: process.stdin }); +// 创建readline接口 +let iter = r1[Symbol.asyncIterator](); +// 创建异步迭代器 +const readline = async () => (await iter.next()).value; + +let graph +let N, M +let visited +let result = 0 +const dir = [[0, 1], [1, 0], [0, -1], [-1, 0]] + +// 读取输入,初始化地图 +const initGraph = async () => { + let line = await readline(); + [N, M] = line.split(' ').map(Number); + graph = new Array(N).fill(0).map(() => new Array(M).fill(0)) + visited = new Array(N).fill(false).map(() => new Array(M).fill(false)) + + for (let i = 0; i < N; i++) { + line = await readline() + line = line.split(' ').map(Number) + for (let j = 0; j < M; j++) { + graph[i][j] = line[j] + } + } +} + + +/** + * @description: 从(x, y)开始广度优先遍历 + * @param {*} graph 地图 + * @param {*} visited 访问过的节点 + * @param {*} x 开始搜索节点的下标 + * @param {*} y 开始搜索节点的下标 + * @return {*} + */ +const bfs = (graph, visited, x, y) => { + let queue = [] + queue.push([x, y]) + visited[x][y] = true //只要加入队列就立刻标记为访问过 + + while (queue.length) { + let [x, y] = queue.shift() + for (let i = 0; i < 4; i++) { + let nextx = x + dir[i][0] + let nexty = y + dir[i][1] + if(nextx < 0 || nextx >= N || nexty < 0 || nexty >= M) continue + if(!visited[nextx][nexty] && graph[nextx][nexty] === 1){ + queue.push([nextx, nexty]) + visited[nextx][nexty] = true + } + } + } + +} + +(async function () { + + // 读取输入,初始化地图 + await initGraph() + + // 统计岛屿数 + for (let i = 0; i < N; i++) { + for (let j = 0; j < M; j++) { + if (!visited[i][j] && graph[i][j] === 1) { + // 遇到没访问过的陆地,+1 + result++ + + // 广度优先遍历,将相邻陆地标记为已访问 + bfs(graph, visited, i, j) + } + } + } + console.log(result); +})() +``` + + + ### TypeScript ### PhP diff --git "a/problems/kamacoder/0099.\345\262\233\345\261\277\347\232\204\346\225\260\351\207\217\346\267\261\346\220\234.md" "b/problems/kamacoder/0099.\345\262\233\345\261\277\347\232\204\346\225\260\351\207\217\346\267\261\346\220\234.md" index 37f7086a2b..46f7e779a6 100644 --- "a/problems/kamacoder/0099.\345\262\233\345\261\277\347\232\204\346\225\260\351\207\217\346\267\261\346\220\234.md" +++ "b/problems/kamacoder/0099.\345\262\233\345\261\277\347\232\204\346\225\260\351\207\217\346\267\261\346\220\234.md" @@ -191,6 +191,81 @@ int main() { ### Javascript +```javascript +const r1 = require('readline').createInterface({ input: process.stdin }); +// 创建readline接口 +let iter = r1[Symbol.asyncIterator](); +// 创建异步迭代器 +const readline = async () => (await iter.next()).value; + +let graph +let N, M +let visited +let result = 0 +const dir = [[0, 1], [1, 0], [0, -1], [-1, 0]] + +// 读取输入,初始化地图 +const initGraph = async () => { + let line = await readline(); + [N, M] = line.split(' ').map(Number); + graph = new Array(N).fill(0).map(() => new Array(M).fill(0)) + visited = new Array(N).fill(false).map(() => new Array(M).fill(false)) + + for (let i = 0; i < N; i++) { + line = await readline() + line = line.split(' ').map(Number) + for (let j = 0; j < M; j++) { + graph[i][j] = line[j] + } + } +} + +/** + * @description: 从节点x,y开始深度优先遍历 + * @param {*} graph 是地图,也就是一个二维数组 + * @param {*} visited 标记访问过的节点,不要重复访问 + * @param {*} x 表示开始搜索节点的下标 + * @param {*} y 表示开始搜索节点的下标 + * @return {*} + */ +const dfs = (graph, visited, x, y) => { + for (let i = 0; i < 4; i++) { + const nextx = x + dir[i][0] + const nexty = y + dir[i][1] + if (nextx < 0 || nextx >= N || nexty < 0 || nexty >= M) continue + if (!visited[nextx][nexty] && graph[nextx][nexty] === 1) { + visited[nextx][nexty] = true + dfs(graph, visited, nextx, nexty) + } + } +} + +(async function () { + + // 读取输入,初始化地图 + await initGraph() + + // 统计岛屿数 + for (let i = 0; i < N; i++) { + for (let j = 0; j < M; j++) { + if (!visited[i][j] && graph[i][j] === 1) { + // 标记已访问 + visited[i][j] = true + + // 遇到没访问过的陆地,+1 + result++ + + // 深度优先遍历,将相邻陆地标记为已访问 + dfs(graph, visited, i, j) + } + } + } + console.log(result); +})() +``` + + + ### TypeScript ### PhP From 449099e2963f1522efed65378530596e1ad422a7 Mon Sep 17 00:00:00 2001 From: wangya <1264178545@qq.com> Date: Wed, 17 Jul 2024 14:24:30 +0800 Subject: [PATCH 2701/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20=E5=8D=A1?= =?UTF-8?q?=E7=A0=81=E7=BD=910100.=E5=B2=9B=E5=B1=BF=E7=9A=84=E6=9C=80?= =?UTF-8?q?=E5=A4=A7=E9=9D=A2=E7=A7=AF=20JS=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...00\345\244\247\351\235\242\347\247\257.md" | 90 +++++++++++++++++++ 1 file changed, 90 insertions(+) diff --git "a/problems/kamacoder/0100.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" "b/problems/kamacoder/0100.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" index 19292be7a4..43e7e968ca 100644 --- "a/problems/kamacoder/0100.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" +++ "b/problems/kamacoder/0100.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" @@ -232,6 +232,96 @@ public: ### Javascript +```javascript +// 广搜版 + +const r1 = require('readline').createInterface({ input: process.stdin }); +// 创建readline接口 +let iter = r1[Symbol.asyncIterator](); +// 创建异步迭代器 +const readline = async () => (await iter.next()).value; + +let graph // 地图 +let N, M // 地图大小 +let visited // 访问过的节点 +let result = 0 // 最大岛屿面积 +let count = 0 // 岛屿内节点数 +const dir = [[0, 1], [1, 0], [0, -1], [-1, 0]] //方向 + + +// 读取输入,初始化地图 +const initGraph = async () => { + let line = await readline(); + [N, M] = line.split(' ').map(Number); + graph = new Array(N).fill(0).map(() => new Array(M).fill(0)) + visited = new Array(N).fill(false).map(() => new Array(M).fill(false)) + + for (let i = 0; i < N; i++) { + line = await readline() + line = line.split(' ').map(Number) + for (let j = 0; j < M; j++) { + graph[i][j] = line[j] + } + } +} + + +/** + * @description: 从(x, y)开始广度优先遍历 + * @param {*} graph 地图 + * @param {*} visited 访问过的节点 + * @param {*} x 开始搜索节点的下标 + * @param {*} y 开始搜索节点的下标 + * @return {*} + */ +const bfs = (graph, visited, x, y) => { + let queue = [] + queue.push([x, y]) + count++ + visited[x][y] = true //只要加入队列就立刻标记为访问过 + + while (queue.length) { + let [xx, yy] = queue.shift() + for (let i = 0; i < 4; i++) { + let nextx = xx + dir[i][0] + let nexty = yy + dir[i][1] + if(nextx < 0 || nextx >= N || nexty < 0 || nexty >= M) continue + if(!visited[nextx][nexty] && graph[nextx][nexty] === 1){ + queue.push([nextx, nexty]) + count++ + visited[nextx][nexty] = true + } + } + } + +} + +(async function () { + + // 读取输入,初始化地图 + await initGraph() + + // 统计最大岛屿面积 + for (let i = 0; i < N; i++) { + for (let j = 0; j < M; j++) { + if (!visited[i][j] && graph[i][j] === 1) { //遇到没有访问过的陆地 + // 重新计算面积 + count = 0 + + // 广度优先遍历,统计岛屿内节点数,并将岛屿标记为已访问 + bfs(graph, visited, i, j) + + // 更新最大岛屿面积 + result = Math.max(result, count) + } + } + } + console.log(result); +})() +``` + + + ### TypeScript ### PhP From b80f731427ca6527d2f3689933585e52a24895ee Mon Sep 17 00:00:00 2001 From: Your Name Date: Wed, 17 Jul 2024 22:24:28 -0700 Subject: [PATCH 2702/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200104.=E5=BB=BA?= =?UTF-8?q?=E9=80=A0=E6=9C=80=E5=A4=A7=E5=B2=9B=E5=B1=BF=20DFS=E8=A7=A3?= =?UTF-8?q?=E6=B3=95Java=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...00\345\244\247\345\262\233\345\261\277.md" | 105 ++++++++++++++++++ 1 file changed, 105 insertions(+) diff --git "a/problems/kamacoder/0104.\345\273\272\351\200\240\346\234\200\345\244\247\345\262\233\345\261\277.md" "b/problems/kamacoder/0104.\345\273\272\351\200\240\346\234\200\345\244\247\345\262\233\345\261\277.md" index b68e44424b..7d67b7fcb1 100644 --- "a/problems/kamacoder/0104.\345\273\272\351\200\240\346\234\200\345\244\247\345\262\233\345\261\277.md" +++ "b/problems/kamacoder/0104.\345\273\272\351\200\240\346\234\200\345\244\247\345\262\233\345\261\277.md" @@ -258,6 +258,111 @@ int main() { ## 其他语言版本 ### Java +```Java +public class Main { + // 该方法采用 DFS + // 定义全局变量 + // 记录每次每个岛屿的面积 + static int count; + // 对每个岛屿进行标记 + static int mark; + // 定义二维数组表示四个方位 + static int[][] dirs = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}}; + + // DFS 进行搜索,将每个岛屿标记为不同的数字 + public static void dfs(int[][] grid, int x, int y, boolean[][] visited) { + // 当遇到边界,直接return + if (x < 0 || x >= grid.length || y < 0 || y >= grid[0].length) return; + // 遇到已经访问过的或者遇到海水,直接返回 + if (visited[x][y] || grid[x][y] == 0) return; + + visited[x][y] = true; + count++; + grid[x][y] = mark; + + // 继续向下层搜索 + dfs(grid, x, y + 1, visited); + dfs(grid, x, y - 1, visited); + dfs(grid, x + 1, y, visited); + dfs(grid, x - 1, y, visited); + } + + public static void main (String[] args) { + // 接收输入 + Scanner sc = new Scanner(System.in); + int m = sc.nextInt(); + int n = sc.nextInt(); + + int[][] grid = new int[m][n]; + for (int i = 0; i < m; i++) { + for (int j = 0; j < n; j++) { + grid[i][j] = sc.nextInt(); + } + } + + // 初始化mark变量,从2开始(区别于0水,1岛屿) + mark = 2; + + // 定义二位boolean数组记录该位置是否被访问 + boolean[][] visited = new boolean[m][n]; + + // 定义一个HashMap,记录某片岛屿的标记号和面积 + HashMap getSize = new HashMap<>(); + + // 定义一个HashSet,用来判断某一位置水四周是否存在不同标记编号的岛屿 + HashSet set = new HashSet<>(); + + // 定义一个boolean变量,看看DFS之后,是否全是岛屿 + boolean isAllIsland = true; + + // 遍历二维数组进行DFS搜索,标记每片岛屿的编号,记录对应的面积 + for (int i = 0; i < m; i++) { + for (int j = 0; j < n; j++) { + if (grid[i][j] == 0) isAllIsland = false; + if (grid[i][j] == 1) { + count = 0; + dfs(grid, i, j, visited); + getSize.put(mark, count); + mark++; + } + } + } + + int result = 0; + if (isAllIsland) result = m * n; + + // 对标记完的grid继续遍历,判断每个水位置四周是否有岛屿,并记录下四周不同相邻岛屿面积之和 + // 每次计算完一个水位置周围可能存在的岛屿面积之和,更新下result变量 + for (int i = 0; i < m; i++) { + for (int j = 0; j < n; j++) { + if (grid[i][j] == 0) { + set.clear(); + // 当前水位置变更为岛屿,所以初始化为1 + int curSize = 1; + + for (int[] dir : dirs) { + int curRow = i + dir[0]; + int curCol = j + dir[1]; + + if (curRow < 0 || curRow >= m || curCol < 0 || curCol >= n) continue; + int curMark = grid[curRow][curCol]; + // 如果当前相邻的岛屿已经遍历过或者HashMap中不存在这个编号,继续搜索 + if (set.contains(curMark) || !getSize.containsKey(curMark)) continue; + set.add(curMark); + curSize += getSize.get(curMark); + } + + result = Math.max(result, curSize); + } + } + } + + // 打印结果 + System.out.println(result); + } +} + +``` ### Python From 0ed1eb394baaa66b0f7a51542fd6acf7f3880d02 Mon Sep 17 00:00:00 2001 From: Your Name Date: Wed, 17 Jul 2024 22:31:23 -0700 Subject: [PATCH 2703/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200103.=E6=B0=B4?= =?UTF-8?q?=E6=B5=81=E9=97=AE=E9=A2=98=20DFS=E8=A7=A3=E6=B3=95Java?= =?UTF-8?q?=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...64\346\265\201\351\227\256\351\242\230.md" | 72 +++++++++++++++++++ 1 file changed, 72 insertions(+) diff --git "a/problems/kamacoder/0103.\346\260\264\346\265\201\351\227\256\351\242\230.md" "b/problems/kamacoder/0103.\346\260\264\346\265\201\351\227\256\351\242\230.md" index 259321b685..cc6e65aa68 100644 --- "a/problems/kamacoder/0103.\346\260\264\346\265\201\351\227\256\351\242\230.md" +++ "b/problems/kamacoder/0103.\346\260\264\346\265\201\351\227\256\351\242\230.md" @@ -281,6 +281,78 @@ for (int j = 0; j < m; j++) { ## 其他语言版本 ### Java +```Java +public class Main { + + // 采用 DFS 进行搜索 + public static void dfs(int[][] heights, int x, int y, boolean[][] visited, int preH) { + // 遇到边界或者访问过的点,直接返回 + if (x < 0 || x >= heights.length || y < 0 || y >= heights[0].length || visited[x][y]) return; + // 不满足水流入条件的直接返回 + if (heights[x][y] < preH) return; + // 满足条件,设置为true,表示可以从边界到达此位置 + visited[x][y] = true; + + // 向下一层继续搜索 + dfs(heights, x + 1, y, visited, heights[x][y]); + dfs(heights, x - 1, y, visited, heights[x][y]); + dfs(heights, x, y + 1, visited, heights[x][y]); + dfs(heights, x, y - 1, visited, heights[x][y]); + } + + public static void main(String[] args) { + Scanner sc = new Scanner(System.in); + int m = sc.nextInt(); + int n = sc.nextInt(); + + int[][] heights = new int[m][n]; + for (int i = 0; i < m; i++) { + for (int j = 0; j < n; j++) { + heights[i][j] = sc.nextInt(); + } + } + + // 初始化两个二位boolean数组,代表两个边界 + boolean[][] pacific = new boolean[m][n]; + boolean[][] atlantic = new boolean[m][n]; + + // 从左右边界出发进行DFS + for (int i = 0; i < m; i++) { + dfs(heights, i, 0, pacific, Integer.MIN_VALUE); + dfs(heights, i, n - 1, atlantic, Integer.MIN_VALUE); + } + + // 从上下边界出发进行DFS + for (int j = 0; j < n; j++) { + dfs(heights, 0, j, pacific, Integer.MIN_VALUE); + dfs(heights, m - 1, j, atlantic, Integer.MIN_VALUE); + } + + // 当两个边界二维数组在某个位置都为true时,符合题目要求 + List> res = new ArrayList<>(); + for (int i = 0; i < m; i++) { + for (int j = 0; j < n; j++) { + if (pacific[i][j] && atlantic[i][j]) { + res.add(Arrays.asList(i, j)); + } + } + } + + // 打印结果 + for (List list : res) { + for (int k = 0; k < list.size(); k++) { + if (k == 0) { + System.out.print(list.get(k) + " "); + } else { + System.out.print(list.get(k)); + } + } + System.out.println(); + } + } +} + +``` ### Python From ef99b46cf853a92f3104f366ac07600e7b9756b9 Mon Sep 17 00:00:00 2001 From: Your Name Date: Thu, 18 Jul 2024 02:06:43 -0700 Subject: [PATCH 2704/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200110.=E5=AD=97?= =?UTF-8?q?=E7=AC=A6=E4=B8=B2=E6=8E=A5=E9=BE=99=20BFS=E8=A7=A3=E6=B3=95Jav?= =?UTF-8?q?a=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...46\344\270\262\346\216\245\351\276\231.md" | 62 +++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git "a/problems/kamacoder/0110.\345\255\227\347\254\246\344\270\262\346\216\245\351\276\231.md" "b/problems/kamacoder/0110.\345\255\227\347\254\246\344\270\262\346\216\245\351\276\231.md" index 5a60dbb7df..feeec6ddcc 100644 --- "a/problems/kamacoder/0110.\345\255\227\347\254\246\344\270\262\346\216\245\351\276\231.md" +++ "b/problems/kamacoder/0110.\345\255\227\347\254\246\344\270\262\346\216\245\351\276\231.md" @@ -153,6 +153,68 @@ int main() { ## 其他语言版本 ### Java +```Java +public class Main { + // BFS方法 + public static int ladderLength(String beginWord, String endWord, List wordList) { + // 使用set作为查询容器,效率更高 + HashSet set = new HashSet<>(wordList); + + // 声明一个queue存储每次变更一个字符得到的且存在于容器中的新字符串 + Queue queue = new LinkedList<>(); + + // 声明一个hashMap存储遍历到的字符串以及所走过的路径path + HashMap visitMap = new HashMap<>(); + queue.offer(beginWord); + visitMap.put(beginWord, 1); + + while (!queue.isEmpty()) { + String curWord = queue.poll(); + int path = visitMap.get(curWord); + + for (int i = 0; i < curWord.length(); i++) { + char[] ch = curWord.toCharArray(); + // 每个位置尝试26个字母 + for (char k = 'a'; k <= 'z'; k++) { + ch[i] = k; + + String newWord = new String(ch); + if (newWord.equals(endWord)) return path + 1; + + // 如果这个新字符串存在于容器且之前未被访问到 + if (set.contains(newWord) && !visitMap.containsKey(newWord)) { + visitMap.put(newWord, path + 1); + queue.offer(newWord); + } + } + } + } + + return 0; + } + + public static void main (String[] args) { + /* code */ + // 接收输入 + Scanner sc = new Scanner(System.in); + int N = sc.nextInt(); + sc.nextLine(); + String[] strs = sc.nextLine().split(" "); + + List wordList = new ArrayList<>(); + for (int i = 0; i < N; i++) { + wordList.add(sc.nextLine()); + } + + // wordList.add(strs[1]); + + // 打印结果 + int result = ladderLength(strs[0], strs[1], wordList); + System.out.println(result); + } +} + +``` ### Python From 612ff79f4f2e1efe60511f52d27d510e9eb417fe Mon Sep 17 00:00:00 2001 From: kimoge <1579457263@qq.com> Date: Fri, 19 Jul 2024 10:41:04 +0800 Subject: [PATCH 2705/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=8D=A1=E7=A0=819?= =?UTF-8?q?9=5F=E5=A2=9E=E5=8A=A0Python3=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...60\351\207\217\345\271\277\346\220\234.md" | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git "a/problems/kamacoder/0099.\345\262\233\345\261\277\347\232\204\346\225\260\351\207\217\345\271\277\346\220\234.md" "b/problems/kamacoder/0099.\345\262\233\345\261\277\347\232\204\346\225\260\351\207\217\345\271\277\346\220\234.md" index b9bdb79695..def79bf771 100644 --- "a/problems/kamacoder/0099.\345\262\233\345\261\277\347\232\204\346\225\260\351\207\217\345\271\277\346\220\234.md" +++ "b/problems/kamacoder/0099.\345\262\233\345\261\277\347\232\204\346\225\260\351\207\217\345\271\277\346\220\234.md" @@ -192,6 +192,56 @@ int main() { ### Python +```python +from collections import deque + +# 四个方向 +position = [[0, 1], [1, 0], [0, -1], [-1, 0]] + + +def bfs(grid, visited, x, y): + """ + 广度优先搜索对陆地进行标记 + """ + + que = deque() # 创建队列 + + # 标记当前节点并加入队列 + visited[x][y] = True + que.append([x, y]) + + while que: + cur_x, cur_y = que.popleft() # 取出队首节点 + for i, j in position: + next_x = cur_x + i + next_y = cur_y + j + # 下一节点下标越界,跳过 + if next_x < 0 or next_x >= len(grid) or next_y < 0 or next_y >= len(grid[0]): + continue + # 下一节点是陆地且未被访问,标记节点并加入队列 + if grid[next_x][next_y] == 1 and not visited[next_x][next_y]: + visited[next_x][next_y] = True + que.append([next_x, next_y]) + + +n, m = map(int, input().split()) +# 邻接矩阵 +grid = [] +for i in range(n): + grid.append(list(map(int, input().split()))) + +visited = [[False] * m for _ in range(n)] # 访问表 + +res = 0 +for i in range(n): + for j in range(m): + if grid[i][j] == 1 and not visited[i][j]: + res += 1 + bfs(grid, visited, i, j) + +print(res) +``` + ### Go ### Rust From cc7a9433e05d450b8f8bc732a8b15a27359bdd78 Mon Sep 17 00:00:00 2001 From: kimoge <1579457263@qq.com> Date: Fri, 19 Jul 2024 10:42:00 +0800 Subject: [PATCH 2706/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=8D=A1=E7=A0=811?= =?UTF-8?q?00=5F=E5=A2=9E=E5=8A=A0Python3=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...00\345\244\247\351\235\242\347\247\257.md" | 94 +++++++++++++++++++ 1 file changed, 94 insertions(+) diff --git "a/problems/kamacoder/0100.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" "b/problems/kamacoder/0100.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" index 43e7e968ca..024e509fcc 100644 --- "a/problems/kamacoder/0100.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" +++ "b/problems/kamacoder/0100.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" @@ -226,6 +226,100 @@ public: ### Python +DFS + +```python +# 四个方向 +position = [[0, 1], [1, 0], [0, -1], [-1, 0]] +count = 0 + + +def dfs(grid, visited, x, y): + """ + 深度优先搜索,对一整块陆地进行标记 + """ + global count # 定义全局变量,便于传递count值 + for i, j in position: + cur_x = x + i + cur_y = y + j + # 下标越界,跳过 + if cur_x < 0 or cur_x >= len(grid) or cur_y < 0 or cur_y >= len(grid[0]): + continue + if not visited[cur_x][cur_y] and grid[cur_x][cur_y] == 1: + visited[cur_x][cur_y] = True + count += 1 + dfs(grid, visited, cur_x, cur_y) + + +n, m = map(int, input().split()) +# 邻接矩阵 +grid = [] +for i in range(n): + grid.append(list(map(int, input().split()))) +# 访问表 +visited = [[False] * m for _ in range(n)] + +result = 0 # 记录最终结果 +for i in range(n): + for j in range(m): + if grid[i][j] == 1 and not visited[i][j]: + count = 1 + visited[i][j] = True + dfs(grid, visited, i, j) + result = max(count, result) + +print(result) +``` + +BFS + +```python +from collections import deque + +position = [[0, 1], [1, 0], [0, -1], [-1, 0]] # 四个方向 +count = 0 + + +def bfs(grid, visited, x, y): + """ + 广度优先搜索对陆地进行标记 + """ + global count # 声明全局变量 + que = deque() + que.append([x, y]) + while que: + cur_x, cur_y = que.popleft() + for i, j in position: + next_x = cur_x + i + next_y = cur_y + j + # 下标越界,跳过 + if next_x < 0 or next_x >= len(grid) or next_y < 0 or next_y >= len(grid[0]): + continue + if grid[next_x][next_y] == 1 and not visited[next_x][next_y]: + visited[next_x][next_y] = True + count += 1 + que.append([next_x, next_y]) + + +n, m = map(int, input().split()) +# 邻接矩阵 +grid = [] +for i in range(n): + grid.append(list(map(int, input().split()))) +visited = [[False] * m for _ in range(n)] # 访问表 + +result = 0 # 记录最终结果 +for i in range(n): + for j in range(m): + if grid[i][j] == 1 and not visited[i][j]: + count = 1 + visited[i][j] = True + bfs(grid, visited, i, j) + res = max(result, count) + +print(result) +``` + ### Go ### Rust From 530f512211b155cc1643f3c0bdf2d05ee4bd1c0c Mon Sep 17 00:00:00 2001 From: wangya <1264178545@qq.com> Date: Fri, 19 Jul 2024 14:18:14 +0800 Subject: [PATCH 2707/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20=E5=8D=A1?= =?UTF-8?q?=E7=A0=81=E7=BD=910101.=E5=AD=A4=E5=B2=9B=E7=9A=84=E6=80=BB?= =?UTF-8?q?=E9=9D=A2=E7=A7=AF=20JS=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...04\346\200\273\351\235\242\347\247\257.md" | 167 ++++++++++++++++++ 1 file changed, 167 insertions(+) diff --git "a/problems/kamacoder/0101.\345\255\244\345\262\233\347\232\204\346\200\273\351\235\242\347\247\257.md" "b/problems/kamacoder/0101.\345\255\244\345\262\233\347\232\204\346\200\273\351\235\242\347\247\257.md" index 25de67ecd2..a1793337f6 100644 --- "a/problems/kamacoder/0101.\345\255\244\345\262\233\347\232\204\346\200\273\351\235\242\347\247\257.md" +++ "b/problems/kamacoder/0101.\345\255\244\345\262\233\347\232\204\346\200\273\351\235\242\347\247\257.md" @@ -242,6 +242,173 @@ print(count) ### Javascript +#### 深搜版 + +```javascript +const r1 = require('readline').createInterface({ input: process.stdin }); +// 创建readline接口 +let iter = r1[Symbol.asyncIterator](); +// 创建异步迭代器 +const readline = async () => (await iter.next()).value; + +let graph // 地图 +let N, M // 地图大小 +let count = 0 // 孤岛的总面积 +const dir = [[0, 1], [1, 0], [0, -1], [-1, 0]] //方向 + + +// 读取输入,初始化地图 +const initGraph = async () => { + let line = await readline(); + [N, M] = line.split(' ').map(Number); + graph = new Array(N).fill(0).map(() => new Array(M).fill(0)) + + for (let i = 0; i < N; i++) { + line = await readline() + line = line.split(' ').map(Number) + for (let j = 0; j < M; j++) { + graph[i][j] = line[j] + } + } +} + + +/** + * @description: 从(x,y)开始深度优先遍历地图 + * @param {*} graph 地图 + * @param {*} x 开始搜索节点的下标 + * @param {*} y 开始搜索节点的下标 + * @return {*} + */ +const dfs = (graph, x, y) => { + if(graph[x][y] === 0) return + graph[x][y] = 0 // 标记为海洋 + for (let i = 0; i < 4; i++) { + let nextx = x + dir[i][0] + let nexty = y + dir[i][1] + if (nextx < 0 || nextx >= N || nexty < 0 || nexty >= M) continue + dfs(graph, nextx, nexty) + } +} + +(async function () { + + // 读取输入,初始化地图 + await initGraph() + + // 遍历地图左右两边 + for (let i = 0; i < N; i++) { + if (graph[i][0] === 1) dfs(graph, i, 0) + if (graph[i][M - 1] === 1) dfs(graph, i, M - 1) + } + + // 遍历地图上下两边 + for (let j = 0; j < M; j++) { + if (graph[0][j] === 1) dfs(graph, 0, j) + if (graph[N - 1][j] === 1) dfs(graph, N - 1, j) + } + + count = 0 + // 统计孤岛的总面积 + for (let i = 0; i < N; i++) { + for (let j = 0; j < M; j++) { + if (graph[i][j] === 1) count++ + } + } + console.log(count); +})() +``` + + + +#### 广搜版 + +```javascript +const r1 = require('readline').createInterface({ input: process.stdin }); +// 创建readline接口 +let iter = r1[Symbol.asyncIterator](); +// 创建异步迭代器 +const readline = async () => (await iter.next()).value; + +let graph // 地图 +let N, M // 地图大小 +let count = 0 // 孤岛的总面积 +const dir = [[0, 1], [1, 0], [0, -1], [-1, 0]] //方向 + + +// 读取输入,初始化地图 +const initGraph = async () => { + let line = await readline(); + [N, M] = line.split(' ').map(Number); + graph = new Array(N).fill(0).map(() => new Array(M).fill(0)) + + for (let i = 0; i < N; i++) { + line = await readline() + line = line.split(' ').map(Number) + for (let j = 0; j < M; j++) { + graph[i][j] = line[j] + } + } +} + + +/** + * @description: 从(x,y)开始广度优先遍历地图 + * @param {*} graph 地图 + * @param {*} x 开始搜索节点的下标 + * @param {*} y 开始搜索节点的下标 + * @return {*} + */ +const bfs = (graph, x, y) => { + let queue = [] + queue.push([x, y]) + graph[x][y] = 0 // 只要加入队列,立刻标记 + + while (queue.length) { + let [xx, yy] = queue.shift() + for (let i = 0; i < 4; i++) { + let nextx = xx + dir[i][0] + let nexty = yy + dir[i][1] + if (nextx < 0 || nextx >= N || nexty < 0 || nexty >= M) continue + if (graph[nextx][nexty] === 1) { + queue.push([nextx, nexty]) + graph[nextx][nexty] = 0 // 只要加入队列,立刻标记 + } + } + } + +} + +(async function () { + + // 读取输入,初始化地图 + await initGraph() + + // 遍历地图左右两边 + for (let i = 0; i < N; i++) { + if (graph[i][0] === 1) bfs(graph, i, 0) + if (graph[i][M - 1] === 1) bfs(graph, i, M - 1) + } + + // 遍历地图上下两边 + for (let j = 0; j < M; j++) { + if (graph[0][j] === 1) bfs(graph, 0, j) + if (graph[N - 1][j] === 1) bfs(graph, N - 1, j) + } + + count = 0 + // 统计孤岛的总面积 + for (let i = 0; i < N; i++) { + for (let j = 0; j < M; j++) { + if (graph[i][j] === 1) count++ + } + } + console.log(count); +})() +``` + + + ### TypeScript ### PhP From 3dce79d5873c71ddeadf2e9304a20272ff11987d Mon Sep 17 00:00:00 2001 From: wangya <1264178545@qq.com> Date: Fri, 19 Jul 2024 14:22:29 +0800 Subject: [PATCH 2708/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20=E5=8D=A1?= =?UTF-8?q?=E7=A0=81=E7=BD=910102.=E6=B2=89=E6=B2=A1=E5=AD=A4=E5=B2=9B=20J?= =?UTF-8?q?S=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...11\346\262\241\345\255\244\345\262\233.md" | 165 ++++++++++++++++++ 1 file changed, 165 insertions(+) diff --git "a/problems/kamacoder/0102.\346\262\211\346\262\241\345\255\244\345\262\233.md" "b/problems/kamacoder/0102.\346\262\211\346\262\241\345\255\244\345\262\233.md" index 5491a8e3d8..2b16da0472 100644 --- "a/problems/kamacoder/0102.\346\262\211\346\262\241\345\255\244\345\262\233.md" +++ "b/problems/kamacoder/0102.\346\262\211\346\262\241\345\255\244\345\262\233.md" @@ -146,6 +146,171 @@ int main() { ### Javascript +#### 深搜版 + +```javascript +const r1 = require('readline').createInterface({ input: process.stdin }); +// 创建readline接口 +let iter = r1[Symbol.asyncIterator](); +// 创建异步迭代器 +const readline = async () => (await iter.next()).value; + +let graph // 地图 +let N, M // 地图大小 +const dir = [[0, 1], [1, 0], [0, -1], [-1, 0]] //方向 + + +// 读取输入,初始化地图 +const initGraph = async () => { + let line = await readline(); + [N, M] = line.split(' ').map(Number); + graph = new Array(N).fill(0).map(() => new Array(M).fill(0)) + + for (let i = 0; i < N; i++) { + line = await readline() + line = line.split(' ').map(Number) + for (let j = 0; j < M; j++) { + graph[i][j] = line[j] + } + } +} + + +/** + * @description: 从(x,y)开始深度优先遍历地图 + * @param {*} graph 地图 + * @param {*} x 开始搜索节点的下标 + * @param {*} y 开始搜索节点的下标 + * @return {*} + */ +const dfs = (graph, x, y) => { + if (graph[x][y] !== 1) return + graph[x][y] = 2 // 标记为非孤岛陆地 + + for (let i = 0; i < 4; i++) { + let nextx = x + dir[i][0] + let nexty = y + dir[i][1] + if (nextx < 0 || nextx >= N || nexty < 0 || nexty >= M) continue + dfs(graph, nextx, nexty) + } +} + +(async function () { + + // 读取输入,初始化地图 + await initGraph() + + // 遍历地图左右两边 + for (let i = 0; i < N; i++) { + if (graph[i][0] === 1) dfs(graph, i, 0) + if (graph[i][M - 1] === 1) dfs(graph, i, M - 1) + } + + // 遍历地图上下两边 + for (let j = 0; j < M; j++) { + if (graph[0][j] === 1) dfs(graph, 0, j) + if (graph[N - 1][j] === 1) dfs(graph, N - 1, j) + } + + + // 遍历地图,将孤岛沉没,即将陆地1标记为0;将非孤岛陆地2标记为1 + for (let i = 0; i < N; i++) { + for (let j = 0; j < M; j++) { + if (graph[i][j] === 1) graph[i][j] = 0 + else if (graph[i][j] === 2) graph[i][j] = 1 + } + console.log(graph[i].join(' ')); + } +})() +``` + + + +#### 广搜版 + +```javascript +const r1 = require('readline').createInterface({ input: process.stdin }); +// 创建readline接口 +let iter = r1[Symbol.asyncIterator](); +// 创建异步迭代器 +const readline = async () => (await iter.next()).value; + +let graph // 地图 +let N, M // 地图大小 +const dir = [[0, 1], [1, 0], [0, -1], [-1, 0]] //方向 + + +// 读取输入,初始化地图 +const initGraph = async () => { + let line = await readline(); + [N, M] = line.split(' ').map(Number); + graph = new Array(N).fill(0).map(() => new Array(M).fill(0)) + + for (let i = 0; i < N; i++) { + line = await readline() + line = line.split(' ').map(Number) + for (let j = 0; j < M; j++) { + graph[i][j] = line[j] + } + } +} + + +/** + * @description: 从(x,y)开始广度优先遍历地图 + * @param {*} graph 地图 + * @param {*} x 开始搜索节点的下标 + * @param {*} y 开始搜索节点的下标 + * @return {*} + */ +const bfs = (graph, x, y) => { + let queue = [] + queue.push([x, y]) + graph[x][y] = 2 // 标记为非孤岛陆地 + + while (queue.length) { + let [xx, yy] = queue.shift() + + for (let i = 0; i < 4; i++) { + let nextx = xx + dir[i][0] + let nexty = yy + dir[i][1] + if (nextx < 0 || nextx >= N || nexty < 0 || nexty >= M) continue + if (graph[nextx][nexty] === 1) bfs(graph, nextx, nexty) + } + } +} + +(async function () { + + // 读取输入,初始化地图 + await initGraph() + + // 遍历地图左右两边 + for (let i = 0; i < N; i++) { + if (graph[i][0] === 1) bfs(graph, i, 0) + if (graph[i][M - 1] === 1) bfs(graph, i, M - 1) + } + + // 遍历地图上下两边 + for (let j = 0; j < M; j++) { + if (graph[0][j] === 1) bfs(graph, 0, j) + if (graph[N - 1][j] === 1) bfs(graph, N - 1, j) + } + + + // 遍历地图,将孤岛沉没,即将陆地1标记为0;将非孤岛陆地2标记为1 + for (let i = 0; i < N; i++) { + for (let j = 0; j < M; j++) { + if (graph[i][j] === 1) graph[i][j] = 0 + else if (graph[i][j] === 2) graph[i][j] = 1 + } + console.log(graph[i].join(' ')); + } +})() +``` + + + ### TypeScript ### PhP From 8d29bef3f7b5ce7064a0d0ca041f99914cb2ccf2 Mon Sep 17 00:00:00 2001 From: Charlie Yang <104724079+sxdtywm@users.noreply.github.com> Date: Sun, 21 Jul 2024 22:01:29 +0800 Subject: [PATCH 2709/3019] feat:add algorithm of go python js java etc. feat:add algorithm of go python js java etc. --- ...60\351\207\217\345\271\277\346\220\234.md" | 204 ++++++++++++++++++ 1 file changed, 204 insertions(+) diff --git "a/problems/kamacoder/0099.\345\262\233\345\261\277\347\232\204\346\225\260\351\207\217\345\271\277\346\220\234.md" "b/problems/kamacoder/0099.\345\262\233\345\261\277\347\232\204\346\225\260\351\207\217\345\271\277\346\220\234.md" index b9bdb79695..3c069b4412 100644 --- "a/problems/kamacoder/0099.\345\262\233\345\261\277\347\232\204\346\225\260\351\207\217\345\271\277\346\220\234.md" +++ "b/problems/kamacoder/0099.\345\262\233\345\261\277\347\232\204\346\225\260\351\207\217\345\271\277\346\220\234.md" @@ -190,10 +190,164 @@ int main() { ### Java +```java + +import java.util.Scanner; + +public class Main { + static int[][] dir = { {0, 1}, {1, 0}, {-1, 0}, {0, -1} }; // 四个方向 + + public static void dfs(int[][] grid, boolean[][] visited, int x, int y) { + for (int i = 0; i < 4; i++) { + int nextx = x + dir[i][0]; + int nexty = y + dir[i][1]; + if (nextx < 0 || nextx >= grid.length || nexty < 0 || nexty >= grid[0].length) continue; // 越界了,直接跳过 + if (!visited[nextx][nexty] && grid[nextx][nexty] == 1) { // 没有访问过的 同时 是陆地的 + visited[nextx][nexty] = true; + dfs(grid, visited, nextx, nexty); + } + } + } + + public static void main(String[] args) { + Scanner scanner = new Scanner(System.in); + int n = scanner.nextInt(); + int m = scanner.nextInt(); + int[][] grid = new int[n][m]; + for (int i = 0; i < n; i++) { + for (int j = 0; j < m; j++) { + grid[i][j] = scanner.nextInt(); + } + } + + boolean[][] visited = new boolean[n][m]; + + int result = 0; + for (int i = 0; i < n; i++) { + for (int j = 0; j < m; j++) { + if (!visited[i][j] && grid[i][j] == 1) { + visited[i][j] = true; + result++; // 遇到没访问过的陆地,+1 + dfs(grid, visited, i, j); // 将与其链接的陆地都标记上 true + } + } + } + + System.out.println(result); + } +} + + + +``` + + ### Python +```python + +def dfs(grid, visited, x, y): + dir = [(0, 1), (1, 0), (-1, 0), (0, -1)] # 四个方向 + for d in dir: + nextx, nexty = x + d[0], y + d[1] + if 0 <= nextx < len(grid) and 0 <= nexty < len(grid[0]): + if not visited[nextx][nexty] and grid[nextx][nexty] == 1: # 没有访问过的 同时 是陆地的 + visited[nextx][nexty] = True + dfs(grid, visited, nextx, nexty) + +def main(): + n, m = map(int, input().split()) + grid = [list(map(int, input().split())) for _ in range(n)] + visited = [[False] * m for _ in range(n)] + + result = 0 + for i in range(n): + for j in range(m): + if not visited[i][j] and grid[i][j] == 1: + visited[i][j] = True + result += 1 # 遇到没访问过的陆地,+1 + dfs(grid, visited, i, j) # 将与其链接的陆地都标记上 True + + print(result) + +if __name__ == "__main__": + main() + + + +``` + + ### Go +```go + +package main + +import ( + "bufio" + "fmt" + "os" + "strconv" + "strings" +) + +var dir = [4][2]int{{0, 1}, {1, 0}, {-1, 0}, {0, -1}} // 四个方向 + +func dfs(grid [][]int, visited [][]bool, x, y int) { + for i := 0; i < 4; i++ { + nextx := x + dir[i][0] + nexty := y + dir[i][1] + if nextx < 0 || nextx >= len(grid) || nexty < 0 || nexty >= len(grid[0]) { + continue // 越界了,直接跳过 + } + if !visited[nextx][nexty] && grid[nextx][nexty] == 1 { // 没有访问过的 同时 是陆地的 + visited[nextx][nexty] = true + dfs(grid, visited, nextx, nexty) + } + } +} + +func main() { + reader := bufio.NewReader(os.Stdin) + var n, m int + fmt.Scanf("%d %d", &n, &m) + + grid := make([][]int, n) + for i := 0; i < n; i++ { + grid[i] = make([]int, m) + line, _ := reader.ReadString('\n') + line = strings.TrimSpace(line) + elements := strings.Split(line, " ") + for j := 0; j < m; j++ { + grid[i][j], _ = strconv.Atoi(elements[j]) + } + } + + visited := make([][]bool, n) + for i := 0; i < n; i++ { + visited[i] = make([]bool, m) + } + + result := 0 + for i := 0; i < n; i++ { + for j := 0; j < m; j++ { + if !visited[i][j] && grid[i][j] == 1 { + visited[i][j] = true + result++ // 遇到没访问过的陆地,+1 + dfs(grid, visited, i, j) // 将与其链接的陆地都标记上 true + } + } + } + + fmt.Println(result) +} + + +``` + + + ### Rust ### Javascript @@ -283,12 +437,62 @@ const bfs = (graph, visited, x, y) => { ### PhP +```PHP + += count($grid) || $nexty < 0 || $nexty >= count($grid[0])) { + continue; // 越界了,直接跳过 + } + if (!$visited[$nextx][$nexty] && $grid[$nextx][$nexty] == 1) { // 没有访问过的 同时 是陆地的 + $visited[$nextx][$nexty] = true; + dfs($grid, $visited, $nextx, $nexty); + } + } +} + +function main() { + fscanf(STDIN, "%d %d", $n, $m); + $grid = []; + for ($i = 0; $i < $n; $i++) { + $grid[$i] = array_map('intval', explode(' ', trim(fgets(STDIN)))); + } + + $visited = array_fill(0, $n, array_fill(0, $m, false)); + + $result = 0; + for ($i = 0; $i < $n; $i++) { + for ($j = 0; $j < $m; $j++) { + if (!$visited[$i][$j] && $grid[$i][$j] == 1) { + $visited[$i][$j] = true; + $result++; // 遇到没访问过的陆地,+1 + dfs($grid, $visited, $i, $j); // 将与其链接的陆地都标记上 true + } + } + } + + echo $result . PHP_EOL; +} + +main(); +?> + + +``` + + ### Swift ### Scala ### C# + ### Dart ### C From 9eb819e3be9d75b2311837911594ee646e17954d Mon Sep 17 00:00:00 2001 From: Allen Guo Date: Sun, 21 Jul 2024 15:34:30 -0700 Subject: [PATCH 2710/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200106.=E5=B2=9B?= =?UTF-8?q?=E5=B1=BF=E7=9A=84=E5=91=A8=E9=95=BF=20Java=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...77\347\232\204\345\221\250\351\225\277.md" | 57 ++++++++++++++++++- 1 file changed, 56 insertions(+), 1 deletion(-) diff --git "a/problems/kamacoder/0106.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" "b/problems/kamacoder/0106.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" index 48400a95f6..6f3462c52d 100644 --- "a/problems/kamacoder/0106.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" +++ "b/problems/kamacoder/0106.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" @@ -157,7 +157,62 @@ int main() { ## 其他语言版本 -### Java +### Java +```Java +import java.util.*; + +public class Main { + // 每次遍历到1,探索其周围4个方向,并记录周长,最终合计 + // 声明全局变量,dirs表示4个方向 + static int[][] dirs = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}}; + // 统计每单个1的周长 + static int count; + + // 探索其周围4个方向,并记录周长 + public static void helper(int[][] grid, int x, int y) { + for (int[] dir : dirs) { + int nx = x + dir[0]; + int ny = y + dir[1]; + + // 遇到边界或者水,周长加一 + if (nx < 0 || nx >= grid.length || ny < 0 || ny >= grid[0].length + || grid[nx][ny] == 0) { + count++; + } + } + } + + public static void main(String[] args) { + Scanner sc = new Scanner(System.in); + + // 接收输入 + int M = sc.nextInt(); + int N = sc.nextInt(); + + int[][] grid = new int[M][N]; + for (int i = 0; i < M; i++) { + for (int j = 0; j < N; j++) { + grid[i][j] = sc.nextInt(); + } + } + + int result = 0; // 总周长 + for (int i = 0; i < M; i++) { + for (int j = 0; j < N; j++) { + if (grid[i][j] == 1) { + count = 0; + helper(grid, i, j); + // 更新总周长 + result += count; + } + } + } + + // 打印结果 + System.out.println(result); + } +} +``` ### Python From c7efbc1949688b59d20e626e138507aebca6e482 Mon Sep 17 00:00:00 2001 From: muzi-xiaoren <106290465+muzi-xiaoren@users.noreply.github.com> Date: Mon, 22 Jul 2024 18:21:29 +0800 Subject: [PATCH 2711/3019] =?UTF-8?q?Update=200349.=E4=B8=A4=E4=B8=AA?= =?UTF-8?q?=E6=95=B0=E7=BB=84=E7=9A=84=E4=BA=A4=E9=9B=86.md--Ruby=E6=A0=BC?= =?UTF-8?q?=E5=BC=8F=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" "b/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" index e17e940f5f..77dfc50a61 100644 --- "a/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" +++ "b/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" @@ -511,7 +511,7 @@ object Solution { ``` -###Ruby +### Ruby: ```ruby def intersection(nums1, nums2) hash = {} From 1c2ac1587f86433b29ffb9618a35ebf9bd9eece3 Mon Sep 17 00:00:00 2001 From: robotsouper Date: Mon, 22 Jul 2024 08:51:23 -0400 Subject: [PATCH 2712/3019] =?UTF-8?q?Leetcode=20131(Java):=20=E7=9B=B8?= =?UTF-8?q?=E5=90=8C=E7=9A=84=E6=80=9D=E8=B7=AF=E4=BD=86=E4=B8=AA=E4=BA=BA?= =?UTF-8?q?=E8=AE=A4=E4=B8=BA=E6=9B=B4=E5=A5=BD=E7=90=86=E8=A7=A3=E7=9A=84?= =?UTF-8?q?=E5=86=99=E6=B3=95=EF=BC=8C=E9=81=B5=E5=BE=AA=E5=89=8D=E4=B8=A4?= =?UTF-8?q?=E9=A2=98=EF=BC=88combination=20sum=EF=BC=89=E7=9A=84=E6=A0=BC?= =?UTF-8?q?=E5=BC=8F=E4=BB=8E=E8=80=8C=E6=9B=B4=E5=8A=A0=E6=98=93=E6=87=82?= =?UTF-8?q?=EF=BC=8C=E5=AF=B9=E4=BA=8Ecur=E7=9A=84=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=E6=94=BE=E5=BC=83deque=EF=BC=8C=E4=BF=9D=E6=8C=81=E4=BC=A0?= =?UTF-8?q?=E7=BB=9F=E4=BB=8D=E7=84=B6=E4=BD=BF=E7=94=A8arraylist?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...62\345\233\236\346\226\207\344\270\262.md" | 48 +++++++++---------- 1 file changed, 22 insertions(+), 26 deletions(-) diff --git "a/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" "b/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" index 822d4399f1..4a8686518b 100644 --- "a/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" +++ "b/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" @@ -310,39 +310,35 @@ public: ### Java ```Java class Solution { - List> lists = new ArrayList<>(); - Deque deque = new LinkedList<>(); - + //保持前几题一贯的格式, initialization + List> res = new ArrayList<>(); + List cur = new ArrayList<>(); public List> partition(String s) { - backTracking(s, 0); - return lists; + backtracking(s, 0, new StringBuilder()); + return res; } - - private void backTracking(String s, int startIndex) { - //如果起始位置大于s的大小,说明找到了一组分割方案 - if (startIndex >= s.length()) { - lists.add(new ArrayList(deque)); + private void backtracking(String s, int start, StringBuilder sb){ + //因为是起始位置一个一个加的,所以结束时start一定等于s.length,因为进入backtracking时一定末尾也是回文,所以cur是满足条件的 + if (start == s.length()){ + //注意创建一个新的copy + res.add(new ArrayList<>(cur)); return; } - for (int i = startIndex; i < s.length(); i++) { - //如果是回文子串,则记录 - if (isPalindrome(s, startIndex, i)) { - String str = s.substring(startIndex, i + 1); - deque.addLast(str); - } else { - continue; + //像前两题一样从前往后搜索,如果发现回文,进入backtracking,起始位置后移一位,循环结束照例移除cur的末位 + for (int i = start; i < s.length(); i++){ + sb.append(s.charAt(i)); + if (check(sb)){ + cur.add(sb.toString()); + backtracking(s, i + 1, new StringBuilder()); + cur.remove(cur.size() -1 ); } - //起始位置后移,保证不重复 - backTracking(s, i + 1); - deque.removeLast(); } } - //判断是否是回文串 - private boolean isPalindrome(String s, int startIndex, int end) { - for (int i = startIndex, j = end; i < j; i++, j--) { - if (s.charAt(i) != s.charAt(j)) { - return false; - } + + //helper method, 检查是否是回文 + private boolean check(StringBuilder sb){ + for (int i = 0; i < sb.length()/ 2; i++){ + if (sb.charAt(i) != sb.charAt(sb.length() - 1 - i)){return false;} } return true; } From 22a6522a37ed279ac9749ca394f7c9c1835c1c57 Mon Sep 17 00:00:00 2001 From: Relsola Date: Wed, 24 Jul 2024 00:05:41 +0800 Subject: [PATCH 2713/3019] =?UTF-8?q?Update=20707.=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E9=93=BE=E8=A1=A8=20=20=E4=BC=98=E5=8C=96=20C=20=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E7=BB=93=E6=9E=84=E5=92=8C=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...76\350\256\241\351\223\276\350\241\250.md" | 135 +++++++++--------- 1 file changed, 65 insertions(+), 70 deletions(-) diff --git "a/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" "b/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" index 743c1d7fa6..141156cf3e 100644 --- "a/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" +++ "b/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" @@ -168,109 +168,103 @@ private: ### C: ```C -typedef struct MyLinkedList { - int val; - struct MyLinkedList* next; -}MyLinkedList; +typedef struct Node { + int val; + struct Node* next; +} Node; + + +typedef struct { + int size; + Node* data; +} MyLinkedList; /** Initialize your data structure here. */ MyLinkedList* myLinkedListCreate() { - //这个题必须用虚拟头指针,参数都是一级指针,头节点确定后没法改指向了!!! - MyLinkedList* head = (MyLinkedList *)malloc(sizeof (MyLinkedList)); - head->next = NULL; - return head; + MyLinkedList* obj = (MyLinkedList*)malloc(sizeof(MyLinkedList)); + Node* head = (Node*)malloc(sizeof(Node)); + head->next = (void*)0; + obj->data = head; + obj->size = 0; + return obj; } /** Get the value of the index-th node in the linked list. If the index is invalid, return -1. */ int myLinkedListGet(MyLinkedList* obj, int index) { - MyLinkedList *cur = obj->next; - for (int i = 0; cur != NULL; i++){ - if (i == index){ - return cur->val; - } - else{ - cur = cur->next; - } + if (index < 0 || index >= obj->size) return -1; + + Node* cur = obj->data; + while (index-- >= 0) { + cur = cur->next; } - return -1; + + return cur->val; } /** Add a node of value val before the first element of the linked list. After the insertion, the new node will be the first node of the linked list. */ void myLinkedListAddAtHead(MyLinkedList* obj, int val) { - MyLinkedList *nhead = (MyLinkedList *)malloc(sizeof (MyLinkedList)); - nhead->val = val; - nhead->next = obj->next; - obj->next = nhead; + Node* node = (Node*)malloc(sizeof(Node)); + node->val = val; + node->next = obj->data->next; + obj->data->next = node; + obj->size++; } /** Append a node of value val to the last element of the linked list. */ void myLinkedListAddAtTail(MyLinkedList* obj, int val) { - MyLinkedList *cur = obj; - while(cur->next != NULL){ + Node* cur = obj->data; + while (cur->next != ((void*)0)) { cur = cur->next; } - MyLinkedList *ntail = (MyLinkedList *)malloc(sizeof (MyLinkedList)); - ntail->val = val; - ntail->next = NULL; - cur->next = ntail; + + Node* tail = (Node*)malloc(sizeof(Node)); + tail->val = val; + tail->next = (void*)0; + cur->next = tail; + obj->size++; } /** Add a node of value val before the index-th node in the linked list. If index equals to the length of linked list, the node will be appended to the end of linked list. If index is greater than the length, the node will not be inserted. */ void myLinkedListAddAtIndex(MyLinkedList* obj, int index, int val) { - if (index == 0){ - myLinkedListAddAtHead(obj, val); - return; - } - MyLinkedList *cur = obj->next; - for (int i = 1 ;cur != NULL; i++){ - if (i == index){ - MyLinkedList* newnode = (MyLinkedList *)malloc(sizeof (MyLinkedList)); - newnode->val = val; - newnode->next = cur->next; - cur->next = newnode; - return; - } - else{ - cur = cur->next; - } + if (index > obj->size) return; + + Node* cur = obj->data; + while (index-- > 0) { + cur = cur->next; } + + Node* node = (Node*)malloc(sizeof(Node)); + node->val = val; + node->next = cur->next; + cur->next = node; + obj->size++; } /** Delete the index-th node in the linked list, if the index is valid. */ void myLinkedListDeleteAtIndex(MyLinkedList* obj, int index) { - if (index == 0){ - MyLinkedList *tmp = obj->next; - if (tmp != NULL){ - obj->next = tmp->next; - free(tmp); - } - return; - } - MyLinkedList *cur = obj->next; - for (int i = 1 ;cur != NULL && cur->next != NULL; i++){ - if (i == index){ - MyLinkedList *tmp = cur->next; - if (tmp != NULL) { - cur->next = tmp->next; - free(tmp); - } - return; - } - else{ - cur = cur->next; - } + if (index < 0 || index >= obj->size) return; + + Node* cur = obj->data; + while (index-- > 0) { + cur = cur->next; } - + + Node* temp = cur->next; + cur->next = temp->next; + free(temp); + obj->size--; } void myLinkedListFree(MyLinkedList* obj) { - while(obj != NULL){ - MyLinkedList *tmp = obj; - obj = obj->next; - free(tmp); - } + Node* tmp = obj->data; + while (tmp != NULL) { + Node* n = tmp; + tmp = tmp->next; + free(n); + } + free(obj); } /** @@ -1569,3 +1563,4 @@ public class MyLinkedList + From 3e6dc44fa1965cbaafbb4b3f9119b1a40183a481 Mon Sep 17 00:00:00 2001 From: markwang Date: Thu, 25 Jul 2024 10:36:23 +0800 Subject: [PATCH 2714/3019] =?UTF-8?q?131.=E5=88=86=E5=89=B2=E5=9B=9E?= =?UTF-8?q?=E6=96=87=E4=B8=B2=E5=A2=9E=E5=8A=A0Go=E5=8A=A8=E6=80=81?= =?UTF-8?q?=E8=A7=84=E5=88=92=E4=BC=98=E5=8C=96=E5=9B=9E=E6=96=87=E4=B8=B2?= =?UTF-8?q?=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...62\345\233\236\346\226\207\344\270\262.md" | 58 +++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git "a/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" "b/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" index 4a8686518b..4eca0ddf53 100644 --- "a/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" +++ "b/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" @@ -527,6 +527,7 @@ class Solution: ``` ### Go +回溯 基本版 ```go var ( path []string // 放已经回文的子串 @@ -565,6 +566,63 @@ func isPalindrome(s string) bool { } ``` +回溯+动态规划优化回文串判断 +```go +var ( + result [][]string + path []string // 放已经回文的子串 + isPalindrome [][]bool // 放事先计算好的是否回文子串的结果 +) + +func partition(s string) [][]string { + result = make([][]string, 0) + path = make([]string, 0) + computePalindrome(s) + backtracing(s, 0) + return result +} + +func backtracing(s string, startIndex int) { + // 如果起始位置已经大于s的大小,说明已经找到了一组分割方案了 + if startIndex >= len(s) { + tmp := make([]string, len(path)) + copy(tmp, path) + result = append(result, tmp) + return + } + for i := startIndex; i < len(s); i++ { + if isPalindrome[startIndex][i] { // 是回文子串 + // 获取[startIndex,i]在s中的子串 + path = append(path, s[startIndex:i+1]) + } else { // 不是回文,跳过 + continue + } + backtracing(s, i + 1) // 寻找i+1为起始位置的子串 + path = path[:len(path)-1] // 回溯过程,弹出本次已经添加的子串 + } +} + +func computePalindrome(s string) { + // isPalindrome[i][j] 代表 s[i:j](双边包括)是否是回文字串 + isPalindrome = make([][]bool, len(s)) + for i := 0; i < len(isPalindrome); i++ { + isPalindrome[i] = make([]bool, len(s)) + } + for i := len(s)-1; i >= 0; i-- { + // 需要倒序计算, 保证在i行时, i+1行已经计算好了 + for j := i; j < len(s); j++ { + if j == i { + isPalindrome[i][j] = true + } else if j - i == 1 { + isPalindrome[i][j] = s[i] == s[j] + } else { + isPalindrome[i][j] = s[i] == s[j] && isPalindrome[i+1][j-1] + } + } + } +} +``` + ### JavaScript ```js From 11ddcbdac4667d27cc730fba2d35bfa9ec6bb66c Mon Sep 17 00:00:00 2001 From: markwang Date: Thu, 25 Jul 2024 11:30:14 +0800 Subject: [PATCH 2715/3019] =?UTF-8?q?93.=E5=A4=8D=E5=8E=9FIP=E5=9C=B0?= =?UTF-8?q?=E5=9D=80=E9=94=99=E5=88=AB=E5=AD=97=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" "b/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" index 73d5e3c3b2..d1300a3933 100644 --- "a/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" +++ "b/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" @@ -143,7 +143,7 @@ for (int i = startIndex; i < s.size(); i++) { 代码如下: ```CPP -// 判断字符串s在左闭又闭区间[start, end]所组成的数字是否合法 +// 判断字符串s在左闭右闭区间[start, end]所组成的数字是否合法 bool isValid(const string& s, int start, int end) { if (start > end) { return false; @@ -208,7 +208,7 @@ private: } else break; // 不合法,直接结束本层循环 } } - // 判断字符串s在左闭又闭区间[start, end]所组成的数字是否合法 + // 判断字符串s在左闭右闭区间[start, end]所组成的数字是否合法 bool isValid(const string& s, int start, int end) { if (start > end) { return false; From 1c9f885fa52047f942bd8627c0ffd835e5a8c629 Mon Sep 17 00:00:00 2001 From: markwang Date: Thu, 25 Jul 2024 14:50:10 +0800 Subject: [PATCH 2716/3019] =?UTF-8?q?90.=E5=AD=90=E9=9B=86II=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0Go=E4=BD=BF=E7=94=A8used=E6=95=B0=E7=BB=84=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/0090.\345\255\220\351\233\206II.md" | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git "a/problems/0090.\345\255\220\351\233\206II.md" "b/problems/0090.\345\255\220\351\233\206II.md" index 03bbd1dca3..939ef369c9 100644 --- "a/problems/0090.\345\255\220\351\233\206II.md" +++ "b/problems/0090.\345\255\220\351\233\206II.md" @@ -310,6 +310,43 @@ class Solution: ``` ### Go +使用used数组 +```Go +var ( + result [][]int + path []int +) + +func subsetsWithDup(nums []int) [][]int { + result = make([][]int, 0) + path = make([]int, 0) + used := make([]bool, len(nums)) + sort.Ints(nums) // 去重需要排序 + backtracing(nums, 0, used) + return result +} + +func backtracing(nums []int, startIndex int, used []bool) { + tmp := make([]int, len(path)) + copy(tmp, path) + result = append(result, tmp) + for i := startIndex; i < len(nums); i++ { + // used[i - 1] == true,说明同一树枝candidates[i - 1]使用过 + // used[i - 1] == false,说明同一树层candidates[i - 1]使用过 + // 而我们要对同一树层使用过的元素进行跳过 + if i > 0 && nums[i] == nums[i-1] && used[i-1] == false { + continue + } + path = append(path, nums[i]) + used[i] = true + backtracing(nums, i + 1, used) + path = path[:len(path)-1] + used[i] = false + } +} +``` + +不使用used数组 ```Go var ( path []int From c3541789614a1703154125f3e7a26592f5f2bc5e Mon Sep 17 00:00:00 2001 From: Lifan Sun Date: Thu, 25 Jul 2024 16:11:38 +0800 Subject: [PATCH 2717/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200203.=E7=A7=BB?= =?UTF-8?q?=E9=99=A4=E9=93=BE=E8=A1=A8=E5=85=83=E7=B4=A0=E9=80=92=E5=BD=92?= =?UTF-8?q?=E8=A7=A3=E6=B3=95=20C++=20=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...76\350\241\250\345\205\203\347\264\240.md" | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git "a/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" "b/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" index 64124fbb3c..f6b5ef6dbb 100644 --- "a/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" +++ "b/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" @@ -149,7 +149,35 @@ public: * 时间复杂度: O(n) * 空间复杂度: O(1) +**也可以通过递归的思路解决本题:** +基础情况:对于空链表,不需要移除元素。 + +递归情况:首先检查头节点的值是否为 val,如果是则移除头节点,答案即为在头节点的后续节点上递归的结果;如果头节点的值不为 val,则答案为头节点与在头节点的后续节点上递归得到的新链表拼接的结果。 + +```CPP +class Solution { +public: + ListNode* removeElements(ListNode* head, int val) { + // 基础情况:空链表 + if (head == nullptr) { + return nullptr; + } + + // 递归处理 + if (head->val == val) { + ListNode* newHead = removeElements(head->next, val); + delete head; + return newHead; + } else { + head->next = removeElements(head->next, val); + return head; + } + } +}; +``` +* 时间复杂度:O(n) +* 空间复杂度:O(n) ## 其他语言版本 From e828a4de861b4ecb5f2f68f91feeda1b1f17d2b9 Mon Sep 17 00:00:00 2001 From: SaladDay <92240037+SaladDay@users.noreply.github.com> Date: Thu, 25 Jul 2024 21:26:01 +0800 Subject: [PATCH 2718/3019] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=AD=90=E6=A0=87?= =?UTF-8?q?=E9=A2=98=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "problems/0474.\344\270\200\345\222\214\351\233\266.md" | 2 +- "problems/0494.\347\233\256\346\240\207\345\222\214.md" | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git "a/problems/0474.\344\270\200\345\222\214\351\233\266.md" "b/problems/0474.\344\270\200\345\222\214\351\233\266.md" index 7b46abeece..72d622437a 100644 --- "a/problems/0474.\344\270\200\345\222\214\351\233\266.md" +++ "b/problems/0474.\344\270\200\345\222\214\351\233\266.md" @@ -615,7 +615,7 @@ impl Solution { } } ``` -## C +### C ```c #define max(a, b) ((a) > (b) ? (a) : (b)) diff --git "a/problems/0494.\347\233\256\346\240\207\345\222\214.md" "b/problems/0494.\347\233\256\346\240\207\345\222\214.md" index 92616ed188..2e519b96fa 100644 --- "a/problems/0494.\347\233\256\346\240\207\345\222\214.md" +++ "b/problems/0494.\347\233\256\346\240\207\345\222\214.md" @@ -585,7 +585,7 @@ impl Solution { } } ``` -## C +### C ```c int getSum(int * nums, int numsSize){ From 2435807a68ba9b7915b4aa6323251dbd0d7a39ac Mon Sep 17 00:00:00 2001 From: HJHuangUM <57804285+Wogwan@users.noreply.github.com> Date: Thu, 25 Jul 2024 15:03:19 -0700 Subject: [PATCH 2719/3019] update problem/151.md format --- ...4\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" | 1 + 1 file changed, 1 insertion(+) diff --git "a/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" "b/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" index b6b34be394..a000519862 100644 --- "a/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" +++ "b/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" @@ -474,6 +474,7 @@ class Solution: words = s.split() #type(words) --- list words = words[::-1] # 反转单词 return ' '.join(words) #列表转换成字符串 +``` ### Go: From 2d9604baa5dcc544f6610601a13a28d6b6b56117 Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Fri, 26 Jul 2024 11:35:38 +0800 Subject: [PATCH 2720/3019] Update --- README.md | 4 +- ...55\344\271\260\345\234\237\345\234\260.md" | 6 +- ...8.\345\214\272\351\227\264\345\222\214.md" | 16 +- ...57\350\276\276\350\267\257\345\276\204.md" | 9 +- ...\344\275\231\350\277\236\346\216\245II.md" | 1 + ...75\351\231\205\350\261\241\346\243\213.md" | 59 +++++ ...72\351\227\264\347\277\273\350\275\254.md" | 132 ++++++++++ ...40\351\231\244\346\200\273\345\222\214.md" | 108 ++++++++ ...14\345\200\274\350\267\257\345\276\204.md" | 237 ++++++++++++++++++ ...01\345\255\227\347\254\246\344\270\262.md" | 66 +++++ ...27\347\232\204\346\216\222\345\210\227.md" | 98 ++++++++ ...6.\344\274\240\351\200\201\346\240\221.md" | 65 +++++ ...11\347\217\240\344\272\222\346\226\245.md" | 40 +++ ...14\345\220\214\350\212\261\351\241\272.md" | 53 ++++ ...65\347\232\204\346\235\203\345\200\274.md" | 46 ++++ ...40\351\231\244\346\200\273\345\222\214.md" | 30 --- .../\345\245\275\346\225\260\347\273\204.md" | 56 +++++ ...72\351\227\264\347\277\273\350\275\254.md" | 109 -------- ...14\345\200\274\350\267\257\345\276\204.md" | 81 ------ ...04\346\200\273\347\273\223\347\257\207.md" | 7 + 20 files changed, 991 insertions(+), 232 deletions(-) create mode 100644 "problems/kamacoder/0113.\345\233\275\351\231\205\350\261\241\346\243\213.md" create mode 100644 "problems/kamacoder/0121.\345\260\217\347\272\242\347\232\204\345\214\272\351\227\264\347\277\273\350\275\254.md" create mode 100644 "problems/kamacoder/0142.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\346\234\200\345\260\217ASCII\345\210\240\351\231\244\346\200\273\345\222\214.md" create mode 100644 "problems/kamacoder/0143.\346\234\200\351\225\277\345\220\214\345\200\274\350\267\257\345\276\204.md" create mode 100644 "problems/kamacoder/0144.\345\255\227\345\205\270\345\272\217\346\234\200\345\260\217\347\232\20401\345\255\227\347\254\246\344\270\262.md" create mode 100644 "problems/kamacoder/0145.\346\225\260\347\273\204\345\255\220\345\272\217\345\210\227\347\232\204\346\216\222\345\210\227.md" create mode 100644 "problems/kamacoder/0146.\344\274\240\351\200\201\346\240\221.md" create mode 100644 "problems/kamacoder/0147.\344\270\211\347\217\240\344\272\222\346\226\245.md" create mode 100644 "problems/kamacoder/0148.\346\211\221\345\205\213\347\211\214\345\220\214\350\212\261\351\241\272.md" create mode 100644 "problems/kamacoder/0150.\346\236\201\351\225\277\350\277\236\347\273\255\346\256\265\347\232\204\346\235\203\345\200\274.md" delete mode 100644 "problems/kamacoder/\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\346\234\200\345\260\217ASCII\345\210\240\351\231\244\346\200\273\345\222\214.md" create mode 100644 "problems/kamacoder/\345\245\275\346\225\260\347\273\204.md" delete mode 100644 "problems/kamacoder/\345\260\217\347\272\242\347\232\204\345\214\272\351\227\264\347\277\273\350\275\254.md" delete mode 100644 "problems/kamacoder/\346\234\200\351\225\277\345\220\214\345\200\274\350\267\257\345\276\204.md" diff --git a/README.md b/README.md index 19d1bebbef..96852d706d 100644 --- a/README.md +++ b/README.md @@ -107,7 +107,9 @@ 5. [数组:209.长度最小的子数组](./problems/0209.长度最小的子数组.md) 6. [数组:区间和](./problems/kamacoder/0058.区间和.md) 6. [数组:59.螺旋矩阵II](./problems/0059.螺旋矩阵II.md) -7. [数组:总结篇](./problems/数组总结篇.md) +7. [数组:区间和](./problems/kamacoder/0058.区间和.md) +8. [数组:开发商购买土地](./problems/kamacoder/0044.开发商购买土地.md) +9. [数组:总结篇](./problems/数组总结篇.md) ## 链表 diff --git "a/problems/kamacoder/0044.\345\274\200\345\217\221\345\225\206\350\264\255\344\271\260\345\234\237\345\234\260.md" "b/problems/kamacoder/0044.\345\274\200\345\217\221\345\225\206\350\264\255\344\271\260\345\234\237\345\234\260.md" index 73e9e8c5f4..37bb98ed2d 100644 --- "a/problems/kamacoder/0044.\345\274\200\345\217\221\345\225\206\350\264\255\344\271\260\345\234\237\345\234\260.md" +++ "b/problems/kamacoder/0044.\345\274\200\345\217\221\345\225\206\350\264\255\344\271\260\345\234\237\345\234\260.md" @@ -1,6 +1,10 @@ # 44. 开发商购买土地 +> 本题为代码随想录后续扩充题目,还没有视频讲解,顺便让大家练习一下ACM输入输出模式(笔试面试必备) + +[题目链接](https://kamacoder.com/problempage.php?pid=1044) + 【题目描述】 在一个城市区域内,被划分成了n * m个连续的区块,每个区块都拥有不同的权值,代表着其土地价值。目前,有两家开发公司,A 公司和 B 公司,希望购买这个城市区域的土地。 @@ -57,7 +61,7 @@ 如果本题要求 任何两个行(或者列)之间的数值总和,大家在[0058.区间和](./0058.区间和.md) 的基础上 应该知道怎么求。 -就是前缀和的思路,先统计好,前n行的和 q[n],如果要求矩阵 a 行到 b行 之间的总和,那么就 q[b] - q[a - 1]就好。 +就是前缀和的思路,先统计好,前n行的和 q[n],如果要求矩阵 a行 到 b行 之间的总和,那么就 q[b] - q[a - 1]就好。 至于为什么是 a - 1,大家去看 [0058.区间和](./0058.区间和.md) 的分析,使用 前缀和 要注意 区间左右边的开闭情况。 diff --git "a/problems/kamacoder/0058.\345\214\272\351\227\264\345\222\214.md" "b/problems/kamacoder/0058.\345\214\272\351\227\264\345\222\214.md" index 0e478c68b0..f5ce08dcbf 100644 --- "a/problems/kamacoder/0058.\345\214\272\351\227\264\345\222\214.md" +++ "b/problems/kamacoder/0058.\345\214\272\351\227\264\345\222\214.md" @@ -1,6 +1,8 @@ # 58. 区间和 +> 本题为代码随想录后续扩充题目,还没有视频讲解,顺便让大家练习一下ACM输入输出模式(笔试面试必备) + [题目链接](https://kamacoder.com/problempage.php?pid=1070) 题目描述 @@ -97,11 +99,11 @@ int main() { 为什么呢? -p[1] = vec[0] + vec[1]; +`p[1] = vec[0] + vec[1];` -p[5] = vec[0] + vec[1] + vec[2] + vec[3] + vec[4] + vec[5]; +`p[5] = vec[0] + vec[1] + vec[2] + vec[3] + vec[4] + vec[5];` -p[5] - p[1] = vec[2] + vec[3] + vec[4] + vec[5]; +`p[5] - p[1] = vec[2] + vec[3] + vec[4] + vec[5];` 这不就是我们要求的 下标 2 到下标 5 之间的累加和吗。 @@ -109,15 +111,17 @@ p[5] - p[1] = vec[2] + vec[3] + vec[4] + vec[5]; ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240627111319.png) -p[5] - p[1] 就是 红色部分的区间和。 +`p[5] - p[1]` 就是 红色部分的区间和。 -而 p 数组是我们之前就计算好的累加和,所以后面每次求区间和的之后 我们只需要 O(1)的操作。 +而 p 数组是我们之前就计算好的累加和,所以后面每次求区间和的之后 我们只需要 O(1) 的操作。 **特别注意**: 在使用前缀和求解的时候,要特别注意 求解区间。 如上图,如果我们要求 区间下标 [2, 5] 的区间和,那么应该是 p[5] - p[1],而不是 p[5] - p[2]。 -很多录友在使用前缀和的时候,分不清前缀和的区间,建议画一画图,模拟一下 思路会更清晰。 +**很多录友在使用前缀和的时候,分不清前缀和的区间,建议画一画图,模拟一下 思路会更清晰**。 + +本题C++代码如下: ```CPP #include diff --git "a/problems/kamacoder/0098.\346\211\200\346\234\211\345\217\257\350\276\276\350\267\257\345\276\204.md" "b/problems/kamacoder/0098.\346\211\200\346\234\211\345\217\257\350\276\276\350\267\257\345\276\204.md" index 073d1a2e21..5e87cd7ee1 100644 --- "a/problems/kamacoder/0098.\346\211\200\346\234\211\345\217\257\350\276\276\350\267\257\345\276\204.md" +++ "b/problems/kamacoder/0098.\346\211\200\346\234\211\345\217\257\350\276\276\350\267\257\345\276\204.md" @@ -422,7 +422,8 @@ int main() { ## 其他语言版本 ### Java -#### 邻接矩阵写法 + +邻接矩阵写法 ```java import java.util.ArrayList; import java.util.List; @@ -477,7 +478,7 @@ public class Main { } ``` -#### 邻接表写法 +邻接表写法 ```java import java.util.ArrayList; import java.util.LinkedList; @@ -533,7 +534,7 @@ public class Main { } ``` ### Python -#### 邻接矩阵写法 +邻接矩阵写法 ``` python def dfs(graph, x, n, path, result): if x == n: @@ -566,7 +567,7 @@ if __name__ == "__main__": main() ``` -#### 邻接表写法 +邻接表写法 ``` python from collections import defaultdict diff --git "a/problems/kamacoder/0109.\345\206\227\344\275\231\350\277\236\346\216\245II.md" "b/problems/kamacoder/0109.\345\206\227\344\275\231\350\277\236\346\216\245II.md" index 9c2f403941..80fe8777fd 100644 --- "a/problems/kamacoder/0109.\345\206\227\344\275\231\350\277\236\346\216\245II.md" +++ "b/problems/kamacoder/0109.\345\206\227\344\275\231\350\277\236\346\216\245II.md" @@ -225,6 +225,7 @@ int main() { vec.push_back(i); } } + // 情况一、情况二 if (vec.size() > 0) { // 放在vec里的边已经按照倒叙放的,所以这里就优先删vec[0]这条边 if (isTreeAfterRemoveEdge(edges, vec[0])) { diff --git "a/problems/kamacoder/0113.\345\233\275\351\231\205\350\261\241\346\243\213.md" "b/problems/kamacoder/0113.\345\233\275\351\231\205\350\261\241\346\243\213.md" new file mode 100644 index 0000000000..966aced348 --- /dev/null +++ "b/problems/kamacoder/0113.\345\233\275\351\231\205\350\261\241\346\243\213.md" @@ -0,0 +1,59 @@ + +# 113.国际象棋 + +广搜,但本题如果广搜枚举马和象的话会超时。 + +广搜要只枚举马的走位,同时判断是否在对角巷直接走象 + +```CPP +#include +using namespace std; +const int N = 100005, mod = 1000000007; +using ll = long long; +int n, ans; +int dir[][2] = {{1, 2}, {1, -2}, {-1, 2}, {-1, -2}, {2, 1}, {2, -1}, {-2, -1}, {-2, 1}}; +int main() { + int x1, y1, x2, y2; + cin >> n; + while (n--) { + scanf("%d%d%d%d", &x1, &y1, &x2, &y2); + if (x1 == x2 && y1 == y2) { + cout << 0 << endl; + continue; + } + // 判断象走一步到达 + int d = abs(x1 - x2) - abs(y1 - y2); + if (!d) {cout << 1 << endl; continue;} + // 判断马走一步到达 + bool one = 0; + for (int i = 0; i < 8; ++i) { + int dx = x1 + dir[i][0], dy = y1 + dir[i][1]; + if (dx == x2 && dy == y2) { + cout << 1 << endl; + one = true; + break; + } + } + if (one) continue; + // 接下来为两步的逻辑, 象走两步或者马走一步,象走一步 + // 象直接两步可以到达,这个计算是不是同颜色的格子,象可以在两步到达所有同颜色的格子 + int d2 = abs(x1 - x2) + abs(y1 - y2); + if (d2 % 2 == 0) { + cout << 2 << endl; + continue; + } + // 接下来判断马 + 象的组合 + bool two = 0; + for (int i = 0; i < 8; ++i) { + int dx = x1 + dir[i][0], dy = y1 + dir[i][1]; + int d = abs(dx - x2) - abs(dy - y2); + if (!d) {cout << 2 << endl; two = true; break;} + } + if (two) continue; + // 剩下的格子全都是三步到达的 + cout << 3 << endl; + } + return 0; +} + +``` diff --git "a/problems/kamacoder/0121.\345\260\217\347\272\242\347\232\204\345\214\272\351\227\264\347\277\273\350\275\254.md" "b/problems/kamacoder/0121.\345\260\217\347\272\242\347\232\204\345\214\272\351\227\264\347\277\273\350\275\254.md" new file mode 100644 index 0000000000..6e10aab7b8 --- /dev/null +++ "b/problems/kamacoder/0121.\345\260\217\347\272\242\347\232\204\345\214\272\351\227\264\347\277\273\350\275\254.md" @@ -0,0 +1,132 @@ + +# 121. 小红的区间翻转 + +比较暴力的方式,就是直接模拟, 枚举所有 区间,然后检查其翻转的情况。 + +在检查翻转的时候,需要一些代码优化,否则容易超时。 + +```CPP +#include +#include +using namespace std; + +bool canTransform(const vector& a, const vector& b, int left, int right) { + // 提前检查翻转区间的值是否可以匹配 + for (int i = left, j = right; i <= right; i++, j--) { + if (a[i] != b[j]) { + return false; + } + } + // 检查翻转区间外的值是否匹配 + for (int i = 0; i < left; i++) { + if (a[i] != b[i]) { + return false; + } + } + for (int i = right + 1; i < a.size(); i++) { + if (a[i] != b[i]) { + return false; + } + } + return true; +} + +int main() { + int n; + cin >> n; + + vector a(n); + vector b(n); + + for (int i = 0; i < n; i++) { + cin >> a[i]; + } + + for (int i = 0; i < n; i++) { + cin >> b[i]; + } + + int count = 0; + + // 遍历所有可能的区间 + for (int left = 0; left < n; left++) { + for (int right = left; right < n; right++) { + // 检查翻转区间 [left, right] 后,a 是否可以变成 b + if (canTransform(a, b, left, right)) { + count++; + } + } + } + cout << count << endl; + return 0; +} +``` + +也可以事先计算好,最长公共前缀,和最长公共后缀。 + +在公共前缀和公共后缀之间的部分进行翻转操作,这样我们可以减少很多不必要的翻转尝试。 + +通过在公共前缀和后缀之间的部分,找到可以通过翻转使得 a 和 b 相等的区间。 + +以下 为评论区 卡码网用户:码鬼的C++代码 + +```CPP +#include +#include + +using namespace std; + +int main() { + int n; + cin >> n; + vector a(n), b(n); + for (int i = 0; i < n; i++) { + cin >> a[i]; + } + for (int i = 0; i < n; i++) { + cin >> b[i]; + } + + vector prefix(n, 0), suffix(n, 0); + + // 计算前缀相等的位置 + int p = 0; + while (p < n && a[p] == b[p]) { + prefix[p] = 1; + p++; + } + + // 计算后缀相等的位置 + int s = n - 1; + while (s >= 0 && a[s] == b[s]) { + suffix[s] = 1; + s--; + } + + int count = 0; + + // 遍历所有可能的区间 + for (int i = 0; i < n - 1; i++) { + for (int j = i + 1; j < n; j++) { + // 判断前缀和后缀是否相等 + if ((i == 0 || prefix[i - 1] == 1) && (j == n - 1 || suffix[j + 1] == 1)) { + // 判断翻转后的子数组是否和目标数组相同 + bool is_palindrome = true; + for (int k = 0; k <= (j - i) / 2; k++) { + if (a[i + k] != b[j - k]) { + is_palindrome = false; + break; + } + } + if (is_palindrome) { + count++; + } + } + } + } + + cout << count << endl; + + return 0; +} +``` diff --git "a/problems/kamacoder/0142.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\346\234\200\345\260\217ASCII\345\210\240\351\231\244\346\200\273\345\222\214.md" "b/problems/kamacoder/0142.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\346\234\200\345\260\217ASCII\345\210\240\351\231\244\346\200\273\345\222\214.md" new file mode 100644 index 0000000000..ff34581ff0 --- /dev/null +++ "b/problems/kamacoder/0142.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\346\234\200\345\260\217ASCII\345\210\240\351\231\244\346\200\273\345\222\214.md" @@ -0,0 +1,108 @@ + +# 142. 两个字符串的最小 ASCII 删除总和 + +本题和[代码随想录:两个字符串的删除操作](https://www.programmercarl.com/0583.%E4%B8%A4%E4%B8%AA%E5%AD%97%E7%AC%A6%E4%B8%B2%E7%9A%84%E5%88%A0%E9%99%A4%E6%93%8D%E4%BD%9C.html) 思路基本是一样的。 + +属于编辑距离问题,如果想彻底了解,建议看看「代码随想录」的编辑距离总结篇。 + +本题dp数组含义: + +dp[i][j] 表示 以i-1为结尾的字符串word1,和以j-1位结尾的字符串word2,想要达到相等,所需要删除元素的最小ASCII 删除总和。 + +如果 s1[i - 1] 与 s2[j - 1] 相同,则不用删:`dp[i][j] = dp[i - 1][j - 1]` + +如果 s1[i - 1] 与 s2[j - 1] 不相同,删word1 的 最小删除和: `dp[i - 1][j] + s1[i - 1]` ,删word2的最小删除和: `dp[i][j - 1] + s2[j - 1]` + +取最小值: `dp[i][j] = min(dp[i - 1][j] + s1[i - 1], dp[i][j - 1] + s2[j - 1])` + + + +```CPP +#include +#include +using namespace std; +int main() { + string s1, s2; + cin >> s1 >> s2; + vector> dp(s1.size() + 1, vector(s2.size() + 1, 0)); + + // s1 如果变成空串的最小删除ASCLL值综合 + for (int i = 1; i <= s1.size(); i++) dp[i][0] = dp[i - 1][0] + s1[i - 1]; + // s2 如果变成空串的最小删除ASCLL值综合 + for (int j = 1; j <= s2.size(); j++) dp[0][j] = dp[0][j - 1] + s2[j - 1]; + + for (int i = 1; i <= s1.size(); i++) { + for (int j = 1; j <= s2.size(); j++) { + if (s1[i - 1] == s2[j - 1]) dp[i][j] = dp[i - 1][j - 1]; + else dp[i][j] = min(dp[i - 1][j] + s1[i - 1], dp[i][j - 1] + s2[j - 1]); + } + } + cout << dp[s1.size()][s2.size()] << endl; +} +``` + +### Java + +```Java +import java.util.Scanner; + +public class Main { + public static void main(String[] args) { + Scanner scanner = new Scanner(System.in); + String s1 = scanner.nextLine(); + String s2 = scanner.nextLine(); + int[][] dp = new int[s1.length() + 1][s2.length() + 1]; + + // s1 如果变成空串的最小删除ASCII值综合 + for (int i = 1; i <= s1.length(); i++) { + dp[i][0] = dp[i - 1][0] + s1.charAt(i - 1); + } + // s2 如果变成空串的最小删除ASCII值综合 + for (int j = 1; j <= s2.length(); j++) { + dp[0][j] = dp[0][j - 1] + s2.charAt(j - 1); + } + + for (int i = 1; i <= s1.length(); i++) { + for (int j = 1; j <= s2.length(); j++) { + if (s1.charAt(i - 1) == s2.charAt(j - 1)) { + dp[i][j] = dp[i - 1][j - 1]; + } else { + dp[i][j] = Math.min(dp[i - 1][j] + s1.charAt(i - 1), dp[i][j - 1] + s2.charAt(j - 1)); + } + } + } + System.out.println(dp[s1.length()][s2.length()]); + scanner.close(); + } +} + + +``` + +### python + +```python +def min_delete_sum(s1: str, s2: str) -> int: + dp = [[0] * (len(s2) + 1) for _ in range(len(s1) + 1)] + + # s1 如果变成空串的最小删除ASCII值综合 + for i in range(1, len(s1) + 1): + dp[i][0] = dp[i - 1][0] + ord(s1[i - 1]) + # s2 如果变成空串的最小删除ASCII值综合 + for j in range(1, len(s2) + 1): + dp[0][j] = dp[0][j - 1] + ord(s2[j - 1]) + + for i in range(1, len(s1) + 1): + for j in range(1, len(s2) + 1): + if s1[i - 1] == s2[j - 1]: + dp[i][j] = dp[i - 1][j - 1] + else: + dp[i][j] = min(dp[i - 1][j] + ord(s1[i - 1]), dp[i][j - 1] + ord(s2[j - 1])) + + return dp[len(s1)][len(s2)] + +if __name__ == "__main__": + s1 = input().strip() + s2 = input().strip() + print(min_delete_sum(s1, s2)) +``` diff --git "a/problems/kamacoder/0143.\346\234\200\351\225\277\345\220\214\345\200\274\350\267\257\345\276\204.md" "b/problems/kamacoder/0143.\346\234\200\351\225\277\345\220\214\345\200\274\350\267\257\345\276\204.md" new file mode 100644 index 0000000000..bf46c895f8 --- /dev/null +++ "b/problems/kamacoder/0143.\346\234\200\351\225\277\345\220\214\345\200\274\350\267\257\345\276\204.md" @@ -0,0 +1,237 @@ + + +# 143. 最长同值路径 + + +本题两个考点: + +1. 层序遍历构造二叉树 +2. 树形dp,找出最长路径 + +对于写代码不多,或者动手能力比较差的录友,第一个 构造二叉树 基本就被卡主了。 + +```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* constructBinaryTree(const vector& levelOrder) { + if (levelOrder.empty()) return NULL; + + TreeNode* root = new TreeNode(stoi(levelOrder[0])); + queue q; + q.push(root); + int i = 1; + + while (!q.empty() && i < levelOrder.size()) { + TreeNode* current = q.front(); + q.pop(); + + if (i < levelOrder.size() && levelOrder[i] != "null") { + current->left = new TreeNode(stoi(levelOrder[i])); + q.push(current->left); + } + i++; + + if (i < levelOrder.size() && levelOrder[i] != "null") { + current->right = new TreeNode(stoi(levelOrder[i])); + q.push(current->right); + } + i++; + } + + return root; +} + +int result = 0; + +// 树形DP +int dfs(TreeNode* node) { + if (node == NULL) return 0; + int leftPath = dfs(node->left); + int rightPath = dfs(node->right); + + int leftNum = 0, rightNum = 0; + if (node->left != NULL && node->left->val == node->val) { + leftNum = leftPath + 1; + } + if (node->right != NULL && node->right->val == node->val) { + rightNum = rightPath + 1; + } + result = max(result, leftNum + rightNum); + return max(leftNum, rightNum); + +} + + +int main() { + int n; + cin >> n; + vector levelOrder(n); + for (int i = 0; i < n ; i++) cin >> levelOrder[i]; + + TreeNode* root = constructBinaryTree(levelOrder); + dfs(root); + cout << result << endl; + + return 0; +} +``` + +### Java + +```Java +import java.util.*; + +class TreeNode { + int val; + TreeNode left, right; + TreeNode(int x) { + val = x; + left = null; + right = null; + } +} + +public class Main { + public static int result = 0; + + public static TreeNode constructBinaryTree(List levelOrder) { + if (levelOrder.isEmpty()) return null; + + TreeNode root = new TreeNode(Integer.parseInt(levelOrder.get(0))); + Queue queue = new LinkedList<>(); + queue.add(root); + int i = 1; + + while (!queue.isEmpty() && i < levelOrder.size()) { + TreeNode current = queue.poll(); + + if (i < levelOrder.size() && !levelOrder.get(i).equals("null")) { + current.left = new TreeNode(Integer.parseInt(levelOrder.get(i))); + queue.add(current.left); + } + i++; + + if (i < levelOrder.size() && !levelOrder.get(i).equals("null")) { + current.right = new TreeNode(Integer.parseInt(levelOrder.get(i))); + queue.add(current.right); + } + i++; + } + + return root; + } + + public static int dfs(TreeNode node) { + if (node == null) return 0; + int leftPath = dfs(node.left); + int rightPath = dfs(node.right); + + int leftNum = 0, rightNum = 0; + if (node.left != null && node.left.val == node.val) { + leftNum = leftPath + 1; + } + if (node.right != null && node.right.val == node.val) { + rightNum = rightPath + 1; + } + result = Math.max(result, leftNum + rightNum); + return Math.max(leftNum, rightNum); + } + + public static void main(String[] args) { + Scanner sc = new Scanner(System.in); + int n = sc.nextInt(); + sc.nextLine(); // consume the newline character + List levelOrder = new ArrayList<>(); + for (int i = 0; i < n; i++) { + levelOrder.add(sc.next()); + } + TreeNode root = constructBinaryTree(levelOrder); + dfs(root); + System.out.println(result); + sc.close(); + } +} + +``` + +### python + +```python +from typing import List, Optional +from collections import deque +import sys + +class TreeNode: + def __init__(self, val: int = 0, left: 'TreeNode' = None, right: 'TreeNode' = None): + self.val = val + self.left = left + self.right = right + +def construct_binary_tree(level_order: List[str]) -> Optional[TreeNode]: + if not level_order: + return None + + root = TreeNode(int(level_order[0])) + queue = deque([root]) + i = 1 + + while queue and i < len(level_order): + current = queue.popleft() + + if i < len(level_order) and level_order[i] != "null": + current.left = TreeNode(int(level_order[i])) + queue.append(current.left) + i += 1 + + if i < len(level_order) and level_order[i] != "null": + current.right = TreeNode(int(level_order[i])) + queue.append(current.right) + i += 1 + + return root + +result = 0 + +def dfs(node: Optional[TreeNode]) -> int: + global result + if node is None: + return 0 + + left_path = dfs(node.left) + right_path = dfs(node.right) + + left_num = right_num = 0 + if node.left is not None and node.left.val == node.val: + left_num = left_path + 1 + if node.right is not None and node.right.val == node.val: + right_num = right_path + 1 + + result = max(result, left_num + right_num) + return max(left_num, right_num) + +if __name__ == "__main__": + input = sys.stdin.read + data = input().strip().split() + + n = int(data[0]) + level_order = data[1:] + + root = construct_binary_tree(level_order) + dfs(root) + print(result) + + +``` diff --git "a/problems/kamacoder/0144.\345\255\227\345\205\270\345\272\217\346\234\200\345\260\217\347\232\20401\345\255\227\347\254\246\344\270\262.md" "b/problems/kamacoder/0144.\345\255\227\345\205\270\345\272\217\346\234\200\345\260\217\347\232\20401\345\255\227\347\254\246\344\270\262.md" new file mode 100644 index 0000000000..1528fdbd3b --- /dev/null +++ "b/problems/kamacoder/0144.\345\255\227\345\205\270\345\272\217\346\234\200\345\260\217\347\232\20401\345\255\227\347\254\246\344\270\262.md" @@ -0,0 +1,66 @@ + +# 0144.字典序最小的01字符串 + +贪心思路:移动尽可能 移动前面的1 ,这样可以是 字典序最小 + +从前到后遍历,遇到 0 ,就用前面的 1 来交换 + +```CPP +#include +#include +using namespace std; +int main() { + int n,k; + cin >> n >> k; + string s; + cin >> s; + for(int i = 0; i < n && k > 0; i++) { + if(s[i] == '0') { + // 开始用前面的 1 来交换 + int j = i; + while(j > 0 && s[j - 1] == '1' && k > 0) { + swap(s[j], s[j - 1]); + --j; + --k; + } + } + } + cout << s << endl; + return 0; +} + +``` + +Java: + +```Java + +import java.util.*; + +public class Main { + public static void main(String[] args) { + Scanner scanner = new Scanner(System.in); + int n = scanner.nextInt(); + int k = scanner.nextInt(); + scanner.nextLine(); // 消耗掉换行符 + String s = scanner.nextLine(); + char[] ch = s.toCharArray(); + + for (int i = 0; i < n && k > 0; i++) { + if (ch[i] == '0') { + // 开始用前面的 1 来交换 + int j = i; + while (j > 0 && ch[j - 1] == '1' && k > 0) { + char tmp = ch[j]; + ch[j] = ch[j - 1]; + ch[j - 1] = tmp; + j--; + k--; + } + } + } + + System.out.println(new String(ch)); + } +} +``` diff --git "a/problems/kamacoder/0145.\346\225\260\347\273\204\345\255\220\345\272\217\345\210\227\347\232\204\346\216\222\345\210\227.md" "b/problems/kamacoder/0145.\346\225\260\347\273\204\345\255\220\345\272\217\345\210\227\347\232\204\346\216\222\345\210\227.md" new file mode 100644 index 0000000000..757fe0b267 --- /dev/null +++ "b/problems/kamacoder/0145.\346\225\260\347\273\204\345\255\220\345\272\217\345\210\227\347\232\204\346\216\222\345\210\227.md" @@ -0,0 +1,98 @@ + +# 145. 数组子序列的排列 + +每个元素出现的次数相乘就可以了。 + +注意 “长度为 m 的数组,1 到 m 每个元素都出现过,且恰好出现 1 次。” ,题目中有n个元素,所以我们要统计的就是 1 到 n 元素出现的个数。 + +因为如果有一个元素x 大于n了, 那不可能出现 长度为x的数组 且 1 到 x 每个元素都出现过。 + +```CPP +#include "bits/stdc++.h" +using namespace std; +int main(){ + int n; + int x; + cin >> n; + unordered_map umap; + for(int i = 0; i < n; ++i){ + cin >> x; + if(umap.find(x) != umap.end()) umap[x]++; + else umap[x] = 1; + } + long long res = 0; + long long num = 1; + for (int i = 1; i <= n; i++) { + if (umap.find(i) == umap.end()) break; // 如果i都没出现,后面得数也不能 1 到 m 每个元素都出现过 + num = (num * umap[i]) % 1000000007; + res += num; + res %= 1000000007; + } + cout << res << endl; +} + +``` + +```Java + +import java.util.HashMap; +import java.util.Map; +import java.util.Scanner; + +public class Main { + public static void main(String[] args) { + Scanner sc = new Scanner(System.in); + int n = sc.nextInt(); + Map map = new HashMap<>(); + for (int i = 0; i < n; i++) { + int x = sc.nextInt(); + map.put(x, map.getOrDefault(x, 0) + 1); + } + long res = 0; + long num = 1; + for (int i = 1; i <= n; i++) { + if (!map.containsKey(i)) break; // 如果i都没出现,后面得数也不能1到m每个元素都出现过 + num = (num * map.get(i)) % 1000000007; + res += num; + res %= 1000000007; + } + System.out.println(res); + sc.close(); + } +} + +``` + + +```python +def main(): + import sys + input = sys.stdin.read + data = input().split() + + n = int(data[0]) + umap = {} + + for i in range(1, n + 1): + x = int(data[i]) + if x in umap: + umap[x] += 1 + else: + umap[x] = 1 + + res = 0 + num = 1 + MOD = 1000000007 + + for i in range(1, n + 1): + if i not in umap: + break # 如果i都没出现,后面得数也不能1到m每个元素都出现过 + num = (num * umap[i]) % MOD + res = (res + num) % MOD + + print(res) + +if __name__ == "__main__": + main() + +``` diff --git "a/problems/kamacoder/0146.\344\274\240\351\200\201\346\240\221.md" "b/problems/kamacoder/0146.\344\274\240\351\200\201\346\240\221.md" new file mode 100644 index 0000000000..4cafb0402f --- /dev/null +++ "b/problems/kamacoder/0146.\344\274\240\351\200\201\346\240\221.md" @@ -0,0 +1,65 @@ + + + + +# 146. 传送树 + +本题题意是比较绕的,我后面给补上了 【提示信息】对 题目输出样例讲解一下,相对会容易理解的多。 + +```CPP +#include +#include +#include +using namespace std; + +vector> edge; // 邻接表来存图 +vector nxt; +int n; + +/* + * 递归函数,用于找到每个节点的下一个传送门节点,并记录在nxt数组中。 + * 遍历当前节点的所有子节点,递归调用findNext以确保子节点的nxt值已经计算出来。 + * 更新当前节点的nxt值为其子节点中编号最小的节点。 + * 如果当前节点是叶子节点(即没有子节点),则将其nxt值设置为自身。 + */ +void findNext(int node) { + for (int v : edge[node]) { + findNext(v); + if (nxt[node] == -1 || nxt[node] > min(v, nxt[v])) { + nxt[node] = min(v, nxt[v]); + } + } + + // 叶子节点 + if (nxt[node] == -1) { + nxt[node] = node; + } +} + +// 计算从节点u出发经过若干次传送门到达叶子节点所需的步数。 +// 通过不断访问nxt节点,直到到达叶子节点,记录访问的节点数。 +int get(int u) { + int cnt = 1; + while (nxt[u] != u) { + cnt++; + u = nxt[u]; + } + return cnt; +} + +int main() { + cin >> n; + edge.resize(n + 1); + nxt.resize(n + 1, -1); + for (int i = 1; i <= n; ++i) { + int a, b; + cin >> a >> b; + edge[a].push_back(b); + } + findNext(1); + for (int i = 1; i <= n; ++i) { + cout << get(i) << ' '; + } +} + +``` diff --git "a/problems/kamacoder/0147.\344\270\211\347\217\240\344\272\222\346\226\245.md" "b/problems/kamacoder/0147.\344\270\211\347\217\240\344\272\222\346\226\245.md" new file mode 100644 index 0000000000..ed14b3ce26 --- /dev/null +++ "b/problems/kamacoder/0147.\344\270\211\347\217\240\344\272\222\346\226\245.md" @@ -0,0 +1,40 @@ + +1. 如果k * 3 大于 n 了,那说明一定没结果,如果没想明白,大家举个例子试试看 +2. 分别求出三个红珠子之间的距离 +3. 对这三段距离从小到大排序 y1, y2, y3 +4. 如果第一段距离y1 小于k,说明需要交换 k - y 次, 同理 第二段距离y2 小于k,说明需要交换 k - y2 次 +5. y1 y2 都调整好了,不用计算y3,因为 y3是距离最大 + + +```CPP +#include +using namespace std; + +int main(){ + int t; + cin >> t; + int n, k, a1, a2, a3; + vector dis(3); + + while (t--) { + cin >> n >> k >> a1 >> a2 >> a3; + if(k * 3 > n){ + cout << -1 << endl; + continue; + } + dis[0] = min(abs(a1 - a2), n - abs(a1 - a2)); + dis[1] = min(abs(a1 - a3), n - abs(a1 - a3)); + dis[2] = min(abs(a3 - a2), n - abs(a3 - a2)); + + sort(dis.begin(), dis.end()); + + int result = 0; + + if (dis[0] < k) result += (k - dis[0]); + if (dis[1] < k) result += (k - dis[1]); + + cout << result << endl; + } + return 0; +} +``` diff --git "a/problems/kamacoder/0148.\346\211\221\345\205\213\347\211\214\345\220\214\350\212\261\351\241\272.md" "b/problems/kamacoder/0148.\346\211\221\345\205\213\347\211\214\345\220\214\350\212\261\351\241\272.md" new file mode 100644 index 0000000000..b5d27a24f6 --- /dev/null +++ "b/problems/kamacoder/0148.\346\211\221\345\205\213\347\211\214\345\220\214\350\212\261\351\241\272.md" @@ -0,0 +1,53 @@ + +首先我们要定义一个结构体,来存放我们的数据 + +`map<花色,{同一花色牌集合,同一花色的牌对应的牌数量}>` + +再遍历 每一个花色下,每一个牌 的数量 + +代码如下详细注释: + + +```CPP +#include +using namespace std; + +string cards[] = {"H","S","D","C"}; +typedef long long ll; +struct color +{ + set st; // 同一花色 牌的集合 + map cnt; // 同一花色 牌对应的数量 +}; +unordered_map umap; + +int main() { + int n; + cin >> n; + for (int i = 0; i < n; i++) { + int x, y; + string card; + cin >> x >> y >> card; + umap[card].st.insert(x); + umap[card].cnt[x] += y; + } + ll sum = 0; + // 遍历每一个花色 + for (string cardOne : cards) { + color colorOne = umap[cardOne]; + // 遍历 同花色 每一个牌 + for (int number : colorOne.st) { + ll numberCount = colorOne.cnt[number]; // 获取牌为number的数量是 numberCount + + // 统计 number 到 number + 4 都是否有牌,用cal 把 number 到number+4 的数量记下来 + ll cal = numberCount; + for (int j = number + 1; j <= number + 4; j++) cal = min(cal, colorOne.cnt[j]); + // 统计结果 + sum += cal; + // 把统计过的同花顺数量减下去 + for (int j = number + 1; j <= number + 4; j++) colorOne.cnt[j] -= cal; + } + } + cout << sum << endl; +} +``` diff --git "a/problems/kamacoder/0150.\346\236\201\351\225\277\350\277\236\347\273\255\346\256\265\347\232\204\346\235\203\345\200\274.md" "b/problems/kamacoder/0150.\346\236\201\351\225\277\350\277\236\347\273\255\346\256\265\347\232\204\346\235\203\345\200\274.md" new file mode 100644 index 0000000000..25fbd78128 --- /dev/null +++ "b/problems/kamacoder/0150.\346\236\201\351\225\277\350\277\236\347\273\255\346\256\265\347\232\204\346\235\203\345\200\274.md" @@ -0,0 +1,46 @@ + + +按照动态规划的思路,每增加一位,对已有结果会有什么变化呢? + +输入 字符串s 里面有 0 和 1 + +我们先计算出 s[i-1] 的 子串权值和 a + +如果 s[i] 和 s[i - 1] 相同 + +下标0 到 i 这段字符串 的子串权值和就是 a + 1,即算上s[i]本身的连续串数量加上 + +如果 s[i] 和 s[i - 1] 不相同 + + + + + + +```CPP +#include +#include +using namespace std; + +int main() { + int n; + cin >> n; + string s; + cin >> s; + + long long result = 1; + long long a = 1; + + for (int i = 1; i < n; ++i) { + if (s[i] == s[i - 1]) { + a += 1; + result += a; + } else { + a = a + i + 1; + result += a; + } + } + cout << result << endl; + return 0; +} +``` diff --git "a/problems/kamacoder/\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\346\234\200\345\260\217ASCII\345\210\240\351\231\244\346\200\273\345\222\214.md" "b/problems/kamacoder/\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\346\234\200\345\260\217ASCII\345\210\240\351\231\244\346\200\273\345\222\214.md" deleted file mode 100644 index 5425a605b8..0000000000 --- "a/problems/kamacoder/\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\346\234\200\345\260\217ASCII\345\210\240\351\231\244\346\200\273\345\222\214.md" +++ /dev/null @@ -1,30 +0,0 @@ - - -本题和[代码随想录:两个字符串的删除操作](https://www.programmercarl.com/0583.%E4%B8%A4%E4%B8%AA%E5%AD%97%E7%AC%A6%E4%B8%B2%E7%9A%84%E5%88%A0%E9%99%A4%E6%93%8D%E4%BD%9C.html) 思路基本是一样的。 - - -```CPP -#include -#include -using namespace std; -int main() { - string s1, s2; - cin >> s1 >> s2; - vector> dp(s1.size() + 1, vector(s2.size() + 1, 0)); - - // s1 如果变成空串的最小删除ASCLL值综合 - for (int i = 1; i <= s1.size(); i++) dp[i][0] = dp[i - 1][0] + s1[i - 1]; - // s2 如果变成空串的最小删除ASCLL值综合 - for (int j = 1; j <= s2.size(); j++) dp[0][j] = dp[0][j - 1] + s2[j - 1]; - - for (int i = 1; i <= s1.size(); i++) { - for (int j = 1; j <= s2.size(); j++) { - if (s1[i - 1] == s2[j - 1]) dp[i][j] = dp[i - 1][j - 1]; - else dp[i][j] = min(dp[i - 1][j] + s1[i - 1], dp[i][j - 1] + s2[j - 1]); - } - } - cout << dp[s1.size()][s2.size()] << endl; - -} -``` - diff --git "a/problems/kamacoder/\345\245\275\346\225\260\347\273\204.md" "b/problems/kamacoder/\345\245\275\346\225\260\347\273\204.md" new file mode 100644 index 0000000000..55853fa86c --- /dev/null +++ "b/problems/kamacoder/\345\245\275\346\225\260\347\273\204.md" @@ -0,0 +1,56 @@ + + +算是贪心 + +整体思路是移动到中间位置(中位数),一定是 移动次数最小的。 + +有一个数可以不改变,对数组排序之后, 最小数 和 最大数 一定是移动次数最多的,所以分别保留最小 和 最大的不变。 + +中间可能有两个位置,所以要计算中间偏前 和 中间偏后的 + +代码如下: + +```CPP + +#include + +using namespace std; + +int main() { + int n; + cin >> n; + vector arr(n); + for (int i = 0; i < n; ++i) { + cin >> arr[i]; + } + sort(arr.begin(), arr.end()); + + if (arr[0] == arr[n - 1]) { + cout << 1 << endl; + return 0; + } + long cnt = 0L; + long cnt1 = 0L; + + // 如果要保留一个不改变,要不不改最小的,要不不改最大的。 + + // 取中间偏前的位置 + long mid = arr[(n - 2) / 2]; + + // 不改最大的 + for (int i = 0; i < n - 1; i++) { + cnt += abs(arr[i] - mid); + } + + // 取中间偏后的位置 + mid = arr[n / 2]; + + // 不改最小的 + for (int i = 1; i < n; i++) { + cnt1 += abs(arr[i] - mid); + } + + cout << min(cnt, cnt1) << endl; + return 0; +} +``` diff --git "a/problems/kamacoder/\345\260\217\347\272\242\347\232\204\345\214\272\351\227\264\347\277\273\350\275\254.md" "b/problems/kamacoder/\345\260\217\347\272\242\347\232\204\345\214\272\351\227\264\347\277\273\350\275\254.md" deleted file mode 100644 index fd9f6ab356..0000000000 --- "a/problems/kamacoder/\345\260\217\347\272\242\347\232\204\345\214\272\351\227\264\347\277\273\350\275\254.md" +++ /dev/null @@ -1,109 +0,0 @@ - - - -import java.util.Scanner; - -public class Main { - - public static void main(String[] args) { - Scanner sc = new Scanner(System.in); - int n = sc.nextInt(); - int[] a = new int[n]; - int[] b = new int[n]; - - for (int i = 0; i < n; i++) { - a[i] = sc.nextInt(); - } - - for (int i = 0; i < n; i++) { - b[i] = sc.nextInt(); - } - - int p = -1, s = -1; - for (int i = 0; i < n; i++) { - if (a[i] == b[i]) p = i; - else break; - } - - for (int j = n - 1 ; j >= 0 ; j--) { - if (a[j] == b[j]) s = j; - else break; - } - - - boolean[][] dp = new boolean[n][n]; - int res = 0; - - for (int j = 0; j < n; j++) { - for (int i = j ; i >= 0 ; i--) { - if (i == j) dp[i][j] = a[i] == b[i]; - else if (i + 1 == j) dp[i][j] = (a[i] == b[j] && a[j] == b[i]); - else { - dp[i][j] = dp[i+1][j-1] && (a[i] == b[j] && a[j] == b[i]); - } - if (dp[i][j] && (i == 0 || p >= i-1) && (j == n - 1 || j+1 >= s)) res++; - } - } - System.out.println(res); - } - -} - - -import java.util.Scanner; - -public class Main { - public static void main(String[] args) { - Scanner sc = new Scanner(System.in); - int n = sc.nextInt(); - - int[] a = new int[n]; - int[] b = new int[n]; - - for (int i = 0; i < n; i++) { - a[i] = sc.nextInt(); - } - - for (int i = 0; i < n; i++) { - b[i] = sc.nextInt(); - } - - int count = 0; - - // 遍历所有可能的区间 - for (int left = 0; left < n; left++) { - for (int right = left; right < n; right++) { - // 检查翻转区间 [left, right] 后,a 是否可以变成 b - if (canTransform(a, b, left, right)) { - count++; - } - } - } - - System.out.println(count); - } - - private static boolean canTransform(int[] a, int[] b, int left, int right) { - // 提前检查翻转区间的值是否可以匹配 - for (int i = left, j = right; i <= right; i++, j--) { - if (a[i] != b[j]) { - return false; - } - } - - // 检查翻转区间外的值是否匹配 - for (int i = 0; i < left; i++) { - if (a[i] != b[i]) { - return false; - } - } - - for (int i = right + 1; i < a.length; i++) { - if (a[i] != b[i]) { - return false; - } - } - - return true; - } -} diff --git "a/problems/kamacoder/\346\234\200\351\225\277\345\220\214\345\200\274\350\267\257\345\276\204.md" "b/problems/kamacoder/\346\234\200\351\225\277\345\220\214\345\200\274\350\267\257\345\276\204.md" deleted file mode 100644 index 68aeb84505..0000000000 --- "a/problems/kamacoder/\346\234\200\351\225\277\345\220\214\345\200\274\350\267\257\345\276\204.md" +++ /dev/null @@ -1,81 +0,0 @@ - - - - -```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* constructBinaryTree(const vector& levelOrder) { - if (levelOrder.empty()) return NULL; - - TreeNode* root = new TreeNode(stoi(levelOrder[0])); - queue q; - q.push(root); - int i = 1; - - while (!q.empty() && i < levelOrder.size()) { - TreeNode* current = q.front(); - q.pop(); - - if (i < levelOrder.size() && levelOrder[i] != "null") { - current->left = new TreeNode(stoi(levelOrder[i])); - q.push(current->left); - } - i++; - - if (i < levelOrder.size() && levelOrder[i] != "null") { - current->right = new TreeNode(stoi(levelOrder[i])); - q.push(current->right); - } - i++; - } - - return root; -} - -int result = 0; -int dfs(TreeNode* node) { - if (node == NULL) return 0; - int leftPath = dfs(node->left); - int rightPath = dfs(node->right); - - int leftNum = 0, rightNum = 0; - if (node->left != NULL && node->left->val == node->val) { - leftNum = leftPath + 1; - } - if (node->right != NULL && node->right->val == node->val) { - rightNum = rightPath + 1; - } - result = max(result, leftNum + rightNum); - return max(leftNum, rightNum); - -} - - -int main() { - int n; - cin >> n; - vector levelOrder(n); - for (int i = 0; i < n ; i++) cin >> levelOrder[i]; - - TreeNode* root = constructBinaryTree(levelOrder); - dfs(root); - cout << result << endl; - - return 0; -} -``` - diff --git "a/problems/\346\225\260\347\273\204\346\200\273\347\273\223\347\257\207.md" "b/problems/\346\225\260\347\273\204\346\200\273\347\273\223\347\257\207.md" index f026e41b11..7c2fd94724 100644 --- "a/problems/\346\225\260\347\273\204\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/\346\225\260\347\273\204\346\200\273\347\273\223\347\257\207.md" @@ -117,6 +117,13 @@ 相信大家有遇到过这种情况: 感觉题目的边界调节超多,一波接着一波的判断,找边界,拆了东墙补西墙,好不容易运行通过了,代码写的十分冗余,毫无章法,其实**真正解决题目的代码都是简洁的,或者有原则性的**,大家可以在这道题目中体会到这一点。 +### 前缀和 + +> 代码随想录后续补充题目 + +* [数组:求取区间和](https://programmercarl.com/kamacoder/0058.区间和.html) + +前缀和的思路其实很简单,但非常实用,如果没接触过的录友,也很难想到这个解法维度,所以 这是开阔思路 而难度又不高的好题。 ## 总结 From d3e60d2f9f27ea1a616ec8b8e0bcea1347716686 Mon Sep 17 00:00:00 2001 From: HJHuangUM <57804285+Wogwan@users.noreply.github.com> Date: Thu, 25 Jul 2024 21:50:23 -0700 Subject: [PATCH 2721/3019] 07/25/2024 Correct typo MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Correct small typo in 双指针总结.md --- ...\217\214\346\214\207\351\222\210\346\200\273\347\273\223.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/\345\217\214\346\214\207\351\222\210\346\200\273\347\273\223.md" "b/problems/\345\217\214\346\214\207\351\222\210\346\200\273\347\273\223.md" index 02aec2e43e..a77490cdfe 100644 --- "a/problems/\345\217\214\346\214\207\351\222\210\346\200\273\347\273\223.md" +++ "b/problems/\345\217\214\346\214\207\351\222\210\346\200\273\347\273\223.md" @@ -69,7 +69,7 @@ for (int i = 0; i < array.size(); i++) { 其实使用双指针也可以解决1.两数之和的问题,只不过1.两数之和求的是两个元素的下标,没法用双指针,如果改成求具体两个元素的数值就可以了,大家可以尝试用双指针做一个leetcode上两数之和的题目,就可以体会到我说的意思了。 -使用了哈希法解决了两数之和,但是哈希法并不使用于三数之和! +使用了哈希法解决了两数之和,但是哈希法并不适用于三数之和! 使用哈希法的过程中要把符合条件的三元组放进vector中,然后在去去重,这样是非常费时的,很容易超时,也是三数之和通过率如此之低的根源所在。 From 957c60dbfb02a6262d8e2eaa50539a4080acdc5f Mon Sep 17 00:00:00 2001 From: Charlie Yang <104724079+sxdtywm@users.noreply.github.com> Date: Sat, 27 Jul 2024 12:12:46 +0800 Subject: [PATCH 2722/3019] =?UTF-8?q?Update=200100.=E5=B2=9B=E5=B1=BF?= =?UTF-8?q?=E7=9A=84=E6=9C=80=E5=A4=A7=E9=9D=A2=E7=A7=AF.md=20of=20php=20a?= =?UTF-8?q?nd=20go?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Update 0100.岛屿的最大面积.md of php and go --- ...00\345\244\247\351\235\242\347\247\257.md" | 125 ++++++++++++++++++ 1 file changed, 125 insertions(+) diff --git "a/problems/kamacoder/0100.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" "b/problems/kamacoder/0100.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" index 024e509fcc..ea62edc25c 100644 --- "a/problems/kamacoder/0100.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" +++ "b/problems/kamacoder/0100.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" @@ -322,6 +322,72 @@ print(result) ### Go +``` go + +package main + +import ( + "fmt" +) + +var count int +var dir = [][]int{{0, 1}, {1, 0}, {-1, 0}, {0, -1}} // 四个方向 + +func dfs(grid [][]int, visited [][]bool, x, y int) { + for i := 0; i < 4; i++ { + nextx := x + dir[i][0] + nexty := y + dir[i][1] + if nextx < 0 || nextx >= len(grid) || nexty < 0 || nexty >= len(grid[0]) { + continue // 越界了,直接跳过 + } + if !visited[nextx][nexty] && grid[nextx][nexty] == 1 { // 没有访问过的 同时 是陆地的 + visited[nextx][nexty] = true + count++ + dfs(grid, visited, nextx, nexty) + } + } +} + +func main() { + var n, m int + fmt.Scan(&n, &m) + + grid := make([][]int, n) + for i := 0; i < n; i++ { + grid[i] = make([]int, m) + for j := 0; j < m; j++ { + fmt.Scan(&grid[i][j]) + } + } + + visited := make([][]bool, n) + for i := 0; i < n; i++ { + visited[i] = make([]bool, m) + } + + result := 0 + for i := 0; i < n; i++ { + for j := 0; j < m; j++ { + if !visited[i][j] && grid[i][j] == 1 { + count = 1 // 因为dfs处理下一个节点,所以这里遇到陆地了就先计数,dfs处理接下来的相邻陆地 + visited[i][j] = true + dfs(grid, visited, i, j) + if count > result { + result = count + } + } + } + } + + fmt.Println(result) +} + + + +``` + + + ### Rust ### Javascript @@ -420,6 +486,65 @@ const bfs = (graph, visited, x, y) => { ### PhP +``` php + += count($grid) || $nexty < 0 || $nexty >= count($grid[0])) continue; // 越界了,直接跳过 + if (!$visited[$nextx][$nexty] && $grid[$nextx][$nexty] == 1) { // 没有访问过的 同时 是陆地的 + $visited[$nextx][$nexty] = true; + $count++; + dfs($grid, $visited, $nextx, $nexty, $count, $dir); + } + } +} + +// Main function +function main() { + $input = trim(fgets(STDIN)); + list($n, $m) = explode(' ', $input); + + $grid = []; + for ($i = 0; $i < $n; $i++) { + $input = trim(fgets(STDIN)); + $grid[] = array_map('intval', explode(' ', $input)); + } + + $visited = []; + for ($i = 0; $i < $n; $i++) { + $visited[] = array_fill(0, $m, false); + } + + $result = 0; + $count = 0; + $dir = [[0, 1], [1, 0], [-1, 0], [0, -1]]; // 四个方向 + + for ($i = 0; $i < $n; $i++) { + for ($j = 0; $j < $m; $j++) { + if (!$visited[$i][$j] && $grid[$i][$j] == 1) { + $count = 1; // 因为dfs处理下一个节点,所以这里遇到陆地了就先计数,dfs处理接下来的相邻陆地 + $visited[$i][$j] = true; + dfs($grid, $visited, $i, $j, $count, $dir); // 将与其链接的陆地都标记上 true + $result = max($result, $count); + } + } + } + + echo $result . "\n"; +} + +main(); + +?> + + +``` + + ### Swift ### Scala From 1ccadf6ee5fcafa30d6df61e93420f4662b6d10e Mon Sep 17 00:00:00 2001 From: hakyurxinf <96514344+hakyurxinf@users.noreply.github.com> Date: Sat, 27 Jul 2024 14:46:21 +0800 Subject: [PATCH 2723/3019] =?UTF-8?q?Create=20107=E5=AF=BB=E6=89=BE?= =?UTF-8?q?=E5=AD=98=E5=9C=A8=E7=9A=84=E8=B7=AF=E5=BE=84Java=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...7\345\276\204Java\344\273\243\347\240\201" | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 "107\345\257\273\346\211\276\345\255\230\345\234\250\347\232\204\350\267\257\345\276\204Java\344\273\243\347\240\201" diff --git "a/107\345\257\273\346\211\276\345\255\230\345\234\250\347\232\204\350\267\257\345\276\204Java\344\273\243\347\240\201" "b/107\345\257\273\346\211\276\345\255\230\345\234\250\347\232\204\350\267\257\345\276\204Java\344\273\243\347\240\201" new file mode 100644 index 0000000000..7b83ca2622 --- /dev/null +++ "b/107\345\257\273\346\211\276\345\255\230\345\234\250\347\232\204\350\267\257\345\276\204Java\344\273\243\347\240\201" @@ -0,0 +1,56 @@ +JAVA: + +```Java + +import java.util.*; + +public class Main{ + public static void main(String[] args) { + int N, M; + Scanner scanner = new Scanner(System.in); + N = scanner.nextInt(); + M = scanner.nextInt(); + DisJoint disJoint = new DisJoint(N + 1); + for (int i = 0; i < M; ++i) { + disJoint.join(scanner.nextInt(), scanner.nextInt()); + } + if(disJoint.isSame(scanner.nextInt(), scanner.nextInt())) { + System.out.println("1"); + } else { + System.out.println("0"); + } + } + +} + +//并查集模板 +class DisJoint{ + private int[] father; + + public DisJoint(int N) { + father = new int[N]; + for (int i = 0; i < N; ++i){ + father[i] = i; + } + } + + public int find(int n) { + return n == father[n] ? n : (father[n] = find(father[n])); + } + + public void join (int n, int m) { + n = find(n); + m = find(m); + if (n == m) return; + father[m] = n; + } + + public boolean isSame(int n, int m){ + n = find(n); + m = find(m); + return n == m; + } + +} + +``` From 13c293e343d954ab0197d8cd8882b2fc374edbd8 Mon Sep 17 00:00:00 2001 From: dongxuhua Date: Sun, 28 Jul 2024 17:26:11 +0800 Subject: [PATCH 2724/3019] =?UTF-8?q?0098.=E6=89=80=E6=9C=89=E5=8F=AF?= =?UTF-8?q?=E8=BE=BE=E8=B7=AF=E5=BE=84=E5=A2=9E=E5=8A=A0Go=E8=A7=A3?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...57\350\276\276\350\267\257\345\276\204.md" | 119 ++++++++++++++++++ 1 file changed, 119 insertions(+) diff --git "a/problems/kamacoder/0098.\346\211\200\346\234\211\345\217\257\350\276\276\350\267\257\345\276\204.md" "b/problems/kamacoder/0098.\346\211\200\346\234\211\345\217\257\350\276\276\350\267\257\345\276\204.md" index 2d422a4f77..db35524ffd 100644 --- "a/problems/kamacoder/0098.\346\211\200\346\234\211\345\217\257\350\276\276\350\267\257\345\276\204.md" +++ "b/problems/kamacoder/0098.\346\211\200\346\234\211\345\217\257\350\276\276\350\267\257\345\276\204.md" @@ -605,6 +605,125 @@ if __name__ == "__main__": ``` ### Go +#### 邻接矩阵写法 +```go +package main + +import ( + "fmt" +) + +var result [][]int // 收集符合条件的路径 +var path []int // 1节点到终点的路径 + +func dfs(graph [][]int, x, n int) { + // 当前遍历的节点x 到达节点n + if x == n { // 找到符合条件的一条路径 + temp := make([]int, len(path)) + copy(temp, path) + result = append(result, temp) + return + } + for i := 1; i <= n; i++ { // 遍历节点x链接的所有节点 + if graph[x][i] == 1 { // 找到 x链接的节点 + path = append(path, i) // 遍历到的节点加入到路径中来 + dfs(graph, i, n) // 进入下一层递归 + path = path[:len(path)-1] // 回溯,撤销本节点 + } + } +} + +func main() { + var n, m int + fmt.Scanf("%d %d", &n, &m) + + // 节点编号从1到n,所以申请 n+1 这么大的数组 + graph := make([][]int, n+1) + for i := range graph { + graph[i] = make([]int, n+1) + } + + for i := 0; i < m; i++ { + var s, t int + fmt.Scanf("%d %d", &s, &t) + // 使用邻接矩阵表示无向图,1 表示 s 与 t 是相连的 + graph[s][t] = 1 + } + + path = append(path, 1) // 无论什么路径已经是从1节点出发 + dfs(graph, 1, n) // 开始遍历 + + // 输出结果 + if len(result) == 0 { + fmt.Println(-1) + } else { + for _, pa := range result { + for i := 0; i < len(pa)-1; i++ { + fmt.Print(pa[i], " ") + } + fmt.Println(pa[len(pa)-1]) + } + } +} +``` + +#### 邻接表写法 +```go +package main + +import ( + "fmt" +) + +var result [][]int +var path []int + +func dfs(graph [][]int, x, n int) { + if x == n { + temp := make([]int, len(path)) + copy(temp, path) + result = append(result, temp) + return + } + for _, i := range graph[x] { + path = append(path, i) + dfs(graph, i, n) + path = path[:len(path)-1] + } +} + +func main() { + var n, m int + fmt.Scanf("%d %d", &n, &m) + + graph := make([][]int, n+1) + for i := 0; i <= n; i++ { + graph[i] = make([]int, 0) + } + + for m > 0 { + var s, t int + fmt.Scanf("%d %d", &s, &t) + graph[s] = append(graph[s], t) + m-- + } + + path = append(path, 1) + dfs(graph, 1, n) + + if len(result) == 0 { + fmt.Println(-1) + } else { + for _, pa := range result { + for i := 0; i < len(pa)-1; i++ { + fmt.Print(pa[i], " ") + } + fmt.Println(pa[len(pa)-1]) + } + } +} +``` + ### Rust ### Javascript From c910803ed927f7f94068f1c9d7bdec045c8880ad Mon Sep 17 00:00:00 2001 From: wangya <1264178545@qq.com> Date: Mon, 29 Jul 2024 09:51:26 +0800 Subject: [PATCH 2725/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20=E5=8D=A1?= =?UTF-8?q?=E7=A0=81=E7=BD=910103.=E6=B0=B4=E6=B5=81=E9=97=AE=E9=A2=98=20J?= =?UTF-8?q?S=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...64\346\265\201\351\227\256\351\242\230.md" | 344 ++++++++++++++++++ 1 file changed, 344 insertions(+) diff --git "a/problems/kamacoder/0103.\346\260\264\346\265\201\351\227\256\351\242\230.md" "b/problems/kamacoder/0103.\346\260\264\346\265\201\351\227\256\351\242\230.md" index cc6e65aa68..b19e4778f1 100644 --- "a/problems/kamacoder/0103.\346\260\264\346\265\201\351\227\256\351\242\230.md" +++ "b/problems/kamacoder/0103.\346\260\264\346\265\201\351\227\256\351\242\230.md" @@ -362,6 +362,350 @@ public class Main { ### Javascript +#### 深搜 + +```javascript +const r1 = require('readline').createInterface({ input: process.stdin }); +// 创建readline接口 +let iter = r1[Symbol.asyncIterator](); +// 创建异步迭代器 +const readline = async () => (await iter.next()).value; + +let graph // 地图 +let N, M // 地图大小 +const dir = [[0, 1], [1, 0], [0, -1], [-1, 0]] //方向 + + +// 读取输入,初始化地图 +const initGraph = async () => { + let line = await readline(); + [N, M] = line.split(' ').map(Number); + graph = new Array(N).fill(0).map(() => new Array(M).fill(0)) + + for (let i = 0; i < N; i++) { + line = await readline() + line = line.split(' ').map(Number) + for (let j = 0; j < M; j++) { + graph[i][j] = line[j] + } + } +} + + +/** + * @description: 从(x,y)开始深度优先遍历地图 + * @param {*} graph 地图 + * @param {*} visited 可访问节点 + * @param {*} x 开始搜索节点的下标 + * @param {*} y 开始搜索节点的下标 + * @return {*} + */ +const dfs = (graph, visited, x, y) => { + if (visited[x][y]) return + visited[x][y] = true // 标记为可访问 + + for (let i = 0; i < 4; i++) { + let nextx = x + dir[i][0] + let nexty = y + dir[i][1] + if (nextx < 0 || nextx >= N || nexty < 0 || nexty >= M) continue //越界,跳过 + if (graph[x][y] < graph[nextx][nexty]) continue //不能流过.跳过 + dfs(graph, visited, nextx, nexty) + } +} + + +/** + * @description: 判断地图上的(x, y)是否可以到达第一组边界和第二组边界 + * @param {*} x 坐标 + * @param {*} y 坐标 + * @return {*} true可以到达,false不可以到达 + */ +const isResult = (x, y) => { + let visited = new Array(N).fill(false).map(() => new Array(M).fill(false)) + + let isFirst = false //是否可到达第一边界 + let isSecond = false //是否可到达第二边界 + + // 深搜,将(x, y)可到达的所有节点做标记 + dfs(graph, visited, x, y) + + // 判断能否到第一边界左边 + for (let i = 0; i < N; i++) { + if (visited[i][0]) { + isFirst = true + break + } + } + + // 判断能否到第一边界上边 + for (let j = 0; j < M; j++) { + if (visited[0][j]) { + isFirst = true + break + } + } + + // 判断能否到第二边界右边 + for (let i = 0; i < N; i++) { + if (visited[i][M - 1]) { + isSecond = true + break + } + } + + // 判断能否到第二边界下边 + for (let j = 0; j < M; j++) { + if (visited[N - 1][j]) { + isSecond = true + break + } + } + + return isFirst && isSecond +} + +(async function () { + + // 读取输入,初始化地图 + await initGraph() + + // 遍历地图,判断是否能到达第一组边界和第二组边界 + for (let i = 0; i < N; i++) { + for (let j = 0; j < M; j++) { + if (isResult(i, j)) console.log(i + ' ' + j); + } + } +})() +``` + + + +#### 广搜-解法一 + +```java +const r1 = require('readline').createInterface({ input: process.stdin }); +// 创建readline接口 +let iter = r1[Symbol.asyncIterator](); +// 创建异步迭代器 +const readline = async () => (await iter.next()).value; + +let graph // 地图 +let N, M // 地图大小 +const dir = [[0, 1], [1, 0], [0, -1], [-1, 0]] //方向 + + +// 读取输入,初始化地图 +const initGraph = async () => { + let line = await readline(); + [N, M] = line.split(' ').map(Number); + graph = new Array(N).fill(0).map(() => new Array(M).fill(0)) + + for (let i = 0; i < N; i++) { + line = await readline() + line = line.split(' ').map(Number) + for (let j = 0; j < M; j++) { + graph[i][j] = line[j] + } + } +} + + +/** + * @description: 从(x,y)开始广度优先遍历地图 + * @param {*} graph 地图 + * @param {*} visited 可访问节点 + * @param {*} x 开始搜索节点的下标 + * @param {*} y 开始搜索节点的下标 + * @return {*} + */ +const bfs = (graph, visited, x, y) => { + let queue = [] + queue.push([x, y]) + visited[x][y] = true + + while (queue.length) { + const [xx, yy] = queue.shift() + for (let i = 0; i < 4; i++) { + let nextx = xx + dir[i][0] + let nexty = yy + dir[i][1] + if (nextx < 0 || nextx >= N || nexty < 0 || nexty >= M) continue //越界, 跳过 + + // 可访问或者不能流过, 跳过 (注意这里是graph[xx][yy] < graph[nextx][nexty], 不是graph[x][y] < graph[nextx][nexty]) + if (visited[nextx][nexty] || graph[xx][yy] < graph[nextx][nexty]) continue + + queue.push([nextx, nexty]) + visited[nextx][nexty] = true + + } + } +} + + +/** + * @description: 判断地图上的(x, y)是否可以到达第一组边界和第二组边界 + * @param {*} x 坐标 + * @param {*} y 坐标 + * @return {*} true可以到达,false不可以到达 + */ +const isResult = (x, y) => { + let visited = new Array(N).fill(false).map(() => new Array(M).fill(false)) + + let isFirst = false //是否可到达第一边界 + let isSecond = false //是否可到达第二边界 + + // 深搜,将(x, y)可到达的所有节点做标记 + bfs(graph, visited, x, y) + + // console.log(visited); + + // 判断能否到第一边界左边 + for (let i = 0; i < N; i++) { + if (visited[i][0]) { + isFirst = true + break + } + } + + // 判断能否到第一边界上边 + for (let j = 0; j < M; j++) { + if (visited[0][j]) { + isFirst = true + break + } + } + + // 判断能否到第二边界右边 + for (let i = 0; i < N; i++) { + if (visited[i][M - 1]) { + isSecond = true + break + } + } + + // 判断能否到第二边界下边 + for (let j = 0; j < M; j++) { + if (visited[N - 1][j]) { + isSecond = true + break + } + } + + return isFirst && isSecond +} + +(async function () { + + // 读取输入,初始化地图 + await initGraph() + + // 遍历地图,判断是否能到达第一组边界和第二组边界 + for (let i = 0; i < N; i++) { + for (let j = 0; j < M; j++) { + if (isResult(i, j)) console.log(i + ' ' + j); + } + } +})() +``` + + + +#### 广搜-解法二 + +从第一边界和第二边界开始向高处流, 标记可以流到的位置, 两个边界都能到达的位置就是所求结果 + +```javascript + const r1 = require('readline').createInterface({ input: process.stdin }); + // 创建readline接口 + let iter = r1[Symbol.asyncIterator](); + // 创建异步迭代器 + const readline = async () => (await iter.next()).value; + + let graph // 地图 + let N, M // 地图大小 + const dir = [[0, 1], [1, 0], [0, -1], [-1, 0]] //方向 + + + // 读取输入,初始化地图 + const initGraph = async () => { + let line = await readline(); + [N, M] = line.split(' ').map(Number); + graph = new Array(N).fill(0).map(() => new Array(M).fill(0)) + + for (let i = 0; i < N; i++) { + line = await readline() + line = line.split(' ').map(Number) + for (let j = 0; j < M; j++) { + graph[i][j] = line[j] + } + } + } + + + /** + * @description: 从(x,y)开始广度优先遍历地图 + * @param {*} graph 地图 + * @param {*} visited 可访问节点 + * @param {*} x 开始搜索节点的下标 + * @param {*} y 开始搜索节点的下标 + * @return {*} + */ + const bfs = (graph, visited, x, y) => { + if(visited[x][y]) return + + let queue = [] + queue.push([x, y]) + visited[x][y] = true + + while (queue.length) { + const [xx, yy] = queue.shift() + for (let i = 0; i < 4; i++) { + let nextx = xx + dir[i][0] + let nexty = yy + dir[i][1] + if (nextx < 0 || nextx >= N || nexty < 0 || nexty >= M) continue //越界, 跳过 + + // 可访问或者不能流过, 跳过 (注意因为是从边界往高处流, 所以这里是graph[xx][yy] >= graph[nextx][nexty], 还要注意不是graph[xx][yy] >= graph[nextx][nexty]) + if (visited[nextx][nexty] || graph[xx][yy] >= graph[nextx][nexty]) continue + + queue.push([nextx, nexty]) + visited[nextx][nexty] = true + } + } + } + + (async function () { + + // 读取输入,初始化地图 + await initGraph() + + // 记录第一边界可到达的节点 + let firstBorder = new Array(N).fill(false).map(() => new Array(M).fill(false)) + + // 记录第二边界可到达的节点 + let secondBorder = new Array(N).fill(false).map(() => new Array(M).fill(false)) + + // 第一边界左边和第二边界右边 + for (let i = 0; i < N; i++) { + bfs(graph, firstBorder, i, 0) + bfs(graph, secondBorder, i, M - 1) + } + + // 第一边界上边和第二边界下边 + for (let j = 0; j < M; j++) { + bfs(graph, firstBorder, 0, j) + bfs(graph, secondBorder, N - 1, j) + } + + // 遍历地图,判断是否能到达第一组边界和第二组边界 + for (let i = 0; i < N; i++) { + for (let j = 0; j < M; j++) { + if (firstBorder[i][j] && secondBorder[i][j]) console.log(i + ' ' + j); + } + } + })() +``` + + + ### TypeScript ### PhP From 6fa4ad4a91d5cbc80a7d98035a763e1afd2054e7 Mon Sep 17 00:00:00 2001 From: markwang Date: Tue, 30 Jul 2024 09:35:12 +0800 Subject: [PATCH 2726/3019] =?UTF-8?q?455.=E5=88=86=E5=8F=91=E9=A5=BC?= =?UTF-8?q?=E5=B9=B2=E5=A2=9E=E5=8A=A0Go=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...06\345\217\221\351\245\274\345\271\262.md" | 39 +++++++++++++------ 1 file changed, 27 insertions(+), 12 deletions(-) diff --git "a/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" "b/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" index 9f59d3adfb..22dd7570c8 100644 --- "a/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" +++ "b/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" @@ -226,21 +226,36 @@ class Solution: ``` ### Go -```golang -//排序后,局部最优 + +版本一 大饼干优先 +```Go func findContentChildren(g []int, s []int) int { - sort.Ints(g) - sort.Ints(s) - - // 从小到大 - child := 0 - for sIdx := 0; child < len(g) && sIdx < len(s); sIdx++ { - if s[sIdx] >= g[child] {//如果饼干的大小大于或等于孩子的为空则给与,否则不给予,继续寻找选一个饼干是否符合 - child++ + sort.Ints(g) + sort.Ints(s) + index := len(s) - 1 + result := 0 + for i := len(g) - 1; i >= 0; i-- { + if index >= 0 && s[index] >= g[i] { + result++ + index-- + } } - } + return result +} +``` - return child +版本二 小饼干优先 +```Go +func findContentChildren(g []int, s []int) int { + sort.Ints(g) + sort.Ints(s) + index := 0 + for i := 0; i < len(s); i++ { + if index < len(g) && g[index] <= s[i] { + index++ + } + } + return index } ``` From 029fffcf367c9b46e9ddd949a69ca44a5949871c Mon Sep 17 00:00:00 2001 From: wangya <1264178545@qq.com> Date: Tue, 30 Jul 2024 09:52:42 +0800 Subject: [PATCH 2727/3019] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=20=E5=8D=A1?= =?UTF-8?q?=E7=A0=81=E7=BD=910109.=E5=86=97=E4=BD=99=E8=BF=9E=E6=8E=A5II?= =?UTF-8?q?=20=E8=A1=A8=E8=BF=B0=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0109.\345\206\227\344\275\231\350\277\236\346\216\245II.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/kamacoder/0109.\345\206\227\344\275\231\350\277\236\346\216\245II.md" "b/problems/kamacoder/0109.\345\206\227\344\275\231\350\277\236\346\216\245II.md" index 9c2f403941..916a2fd169 100644 --- "a/problems/kamacoder/0109.\345\206\227\344\275\231\350\277\236\346\216\245II.md" +++ "b/problems/kamacoder/0109.\345\206\227\344\275\231\350\277\236\346\216\245II.md" @@ -78,7 +78,7 @@ ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240527120531.png) -对于情况二,删掉构成环的边就可以了。 +对于情况三,删掉构成环的边就可以了。 ## 写代码 From fac95a0a430ae42ea682fc6a89dab9b2394230f1 Mon Sep 17 00:00:00 2001 From: Violet_Fu <156555169+iamziqian@users.noreply.github.com> Date: Mon, 29 Jul 2024 22:07:20 -0700 Subject: [PATCH 2728/3019] =?UTF-8?q?Update=201005.K=E6=AC=A1=E5=8F=96?= =?UTF-8?q?=E5=8F=8D=E5=90=8E=E6=9C=80=E5=A4=A7=E5=8C=96=E7=9A=84=E6=95=B0?= =?UTF-8?q?=E7=BB=84=E5=92=8C.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Java的版本二题解 --- ...04\346\225\260\347\273\204\345\222\214.md" | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git "a/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" "b/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" index fa27d3b7c3..4e04960098 100644 --- "a/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" +++ "b/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" @@ -128,6 +128,36 @@ class Solution { } } + +// 版本二:排序数组并贪心地尽可能将负数翻转为正数,再根据剩余的k值调整最小元素的符号,从而最大化数组的总和。 +class Solution { + public int largestSumAfterKNegations(int[] nums, int k) { + if (nums.length == 1) return nums[0]; + + // 排序:先把负数处理了 + Arrays.sort(nums); + + for (int i = 0; i < nums.length && k > 0; i++) { // 贪心点, 通过负转正, 消耗尽可能多的k + if (nums[i] < 0) { + nums[i] = -nums[i]; + k--; + } + } + + // 退出循环, k > 0 || k < 0 (k消耗完了不用讨论) + if (k % 2 == 1) { // k > 0 && k is odd:对于负数:负-正-负-正 + Arrays.sort(nums); // 再次排序得到剩余的负数,或者最小的正数 + nums[0] = -nums[0]; + } + // k > 0 && k is even,flip数字不会产生影响: 对于负数: 负-正-负;对于正数:正-负-正 + + int sum = 0; + for (int num : nums) { // 计算最大和 + sum += num; + } + return sum; + } +} ``` ### Python From 382053654cc322d845bbc4b9250270c8e6dee7d0 Mon Sep 17 00:00:00 2001 From: Charlie Yang <104724079+sxdtywm@users.noreply.github.com> Date: Tue, 30 Jul 2024 20:15:56 +0800 Subject: [PATCH 2729/3019] =?UTF-8?q?Update=200101.=E5=AD=A4=E5=B2=9B?= =?UTF-8?q?=E7=9A=84=E6=80=BB=E9=9D=A2=E7=A7=AF.md=20of=20other=20language?= =?UTF-8?q?s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Update 0101.孤岛的总面积.md of other languages --- ...04\346\200\273\351\235\242\347\247\257.md" | 162 ++++++++++++++++++ 1 file changed, 162 insertions(+) diff --git "a/problems/kamacoder/0101.\345\255\244\345\262\233\347\232\204\346\200\273\351\235\242\347\247\257.md" "b/problems/kamacoder/0101.\345\255\244\345\262\233\347\232\204\346\200\273\351\235\242\347\247\257.md" index a1793337f6..3faf784cf5 100644 --- "a/problems/kamacoder/0101.\345\255\244\345\262\233\347\232\204\346\200\273\351\235\242\347\247\257.md" +++ "b/problems/kamacoder/0101.\345\255\244\345\262\233\347\232\204\346\200\273\351\235\242\347\247\257.md" @@ -185,6 +185,77 @@ int main() { ### Java +``` java + +import java.util.*; + +public class Main { + private static int count = 0; + private static final int[][] dir = {{0, 1}, {1, 0}, {-1, 0}, {0, -1}}; // 四个方向 + + private static void bfs(int[][] grid, int x, int y) { + Queue que = new LinkedList<>(); + que.add(new int[]{x, y}); + grid[x][y] = 0; // 只要加入队列,立刻标记 + count++; + while (!que.isEmpty()) { + int[] cur = que.poll(); + int curx = cur[0]; + int cury = cur[1]; + for (int i = 0; i < 4; i++) { + int nextx = curx + dir[i][0]; + int nexty = cury + dir[i][1]; + if (nextx < 0 || nextx >= grid.length || nexty < 0 || nexty >= grid[0].length) continue; // 越界了,直接跳过 + if (grid[nextx][nexty] == 1) { + que.add(new int[]{nextx, nexty}); + count++; + grid[nextx][nexty] = 0; // 只要加入队列立刻标记 + } + } + } + } + + public static void main(String[] args) { + Scanner scanner = new Scanner(System.in); + int n = scanner.nextInt(); + int m = scanner.nextInt(); + int[][] grid = new int[n][m]; + + // 读取网格 + for (int i = 0; i < n; i++) { + for (int j = 0; j < m; j++) { + grid[i][j] = scanner.nextInt(); + } + } + + // 从左侧边,和右侧边向中间遍历 + for (int i = 0; i < n; i++) { + if (grid[i][0] == 1) bfs(grid, i, 0); + if (grid[i][m - 1] == 1) bfs(grid, i, m - 1); + } + + // 从上边和下边向中间遍历 + for (int j = 0; j < m; j++) { + if (grid[0][j] == 1) bfs(grid, 0, j); + if (grid[n - 1][j] == 1) bfs(grid, n - 1, j); + } + + count = 0; + for (int i = 0; i < n; i++) { + for (int j = 0; j < m; j++) { + if (grid[i][j] == 1) bfs(grid, i, j); + } + } + + System.out.println(count); + } +} + + + +``` + + ### Python ```python from collections import deque @@ -238,6 +309,97 @@ print(count) ``` ### Go +``` go + +package main + +import ( + "fmt" +) + +var count int +var dir = [4][2]int{{0, 1}, {1, 0}, {-1, 0}, {0, -1}} // 四个方向 + +func bfs(grid [][]int, x, y int) { + queue := [][2]int{{x, y}} + grid[x][y] = 0 // 只要加入队列,立刻标记 + count++ + + for len(queue) > 0 { + cur := queue[0] + queue = queue[1:] + curx, cury := cur[0], cur[1] + + for i := 0; i < 4; i++ { + nextx := curx + dir[i][0] + nexty := cury + dir[i][1] + + if nextx < 0 || nextx >= len(grid) || nexty < 0 || nexty >= len(grid[0]) { + continue // 越界了,直接跳过 + } + + if grid[nextx][nexty] == 1 { + queue = append(queue, [2]int{nextx, nexty}) + count++ + grid[nextx][nexty] = 0 // 只要加入队列立刻标记 + } + } + } +} + +func main() { + var n, m int + fmt.Scan(&n, &m) + + grid := make([][]int, n) + for i := range grid { + grid[i] = make([]int, m) + } + + for i := 0; i < n; i++ { + for j := 0; j < m; j++ { + fmt.Scan(&grid[i][j]) + } + } + + // 从左侧边,和右侧边向中间遍历 + for i := 0; i < n; i++ { + if grid[i][0] == 1 { + bfs(grid, i, 0) + } + if grid[i][m-1] == 1 { + bfs(grid, i, m-1) + } + } + + // 从上边和下边向中间遍历 + for j := 0; j < m; j++ { + if grid[0][j] == 1 { + bfs(grid, 0, j) + } + if grid[n-1][j] == 1 { + bfs(grid, n-1, j) + } + } + + // 清空之前的计数 + count = 0 + + // 遍历所有位置 + for i := 0; i < n; i++ { + for j := 0; j < m; j++ { + if grid[i][j] == 1 { + bfs(grid, i, j) + } + } + } + + fmt.Println(count) +} + + +``` + ### Rust ### Javascript From c49dd3b1595fe4b8e2adb991b0882a78774ca32f Mon Sep 17 00:00:00 2001 From: Violet_Fu <156555169+iamziqian@users.noreply.github.com> Date: Tue, 30 Jul 2024 13:21:10 -0700 Subject: [PATCH 2730/3019] =?UTF-8?q?Update=200134.=E5=8A=A0=E6=B2=B9?= =?UTF-8?q?=E7=AB=99.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 0134.加油站的Java解法三 --- ...4.\345\212\240\346\262\271\347\253\231.md" | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git "a/problems/0134.\345\212\240\346\262\271\347\253\231.md" "b/problems/0134.\345\212\240\346\262\271\347\253\231.md" index c88b43b199..1329bd9a73 100644 --- "a/problems/0134.\345\212\240\346\262\271\347\253\231.md" +++ "b/problems/0134.\345\212\240\346\262\271\347\253\231.md" @@ -249,6 +249,29 @@ class Solution { } } ``` +``` +// 解法3 +class Solution { + public int canCompleteCircuit(int[] gas, int[] cost) { + int tank = 0; // 当前油量 + int totalGas = 0; // 总加油量 + int totalCost = 0; // 总油耗 + int start = 0; // 起点 + for (int i = 0; i < gas.length; i++) { + totalGas += gas[i]; + totalCost += cost[i]; + + tank += gas[i] - cost[i]; + if (tank < 0) { // tank 变为负数 意味着 从0到i之间出发都不能顺利环路一周,因为在此i点必会没油 + tank = 0; // reset tank,类似于题目53.最大子树和reset sum + start = i + 1; // 起点变为i点往后一位 + } + } + if (totalCost > totalGas) return -1; + return start; + } +} +``` ### Python 暴力法 From bf846e4a25e8952fb4d65cbf4ff8b2a46f3dc968 Mon Sep 17 00:00:00 2001 From: wangya <1264178545@qq.com> Date: Wed, 31 Jul 2024 09:39:45 +0800 Subject: [PATCH 2731/3019] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=20=E5=8D=A1?= =?UTF-8?q?=E7=A0=81=E7=BD=910053.=E5=AF=BB=E5=AE=9D-Kruskal=20=E8=A1=A8?= =?UTF-8?q?=E8=BF=B0=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0053.\345\257\273\345\256\235-Kruskal.md" | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git "a/problems/kamacoder/0053.\345\257\273\345\256\235-Kruskal.md" "b/problems/kamacoder/0053.\345\257\273\345\256\235-Kruskal.md" index e8b8e1ffd3..fb816fb1af 100644 --- "a/problems/kamacoder/0053.\345\257\273\345\256\235-Kruskal.md" +++ "b/problems/kamacoder/0053.\345\257\273\345\256\235-Kruskal.md" @@ -38,7 +38,7 @@ 5 6 2 5 7 1 6 7 1 -``` +``` 输出示例: @@ -79,7 +79,7 @@ kruscal的思路: ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240111114204.png) --------- +-------- 选边(4,5),节点4 和 节点 5 不在同一个集合,生成树可以添加边(4,5) ,并将节点4,节点5 放到同一个集合。 @@ -87,7 +87,7 @@ kruscal的思路: **大家判断两个节点是否在同一个集合,就看图中两个节点是否有绿色的粗线连着就行** ------- +------ (这里在强调一下,以下选边是按照上面排序好的边的数组来选择的) @@ -95,13 +95,13 @@ kruscal的思路: ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240112105834.png) ---------- +--------- 选边(2,6),节点2 和 节点6 不在同一个集合,生成树添加边(2,6),并将节点2,节点6 放到同一个集合。 ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240112110214.png) --------- +-------- 选边(3,4),节点3 和 节点4 不在同一个集合,生成树添加边(3,4),并将节点3,节点4 放到同一个集合。 @@ -113,7 +113,7 @@ kruscal的思路: ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240112110637.png) ------------ +----------- 选边(5,7),节点5 和 节点7 在同一个集合,不做计算。 @@ -122,7 +122,7 @@ kruscal的思路: 后面遍历 边(3,2),(2,4),(5,6) 同理,都因两个节点已经在同一集合,不做计算。 -------- +------- 此时 我们就已经生成了一个最小生成树,即: @@ -230,7 +230,7 @@ int main() { 如果题目要求将最小生成树的边输出的话,应该怎么办呢? -Kruskal 算法 输出边的话,相对prim 要容易很多,因为 Kruskal 本来就是直接操作边,边的结构自然清晰,不用像 prim一样 需要再节点练成线输出边 (因为prim是对节点操作,而 Kruskal是对边操作,这是本质区别) +Kruskal 算法 输出边的话,相对prim 要容易很多,因为 Kruskal 本来就是直接操作边,边的结构自然清晰,不用像 prim一样 需要再将节点连成线输出边 (因为prim是对节点操作,而 Kruskal是对边操作,这是本质区别) 本题中,边的结构为: From 573cfcf3c00dd19b4dd4e1f275bb14c3d9f6acb1 Mon Sep 17 00:00:00 2001 From: DengTao <54075362+only-tao@users.noreply.github.com> Date: Wed, 31 Jul 2024 13:51:43 +0800 Subject: [PATCH 2732/3019] =?UTF-8?q?Update=2020201017=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=A0=91=E5=91=A8=E6=9C=AB=E6=80=BB=E7=BB=93.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 这里应该是"全局变量"吧 --- ...\240\221\345\221\250\346\234\253\346\200\273\347\273\223.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20201017\344\272\214\345\217\211\346\240\221\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20201017\344\272\214\345\217\211\346\240\221\345\221\250\346\234\253\346\200\273\347\273\223.md" index bbb14502c0..03148b1575 100644 --- "a/problems/\345\221\250\346\200\273\347\273\223/20201017\344\272\214\345\217\211\346\240\221\345\221\250\346\234\253\346\200\273\347\273\223.md" +++ "b/problems/\345\221\250\346\200\273\347\273\223/20201017\344\272\214\345\217\211\346\240\221\345\221\250\346\234\253\346\200\273\347\273\223.md" @@ -40,7 +40,7 @@ * 陷阱二 -在一个有序序列求最值的时候,不要定义一个全局遍历,然后遍历序列更新全局变量求最值。因为最值可能就是int 或者 longlong的最小值。 +在一个有序序列求最值的时候,不要定义一个全局变量,然后遍历序列更新全局变量求最值。因为最值可能就是int 或者 longlong的最小值。 推荐要通过前一个数值(pre)和后一个数值比较(cur),得出最值。 From e0237b5b4f151e84762d66280f464effe48f440d Mon Sep 17 00:00:00 2001 From: markwang Date: Wed, 31 Jul 2024 14:39:37 +0800 Subject: [PATCH 2733/3019] =?UTF-8?q?134.=E5=8A=A0=E6=B2=B9=E7=AB=99?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0Go=E8=B4=AA=E5=BF=83=E7=AE=97=E6=B3=95?= =?UTF-8?q?=EF=BC=88=E6=96=B9=E6=B3=95=E4=B8=80=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...4.\345\212\240\346\262\271\347\253\231.md" | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git "a/problems/0134.\345\212\240\346\262\271\347\253\231.md" "b/problems/0134.\345\212\240\346\262\271\347\253\231.md" index 1329bd9a73..7ac9f0f933 100644 --- "a/problems/0134.\345\212\240\346\262\271\347\253\231.md" +++ "b/problems/0134.\345\212\240\346\262\271\347\253\231.md" @@ -345,6 +345,37 @@ class Solution: ``` ### Go + +贪心算法(方法一) +```go +func canCompleteCircuit(gas []int, cost []int) int { + curSum := 0 + min := math.MaxInt64 + for i := 0; i < len(gas); i++ { + rest := gas[i] - cost[i] + curSum += rest + if curSum < min { + min = curSum + } + } + if curSum < 0 { + return -1 + } + if min >= 0 { + return 0 + } + for i := len(gas) - 1; i > 0; i-- { + rest := gas[i] - cost[i] + min += rest + if min >= 0 { + return i + } + } + return -1 +} +``` + +贪心算法(方法二) ```go func canCompleteCircuit(gas []int, cost []int) int { curSum := 0 From d1be6070c23c883d3d606397edb9bc923e639a5e Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Thu, 1 Aug 2024 10:25:20 +0800 Subject: [PATCH 2734/3019] Update --- ...\211\251\350\277\220\350\276\223I-SPFA.md" | 34 +- ...11\347\217\240\344\272\222\346\226\245.md" | 44 +- ...14\345\220\214\350\212\261\351\241\272.md" | 69 ++ ...9.\345\245\275\346\225\260\347\273\204.md" | 52 +- ...65\347\232\204\346\235\203\345\200\274.md" | 54 +- ...47\241\20001\350\203\214\345\214\205-1.md" | 623 ++++++------------ ...47\241\20001\350\203\214\345\214\205-2.md" | 393 +++++------ 7 files changed, 603 insertions(+), 666 deletions(-) rename "problems/kamacoder/\345\245\275\346\225\260\347\273\204.md" => "problems/kamacoder/0149.\345\245\275\346\225\260\347\273\204.md" (52%) diff --git "a/problems/kamacoder/0094.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I-SPFA.md" "b/problems/kamacoder/0094.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I-SPFA.md" index 2480b12c0a..5fe06d349d 100644 --- "a/problems/kamacoder/0094.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I-SPFA.md" +++ "b/problems/kamacoder/0094.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I-SPFA.md" @@ -158,16 +158,11 @@ 边:节点5 -> 节点6,权值为-2 ,minDist[6] > minDist[5] + (-2) ,更新 minDist[6] = minDist[5] + (-2) = 3 - 2 = 1 -如图: - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240412110509.png) - +如图,将节点3加入队列,因为节点6已经在队列里,所以不用重复添加 +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240729161116.png) -因为节点3 和 节点6 都曾经加入过队列,不用重复加入,避免重复计算。 - -在代码中我们可以用一个数组 visited 来记录入过队列的元素,加入过队列的元素,不再重复入队列。 - +所以我们在加入队列的过程可以有一个优化,用visited数组记录已经加入队列的元素,已经在队列的元素不用重复加入 -------------- @@ -175,11 +170,12 @@ 节点6作为终点,没有可以出发的边。 +同理从队列中取出节点3,也没有可以出发的边 + 所以直接从队列中取出,如图: ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240411115424.png) - ---------- 这样我们就完成了基于队列优化的bellman_ford的算法模拟过程。 @@ -190,12 +186,12 @@ 在上面模拟过程中,我们每次都要知道 一个节点作为出发点连接了哪些节点。 -如果想方便知道这些数据,就需要使用邻接表来存储这个图,如果对于邻接表不了解的话,可以看 [kama0047.参会dijkstra堆](./kama0047.参会dijkstra堆.md) 中 图的存储 部分。 +如果想方便知道这些数据,就需要使用邻接表来存储这个图,如果对于邻接表不了解的话,可以看 [kama0047.参会dijkstra堆](./0047.参会dijkstra堆.md) 中 图的存储 部分。 整体代码如下: -```CPP +``` #include #include #include @@ -215,7 +211,9 @@ int main() { int n, m, p1, p2, val; cin >> n >> m; - vector> grid(n + 1); // 邻接表 + vector> grid(n + 1); + + vector isInQueue(n + 1); // 加入优化,已经在队里里的元素不用重复添加 // 将所有边保存起来 for(int i = 0; i < m; i++){ @@ -230,24 +228,26 @@ int main() { minDist[start] = 0; queue que; - que.push(start); // 队列里放入起点 + que.push(start); while (!que.empty()) { int node = que.front(); que.pop(); - + isInQueue[node] = false; // 从队列里取出的时候,要取消标记 for (Edge edge : grid[node]) { int from = node; int to = edge.to; int value = edge.val; if (minDist[to] > minDist[from] + value) { // 开始松弛 - minDist[to] = minDist[from] + value; - que.push(to); + minDist[to] = minDist[from] + value; + if (isInQueue[to] == false) { // 已经在队列里的元素不用重复添加 + que.push(to); + isInQueue[to] = true; + } } } } - if (minDist[end] == INT_MAX) cout << "unconnected" << endl; // 不能到达终点 else cout << minDist[end] << endl; // 到达终点最短路径 } diff --git "a/problems/kamacoder/0147.\344\270\211\347\217\240\344\272\222\346\226\245.md" "b/problems/kamacoder/0147.\344\270\211\347\217\240\344\272\222\346\226\245.md" index ed14b3ce26..2ef5d39291 100644 --- "a/problems/kamacoder/0147.\344\270\211\347\217\240\344\272\222\346\226\245.md" +++ "b/problems/kamacoder/0147.\344\270\211\347\217\240\344\272\222\346\226\245.md" @@ -1,11 +1,12 @@ +# 三珠互斥 + 1. 如果k * 3 大于 n 了,那说明一定没结果,如果没想明白,大家举个例子试试看 2. 分别求出三个红珠子之间的距离 3. 对这三段距离从小到大排序 y1, y2, y3 4. 如果第一段距离y1 小于k,说明需要交换 k - y 次, 同理 第二段距离y2 小于k,说明需要交换 k - y2 次 5. y1 y2 都调整好了,不用计算y3,因为 y3是距离最大 - ```CPP #include using namespace std; @@ -29,12 +30,49 @@ int main(){ sort(dis.begin(), dis.end()); int result = 0; - if (dis[0] < k) result += (k - dis[0]); if (dis[1] < k) result += (k - dis[1]); - + cout << result << endl; } return 0; } ``` + +Java代码: + +```Java +import java.util.*; + +public class Main { + public static void main(String[] args) { + Scanner scanner = new Scanner(System.in); + int t = scanner.nextInt(); + + while (t-- > 0) { + int n = scanner.nextInt(); + int k = scanner.nextInt(); + int a1 = scanner.nextInt(); + int a2 = scanner.nextInt(); + int a3 = scanner.nextInt(); + if (k * 3 > n) { + System.out.println(-1); + continue; + } + + List dis = new ArrayList<>(3); + dis.add(Math.min(Math.abs(a1 - a2), n - Math.abs(a1 - a2))); + dis.add(Math.min(Math.abs(a1 - a3), n - Math.abs(a1 - a3))); + dis.add(Math.min(Math.abs(a3 - a2), n - Math.abs(a3 - a2))); + + Collections.sort(dis); + + int result = 0; + if (dis.get(0) < k) result += (k - dis.get(0)); + if (dis.get(1) < k) result += (k - dis.get(1)); + + System.out.println(result); + } + } +} +``` diff --git "a/problems/kamacoder/0148.\346\211\221\345\205\213\347\211\214\345\220\214\350\212\261\351\241\272.md" "b/problems/kamacoder/0148.\346\211\221\345\205\213\347\211\214\345\220\214\350\212\261\351\241\272.md" index b5d27a24f6..cf8d325fba 100644 --- "a/problems/kamacoder/0148.\346\211\221\345\205\213\347\211\214\345\220\214\350\212\261\351\241\272.md" +++ "b/problems/kamacoder/0148.\346\211\221\345\205\213\347\211\214\345\220\214\350\212\261\351\241\272.md" @@ -1,4 +1,6 @@ +# 扑克牌同花顺 + 首先我们要定义一个结构体,来存放我们的数据 `map<花色,{同一花色牌集合,同一花色的牌对应的牌数量}>` @@ -51,3 +53,70 @@ int main() { cout << sum << endl; } ``` + +Java代码如下: + +```Java + +import java.util.*; + +public class Main { + static String[] cards = {"H", "S", "D", "C"}; // 花色数组 + + static class Color { + Set st; // 同一花色牌的集合 + Map cnt; // 同一花色牌对应的数量 + + Color() { + st = new HashSet<>(); // 初始化集合 + cnt = new HashMap<>(); // 初始化映射 + } + } + + static Map umap = new HashMap<>(); // 用于存储每种花色对应的Color对象 + + public static void main(String[] args) { + Scanner scanner = new Scanner(System.in); + int n = scanner.nextInt(); // 读取牌的数量 + + for (int i = 0; i < n; i++) { + int x = scanner.nextInt(); // 读取牌的值 + int y = scanner.nextInt(); // 读取牌的数量 + String card = scanner.next(); // 读取牌的花色 + + umap.putIfAbsent(card, new Color()); // 如果不存在该花色,则创建一个新的Color对象 + umap.get(card).st.add(x); // 将牌的值加入集合 + umap.get(card).cnt.put(x, umap.get(card).cnt.getOrDefault(x, 0L) + y); // 更新牌的数量 + } + + long sum = 0; // 结果累加器 + + // 遍历每一种花色 + for (String cardOne : cards) { + Color colorOne = umap.getOrDefault(cardOne, new Color()); // 获取对应花色的Color对象 + + // 遍历同花色的每一张牌 + for (int number : colorOne.st) { + long numberCount = colorOne.cnt.get(number); // 获取当前牌的数量 + + // 计算从当前牌到number+4的最小数量 + long cal = numberCount; + for (int j = number + 1; j <= number + 4; j++) { + cal = Math.min(cal, colorOne.cnt.getOrDefault(j, 0L)); // 更新cal为最小值 + } + + // 将结果累加到sum + sum += cal; + + // 将统计过的同花顺数量减去 + for (int j = number + 1; j <= number + 4; j++) { + colorOne.cnt.put(j, colorOne.cnt.getOrDefault(j, 0L) - cal); + } + } + } + + System.out.println(sum); // 输出结果 + } +} + +``` diff --git "a/problems/kamacoder/\345\245\275\346\225\260\347\273\204.md" "b/problems/kamacoder/0149.\345\245\275\346\225\260\347\273\204.md" similarity index 52% rename from "problems/kamacoder/\345\245\275\346\225\260\347\273\204.md" rename to "problems/kamacoder/0149.\345\245\275\346\225\260\347\273\204.md" index 55853fa86c..09088168bc 100644 --- "a/problems/kamacoder/\345\245\275\346\225\260\347\273\204.md" +++ "b/problems/kamacoder/0149.\345\245\275\346\225\260\347\273\204.md" @@ -1,6 +1,7 @@ +# 149. 好数组 -算是贪心 +贪心思路: 整体思路是移动到中间位置(中位数),一定是 移动次数最小的。 @@ -11,9 +12,7 @@ 代码如下: ```CPP - #include - using namespace std; int main() { @@ -54,3 +53,50 @@ int main() { return 0; } ``` + +Java代码如下: + +```Java + +import java.util.*; + +public class Main { + public static void main(String[] args) { + Scanner scanner = new Scanner(System.in); + int n = scanner.nextInt(); + long[] arr = new long[n]; + for (int i = 0; i < n; ++i) { + arr[i] = scanner.nextLong(); + } + Arrays.sort(arr); + + if (arr[0] == arr[n - 1]) { + System.out.println(1); + return; + } + long cnt = 0L; + long cnt1 = 0L; + + // 如果要保留一个不改变,要不不改最小的,要不不改最大的。 + + // 取中间偏前的位置 + long mid = arr[(n - 2) / 2]; + + // 不改最大的 + for (int i = 0; i < n - 1; i++) { + cnt += Math.abs(arr[i] - mid); + } + + // 取中间偏后的位置 + mid = arr[n / 2]; + + // 不改最小的 + for (int i = 1; i < n; i++) { + cnt1 += Math.abs(arr[i] - mid); + } + + System.out.println(Math.min(cnt, cnt1)); + } +} + +``` diff --git "a/problems/kamacoder/0150.\346\236\201\351\225\277\350\277\236\347\273\255\346\256\265\347\232\204\346\235\203\345\200\274.md" "b/problems/kamacoder/0150.\346\236\201\351\225\277\350\277\236\347\273\255\346\256\265\347\232\204\346\235\203\345\200\274.md" index 25fbd78128..503d6a23ac 100644 --- "a/problems/kamacoder/0150.\346\236\201\351\225\277\350\277\236\347\273\255\346\256\265\347\232\204\346\235\203\345\200\274.md" +++ "b/problems/kamacoder/0150.\346\236\201\351\225\277\350\277\236\347\273\255\346\256\265\347\232\204\346\235\203\345\200\274.md" @@ -1,21 +1,7 @@ +# 150. 极长连续段的权值 -按照动态规划的思路,每增加一位,对已有结果会有什么变化呢? - -输入 字符串s 里面有 0 和 1 - -我们先计算出 s[i-1] 的 子串权值和 a - -如果 s[i] 和 s[i - 1] 相同 - -下标0 到 i 这段字符串 的子串权值和就是 a + 1,即算上s[i]本身的连续串数量加上 - -如果 s[i] 和 s[i - 1] 不相同 - - - - - +动态规划,枚举最后边节点的情况: ```CPP #include @@ -32,9 +18,11 @@ int main() { long long a = 1; for (int i = 1; i < n; ++i) { + // 加上本身长度为1的子串 if (s[i] == s[i - 1]) { a += 1; - result += a; + result += a; + // 以最右节点为终点,每个子串的级长连续段都+1,再加本身长度为1的子串 } else { a = a + i + 1; result += a; @@ -44,3 +32,35 @@ int main() { return 0; } ``` + +Java代码如下: + +```Java +import java.util.Scanner; + +public class Main { + public static void main(String[] args) { + Scanner scanner = new Scanner(System.in); + int n = scanner.nextInt(); + String s = scanner.next(); + + long result = 1; + long a = 1; + + for (int i = 1; i < n; ++i) { + // 加上本身长度为1的子串 + if (s.charAt(i) == s.charAt(i - 1)) { + a += 1; + result += a; + // 以最右节点为终点,每个子串的级长连续段都+1,再加本身长度为1的子串 + } else { + a = a + i + 1; + result += a; + } + } + + System.out.println(result); + } +} + +``` diff --git "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" index fa11fb94bc..0c78e3f695 100644 --- "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" +++ "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" @@ -17,21 +17,15 @@ ## 思路 +正式开始讲解背包问题! -这周我们正式开始讲解背包问题! - -背包问题的经典资料当然是:背包九讲。在公众号「代码随想录」后台回复:背包九讲,就可以获得背包九讲的pdf。 - -但说实话,背包九讲对于小白来说确实不太友好,看起来还是有点费劲的,而且都是伪代码理解起来也吃力。 - -对于面试的话,其实掌握01背包,和完全背包,就够用了,最多可以再来一个多重背包。 +对于面试的话,其实掌握01背包和完全背包,就够用了,最多可以再来一个多重背包。 如果这几种背包,分不清,我这里画了一个图,如下: ![416.分割等和子集1](https://code-thinking-1253855093.file.myqcloud.com/pics/20210117171307407.png) - -至于背包九讲其他背包,面试几乎不会问,都是竞赛级别的了,leetcode上连多重背包的题目都没有,所以题库也告诉我们,01背包和完全背包就够用了。 +除此以外其他类型的背包,面试几乎不会问,都是竞赛级别的了,leetcode上连多重背包的题目都没有,所以题库也告诉我们,01背包和完全背包就够用了。 而完全背包又是也是01背包稍作变化而来,即:完全背包的物品数量是无限的。 @@ -53,7 +47,7 @@ leetcode上没有纯01背包的问题,都是01背包应用方面的题目, 这样其实是没有从底向上去思考,而是习惯性想到了背包,那么暴力的解法应该是怎么样的呢? -每一件物品其实只有两个状态,取或者不取,所以可以使用回溯法搜索出所有的情况,那么时间复杂度就是$o(2^n)$,这里的n表示物品数量。 +每一件物品其实只有两个状态,取或者不取,所以可以使用回溯法搜索出所有的情况,那么时间复杂度就是O(2^n),这里的n表示物品数量。 **所以暴力的解法是指数级别的时间复杂度。进而才需要动态规划的解法来进行优化!** @@ -73,30 +67,111 @@ leetcode上没有纯01背包的问题,都是01背包应用方面的题目, 以下讲解和图示中出现的数字都是以这个例子为例。 + ### 二维dp数组01背包 依然动规五部曲分析一波。 1. 确定dp数组以及下标的含义 -对于背包问题,有一种写法, 是使用二维数组,即**dp[i][j] 表示从下标为[0-i]的物品里任意取,放进容量为j的背包,价值总和最大是多少**。 +我们需要使用二维数组,为什么呢? + +因为有两个维度需要表示,分别是:物品 和 背包容量 -只看这个二维数组的定义,大家一定会有点懵,看下面这个图: +如图,二维数组为 dp[i][j]。 ![动态规划-背包问题1](https://code-thinking-1253855093.file.myqcloud.com/pics/20210110103003361.png) +那么这里 i 、j、dp[i][j] 分别表示什么呢? + +i 来表示物品、j表示背包容量。 + +(如果想用j 表示物品,j表示背包容量 行不行? 都可以的,个人习惯而已) + +我们来尝试把上面的 二维表格填写一下。 + +动态规划的思路是根据子问题的求解推导出整体的最优解。 + +我们先看把物品0 放入背包的情况: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240730113455.png) + +背包容量为0,放不下物品0,此时背包里的价值为0。 + +背包容量为1,可以放下物品0,此时背包里的价值为15. + +背包容量为2,依然可以放下物品0 (注意 01背包里物品只有一个),此时背包里的价值为15。 + +以此类推。 + +再看把物品1 放入背包: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240730114228.png) + +背包容量为 0,放不下物品0 或者物品1,此时背包里的价值为0。 + +背包容量为 1,只能放下物品1,背包里的价值为15。 + +背包容量为 2,只能放下物品1,背包里的价值为15。 + +背包容量为 3,上一行同一状态,背包只能放物品0,这次也可以选择物品1了,背包可以放物品2 或者 物品1,物品2价值更大,背包里的价值为20。 + +背包容量为 4,上一行同一状态,背包只能放物品0,这次也可以选择物品1了,背包都可都放下,背包价值为35。 + +以上举例,是比较容易看懂,我主要是通过这个例子,来帮助大家明确dp数组的含义。 + +上图中,我们看 dp[1][4] 表示什么意思呢。 + +任取 物品0,物品1 放进容量为4的背包里,最大价值是 dp[1][4]。 + +通过这个举例,我们来进一步明确dp数组的含义。 + +即**dp[i][j] 表示从下标为[0-i]的物品里任意取,放进容量为j的背包,价值总和最大是多少**。 + **要时刻记着这个dp数组的含义,下面的一些步骤都围绕这dp数组的含义进行的**,如果哪里看懵了,就来回顾一下i代表什么,j又代表什么。 2. 确定递推公式 -再回顾一下dp[i][j]的含义:从下标为[0-i]的物品里任意取,放进容量为j的背包,价值总和最大是多少。 +这里在把基本信息给出来: + +| | 重量 | 价值 | +| ----- | ---- | ---- | +| 物品0 | 1 | 15 | +| 物品1 | 3 | 20 | +| 物品2 | 4 | 30 | + +对于递推公式,首先我们要明确有哪些方向可以推导出 dp[i][j]。 + +这里我们dp[1][4]的状态来举例: + +绝对 dp[1][4],就是放物品1 ,还是不放物品1。 + +如果不放物品1, 那么背包的价值应该是 dp[0][4] 即 容量为4的背包,只放物品0的情况。 + +推导方向如图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240730174246.png) -那么可以有两个方向推出来dp[i][j], -* **不放物品i**:由dp[i - 1][j]推出,即背包容量为j,里面不放物品i的最大价值,此时dp[i][j]就是dp[i - 1][j]。(其实就是当物品i的重量大于背包j的重量时,物品i无法放进背包中,所以背包内的价值依然和前面相同。) +如果放物品1, **那么背包要先留出物品1的容量**,目前容量是4,物品1 需要重量为3,此时背包剩下容量为1。 + +容量为1,只考虑放物品0 的最大价值是 dp[0][1],这个值我们之前就计算过。 + +所以 放物品1 的情况 = dp[0][1] + 物品1 的重量,推导方向如图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240730174436.png) + +两种情况,分别是放物品1 和 不放物品1,我们要取最大值(毕竟求的是最大价值) + +`dp[1][4] = max(dp[0][4], dp[0][1] + 物品1 的重量) ` + +以上过程,抽象化如下: + +* **不放物品i**:由dp[i - 1][j]推出,即背包容量为j,里面不放物品i的最大价值,此时dp[i][j]就是dp[i - 1][j]。 + * **放物品i**:由dp[i - 1][j - weight[i]]推出,dp[i - 1][j - weight[i]] 为背包容量为j - weight[i]的时候不放物品i的最大价值,那么dp[i - 1][j - weight[i]] + value[i] (物品i的价值),就是背包放物品i得到的最大价值 -所以递归公式: dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]); +递归公式: `dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);` 3. dp数组如何初始化 @@ -108,13 +183,13 @@ leetcode上没有纯01背包的问题,都是01背包应用方面的题目, 在看其他情况。 -状态转移方程 dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]); 可以看出i 是由 i-1 推导出来,那么i为0的时候就一定要初始化。 +状态转移方程 `dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);` 可以看出i 是由 i-1 推导出来,那么i为0的时候就一定要初始化。 dp[0][j],即:i为0,存放编号0的物品的时候,各个容量的背包所能存放的最大价值。 -那么很明显当 j < weight[0]的时候,dp[0][j] 应该是 0,因为背包容量比编号0的物品重量还小。 +那么很明显当 `j < weight[0]`的时候,dp[0][j] 应该是 0,因为背包容量比编号0的物品重量还小。 -当j >= weight[0]时,dp[0][j] 应该是value[0],因为背包容量放足够放编号0物品。 +当`j >= weight[0]`时,dp[0][j] 应该是value[0],因为背包容量放足够放编号0物品。 代码初始化如下: @@ -147,7 +222,7 @@ dp[0][j] 和 dp[i][0] 都已经初始化了,那么其他下标应该初始化 最后初始化代码如下: -``` +```CPP // 初始化 dp vector> dp(weight.size(), vector(bagweight + 1, 0)); for (int j = weight[0]; j <= bagweight; j++) { @@ -171,7 +246,7 @@ for (int j = weight[0]; j <= bagweight; j++) { 那么我先给出先遍历物品,然后遍历背包重量的代码。 -``` +```CPP // weight数组的大小 就是物品个数 for(int i = 1; i < weight.size(); i++) { // 遍历物品 for(int j = 0; j <= bagweight; j++) { // 遍历背包容量 @@ -186,7 +261,7 @@ for(int i = 1; i < weight.size(); i++) { // 遍历物品 例如这样: -``` +```CPP // weight数组的大小 就是物品个数 for(int j = 0; j <= bagweight; j++) { // 遍历背包容量 for(int i = 1; i < weight.size(); i++) { // 遍历物品 @@ -200,7 +275,7 @@ for(int j = 0; j <= bagweight; j++) { // 遍历背包容量 **要理解递归的本质和递推的方向**。 -dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]); 递归公式中可以看出dp[i][j]是靠dp[i-1][j]和dp[i - 1][j - weight[i]]推导出来的。 +`dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);` 递归公式中可以看出dp[i][j]是靠dp[i-1][j]和dp[i - 1][j - weight[i]]推导出来的。 dp[i-1][j]和dp[i - 1][j - weight[i]] 都在dp[i][j]的左上角方向(包括正上方向),那么先遍历物品,再遍历背包的过程如图所示: @@ -232,50 +307,20 @@ dp[i-1][j]和dp[i - 1][j - weight[i]] 都在dp[i][j]的左上角方向(包括 主要就是自己没有动手推导一下dp数组的演变过程,如果推导明白了,代码写出来就算有问题,只要把dp数组打印出来,对比一下和自己推导的有什么差异,很快就可以发现问题了。 -```cpp -void test_2_wei_bag_problem1() { - vector weight = {1, 3, 4}; - vector value = {15, 20, 30}; - int bagweight = 4; - - // 二维数组 - vector> dp(weight.size(), vector(bagweight + 1, 0)); - - // 初始化 - for (int j = weight[0]; j <= bagweight; j++) { - dp[0][j] = value[0]; - } - - // weight数组的大小 就是物品个数 - for(int i = 1; i < weight.size(); i++) { // 遍历物品 - for(int j = 0; j <= bagweight; j++) { // 遍历背包容量 - if (j < weight[i]) dp[i][j] = dp[i - 1][j]; - else dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]); - - } - } - - cout << dp[weight.size() - 1][bagweight] << endl; -} - -int main() { - test_2_wei_bag_problem1(); -} - -``` - 本题力扣上没有原题,大家可以去[卡码网第46题](https://kamacoder.com/problempage.php?pid=1046)去练习,题意是一样的,代码如下: ```CPP - -//二维dp数组实现 #include using namespace std; -int n, bagweight;// bagweight代表行李箱空间 -void solve() { +int main() { + int n, bagweight;// bagweight代表行李箱空间 + + cin >> n >> bagweight; + vector weight(n, 0); // 存储每件物品所占空间 vector value(n, 0); // 存储每件物品价值 + for(int i = 0; i < n; ++i) { cin >> weight[i]; } @@ -294,33 +339,28 @@ void solve() { for(int i = 1; i < weight.size(); i++) { // 遍历科研物品 for(int j = 0; j <= bagweight; j++) { // 遍历行李箱容量 - // 如果装不下这个物品,那么就继承dp[i - 1][j]的值 - if (j < weight[i]) dp[i][j] = dp[i - 1][j]; - // 如果能装下,就将值更新为 不装这个物品的最大值 和 装这个物品的最大值 中的 最大值 - // 装这个物品的最大值由容量为j - weight[i]的包任意放入序号为[0, i - 1]的最大值 + 该物品的价值构成 - else dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]); + if (j < weight[i]) dp[i][j] = dp[i - 1][j]; // 如果装不下这个物品,那么就继承dp[i - 1][j]的值 + else { + dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]); + } } } - cout << dp[weight.size() - 1][bagweight] << endl; -} + cout << dp[n - 1][bagweight] << endl; -int main() { - while(cin >> n >> bagweight) { - solve(); - } return 0; } + ``` ## 总结 -讲了这么多才刚刚把二维dp的01背包讲完,**这里大家其实可以发现最简单的是推导公式了,推导公式估计看一遍就记下来了,但难就难在如何初始化和遍历顺序上**。 +背包问题 是动态规划里的经典类型题目,大家要细细品味。 可能有的同学并没有注意到初始化 和 遍历顺序的重要性,我们后面做力扣上背包面试题目的时候,大家就会感受出来了。 -下一篇 还是理论基础,我们再来讲一维dp数组实现的01背包(滚动数组),分析一下和二维有什么区别,在初始化和遍历顺序上又有什么差异,敬请期待! +下一篇 还是理论基础,我们再来讲一维dp数组实现的01背包(滚动数组),分析一下和二维有什么区别,在初始化和遍历顺序上又有什么差异。 @@ -329,120 +369,42 @@ int main() { ### Java -```java -public class BagProblem { +```Java +import java.util.Scanner; + +public class Main { public static void main(String[] args) { - int[] weight = {1,3,4}; - int[] value = {15,20,30}; - int bagSize = 4; - testWeightBagProblem(weight,value,bagSize); - } + Scanner scanner = new Scanner(System.in); + int n = scanner.nextInt(); + int bagweight = scanner.nextInt(); - /** - * 动态规划获得结果 - * @param weight 物品的重量 - * @param value 物品的价值 - * @param bagSize 背包的容量 - */ - public static void testWeightBagProblem(int[] weight, int[] value, int bagSize){ - - // 创建dp数组 - int goods = weight.length; // 获取物品的数量 - int[][] dp = new int[goods][bagSize + 1]; - - // 初始化dp数组 - // 创建数组后,其中默认的值就是0 - for (int j = weight[0]; j <= bagSize; j++) { - dp[0][j] = value[0]; - } + int[] weight = new int[n]; + int[] value = new int[n]; - // 填充dp数组 - for (int i = 1; i < weight.length; i++) { - for (int j = 1; j <= bagSize; j++) { - if (j < weight[i]) { - /** - * 当前背包的容量都没有当前物品i大的时候,是不放物品i的 - * 那么前i-1个物品能放下的最大价值就是当前情况的最大价值 - */ - dp[i][j] = dp[i-1][j]; - } else { - /** - * 当前背包的容量可以放下物品i - * 那么此时分两种情况: - * 1、不放物品i - * 2、放物品i - * 比较这两种情况下,哪种背包中物品的最大价值最大 - */ - dp[i][j] = Math.max(dp[i-1][j] , dp[i-1][j-weight[i]] + value[i]); - } - } + for (int i = 0; i < n; ++i) { + weight[i] = scanner.nextInt(); } - - // 打印dp数组 - for (int i = 0; i < goods; i++) { - for (int j = 0; j <= bagSize; j++) { - System.out.print(dp[i][j] + "\t"); - } - System.out.println("\n"); + for (int j = 0; j < n; ++j) { + value[j] = scanner.nextInt(); } - } -} - -``` -```java -import java.util.Arrays; + int[][] dp = new int[n][bagweight + 1]; -public class BagProblem { - public static void main(String[] args) { - int[] weight = {1,3,4}; - int[] value = {15,20,30}; - int bagSize = 4; - testWeightBagProblem(weight,value,bagSize); - } + for (int j = weight[0]; j <= bagweight; j++) { + dp[0][j] = value[0]; + } - /** - * 初始化 dp 数组做了简化(给物品增加冗余维)。这样初始化dp数组,默认全为0即可。 - * dp[i][j] 表示从下标为[0 - i-1]的物品里任意取,放进容量为j的背包,价值总和最大是多少。 - * 其实是模仿背包重量从 0 开始,背包容量 j 为 0 的话,即dp[i][0],无论是选取哪些物品,背包价值总和一定为 0。 - * 可选物品也可以从无开始,也就是没有物品可选,即dp[0][j],这样无论背包容量为多少,背包价值总和一定为 0。 - * @param weight 物品的重量 - * @param value 物品的价值 - * @param bagSize 背包的容量 - */ - public static void testWeightBagProblem(int[] weight, int[] value, int bagSize){ - - // 创建dp数组 - int goods = weight.length; // 获取物品的数量 - int[][] dp = new int[goods + 1][bagSize + 1]; // 给物品增加冗余维,i = 0 表示没有物品可选 - - // 初始化dp数组,默认全为0即可 - // 填充dp数组 - for (int i = 1; i <= goods; i++) { - for (int j = 1; j <= bagSize; j++) { - if (j < weight[i - 1]) { // i - 1 对应物品 i - /** - * 当前背包的容量都没有当前物品i大的时候,是不放物品i的 - * 那么前i-1个物品能放下的最大价值就是当前情况的最大价值 - */ + for (int i = 1; i < n; i++) { + for (int j = 0; j <= bagweight; j++) { + if (j < weight[i]) { dp[i][j] = dp[i - 1][j]; } else { - /** - * 当前背包的容量可以放下物品i - * 那么此时分两种情况: - * 1、不放物品i - * 2、放物品i - * 比较这两种情况下,哪种背包中物品的最大价值最大 - */ - dp[i][j] = Math.max(dp[i - 1][j] , dp[i - 1][j - weight[i - 1]] + value[i - 1]); // i - 1 对应物品 i + dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]); } } } - // 打印dp数组 - for(int[] arr : dp){ - System.out.println(Arrays.toString(arr)); - } + System.out.println(dp[n - 1][bagweight]); } } @@ -450,137 +412,71 @@ public class BagProblem { ### Python -无参数版 ```python -def test_2_wei_bag_problem1(): - weight = [1, 3, 4] - value = [15, 20, 30] - bagweight = 4 +n, bagweight = map(int, input().split()) - # 二维数组 - dp = [[0] * (bagweight + 1) for _ in range(len(weight))] +weight = list(map(int, input().split())) +value = list(map(int, input().split())) - # 初始化 - for j in range(weight[0], bagweight + 1): - dp[0][j] = value[0] +dp = [[0] * (bagweight + 1) for _ in range(n)] - # weight数组的大小就是物品个数 - for i in range(1, len(weight)): # 遍历物品 - for j in range(bagweight + 1): # 遍历背包容量 - if j < weight[i]: - dp[i][j] = dp[i - 1][j] - else: - dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]) +for j in range(weight[0], bagweight + 1): + dp[0][j] = value[0] - print(dp[len(weight) - 1][bagweight]) - -test_2_wei_bag_problem1() - -``` -有参数版 -```python -def test_2_wei_bag_problem1(weight, value, bagweight): - # 二维数组 - dp = [[0] * (bagweight + 1) for _ in range(len(weight))] - - # 初始化 - for j in range(weight[0], bagweight + 1): - dp[0][j] = value[0] - - # weight数组的大小就是物品个数 - for i in range(1, len(weight)): # 遍历物品 - for j in range(bagweight + 1): # 遍历背包容量 - if j < weight[i]: - dp[i][j] = dp[i - 1][j] - else: - dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]) - - return dp[len(weight) - 1][bagweight] - -if __name__ == "__main__": - - weight = [1, 3, 4] - value = [15, 20, 30] - bagweight = 4 - - result = test_2_wei_bag_problem1(weight, value, bagweight) - print(result) +for i in range(1, n): + for j in range(bagweight + 1): + if j < weight[i]: + dp[i][j] = dp[i - 1][j] + else: + dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]) +print(dp[n - 1][bagweight]) ``` ### Go ```go -func test_2_wei_bag_problem1(weight, value []int, bagweight int) int { - // 定义dp数组 - dp := make([][]int, len(weight)) - for i, _ := range dp { - dp[i] = make([]int, bagweight+1) - } - // 初始化 - for j := bagweight; j >= weight[0]; j-- { - dp[0][j] = dp[0][j-weight[0]] + value[0] - } - // 递推公式 - for i := 1; i < len(weight); i++ { - //正序,也可以倒序 - for j := 0; j <= bagweight; j++ { - if j < weight[i] { - dp[i][j] = dp[i-1][j] - } else { - dp[i][j] = max(dp[i-1][j], dp[i-1][j-weight[i]]+value[i]) - } - } - } - return dp[len(weight)-1][bagweight] -} - -func max(a,b int) int { - if a > b { - return a - } - return b -} - -func main() { - weight := []int{1,3,4} - value := []int{15,20,30} - test_2_wei_bag_problem1(weight,value,4) -} ``` ### Javascript ```js -function testWeightBagProblem (weight, value, size) { - // 定义 dp 数组 - const len = weight.length, - dp = Array(len).fill().map(() => Array(size + 1).fill(0)); +const readline = require('readline').createInterface({ + input: process.stdin, + output: process.stdout +}); + +let input = []; - // 初始化 - for(let j = weight[0]; j <= size; j++) { +readline.on('line', (line) => { + input.push(line); +}); + +readline.on('close', () => { + let [n, bagweight] = input[0].split(' ').map(Number); + let weight = input[1].split(' ').map(Number); + let value = input[2].split(' ').map(Number); + + let dp = Array.from({ length: n }, () => Array(bagweight + 1).fill(0)); + + for (let j = weight[0]; j <= bagweight; j++) { dp[0][j] = value[0]; } - // weight 数组的长度len 就是物品个数 - for(let i = 1; i < len; i++) { // 遍历物品 - for(let j = 0; j <= size; j++) { // 遍历背包容量 - if(j < weight[i]) dp[i][j] = dp[i - 1][j]; - else dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]); + for (let i = 1; i < n; i++) { + for (let j = 0; j <= bagweight; j++) { + if (j < weight[i]) { + dp[i][j] = dp[i - 1][j]; + } else { + dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]); + } } } - console.table(dp) + console.log(dp[n - 1][bagweight]); +}); - return dp[len - 1][size]; -} - -function test () { - console.log(testWeightBagProblem([1, 3, 4, 5], [15, 20, 30, 55], 6)); -} - -test(); ``` @@ -589,157 +485,62 @@ test(); ```c #include #include -#include - -#define MAX(a, b) (((a) > (b)) ? (a) : (b)) -#define ARR_SIZE(a) (sizeof((a)) / sizeof((a)[0])) -#define BAG_WEIGHT 4 - -void backPack(int* weights, int weightSize, int* costs, int costSize, int bagWeight) { - // 开辟dp数组 - int dp[weightSize][bagWeight + 1]; - memset(dp, 0, sizeof(int) * weightSize * (bagWeight + 1)); - - int i, j; - // 当背包容量大于物品0的重量时,将物品0放入到背包中 - for(j = weights[0]; j <= bagWeight; ++j) { - dp[0][j] = costs[0]; - } - - // 先遍历物品,再遍历重量 - for(j = 1; j <= bagWeight; ++j) { - for(i = 1; i < weightSize; ++i) { - // 如果当前背包容量小于物品重量 - if(j < weights[i]) - // 背包物品的价值等于背包不放置当前物品时的价值 - dp[i][j] = dp[i-1][j]; - // 若背包当前重量可以放置物品 - else - // 背包的价值等于放置该物品或不放置该物品的最大值 - dp[i][j] = MAX(dp[i - 1][j], dp[i - 1][j - weights[i]] + costs[i]); - } - } - printf("%d\n", dp[weightSize - 1][bagWeight]); +int max(int a, int b) { + return a > b ? a : b; } -int main(int argc, char* argv[]) { - int weights[] = {1, 3, 4}; - int costs[] = {15, 20, 30}; - backPack(weights, ARR_SIZE(weights), costs, ARR_SIZE(costs), BAG_WEIGHT); - return 0; -} -``` +int main() { + int n, bagweight; + scanf("%d %d", &n, &bagweight); + int *weight = (int *)malloc(n * sizeof(int)); + int *value = (int *)malloc(n * sizeof(int)); -### TypeScript - -```typescript -function testWeightBagProblem( - weight: number[], - value: number[], - size: number -): number { - /** - * dp[i][j]: 前i个物品,背包容量为j,能获得的最大价值 - * dp[0][*]: u=weight[0],u之前为0,u之后(含u)为value[0] - * dp[*][0]: 0 - * ... - * dp[i][j]: max(dp[i-1][j], dp[i-1][j-weight[i]]+value[i]); - */ - const goodsNum: number = weight.length; - const dp: number[][] = new Array(goodsNum) - .fill(0) - .map((_) => new Array(size + 1).fill(0)); - for (let i = weight[0]; i <= size; i++) { - dp[0][i] = value[0]; - } - for (let i = 1; i < goodsNum; i++) { - for (let j = 1; j <= size; j++) { - if (j < weight[i]) { - dp[i][j] = dp[i - 1][j]; - } else { - dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]); - } + for (int i = 0; i < n; ++i) { + scanf("%d", &weight[i]); + } + for (int j = 0; j < n; ++j) { + scanf("%d", &value[j]); } - } - return dp[goodsNum - 1][size]; -} -// test -const weight = [1, 3, 4]; -const value = [15, 20, 30]; -const size = 4; -console.log(testWeightBagProblem(weight, value, size)); -``` - -### Scala - -```scala -object Solution { - // 01背包 - def test_2_wei_bag_problem1(): Unit = { - var weight = Array[Int](1, 3, 4) - var value = Array[Int](15, 20, 30) - var baseweight = 4 - // 二维数组 - var dp = Array.ofDim[Int](weight.length, baseweight + 1) + int **dp = (int **)malloc(n * sizeof(int *)); + for (int i = 0; i < n; ++i) { + dp[i] = (int *)malloc((bagweight + 1) * sizeof(int)); + for (int j = 0; j <= bagweight; ++j) { + dp[i][j] = 0; + } + } - // 初始化 - for (j <- weight(0) to baseweight) { - dp(0)(j) = value(0) + for (int j = weight[0]; j <= bagweight; j++) { + dp[0][j] = value[0]; } - // 遍历 - for (i <- 1 until weight.length; j <- 1 to baseweight) { - if (j - weight(i) >= 0) dp(i)(j) = dp(i - 1)(j - weight(i)) + value(i) - dp(i)(j) = math.max(dp(i)(j), dp(i - 1)(j)) + for (int i = 1; i < n; i++) { + for (int j = 0; j <= bagweight; j++) { + if (j < weight[i]) { + dp[i][j] = dp[i - 1][j]; + } else { + dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]); + } + } } - // 打印数组 - dp.foreach(x => println("[" + x.mkString(",") + "]")) + printf("%d\n", dp[n - 1][bagweight]); - dp(weight.length - 1)(baseweight) // 最终返回 - } + for (int i = 0; i < n; ++i) { + free(dp[i]); + } + free(dp); + free(weight); + free(value); - def main(args: Array[String]): Unit = { - test_2_wei_bag_problem1() - } + return 0; } -``` - -### Rust - -```rust -pub struct Solution; -impl Solution { - pub fn wei_bag_problem1(weight: Vec, value: Vec, bag_size: usize) -> usize { - let mut dp = vec![vec![0; bag_size + 1]; weight.len()]; - for j in weight[0]..=weight.len() { - dp[0][j] = value[0]; - } +``` - for i in 1..weight.len() { - for j in 0..=bag_size { - match j < weight[i] { - true => dp[i][j] = dp[i - 1][j], - false => dp[i][j] = dp[i - 1][j].max(dp[i - 1][j - weight[i]] + value[i]), - } - } - } - dp[weight.len() - 1][bag_size] - } -} -#[test] -fn test_wei_bag_problem1() { - println!( - "{}", - Solution::wei_bag_problem1(vec![1, 3, 4], vec![15, 20, 30], 4) - ); -} -```

diff --git "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" index b5838c5df8..c61a72cc40 100644 --- "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" +++ "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" @@ -56,17 +56,31 @@ 1. 确定dp数组的定义 +关于dp数组的定义,我在 [01背包理论基础](https://programmercarl.com/背包理论基础01背包-1.html) 有详细讲解 + 在一维dp数组中,dp[j]表示:容量为j的背包,所背的物品价值可以最大为dp[j]。 2. 一维dp数组的递推公式 -dp[j]为 容量为j的背包所背的最大价值,那么如何推导dp[j]呢? +二维dp数组的递推公式为: `dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);` + +公式是怎么来的 在这里 [01背包理论基础](https://programmercarl.com/背包理论基础01背包-1.html) 有详细讲解。 + +一维dp数组,其实就上上一层 dp[i-1] 这一层 拷贝的 dp[i]来。 + +所以在 上面递推公式的基础上,去掉i这个维度就好。 + +递推公式为:`dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);` + +以下为分析: + +dp[j]为 容量为j的背包所背的最大价值。 dp[j]可以通过dp[j - weight[i]]推导出来,dp[j - weight[i]]表示容量为j - weight[i]的背包所背的最大价值。 -dp[j - weight[i]] + value[i] 表示 容量为 j - 物品i重量 的背包 加上 物品i的价值。(也就是容量为j的背包,放入物品i了之后的价值即:dp[j]) +`dp[j - weight[i]] + value[i]` 表示 容量为 [j - 物品i重量] 的背包 加上 物品i的价值。(也就是容量为j的背包,放入物品i了之后的价值即:dp[j]) -此时dp[j]有两个选择,一个是取自己dp[j] 相当于 二维dp数组中的dp[i-1][j],即不放物品i,一个是取dp[j - weight[i]] + value[i],即放物品i,指定是取最大的,毕竟是求最大价值, +此时dp[j]有两个选择,一个是取自己dp[j] 相当于 二维dp数组中的dp[i-1][j],即不放物品i,一个是取`dp[j - weight[i]] + value[i]`,即放物品i,指定是取最大的,毕竟是求最大价值, 所以递归公式为: @@ -145,10 +159,6 @@ dp[1] = dp[1 - weight[0]] + value[0] = 15 因为一维dp的写法,背包容量一定是要倒序遍历(原因上面已经讲了),如果遍历背包容量放在上一层,那么每个dp[j]就只会放入一个物品,即:背包里只放入了一个物品。 -倒序遍历的原因是,本质上还是一个对二维数组的遍历,并且右下角的值依赖上一层左上角的值,因此需要保证左边的值仍然是上一层的,从右向左覆盖。 - -(这里如果读不懂,就再回想一下dp[j]的定义,或者就把两个for循环顺序颠倒一下试试!) - **所以一维dp数组的背包在遍历顺序上和二维其实是有很大差异的!**,这一点大家一定要注意。 5. 举例推导dp数组 @@ -158,31 +168,6 @@ dp[1] = dp[1 - weight[0]] + value[0] = 15 ![动态规划-背包问题9](https://code-thinking-1253855093.file.myqcloud.com/pics/20210110103614769.png) - -C++代码如下: - -```CPP -void test_1_wei_bag_problem() { - vector weight = {1, 3, 4}; - vector value = {15, 20, 30}; - int bagWeight = 4; - - // 初始化 - vector dp(bagWeight + 1, 0); - for(int i = 0; i < weight.size(); i++) { // 遍历物品 - for(int j = bagWeight; j >= weight[i]; j--) { // 遍历背包容量 - dp[j] = max(dp[j], dp[j - weight[i]] + value[i]); - } - } - cout << dp[bagWeight] << endl; -} - -int main() { - test_1_wei_bag_problem(); -} - -``` - 本题力扣上没有原题,大家可以去[卡码网第46题](https://kamacoder.com/problempage.php?pid=1046)去练习,题意是一样的,代码如下: ```CPP @@ -256,251 +241,229 @@ int main() { 即使代码没有通过,也会有自己的逻辑去debug,这样就思维清晰了。 -接下来就要开始用这两天的理论基础去做力扣上的背包面试题目了,录友们握紧扶手,我们要上高速啦! - - - ## 其他语言版本 ### Java ```java +import java.util.Scanner; + +public class Main { public static void main(String[] args) { - int[] weight = {1, 3, 4}; - int[] value = {15, 20, 30}; - int bagWight = 4; - testWeightBagProblem(weight, value, bagWight); - } + Scanner scanner = new Scanner(System.in); + int n = scanner.nextInt(); + int bagweight = scanner.nextInt(); - public static void testWeightBagProblem(int[] weight, int[] value, int bagWeight){ - int wLen = weight.length; - //定义dp数组:dp[j]表示背包容量为j时,能获得的最大价值 - int[] dp = new int[bagWeight + 1]; - //遍历顺序:先遍历物品,再遍历背包容量 - for (int i = 0; i < wLen; i++){ - for (int j = bagWeight; j >= weight[i]; j--){ - dp[j] = Math.max(dp[j], dp[j - weight[i]] + value[i]); - } + int[] weight = new int[n]; + int[] value = new int[n]; + + for (int i = 0; i < n; ++i) { + weight[i] = scanner.nextInt(); } - //打印dp数组 - for (int j = 0; j <= bagWeight; j++){ - System.out.print(dp[j] + " "); + for (int j = 0; j < n; ++j) { + value[j] = scanner.nextInt(); } - } -``` + int[][] dp = new int[n][bagweight + 1]; + for (int j = weight[0]; j <= bagweight; j++) { + dp[0][j] = value[0]; + } + for (int i = 1; i < n; i++) { + for (int j = 0; j <= bagweight; j++) { + if (j < weight[i]) { + dp[i][j] = dp[i - 1][j]; + } else { + dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]); + } + } + } -### Python -无参版 -```python -def test_1_wei_bag_problem(): - weight = [1, 3, 4] - value = [15, 20, 30] - bagWeight = 4 + System.out.println(dp[n - 1][bagweight]); + } +} - # 初始化 - dp = [0] * (bagWeight + 1) - for i in range(len(weight)): # 遍历物品 - for j in range(bagWeight, weight[i] - 1, -1): # 遍历背包容量 - dp[j] = max(dp[j], dp[j - weight[i]] + value[i]) +``` - print(dp[bagWeight]) -test_1_wei_bag_problem() -``` -有参版 + +### Python + ```python -def test_1_wei_bag_problem(weight, value, bagWeight): - # 初始化 - dp = [0] * (bagWeight + 1) - for i in range(len(weight)): # 遍历物品 - for j in range(bagWeight, weight[i] - 1, -1): # 遍历背包容量 - dp[j] = max(dp[j], dp[j - weight[i]] + value[i]) +n, bagweight = map(int, input().split()) - return dp[bagWeight] +weight = list(map(int, input().split())) +value = list(map(int, input().split())) +dp = [[0] * (bagweight + 1) for _ in range(n)] -if __name__ == "__main__": +for j in range(weight[0], bagweight + 1): + dp[0][j] = value[0] - weight = [1, 3, 4] - value = [15, 20, 30] - bagweight = 4 +for i in range(1, n): + for j in range(bagweight + 1): + if j < weight[i]: + dp[i][j] = dp[i - 1][j] + else: + dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]) - result = test_1_wei_bag_problem(weight, value, bagweight) - print(result) +print(dp[n - 1][bagweight]) ``` ### Go ```go -func test_1_wei_bag_problem(weight, value []int, bagWeight int) int { - // 定义 and 初始化 - dp := make([]int,bagWeight+1) - // 递推顺序 - for i := 0 ;i < len(weight) ; i++ { - // 这里必须倒序,区别二维,因为二维dp保存了i的状态 - for j:= bagWeight; j >= weight[i] ; j-- { - // 递推公式 - dp[j] = max(dp[j], dp[j-weight[i]]+value[i]) - } - } - //fmt.Println(dp) - return dp[bagWeight] -} - -func max(a,b int) int { - if a > b { - return a - } - return b -} +package main +import ( + "fmt" +) func main() { - weight := []int{1,3,4} - value := []int{15,20,30} - test_1_wei_bag_problem(weight,value,4) -} -``` + var n, bagweight int + fmt.Scan(&n, &bagweight) -### JavaScript + weight := make([]int, n) + value := make([]int, n) -```js - -function testWeightBagProblem(wight, value, size) { - const len = wight.length, - dp = Array(size + 1).fill(0); - for(let i = 1; i <= len; i++) { - for(let j = size; j >= wight[i - 1]; j--) { - dp[j] = Math.max(dp[j], value[i - 1] + dp[j - wight[i - 1]]); + for i := 0; i < n; i++ { + fmt.Scan(&weight[i]) + } + for j := 0; j < n; j++ { + fmt.Scan(&value[j]) } - } - return dp[size]; -} - -function test () { - console.log(testWeightBagProblem([1, 3, 4, 5], [15, 20, 30, 55], 6)); -} + dp := make([][]int, n) + for i := range dp { + dp[i] = make([]int, bagweight+1) + } -test(); -``` + for j := weight[0]; j <= bagweight; j++ { + dp[0][j] = value[0] + } -### C -```c -#include -#include - -#define MAX(a, b) (((a) > (b)) ? (a) : (b)) -#define ARR_SIZE(arr) ((sizeof((arr))) / sizeof((arr)[0])) -#define BAG_WEIGHT 4 - -void test_back_pack(int* weights, int weightSize, int* values, int valueSize, int bagWeight) { - int dp[bagWeight + 1]; - memset(dp, 0, sizeof(int) * (bagWeight + 1)); - - int i, j; - // 先遍历物品 - for(i = 0; i < weightSize; ++i) { - // 后遍历重量。从后向前遍历 - for(j = bagWeight; j >= weights[i]; --j) { - dp[j] = MAX(dp[j], dp[j - weights[i]] + values[i]); + for i := 1; i < n; i++ { + for j := 0; j <= bagweight; j++ { + if j < weight[i] { + dp[i][j] = dp[i-1][j] + } else { + dp[i][j] = max(dp[i-1][j], dp[i-1][j-weight[i]]+value[i]) + } } } - // 打印最优结果 - printf("%d\n", dp[bagWeight]); + fmt.Println(dp[n-1][bagweight]) } -int main(int argc, char** argv) { - int weights[] = {1, 3, 4}; - int values[] = {15, 20, 30}; - test_back_pack(weights, ARR_SIZE(weights), values, ARR_SIZE(values), BAG_WEIGHT); - return 0; -} -``` - -### TypeScript - -```typescript -function testWeightBagProblem( - weight: number[], - value: number[], - size: number -): number { - const goodsNum: number = weight.length; - const dp: number[] = new Array(size + 1).fill(0); - for (let i = 0; i < goodsNum; i++) { - for (let j = size; j >= weight[i]; j--) { - dp[j] = Math.max(dp[j], dp[j - weight[i]] + value[i]); +func max(a, b int) int { + if a > b { + return a } - } - return dp[size]; + return b } -const weight = [1, 3, 4]; -const value = [15, 20, 30]; -const size = 4; -console.log(testWeightBagProblem(weight, value, size)); ``` -### Scala +### JavaScript + +```js +const readline = require('readline').createInterface({ + input: process.stdin, + output: process.stdout +}); + +let input = []; + +readline.on('line', (line) => { + input.push(line); +}); -```scala -object Solution { - // 滚动数组 - def test_1_wei_bag_problem(): Unit = { - var weight = Array[Int](1, 3, 4) - var value = Array[Int](15, 20, 30) - var baseweight = 4 +readline.on('close', () => { + let [n, bagweight] = input[0].split(' ').map(Number); + let weight = input[1].split(' ').map(Number); + let value = input[2].split(' ').map(Number); - // dp数组 - var dp = new Array[Int](baseweight + 1) + let dp = Array.from({ length: n }, () => Array(bagweight + 1).fill(0)); - // 遍历 - for (i <- 0 until weight.length; j <- baseweight to weight(i) by -1) { - dp(j) = math.max(dp(j), dp(j - weight(i)) + value(i)) + for (let j = weight[0]; j <= bagweight; j++) { + dp[0][j] = value[0]; } - // 打印数组 - println("[" + dp.mkString(",") + "]") - } + for (let i = 1; i < n; i++) { + for (let j = 0; j <= bagweight; j++) { + if (j < weight[i]) { + dp[i][j] = dp[i - 1][j]; + } else { + dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]); + } + } + } + + console.log(dp[n - 1][bagweight]); +}); + - def main(args: Array[String]): Unit = { - test_1_wei_bag_problem() - } -} ``` -### Rust +### C +```c +#include +#include + +int max(int a, int b) { + return a > b ? a : b; +} -```rust -pub struct Solution; +int main() { + int n, bagweight; + scanf("%d %d", &n, &bagweight); -impl Solution { - pub fn wei_bag_problem2(weight: Vec, value: Vec, bag_size: usize) -> usize { - let mut dp = vec![0; bag_size + 1]; - for i in 0..weight.len() { - for j in (weight[i]..=bag_size).rev() { - if j >= weight[i] { - dp[j] = dp[j].max(dp[j - weight[i]] + value[i]); - } + int *weight = (int *)malloc(n * sizeof(int)); + int *value = (int *)malloc(n * sizeof(int)); + + for (int i = 0; i < n; ++i) { + scanf("%d", &weight[i]); + } + for (int j = 0; j < n; ++j) { + scanf("%d", &value[j]); + } + + int **dp = (int **)malloc(n * sizeof(int *)); + for (int i = 0; i < n; ++i) { + dp[i] = (int *)malloc((bagweight + 1) * sizeof(int)); + for (int j = 0; j <= bagweight; ++j) { + dp[i][j] = 0; + } + } + + for (int j = weight[0]; j <= bagweight; j++) { + dp[0][j] = value[0]; + } + + for (int i = 1; i < n; i++) { + for (int j = 0; j <= bagweight; j++) { + if (j < weight[i]) { + dp[i][j] = dp[i - 1][j]; + } else { + dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]); } } - dp[dp.len() - 1] } -} -#[test] -fn test_wei_bag_problem2() { - println!( - "{}", - Solution::wei_bag_problem2(vec![1, 3, 4], vec![15, 20, 30], 4) - ); + printf("%d\n", dp[n - 1][bagweight]); + + for (int i = 0; i < n; ++i) { + free(dp[i]); + } + free(dp); + free(weight); + free(value); + + return 0; } + ``` From 0d7f8b03150a2114946192ef181fa8e00d5c5bf8 Mon Sep 17 00:00:00 2001 From: kyshen Date: Sat, 3 Aug 2024 23:52:26 +0800 Subject: [PATCH 2735/3019] feat: python solution, DFS --- ...64\346\265\201\351\227\256\351\242\230.md" | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git "a/problems/kamacoder/0103.\346\260\264\346\265\201\351\227\256\351\242\230.md" "b/problems/kamacoder/0103.\346\260\264\346\265\201\351\227\256\351\242\230.md" index b19e4778f1..9a34bf094f 100644 --- "a/problems/kamacoder/0103.\346\260\264\346\265\201\351\227\256\351\242\230.md" +++ "b/problems/kamacoder/0103.\346\260\264\346\265\201\351\227\256\351\242\230.md" @@ -355,6 +355,62 @@ public class Main { ``` ### Python +```Python +first = set() +second = set() +directions = [[-1, 0], [0, 1], [1, 0], [0, -1]] + +def dfs(i, j, graph, visited, side): + if visited[i][j]: + return + + visited[i][j] = True + side.add((i, j)) + + for x, y in directions: + new_x = i + x + new_y = j + y + if ( + 0 <= new_x < len(graph) + and 0 <= new_y < len(graph[0]) + and int(graph[new_x][new_y]) >= int(graph[i][j]) + ): + dfs(new_x, new_y, graph, visited, side) + +def main(): + global first + global second + + N, M = map(int, input().strip().split()) + graph = [] + for _ in range(N): + row = input().strip().split() + graph.append(row) + + # 是否可到达第一边界 + visited = [[False] * M for _ in range(N)] + for i in range(M): + dfs(0, i, graph, visited, first) + for i in range(N): + dfs(i, 0, graph, visited, first) + + # 是否可到达第二边界 + visited = [[False] * M for _ in range(N)] + for i in range(M): + dfs(N - 1, i, graph, visited, second) + for i in range(N): + dfs(i, M - 1, graph, visited, second) + + # 可到达第一边界和第二边界 + res = first & second + + for x, y in res: + print(f"{x} {y}") + + +if __name__ == "__main__": + main() +``` ### Go From ba773d93bedd6bdfd7841d5b0aa13244ace303eb Mon Sep 17 00:00:00 2001 From: YimvPi Date: Sat, 3 Aug 2024 14:45:16 -0400 Subject: [PATCH 2736/3019] Change 'len' to 'length' --- ...\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" "b/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" index df586ff99f..f8092503e3 100644 --- "a/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" +++ "b/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" @@ -308,7 +308,7 @@ class Solution: class Solution: def maxProfit(self, prices: List[int]) -> int: length = len(prices) - if len == 0: + if length == 0: return 0 dp = [[0] * 2 for _ in range(length)] dp[0][0] = -prices[0] From 5fc9aa68a3f483b41ddae1fe735cfe21a676d7dd Mon Sep 17 00:00:00 2001 From: Hard <2321291138@qq.com> Date: Mon, 5 Aug 2024 17:24:26 +0800 Subject: [PATCH 2737/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A00116.=E5=A1=AB?= =?UTF-8?q?=E5=85=85=E6=AF=8F=E4=B8=AA=E8=8A=82=E7=82=B9=E7=9A=84=E4=B8=8B?= =?UTF-8?q?=E4=B8=80=E4=B8=AA=E5=8F=B3=E4=BE=A7=E8=8A=82=E7=82=B9=E6=8C=87?= =?UTF-8?q?=E9=92=88.md=20Java=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...02\347\202\271\346\214\207\351\222\210.md" | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git "a/problems/0116.\345\241\253\345\205\205\346\257\217\344\270\252\350\212\202\347\202\271\347\232\204\344\270\213\344\270\200\344\270\252\345\217\263\344\276\247\350\212\202\347\202\271\346\214\207\351\222\210.md" "b/problems/0116.\345\241\253\345\205\205\346\257\217\344\270\252\350\212\202\347\202\271\347\232\204\344\270\213\344\270\200\344\270\252\345\217\263\344\276\247\350\212\202\347\202\271\346\214\207\351\222\210.md" index ca36ac6f3e..98bd4e41c1 100644 --- "a/problems/0116.\345\241\253\345\205\205\346\257\217\344\270\252\350\212\202\347\202\271\347\232\204\344\270\213\344\270\200\344\270\252\345\217\263\344\276\247\350\212\202\347\202\271\346\214\207\351\222\210.md" +++ "b/problems/0116.\345\241\253\345\205\205\346\257\217\344\270\252\350\212\202\347\202\271\347\232\204\344\270\213\344\270\200\344\270\252\345\217\263\344\276\247\350\212\202\347\202\271\346\214\207\351\222\210.md" @@ -169,6 +169,56 @@ class Solution { } ``` +```Java +// 迭代法 +class Solution { + public Node connect(Node root) { + if (root == null) { + return root; + } + + Queue queue = new LinkedList<>(); + + queue.add(root); + + while (!queue.isEmpty()) { + int size = queue.size(); + + // 每层的第一个节点 + Node cur = queue.poll(); + if (cur.left != null) { + queue.add(cur.left); + } + if (cur.right != null) { + queue.add(cur.right); + } + + // 因为已经移除了每层的第一个节点,所以将 0 改为 1 + while (size-- > 1) { + Node next = queue.poll(); + + if (next.left != null) { + queue.add(next.left); + } + if (next.right != null) { + queue.add(next.right); + } + + // 当前节点指向同层的下一个节点 + cur.next = next; + // 更新当前节点 + cur = next; + } + + // 每层的最后一个节点不指向 null 在力扣也能过 + cur.next = null; + } + + return root; + } +} +``` + ### Python ```python @@ -443,3 +493,4 @@ public class Solution + From a91e01c8a4479f9a2871d895ccc5c0af283d8a9c Mon Sep 17 00:00:00 2001 From: Hard <2321291138@qq.com> Date: Mon, 5 Aug 2024 17:25:35 +0800 Subject: [PATCH 2738/3019] =?UTF-8?q?=E4=BF=AE=E6=94=B90226.=E7=BF=BB?= =?UTF-8?q?=E8=BD=AC=E4=BA=8C=E5=8F=89=E6=A0=91.md=20=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 --- ...277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git "a/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" "b/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" index 824968f0f3..e501b29878 100644 --- "a/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" @@ -14,7 +14,7 @@ ![226.翻转二叉树](https://code-thinking-1253855093.file.myqcloud.com/pics/20210203192644329.png) -这道题目背后有一个让程序员心酸的故事,听说 Homebrew的作者Max Howell,就是因为没在白板上写出翻转二叉树,最后被Google拒绝了。(真假不做判断,权当一个乐子哈) +这道题目背后有一个让程序员心酸的故事,听说 Homebrew的作者Max Howell,就是因为没在白板上写出翻转二叉树,最后被Google拒绝了。(真假不做判断,全当一个乐子哈) ## 算法公开课 @@ -1033,3 +1033,4 @@ public TreeNode InvertTree(TreeNode root) { + From 2272d0e1e303f93d6a61e33674c799d848817824 Mon Sep 17 00:00:00 2001 From: Yang-Changhui <2275029710@qq.com> Date: Mon, 5 Aug 2024 23:05:41 +0800 Subject: [PATCH 2739/3019] =?UTF-8?q?add=20problems/kamacoder/0110.?= =?UTF-8?q?=E5=AD=97=E7=AC=A6=E4=B8=B2=E6=8E=A5=E9=BE=99.md=20python?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...46\344\270\262\346\216\245\351\276\231.md" | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git "a/problems/kamacoder/0110.\345\255\227\347\254\246\344\270\262\346\216\245\351\276\231.md" "b/problems/kamacoder/0110.\345\255\227\347\254\246\344\270\262\346\216\245\351\276\231.md" index feeec6ddcc..5d13e3689e 100644 --- "a/problems/kamacoder/0110.\345\255\227\347\254\246\344\270\262\346\216\245\351\276\231.md" +++ "b/problems/kamacoder/0110.\345\255\227\347\254\246\344\270\262\346\216\245\351\276\231.md" @@ -217,6 +217,38 @@ public class Main { ``` ### Python +```Python +def judge(s1,s2): + count=0 + for i in range(len(s1)): + if s1[i]!=s2[i]: + count+=1 + return count==1 + +if __name__=='__main__': + n=int(input()) + beginstr,endstr=map(str,input().split()) + if beginstr==endstr: + print(0) + exit() + strlist=[] + for i in range(n): + strlist.append(input()) + + # use bfs + visit=[False for i in range(n)] + queue=[[beginstr,1]] + while queue: + str,step=queue.pop(0) + if judge(str,endstr): + print(step+1) + exit() + for i in range(n): + if visit[i]==False and judge(strlist[i],str): + visit[i]=True + queue.append([strlist[i],step+1]) + print(0) +``` ### Go From a13de64145b21f31b42e6162623b25fe7103f863 Mon Sep 17 00:00:00 2001 From: kyshen Date: Mon, 5 Aug 2024 23:21:33 +0800 Subject: [PATCH 2740/3019] feat: 0104 python DFS solution --- ...00\345\244\247\345\262\233\345\261\277.md" | 73 +++++++++++++++++++ 1 file changed, 73 insertions(+) diff --git "a/problems/kamacoder/0104.\345\273\272\351\200\240\346\234\200\345\244\247\345\262\233\345\261\277.md" "b/problems/kamacoder/0104.\345\273\272\351\200\240\346\234\200\345\244\247\345\262\233\345\261\277.md" index 7d67b7fcb1..7132217b53 100644 --- "a/problems/kamacoder/0104.\345\273\272\351\200\240\346\234\200\345\244\247\345\262\233\345\261\277.md" +++ "b/problems/kamacoder/0104.\345\273\272\351\200\240\346\234\200\345\244\247\345\262\233\345\261\277.md" @@ -366,6 +366,79 @@ public class Main { ### Python +```Python +import collections + +directions = [[-1, 0], [0, 1], [0, -1], [1, 0]] +area = 0 + +def dfs(i, j, grid, visited, num): + global area + + if visited[i][j]: + return + + visited[i][j] = True + grid[i][j] = num # 标记岛屿号码 + area += 1 + + for x, y in directions: + new_x = i + x + new_y = j + y + if ( + 0 <= new_x < len(grid) + and 0 <= new_y < len(grid[0]) + and grid[new_x][new_y] == "1" + ): + dfs(new_x, new_y, grid, visited, num) + + +def main(): + global area + + N, M = map(int, input().strip().split()) + grid = [] + for i in range(N): + grid.append(input().strip().split()) + visited = [[False] * M for _ in range(N)] + rec = collections.defaultdict(int) + + cnt = 2 + for i in range(N): + for j in range(M): + if grid[i][j] == "1": + area = 0 + dfs(i, j, grid, visited, cnt) + rec[cnt] = area # 纪录岛屿面积 + cnt += 1 + + res = 0 + for i in range(N): + for j in range(M): + if grid[i][j] == "0": + max_island = 1 # 将水变为陆地,故从1开始计数 + v = set() + for x, y in directions: + new_x = i + x + new_y = j + y + if ( + 0 <= new_x < len(grid) + and 0 <= new_y < len(grid[0]) + and grid[new_x][new_y] != "0" + and grid[new_x][new_y] not in v # 岛屿不可重复 + ): + max_island += rec[grid[new_x][new_y]] + v.add(grid[new_x][new_y]) + res = max(res, max_island) + + if res == 0: + return max(rec.values()) # 无水的情况 + return res + +if __name__ == "__main__": + print(main()) +``` + ### Go ### Rust From d38135b219e667f1638b9184b015043a87ed002a Mon Sep 17 00:00:00 2001 From: fang_chenfang <1217690899@qq.com> Date: Tue, 6 Aug 2024 10:36:18 +0800 Subject: [PATCH 2741/3019] =?UTF-8?q?Update=200018.=E5=9B=9B=E6=95=B0?= =?UTF-8?q?=E4=B9=8B=E5=92=8C.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Java版本第二个for循环内的剪枝操作直接return会漏解,应该是break --- .../0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" "b/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" index 8e34713d37..f45dd939af 100644 --- "a/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" @@ -264,7 +264,7 @@ class Solution { // nums[i]+nums[j] > target 直接返回, 剪枝操作 if (nums[i]+nums[j] > 0 && nums[i]+nums[j] > target) { - return result; + break; } if (j > i + 1 && nums[j - 1] == nums[j]) { // 对nums[j]去重 From d5353e1735d2d80a28a7a653d97dade4bf7c66e3 Mon Sep 17 00:00:00 2001 From: markwang Date: Tue, 6 Aug 2024 11:07:14 +0800 Subject: [PATCH 2742/3019] =?UTF-8?q?62.=E4=B8=8D=E5=90=8C=E8=B7=AF?= =?UTF-8?q?=E5=BE=84=E5=A2=9E=E5=8A=A0Go=E6=95=B0=E8=AE=BA=E6=96=B9?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...15\345\220\214\350\267\257\345\276\204.md" | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git "a/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" "b/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" index b451704b4c..5b46caa9e3 100644 --- "a/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" +++ "b/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" @@ -371,6 +371,7 @@ class Solution: ``` ### Go +动态规划 ```Go func uniquePaths(m int, n int) int { dp := make([][]int, m) @@ -390,6 +391,26 @@ func uniquePaths(m int, n int) int { } ``` +数论方法 +```Go +func uniquePaths(m int, n int) int { + numerator := 1 + denominator := m - 1 + count := m - 1 + t := m + n - 2 + for count > 0 { + numerator *= t + t-- + for denominator != 0 && numerator % denominator == 0 { + numerator /= denominator + denominator-- + } + count-- + } + return numerator +} +``` + ### Javascript ```Javascript From 268c5b2adc9adad9aa43b3517278722beeb24859 Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Tue, 6 Aug 2024 11:26:17 +0800 Subject: [PATCH 2743/3019] Update --- ...6.\345\205\250\346\216\222\345\210\227.md" | 7 +- ...4.\347\233\256\346\240\207\345\222\214.md" | 71 ++++++++-- ...\211\251\350\277\220\350\276\223I-SPFA.md" | 2 +- ...14\347\232\204\347\247\230\345\257\206.md" | 127 ++++++++++++++++++ ...32\344\277\241\346\240\241\345\207\206.md" | 121 +++++++++++++++++ 5 files changed, 313 insertions(+), 15 deletions(-) create mode 100644 "problems/kamacoder/0151.\346\211\213\346\234\272\346\265\201\347\225\205\350\277\220\350\241\214\347\232\204\347\247\230\345\257\206.md" create mode 100644 "problems/kamacoder/0152.\345\260\217\347\261\263\346\211\213\346\234\272\351\200\232\344\277\241\346\240\241\345\207\206.md" diff --git "a/problems/0046.\345\205\250\346\216\222\345\210\227.md" "b/problems/0046.\345\205\250\346\216\222\345\210\227.md" index 638a2a7c45..1ef80a142d 100644 --- "a/problems/0046.\345\205\250\346\216\222\345\210\227.md" +++ "b/problems/0046.\345\205\250\346\216\222\345\210\227.md" @@ -42,7 +42,8 @@ 我以[1,2,3]为例,抽象成树形结构如下: -![46.全排列](https://code-thinking-1253855093.file.myqcloud.com/pics/20211027181706.png) + +![全排列](https://code-thinking-1253855093.file.myqcloud.com/pics/20240803180318.png) ### 回溯三部曲 @@ -54,7 +55,7 @@ 但排列问题需要一个used数组,标记已经选择的元素,如图橘黄色部分所示: -![46.全排列](https://code-thinking-1253855093.file.myqcloud.com/pics/20211027181706.png) +![全排列](https://code-thinking-1253855093.file.myqcloud.com/pics/20240803180318.png) 代码如下: @@ -66,7 +67,7 @@ void backtracking (vector& nums, vector& used) * 递归终止条件 -![46.全排列](https://code-thinking-1253855093.file.myqcloud.com/pics/20201209174225145.png) +![全排列](https://code-thinking-1253855093.file.myqcloud.com/pics/20240803180318.png) 可以看出叶子节点,就是收割结果的地方。 diff --git "a/problems/0494.\347\233\256\346\240\207\345\222\214.md" "b/problems/0494.\347\233\256\346\240\207\345\222\214.md" index 92616ed188..9d13067e5d 100644 --- "a/problems/0494.\347\233\256\346\240\207\345\222\214.md" +++ "b/problems/0494.\347\233\256\346\240\207\345\222\214.md" @@ -134,17 +134,17 @@ x = (target + sum) / 2 大家看到(target + sum) / 2 应该担心计算的过程中向下取整有没有影响。 -这么担心就对了,例如sum 是5,S是2的话其实就是无解的,所以: +这么担心就对了,例如sum是5,target是2 的话其实就是无解的,所以: ```CPP (C++代码中,输入的S 就是题目描述的 target) -if ((S + sum) % 2 == 1) return 0; // 此时没有方案 +if ((target + sum) % 2 == 1) return 0; // 此时没有方案 ``` -同时如果 S的绝对值已经大于sum,那么也是没有方案的。 +同时如果target 的绝对值已经大于sum,那么也是没有方案的。 + ```CPP -(C++代码中,输入的S 就是题目描述的 target) -if (abs(S) > sum) return 0; // 此时没有方案 +if (abs(target) > sum) return 0; // 此时没有方案 ``` 再回归到01背包问题,为什么是01背包呢? @@ -213,9 +213,9 @@ dp[j]其他下标对应的数值也应该初始化为0,从递推公式也可 5. 举例推导dp数组 -输入:nums: [1, 1, 1, 1, 1], S: 3 +输入:nums: [1, 1, 1, 1, 1], target: 3 -bagSize = (S + sum) / 2 = (3 + 5) / 2 = 4 +bagSize = (target + sum) / 2 = (3 + 5) / 2 = 4 dp数组状态变化如下: @@ -226,12 +226,12 @@ C++代码如下: ```CPP class Solution { public: - int findTargetSumWays(vector& nums, int S) { + int findTargetSumWays(vector& nums, int target) { int sum = 0; for (int i = 0; i < nums.size(); i++) sum += nums[i]; - if (abs(S) > sum) return 0; // 此时没有方案 - if ((S + sum) % 2 == 1) return 0; // 此时没有方案 - int bagSize = (S + sum) / 2; + if (abs(target) > sum) return 0; // 此时没有方案 + if ((target + sum) % 2 == 1) return 0; // 此时没有方案 + int bagSize = (target + sum) / 2; vector dp(bagSize + 1, 0); dp[0] = 1; for (int i = 0; i < nums.size(); i++) { @@ -655,3 +655,52 @@ public class Solution + + +class Solution { +public: + int findTargetSumWays(vector& nums, int target) { + int sum = 0; + for (int i = 0; i < nums.size(); i++) sum += nums[i]; + if (abs(target) > sum) return 0; // 此时没有方案 + if ((target + sum) % 2 == 1) return 0; // 此时没有方案 + int bagSize = (target + sum) / 2; + + vector> dp(nums.size(), vector(bagSize + 1, 0)); + + if (nums[0] <= bagSize) dp[0][nums[0]] = 1; + + dp[0][0] = 1; + + int numZero = 0; + for (int i = 0; i < nums.size(); i++) { + if (nums[i] == 0) numZero++; + dp[i][0] = (int) pow(2.0, numZero); + } + + for (int i = 1; i < nums.size(); i++) { + for (int j = 0; j <= bagSize; j++) { + if (nums[i] > j) dp[i][j] = dp[i - 1][j]; + else dp[i][j] = dp[i - 1][j] + dp[i - 1][j - nums[i]]; + } + } + for (int i = 0; i < nums.size(); i++) { + for (int j = 0; j <= bagSize; j++) { + cout << dp[i][j] << " "; + } + cout << endl; + } + return dp[nums.size() - 1][bagSize]; + } +}; + +1 1 0 0 0 +1 2 1 0 0 +1 3 3 1 0 +1 4 6 4 1 +1 5 10 10 5 + +初始化 如果没有0, dp[i][0] = 1; 即所有元素都不取。 + +用元素 取与不取来举例 + diff --git "a/problems/kamacoder/0094.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I-SPFA.md" "b/problems/kamacoder/0094.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I-SPFA.md" index 5fe06d349d..3aa5365561 100644 --- "a/problems/kamacoder/0094.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I-SPFA.md" +++ "b/problems/kamacoder/0094.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I-SPFA.md" @@ -64,7 +64,7 @@ ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240328104119.png) -本图中,对所有边进行松弛,真正有效的松弛,只有松弛 边(节点1->节点2) 和 边(节点1->节点5) 。 +本图中,对所有边进行松弛,真正有效的松弛,只有松弛 边(节点1->节点2) 和 边(节点1->节点3) 。 而松弛 边(节点4->节点6) ,边(节点5->节点3)等等 都是无效的操作,因为 节点4 和 节点 5 都是没有被计算过的节点。 diff --git "a/problems/kamacoder/0151.\346\211\213\346\234\272\346\265\201\347\225\205\350\277\220\350\241\214\347\232\204\347\247\230\345\257\206.md" "b/problems/kamacoder/0151.\346\211\213\346\234\272\346\265\201\347\225\205\350\277\220\350\241\214\347\232\204\347\247\230\345\257\206.md" new file mode 100644 index 0000000000..3859f7b039 --- /dev/null +++ "b/problems/kamacoder/0151.\346\211\213\346\234\272\346\265\201\347\225\205\350\277\220\350\241\214\347\232\204\347\247\230\345\257\206.md" @@ -0,0 +1,127 @@ +# 151. 手机流畅运行的秘密 + +[题目链接](https://kamacoder.com/problempage.php?pid=1229) + +先运行 能留下电量多的 任务,才能有余电运行其他任务。 + +任务1,1:10 ,运行完 能留下 9个电 + +任务2,2:12,运行完 能留下 10个电 + +任务3,3:10,运行完 能留下 7个电。 + +运行顺序: 任务2 -> 任务1 -> 任务3 + +按照 最低初始电量 - 耗电量,从大到小排序。 + +计算总电量,需要 从小到大 遍历, 不断取 总电量 + 任务耗电量 与 任务最低初始电量 的最大值。 + +```CPP +#include +using namespace std; + +bool cmp(const pair& taskA, const pair& taskB) { + return (taskA.second - taskA.first) < (taskB.second - taskB.first); +} +int main() { + string str, tmp; + vector> tasks; + + //处理输入 + getline(cin, str); + stringstream ss(str); + while (getline(ss, tmp, ',')) { + int p = tmp.find(":"); + string a = tmp.substr(0, p); + string b = tmp.substr(p + 1); + tasks.push_back({stoi(a), stoi(b)}); + } + + // 按照差值从小到大排序 + sort(tasks.begin(), tasks.end(), cmp); + + // 收集结果 + int result = 0; + for (int i = 0 ; i < tasks.size(); i++) { + result = max(result + tasks[i].first, tasks[i].second); + } + + result = result <= 4800 ? result : -1; + cout << result << endl; + +} +``` + +Java版本: + +```Java +import java.util.*; +import java.util.stream.Collectors; + +public class Main { + public static void main(String[] args) { + Scanner sc = new Scanner(System.in); + String str = sc.nextLine(); + String[] tasksArray = str.split(","); + List tasks = Arrays.stream(tasksArray) + .map(task -> { + String[] parts = task.split(":"); + return new Pair(Integer.parseInt(parts[0]), Integer.parseInt(parts[1])); + }) + .collect(Collectors.toList()); + + // 按照差值从小到大排序 + Collections.sort(tasks, (taskA, taskB) -> + (taskA.second - taskA.first) - (taskB.second - taskB.first) + ); + + // 收集结果 + int result = 0; + for (Pair task : tasks) { + result = Math.max(result + task.first, task.second); + } + + result = result <= 4800 ? result : -1; + System.out.println(result); + } +} + +class Pair { + int first; + int second; + + Pair(int first, int second) { + this.first = first; + this.second = second; + } +} + +``` + +Python版本: + +```python +def main(): + import sys + input = sys.stdin.read + + str = input().strip() + tasks = [] + for tmp in str.split(','): + a, b = map(int, tmp.split(':')) + tasks.append((a, b)) + + # 按照差值从小到大排序 + tasks.sort(key=lambda task: task[1] - task[0]) + + # 收集结果 + result = 0 + for task in tasks: + result = max(result + task[0], task[1]) + + result = result if result <= 4800 else -1 + print(result) + +if __name__ == "__main__": + main() +``` diff --git "a/problems/kamacoder/0152.\345\260\217\347\261\263\346\211\213\346\234\272\351\200\232\344\277\241\346\240\241\345\207\206.md" "b/problems/kamacoder/0152.\345\260\217\347\261\263\346\211\213\346\234\272\351\200\232\344\277\241\346\240\241\345\207\206.md" new file mode 100644 index 0000000000..afb5d8eaf4 --- /dev/null +++ "b/problems/kamacoder/0152.\345\260\217\347\261\263\346\211\213\346\234\272\351\200\232\344\277\241\346\240\241\345\207\206.md" @@ -0,0 +1,121 @@ + + +# 152. 小米手机通信校准 + +[题目链接](https://kamacoder.com/problempage.php?pid=1230) + +一道模拟题,但比较考察 代码能力。 + +遍历去找 里 freq 最近的 freg就好, 需要记录刚遍历过的的freg和 loss,因为可能有 相邻一样的 freg。 + +```CPP +#include +using namespace std; + +int main() { + int freq; + cin >> freq; + string data; + double result = 0; + int last_freg = 0; // 记录上一个 freg + int last_loss = 0; // 记录上一个loss + while(cin >> data) { + int index = data.find(':'); + int freg = stoi(data.substr(0, index)); // 获取 freg 和 loss + int loss = stoi(data.substr(index + 1)); + // 两遍一样 + if(abs(freg - freq) == abs(last_freg - freq)) { + result = (double)(last_loss + loss)/2.0; + } // 否则更新最新的result + else if(abs(freg - freq) < abs(last_freg - freq)){ + result = (double)loss; + } + last_freg = freg; + last_loss = loss; + } + printf("%.1lf\n", result); + return 0; +} + +``` + +Java 版本: + +```Java + +import java.util.Scanner; + +public class Main { + public static void main(String[] args) { + Scanner sc = new Scanner(System.in); + int freq = sc.nextInt(); + sc.nextLine(); // 读取换行符 + + String inputLine = sc.nextLine(); // 读取包含所有后续输入的行 + String[] data = inputLine.split(" "); // 根据空格分割输入 + + double result = 0; + int lastFreq = 0; // 记录上一个 freg + int lastLoss = 0; // 记录上一个 loss + + for (String entry : data) { + int index = entry.indexOf(':'); + int freg = Integer.parseInt(entry.substring(0, index)); // 获取 freg 和 loss + int loss = Integer.parseInt(entry.substring(index + 1)); + + // 两遍一样 + if (Math.abs(freg - freq) == Math.abs(lastFreq - freq)) { + result = (double) (lastLoss + loss) / 2.0; + } + // 否则更新最新的 result + else if (Math.abs(freg - freq) < Math.abs(lastFreq - freq)) { + result = (double) loss; + } + + lastFreq = freg; + lastLoss = loss; + } + + System.out.printf("%.1f\n", result); + sc.close(); + } +} + +``` + +Python版本: + +```python +def main(): + import sys + input = sys.stdin.read + data = input().split() + + freq = int(data[0]) + result = 0 + last_freg = 0 # 记录上一个 freg + last_loss = 0 # 记录上一个 loss + + for i in range(1, len(data)): + item = data[i] + index = item.find(':') + freg = int(item[:index]) # 获取 freg 和 loss + loss = int(item[index + 1:]) + + # 两遍一样 + if abs(freg - freq) == abs(last_freg - freq): + result = (last_loss + loss) / 2.0 + # 否则更新最新的 result + elif abs(freg - freq) < abs(last_freg - freq): + result = loss + + last_freg = freg + last_loss = loss + + print(f"{result:.1f}") + +if __name__ == "__main__": + main() + + +``` From 0d6080ba5cd0d9a3548851758cf2858e5aa999da Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Tue, 6 Aug 2024 16:21:23 +0800 Subject: [PATCH 2744/3019] =?UTF-8?q?=20=E6=9B=B4=E6=96=B0spfa?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\350\264\247\347\211\251\350\277\220\350\276\223I-SPFA.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/problems/kamacoder/0094.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I-SPFA.md" "b/problems/kamacoder/0094.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I-SPFA.md" index 3aa5365561..07317d6b04 100644 --- "a/problems/kamacoder/0094.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I-SPFA.md" +++ "b/problems/kamacoder/0094.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I-SPFA.md" @@ -162,7 +162,7 @@ ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240729161116.png) -所以我们在加入队列的过程可以有一个优化,用visited数组记录已经加入队列的元素,已经在队列的元素不用重复加入 +所以我们在加入队列的过程可以有一个优化,**用visited数组记录已经在队列里的元素,已经在队列的元素不用重复加入** -------------- @@ -233,7 +233,7 @@ int main() { while (!que.empty()) { int node = que.front(); que.pop(); - isInQueue[node] = false; // 从队列里取出的时候,要取消标记 + isInQueue[node] = false; // 从队列里取出的时候,要取消标记,我们只保证已经在队列里的元素不用重复加入 for (Edge edge : grid[node]) { int from = node; int to = edge.to; From 0cdfc3fef87a285f3ddc0e9ddce491c1f38a69de Mon Sep 17 00:00:00 2001 From: ma <501847822@qq.com> Date: Wed, 7 Aug 2024 10:46:56 +0800 Subject: [PATCH 2745/3019] =?UTF-8?q?Update=200018.=E5=9B=9B=E6=95=B0?= =?UTF-8?q?=E4=B9=8B=E5=92=8C.md=20=E6=9B=B4=E6=96=B0=20Java=20=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...233\233\346\225\260\344\271\213\345\222\214.md" | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git "a/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" "b/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" index 8e34713d37..961de9ba74 100644 --- "a/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" @@ -251,8 +251,8 @@ class Solution { for (int i = 0; i < nums.length; i++) { - // nums[i] > target 直接返回, 剪枝操作 - if (nums[i] > 0 && nums[i] > target) { + // nums[i] >= 0 && nums[i] > target 直接返回, 剪枝操作 + if (nums[i] >= 0 && nums[i] > target) { return result; } @@ -262,10 +262,10 @@ class Solution { for (int j = i + 1; j < nums.length; j++) { - // nums[i]+nums[j] > target 直接返回, 剪枝操作 - if (nums[i]+nums[j] > 0 && nums[i]+nums[j] > target) { - return result; - } + // nums[i] >= 0 && nums[i] + nums[j] > target 剪枝操作 + if (nums[i] >= 0 && nums[i] + nums[j] > target) { + break; + } if (j > i + 1 && nums[j - 1] == nums[j]) { // 对nums[j]去重 continue; @@ -274,7 +274,7 @@ class Solution { int left = j + 1; int right = nums.length - 1; while (right > left) { - // nums[k] + nums[i] + nums[left] + nums[right] > target int会溢出 + // nums[j] + nums[i] + nums[left] + nums[right] int 可能会溢出,需要转为 long long sum = (long) nums[i] + nums[j] + nums[left] + nums[right]; if (sum > target) { right--; From 43d28e6bd3fa92f45a18dc00da7cd2470e0872f7 Mon Sep 17 00:00:00 2001 From: markwang Date: Wed, 7 Aug 2024 17:06:16 +0800 Subject: [PATCH 2746/3019] =?UTF-8?q?343.=E6=95=B4=E6=95=B0=E6=8B=86?= =?UTF-8?q?=E5=88=86=E5=A2=9E=E5=8A=A0Go=E8=B4=AA=E5=BF=83=E8=A7=A3?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...64\346\225\260\346\213\206\345\210\206.md" | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git "a/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" "b/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" index 205b220144..7295627fde 100644 --- "a/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" +++ "b/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" @@ -309,6 +309,8 @@ class Solution: ``` ### Go + +动态规划 ```go func integerBreak(n int) int { /** @@ -338,6 +340,28 @@ func max(a, b int) int{ } ``` +贪心 +```go +func integerBreak(n int) int { + if n == 2 { + return 1 + } + if n == 3 { + return 2 + } + if n == 4 { + return 4 + } + result := 1 + for n > 4 { + result *= 3 + n -= 3 + } + result *= n + return result +} +``` + ### Javascript ```Javascript var integerBreak = function(n) { From 00405e519283b681daca6bb0f9dc5d292c1cc9ab Mon Sep 17 00:00:00 2001 From: Allen Guo Date: Wed, 7 Aug 2024 07:13:31 -0700 Subject: [PATCH 2747/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B00094.=E5=9F=8E?= =?UTF-8?q?=E5=B8=82=E9=97=B4=E8=B4=A7=E7=89=A9=E8=BF=90=E8=BE=93I.md=20Ja?= =?UTF-8?q?va=E7=89=88=E6=9C=AC=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...7\347\211\251\350\277\220\350\276\223I.md" | 57 +++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git "a/problems/kamacoder/0094.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I.md" "b/problems/kamacoder/0094.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I.md" index f72bfc00a4..45ca131361 100644 --- "a/problems/kamacoder/0094.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I.md" +++ "b/problems/kamacoder/0094.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I.md" @@ -392,6 +392,63 @@ Bellman_ford 是可以计算 负权值的单源最短路算法。 ## 其他语言版本 ### Java +```Java +public class Main { + + // Define an inner class Edge + static class Edge { + int from; + int to; + int val; + public Edge(int from, int to, int val) { + this.from = from; + this.to = to; + this.val = val; + } + } + + public static void main(String[] args) { + // Input processing + Scanner sc = new Scanner(System.in); + int n = sc.nextInt(); + int m = sc.nextInt(); + List edges = new ArrayList<>(); + + for (int i = 0; i < m; i++) { + int from = sc.nextInt(); + int to = sc.nextInt(); + int val = sc.nextInt(); + edges.add(new Edge(from, to, val)); + } + + // Represents the minimum distance from the current node to the original node + int[] minDist = new int[n + 1]; + + // Initialize the minDist array + Arrays.fill(minDist, Integer.MAX_VALUE); + minDist[1] = 0; + + // Starts the loop to relax all edges n - 1 times to update minDist array + for (int i = 1; i < n; i++) { + + for (Edge edge : edges) { + // Updates the minDist array + if (minDist[edge.from] != Integer.MAX_VALUE && (minDist[edge.from] + edge.val) < minDist[edge.to]) { + minDist[edge.to] = minDist[edge.from] + edge.val; + } + } + } + + // Outcome printing + if (minDist[n] == Integer.MAX_VALUE) { + System.out.println("unconnected"); + } else { + System.out.println(minDist[n]); + } + } +} + +``` ### Python From 2ecb6a5e71a40e6cae9f02c8bb0755f4ba8249d0 Mon Sep 17 00:00:00 2001 From: Allen Guo Date: Wed, 7 Aug 2024 10:16:28 -0700 Subject: [PATCH 2748/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B00094.=E5=9F=8E?= =?UTF-8?q?=E5=B8=82=E9=97=B4=E8=B4=A7=E7=89=A9=E8=BF=90=E8=BE=93I-SPFA=20?= =?UTF-8?q?Java=E7=89=88=E6=9C=AC=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\211\251\350\277\220\350\276\223I-SPFA.md" | 71 +++++++++++++++++++ 1 file changed, 71 insertions(+) diff --git "a/problems/kamacoder/0094.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I-SPFA.md" "b/problems/kamacoder/0094.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I-SPFA.md" index 07317d6b04..ce38391943 100644 --- "a/problems/kamacoder/0094.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I-SPFA.md" +++ "b/problems/kamacoder/0094.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I-SPFA.md" @@ -352,6 +352,77 @@ SPFA(队列优化版Bellman_ford) 在理论上 时间复杂度更胜一筹 ## 其他语言版本 ### Java +```Java +import java.util.*; + +public class Main { + + // Define an inner class Edge + static class Edge { + int from; + int to; + int val; + public Edge(int from, int to, int val) { + this.from = from; + this.to = to; + this.val = val; + } + } + + public static void main(String[] args) { + // Input processing + Scanner sc = new Scanner(System.in); + int n = sc.nextInt(); + int m = sc.nextInt(); + List> graph = new ArrayList<>(); + + for (int i = 0; i <= n; i++) { + graph.add(new ArrayList<>()); + } + + for (int i = 0; i < m; i++) { + int from = sc.nextInt(); + int to = sc.nextInt(); + int val = sc.nextInt(); + graph.get(from).add(new Edge(from, to, val)); + } + + // Declare the minDist array to record the minimum distance form current node to the original node + int[] minDist = new int[n + 1]; + Arrays.fill(minDist, Integer.MAX_VALUE); + minDist[1] = 0; + + // Declare a queue to store the updated nodes instead of traversing all nodes each loop for more efficiency + Queue queue = new LinkedList<>(); + queue.offer(1); + + // Declare a boolean array to record if the current node is in the queue to optimise the processing + boolean[] isInQueue = new boolean[n + 1]; + + while (!queue.isEmpty()) { + int curNode = queue.poll(); + isInQueue[curNode] = false; // Represents the current node is not in the queue after being polled + for (Edge edge : graph.get(curNode)) { + if (minDist[edge.to] > minDist[edge.from] + edge.val) { // Start relaxing the edge + minDist[edge.to] = minDist[edge.from] + edge.val; + if (!isInQueue[edge.to]) { // Don't add the node if it's already in the queue + queue.offer(edge.to); + isInQueue[edge.to] = true; + } + } + } + } + + // Outcome printing + if (minDist[n] == Integer.MAX_VALUE) { + System.out.println("unconnected"); + } else { + System.out.println(minDist[n]); + } + } +} + +``` ### Python From a1365a6017da35ed336b3e1546a7a9fda167696b Mon Sep 17 00:00:00 2001 From: Taylor Zhu Date: Wed, 7 Aug 2024 17:46:03 -0700 Subject: [PATCH 2749/3019] =?UTF-8?q?Update=200232.=E7=94=A8=E6=A0=88?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E9=98=9F=E5=88=97.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ”模式“ -> ”模拟“ --- ...\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" "b/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" index e8a3d2ec33..7017107bf8 100644 --- "a/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" +++ "b/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" @@ -44,7 +44,7 @@ queue.empty(); // 返回 false 这是一道模拟题,不涉及到具体算法,考察的就是对栈和队列的掌握程度。 -使用栈来模式队列的行为,如果仅仅用一个栈,是一定不行的,所以需要两个栈**一个输入栈,一个输出栈**,这里要注意输入栈和输出栈的关系。 +使用栈来模拟队列的行为,如果仅仅用一个栈,是一定不行的,所以需要两个栈**一个输入栈,一个输出栈**,这里要注意输入栈和输出栈的关系。 下面动画模拟以下队列的执行过程: From d90d5fbdca5a82420521a960fc04f8fe067aaacf Mon Sep 17 00:00:00 2001 From: wangya <1264178545@qq.com> Date: Thu, 8 Aug 2024 14:07:41 +0800 Subject: [PATCH 2750/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20=E5=8D=A1?= =?UTF-8?q?=E7=A0=81=E7=BD=910104.=E5=BB=BA=E9=80=A0=E6=9C=80=E5=A4=A7?= =?UTF-8?q?=E5=B2=9B=E5=B1=BF=20JS=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...00\345\244\247\345\262\233\345\261\277.md" | 117 ++++++++++++++++++ 1 file changed, 117 insertions(+) diff --git "a/problems/kamacoder/0104.\345\273\272\351\200\240\346\234\200\345\244\247\345\262\233\345\261\277.md" "b/problems/kamacoder/0104.\345\273\272\351\200\240\346\234\200\345\244\247\345\262\233\345\261\277.md" index 7d67b7fcb1..d1f27e6dbd 100644 --- "a/problems/kamacoder/0104.\345\273\272\351\200\240\346\234\200\345\244\247\345\262\233\345\261\277.md" +++ "b/problems/kamacoder/0104.\345\273\272\351\200\240\346\234\200\345\244\247\345\262\233\345\261\277.md" @@ -372,6 +372,123 @@ public class Main { ### Javascript +```javascript +const r1 = require('readline').createInterface({ input: process.stdin }); +// 创建readline接口 +let iter = r1[Symbol.asyncIterator](); +// 创建异步迭代器 +const readline = async () => (await iter.next()).value; + +let graph // 地图 +let N, M // 地图大小 +let visited // 访问过的节点, 标记岛屿 +const dir = [[0, 1], [1, 0], [0, -1], [-1, 0]] //方向 + +let count = 0 // 统计岛屿面积 +let areaMap = new Map() // 存储岛屿面积 + + +// 读取输入,初始化地图 +const initGraph = async () => { + let line = await readline(); + [N, M] = line.split(' ').map(Number); + graph = new Array(N).fill(0).map(() => new Array(M).fill(0)) + visited = new Array(N).fill(0).map(() => new Array(M).fill(0)) + + for (let i = 0; i < N; i++) { + line = await readline() + line = line.split(' ').map(Number) + for (let j = 0; j < M; j++) { + graph[i][j] = line[j] + } + } +} + +/** + * @description: 从(x,y)开始深度优先遍历地图 + * @param {*} graph 地图 + * @param {*} visited 可访问节点 + * @param {*} x 开始搜索节点的下标 + * @param {*} y 开始搜索节点的下标 + * @param {*} mark 当前岛屿的标记 + * @return {*} + */ +const dfs = (graph, visited, x, y, mark) => { + if (visited[x][y] != 0) return + visited[x][y] = mark + count++ + + for (let i = 0; i < 4; i++) { + let nextx = x + dir[i][0] + let nexty = y + dir[i][1] + if (nextx < 0 || nextx >= N || nexty < 0 || nexty >= M) continue //越界, 跳过 + + // 已访问过, 或者是海洋, 跳过 + if (visited[nextx][nexty] != 0 || graph[nextx][nexty] == 0) continue + + dfs(graph, visited, nextx, nexty, mark) + } +} + +(async function () { + + // 读取输入,初始化地图 + await initGraph() + + let isAllLand = true //标记整个地图都是陆地 + + let mark = 2 // 标记岛屿 + for (let i = 0; i < N; i++) { + for (let j = 0; j < M; j++) { + if (graph[i][j] == 0 && isAllLand) isAllLand = false + if (graph[i][j] === 1 && visited[i][j] === 0) { + count = 0 + dfs(graph, visited, i, j, mark) + areaMap.set(mark, count) + mark++ + } + } + } + + // 如果全是陆地, 直接返回面积 + if (isAllLand) { + console.log(N * M); + return + } + + let result = 0 // 记录最后结果 + let visitedIsland = new Map() //标记访问过的岛屿, 因为海洋四周可能是同一个岛屿, 需要标记避免重复统计面积 + for (let i = 0; i < N; i++) { + for (let j = 0; j < M; j++) { + if (visited[i][j] === 0) { + count = 1 // 记录连接之后的岛屿数量 + visitedIsland.clear() // 每次使用时,清空 + + // 计算海洋周围岛屿面积 + for (let m = 0; m < 4; m++) { + const nextx = i + dir[m][0] + const nexty = j + dir[m][1] + if (nextx < 0 || nextx >= N || nexty < 0 || nexty >= M) continue //越界, 跳过 + + const island = visited[nextx][nexty] + if (island == 0 || visitedIsland.get(island)) continue// 四周是海洋或者访问过的陆地 跳过 + + // 标记为访问, 计算面积 + visitedIsland.set(island, true) + count += areaMap.get(visited[nextx][nexty]) + } + + result = Math.max(result, count) + } + } + } + + console.log(result); +})() +``` + + + ### TypeScript ### PhP From aff4169f1cd5248411021027cd176002f6b5a378 Mon Sep 17 00:00:00 2001 From: wangya <1264178545@qq.com> Date: Thu, 8 Aug 2024 14:11:08 +0800 Subject: [PATCH 2751/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20=E5=8D=A1?= =?UTF-8?q?=E7=A0=81=E7=BD=910107.=E5=AF=BB=E6=89=BE=E5=AD=98=E5=9C=A8?= =?UTF-8?q?=E7=9A=84=E8=B7=AF=E5=BE=84=20JS=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...50\347\232\204\350\267\257\345\276\204.md" | 66 +++++++++++++++++++ 1 file changed, 66 insertions(+) diff --git "a/problems/kamacoder/0107.\345\257\273\346\211\276\345\255\230\345\234\250\347\232\204\350\267\257\345\276\204.md" "b/problems/kamacoder/0107.\345\257\273\346\211\276\345\255\230\345\234\250\347\232\204\350\267\257\345\276\204.md" index 906609c99a..97b2714c90 100644 --- "a/problems/kamacoder/0107.\345\257\273\346\211\276\345\255\230\345\234\250\347\232\204\350\267\257\345\276\204.md" +++ "b/problems/kamacoder/0107.\345\257\273\346\211\276\345\255\230\345\234\250\347\232\204\350\267\257\345\276\204.md" @@ -168,6 +168,72 @@ int main() { ### Javascript +```java +const r1 = require('readline').createInterface({ input: process.stdin }); +// 创建readline接口 +let iter = r1[Symbol.asyncIterator](); +// 创建异步迭代器 +const readline = async () => (await iter.next()).value; + + +let N, M // 节点数和边数 +let source, destination // 起点 终点 +let father = [] // 并查集 + + +// 并查集初始化 +const init = () => { + for (let i = 1; i <= N; i++) father[i] = i; +} + +// 并查集里寻根的过程 +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 isSame = (u, v) => { + u = find(u) + v = find(v) + return u == v +} + + +(async function () { + // 读取第一行输入 + let line = await readline(); + [N, M] = line.split(' ').map(Number); + + // 初始化并查集 + father = new Array(N) + init() + + // 读取边信息, 加入并查集 + for (let i = 0; i < M; i++) { + line = await readline() + line = line.split(' ').map(Number) + join(line[0], line[1]) + } + + // 读取起点和终点 + line = await readline(); //JS注意这里的冒号 + [source, destination] = line.split(' ').map(Number) + + if (isSame(source, destination)) return console.log(1); + console.log(0); +})() +``` + + + ### TypeScript ### PhP From 006fb935ffc246c2818d64d5efc3b55cb73e965e Mon Sep 17 00:00:00 2001 From: wangya <1264178545@qq.com> Date: Thu, 8 Aug 2024 14:13:25 +0800 Subject: [PATCH 2752/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20=E5=8D=A1?= =?UTF-8?q?=E7=A0=81=E7=BD=910108.=E5=86=97=E4=BD=99=E8=BF=9E=E6=8E=A5=20J?= =?UTF-8?q?S=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...27\344\275\231\350\277\236\346\216\245.md" | 64 +++++++++++++++++++ 1 file changed, 64 insertions(+) diff --git "a/problems/kamacoder/0108.\345\206\227\344\275\231\350\277\236\346\216\245.md" "b/problems/kamacoder/0108.\345\206\227\344\275\231\350\277\236\346\216\245.md" index 7088413967..8acb2f10cb 100644 --- "a/problems/kamacoder/0108.\345\206\227\344\275\231\350\277\236\346\216\245.md" +++ "b/problems/kamacoder/0108.\345\206\227\344\275\231\350\277\236\346\216\245.md" @@ -141,6 +141,70 @@ int main() { ### Javascript +```javascript +const r1 = require('readline').createInterface({ input: process.stdin }); +// 创建readline接口 +let iter = r1[Symbol.asyncIterator](); +// 创建异步迭代器 +const readline = async () => (await iter.next()).value; + + +let N // 节点数和边数 +let father = [] // 并查集 + + +// 并查集初始化 +const init = () => { + for (let i = 1; i <= N; i++) father[i] = i; +} + +// 并查集里寻根的过程 +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 isSame = (u, v) => { + u = find(u) + v = find(v) + return u == v +} + + +(async function () { + // 读取第一行输入 + let line = await readline(); + N = Number(line); + + // 初始化并查集 + father = new Array(N) + init() + + // 读取边信息, 加入并查集 + for (let i = 0; i < N; i++) { + line = await readline() + line = line.split(' ').map(Number) + + if (!isSame(line[0], line[1])) { + join(line[0], line[1]) + }else{ + console.log(line[0], line[1]); + break + } + } +})() +``` + + + ### TypeScript ### PhP From a2aefe49b28d1a3b2bf6fd6b3e1aba76b0e5522d Mon Sep 17 00:00:00 2001 From: wangya <1264178545@qq.com> Date: Thu, 8 Aug 2024 14:18:08 +0800 Subject: [PATCH 2753/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20=E5=8D=A1?= =?UTF-8?q?=E7=A0=81=E7=BD=910109.=E5=86=97=E4=BD=99=E8=BF=9E=E6=8E=A5II?= =?UTF-8?q?=20JS=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\344\275\231\350\277\236\346\216\245II.md" | 113 ++++++++++++++++++ 1 file changed, 113 insertions(+) diff --git "a/problems/kamacoder/0109.\345\206\227\344\275\231\350\277\236\346\216\245II.md" "b/problems/kamacoder/0109.\345\206\227\344\275\231\350\277\236\346\216\245II.md" index b13daec7bf..62b319c39b 100644 --- "a/problems/kamacoder/0109.\345\206\227\344\275\231\350\277\236\346\216\245II.md" +++ "b/problems/kamacoder/0109.\345\206\227\344\275\231\350\277\236\346\216\245II.md" @@ -254,6 +254,119 @@ int main() { ### Javascript +```javascript +const r1 = require('readline').createInterface({ input: process.stdin }); +// 创建readline接口 +let iter = r1[Symbol.asyncIterator](); +// 创建异步迭代器 +const readline = async () => (await iter.next()).value; + + +let N // 节点数和边数 +let father = [] // 并查集 +let edges = [] // 边集 +let inDegree = [] // 入度 + + +// 并查集初始化 +const init = () => { + for (let i = 1; i <= N; i++) father[i] = i; +} + +// 并查集里寻根的过程 +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 isSame = (u, v) => { + u = find(u) + v = find(v) + return u == v +} + +// 判断删除一条边后是不是树 +const isTreeAfterRemoveEdge = (edges, edge) => { + // 初始化并查集 + init() + + for (let i = 0; i < N; i++) { + if (i == edge) continue + if (isSame(edges[i][0], edges[i][1])) { // 构成有向环了,一定不是树 + return false + } + join(edges[i][0], edges[i][1]) + } + return true +} + +// 在有向图里找到删除的那条边, 使其成为树 +const getRemoveEdge = (edges) => { + // 初始化并查集 + init() + + for (let i = 0; i < N; i++) { + if (isSame(edges[i][0], edges[i][1])) { // 构成有向环了,就是要删除的边 + console.log(edges[i][0], edges[i][1]); + return + } else { + join(edges[i][0], edges[i][1]) + } + } +} + + +(async function () { + // 读取第一行输入 + let line = await readline(); + N = Number(line); + + // 读取边信息, 统计入度 + for (let i = 0; i < N; i++) { + line = await readline() + line = line.split(' ').map(Number) + + edges.push(line) + + inDegree[line[1]] = (inDegree[line[1]] || 0) + 1 + } + + // 找到入度为2的节点 + let vec = [] // 记录入度为2的边(如果有的话就两条边) + // 找入度为2的节点所对应的边,注意要倒序,因为优先删除最后出现的一条边 + for (let i = N - 1; i >= 0; i--) { + if (inDegree[edges[i][1]] == 2) { + vec.push(i) + } + } + + // 情况一、情况二 + if (vec.length > 0) { + // 放在vec里的边已经按照倒叙放的,所以这里就优先删vec[0]这条边 + if (isTreeAfterRemoveEdge(edges, vec[0])) { + console.log(edges[vec[0]][0], edges[vec[0]][1]); + } else { + console.log(edges[vec[1]][0], edges[vec[1]][1]); + } + return 0 + } + + // 情况三 + // 明确没有入度为2的情况,那么一定有有向环,找到构成环的边返回就可以了 + getRemoveEdge(edges) +})() +``` + + + ### TypeScript ### PhP From 047c57ab4063945aeca9b1032fe74e8f5d14a4e8 Mon Sep 17 00:00:00 2001 From: Allen Guo Date: Thu, 8 Aug 2024 09:34:28 -0700 Subject: [PATCH 2754/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B00095.=E5=9F=8E?= =?UTF-8?q?=E5=B8=82=E9=97=B4=E8=B4=A7=E7=89=A9=E8=BF=90=E8=BE=93II=20?= =?UTF-8?q?=E5=9F=BA=E4=BA=8EDPFA=E7=89=88=E6=9C=AC=E7=9A=84Java=E8=A7=A3?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\347\211\251\350\277\220\350\276\223II.md" | 86 +++++++++++++++++++ 1 file changed, 86 insertions(+) diff --git "a/problems/kamacoder/0095.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223II.md" "b/problems/kamacoder/0095.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223II.md" index 5bc4be7b22..6226eb0161 100644 --- "a/problems/kamacoder/0095.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223II.md" +++ "b/problems/kamacoder/0095.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223II.md" @@ -244,6 +244,92 @@ int main() { ## 其他语言版本 ### Java +```Java +import java.util.*; + +public class Main { + // 基于SPFA方法 + // Define an inner class Edge + static class Edge { + int from; + int to; + int val; + public Edge(int from, int to, int val) { + this.from = from; + this.to = to; + this.val = val; + } + } + + public static void main(String[] args) { + // Input processing + Scanner sc = new Scanner(System.in); + int n = sc.nextInt(); + int m = sc.nextInt(); + List> graph = new ArrayList<>(); + + for (int i = 0; i <= n; i++) { + graph.add(new ArrayList<>()); + } + + for (int i = 0; i < m; i++) { + int from = sc.nextInt(); + int to = sc.nextInt(); + int val = sc.nextInt(); + graph.get(from).add(new Edge(from, to, val)); + } + + // Declare the minDist array to record the minimum distance form current node to the original node + int[] minDist = new int[n + 1]; + Arrays.fill(minDist, Integer.MAX_VALUE); + minDist[1] = 0; + + // Declare a queue to store the updated nodes instead of traversing all nodes each loop for more efficiency + Queue queue = new LinkedList<>(); + queue.offer(1); + + // Declare an array to record the times each node has been offered in the queue + int[] count = new int[n + 1]; + count[1]++; + + // Declare a boolean array to record if the current node is in the queue to optimise the processing + boolean[] isInQueue = new boolean[n + 1]; + + // Declare a boolean value to check if there is a negative weight loop inside the graph + boolean flag = false; + + while (!queue.isEmpty()) { + int curNode = queue.poll(); + isInQueue[curNode] = false; // Represents the current node is not in the queue after being polled + for (Edge edge : graph.get(curNode)) { + if (minDist[edge.to] > minDist[edge.from] + edge.val) { // Start relaxing the edge + minDist[edge.to] = minDist[edge.from] + edge.val; + if (!isInQueue[edge.to]) { // Don't add the node if it's already in the queue + queue.offer(edge.to); + count[edge.to]++; + isInQueue[edge.to] = true; + } + + if (count[edge.to] == n) { // If some node has been offered in the queue more than n-1 times + flag = true; + while (!queue.isEmpty()) queue.poll(); + break; + } + } + } + } + + if (flag) { + System.out.println("circle"); + } else if (minDist[n] == Integer.MAX_VALUE) { + System.out.println("unconnected"); + } else { + System.out.println(minDist[n]); + } + } +} + +``` ### Python From d2163ac3f698a4f2f0c4077a40db4e81cab42e14 Mon Sep 17 00:00:00 2001 From: Allen Guo Date: Thu, 8 Aug 2024 09:43:47 -0700 Subject: [PATCH 2755/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B00095.=E5=9F=8E?= =?UTF-8?q?=E5=B8=82=E9=97=B4=E8=B4=A7=E7=89=A9=E8=BF=90=E8=BE=93II=20?= =?UTF-8?q?=E5=9F=BA=E4=BA=8ESPFA=E7=89=88=E6=9C=AC=E7=9A=84Java=E8=A7=A3?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...27\264\350\264\247\347\211\251\350\277\220\350\276\223II.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/kamacoder/0095.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223II.md" "b/problems/kamacoder/0095.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223II.md" index 6226eb0161..f1025e4a7f 100644 --- "a/problems/kamacoder/0095.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223II.md" +++ "b/problems/kamacoder/0095.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223II.md" @@ -248,7 +248,7 @@ int main() { import java.util.*; public class Main { - // 基于SPFA方法 + // 基于Bellman_ford-SPFA方法 // Define an inner class Edge static class Edge { int from; From ab6cb84cb905dc3ededa4165653435afd38c34ed Mon Sep 17 00:00:00 2001 From: Allen Guo Date: Thu, 8 Aug 2024 17:14:40 -0700 Subject: [PATCH 2756/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B00096.=E5=9F=8E?= =?UTF-8?q?=E5=B8=82=E9=97=B4=E8=B4=A7=E7=89=A9=E8=BF=90=E8=BE=93III=20?= =?UTF-8?q?=E5=9F=BA=E4=BA=8EBellman=5Fford=E4=B8=80=E8=88=AC=E8=A7=A3?= =?UTF-8?q?=E6=B3=95Java=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...347\211\251\350\277\220\350\276\223III.md" | 65 +++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git "a/problems/kamacoder/0096.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223III.md" "b/problems/kamacoder/0096.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223III.md" index feaaa1f3c3..dacd23d11d 100644 --- "a/problems/kamacoder/0096.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223III.md" +++ "b/problems/kamacoder/0096.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223III.md" @@ -636,6 +636,71 @@ dijkstra 是贪心的思路 每一次搜索都只会找距离源点最近的非 ## 其他语言版本 ### Java +```Java +import java.util.*; + +public class Main { + // 基于Bellman_for一般解法解决单源最短路径问题 + // Define an inner class Edge + static class Edge { + int from; + int to; + int val; + public Edge(int from, int to, int val) { + this.from = from; + this.to = to; + this.val = val; + } + } + + public static void main(String[] args) { + // Input processing + Scanner sc = new Scanner(System.in); + int n = sc.nextInt(); + int m = sc.nextInt(); + + List graph = new ArrayList<>(); + + for (int i = 0; i < m; i++) { + int from = sc.nextInt(); + int to = sc.nextInt(); + int val = sc.nextInt(); + graph.add(new Edge(from, to, val)); + } + + int src = sc.nextInt(); + int dst = sc.nextInt(); + int k = sc.nextInt(); + + int[] minDist = new int[n + 1]; + int[] minDistCopy; + + Arrays.fill(minDist, Integer.MAX_VALUE); + minDist[src] = 0; + + for (int i = 0; i < k + 1; i++) { // Relax all edges k + 1 times + minDistCopy = Arrays.copyOf(minDist, n + 1); + for (Edge edge : graph) { + int from = edge.from; + int to = edge.to; + int val = edge.val; + // Use minDistCopy to calculate minDist + if (minDistCopy[from] != Integer.MAX_VALUE && minDist[to] > minDistCopy[from] + val) { + minDist[to] = minDistCopy[from] + val; + } + } + } + + // Output printing + if (minDist[dst] == Integer.MAX_VALUE) { + System.out.println("unreachable"); + } else { + System.out.println(minDist[dst]); + } + } +} + +``` ### Python From 93c206794beafcf6c2416e59291351984982e2b9 Mon Sep 17 00:00:00 2001 From: markwang Date: Fri, 9 Aug 2024 14:22:09 +0800 Subject: [PATCH 2757/3019] =?UTF-8?q?01=E8=83=8C=E5=8C=85-2=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0Go=E4=B8=80=E7=BB=B4=E6=95=B0=E7=BB=84,=E4=BA=8C?= =?UTF-8?q?=E7=BB=B4=E6=95=B0=E7=BB=84=E7=A7=BB=E8=87=B3-1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...47\241\20001\350\203\214\345\214\205-1.md" | 52 +++++++++++++ ...47\241\20001\350\203\214\345\214\205-2.md" | 73 +++++++++---------- 2 files changed, 86 insertions(+), 39 deletions(-) diff --git "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" index 0c78e3f695..6b9be72d6e 100644 --- "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" +++ "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" @@ -437,6 +437,58 @@ print(dp[n - 1][bagweight]) ### Go ```go +package main + +import ( + "fmt" +) + +func main() { + var n, bagweight int // bagweight代表行李箱空间 + fmt.Scan(&n, &bagweight) + + weight := make([]int, n) // 存储每件物品所占空间 + value := make([]int, n) // 存储每件物品价值 + + for i := 0; i < n; i++ { + fmt.Scan(&weight[i]) + } + for j := 0; j < n; j++ { + fmt.Scan(&value[j]) + } + // dp数组, dp[i][j]代表行李箱空间为j的情况下,从下标为[0, i]的物品里面任意取,能达到的最大价值 + dp := make([][]int, n) + for i := range dp { + dp[i] = make([]int, bagweight+1) + } + + // 初始化, 因为需要用到dp[i - 1]的值 + // j < weight[0]已在上方被初始化为0 + // j >= weight[0]的值就初始化为value[0] + for j := weight[0]; j <= bagweight; j++ { + dp[0][j] = value[0] + } + + for i := 1; i < n; i++ { // 遍历科研物品 + for j := 0; j <= bagweight; j++ { // 遍历行李箱容量 + if j < weight[i] { + dp[i][j] = dp[i-1][j] // 如果装不下这个物品,那么就继承dp[i - 1][j]的值 + } else { + dp[i][j] = max(dp[i-1][j], dp[i-1][j-weight[i]]+value[i]) + } + } + } + + fmt.Println(dp[n-1][bagweight]) +} + +func max(x, y int) int { + if x > y { + return x + } + return y +} + ``` ### Javascript diff --git "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" index c61a72cc40..6485da1f9e 100644 --- "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" +++ "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" @@ -318,50 +318,45 @@ print(dp[n - 1][bagweight]) package main import ( - "fmt" + "fmt" ) func main() { - var n, bagweight int - fmt.Scan(&n, &bagweight) - - weight := make([]int, n) - value := make([]int, n) - - for i := 0; i < n; i++ { - fmt.Scan(&weight[i]) - } - for j := 0; j < n; j++ { - fmt.Scan(&value[j]) - } - - dp := make([][]int, n) - for i := range dp { - dp[i] = make([]int, bagweight+1) - } - - for j := weight[0]; j <= bagweight; j++ { - dp[0][j] = value[0] - } - - for i := 1; i < n; i++ { - for j := 0; j <= bagweight; j++ { - if j < weight[i] { - dp[i][j] = dp[i-1][j] - } else { - dp[i][j] = max(dp[i-1][j], dp[i-1][j-weight[i]]+value[i]) - } - } - } - - fmt.Println(dp[n-1][bagweight]) + // 读取 M 和 N + var M, N int + fmt.Scan(&M, &N) + + costs := make([]int, M) + values := make([]int, M) + + for i := 0; i < M; i++ { + fmt.Scan(&costs[i]) + } + for j := 0; j < M; j++ { + fmt.Scan(&values[j]) + } + + // 创建一个动态规划数组dp,初始值为0 + dp := make([]int, N + 1) + + // 外层循环遍历每个类型的研究材料 + for i := 0; i < M; i++ { + // 内层循环从 N 空间逐渐减少到当前研究材料所占空间 + for j := N; j >= costs[i]; j-- { + // 考虑当前研究材料选择和不选择的情况,选择最大值 + dp[j] = max(dp[j], dp[j-costs[i]] + values[i]) + } + } + + // 输出dp[N],即在给定 N 行李空间可以携带的研究材料最大价值 + fmt.Println(dp[N]) } -func max(a, b int) int { - if a > b { - return a - } - return b +func max(x, y int) int { + if x > y { + return x + } + return y } ``` From bb2803ce967080ca6274b854458176a345b5fcee Mon Sep 17 00:00:00 2001 From: markwang Date: Fri, 9 Aug 2024 15:05:17 +0800 Subject: [PATCH 2758/3019] =?UTF-8?q?=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...47\241\20001\350\203\214\345\214\205-1.md" | 82 +++++++++---------- ...47\241\20001\350\203\214\345\214\205-2.md" | 68 +++++++-------- 2 files changed, 75 insertions(+), 75 deletions(-) diff --git "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" index 6b9be72d6e..352b301a8b 100644 --- "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" +++ "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" @@ -440,53 +440,53 @@ print(dp[n - 1][bagweight]) package main import ( - "fmt" + "fmt" ) func main() { - var n, bagweight int // bagweight代表行李箱空间 - fmt.Scan(&n, &bagweight) - - weight := make([]int, n) // 存储每件物品所占空间 - value := make([]int, n) // 存储每件物品价值 - - for i := 0; i < n; i++ { - fmt.Scan(&weight[i]) - } - for j := 0; j < n; j++ { - fmt.Scan(&value[j]) - } - // dp数组, dp[i][j]代表行李箱空间为j的情况下,从下标为[0, i]的物品里面任意取,能达到的最大价值 - dp := make([][]int, n) - for i := range dp { - dp[i] = make([]int, bagweight+1) - } - - // 初始化, 因为需要用到dp[i - 1]的值 - // j < weight[0]已在上方被初始化为0 - // j >= weight[0]的值就初始化为value[0] - for j := weight[0]; j <= bagweight; j++ { - dp[0][j] = value[0] - } - - for i := 1; i < n; i++ { // 遍历科研物品 - for j := 0; j <= bagweight; j++ { // 遍历行李箱容量 - if j < weight[i] { - dp[i][j] = dp[i-1][j] // 如果装不下这个物品,那么就继承dp[i - 1][j]的值 - } else { - dp[i][j] = max(dp[i-1][j], dp[i-1][j-weight[i]]+value[i]) - } - } - } - - fmt.Println(dp[n-1][bagweight]) + var n, bagweight int // bagweight代表行李箱空间 + fmt.Scan(&n, &bagweight) + + weight := make([]int, n) // 存储每件物品所占空间 + value := make([]int, n) // 存储每件物品价值 + + for i := 0; i < n; i++ { + fmt.Scan(&weight[i]) + } + for j := 0; j < n; j++ { + fmt.Scan(&value[j]) + } + // dp数组, dp[i][j]代表行李箱空间为j的情况下,从下标为[0, i]的物品里面任意取,能达到的最大价值 + dp := make([][]int, n) + for i := range dp { + dp[i] = make([]int, bagweight + 1) + } + + // 初始化, 因为需要用到dp[i - 1]的值 + // j < weight[0]已在上方被初始化为0 + // j >= weight[0]的值就初始化为value[0] + for j := weight[0]; j <= bagweight; j++ { + dp[0][j] = value[0] + } + + for i := 1; i < n; i++ { // 遍历科研物品 + for j := 0; j <= bagweight; j++ { // 遍历行李箱容量 + if j < weight[i] { + dp[i][j] = dp[i-1][j] // 如果装不下这个物品,那么就继承dp[i - 1][j]的值 + } else { + dp[i][j] = max(dp[i-1][j], dp[i-1][j-weight[i]]+value[i]) + } + } + } + + fmt.Println(dp[n-1][bagweight]) } func max(x, y int) int { - if x > y { - return x - } - return y + if x > y { + return x + } + return y } ``` diff --git "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" index 6485da1f9e..cd8f317c52 100644 --- "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" +++ "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" @@ -313,50 +313,50 @@ for i in range(1, n): print(dp[n - 1][bagweight]) ``` -### Go +### Go ```go package main import ( - "fmt" + "fmt" ) func main() { - // 读取 M 和 N - var M, N int - fmt.Scan(&M, &N) - - costs := make([]int, M) - values := make([]int, M) - - for i := 0; i < M; i++ { - fmt.Scan(&costs[i]) - } - for j := 0; j < M; j++ { - fmt.Scan(&values[j]) - } - - // 创建一个动态规划数组dp,初始值为0 - dp := make([]int, N + 1) - - // 外层循环遍历每个类型的研究材料 - for i := 0; i < M; i++ { - // 内层循环从 N 空间逐渐减少到当前研究材料所占空间 - for j := N; j >= costs[i]; j-- { - // 考虑当前研究材料选择和不选择的情况,选择最大值 - dp[j] = max(dp[j], dp[j-costs[i]] + values[i]) - } - } - - // 输出dp[N],即在给定 N 行李空间可以携带的研究材料最大价值 - fmt.Println(dp[N]) + // 读取 M 和 N + var M, N int + fmt.Scan(&M, &N) + + costs := make([]int, M) + values := make([]int, M) + + for i := 0; i < M; i++ { + fmt.Scan(&costs[i]) + } + for j := 0; j < M; j++ { + fmt.Scan(&values[j]) + } + + // 创建一个动态规划数组dp,初始值为0 + dp := make([]int, N + 1) + + // 外层循环遍历每个类型的研究材料 + for i := 0; i < M; i++ { + // 内层循环从 N 空间逐渐减少到当前研究材料所占空间 + for j := N; j >= costs[i]; j-- { + // 考虑当前研究材料选择和不选择的情况,选择最大值 + dp[j] = max(dp[j], dp[j-costs[i]] + values[i]) + } + } + + // 输出dp[N],即在给定 N 行李空间可以携带的研究材料最大价值 + fmt.Println(dp[N]) } func max(x, y int) int { - if x > y { - return x - } - return y + if x > y { + return x + } + return y } ``` From a681794bc82acab371c8f73076b16d60f29708d3 Mon Sep 17 00:00:00 2001 From: DengSchoo <46556279+DengSchoo@users.noreply.github.com> Date: Fri, 9 Aug 2024 16:49:23 +0800 Subject: [PATCH 2759/3019] =?UTF-8?q?chore:=20Move=20file's=20content=20"l?= =?UTF-8?q?eetcode-master/107=E5=AF=BB=E6=89=BE=E5=AD=98=E5=9C=A8=E7=9A=84?= =?UTF-8?q?=E8=B7=AF=E5=BE=84Java=E4=BB=A3=E7=A0=81.md"=20to=20"leetcode-m?= =?UTF-8?q?aster/problems/kamacoder/0107.=E5=AF=BB=E6=89=BE=E5=AD=98?= =?UTF-8?q?=E5=9C=A8=E7=9A=84=E8=B7=AF=E5=BE=84.md"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit "leetcode-master/107寻找存在的路径Java代码.md" file merged in the wrong place and the content of it should be written in the "0107.寻找存在的路径.md". --- ...50\347\232\204\350\267\257\345\276\204.md" | 57 ++++++++++++++++++- 1 file changed, 56 insertions(+), 1 deletion(-) diff --git "a/problems/kamacoder/0107.\345\257\273\346\211\276\345\255\230\345\234\250\347\232\204\350\267\257\345\276\204.md" "b/problems/kamacoder/0107.\345\257\273\346\211\276\345\255\230\345\234\250\347\232\204\350\267\257\345\276\204.md" index 906609c99a..70339a9da1 100644 --- "a/problems/kamacoder/0107.\345\257\273\346\211\276\345\255\230\345\234\250\347\232\204\350\267\257\345\276\204.md" +++ "b/problems/kamacoder/0107.\345\257\273\346\211\276\345\255\230\345\234\250\347\232\204\350\267\257\345\276\204.md" @@ -158,7 +158,62 @@ int main() { ## 其他语言版本 -### Java +### Java + +```Java + +import java.util.*; + +public class Main{ + public static void main(String[] args) { + int N, M; + Scanner scanner = new Scanner(System.in); + N = scanner.nextInt(); + M = scanner.nextInt(); + DisJoint disJoint = new DisJoint(N + 1); + for (int i = 0; i < M; ++i) { + disJoint.join(scanner.nextInt(), scanner.nextInt()); + } + if(disJoint.isSame(scanner.nextInt(), scanner.nextInt())) { + System.out.println("1"); + } else { + System.out.println("0"); + } + } + +} + +//并查集模板 +class DisJoint{ + private int[] father; + + public DisJoint(int N) { + father = new int[N]; + for (int i = 0; i < N; ++i){ + father[i] = i; + } + } + + public int find(int n) { + return n == father[n] ? n : (father[n] = find(father[n])); + } + + public void join (int n, int m) { + n = find(n); + m = find(m); + if (n == m) return; + father[m] = n; + } + + public boolean isSame(int n, int m){ + n = find(n); + m = find(m); + return n == m; + } + +} + +``` ### Python From 216ee8d1e934826e5fc7f4cf1499bd3b711462d0 Mon Sep 17 00:00:00 2001 From: DengSchoo <46556279+DengSchoo@users.noreply.github.com> Date: Fri, 9 Aug 2024 17:59:30 +0800 Subject: [PATCH 2760/3019] =?UTF-8?q?chore:=20Move=20file's=20content=20"l?= =?UTF-8?q?eetcode-master/107=E5=AF=BB=E6=89=BE=E5=AD=98=E5=9C=A8=E7=9A=84?= =?UTF-8?q?=E8=B7=AF=E5=BE=84Java=E4=BB=A3=E7=A0=81.md"=20to=20leetcode-ma?= =?UTF-8?q?ster/problems/kamacoder/0107.=E5=AF=BB=E6=89=BE=E5=AD=98?= =?UTF-8?q?=E5=9C=A8=E7=9A=84=E8=B7=AF=E5=BE=84.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit chore: Move file's content "leetcode-master/107寻找存在的路径Java代码.md" to leetcode-master/problems/kamacoder/0107.寻找存在的路径.md --- ...7\345\276\204Java\344\273\243\347\240\201" | 56 ------------------- 1 file changed, 56 deletions(-) delete mode 100644 "107\345\257\273\346\211\276\345\255\230\345\234\250\347\232\204\350\267\257\345\276\204Java\344\273\243\347\240\201" diff --git "a/107\345\257\273\346\211\276\345\255\230\345\234\250\347\232\204\350\267\257\345\276\204Java\344\273\243\347\240\201" "b/107\345\257\273\346\211\276\345\255\230\345\234\250\347\232\204\350\267\257\345\276\204Java\344\273\243\347\240\201" deleted file mode 100644 index 7b83ca2622..0000000000 --- "a/107\345\257\273\346\211\276\345\255\230\345\234\250\347\232\204\350\267\257\345\276\204Java\344\273\243\347\240\201" +++ /dev/null @@ -1,56 +0,0 @@ -JAVA: - -```Java - -import java.util.*; - -public class Main{ - public static void main(String[] args) { - int N, M; - Scanner scanner = new Scanner(System.in); - N = scanner.nextInt(); - M = scanner.nextInt(); - DisJoint disJoint = new DisJoint(N + 1); - for (int i = 0; i < M; ++i) { - disJoint.join(scanner.nextInt(), scanner.nextInt()); - } - if(disJoint.isSame(scanner.nextInt(), scanner.nextInt())) { - System.out.println("1"); - } else { - System.out.println("0"); - } - } - -} - -//并查集模板 -class DisJoint{ - private int[] father; - - public DisJoint(int N) { - father = new int[N]; - for (int i = 0; i < N; ++i){ - father[i] = i; - } - } - - public int find(int n) { - return n == father[n] ? n : (father[n] = find(father[n])); - } - - public void join (int n, int m) { - n = find(n); - m = find(m); - if (n == m) return; - father[m] = n; - } - - public boolean isSame(int n, int m){ - n = find(n); - m = find(m); - return n == m; - } - -} - -``` From d71abfa7f6001df1d7be95b2df790651a57cc0ee Mon Sep 17 00:00:00 2001 From: kyshen Date: Fri, 9 Aug 2024 22:53:20 +0800 Subject: [PATCH 2761/3019] feat: 0105 python BFS solution --- ...50\345\217\257\350\276\276\346\200\247.md" | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git "a/problems/kamacoder/0105.\346\234\211\345\220\221\345\233\276\347\232\204\345\256\214\345\205\250\345\217\257\350\276\276\346\200\247.md" "b/problems/kamacoder/0105.\346\234\211\345\220\221\345\233\276\347\232\204\345\256\214\345\205\250\345\217\257\350\276\276\346\200\247.md" index 226d0f13c5..cd880a83d4 100644 --- "a/problems/kamacoder/0105.\346\234\211\345\220\221\345\233\276\347\232\204\345\256\214\345\205\250\345\217\257\350\276\276\346\200\247.md" +++ "b/problems/kamacoder/0105.\346\234\211\345\220\221\345\233\276\347\232\204\345\256\214\345\205\250\345\217\257\350\276\276\346\200\247.md" @@ -290,6 +290,42 @@ int main() { ### Java ### Python +BFS算法 +```Python +import collections + +path = set() # 纪录 BFS 所经过之节点 + +def bfs(root, graph): + global path + + que = collections.deque([root]) + while que: + cur = que.popleft() + path.add(cur) + + for nei in graph[cur]: + que.append(nei) + graph[cur] = [] + return + +def main(): + N, K = map(int, input().strip().split()) + graph = collections.defaultdict(list) + for _ in range(K): + src, dest = map(int, input().strip().split()) + graph[src].append(dest) + + bfs(1, graph) + if path == {i for i in range(1, N + 1)}: + return 1 + return -1 + + +if __name__ == "__main__": + print(main()) + +``` ### Go From a868ae4d2e985da8abe18a1d9e91378a305bc8ce Mon Sep 17 00:00:00 2001 From: SecondaryRainbow <927497402@qq.com> Date: Sun, 11 Aug 2024 20:40:35 +0800 Subject: [PATCH 2762/3019] =?UTF-8?q?977=E9=A2=98=E7=9B=B8=E5=85=B3?= =?UTF-8?q?=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修改了977题Go语言代码附近的格式,以及C#代码附近的格式,使其能够正常显示。(原本Go与python代码合到一起了) --- ...25\260\347\273\204\347\232\204\345\271\263\346\226\271.md" | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git "a/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" "b/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" index 7119dda585..effa905541 100644 --- "a/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" +++ "b/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" @@ -207,6 +207,7 @@ class Solution: new_list.append(nums[left] ** 2) left += 1 return new_list[::-1] +``` ### Go: @@ -539,7 +540,7 @@ public class Solution { return result; } } - +``` C# LINQ: ```csharp public class Solution { @@ -553,3 +554,4 @@ public class Solution { + From 49aa077428baef0079a7ef22e82b8a113eca4f40 Mon Sep 17 00:00:00 2001 From: liujiahang Date: Mon, 12 Aug 2024 00:57:42 +0800 Subject: [PATCH 2763/3019] =?UTF-8?q?=E8=AE=A2=E6=AD=A3=E6=96=87=E4=BB=B60?= =?UTF-8?q?099.=E5=B2=9B=E5=B1=BF=E7=9A=84=E6=95=B0=E9=87=8F=E5=B9=BF?= =?UTF-8?q?=E6=90=9C.md=E6=96=87=E4=BB=B6=EF=BC=8Cpython=E9=83=A8=E5=88=86?= =?UTF-8?q?=E7=94=A8=E7=9A=84=E6=98=AF=E6=B7=B1=E6=90=9C=E7=AE=97=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...60\351\207\217\345\271\277\346\220\234.md" | 41 +++++++++++-------- 1 file changed, 24 insertions(+), 17 deletions(-) diff --git "a/problems/kamacoder/0099.\345\262\233\345\261\277\347\232\204\346\225\260\351\207\217\345\271\277\346\220\234.md" "b/problems/kamacoder/0099.\345\262\233\345\261\277\347\232\204\346\225\260\351\207\217\345\271\277\346\220\234.md" index 3c069b4412..9771877b2d 100644 --- "a/problems/kamacoder/0099.\345\262\233\345\261\277\347\232\204\346\225\260\351\207\217\345\271\277\346\220\234.md" +++ "b/problems/kamacoder/0099.\345\262\233\345\261\277\347\232\204\346\225\260\351\207\217\345\271\277\346\220\234.md" @@ -246,29 +246,36 @@ public class Main { ```python -def dfs(grid, visited, x, y): - dir = [(0, 1), (1, 0), (-1, 0), (0, -1)] # 四个方向 - for d in dir: - nextx, nexty = x + d[0], y + d[1] - if 0 <= nextx < len(grid) and 0 <= nexty < len(grid[0]): - if not visited[nextx][nexty] and grid[nextx][nexty] == 1: # 没有访问过的 同时 是陆地的 - visited[nextx][nexty] = True - dfs(grid, visited, nextx, nexty) +from collections import deque +directions = [[0, 1], [1, 0], [0, -1], [-1, 0]] +def bfs(grid, visited, x, y): + que = deque([]) + que.append([x,y]) + while que: + cur_x, cur_y = que.popleft() + for i, j in directions: + next_x = cur_x + i + next_y = cur_y + j + if next_y < 0 or next_x < 0 or next_x >= len(grid) or next_y >= len(grid[0]): + continue + if not visited[next_x][next_y] and grid[next_x][next_y] == 1: + visited[next_x][next_y] = True + que.append([next_x, next_y]) + def main(): n, m = map(int, input().split()) - grid = [list(map(int, input().split())) for _ in range(n)] + grid = [] + for i in range(n): + grid.append(list(map(int, input().split()))) visited = [[False] * m for _ in range(n)] - - result = 0 + res = 0 for i in range(n): for j in range(m): - if not visited[i][j] and grid[i][j] == 1: - visited[i][j] = True - result += 1 # 遇到没访问过的陆地,+1 - dfs(grid, visited, i, j) # 将与其链接的陆地都标记上 True - - print(result) + if grid[i][j] == 1 and not visited[i][j]: + res += 1 + bfs(grid, visited, i, j) + print(res) if __name__ == "__main__": main() From 06d15bb5917f61112388154b6db63e55e9f647f2 Mon Sep 17 00:00:00 2001 From: wangya <1264178545@qq.com> Date: Tue, 13 Aug 2024 09:14:53 +0800 Subject: [PATCH 2764/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20=E5=8D=A1?= =?UTF-8?q?=E7=A0=81=E7=BD=910110.=E5=AD=97=E7=AC=A6=E4=B8=B2=E6=8E=A5?= =?UTF-8?q?=E9=BE=99=20JS=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...46\344\270\262\346\216\245\351\276\231.md" | 76 ++++++++++++++++++- 1 file changed, 75 insertions(+), 1 deletion(-) diff --git "a/problems/kamacoder/0110.\345\255\227\347\254\246\344\270\262\346\216\245\351\276\231.md" "b/problems/kamacoder/0110.\345\255\227\347\254\246\344\270\262\346\216\245\351\276\231.md" index feeec6ddcc..b96290b6b5 100644 --- "a/problems/kamacoder/0110.\345\255\227\347\254\246\344\270\262\346\216\245\351\276\231.md" +++ "b/problems/kamacoder/0110.\345\255\227\347\254\246\344\270\262\346\216\245\351\276\231.md" @@ -38,7 +38,7 @@ ebc dec dfc yhn -``` +``` 输出示例 @@ -224,6 +224,80 @@ public class Main { ### Javascript +```javascript +const r1 = require('readline').createInterface({ input: process.stdin }); +// 创建readline接口 +let iter = r1[Symbol.asyncIterator](); +// 创建异步迭代器 +const readline = async () => (await iter.next()).value; + +let N //输入字符串个数 +let beginStr //开始字符串 +let endStr //结束字符串 +let strSet = new Set() //字符串集合 +let visitedMap = new Map() //访问过的字符串 + +// 读取输入,初始化地图 +const init = async () => { + let line = await readline(); + line = line.trim() + N = Number(line); + + line = await readline(); + line = line.trim().split(' ') + beginStr = line[0] + endStr = line[1] + + for (let i = 0; i < N; i++) { + line = await readline() + line = line.trim() + strSet.add(line.trim()) + } +} + +(async function () { + + // 读取输入,初始化数据 + await init() + + // 初始化队列 + let queue = [] + queue.push(beginStr) + + // 初始化visitMap + visitedMap.set(beginStr, 1) + + while (queue.length) { + let word = queue.shift() + let path = visitedMap.get(word) + + // 遍历26个字母 + for (let i = 0; i < word.length; i++) { + let newWord = word.split('') // 用一个新字符串替换str,因为每次要置换一个字符 + for (let j = 0; j < 26; j++) { + newWord[i] = String.fromCharCode('a'.charCodeAt() + j) + // 发现替换字母后,字符串与终点字符串相同 + if (newWord.join('') === endStr) { + console.log(path + 1); + return 0; // 找到了路径 + } + + // 字符串集合里出现了newWord,并且newWord没有被访问过 + if (strSet.has(newWord.join('')) && !visitedMap.has(newWord.join(''))) { + // 添加访问信息,并将新字符串放到队列中 + queue.push(newWord.join('')) + visitedMap.set(newWord.join(''), path + 1) + } + } + } + } + + console.log(0); +})() +``` + + + ### TypeScript ### PhP From ce3995c8fd6f5a98ca2ac4a94ad1d70d8d42a88e Mon Sep 17 00:00:00 2001 From: wangya <1264178545@qq.com> Date: Tue, 13 Aug 2024 09:26:26 +0800 Subject: [PATCH 2765/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20=E5=8D=A1?= =?UTF-8?q?=E7=A0=81=E7=BD=910117.=E8=BD=AF=E4=BB=B6=E6=9E=84=E5=BB=BA=20J?= =?UTF-8?q?S=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...57\344\273\266\346\236\204\345\273\272.md" | 76 ++++++++++++++++++- 1 file changed, 75 insertions(+), 1 deletion(-) diff --git "a/problems/kamacoder/0117.\350\275\257\344\273\266\346\236\204\345\273\272.md" "b/problems/kamacoder/0117.\350\275\257\344\273\266\346\236\204\345\273\272.md" index 05cb735815..bb0c9aec72 100644 --- "a/problems/kamacoder/0117.\350\275\257\344\273\266\346\236\204\345\273\272.md" +++ "b/problems/kamacoder/0117.\350\275\257\344\273\266\346\236\204\345\273\272.md" @@ -193,7 +193,7 @@ 理解思想后,确实不难,但代码写起来也不容易。 -为了每次可以找到所有节点的入度信息,我们要在初始话的时候,就把每个节点的入度 和 每个节点的依赖关系做统计。 +为了每次可以找到所有节点的入度信息,我们要在初始化的时候,就把每个节点的入度 和 每个节点的依赖关系做统计。 代码如下: @@ -451,6 +451,80 @@ if __name__ == "__main__": ### Javascript +```javascript +const r1 = require('readline').createInterface({ input: process.stdin }); +// 创建readline接口 +let iter = r1[Symbol.asyncIterator](); +// 创建异步迭代器 +const readline = async () => (await iter.next()).value; + + +let N, M // 节点数和边数 +let inDegrees = [] // 入度 +let umap = new Map() // 记录文件依赖关系 +let result = [] // 结果 + + +// 根据输入, 初始化数据 +const init = async () => { + // 读取第一行输入 + let line = await readline(); + [N, M] = line.split(' ').map(Number) + + inDegrees = new Array(N).fill(0) + + // 读取边集 + while (M--) { + line = await readline(); + let [x, y] = line.split(' ').map(Number) + + // 记录入度 + inDegrees[y]++ + + // 记录x指向哪些文件 + if (!umap.has(x)) { + umap.set(x, [y]) + } else { + umap.get(x).push(y) + } + } +} + +(async function () { + // 根据输入, 初始化数据 + await init() + + let queue = [] // 入度为0的节点 + for (let i = 0; i < N; i++) { + if (inDegrees[i] == 0) { + queue.push(i) + } + } + + while (queue.length) { + let cur = queue.shift() //当前文件 + + result.push(cur) + + let files = umap.get(cur) // 当前文件指向的文件 + + // 当前文件指向的文件入度减1 + if (files && files.length) { + for (let i = 0; i < files.length; i++) { + inDegrees[files[i]]-- + if (inDegrees[files[i]] == 0) queue.push(files[i]) + } + } + } + + // 这里result.length == N 一定要判断, 因为可能存在环 + if (result.length == N) return console.log(result.join(' ')) + console.log(-1) +})() +``` + + + ### TypeScript ### PhP From 76b2653adb3f081e918da9c43935059d677f8ac0 Mon Sep 17 00:00:00 2001 From: cyxiwai Date: Tue, 13 Aug 2024 21:54:42 +0800 Subject: [PATCH 2766/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E4=BA=86num18?= =?UTF-8?q?=E7=AC=AC=E5=8D=81=E5=85=AB=E9=A2=98=E5=9B=9B=E6=95=B0=E4=B9=8B?= =?UTF-8?q?=E5=92=8C=E7=9A=84=E5=BE=AA=E7=8E=AF=E5=88=A4=E6=96=AD=E9=80=BB?= =?UTF-8?q?=E8=BE=91=EF=BC=8C=E4=BF=AE=E6=94=B9=E4=BA=86return=20result?= =?UTF-8?q?=E4=B8=BAbreak=EF=BC=8C=E5=8F=AF=E4=BB=A5ac=E5=8A=9B=E6=89=A3?= =?UTF-8?q?=E7=9A=84=E6=96=B0=E7=94=A8=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" "b/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" index 8e34713d37..f45dd939af 100644 --- "a/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" @@ -264,7 +264,7 @@ class Solution { // nums[i]+nums[j] > target 直接返回, 剪枝操作 if (nums[i]+nums[j] > 0 && nums[i]+nums[j] > target) { - return result; + break; } if (j > i + 1 && nums[j - 1] == nums[j]) { // 对nums[j]去重 From 247cfabf08d2e281fd32c65eac6c620633a3e64d Mon Sep 17 00:00:00 2001 From: markwang Date: Wed, 14 Aug 2024 14:22:29 +0800 Subject: [PATCH 2767/3019] =?UTF-8?q?416.=E5=88=86=E5=89=B2=E7=AD=89?= =?UTF-8?q?=E5=92=8C=E5=AD=90=E9=9B=86=E5=A2=9E=E5=8A=A0Go=E4=BA=8C?= =?UTF-8?q?=E7=BB=B4dp=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...11\345\222\214\345\255\220\351\233\206.md" | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git "a/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" "b/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" index 4d2e6bf656..5bd7ff6c81 100644 --- "a/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" +++ "b/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" @@ -453,6 +453,7 @@ class Solution: ``` ### Go: +一维dp ```go // 分割等和子集 动态规划 // 时间复杂度O(n^2) 空间复杂度O(n) @@ -480,6 +481,44 @@ func canPartition(nums []int) bool { } ``` +二维dp +```go +func canPartition(nums []int) bool { + sum := 0 + for _, val := range nums { + sum += val + } + if sum % 2 == 1 { + return false + } + target := sum / 2 + dp := make([][]int, len(nums)) + for i := range dp { + dp[i] = make([]int, target + 1) + } + for j := nums[0]; j <= target; j++ { + dp[0][j] = nums[0] + } + for i := 1; i < len(nums); i++ { + for j := 0; j <= target; j++ { + if j < nums[i] { + dp[i][j] = dp[i-1][j] + } else { + dp[i][j] = max(dp[i-1][j], dp[i-1][j-nums[i]] + nums[i]) + } + } + } + return dp[len(nums)-1][target] == target +} + +func max(x, y int) int { + if x > y { + return x + } + return y +} +``` + ### JavaScript: ```js From 0f887ab3460d4bed850762cb1aef4b95c99a9ed6 Mon Sep 17 00:00:00 2001 From: zhangwt <52098594+zhangwt-cn@users.noreply.github.com> Date: Thu, 15 Aug 2024 15:44:52 +0800 Subject: [PATCH 2768/3019] =?UTF-8?q?fix:=20=E6=9B=B4=E6=AD=A3=E6=95=B0?= =?UTF-8?q?=E7=BB=84=E4=B8=8B`=E5=8C=BA=E9=97=B4=E5=92=8C`=E9=87=8D?= =?UTF-8?q?=E5=A4=8D=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index 96852d706d..ac33b58659 100644 --- a/README.md +++ b/README.md @@ -107,7 +107,6 @@ 5. [数组:209.长度最小的子数组](./problems/0209.长度最小的子数组.md) 6. [数组:区间和](./problems/kamacoder/0058.区间和.md) 6. [数组:59.螺旋矩阵II](./problems/0059.螺旋矩阵II.md) -7. [数组:区间和](./problems/kamacoder/0058.区间和.md) 8. [数组:开发商购买土地](./problems/kamacoder/0044.开发商购买土地.md) 9. [数组:总结篇](./problems/数组总结篇.md) From de57c317f96bf49b20dd3dd80ee6317d59e67671 Mon Sep 17 00:00:00 2001 From: markwang Date: Thu, 15 Aug 2024 16:39:04 +0800 Subject: [PATCH 2769/3019] =?UTF-8?q?1049.=E6=9C=80=E5=90=8E=E4=B8=80?= =?UTF-8?q?=E5=9D=97=E7=9F=B3=E5=A4=B4=E7=9A=84=E9=87=8D=E9=87=8FII?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0Go=E4=BA=8C=E7=BB=B4dp=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\347\232\204\351\207\215\351\207\217II.md" | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git "a/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" "b/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" index 4f2cc9e350..b40ed114eb 100644 --- "a/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" +++ "b/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" @@ -313,6 +313,8 @@ class Solution: ``` ### Go: + +一维dp ```go func lastStoneWeightII(stones []int) int { // 15001 = 30 * 1000 /2 +1 @@ -341,6 +343,43 @@ func max(a, b int) int { } ``` +二维dp +```go +func lastStoneWeightII(stones []int) int { + sum := 0 + for _, val := range stones { + sum += val + } + target := sum / 2 + + dp := make([][]int, len(stones)) + for i := range dp { + dp[i] = make([]int, target + 1) + } + for j := stones[0]; j <= target; j++ { + dp[0][j] = stones[0] + } + + for i := 1; i < len(stones); i++ { + for j := 0; j <= target; j++ { + if stones[i] > j { + dp[i][j] = dp[i-1][j] + } else { + dp[i][j] = max(dp[i-1][j], dp[i-1][j-stones[i]] + stones[i]) + } + } + } + return (sum - dp[len(stones)-1][target]) - dp[len(stones)-1][target] +} + +func max(x, y int) int { + if x > y { + return x + } + return y +} +``` + ### JavaScript: ```javascript From eef6abbbc320f49436306247a592cb2f84be0604 Mon Sep 17 00:00:00 2001 From: kyshen Date: Sun, 18 Aug 2024 01:20:14 +0800 Subject: [PATCH 2770/3019] fix: typo --- .../0117.\350\275\257\344\273\266\346\236\204\345\273\272.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/kamacoder/0117.\350\275\257\344\273\266\346\236\204\345\273\272.md" "b/problems/kamacoder/0117.\350\275\257\344\273\266\346\236\204\345\273\272.md" index bb0c9aec72..348187d6f1 100644 --- "a/problems/kamacoder/0117.\350\275\257\344\273\266\346\236\204\345\273\272.md" +++ "b/problems/kamacoder/0117.\350\275\257\344\273\266\346\236\204\345\273\272.md" @@ -11,7 +11,7 @@ 输入描述: -第一行输入两个正整数 M, N。表示 N 个文件之间拥有 M 条依赖关系。 +第一行输入两个正整数 N, M。表示 N 个文件之间拥有 M 条依赖关系。 后续 M 行,每行两个正整数 S 和 T,表示 T 文件依赖于 S 文件。 From 7ff07aa66e72e9f7cdf22814b8cba6aa3c4d2eaa Mon Sep 17 00:00:00 2001 From: Charlie Yang <104724079+sxdtywm@users.noreply.github.com> Date: Sun, 18 Aug 2024 11:10:47 +0800 Subject: [PATCH 2771/3019] =?UTF-8?q?Update=200102.=E6=B2=89=E6=B2=A1?= =?UTF-8?q?=E5=AD=A4=E5=B2=9B.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Update 0102.沉没孤岛.md --- ...11\346\262\241\345\255\244\345\262\233.md" | 120 ++++++++++++++++++ 1 file changed, 120 insertions(+) diff --git "a/problems/kamacoder/0102.\346\262\211\346\262\241\345\255\244\345\262\233.md" "b/problems/kamacoder/0102.\346\262\211\346\262\241\345\255\244\345\262\233.md" index 2b16da0472..5cfeff7662 100644 --- "a/problems/kamacoder/0102.\346\262\211\346\262\241\345\255\244\345\262\233.md" +++ "b/problems/kamacoder/0102.\346\262\211\346\262\241\345\255\244\345\262\233.md" @@ -138,8 +138,128 @@ int main() { ### Java +```JAVA + +import java.util.Scanner; + +public class Main { + static int[][] dir = { {-1, 0}, {0, -1}, {1, 0}, {0, 1} }; // 保存四个方向 + + public static void dfs(int[][] grid, int x, int y) { + grid[x][y] = 2; + for (int[] d : dir) { + int nextX = x + d[0]; + int nextY = y + d[1]; + // 超过边界 + if (nextX < 0 || nextX >= grid.length || nextY < 0 || nextY >= grid[0].length) continue; + // 不符合条件,不继续遍历 + if (grid[nextX][nextY] == 0 || grid[nextX][nextY] == 2) continue; + dfs(grid, nextX, nextY); + } + } + + public static void main(String[] args) { + Scanner scanner = new Scanner(System.in); + int n = scanner.nextInt(); + int m = scanner.nextInt(); + int[][] grid = new int[n][m]; + + for (int i = 0; i < n; i++) { + for (int j = 0; j < m; j++) { + grid[i][j] = scanner.nextInt(); + } + } + + // 步骤一: + // 从左侧边,和右侧边 向中间遍历 + for (int i = 0; i < n; i++) { + if (grid[i][0] == 1) dfs(grid, i, 0); + if (grid[i][m - 1] == 1) dfs(grid, i, m - 1); + } + + // 从上边和下边 向中间遍历 + for (int j = 0; j < m; j++) { + if (grid[0][j] == 1) dfs(grid, 0, j); + if (grid[n - 1][j] == 1) dfs(grid, n - 1, j); + } + + // 步骤二、步骤三 + for (int i = 0; i < n; i++) { + for (int j = 0; j < m; j++) { + if (grid[i][j] == 1) grid[i][j] = 0; + if (grid[i][j] == 2) grid[i][j] = 1; + } + } + + for (int i = 0; i < n; i++) { + for (int j = 0; j < m; j++) { + System.out.print(grid[i][j] + " "); + } + System.out.println(); + } + + scanner.close(); + } +} + + +``` + + ### Python +```python + +def dfs(grid, x, y): + grid[x][y] = 2 + directions = [(-1, 0), (0, -1), (1, 0), (0, 1)] # 四个方向 + for dx, dy in directions: + nextx, nexty = x + dx, y + dy + # 超过边界 + if nextx < 0 or nextx >= len(grid) or nexty < 0 or nexty >= len(grid[0]): + continue + # 不符合条件,不继续遍历 + if grid[nextx][nexty] == 0 or grid[nextx][nexty] == 2: + continue + dfs(grid, nextx, nexty) + +def main(): + n, m = map(int, input().split()) + grid = [[int(x) for x in input().split()] for _ in range(n)] + + # 步骤一: + # 从左侧边,和右侧边 向中间遍历 + for i in range(n): + if grid[i][0] == 1: + dfs(grid, i, 0) + if grid[i][m - 1] == 1: + dfs(grid, i, m - 1) + + # 从上边和下边 向中间遍历 + for j in range(m): + if grid[0][j] == 1: + dfs(grid, 0, j) + if grid[n - 1][j] == 1: + dfs(grid, n - 1, j) + + # 步骤二、步骤三 + for i in range(n): + for j in range(m): + if grid[i][j] == 1: + grid[i][j] = 0 + if grid[i][j] == 2: + grid[i][j] = 1 + + # 打印结果 + for row in grid: + print(' '.join(map(str, row))) + +if __name__ == "__main__": + main() + +``` + + ### Go ### Rust From 1efaa188770ddcf3cda62df5068fe28cb105ef37 Mon Sep 17 00:00:00 2001 From: Charlie Yang <104724079+sxdtywm@users.noreply.github.com> Date: Sun, 18 Aug 2024 12:48:19 +0800 Subject: [PATCH 2772/3019] =?UTF-8?q?Update=200105.=E6=9C=89=E5=90=91?= =?UTF-8?q?=E5=9B=BE=E7=9A=84=E5=AE=8C=E5=85=A8=E5=8F=AF=E8=BE=BE=E6=80=A7?= =?UTF-8?q?.md=20for=20java=20python=20and=20go?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Update 0105.有向图的完全可达性.md for java python and go --- ...50\345\217\257\350\276\276\346\200\247.md" | 144 ++++++++++++++++++ 1 file changed, 144 insertions(+) diff --git "a/problems/kamacoder/0105.\346\234\211\345\220\221\345\233\276\347\232\204\345\256\214\345\205\250\345\217\257\350\276\276\346\200\247.md" "b/problems/kamacoder/0105.\346\234\211\345\220\221\345\233\276\347\232\204\345\256\214\345\205\250\345\217\257\350\276\276\346\200\247.md" index 226d0f13c5..30baa64924 100644 --- "a/problems/kamacoder/0105.\346\234\211\345\220\221\345\233\276\347\232\204\345\256\214\345\205\250\345\217\257\350\276\276\346\200\247.md" +++ "b/problems/kamacoder/0105.\346\234\211\345\220\221\345\233\276\347\232\204\345\256\214\345\205\250\345\217\257\350\276\276\346\200\247.md" @@ -289,10 +289,154 @@ int main() { ### Java +```java + +import java.util.*; + +public class Main { + + public static void dfs(List> graph, int key, boolean[] visited) { + for (int neighbor : graph.get(key)) { + if (!visited[neighbor]) { // Check if the next node is not visited + visited[neighbor] = true; + dfs(graph, neighbor, visited); + } + } + } + + public static void main(String[] args) { + Scanner scanner = new Scanner(System.in); + int n = scanner.nextInt(); + int m = scanner.nextInt(); + + List> graph = new ArrayList<>(); + for (int i = 0; i <= n; i++) { + graph.add(new ArrayList<>()); + } + + for (int i = 0; i < m; i++) { + int s = scanner.nextInt(); + int t = scanner.nextInt(); + graph.get(s).add(t); + } + + boolean[] visited = new boolean[n + 1]; + visited[1] = true; // Process node 1 beforehand + dfs(graph, 1, visited); + + for (int i = 1; i <= n; i++) { + if (!visited[i]) { + System.out.println(-1); + return; + } + } + System.out.println(1); + } +} + + +``` + + ### Python +``` python + +def dfs(graph, key, visited): + for neighbor in graph[key]: + if not visited[neighbor]: # Check if the next node is not visited + visited[neighbor] = True + dfs(graph, neighbor, visited) + +def main(): + import sys + input = sys.stdin.read + data = input().split() + + n = int(data[0]) + m = int(data[1]) + + graph = [[] for _ in range(n + 1)] + index = 2 + for _ in range(m): + s = int(data[index]) + t = int(data[index + 1]) + graph[s].append(t) + index += 2 + + visited = [False] * (n + 1) + visited[1] = True # Process node 1 beforehand + dfs(graph, 1, visited) + + for i in range(1, n + 1): + if not visited[i]: + print(-1) + return + + print(1) + +if __name__ == "__main__": + main() + + +``` + ### Go +```go + +package main + +import ( + "bufio" + "fmt" + "os" +) + +func dfs(graph [][]int, key int, visited []bool) { + visited[key] = true + for _, neighbor := range graph[key] { + if !visited[neighbor] { + dfs(graph, neighbor, visited) + } + } +} + +func main() { + scanner := bufio.NewScanner(os.Stdin) + scanner.Scan() + var n, m int + fmt.Sscanf(scanner.Text(), "%d %d", &n, &m) + + graph := make([][]int, n+1) + for i := 0; i <= n; i++ { + graph[i] = make([]int, 0) + } + + for i := 0; i < m; i++ { + scanner.Scan() + var s, t int + fmt.Sscanf(scanner.Text(), "%d %d", &s, &t) + graph[s] = append(graph[s], t) + } + + visited := make([]bool, n+1) + + dfs(graph, 1, visited) + + for i := 1; i <= n; i++ { + if !visited[i] { + fmt.Println(-1) + return + } + } + fmt.Println(1) +} + + +``` + + ### Rust ### Javascript From d03a507431cf7c123324be4f1924575f7d4b8ae0 Mon Sep 17 00:00:00 2001 From: Charlie Yang <104724079+sxdtywm@users.noreply.github.com> Date: Sun, 18 Aug 2024 12:53:45 +0800 Subject: [PATCH 2773/3019] =?UTF-8?q?Update=200106.=E5=B2=9B=E5=B1=BF?= =?UTF-8?q?=E7=9A=84=E5=91=A8=E9=95=BF.md=20for=20python=20go?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Update 0106.岛屿的周长.md for python go --- ...77\347\232\204\345\221\250\351\225\277.md" | 123 ++++++++++++++++++ 1 file changed, 123 insertions(+) diff --git "a/problems/kamacoder/0106.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" "b/problems/kamacoder/0106.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" index 6f3462c52d..235d9445d1 100644 --- "a/problems/kamacoder/0106.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" +++ "b/problems/kamacoder/0106.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" @@ -216,8 +216,131 @@ public class Main { ### Python +```python + +def main(): + import sys + input = sys.stdin.read + data = input().split() + + # 读取 n 和 m + n = int(data[0]) + m = int(data[1]) + + # 初始化 grid + grid = [] + index = 2 + for i in range(n): + grid.append([int(data[index + j]) for j in range(m)]) + index += m + + sum_land = 0 # 陆地数量 + cover = 0 # 相邻数量 + + for i in range(n): + for j in range(m): + if grid[i][j] == 1: + sum_land += 1 + # 统计上边相邻陆地 + if i - 1 >= 0 and grid[i - 1][j] == 1: + cover += 1 + # 统计左边相邻陆地 + if j - 1 >= 0 and grid[i][j - 1] == 1: + cover += 1 + # 不统计下边和右边,避免重复计算 + + result = sum_land * 4 - cover * 2 + print(result) + +if __name__ == "__main__": + main() + + +``` + ### Go +```go + +package main + +import ( + "bufio" + "fmt" + "os" + "strconv" + "strings" +) + +func main() { + scanner := bufio.NewScanner(os.Stdin) + scanner.Scan() + line := scanner.Text() + + n, m := parseInput(line) + + // 初始化 grid + grid := make([][]int, n) + for i := range grid { + grid[i] = make([]int, m) + } + + // 读入 grid 数据 + for i := 0; i < n; i++ { + scanner.Scan() + line := scanner.Text() + values := parseLine(line, m) + for j := 0; j < m; j++ { + grid[i][j] = values[j] + } + } + + sum := 0 // 陆地数量 + cover := 0 // 相邻数量 + + for i := 0; i < n; i++ { + for j := 0; j < m; j++ { + if grid[i][j] == 1 { + sum++ // 统计总的陆地数量 + + // 统计上边相邻陆地 + if i-1 >= 0 && grid[i-1][j] == 1 { + cover++ + } + // 统计左边相邻陆地 + if j-1 >= 0 && grid[i][j-1] == 1 { + cover++ + } + // 为什么没统计下边和右边? 因为避免重复计算 + } + } + } + + fmt.Println(sum*4 - cover*2) +} + +// parseInput 解析 n 和 m +func parseInput(line string) (int, int) { + parts := strings.Split(line, " ") + n, _ := strconv.Atoi(parts[0]) + m, _ := strconv.Atoi(parts[1]) + return n, m +} + +// parseLine 解析一行中的多个值 +func parseLine(line string, count int) []int { + parts := strings.Split(line, " ") + values := make([]int, count) + for i := 0; i < count; i++ { + values[i], _ = strconv.Atoi(parts[i]) + } + return values +} + + +``` + + ### Rust ### Javascript From b5b2aa3cef279c7451ddb5fcb69cd0087f1e73b6 Mon Sep 17 00:00:00 2001 From: Charlie Yang <104724079+sxdtywm@users.noreply.github.com> Date: Sun, 18 Aug 2024 12:59:04 +0800 Subject: [PATCH 2774/3019] =?UTF-8?q?Update=200107.=E5=AF=BB=E6=89=BE?= =?UTF-8?q?=E5=AD=98=E5=9C=A8=E7=9A=84=E8=B7=AF=E5=BE=84.md=20for=20python?= =?UTF-8?q?=20and=20go?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Update 0107.寻找存在的路径.md for python and go --- ...50\347\232\204\350\267\257\345\276\204.md" | 119 ++++++++++++++++++ 1 file changed, 119 insertions(+) diff --git "a/problems/kamacoder/0107.\345\257\273\346\211\276\345\255\230\345\234\250\347\232\204\350\267\257\345\276\204.md" "b/problems/kamacoder/0107.\345\257\273\346\211\276\345\255\230\345\234\250\347\232\204\350\267\257\345\276\204.md" index 70339a9da1..06d0737738 100644 --- "a/problems/kamacoder/0107.\345\257\273\346\211\276\345\255\230\345\234\250\347\232\204\350\267\257\345\276\204.md" +++ "b/problems/kamacoder/0107.\345\257\273\346\211\276\345\255\230\345\234\250\347\232\204\350\267\257\345\276\204.md" @@ -217,8 +217,127 @@ class DisJoint{ ### Python +```python + +class UnionFind: + def __init__(self, size): + self.parent = list(range(size + 1)) # 初始化并查集 + + def find(self, u): + if self.parent[u] != u: + self.parent[u] = self.find(self.parent[u]) # 路径压缩 + return self.parent[u] + + def union(self, u, v): + root_u = self.find(u) + root_v = self.find(v) + if root_u != root_v: + self.parent[root_v] = root_u + + def is_same(self, u, v): + return self.find(u) == self.find(v) + + +def main(): + import sys + input = sys.stdin.read + data = input().split() + + index = 0 + n = int(data[index]) + index += 1 + m = int(data[index]) + index += 1 + + uf = UnionFind(n) + + for _ in range(m): + s = int(data[index]) + index += 1 + t = int(data[index]) + index += 1 + uf.union(s, t) + + source = int(data[index]) + index += 1 + destination = int(data[index]) + + if uf.is_same(source, destination): + print(1) + else: + print(0) + +if __name__ == "__main__": + main() + + +``` + + ### Go +```go + +package main + +import ( + "fmt" +) + +const MaxNodes = 101 + +var n int +var father [MaxNodes]int + +// 初始化并查集 +func initialize() { + for i := 1; 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] +} + +// 判断 u 和 v 是否找到同一个根 +func isSame(u, v int) bool { + return find(u) == find(v) +} + +// 将 v->u 这条边加入并查集 +func join(u, v int) { + rootU := find(u) + rootV := find(v) + if rootU != rootV { + father[rootV] = rootU + } +} + +func main() { + var m, s, t, source, destination int + fmt.Scan(&n, &m) + initialize() + for i := 0; i < m; i++ { + fmt.Scan(&s, &t) + join(s, t) + } + fmt.Scan(&source, &destination) + if isSame(source, destination) { + fmt.Println(1) + } else { + fmt.Println(0) + } +} + + +``` + ### Rust ### Javascript From aefb7aa83d8eb7ed08dd57e277edfd8c2a6b76ea Mon Sep 17 00:00:00 2001 From: HJHuangUM <57804285+Wogwan@users.noreply.github.com> Date: Sun, 18 Aug 2024 14:58:33 -0700 Subject: [PATCH 2775/3019] update kamacoder/0101 Python solution remove duplicate split() function --- ...62\233\347\232\204\346\200\273\351\235\242\347\247\257.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/problems/kamacoder/0101.\345\255\244\345\262\233\347\232\204\346\200\273\351\235\242\347\247\257.md" "b/problems/kamacoder/0101.\345\255\244\345\262\233\347\232\204\346\200\273\351\235\242\347\247\257.md" index a1793337f6..09146dcf42 100644 --- "a/problems/kamacoder/0101.\345\255\244\345\262\233\347\232\204\346\200\273\351\235\242\347\247\257.md" +++ "b/problems/kamacoder/0101.\345\255\244\345\262\233\347\232\204\346\200\273\351\235\242\347\247\257.md" @@ -190,10 +190,10 @@ int main() { from collections import deque # 处理输入 -n, m = list(map(int, input().strip().split())) +n, m = list(map(int, input().strip())) g = [] for _ in range(n): - row = list(map(int, input().strip().split())) + row = list(map(int, input().strip())) g.append(row) # 定义四个方向、孤岛面积(遍历完边缘后会被重置) From 418168efafe7e85f556e35b476aa8fbcb73f404b Mon Sep 17 00:00:00 2001 From: HJHuangUM <57804285+Wogwan@users.noreply.github.com> Date: Sun, 18 Aug 2024 18:05:53 -0700 Subject: [PATCH 2776/3019] update Python solutions for kama102 and kama104 Provide BFS solution --- ...11\346\262\241\345\255\244\345\262\233.md" | 57 ++++++++++++ ...00\345\244\247\345\262\233\345\261\277.md" | 87 +++++++++++++++++++ 2 files changed, 144 insertions(+) diff --git "a/problems/kamacoder/0102.\346\262\211\346\262\241\345\255\244\345\262\233.md" "b/problems/kamacoder/0102.\346\262\211\346\262\241\345\255\244\345\262\233.md" index 2b16da0472..eec12e5fb8 100644 --- "a/problems/kamacoder/0102.\346\262\211\346\262\241\345\255\244\345\262\233.md" +++ "b/problems/kamacoder/0102.\346\262\211\346\262\241\345\255\244\345\262\233.md" @@ -140,6 +140,63 @@ int main() { ### Python +#### 广搜版 +```Python +from collections import deque + +n, m = list(map(int, input().split())) +g = [] +for _ in range(n): + row = list(map(int,input().split())) + g.append(row) + +directions = [(1,0),(-1,0),(0,1),(0,-1)] +count = 0 + +def bfs(r,c,mode): + global count + q = deque() + q.append((r,c)) + count += 1 + + while q: + r, c = q.popleft() + if mode: + g[r][c] = 2 + + for di in directions: + next_r = r + di[0] + next_c = c + di[1] + if next_c < 0 or next_c >= m or next_r < 0 or next_r >= n: + continue + if g[next_r][next_c] == 1: + q.append((next_r,next_c)) + if mode: + g[r][c] = 2 + + count += 1 + + +for i in range(n): + if g[i][0] == 1: bfs(i,0,True) + if g[i][m-1] == 1: bfs(i, m-1,True) + +for j in range(m): + if g[0][j] == 1: bfs(0,j,1) + if g[n-1][j] == 1: bfs(n-1,j,1) + +for i in range(n): + for j in range(m): + if g[i][j] == 2: + g[i][j] = 1 + else: + g[i][j] = 0 + +for row in g: + print(" ".join(map(str, row))) +``` + + ### Go ### Rust diff --git "a/problems/kamacoder/0104.\345\273\272\351\200\240\346\234\200\345\244\247\345\262\233\345\261\277.md" "b/problems/kamacoder/0104.\345\273\272\351\200\240\346\234\200\345\244\247\345\262\233\345\261\277.md" index 7132217b53..cd647d5ee1 100644 --- "a/problems/kamacoder/0104.\345\273\272\351\200\240\346\234\200\345\244\247\345\262\233\345\261\277.md" +++ "b/problems/kamacoder/0104.\345\273\272\351\200\240\346\234\200\345\244\247\345\262\233\345\261\277.md" @@ -366,6 +366,93 @@ public class Main { ### Python + +#### BFS +```Python +from typing import List +from collections import defaultdict + +class Solution: + def __init__(self): + self.direction = [(1,0),(-1,0),(0,1),(0,-1)] + self.res = 0 + self.count = 0 + self.idx = 1 + self.count_area = defaultdict(int) + + def max_area_island(self, grid: List[List[int]]) -> int: + if not grid or len(grid) == 0 or len(grid[0]) == 0: + return 0 + + for i in range(len(grid)): + for j in range(len(grid[0])): + if grid[i][j] == 1: + self.count = 0 + self.idx += 1 + self.dfs(grid,i,j) + # print(grid) + self.check_area(grid) + # print(self.count_area) + + if self.check_largest_connect_island(grid=grid): + return self.res + 1 + return max(self.count_area.values()) + + def dfs(self,grid,row,col): + grid[row][col] = self.idx + self.count += 1 + for dr,dc in self.direction: + _row = dr + row + _col = dc + col + if 0<=_row Date: Wed, 21 Aug 2024 23:35:24 +0800 Subject: [PATCH 2777/3019] fix: typo --- ...\345\217\202\344\274\232dijkstra\346\234\264\347\264\240.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/kamacoder/0047.\345\217\202\344\274\232dijkstra\346\234\264\347\264\240.md" "b/problems/kamacoder/0047.\345\217\202\344\274\232dijkstra\346\234\264\347\264\240.md" index e904b9217e..c0a490b343 100644 --- "a/problems/kamacoder/0047.\345\217\202\344\274\232dijkstra\346\234\264\347\264\240.md" +++ "b/problems/kamacoder/0047.\345\217\202\344\274\232dijkstra\346\234\264\347\264\240.md" @@ -150,7 +150,7 @@ minDist数组数值初始化为int最大值。 更新 minDist数组,即:源点(节点1) 到 节点2 和 节点3的距离。 * 源点到节点2的最短距离为1,小于原minDist[2]的数值max,更新minDist[2] = 1 -* 源点到节点3的最短距离为4,小于原minDist[3]的数值max,更新minDist[4] = 4 +* 源点到节点3的最短距离为4,小于原minDist[3]的数值max,更新minDist[3] = 4 可能有录友问:为啥和 minDist[2] 比较? From 7c76dafadade38406ba958136734928e7def2721 Mon Sep 17 00:00:00 2001 From: Yu Li <64682660+yooli23@users.noreply.github.com> Date: Mon, 26 Aug 2024 13:45:48 -0400 Subject: [PATCH 2778/3019] =?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 fixed a typo --- ...\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" index 36458ee6a7..e7146bcf5a 100644 --- "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" +++ "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" @@ -114,7 +114,7 @@ i 来表示物品、j表示背包容量。 背包容量为 2,只能放下物品1,背包里的价值为15。 -背包容量为 3,上一行同一状态,背包只能放物品0,这次也可以选择物品1了,背包可以放物品2 或者 物品1,物品2价值更大,背包里的价值为20。 +背包容量为 3,上一行同一状态,背包只能放物品0,这次也可以选择物品1了,背包可以放物品1 或者 物品0,物品1价值更大,背包里的价值为20。 背包容量为 4,上一行同一状态,背包只能放物品0,这次也可以选择物品1了,背包都可都放下,背包价值为35。 From 051459a5426fc6ad44e069bbd7ab22b3f5d737b8 Mon Sep 17 00:00:00 2001 From: suinming <0223314338aa@gmail.com> Date: Tue, 27 Aug 2024 10:45:45 +0800 Subject: [PATCH 2779/3019] =?UTF-8?q?feat:=20=E5=8B=95=E6=85=8B=E8=A6=8F?= =?UTF-8?q?=E5=8A=83leetcode#714=EF=BC=8C=E6=96=B0=E5=A2=9Epython=E8=A7=A3?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...200\201\350\247\204\345\210\222\357\274\211.md" | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git "a/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" "b/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" index 73714147e0..b0e8b141f5 100644 --- "a/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" +++ "b/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" @@ -188,6 +188,20 @@ class Solution: return max(dp[-1][0], dp[-1][1]) ``` +```python +class Solution: + def maxProfit(self, prices: List[int], fee: int) -> int: + # 持有股票手上的最大現金 + hold = -prices[0] - fee + # 不持有股票手上的最大現金 + not_hold = 0 + for price in prices[1:]: + new_hold = max(hold, not_hold - price - fee) + new_not_hold = max(not_hold, hold + price) + hold, not_hold = new_hold, new_not_hold + return not_hold +``` + ### Go: ```go From c5686b417d24a1d999d34ba9cf29d85ce77fe602 Mon Sep 17 00:00:00 2001 From: Jasen <141482690+JasenWn@users.noreply.github.com> Date: Tue, 27 Aug 2024 22:32:59 +0800 Subject: [PATCH 2780/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B00503.=E4=B8=8B?= =?UTF-8?q?=E4=B8=80=E4=B8=AA=E6=9B=B4=E5=A4=A7=E5=85=83=E7=B4=A0II?= =?UTF-8?q?=E7=9A=84python=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\345\244\247\345\205\203\347\264\240II.md" | 30 ++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git "a/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" "b/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" index 62066d8521..5751bb9171 100644 --- "a/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" +++ "b/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" @@ -168,6 +168,7 @@ class Solution { ``` ### Python: +> 版本一: ```python class Solution: @@ -181,6 +182,34 @@ class Solution: stack.append(i%len(nums)) return dp ``` + +> 版本二:针对版本一的优化 + +```python3 +class Solution: + def nextGreaterElements(self, nums: List[int]) -> List[int]: + res = [-1] * len(nums) + stack = [] + #第一次遍历nums + for i, num in enumerate(nums): + while stack and num > nums[stack[-1]]: + res[stack[-1]] = num + stack.pop() + stack.append(i) + #此时stack仍有剩余,有部分数‘无下一个更大元素’待修正 + #第二次遍历nums + for num in nums: + #一旦stack为空,就表明所有数都有下一个更大元素,可以返回结果 + if not stack: + return res + while stack and num > nums[stack[-1]]: + res[stack[-1]] = num + stack.pop() + #不要将已经有下一个更大元素的数加入栈,这样会重复赋值,只需对第一次遍历剩余的数再尝试寻找下一个更大元素即可 + #最后仍有部分最大数无法有下一个更大元素,返回结果 + return res +``` + ### Go: ```go @@ -203,7 +232,6 @@ func nextGreaterElements(nums []int) []int { return result } ``` - ### JavaScript: ```JS From 574cef48b31fcb551c9bf15c66fea67cdce6beb4 Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Thu, 29 Aug 2024 20:39:18 +0800 Subject: [PATCH 2781/3019] Update --- README.md | 2 +- ...33\346\225\260\344\271\213\345\222\214.md" | 59 +-- ...47\347\232\204\347\237\251\345\275\242.md" | 4 +- ...25\350\257\215\346\213\206\345\210\206.md" | 2 +- ...27\345\256\236\347\216\260\346\240\210.md" | 11 +- ...4.\347\233\256\346\240\207\345\222\214.md" | 366 +++++++++++++----- ...74\232dijkstra\346\234\264\347\264\240.md" | 2 +- .../0053.\345\257\273\345\256\235-prim.md" | 4 +- ...\347\211\251\350\277\220\350\276\223II.md" | 55 +++ ...60\351\207\217\345\271\277\346\220\234.md" | 70 ---- ...00\345\244\247\345\262\233\345\261\277.md" | 2 +- ...\344\275\231\350\277\236\346\216\245II.md" | 13 +- ...9.\345\256\214\347\276\216\346\225\260.md" | 0 ...75\344\272\214\345\217\211\346\240\221.md" | 0 ...57\345\276\204\350\256\241\346\225\260.md" | 95 +++++ ...27\344\270\255\344\275\215\346\225\260.md" | 68 ++++ ...40\351\231\244\344\273\243\344\273\267.md" | 106 +++++ ...30\346\226\227\345\272\217\345\210\227.md" | 68 ++++ ...01\345\244\215\346\235\202\345\272\246.md" | 59 +++ ...14\344\275\231\346\226\271\347\250\213.md" | 50 +++ ...64\346\225\260\344\271\230\346\263\225.md" | 62 +++ ...04\346\212\230\347\272\277\346\256\265.md" | 88 +++++ ...04\345\220\210\345\270\226\345\255\220.md" | 61 +++ ...16\347\211\210\346\226\271\346\241\210.md" | 154 ++++++++ .../\347\254\254\344\270\200\351\242\230.md" | 85 ++++ .../\347\254\254\344\270\211\351\242\230.md" | 76 ++++ .../\347\254\254\344\272\214\351\242\230.md" | 78 ++++ problems/qita/tulunfabu.md | 239 ++++++++++++ ...22\346\200\273\347\273\223\347\257\207.md" | 2 +- ...47\241\20001\350\203\214\345\214\205-1.md" | 31 +- 30 files changed, 1681 insertions(+), 231 deletions(-) rename "problems/kamacoder/\345\256\214\347\276\216\346\225\260.md" => "problems/kamacoder/0139.\345\256\214\347\276\216\346\225\260.md" (100%) rename "problems/kamacoder/\345\245\275\344\272\214\345\217\211\346\240\221.md" => "problems/kamacoder/0141.\345\245\275\344\272\214\345\217\211\346\240\221.md" (100%) create mode 100644 "problems/kamacoder/0153.\346\235\203\345\200\274\344\274\230\345\212\277\350\267\257\345\276\204\350\256\241\346\225\260.md" create mode 100644 "problems/kamacoder/0154.\345\272\217\345\210\227\344\270\255\344\275\215\346\225\260.md" create mode 100644 "problems/kamacoder/0155.\346\234\200\345\260\217\345\214\226\351\242\221\347\216\207\347\232\204\345\210\240\351\231\244\344\273\243\344\273\267.md" create mode 100644 "problems/kamacoder/0156.\345\213\207\346\225\242\347\211\233\347\211\233\346\210\230\346\226\227\345\272\217\345\210\227.md" create mode 100644 "problems/kamacoder/0157.\346\234\200\345\244\247\345\214\226\345\257\206\347\240\201\345\244\215\346\235\202\345\272\246.md" create mode 100644 "problems/kamacoder/0158.\345\220\214\344\275\231\346\226\271\347\250\213.md" create mode 100644 "problems/kamacoder/0159.\345\244\247\346\225\264\346\225\260\344\271\230\346\263\225.md" create mode 100644 "problems/kamacoder/0160.\344\272\214\347\273\264\345\271\263\351\235\242\344\270\212\347\232\204\346\212\230\347\272\277\346\256\265.md" create mode 100644 "problems/kamacoder/0161.\350\256\250\345\216\214\351\254\274\347\232\204\347\273\204\345\220\210\345\270\226\345\255\220.md" create mode 100644 "problems/kamacoder/0162.\345\260\217\347\272\242\347\232\204\347\254\25416\347\211\210\346\226\271\346\241\210.md" create mode 100644 "problems/kamacoder/\347\254\254\344\270\200\351\242\230.md" create mode 100644 "problems/kamacoder/\347\254\254\344\270\211\351\242\230.md" create mode 100644 "problems/kamacoder/\347\254\254\344\272\214\351\242\230.md" create mode 100644 problems/qita/tulunfabu.md diff --git a/README.md b/README.md index 96852d706d..53ea8dd048 100644 --- a/README.md +++ b/README.md @@ -373,7 +373,7 @@ ## 图论 -通知:开始更新图论内容,图论部分还没有其他语言版本,欢迎录友们提交PR,成为contributor +**[图论正式发布](./problems/qita/tulunfabu.md)** 1. [图论:理论基础](./problems/kamacoder/图论理论基础.md) 2. [图论:深度优先搜索理论基础](./problems/kamacoder/图论深搜理论基础.md) diff --git "a/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" "b/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" index 8e34713d37..64923e41fc 100644 --- "a/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" @@ -244,56 +244,61 @@ int** fourSum(int* nums, int numsSize, int target, int* returnSize, int** return ### Java: ```Java -class Solution { +import java.util.*; + +public class Solution { public List> fourSum(int[] nums, int target) { - List> result = new ArrayList<>(); - Arrays.sort(nums); - - for (int i = 0; i < nums.length; i++) { - - // nums[i] > target 直接返回, 剪枝操作 - if (nums[i] > 0 && nums[i] > target) { - return result; + Arrays.sort(nums); // 排序数组 + List> result = new ArrayList<>(); // 结果集 + for (int k = 0; k < nums.length; k++) { + // 剪枝处理 + if (nums[k] > target && nums[k] >= 0) { + break; } - - if (i > 0 && nums[i - 1] == nums[i]) { // 对nums[i]去重 + // 对nums[k]去重 + if (k > 0 && nums[k] == nums[k - 1]) { continue; } - - for (int j = i + 1; j < nums.length; j++) { - - // nums[i]+nums[j] > target 直接返回, 剪枝操作 - if (nums[i]+nums[j] > 0 && nums[i]+nums[j] > target) { - return result; - } - - if (j > i + 1 && nums[j - 1] == nums[j]) { // 对nums[j]去重 + for (int i = k + 1; i < nums.length; i++) { + // 第二级剪枝 + if (nums[k] + nums[i] > target && nums[k] + nums[i] >= 0) { + break; + } + // 对nums[i]去重 + if (i > k + 1 && nums[i] == nums[i - 1]) { continue; } - - int left = j + 1; + int left = i + 1; int right = nums.length - 1; while (right > left) { - // nums[k] + nums[i] + nums[left] + nums[right] > target int会溢出 - long sum = (long) nums[i] + nums[j] + nums[left] + nums[right]; + long sum = (long) nums[k] + nums[i] + nums[left] + nums[right]; if (sum > target) { right--; } else if (sum < target) { left++; } else { - result.add(Arrays.asList(nums[i], nums[j], nums[left], nums[right])); + result.add(Arrays.asList(nums[k], nums[i], nums[left], nums[right])); // 对nums[left]和nums[right]去重 while (right > left && nums[right] == nums[right - 1]) right--; while (right > left && nums[left] == nums[left + 1]) left++; - - left++; right--; + left++; } } } } return result; } + + public static void main(String[] args) { + Solution solution = new Solution(); + int[] nums = {1, 0, -1, 0, -2, 2}; + int target = 0; + List> results = solution.fourSum(nums, target); + for (List result : results) { + System.out.println(result); + } + } } ``` diff --git "a/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" "b/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" index 1c4d7f591f..c08a3045a5 100644 --- "a/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" +++ "b/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" @@ -188,13 +188,13 @@ public: 开头为什么要加元素0? -如果数组本身是降序的,例如 [8,6,4,2],在 8 入栈后,6 开始与8 进行比较,此时我们得到 mid(8),rigt(6),但是得不到 left。 +如果数组本身是降序的,例如 [8,6,4,2],在 8 入栈后,6 开始与8 进行比较,此时我们得到 mid(8),right(6),但是得不到 left。 (mid、left,right 都是对应版本一里的逻辑) 因为 将 8 弹出之后,栈里没有元素了,那么为了避免空栈取值,直接跳过了计算结果的逻辑。 -之后又将6 加入栈(此时8已经弹出了),然后 就是 4 与 栈口元素 8 进行比较,周而复始,那么计算的最后结果resutl就是0。 如图所示: +之后又将6 加入栈(此时8已经弹出了),然后 就是 4 与 栈口元素 6 进行比较,周而复始,那么计算的最后结果result就是0。 如图所示: ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20230221164533.png) diff --git "a/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" "b/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" index 816892d5d7..29748e2780 100644 --- "a/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" +++ "b/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" @@ -243,7 +243,7 @@ public: 使用用例:s = "applepenapple", wordDict = ["apple", "pen"],对应的dp数组状态如下: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20221123205105.png) +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240809155103.png) 最后dp[s.size()] = 0 即 dp[13] = 0 ,而不是1,因为先用 "apple" 去遍历的时候,dp[8]并没有被赋值为1 (还没用"pen"),所以 dp[13]也不能变成1。 diff --git "a/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" "b/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" index 8b9abd35a8..f0fe3a3c30 100644 --- "a/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" +++ "b/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" @@ -131,7 +131,7 @@ public: } }; ``` -* 时间复杂度: pop为O(n),其他为O(1) +* 时间复杂度: pop为O(n),top为O(n),其他为O(1) * 空间复杂度: O(n) ## 优化 @@ -147,17 +147,14 @@ class MyStack { public: queue que; - /** Initialize your data structure here. */ MyStack() { } - /** Push element x onto stack. */ void push(int x) { que.push(x); } - /** Removes the element on top of the stack and returns that element. */ int pop() { int size = que.size(); size--; @@ -170,9 +167,6 @@ public: return result; } - /** Get the top element. - ** Can not use back() direactly. - */ int top(){ int size = que.size(); size--; @@ -187,13 +181,12 @@ public: return result; } - /** Returns whether the stack is empty. */ bool empty() { return que.empty(); } }; ``` -* 时间复杂度: pop为O(n),其他为O(1) +* 时间复杂度: pop为O(n),top为O(n),其他为O(1) * 空间复杂度: O(n) diff --git "a/problems/0494.\347\233\256\346\240\207\345\222\214.md" "b/problems/0494.\347\233\256\346\240\207\345\222\214.md" index 33e3e953d6..82d330b727 100644 --- "a/problems/0494.\347\233\256\346\240\207\345\222\214.md" +++ "b/problems/0494.\347\233\256\346\240\207\345\222\214.md" @@ -49,7 +49,7 @@ * [动态规划:关于01背包问题,你该了解这些!](https://programmercarl.com/背包理论基础01背包-1.html) * [动态规划:关于01背包问题,你该了解这些!(滚动数组)](https://programmercarl.com/背包理论基础01背包-2.html) -如果跟着「代码随想录」一起学过[回溯算法系列](https://programmercarl.com/回溯总结.html)的录友,看到这道题,应该有一种直觉,就是感觉好像回溯法可以爆搜出来。 +如果跟着「代码随想录」一起学过[回溯算法系列](https://programmercarl.com/回溯总结.html)的录友,看到这道题,应该有一种直觉,就是感觉好像回溯法可以暴搜出来。 事实确实如此,下面我也会给出相应的代码,只不过会超时。 @@ -118,9 +118,7 @@ public: 也可以使用记忆化回溯,但这里我就不在回溯上下功夫了,直接看动规吧 -### 动态规划 - -如何转化为01背包问题呢。 +### 动态规划 (二维dp数组) 假设加法的总和为x,那么减法对应的总和就是sum - x。 @@ -132,7 +130,7 @@ x = (target + sum) / 2 这里的x,就是bagSize,也就是我们后面要求的背包容量。 -大家看到(target + sum) / 2 应该担心计算的过程中向下取整有没有影响。 +大家看到`(target + sum) / 2` 应该担心计算的过程中向下取整有没有影响。 这么担心就对了,例如sum是5,target是2 的话其实就是无解的,所以: @@ -147,8 +145,6 @@ if ((target + sum) % 2 == 1) return 0; // 此时没有方案 if (abs(target) > sum) return 0; // 此时没有方案 ``` -再回归到01背包问题,为什么是01背包呢? - 因为每个物品(题目中的1)只用一次! 这次和之前遇到的背包问题不一样了,之前都是求容量为j的背包,最多能装多少。 @@ -157,60 +153,261 @@ if (abs(target) > sum) return 0; // 此时没有方案 1. 确定dp数组以及下标的含义 -dp[j] 表示:填满j(包括j)这么大容积的包,有dp[j]种方法 +先用 二维 dp数组求解本题,dp[i][j]:使用 下标为[0, i]的nums[i]能够凑满j(包括j)这么大容量的包,有dp[i][j]种方法。 -其实也可以使用二维dp数组来求解本题,dp[i][j]:使用 下标为[0, i]的nums[i]能够凑满j(包括j)这么大容量的包,有dp[i][j]种方法。 - -下面我都是统一使用一维数组进行讲解, 二维降为一维(滚动数组),其实就是上一层拷贝下来,这个我在[动态规划:关于01背包问题,你该了解这些!(滚动数组)](https://programmercarl.com/背包理论基础01背包-2.html)也有介绍。 +01背包为什么这么定义dp数组,我在[0-1背包理论基础](https://www.programmercarl.com/%E8%83%8C%E5%8C%85%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%8001%E8%83%8C%E5%8C%85-1.html)中 确定dp数组的含义里讲解过。 2. 确定递推公式 -有哪些来源可以推出dp[j]呢? +我们先手动推导一下,这个二维数组里面的数值。 -只要搞到nums[i],凑成dp[j]就有dp[j - nums[i]] 种方法。 +先只考虑物品0,如图: -例如:dp[j],j 为5, +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240808161747.png) -* 已经有一个1(nums[i]) 的话,有 dp[4]种方法 凑成 容量为5的背包。 -* 已经有一个2(nums[i]) 的话,有 dp[3]种方法 凑成 容量为5的背包。 -* 已经有一个3(nums[i]) 的话,有 dp[2]种方法 凑成 容量为5的背包 -* 已经有一个4(nums[i]) 的话,有 dp[1]种方法 凑成 容量为5的背包 -* 已经有一个5 (nums[i])的话,有 dp[0]种方法 凑成 容量为5的背包 +(这里的所有物品,都是题目中的数字1)。 -那么凑整dp[5]有多少方法呢,也就是把 所有的 dp[j - nums[i]] 累加起来。 +装满背包容量为0 的方法个数是1,即 放0件物品。 -所以求组合类问题的公式,都是类似这种: +装满背包容量为1 的方法个数是1,即 放物品0。 -``` -dp[j] += dp[j - nums[i]] -``` +装满背包容量为2 的方法个数是0,目前没有办法能装满容量为2的背包。 -**这个公式在后面在讲解背包解决排列组合问题的时候还会用到!** +接下来 考虑 物品0 和 物品1,如图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240808162052.png) + +装满背包容量为0 的方法个数是1,即 放0件物品。 + +装满背包容量为1 的方法个数是2,即 放物品0 或者 放物品1。 + +装满背包容量为2 的方法个数是1,即 放物品0 和 放物品1。 + +其他容量都不能装满,所以方法是0。 + +接下来 考虑 物品0 、物品1 和 物品2 ,如图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240808162533.png) + +装满背包容量为0 的方法个数是1,即 放0件物品。 + +装满背包容量为1 的方法个数是3,即 放物品0 或者 放物品1 或者 放物品2。 + +装满背包容量为2 的方法个数是3,即 放物品0 和 放物品1、放物品0 和 物品 2、 放物品1 和 物品2。 + +装满背包容量为3的方法个数是1,即 放物品0 和 物品1 和 物品2。 + +通过以上举例,我们来看 dp[2][2] 可以有哪些方向推出来。 + +如图红色部分: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240808163312.png) + +dp[2][2] = 3,即 放物品0 和 放物品1、放物品0 和 物品 2、放物品1 和 物品2, 如图所示,三种方法: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240826111946.png) + +**容量为2 的背包,如果不放 物品2 有几种方法呢**? + +有 dp[1][2] 种方法,即 背包容量为2,只考虑物品0 和 物品1 ,有 dp[1][2] 种方法,如图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240826112805.png) + +**容量为2 的背包, 如果放 物品2 有几种方法呢**? + +首先 要在背包里 先把物品2的容量空出来, 装满 刨除物品2容量 的背包 有几种方法呢? + +刨除物品2容量后的背包容量为 1。 + +此时装满背包容量为1 有 dp[1][1] 种方法,即: 不放物品2,背包容量为1,只考虑物品 0 和 物品 1,有 dp[1][1] 种方法。 + +如图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240826113043.png) + +有录友可能疑惑,这里计算的是放满 容量为2的背包 有几种方法,那物品2去哪了? + +在上面图中,你把物品2补上就好,同样是两种方法。 + +dp[2][2] = 容量为2的背包不放物品2有几种方法 + 容量为2的背包不放物品2有几种方法 + +所以 dp[2][2] = dp[1][2] + dp[1][1] ,如图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240826113258.png) + +以上过程,抽象化如下: + +* **不放物品i**:即背包容量为j,里面不放物品i,装满有dp[i - 1][j]中方法。 + +* **放物品i**: 即:先空出物品i的容量,背包容量为(j - 物品i容量),放满背包有 dp[i - 1][j - 物品i容量] 种方法。 + +本题中,物品i的容量是nums[i],价值也是nums[i]。 + +递推公式:dp[i][j] = dp[i - 1][j] + dp[i - 1][j - nums[i]]; + +考到这个递推公式,我们应该注意到,`j - nums[i]` 作为数组下标,如果 `j - nums[i]` 小于零呢? + +说明背包容量装不下 物品i,所以此时装满背包的方法值 等于 不放物品i的装满背包的方法,即:dp[i][j] = dp[i - 1][j]; + +所以递推公式: + +```CPP +if (nums[i] > j) dp[i][j] = dp[i - 1][j]; +else dp[i][j] = dp[i - 1][j] + dp[i - 1][j - nums[i]]; +``` 3. dp数组如何初始化 -从递推公式可以看出,在初始化的时候dp[0] 一定要初始化为1,因为dp[0]是在公式中一切递推结果的起源,如果dp[0]是0的话,递推结果将都是0。 +先明确递推的方向,如图,求解 dp[2][2] 是由 上方和左上方推出。 + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240826115800.png) -这里有录友可能认为从dp数组定义来说 dp[0] 应该是0,也有录友认为dp[0]应该是1。 +那么二维数组的最上行 和 最左列一定要初始化,这是递推公式推导的基础,如图红色部分: -其实不要硬去解释它的含义,咱就把 dp[0]的情况带入本题看看应该等于多少。 +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240827103507.png) -如果数组[0] ,target = 0,那么 bagSize = (target + sum) / 2 = 0。 dp[0]也应该是1, 也就是说给数组里的元素 0 前面无论放加法还是减法,都是 1 种方法。 +关于dp[0][0]的值,在上面的递推公式讲解中已经讲过,装满背包容量为0 的方法数量是1,即 放0件物品。 -所以本题我们应该初始化 dp[0] 为 1。 +那么最上行dp[0][j] 如何初始化呢? -可能有同学想了,那 如果是 数组[0,0,0,0,0] target = 0 呢。 +dp[0][j]:只放物品0, 把容量为j的背包填满有几种方法。 -其实 此时最终的dp[0] = 32,也就是这五个零 子集的所有组合情况,但此dp[0]非彼dp[0],dp[0]能算出32,其基础是因为dp[0] = 1 累加起来的。 +只有背包容量为 物品0 的容量的时候,方法为1,正好装满。 -dp[j]其他下标对应的数值也应该初始化为0,从递推公式也可以看出,dp[j]要保证是0的初始值,才能正确的由dp[j - nums[i]]推导出来。 +其他情况下,要不是装不满,要不是装不下。 +所以初始化:dp[0][nums[0]] = 1 ,其他均为0 。 + +表格最左列也要初始化,dp[i][0] : 背包容量为0, 放物品0 到 物品i,装满有几种方法。 + +都是有一种方法,就是放0件物品。 + +即 dp[i][0] = 1 4. 确定遍历顺序 -在[动态规划:关于01背包问题,你该了解这些!(滚动数组)](https://programmercarl.com/背包理论基础01背包-2.html)中,我们讲过对于01背包问题一维dp的遍历,nums放在外循环,target在内循环,且内循环倒序。 +在明确递推方向时,我们知道 当前值 是由上方和左上方推出。 + +那么我们的遍历顺序一定是 从上到下,从左到右。 + +因为只有这样,我们才能基于之前的数值做推导。 + +例如下图,如果上方没数值,左上方没数值,就无法推出 dp[2][2]。 + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240827105427.png) + +那么是先 从上到下 ,再从左到右遍历,例如这样: + +```CPP +for (int i = 1; i < nums.size(); i++) { // 行,遍历物品 + for (int j = 0; j <= bagSize; j++) { // 列,遍历背包 + } +} +``` + +还是先 从左到右,再从上到下呢,例如这样: + +```CPP +for (int j = 0; j <= bagSize; j++) { // 列,遍历背包 + for (int i = 1; i < nums.size(); i++) { // 行,遍历物品 + } +} +``` + +**其实以上两种遍历都可以**! (但仅针对二维DP数组是这样的) + +这一点我在 [01背包理论基础](https://www.programmercarl.com/%E8%83%8C%E5%8C%85%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%8001%E8%83%8C%E5%8C%85-1.html)中的 遍历顺序部分讲过。 + +这里我再画图讲一下,以求dp[2][2]为例,当先从上到下,再从左到右遍历,矩阵是这样: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240827110933.png) + +当先从左到右,再从上到下遍历,矩阵是这样: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240827111013.png) + +这里大家可以看出,无论是以上哪种遍历,都不影响 dp[2][2]的求值,用来 推导 dp[2][2] 的数值都在。 +5. 举例推导dp数组 + +输入:nums: [1, 1, 1, 1, 1], target: 3 + +bagSize = (target + sum) / 2 = (3 + 5) / 2 = 4 + +dp数组状态变化如下: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240827111612.png) + +这么大的矩阵,我们是可以自己手动模拟出来的。 + +在模拟的过程中,既可以帮我们寻找规律,也可以帮我们验证 递推公式加遍历顺序是不是按照我们想象的结果推进的。 + + +最后二维dp数组的C++代码如下: + +```CPP +class Solution { +public: + int findTargetSumWays(vector& nums, int target) { + int sum = 0; + for (int i = 0; i < nums.size(); i++) sum += nums[i]; + if (abs(target) > sum) return 0; // 此时没有方案 + if ((target + sum) % 2 == 1) return 0; // 此时没有方案 + int bagSize = (target + sum) / 2; + + vector> dp(nums.size(), vector(bagSize + 1, 0)); + + // 初始化最上行 + if (nums[0] <= bagSize) dp[0][nums[0]] = 1; + + // 初始化最左列,最左列其他数值在递推公式中就完成了赋值 + dp[0][0] = 1; + + int numZero = 0; + for (int i = 0; i < nums.size(); i++) { + if (nums[i] == 0) numZero++; + dp[i][0] = (int) pow(2.0, numZero); + } + + // 以下遍历顺序行列可以颠倒 + for (int i = 1; i < nums.size(); i++) { // 行,遍历物品 + for (int j = 0; j <= bagSize; j++) { // 列,遍历背包 + if (nums[i] > j) dp[i][j] = dp[i - 1][j]; + else dp[i][j] = dp[i - 1][j] + dp[i - 1][j - nums[i]]; + } + } + return dp[nums.size() - 1][bagSize]; + } +}; +``` + +### 动态规划 (一维dp数组) + +将二维dp数组压缩成一维dp数组,我们在 [01背包理论基础(滚动数组)](https://programmercarl.com/背包理论基础01背包-2.html) 讲过滚动数组,原理是一样的,即重复利用每一行的数值。 + +既然是重复利用每一行,就是将二维数组压缩成一行。 + +dp[i][j] 去掉 行的维度,即 dp[j],表示:填满j(包括j)这么大容积的包,有dp[j]种方法。 + +2. 确定递推公式 + +二维DP数组递推公式: `dp[i][j] = dp[i - 1][j] + dp[i - 1][j - nums[i]];` + +去掉维度i 之后,递推公式:`dp[j] = dp[j] + dp[j - nums[i]]` ,即:`dp[j] += dp[j - nums[i]]` + +**这个公式在后面在讲解背包解决排列组合问题的时候还会用到!** + +3. dp数组如何初始化 + +在上面 二维dp数组中,我们讲解过 dp[0][0] 初始为1,这里dp[0] 同样初始为1 ,即装满背包为0的方法有一种,放0件物品。 + +4. 确定遍历顺序 + +在[动态规划:关于01背包问题,你该了解这些!(滚动数组)](https://programmercarl.com/背包理论基础01背包-2.html)中,我们系统讲过对于01背包问题一维dp的遍历。 + +遍历物品放在外循环,遍历背包在内循环,且内循环倒序(为了保证物品只使用一次)。 + 5. 举例推导dp数组 输入:nums: [1, 1, 1, 1, 1], target: 3 @@ -221,7 +418,9 @@ dp数组状态变化如下: ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210125120743274.jpg) -C++代码如下: +大家可以和 二维dp数组的打印结果做一下对比。 + +一维DP的C++代码如下: ```CPP class Solution { @@ -248,23 +447,51 @@ public: * 空间复杂度:O(m),m为背包容量 -## 总结 -此时 大家应该不禁想起,我们之前讲过的[回溯算法:39. 组合总和](https://programmercarl.com/0039.组合总和.html)是不是应该也可以用dp来做啊? +### 拓展 -是的,如果仅仅是求个数的话,就可以用dp,但[回溯算法:39. 组合总和](https://programmercarl.com/0039.组合总和.html)要求的是把所有组合列出来,还是要使用回溯法爆搜的。 +关于一维dp数组的递推公式解释,也可以从以下维度来理解。 (**但还是从二维DP数组到一维DP数组这样更容易理解一些**) -本题还是有点难度,大家也可以记住,在求装满背包有几种方法的情况下,递推公式一般为: +2. 确定递推公式 + +有哪些来源可以推出dp[j]呢? + +只要搞到nums[i],凑成dp[j]就有dp[j - nums[i]] 种方法。 + +例如:dp[j],j 为5, + +* 已经有一个1(nums[i]) 的话,有 dp[4]种方法 凑成 容量为5的背包。 +* 已经有一个2(nums[i]) 的话,有 dp[3]种方法 凑成 容量为5的背包。 +* 已经有一个3(nums[i]) 的话,有 dp[2]种方法 凑成 容量为5的背包 +* 已经有一个4(nums[i]) 的话,有 dp[1]种方法 凑成 容量为5的背包 +* 已经有一个5 (nums[i])的话,有 dp[0]种方法 凑成 容量为5的背包 + +那么凑整dp[5]有多少方法呢,也就是把 所有的 dp[j - nums[i]] 累加起来。 + +所以求组合类问题的公式,都是类似这种: -```CPP -dp[j] += dp[j - nums[i]]; ``` +dp[j] += dp[j - nums[i]] +``` + + +## 总结 + +此时 大家应该不禁想起,我们之前讲过的[回溯算法:39. 组合总和](https://programmercarl.com/0039.组合总和.html)是不是应该也可以用dp来做啊? -后面我们在讲解完全背包的时候,还会用到这个递推公式! +是可以求的,如果仅仅是求个数的话,就可以用dp,但[回溯算法:39. 组合总和](https://programmercarl.com/0039.组合总和.html)要求的是把所有组合列出来,还是要使用回溯法暴搜的。 +本题还是有点难度,理解上从二维DP数组更容易理解,做题上直接用一维DP更简洁一些。 +大家可以选择哪种方式自己更容易理解。 +在后面得题目中,在求装满背包有几种方法的情况下,递推公式一般为: +```CPP +dp[j] += dp[j - nums[i]]; +``` + +我们在讲解完全背包的时候,还会用到这个递推公式! ## 其他语言版本 @@ -359,13 +586,6 @@ class Solution { } } - // 打印dp数组 - // for(int i = 0; i < nums.length; i++) { - // for(int j = 0; j <= left; j++) { - // System.out.print(dp[i][j] + " "); - // } - // System.out.println(""); - // } return dp[nums.length - 1][left]; @@ -656,51 +876,3 @@ public class Solution - -class Solution { -public: - int findTargetSumWays(vector& nums, int target) { - int sum = 0; - for (int i = 0; i < nums.size(); i++) sum += nums[i]; - if (abs(target) > sum) return 0; // 此时没有方案 - if ((target + sum) % 2 == 1) return 0; // 此时没有方案 - int bagSize = (target + sum) / 2; - - vector> dp(nums.size(), vector(bagSize + 1, 0)); - - if (nums[0] <= bagSize) dp[0][nums[0]] = 1; - - dp[0][0] = 1; - - int numZero = 0; - for (int i = 0; i < nums.size(); i++) { - if (nums[i] == 0) numZero++; - dp[i][0] = (int) pow(2.0, numZero); - } - - for (int i = 1; i < nums.size(); i++) { - for (int j = 0; j <= bagSize; j++) { - if (nums[i] > j) dp[i][j] = dp[i - 1][j]; - else dp[i][j] = dp[i - 1][j] + dp[i - 1][j - nums[i]]; - } - } - for (int i = 0; i < nums.size(); i++) { - for (int j = 0; j <= bagSize; j++) { - cout << dp[i][j] << " "; - } - cout << endl; - } - return dp[nums.size() - 1][bagSize]; - } -}; - -1 1 0 0 0 -1 2 1 0 0 -1 3 3 1 0 -1 4 6 4 1 -1 5 10 10 5 - -初始化 如果没有0, dp[i][0] = 1; 即所有元素都不取。 - -用元素 取与不取来举例 - diff --git "a/problems/kamacoder/0047.\345\217\202\344\274\232dijkstra\346\234\264\347\264\240.md" "b/problems/kamacoder/0047.\345\217\202\344\274\232dijkstra\346\234\264\347\264\240.md" index e904b9217e..c0a490b343 100644 --- "a/problems/kamacoder/0047.\345\217\202\344\274\232dijkstra\346\234\264\347\264\240.md" +++ "b/problems/kamacoder/0047.\345\217\202\344\274\232dijkstra\346\234\264\347\264\240.md" @@ -150,7 +150,7 @@ minDist数组数值初始化为int最大值。 更新 minDist数组,即:源点(节点1) 到 节点2 和 节点3的距离。 * 源点到节点2的最短距离为1,小于原minDist[2]的数值max,更新minDist[2] = 1 -* 源点到节点3的最短距离为4,小于原minDist[3]的数值max,更新minDist[4] = 4 +* 源点到节点3的最短距离为4,小于原minDist[3]的数值max,更新minDist[3] = 4 可能有录友问:为啥和 minDist[2] 比较? diff --git "a/problems/kamacoder/0053.\345\257\273\345\256\235-prim.md" "b/problems/kamacoder/0053.\345\257\273\345\256\235-prim.md" index 7ad050c780..c71624b55a 100644 --- "a/problems/kamacoder/0053.\345\257\273\345\256\235-prim.md" +++ "b/problems/kamacoder/0053.\345\257\273\345\256\235-prim.md" @@ -176,7 +176,7 @@ minDist 数组 里的数值初始化为 最大数,因为本题 节点距离不 所有非生成树的节点距离 最小生成树(节点1、节点2、节点3 )的距离都已经跟新了 。 -* 节点 4 和 节点 3的距离为 1,和原先的距离值 2 小,所以更新minDist[3]为1。 +* 节点 4 和 节点 3的距离为 1,和原先的距离值 2 小,所以更新minDist[4]为1。 上面为什么我们只比较 节点4 和 节点3 的距离呢? @@ -213,7 +213,7 @@ minDist 数组 里的数值初始化为 最大数,因为本题 节点距离不 minDist数组已经更新了 所有非生成树的节点距离 最小生成树(节点1、节点2、节点3、节点4 )的距离 。 -* 节点 5 和 节点 4的距离为 1,和原先的距离值 2 小,所以更新minDist[4]为1。 +* 节点 5 和 节点 4的距离为 1,和原先的距离值 2 小,所以更新minDist[5]为1。 ### 6 diff --git "a/problems/kamacoder/0095.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223II.md" "b/problems/kamacoder/0095.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223II.md" index 5bc4be7b22..9bece92b2b 100644 --- "a/problems/kamacoder/0095.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223II.md" +++ "b/problems/kamacoder/0095.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223II.md" @@ -247,6 +247,61 @@ int main() { ### Python +```python +import sys + +def main(): + input = sys.stdin.read + data = input().split() + index = 0 + + n = int(data[index]) + index += 1 + m = int(data[index]) + index += 1 + + grid = [] + for i in range(m): + p1 = int(data[index]) + index += 1 + p2 = int(data[index]) + index += 1 + val = int(data[index]) + index += 1 + # p1 指向 p2,权值为 val + grid.append([p1, p2, val]) + + start = 1 # 起点 + end = n # 终点 + + minDist = [float('inf')] * (n + 1) + minDist[start] = 0 + flag = False + + for i in range(1, n + 1): # 这里我们松弛n次,最后一次判断负权回路 + for side in grid: + from_node = side[0] + to = side[1] + price = side[2] + if i < n: + if minDist[from_node] != float('inf') and minDist[to] > minDist[from_node] + price: + minDist[to] = minDist[from_node] + price + else: # 多加一次松弛判断负权回路 + if minDist[from_node] != float('inf') and minDist[to] > minDist[from_node] + price: + flag = True + + if flag: + print("circle") + elif minDist[end] == float('inf'): + print("unconnected") + else: + print(minDist[end]) + +if __name__ == "__main__": + main() + +``` + ### Go ### Rust diff --git "a/problems/kamacoder/0099.\345\262\233\345\261\277\347\232\204\346\225\260\351\207\217\345\271\277\346\220\234.md" "b/problems/kamacoder/0099.\345\262\233\345\261\277\347\232\204\346\225\260\351\207\217\345\271\277\346\220\234.md" index 3c069b4412..a5a40162ac 100644 --- "a/problems/kamacoder/0099.\345\262\233\345\261\277\347\232\204\346\225\260\351\207\217\345\271\277\346\220\234.md" +++ "b/problems/kamacoder/0099.\345\262\233\345\261\277\347\232\204\346\225\260\351\207\217\345\271\277\346\220\234.md" @@ -192,50 +192,6 @@ int main() { ```java -import java.util.Scanner; - -public class Main { - static int[][] dir = { {0, 1}, {1, 0}, {-1, 0}, {0, -1} }; // 四个方向 - - public static void dfs(int[][] grid, boolean[][] visited, int x, int y) { - for (int i = 0; i < 4; i++) { - int nextx = x + dir[i][0]; - int nexty = y + dir[i][1]; - if (nextx < 0 || nextx >= grid.length || nexty < 0 || nexty >= grid[0].length) continue; // 越界了,直接跳过 - if (!visited[nextx][nexty] && grid[nextx][nexty] == 1) { // 没有访问过的 同时 是陆地的 - visited[nextx][nexty] = true; - dfs(grid, visited, nextx, nexty); - } - } - } - - public static void main(String[] args) { - Scanner scanner = new Scanner(System.in); - int n = scanner.nextInt(); - int m = scanner.nextInt(); - int[][] grid = new int[n][m]; - for (int i = 0; i < n; i++) { - for (int j = 0; j < m; j++) { - grid[i][j] = scanner.nextInt(); - } - } - - boolean[][] visited = new boolean[n][m]; - - int result = 0; - for (int i = 0; i < n; i++) { - for (int j = 0; j < m; j++) { - if (!visited[i][j] && grid[i][j] == 1) { - visited[i][j] = true; - result++; // 遇到没访问过的陆地,+1 - dfs(grid, visited, i, j); // 将与其链接的陆地都标记上 true - } - } - } - - System.out.println(result); - } -} @@ -246,32 +202,6 @@ public class Main { ```python -def dfs(grid, visited, x, y): - dir = [(0, 1), (1, 0), (-1, 0), (0, -1)] # 四个方向 - for d in dir: - nextx, nexty = x + d[0], y + d[1] - if 0 <= nextx < len(grid) and 0 <= nexty < len(grid[0]): - if not visited[nextx][nexty] and grid[nextx][nexty] == 1: # 没有访问过的 同时 是陆地的 - visited[nextx][nexty] = True - dfs(grid, visited, nextx, nexty) - -def main(): - n, m = map(int, input().split()) - grid = [list(map(int, input().split())) for _ in range(n)] - visited = [[False] * m for _ in range(n)] - - result = 0 - for i in range(n): - for j in range(m): - if not visited[i][j] and grid[i][j] == 1: - visited[i][j] = True - result += 1 # 遇到没访问过的陆地,+1 - dfs(grid, visited, i, j) # 将与其链接的陆地都标记上 True - - print(result) - -if __name__ == "__main__": - main() diff --git "a/problems/kamacoder/0104.\345\273\272\351\200\240\346\234\200\345\244\247\345\262\233\345\261\277.md" "b/problems/kamacoder/0104.\345\273\272\351\200\240\346\234\200\345\244\247\345\262\233\345\261\277.md" index 7d67b7fcb1..c08434f941 100644 --- "a/problems/kamacoder/0104.\345\273\272\351\200\240\346\234\200\345\244\247\345\262\233\345\261\277.md" +++ "b/problems/kamacoder/0104.\345\273\272\351\200\240\346\234\200\345\244\247\345\262\233\345\261\277.md" @@ -17,7 +17,7 @@ 输出描述: -输出一个整数,表示最大的岛屿面积。如果矩阵中不存在岛屿,则输出 0。 +输出一个整数,表示最大的岛屿面积。 输入示例: diff --git "a/problems/kamacoder/0109.\345\206\227\344\275\231\350\277\236\346\216\245II.md" "b/problems/kamacoder/0109.\345\206\227\344\275\231\350\277\236\346\216\245II.md" index b13daec7bf..8c20a0e08f 100644 --- "a/problems/kamacoder/0109.\345\206\227\344\275\231\350\277\236\346\216\245II.md" +++ "b/problems/kamacoder/0109.\345\206\227\344\275\231\350\277\236\346\216\245II.md" @@ -7,16 +7,21 @@ 题目描述 -有向树指满足以下条件的有向图。该树只有一个根节点,所有其他节点都是该根节点的后继。该树除了根节点之外的每一个节点都有且只有一个父节点,而根节点没有父节点。有向树拥有 n 个节点和 n - 1 条边。 +有一种有向树,该树只有一个根节点,所有其他节点都是该根节点的后继。该树除了根节点之外的每一个节点都有且只有一个父节点,而根节点没有父节点。有向树拥有 n 个节点和 n - 1 条边。如图:  + -输入一个有向图,该图由一个有着 n 个节点(节点编号 从 1 到 n),n 条边,请返回一条可以删除的边,使得删除该条边之后该有向图可以被当作一颗有向树。 +现在有一个有向图,有向图是在有向树中的两个没有直接链接的节点中间添加一条有向边。如图: + + + +输入一个有向图,该图由一个有着 n 个节点(节点编号 从 1 到 n),n 条边,请返回一条可以删除的边,使得删除该条边之后该有向图可以被当作一颗有向树。 输入描述 第一行输入一个整数 N,表示有向图中节点和边的个数。 -后续 N 行,每行输入两个整数 s 和 t,代表 s 节点有一条连接 t 节点的单向边 +后续 N 行,每行输入两个整数 s 和 t,代表这是 s 节点连接并指向 t 节点的单向边 输出描述 @@ -37,7 +42,7 @@ 提示信息 -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240527112633.png) + 在删除 2 3 后有向图可以变为一棵合法的有向树,所以输出 2 3 diff --git "a/problems/kamacoder/\345\256\214\347\276\216\346\225\260.md" "b/problems/kamacoder/0139.\345\256\214\347\276\216\346\225\260.md" similarity index 100% rename from "problems/kamacoder/\345\256\214\347\276\216\346\225\260.md" rename to "problems/kamacoder/0139.\345\256\214\347\276\216\346\225\260.md" diff --git "a/problems/kamacoder/\345\245\275\344\272\214\345\217\211\346\240\221.md" "b/problems/kamacoder/0141.\345\245\275\344\272\214\345\217\211\346\240\221.md" similarity index 100% rename from "problems/kamacoder/\345\245\275\344\272\214\345\217\211\346\240\221.md" rename to "problems/kamacoder/0141.\345\245\275\344\272\214\345\217\211\346\240\221.md" diff --git "a/problems/kamacoder/0153.\346\235\203\345\200\274\344\274\230\345\212\277\350\267\257\345\276\204\350\256\241\346\225\260.md" "b/problems/kamacoder/0153.\346\235\203\345\200\274\344\274\230\345\212\277\350\267\257\345\276\204\350\256\241\346\225\260.md" new file mode 100644 index 0000000000..2c5562b392 --- /dev/null +++ "b/problems/kamacoder/0153.\346\235\203\345\200\274\344\274\230\345\212\277\350\267\257\345\276\204\350\256\241\346\225\260.md" @@ -0,0 +1,95 @@ + + +# 权值优势路径计数 + +[题目链接](https://kamacoder.com/problempage.php?pid=1231) + +1、构建二叉树:首先根据层序遍历的序列构建二叉树。这可以通过使用队列来实现,队列中存储当前节点及其索引,确保可以正确地将子节点添加到父节点下。 + +2、路径遍历:使用深度优先搜索(DFS)遍历所有从根到叶子的路径。在遍历过程中,维护一个计数器跟踪当前路径中权值为 1 和权值为 0 的节点的数量。 + +3、计数满足条件的路径:每当到达一个叶子节点时,检查当前路径的权值 1 的节点数量是否比权值 0 的节点数量多 1。如果满足,递增一个全局计数器。 + + +```CPP + +#include +#include +#include + +using namespace std; + +struct TreeNode { + int val; + TreeNode *left, *right; + TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} +}; + +// DFS遍历二叉树,并计算满足条件的路径数量 +void countPaths(TreeNode* node, int count1, int count0, int& result) { + if (!node) return; + + // 更新当前路径中1和0的数量 + node->val == 1 ? count1++ : count0++; + + // 检查当前节点是否为叶子节点 + if (!node->left && !node->right) { + // 检查1的数量是否比0的数量多1 + if (count1 == count0 + 1) { + result++; + } + return; + } + + // 递归访问左右子节点 + countPaths(node->left, count1, count0, result); + countPaths(node->right, count1, count0, result); +} + +int main() { + int N; + cin >> N; + + vector nums(N); + for (int i = 0; i < N; ++i) { + cin >> nums[i]; + } + + if (nums.empty()) { + cout << 0 << endl; + return 0; + } + + // 根据层序遍历的输入构建二叉树 + queue q; + TreeNode* root = new TreeNode(nums[0]); + q.push(root); + int index = 1; + + while (!q.empty() && index < N) { + TreeNode* node = q.front(); + q.pop(); + + if (index < N && nums[index] != -1) { + node->left = new TreeNode(nums[index]); + q.push(node->left); + } + index++; + + if (index < N && nums[index] != -1) { + node->right = new TreeNode(nums[index]); + q.push(node->right); + } + index++; + } + + // 计算满足条件的路径数 + int result = 0; + countPaths(root, 0, 0, result); + + cout << result << endl; + + return 0; +} + +``` diff --git "a/problems/kamacoder/0154.\345\272\217\345\210\227\344\270\255\344\275\215\346\225\260.md" "b/problems/kamacoder/0154.\345\272\217\345\210\227\344\270\255\344\275\215\346\225\260.md" new file mode 100644 index 0000000000..90e5b7a413 --- /dev/null +++ "b/problems/kamacoder/0154.\345\272\217\345\210\227\344\270\255\344\275\215\346\225\260.md" @@ -0,0 +1,68 @@ + +# 序列中位数 + +[题目链接](https://kamacoder.com/problempage.php?pid=1232) + +注意给的数组默认不是有序的! + +模拟题,排序之后,取中位数,然后按照b数组 删 a数组中元素,再取中位数。 + +```CPP +#include +using namespace std; + +// 计算并返回中位数 +double findMedian(vector& nums) { + int n = nums.size(); + if (n % 2 == 1) { + return nums[n / 2]; // 奇数长度,返回中间的元素 + } else { + // 偶数长度,返回中间两个元素的平均值 + return (nums[n / 2] + nums[n / 2 - 1]) / 2.0; + } +} + + +int main(){ + int t; + cin >> t; + while(t--){ + int n; + cin>> n; + vector a(n); + vector b(n - 1); + for(int i = 0; i < n; i++){ + cin >> a[i]; + } + for(int i = 0; i < n - 1; i++){ + cin >> b[i]; + } + vector nums = a; + vector answers; + + sort(nums.begin(), nums.end()); + + // 把中位数放进结果集 + answers.push_back(findMedian(nums)); + + for(int i = 0; i < n - 1; i++){ + + int target = a[b[i]]; + // 删除目标值 + nums.erase(find(nums.begin(), nums.end(), target)); + // 把中位数放进结果集 + answers.push_back(findMedian(nums)); + + } + + for(auto answer : answers){ + // 判断是否是整数 + if(answer == (int)answer) printf("%d ", (int)answer); + else printf("%.1f ", answer); + } + cout << endl; + } + +} + +``` diff --git "a/problems/kamacoder/0155.\346\234\200\345\260\217\345\214\226\351\242\221\347\216\207\347\232\204\345\210\240\351\231\244\344\273\243\344\273\267.md" "b/problems/kamacoder/0155.\346\234\200\345\260\217\345\214\226\351\242\221\347\216\207\347\232\204\345\210\240\351\231\244\344\273\243\344\273\267.md" new file mode 100644 index 0000000000..d79d695548 --- /dev/null +++ "b/problems/kamacoder/0155.\346\234\200\345\260\217\345\214\226\351\242\221\347\216\207\347\232\204\345\210\240\351\231\244\344\273\243\344\273\267.md" @@ -0,0 +1,106 @@ + +# 最小化频率的删除代价 + +[题目链接](https://kamacoder.com/problempage.php?pid=1233) + +计数和排序: + +* 使用 map 或 unordered_map 对数组 a 中每个元素出现的次数进行统计。 +* 将统计结果存入一个 vector>,其中 pair 的第一个元素是元素的出现次数,第二个元素是元素本身。 +* 按出现次数从大到小排序这个 vector。 + +确定最小 f(a): + +* 从最大出现次数开始尝试减少 f(a)。为此,从最高频次的元素开始逐步向下考虑较少出现的元素,计算达到更低 f(a) 所需删除的元素数量。 +* 使用一个累加器 count 来记录需要删除的元素数量,直到这个数量超过允许的最大删除数量 k 或恰好等于 k。在此过程中,尽量使 f(a) 达到最小。 + +计算达到 f(a) 的代价: + +* 计算完成后,需要确定达到最小 f(a) 的确切代价。首先,为每个元素确定在不超过 k 的前提下可以删除的最大数量,以使得 f(a) 最小。 +* 对于每个元素,如果它的数量超过了新的 f(a),则计算减少到 f(a) 所需删除的具体元素数,记录下来。 + +计算具体删除代价: + +* 遍历原数组,对于每个需要删除的元素,根据其位置累加删除代价。每删除一个元素,相应地减少其在删除列表中的计数。当某元素需要删除的数量减至 0 时,从删除列表中移除该元素。 + + +```CPP + +#include +#include +#include +#include + +using namespace std; + +int main() { + int n, k; + cin >> n >> k; + + vector a(n); + for (int i = 0; i < n; ++i) { + cin >> a[i]; + } + + unordered_map umap; // 使用map来统计每个元素的出现频率 + for (int i = 0; i < n; ++i) { + umap[a[i]]++; // 统计每个元素的出现次数 + } + + vector> table; + for (auto& pair : umap) { + table.push_back({pair.second, pair.first}); // 将元素和其频率作为一个pair放入table中 + } + + sort(table.begin(), table.end(), greater<>()); // 将table按照频率从大到小排序 + + int count = 0; // 用来计算已经删除的元素总数 + int minVal = table[0].first; // 从最高频率开始 + for (int i = 0; i < table.size(); ++i) { + int freq = table[i].first; + count += (minVal - freq) * i; // 累加删除元素的代价 + if (count > k) break; // 如果超过了k,停止循环 + else if (count == k) { + minVal = freq; + break; + } else minVal = freq; + } + if (count < k) { + int addDel = (k - count) / table.size(); // 如果删除的代价还没达到k,计算还可以进一步减少的频率 + minVal -= addDel; // 减少相应的频率 + } + + if (minVal < 0) { + minVal = 0; // 确保最小频率值不小于0 + } + + unordered_map deleteList; // 用来存储需要删除的元素及其数量 + for (auto& elem : table) { + int num = elem.first; + int ind = elem.second; + if (num > minVal) { + deleteList[ind] = num - minVal; // 如果元素频率大于最小值,计算需要删除的数量 + } else { + break; + } + } + + int cost = 0; // 计算总的删除代价 + for (int i = 0; i < n; ++i) { + if (deleteList.find(a[i]) != deleteList.end()) { + cost += i + 1; // 删除的代价是元素的索引+1 + deleteList[a[i]]--; // 删除一个元素 + if (deleteList[a[i]] == 0) { + deleteList.erase(a[i]); // 如果元素已经全部删除,从列表中移除 + if (deleteList.empty()) { + break; // 如果没有元素需要删除了,结束循环 + } + } + } + } + + cout << minVal << " " << cost << endl; + return 0; +} + +``` diff --git "a/problems/kamacoder/0156.\345\213\207\346\225\242\347\211\233\347\211\233\346\210\230\346\226\227\345\272\217\345\210\227.md" "b/problems/kamacoder/0156.\345\213\207\346\225\242\347\211\233\347\211\233\346\210\230\346\226\227\345\272\217\345\210\227.md" new file mode 100644 index 0000000000..b7bea97458 --- /dev/null +++ "b/problems/kamacoder/0156.\345\213\207\346\225\242\347\211\233\347\211\233\346\210\230\346\226\227\345\272\217\345\210\227.md" @@ -0,0 +1,68 @@ + +# 勇敢牛牛战斗序列 + +[题目链接](https://kamacoder.com/problempage.php?pid=1234) + +贪心思路,对数组从小到大排序之后,先取最右边,再取最左边,循环反复。 + +```CPP +#include + +using namespace std; + +int main() { + int n; + cin >> n; + vector a(n); // 使用 vector 存储整数数组 + for (int i = 0; i < n; i++) { + cin >> a[i]; // 读取数组 + } + sort(a.begin(), a.end()); // 对数组进行排序 + + long long ans = 0; // 使用 long long 存储结果,以防溢出 + int cur = 0; + int left = 0, right = n - 1; + while (left <= right) { + if (cur < a[right]) { + ans += a[right] - cur; + } + cur = a[left]; + right--; + left++; + } + cout << ans << endl; // 输出结果 + return 0; +} +``` + + + +```Java +import java.util.Arrays; +import java.util.Scanner; + +public class Main { + + public static void main(String[] args) { + Scanner sc = new Scanner(System.in); + int n = sc.nextInt(); + int[] a = new int[n]; + for (int i = 0; i < n; i++) { + a[i] = sc.nextInt(); + } + Arrays.sort(a); + long ans = 0; + int cur = 0; + int left = 0, right = a.length - 1; + while (left <= right) { + if (cur < a[right]) { + ans = ans + a[right] - cur; + } + cur = a[left]; + right--; + left++; + } + System.out.println(ans); + } +} +``` diff --git "a/problems/kamacoder/0157.\346\234\200\345\244\247\345\214\226\345\257\206\347\240\201\345\244\215\346\235\202\345\272\246.md" "b/problems/kamacoder/0157.\346\234\200\345\244\247\345\214\226\345\257\206\347\240\201\345\244\215\346\235\202\345\272\246.md" new file mode 100644 index 0000000000..9ca4630df1 --- /dev/null +++ "b/problems/kamacoder/0157.\346\234\200\345\244\247\345\214\226\345\257\206\347\240\201\345\244\215\346\235\202\345\272\246.md" @@ -0,0 +1,59 @@ + +# 最大化密码复杂度 + +[题目链接](https://kamacoder.com/problempage.php?pid=1235) + +注意**边界处理**,对于字符串的首尾位置,需要特别处理,因为它们只有一个相邻字符。 +* 遍历字符串 s,寻找 '?' 字符。 +* 对于每个 '?' 字符,选择一个字符填充,使其与前后字符都不同。这样做的目的是最大化密码的复杂度,即尽可能使相邻的字符不同。 +* 如果 '?' 是第一个或最后一个字符,或者无法找到与前后都不同的字符,选择与前一个或后一个字符不同的字符。 + + +```CPP +#include +#include +#include + +using namespace std; + +int main() { + int n, m; + string s; + cin >> n >> m >> s; + + if (n == 1) { + cout << 0 << endl; + return 0; + } + + // 统一处理包括左右字符的情况 + for (int i = 0; i < n; ++i) { + if (s[i] == '?') { + bool found = false; + for (char j = 'a'; j < 'a' + m; ++j) { + // 避免第一个字符 和 最后一个字符,因为两个字符只有一个相邻字符,没有左右相邻字符 + if ((i == 0 || s[i - 1] != j) && (i == n - 1 || s[i + 1] != j)) { + s[i] = j; + found = true; + break; + } + } + // 如果没有找到合适的字符,就和附近字符保持一致 + if (!found) { + if (i > 0) s[i] = s[i - 1]; + else s[i] = s[i + 1]; + } + } + } + + // 计算结果 + int result = 0; + for (int i = 0; i < n - 1; ++i) { + if (s[i] != s[i + 1]) result++; + } + + cout << result << endl; + return 0; +} + +``` diff --git "a/problems/kamacoder/0158.\345\220\214\344\275\231\346\226\271\347\250\213.md" "b/problems/kamacoder/0158.\345\220\214\344\275\231\346\226\271\347\250\213.md" new file mode 100644 index 0000000000..b99481d2de --- /dev/null +++ "b/problems/kamacoder/0158.\345\220\214\344\275\231\346\226\271\347\250\213.md" @@ -0,0 +1,50 @@ + +# 同余方程 + +题目链接:https://kamacoder.com/problempage.php?pid=1236 + +我们需要求出满足以下条件的最小正整数 x:`ax≡1 (mod b)` + +这意味着我们需要找到 x 使得 ax 除以 b 的余数是 1。这个问题实际上是一个典型的 模反元素 问题。 + +解题思路: + +* 为了求出最小的 x,我们可以使用 扩展欧几里得算法 来求出 a 对模 b 的逆元。 +* 这个算法能够求解 ax + by = gcd(a, b) 的一组整数解 (x, y),而在 gcd(a, b) = 1 的情况下,x 即为所求的模逆元。 +* 扩展欧几里得算法:扩展欧几里得算法可以通过递归或者迭代的方式实现。 + +下面给出C++代码实现: + +```CPP +#include +using namespace std; + +// 扩展欧几里得:计算 ax + by = gcd(a, b) 的解 +long long extended_gcd(long long a, long long b, long long &x, long long &y) { + if (b == 0) { + x = 1; + y = 0; + return a; + } + long long x1, y1; + long long gcd = extended_gcd(b, a % b, x1, y1); + x = y1; + y = x1 - (a / b) * y1; + return gcd; +} + +int main() { + long long a, b; + cin >> a >> b; + + long long x, y; + long long gcd = extended_gcd(a, b, x, y); + + // 由于我们只需要模 b 的正整数解,所以我们要保证 x 是正数 + x = (x % b + b) % b; + + cout << x << endl; + + return 0; +} +``` diff --git "a/problems/kamacoder/0159.\345\244\247\346\225\264\346\225\260\344\271\230\346\263\225.md" "b/problems/kamacoder/0159.\345\244\247\346\225\264\346\225\260\344\271\230\346\263\225.md" new file mode 100644 index 0000000000..642cb74694 --- /dev/null +++ "b/problems/kamacoder/0159.\345\244\247\346\225\264\346\225\260\344\271\230\346\263\225.md" @@ -0,0 +1,62 @@ + +# 大整数乘法 + +题目链接:https://kamacoder.com/problempage.php?pid=1237 + +思路: + +我们可以使用模拟手算乘法的方法,即「逐位相乘累加」,对于每一位的乘法结果,我们将其加到相应的结果位置上。最终将累加的结果输出。 + +具体步骤: + +* 初始化结果数组:结果数组的长度应该是两个数字长度之和,因为最大长度的结果不会超过这个长度。 +* 逐位相乘:从右往左遍历两个字符串的每一位,逐位相乘,并加到结果数组的相应位置。 +* 处理进位:在每一步累加之后处理进位,保证每个位置的值小于10。 + +将结果数组转化为字符串:从结果数组的最高位开始,忽略前导零,然后将数组转化为字符串。 + +```CPP +#include +#include +#include + +using namespace std; + +string multiply(string num1, string num2) { + int len1 = num1.size(); + int len2 = num2.size(); + vector result(len1 + len2, 0); + + // 逐位相乘 + for (int i = len1 - 1; i >= 0; i--) { + for (int j = len2 - 1; j >= 0; j--) { + int mul = (num1[i] - '0') * (num2[j] - '0'); + int sum = mul + result[i + j + 1]; + + result[i + j + 1] = sum % 10; + result[i + j] += sum / 10; + } + } + + // 将结果转换为字符串,跳过前导零 + string product; + for (int num : result) { + if (!(product.empty() && num == 0)) { // 跳过前导零 + product.push_back(num + '0'); + } + } + + return product.empty() ? "0" : product; +} + +int main() { + string num1, num2; + cin >> num1 >> num2; + + string result = multiply(num1, num2); + cout << result << endl; + + return 0; +} + +``` diff --git "a/problems/kamacoder/0160.\344\272\214\347\273\264\345\271\263\351\235\242\344\270\212\347\232\204\346\212\230\347\272\277\346\256\265.md" "b/problems/kamacoder/0160.\344\272\214\347\273\264\345\271\263\351\235\242\344\270\212\347\232\204\346\212\230\347\272\277\346\256\265.md" new file mode 100644 index 0000000000..35c3ea3283 --- /dev/null +++ "b/problems/kamacoder/0160.\344\272\214\347\273\264\345\271\263\351\235\242\344\270\212\347\232\204\346\212\230\347\272\277\346\256\265.md" @@ -0,0 +1,88 @@ + +# 二维平面上的折线段 + +题目链接:https://kamacoder.com/problempage.php?pid=1238 + +这个问题要求我们在一条折线段上,根据移动的固定距离 s 进行标记点的计算。 + +为了实现这一点,我们需要对折线段进行分段处理,并根据每段的长度来确定标记点的位置。 + +解题思路: + +1. 输入与初步处理: + * 首先,读取所有点的坐标。 + * 计算每一段折线的长度,并逐段累积总长度。 +2. 确定标记点: + * 从起点开始,每次沿着折线段前进 s 的距离,直到到达终点。 + * 对于每个标记点,根据当前段的起点和终点,计算出该点的精确坐标。 +3. 输出所有标记点的坐标,格式为 x, y。 + +```CPP + +#include +#include +#include +#include + +using namespace std; + +// 定义一个点的结构体 +struct Point { + double x, y; +}; + +// 计算两点之间的距离 +double distance(const Point& a, const Point& b) { + return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y)); +} + +int main() { + int n; + cin >> n; + + vector points(n); + for (int i = 0; i < n; i++) { + cin >> points[i].x >> points[i].y; + } + + double s; + cin >> s; + + double total_length = 0.0; + vector segment_lengths(n - 1); + + // 计算每段长度和总长度 + for (int i = 0; i < n - 1; i++) { + segment_lengths[i] = distance(points[i], points[i + 1]); + total_length += segment_lengths[i]; + } + + // 从起点开始标记 + Point current_point = points[0]; + double accumulated_distance = 0.0; + + cout << fixed << setprecision(5); + cout << current_point.x << ", " << current_point.y << endl; + + while (accumulated_distance + s <= total_length) { + accumulated_distance += s; + double remaining_distance = accumulated_distance; + + for (int i = 0; i < n - 1; i++) { + if (remaining_distance <= segment_lengths[i]) { + double ratio = remaining_distance / segment_lengths[i]; + double new_x = points[i].x + ratio * (points[i + 1].x - points[i].x); + double new_y = points[i].y + ratio * (points[i + 1].y - points[i].y); + current_point = {new_x, new_y}; + cout << current_point.x << ", " << current_point.y << endl; + break; + } else { + remaining_distance -= segment_lengths[i]; + } + } + } + + return 0; +} + +``` diff --git "a/problems/kamacoder/0161.\350\256\250\345\216\214\351\254\274\347\232\204\347\273\204\345\220\210\345\270\226\345\255\220.md" "b/problems/kamacoder/0161.\350\256\250\345\216\214\351\254\274\347\232\204\347\273\204\345\220\210\345\270\226\345\255\220.md" new file mode 100644 index 0000000000..84471f8cd6 --- /dev/null +++ "b/problems/kamacoder/0161.\350\256\250\345\216\214\351\254\274\347\232\204\347\273\204\345\220\210\345\270\226\345\255\220.md" @@ -0,0 +1,61 @@ + +# 讨厌鬼的组合帖子 + +[题目链接](https://kamacoder.com/problempage.php?pid=1239) + +这个问题本质上是要找到两个数组的子集,使得这两个子集之间的差的绝对值最大。 + +问题可以简化为寻找两个数列之间最大可能的差的绝对值。 + +贪心思路如下: + +计算差异,首先,我们可以计算每个帖子的点赞数和点踩数的差值 d[i] = a[i] - b[i]。这样问题就转化为选择这些差值的一个子集,使得子集中所有元素的和的绝对值最大。 + +遍历可能性,要使得一个数的绝对值尽可能大,可以尝试最大化这个数,或者最小化这个数(使其尽可能小于零)。我们可以分别尝试将所有正的差值加在一起,以及将所有负的差值加在一起。 + +计算最大吸引度: + +* 将所有正的差值求和得到一个总和。 +* 将所有负的差值求和得到另一个总和。 +* 最后,吸引度即为这两个总和的绝对值中的较大者。 + + +```CPP + +#include +#include +#include + +using namespace std; + +int main() { + int n; + cin >> n; + + vector a(n), b(n); + for (int i = 0; i < n; ++i) { + cin >> a[i]; + } + for (int i = 0; i < n; ++i) { + cin >> b[i]; + } + + long long positive_sum = 0; + long long negative_sum = 0; + + for (int i = 0; i < n; ++i) { + int difference = a[i] - b[i]; + if (difference > 0) { + positive_sum += difference; + } else if (difference < 0) { + negative_sum += difference; + } + } + + // 最大吸引度是正总和或负总和的绝对值中的较大者 + cout << max(abs(positive_sum), abs(negative_sum)) << endl; + + return 0; +} +``` + diff --git "a/problems/kamacoder/0162.\345\260\217\347\272\242\347\232\204\347\254\25416\347\211\210\346\226\271\346\241\210.md" "b/problems/kamacoder/0162.\345\260\217\347\272\242\347\232\204\347\254\25416\347\211\210\346\226\271\346\241\210.md" new file mode 100644 index 0000000000..6b82b74b6f --- /dev/null +++ "b/problems/kamacoder/0162.\345\260\217\347\272\242\347\232\204\347\254\25416\347\211\210\346\226\271\346\241\210.md" @@ -0,0 +1,154 @@ + +# 小红的第16版方案 + +[题目链接](https://kamacoder.com/problempage.php?pid=1240) + +暴力解法: (数据量已经出最大了,C++能过,java、python、go都过不了) + +```CPP +#include +using namespace std; +int main() { + int n, m; + int l, r; + cin >> n >> m; + vector a(n + 1); + vector angry(n + 1); + for (int i = 1; i <= n; i++) cin >> a[i]; + for (int i = 1; i <= m; i++) { + cin >> l >> r; + for (int j = l; j <= r; j++) { + angry[j]++; + if (angry[j] > a[j]) { + cout << i - 1 << endl; + return 0; + } + } + } + cout << m << endl; + return 0; +} +``` + +使用 差分数组,代码如下: + + +```CPP +#include +#include +using namespace std; + +int main() { + int n, m; + cin >> n >> m; + + vector a(n + 1); + for (int i = 1; i <= n; ++i) { + cin >> a[i]; + } + + vector diff(n + 1, 0); // 差分数组,多一个元素用于处理边界情况 + + int l, r; + for (int i = 1; i <= m; ++i) { + cin >> l >> r; + diff[l]++; + if (r + 1 <= n) diff[r + 1]--; + } + + int current_anger = 0; // 当前的愤怒值 + for (int i = 1; i <= n; ++i) { + current_anger += diff[i]; // 计算差分数组的前缀和,得到最终的愤怒值 + if (current_anger > a[i]) { + cout << i - 1 << endl; // 如果当前的愤怒值超过阈值,输出最后一个没有问题的方案编号 + return 0; + } + } + + cout << m << endl; // 如果所有修改完成后都没有超过阈值,返回最后一个方案的编号 + return 0; +} +``` + +过不了,因为差分数组只能知道是哪个人超过了阈值,不能知道是第几次修改超过的 + +最后 优化思路: + +* 差分数组(Difference Array):依然使用差分数组来处理区间更新。 +* 二分查找:通过二分查找来确定最早发生愤怒值超出阈值的操作,而不是逐次模拟每一次修改。 + +步骤: + +* 创建一个差分数组 diff 用于处理区间增加操作。 +* 在 [1, m] 的范围内进行二分查找,确定导致某个人愤怒值超过阈值的最早的修改次数。 +* 对每个二分查找的中间值 mid,我们累积应用前 mid 次操作,然后检查是否有任何人的愤怒值超过了阈值。 +* 如果 mid 之前没有超标,则继续向右查找;否则向左缩小范围。 +* 在二分查找完成后,输出找到的第一个导致愤怒值超标的操作次数。 + +```CPP +#include +#include +#include + +using namespace std; + +bool isValid(const vector& a, const vector& diff, int n, int m) { + vector anger(n + 1, 0); + int current_anger = 0; + for (int i = 1; i <= n; ++i) { + current_anger += diff[i]; + if (current_anger > a[i]) { + return false; // 超出愤怒阈值 + } + } + return true; // 没有任何人超出愤怒阈值 +} + +int main() { + int n, m; + cin >> n >> m; + + vector a(n + 1); // 愤怒阈值数组 + for (int i = 1; i <= n; ++i) { + cin >> a[i]; + } + + vector> operations(m + 1); // 保存每次操作的区间 + for (int i = 1; i <= m; ++i) { + int l, r; + cin >> l >> r; + operations[i] = {l, r}; + } + + int left = 1, right = m, result = m; + + while (left <= right) { + int mid = left + (right - left) / 2; + + // 构建差分数组,只考虑前 mid 次操作 + vector diff(n + 2, 0); + for (int i = 1; i <= mid; ++i) { + int l = operations[i].first; + int r = operations[i].second; + diff[l]++; + if (r + 1 <= n) { + diff[r + 1]--; + } + } + + if (isValid(a, diff, n, mid)) { + left = mid + 1; // 如果在mid次操作后没有超标,继续向右搜索 + } else { + result = mid - 1; // 如果在mid次操作后超标,向左搜索 + right = mid - 1; + } + } + + cout << result << endl; + return 0; +} + +``` + +* 时间复杂度:O(n + m * log m),其中 n 是成员数量,m 是操作次数。二分查找的时间复杂度为 O(log m),每次二分查找中通过差分数组检查愤怒值的复杂度为 O(n)。 +* 空间复杂度:O(n + m),主要用于存储差分数组和操作数组。 diff --git "a/problems/kamacoder/\347\254\254\344\270\200\351\242\230.md" "b/problems/kamacoder/\347\254\254\344\270\200\351\242\230.md" new file mode 100644 index 0000000000..989296845d --- /dev/null +++ "b/problems/kamacoder/\347\254\254\344\270\200\351\242\230.md" @@ -0,0 +1,85 @@ + + +## 解题思路 + +1、初始分析 + +- 给定一个排列 `p`,我们首先构建一个 `pos` 数组,使得 `pos[i]` 表示 `i` 在排列 `p` 中的位置。 +- 我们需要判断数组 `a` 是否是一个优秀数组,即 `pos[a[i]] < pos[a[i+1]] <= pos[a[i]] + d` 对于所有 `i` 都成立。 +- 我们的目标是通过最少的相邻元素交换,使得数组 `a` 不再是一个优秀数组。 + +2、思路 + +- 要使数组 `a` 不再是优秀数组,我们只需要打破条件 `pos[a[i]] < pos[a[i+1]] <= pos[a[i]] + d` 中的某一个。 +- 一种简单的做法是让 `pos[a[i]]` 和 `pos[a[i+1]]` 之间的距离超过 `d`,或者直接让 `pos[a[i]] >= pos[a[i+1]]`。 + +3、具体方法 + +- 只需要考虑 `a` 中相邻元素的顺序,并判断如何交换 `p` 中相邻元素使得其顺序被打破。 +- 假设我们需要在 `p` 中交换某些元素来实现上述目标,那么最小的交换次数是将 `a[i]` 和 `a[i+1]` 的位置交换。 +- 如果 `pos[a[i]] + 1 == pos[a[i+1]]`,则需要一步交换。 + +4、特别情况 + +- 还需要考虑,如果通过交换相邻元素无法解决问题的情况。比如 `pos[a[i+1]]` 的位置无法移到 `pos[a[i]]` 的前面或超过 `d`。 + +C++代码如下: + + +```cpp +#include +#include +#include +#include + +using namespace std; + +int main() { + int n, m, d; + cin >> n >> m >> d; + + vector p(n + 1); + vector pos(n + 1); + + // 读取排列 p,并构建位置数组 pos + for (int i = 1; i <= n; i++) { + cin >> p[i]; + pos[p[i]] = i; + } + + vector a(m); + for (int i = 0; i < m; i++) { + cin >> a[i]; + } + + int min_operations = INT_MAX; + + // 遍历数组 a 的相邻元素 + for (int i = 0; i < m - 1; i++) { + int current_pos = pos[a[i]]; + int next_pos = pos[a[i + 1]]; + + // 检查 pos[a[i]] < pos[a[i+1]] <= pos[a[i]] + d 是否成立 + if (current_pos < next_pos && next_pos <= current_pos + d) { + // 计算需要的最少操作次数 + int distance = next_pos - current_pos; + + // Case 1: 交换 current_pos 和 next_pos + min_operations = min(min_operations, distance); + + // Case 2: 如果 next_pos + d <= n,考虑使 pos[a[i+1]] 超过 pos[a[i]] + d + if (current_pos + d + 1 <= n) { + min_operations = min(min_operations, d + 1 - distance); + } + } else { + min_operations = 0; + } + } + + cout << min_operations << endl; + return 0; +} + +``` + +时间复杂度为 O(m) diff --git "a/problems/kamacoder/\347\254\254\344\270\211\351\242\230.md" "b/problems/kamacoder/\347\254\254\344\270\211\351\242\230.md" new file mode 100644 index 0000000000..976e617a5c --- /dev/null +++ "b/problems/kamacoder/\347\254\254\344\270\211\351\242\230.md" @@ -0,0 +1,76 @@ + + +贪心思路 + +为了保证字典序最大,我们优先放置字母 `b`,然后再放置字母 `a`。在放置字符时,我们还需注意不能超过连续 `k` 次相同字符: + +- 如果当前已经连续放置了 `k` 次相同字符,必须切换到另一个字符。 +- 每次放置字符后,相应的字符数量减少,同时更新当前字符的连续计数。 + +实现步骤: + +- **初始化**:根据输入的 `x`, `y`, `k` 值,检查是否有可能构造出满足条件的字符串。初始化结果字符串的大小,并设置初始计数器。 +- **循环放置字符**: + - 优先放置字符 `b`,如果 `b` 的数量已经足够,或者已经放置了 `k` 次字符 `b`,则放置字符 `a`。 + - 如果已经放置了 `k` 次相同字符,则强制切换到另一个字符。 + +C++代码如下: + +```CPP +#include +#include +using namespace std; + +int main() { + int countA, countB, maxRepeat; + cin >> countA >> countB >> maxRepeat; + + // 检查是否有可能生成满足条件的字符串 + if (countA > (countB + 1) * maxRepeat || countB > (countA + 1) * maxRepeat) { + cout << -1 << endl; + return 0; + } + + string result(countA + countB, ' '); // 预先分配字符串大小 + int currentA = 0, currentB = 0; // 当前连续 'a' 和 'b' 的计数 + int pos = 0; // 当前填充位置 + + while (countA > 0 || countB > 0) { + // 当可以继续添加 'a' 或 'b' 且没有超过最大连续限制时 + if (currentA < maxRepeat && currentB < maxRepeat) { + if (countA <= countB * maxRepeat) { + result[pos++] = 'b'; + countB--; + currentB++; + currentA = 0; + } else { + result[pos++] = 'a'; + countA--; + currentA++; + currentB = 0; + } + } + + // 当当前字符达到最大连续限制时,切换到另一个字符 + if (currentA == maxRepeat || currentB == maxRepeat) { + if (result[pos - 1] == 'a') { + result[pos++] = 'b'; + countB--; + currentB = 1; + currentA = 0; + } else { + result[pos++] = 'a'; + countA--; + currentA = 1; + currentB = 0; + } + } + } + + cout << result << endl; + return 0; +} + +``` + +时间复杂度:O(n) diff --git "a/problems/kamacoder/\347\254\254\344\272\214\351\242\230.md" "b/problems/kamacoder/\347\254\254\344\272\214\351\242\230.md" new file mode 100644 index 0000000000..addbcf4418 --- /dev/null +++ "b/problems/kamacoder/\347\254\254\344\272\214\351\242\230.md" @@ -0,0 +1,78 @@ + +## 解题思路 + +贪心思路 + +- **计算相邻元素差值**: + - 对于数组 `a`,计算每对相邻元素的差值 `diff[i] = a[i+1] - a[i]`。 + - 如果 `diff[i]` 为负数,意味着 `a[i+1]` 比 `a[i]` 小或相等,需要通过操作使 `a[i+1]` 变大。 + +- **确定最小操作次数**: + - 计算所有相邻元素中的最小差值 `minDifference`,即 `minDifference = min(diff[i])`。 + - 如果 `minDifference` 为负数或零,则需要进行 `-minDifference + 1` 次操作,使得 `a[i+1]` 大于 `a[i]`,从而使数组严格递增。 + +- **实现细节**: + - 遍历数组的每对相邻元素,找出最小的差值。 + - 根据最小差值,计算出最少的操作次数。 + + + +```CPP +#include +#include +#include + +using namespace std; + +int main() +{ + int n; + cin >> n; + + vector arr(n); // 用于存储输入数组 + vector differences; // 用于存储相邻元素的差值 + + for(int i = 0; i < n; i++) { + cin >> arr[i]; + if(i > 0) differences.push_back(arr[i] - arr[i - 1]); + + } + + int minDifference = INT_MAX; + + // 寻找最小的差值 + for(int diff : differences) { + if(diff < minDifference) { + minDifference = diff; + } + } + + // 如果最小差值是负数或零,计算所需的操作次数 + int minOperations = max(0, -minDifference + 1); + + cout << minOperations << endl; + + return 0; +} + +``` +关于 `-minDifference + 1` 为什么要 + 1 解释: + +对于数组 `a` 中相邻的两个元素 `a[i]` 和 `a[i+1]`,我们计算它们的差值 `diff = a[i+1] - a[i]`。 + +- **目标**:要使 `a[i] < a[i+1]`,需要 `diff > 0`。 +- 如果 `diff < 0`,说明 `a[i+1]` 比 `a[i]` 小,这时候 `a` 不是严格递增的。 +- 如果 `diff = 0`,说明 `a[i+1]` 和 `a[i]` 相等,这时也不满足严格递增。 + +解释 `-minDifference + 1` + +1. **当 `minDifference < 0` 时**: + - 假设 `minDifference` 是所有相邻差值中的最小值,并且它是一个负数。 + - 例如,`minDifference = -3`,表示 `a[i+1] - a[i] = -3`,也就是 `a[i+1]` 比 `a[i]` 小 `3`。 + - 要让 `a[i+1] > a[i]`,我们至少需要使 `a[i+1] - a[i]` 从 `-3` 增加到 `1`。因此需要增加 `4`,即 `(-(-3)) + 1 = 3 + 1 = 4` 次操作。 + +2. **当 `minDifference = 0` 时**: + - `minDifference` 等于 `0`,表示 `a[i+1] - a[i] = 0`,即 `a[i+1]` 和 `a[i]` 相等。 + - 为了使 `a[i+1] > a[i]`,我们至少需要进行一次操作,使得 `a[i+1]` 大于 `a[i]`。 + + diff --git a/problems/qita/tulunfabu.md b/problems/qita/tulunfabu.md new file mode 100644 index 0000000000..28ee463850 --- /dev/null +++ b/problems/qita/tulunfabu.md @@ -0,0 +1,239 @@ + + +# 图论正式发布! + +录友们! 今天和大家正式宣布:大家期盼已久的「代码随想录图论」正式发布了。 + +**一年多来,日日夜夜,伏案编码、思考、写作,就为了今天给录友们一个交代**! + +我知道录友们在等图论等太久了,其实我比大家都着急。 + +![大家一直都在催](https://code-thinking-1253855093.file.myqcloud.com/pics/20240613105618.png) + +图论完整版目前已经开放在代码随想录网站:programmercarl.com + +**「代码随想录图论」共分为 五大模块**,共有三十一篇长文讲解: + +* 深搜与广搜 +* 并查集 +* 最小生成树 +* 拓扑排序 +* 最短路算法 + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240613104436.png) + +**耗时一年之久,代码随想录图论 终于面世了**! + +一年前 23年的3月份 我刚刚更新完了 [代码随想录算法公开课](https://mp.weixin.qq.com/s/xsKjrnB4GyWApm4BYxshvg) ,这是我亲自录制的 140期 算法视频讲解,目前口碑极佳。 + +录完公开课之后,我就开始筹划更新图论内容了,无奈图论内容真的很庞大。 + +关于图论章节,**可以说 是代码随想录所有章节里画图数量最多,工程量最大的一个章节**,整个图论 画图就400百多幅。 + +随便截一些图,大家感受一下: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240613104703.png) + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240613104824.png) + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240613104852.png) + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240613104926.png) + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240613105007.png) + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240613105030.png) + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240613105106.png) + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240613105143.png) + +具体内容,大家可以去代码随想录网站(programmercarl.com)去看看,非常精彩! + +期间有很多录友再催:**卡哥怎么不更新图论呢? 卡哥是不是不打算更新图论了**? 等等 + +每次我都要去解释一波。 + +如果我想 快速出图论章节,可以很快! + +**但我不想做 降低 代码随想录整体质量和口碑的事情**。 + +所以关于现在发布的「代码随想录图论」,我可以很自信的说,**这是市面上大家能看到的,最全、最细致图论算法教程**。 + +**我在写作的时候没有避开任何雷区,完全遇雷排雷,然后让大家舒舒服服的走过去**。 + +什么是雷区? + +很多知识点 ,大家去看资料的时候会发现是 没有讲解的或者一笔带过, 因为这种雷区知识点 很难讲清楚或者需要花费大量的时间去讲明白。 + +一些知识点是这样的:**自己一旦懂了就知道是那么回事,但要写出来,要给别人讲清楚,是很难的一件事**。 + +这些知识点同样是雷区,就是大家在看 教程或者算法讲解的时候,作者避而不谈的部分。 + +例如: 深搜为什么有两种写法,同样的广搜为什么有一种写法超时了,bellman_ford 为什么 要松弛 n - 1次,负权回路对最短路求解的影响 等等。 + +这一点大家在阅读代码随想录图论的时候,**可以感受到 我对细节讲解的把控程度**。 + +## 为什么要出图论 + +图论是很重要的章节,也是 大家求职笔试面试,无论是社招还是校招,都会考察的知识内容。 + +而且图论应用广泛,在大家做项目开发的时候,或多或少都会用到图论相关知识。 + +例如:通信网络(拓扑排序、最短路算法),社交网络(深搜、广搜),路径优化(最短路算法),任务调度(拓扑排序),生物信息学(基因为节点,基因关系为边),游戏开发(A * 算法等)等等 + +为了保质保量更新图论,**市面上所有的算法书籍,我都看过**! + +**反复确认 思路正确性的同时,不仅感叹 市面上的算法书籍 在图论方面的 “缺斤少两**” 。 + +大名鼎鼎的《算法4》 以图论内容详细且图解多 而被大家好评, + +以最短路算法为例,《算法4》,只讲解了 Dijkstra(堆优化)、SPFA (Bellman-Ford算法基于队列) 和 拓扑排序, + +而 dijkstra朴素版、Bellman_ford 朴素版、bellman_ford之单源有限最短路、Floyd 、A * 算法 以及各个最短路算法的优劣,并没有讲解。 + +其他算法书籍 更是对图论的很多知识点一笔带过。 + +而在 代码随想录图论章节,**仅仅是 最短路算法方面,我就详细讲解了如下内容**: + +* dijkstra朴素版 +* dijkstra堆优化版 +* Bellman_ford +* Bellman_ford 队列优化算法(又名SPFA) +* bellman_ford 算法判断负权回路 +* bellman_ford之单源有限最短路 +* Floyd 算法精讲 +* 启发式搜索:A * 算法 + +**常见最短路算法,我都没有落下**。 + +而且大家在看很多算法书籍是没有编程题目配合练习,这样学习效果大打折扣, 一些书籍有编程题目配合练习但知识点严重不全。 + +## 出题 + +我在讲解图论的时候,最头疼的就是找题,在力扣上 找题总是找不到符合思路且来完整表达算法精髓的题目。 + +特别是最短路算法相关的题目,例如 Bellman_ford系列 ,Floyd ,A * 等等总是找不到符合思路的题目。 + +所以我索性就自己出题吧,**这也是 卡码网(kamacoder.com)诞生的一个原因之一**。 + +**为了给大家带来极致的学习体验,我在很多细节上都下了功**夫。 + +卡码网专门给大家准备的ACM输入输出模式,**图论是在笔试还有面试中,通常都是以ACM模式来考察大家**,而大家习惯在力扣刷题(核心代码模式),核心代码模式对图的存储和输出都隐藏了。 + +**图论题目的输出输出相对其他章节的题目来说是最难处理的**。 + +### 输入的细节 + +图论的输入难在 图的存储结构,**如果没有练习过 邻接表和邻接矩阵 ,很多录友是写不出来的**。 + +而力扣上是直接给好现成的 数据结构,可以直接用,所以练习不到图的输入,也练习不到邻接表和邻接矩阵。 + +ACM输入输出模式是最考察候选人对代码细节把控程度。 + +如果熟练ACM模式,那么核心代码模式基本没问题,但反过来就不一定了。 + +### 输出的细节 + +同样,图论的输出也有细节,例如 求节点1 到节点5的所有路径, 输出可能是: + +``` +1 2 4 5 +1 3 5 +``` + +表示有两条路可以到节点5, 那储存这个结果需要二维数组,最后在一起输出,力扣是直接return数组就好了,但 ACM模式要求我们自己输出,这里有就细节了。 + +就拿 只输出一行数据,输出 `1 2 4 5` 来说, + +很多录友代码可能直接就这么写了: + +```CPP +for (int i = 0 ; i < result.size(); i++) { + cout << result[i] << " "; +} +``` + +这么写输出的结果是 `1 2 4 5 `, 发现结果是对的,一提交,发现OJ返回 格式错误 或者 结果错误。 + +如果没练习过这种输出方式的录友,就开始怀疑了,这结果一样一样的,怎么就不对,我在力扣上提交都是对的! + +**大家要注意,5 后面要不要有空格**! + +上面这段代码输出,5后面是加上了空格了,如果判题机判断 结果的长度,标准答案`1 2 4 5`长度是7,而上面代码输出的长度是 8,很明显就是不对的。 + +所以正确的写法应该是: + +```CPP +for (int i = 0 ; i < result.size() - 1; i++) { + cout << result[i] << " "; +} +cout << result[result.size() - 1]; +``` + +这么写,最后一个元素后面就没有空格了。 + +这是很多录友经常疏忽的,也是大家刷习惯了 力扣(核心代码模式)根本不会注意到的细节。 + +**同样在工程开发中,这些细节都是影响系统稳定运行的因素之一**。 + +**ACM模式 除了考验算法思路,也考验 大家对 代码的把控力度**, 而 核心代码模式 只注重算法的解题思路,所以输入输出这些就省略掉了。 + +## 情怀 + +大家可以发现,**现在 用心给大家更新硬核且免费资料的博主 已经不多了**。 + +这一年的空闲时间,如果我用来打磨付费课程或者付费项目,或者干脆把图论做成付费专栏 加上现在的影响力,一定可以 “狠狠赚一笔”。 + +对我来说,有些钱可以赚,有些钱不赚。 + +如果持续关注代码随想录的录友可以发现:代码随想录不仅仅优质题解和视频免费,还有 [ACM模版配套25题](https://mp.weixin.qq.com/s/ai_Br_jSayeV2ELIYvnMYQ)、 [设计模式精讲配套23题](https://mp.weixin.qq.com/s/Wmu8jW4ezCi4CQ0uT9v9iA)、[每周举办大厂笔试真题(制作真题是十分费时的)](https://mp.weixin.qq.com/s/ULTehoK4GbdbQIdauKYt1Q), 这些都是免费优质资源。 + +**在付费与免费之间,我一直都在努力寻找平衡**。 + +很多录友之所以付费加入 [知识星球](https://mp.weixin.qq.com/s/65Vrq6avJkuTqofnz361Rw) 或者 [算法训练营](https://mp.weixin.qq.com/s/vkbcihvdNvBu1W4-bExoXA) ,也是因为看了这些免费资源想支持我一下。 + +“不忘初心”,说出来很容易,**但真正能随着岁月的流淌 坚持初心,是非常非常难的事情**。 + +**诱惑太多!有惰性的诱惑,有利益的诱惑**。 + +正如我之前说的:“代码随想录” 这五个字,我是会用一生去经营。 + +**免费硬核的算法内容是 代码随想录的立身之本**,也是 大家为什么学算法学编程首选代码随想录的根本所在。 + +当大家通过 代码随想录 提升了编程与算法能力,考上研或者找到好工作的时候,于我来说已经是很幸福的事情: + +![对笔试帮助大](https://code-thinking-1253855093.file.myqcloud.com/pics/20230914172536.png) + +![华为od将近满分](https://code-thinking-1253855093.file.myqcloud.com/pics/20230914172607.png) + +![研究生复试](https://code-thinking-1253855093.file.myqcloud.com/pics/20240621103130.png) + +![红包感谢代码随想录366](https://code-thinking-1253855093.file.myqcloud.com/pics/20231123151310.png) + +![上岸亚马逊](https://code-thinking-1253855093.file.myqcloud.com/pics/20240206174151.png) + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20220718094112.png) + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20220718094332.png) + +至此**图论内容 已完全免费开放在代码随想录网站(programmercarl.com),造福广大学习编程的录友们**! + +Github 也已经同步 :https://github.com/youngyangyang04/leetcode-master ,关于其他语言版本,欢迎录友们去仓库提交PR + +## 后序 + +关于图论PDF版本,我后面会整理出来,免费发放给大家。 + +关于图论视频版本,不出意外,应该在年底开始在B站更新,同样免费开放。 + +总之,代码随想录会持续更新下去,无论是文字版还是视频版。 + +希望大家 不用 非要到找工作的时候 或者要考研的时候 才想到代码随想录。 + +**代码是作品,算法更是艺术**,时不时来欣赏一段解决关键问题的优雅代码,也是一种享受。 + +最后,**愿录友们学有所成,归来仍看代码随想录**! + + + diff --git "a/problems/\345\212\250\346\200\201\350\247\204\345\210\222\346\200\273\347\273\223\347\257\207.md" "b/problems/\345\212\250\346\200\201\350\247\204\345\210\222\346\200\273\347\273\223\347\257\207.md" index 3dda376855..dd1646d6d8 100644 --- "a/problems/\345\212\250\346\200\201\350\247\204\345\210\222\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/\345\212\250\346\200\201\350\247\204\345\210\222\346\200\273\347\273\223\347\257\207.md" @@ -11,7 +11,7 @@ 关于动态规划,在专题第一篇[关于动态规划,你该了解这些!](https://programmercarl.com/动态规划理论基础.html)就说了动规五部曲,**而且强调了五部对解动规题目至关重要!** -这是Carl做过一百多道动规题目总结出来的经验结晶啊,如果大家跟着「代码随想哦」刷过动规专题,一定会对这动规五部曲的作用感受极其深刻。 +这是Carl做过一百多道动规题目总结出来的经验结晶啊,如果大家跟着「代码随想录」刷过动规专题,一定会对这动规五部曲的作用感受极其深刻。 动规五部曲分别为: diff --git "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" index 2e1cd52c23..e744383810 100644 --- "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" +++ "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" @@ -29,7 +29,7 @@ 而完全背包又是也是01背包稍作变化而来,即:完全背包的物品数量是无限的。 -**所以背包问题的理论基础重中之重是01背包,一定要理解透!** +**所以背包问题的理论基础重中之重是01背包,一定要理解透**! leetcode上没有纯01背包的问题,都是01背包应用方面的题目,也就是需要转化为01背包问题。 @@ -67,6 +67,7 @@ leetcode上没有纯01背包的问题,都是01背包应用方面的题目, 以下讲解和图示中出现的数字都是以这个例子为例。 +(为了方便表述,下面描述 统一用 容量为XX的背包,放下容量(重量)为XX的物品,物品的价值是XX) ### 二维dp数组01背包 @@ -76,7 +77,7 @@ leetcode上没有纯01背包的问题,都是01背包应用方面的题目, 我们需要使用二维数组,为什么呢? -因为有两个维度需要表示,分别是:物品 和 背包容量 +因为有两个维度需要分别表示:物品 和 背包容量 如图,二维数组为 dp[i][j]。 @@ -110,13 +111,13 @@ i 来表示物品、j表示背包容量。 背包容量为 0,放不下物品0 或者物品1,此时背包里的价值为0。 -背包容量为 1,只能放下物品1,背包里的价值为15。 +背包容量为 1,只能放下物品0,背包里的价值为15。 -背包容量为 2,只能放下物品1,背包里的价值为15。 +背包容量为 2,只能放下物品0,背包里的价值为15。 -背包容量为 3,上一行同一状态,背包只能放物品0,这次也可以选择物品1了,背包可以放物品2 或者 物品1,物品2价值更大,背包里的价值为20。 +背包容量为 3,上一行同一状态,背包只能放物品0,这次也可以选择物品1了,背包可以放物品1 或者 物品0,物品1价值更大,背包里的价值为20。 -背包容量为 4,上一行同一状态,背包只能放物品0,这次也可以选择物品1了,背包都可都放下,背包价值为35。 +背包容量为 4,上一行同一状态,背包只能放物品0,这次也可以选择物品1了,背包可以放下物品0 和 物品1,背包价值为35。 以上举例,是比较容易看懂,我主要是通过这个例子,来帮助大家明确dp数组的含义。 @@ -144,7 +145,10 @@ i 来表示物品、j表示背包容量。 这里我们dp[1][4]的状态来举例: -绝对 dp[1][4],就是放物品1 ,还是不放物品1。 +求取 dp[1][4] 有两种情况: + +1. 放物品1 +2. 还是不放物品1 如果不放物品1, 那么背包的价值应该是 dp[0][4] 即 容量为4的背包,只放物品0的情况。 @@ -152,24 +156,23 @@ i 来表示物品、j表示背包容量。 ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240730174246.png) - -如果放物品1, **那么背包要先留出物品1的容量**,目前容量是4,物品1 需要重量为3,此时背包剩下容量为1。 +如果放物品1, **那么背包要先留出物品1的容量**,目前容量是4,物品1 的容量(就是物品1的重量)为3,此时背包剩下容量为1。 容量为1,只考虑放物品0 的最大价值是 dp[0][1],这个值我们之前就计算过。 -所以 放物品1 的情况 = dp[0][1] + 物品1 的重量,推导方向如图: +所以 放物品1 的情况 = dp[0][1] + 物品1 的价值,推导方向如图: ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240730174436.png) 两种情况,分别是放物品1 和 不放物品1,我们要取最大值(毕竟求的是最大价值) -`dp[1][4] = max(dp[0][4], dp[0][1] + 物品1 的重量) ` +`dp[1][4] = max(dp[0][4], dp[0][1] + 物品1 的价值) ` 以上过程,抽象化如下: -* **不放物品i**:由dp[i - 1][j]推出,即背包容量为j,里面不放物品i的最大价值,此时dp[i][j]就是dp[i - 1][j]。 +* **不放物品i**:背包容量为j,里面不放物品i的最大价值是dp[i - 1][j]。 -* **放物品i**:由dp[i - 1][j - weight[i]]推出,dp[i - 1][j - weight[i]] 为背包容量为j - weight[i]的时候不放物品i的最大价值,那么dp[i - 1][j - weight[i]] + value[i] (物品i的价值),就是背包放物品i得到的最大价值 +* **放物品i**:背包空出物品i的容量后,背包容量为j - weight[i],dp[i - 1][j - weight[i]] 为背包容量为j - weight[i]且不放物品i的最大价值,那么dp[i - 1][j - weight[i]] + value[i] (物品i的价值),就是背包放物品i得到的最大价值 递归公式: `dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);` @@ -235,7 +238,6 @@ for (int j = weight[0]; j <= bagweight; j++) { 4. 确定遍历顺序 - 在如下图中,可以看出,有两个遍历的维度:物品与背包重量 ![动态规划-背包问题3](https://code-thinking-1253855093.file.myqcloud.com/pics/2021011010314055.png) @@ -364,7 +366,6 @@ int main() { - ## 其他语言版本 ### Java From 0846cd122e93e2472976164484d971990bd68ffa Mon Sep 17 00:00:00 2001 From: feobay Date: Fri, 30 Aug 2024 16:05:11 +0800 Subject: [PATCH 2782/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A00309.=E6=9C=80?= =?UTF-8?q?=E4=BD=B3=E4=B9=B0=E5=8D=96=E8=82=A1=E7=A5=A8=E6=97=B6=E6=9C=BA?= =?UTF-8?q?=E5=90=AB=E5=86=B7=E5=86=BB=E6=9C=9FGo=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E4=B8=80=E7=BB=B4=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...53\345\206\267\345\206\273\346\234\237.md" | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git "a/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" "b/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" index 95689a4805..4913b8bd57 100644 --- "a/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" +++ "b/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" @@ -357,6 +357,42 @@ func max(a, b int) int { } ``` +```go +// 一维优化版本 +// 时间复杂度O(n), 空间复杂度O(1) +func maxProfit(prices []int) int { + + // 0: 持有,一直持有和买入 + // 1: 不持有,一直不持有(不包含前一天卖出,因为这样的一天是冷静期,状态有区别) + // 2:不持有,今天卖出 + // 3:冷静期,前一天卖出(一直不持有) + dp0, dp1, dp2, dp3 := -prices[0], 0, 0, 0 + + n := len(prices) + + for i := 1; i < n; i++ { + t0 := max(dp0, max(dp1, dp3)-prices[i]) + t1 := max(dp1, dp3) + t2 := dp0 + prices[i] + t3 := dp2 + + // 更新 + dp0, dp1, dp2, dp3 = t0, t1, t2, t3 + } + + return max(dp1, max(dp2, dp3)) +} + +func max(a, b int) int { + if a > b { + return a + } + return b +} +``` + + + ### Javascript: > 不同的状态定义 感觉更容易理解些 @@ -540,3 +576,4 @@ impl Solution { + From f38dc8aedc147c824b5eaa3621f399a623e9b681 Mon Sep 17 00:00:00 2001 From: feobay Date: Fri, 30 Aug 2024 16:19:40 +0800 Subject: [PATCH 2783/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A00188.=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=BAIVGo=E7=89=88=E6=9C=AC=E7=A9=BA=E9=97=B4=E4=BC=98?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\344\275\263\346\227\266\346\234\272IV.md" | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git "a/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" "b/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" index def6927756..0b1622ac5a 100644 --- "a/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" +++ "b/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" @@ -404,6 +404,47 @@ func max188(a, b int) int { } ``` +版本三:空间优化版本 + +```go +func maxProfit(k int, prices []int) int { + n := len(prices) + // k次交易,2 * k种状态 + // 状态从1开始计算,避免判断 + // 奇数时持有(保持或买入) + // 偶数时不持有(保持或卖出) + dp := make([][]int, 2) + dp[0] = make([]int, k * 2 + 1) + dp[1] = make([]int, k * 2 + 1) + + // 奇数状态时持有,i += 2 + for i := 1; i <= k * 2; i += 2 { + dp[0][i] = -prices[0] + } + + for i := 1; i < len(prices); i++ { + for j := 1; j <= k * 2; j++ { + if j % 2 == 1 { + dp[i % 2][j] = max(dp[(i - 1) % 2][j], dp[(i - 1) % 2][j - 1] - prices[i]) + } else { + dp[i % 2][j] = max(dp[(i - 1) % 2][j], dp[(i - 1) % 2][j - 1] + prices[i]) + } + } + } + + return dp[(n - 1) % 2][k * 2] +} + +func max(a, b int) int { + if a > b { + return a + } + return b +} +``` + + + ### JavaScript: ```javascript @@ -558,3 +599,4 @@ impl Solution { + From 830caef1222ddda1ab606f794c44e28e1be9b209 Mon Sep 17 00:00:00 2001 From: Leehouc <152672308+Leehouc@users.noreply.github.com> Date: Fri, 30 Aug 2024 21:06:47 +0800 Subject: [PATCH 2784/3019] =?UTF-8?q?Update=200044.=E5=BC=80=E5=8F=91?= =?UTF-8?q?=E5=95=86=E8=B4=AD=E4=B9=B0=E5=9C=9F=E5=9C=B0.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...55\344\271\260\345\234\237\345\234\260.md" | 82 +++++++++++++++++++ 1 file changed, 82 insertions(+) diff --git "a/problems/kamacoder/0044.\345\274\200\345\217\221\345\225\206\350\264\255\344\271\260\345\234\237\345\234\260.md" "b/problems/kamacoder/0044.\345\274\200\345\217\221\345\225\206\350\264\255\344\271\260\345\234\237\345\234\260.md" index 37bb98ed2d..ea2c696ef6 100644 --- "a/problems/kamacoder/0044.\345\274\200\345\217\221\345\225\206\350\264\255\344\271\260\345\234\237\345\234\260.md" +++ "b/problems/kamacoder/0044.\345\274\200\345\217\221\345\225\206\350\264\255\344\271\260\345\234\237\345\234\260.md" @@ -388,3 +388,85 @@ if __name__ == "__main__": main() ``` +### C + +前缀和 +```c +#include +#include + +int main() +{ + int n = 0, m = 0, ret_ver = 0, ret_hor = 0; + + // 读取行和列的值 + scanf("%d%d", &n, &m); + // 动态分配数组a(横)和b(纵)的空间 + int *a = (int *)malloc(sizeof(int) * n); + int *b = (int *)malloc(sizeof(int) * m); + + // 初始化数组a和b + for (int i = 0; i < n; i++) + { + a[i] = 0; + } + for (int i = 0; i < m; i++) + { + b[i] = 0; + } + + // 读取区块权值并计算每行和每列的总权值 + for (int i = 0; i < n; i++) + { + for (int j = 0; j < m; j++) + { + int tmp; + scanf("%d", &tmp); + a[i] += tmp; + b[j] += tmp; + } + } + + // 计算每列以及每行的前缀和 + for (int i = 1; i < n; i++) + { + a[i] += a[i - 1]; + } + for (int i = 1; i < m; i++) + { + b[i] += b[i - 1]; + } + + // 初始化ret_ver和ret_hor为最大可能值 + ret_hor = a[n - 1]; + ret_ver = b[m - 1]; + + // 计算按行划分的最小差异 + int ret2 = 0; + while (ret2 < n) + { + ret_hor = (ret_hor > abs(a[n - 1] - 2 * a[ret2])) ? abs(a[n - 1] - 2 * a[ret2]) : ret_hor; + // 原理同列,但更高级 + ret2++; + } + // 计算按列划分的最小差异 + int ret1 = 0; + while (ret1 < m) + { + if (ret_ver > abs(b[m - 1] - 2 * b[ret1])) + { + ret_ver = abs(b[m - 1] - 2 * b[ret1]); + } + ret1++; + } + + // 输出最小差异 + printf("%d\n", (ret_ver <= ret_hor) ? ret_ver : ret_hor); + + // 释放分配的内存 + free(a); + free(b); + return 0; +} + +``` From 2c52c3c363e13803ff9b46c16e9ec37ead8fe41c Mon Sep 17 00:00:00 2001 From: Leehouc <152672308+Leehouc@users.noreply.github.com> Date: Fri, 30 Aug 2024 21:31:45 +0800 Subject: [PATCH 2785/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=2058.=20=E5=8C=BA?= =?UTF-8?q?=E9=97=B4=E5=92=8C=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 --- ...8.\345\214\272\351\227\264\345\222\214.md" | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git "a/problems/kamacoder/0058.\345\214\272\351\227\264\345\222\214.md" "b/problems/kamacoder/0058.\345\214\272\351\227\264\345\222\214.md" index f5ce08dcbf..c5a84a2967 100644 --- "a/problems/kamacoder/0058.\345\214\272\351\227\264\345\222\214.md" +++ "b/problems/kamacoder/0058.\345\214\272\351\227\264\345\222\214.md" @@ -263,3 +263,45 @@ if __name__ == "__main__": main() ``` +### C + +```C +#include +#include + +int main(int argc, char *argv[]) +{ + int num; + // 读取数组长度 + scanf("%d", &num); + + // 使用动态内存分配而不是静态数组,以适应不同的输入大小 + int *a = (int *)malloc((num + 1) * sizeof(int)); + + // 初始化前缀和数组的第一个元素为0 + a[0] = 0; + + // 读取数组元素并计算前缀和 + for (int i = 1; i <= num; i++) + { + int mm; + scanf("%d", &mm); + // 累加前缀和 + a[i] = a[i - 1] + mm; + } + + int m, n; + // 循环读取区间并计算区间和,直到输入结束 + // scanf()返回成功匹配和赋值的个数,到达文件末尾则返回 EOF + while (scanf("%d%d", &m, &n) == 2) + { + // 输出区间和,注意区间是左闭右开,因此a[n+1]是包含n的元素的前缀和 + printf("%d\n", a[n+1] - a[m]); + } + + // 释放之前分配的内存 + free(a); + return 0; +} + +``` From 8dc91092774defa6ab621b1d50de1968df6cc7ba Mon Sep 17 00:00:00 2001 From: wangq635 <643797037@qq.com> Date: Sun, 1 Sep 2024 19:49:39 +0800 Subject: [PATCH 2786/3019] =?UTF-8?q?=E4=BF=AE=E6=94=B90701.=E4=BA=8C?= =?UTF-8?q?=E5=8F=89=E6=90=9C=E7=B4=A2=E6=A0=91=E4=B8=AD=E7=9A=84=E6=8F=92?= =?UTF-8?q?=E5=85=A5=E6=93=8D=E4=BD=9C=EF=BC=8C=E5=A2=9E=E5=8A=A0python?= =?UTF-8?q?=E7=89=88=E6=9C=AC=E7=9A=84=E8=BF=AD=E4=BB=A3=E6=B3=95=EF=BC=88?= =?UTF-8?q?=E7=B2=BE=E7=AE=80=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...22\345\205\245\346\223\215\344\275\234.md" | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git "a/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" "b/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" index 6b9e58347d..c56a262443 100644 --- "a/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" +++ "b/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" @@ -370,6 +370,30 @@ class Solution: ``` + +迭代法(精简) +```python +class Solution: + def insertIntoBST(self, root: Optional[TreeNode], val: int) -> Optional[TreeNode]: + if not root: # 如果根节点为空,创建新节点作为根节点并返回 + return TreeNode(val) + cur = root + while cur: + if val < cur.val: + if not cur.left: # 如果此时父节点的左子树为空 + cur.left = TreeNode(val) # 将新节点连接到父节点的左子树 + return root + else: + cur = cur.left + elif val > cur.val: + if not cur.right: # 如果此时父节点的左子树为空 + cur.right = TreeNode(val) # 将新节点连接到父节点的右子树 + return root + else: + cur = cur.right + +``` + ----- ### Go From 75da0248bd134384cea412df2043b15bc0640631 Mon Sep 17 00:00:00 2001 From: wangq635 <643797037@qq.com> Date: Sun, 1 Sep 2024 20:22:42 +0800 Subject: [PATCH 2787/3019] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=200701.=E4=BA=8C?= =?UTF-8?q?=E5=8F=89=E6=90=9C=E7=B4=A2=E6=A0=91=E4=B8=AD=E7=9A=84=E6=8F=92?= =?UTF-8?q?=E5=85=A5=E6=93=8D=E4=BD=9C=EF=BC=8C=E9=80=92=E5=BD=92=E6=B3=95?= =?UTF-8?q?=E7=89=88=E6=9C=AC=E4=BA=8C=E5=BA=94=E8=AF=A5=E6=98=AF=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 --- ...22\345\205\245\346\223\215\344\275\234.md" | 50 +++++++++---------- 1 file changed, 23 insertions(+), 27 deletions(-) diff --git "a/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" "b/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" index c56a262443..25d39486f3 100644 --- "a/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" +++ "b/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" @@ -283,32 +283,10 @@ class Solution: return TreeNode(val) self.traversal(root, val) return root - ``` 递归法(版本二) ```python -class Solution: - def insertIntoBST(self, root, val): - if root is None: - return TreeNode(val) - parent = None - cur = root - while cur: - parent = cur - if val < cur.val: - cur = cur.left - else: - cur = cur.right - if val < parent.val: - parent.left = TreeNode(val) - else: - parent.right = TreeNode(val) - return root -``` - -递归法(版本三) -```python class Solution: def insertIntoBST(self, root: Optional[TreeNode], val: int) -> Optional[TreeNode]: if root is None or root.val == val: @@ -326,7 +304,7 @@ class Solution: return root ``` -递归法(版本四) +递归法(版本三) ```python class Solution: def insertIntoBST(self, root, val): @@ -340,10 +318,9 @@ class Solution: root.right = self.insertIntoBST(root.right, val) return root - ``` -迭代法 +迭代法(版本一) ```python class Solution: def insertIntoBST(self, root, val): @@ -366,9 +343,28 @@ class Solution: else: parent.right = node # 将新节点连接到父节点的右子树 - return root + return root +``` - +迭代法(版本二) +```python +class Solution: + def insertIntoBST(self, root, val): + if root is None: + return TreeNode(val) + parent = None + cur = root + while cur: + parent = cur + if val < cur.val: + cur = cur.left + else: + cur = cur.right + if val < parent.val: + parent.left = TreeNode(val) + else: + parent.right = TreeNode(val) + return root ``` 迭代法(精简) From 0f5a20826a0a531669eb4819e2da67dac30d2f10 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=B6=E7=AC=9B?= <128707187+catherinexrk@users.noreply.github.com> Date: Mon, 2 Sep 2024 16:41:19 +0800 Subject: [PATCH 2788/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A00058=E5=8C=BA?= =?UTF-8?q?=E9=97=B4=E5=92=8C=20JavaScript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...8.\345\214\272\351\227\264\345\222\214.md" | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git "a/problems/kamacoder/0058.\345\214\272\351\227\264\345\222\214.md" "b/problems/kamacoder/0058.\345\214\272\351\227\264\345\222\214.md" index f5ce08dcbf..5125f5f8b8 100644 --- "a/problems/kamacoder/0058.\345\214\272\351\227\264\345\222\214.md" +++ "b/problems/kamacoder/0058.\345\214\272\351\227\264\345\222\214.md" @@ -263,3 +263,52 @@ if __name__ == "__main__": main() ``` + +### JavaScript + +``` JavaScript + +function prefixSum() { + const readline = require('readline'); + + const rl = readline.createInterface({ + input: process.stdin, + output: process.stdout + }); + + let inputLines = []; + rl.on('line', (line) => { + inputLines.push(line.trim()); + }); + + rl.on('close', () => { + // 读取项数 n + const n = parseInt(inputLines[0]); + + // 使用前缀和,复杂度控制在 O(1) + let sum = new Array(n); + sum[0] = parseInt(inputLines[1]); + + // 计算前缀和数组 + for (let i = 1; i < n; i++) { + let value = parseInt(inputLines[i + 1]); + sum[i] = sum[i - 1] + value; + } + + // 处理区间和查询 + for (let i = n + 1; i < inputLines.length; i++) { + let [left, right] = inputLines[i].split(' ').map(Number); + + if (left === 0) { + console.log(sum[right]); + } else { + console.log(sum[right] - sum[left - 1]); + } + } + }); +} + + +``` + + From f4e653d1194b360836964db2bbf9654a9aabf412 Mon Sep 17 00:00:00 2001 From: Zihan Qiu Date: Mon, 2 Sep 2024 09:24:26 -0500 Subject: [PATCH 2789/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E4=BA=860383.?= =?UTF-8?q?=E8=B5=8E=E9=87=91=E4=BF=A1=E7=9A=84python=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E4=BA=8C13=E8=A1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .DS_Store | Bin 6148 -> 6148 bytes ...3.\350\265\216\351\207\221\344\277\241.md" | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/.DS_Store b/.DS_Store index f89600e9deb6f2c531cd456675779b0e188cf6e0..f7ce0fd5038358c7a0df77b968ed993daff0639c 100644 GIT binary patch delta 98 zcmZoMXfc=|&e%S&P;8=}q9_vs0|O%ig8&0V4nrzKE< Date: Wed, 4 Sep 2024 11:02:32 +0800 Subject: [PATCH 2790/3019] Update --- ...163.\344\274\230\347\247\200\346\225\260\347\273\204.md" | 3 +++ ...164.\345\215\207\345\272\217\346\225\260\347\273\204.md" | 3 +++ ...\217\346\227\240\351\207\215\345\244\215\344\270\262.md" | 6 ++++++ 3 files changed, 12 insertions(+) rename "problems/kamacoder/\347\254\254\344\270\200\351\242\230.md" => "problems/kamacoder/0163.\344\274\230\347\247\200\346\225\260\347\273\204.md" (97%) rename "problems/kamacoder/\347\254\254\344\272\214\351\242\230.md" => "problems/kamacoder/0164.\345\215\207\345\272\217\346\225\260\347\273\204.md" (96%) rename "problems/kamacoder/\347\254\254\344\270\211\351\242\230.md" => "problems/kamacoder/0165.\346\234\200\345\244\247\345\255\227\345\205\270\345\272\217\346\227\240\351\207\215\345\244\215\344\270\262.md" (95%) diff --git "a/problems/kamacoder/\347\254\254\344\270\200\351\242\230.md" "b/problems/kamacoder/0163.\344\274\230\347\247\200\346\225\260\347\273\204.md" similarity index 97% rename from "problems/kamacoder/\347\254\254\344\270\200\351\242\230.md" rename to "problems/kamacoder/0163.\344\274\230\347\247\200\346\225\260\347\273\204.md" index 989296845d..4967f907be 100644 --- "a/problems/kamacoder/\347\254\254\344\270\200\351\242\230.md" +++ "b/problems/kamacoder/0163.\344\274\230\347\247\200\346\225\260\347\273\204.md" @@ -1,4 +1,7 @@ +# 优秀数组 + +[题目链接](https://kamacoder.com/problempage.php?pid=1241) ## 解题思路 diff --git "a/problems/kamacoder/\347\254\254\344\272\214\351\242\230.md" "b/problems/kamacoder/0164.\345\215\207\345\272\217\346\225\260\347\273\204.md" similarity index 96% rename from "problems/kamacoder/\347\254\254\344\272\214\351\242\230.md" rename to "problems/kamacoder/0164.\345\215\207\345\272\217\346\225\260\347\273\204.md" index addbcf4418..2a35b715bf 100644 --- "a/problems/kamacoder/\347\254\254\344\272\214\351\242\230.md" +++ "b/problems/kamacoder/0164.\345\215\207\345\272\217\346\225\260\347\273\204.md" @@ -1,3 +1,6 @@ +# 升序数组 + +[题目链接](https://kamacoder.com/problempage.php?pid=1241) ## 解题思路 diff --git "a/problems/kamacoder/\347\254\254\344\270\211\351\242\230.md" "b/problems/kamacoder/0165.\346\234\200\345\244\247\345\255\227\345\205\270\345\272\217\346\227\240\351\207\215\345\244\215\344\270\262.md" similarity index 95% rename from "problems/kamacoder/\347\254\254\344\270\211\351\242\230.md" rename to "problems/kamacoder/0165.\346\234\200\345\244\247\345\255\227\345\205\270\345\272\217\346\227\240\351\207\215\345\244\215\344\270\262.md" index 976e617a5c..c7be98d239 100644 --- "a/problems/kamacoder/\347\254\254\344\270\211\351\242\230.md" +++ "b/problems/kamacoder/0165.\346\234\200\345\244\247\345\255\227\345\205\270\345\272\217\346\227\240\351\207\215\345\244\215\344\270\262.md" @@ -1,4 +1,10 @@ +# 最大字典序无重复串 + +[题目链接](https://kamacoder.com/problempage.php?pid=1243) + + +## 解题思路 贪心思路 From 74097173006cabb33f75e331e0aa05256210c13f Mon Sep 17 00:00:00 2001 From: Leehouc <152672308+Leehouc@users.noreply.github.com> Date: Wed, 4 Sep 2024 17:38:10 +0800 Subject: [PATCH 2791/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200053.=E5=AF=BB?= =?UTF-8?q?=E5=AE=9D-Kruskal.mdC=E8=AF=AD=E8=A8=80=E6=96=B9=E6=B3=95?= =?UTF-8?q?=E4=B8=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0053.\345\257\273\345\256\235-Kruskal.md" | 71 +++++++++++++++++++ 1 file changed, 71 insertions(+) diff --git "a/problems/kamacoder/0053.\345\257\273\345\256\235-Kruskal.md" "b/problems/kamacoder/0053.\345\257\273\345\256\235-Kruskal.md" index fb816fb1af..7a69388293 100644 --- "a/problems/kamacoder/0053.\345\257\273\345\256\235-Kruskal.md" +++ "b/problems/kamacoder/0053.\345\257\273\345\256\235-Kruskal.md" @@ -562,4 +562,75 @@ if __name__ == "__main__": ### Dart ### C +并查集方法一 +```c +// 定义边结构体,包含两个顶点vex1和vex2以及它们之间的权重val +struct Edge +{ + int vex1, vex2, val; +}; + +// 冒泡排序函数,用于按边的权重val不减序排序边数组 +void bubblesort(struct Edge *a, int numsize) +{ + for (int i = 0; i < numsize - 1; ++i) + { + + for (int j = 0; j < numsize - i - 1; ++j) + { + if (a[j].val > a[j + 1].val) + { + struct Edge temp = a[j]; + a[j] = a[j + 1]; + a[j + 1] = temp; + } + } + } +} + +int main() +{ + int v, e; + int v1, v2, val; + int ret = 0; + + scanf("%d%d", &v, &e); + struct Edge *edg = (struct Edge *)malloc(sizeof(struct Edge) * e); + int *conne_gra = (int *)malloc(sizeof(int) * (v + 1)); + + // 初始化连通图数组,每个顶点初始时只与自己相连通 + for (int i = 0; i <= v; ++i) + { + conne_gra[i] = i; + } + + // 读取所有边的信息并存储到edg(存储所有边)数组中 + for (int i = 0; i < e; ++i) + { + scanf("%d%d%d", &v1, &v2, &val); + edg[i].vex1 = v1; + edg[i].vex2 = v2; + edg[i].val = val; + } + bubblesort(edg, e); // 调用冒泡排序函数对边进行排序 + + // 遍历所有边,执行Kruskal算法来找到最小生成树 + for (int i = 0; i < e; ++i) + { + if (conne_gra[edg[i].vex1] != conne_gra[edg[i].vex2]) + { // 如果当前边的两个顶点不在同一个连通分量中 + int tmp1 = conne_gra[edg[i].vex1], tmp2 = conne_gra[edg[i].vex2]; + for (int k = 1; k <= v; ++k) + { // 将所有属于tmp2的顶点合并到tmp1的连通分量中 + if (conne_gra[k] == tmp2) + conne_gra[k] = tmp1; + } + ret += edg[i].val; // 将当前边的权重加到最小生成树的权重中 + } + } + printf("%d", ret); + return 0; +} + +``` From adc34fb2f50db35891460d482b260957b797a41c Mon Sep 17 00:00:00 2001 From: Leehouc <152672308+Leehouc@users.noreply.github.com> Date: Wed, 4 Sep 2024 17:43:22 +0800 Subject: [PATCH 2792/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A00053.=E5=AF=BB?= =?UTF-8?q?=E5=AE=9D-Kruskal.mdC=E8=AF=AD=E8=A8=80=E6=96=B9=E6=B3=95?= =?UTF-8?q?=E4=BA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0053.\345\257\273\345\256\235-Kruskal.md" | 63 +++++++++++++++++++ 1 file changed, 63 insertions(+) diff --git "a/problems/kamacoder/0053.\345\257\273\345\256\235-Kruskal.md" "b/problems/kamacoder/0053.\345\257\273\345\256\235-Kruskal.md" index 7a69388293..52724956e8 100644 --- "a/problems/kamacoder/0053.\345\257\273\345\256\235-Kruskal.md" +++ "b/problems/kamacoder/0053.\345\257\273\345\256\235-Kruskal.md" @@ -634,3 +634,66 @@ int main() } ``` +并查集方法二 +```c +// 定义边结构体,包含两个顶点vex1和vex2以及它们之间的权重val (略,同上) +// 冒泡排序函数,用于按边的权重val不减序排序边数组(略,同上) + +// 并查集的查找操作 +int find(int m, int *father) +{ // 如果当前节点是其自身的父节点,则直接返回该节点 + // 否则递归查找其父节点的根,并将当前节点直接连接到根节点 + return (m == father[m]) ? m : (father[m] = find(father[m], father)); // 路径压缩 +} + +// 并查集的加入集合 +void Union(int m, int n, int *father) +{ + int x = find(m, father); + int y = find(n, father); + if (x == y) + return; // 如果发现根相同,则说明在一个集合,不用两个节点相连直接返回 + father[y] = x; +} + +int main() +{ + int v, e; + int v1, v2, val; + int ret = 0; + + scanf("%d%d", &v, &e); + struct Edge *edg = (struct Edge *)malloc(sizeof(struct Edge) * e); + int *conne_gra = (int *)malloc(sizeof(int) * (v + 1)); + // 初始化连通图数组,每个顶点初始时只与自己相连通 + for (int i = 0; i <= v; ++i) + { + conne_gra[i] = i; + } + // 读取所有边的信息并存储到edg(存储所有边)数组中 + for (int i = 0; i < e; ++i) + { + scanf("%d%d%d", &v1, &v2, &val); + edg[i].vex1 = v1; + edg[i].vex2 = v2; + edg[i].val = val; + } + bubblesort(edg, e); // 调用冒泡排序函数对边进行排序 + + // Kruskal算法的实现,通过边数组构建最小生成树 + int j = 0, count = 0; + while (v > 1) + { + if (find(edg[j].vex1, conne_gra) != find(edg[j].vex2, conne_gra)) + { + ret += edg[j].val; // 将当前边的权重加到最小生成树的权重中 + Union(edg[j].vex1, edg[j].vex2, conne_gra); + v--; + } + j++; + } + printf("%d", ret); + return 0; +} + +``` From fd0f78cac25912fd6e9eff6cfa51244a1e60fd6c Mon Sep 17 00:00:00 2001 From: Leehouc <152672308+Leehouc@users.noreply.github.com> Date: Wed, 4 Sep 2024 17:45:00 +0800 Subject: [PATCH 2793/3019] =?UTF-8?q?=E5=8A=A0=E5=A4=B4=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kamacoder/0053.\345\257\273\345\256\235-Kruskal.md" | 5 +++++ 1 file changed, 5 insertions(+) diff --git "a/problems/kamacoder/0053.\345\257\273\345\256\235-Kruskal.md" "b/problems/kamacoder/0053.\345\257\273\345\256\235-Kruskal.md" index 52724956e8..7f5ec3c4e4 100644 --- "a/problems/kamacoder/0053.\345\257\273\345\256\235-Kruskal.md" +++ "b/problems/kamacoder/0053.\345\257\273\345\256\235-Kruskal.md" @@ -564,6 +564,8 @@ if __name__ == "__main__": ### C 并查集方法一 ```c +#include +#include // 定义边结构体,包含两个顶点vex1和vex2以及它们之间的权重val struct Edge @@ -636,6 +638,9 @@ int main() ``` 并查集方法二 ```c +#include +#include + // 定义边结构体,包含两个顶点vex1和vex2以及它们之间的权重val (略,同上) // 冒泡排序函数,用于按边的权重val不减序排序边数组(略,同上) From d3ad53e4f2157158276ec84b3704d4ce7858b25c Mon Sep 17 00:00:00 2001 From: Leehouc <152672308+Leehouc@users.noreply.github.com> Date: Wed, 4 Sep 2024 17:51:11 +0800 Subject: [PATCH 2794/3019] =?UTF-8?q?Update=200053.=E5=AF=BB=E5=AE=9D-Krus?= =?UTF-8?q?kal.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kamacoder/0053.\345\257\273\345\256\235-Kruskal.md" | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git "a/problems/kamacoder/0053.\345\257\273\345\256\235-Kruskal.md" "b/problems/kamacoder/0053.\345\257\273\345\256\235-Kruskal.md" index 7f5ec3c4e4..cb24fd17f3 100644 --- "a/problems/kamacoder/0053.\345\257\273\345\256\235-Kruskal.md" +++ "b/problems/kamacoder/0053.\345\257\273\345\256\235-Kruskal.md" @@ -607,7 +607,7 @@ int main() conne_gra[i] = i; } - // 读取所有边的信息并存储到edg(存储所有边)数组中 + // 读取所有边的信息并存储到edg(存储所有边的)数组中 for (int i = 0; i < e; ++i) { scanf("%d%d%d", &v1, &v2, &val); @@ -670,12 +670,13 @@ int main() scanf("%d%d", &v, &e); struct Edge *edg = (struct Edge *)malloc(sizeof(struct Edge) * e); int *conne_gra = (int *)malloc(sizeof(int) * (v + 1)); + // 初始化连通图数组,每个顶点初始时只与自己相连通 for (int i = 0; i <= v; ++i) { conne_gra[i] = i; } - // 读取所有边的信息并存储到edg(存储所有边)数组中 + // 读取所有边的信息并存储到edg(存储所有边的)数组中 for (int i = 0; i < e; ++i) { scanf("%d%d%d", &v1, &v2, &val); @@ -683,6 +684,7 @@ int main() edg[i].vex2 = v2; edg[i].val = val; } + bubblesort(edg, e); // 调用冒泡排序函数对边进行排序 // Kruskal算法的实现,通过边数组构建最小生成树 From a3075308faacf803abe2e1ad6e89b5c3c5252c1c Mon Sep 17 00:00:00 2001 From: kyshen Date: Wed, 4 Sep 2024 23:00:44 +0800 Subject: [PATCH 2795/3019] feat: 0094 bellman-ford python solution --- ...7\347\211\251\350\277\220\350\276\223I.md" | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git "a/problems/kamacoder/0094.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I.md" "b/problems/kamacoder/0094.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I.md" index 45ca131361..3737fe0149 100644 --- "a/problems/kamacoder/0094.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I.md" +++ "b/problems/kamacoder/0094.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I.md" @@ -451,6 +451,33 @@ public class Main { ``` ### Python +```Python +def main(): + n, m = map(int, input().strip().split()) + edges = [] + for _ in range(m): + src, dest, weight = map(int, input().strip().split()) + edges.append([src, dest, weight]) + + minDist = [float("inf")] * (n + 1) + minDist[1] = 0 # 起点处距离为0 + + for i in range(1, n): + updated = False + for src, dest, weight in edges: + if minDist[src] != float("inf") and minDist[src] + weight < minDist[dest]: + minDist[dest] = minDist[src] + weight + updated = True + if not updated: # 若边不再更新,即停止回圈 + break + + if minDist[-1] == float("inf"): # 返还终点权重 + return "unconnected" + return minDist[-1] + +if __name__ == "__main__": + print(main()) +``` ### Go From e391a247292b798c6afe86e19cf6b691d8f2de84 Mon Sep 17 00:00:00 2001 From: kyshen Date: Fri, 6 Sep 2024 22:39:29 +0800 Subject: [PATCH 2796/3019] feat: 0094 python solution SPFA --- ...\211\251\350\277\220\350\276\223I-SPFA.md" | 39 ++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git "a/problems/kamacoder/0094.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I-SPFA.md" "b/problems/kamacoder/0094.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I-SPFA.md" index ce38391943..142bb5281b 100644 --- "a/problems/kamacoder/0094.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I-SPFA.md" +++ "b/problems/kamacoder/0094.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I-SPFA.md" @@ -425,7 +425,44 @@ public class Main { ``` ### Python - +```Python +import collections + +def main(): + n, m = map(int, input().strip().split()) + edges = [] + for _ in range(m): + src, dest, weight = map(int, input().strip().split()) + edges.append([src, dest, weight]) + + minDist = [float("inf")] * (n + 1) + minDist[1] = 0 + que = collections.deque([1]) + visited = [False] * (n + 1) + visited[1] = True + + while que: + cur = que.popleft() + visited[cur] = True + updated = False + for src, dest, weight in edges: + if minDist[src] != float("inf") and minDist[src] + weight < minDist[dest]: + minDist[dest] = minDist[src] + weight + updated = True + if visited[dest] == False: + que.append(dest) + visited[dest] = True + + if not updated: + break + + if minDist[-1] == float("inf"): + return "unconnected" + return minDist[-1] + +if __name__ == "__main__": + print(main()) +``` ### Go ### Rust From e24c307c07b7f70eca2f48d01d3c56f318b82dd3 Mon Sep 17 00:00:00 2001 From: kyshen Date: Fri, 6 Sep 2024 23:59:51 +0800 Subject: [PATCH 2797/3019] fix: error saving the edges --- ...47\211\251\350\277\220\350\276\223I-SPFA.md" | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git "a/problems/kamacoder/0094.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I-SPFA.md" "b/problems/kamacoder/0094.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I-SPFA.md" index 142bb5281b..b3f42bf800 100644 --- "a/problems/kamacoder/0094.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I-SPFA.md" +++ "b/problems/kamacoder/0094.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I-SPFA.md" @@ -430,10 +430,10 @@ import collections def main(): n, m = map(int, input().strip().split()) - edges = [] + edges = [[] for _ in range(n + 1)] for _ in range(m): src, dest, weight = map(int, input().strip().split()) - edges.append([src, dest, weight]) + edges[src].append([dest, weight]) minDist = [float("inf")] * (n + 1) minDist[1] = 0 @@ -443,18 +443,13 @@ def main(): while que: cur = que.popleft() - visited[cur] = True - updated = False - for src, dest, weight in edges: - if minDist[src] != float("inf") and minDist[src] + weight < minDist[dest]: - minDist[dest] = minDist[src] + weight - updated = True + visited[cur] = False + for dest, weight in edges[cur]: + if minDist[cur] != float("inf") and minDist[cur] + weight < minDist[dest]: + minDist[dest] = minDist[cur] + weight if visited[dest] == False: que.append(dest) visited[dest] = True - - if not updated: - break if minDist[-1] == float("inf"): return "unconnected" From 56306fc00b5fc111d66390f3d8c5bb0d25ffa166 Mon Sep 17 00:00:00 2001 From: wangq635 <643797037@qq.com> Date: Sat, 7 Sep 2024 19:50:44 +0800 Subject: [PATCH 2798/3019] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=20=E5=8A=A8?= =?UTF-8?q?=E6=80=81=E8=A7=84=E5=88=92=EF=BC=9A01=E8=83=8C=E5=8C=85?= =?UTF-8?q?=E7=90=86=E8=AE=BA=E5=9F=BA=E7=A1=80=EF=BC=88=E6=BB=9A=E5=8A=A8?= =?UTF-8?q?=E6=95=B0=E7=BB=84=EF=BC=89=E7=9A=84python=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E7=9A=84=E6=BB=9A=E5=8A=A8=E6=95=B0=E7=BB=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\347\241\20001\350\203\214\345\214\205-2.md" | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" index cd8f317c52..830958ef17 100644 --- "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" +++ "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" @@ -294,23 +294,18 @@ public class Main { ```python n, bagweight = map(int, input().split()) - weight = list(map(int, input().split())) value = list(map(int, input().split())) -dp = [[0] * (bagweight + 1) for _ in range(n)] +dp = [0] * (bagweight + 1) # 创建一个动态规划数组dp,初始值为0 -for j in range(weight[0], bagweight + 1): - dp[0][j] = value[0] +dp[0] = 0 # 初始化dp[0] = 0,背包容量为0,价值最大为0 -for i in range(1, n): - for j in range(bagweight + 1): - if j < weight[i]: - dp[i][j] = dp[i - 1][j] - else: - dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]) +for i in range(n): # 应该先遍历物品,如果遍历背包容量放在上一层,那么每个dp[j]就只会放入一个物品 + for j in range(bagweight, weight[i]-1, -1): # 倒序遍历背包容量是为了保证物品i只被放入一次 + dp[j] = max(dp[j], dp[j - weight[i]] + value[i]) -print(dp[n - 1][bagweight]) +print(dp[bagweight]) ``` ### Go From 02a8ec1c1380f74ec6dcc587225a2430a8180e04 Mon Sep 17 00:00:00 2001 From: cyxiwai Date: Mon, 9 Sep 2024 13:20:08 +0800 Subject: [PATCH 2799/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E8=A1=A5=E5=85=85?= =?UTF-8?q?=E4=BA=86kama0105.=E6=9C=89=E5=90=91=E5=9B=BE=E7=9A=84=E5=AE=8C?= =?UTF-8?q?=E5=85=A8=E5=8F=AF=E8=BE=BE=E6=80=A7=E7=9A=84Java=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...50\345\217\257\350\276\276\346\200\247.md" | 66 +++++++++++-------- 1 file changed, 40 insertions(+), 26 deletions(-) diff --git "a/problems/kamacoder/0105.\346\234\211\345\220\221\345\233\276\347\232\204\345\256\214\345\205\250\345\217\257\350\276\276\346\200\247.md" "b/problems/kamacoder/0105.\346\234\211\345\220\221\345\233\276\347\232\204\345\256\214\345\205\250\345\217\257\350\276\276\346\200\247.md" index 765f9a27f7..838b021245 100644 --- "a/problems/kamacoder/0105.\346\234\211\345\220\221\345\233\276\347\232\204\345\256\214\345\205\250\345\217\257\350\276\276\346\200\247.md" +++ "b/problems/kamacoder/0105.\346\234\211\345\220\221\345\233\276\347\232\204\345\256\214\345\205\250\345\217\257\350\276\276\346\200\247.md" @@ -294,37 +294,52 @@ int main() { import java.util.*; public class Main { + public static List> adjList = new ArrayList<>(); - public static void dfs(List> graph, int key, boolean[] visited) { - for (int neighbor : graph.get(key)) { - if (!visited[neighbor]) { // Check if the next node is not visited - visited[neighbor] = true; - dfs(graph, neighbor, visited); - } + public static void dfs(boolean[] visited, int key) { + if (visited[key]) { + return; } - } - - public static void main(String[] args) { - Scanner scanner = new Scanner(System.in); - int n = scanner.nextInt(); - int m = scanner.nextInt(); - - List> graph = new ArrayList<>(); - for (int i = 0; i <= n; i++) { - graph.add(new ArrayList<>()); + visited[key] = true; + List nextKeys = adjList.get(key); + for (int nextKey : nextKeys) { + dfs(visited, nextKey); } + } - for (int i = 0; i < m; i++) { - int s = scanner.nextInt(); - int t = scanner.nextInt(); - graph.get(s).add(t); + public static void bfs(boolean[] visited, int key) { + Queue queue = new LinkedList(); + queue.add(key); + visited[key] = true; + while (!queue.isEmpty()) { + int curKey = queue.poll(); + List list = adjList.get(curKey); + for (int nextKey : list) { + if (!visited[nextKey]) { + queue.add(nextKey); + visited[nextKey] = true; + } + } } + } - boolean[] visited = new boolean[n + 1]; - visited[1] = true; // Process node 1 beforehand - dfs(graph, 1, visited); - - for (int i = 1; i <= n; i++) { + public static void main(String[] args) { + Scanner sc = new Scanner(System.in); + int vertices_num = sc.nextInt(); + int line_num = sc.nextInt(); + for (int i = 0; i < vertices_num; i++) { + adjList.add(new LinkedList<>()); + }//Initialization + for (int i = 0; i < line_num; i++) { + int s = sc.nextInt(); + int t = sc.nextInt(); + adjList.get(s - 1).add(t - 1); + }//构造邻接表 + boolean[] visited = new boolean[vertices_num]; + dfs(visited, 0); +// bfs(visited, 0); + + for (int i = 0; i < vertices_num; i++) { if (!visited[i]) { System.out.println(-1); return; @@ -334,7 +349,6 @@ public class Main { } } - ``` From ad0d129c25429f798bf6ee6e9812397742cd9fe5 Mon Sep 17 00:00:00 2001 From: cyxiwai Date: Mon, 9 Sep 2024 13:24:10 +0800 Subject: [PATCH 2800/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=B9=B6=E8=A1=A5?= =?UTF-8?q?=E5=85=85=E4=BA=86kama0099.=E5=B2=9B=E5=B1=BF=E7=9A=84=E6=95=B0?= =?UTF-8?q?=E9=87=8Fdfs=E5=92=8Cbfs=E7=9A=84=E7=89=88=E6=9C=AC=EF=BC=8C?= =?UTF-8?q?=E9=99=84=E6=9C=89=E8=AF=A6=E7=BB=86=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...60\351\207\217\345\271\277\346\220\234.md" | 53 +++++++++++++++++-- ...60\351\207\217\346\267\261\346\220\234.md" | 45 ++++++++++++++++ 2 files changed, 95 insertions(+), 3 deletions(-) diff --git "a/problems/kamacoder/0099.\345\262\233\345\261\277\347\232\204\346\225\260\351\207\217\345\271\277\346\220\234.md" "b/problems/kamacoder/0099.\345\262\233\345\261\277\347\232\204\346\225\260\351\207\217\345\271\277\346\220\234.md" index 9fca9a0489..3047575391 100644 --- "a/problems/kamacoder/0099.\345\262\233\345\261\277\347\232\204\346\225\260\351\207\217\345\271\277\346\220\234.md" +++ "b/problems/kamacoder/0099.\345\262\233\345\261\277\347\232\204\346\225\260\351\207\217\345\271\277\346\220\234.md" @@ -191,10 +191,57 @@ int main() { ### Java ```java +import java.util.*; + +public class Main { + public static int[][] dir = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};//下右上左逆时针遍历 + + public static void bfs(int[][] grid, boolean[][] visited, int x, int y) { + Queue queue = new LinkedList();//定义坐标队列,没有现成的pair类,在下面自定义了 + queue.add(new pair(x, y)); + visited[x][y] = true;//遇到入队直接标记为优先, + // 否则出队时才标记的话会导致重复访问,比如下方节点会在右下顺序的时候被第二次访问入队 + while (!queue.isEmpty()) { + int curX = queue.peek().first; + int curY = queue.poll().second;//当前横纵坐标 + for (int i = 0; i < 4; i++) { + //顺时针遍历新节点next,下面记录坐标 + int nextX = curX + dir[i][0]; + int nextY = curY + dir[i][1]; + if (nextX < 0 || nextX >= grid.length || nextY < 0 || nextY >= grid[0].length) { + continue; + }//去除越界部分 + if (!visited[nextX][nextY] && grid[nextX][nextY] == 1) { + queue.add(new pair(nextX, nextY)); + visited[nextX][nextY] = true;//逻辑同上 + } + } + } + } - - - + public static void main(String[] args) { + Scanner sc = new Scanner(System.in); + int m = sc.nextInt(); + int n = sc.nextInt(); + int[][] grid = new int[m][n]; + boolean[][] visited = new boolean[m][n]; + int ans = 0; + for (int i = 0; i < m; i++) { + for (int j = 0; j < n; j++) { + grid[i][j] = sc.nextInt(); + } + } + for (int i = 0; i < m; i++) { + for (int j = 0; j < n; j++) { + if (!visited[i][j] && grid[i][j] == 1) { + ans++; + bfs(grid, visited, i, j); + } + } + } + System.out.println(ans); + } +} ``` diff --git "a/problems/kamacoder/0099.\345\262\233\345\261\277\347\232\204\346\225\260\351\207\217\346\267\261\346\220\234.md" "b/problems/kamacoder/0099.\345\262\233\345\261\277\347\232\204\346\225\260\351\207\217\346\267\261\346\220\234.md" index b257ca9a73..6ac7ba3b62 100644 --- "a/problems/kamacoder/0099.\345\262\233\345\261\277\347\232\204\346\225\260\351\207\217\346\267\261\346\220\234.md" +++ "b/problems/kamacoder/0099.\345\262\233\345\261\277\347\232\204\346\225\260\351\207\217\346\267\261\346\220\234.md" @@ -182,7 +182,52 @@ int main() { ## 其他语言版本 ### Java +```java +import java.util.Scanner; + +public class Main { + public static int[][] dir ={{0,1},{1,0},{-1,0},{0,-1}}; + public static void dfs(boolean[][] visited,int x,int y ,int [][]grid) + { + for (int i = 0; i < 4; i++) { + int nextX=x+dir[i][0]; + int nextY=y+dir[i][1]; + if(nextY<0||nextX<0||nextX>= grid.length||nextY>=grid[0].length) + continue; + if(!visited[nextX][nextY]&&grid[nextX][nextY]==1) + { + visited[nextX][nextY]=true; + dfs(visited,nextX,nextY,grid); + } + } + } + public static void main(String[] args) { + Scanner sc = new Scanner(System.in); + int m= sc.nextInt(); + int n = sc.nextInt(); + int[][] grid = new int[m][n]; + for (int i = 0; i < m; i++) { + for (int j = 0; j < n; j++) { + grid[i][j]=sc.nextInt(); + } + } + boolean[][]visited =new boolean[m][n]; + int ans = 0; + for (int i = 0; i < m; i++) { + for (int j = 0; j < n; j++) { + if(!visited[i][j]&&grid[i][j]==1) + { + ans++; + visited[i][j]=true; + dfs(visited,i,j,grid); + } + } + } + System.out.println(ans); + } +} +``` ### Python 版本一 From 866032c16d5977a0e55d44b8086c60712032275a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=97=A8=E5=97=A8=E5=97=A8?= <111850394+QinWeijia111@users.noreply.github.com> Date: Wed, 11 Sep 2024 15:26:40 +0800 Subject: [PATCH 2801/3019] =?UTF-8?q?Update=200151.=E7=BF=BB=E8=BD=AC?= =?UTF-8?q?=E5=AD=97=E7=AC=A6=E4=B8=B2=E9=87=8C=E7=9A=84=E5=8D=95=E8=AF=8D?= =?UTF-8?q?.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 增加Python语言版本的双指针去除空格算法的非调包算法 --- ...14\347\232\204\345\215\225\350\257\215.md" | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git "a/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" "b/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" index a000519862..bf486bdceb 100644 --- "a/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" +++ "b/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" @@ -475,7 +475,45 @@ class Solution: words = words[::-1] # 反转单词 return ' '.join(words) #列表转换成字符串 ``` +(版本四) 将字符串转换为列表后,使用双指针去除空格 +```python +class Solution: + def single_reverse(self, s, start: int, end: int): + while start < end: + s[start], s[end] = s[end], s[start] + start += 1 + end -= 1 + def reverseWords(self, s: str) -> str: + result = "" + fast = 0 + # 1. 首先将原字符串反转并且除掉空格, 并且加入到新的字符串当中 + # 由于Python字符串的不可变性,因此只能转换为列表进行处理 + s = list(s) + s.reverse() + while fast < len(s): + if s[fast] != " ": + if len(result) != 0: + result += " " + while s[fast] != " " and fast < len(s): + result += s[fast] + fast += 1 + else: + fast += 1 + # 2.其次将每个单词进行翻转操作 + slow = 0 + fast = 0 + result = list(result) + while fast <= len(result): + if fast == len(result) or result[fast] == " ": + self.single_reverse(result, slow, fast - 1) + slow = fast + 1 + fast += 1 + else: + fast += 1 + + return "".join(result) +``` ### Go: 版本一: From 4f9d9491ae07d68cdd671a28b1b33c294569e00d Mon Sep 17 00:00:00 2001 From: markwang Date: Wed, 11 Sep 2024 17:30:52 +0800 Subject: [PATCH 2802/3019] =?UTF-8?q?494.=E7=9B=AE=E6=A0=87=E5=92=8C?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0Go=E4=BA=8C=E7=BB=B4dp=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...4.\347\233\256\346\240\207\345\222\214.md" | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git "a/problems/0494.\347\233\256\346\240\207\345\222\214.md" "b/problems/0494.\347\233\256\346\240\207\345\222\214.md" index 82d330b727..dc8d6c0fbb 100644 --- "a/problems/0494.\347\233\256\346\240\207\345\222\214.md" +++ "b/problems/0494.\347\233\256\346\240\207\345\222\214.md" @@ -675,6 +675,57 @@ class Solution: ``` ### Go +二维dp +```go +func findTargetSumWays(nums []int, target int) int { + sum := 0 + for _, v := range nums { + sum += v + } + if math.Abs(float64(target)) > float64(sum) { + return 0 // 此时没有方案 + } + if (target + sum) % 2 == 1 { + return 0 // 此时没有方案 + } + bagSize := (target + sum) / 2 + + dp := make([][]int, len(nums)) + for i := range dp { + dp[i] = make([]int, bagSize + 1) + } + + // 初始化最上行 + if nums[0] <= bagSize { + dp[0][nums[0]] = 1 + } + + // 初始化最左列,最左列其他数值在递推公式中就完成了赋值 + dp[0][0] = 1 + + var numZero float64 + for i := range nums { + if nums[i] == 0 { + numZero++ + } + dp[i][0] = int(math.Pow(2, numZero)) + } + + // 以下遍历顺序行列可以颠倒 + for i := 1; i < len(nums); i++ { // 行,遍历物品 + for j := 0; j <= bagSize; j++ { // 列,遍历背包 + if nums[i] > j { + dp[i][j] = dp[i-1][j] + } else { + dp[i][j] = dp[i-1][j] + dp[i-1][j-nums[i]] + } + } + } + return dp[len(nums)-1][bagSize] +} +``` + +一维dp ```go func findTargetSumWays(nums []int, target int) int { sum := 0 From b5e3b801d37b290b48d03cdca1ef3a81d680e95b Mon Sep 17 00:00:00 2001 From: Elio Zhou <30508272+eliozh@users.noreply.github.com> Date: Wed, 11 Sep 2024 18:56:36 +0800 Subject: [PATCH 2803/3019] =?UTF-8?q?Update=200236.=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=A0=91=E7=9A=84=E6=9C=80=E8=BF=91=E5=85=AC=E5=85=B1=E7=A5=96?= =?UTF-8?q?=E5=85=88.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 优化Rust版本0236.二叉树的最近公共祖先代码 --- ...\221\345\205\254\345\205\261\347\245\226\345\205\210.md" | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git "a/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" "b/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" index 5e80e702f3..2e94f7a7e3 100644 --- "a/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" +++ "b/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" @@ -454,7 +454,11 @@ impl Solution { p: Option>>, q: Option>>, ) -> Option>> { - if root == p || root == q || root.is_none() { + if root.is_none() { + return root; + } + if Rc::ptr_eq(root.as_ref().unwrap(), p.as_ref().unwrap()) + || Rc::ptr_eq(root.as_ref().unwrap(), q.as_ref().unwrap()) { return root; } let left = Self::lowest_common_ancestor( From b7ddc4a4abdb8cde5e020d47d7ed37e18a9df91b Mon Sep 17 00:00:00 2001 From: markwang Date: Thu, 12 Sep 2024 16:07:01 +0800 Subject: [PATCH 2804/3019] =?UTF-8?q?518.=E9=9B=B6=E9=92=B1=E5=85=91?= =?UTF-8?q?=E6=8D=A2II=E5=A2=9E=E5=8A=A0Go=E4=BA=8C=E7=BB=B4dp=E8=A7=A3?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\351\222\261\345\205\221\346\215\242II.md" | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git "a/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" "b/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" index 255912d62b..bef62b304d 100644 --- "a/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" +++ "b/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" @@ -268,6 +268,7 @@ class Solution: ### Go: +一维dp ```go func change(amount int, coins []int) int { // 定义dp数组 @@ -286,6 +287,29 @@ func change(amount int, coins []int) int { return dp[amount] } ``` +二维dp +```go +func change(amount int, coins []int) int { + dp := make([][]int, len(coins)) + for i := range dp { + dp[i] = make([]int, amount + 1) + dp[i][0] = 1 + } + for j := coins[0]; j <= amount; j++ { + dp[0][j] += dp[0][j-coins[0]] + } + for i := 1; i < len(coins); i++ { + for j := 1; j <= amount; j++ { + if j < coins[i] { + dp[i][j] = dp[i-1][j] + } else { + dp[i][j] = dp[i][j-coins[i]] + dp[i-1][j] + } + } + } + return dp[len(coins)-1][amount] +} +``` ### Rust: From b5161e725dc25e2994a903935858d557707cef18 Mon Sep 17 00:00:00 2001 From: markwang Date: Fri, 13 Sep 2024 09:49:36 +0800 Subject: [PATCH 2805/3019] =?UTF-8?q?kama57.=E7=88=AC=E6=A5=BC=E6=A2=AF?= =?UTF-8?q?=E8=A1=A5=E5=85=85Go=E8=A7=A3=E6=B3=95package=E5=92=8Cimport?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...350\203\214\345\214\205\347\211\210\346\234\254.md" | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git "a/problems/0070.\347\210\254\346\245\274\346\242\257\345\256\214\345\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md" "b/problems/0070.\347\210\254\346\245\274\346\242\257\345\256\214\345\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md" index 07e0261e8f..c51a590baf 100644 --- "a/problems/0070.\347\210\254\346\245\274\346\242\257\345\256\214\345\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md" +++ "b/problems/0070.\347\210\254\346\245\274\346\242\257\345\256\214\345\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md" @@ -184,6 +184,16 @@ if __name__ == '__main__': ### Go: ```go +package main + +import ( + "bufio" + "fmt" + "os" + "strconv" + "strings" +) + func climbStairs(n int, m int) int { dp := make([]int, n+1) dp[0] = 1 From 8be83e8138532b03aa7b114a7bd84dae325b213c Mon Sep 17 00:00:00 2001 From: cyxiwai Date: Fri, 13 Sep 2024 10:02:13 +0800 Subject: [PATCH 2806/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=B9=B6=E8=A1=A5?= =?UTF-8?q?=E5=85=85=E4=BA=86kama0109.=E5=86=97=E4=BD=99=E9=93=BE=E6=8E=A5?= =?UTF-8?q?II=E7=9A=84Java=E7=89=88=E6=9C=AC=EF=BC=8C=E9=99=84=E6=9C=89?= =?UTF-8?q?=E8=AF=A6=E7=BB=86=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\344\275\231\350\277\236\346\216\245II.md" | 98 +++++++++++++++++++ 1 file changed, 98 insertions(+) diff --git "a/problems/kamacoder/0109.\345\206\227\344\275\231\350\277\236\346\216\245II.md" "b/problems/kamacoder/0109.\345\206\227\344\275\231\350\277\236\346\216\245II.md" index fd834357fd..bd707bf6ae 100644 --- "a/problems/kamacoder/0109.\345\206\227\344\275\231\350\277\236\346\216\245II.md" +++ "b/problems/kamacoder/0109.\345\206\227\344\275\231\350\277\236\346\216\245II.md" @@ -250,7 +250,105 @@ int main() { ## 其他语言版本 ### Java +```java +import java.util.ArrayList; +import java.util.List; +import java.util.Scanner; + +public class Main { + static int n; + static int[] father = new int[1001]; // 并查集数组 + + // 并查集初始化 + public static void init() { + for (int i = 1; i <= n; ++i) { + father[i] = i; + } + } + + // 并查集里寻根的过程 + public static int find(int u) { + if (u == father[u]) return u; + return father[u] = find(father[u]); // 路径压缩 + } + + // 将 v->u 这条边加入并查集 + public static void join(int u, int v) { + u = find(u); + v = find(v); + if (u != v) { + father[v] = u; // 合并两棵树 + } + } + // 判断 u 和 v 是否有同一个根 + public static boolean same(int u, int v) { + return find(u) == find(v); + } + + // 在有向图里找到删除的那条边,使其变成树 + public static void getRemoveEdge(List edges) { + init(); // 初始化并查集 + for (int i = 0; i < n; i++) { // 遍历所有的边 + if (same(edges.get(i)[0], edges.get(i)[1])) { // 如果构成有向环了,就是要删除的边 + System.out.println(edges.get(i)[0] + " " + edges.get(i)[1]); + return; + } else { + join(edges.get(i)[0], edges.get(i)[1]); + } + } + } + + // 删一条边之后判断是不是树 + public static boolean isTreeAfterRemoveEdge(List edges, int deleteEdge) { + init(); // 初始化并查集 + for (int i = 0; i < n; i++) { + if (i == deleteEdge) continue; + if (same(edges.get(i)[0], edges.get(i)[1])) { // 如果构成有向环了,一定不是树 + return false; + } + join(edges.get(i)[0], edges.get(i)[1]); + } + return true; + } + + public static void main(String[] args) { + Scanner sc = new Scanner(System.in); + List edges = new ArrayList<>(); // 存储所有的边 + + n = sc.nextInt(); // 顶点数 + int[] inDegree = new int[n + 1]; // 记录每个节点的入度 + for (int i = 0; i < n; i++) { + int s = sc.nextInt(); // 边的起点 + int t = sc.nextInt(); // 边的终点 + inDegree[t]++; + edges.add(new int[]{s, t}); // 将边加入列表 + } + + List vec = new ArrayList<>(); // 记录入度为2的边(如果有的话就两条边) + // 找入度为2的节点所对应的边,注意要倒序,因为优先删除最后出现的一条边 + for (int i = n - 1; i >= 0; i--) { + if (inDegree[edges.get(i)[1]] == 2) { + vec.add(i); + } + } + + // 情况一、情况二 + if (vec.size() > 0) { + // vec里的边已经按照倒叙放的,所以优先删 vec.get(0) 这条边 + if (isTreeAfterRemoveEdge(edges, vec.get(0))) { + System.out.println(edges.get(vec.get(0))[0] + " " + edges.get(vec.get(0))[1]); + } else { + System.out.println(edges.get(vec.get(1))[0] + " " + edges.get(vec.get(1))[1]); + } + return; + } + + // 处理情况三:明确没有入度为2的情况,一定有有向环,找到构成环的边返回即可 + getRemoveEdge(edges); + } +} +``` ### Python ### Go From d6cd5e0ceff6c26dde8083b81b9316b832721bfc Mon Sep 17 00:00:00 2001 From: Yufan SHENG Date: Fri, 13 Sep 2024 14:28:49 +1000 Subject: [PATCH 2807/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B00110=E5=B9=B3?= =?UTF-8?q?=E8=A1=A1=E4=BA=8C=E5=8F=89=E6=A0=91Python3=E8=BF=AD=E4=BB=A3?= =?UTF-8?q?=E6=B3=95=E7=B2=BE=E7=AE=80=E7=89=88=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...3\350\241\241\344\272\214\345\217\211\346\240\221.md" | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git "a/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" "b/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" index f8071333f0..ec120bcce5 100644 --- "a/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" @@ -609,10 +609,13 @@ class Solution: while stack: node = stack.pop() if node: - stack.append(node) + stack.append(node) # 中 stack.append(None) - if node.left: stack.append(node.left) - if node.right: stack.append(node.right) + # 采用数组进行迭代,先将右子树加入,保证左节点能够先出栈 + if node.right: # 右 + stack.append(node.right) + if node.left: # 左 + stack.append(node.left) else: real_node = stack.pop() left, right = height_map.get(real_node.left, 0), height_map.get(real_node.right, 0) From 507d9e04308e1859558912a3797e6f9f59106303 Mon Sep 17 00:00:00 2001 From: Yufan Sheng <18829237653@163.com> Date: Fri, 13 Sep 2024 14:40:58 +1000 Subject: [PATCH 2808/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B00110.=E5=B9=B3?= =?UTF-8?q?=E8=A1=A1=E4=BA=8C=E5=8F=89=E6=A0=91=E4=B8=AD=E7=9A=84=E4=B8=8A?= =?UTF-8?q?=E6=AC=A1=E4=BF=AE=E6=94=B9=E7=9A=84=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" "b/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" index ec120bcce5..a4339ac3d7 100644 --- "a/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" @@ -611,7 +611,7 @@ class Solution: if node: stack.append(node) # 中 stack.append(None) - # 采用数组进行迭代,先将右子树加入,保证左节点能够先出栈 + # 采用数组进行迭代,先将右节点加入,保证左节点能够先出栈 if node.right: # 右 stack.append(node.right) if node.left: # 左 From 513440ad8f22c6d9a14ceb23a78e0dfde7649c67 Mon Sep 17 00:00:00 2001 From: Chemxy Date: Fri, 13 Sep 2024 19:34:17 +0800 Subject: [PATCH 2809/3019] =?UTF-8?q?new=20=EF=BC=9A=E6=96=B0=E5=A2=9ECang?= =?UTF-8?q?jie=E8=A7=A3=E9=A2=98=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...07\345\255\220\345\272\217\345\210\227.md" | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git "a/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" "b/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" index 9ee7bef38a..f1a146b71c 100644 --- "a/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" @@ -337,6 +337,29 @@ pub fn length_of_lis(nums: Vec) -> i32 { } ``` +### Cangjie: + +```cangjie +func lengthOfLIS(nums: Array): Int64 { + let n = nums.size + if (n <= 1) { + return n + } + + let dp = Array(n, item: 1) + var res = 0 + for (i in 1..n) { + for (j in 0..i) { + if (nums[i] > nums[j]) { + dp[i] = max(dp[i], dp[j] + 1) + } + } + res = max(dp[i], res) + } + return res +} +``` +

From 8127baf3fe23d735a4135900605ad9ebc3ebee63 Mon Sep 17 00:00:00 2001 From: Chemxy Date: Fri, 13 Sep 2024 20:40:37 +0800 Subject: [PATCH 2810/3019] =?UTF-8?q?new=EF=BC=9A=E6=96=B0=E5=A2=9ECangjie?= =?UTF-8?q?=E9=A2=98=E8=A7=A3=EF=BC=9A=E6=9C=80=E9=95=BF=E8=BF=9E=E7=BB=AD?= =?UTF-8?q?=E9=80=92=E5=A2=9E=E5=BA=8F=E5=88=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...22\345\242\236\345\272\217\345\210\227.md" | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git "a/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" "b/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" index cebb552bf8..fe882e0594 100644 --- "a/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" +++ "b/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" @@ -491,7 +491,24 @@ int findLengthOfLCIS(int* nums, int numsSize) { return result; } ``` - +### Cangjie +```cangjie +func findLengthOfLCIS(nums: Array): Int64 { + let n = nums.size + if (n <= 1) { + return n + } + let dp = Array(n, repeat: 1) + var res = 0 + for (i in 1..n) { + if (nums[i] > nums[i - 1]) { + dp[i] = dp[i - 1] + 1 + } + res = max(res, dp[i]) + } + return res +} +``` From 60f34628ebadd556d639ae3792af98df65c3476a Mon Sep 17 00:00:00 2001 From: Chemxy Date: Fri, 13 Sep 2024 20:42:36 +0800 Subject: [PATCH 2811/3019] =?UTF-8?q?new=EF=BC=9A=E6=96=B0=E5=A2=9ECangjie?= =?UTF-8?q?=E9=A2=98=E8=A7=A3=EF=BC=9A=E6=9C=80=E9=95=BF=E9=87=8D=E5=A4=8D?= =?UTF-8?q?=E5=AD=90=E6=95=B0=E7=BB=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...215\345\255\220\346\225\260\347\273\204.md" | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git "a/problems/0718.\346\234\200\351\225\277\351\207\215\345\244\215\345\255\220\346\225\260\347\273\204.md" "b/problems/0718.\346\234\200\351\225\277\351\207\215\345\244\215\345\255\220\346\225\260\347\273\204.md" index 6c8e7101a1..19520d131d 100644 --- "a/problems/0718.\346\234\200\351\225\277\351\207\215\345\244\215\345\255\220\346\225\260\347\273\204.md" +++ "b/problems/0718.\346\234\200\351\225\277\351\207\215\345\244\215\345\255\220\346\225\260\347\273\204.md" @@ -581,6 +581,24 @@ int findLength(int* nums1, int nums1Size, int* nums2, int nums2Size) { } ``` +### Cangjie +```cangjie +func findLength(nums1: Array, nums2: Array): Int64 { + let n = nums1.size + let m = nums2.size + let dp = Array(n + 1, {_ => Array(m + 1, item: 0)}) + var res = 0 + for (i in 1..=n) { + for (j in 1..=m) { + if (nums1[i - 1] == nums2[j - 1]) { + dp[i][j] = dp[i - 1][j - 1] + 1 + } + res = max(res, dp[i][j]) + } + } + return res +} +```

From d742497b528e028cff4f756524ed1d9ddc24c8da Mon Sep 17 00:00:00 2001 From: Chemxy Date: Fri, 13 Sep 2024 23:05:37 +0800 Subject: [PATCH 2812/3019] =?UTF-8?q?new=EF=BC=9A=E6=96=B0=E5=A2=9ECangjie?= =?UTF-8?q?=E9=A2=98=E8=A7=A3=EF=BC=9A=E6=9C=80=E9=95=BF=E5=85=AC=E5=85=B1?= =?UTF-8?q?=E5=AD=90=E5=BA=8F=E5=88=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...261\345\255\220\345\272\217\345\210\227.md" | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git "a/problems/1143.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" "b/problems/1143.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" index 7fa7bb68e1..93df987e3d 100644 --- "a/problems/1143.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/1143.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" @@ -399,6 +399,24 @@ int longestCommonSubsequence(char* text1, char* text2) { } ``` +### Cangjie +```cangjie +func longestCommonSubsequence(text1: String, text2: String): Int64 { + let n = text1.size + let m = text2.size + let dp = Array(n + 1, {_ => Array(m + 1, repeat: 0)}) + for (i in 1..=n) { + for (j in 1..=m) { + if (text1[i - 1] == text2[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[n][m] +} +```

From 8b90ac06bf65ccfa036baa6629a37eb948008108 Mon Sep 17 00:00:00 2001 From: Chemxy Date: Fri, 13 Sep 2024 23:08:46 +0800 Subject: [PATCH 2813/3019] =?UTF-8?q?fix=EF=BC=9A=E8=B0=83=E6=95=B4?= =?UTF-8?q?=E9=97=B4=E8=B7=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" | 2 ++ ...\207\215\345\244\215\345\255\220\346\225\260\347\273\204.md" | 1 + ...\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" | 1 + 3 files changed, 4 insertions(+) diff --git "a/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" "b/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" index fe882e0594..57a38404b2 100644 --- "a/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" +++ "b/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" @@ -491,7 +491,9 @@ int findLengthOfLCIS(int* nums, int numsSize) { return result; } ``` + ### Cangjie + ```cangjie func findLengthOfLCIS(nums: Array): Int64 { let n = nums.size diff --git "a/problems/0718.\346\234\200\351\225\277\351\207\215\345\244\215\345\255\220\346\225\260\347\273\204.md" "b/problems/0718.\346\234\200\351\225\277\351\207\215\345\244\215\345\255\220\346\225\260\347\273\204.md" index 19520d131d..1391926a76 100644 --- "a/problems/0718.\346\234\200\351\225\277\351\207\215\345\244\215\345\255\220\346\225\260\347\273\204.md" +++ "b/problems/0718.\346\234\200\351\225\277\351\207\215\345\244\215\345\255\220\346\225\260\347\273\204.md" @@ -582,6 +582,7 @@ int findLength(int* nums1, int nums1Size, int* nums2, int nums2Size) { ``` ### Cangjie + ```cangjie func findLength(nums1: Array, nums2: Array): Int64 { let n = nums1.size diff --git "a/problems/1143.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" "b/problems/1143.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" index 93df987e3d..25f3283864 100644 --- "a/problems/1143.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/1143.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" @@ -400,6 +400,7 @@ int longestCommonSubsequence(char* text1, char* text2) { ``` ### Cangjie + ```cangjie func longestCommonSubsequence(text1: String, text2: String): Int64 { let n = text1.size From 465129122676512c0ec83963e1138b0ad051ac7f Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Sat, 14 Sep 2024 11:22:01 +0800 Subject: [PATCH 2814/3019] Update --- ...20\345\255\227\347\254\246\344\270\262.md" | 199 ++++++++++++++++-- ...4.\347\233\256\346\240\207\345\222\214.md" | 39 +++- problems/kamacoder/.DS_Store | Bin 0 -> 6148 bytes ...27\344\275\231\350\277\236\346\216\245.md" | 53 ++++- ...7\232\204\346\224\273\345\207\273astar.md" | 32 +++ ...47\241\20001\350\203\214\345\214\205-2.md" | 46 ++-- 6 files changed, 319 insertions(+), 50 deletions(-) create mode 100644 problems/kamacoder/.DS_Store diff --git "a/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" "b/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" index 5142579681..254d921dbd 100644 --- "a/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" @@ -56,10 +56,66 @@ ![图二](https://code-thinking-1253855093.file.myqcloud.com/pics/20220728104931.png) -所以判断字符串s是否由重复子串组成,只要两个s拼接在一起,里面还出现一个s的话,就说明是由重复子串组成。 当然,我们在判断 s + s 拼接的字符串里是否出现一个s的的时候,**要刨除 s + s 的首字符和尾字符**,这样避免在s+s中搜索出原来的s,我们要搜索的是中间拼接出来的s。 + +以上证明的充分性,接下来证明必要性: + +如果有一个字符串s,在 s + s 拼接后, 不算首尾字符,如果能凑成s字符串,说明s 一定是重复子串组成。 + +如图,字符串s,图中数字为数组下标,在 s + s 拼接后, 不算首尾字符,中间凑成s字符串。 + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240910115555.png) + +图中,因为中间拼接成了s,根据红色框 可以知道 s[4] = s[0], s[5] = s[1], s[0] = s[2], s[1] = s[3] s[2] = s[4] ,s[3] = s[5] + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240910115819.png) + +以上相等关系我们串联一下: + +s[4] = s[0] = s[2] + +s[5] = s[1] = s[3] + + +即:s[4],s[5] = s[0],s[1] = s[2],s[3] + +**说明这个字符串,是由 两个字符 s[0] 和 s[1] 重复组成的**! + +这里可以有录友想,凭什么就是这样组成的s呢,我换一个方式组成s 行不行,如图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240910120751.png) + +s[3] = s[0],s[4] = s[1] ,s[5] = s[2],s[0] = s[3],s[1] = s[4],s[2] = s[5] + +以上相等关系串联: + +s[3] = s[0] + +s[1] = s[4] + +s[2] = s[5] + +s[0] s[1] s[2] = s[3] s[4] s[5] + +和以上推导过程一样,最后可以推导出,这个字符串是由 s[0] ,s[1] ,s[2] 重复组成。 + +如果是这样的呢,如图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240910121236.png) + +s[1] = s[0],s[2] = s[1] ,s[3] = s[2],s[4] = s[3],s[5] = s[4],s[0] = s[5] + +以上相等关系串联 + +s[0] = s[1] = s[2] = s[3] = s[4] = s[5] + +最后可以推导出,这个字符串是由 s[0] 重复组成。 + +以上 充分和必要性都证明了,所以判断字符串s是否由重复子串组成,只要两个s拼接在一起,里面还出现一个s的话,就说明是由重复子串组成。 + + 代码如下: ```CPP @@ -76,13 +132,14 @@ public: * 时间复杂度: O(n) * 空间复杂度: O(1) -不过这种解法还有一个问题,就是 我们最终还是要判断 一个字符串(s + s)是否出现过 s 的过程,大家可能直接用contains,find 之类的库函数。 却忽略了实现这些函数的时间复杂度(暴力解法是m * n,一般库函数实现为 O(m + n))。 +不过这种解法还有一个问题,就是 我们最终还是要判断 一个字符串(s + s)是否出现过 s 的过程,大家可能直接用contains,find 之类的库函数, 却忽略了实现这些函数的时间复杂度(暴力解法是m * n,一般库函数实现为 O(m + n))。 如果我们做过 [28.实现strStr](https://programmercarl.com/0028.实现strStr.html) 题目的话,其实就知道,**实现一个 高效的算法来判断 一个字符串中是否出现另一个字符串是很复杂的**,这里就涉及到了KMP算法。 ### KMP #### 为什么会使用KMP + 以下使用KMP方式讲解,强烈建议大家先把以下两个视频看了,理解KMP算法,再来看下面讲解,否则会很懵。 * [视频讲解版:帮你把KMP算法学个通透!(理论篇)](https://www.bilibili.com/video/BV1PD4y1o7nd/) @@ -91,7 +148,9 @@ public: 在一个串中查找是否出现过另一个串,这是KMP的看家本领。那么寻找重复子串怎么也涉及到KMP算法了呢? -KMP算法中next数组为什么遇到字符不匹配的时候可以找到上一个匹配过的位置继续匹配,靠的是有计算好的前缀表。 前缀表里,统计了各个位置为终点字符串的最长相同前后缀的长度。 +KMP算法中next数组为什么遇到字符不匹配的时候可以找到上一个匹配过的位置继续匹配,靠的是有计算好的前缀表。 + +前缀表里,统计了各个位置为终点字符串的最长相同前后缀的长度。 那么 最长相同前后缀和重复子串的关系又有什么关系呢。 @@ -100,16 +159,61 @@ KMP算法中next数组为什么遇到字符不匹配的时候可以找到上一 * 前缀是指不包含最后一个字符的所有以第一个字符开头的连续子串; * 后缀是指不包含第一个字符的所有以最后一个字符结尾的连续子串 -在由重复子串组成的字符串中,最长相等前后缀不包含的子串就是最小重复子串,这里拿字符串s:abababab 来举例,ab就是最小重复单位,如图所示: +#### 充分性证明 + +如果一个字符串s是由重复子串组成,那么 最长相等前后缀不包含的子串一定是字符串s的最小重复子串。 + +证明: 如果s 是有是有最小重复子串p组成。 + +即 s = n * p + +那么相同前后缀可以是这样: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240913110257.png) + +也可以是这样: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240913110316.png) + +最长的相等前后缀,也就是这样: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240913110841.png) + +这里有录友就想:如果字符串s 是有是有最小重复子串p组成,最长相等前后缀就不能更长一些? 例如这样: -![图三](https://code-thinking-1253855093.file.myqcloud.com/pics/20220728205249.png) +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240913114348.png) +如果这样的话,因为前后缀要相同,所以 p2 = p1,p3 = p2,如图: -#### 如何找到最小重复子串 +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240913114818.png) -这里有同学就问了,为啥一定是开头的ab呢。 其实最关键还是要理解 最长相等前后缀,如图: +p2 = p1,p3 = p2 即: p1 = p2 = p3 -![图四](https://code-thinking-1253855093.file.myqcloud.com/pics/20220728212157.png) +说明 p = p1 * 3。 + +这样p 就不是最小重复子串了,不符合我们定义的条件。 + +所以,**如果这个字符串s是由重复子串组成,那么最长相等前后缀不包含的子串是字符串s的最小重复子串**。 + +#### 必要性证明 + +以上是充分性证明,以下是必要性证明: + +**如果 最长相等前后缀不包含的子串是字符串s的最小重复子串, 那么字符串s一定由重复子串组成吗**? + +最长相等前后缀不包含的子串已经是字符串s的最小重复子串,那么字符串s一定由重复子串组成,这个不需要证明了。 + +关键是要要证明:最长相等前后缀不包含的子串什么时候才是字符串s的最小重复子串呢。 + +情况一, 最长相等前后缀不包含的子串的长度 比 字符串s的一半的长度还大,那一定不是字符串s的重复子串 + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240911110236.png) + +-------------- + +情况二,最长相等前后缀不包含的子串的长度 可以被 字符串s的长度整除,如图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240910174249.png) 步骤一:因为 这是相等的前缀和后缀,t[0] 与 k[0]相同, t[1] 与 k[1]相同,所以 s[0] 一定和 s[2]相同,s[1] 一定和 s[3]相同,即:,s[0]s[1]与s[2]s[3]相同 。 @@ -121,28 +225,79 @@ KMP算法中next数组为什么遇到字符不匹配的时候可以找到上一 所以字符串s,s[0]s[1]与s[2]s[3]相同, s[2]s[3] 与 s[4]s[5]相同,s[4]s[5] 与 s[6]s[7] 相同。 -正是因为 最长相等前后缀的规则,当一个字符串由重复子串组成的,最长相等前后缀不包含的子串就是最小重复子串。 +可以推出,在由重复子串组成的字符串中,最长相等前后缀不包含的子串就是最小重复子串。 + +即 s[0]s[1] 是最小重复子串 + + +以上推导中,录友可能想,你怎么知道 s[0] 和 s[1] 就不相同呢? s[0] 为什么就不能使最小重复子串。 + +如果 s[0] 和 s[1] 也相同,同时 s[0]s[1]与s[2]s[3]相同,s[2]s[3] 与 s[4]s[5]相同,s[4]s[5] 与 s[6]s[7] 相同,那么这个字符串就是有一个字符构成的字符串。 + +那么它的最长相同前后缀,就不是上图中的前后缀,而是这样的的前后缀: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240910175053.png) + +录友可能再问,由一个字符组成的字符串,最长相等前后缀凭什么就是这样的。 + +有这种疑惑的录友,就是还不知道 最长相等前后缀 是怎么算的。 + +可以看这里:[KMP讲解](https://programmercarl.com/0028.%E5%AE%9E%E7%8E%B0strStr.html),再去回顾一下。 -#### 简单推理 +或者说,自己举个例子,`aaaaaa`,这个字符串,他的最长相等前后缀是什么? -这里再给出一个数学推导,就容易理解很多。 +同上以上推导,最长相等前后缀不包含的子串的长度只要被 字符串s的长度整除,就是一定是最小重复子串。 -假设字符串s使用多个重复子串构成(这个子串是最小重复单位),重复出现的子字符串长度是x,所以s是由n * x组成。 +---------------- -因为字符串s的最长相同前后缀的长度一定是不包含s本身,所以 最长相同前后缀长度必然是m * x,而且 n - m = 1,(这里如果不懂,看上面的推理) +**情况三,最长相等前后缀不包含的子串的长度 不被 字符串s的长度整除得情况**,如图: -所以如果 nx % (n - m)x = 0,就可以判定有重复出现的子字符串。 +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240913115854.png) -next 数组记录的就是最长相同前后缀 [字符串:KMP算法精讲](https://programmercarl.com/0028.实现strStr.html) 这里介绍了什么是前缀,什么是后缀,什么又是最长相同前后缀), 如果 next[len - 1] != -1,则说明字符串有最长相同的前后缀(就是字符串里的前缀子串和后缀子串相同的最长长度)。 -最长相等前后缀的长度为:next[len - 1] + 1。(这里的next数组是以统一减一的方式计算的,因此需要+1,两种计算next数组的具体区别看这里:[字符串:KMP算法精讲](https://programmercarl.com/0028.实现strStr.html)) +步骤一:因为 这是相等的前缀和后缀,t[0] 与 k[0]相同, t[1] 与 k[1]相同,t[2] 与 k[2]相同。 + +所以 s[0] 与 s[3]相同,s[1] 与 s[4]相同,s[2] 与s[5],即:,s[0]s[1]与s[2]s[3]相同 。 + +步骤二: 因为在同一个字符串位置,所以 t[3] 与 k[0]相同,t[4] 与 k[1]相同。 + + +步骤三: 因为 这是相等的前缀和后缀,t[3] 与 k[3]相同 ,t[4]与k[5] 相同,所以,s[3]一定和s[6]相同,s[4]一定和s[7]相同,即:s[3]s[4] 与 s[6]s[7]相同。 + + +以上推导,可以得出 s[0],s[1],s[2] 与 s[3],s[4],s[5] 相同,s[3]s[4] 与 s[6]s[7]相同。 + +那么 最长相等前后缀不包含的子串的长度 不被 字符串s的长度整除 ,就不是s的重复子串 + +----------- + +充分条件:如果字符串s是由重复子串组成,那么 最长相等前后缀不包含的子串 一定是 s的最小重复子串。 + +必要条件:如果字符串s的最长相等前后缀不包含的子串 是 s最小重复子串,那么 s是由重复子串组成。 + +在必要条件,这个是 显而易见的,都已经假设 最长相等前后缀不包含的子串 是 s的最小重复子串了,那s必然是重复子串。 + +关键是需要证明, 字符串s的最长相等前后缀不包含的子串 什么时候才是 s最小重复子串。 + +同上我们证明了,当 最长相等前后缀不包含的子串的长度 可以被 字符串s的长度整除,那么不包含的子串 就是s的最小重复子串。 + + +------------- + + +### 代码分析 + +next 数组记录的就是最长相同前后缀( [字符串:KMP算法精讲](https://programmercarl.com/0028.实现strStr.html)), 如果 `next[len - 1] != -1`,则说明字符串有最长相同的前后缀(就是字符串里的前缀子串和后缀子串相同的最长长度)。 + +最长相等前后缀的长度为:`next[len - 1] + 1`。(这里的next数组是以统一减一的方式计算的,因此需要+1,两种计算next数组的具体区别看这里:[字符串:KMP算法精讲](https://programmercarl.com/0028.实现strStr.html)) 数组长度为:len。 -如果len % (len - (next[len - 1] + 1)) == 0 ,则说明数组的长度正好可以被 (数组长度-最长相等前后缀的长度) 整除 ,说明该字符串有重复的子字符串。 +`len - (next[len - 1] + 1)` 是最长相等前后缀不包含的子串的长度。 -**数组长度减去最长相同前后缀的长度相当于是第一个周期的长度,也就是一个周期的长度,如果这个周期可以被整除,就说明整个数组就是这个周期的循环。** +如果`len % (len - (next[len - 1] + 1)) == 0` ,则说明数组的长度正好可以被 最长相等前后缀不包含的子串的长度 整除 ,说明该字符串有重复的子字符串。 +### 打印数组 **强烈建议大家把next数组打印出来,看看next数组里的规律,有助于理解KMP算法** @@ -150,10 +305,14 @@ next 数组记录的就是最长相同前后缀 [字符串:KMP算法精讲](ht ![459.重复的子字符串_1](https://code-thinking.cdn.bcebos.com/pics/459.重复的子字符串_1.png) -next[len - 1] = 7,next[len - 1] + 1 = 8,8就是此时字符串asdfasdfasdf的最长相同前后缀的长度。 +`next[len - 1] = 7`,`next[len - 1] + 1 = 8`,8就是此时字符串asdfasdfasdf的最长相同前后缀的长度。 + +`(len - (next[len - 1] + 1))` 也就是: 12(字符串的长度) - 8(最长公共前后缀的长度) = 4, 为最长相同前后缀不包含的子串长度 + -(len - (next[len - 1] + 1)) 也就是: 12(字符串的长度) - 8(最长公共前后缀的长度) = 4, 4正好可以被 12(字符串的长度) 整除,所以说明有重复的子字符串(asdf)。 +4可以被 12(字符串的长度) 整除,所以说明有重复的子字符串(asdf)。 +### 打码实现 C++代码如下:(这里使用了前缀表统一减一的实现方式) diff --git "a/problems/0494.\347\233\256\346\240\207\345\222\214.md" "b/problems/0494.\347\233\256\346\240\207\345\222\214.md" index 82d330b727..19d34e4f94 100644 --- "a/problems/0494.\347\233\256\346\240\207\345\222\214.md" +++ "b/problems/0494.\347\233\256\346\240\207\345\222\214.md" @@ -61,7 +61,7 @@ left + right = sum,而sum是固定的。right = sum - left -公式来了, left - (sum - left) = target 推导出 left = (target + sum)/2 。 +left - (sum - left) = target 推导出 left = (target + sum)/2 。 target是固定的,sum是固定的,left就可以求出来。 @@ -126,7 +126,7 @@ public: x = (target + sum) / 2 -**此时问题就转化为,装满容量为x的背包,有几种方法**。 +**此时问题就转化为,用nums装满容量为x的背包,有几种方法**。 这里的x,就是bagSize,也就是我们后面要求的背包容量。 @@ -161,6 +161,8 @@ if (abs(target) > sum) return 0; // 此时没有方案 我们先手动推导一下,这个二维数组里面的数值。 +------------ + 先只考虑物品0,如图: ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240808161747.png) @@ -173,6 +175,8 @@ if (abs(target) > sum) return 0; // 此时没有方案 装满背包容量为2 的方法个数是0,目前没有办法能装满容量为2的背包。 +-------------- + 接下来 考虑 物品0 和 物品1,如图: ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240808162052.png) @@ -185,6 +189,8 @@ if (abs(target) > sum) return 0; // 此时没有方案 其他容量都不能装满,所以方法是0。 +----------------- + 接下来 考虑 物品0 、物品1 和 物品2 ,如图: ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240808162533.png) @@ -193,10 +199,12 @@ if (abs(target) > sum) return 0; // 此时没有方案 装满背包容量为1 的方法个数是3,即 放物品0 或者 放物品1 或者 放物品2。 -装满背包容量为2 的方法个数是3,即 放物品0 和 放物品1、放物品0 和 物品 2、 放物品1 和 物品2。 +装满背包容量为2 的方法个数是3,即 放物品0 和 放物品1、放物品0 和 物品2、放物品1 和 物品2。 装满背包容量为3的方法个数是1,即 放物品0 和 物品1 和 物品2。 +--------------- + 通过以上举例,我们来看 dp[2][2] 可以有哪些方向推出来。 如图红色部分: @@ -229,7 +237,7 @@ dp[2][2] = 3,即 放物品0 和 放物品1、放物品0 和 物品 2、放物 在上面图中,你把物品2补上就好,同样是两种方法。 -dp[2][2] = 容量为2的背包不放物品2有几种方法 + 容量为2的背包不放物品2有几种方法 +dp[2][2] = 容量为2的背包不放物品2有几种方法 + 容量为2的背包放物品2有几种方法 所以 dp[2][2] = dp[1][2] + dp[1][1] ,如图: @@ -284,6 +292,29 @@ dp[0][j]:只放物品0, 把容量为j的背包填满有几种方法。 即 dp[i][0] = 1 +但这里有例外,就是如果 物品数值就是0呢? + +如果有两个物品,物品0为0, 物品1为0,装满背包容量为0的方法有几种。 + +* 放0件物品 +* 放物品0 +* 放物品1 +* 放物品0 和 物品1 + +此时是有4种方法。 + +其实就是算数组里有t个0,然后按照组合数量求,即 2^t 。 + +初始化如下: + +```CPP +int numZero = 0; +for (int i = 0; i < nums.size(); i++) { + if (nums[i] == 0) numZero++; + dp[i][0] = (int) pow(2.0, numZero); +} +``` + 4. 确定遍历顺序 在明确递推方向时,我们知道 当前值 是由上方和左上方推出。 diff --git a/problems/kamacoder/.DS_Store b/problems/kamacoder/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..5008ddfcf53c02e82d7eee2e57c38e5672ef89f6 GIT binary patch literal 6148 zcmeH~Jr2S!425mzP>H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0= costs[i]; j--) { + // 考虑当前研究材料选择和不选择的情况,选择最大值 + dp[j] = Math.max(dp[j], dp[j - costs[i]] + values[i]); } } - System.out.println(dp[n - 1][bagweight]); + // 输出 dp[N],即在给定 N 行李空间可以携带的研究材料的最大价值 + System.out.println(dp[N]); + + scanner.close(); } } From 2de1a8647fc7eec86042f16bd8191b6dd5b48587 Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Sat, 14 Sep 2024 12:01:45 +0800 Subject: [PATCH 2815/3019] =?UTF-8?q?=E7=A7=BB=E5=8A=A8=E9=9D=9E=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E9=9A=8F=E6=83=B3=E5=BD=95=E4=BD=93=E7=B3=BB=E9=A2=98?= =?UTF-8?q?=E7=9B=AE=E5=88=B0=E5=8D=A1=E7=A0=81=E7=BD=91=E4=BB=93=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...66\350\241\214\345\210\227\345\274\217.md" | 27 -- .../0112.\346\214\221\346\210\230boss.md" | 26 -- ...75\351\231\205\350\261\241\346\243\213.md" | 59 ----- ...04\345\271\263\345\235\207\346\225\260.md" | 29 --- ...04\350\243\205\346\211\213\346\234\272.md" | 67 ----- ...47\346\225\260\345\207\217\346\263\225.md" | 91 ------- ...72\351\227\264\347\277\273\350\275\254.md" | 132 ---------- ...43\346\234\200\345\244\247\345\200\274.md" | 127 ---------- ...60\347\273\204\346\236\204\351\200\240.md" | 52 ---- ...76\345\215\216\345\270\226\345\255\220.md" | 38 --- ...04\346\234\200\345\244\247\345\222\214.md" | 66 ----- ...22\345\210\227\350\257\242\351\227\256.md" | 29 --- ...16\350\265\260\345\205\254\350\267\257.md" | 35 --- ...13\347\263\225\345\210\207\345\211\262.md" | 51 ---- ...46\344\270\262\345\217\230\346\215\242.md" | 78 ------ ...21\344\270\212\346\237\223\350\211\262.md" | 134 ---------- ...2.\345\244\271\345\220\203\346\227\227.md" | 47 ---- ...00\345\260\217\346\255\245\346\225\260.md" | 77 ------ ...02\347\202\271\345\210\227\350\241\250.md" | 147 ----------- ...62\345\244\204\347\220\206\345\231\250.md" | 148 ----------- ...10\346\201\257\344\274\240\350\276\223.md" | 192 -------------- ...9.\345\217\257\347\210\261\344\270\262.md" | 101 -------- ...9.\345\256\214\347\276\216\346\225\260.md" | 29 --- ...75\344\272\214\345\217\211\346\240\221.md" | 104 -------- ...40\351\231\244\346\200\273\345\222\214.md" | 108 -------- ...14\345\200\274\350\267\257\345\276\204.md" | 237 ------------------ ...01\345\255\227\347\254\246\344\270\262.md" | 66 ----- ...27\347\232\204\346\216\222\345\210\227.md" | 98 -------- ...6.\344\274\240\351\200\201\346\240\221.md" | 65 ----- ...11\347\217\240\344\272\222\346\226\245.md" | 78 ------ ...14\345\220\214\350\212\261\351\241\272.md" | 122 --------- ...9.\345\245\275\346\225\260\347\273\204.md" | 102 -------- ...65\347\232\204\346\235\203\345\200\274.md" | 66 ----- ...14\347\232\204\347\247\230\345\257\206.md" | 127 ---------- ...32\344\277\241\346\240\241\345\207\206.md" | 121 --------- ...57\345\276\204\350\256\241\346\225\260.md" | 95 ------- ...27\344\270\255\344\275\215\346\225\260.md" | 68 ----- ...40\351\231\244\344\273\243\344\273\267.md" | 106 -------- ...30\346\226\227\345\272\217\345\210\227.md" | 68 ----- ...01\345\244\215\346\235\202\345\272\246.md" | 59 ----- ...14\344\275\231\346\226\271\347\250\213.md" | 50 ---- ...64\346\225\260\344\271\230\346\263\225.md" | 62 ----- ...04\346\212\230\347\272\277\346\256\265.md" | 88 ------- ...04\345\220\210\345\270\226\345\255\220.md" | 61 ----- ...30\347\247\200\346\225\260\347\273\204.md" | 88 ------- ...07\345\272\217\346\225\260\347\273\204.md" | 81 ------ ...40\351\207\215\345\244\215\344\270\262.md" | 82 ------ 47 files changed, 3984 deletions(-) delete mode 100644 "problems/kamacoder/0111.\346\236\204\351\200\240\344\272\214\351\230\266\350\241\214\345\210\227\345\274\217.md" delete mode 100644 "problems/kamacoder/0112.\346\214\221\346\210\230boss.md" delete mode 100644 "problems/kamacoder/0113.\345\233\275\351\231\205\350\261\241\346\243\213.md" delete mode 100644 "problems/kamacoder/0114.\345\260\217\346\254\247\347\232\204\345\271\263\345\235\207\346\225\260.md" delete mode 100644 "problems/kamacoder/0115.\347\273\204\350\243\205\346\211\213\346\234\272.md" delete mode 100644 "problems/kamacoder/0121.\345\244\247\346\225\260\345\207\217\346\263\225.md" delete mode 100644 "problems/kamacoder/0121.\345\260\217\347\272\242\347\232\204\345\214\272\351\227\264\347\277\273\350\275\254.md" delete mode 100644 "problems/kamacoder/0122.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" delete mode 100644 "problems/kamacoder/0123.\345\260\217\347\272\242\347\232\204\346\225\260\347\273\204\346\236\204\351\200\240.md" delete mode 100644 "problems/kamacoder/0124.\347\262\276\345\215\216\345\270\226\345\255\220.md" delete mode 100644 "problems/kamacoder/0125.\350\277\236\347\273\255\345\255\220\346\225\260\347\273\204\346\234\200\345\244\247\345\222\214.md" delete mode 100644 "problems/kamacoder/0127.\345\260\217\347\276\216\347\232\204\346\216\222\345\210\227\350\257\242\351\227\256.md" delete mode 100644 "problems/kamacoder/0128.\345\260\217\347\276\216\350\265\260\345\205\254\350\267\257.md" delete mode 100644 "problems/kamacoder/0129.\345\260\217\347\276\216\347\232\204\350\233\213\347\263\225\345\210\207\345\211\262.md" delete mode 100644 "problems/kamacoder/0130.\345\260\217\347\276\216\347\232\204\345\255\227\347\254\246\344\270\262\345\217\230\346\215\242.md" delete mode 100644 "problems/kamacoder/0131.\345\260\217\347\276\216\347\232\204\346\240\221\344\270\212\346\237\223\350\211\262.md" delete mode 100644 "problems/kamacoder/0132.\345\244\271\345\220\203\346\227\227.md" delete mode 100644 "problems/kamacoder/0134.\347\232\207\345\220\216\347\247\273\345\212\250\347\232\204\346\234\200\345\260\217\346\255\245\346\225\260.md" delete mode 100644 "problems/kamacoder/0135.\350\216\267\345\217\226\350\277\236\351\200\232\347\232\204\347\233\270\351\202\273\350\212\202\347\202\271\345\210\227\350\241\250.md" delete mode 100644 "problems/kamacoder/0136.\345\255\227\347\254\246\344\270\262\345\244\204\347\220\206\345\231\250.md" delete mode 100644 "problems/kamacoder/0137.\346\266\210\346\201\257\344\274\240\350\276\223.md" delete mode 100644 "problems/kamacoder/0139.\345\217\257\347\210\261\344\270\262.md" delete mode 100644 "problems/kamacoder/0139.\345\256\214\347\276\216\346\225\260.md" delete mode 100644 "problems/kamacoder/0141.\345\245\275\344\272\214\345\217\211\346\240\221.md" delete mode 100644 "problems/kamacoder/0142.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\346\234\200\345\260\217ASCII\345\210\240\351\231\244\346\200\273\345\222\214.md" delete mode 100644 "problems/kamacoder/0143.\346\234\200\351\225\277\345\220\214\345\200\274\350\267\257\345\276\204.md" delete mode 100644 "problems/kamacoder/0144.\345\255\227\345\205\270\345\272\217\346\234\200\345\260\217\347\232\20401\345\255\227\347\254\246\344\270\262.md" delete mode 100644 "problems/kamacoder/0145.\346\225\260\347\273\204\345\255\220\345\272\217\345\210\227\347\232\204\346\216\222\345\210\227.md" delete mode 100644 "problems/kamacoder/0146.\344\274\240\351\200\201\346\240\221.md" delete mode 100644 "problems/kamacoder/0147.\344\270\211\347\217\240\344\272\222\346\226\245.md" delete mode 100644 "problems/kamacoder/0148.\346\211\221\345\205\213\347\211\214\345\220\214\350\212\261\351\241\272.md" delete mode 100644 "problems/kamacoder/0149.\345\245\275\346\225\260\347\273\204.md" delete mode 100644 "problems/kamacoder/0150.\346\236\201\351\225\277\350\277\236\347\273\255\346\256\265\347\232\204\346\235\203\345\200\274.md" delete mode 100644 "problems/kamacoder/0151.\346\211\213\346\234\272\346\265\201\347\225\205\350\277\220\350\241\214\347\232\204\347\247\230\345\257\206.md" delete mode 100644 "problems/kamacoder/0152.\345\260\217\347\261\263\346\211\213\346\234\272\351\200\232\344\277\241\346\240\241\345\207\206.md" delete mode 100644 "problems/kamacoder/0153.\346\235\203\345\200\274\344\274\230\345\212\277\350\267\257\345\276\204\350\256\241\346\225\260.md" delete mode 100644 "problems/kamacoder/0154.\345\272\217\345\210\227\344\270\255\344\275\215\346\225\260.md" delete mode 100644 "problems/kamacoder/0155.\346\234\200\345\260\217\345\214\226\351\242\221\347\216\207\347\232\204\345\210\240\351\231\244\344\273\243\344\273\267.md" delete mode 100644 "problems/kamacoder/0156.\345\213\207\346\225\242\347\211\233\347\211\233\346\210\230\346\226\227\345\272\217\345\210\227.md" delete mode 100644 "problems/kamacoder/0157.\346\234\200\345\244\247\345\214\226\345\257\206\347\240\201\345\244\215\346\235\202\345\272\246.md" delete mode 100644 "problems/kamacoder/0158.\345\220\214\344\275\231\346\226\271\347\250\213.md" delete mode 100644 "problems/kamacoder/0159.\345\244\247\346\225\264\346\225\260\344\271\230\346\263\225.md" delete mode 100644 "problems/kamacoder/0160.\344\272\214\347\273\264\345\271\263\351\235\242\344\270\212\347\232\204\346\212\230\347\272\277\346\256\265.md" delete mode 100644 "problems/kamacoder/0161.\350\256\250\345\216\214\351\254\274\347\232\204\347\273\204\345\220\210\345\270\226\345\255\220.md" delete mode 100644 "problems/kamacoder/0163.\344\274\230\347\247\200\346\225\260\347\273\204.md" delete mode 100644 "problems/kamacoder/0164.\345\215\207\345\272\217\346\225\260\347\273\204.md" delete mode 100644 "problems/kamacoder/0165.\346\234\200\345\244\247\345\255\227\345\205\270\345\272\217\346\227\240\351\207\215\345\244\215\344\270\262.md" diff --git "a/problems/kamacoder/0111.\346\236\204\351\200\240\344\272\214\351\230\266\350\241\214\345\210\227\345\274\217.md" "b/problems/kamacoder/0111.\346\236\204\351\200\240\344\272\214\351\230\266\350\241\214\345\210\227\345\274\217.md" deleted file mode 100644 index efb304ebd1..0000000000 --- "a/problems/kamacoder/0111.\346\236\204\351\200\240\344\272\214\351\230\266\350\241\214\345\210\227\345\274\217.md" +++ /dev/null @@ -1,27 +0,0 @@ - -# 111. 构造二阶行列式 - -暴力模拟就好,每个数不超过 20, 暴力枚举其实也没多大。 - -```CPP -#include -using namespace std; -int main() { - int n; - cin >> n; - for (int x = 1; x <= 20; x++) { - for (int y = 1; y <= 20; y++) { - for (int i = 1; i <= 20; i++) { - for (int j = 1; j <= 20; j++) { - if ((x * j - y * i) == n) { - cout << x << " " << y << endl; - cout << i << " " << j << endl; - return 0; - } - } - } - } - } - cout << -1 << endl; -} -``` diff --git "a/problems/kamacoder/0112.\346\214\221\346\210\230boss.md" "b/problems/kamacoder/0112.\346\214\221\346\210\230boss.md" deleted file mode 100644 index 781fb6e802..0000000000 --- "a/problems/kamacoder/0112.\346\214\221\346\210\230boss.md" +++ /dev/null @@ -1,26 +0,0 @@ - -# 112. 挑战boss - -本题题意有点绕,注意看一下 题目描述中的【提示信息】,但是在笔试中,是不给这样的提示信息的。 - -简单模拟: - -```CPP -#include -using namespace std; -int main() { - int n, a, b, k = 0; - cin >> n >> a >> b; - string s; - cin >> s; - int result = 0; - for (int i = 0; i < s.size(); i++) { - int cur = a + k * b; - result += cur; - ++k; - if (s[i] == 'x') k = 0; - } - cout << result << endl; - return 0; -} -``` diff --git "a/problems/kamacoder/0113.\345\233\275\351\231\205\350\261\241\346\243\213.md" "b/problems/kamacoder/0113.\345\233\275\351\231\205\350\261\241\346\243\213.md" deleted file mode 100644 index 966aced348..0000000000 --- "a/problems/kamacoder/0113.\345\233\275\351\231\205\350\261\241\346\243\213.md" +++ /dev/null @@ -1,59 +0,0 @@ - -# 113.国际象棋 - -广搜,但本题如果广搜枚举马和象的话会超时。 - -广搜要只枚举马的走位,同时判断是否在对角巷直接走象 - -```CPP -#include -using namespace std; -const int N = 100005, mod = 1000000007; -using ll = long long; -int n, ans; -int dir[][2] = {{1, 2}, {1, -2}, {-1, 2}, {-1, -2}, {2, 1}, {2, -1}, {-2, -1}, {-2, 1}}; -int main() { - int x1, y1, x2, y2; - cin >> n; - while (n--) { - scanf("%d%d%d%d", &x1, &y1, &x2, &y2); - if (x1 == x2 && y1 == y2) { - cout << 0 << endl; - continue; - } - // 判断象走一步到达 - int d = abs(x1 - x2) - abs(y1 - y2); - if (!d) {cout << 1 << endl; continue;} - // 判断马走一步到达 - bool one = 0; - for (int i = 0; i < 8; ++i) { - int dx = x1 + dir[i][0], dy = y1 + dir[i][1]; - if (dx == x2 && dy == y2) { - cout << 1 << endl; - one = true; - break; - } - } - if (one) continue; - // 接下来为两步的逻辑, 象走两步或者马走一步,象走一步 - // 象直接两步可以到达,这个计算是不是同颜色的格子,象可以在两步到达所有同颜色的格子 - int d2 = abs(x1 - x2) + abs(y1 - y2); - if (d2 % 2 == 0) { - cout << 2 << endl; - continue; - } - // 接下来判断马 + 象的组合 - bool two = 0; - for (int i = 0; i < 8; ++i) { - int dx = x1 + dir[i][0], dy = y1 + dir[i][1]; - int d = abs(dx - x2) - abs(dy - y2); - if (!d) {cout << 2 << endl; two = true; break;} - } - if (two) continue; - // 剩下的格子全都是三步到达的 - cout << 3 << endl; - } - return 0; -} - -``` diff --git "a/problems/kamacoder/0114.\345\260\217\346\254\247\347\232\204\345\271\263\345\235\207\346\225\260.md" "b/problems/kamacoder/0114.\345\260\217\346\254\247\347\232\204\345\271\263\345\235\207\346\225\260.md" deleted file mode 100644 index 1188d9159d..0000000000 --- "a/problems/kamacoder/0114.\345\260\217\346\254\247\347\232\204\345\271\263\345\235\207\346\225\260.md" +++ /dev/null @@ -1,29 +0,0 @@ - -# 114. 小欧的平均数 - -这道题非常的脑筋急转弯, 读题都要理解半天。 - -初步读题,感觉好像是求 如何最小加减,得到三个数的平均数。 - -但题意不是这样的。 - -小欧的说的三个数平衡,只是三个数里 任何两个数 相加都能被2整除, 那么 也就是说,这三个数 要么都是 奇数,要么都是偶数,才能达到小欧所说的平衡。 - -所以题目要求的,就是,三个数,最小加减1 几次 可以让三个数都变成奇数,或者都变成偶数。 - -所以最终的结果 不是1 就是0,没有其他的。 - -录友可能想,题目出的这么绕干啥? 没办法,企业的笔试题就是这样的。 - -```CPP -#include -#include -using namespace std; -int main() { - int x, y, z; - cin >> x >> y >> z; - int count = (x % 2 == 0) + (y % 2 == 0) + (z % 2 == 0); - cout << min(3 - count, count); -} -``` - diff --git "a/problems/kamacoder/0115.\347\273\204\350\243\205\346\211\213\346\234\272.md" "b/problems/kamacoder/0115.\347\273\204\350\243\205\346\211\213\346\234\272.md" deleted file mode 100644 index 8cae4a78a5..0000000000 --- "a/problems/kamacoder/0115.\347\273\204\350\243\205\346\211\213\346\234\272.md" +++ /dev/null @@ -1,67 +0,0 @@ - -# 115. 组装手机 - -这道题是比较难得哈希表题目。 把代码随想录哈希表章节理解透彻,做本题没问题。 - -思路是 - -1. 用哈希表记录 外壳售价 和 手机零件售价 出现的次数 -2. 记录总和出现的次数 -3. 遍历总和,减去 外壳售价,看 手机零件售价出现了几次 -4. 最后累加,取最大值 - -有一个需要注意的点: 数字可以重复,在计算个数的时候,如果计算重复的数字 - -例如 如果输入是 - -``` -4 -1 1 1 1 -1 1 1 1 -``` -那么输出应该是 4, 外壳售价 和 手机零件售价 是可以重复的。 - -代码如下: - -```CPP -#include -#include -#include -#include -using namespace std; -int main() { - int n; - cin >> n; - vector aVec(n, 0); - vector bVec(n, 0); - unordered_map aUmap; - unordered_map bUmap; - for (int i = 0; i < n; i++) { - cin >> aVec[i]; - aUmap[aVec[i]]++; - } - for (int i = 0; i < n; i++) { - cin >> bVec[i]; - bUmap[bVec[i]]++; - } - unordered_set uset; - for (int i = 0; i < n; i++) { - for (int j = 0; j < n; j++){ - uset.insert(aVec[i] + bVec[j]); - } - } - int result = 0; - for (int sum : uset) { - //cout << p.first << endl; - int count = 0; - for (pair p : aUmap) { - //cout << p.first - aVec[i] << endl; - if (sum - p.first > 0 && bUmap[sum - p.first] != 0) { - count += min(bUmap[sum - p.first], p.second); - } - } - result = max(result, count); - } - cout << result << endl; -} -``` diff --git "a/problems/kamacoder/0121.\345\244\247\346\225\260\345\207\217\346\263\225.md" "b/problems/kamacoder/0121.\345\244\247\346\225\260\345\207\217\346\263\225.md" deleted file mode 100644 index 84d55249fd..0000000000 --- "a/problems/kamacoder/0121.\345\244\247\346\225\260\345\207\217\346\263\225.md" +++ /dev/null @@ -1,91 +0,0 @@ - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

- -# 大数减法 - -本题测试数据超过int 和 longlong了,所以考察的使用 string 来模拟 两个大数的 加减操作。 - -当然如果使用python或者Java 使用库函数都可以水过。 - -使用字符串来模拟过程,需要处理以下几个问题: - -* 负号处理:要考虑正负数的处理,如果大数相减的结果是负数,需要在结果前加上负号。 -* 大数比较:在进行减法之前,需要确定哪个数大,以便知道结果是否需要添加负号。 -* 位数借位:处理大数相减时的借位问题,这类似于手动减法。 - -```CPP -#include -#include -#include -using namespace std; - -// 比较两个字符串表示的数字,返回1表示a > b,0表示a == b,-1表示a < b -int compareStrings(const string& a, const string& b) { - if (a.length() > b.length()) return 1; - if (a.length() < b.length()) return -1; - return a.compare(b); -} - -// 去除字符串左侧的前导零 -string removeLeadingZeros(const string& num) { - size_t start = 0; - while (start < num.size() && num[start] == '0') { - start++; - } - return start == num.size() ? "0" : num.substr(start); -} - -// 大数相减,假设a >= b -string subtractStrings(const string& a, const string& b) { - string result; - int len1 = a.length(), len2 = b.length(); - int carry = 0; - - for (int i = 0; i < len1; i++) { - int digitA = a[len1 - 1 - i] - '0'; - int digitB = i < len2 ? b[len2 - 1 - i] - '0' : 0; - - int digit = digitA - digitB - carry; - if (digit < 0) { - digit += 10; - carry = 1; - } else { - carry = 0; - } - - result.push_back(digit + '0'); - } - - // 去除结果中的前导零 - reverse(result.begin(), result.end()); - return removeLeadingZeros(result); -} - -string subtractLargeNumbers(const string& num1, const string& num2) { - string a = num1, b = num2; - - // 比较两个数的大小 - int cmp = compareStrings(a, b); - - if (cmp == 0) { - return "0"; // 如果两个数相等,结果为0 - } else if (cmp < 0) { - // 如果a < b,交换它们并在结果前加上负号 - swap(a, b); - return "-" + subtractStrings(a, b); - } else { - return subtractStrings(a, b); - } -} - -int main() { - string num1, num2; - cin >> num1 >> num2; - - string result = subtractLargeNumbers(num1, num2); - cout << result << endl; - - return 0; -} - -``` diff --git "a/problems/kamacoder/0121.\345\260\217\347\272\242\347\232\204\345\214\272\351\227\264\347\277\273\350\275\254.md" "b/problems/kamacoder/0121.\345\260\217\347\272\242\347\232\204\345\214\272\351\227\264\347\277\273\350\275\254.md" deleted file mode 100644 index 6e10aab7b8..0000000000 --- "a/problems/kamacoder/0121.\345\260\217\347\272\242\347\232\204\345\214\272\351\227\264\347\277\273\350\275\254.md" +++ /dev/null @@ -1,132 +0,0 @@ - -# 121. 小红的区间翻转 - -比较暴力的方式,就是直接模拟, 枚举所有 区间,然后检查其翻转的情况。 - -在检查翻转的时候,需要一些代码优化,否则容易超时。 - -```CPP -#include -#include -using namespace std; - -bool canTransform(const vector& a, const vector& b, int left, int right) { - // 提前检查翻转区间的值是否可以匹配 - for (int i = left, j = right; i <= right; i++, j--) { - if (a[i] != b[j]) { - return false; - } - } - // 检查翻转区间外的值是否匹配 - for (int i = 0; i < left; i++) { - if (a[i] != b[i]) { - return false; - } - } - for (int i = right + 1; i < a.size(); i++) { - if (a[i] != b[i]) { - return false; - } - } - return true; -} - -int main() { - int n; - cin >> n; - - vector a(n); - vector b(n); - - for (int i = 0; i < n; i++) { - cin >> a[i]; - } - - for (int i = 0; i < n; i++) { - cin >> b[i]; - } - - int count = 0; - - // 遍历所有可能的区间 - for (int left = 0; left < n; left++) { - for (int right = left; right < n; right++) { - // 检查翻转区间 [left, right] 后,a 是否可以变成 b - if (canTransform(a, b, left, right)) { - count++; - } - } - } - cout << count << endl; - return 0; -} -``` - -也可以事先计算好,最长公共前缀,和最长公共后缀。 - -在公共前缀和公共后缀之间的部分进行翻转操作,这样我们可以减少很多不必要的翻转尝试。 - -通过在公共前缀和后缀之间的部分,找到可以通过翻转使得 a 和 b 相等的区间。 - -以下 为评论区 卡码网用户:码鬼的C++代码 - -```CPP -#include -#include - -using namespace std; - -int main() { - int n; - cin >> n; - vector a(n), b(n); - for (int i = 0; i < n; i++) { - cin >> a[i]; - } - for (int i = 0; i < n; i++) { - cin >> b[i]; - } - - vector prefix(n, 0), suffix(n, 0); - - // 计算前缀相等的位置 - int p = 0; - while (p < n && a[p] == b[p]) { - prefix[p] = 1; - p++; - } - - // 计算后缀相等的位置 - int s = n - 1; - while (s >= 0 && a[s] == b[s]) { - suffix[s] = 1; - s--; - } - - int count = 0; - - // 遍历所有可能的区间 - for (int i = 0; i < n - 1; i++) { - for (int j = i + 1; j < n; j++) { - // 判断前缀和后缀是否相等 - if ((i == 0 || prefix[i - 1] == 1) && (j == n - 1 || suffix[j + 1] == 1)) { - // 判断翻转后的子数组是否和目标数组相同 - bool is_palindrome = true; - for (int k = 0; k <= (j - i) / 2; k++) { - if (a[i + k] != b[j - k]) { - is_palindrome = false; - break; - } - } - if (is_palindrome) { - count++; - } - } - } - } - - cout << count << endl; - - return 0; -} -``` diff --git "a/problems/kamacoder/0122.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" "b/problems/kamacoder/0122.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" deleted file mode 100644 index 7820d01e59..0000000000 --- "a/problems/kamacoder/0122.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" +++ /dev/null @@ -1,127 +0,0 @@ - -# 滑动窗口最大值 - -本题是 [代码随想录:滑动窗口最大值](https://www.programmercarl.com/0239.%E6%BB%91%E5%8A%A8%E7%AA%97%E5%8F%A3%E6%9C%80%E5%A4%A7%E5%80%BC.html) 的升级版。 - -在[代码随想录:滑动窗口最大值](https://www.programmercarl.com/0239.%E6%BB%91%E5%8A%A8%E7%AA%97%E5%8F%A3%E6%9C%80%E5%A4%A7%E5%80%BC.html) 中详细讲解了如何求解 滑动窗口的最大值。 - -那么求滑动窗口的最小值原理也是一样的, 大家稍加思考,把优先级队列里的 大于 改成小于 就行了。 - -求最大值的优先级队列(从大到小) -``` -while (!que.empty() && value > que.back()) { -``` - -求最小值的优先级队列(从小到大) -``` -while (!que.empty() && value > que.back()) { -``` - -这样在滑动窗口里 最大值最小值都求出来了,遍历一遍找出 差值最大的就好。 - -至于输入,需要一波字符串处理,比较考察基本功。 - -CPP代码如下: - -```CPP -#include -#include -#include -#include -#include -using namespace std; -class MyBigQueue { //单调队列(从大到小) -public: - deque que; // 使用deque来实现单调队列 - // 每次弹出的时候,比较当前要弹出的数值是否等于队列出口元素的数值,如果相等则弹出。 - // 同时pop之前判断队列当前是否为空。 - void pop(int value) { - if (!que.empty() && value == que.front()) { - que.pop_front(); - } - } - // 如果push的数值大于入口元素的数值,那么就将队列后端的数值弹出,直到push的数值小于等于队列入口元素的数值为止。 - // 这样就保持了队列里的数值是单调从大到小的了。 - void push(int value) { - while (!que.empty() && value > que.back()) { - que.pop_back(); - } - que.push_back(value); - - } - // 查询当前队列里的最大值 直接返回队列前端也就是front就可以了。 - int front() { - return que.front(); - } -}; - -class MySmallQueue { //单调队列(从小到大) -public: - deque que; - - void pop(int value) { - if (!que.empty() && value == que.front()) { - que.pop_front(); - } - } - - // 和上面队列的区别是这里换成了小于, - void push(int value) { - while (!que.empty() && value < que.back()) { - que.pop_back(); - } - que.push_back(value); - - } - - int front() { - return que.front(); - } -}; - -int main() { - string input; - - getline(cin, input); - - vector nums; - int k; - - // 找到并截取nums的部分 - int numsStart = input.find('['); - int numsEnd = input.find(']'); - string numsStr = input.substr(numsStart + 1, numsEnd - numsStart - 1); - // cout << numsStr << endl; - - // 用字符串流处理nums字符串,提取数字 - stringstream ss(numsStr); - string temp; - while (getline(ss, temp, ',')) { - nums.push_back(stoi(temp)); - } - - // 找到并提取k的值 - int kStart = input.find("k = ") + 4; - k = stoi(input.substr(kStart)); - - MyBigQueue queB; // 获取区间最大值 - MySmallQueue queS; // 获取区间最小值 - // vector result; - for (int i = 0; i < k; i++) { // 先将前k的元素放进队列 - queB.push(nums[i]); - queS.push(nums[i]); - } - - int result = queB.front() - queS.front(); - for (int i = k; i < nums.size(); i++) { - queB.pop(nums[i - k]); // 滑动窗口移除最前面元素 - queB.push(nums[i]); // 滑动窗口前加入最后面的元素 - - queS.pop(nums[i - k]); - queS.push(nums[i]); - - result = max (result, queB.front() - queS.front()); - } - cout << result << endl; -} -``` diff --git "a/problems/kamacoder/0123.\345\260\217\347\272\242\347\232\204\346\225\260\347\273\204\346\236\204\351\200\240.md" "b/problems/kamacoder/0123.\345\260\217\347\272\242\347\232\204\346\225\260\347\273\204\346\236\204\351\200\240.md" deleted file mode 100644 index ef66dec8bc..0000000000 --- "a/problems/kamacoder/0123.\345\260\217\347\272\242\347\232\204\346\225\260\347\273\204\346\236\204\351\200\240.md" +++ /dev/null @@ -1,52 +0,0 @@ - -121. 小红的数组构造 - -本题大家不要想着真去模拟数组的情况,那样就想复杂了。 - -数组只能是:1k、2k、3k ... (n-1)k、nk,这样 总和就是最小的。 - -注意最后的和可能超过int,所以用 long long。 - -代码如下: - -```CPP -#include -using namespace std; -int main () { - long long result = 0; - int n, k; - cin >> n >> k; - for (int i = 1; i <= n; i++) { - result += i * k; - } - cout << result << endl; -} -``` - -优化思路: - - -由于要计算1到n的整数之和,可以利用等差数列求和公式来优化计算。 - -和公式:1 + 2 + 3 + ... + n = n * (n + 1) / 2 - -因此,总和 result = k * (n * (n + 1) / 2) - -```CPP - -#include -using namespace std; - -int main() { - long long result = 0; - int n, k; - cin >> n >> k; - - // 使用等差数列求和公式进行计算 - result = k * (n * (n + 1LL) / 2); - - cout << result << endl; - return 0; -} - -``` diff --git "a/problems/kamacoder/0124.\347\262\276\345\215\216\345\270\226\345\255\220.md" "b/problems/kamacoder/0124.\347\262\276\345\215\216\345\270\226\345\255\220.md" deleted file mode 100644 index 2855c89efa..0000000000 --- "a/problems/kamacoder/0124.\347\262\276\345\215\216\345\270\226\345\255\220.md" +++ /dev/null @@ -1,38 +0,0 @@ - - -# 122.精华帖子 - - -开辟一个数组,默认都是0,把精华帖标记为1. - -使用前缀和,快速计算出,k 范围内 有多少个精华帖。 - -前缀和要特别注意区间问题,即 vec[i+k] - vec[i] 求得区间和是 (i, i + k] 这个区间,注意这是一个左开右闭的区间。 - -所以前缀和 很容易漏掉 vec[0] 这个数值的计算 - -```CPP -#include -#include -using namespace std; -int main() { - int n, m, k, l, r; - cin >> n >> m >> k; - vector vec(n); - while (m--) { - cin >> l >> r; - for (int i = l; i < r; i++) vec[i] = 1; - } - int result = 0; - for (int i = 0; i < k; i++) result += vec[i]; // 提前预处理result,包含vec[0]的区间,否则前缀和容易漏掉这个区间 - - for (int i = 1; i < n; i++) { - vec[i] += vec[i - 1]; - } - - for (int i = 0; i < n - k; i++) { - result = max (result, vec[i + k] - vec[i]); - } - cout << result << endl; -} -``` diff --git "a/problems/kamacoder/0125.\350\277\236\347\273\255\345\255\220\346\225\260\347\273\204\346\234\200\345\244\247\345\222\214.md" "b/problems/kamacoder/0125.\350\277\236\347\273\255\345\255\220\346\225\260\347\273\204\346\234\200\345\244\247\345\222\214.md" deleted file mode 100644 index 32833b2fb2..0000000000 --- "a/problems/kamacoder/0125.\350\277\236\347\273\255\345\255\220\346\225\260\347\273\204\346\234\200\345\244\247\345\222\214.md" +++ /dev/null @@ -1,66 +0,0 @@ - -# 123.连续子数组最大和 - -这道题目可以说是 [代码随想录,动态规划:最大子序和](https://www.programmercarl.com/0053.%E6%9C%80%E5%A4%A7%E5%AD%90%E5%BA%8F%E5%92%8C%EF%BC%88%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92%EF%BC%89.html) 的升级版。 - -题目求的是 可以替换一个数字 之后 的 连续子数组最大和。 - -如果替换的是数组下标 i 的元素。 - -那么可以用 [代码随想录,动态规划:最大子序和](https://www.programmercarl.com/0053.%E6%9C%80%E5%A4%A7%E5%AD%90%E5%BA%8F%E5%92%8C%EF%BC%88%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92%EF%BC%89.html) 的方法,先求出 [0 - i) 区间的 最大子序和 dp1 和 (i, n)的最大子序和dp2 。 - -然后在遍历一遍i, 计算 dp1 + dp2 + vec[i] 的最大值就可以。 - -正序遍历,求出 [0 - i) 区间的 最大子序,dp[ i - 1] 表示 是 包括下标i - 1(以vec[i - 1]为结尾)的最大连续子序列和为dp[i - 1]。 - -所以 在计算区间 (i, n)即 dp2 的时候,我们要倒叙。 因为我们求的是以 包括下标i + 1 为起始位置的最大连续子序列和为dp[i + 1]。 - -这样 dp1 + dp2 + vec[i] 才是一个完整区间。 - -这里就体现出对 dp数组定义的把控,本题如果对 dp数组含义理解不清,其实是不容易做出来的。 - -代码: - -```CPP -#include -#include -#include -using namespace std; -int main() { - int t, n, x; - cin >> t; - while (t--) { - cin >> n >> x; - vector vec(n); - for (int i = 0; i < n; i++) cin >> vec[i]; - vector dp1(n); - dp1[0] = vec[0]; - int res = vec[0]; - // 从前向后统计最大子序和 - for (int i = 1; i < n; i++) { - dp1[i] = max(dp1[i - 1] + vec[i], vec[i]); // 状态转移公式 - res = max(res, dp1[i]); - } - - res = max(res, vec[n - 1]); - // 从后向前统计最大子序和 - vector dp2(n); - dp2[n - 1] = vec[n - 1]; - for (int i = n - 2; i >= 0; i--) { - dp2[i] = max(dp2[i + 1] + vec[i], vec[i]); - - } - - for (int i = 0 ; i < n ; i++) { - int dp1res = 0; - if (i > 0) dp1res = max(dp1[i-1], 0); - int dp2res = 0; - if (i < n - 1 ) dp2res = max(dp2[i+1], 0); - - res = max(res, dp1res + dp2res + x); - } - cout << res << endl; - } - -} -``` diff --git "a/problems/kamacoder/0127.\345\260\217\347\276\216\347\232\204\346\216\222\345\210\227\350\257\242\351\227\256.md" "b/problems/kamacoder/0127.\345\260\217\347\276\216\347\232\204\346\216\222\345\210\227\350\257\242\351\227\256.md" deleted file mode 100644 index 3be7f75bf8..0000000000 --- "a/problems/kamacoder/0127.\345\260\217\347\276\216\347\232\204\346\216\222\345\210\227\350\257\242\351\227\256.md" +++ /dev/null @@ -1,29 +0,0 @@ - -# 小美的排列询问 - -模拟题,注意 x 和y 不分先后 - -```CPP - -#include -#include -using namespace std; -int main() { - int n, x, y; - cin >> n; - vector vec(n, 0); - for (int i =0; i < n; i++) { - cin >> vec[i]; - } - cin >> x >> y; - for (int i = 0; i < n - 1; i++) { - if (x == vec[i] && y == vec[i + 1]) || (y == vec[i] && x == vec[i + 1]) ) { - cout << "Yes" << endl; - return 0; - } - } - cout << "No" << endl; - -} - -``` diff --git "a/problems/kamacoder/0128.\345\260\217\347\276\216\350\265\260\345\205\254\350\267\257.md" "b/problems/kamacoder/0128.\345\260\217\347\276\216\350\265\260\345\205\254\350\267\257.md" deleted file mode 100644 index dea68b9090..0000000000 --- "a/problems/kamacoder/0128.\345\260\217\347\276\216\350\265\260\345\205\254\350\267\257.md" +++ /dev/null @@ -1,35 +0,0 @@ - -# 小美走公路 - -在处理环形情况的时候,很多录友容易算懵了,不是多算一个数,就是少算一个数。 - -这里这样的题目,最好的方式是将 两个环展开,首尾相连,这样我们就可以通过 直线的思维去解题了 - -两个注意点: - -1. x 可以比 y 大,题目没规定 x 和y 的大小顺序 -2. 累计相加的数可能超过int - - -```CPP -#include -#include -using namespace std; -int main () { - int n; - cin >> n; - vector vec(2* n + 1, 0); - for (int i = 1; i <= n; i++) { - cin >> vec[i]; - vec[n + i] = vec[i]; - } - int x, y; - cin >> x >> y; - int xx = min(x ,y); // 注意点1:x 可以比 y 大 - int yy = max(x, y); - long long a = 0, b = 0; // 注意点2:相加的数可能超过int - for (int i = xx; i < yy; i++) a += vec[i]; - for (int i = yy; i < xx + n; i++ ) b += vec[i]; - cout << min(a, b) << endl; -} -``` diff --git "a/problems/kamacoder/0129.\345\260\217\347\276\216\347\232\204\350\233\213\347\263\225\345\210\207\345\211\262.md" "b/problems/kamacoder/0129.\345\260\217\347\276\216\347\232\204\350\233\213\347\263\225\345\210\207\345\211\262.md" deleted file mode 100644 index ae77478f13..0000000000 --- "a/problems/kamacoder/0129.\345\260\217\347\276\216\347\232\204\350\233\213\347\263\225\345\210\207\345\211\262.md" +++ /dev/null @@ -1,51 +0,0 @@ - -# 小美的蛋糕切割 - -二维前缀和,不了解前缀和的录友 可以自行查一下,是一个很容易理解的算法思路 - -```CPP - -#include -#include -#include - -using namespace std; -int main () { - int n, m; - cin >> n >> m; - int sum = 0; - vector> vec(n, vector(m, 0)) ; - for (int i = 0; i < n; i++) { - for (int j = 0; j < m; j++) { - cin >> vec[i][j]; - sum += vec[i][j]; - } - } - // 统计横向 - vector horizontal(n, 0); - for (int i = 0; i < n; i++) { - for (int j = 0 ; j < m; j++) { - horizontal[i] += vec[i][j]; - } - } - // 统计纵向 - vector vertical(m , 0); - for (int j = 0; j < m; j++) { - for (int i = 0 ; i < n; i++) { - vertical[j] += vec[i][j]; - } - } - int result = INT_MAX; - int horizontalCut = 0; - for (int i = 0 ; i < n; i++) { - horizontalCut += horizontal[i]; - result = min(result, abs(sum - horizontalCut - horizontalCut)); - } - int verticalCut = 0; - for (int j = 0; j < m; j++) { - verticalCut += vertical[j]; - result = min(result, abs(sum - verticalCut - verticalCut)); - } - cout << result << endl; -} -``` diff --git "a/problems/kamacoder/0130.\345\260\217\347\276\216\347\232\204\345\255\227\347\254\246\344\270\262\345\217\230\346\215\242.md" "b/problems/kamacoder/0130.\345\260\217\347\276\216\347\232\204\345\255\227\347\254\246\344\270\262\345\217\230\346\215\242.md" deleted file mode 100644 index 9f9d789930..0000000000 --- "a/problems/kamacoder/0130.\345\260\217\347\276\216\347\232\204\345\255\227\347\254\246\344\270\262\345\217\230\346\215\242.md" +++ /dev/null @@ -1,78 +0,0 @@ - -# 130.小美的字符串变换 - -本题是[岛屿数量](./0099.岛屿的数量广搜.md)的进阶版,主要思路和代码都是一样的,统计一个图里岛屿的数量,也是染色问题。 - -1、 先枚举各个可能出现的矩阵 -2、 针对矩阵经行广搜染色(深搜,并查集一样可以) -3、 统计岛屿数量最小的数量。 - -```CPP -#include -#include -#include -#include -using namespace std; - -// 广搜代码同 卡码网:99. 岛屿数量 -int dir[4][2] = {0, 1, 1, 0, -1, 0, 0, -1}; // 四个方向 -void bfs(const vector>& grid, vector>& visited, int x, int y, char a) { - queue> que; - que.push({x, y}); - visited[x][y] = true; // 只要加入队列,立刻标记 - while(!que.empty()) { - pair cur = que.front(); que.pop(); - int curx = cur.first; - int cury = cur.second; - for (int i = 0; i < 4; i++) { - int nextx = curx + dir[i][0]; - int nexty = cury + dir[i][1]; - if (nextx < 0 || nextx >= grid.size() || nexty < 0 || nexty >= grid[0].size()) continue; // 越界了,直接跳过 - if (!visited[nextx][nexty] && grid[nextx][nexty] == a) { - que.push({nextx, nexty}); - visited[nextx][nexty] = true; // 只要加入队列立刻标记 - } - } - } -} - -int main() { - int n; - string s; - cin >> n; - int result = INT_MAX; - cin >> s; - for (int k = 1; k < n; k++) { - if (n % k != 0) continue; - // 计算出 矩阵的 行 和 列 - int x = n / k; - int y = k; - //cout << x << " " << y << endl; - vector> vec(x, vector(y, 0)); - // 填装矩阵 - int sCount = 0; - for (int i = 0; i < x; i++) { - for (int j = 0; j < y; j++) { - vec[i][j] = s[sCount++]; - } - } - - // 开始广搜染色 - vector> visited(x, vector(y, false)); - int count = 0; - for (int i = 0; i < x; i++) { - for (int j = 0; j < y; j++) { - - if (!visited[i][j]) { - count++; // 遇到没访问过的陆地,+1 - bfs(vec, visited, i, j, vec[i][j]); // 将与其链接的陆地都标记上 true - } - } - } - // 取岛屿数量最少的 - result = min (result, count); - - } - cout << result << endl; -} -``` diff --git "a/problems/kamacoder/0131.\345\260\217\347\276\216\347\232\204\346\240\221\344\270\212\346\237\223\350\211\262.md" "b/problems/kamacoder/0131.\345\260\217\347\276\216\347\232\204\346\240\221\344\270\212\346\237\223\350\211\262.md" deleted file mode 100644 index 36b3c38cc2..0000000000 --- "a/problems/kamacoder/0131.\345\260\217\347\276\216\347\232\204\346\240\221\344\270\212\346\237\223\350\211\262.md" +++ /dev/null @@ -1,134 +0,0 @@ -# 131. 小美的树上染色 - -本题为树形dp 稍有难度,主要在于 递推公式上。 - -dp数组的定义: - -dp[cur][1] :当前节点染色,那么当前节点为根节点及其左右子节点中,可以染色的最大数量 - -dp[cur][0] :当前节点不染色,那么当前节点为根节点及其左右子节点中,可以染色的最大数量 - -关于 dp转移方程 - -1、 情况一: - -如果当前节点不染色,那就去 子节点 染色 或者 不染色的最大值。 - -`dp[cur][0] += max(dp[child][0], dp[child][1]);` - - -2、情况二: - -那么当前节点染色的话,这种情况就不好想了。 - -首先这不是二叉树,每一个节点都有可能 会有n个子节点。 - -所以我们要分别讨论,每一个子节点的情况 对父节点的影响。 - -那么父节点 针对每种情况,就要去 最大值, 也就是 `dp[cur][1] = max(dp[cur][1], 每个自孩子的情况)` - -如图,假如节点1 是我们要计算的父节点,节点2是我们这次要计算的子节点。 - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240617204601.png) - -选中一个节点2 作为我们这次计算的子节点,父节点染色的话,子节点必染色。 - -接下来就是计算 父节点1和该子节点2染色的话, 以子节点2 为根的 染色节点的最大数量 。 - -是:节点2不染色 且 以节点2为根节点的最大 染色数量 + 2, + 2 是因为 节点 1 和 节点2 要颜色了,染色节点增加两个。 - -代码:`dp[child][0] + 2` - -细心的录友会发现,那我们只计算了 红色框里面的,那么框外 最大的染色数量是多少呢? - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240617205709.png) - - -先看 作为子节点的节点2 为根节点的最大染色数量是多少? 取一个最值,即 节点2染色 或者 不染色取最大值。 - -代码:`max(dp[child][0], dp[child][1])` - -那么红框以外的 染色最大节点数量 就是 `dp[cur][0] - max(dp[child][0], dp[child][1])` - -(cur是节点1,child是节点2) - -红框以外的染色最大数量 + 父节点1和该子节点2染色的话 以子节点2 为根的 染色节点的最大数量 就是 节点1 染色的最大节点数量。 - -代码: - -`dp[cur][1] = max(dp[cur][1], dp[cur][0] - max(dp[child][0], dp[child][1]) + dp[child][0] + 2);` - -整体代码如下: - -```CPP - -#include -#include -#include -#include -#include - -using namespace std; - -int maxN = 10005; -vector> dp (maxN, vector(2, 0)); -vector> grid(maxN); // 邻接表 -vector value(maxN); // 存储每个节点的权值 - - -// 在树上进行动态规划的函数 -void dpOnTheTree(int cur) { - - for (int child : grid[cur]) { - // 后序遍历,从下向上计算 - dpOnTheTree(child); - // 情况一 - dp[cur][0] += max(dp[child][0], dp[child][1]); - - } - - // 计算dp[1] - 当前节点染色 - for (int child : grid[cur]) { - long mul = value[cur] * value[child]; // 当前节点和相邻节点权值的乘积 - long sqrtNum = (long) sqrt(mul); - - if (sqrtNum * sqrtNum == mul) { // 如果乘积是完全平方数 - // 情况二 - // dp[cur][0] 表示所有子节点 染色或者不染色的 最大染色数量 - // max(dp[child][0], dp[child][1]) 需要染色节点的孩子节点的最大染色数量 - // dp[cur][0] - max(dp[child][0], dp[child][1]) 除了要染色的节点及其子节点,其他孩子的最大染色数量 - // 最后 + dp[child][0] + 2 , 就是本节点染色的最大染色节点数量 - dp[cur][1] = max(dp[cur][1], dp[cur][0] - max(dp[child][0], dp[child][1]) + dp[child][0] + 2); - } - } - -} - -int main() { - - int n; - cin >> n; // 输入节点数量 - - // 读取节点权值 - for (int i = 1; i <= n; ++i) { - cin >> value[i]; - } - - // 构建树的邻接表 - for (int i = 1; i < n; ++i) { - int x, y; - cin >> x >> y; - grid[x].push_back(y); - } - - // 从根节点(节点1)开始进行动态规划 - dpOnTheTree(1); - - // 输出最大染色节点数量 - cout << max(dp[1][0], dp[1][1]) << endl; - - return 0; -} - -``` - diff --git "a/problems/kamacoder/0132.\345\244\271\345\220\203\346\227\227.md" "b/problems/kamacoder/0132.\345\244\271\345\220\203\346\227\227.md" deleted file mode 100644 index 2ec50bfb12..0000000000 --- "a/problems/kamacoder/0132.\345\244\271\345\220\203\346\227\227.md" +++ /dev/null @@ -1,47 +0,0 @@ - -# 132. 夹吃棋 - -[题目链接](https://kamacoder.com/problempage.php?pid=1209) - -这道题是模拟题,但很多录友可能想复杂了。 - -行方向,白棋吃,只有这样的布局 `o*o`,黑棋吃,只有这样的布局 `*o*` - -列方向也是同理的。 - -想到这一点,本题的代码就容易写了, C++代码如下: - -```CPP -#include -#include -using namespace std; -int main() { - int n; - cin >> n; - while (n--) { - int black = 0, white = 0; - vector grid(3, ""); - // 判断行 - for (int i = 0; i < 3; i++) { - cin >> grid[i]; - if (grid[i] == "o*o") white++; - if (grid[i] == "*o*") black++; - } - // 判断列 - for (int i = 0; i < 3; i++) { - string s; - s += grid[0][i]; - s += grid[1][i]; - s += grid[2][i]; - if (s == "o*o") white++; - if (s == "*o*") black++; - } - // 如果一个棋盘的局面没有一方被夹吃或者黑白双方都被对面夹吃,则认为是平局 - if ((!white && !black) || (white && black)) cout << "draw" << endl; - // 白棋赢 - else if (white && !black) cout << "yukan" << endl; - // 黑棋赢 - else cout << "kou" << endl; - } -} -``` diff --git "a/problems/kamacoder/0134.\347\232\207\345\220\216\347\247\273\345\212\250\347\232\204\346\234\200\345\260\217\346\255\245\346\225\260.md" "b/problems/kamacoder/0134.\347\232\207\345\220\216\347\247\273\345\212\250\347\232\204\346\234\200\345\260\217\346\255\245\346\225\260.md" deleted file mode 100644 index ca681df412..0000000000 --- "a/problems/kamacoder/0134.\347\232\207\345\220\216\347\247\273\345\212\250\347\232\204\346\234\200\345\260\217\346\255\245\346\225\260.md" +++ /dev/null @@ -1,77 +0,0 @@ - -# 134. 皇后移动的最小步数 - -[题目链接](https://kamacoder.com/problempage.php?pid=1211) - -本题和 [代码随想录-不同路径](https://www.programmercarl.com/0062.%E4%B8%8D%E5%90%8C%E8%B7%AF%E5%BE%84.html) 有一些类似。 - -关键是弄清楚递推公式 - -一共分三个情况, - -情况一,向右移动: - -然后从 (i, j) 再向右走 到 (i, k)。 无论k 多大,步数只加1 : - -`dp[i][k] = dp[i][j] + 1` - -那么 `dp[i][k]` 也有可能 从其他方向得到,例如 从上到下, 或者斜上方到达 dp[i][k] - -本题我们要求最小步数,所以取最小值:`dp[i][k] = min(dp[i][k], dp[i][j] + 1);` - -情况二,向下移动: - -从 (i, j) 再向下走 到 (k, j)。 无论k 多大,步数只加1 : - -`dp[k][j] = dp[i][j] + 1;` - -同理 `dp[i][k]` 也有可能 从其他方向得到,取最小值:`dp[k][j] = min(dp[k][j], dp[i][j] + 1);` - -情况三,右下方移动: - -从 (i, j) 再向右下方移动 到 (i + k, j + k)。 无论k 多大,步数只加1 : - -`dp[i + k][j + k] = dp[i][j] + 1` - -同理 `dp[i + k][j + k]` 也有可能 从其他方向得到,取最小值:`dp[i + k][j + k] = min(dp[i + k][j + k], dp[i][j] + 1);` - - -```CPP -#include -#include -using namespace std; -const int INF = 4e6; // 最多步数也就是 2000 * 2000 -int main() { - int n, m; - cin >> n >> m; - vector> grid(n, vector(m)); - for (int i = 0; i < n; i++) { - for (int j = 0; j < m; j++) { - cin >> grid[i][j]; - } - } - vector> dp(n, vector(m, INF)); - dp[0][0] = 0; - for (int i = 0; i < n; i++) { - for (int j = 0; j < m; j++) { - if (grid[i][j] == '*') continue; - // 向右移动k个格子 - for (int k = j + 1; k < m && grid[i][k] == '.'; k++) { - dp[i][k] = min(dp[i][k], dp[i][j] + 1); - } - // 向下移动 k个格子 - for (int k = i + 1; k < n && grid[k][j] == '.'; k++) { - dp[k][j] = min(dp[k][j], dp[i][j] + 1); - } - // 向右下移动k个格子 - for (int k = 1; i + k < n && j + k < m && grid[i + k][j + k] == '.'; k++) { - dp[i + k][j + k] = min(dp[i + k][j + k], dp[i][j] + 1); - } - } - } - if (dp[n - 1][m - 1] == INF) cout << -1 << endl; - else cout << dp[n - 1][m - 1] << endl; -} -``` - - diff --git "a/problems/kamacoder/0135.\350\216\267\345\217\226\350\277\236\351\200\232\347\232\204\347\233\270\351\202\273\350\212\202\347\202\271\345\210\227\350\241\250.md" "b/problems/kamacoder/0135.\350\216\267\345\217\226\350\277\236\351\200\232\347\232\204\347\233\270\351\202\273\350\212\202\347\202\271\345\210\227\350\241\250.md" deleted file mode 100644 index c1aa38e132..0000000000 --- "a/problems/kamacoder/0135.\350\216\267\345\217\226\350\277\236\351\200\232\347\232\204\347\233\270\351\202\273\350\212\202\347\202\271\345\210\227\350\241\250.md" +++ /dev/null @@ -1,147 +0,0 @@ - -# 135. 获取连通的相邻节点列表 - -本题是一个 “阅读理解”题,其实题目的算法很简单,但理解题意很费劲。 - -题目描述中的【提示信息】 是我后加上去了,华为笔试的时候没有这个 【提示信息】。 - -相信没有 【提示信息】大家理解题意 平均要多用半个小时。 - -思路: - -1. 将第一行数据加入set中 -2. 后面输出数据,判断是否在 set里 -3. 最后把结果排个序 - - -```CPP -#include -#include -#include -#include -using namespace std; -int main() { - unordered_set uset; - int n, a; - cin >> n; - while (n--) { - cin >> a; - uset.insert(a); - } - int m, x, vlan_id; - long long tb; - vector vecTB; - cin >> m; - while(m--) { - cin >> tb; - cin >> x; - vector vecVlan_id(x); - for (int i = 0; i < x; i++) { - cin >> vecVlan_id[i]; - } - for (int i = 0; i < x; i++) { - if (uset.find(vecVlan_id[i]) != uset.end()) { - vecTB.push_back(tb); - break; - } - } - - } - cout << vecTB.size() << endl; - if (vecTB.size() != 0) { - sort(vecTB.begin(), vecTB.end()); - for (int i = 0; i < vecTB.size() ; i++) cout << vecTB[i] << " "; - } -} - -``` - -## 其他语言版本 - -### Java - -```Java -import java.util.*; - -public class Main { - public static void main(String[] args) { - Scanner scanner = new Scanner(System.in); - Set uset = new HashSet<>(); - int n = scanner.nextInt(); - while (n-- > 0) { - int a = scanner.nextInt(); - uset.add(a); - } - - int m = scanner.nextInt(); - List vecTB = new ArrayList<>(); - while (m-- > 0) { - long tb = scanner.nextLong(); - int x = scanner.nextInt(); - List vecVlan_id = new ArrayList<>(); - for (int i = 0; i < x; i++) { - vecVlan_id.add(scanner.nextInt()); - } - for (int vlanId : vecVlan_id) { - if (uset.contains(vlanId)) { - vecTB.add(tb); - break; - } - } - } - - System.out.println(vecTB.size()); - if (!vecTB.isEmpty()) { - Collections.sort(vecTB); - for (long tb : vecTB) { - System.out.print(tb + " "); - } - } - } -} - -``` - -### Python - -```python -def main(): - import sys - input = sys.stdin.read - data = input().split() - - index = 0 - n = int(data[index]) - index += 1 - uset = set() - for _ in range(n): - a = int(data[index]) - index += 1 - uset.add(a) - - m = int(data[index]) - index += 1 - vecTB = [] - while m > 0: - tb = int(data[index]) - index += 1 - x = int(data[index]) - index += 1 - vecVlan_id = [] - for _ in range(x): - vecVlan_id.append(int(data[index])) - index += 1 - for vlan_id in vecVlan_id: - if vlan_id in uset: - vecTB.append(tb) - break - m -= 1 - - print(len(vecTB)) - if vecTB: - vecTB.sort() - print(" ".join(map(str, vecTB))) - -if __name__ == "__main__": - main() -``` diff --git "a/problems/kamacoder/0136.\345\255\227\347\254\246\344\270\262\345\244\204\347\220\206\345\231\250.md" "b/problems/kamacoder/0136.\345\255\227\347\254\246\344\270\262\345\244\204\347\220\206\345\231\250.md" deleted file mode 100644 index 1c58f4abaf..0000000000 --- "a/problems/kamacoder/0136.\345\255\227\347\254\246\344\270\262\345\244\204\347\220\206\345\231\250.md" +++ /dev/null @@ -1,148 +0,0 @@ - -# 字符串处理器 - -纯模拟,但情况比较多,非常容易 空指针异常。 - -大家要注意,边界问题 以及 负数问题。 - -整体代码如下: - -```CPP -#include -using namespace std; - int main() { - int index = 0; - long long optNum; - string s; - string cmd; - while(cin >> cmd){ - //cout << s << endl; - if(cmd == "insert") { - string buff; - cin >> buff; - s.insert(index, buff); - index += buff.size(); - } - else if(cmd == "move") { - cin >> optNum; - if(optNum > 0 && index + optNum <= s.size()) index += optNum; - if(optNum < 0 && index >= -optNum) index += optNum; - } - else if(cmd == "delete") { - cin >> optNum; - if(index >= optNum && optNum > 0){ - s.erase(index - optNum, optNum); - index -= optNum; - } - } - else if(cmd == "copy") { - if(index > 0) { - string tmp = s.substr(0, index); - s.insert(index, tmp); - } - } - else if(cmd == "end") { - for(int i = 0; i < index; i++) { - cout << s[i]; - } - cout << '|'; - for(int i = index; i < s.size(); i++) cout << s[i]; - - break; - } - } - return 0; -} - -``` - -## 其他语言版本 - -### Java - -```Java -import java.util.Scanner; - -public class Main { - public static void main(String[] args) { - Scanner scanner = new Scanner(System.in); - StringBuilder s = new StringBuilder(); - int index = 0; - int optNum; - - while (true) { - String cmd = scanner.next(); - if (cmd.equals("insert")) { - String buff = scanner.next(); - s.insert(index, buff); - index += buff.length(); - } else if (cmd.equals("move")) { - optNum = scanner.nextInt(); - if (optNum > 0 && index + optNum <= s.length()) index += optNum; - if (optNum < 0 && index >= -optNum) index += optNum; - } else if (cmd.equals("delete")) { - optNum = scanner.nextInt(); - if (index >= optNum && optNum > 0) { - s.delete(index - optNum, index); - index -= optNum; - } - } else if (cmd.equals("copy")) { - if (index > 0) { - String tmp = s.substring(0, index); - s.insert(index, tmp); - } - } else if (cmd.equals("end")) { - System.out.print(s.substring(0, index) + '|' + s.substring(index)); - break; - } - } - scanner.close(); - } -} -``` - -### Python - -```python -def main(): - import sys - input = sys.stdin.read - data = input().split() - s = "" - index = 0 - i = 0 - - while i < len(data): - cmd = data[i] - i += 1 - if cmd == "insert": - buff = data[i] - i += 1 - s = s[:index] + buff + s[index:] - index += len(buff) - elif cmd == "move": - optNum = int(data[i]) - i += 1 - if optNum > 0 and index + optNum <= len(s): - index += optNum - elif optNum < 0 and index >= -optNum: - index += optNum - elif cmd == "delete": - optNum = int(data[i]) - i += 1 - if index >= optNum and optNum > 0: - s = s[:index - optNum] + s[index:] - index -= optNum - elif cmd == "copy": - if index > 0: - tmp = s[:index] - s = s[:index] + tmp + s[index:] - elif cmd == "end": - print(s[:index] + '|' + s[index:]) - break - -if __name__ == "__main__": - main() - - -``` diff --git "a/problems/kamacoder/0137.\346\266\210\346\201\257\344\274\240\350\276\223.md" "b/problems/kamacoder/0137.\346\266\210\346\201\257\344\274\240\350\276\223.md" deleted file mode 100644 index a1519bc6b0..0000000000 --- "a/problems/kamacoder/0137.\346\266\210\346\201\257\344\274\240\350\276\223.md" +++ /dev/null @@ -1,192 +0,0 @@ - -# 137. 消息传输 - -这道题目,普通广搜就可以解决。 - -这里说一下几点注意事项: - -1、 题目描述中,注意 n 是列数,m是行数 - -这是造成很多录友周赛的时候提交 返回 【运行错误】的罪魁祸首,如果 输入用例是 正方形,那没问题,如果后台输入用例是矩形, n 和 m 搞反了,就会数组越界。 - -矩阵是 m * n ,但输入的顺序却是 先输入n 再输入 m。 - -这会让很多人把矩阵的 n 和 m 搞反。 - -其实规范出题,就应该是n 行,m列,然后 先输入n,在输入m。 - -只能说 大厂出题的人,也不是专业出题的,所以会在 非算法方面一不小心留下很多 “bug”,消耗大家的精力。 - -2、再写广搜的时候,可能担心会无限循环 - -即 A 走到 B,B又走到A,A又走到B ,这种情况,一般来说 广搜都是用一个 visit数组来标记的。 - -但本题不用,因为 不会重复走的,题图里的信号都是正数,根据距离判断大小 可以保证不走回头路。 - -```CPP -#include -#include -#include -using namespace std; -const int inf = 1e6; -int main () { - int n, m, startx, starty; - cin >> n >> m; - cin >> startx >> starty; - vector> grid(m, vector(n)); - vector> dis(m, vector(n, inf)); - for (int i = 0; i < m; i++) { - for (int j = 0; j < n; j++) { - cin >> grid[i][j]; - } - } - queue> que; - int dir[4][2] = {0, 1, 1, 0, -1, 0, 0, -1}; - que.push(pair(startx, starty)); - dis[startx][starty] = 0; - while(!que.empty()) { - pair cur = que.front(); que.pop(); - for (int i = 0; i < 4; i++) { - int newx = cur.first + dir[i][1]; - int newy = cur.second + dir[i][0]; - if (newx < 0 || newx >= m || newy < 0 || newy >= n || grid[cur.first][cur.second] == 0) continue; - - if (dis[newx][newy] > dis[cur.first][cur.second] + grid[cur.first][cur.second]) { - dis[newx][newy] = dis[cur.first][cur.second] + grid[cur.first][cur.second]; - que.push(pair(newx, newy)); - } - } - } - int result = 0; - for (int i = 0; i < m; i++) { - for (int j = 0; j < n; j++) { - if (dis[i][j] == inf) { - cout << -1 << endl; - return 0; - } - result = max(result, dis[i][j]); - } - } - cout << result << endl; -} -``` - -## 其他语言版本 - -### Java - -```Java -import java.util.*; - -public class Main { - static final int INF = 1000000; - - public static void main(String[] args) { - Scanner scanner = new Scanner(System.in); - int n = scanner.nextInt(); - int m = scanner.nextInt(); - int startX = scanner.nextInt(); - int startY = scanner.nextInt(); - - int[][] grid = new int[m][n]; - int[][] dis = new int[m][n]; - - for (int i = 0; i < m; i++) { - Arrays.fill(dis[i], INF); - for (int j = 0; j < n; j++) { - grid[i][j] = scanner.nextInt(); - } - } - - Queue queue = new LinkedList<>(); - int[][] directions = {{0, 1}, {1, 0}, {-1, 0}, {0, -1}}; - - queue.add(new int[]{startX, startY}); - dis[startX][startY] = 0; - - while (!queue.isEmpty()) { - int[] current = queue.poll(); - for (int[] dir : directions) { - int newX = current[0] + dir[0]; - int newY = current[1] + dir[1]; - if (newX >= 0 && newX < m && newY >= 0 && newY < n && grid[current[0]][current[1]] != 0) { - if (dis[newX][newY] > dis[current[0]][current[1]] + grid[current[0]][current[1]]) { - dis[newX][newY] = dis[current[0]][current[1]] + grid[current[0]][current[1]]; - queue.add(new int[]{newX, newY}); - } - } - } - } - - int result = 0; - for (int i = 0; i < m; i++) { - for (int j = 0; j < n; j++) { - if (dis[i][j] == INF) { - System.out.println(-1); - return; - } - result = Math.max(result, dis[i][j]); - } - } - - System.out.println(result); - scanner.close(); - } -} -``` - -### Python - -```Python -from collections import deque - -inf = 1000000 - -def main(): - import sys - input = sys.stdin.read - data = input().split() - index = 0 - - n = int(data[index]) - m = int(data[index+1]) - startx = int(data[index+2]) - starty = int(data[index+3]) - index += 4 - - grid = [] - dis = [[inf] * n for _ in range(m)] - - for i in range(m): - grid.append([int(data[index+j]) for j in range(n)]) - index += n - - directions = [(0, 1), (1, 0), (-1, 0), (0, -1)] - queue = deque() - queue.append((startx, starty)) - dis[startx][starty] = 0 - - while queue: - curx, cury = queue.popleft() - for dx, dy in directions: - newx, newy = curx + dx, cury + dy - if 0 <= newx < m and 0 <= newy < n and grid[curx][cury] != 0: - if dis[newx][newy] > dis[curx][cury] + grid[curx][cury]: - dis[newx][newy] = dis[curx][cury] + grid[curx][cury] - queue.append((newx, newy)) - - result = 0 - for i in range(m): - for j in range(n): - if dis[i][j] == inf: - print(-1) - return - result = max(result, dis[i][j]) - - print(result) - -if __name__ == "__main__": - main() - - -``` diff --git "a/problems/kamacoder/0139.\345\217\257\347\210\261\344\270\262.md" "b/problems/kamacoder/0139.\345\217\257\347\210\261\344\270\262.md" deleted file mode 100644 index 9ff0b684d7..0000000000 --- "a/problems/kamacoder/0139.\345\217\257\347\210\261\344\270\262.md" +++ /dev/null @@ -1,101 +0,0 @@ - -# 可爱串 - -整体思路,就含有 子序列的字符串数量 减去 含有子串的字符串数量。 - -因为子序列数量已经是包含子串数量的。 剩下的就是 只有子序列 且没有子串的 字符串数量。 - - -需要注意我们求的不是 长度为 i 的字符串里有多少个 red 子序列。 - -**而是 可以有多少个 长度为i 的字符串 含有子序列 red** - -同理,可以有多少个长度为i的字符串含有 red 子串 - -认清这一点很重要! - -### 求子串 - -dp2[i][3] 长度为i 且 含有子串 red 的字符串数量 有多少 - -dp2[i][2] 长度为i 且 含有子串 re 的字符串数量有多少 - -dp2[i][1] 长度为 i 且 含有子串 r 的字符串数量有多少 - -dp2[1][0] 长度为 i 且 含有 只有 de, ee , e, d的字符串的字符串数量有多少。 - -```CPP -// 求子串 -dp2[0][0] = 1; -for(int i = 1;i <= n; i++) { - dp2[i][0] = (dp2[i - 1][2] + dp2[i - 1][1] + dp2[i - 1][0] * 2) % mod; // 含有 re 的可以把 r改成d, 含有r 的可以改成 - dp2[i][1] = (dp2[i - 1][2] + dp2[i - 1][1] + dp2[i - 1][0]) % mod; - dp2[i][2] = (dp2[i - 1][1]); - dp2[i][3] = (dp2[i - 1][3] * 3 + dp2[i - 1][2]) % mod; -} -`` - -### 求子序列 - -dp1[i][3] 长度为i 且 含有子序列 red 的字符串数量 有多少 - -dp2[i][2] 长度为i 且 含有子序列 re 的字符串数量有多少 - -dp2[i][1] 长度为 i 且 含有子序列 r 的字符串数量有多少 - -dp2[1][0] 长度为 i 且 含有 只含有 e 和 d 的字符串的字符串数量有多少。 - -```CPP - -// 求子序列 -dp1[0][0]=1; -for(int i=1;i<=n;i++) -{ - dp1[i][0] = (dp1[i - 1][0] * 2) % mod; - dp1[i][1] = (dp1[i - 1][0] + dp1[i - 1][1] * 2) % mod; - dp1[i][2] = (dp1[i - 1][1] + dp1[i - 1][2] * 2) % mod; - dp1[i][3] = (dp1[i - 1][2] + dp1[i - 1][3] * 3) % mod; -} -``` - - - -```CPP - -#include -using namespace std; - -using ll=long long; -const int mod=1e9+7; - -int main() -{ - int n; - - cin>>n; - vector> dp1(n + 1,vector (4,0)); - vector> dp2(n + 1,vector (4,0)); - // 求子串 - dp2[0][0] = 1; - for(int i = 1;i <= n; i++) { - dp2[i][0] = (dp2[i - 1][2] + dp2[i - 1][1] + dp2[i - 1][0] * 2) % mod; - dp2[i][1] = (dp2[i - 1][2] + dp2[i - 1][1] + dp2[i - 1][0]) % mod; - dp2[i][2] = (dp2[i - 1][1]); - dp2[i][3] = (dp2[i - 1][3] * 3 + dp2[i - 1][2]) % mod; - } - - // 求子序列 - dp1[0][0]=1; - for(int i=1;i<=n;i++) - { - dp1[i][0] = (dp1[i - 1][0] * 2) % mod; - dp1[i][1] = (dp1[i - 1][0] + dp1[i - 1][1] * 2) % mod; - dp1[i][2] = (dp1[i - 1][1] + dp1[i - 1][2] * 2) % mod; - dp1[i][3] = (dp1[i - 1][2] + dp1[i - 1][3] * 3) % mod; - } - - cout<<(dp1[n][3] - dp2[n][3])%mod; - -} - -``` diff --git "a/problems/kamacoder/0139.\345\256\214\347\276\216\346\225\260.md" "b/problems/kamacoder/0139.\345\256\214\347\276\216\346\225\260.md" deleted file mode 100644 index 1f801d7666..0000000000 --- "a/problems/kamacoder/0139.\345\256\214\347\276\216\346\225\260.md" +++ /dev/null @@ -1,29 +0,0 @@ - -```CPP -#include -#include -using namespace std; -int countOnes(long long num) { - int zeroCount = 0; - while (num > 0) { - if (num % 10 != 0) { // 检查最低位是否为0 - zeroCount++; - } - num /= 10; // 移除最低位 - } - return zeroCount; -} -int main() { - int n; - cin >> n; - vector vec(n); - for (int i = 0; i < n; i++) cin >> vec[i]; - int result = 0; - for (int i = 0; i < n; i++) { - for (int j = i + 1; j < n; j++) { - if (countOnes(vec[i] * vec[j]) == 1) result++; - } - } - cout << result << endl; -} -``` diff --git "a/problems/kamacoder/0141.\345\245\275\344\272\214\345\217\211\346\240\221.md" "b/problems/kamacoder/0141.\345\245\275\344\272\214\345\217\211\346\240\221.md" deleted file mode 100644 index fe48f2fd46..0000000000 --- "a/problems/kamacoder/0141.\345\245\275\344\272\214\345\217\211\346\240\221.md" +++ /dev/null @@ -1,104 +0,0 @@ - -本题和 [96.不同的二叉搜索树](https://www.programmercarl.com/0096.%E4%B8%8D%E5%90%8C%E7%9A%84%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91.html) 比较像 - -* 取模这里很容易出错 -* 过程中所用到的数值都有可能超过int,所以要改用longlong - -```CPP -#include -#include -using namespace std; - -long long mod = 1e9 + 7; -long long dp(int t, vector& memory) { - if (t % 2 == 0) return 0; - if (t == 1) return 1; - if (memory[t] != -1) return memory[t]; - - long long result = 0; - // 枚举左右子树节点的数量 - for (int i = 1; i < t; i += 2) { - long long leftNum = dp(i, memory); // 左子树节点数量为i - long long rightNum = dp(t - i - 1, memory); // 右子树节点数量为t - i - 1 - result += (leftNum * rightNum) % mod; // 注意这里是乘的关系 - result %= mod; - } - memory[t] = result; - return result; -} -int main() { - int n; - cin >> n; - vector memory(n + 1, -1); - cout << dp(n, memory) << endl; -} -``` - - -```CPP -#include -#include -#include - -using namespace std; - -const int MOD = 1000000007; - -int main() { - int num; - cin >> num; - - if (num % 2 == 0) { - cout << 0 << endl; - return 0; - } - - vector dp(num + 1, 0); - dp[1] = 1; - - for (int i = 3; i <= num; i += 2) { - for (int j = 1; j <= i - 2; j += 2) { - dp[i] = (dp[i] + dp[j] * dp[i - 1 - j]) % MOD; - } - } - - cout << dp[num] << endl; - return 0; -} - -``` - - -第二题的代码 - -#include -using namespace std; - -long fastexp(long base,long n,long mod){ - long answer = 1; - while(n > 0){ - if(n % 2 == 1){ - answer = (answer * base) % mod; - } - base = (base * base) % mod; - n /= 2; - } - return answer; -} -int kawaiiStrings(int n) { - // write code here - std::vector f(n + 1), g(n + 1), h(n + 1); - long mod = 1000000007; - for (long i = 2; i <= n; i++) g[i] = (g[i - 1] * 2 + (i - 1) * fastexp(2,i-2,mod)) % mod; - for (long i = 3; i <= n; i++) f[i] = ((f[i - 1] * 3) % mod + g[i - 1]) % mod; - for (long i = 3; i <= n; i++) h[i] = (fastexp(3, i - 3, mod) + h[i - 1] * 3 - h[i - 3]) % mod; - return (f[n]-h[n]+mod)%mod; - -} - -int main(){ - int n; - cin >> n; - cout << kawaiiStrings(n) << endl; - return 0; -} diff --git "a/problems/kamacoder/0142.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\346\234\200\345\260\217ASCII\345\210\240\351\231\244\346\200\273\345\222\214.md" "b/problems/kamacoder/0142.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\346\234\200\345\260\217ASCII\345\210\240\351\231\244\346\200\273\345\222\214.md" deleted file mode 100644 index ff34581ff0..0000000000 --- "a/problems/kamacoder/0142.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\346\234\200\345\260\217ASCII\345\210\240\351\231\244\346\200\273\345\222\214.md" +++ /dev/null @@ -1,108 +0,0 @@ - -# 142. 两个字符串的最小 ASCII 删除总和 - -本题和[代码随想录:两个字符串的删除操作](https://www.programmercarl.com/0583.%E4%B8%A4%E4%B8%AA%E5%AD%97%E7%AC%A6%E4%B8%B2%E7%9A%84%E5%88%A0%E9%99%A4%E6%93%8D%E4%BD%9C.html) 思路基本是一样的。 - -属于编辑距离问题,如果想彻底了解,建议看看「代码随想录」的编辑距离总结篇。 - -本题dp数组含义: - -dp[i][j] 表示 以i-1为结尾的字符串word1,和以j-1位结尾的字符串word2,想要达到相等,所需要删除元素的最小ASCII 删除总和。 - -如果 s1[i - 1] 与 s2[j - 1] 相同,则不用删:`dp[i][j] = dp[i - 1][j - 1]` - -如果 s1[i - 1] 与 s2[j - 1] 不相同,删word1 的 最小删除和: `dp[i - 1][j] + s1[i - 1]` ,删word2的最小删除和: `dp[i][j - 1] + s2[j - 1]` - -取最小值: `dp[i][j] = min(dp[i - 1][j] + s1[i - 1], dp[i][j - 1] + s2[j - 1])` - - - -```CPP -#include -#include -using namespace std; -int main() { - string s1, s2; - cin >> s1 >> s2; - vector> dp(s1.size() + 1, vector(s2.size() + 1, 0)); - - // s1 如果变成空串的最小删除ASCLL值综合 - for (int i = 1; i <= s1.size(); i++) dp[i][0] = dp[i - 1][0] + s1[i - 1]; - // s2 如果变成空串的最小删除ASCLL值综合 - for (int j = 1; j <= s2.size(); j++) dp[0][j] = dp[0][j - 1] + s2[j - 1]; - - for (int i = 1; i <= s1.size(); i++) { - for (int j = 1; j <= s2.size(); j++) { - if (s1[i - 1] == s2[j - 1]) dp[i][j] = dp[i - 1][j - 1]; - else dp[i][j] = min(dp[i - 1][j] + s1[i - 1], dp[i][j - 1] + s2[j - 1]); - } - } - cout << dp[s1.size()][s2.size()] << endl; -} -``` - -### Java - -```Java -import java.util.Scanner; - -public class Main { - public static void main(String[] args) { - Scanner scanner = new Scanner(System.in); - String s1 = scanner.nextLine(); - String s2 = scanner.nextLine(); - int[][] dp = new int[s1.length() + 1][s2.length() + 1]; - - // s1 如果变成空串的最小删除ASCII值综合 - for (int i = 1; i <= s1.length(); i++) { - dp[i][0] = dp[i - 1][0] + s1.charAt(i - 1); - } - // s2 如果变成空串的最小删除ASCII值综合 - for (int j = 1; j <= s2.length(); j++) { - dp[0][j] = dp[0][j - 1] + s2.charAt(j - 1); - } - - for (int i = 1; i <= s1.length(); i++) { - for (int j = 1; j <= s2.length(); j++) { - if (s1.charAt(i - 1) == s2.charAt(j - 1)) { - dp[i][j] = dp[i - 1][j - 1]; - } else { - dp[i][j] = Math.min(dp[i - 1][j] + s1.charAt(i - 1), dp[i][j - 1] + s2.charAt(j - 1)); - } - } - } - System.out.println(dp[s1.length()][s2.length()]); - scanner.close(); - } -} - - -``` - -### python - -```python -def min_delete_sum(s1: str, s2: str) -> int: - dp = [[0] * (len(s2) + 1) for _ in range(len(s1) + 1)] - - # s1 如果变成空串的最小删除ASCII值综合 - for i in range(1, len(s1) + 1): - dp[i][0] = dp[i - 1][0] + ord(s1[i - 1]) - # s2 如果变成空串的最小删除ASCII值综合 - for j in range(1, len(s2) + 1): - dp[0][j] = dp[0][j - 1] + ord(s2[j - 1]) - - for i in range(1, len(s1) + 1): - for j in range(1, len(s2) + 1): - if s1[i - 1] == s2[j - 1]: - dp[i][j] = dp[i - 1][j - 1] - else: - dp[i][j] = min(dp[i - 1][j] + ord(s1[i - 1]), dp[i][j - 1] + ord(s2[j - 1])) - - return dp[len(s1)][len(s2)] - -if __name__ == "__main__": - s1 = input().strip() - s2 = input().strip() - print(min_delete_sum(s1, s2)) -``` diff --git "a/problems/kamacoder/0143.\346\234\200\351\225\277\345\220\214\345\200\274\350\267\257\345\276\204.md" "b/problems/kamacoder/0143.\346\234\200\351\225\277\345\220\214\345\200\274\350\267\257\345\276\204.md" deleted file mode 100644 index bf46c895f8..0000000000 --- "a/problems/kamacoder/0143.\346\234\200\351\225\277\345\220\214\345\200\274\350\267\257\345\276\204.md" +++ /dev/null @@ -1,237 +0,0 @@ - - -# 143. 最长同值路径 - - -本题两个考点: - -1. 层序遍历构造二叉树 -2. 树形dp,找出最长路径 - -对于写代码不多,或者动手能力比较差的录友,第一个 构造二叉树 基本就被卡主了。 - -```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* constructBinaryTree(const vector& levelOrder) { - if (levelOrder.empty()) return NULL; - - TreeNode* root = new TreeNode(stoi(levelOrder[0])); - queue q; - q.push(root); - int i = 1; - - while (!q.empty() && i < levelOrder.size()) { - TreeNode* current = q.front(); - q.pop(); - - if (i < levelOrder.size() && levelOrder[i] != "null") { - current->left = new TreeNode(stoi(levelOrder[i])); - q.push(current->left); - } - i++; - - if (i < levelOrder.size() && levelOrder[i] != "null") { - current->right = new TreeNode(stoi(levelOrder[i])); - q.push(current->right); - } - i++; - } - - return root; -} - -int result = 0; - -// 树形DP -int dfs(TreeNode* node) { - if (node == NULL) return 0; - int leftPath = dfs(node->left); - int rightPath = dfs(node->right); - - int leftNum = 0, rightNum = 0; - if (node->left != NULL && node->left->val == node->val) { - leftNum = leftPath + 1; - } - if (node->right != NULL && node->right->val == node->val) { - rightNum = rightPath + 1; - } - result = max(result, leftNum + rightNum); - return max(leftNum, rightNum); - -} - - -int main() { - int n; - cin >> n; - vector levelOrder(n); - for (int i = 0; i < n ; i++) cin >> levelOrder[i]; - - TreeNode* root = constructBinaryTree(levelOrder); - dfs(root); - cout << result << endl; - - return 0; -} -``` - -### Java - -```Java -import java.util.*; - -class TreeNode { - int val; - TreeNode left, right; - TreeNode(int x) { - val = x; - left = null; - right = null; - } -} - -public class Main { - public static int result = 0; - - public static TreeNode constructBinaryTree(List levelOrder) { - if (levelOrder.isEmpty()) return null; - - TreeNode root = new TreeNode(Integer.parseInt(levelOrder.get(0))); - Queue queue = new LinkedList<>(); - queue.add(root); - int i = 1; - - while (!queue.isEmpty() && i < levelOrder.size()) { - TreeNode current = queue.poll(); - - if (i < levelOrder.size() && !levelOrder.get(i).equals("null")) { - current.left = new TreeNode(Integer.parseInt(levelOrder.get(i))); - queue.add(current.left); - } - i++; - - if (i < levelOrder.size() && !levelOrder.get(i).equals("null")) { - current.right = new TreeNode(Integer.parseInt(levelOrder.get(i))); - queue.add(current.right); - } - i++; - } - - return root; - } - - public static int dfs(TreeNode node) { - if (node == null) return 0; - int leftPath = dfs(node.left); - int rightPath = dfs(node.right); - - int leftNum = 0, rightNum = 0; - if (node.left != null && node.left.val == node.val) { - leftNum = leftPath + 1; - } - if (node.right != null && node.right.val == node.val) { - rightNum = rightPath + 1; - } - result = Math.max(result, leftNum + rightNum); - return Math.max(leftNum, rightNum); - } - - public static void main(String[] args) { - Scanner sc = new Scanner(System.in); - int n = sc.nextInt(); - sc.nextLine(); // consume the newline character - List levelOrder = new ArrayList<>(); - for (int i = 0; i < n; i++) { - levelOrder.add(sc.next()); - } - TreeNode root = constructBinaryTree(levelOrder); - dfs(root); - System.out.println(result); - sc.close(); - } -} - -``` - -### python - -```python -from typing import List, Optional -from collections import deque -import sys - -class TreeNode: - def __init__(self, val: int = 0, left: 'TreeNode' = None, right: 'TreeNode' = None): - self.val = val - self.left = left - self.right = right - -def construct_binary_tree(level_order: List[str]) -> Optional[TreeNode]: - if not level_order: - return None - - root = TreeNode(int(level_order[0])) - queue = deque([root]) - i = 1 - - while queue and i < len(level_order): - current = queue.popleft() - - if i < len(level_order) and level_order[i] != "null": - current.left = TreeNode(int(level_order[i])) - queue.append(current.left) - i += 1 - - if i < len(level_order) and level_order[i] != "null": - current.right = TreeNode(int(level_order[i])) - queue.append(current.right) - i += 1 - - return root - -result = 0 - -def dfs(node: Optional[TreeNode]) -> int: - global result - if node is None: - return 0 - - left_path = dfs(node.left) - right_path = dfs(node.right) - - left_num = right_num = 0 - if node.left is not None and node.left.val == node.val: - left_num = left_path + 1 - if node.right is not None and node.right.val == node.val: - right_num = right_path + 1 - - result = max(result, left_num + right_num) - return max(left_num, right_num) - -if __name__ == "__main__": - input = sys.stdin.read - data = input().strip().split() - - n = int(data[0]) - level_order = data[1:] - - root = construct_binary_tree(level_order) - dfs(root) - print(result) - - -``` diff --git "a/problems/kamacoder/0144.\345\255\227\345\205\270\345\272\217\346\234\200\345\260\217\347\232\20401\345\255\227\347\254\246\344\270\262.md" "b/problems/kamacoder/0144.\345\255\227\345\205\270\345\272\217\346\234\200\345\260\217\347\232\20401\345\255\227\347\254\246\344\270\262.md" deleted file mode 100644 index 1528fdbd3b..0000000000 --- "a/problems/kamacoder/0144.\345\255\227\345\205\270\345\272\217\346\234\200\345\260\217\347\232\20401\345\255\227\347\254\246\344\270\262.md" +++ /dev/null @@ -1,66 +0,0 @@ - -# 0144.字典序最小的01字符串 - -贪心思路:移动尽可能 移动前面的1 ,这样可以是 字典序最小 - -从前到后遍历,遇到 0 ,就用前面的 1 来交换 - -```CPP -#include -#include -using namespace std; -int main() { - int n,k; - cin >> n >> k; - string s; - cin >> s; - for(int i = 0; i < n && k > 0; i++) { - if(s[i] == '0') { - // 开始用前面的 1 来交换 - int j = i; - while(j > 0 && s[j - 1] == '1' && k > 0) { - swap(s[j], s[j - 1]); - --j; - --k; - } - } - } - cout << s << endl; - return 0; -} - -``` - -Java: - -```Java - -import java.util.*; - -public class Main { - public static void main(String[] args) { - Scanner scanner = new Scanner(System.in); - int n = scanner.nextInt(); - int k = scanner.nextInt(); - scanner.nextLine(); // 消耗掉换行符 - String s = scanner.nextLine(); - char[] ch = s.toCharArray(); - - for (int i = 0; i < n && k > 0; i++) { - if (ch[i] == '0') { - // 开始用前面的 1 来交换 - int j = i; - while (j > 0 && ch[j - 1] == '1' && k > 0) { - char tmp = ch[j]; - ch[j] = ch[j - 1]; - ch[j - 1] = tmp; - j--; - k--; - } - } - } - - System.out.println(new String(ch)); - } -} -``` diff --git "a/problems/kamacoder/0145.\346\225\260\347\273\204\345\255\220\345\272\217\345\210\227\347\232\204\346\216\222\345\210\227.md" "b/problems/kamacoder/0145.\346\225\260\347\273\204\345\255\220\345\272\217\345\210\227\347\232\204\346\216\222\345\210\227.md" deleted file mode 100644 index 757fe0b267..0000000000 --- "a/problems/kamacoder/0145.\346\225\260\347\273\204\345\255\220\345\272\217\345\210\227\347\232\204\346\216\222\345\210\227.md" +++ /dev/null @@ -1,98 +0,0 @@ - -# 145. 数组子序列的排列 - -每个元素出现的次数相乘就可以了。 - -注意 “长度为 m 的数组,1 到 m 每个元素都出现过,且恰好出现 1 次。” ,题目中有n个元素,所以我们要统计的就是 1 到 n 元素出现的个数。 - -因为如果有一个元素x 大于n了, 那不可能出现 长度为x的数组 且 1 到 x 每个元素都出现过。 - -```CPP -#include "bits/stdc++.h" -using namespace std; -int main(){ - int n; - int x; - cin >> n; - unordered_map umap; - for(int i = 0; i < n; ++i){ - cin >> x; - if(umap.find(x) != umap.end()) umap[x]++; - else umap[x] = 1; - } - long long res = 0; - long long num = 1; - for (int i = 1; i <= n; i++) { - if (umap.find(i) == umap.end()) break; // 如果i都没出现,后面得数也不能 1 到 m 每个元素都出现过 - num = (num * umap[i]) % 1000000007; - res += num; - res %= 1000000007; - } - cout << res << endl; -} - -``` - -```Java - -import java.util.HashMap; -import java.util.Map; -import java.util.Scanner; - -public class Main { - public static void main(String[] args) { - Scanner sc = new Scanner(System.in); - int n = sc.nextInt(); - Map map = new HashMap<>(); - for (int i = 0; i < n; i++) { - int x = sc.nextInt(); - map.put(x, map.getOrDefault(x, 0) + 1); - } - long res = 0; - long num = 1; - for (int i = 1; i <= n; i++) { - if (!map.containsKey(i)) break; // 如果i都没出现,后面得数也不能1到m每个元素都出现过 - num = (num * map.get(i)) % 1000000007; - res += num; - res %= 1000000007; - } - System.out.println(res); - sc.close(); - } -} - -``` - - -```python -def main(): - import sys - input = sys.stdin.read - data = input().split() - - n = int(data[0]) - umap = {} - - for i in range(1, n + 1): - x = int(data[i]) - if x in umap: - umap[x] += 1 - else: - umap[x] = 1 - - res = 0 - num = 1 - MOD = 1000000007 - - for i in range(1, n + 1): - if i not in umap: - break # 如果i都没出现,后面得数也不能1到m每个元素都出现过 - num = (num * umap[i]) % MOD - res = (res + num) % MOD - - print(res) - -if __name__ == "__main__": - main() - -``` diff --git "a/problems/kamacoder/0146.\344\274\240\351\200\201\346\240\221.md" "b/problems/kamacoder/0146.\344\274\240\351\200\201\346\240\221.md" deleted file mode 100644 index 4cafb0402f..0000000000 --- "a/problems/kamacoder/0146.\344\274\240\351\200\201\346\240\221.md" +++ /dev/null @@ -1,65 +0,0 @@ - - - - -# 146. 传送树 - -本题题意是比较绕的,我后面给补上了 【提示信息】对 题目输出样例讲解一下,相对会容易理解的多。 - -```CPP -#include -#include -#include -using namespace std; - -vector> edge; // 邻接表来存图 -vector nxt; -int n; - -/* - * 递归函数,用于找到每个节点的下一个传送门节点,并记录在nxt数组中。 - * 遍历当前节点的所有子节点,递归调用findNext以确保子节点的nxt值已经计算出来。 - * 更新当前节点的nxt值为其子节点中编号最小的节点。 - * 如果当前节点是叶子节点(即没有子节点),则将其nxt值设置为自身。 - */ -void findNext(int node) { - for (int v : edge[node]) { - findNext(v); - if (nxt[node] == -1 || nxt[node] > min(v, nxt[v])) { - nxt[node] = min(v, nxt[v]); - } - } - - // 叶子节点 - if (nxt[node] == -1) { - nxt[node] = node; - } -} - -// 计算从节点u出发经过若干次传送门到达叶子节点所需的步数。 -// 通过不断访问nxt节点,直到到达叶子节点,记录访问的节点数。 -int get(int u) { - int cnt = 1; - while (nxt[u] != u) { - cnt++; - u = nxt[u]; - } - return cnt; -} - -int main() { - cin >> n; - edge.resize(n + 1); - nxt.resize(n + 1, -1); - for (int i = 1; i <= n; ++i) { - int a, b; - cin >> a >> b; - edge[a].push_back(b); - } - findNext(1); - for (int i = 1; i <= n; ++i) { - cout << get(i) << ' '; - } -} - -``` diff --git "a/problems/kamacoder/0147.\344\270\211\347\217\240\344\272\222\346\226\245.md" "b/problems/kamacoder/0147.\344\270\211\347\217\240\344\272\222\346\226\245.md" deleted file mode 100644 index 2ef5d39291..0000000000 --- "a/problems/kamacoder/0147.\344\270\211\347\217\240\344\272\222\346\226\245.md" +++ /dev/null @@ -1,78 +0,0 @@ - -# 三珠互斥 - -1. 如果k * 3 大于 n 了,那说明一定没结果,如果没想明白,大家举个例子试试看 -2. 分别求出三个红珠子之间的距离 -3. 对这三段距离从小到大排序 y1, y2, y3 -4. 如果第一段距离y1 小于k,说明需要交换 k - y 次, 同理 第二段距离y2 小于k,说明需要交换 k - y2 次 -5. y1 y2 都调整好了,不用计算y3,因为 y3是距离最大 - -```CPP -#include -using namespace std; - -int main(){ - int t; - cin >> t; - int n, k, a1, a2, a3; - vector dis(3); - - while (t--) { - cin >> n >> k >> a1 >> a2 >> a3; - if(k * 3 > n){ - cout << -1 << endl; - continue; - } - dis[0] = min(abs(a1 - a2), n - abs(a1 - a2)); - dis[1] = min(abs(a1 - a3), n - abs(a1 - a3)); - dis[2] = min(abs(a3 - a2), n - abs(a3 - a2)); - - sort(dis.begin(), dis.end()); - - int result = 0; - if (dis[0] < k) result += (k - dis[0]); - if (dis[1] < k) result += (k - dis[1]); - - cout << result << endl; - } - return 0; -} -``` - -Java代码: - -```Java -import java.util.*; - -public class Main { - public static void main(String[] args) { - Scanner scanner = new Scanner(System.in); - int t = scanner.nextInt(); - - while (t-- > 0) { - int n = scanner.nextInt(); - int k = scanner.nextInt(); - int a1 = scanner.nextInt(); - int a2 = scanner.nextInt(); - int a3 = scanner.nextInt(); - if (k * 3 > n) { - System.out.println(-1); - continue; - } - - List dis = new ArrayList<>(3); - dis.add(Math.min(Math.abs(a1 - a2), n - Math.abs(a1 - a2))); - dis.add(Math.min(Math.abs(a1 - a3), n - Math.abs(a1 - a3))); - dis.add(Math.min(Math.abs(a3 - a2), n - Math.abs(a3 - a2))); - - Collections.sort(dis); - - int result = 0; - if (dis.get(0) < k) result += (k - dis.get(0)); - if (dis.get(1) < k) result += (k - dis.get(1)); - - System.out.println(result); - } - } -} -``` diff --git "a/problems/kamacoder/0148.\346\211\221\345\205\213\347\211\214\345\220\214\350\212\261\351\241\272.md" "b/problems/kamacoder/0148.\346\211\221\345\205\213\347\211\214\345\220\214\350\212\261\351\241\272.md" deleted file mode 100644 index cf8d325fba..0000000000 --- "a/problems/kamacoder/0148.\346\211\221\345\205\213\347\211\214\345\220\214\350\212\261\351\241\272.md" +++ /dev/null @@ -1,122 +0,0 @@ - -# 扑克牌同花顺 - -首先我们要定义一个结构体,来存放我们的数据 - -`map<花色,{同一花色牌集合,同一花色的牌对应的牌数量}>` - -再遍历 每一个花色下,每一个牌 的数量 - -代码如下详细注释: - - -```CPP -#include -using namespace std; - -string cards[] = {"H","S","D","C"}; -typedef long long ll; -struct color -{ - set st; // 同一花色 牌的集合 - map cnt; // 同一花色 牌对应的数量 -}; -unordered_map umap; - -int main() { - int n; - cin >> n; - for (int i = 0; i < n; i++) { - int x, y; - string card; - cin >> x >> y >> card; - umap[card].st.insert(x); - umap[card].cnt[x] += y; - } - ll sum = 0; - // 遍历每一个花色 - for (string cardOne : cards) { - color colorOne = umap[cardOne]; - // 遍历 同花色 每一个牌 - for (int number : colorOne.st) { - ll numberCount = colorOne.cnt[number]; // 获取牌为number的数量是 numberCount - - // 统计 number 到 number + 4 都是否有牌,用cal 把 number 到number+4 的数量记下来 - ll cal = numberCount; - for (int j = number + 1; j <= number + 4; j++) cal = min(cal, colorOne.cnt[j]); - // 统计结果 - sum += cal; - // 把统计过的同花顺数量减下去 - for (int j = number + 1; j <= number + 4; j++) colorOne.cnt[j] -= cal; - } - } - cout << sum << endl; -} -``` - -Java代码如下: - -```Java - -import java.util.*; - -public class Main { - static String[] cards = {"H", "S", "D", "C"}; // 花色数组 - - static class Color { - Set st; // 同一花色牌的集合 - Map cnt; // 同一花色牌对应的数量 - - Color() { - st = new HashSet<>(); // 初始化集合 - cnt = new HashMap<>(); // 初始化映射 - } - } - - static Map umap = new HashMap<>(); // 用于存储每种花色对应的Color对象 - - public static void main(String[] args) { - Scanner scanner = new Scanner(System.in); - int n = scanner.nextInt(); // 读取牌的数量 - - for (int i = 0; i < n; i++) { - int x = scanner.nextInt(); // 读取牌的值 - int y = scanner.nextInt(); // 读取牌的数量 - String card = scanner.next(); // 读取牌的花色 - - umap.putIfAbsent(card, new Color()); // 如果不存在该花色,则创建一个新的Color对象 - umap.get(card).st.add(x); // 将牌的值加入集合 - umap.get(card).cnt.put(x, umap.get(card).cnt.getOrDefault(x, 0L) + y); // 更新牌的数量 - } - - long sum = 0; // 结果累加器 - - // 遍历每一种花色 - for (String cardOne : cards) { - Color colorOne = umap.getOrDefault(cardOne, new Color()); // 获取对应花色的Color对象 - - // 遍历同花色的每一张牌 - for (int number : colorOne.st) { - long numberCount = colorOne.cnt.get(number); // 获取当前牌的数量 - - // 计算从当前牌到number+4的最小数量 - long cal = numberCount; - for (int j = number + 1; j <= number + 4; j++) { - cal = Math.min(cal, colorOne.cnt.getOrDefault(j, 0L)); // 更新cal为最小值 - } - - // 将结果累加到sum - sum += cal; - - // 将统计过的同花顺数量减去 - for (int j = number + 1; j <= number + 4; j++) { - colorOne.cnt.put(j, colorOne.cnt.getOrDefault(j, 0L) - cal); - } - } - } - - System.out.println(sum); // 输出结果 - } -} - -``` diff --git "a/problems/kamacoder/0149.\345\245\275\346\225\260\347\273\204.md" "b/problems/kamacoder/0149.\345\245\275\346\225\260\347\273\204.md" deleted file mode 100644 index 09088168bc..0000000000 --- "a/problems/kamacoder/0149.\345\245\275\346\225\260\347\273\204.md" +++ /dev/null @@ -1,102 +0,0 @@ - -# 149. 好数组 - -贪心思路: - -整体思路是移动到中间位置(中位数),一定是 移动次数最小的。 - -有一个数可以不改变,对数组排序之后, 最小数 和 最大数 一定是移动次数最多的,所以分别保留最小 和 最大的不变。 - -中间可能有两个位置,所以要计算中间偏前 和 中间偏后的 - -代码如下: - -```CPP -#include -using namespace std; - -int main() { - int n; - cin >> n; - vector arr(n); - for (int i = 0; i < n; ++i) { - cin >> arr[i]; - } - sort(arr.begin(), arr.end()); - - if (arr[0] == arr[n - 1]) { - cout << 1 << endl; - return 0; - } - long cnt = 0L; - long cnt1 = 0L; - - // 如果要保留一个不改变,要不不改最小的,要不不改最大的。 - - // 取中间偏前的位置 - long mid = arr[(n - 2) / 2]; - - // 不改最大的 - for (int i = 0; i < n - 1; i++) { - cnt += abs(arr[i] - mid); - } - - // 取中间偏后的位置 - mid = arr[n / 2]; - - // 不改最小的 - for (int i = 1; i < n; i++) { - cnt1 += abs(arr[i] - mid); - } - - cout << min(cnt, cnt1) << endl; - return 0; -} -``` - -Java代码如下: - -```Java - -import java.util.*; - -public class Main { - public static void main(String[] args) { - Scanner scanner = new Scanner(System.in); - int n = scanner.nextInt(); - long[] arr = new long[n]; - for (int i = 0; i < n; ++i) { - arr[i] = scanner.nextLong(); - } - Arrays.sort(arr); - - if (arr[0] == arr[n - 1]) { - System.out.println(1); - return; - } - long cnt = 0L; - long cnt1 = 0L; - - // 如果要保留一个不改变,要不不改最小的,要不不改最大的。 - - // 取中间偏前的位置 - long mid = arr[(n - 2) / 2]; - - // 不改最大的 - for (int i = 0; i < n - 1; i++) { - cnt += Math.abs(arr[i] - mid); - } - - // 取中间偏后的位置 - mid = arr[n / 2]; - - // 不改最小的 - for (int i = 1; i < n; i++) { - cnt1 += Math.abs(arr[i] - mid); - } - - System.out.println(Math.min(cnt, cnt1)); - } -} - -``` diff --git "a/problems/kamacoder/0150.\346\236\201\351\225\277\350\277\236\347\273\255\346\256\265\347\232\204\346\235\203\345\200\274.md" "b/problems/kamacoder/0150.\346\236\201\351\225\277\350\277\236\347\273\255\346\256\265\347\232\204\346\235\203\345\200\274.md" deleted file mode 100644 index 503d6a23ac..0000000000 --- "a/problems/kamacoder/0150.\346\236\201\351\225\277\350\277\236\347\273\255\346\256\265\347\232\204\346\235\203\345\200\274.md" +++ /dev/null @@ -1,66 +0,0 @@ - -# 150. 极长连续段的权值 - -动态规划,枚举最后边节点的情况: - -```CPP -#include -#include -using namespace std; - -int main() { - int n; - cin >> n; - string s; - cin >> s; - - long long result = 1; - long long a = 1; - - for (int i = 1; i < n; ++i) { - // 加上本身长度为1的子串 - if (s[i] == s[i - 1]) { - a += 1; - result += a; - // 以最右节点为终点,每个子串的级长连续段都+1,再加本身长度为1的子串 - } else { - a = a + i + 1; - result += a; - } - } - cout << result << endl; - return 0; -} -``` - -Java代码如下: - -```Java -import java.util.Scanner; - -public class Main { - public static void main(String[] args) { - Scanner scanner = new Scanner(System.in); - int n = scanner.nextInt(); - String s = scanner.next(); - - long result = 1; - long a = 1; - - for (int i = 1; i < n; ++i) { - // 加上本身长度为1的子串 - if (s.charAt(i) == s.charAt(i - 1)) { - a += 1; - result += a; - // 以最右节点为终点,每个子串的级长连续段都+1,再加本身长度为1的子串 - } else { - a = a + i + 1; - result += a; - } - } - - System.out.println(result); - } -} - -``` diff --git "a/problems/kamacoder/0151.\346\211\213\346\234\272\346\265\201\347\225\205\350\277\220\350\241\214\347\232\204\347\247\230\345\257\206.md" "b/problems/kamacoder/0151.\346\211\213\346\234\272\346\265\201\347\225\205\350\277\220\350\241\214\347\232\204\347\247\230\345\257\206.md" deleted file mode 100644 index 3859f7b039..0000000000 --- "a/problems/kamacoder/0151.\346\211\213\346\234\272\346\265\201\347\225\205\350\277\220\350\241\214\347\232\204\347\247\230\345\257\206.md" +++ /dev/null @@ -1,127 +0,0 @@ -# 151. 手机流畅运行的秘密 - -[题目链接](https://kamacoder.com/problempage.php?pid=1229) - -先运行 能留下电量多的 任务,才能有余电运行其他任务。 - -任务1,1:10 ,运行完 能留下 9个电 - -任务2,2:12,运行完 能留下 10个电 - -任务3,3:10,运行完 能留下 7个电。 - -运行顺序: 任务2 -> 任务1 -> 任务3 - -按照 最低初始电量 - 耗电量,从大到小排序。 - -计算总电量,需要 从小到大 遍历, 不断取 总电量 + 任务耗电量 与 任务最低初始电量 的最大值。 - -```CPP -#include -using namespace std; - -bool cmp(const pair& taskA, const pair& taskB) { - return (taskA.second - taskA.first) < (taskB.second - taskB.first); -} -int main() { - string str, tmp; - vector> tasks; - - //处理输入 - getline(cin, str); - stringstream ss(str); - while (getline(ss, tmp, ',')) { - int p = tmp.find(":"); - string a = tmp.substr(0, p); - string b = tmp.substr(p + 1); - tasks.push_back({stoi(a), stoi(b)}); - } - - // 按照差值从小到大排序 - sort(tasks.begin(), tasks.end(), cmp); - - // 收集结果 - int result = 0; - for (int i = 0 ; i < tasks.size(); i++) { - result = max(result + tasks[i].first, tasks[i].second); - } - - result = result <= 4800 ? result : -1; - cout << result << endl; - -} -``` - -Java版本: - -```Java -import java.util.*; -import java.util.stream.Collectors; - -public class Main { - public static void main(String[] args) { - Scanner sc = new Scanner(System.in); - String str = sc.nextLine(); - String[] tasksArray = str.split(","); - List tasks = Arrays.stream(tasksArray) - .map(task -> { - String[] parts = task.split(":"); - return new Pair(Integer.parseInt(parts[0]), Integer.parseInt(parts[1])); - }) - .collect(Collectors.toList()); - - // 按照差值从小到大排序 - Collections.sort(tasks, (taskA, taskB) -> - (taskA.second - taskA.first) - (taskB.second - taskB.first) - ); - - // 收集结果 - int result = 0; - for (Pair task : tasks) { - result = Math.max(result + task.first, task.second); - } - - result = result <= 4800 ? result : -1; - System.out.println(result); - } -} - -class Pair { - int first; - int second; - - Pair(int first, int second) { - this.first = first; - this.second = second; - } -} - -``` - -Python版本: - -```python -def main(): - import sys - input = sys.stdin.read - - str = input().strip() - tasks = [] - for tmp in str.split(','): - a, b = map(int, tmp.split(':')) - tasks.append((a, b)) - - # 按照差值从小到大排序 - tasks.sort(key=lambda task: task[1] - task[0]) - - # 收集结果 - result = 0 - for task in tasks: - result = max(result + task[0], task[1]) - - result = result if result <= 4800 else -1 - print(result) - -if __name__ == "__main__": - main() -``` diff --git "a/problems/kamacoder/0152.\345\260\217\347\261\263\346\211\213\346\234\272\351\200\232\344\277\241\346\240\241\345\207\206.md" "b/problems/kamacoder/0152.\345\260\217\347\261\263\346\211\213\346\234\272\351\200\232\344\277\241\346\240\241\345\207\206.md" deleted file mode 100644 index afb5d8eaf4..0000000000 --- "a/problems/kamacoder/0152.\345\260\217\347\261\263\346\211\213\346\234\272\351\200\232\344\277\241\346\240\241\345\207\206.md" +++ /dev/null @@ -1,121 +0,0 @@ - - -# 152. 小米手机通信校准 - -[题目链接](https://kamacoder.com/problempage.php?pid=1230) - -一道模拟题,但比较考察 代码能力。 - -遍历去找 里 freq 最近的 freg就好, 需要记录刚遍历过的的freg和 loss,因为可能有 相邻一样的 freg。 - -```CPP -#include -using namespace std; - -int main() { - int freq; - cin >> freq; - string data; - double result = 0; - int last_freg = 0; // 记录上一个 freg - int last_loss = 0; // 记录上一个loss - while(cin >> data) { - int index = data.find(':'); - int freg = stoi(data.substr(0, index)); // 获取 freg 和 loss - int loss = stoi(data.substr(index + 1)); - // 两遍一样 - if(abs(freg - freq) == abs(last_freg - freq)) { - result = (double)(last_loss + loss)/2.0; - } // 否则更新最新的result - else if(abs(freg - freq) < abs(last_freg - freq)){ - result = (double)loss; - } - last_freg = freg; - last_loss = loss; - } - printf("%.1lf\n", result); - return 0; -} - -``` - -Java 版本: - -```Java - -import java.util.Scanner; - -public class Main { - public static void main(String[] args) { - Scanner sc = new Scanner(System.in); - int freq = sc.nextInt(); - sc.nextLine(); // 读取换行符 - - String inputLine = sc.nextLine(); // 读取包含所有后续输入的行 - String[] data = inputLine.split(" "); // 根据空格分割输入 - - double result = 0; - int lastFreq = 0; // 记录上一个 freg - int lastLoss = 0; // 记录上一个 loss - - for (String entry : data) { - int index = entry.indexOf(':'); - int freg = Integer.parseInt(entry.substring(0, index)); // 获取 freg 和 loss - int loss = Integer.parseInt(entry.substring(index + 1)); - - // 两遍一样 - if (Math.abs(freg - freq) == Math.abs(lastFreq - freq)) { - result = (double) (lastLoss + loss) / 2.0; - } - // 否则更新最新的 result - else if (Math.abs(freg - freq) < Math.abs(lastFreq - freq)) { - result = (double) loss; - } - - lastFreq = freg; - lastLoss = loss; - } - - System.out.printf("%.1f\n", result); - sc.close(); - } -} - -``` - -Python版本: - -```python -def main(): - import sys - input = sys.stdin.read - data = input().split() - - freq = int(data[0]) - result = 0 - last_freg = 0 # 记录上一个 freg - last_loss = 0 # 记录上一个 loss - - for i in range(1, len(data)): - item = data[i] - index = item.find(':') - freg = int(item[:index]) # 获取 freg 和 loss - loss = int(item[index + 1:]) - - # 两遍一样 - if abs(freg - freq) == abs(last_freg - freq): - result = (last_loss + loss) / 2.0 - # 否则更新最新的 result - elif abs(freg - freq) < abs(last_freg - freq): - result = loss - - last_freg = freg - last_loss = loss - - print(f"{result:.1f}") - -if __name__ == "__main__": - main() - - -``` diff --git "a/problems/kamacoder/0153.\346\235\203\345\200\274\344\274\230\345\212\277\350\267\257\345\276\204\350\256\241\346\225\260.md" "b/problems/kamacoder/0153.\346\235\203\345\200\274\344\274\230\345\212\277\350\267\257\345\276\204\350\256\241\346\225\260.md" deleted file mode 100644 index 2c5562b392..0000000000 --- "a/problems/kamacoder/0153.\346\235\203\345\200\274\344\274\230\345\212\277\350\267\257\345\276\204\350\256\241\346\225\260.md" +++ /dev/null @@ -1,95 +0,0 @@ - - -# 权值优势路径计数 - -[题目链接](https://kamacoder.com/problempage.php?pid=1231) - -1、构建二叉树:首先根据层序遍历的序列构建二叉树。这可以通过使用队列来实现,队列中存储当前节点及其索引,确保可以正确地将子节点添加到父节点下。 - -2、路径遍历:使用深度优先搜索(DFS)遍历所有从根到叶子的路径。在遍历过程中,维护一个计数器跟踪当前路径中权值为 1 和权值为 0 的节点的数量。 - -3、计数满足条件的路径:每当到达一个叶子节点时,检查当前路径的权值 1 的节点数量是否比权值 0 的节点数量多 1。如果满足,递增一个全局计数器。 - - -```CPP - -#include -#include -#include - -using namespace std; - -struct TreeNode { - int val; - TreeNode *left, *right; - TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} -}; - -// DFS遍历二叉树,并计算满足条件的路径数量 -void countPaths(TreeNode* node, int count1, int count0, int& result) { - if (!node) return; - - // 更新当前路径中1和0的数量 - node->val == 1 ? count1++ : count0++; - - // 检查当前节点是否为叶子节点 - if (!node->left && !node->right) { - // 检查1的数量是否比0的数量多1 - if (count1 == count0 + 1) { - result++; - } - return; - } - - // 递归访问左右子节点 - countPaths(node->left, count1, count0, result); - countPaths(node->right, count1, count0, result); -} - -int main() { - int N; - cin >> N; - - vector nums(N); - for (int i = 0; i < N; ++i) { - cin >> nums[i]; - } - - if (nums.empty()) { - cout << 0 << endl; - return 0; - } - - // 根据层序遍历的输入构建二叉树 - queue q; - TreeNode* root = new TreeNode(nums[0]); - q.push(root); - int index = 1; - - while (!q.empty() && index < N) { - TreeNode* node = q.front(); - q.pop(); - - if (index < N && nums[index] != -1) { - node->left = new TreeNode(nums[index]); - q.push(node->left); - } - index++; - - if (index < N && nums[index] != -1) { - node->right = new TreeNode(nums[index]); - q.push(node->right); - } - index++; - } - - // 计算满足条件的路径数 - int result = 0; - countPaths(root, 0, 0, result); - - cout << result << endl; - - return 0; -} - -``` diff --git "a/problems/kamacoder/0154.\345\272\217\345\210\227\344\270\255\344\275\215\346\225\260.md" "b/problems/kamacoder/0154.\345\272\217\345\210\227\344\270\255\344\275\215\346\225\260.md" deleted file mode 100644 index 90e5b7a413..0000000000 --- "a/problems/kamacoder/0154.\345\272\217\345\210\227\344\270\255\344\275\215\346\225\260.md" +++ /dev/null @@ -1,68 +0,0 @@ - -# 序列中位数 - -[题目链接](https://kamacoder.com/problempage.php?pid=1232) - -注意给的数组默认不是有序的! - -模拟题,排序之后,取中位数,然后按照b数组 删 a数组中元素,再取中位数。 - -```CPP -#include -using namespace std; - -// 计算并返回中位数 -double findMedian(vector& nums) { - int n = nums.size(); - if (n % 2 == 1) { - return nums[n / 2]; // 奇数长度,返回中间的元素 - } else { - // 偶数长度,返回中间两个元素的平均值 - return (nums[n / 2] + nums[n / 2 - 1]) / 2.0; - } -} - - -int main(){ - int t; - cin >> t; - while(t--){ - int n; - cin>> n; - vector a(n); - vector b(n - 1); - for(int i = 0; i < n; i++){ - cin >> a[i]; - } - for(int i = 0; i < n - 1; i++){ - cin >> b[i]; - } - vector nums = a; - vector answers; - - sort(nums.begin(), nums.end()); - - // 把中位数放进结果集 - answers.push_back(findMedian(nums)); - - for(int i = 0; i < n - 1; i++){ - - int target = a[b[i]]; - // 删除目标值 - nums.erase(find(nums.begin(), nums.end(), target)); - // 把中位数放进结果集 - answers.push_back(findMedian(nums)); - - } - - for(auto answer : answers){ - // 判断是否是整数 - if(answer == (int)answer) printf("%d ", (int)answer); - else printf("%.1f ", answer); - } - cout << endl; - } - -} - -``` diff --git "a/problems/kamacoder/0155.\346\234\200\345\260\217\345\214\226\351\242\221\347\216\207\347\232\204\345\210\240\351\231\244\344\273\243\344\273\267.md" "b/problems/kamacoder/0155.\346\234\200\345\260\217\345\214\226\351\242\221\347\216\207\347\232\204\345\210\240\351\231\244\344\273\243\344\273\267.md" deleted file mode 100644 index d79d695548..0000000000 --- "a/problems/kamacoder/0155.\346\234\200\345\260\217\345\214\226\351\242\221\347\216\207\347\232\204\345\210\240\351\231\244\344\273\243\344\273\267.md" +++ /dev/null @@ -1,106 +0,0 @@ - -# 最小化频率的删除代价 - -[题目链接](https://kamacoder.com/problempage.php?pid=1233) - -计数和排序: - -* 使用 map 或 unordered_map 对数组 a 中每个元素出现的次数进行统计。 -* 将统计结果存入一个 vector>,其中 pair 的第一个元素是元素的出现次数,第二个元素是元素本身。 -* 按出现次数从大到小排序这个 vector。 - -确定最小 f(a): - -* 从最大出现次数开始尝试减少 f(a)。为此,从最高频次的元素开始逐步向下考虑较少出现的元素,计算达到更低 f(a) 所需删除的元素数量。 -* 使用一个累加器 count 来记录需要删除的元素数量,直到这个数量超过允许的最大删除数量 k 或恰好等于 k。在此过程中,尽量使 f(a) 达到最小。 - -计算达到 f(a) 的代价: - -* 计算完成后,需要确定达到最小 f(a) 的确切代价。首先,为每个元素确定在不超过 k 的前提下可以删除的最大数量,以使得 f(a) 最小。 -* 对于每个元素,如果它的数量超过了新的 f(a),则计算减少到 f(a) 所需删除的具体元素数,记录下来。 - -计算具体删除代价: - -* 遍历原数组,对于每个需要删除的元素,根据其位置累加删除代价。每删除一个元素,相应地减少其在删除列表中的计数。当某元素需要删除的数量减至 0 时,从删除列表中移除该元素。 - - -```CPP - -#include -#include -#include -#include - -using namespace std; - -int main() { - int n, k; - cin >> n >> k; - - vector a(n); - for (int i = 0; i < n; ++i) { - cin >> a[i]; - } - - unordered_map umap; // 使用map来统计每个元素的出现频率 - for (int i = 0; i < n; ++i) { - umap[a[i]]++; // 统计每个元素的出现次数 - } - - vector> table; - for (auto& pair : umap) { - table.push_back({pair.second, pair.first}); // 将元素和其频率作为一个pair放入table中 - } - - sort(table.begin(), table.end(), greater<>()); // 将table按照频率从大到小排序 - - int count = 0; // 用来计算已经删除的元素总数 - int minVal = table[0].first; // 从最高频率开始 - for (int i = 0; i < table.size(); ++i) { - int freq = table[i].first; - count += (minVal - freq) * i; // 累加删除元素的代价 - if (count > k) break; // 如果超过了k,停止循环 - else if (count == k) { - minVal = freq; - break; - } else minVal = freq; - } - if (count < k) { - int addDel = (k - count) / table.size(); // 如果删除的代价还没达到k,计算还可以进一步减少的频率 - minVal -= addDel; // 减少相应的频率 - } - - if (minVal < 0) { - minVal = 0; // 确保最小频率值不小于0 - } - - unordered_map deleteList; // 用来存储需要删除的元素及其数量 - for (auto& elem : table) { - int num = elem.first; - int ind = elem.second; - if (num > minVal) { - deleteList[ind] = num - minVal; // 如果元素频率大于最小值,计算需要删除的数量 - } else { - break; - } - } - - int cost = 0; // 计算总的删除代价 - for (int i = 0; i < n; ++i) { - if (deleteList.find(a[i]) != deleteList.end()) { - cost += i + 1; // 删除的代价是元素的索引+1 - deleteList[a[i]]--; // 删除一个元素 - if (deleteList[a[i]] == 0) { - deleteList.erase(a[i]); // 如果元素已经全部删除,从列表中移除 - if (deleteList.empty()) { - break; // 如果没有元素需要删除了,结束循环 - } - } - } - } - - cout << minVal << " " << cost << endl; - return 0; -} - -``` diff --git "a/problems/kamacoder/0156.\345\213\207\346\225\242\347\211\233\347\211\233\346\210\230\346\226\227\345\272\217\345\210\227.md" "b/problems/kamacoder/0156.\345\213\207\346\225\242\347\211\233\347\211\233\346\210\230\346\226\227\345\272\217\345\210\227.md" deleted file mode 100644 index b7bea97458..0000000000 --- "a/problems/kamacoder/0156.\345\213\207\346\225\242\347\211\233\347\211\233\346\210\230\346\226\227\345\272\217\345\210\227.md" +++ /dev/null @@ -1,68 +0,0 @@ - -# 勇敢牛牛战斗序列 - -[题目链接](https://kamacoder.com/problempage.php?pid=1234) - -贪心思路,对数组从小到大排序之后,先取最右边,再取最左边,循环反复。 - -```CPP -#include - -using namespace std; - -int main() { - int n; - cin >> n; - vector a(n); // 使用 vector 存储整数数组 - for (int i = 0; i < n; i++) { - cin >> a[i]; // 读取数组 - } - sort(a.begin(), a.end()); // 对数组进行排序 - - long long ans = 0; // 使用 long long 存储结果,以防溢出 - int cur = 0; - int left = 0, right = n - 1; - while (left <= right) { - if (cur < a[right]) { - ans += a[right] - cur; - } - cur = a[left]; - right--; - left++; - } - cout << ans << endl; // 输出结果 - return 0; -} -``` - - - -```Java -import java.util.Arrays; -import java.util.Scanner; - -public class Main { - - public static void main(String[] args) { - Scanner sc = new Scanner(System.in); - int n = sc.nextInt(); - int[] a = new int[n]; - for (int i = 0; i < n; i++) { - a[i] = sc.nextInt(); - } - Arrays.sort(a); - long ans = 0; - int cur = 0; - int left = 0, right = a.length - 1; - while (left <= right) { - if (cur < a[right]) { - ans = ans + a[right] - cur; - } - cur = a[left]; - right--; - left++; - } - System.out.println(ans); - } -} -``` diff --git "a/problems/kamacoder/0157.\346\234\200\345\244\247\345\214\226\345\257\206\347\240\201\345\244\215\346\235\202\345\272\246.md" "b/problems/kamacoder/0157.\346\234\200\345\244\247\345\214\226\345\257\206\347\240\201\345\244\215\346\235\202\345\272\246.md" deleted file mode 100644 index 9ca4630df1..0000000000 --- "a/problems/kamacoder/0157.\346\234\200\345\244\247\345\214\226\345\257\206\347\240\201\345\244\215\346\235\202\345\272\246.md" +++ /dev/null @@ -1,59 +0,0 @@ - -# 最大化密码复杂度 - -[题目链接](https://kamacoder.com/problempage.php?pid=1235) - -注意**边界处理**,对于字符串的首尾位置,需要特别处理,因为它们只有一个相邻字符。 -* 遍历字符串 s,寻找 '?' 字符。 -* 对于每个 '?' 字符,选择一个字符填充,使其与前后字符都不同。这样做的目的是最大化密码的复杂度,即尽可能使相邻的字符不同。 -* 如果 '?' 是第一个或最后一个字符,或者无法找到与前后都不同的字符,选择与前一个或后一个字符不同的字符。 - - -```CPP -#include -#include -#include - -using namespace std; - -int main() { - int n, m; - string s; - cin >> n >> m >> s; - - if (n == 1) { - cout << 0 << endl; - return 0; - } - - // 统一处理包括左右字符的情况 - for (int i = 0; i < n; ++i) { - if (s[i] == '?') { - bool found = false; - for (char j = 'a'; j < 'a' + m; ++j) { - // 避免第一个字符 和 最后一个字符,因为两个字符只有一个相邻字符,没有左右相邻字符 - if ((i == 0 || s[i - 1] != j) && (i == n - 1 || s[i + 1] != j)) { - s[i] = j; - found = true; - break; - } - } - // 如果没有找到合适的字符,就和附近字符保持一致 - if (!found) { - if (i > 0) s[i] = s[i - 1]; - else s[i] = s[i + 1]; - } - } - } - - // 计算结果 - int result = 0; - for (int i = 0; i < n - 1; ++i) { - if (s[i] != s[i + 1]) result++; - } - - cout << result << endl; - return 0; -} - -``` diff --git "a/problems/kamacoder/0158.\345\220\214\344\275\231\346\226\271\347\250\213.md" "b/problems/kamacoder/0158.\345\220\214\344\275\231\346\226\271\347\250\213.md" deleted file mode 100644 index b99481d2de..0000000000 --- "a/problems/kamacoder/0158.\345\220\214\344\275\231\346\226\271\347\250\213.md" +++ /dev/null @@ -1,50 +0,0 @@ - -# 同余方程 - -题目链接:https://kamacoder.com/problempage.php?pid=1236 - -我们需要求出满足以下条件的最小正整数 x:`ax≡1 (mod b)` - -这意味着我们需要找到 x 使得 ax 除以 b 的余数是 1。这个问题实际上是一个典型的 模反元素 问题。 - -解题思路: - -* 为了求出最小的 x,我们可以使用 扩展欧几里得算法 来求出 a 对模 b 的逆元。 -* 这个算法能够求解 ax + by = gcd(a, b) 的一组整数解 (x, y),而在 gcd(a, b) = 1 的情况下,x 即为所求的模逆元。 -* 扩展欧几里得算法:扩展欧几里得算法可以通过递归或者迭代的方式实现。 - -下面给出C++代码实现: - -```CPP -#include -using namespace std; - -// 扩展欧几里得:计算 ax + by = gcd(a, b) 的解 -long long extended_gcd(long long a, long long b, long long &x, long long &y) { - if (b == 0) { - x = 1; - y = 0; - return a; - } - long long x1, y1; - long long gcd = extended_gcd(b, a % b, x1, y1); - x = y1; - y = x1 - (a / b) * y1; - return gcd; -} - -int main() { - long long a, b; - cin >> a >> b; - - long long x, y; - long long gcd = extended_gcd(a, b, x, y); - - // 由于我们只需要模 b 的正整数解,所以我们要保证 x 是正数 - x = (x % b + b) % b; - - cout << x << endl; - - return 0; -} -``` diff --git "a/problems/kamacoder/0159.\345\244\247\346\225\264\346\225\260\344\271\230\346\263\225.md" "b/problems/kamacoder/0159.\345\244\247\346\225\264\346\225\260\344\271\230\346\263\225.md" deleted file mode 100644 index 642cb74694..0000000000 --- "a/problems/kamacoder/0159.\345\244\247\346\225\264\346\225\260\344\271\230\346\263\225.md" +++ /dev/null @@ -1,62 +0,0 @@ - -# 大整数乘法 - -题目链接:https://kamacoder.com/problempage.php?pid=1237 - -思路: - -我们可以使用模拟手算乘法的方法,即「逐位相乘累加」,对于每一位的乘法结果,我们将其加到相应的结果位置上。最终将累加的结果输出。 - -具体步骤: - -* 初始化结果数组:结果数组的长度应该是两个数字长度之和,因为最大长度的结果不会超过这个长度。 -* 逐位相乘:从右往左遍历两个字符串的每一位,逐位相乘,并加到结果数组的相应位置。 -* 处理进位:在每一步累加之后处理进位,保证每个位置的值小于10。 - -将结果数组转化为字符串:从结果数组的最高位开始,忽略前导零,然后将数组转化为字符串。 - -```CPP -#include -#include -#include - -using namespace std; - -string multiply(string num1, string num2) { - int len1 = num1.size(); - int len2 = num2.size(); - vector result(len1 + len2, 0); - - // 逐位相乘 - for (int i = len1 - 1; i >= 0; i--) { - for (int j = len2 - 1; j >= 0; j--) { - int mul = (num1[i] - '0') * (num2[j] - '0'); - int sum = mul + result[i + j + 1]; - - result[i + j + 1] = sum % 10; - result[i + j] += sum / 10; - } - } - - // 将结果转换为字符串,跳过前导零 - string product; - for (int num : result) { - if (!(product.empty() && num == 0)) { // 跳过前导零 - product.push_back(num + '0'); - } - } - - return product.empty() ? "0" : product; -} - -int main() { - string num1, num2; - cin >> num1 >> num2; - - string result = multiply(num1, num2); - cout << result << endl; - - return 0; -} - -``` diff --git "a/problems/kamacoder/0160.\344\272\214\347\273\264\345\271\263\351\235\242\344\270\212\347\232\204\346\212\230\347\272\277\346\256\265.md" "b/problems/kamacoder/0160.\344\272\214\347\273\264\345\271\263\351\235\242\344\270\212\347\232\204\346\212\230\347\272\277\346\256\265.md" deleted file mode 100644 index 35c3ea3283..0000000000 --- "a/problems/kamacoder/0160.\344\272\214\347\273\264\345\271\263\351\235\242\344\270\212\347\232\204\346\212\230\347\272\277\346\256\265.md" +++ /dev/null @@ -1,88 +0,0 @@ - -# 二维平面上的折线段 - -题目链接:https://kamacoder.com/problempage.php?pid=1238 - -这个问题要求我们在一条折线段上,根据移动的固定距离 s 进行标记点的计算。 - -为了实现这一点,我们需要对折线段进行分段处理,并根据每段的长度来确定标记点的位置。 - -解题思路: - -1. 输入与初步处理: - * 首先,读取所有点的坐标。 - * 计算每一段折线的长度,并逐段累积总长度。 -2. 确定标记点: - * 从起点开始,每次沿着折线段前进 s 的距离,直到到达终点。 - * 对于每个标记点,根据当前段的起点和终点,计算出该点的精确坐标。 -3. 输出所有标记点的坐标,格式为 x, y。 - -```CPP - -#include -#include -#include -#include - -using namespace std; - -// 定义一个点的结构体 -struct Point { - double x, y; -}; - -// 计算两点之间的距离 -double distance(const Point& a, const Point& b) { - return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y)); -} - -int main() { - int n; - cin >> n; - - vector points(n); - for (int i = 0; i < n; i++) { - cin >> points[i].x >> points[i].y; - } - - double s; - cin >> s; - - double total_length = 0.0; - vector segment_lengths(n - 1); - - // 计算每段长度和总长度 - for (int i = 0; i < n - 1; i++) { - segment_lengths[i] = distance(points[i], points[i + 1]); - total_length += segment_lengths[i]; - } - - // 从起点开始标记 - Point current_point = points[0]; - double accumulated_distance = 0.0; - - cout << fixed << setprecision(5); - cout << current_point.x << ", " << current_point.y << endl; - - while (accumulated_distance + s <= total_length) { - accumulated_distance += s; - double remaining_distance = accumulated_distance; - - for (int i = 0; i < n - 1; i++) { - if (remaining_distance <= segment_lengths[i]) { - double ratio = remaining_distance / segment_lengths[i]; - double new_x = points[i].x + ratio * (points[i + 1].x - points[i].x); - double new_y = points[i].y + ratio * (points[i + 1].y - points[i].y); - current_point = {new_x, new_y}; - cout << current_point.x << ", " << current_point.y << endl; - break; - } else { - remaining_distance -= segment_lengths[i]; - } - } - } - - return 0; -} - -``` diff --git "a/problems/kamacoder/0161.\350\256\250\345\216\214\351\254\274\347\232\204\347\273\204\345\220\210\345\270\226\345\255\220.md" "b/problems/kamacoder/0161.\350\256\250\345\216\214\351\254\274\347\232\204\347\273\204\345\220\210\345\270\226\345\255\220.md" deleted file mode 100644 index 84471f8cd6..0000000000 --- "a/problems/kamacoder/0161.\350\256\250\345\216\214\351\254\274\347\232\204\347\273\204\345\220\210\345\270\226\345\255\220.md" +++ /dev/null @@ -1,61 +0,0 @@ - -# 讨厌鬼的组合帖子 - -[题目链接](https://kamacoder.com/problempage.php?pid=1239) - -这个问题本质上是要找到两个数组的子集,使得这两个子集之间的差的绝对值最大。 - -问题可以简化为寻找两个数列之间最大可能的差的绝对值。 - -贪心思路如下: - -计算差异,首先,我们可以计算每个帖子的点赞数和点踩数的差值 d[i] = a[i] - b[i]。这样问题就转化为选择这些差值的一个子集,使得子集中所有元素的和的绝对值最大。 - -遍历可能性,要使得一个数的绝对值尽可能大,可以尝试最大化这个数,或者最小化这个数(使其尽可能小于零)。我们可以分别尝试将所有正的差值加在一起,以及将所有负的差值加在一起。 - -计算最大吸引度: - -* 将所有正的差值求和得到一个总和。 -* 将所有负的差值求和得到另一个总和。 -* 最后,吸引度即为这两个总和的绝对值中的较大者。 - - -```CPP - -#include -#include -#include - -using namespace std; - -int main() { - int n; - cin >> n; - - vector a(n), b(n); - for (int i = 0; i < n; ++i) { - cin >> a[i]; - } - for (int i = 0; i < n; ++i) { - cin >> b[i]; - } - - long long positive_sum = 0; - long long negative_sum = 0; - - for (int i = 0; i < n; ++i) { - int difference = a[i] - b[i]; - if (difference > 0) { - positive_sum += difference; - } else if (difference < 0) { - negative_sum += difference; - } - } - - // 最大吸引度是正总和或负总和的绝对值中的较大者 - cout << max(abs(positive_sum), abs(negative_sum)) << endl; - - return 0; -} -``` - diff --git "a/problems/kamacoder/0163.\344\274\230\347\247\200\346\225\260\347\273\204.md" "b/problems/kamacoder/0163.\344\274\230\347\247\200\346\225\260\347\273\204.md" deleted file mode 100644 index 4967f907be..0000000000 --- "a/problems/kamacoder/0163.\344\274\230\347\247\200\346\225\260\347\273\204.md" +++ /dev/null @@ -1,88 +0,0 @@ - -# 优秀数组 - -[题目链接](https://kamacoder.com/problempage.php?pid=1241) - -## 解题思路 - -1、初始分析 - -- 给定一个排列 `p`,我们首先构建一个 `pos` 数组,使得 `pos[i]` 表示 `i` 在排列 `p` 中的位置。 -- 我们需要判断数组 `a` 是否是一个优秀数组,即 `pos[a[i]] < pos[a[i+1]] <= pos[a[i]] + d` 对于所有 `i` 都成立。 -- 我们的目标是通过最少的相邻元素交换,使得数组 `a` 不再是一个优秀数组。 - -2、思路 - -- 要使数组 `a` 不再是优秀数组,我们只需要打破条件 `pos[a[i]] < pos[a[i+1]] <= pos[a[i]] + d` 中的某一个。 -- 一种简单的做法是让 `pos[a[i]]` 和 `pos[a[i+1]]` 之间的距离超过 `d`,或者直接让 `pos[a[i]] >= pos[a[i+1]]`。 - -3、具体方法 - -- 只需要考虑 `a` 中相邻元素的顺序,并判断如何交换 `p` 中相邻元素使得其顺序被打破。 -- 假设我们需要在 `p` 中交换某些元素来实现上述目标,那么最小的交换次数是将 `a[i]` 和 `a[i+1]` 的位置交换。 -- 如果 `pos[a[i]] + 1 == pos[a[i+1]]`,则需要一步交换。 - -4、特别情况 - -- 还需要考虑,如果通过交换相邻元素无法解决问题的情况。比如 `pos[a[i+1]]` 的位置无法移到 `pos[a[i]]` 的前面或超过 `d`。 - -C++代码如下: - - -```cpp -#include -#include -#include -#include - -using namespace std; - -int main() { - int n, m, d; - cin >> n >> m >> d; - - vector p(n + 1); - vector pos(n + 1); - - // 读取排列 p,并构建位置数组 pos - for (int i = 1; i <= n; i++) { - cin >> p[i]; - pos[p[i]] = i; - } - - vector a(m); - for (int i = 0; i < m; i++) { - cin >> a[i]; - } - - int min_operations = INT_MAX; - - // 遍历数组 a 的相邻元素 - for (int i = 0; i < m - 1; i++) { - int current_pos = pos[a[i]]; - int next_pos = pos[a[i + 1]]; - - // 检查 pos[a[i]] < pos[a[i+1]] <= pos[a[i]] + d 是否成立 - if (current_pos < next_pos && next_pos <= current_pos + d) { - // 计算需要的最少操作次数 - int distance = next_pos - current_pos; - - // Case 1: 交换 current_pos 和 next_pos - min_operations = min(min_operations, distance); - - // Case 2: 如果 next_pos + d <= n,考虑使 pos[a[i+1]] 超过 pos[a[i]] + d - if (current_pos + d + 1 <= n) { - min_operations = min(min_operations, d + 1 - distance); - } - } else { - min_operations = 0; - } - } - - cout << min_operations << endl; - return 0; -} - -``` - -时间复杂度为 O(m) diff --git "a/problems/kamacoder/0164.\345\215\207\345\272\217\346\225\260\347\273\204.md" "b/problems/kamacoder/0164.\345\215\207\345\272\217\346\225\260\347\273\204.md" deleted file mode 100644 index 2a35b715bf..0000000000 --- "a/problems/kamacoder/0164.\345\215\207\345\272\217\346\225\260\347\273\204.md" +++ /dev/null @@ -1,81 +0,0 @@ -# 升序数组 - -[题目链接](https://kamacoder.com/problempage.php?pid=1241) - -## 解题思路 - -贪心思路 - -- **计算相邻元素差值**: - - 对于数组 `a`,计算每对相邻元素的差值 `diff[i] = a[i+1] - a[i]`。 - - 如果 `diff[i]` 为负数,意味着 `a[i+1]` 比 `a[i]` 小或相等,需要通过操作使 `a[i+1]` 变大。 - -- **确定最小操作次数**: - - 计算所有相邻元素中的最小差值 `minDifference`,即 `minDifference = min(diff[i])`。 - - 如果 `minDifference` 为负数或零,则需要进行 `-minDifference + 1` 次操作,使得 `a[i+1]` 大于 `a[i]`,从而使数组严格递增。 - -- **实现细节**: - - 遍历数组的每对相邻元素,找出最小的差值。 - - 根据最小差值,计算出最少的操作次数。 - - - -```CPP -#include -#include -#include - -using namespace std; - -int main() -{ - int n; - cin >> n; - - vector arr(n); // 用于存储输入数组 - vector differences; // 用于存储相邻元素的差值 - - for(int i = 0; i < n; i++) { - cin >> arr[i]; - if(i > 0) differences.push_back(arr[i] - arr[i - 1]); - - } - - int minDifference = INT_MAX; - - // 寻找最小的差值 - for(int diff : differences) { - if(diff < minDifference) { - minDifference = diff; - } - } - - // 如果最小差值是负数或零,计算所需的操作次数 - int minOperations = max(0, -minDifference + 1); - - cout << minOperations << endl; - - return 0; -} - -``` -关于 `-minDifference + 1` 为什么要 + 1 解释: - -对于数组 `a` 中相邻的两个元素 `a[i]` 和 `a[i+1]`,我们计算它们的差值 `diff = a[i+1] - a[i]`。 - -- **目标**:要使 `a[i] < a[i+1]`,需要 `diff > 0`。 -- 如果 `diff < 0`,说明 `a[i+1]` 比 `a[i]` 小,这时候 `a` 不是严格递增的。 -- 如果 `diff = 0`,说明 `a[i+1]` 和 `a[i]` 相等,这时也不满足严格递增。 - -解释 `-minDifference + 1` - -1. **当 `minDifference < 0` 时**: - - 假设 `minDifference` 是所有相邻差值中的最小值,并且它是一个负数。 - - 例如,`minDifference = -3`,表示 `a[i+1] - a[i] = -3`,也就是 `a[i+1]` 比 `a[i]` 小 `3`。 - - 要让 `a[i+1] > a[i]`,我们至少需要使 `a[i+1] - a[i]` 从 `-3` 增加到 `1`。因此需要增加 `4`,即 `(-(-3)) + 1 = 3 + 1 = 4` 次操作。 - -2. **当 `minDifference = 0` 时**: - - `minDifference` 等于 `0`,表示 `a[i+1] - a[i] = 0`,即 `a[i+1]` 和 `a[i]` 相等。 - - 为了使 `a[i+1] > a[i]`,我们至少需要进行一次操作,使得 `a[i+1]` 大于 `a[i]`。 - - diff --git "a/problems/kamacoder/0165.\346\234\200\345\244\247\345\255\227\345\205\270\345\272\217\346\227\240\351\207\215\345\244\215\344\270\262.md" "b/problems/kamacoder/0165.\346\234\200\345\244\247\345\255\227\345\205\270\345\272\217\346\227\240\351\207\215\345\244\215\344\270\262.md" deleted file mode 100644 index c7be98d239..0000000000 --- "a/problems/kamacoder/0165.\346\234\200\345\244\247\345\255\227\345\205\270\345\272\217\346\227\240\351\207\215\345\244\215\344\270\262.md" +++ /dev/null @@ -1,82 +0,0 @@ - -# 最大字典序无重复串 - -[题目链接](https://kamacoder.com/problempage.php?pid=1243) - - -## 解题思路 - -贪心思路 - -为了保证字典序最大,我们优先放置字母 `b`,然后再放置字母 `a`。在放置字符时,我们还需注意不能超过连续 `k` 次相同字符: - -- 如果当前已经连续放置了 `k` 次相同字符,必须切换到另一个字符。 -- 每次放置字符后,相应的字符数量减少,同时更新当前字符的连续计数。 - -实现步骤: - -- **初始化**:根据输入的 `x`, `y`, `k` 值,检查是否有可能构造出满足条件的字符串。初始化结果字符串的大小,并设置初始计数器。 -- **循环放置字符**: - - 优先放置字符 `b`,如果 `b` 的数量已经足够,或者已经放置了 `k` 次字符 `b`,则放置字符 `a`。 - - 如果已经放置了 `k` 次相同字符,则强制切换到另一个字符。 - -C++代码如下: - -```CPP -#include -#include -using namespace std; - -int main() { - int countA, countB, maxRepeat; - cin >> countA >> countB >> maxRepeat; - - // 检查是否有可能生成满足条件的字符串 - if (countA > (countB + 1) * maxRepeat || countB > (countA + 1) * maxRepeat) { - cout << -1 << endl; - return 0; - } - - string result(countA + countB, ' '); // 预先分配字符串大小 - int currentA = 0, currentB = 0; // 当前连续 'a' 和 'b' 的计数 - int pos = 0; // 当前填充位置 - - while (countA > 0 || countB > 0) { - // 当可以继续添加 'a' 或 'b' 且没有超过最大连续限制时 - if (currentA < maxRepeat && currentB < maxRepeat) { - if (countA <= countB * maxRepeat) { - result[pos++] = 'b'; - countB--; - currentB++; - currentA = 0; - } else { - result[pos++] = 'a'; - countA--; - currentA++; - currentB = 0; - } - } - - // 当当前字符达到最大连续限制时,切换到另一个字符 - if (currentA == maxRepeat || currentB == maxRepeat) { - if (result[pos - 1] == 'a') { - result[pos++] = 'b'; - countB--; - currentB = 1; - currentA = 0; - } else { - result[pos++] = 'a'; - countA--; - currentA = 1; - currentB = 0; - } - } - } - - cout << result << endl; - return 0; -} - -``` - -时间复杂度:O(n) From de01d2e6fa5785b34da74505af2d480eb8cd5226 Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Sat, 14 Sep 2024 12:03:01 +0800 Subject: [PATCH 2816/3019] Update --- ...17\347\272\242\344\271\260\350\215\257.md" | 48 ------ ...16\347\211\210\346\226\271\346\241\210.md" | 154 ------------------ 2 files changed, 202 deletions(-) delete mode 100644 "problems/kamacoder/0133.\345\260\217\347\272\242\344\271\260\350\215\257.md" delete mode 100644 "problems/kamacoder/0162.\345\260\217\347\272\242\347\232\204\347\254\25416\347\211\210\346\226\271\346\241\210.md" diff --git "a/problems/kamacoder/0133.\345\260\217\347\272\242\344\271\260\350\215\257.md" "b/problems/kamacoder/0133.\345\260\217\347\272\242\344\271\260\350\215\257.md" deleted file mode 100644 index 2b144fa5c5..0000000000 --- "a/problems/kamacoder/0133.\345\260\217\347\272\242\344\271\260\350\215\257.md" +++ /dev/null @@ -1,48 +0,0 @@ - -# 133. 小红买药 - -[题目链接](https://kamacoder.com/problempage.php?pid=1210) - -本题是一道直观的模拟题,但也并不简单,很多情况容易漏了,笔试现场可能要多错几次 才能把情况都想到。 - -主要是三个情况: - -* 小红没症状,药有副作用,统计加一,同时要给小红标记上症状 -* 小红有症状,药治不了,同时也没副症状 ,这时也要统计加一 -* 小红有症状,药可以治,给小红取消症状标记 - - -```CPP -#include -#include -using namespace std; -int main() { - int n, m, q, u; - cin >> n; - string s; - cin >> s; - cin >> m; - vector a(m + 1); // 因为后面u是从1开始的 - vector b(m + 1); - for (int i = 1; i <= m; i++) { - cin >> a[i] >> b[i]; - } - cin >> q; - while (q--) { - cin >> u; - int num = 0; - for (int i = 0; i < n; i++) { - // s 没症状,但b给了副作用,统计num的同时,要给s标记上症状 - if (s[i] == '0' && b[u][i] == '1') { - num ++; - s[i] = '1'; - } - // s 有症状,但 a治不了,b也没副症状 - else if (s[i] == '1' && a[u][i] == '0' && a[u][i] == '0') num++; - // s 有症状,a 可以治 - else if (s[i] == '1' && a[u][i] == '1') s[i] = '0'; - } - cout << num << endl; - } -} -``` diff --git "a/problems/kamacoder/0162.\345\260\217\347\272\242\347\232\204\347\254\25416\347\211\210\346\226\271\346\241\210.md" "b/problems/kamacoder/0162.\345\260\217\347\272\242\347\232\204\347\254\25416\347\211\210\346\226\271\346\241\210.md" deleted file mode 100644 index 6b82b74b6f..0000000000 --- "a/problems/kamacoder/0162.\345\260\217\347\272\242\347\232\204\347\254\25416\347\211\210\346\226\271\346\241\210.md" +++ /dev/null @@ -1,154 +0,0 @@ - -# 小红的第16版方案 - -[题目链接](https://kamacoder.com/problempage.php?pid=1240) - -暴力解法: (数据量已经出最大了,C++能过,java、python、go都过不了) - -```CPP -#include -using namespace std; -int main() { - int n, m; - int l, r; - cin >> n >> m; - vector a(n + 1); - vector angry(n + 1); - for (int i = 1; i <= n; i++) cin >> a[i]; - for (int i = 1; i <= m; i++) { - cin >> l >> r; - for (int j = l; j <= r; j++) { - angry[j]++; - if (angry[j] > a[j]) { - cout << i - 1 << endl; - return 0; - } - } - } - cout << m << endl; - return 0; -} -``` - -使用 差分数组,代码如下: - - -```CPP -#include -#include -using namespace std; - -int main() { - int n, m; - cin >> n >> m; - - vector a(n + 1); - for (int i = 1; i <= n; ++i) { - cin >> a[i]; - } - - vector diff(n + 1, 0); // 差分数组,多一个元素用于处理边界情况 - - int l, r; - for (int i = 1; i <= m; ++i) { - cin >> l >> r; - diff[l]++; - if (r + 1 <= n) diff[r + 1]--; - } - - int current_anger = 0; // 当前的愤怒值 - for (int i = 1; i <= n; ++i) { - current_anger += diff[i]; // 计算差分数组的前缀和,得到最终的愤怒值 - if (current_anger > a[i]) { - cout << i - 1 << endl; // 如果当前的愤怒值超过阈值,输出最后一个没有问题的方案编号 - return 0; - } - } - - cout << m << endl; // 如果所有修改完成后都没有超过阈值,返回最后一个方案的编号 - return 0; -} -``` - -过不了,因为差分数组只能知道是哪个人超过了阈值,不能知道是第几次修改超过的 - -最后 优化思路: - -* 差分数组(Difference Array):依然使用差分数组来处理区间更新。 -* 二分查找:通过二分查找来确定最早发生愤怒值超出阈值的操作,而不是逐次模拟每一次修改。 - -步骤: - -* 创建一个差分数组 diff 用于处理区间增加操作。 -* 在 [1, m] 的范围内进行二分查找,确定导致某个人愤怒值超过阈值的最早的修改次数。 -* 对每个二分查找的中间值 mid,我们累积应用前 mid 次操作,然后检查是否有任何人的愤怒值超过了阈值。 -* 如果 mid 之前没有超标,则继续向右查找;否则向左缩小范围。 -* 在二分查找完成后,输出找到的第一个导致愤怒值超标的操作次数。 - -```CPP -#include -#include -#include - -using namespace std; - -bool isValid(const vector& a, const vector& diff, int n, int m) { - vector anger(n + 1, 0); - int current_anger = 0; - for (int i = 1; i <= n; ++i) { - current_anger += diff[i]; - if (current_anger > a[i]) { - return false; // 超出愤怒阈值 - } - } - return true; // 没有任何人超出愤怒阈值 -} - -int main() { - int n, m; - cin >> n >> m; - - vector a(n + 1); // 愤怒阈值数组 - for (int i = 1; i <= n; ++i) { - cin >> a[i]; - } - - vector> operations(m + 1); // 保存每次操作的区间 - for (int i = 1; i <= m; ++i) { - int l, r; - cin >> l >> r; - operations[i] = {l, r}; - } - - int left = 1, right = m, result = m; - - while (left <= right) { - int mid = left + (right - left) / 2; - - // 构建差分数组,只考虑前 mid 次操作 - vector diff(n + 2, 0); - for (int i = 1; i <= mid; ++i) { - int l = operations[i].first; - int r = operations[i].second; - diff[l]++; - if (r + 1 <= n) { - diff[r + 1]--; - } - } - - if (isValid(a, diff, n, mid)) { - left = mid + 1; // 如果在mid次操作后没有超标,继续向右搜索 - } else { - result = mid - 1; // 如果在mid次操作后超标,向左搜索 - right = mid - 1; - } - } - - cout << result << endl; - return 0; -} - -``` - -* 时间复杂度:O(n + m * log m),其中 n 是成员数量,m 是操作次数。二分查找的时间复杂度为 O(log m),每次二分查找中通过差分数组检查愤怒值的复杂度为 O(n)。 -* 空间复杂度:O(n + m),主要用于存储差分数组和操作数组。 From 51f6ab5a54f7e6c3ee0518e2b1fd093b784d434a Mon Sep 17 00:00:00 2001 From: poivre Date: Wed, 18 Sep 2024 00:19:21 +0800 Subject: [PATCH 2817/3019] =?UTF-8?q?docs:=20=E6=9B=B4=E6=AD=A30459?= =?UTF-8?q?=E7=9A=84=E6=96=87=E6=9C=AC=E7=9A=84=E8=AF=AD=E5=8F=A5=E9=99=88?= =?UTF-8?q?=E8=BF=B0=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git "a/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" "b/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" index 254d921dbd..41c2ea2d35 100644 --- "a/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" @@ -163,7 +163,7 @@ KMP算法中next数组为什么遇到字符不匹配的时候可以找到上一 如果一个字符串s是由重复子串组成,那么 最长相等前后缀不包含的子串一定是字符串s的最小重复子串。 -证明: 如果s 是有是有最小重复子串p组成。 +证明: 如果s 是由最小重复子串p组成。 即 s = n * p @@ -884,3 +884,4 @@ public int[] GetNext(string s) + From ee41f4df2203884a884a108bc9cc2662f4fdc823 Mon Sep 17 00:00:00 2001 From: poivre Date: Wed, 18 Sep 2024 00:27:25 +0800 Subject: [PATCH 2818/3019] =?UTF-8?q?Revert=20"docs:=20=E6=9B=B4=E6=AD=A30?= =?UTF-8?q?459=E7=9A=84=E6=96=87=E6=9C=AC=E7=9A=84=E8=AF=AD=E5=8F=A5?= =?UTF-8?q?=E9=99=88=E8=BF=B0=E3=80=82"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 51f6ab5a54f7e6c3ee0518e2b1fd093b784d434a. --- ...232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git "a/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" "b/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" index 41c2ea2d35..254d921dbd 100644 --- "a/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" @@ -163,7 +163,7 @@ KMP算法中next数组为什么遇到字符不匹配的时候可以找到上一 如果一个字符串s是由重复子串组成,那么 最长相等前后缀不包含的子串一定是字符串s的最小重复子串。 -证明: 如果s 是由最小重复子串p组成。 +证明: 如果s 是有是有最小重复子串p组成。 即 s = n * p @@ -884,4 +884,3 @@ public int[] GetNext(string s) - From 69a413c3e65ce07144bfdb8199ee0b2d47080e33 Mon Sep 17 00:00:00 2001 From: poivre Date: Wed, 18 Sep 2024 00:28:17 +0800 Subject: [PATCH 2819/3019] =?UTF-8?q?docs:=20=E6=9B=B4=E6=AD=A30459?= =?UTF-8?q?=E9=97=AE=E9=A2=98=E4=B8=AD=E6=96=87=E6=9C=AC=E7=9A=84=E9=99=88?= =?UTF-8?q?=E8=BF=B0=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...2\204\345\255\220\345\255\227\347\254\246\344\270\262.md" | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git "a/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" "b/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" index 254d921dbd..dbf32e6482 100644 --- "a/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" @@ -163,7 +163,7 @@ KMP算法中next数组为什么遇到字符不匹配的时候可以找到上一 如果一个字符串s是由重复子串组成,那么 最长相等前后缀不包含的子串一定是字符串s的最小重复子串。 -证明: 如果s 是有是有最小重复子串p组成。 +证明: 如果s 是由最小重复子串p组成。 即 s = n * p @@ -179,7 +179,7 @@ KMP算法中next数组为什么遇到字符不匹配的时候可以找到上一 ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240913110841.png) -这里有录友就想:如果字符串s 是有是有最小重复子串p组成,最长相等前后缀就不能更长一些? 例如这样: +这里有录友就想:如果字符串s 是由最小重复子串p组成,最长相等前后缀就不能更长一些? 例如这样: ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240913114348.png) @@ -884,3 +884,4 @@ public int[] GetNext(string s) + From 75f587507dea0f21ec667a38c049b9324b982f9d Mon Sep 17 00:00:00 2001 From: DraculaJay <113758447+DraculaJay@users.noreply.github.com> Date: Sat, 21 Sep 2024 04:52:40 +0800 Subject: [PATCH 2820/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=BA=86python?= =?UTF-8?q?=E6=96=B0=E7=9A=84=E5=89=AA=E6=9E=9D=E6=93=8D=E4=BD=9C=EF=BC=8C?= =?UTF-8?q?=E9=80=9A=E8=BF=87=E5=AF=B9=E5=89=A9=E4=BD=99=E5=85=83=E7=B4=A0?= =?UTF-8?q?=E9=95=BF=E5=BA=A6=E7=9A=84=E5=88=A4=E6=96=AD=E5=AE=8C=E6=88=90?= =?UTF-8?q?=E5=89=AA=E6=9E=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\345\216\237IP\345\234\260\345\235\200.md" | 32 +++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git "a/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" "b/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" index d1300a3933..eb81f4b662 100644 --- "a/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" +++ "b/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" @@ -467,9 +467,37 @@ class Solution: num = int(s[start:end+1]) return 0 <= num <= 255 +回溯(版本三) - - +```python +class Solution: + def restoreIpAddresses(self, s: str) -> List[str]: + result = [] + self.backtracking(s, 0, [], result) + return result + + def backtracking(self, s, startIndex, path, result): + if startIndex == len(s): + result.append('.'.join(path[:])) + return + + for i in range(startIndex, min(startIndex+3, len(s))): + # 如果 i 往后遍历了,并且当前地址的第一个元素是 0 ,就直接退出 + if i > startIndex and s[startIndex] == '0': + break + # 比如 s 长度为 5,当前遍历到 i = 3 这个元素 + # 因为还没有执行任何操作,所以此时剩下的元素数量就是 5 - 3 = 2 ,即包括当前的 i 本身 + # path 里面是当前包含的子串,所以有几个元素就表示储存了几个地址 + # 所以 (4 - len(path)) * 3 表示当前路径至多能存放的元素个数 + # 4 - len(path) 表示至少要存放的元素个数 + if (4 - len(path)) * 3 < len(s) - i or 4 - len(path) > len(s) - i: + break + if i - startIndex == 2: + if not int(s[startIndex:i+1]) <= 255: + break + path.append(s[startIndex:i+1]) + self.backtracking(s, i+1, path, result) + path.pop() ``` ### Go From b3c0d03885496324d5cea3427ccd6cd633368e0a Mon Sep 17 00:00:00 2001 From: Runze Liao <72693579+tony8888lrz@users.noreply.github.com> Date: Fri, 20 Sep 2024 16:56:31 -0700 Subject: [PATCH 2821/3019] =?UTF-8?q?Update=200343.=E6=95=B4=E6=95=B0?= =?UTF-8?q?=E6=8B=86=E5=88=86.md=20Java=E7=89=88=E6=9C=AC=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E8=B4=AA=E5=BF=83=E7=AE=97=E6=B3=95=EF=BC=8C=E6=B8=85?= =?UTF-8?q?=E6=99=B0=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...64\346\225\260\346\213\206\345\210\206.md" | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git "a/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" "b/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" index 7295627fde..3ba23e522c 100644 --- "a/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" +++ "b/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" @@ -243,6 +243,29 @@ class Solution { } } ``` +贪心 +```Java +class Solution { + public int integerBreak(int n) { + // with 贪心 + // 通过数学原理拆出更多的3乘积越大,则 + /** + @Param: an int, the integer we need to break. + @Return: an int, the maximum integer after breaking + @Method: Using math principle to solve this problem + @Time complexity: O(1) + **/ + if(n == 2) return 1; + if(n == 3) return 2; + int result = 1; + while(n > 4) { + n-=3; + result *=3; + } + return result*n; + } +} +``` ### Python 动态规划(版本一) From fed25bf0125118e4b985fb58d122430b3141b919 Mon Sep 17 00:00:00 2001 From: suinming <0223314338aa@gmail.com> Date: Sat, 21 Sep 2024 14:36:45 +0800 Subject: [PATCH 2822/3019] =?UTF-8?q?feat:=20=E5=9C=96=E8=AB=96100?= =?UTF-8?q?=E5=B2=9B=E5=B1=BF=E7=9A=84=E6=9C=80=E5=A4=A7=E9=9D=A2=E7=A7=AF?= =?UTF-8?q?=EF=BC=8C=E6=96=B0=E5=A2=9Ejs=E6=B7=B1=E6=90=9C=E7=AE=97?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...00\345\244\247\351\235\242\347\247\257.md" | 77 +++++++++++++++++++ 1 file changed, 77 insertions(+) diff --git "a/problems/kamacoder/0100.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" "b/problems/kamacoder/0100.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" index ea62edc25c..51bfc57fd1 100644 --- "a/problems/kamacoder/0100.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" +++ "b/problems/kamacoder/0100.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" @@ -480,7 +480,84 @@ const bfs = (graph, visited, x, y) => { })() ``` +```javascript + +// 深搜版 + +const r1 = require('readline').createInterface({ input: process.stdin }); +// 创建readline接口 +let iter = r1[Symbol.asyncIterator](); +// 创建异步迭代器 +const readline = async () => (await iter.next()).value; + +let graph // 地图 +let N, M // 地图大小 +let visited // 访问过的节点 +let result = 0 // 最大岛屿面积 +let count = 0 // 岛屿内节点数 +const dir = [[0, 1], [1, 0], [0, -1], [-1, 0]] //方向 + +// 读取输入,初始化地图 +const initGraph = async () => { + let line = await readline(); + [N, M] = line.split(' ').map(Number); + graph = new Array(N).fill(0).map(() => new Array(M).fill(0)) + visited = new Array(N).fill(false).map(() => new Array(M).fill(false)) + + for (let i = 0; i < N; i++) { + line = await readline() + line = line.split(' ').map(Number) + for (let j = 0; j < M; j++) { + graph[i][j] = line[j] + } + } +} +/** + * @description: 从(x, y)开始深度优先遍历 + * @param {*} graph 地图 + * @param {*} visited 访问过的节点 + * @param {*} x 开始搜索节点的下标 + * @param {*} y 开始搜索节点的下标 + * @return {*} + */ +const dfs = (graph, visited, x, y) => { + for (let i = 0; i < 4; i++) { + let nextx = x + dir[i][0] + let nexty = y + dir[i][1] + if(nextx < 0 || nextx >= N || nexty < 0 || nexty >= M) continue + if(!visited[nextx][nexty] && graph[nextx][nexty] === 1){ + count++ + visited[nextx][nexty] = true + dfs(graph, visited, nextx, nexty) + } + } +} + +(async function () { + + // 读取输入,初始化地图 + await initGraph() + + // 统计最大岛屿面积 + for (let i = 0; i < N; i++) { + for (let j = 0; j < M; j++) { + if (!visited[i][j] && graph[i][j] === 1) { //遇到没有访问过的陆地 + // 重新计算面积 + count = 1 + visited[i][j] = true + + // 深度优先遍历,统计岛屿内节点数,并将岛屿标记为已访问 + dfs(graph, visited, i, j) + + // 更新最大岛屿面积 + result = Math.max(result, count) + } + } + } + console.log(result); +})() +``` ### TypeScript From 99e85bfea1804fcc87458d858fed44d76c7996f2 Mon Sep 17 00:00:00 2001 From: suinming <0223314338aa@gmail.com> Date: Sat, 21 Sep 2024 16:05:46 +0800 Subject: [PATCH 2823/3019] =?UTF-8?q?feat:=20=E5=9C=96=E8=AB=96101?= =?UTF-8?q?=E5=AD=A4=E5=B3=B6=E6=80=BB=E9=9D=A2=E7=A7=AF=20=EF=BC=8C?= =?UTF-8?q?=E6=96=B0=E5=A2=9Epython=E6=B7=B1=E6=90=9C=E7=AE=97=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...04\346\200\273\351\235\242\347\247\257.md" | 65 +++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git "a/problems/kamacoder/0101.\345\255\244\345\262\233\347\232\204\346\200\273\351\235\242\347\247\257.md" "b/problems/kamacoder/0101.\345\255\244\345\262\233\347\232\204\346\200\273\351\235\242\347\247\257.md" index 006484defb..26c92c07a6 100644 --- "a/problems/kamacoder/0101.\345\255\244\345\262\233\347\232\204\346\200\273\351\235\242\347\247\257.md" +++ "b/problems/kamacoder/0101.\345\255\244\345\262\233\347\232\204\346\200\273\351\235\242\347\247\257.md" @@ -307,6 +307,71 @@ for i in range(n): print(count) ``` + +```python +direction = [[1, 0], [-1, 0], [0, 1], [0, -1]] +result = 0 + +# 深度搜尋 +def dfs(grid, y, x): + grid[y][x] = 0 + global result + result += 1 + + for i, j in direction: + next_x = x + j + next_y = y + i + if (next_x < 0 or next_y < 0 or + next_x >= len(grid[0]) or next_y >= len(grid) + ): + continue + if grid[next_y][next_x] == 1 and not visited[next_y][next_x]: + visited[next_y][next_x] = True + dfs(grid, next_y, next_x) + + +# 讀取輸入值 +n, m = map(int, input().split()) +grid = [] +visited = [[False] * m for _ in range(n)] + +for i in range(n): + grid.append(list(map(int, input().split()))) + +# 處理邊界 +for j in range(m): + # 上邊界 + if grid[0][j] == 1 and not visited[0][j]: + visited[0][j] = True + dfs(grid, 0, j) + # 下邊界 + if grid[n - 1][j] == 1 and not visited[n - 1][j]: + visited[n - 1][j] = True + dfs(grid, n - 1, j) + +for i in range(n): + # 左邊界 + if grid[i][0] == 1 and not visited[i][0]: + visited[i][0] = True + dfs(grid, i, 0) + # 右邊界 + if grid[i][m - 1] == 1 and not visited[i][m - 1]: + visited[i][m - 1] = True + dfs(grid, i, m - 1) + +# 計算孤島總面積 +result = 0 # 初始化,避免使用到處理邊界時所產生的累加值 + +for i in range(n): + for j in range(m): + if grid[i][j] == 1 and not visited[i][j]: + visited[i][j] = True + dfs(grid, i, j) + +# 輸出孤島的總面積 +print(result) +``` + ### Go ``` go From 848fbd4cd5c868839c75c637ef5ea9057ab301d7 Mon Sep 17 00:00:00 2001 From: Zhihan Li <54661071+zhihali@users.noreply.github.com> Date: Sun, 22 Sep 2024 16:22:04 +0100 Subject: [PATCH 2824/3019] =?UTF-8?q?Update=200053.=E6=9C=80=E5=A4=A7?= =?UTF-8?q?=E5=AD=90=E5=BA=8F=E5=92=8C.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...44\247\345\255\220\345\272\217\345\222\214.md" | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git "a/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" "b/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" index 551c39bfac..1c7ff0cd55 100644 --- "a/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" +++ "b/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" @@ -214,6 +214,7 @@ class Solution: return result ``` +贪心法 ```python class Solution: def maxSubArray(self, nums): @@ -226,8 +227,18 @@ class Solution: if count <= 0: # 相当于重置最大子序起始位置,因为遇到负数一定是拉低总和 count = 0 return result - - +``` +动态规划 +```python +class Solution: + def maxSubArray(self, nums: List[int]) -> int: + dp = [0] * len(nums) + dp[0] = nums[0] + res = nums[0] + for i in range(1, len(nums)): + dp[i] = max(dp[i-1] + nums[i], nums[i]) + res = max(res, dp[i]) + return res ``` ### Go 贪心法 From 2841f59212a4f8399d53007eb01130172ce59814 Mon Sep 17 00:00:00 2001 From: suinming <0223314338aa@gmail.com> Date: Tue, 24 Sep 2024 14:41:38 +0800 Subject: [PATCH 2825/3019] =?UTF-8?q?feat:=20108.=20=E5=86=97=E4=BD=99?= =?UTF-8?q?=E8=BF=9E=E6=8E=A5=E6=96=B0=E5=A2=9Epython=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...27\344\275\231\350\277\236\346\216\245.md" | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git "a/problems/kamacoder/0108.\345\206\227\344\275\231\350\277\236\346\216\245.md" "b/problems/kamacoder/0108.\345\206\227\344\275\231\350\277\236\346\216\245.md" index 2c13378291..18a86ad6d7 100644 --- "a/problems/kamacoder/0108.\345\206\227\344\275\231\350\277\236\346\216\245.md" +++ "b/problems/kamacoder/0108.\345\206\227\344\275\231\350\277\236\346\216\245.md" @@ -178,6 +178,45 @@ int main() { ### Python +```python +father = list() + +def find(u): + if u == father[u]: + return u + else: + father[u] = find(father[u]) + return father[u] + +def is_same(u, v): + u = find(u) + v = find(v) + return u == v + +def join(u, v): + u = find(u) + v = find(v) + if u != v: + father[u] = v + +if __name__ == "__main__": + # 輸入 + n = int(input()) + for i in range(n + 1): + father.append(i) + # 尋找冗余邊 + result = None + for i in range(n): + s, t = map(int, input().split()) + if is_same(s, t): + result = str(s) + ' ' + str(t) + else: + join(s, t) + + # 輸出 + print(result) +``` + ### Go ### Rust From 5c67ef4acd04b228b2f24f32a89917d9abc478b0 Mon Sep 17 00:00:00 2001 From: suinming <0223314338aa@gmail.com> Date: Tue, 24 Sep 2024 16:13:28 +0800 Subject: [PATCH 2826/3019] =?UTF-8?q?feat:=20109.=20=E5=86=97=E4=BD=99?= =?UTF-8?q?=E8=BF=9E=E6=8E=A5II=E6=96=B0=E5=A2=9Epython=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\344\275\231\350\277\236\346\216\245II.md" | 86 +++++++++++++++++++ 1 file changed, 86 insertions(+) diff --git "a/problems/kamacoder/0109.\345\206\227\344\275\231\350\277\236\346\216\245II.md" "b/problems/kamacoder/0109.\345\206\227\344\275\231\350\277\236\346\216\245II.md" index bd707bf6ae..2bd4eac6e2 100644 --- "a/problems/kamacoder/0109.\345\206\227\344\275\231\350\277\236\346\216\245II.md" +++ "b/problems/kamacoder/0109.\345\206\227\344\275\231\350\277\236\346\216\245II.md" @@ -351,6 +351,92 @@ public class Main { ``` ### Python +```python +from collections import defaultdict + +father = list() + + +def find(u): + if u == father[u]: + return u + else: + father[u] = find(father[u]) + return father[u] + + +def is_same(u, v): + u = find(u) + v = find(v) + return u == v + + +def join(u, v): + u = find(u) + v = find(v) + if u != v: + father[u] = v + + +def is_tree_after_remove_edge(edges, edge, n): + # 初始化并查集 + global father + father = [i for i in range(n + 1)] + + for i in range(len(edges)): + if i == edge: + continue + s, t = edges[i] + if is_same(s, t): # 成環,即不是有向樹 + return False + else: # 將s,t放入集合中 + join(s, t) + return True + + +def get_remove_edge(edges): + # 初始化并查集 + global father + father = [i for i in range(n + 1)] + + for s, t in edges: + if is_same(s, t): + print(s, t) + return + else: + join(s, t) + + +if __name__ == "__main__": + # 輸入 + n = int(input()) + edges = list() + in_degree = defaultdict(int) + + for i in range(n): + s, t = map(int, input().split()) + in_degree[t] += 1 + edges.append([s, t]) + + # 尋找入度為2的邊,並紀錄其下標(index) + vec = list() + for i in range(n - 1, -1, -1): + if in_degree[edges[i][1]] == 2: + vec.append(i) + + # 輸出 + if len(vec) > 0: + # 情況一:刪除輸出順序靠後的邊 + if is_tree_after_remove_edge(edges, vec[0], n): + print(edges[vec[0]][0], edges[vec[0]][1]) + # 情況二:只能刪除特定的邊 + else: + print(edges[vec[1]][0], edges[vec[1]][1]) + else: + # 情況三: 原圖有環 + get_remove_edge(edges) +``` + ### Go ### Rust From 183fe44ae0d0569f39ab525b57877d844e9d3823 Mon Sep 17 00:00:00 2001 From: Zhihan Li <54661071+zhihali@users.noreply.github.com> Date: Tue, 24 Sep 2024 16:09:20 +0100 Subject: [PATCH 2827/3019] =?UTF-8?q?Update=200134.=E5=8A=A0=E6=B2=B9?= =?UTF-8?q?=E7=AB=99.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "problems/0134.\345\212\240\346\262\271\347\253\231.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0134.\345\212\240\346\262\271\347\253\231.md" "b/problems/0134.\345\212\240\346\262\271\347\253\231.md" index 7ac9f0f933..5cf50b3e56 100644 --- "a/problems/0134.\345\212\240\346\262\271\347\253\231.md" +++ "b/problems/0134.\345\212\240\346\262\271\347\253\231.md" @@ -158,7 +158,7 @@ i从0开始累加rest[i],和记为curSum,一旦curSum小于零,说明[0, i 如果 curSum<0 说明 区间和1 + 区间和2 < 0, 那么 假设从上图中的位置开始计数curSum不会小于0的话,就是 区间和2>0。 -区间和1 + 区间和2 < 0 同时 区间和2>0,只能说明区间和1 < 0, 那么就会从假设的箭头初就开始从新选择其实位置了。 +区间和1 + 区间和2 < 0 同时 区间和2>0,只能说明区间和1 < 0, 那么就会从假设的箭头初就开始从新选择起始位置了。 **那么局部最优:当前累加rest[i]的和curSum一旦小于0,起始位置至少要是i+1,因为从i之前开始一定不行。全局最优:找到可以跑一圈的起始位置**。 From 779ff9dd08a4b18d0aa8e077fcdab5e821662c08 Mon Sep 17 00:00:00 2001 From: suinming <0223314338aa@gmail.com> Date: Wed, 25 Sep 2024 12:35:34 +0800 Subject: [PATCH 2828/3019] =?UTF-8?q?feat:=2053.=20=E5=AF=BB=E5=AE=9D?= =?UTF-8?q?=E6=96=B0=E5=A2=9Ejs=E7=AE=97=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0053.\345\257\273\345\256\235-prim.md" | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git "a/problems/kamacoder/0053.\345\257\273\345\256\235-prim.md" "b/problems/kamacoder/0053.\345\257\273\345\256\235-prim.md" index c71624b55a..a8dad4cbfc 100644 --- "a/problems/kamacoder/0053.\345\257\273\345\256\235-prim.md" +++ "b/problems/kamacoder/0053.\345\257\273\345\256\235-prim.md" @@ -693,6 +693,55 @@ if __name__ == "__main__": ### Rust ### Javascript +```js +function prim(v, edges) { + const grid = Array.from({ length: v + 1 }, () => new Array(v + 1).fill(10001)); // Fixed grid initialization + const minDist = new Array(v + 1).fill(10001) + const isInTree = new Array(v + 1).fill(false) + // 建構鄰接矩陣 + for(const [v1, v2, w] of edges) { + grid[v1][v2] = w + grid[v2][v1] = w + } + // prim 演算法 + for (let i = 1 ; i < v ; i++) { + let cur = -1 + let tempMinDist = Number.MAX_VALUE + // 1. 尋找距離生成樹最近的節點 + for (let j = 1 ; j < v + 1 ; j++) { + if (!isInTree[j] && minDist[j] < tempMinDist) { + tempMinDist = minDist[j] + cur = j + } + } + // 2. 將節點放入生成樹 + isInTree[cur] = true + // 3. 更新非生成樹節點與生成樹的最短距離 + for (let j = 1 ; j < v + 1 ; j++) { + if (!isInTree[j] && grid[cur][j] < minDist[j]) { + minDist[j] = grid[cur][j] + } + } + } + console.log(minDist.slice(2).reduce((acc, cur) => acc + cur, 0)) +} + + +async function main() { + const rl = require('readline').createInterface({ input: process.stdin }) + const iter = rl[Symbol.asyncIterator]() + const readline = async () => (await iter.next()).value + const [v, e] = (await readline()).split(" ").map(Number) + const edges = [] + for (let i = 0 ; i < e ; i++) { + edges.push((await readline()).split(" ").map(Number)) + } + prim(v, edges) +} + + +main() +``` ### TypeScript From 9e66f2232363c66f1c466329b518fc2d8c6525c5 Mon Sep 17 00:00:00 2001 From: suinming <0223314338aa@gmail.com> Date: Wed, 25 Sep 2024 14:57:21 +0800 Subject: [PATCH 2829/3019] =?UTF-8?q?feat:=2053.=20=E5=AF=BB=E5=AE=9D?= =?UTF-8?q?=E6=96=B0=E5=A2=9Ekruskal=20js=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0053.\345\257\273\345\256\235-Kruskal.md" | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git "a/problems/kamacoder/0053.\345\257\273\345\256\235-Kruskal.md" "b/problems/kamacoder/0053.\345\257\273\345\256\235-Kruskal.md" index cb24fd17f3..6a22798551 100644 --- "a/problems/kamacoder/0053.\345\257\273\345\256\235-Kruskal.md" +++ "b/problems/kamacoder/0053.\345\257\273\345\256\235-Kruskal.md" @@ -549,6 +549,62 @@ if __name__ == "__main__": ### Javascript +```js +function kruskal(v, edges) { + const father = Array.from({ length: v + 1 }, (_, i) => i) + + function find(u){ + if (u === father[u]) { + return u + } else { + father[u] = find(father[u]) + return father[u] + } + + } + + function isSame(u, v) { + let s = find(u) + let t = find(v) + return s === t + } + + function join(u, v) { + let s = find(u) + let t = find(v) + if (s !== t) { + father[s] = t + } + } + + edges.sort((a, b) => a[2] - b[2]) + let result = 0 + for (const [v1, v2, w] of edges) { + if (!isSame(v1, v2)) { + result += w + join(v1 ,v2) + } + } + console.log(result) +} + + +async function main() { + const rl = require('readline').createInterface({ input: process.stdin }) + const iter = rl[Symbol.asyncIterator]() + const readline = async () => (await iter.next()).value + const [v, e] = (await readline()).split(" ").map(Number) + const edges = [] + for (let i = 0 ; i < e ; i++) { + edges.push((await readline()).split(" ").map(Number)) + } + kruskal(v, edges) +} + + +main() +``` + ### TypeScript ### PhP From 13a4234fce501cf300974d4f28f7728c0f91e64e Mon Sep 17 00:00:00 2001 From: xiaodaoshou <1035011225@qq.com> Date: Wed, 25 Sep 2024 20:50:05 +0800 Subject: [PATCH 2830/3019] =?UTF-8?q?0005=E6=9C=80=E9=95=BF=E5=9B=9E?= =?UTF-8?q?=E6=96=87=E5=AD=90=E4=B8=B2=20Manacher=E7=AE=97=E6=B3=95C++?= =?UTF-8?q?=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...36\346\226\207\345\255\220\344\270\262.md" | 54 +++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git "a/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" "b/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" index a13daf1e2f..b3d3b93896 100644 --- "a/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" +++ "b/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" @@ -256,7 +256,60 @@ public: * 时间复杂度:O(n^2) * 空间复杂度:O(1) +### Manacher 算法 +Manacher 算法的关键在于高效利用回文的对称性,通过插入分隔符和维护中心、边界等信息,在线性时间内找到最长回文子串。这种方法避免了重复计算,是处理回文问题的最优解。 + +```c++ +//Manacher 算法 +class Solution { +public: + string longestPalindrome(string s) { + // 预处理字符串,在每个字符之间插入 '#' + string t = "#"; + for (char c : s) { + t += c; // 添加字符 + t += '#';// 添加分隔符 + } + int n = t.size();// 新字符串的长度 + vector p(n, 0);// p[i] 表示以 t[i] 为中心的回文半径 + int center = 0, right = 0;// 当前回文的中心和右边界 + + + // 遍历预处理后的字符串 + for (int i = 0; i < n; i++) { + // 如果当前索引在右边界内,利用对称性初始化 p[i] + if (i < right) { + p[i] = min(right - i, p[2 * center - i]); + } + // 尝试扩展回文 + while (i - p[i] - 1 >= 0 && i + p[i] + 1 < n && t[i - p[i] - 1] == t[i + p[i] + 1]) { + p[i]++;// 增加回文半径 + } + // 如果当前回文扩展超出右边界,更新中心和右边界 + if (i + p[i] > right) { + center = i;// 更新中心 + right = i + p[i];// 更新右边界 + } + } + // 找到最大回文半径和对应的中心 + int maxLen = 0, centerIndex = 0; + for (int i = 0; i < n; i++) { + if (p[i] > maxLen) { + maxLen = p[i];// 更新最大回文长度 + centerIndex = i;// 更新中心索引 + } + } + // 计算原字符串中回文子串的起始位置并返回 + return s.substr((centerIndex - maxLen) / 2, maxLen); + } +}; +``` + + + +* 时间复杂度:O(n) +* 空间复杂度:O(n) ## 其他语言版本 @@ -682,3 +735,4 @@ public class Solution { + From 1b08a8e5b5b1cb83ca55f2d42391791387f293dd Mon Sep 17 00:00:00 2001 From: suinming <0223314338aa@gmail.com> Date: Thu, 26 Sep 2024 12:56:42 +0800 Subject: [PATCH 2831/3019] =?UTF-8?q?feat:=2047.=20=E5=8F=82=E5=8A=A0?= =?UTF-8?q?=E7=A7=91=E5=AD=A6=E5=A4=A7=E4=BC=9A=E6=96=B0=E5=A2=9Ejs?= =?UTF-8?q?=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...74\232dijkstra\346\234\264\347\264\240.md" | 59 +++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git "a/problems/kamacoder/0047.\345\217\202\344\274\232dijkstra\346\234\264\347\264\240.md" "b/problems/kamacoder/0047.\345\217\202\344\274\232dijkstra\346\234\264\347\264\240.md" index c0a490b343..465ad16dfc 100644 --- "a/problems/kamacoder/0047.\345\217\202\344\274\232dijkstra\346\234\264\347\264\240.md" +++ "b/problems/kamacoder/0047.\345\217\202\344\274\232dijkstra\346\234\264\347\264\240.md" @@ -869,6 +869,65 @@ if __name__ == "__main__": ### Javascript +```js +function dijkstra(grid, start, end) { + const visited = Array.from({length: end + 1}, () => false) + const minDist = Array.from({length: end + 1}, () => Number.MAX_VALUE) + minDist[start] = 0 + + for (let i = 1 ; i < end + 1 ; i++) { + let cur = -1 + let tempMinDist = Number.MAX_VALUE + // 1. 找尋與起始點距離最近且未被訪的節點 + for (let j = 1 ; j < end + 1 ; j++) { + if (!visited[j] && minDist[j] < tempMinDist) { + cur = j + tempMinDist = minDist[j] + } + } + if (cur === -1) break; + + // 2. 更新節點狀態為已拜訪 + visited[cur] = true + + // 3. 更新未拜訪節點與起始點的最短距離 + for (let j = 1 ; j < end + 1 ; j++) { + if(!visited[j] && grid[cur][j] != Number.MAX_VALUE + && grid[cur][j] + minDist[cur] < minDist[j] + ) { + minDist[j] = grid[cur][j] + minDist[cur] + } + } + } + + return minDist[end] === Number.MAX_VALUE ? -1 : minDist[end] +} + + +async function main() { + // 輸入 + const rl = require('readline').createInterface({ input: process.stdin }) + const iter = rl[Symbol.asyncIterator]() + const readline = async () => (await iter.next()).value + const [n, m] = (await readline()).split(" ").map(Number) + const grid = Array.from({length: n + 1}, + () => Array.from({length:n + 1}, () => Number.MAX_VALUE)) + for (let i = 0 ; i < m ; i++) { + const [s, e, w] = (await readline()).split(" ").map(Number) + grid[s][e] = w + } + + // dijkstra + const result = dijkstra(grid, 1, n) + + // 輸出 + console.log(result) +} + + +main() +``` + ### TypeScript ### PhP From 4c37cedc435eca094a98d9c201b43663605264d7 Mon Sep 17 00:00:00 2001 From: MAX <61301100+miaoxu404@users.noreply.github.com> Date: Thu, 26 Sep 2024 15:07:38 +0800 Subject: [PATCH 2832/3019] =?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 The term maxLen has ambiguity and does not align clearly with both the code and the problem statement. I propose changing it to maxDepth for improved clarity and consistency. --- ...\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" "b/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" index d69ceb6f51..c7446726f8 100644 --- "a/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" +++ "b/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" @@ -55,7 +55,7 @@ 参数必须有要遍历的树的根节点,还有就是一个int型的变量用来记录最长深度。 这里就不需要返回值了,所以递归函数的返回类型为void。 -本题还需要类里的两个全局变量,maxLen用来记录最大深度,result记录最大深度最左节点的数值。 +本题还需要类里的两个全局变量,maxDepth用来记录最大深度,result记录最大深度最左节点的数值。 代码如下: From 53a4a17b8c518b6e27166b3b9b60de44fdf9b39a Mon Sep 17 00:00:00 2001 From: Camille <59353274+Camille0512@users.noreply.github.com> Date: Thu, 26 Sep 2024 23:06:45 +0800 Subject: [PATCH 2833/3019] =?UTF-8?q?Update=200099.=E5=B2=9B=E5=B1=BF?= =?UTF-8?q?=E7=9A=84=E6=95=B0=E9=87=8F=E5=B9=BF=E6=90=9C.md:=20Add=20Scala?= =?UTF-8?q?=20script=20for=20the=20counting=20island=20puzzle=20using=20BF?= =?UTF-8?q?S=20algo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...60\351\207\217\345\271\277\346\220\234.md" | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git "a/problems/kamacoder/0099.\345\262\233\345\261\277\347\232\204\346\225\260\351\207\217\345\271\277\346\220\234.md" "b/problems/kamacoder/0099.\345\262\233\345\261\277\347\232\204\346\225\260\351\207\217\345\271\277\346\220\234.md" index 3047575391..9d31c92268 100644 --- "a/problems/kamacoder/0099.\345\262\233\345\261\277\347\232\204\346\225\260\351\207\217\345\271\277\346\220\234.md" +++ "b/problems/kamacoder/0099.\345\262\233\345\261\277\347\232\204\346\225\260\351\207\217\345\271\277\346\220\234.md" @@ -499,6 +499,55 @@ main(); ### Swift ### Scala +```scala +import scala.collection.mutable.Queue +import util.control.Breaks._ + +// Dev on LeetCode: https://leetcode.cn/problems/number-of-islands/description/ +object Solution { + def numIslands(grid: Array[Array[Char]]): Int = { + val row = grid.length + val col = grid(0).length + val dir = List((-1,0), (0,-1), (1,0), (0,1)) // 四个方向 + var visited = Array.fill(row)(Array.fill(col)(false)) + var counter = 0 + var que = Queue.empty[Tuple2[Int, Int]] + + (0 until row).map{ r => + (0 until col).map{ c => + breakable { + if (!visited(r)(c) && grid(r)(c) == '1') { + que.enqueue((r, c)) + visited(r)(c) // 只要加入队列,立刻标记 + } else break // 不是岛屿不进入queue,也不记录 + + while (!que.isEmpty) { + val cur = que.head + que.dequeue() + val x = cur(0) + val y = cur(1) + dir.map{ d => + val nextX = x + d(0) + val nextY = y + d(1) + breakable { + // 越界就跳过 + if (nextX < 0 || nextX >= row || nextY < 0 || nextY >= col) break + if (!visited(nextX)(nextY) && grid(nextX)(nextY) == '1') { + visited(nextX)(nextY) = true // 只要加入队列,立刻标记 + que.enqueue((nextX, nextY)) + } + } + } + } + counter = counter + 1 // 找完一个岛屿后记录一下 + } + } + } + + counter + } +} +``` ### C# From d0f6653a6f371ee22130116470030bd35b925212 Mon Sep 17 00:00:00 2001 From: MAX <61301100+miaoxu404@users.noreply.github.com> Date: Fri, 27 Sep 2024 11:51:01 +0800 Subject: [PATCH 2834/3019] =?UTF-8?q?Update=200112.=E8=B7=AF=E5=BE=84?= =?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 it's important to avoid using reserved keywords as variable names. so i suggest changing "sum" to "targetSum" In order to maintain consistency with the original LeetCode problem, the term "TreeNode" can be replaced with "Optional[TreeNode]". --- ...57\345\276\204\346\200\273\345\222\214.md" | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git "a/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" "b/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" index 6709a2fbd2..e6ccc6ae27 100644 --- "a/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" +++ "b/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" @@ -564,10 +564,10 @@ class Solution: return False - def hasPathSum(self, root: TreeNode, sum: int) -> bool: + def hasPathSum(self, root: Optional[TreeNode], targetSum: int) -> bool: if root is None: return False - return self.traversal(root, sum - root.val) + return self.traversal(root, targetSum - root.val) ``` (版本二) 递归 + 精简 @@ -579,12 +579,12 @@ class Solution: # self.left = left # self.right = right class Solution: - def hasPathSum(self, root: TreeNode, sum: int) -> bool: + def hasPathSum(self, root: Optional[TreeNode], targetSum: int) -> bool: if not root: return False - if not root.left and not root.right and sum == root.val: + if not root.left and not root.right and targetSum == root.val: return True - return self.hasPathSum(root.left, sum - root.val) or self.hasPathSum(root.right, sum - root.val) + return self.hasPathSum(root.left, targetSum - root.val) or self.hasPathSum(root.right, targetSum - root.val) ``` (版本三) 迭代 @@ -596,7 +596,7 @@ class Solution: # self.left = left # self.right = right class Solution: - def hasPathSum(self, root: TreeNode, sum: int) -> bool: + def hasPathSum(self, root: Optional[TreeNode], targetSum: int) -> bool: if not root: return False # 此时栈里要放的是pair<节点指针,路径数值> @@ -659,13 +659,13 @@ class Solution: return - def pathSum(self, root: TreeNode, sum: int) -> List[List[int]]: + def pathSum(self, root: Optional[TreeNode], targetSum: int) -> List[List[int]]: self.result.clear() self.path.clear() if not root: return self.result self.path.append(root.val) # 把根节点放进路径 - self.traversal(root, sum - root.val) + self.traversal(root, targetSum - root.val) return self.result ``` @@ -678,7 +678,7 @@ class Solution: # self.left = left # self.right = right class Solution: - def pathSum(self, root: TreeNode, targetSum: int) -> List[List[int]]: + def pathSum(self, root: Optional[TreeNode], targetSum: int) -> List[List[int]]: result = [] self.traversal(root, targetSum, [], result) @@ -703,7 +703,7 @@ class Solution: # self.left = left # self.right = right class Solution: - def pathSum(self, root: TreeNode, targetSum: int) -> List[List[int]]: + def pathSum(self, root: Optional[TreeNode], targetSum: int) -> List[List[int]]: if not root: return [] stack = [(root, [root.val])] From 8ff94842609eee048ec78b709a20a82339c3c093 Mon Sep 17 00:00:00 2001 From: suinming <0223314338aa@gmail.com> Date: Fri, 27 Sep 2024 15:20:59 +0800 Subject: [PATCH 2835/3019] =?UTF-8?q?feat:=2094.=20=E5=9F=8E=E5=B8=82?= =?UTF-8?q?=E9=97=B4=E8=B4=A7=E7=89=A9=E8=BF=90=E8=BE=93=20I=20=E6=96=B0?= =?UTF-8?q?=E5=A2=9Ejs=E7=AE=97=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...7\347\211\251\350\277\220\350\276\223I.md" | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git "a/problems/kamacoder/0094.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I.md" "b/problems/kamacoder/0094.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I.md" index 3737fe0149..9021e0feab 100644 --- "a/problems/kamacoder/0094.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I.md" +++ "b/problems/kamacoder/0094.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I.md" @@ -485,6 +485,45 @@ if __name__ == "__main__": ### Javascript +```js +async function main() { + // 輸入 + const rl = require('readline').createInterface({ input: process.stdin }) + const iter = rl[Symbol.asyncIterator]() + const readline = async () => (await iter.next()).value + const [n, m] = (await readline()).split(" ").map(Number) + const edges = [] + for (let i = 0 ; i < m ; i++) { + edges.push((await readline()).split(" ").map(Number)) + } + const minDist = Array.from({length: n + 1}, () => Number.MAX_VALUE) + // 起始點 + minDist[1] = 0 + + for (let i = 1 ; i < n ; i++) { + let update = false + for (const [src, desc, w] of edges) { + if (minDist[src] !== Number.MAX_VALUE && minDist[src] + w < minDist[desc]) { + minDist[desc] = minDist[src] + w + update = true + } + } + if (!update) { + break; + } + } + + // 輸出 + if (minDist[n] === Number.MAX_VALUE) { + console.log('unconnected') + } else { + console.log(minDist[n]) + } +} + +main() +``` + ### TypeScript ### PhP From c55a05a496fdb75c1f38fe49a060fa3985565342 Mon Sep 17 00:00:00 2001 From: suinming <0223314338aa@gmail.com> Date: Fri, 27 Sep 2024 15:59:22 +0800 Subject: [PATCH 2836/3019] =?UTF-8?q?feat:=20=2094.=20=E5=9F=8E=E5=B8=82?= =?UTF-8?q?=E9=97=B4=E8=B4=A7=E7=89=A9=E8=BF=90=E8=BE=93=20I=20SPEA?= =?UTF-8?q?=E6=96=B0=E5=A2=9Ejs=E7=AE=97=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\211\251\350\277\220\350\276\223I-SPFA.md" | 54 +++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git "a/problems/kamacoder/0094.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I-SPFA.md" "b/problems/kamacoder/0094.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I-SPFA.md" index b3f42bf800..9ba92599bb 100644 --- "a/problems/kamacoder/0094.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I-SPFA.md" +++ "b/problems/kamacoder/0094.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I-SPFA.md" @@ -464,6 +464,60 @@ if __name__ == "__main__": ### Javascript +```js +async function main() { + // 輸入 + const rl = require('readline').createInterface({ input: process.stdin }) + const iter = rl[Symbol.asyncIterator]() + const readline = async () => (await iter.next()).value + const [n, m] = (await readline()).split(" ").map(Number) + const grid = {} + for (let i = 0 ; i < m ; i++) { + const [src, desc, w] = (await readline()).split(" ").map(Number) + if (grid.hasOwnProperty(src)) { + grid[src].push([desc, w]) + } else { + grid[src] = [[desc, w]] + } + } + const minDist = Array.from({length: n + 1}, () => Number.MAX_VALUE) + + // 起始點 + minDist[1] = 0 + + const q = [1] + const visited = Array.from({length: n + 1}, () => false) + + while (q.length) { + const src = q.shift() + const neighbors = grid[src] + visited[src] = false + if (neighbors) { + for (const [desc, w] of neighbors) { + if (minDist[src] !== Number.MAX_VALUE + && minDist[src] + w < minDist[desc]) { + minDist[desc] = minDist[src] + w + if (!visited[desc]) { + q.push(desc) + visited[desc] = true + } + + } + } + } + } + + // 輸出 + if (minDist[n] === Number.MAX_VALUE) { + console.log('unconnected') + } else { + console.log(minDist[n]) + } +} + +main() +``` + ### TypeScript ### PhP From ecf70c6e57dc5d6e7583f9d362d5420f2d6dc74a Mon Sep 17 00:00:00 2001 From: suinming <0223314338aa@gmail.com> Date: Fri, 27 Sep 2024 19:43:51 +0800 Subject: [PATCH 2837/3019] =?UTF-8?q?feat:=2096.=20=E5=9F=8E=E5=B8=82?= =?UTF-8?q?=E9=97=B4=E8=B4=A7=E7=89=A9=E8=BF=90=E8=BE=93=20III=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0python=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...347\211\251\350\277\220\350\276\223III.md" | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git "a/problems/kamacoder/0096.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223III.md" "b/problems/kamacoder/0096.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223III.md" index dacd23d11d..567a1d8724 100644 --- "a/problems/kamacoder/0096.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223III.md" +++ "b/problems/kamacoder/0096.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223III.md" @@ -703,6 +703,42 @@ public class Main { ``` ### Python +```python +def main(): + # 輸入 + n, m = map(int, input().split()) + edges = list() + for _ in range(m): + edges.append(list(map(int, input().split() ))) + + start, end, k = map(int, input().split()) + min_dist = [float('inf') for _ in range(n + 1)] + min_dist[start] = 0 + + # 只能經過k個城市,所以從起始點到中間有(k + 1)個邊連接 + # 需要鬆弛(k + 1)次 + + for _ in range(k + 1): + update = False + min_dist_copy = min_dist.copy() + for src, desc, w in edges: + if (min_dist_copy[src] != float('inf') and + min_dist_copy[src] + w < min_dist[desc]): + min_dist[desc] = min_dist_copy[src] + w + update = True + if not update: + break + # 輸出 + if min_dist[end] == float('inf'): + print('unreachable') + else: + print(min_dist[end]) + + + +if __name__ == "__main__": + main() +``` ### Go From b32888260f0cb2f29314cf0c4d7d4dddb1f20f71 Mon Sep 17 00:00:00 2001 From: Ziyang Wen Date: Fri, 27 Sep 2024 21:17:44 +0800 Subject: [PATCH 2838/3019] =?UTF-8?q?0151python=E7=89=88=E6=9C=AC1?= =?UTF-8?q?=E5=88=A0=E9=99=A4=E5=86=97=E4=BD=99=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...70\262\351\207\214\347\232\204\345\215\225\350\257\215.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" "b/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" index bf486bdceb..9a0cbea466 100644 --- "a/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" +++ "b/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" @@ -440,11 +440,10 @@ class Solution { ```Python class Solution: def reverseWords(self, s: str) -> str: - # 删除前后空白 - s = s.strip() # 反转整个字符串 s = s[::-1] # 将字符串拆分为单词,并反转每个单词 + # split()函数能够自动忽略多余的空白字符 s = ' '.join(word[::-1] for word in s.split()) return s @@ -1029,3 +1028,4 @@ public string ReverseWords(string s) { + From 0c29c3ed1edd5fcf5be9a8eb6dcba6fc25fb569b Mon Sep 17 00:00:00 2001 From: Ziyang Wen Date: Fri, 27 Sep 2024 21:23:03 +0800 Subject: [PATCH 2839/3019] =?UTF-8?q?0541.=E5=8F=8D=E8=BD=AC=E5=AD=97?= =?UTF-8?q?=E7=AC=A6=E4=B8=B2II=20=E6=80=9D=E8=B7=AF=20=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E4=BA=86=E5=A4=9A=E4=BD=99=E7=9A=84=E2=80=9C=E5=9C=A8=E2=80=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...7\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git "a/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" "b/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" index 3e304fabc0..5e75d3c3f8 100644 --- "a/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" +++ "b/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" @@ -37,7 +37,7 @@ 因为要找的也就是每2 * k 区间的起点,这样写,程序会高效很多。 -**所以当需要固定规律一段一段去处理字符串的时候,要想想在在for循环的表达式上做做文章。** +**所以当需要固定规律一段一段去处理字符串的时候,要想想在for循环的表达式上做做文章。** 性能如下: @@ -505,3 +505,4 @@ impl Solution { + From 2173dd9e6430d8005df0781b4b05a9171208efc4 Mon Sep 17 00:00:00 2001 From: Ziyang Wen Date: Fri, 27 Sep 2024 21:26:55 +0800 Subject: [PATCH 2840/3019] =?UTF-8?q?0226.Python=E8=BF=AD=E4=BB=A3?= =?UTF-8?q?=E6=B3=95=E5=B9=BF=E5=BA=A6=E4=BC=98=E5=85=88=E9=81=8D=E5=8E=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...350\275\254\344\272\214\345\217\211\346\240\221.md" | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git "a/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" "b/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" index e501b29878..55dc3cbf83 100644 --- "a/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" @@ -459,11 +459,10 @@ class Solution: queue = collections.deque([root]) while queue: - for i in range(len(queue)): - node = queue.popleft() - node.left, node.right = node.right, node.left - if node.left: queue.append(node.left) - if node.right: queue.append(node.right) + node = queue.popleft() + node.left, node.right = node.right, node.left + if node.left: queue.append(node.left) + if node.right: queue.append(node.right) return root ``` @@ -1033,4 +1032,3 @@ public TreeNode InvertTree(TreeNode root) { - From 9a4dab8f898c175559b121f455707eb82452196f Mon Sep 17 00:00:00 2001 From: Camille <59353274+Camille0512@users.noreply.github.com> Date: Fri, 27 Sep 2024 22:49:01 +0800 Subject: [PATCH 2841/3019] =?UTF-8?q?Update=200099.=E5=B2=9B=E5=B1=BF?= =?UTF-8?q?=E7=9A=84=E6=95=B0=E9=87=8F=E6=B7=B1=E6=90=9C.md=20Add=20Scala?= =?UTF-8?q?=20code=20to=20solve=20counting=20islands=20problem=20on=20Leet?= =?UTF-8?q?Code?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...60\351\207\217\346\267\261\346\220\234.md" | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git "a/problems/kamacoder/0099.\345\262\233\345\261\277\347\232\204\346\225\260\351\207\217\346\267\261\346\220\234.md" "b/problems/kamacoder/0099.\345\262\233\345\261\277\347\232\204\346\225\260\351\207\217\346\267\261\346\220\234.md" index 6ac7ba3b62..da1c07395b 100644 --- "a/problems/kamacoder/0099.\345\262\233\345\261\277\347\232\204\346\225\260\351\207\217\346\267\261\346\220\234.md" +++ "b/problems/kamacoder/0099.\345\262\233\345\261\277\347\232\204\346\225\260\351\207\217\346\267\261\346\220\234.md" @@ -412,6 +412,46 @@ const dfs = (graph, visited, x, y) => { ### Swift ### Scala +```scala +import util.control.Breaks._ + +object Solution { + val dir = List((-1,0), (0,-1), (1,0), (0,1)) // 四个方向 + + def dfs(grid: Array[Array[Char]], visited: Array[Array[Boolean]], row: Int, col: Int): Unit = { + (0 until 4).map { x => + val nextR = row + dir(x)(0) + val nextC = col + dir(x)(1) + breakable { + if(nextR < 0 || nextR >= grid.length || nextC < 0 || nextC >= grid(0).length) break + if (!visited(nextR)(nextC) && grid(nextR)(nextC) == '1') { + visited(nextR)(nextC) = true // 经过就记录 + dfs(grid, visited, nextR, nextC) + } + } + } + } + + def numIslands(grid: Array[Array[Char]]): Int = { + val row = grid.length + val col = grid(0).length + var visited = Array.fill(row)(Array.fill(col)(false)) + var counter = 0 + + (0 until row).map{ r => + (0 until col).map{ c => + if (!visited(r)(c) && grid(r)(c) == '1') { + visited(r)(c) = true // 经过就记录 + dfs(grid, visited, r, c) + counter += 1 + } + } + } + + counter + } +} +``` ### C# From 2f58a7b043eeb19eff88c174366db1777a6fff66 Mon Sep 17 00:00:00 2001 From: DraculaJay <113758447+DraculaJay@users.noreply.github.com> Date: Sat, 28 Sep 2024 04:55:41 +0800 Subject: [PATCH 2842/3019] =?UTF-8?q?0053=20=E6=B7=BB=E5=8A=A0python?= =?UTF-8?q?=E5=8A=A8=E6=80=81=E8=A7=84=E5=88=92=E8=A7=A3=E6=B3=95=E5=92=8C?= =?UTF-8?q?=E5=8A=A8=E6=80=81=E8=A7=84=E5=88=92=E4=BC=98=E5=8C=96=E8=A7=A3?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...47\345\255\220\345\272\217\345\222\214.md" | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git "a/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" "b/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" index 551c39bfac..507575647a 100644 --- "a/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" +++ "b/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" @@ -229,6 +229,42 @@ class Solution: ``` + +动态规划 + +```python +class Solution: + def maxSubArray(self, nums): + if not nums: + return 0 + dp = [0] * len(nums) # dp[i]表示包括i之前的最大连续子序列和 + dp[0] = nums[0] + result = dp[0] + for i in range(1, len(nums)): + dp[i] = max(dp[i-1]+nums[i], nums[i]) # 状态转移公式 + if dp[i] > result: + result = dp[i] # result 保存dp[i]的最大值 + return result +``` + +动态规划优化 + +```python +class Solution: + def maxSubArray(self, nums: List[int]) -> int: + max_sum = float("-inf") # 初始化结果为负无穷大,方便比较取最大值 + current_sum = 0 # 初始化当前连续和 + + for num in nums: + + # 更新当前连续和 + # 如果原本的连续和加上当前数字之后没有当前数字大,说明原本的连续和是负数,那么就直接从当前数字开始重新计算连续和 + current_sum = max(current_sum+num, num) + max_sum = max(max_sum, current_sum) # 更新结果 + + return max_sum +``` + ### Go 贪心法 ```go From 0ea7587f72abd2c45cc711da696d1c580ddafa06 Mon Sep 17 00:00:00 2001 From: DraculaJay <113758447+DraculaJay@users.noreply.github.com> Date: Sat, 28 Sep 2024 05:04:22 +0800 Subject: [PATCH 2843/3019] =?UTF-8?q?0055=20=E8=B7=B3=E8=B7=83=E6=B8=B8?= =?UTF-8?q?=E6=88=8F=E6=B7=BB=E5=8A=A0python=20=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\263\350\267\203\346\270\270\346\210\217.md" | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git "a/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" "b/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" index 01fd951384..82b433d7e4 100644 --- "a/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" +++ "b/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" @@ -143,6 +143,23 @@ class Solution: return False ``` +```python +## 基于当前最远可到达位置判断 +class Solution: + def canJump(self, nums: List[int]) -> bool: + far = nums[0] + for i in range(len(nums)): + # 要考虑两个情况 + # 1. i <= far - 表示 当前位置i 可以到达 + # 2. i > far - 表示 当前位置i 无法到达 + if i > far: + return False + far = max(far, nums[i]+i) + # 如果循环正常结束,表示最后一个位置也可以到达,否则会在中途直接退出 + # 关键点在于,要想明白其实列表中的每个位置都是需要验证能否到达的 + return True +``` + ### Go ```go From 754d2d664d848a7f79b7b97347f9fcf27a03749b Mon Sep 17 00:00:00 2001 From: Zhihan Li <54661071+zhihali@users.noreply.github.com> Date: Sun, 29 Sep 2024 23:24:11 +0100 Subject: [PATCH 2844/3019] =?UTF-8?q?Update=200135.=E5=88=86=E5=8F=91?= =?UTF-8?q?=E7=B3=96=E6=9E=9C.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...06\345\217\221\347\263\226\346\236\234.md" | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git "a/problems/0135.\345\210\206\345\217\221\347\263\226\346\236\234.md" "b/problems/0135.\345\210\206\345\217\221\347\263\226\346\236\234.md" index 6805857e8c..29eaa06d20 100644 --- "a/problems/0135.\345\210\206\345\217\221\347\263\226\346\236\234.md" +++ "b/problems/0135.\345\210\206\345\217\221\347\263\226\346\236\234.md" @@ -177,21 +177,20 @@ class Solution { ```python class Solution: def candy(self, ratings: List[int]) -> int: - candyVec = [1] * len(ratings) + n = len(ratings) + candies = [1] * n - # 从前向后遍历,处理右侧比左侧评分高的情况 - for i in range(1, len(ratings)): + # Forward pass: handle cases where right rating is higher than left + for i in range(1, n): if ratings[i] > ratings[i - 1]: - candyVec[i] = candyVec[i - 1] + 1 + candies[i] = candies[i - 1] + 1 - # 从后向前遍历,处理左侧比右侧评分高的情况 - for i in range(len(ratings) - 2, -1, -1): + # Backward pass: handle cases where left rating is higher than right + for i in range(n - 2, -1, -1): if ratings[i] > ratings[i + 1]: - candyVec[i] = max(candyVec[i], candyVec[i + 1] + 1) + candies[i] = max(candies[i], candies[i + 1] + 1) - # 统计结果 - result = sum(candyVec) - return result + return sum(candies) ``` From 5fb0a12fa14d826ee37179f6807d3e332ae46d76 Mon Sep 17 00:00:00 2001 From: suinming <0223314338aa@gmail.com> Date: Tue, 1 Oct 2024 17:39:24 +0800 Subject: [PATCH 2845/3019] =?UTF-8?q?feat:=20127.=20=E9=AA=91=E5=A3=AB?= =?UTF-8?q?=E7=9A=84=E6=94=BB=E5=87=BB=E5=A2=9E=E5=8A=A0js=E8=A7=A3?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...7\232\204\346\224\273\345\207\273astar.md" | 125 ++++++++++++++++++ 1 file changed, 125 insertions(+) diff --git "a/problems/kamacoder/0126.\351\252\221\345\243\253\347\232\204\346\224\273\345\207\273astar.md" "b/problems/kamacoder/0126.\351\252\221\345\243\253\347\232\204\346\224\273\345\207\273astar.md" index 2d0481ecec..1cdba07de7 100644 --- "a/problems/kamacoder/0126.\351\252\221\345\243\253\347\232\204\346\224\273\345\207\273astar.md" +++ "b/problems/kamacoder/0126.\351\252\221\345\243\253\347\232\204\346\224\273\345\207\273astar.md" @@ -375,6 +375,131 @@ for _ in range(n): ### Javascript +```js +class MinHeap { + constructor() { + this.val = [] + } + push(val) { + this.val.push(val) + if (this.val.length > 1) { + this.bubbleUp() + } + } + bubbleUp() { + let pi = this.val.length - 1 + let pp = Math.floor((pi - 1) / 2) + while (pi > 0 && this.val[pp][0] > this.val[pi][0]) { + ;[this.val[pi], this.val[pp]] = [this.val[pp], this.val[pi]] + pi = pp + pp = Math.floor((pi - 1) / 2) + } + } + pop() { + if (this.val.length > 1) { + let pp = 0 + let pi = this.val.length - 1 + ;[this.val[pi], this.val[pp]] = [this.val[pp], this.val[pi]] + const min = this.val.pop() + if (this.val.length > 1) { + this.sinkDown(0) + } + return min + } else if (this.val.length == 1) { + return this.val.pop() + } + + } + sinkDown(parentIdx) { + let pp = parentIdx + let plc = pp * 2 + 1 + let prc = pp * 2 + 2 + let pt = pp // temp pointer + if (plc < this.val.length && this.val[pp][0] > this.val[plc][0]) { + pt = plc + } + if (prc < this.val.length && this.val[pt][0] > this.val[prc][0]) { + pt = prc + } + if (pt != pp) { + ;[this.val[pp], this.val[pt]] = [this.val[pt], this.val[pp]] + this.sinkDown(pt) + } + } +} + +const moves = [ + [1, 2], + [2, 1], + [-1, -2], + [-2, -1], + [-1, 2], + [-2, 1], + [1, -2], + [2, -1] +] + +function dist(a, b) { + return ((a[0] - b[0])**2 + (a[1] - b[1])**2)**0.5 +} + +function isValid(x, y) { + return x >= 1 && y >= 1 && x < 1001 && y < 1001 +} + +function bfs(start, end) { + const step = new Map() + step.set(start.join(" "), 0) + const q = new MinHeap() + q.push([dist(start, end), start[0], start[1]]) + + while(q.val.length) { + const [d, x, y] = q.pop() + // if x and y correspond to end position output result + if (x == end[0] && y == end[1]) { + console.log(step.get(end.join(" "))) + break; + } + for (const [dx, dy] of moves) { + const nx = dx + x + const ny = dy + y + if (isValid(nx, ny)) { + const newStep = step.get([x, y].join(" ")) + 1 + const newDist = dist([nx, ny], [...end]) + const s = step.get([nx, ny].join(" ")) ? + step.get([nx, ny]) : + Number.MAX_VALUE + if (newStep < s) { + q.push( + [ + newStep + newDist, + nx, + ny + ] + ) + step.set([nx, ny].join(" "), newStep) + } + } + } + } +} + +async function main() { + const rl = require('readline').createInterface({ input: process.stdin }) + const iter = rl[Symbol.asyncIterator]() + const readline = async () => (await iter.next()).value + const n = Number((await readline())) + + // find min step + for (let i = 0 ; i < n ; i++) { + const [s1, s2, t1, t2] = (await readline()).split(" ").map(Number) + bfs([s1, s2], [t1, t2]) + } +} + +main() +``` + ### TypeScript ### PhP From 07d219ecd1fb75337d6d5722a1b63635e4f19057 Mon Sep 17 00:00:00 2001 From: Yufan Sheng <18829237653@163.com> Date: Fri, 4 Oct 2024 21:05:14 +1000 Subject: [PATCH 2846/3019] =?UTF-8?q?=E6=9B=B4=E6=AD=A3=E5=A4=8D=E6=9D=82?= =?UTF-8?q?=E5=BA=A6=E5=88=86=E6=9E=90=E4=B8=AD=E7=9A=84=E7=AC=94=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" "b/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" index 318c3035ce..10fe577144 100644 --- "a/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" +++ "b/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" @@ -110,7 +110,7 @@ public: ``` * 时间复杂度:O(nlog n),因为有一个快排 -* 空间复杂度:O(1),有一个快排,最差情况(倒序)时,需要n次递归调用。因此确实需要O(n)的栈空间 +* 空间复杂度:O(n),有一个快排,最差情况(倒序)时,需要n次递归调用。因此确实需要O(n)的栈空间 可以看出代码并不复杂。 From 2b7fc7d1e183ebcce3930b0235f7f646a6ab3871 Mon Sep 17 00:00:00 2001 From: Yufan Sheng <18829237653@163.com> Date: Fri, 4 Oct 2024 21:22:50 +1000 Subject: [PATCH 2847/3019] =?UTF-8?q?=E5=88=A0=E9=99=A4=E5=86=97=E4=BD=99?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=EF=BC=8C=E5=A2=9E=E5=8A=A0=E8=AF=A6=E7=BB=86?= =?UTF-8?q?=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...25\347\210\206\346\260\224\347\220\203.md" | 22 ++++++++++++------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git "a/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" "b/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" index 10fe577144..2099275df1 100644 --- "a/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" +++ "b/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" @@ -180,19 +180,25 @@ class Solution: ```python class Solution: # 不改变原数组 def findMinArrowShots(self, points: List[List[int]]) -> int: + if len(points) == 0: + return 0 + points.sort(key = lambda x: x[0]) - sl,sr = points[0][0],points[0][1] + + # points已经按照第一个坐标正序排列,因此只需要设置一个变量,记录右侧坐标(阈值) + # 考虑一个气球范围包含两个不相交气球的情况:气球1: [1, 10], 气球2: [2, 5], 气球3: [6, 10] + curr_min_right = points[0][1] count = 1 + for i in points: - if i[0]>sr: - count+=1 - sl,sr = i[0],i[1] + if i[0] > curr_min_right: + # 当气球左侧大于这个阈值,那么一定就需要在发射一只箭,并且将阈值更新为当前气球的右侧 + count += 1 + curr_min_right = i[1] else: - sl = max(sl,i[0]) - sr = min(sr,i[1]) + # 否则的话,我们只需要求阈值和当前气球的右侧的较小值来更新阈值 + curr_min_right = min(curr_min_right, i[1]) return count - - ``` ### Go ```go From 91137dc297f7a9ca7abb2d59fd9c45afe04f2366 Mon Sep 17 00:00:00 2001 From: Jasonyou <2926593225@qq.com> Date: Thu, 3 Oct 2024 19:39:17 +0800 Subject: [PATCH 2848/3019] =?UTF-8?q?fix:=20Errata=20=E8=BE=93=E5=87=BA?= =?UTF-8?q?=E8=BE=93=E5=87=BA->=E8=BE=93=E5=85=A5=E8=BE=93=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\234\211\345\217\257\350\276\276\350\267\257\345\276\204.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/kamacoder/0098.\346\211\200\346\234\211\345\217\257\350\276\276\350\267\257\345\276\204.md" "b/problems/kamacoder/0098.\346\211\200\346\234\211\345\217\257\350\276\276\350\267\257\345\276\204.md" index db35524ffd..a2f60a90a6 100644 --- "a/problems/kamacoder/0098.\346\211\200\346\234\211\345\217\257\350\276\276\350\267\257\345\276\204.md" +++ "b/problems/kamacoder/0098.\346\211\200\346\234\211\345\217\257\350\276\276\350\267\257\345\276\204.md" @@ -277,7 +277,7 @@ ACM格式大家在输出结果的时候,要关注看看格式问题,特别 有录友可能会想,ACM格式就是麻烦,有空格没有空格有什么影响,结果对了不就行了? -ACM模式相对于核心代码模式(力扣) 更考验大家对代码的掌控能力。 例如工程代码里,输出输出都是要自己控制的。这也是为什么大公司笔试,都是ACM模式。 +ACM模式相对于核心代码模式(力扣) 更考验大家对代码的掌控能力。 例如工程代码里,输入输出都是要自己控制的。这也是为什么大公司笔试,都是ACM模式。 以上代码中,结果都存在了 result数组里(二维数组,每一行是一个结果),最后将其打印出来。(重点看注释) From 4eef0863a293b7f2cfd36214a3281ae26093022e Mon Sep 17 00:00:00 2001 From: Jasonyou <2926593225@qq.com> Date: Fri, 4 Oct 2024 21:18:01 +0800 Subject: [PATCH 2849/3019] =?UTF-8?q?feat:=200100.=E5=B2=9B=E5=B1=BF?= =?UTF-8?q?=E6=9C=80=E5=A4=A7=E9=9D=A2=E7=A7=AF=20Java=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...00\345\244\247\351\235\242\347\247\257.md" | 123 +++++++++++++++++- 1 file changed, 122 insertions(+), 1 deletion(-) diff --git "a/problems/kamacoder/0100.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" "b/problems/kamacoder/0100.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" index 51bfc57fd1..871925df1b 100644 --- "a/problems/kamacoder/0100.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" +++ "b/problems/kamacoder/0100.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" @@ -222,7 +222,128 @@ public: ## 其他语言版本 -### Java +### Java + +```java +import java.util.*; +import java.math.*; + +/** + * DFS版 + */ +public class Main{ + + static final int[][] dir={{0,1},{1,0},{0,-1},{-1,0}}; + static int result=0; + static int count=0; + + public static void main(String[] args){ + Scanner scanner = new Scanner(System.in); + int n = scanner.nextInt(); + int m = scanner.nextInt(); + int[][] map = new int[n][m]; + for (int i = 0; i < n; i++) { + for (int j = 0; j < m; j++) { + map[i][j]=scanner.nextInt(); + } + } + boolean[][] visited = new boolean[n][m]; + for (int i = 0; i < n; i++) { + for (int j = 0; j < m; j++) { + if(!visited[i][j]&&map[i][j]==1){ + count=0; + dfs(map,visited,i,j); + result= Math.max(count, result); + } + } + } + System.out.println(result); + } + + static void dfs(int[][] map,boolean[][] visited,int x,int y){ + count++; + visited[x][y]=true; + for (int i = 0; i < 4; i++) { + int nextX=x+dir[i][0]; + int nextY=y+dir[i][1]; + //水或者已经访问过的跳过 + if(nextX<0||nextY<0 + ||nextX>=map.length||nextY>=map[0].length + ||visited[nextX][nextY]||map[nextX][nextY]==0)continue; + + dfs(map,visited,nextX,nextY); + } + } +} +``` + +```java +import java.util.*; +import java.math.*; + +/** + * BFS版 + */ +public class Main { + static class Node { + int x; + int y; + + public Node(int x, int y) { + this.x = x; + this.y = y; + } + } + + static final int[][] dir = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}}; + static int result = 0; + static int count = 0; + + public static void main(String[] args) { + Scanner scanner = new Scanner(System.in); + int n = scanner.nextInt(); + int m = scanner.nextInt(); + int[][] map = new int[n][m]; + for (int i = 0; i < n; i++) { + for (int j = 0; j < m; j++) { + map[i][j] = scanner.nextInt(); + } + } + boolean[][] visited = new boolean[n][m]; + for (int i = 0; i < n; i++) { + for (int j = 0; j < m; j++) { + if (!visited[i][j] && map[i][j] == 1) { + count = 0; + bfs(map, visited, i, j); + result = Math.max(count, result); + } + } + } + System.out.println(result); + } + + static void bfs(int[][] map, boolean[][] visited, int x, int y) { + Queue q = new LinkedList<>(); + q.add(new Node(x, y)); + visited[x][y] = true; + count++; + while (!q.isEmpty()) { + Node node = q.remove(); + for (int i = 0; i < 4; i++) { + int nextX = node.x + dir[i][0]; + int nextY = node.y + dir[i][1]; + if (nextX < 0 || nextY < 0 || nextX >= map.length || nextY >= map[0].length || visited[nextX][nextY] || map[nextX][nextY] == 0) + continue; + q.add(new Node(nextX, nextY)); + visited[nextX][nextY] = true; + count++; + } + } + } +} + +``` + ### Python From fc004742e70956263fbfba9ca48c3b80d6aee845 Mon Sep 17 00:00:00 2001 From: "Ethan.Liu" Date: Sat, 5 Oct 2024 12:26:05 +0800 Subject: [PATCH 2850/3019] =?UTF-8?q?feat:=200977.=E6=9C=89=E5=BA=8F?= =?UTF-8?q?=E6=95=B0=E7=BB=84=E7=9A=84=E5=B9=B3=E6=96=B9=20python3?= =?UTF-8?q?=E5=8F=8C=E6=8C=87=E9=92=88=E4=B8=89=E6=AD=A5=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...04\347\232\204\345\271\263\346\226\271.md" | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git "a/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" "b/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" index effa905541..1a6604c2c2 100644 --- "a/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" +++ "b/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" @@ -100,6 +100,7 @@ public: ## 其他语言版本 ### Java: + 排序法 ```Java class Solution { @@ -209,6 +210,43 @@ class Solution: return new_list[::-1] ``` +```python3 +(双指针优化版本) 三步优化 + class Solution: + def sortedSquares(self, nums: List[int]) -> List[int]: + """ + 整体思想:有序数组的绝对值最大值永远在两头,比较两头,平方大的插到新数组的最后 + 优 化:1. 优化所有元素为非正或非负的情况 + 2. 头尾平方的大小比较直接将头尾相加与0进行比较即可 + 3. 新的平方排序数组的插入索引可以用倒序插入实现(针对for循环,while循环不适用) + """ + + # 特殊情况, 元素都非负(优化1) + if nums[0] >= 0: + return [num ** 2 for num in nums] # 按顺序平方即可 + # 最后一个非正,全负有序的 + if nums[-1] <= 0: + return [x ** 2 for x in nums[::-1]] # 倒序平方后的数组 + + # 一般情况, 有正有负 + i = 0 # 原数组头索引 + j = len(nums) - 1 # 原数组尾部索引 + new_nums = [0] * len(nums) # 新建一个等长数组用于保存排序后的结果 + # end_index = len(nums) - 1 # 新的排序数组(是新数组)尾插索引, 每次需要减一(优化3优化了) + + for end_index in range(len(nums)-1, -1, -1): # (优化3,倒序,不用单独创建变量) + # if nums[i] ** 2 >= nums[j] ** 2: + if nums[i] + nums[j] <= 0: # (优化2) + new_nums[end_index] = nums[i] ** 2 + i += 1 + # end_index -= 1 (优化3) + else: + new_nums[end_index] = nums[j] ** 2 + j -= 1 + # end_index -= 1 (优化3) + return new_nums +``` + ### Go: ```Go From 0a33a8d05c1c430bdb56d63a360e2de0d09b6ace Mon Sep 17 00:00:00 2001 From: Nomop <13098939400@163.com> Date: Sat, 5 Oct 2024 15:21:32 +0800 Subject: [PATCH 2851/3019] =?UTF-8?q?Update=200100.=E5=B2=9B=E5=B1=BF?= =?UTF-8?q?=E7=9A=84=E6=9C=80=E5=A4=A7=E9=9D=A2=E7=A7=AF.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 100.岛屿的最大面积新增Rust解法 --- ...00\345\244\247\351\235\242\347\247\257.md" | 138 ++++++++++++++++++ 1 file changed, 138 insertions(+) diff --git "a/problems/kamacoder/0100.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" "b/problems/kamacoder/0100.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" index 51bfc57fd1..50e40f3a17 100644 --- "a/problems/kamacoder/0100.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" +++ "b/problems/kamacoder/0100.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" @@ -389,6 +389,144 @@ func main() { ### Rust +DFS + +``` rust +use std::io; +use std::cmp; + +// 定义四个方向 +const DIRECTIONS: [(i32, i32); 4] = [(0, 1), (1, 0), (-1, 0), (0, -1)]; + +fn dfs(grid: &Vec>, visited: &mut Vec>, x: usize, y: usize, count: &mut i32) { + if visited[x][y] || grid[x][y] == 0 { + return; // 终止条件:已访问或者遇到海水 + } + visited[x][y] = true; // 标记已访问 + *count += 1; + + for &(dx, dy) in DIRECTIONS.iter() { + let new_x = x as i32 + dx; + let new_y = y as i32 + dy; + + // 检查边界条件 + if new_x >= 0 && new_x < grid.len() as i32 && new_y >= 0 && new_y < grid[0].len() as i32 { + dfs(grid, visited, new_x as usize, new_y as usize, count); + } + } +} + +fn main() { + let mut input = String::new(); + + // 读取 n 和 m + io::stdin().read_line(&mut input); + let dims: Vec = input.trim().split_whitespace().map(|s| s.parse().unwrap()).collect(); + let (n, m) = (dims[0], dims[1]); + + // 读取 grid + let mut grid = vec![]; + for _ in 0..n { + input.clear(); + io::stdin().read_line(&mut input); + let row: Vec = input.trim().split_whitespace().map(|s| s.parse().unwrap()).collect(); + grid.push(row); + } + + // 初始化访问记录 + let mut visited = vec![vec![false; m]; n]; + let mut result = 0; + + // 遍历所有格子 + for i in 0..n { + for j in 0..m { + if !visited[i][j] && grid[i][j] == 1 { + let mut count = 0; + dfs(&grid, &mut visited, i, j, &mut count); + result = cmp::max(result, count); + } + } + } + + // 输出结果 + println!("{}", result); +} + +``` +BFS +```rust +use std::io; +use std::collections::VecDeque; + +// 定义四个方向 +const DIRECTIONS: [(i32, i32); 4] = [(0, 1), (1, 0), (-1, 0), (0, -1)]; + +fn bfs(grid: &Vec>, visited: &mut Vec>, x: usize, y: usize) -> i32 { + let mut count = 0; + let mut queue = VecDeque::new(); + queue.push_back((x, y)); + visited[x][y] = true; // 标记已访问 + + while let Some((cur_x, cur_y)) = queue.pop_front() { + count += 1; // 增加计数 + + for &(dx, dy) in DIRECTIONS.iter() { + let new_x = cur_x as i32 + dx; + let new_y = cur_y as i32 + dy; + + // 检查边界条件 + if new_x >= 0 && new_x < grid.len() as i32 && new_y >= 0 && new_y < grid[0].len() as i32 { + let new_x_usize = new_x as usize; + let new_y_usize = new_y as usize; + + // 如果未访问且是陆地,加入队列 + if !visited[new_x_usize][new_y_usize] && grid[new_x_usize][new_y_usize] == 1 { + visited[new_x_usize][new_y_usize] = true; // 标记已访问 + queue.push_back((new_x_usize, new_y_usize)); + } + } + } + } + + count +} + +fn main() { + let mut input = String::new(); + + // 读取 n 和 m + io::stdin().read_line(&mut input).expect("Failed to read line"); + let dims: Vec = input.trim().split_whitespace().map(|s| s.parse().unwrap()).collect(); + let (n, m) = (dims[0], dims[1]); + + // 读取 grid + let mut grid = vec![]; + for _ in 0..n { + input.clear(); + io::stdin().read_line(&mut input).expect("Failed to read line"); + let row: Vec = input.trim().split_whitespace().map(|s| s.parse().unwrap()).collect(); + grid.push(row); + } + + // 初始化访问记录 + let mut visited = vec![vec![false; m]; n]; + let mut result = 0; + + // 遍历所有格子 + for i in 0..n { + for j in 0..m { + if !visited[i][j] && grid[i][j] == 1 { + let count = bfs(&grid, &mut visited, i, j); + result = result.max(count); + } + } + } + + // 输出结果 + println!("{}", result); +} + +``` ### Javascript From a663089383732a56011c1b630c30635265c316a7 Mon Sep 17 00:00:00 2001 From: jjblaack Date: Sat, 5 Oct 2024 18:07:00 +0800 Subject: [PATCH 2852/3019] =?UTF-8?q?=E5=B2=9B=E5=B1=BF=E7=9A=84=E6=9C=80?= =?UTF-8?q?=E5=A4=A7=E9=9D=A2=E7=A7=AFjava=E5=AE=9E=E7=8E=B0=EF=BC=88dfs+b?= =?UTF-8?q?fs=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...00\345\244\247\351\235\242\347\247\257.md" | 116 +++++++++++++++++- 1 file changed, 115 insertions(+), 1 deletion(-) diff --git "a/problems/kamacoder/0100.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" "b/problems/kamacoder/0100.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" index 51bfc57fd1..38b98d0e47 100644 --- "a/problems/kamacoder/0100.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" +++ "b/problems/kamacoder/0100.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" @@ -223,7 +223,121 @@ public: ## 其他语言版本 ### Java - +DFS +```java +//这里的实现为主函数处理每个岛屿的第一块陆地 方式 +//所以是主函数直接置count为1,剩余的交给dfs来做。 +import java.util.*; +public class Main{ + static int[][] dir = {{0,-1}, {1,0}, {0,1}, {-1, 0}};//四个方向 + static int count = 0; + public static void dfs(boolean[][] visited, int x, int y, int[][] grid){ + for(int i = 0; i < 4; i++){ + int nextX = x + dir[i][0]; + int nextY = y + dir[i][1]; + if(nextX < 0 || nextY < 0 || nextY >= grid[0].length || nextX >= grid.length){ + continue; + } + if(!visited[nextX][nextY] && grid[nextX][nextY] == 1){ + count++; + visited[nextX][nextY] = true; + dfs(visited, nextX, nextY, grid); + } + } + } + public static void main(String[] args){ + Scanner in = new Scanner(System.in); + int n = in.nextInt(); + int m = in.nextInt(); + int[][] grid = new int[n][m]; + for(int i = 0; i < n; i++){ + for(int j = 0; j < m; j++){ + grid[i][j] = in.nextInt(); + } + } + + int result = 0; + boolean[][] visited = new boolean[n][m]; + for(int i = 0; i < n; i++){ + for(int j = 0; j < m; j++){ + if(!visited[i][j] && grid[i][j] == 1){ + visited[i][j] = true; + count = 1; + dfs(visited, i, j, grid); + //dfs遍历完了一座岛屿,就比较count和result,保留最大的 + result = Math.max(result, count); + } + } + } + System.out.println(result); + } +} +``` +BFS +```java +import java.util.*; +public class Main{ + static int[][] dir = {{0,-1}, {1,0}, {0,1}, {-1, 0}};//下右上左的顺序 + static int count = 0; + public static void bfs(boolean[][] visited, int x, int y, int[][] grid){ + Queue queue = new LinkedList(); + queue.add(new pair(x,y)); + count = 1; //该岛屿的第一块陆地被visit了 + + //对这个岛屿的所有都入队,除非上下左右都没有未访问的陆地 + while(!queue.isEmpty()){ + int curX = queue.peek().x; + int curY = queue.poll().y; + //对每块陆地都进行上下左右的入队和计算(遍历),自然就是按广度优先了 + for(int i = 0; i < 4; i++){ + int nextX = curX + dir[i][0]; + int nextY = curY + dir[i][1]; + if(nextX < 0 || nextY < 0 || nextX >= grid.length || nextY >= grid[0].length){ + continue; + } + if(!visited[nextX][nextY] && grid[nextX][nextY] == 1){ + count++; + queue.add(new pair(nextX, nextY)); + visited[nextX][nextY] = true; + } + } + } + } + + static class pair{ + int x; + int y; + pair(int x, int y){ + this.x = x; + this.y = y; + } + } + + public static void main(String[] args){ + Scanner in = new Scanner(System.in); + int n = in.nextInt(); + int m = in.nextInt(); + int[][] grid = new int[n][m]; + for(int i = 0; i < n; i++){ + for(int j = 0; j < m; j++){ + grid[i][j] = in.nextInt(); + } + } + int result = 0; + boolean[][] visited = new boolean[n][m]; + for(int i = 0; i < n; i++){ + for(int j = 0; j < m; j++){ + if(!visited[i][j] && grid[i][j] == 1){ + visited[i][j] = true; + bfs(visited, i, j, grid); + result = Math.max(result, count); + } + } + } + System.out.println(result); + } +} +``` ### Python DFS From 9c7131e253ad9b59aaa69f102f03e0154752b660 Mon Sep 17 00:00:00 2001 From: Jasonyou <2926593225@qq.com> Date: Sun, 6 Oct 2024 03:04:09 +0800 Subject: [PATCH 2853/3019] =?UTF-8?q?feate:=20=E5=AD=97=E7=AC=A6=E4=B8=B2?= =?UTF-8?q?=E6=8E=A5=E9=BE=99=20=20Java=E4=BC=98=E5=8C=96=E7=89=88?= =?UTF-8?q?=E5=B9=B6=E4=BF=AE=E5=A4=8D=E5=AD=98=E5=9C=A8=E9=97=AE=E9=A2=98?= =?UTF-8?q?=201.=E4=BD=BF=E7=94=A8null=E6=A0=87=E5=BF=97=E5=88=86=E5=B1=82?= =?UTF-8?q?=202.=E5=AF=BB=E6=89=BE=E9=82=BB=E6=8E=A5=E8=8A=82=E7=82=B9?= =?UTF-8?q?=E6=97=B6=EF=BC=8C=E5=9B=9E=E6=BB=9A=E4=BF=AE=E6=94=B9=EF=BC=8C?= =?UTF-8?q?=E9=81=BF=E5=85=8D=E5=A4=9A=E6=AC=A1=E6=95=B0=E7=BB=84=E5=A4=8D?= =?UTF-8?q?=E5=88=B6=203.=E4=BF=AE=E5=A4=8D=E8=BE=B9=E7=95=8C=E6=9D=A1?= =?UTF-8?q?=E4=BB=B6=EF=BC=9AbeginStr=3D=3DendStr=E6=97=B6=EF=BC=8C?= =?UTF-8?q?=E5=BA=94=E8=AF=A5=E8=BE=93=E5=87=BA0=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...46\344\270\262\346\216\245\351\276\231.md" | 108 +++++++++--------- 1 file changed, 56 insertions(+), 52 deletions(-) diff --git "a/problems/kamacoder/0110.\345\255\227\347\254\246\344\270\262\346\216\245\351\276\231.md" "b/problems/kamacoder/0110.\345\255\227\347\254\246\344\270\262\346\216\245\351\276\231.md" index 308e50b7f3..ef261c4d8c 100644 --- "a/problems/kamacoder/0110.\345\255\227\347\254\246\344\270\262\346\216\245\351\276\231.md" +++ "b/problems/kamacoder/0110.\345\255\227\347\254\246\344\270\262\346\216\245\351\276\231.md" @@ -152,66 +152,70 @@ int main() { ## 其他语言版本 -### Java +### Java + ```Java +import java.util.*; + public class Main { - // BFS方法 - public static int ladderLength(String beginWord, String endWord, List wordList) { - // 使用set作为查询容器,效率更高 - HashSet set = new HashSet<>(wordList); - - // 声明一个queue存储每次变更一个字符得到的且存在于容器中的新字符串 - Queue queue = new LinkedList<>(); - - // 声明一个hashMap存储遍历到的字符串以及所走过的路径path - HashMap visitMap = new HashMap<>(); - queue.offer(beginWord); - visitMap.put(beginWord, 1); - - while (!queue.isEmpty()) { - String curWord = queue.poll(); - int path = visitMap.get(curWord); - - for (int i = 0; i < curWord.length(); i++) { - char[] ch = curWord.toCharArray(); - // 每个位置尝试26个字母 - for (char k = 'a'; k <= 'z'; k++) { - ch[i] = k; - - String newWord = new String(ch); - if (newWord.equals(endWord)) return path + 1; - - // 如果这个新字符串存在于容器且之前未被访问到 - if (set.contains(newWord) && !visitMap.containsKey(newWord)) { - visitMap.put(newWord, path + 1); - queue.offer(newWord); + public static void main(String[] args) { + Scanner scanner = new Scanner(System.in); + int n = scanner.nextInt(); + scanner.nextLine(); + String beginStr = scanner.next(); + String endStr = scanner.next(); + scanner.nextLine(); + List wordList = new ArrayList<>(); + wordList.add(beginStr); + wordList.add(endStr); + for (int i = 0; i < n; i++) { + wordList.add(scanner.nextLine()); + } + int count = bfs(beginStr, endStr, wordList); + System.out.println(count); + } + + /** + * 广度优先搜索-寻找最短路径 + */ + public static int bfs(String beginStr, String endStr, List wordList) { + int len = 1; + Set set = new HashSet<>(wordList); + Set visited = new HashSet<>(); + Queue q = new LinkedList<>(); + visited.add(beginStr); + q.add(beginStr); + q.add(null); + while (!q.isEmpty()) { + String node = q.remove(); + //上一层结束,若下一层还有节点进入下一层 + if (node == null) { + if (!q.isEmpty()) { + len++; + q.add(null); + } + continue; + } + char[] charArray = node.toCharArray(); + //寻找邻接节点 + for (int i = 0; i < charArray.length; i++) { + //记录旧值,用于回滚修改 + char old = charArray[i]; + for (char j = 'a'; j <= 'z'; j++) { + charArray[i] = j; + String newWord = new String(charArray); + if (set.contains(newWord) && !visited.contains(newWord)) { + q.add(newWord); + visited.add(newWord); + //找到结尾 + if (newWord.equals(endStr)) return len + 1; } } + charArray[i] = old; } } - return 0; } - - public static void main (String[] args) { - /* code */ - // 接收输入 - Scanner sc = new Scanner(System.in); - int N = sc.nextInt(); - sc.nextLine(); - String[] strs = sc.nextLine().split(" "); - - List wordList = new ArrayList<>(); - for (int i = 0; i < N; i++) { - wordList.add(sc.nextLine()); - } - - // wordList.add(strs[1]); - - // 打印结果 - int result = ladderLength(strs[0], strs[1], wordList); - System.out.println(result); - } } ``` From d3804674e4b26d29800720a35d42c177a5a49e66 Mon Sep 17 00:00:00 2001 From: Jasonyou <2926593225@qq.com> Date: Mon, 7 Oct 2024 06:29:20 +0800 Subject: [PATCH 2854/3019] =?UTF-8?q?perf=EF=BC=9A=E5=B0=81=E8=A3=85?= =?UTF-8?q?=E6=88=90=E7=B1=BB=EF=BC=8C=E7=90=86=E8=A7=A3=E8=B5=B7=E6=9D=A5?= =?UTF-8?q?=E6=9B=B4=E5=AE=B9=E6=98=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\344\275\231\350\277\236\346\216\245II.md" | 168 ++++++++++-------- 1 file changed, 97 insertions(+), 71 deletions(-) diff --git "a/problems/kamacoder/0109.\345\206\227\344\275\231\350\277\236\346\216\245II.md" "b/problems/kamacoder/0109.\345\206\227\344\275\231\350\277\236\346\216\245II.md" index 2bd4eac6e2..56959d8784 100644 --- "a/problems/kamacoder/0109.\345\206\227\344\275\231\350\277\236\346\216\245II.md" +++ "b/problems/kamacoder/0109.\345\206\227\344\275\231\350\277\236\346\216\245II.md" @@ -250,105 +250,131 @@ int main() { ## 其他语言版本 ### Java -```java -import java.util.ArrayList; -import java.util.List; -import java.util.Scanner; +```java +import java.util.*; + +/* + * 冗余连接II。主要问题是存在入度为2或者成环,也可能两个问题同时存在。 + * 1.判断入度为2的边 + * 2.判断是否成环(并查集) + */ + public class Main { - static int n; - static int[] father = new int[1001]; // 并查集数组 + /** + * 并查集模板 + */ + static class Disjoint { + + private final int[] father; - // 并查集初始化 - public static void init() { - for (int i = 1; i <= n; ++i) { - father[i] = i; + public Disjoint(int n) { + father = new int[n]; + for (int i = 0; i < n; i++) { + father[i] = i; + } + } + + public void join(int n, int m) { + n = find(n); + m = find(m); + if (n == m) return; + father[n] = m; + } + + public int find(int n) { + return father[n] == n ? n : (father[n] = find(father[n])); } - } - // 并查集里寻根的过程 - public static int find(int u) { - if (u == father[u]) return u; - return father[u] = find(father[u]); // 路径压缩 + public boolean isSame(int n, int m) { + return find(n) == find(m); + } } - // 将 v->u 这条边加入并查集 - public static void join(int u, int v) { - u = find(u); - v = find(v); - if (u != v) { - father[v] = u; // 合并两棵树 + static class Edge { + int s; + int t; + + public Edge(int s, int t) { + this.s = s; + this.t = t; } } - // 判断 u 和 v 是否有同一个根 - public static boolean same(int u, int v) { - return find(u) == find(v); + static class Node { + int id; + int in; + int out; } - // 在有向图里找到删除的那条边,使其变成树 - public static void getRemoveEdge(List edges) { - init(); // 初始化并查集 - for (int i = 0; i < n; i++) { // 遍历所有的边 - if (same(edges.get(i)[0], edges.get(i)[1])) { // 如果构成有向环了,就是要删除的边 - System.out.println(edges.get(i)[0] + " " + edges.get(i)[1]); - return; + public static void main(String[] args) { + Scanner scanner = new Scanner(System.in); + int n = scanner.nextInt(); + List edges = new ArrayList<>(); + Node[] nodeMap = new Node[n + 1]; + for (int i = 1; i <= n; i++) { + nodeMap[i] = new Node(); + } + Integer doubleIn = null; + for (int i = 0; i < n; i++) { + int s = scanner.nextInt(); + int t = scanner.nextInt(); + //记录入度 + nodeMap[t].in++; + if (!(nodeMap[t].in < 2)) doubleIn = t; + Edge edge = new Edge(s, t); + edges.add(edge); + } + Edge result = null; + //存在入度为2的节点,既要消除入度为2的问题同时解除可能存在的环 + if (doubleIn != null) { + List doubleInEdges = new ArrayList<>(); + for (Edge edge : edges) { + if (edge.t == doubleIn) doubleInEdges.add(edge); + if (doubleInEdges.size() == 2) break; + } + Edge edge = doubleInEdges.get(1); + if (isTreeWithExclude(edges, edge, nodeMap)) { + result = edge; } else { - join(edges.get(i)[0], edges.get(i)[1]); + result = doubleInEdges.get(0); } + } else { + //不存在入度为2的节点,则只需要解除环即可 + result = getRemoveEdge(edges, nodeMap); } + + System.out.println(result.s + " " + result.t); } - // 删一条边之后判断是不是树 - public static boolean isTreeAfterRemoveEdge(List edges, int deleteEdge) { - init(); // 初始化并查集 - for (int i = 0; i < n; i++) { - if (i == deleteEdge) continue; - if (same(edges.get(i)[0], edges.get(i)[1])) { // 如果构成有向环了,一定不是树 + public static boolean isTreeWithExclude(List edges, Edge exculdEdge, Node[] nodeMap) { + Disjoint disjoint = new Disjoint(nodeMap.length + 1); + for (Edge edge : edges) { + if (edge == exculdEdge) continue; + //成环则不是树 + if (disjoint.isSame(edge.s, edge.t)) { return false; } - join(edges.get(i)[0], edges.get(i)[1]); + disjoint.join(edge.s, edge.t); } return true; } - public static void main(String[] args) { - Scanner sc = new Scanner(System.in); - List edges = new ArrayList<>(); // 存储所有的边 - - n = sc.nextInt(); // 顶点数 - int[] inDegree = new int[n + 1]; // 记录每个节点的入度 - for (int i = 0; i < n; i++) { - int s = sc.nextInt(); // 边的起点 - int t = sc.nextInt(); // 边的终点 - inDegree[t]++; - edges.add(new int[]{s, t}); // 将边加入列表 - } - - List vec = new ArrayList<>(); // 记录入度为2的边(如果有的话就两条边) - // 找入度为2的节点所对应的边,注意要倒序,因为优先删除最后出现的一条边 - for (int i = n - 1; i >= 0; i--) { - if (inDegree[edges.get(i)[1]] == 2) { - vec.add(i); - } - } + public static Edge getRemoveEdge(List edges, Node[] nodeMap) { + int length = nodeMap.length; + Disjoint disjoint = new Disjoint(length); - // 情况一、情况二 - if (vec.size() > 0) { - // vec里的边已经按照倒叙放的,所以优先删 vec.get(0) 这条边 - if (isTreeAfterRemoveEdge(edges, vec.get(0))) { - System.out.println(edges.get(vec.get(0))[0] + " " + edges.get(vec.get(0))[1]); - } else { - System.out.println(edges.get(vec.get(1))[0] + " " + edges.get(vec.get(1))[1]); - } - return; + for (Edge edge : edges) { + if (disjoint.isSame(edge.s, edge.t)) return edge; + disjoint.join(edge.s, edge.t); } - - // 处理情况三:明确没有入度为2的情况,一定有有向环,找到构成环的边返回即可 - getRemoveEdge(edges); + return null; } + } + ``` + ### Python ```python From 8669f2ad20f3c7f550557584fa57b4622e5862e7 Mon Sep 17 00:00:00 2001 From: Leehouc <152672308+Leehouc@users.noreply.github.com> Date: Mon, 7 Oct 2024 13:19:27 +0800 Subject: [PATCH 2855/3019] =?UTF-8?q?=E4=BF=AE=E6=94=B90459.=E9=87=8D?= =?UTF-8?q?=E5=A4=8D=E7=9A=84=E5=AD=90=E5=AD=97=E7=AC=A6=E4=B8=B2.md?= =?UTF-8?q?=E9=94=99=E5=88=AB=E5=AD=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 打码->代码 --- ...\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" "b/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" index dbf32e6482..5c86e122bb 100644 --- "a/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" @@ -312,7 +312,7 @@ next 数组记录的就是最长相同前后缀( [字符串:KMP算法精讲] 4可以被 12(字符串的长度) 整除,所以说明有重复的子字符串(asdf)。 -### 打码实现 +### 代码实现 C++代码如下:(这里使用了前缀表统一减一的实现方式) From fdae38cf7e575cc01f3db7807ca48b942dcf2cd2 Mon Sep 17 00:00:00 2001 From: markwang Date: Tue, 8 Oct 2024 15:16:23 +0800 Subject: [PATCH 2856/3019] =?UTF-8?q?337.=E6=89=93=E5=AE=B6=E5=8A=AB?= =?UTF-8?q?=E8=88=8DIII=E5=A2=9E=E5=8A=A0Go=E9=80=92=E5=BD=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 --- ...345\256\266\345\212\253\350\210\215III.md" | 84 +++++++++++++++++++ 1 file changed, 84 insertions(+) diff --git "a/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" "b/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" index 7aae5cbf2a..12e31ababd 100644 --- "a/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" +++ "b/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" @@ -388,6 +388,90 @@ class Solution: ### Go +暴力递归 + +```go +/** + * Definition for a binary tree node. + * type TreeNode struct { + * Val int + * Left *TreeNode + * Right *TreeNode + * } + */ +func rob(root *TreeNode) int { + if root == nil { + return 0 + } + if root.Left == nil && root.Right == nil { + return root.Val + } + // 偷父节点 + val1 := root.Val + if root.Left != nil { + val1 += rob(root.Left.Left) + rob(root.Left.Right) // 跳过root->left,相当于不考虑左孩子了 + } + if root.Right != nil { + val1 += rob(root.Right.Left) + rob(root.Right.Right) // 跳过root->right,相当于不考虑右孩子了 + } + // 不偷父节点 + val2 := rob(root.Left) + rob(root.Right) // 考虑root的左右孩子 + return max(val1, val2) +} + +func max(x, y int) int { + if x > y { + return x + } + return y +} +``` + +记忆化递推 + +```go +/** + * Definition for a binary tree node. + * type TreeNode struct { + * Val int + * Left *TreeNode + * Right *TreeNode + * } + */ +var umap = make(map[*TreeNode]int) + +func rob(root *TreeNode) int { + if root == nil { + return 0 + } + if root.Left == nil && root.Right == nil { + return root.Val + } + if val, ok := umap[root]; ok { + return val // 如果umap里已经有记录则直接返回 + } + // 偷父节点 + val1 := root.Val + if root.Left != nil { + val1 += rob(root.Left.Left) + rob(root.Left.Right) // 跳过root->left,相当于不考虑左孩子了 + } + if root.Right != nil { + val1 += rob(root.Right.Left) + rob(root.Right.Right) // 跳过root->right,相当于不考虑右孩子了 + } + // 不偷父节点 + val2 := rob(root.Left) + rob(root.Right) // 考虑root的左右孩子 + umap[root] = max(val1, val2) // umap记录一下结果 + return max(val1, val2) +} + +func max(x, y int) int { + if x > y { + return x + } + return y +} +``` + 动态规划 ```go From d33c76e74aa90b8ba319af04b0c7f731f6bfabca Mon Sep 17 00:00:00 2001 From: 01geek Date: Wed, 9 Oct 2024 16:28:31 +0800 Subject: [PATCH 2857/3019] =?UTF-8?q?=E7=BA=A0=E6=AD=A3=20problems/1047.?= =?UTF-8?q?=E5=88=A0=E9=99=A4=E5=AD=97=E7=AC=A6=E4=B8=B2=E4=B8=AD=E7=9A=84?= =?UTF-8?q?=E6=89=80=E6=9C=89=E7=9B=B8=E9=82=BB=E9=87=8D=E5=A4=8D=E9=A1=B9?= =?UTF-8?q?.md=20=E4=B8=ADjava=E7=89=88=E6=9C=AC=E7=9B=B8=E5=85=B3?= =?UTF-8?q?=E6=B3=A8=E9=87=8A=EF=BC=9A=E5=B0=86top>0=E7=BA=A0=E6=AD=A3?= =?UTF-8?q?=E4=B8=BAtop>=3D0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" "b/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" index 7232008a2c..51ec4e62c6 100644 --- "a/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" +++ "b/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" @@ -164,7 +164,7 @@ class Solution { int top = -1; for (int i = 0; i < s.length(); i++) { char c = s.charAt(i); - // 当 top > 0,即栈中有字符时,当前字符如果和栈中字符相等,弹出栈顶字符,同时 top-- + // 当 top >= 0,即栈中有字符时,当前字符如果和栈中字符相等,弹出栈顶字符,同时 top-- if (top >= 0 && res.charAt(top) == c) { res.deleteCharAt(top); top--; From ba2062471b0a041b748bb543d58514ceb849b21f Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Wed, 9 Oct 2024 16:58:09 +0800 Subject: [PATCH 2858/3019] Update --- ...20\345\255\227\347\254\246\344\270\262.md" | 22 +++++++-------- ...\351\222\261\345\205\221\346\215\242II.md" | 28 ++++++++++++++++--- 2 files changed, 35 insertions(+), 15 deletions(-) diff --git "a/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" "b/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" index 254d921dbd..bee1c1022c 100644 --- "a/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" @@ -64,7 +64,7 @@ 如果有一个字符串s,在 s + s 拼接后, 不算首尾字符,如果能凑成s字符串,说明s 一定是重复子串组成。 -如图,字符串s,图中数字为数组下标,在 s + s 拼接后, 不算首尾字符,中间凑成s字符串。 +如图,字符串s,图中数字为数组下标,在 s + s 拼接后, 不算首尾字符,中间凑成s字符串。 (图中数字为数组下标) ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240910115555.png) @@ -163,9 +163,7 @@ KMP算法中next数组为什么遇到字符不匹配的时候可以找到上一 如果一个字符串s是由重复子串组成,那么 最长相等前后缀不包含的子串一定是字符串s的最小重复子串。 -证明: 如果s 是有是有最小重复子串p组成。 - -即 s = n * p +如果s 是由最小重复子串p组成,即 s = n * p 那么相同前后缀可以是这样: @@ -203,12 +201,14 @@ p2 = p1,p3 = p2 即: p1 = p2 = p3 最长相等前后缀不包含的子串已经是字符串s的最小重复子串,那么字符串s一定由重复子串组成,这个不需要证明了。 -关键是要要证明:最长相等前后缀不包含的子串什么时候才是字符串s的最小重复子串呢。 +关键是要证明:最长相等前后缀不包含的子串什么时候才是字符串s的最小重复子串呢。 -情况一, 最长相等前后缀不包含的子串的长度 比 字符串s的一半的长度还大,那一定不是字符串s的重复子串 +情况一, 最长相等前后缀不包含的子串的长度 比 字符串s的一半的长度还大,那一定不是字符串s的重复子串,如图: ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240911110236.png) +图中:前后缀不包含的子串的长度 大于 字符串s的长度的 二分之一 + -------------- 情况二,最长相等前后缀不包含的子串的长度 可以被 字符串s的长度整除,如图: @@ -230,7 +230,7 @@ p2 = p1,p3 = p2 即: p1 = p2 = p3 即 s[0]s[1] 是最小重复子串 -以上推导中,录友可能想,你怎么知道 s[0] 和 s[1] 就不相同呢? s[0] 为什么就不能使最小重复子串。 +以上推导中,录友可能想,你怎么知道 s[0] 和 s[1] 就不相同呢? s[0] 为什么就不能是最小重复子串。 如果 s[0] 和 s[1] 也相同,同时 s[0]s[1]与s[2]s[3]相同,s[2]s[3] 与 s[4]s[5]相同,s[4]s[5] 与 s[6]s[7] 相同,那么这个字符串就是有一个字符构成的字符串。 @@ -246,7 +246,7 @@ p2 = p1,p3 = p2 即: p1 = p2 = p3 或者说,自己举个例子,`aaaaaa`,这个字符串,他的最长相等前后缀是什么? -同上以上推导,最长相等前后缀不包含的子串的长度只要被 字符串s的长度整除,就是一定是最小重复子串。 +同上以上推导,最长相等前后缀不包含的子串的长度只要被 字符串s的长度整除,最长相等前后缀不包含的子串一定是最小重复子串。 ---------------- @@ -267,7 +267,7 @@ p2 = p1,p3 = p2 即: p1 = p2 = p3 以上推导,可以得出 s[0],s[1],s[2] 与 s[3],s[4],s[5] 相同,s[3]s[4] 与 s[6]s[7]相同。 -那么 最长相等前后缀不包含的子串的长度 不被 字符串s的长度整除 ,就不是s的重复子串 +那么 最长相等前后缀不包含的子串的长度 不被 字符串s的长度整除 ,最长相等前后缀不包含的子串就不是s的重复子串 ----------- @@ -277,7 +277,7 @@ p2 = p1,p3 = p2 即: p1 = p2 = p3 在必要条件,这个是 显而易见的,都已经假设 最长相等前后缀不包含的子串 是 s的最小重复子串了,那s必然是重复子串。 -关键是需要证明, 字符串s的最长相等前后缀不包含的子串 什么时候才是 s最小重复子串。 +**关键是需要证明, 字符串s的最长相等前后缀不包含的子串 什么时候才是 s最小重复子串**。 同上我们证明了,当 最长相等前后缀不包含的子串的长度 可以被 字符串s的长度整除,那么不包含的子串 就是s的最小重复子串。 @@ -312,7 +312,7 @@ next 数组记录的就是最长相同前后缀( [字符串:KMP算法精讲] 4可以被 12(字符串的长度) 整除,所以说明有重复的子字符串(asdf)。 -### 打码实现 +### 代码实现 C++代码如下:(这里使用了前缀表统一减一的实现方式) diff --git "a/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" "b/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" index 255912d62b..360da5826b 100644 --- "a/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" +++ "b/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" @@ -168,23 +168,43 @@ for (int j = 0; j <= amount; j++) { // 遍历背包容量 class Solution { public: int change(int amount, vector& coins) { - vector dp(amount + 1, 0); - dp[0] = 1; + vector dp(amount + 1, 0); // 防止相加数据超int + dp[0] = 1; // 只有一种方式达到0 for (int i = 0; i < coins.size(); i++) { // 遍历物品 for (int j = coins[i]; j <= amount; j++) { // 遍历背包 dp[j] += dp[j - coins[i]]; } } - return dp[amount]; + return dp[amount]; // 返回组合数 } }; ``` +C++测试用例有两个数相加超过int的数据,所以需要在if里加上dp[i] < INT_MAX - dp[i - num]。 + * 时间复杂度: O(mn),其中 m 是amount,n 是 coins 的长度 * 空间复杂度: O(m) +为了防止相加的数据 超int 也可以这么写: + +```CPP +class Solution { +public: + int change(int amount, vector& coins) { + vector dp(amount + 1, 0); + dp[0] = 1; // 只有一种方式达到0 + for (int i = 0; i < coins.size(); i++) { // 遍历物品 + for (int j = coins[i]; j <= amount; j++) { // 遍历背包 + if (dp[j] < INT_MAX - dp[j - coins[i]]) { //防止相加数据超int + dp[j] += dp[j - coins[i]]; + } + } + } + return dp[amount]; // 返回组合数 + } +}; +``` -是不是发现代码如此精简 ## 总结 From 8f692f8ff4545337e9df4790fa2cdb7f9a07c219 Mon Sep 17 00:00:00 2001 From: 01geek Date: Wed, 9 Oct 2024 17:36:56 +0800 Subject: [PATCH 2859/3019] =?UTF-8?q?=E7=BA=A0=E6=AD=A3=200150.=E9=80=86?= =?UTF-8?q?=E6=B3=A2=E5=85=B0=E8=A1=A8=E8=BE=BE=E5=BC=8F=E6=B1=82=E5=80=BC?= =?UTF-8?q?.md=20=E7=9A=84c++=E4=BB=A3=E7=A0=81=EF=BC=8C=E5=B0=86=E7=AC=AC?= =?UTF-8?q?21=E8=A1=8C=E4=BB=A3=E7=A0=81=E7=9A=84int=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E4=B8=BAlong=20long=EF=BC=8C=E5=8E=9F=E5=9B=A0=EF=BC=9A?= =?UTF-8?q?=E6=97=A2=E7=84=B6=E5=89=8D=E9=9D=A2=E8=80=83=E8=99=91=E5=88=B0?= =?UTF-8?q?=E5=8F=AF=E8=83=BD=E6=95=B0=E6=8D=AE=E5=80=BC=E5=A4=A7=E8=80=8C?= =?UTF-8?q?=E5=B0=86int=E6=94=B9=E4=B8=BA=E4=BA=86long=20long=EF=BC=8C?= =?UTF-8?q?=E9=82=A3=E4=B9=88=E6=9C=80=E5=90=8E=E7=9A=84RPN=E8=BF=90?= =?UTF-8?q?=E7=AE=97=E7=BB=93=E6=9E=9C=E4=B9=9F=E5=8F=AF=E8=83=BD=E8=B6=85?= =?UTF-8?q?=E8=BF=87int=E8=83=BD=E8=A1=A8=E7=A4=BA=E7=9A=84=E8=8C=83?= =?UTF-8?q?=E5=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" "b/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" index 48e99c5baa..7d4031d7da 100644 --- "a/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" +++ "b/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" @@ -108,7 +108,7 @@ public: } } - int result = st.top(); + long long result = st.top(); st.pop(); // 把栈里最后一个元素弹出(其实不弹出也没事) return result; } From baf7ed122b1cb78b89565b83b343a4f3c5f5ec82 Mon Sep 17 00:00:00 2001 From: "junjie2.luo" Date: Thu, 10 Oct 2024 17:18:04 +0800 Subject: [PATCH 2860/3019] =?UTF-8?q?feat:=201207.=E7=8B=AC=E4=B8=80?= =?UTF-8?q?=E6=97=A0=E4=BA=8C=E7=9A=84=E5=87=BA=E7=8E=B0=E6=AC=A1=E6=95=B0?= =?UTF-8?q?,=E6=96=B0=E5=A2=9Erust=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...72\347\216\260\346\254\241\346\225\260.md" | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git "a/problems/1207.\347\213\254\344\270\200\346\227\240\344\272\214\347\232\204\345\207\272\347\216\260\346\254\241\346\225\260.md" "b/problems/1207.\347\213\254\344\270\200\346\227\240\344\272\214\347\232\204\345\207\272\347\216\260\346\254\241\346\225\260.md" index cd89522e4e..781badf549 100644 --- "a/problems/1207.\347\213\254\344\270\200\346\227\240\344\272\214\347\232\204\345\207\272\347\216\260\346\254\241\346\225\260.md" +++ "b/problems/1207.\347\213\254\344\270\200\346\227\240\344\272\214\347\232\204\345\207\272\347\216\260\346\254\241\346\225\260.md" @@ -221,6 +221,28 @@ func uniqueOccurrences(arr []int) bool { } ``` +### Rust + +```rust +use std::collections::{HashMap, HashSet}; +impl Solution { + pub fn unique_occurrences(arr: Vec) -> bool { + let mut hash = HashMap::::new(); + for x in arr { + *hash.entry(x).or_insert(0) += 1; + } + let mut set = HashSet::::new(); + for (_k, v) in hash { + if set.contains(&v) { + return false + } else { + set.insert(v); + } + } + true + } +} +``` From e43323b1e1f3556dc7bc38b4ae6bdd13508e0aea Mon Sep 17 00:00:00 2001 From: "junjie2.luo" Date: Thu, 10 Oct 2024 17:18:41 +0800 Subject: [PATCH 2861/3019] =?UTF-8?q?feat:=201365.=E6=9C=89=E5=A4=9A?= =?UTF-8?q?=E5=B0=91=E5=B0=8F=E4=BA=8E=E5=BD=93=E5=89=8D=E6=95=B0=E5=AD=97?= =?UTF-8?q?=E7=9A=84=E6=95=B0=E5=AD=97,=E6=96=B0=E5=A2=9Erust=E8=A7=A3?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...5\227\347\232\204\346\225\260\345\255\227.md" | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git "a/problems/1365.\346\234\211\345\244\232\345\260\221\345\260\217\344\272\216\345\275\223\345\211\215\346\225\260\345\255\227\347\232\204\346\225\260\345\255\227.md" "b/problems/1365.\346\234\211\345\244\232\345\260\221\345\260\217\344\272\216\345\275\223\345\211\215\346\225\260\345\255\227\347\232\204\346\225\260\345\255\227.md" index 94c1eb77c9..64f610968b 100644 --- "a/problems/1365.\346\234\211\345\244\232\345\260\221\345\260\217\344\272\216\345\275\223\345\211\215\346\225\260\345\255\227\347\232\204\346\225\260\345\255\227.md" +++ "b/problems/1365.\346\234\211\345\244\232\345\260\221\345\260\217\344\272\216\345\275\223\345\211\215\346\225\260\345\255\227\347\232\204\346\225\260\345\255\227.md" @@ -260,6 +260,22 @@ function smallerNumbersThanCurrent(nums: number[]): number[] { }; ``` +### rust +```rust +use std::collections::HashMap; +impl Solution { + pub fn smaller_numbers_than_current(nums: Vec) -> Vec { + let mut v = nums.clone(); + v.sort(); + let mut hash = HashMap::new(); + for i in 0..v.len() { + // rust中使用or_insert插入值, 如果存在就不插入,可以使用正序遍历 + hash.entry(v[i]).or_insert(i as i32); + } + nums.into_iter().map(|x| *hash.get(&x).unwrap()).collect() + } +} +```

From 30685b815cc8787fd84d760045a4e26456a51ef7 Mon Sep 17 00:00:00 2001 From: "junjie2.luo" Date: Thu, 10 Oct 2024 17:19:43 +0800 Subject: [PATCH 2862/3019] =?UTF-8?q?feat:=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,=E6=96=B0?= =?UTF-8?q?=E5=A2=9Erust=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\261\350\204\211\346\225\260\347\273\204.md" | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git "a/problems/0941.\346\234\211\346\225\210\347\232\204\345\261\261\350\204\211\346\225\260\347\273\204.md" "b/problems/0941.\346\234\211\346\225\210\347\232\204\345\261\261\350\204\211\346\225\260\347\273\204.md" index 9f63f441c2..77167df041 100644 --- "a/problems/0941.\346\234\211\346\225\210\347\232\204\345\261\261\350\204\211\346\225\260\347\273\204.md" +++ "b/problems/0941.\346\234\211\346\225\210\347\232\204\345\261\261\350\204\211\346\225\260\347\273\204.md" @@ -196,7 +196,22 @@ public class Solution { } ``` - +### Rust +```rust +impl Solution { + pub fn valid_mountain_array(arr: Vec) -> bool { + let mut i = 0; + let mut j = arr.len() - 1; + while i < arr.len() - 1 && arr[i] < arr[i + 1] { + i += 1; + } + while j > 0 && arr[j] < arr[j - 1] { + j -= 1; + } + i > 0 && j < arr.len() - 1 && i == j + } +} +```

From 83de8ac2a1e3f6203f25e5b792acb22bc187676d Mon Sep 17 00:00:00 2001 From: "junjie2.luo" Date: Thu, 10 Oct 2024 17:25:53 +0800 Subject: [PATCH 2863/3019] =?UTF-8?q?feat:=200283.=E7=A7=BB=E5=8A=A8?= =?UTF-8?q?=E9=9B=B6,=E6=96=B0=E5=A2=9Erust=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0283.\347\247\273\345\212\250\351\233\266.md" | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git "a/problems/0283.\347\247\273\345\212\250\351\233\266.md" "b/problems/0283.\347\247\273\345\212\250\351\233\266.md" index 4d8fd9a155..cbce029576 100644 --- "a/problems/0283.\347\247\273\345\212\250\351\233\266.md" +++ "b/problems/0283.\347\247\273\345\212\250\351\233\266.md" @@ -169,7 +169,20 @@ void moveZeroes(int* nums, int numsSize){ } ``` - +### Rust +```rust +impl Solution { + pub fn move_zeroes(nums: &mut Vec) { + let mut slow = 0; + for fast in 0..nums.len() { + if nums[fast] != 0 { + nums.swap(slow, fast); + slow += 1; + } + } + } +} +``` From 90255b837ceb114caefd6a5e57eddadf2e0ace61 Mon Sep 17 00:00:00 2001 From: "junjie2.luo" Date: Thu, 10 Oct 2024 17:31:49 +0800 Subject: [PATCH 2864/3019] =?UTF-8?q?feat:=200189.=E6=97=8B=E8=BD=AC?= =?UTF-8?q?=E6=95=B0=E7=BB=84,=E6=96=B0=E5=A2=9Erust=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...6\227\213\350\275\254\346\225\260\347\273\204.md" | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git "a/problems/0189.\346\227\213\350\275\254\346\225\260\347\273\204.md" "b/problems/0189.\346\227\213\350\275\254\346\225\260\347\273\204.md" index b47ee4b91f..e91109c692 100644 --- "a/problems/0189.\346\227\213\350\275\254\346\225\260\347\273\204.md" +++ "b/problems/0189.\346\227\213\350\275\254\346\225\260\347\273\204.md" @@ -199,7 +199,17 @@ function reverseByRange(nums: number[], left: number, right: number): void { } ``` - +### Rust +```rust +impl Solution { + pub fn rotate(nums: &mut Vec, k: i32) { + let k = k as usize % nums.len(); + nums.reverse(); + nums[..k].reverse(); + nums[k..].reverse(); + } +} +```

From a45758ef5f629807e248ea87407611bcbf42ed88 Mon Sep 17 00:00:00 2001 From: iYaovo <2293257241@qq.com> Date: Fri, 11 Oct 2024 10:13:18 +0800 Subject: [PATCH 2865/3019] =?UTF-8?q?docs:=E8=A1=A5=E5=85=850046Java?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E7=9A=84return=E8=AF=AD=E5=8F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "problems/0046.\345\205\250\346\216\222\345\210\227.md" | 2 ++ 1 file changed, 2 insertions(+) diff --git "a/problems/0046.\345\205\250\346\216\222\345\210\227.md" "b/problems/0046.\345\205\250\346\216\222\345\210\227.md" index 1ef80a142d..ab7af3ba6a 100644 --- "a/problems/0046.\345\205\250\346\216\222\345\210\227.md" +++ "b/problems/0046.\345\205\250\346\216\222\345\210\227.md" @@ -201,6 +201,7 @@ class Solution { public void backtrack(int[] nums, LinkedList path) { if (path.size() == nums.length) { result.add(new ArrayList<>(path)); + return; } for (int i =0; i < nums.length; i++) { // 如果path中已有,则跳过 @@ -524,3 +525,4 @@ public class Solution + From 55239579183ffebf29c7cfae52c626b996676061 Mon Sep 17 00:00:00 2001 From: markwang Date: Sat, 12 Oct 2024 10:10:05 +0800 Subject: [PATCH 2866/3019] =?UTF-8?q?122.=E4=B9=B0=E5=8D=96=E8=82=A1?= =?UTF-8?q?=E7=A5=A8=E7=9A=84=E6=9C=80=E4=BD=B3=E6=97=B6=E6=9C=BAII?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0Go=E5=8A=A8=E6=80=81=E8=A7=84=E5=88=92?= =?UTF-8?q?=E6=BB=9A=E5=8A=A8=E6=95=B0=E7=BB=84=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...01\350\247\204\345\210\222\357\274\211.md" | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" index f0dff50506..0dced9efd4 100644 --- "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" +++ "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" @@ -251,6 +251,27 @@ func max(a, b int) int { } ``` +```go +// 动态规划 版本二 滚动数组 +func maxProfit(prices []int) int { + dp := [2][2]int{} // 注意这里只开辟了一个2 * 2大小的二维数组 + dp[0][0] = -prices[0] + dp[0][1] = 0 + for i := 1; i < len(prices); i++ { + dp[i%2][0] = max(dp[(i-1)%2][0], dp[(i - 1) % 2][1] - prices[i]) + dp[i%2][1] = max(dp[(i-1)%2][1], dp[(i-1)%2][0] + prices[i]) + } + return dp[(len(prices)-1)%2][1] +} + +func max(x, y int) int { + if x > y { + return x + } + return y +} +``` + ### JavaScript: ```javascript From 19a6a4e369277cd192f6b149b008ce2d0cba23a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lane=20Zhang=20=28=E5=BC=A0=E5=81=A5=29?= Date: Mon, 14 Oct 2024 10:00:24 +0800 Subject: [PATCH 2867/3019] =?UTF-8?q?Update=200202.=E5=BF=AB=E4=B9=90?= =?UTF-8?q?=E6=95=B0.md=20=E5=A2=9E=E5=8A=A0=20Ruby=20=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...2.\345\277\253\344\271\220\346\225\260.md" | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git "a/problems/0202.\345\277\253\344\271\220\346\225\260.md" "b/problems/0202.\345\277\253\344\271\220\346\225\260.md" index 409a7471d4..39cb39fa31 100644 --- "a/problems/0202.\345\277\253\344\271\220\346\225\260.md" +++ "b/problems/0202.\345\277\253\344\271\220\346\225\260.md" @@ -534,6 +534,30 @@ public class Solution { } ``` +### Ruby: + +```ruby +# @param {Integer} n +# @return {Boolean} +def is_happy(n) + @occurred_nums = Set.new + + while true + n = next_value(n) + + return true if n == 1 + + return false if @occurred_nums.include?(n) + + @occurred_nums << n + end +end + +def next_value(n) + n.to_s.chars.sum { |char| char.to_i ** 2 } +end +``` +

From c6b12f2b18eb3df0606b39c386e5e441394e81b0 Mon Sep 17 00:00:00 2001 From: markwang Date: Mon, 14 Oct 2024 10:10:19 +0800 Subject: [PATCH 2868/3019] =?UTF-8?q?123.=E4=B9=B0=E5=8D=96=E8=82=A1?= =?UTF-8?q?=E7=A5=A8=E7=9A=84=E6=9C=80=E4=BD=B3=E6=97=B6=E6=9C=BAIII?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0Go=E7=89=88=E6=9C=AC=E4=BA=8C=E5=92=8C?= =?UTF-8?q?=E7=89=88=E6=9C=AC=E4=B8=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...344\275\263\346\227\266\346\234\272III.md" | 53 +++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git "a/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" "b/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" index d06b4f8022..8e224a898d 100644 --- "a/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" +++ "b/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" @@ -317,6 +317,7 @@ class Solution: ### Go: ```go +// 版本一 func maxProfit(prices []int) int { dp := make([][]int, len(prices)) for i := 0; i < len(prices); i++ { @@ -344,6 +345,58 @@ func max(a, b int) int { } ``` +```go +// 版本二 +func maxProfit(prices []int) int { + if len(prices) == 0 { + return 0 + } + dp := make([]int, 5) + dp[1] = -prices[0] + dp[3] = -prices[0] + for i := 1; i < len(prices); i++ { + dp[1] = max(dp[1], dp[0] - prices[i]) + dp[2] = max(dp[2], dp[1] + prices[i]) + dp[3] = max(dp[3], dp[2] - prices[i]) + dp[4] = max(dp[4], dp[3] + prices[i]) + } + return dp[4] +} + +func max(x, y int) int { + if x > y { + return x + } + return y +} +``` + +```go +// 版本三 +func maxProfit(prices []int) int { + if len(prices) == 0 { + return 0 + } + dp := make([][5]int, len(prices)) + dp[0][1] = -prices[0] + dp[0][3] = -prices[0] + for i := 1; i < len(prices); i++ { + dp[i][1] = max(dp[i-1][1], 0 - prices[i]) + dp[i][2] = max(dp[i-1][2], dp[i-1][1] + prices[i]) + dp[i][3] = max(dp[i-1][3], dp[i-1][2] - prices[i]) + dp[i][4] = max(dp[i-1][4], dp[i-1][3] + prices[i]) + } + return dp[len(prices)-1][4] +} + +func max(x, y int) int { + if x > y { + return x + } + return y +} +``` + ### JavaScript: > 版本一: From 0be8c49ba72d9e3e6ccdc4b76949a07ae128b7d5 Mon Sep 17 00:00:00 2001 From: markwang Date: Tue, 15 Oct 2024 09:49:57 +0800 Subject: [PATCH 2869/3019] =?UTF-8?q?0714.=E4=B9=B0=E5=8D=96=E8=82=A1?= =?UTF-8?q?=E7=A5=A8=E7=9A=84=E6=9C=80=E4=BD=B3=E6=97=B6=E6=9C=BA=E5=90=AB?= =?UTF-8?q?=E6=89=8B=E7=BB=AD=E8=B4=B9=E6=96=87=E5=AD=97=E5=8B=98=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...34\272\345\220\253\346\211\213\347\273\255\350\264\271.md" | 4 ++-- ...12\250\346\200\201\350\247\204\345\210\222\357\274\211.md" | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git "a/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271.md" "b/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271.md" index 88b03d9d76..8a2d976b60 100644 --- "a/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271.md" +++ "b/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271.md" @@ -43,7 +43,7 @@ 在[贪心算法:122.买卖股票的最佳时机II](https://programmercarl.com/0122.买卖股票的最佳时机II.html)中使用贪心策略不用关心具体什么时候买卖,只要收集每天的正利润,最后稳稳的就是最大利润了。 -而本题有了手续费,就要关系什么时候买卖了,因为计算所获得利润,需要考虑买卖利润可能不足以手续费的情况。 +而本题有了手续费,就要关心什么时候买卖了,因为计算所获得利润,需要考虑买卖利润可能不足以扣减手续费的情况。 如果使用贪心策略,就是最低值买,最高值(如果算上手续费还盈利)就卖。 @@ -122,7 +122,7 @@ public: * 时间复杂度:O(n) * 空间复杂度:O(n) -当然可以对空间经行优化,因为当前状态只是依赖前一个状态。 +当然可以对空间进行优化,因为当前状态只是依赖前一个状态。 C++ 代码如下: diff --git "a/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" "b/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" index b0e8b141f5..86e3e88f2b 100644 --- "a/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" +++ "b/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" @@ -46,7 +46,7 @@ * 时间复杂度:O(n) * 空间复杂度:O(1) -本题使用贪心算法并不好理解,也很容易出错,那么我们再来看看是使用动规的方法如何解题。 +本题使用贪心算法并不好理解,也很容易出错,那么我们再来看看使用动规的方法如何解题。 相对于[动态规划:122.买卖股票的最佳时机II](https://programmercarl.com/0122.买卖股票的最佳时机II(动态规划).html),本题只需要在计算卖出操作的时候减去手续费就可以了,代码几乎是一样的。 @@ -54,7 +54,7 @@ 这里重申一下dp数组的含义: -dp[i][0] 表示第i天持有股票所省最多现金。 +dp[i][0] 表示第i天持有股票所得最多现金。 dp[i][1] 表示第i天不持有股票所得最多现金 From abd3593c67a551bbe01136a42defabf219bb55be Mon Sep 17 00:00:00 2001 From: Lane Zhang Date: Tue, 15 Oct 2024 13:30:09 +0800 Subject: [PATCH 2870/3019] =?UTF-8?q?0454.=E5=9B=9B=E6=95=B0=E7=9B=B8?= =?UTF-8?q?=E5=8A=A0II.html=20=E5=A2=9E=E5=8A=A0Ruby=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\346\225\260\347\233\270\345\212\240II.md" | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git "a/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" "b/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" index 6231c22b2f..af19f5f7d8 100644 --- "a/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" +++ "b/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" @@ -488,6 +488,44 @@ int fourSumCount(int* nums1, int nums1Size, int* nums2, int nums2Size, int* nums } ``` +### Ruby: + +```ruby +# @param {Integer[]} nums1 +# @param {Integer[]} nums2 +# @param {Integer[]} nums3 +# @param {Integer[]} nums4 +# @return {Integer} +# 新思路:和版主的思路基本相同,只是对后面两个数组的二重循环,用一个方法调用外加一重循环替代,简化了一点。 +# 简单的说,就是把四数和变成了两个两数和的统计(结果放到两个 hash 中),然后再来一次两数和为0. +# 把四个数分成两组两个数,然后分别计算每组可能的和情况,分别存入 hash 中,key 是 和,value 是 数量; +# 最后,得到的两个 hash 只需要遍历一次,符合和为零的 value 相乘并加总。 +def four_sum_count(nums1, nums2, nums3, nums4) + num_to_count_1 = two_sum_mapping(nums1, nums2) + num_to_count_2 = two_sum_mapping(nums3, nums4) + + count_sum = 0 + + num_to_count_1.each do |num, count| + count_sum += num_to_count_2[-num] * count # 反查另一个 hash,看有没有匹配的,没有的话,hash 默认值为 0,不影响加总;有匹配的,乘积就是可能的情况 + end + + count_sum +end + +def two_sum_mapping(nums1, nums2) + num_to_count = Hash.new(0) + + nums1.each do |num1| + nums2.each do |nums2| + num_to_count[num1 + nums2] += 1 # 统计和为 num1 + nums2 的有几个 + end + end + + num_to_count +end +``` +

From a4cafe0ce750c44f327a97a9811ff0b2d2c49979 Mon Sep 17 00:00:00 2001 From: Lane Zhang Date: Wed, 16 Oct 2024 11:25:49 +0800 Subject: [PATCH 2871/3019] =?UTF-8?q?0541.=E5=8F=8D=E8=BD=AC=E5=AD=97?= =?UTF-8?q?=E7=AC=A6=E4=B8=B2II.md=20=E5=A2=9E=E5=8A=A0Python=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E5=AE=9E=E7=8E=B03?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...254\345\255\227\347\254\246\344\270\262II.md" | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git "a/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" "b/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" index 5e75d3c3f8..c89b3a7b3e 100644 --- "a/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" +++ "b/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" @@ -282,7 +282,7 @@ class Solution: return ''.join(res) ``` -### Python3 (v2): +#### Python3 (v2): ```python class Solution: @@ -297,6 +297,20 @@ class Solution: return s ``` +#### Python3 (v3): +```python +class Solution: + def reverseStr(self, s: str, k: int) -> str: + i = 0 + chars = list(s) + + while i < len(chars): + chars[i:i + k] = chars[i:i + k][::-1] # 反转后,更改原值为反转后值 + i += k * 2 + + return ''.join(chars) +``` + ### Go: ```go From 27585bd4f8fc7b4f0599f231d4924641e1bf6deb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lane=20Zhang=20=28=E5=BC=A0=E5=81=A5=29?= Date: Wed, 16 Oct 2024 11:27:38 +0800 Subject: [PATCH 2872/3019] =?UTF-8?q?Update=200541.=E5=8F=8D=E8=BD=AC?= =?UTF-8?q?=E5=AD=97=E7=AC=A6=E4=B8=B2II.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" | 1 + 1 file changed, 1 insertion(+) diff --git "a/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" "b/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" index c89b3a7b3e..b3e7b02229 100644 --- "a/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" +++ "b/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" @@ -298,6 +298,7 @@ class Solution: ``` #### Python3 (v3): + ```python class Solution: def reverseStr(self, s: str, k: int) -> str: From cb50b956ebc89019b915ce92174126f82de10e1a Mon Sep 17 00:00:00 2001 From: ch4r1ty <81227726+ch4r1ty@users.noreply.github.com> Date: Wed, 16 Oct 2024 00:01:58 -0400 Subject: [PATCH 2873/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E4=BA=860027.?= =?UTF-8?q?=E7=A7=BB=E9=99=A4=E5=85=83=E7=B4=A0.md=EF=BC=8C=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E4=BA=86java=E6=9A=B4=E5=8A=9B=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...73\351\231\244\345\205\203\347\264\240.md" | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git "a/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" "b/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" index 480800e96b..10817ba6b7 100644 --- "a/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" +++ "b/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" @@ -131,7 +131,24 @@ public: ## 其他语言版本 ### Java: - +```java +class Solution { + public int removeElement(int[] nums, int val) { + // 暴力法 + int n = nums.length; + for (int i = 0; i < n; i++) { + if (nums[i] == val) { + for (int j = i + 1; j < n; j++) { + nums[j - 1] = nums[j]; + } + i--; + n--; + } + } + return n; + } +} +``` ```java class Solution { public int removeElement(int[] nums, int val) { From 7bbf3827d1b9aa3a18f4073533ac2934ecc4eab1 Mon Sep 17 00:00:00 2001 From: Lane Zhang Date: Wed, 16 Oct 2024 14:20:41 +0800 Subject: [PATCH 2874/3019] =?UTF-8?q?0151.=E7=BF=BB=E8=BD=AC=E5=AD=97?= =?UTF-8?q?=E7=AC=A6=E4=B8=B2=E9=87=8C=E7=9A=84=E5=8D=95=E8=AF=8D=20?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0Python=E7=89=88=E6=9C=AC=E5=AE=9E=E7=8E=B05?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...14\347\232\204\345\215\225\350\257\215.md" | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git "a/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" "b/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" index 9a0cbea466..7c0b7cb182 100644 --- "a/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" +++ "b/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" @@ -513,6 +513,29 @@ class Solution: return "".join(result) ``` + +(版本五) 遇到空格就说明前面的是一个单词,把它加入到一个数组中。 + +```python +class Solution: + def reverseWords(self, s: str) -> str: + words = [] + word = '' + s += ' ' # 帮助处理最后一个字词 + + for char in s: + if char == ' ': # 遇到空格就说明前面的可能是一个单词 + if word != '': # 确认是单词,把它加入到一个数组中 + words.append(word) + word = '' # 清空当前单词 + continue + + word += char # 收集单词的字母 + + words.reverse() + return ' '.join(words) +``` + ### Go: 版本一: From ee4c1c584cbe27ff27f4dbf0cdb858c38d574171 Mon Sep 17 00:00:00 2001 From: skyclouds2001 <95597335+skyclouds2001@users.noreply.github.com> Date: Thu, 17 Oct 2024 00:27:53 +0800 Subject: [PATCH 2875/3019] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E6=8B=BC=E5=86=99?= =?UTF-8?q?=EF=BC=9AJavascript->JavaScript&Typescript->TypeScript?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...344\270\244\346\225\260\344\271\213\345\222\214.md" | 2 +- ...346\225\210\347\232\204\346\213\254\345\217\267.md" | 2 +- ...344\270\255\347\232\204\350\212\202\347\202\271.md" | 2 +- .../0037.\350\247\243\346\225\260\347\213\254.md" | 2 +- ...0\267\263\350\267\203\346\270\270\346\210\217II.md" | 2 +- .../0046.\345\205\250\346\216\222\345\210\227.md" | 2 +- .../0047.\345\205\250\346\216\222\345\210\227II.md" | 2 +- "problems/0051.N\347\232\207\345\220\216.md" | 2 +- ...345\244\247\345\255\220\345\272\217\345\222\214.md" | 2 +- ...350\236\272\346\227\213\347\237\251\351\230\265.md" | 2 +- ...350\267\263\350\267\203\346\270\270\346\210\217.md" | 2 +- ...345\220\210\345\271\266\345\214\272\351\227\264.md" | 2 +- ...344\270\215\345\220\214\350\267\257\345\276\204.md" | 2 +- ...4\270\215\345\220\214\350\267\257\345\276\204II.md" | 2 +- .../0070.\347\210\254\346\245\274\346\242\257.md" | 2 +- ...347\274\226\350\276\221\350\267\235\347\246\273.md" | 2 +- "problems/0077.\347\273\204\345\220\210.md" | 2 +- "problems/0078.\345\255\220\351\233\206.md" | 2 +- "problems/0090.\345\255\220\351\233\206II.md" | 2 +- ...345\217\211\346\220\234\347\264\242\346\240\221.md" | 2 +- ...345\261\202\345\272\217\351\201\215\345\216\206.md" | 10 +++++----- ...346\234\200\345\244\247\346\267\261\345\272\246.md" | 2 +- ...350\267\257\345\276\204\346\200\273\345\222\214.md" | 2 +- ...347\232\204\345\255\220\345\272\217\345\210\227.md" | 2 +- ...6\234\200\344\275\263\346\227\266\346\234\272II.md" | 2 +- .../0134.\345\212\240\346\262\271\347\253\231.md" | 2 +- ...345\210\206\345\217\221\347\263\226\346\236\234.md" | 2 +- ...347\232\204\345\255\220\346\225\260\347\273\204.md" | 2 +- ...345\217\243\346\234\200\345\244\247\345\200\274.md" | 2 +- ...345\205\250\345\271\263\346\226\271\346\225\260.md" | 2 +- ...345\215\207\345\255\220\345\272\217\345\210\227.md" | 2 +- ...345\220\253\345\206\267\345\206\273\346\234\237.md" | 2 +- ...351\233\266\351\222\261\345\205\221\346\215\242.md" | 2 +- ...345\256\211\346\216\222\350\241\214\347\250\213.md" | 2 +- ...346\225\264\346\225\260\346\213\206\345\210\206.md" | 2 +- ...346\221\206\345\212\250\345\272\217\345\210\227.md" | 2 +- ...345\220\210\346\200\273\345\222\214\342\205\243.md" | 2 +- ...351\207\215\345\273\272\351\230\237\345\210\227.md" | 2 +- ...351\207\215\345\217\240\345\214\272\351\227\264.md" | 2 +- ...345\274\225\347\210\206\346\260\224\347\220\203.md" | 2 +- ...345\210\206\345\217\221\351\245\274\345\271\262.md" | 2 +- .../0474.\344\270\200\345\222\214\351\233\266.md" | 2 +- ...345\242\236\345\255\220\345\272\217\345\210\227.md" | 2 +- .../0494.\347\233\256\346\240\207\345\222\214.md" | 2 +- ...346\263\242\351\202\243\345\245\221\346\225\260.md" | 2 +- ...346\226\207\345\255\220\345\272\217\345\210\227.md" | 2 +- ...1\233\266\351\222\261\345\205\221\346\215\242II.md" | 2 +- ...345\210\240\351\231\244\346\223\215\344\275\234.md" | 2 +- ...345\233\236\346\226\207\345\255\220\344\270\262.md" | 2 +- ...351\200\222\345\242\236\345\272\217\345\210\227.md" | 2 +- ...345\220\253\346\211\213\347\273\255\350\264\271.md" | 2 +- ...346\200\201\350\247\204\345\210\222\357\274\211.md" | 2 +- ...345\242\236\347\232\204\346\225\260\345\255\227.md" | 2 +- ...345\255\227\346\257\215\345\214\272\351\227\264.md" | 2 +- ...346\252\254\346\260\264\346\211\276\351\233\266.md" | 2 +- ...346\216\247\344\272\214\345\217\211\346\240\221.md" | 2 +- ...347\273\204\347\232\204\345\271\263\346\226\271.md" | 4 ++-- ...347\232\204\346\225\260\347\273\204\345\222\214.md" | 2 +- ...345\255\230\345\234\250\350\267\257\345\276\204.md" | 2 +- ...47.\345\217\202\344\274\232dijkstra\345\240\206.md" | 2 +- ...202\344\274\232dijkstra\346\234\264\347\264\240.md" | 2 +- .../0053.\345\257\273\345\256\235-Kruskal.md" | 2 +- .../kamacoder/0053.\345\257\273\345\256\235-prim.md" | 2 +- ...4\247\347\211\251\350\277\220\350\276\223I-SPFA.md" | 2 +- ...50\264\247\347\211\251\350\277\220\350\276\223I.md" | 2 +- ...0\264\247\347\211\251\350\277\220\350\276\223II.md" | 2 +- ...\264\247\347\211\251\350\277\220\350\276\223III.md" | 2 +- ...346\230\216\351\200\233\345\205\254\345\233\255.md" | 2 +- ...345\217\257\350\276\276\350\267\257\345\276\204.md" | 2 +- ...346\225\260\351\207\217\345\271\277\346\220\234.md" | 2 +- ...346\225\260\351\207\217\346\267\261\346\220\234.md" | 2 +- ...346\234\200\345\244\247\351\235\242\347\247\257.md" | 2 +- ...347\232\204\346\200\273\351\235\242\347\247\257.md" | 2 +- ...346\262\211\346\262\241\345\255\244\345\262\233.md" | 2 +- ...346\260\264\346\265\201\351\227\256\351\242\230.md" | 2 +- ...346\234\200\345\244\247\345\262\233\345\261\277.md" | 2 +- ...345\205\250\345\217\257\350\276\276\346\200\247.md" | 2 +- ...345\261\277\347\232\204\345\221\250\351\225\277.md" | 2 +- ...345\234\250\347\232\204\350\267\257\345\276\204.md" | 2 +- ...345\206\227\344\275\231\350\277\236\346\216\245.md" | 2 +- ...5\206\227\344\275\231\350\277\236\346\216\245II.md" | 2 +- ...347\254\246\344\270\262\346\216\245\351\276\231.md" | 2 +- ...350\275\257\344\273\266\346\236\204\345\273\272.md" | 2 +- ...43\253\347\232\204\346\224\273\345\207\273astar.md" | 2 +- ...351\200\222\345\275\222\351\201\215\345\216\206.md" | 2 +- ...237\272\347\241\20001\350\203\214\345\214\205-1.md" | 2 +- ...345\256\214\345\205\250\350\203\214\345\214\205.md" | 2 +- 87 files changed, 92 insertions(+), 92 deletions(-) diff --git "a/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" "b/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" index 044eac1424..e982ae129b 100644 --- "a/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" @@ -341,7 +341,7 @@ impl Solution { } ``` -### Javascript: +### JavaScript: ```javascript var twoSum = function (nums, target) { diff --git "a/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" "b/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" index d310f4153c..f2f5cdd13f 100644 --- "a/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" +++ "b/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" @@ -275,7 +275,7 @@ def is_valid(strs) end ``` -### Javascript: +### JavaScript: ```javascript var isValid = function (s) { diff --git "a/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" "b/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" index 23dba84b4f..305bb7ccba 100644 --- "a/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" +++ "b/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" @@ -286,7 +286,7 @@ func swapPairs(head *ListNode) *ListNode { } ``` -### Javascript: +### JavaScript: ```javascript var swapPairs = function (head) { diff --git "a/problems/0037.\350\247\243\346\225\260\347\213\254.md" "b/problems/0037.\350\247\243\346\225\260\347\213\254.md" index 70d52e9e3a..6a9f69bd07 100644 --- "a/problems/0037.\350\247\243\346\225\260\347\213\254.md" +++ "b/problems/0037.\350\247\243\346\225\260\347\213\254.md" @@ -460,7 +460,7 @@ func isvalid(row, col int, k byte, board [][]byte) bool { -### Javascript +### JavaScript ```Javascript var solveSudoku = function(board) { diff --git "a/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" "b/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" index 3eeec2689c..8919d39367 100644 --- "a/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" +++ "b/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" @@ -374,7 +374,7 @@ func max(a, b int) int { } ``` -### Javascript +### JavaScript ```Javascript var jump = function(nums) { diff --git "a/problems/0046.\345\205\250\346\216\222\345\210\227.md" "b/problems/0046.\345\205\250\346\216\222\345\210\227.md" index 1ef80a142d..4302bdbfcb 100644 --- "a/problems/0046.\345\205\250\346\216\222\345\210\227.md" +++ "b/problems/0046.\345\205\250\346\216\222\345\210\227.md" @@ -271,7 +271,7 @@ func dfs(nums []int, cur int) { } ``` -### Javascript +### JavaScript ```js diff --git "a/problems/0047.\345\205\250\346\216\222\345\210\227II.md" "b/problems/0047.\345\205\250\346\216\222\345\210\227II.md" index 56006a7744..08e3c616a2 100644 --- "a/problems/0047.\345\205\250\346\216\222\345\210\227II.md" +++ "b/problems/0047.\345\205\250\346\216\222\345\210\227II.md" @@ -283,7 +283,7 @@ func dfs(nums []int, cur int) { } ``` -### Javascript +### JavaScript ```javascript var permuteUnique = function (nums) { diff --git "a/problems/0051.N\347\232\207\345\220\216.md" "b/problems/0051.N\347\232\207\345\220\216.md" index 6ced679cd4..38fc07e790 100644 --- "a/problems/0051.N\347\232\207\345\220\216.md" +++ "b/problems/0051.N\347\232\207\345\220\216.md" @@ -451,7 +451,7 @@ func isValid(n, row, col int, chessboard [][]string) bool { ``` -### Javascript +### JavaScript ```Javascript /** * @param {number} n diff --git "a/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" "b/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" index 1c7ff0cd55..69a7d19088 100644 --- "a/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" +++ "b/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" @@ -290,7 +290,7 @@ pub fn max_sub_array(nums: Vec) -> i32 { } ``` -### Javascript: +### JavaScript: ```Javascript var maxSubArray = function(nums) { diff --git "a/problems/0054.\350\236\272\346\227\213\347\237\251\351\230\265.md" "b/problems/0054.\350\236\272\346\227\213\347\237\251\351\230\265.md" index 6c0bad4058..3b7afb9099 100644 --- "a/problems/0054.\350\236\272\346\227\213\347\237\251\351\230\265.md" +++ "b/problems/0054.\350\236\272\346\227\213\347\237\251\351\230\265.md" @@ -260,7 +260,7 @@ class Solution { } ``` -### Javascript +### JavaScript ``` /** * @param {number[][]} matrix diff --git "a/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" "b/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" index 01fd951384..cbbf5980cb 100644 --- "a/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" +++ "b/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" @@ -166,7 +166,7 @@ func max(a, b int ) int { } ``` -### Javascript +### JavaScript ```Javascript var canJump = function(nums) { diff --git "a/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" "b/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" index 134a9028a6..538be69336 100644 --- "a/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" +++ "b/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" @@ -215,7 +215,7 @@ func max56(a, b int) int { ``` -### Javascript +### JavaScript ```javascript var merge = function (intervals) { intervals.sort((a, b) => a[0] - b[0]); diff --git "a/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" "b/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" index 5b46caa9e3..7025135ade 100644 --- "a/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" +++ "b/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" @@ -411,7 +411,7 @@ func uniquePaths(m int, n int) int { } ``` -### Javascript +### JavaScript ```Javascript var uniquePaths = function(m, n) { diff --git "a/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" "b/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" index daf3d8c5a1..13923abeca 100644 --- "a/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" +++ "b/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" @@ -465,7 +465,7 @@ func uniquePathsWithObstacles(obstacleGrid [][]int) int { } ``` -### Javascript +### JavaScript ```Javascript var uniquePathsWithObstacles = function(obstacleGrid) { diff --git "a/problems/0070.\347\210\254\346\245\274\346\242\257.md" "b/problems/0070.\347\210\254\346\245\274\346\242\257.md" index 1d0b192fe4..a2f664a495 100644 --- "a/problems/0070.\347\210\254\346\245\274\346\242\257.md" +++ "b/problems/0070.\347\210\254\346\245\274\346\242\257.md" @@ -327,7 +327,7 @@ func climbStairs(n int) int { return dp[n] } ``` -### Javascript +### JavaScript ```Javascript var climbStairs = function(n) { // dp[i] 为第 i 阶楼梯有多少种方法爬到楼顶 diff --git "a/problems/0072.\347\274\226\350\276\221\350\267\235\347\246\273.md" "b/problems/0072.\347\274\226\350\276\221\350\267\235\347\246\273.md" index b8de8bdcc7..0da3bf5093 100644 --- "a/problems/0072.\347\274\226\350\276\221\350\267\235\347\246\273.md" +++ "b/problems/0072.\347\274\226\350\276\221\350\267\235\347\246\273.md" @@ -313,7 +313,7 @@ func Min(args ...int) int { } ``` -### Javascript: +### JavaScript: ```javascript const minDistance = (word1, word2) => { diff --git "a/problems/0077.\347\273\204\345\220\210.md" "b/problems/0077.\347\273\204\345\220\210.md" index 3a271ff8b4..c4be5a3804 100644 --- "a/problems/0077.\347\273\204\345\220\210.md" +++ "b/problems/0077.\347\273\204\345\220\210.md" @@ -468,7 +468,7 @@ func dfs(n int, k int, start int) { } ``` -### Javascript +### JavaScript 未剪枝: ```js diff --git "a/problems/0078.\345\255\220\351\233\206.md" "b/problems/0078.\345\255\220\351\233\206.md" index 723d99a18b..0c368b41ed 100644 --- "a/problems/0078.\345\255\220\351\233\206.md" +++ "b/problems/0078.\345\255\220\351\233\206.md" @@ -246,7 +246,7 @@ func dfs(nums []int, start int) { } ``` -### Javascript +### JavaScript ```Javascript var subsets = function(nums) { diff --git "a/problems/0090.\345\255\220\351\233\206II.md" "b/problems/0090.\345\255\220\351\233\206II.md" index 939ef369c9..811d3cc005 100644 --- "a/problems/0090.\345\255\220\351\233\206II.md" +++ "b/problems/0090.\345\255\220\351\233\206II.md" @@ -376,7 +376,7 @@ func dfs(nums []int, start int) { ``` -### Javascript +### JavaScript ```Javascript diff --git "a/problems/0096.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0096.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" index e0e773100e..25d79aff74 100644 --- "a/problems/0096.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" +++ "b/problems/0096.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" @@ -221,7 +221,7 @@ func numTrees(n int)int{ } ``` -### Javascript +### JavaScript ```Javascript const numTrees =(n) => { diff --git "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" index cad324148d..98e1e98a6e 100644 --- "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" +++ "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" @@ -356,7 +356,7 @@ func levelOrder(root *TreeNode) (res [][]int) { } ``` -#### Javascript: +#### JavaScript: ```javascript var levelOrder = function(root) { @@ -759,7 +759,7 @@ func levelOrderBottom(root *TreeNode) [][]int { } ``` -#### Javascript: +#### JavaScript: ```javascript var levelOrderBottom = function (root) { @@ -1101,7 +1101,7 @@ func rightSideView(root *TreeNode) []int { } ``` -#### Javascript: +#### JavaScript: ```javascript var rightSideView = function(root) { @@ -1421,7 +1421,7 @@ func averageOfLevels(root *TreeNode) []float64 { } ``` -#### Javascript: +#### JavaScript: ```javascript var averageOfLevels = function(root) { @@ -2109,7 +2109,7 @@ func largestValues(root *TreeNode) []int { } ``` -#### Javascript: +#### JavaScript: ```javascript var largestValues = function (root) { diff --git "a/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" "b/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" index 607e195b42..fdc9009603 100644 --- "a/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" +++ "b/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" @@ -604,7 +604,7 @@ func maxDepth(root *Node) int { } ``` -### Javascript : +### JavaScript : 104.二叉树的最大深度 diff --git "a/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" "b/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" index e6ccc6ae27..b97013e67a 100644 --- "a/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" +++ "b/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" @@ -830,7 +830,7 @@ func traverse(node *TreeNode, result *[][]int, currPath *[]int, targetSum int) { } ``` -### Javascript +### JavaScript 0112.路径总和 diff --git "a/problems/0115.\344\270\215\345\220\214\347\232\204\345\255\220\345\272\217\345\210\227.md" "b/problems/0115.\344\270\215\345\220\214\347\232\204\345\255\220\345\272\217\345\210\227.md" index 8682b88d13..cf24c4c180 100644 --- "a/problems/0115.\344\270\215\345\220\214\347\232\204\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0115.\344\270\215\345\220\214\347\232\204\345\255\220\345\272\217\345\210\227.md" @@ -265,7 +265,7 @@ func numDistinct(s string, t string) int { } ``` -### Javascript: +### JavaScript: ```javascript const numDistinct = (s, t) => { diff --git "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" index e255723d2a..6663a66d12 100644 --- "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" +++ "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" @@ -249,7 +249,7 @@ func max(a, b int) int { } ``` -### Javascript: +### JavaScript: 贪心 diff --git "a/problems/0134.\345\212\240\346\262\271\347\253\231.md" "b/problems/0134.\345\212\240\346\262\271\347\253\231.md" index 5cf50b3e56..0248760da6 100644 --- "a/problems/0134.\345\212\240\346\262\271\347\253\231.md" +++ "b/problems/0134.\345\212\240\346\262\271\347\253\231.md" @@ -396,7 +396,7 @@ func canCompleteCircuit(gas []int, cost []int) int { } ``` -### Javascript +### JavaScript 暴力: ```js var canCompleteCircuit = function(gas, cost) { diff --git "a/problems/0135.\345\210\206\345\217\221\347\263\226\346\236\234.md" "b/problems/0135.\345\210\206\345\217\221\347\263\226\346\236\234.md" index 6805857e8c..177d23e723 100644 --- "a/problems/0135.\345\210\206\345\217\221\347\263\226\346\236\234.md" +++ "b/problems/0135.\345\210\206\345\217\221\347\263\226\346\236\234.md" @@ -234,7 +234,7 @@ func findMax(num1 int, num2 int) int { } ``` -### Javascript +### JavaScript ```Javascript var candy = function(ratings) { let candys = new Array(ratings.length).fill(1) diff --git "a/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" "b/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" index e399ac9006..c6d89976d0 100644 --- "a/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" +++ "b/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" @@ -266,7 +266,7 @@ var minSubArrayLen = function(target, nums) { }; ``` -### Typescript: +### TypeScript: ```typescript function minSubArrayLen(target: number, nums: number[]): number { diff --git "a/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" "b/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" index 23bf615b4a..9c71778f0f 100644 --- "a/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" +++ "b/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" @@ -401,7 +401,7 @@ func maxSlidingWindow(nums []int, k int) []int { } ``` -### Javascript: +### JavaScript: ```javascript /** diff --git "a/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" "b/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" index 570632bdf6..dc5a7e9ec9 100644 --- "a/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" +++ "b/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" @@ -346,7 +346,7 @@ func min(a, b int) int { } ``` -### Javascript: +### JavaScript: ```Javascript // 先遍历物品,再遍历背包 diff --git "a/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" "b/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" index f1a146b71c..442938c06f 100644 --- "a/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" @@ -248,7 +248,7 @@ func lengthOfLIS(nums []int ) int { } ``` -### Javascript: +### JavaScript: ```javascript const lengthOfLIS = (nums) => { diff --git "a/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" "b/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" index 4913b8bd57..480b086605 100644 --- "a/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" +++ "b/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" @@ -393,7 +393,7 @@ func max(a, b int) int { -### Javascript: +### JavaScript: > 不同的状态定义 感觉更容易理解些 ```javascript diff --git "a/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" "b/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" index 0ed5cf688e..e55e20bedf 100644 --- "a/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" +++ "b/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" @@ -427,7 +427,7 @@ impl Solution { } ``` -### Javascript: +### JavaScript: ```javascript // 遍历物品 diff --git "a/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" "b/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" index 1d9c524b13..ed8149d08e 100644 --- "a/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" +++ "b/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" @@ -535,7 +535,7 @@ func findItinerary(tickets [][]string) []string { } ``` -### Javascript +### JavaScript ```Javascript diff --git "a/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" "b/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" index 3ba23e522c..5d0110f67e 100644 --- "a/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" +++ "b/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" @@ -385,7 +385,7 @@ func integerBreak(n int) int { } ``` -### Javascript +### JavaScript ```Javascript var integerBreak = function(n) { let dp = new Array(n + 1).fill(0) diff --git "a/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" "b/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" index 9e6714ce9d..9cf1ed8c35 100644 --- "a/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" +++ "b/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" @@ -466,7 +466,7 @@ func max(a, b int) int { } ``` -### Javascript +### JavaScript **贪心** diff --git "a/problems/0377.\347\273\204\345\220\210\346\200\273\345\222\214\342\205\243.md" "b/problems/0377.\347\273\204\345\220\210\346\200\273\345\222\214\342\205\243.md" index e96f8dc646..ba8546c662 100644 --- "a/problems/0377.\347\273\204\345\220\210\346\200\273\345\222\214\342\205\243.md" +++ "b/problems/0377.\347\273\204\345\220\210\346\200\273\345\222\214\342\205\243.md" @@ -254,7 +254,7 @@ func combinationSum4(nums []int, target int) int { } ``` -### Javascript: +### JavaScript: ```javascript const combinationSum4 = (nums, target) => { diff --git "a/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" "b/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" index d92a7f3f58..d6fc415b68 100644 --- "a/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" +++ "b/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" @@ -270,7 +270,7 @@ func reconstructQueue(people [][]int) [][]int { } ``` -### Javascript +### JavaScript ```Javascript var reconstructQueue = function(people) { diff --git "a/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" "b/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" index 209616024e..d6321315d7 100644 --- "a/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" +++ "b/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" @@ -311,7 +311,7 @@ func min(a, b int) int { } ``` -### Javascript +### JavaScript - 按右边界排序 ```Javascript var eraseOverlapIntervals = function(intervals) { diff --git "a/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" "b/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" index 318c3035ce..9b9eef1d53 100644 --- "a/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" +++ "b/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" @@ -220,7 +220,7 @@ func min(a, b int) int { } ``` -### Javascript +### JavaScript ```Javascript var findMinArrowShots = function(points) { points.sort((a, b) => { diff --git "a/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" "b/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" index 22dd7570c8..5e8fb73094 100644 --- "a/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" +++ "b/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" @@ -278,7 +278,7 @@ pub fn find_content_children(mut children: Vec, mut cookies: Vec) -> i } ``` -### Javascript +### JavaScript ```js var findContentChildren = function (g, s) { diff --git "a/problems/0474.\344\270\200\345\222\214\351\233\266.md" "b/problems/0474.\344\270\200\345\222\214\351\233\266.md" index 72d622437a..e514e7292b 100644 --- "a/problems/0474.\344\270\200\345\222\214\351\233\266.md" +++ "b/problems/0474.\344\270\200\345\222\214\351\233\266.md" @@ -362,7 +362,7 @@ func max(a,b int) int { } ``` -### Javascript +### JavaScript ```javascript const findMaxForm = (strs, m, n) => { const dp = Array.from(Array(m+1), () => Array(n+1).fill(0)); diff --git "a/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" "b/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" index 8f642a5fc9..7832095a10 100644 --- "a/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" @@ -375,7 +375,7 @@ func dfs(nums []int, start int) { } ``` -### Javascript +### JavaScript ```Javascript diff --git "a/problems/0494.\347\233\256\346\240\207\345\222\214.md" "b/problems/0494.\347\233\256\346\240\207\345\222\214.md" index 0872460907..206fdf89ea 100644 --- "a/problems/0494.\347\233\256\346\240\207\345\222\214.md" +++ "b/problems/0494.\347\233\256\346\240\207\345\222\214.md" @@ -791,7 +791,7 @@ func abs(x int) int { } ``` -### Javascript +### JavaScript ```javascript const findTargetSumWays = (nums, target) => { diff --git "a/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" "b/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" index 21b07802f1..1c4127fcd2 100644 --- "a/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" +++ "b/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" @@ -292,7 +292,7 @@ func fib(n int) int { return c } ``` -### Javascript +### JavaScript 解法一 ```Javascript var fib = function(n) { diff --git "a/problems/0516.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\345\272\217\345\210\227.md" "b/problems/0516.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\345\272\217\345\210\227.md" index af36b94d29..166310aaff 100644 --- "a/problems/0516.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0516.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\345\272\217\345\210\227.md" @@ -224,7 +224,7 @@ func longestPalindromeSubseq(s string) int { } ``` -### Javascript: +### JavaScript: ```javascript const longestPalindromeSubseq = (s) => { diff --git "a/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" "b/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" index 7023121292..0d35fb7cdf 100644 --- "a/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" +++ "b/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" @@ -349,7 +349,7 @@ impl Solution { } ``` -### Javascript: +### JavaScript: ```javascript const change = (amount, coins) => { diff --git "a/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" "b/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" index 14a55631e6..8e63e82cb8 100644 --- "a/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" +++ "b/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" @@ -287,7 +287,7 @@ func min(a, b int) int { return b } ``` -### Javascript: +### JavaScript: ```javascript // 方法一 diff --git "a/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" "b/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" index 89e4ad1166..6f0fea4a8d 100644 --- "a/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" +++ "b/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" @@ -465,7 +465,7 @@ func countSubstrings(s string) int { } ``` -### Javascript: +### JavaScript: > 动态规划 ```javascript diff --git "a/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" "b/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" index 57a38404b2..8b967092bc 100644 --- "a/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" +++ "b/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" @@ -359,7 +359,7 @@ impl Solution { ``` -### Javascript: +### JavaScript: > 动态规划: ```javascript diff --git "a/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271.md" "b/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271.md" index 88b03d9d76..c87607a23c 100644 --- "a/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271.md" +++ "b/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271.md" @@ -243,7 +243,7 @@ func maxProfit(prices []int, fee int) int { return res } ``` -### Javascript +### JavaScript ```Javascript // 贪心思路 var maxProfit = function(prices, fee) { diff --git "a/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" "b/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" index b0e8b141f5..3f5f929ce2 100644 --- "a/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" +++ "b/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" @@ -226,7 +226,7 @@ func max(a, b int) int { } ``` -### Javascript: +### JavaScript: ```javascript const maxProfit = (prices,fee) => { diff --git "a/problems/0738.\345\215\225\350\260\203\351\200\222\345\242\236\347\232\204\346\225\260\345\255\227.md" "b/problems/0738.\345\215\225\350\260\203\351\200\222\345\242\236\347\232\204\346\225\260\345\255\227.md" index 3d46d5ad04..8de22fe2f4 100644 --- "a/problems/0738.\345\215\225\350\260\203\351\200\222\345\242\236\347\232\204\346\225\260\345\255\227.md" +++ "b/problems/0738.\345\215\225\350\260\203\351\200\222\345\242\236\347\232\204\346\225\260\345\255\227.md" @@ -292,7 +292,7 @@ func monotoneIncreasingDigits(N int) int { } ``` -### Javascript +### JavaScript ```Javascript var monotoneIncreasingDigits = function(n) { n = n.toString() diff --git "a/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" "b/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" index 5218692735..19d862db14 100644 --- "a/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" +++ "b/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" @@ -312,7 +312,7 @@ func max(a, b int) int { } ``` -### Javascript +### JavaScript ```Javascript var partitionLabels = function(s) { let hash = {} diff --git "a/problems/0860.\346\237\240\346\252\254\346\260\264\346\211\276\351\233\266.md" "b/problems/0860.\346\237\240\346\252\254\346\260\264\346\211\276\351\233\266.md" index 804ff13c12..b7887d456e 100644 --- "a/problems/0860.\346\237\240\346\252\254\346\260\264\346\211\276\351\233\266.md" +++ "b/problems/0860.\346\237\240\346\252\254\346\260\264\346\211\276\351\233\266.md" @@ -226,7 +226,7 @@ func lemonadeChange(bills []int) bool { } ``` -### Javascript +### JavaScript ```Javascript var lemonadeChange = function(bills) { let fiveCount = 0 diff --git "a/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" "b/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" index d59496c87d..327c54f72a 100644 --- "a/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" @@ -536,7 +536,7 @@ func min(a, b int) int { ``` -### Javascript +### JavaScript ```Javascript var minCameraCover = function(root) { diff --git "a/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" "b/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" index effa905541..3f16951df7 100644 --- "a/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" +++ "b/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" @@ -263,7 +263,7 @@ impl Solution { } } ``` -### Javascript: +### JavaScript: ```Javascript /** @@ -289,7 +289,7 @@ var sortedSquares = function(nums) { }; ``` -### Typescript: +### TypeScript: 双指针法: diff --git "a/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" "b/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" index 4e04960098..1a7817775a 100644 --- "a/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" +++ "b/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" @@ -207,7 +207,7 @@ func largestSumAfterKNegations(nums []int, K int) int { ``` -### Javascript +### JavaScript ```Javascript var largestSumAfterKNegations = function(nums, k) { diff --git "a/problems/1971.\345\257\273\346\211\276\345\233\276\344\270\255\346\230\257\345\220\246\345\255\230\345\234\250\350\267\257\345\276\204.md" "b/problems/1971.\345\257\273\346\211\276\345\233\276\344\270\255\346\230\257\345\220\246\345\255\230\345\234\250\350\267\257\345\276\204.md" index 2c5901ae22..93e9b66365 100644 --- "a/problems/1971.\345\257\273\346\211\276\345\233\276\344\270\255\346\230\257\345\220\246\345\255\230\345\234\250\350\267\257\345\276\204.md" +++ "b/problems/1971.\345\257\273\346\211\276\345\233\276\344\270\255\346\230\257\345\220\246\345\255\230\345\234\250\350\267\257\345\276\204.md" @@ -213,7 +213,7 @@ class Solution: return find(source) == find(destination) ``` -### Javascript: +### JavaScript: Javascript 并查集解法如下: diff --git "a/problems/kamacoder/0047.\345\217\202\344\274\232dijkstra\345\240\206.md" "b/problems/kamacoder/0047.\345\217\202\344\274\232dijkstra\345\240\206.md" index 9905a420c8..75c12f8a96 100644 --- "a/problems/kamacoder/0047.\345\217\202\344\274\232dijkstra\345\240\206.md" +++ "b/problems/kamacoder/0047.\345\217\202\344\274\232dijkstra\345\240\206.md" @@ -911,7 +911,7 @@ func main() { ### Rust -### Javascript +### JavaScript ### TypeScript diff --git "a/problems/kamacoder/0047.\345\217\202\344\274\232dijkstra\346\234\264\347\264\240.md" "b/problems/kamacoder/0047.\345\217\202\344\274\232dijkstra\346\234\264\347\264\240.md" index 465ad16dfc..e794690a5c 100644 --- "a/problems/kamacoder/0047.\345\217\202\344\274\232dijkstra\346\234\264\347\264\240.md" +++ "b/problems/kamacoder/0047.\345\217\202\344\274\232dijkstra\346\234\264\347\264\240.md" @@ -867,7 +867,7 @@ if __name__ == "__main__": ### Rust -### Javascript +### JavaScript ```js function dijkstra(grid, start, end) { diff --git "a/problems/kamacoder/0053.\345\257\273\345\256\235-Kruskal.md" "b/problems/kamacoder/0053.\345\257\273\345\256\235-Kruskal.md" index 6a22798551..861efe6806 100644 --- "a/problems/kamacoder/0053.\345\257\273\345\256\235-Kruskal.md" +++ "b/problems/kamacoder/0053.\345\257\273\345\256\235-Kruskal.md" @@ -547,7 +547,7 @@ if __name__ == "__main__": ### Rust -### Javascript +### JavaScript ```js function kruskal(v, edges) { diff --git "a/problems/kamacoder/0053.\345\257\273\345\256\235-prim.md" "b/problems/kamacoder/0053.\345\257\273\345\256\235-prim.md" index a8dad4cbfc..bbcea0261b 100644 --- "a/problems/kamacoder/0053.\345\257\273\345\256\235-prim.md" +++ "b/problems/kamacoder/0053.\345\257\273\345\256\235-prim.md" @@ -692,7 +692,7 @@ if __name__ == "__main__": ### Rust -### Javascript +### JavaScript ```js function prim(v, edges) { const grid = Array.from({ length: v + 1 }, () => new Array(v + 1).fill(10001)); // Fixed grid initialization diff --git "a/problems/kamacoder/0094.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I-SPFA.md" "b/problems/kamacoder/0094.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I-SPFA.md" index b3f42bf800..6881f072ad 100644 --- "a/problems/kamacoder/0094.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I-SPFA.md" +++ "b/problems/kamacoder/0094.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I-SPFA.md" @@ -462,7 +462,7 @@ if __name__ == "__main__": ### Rust -### Javascript +### JavaScript ### TypeScript diff --git "a/problems/kamacoder/0094.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I.md" "b/problems/kamacoder/0094.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I.md" index 3737fe0149..b20d25ef2e 100644 --- "a/problems/kamacoder/0094.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I.md" +++ "b/problems/kamacoder/0094.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I.md" @@ -483,7 +483,7 @@ if __name__ == "__main__": ### Rust -### Javascript +### JavaScript ### TypeScript diff --git "a/problems/kamacoder/0095.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223II.md" "b/problems/kamacoder/0095.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223II.md" index edfd52e02d..3a3066890f 100644 --- "a/problems/kamacoder/0095.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223II.md" +++ "b/problems/kamacoder/0095.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223II.md" @@ -392,7 +392,7 @@ if __name__ == "__main__": ### Rust -### Javascript +### JavaScript ### TypeScript diff --git "a/problems/kamacoder/0096.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223III.md" "b/problems/kamacoder/0096.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223III.md" index dacd23d11d..8e8152634e 100644 --- "a/problems/kamacoder/0096.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223III.md" +++ "b/problems/kamacoder/0096.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223III.md" @@ -708,7 +708,7 @@ public class Main { ### Rust -### Javascript +### JavaScript ### TypeScript diff --git "a/problems/kamacoder/0097.\345\260\217\346\230\216\351\200\233\345\205\254\345\233\255.md" "b/problems/kamacoder/0097.\345\260\217\346\230\216\351\200\233\345\205\254\345\233\255.md" index e8d92cc29f..8b3078fc01 100644 --- "a/problems/kamacoder/0097.\345\260\217\346\230\216\351\200\233\345\205\254\345\233\255.md" +++ "b/problems/kamacoder/0097.\345\260\217\346\230\216\351\200\233\345\205\254\345\233\255.md" @@ -492,7 +492,7 @@ if __name__ == '__main__': ### Rust -### Javascript +### JavaScript ### TypeScript diff --git "a/problems/kamacoder/0098.\346\211\200\346\234\211\345\217\257\350\276\276\350\267\257\345\276\204.md" "b/problems/kamacoder/0098.\346\211\200\346\234\211\345\217\257\350\276\276\350\267\257\345\276\204.md" index db35524ffd..734435f92a 100644 --- "a/problems/kamacoder/0098.\346\211\200\346\234\211\345\217\257\350\276\276\350\267\257\345\276\204.md" +++ "b/problems/kamacoder/0098.\346\211\200\346\234\211\345\217\257\350\276\276\350\267\257\345\276\204.md" @@ -726,7 +726,7 @@ func main() { ### Rust -### Javascript +### JavaScript #### 邻接矩阵写法 diff --git "a/problems/kamacoder/0099.\345\262\233\345\261\277\347\232\204\346\225\260\351\207\217\345\271\277\346\220\234.md" "b/problems/kamacoder/0099.\345\262\233\345\261\277\347\232\204\346\225\260\351\207\217\345\271\277\346\220\234.md" index 3047575391..68b475a02d 100644 --- "a/problems/kamacoder/0099.\345\262\233\345\261\277\347\232\204\346\225\260\351\207\217\345\271\277\346\220\234.md" +++ "b/problems/kamacoder/0099.\345\262\233\345\261\277\347\232\204\346\225\260\351\207\217\345\271\277\346\220\234.md" @@ -360,7 +360,7 @@ func main() { ### Rust -### Javascript +### JavaScript ```javascript const r1 = require('readline').createInterface({ input: process.stdin }); diff --git "a/problems/kamacoder/0099.\345\262\233\345\261\277\347\232\204\346\225\260\351\207\217\346\267\261\346\220\234.md" "b/problems/kamacoder/0099.\345\262\233\345\261\277\347\232\204\346\225\260\351\207\217\346\267\261\346\220\234.md" index 6ac7ba3b62..33d0c9dc75 100644 --- "a/problems/kamacoder/0099.\345\262\233\345\261\277\347\232\204\346\225\260\351\207\217\346\267\261\346\220\234.md" +++ "b/problems/kamacoder/0099.\345\262\233\345\261\277\347\232\204\346\225\260\351\207\217\346\267\261\346\220\234.md" @@ -328,7 +328,7 @@ if __name__ == '__main__': ### Rust -### Javascript +### JavaScript ```javascript const r1 = require('readline').createInterface({ input: process.stdin }); diff --git "a/problems/kamacoder/0100.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" "b/problems/kamacoder/0100.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" index 51bfc57fd1..a3e2a99e9e 100644 --- "a/problems/kamacoder/0100.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" +++ "b/problems/kamacoder/0100.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" @@ -390,7 +390,7 @@ func main() { ### Rust -### Javascript +### JavaScript ```javascript // 广搜版 diff --git "a/problems/kamacoder/0101.\345\255\244\345\262\233\347\232\204\346\200\273\351\235\242\347\247\257.md" "b/problems/kamacoder/0101.\345\255\244\345\262\233\347\232\204\346\200\273\351\235\242\347\247\257.md" index 26c92c07a6..af5ce089d5 100644 --- "a/problems/kamacoder/0101.\345\255\244\345\262\233\347\232\204\346\200\273\351\235\242\347\247\257.md" +++ "b/problems/kamacoder/0101.\345\255\244\345\262\233\347\232\204\346\200\273\351\235\242\347\247\257.md" @@ -467,7 +467,7 @@ func main() { ### Rust -### Javascript +### JavaScript #### 深搜版 diff --git "a/problems/kamacoder/0102.\346\262\211\346\262\241\345\255\244\345\262\233.md" "b/problems/kamacoder/0102.\346\262\211\346\262\241\345\255\244\345\262\233.md" index 4eabc5162a..a7e28df52f 100644 --- "a/problems/kamacoder/0102.\346\262\211\346\262\241\345\255\244\345\262\233.md" +++ "b/problems/kamacoder/0102.\346\262\211\346\262\241\345\255\244\345\262\233.md" @@ -322,7 +322,7 @@ for row in g: ### Rust -### Javascript +### JavaScript #### 深搜版 diff --git "a/problems/kamacoder/0103.\346\260\264\346\265\201\351\227\256\351\242\230.md" "b/problems/kamacoder/0103.\346\260\264\346\265\201\351\227\256\351\242\230.md" index 9a34bf094f..a09bf089ad 100644 --- "a/problems/kamacoder/0103.\346\260\264\346\265\201\351\227\256\351\242\230.md" +++ "b/problems/kamacoder/0103.\346\260\264\346\265\201\351\227\256\351\242\230.md" @@ -416,7 +416,7 @@ if __name__ == "__main__": ### Rust -### Javascript +### JavaScript #### 深搜 diff --git "a/problems/kamacoder/0104.\345\273\272\351\200\240\346\234\200\345\244\247\345\262\233\345\261\277.md" "b/problems/kamacoder/0104.\345\273\272\351\200\240\346\234\200\345\244\247\345\262\233\345\261\277.md" index 3dcbfee6db..ffb6cae34d 100644 --- "a/problems/kamacoder/0104.\345\273\272\351\200\240\346\234\200\345\244\247\345\262\233\345\261\277.md" +++ "b/problems/kamacoder/0104.\345\273\272\351\200\240\346\234\200\345\244\247\345\262\233\345\261\277.md" @@ -530,7 +530,7 @@ if __name__ == "__main__": ### Rust -### Javascript +### JavaScript ```javascript const r1 = require('readline').createInterface({ input: process.stdin }); diff --git "a/problems/kamacoder/0105.\346\234\211\345\220\221\345\233\276\347\232\204\345\256\214\345\205\250\345\217\257\350\276\276\346\200\247.md" "b/problems/kamacoder/0105.\346\234\211\345\220\221\345\233\276\347\232\204\345\256\214\345\205\250\345\217\257\350\276\276\346\200\247.md" index 838b021245..3bfcfb40df 100644 --- "a/problems/kamacoder/0105.\346\234\211\345\220\221\345\233\276\347\232\204\345\256\214\345\205\250\345\217\257\350\276\276\346\200\247.md" +++ "b/problems/kamacoder/0105.\346\234\211\345\220\221\345\233\276\347\232\204\345\256\214\345\205\250\345\217\257\350\276\276\346\200\247.md" @@ -489,7 +489,7 @@ func main() { ### Rust -### Javascript +### JavaScript ### TypeScript diff --git "a/problems/kamacoder/0106.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" "b/problems/kamacoder/0106.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" index 235d9445d1..91a1a438c6 100644 --- "a/problems/kamacoder/0106.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" +++ "b/problems/kamacoder/0106.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" @@ -343,7 +343,7 @@ func parseLine(line string, count int) []int { ### Rust -### Javascript +### JavaScript ### TypeScript diff --git "a/problems/kamacoder/0107.\345\257\273\346\211\276\345\255\230\345\234\250\347\232\204\350\267\257\345\276\204.md" "b/problems/kamacoder/0107.\345\257\273\346\211\276\345\255\230\345\234\250\347\232\204\350\267\257\345\276\204.md" index 09ad0d5e3d..779907c8fd 100644 --- "a/problems/kamacoder/0107.\345\257\273\346\211\276\345\255\230\345\234\250\347\232\204\350\267\257\345\276\204.md" +++ "b/problems/kamacoder/0107.\345\257\273\346\211\276\345\255\230\345\234\250\347\232\204\350\267\257\345\276\204.md" @@ -340,7 +340,7 @@ func main() { ### Rust -### Javascript +### JavaScript ```java const r1 = require('readline').createInterface({ input: process.stdin }); diff --git "a/problems/kamacoder/0108.\345\206\227\344\275\231\350\277\236\346\216\245.md" "b/problems/kamacoder/0108.\345\206\227\344\275\231\350\277\236\346\216\245.md" index 18a86ad6d7..efbbb6d203 100644 --- "a/problems/kamacoder/0108.\345\206\227\344\275\231\350\277\236\346\216\245.md" +++ "b/problems/kamacoder/0108.\345\206\227\344\275\231\350\277\236\346\216\245.md" @@ -221,7 +221,7 @@ if __name__ == "__main__": ### Rust -### Javascript +### JavaScript ```javascript const r1 = require('readline').createInterface({ input: process.stdin }); diff --git "a/problems/kamacoder/0109.\345\206\227\344\275\231\350\277\236\346\216\245II.md" "b/problems/kamacoder/0109.\345\206\227\344\275\231\350\277\236\346\216\245II.md" index 2bd4eac6e2..4365c27f43 100644 --- "a/problems/kamacoder/0109.\345\206\227\344\275\231\350\277\236\346\216\245II.md" +++ "b/problems/kamacoder/0109.\345\206\227\344\275\231\350\277\236\346\216\245II.md" @@ -441,7 +441,7 @@ if __name__ == "__main__": ### Rust -### Javascript +### JavaScript ```javascript const r1 = require('readline').createInterface({ input: process.stdin }); diff --git "a/problems/kamacoder/0110.\345\255\227\347\254\246\344\270\262\346\216\245\351\276\231.md" "b/problems/kamacoder/0110.\345\255\227\347\254\246\344\270\262\346\216\245\351\276\231.md" index 308e50b7f3..6541faba20 100644 --- "a/problems/kamacoder/0110.\345\255\227\347\254\246\344\270\262\346\216\245\351\276\231.md" +++ "b/problems/kamacoder/0110.\345\255\227\347\254\246\344\270\262\346\216\245\351\276\231.md" @@ -254,7 +254,7 @@ if __name__=='__main__': ### Rust -### Javascript +### JavaScript ```javascript const r1 = require('readline').createInterface({ input: process.stdin }); diff --git "a/problems/kamacoder/0117.\350\275\257\344\273\266\346\236\204\345\273\272.md" "b/problems/kamacoder/0117.\350\275\257\344\273\266\346\236\204\345\273\272.md" index 348187d6f1..58c1776304 100644 --- "a/problems/kamacoder/0117.\350\275\257\344\273\266\346\236\204\345\273\272.md" +++ "b/problems/kamacoder/0117.\350\275\257\344\273\266\346\236\204\345\273\272.md" @@ -449,7 +449,7 @@ if __name__ == "__main__": ### Rust -### Javascript +### JavaScript ```javascript const r1 = require('readline').createInterface({ input: process.stdin }); diff --git "a/problems/kamacoder/0126.\351\252\221\345\243\253\347\232\204\346\224\273\345\207\273astar.md" "b/problems/kamacoder/0126.\351\252\221\345\243\253\347\232\204\346\224\273\345\207\273astar.md" index 2d0481ecec..80fc033bb7 100644 --- "a/problems/kamacoder/0126.\351\252\221\345\243\253\347\232\204\346\224\273\345\207\273astar.md" +++ "b/problems/kamacoder/0126.\351\252\221\345\243\253\347\232\204\346\224\273\345\207\273astar.md" @@ -373,7 +373,7 @@ for _ in range(n): ### Rust -### Javascript +### JavaScript ### TypeScript diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" index f2a97f4de0..8f61b8c69a 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" @@ -283,7 +283,7 @@ func postorderTraversal(root *TreeNode) (res []int) { } ``` -### Javascript: +### JavaScript: 前序遍历: ```Javascript diff --git "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" index 2747f179d1..e7ad8d1dab 100644 --- "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" +++ "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" @@ -492,7 +492,7 @@ func max(x, y int) int { ``` -### Javascript +### JavaScript ```js const readline = require('readline').createInterface({ diff --git "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" index 3a50ee7bbf..ae1e9e0b6d 100644 --- "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" +++ "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" @@ -392,7 +392,7 @@ func main() { fmt.Println(test_CompletePack2(weight, price, 4)) } ``` -### Javascript: +### JavaScript: ```Javascript // 先遍历物品,再遍历背包容量 From 7683e173384162dd8a95b2a5412b56a230a2f858 Mon Sep 17 00:00:00 2001 From: markwang Date: Thu, 17 Oct 2024 13:28:39 +0800 Subject: [PATCH 2876/3019] =?UTF-8?q?1143.=E6=9C=80=E9=95=BF=E5=85=AC?= =?UTF-8?q?=E5=85=B1=E5=AD=90=E5=BA=8F=E5=88=97=E6=96=87=E5=AD=97=E5=8B=98?= =?UTF-8?q?=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/1143.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" "b/problems/1143.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" index 25f3283864..6d05ccf3f8 100644 --- "a/problems/1143.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/1143.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" @@ -80,7 +80,7 @@ if (text1[i - 1] == text2[j - 1]) { 先看看dp[i][0]应该是多少呢? -test1[0, i-1]和空串的最长公共子序列自然是0,所以dp[i][0] = 0; +text1[0, i-1]和空串的最长公共子序列自然是0,所以dp[i][0] = 0; 同理dp[0][j]也是0。 From 09fef9f8f8172418eaeeab631a6d10e774080a12 Mon Sep 17 00:00:00 2001 From: markwang Date: Thu, 17 Oct 2024 15:58:28 +0800 Subject: [PATCH 2877/3019] =?UTF-8?q?1035.=E4=B8=8D=E7=9B=B8=E4=BA=A4?= =?UTF-8?q?=E7=9A=84=E7=BA=BF=E9=A2=98=E7=9B=AE=E6=8F=8F=E8=BF=B0=E5=8F=8A?= =?UTF-8?q?=E5=8F=82=E6=95=B0=E5=90=8D=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...70\344\272\244\347\232\204\347\272\277.md" | 56 ++++++++++--------- 1 file changed, 30 insertions(+), 26 deletions(-) diff --git "a/problems/1035.\344\270\215\347\233\270\344\272\244\347\232\204\347\272\277.md" "b/problems/1035.\344\270\215\347\233\270\344\272\244\347\232\204\347\272\277.md" index 8ee52c5d48..5164e1f7ff 100644 --- "a/problems/1035.\344\270\215\347\233\270\344\272\244\347\232\204\347\272\277.md" +++ "b/problems/1035.\344\270\215\347\233\270\344\272\244\347\232\204\347\272\277.md" @@ -8,11 +8,16 @@ [力扣题目链接](https://leetcode.cn/problems/uncrossed-lines/) -我们在两条独立的水平线上按给定的顺序写下 A 和 B 中的整数。 +在两条独立的水平线上按给定的顺序写下 nums1 和 nums2 中的整数。 -现在,我们可以绘制一些连接两个数字 A[i] 和 B[j] 的直线,只要 A[i] == B[j],且我们绘制的直线不与任何其他连线(非水平线)相交。 +现在,可以绘制一些连接两个数字 nums1[i] 和 nums2[j] 的直线,这些直线需要同时满足: -以这种方法绘制线条,并返回我们可以绘制的最大连线数。 +* nums1[i] == nums2[j] +* 且绘制的直线不与任何其他连线(非水平线)相交。 + +请注意,连线即使在端点也不能相交:每个数字只能属于一条连线。 + +以这种方法绘制线条,并返回可以绘制的最大连线数。 ![1035.不相交的线](https://code-thinking-1253855093.file.myqcloud.com/pics/2021032116363533.png) @@ -26,16 +31,16 @@ 相信不少录友看到这道题目都没啥思路,我们来逐步分析一下。 -绘制一些连接两个数字 A[i] 和 B[j] 的直线,只要 A[i] == B[j],且直线不能相交! +绘制一些连接两个数字 nums1[i] 和 nums2[j] 的直线,只要 nums1[i] == nums2[j],且直线不能相交! -直线不能相交,这就是说明在字符串A中 找到一个与字符串B相同的子序列,且这个子序列不能改变相对顺序,只要相对顺序不改变,链接相同数字的直线就不会相交。 +直线不能相交,这就是说明在字符串nums1中 找到一个与字符串nums2相同的子序列,且这个子序列不能改变相对顺序,只要相对顺序不改变,连接相同数字的直线就不会相交。 -拿示例一A = [1,4,2], B = [1,2,4]为例,相交情况如图: +拿示例一nums1 = [1,4,2], nums2 = [1,2,4]为例,相交情况如图: ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210914145158.png) -其实也就是说A和B的最长公共子序列是[1,4],长度为2。 这个公共子序列指的是相对顺序不变(即数字4在字符串A中数字1的后面,那么数字4也应该在字符串B数字1的后面) +其实也就是说nums1和nums2的最长公共子序列是[1,4],长度为2。 这个公共子序列指的是相对顺序不变(即数字4在字符串nums1中数字1的后面,那么数字4也应该在字符串nums2数字1的后面) 这么分析完之后,大家可以发现:**本题说是求绘制的最大连线数,其实就是求两个字符串的最长公共子序列的长度!** @@ -52,18 +57,18 @@ ```CPP class Solution { public: - int maxUncrossedLines(vector& A, vector& B) { - vector> dp(A.size() + 1, vector(B.size() + 1, 0)); - for (int i = 1; i <= A.size(); i++) { - for (int j = 1; j <= B.size(); j++) { - if (A[i - 1] == B[j - 1]) { + int maxUncrossedLines(vector& nums1, vector& nums2) { + vector> dp(nums1.size() + 1, vector(nums2.size() + 1, 0)); + for (int i = 1; i <= nums1.size(); i++) { + for (int j = 1; j <= nums2.size(); j++) { + if (nums1[i - 1] == nums2[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[A.size()][B.size()]; + return dp[nums1.size()][nums2.size()]; } }; ``` @@ -110,11 +115,11 @@ public: ```python class Solution: - def maxUncrossedLines(self, A: List[int], B: List[int]) -> int: - dp = [[0] * (len(B)+1) for _ in range(len(A)+1)] - for i in range(1, len(A)+1): - for j in range(1, len(B)+1): - if A[i-1] == B[j-1]: + def maxUncrossedLines(self, nums1: List[int], nums2: List[int]) -> int: + dp = [[0] * (len(nums2)+1) for _ in range(len(nums1)+1)] + for i in range(1, len(nums1)+1): + for j in range(1, len(nums2)+1): + if nums1[i-1] == nums2[j-1]: dp[i][j] = dp[i-1][j-1] + 1 else: dp[i][j] = max(dp[i-1][j], dp[i][j-1]) @@ -124,23 +129,22 @@ class Solution: ### Go: ```go -func maxUncrossedLines(A []int, B []int) int { - m, n := len(A), len(B) - dp := make([][]int, m+1) +func maxUncrossedLines(nums1 []int, nums2 []int) int { + dp := make([][]int, len(nums1) + 1) for i := range dp { - dp[i] = make([]int, n+1) + dp[i] = make([]int, len(nums2) + 1) } - for i := 1; i <= len(A); i++ { - for j := 1; j <= len(B); j++ { - if (A[i - 1] == B[j - 1]) { + for i := 1; i <= len(nums1); i++ { + for j := 1; j <= len(nums2); j++ { + if (nums1[i - 1] == nums2[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] + return dp[len(nums1)][len(nums2)] } From 048ec95f07174e991fb0309200d5d14334957238 Mon Sep 17 00:00:00 2001 From: Lane Zhang Date: Mon, 21 Oct 2024 13:10:23 +0800 Subject: [PATCH 2878/3019] =?UTF-8?q?0232.=E7=94=A8=E6=A0=88=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0=E9=98=9F=E5=88=97.md=20=E6=97=B6=E9=97=B4=E5=A4=8D?= =?UTF-8?q?=E6=9D=82=E5=BA=A6=E5=BA=94=E4=B8=BAO(1)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" | 2 +- ...\217\214\346\214\207\351\222\210\346\200\273\347\273\223.md" | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git "a/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" "b/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" index 7017107bf8..657567cfdf 100644 --- "a/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" +++ "b/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" @@ -113,7 +113,7 @@ public: ``` -* 时间复杂度: push和empty为O(1), pop和peek为O(n) +* 时间复杂度: 都为O(1)。pop和peek看起来像O(n),实际上一个循环n会被使用n次,最后还是O(1)。 * 空间复杂度: O(n) diff --git "a/problems/\345\217\214\346\214\207\351\222\210\346\200\273\347\273\223.md" "b/problems/\345\217\214\346\214\207\351\222\210\346\200\273\347\273\223.md" index a77490cdfe..409e80ab98 100644 --- "a/problems/\345\217\214\346\214\207\351\222\210\346\200\273\347\273\223.md" +++ "b/problems/\345\217\214\346\214\207\351\222\210\346\200\273\347\273\223.md" @@ -77,7 +77,7 @@ for (int i = 0; i < array.size(); i++) { 时间复杂度可以做到O(n^2),但还是比较费时的,因为不好做剪枝操作。 -所以这道题目使用双指针法才是最为合适的,用双指针做这道题目才能就能真正体会到,**通过前后两个指针不算向中间逼近,在一个for循环下完成两个for循环的工作。** +所以这道题目使用双指针法才是最为合适的,用双指针做这道题目才能就能真正体会到,**通过前后两个指针不断向中间逼近,在一个for循环下完成两个for循环的工作。** 只用双指针法时间复杂度为O(n^2),但比哈希法的O(n^2)效率高得多,哈希法在使用两层for循环的时候,能做的剪枝操作很有限。 From e0c1e2e31784dfb13ea8f710ff216bcdccf5d3bf Mon Sep 17 00:00:00 2001 From: zhangrunzhe Date: Mon, 21 Oct 2024 19:02:33 +0800 Subject: [PATCH 2879/3019] =?UTF-8?q?=E9=9D=A2=E8=AF=95=E9=A2=9802.07.?= =?UTF-8?q?=E9=93=BE=E8=A1=A8=E7=9B=B8=E4=BA=A4=20Swift=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...76\350\241\250\347\233\270\344\272\244.md" | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git "a/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" "b/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" index b0f2e8eaea..48944b5e4e 100644 --- "a/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" +++ "b/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" @@ -535,6 +535,45 @@ public ListNode GetIntersectionNode(ListNode headA, ListNode headB) } ``` +### Swift: +```swift +func getIntersectionNode(_ headA: ListNode?, _ headB: ListNode?) -> ListNode? { + var lenA = 0 + var lenB = 0 + var nodeA = headA + var nodeB = headB + // 计算链表A和链表B的长度 + while nodeA != nil { + lenA += 1 + nodeA = nodeA?.next + } + while nodeB != nil { + lenB += 1 + nodeB = nodeB?.next + } + // 重置指针 + nodeA = headA + nodeB = headB + // 如果链表A更长,让它先走lenA-lenB步 + if lenA > lenB { + for _ in 0..<(lenA - lenB) { + nodeA = nodeA?.next + } + } else if lenB > lenA { + // 如果链表B更长,让它先走lenB-lenA步 + for _ in 0..<(lenB - lenA) { + nodeB = nodeB?.next + } + } + // 同时遍历两个链表,寻找交点 + while nodeA !== nodeB { + nodeA = nodeA?.next + nodeB = nodeB?.next + } + return nodeA +} +``` +

From fba159b1356bf4fe55658c05090b1b3ae7956e10 Mon Sep 17 00:00:00 2001 From: Lane Zhang Date: Tue, 22 Oct 2024 09:20:21 +0800 Subject: [PATCH 2880/3019] =?UTF-8?q?0239.=E6=BB=91=E5=8A=A8=E7=AA=97?= =?UTF-8?q?=E5=8F=A3=E6=9C=80=E5=A4=A7=E5=80=BC.md=20=E5=8A=A0=E5=85=A5=20?= =?UTF-8?q?Python=20=E7=89=88=E6=9C=AC=E8=A7=A3=E6=B3=95=E4=BA=8C=EF=BC=9A?= =?UTF-8?q?=E7=9B=B4=E6=8E=A5=E7=94=A8=E5=8D=95=E8=B0=83=E9=98=9F=E5=88=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...43\346\234\200\345\244\247\345\200\274.md" | 32 ++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git "a/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" "b/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" index 23bf615b4a..aae1b4d25a 100644 --- "a/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" +++ "b/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" @@ -299,7 +299,7 @@ class Solution { ``` ### Python: - +#### 解法一:使用自定义的单调队列类 ```python from collections import deque @@ -339,6 +339,36 @@ class Solution: return result ``` +#### 解法二:直接用单调队列 +```python +from collections import deque + + +class Solution: + def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]: + max_list = [] # 结果集合 + kept_nums = deque() # 单调队列 + + for i in range(len(nums)): + update_kept_nums(kept_nums, nums[i]) # 右侧新元素加入 + + if i >= k and nums[i - k] == kept_nums[0]: # 左侧旧元素如果等于单调队列头元素,需要移除头元素 + kept_nums.popleft() + + if i >= k - 1: + max_list.append(kept_nums[0]) + + return max_list + + +def update_kept_nums(kept_nums, num): # num 是新加入的元素 + # 所有小于新元素的队列尾部元素,在新元素出现后,都是没有价值的,都需要被移除 + while kept_nums and num > kept_nums[-1]: + kept_nums.pop() + + kept_nums.append(num) +``` + ### Go: ```go From e5ebc38dddeb6a356f892d7e3d930f9f257790b1 Mon Sep 17 00:00:00 2001 From: Kristy-an Date: Mon, 21 Oct 2024 21:12:06 -0500 Subject: [PATCH 2881/3019] fix python block code highlight problem --- ...70\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" "b/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" index 5751bb9171..056b7096c0 100644 --- "a/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" +++ "b/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" @@ -185,7 +185,7 @@ class Solution: > 版本二:针对版本一的优化 -```python3 +```python class Solution: def nextGreaterElements(self, nums: List[int]) -> List[int]: res = [-1] * len(nums) From 97c4d1baec4789f7fe8aa656b459fc63509548a7 Mon Sep 17 00:00:00 2001 From: Lane Zhang Date: Tue, 22 Oct 2024 10:22:27 +0800 Subject: [PATCH 2882/3019] =?UTF-8?q?0239.=E6=BB=91=E5=8A=A8=E7=AA=97?= =?UTF-8?q?=E5=8F=A3=E6=9C=80=E5=A4=A7=E5=80=BC.md=20=E5=8A=A0=E5=85=A5=20?= =?UTF-8?q?Python=20=E7=89=88=E6=9C=AC=E6=96=B0=E8=A7=A3=E6=B3=95=EF=BC=9A?= =?UTF-8?q?=E7=94=A8"=E5=A0=86=E6=8E=92=E5=BA=8F"=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...43\346\234\200\345\244\247\345\200\274.md" | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git "a/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" "b/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" index 23bf615b4a..2db1942afb 100644 --- "a/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" +++ "b/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" @@ -339,6 +339,32 @@ class Solution: return result ``` +#### 新解法:用"堆排序"实现 +* 时间复杂度:`O(n * log(n))`, 比`单调队列`解法要慢。 + +```python +import heapq + + +class Solution: + def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]: + results = [] + num_index_list = [] # 将用“堆排序”对它进行排序,元素为 (num, index) 元组 + + for i in range(len(nums)): + # 把 nums[i] 值取负数,最大的就到最小,合乎 Python 堆排序从小到大的规则。 + # 还要把 index (i) 存入,因为通过 i 可知道对应的 num 何时不能再被使用(num 已经处在左侧窗口的更左边) + heapq.heappush(num_index_list, (-nums[i], i)) + # num_index_list[0]是最小值所在 tuple;'<= i - k' 表示 num 已经处在左侧窗口的更左边 + while num_index_list[0][1] <= i - k: # while 表示所有过气 num 都要丢弃 + heapq.heappop(num_index_list) # 丢弃最小值 + + if i >= k - 1: + results.append(-num_index_list[0][0]) # 第一个就是最小值,负最小值就是最大值,加入结果集 + + return results +``` + ### Go: ```go From ad93277357f14ab7a7436c8ee92c74e65fb37fd3 Mon Sep 17 00:00:00 2001 From: Kuxry Date: Tue, 22 Oct 2024 11:46:28 +0900 Subject: [PATCH 2883/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20203.=E7=A7=BB?= =?UTF-8?q?=E9=99=A4=E9=93=BE=E8=A1=A8=E5=85=83=E7=B4=A0=20Ruby=20?= =?UTF-8?q?=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...76\350\241\250\345\205\203\347\264\240.md" | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git "a/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" "b/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" index f6b5ef6dbb..c2f1d44910 100644 --- "a/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" +++ "b/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" @@ -737,7 +737,45 @@ public class Solution } } ``` +### Ruby# + +```ruby +# 定义链表节点 +class ListNode + attr_accessor :val, :next + def initialize(val = 0, _next = nil) + @val = val + @next = _next + end +end + +# 删除链表中值为 val 的节点 +def remove_elements(head, val) + # 创建一个虚拟头节点,这样可以简化删除头节点的处理 + # 虚拟头节点的值为 0,指向当前链表的头节点 + dummy = ListNode.new(0) + dummy.next = head + + # 初始化当前节点为虚拟头节点 + current = dummy + + # 遍历链表,直到当前节点的下一个节点为空 + while current.next + # 如果当前节点的下一个节点的值等于 val + if current.next.val == val + # 跳过该节点,即将当前节点的 next 指向下一个节点的 next + current.next = current.next.next + else + # 否则继续遍历,当前节点向前移动 + current = current.next + end + end + + # 返回删除 val 后的新链表的头节点,虚拟头节点的 next 就是新的头节点 + dummy.next +end +```

From 6e6093752fb67bbcd9d67211013c1d6ac740e0b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lane=20Zhang=20=28=E5=BC=A0=E5=81=A5=29?= Date: Tue, 22 Oct 2024 11:00:13 +0800 Subject: [PATCH 2884/3019] =?UTF-8?q?Update=200239.=E6=BB=91=E5=8A=A8?= =?UTF-8?q?=E7=AA=97=E5=8F=A3=E6=9C=80=E5=A4=A7=E5=80=BC.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change `O(n * log(n))` to `O(n log(n))` --- ...\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" "b/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" index 2db1942afb..95c38acb2f 100644 --- "a/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" +++ "b/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" @@ -340,7 +340,7 @@ class Solution: ``` #### 新解法:用"堆排序"实现 -* 时间复杂度:`O(n * log(n))`, 比`单调队列`解法要慢。 +* 时间复杂度:`O(n log(n))`, 比`单调队列`解法要慢。 ```python import heapq From 82468b6f2ae5e399306e3deedb0af540671b5417 Mon Sep 17 00:00:00 2001 From: markwang Date: Tue, 22 Oct 2024 11:31:15 +0800 Subject: [PATCH 2885/3019] =?UTF-8?q?583.=E4=B8=A4=E4=B8=AA=E5=AD=97?= =?UTF-8?q?=E7=AC=A6=E4=B8=B2=E7=9A=84=E5=88=A0=E9=99=A4=E6=93=8D=E4=BD=9C?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0Go=E5=8A=A8=E6=80=81=E8=A7=84=E5=88=92?= =?UTF-8?q?=E4=BA=8C=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...40\351\231\244\346\223\215\344\275\234.md" | 33 ++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git "a/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" "b/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" index 14a55631e6..57bd3abea6 100644 --- "a/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" +++ "b/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" @@ -33,7 +33,7 @@ dp[i][j]:以i-1为结尾的字符串word1,和以j-1位结尾的字符串word2,想要达到相等,所需要删除元素的最少次数。 -这里dp数组的定义有点点绕,大家要撸清思路。 +这里dp数组的定义有点点绕,大家要理清思路。 2. 确定递推公式 @@ -255,6 +255,8 @@ class Solution(object): ``` ### Go: +动态规划一 + ```go func minDistance(word1 string, word2 string) int { dp := make([][]int, len(word1)+1) @@ -287,6 +289,35 @@ func min(a, b int) int { return b } ``` + +动态规划二 + +```go +func minDistance(word1 string, word2 string) int { + dp := make([][]int, len(word1) + 1) + for i := range dp { + dp[i] = make([]int, len(word2) + 1) + } + for i := 1; i <= len(word1); i++ { + for j := 1; j <= len(word2); j++ { + if word1[i-1] == word2[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 len(word1) + len(word2) - dp[len(word1)][len(word2)] * 2 +} + +func max(x, y int) int { + if x > y { + return x + } + return y +} +``` + ### Javascript: ```javascript From dcbd5b4674c763dd2e156318cee383a79861f954 Mon Sep 17 00:00:00 2001 From: Lane Zhang Date: Wed, 23 Oct 2024 10:07:56 +0800 Subject: [PATCH 2886/3019] =?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=A0=91=E7=9A=84?= =?UTF-8?q?=E9=80=92=E5=BD=92=E9=81=8D=E5=8E=86.md=20=E5=8E=BB=E6=8E=89=20?= =?UTF-8?q?Python=20=E7=89=88=E6=9C=AC=E4=B8=AD=E6=97=A0=E7=94=A8=E7=9A=84?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...32\204\350\277\255\344\273\243\351\201\215\345\216\206.md" | 4 +--- ...70\216\351\230\237\345\210\227\346\200\273\347\273\223.md" | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" index 5f59c38897..ba63d06b89 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" @@ -262,8 +262,6 @@ class Solution: # 中序遍历-迭代-LC94_二叉树的中序遍历 class Solution: def inorderTraversal(self, root: TreeNode) -> List[int]: - if not root: - return [] stack = [] # 不能提前将root结点加入stack中 result = [] cur = root @@ -280,7 +278,7 @@ class Solution: cur = cur.right return result ``` - ```python +```python # 后序遍历-迭代-LC145_二叉树的后序遍历 class Solution: diff --git "a/problems/\346\240\210\344\270\216\351\230\237\345\210\227\346\200\273\347\273\223.md" "b/problems/\346\240\210\344\270\216\351\230\237\345\210\227\346\200\273\347\273\223.md" index 113f4a06a3..df022c779b 100644 --- "a/problems/\346\240\210\344\270\216\351\230\237\345\210\227\346\200\273\347\273\223.md" +++ "b/problems/\346\240\210\344\270\216\351\230\237\345\210\227\346\200\273\347\273\223.md" @@ -107,7 +107,7 @@ cd a/b/c/../../ 设计单调队列的时候,pop,和push操作要保持如下规则: 1. pop(value):如果窗口移除的元素value等于单调队列的出口元素,那么队列弹出元素,否则不用任何操作 -2. push(value):如果push的元素value大于入口元素的数值,那么就将队列出口的元素弹出,直到push元素的数值小于等于队列入口元素的数值为止 +2. push(value):如果push的元素value大于入口元素的数值,那么就将队列入口的元素弹出,直到push元素的数值小于等于队列入口元素的数值为止 保持如上规则,每次窗口移动的时候,只要问que.front()就可以返回当前窗口的最大值。 From a36358e06868764fab05b2821497991aded21256 Mon Sep 17 00:00:00 2001 From: Lane Zhang Date: Wed, 23 Oct 2024 10:22:58 +0800 Subject: [PATCH 2887/3019] =?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=A0=91=E7=9A=84?= =?UTF-8?q?=E8=BF=AD=E4=BB=A3=E9=81=8D=E5=8E=86.md=20=E5=8A=A0=E5=85=A5=20?= =?UTF-8?q?Python=20=E7=89=88=E6=9C=AC=E7=9A=84=E5=90=8E=E5=BA=8F=E9=81=8D?= =?UTF-8?q?=E5=8E=86=E6=96=B0=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...55\344\273\243\351\201\215\345\216\206.md" | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" index 5f59c38897..00d24692d7 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" @@ -303,6 +303,44 @@ class Solution: return result[::-1] ``` +#### Python 后序遍历的迭代新解法: +* 本解法不同于前文介绍的`逆转前序遍历调整后的结果`,而是采用了对每个结点直接处理。 + +```python +class Solution: + def postorderTraversal(self, root: Optional[TreeNode]) -> List[int]: + values = [] + stack = [] + popped_nodes = set() # 记录值已经被收割了的 nodes + current = root + + while current or stack: + if current: # 一次处理完一个结点和他的左右儿子结点,不处理孙子结点,孙子结点由左右儿子等会分别处理。 + stack.append(current) # 入栈自己 + + if current.right: + stack.append(current.right) # 入栈右儿子 + + if current.left: # 因为栈是后进先出,后序是‘左右中’,所以后加左儿子 + stack.append(current.left) # 入栈左儿子 + + current = None # 会导致后面A处出栈 + continue + + node = stack.pop() # A处,出的是左儿子,如果无左儿子,出的就是右儿子,如果连右儿子也没有,出的就是自己了。 + + # 如果 node 是叶子结点,就可以收割了;如果左右儿子都已经被收割了,也可以收割 + if (node.left is None or node.left in popped_nodes) and \ + (node.right is None or node.right in popped_nodes): + popped_nodes.add(node) + values.append(node.val) + continue + + current = node # 不符合收割条件,说明 node 下还有未入栈的儿子,就去入栈 + + return values +``` + ### Go: > 迭代法前序遍历 From bf540436f290e509fa8ae5d77cb75f250c154866 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lane=20Zhang=20=28=E5=BC=A0=E5=81=A5=29?= Date: Wed, 23 Oct 2024 10:33:48 +0800 Subject: [PATCH 2888/3019] =?UTF-8?q?Update=20=E4=BA=8C=E5=8F=89=E6=A0=91?= =?UTF-8?q?=E7=9A=84=E8=BF=AD=E4=BB=A3=E9=81=8D=E5=8E=86.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...55\344\273\243\351\201\215\345\216\206.md" | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" index 00d24692d7..3b4b30fbae 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" @@ -240,14 +240,14 @@ class Solution { # 前序遍历-迭代-LC144_二叉树的前序遍历 class Solution: def preorderTraversal(self, root: TreeNode) -> List[int]: - # 根结点为空则返回空列表 + # 根节点为空则返回空列表 if not root: return [] stack = [root] result = [] while stack: node = stack.pop() - # 中结点先处理 + # 中节点先处理 result.append(node.val) # 右孩子先入栈 if node.right: @@ -264,19 +264,19 @@ class Solution: def inorderTraversal(self, root: TreeNode) -> List[int]: if not root: return [] - stack = [] # 不能提前将root结点加入stack中 + stack = [] # 不能提前将root节点加入stack中 result = [] cur = root while cur or stack: - # 先迭代访问最底层的左子树结点 + # 先迭代访问最底层的左子树节点 if cur: stack.append(cur) cur = cur.left - # 到达最左结点后处理栈顶结点 + # 到达最左节点后处理栈顶节点 else: cur = stack.pop() result.append(cur.val) - # 取栈顶元素右结点 + # 取栈顶元素右节点 cur = cur.right return result ``` @@ -291,7 +291,7 @@ class Solution: result = [] while stack: node = stack.pop() - # 中结点先处理 + # 中节点先处理 result.append(node.val) # 左孩子先入栈 if node.left: @@ -304,7 +304,7 @@ class Solution: ``` #### Python 后序遍历的迭代新解法: -* 本解法不同于前文介绍的`逆转前序遍历调整后的结果`,而是采用了对每个结点直接处理。 +* 本解法不同于前文介绍的`逆转前序遍历调整后的结果`,而是采用了对每个节点直接处理。 ```python class Solution: @@ -315,7 +315,7 @@ class Solution: current = root while current or stack: - if current: # 一次处理完一个结点和他的左右儿子结点,不处理孙子结点,孙子结点由左右儿子等会分别处理。 + if current: # 一次处理完一个节点和他的左右儿子节点,不处理孙子节点,孙子节点由左右儿子等会分别处理。 stack.append(current) # 入栈自己 if current.right: @@ -329,7 +329,7 @@ class Solution: node = stack.pop() # A处,出的是左儿子,如果无左儿子,出的就是右儿子,如果连右儿子也没有,出的就是自己了。 - # 如果 node 是叶子结点,就可以收割了;如果左右儿子都已经被收割了,也可以收割 + # 如果 node 是叶子节点,就可以收割了;如果左右儿子都已经被收割了,也可以收割 if (node.left is None or node.left in popped_nodes) and \ (node.right is None or node.right in popped_nodes): popped_nodes.add(node) From 8b7027f2b7e911f4474c9c4c545c3a031639e16f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lane=20Zhang=20=28=E5=BC=A0=E5=81=A5=29?= Date: Wed, 23 Oct 2024 12:30:11 +0800 Subject: [PATCH 2889/3019] =?UTF-8?q?Update=20=E4=BA=8C=E5=8F=89=E6=A0=91?= =?UTF-8?q?=E7=9A=84=E8=BF=AD=E4=BB=A3=E9=81=8D=E5=8E=86.md=20=E8=B0=83?= =?UTF-8?q?=E6=95=B4=E6=B3=A8=E9=87=8A=E5=86=85=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...32\204\350\277\255\344\273\243\351\201\215\345\216\206.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" index 3b4b30fbae..79b5492945 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" @@ -304,14 +304,14 @@ class Solution: ``` #### Python 后序遍历的迭代新解法: -* 本解法不同于前文介绍的`逆转前序遍历调整后的结果`,而是采用了对每个节点直接处理。 +* 本解法不同于前文介绍的`逆转前序遍历调整后的结果`,而是采用了对每个节点直接处理。这个实现方法在面试中不容易写出来,在下一节,我将改造本代码,奉上代码更简洁、更套路化、更容易实现的统一方法。 ```python class Solution: def postorderTraversal(self, root: Optional[TreeNode]) -> List[int]: values = [] stack = [] - popped_nodes = set() # 记录值已经被收割了的 nodes + popped_nodes = set() # 记录值已经被收割了的 nodes,这是关键,已经被收割的节点还在树中,还会被访问到,但逻辑上已经等同于 null 节点。 current = root while current or stack: From b8a4613c53be3d295cf8d56993284777927ca9f1 Mon Sep 17 00:00:00 2001 From: Lane Zhang Date: Wed, 23 Oct 2024 14:14:42 +0800 Subject: [PATCH 2890/3019] =?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=A0=91=E7=9A=84?= =?UTF-8?q?=E7=BB=9F=E4=B8=80=E8=BF=AD=E4=BB=A3=E6=B3=95.md=20=E5=8A=A0?= =?UTF-8?q?=E5=85=A5"Set=E6=A0=87=E8=AE=B0=E6=B3=95"=E5=92=8C=E7=9B=B8?= =?UTF-8?q?=E5=85=B3Python=E4=BB=A3=E7=A0=81=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...00\350\277\255\344\273\243\346\263\225.md" | 69 +++++++++++++++++-- 1 file changed, 65 insertions(+), 4 deletions(-) diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\347\273\237\344\270\200\350\277\255\344\273\243\346\263\225.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\347\273\237\344\270\200\350\277\255\344\273\243\346\263\225.md" index 13c507375b..a1ac9dd2b3 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\347\273\237\344\270\200\350\277\255\344\273\243\346\263\225.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\347\273\237\344\270\200\350\277\255\344\273\243\346\263\225.md" @@ -27,7 +27,12 @@ **那我们就将访问的节点放入栈中,把要处理的节点也放入栈中但是要做标记。** -如何标记呢,**就是要处理的节点放入栈之后,紧接着放入一个空指针作为标记。** 这种方法也可以叫做标记法。 +如何标记呢? + +* 方法一:**就是要处理的节点放入栈之后,紧接着放入一个空指针作为标记。** 这种方法可以叫做`空指针标记法`。 + +* 方法二:**当一个节点被`pop()`后,把该节点放入一个`Set`中,表示该节点被处理过了,下次再处理这个节点时,直接收割。** +这种方法可以叫做`Set标记法`,样例代码见下文`Python Set标记法`。 方法二更容易理解,在面试中更容易写出来。 ### 迭代法中序遍历 @@ -234,7 +239,7 @@ class Solution { ### Python: -迭代法前序遍历: +> 迭代法前序遍历(空指针标记法): ```python class Solution: def preorderTraversal(self, root: TreeNode) -> List[int]: @@ -257,7 +262,7 @@ class Solution: return result ``` -迭代法中序遍历: +> 迭代法中序遍历(空指针标记法): ```python class Solution: def inorderTraversal(self, root: TreeNode) -> List[int]: @@ -282,7 +287,7 @@ class Solution: return result ``` -迭代法后序遍历: +> 迭代法后序遍历(空指针标记法): ```python class Solution: def postorderTraversal(self, root: TreeNode) -> List[int]: @@ -306,6 +311,62 @@ class Solution: return result ``` +> 中序遍历,统一迭代(Set标记法): +```python +class Solution: + def inorderTraversal(self, root: Optional[TreeNode]) -> List[int]: + values = [] + stack = [] if root is None else [root] + popped_nodes = set() # 用于记录一个节点是否被 pop() 过 + + while stack: + node = stack.pop() + # 说明节点是之前被pop过又被加回来,现在又要出栈,就可以直接收割了, + # 因为节点的左右儿子已经按次序入栈,节点的使命已经完成。 + if node in popped_nodes: + values.append(node.val) + continue + + popped_nodes.add(node) # 记录第一次出栈,第一次出栈的目的是为了把左右儿子和自己按次序入栈 + + if node.right: # 中序遍历是'左中右',右儿子最先入栈,最后出栈 + stack.append(node.right) + + stack.append(node) # 把自己加回到栈中,位置居中 + + if node.left: + stack.append(node.left) # 左儿子最后入栈,最先出栈 + + return values +``` + +> 后序遍历,统一迭代(Set标记法): +```python +class Solution: + def postorderTraversal(self, root: Optional[TreeNode]) -> List[int]: + values = [] + stack = [] if root is None else [root] + popped_nodes = set() # 用于记录一个节点是否被 pop() 过 + + while stack: + node = stack.pop() + # 说明节点是之前被pop过又被加回来,现在又要出栈,就可以直接收割了, + # 因为节点的左右儿子已经按次序入栈,节点的使命已经完成。 + if node in popped_nodes: + values.append(node.val) + continue + + popped_nodes.add(node) # 记录第一次出栈,第一次出栈的目的是为了把左右儿子和自己按次序入栈 + + stack.append(node) # 后序遍历是'左右中',节点自己最先入栈,最后出栈 + + if node.right: + stack.append(node.right) # 右儿子位置居中 + + if node.left: + stack.append(node.left) # 左儿子最后入栈,最先出栈 +``` + ### Go: > 前序遍历统一迭代法 From 6eb35a973796c440fde91ae5ef66fe75c1dfb426 Mon Sep 17 00:00:00 2001 From: markwang Date: Wed, 23 Oct 2024 16:19:36 +0800 Subject: [PATCH 2891/3019] =?UTF-8?q?503.=E4=B8=8B=E4=B8=80=E4=B8=AA?= =?UTF-8?q?=E6=9B=B4=E5=A4=A7=E5=85=83=E7=B4=A0II=E5=A2=9E=E5=8A=A0Go?= =?UTF-8?q?=E7=89=88=E6=9C=AC=E4=B8=80=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\345\244\247\345\205\203\347\264\240II.md" | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git "a/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" "b/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" index 5751bb9171..fdbdc1cf3c 100644 --- "a/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" +++ "b/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" @@ -213,6 +213,40 @@ class Solution: ### Go: ```go +// 版本一 +func nextGreaterElements(nums []int) []int { + // 拼接一个新的nums + numsNew := make([]int, len(nums) * 2) + copy(numsNew, nums) + copy(numsNew[len(nums):], nums) + // 用新的nums大小来初始化result + result := make([]int, len(numsNew)) + for i := range result { + result[i] = -1 + } + + // 开始单调栈 + st := []int{0} + for i := 1; i < len(numsNew); i++ { + if numsNew[i] < numsNew[st[len(st)-1]] { + st = append(st, i) + } else if numsNew[i] == numsNew[st[len(st)-1]] { + st = append(st, i) + } else { + for len(st) > 0 && numsNew[i] > numsNew[st[len(st)-1]] { + result[st[len(st)-1]] = numsNew[i] + st = st[:len(st)-1] + } + st = append(st, i) + } + } + result = result[:len(result)/2] + return result +} +``` + +```go +// 版本二 func nextGreaterElements(nums []int) []int { length := len(nums) result := make([]int,length) From 46bb8d64082111260b0f5e8042443ce257c95d9c Mon Sep 17 00:00:00 2001 From: Leehouc <152672308+Leehouc@users.noreply.github.com> Date: Wed, 23 Oct 2024 20:26:42 +0800 Subject: [PATCH 2892/3019] =?UTF-8?q?=E9=94=99=E5=AD=97=200669.=E4=BF=AE?= =?UTF-8?q?=E5=89=AA=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 --- ...\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0669.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0669.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" index aef8465943..325733862c 100644 --- "a/problems/0669.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" +++ "b/problems/0669.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" @@ -22,7 +22,7 @@ ## 算法公开课 -**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[你修剪的方式不对,我来给你纠正一下!| LeetCode:669. 修剪二叉搜索树](https://www.bilibili.com/video/BV17P41177ud?share_source=copy_web),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[你修剪的方式不对,我来给你纠正一下!| LeetCode:669. 修剪二叉搜索树](https://www.bilibili.com/video/BV17P41177ud?share_source=copy_web),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 ## 思路 From 83565ed41768333098fe78694f9990b280f64879 Mon Sep 17 00:00:00 2001 From: Leehouc <152672308+Leehouc@users.noreply.github.com> Date: Wed, 23 Oct 2024 20:28:57 +0800 Subject: [PATCH 2893/3019] =?UTF-8?q?=E9=94=99=E5=AD=970450.=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.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" "b/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" index f6057f44a5..cab9880af0 100644 --- "a/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" +++ "b/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" @@ -26,7 +26,7 @@ ## 算法公开课 -**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[调整二叉树的结构最难!| LeetCode:450.删除二叉搜索树中的节点](https://www.bilibili.com/video/BV1tP41177us?share_source=copy_web),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[调整二叉树的结构最难!| LeetCode:450.删除二叉搜索树中的节点](https://www.bilibili.com/video/BV1tP41177us?share_source=copy_web),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 ## 思路 From 0c674bb9179b06aa055fb0c10d3432f985b12f28 Mon Sep 17 00:00:00 2001 From: Leehouc <152672308+Leehouc@users.noreply.github.com> Date: Wed, 23 Oct 2024 20:31:04 +0800 Subject: [PATCH 2894/3019] =?UTF-8?q?Update=200235.=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=90=9C=E7=B4=A2=E6=A0=91=E7=9A=84=E6=9C=80=E8=BF=91=E5=85=AC?= =?UTF-8?q?=E5=85=B1=E7=A5=96=E5=85=88.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" "b/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" index 597c2dffd3..192bb031dc 100644 --- "a/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" +++ "b/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" @@ -38,7 +38,7 @@ ## 算法公开课 -**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[二叉搜索树找祖先就有点不一样了!| 235. 二叉搜索树的最近公共祖先](https://www.bilibili.com/video/BV1Zt4y1F7ww?share_source=copy_web),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[二叉搜索树找祖先就有点不一样了!| 235. 二叉搜索树的最近公共祖先](https://www.bilibili.com/video/BV1Zt4y1F7ww?share_source=copy_web),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 ## 思路 From 041ac6bbdc0da8d557702d2fac7c51f6b1e7c8c4 Mon Sep 17 00:00:00 2001 From: Leehouc <152672308+Leehouc@users.noreply.github.com> Date: Wed, 23 Oct 2024 20:31:48 +0800 Subject: [PATCH 2895/3019] =?UTF-8?q?Update=200530.=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=90=9C=E7=B4=A2=E6=A0=91=E7=9A=84=E6=9C=80=E5=B0=8F=E7=BB=9D?= =?UTF-8?q?=E5=AF=B9=E5=B7=AE.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" "b/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" index 7fe64ad21d..2533a618ed 100644 --- "a/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" +++ "b/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" @@ -21,7 +21,7 @@ ## 算法公开课 -**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[二叉搜索树中,需要掌握如何双指针遍历!| LeetCode:530.二叉搜索树的最小绝对差](https://www.bilibili.com/video/BV1DD4y11779),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[二叉搜索树中,需要掌握如何双指针遍历!| LeetCode:530.二叉搜索树的最小绝对差](https://www.bilibili.com/video/BV1DD4y11779),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 ## 思路 From 12236fa616878d49799cd0d6606d8a7f0d026ff8 Mon Sep 17 00:00:00 2001 From: Leehouc <152672308+Leehouc@users.noreply.github.com> Date: Wed, 23 Oct 2024 20:32:25 +0800 Subject: [PATCH 2896/3019] =?UTF-8?q?Update=200098.=E9=AA=8C=E8=AF=81?= =?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 --- ...\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" index 023eeea50a..fb4ca7d88d 100644 --- "a/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" +++ "b/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" @@ -22,7 +22,7 @@ ## 算法公开课 -**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[你对二叉搜索树了解的还不够! | LeetCode:98.验证二叉搜索树](https://www.bilibili.com/video/BV18P411n7Q4),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[你对二叉搜索树了解的还不够! | LeetCode:98.验证二叉搜索树](https://www.bilibili.com/video/BV18P411n7Q4),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 ## 思路 From 779c16ca104556d442ddf23501026528495eb3a5 Mon Sep 17 00:00:00 2001 From: Leehouc <152672308+Leehouc@users.noreply.github.com> Date: Wed, 23 Oct 2024 20:32:53 +0800 Subject: [PATCH 2897/3019] =?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 --- ...\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" "b/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" index 93b3fb5400..c89f8031e8 100644 --- "a/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" +++ "b/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" @@ -35,7 +35,7 @@ ## 算法公开课 -**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[不仅双指针,还有代码技巧可以惊艳到你! | LeetCode:501.二叉搜索树中的众数](https://www.bilibili.com/video/BV1fD4y117gp),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[不仅双指针,还有代码技巧可以惊艳到你! | LeetCode:501.二叉搜索树中的众数](https://www.bilibili.com/video/BV1fD4y117gp),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 ## 思路 From 2d62182265b9825f0eed8a451f1119558867db46 Mon Sep 17 00:00:00 2001 From: Leehouc <152672308+Leehouc@users.noreply.github.com> Date: Wed, 23 Oct 2024 20:35:56 +0800 Subject: [PATCH 2898/3019] =?UTF-8?q?Update=200236.=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=A0=91=E7=9A=84=E6=9C=80=E8=BF=91=E5=85=AC=E5=85=B1=E7=A5=96?= =?UTF-8?q?=E5=85=88.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" "b/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" index 2e94f7a7e3..8572ec2d5f 100644 --- "a/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" +++ "b/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" @@ -36,7 +36,7 @@ ## 算法公开课 -**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[自底向上查找,有点难度! | LeetCode:236. 二叉树的最近公共祖先](https://www.bilibili.com/video/BV1jd4y1B7E2),相信结合视频在看本篇题解,更有助于大家对本题的理解**。 +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[自底向上查找,有点难度! | LeetCode:236. 二叉树的最近公共祖先](https://www.bilibili.com/video/BV1jd4y1B7E2),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 ## 思路 From a8ac9f9ae075115972ee5bf578890eb4198e4e2c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lane=20Zhang=20=28=E5=BC=A0=E5=81=A5=29?= Date: Thu, 24 Oct 2024 09:15:07 +0800 Subject: [PATCH 2899/3019] =?UTF-8?q?Update=20=E4=BA=8C=E5=8F=89=E6=A0=91?= =?UTF-8?q?=E7=9A=84=E7=BB=9F=E4=B8=80=E8=BF=AD=E4=BB=A3=E6=B3=95.md=20?= =?UTF-8?q?=E5=BE=AE=E8=B0=83=20stack=20=E8=B5=8B=E5=80=BC=E8=AF=AD?= =?UTF-8?q?=E5=8F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...73\237\344\270\200\350\277\255\344\273\243\346\263\225.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\347\273\237\344\270\200\350\277\255\344\273\243\346\263\225.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\347\273\237\344\270\200\350\277\255\344\273\243\346\263\225.md" index a1ac9dd2b3..3a74a9327b 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\347\273\237\344\270\200\350\277\255\344\273\243\346\263\225.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\347\273\237\344\270\200\350\277\255\344\273\243\346\263\225.md" @@ -316,7 +316,7 @@ class Solution: class Solution: def inorderTraversal(self, root: Optional[TreeNode]) -> List[int]: values = [] - stack = [] if root is None else [root] + stack = [root] if root else [] popped_nodes = set() # 用于记录一个节点是否被 pop() 过 while stack: @@ -345,7 +345,7 @@ class Solution: class Solution: def postorderTraversal(self, root: Optional[TreeNode]) -> List[int]: values = [] - stack = [] if root is None else [root] + stack = [root] if root else [] popped_nodes = set() # 用于记录一个节点是否被 pop() 过 while stack: From 775accb7fdb783c2ec253c59c4e387c852a22166 Mon Sep 17 00:00:00 2001 From: Lane Zhang Date: Thu, 24 Oct 2024 10:41:30 +0800 Subject: [PATCH 2900/3019] =?UTF-8?q?0226.=E7=BF=BB=E8=BD=AC=E4=BA=8C?= =?UTF-8?q?=E5=8F=89=E6=A0=91.md=20=E4=BF=AE=E6=AD=A3=E5=87=A0=E5=A4=84=20?= =?UTF-8?q?Python=20=E4=BB=A3=E7=A0=81=E4=B8=8D=E4=B8=A5=E8=B0=A8=E8=AF=B4?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...54\344\272\214\345\217\211\346\240\221.md" | 40 ++++++++----------- 1 file changed, 17 insertions(+), 23 deletions(-) diff --git "a/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" "b/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" index e501b29878..285f971adb 100644 --- "a/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" @@ -81,7 +81,7 @@ if (root == NULL) return root; 3. 确定单层递归的逻辑 -因为是先前序遍历,所以先进行交换左右孩子节点,然后反转左子树,反转右子树。 +因为是前序遍历,所以先进行交换左右孩子节点,然后反转左子树,反转右子树。 ```cpp swap(root->left, root->right); @@ -348,14 +348,13 @@ class Solution: while stack: node = stack.pop() node.left, node.right = node.right, node.left + if node.right: + stack.append(node.right) if node.left: stack.append(node.left) - if node.right: - stack.append(node.right) return root ``` - 递归法:中序遍历: ```python # Definition for a binary tree node. @@ -374,7 +373,7 @@ class Solution: return root ``` -迭代法:中序遍历: +迭代法,伪中序遍历(结果是对的,看起来像是中序遍历,实际上它是前序遍历,只不过把中间节点处理逻辑放到了中间。还是要用'统一写法'才是真正的中序遍历): ```python # Definition for a binary tree node. # class TreeNode: @@ -386,18 +385,17 @@ class Solution: def invertTree(self, root: TreeNode) -> TreeNode: if not root: return None - stack = [root] + stack = [root] while stack: - node = stack.pop() - if node.left: - stack.append(node.left) - node.left, node.right = node.right, node.left - if node.left: - stack.append(node.left) + node = stack.pop() + if node.right: + stack.append(node.right) + node.left, node.right = node.right, node.left # 放到中间,依然是前序遍历 + if node.right: + stack.append(node.right) return root ``` - 递归法:后序遍历: ```python # Definition for a binary tree node. @@ -416,7 +414,7 @@ class Solution: return root ``` -迭代法:后序遍历: +迭代法,伪后序遍历(结果是对的,看起来像是后序遍历,实际上它是前序遍历,只不过把中间节点处理逻辑放到了最后。还是要用'统一写法'才是真正的后序遍历): ```python # Definition for a binary tree node. # class TreeNode: @@ -427,23 +425,19 @@ class Solution: class Solution: def invertTree(self, root: TreeNode) -> TreeNode: if not root: - return None - stack = [root] + return None + stack = [root] while stack: - node = stack.pop() + node = stack.pop() + if node.right: + stack.append(node.right) if node.left: stack.append(node.left) - if node.right: - stack.append(node.right) node.left, node.right = node.right, node.left return root ``` - - - - 迭代法:广度优先遍历(层序遍历): ```python # Definition for a binary tree node. From 2ddf04ff1432c5a3f0fdf81061913a5c7fcccd47 Mon Sep 17 00:00:00 2001 From: zhangrunzhe Date: Thu, 24 Oct 2024 18:04:48 +0800 Subject: [PATCH 2901/3019] =?UTF-8?q?=E5=8F=B3=E6=97=8B=E5=AD=97=E7=AC=A6?= =?UTF-8?q?=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 --- ...13\345\255\227\347\254\246\344\270\262.md" | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git "a/problems/kamacoder/0055.\345\217\263\346\227\213\345\255\227\347\254\246\344\270\262.md" "b/problems/kamacoder/0055.\345\217\263\346\227\213\345\255\227\347\254\246\344\270\262.md" index 363d9ffa1b..2b32cb44d2 100644 --- "a/problems/kamacoder/0055.\345\217\263\346\227\213\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/kamacoder/0055.\345\217\263\346\227\213\345\255\227\347\254\246\344\270\262.md" @@ -350,7 +350,29 @@ function reverseStr(s, start, end) { ### Swift: +```swift +func rotateWords(_ s: String, _ k: Int) -> String { + var chars = Array(s) + // 先反转整体 + reverseWords(&chars, start: 0, end: s.count - 1) + // 反转前半段 + reverseWords(&chars, start: 0, end: k - 1) + // 反转后半段 + reverseWords(&chars, start: k, end: s.count - 1) + return String(chars) +} +// 反转start...end 的字符数组 +func reverseWords(_ chars: inout [Character], start: Int, end: Int) { + var left = start + var right = end + while left < right, right < chars.count { + (chars[left], chars[right]) = (chars[right], chars[left]) + left += 1 + right -= 1 + } +} +``` ### PHP: From d64a5359383d7d1fe399b33f2319f7253cd131f7 Mon Sep 17 00:00:00 2001 From: HONGYAN ZHAO Date: Thu, 24 Oct 2024 21:07:17 -0500 Subject: [PATCH 2902/3019] Debug python version, change strip() to split() --- ...62\233\347\232\204\346\200\273\351\235\242\347\247\257.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/problems/kamacoder/0101.\345\255\244\345\262\233\347\232\204\346\200\273\351\235\242\347\247\257.md" "b/problems/kamacoder/0101.\345\255\244\345\262\233\347\232\204\346\200\273\351\235\242\347\247\257.md" index 26c92c07a6..408501ff84 100644 --- "a/problems/kamacoder/0101.\345\255\244\345\262\233\347\232\204\346\200\273\351\235\242\347\247\257.md" +++ "b/problems/kamacoder/0101.\345\255\244\345\262\233\347\232\204\346\200\273\351\235\242\347\247\257.md" @@ -261,10 +261,10 @@ public class Main { from collections import deque # 处理输入 -n, m = list(map(int, input().strip())) +n, m = list(map(int, input().split())) g = [] for _ in range(n): - row = list(map(int, input().strip())) + row = list(map(int, input().split())) g.append(row) # 定义四个方向、孤岛面积(遍历完边缘后会被重置) From 492f45f53d6e46bfed1d91cc91fe0a3d91964ead Mon Sep 17 00:00:00 2001 From: HONGYAN ZHAO Date: Thu, 24 Oct 2024 21:08:52 -0500 Subject: [PATCH 2903/3019] debug python version, set visited[x][y] to True in the beginning of bfs --- ...7\232\204\346\225\260\351\207\217\345\271\277\346\220\234.md" | 1 + 1 file changed, 1 insertion(+) diff --git "a/problems/kamacoder/0099.\345\262\233\345\261\277\347\232\204\346\225\260\351\207\217\345\271\277\346\220\234.md" "b/problems/kamacoder/0099.\345\262\233\345\261\277\347\232\204\346\225\260\351\207\217\345\271\277\346\220\234.md" index 9d31c92268..522e19c398 100644 --- "a/problems/kamacoder/0099.\345\262\233\345\261\277\347\232\204\346\225\260\351\207\217\345\271\277\346\220\234.md" +++ "b/problems/kamacoder/0099.\345\262\233\345\261\277\347\232\204\346\225\260\351\207\217\345\271\277\346\220\234.md" @@ -254,6 +254,7 @@ directions = [[0, 1], [1, 0], [0, -1], [-1, 0]] def bfs(grid, visited, x, y): que = deque([]) que.append([x,y]) + visited[x][y] = True while que: cur_x, cur_y = que.popleft() for i, j in directions: From b9a060f195f704a09b7acf50e3ff36cb090471d0 Mon Sep 17 00:00:00 2001 From: Captainzw <80784797+Captain-zhangw@users.noreply.github.com> Date: Sat, 26 Oct 2024 20:16:14 +0800 Subject: [PATCH 2904/3019] =?UTF-8?q?=E4=BF=AE=E6=94=B9=20README.md?= =?UTF-8?q?=E4=B8=AD=20=E2=80=9Cbellman=5Fford=E4=B9=8B=E5=8D=95=E6=BA=90?= =?UTF-8?q?=E6=9C=89=E9=99=90=E6=9C=80=E7=9F=AD=E8=B7=AF=E2=80=9D=E7=9A=84?= =?UTF-8?q?=E9=94=99=E8=AF=AF=E9=93=BE=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 3bb575d1a6..d1f4f3a8be 100644 --- a/README.md +++ b/README.md @@ -400,7 +400,7 @@ 24. [图论:Bellman_ford 算法](./problems/kamacoder/0094.城市间货物运输I.md) 25. [图论:Bellman_ford 队列优化算法(又名SPFA)](./problems/kamacoder/0094.城市间货物运输I-SPFA.md) 26. [图论:Bellman_ford之判断负权回路](./problems/kamacoder/0095.城市间货物运输II.md) -27. [图论:Bellman_ford之单源有限最短路](./problems/kamacoder/0095.城市间货物运输II.md) +27. [图论:Bellman_ford之单源有限最短路](./problems/kamacoder/0096.城市间货物运输III.md) 28. [图论:Floyd 算法](./problems/kamacoder/0097.小明逛公园.md) 29. [图论:A * 算法](./problems/kamacoder/0126.骑士的攻击astar.md) 30. [图论:最短路算法总结篇](./problems/kamacoder/最短路问题总结篇.md) From 74909977cd13549da4368f09b550da2474f1c807 Mon Sep 17 00:00:00 2001 From: Captainzw <80784797+Captain-zhangw@users.noreply.github.com> Date: Sat, 26 Oct 2024 20:31:53 +0800 Subject: [PATCH 2905/3019] =?UTF-8?q?=E4=BF=AE=E6=94=B9=200096.=E5=9F=8E?= =?UTF-8?q?=E5=B8=82=E9=97=B4=E8=B4=A7=E7=89=A9=E8=BF=90=E8=BE=93III.md=20?= =?UTF-8?q?=E4=B8=AD=E7=9A=84=E9=94=99=E8=AF=AF=E9=93=BE=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...47\347\211\251\350\277\220\350\276\223III.md" | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git "a/problems/kamacoder/0096.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223III.md" "b/problems/kamacoder/0096.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223III.md" index 567a1d8724..1facf7b2e9 100644 --- "a/problems/kamacoder/0096.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223III.md" +++ "b/problems/kamacoder/0096.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223III.md" @@ -51,15 +51,15 @@ ## 思路 -本题为单源有限最短路问题,同样是 [kama94.城市间货物运输I](./kama94.城市间货物运输I.md) 延伸题目。 +本题为单源有限最短路问题,同样是 [kama94.城市间货物运输I](./0094.城市间货物运输I.md) 延伸题目。 注意题目中描述是 **最多经过 k 个城市的条件下,而不是一定经过k个城市,也可以经过的城市数量比k小,但要最短的路径**。 -在 [kama94.城市间货物运输I](./kama94.城市间货物运输I.md) 中我们讲了:**对所有边松弛一次,相当于计算 起点到达 与起点一条边相连的节点 的最短距离**。 +在 [kama94.城市间货物运输I](./0094.城市间货物运输I.md) 中我们讲了:**对所有边松弛一次,相当于计算 起点到达 与起点一条边相连的节点 的最短距离**。 节点数量为n,起点到终点,最多是 n-1 条边相连。 那么对所有边松弛 n-1 次 就一定能得到 起点到达 终点的最短距离。 -(如果对以上讲解看不懂,建议详看 [kama94.城市间货物运输I](./kama94.城市间货物运输I.md) ) +(如果对以上讲解看不懂,建议详看 [kama94.城市间货物运输I](./0094.城市间货物运输I.md) ) 本题是最多经过 k 个城市, 那么是 k + 1条边相连的节点。 这里可能有录友想不懂为什么是k + 1,来看这个图: @@ -71,7 +71,7 @@ 对所有边松弛一次,相当于计算 起点到达 与起点一条边相连的节点 的最短距离,那么对所有边松弛 k + 1次,就是求 起点到达 与起点k + 1条边相连的节点的 最短距离。 -**注意**: 本题是 [kama94.城市间货物运输I](./kama94.城市间货物运输I.md) 的拓展题,如果对 bellman_ford 没有深入了解,强烈建议先看 [kama94.城市间货物运输I](./kama94.城市间货物运输I.md) 再做本题。 +**注意**: 本题是 [kama94.城市间货物运输I](./0094.城市间货物运输I.md) 的拓展题,如果对 bellman_ford 没有深入了解,强烈建议先看 [kama94.城市间货物运输I](./0094.城市间货物运输I.md) 再做本题。 理解以上内容,其实本题代码就很容易了,bellman_ford 标准写法是松弛 n-1 次,本题就松弛 k + 1次就好。 @@ -366,19 +366,19 @@ int main() { ## 拓展二(本题本质) -那么前面讲解过的 [94.城市间货物运输I](./kama94.城市间货物运输I.md) 和 [95.城市间货物运输II](./kama95.城市间货物运输II.md) 也是bellman_ford经典算法,也没使用 minDist_copy,怎么就没问题呢? +那么前面讲解过的 [94.城市间货物运输I](./0094.城市间货物运输I.md) 和 [95.城市间货物运输II](./0095.城市间货物运输II.md) 也是bellman_ford经典算法,也没使用 minDist_copy,怎么就没问题呢? > 如果没看过我上面这两篇讲解的话,建议详细学习上面两篇,再看我下面讲的区别,否则容易看不懂。 -[94.城市间货物运输I](./kama94.城市间货物运输I.md), 是没有 负权回路的,那么 多松弛多少次,对结果都没有影响。 +[94.城市间货物运输I](./0094.城市间货物运输I.md), 是没有 负权回路的,那么 多松弛多少次,对结果都没有影响。 求 节点1 到 节点n 的最短路径,松弛n-1 次就够了,松弛 大于 n-1次,结果也不会变。 那么在对所有边进行第一次松弛的时候,如果基于 本次计算的 minDist 来计算 minDist (相当于多做松弛了),也是对最终结果没影响。 -[95.城市间货物运输II](./kama95.城市间货物运输II.md) 是判断是否有 负权回路,一旦有负权回路, 对所有边松弛 n-1 次以后,在做松弛 minDist 数值一定会变,根据这一点来判断是否有负权回路。 +[95.城市间货物运输II](./0095.城市间货物运输II.md) 是判断是否有 负权回路,一旦有负权回路, 对所有边松弛 n-1 次以后,在做松弛 minDist 数值一定会变,根据这一点来判断是否有负权回路。 -所以,[95.城市间货物运输II](./kama95.城市间货物运输II.md) 只需要判断minDist数值变化了就行,而 minDist 的数值对不对,并不是我们关心的。 +所以,[95.城市间货物运输II](./0095.城市间货物运输II.md) 只需要判断minDist数值变化了就行,而 minDist 的数值对不对,并不是我们关心的。 那么本题 为什么计算minDist 一定要基于上次 的 minDist 数值。 From 7cb657dc508465362d74b6133bd060c42eddf610 Mon Sep 17 00:00:00 2001 From: Captainzw <80784797+Captain-zhangw@users.noreply.github.com> Date: Sat, 26 Oct 2024 20:33:16 +0800 Subject: [PATCH 2906/3019] =?UTF-8?q?=E4=BF=AE=E6=94=B9=200095.=E5=9F=8E?= =?UTF-8?q?=E5=B8=82=E9=97=B4=E8=B4=A7=E7=89=A9=E8=BF=90=E8=BE=93II.md=20?= =?UTF-8?q?=E4=B8=AD=E7=9A=84=E9=94=99=E8=AF=AF=E9=93=BE=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...264\247\347\211\251\350\277\220\350\276\223II.md" | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git "a/problems/kamacoder/0095.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223II.md" "b/problems/kamacoder/0095.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223II.md" index edfd52e02d..ac6ccf3c0d 100644 --- "a/problems/kamacoder/0095.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223II.md" +++ "b/problems/kamacoder/0095.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223II.md" @@ -54,7 +54,7 @@ circle ## 思路 -本题是 [kama94.城市间货物运输I](./kama94.城市间货物运输I.md) 延伸题目。 +本题是 [kama94.城市间货物运输I](./0094.城市间货物运输I.md) 延伸题目。 本题是要我们判断 负权回路,也就是图中出现环且环上的边总权值为负数。 @@ -64,7 +64,7 @@ circle 接下来我们来看 如何使用 bellman_ford 算法来判断 负权回路。 -在 [kama94.城市间货物运输I](./kama94.城市间货物运输I.md) 中 我们讲了 bellman_ford 算法的核心就是一句话:对 所有边 进行 n-1 次松弛。 同时文中的 【拓展】部分, 我们也讲了 松弛n次以上 会怎么样? +在 [kama94.城市间货物运输I](./0094.城市间货物运输I.md) 中 我们讲了 bellman_ford 算法的核心就是一句话:对 所有边 进行 n-1 次松弛。 同时文中的 【拓展】部分, 我们也讲了 松弛n次以上 会怎么样? 在没有负权回路的图中,松弛 n 次以上 ,结果不会有变化。 @@ -72,7 +72,7 @@ circle 那么每松弛一次,都会更新最短路径,所以结果会一直有变化。 -(如果对于 bellman_ford 不了解的录友,建议详细看这里:[kama94.城市间货物运输I](./kama94.城市间货物运输I.md)) +(如果对于 bellman_ford 不了解的录友,建议详细看这里:[kama94.城市间货物运输I](./0094.城市间货物运输I.md)) 以上为理论分析,接下来我们再画图举例。 @@ -94,13 +94,13 @@ circle 如果在负权回路多绕两圈,三圈,无穷圈,那么我们的总成本就会无限小, 如果要求最小成本的话,你会发现本题就无解了。 -在 bellman_ford 算法中,松弛 n-1 次所有的边 就可以求得 起点到任何节点的最短路径,松弛 n 次以上,minDist数组(记录起到到其他节点的最短距离)中的结果也不会有改变 (如果对 bellman_ford 算法 不了解,也不知道 minDist 是什么,建议详看上篇讲解[kama94.城市间货物运输I](./kama94.城市间货物运输I.md)) +在 bellman_ford 算法中,松弛 n-1 次所有的边 就可以求得 起点到任何节点的最短路径,松弛 n 次以上,minDist数组(记录起到到其他节点的最短距离)中的结果也不会有改变 (如果对 bellman_ford 算法 不了解,也不知道 minDist 是什么,建议详看上篇讲解[kama94.城市间货物运输I](./0094.城市间货物运输I.md)) 而本题有负权回路的情况下,一直都会有更短的最短路,所以 松弛 第n次,minDist数组 也会发生改变。 -那么解决本题的 核心思路,就是在 [kama94.城市间货物运输I](./kama94.城市间货物运输I.md) 的基础上,再多松弛一次,看minDist数组 是否发生变化。 +那么解决本题的 核心思路,就是在 [kama94.城市间货物运输I](./0094.城市间货物运输I.md) 的基础上,再多松弛一次,看minDist数组 是否发生变化。 -代码和 [kama94.城市间货物运输I](./kama94.城市间货物运输I.md) 基本是一样的,如下:(关键地方已注释) +代码和 [kama94.城市间货物运输I](./0094.城市间货物运输I.md) 基本是一样的,如下:(关键地方已注释) ```CPP #include From 55963190f82417db91a09f6f8a0a9fa080e87059 Mon Sep 17 00:00:00 2001 From: htzhu Date: Sat, 26 Oct 2024 21:45:08 -0700 Subject: [PATCH 2907/3019] =?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 Python代码里大写的N会报错,把N改为了小写n。 --- ...36\347\232\204\346\225\260\345\255\227.md" | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git "a/problems/0738.\345\215\225\350\260\203\351\200\222\345\242\236\347\232\204\346\225\260\345\255\227.md" "b/problems/0738.\345\215\225\350\260\203\351\200\222\345\242\236\347\232\204\346\225\260\345\255\227.md" index 3d46d5ad04..be4411dd8c 100644 --- "a/problems/0738.\345\215\225\350\260\203\351\200\222\345\242\236\347\232\204\346\225\260\345\255\227.md" +++ "b/problems/0738.\345\215\225\350\260\203\351\200\222\345\242\236\347\232\204\346\225\260\345\255\227.md" @@ -190,9 +190,9 @@ class Solution: 贪心(版本一) ```python class Solution: - def monotoneIncreasingDigits(self, N: int) -> int: + def monotoneIncreasingDigits(self, n: int) -> int: # 将整数转换为字符串 - strNum = str(N) + strNum = str(n) # flag用来标记赋值9从哪里开始 # 设置为字符串长度,为了防止第二个for循环在flag没有被赋值的情况下执行 flag = len(strNum) @@ -216,9 +216,9 @@ class Solution: 贪心(版本二) ```python class Solution: - def monotoneIncreasingDigits(self, N: int) -> int: + def monotoneIncreasingDigits(self, n: int) -> int: # 将整数转换为字符串 - strNum = list(str(N)) + strNum = list(str(n)) # 从右往左遍历字符串 for i in range(len(strNum) - 1, 0, -1): @@ -238,9 +238,9 @@ class Solution: ```python class Solution: - def monotoneIncreasingDigits(self, N: int) -> int: + def monotoneIncreasingDigits(self, n: int) -> int: # 将整数转换为字符串 - strNum = list(str(N)) + strNum = list(str(n)) # 从右往左遍历字符串 for i in range(len(strNum) - 1, 0, -1): @@ -258,8 +258,8 @@ class Solution: ```python class Solution: - def monotoneIncreasingDigits(self, N: int) -> int: - strNum = str(N) + def monotoneIncreasingDigits(self, n: int) -> int: + strNum = str(n) for i in range(len(strNum) - 1, 0, -1): # 如果当前字符比前一个字符小,说明需要修改前一个字符 if strNum[i - 1] > strNum[i]: @@ -272,12 +272,12 @@ class Solution: ``` ### Go ```go -func monotoneIncreasingDigits(N int) int { +func monotoneIncreasingDigits(n int) int { s := strconv.Itoa(N)//将数字转为字符串,方便使用下标 ss := []byte(s)//将字符串转为byte数组,方便更改。 n := len(ss) if n <= 1 { - return N + return n } for i := n-1; i > 0; i-- { if ss[i-1] > ss[i] { //前一个大于后一位,前一位减1,后面的全部置为9 From e317e8761ea063ea8cbe88474c9c8ef7a7e954dc Mon Sep 17 00:00:00 2001 From: markwang Date: Mon, 28 Oct 2024 10:15:08 +0800 Subject: [PATCH 2908/3019] =?UTF-8?q?84.=E6=9F=B1=E7=8A=B6=E5=9B=BE?= =?UTF-8?q?=E4=B8=AD=E6=9C=80=E5=A4=A7=E7=9A=84=E7=9F=A9=E5=BD=A2=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0Go=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...47\347\232\204\347\237\251\345\275\242.md" | 123 +++++++++++++++++- 1 file changed, 122 insertions(+), 1 deletion(-) diff --git "a/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" "b/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" index c08a3045a5..5c6f407321 100644 --- "a/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" +++ "b/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" @@ -474,7 +474,128 @@ class Solution: ### Go: -> 单调栈 +暴力解法 + +```go +func largestRectangleArea(heights []int) int { + sum := 0 + for i := 0; i < len(heights); i++ { + left, right := i, i + for left >= 0 { + if heights[left] < heights[i] { + break + } + left-- + } + for right < len(heights) { + if heights[right] < heights[i] { + break + } + right++ + } + w := right - left - 1 + h := heights[i] + sum = max(sum, w * h) + } + return sum +} + +func max(x, y int) int { + if x > y { + return x + } + return y +} +``` + +双指针解法 + +```go +func largestRectangleArea(heights []int) int { + size := len(heights) + minLeftIndex := make([]int, size) + minRightIndex := make([]int, size) + + // 记录每个柱子 左边第一个小于该柱子的下标 + minLeftIndex[0] = -1 // 注意这里初始化,防止下面while死循环 + for i := 1; i < size; i++ { + t := i - 1 + // 这里不是用if,而是不断向左寻找的过程 + for t >= 0 && heights[t] >= heights[i] { + t = minLeftIndex[t] + } + minLeftIndex[i] = t + } + // 记录每个柱子 右边第一个小于该柱子的下标 + minRightIndex[size - 1] = size; // 注意这里初始化,防止下面while死循环 + for i := size - 2; i >= 0; i-- { + t := i + 1 + // 这里不是用if,而是不断向右寻找的过程 + for t < size && heights[t] >= heights[i] { + t = minRightIndex[t] + } + minRightIndex[i] = t + } + // 求和 + result := 0 + for i := 0; i < size; i++ { + sum := heights[i] * (minRightIndex[i] - minLeftIndex[i] - 1) + result = max(sum, result) + } + return result +} + +func max(x, y int) int { + if x > y { + return x + } + return y +} +``` + +单调栈 + +```go +func largestRectangleArea(heights []int) int { + result := 0 + heights = append([]int{0}, heights...) // 数组头部加入元素0 + heights = append(heights, 0) // 数组尾部加入元素0 + st := []int{0} + + // 第一个元素已经入栈,从下标1开始 + for i := 1; i < len(heights); i++ { + if heights[i] > heights[st[len(st)-1]] { + st = append(st, i) + } else if heights[i] == heights[st[len(st)-1]] { + st = st[:len(st)-1] + st = append(st, i) + } else { + for len(st) > 0 && heights[i] < heights[st[len(st)-1]] { + mid := st[len(st)-1] + st = st[:len(st)-1] + if len(st) > 0 { + left := st[len(st)-1] + right := i + w := right - left - 1 + h := heights[mid] + result = max(result, w * h) + } + } + st = append(st, i) + } + } + return result +} + +func max(x, y int) int { + if x > y { + return x + } + return y +} +``` + +单调栈精简 ```go func largestRectangleArea(heights []int) int { From abefd5840b64b3f82148bf383499bd854f20e42d Mon Sep 17 00:00:00 2001 From: zhoutianyi Date: Sun, 27 Oct 2024 23:39:32 -0400 Subject: [PATCH 2909/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=9B=AE=E6=A0=87?= =?UTF-8?q?=E5=92=8C=20go=20=E5=9B=9E=E6=BA=AF=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...4.\347\233\256\346\240\207\345\222\214.md" | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git "a/problems/0494.\347\233\256\346\240\207\345\222\214.md" "b/problems/0494.\347\233\256\346\240\207\345\222\214.md" index 0872460907..09e77b123a 100644 --- "a/problems/0494.\347\233\256\346\240\207\345\222\214.md" +++ "b/problems/0494.\347\233\256\346\240\207\345\222\214.md" @@ -706,6 +706,31 @@ class Solution: ``` ### Go +回溯法思路 +```go +func findTargetSumWays(nums []int, target int) int { + var result int + var backtracking func(nums []int, target int, index int, currentSum int) + + backtracking = func(nums []int, target int, index int, currentSum int) { + if index == len(nums) { + if currentSum == target { + result++ + } + return + } + + // 选择加上当前数字 + backtracking(nums, target, index+1, currentSum+nums[index]) + + // 选择减去当前数字 + backtracking(nums, target, index+1, currentSum-nums[index]) + } + + backtracking(nums, target, 0, 0) + return result +} +``` 二维dp ```go func findTargetSumWays(nums []int, target int) int { From 497bb7cbf358a4db63dcd32650513ae7e949bedd Mon Sep 17 00:00:00 2001 From: hui <760261797@qq.com> Date: Tue, 29 Oct 2024 16:40:27 +0800 Subject: [PATCH 2910/3019] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E7=AC=94=E8=AF=AF?= =?UTF-8?q?=EF=BC=8C=E6=95=B0=E7=BB=84=E4=B8=8E=E5=9B=BE=E7=89=87=E4=B8=8D?= =?UTF-8?q?=E4=B8=80=E8=87=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" "b/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" index 9e6714ce9d..88b59ffc72 100644 --- "a/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" +++ "b/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" @@ -72,7 +72,7 @@ #### 情况一:上下坡中有平坡 -例如 [1,2,2,2,1]这样的数组,如图: +例如 [1,2,2,2,2,1]这样的数组,如图: ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20230106170449.png) From 28de17ec3921f86376f493a781727e7589d26b73 Mon Sep 17 00:00:00 2001 From: Kuxry Date: Wed, 30 Oct 2024 09:54:39 +0900 Subject: [PATCH 2911/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200126.=E9=AA=91?= =?UTF-8?q?=E5=A3=AB=E7=9A=84=E6=94=BB=E5=87=BBastar=20C=E8=AF=AD=E8=A8=80?= =?UTF-8?q?=20=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...7\232\204\346\224\273\345\207\273astar.md" | 163 ++++++++++++++++++ 1 file changed, 163 insertions(+) diff --git "a/problems/kamacoder/0126.\351\252\221\345\243\253\347\232\204\346\224\273\345\207\273astar.md" "b/problems/kamacoder/0126.\351\252\221\345\243\253\347\232\204\346\224\273\345\207\273astar.md" index 2d0481ecec..403fe1face 100644 --- "a/problems/kamacoder/0126.\351\252\221\345\243\253\347\232\204\346\224\273\345\207\273astar.md" +++ "b/problems/kamacoder/0126.\351\252\221\345\243\253\347\232\204\346\224\273\345\207\273astar.md" @@ -389,7 +389,170 @@ for _ in range(n): ### C +```C +#include +#include +#include + +// 定义一个结构体,表示棋盘上骑士的位置和相关的 A* 算法参数 +typedef struct { + int x, y; // 骑士在棋盘上的坐标 + int g; // 从起点到当前节点的实际消耗 + int h; // 从当前节点到目标节点的估计消耗(启发式函数值) + int f; // 总的估计消耗(f = g + h) +} Knight; + +#define MAX_HEAP_SIZE 2000000 // 优先队列的最大容量 + +// 定义一个优先队列,使用最小堆来实现 A* 算法中的 Open 列表 +typedef struct { + Knight data[MAX_HEAP_SIZE]; + int size; +} PriorityQueue; + +// 初始化优先队列 +void initQueue(PriorityQueue *pq) { + pq->size = 0; +} + +// 将骑士节点插入优先队列 +void push(PriorityQueue *pq, Knight k) { + if (pq->size >= MAX_HEAP_SIZE) { + // 堆已满,无法插入新节点 + return; + } + int i = pq->size++; + pq->data[i] = k; + // 上滤操作,维护最小堆的性质,使得 f 值最小的节点在堆顶 + while (i > 0) { + int parent = (i - 1) / 2; + if (pq->data[parent].f <= pq->data[i].f) { + break; + } + // 交换父节点和当前节点 + Knight temp = pq->data[parent]; + pq->data[parent] = pq->data[i]; + pq->data[i] = temp; + i = parent; + } +} + +// 从优先队列中弹出 f 值最小的骑士节点 +Knight pop(PriorityQueue *pq) { + Knight min = pq->data[0]; + pq->size--; + pq->data[0] = pq->data[pq->size]; + // 下滤操作,维护最小堆的性质 + int i = 0; + while (1) { + int left = 2 * i + 1; + int right = 2 * i + 2; + int smallest = i; + if (left < pq->size && pq->data[left].f < pq->data[smallest].f) { + smallest = left; + } + if (right < pq->size && pq->data[right].f < pq->data[smallest].f) { + smallest = right; + } + if (smallest == i) { + break; + } + // 交换当前节点与最小子节点 + Knight temp = pq->data[smallest]; + pq->data[smallest] = pq->data[i]; + pq->data[i] = temp; + i = smallest; + } + return min; +} + +// 判断优先队列是否为空 +int isEmpty(PriorityQueue *pq) { + return pq->size == 0; +} + +// 启发式函数:计算从当前位置到目标位置的欧几里得距离的平方(避免开方,提高效率) +int heuristic(int x, int y, int goal_x, int goal_y) { + int dx = x - goal_x; + int dy = y - goal_y; + return dx * dx + dy * dy; // 欧几里得距离的平方 +} + +// 用于记录从起点到棋盘上每个位置的最小移动次数 +int moves[1001][1001]; + +// 骑士在棋盘上的8个可能移动方向 +int dir[8][2] = { + {-2, -1}, {-2, 1}, {-1, 2}, {1, 2}, + {2, 1}, {2, -1}, {1, -2}, {-1, -2} +}; + +// 使用 A* 算法寻找从起点到目标点的最短路径 +int astar(int start_x, int start_y, int goal_x, int goal_y) { + PriorityQueue pq; + initQueue(&pq); + + // 初始化 moves 数组,-1 表示未访问过的位置 + memset(moves, -1, sizeof(moves)); + moves[start_x][start_y] = 0; // 起点位置的移动次数为 0 + + // 初始化起始节点 + Knight start; + start.x = start_x; + start.y = start_y; + start.g = 0; // 从起点到起点的消耗为 0 + start.h = heuristic(start_x, start_y, goal_x, goal_y); + start.f = start.g + start.h; // 总的估计消耗 + + push(&pq, start); // 将起始节点加入优先队列 + + while (!isEmpty(&pq)) { + Knight current = pop(&pq); // 取出 f 值最小的节点 + + // 如果已经到达目标位置,返回所需的最小移动次数 + if (current.x == goal_x && current.y == goal_y) { + return moves[current.x][current.y]; + } + + // 遍历当前节点的所有可能移动方向 + for (int i = 0; i < 8; i++) { + int nx = current.x + dir[i][0]; + int ny = current.y + dir[i][1]; + + // 检查新位置是否在棋盘范围内且未被访问过 + if (nx >= 1 && nx <= 1000 && ny >= 1 && ny <= 1000 && moves[nx][ny] == -1) { + moves[nx][ny] = moves[current.x][current.y] + 1; // 更新移动次数 + + // 创建新节点,表示骑士移动到的新位置 + Knight neighbor; + neighbor.x = nx; + neighbor.y = ny; + neighbor.g = current.g + 5; // 每次移动的消耗为 5(骑士移动的距离平方) + neighbor.h = heuristic(nx, ny, goal_x, goal_y); + neighbor.f = neighbor.g + neighbor.h; + + push(&pq, neighbor); // 将新节点加入优先队列 + } + } + } + + return -1; // 如果无法到达目标位置,返回 -1 +} +int main() { + int n; + scanf("%d", &n); + while (n--) { + int a1, a2, b1, b2; // 起点和目标点的坐标 + scanf("%d %d %d %d", &a1, &a2, &b1, &b2); + + int result = astar(a1, a2, b1, b2); // 使用 A* 算法计算最短路径 + printf("%d\n", result); // 输出所需的最小移动次数 + } + return 0; +} + +``` From ef36f40e4365cff7113c0f084d9cc3058de6e469 Mon Sep 17 00:00:00 2001 From: Kuxry Date: Wed, 30 Oct 2024 10:34:03 +0900 Subject: [PATCH 2912/3019] =?UTF-8?q?=20=E6=B7=BB=E5=8A=A00126.=E9=AA=91?= =?UTF-8?q?=E5=A3=AB=E7=9A=84=E6=94=BB=E5=87=BBastar=20C=E8=AF=AD=E8=A8=80?= =?UTF-8?q?=20=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...1\345\243\253\347\232\204\346\224\273\345\207\273astar.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/problems/kamacoder/0126.\351\252\221\345\243\253\347\232\204\346\224\273\345\207\273astar.md" "b/problems/kamacoder/0126.\351\252\221\345\243\253\347\232\204\346\224\273\345\207\273astar.md" index 403fe1face..e3ce98f655 100644 --- "a/problems/kamacoder/0126.\351\252\221\345\243\253\347\232\204\346\224\273\345\207\273astar.md" +++ "b/problems/kamacoder/0126.\351\252\221\345\243\253\347\232\204\346\224\273\345\207\273astar.md" @@ -500,7 +500,7 @@ int astar(int start_x, int start_y, int goal_x, int goal_y) { Knight start; start.x = start_x; start.y = start_y; - start.g = 0; // 从起点到起点的消耗为 0 + start.g = 0; start.h = heuristic(start_x, start_y, goal_x, goal_y); start.f = start.g + start.h; // 总的估计消耗 @@ -547,7 +547,7 @@ int main() { scanf("%d %d %d %d", &a1, &a2, &b1, &b2); int result = astar(a1, a2, b1, b2); // 使用 A* 算法计算最短路径 - printf("%d\n", result); // 输出所需的最小移动次数 + printf("%d\n", result); // 输出最小移动次数 } return 0; } From 2602359ec9a62a08987234d95c7e3cc2571894ad Mon Sep 17 00:00:00 2001 From: Kuxry Date: Wed, 30 Oct 2024 10:48:07 +0900 Subject: [PATCH 2913/3019] =?UTF-8?q?=20=E6=B7=BB=E5=8A=A00126.=E9=AA=91?= =?UTF-8?q?=E5=A3=AB=E7=9A=84=E6=94=BB=E5=87=BBastar=20C=E8=AF=AD=E8=A8=80?= =?UTF-8?q?=20=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...221\345\243\253\347\232\204\346\224\273\345\207\273astar.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/kamacoder/0126.\351\252\221\345\243\253\347\232\204\346\224\273\345\207\273astar.md" "b/problems/kamacoder/0126.\351\252\221\345\243\253\347\232\204\346\224\273\345\207\273astar.md" index e3ce98f655..3bbf4169e0 100644 --- "a/problems/kamacoder/0126.\351\252\221\345\243\253\347\232\204\346\224\273\345\207\273astar.md" +++ "b/problems/kamacoder/0126.\351\252\221\345\243\253\347\232\204\346\224\273\345\207\273astar.md" @@ -402,7 +402,7 @@ typedef struct { int f; // 总的估计消耗(f = g + h) } Knight; -#define MAX_HEAP_SIZE 2000000 // 优先队列的最大容量 +#define MAX_HEAP_SIZE 2000000 // 假设优先队列的最大容量 // 定义一个优先队列,使用最小堆来实现 A* 算法中的 Open 列表 typedef struct { From b3c79d848410230687321964ee39f238fb9f030c Mon Sep 17 00:00:00 2001 From: donghuanjie Date: Thu, 31 Oct 2024 19:38:10 -0700 Subject: [PATCH 2914/3019] modified 707 code, move the ListNode class inside, reformat the code --- ...76\350\256\241\351\223\276\350\241\250.md" | 128 +++++++++--------- 1 file changed, 63 insertions(+), 65 deletions(-) diff --git "a/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" "b/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" index 0cb2f2f2fa..ed1726d942 100644 --- "a/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" +++ "b/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" @@ -422,38 +422,38 @@ void myLinkedListFree(MyLinkedList* obj) { ```Java //单链表 -class ListNode { - int val; - ListNode next; - ListNode(){} - ListNode(int val) { - this.val=val; - } -} class MyLinkedList { + + class ListNode { + int val; + ListNode next; + ListNode(int val) { + this.val=val; + } + } //size存储链表元素的个数 - int size; - //虚拟头结点 - ListNode head; + private int size; + //注意这里记录的是虚拟头结点 + private ListNode head; //初始化链表 public MyLinkedList() { - size = 0; - head = new ListNode(0); + this.size = 0; + this.head = new ListNode(0); } - //获取第index个节点的数值,注意index是从0开始的,第0个节点就是头结点 + //获取第index个节点的数值,注意index是从0开始的,第0个节点就是虚拟头结点 public int get(int index) { //如果index非法,返回-1 if (index < 0 || index >= size) { return -1; } - ListNode currentNode = head; - //包含一个虚拟头节点,所以查找第 index+1 个节点 + ListNode cur = head; + //第0个节点是虚拟头节点,所以查找第 index+1 个节点 for (int i = 0; i <= index; i++) { - currentNode = currentNode.next; + cur = cur.next; } - return currentNode.val; + return cur.val; } public void addAtHead(int val) { @@ -473,7 +473,6 @@ class MyLinkedList { while (cur.next != null) { cur = cur.next; } - cur.next = newNode; size++; @@ -485,55 +484,53 @@ class MyLinkedList { // 如果 index 等于链表的长度,则说明是新插入的节点为链表的尾结点 // 如果 index 大于链表的长度,则返回空 public void addAtIndex(int index, int val) { - if (index > size) { + if (index < 0 || index > size) { return; } - if (index < 0) { - index = 0; - } - size++; + //找到要插入节点的前驱 - ListNode pred = head; + ListNode pre = head; for (int i = 0; i < index; i++) { - pred = pred.next; + pre = pre.next; } - ListNode toAdd = new ListNode(val); - toAdd.next = pred.next; - pred.next = toAdd; + ListNode newNode = new ListNode(val); + newNode.next = pre.next; + pre.next = newNode; + size++; } - //删除第index个节点 public void deleteAtIndex(int index) { if (index < 0 || index >= size) { return; } - size--; - //因为有虚拟头节点,所以不用对Index=0的情况进行特殊处理 - ListNode pred = head; + + //因为有虚拟头节点,所以不用对index=0的情况进行特殊处理 + ListNode pre = head; for (int i = 0; i < index ; i++) { - pred = pred.next; + pre = pre.next; } - pred.next = pred.next.next; + pre.next = pre.next.next; + size--; } } +``` +```Java //双链表 -class ListNode{ - int val; - ListNode next,prev; - ListNode() {}; - ListNode(int val){ - this.val = val; - } -} - - class MyLinkedList { + class ListNode{ + int val; + ListNode next, prev; + ListNode(int val){ + this.val = val; + } + } + //记录链表中元素的数量 - int size; + private int size; //记录链表的虚拟头结点和尾结点 - ListNode head,tail; + private ListNode head, tail; public MyLinkedList() { //初始化操作 @@ -541,25 +538,25 @@ class MyLinkedList { this.head = new ListNode(0); this.tail = new ListNode(0); //这一步非常关键,否则在加入头结点的操作中会出现null.next的错误!!! - head.next=tail; - tail.prev=head; + this.head.next = tail; + this.tail.prev = head; } public int get(int index) { //判断index是否有效 - if(index>=size){ + if(index < 0 || index >= size){ return -1; } - ListNode cur = this.head; + ListNode cur = head; //判断是哪一边遍历时间更短 if(index >= size / 2){ //tail开始 cur = tail; - for(int i=0; i< size-index; i++){ + for(int i = 0; i < size - index; i++){ cur = cur.prev; } }else{ - for(int i=0; i<= index; i++){ + for(int i = 0; i <= index; i++){ cur = cur.next; } } @@ -568,24 +565,23 @@ class MyLinkedList { public void addAtHead(int val) { //等价于在第0个元素前添加 - addAtIndex(0,val); + addAtIndex(0, val); } public void addAtTail(int val) { //等价于在最后一个元素(null)前添加 - addAtIndex(size,val); + addAtIndex(size, val); } public void addAtIndex(int index, int val) { - //index大于链表长度 - if(index>size){ + //判断index是否有效 + if(index < 0 || index > size){ return; } - size++; //找到前驱 - ListNode pre = this.head; - for(int i=0; i=size){ + //判断index是否有效 + if(index < 0 || index >= size){ return; } + //删除操作 - size--; - ListNode pre = this.head; - for(int i=0; i Date: Fri, 1 Nov 2024 14:15:14 +0800 Subject: [PATCH 2915/3019] =?UTF-8?q?992.=E6=8C=89=E5=A5=87=E5=81=B6?= =?UTF-8?q?=E6=8E=92=E5=BA=8F=E6=95=B0=E7=BB=84II=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E9=A2=98=E7=9B=AE=E6=8F=8F=E8=BF=B0=EF=BC=8C=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?Go=E6=96=B9=E6=B3=95=E4=BA=8C=E5=92=8C=E6=96=B9=E6=B3=95?= =?UTF-8?q?=E4=B8=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\345\272\217\346\225\260\347\273\204II.md" | 77 +++++++++++++------ 1 file changed, 54 insertions(+), 23 deletions(-) diff --git "a/problems/0922.\346\214\211\345\245\207\345\201\266\346\216\222\345\272\217\346\225\260\347\273\204II.md" "b/problems/0922.\346\214\211\345\245\207\345\201\266\346\216\222\345\272\217\346\225\260\347\273\204II.md" index 1ac6800c08..28680dbf0f 100644 --- "a/problems/0922.\346\214\211\345\245\207\345\201\266\346\216\222\345\272\217\346\225\260\347\273\204II.md" +++ "b/problems/0922.\346\214\211\345\245\207\345\201\266\346\216\222\345\272\217\346\225\260\347\273\204II.md" @@ -11,9 +11,9 @@ [力扣题目链接](https://leetcode.cn/problems/sort-array-by-parity-ii/) -给定一个非负整数数组 A, A 中一半整数是奇数,一半整数是偶数。 +给定一个非负整数数组 nums, nums 中一半整数是奇数,一半整数是偶数。 -对数组进行排序,以便当 A[i] 为奇数时,i 也是奇数;当 A[i] 为偶数时, i 也是偶数。 +对数组进行排序,以便当 nums[i] 为奇数时,i 也是奇数;当 nums[i] 为偶数时, i 也是偶数。 你可以返回任何满足上述条件的数组作为答案。 @@ -35,17 +35,17 @@ ```CPP class Solution { public: - vector sortArrayByParityII(vector& A) { - vector even(A.size() / 2); // 初始化就确定数组大小,节省开销 - vector odd(A.size() / 2); - vector result(A.size()); + vector sortArrayByParityII(vector& nums) { + vector even(nums.size() / 2); // 初始化就确定数组大小,节省开销 + vector odd(nums.size() / 2); + vector result(nums.size()); int evenIndex = 0; int oddIndex = 0; int resultIndex = 0; - // 把A数组放进偶数数组,和奇数数组 - for (int i = 0; i < A.size(); i++) { - if (A[i] % 2 == 0) even[evenIndex++] = A[i]; - else odd[oddIndex++] = A[i]; + // 把nums数组放进偶数数组,和奇数数组 + for (int i = 0; i < nums.size(); i++) { + if (nums[i] % 2 == 0) even[evenIndex++] = nums[i]; + else odd[oddIndex++] = nums[i]; } // 把偶数数组,奇数数组分别放进result数组中 for (int i = 0; i < evenIndex; i++) { @@ -62,22 +62,22 @@ public: ### 方法二 -以上代码我是建了两个辅助数组,而且A数组还相当于遍历了两次,用辅助数组的好处就是思路清晰,优化一下就是不用这两个辅助树,代码如下: +以上代码我是建了两个辅助数组,而且nums数组还相当于遍历了两次,用辅助数组的好处就是思路清晰,优化一下就是不用这两个辅助数组,代码如下: ```CPP class Solution { public: - vector sortArrayByParityII(vector& A) { - vector result(A.size()); + vector sortArrayByParityII(vector& nums) { + vector result(nums.size()); int evenIndex = 0; // 偶数下标 int oddIndex = 1; // 奇数下标 - for (int i = 0; i < A.size(); i++) { - if (A[i] % 2 == 0) { - result[evenIndex] = A[i]; + for (int i = 0; i < nums.size(); i++) { + if (nums[i] % 2 == 0) { + result[evenIndex] = nums[i]; evenIndex += 2; } else { - result[oddIndex] = A[i]; + result[oddIndex] = nums[i]; oddIndex += 2; } } @@ -96,15 +96,15 @@ public: ```CPP class Solution { public: - vector sortArrayByParityII(vector& A) { + vector sortArrayByParityII(vector& nums) { int oddIndex = 1; - for (int i = 0; i < A.size(); i += 2) { - if (A[i] % 2 == 1) { // 在偶数位遇到了奇数 - while(A[oddIndex] % 2 != 0) oddIndex += 2; // 在奇数位找一个偶数 - swap(A[i], A[oddIndex]); // 替换 + for (int i = 0; i < nums.size(); i += 2) { + if (nums[i] % 2 == 1) { // 在偶数位遇到了奇数 + while(nums[oddIndex] % 2 != 0) oddIndex += 2; // 在奇数位找一个偶数 + swap(nums[i], nums[oddIndex]); // 替换 } } - return A; + return nums; } }; ``` @@ -253,6 +253,37 @@ func sortArrayByParityII(nums []int) []int { } return result; } + +// 方法二 +func sortArrayByParityII(nums []int) []int { + result := make([]int, len(nums)) + evenIndex := 0 // 偶数下标 + oddIndex := 1 // 奇数下标 + for _, v := range nums { + if v % 2 == 0 { + result[evenIndex] = v + evenIndex += 2 + } else { + result[oddIndex] = v + oddIndex += 2 + } + } + return result +} + +// 方法三 +func sortArrayByParityII(nums []int) []int { + oddIndex := 1 + for i := 0; i < len(nums); i += 2 { + if nums[i] % 2 == 1 { // 在偶数位遇到了奇数 + for nums[oddIndex] % 2 != 0 { + oddIndex += 2 // 在奇数位找一个偶数 + } + nums[i], nums[oddIndex] = nums[oddIndex], nums[i] + } + } + return nums +} ``` ### JavaScript From cc1cdb07db6598c98e804ad40af5fd958062a5d8 Mon Sep 17 00:00:00 2001 From: donghuanjie Date: Fri, 1 Nov 2024 01:12:34 -0700 Subject: [PATCH 2916/3019] add java recursion version of 203 --- ...76\350\241\250\345\205\203\347\264\240.md" | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git "a/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" "b/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" index f6b5ef6dbb..d51895aa63 100644 --- "a/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" +++ "b/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" @@ -337,6 +337,37 @@ public ListNode removeElements(ListNode head, int val) { ``` +递归 + +```java +/** + * 时间复杂度 O(n) + * 空间复杂度 O(n) + * @param head + * @param val + * @return + */ +class Solution { + public ListNode removeElements(ListNode head, int val) { + if (head == null) { + return head; + } + + // 假设 removeElements() 返回后面完整的已经去掉val节点的子链表 + // 在当前递归层用当前节点接住后面的子链表 + // 随后判断当前层的node是否需要被删除,如果是,就返回 + // 也可以先判断是否需要删除当前node,但是这样条件语句会比较不好想 + head.next = removeElements(head.next, val); + if (head.val == val) { + return head.next; + } + return head; + + // 实际上就是还原一个从尾部开始重新构建链表的过程 + } +} +``` + ### Python: ```python From 4c397b64f5f4aba97f9d9034182b83bd8a062db6 Mon Sep 17 00:00:00 2001 From: Lane Zhang Date: Mon, 4 Nov 2024 12:07:27 +0800 Subject: [PATCH 2917/3019] =?UTF-8?q?0450.=E5=88=A0=E9=99=A4=E4=BA=8C?= =?UTF-8?q?=E5=8F=89=E6=90=9C=E7=B4=A2=E6=A0=91=E4=B8=AD=E7=9A=84=E8=8A=82?= =?UTF-8?q?=E7=82=B9=20=E5=8A=A0=E5=85=A5Ruby=E9=80=92=E5=BD=92=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...55\347\232\204\350\212\202\347\202\271.md" | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git "a/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" "b/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" index f6057f44a5..7523c50a80 100644 --- "a/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" +++ "b/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" @@ -801,6 +801,40 @@ impl Solution { } ``` +### Ruby +> 递归法: +```ruby +# @param {TreeNode} root +# @param {Integer} key +# @return {TreeNode} +def delete_node(root, key) + return nil if root.nil? + + right = root.right + left = root.left + + if root.val == key + return right if left.nil? + return left if right.nil? + + node = right + while node.left + node = node.left + end + node.left = left + + return right + end + + if root.val > key + root.left = delete_node(left, key) + else + root.right = delete_node(right, key) + end + + return root +end +```

From 8c389cb67328c37e3744ec52126aa6dcfec399b2 Mon Sep 17 00:00:00 2001 From: Lane Zhang Date: Tue, 5 Nov 2024 13:28:37 +0800 Subject: [PATCH 2918/3019] =?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=A0=91=E7=9A=84?= =?UTF-8?q?=E7=BB=9F=E4=B8=80=E8=BF=AD=E4=BB=A3=E6=B3=95.md=20=E4=BD=BF?= =?UTF-8?q?=E7=94=A8"boolean=E6=A0=87=E8=AE=B0=E6=B3=95"=E5=B9=B6=E8=B0=83?= =?UTF-8?q?=E6=95=B4=E7=9B=B8=E5=85=B3Python=E4=BB=A3=E7=A0=81=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...00\350\277\255\344\273\243\346\263\225.md" | 53 +++++++++---------- 1 file changed, 26 insertions(+), 27 deletions(-) diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\347\273\237\344\270\200\350\277\255\344\273\243\346\263\225.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\347\273\237\344\270\200\350\277\255\344\273\243\346\263\225.md" index a1ac9dd2b3..412aec8cde 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\347\273\237\344\270\200\350\277\255\344\273\243\346\263\225.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\347\273\237\344\270\200\350\277\255\344\273\243\346\263\225.md" @@ -31,8 +31,8 @@ * 方法一:**就是要处理的节点放入栈之后,紧接着放入一个空指针作为标记。** 这种方法可以叫做`空指针标记法`。 -* 方法二:**当一个节点被`pop()`后,把该节点放入一个`Set`中,表示该节点被处理过了,下次再处理这个节点时,直接收割。** -这种方法可以叫做`Set标记法`,样例代码见下文`Python Set标记法`。 方法二更容易理解,在面试中更容易写出来。 +* 方法二:**加一个 `boolean` 值跟随每个节点,`false` (默认值) 表示需要为该节点和它的左右儿子安排在栈中的位次,`true` 表示该节点的位次之前已经安排过了,可以收割节点了。** +这种方法可以叫做`boolean 标记法`,样例代码见下文`C++ 和 Python 的 boolean 标记法`。 这种方法更容易理解,在面试中更容易写出来。 ### 迭代法中序遍历 @@ -311,60 +311,59 @@ class Solution: return result ``` -> 中序遍历,统一迭代(Set标记法): +> 中序遍历,统一迭代(boolean 标记法): ```python class Solution: def inorderTraversal(self, root: Optional[TreeNode]) -> List[int]: values = [] - stack = [] if root is None else [root] - popped_nodes = set() # 用于记录一个节点是否被 pop() 过 + stack = [(root, False)] if root else [] # 多加一个参数,False 为默认值,含义见下文 while stack: - node = stack.pop() - # 说明节点是之前被pop过又被加回来,现在又要出栈,就可以直接收割了, - # 因为节点的左右儿子已经按次序入栈,节点的使命已经完成。 - if node in popped_nodes: + node, visited = stack.pop() # 多加一个 visited 参数,使“迭代统一写法”成为一件简单的事 + + if visited: # visited 为 True,表示该节点和两个儿子的位次之前已经安排过了,现在可以收割节点了 values.append(node.val) continue - popped_nodes.add(node) # 记录第一次出栈,第一次出栈的目的是为了把左右儿子和自己按次序入栈 - - if node.right: # 中序遍历是'左中右',右儿子最先入栈,最后出栈 - stack.append(node.right) + # visited 当前为 False, 表示初次访问本节点,此次访问的目的是“把自己和两个儿子在栈中安排好位次”。 + # 中序遍历是'左中右',右儿子最先入栈,最后出栈。 + if node.right: + stack.append((node.right, False)) - stack.append(node) # 把自己加回到栈中,位置居中 + stack.append((node, True)) # 把自己加回到栈中,位置居中。同时,设置 visited 为 True,表示下次再访问本节点时,允许收割 if node.left: - stack.append(node.left) # 左儿子最后入栈,最先出栈 + stack.append((node.left, False)) # 左儿子最后入栈,最先出栈 return values ``` -> 后序遍历,统一迭代(Set标记法): +> 后序遍历,统一迭代(boolean 标记法): ```python class Solution: def postorderTraversal(self, root: Optional[TreeNode]) -> List[int]: values = [] - stack = [] if root is None else [root] - popped_nodes = set() # 用于记录一个节点是否被 pop() 过 + stack = [(root, False)] if root else [] # 多加一个参数,False 为默认值,含义见下文 while stack: - node = stack.pop() - # 说明节点是之前被pop过又被加回来,现在又要出栈,就可以直接收割了, - # 因为节点的左右儿子已经按次序入栈,节点的使命已经完成。 - if node in popped_nodes: + node, visited = stack.pop() # 多加一个 visited 参数,使“迭代统一写法”成为一件简单的事 + + if visited: # visited 为 True,表示该节点和两个儿子位次之前已经安排过了,现在可以收割节点了 values.append(node.val) continue - popped_nodes.add(node) # 记录第一次出栈,第一次出栈的目的是为了把左右儿子和自己按次序入栈 - - stack.append(node) # 后序遍历是'左右中',节点自己最先入栈,最后出栈 + # visited 当前为 False, 表示初次访问本节点,此次访问的目的是“把自己和两个儿子在栈中安排好位次” + # 后序遍历是'左右中',节点自己最先入栈,最后出栈。 + # 同时,设置 visited 为 True,表示下次再访问本节点时,允许收割。 + stack.append((node, True)) if node.right: - stack.append(node.right) # 右儿子位置居中 + stack.append((node.right, False)) # 右儿子位置居中 if node.left: - stack.append(node.left) # 左儿子最后入栈,最先出栈 + stack.append((node.left, False)) # 左儿子最后入栈,最先出栈 + + return values ``` ### Go: From 6c2e5a0c5e6b0a6d520c80331c99c53d80ea3b1a Mon Sep 17 00:00:00 2001 From: Lane Zhang Date: Tue, 5 Nov 2024 14:42:35 +0800 Subject: [PATCH 2919/3019] =?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=A0=91=E7=9A=84?= =?UTF-8?q?=E7=BB=9F=E4=B8=80=E8=BF=AD=E4=BB=A3=E6=B3=95.md=20=E4=B8=BA"bo?= =?UTF-8?q?olean=E6=A0=87=E8=AE=B0=E6=B3=95"=E5=8A=A0=E4=B8=8AC++=E7=9A=84?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...00\350\277\255\344\273\243\346\263\225.md" | 79 ++++++++++++++++++- 1 file changed, 77 insertions(+), 2 deletions(-) diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\347\273\237\344\270\200\350\277\255\344\273\243\346\263\225.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\347\273\237\344\270\200\350\277\255\344\273\243\346\263\225.md" index 412aec8cde..037cf1109b 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\347\273\237\344\270\200\350\277\255\344\273\243\346\263\225.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\347\273\237\344\270\200\350\277\255\344\273\243\346\263\225.md" @@ -36,7 +36,7 @@ ### 迭代法中序遍历 -中序遍历代码如下:(详细注释) +> 中序遍历(空指针标记法)代码如下:(详细注释) ```CPP class Solution { @@ -75,6 +75,45 @@ public: 可以看出我们将访问的节点直接加入到栈中,但如果是处理的节点则后面放入一个空节点, 这样只有空节点弹出的时候,才将下一个节点放进结果集。 +> 中序遍历(boolean 标记法): +```c++ +class Solution { +public: + vector inorderTraversal(TreeNode* root) { + vector result; + stack> st; + if (root != nullptr) + st.push(make_pair(root, false)); // 多加一个参数,false 为默认值,含义见下文注释 + + while (!st.empty()) { + auto node = st.top().first; + auto visited = st.top().second; //多加一个 visited 参数,使“迭代统一写法”成为一件简单的事 + st.pop(); + + if (visited) { // visited 为 True,表示该节点和两个儿子位次之前已经安排过了,现在可以收割节点了 + result.push_back(node->val); + continue; + } + + // visited 当前为 false, 表示初次访问本节点,此次访问的目的是“把自己和两个儿子在栈中安排好位次”。 + + // 中序遍历是'左中右',右儿子最先入栈,最后出栈。 + if (node->right) + st.push(make_pair(node->right, false)); + + // 把自己加回到栈中,位置居中。 + // 同时,设置 visited 为 true,表示下次再访问本节点时,允许收割。 + st.push(make_pair(node, true)); + + if (node->left) + st.push(make_pair(node->left, false)); // 左儿子最后入栈,最先出栈 + } + + return result; + } +}; +``` + 此时我们再来看前序遍历代码。 ### 迭代法前序遍历 @@ -110,7 +149,7 @@ public: ### 迭代法后序遍历 -后续遍历代码如下: (**注意此时我们和中序遍历相比仅仅改变了两行代码的顺序**) +> 后续遍历代码如下: (**注意此时我们和中序遍历相比仅仅改变了两行代码的顺序**) ```CPP class Solution { @@ -141,6 +180,42 @@ public: }; ``` +> 迭代法后序遍历(boolean 标记法): +```c++ +class Solution { +public: + vector postorderTraversal(TreeNode* root) { + vector result; + stack> st; + if (root != nullptr) + st.push(make_pair(root, false)); // 多加一个参数,false 为默认值,含义见下文 + + while (!st.empty()) { + auto node = st.top().first; + auto visited = st.top().second; //多加一个 visited 参数,使“迭代统一写法”成为一件简单的事 + st.pop(); + + if (visited) { // visited 为 True,表示该节点和两个儿子位次之前已经安排过了,现在可以收割节点了 + result.push_back(node->val); + continue; + } + + // visited 当前为 false, 表示初次访问本节点,此次访问的目的是“把自己和两个儿子在栈中安排好位次”。 + // 后序遍历是'左右中',节点自己最先入栈,最后出栈。 + // 同时,设置 visited 为 true,表示下次再访问本节点时,允许收割。 + st.push(make_pair(node, true)); + + if (node->right) + st.push(make_pair(node->right, false)); // 右儿子位置居中 + + if (node->left) + st.push(make_pair(node->left, false)); // 左儿子最后入栈,最先出栈 + } + + return result; + } +}; +``` ## 总结 此时我们写出了统一风格的迭代法,不用在纠结于前序写出来了,中序写不出来的情况了。 From 85241be1ea8a07b6449b2ef24d4abfacf4211bc1 Mon Sep 17 00:00:00 2001 From: DengSchoo <46556279+DengSchoo@users.noreply.github.com> Date: Tue, 5 Nov 2024 17:41:16 +0800 Subject: [PATCH 2920/3019] chore: create .gitignore file create a .gitignore file to avoid uploading useless files, such as ".DS_Store". --- .gitignore | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000..4bd29f751f --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +.idea/ +.DS_Store +.vscode +.temp +.cache +*.iml +__pycache__ From 55e8b33e1d9f9236b939d2be7a0160eecfb2beb8 Mon Sep 17 00:00:00 2001 From: DengSchoo <46556279+DengSchoo@users.noreply.github.com> Date: Tue, 5 Nov 2024 17:42:16 +0800 Subject: [PATCH 2921/3019] chore: remove useless file ".DS_Store" --- .DS_Store | Bin 6148 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 .DS_Store diff --git a/.DS_Store b/.DS_Store deleted file mode 100644 index f7ce0fd5038358c7a0df77b968ed993daff0639c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHKF-`+P3>-s>lW0;>?icvMDhe;i2T%y2IdUiw)YtKC#$F>OS}4*`z*zFmt?k*> zO>sU0u+`h{4p;&h=#KdCr8m#JcXpK#M~gE?JmCe$-SKhks=p67cfczSn6SkOe>+Vh z5ABoho5Oyb_Rq|DUM2;kfE17dQa}n^q(HXM;pQTiilu-Q_zw#B_o2`oYvSB6J{??Q z1RyRL4&!so62#&GVojVIGD5RPB{r(%h+&P+c*(k&I5%u`SlrBW@@C5k#o~6xOO(TE zL#5>MJ5G)LxE2gD;uo< From a4f9f01eb48b2a7d929154be69fd6cfe9dc9ea19 Mon Sep 17 00:00:00 2001 From: MAX <61301100+miaoxu404@users.noreply.github.com> Date: Tue, 5 Nov 2024 20:52:38 -0700 Subject: [PATCH 2922/3019] =?UTF-8?q?Update=200101.=E5=AD=A4=E5=B2=9B?= =?UTF-8?q?=E7=9A=84=E6=80=BB=E9=9D=A2=E7=A7=AF.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 对101.孤岛的总面积的python解法深搜版的补充,以及对广搜版的部分修改 --- ...04\346\200\273\351\235\242\347\247\257.md" | 67 +++++++++++++++++-- 1 file changed, 60 insertions(+), 7 deletions(-) diff --git "a/problems/kamacoder/0101.\345\255\244\345\262\233\347\232\204\346\200\273\351\235\242\347\247\257.md" "b/problems/kamacoder/0101.\345\255\244\345\262\233\347\232\204\346\200\273\351\235\242\347\247\257.md" index 006484defb..fb2eb747e4 100644 --- "a/problems/kamacoder/0101.\345\255\244\345\262\233\347\232\204\346\200\273\351\235\242\347\247\257.md" +++ "b/problems/kamacoder/0101.\345\255\244\345\262\233\347\232\204\346\200\273\351\235\242\347\247\257.md" @@ -257,14 +257,62 @@ public class Main { ### Python +#### 深搜版 +```python +position = [[1, 0], [0, 1], [-1, 0], [0, -1]] +count = 0 + +def dfs(grid, x, y): + global count + grid[x][y] = 0 + count += 1 + for i, j in position: + next_x = x + i + next_y = y + j + if next_x < 0 or next_y < 0 or next_x >= len(grid) or next_y >= len(grid[0]): + continue + if grid[next_x][next_y] == 1: + dfs(grid, next_x, next_y) + +n, m = map(int, input().split()) + +# 邻接矩阵 +grid = [] +for i in range(n): + grid.append(list(map(int, input().split()))) + +# 清除边界上的连通分量 +for i in range(n): + if grid[i][0] == 1: + dfs(grid, i, 0) + if grid[i][m - 1] == 1: + dfs(grid, i, m - 1) + +for j in range(m): + if grid[0][j] == 1: + dfs(grid, 0, j) + if grid[n - 1][j] == 1: + dfs(grid, n - 1, j) + +count = 0 # 将count重置为0 +# 统计内部所有剩余的连通分量 +for i in range(n): + for j in range(m): + if grid[i][j] == 1: + dfs(grid, i, j) + +print(count) +``` + +#### 广搜版 ```python from collections import deque # 处理输入 -n, m = list(map(int, input().strip())) +n, m = list(map(int, input().split())) g = [] for _ in range(n): - row = list(map(int, input().strip())) + row = list(map(int, input().split())) g.append(row) # 定义四个方向、孤岛面积(遍历完边缘后会被重置) @@ -293,17 +341,22 @@ def bfs(r, c): for i in range(n): - if g[i][0] == 1: bfs(i, 0) - if g[i][m-1] == 1: bfs(i, m-1) + if g[i][0] == 1: + bfs(i, 0) + if g[i][m-1] == 1: + bfs(i, m-1) for i in range(m): - if g[0][i] == 1: bfs(0, i) - if g[n-1][i] == 1: bfs(n-1, i) + if g[0][i] == 1: + bfs(0, i) + if g[n-1][i] == 1: + bfs(n-1, i) count = 0 for i in range(n): for j in range(m): - if g[i][j] == 1: bfs(i, j) + if g[i][j] == 1: + bfs(i, j) print(count) ``` From 9e6cc0e627c20a28c8928e76cb8cde342a5e0b25 Mon Sep 17 00:00:00 2001 From: swjtuhjf Date: Thu, 7 Nov 2024 23:44:18 +0800 Subject: [PATCH 2923/3019] =?UTF-8?q?0053.=E5=AF=BB=E5=AE=9D-prim=201.=20?= =?UTF-8?q?=E5=88=A0=E6=8E=89=E6=96=87=E7=AB=A0=E4=B8=AD=E5=86=97=E4=BD=99?= =?UTF-8?q?=E7=9A=84=E7=A9=BA=E6=A0=BC=EF=BC=8C=E4=BD=86=E4=B8=8D=E5=8C=85?= =?UTF-8?q?=E6=8B=AC1=E4=BB=A3=E7=A0=81=E4=B8=AD=E7=9A=84=E7=A9=BA?= =?UTF-8?q?=E6=A0=BC=E5=92=8C2=E7=BB=93=E6=9E=84=E6=80=A7=E7=A9=BA?= =?UTF-8?q?=E6=A0=BC(=E5=A6=82=E6=A0=87=E9=A2=98=E5=86=85)=E7=AD=89?= =?UTF-8?q?=E5=90=88=E7=90=86=E7=A9=BA=E6=A0=BC=202.=20=E5=B0=86=E6=80=BB?= =?UTF-8?q?=E7=BB=93=E9=83=A8=E5=88=86=E5=80=92=E6=95=B0=E7=AC=AC=E4=B8=89?= =?UTF-8?q?=E5=8F=A5=E4=B8=AD"=E5=A6=82=E4=BD=95=E6=B1=82=E8=81=8C?= =?UTF-8?q?=E6=9C=80=E5=B0=8F=E7=94=9F=E6=88=90=E6=A0=91=E7=9A=84=E6=AF=8F?= =?UTF-8?q?=E4=B8=80=E6=9D=A1=E8=BE=B9"=E7=9A=84"=E6=B1=82=E8=81=8C"?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=B8=BA"=E8=8E=B7=E5=BE=97"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0053.\345\257\273\345\256\235-prim.md" | 280 +++++++++--------- 1 file changed, 140 insertions(+), 140 deletions(-) diff --git "a/problems/kamacoder/0053.\345\257\273\345\256\235-prim.md" "b/problems/kamacoder/0053.\345\257\273\345\256\235-prim.md" index a8dad4cbfc..d2c9578a89 100644 --- "a/problems/kamacoder/0053.\345\257\273\345\256\235-prim.md" +++ "b/problems/kamacoder/0053.\345\257\273\345\256\235-prim.md" @@ -9,17 +9,17 @@ 在世界的某个区域,有一些分散的神秘岛屿,每个岛屿上都有一种珍稀的资源或者宝藏。国王打算在这些岛屿上建公路,方便运输。 -不同岛屿之间,路途距离不同,国王希望你可以规划建公路的方案,如何可以以最短的总公路距离将 所有岛屿联通起来。 +不同岛屿之间,路途距离不同,国王希望你可以规划建公路的方案,如何可以以最短的总公路距离将所有岛屿联通起来。 给定一张地图,其中包括了所有的岛屿,以及它们之间的距离。以最小化公路建设长度,确保可以链接到所有岛屿。 输入描述: -第一行包含两个整数V 和 E,V代表顶点数,E代表边数 。顶点编号是从1到V。例如:V=2,一个有两个顶点,分别是1和2。 +第一行包含两个整数V和E,V代表顶点数,E代表边数。顶点编号是从1到V。例如:V=2,一个有两个顶点,分别是1和2。 -接下来共有 E 行,每行三个整数 v1,v2 和 val,v1 和 v2 为边的起点和终点,val代表边的权值。 +接下来共有E行,每行三个整数v1,v2和val,v1和v2为边的起点和终点,val代表边的权值。 -输出描述: +输出描述: 输出联通所有岛屿的最小路径总距离 @@ -38,65 +38,65 @@ 5 6 2 5 7 1 6 7 1 -``` +``` -输出示例: +输出示例: 6 -## 解题思路 +## 解题思路 -本题是最小生成树的模板题,那么我们来讲一讲最小生成树。 +本题是最小生成树的模板题,那么我们来讲一讲最小生成树。 -最小生成树 可以使用 prim算法 也可以使用 kruskal算法计算出来。 +最小生成树可以使用prim算法也可以使用kruskal算法计算出来。 -本篇我们先讲解 prim算法。 +本篇我们先讲解prim算法。 -最小生成树是所有节点的最小连通子图, 即:以最小的成本(边的权值)将图中所有节点链接到一起。 +最小生成树是所有节点的最小连通子图,即:以最小的成本(边的权值)将图中所有节点链接到一起。 -图中有n个节点,那么一定可以用 n - 1 条边将所有节点连接到一起。 +图中有n个节点,那么一定可以用n-1条边将所有节点连接到一起。 -那么如何选择 这 n-1 条边 就是 最小生成树算法的任务所在。 +那么如何选择这n-1条边就是最小生成树算法的任务所在。 -例如本题示例中的无向有权图为: +例如本题示例中的无向有权图为: ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20231206164306.png) -那么在这个图中,如何选取 n-1 条边 使得 图中所有节点连接到一起,并且边的权值和最小呢? +那么在这个图中,如何选取n-1条边使得图中所有节点连接到一起,并且边的权值和最小呢? -(图中为n为7,即7个节点,那么只需要 n-1 即 6条边就可以讲所有顶点连接到一起) +(图中为n为7,即7个节点,那么只需要n-1即6条边就可以讲所有顶点连接到一起) -prim算法 是从节点的角度 采用贪心的策略 每次寻找距离 最小生成树最近的节点 并加入到最小生成树中。 +prim算法是从节点的角度采用贪心的策略每次寻找距离最小生成树最近的节点并加入到最小生成树中。 -prim算法核心就是三步,我称为**prim三部曲**,大家一定要熟悉这三步,代码相对会好些很多: +prim算法核心就是三步,我称为**prim三部曲**,大家一定要熟悉这三步,代码相对会好些很多: 1. 第一步,选距离生成树最近节点 -2. 第二步,最近节点加入生成树 +2. 第二步,最近节点加入生成树 3. 第三步,更新非生成树节点到生成树的距离(即更新minDist数组) -现在录友们会对这三步很陌生,不知道这是干啥的,没关系,下面将会画图举例来带大家把这**prim三部曲**理解到位。 +现在录友们会对这三步很陌生,不知道这是干啥的,没关系,下面将会画图举例来带大家把这**prim三部曲**理解到位。 在prim算法中,有一个数组特别重要,这里我起名为:minDist。 -刚刚我有讲过 “每次寻找距离 最小生成树最近的节点 并加入到最小生成树中”,那么如何寻找距离最小生成树最近的节点呢? +刚刚我有讲过“每次寻找距离最小生成树最近的节点并加入到最小生成树中”,那么如何寻找距离最小生成树最近的节点呢? -这就用到了 minDist 数组, 它用来作什么呢? +这就用到了minDist数组,它用来作什么呢? -**minDist数组 用来记录 每一个节点距离最小生成树的最近距离**。 理解这一点非常重要,这也是 prim算法最核心要点所在,很多录友看不懂prim算法的代码,都是因为没有理解透 这个数组的含义。 +**minDist数组用来记录每一个节点距离最小生成树的最近距离**。理解这一点非常重要,这也是prim算法最核心要点所在,很多录友看不懂prim算法的代码,都是因为没有理解透这个数组的含义。 -接下来,我们来通过一步一步画图,来带大家巩固 **prim三部曲** 以及 minDist数组 的作用。 +接下来,我们来通过一步一步画图,来带大家巩固**prim三部曲**以及minDist数组的作用。 -(**示例中节点编号是从1开始,所以为了让大家看的不晕,minDist数组下标我也从 1 开始计数,下标0 就不使用了,这样 下标和节点标号就可以对应上了,避免大家搞混**) +(**示例中节点编号是从1开始,所以为了让大家看的不晕,minDist数组下标我也从1开始计数,下标0就不使用了,这样下标和节点标号就可以对应上了,避免大家搞混**) -### 1 初始状态 +### 1 初始状态 -minDist 数组 里的数值初始化为 最大数,因为本题 节点距离不会超过 10000,所以 初始化最大数为 10001就可以。 +minDist数组里的数值初始化为最大数,因为本题节点距离不会超过10000,所以初始化最大数为10001就可以。 -相信这里录友就要问了,为什么这么做? +相信这里录友就要问了,为什么这么做? -现在 还没有最小生成树,默认每个节点距离最小生成树是最大的,这样后面我们在比较的时候,发现更近的距离,才能更新到 minDist 数组上。 +现在还没有最小生成树,默认每个节点距离最小生成树是最大的,这样后面我们在比较的时候,发现更近的距离,才能更新到minDist数组上。 如图: @@ -108,125 +108,125 @@ minDist 数组 里的数值初始化为 最大数,因为本题 节点距离不 1、prim三部曲,第一步:选距离生成树最近节点 -选择距离最小生成树最近的节点,加入到最小生成树,刚开始还没有最小生成树,所以随便选一个节点加入就好(因为每一个节点一定会在最小生成树里,所以随便选一个就好),那我们选择节点1 (符合遍历数组的习惯,第一个遍历的也是节点1) +选择距离最小生成树最近的节点,加入到最小生成树,刚开始还没有最小生成树,所以随便选一个节点加入就好(因为每一个节点一定会在最小生成树里,所以随便选一个就好),那我们选择节点1(符合遍历数组的习惯,第一个遍历的也是节点1) -2、prim三部曲,第二步:最近节点加入生成树 +2、prim三部曲,第二步:最近节点加入生成树 -此时 节点1 已经算最小生成树的节点。 +此时节点1已经算最小生成树的节点。 3、prim三部曲,第三步:更新非生成树节点到生成树的距离(即更新minDist数组) -接下来,我们要更新所有节点距离最小生成树的距离,如图: +接下来,我们要更新所有节点距离最小生成树的距离,如图: ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20231222102048.png) -注意下标0,我们就不管它了,下标 1 与节点 1 对应,这样可以避免大家把节点搞混。 +注意下标0,我们就不管它了,下标1与节点1对应,这样可以避免大家把节点搞混。 -此时所有非生成树的节点距离 最小生成树(节点1)的距离都已经跟新了 。 +此时所有非生成树的节点距离最小生成树(节点1)的距离都已经跟新了。 -* 节点2 与 节点1 的距离为1,比原先的 距离值10001小,所以更新minDist[2]。 -* 节点3 和 节点1 的距离为1,比原先的 距离值10001小,所以更新minDist[3]。 -* 节点5 和 节点1 的距离为2,比原先的 距离值10001小,所以更新minDist[5]。 +* 节点2与节点1的距离为1,比原先的距离值10001小,所以更新minDist[2]。 +* 节点3和节点1的距离为1,比原先的距离值10001小,所以更新minDist[3]。 +* 节点5和节点1的距离为2,比原先的距离值10001小,所以更新minDist[5]。 -**注意图中我标记了 minDist数组里更新的权值**,是哪两个节点之间的权值,例如 minDist[2] =1 ,这个 1 是 节点1 与 节点2 之间的连线,清楚这一点对最后我们记录 最小生成树的权值总和很重要。 +**注意图中我标记了minDist数组里更新的权值**,是哪两个节点之间的权值,例如minDist[2]=1,这个1是节点1与节点2之间的连线,清楚这一点对最后我们记录最小生成树的权值总和很重要。 -(我在后面依然会不断重复 prim三部曲,可能基础好的录友会感觉有点啰嗦,但也是让大家感觉这三部曲求解的过程) +(我在后面依然会不断重复prim三部曲,可能基础好的录友会感觉有点啰嗦,但也是让大家感觉这三部曲求解的过程) -### 3 +### 3 1、prim三部曲,第一步:选距离生成树最近节点 -选取一个距离 最小生成树(节点1) 最近的非生成树里的节点,节点2,3,5 距离 最小生成树(节点1) 最近,选节点 2(其实选 节点3或者节点2都可以,距离一样的)加入最小生成树。 +选取一个距离最小生成树(节点1)最近的非生成树里的节点,节点2,3,5距离最小生成树(节点1)最近,选节点2(其实选节点3或者节点2都可以,距离一样的)加入最小生成树。 -2、prim三部曲,第二步:最近节点加入生成树 +2、prim三部曲,第二步:最近节点加入生成树 -此时 节点1 和 节点2,已经算最小生成树的节点。 +此时节点1和节点2,已经算最小生成树的节点。 3、prim三部曲,第三步:更新非生成树节点到生成树的距离(即更新minDist数组) -接下来,我们要更新节点距离最小生成树的距离,如图: +接下来,我们要更新节点距离最小生成树的距离,如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20231222102431.png) +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20231222102431.png) -此时所有非生成树的节点距离 最小生成树(节点1、节点2)的距离都已经跟新了 。 +此时所有非生成树的节点距离最小生成树(节点1、节点2)的距离都已经跟新了。 -* 节点3 和 节点2 的距离为2,和原先的距离值1 小,所以不用更新。 -* 节点4 和 节点2 的距离为2,比原先的距离值10001小,所以更新minDist[4]。 -* 节点5 和 节点2 的距离为10001(不连接),所以不用更新。 -* 节点6 和 节点2 的距离为1,比原先的距离值10001小,所以更新minDist[6]。 +* 节点3和节点2的距离为2,和原先的距离值1小,所以不用更新。 +* 节点4和节点2的距离为2,比原先的距离值10001小,所以更新minDist[4]。 +* 节点5和节点2的距离为10001(不连接),所以不用更新。 +* 节点6和节点2的距离为1,比原先的距离值10001小,所以更新minDist[6]。 -### 4 +### 4 1、prim三部曲,第一步:选距离生成树最近节点 -选择一个距离 最小生成树(节点1、节点2) 最近的非生成树里的节点,节点3,6 距离 最小生成树(节点1、节点2) 最近,选节点3 (选节点6也可以,距离一样)加入最小生成树。 +选择一个距离最小生成树(节点1、节点2)最近的非生成树里的节点,节点3,6距离最小生成树(节点1、节点2)最近,选节点3(选节点6也可以,距离一样)加入最小生成树。 -2、prim三部曲,第二步:最近节点加入生成树 +2、prim三部曲,第二步:最近节点加入生成树 -此时 节点1 、节点2 、节点3 算是最小生成树的节点。 +此时节点1、节点2、节点3算是最小生成树的节点。 3、prim三部曲,第三步:更新非生成树节点到生成树的距离(即更新minDist数组) -接下来更新节点距离最小生成树的距离,如图: +接下来更新节点距离最小生成树的距离,如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20231222102457.png) +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20231222102457.png) -所有非生成树的节点距离 最小生成树(节点1、节点2、节点3 )的距离都已经跟新了 。 +所有非生成树的节点距离最小生成树(节点1、节点2、节点3)的距离都已经跟新了。 -* 节点 4 和 节点 3的距离为 1,和原先的距离值 2 小,所以更新minDist[4]为1。 +* 节点4和节点3的距离为1,和原先的距离值2小,所以更新minDist[4]为1。 -上面为什么我们只比较 节点4 和 节点3 的距离呢? +上面为什么我们只比较节点4和节点3的距离呢? -因为节点3加入 最小生成树后,非 生成树节点 只有 节点 4 和 节点3是链接的,所以需要重新更新一下 节点4距离最小生成树的距离,其他节点距离最小生成树的距离 都不变。 +因为节点3加入最小生成树后,非生成树节点只有节点4和节点3是链接的,所以需要重新更新一下节点4距离最小生成树的距离,其他节点距离最小生成树的距离都不变。 -### 5 +### 5 1、prim三部曲,第一步:选距离生成树最近节点 -继续选择一个距离 最小生成树(节点1、节点2、节点3) 最近的非生成树里的节点,为了巩固大家对 minDist数组的理解,这里我再啰嗦一遍: +继续选择一个距离最小生成树(节点1、节点2、节点3)最近的非生成树里的节点,为了巩固大家对minDist数组的理解,这里我再啰嗦一遍: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20231217213516.png) +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20231217213516.png) -**minDist数组 是记录了 所有非生成树节点距离生成树的最小距离**,所以 从数组里我们能看出来,非生成树节点 4 和 节点 6 距离 生成树最近。 +**minDist数组是记录了所有非生成树节点距离生成树的最小距离**,所以从数组里我们能看出来,非生成树节点4和节点6距离生成树最近。 -任选一个加入生成树,我们选 节点4(选节点6也行) 。 +任选一个加入生成树,我们选节点4(选节点6也行)。 -**注意**,我们根据 minDist数组,选取距离 生成树 最近的节点 加入生成树,那么 **minDist数组里记录的其实也是 最小生成树的边的权值**(我在图中把权值对应的是哪两个节点也标记出来了)。 +**注意**,我们根据minDist数组,选取距离生成树最近的节点加入生成树,那么**minDist数组里记录的其实也是最小生成树的边的权值**(我在图中把权值对应的是哪两个节点也标记出来了)。 -如果大家不理解,可以跟着我们下面的讲解,看 minDist数组的变化, minDist数组 里记录的权值对应的哪条边。 +如果大家不理解,可以跟着我们下面的讲解,看minDist数组的变化,minDist数组里记录的权值对应的哪条边。 -理解这一点很重要,因为 最后我们要求 最小生成树里所有边的权值和。 +理解这一点很重要,因为最后我们要求最小生成树里所有边的权值和。 -2、prim三部曲,第二步:最近节点加入生成树 +2、prim三部曲,第二步:最近节点加入生成树 -此时 节点1、节点2、节点3、节点4 算是 最小生成树的节点。 +此时节点1、节点2、节点3、节点4算是最小生成树的节点。 3、prim三部曲,第三步:更新非生成树节点到生成树的距离(即更新minDist数组) -接下来更新节点距离最小生成树的距离,如图: +接下来更新节点距离最小生成树的距离,如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20231222102618.png) +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20231222102618.png) -minDist数组已经更新了 所有非生成树的节点距离 最小生成树(节点1、节点2、节点3、节点4 )的距离 。 +minDist数组已经更新了所有非生成树的节点距离最小生成树(节点1、节点2、节点3、节点4)的距离。 -* 节点 5 和 节点 4的距离为 1,和原先的距离值 2 小,所以更新minDist[5]为1。 +* 节点5和节点4的距离为1,和原先的距离值2小,所以更新minDist[5]为1。 -### 6 +### 6 1、prim三部曲,第一步:选距离生成树最近节点 -继续选距离 最小生成树(节点1、节点2、节点3、节点4 )最近的非生成树里的节点,只有 节点 5 和 节点6。 +继续选距离最小生成树(节点1、节点2、节点3、节点4)最近的非生成树里的节点,只有节点5和节点6。 -选节点5 (选节点6也可以)加入 生成树。 +选节点5(选节点6也可以)加入生成树。 -2、prim三部曲,第二步:最近节点加入生成树 +2、prim三部曲,第二步:最近节点加入生成树 -节点1、节点2、节点3、节点4、节点5 算是 最小生成树的节点。 +节点1、节点2、节点3、节点4、节点5算是最小生成树的节点。 3、prim三部曲,第三步:更新非生成树节点到生成树的距离(即更新minDist数组) @@ -234,44 +234,44 @@ minDist数组已经更新了 所有非生成树的节点距离 最小生成树 ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20231222102646.png) -minDist数组已经更新了 所有非生成树的节点距离 最小生成树(节点1、节点2、节点3、节点4 、节点5)的距离 。 +minDist数组已经更新了所有非生成树的节点距离最小生成树(节点1、节点2、节点3、节点4、节点5)的距离。 -* 节点 6 和 节点 5 距离为 2,比原先的距离值 1 大,所以不更新 -* 节点 7 和 节点 5 距离为 1,比原先的距离值 10001小,更新 minDist[7] +* 节点6和节点5距离为2,比原先的距离值1大,所以不更新 +* 节点7和节点5距离为1,比原先的距离值10001小,更新minDist[7] -### 7 +### 7 1、prim三部曲,第一步:选距离生成树最近节点 -继续选距离 最小生成树(节点1、节点2、节点3、节点4 、节点5)最近的非生成树里的节点,只有 节点 6 和 节点7。 +继续选距离最小生成树(节点1、节点2、节点3、节点4、节点5)最近的非生成树里的节点,只有节点6和节点7。 -2、prim三部曲,第二步:最近节点加入生成树 +2、prim三部曲,第二步:最近节点加入生成树 -选节点6 (选节点7也行,距离一样的)加入生成树。 +选节点6(选节点7也行,距离一样的)加入生成树。 3、prim三部曲,第三步:更新非生成树节点到生成树的距离(即更新minDist数组) -节点1、节点2、节点3、节点4、节点5、节点6 算是 最小生成树的节点 ,接下来更新节点距离最小生成树的距离,如图: +节点1、节点2、节点3、节点4、节点5、节点6算是最小生成树的节点,接下来更新节点距离最小生成树的距离,如图: ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20231222102732.png) -这里就不在重复描述了,大家类推,最后,节点7加入生成树,如图: +这里就不在重复描述了,大家类推,最后,节点7加入生成树,如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20231222102820.png) +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20231222102820.png) -### 最后 +### 最后 -最后我们就生成了一个 最小生成树, 绿色的边将所有节点链接到一起,并且 保证权值是最小的,因为我们在更新 minDist 数组的时候,都是选距离 最小生成树最近的点 加入到树中。 +最后我们就生成了一个最小生成树,绿色的边将所有节点链接到一起,并且保证权值是最小的,因为我们在更新minDist数组的时候,都是选距离最小生成树最近的点加入到树中。 -讲解上面的模拟过程的时候,我已经强调多次 minDist数组 是记录了 所有非生成树节点距离生成树的最小距离。 +讲解上面的模拟过程的时候,我已经强调多次minDist数组是记录了所有非生成树节点距离生成树的最小距离。 -最后,minDist数组 也就是记录的是最小生成树所有边的权值。 +最后,minDist数组也就是记录的是最小生成树所有边的权值。 -我在图中,特别把 每条边的权值对应的是哪两个节点 标记出来(例如minDist[7] = 1,对应的是节点5 和 节点7之间的边,而不是 节点6 和 节点7),为了就是让大家清楚, minDist里的每一个值 对应的是哪条边。 +我在图中,特别把每条边的权值对应的是哪两个节点标记出来(例如minDist[7]=1,对应的是节点5和节点7之间的边,而不是节点6和节点7),为了就是让大家清楚,minDist里的每一个值对应的是哪条边。 -那么我们要求最小生成树里边的权值总和 就是 把 最后的 minDist 数组 累加一起。 +那么我们要求最小生成树里边的权值总和就是把最后的minDist数组累加一起。 -以下代码,我对 prim三部曲,做了重点注释,大家根据这三步,就可以 透彻理解prim。 +以下代码,我对prim三部曲,做了重点注释,大家根据这三步,就可以透彻理解prim。 ```CPP #include @@ -338,52 +338,52 @@ int main() { } -``` +``` -时间复杂度为 O(n^2),其中 n 为节点数量。 +时间复杂度为O(n^2),其中n为节点数量。 ## 拓展 -上面讲解的是记录了最小生成树 所有边的权值,如果让打印出来 最小生成树的每条边呢? 或者说 要把这个最小生成树画出来呢? +上面讲解的是记录了最小生成树所有边的权值,如果让打印出来最小生成树的每条边呢?或者说要把这个最小生成树画出来呢? -此时我们就需要把 最小生成树里每一条边记录下来。 +此时我们就需要把最小生成树里每一条边记录下来。 -此时有两个问题: +此时有两个问题: -* 1、用什么结构来记录 -* 2、如何记录 +* 1、用什么结构来记录 +* 2、如何记录 -如果记录边,其实就是记录两个节点就可以,两个节点连成一条边。 +如果记录边,其实就是记录两个节点就可以,两个节点连成一条边。 如何记录两个节点呢? -我们使用一维数组就可以记录。 parent[节点编号] = 节点编号, 这样就把一条边记录下来了。(当然如果节点编号非常大,可以考虑使用map) +我们使用一维数组就可以记录。parent[节点编号] = 节点编号,这样就把一条边记录下来了。(当然如果节点编号非常大,可以考虑使用map) -使用一维数组记录是有向边,不过我们这里不需要记录方向,所以只关注两条边是连接的就行。 +使用一维数组记录是有向边,不过我们这里不需要记录方向,所以只关注两条边是连接的就行。 -parent数组初始化代码: +parent数组初始化代码: ```CPP vector parent(v + 1, -1); ``` -接下来就是第二个问题,如何记录? +接下来就是第二个问题,如何记录? -我们再来回顾一下 prim三部曲, +我们再来回顾一下prim三部曲, 1. 第一步,选距离生成树最近节点 -2. 第二步,最近节点加入生成树 +2. 第二步,最近节点加入生成树 3. 第三步,更新非生成树节点到生成树的距离(即更新minDist数组) -大家先思考一下,我们是在第几步,可以记录 最小生成树的边呢? +大家先思考一下,我们是在第几步,可以记录最小生成树的边呢? -在本面上半篇 我们讲解过:“我们根据 minDist数组,选组距离 生成树 最近的节点 加入生成树,那么 **minDist数组里记录的其实也是 最小生成树的边的权值**。” +在本面上半篇我们讲解过:“我们根据minDist数组,选组距离生成树最近的节点加入生成树,那么**minDist数组里记录的其实也是最小生成树的边的权值**。” -既然 minDist数组 记录了 最小生成树的边,是不是就是在更新 minDist数组 的时候,去更新parent数组来记录一下对应的边呢。 +既然minDist数组记录了最小生成树的边,是不是就是在更新minDist数组的时候,去更新parent数组来记录一下对应的边呢。 -所以 在 prim三部曲中的第三步,更新 parent数组,代码如下: +所以在prim三部曲中的第三步,更新parent数组,代码如下: ```CPP for (int j = 1; j <= v; j++) { @@ -394,23 +394,23 @@ for (int j = 1; j <= v; j++) { } ``` -代码中注释中,我强调了 数组指向的顺序很重要。 因为不少录友在这里会写成这样: `parent[cur] = j` 。 +代码中注释中,我强调了数组指向的顺序很重要。因为不少录友在这里会写成这样: `parent[cur] = j` 。 -这里估计大家会疑惑了,parent[节点编号A] = 节点编号B, 就表示A 和 B 相连,我们这里就不用在意方向,代码中 为什么 只能 `parent[j] = cur` 而不能 `parent[cur] = j` 这么写呢? +这里估计大家会疑惑了,parent[节点编号A] = 节点编号B,就表示A和B相连,我们这里就不用在意方向,代码中为什么只能 `parent[j] = cur` 而不能 `parent[cur] = j` 这么写呢? -如果写成 `parent[cur] = j`,在 for 循环中,有多个 j 满足要求, 那么 parent[cur] 就会被反复覆盖,因为 cur 是一个固定值。 +如果写成 `parent[cur] = j`,在for循环中,有多个j满足要求,那么 parent[cur] 就会被反复覆盖,因为cur是一个固定值。 -举个例子,cur = 1, 在 for循环中,可能 就 j = 2, j = 3,j =4 都符合条件,那么本来应该记录 节点1 与 节点 2、节点3、节点4相连的。 +举个例子,cur=1,在for循环中,可能就j=2,j=3,j=4都符合条件,那么本来应该记录节点1与节点2、节点3、节点4相连的。 -如果 `parent[cur] = j` 这么写,最后更新的逻辑是 parent[1] = 2, parent[1] = 3, parent[1] = 4, 最后只能记录 节点1 与节点 4 相连,其他相连情况都被覆盖了。 +如果 `parent[cur] = j` 这么写,最后更新的逻辑是 parent[1] = 2, parent[1] = 3, parent[1] = 4,最后只能记录节点1与节点4相连,其他相连情况都被覆盖了。 -如果这么写 `parent[j] = cur`, 那就是 parent[2] = 1, parent[3] = 1, parent[4] = 1 ,这样 才能完整表示出 节点1 与 其他节点都是链接的,才没有被覆盖。 +如果这么写 `parent[j] = cur`,那就是 parent[2] = 1, parent[3] = 1, parent[4] = 1 ,这样才能完整表示出节点1与其他节点都是链接的,才没有被覆盖。 主要问题也是我们使用了一维数组来记录。 -如果是二维数组,来记录两个点链接,例如 parent[节点编号A][节点编号B] = 1 ,parent[节点编号B][节点编号A] = 1,来表示 节点A 与 节点B 相连,那就没有上面说的这个注意事项了,当然这么做的话,就是多开辟的内存空间。 +如果是二维数组,来记录两个点链接,例如 parent[节点编号A][节点编号B] = 1 ,parent[节点编号B][节点编号A] = 1,来表示节点A与节点B相连,那就没有上面说的这个注意事项了,当然这么做的话,就是多开辟的内存空间。 -以下是输出最小生成树边的代码,不算最后输出, 就额外添加了两行代码,我都注释标记了: +以下是输出最小生成树边的代码,不算最后输出,就额外添加了两行代码,我都注释标记了: ```CPP #include @@ -460,7 +460,7 @@ int main() { } } -``` +``` 按照本题示例,代码输入如下: @@ -476,40 +476,40 @@ int main() { 注意,这里是无向图,我在输出上添加了箭头仅仅是为了方便大家看出是边的意思。 -大家可以和我们本题最后生成的最小生成树的图 去对比一下 边的链接情况: +大家可以和我们本题最后生成的最小生成树的图去对比一下边的链接情况: ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20231229115714.png) -绿色的边 是最小生成树,和我们的 输出完全一致。 +绿色的边是最小生成树,和我们的输出完全一致。 -## 总结 +## 总结 -此时我就把prim算法讲解完毕了,我们再来回顾一下。 +此时我就把prim算法讲解完毕了,我们再来回顾一下。 -关于 prim算法,我自创了三部曲,来帮助大家理解: +关于prim算法,我自创了三部曲,来帮助大家理解: 1. 第一步,选距离生成树最近节点 -2. 第二步,最近节点加入生成树 +2. 第二步,最近节点加入生成树 3. 第三步,更新非生成树节点到生成树的距离(即更新minDist数组) -大家只要理解这三部曲, prim算法 至少是可以写出一个框架出来,然后在慢慢补充细节,这样不至于 自己在写prim的时候 两眼一抹黑 完全凭感觉去写。 -这也为什么很多录友感觉 prim算法比较难,而且每次学会来,隔一段时间 又不会写了,主要是 没有一个纲领。 +大家只要理解这三部曲,prim算法至少是可以写出一个框架出来,然后在慢慢补充细节,这样不至于自己在写prim的时候两眼一抹黑完全凭感觉去写。 +这也为什么很多录友感觉prim算法比较难,而且每次学会来,隔一段时间又不会写了,主要是没有一个纲领。 -理解这三部曲之后,更重要的 就是理解 minDist数组。 +理解这三部曲之后,更重要的就是理解minDist数组。 -**minDist数组 是prim算法的灵魂,它帮助 prim算法完成最重要的一步,就是如何找到 距离最小生成树最近的点**。 +**minDist数组是prim算法的灵魂,它帮助prim算法完成最重要的一步,就是如何找到距离最小生成树最近的点**。 -再来帮大家回顾 minDist数组 的含义:记录 每一个节点距离最小生成树的最近距离。 +再来帮大家回顾minDist数组的含义:记录每一个节点距离最小生成树的最近距离。 -理解 minDist数组 ,至少大家看prim算法的代码不会懵。 +理解minDist数组,至少大家看prim算法的代码不会懵。 -也正是 因为 minDist数组 的作用,我们根据 minDist数组,选取距离 生成树 最近的节点 加入生成树,那么 **minDist数组里记录的其实也是 最小生成树的边的权值**。 +也正是因为minDist数组的作用,我们根据minDist数组,选取距离生成树最近的节点加入生成树,那么**minDist数组里记录的其实也是最小生成树的边的权值**。 -所以我们求 最小生成树的权值和 就是 计算后的 minDist数组 数值总和。 +所以我们求最小生成树的权值和就是计算后的minDist数组数值总和。 -最后我们拓展了如何求职 最小生成树 的每一条边,其实 添加的代码很简单,主要是理解 为什么使用 parent数组 来记录边 以及 在哪里 更新parent数组。 +最后我们拓展了如何获得最小生成树的每一条边,其实添加的代码很简单,主要是理解为什么使用parent数组来记录边以及在哪里更新parent数组。 -同时,因为使用一维数组,数组的下标和数组 如何赋值很重要,不要搞反,导致结果被覆盖。 +同时,因为使用一维数组,数组的下标和数组如何赋值很重要,不要搞反,导致结果被覆盖。 好了,以上为总结,录友们学习愉快。 From 419db364a32ee28abcdd03a0aa1f7823a5125552 Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Tue, 12 Nov 2024 10:06:56 +0800 Subject: [PATCH 2924/3019] Update --- README.md | 5 +-- ...\345\216\237IP\345\234\260\345\235\200.md" | 3 +- ...11\345\222\214\345\255\220\351\233\206.md" | 44 +++++++++++-------- ...74\232dijkstra\346\234\264\347\264\240.md" | 2 +- ...347\211\251\350\277\220\350\276\223III.md" | 4 +- ...7\232\204\346\224\273\345\207\273astar.md" | 2 +- 6 files changed, 32 insertions(+), 28 deletions(-) diff --git a/README.md b/README.md index 3bb575d1a6..8255bd5a10 100644 --- a/README.md +++ b/README.md @@ -106,8 +106,8 @@ 4. [数组:977.有序数组的平方](./problems/0977.有序数组的平方.md) 5. [数组:209.长度最小的子数组](./problems/0209.长度最小的子数组.md) 6. [数组:区间和](./problems/kamacoder/0058.区间和.md) -6. [数组:59.螺旋矩阵II](./problems/0059.螺旋矩阵II.md) -8. [数组:开发商购买土地](./problems/kamacoder/0044.开发商购买土地.md) +7. [数组:开发商购买土地](./problems/kamacoder/0044.开发商购买土地.md) +8. [数组:59.螺旋矩阵II](./problems/0059.螺旋矩阵II.md) 9. [数组:总结篇](./problems/数组总结篇.md) ## 链表 @@ -196,7 +196,6 @@ 12. [二叉树:110.平衡二叉树](./problems/0110.平衡二叉树.md) 13. [二叉树:257.二叉树的所有路径](./problems/0257.二叉树的所有路径.md) 14. [本周总结!(二叉树)](./problems/周总结/20201003二叉树周末总结.md) -15. [二叉树:二叉树中递归带着回溯](./problems/二叉树中递归带着回溯.md) 16. [二叉树:404.左叶子之和](./problems/0404.左叶子之和.md) 17. [二叉树:513.找树左下角的值](./problems/0513.找树左下角的值.md) 18. [二叉树:112.路径总和](./problems/0112.路径总和.md) diff --git "a/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" "b/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" index eb81f4b662..a03a0e3b15 100644 --- "a/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" +++ "b/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" @@ -376,9 +376,8 @@ class Solution { // 剪枝:ip段的长度最大是3,并且ip段处于[0,255] for (int i = start; i < s.length() && i - start < 3 && Integer.parseInt(s.substring(start, i + 1)) >= 0 && Integer.parseInt(s.substring(start, i + 1)) <= 255; i++) { - // 如果ip段的长度大于1,并且第一位为0的话,continue if (i + 1 - start > 1 && s.charAt(start) - '0' == 0) { - continue; + break; } stringBuilder.append(s.substring(start, i + 1)); // 当stringBuilder里的网段数量小于3时,才会加点;如果等于3,说明已经有3段了,最后一段不需要再加点 diff --git "a/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" "b/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" index 5bd7ff6c81..55ed7ad2ff 100644 --- "a/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" +++ "b/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" @@ -47,7 +47,13 @@ 那么只要找到集合里能够出现 sum / 2 的子集总和,就算是可以分割成两个相同元素和子集了。 -本题是可以用回溯暴力搜索出所有答案的,但最后超时了,也不想再优化了,放弃回溯,直接上01背包吧。 +本题是可以用回溯暴力搜索出所有答案的,但最后超时了,也不想再优化了,放弃回溯。 + +是否有其他解法可以解决此题。 + +本题的本质是,能否把容量为 sum / 2的背包装满。 + +**这是 背包算法可以解决的经典类型题目**。 如果对01背包不够了解,建议仔细看完如下两篇: @@ -56,7 +62,7 @@ ### 01背包问题 -背包问题,大家都知道,有N件物品和一个最多能背重量为W 的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品只能用一次,求解将哪些物品装入背包里物品价值总和最大。 +01背包问题,大家都知道,有N件物品和一个最多能背重量为W 的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品只能用一次,求解将哪些物品装入背包里物品价值总和最大。 **背包问题有多种背包方式,常见的有:01背包、完全背包、多重背包、分组背包和混合背包等等。** @@ -64,32 +70,33 @@ **即一个商品如果可以重复多次放入是完全背包,而只能放入一次是01背包,写法还是不一样的。** -**要明确本题中我们要使用的是01背包,因为元素我们只能用一次。** +**元素我们只能用一次,如果使用背包,那么也是01背包** 回归主题:首先,本题要求集合里能否出现总和为 sum / 2 的子集。 -那么来一一对应一下本题,看看背包问题如何来解决。 +既有一个 只能装重量为 sum / 2 的背包,商品为数字,这些数字能不能把 这个背包装满。 -**只有确定了如下四点,才能把01背包问题套到本题上来。** +那每一件商品是数字的话,对应的重量 和 价值是多少呢? -* 背包的体积为sum / 2 -* 背包要放入的商品(集合里的元素)重量为 元素的数值,价值也为元素的数值 -* 背包如果正好装满,说明找到了总和为 sum / 2 的子集。 -* 背包中每一个元素是不可重复放入。 +一个数字只有一个维度,即 重量等于价值。 -以上分析完,我们就可以套用01背包,来解决这个问题了。 +当数字 可以装满 承载重量为 sum / 2 的背包的背包时,这个背包的价值也是 sum / 2。 -动规五部曲分析如下: +那么这道题就是 装满 承载重量为 sum / 2 的背包,价值最大是多少? -1. 确定dp数组以及下标的含义 +如果最大价值是 sum / 2,说明正好被商品装满了。 -01背包中,dp[j] 表示: 容量为j的背包,所背的物品价值最大可以为dp[j]。 +因为商品是数字,重量和对应的价值是相同的。 -本题中每一个元素的数值既是重量,也是价值。 +以上分析完,我们就可以直接用01背包 来解决这个问题了。 -**套到本题,dp[j]表示 背包总容量(所能装的总重量)是j,放进物品后,背的最大重量为dp[j]**。 +动规五部曲分析如下: + +1. 确定dp数组以及下标的含义 -那么如果背包容量为target, dp[target]就是装满 背包之后的重量,所以 当 dp[target] == target 的时候,背包就装满了。 +01背包中,dp[j] 表示: 容量(所能装的重量)为j的背包,所背的物品价值最大可以为dp[j]。 + +如果背包所载重量为target, dp[target]就是装满 背包之后的总价值,因为 本题中每一个元素的数值既是重量,也是价值,所以,当 dp[target] == target 的时候,背包就装满了。 有录友可能想,那还有装不满的时候? @@ -192,12 +199,11 @@ public: ## 总结 -这道题目就是一道01背包应用类的题目,需要我们拆解题目,然后套入01背包的场景。 +这道题目就是一道01背包经典应用类的题目,需要我们拆解题目,然后才能发现可以使用01背包。 01背包相对于本题,主要要理解,题目中物品是nums[i],重量是nums[i],价值也是nums[i],背包体积是sum/2。 -看代码的话,就可以发现,基本就是按照01背包的写法来的。 - +做完本题后,需要大家清晰:背包问题,不仅可以求 背包能被的最大价值,还可以求这个背包是否可以装满。 ## 其他语言版本 diff --git "a/problems/kamacoder/0047.\345\217\202\344\274\232dijkstra\346\234\264\347\264\240.md" "b/problems/kamacoder/0047.\345\217\202\344\274\232dijkstra\346\234\264\347\264\240.md" index c0a490b343..eb2d51cff9 100644 --- "a/problems/kamacoder/0047.\345\217\202\344\274\232dijkstra\346\234\264\347\264\240.md" +++ "b/problems/kamacoder/0047.\345\217\202\344\274\232dijkstra\346\234\264\347\264\240.md" @@ -578,7 +578,7 @@ int main() { 更新 minDist数组,即:源点(节点1) 到 节点2 和 节点3的距离。 * 源点到节点2的最短距离为100,小于原minDist[2]的数值max,更新minDist[2] = 100 -* 源点到节点3的最短距离为1,小于原minDist[3]的数值max,更新minDist[4] = 1 +* 源点到节点3的最短距离为1,小于原minDist[3]的数值max,更新minDist[3] = 1 ------------------- diff --git "a/problems/kamacoder/0096.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223III.md" "b/problems/kamacoder/0096.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223III.md" index dacd23d11d..60c997a5d8 100644 --- "a/problems/kamacoder/0096.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223III.md" +++ "b/problems/kamacoder/0096.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223III.md" @@ -215,9 +215,9 @@ int main() { ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240409111849.png) -边:节点3 -> 节点4,权值为1 ,minDist[4] > minDist[3] + 1,更新 minDist[4] = 0 + (-1) = -1 ,如图: +边:节点3 -> 节点4,权值为1 ,minDist[4] > minDist[3] + 1,更新 minDist[4] = 0 + 1 = 1 ,如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240409111837.png) +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20241018192042.png) 以上是对所有边进行的第一次松弛,最后 minDist数组为 :-1 -1 0 1 ,(从下标1算起) diff --git "a/problems/kamacoder/0126.\351\252\221\345\243\253\347\232\204\346\224\273\345\207\273astar.md" "b/problems/kamacoder/0126.\351\252\221\345\243\253\347\232\204\346\224\273\345\207\273astar.md" index 2d0481ecec..8d53276c20 100644 --- "a/problems/kamacoder/0126.\351\252\221\345\243\253\347\232\204\346\224\273\345\207\273astar.md" +++ "b/problems/kamacoder/0126.\351\252\221\345\243\253\347\232\204\346\224\273\345\207\273astar.md" @@ -173,7 +173,7 @@ int n=q.front();q.pop(); G:起点达到目前遍历节点的距离 -F:目前遍历的节点到达终点的距离 +H:目前遍历的节点到达终点的距离 起点达到目前遍历节点的距离 + 目前遍历的节点到达终点的距离 就是起点到达终点的距离。 From 4ddbb265e47e79919ad501c087919f99a4615612 Mon Sep 17 00:00:00 2001 From: swjtuhjf Date: Tue, 12 Nov 2024 10:38:41 +0800 Subject: [PATCH 2925/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200095.=E5=9F=8E?= =?UTF-8?q?=E5=B8=82=E9=97=B4=E8=B4=A7=E7=89=A9=E8=BF=90=E8=BE=93II=20pyth?= =?UTF-8?q?on3=20SPFA=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\347\211\251\350\277\220\350\276\223II.md" | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git "a/problems/kamacoder/0095.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223II.md" "b/problems/kamacoder/0095.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223II.md" index ac6ccf3c0d..a88e462ad6 100644 --- "a/problems/kamacoder/0095.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223II.md" +++ "b/problems/kamacoder/0095.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223II.md" @@ -333,6 +333,8 @@ public class Main { ### Python +Bellman-Ford方法求解含有负回路的最短路问题 + ```python import sys @@ -388,6 +390,52 @@ if __name__ == "__main__": ``` +SPFA方法求解含有负回路的最短路问题 + +```python +from collections import deque +from math import inf + +def main(): + n, m = [int(i) for i in input().split()] + graph = [[] for _ in range(n+1)] + min_dist = [inf for _ in range(n+1)] + count = [0 for _ in range(n+1)] # 记录节点加入队列的次数 + for _ in range(m): + s, t, v = [int(i) for i in input().split()] + graph[s].append([t, v]) + + min_dist[1] = 0 # 初始化 + count[1] = 1 + d = deque([1]) + flag = False + + while d: # 主循环 + cur_node = d.popleft() + for next_node, val in graph[cur_node]: + if min_dist[next_node] > min_dist[cur_node] + val: + min_dist[next_node] = min_dist[cur_node] + val + count[next_node] += 1 + if next_node not in d: + d.append(next_node) + if count[next_node] == n: # 如果某个点松弛了n次,说明有负回路 + flag = True + if flag: + break + + if flag: + print("circle") + else: + if min_dist[-1] == inf: + print("unconnected") + else: + print(min_dist[-1]) + + +if __name__ == "__main__": + main() +``` + ### Go ### Rust From 947424d311d767dec59f5820b9a83f51da5c2bcc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=B6=E7=AC=9B?= <128707187+catherinexrk@users.noreply.github.com> Date: Tue, 12 Nov 2024 10:52:30 +0800 Subject: [PATCH 2926/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200103.=E6=B0=B4?= =?UTF-8?q?=E6=B5=81=E9=97=AE=E9=A2=98.=20Go=E8=AF=AD=E8=A8=80=20DFS?= =?UTF-8?q?=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...64\346\265\201\351\227\256\351\242\230.md" | 75 +++++++++++++++++++ 1 file changed, 75 insertions(+) diff --git "a/problems/kamacoder/0103.\346\260\264\346\265\201\351\227\256\351\242\230.md" "b/problems/kamacoder/0103.\346\260\264\346\265\201\351\227\256\351\242\230.md" index 9a34bf094f..65d36e480a 100644 --- "a/problems/kamacoder/0103.\346\260\264\346\265\201\351\227\256\351\242\230.md" +++ "b/problems/kamacoder/0103.\346\260\264\346\265\201\351\227\256\351\242\230.md" @@ -413,6 +413,81 @@ if __name__ == "__main__": ``` ### Go +```go +package main + +import ( + "os" + "fmt" + "strings" + "strconv" + "bufio" +) + +var directions = [][]int{{0, -1}, {0, 1}, {-1, 0}, {1, 0}} // 四个方向的偏移量 + +func main() { + scanner := bufio.NewScanner(os.Stdin) + + scanner.Scan() + lineList := strings.Fields(scanner.Text()) + N, _ := strconv.Atoi(lineList[0]) + M, _ := strconv.Atoi(lineList[1]) + + grid := make([][]int, N) + visited := make([][]bool, N) // 用于标记是否访问过 + for i := 0; i < N; i++ { + grid[i] = make([]int, M) + visited[i] = make([]bool, M) + scanner.Scan() + lineList = strings.Fields(scanner.Text()) + + for j := 0; j < M; j++ { + grid[i][j], _ = strconv.Atoi(lineList[j]) + } + } + + // 遍历每个单元格,使用DFS检查是否可达两组边界 + for i := 0; i < N; i++ { + for j := 0; j < M; j++ { + canReachFirst, canReachSecond := dfs(grid, visited, i, j) + if canReachFirst && canReachSecond { + fmt.Println(strconv.Itoa(i) + " " + strconv.Itoa(j)) + } + } + } +} + +func dfs(grid [][]int, visited [][]bool, startx int, starty int) (bool, bool) { + visited[startx][starty] = true + canReachFirst := startx == 0 || starty == 0 || startx == len(grid)-1 || starty == len(grid[0])-1 + canReachSecond := startx == len(grid)-1 || starty == len(grid[0])-1 || startx == 0 || starty == 0 + + if canReachFirst && canReachSecond { + return true, true + } + + for _, direction := range directions { + nextx := startx + direction[0] + nexty := starty + direction[1] + + if nextx < 0 || nextx >= len(grid) || nexty < 0 || nexty >= len(grid[0]) { + continue + } + + if grid[nextx][nexty] <= grid[startx][starty] && !visited[nextx][nexty] { + hasReachFirst, hasReachSecond := dfs(grid, visited, nextx, nexty) + if !canReachFirst { + canReachFirst = hasReachFirst + } + if !canReachSecond { + canReachSecond = hasReachSecond + } + } + } + return canReachFirst, canReachSecond +} +``` ### Rust From 6c497c692b53da154458e82d719cc9c25268e132 Mon Sep 17 00:00:00 2001 From: swjtuhjf Date: Tue, 12 Nov 2024 14:04:38 +0800 Subject: [PATCH 2927/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200096.=E5=9F=8E?= =?UTF-8?q?=E5=B8=82=E9=97=B4=E8=B4=A7=E7=89=A9=E8=BF=90=E8=BE=93III=20pyt?= =?UTF-8?q?hon3=20SPFA=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...347\211\251\350\277\220\350\276\223III.md" | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git "a/problems/kamacoder/0096.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223III.md" "b/problems/kamacoder/0096.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223III.md" index a41332cf5c..109027b102 100644 --- "a/problems/kamacoder/0096.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223III.md" +++ "b/problems/kamacoder/0096.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223III.md" @@ -703,6 +703,9 @@ public class Main { ``` ### Python + +Bellman-Ford方法求解单源有限最短路 + ```python def main(): # 輸入 @@ -736,6 +739,48 @@ def main(): +if __name__ == "__main__": + main() +``` + +SPFA方法求解单源有限最短路 + +```python +from collections import deque +from math import inf + + +def main(): + n, m = [int(i) for i in input().split()] + graph = [[] for _ in range(n+1)] + for _ in range(m): + v1, v2, val = [int(i) for i in input().split()] + graph[v1].append([v2, val]) + src, dst, k = [int(i) for i in input().split()] + min_dist = [inf for _ in range(n+1)] + min_dist[src] = 0 # 初始化起点的距离 + que = deque([src]) + + while k != -1 and que: + visited = [False for _ in range(n+1)] # 用于保证每次松弛时一个节点最多加入队列一次 + que_size = len(que) + temp_dist = min_dist.copy() # 用于记录上一次遍历的结果 + for _ in range(que_size): + cur_node = que.popleft() + for next_node, val in graph[cur_node]: + if min_dist[next_node] > temp_dist[cur_node] + val: + min_dist[next_node] = temp_dist[cur_node] + val + if not visited[next_node]: + que.append(next_node) + visited[next_node] = True + k -= 1 + + if min_dist[dst] == inf: + print("unreachable") + else: + print(min_dist[dst]) + + if __name__ == "__main__": main() ``` From 50472c381cd423ac12ff4c6eb8bb6126a4f5a2d1 Mon Sep 17 00:00:00 2001 From: markwang Date: Tue, 12 Nov 2024 14:31:02 +0800 Subject: [PATCH 2928/3019] =?UTF-8?q?143.=E9=87=8D=E6=8E=92=E9=93=BE?= =?UTF-8?q?=E8=A1=A8=E5=A2=9E=E5=8A=A0Go=E6=96=B9=E6=B3=95=E4=B8=80?= =?UTF-8?q?=E5=92=8C=E6=96=B9=E6=B3=95=E4=BA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...15\346\216\222\351\223\276\350\241\250.md" | 83 ++++++++++++++++++- 1 file changed, 80 insertions(+), 3 deletions(-) diff --git "a/problems/0143.\351\207\215\346\216\222\351\223\276\350\241\250.md" "b/problems/0143.\351\207\215\346\216\222\351\223\276\350\241\250.md" index 8707543190..ccddef5bf0 100644 --- "a/problems/0143.\351\207\215\346\216\222\351\223\276\350\241\250.md" +++ "b/problems/0143.\351\207\215\346\216\222\351\223\276\350\241\250.md" @@ -38,7 +38,7 @@ public: cur = head; int i = 1; int j = vec.size() - 1; // i j为之前前后的双指针 - int count = 0; // 计数,偶数去后面,奇数取前面 + int count = 0; // 计数,偶数取后面,奇数取前面 while (i <= j) { if (count % 2 == 0) { cur->next = vec[j]; @@ -73,7 +73,7 @@ public: } cur = head; - int count = 0; // 计数,偶数去后面,奇数取前面 + int count = 0; // 计数,偶数取后面,奇数取前面 ListNode* node; while(que.size()) { if (count % 2 == 0) { @@ -338,8 +338,85 @@ class Solution: return pre ``` ### Go + +```go +// 方法一 数组模拟 +/** + * Definition for singly-linked list. + * type ListNode struct { + * Val int + * Next *ListNode + * } + */ +func reorderList(head *ListNode) { + vec := make([]*ListNode, 0) + cur := head + if cur == nil { + return + } + for cur != nil { + vec = append(vec, cur) + cur = cur.Next + } + cur = head + i := 1 + j := len(vec) - 1 // i j为前后的双指针 + count := 0 // 计数,偶数取后面,奇数取前面 + for i <= j { + if count % 2 == 0 { + cur.Next = vec[j] + j-- + } else { + cur.Next = vec[i] + i++ + } + cur = cur.Next + count++ + } + cur.Next = nil // 注意结尾 +} +``` + +```go +// 方法二 双向队列模拟 +/** + * Definition for singly-linked list. + * type ListNode struct { + * Val int + * Next *ListNode + * } + */ +func reorderList(head *ListNode) { + que := make([]*ListNode, 0) + cur := head + if cur == nil { + return + } + + for cur.Next != nil { + que = append(que, cur.Next) + cur = cur.Next + } + + cur = head + count := 0 // 计数,偶数取后面,奇数取前面 + for len(que) > 0 { + if count % 2 == 0 { + cur.Next = que[len(que)-1] + que = que[:len(que)-1] + } else { + cur.Next = que[0] + que = que[1:] + } + count++ + cur = cur.Next + } + cur.Next = nil // 注意结尾 +} +``` + ```go -# 方法三 分割链表 +// 方法三 分割链表 func reorderList(head *ListNode) { var slow=head var fast=head From 0f152be27b34a82fa3882ffb5c86c55572550de1 Mon Sep 17 00:00:00 2001 From: lm10 Date: Tue, 12 Nov 2024 17:05:27 +0800 Subject: [PATCH 2929/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0:0105.=E6=9C=89?= =?UTF-8?q?=E5=90=91=E5=9B=BE=E7=9A=84=E5=AE=8C=E5=85=A8=E5=8F=AF=E8=BE=BE?= =?UTF-8?q?=E6=80=A7Javascript=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...50\345\217\257\350\276\276\346\200\247.md" | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git "a/problems/kamacoder/0105.\346\234\211\345\220\221\345\233\276\347\232\204\345\256\214\345\205\250\345\217\257\350\276\276\346\200\247.md" "b/problems/kamacoder/0105.\346\234\211\345\220\221\345\233\276\347\232\204\345\256\214\345\205\250\345\217\257\350\276\276\346\200\247.md" index 838b021245..923fb6e4e2 100644 --- "a/problems/kamacoder/0105.\346\234\211\345\220\221\345\233\276\347\232\204\345\256\214\345\205\250\345\217\257\350\276\276\346\200\247.md" +++ "b/problems/kamacoder/0105.\346\234\211\345\220\221\345\233\276\347\232\204\345\256\214\345\205\250\345\217\257\350\276\276\346\200\247.md" @@ -491,6 +491,54 @@ func main() { ### Javascript +```javascript +const rl = require('readline').createInterface({ + input:process.stdin, + output:process.stdout +}) + +let inputLines = [] + +rl.on('line' , (line)=>{ + inputLines.push(line) +}) + +rl.on('close',()=>{ + let [n , edgesCount]= inputLines[0].trim().split(' ').map(Number) + + let graph = Array.from({length:n+1} , ()=>{return[]}) + + for(let i = 1 ; i < inputLines.length ; i++ ){ + let [from , to] = inputLines[i].trim().split(' ').map(Number) + graph[from].push(to) + } + + let visited = new Array(n + 1).fill(false) + + let dfs = (graph , key , visited)=>{ + if(visited[key]){ + return + } + + visited[key] = true + for(let nextKey of graph[key]){ + dfs(graph,nextKey , visited) + } + } + + dfs(graph , 1 , visited) + + for(let i = 1 ; i <= n;i++){ + if(visited[i] === false){ + console.log(-1) + return + } + } + console.log(1) + +}) +``` + ### TypeScript ### PhP From a0690ff730c6569aa0d39cb3b001e4068a6fc89a Mon Sep 17 00:00:00 2001 From: namewyf Date: Tue, 12 Nov 2024 23:03:01 +0800 Subject: [PATCH 2930/3019] =?UTF-8?q?=E5=BC=80=E5=8F=91=E5=95=86=E8=B4=AD?= =?UTF-8?q?=E4=B9=B0=E5=9C=9F=E5=9C=B0=E8=A7=A3=E6=B3=95=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 --- ...55\344\271\260\345\234\237\345\234\260.md" | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git "a/problems/kamacoder/0044.\345\274\200\345\217\221\345\225\206\350\264\255\344\271\260\345\234\237\345\234\260.md" "b/problems/kamacoder/0044.\345\274\200\345\217\221\345\225\206\350\264\255\344\271\260\345\234\237\345\234\260.md" index ea2c696ef6..739e2cadcb 100644 --- "a/problems/kamacoder/0044.\345\274\200\345\217\221\345\225\206\350\264\255\344\271\260\345\234\237\345\234\260.md" +++ "b/problems/kamacoder/0044.\345\274\200\345\217\221\345\225\206\350\264\255\344\271\260\345\234\237\345\234\260.md" @@ -388,6 +388,62 @@ if __name__ == "__main__": main() ``` + +### JavaScript + +前缀和 +```js +function func() { + const readline = require('readline') + const rl = readline.createInterface({ + input: process.stdin, + output: process.stdout + }) + let inputLines = [] + rl.on('line', function (line) { + inputLines.push(line.trim()) + }) + + rl.on('close', function () { + let [n, m] = inputLines[0].split(" ").map(Number) + let c = new Array(n).fill(0) + let r = new Array(m).fill(0) + let arr = new Array(n) + let sum = 0//数组总和 + let min = Infinity//设置最小值的初始值为无限大 + //定义数组 + for (let s = 0; s < n; s++) { + arr[s] = inputLines[s + 1].split(" ").map(Number) + } + //每一行的和 + for (let i = 0; i < n; i++) { + for (let j = 0; j < m; j++) { + c[i] += arr[i][j] + sum += arr[i][j] + } + } + //每一列的和 + for (let i = 0; i < n; i++) { + for (let j = 0; j < m; j++) { + r[j] += arr[i][j] + } + } + let sum1 = 0, sum2 = 0 + //横向切割 + for (let i = 0; i < n; i++) { + sum1 += c[i] + min = min < Math.abs(sum - 2 * sum1) ? min : Math.abs(sum - 2 * sum1) + } + //纵向切割 + for (let j = 0; j < m; j++) { + sum2 += r[j] + min = min < Math.abs(sum - 2 * sum2) ? min : Math.abs(sum - 2 * sum2) + } + console.log(min); + }) +} +``` + ### C 前缀和 From 2d266b576653720ff16b0a3dfa635b72f5ffa57d Mon Sep 17 00:00:00 2001 From: liao junwu Date: Thu, 14 Nov 2024 23:24:17 +0800 Subject: [PATCH 2931/3019] [0739 temperature] add C version add C version for 0739: temperature Signed-off-by: liao junwu --- ...17\346\227\245\346\270\251\345\272\246.md" | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git "a/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" "b/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" index 45af52868f..dd633aed9a 100644 --- "a/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" +++ "b/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" @@ -215,6 +215,38 @@ public: ## 其他语言版本 +### C: + +```C +/** + * Note: The returned array must be malloced, assume caller calls free(). + */ +int* dailyTemperatures(int* temperatures, int temperaturesSize, int* returnSize) { + int len = temperaturesSize; + *returnSize = len; + + int *result = (int *)malloc(sizeof(int) * len); + memset(result, 0x00, sizeof(int) * len); + + int stack[len]; + memset(stack, 0x00, sizeof(stack)); + int top = 0; + + for (int i = 1; i < len; i++) { + if (temperatures[i] <= temperatures[stack[top]]) { /* push */ + stack[++top] = i; + } else { + while (top >= 0 && temperatures[i] > temperatures[stack[top]]) { /* stack not empty */ + result[stack[top]] = i - stack[top]; + top--; /* pop */ + } + stack[++top] = i; /* push */ + } + } + return result; +} +``` + ### Java: ```java From da88f5e4c1407d99b46f087a6d5d10f6e685844e Mon Sep 17 00:00:00 2001 From: liao junwu Date: Sat, 16 Nov 2024 15:42:44 +0800 Subject: [PATCH 2932/3019] [0496 the next bigger element] add C version add C version for 0496: the next bigger element Signed-off-by: liao junwu --- ...4\345\244\247\345\205\203\347\264\240I.md" | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git "a/problems/0496.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240I.md" "b/problems/0496.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240I.md" index 54182d3018..02e73a588d 100644 --- "a/problems/0496.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240I.md" +++ "b/problems/0496.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240I.md" @@ -195,6 +195,62 @@ public: 建议大家把情况一二三想清楚了,先写出版本一的代码,然后在其基础上在做精简! ## 其他语言版本 + +### C + +``` C +/* 先用单调栈的方法计算出结果,再根据nums1中的元素去查找对应的结果 */ +/** + * Note: The returned array must be malloced, assume caller calls free(). + */ +int* nextGreaterElement(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize) { + + /* stcak */ + int top = -1; + int stack_len = nums2Size; + int stack[stack_len]; + //memset(stack, 0x00, sizeof(stack)); + + /* nums2 result */ + int* result_nums2 = (int *)malloc(sizeof(int) * nums2Size); + //memset(result_nums2, 0x00, sizeof(int) * nums2Size); + + /* result */ + int* result = (int *)malloc(sizeof(int) * nums1Size); + //memset(result, 0x00, sizeof(int) * nums1Size); + *returnSize = nums1Size; + + /* init */ + stack[++top] = 0; /* stack loaded with array subscripts */ + + for (int i = 0; i < nums2Size; i++) { + result_nums2[i] = -1; + } + + /* get the result_nums2 */ + for (int i = 1; i < nums2Size; i++) { + if (nums2[i] <= nums2[stack[top]]) { + stack[++top] = i; /* push */ + } else { + while ((top >= 0) && (nums2[i] > nums2[stack[top]])) { + result_nums2[stack[top]] = nums2[i]; + top--; /* pop */ + } + stack[++top] = i; + } + } + + /* get the result */ + for (int i = 0; i < nums1Size; i++) { + for (int j = 0; j < nums2Size; j++) { + if (nums1[i] == nums2[j]) { + result[i] = result_nums2[j]; + } + } + } + return result; +} +``` ### Java ```java From 6901cb345efc05009c029ee121592e3f66ec182a Mon Sep 17 00:00:00 2001 From: lllyt8 Date: Sun, 17 Nov 2024 23:30:11 -0800 Subject: [PATCH 2933/3019] =?UTF-8?q?fix:=20=E4=BF=AE=E6=94=B9=E4=B8=AD?= =?UTF-8?q?=E6=96=87=E5=8D=95=E8=AF=8D=E5=86=97=E4=BD=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" "b/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" index 89e4ad1166..c1f29a2552 100644 --- "a/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" +++ "b/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" @@ -102,7 +102,7 @@ dp[i][j]可以初始化为true么? 当然不行,怎能刚开始就全都匹 4. 确定遍历顺序 -遍历顺序可有有点讲究了。 +遍历顺序可就有点讲究了。 首先从递推公式中可以看出,情况三是根据dp[i + 1][j - 1]是否为true,在对dp[i][j]进行赋值true的。 From 47605060055da15ad606684f92ebde27b5bd213d Mon Sep 17 00:00:00 2001 From: xi-mad <1171866049@qq.com> Date: Mon, 18 Nov 2024 16:50:05 +0800 Subject: [PATCH 2934/3019] =?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 修正错误 --- ...\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" index 2747f179d1..a956013a88 100644 --- "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" +++ "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" @@ -87,7 +87,7 @@ leetcode上没有纯01背包的问题,都是01背包应用方面的题目, i 来表示物品、j表示背包容量。 -(如果想用j 表示物品,j表示背包容量 行不行? 都可以的,个人习惯而已) +(如果想用j 表示物品,i 表示背包容量 行不行? 都可以的,个人习惯而已) 我们来尝试把上面的 二维表格填写一下。 From 5e0ab494756cb48b11450f997f56c2677f51dcc4 Mon Sep 17 00:00:00 2001 From: Lane Zhang Date: Fri, 22 Nov 2024 10:57:51 +0800 Subject: [PATCH 2935/3019] =?UTF-8?q?0123,=200188,=200309=20=E8=82=A1?= =?UTF-8?q?=E7=A5=A8=E7=B1=BB=E9=97=AE=E9=A2=98=EF=BC=8C=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E6=98=93=E7=90=86=E8=A7=A3=E7=9A=84=E4=B8=80=E7=BB=B4=20dp=20P?= =?UTF-8?q?ython=20=E5=92=8C=20Go=20=E7=89=88=E6=9C=AC=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...344\275\263\346\227\266\346\234\272III.md" | 29 +++++++++- ...\344\275\263\346\227\266\346\234\272IV.md" | 56 +++++++++++++++++-- ...53\345\206\267\345\206\273\346\234\237.md" | 35 +++++++++++- 3 files changed, 110 insertions(+), 10 deletions(-) diff --git "a/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" "b/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" index 8e224a898d..1b7c09d214 100644 --- "a/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" +++ "b/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" @@ -316,8 +316,9 @@ class Solution: ### Go: +> 版本一 + ```go -// 版本一 func maxProfit(prices []int) int { dp := make([][]int, len(prices)) for i := 0; i < len(prices); i++ { @@ -345,8 +346,9 @@ func max(a, b int) int { } ``` +> 版本二 + ```go -// 版本二 func maxProfit(prices []int) int { if len(prices) == 0 { return 0 @@ -371,8 +373,9 @@ func max(x, y int) int { } ``` +> 版本三 + ```go -// 版本三 func maxProfit(prices []int) int { if len(prices) == 0 { return 0 @@ -397,6 +400,26 @@ func max(x, y int) int { } ``` +> 版本四:一维 dp 易懂版本 + +```go +func maxProfit(prices []int) int { + dp := make([]int, 4) + dp[0] = -prices[0] + dp[2] = -prices[0] + + for _, price := range prices[1:] { + dc := slices.Clone(dp) // 这句话是关键,把前一天的 dp 状态保存下来,防止被覆盖掉,后面只用它,不用 dp,逻辑简单易懂 + dp[0] = max(dc[0], -price) + dp[1] = max(dc[1], dc[0] + price) + dp[2] = max(dc[2], dc[1] - price) + dp[3] = max(dc[3], dc[2] + price) + } + + return dp[3] +} +``` + ### JavaScript: > 版本一: diff --git "a/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" "b/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" index 0b1622ac5a..cbba12c9d1 100644 --- "a/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" +++ "b/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" @@ -297,8 +297,7 @@ class Solution { ### Python: -版本一 - +> 版本一 ```python class Solution: def maxProfit(self, k: int, prices: List[int]) -> int: @@ -313,7 +312,8 @@ class Solution: dp[i][j+2] = max(dp[i-1][j+2], dp[i-1][j+1] + prices[i]) return dp[-1][2*k] ``` -版本二 + +> 版本二 ```python class Solution: def maxProfit(self, k: int, prices: List[int]) -> int: @@ -329,9 +329,31 @@ class Solution: dp[j] = max(dp[j],dp[j-1]+prices[i]) return dp[2*k] ``` + +> 版本三: 一维 dp 数组(易理解版本) +```python +class Solution: + def maxProfit(self, k: int, prices: List[int]) -> int: + dp = [0] * k * 2 + for i in range(k): + dp[i * 2] = -prices[0] + + for price in prices[1:]: + dc = dp.copy() # 这句话是关键,把前一天的 dp 状态保存下来,防止被覆盖掉,后面只用它,不用 dp,逻辑简单易懂 + + for i in range(2 * k): + if i % 2 == 1: + dp[i] = max(dc[i], dc[i - 1] + price) + else: + pre = 0 if i == 0 else dc[i - 1] + dp[i] = max(dc[i], pre - price) + + return dp[-1] +``` + ### Go: -版本一: +> 版本一: ```go // 买卖股票的最佳时机IV 动态规划 @@ -368,7 +390,7 @@ func max(a, b int) int { } ``` -版本二: 三维 dp数组 +> 版本二: 三维 dp数组 ```go func maxProfit(k int, prices []int) int { length := len(prices) @@ -443,7 +465,31 @@ func max(a, b int) int { } ``` +> 版本四:一维 dp 数组(易理解版本) +```go +func maxProfit(k int, prices []int) int { + dp := make([]int, 2 * k) + for i := range k { + dp[i * 2] = -prices[0] + } + + for j := 1; j < len(prices); j++ { + dc := slices.Clone(dp) // 这句话是关键,把前一天的 dp 状态保存下来,防止被覆盖掉,后面只用它,不用 dp,逻辑简单易懂 + + for i := range k * 2 { + if i % 2 == 1 { + dp[i] = max(dc[i], dc[i - 1] + prices[j]) + } else { + pre := 0; if i >= 1 { pre = dc[i - 1] } + dp[i] = max(dc[i], pre - prices[j]) + } + } + } + + return dp[2 * k - 1] +} +``` ### JavaScript: diff --git "a/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" "b/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" index 4913b8bd57..707b153235 100644 --- "a/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" +++ "b/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" @@ -274,7 +274,7 @@ class Solution { ``` ### Python: -版本一 +> 版本一 ```python from typing import List @@ -294,7 +294,8 @@ class Solution: return max(dp[n-1][3], dp[n-1][1], dp[n-1][2]) # 返回最后一天不持有股票的最大利润 ``` -版本二 + +> 版本二 ```python class Solution: def maxProfit(self, prices: List[int]) -> int: @@ -320,6 +321,36 @@ class Solution: return max(dp[-1][1], dp[-1][2]) ``` + +> 版本三 +```python +class Solution: + def maxProfit(self, prices: List[int]) -> int: + # 0: holding stocks + # (1) keep holding stocks: dp[i][0] = dp[i - 1][0] + # (2) buy stocks: dp[i][0] = dp[i - 1][1] - price, or dp[i - 1][3] - price + # 1: keep no stocks: dp[i][1] = dp[i - 1][1] + # 2: sell stocks: dp[i][2] = dp[i - 1][0] + price + # 3: cooldown day: dp[i][3] = dp[i - 1][2] + dp = [-prices[0], 0, 0, 0] + + for price in prices[1:]: + dc = dp.copy() # 这句话是关键,把前一天的 dp 状态保存下来,防止被覆盖掉,后面只用它,不用 dp,逻辑简单易懂 + dp[0] = max( + dc[0], + dc[1] - price, + dc[3] - price + ) + dp[1] = max( + dc[1], + dc[3] + ) + dp[2] = dc[0] + price + dp[3] = dc[2] + + return max(dp) +``` + ### Go: ```go From e40ddd5cbf46ae62a0b1aee4b683fb899b6fd6c8 Mon Sep 17 00:00:00 2001 From: Lane Zhang Date: Fri, 22 Nov 2024 10:59:16 +0800 Subject: [PATCH 2936/3019] =?UTF-8?q?0337.=E6=89=93=E5=AE=B6=E5=8A=AB?= =?UTF-8?q?=E8=88=8DIII.md=20=E4=BD=BF=E7=94=A8=20`slices.Max`=20=E6=9B=BF?= =?UTF-8?q?=E4=BB=A3=E6=89=8B=E5=B7=A5max=20func=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...211\223\345\256\266\345\212\253\350\210\215III.md" | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git "a/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" "b/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" index 12e31ababd..a3130df7ee 100644 --- "a/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" +++ "b/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" @@ -477,14 +477,7 @@ func max(x, y int) int { ```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 + return slices.Max(res) } func robTree(cur *TreeNode) []int { @@ -498,7 +491,7 @@ func robTree(cur *TreeNode) []int { // 考虑去偷当前的屋子 robCur := cur.Val + left[0] + right[0] // 考虑不去偷当前的屋子 - notRobCur := max(left[0], left[1]) + max(right[0], right[1]) + notRobCur := slices.Max(left) + slices.Max(right) // 注意顺序:0:不偷,1:去偷 return []int{notRobCur, robCur} From 332302b998306ca16e253deeff637075ee49e555 Mon Sep 17 00:00:00 2001 From: Lane Zhang Date: Fri, 22 Nov 2024 10:59:39 +0800 Subject: [PATCH 2937/3019] =?UTF-8?q?=E5=8A=A8=E6=80=81=E8=A7=84=E5=88=92?= =?UTF-8?q?=E7=90=86=E8=AE=BA=E5=9F=BA=E7=A1=80.md=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E4=B8=80=E4=B8=AA=E9=94=99=E5=AD=97=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\210\222\347\220\206\350\256\272\345\237\272\347\241\200.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/\345\212\250\346\200\201\350\247\204\345\210\222\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\345\212\250\346\200\201\350\247\204\345\210\222\347\220\206\350\256\272\345\237\272\347\241\200.md" index c9420d24eb..9ffb453377 100644 --- "a/problems/\345\212\250\346\200\201\350\247\204\345\210\222\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\345\212\250\346\200\201\350\247\204\345\210\222\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -106,7 +106,7 @@ **如果这灵魂三问自己都做到了,基本上这道题目也就解决了**,或者更清晰的知道自己究竟是哪一点不明白,是状态转移不明白,还是实现代码不知道该怎么写,还是不理解遍历dp数组的顺序。 -然后在问问题,目的性就很强了,群里的小伙伴也可以快速知道提问者的疑惑了。 +然后再问问题,目的性就很强了,群里的小伙伴也可以快速知道提问者的疑惑了。 **注意这里不是说不让大家问问题哈, 而是说问问题之前要有自己的思考,问题要问到点子上!** From 7d1cb13e748e6e265438ec7b772835eee412cb42 Mon Sep 17 00:00:00 2001 From: Leehouc <152672308+Leehouc@users.noreply.github.com> Date: Sun, 24 Nov 2024 21:30:18 +0800 Subject: [PATCH 2938/3019] =?UTF-8?q?Update=200108.=E5=86=97=E4=BD=99?= =?UTF-8?q?=E8=BF=9E=E6=8E=A5.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0108.\345\206\227\344\275\231\350\277\236\346\216\245.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/kamacoder/0108.\345\206\227\344\275\231\350\277\236\346\216\245.md" "b/problems/kamacoder/0108.\345\206\227\344\275\231\350\277\236\346\216\245.md" index 18a86ad6d7..6c393b4f1a 100644 --- "a/problems/kamacoder/0108.\345\206\227\344\275\231\350\277\236\346\216\245.md" +++ "b/problems/kamacoder/0108.\345\206\227\344\275\231\350\277\236\346\216\245.md" @@ -44,7 +44,7 @@ ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240527110320.png) -图中的 1 2,2 3,1 3 等三条边在删除后都能使原图变为一棵合法的树。但是 1 3 由于是标准输出里最后出现的那条边,所以输出结果为 1 3 +图中的 1 2,2 3,1 3 等三条边在删除后都能使原图变为一棵合法的树。但是 1 3 由于是标准输入里最后出现的那条边,所以输出结果为 1 3 数据范围: From 72df413ffcf9dbecf7a0101e82360317645a4881 Mon Sep 17 00:00:00 2001 From: ethaiyi9 Date: Tue, 26 Nov 2024 00:20:14 +0800 Subject: [PATCH 2939/3019] =?UTF-8?q?=E4=BF=AE=E6=94=B90111.=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?=20=E9=94=99=E5=AD=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" "b/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" index cd7096ac17..708e0532f8 100644 --- "a/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" +++ "b/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" @@ -40,7 +40,7 @@ 本题依然是前序遍历和后序遍历都可以,前序求的是深度,后序求的是高度。 * 二叉树节点的深度:指从根节点到该节点的最长简单路径边的条数或者节点数(取决于深度从0开始还是从1开始) -* 二叉树节点的高度:指从该节点到叶子节点的最长简单路径边的条数后者节点数(取决于高度从0开始还是从1开始) +* 二叉树节点的高度:指从该节点到叶子节点的最长简单路径边的条数或者节点数(取决于高度从0开始还是从1开始) 那么使用后序遍历,其实求的是根节点到叶子节点的最小距离,就是求高度的过程,不过这个最小距离 也同样是最小深度。 From 455520bde6ba29d01eb9b43d3aba88b8f7d2dead Mon Sep 17 00:00:00 2001 From: Po1vre Date: Thu, 28 Nov 2024 15:54:24 +0800 Subject: [PATCH 2940/3019] =?UTF-8?q?fix:=2070=20=E7=88=AC=E6=A5=BC?= =?UTF-8?q?=E6=A2=AF=E5=88=A0=E5=8E=BB=E5=A4=8D=E6=9D=82=E5=BA=A6=E7=9A=84?= =?UTF-8?q?=E5=86=85=E8=81=94=E5=85=AC=E5=BC=8F=E7=AC=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 仅有单对的‘$’,与其他文档同步,故删去 --- "problems/0070.\347\210\254\346\245\274\346\242\257.md" | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git "a/problems/0070.\347\210\254\346\245\274\346\242\257.md" "b/problems/0070.\347\210\254\346\245\274\346\242\257.md" index a2f664a495..6a13a21cdb 100644 --- "a/problems/0070.\347\210\254\346\245\274\346\242\257.md" +++ "b/problems/0070.\347\210\254\346\245\274\346\242\257.md" @@ -130,8 +130,8 @@ public: }; ``` -* 时间复杂度:$O(n)$ -* 空间复杂度:$O(n)$ +* 时间复杂度:O(n) +* 空间复杂度:O(n) 当然依然也可以,优化一下空间复杂度,代码如下: @@ -154,8 +154,8 @@ public: }; ``` -* 时间复杂度:$O(n)$ -* 空间复杂度:$O(1)$ +* 时间复杂度:O(n) +* 空间复杂度:O(1) 后面将讲解的很多动规的题目其实都是当前状态依赖前两个,或者前三个状态,都可以做空间上的优化,**但我个人认为面试中能写出版本一就够了哈,清晰明了,如果面试官要求进一步优化空间的话,我们再去优化**。 @@ -524,3 +524,4 @@ impl Solution { + From 94bdecfc2eeab67d6657fb6c688478638a5b86fc Mon Sep 17 00:00:00 2001 From: dam <1782067308@qq.com> Date: Fri, 29 Nov 2024 15:56:34 +0800 Subject: [PATCH 2941/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0474.=20=E4=B8=80?= =?UTF-8?q?=E5=92=8C=E9=9B=B6=20java=20=E4=B8=89=E7=BB=B4DP=E6=95=B0?= =?UTF-8?q?=E7=BB=84=E5=AE=9E=E7=8E=B0=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...4.\344\270\200\345\222\214\351\233\266.md" | 65 ++++++++++++++++++- 1 file changed, 64 insertions(+), 1 deletion(-) diff --git "a/problems/0474.\344\270\200\345\222\214\351\233\266.md" "b/problems/0474.\344\270\200\345\222\214\351\233\266.md" index e514e7292b..9d24f01434 100644 --- "a/problems/0474.\344\270\200\345\222\214\351\233\266.md" +++ "b/problems/0474.\344\270\200\345\222\214\351\233\266.md" @@ -261,8 +261,70 @@ public: ## 其他语言版本 - ### Java + +三维DP数组实现 + +```java +class Solution { + public int findMaxForm(String[] strs, int m, int n) { + /// 数组有三个维度 + // 第一个维度:取前面的几个字符串 + // 第二个维度:0的数量限制(背包维度 1 容量) + // 第三个维度:1的数量限制(背包维度 2 容量) + int[][][] dpArr = new int[strs.length][m + 1][n + 1]; + + /// 初始化dpArr数组 + // 计算第一个字符串的零数量和1数量 + int zeroNum = 0; + int oneNum = 0; + for (char c : strs[0].toCharArray()) { + if (c == '0') { + zeroNum++; + } else { + oneNum++; + } + } + // 当0数量、1数量都容得下第一个字符串时,将DP数组的相应位置初始化为1,因为当前的子集数量为1 + for (int j = zeroNum; j <= m; j++) { + for (int k = oneNum; k <= n; k++) { + dpArr[0][j][k] = 1; + } + } + /// 依次填充加入第i个字符串之后的DP数组 + for (int i = 1; i < strs.length; i++) { + zeroNum = 0; + oneNum = 0; + for (char c : strs[i].toCharArray()) { + if (c == '0') { + zeroNum++; + } else { + oneNum++; + } + } + for (int j = 0; j <= m; j++) { + for (int k = 0; k <= n; k++) { + if (j >= zeroNum && k >= oneNum) { + // --if-- 当0数量维度和1数量维度的容量都大于等于当前字符串的0数量和1数量时,才考虑是否将当前字符串放入背包 + // 不放入第i个字符串,子集数量仍为 dpArr[i - 1][j][k] + // 放入第i个字符串,需要在0维度腾出 zeroNum 个容量,1维度腾出 oneNum 个容量,然后放入当前字符串,即 dpArr[i - 1][j - zeroNum][k - oneNum] + 1) + dpArr[i][j][k] = Math.max(dpArr[i - 1][j][k], dpArr[i - 1][j - zeroNum][k - oneNum] + 1); + } else { + // --if-- 无法放入第i个字符串,子集数量仍为 dpArr[i - 1][j][k] + dpArr[i][j][k] = dpArr[i - 1][j][k]; + } + } + } + } + return dpArr[dpArr.length - 1][m][n]; + } +} +``` + + + +二维DP数组实现 + ```Java class Solution { public int findMaxForm(String[] strs, int m, int n) { @@ -682,3 +744,4 @@ public class Solution + From 4d382794537f44bba8028b8e005df25fb29a43b6 Mon Sep 17 00:00:00 2001 From: ASGPIPO Date: Mon, 2 Dec 2024 16:48:06 +0800 Subject: [PATCH 2942/3019] =?UTF-8?q?fix:=20=E6=9B=B4=E6=96=B0README?= =?UTF-8?q?=E4=B8=AD=20=E5=AD=97=E7=AC=A6=E4=B8=B2=E4=B8=8E=E5=8F=8C?= =?UTF-8?q?=E6=8C=87=E9=92=88=E6=9D=BF=E5=9D=97=E9=A2=98=E7=9B=AE=E9=93=BE?= =?UTF-8?q?=E6=8E=A5=E9=94=99=E8=AF=AF=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 3e3b67861e..b326046ede 100644 --- a/README.md +++ b/README.md @@ -141,9 +141,9 @@ 1. [字符串:344.反转字符串](./problems/0344.反转字符串.md) 2. [字符串:541.反转字符串II](./problems/0541.反转字符串II.md) -3. [字符串:替换数字](./problems/kama54.替换数字.md) +3. [字符串:替换数字](./problems/kamacoder/0054.替换数字.md) 4. [字符串:151.翻转字符串里的单词](./problems/0151.翻转字符串里的单词.md) -5. [字符串:右旋字符串](./problems/kama55.右旋字符串.md) +5. [字符串:右旋字符串](./problems/kamacoder/0055.右旋字符串.md) 6. [帮你把KMP算法学个通透](./problems/0028.实现strStr.md) 8. [字符串:459.重复的子字符串](./problems/0459.重复的子字符串.md) 9. [字符串:总结篇!](./problems/字符串总结.md) @@ -154,7 +154,7 @@ 1. [数组:27.移除元素](./problems/0027.移除元素.md) 2. [字符串:344.反转字符串](./problems/0344.反转字符串.md) -3. [字符串:替换数字](./problems/kama54.替换数字.md) +3. [字符串:替换数字](./problems/kamacoder/0054.替换数字.md) 4. [字符串:151.翻转字符串里的单词](./problems/0151.翻转字符串里的单词.md) 5. [链表:206.翻转链表](./problems/0206.翻转链表.md) 6. [链表:19.删除链表的倒数第 N 个结点](./problems/0019.删除链表的倒数第N个节点.md) From 5b94b448646e15507c07aa5c95337b2f1bd0f620 Mon Sep 17 00:00:00 2001 From: Yuan Yuan Date: Wed, 4 Dec 2024 12:29:18 -0600 Subject: [PATCH 2943/3019] =?UTF-8?q?feat:=20Updated=E9=A2=98=E7=9B=AE1365?= =?UTF-8?q?=EF=BC=8C=E6=8F=90=E4=BE=9B=E4=BA=86=E4=BD=BF=E7=94=A8=E6=95=B0?= =?UTF-8?q?=E7=BB=84=E8=BF=9B=E8=A1=8C=E5=93=88=E5=B8=8C=E7=9A=84=E8=A7=A3?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...27\347\232\204\346\225\260\345\255\227.md" | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git "a/problems/1365.\346\234\211\345\244\232\345\260\221\345\260\217\344\272\216\345\275\223\345\211\215\346\225\260\345\255\227\347\232\204\346\225\260\345\255\227.md" "b/problems/1365.\346\234\211\345\244\232\345\260\221\345\260\217\344\272\216\345\275\223\345\211\215\346\225\260\345\255\227\347\232\204\346\225\260\345\255\227.md" index 64f610968b..22dd322632 100644 --- "a/problems/1365.\346\234\211\345\244\232\345\260\221\345\260\217\344\272\216\345\275\223\345\211\215\346\225\260\345\255\227\347\232\204\346\225\260\345\255\227.md" +++ "b/problems/1365.\346\234\211\345\244\232\345\260\221\345\260\217\344\272\216\345\275\223\345\211\215\346\225\260\345\255\227\347\232\204\346\225\260\345\255\227.md" @@ -138,7 +138,9 @@ public int[] smallerNumbersThanCurrent(int[] nums) { ### Python: -```python +> (版本一)使用字典 + +```python3 class Solution: def smallerNumbersThanCurrent(self, nums: List[int]) -> List[int]: res = nums[:] @@ -152,6 +154,23 @@ class Solution: return res ``` +> (版本二)使用数组 + +```python3 +class Solution: + def smallerNumbersThanCurrent(self, nums: List[int]) -> List[int]: + # 同步进行排序和创建新数组的操作,这样可以减少一次冗余的数组复制操作,以减少一次O(n) 的复制时间开销 + sort_nums = sorted(nums) + # 题意中 0 <= nums[i] <= 100,故range的参数设为101 + hash_lst = [0 for _ in range(101)] + # 从后向前遍历,这样hash里存放的就是相同元素最左面的数值和下标了 + for i in range(len(sort_nums)-1,-1,-1): + hash_lst[sort_nums[i]] = i + for i in range(len(nums)): + nums[i] = hash_lst[nums[i]] + return nums +``` + ### Go: ```go From 14223a2fa6c4a93d9e782a6b4e32e73682c5e051 Mon Sep 17 00:00:00 2001 From: Yuan Yuan Date: Wed, 4 Dec 2024 12:33:40 -0600 Subject: [PATCH 2944/3019] =?UTF-8?q?fix:=20Update=201365=EF=BC=8C?= =?UTF-8?q?=E5=BB=BA=E8=AE=AE=E4=B8=8D=E4=BD=BF=E7=94=A8built-in=20func?= =?UTF-8?q?=E4=BD=9C=E4=B8=BAvar=20name?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 题解中使用`hash`作为变量名,而hash本身也是python3的built-in函数,故建议更改变量名 --- ...60\345\255\227\347\232\204\346\225\260\345\255\227.md" | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git "a/problems/1365.\346\234\211\345\244\232\345\260\221\345\260\217\344\272\216\345\275\223\345\211\215\346\225\260\345\255\227\347\232\204\346\225\260\345\255\227.md" "b/problems/1365.\346\234\211\345\244\232\345\260\221\345\260\217\344\272\216\345\275\223\345\211\215\346\225\260\345\255\227\347\232\204\346\225\260\345\255\227.md" index 22dd322632..95a270ffda 100644 --- "a/problems/1365.\346\234\211\345\244\232\345\260\221\345\260\217\344\272\216\345\275\223\345\211\215\346\225\260\345\255\227\347\232\204\346\225\260\345\255\227.md" +++ "b/problems/1365.\346\234\211\345\244\232\345\260\221\345\260\217\344\272\216\345\275\223\345\211\215\346\225\260\345\255\227\347\232\204\346\225\260\345\255\227.md" @@ -144,13 +144,13 @@ public int[] smallerNumbersThanCurrent(int[] nums) { class Solution: def smallerNumbersThanCurrent(self, nums: List[int]) -> List[int]: res = nums[:] - hash = dict() + hash_dict = dict() res.sort() # 从小到大排序之后,元素下标就是小于当前数字的数字 for i, num in enumerate(res): - if num not in hash.keys(): # 遇到了相同的数字,那么不需要更新该 number 的情况 - hash[num] = i + if num not in hash_dict.keys(): # 遇到了相同的数字,那么不需要更新该 number 的情况 + hash_dict[num] = i for i, num in enumerate(nums): - res[i] = hash[num] + res[i] = hash_dict[num] return res ``` From e1034946d5bc1f5a74341fa82c81413117bbbbc8 Mon Sep 17 00:00:00 2001 From: Yuan Yuan Date: Wed, 4 Dec 2024 12:35:06 -0600 Subject: [PATCH 2945/3019] =?UTF-8?q?typo:=20Update=201365=EF=BC=8CRust?= =?UTF-8?q?=E5=BB=BA=E8=AE=AE=E9=A6=96=E5=AD=97=E6=AF=8D=E5=A4=A7=E5=86=99?= =?UTF-8?q?=EF=BC=8C=E4=B8=8E=E5=85=B6=E4=BB=96=E8=AF=AD=E8=A8=80=E7=9B=B8?= =?UTF-8?q?=E5=90=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\225\260\345\255\227\347\232\204\346\225\260\345\255\227.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/1365.\346\234\211\345\244\232\345\260\221\345\260\217\344\272\216\345\275\223\345\211\215\346\225\260\345\255\227\347\232\204\346\225\260\345\255\227.md" "b/problems/1365.\346\234\211\345\244\232\345\260\221\345\260\217\344\272\216\345\275\223\345\211\215\346\225\260\345\255\227\347\232\204\346\225\260\345\255\227.md" index 95a270ffda..d7de450b90 100644 --- "a/problems/1365.\346\234\211\345\244\232\345\260\221\345\260\217\344\272\216\345\275\223\345\211\215\346\225\260\345\255\227\347\232\204\346\225\260\345\255\227.md" +++ "b/problems/1365.\346\234\211\345\244\232\345\260\221\345\260\217\344\272\216\345\275\223\345\211\215\346\225\260\345\255\227\347\232\204\346\225\260\345\255\227.md" @@ -279,7 +279,7 @@ function smallerNumbersThanCurrent(nums: number[]): number[] { }; ``` -### rust +### Rust ```rust use std::collections::HashMap; impl Solution { From 66caa02935bf372ac1df3e812e18aa7059fc1561 Mon Sep 17 00:00:00 2001 From: Yuan Yuan Date: Wed, 4 Dec 2024 12:43:06 -0600 Subject: [PATCH 2946/3019] =?UTF-8?q?feat:=20Update=201365=EF=BC=8C?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0python=E7=9A=84=E6=9A=B4=E5=8A=9B=E6=B3=95?= =?UTF-8?q?=EF=BC=8C=E5=B9=B6=E5=B0=86=E5=93=88=E5=B8=8C=E6=B3=95=E7=9A=84?= =?UTF-8?q?=E4=B8=A4=E7=A7=8D=E6=96=B9=E6=B3=95=E5=90=88=E5=B9=B6=E5=86=99?= =?UTF-8?q?=E5=9C=A8=E4=B8=80=E8=B5=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...27\347\232\204\346\225\260\345\255\227.md" | 26 ++++++++++++++----- 1 file changed, 20 insertions(+), 6 deletions(-) diff --git "a/problems/1365.\346\234\211\345\244\232\345\260\221\345\260\217\344\272\216\345\275\223\345\211\215\346\225\260\345\255\227\347\232\204\346\225\260\345\255\227.md" "b/problems/1365.\346\234\211\345\244\232\345\260\221\345\260\217\344\272\216\345\275\223\345\211\215\346\225\260\345\255\227\347\232\204\346\225\260\345\255\227.md" index d7de450b90..b34ba3da97 100644 --- "a/problems/1365.\346\234\211\345\244\232\345\260\221\345\260\217\344\272\216\345\275\223\345\211\215\346\225\260\345\255\227\347\232\204\346\225\260\345\255\227.md" +++ "b/problems/1365.\346\234\211\345\244\232\345\260\221\345\260\217\344\272\216\345\275\223\345\211\215\346\225\260\345\255\227\347\232\204\346\225\260\345\255\227.md" @@ -138,10 +138,28 @@ public int[] smallerNumbersThanCurrent(int[] nums) { ### Python: -> (版本一)使用字典 +> 暴力法 ```python3 class Solution: + def smallerNumbersThanCurrent(self, nums: List[int]) -> List[int]: + res = [0 for _ in range(len(nums))] + for i in range(len(nums)): + cnt = 0 + for j in range(len(nums)): + if j == i: + continue + if nums[i] > nums[j]: + cnt += 1 + res[i] = cnt + return res +``` + +> 排序+hash + +```python3 +class Solution: + # 方法一:使用字典 def smallerNumbersThanCurrent(self, nums: List[int]) -> List[int]: res = nums[:] hash_dict = dict() @@ -152,12 +170,8 @@ class Solution: for i, num in enumerate(nums): res[i] = hash_dict[num] return res -``` -> (版本二)使用数组 - -```python3 -class Solution: + # 方法二:使用数组 def smallerNumbersThanCurrent(self, nums: List[int]) -> List[int]: # 同步进行排序和创建新数组的操作,这样可以减少一次冗余的数组复制操作,以减少一次O(n) 的复制时间开销 sort_nums = sorted(nums) From 53397d452ecc3d5b4612eb605dc577609edccb7b Mon Sep 17 00:00:00 2001 From: Yuan Yuan Date: Wed, 4 Dec 2024 12:45:00 -0600 Subject: [PATCH 2947/3019] =?UTF-8?q?docs:=20Update=201365=EF=BC=8C?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=86=92=E5=8F=B7=EF=BC=8C=E7=BB=9F=E4=B8=80?= =?UTF-8?q?=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\260\345\255\227\347\232\204\346\225\260\345\255\227.md" | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git "a/problems/1365.\346\234\211\345\244\232\345\260\221\345\260\217\344\272\216\345\275\223\345\211\215\346\225\260\345\255\227\347\232\204\346\225\260\345\255\227.md" "b/problems/1365.\346\234\211\345\244\232\345\260\221\345\260\217\344\272\216\345\275\223\345\211\215\346\225\260\345\255\227\347\232\204\346\225\260\345\255\227.md" index b34ba3da97..722fcb1790 100644 --- "a/problems/1365.\346\234\211\345\244\232\345\260\221\345\260\217\344\272\216\345\275\223\345\211\215\346\225\260\345\255\227\347\232\204\346\225\260\345\255\227.md" +++ "b/problems/1365.\346\234\211\345\244\232\345\260\221\345\260\217\344\272\216\345\275\223\345\211\215\346\225\260\345\255\227\347\232\204\346\225\260\345\255\227.md" @@ -138,7 +138,7 @@ public int[] smallerNumbersThanCurrent(int[] nums) { ### Python: -> 暴力法 +> 暴力法: ```python3 class Solution: @@ -155,7 +155,7 @@ class Solution: return res ``` -> 排序+hash +> 排序+hash: ```python3 class Solution: @@ -274,7 +274,7 @@ function smallerNumbersThanCurrent(nums: number[]): number[] { }; ``` -> 排序+hash +> 排序+hash: ```typescript function smallerNumbersThanCurrent(nums: number[]): number[] { From 7ead61625d0f85890034bb43c0f4a255a8820b19 Mon Sep 17 00:00:00 2001 From: Yuan Yuan Date: Wed, 4 Dec 2024 12:47:57 -0600 Subject: [PATCH 2948/3019] =?UTF-8?q?docs:=20Update=201365=EF=BC=8C?= =?UTF-8?q?=E7=BB=9F=E4=B8=80=E4=B8=BA=E4=B8=AD=E6=96=87=E5=86=92=E5=8F=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\260\345\255\227\347\232\204\346\225\260\345\255\227.md" | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git "a/problems/1365.\346\234\211\345\244\232\345\260\221\345\260\217\344\272\216\345\275\223\345\211\215\346\225\260\345\255\227\347\232\204\346\225\260\345\255\227.md" "b/problems/1365.\346\234\211\345\244\232\345\260\221\345\260\217\344\272\216\345\275\223\345\211\215\346\225\260\345\255\227\347\232\204\346\225\260\345\255\227.md" index 722fcb1790..f0a77f5587 100644 --- "a/problems/1365.\346\234\211\345\244\232\345\260\221\345\260\217\344\272\216\345\275\223\345\211\215\346\225\260\345\255\227\347\232\204\346\225\260\345\255\227.md" +++ "b/problems/1365.\346\234\211\345\244\232\345\260\221\345\260\217\344\272\216\345\275\223\345\211\215\346\225\260\345\255\227\347\232\204\346\225\260\345\255\227.md" @@ -115,7 +115,7 @@ public: ## 其他语言版本 -### Java: +### Java: ```Java public int[] smallerNumbersThanCurrent(int[] nums) { @@ -253,7 +253,7 @@ var smallerNumbersThanCurrent = function(nums) { }; ``` -### TypeScript: +### TypeScript: > 暴力法: @@ -293,7 +293,7 @@ function smallerNumbersThanCurrent(nums: number[]): number[] { }; ``` -### Rust +### Rust: ```rust use std::collections::HashMap; impl Solution { From 6776ecc172511158d6f516721afd8bfb91429014 Mon Sep 17 00:00:00 2001 From: Po1vre Date: Fri, 6 Dec 2024 14:37:45 +0800 Subject: [PATCH 2949/3019] =?UTF-8?q?docs:=200518=E9=9B=B6=E9=92=B1?= =?UTF-8?q?=E5=85=91=E6=8D=A2=E2=85=A1=20=E4=BF=AE=E6=94=B9=E6=A0=87?= =?UTF-8?q?=E7=AD=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git "a/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" "b/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" index 0d35fb7cdf..1921866e5e 100644 --- "a/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" +++ "b/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" @@ -397,7 +397,7 @@ object Solution { } } ``` -## C +### C ```c int change(int amount, int* coins, int coinsSize) { @@ -444,3 +444,4 @@ public class Solution + From 4a9cfb56048e10e688745605289cbe76de84a0bf Mon Sep 17 00:00:00 2001 From: Tony Date: Fri, 6 Dec 2024 17:43:53 +0800 Subject: [PATCH 2950/3019] =?UTF-8?q?=E7=8E=B0=E6=9C=89=E8=A7=A3=E6=B3=95p?= =?UTF-8?q?ython=E8=B6=85=E6=97=B6=EF=BC=8C=E9=80=9A=E8=BF=87=E5=87=8F?= =?UTF-8?q?=E5=B0=91=E9=80=92=E5=BD=92=E6=AC=A1=E6=95=B0=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...7.\350\247\243\346\225\260\347\213\254.md" | 84 +++++++++++-------- 1 file changed, 50 insertions(+), 34 deletions(-) diff --git "a/problems/0037.\350\247\243\346\225\260\347\213\254.md" "b/problems/0037.\350\247\243\346\225\260\347\213\254.md" index 6a9f69bd07..5f3f881cf1 100644 --- "a/problems/0037.\350\247\243\346\225\260\347\213\254.md" +++ "b/problems/0037.\350\247\243\346\225\260\347\213\254.md" @@ -366,40 +366,56 @@ class Solution: """ Do not return anything, modify board in-place instead. """ - 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 - return True + row_used = [set() for _ in range(9)] + col_used = [set() for _ in range(9)] + box_used = [set() for _ in range(9)] + for row in range(9): + for col in range(9): + num = board[row][col] + if num == ".": + continue + row_used[row].add(num) + col_used[col].add(num) + box_used[(row // 3) * 3 + col // 3].add(num) + self.backtracking(0, 0, board, row_used, col_used, box_used) + + def backtracking( + self, + row: int, + col: int, + board: List[List[str]], + row_used: List[List[int]], + col_used: List[List[int]], + box_used: List[List[int]], + ) -> bool: + if row == 9: + return True + + next_row, next_col = (row, col + 1) if col < 8 else (row + 1, 0) + if board[row][col] != ".": + return self.backtracking( + next_row, next_col, board, row_used, col_used, box_used + ) + + for num in map(str, range(1, 10)): + if ( + num not in row_used[row] + and num not in col_used[col] + and num not in box_used[(row // 3) * 3 + col // 3] + ): + board[row][col] = num + row_used[row].add(num) + col_used[col].add(num) + box_used[(row // 3) * 3 + col // 3].add(num) + if self.backtracking( + next_row, next_col, board, row_used, col_used, box_used + ): + return True + board[row][col] = "." + row_used[row].remove(num) + col_used[col].remove(num) + box_used[(row // 3) * 3 + col // 3].remove(num) + return False ``` ### Go From 34d28a94245baaa9744d2a06d84c050f643aeb24 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E5=91=98Carl?= Date: Sun, 8 Dec 2024 16:17:59 +0800 Subject: [PATCH 2951/3019] =?UTF-8?q?Update=200015.=E4=B8=89=E6=95=B0?= =?UTF-8?q?=E4=B9=8B=E5=92=8C.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\270\211\346\225\260\344\271\213\345\222\214.md" | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git "a/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" "b/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" index 0d47bf4815..349335d0a6 100644 --- "a/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" @@ -36,7 +36,7 @@ ### 哈希解法 -两层for循环就可以确定 a 和b 的数值了,可以使用哈希法来确定 0-(a+b) 是否在 数组里出现过,其实这个思路是正确的,但是我们有一个非常棘手的问题,就是题目中说的不可以包含重复的三元组。 +两层for循环就可以确定 两个数值,可以使用哈希法来确定 第三个数 0-(a+b) 或者 0 - (a + c) 是否在 数组里出现过,其实这个思路是正确的,但是我们有一个非常棘手的问题,就是题目中说的不可以包含重复的三元组。 把符合条件的三元组放进vector中,然后再去重,这样是非常费时的,很容易超时,也是这道题目通过率如此之低的根源所在。 @@ -51,10 +51,8 @@ class Solution { public: // 在一个数组中找到3个数形成的三元组,它们的和为0,不能重复使用(三数下标互不相同),且三元组不能重复。 - // 理论解法:a+b+c(存储)==0(检索) <=> c(存储)==0-(a+b)(检索) - // 实际解法:a+b+c(存储)==0(检索) <=> b(存储)==0-(a+c)(检索) + // b(存储)== 0-(a+c)(检索) vector> threeSum(vector& nums) { - // 本解法的内层循环一边存储一边检索,所以被存储的应该是b,而不是c vector> result; sort(nums.begin(), nums.end()); @@ -71,11 +69,7 @@ public: unordered_set set; for (int k = i + 1; k < nums.size(); k++) { - // [(-2x), ..., (x), (x), x, x, x, ...] - // eg. [0, 0, 0] - // eg. [-4, 2, 2] - // eg. [(-4), -1, 0, 0, 1, (2), (2), {2}, {2}, 3, 3] - // 去重b=c时的b和c,即第三个x到最后一个x需要被跳过 + // 去重b=c时的b和c if (k > i + 2 && nums[k] == nums[k - 1] && nums[k - 1] == nums[k - 2]) continue; @@ -83,7 +77,6 @@ public: int target = 0 - (nums[i] + nums[k]); if (set.find(target) != set.end()) { result.push_back({nums[i], target, nums[k]}); // nums[k]成为c - // 内层循环中,a固定,如果find到了和上轮一样的b,那么c也就和上轮一样,所以去重b set.erase(target); } else { From 451b02dd5d6986df59483ee9f2444acab5d6abe2 Mon Sep 17 00:00:00 2001 From: Alvinn <138186772+fubugun@users.noreply.github.com> Date: Mon, 9 Dec 2024 16:56:47 +0800 Subject: [PATCH 2952/3019] =?UTF-8?q?Update=200236.=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=A0=91=E7=9A=84=E6=9C=80=E8=BF=91=E5=85=AC=E5=85=B1=E7=A5=96?= =?UTF-8?q?=E5=85=88.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" "b/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" index 8572ec2d5f..8cd505a829 100644 --- "a/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" +++ "b/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" @@ -45,7 +45,7 @@ 那么二叉树如何可以自底向上查找呢? -回溯啊,二叉树回溯的过程就是从低到上。 +回溯啊,二叉树回溯的过程就是从底到上。 后序遍历(左右中)就是天然的回溯过程,可以根据左右子树的返回值,来处理中节点的逻辑。 From 0763f4b2fe5be95c9105c844e818759d44bfc745 Mon Sep 17 00:00:00 2001 From: Alvinn <138186772+fubugun@users.noreply.github.com> Date: Mon, 9 Dec 2024 16:58:02 +0800 Subject: [PATCH 2953/3019] =?UTF-8?q?Update=200019.=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E9=93=BE=E8=A1=A8=E7=9A=84=E5=80=92=E6=95=B0=E7=AC=ACN?= =?UTF-8?q?=E4=B8=AA=E8=8A=82=E7=82=B9.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" "b/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" index f0ef2366ad..fafef1f2d5 100644 --- "a/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" +++ "b/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" @@ -58,7 +58,7 @@ * fast和slow同时移动,直到fast指向末尾,如题: - +//图片中有错别词:应该将“只到”改为“直到” * 删除slow指向的下一个节点,如图: From d3dc9f51b7569329d2688eec3d0c23f457c18e02 Mon Sep 17 00:00:00 2001 From: Alvinn <138186772+fubugun@users.noreply.github.com> Date: Mon, 9 Dec 2024 17:01:20 +0800 Subject: [PATCH 2954/3019] =?UTF-8?q?Update=20=E8=B4=AA=E5=BF=83=E7=AE=97?= =?UTF-8?q?=E6=B3=95=E7=90=86=E8=AE=BA=E5=9F=BA=E7=A1=80.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/\350\264\252\345\277\203\347\256\227\346\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\350\264\252\345\277\203\347\256\227\346\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md" index f042c0acf3..6fde2dbbe6 100644 --- "a/problems/\350\264\252\345\277\203\347\256\227\346\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\350\264\252\345\277\203\347\256\227\346\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -78,7 +78,7 @@ * 求解每一个子问题的最优解 * 将局部最优解堆叠成全局最优解 -这个四步其实过于理论化了,我们平时在做贪心类的题目 很难去按照这四步去思考,真是有点“鸡肋”。 +这个四步其实过于理论化了,我们平时在做贪心类的题目时,如果按照这四步去思考,真是有点“鸡肋”。 做题的时候,只要想清楚 局部最优 是什么,如果推导出全局最优,其实就够了。 From a28c40a8bcbb068c9d2f9f4b902322ce04e888ef Mon Sep 17 00:00:00 2001 From: Alvinn <138186772+fubugun@users.noreply.github.com> Date: Mon, 9 Dec 2024 17:06:28 +0800 Subject: [PATCH 2955/3019] =?UTF-8?q?Update=2020201107=E5=9B=9E=E6=BA=AF?= =?UTF-8?q?=E5=91=A8=E6=9C=AB=E6=80=BB=E7=BB=93.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\272\257\345\221\250\346\234\253\346\200\273\347\273\223.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20201107\345\233\236\346\272\257\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20201107\345\233\236\346\272\257\345\221\250\346\234\253\346\200\273\347\273\223.md" index 2d20a19702..7e333c7672 100644 --- "a/problems/\345\221\250\346\200\273\347\273\223/20201107\345\233\236\346\272\257\345\221\250\346\234\253\346\200\273\347\273\223.md" +++ "b/problems/\345\221\250\346\200\273\347\273\223/20201107\345\233\236\346\272\257\345\221\250\346\234\253\346\200\273\347\273\223.md" @@ -75,7 +75,7 @@ for (int i = startIndex; i < candidates.size() && sum + candidates[i] <= target; 除了这些难点,**本题还有细节,例如:切割过的地方不能重复切割所以递归函数需要传入i + 1**。 -所以本题应该是一个道hard题目了。 +所以本题应该是一道hard题目了。 **本题的树形结构中,和代码的逻辑有一个小出入,已经判断不是回文的子串就不会进入递归了,纠正如下:** From c6f44808a37f88bdb5164170042505ceb1d228a0 Mon Sep 17 00:00:00 2001 From: Alvinn <138186772+fubugun@users.noreply.github.com> Date: Mon, 9 Dec 2024 17:15:25 +0800 Subject: [PATCH 2956/3019] =?UTF-8?q?Update=200332.=E9=87=8D=E6=96=B0?= =?UTF-8?q?=E5=AE=89=E6=8E=92=E8=A1=8C=E7=A8=8B.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" "b/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" index ed8149d08e..78e1407419 100644 --- "a/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" +++ "b/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" @@ -172,7 +172,7 @@ if (result.size() == ticketNum + 1) { 回溯的过程中,如何遍历一个机场所对应的所有机场呢? -这里刚刚说过,在选择映射函数的时候,不能选择`unordered_map> targets`, 因为一旦有元素增删multiset的迭代器就会失效,当然可能有牛逼的容器删除元素迭代器不会失效,这里就不在讨论了。 +这里刚刚说过,在选择映射函数的时候,不能选择`unordered_map> targets`, 因为一旦有元素增删multiset的迭代器就会失效,当然可能有牛逼的容器删除元素迭代器不会失效,这里就不再讨论了。 **可以说本题既要找到一个对数据进行排序的容器,而且还要容易增删元素,迭代器还不能失效**。 From b4ebda4fc94e4505ff268ec0e08bd951911e26c5 Mon Sep 17 00:00:00 2001 From: C_W Date: Tue, 10 Dec 2024 16:52:12 +1100 Subject: [PATCH 2957/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A00028=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0strStr=20C=20=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0028.\345\256\236\347\216\260strStr.md" | 64 +++++++++++++++++++ 1 file changed, 64 insertions(+) diff --git "a/problems/0028.\345\256\236\347\216\260strStr.md" "b/problems/0028.\345\256\236\347\216\260strStr.md" index e0cb123ef1..63a08d960d 100644 --- "a/problems/0028.\345\256\236\347\216\260strStr.md" +++ "b/problems/0028.\345\256\236\347\216\260strStr.md" @@ -1456,6 +1456,70 @@ public int[] GetNext(string needle) } ``` +### C: + +> 前缀表统一右移和减一 + +```c + +int *build_next(char* needle, int len) { + + int *next = (int *)malloc(len * sizeof(int)); + assert(next); // 确保分配成功 + + // 初始化next数组 + next[0] = -1; // next[0] 设置为 -1,表示没有有效前缀匹配 + if (len <= 1) { // 如果模式串长度小于等于 1,直接返回 + return next; + } + next[1] = 0; // next[1] 设置为 0,表示第一个字符没有公共前后缀 + + // 构建next数组, i 从模式串的第三个字符开始, j 指向当前匹配的最长前缀长度 + int i = 2, j = 0; + while (i < len) { + if (needle[i - 1] == needle[j]) { + j++; + next[i] = j; + i++; + } else if (j > 0) { + // 如果不匹配且 j > 0, 回退到次长匹配前缀的长度 + j = next[j]; + } else { + next[i] = 0; + i++; + } + } + return next; +} + +int strStr(char* haystack, char* needle) { + + int needle_len = strlen(needle); + int haystack_len = strlen(haystack); + + int *next = build_next(needle, needle_len); + + int i = 0, j = 0; // i 指向主串的当前起始位置, j 指向模式串的当前匹配位置 + while (i <= haystack_len - needle_len) { + if (haystack[i + j] == needle[j]) { + j++; + if (j == needle_len) { + free(next); + next = NULL + return i; + } + } else { + i += j - next[j]; // 调整主串的起始位置 + j = j > 0 ? next[j] : 0; + } + } + + free(next); + next = NULL; + return -1; +} +``` +

From 9768c91ee2d09ffa8aa594fc4160d3bfdf4034dd Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Wed, 11 Dec 2024 11:38:38 +0800 Subject: [PATCH 2958/3019] =?UTF-8?q?=E6=9B=B4=E6=94=B9=E6=8E=92=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...4.\347\233\256\346\240\207\345\222\214.md" | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git "a/problems/0494.\347\233\256\346\240\207\345\222\214.md" "b/problems/0494.\347\233\256\346\240\207\345\222\214.md" index 0872460907..75e095384b 100644 --- "a/problems/0494.\347\233\256\346\240\207\345\222\214.md" +++ "b/problems/0494.\347\233\256\346\240\207\345\222\214.md" @@ -151,13 +151,13 @@ if (abs(target) > sum) return 0; // 此时没有方案 本题则是装满有几种方法。其实这就是一个组合问题了。 -1. 确定dp数组以及下标的含义 +#### 1. 确定dp数组以及下标的含义 先用 二维 dp数组求解本题,dp[i][j]:使用 下标为[0, i]的nums[i]能够凑满j(包括j)这么大容量的包,有dp[i][j]种方法。 01背包为什么这么定义dp数组,我在[0-1背包理论基础](https://www.programmercarl.com/%E8%83%8C%E5%8C%85%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%8001%E8%83%8C%E5%8C%85-1.html)中 确定dp数组的含义里讲解过。 -2. 确定递推公式 +#### 2. 确定递推公式 我们先手动推导一下,这个二维数组里面的数值。 @@ -264,7 +264,7 @@ if (nums[i] > j) dp[i][j] = dp[i - 1][j]; else dp[i][j] = dp[i - 1][j] + dp[i - 1][j - nums[i]]; ``` -3. dp数组如何初始化 +#### 3. dp数组如何初始化 先明确递推的方向,如图,求解 dp[2][2] 是由 上方和左上方推出。 @@ -315,7 +315,7 @@ for (int i = 0; i < nums.size(); i++) { } ``` -4. 确定遍历顺序 +#### 4. 确定遍历顺序 在明确递推方向时,我们知道 当前值 是由上方和左上方推出。 @@ -360,7 +360,7 @@ for (int j = 0; j <= bagSize; j++) { // 列,遍历背包 这里大家可以看出,无论是以上哪种遍历,都不影响 dp[2][2]的求值,用来 推导 dp[2][2] 的数值都在。 -5. 举例推导dp数组 +#### 5. 举例推导dp数组 输入:nums: [1, 1, 1, 1, 1], target: 3 @@ -421,7 +421,7 @@ public: dp[i][j] 去掉 行的维度,即 dp[j],表示:填满j(包括j)这么大容积的包,有dp[j]种方法。 -2. 确定递推公式 +#### 2. 确定递推公式 二维DP数组递推公式: `dp[i][j] = dp[i - 1][j] + dp[i - 1][j - nums[i]];` @@ -429,17 +429,17 @@ dp[i][j] 去掉 行的维度,即 dp[j],表示:填满j(包括j)这么 **这个公式在后面在讲解背包解决排列组合问题的时候还会用到!** -3. dp数组如何初始化 +#### 3. dp数组如何初始化 在上面 二维dp数组中,我们讲解过 dp[0][0] 初始为1,这里dp[0] 同样初始为1 ,即装满背包为0的方法有一种,放0件物品。 -4. 确定遍历顺序 +#### 4. 确定遍历顺序 在[动态规划:关于01背包问题,你该了解这些!(滚动数组)](https://programmercarl.com/背包理论基础01背包-2.html)中,我们系统讲过对于01背包问题一维dp的遍历。 遍历物品放在外循环,遍历背包在内循环,且内循环倒序(为了保证物品只使用一次)。 -5. 举例推导dp数组 +#### 5. 举例推导dp数组 输入:nums: [1, 1, 1, 1, 1], target: 3 @@ -526,7 +526,6 @@ dp[j] += dp[j - nums[i]]; ## 其他语言版本 - ### Java ```java class Solution { From 1a47aea273788b30ab56efc5b58e3404c826cd71 Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Wed, 11 Dec 2024 11:46:56 +0800 Subject: [PATCH 2959/3019] =?UTF-8?q?=E8=AE=B2=E6=B8=85=E6=A5=9A=E5=A6=82?= =?UTF-8?q?=E4=BD=95=E8=BD=AC=E5=8C=9601=E8=83=8C=E5=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\347\232\204\351\207\215\351\207\217II.md" | 42 +++++++++---------- 1 file changed, 20 insertions(+), 22 deletions(-) diff --git "a/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" "b/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" index b40ed114eb..0d445a71f0 100644 --- "a/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" +++ "b/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" @@ -42,40 +42,41 @@ ## 思路 -如果对背包问题不都熟悉先看这两篇: +如果对背包问题不熟悉的话先看这两篇: -* [动态规划:关于01背包问题,你该了解这些!](https://programmercarl.com/背包理论基础01背包-1.html) -* [动态规划:关于01背包问题,你该了解这些!(滚动数组)](https://programmercarl.com/背包理论基础01背包-2.html) +* [01背包理论基础(二维数组)](https://programmercarl.com/背包理论基础01背包-1.html) +* [01背包理论基础(一维数组)](https://programmercarl.com/背包理论基础01背包-2.html) -本题其实就是尽量让石头分成重量相同的两堆,相撞之后剩下的石头最小,**这样就化解成01背包问题了**。 +本题其实是尽量让石头分成重量相同的两堆(尽可能相同),相撞之后剩下的石头就是最小的。 -是不是感觉和昨天讲解的[416. 分割等和子集](https://programmercarl.com/0416.分割等和子集.html)非常像了。 +一堆的石头重量是sum,那么我们就尽可能拼成 重量为 sum / 2 的石头堆。 这样剩下的石头堆也是 尽可能接近 sum/2 的重量。 +那么此时问题就是有一堆石头,每个石头都有自己的重量,是否可以 装满 最大重量为 sum / 2的背包。 -本题物品的重量为stones[i],物品的价值也为stones[i]。 +看到这里,大家是否感觉和昨天讲解的 [416. 分割等和子集](https://programmercarl.com/0416.分割等和子集.html)非常像了,简直就是同一道题。 -对应着01背包里的物品重量weight[i]和 物品价值value[i]。 +本题**这样就化解成01背包问题了**。 + +**[416. 分割等和子集](https://programmercarl.com/0416.分割等和子集.html) 是求背包是否正好装满,而本题是求背包最多能装多少**。 + +物品就是石头,物品的重量为stones[i],物品的价值也为stones[i]。 接下来进行动规五步曲: -1. 确定dp数组以及下标的含义 +### 1. 确定dp数组以及下标的含义 **dp[j]表示容量(这里说容量更形象,其实就是重量)为j的背包,最多可以背最大重量为dp[j]**。 -可以回忆一下01背包中,dp[j]的含义,容量为j的背包,最多可以装的价值为 dp[j]。 +相对于 01背包,本题中,石头的重量是 stones[i],石头的价值也是 stones[i] 。 -相对于 01背包,本题中,石头的重量是 stones[i],石头的价值也是 stones[i] ,可以 “最多可以装的价值为 dp[j]” == “最多可以背的重量为dp[j]” +“最多可以装的价值为 dp[j]” 等同于 “最多可以背的重量为dp[j]” -2. 确定递推公式 +### 2. 确定递推公式 01背包的递推公式为:dp[j] = max(dp[j], dp[j - weight[i]] + value[i]); 本题则是:**dp[j] = max(dp[j], dp[j - stones[i]] + stones[i]);** -一些同学可能看到这dp[j - stones[i]] + stones[i]中 又有- stones[i] 又有+stones[i],看着有点晕乎。 - -大家可以再去看 dp[j]的含义。 - -3. dp数组如何初始化 +### 3. dp数组如何初始化 既然 dp[j]中的j表示容量,那么最大容量(重量)是多少呢,就是所有石头的重量和。 @@ -95,7 +96,7 @@ vector dp(15001, 0); ``` -4. 确定遍历顺序 +### 4. 确定遍历顺序 在[动态规划:关于01背包问题,你该了解这些!(滚动数组)](https://programmercarl.com/背包理论基础01背包-2.html)中就已经说明:如果使用一维dp数组,物品遍历的for循环放在外层,遍历背包的for循环放在内层,且内层for循环倒序遍历! @@ -111,7 +112,7 @@ for (int i = 0; i < stones.size(); i++) { // 遍历物品 ``` -5. 举例推导dp数组 +### 5. 举例推导dp数组 举例,输入:[2,4,1,1],此时target = (2 + 4 + 1 + 1)/2 = 4 ,dp数组状态图如下: @@ -154,10 +155,7 @@ public: 本题其实和[416. 分割等和子集](https://programmercarl.com/0416.分割等和子集.html)几乎是一样的,只是最后对dp[target]的处理方式不同。 -[416. 分割等和子集](https://programmercarl.com/0416.分割等和子集.html)相当于是求背包是否正好装满,而本题是求背包最多能装多少。 - - - +**[416. 分割等和子集](https://programmercarl.com/0416.分割等和子集.html)相当于是求背包是否正好装满,而本题是求背包最多能装多少**。 ## 其他语言版本 From ac6dfbcd204d0b92a6ef394d69743bef4ca4b74a Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Wed, 11 Dec 2024 11:53:03 +0800 Subject: [PATCH 2960/3019] =?UTF-8?q?python=E4=BB=A3=E7=A0=81=E4=B8=8D?= =?UTF-8?q?=E5=90=88=E9=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...346\233\277\346\215\242\346\225\260\345\255\227.md" | 10 ---------- 1 file changed, 10 deletions(-) diff --git "a/problems/kamacoder/0054.\346\233\277\346\215\242\346\225\260\345\255\227.md" "b/problems/kamacoder/0054.\346\233\277\346\215\242\346\225\260\345\255\227.md" index 443b8bfbda..de0ab1a37a 100644 --- "a/problems/kamacoder/0054.\346\233\277\346\215\242\346\225\260\345\255\227.md" +++ "b/problems/kamacoder/0054.\346\233\277\346\215\242\346\225\260\345\255\227.md" @@ -288,16 +288,6 @@ func main(){ -### python: -```Python -class Solution: - def change(self, s): - lst = list(s) # Python里面的string也是不可改的,所以也是需要额外空间的。空间复杂度:O(n)。 - for i in range(len(lst)): - if lst[i].isdigit(): - lst[i] = "number" - return ''.join(lst) -``` ### JavaScript: ```js const readline = require("readline"); From e7f96785d45c8858e68df5cae3851a7738a25635 Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Wed, 11 Dec 2024 11:53:47 +0800 Subject: [PATCH 2961/3019] =?UTF-8?q?=E4=BC=98=E5=8C=96=E8=A1=A8=E8=BE=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...260\217\346\230\216\351\200\233\345\205\254\345\233\255.md" | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git "a/problems/kamacoder/0097.\345\260\217\346\230\216\351\200\233\345\205\254\345\233\255.md" "b/problems/kamacoder/0097.\345\260\217\346\230\216\351\200\233\345\205\254\345\233\255.md" index e8d92cc29f..9c813b3ae9 100644 --- "a/problems/kamacoder/0097.\345\260\217\346\230\216\351\200\233\345\205\254\345\233\255.md" +++ "b/problems/kamacoder/0097.\345\260\217\346\230\216\351\200\233\345\205\254\345\233\255.md" @@ -100,7 +100,8 @@ Floyd算法核心思想是动态规划。 这里我们用 grid数组来存图,那就把dp数组命名为 grid。 -grid[i][j][k] = m,表示 节点i 到 节点j 以[1...k] 集合为中间节点的最短距离为m。 +grid[i][j][k] = m,表示 **节点i 到 节点j 以[1...k] 集合中的一个节点为中间节点的最短距离为m**。 + 可能有录友会想,凭什么就这么定义呢? From f3ddf8fc16a5703097d6786ad9274a08ce320ddc Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Wed, 11 Dec 2024 11:54:47 +0800 Subject: [PATCH 2962/3019] =?UTF-8?q?=E4=BC=98=E5=8C=96=E8=A1=A8=E8=BE=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...347\241\20001\350\203\214\345\214\205-1.md" | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" index 2747f179d1..c164461637 100644 --- "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" +++ "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" @@ -41,8 +41,6 @@ leetcode上没有纯01背包的问题,都是01背包应用方面的题目, 有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。**每件物品只能用一次**,求解将哪些物品装入背包里物品价值总和最大。 -![动态规划-背包问题](https://code-thinking-1253855093.file.myqcloud.com/pics/20210117175428387.jpg) - 这是标准的背包问题,以至于很多同学看了这个自然就会想到背包,甚至都不知道暴力的解法应该怎么解了。 这样其实是没有从底向上去思考,而是习惯性想到了背包,那么暴力的解法应该是怎么样的呢? @@ -73,7 +71,7 @@ leetcode上没有纯01背包的问题,都是01背包应用方面的题目, 依然动规五部曲分析一波。 -1. 确定dp数组以及下标的含义 +#### 1. 确定dp数组以及下标的含义 我们需要使用二维数组,为什么呢? @@ -87,7 +85,7 @@ leetcode上没有纯01背包的问题,都是01背包应用方面的题目, i 来表示物品、j表示背包容量。 -(如果想用j 表示物品,j表示背包容量 行不行? 都可以的,个人习惯而已) +(如果想用j 表示物品,i表示背包容量 行不行? 都可以的,个人习惯而已) 我们来尝试把上面的 二维表格填写一下。 @@ -131,7 +129,7 @@ i 来表示物品、j表示背包容量。 **要时刻记着这个dp数组的含义,下面的一些步骤都围绕这dp数组的含义进行的**,如果哪里看懵了,就来回顾一下i代表什么,j又代表什么。 -2. 确定递推公式 +#### 2. 确定递推公式 这里在把基本信息给出来: @@ -176,7 +174,7 @@ i 来表示物品、j表示背包容量。 递归公式: `dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);` -3. dp数组如何初始化 +#### 3. dp数组如何初始化 **关于初始化,一定要和dp数组的定义吻合,否则到递推公式的时候就会越来越乱**。 @@ -197,8 +195,8 @@ dp[0][j],即:i为0,存放编号0的物品的时候,各个容量的背包 代码初始化如下: ```CPP -for (int j = 0 ; j < weight[0]; j++) { // 当然这一步,如果把dp数组预先初始化为0了,这一步就可以省略,但很多同学应该没有想清楚这一点。 - dp[0][j] = 0; +for (int i = 1; i < weight.size(); i++) { // 当然这一步,如果把dp数组预先初始化为0了,这一步就可以省略,但很多同学应该没有想清楚这一点。 + dp[i][0] = 0; } // 正序遍历 for (int j = weight[0]; j <= bagweight; j++) { @@ -236,7 +234,7 @@ for (int j = weight[0]; j <= bagweight; j++) { **费了这么大的功夫,才把如何初始化讲清楚,相信不少同学平时初始化dp数组是凭感觉来的,但有时候感觉是不靠谱的**。 -4. 确定遍历顺序 +#### 4. 确定遍历顺序 在如下图中,可以看出,有两个遍历的维度:物品与背包重量 @@ -293,7 +291,7 @@ dp[i-1][j]和dp[i - 1][j - weight[i]] 都在dp[i][j]的左上角方向(包括 **其实背包问题里,两个for循环的先后循序是非常有讲究的,理解遍历顺序其实比理解推导公式难多了**。 -5. 举例推导dp数组 +#### 5. 举例推导dp数组 来看一下对应的dp数组的数值,如图: From c11b546119f8679f7bafd9d8865929bc06272f1c Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Wed, 11 Dec 2024 11:55:32 +0800 Subject: [PATCH 2963/3019] =?UTF-8?q?=E4=BB=8E=E4=BA=8C=E7=BB=B4=E5=88=B0?= =?UTF-8?q?=E4=B8=80=E7=BB=B4=20=E9=87=8D=E8=AE=B2=E5=AE=8C=E5=85=A8?= =?UTF-8?q?=E8=83=8C=E5=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...14\345\214\205\344\270\200\347\273\264.md" | 211 +++++++ ...14\345\205\250\350\203\214\345\214\205.md" | 564 ++++++------------ 2 files changed, 399 insertions(+), 376 deletions(-) create mode 100644 "problems/\350\203\214\345\214\205\351\227\256\351\242\230\345\256\214\345\205\250\350\203\214\345\214\205\344\270\200\347\273\264.md" diff --git "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\345\256\214\345\205\250\350\203\214\345\214\205\344\270\200\347\273\264.md" "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\345\256\214\345\205\250\350\203\214\345\214\205\344\270\200\347\273\264.md" new file mode 100644 index 0000000000..a8e241c3ba --- /dev/null +++ "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\345\256\214\345\205\250\350\203\214\345\214\205\344\270\200\347\273\264.md" @@ -0,0 +1,211 @@ + +# 完全背包-一维数组 + +本题力扣上没有原题,大家可以去[卡码网第52题](https://kamacoder.com/problempage.php?pid=1052)去练习。 + +## 算法公开课 + +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[带你学透完全背包问题! ](https://www.bilibili.com/video/BV1uK411o7c9/),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 + + +## 思路 + +本篇我们不再做五部曲分析,核心内容 在 01背包二维 、01背包一维 和 完全背包二维 的讲解中都讲过了。 + +上一篇我们刚刚讲了完全背包二维DP数组的写法: + +```CPP +for (int i = 1; i < n; i++) { // 遍历物品 + for(int j = 0; j <= bagWeight; j++) { // 遍历背包容量 + if (j < weight[i]) dp[i][j] = dp[i - 1][j]; + else dp[i][j] = max(dp[i - 1][j], dp[i][j - weight[i]] + value[i]); + } +} +``` + +压缩成一维DP数组,也就是将上一层拷贝到当前层。 + +将上一层dp[i-1] 的那一层拷贝到 当前层 dp[i] ,那么 递推公式由:`dp[i][j] = max(dp[i - 1][j], dp[i][j - weight[i]] + value[i])` 变成: `dp[i][j] = max(dp[i][j], dp[i][j - weight[i]] + value[i])` + +这里有录友想,这样拷贝的话, dp[i - 1][j] 的数值会不会 覆盖了 dp[i][j] 的数值呢? + +并不会,因为 当前层 dp[i][j] 是空的,是没有计算过的。 + +变成 `dp[i][j] = max(dp[i][j], dp[i][j - weight[i]] + value[i])` 我们压缩成一维dp数组,去掉 i 层数维度。 + +即:`dp[j] = max(dp[j], dp[j - weight[i]] + value[i])` + + +接下来我们重点讲一下遍历顺序。 + +看过这两篇的话: + +* [01背包理论基础(二维数组)](https://programmercarl.com/背包理论基础01背包-1.html) +* [01背包理论基础(一维数组)](https://programmercarl.com/背包理论基础01背包-2.html) + +就知道了,01背包中二维dp数组的两个for遍历的先后循序是可以颠倒了,一维dp数组的两个for循环先后循序一定是先遍历物品,再遍历背包容量。 + +**在完全背包中,对于一维dp数组来说,其实两个for循环嵌套顺序是无所谓的**! + +因为dp[j] 是根据 下标j之前所对应的dp[j]计算出来的。 只要保证下标j之前的dp[j]都是经过计算的就可以了。 + +遍历物品在外层循环,遍历背包容量在内层循环,状态如图: + +![动态规划-完全背包1](https://code-thinking-1253855093.file.myqcloud.com/pics/20210126104529605.jpg) + +遍历背包容量在外层循环,遍历物品在内层循环,状态如图: + +![动态规划-完全背包2](https://code-thinking-1253855093.file.myqcloud.com/pics/20210729234011.png) + +看了这两个图,大家就会理解,完全背包中,两个for循环的先后循序,都不影响计算dp[j]所需要的值(这个值就是下标j之前所对应的dp[j])。 + +先遍历背包再遍历物品,代码如下: + +```CPP +for(int j = 0; j <= bagWeight; j++) { // 遍历背包容量 + for(int i = 0; i < weight.size(); i++) { // 遍历物品 + if (j - weight[i] >= 0) dp[j] = max(dp[j], dp[j - weight[i]] + value[i]); + } + cout << endl; +} +``` + +先遍历物品再遍历背包: + +```CPP +for(int i = 0; i < weight.size(); i++) { // 遍历物品 + for(int j = 0; j <= bagWeight; j++) { // 遍历背包容量 + if (j - weight[i] >= 0) dp[j] = max(dp[j], dp[j - weight[i]] + value[i]); + } +} +``` + +整体代码如下: + +```cpp +#include +#include +using namespace std; + +int main() { + int N, bagWeight; + cin >> N >> bagWeight; + vector weight(N, 0); + vector value(N, 0); + for (int i = 0; i < N; i++) { + int w; + int v; + cin >> w >> v; + weight[i] = w; + value[i] = v; + } + + vector dp(bagWeight + 1, 0); + for(int j = 0; j <= bagWeight; j++) { // 遍历背包容量 + for(int i = 0; i < weight.size(); i++) { // 遍历物品 + if (j - weight[i] >= 0) dp[j] = max(dp[j], dp[j - weight[i]] + value[i]); + } + } + cout << dp[bagWeight] << endl; + + return 0; +} +``` + + + +## 总结 + +细心的同学可能发现,**全文我说的都是对于纯完全背包问题,其for循环的先后循环是可以颠倒的!** + +但如果题目稍稍有点变化,就会体现在遍历顺序上。 + +如果问装满背包有几种方式的话? 那么两个for循环的先后顺序就有很大区别了,而leetcode上的题目都是这种稍有变化的类型。 + +这个区别,我将在后面讲解具体leetcode题目中给大家介绍,因为这块如果不结合具题目,单纯的介绍原理估计很多同学会越看越懵! + +别急,下一篇就是了! + +最后,**又可以出一道面试题了,就是纯完全背包,要求先用二维dp数组实现,然后再用一维dp数组实现,最后再问,两个for循环的先后是否可以颠倒?为什么?** + +这个简单的完全背包问题,估计就可以难住不少候选人了。 + + +## 其他语言版本 + +### Java: + +```java +import java.util.Scanner; + +public class Main { + public static void main(String[] args) { + Scanner scanner = new Scanner(System.in); + int N = scanner.nextInt(); + int bagWeight = scanner.nextInt(); + + int[] weight = new int[N]; + int[] value = new int[N]; + for (int i = 0; i < N; i++) { + weight[i] = scanner.nextInt(); + value[i] = scanner.nextInt(); + } + + int[] dp = new int[bagWeight + 1]; + + for (int j = 0; j <= bagWeight; j++) { // 遍历背包容量 + for (int i = 0; i < weight.length; i++) { // 遍历物品 + if (j >= weight[i]) { + dp[j] = Math.max(dp[j], dp[j - weight[i]] + value[i]); + } + } + } + + System.out.println(dp[bagWeight]); + scanner.close(); + } +} + +``` + + + +### Python: + +```python +def complete_knapsack(N, bag_weight, weight, value): + dp = [0] * (bag_weight + 1) + + for j in range(bag_weight + 1): # 遍历背包容量 + for i in range(len(weight)): # 遍历物品 + if j >= weight[i]: + dp[j] = max(dp[j], dp[j - weight[i]] + value[i]) + + return dp[bag_weight] + +# 输入 +N, bag_weight = map(int, input().split()) +weight = [] +value = [] +for _ in range(N): + w, v = map(int, input().split()) + weight.append(w) + value.append(v) + +# 输出结果 +print(complete_knapsack(N, bag_weight, weight, value)) + + +``` + + +### Go: + +```go + +``` +### Javascript: + +```Javascript +``` + diff --git "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" index 3a50ee7bbf..1e270555d1 100644 --- "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" +++ "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" @@ -5,18 +5,11 @@

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

-# 动态规划:完全背包理论基础 +# 完全背包理论基础-二维DP数组 本题力扣上没有原题,大家可以去[卡码网第52题](https://kamacoder.com/problempage.php?pid=1052)去练习,题意是一样的。 -## 算法公开课 - -**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[带你学透完全背包问题! ](https://www.bilibili.com/video/BV1uK411o7c9/),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 - -## 思路 - -### 完全背包 - +## 完全背包 有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。**每件物品都有无限个(也就是可以放入背包多次)**,求解将哪些物品装入背包里物品价值总和最大。 @@ -24,14 +17,12 @@ 同样leetcode上没有纯完全背包问题,都是需要完全背包的各种应用,需要转化成完全背包问题,所以我这里还是以纯完全背包问题进行讲解理论和原理。 -在下面的讲解中,我依然举这个例子: +在下面的讲解中,我拿下面数据举例子: -背包最大重量为4。 - -物品为: +背包最大重量为4,物品为: | | 重量 | 价值 | -| --- | --- | --- | +| ----- | ---- | ---- | | 物品0 | 1 | 15 | | 物品1 | 3 | 20 | | 物品2 | 4 | 30 | @@ -40,471 +31,292 @@ 问背包能背的物品最大价值是多少? -01背包和完全背包唯一不同就是体现在遍历顺序上,所以本文就不去做动规五部曲了,我们直接针对遍历顺序经行分析! +**如果没看到之前的01背包讲解,已经要先仔细看如下两篇,01背包是基础,本篇在讲解完全背包,之前的背包基础我将不会重复讲解**。 -关于01背包我如下两篇已经进行深入分析了: +* [01背包理论基础(二维数组)](https://programmercarl.com/背包理论基础01背包-1.html) +* [01背包理论基础(一维数组)](https://programmercarl.com/背包理论基础01背包-2.html) -* [动态规划:关于01背包问题,你该了解这些!](https://programmercarl.com/背包理论基础01背包-1.html) -* [动态规划:关于01背包问题,你该了解这些!(滚动数组)](https://programmercarl.com/背包理论基础01背包-2.html) +动规五部曲分析完全背包,为了从原理上讲清楚,我们先从二维dp数组分析: -首先再回顾一下01背包的核心代码 -```cpp -for(int i = 0; i < weight.size(); i++) { // 遍历物品 - for(int j = bagWeight; j >= weight[i]; j--) { // 遍历背包容量 - dp[j] = max(dp[j], dp[j - weight[i]] + value[i]); - } -} -``` +### 1. 确定dp数组以及下标的含义 -我们知道01背包内嵌的循环是从大到小遍历,为了保证每个物品仅被添加一次。 +**dp[i][j] 表示从下标为[0-i]的物品,每个物品可以取无限次,放进容量为j的背包,价值总和最大是多少**。 -而完全背包的物品是可以添加多次的,所以要从小到大去遍历,即: +很多录友也会疑惑,凭什么上来就定义 dp数组,思考过程是什么样的, 这个思考过程我在 [01背包理论基础(二维数组)](https://programmercarl.com/背包理论基础01背包-1.html) 中的 “确定dp数组以及下标的含义” 有详细讲解。 -```CPP -// 先遍历物品,再遍历背包 -for(int i = 0; i < weight.size(); i++) { // 遍历物品 - for(int j = weight[i]; j <= bagWeight ; j++) { // 遍历背包容量 - dp[j] = max(dp[j], dp[j - weight[i]] + value[i]); - } -} -``` +### 2. 确定递推公式 -至于为什么,我在[动态规划:关于01背包问题,你该了解这些!(滚动数组)](https://programmercarl.com/背包理论基础01背包-2.html)中也做了讲解。 +这里在把基本信息给出来: -dp状态图如下: +| | 重量 | 价值 | +| ----- | ---- | ---- | +| 物品0 | 1 | 15 | +| 物品1 | 3 | 20 | +| 物品2 | 4 | 30 | +对于递推公式,首先我们要明确有哪些方向可以推导出 dp[i][j]。 -![动态规划-完全背包](https://code-thinking-1253855093.file.myqcloud.com/pics/20210126104510106.jpg) +这里依然拿dp[1][4]的状态来举例: ([01背包理论基础(二维数组)](https://programmercarl.com/背包理论基础01背包-1.html) 中也是这个例子,要注意下面的不同之处) -相信很多同学看网上的文章,关于完全背包介绍基本就到为止了。 +求取 dp[1][4] 有两种情况: -**其实还有一个很重要的问题,为什么遍历物品在外层循环,遍历背包容量在内层循环?** +1. 放物品1 +2. 还是不放物品1 -这个问题很多题解关于这里都是轻描淡写就略过了,大家都默认 遍历物品在外层,遍历背包容量在内层,好像本应该如此一样,那么为什么呢? +如果不放物品1, 那么背包的价值应该是 dp[0][4] 即 容量为4的背包,只放物品0的情况。 -难道就不能遍历背包容量在外层,遍历物品在内层? +推导方向如图: +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20241126112952.png) -看过这两篇的话: -* [动态规划:关于01背包问题,你该了解这些!](https://programmercarl.com/背包理论基础01背包-1.html) -* [动态规划:关于01背包问题,你该了解这些!(滚动数组)](https://programmercarl.com/背包理论基础01背包-2.html) +如果放物品1, **那么背包要先留出物品1的容量**,目前容量是4,物品1 的容量(就是物品1的重量)为3,此时背包剩下容量为1。 -就知道了,01背包中二维dp数组的两个for遍历的先后循序是可以颠倒了,一维dp数组的两个for循环先后循序一定是先遍历物品,再遍历背包容量。 +容量为1,只考虑放物品0 和物品1 的最大价值是 dp[1][1], **注意 这里和 [01背包理论基础(二维数组)](https://programmercarl.com/背包理论基础01背包-1.html) 有所不同了**! -**在完全背包中,对于一维dp数组来说,其实两个for循环嵌套顺序是无所谓的!** +在 [01背包理论基础(二维数组)](https://programmercarl.com/背包理论基础01背包-1.html) 中,背包先空留出物品1的容量,此时容量为1,只考虑放物品0的最大价值是 dp[0][1],**因为01背包每个物品只有一个,既然空出物品1,那背包中也不会再有物品1**! -因为dp[j] 是根据 下标j之前所对应的dp[j]计算出来的。 只要保证下标j之前的dp[j]都是经过计算的就可以了。 +而在完全背包中,物品是可以放无限个,所以 即使空出物品1空间重量,那背包中也可能还有物品1,所以此时我们依然考虑放 物品0 和 物品1 的最大价值即: **dp[1][1], 而不是 dp[0][1]** -遍历物品在外层循环,遍历背包容量在内层循环,状态如图: +所以 放物品1 的情况 = dp[1][1] + 物品1 的价值,推导方向如图: +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20241126113104.png) -![动态规划-完全背包1](https://code-thinking-1253855093.file.myqcloud.com/pics/20210126104529605.jpg) -遍历背包容量在外层循环,遍历物品在内层循环,状态如图: +(**注意上图和 [01背包理论基础(二维数组)](https://programmercarl.com/背包理论基础01背包-1.html) 中的区别**,对于理解完全背包很重要) -![动态规划-完全背包2](https://code-thinking-1253855093.file.myqcloud.com/pics/20210729234011.png) +两种情况,分别是放物品1 和 不放物品1,我们要取最大值(毕竟求的是最大价值) -看了这两个图,大家就会理解,完全背包中,两个for循环的先后循序,都不影响计算dp[j]所需要的值(这个值就是下标j之前所对应的dp[j])。 +`dp[1][4] = max(dp[0][4], dp[1][1] + 物品1 的价值) ` -先遍历背包在遍历物品,代码如下: +以上过程,抽象化如下: -```CPP -// 先遍历背包,再遍历物品 -for(int j = 0; j <= bagWeight; j++) { // 遍历背包容量 - for(int i = 0; i < weight.size(); i++) { // 遍历物品 - if (j - weight[i] >= 0) dp[j] = max(dp[j], dp[j - weight[i]] + value[i]); - } - cout << endl; -} -``` +* **不放物品i**:背包容量为j,里面不放物品i的最大价值是dp[i - 1][j]。 -完整的C++测试代码如下: +* **放物品i**:背包空出物品i的容量后,背包容量为j - weight[i],dp[i][j - weight[i]] 为背包容量为j - weight[i]且不放物品i的最大价值,那么dp[i][j - weight[i]] + value[i] (物品i的价值),就是背包放物品i得到的最大价值 -```CPP -// 先遍历物品,在遍历背包 -void test_CompletePack() { - vector weight = {1, 3, 4}; - vector value = {15, 20, 30}; - int bagWeight = 4; - vector dp(bagWeight + 1, 0); - for(int i = 0; i < weight.size(); i++) { // 遍历物品 - for(int j = weight[i]; j <= bagWeight; j++) { // 遍历背包容量 - dp[j] = max(dp[j], dp[j - weight[i]] + value[i]); - } - } - cout << dp[bagWeight] << endl; -} -int main() { - test_CompletePack(); -} +递归公式: `dp[i][j] = max(dp[i - 1][j], dp[i][j - weight[i]] + value[i]);` -``` +(注意,完全背包二维dp数组 和 01背包二维dp数组 递推公式的区别,01背包中是 `dp[i - 1][j - weight[i]] + value[i])`) -```CPP +### 3. dp数组如何初始化 -// 先遍历背包,再遍历物品 -void test_CompletePack() { - vector weight = {1, 3, 4}; - vector value = {15, 20, 30}; - int bagWeight = 4; +**关于初始化,一定要和dp数组的定义吻合,否则到递推公式的时候就会越来越乱**。 - vector dp(bagWeight + 1, 0); +首先从dp[i][j]的定义出发,如果背包容量j为0的话,即dp[i][0],无论是选取哪些物品,背包价值总和一定为0。如图: - for(int j = 0; j <= bagWeight; j++) { // 遍历背包容量 - for(int i = 0; i < weight.size(); i++) { // 遍历物品 - if (j - weight[i] >= 0) dp[j] = max(dp[j], dp[j - weight[i]] + value[i]); - } - } - cout << dp[bagWeight] << endl; -} -int main() { - test_CompletePack(); -} +![动态规划-背包问题2](https://code-thinking-1253855093.file.myqcloud.com/pics/2021011010304192.png) -``` +在看其他情况。 -本题力扣上没有原题,大家可以去[卡码网第52题](https://kamacoder.com/problempage.php?pid=1052)去练习,题意是一样的,C++代码如下: +状态转移方程 `dp[i][j] = max(dp[i - 1][j], dp[i][j - weight[i]] + value[i]);` 可以看出有一个方向 i 是由 i-1 推导出来,那么i为0的时候就一定要初始化。 -```cpp -#include -#include -using namespace std; +dp[0][j],即:存放编号0的物品的时候,各个容量的背包所能存放的最大价值。 -// 先遍历背包,再遍历物品 -void test_CompletePack(vector weight, vector value, int bagWeight) { +那么很明显当 `j < weight[0]`的时候,dp[0][j] 应该是 0,因为背包容量比编号0的物品重量还小。 - vector dp(bagWeight + 1, 0); +当`j >= weight[0]`时,**dp[0][j] 如果能放下weight[0]的话,就一直装,每一种物品有无限个**。 - for(int j = 0; j <= bagWeight; j++) { // 遍历背包容量 - for(int i = 0; i < weight.size(); i++) { // 遍历物品 - if (j - weight[i] >= 0) dp[j] = max(dp[j], dp[j - weight[i]] + value[i]); - } - } - cout << dp[bagWeight] << endl; -} -int main() { - int N, V; - cin >> N >> V; - vector weight; - vector value; - for (int i = 0; i < N; i++) { - int w; - int v; - cin >> w >> v; - weight.push_back(w); - value.push_back(v); - } - test_CompletePack(weight, value, V); - return 0; +代码初始化如下: + +```CPP +for (int i = 1; i < weight.size(); i++) { // 当然这一步,如果把dp数组预先初始化为0了,这一步就可以省略,但很多同学应该没有想清楚这一点。 + dp[i][0] = 0; } + +// 正序遍历,如果能放下就一直装物品0 +for (int j = weight[0]; j <= bagWeight; j++) + dp[0][j] = dp[0][j - weight[0]] + value[0]; ``` +(注意上面初始化和 [01背包理论基础(二维数组)](https://programmercarl.com/背包理论基础01背包-1.html)的区别在于物品有无限个) -## 总结 +此时dp数组初始化情况如图所示: -细心的同学可能发现,**全文我说的都是对于纯完全背包问题,其for循环的先后循环是可以颠倒的!** +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20241114161608.png) -但如果题目稍稍有点变化,就会体现在遍历顺序上。 +dp[0][j] 和 dp[i][0] 都已经初始化了,那么其他下标应该初始化多少呢? -如果问装满背包有几种方式的话? 那么两个for循环的先后顺序就有很大区别了,而leetcode上的题目都是这种稍有变化的类型。 +其实从递归公式: dp[i][j] = max(dp[i - 1][j], dp[i][j - weight[i]] + value[i]); 可以看出dp[i][j] 是由上方和左方数值推导出来了,那么 其他下标初始为什么数值都可以,因为都会被覆盖。 -这个区别,我将在后面讲解具体leetcode题目中给大家介绍,因为这块如果不结合具题目,单纯的介绍原理估计很多同学会越看越懵! +但只不过一开始就统一把dp数组统一初始为0,更方便一些。 -别急,下一篇就是了! +最后初始化代码如下: -最后,**又可以出一道面试题了,就是纯完全背包,要求先用二维dp数组实现,然后再用一维dp数组实现,最后再问,两个for循环的先后是否可以颠倒?为什么?** -这个简单的完全背包问题,估计就可以难住不少候选人了。 +```CPP +// 初始化 dp +vector> dp(weight.size(), vector(bagweight + 1, 0)); +for (int j = weight[0]; j <= bagWeight; j++) { + dp[0][j] = dp[0][j - weight[0]] + value[0]; +} +``` +### 4. 确定遍历顺序 +[01背包理论基础(二维数组)](https://programmercarl.com/背包理论基础01背包-1.html) 中我们讲过,01背包二维DP数组,先遍历物品还是先遍历背包都是可以的。 -## 其他语言版本 +因为两种遍历顺序,对于二维dp数组来说,递推公式所需要的值,二维dp数组里对应的位置都有。 -### Java: - -```java -//先遍历物品,再遍历背包 -private static void testCompletePack(){ - int[] weight = {1, 3, 4}; - int[] value = {15, 20, 30}; - int bagWeight = 4; - int[] dp = new int[bagWeight + 1]; - for (int i = 0; i < weight.length; i++){ // 遍历物品 - for (int j = weight[i]; j <= bagWeight; j++){ // 遍历背包容量 - dp[j] = Math.max(dp[j], dp[j - weight[i]] + value[i]); - } - } - for (int maxValue : dp){ - System.out.println(maxValue + " "); +详细可以看 [01背包理论基础(二维数组)](https://programmercarl.com/背包理论基础01背包-1.html) 中的 【遍历顺序】的讲解 + +所以既可以 先遍历物品再遍历背包: + +```CPP +for (int i = 1; i < n; i++) { // 遍历物品 + for(int j = 0; j <= bagWeight; j++) { // 遍历背包容量 + if (j < weight[i]) dp[i][j] = dp[i - 1][j]; + else dp[i][j] = max(dp[i - 1][j], dp[i][j - weight[i]] + value[i]); } } +``` -//先遍历背包,再遍历物品 -private static void testCompletePackAnotherWay(){ - int[] weight = {1, 3, 4}; - int[] value = {15, 20, 30}; - int bagWeight = 4; - int[] dp = new int[bagWeight + 1]; - for (int i = 1; i <= bagWeight; i++){ // 遍历背包容量 - for (int j = 0; j < weight.length; j++){ // 遍历物品 - if (i - weight[j] >= 0){ - dp[i] = Math.max(dp[i], dp[i - weight[j]] + value[j]); - } - } - } - for (int maxValue : dp){ - System.out.println(maxValue + " "); +也可以 先遍历背包再遍历物品: + +```CPP +for(int j = 0; j <= bagWeight; j++) { // 遍历背包容量 + for (int i = 1; i < n; i++) { // 遍历物品 + if (j < weight[i]) dp[i][j] = dp[i - 1][j]; + else dp[i][j] = max(dp[i - 1][j], dp[i][j - weight[i]] + value[i]); } } ``` +### 5. 举例推导dp数组 +以本篇举例数据为例,填满了dp二维数组如图: -### Python: +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20241126113752.png) -先遍历物品,再遍历背包(无参版) -```python -def test_CompletePack(): - weight = [1, 3, 4] - value = [15, 20, 30] - bagWeight = 4 - dp = [0] * (bagWeight + 1) - for i in range(len(weight)): # 遍历物品 - for j in range(weight[i], bagWeight + 1): # 遍历背包容量 - dp[j] = max(dp[j], dp[j - weight[i]] + value[i]) - print(dp[bagWeight]) +因为 物品0 的性价比是最高的,而且 在完全背包中,每一类物品都有无限个,所以有无限个物品0,既然物品0 性价比最高,当然是优先放物品0。 -test_CompletePack() -``` +### 本题代码: -先遍历物品,再遍历背包(有参版) -```python -def test_CompletePack(weight, value, bagWeight): - dp = [0] * (bagWeight + 1) - for i in range(len(weight)): # 遍历物品 - for j in range(weight[i], bagWeight + 1): # 遍历背包容量 - dp[j] = max(dp[j], dp[j - weight[i]] + value[i]) - return dp[bagWeight] - -if __name__ == "__main__": - weight = [1, 3, 4] - value = [15, 20, 30] - bagWeight = 4 - result = test_CompletePack(weight, value, bagWeight) - print(result) -``` -先遍历背包,再遍历物品(无参版) -```python -def test_CompletePack(): - weight = [1, 3, 4] - value = [15, 20, 30] - bagWeight = 4 +```CPP +#include +#include +using namespace std; - dp = [0] * (bagWeight + 1) +int main() { + int n, bagWeight; + int w, v; + cin >> n >> bagWeight; + vector weight(n); + vector value(n); + for (int i = 0; i < n; i++) { + cin >> weight[i] >> value[i]; + } - for j in range(bagWeight + 1): # 遍历背包容量 - for i in range(len(weight)): # 遍历物品 - if j - weight[i] >= 0: - dp[j] = max(dp[j], dp[j - weight[i]] + value[i]) + vector> dp(n, vector(bagWeight + 1, 0)); - print(dp[bagWeight]) + // 初始化 + for (int j = weight[0]; j <= bagWeight; j++) + dp[0][j] = dp[0][j - weight[0]] + value[0]; -test_CompletePack() + for (int i = 1; i < n; i++) { // 遍历物品 + for(int j = 0; j <= bagWeight; j++) { // 遍历背包容量 + if (j < weight[i]) dp[i][j] = dp[i - 1][j]; + else dp[i][j] = max(dp[i - 1][j], dp[i][j - weight[i]] + value[i]); + } + } + cout << dp[n - 1][bagWeight] << endl; + + return 0; +} ``` -先遍历背包,再遍历物品(有参版) -```python -def test_CompletePack(weight, value, bagWeight): - dp = [0] * (bagWeight + 1) - for j in range(bagWeight + 1): # 遍历背包容量 - for i in range(len(weight)): # 遍历物品 - if j - weight[i] >= 0: - dp[j] = max(dp[j], dp[j - weight[i]] + value[i]) - return dp[bagWeight] +关于一维dp数组,大家看这里:[完全背包一维dp数组讲解](./背包问题完全背包一维.md) +## 其他语言版本 -if __name__ == "__main__": - weight = [1, 3, 4] - value = [15, 20, 30] - bagWeight = 4 - result = test_CompletePack(weight, value, bagWeight) - print(result) +### Java -``` +```Java +import java.util.Scanner; -### Go: - -```go - -// test_CompletePack1 先遍历物品, 在遍历背包 -func test_CompletePack1(weight, value []int, bagWeight int) int { - // 定义dp数组 和初始化 - dp := make([]int, bagWeight+1) - // 遍历顺序 - for i := 0; i < len(weight); i++ { - // 正序会多次添加 value[i] - for j := weight[i]; j <= bagWeight; j++ { - // 推导公式 - dp[j] = max(dp[j], dp[j-weight[i]]+value[i]) - // debug - //fmt.Println(dp) - } - } - return dp[bagWeight] -} +public class Main { + public static void main(String[] args) { + Scanner scanner = new Scanner(System.in); + int n = scanner.nextInt(); + int bagWeight = scanner.nextInt(); -// test_CompletePack2 先遍历背包, 在遍历物品 -func test_CompletePack2(weight, value []int, bagWeight int) int { - // 定义dp数组 和初始化 - dp := make([]int, bagWeight+1) - // 遍历顺序 - // j从0 开始 - for j := 0; j <= bagWeight; j++ { - for i := 0; i < len(weight); i++ { - if j >= weight[i] { - // 推导公式 - dp[j] = max(dp[j], dp[j-weight[i]]+value[i]) - } - // debug - //fmt.Println(dp) - } - } - return dp[bagWeight] -} + int[] weight = new int[n]; + int[] value = new int[n]; -func max(a, b int) int { - if a > b { - return a - } - return b -} + for (int i = 0; i < n; i++) { + weight[i] = scanner.nextInt(); + value[i] = scanner.nextInt(); + } -func main() { - weight := []int{1, 3, 4} - price := []int{15, 20, 30} - fmt.Println(test_CompletePack1(weight, price, 4)) - fmt.Println(test_CompletePack2(weight, price, 4)) -} -``` -### Javascript: - -```Javascript -// 先遍历物品,再遍历背包容量 -function test_completePack1() { - let weight = [1, 3, 5] - let value = [15, 20, 30] - let bagWeight = 4 - let dp = new Array(bagWeight + 1).fill(0) - for(let i = 0; i <= weight.length; i++) { - for(let j = weight[i]; j <= bagWeight; j++) { - dp[j] = Math.max(dp[j], dp[j - weight[i]] + value[i]) + int[][] dp = new int[n][bagWeight + 1]; + + // 初始化 + for (int j = weight[0]; j <= bagWeight; j++) { + dp[0][j] = dp[0][j - weight[0]] + value[0]; } - } - console.log(dp) -} -// 先遍历背包容量,再遍历物品 -function test_completePack2() { - let weight = [1, 3, 5] - let value = [15, 20, 30] - let bagWeight = 4 - let dp = new Array(bagWeight + 1).fill(0) - for(let j = 0; j <= bagWeight; j++) { - for(let i = 0; i < weight.length; i++) { - if (j >= weight[i]) { - dp[j] = Math.max(dp[j], dp[j - weight[i]] + value[i]) + // 动态规划 + for (int i = 1; i < n; i++) { + for (int j = 0; j <= bagWeight; j++) { + if (j < weight[i]) { + dp[i][j] = dp[i - 1][j]; + } else { + dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - weight[i]] + value[i]); + } } } - } - console.log(2, dp); -} -``` -### TypeScript: - -```typescript -// 先遍历物品,再遍历背包容量 -function test_CompletePack(): void { - const weight: number[] = [1, 3, 4]; - const value: number[] = [15, 20, 30]; - const bagSize: number = 4; - const dp: number[] = new Array(bagSize + 1).fill(0); - for (let i = 0; i < weight.length; i++) { - for (let j = weight[i]; j <= bagSize; j++) { - dp[j] = Math.max(dp[j], dp[j - weight[i]] + value[i]); + System.out.println(dp[n - 1][bagWeight]); + scanner.close(); } - } - console.log(dp); } -test_CompletePack(); + ``` -### Scala: +### Go -```scala -// 先遍历物品,再遍历背包容量 -object Solution { - def test_CompletePack() { - var weight = Array[Int](1, 3, 4) - var value = Array[Int](15, 20, 30) - var baseweight = 4 +### Python - var dp = new Array[Int](baseweight + 1) +```python +def knapsack(n, bag_weight, weight, value): + dp = [[0] * (bag_weight + 1) for _ in range(n)] - for (i <- 0 until weight.length) { - for (j <- weight(i) to baseweight) { - dp(j) = math.max(dp(j), dp(j - weight(i)) + value(i)) - } - } - dp(baseweight) - } -} -``` + # 初始化 + for j in range(weight[0], bag_weight + 1): + dp[0][j] = dp[0][j - weight[0]] + value[0] -### Rust: - -```rust -impl Solution { - // 先遍历物品 - fn complete_pack() { - let (goods, bag_size) = (vec![(1, 15), (3, 20), (4, 30)], 4); - let mut dp = vec![0; bag_size + 1]; - for (weight, value) in goods { - for j in weight..=bag_size { - dp[j] = dp[j].max(dp[j - weight] + value); - } - } - println!("先遍历物品:{}", dp[bag_size]); - } + # 动态规划 + for i in range(1, n): + for j in range(bag_weight + 1): + if j < weight[i]: + dp[i][j] = dp[i - 1][j] + else: + dp[i][j] = max(dp[i - 1][j], dp[i][j - weight[i]] + value[i]) - // 先遍历背包 - fn complete_pack_after() { - let (goods, bag_size) = (vec![(1, 15), (3, 20), (4, 30)], 4); - let mut dp = vec![0; bag_size + 1]; - for i in 0..=bag_size { - for (weight, value) in &goods { - if i >= *weight { - dp[i] = dp[i].max(dp[i - weight] + value); - } - } - } - println!("先遍历背包:{}", dp[bag_size]); - } -} + return dp[n - 1][bag_weight] + +# 输入 +n, bag_weight = map(int, input().split()) +weight = [] +value = [] +for _ in range(n): + w, v = map(int, input().split()) + weight.append(w) + value.append(v) + +# 输出结果 +print(knapsack(n, bag_weight, weight, value)) -#[test] -fn test_complete_pack() { - Solution::complete_pack(); - Solution::complete_pack_after(); -} ``` +### JavaScript + +

From 47d32df226427e9e58639557da54f364a2cfe7ad Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Wed, 11 Dec 2024 11:56:17 +0800 Subject: [PATCH 2964/3019] Update --- README.md | 42 ++++++++++++++---------------------------- 1 file changed, 14 insertions(+), 28 deletions(-) diff --git a/README.md b/README.md index 3e3b67861e..a50dcd72d1 100644 --- a/README.md +++ b/README.md @@ -299,24 +299,25 @@ 背包问题大纲 -11. [动态规划:01背包理论基础](./problems/背包理论基础01背包-1.md) -12. [动态规划:01背包理论基础(滚动数组)](./problems/背包理论基础01背包-2.md) +11. [动态规划:01背包理论基础(二维dp数组)](./problems/背包理论基础01背包-1.md) +12. [动态规划:01背包理论基础(一维dp数组)](./problems/背包理论基础01背包-2.md) 13. [动态规划:416.分割等和子集](./problems/0416.分割等和子集.md) 14. [动态规划:1049.最后一块石头的重量II](./problems/1049.最后一块石头的重量II.md) 15. [本周小结!(动态规划系列三)](./problems/周总结/20210121动规周末总结.md) 16. [动态规划:494.目标和](./problems/0494.目标和.md) 17. [动态规划:474.一和零](./problems/0474.一和零.md) -18. [动态规划:完全背包总结篇](./problems/背包问题理论基础完全背包.md) -19. [动态规划:518.零钱兑换II](./problems/0518.零钱兑换II.md) -20. [本周小结!(动态规划系列四)](./problems/周总结/20210128动规周末总结.md) -21. [动态规划:377.组合总和Ⅳ](./problems/0377.组合总和Ⅳ.md) -22. [动态规划:70.爬楼梯(完全背包版本)](./problems/0070.爬楼梯完全背包版本.md) -23. [动态规划:322.零钱兑换](./problems/0322.零钱兑换.md) -24. [动态规划:279.完全平方数](./problems/0279.完全平方数.md) -25. [本周小结!(动态规划系列五)](./problems/周总结/20210204动规周末总结.md) -26. [动态规划:139.单词拆分](./problems/0139.单词拆分.md) -27. [动态规划:多重背包理论基础](./problems/背包问题理论基础多重背包.md) -28. [背包问题总结篇](./problems/背包总结篇.md) +18. [动态规划:完全背包理论基础(二维dp数组)](./problems/背包问题理论基础完全背包.md) +19. [动态规划:完全背包理论基础(一维dp数组)](./problems/背包问题完全背包一维.md) +20. [动态规划:518.零钱兑换II](./problems/0518.零钱兑换II.md) +21. [本周小结!(动态规划系列四)](./problems/周总结/20210128动规周末总结.md) +22. [动态规划:377.组合总和Ⅳ](./problems/0377.组合总和Ⅳ.md) +23. [动态规划:70.爬楼梯(完全背包版本)](./problems/0070.爬楼梯完全背包版本.md) +24. [动态规划:322.零钱兑换](./problems/0322.零钱兑换.md) +25. [动态规划:279.完全平方数](./problems/0279.完全平方数.md) +26. [本周小结!(动态规划系列五)](./problems/周总结/20210204动规周末总结.md) +27. [动态规划:139.单词拆分](./problems/0139.单词拆分.md) +28. [动态规划:多重背包理论基础](./problems/背包问题理论基础多重背包.md) +29. [背包问题总结篇](./problems/背包总结篇.md) 打家劫舍系列: @@ -408,21 +409,6 @@ (持续更新中....) - -## 十大排序 - -## 数论 - -## 高级数据结构经典题目 - -* 并查集 -* 最小生成树 -* 线段树 -* 树状数组 -* 字典树 - -## 海量数据处理 - # 补充题目 以上题目是重中之重,大家至少要刷两遍以上才能彻底理解,如果熟练以上题目之后还在找其他题目练手,可以再刷以下题目: From fb9186fc79c233a9cf06f9e5ecc3070f1d1c3332 Mon Sep 17 00:00:00 2001 From: C_W Date: Thu, 12 Dec 2024 12:15:00 +1100 Subject: [PATCH 2965/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A00459=E9=87=8D?= =?UTF-8?q?=E5=A4=8D=E7=9A=84=E5=AD=90=E5=AD=97=E7=AC=A6=E4=B8=B2=20C=20?= =?UTF-8?q?=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...20\345\255\227\347\254\246\344\270\262.md" | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git "a/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" "b/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" index 2be8922b9d..de0e6e4def 100644 --- "a/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" @@ -879,6 +879,52 @@ public int[] GetNext(string s) } ``` +### C + +```c +// 前缀表不减一 +int *build_next(char* s, int len) { + + int *next = (int *)malloc(len * sizeof(int)); + assert(next); + + // 初始化前缀表 + next[0] = 0; + + // 构建前缀表表 + int i = 1, j = 0; + while (i < len) { + if (s[i] == s[j]) { + j++; + next[i] = j; + i++; + } else if (j > 0) { + j = next[j - 1]; + } else { + next[i] = 0; + i++; + } + } + return next; +} + +bool repeatedSubstringPattern(char* s) { + + int len = strlen(s); + int *next = build_next(s, len); + bool result = false; + + // 检查最小重复片段能否被长度整除 + if (next[len - 1]) { + result = len % (len - next[len - 1]) == 0; + } + + free(next); + return result; +} + +``` +

From 96bb3d1bfeb507859ad3fcc00bd809f913dbce7c Mon Sep 17 00:00:00 2001 From: holic-x <1301996554@qq.com> Date: Thu, 12 Dec 2024 10:33:08 +0800 Subject: [PATCH 2966/3019] =?UTF-8?q?docs=EF=BC=9A=E8=A1=A5=E5=85=85?= =?UTF-8?q?=E3=80=900096-=E5=9F=8E=E5=B8=82=E9=97=B4=E8=B4=A7=E7=89=A9?= =?UTF-8?q?=E8=BF=90=E8=BE=93III=E3=80=91JAVA=E7=89=88=E6=9C=AC=E7=9A=84SP?= =?UTF-8?q?FA=E6=80=9D=E8=B7=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 补充【0096-城市间货物运输III】JAVA版本的SPFA思路 --- ...347\211\251\350\277\220\350\276\223III.md" | 119 ++++++++++++++++++ 1 file changed, 119 insertions(+) diff --git "a/problems/kamacoder/0096.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223III.md" "b/problems/kamacoder/0096.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223III.md" index a3e9e840f3..08fd010cd8 100644 --- "a/problems/kamacoder/0096.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223III.md" +++ "b/problems/kamacoder/0096.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223III.md" @@ -702,6 +702,125 @@ public class Main { ``` +```java +class Edge { + public int u; // 边的端点1 + public int v; // 边的端点2 + public int val; // 边的权值 + + public Edge() { + } + + public Edge(int u, int v) { + this.u = u; + this.v = v; + this.val = 0; + } + + public Edge(int u, int v, int val) { + this.u = u; + this.v = v; + this.val = val; + } +} + +/** + * SPFA算法(版本3):处理含【负权回路】的有向图的最短路径问题 + * bellman_ford(版本3) 的队列优化算法版本 + * 限定起点、终点、至多途径k个节点 + */ +public class SPFAForSSSP { + + /** + * SPFA算法 + * + * @param n 节点个数[1,n] + * @param graph 邻接表 + * @param startIdx 开始节点(源点) + */ + public static int[] spfa(int n, List> graph, int startIdx, int k) { + // 定义最大范围 + int maxVal = Integer.MAX_VALUE; + // minDist[i] 源点到节点i的最短距离 + int[] minDist = new int[n + 1]; // 有效节点编号范围:[1,n] + Arrays.fill(minDist, maxVal); // 初始化为maxVal + minDist[startIdx] = 0; // 设置源点到源点的最短路径为0 + + // 定义queue记录每一次松弛更新的节点 + Queue queue = new LinkedList<>(); + queue.offer(startIdx); // 初始化:源点开始(queue和minDist的更新是同步的) + + + // SPFA算法核心:只对上一次松弛的时候更新过的节点关联的边进行松弛操作 + while (k + 1 > 0 && !queue.isEmpty()) { // 限定松弛 k+1 次 + int curSize = queue.size(); // 记录当前队列节点个数(上一次松弛更新的节点个数,用作分层统计) + while (curSize-- > 0) { //分层控制,限定本次松弛只针对上一次松弛更新的节点,不对新增的节点做处理 + // 记录当前minDist状态,作为本次松弛的基础 + int[] minDist_copy = Arrays.copyOfRange(minDist, 0, minDist.length); + + // 取出节点 + int cur = queue.poll(); + // 获取cur节点关联的边,进行松弛操作 + List relateEdges = graph.get(cur); + for (Edge edge : relateEdges) { + int u = edge.u; // 与`cur`对照 + int v = edge.v; + int weight = edge.val; + if (minDist_copy[u] + weight < minDist[v]) { + minDist[v] = minDist_copy[u] + weight; // 更新 + // 队列同步更新(此处有一个针对队列的优化:就是如果已经存在于队列的元素不需要重复添加) + if (!queue.contains(v)) { + queue.offer(v); // 与minDist[i]同步更新,将本次更新的节点加入队列,用做下一个松弛的参考基础 + } + } + } + } + // 当次松弛结束,次数-1 + k--; + } + + // 返回minDist + return minDist; + } + + public static void main(String[] args) { + // 输入控制 + Scanner sc = new Scanner(System.in); + System.out.println("1.输入N个节点、M条边(u v weight)"); + int n = sc.nextInt(); + int m = sc.nextInt(); + + System.out.println("2.输入M条边"); + List> graph = new ArrayList<>(); // 构建邻接表 + for (int i = 0; i <= n; i++) { + graph.add(new ArrayList<>()); + } + while (m-- > 0) { + int u = sc.nextInt(); + int v = sc.nextInt(); + int weight = sc.nextInt(); + graph.get(u).add(new Edge(u, v, weight)); + } + + System.out.println("3.输入src dst k(起点、终点、至多途径k个点)"); + int src = sc.nextInt(); + int dst = sc.nextInt(); + int k = sc.nextInt(); + + // 调用算法 + int[] minDist = SPFAForSSSP.spfa(n, graph, src, k); + // 校验起点->终点 + if (minDist[dst] == Integer.MAX_VALUE) { + System.out.println("unreachable"); + } else { + System.out.println("最短路径:" + minDist[n]); + } + } +} +``` + + + ### Python ```python def main(): From b5cbc15bcfe13b3e8a6e45cf0f4e584eddd434d9 Mon Sep 17 00:00:00 2001 From: holic-x <1301996554@qq.com> Date: Thu, 12 Dec 2024 16:53:50 +0800 Subject: [PATCH 2967/3019] =?UTF-8?q?docs=EF=BC=9A=E3=80=900097-=E5=B0=8F?= =?UTF-8?q?=E6=98=8E=E9=80=9B=E5=85=AC=E5=9B=AD=E3=80=91=E8=A1=A5=E5=85=85?= =?UTF-8?q?=20JAVA=E7=89=88=E6=9C=AC=E3=80=90=E5=9F=BA=E4=BA=8E=E4=B8=89?= =?UTF-8?q?=E7=BB=B4=E6=95=B0=E7=BB=84=E7=9A=84Floyd=E7=AE=97=E6=B3=95?= =?UTF-8?q?=E3=80=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit docs:【0097-小明逛公园】补充 JAVA版本【基于三维数组的Floyd算法】 --- ...16\351\200\233\345\205\254\345\233\255.md" | 65 +++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git "a/problems/kamacoder/0097.\345\260\217\346\230\216\351\200\233\345\205\254\345\233\255.md" "b/problems/kamacoder/0097.\345\260\217\346\230\216\351\200\233\345\205\254\345\233\255.md" index 8b3078fc01..27ad0eb9fa 100644 --- "a/problems/kamacoder/0097.\345\260\217\346\230\216\351\200\233\345\205\254\345\233\255.md" +++ "b/problems/kamacoder/0097.\345\260\217\346\230\216\351\200\233\345\205\254\345\233\255.md" @@ -424,6 +424,71 @@ floyd算法的时间复杂度相对较高,适合 稠密图且源点较多的 ### Java +- 基于三维数组的Floyd算法 + +```java +public class FloydBase { + + // public static int MAX_VAL = Integer.MAX_VALUE; + public static int MAX_VAL = 10005; // 边的最大距离是10^4(不选用Integer.MAX_VALUE是为了避免相加导致数值溢出) + + public static void main(String[] args) { + // 输入控制 + Scanner sc = new Scanner(System.in); + System.out.println("1.输入N M"); + int n = sc.nextInt(); + int m = sc.nextInt(); + + System.out.println("2.输入M条边"); + + // ① dp定义(grid[i][j][k] 节点i到节点j 可能经过节点K(k∈[1,n]))的最短路径 + int[][][] grid = new int[n + 1][n + 1][n + 1]; + for (int i = 1; i <= n; i++) { + for (int j = 1; j <= n; j++) { + for (int k = 0; k <= n; k++) { + grid[i][j][k] = grid[j][i][k] = MAX_VAL; // 其余设置为最大值 + } + } + } + + // ② dp 推导:grid[i][j][k] = min{grid[i][k][k-1] + grid[k][j][k-1], grid[i][j][k-1]} + while (m-- > 0) { + int u = sc.nextInt(); + int v = sc.nextInt(); + int weight = sc.nextInt(); + grid[u][v][0] = grid[v][u][0] = weight; // 初始化(处理k=0的情况) ③ dp初始化 + } + + // ④ dp推导:floyd 推导 + for (int k = 1; k <= n; k++) { + for (int i = 1; i <= n; i++) { + for (int j = 1; j <= n; j++) { + grid[i][j][k] = Math.min(grid[i][k][k - 1] + grid[k][j][k - 1], grid[i][j][k - 1]); + } + } + } + + System.out.println("3.输入[起点-终点]计划个数"); + int x = sc.nextInt(); + + System.out.println("4.输入每个起点src 终点dst"); + + while (x-- > 0) { + int src = sc.nextInt(); + int dst = sc.nextInt(); + // 根据floyd推导结果输出计划路径的最小距离 + if (grid[src][dst][n] == MAX_VAL) { + System.out.println("-1"); + } else { + System.out.println(grid[src][dst][n]); + } + } + } +} +``` + + + ### Python 基于三维数组的Floyd From d6f7f3adbcd2532fafe6ffc06efc4e3d01f8d1ee Mon Sep 17 00:00:00 2001 From: C_W Date: Thu, 12 Dec 2024 22:32:25 +1100 Subject: [PATCH 2968/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200225.=E7=94=A8?= =?UTF-8?q?=E9=98=9F=E5=88=97=E5=AE=9E=E7=8E=B0=E6=A0=88.md=20C=20?= =?UTF-8?q?=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...27\345\256\236\347\216\260\346\240\210.md" | 89 +++++++++++++++++++ 1 file changed, 89 insertions(+) diff --git "a/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" "b/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" index f0fe3a3c30..73d9db1b16 100644 --- "a/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" +++ "b/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" @@ -1277,6 +1277,95 @@ impl MyStack { } ``` +### C: + +> C:单队列 + +```c +typedef struct Node { + int val; + struct Node *next; +} Node_t; + +// 用单向链表实现queue +typedef struct { + Node_t *head; + Node_t *foot; + int size; +} MyStack; + +MyStack* myStackCreate() { + MyStack *obj = (MyStack *)malloc(sizeof(MyStack)); + assert(obj); + obj->head = NULL; + obj->foot = NULL; + obj->size = 0; + return obj; +} + +void myStackPush(MyStack* obj, int x) { + + Node_t *temp = (Node_t *)malloc(sizeof(Node_t)); + assert(temp); + temp->val = x; + temp->next = NULL; + + // 添加至queue末尾 + if (obj->foot) { + obj->foot->next = temp; + } else { + obj->head = temp; + } + obj->foot = temp; + obj->size++; +} + +int myStackPop(MyStack* obj) { + + // 获取末尾元素 + int target = obj->foot->val; + + if (obj->head == obj->foot) { + free(obj->foot); + obj->head = NULL; + obj->foot = NULL; + } else { + + Node_t *prev = obj->head; + // 移动至queue尾部节点前一个节点 + while (prev->next != obj->foot) { + prev = prev->next; + } + + free(obj->foot); + obj->foot = prev; + obj->foot->next = NULL; + } + + obj->size--; + return target; +} + +int myStackTop(MyStack* obj) { + return obj->foot->val; +} + +bool myStackEmpty(MyStack* obj) { + return obj->size == 0; +} + +void myStackFree(MyStack* obj) { + Node_t *curr = obj->head; + while (curr != NULL) { + Node_t *temp = curr->next; + free(curr); + curr = temp; + } + free(obj); +} + +``` +

From d66e733d6c66b37baec8acd0d42f8161a07bf8fc Mon Sep 17 00:00:00 2001 From: C_W Date: Thu, 12 Dec 2024 22:33:13 +1100 Subject: [PATCH 2969/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200150.=E9=80=86?= =?UTF-8?q?=E6=B3=A2=E5=85=B0=E8=A1=A8=E8=BE=BE=E5=BC=8F=E6=B1=82=E5=80=BC?= =?UTF-8?q?.md=20C=20=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...76\345\274\217\346\261\202\345\200\274.md" | 61 +++++++++++++++++++ 1 file changed, 61 insertions(+) diff --git "a/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" "b/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" index 7d4031d7da..0f1e9c23ef 100644 --- "a/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" +++ "b/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" @@ -502,6 +502,67 @@ impl Solution { } ``` +### C: + +```c +int str_to_int(char *str) { + // string转integer + int num = 0, tens = 1; + for (int i = strlen(str) - 1; i >= 0; i--) { + if (str[i] == '-') { + num *= -1; + break; + } + num += (str[i] - '0') * tens; + tens *= 10; + } + return num; +} + +int evalRPN(char** tokens, int tokensSize) { + + int *stack = (int *)malloc(tokensSize * sizeof(int)); + assert(stack); + int stackTop = 0; + + for (int i = 0; i < tokensSize; i++) { + char symbol = (tokens[i])[0]; + if (symbol < '0' && (tokens[i])[1] == '\0') { + + // pop两个数字 + int num1 = stack[--stackTop]; + int num2 = stack[--stackTop]; + + // 计算结果 + int result; + if (symbol == '+') { + result = num1 + num2; + } else if (symbol == '-') { + result = num2 - num1; + } else if (symbol == '/') { + result = num2 / num1; + } else { + result = num1 * num2; + } + + // push回stack + stack[stackTop++] = result; + + } else { + + // push数字进stack + int num = str_to_int(tokens[i]); + stack[stackTop++] = num; + + } + } + + int result = stack[0]; + free(stack); + return result; +} +``` +

From 739e3f891ce199d7258fa4a192b7fe3dd10a9251 Mon Sep 17 00:00:00 2001 From: C_W Date: Fri, 13 Dec 2024 11:43:42 +1100 Subject: [PATCH 2970/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200239.=E6=BB=91?= =?UTF-8?q?=E5=8A=A8=E7=AA=97=E5=8F=A3=E6=9C=80=E5=A4=A7=E5=80=BC.md=20C?= =?UTF-8?q?=20=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...43\346\234\200\345\244\247\345\200\274.md" | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git "a/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" "b/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" index caa24d8de3..9bb3494db4 100644 --- "a/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" +++ "b/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" @@ -890,6 +890,38 @@ public: }; ``` +### C + +```c +int* maxSlidingWindow(int* nums, int numsSize, int k, int* returnSize) { + *returnSize = numsSize - k + 1; + int *res = (int*)malloc((*returnSize) * sizeof(int)); + assert(res); + int *deque = (int*)malloc(numsSize * sizeof(int)); + assert(deque); + int front = 0, rear = 0, idx = 0; + + for (int i = 0 ; i < numsSize ; i++) { + while (front < rear && deque[front] <= i - k) { + front++; + } + + while (front < rear && nums[deque[rear - 1]] <= nums[i]) { + rear--; + } + + deque[rear++] = i; + + if (i >= k - 1) { + res[idx++] = nums[deque[front]]; + } + } + + return res; +} + +``` +

From 3ce802897f9cf19ef158cb197f031c1cf3cb8baf Mon Sep 17 00:00:00 2001 From: Murphy Tian Date: Mon, 16 Dec 2024 15:38:43 +0800 Subject: [PATCH 2971/3019] [Fix][DP][Target Sum] python 2D version align with the dp equation --- .../0494.\347\233\256\346\240\207\345\222\214.md" | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git "a/problems/0494.\347\233\256\346\240\207\345\222\214.md" "b/problems/0494.\347\233\256\346\240\207\345\222\214.md" index dda3ad7528..eef5ceb616 100644 --- "a/problems/0494.\347\233\256\346\240\207\345\222\214.md" +++ "b/problems/0494.\347\233\256\346\240\207\345\222\214.md" @@ -671,18 +671,26 @@ class Solution: # 创建二维动态规划数组,行表示选取的元素数量,列表示累加和 dp = [[0] * (target_sum + 1) for _ in range(len(nums) + 1)] + dp = [[0] * (target_sum + 1) for _ in range(len(nums))] # 初始化状态 dp[0][0] = 1 + if nums[0] <= target_sum: + dp[0][nums[0]] = 1 + numZero = 0 + for i in range(len(nums)): + if nums[i] == 0: + numZero += 1 + dp[i][0] = int(math.pow(2, numZero)) # 动态规划过程 - for i in range(1, len(nums) + 1): + for i in range(1, len(nums)): for j in range(target_sum + 1): dp[i][j] = dp[i - 1][j] # 不选取当前元素 if j >= nums[i - 1]: - dp[i][j] += dp[i - 1][j - nums[i - 1]] # 选取当前元素 + dp[i][j] += dp[i - 1][j - nums[i]] # 选取当前元素 - return dp[len(nums)][target_sum] # 返回达到目标和的方案数 + return dp[len(nums)-1][target_sum] # 返回达到目标和的方案数 ``` From e93f00aef737dad56bf4656a02c17cb66e214fcc Mon Sep 17 00:00:00 2001 From: ForsakenDelusion <144082461+ForsakenDelusion@users.noreply.github.com> Date: Sat, 21 Dec 2024 18:06:53 +0800 Subject: [PATCH 2972/3019] =?UTF-8?q?0235.=E4=BA=8C=E5=8F=89=E6=90=9C?= =?UTF-8?q?=E7=B4=A2=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=E4=B8=80=E5=A4=84=E9=94=99=E5=88=AB=E5=AD=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" "b/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" index 192bb031dc..3911261a53 100644 --- "a/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" +++ "b/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" @@ -99,7 +99,7 @@ if (cur == NULL) return cur; * 确定单层递归的逻辑 -在遍历二叉搜索树的时候就是寻找区间[p->val, q->val](注意这里是左闭又闭) +在遍历二叉搜索树的时候就是寻找区间[p->val, q->val](注意这里是左闭右闭) 那么如果 cur->val 大于 p->val,同时 cur->val 大于q->val,那么就应该向左遍历(说明目标区间在左子树上)。 From 173ebe75726cf41260ccc8824c73fcb78dfdcd8f Mon Sep 17 00:00:00 2001 From: "Zhen (Evan) Wang" <273509239@qq.com> Date: Wed, 25 Dec 2024 11:14:51 +0800 Subject: [PATCH 2973/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B00059.=E8=9E=BA?= =?UTF-8?q?=E6=97=8B=E7=9F=A9=E9=98=B5II=E7=9A=84C#=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E4=BF=9D=E8=AF=81=E4=B8=8EC++=E7=89=88=E6=9C=AC=E7=9A=84?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E4=BF=9D=E6=8C=81=E4=B8=80=E8=87=B4=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\346\227\213\347\237\251\351\230\265II.md" | 75 ++++++++++++++----- 1 file changed, 57 insertions(+), 18 deletions(-) diff --git "a/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" "b/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" index c59ec0333f..94966126b9 100644 --- "a/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" +++ "b/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" @@ -715,26 +715,65 @@ object Solution { ### C#: ```csharp -public class Solution { - public int[][] GenerateMatrix(int n) { - int[][] answer = new int[n][]; - for(int i = 0; i < n; i++) - answer[i] = new int[n]; - int start = 0; - int end = n - 1; - int tmp = 1; - while(tmp < n * n) +public int[][] GenerateMatrix(int n) +{ + // 参考Carl的代码随想录里面C++的思路 + // https://www.programmercarl.com/0059.%E8%9E%BA%E6%97%8B%E7%9F%A9%E9%98%B5II.html#%E6%80%9D%E8%B7%AF + int startX = 0, startY = 0; // 定义每循环一个圈的起始位置 + int loop = n / 2; // 每个圈循环几次,例如n为奇数3,那么loop = 1 只是循环一圈,矩阵中间的值需要单独处理 + int count = 1; // 用来给矩阵每个空格赋值 + int mid = n / 2; // 矩阵中间的位置,例如:n为3, 中间的位置就是(1,1),n为5,中间位置为(2, 2) + int offset = 1;// 需要控制每一条边遍历的长度,每次循环右边界收缩一位 + + // 构建result二维数组 + int[][] result = new int[n][]; + for (int k = 0; k < n; k++) + { + result[k] = new int[n]; + } + + int i = 0, j = 0; // [i,j] + while (loop > 0) + { + i = startX; + j = startY; + // 四个For循环模拟转一圈 + // 第一排,从左往右遍历,不取最右侧的值(左闭右开) + for (; j < n - offset; j++) + { + result[i][j] = count++; + } + // 右侧的第一列,从上往下遍历,不取最下面的值(左闭右开) + for (; i < n - offset; i++) + { + result[i][j] = count++; + } + + // 最下面的第一行,从右往左遍历,不取最左侧的值(左闭右开) + for (; j > startY; j--) + { + result[i][j] = count++; + } + + // 左侧第一列,从下往上遍历,不取最左侧的值(左闭右开) + for (; i > startX; i--) { - for(int i = start; i < end; i++) answer[start][i] = tmp++; - for(int i = start; i < end; i++) answer[i][end] = tmp++; - for(int i = end; i > start; i--) answer[end][i] = tmp++; - for(int i = end; i > start; i--) answer[i][start] = tmp++; - start++; - end--; - } - if(n % 2 == 1) answer[n / 2][n / 2] = tmp; - return answer; + result[i][j] = count++; + } + // 第二圈开始的时候,起始位置要各自加1, 例如:第一圈起始位置是(0, 0),第二圈起始位置是(1, 1) + startX++; + startY++; + + // offset 控制每一圈里每一条边遍历的长度 + offset++; + loop--; + } + if (n % 2 == 1) + { + // n 为奇数 + result[mid][mid] = count; } + return result; } ``` From 7a1d070c257c16bf01aaf4b95bded65393bc3286 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A8=8B=E5=AE=A3=E9=AD=81?= <13963268+cheng-xuankui@user.noreply.gitee.com> Date: Thu, 26 Dec 2024 20:49:16 +0800 Subject: [PATCH 2974/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A019.=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,=E6=B7=BB=E5=8A=A0=E4=BA=86java?= =?UTF-8?q?=E6=96=B9=E6=B3=95=E4=BD=BF=E7=94=A8=E9=80=92=E5=BD=92=E7=9A=84?= =?UTF-8?q?=E6=96=B9=E6=B3=95=E5=88=A0=E9=99=A4=E5=80=92=E6=95=B0=E7=AC=AC?= =?UTF-8?q?N=E4=B8=AA=E8=8A=82=E7=82=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...4N\344\270\252\350\212\202\347\202\271.md" | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git "a/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" "b/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" index fafef1f2d5..16312d0fc4 100644 --- "a/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" +++ "b/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" @@ -129,6 +129,36 @@ class Solution { } ``` + +```java +class Solution { + public ListNode removeNthFromEnd(ListNode head, int n) { + // 创建一个新的哑节点,指向原链表头 + ListNode s = new ListNode(-1, head); + // 递归调用remove方法,从哑节点开始进行删除操作 + remove(s, n); + // 返回新链表的头(去掉可能的哑节点) + return s.next; + } + + public int remove(ListNode p, int n) { + // 递归结束条件:如果当前节点为空,返回0 + if (p == null) { + return 0; + } + // 递归深入到下一个节点 + int net = remove(p.next, n); + // 如果当前节点是倒数第n个节点,进行删除操作 + if (net == n) { + p.next = p.next.next; + } + // 返回当前节点的总深度 + return net + 1; + } +} +``` + + ### Python: ```python From 0fa443ce1a234704898630c188640f4512e9f7d1 Mon Sep 17 00:00:00 2001 From: Yuan Yuan Date: Thu, 26 Dec 2024 14:03:38 -0600 Subject: [PATCH 2975/3019] =?UTF-8?q?fix:=20150=E9=A2=98=E6=9B=B4=E6=AD=A3?= =?UTF-8?q?Python=E8=A7=A3=E6=B3=95=E4=B8=AD=E4=BD=BF=E7=94=A8eval()?= =?UTF-8?q?=E7=9A=84=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 此处原本提供的两个python解法是一样的,并无区别;更正为实际上真正使用eval()的方法。 --- ...76\345\274\217\346\261\202\345\200\274.md" | 32 ++++++------------- 1 file changed, 9 insertions(+), 23 deletions(-) diff --git "a/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" "b/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" index 7d4031d7da..4ffe950b5b 100644 --- "a/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" +++ "b/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" @@ -188,34 +188,20 @@ class Solution(object): return stack.pop() ``` -另一种可行,但因为使用eval相对较慢的方法: +另一种可行,但因为使用eval()相对较慢的方法: ```python -from operator import add, sub, mul - -def div(x, y): - # 使用整数除法的向零取整方式 - return int(x / y) if x * y > 0 else -(abs(x) // abs(y)) - class Solution(object): - op_map = {'+': add, '-': sub, '*': mul, '/': div} - - def evalRPN(self, tokens): - """ - :type tokens: List[str] - :rtype: int - """ + def evalRPN(self, tokens: List[str]) -> int: stack = [] for token in tokens: - if token in self.op_map: - op1 = stack.pop() - op2 = stack.pop() - operation = self.op_map[token] - stack.append(operation(op2, op1)) + # 判断是否为数字,因为isdigit()不识别负数,故需要排除第一位的符号 + if token.isdigit() or (len(token)>1 and token[1].isdigit()): + stack.append(token) else: - stack.append(int(token)) - return stack.pop() - - + op2 = stack.pop() + op1 = stack.pop() + stack.append(str(int(eval(op1 + token + op2)))) + return int(stack.pop()) ``` ### Go: From 0638ba5ad88909b1463ccb43f55cb06f9bc88d09 Mon Sep 17 00:00:00 2001 From: Yuan Yuan Date: Thu, 26 Dec 2024 14:09:06 -0600 Subject: [PATCH 2976/3019] =?UTF-8?q?docs:=20150=E9=A2=98=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...0\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" | 1 + 1 file changed, 1 insertion(+) diff --git "a/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" "b/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" index 4ffe950b5b..5fb28c29d4 100644 --- "a/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" +++ "b/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" @@ -200,6 +200,7 @@ class Solution(object): else: op2 = stack.pop() op1 = stack.pop() + # 由题意"The division always truncates toward zero",所以使用int()可以天然取整 stack.append(str(int(eval(op1 + token + op2)))) return int(stack.pop()) ``` From 5da4a7ec0edb78b465f3f00fd4ef4412bb9d5b63 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=A1=9C=E5=B0=8F=E8=B7=AF=E4=B8=83=E8=91=89?= Date: Fri, 27 Dec 2024 14:48:22 +0800 Subject: [PATCH 2977/3019] =?UTF-8?q?docs=EF=BC=9A=E8=A1=A5=E5=85=85?= =?UTF-8?q?=E3=80=900459.=E9=87=8D=E5=A4=8D=E7=9A=84=E5=AD=90=E5=AD=97?= =?UTF-8?q?=E7=AC=A6=E4=B8=B2.md=E3=80=91=E7=9A=84=20JavaScript=20?= =?UTF-8?q?=E3=80=81C#=20=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...20\345\255\227\347\254\246\344\270\262.md" | 34 ++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git "a/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" "b/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" index 2be8922b9d..1820056245 100644 --- "a/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" @@ -648,6 +648,29 @@ var repeatedSubstringPattern = function (s) { }; ``` +> 正则匹配 +```javascript +/** + * @param {string} s + * @return {boolean} + */ +var repeatedSubstringPattern = function(s) { + let reg = /^(\w+)\1+$/ + return reg.test(s) +}; +``` +> 移动匹配 +```javascript +/** + * @param {string} s + * @return {boolean} + */ +var repeatedSubstringPattern = function (s) { + let ss = s + s; + return ss.substring(1, ss.length - 1).includes(s); +}; +``` + ### TypeScript: > 前缀表统一减一 @@ -853,8 +876,10 @@ impl Solution { } ``` ### C# + +> 前缀表不减一 + ```csharp -// 前缀表不减一 public bool RepeatedSubstringPattern(string s) { if (s.Length == 0) @@ -879,6 +904,13 @@ public int[] GetNext(string s) } ``` +> 移动匹配 +```csharp +public bool RepeatedSubstringPattern(string s) { + string ss = (s + s).Substring(1, (s + s).Length - 2); + return ss.Contains(s); +} +```

From aa2450222d48ae248a31b15bbcab6484a5fc3967 Mon Sep 17 00:00:00 2001 From: 1ltwo Date: Fri, 3 Jan 2025 10:11:06 +0800 Subject: [PATCH 2978/3019] =?UTF-8?q?go=E7=89=88=E6=9C=AC=E6=96=B0?= =?UTF-8?q?=E8=A7=A3=E6=B3=95=EF=BC=9A=E5=8F=8C=E6=8C=87=E9=92=88=E9=80=86?= =?UTF-8?q?=E5=BA=8F=E9=81=8D=E5=8E=86=EF=BC=8C=E6=97=B6=E9=97=B4=E5=A4=8D?= =?UTF-8?q?=E6=9D=82=E5=BA=A6O(n)=EF=BC=8C=E7=A9=BA=E9=97=B4=E5=A4=8D?= =?UTF-8?q?=E6=9D=82=E5=BA=A6O(n)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...14\347\232\204\345\215\225\350\257\215.md" | 41 ++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git "a/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" "b/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" index 7c0b7cb182..3dbd59b916 100644 --- "a/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" +++ "b/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" @@ -639,7 +639,46 @@ func reverse(b []byte) { } } ``` - +```go +//双指针解法。指针逆序遍历,将遍历后得到的单词(间隔为空格,用以区分)顺序放置在额外空间 +//时间复杂度O(n),空间复杂度O(n) +func reverseWords(s string) string { + strBytes := []byte(s) + n := len(strBytes) + // 记录有效字符范围的起始和结束位置 + start, end := 0, n-1 + // 去除开头空格 + for start < n && strBytes[start] == 32 { + start++ + } + // 处理全是空格或空字符串情况 + if start == n { + return "" + } + // 去除结尾空格 + for end >= 0 && strBytes[end] == 32 { + end-- + } + // 结果切片,预分配容量 + res := make([]byte, 0, end-start+1)//这里挺重要的,本人之前没有预分配容量,每次循环都添加单词,导致内存超限(也可能就是我之前的思路有问题) + // 从后往前遍历有效字符范围 + for i := end; i >= start; { + // 找单词起始位置,直接通过循环条件判断定位 + for ; i >= start && strBytes[i] == 32; i-- { + } + j := i + for ; j >= start && strBytes[j]!= 32; j-- { + } + res = append(res, strBytes[j+1:i+1]...) + // 只在不是最后一个单词时添加空格 + if j > start { + res = append(res, 32) + } + i = j + } + return string(res) +} +``` ### JavaScript: From 4e77de7fc55231493ef96d54a4d6ad88ed7120a0 Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Fri, 3 Jan 2025 15:21:58 +0800 Subject: [PATCH 2979/3019] =?UTF-8?q?=E9=87=8D=E5=86=99=E9=9B=B6=E9=92=B1?= =?UTF-8?q?=E5=85=91=E6=8D=A2II=EF=BC=8C=E4=BB=8E=E4=BA=8C=E7=BB=B4?= =?UTF-8?q?=E8=A7=92=E5=BA=A6=E5=88=86=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\351\222\261\345\205\221\346\215\242II.md" | 239 ++++++++++++++++-- 1 file changed, 211 insertions(+), 28 deletions(-) diff --git "a/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" "b/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" index 7023121292..2c82027fd6 100644 --- "a/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" +++ "b/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" @@ -4,8 +4,6 @@

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

- - # 518.零钱兑换II [力扣题目链接](https://leetcode.cn/problems/coin-change-ii/) @@ -45,15 +43,19 @@ **[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[装满背包有多少种方法?组合与排列有讲究!| LeetCode:518.零钱兑换II](https://www.bilibili.com/video/BV1KM411k75j/),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 +## 二维dp讲解 +如果大家认真做完:[分割等和子集](https://www.programmercarl.com/0416.%E5%88%86%E5%89%B2%E7%AD%89%E5%92%8C%E5%AD%90%E9%9B%86.html) , [最后一块石头的重量II](https://www.programmercarl.com/1049.%E6%9C%80%E5%90%8E%E4%B8%80%E5%9D%97%E7%9F%B3%E5%A4%B4%E7%9A%84%E9%87%8D%E9%87%8FII.html) 和 [目标和](https://www.programmercarl.com/0494.%E7%9B%AE%E6%A0%87%E5%92%8C.html) +应该会知道类似这种题目:给出一个总数,一些物品,问能否凑成这个总数。 -## 思路 +这是典型的背包问题! -这是一道典型的背包问题,一看到钱币数量不限,就知道这是一个完全背包。 +本题求的是装满这个背包的物品组合数是多少。 +因为每一种面额的硬币有无限个,所以这是完全背包。 -对完全背包还不了解的同学,可以看这篇:[动态规划:关于完全背包,你该了解这些!](https://programmercarl.com/背包问题理论基础完全背包.html) +对完全背包还不了解的同学,可以看这篇:[完全背包理论基础](https://programmercarl.com/背包问题理论基础完全背包.html) 但本题和纯完全背包不一样,**纯完全背包是凑成背包最大价值是多少,而本题是要求凑成总金额的物品组合个数!** @@ -69,44 +71,182 @@ 如果问的是排列数,那么上面就是两种排列了。 -**组合不强调元素之间的顺序,排列强调元素之间的顺序**。 其实这一点我们在讲解回溯算法专题的时候就讲过了哈。 +**组合不强调元素之间的顺序,排列强调元素之间的顺序**。 其实这一点我们在讲解回溯算法专题的时候就讲过。 那我为什么要介绍这些呢,因为这和下文讲解遍历顺序息息相关! -回归本题,动规五步曲来分析如下: +本题其实与我们讲过 [494. 目标和](https://programmercarl.com/0494.目标和.html) 十分类似。 -1. 确定dp数组以及下标的含义 +[494. 目标和](https://programmercarl.com/0494.目标和.html) 求的是装满背包有多少种方法,而本题是求装满背包有多少种组合。 -dp[j]:凑成总金额j的货币组合数为dp[j] +这有啥区别? -2. 确定递推公式 +**求装满背包有几种方法其实就是求组合数**。 不过 [494. 目标和](https://programmercarl.com/0494.目标和.html) 是 01背包,即每一类物品只有一个。 -dp[j] 就是所有的dp[j - coins[i]](考虑coins[i]的情况)相加。 +以下动规五部曲: -所以递推公式:dp[j] += dp[j - coins[i]]; +### 1、确定dp数组以及下标的含义 -**这个递推公式大家应该不陌生了,我在讲解01背包题目的时候在这篇[494. 目标和](https://programmercarl.com/0494.目标和.html)中就讲解了,求装满背包有几种方法,公式都是:dp[j] += dp[j - nums[i]];** +定义二维dp数值 dp[i][j]:使用 下标为[0, i]的coins[i]能够凑满j(包括j)这么大容量的包,有dp[i][j]种组合方法。 -3. dp数组如何初始化 +很多录友也会疑惑,凭什么上来就定义 dp数组,思考过程是什么样的, 这个思考过程我在 [01背包理论基础(二维数组)](https://programmercarl.com/背包理论基础01背包-1.html) 中的 “确定dp数组以及下标的含义” 有详细讲解。 -首先dp[0]一定要为1,dp[0] = 1是 递归公式的基础。如果dp[0] = 0 的话,后面所有推导出来的值都是0了。 +(**强烈建议按照代码随想录的顺序学习,否则可能看不懂我的讲解**) -那么 dp[0] = 1 有没有含义,其实既可以说 凑成总金额0的货币组合数为1,也可以说 凑成总金额0的货币组合数为0,好像都没有毛病。 -但题目描述中,也没明确说 amount = 0 的情况,结果应该是多少。 +### 2、确定递推公式 -这里我认为题目描述还是要说明一下,因为后台测试数据是默认,amount = 0 的情况,组合数为1的。 +> **注意**: 这里的公式推导,与之前讲解过的 [494. 目标和](https://programmercarl.com/0494.目标和.html) 、[完全背包理论基础](https://programmercarl.com/背包问题理论基础完全背包.html) 有极大重复,所以我不在重复讲解原理,而是只讲解区别。 -下标非0的dp[j]初始化为0,这样累计加dp[j - coins[i]]的时候才不会影响真正的dp[j] +我们再回顾一下,[01背包理论基础](https://programmercarl.com/背包理论基础01背包-1.html),中二维DP数组的递推公式为: -dp[0]=1还说明了一种情况:如果正好选了coins[i]后,也就是j-coins[i] == 0的情况表示这个硬币刚好能选,此时dp[0]为1表示只选coins[i]存在这样的一种选法。 +`dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i])` -4. 确定遍历顺序 +在 [完全背包理论基础](https://programmercarl.com/背包问题理论基础完全背包.html) 详细讲解了完全背包二维DP数组的递推公式为: -本题中我们是外层for循环遍历物品(钱币),内层for遍历背包(金钱总额),还是外层for遍历背包(金钱总额),内层for循环遍历物品(钱币)呢? +`dp[i][j] = max(dp[i - 1][j], dp[i][j - weight[i]] + value[i])` + + +看去完全背包 和 01背包的差别在哪里? + +在于01背包是 `dp[i - 1][j - weight[i]] + value[i]` ,完全背包是 `dp[i][j - weight[i]] + value[i])` + +主要原因就是 完全背包单类物品有无限个。 + +具体原因我在 [完全背包理论基础(二维)](https://programmercarl.com/背包问题理论基础完全背包.html) 的 「确定递推公式」有详细讲解,如果大家忘了,再回顾一下。 + +我上面有说过,本题和 [494. 目标和](https://programmercarl.com/0494.目标和.html) 是一样的,唯一区别就是 [494. 目标和](https://programmercarl.com/0494.目标和.html) 是 01背包,本题是完全背包。 + + +在[494. 目标和](https://programmercarl.com/0494.目标和.html)中详解讲解了装满背包有几种方法,二维DP数组的递推公式: +`dp[i][j] = dp[i - 1][j] + dp[i - 1][j - nums[i]]` + +所以本题递推公式:`dp[i][j] = dp[i - 1][j] + dp[i][j - nums[i]]` ,区别依然是 ` dp[i - 1][j - nums[i]]` 和 `dp[i][j - nums[i]]` + +这个 ‘所以’ 我省略了很多推导的内容,因为这些内容在 [494. 目标和](https://programmercarl.com/0494.目标和.html) 和 [完全背包理论基础](https://programmercarl.com/背包问题理论基础完全背包.html) 都详细讲过。 + +这里不再重复讲解。 + +大家主要疑惑点 + +1、 `dp[i][j] = dp[i - 1][j] + dp[i][j - nums[i]]` 这个递归公式框架怎么来的,在 [494. 目标和](https://programmercarl.com/0494.目标和.html) 有详细讲解。 + +2、为什么是 ` dp[i][j - nums[i]]` 而不是 ` dp[i - 1][j - nums[i]]` ,在[完全背包理论基础(二维)](https://programmercarl.com/背包问题理论基础完全背包.html) 有详细讲解 + + +### 3. dp数组如何初始化 + +那么二维数组的最上行 和 最左列一定要初始化,这是递推公式推导的基础,如图红色部分: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240827103507.png) + + +这里首先要关注的就是 dp[0][0] 应该是多少? + +背包空间为0,装满「物品0」 的组合数有多少呢? + +应该是 0 个, 但如果 「物品0」 的 数值就是0呢? 岂不是可以有无限个0 组合 和为0! + +题目描述中说了`1 <= coins.length <= 300` ,所以不用考虑 物品数值为0的情况。 + +那么最上行dp[0][j] 如何初始化呢? + +dp[0][j]的含义:用「物品0」(即coins[0]) 装满 背包容量为j的背包,有几种组合方法。 (如果看不懂dp数组的含义,建议先学习[494. 目标和](https://programmercarl.com/0494.目标和.html)) + +如果 j 可以整除 物品0,那么装满背包就有1种组合方法。 + +初始化代码: + +```CPP +for (int j = 0; j <= bagSize; j++) { + if (j % coins[0] == 0) dp[0][j] = 1; +} +``` + +最左列如何初始化呢? + +dp[i][0] 的含义:用物品i(即coins[i]) 装满容量为0的背包 有几种组合方法。 + +都有一种方法,即不装。 + +所以 dp[i][0] 都初始化为1 + +### 4. 确定遍历顺序 + +二维DP数组的完全背包的两个for循环先后顺序是无所谓的。 + +先遍历背包,还是先遍历物品都是可以的。 + +原理和 [01背包理论基础(二维数组)](https://programmercarl.com/背包理论基础01背包-1.html) 中的 「遍历顺序」是一样的,都是因为 两个for循环的先后顺序不影响 递推公式 所需要的数值。 + +具体分析过程看 [01背包理论基础(二维数组)](https://programmercarl.com/背包理论基础01背包-1.html) 中的 「遍历顺序」 + +### 5. 打印DP数组 + +以amount为5,coins为:[2,3,5] 为例: + +dp数组应该是这样的: + +``` +1 0 1 0 1 0 +1 0 1 1 1 1 +1 0 1 1 1 2 +``` + +### 代码实现: + +```CPP +class Solution { +public: + int change(int amount, vector& coins) { + int bagSize = amount; + + vector> dp(coins.size(), vector(bagSize + 1, 0)); + + // 初始化最上行 + for (int j = 0; j <= bagSize; j++) { + if (j % coins[0] == 0) dp[0][j] = 1; + } + // 初始化最左列 + for (int i = 0; i < coins.size(); i++) { + dp[i][0] = 1; + } + // 以下遍历顺序行列可以颠倒 + for (int i = 1; i < coins.size(); i++) { // 行,遍历物品 + for (int j = 0; j <= bagSize; j++) { // 列,遍历背包 + if (coins[i] > j) dp[i][j] = dp[i - 1][j]; + else dp[i][j] = dp[i - 1][j] + dp[i][j - coins[i]]; + } + } + return dp[coins.size() - 1][bagSize]; + } +}; +``` + +## 一维dp讲解 + +### 1、确定dp数组以及下标的含义 + +dp[j]:凑成总金额j的货币组合数为dp[j] + +### 2、确定递推公式 + +本题 二维dp 递推公式: `dp[i][j] = dp[i - 1][j] + dp[i][j - coins[i]]` + +压缩成一维:`dp[j] += dp[j - coins[i]]` + +这个递推公式大家应该不陌生了,我在讲解01背包题目的时候在这篇[494. 目标和](https://programmercarl.com/0494.目标和.html)中就讲解了,求装满背包有几种方法,公式都是:`dp[j] += dp[j - nums[i]]` + +### 3. dp数组如何初始化 + +装满背包容量为0 的方法是1,即不放任何物品,`dp[0] = 1` + +### 4. 确定遍历顺序 -我在[动态规划:关于完全背包,你该了解这些!](https://programmercarl.com/背包问题理论基础完全背包.html)中讲解了完全背包的两个for循环的先后顺序都是可以的。 +本题中我们是外层for循环遍历物品(钱币),内层for遍历背包(金钱总额),还是外层for遍历背包(金钱总额),内层for循环遍历物品(钱币)呢? + +我在[完全背包(一维DP)](./背包问题完全背包一维.md)中讲解了完全背包的两个for循环的先后顺序都是可以的。 **但本题就不行了!** @@ -116,7 +256,7 @@ dp[0]=1还说明了一种情况:如果正好选了coins[i]后,也就是j-coi 所以纯完全背包是能凑成总和就行,不用管怎么凑的。 -本题是求凑出来的方案个数,且每个方案个数是为组合数。 +本题是求凑出来的方案个数,且每个方案个数是组合数。 那么本题,两个for循环的先后顺序可就有说法了。 @@ -154,7 +294,7 @@ for (int j = 0; j <= amount; j++) { // 遍历背包容量 可能这里很多同学还不是很理解,**建议动手把这两种方案的dp数组数值变化打印出来,对比看一看!(实践出真知)** -5. 举例推导dp数组 +### 5. 举例推导dp数组 输入: amount = 5, coins = [1, 2, 5] ,dp状态图如下: @@ -208,7 +348,17 @@ public: ## 总结 -本题的递推公式,其实我们在[494. 目标和](https://programmercarl.com/0494.目标和.html)中就已经讲过了,**而难点在于遍历顺序!** +本题我们从 二维 分析到 一维。 + +大家在刚开始学习的时候,从二维开始学习 容易理解。 + +之后,推荐大家直接掌握一维的写法,熟练后更容易写出来。 + +本题中,二维dp主要是就要 想清楚和我们之前讲解的 [01背包理论基础](https://programmercarl.com/背包理论基础01背包-1.html)、[494. 目标和](https://programmercarl.com/0494.目标和.html)、 [完全背包理论基础](https://programmercarl.com/背包问题理论基础完全背包.html) 联系与区别。 + +这也是代码随想录安排刷题顺序的精髓所在。 + +本题的一维dp中,难点在于理解便利顺序。 在求装满背包有几种方案的时候,认清遍历顺序是非常关键的。 @@ -216,8 +366,7 @@ public: **如果求排列数就是外层for遍历背包,内层for循环遍历物品**。 -可能说到排列数录友们已经有点懵了,后面Carl还会安排求排列数的题目,到时候在对比一下,大家就会发现神奇所在! - +可能说到排列数录友们已经有点懵了,后面我还会安排求排列数的题目,到时候在对比一下,大家就会发现神奇所在! ## 其他语言版本 @@ -444,3 +593,37 @@ public class Solution + +---------- + + + +回归本题,动规五步曲来分析如下: + +1. 确定dp数组以及下标的含义 + +dp[j]:凑成总金额j的货币组合数为dp[j] + +2. 确定递推公式 + +dp[j] 就是所有的dp[j - coins[i]](考虑coins[i]的情况)相加。 + +所以递推公式:dp[j] += dp[j - coins[i]]; + +**这个递推公式大家应该不陌生了,我在讲解01背包题目的时候在这篇[494. 目标和](https://programmercarl.com/0494.目标和.html)中就讲解了,求装满背包有几种方法,公式都是:dp[j] += dp[j - nums[i]];** + +3. dp数组如何初始化 + +首先dp[0]一定要为1,dp[0] = 1是 递归公式的基础。如果dp[0] = 0 的话,后面所有推导出来的值都是0了。 + +那么 dp[0] = 1 有没有含义,其实既可以说 凑成总金额0的货币组合数为1,也可以说 凑成总金额0的货币组合数为0,好像都没有毛病。 + +但题目描述中,也没明确说 amount = 0 的情况,结果应该是多少。 + +这里我认为题目描述还是要说明一下,因为后台测试数据是默认,amount = 0 的情况,组合数为1的。 + +下标非0的dp[j]初始化为0,这样累计加dp[j - coins[i]]的时候才不会影响真正的dp[j] + +dp[0]=1还说明了一种情况:如果正好选了coins[i]后,也就是j-coins[i] == 0的情况表示这个硬币刚好能选,此时dp[0]为1表示只选coins[i]存在这样的一种选法。 + +---------------- From aa6d892eaa9143312d8529d0b95ac7d418985c55 Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Fri, 3 Jan 2025 15:22:41 +0800 Subject: [PATCH 2980/3019] =?UTF-8?q?=E7=AC=94=E8=AF=AF=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" | 2 +- ...\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20210107\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20210107\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" index 4cab00ccbd..da2ebd3051 100644 --- "a/problems/\345\221\250\346\200\273\347\273\223/20210107\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" +++ "b/problems/\345\221\250\346\200\273\347\273\223/20210107\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" @@ -99,7 +99,7 @@ public: 这道绝佳的面试题我没有用过,如果录友们有面试别人的需求,就把这个套路拿去吧。 -我在[通过一道面试题目,讲一讲递归算法的时间复杂度!](https://programmercarl.com/前序/通过一道面试题目,讲一讲递归算法的时间复杂度!.html)中,以我自己面试别人的真实经历,通过求x的n次方 这么简单的题目,就可以考察候选人对算法性能以及递归的理解深度,录友们可以看看,绝对有收获! +我在[通过一道面试题目,讲一讲递归算法的时间复杂度!](../前序/递归算法的时间复杂度.md)中,以我自己面试别人的真实经历,通过求x的n次方 这么简单的题目,就可以考察候选人对算法性能以及递归的理解深度,录友们可以看看,绝对有收获! ## 周四 diff --git "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" index 1e270555d1..0cc6e91592 100644 --- "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" +++ "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" @@ -95,7 +95,7 @@ * **放物品i**:背包空出物品i的容量后,背包容量为j - weight[i],dp[i][j - weight[i]] 为背包容量为j - weight[i]且不放物品i的最大价值,那么dp[i][j - weight[i]] + value[i] (物品i的价值),就是背包放物品i得到的最大价值 -递归公式: `dp[i][j] = max(dp[i - 1][j], dp[i][j - weight[i]] + value[i]);` +递推公式: `dp[i][j] = max(dp[i - 1][j], dp[i][j - weight[i]] + value[i]);` (注意,完全背包二维dp数组 和 01背包二维dp数组 递推公式的区别,01背包中是 `dp[i - 1][j - weight[i]] + value[i])`) From b72609d65ed2c41212ba39bba57f21615be6077e Mon Sep 17 00:00:00 2001 From: Jian Date: Sat, 4 Jan 2025 01:59:28 +0800 Subject: [PATCH 2981/3019] =?UTF-8?q?0018=E5=9B=9B=E6=95=B0=E4=B9=8B?= =?UTF-8?q?=E5=92=8C=20=E4=BF=AE=E6=94=B9=E6=80=9D=E8=B7=AF=E7=AC=AC?= =?UTF-8?q?=E4=BA=8C=E6=AE=B5=E6=9C=AB=E5=B0=BE=E6=8F=8F=E8=BF=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git "a/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" "b/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" index 64923e41fc..fb8557fab9 100644 --- "a/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" @@ -35,7 +35,7 @@ 四数之和,和[15.三数之和](https://programmercarl.com/0015.三数之和.html)是一个思路,都是使用双指针法, 基本解法就是在[15.三数之和](https://programmercarl.com/0015.三数之和.html) 的基础上再套一层for循环。 -但是有一些细节需要注意,例如: 不要判断`nums[k] > target` 就返回了,三数之和 可以通过 `nums[i] > 0` 就返回了,因为 0 已经是确定的数了,四数之和这道题目 target是任意值。比如:数组是`[-4, -3, -2, -1]`,`target`是`-10`,不能因为`-4 > -10`而跳过。但是我们依旧可以去做剪枝,逻辑变成`nums[i] > target && (nums[i] >=0 || target >= 0)`就可以了。 +但是有一些细节需要注意,例如: 不要判断`nums[k] > target` 就返回了,三数之和 可以通过 `nums[i] > 0` 就返回了,因为 0 已经是确定的数了,四数之和这道题目 target是任意值。比如:数组是`[-4, -3, -2, -1]`,`target`是`-10`,不能因为`-4 > -10`而跳过。但是我们依旧可以去做剪枝,逻辑变成`nums[k] > target && (nums[k] >=0 || target >= 0)`就可以了。 [15.三数之和](https://programmercarl.com/0015.三数之和.html)的双指针解法是一层for循环num[i]为确定值,然后循环内有left和right下标作为双指针,找到nums[i] + nums[left] + nums[right] == 0。 @@ -802,3 +802,4 @@ end + From 69bee02cf12f11cf33fbc1f86b6ae2132dde1afb Mon Sep 17 00:00:00 2001 From: aPurpleBerry <2454196228@qq.com> Date: Sun, 5 Jan 2025 15:57:57 +0800 Subject: [PATCH 2982/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20=E8=83=8C?= =?UTF-8?q?=E5=8C=85=E9=97=AE=E9=A2=98=E7=90=86=E8=AE=BA=E5=9F=BA=E7=A1=80?= =?UTF-8?q?=E5=AE=8C=E5=85=A8=E8=83=8C=E5=8C=85.md=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 --- ...14\345\205\250\350\203\214\345\214\205.md" | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" index 0cc6e91592..ea658f7e51 100644 --- "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" +++ "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" @@ -316,7 +316,51 @@ print(knapsack(n, bag_weight, weight, value)) ### JavaScript +```js +const readline = require('readline').createInterface({ + input: process.stdin, + output: process.stdout +}); + +let input = []; +readline.on('line', (line) => { + input.push(line.trim()); +}); + +readline.on('close', () => { + // 第一行解析 n 和 v + const [n, bagweight] = input[0].split(' ').map(Number); + + /// 剩余 n 行解析重量和价值 + const weight = []; + const value = []; + for (let i = 1; i <= n; i++) { + const [wi, vi] = input[i].split(' ').map(Number); + weight.push(wi); + value.push(vi); + } + + + let dp = Array.from({ length: n }, () => Array(bagweight + 1).fill(0)); + + for (let j = weight[0]; j <= bagweight; j++) { + dp[0][j] = dp[0][j-weight[0]] + value[0]; + } + + for (let i = 1; i < n; i++) { + for (let j = 0; j <= bagweight; j++) { + if (j < weight[i]) { + dp[i][j] = dp[i - 1][j]; + } else { + dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - weight[i]] + value[i]); + } + } + } + console.log(dp[n - 1][bagweight]); +}); + +```

From ba5e1b443f8c5b80ccf5f7a34d3ee2b89cd34d47 Mon Sep 17 00:00:00 2001 From: 1ltwo Date: Tue, 7 Jan 2025 22:30:25 +0800 Subject: [PATCH 2983/3019] =?UTF-8?q?go=E7=89=88=E6=9C=AC=E8=A7=A3?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...55\344\271\260\345\234\237\345\234\260.md" | 86 +++++++++++++++++++ 1 file changed, 86 insertions(+) diff --git "a/problems/kamacoder/0044.\345\274\200\345\217\221\345\225\206\350\264\255\344\271\260\345\234\237\345\234\260.md" "b/problems/kamacoder/0044.\345\274\200\345\217\221\345\225\206\350\264\255\344\271\260\345\234\237\345\234\260.md" index 739e2cadcb..6ef46f2109 100644 --- "a/problems/kamacoder/0044.\345\274\200\345\217\221\345\225\206\350\264\255\344\271\260\345\234\237\345\234\260.md" +++ "b/problems/kamacoder/0044.\345\274\200\345\217\221\345\225\206\350\264\255\344\271\260\345\234\237\345\234\260.md" @@ -526,3 +526,89 @@ int main() } ``` + +### Go + +前缀和 + +```go +package main + +import ( + "fmt" + "os" + "bufio" + "strings" + "strconv" + "math" +) + +func main() { + var n, m int + + reader := bufio.NewReader(os.Stdin) + + line, _ := reader.ReadString('\n') + line = strings.TrimSpace(line) + params := strings.Split(line, " ") + + n, _ = strconv.Atoi(params[0]) + m, _ = strconv.Atoi(params[1])//n和m读取完成 + + land := make([][]int, n)//土地矩阵初始化 + + for i := 0; i < n; i++ { + line, _ := reader.ReadString('\n') + line = strings.TrimSpace(line) + values := strings.Split(line, " ") + land[i] = make([]int, m) + for j := 0; j < m; j++ { + value, _ := strconv.Atoi(values[j]) + land[i][j] = value + } + }//所有读取完成 + + //初始化前缀和矩阵 + preMatrix := make([][]int, n+1) + for i := 0; i <= n; i++ { + preMatrix[i] = make([]int, m+1) + } + + for a := 1; a < n+1; a++ { + for b := 1; b < m+1; b++ { + preMatrix[a][b] = land[a-1][b-1] + preMatrix[a-1][b] + preMatrix[a][b-1] - preMatrix[a-1][b-1] + } + } + + totalSum := preMatrix[n][m] + + minDiff := math.MaxInt32//初始化极大数,用于比较 + + //按行分割 + for i := 1; i < n; i++ { + topSum := preMatrix[i][m] + + bottomSum := totalSum - topSum + + diff := int(math.Abs(float64(topSum - bottomSum))) + if diff < minDiff { + minDiff = diff + } + } + + //按列分割 + for j := 1; j < m; j++ { + topSum := preMatrix[n][j] + + bottomSum := totalSum - topSum + + diff := int(math.Abs(float64(topSum - bottomSum))) + if diff < minDiff { + minDiff = diff + } + } + + fmt.Println(minDiff) +} +``` + From d5e0827abeabbcc97b341e99231966bfbafaf7cd Mon Sep 17 00:00:00 2001 From: Jian Date: Wed, 8 Jan 2025 01:04:07 +0800 Subject: [PATCH 2984/3019] =?UTF-8?q?0020=E6=9C=89=E6=95=88=E7=9A=84?= =?UTF-8?q?=E6=8B=AC=E5=8F=B7=20Java=E6=9B=B4=E7=AE=80=E5=8D=95=E6=98=93?= =?UTF-8?q?=E6=87=82=E7=9A=84=E6=96=B0=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...10\347\232\204\346\213\254\345\217\267.md" | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git "a/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" "b/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" index f2f5cdd13f..493e2871ae 100644 --- "a/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" +++ "b/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" @@ -172,6 +172,29 @@ class Solution { } ``` +```java +// 解法二 +// 对应的另一半一定在栈顶 +class Solution { + public boolean isValid(String s) { + Stack stack = new Stack<>(); + for(char c : s.toCharArray()){ + // 有对应的另一半就直接消消乐 + if(c == ')' && !stack.isEmpty() && stack.peek() == '(') + stack.pop(); + else if(c == '}' && !stack.isEmpty() && stack.peek() == '{') + stack.pop(); + else if(c == ']' && !stack.isEmpty() && stack.peek() == '[') + stack.pop(); + else + stack.push(c);// 没有匹配的就放进去 + } + + return stack.isEmpty(); + } +} +``` + ### Python: ```python From a7ad0cd812649e0cf1928d9c4e54bc4369588a19 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=98windscape=E2=80=99?= <2462269317@qq.com> Date: Sat, 11 Jan 2025 19:18:46 +0800 Subject: [PATCH 2985/3019] =?UTF-8?q?=E4=BF=AE=E6=94=B9leetcode-master\pro?= =?UTF-8?q?blems\kamacoder\0044.=E5=BC=80=E5=8F=91=E5=95=86=E8=B4=AD?= =?UTF-8?q?=E4=B9=B0=E5=9C=9F=E5=9C=B0.md=20Java=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...5\206\350\264\255\344\271\260\345\234\237\345\234\260.md" | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git "a/problems/kamacoder/0044.\345\274\200\345\217\221\345\225\206\350\264\255\344\271\260\345\234\237\345\234\260.md" "b/problems/kamacoder/0044.\345\274\200\345\217\221\345\225\206\350\264\255\344\271\260\345\234\237\345\234\260.md" index 739e2cadcb..efad56dac5 100644 --- "a/problems/kamacoder/0044.\345\274\200\345\217\221\345\225\206\350\264\255\344\271\260\345\234\237\345\234\260.md" +++ "b/problems/kamacoder/0044.\345\274\200\345\217\221\345\225\206\350\264\255\344\271\260\345\234\237\345\234\260.md" @@ -212,13 +212,14 @@ public class Main { int horizontalCut = 0; for (int i = 0; i < n; i++) { horizontalCut += horizontal[i]; - result = Math.min(result, Math.abs(sum - 2 * horizontalCut)); + result = Math.min(result, Math.abs((sum - horizontalCut) - horizontalCut)); + // 更新result。其中,horizontalCut表示前i行的和,sum - horizontalCut表示剩下的和,作差、取绝对值,得到题目需要的“A和B各自的子区域内的土地总价值之差”。下同。 } int verticalCut = 0; for (int j = 0; j < m; j++) { verticalCut += vertical[j]; - result = Math.min(result, Math.abs(sum - 2 * verticalCut)); + result = Math.min(result, Math.abs((sum - verticalCut) - verticalCut)); } System.out.println(result); From cb5b6e524197e1e2f66bcd3b157b37bfbc726803 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=98windscape=E2=80=99?= <2462269317@qq.com> Date: Sun, 12 Jan 2025 11:54:23 +0800 Subject: [PATCH 2986/3019] =?UTF-8?q?=E4=BF=AE=E6=94=B9leetcode-master\pro?= =?UTF-8?q?blems\0349.=E4=B8=A4=E4=B8=AA=E6=95=B0=E7=BB=84=E7=9A=84?= =?UTF-8?q?=E4=BA=A4=E9=9B=86.md=20Java=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...73\204\347\232\204\344\272\244\351\233\206.md" | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git "a/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" "b/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" index 77dfc50a61..93fa09318a 100644 --- "a/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" +++ "b/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" @@ -123,6 +123,9 @@ public: ### Java: 版本一:使用HashSet ```Java +// 时间复杂度O(n+m+k) 空间复杂度O(n+k) +// 其中n是数组nums1的长度,m是数组nums2的长度,k是交集元素的个数 + import java.util.HashSet; import java.util.Set; @@ -145,8 +148,15 @@ class Solution { } //方法1:将结果集合转为数组 - - return resSet.stream().mapToInt(x -> x).toArray(); + return res.stream().mapToInt(Integer::intValue).toArray(); + /** + * 将 Set 转换为 int[] 数组: + * 1. stream() : Collection 接口的方法,将集合转换为 Stream + * 2. mapToInt(Integer::intValue) : + * - 中间操作,将 Stream 转换为 IntStream + * - 使用方法引用 Integer::intValue,将 Integer 对象拆箱为 int 基本类型 + * 3. toArray() : 终端操作,将 IntStream 转换为 int[] 数组。 + */ //方法2:另外申请一个数组存放setRes中的元素,最后返回数组 int[] arr = new int[resSet.size()]; @@ -538,3 +548,4 @@ end + From 61c04cdc433050e09f8f67aeb1fc45454a7f1e99 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=98windscape=E2=80=99?= <2462269317@qq.com> Date: Mon, 13 Jan 2025 15:47:55 +0800 Subject: [PATCH 2987/3019] =?UTF-8?q?=E4=BF=AE=E6=94=B90383.=E8=B5=8E?= =?UTF-8?q?=E9=87=91=E4=BF=A1.md=E7=9A=84=E6=97=B6=E9=97=B4=E5=A4=8D?= =?UTF-8?q?=E6=9D=82=E5=BA=A6=E5=88=86=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "problems/0383.\350\265\216\351\207\221\344\277\241.md" | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git "a/problems/0383.\350\265\216\351\207\221\344\277\241.md" "b/problems/0383.\350\265\216\351\207\221\344\277\241.md" index eb83d3ece9..1d7391732f 100644 --- "a/problems/0383.\350\265\216\351\207\221\344\277\241.md" +++ "b/problems/0383.\350\265\216\351\207\221\344\277\241.md" @@ -104,7 +104,7 @@ public: }; ``` -* 时间复杂度: O(n) +* 时间复杂度: O(m+n),其中m表示ransomNote的长度,n表示magazine的长度 * 空间复杂度: O(1) @@ -470,3 +470,4 @@ bool canConstruct(char* ransomNote, char* magazine) { + From 13cb15cad6d548a99b4f4b427a3d57f91d5ce3b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=98windscape=E2=80=99?= <2462269317@qq.com> Date: Mon, 13 Jan 2025 16:33:28 +0800 Subject: [PATCH 2988/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A00018.=E5=9B=9B?= =?UTF-8?q?=E6=95=B0=E4=B9=8B=E5=92=8C.md=E7=9A=84Java=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E7=9A=84=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git "a/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" "b/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" index 64923e41fc..acf8263c09 100644 --- "a/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" @@ -253,7 +253,7 @@ public class Solution { for (int k = 0; k < nums.length; k++) { // 剪枝处理 if (nums[k] > target && nums[k] >= 0) { - break; + break; // 此处的break可以等价于return result; } // 对nums[k]去重 if (k > 0 && nums[k] == nums[k - 1]) { @@ -262,7 +262,7 @@ public class Solution { for (int i = k + 1; i < nums.length; i++) { // 第二级剪枝 if (nums[k] + nums[i] > target && nums[k] + nums[i] >= 0) { - break; + break; // 注意是break到上一级for循环,如果直接return result;会有遗漏 } // 对nums[i]去重 if (i > k + 1 && nums[i] == nums[i - 1]) { @@ -802,3 +802,4 @@ end + From 059b6464c0b8968bd139764988ecbc652eebdabe Mon Sep 17 00:00:00 2001 From: "Zhen (Evan) Wang" <273509239@qq.com> Date: Tue, 14 Jan 2025 10:36:56 +0800 Subject: [PATCH 2989/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200102.=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?--199.=E4=BA=8C=E5=8F=89=E6=A0=91=E7=9A=84=E5=8F=B3=E8=A7=86?= =?UTF-8?q?=E5=9B=BE=20=20C#=20=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 0102.二叉树的层序遍历中的199.二叉树的右视图 C# 代码 --- ...02\345\272\217\351\201\215\345\216\206.md" | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" index 98e1e98a6e..0c3b0f8c5e 100644 --- "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" +++ "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" @@ -1231,6 +1231,47 @@ impl Solution { } ``` +#### C#: + +```C# 199.二叉树的右视图 +public class Solution +{ + public IList RightSideView(TreeNode root) + { + var result = new List(); + Queue queue = new(); + + if (root != null) + { + queue.Enqueue(root); + } + while (queue.Count > 0) + { + int count = queue.Count; + int lastValue = count - 1; + for (int i = 0; i < count; i++) + { + var currentNode = queue.Dequeue(); + if (i == lastValue) + { + result.Add(currentNode.val); + } + + // lastValue == i == count -1 : left 先于 right 进入Queue + if (currentNode.left != null) queue.Enqueue(currentNode.left); + if (currentNode.right != null) queue.Enqueue(currentNode.right); + + //// lastValue == i == 0: right 先于 left 进入Queue + // if(currentNode.right !=null ) queue.Enqueue(currentNode.right); + // if(currentNode.left !=null ) queue.Enqueue(currentNode.left); + } + } + + return result; + } +} +``` + ## 637.二叉树的层平均值 [力扣题目链接](https://leetcode.cn/problems/average-of-levels-in-binary-tree/) From 2bcd88a096d694b295a855062339579458c0769f Mon Sep 17 00:00:00 2001 From: "Zhen (Evan) Wang" <273509239@qq.com> Date: Tue, 14 Jan 2025 11:18:41 +0800 Subject: [PATCH 2990/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200102.=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?-=20637.=E4=BA=8C=E5=8F=89=E6=A0=91=E7=9A=84=E5=B1=82=E5=B9=B3?= =?UTF-8?q?=E5=9D=87=E5=80=BC=20C#=20=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 637.二叉树的层平均值 C# 版本 --- ...02\345\272\217\351\201\215\345\216\206.md" | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" index 0c3b0f8c5e..ce53e49af9 100644 --- "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" +++ "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" @@ -1599,6 +1599,35 @@ impl Solution { } ``` +#### C#: + +```C# 二叉树的层平均值 +public class Solution { + public IList AverageOfLevels(TreeNode root) { + var result= new List(); + Queue queue = new(); + if(root !=null) queue.Enqueue(root); + + while (queue.Count > 0) + { + int count = queue.Count; + double value=0; + for (int i = 0; i < count; i++) + { + var curentNode=queue.Dequeue(); + value += curentNode.val; + if (curentNode.left!=null) queue.Enqueue(curentNode.left); + if (curentNode.right!=null) queue.Enqueue(curentNode.right); + } + result.Add(value/count); + } + + return result; + } +} + +``` + ## 429.N叉树的层序遍历 [力扣题目链接](https://leetcode.cn/problems/n-ary-tree-level-order-traversal/) From 275efa0c70ecdb36c2c77eb2e26059b7b8b29d03 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=98windscape=E2=80=99?= <2462269317@qq.com> Date: Wed, 15 Jan 2025 15:52:42 +0800 Subject: [PATCH 2991/3019] =?UTF-8?q?=E6=B7=BB=E5=8A=A00459.=E9=87=8D?= =?UTF-8?q?=E5=A4=8D=E7=9A=84=E5=AD=90=E5=AD=97=E7=AC=A6=E4=B8=B2.md?= =?UTF-8?q?=E7=9A=84Java=E7=89=88=E6=9C=AC=E4=BA=8C=E5=89=8D=E7=BC=80?= =?UTF-8?q?=E8=A1=A8=E4=B8=8D=E5=87=8F=E4=B8=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...20\345\255\227\347\254\246\344\270\262.md" | 42 ++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git "a/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" "b/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" index de0e6e4def..bdced0ef60 100644 --- "a/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" @@ -390,6 +390,8 @@ public: ### Java: +(版本一) 前缀表 减一 + ```java class Solution { public boolean repeatedSubstringPattern(String s) { @@ -420,6 +422,45 @@ class Solution { } ``` +(版本二) 前缀表 不减一 + +```java +/* + * 充分条件:如果字符串s是由重复子串组成的,那么它的最长相等前后缀不包含的子串一定是s的最小重复子串。 + * 必要条件:如果字符串s的最长相等前后缀不包含的子串是s的最小重复子串,那么s必然是由重复子串组成的。 + * 推得:当字符串s的长度可以被其最长相等前后缀不包含的子串的长度整除时,不包含的子串就是s的最小重复子串。 + * + * 时间复杂度:O(n) + * 空间复杂度:O(n) + */ +class Solution { + public boolean repeatedSubstringPattern(String s) { + // if (s.equals("")) return false; + // 边界判断(可以去掉,因为题目给定范围是1 <= s.length <= 10^4) + int n = s.length(); + + // Step 1.构建KMP算法的前缀表 + int[] next = new int[n]; // 前缀表的值表示 以该位置结尾的字符串的最长相等前后缀的长度 + int j = 0; + next[0] = 0; + for (int i = 1; i < n; i++) { + while (j > 0 && s.charAt(i) != s.charAt(j)) // 只要前缀后缀还不一致,就根据前缀表回退j直到起点为止 + j = next[j - 1]; + if (s.charAt(i) == s.charAt(j)) + j++; + next[i] = j; + } + + // Step 2.判断重复子字符串 + if (next[n - 1] > 0 && n % (n - next[n - 1]) == 0) { // 当字符串s的长度可以被其最长相等前后缀不包含的子串的长度整除时 + return true; // 不包含的子串就是s的最小重复子串 + } else { + return false; + } + } +} +``` + ### Python: (版本一) 前缀表 减一 @@ -930,4 +971,3 @@ bool repeatedSubstringPattern(char* s) { - From 1d0333f59634bc68b9c4f253f95a2ef8f7a5009e Mon Sep 17 00:00:00 2001 From: Anqi Li <103280095+iqna126@users.noreply.github.com> Date: Wed, 15 Jan 2025 17:16:40 -0800 Subject: [PATCH 2992/3019] =?UTF-8?q?=E7=BB=990054.=E6=9B=BF=E6=8D=A2?= =?UTF-8?q?=E6=95=B0=E5=AD=97.md=20=E5=8A=A0=E5=85=A5python=E8=A7=A3?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...77\346\215\242\346\225\260\345\255\227.md" | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git "a/problems/kamacoder/0054.\346\233\277\346\215\242\346\225\260\345\255\227.md" "b/problems/kamacoder/0054.\346\233\277\346\215\242\346\225\260\345\255\227.md" index de0ab1a37a..e4b5c43fef 100644 --- "a/problems/kamacoder/0054.\346\233\277\346\215\242\346\225\260\345\255\227.md" +++ "b/problems/kamacoder/0054.\346\233\277\346\215\242\346\225\260\345\255\227.md" @@ -215,6 +215,46 @@ public class Main { } ``` +### Python: +```python +class Solution(object): + def subsitute_numbers(self, s): + """ + :type s: str + :rtype: str + """ + + count = sum(1 for char in s if char.isdigit()) # 统计数字的个数 + expand_len = len(s) + (count * 5) # 计算扩充后字符串的大小, x->number, 每有一个数字就要增加五个长度 + res = [''] * expand_len + + new_index = expand_len - 1 # 指向扩充后字符串末尾 + old_index = len(s) - 1 # 指向原字符串末尾 + + while old_index >= 0: # 从后往前, 遇到数字替换成“number” + if s[old_index].isdigit(): + res[new_index-5:new_index+1] = "number" + new_index -= 6 + else: + res[new_index] = s[old_index] + new_index -= 1 + old_index -= 1 + + return "".join(res) + +if __name__ == "__main__": + solution = Solution() + + while True: + try: + s = input() + result = solution.subsitute_numbers(s) + print(result) + except EOFError: + break + +``` + ### Go: ````go package main From 20385f114619bd5a1c90f0f10ebd4ed7a76b9b6a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=98windscape=E2=80=99?= <2462269317@qq.com> Date: Fri, 17 Jan 2025 10:29:24 +0800 Subject: [PATCH 2993/3019] =?UTF-8?q?=E4=BF=AE=E6=94=B90020.=E6=9C=89?= =?UTF-8?q?=E6=95=88=E7=9A=84=E6=8B=AC=E5=8F=B7.md=E7=9A=84Java=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E4=B8=80=E5=A4=84=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git "a/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" "b/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" index f2f5cdd13f..9d9168e31e 100644 --- "a/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" +++ "b/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" @@ -166,7 +166,7 @@ class Solution { deque.pop(); } } - //最后判断栈中元素是否匹配 + //遍历结束,如果栈为空,则括号全部匹配 return deque.isEmpty(); } } @@ -555,3 +555,4 @@ impl Solution { + From a66142cbc57e9f3fbe3d5b72689d5cab38fbc690 Mon Sep 17 00:00:00 2001 From: Jian Date: Fri, 17 Jan 2025 19:37:21 +0800 Subject: [PATCH 2994/3019] =?UTF-8?q?=E4=BF=AE=E6=94=B9239=E6=BB=91?= =?UTF-8?q?=E5=8A=A8=E7=AA=97=E5=8F=A3=E6=9C=80=E5=A4=A7=E5=80=BCjava?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E6=B3=A8=E9=87=8A=E4=B8=A5=E9=87=8D=E9=94=99?= =?UTF-8?q?=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...2\227\345\217\243\346\234\200\345\244\247\345\200\274.md" | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git "a/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" "b/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" index caa24d8de3..63ee3daedc 100644 --- "a/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" +++ "b/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" @@ -267,7 +267,7 @@ class Solution { //利用双端队列手动实现单调队列 /** * 用一个单调队列来存储对应的下标,每当窗口滑动的时候,直接取队列的头部指针对应的值放入结果集即可 - * 单调队列类似 (tail -->) 3 --> 2 --> 1 --> 0 (--> head) (右边为头结点,元素存的是下标) + * 单调递减队列类似 (head -->) 3 --> 2 --> 1 --> 0 (--> tail) (左边为头结点,元素存的是下标) */ class Solution { public int[] maxSlidingWindow(int[] nums, int k) { @@ -281,7 +281,7 @@ class Solution { while(!deque.isEmpty() && deque.peek() < i - k + 1){ deque.poll(); } - // 2.既然是单调,就要保证每次放进去的数字要比末尾的都大,否则也弹出 + // 2.维护单调递减队列:新元素若大于队尾元素,则弹出队尾元素,直到满足单调性 while(!deque.isEmpty() && nums[deque.peekLast()] < nums[i]) { deque.pollLast(); } @@ -894,3 +894,4 @@ public: + From b764a124b71350bd8d008cddaddae3136f84c5f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=98windscape=E2=80=99?= <2462269317@qq.com> Date: Mon, 20 Jan 2025 22:59:33 +0800 Subject: [PATCH 2995/3019] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=A0=91=E7=9A=84=E7=BB=9F=E4=B8=80=E8=BF=AD=E4=BB=A3=E6=B3=95?= =?UTF-8?q?.md=E7=9A=84Java=E7=89=88=E6=9C=AC=E6=B3=A8=E9=87=8A=E7=AC=94?= =?UTF-8?q?=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...37\344\270\200\350\277\255\344\273\243\346\263\225.md" | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\347\273\237\344\270\200\350\277\255\344\273\243\346\263\225.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\347\273\237\344\270\200\350\277\255\344\273\243\346\263\225.md" index 037cf1109b..a6d4e3ffc3 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\347\273\237\344\270\200\350\277\255\344\273\243\346\263\225.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\347\273\237\344\270\200\350\277\255\344\273\243\346\263\225.md" @@ -238,7 +238,7 @@ class Solution { while (!st.empty()) { TreeNode node = st.peek(); if (node != null) { - st.pop(); // 将该节点弹出,避免重复操作,下面再将右中左节点添加到栈中 + st.pop(); // 将该节点弹出,避免重复操作,下面再将右左中节点添加到栈中(前序遍历-中左右,入栈顺序右左中) if (node.right!=null) st.push(node.right); // 添加右节点(空节点不入栈) if (node.left!=null) st.push(node.left); // 添加左节点(空节点不入栈) st.push(node); // 添加中节点 @@ -266,11 +266,10 @@ public List inorderTraversal(TreeNode root) { while (!st.empty()) { TreeNode node = st.peek(); if (node != null) { - st.pop(); // 将该节点弹出,避免重复操作,下面再将右中左节点添加到栈中 + st.pop(); // 将该节点弹出,避免重复操作,下面再将右中左节点添加到栈中(中序遍历-左中右,入栈顺序右中左) if (node.right!=null) st.push(node.right); // 添加右节点(空节点不入栈) st.push(node); // 添加中节点 st.push(null); // 中节点访问过,但是还没有处理,加入空节点做为标记。 - if (node.left!=null) st.push(node.left); // 添加左节点(空节点不入栈) } else { // 只有遇到空节点的时候,才将下一个节点放进结果集 st.pop(); // 将空节点弹出 @@ -294,7 +293,7 @@ class Solution { while (!st.empty()) { TreeNode node = st.peek(); if (node != null) { - st.pop(); // 将该节点弹出,避免重复操作,下面再将右中左节点添加到栈中 + st.pop(); // 将该节点弹出,避免重复操作,下面再将中右左节点添加到栈中(后序遍历-左右中,入栈顺序中右左) st.push(node); // 添加中节点 st.push(null); // 中节点访问过,但是还没有处理,加入空节点做为标记。 if (node.right!=null) st.push(node.right); // 添加右节点(空节点不入栈) @@ -975,3 +974,4 @@ public IList PostorderTraversal(TreeNode root) + From da742feaa3e324c9489bedaf867004cae583cc90 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=98windscape=E2=80=99?= <2462269317@qq.com> Date: Thu, 23 Jan 2025 11:47:27 +0800 Subject: [PATCH 2996/3019] =?UTF-8?q?=E4=BF=AE=E6=94=B90112.=E8=B7=AF?= =?UTF-8?q?=E5=BE=84=E6=80=BB=E5=92=8C.md=E7=9A=84Java=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E7=9A=84=E5=AD=97=E6=AF=8D=E5=B0=8F=E5=86=99?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...57\345\276\204\346\200\273\345\222\214.md" | 59 ++++++++++--------- 1 file changed, 31 insertions(+), 28 deletions(-) diff --git "a/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" "b/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" index b97013e67a..141967f593 100644 --- "a/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" +++ "b/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" @@ -309,25 +309,25 @@ public: 0112.路径总和 ```java -class solution { - public boolean haspathsum(treenode root, int targetsum) { +class Solution { + public boolean hasPathSum(TreeNode root, int targetSum) { if (root == null) { return false; } - targetsum -= root.val; + targetSum -= root.val; // 叶子结点 if (root.left == null && root.right == null) { - return targetsum == 0; + return targetSum == 0; } if (root.left != null) { - boolean left = haspathsum(root.left, targetsum); - if (left) { // 已经找到 + boolean left = hasPathSum(root.left, targetSum); + if (left) { // 已经找到,提前返回 return true; } } if (root.right != null) { - boolean right = haspathsum(root.right, targetsum); - if (right) { // 已经找到 + boolean right = hasPathSum(root.right, targetSum); + if (right) { // 已经找到,提前返回 return true; } } @@ -336,16 +336,16 @@ class solution { } // lc112 简洁方法 -class solution { - public boolean haspathsum(treenode root, int targetsum) { +class Solution { + public boolean hasPathSum(TreeNode root, int targetSum) { if (root == null) return false; // 为空退出 // 叶子节点判断是否符合 - if (root.left == null && root.right == null) return root.val == targetsum; + if (root.left == null && root.right == null) return root.val == targetSum; // 求两侧分支的路径和 - return haspathsum(root.left, targetsum - root.val) || haspathsum(root.right, targetsum - root.val); + return hasPathSum(root.left, targetSum - root.val) || hasPathSum(root.right, targetSum - root.val); } } ``` @@ -353,22 +353,22 @@ class solution { 迭代 ```java -class solution { - public boolean haspathsum(treenode root, int targetsum) { +class Solution { + public boolean hasPathSum(TreeNode root, int targetSum) { if(root == null) return false; - stack stack1 = new stack<>(); - stack stack2 = new stack<>(); + Stack stack1 = new Stack<>(); + Stack stack2 = new Stack<>(); stack1.push(root); stack2.push(root.val); - while(!stack1.isempty()) { + while(!stack1.isEmpty()) { int size = stack1.size(); for(int i = 0; i < size; i++) { - treenode node = stack1.pop(); + TreeNode node = stack1.pop(); int sum = stack2.pop(); // 如果该节点是叶子节点了,同时该节点的路径数值等于sum,那么就返回true - if(node.left == null && node.right == null && sum == targetsum) { + if(node.left == null && node.right == null && sum == targetSum) { return true; } // 右节点,压进去一个节点的时候,将该节点的路径数值也记录下来 @@ -387,8 +387,9 @@ class solution { } } ``` -```Java 統一迭代法 - public boolean hasPathSum(TreeNode root, int targetSum) { +```Java +class Solution { + public boolean hasPathSum(TreeNode root, int targetSum) { Stack treeNodeStack = new Stack<>(); Stack sumStack = new Stack<>(); @@ -422,38 +423,39 @@ class solution { } return false; } +} ``` 0113.路径总和-ii ```java -class solution { - public List> pathsum(TreeNode root, int targetsum) { +class Solution { + public List> pathSum(TreeNode root, int targetSum) { List> res = new ArrayList<>(); if (root == null) return res; // 非空判断 List path = new LinkedList<>(); - preorderdfs(root, targetsum, res, path); + preOrderDfs(root, targetSum, res, path); return res; } - public void preorderdfs(TreeNode root, int targetsum, List> res, List path) { + public void preOrderDfs(TreeNode root, int targetSum, List> res, List path) { path.add(root.val); // 遇到了叶子节点 if (root.left == null && root.right == null) { // 找到了和为 targetsum 的路径 - if (targetsum - root.val == 0) { + if (targetSum - root.val == 0) { res.add(new ArrayList<>(path)); } return; // 如果和不为 targetsum,返回 } if (root.left != null) { - preorderdfs(root.left, targetsum - root.val, res, path); + preOrderDfs(root.left, targetSum - root.val, res, path); path.remove(path.size() - 1); // 回溯 } if (root.right != null) { - preorderdfs(root.right, targetsum - root.val, res, path); + preOrderDfs(root.right, targetSum - root.val, res, path); path.remove(path.size() - 1); // 回溯 } } @@ -1626,3 +1628,4 @@ public class Solution { + From 163c3f33d8d24735230b25ddb697d726f0d5c242 Mon Sep 17 00:00:00 2001 From: Anqi Li <103280095+iqna126@users.noreply.github.com> Date: Thu, 23 Jan 2025 08:16:44 -0800 Subject: [PATCH 2997/3019] =?UTF-8?q?0054.=E6=9B=BF=E6=8D=A2=E6=95=B0?= =?UTF-8?q?=E5=AD=97.md=20=E5=9C=A8=E8=AE=B2=E8=A7=A3=E4=B8=AD=E5=8A=A0?= =?UTF-8?q?=E5=85=A5=E4=BA=86python=20string=E4=B9=9F=E4=B8=8D=E5=8F=AF?= =?UTF-8?q?=E5=8F=98=E7=9A=84=E8=A7=A3=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0054.\346\233\277\346\215\242\346\225\260\345\255\227.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/kamacoder/0054.\346\233\277\346\215\242\346\225\260\345\255\227.md" "b/problems/kamacoder/0054.\346\233\277\346\215\242\346\225\260\345\255\227.md" index e4b5c43fef..f788d65ba7 100644 --- "a/problems/kamacoder/0054.\346\233\277\346\215\242\346\225\260\345\255\227.md" +++ "b/problems/kamacoder/0054.\346\233\277\346\215\242\346\225\260\345\255\227.md" @@ -21,7 +21,7 @@ ## 思路 -如果想把这道题目做到极致,就不要只用额外的辅助空间了! (不过使用Java刷题的录友,一定要使用辅助空间,因为Java里的string不能修改) +如果想把这道题目做到极致,就不要只用额外的辅助空间了! (不过使用Java和Python刷题的录友,一定要使用辅助空间,因为Java和Python里的string不能修改) 首先扩充数组到每个数字字符替换成 "number" 之后的大小。 From 27718a4dfca99b25ceda3ee2946130c29261be71 Mon Sep 17 00:00:00 2001 From: asnpro <920569392@qq.com> Date: Fri, 24 Jan 2025 22:51:46 +0800 Subject: [PATCH 2998/3019] =?UTF-8?q?docs:=20=E4=B8=BA=200494.=E7=9B=AE?= =?UTF-8?q?=E6=A0=87=E5=92=8C.md=20=E5=AE=8C=E5=96=84=20JavaDoc=20?= =?UTF-8?q?=E6=B3=A8=E9=87=8A,=20=E6=B7=BB=E5=8A=A0=E5=8A=A8=E8=A7=84?= =?UTF-8?q?=E4=BA=94=E9=83=A8=E6=9B=B2=E6=B3=A8=E9=87=8A,=20=E8=A7=84?= =?UTF-8?q?=E8=8C=83=E9=83=A8=E5=88=86=E4=BB=A3=E7=A0=81=E6=A0=BC=E5=BC=8F?= =?UTF-8?q?,=20=E4=BF=AE=E6=94=B9=E9=83=A8=E5=88=86=E5=8F=98=E9=87=8F?= =?UTF-8?q?=E5=90=8D=E4=BB=A5=E5=A2=9E=E5=BC=BA=E4=BB=A3=E7=A0=81=E8=AF=AD?= =?UTF-8?q?=E4=B9=89=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...4.\347\233\256\346\240\207\345\222\214.md" | 61 +++++++++++++++---- 1 file changed, 50 insertions(+), 11 deletions(-) diff --git "a/problems/0494.\347\233\256\346\240\207\345\222\214.md" "b/problems/0494.\347\233\256\346\240\207\345\222\214.md" index 4a1fc6ab9a..c38ba7e43c 100644 --- "a/problems/0494.\347\233\256\346\240\207\345\222\214.md" +++ "b/problems/0494.\347\233\256\346\240\207\345\222\214.md" @@ -825,30 +825,69 @@ func abs(x int) int { ### JavaScript ```javascript +/** + * 题目来源: {@link https://leetcode.cn/problems/target-sum/} + * + * 题解来源: {@link https://programmercarl.com/0494.%E7%9B%AE%E6%A0%87%E5%92%8C.html#%E7%AE%97%E6%B3%95%E5%85%AC%E5%BC%80%E8%AF%BE} + * + * 时间复杂度: O(n * C), C 为数组元素总和与目标值之和的一半 + * + * 空间复杂度: O(C) + * + * @param { number[] } nums + * @param { number } target + * @return { number } + */ const findTargetSumWays = (nums, target) => { - - const sum = nums.reduce((a, b) => a+b); + // 原题目可转化为: + // + // 将所有元素划分为 2 个集合, + // 一个集合中包含所有要添加 "+" 号的元素, 一个集合中包含所有要添加 "-" 号的元素 + // + // 设两个集合的元素和分别为 positive 和 negative, 所有元素总和为 sum, 那么有如下等式: + // positive + negative = sum (1) + // positive - negative = target (2) + // (1) 与 (2) 联立可得: positive = (sum + target) / 2, + // 所以如果能从原数组中取出若干个元素形成 1 个元素总和为 (sum + target) / 2 的集合, + // 就算得到了 1 种满足题意的组合方法 + // + // 因此, 所求变为: 有多少种取法, 可使得容量为 (sum + target) / 2 的背包被装满? + + const sum = nums.reduce((a, b) => a + b); - if(Math.abs(target) > sum) { + if (Math.abs(target) > sum) { return 0; } - if((target + sum) % 2) { + if ((target + sum) % 2) { return 0; } - const halfSum = (target + sum) / 2; - - let dp = new Array(halfSum+1).fill(0); + const bagWeight = (target + sum) / 2; + + // 1. dp 数组的含义 + // dp[j]: 装满容量为 j 的背包, 有 dp[j] 种方法 + let dp = new Array(bagWeight + 1).fill(0); + + // 2. 递推公式 + // dp[j] = Σ(dp[j - nums[j]]), (j ∈ [0, j] 且 j >= nums[j]) + // 因为 dp[j - nums[j]] 表示: 装满容量为 j - nums[j] 背包有 dp[j - nums[j]] 种方法 + // 而容量为 j - nums[j] 的背包只需要再将 nums[j] 放入背包就能使得背包容量达到 j + // 因此, 让背包容量达到 j 有 Σ(dp[j - nums[j]]) 种方法 + + // 3. dp 数组如何初始化 + // dp[0] = 1, dp[1 ~ bagWeight] = 0 dp[0] = 1; - - for(let i = 0; i < nums.length; i++) { - for(let j = halfSum; j >= nums[i]; j--) { + + // 4. 遍历顺序 + // 先物品后背包, 物品从前往后遍历, 背包容量从后往前遍历 + for (let i = 0; i < nums.length; i++) { + for (let j = bagWeight; j >= nums[i]; j--) { dp[j] += dp[j - nums[i]]; } } - return dp[halfSum]; + return dp[bagWeight]; }; ``` From e6698cbac457714427f4a9cba6ea2a3ea9eed94c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=98windscape=E2=80=99?= <2462269317@qq.com> Date: Sat, 25 Jan 2025 11:52:09 +0800 Subject: [PATCH 2999/3019] =?UTF-8?q?=E4=BF=AE=E6=94=B90530.=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=B7=AE.md=E7=9A=84Java=E7=89=88=E6=9C=AC?= =?UTF-8?q?=20=E8=BF=9B=E8=A1=8C=E4=BA=86=E4=BB=A3=E7=A0=81=E6=A0=BC?= =?UTF-8?q?=E5=BC=8F=E5=8C=96=E5=B9=B6=E6=B7=BB=E5=8A=A0=E4=BA=86=E7=BB=9F?= =?UTF-8?q?=E4=B8=80=E8=BF=AD=E4=BB=A3=E6=B3=95=E7=9A=84=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...17\347\273\235\345\257\271\345\267\256.md" | 46 +++++++++++-------- 1 file changed, 28 insertions(+), 18 deletions(-) diff --git "a/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" "b/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" index 2533a618ed..b6d08dbeaa 100644 --- "a/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" +++ "b/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" @@ -153,23 +153,27 @@ public: 递归 ```java class Solution { - TreeNode pre;// 记录上一个遍历的结点 + TreeNode pre; // 记录上一个遍历的结点 int result = Integer.MAX_VALUE; + public int getMinimumDifference(TreeNode root) { - if(root==null)return 0; - traversal(root); - return result; + if (root == null) + return 0; + traversal(root); + return result; } - public void traversal(TreeNode root){ - if(root==null)return; - //左 + + public void traversal(TreeNode root) { + if (root == null) + return; + // 左 traversal(root.left); - //中 - if(pre!=null){ - result = Math.min(result,root.val-pre.val); + // 中 + if (pre != null) { + result = Math.min(result, root.val - pre.val); } pre = root; - //右 + // 右 traversal(root.right); } } @@ -182,22 +186,27 @@ class Solution { TreeNode pre = null; int result = Integer.MAX_VALUE; - if(root != null) + if (root != null) stack.add(root); - while(!stack.isEmpty()){ + + // 中序遍历(左中右),由于栈先入后出,反序(右中左) + while (!stack.isEmpty()) { TreeNode curr = stack.peek(); - if(curr != null){ + if (curr != null) { stack.pop(); - if(curr.right != null) + // 右 + if (curr.right != null) stack.add(curr.right); + // 中(先用null标记) stack.add(curr); stack.add(null); - if(curr.left != null) + // 左 + if (curr.left != null) stack.add(curr.left); - }else{ + } else { // 中(遇到null再处理) stack.pop(); TreeNode temp = stack.pop(); - if(pre != null) + if (pre != null) result = Math.min(result, temp.val - pre.val); pre = temp; } @@ -674,3 +683,4 @@ public class Solution + From 7f5ce0ac41f35e97d02ecfdf85c940f91c32d026 Mon Sep 17 00:00:00 2001 From: lewiseng <65698183+lewiseng@users.noreply.github.com> Date: Sat, 25 Jan 2025 15:56:17 -0500 Subject: [PATCH 3000/3019] =?UTF-8?q?Update=200216.=E7=BB=84=E5=90=88?= =?UTF-8?q?=E6=80=BB=E5=92=8CIII.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" "b/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" index 3d7f2d0c03..04805c93f5 100644 --- "a/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" +++ "b/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" @@ -367,7 +367,7 @@ class Solution: def backtracking(self, targetSum, k, currentSum, startIndex, path, result): if currentSum > targetSum: # 剪枝操作 - return # 如果path的长度等于k但currentSum不等于targetSum,则直接返回 + return # 如果currentSum已经超过targetSum,则直接返回 if len(path) == k: if currentSum == targetSum: result.append(path[:]) From c2e95f6c25b2c3f9ff61dc0891cc08360b676bb1 Mon Sep 17 00:00:00 2001 From: dam <1782067308@qq.com> Date: Sun, 26 Jan 2025 12:08:15 +0800 Subject: [PATCH 3001/3019] =?UTF-8?q?108=E5=86=97=E4=BD=99=E8=BF=9E?= =?UTF-8?q?=E6=8E=A5=20java=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...27\344\275\231\350\277\236\346\216\245.md" | 75 +++++++++++++++++++ 1 file changed, 75 insertions(+) diff --git "a/problems/kamacoder/0108.\345\206\227\344\275\231\350\277\236\346\216\245.md" "b/problems/kamacoder/0108.\345\206\227\344\275\231\350\277\236\346\216\245.md" index efbbb6d203..df3dd4deed 100644 --- "a/problems/kamacoder/0108.\345\206\227\344\275\231\350\277\236\346\216\245.md" +++ "b/problems/kamacoder/0108.\345\206\227\344\275\231\350\277\236\346\216\245.md" @@ -176,6 +176,81 @@ int main() { ### Java +```java +import java.util.Scanner; + +public class Main { + private static int[] father; + + public static void main(String[] args) { + Scanner scanner = new Scanner(System.in); + int pointNum = scanner.nextInt(); + father = new int[pointNum + 1]; + init(); + for (int i = 0; i < pointNum; i++) { + join(scanner.nextInt(), scanner.nextInt()); + } + } + + /** + * 并查集初始化 + */ + private static void init() { + for (int i = 1; i < father.length; i++) { + // 让每个元素指向自己 + father[i] = i; + } + } + + /** + * 并查集寻根 + * + * @param u + * @return + */ + private static int find(int u) { + // 判断 u 是否等于自己,如果是的话,直接返回自己 + // 如果不等于自己,就寻找根,寻找的时候,反复进行路径压缩 + return u == father[u] ? u : (father[u] = find(father[u])); + } + + /** + * 判断 u 和 v 是否同根 + * + * @param u + * @param v + * @return + */ + private static boolean isSame(int u, int v) { + return find(u) == find(v); + } + + /** + * 添加 边 到并查集,v 指向 u + * + * @param u + * @param v + */ + private static void join(int u, int v) { + // --if-- 如果两个点已经同根,说明他们的信息已经存储到并查集中了,直接返回即可 + // 寻找u的根 + int uRoot = find(u); + // 寻找v的根 + int vRoot = find(v); + if (uRoot == vRoot) { + // --if-- 如果u,v的根相同,说明两者已经连接了,直接输出 + System.out.println(u + " " + v); + return; + } + // --if-- 将信息添加到并查集 + father[vRoot] = uRoot; + } + +} +``` + + + ### Python ```python From 8bf4e2cdf1f69ab9a8f733e0c5693236335cff5c Mon Sep 17 00:00:00 2001 From: 1ltwo Date: Mon, 27 Jan 2025 16:08:27 +0800 Subject: [PATCH 3002/3019] =?UTF-8?q?738go=E7=89=88=E6=9C=AC=E7=AD=94?= =?UTF-8?q?=E6=A1=88=E6=9B=B4=E6=AD=A3=EF=BC=88=E5=8E=9F=E7=AD=94=E6=A1=88?= =?UTF-8?q?=E5=8A=9B=E6=89=A3=E6=97=A0=E6=B3=95=E9=80=9A=E8=BF=87=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...36\347\232\204\346\225\260\345\255\227.md" | 31 +++++++++---------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git "a/problems/0738.\345\215\225\350\260\203\351\200\222\345\242\236\347\232\204\346\225\260\345\255\227.md" "b/problems/0738.\345\215\225\350\260\203\351\200\222\345\242\236\347\232\204\346\225\260\345\255\227.md" index ff438e981c..f2cfee04c9 100644 --- "a/problems/0738.\345\215\225\350\260\203\351\200\222\345\242\236\347\232\204\346\225\260\345\255\227.md" +++ "b/problems/0738.\345\215\225\350\260\203\351\200\222\345\242\236\347\232\204\346\225\260\345\255\227.md" @@ -273,22 +273,20 @@ class Solution: ### Go ```go func monotoneIncreasingDigits(n int) int { - s := strconv.Itoa(N)//将数字转为字符串,方便使用下标 - ss := []byte(s)//将字符串转为byte数组,方便更改。 - n := len(ss) - if n <= 1 { - return n - } - for i := n-1; i > 0; i-- { - if ss[i-1] > ss[i] { //前一个大于后一位,前一位减1,后面的全部置为9 - ss[i-1] -= 1 - for j := i; j < n; j++ { //后面的全部置为9 - ss[j] = '9' - } - } - } - res, _ := strconv.Atoi(string(ss)) - return res + s := strconv.Itoa(n) + // 从左到右遍历字符串,找到第一个不满足单调递增的位置 + for i := len(s) - 2; i >= 0; i-- { + if s[i] > s[i+1] { + // 将该位置的数字减1 + s = s[:i] + string(s[i]-1) + s[i+1:] + // 将该位置之后的所有数字置为9 + for j := i + 1; j < len(s); j++ { + s = s[:j] + "9" + s[j+1:] + } + } + } + result, _ := strconv.Atoi(s) + return result } ``` @@ -447,3 +445,4 @@ public class Solution + From 333099a1268544306e303fcb779ffd801c0d0c92 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=98windscape=E2=80=99?= <2462269317@qq.com> Date: Mon, 3 Feb 2025 20:13:41 +0800 Subject: [PATCH 3003/3019] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=A0=91=E6=80=BB=E7=BB=93=E7=AF=87.md=E4=B8=80=E5=A4=84?= =?UTF-8?q?=E5=88=97=E8=A1=A8=E7=BA=A7=E5=88=AB=E7=9A=84=E6=A0=BC=E5=BC=8F?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\211\346\240\221\346\200\273\347\273\223\347\257\207.md" | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git "a/problems/\344\272\214\345\217\211\346\240\221\346\200\273\347\273\223\347\257\207.md" "b/problems/\344\272\214\345\217\211\346\240\221\346\200\273\347\273\223\347\257\207.md" index 8db40d6560..4794233ab5 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\346\200\273\347\273\223\347\257\207.md" @@ -92,10 +92,9 @@ * 递归:中序,双指针操作 * 迭代:模拟中序,逻辑相同 * [求二叉搜索树的众数](https://programmercarl.com/0501.二叉搜索树中的众数.html) - + * 递归:中序,清空结果集的技巧,遍历一遍便可求众数集合 - * [二叉搜索树转成累加树](https://programmercarl.com/0538.把二叉搜索树转换为累加树.html) - +* [二叉搜索树转成累加树](https://programmercarl.com/0538.把二叉搜索树转换为累加树.html) * 递归:中序,双指针操作累加 * 迭代:模拟中序,逻辑相同 @@ -163,3 +162,4 @@ + From add956a0e1581d1470bfcc18e01c2a175d7d358d Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Sun, 16 Feb 2025 14:36:05 +0800 Subject: [PATCH 3004/3019] Update --- ...11\345\222\214\345\255\220\351\233\206.md" | 12 +++++----- ...00\345\244\247\351\235\242\347\247\257.md" | 4 ++-- ...57\350\276\276\350\267\257\345\276\204.md" | 2 +- ...60\351\207\217\345\271\277\346\220\234.md" | 2 +- ...00\345\244\247\351\235\242\347\247\257.md" | 2 +- ...04\346\200\273\351\235\242\347\247\257.md" | 15 +++++------- ...06\350\256\272\345\237\272\347\241\200.md" | 2 +- ...06\350\256\272\345\237\272\347\241\200.md" | 23 +++++++++++++++++++ 8 files changed, 41 insertions(+), 21 deletions(-) diff --git "a/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" "b/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" index 55ed7ad2ff..902c022ab3 100644 --- "a/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" +++ "b/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" @@ -60,7 +60,7 @@ * [动态规划:关于01背包问题,你该了解这些!](https://programmercarl.com/背包理论基础01背包-1.html) * [动态规划:关于01背包问题,你该了解这些!(滚动数组)](https://programmercarl.com/背包理论基础01背包-2.html) -### 01背包问题 +## 01背包问题 01背包问题,大家都知道,有N件物品和一个最多能背重量为W 的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品只能用一次,求解将哪些物品装入背包里物品价值总和最大。 @@ -92,7 +92,7 @@ 动规五部曲分析如下: -1. 确定dp数组以及下标的含义 +### 1. 确定dp数组以及下标的含义 01背包中,dp[j] 表示: 容量(所能装的重量)为j的背包,所背的物品价值最大可以为dp[j]。 @@ -104,7 +104,7 @@ 而dp[6] 就可以等于6了,放进1 和 5,那么dp[6] == 6,说明背包装满了。 -2. 确定递推公式 +### 2. 确定递推公式 01背包的递推公式为:dp[j] = max(dp[j], dp[j - weight[i]] + value[i]); @@ -113,7 +113,7 @@ 所以递推公式:dp[j] = max(dp[j], dp[j - nums[i]] + nums[i]); -3. dp数组如何初始化 +### 3. dp数组如何初始化 在01背包,一维dp如何初始化,已经讲过, @@ -133,7 +133,7 @@ vector dp(10001, 0); ``` -4. 确定遍历顺序 +### 4. 确定遍历顺序 在[动态规划:关于01背包问题,你该了解这些!(滚动数组)](https://programmercarl.com/背包理论基础01背包-2.html)中就已经说明:如果使用一维dp数组,物品遍历的for循环放在外层,遍历背包的for循环放在内层,且内层for循环倒序遍历! @@ -148,7 +148,7 @@ for(int i = 0; i < nums.size(); i++) { } ``` -5. 举例推导dp数组 +### 5. 举例推导dp数组 dp[j]的数值一定是小于等于j的。 diff --git "a/problems/0695.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" "b/problems/0695.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" index 11b638d4d6..ca70420687 100644 --- "a/problems/0695.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" +++ "b/problems/0695.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" @@ -44,7 +44,7 @@ 这里其实涉及到dfs的两种写法。 -写法一,dfs只处理下一个节点,即在主函数遇到岛屿就计数为1,dfs处理接下来的相邻陆地 +写法一,dfs处理当前节点的相邻节点,即在主函数遇到岛屿就计数为1,dfs处理接下来的相邻陆地 ```CPP // 版本一 @@ -87,7 +87,7 @@ public: }; ``` -写法二,dfs处理当前节点,即即在主函数遇到岛屿就计数为0,dfs处理接下来的全部陆地 +写法二,dfs处理当前节点,即在主函数遇到岛屿就计数为0,dfs处理接下来的全部陆地 dfs ```CPP diff --git "a/problems/kamacoder/0098.\346\211\200\346\234\211\345\217\257\350\276\276\350\267\257\345\276\204.md" "b/problems/kamacoder/0098.\346\211\200\346\234\211\345\217\257\350\276\276\350\267\257\345\276\204.md" index 7f56f9f4dd..4df53b448f 100644 --- "a/problems/kamacoder/0098.\346\211\200\346\234\211\345\217\257\350\276\276\350\267\257\345\276\204.md" +++ "b/problems/kamacoder/0098.\346\211\200\346\234\211\345\217\257\350\276\276\350\267\257\345\276\204.md" @@ -7,7 +7,7 @@ 【题目描述】 -给定一个有 n 个节点的有向无环图,节点编号从 1 到 n。请编写一个函数,找出并返回所有从节点 1 到节点 n 的路径。每条路径应以节点编号的列表形式表示。 +给定一个有 n 个节点的有向无环图,节点编号从 1 到 n。请编写一个程序,找出并返回所有从节点 1 到节点 n 的路径。每条路径应以节点编号的列表形式表示。 【输入描述】 diff --git "a/problems/kamacoder/0099.\345\262\233\345\261\277\347\232\204\346\225\260\351\207\217\345\271\277\346\220\234.md" "b/problems/kamacoder/0099.\345\262\233\345\261\277\347\232\204\346\225\260\351\207\217\345\271\277\346\220\234.md" index d654e23604..f8c36a00a8 100644 --- "a/problems/kamacoder/0099.\345\262\233\345\261\277\347\232\204\346\225\260\351\207\217\345\271\277\346\220\234.md" +++ "b/problems/kamacoder/0099.\345\262\233\345\261\277\347\232\204\346\225\260\351\207\217\345\271\277\346\220\234.md" @@ -72,7 +72,7 @@ 如果从队列拿出节点,再去标记这个节点走过,就会发生下图所示的结果,会导致很多节点重复加入队列。 -![图二](https://code-thinking-1253855093.file.myqcloud.com/pics/20220727100846.png) +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20250124094043.png) 超时写法 (从队列中取出节点再标记,注意代码注释的地方) diff --git "a/problems/kamacoder/0100.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" "b/problems/kamacoder/0100.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" index 4f2f9d6732..170c0917aa 100644 --- "a/problems/kamacoder/0100.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" +++ "b/problems/kamacoder/0100.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" @@ -63,7 +63,7 @@ 这里其实涉及到dfs的两种写法。 -写法一,dfs只处理下一个节点,即在主函数遇到岛屿就计数为1,dfs处理接下来的相邻陆地 +写法一,dfs处理当前节点的相邻节点,即在主函数遇到岛屿就计数为1,dfs处理接下来的相邻陆地 ```CPP // 版本一 diff --git "a/problems/kamacoder/0101.\345\255\244\345\262\233\347\232\204\346\200\273\351\235\242\347\247\257.md" "b/problems/kamacoder/0101.\345\255\244\345\262\233\347\232\204\346\200\273\351\235\242\347\247\257.md" index 123e36cec5..43ac8ec96d 100644 --- "a/problems/kamacoder/0101.\345\255\244\345\262\233\347\232\204\346\200\273\351\235\242\347\247\257.md" +++ "b/problems/kamacoder/0101.\345\255\244\345\262\233\347\232\204\346\200\273\351\235\242\347\247\257.md" @@ -72,10 +72,8 @@ #include using namespace std; int dir[4][2] = {-1, 0, 0, -1, 1, 0, 0, 1}; // 保存四个方向 -int count; // 统计符合题目要求的陆地空格数量 void dfs(vector>& grid, int x, int y) { grid[x][y] = 0; - count++; for (int i = 0; i < 4; i++) { // 向四个方向遍历 int nextx = x + dir[i][0]; int nexty = y + dir[i][1]; @@ -109,16 +107,17 @@ int main() { if (grid[0][j] == 1) dfs(grid, 0, j); if (grid[n - 1][j] == 1) dfs(grid, n - 1, j); } - count = 0; + int count = 0; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { - if (grid[i][j] == 1) dfs(grid, i, j); + if (grid[i][j] == 1) count++; } } cout << count << endl; } ``` + 采用广度优先搜索的代码如下: ```CPP @@ -126,13 +125,11 @@ int main() { #include #include using namespace std; -int count = 0; int dir[4][2] = {0, 1, 1, 0, -1, 0, 0, -1}; // 四个方向 void bfs(vector>& grid, int x, int y) { queue> que; que.push({x, y}); grid[x][y] = 0; // 只要加入队列,立刻标记 - count++; while(!que.empty()) { pair cur = que.front(); que.pop(); int curx = cur.first; @@ -143,7 +140,6 @@ void bfs(vector>& grid, int x, int y) { if (nextx < 0 || nextx >= grid.size() || nexty < 0 || nexty >= grid[0].size()) continue; // 越界了,直接跳过 if (grid[nextx][nexty] == 1) { que.push({nextx, nexty}); - count++; grid[nextx][nexty] = 0; // 只要加入队列立刻标记 } } @@ -169,15 +165,16 @@ int main() { if (grid[0][j] == 1) bfs(grid, 0, j); if (grid[n - 1][j] == 1) bfs(grid, n - 1, j); } - count = 0; + int count = 0; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { - if (grid[i][j] == 1) bfs(grid, i, j); + if (grid[i][j] == 1) count++; } } cout << count << endl; } + ``` diff --git "a/problems/kamacoder/\345\233\276\350\256\272\346\267\261\346\220\234\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/kamacoder/\345\233\276\350\256\272\346\267\261\346\220\234\347\220\206\350\256\272\345\237\272\347\241\200.md" index efe833a7e1..ce3dbbdbe7 100644 --- "a/problems/kamacoder/\345\233\276\350\256\272\346\267\261\346\220\234\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/kamacoder/\345\233\276\350\256\272\346\267\261\346\220\234\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -162,7 +162,7 @@ if (终止条件) { 终止添加不仅是结束本层递归,同时也是我们收获结果的时候。 -另外,其实很多dfs写法,没有写终止条件,其实终止条件写在了, 下面dfs递归的逻辑里了,也就是不符合条件,直接不会向下递归。这里如果大家不理解的话,没关系,后面会有具体题目来讲解。 +另外,其实很多dfs写法,没有写终止条件,其实终止条件写在了, 隐藏在下面dfs递归的逻辑里了,也就是不符合条件,直接不会向下递归。这里如果大家不理解的话,没关系,后面会有具体题目来讲解。 3. 处理目前搜索节点出发的路径 diff --git "a/problems/kamacoder/\345\233\276\350\256\272\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/kamacoder/\345\233\276\350\256\272\347\220\206\350\256\272\345\237\272\347\241\200.md" index 50c3615733..84f693a00b 100644 --- "a/problems/kamacoder/\345\233\276\350\256\272\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/kamacoder/\345\233\276\350\256\272\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -128,6 +128,29 @@ 主要是 朴素存储、邻接表和邻接矩阵。 +关于朴素存储,这是我自创的名字,因为这种存储方式,就是将所有边存下来。 + +例如图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240511112951.png) + +图中有8条边,我们就定义 8 * 2的数组,即有n条边就申请n * 2,这么大的数组: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20250110114348.png) + +数组第一行:6 7,就表示节点6 指向 节点7,以此类推。 + +当然可以不用数组,用map,或者用 类 到可以表示出 这种边的关系。 + +这种表示方式的好处就是直观,把节点与节点之间关系很容易展现出来。 + +但如果我们想知道 节点1 和 节点6 是否相连,我们就需要把存储空间都枚举一遍才行。 + +这是明显的缺点,同时,我们在深搜和广搜的时候,都不会使用这种存储方式。 + +因为 搜索中,需要知道 节点与其他节点的链接情况,而这种朴素存储,都需要全部枚举才知道链接情况。 + +在图论章节的后面文章讲解中,我会举例说明的。大家先有个印象。 ### 邻接矩阵 From da821733ff03cefe9a2bc150e2f9f1821793e5f8 Mon Sep 17 00:00:00 2001 From: HuangLM03 <2306725926@qq.com> Date: Sun, 16 Feb 2025 14:48:02 +0800 Subject: [PATCH 3005/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=EF=BC=9A=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0kamacoder/0058=E5=8C=BA=E9=97=B4=E5=92=8C=E7=9A=84Go?= =?UTF-8?q?=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...8.\345\214\272\351\227\264\345\222\214.md" | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git "a/problems/kamacoder/0058.\345\214\272\351\227\264\345\222\214.md" "b/problems/kamacoder/0058.\345\214\272\351\227\264\345\222\214.md" index 23e7189a15..6f400ee433 100644 --- "a/problems/kamacoder/0058.\345\214\272\351\227\264\345\222\214.md" +++ "b/problems/kamacoder/0058.\345\214\272\351\227\264\345\222\214.md" @@ -357,3 +357,54 @@ int main(int argc, char *argv[]) ``` +### Go + +```go +package main + +import ( + "fmt" + "bufio" + "strconv" + "os" +) + +func main() { + // bufio中读取数据的接口,因为数据卡的比较严,导致使用fmt.Scan会超时 + scanner := bufio.NewScanner(os.Stdin) + + // 获取数组大小 + scanner.Scan() + n, _ := strconv.Atoi(scanner.Text()) + + // 获取数组元素的同时计算前缀和,一般建议切片开大一点防止各种越界问题 + arr := make([]int, n + 1) + for i := 0; i < n; i++ { + scanner.Scan() + arr[i], _ = strconv.Atoi(scanner.Text()) + if i != 0 { + arr[i] += arr[i - 1] + } + } + + /* + 区间[l, r]的和可以使用区间[0, r]和[0, l - 1]相减得到, + 在代码中即为arr[r]-arr[l-1]。这里需要注意l-1是否越界 + */ + for { + var l, r int + scanner.Scan() + _, err := fmt.Sscanf(scanner.Text(), "%d %d", &l, &r) + if err != nil { + return + } + + if l > 0 { + fmt.Println(arr[r] - arr[l - 1]) + } else { + fmt.Println(arr[r]) + } + } +} +``` + From 52cbec304ec4c4530551612f4a26b7fb2a5108cd Mon Sep 17 00:00:00 2001 From: Jerry Zeng <87971517+Zzz212zzZ@users.noreply.github.com> Date: Fri, 28 Feb 2025 00:31:03 -0500 Subject: [PATCH 3006/3019] =?UTF-8?q?update:=20707=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E9=93=BE=E8=A1=A8=E9=A2=98=E8=A7=A3=E4=B8=AD=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?Javascript=E5=8F=8C=E5=A4=B4=E9=93=BE=E8=A1=A8=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 --- ...76\350\256\241\351\223\276\350\241\250.md" | 154 ++++++++++++++++++ 1 file changed, 154 insertions(+) diff --git "a/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" "b/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" index ed1726d942..5c72b05a29 100644 --- "a/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" +++ "b/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" @@ -1191,6 +1191,160 @@ MyLinkedList.prototype.deleteAtIndex = function(index) { */ ``` +```js +/** + 定义双头节点的结构:同时包含前指针`prev`和后指针next` +*/ +class Node { + constructor(val, prev, next) { + this.val = val + this.prev = prev + this.next = next + } +} + +/** + 双链表:维护 `head` 和 `tail` 两个哨兵节点,这样可以简化对于中间节点的操作 + 并且维护 `size`,使得能够以O(1)时间判断操作是否合法 +*/ +var MyLinkedList = function () { + this.tail = new Node(-1) + this.head = new Node(-1) + this.tail.prev = this.head + this.head.next = this.tail + this.size = 0 +}; + +/** + * 获取在index处节点的值 + * + * @param {number} index + * @return {number} + * + * 时间复杂度: O(n) + * 空间复杂度: O(1) + */ +MyLinkedList.prototype.get = function (index) { + // 当索引超出范围时,返回-1 + if (index > this.size) { + return -1 + } + + let cur = this.head + for (let i = 0; i <= index; i++) { + cur = cur.next + } + + return cur.val +}; + +/** + * 在链表头部添加一个新节点 + * + * @param {number} val + * @return {void} + * + * 时间复杂度: O(1) + * 空间复杂度: O(1) + */ +MyLinkedList.prototype.addAtHead = function (val) { + /** + head <-> [newNode] <-> originNode + */ + this.size++ + const originNode = this.head.next + // 创建新节点,并建立连接 + const newNode = new Node(val, this.head, originNode) + + // 取消原前后结点的连接 + this.head.next = newNode + originNode.prev = newNode +}; + +/** + * 在链表尾部添加一个新节点 + * + * @param {number} val + * @return {void} + * + * 时间复杂度: O(1) + * 空间复杂度: O(1) + */ +MyLinkedList.prototype.addAtTail = function (val) { + /** + originNode <-> [newNode] <-> tail + */ + this.size++ + const originNode = this.tail.prev + + // 创建新节点,并建立连接 + const newNode = new Node(val, originNode, this.tail) + + // 取消原前后结点的连接 + this.tail.prev = newNode + originNode.next = newNode +}; + +/** + * 在指定索引位置前添加一个新节点 + * + * @param {number} index + * @param {number} val + * @return {void} + * + * 时间复杂度: O(n) + * 空间复杂度: O(1) + */ +MyLinkedList.prototype.addAtIndex = function (index, val) { + // 当索引超出范围时,直接返回 + if (index > this.size) { + return + } + this.size++ + + let cur = this.head + for (let i = 0; i < index; i++) { + cur = cur.next + } + + const new_next = cur.next + + // 创建新节点,并建立连接 + const node = new Node(val, cur, new_next) + + // 取消原前后结点的连接 + cur.next = node + new_next.prev = node +}; + +/** + * 删除指定索引位置的节点 + * + * @param {number} index + * @return {void} + * + * 时间复杂度: O(n) + * 空间复杂度: O(1) + */ +MyLinkedList.prototype.deleteAtIndex = function (index) { + // 当索引超出范围时,直接返回 + if (index >= this.size) { + return + } + + this.size-- + let cur = this.head + for (let i = 0; i < index; i++) { + cur = cur.next + } + + const new_next = cur.next.next + // 取消原前后结点的连接 + new_next.prev = cur + cur.next = new_next +}; +``` + ### TypeScript: ```TypeScript From a01972daad0997d57c48c28b67ff44ebf6028227 Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Mon, 3 Mar 2025 20:27:16 +0800 Subject: [PATCH 3007/3019] Update --- .../0102.\346\262\211\346\262\241\345\255\244\345\262\233.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/problems/kamacoder/0102.\346\262\211\346\262\241\345\255\244\345\262\233.md" "b/problems/kamacoder/0102.\346\262\211\346\262\241\345\255\244\345\262\233.md" index a7e28df52f..5e211cd09c 100644 --- "a/problems/kamacoder/0102.\346\262\211\346\262\241\345\255\244\345\262\233.md" +++ "b/problems/kamacoder/0102.\346\262\211\346\262\241\345\255\244\345\262\233.md" @@ -61,7 +61,7 @@ 思路依然是从地图周边出发,将周边空格相邻的陆地都做上标记,然后在遍历一遍地图,遇到 陆地 且没做过标记的,那么都是地图中间的 陆地 ,全部改成水域就行。 -有的录友可能想,我在定义一个 visited 二维数组,单独标记周边的陆地,然后遍历地图的时候同时对 数组board 和 数组visited 进行判断,决定 陆地是否变成水域。 +有的录友可能想,我再定义一个 visited 二维数组,单独标记周边的陆地,然后遍历地图的时候同时对 地图数组 和 数组visited 进行判断,决定 陆地是否变成水域。 这样做其实就有点麻烦了,不用额外定义空间了,标记周边的陆地,可以直接改陆地为其他特殊值作为标记。 From 82c7f09b00ca0cd030f9776229b3a30df1ff5bb0 Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Wed, 12 Mar 2025 10:51:49 +0800 Subject: [PATCH 3008/3019] Update --- ...46\211\200\346\234\211\350\267\257\345\276\204.md" | 6 +++--- ...46\263\242\351\202\243\345\245\221\346\225\260.md" | 2 +- ...46\260\264\346\265\201\351\227\256\351\242\230.md" | 11 ++++++----- ...46\234\200\345\244\247\345\262\233\345\261\277.md" | 2 +- problems/pics/test | 0 5 files changed, 11 insertions(+), 10 deletions(-) create mode 100644 problems/pics/test diff --git "a/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" "b/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" index 2d9292bc49..fdaa87f896 100644 --- "a/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" +++ "b/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" @@ -69,15 +69,15 @@ if (cur->left == NULL && cur->right == NULL) { 再来看一下终止处理的逻辑。 -这里使用vector 结构path来记录路径,所以要把vector 结构的path转为string格式,再把这个string 放进 result里。 +这里使用`vector` 结构path来记录路径,所以要把`vector` 结构的path转为string格式,再把这个string 放进 result里。 -**那么为什么使用了vector 结构来记录路径呢?** 因为在下面处理单层递归逻辑的时候,要做回溯,使用vector方便来做回溯。 +**那么为什么使用了`vector` 结构来记录路径呢?** 因为在下面处理单层递归逻辑的时候,要做回溯,使用vector方便来做回溯。 可能有的同学问了,我看有些人的代码也没有回溯啊。 **其实是有回溯的,只不过隐藏在函数调用时的参数赋值里**,下文我还会提到。 -这里我们先使用vector结构的path容器来记录路径,那么终止处理逻辑如下: +这里我们先使用`vector`结构的path容器来记录路径,那么终止处理逻辑如下: ```CPP if (cur->left == NULL && cur->right == NULL) { // 遇到叶子节点 diff --git "a/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" "b/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" index 1c4127fcd2..ac173dbddc 100644 --- "a/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" +++ "b/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" @@ -151,7 +151,7 @@ public: * 时间复杂度:O(2^n) * 空间复杂度:O(n),算上了编程语言中实现递归的系统栈所占空间 -这个递归的时间复杂度大家画一下树形图就知道了,如果不清晰的同学,可以看这篇:[通过一道面试题目,讲一讲递归算法的时间复杂度!](https://programmercarl.com/前序/通过一道面试题目,讲一讲递归算法的时间复杂度!.html) +这个递归的时间复杂度大家画一下树形图就知道了,如果不清晰的同学,可以看这篇:[通过一道面试题目,讲一讲递归算法的时间复杂度!](./前序/递归算法的时间复杂度.md) ## 总结 diff --git "a/problems/kamacoder/0103.\346\260\264\346\265\201\351\227\256\351\242\230.md" "b/problems/kamacoder/0103.\346\260\264\346\265\201\351\227\256\351\242\230.md" index 3066c99f28..31f5f1d9d4 100644 --- "a/problems/kamacoder/0103.\346\260\264\346\265\201\351\227\256\351\242\230.md" +++ "b/problems/kamacoder/0103.\346\260\264\346\265\201\351\227\256\351\242\230.md" @@ -162,16 +162,17 @@ int main() { 同样从第二组边界的边上节点 逆流而上,将遍历过的节点也标记上。 -然后**两方都标记过的节点就是既可以流太平洋也可以流大西洋的节点**。 +然后**两方都标记过的节点就是既可以流向第一组边界也可以流向第二组边界的节点**。 -从第一组边界边上节点出发,如图: +从第一组边界边上节点出发,如图: (图中并没有把所有遍历的方向都画出来,只画关键部分) -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240522120036.png) +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20250304174747.png) +从第二组边界上节点出发,如图: (图中并没有把所有遍历的方向都画出来,只画关键部分) -从第二组边界上节点出发,如图: +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20250304174801.png) -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240522120122.png) +最后,我们得到两个方向交界的这些节点,就是我们最后要求的节点。 按照这样的逻辑,就可以写出如下遍历代码:(详细注释) diff --git "a/problems/kamacoder/0104.\345\273\272\351\200\240\346\234\200\345\244\247\345\262\233\345\261\277.md" "b/problems/kamacoder/0104.\345\273\272\351\200\240\346\234\200\345\244\247\345\262\233\345\261\277.md" index ffb6cae34d..5f091779d1 100644 --- "a/problems/kamacoder/0104.\345\273\272\351\200\240\346\234\200\345\244\247\345\262\233\345\261\277.md" +++ "b/problems/kamacoder/0104.\345\273\272\351\200\240\346\234\200\345\244\247\345\262\233\345\261\277.md" @@ -72,7 +72,7 @@ ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20220829104834.png) -第一步,则遍历题目,并将岛屿到编号和面积上的统计,过程如图所示: +第一步,则遍历地图,并将岛屿的编号和面积都统计好,过程如图所示: ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20220829105644.png) diff --git a/problems/pics/test b/problems/pics/test new file mode 100644 index 0000000000..e69de29bb2 From 1cfdefa3fd34abd401f9a9edc5da267b4de8ce25 Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Wed, 12 Mar 2025 11:17:46 +0800 Subject: [PATCH 3009/3019] Update --- .../\351\230\277\351\207\214\344\272\221.png" | Bin 341267 -> 0 bytes problems/{pics => images}/test | 0 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 "pics/\351\230\277\351\207\214\344\272\221.png" rename problems/{pics => images}/test (100%) diff --git "a/pics/\351\230\277\351\207\214\344\272\221.png" "b/pics/\351\230\277\351\207\214\344\272\221.png" deleted file mode 100644 index 79f41d6beb9983c5945aec7cfd65bb98e1e448d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 341267 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%0D2;H;P>vk?D7C}k_p!lceL|*9WpNS;<1g6sH}Ty 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

n#`kpU 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 z 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 bJpkE!5ejt0UUOjqK8E^tu3@h}3i*EkiC|i& diff --git a/problems/pics/test b/problems/images/test similarity index 100% rename from problems/pics/test rename to problems/images/test From ee41ca792faf0db3156bfac3eb340386d5c930c7 Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Wed, 12 Mar 2025 12:25:15 +0800 Subject: [PATCH 3010/3019] Update --- problems/qita/kstar.md | 131 -------------- problems/qita/xunlianying.md | 337 ----------------------------------- 2 files changed, 468 deletions(-) delete mode 100644 problems/qita/kstar.md delete mode 100644 problems/qita/xunlianying.md diff --git a/problems/qita/kstar.md b/problems/qita/kstar.md deleted file mode 100644 index 7d1b045c8e..0000000000 --- a/problems/qita/kstar.md +++ /dev/null @@ -1,131 +0,0 @@ -# 代码随想录知识星球 - -前一阵知识星球刚刚发布了[星球精华-大厂八股文(第三版)](https://programmercarl.com/other/kstar_baguwen.html) - -这份八股文,就有30w字,将近400张思维导图,表格,分析图,整个PDF将近900页的篇幅。 - -这些其实都是星球录友们,每日打卡的内容,但这我也仅仅是整理了一部分,因为信息量确实巨大。 - -目前星球里已经有将近1000 个精华帖: - -

- -同时还有[计算机2023届求职薪资PDF](https://programmercarl.com/other/2022salary.html)等一些列独家资料,都在星期置顶帖里: - -
- -星球里的录友都可以得到我1V1的指导,**我已经详细回答了7000+个问题**: (这个回答问题数量,可以看出我有劳模的潜质 ) - -
- -有的时候,大家还是需要过来人,给指点一点,甚至是“踹一脚” 就会想清楚很多。 - -
- -不仅我回答问题,我还会邀请星球里各个方向的录友来和大家一起交流具体技术问题,这个就是星球导师计划: (如果想提问的话,也在星球置顶1可以找到链接) - -
- -
- -可以看看星球导师计划里具体的问答: - -
- -同时我还给录友们至少修改了上千份的简历,我也总结了很多大家写简历上问题。在 「写简历」这个tab上,可以找到我总结的所有问题和简历模板 - -
- -【专业技能】【项目经验】【自我评价】都应该怎么写,面试时候 自我介绍,应该怎么说,我都给出了我的建议: - -
- - -如果你还在犹豫要不要加入的话,**可以进来体验三天,三天内点击知识星球APP右上角,可以自助全额退款**。 绝对不会坑大家! -
- - -一些录友当初也是进来 白嫖一波资料,就退款跑了,不过后面又加回来,例如这位录友: - -
- -**星球里的资料仅仅是辅助,更重要的是星球里的这一圈人,你会发现 这个圈子的质量非常高!** - -不仅仅是 **211、985录友非常之多**,关键是大家都非常努力上进! - -这是知识星球APP里可以看到,录友们的日常打卡: - -
- -刷星球上的内容,要刷朋友圈,刷抖音,有意义的多。 - -
- -
- -星球网页版是这样的: - -
- -加入星球,是很多录友当年做的最有意义的一件事情 - -
-
-
-
- -可以看看星球里的交流氛围: - -
- -
- -
- -
- -
- -大家的很多疑问在星球置顶3,我都做了详细的整理,录友都说我是“整理狂魔”,不过大家懒,我就得勤劳一些。 - -
- -星球置顶3的信息量非常大,不仅仅是整理各个求职方向的学习路线,还有大家的常见疑惑,我之前回答过的内容,都做了整理。 - -大家看完之后,其实对自己就会有明确的规划了。 - -
- -给大家看看星球置顶帖3的部分内容,以下仅仅是部分截图: - -
- -
- -
- -
- - -大家加入星球后,一定要看星球置顶帖和精华帖的内容,你会发现这里很有优秀录友的帖子,包括:各种资料,学习路线,学习心得,规划,职场发展等等。 - -
- -很多录友看完之后都更加明确了自己的方向。 - -
- - -相对于其他星球,「代码随想录」知识星球到底怎么样,可以看看录友们是怎么说的。 - -
- -最后也欢迎大家加入代码随想录[知识星球](https://mp.weixin.qq.com/s/wPaJumc8afuzWLo72yRlIw),**这里有很多优秀的人,有很多精彩的事!** - -
- -这里依然给出10元代金券,微信扫领代金券加入,如果感觉不值得,**三天内知识星球APP右上角直接全额退款!** 无任何套路。 - -
- - diff --git a/problems/qita/xunlianying.md b/problems/qita/xunlianying.md deleted file mode 100644 index f13290f302..0000000000 --- a/problems/qita/xunlianying.md +++ /dev/null @@ -1,337 +0,0 @@ - -# 代码随想录算法训练营 - -::: tip 通知 -训练营35期,将于 4月3日开营,目前可以报名,报名后提前拉群,在群里等着开营就好。 -::: - -大家可以百度搜索:代码随想录算法训练营, 看看往期录友们在训练营里打卡总结的博客。 - -
- -这是训练营里录友坚持到最后一天的打卡,大家可以看看他们的博客是每天都有记录的: - -* [这种方式,有效逼我坚持下来(C++-小飞-嘉院大三)(精华)](https://blog.csdn.net/weixin_60353640/article/details/133797799) -* [完成比完美重要(Java-小姜-已工作/南京)(精华)](https://xie.infoq.cn/article/3d07b4040ceab0f546d66e3e1) -* [已经刷了500题的基础,参加训练营依然收获满满(Java-怪懒懒-求职)(精华)](https://blog.csdn.net/2301_78266314/article/details/132144046) - -* [算法超级弱,最后坚持下来了(Java-信任呢-上大研二)(精华)](https://blog.csdn.net/xinrenne/article/details/133267089) -* [第一次比较完整的刷题训练经历,群里氛围超级好(JAVA-雷贯三十三重天-北航研二)(精华)](https://blog.csdn.net/qq_44120129/article/details/133230372) -* [我全程坚持下来,还是很有成就感的(python-wj-待业)(精华)](https://blog.csdn.net/u013441272/article/details/133229421) - -* [一点基础都没有,坚持下来了(C++ 润 大二)(精华)](https://blog.csdn.net/m0_74583479/article/details/132776719) -* [这个钱花的很值得(C++-GMZ-研一)(精华)](https://blog.csdn.net/weixin_43303286/article/details/132796571) -* [看着名单里录友都在坚持,自己也要坚持(C++-凯-湖工大研三)(精华)](https://blog.csdn.net/weixin_62453859/article/details/132788830) - -* [一刷心得(Java-小何同学-广财大二)(精华)](https://juejin.cn/post/7272250890597531684) -* [花钱买服务、买环境、买时间(Java-古今-大工研二)(精华)](https://blog.csdn.net/dannky_Z/article/details/132532049) -* [一刷心得(java-唔哩凹-大三)(精华)](https://blog.csdn.net/iwtup/article/details/132545456) - -* [训练营结束有点不舍,坚持最久的一件事(C++-徐一-中科院研二)(精华)](https://blog.csdn.net/weixin_46108098/article/details/132158352) -* [同学推荐,报名训练营,坚持下来了(c++-刘浩-沈自所-研二)(精华)](https://blog.csdn.net/qq1156148707/article/details/132155446) - -* [每日的刷题训练真的艰难,但坚持下来了(C++-五-已工作福建)(精华)](https://blog.csdn.net/weixin_44952586/article/details/131909720) -* [加入训练营,就是因为这个气氛,只靠自己很难坚持(cpp-Lord HouSton-cqu研二)(精华)](https://blog.csdn.net/HSL13594379250/article/details/131889934) -* [很幸运,我坚持下来了,感觉收货满满(java-李-UCAS研0)(精华)](https://blog.csdn.net/ResNet156/article/details/131920163) -* [谈谈自己的收获,养成了写博客的习惯(java-翌-研二)(精华)](https://blog.csdn.net/weixin_47460244/article/details/131912316) - -* [养成了刷题的习惯(C++-热心市民C先生-南理工研一)(精华)](https://blog.csdn.net/qqq1521902442/article/details/131614999) -* [工作也坚持下来(Python-Hongying-已工作杭州)(精华)](https://blog.csdn.net/weixin_42286468/article/details/131628069) -* [入营不亏(C++-小叶子-云财研二)(精华)](https://blog.csdn.net/dream_aleaf/article/details/131613667) - -* [训练营一刷总结(Java-HQH-研二)](https://blog.csdn.net/weixin_43821876/article/details/128991822) -* [训练营总结,一群人才能走的更远(Java-Lixy-已工作南京)](https://blog.csdn.net/weixin_45368277/article/details/128997823) -* [训练营总结,中途🐑了,也坚持下来(C++-Jane-科大研二)](https://blog.csdn.net/Jane_10358/article/details/128977424) -* [这两个月有很多不可控因素,但依然坚持下来(java-hha-南工大二)](https://blog.csdn.net/qerwtrt4t/article/details/128975401) -* [训练营总结,最后坚持下来(C++ - 阿舟 - 已工作武汉)](https://blog.csdn.net/m0_74360161/article/details/129000723) - - -博客链接:[https://blog.csdn.net/m0_61724447/article/details/128443084](https://blog.csdn.net/m0_61724447/article/details/128443084) -
- -博客链接:[https://juejin.cn/post/7170304080504586254](https://juejin.cn/post/7170304080504586254) -
- -博客链接:[https://blog.csdn.net/weixin_44047621/article/details/128430623](https://blog.csdn.net/weixin_44047621/article/details/128430623) -
- -博客链接:[https://blog.csdn.net/weixin_47467016/article/details/128460565](https://blog.csdn.net/weixin_47467016/article/details/128460565v) -
- -也有一些录友,把总结发在训练营内部打卡表里,例如: - -昵称:java-低调-已工作 - -通过两个月的时间系统性的学习了算法,然后按照不同的题目去做分类,设计的刷题进度也很好,让自己有了一个质的提升,贵在坚持,好在自己也是坚持了下来,**通过自己的坚持,让自己养成了一个刷题的好习惯,这才是最难能可贵的**。 - -但是时间跨度有点大,还是要继续坚持之后自己去二刷,这样才能更好的巩固,把算法知识学习的更好。 - ---------- - -昵称:java-岂几岂几-毕业 - -收获真的很大,这是第一次刷算法题,清楚了面试高频题的题型,**巩固了之前摇摇欲坠的自学算法基础**。接下来计划是重刷随想录,并且补充上一亩三分地刷题区置顶贴里列出的题型,在巩固一刷的基础上增加做题量。 - ------------- - -昵称:python/go-ds-研三 - -跟着卡哥的训练营最大的收获就是把代码随想录都通读了一遍,因为进营之前就已经刷过不少力扣题了,但很多都是当时自己捣鼓出来或者看官方题解的。 - -而这一次的60天刷题,不管题目做没做过,都看过卡哥的代码随想录了,**这其中的区别也是最大的收获就是知识体系建立起来了**,越往后做题,条理越清晰。 - -即使有些题一刷还是做不太出来,但不再像之前自己做那样做题前后都是懵逼状态了,而是有一个清晰明了的判断了。 - -但coding能力还是有待改进,接下来要进行二刷,同时也祝卡哥的事业蒸蒸日上,代码随想录越办越好! - ------------- - -昵称:Python-ukn-研二 - -完美收官,有点小遗憾的是后面dp做得有点赶,没有沉下心来消化,接下来重点把自己不擅长的专题和重点专题二刷甚至三刷。 - -**跟着训练营练下来最大的感受是很有信心,有节奏有计划**,每过完一个专题,就多一分成就感,题感也越来越好,期待自己的规律二刷,谢谢一路坚持的小伙伴们!谢谢大佬助手和卡哥! - - ------------ - - -## 训练营的目的是什么? - -对于刷题,学算法,[《代码随想录》](https://programmercarl.com/other/publish.html)(programmercarl.com)已经把刷题顺序给大家列好了,大家跟着刷就行。 - -但即使这样,其实不少录友还会有很多疑问,不知道怎么用代码随想录,例如: - -* 卡哥,**有没有一起从0开始刷代码随想录的录友,想一起组个队** -* 卡哥您好,我是985准研一非科班,自学java, 然后现在在刷代码随想录,**请问需要每个题目的所有解法都掌握吗**?请教下卡哥正确的刷题姿势🙏 -* **我大概多久才能刷完代码随想录**? -* 二叉树,我只掌握 递归够用么? -* 很多解法,我是不是只用暴力就可以,**时间比较紧,我还要去掌握优化方法吗**? -* 卡哥,**请问跟着代码随想录刷题有答疑的服务吗**? 因为有的题目 自己写的怎么都不对,浪费很多时间,可能过来人指点一下立刻就知道。 -* 卡哥,我KMP太难了,我跳过可以吗? -* 卡哥,我进了刷题群,可是**大家刷题进度不尽相同,所以讨论起来经常不在一个频道上**。 -* 刚开始还看了一周代码随想录,后来又..摆烂了... **最近又重新再看代码随想录,然后卡住了又摆烂了好几天了**...... -* 卡哥,**我刷题很容易囫囵吞枣,虽然说代码随想录一刷,但很多内容根本没消化,在进度上欺骗自己**,好像一刷完了,但感觉自己理解的,不到30%。 -* 卡哥,**感觉之前刷的都忘了,能力没有什么提升,现在还是一道都不会做**。我一刷每道题都得先看看题解然后忘了再去看边看边写。 - -**以上这些是不是有戳中某些录友们的痛处**。 - -其实对于很多算法基础不太好的录友,即使资料已经很齐全,但还是需要一些规划和答疑。 - -而且在时间规划上,因为刚开始刷的录友,不知道 前方题目 是多大难度,所以 一开始计划 一天刷三道,往往因为遇到了一道难题,一天也解决不了,耽误了整体进度,甚至直接开始摆烂,下次再开始刷题可能就很久以后了...... - -所以 **代码随想录算法训练营** 帮助大家在规划时间内,有质量的完成代码随想录一刷。 - -我亲自给大家规划节奏,大家一起按照我的节奏来,规定时间内,一刷一定能把代码随想录所有内容吃透,然后大家自己去二刷,三刷就好了,师傅领进门修行在个人。 - -## 训练营提供一些什么呢? - -1.具体内容 - -针对代码随想录上,**195篇算法文章,主要题目150道**,手把手带大家刷完,帮大家做好详细刷题规划,每天布置刷题任务,监督博客记录总结。 - -任务布置 -
- -每日规划: -
- -训练营周期内,每天应该做哪些题目,同时我根据题目的难度,适当调整每天学习安排,不会是 每天固定3题的这种,而是根据难度而定。 - -我会告诉大家,哪些解法是一刷的时候必须掌握的,哪些解法可以二刷再去学习,哪些总结是必看的。 - -每日打卡: -
- -关于如果debug自己的代码,训练营会给具体建议: -
- -训练营群中每日讨论的重点内容都会做整理,在分享给大家训练营成员: -
- -**同时每天做针对大家的疑问做详细答疑,保证大家消化当天的学习内容**。 - -2.**气氛气氛还是气氛** - -训练营中,**大家都是同一个基础,同一个进度刷题,每天刷题题目都是一样的**,这样的一个学习群,大家讨论起来更有意义。 -**还有会监督机制**,训练营的成员要注册一个自己的博客(自己搭建或者使用博客网站都可以),每天要去写今日刷题心得和总结,来进行打卡。 - -
- -3.带大家写博客 - -很多录友平时刷题,或者学习技术,没有写博客的习惯,或者因为懒,就不写了。 - -但大家学了很多技术之后,发现 好像都忘了。。。 - -所以训练营会带着大家写博客,每天都要写博客,博客的标题,格式,我都帮大家规划好,倒逼自己养生记录的习惯。 - -因为训练营很多录友开始有了写博客的习惯,以下是一些录友博客的结尾部分: - -
- -
- -每天训练营群里会每天统计大家的博客情况。这样不仅可以监督自己总结,针对大家写的比较好的博客,会给予曝光,增加自己写博客的动力。 - -训练营里的录友们可以相互参考对方的博客,看谁总结的更好。 - -
- - -4.关于答疑 - -很多录友可能担心自己的问题,得不到解决,或者在群里和大家讨论,也没人回复 导致自己因为小问题卡了很久,甚至直接摆烂好一阵子。 - -所以训练营里大家的问题,我都会做答疑。 - -估计训练营里的问题会比较多,我也可能回答不过来。所以我会找了算法能力很强的助手协助我给大家答疑,也就是说,**大家刷题遇到问题,不会有后顾之忧,当天的问题,当天一定会得到解决**。 - -
- -当然训练营题目答疑,**仅限于 每天规划的题目**,并不会大家刷的其他算法题都做答疑,那样的话工作量很容易不可控(这里我也不会夸大承诺,欺骗大家报名之类的),如果是其他算法题可以在群里和大家交流。 - -### 训练营的资料是什么呢? - -**强调一下:训练营里所有的资料,都是我独立制作而且是开源免费的:即代码随想录网站(programmercarl.com),Github:https://github.com/youngyangyang04/leetcode-master和[代码随想录算法公开课](https://mp.weixin.qq.com/s/xncn6IHJGs45sJOChN6V_g)** - -训练营提供给大家的服务是**规划,监督,指导和答疑**。 - -至于代码随想录算法内容的质量如何,这个已经是有口皆碑了,基本是面试求职必刷的资料。 - -
- -
- -而且代码随想录开源的内容要比市面上 大家付费几百,上千元报的算法训练营的资料都要好的多。 - -毕竟内容是开源的,质量如何 大家自己去看就好。 - -## 训练营的学习方式 - -组织方式:一个学习微信群(180人左右),大家进群之后,等群公告就好,我会通知开始时间和每日刷题计划。 - -所需时间:训练营为期60天(两个月),群里每天会布置学习任务,只要大家跟上节奏,60天一定可以刷完代码随想录。 - -每日任务:需要花费3-4个小时左右的时间来完成。这是针对一般算法水平的学习速度来规划的时间,不同水平会有差异。 - -每周周日会休息一天,没跟上进度的录友,可以跟进度,跟上进度的录友可以复习或者适当放松一下。 - -监督机制:训练营里,每天会针对大家每天所刷的题目做答疑,同时也会有监督打卡机制,在群公告里会详细描述。 - -所需语言:**所有语种都可以**,毕竟代码随想录几乎支持所有主流语言,**也会针对大家所用的语言做针对性答疑**。 - -## 开营时间 - -**训练营开始常态化报名,即一直可以报名,当人满180人的时候,就开始新的一期**。 最新的一期可以看文章评论区,或者文章开头。 - -## 训练营的价格 - -大家应该最关心的是价格了,**定价依然是268元**,注意这是两个月训练营的费用,而且是全程规划,指导,监督和答疑。 - -(对于[知识星球](https://programmercarl.com/other/kstar.html)里的录友的话,训练营会立减30元,也就是238元,后面如果推出其他服务,星球录友都相当于VIP,都会有优惠。当然如果你已经报了训练营,再去报知识星球,并不给再给大家优惠了,一定要先是星球成员,再报训练营才有优惠) - -大家能在市面上找到算法训练营都价格不菲,基本都是上千的单价,**而且内容和质量并没有 代码随想录 优质**。 - -后面一定会涨价的,**如果你确实需要有人带,有监督,给规划,有答疑,能花两个月时间更下来的话,还是早报早学习**。 - -## 我适合报名吗? - -符合一下特点的录友可以报名: - -* 基础比较差,没刷过代码随想录或者刚开始刷 -* 刷过一些代码随想录的题目了,感觉掌握不扎实,想用2个月时间系统重刷一遍 -* 自己刷题,**很容易遇到各种代码问题,需要有人答疑** -* 以前一刷过,但基本都忘了,想高质量二刷 -* **想找队友,一起从0刷代码随想录** -* 自控能力差,遇到点问题就容易躺好一阵子,需要别人监督学习 -* **想有一个规划时间,来刷完代码随想录** -* 不知道代码随想录中哪些解法是必备的,哪些解法是可以简单了解的 -* 刷题总会忘,感觉刷了和没刷差不多,**不擅长做总结,不擅长写博客记录心得**,自己也懒得写博客写总结 - -以下录友不合适报名: - -* 自学能力强,代码随想录资料都是开源的,刷题顺序也列好了,自学能力强的录友自己学就行 -* 有算法和代码基础,基本算法题遇到的问题,都能通过自己debug解决 -* 没有两个月时间,每天也不能抽出那么多时间学习算法 -* 算法0基础,基本的数据结构都没听说过,例如数组,链表。 -* 编程0基础,基本的编程语言还不会,因为训练营还是默认大家会熟悉所用编程语言里的各种容器的使用 - -**训练营不限编程语言**,任何语言都可以报名,都会答疑。 - - -## 常见疑问 - -**海外录友有时差可以报名吗**? - -可以的,一期就有很多海外的录友,有疑问在群里也会回复,而且群里讨论的重点内容,都会有总结,不用担心错过了精彩内容。 - -**已经工作的录友适合报名吗**? - -适合报名。对于工作的录友,每天未必说一定挤出3-4个小时来刷题。 - -对于时间充足的录友,要刷拓展题,要写博客作总结。 如果时间紧张,任务上是可以适当精简。 - -所以每日任务弹性还是比较大的,至少跟上进度保证每天的题目代码提交通过了,看看群里的讨论,自己理解加深了就可以。 - -工作的录友要学会挤时间,训练营一期录友有不少是工作的,他们是这么搞的: - -训练营每日晚上提前发布明天的任务, 他们第二天通勤 时候 可以先看题想思路,白天抽空看文章解析 看看思路是否一致,看看群里讨论内容,晚上下班可以一口气把当天的题目刷完。 - -加入训练营,每日对自己有一个压迫感,挤一挤 时间就有了。 - -对于工作的录友,我之前本来计划是安排一期 工作日题量小 休息日题量多一些的训练营,但通过一期发现,包括已经工作的录友,**大家休息日真的没有心思学习,甚至“比工作日更忙”**,所以理想很丰满,现实很骨感。 - -**要不要搞三个月四个月半年的训练营**? - -目前来看四个月以上的时间有点太长了,时间长价格也会高,毕竟要服务的时间长了。 - -而且刷题在于一鼓作气,把时间拉的太长,很多录友都是前期 动力十足,后面无论是 如何@ 如何公告 如果催大家 赶进度,大家都会无动于衷,从最终效果来看 战线不能太长。 - -所以没有逼自己一把 跟上进度的决心,就算搞一年时间的训练营,该放弃的还是会放弃。 - -至于三个月的训练营,是可以考虑的,不过安排时间还要待定。 - -## 报名方式 - -* 正常支付,价格:268 (支付成功后,支付记录发给客服 -* 知识星球录友支付,价格:238 (支付成功后,[代码随想录知识星球](https://programmercarl.com/other/kstar.html)截图 和 支付记录发给客服 -* 往期算法训练营录友再次报名,价格:130 (支付成功后,往期训练营群或者支付记录 和 本次支付记录发给客服 - -(**注意一定要是[代码随想录知识星球](https://programmercarl.com/other/kstar.html)成员才会有优惠**) - -支付宝支付如下: - -
- -[微信支付点击这里](https://www.programmercarl.com/other/weixinzhifu.html) - -付款后,将付款截图发给客服,客服会在24h内统一回复,**所以大家发给客服信息不要急,当天一定会回复的**。 - -
- -关于训练营的任何问题,可以在客服这里咨询! - - - -## 最后 - -训练营其实算是代码随想录的一个补充,其内容都是免费开放的,有学习能力的录友自己学习就好。 - -单就从我的 [代码随想录算法公开课](https://mp.weixin.qq.com/s/xncn6IHJGs45sJOChN6V_g) 来说,质量如何,大家可以去看评论区,我完全可以把它做成付费的视频课,但我还是选择免费开放给大家,目前一周会更新四个算法视频,已经快把二叉树系列更完了。 - -之所以做训练营,是因为大家太多的问题,不是视频或者文章教程可以解决的,需要的是规划,组织,监督和答疑。 - -所以我才组织训练营,搞成付费的也是为了质量更高一些,同时也是因为需要一些门槛,要不然就和普通刷题群没什么区别了。 - -等大家跟着代码随想录训练营一路走下来之后,大家再回顾自己两个月学习的内容和总结的博客,**一定会发现 这个价格 物超所值**! - -关于训练营的任何疑问都可以扫码联系客服 - -
- - - - - - From 4b01a7d5e412f393f81a66212360f16fd14ddbbf Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Fri, 14 Mar 2025 17:11:14 +0800 Subject: [PATCH 3011/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E8=A1=A8=E8=BE=BE?= =?UTF-8?q?=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...64\346\265\201\351\227\256\351\242\230.md" | 4 ++-- ...46\344\270\262\346\216\245\351\276\231.md" | 21 ++++++++++++++----- 2 files changed, 18 insertions(+), 7 deletions(-) diff --git "a/problems/kamacoder/0103.\346\260\264\346\265\201\351\227\256\351\242\230.md" "b/problems/kamacoder/0103.\346\260\264\346\265\201\351\227\256\351\242\230.md" index 31f5f1d9d4..1c646b1c03 100644 --- "a/problems/kamacoder/0103.\346\260\264\346\265\201\351\227\256\351\242\230.md" +++ "b/problems/kamacoder/0103.\346\260\264\346\265\201\351\227\256\351\242\230.md" @@ -111,14 +111,14 @@ bool isResult(vector>& grid, int x, int y) { break; } } - // 第二边界右边 + // 第二边界下边 for (int j = 0; j < m; j++) { if (visited[n - 1][j]) { isSecond = true; break; } } - // 第二边界下边 + // 第二边界右边 for (int i = 0; i < n; i++) { if (visited[i][m - 1]) { isSecond = true; diff --git "a/problems/kamacoder/0110.\345\255\227\347\254\246\344\270\262\346\216\245\351\276\231.md" "b/problems/kamacoder/0110.\345\255\227\347\254\246\344\270\262\346\216\245\351\276\231.md" index 3b6c20ca08..5f11e4fbfa 100644 --- "a/problems/kamacoder/0110.\345\255\227\347\254\246\344\270\262\346\216\245\351\276\231.md" +++ "b/problems/kamacoder/0110.\345\255\227\347\254\246\344\270\262\346\216\245\351\276\231.md" @@ -13,10 +13,14 @@ 2. 序列中最后一个字符串是 endStr。 -3. 每次转换只能改变一个字符。 +3. **每次转换只能改变一个位置的字符**(例如 ftr 可以转化 fty ,但 ftr 不能转化 frx)。 4. 转换过程中的中间字符串必须是字典 strList 中的字符串。 +5. beginStr 和 endStr 不在 字典 strList 中 + +6. 字符串中只有小写的26个字母 + 给你两个字符串 beginStr 和 endStr 和一个字典 strList,找到从 beginStr 到 endStr 的最短转换序列中的字符串数目。如果不存在这样的转换序列,返回 0。 输入描述 @@ -67,16 +71,23 @@ yhn 所以这道题要解决两个问题: -* 图中的线是如何连在一起的 -* 起点和终点的最短路径长度 +1、图中的线是如何连在一起的 + +在搜索的过程中,我们可以枚举,用26个字母替换当前字符串的每一个字符,在看替换后 是否在 strList里出现过,就可以判断 两个字符串 是否是链接的。 + +2、起点和终点的最短路径长度 首先题目中并没有给出点与点之间的连线,而是要我们自己去连,条件是字符只能差一个。 所以判断点与点之间的关系,需要判断是不是差一个字符,**如果差一个字符,那就是有链接**。 -然后就是求起点和终点的最短路径长度,**这里无向图求最短路,广搜最为合适,广搜只要搜到了终点,那么一定是最短的路径**。因为广搜就是以起点中心向四周扩散的搜索。 +然后就是求起点和终点的最短路径长度,在无权图中,求最短路,用深搜或者广搜就行,没必要用最短路算法。 + +**在无权图中,用广搜求最短路最为合适,广搜只要搜到了终点,那么一定是最短的路径**。因为广搜就是以起点中心向四周扩散的搜索。 + +**本题如果用深搜,会比较麻烦,要在到达终点的不同路径中选则一条最短路**。 -**本题如果用深搜,会比较麻烦,要在到达终点的不同路径中选则一条最短路**。 而广搜只要达到终点,一定是最短路。 +而广搜只要达到终点,一定是最短路。 另外需要有一个注意点: From ca2cffabd0ac5e2c6efab2be56743265fbe521c4 Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Fri, 14 Mar 2025 17:35:33 +0800 Subject: [PATCH 3012/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0readme?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index b1db51c903..acd07c28d0 100644 --- a/README.md +++ b/README.md @@ -69,13 +69,14 @@ ## 前序 -* [「代码随想录」学习社区](https://programmercarl.com/other/kstar.html) +* [做项目(多个C++、Java、Go、前端、测开项目)](https://programmercarl.com/other/kstar.html) * 编程语言 * [C++面试&C++学习指南知识点整理](https://github.com/youngyangyang04/TechCPP) * [编程语言基础课](https://kamacoder.com/courseshop.php) * [23种设计模式](https://github.com/youngyangyang04/kama-DesignPattern) + * [大厂算法笔试题](https://kamacoder.com/company.php) * 工具 * [一站式vim配置](https://github.com/youngyangyang04/PowerVim) @@ -384,10 +385,10 @@ 8. [图论:孤岛的总面积](./problems/kamacoder/0101.孤岛的总面积.md) 9. [图论:沉没孤岛](./problems/kamacoder/0102.沉没孤岛.md) 10. [图论:水流问题](./problems/kamacoder/0103.水流问题.md) -11. [图论:建造最大岛屿](./problems/kamacoder/0104.建造最大岛屿.md) -12. [图论:字符串接龙](./problems/kamacoder/0110.字符串接龙.md) -13. [图论:有向图的完全可达性](./problems/kamacoder/0105.有向图的完全可达性.md) -14. [图论:岛屿的周长](./problems/kamacoder/0106.岛屿的周长.md) +11. [图论:岛屿的周长](./problems/kamacoder/0106.岛屿的周长.md) +12. [图论:建造最大岛屿](./problems/kamacoder/0104.建造最大岛屿.md) +13. [图论:字符串接龙](./problems/kamacoder/0110.字符串接龙.md) +14. [图论:有向图的完全可达性](./problems/kamacoder/0105.有向图的完全可达性.md) 15. [图论:并查集理论基础](./problems/kamacoder/图论并查集理论基础.md) 16. [图论:寻找存在的路径](./problems/kamacoder/0107.寻找存在的路径.md) 17. [图论:冗余连接](./problems/kamacoder/0108.冗余连接.md) From 0881fb5e81154b1c55cd663d86bf0d89381be935 Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Fri, 14 Mar 2025 18:05:33 +0800 Subject: [PATCH 3013/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=9B=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...227\347\254\246\344\270\262\346\216\245\351\276\231.md" | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git "a/problems/kamacoder/0110.\345\255\227\347\254\246\344\270\262\346\216\245\351\276\231.md" "b/problems/kamacoder/0110.\345\255\227\347\254\246\344\270\262\346\216\245\351\276\231.md" index 5f11e4fbfa..f6d97866da 100644 --- "a/problems/kamacoder/0110.\345\255\227\347\254\246\344\270\262\346\216\245\351\276\231.md" +++ "b/problems/kamacoder/0110.\345\255\227\347\254\246\344\270\262\346\216\245\351\276\231.md" @@ -57,7 +57,11 @@ yhn 2 <= N <= 500

+<<<<<<< HEAD +======= + +>>>>>>> d0bd2dc5 (更新图)

@@ -65,7 +69,8 @@ yhn 以示例1为例,从这个图中可以看出 abc 到 def的路线 不止一条,但最短的一条路径上是4个节点。 -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240529121038.png) +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20250317105155.png) + 本题只需要求出最短路径的长度就可以了,不用找出具体路径。 From f3c481e80b57b77fc338bc0ee7c2d6514f74ef17 Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Fri, 14 Mar 2025 18:05:59 +0800 Subject: [PATCH 3014/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=96=87=E7=AB=A0?= =?UTF-8?q?=E5=A4=B4=E9=83=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...44\346\225\260\344\271\213\345\222\214.md" | 12 +++------ ...36\346\226\207\345\255\220\344\270\262.md" | 12 +++------ ...11\346\225\260\344\271\213\345\222\214.md" | 12 +++------ ...27\346\257\215\347\273\204\345\220\210.md" | 12 +++------ ...33\346\225\260\344\271\213\345\222\214.md" | 12 +++------ ...4N\344\270\252\350\212\202\347\202\271.md" | 12 +++------ ...10\347\232\204\346\213\254\345\217\267.md" | 12 +++------ ...55\347\232\204\350\212\202\347\202\271.md" | 12 +++------ ...73\351\231\244\345\205\203\347\264\240.md" | 12 +++------ .../0028.\345\256\236\347\216\260strStr.md" | 12 +++------ ...00\344\270\252\346\216\222\345\210\227.md" | 12 +++------ ...00\344\270\252\344\275\215\347\275\256.md" | 12 +++------ ...22\345\205\245\344\275\215\347\275\256.md" | 12 +++------ ...7.\350\247\243\346\225\260\347\213\254.md" | 12 +++------ ...04\345\220\210\346\200\273\345\222\214.md" | 12 +++------ ...\345\220\210\346\200\273\345\222\214II.md" | 12 +++------ ...2.\346\216\245\351\233\250\346\260\264.md" | 12 +++------ ...\350\267\203\346\270\270\346\210\217II.md" | 12 +++------ ...6.\345\205\250\346\216\222\345\210\227.md" | 12 +++------ ...\345\205\250\346\216\222\345\210\227II.md" | 12 +++------ "problems/0051.N\347\232\207\345\220\216.md" | 12 +++------ .../0052.N\347\232\207\345\220\216II.md" | 12 +++------ ...47\345\255\220\345\272\217\345\222\214.md" | 12 +++------ ...01\350\247\204\345\210\222\357\274\211.md" | 12 +++------ ...72\346\227\213\347\237\251\351\230\265.md" | 12 +++------ ...63\350\267\203\346\270\270\346\210\217.md" | 12 +++------ ...10\345\271\266\345\214\272\351\227\264.md" | 12 +++------ ...\346\227\213\347\237\251\351\230\265II.md" | 12 +++------ ...15\345\220\214\350\267\257\345\276\204.md" | 12 +++------ ...\345\220\214\350\267\257\345\276\204II.md" | 12 +++------ ...0.\347\210\254\346\245\274\346\242\257.md" | 12 +++------ ...14\345\214\205\347\211\210\346\234\254.md" | 12 +++------ ...26\350\276\221\350\267\235\347\246\273.md" | 12 +++------ "problems/0077.\347\273\204\345\220\210.md" | 12 +++------ ...04\345\220\210\344\274\230\345\214\226.md" | 12 +++------ "problems/0078.\345\255\220\351\233\206.md" | 12 +++------ ...47\347\232\204\347\237\251\345\275\242.md" | 12 +++------ "problems/0090.\345\255\220\351\233\206II.md" | 12 +++------ ...\345\216\237IP\345\234\260\345\235\200.md" | 12 +++------ ...11\346\220\234\347\264\242\346\240\221.md" | 12 +++------ ...11\346\220\234\347\264\242\346\240\221.md" | 12 +++------ ...70\345\220\214\347\232\204\346\240\221.md" | 12 +++------ ...60\344\272\214\345\217\211\346\240\221.md" | 12 +++------ ...02\345\272\217\351\201\215\345\216\206.md" | 12 +++------ ...00\345\244\247\346\267\261\345\272\246.md" | 12 +++------ ...40\344\272\214\345\217\211\346\240\221.md" | 12 +++------ ...11\346\220\234\347\264\242\346\240\221.md" | 12 +++------ ...41\344\272\214\345\217\211\346\240\221.md" | 12 +++------ ...00\345\260\217\346\267\261\345\272\246.md" | 12 +++------ ...57\345\276\204\346\200\273\345\222\214.md" | 12 +++------ ...04\345\255\220\345\272\217\345\210\227.md" | 12 +++------ ...02\347\202\271\346\214\207\351\222\210.md" | 12 +++------ ...00\344\275\263\346\227\266\346\234\272.md" | 12 +++------ ...\344\275\263\346\227\266\346\234\272II.md" | 12 +++------ ...01\350\247\204\345\210\222\357\274\211.md" | 12 +++------ ...344\275\263\346\227\266\346\234\272III.md" | 12 +++------ ...25\350\257\215\346\216\245\351\276\231.md" | 12 +++------ ...60\345\255\227\344\271\213\345\222\214.md" | 12 +++------ ...25\347\232\204\345\214\272\345\237\237.md" | 12 +++------ ...62\345\233\236\346\226\207\344\270\262.md" | 12 +++------ ...\345\233\236\346\226\207\344\270\262II.md" | 12 +++------ ...4.\345\212\240\346\262\271\347\253\231.md" | 12 +++------ ...06\345\217\221\347\263\226\346\236\234.md" | 12 +++------ ...25\350\257\215\346\213\206\345\210\206.md" | 12 +++------ ...57\345\275\242\351\223\276\350\241\250.md" | 12 +++------ ...\345\275\242\351\223\276\350\241\250II.md" | 12 +++------ ...15\346\216\222\351\223\276\350\241\250.md" | 12 +++------ ...76\345\274\217\346\261\202\345\200\274.md" | 12 +++------ ...14\347\232\204\345\215\225\350\257\215.md" | 12 +++------ ...70\344\272\244\351\223\276\350\241\250.md" | 12 +++------ ...\344\275\263\346\227\266\346\234\272IV.md" | 12 +++------ ...13\350\275\254\346\225\260\347\273\204.md" | 12 +++------ ...23\345\256\266\345\212\253\350\210\215.md" | 12 +++------ ...7.\345\271\277\346\220\234\347\211\210.md" | 12 +++------ ...7.\346\267\261\346\220\234\347\211\210.md" | 12 +++------ ...2.\345\277\253\344\271\220\346\225\260.md" | 12 +++------ ...76\350\241\250\345\205\203\347\264\240.md" | 12 +++------ ...04\345\255\227\347\254\246\344\270\262.md" | 12 +++------ ...73\350\275\254\351\223\276\350\241\250.md" | 12 +++------ ...7.\350\257\276\347\250\213\350\241\250.md" | 12 +++------ ...04\345\255\220\346\225\260\347\273\204.md" | 12 +++------ ...\350\257\276\347\250\213\350\241\250II.md" | 3 +++ ...\345\256\266\345\212\253\350\210\215II.md" | 12 +++------ ...345\220\210\346\200\273\345\222\214III.md" | 12 +++------ ...02\347\202\271\344\270\252\346\225\260.md" | 12 +++------ ...27\345\256\236\347\216\260\346\240\210.md" | 12 +++------ ...54\344\272\214\345\217\211\346\240\221.md" | 12 +++------ ...36\347\216\260\351\230\237\345\210\227.md" | 12 +++------ ...36\346\226\207\351\223\276\350\241\250.md" | 12 +++------ ...54\345\205\261\347\245\226\345\205\210.md" | 12 +++------ ...54\345\205\261\347\245\226\345\205\210.md" | 12 +++------ ...43\346\234\200\345\244\247\345\200\274.md" | 12 +++------ ...15\345\274\202\344\275\215\350\257\215.md" | 12 +++------ ...00\346\234\211\350\267\257\345\276\204.md" | 12 +++------ ...50\345\271\263\346\226\271\346\225\260.md" | 12 +++------ ...3.\347\247\273\345\212\250\351\233\266.md" | 12 +++------ ...07\345\255\220\345\272\217\345\210\227.md" | 12 +++------ ...53\345\206\267\345\206\273\346\234\237.md" | 12 +++------ ...66\351\222\261\345\205\221\346\215\242.md" | 12 +++------ ...11\346\216\222\350\241\214\347\250\213.md" | 12 +++------ ...345\256\266\345\212\253\350\210\215III.md" | 12 +++------ ...64\346\225\260\346\213\206\345\210\206.md" | 12 +++------ ...54\345\255\227\347\254\246\344\270\262.md" | 12 +++------ ...30\351\242\221\345\205\203\347\264\240.md" | 12 +++------ ...04\347\232\204\344\272\244\351\233\206.md" | 12 +++------ ...06\345\212\250\345\272\217\345\210\227.md" | 12 +++------ ...10\346\200\273\345\222\214\342\205\243.md" | 12 +++------ ...3.\350\265\216\351\207\221\344\277\241.md" | 12 +++------ ...55\345\255\220\345\272\217\345\210\227.md" | 12 +++------ ...66\345\255\220\344\271\213\345\222\214.md" | 12 +++------ ...15\345\273\272\351\230\237\345\210\227.md" | 12 +++------ ...11\345\222\214\345\255\220\351\233\206.md" | 12 +++------ ...64\346\265\201\351\227\256\351\242\230.md" | 12 +++------ ...15\345\217\240\345\214\272\351\227\264.md" | 12 +++------ ...55\347\232\204\350\212\202\347\202\271.md" | 12 +++------ ...25\347\210\206\346\260\224\347\220\203.md" | 12 +++------ ...\346\225\260\347\233\270\345\212\240II.md" | 12 +++------ ...06\345\217\221\351\245\274\345\271\262.md" | 12 +++------ ...20\345\255\227\347\254\246\344\270\262.md" | 12 +++------ ...77\347\232\204\345\221\250\351\225\277.md" | 12 +++------ ...4.\344\270\200\345\222\214\351\233\266.md" | 12 +++------ ...36\345\255\220\345\272\217\345\210\227.md" | 12 +++------ ...4.\347\233\256\346\240\207\345\222\214.md" | 12 +++------ ...4\345\244\247\345\205\203\347\264\240I.md" | 12 +++------ ...55\347\232\204\344\274\227\346\225\260.md" | 12 +++------ ...\345\244\247\345\205\203\347\264\240II.md" | 12 +++------ ...42\351\202\243\345\245\221\346\225\260.md" | 12 +++------ ...13\350\247\222\347\232\204\345\200\274.md" | 12 +++------ ...07\345\255\220\345\272\217\345\210\227.md" | 12 +++------ ...\351\222\261\345\205\221\346\215\242II.md" | 12 +++------ ...17\347\273\235\345\257\271\345\267\256.md" | 12 +++------ ...72\347\264\257\345\212\240\346\240\221.md" | 12 +++------ ...\345\255\227\347\254\246\344\270\262II.md" | 12 +++------ ...40\351\231\244\346\223\215\344\275\234.md" | 12 +++------ ...66\344\272\214\345\217\211\346\240\221.md" | 12 +++------ ...36\346\226\207\345\255\220\344\270\262.md" | 12 +++------ ...a2\345\217\202\350\256\256\351\231\242.md" | 12 +++------ ...47\344\272\214\345\217\211\346\240\221.md" | 12 +++------ ...24\345\233\236\345\216\237\347\202\271.md" | 12 +++------ ...11\346\220\234\347\264\242\346\240\221.md" | 12 +++------ ...27\347\232\204\344\270\252\346\225\260.md" | 12 +++------ ...22\345\242\236\345\272\217\345\210\227.md" | 12 +++------ ...27\344\275\231\350\277\236\346\216\245.md" | 12 +++------ ...\344\275\231\350\277\236\346\216\245II.md" | 12 +++------ ...00\345\244\247\351\235\242\347\247\257.md" | 12 +++------ ...55\347\232\204\346\220\234\347\264\242.md" | 12 +++------ ...22\345\205\245\346\223\215\344\275\234.md" | 12 +++------ ...14\345\210\206\346\237\245\346\211\276.md" | 12 +++------ ...76\350\256\241\351\223\276\350\241\250.md" | 12 +++------ ...53\346\211\213\347\273\255\350\264\271.md" | 12 +++------ ...01\350\247\204\345\210\222\357\274\211.md" | 12 +++------ ...15\345\255\220\346\225\260\347\273\204.md" | 12 +++------ ...55\345\277\203\347\264\242\345\274\225.md" | 12 +++------ ...36\347\232\204\346\225\260\345\255\227.md" | 12 +++------ ...17\346\227\245\346\270\251\345\272\246.md" | 12 +++------ ...66\350\277\237\346\227\266\351\227\264.md" | 3 +++ ...71\347\210\254\346\245\274\346\242\257.md" | 12 +++------ ...27\346\257\215\345\214\272\351\227\264.md" | 12 +++------ ...34\347\232\204\350\210\252\347\217\255.md" | 12 +++------ ...75\347\232\204\350\267\257\345\276\204.md" | 12 +++------ ...47\344\272\272\345\267\245\345\262\233.md" | 12 +++------ ...31\345\222\214\346\210\277\351\227\264.md" | 12 +++------ ...04\345\255\227\347\254\246\344\270\262.md" | 12 +++------ ...54\346\260\264\346\211\276\351\233\266.md" | 12 +++------ ...\345\272\217\346\225\260\347\273\204II.md" | 12 +++------ ...77\346\214\211\351\224\256\345\205\245.md" | 12 +++------ ...61\350\204\211\346\225\260\347\273\204.md" | 12 +++------ ...47\344\272\214\345\217\211\346\240\221.md" | 12 +++------ ...04\347\232\204\345\271\263\346\226\271.md" | 12 +++------ ...70\347\224\250\345\255\227\347\254\246.md" | 12 +++------ ...04\346\225\260\347\273\204\345\222\214.md" | 12 +++------ ...60\347\232\204\346\225\260\351\207\217.md" | 12 +++------ ...70\344\272\244\347\232\204\347\272\277.md" | 12 +++------ ...73\351\207\215\345\244\215\351\241\271.md" | 12 +++------ ...\347\232\204\351\207\215\351\207\217II.md" | 12 +++------ ...61\345\255\220\345\272\217\345\210\227.md" | 12 +++------ ...72\347\216\260\346\254\241\346\225\260.md" | 12 +++------ ...41\345\255\227\347\254\246\344\270\262.md" | 12 +++------ ...77\347\232\204\346\225\260\347\233\256.md" | 12 +++------ ...21\347\232\204\345\237\216\345\270\202.md" | 12 +++------ ...60\347\233\256\346\216\222\345\272\217.md" | 12 +++------ ...27\347\232\204\346\225\260\345\255\227.md" | 12 +++------ ...21\345\217\230\345\271\263\350\241\241.md" | 12 +++------ ...55\345\277\203\350\212\202\347\202\271.md" | 12 +++------ ...30\345\234\250\350\267\257\345\276\204.md" | 12 +++------ ...57\345\244\232\345\244\247\357\274\237.md" | 12 +++------ ...44\270\262\346\216\245\351\276\231-03.png" | Bin 0 -> 56769 bytes problems/toolgithub.sh | 24 +++++++++++------- ...11\346\255\245\351\223\272\345\236\253.md" | 12 +++------ ...46\347\235\200\345\233\236\346\272\257.md" | 12 +++------ ...21\346\200\273\347\273\223\347\257\207.md" | 12 +++------ ...06\350\256\272\345\237\272\347\241\200.md" | 12 +++------ ...00\350\277\255\344\273\243\346\263\225.md" | 12 +++------ ...55\344\273\243\351\201\215\345\216\206.md" | 12 +++------ ...22\345\275\222\351\201\215\345\216\206.md" | 12 +++------ ...77\346\215\242\347\251\272\346\240\274.md" | 12 +++------ ...54\345\255\227\347\254\246\344\270\262.md" | 12 +++------ ...30\346\200\273\347\273\223\347\257\207.md" | 12 +++------ ...22\346\200\273\347\273\223\347\257\207.md" | 12 +++------ ...06\350\256\272\345\237\272\347\241\200.md" | 12 +++------ ...07\351\222\210\346\200\273\347\273\223.md" | 12 +++------ ...14\350\241\250\346\200\273\347\273\223.md" | 12 +++------ ...06\350\256\272\345\237\272\347\241\200.md" | 12 +++------ ...36\346\272\257\346\200\273\347\273\223.md" | 12 +++------ ...00\347\247\215\345\206\231\346\263\225.md" | 12 +++------ ...06\350\256\272\345\237\272\347\241\200.md" | 12 +++------ ...46\344\270\262\346\200\273\347\273\223.md" | 12 +++------ ...04\346\200\273\347\273\223\347\257\207.md" | 12 +++------ ...06\350\256\272\345\237\272\347\241\200.md" | 12 +++------ ...37\345\210\227\346\200\273\347\273\223.md" | 12 +++------ ...06\350\256\272\345\237\272\347\241\200.md" | 12 +++------ ...06\350\256\262\350\247\243\357\274\211.md" | 12 +++------ ...27\346\263\225\346\250\241\346\235\277.md" | 12 +++------ ...05\346\200\273\347\273\223\347\257\207.md" | 12 +++------ ...47\241\20001\350\203\214\345\214\205-1.md" | 12 +++------ ...47\241\20001\350\203\214\345\214\205-2.md" | 12 +++------ ...14\345\214\205\344\270\200\347\273\264.md" | 3 +++ ...32\351\207\215\350\203\214\345\214\205.md" | 12 +++------ ...14\345\205\250\350\203\214\345\214\205.md" | 12 +++------ ...25\346\200\273\347\273\223\347\257\207.md" | 12 +++------ ...06\350\256\272\345\237\272\347\241\200.md" | 12 +++------ ...50\346\200\273\347\273\223\347\257\207.md" | 12 +++------ ...06\350\256\272\345\237\272\347\241\200.md" | 12 +++------ ...76\350\241\250\347\233\270\344\272\244.md" | 12 +++------ 224 files changed, 681 insertions(+), 1980 deletions(-) create mode 100644 "problems/images/0110.\345\255\227\347\254\246\344\270\262\346\216\245\351\276\231-03.png" diff --git "a/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" "b/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" index e982ae129b..6be92fa81b 100644 --- "a/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 1. 两数之和 @@ -557,7 +555,3 @@ int* twoSum(int* nums, int numsSize, int target, int* returnSize){ } ``` -

- - - diff --git "a/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" "b/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" index b3d3b93896..4ce49810b3 100644 --- "a/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" +++ "b/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) @@ -731,8 +729,4 @@ public class Solution { ``` -

- - - diff --git "a/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" "b/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" index 1685db7452..52dbdab7b5 100644 --- "a/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) @@ -980,7 +978,3 @@ object Solution { } ``` -

- - - diff --git "a/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" "b/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" index 9a320ca0e6..93f41e0f74 100644 --- "a/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" +++ "b/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 17.电话号码的字母组合 @@ -766,7 +764,3 @@ public class Solution ``` -

- - - diff --git "a/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" "b/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" index f3188b0f13..bf7d3bd4ee 100644 --- "a/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) > 一样的道理,能解决四数之和 @@ -798,8 +796,4 @@ def four_sum(nums, target) end ``` -

- - - diff --git "a/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" "b/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" index 16312d0fc4..53b59039e5 100644 --- "a/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" +++ "b/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) @@ -479,7 +477,3 @@ public class Solution { } } ``` -

- - - diff --git "a/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" "b/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" index 2475138ebb..c642fb4ecd 100644 --- "a/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" +++ "b/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) @@ -574,8 +572,4 @@ impl Solution { } ``` -

- - - diff --git "a/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" "b/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" index 305bb7ccba..b9494297e4 100644 --- "a/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" +++ "b/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 24. 两两交换链表中的节点 @@ -527,7 +525,3 @@ public ListNode SwapPairs(ListNode head) } ``` -

- - - diff --git "a/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" "b/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" index 10817ba6b7..d01765ff66 100644 --- "a/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" +++ "b/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 27. 移除元素 @@ -519,7 +517,3 @@ int removeElement(List nums, int val) { ``` -

- - - diff --git "a/problems/0028.\345\256\236\347\216\260strStr.md" "b/problems/0028.\345\256\236\347\216\260strStr.md" index 63a08d960d..b25cb301f9 100644 --- "a/problems/0028.\345\256\236\347\216\260strStr.md" +++ "b/problems/0028.\345\256\236\347\216\260strStr.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) > 在一个串中查找是否出现过另一个串,这是KMP的看家本领。 @@ -1520,7 +1518,3 @@ int strStr(char* haystack, char* needle) { } ``` -

- - - diff --git "a/problems/0031.\344\270\213\344\270\200\344\270\252\346\216\222\345\210\227.md" "b/problems/0031.\344\270\213\344\270\200\344\270\252\346\216\222\345\210\227.md" index 48af8d0da1..95bb1d899e 100644 --- "a/problems/0031.\344\270\213\344\270\200\344\270\252\346\216\222\345\210\227.md" +++ "b/problems/0031.\344\270\213\344\270\200\344\270\252\346\216\222\345\210\227.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) @@ -269,7 +267,3 @@ var nextPermutation = function(nums) { -

- - - diff --git "a/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" "b/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" index 16adcdf19c..37248e4819 100644 --- "a/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" +++ "b/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 34. 在排序数组中查找元素的第一个和最后一个位置 @@ -855,7 +853,3 @@ int* searchRange(int* nums, int numsSize, int target, int* returnSize){ ``` -

- - - diff --git "a/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" "b/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" index b5be9a5f8b..e0b065cd5a 100644 --- "a/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" +++ "b/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) @@ -549,7 +547,3 @@ int searchInsert(int* nums, int numsSize, int target){ ``` -

- - - diff --git "a/problems/0037.\350\247\243\346\225\260\347\213\254.md" "b/problems/0037.\350\247\243\346\225\260\347\213\254.md" index 5f3f881cf1..b26bf53308 100644 --- "a/problems/0037.\350\247\243\346\225\260\347\213\254.md" +++ "b/problems/0037.\350\247\243\346\225\260\347\213\254.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) @@ -893,7 +891,3 @@ public class Solution ``` -

- - - diff --git "a/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" "b/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" index 92c68562da..455bd697cd 100644 --- "a/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" +++ "b/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) @@ -661,7 +659,3 @@ public class Solution -

- - - diff --git "a/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" "b/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" index 22cf726d8c..281db4dc86 100644 --- "a/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" +++ "b/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) > 这篇可以说是全网把组合问题如何去重,讲的最清晰的了! @@ -807,7 +805,3 @@ public class Solution } ``` -

- - - diff --git "a/problems/0042.\346\216\245\351\233\250\346\260\264.md" "b/problems/0042.\346\216\245\351\233\250\346\260\264.md" index 0484f830f6..8a424e3ea2 100644 --- "a/problems/0042.\346\216\245\351\233\250\346\260\264.md" +++ "b/problems/0042.\346\216\245\351\233\250\346\260\264.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) @@ -1095,7 +1093,3 @@ impl Solution { } ``` -

- - - diff --git "a/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" "b/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" index 8919d39367..a20eb2a6a9 100644 --- "a/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" +++ "b/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) > 相对于[贪心算法:跳跃游戏](https://mp.weixin.qq.com/s/606_N9j8ACKCODoCbV1lSA)难了不少,做好心理准备! @@ -542,7 +540,3 @@ public class Solution ``` -

- - - diff --git "a/problems/0046.\345\205\250\346\216\222\345\210\227.md" "b/problems/0046.\345\205\250\346\216\222\345\210\227.md" index ca465efd6f..611a4cb1e0 100644 --- "a/problems/0046.\345\205\250\346\216\222\345\210\227.md" +++ "b/problems/0046.\345\205\250\346\216\222\345\210\227.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 46.全排列 @@ -521,8 +519,4 @@ public class Solution ``` -

- - - diff --git "a/problems/0047.\345\205\250\346\216\222\345\210\227II.md" "b/problems/0047.\345\205\250\346\216\222\345\210\227II.md" index 08e3c616a2..1e51a7bcd7 100644 --- "a/problems/0047.\345\205\250\346\216\222\345\210\227II.md" +++ "b/problems/0047.\345\205\250\346\216\222\345\210\227II.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) @@ -555,7 +553,3 @@ public class Solution ``` -

- - - diff --git "a/problems/0051.N\347\232\207\345\220\216.md" "b/problems/0051.N\347\232\207\345\220\216.md" index 38fc07e790..b201b55fe4 100644 --- "a/problems/0051.N\347\232\207\345\220\216.md" +++ "b/problems/0051.N\347\232\207\345\220\216.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 51. N皇后 @@ -921,7 +919,3 @@ public class Solution ``` -

- - - diff --git "a/problems/0052.N\347\232\207\345\220\216II.md" "b/problems/0052.N\347\232\207\345\220\216II.md" index 271484a4ee..11c257b073 100644 --- "a/problems/0052.N\347\232\207\345\220\216II.md" +++ "b/problems/0052.N\347\232\207\345\220\216II.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) @@ -307,7 +305,3 @@ class Solution { } ``` -

- - - diff --git "a/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" "b/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" index 705a00d7a8..6f8c2a6e7e 100644 --- "a/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" +++ "b/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 53. 最大子序和 @@ -492,7 +490,3 @@ public class Solution ``` -

- - - diff --git "a/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" "b/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" index 38a3a11818..568626dc6d 100644 --- "a/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" +++ "b/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 53. 最大子序和 @@ -244,7 +242,3 @@ function maxSubArray(nums: number[]): number { -

- - - diff --git "a/problems/0054.\350\236\272\346\227\213\347\237\251\351\230\265.md" "b/problems/0054.\350\236\272\346\227\213\347\237\251\351\230\265.md" index 3b7afb9099..7d7f460f01 100644 --- "a/problems/0054.\350\236\272\346\227\213\347\237\251\351\230\265.md" +++ "b/problems/0054.\350\236\272\346\227\213\347\237\251\351\230\265.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) @@ -485,7 +483,3 @@ func min(x, y int) int { ``` -

- - - diff --git "a/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" "b/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" index 896dc998d1..3ab004b2aa 100644 --- "a/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" +++ "b/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 55. 跳跃游戏 @@ -293,7 +291,3 @@ public class Solution } ``` -

- - - diff --git "a/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" "b/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" index 538be69336..76792dbae1 100644 --- "a/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" +++ "b/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 56. 合并区间 @@ -405,7 +403,3 @@ public class Solution } ``` -

- - - diff --git "a/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" "b/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" index 94966126b9..9961c0e70b 100644 --- "a/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" +++ "b/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) @@ -829,7 +827,3 @@ def generate_matrix(n) end ``` -

- - - diff --git "a/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" "b/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" index 7025135ade..23cd8060fa 100644 --- "a/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" +++ "b/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) @@ -616,7 +614,3 @@ public class Solution -

- - - diff --git "a/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" "b/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" index 13923abeca..61d9329d4b 100644 --- "a/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" +++ "b/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) @@ -781,7 +779,3 @@ public class Solution ``` -

- - - diff --git "a/problems/0070.\347\210\254\346\245\274\346\242\257.md" "b/problems/0070.\347\210\254\346\245\274\346\242\257.md" index 6a13a21cdb..92c3858698 100644 --- "a/problems/0070.\347\210\254\346\245\274\346\242\257.md" +++ "b/problems/0070.\347\210\254\346\245\274\346\242\257.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 70. 爬楼梯 @@ -520,8 +518,4 @@ impl Solution { ``` -

- - - diff --git "a/problems/0070.\347\210\254\346\245\274\346\242\257\345\256\214\345\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md" "b/problems/0070.\347\210\254\346\245\274\346\242\257\345\256\214\345\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md" index c51a590baf..a5435ddd71 100644 --- "a/problems/0070.\347\210\254\346\245\274\346\242\257\345\256\214\345\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md" +++ "b/problems/0070.\347\210\254\346\245\274\346\242\257\345\256\214\345\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 70. 爬楼梯(进阶版) @@ -252,7 +250,3 @@ var climbStairs = function (n: number): number { ### Rust: -

- - - diff --git "a/problems/0072.\347\274\226\350\276\221\350\267\235\347\246\273.md" "b/problems/0072.\347\274\226\350\276\221\350\267\235\347\246\273.md" index 0da3bf5093..408999d873 100644 --- "a/problems/0072.\347\274\226\350\276\221\350\267\235\347\246\273.md" +++ "b/problems/0072.\347\274\226\350\276\221\350\267\235\347\246\273.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 72. 编辑距离 @@ -462,7 +460,3 @@ impl Solution { } ``` -

- - - diff --git "a/problems/0077.\347\273\204\345\220\210.md" "b/problems/0077.\347\273\204\345\220\210.md" index c4be5a3804..60900d76a6 100644 --- "a/problems/0077.\347\273\204\345\220\210.md" +++ "b/problems/0077.\347\273\204\345\220\210.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 第77题. 组合 @@ -876,7 +874,3 @@ public class Solution } ``` -

- - - diff --git "a/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" "b/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" index 0fa568afe9..e2ca3d7d0a 100644 --- "a/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" +++ "b/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) @@ -412,7 +410,3 @@ object Solution { ``` -

- - - diff --git "a/problems/0078.\345\255\220\351\233\206.md" "b/problems/0078.\345\255\220\351\233\206.md" index 0c368b41ed..73eb385bc1 100644 --- "a/problems/0078.\345\255\220\351\233\206.md" +++ "b/problems/0078.\345\255\220\351\233\206.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 78.子集 @@ -492,7 +490,3 @@ public class Solution { -

- - - diff --git "a/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" "b/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" index 5c6f407321..6577cf542d 100644 --- "a/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" +++ "b/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 84.柱状图中最大的矩形 @@ -863,7 +861,3 @@ impl Solution { ``` -

- - - diff --git "a/problems/0090.\345\255\220\351\233\206II.md" "b/problems/0090.\345\255\220\351\233\206II.md" index 811d3cc005..3bda02bc9e 100644 --- "a/problems/0090.\345\255\220\351\233\206II.md" +++ "b/problems/0090.\345\255\220\351\233\206II.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 90.子集II @@ -697,7 +695,3 @@ public class Solution ``` -

- - - diff --git "a/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" "b/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" index a03a0e3b15..1a89827897 100644 --- "a/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" +++ "b/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) @@ -876,7 +874,3 @@ public class Solution -

- - - diff --git "a/problems/0096.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0096.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" index 25d79aff74..f4e0e456b7 100644 --- "a/problems/0096.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" +++ "b/problems/0096.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) @@ -348,7 +346,3 @@ public class Solution } ``` -

- - - diff --git "a/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" index fb4ca7d88d..22a47f9632 100644 --- "a/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" +++ "b/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 98.验证二叉搜索树 @@ -807,7 +805,3 @@ public bool IsValidBST(TreeNode root) ``` -

- - - diff --git "a/problems/0100.\347\233\270\345\220\214\347\232\204\346\240\221.md" "b/problems/0100.\347\233\270\345\220\214\347\232\204\346\240\221.md" index 7268b9f083..52c9fcf2e7 100644 --- "a/problems/0100.\347\233\270\345\220\214\347\232\204\346\240\221.md" +++ "b/problems/0100.\347\233\270\345\220\214\347\232\204\346\240\221.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) @@ -340,7 +338,3 @@ function isSameTree(p: TreeNode | null, q: TreeNode | null): boolean { -

- - - diff --git "a/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" "b/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" index 31c24fc5aa..f066408408 100644 --- "a/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 101. 对称二叉树 @@ -946,8 +944,4 @@ public bool IsSymmetric(TreeNode root) ``` -

- - - diff --git "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" index ce53e49af9..da2d85c99d 100644 --- "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" +++ "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) @@ -3601,7 +3599,3 @@ impl Solution { **致敬叶师傅!** -

- - - diff --git "a/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" "b/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" index fdc9009603..6b9994ed93 100644 --- "a/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" +++ "b/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) @@ -1195,7 +1193,3 @@ public int MaxDepth(TreeNode root) -

- - - diff --git "a/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" "b/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" index bde61a7551..d0af8fef27 100644 --- "a/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) @@ -1351,7 +1349,3 @@ public TreeNode BuildTree(int[] inorder, int[] postorder) ``` -

- - - diff --git "a/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" index 4804ccd3b3..adb2a06082 100644 --- "a/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" +++ "b/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) > 构造二叉搜索树,一不小心就平衡了 @@ -562,7 +560,3 @@ public TreeNode Traversal(int[] nums, int left, int right) -

- - - diff --git "a/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" "b/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" index a4339ac3d7..c3da728077 100644 --- "a/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) @@ -998,7 +996,3 @@ public int GetHeight(TreeNode root) ``` -

- - - diff --git "a/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" "b/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" index 708e0532f8..a77594b28f 100644 --- "a/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" +++ "b/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) > 和求最大深度一个套路? @@ -752,7 +750,3 @@ public int MinDepth(TreeNode root) } ``` -

- - - diff --git "a/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" "b/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" index 141967f593..22ed777fba 100644 --- "a/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" +++ "b/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) @@ -1624,8 +1622,4 @@ public class Solution { ``` -

- - - diff --git "a/problems/0115.\344\270\215\345\220\214\347\232\204\345\255\220\345\272\217\345\210\227.md" "b/problems/0115.\344\270\215\345\220\214\347\232\204\345\255\220\345\272\217\345\210\227.md" index cf24c4c180..832b64d183 100644 --- "a/problems/0115.\344\270\215\345\220\214\347\232\204\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0115.\344\270\215\345\220\214\347\232\204\345\255\220\345\272\217\345\210\227.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 115.不同的子序列 @@ -376,7 +374,3 @@ impl Solution { -

- - - diff --git "a/problems/0116.\345\241\253\345\205\205\346\257\217\344\270\252\350\212\202\347\202\271\347\232\204\344\270\213\344\270\200\344\270\252\345\217\263\344\276\247\350\212\202\347\202\271\346\214\207\351\222\210.md" "b/problems/0116.\345\241\253\345\205\205\346\257\217\344\270\252\350\212\202\347\202\271\347\232\204\344\270\213\344\270\200\344\270\252\345\217\263\344\276\247\350\212\202\347\202\271\346\214\207\351\222\210.md" index 98bd4e41c1..234929f3d1 100644 --- "a/problems/0116.\345\241\253\345\205\205\346\257\217\344\270\252\350\212\202\347\202\271\347\232\204\344\270\213\344\270\200\344\270\252\345\217\263\344\276\247\350\212\202\347\202\271\346\214\207\351\222\210.md" +++ "b/problems/0116.\345\241\253\345\205\205\346\257\217\344\270\252\350\212\202\347\202\271\347\232\204\344\270\213\344\270\200\344\270\252\345\217\263\344\276\247\350\212\202\347\202\271\346\214\207\351\222\210.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 116. 填充每个节点的下一个右侧节点指针 @@ -489,8 +487,4 @@ public class Solution -

- - - diff --git "a/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" "b/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" index f8092503e3..b9df47a491 100644 --- "a/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" +++ "b/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 121. 买卖股票的最佳时机 @@ -627,7 +625,3 @@ impl Solution { ``` -

- - - diff --git "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" index 6663a66d12..b268040771 100644 --- "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" +++ "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 122.买卖股票的最佳时机 II @@ -423,7 +421,3 @@ public class Solution ``` -

- - - diff --git "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" index 0dced9efd4..d8cb308b7e 100644 --- "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" +++ "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 122.买卖股票的最佳时机II @@ -477,7 +475,3 @@ impl Solution { ``` -

- - - diff --git "a/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" "b/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" index 1b7c09d214..75f7cb3f20 100644 --- "a/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" +++ "b/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 123.买卖股票的最佳时机III @@ -565,7 +563,3 @@ impl Solution { ``` -

- - - diff --git "a/problems/0127.\345\215\225\350\257\215\346\216\245\351\276\231.md" "b/problems/0127.\345\215\225\350\257\215\346\216\245\351\276\231.md" index 00d7d4cfc4..556613e587 100644 --- "a/problems/0127.\345\215\225\350\257\215\346\216\245\351\276\231.md" +++ "b/problems/0127.\345\215\225\350\257\215\346\216\245\351\276\231.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 127. 单词接龙 @@ -360,7 +358,3 @@ function diffonechar(word1: string, word2: string): boolean { ``` -

- - - diff --git "a/problems/0129.\346\261\202\346\240\271\345\210\260\345\217\266\345\255\220\350\212\202\347\202\271\346\225\260\345\255\227\344\271\213\345\222\214.md" "b/problems/0129.\346\261\202\346\240\271\345\210\260\345\217\266\345\255\220\350\212\202\347\202\271\346\225\260\345\255\227\344\271\213\345\222\214.md" index 90dfd0618f..923bc63807 100644 --- "a/problems/0129.\346\261\202\346\240\271\345\210\260\345\217\266\345\255\220\350\212\202\347\202\271\346\225\260\345\255\227\344\271\213\345\222\214.md" +++ "b/problems/0129.\346\261\202\346\240\271\345\210\260\345\217\266\345\255\220\350\212\202\347\202\271\346\225\260\345\255\227\344\271\213\345\222\214.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) @@ -383,7 +381,3 @@ int sumNumbers(struct TreeNode* root){ ``` -

- - - diff --git "a/problems/0130.\350\242\253\345\233\264\347\273\225\347\232\204\345\214\272\345\237\237.md" "b/problems/0130.\350\242\253\345\233\264\347\273\225\347\232\204\345\214\272\345\237\237.md" index 8ef8d5b280..4eeb57143e 100644 --- "a/problems/0130.\350\242\253\345\233\264\347\273\225\347\232\204\345\214\272\345\237\237.md" +++ "b/problems/0130.\350\242\253\345\233\264\347\273\225\347\232\204\345\214\272\345\237\237.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 130. 被围绕的区域 @@ -793,7 +791,3 @@ impl Solution { ``` -

- - - diff --git "a/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" "b/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" index 4eca0ddf53..f9b5d244c5 100644 --- "a/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" +++ "b/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) > 切割问题其实是一种组合问题! @@ -1007,7 +1005,3 @@ public class Solution -

- - - diff --git "a/problems/0132.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262II.md" "b/problems/0132.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262II.md" index 85e047f2b7..2117a44801 100644 --- "a/problems/0132.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262II.md" +++ "b/problems/0132.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262II.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) @@ -373,7 +371,3 @@ var minCut = function(s) { -

- - - diff --git "a/problems/0134.\345\212\240\346\262\271\347\253\231.md" "b/problems/0134.\345\212\240\346\262\271\347\253\231.md" index 0248760da6..fdf3e0d3db 100644 --- "a/problems/0134.\345\212\240\346\262\271\347\253\231.md" +++ "b/problems/0134.\345\212\240\346\262\271\347\253\231.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 134. 加油站 @@ -709,7 +707,3 @@ public class Solution ``` -

- - - diff --git "a/problems/0135.\345\210\206\345\217\221\347\263\226\346\236\234.md" "b/problems/0135.\345\210\206\345\217\221\347\263\226\346\236\234.md" index eb2081fe3f..75cce157c6 100644 --- "a/problems/0135.\345\210\206\345\217\221\347\263\226\346\236\234.md" +++ "b/problems/0135.\345\210\206\345\217\221\347\263\226\346\236\234.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 135. 分发糖果 @@ -401,7 +399,3 @@ public class Solution -

- - - diff --git "a/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" "b/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" index 29748e2780..b74d2cdfa0 100644 --- "a/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" +++ "b/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) @@ -565,7 +563,3 @@ impl Solution { } ``` -

- - - diff --git "a/problems/0141.\347\216\257\345\275\242\351\223\276\350\241\250.md" "b/problems/0141.\347\216\257\345\275\242\351\223\276\350\241\250.md" index ac6565763f..4957e9fbd5 100644 --- "a/problems/0141.\347\216\257\345\275\242\351\223\276\350\241\250.md" +++ "b/problems/0141.\347\216\257\345\275\242\351\223\276\350\241\250.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 141. 环形链表 @@ -160,7 +158,3 @@ function hasCycle(head: ListNode | null): boolean { -

- - - diff --git "a/problems/0142.\347\216\257\345\275\242\351\223\276\350\241\250II.md" "b/problems/0142.\347\216\257\345\275\242\351\223\276\350\241\250II.md" index 7cda58c396..fb8b875f7d 100644 --- "a/problems/0142.\347\216\257\345\275\242\351\223\276\350\241\250II.md" +++ "b/problems/0142.\347\216\257\345\275\242\351\223\276\350\241\250II.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) @@ -465,7 +463,3 @@ public class Solution } ``` -

- - - diff --git "a/problems/0143.\351\207\215\346\216\222\351\223\276\350\241\250.md" "b/problems/0143.\351\207\215\346\216\222\351\223\276\350\241\250.md" index ccddef5bf0..c61eb4b403 100644 --- "a/problems/0143.\351\207\215\346\216\222\351\223\276\350\241\250.md" +++ "b/problems/0143.\351\207\215\346\216\222\351\223\276\350\241\250.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 143.重排链表 @@ -689,7 +687,3 @@ void reorderList(struct ListNode* head){ ``` -

- - - diff --git "a/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" "b/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" index bc73f6da0d..6d21452d1d 100644 --- "a/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" +++ "b/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) > 这不仅仅是一道好题,也展现出计算机的思考方式 @@ -550,7 +548,3 @@ int evalRPN(char** tokens, int tokensSize) { } ``` -

- - - diff --git "a/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" "b/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" index 3dbd59b916..b5246a7dbb 100644 --- "a/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" +++ "b/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) @@ -1086,8 +1084,4 @@ public string ReverseWords(string s) { } ``` -

- - - diff --git "a/problems/0160.\347\233\270\344\272\244\351\223\276\350\241\250.md" "b/problems/0160.\347\233\270\344\272\244\351\223\276\350\241\250.md" index d4422bd8ba..cdc58912fe 100644 --- "a/problems/0160.\347\233\270\344\272\244\351\223\276\350\241\250.md" +++ "b/problems/0160.\347\233\270\344\272\244\351\223\276\350\241\250.md" @@ -1,11 +1,5 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) 同:[链表:链表相交](https://programmercarl.com/面试题02.07.链表相交.html) -

- - - diff --git "a/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" "b/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" index cbba12c9d1..b182d4d03d 100644 --- "a/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" +++ "b/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 188.买卖股票的最佳时机IV @@ -641,8 +639,4 @@ impl Solution { -

- - - diff --git "a/problems/0189.\346\227\213\350\275\254\346\225\260\347\273\204.md" "b/problems/0189.\346\227\213\350\275\254\346\225\260\347\273\204.md" index e91109c692..976cbed4d1 100644 --- "a/problems/0189.\346\227\213\350\275\254\346\225\260\347\273\204.md" +++ "b/problems/0189.\346\227\213\350\275\254\346\225\260\347\273\204.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 189. 旋转数组 @@ -212,7 +210,3 @@ impl Solution { ``` -

- - - diff --git "a/problems/0198.\346\211\223\345\256\266\345\212\253\350\210\215.md" "b/problems/0198.\346\211\223\345\256\266\345\212\253\350\210\215.md" index 032204bbce..3d06c95241 100644 --- "a/problems/0198.\346\211\223\345\256\266\345\212\253\350\210\215.md" +++ "b/problems/0198.\346\211\223\345\256\266\345\212\253\350\210\215.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 198.打家劫舍 @@ -361,7 +359,3 @@ impl Solution { -

- - - diff --git "a/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\345\271\277\346\220\234\347\211\210.md" "b/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\345\271\277\346\220\234\347\211\210.md" index 00e4efd894..4901934bfe 100644 --- "a/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\345\271\277\346\220\234\347\211\210.md" +++ "b/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\345\271\277\346\220\234\347\211\210.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 200. 岛屿数量 @@ -410,7 +408,3 @@ impl Solution { ``` ``` -

- - - diff --git "a/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\346\267\261\346\220\234\347\211\210.md" "b/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\346\267\261\346\220\234\347\211\210.md" index 4657920334..a3f6f48c76 100644 --- "a/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\346\267\261\346\220\234\347\211\210.md" +++ "b/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\346\267\261\346\220\234\347\211\210.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 200. 岛屿数量 @@ -463,7 +461,3 @@ impl Solution { } ``` -

- - - diff --git "a/problems/0202.\345\277\253\344\271\220\346\225\260.md" "b/problems/0202.\345\277\253\344\271\220\346\225\260.md" index 39cb39fa31..fdcadee97c 100644 --- "a/problems/0202.\345\277\253\344\271\220\346\225\260.md" +++ "b/problems/0202.\345\277\253\344\271\220\346\225\260.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) @@ -558,7 +556,3 @@ def next_value(n) end ``` -

- - - diff --git "a/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" "b/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" index 5a4bbb7423..9a38aaa152 100644 --- "a/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" +++ "b/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) @@ -808,7 +806,3 @@ end ``` -

- - - diff --git "a/problems/0205.\345\220\214\346\236\204\345\255\227\347\254\246\344\270\262.md" "b/problems/0205.\345\220\214\346\236\204\345\255\227\347\254\246\344\270\262.md" index e416d9ceda..ba255e0685 100644 --- "a/problems/0205.\345\220\214\346\236\204\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/0205.\345\220\214\346\236\204\345\255\227\347\254\246\344\270\262.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 205. 同构字符串 @@ -180,7 +178,3 @@ function isIsomorphic(s: string, t: string): boolean { -

- - - diff --git "a/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md" "b/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md" index 430bebe59b..7509882f08 100644 --- "a/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md" +++ "b/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) > 反转链表的写法很简单,一些同学甚至可以背下来但过一阵就忘了该咋写,主要是因为没有理解真正的反转过程。 @@ -739,7 +737,3 @@ public ListNode reverseList(ListNode head) { > 采用这种方法需要注意一点。就是当整个出栈循环结束以后,cur正好指向原来链表的第一个结点,而此时结点1中的next指向的是结点2,因此最后还需要`cur.next = null` ![image-20230117195418626](https://raw.githubusercontent.com/liyuxuan7762/MyImageOSS/master/md_images/image-20230117195418626.png) -

- - - diff --git "a/problems/0207.\350\257\276\347\250\213\350\241\250.md" "b/problems/0207.\350\257\276\347\250\213\350\241\250.md" index dff0b18eb0..f992c72b89 100644 --- "a/problems/0207.\350\257\276\347\250\213\350\241\250.md" +++ "b/problems/0207.\350\257\276\347\250\213\350\241\250.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) 拓扑排序指的是一种 解决问题的大体思路, 而具体算法,可能是 广搜 可能是深搜。 @@ -59,7 +57,3 @@ public: } }; ``` -

- - - diff --git "a/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" "b/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" index c6d89976d0..43a3cb6a2b 100644 --- "a/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" +++ "b/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 209.长度最小的子数组 @@ -558,7 +556,3 @@ public class Solution { } } ``` -

- - - diff --git "a/problems/0210.\350\257\276\347\250\213\350\241\250II.md" "b/problems/0210.\350\257\276\347\250\213\350\241\250II.md" index 2d2e242941..b0d9fe8a9e 100644 --- "a/problems/0210.\350\257\276\347\250\213\350\241\250II.md" +++ "b/problems/0210.\350\257\276\347\250\213\350\241\250II.md" @@ -1,3 +1,6 @@ +* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) ```CPP class Solution { diff --git "a/problems/0213.\346\211\223\345\256\266\345\212\253\350\210\215II.md" "b/problems/0213.\346\211\223\345\256\266\345\212\253\350\210\215II.md" index 05ebd1ad09..536e1e89b8 100644 --- "a/problems/0213.\346\211\223\345\256\266\345\212\253\350\210\215II.md" +++ "b/problems/0213.\346\211\223\345\256\266\345\212\253\350\210\215II.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 213.打家劫舍II @@ -367,7 +365,3 @@ impl Solution { ``` -

- - - diff --git "a/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" "b/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" index 3d7f2d0c03..3dbd676a8d 100644 --- "a/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" +++ "b/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) @@ -739,7 +737,3 @@ public class Solution -

- - - diff --git "a/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" "b/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" index 8d7779f989..9b649d7be8 100644 --- "a/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" +++ "b/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 222.完全二叉树的节点个数 @@ -894,7 +892,3 @@ public int CountNodes(TreeNode root) ``` -

- - - diff --git "a/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" "b/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" index 73d9db1b16..2396858056 100644 --- "a/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" +++ "b/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) @@ -1367,7 +1365,3 @@ void myStackFree(MyStack* obj) { ``` -

- - - diff --git "a/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" "b/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" index c34ca4bfcb..0980e6004c 100644 --- "a/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 226.翻转二叉树 @@ -1022,7 +1020,3 @@ public TreeNode InvertTree(TreeNode root) { ``` -

- - - diff --git "a/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" "b/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" index 657567cfdf..6775a37265 100644 --- "a/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" +++ "b/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) > 工作上一定没人这么搞,但是考察对栈、队列理解程度的好题 @@ -691,7 +689,3 @@ impl MyQueue { } ``` -

- - - diff --git "a/problems/0234.\345\233\236\346\226\207\351\223\276\350\241\250.md" "b/problems/0234.\345\233\236\346\226\207\351\223\276\350\241\250.md" index 1356b7da3b..f493383967 100644 --- "a/problems/0234.\345\233\236\346\226\207\351\223\276\350\241\250.md" +++ "b/problems/0234.\345\233\236\346\226\207\351\223\276\350\241\250.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 234.回文链表 @@ -429,7 +427,3 @@ function reverseList(head: ListNode | null): ListNode | null { -

- - - diff --git "a/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" "b/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" index 3911261a53..c5eb603a0d 100644 --- "a/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" +++ "b/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 235. 二叉搜索树的最近公共祖先 @@ -548,7 +546,3 @@ public TreeNode LowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) -

- - - diff --git "a/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" "b/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" index 8cd505a829..f15d1cff60 100644 --- "a/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" +++ "b/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) > 本来是打算将二叉树和二叉搜索树的公共祖先问题一起讲,后来发现篇幅过长了,只能先说一说二叉树的公共祖先问题。 @@ -491,7 +489,3 @@ public TreeNode LowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) ``` -

- - - diff --git "a/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" "b/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" index 651e4da40c..875f1bd193 100644 --- "a/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" +++ "b/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) @@ -922,8 +920,4 @@ int* maxSlidingWindow(int* nums, int numsSize, int k, int* returnSize) { ``` -

- - - diff --git "a/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" "b/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" index 61488f03fd..9a783e5b11 100644 --- "a/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" +++ "b/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) > 数组就是简单的哈希表,但是数组的大小可不是无限开辟的 @@ -416,7 +414,3 @@ bool isAnagram(char* s, char* t) { -

- - - diff --git "a/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" "b/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" index fdaa87f896..287db20937 100644 --- "a/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" +++ "b/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) > 以为只用了递归,其实还用了回溯 @@ -938,7 +936,3 @@ public void Traversal(TreeNode node, List path, List res) } ``` -

- - - diff --git "a/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" "b/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" index dc5a7e9ec9..c1077bd43d 100644 --- "a/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" +++ "b/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 279.完全平方数 @@ -479,7 +477,3 @@ impl Solution { ``` -

- - - diff --git "a/problems/0283.\347\247\273\345\212\250\351\233\266.md" "b/problems/0283.\347\247\273\345\212\250\351\233\266.md" index cbce029576..d7911054e4 100644 --- "a/problems/0283.\347\247\273\345\212\250\351\233\266.md" +++ "b/problems/0283.\347\247\273\345\212\250\351\233\266.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 283. 移动零:动态规划:一样的套路,再求一次完全平方数 @@ -186,7 +184,3 @@ impl Solution { -

- - - diff --git "a/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" "b/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" index 442938c06f..7d2e488623 100644 --- "a/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 300.最长递增子序列 @@ -361,7 +359,3 @@ func lengthOfLIS(nums: Array): Int64 { ``` -

- - - diff --git "a/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" "b/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" index b98a416cc1..6a81933505 100644 --- "a/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" +++ "b/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 309.最佳买卖股票时机含冷冻期 @@ -603,8 +601,4 @@ impl Solution { ``` -

- - - diff --git "a/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" "b/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" index e55e20bedf..dea77a3d10 100644 --- "a/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" +++ "b/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 322. 零钱兑换 @@ -499,7 +497,3 @@ function coinChange(coins: number[], amount: number): number { ``` -

- - - diff --git "a/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" "b/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" index 78e1407419..f1df25229d 100644 --- "a/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" +++ "b/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) > 这也可以用回溯法? 其实深搜和回溯也是相辅相成的,毕竟都用递归。 @@ -941,7 +939,3 @@ impl Solution { ``` -

- - - diff --git "a/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" "b/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" index a3130df7ee..08728e4faf 100644 --- "a/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" +++ "b/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 337.打家劫舍 III @@ -623,7 +621,3 @@ impl Solution { ``` -

- - - diff --git "a/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" "b/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" index 5d0110f67e..06549185a3 100644 --- "a/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" +++ "b/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 343. 整数拆分 @@ -564,7 +562,3 @@ public class Solution ``` -

- - - diff --git "a/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" "b/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" index 793c9af362..c88d008c82 100644 --- "a/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) @@ -429,7 +427,3 @@ object Solution { } } ``` -

- - - diff --git "a/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" "b/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" index cca9b0edce..b6575c5fd4 100644 --- "a/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" +++ "b/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) > 前K个大数问题,老生常谈,不得不谈 @@ -609,8 +607,4 @@ impl Solution { ``` -

- - - diff --git "a/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" "b/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" index 93fa09318a..5066bff1b9 100644 --- "a/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" +++ "b/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) @@ -544,8 +542,4 @@ end * [350.两个数组的交集 II](https://leetcode.cn/problems/intersection-of-two-arrays-ii/) -

- - - diff --git "a/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" "b/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" index e2ea99046b..886d86aefe 100644 --- "a/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" +++ "b/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 376. 摆动序列 @@ -714,7 +712,3 @@ public class Solution } ``` -

- - - diff --git "a/problems/0377.\347\273\204\345\220\210\346\200\273\345\222\214\342\205\243.md" "b/problems/0377.\347\273\204\345\220\210\346\200\273\345\222\214\342\205\243.md" index ba8546c662..d2feb0c5d6 100644 --- "a/problems/0377.\347\273\204\345\220\210\346\200\273\345\222\214\342\205\243.md" +++ "b/problems/0377.\347\273\204\345\220\210\346\200\273\345\222\214\342\205\243.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 377. 组合总和 Ⅳ @@ -357,7 +355,3 @@ public class Solution ``` -

- - - diff --git "a/problems/0383.\350\265\216\351\207\221\344\277\241.md" "b/problems/0383.\350\265\216\351\207\221\344\277\241.md" index 1d7391732f..8a2f52ae42 100644 --- "a/problems/0383.\350\265\216\351\207\221\344\277\241.md" +++ "b/problems/0383.\350\265\216\351\207\221\344\277\241.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) @@ -466,8 +464,4 @@ bool canConstruct(char* ransomNote, char* magazine) { ``` -

- - - diff --git "a/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" "b/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" index 92246e4f9b..2a5be51c59 100644 --- "a/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 392.判断子序列 @@ -405,7 +403,3 @@ impl Solution { ``` -

- - - diff --git "a/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" "b/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" index 66aff68f2e..0efdb6f663 100644 --- "a/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" +++ "b/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 404.左叶子之和 @@ -685,7 +683,3 @@ public int SumOfLeftLeaves(TreeNode root) ``` -

- - - diff --git "a/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" "b/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" index d6fc415b68..11853e1170 100644 --- "a/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" +++ "b/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 406.根据身高重建队列 @@ -422,7 +420,3 @@ public class Solution -

- - - diff --git "a/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" "b/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" index 902c022ab3..9cc6db0e4b 100644 --- "a/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" +++ "b/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 416. 分割等和子集 @@ -801,7 +799,3 @@ public class Solution } ``` -

- - - diff --git "a/problems/0417.\345\244\252\345\271\263\346\264\213\345\244\247\350\245\277\346\264\213\346\260\264\346\265\201\351\227\256\351\242\230.md" "b/problems/0417.\345\244\252\345\271\263\346\264\213\345\244\247\350\245\277\346\264\213\346\260\264\346\265\201\351\227\256\351\242\230.md" index 5156ce2289..ec87eb9595 100644 --- "a/problems/0417.\345\244\252\345\271\263\346\264\213\345\244\247\350\245\277\346\264\213\346\260\264\346\265\201\351\227\256\351\242\230.md" +++ "b/problems/0417.\345\244\252\345\271\263\346\264\213\345\244\247\350\245\277\346\264\213\346\260\264\346\265\201\351\227\256\351\242\230.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) @@ -837,7 +835,3 @@ impl Solution { } ``` -

- - - diff --git "a/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" "b/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" index d6321315d7..a37d1cadac 100644 --- "a/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" +++ "b/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 435. 无重叠区间 @@ -495,7 +493,3 @@ public class Solution -

- - - diff --git "a/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" "b/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" index 831655e8e1..7280918460 100644 --- "a/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" +++ "b/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) > 二叉搜索树删除节点就涉及到结构调整了 @@ -836,7 +834,3 @@ def delete_node(root, key) end ``` -

- - - diff --git "a/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" "b/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" index 14456f92bf..854498829b 100644 --- "a/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" +++ "b/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 452. 用最少数量的箭引爆气球 @@ -357,7 +355,3 @@ public class Solution } ``` -

- - - diff --git "a/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" "b/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" index af19f5f7d8..a26071a1fa 100644 --- "a/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" +++ "b/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) > 需要哈希的地方都能找到map的身影 @@ -526,7 +524,3 @@ def two_sum_mapping(nums1, nums2) end ``` -

- - - diff --git "a/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" "b/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" index 5e8fb73094..a2a1b1f339 100644 --- "a/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" +++ "b/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 455.分发饼干 @@ -434,7 +432,3 @@ public class Solution } ``` -

- - - diff --git "a/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" "b/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" index 988b2abf11..78aad3e786 100644 --- "a/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) > KMP算法还能干这个 @@ -999,7 +997,3 @@ bool repeatedSubstringPattern(char* s) { ``` -

- - - diff --git "a/problems/0463.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" "b/problems/0463.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" index 5261d6c2ae..bff619ccde 100644 --- "a/problems/0463.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" +++ "b/problems/0463.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) @@ -433,7 +431,3 @@ function islandPerimeter(grid: number[][]): number { ``` -

- - - diff --git "a/problems/0474.\344\270\200\345\222\214\351\233\266.md" "b/problems/0474.\344\270\200\345\222\214\351\233\266.md" index 9d24f01434..ca525ab2e3 100644 --- "a/problems/0474.\344\270\200\345\222\214\351\233\266.md" +++ "b/problems/0474.\344\270\200\345\222\214\351\233\266.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 474.一和零 @@ -740,8 +738,4 @@ public class Solution ``` -

- - - diff --git "a/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" "b/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" index 7832095a10..1b927dd3d2 100644 --- "a/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) > 和子集问题有点像,但又处处是陷阱 @@ -640,7 +638,3 @@ public class Solution { } ``` -

- - - diff --git "a/problems/0494.\347\233\256\346\240\207\345\222\214.md" "b/problems/0494.\347\233\256\346\240\207\345\222\214.md" index c38ba7e43c..bde843ead3 100644 --- "a/problems/0494.\347\233\256\346\240\207\345\222\214.md" +++ "b/problems/0494.\347\233\256\346\240\207\345\222\214.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) @@ -1024,8 +1022,4 @@ public class Solution ``` -

- - - diff --git "a/problems/0496.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240I.md" "b/problems/0496.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240I.md" index 02e73a588d..628149b75d 100644 --- "a/problems/0496.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240I.md" +++ "b/problems/0496.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240I.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 496.下一个更大元素 I @@ -507,7 +505,3 @@ impl Solution { -

- - - diff --git "a/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" "b/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" index c89f8031e8..32a89e859a 100644 --- "a/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" +++ "b/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) > 二叉树上应该怎么求,二叉搜索树上又应该怎么求? @@ -1052,7 +1050,3 @@ public class Solution -

- - - diff --git "a/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" "b/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" index b466337d6e..93924483f3 100644 --- "a/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" +++ "b/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 503.下一个更大元素II @@ -358,7 +356,3 @@ impl Solution { ``` -

- - - diff --git "a/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" "b/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" index ac173dbddc..b2e56a613c 100644 --- "a/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" +++ "b/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 509. 斐波那契数 @@ -476,7 +474,3 @@ public class Solution -

- - - diff --git "a/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" "b/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" index c7446726f8..da37360374 100644 --- "a/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" +++ "b/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 513.找树左下角的值 @@ -764,7 +762,3 @@ public class Solution // @lc code=end ``` -

- - - diff --git "a/problems/0516.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\345\272\217\345\210\227.md" "b/problems/0516.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\345\272\217\345\210\227.md" index 166310aaff..f0ef2f53d0 100644 --- "a/problems/0516.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0516.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\345\272\217\345\210\227.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) @@ -299,7 +297,3 @@ impl Solution { -

- - - diff --git "a/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" "b/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" index 835df85212..1698db9887 100644 --- "a/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" +++ "b/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 518.零钱兑换II @@ -589,7 +587,3 @@ public class Solution ``` -

- - - diff --git "a/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" "b/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" index b6d08dbeaa..d7b0e056db 100644 --- "a/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" +++ "b/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) > 利用二叉搜索树的特性搞起! @@ -679,8 +677,4 @@ public class Solution ``` -

- - - diff --git "a/problems/0538.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md" "b/problems/0538.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md" index b95b585485..1bbbdac76d 100644 --- "a/problems/0538.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md" +++ "b/problems/0538.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 538.把二叉搜索树转换为累加树 @@ -549,7 +547,3 @@ public class Solution -

- - - diff --git "a/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" "b/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" index b3e7b02229..2bbe6cffae 100644 --- "a/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" +++ "b/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) @@ -516,8 +514,4 @@ impl Solution { } ``` -

- - - diff --git "a/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" "b/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" index b9f9ad9625..a86dfad195 100644 --- "a/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" +++ "b/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 583. 两个字符串的删除操作 @@ -470,7 +468,3 @@ impl Solution { ``` -

- - - diff --git "a/problems/0617.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md" "b/problems/0617.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md" index 530350ac69..f180c4f3b9 100644 --- "a/problems/0617.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0617.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 617.合并二叉树 @@ -804,7 +802,3 @@ public TreeNode MergeTrees(TreeNode root1, TreeNode root2) ``` -

- - - diff --git "a/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" "b/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" index cf32d7ed24..e2783027aa 100644 --- "a/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" +++ "b/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 647. 回文子串 @@ -613,7 +611,3 @@ impl Solution { } ``` -

- - - diff --git "a/problems/0649.Dota2\345\217\202\350\256\256\351\231\242.md" "b/problems/0649.Dota2\345\217\202\350\256\256\351\231\242.md" index 1540a60173..e77070fcf8 100644 --- "a/problems/0649.Dota2\345\217\202\350\256\256\351\231\242.md" +++ "b/problems/0649.Dota2\345\217\202\350\256\256\351\231\242.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) @@ -284,7 +282,3 @@ function predictPartyVictory(senate: string): string { -

- - - diff --git "a/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" "b/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" index fed9b2b991..9f897a7502 100644 --- "a/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 654.最大二叉树 @@ -599,7 +597,3 @@ public TreeNode ConstructMaximumBinaryTree(int[] nums) ``` -

- - - diff --git "a/problems/0657.\346\234\272\345\231\250\344\272\272\350\203\275\345\220\246\350\277\224\345\233\236\345\216\237\347\202\271.md" "b/problems/0657.\346\234\272\345\231\250\344\272\272\350\203\275\345\220\246\350\277\224\345\233\236\345\216\237\347\202\271.md" index eccfef3a21..89993b6ff6 100644 --- "a/problems/0657.\346\234\272\345\231\250\344\272\272\350\203\275\345\220\246\350\277\224\345\233\236\345\216\237\347\202\271.md" +++ "b/problems/0657.\346\234\272\345\231\250\344\272\272\350\203\275\345\220\246\350\277\224\345\233\236\345\216\237\347\202\271.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 657. 机器人能否返回原点 @@ -182,7 +180,3 @@ var judgeCircle = function (moves) { -

- - - diff --git "a/problems/0669.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0669.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" index 325733862c..0a05360bf1 100644 --- "a/problems/0669.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" +++ "b/problems/0669.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) @@ -587,7 +585,3 @@ public TreeNode TrimBST(TreeNode root, int low, int high) -

- - - diff --git "a/problems/0673.\346\234\200\351\225\277\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227\347\232\204\344\270\252\346\225\260.md" "b/problems/0673.\346\234\200\351\225\277\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227\347\232\204\344\270\252\346\225\260.md" index 0366ee8063..9bfa91cc94 100644 --- "a/problems/0673.\346\234\200\351\225\277\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227\347\232\204\344\270\252\346\225\260.md" +++ "b/problems/0673.\346\234\200\351\225\277\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227\347\232\204\344\270\252\346\225\260.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 673.最长递增子序列的个数 @@ -361,7 +359,3 @@ var findNumberOfLIS = function(nums) { -

- - - diff --git "a/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" "b/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" index 8b967092bc..2c490c0c5b 100644 --- "a/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" +++ "b/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 674. 最长连续递增序列 @@ -514,7 +512,3 @@ func findLengthOfLCIS(nums: Array): Int64 { -

- - - diff --git "a/problems/0684.\345\206\227\344\275\231\350\277\236\346\216\245.md" "b/problems/0684.\345\206\227\344\275\231\350\277\236\346\216\245.md" index 7808549036..e6d2d8e502 100644 --- "a/problems/0684.\345\206\227\344\275\231\350\277\236\346\216\245.md" +++ "b/problems/0684.\345\206\227\344\275\231\350\277\236\346\216\245.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 684.冗余连接 @@ -379,7 +377,3 @@ var findRedundantConnection = function(edges) { -

- - - diff --git "a/problems/0685.\345\206\227\344\275\231\350\277\236\346\216\245II.md" "b/problems/0685.\345\206\227\344\275\231\350\277\236\346\216\245II.md" index 3f489d82b7..7b0e320c6f 100644 --- "a/problems/0685.\345\206\227\344\275\231\350\277\236\346\216\245II.md" +++ "b/problems/0685.\345\206\227\344\275\231\350\277\236\346\216\245II.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 685.冗余连接II @@ -620,7 +618,3 @@ var findRedundantDirectedConnection = function(edges) { -

- - - diff --git "a/problems/0695.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" "b/problems/0695.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" index ca70420687..0b84e651c1 100644 --- "a/problems/0695.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" +++ "b/problems/0695.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 695. 岛屿的最大面积 @@ -709,7 +707,3 @@ impl Solution { } ``` -

- - - diff --git "a/problems/0700.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\220\234\347\264\242.md" "b/problems/0700.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\220\234\347\264\242.md" index 9ec51524b8..4225b3fe25 100644 --- "a/problems/0700.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\220\234\347\264\242.md" +++ "b/problems/0700.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\220\234\347\264\242.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 700.二叉搜索树中的搜索 @@ -508,7 +506,3 @@ public TreeNode SearchBST(TreeNode root, int val) ``` -

- - - diff --git "a/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" "b/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" index 25d39486f3..ef383faa86 100644 --- "a/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" +++ "b/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 701.二叉搜索树中的插入操作 @@ -724,7 +722,3 @@ public TreeNode InsertIntoBST(TreeNode root, int val) { ``` -

- - - diff --git "a/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" "b/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" index d86146d63a..405018745e 100644 --- "a/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" +++ "b/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 704. 二分查找 @@ -837,7 +835,3 @@ class Solution { ``` -

- - - diff --git "a/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" "b/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" index 5c72b05a29..7023bd902a 100644 --- "a/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" +++ "b/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) > 听说这道题目把链表常见的五个操作都覆盖了? @@ -1845,8 +1843,4 @@ public class MyLinkedList } ``` -

- - - diff --git "a/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271.md" "b/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271.md" index e742b8c89b..fb095d7518 100644 --- "a/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271.md" +++ "b/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 714. 买卖股票的最佳时机含手续费 @@ -361,7 +359,3 @@ object Solution { ``` -

- - - diff --git "a/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" "b/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" index 17997b6208..ebed4a0b30 100644 --- "a/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" +++ "b/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 714.买卖股票的最佳时机含手续费 @@ -337,7 +335,3 @@ impl Solution { ``` -

- - - diff --git "a/problems/0718.\346\234\200\351\225\277\351\207\215\345\244\215\345\255\220\346\225\260\347\273\204.md" "b/problems/0718.\346\234\200\351\225\277\351\207\215\345\244\215\345\255\220\346\225\260\347\273\204.md" index 1391926a76..0e4b346d82 100644 --- "a/problems/0718.\346\234\200\351\225\277\351\207\215\345\244\215\345\255\220\346\225\260\347\273\204.md" +++ "b/problems/0718.\346\234\200\351\225\277\351\207\215\345\244\215\345\255\220\346\225\260\347\273\204.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 718. 最长重复子数组 @@ -602,7 +600,3 @@ func findLength(nums1: Array, nums2: Array): Int64 { ``` -

- - - diff --git "a/problems/0724.\345\257\273\346\211\276\346\225\260\347\273\204\347\232\204\344\270\255\345\277\203\347\264\242\345\274\225.md" "b/problems/0724.\345\257\273\346\211\276\346\225\260\347\273\204\347\232\204\344\270\255\345\277\203\347\264\242\345\274\225.md" index a66a445083..bccca4f2d4 100644 --- "a/problems/0724.\345\257\273\346\211\276\346\225\260\347\273\204\347\232\204\344\270\255\345\277\203\347\264\242\345\274\225.md" +++ "b/problems/0724.\345\257\273\346\211\276\346\225\260\347\273\204\347\232\204\344\270\255\345\277\203\347\264\242\345\274\225.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 724.寻找数组的中心下标 @@ -159,7 +157,3 @@ function pivotIndex(nums: number[]): number { -

- - - diff --git "a/problems/0738.\345\215\225\350\260\203\351\200\222\345\242\236\347\232\204\346\225\260\345\255\227.md" "b/problems/0738.\345\215\225\350\260\203\351\200\222\345\242\236\347\232\204\346\225\260\345\255\227.md" index f2cfee04c9..17182778ae 100644 --- "a/problems/0738.\345\215\225\350\260\203\351\200\222\345\242\236\347\232\204\346\225\260\345\255\227.md" +++ "b/problems/0738.\345\215\225\350\260\203\351\200\222\345\242\236\347\232\204\346\225\260\345\255\227.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 738.单调递增的数字 @@ -441,8 +439,4 @@ public class Solution } ``` -

- - - diff --git "a/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" "b/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" index dd633aed9a..542aad29b8 100644 --- "a/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" +++ "b/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) @@ -515,7 +513,3 @@ impl Solution { -

- - - diff --git "a/problems/0743.\347\275\221\347\273\234\345\273\266\350\277\237\346\227\266\351\227\264.md" "b/problems/0743.\347\275\221\347\273\234\345\273\266\350\277\237\346\227\266\351\227\264.md" index e631951a9e..6533a240bf 100644 --- "a/problems/0743.\347\275\221\347\273\234\345\273\266\350\277\237\346\227\266\351\227\264.md" +++ "b/problems/0743.\347\275\221\347\273\234\345\273\266\350\277\237\346\227\266\351\227\264.md" @@ -1,3 +1,6 @@ +* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 743.网络延迟时间 diff --git "a/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" "b/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" index 753a104d97..9145c7ed1d 100644 --- "a/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" +++ "b/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) @@ -538,7 +536,3 @@ public class Solution -

- - - diff --git "a/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" "b/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" index 19d862db14..70ebfe4ff7 100644 --- "a/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" +++ "b/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 763.划分字母区间 @@ -462,7 +460,3 @@ public class Solution } ``` -

- - - diff --git "a/problems/0787.K\347\253\231\344\270\255\350\275\254\345\206\205\346\234\200\344\276\277\345\256\234\347\232\204\350\210\252\347\217\255.md" "b/problems/0787.K\347\253\231\344\270\255\350\275\254\345\206\205\346\234\200\344\276\277\345\256\234\347\232\204\350\210\252\347\217\255.md" index 9c0a8e7f27..68d8421502 100644 --- "a/problems/0787.K\347\253\231\344\270\255\350\275\254\345\206\205\346\234\200\344\276\277\345\256\234\347\232\204\350\210\252\347\217\255.md" +++ "b/problems/0787.K\347\253\231\344\270\255\350\275\254\345\206\205\346\234\200\344\276\277\345\256\234\347\232\204\350\210\252\347\217\255.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 787. K 站中转内最便宜的航班 @@ -180,7 +178,3 @@ public: -

- - - diff --git "a/problems/0797.\346\211\200\346\234\211\345\217\257\350\203\275\347\232\204\350\267\257\345\276\204.md" "b/problems/0797.\346\211\200\346\234\211\345\217\257\350\203\275\347\232\204\350\267\257\345\276\204.md" index 40e1bbe73e..a37e5c3f8c 100644 --- "a/problems/0797.\346\211\200\346\234\211\345\217\257\350\203\275\347\232\204\350\267\257\345\276\204.md" +++ "b/problems/0797.\346\211\200\346\234\211\345\217\257\350\203\275\347\232\204\350\267\257\345\276\204.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 797.所有可能的路径 @@ -294,7 +292,3 @@ impl Solution { } ``` -

- - - diff --git "a/problems/0827.\346\234\200\345\244\247\344\272\272\345\267\245\345\262\233.md" "b/problems/0827.\346\234\200\345\244\247\344\272\272\345\267\245\345\262\233.md" index d24eaacc50..0ebda2524a 100644 --- "a/problems/0827.\346\234\200\345\244\247\344\272\272\345\267\245\345\262\233.md" +++ "b/problems/0827.\346\234\200\345\244\247\344\272\272\345\267\245\345\262\233.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 827.最大人工岛 @@ -504,7 +502,3 @@ return res; ``` -

- - - diff --git "a/problems/0841.\351\222\245\345\214\231\345\222\214\346\210\277\351\227\264.md" "b/problems/0841.\351\222\245\345\214\231\345\222\214\346\210\277\351\227\264.md" index b78693b446..4076fce513 100644 --- "a/problems/0841.\351\222\245\345\214\231\345\222\214\346\210\277\351\227\264.md" +++ "b/problems/0841.\351\222\245\345\214\231\345\222\214\346\210\277\351\227\264.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) @@ -484,7 +482,3 @@ function canVisitAllRooms(rooms: number[][]): boolean { ``` -

- - - diff --git "a/problems/0844.\346\257\224\350\276\203\345\220\253\351\200\200\346\240\274\347\232\204\345\255\227\347\254\246\344\270\262.md" "b/problems/0844.\346\257\224\350\276\203\345\220\253\351\200\200\346\240\274\347\232\204\345\255\227\347\254\246\344\270\262.md" index c32cdd339b..f229447384 100644 --- "a/problems/0844.\346\257\224\350\276\203\345\220\253\351\200\200\346\240\274\347\232\204\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/0844.\346\257\224\350\276\203\345\220\253\351\200\200\346\240\274\347\232\204\345\255\227\347\254\246\344\270\262.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 844.比较含退格的字符串 @@ -588,7 +586,3 @@ impl Solution { ``` -

- - - diff --git "a/problems/0860.\346\237\240\346\252\254\346\260\264\346\211\276\351\233\266.md" "b/problems/0860.\346\237\240\346\252\254\346\260\264\346\211\276\351\233\266.md" index b7887d456e..aeb470fe5a 100644 --- "a/problems/0860.\346\237\240\346\252\254\346\260\264\346\211\276\351\233\266.md" +++ "b/problems/0860.\346\237\240\346\252\254\346\260\264\346\211\276\351\233\266.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 860.柠檬水找零 @@ -440,7 +438,3 @@ public class Solution -

- - - diff --git "a/problems/0922.\346\214\211\345\245\207\345\201\266\346\216\222\345\272\217\346\225\260\347\273\204II.md" "b/problems/0922.\346\214\211\345\245\207\345\201\266\346\216\222\345\272\217\346\225\260\347\273\204II.md" index 28680dbf0f..484099f89f 100644 --- "a/problems/0922.\346\214\211\345\245\207\345\201\266\346\216\222\345\272\217\346\225\260\347\273\204II.md" +++ "b/problems/0922.\346\214\211\345\245\207\345\201\266\346\216\222\345\272\217\346\225\260\347\273\204II.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) @@ -410,7 +408,3 @@ function sortArrayByParityII(nums: number[]): number[] { ``` -

- - - diff --git "a/problems/0925.\351\225\277\346\214\211\351\224\256\345\205\245.md" "b/problems/0925.\351\225\277\346\214\211\351\224\256\345\205\245.md" index f4a8fa8e52..47465199a8 100644 --- "a/problems/0925.\351\225\277\346\214\211\351\224\256\345\205\245.md" +++ "b/problems/0925.\351\225\277\346\214\211\351\224\256\345\205\245.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 925.长按键入 @@ -227,7 +225,3 @@ function isLongPressedName(name: string, typed: string): boolean { -

- - - diff --git "a/problems/0941.\346\234\211\346\225\210\347\232\204\345\261\261\350\204\211\346\225\260\347\273\204.md" "b/problems/0941.\346\234\211\346\225\210\347\232\204\345\261\261\350\204\211\346\225\260\347\273\204.md" index 77167df041..383f6aa5b1 100644 --- "a/problems/0941.\346\234\211\346\225\210\347\232\204\345\261\261\350\204\211\346\225\260\347\273\204.md" +++ "b/problems/0941.\346\234\211\346\225\210\347\232\204\345\261\261\350\204\211\346\225\260\347\273\204.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 941.有效的山脉数组 @@ -213,7 +211,3 @@ impl Solution { } ``` -

- - - diff --git "a/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" "b/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" index 327c54f72a..0df2cc5b60 100644 --- "a/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) @@ -789,7 +787,3 @@ public class Solution } ``` -

- - - diff --git "a/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" "b/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" index b8488e10de..6e58be1af6 100644 --- "a/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" +++ "b/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) > 双指针风骚起来,也是无敌 @@ -588,8 +586,4 @@ public class Solution { } ``` -

- - - diff --git "a/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md" "b/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md" index f938c2b734..3d7d8e0770 100644 --- "a/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md" +++ "b/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) @@ -582,7 +580,3 @@ end ``` -

- - - diff --git "a/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" "b/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" index 1a7817775a..6e908d5af6 100644 --- "a/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" +++ "b/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 1005.K次取反后最大化的数组和 @@ -377,7 +375,3 @@ public class Solution -

- - - diff --git "a/problems/1020.\351\243\236\345\234\260\347\232\204\346\225\260\351\207\217.md" "b/problems/1020.\351\243\236\345\234\260\347\232\204\346\225\260\351\207\217.md" index f708e4a368..030d56a024 100644 --- "a/problems/1020.\351\243\236\345\234\260\347\232\204\346\225\260\351\207\217.md" +++ "b/problems/1020.\351\243\236\345\234\260\347\232\204\346\225\260\351\207\217.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 1020. 飞地的数量 @@ -753,8 +751,4 @@ impl Solution { -

- - - diff --git "a/problems/1035.\344\270\215\347\233\270\344\272\244\347\232\204\347\272\277.md" "b/problems/1035.\344\270\215\347\233\270\344\272\244\347\232\204\347\272\277.md" index 5164e1f7ff..53e0f370e7 100644 --- "a/problems/1035.\344\270\215\347\233\270\344\272\244\347\232\204\347\272\277.md" +++ "b/problems/1035.\344\270\215\347\233\270\344\272\244\347\232\204\347\272\277.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 1035.不相交的线 @@ -278,7 +276,3 @@ function maxUncrossedLines(nums1: number[], nums2: number[]): number { -

- - - diff --git "a/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" "b/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" index 51ec4e62c6..01d33fbff7 100644 --- "a/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" +++ "b/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) > 匹配问题都是栈的强项 @@ -523,7 +521,3 @@ end ``` -

- - - diff --git "a/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" "b/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" index 0d445a71f0..62e7d9c590 100644 --- "a/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" +++ "b/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 1049.最后一块石头的重量II @@ -535,7 +533,3 @@ public class Solution ``` -

- - - diff --git "a/problems/1143.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" "b/problems/1143.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" index 6d05ccf3f8..821f3c42a1 100644 --- "a/problems/1143.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/1143.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 1143.最长公共子序列 @@ -420,7 +418,3 @@ func longestCommonSubsequence(text1: String, text2: String): Int64 { ``` -

- - - diff --git "a/problems/1207.\347\213\254\344\270\200\346\227\240\344\272\214\347\232\204\345\207\272\347\216\260\346\254\241\346\225\260.md" "b/problems/1207.\347\213\254\344\270\200\346\227\240\344\272\214\347\232\204\345\207\272\347\216\260\346\254\241\346\225\260.md" index 781badf549..fbb19af773 100644 --- "a/problems/1207.\347\213\254\344\270\200\346\227\240\344\272\214\347\232\204\345\207\272\347\216\260\346\254\241\346\225\260.md" +++ "b/problems/1207.\347\213\254\344\270\200\346\227\240\344\272\214\347\232\204\345\207\272\347\216\260\346\254\241\346\225\260.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 1207.独一无二的出现次数 @@ -247,7 +245,3 @@ impl Solution { -

- - - diff --git "a/problems/1221.\345\210\206\345\211\262\345\271\263\350\241\241\345\255\227\347\254\246\344\270\262.md" "b/problems/1221.\345\210\206\345\211\262\345\271\263\350\241\241\345\255\227\347\254\246\344\270\262.md" index a32ca98ffc..a9e275d92d 100644 --- "a/problems/1221.\345\210\206\345\211\262\345\271\263\350\241\241\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/1221.\345\210\206\345\211\262\345\271\263\350\241\241\345\255\227\347\254\246\344\270\262.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 1221. 分割平衡字符串 @@ -172,7 +170,3 @@ function balancedStringSplit(s: string): number { }; ``` -

- - - diff --git "a/problems/1254.\347\273\237\350\256\241\345\260\201\351\227\255\345\262\233\345\261\277\347\232\204\346\225\260\347\233\256.md" "b/problems/1254.\347\273\237\350\256\241\345\260\201\351\227\255\345\262\233\345\261\277\347\232\204\346\225\260\347\233\256.md" index 3d7b9fe96c..5d99670950 100644 --- "a/problems/1254.\347\273\237\350\256\241\345\260\201\351\227\255\345\262\233\345\261\277\347\232\204\346\225\260\347\233\256.md" +++ "b/problems/1254.\347\273\237\350\256\241\345\260\201\351\227\255\345\262\233\345\261\277\347\232\204\346\225\260\347\233\256.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 1254. 统计封闭岛屿的数目 @@ -136,7 +134,3 @@ var closedIsland = function(grid) { -

- - - diff --git "a/problems/1334.\351\230\210\345\200\274\350\267\235\347\246\273\345\206\205\351\202\273\345\261\205\346\234\200\345\260\221\347\232\204\345\237\216\345\270\202.md" "b/problems/1334.\351\230\210\345\200\274\350\267\235\347\246\273\345\206\205\351\202\273\345\261\205\346\234\200\345\260\221\347\232\204\345\237\216\345\270\202.md" index d8d8861f47..bea47a2e63 100644 --- "a/problems/1334.\351\230\210\345\200\274\350\267\235\347\246\273\345\206\205\351\202\273\345\261\205\346\234\200\345\260\221\347\232\204\345\237\216\345\270\202.md" +++ "b/problems/1334.\351\230\210\345\200\274\350\267\235\347\246\273\345\206\205\351\202\273\345\261\205\346\234\200\345\260\221\347\232\204\345\237\216\345\270\202.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) floyd @@ -49,7 +47,3 @@ public: return result; } }; -

- - - diff --git "a/problems/1356.\346\240\271\346\215\256\346\225\260\345\255\227\344\272\214\350\277\233\345\210\266\344\270\2131\347\232\204\346\225\260\347\233\256\346\216\222\345\272\217.md" "b/problems/1356.\346\240\271\346\215\256\346\225\260\345\255\227\344\272\214\350\277\233\345\210\266\344\270\2131\347\232\204\346\225\260\347\233\256\346\216\222\345\272\217.md" index 9cfb674328..0ae1603494 100644 --- "a/problems/1356.\346\240\271\346\215\256\346\225\260\345\255\227\344\272\214\350\277\233\345\210\266\344\270\2131\347\232\204\346\225\260\347\233\256\346\216\222\345\272\217.md" +++ "b/problems/1356.\346\240\271\346\215\256\346\225\260\345\255\227\344\272\214\350\277\233\345\210\266\344\270\2131\347\232\204\346\225\260\347\233\256\346\216\222\345\272\217.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) @@ -217,7 +215,3 @@ var sortByBits = function(arr) { -

- - - diff --git "a/problems/1365.\346\234\211\345\244\232\345\260\221\345\260\217\344\272\216\345\275\223\345\211\215\346\225\260\345\255\227\347\232\204\346\225\260\345\255\227.md" "b/problems/1365.\346\234\211\345\244\232\345\260\221\345\260\217\344\272\216\345\275\223\345\211\215\346\225\260\345\255\227\347\232\204\346\225\260\345\255\227.md" index f0a77f5587..2cb73f728a 100644 --- "a/problems/1365.\346\234\211\345\244\232\345\260\221\345\260\217\344\272\216\345\275\223\345\211\215\346\225\260\345\255\227\347\232\204\346\225\260\345\255\227.md" +++ "b/problems/1365.\346\234\211\345\244\232\345\260\221\345\260\217\344\272\216\345\275\223\345\211\215\346\225\260\345\255\227\347\232\204\346\225\260\345\255\227.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) @@ -311,7 +309,3 @@ impl Solution { ``` -

- - - diff --git "a/problems/1382.\345\260\206\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\345\217\230\345\271\263\350\241\241.md" "b/problems/1382.\345\260\206\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\345\217\230\345\271\263\350\241\241.md" index 120cafffd3..7a1a7f3cb9 100644 --- "a/problems/1382.\345\260\206\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\345\217\230\345\271\263\350\241\241.md" +++ "b/problems/1382.\345\260\206\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\345\217\230\345\271\263\350\241\241.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 1382.将二叉搜索树变平衡 @@ -218,7 +216,3 @@ function buildTree(arr: number[], left: number, right: number): TreeNode | null -

- - - diff --git "a/problems/1791.\346\211\276\345\207\272\346\230\237\345\236\213\345\233\276\347\232\204\344\270\255\345\277\203\350\212\202\347\202\271.md" "b/problems/1791.\346\211\276\345\207\272\346\230\237\345\236\213\345\233\276\347\232\204\344\270\255\345\277\203\350\212\202\347\202\271.md" index e3db794706..e9ea5f4463 100644 --- "a/problems/1791.\346\211\276\345\207\272\346\230\237\345\236\213\345\233\276\347\232\204\344\270\255\345\277\203\350\212\202\347\202\271.md" +++ "b/problems/1791.\346\211\276\345\207\272\346\230\237\345\236\213\345\233\276\347\232\204\344\270\255\345\277\203\350\212\202\347\202\271.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 1791.找出星型图的中心节点 @@ -77,7 +75,3 @@ public: ``` -

- - - diff --git "a/problems/1971.\345\257\273\346\211\276\345\233\276\344\270\255\346\230\257\345\220\246\345\255\230\345\234\250\350\267\257\345\276\204.md" "b/problems/1971.\345\257\273\346\211\276\345\233\276\344\270\255\346\230\257\345\220\246\345\255\230\345\234\250\350\267\257\345\276\204.md" index 93e9b66365..acb544155a 100644 --- "a/problems/1971.\345\257\273\346\211\276\345\233\276\344\270\255\346\230\257\345\220\246\345\255\230\345\234\250\350\267\257\345\276\204.md" +++ "b/problems/1971.\345\257\273\346\211\276\345\233\276\344\270\255\346\230\257\345\220\246\345\255\230\345\234\250\350\267\257\345\276\204.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 1971. 寻找图中是否存在路径 @@ -335,7 +333,3 @@ func validPath(n int, edges [][]int, source int, destination int) bool { ``` -

- - - diff --git "a/problems/O(n)\347\232\204\347\256\227\346\263\225\345\261\205\347\204\266\350\266\205\346\227\266\344\272\206\357\274\214\346\255\244\346\227\266\347\232\204n\347\251\266\347\253\237\346\230\257\345\244\232\345\244\247\357\274\237.md" "b/problems/O(n)\347\232\204\347\256\227\346\263\225\345\261\205\347\204\266\350\266\205\346\227\266\344\272\206\357\274\214\346\255\244\346\227\266\347\232\204n\347\251\266\347\253\237\346\230\257\345\244\232\345\244\247\357\274\237.md" index a5dab942c8..7276af53b3 100644 --- "a/problems/O(n)\347\232\204\347\256\227\346\263\225\345\261\205\347\204\266\350\266\205\346\227\266\344\272\206\357\274\214\346\255\244\346\227\266\347\232\204n\347\251\266\347\253\237\346\230\257\345\244\232\345\244\247\357\274\237.md" +++ "b/problems/O(n)\347\232\204\347\256\227\346\263\225\345\261\205\347\204\266\350\266\205\346\227\266\344\272\206\357\274\214\346\255\244\346\227\266\347\232\204n\347\251\266\347\253\237\346\230\257\345\244\232\345\244\247\357\274\237.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 程序提交之后为什么会超时?O(n)的算法会超时,n究竟是多大? @@ -224,7 +222,3 @@ int main() { -

- - - diff --git "a/problems/images/0110.\345\255\227\347\254\246\344\270\262\346\216\245\351\276\231-03.png" "b/problems/images/0110.\345\255\227\347\254\246\344\270\262\346\216\245\351\276\231-03.png" new file mode 100644 index 0000000000000000000000000000000000000000..7ad2ced6903b82f6c6db2d8d85746df9097fc01a GIT binary patch literal 56769 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参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

' -cx $i - ex -sc '1i|' -cx $i - ex -sc '1i| ' -cx $i - ex -sc '1i|' -cx $i - ex -sc '1i|

' -cx $i + # ex -sc '1i|

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

' -cx $i + # ex -sc '1i|' -cx $i + # ex -sc '1i| ' -cx $i + # ex -sc '1i|' -cx $i + # ex -sc '1i|

' -cx $i + + ex -sc '1i|* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html)' -cx $i + ex -sc '1i|* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html)' -cx $i + ex -sc '1i|* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html)' -cx $i + + # echo '## 其他语言版本' >> $i # echo '\n' >> $i # echo 'Java:' >> $i @@ -48,10 +54,10 @@ do # 添加结尾 - echo '

' >> $i - echo '' >> $i - echo ' ' >> $i - echo '' >> $i + # echo '

' >> $i + # echo '' >> $i + # echo ' ' >> $i + # echo '' >> $i # echo '-----------------------' >> $i diff --git "a/problems/\344\270\272\344\272\206\347\273\235\346\235\200\347\274\226\350\276\221\350\267\235\347\246\273\357\274\214\345\215\241\345\260\224\345\201\232\344\272\206\344\270\211\346\255\245\351\223\272\345\236\253.md" "b/problems/\344\270\272\344\272\206\347\273\235\346\235\200\347\274\226\350\276\221\350\267\235\347\246\273\357\274\214\345\215\241\345\260\224\345\201\232\344\272\206\344\270\211\346\255\245\351\223\272\345\236\253.md" index c2f5efd96d..69d6aa9c45 100644 --- "a/problems/\344\270\272\344\272\206\347\273\235\346\235\200\347\274\226\350\276\221\350\267\235\347\246\273\357\274\214\345\215\241\345\260\224\345\201\232\344\272\206\344\270\211\346\255\245\351\223\272\345\236\253.md" +++ "b/problems/\344\270\272\344\272\206\347\273\235\346\235\200\347\274\226\350\276\221\350\267\235\347\246\273\357\274\214\345\215\241\345\260\224\345\201\232\344\272\206\344\270\211\346\255\245\351\223\272\345\236\253.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 动态规划之编辑距离总结篇 @@ -196,7 +194,3 @@ class Solution { -

- - - diff --git "a/problems/\344\272\214\345\217\211\346\240\221\344\270\255\351\200\222\345\275\222\345\270\246\347\235\200\345\233\236\346\272\257.md" "b/problems/\344\272\214\345\217\211\346\240\221\344\270\255\351\200\222\345\275\222\345\270\246\347\235\200\345\233\236\346\272\257.md" index 42d78ae39f..7fa2b6ec94 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\344\270\255\351\200\222\345\275\222\345\270\246\347\235\200\345\233\236\346\272\257.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\344\270\255\351\200\222\345\275\222\345\270\246\347\235\200\345\233\236\346\272\257.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 二叉树:以为使用了递归,其实还隐藏着回溯 @@ -687,7 +685,3 @@ impl Solution { ``` -

- - - diff --git "a/problems/\344\272\214\345\217\211\346\240\221\346\200\273\347\273\223\347\257\207.md" "b/problems/\344\272\214\345\217\211\346\240\221\346\200\273\347\273\223\347\257\207.md" index 4794233ab5..f4d093d638 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\346\200\273\347\273\223\347\257\207.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 二叉树:总结篇!(需要掌握的二叉树技能都在这里了) @@ -158,8 +156,4 @@ -

- - - diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" index c665827791..9a63b66cfd 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) @@ -314,7 +312,3 @@ public class TreeNode } ``` -

- - - diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\347\273\237\344\270\200\350\277\255\344\273\243\346\263\225.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\347\273\237\344\270\200\350\277\255\344\273\243\346\263\225.md" index a6d4e3ffc3..d001e0f7a7 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\347\273\237\344\270\200\350\277\255\344\273\243\346\263\225.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\347\273\237\344\270\200\350\277\255\344\273\243\346\263\225.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) > 统一写法是一种什么感觉 @@ -970,8 +968,4 @@ public IList PostorderTraversal(TreeNode root) ``` -

- - - diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" index a3c5b38fa0..289c651b60 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) > 听说还可以用非递归的方式 @@ -797,7 +795,3 @@ public IList PostorderTraversal(TreeNode root) } ``` -

- - - diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" index 8f61b8c69a..ffa3ff6cf8 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) > 一看就会,一写就废! @@ -728,7 +726,3 @@ function traversal($root, array &$output) { ``` -

- - - diff --git "a/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" "b/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" index f5803cb452..fd2d16f47a 100644 --- "a/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" +++ "b/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 替换数字 @@ -171,7 +169,3 @@ for (int i = 0; i < a.size(); i++) { -

- - - diff --git "a/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" "b/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" index e32f4ce15d..6fe12e3d51 100644 --- "a/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 右旋字符串 @@ -176,7 +174,3 @@ int main() { -

- - - diff --git "a/problems/\345\212\250\346\200\201\350\247\204\345\210\222-\350\202\241\347\245\250\351\227\256\351\242\230\346\200\273\347\273\223\347\257\207.md" "b/problems/\345\212\250\346\200\201\350\247\204\345\210\222-\350\202\241\347\245\250\351\227\256\351\242\230\346\200\273\347\273\223\347\257\207.md" index 7927deb7d7..314fb471b1 100644 --- "a/problems/\345\212\250\346\200\201\350\247\204\345\210\222-\350\202\241\347\245\250\351\227\256\351\242\230\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/\345\212\250\346\200\201\350\247\204\345\210\222-\350\202\241\347\245\250\351\227\256\351\242\230\346\200\273\347\273\223\347\257\207.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # Leetcode股票问题总结篇! @@ -474,7 +472,3 @@ public: -

- - - diff --git "a/problems/\345\212\250\346\200\201\350\247\204\345\210\222\346\200\273\347\273\223\347\257\207.md" "b/problems/\345\212\250\346\200\201\350\247\204\345\210\222\346\200\273\347\273\223\347\257\207.md" index dd1646d6d8..faca5ecb55 100644 --- "a/problems/\345\212\250\346\200\201\350\247\204\345\210\222\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/\345\212\250\346\200\201\350\247\204\345\210\222\346\200\273\347\273\223\347\257\207.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 动态规划最强总结篇! @@ -132,7 +130,3 @@ 所以Carl花费的这么大精力,把自己对动规算法理解 一五一十的全部分享给了录友们,帮助大家少走弯路,加油! -

- - - diff --git "a/problems/\345\212\250\346\200\201\350\247\204\345\210\222\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\345\212\250\346\200\201\350\247\204\345\210\222\347\220\206\350\256\272\345\237\272\347\241\200.md" index 9ffb453377..634f710f9a 100644 --- "a/problems/\345\212\250\346\200\201\350\247\204\345\210\222\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\345\212\250\346\200\201\350\247\204\345\210\222\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 动态规划理论基础 @@ -132,7 +130,3 @@ -

- - - diff --git "a/problems/\345\217\214\346\214\207\351\222\210\346\200\273\347\273\223.md" "b/problems/\345\217\214\346\214\207\351\222\210\346\200\273\347\273\223.md" index 409e80ab98..9c92e3d6c3 100644 --- "a/problems/\345\217\214\346\214\207\351\222\210\346\200\273\347\273\223.md" +++ "b/problems/\345\217\214\346\214\207\351\222\210\346\200\273\347\273\223.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) > 又是一波总结 @@ -95,7 +93,3 @@ for (int i = 0; i < array.size(); i++) { 建议大家可以把文中涉及到的题目在好好做一做,琢磨琢磨,基本对双指针法就不在话下了。 -

- - - diff --git "a/problems/\345\223\210\345\270\214\350\241\250\346\200\273\347\273\223.md" "b/problems/\345\223\210\345\270\214\350\241\250\346\200\273\347\273\223.md" index cde23ad138..55caffe4f0 100644 --- "a/problems/\345\223\210\345\270\214\350\241\250\346\200\273\347\273\223.md" +++ "b/problems/\345\223\210\345\270\214\350\241\250\346\200\273\347\273\223.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) > 哈希表总结篇如约而至 @@ -126,7 +124,3 @@ std::unordered_map 底层实现为哈希,std::map 和std::multimap 的底层 -

- - - diff --git "a/problems/\345\223\210\345\270\214\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\345\223\210\345\270\214\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" index 825c465719..b7d10671e1 100644 --- "a/problems/\345\223\210\345\270\214\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\345\223\210\345\270\214\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) @@ -132,7 +130,3 @@ std::unordered_map 底层实现为哈希表,std::map 和std::multimap 的底 -

- - - diff --git "a/problems/\345\233\236\346\272\257\346\200\273\347\273\223.md" "b/problems/\345\233\236\346\272\257\346\200\273\347\273\223.md" index 8d9b78c4b9..b8d96193ee 100644 --- "a/problems/\345\233\236\346\272\257\346\200\273\347\273\223.md" +++ "b/problems/\345\233\236\346\272\257\346\200\273\347\273\223.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) @@ -448,7 +446,3 @@ N皇后问题分析: -

- - - diff --git "a/problems/\345\233\236\346\272\257\347\256\227\346\263\225\345\216\273\351\207\215\351\227\256\351\242\230\347\232\204\345\217\246\344\270\200\347\247\215\345\206\231\346\263\225.md" "b/problems/\345\233\236\346\272\257\347\256\227\346\263\225\345\216\273\351\207\215\351\227\256\351\242\230\347\232\204\345\217\246\344\270\200\347\247\215\345\206\231\346\263\225.md" index 96dfeffec3..f1e1570a61 100644 --- "a/problems/\345\233\236\346\272\257\347\256\227\346\263\225\345\216\273\351\207\215\351\227\256\351\242\230\347\232\204\345\217\246\344\270\200\347\247\215\345\206\231\346\263\225.md" +++ "b/problems/\345\233\236\346\272\257\347\256\227\346\263\225\345\216\273\351\207\215\351\227\256\351\242\230\347\232\204\345\217\246\344\270\200\347\247\215\345\206\231\346\263\225.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 回溯算法去重问题的另一种写法 @@ -709,7 +707,3 @@ impl Solution { ``` -

- - - diff --git "a/problems/\345\233\236\346\272\257\347\256\227\346\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\345\233\236\346\272\257\347\256\227\346\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md" index 862fb101a1..474fb8f749 100644 --- "a/problems/\345\233\236\346\272\257\347\256\227\346\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\345\233\236\346\272\257\347\256\227\346\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 回溯算法理论基础 @@ -176,7 +174,3 @@ void backtracking(参数) { -

- - - diff --git "a/problems/\345\255\227\347\254\246\344\270\262\346\200\273\347\273\223.md" "b/problems/\345\255\227\347\254\246\344\270\262\346\200\273\347\273\223.md" index 7da9791400..460944c5d2 100644 --- "a/problems/\345\255\227\347\254\246\344\270\262\346\200\273\347\273\223.md" +++ "b/problems/\345\255\227\347\254\246\344\270\262\346\200\273\347\273\223.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 字符串:总结篇 @@ -124,7 +122,3 @@ KMP算法是字符串查找最重要的算法,但彻底理解KMP并不容易 -

- - - diff --git "a/problems/\346\225\260\347\273\204\346\200\273\347\273\223\347\257\207.md" "b/problems/\346\225\260\347\273\204\346\200\273\347\273\223\347\257\207.md" index 7c2fd94724..e45165a625 100644 --- "a/problems/\346\225\260\347\273\204\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/\346\225\260\347\273\204\346\200\273\347\273\223\347\257\207.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 数组总结篇 @@ -135,7 +133,3 @@ 推荐的题目即使大家之前做过了,再读一遍文章,也会帮助你提炼出解题的精髓所在。 -

- - - diff --git "a/problems/\346\225\260\347\273\204\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\346\225\260\347\273\204\347\220\206\350\256\272\345\237\272\347\241\200.md" index e6d25c15e6..c1ac287d0f 100644 --- "a/problems/\346\225\260\347\273\204\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\346\225\260\347\273\204\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) @@ -119,7 +117,3 @@ public static void test_arr() { -

- - - diff --git "a/problems/\346\240\210\344\270\216\351\230\237\345\210\227\346\200\273\347\273\223.md" "b/problems/\346\240\210\344\270\216\351\230\237\345\210\227\346\200\273\347\273\223.md" index df022c779b..2d09daeb94 100644 --- "a/problems/\346\240\210\344\270\216\351\230\237\345\210\227\346\200\273\347\273\223.md" +++ "b/problems/\346\240\210\344\270\216\351\230\237\345\210\227\346\200\273\347\273\223.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 栈与队列总结篇 @@ -160,7 +158,3 @@ cd a/b/c/../../ -

- - - diff --git "a/problems/\346\240\210\344\270\216\351\230\237\345\210\227\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\346\240\210\344\270\216\351\230\237\345\210\227\347\220\206\350\256\272\345\237\272\347\241\200.md" index 21c61a4c8b..bff0ec634b 100644 --- "a/problems/\346\240\210\344\270\216\351\230\237\345\210\227\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\346\240\210\344\270\216\351\230\237\345\210\227\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) > 来看看栈和队列不为人知的一面 @@ -93,7 +91,3 @@ std::queue> third; // 定义以list为底层容器的队列 -

- - - diff --git "a/problems/\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227\357\274\210vector\345\216\237\347\220\206\350\256\262\350\247\243\357\274\211.md" "b/problems/\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227\357\274\210vector\345\216\237\347\220\206\350\256\262\350\247\243\357\274\211.md" index 70a9a97a19..a2350835d6 100644 --- "a/problems/\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227\357\274\210vector\345\216\237\347\220\206\350\256\262\350\247\243\357\274\211.md" +++ "b/problems/\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227\357\274\210vector\345\216\237\347\220\206\350\256\262\350\247\243\357\274\211.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) @@ -209,7 +207,3 @@ Go中slice的`append`操作和C++中vector的扩容机制基本相同。 -

- - - diff --git "a/problems/\347\256\227\346\263\225\346\250\241\346\235\277.md" "b/problems/\347\256\227\346\263\225\346\250\241\346\235\277.md" index 0d32cebb2d..068806d622 100644 --- "a/problems/\347\256\227\346\263\225\346\250\241\346\235\277.md" +++ "b/problems/\347\256\227\346\263\225\346\250\241\346\235\277.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 算法模板 ## 算法模板 @@ -853,7 +851,3 @@ Go: -

- - - diff --git "a/problems/\350\203\214\345\214\205\346\200\273\347\273\223\347\257\207.md" "b/problems/\350\203\214\345\214\205\346\200\273\347\273\223\347\257\207.md" index 651a92a804..3c587b6d2e 100644 --- "a/problems/\350\203\214\345\214\205\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/\350\203\214\345\214\205\346\200\273\347\273\223\347\257\207.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 听说背包问题很难? 这篇总结篇来拯救你了 @@ -103,7 +101,3 @@ -

- - - diff --git "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" index d9b953c0b3..c2598ec99a 100644 --- "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" +++ "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) @@ -593,7 +591,3 @@ int main() { -

- - - diff --git "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" index b5862bb52b..6caa4f6327 100644 --- "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" +++ "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 动态规划:01背包理论基础(滚动数组) @@ -461,7 +459,3 @@ int main() { ``` -

- - - diff --git "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\345\256\214\345\205\250\350\203\214\345\214\205\344\270\200\347\273\264.md" "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\345\256\214\345\205\250\350\203\214\345\214\205\344\270\200\347\273\264.md" index a8e241c3ba..5a23b67c73 100644 --- "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\345\256\214\345\205\250\350\203\214\345\214\205\344\270\200\347\273\264.md" +++ "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\345\256\214\345\205\250\350\203\214\345\214\205\344\270\200\347\273\264.md" @@ -1,3 +1,6 @@ +* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 完全背包-一维数组 diff --git "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\244\232\351\207\215\350\203\214\345\214\205.md" "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\244\232\351\207\215\350\203\214\345\214\205.md" index 878efc1297..39e7ebe378 100644 --- "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\244\232\351\207\215\350\203\214\345\214\205.md" +++ "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\244\232\351\207\215\350\203\214\345\214\205.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 动态规划:关于多重背包,你该了解这些! @@ -237,7 +235,3 @@ print(dp[-1]) -

- - - diff --git "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" index ea658f7e51..d76ff196b1 100644 --- "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" +++ "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 完全背包理论基础-二维DP数组 @@ -362,7 +360,3 @@ readline.on('close', () => { ``` -

- - - diff --git "a/problems/\350\264\252\345\277\203\347\256\227\346\263\225\346\200\273\347\273\223\347\257\207.md" "b/problems/\350\264\252\345\277\203\347\256\227\346\263\225\346\200\273\347\273\223\347\257\207.md" index 14d82151c9..7d4c57e877 100644 --- "a/problems/\350\264\252\345\277\203\347\256\227\346\263\225\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/\350\264\252\345\277\203\347\256\227\346\263\225\346\200\273\347\273\223\347\257\207.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 贪心算法总结篇 @@ -151,7 +149,3 @@ Carl个人认为:如果找出局部最优并可以推出全局最优,就是 -

- - - diff --git "a/problems/\350\264\252\345\277\203\347\256\227\346\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\350\264\252\345\277\203\347\256\227\346\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md" index 6fde2dbbe6..14f397296f 100644 --- "a/problems/\350\264\252\345\277\203\347\256\227\346\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\350\264\252\345\277\203\347\256\227\346\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 关于贪心算法,你该了解这些! @@ -92,7 +90,3 @@ 最后给出贪心的一般解题步骤,大家可以发现这个解题步骤也是比较抽象的,不像是二叉树,回溯算法,给出了那么具体的解题套路和模板。 -

- - - diff --git "a/problems/\351\223\276\350\241\250\346\200\273\347\273\223\347\257\207.md" "b/problems/\351\223\276\350\241\250\346\200\273\347\273\223\347\257\207.md" index 7da0d2de3c..e29ba268a3 100644 --- "a/problems/\351\223\276\350\241\250\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/\351\223\276\350\241\250\346\200\273\347\273\223\347\257\207.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 链表总结篇 @@ -98,7 +96,3 @@ -

- - - diff --git "a/problems/\351\223\276\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\351\223\276\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" index d131380728..3637d05f5a 100644 --- "a/problems/\351\223\276\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\351\223\276\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) @@ -275,7 +273,3 @@ public class Node -

- - - diff --git "a/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" "b/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" index 48944b5e4e..f8d9039a48 100644 --- "a/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" +++ "b/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" @@ -1,8 +1,6 @@ -

- - - -

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!

+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 面试题 02.07. 链表相交 @@ -575,7 +573,3 @@ func getIntersectionNode(_ headA: ListNode?, _ headB: ListNode?) -> ListNode? { ``` -

- - - From 18ba181db38a7b619062df6122c7081bf9d7af79 Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Sun, 16 Mar 2025 17:28:55 +0800 Subject: [PATCH 3015/3019] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=A1=A8=E8=BE=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" | 2 -- "problems/0042.\346\216\245\351\233\250\346\260\264.md" | 1 - 2 files changed, 3 deletions(-) diff --git "a/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" "b/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" index 281db4dc86..4a9d59cc23 100644 --- "a/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" +++ "b/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" @@ -3,8 +3,6 @@ * [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) -> 这篇可以说是全网把组合问题如何去重,讲的最清晰的了! - # 40.组合总和II [力扣题目链接](https://leetcode.cn/problems/combination-sum-ii/) diff --git "a/problems/0042.\346\216\245\351\233\250\346\260\264.md" "b/problems/0042.\346\216\245\351\233\250\346\260\264.md" index 8a424e3ea2..8c43ae6051 100644 --- "a/problems/0042.\346\216\245\351\233\250\346\260\264.md" +++ "b/problems/0042.\346\216\245\351\233\250\346\260\264.md" @@ -5,7 +5,6 @@ -> 这个图就是大厂面试经典题目,接雨水! 最常青藤的一道题,面试官百出不厌! # 42. 接雨水 From 73a3cb532fd01f0abacb317b084630d46c640446 Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Mon, 17 Mar 2025 10:57:51 +0800 Subject: [PATCH 3016/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=8F=8F=E8=BF=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 ++-- ...\227\347\254\246\344\270\262\346\216\245\351\276\231.md" | 6 +----- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index acd07c28d0..2d40e2b99d 100644 --- a/README.md +++ b/README.md @@ -385,8 +385,8 @@ 8. [图论:孤岛的总面积](./problems/kamacoder/0101.孤岛的总面积.md) 9. [图论:沉没孤岛](./problems/kamacoder/0102.沉没孤岛.md) 10. [图论:水流问题](./problems/kamacoder/0103.水流问题.md) -11. [图论:岛屿的周长](./problems/kamacoder/0106.岛屿的周长.md) -12. [图论:建造最大岛屿](./problems/kamacoder/0104.建造最大岛屿.md) +11. [图论:建造最大岛屿](./problems/kamacoder/0104.建造最大岛屿.md) +12. [图论:岛屿的周长](./problems/kamacoder/0106.岛屿的周长.md) 13. [图论:字符串接龙](./problems/kamacoder/0110.字符串接龙.md) 14. [图论:有向图的完全可达性](./problems/kamacoder/0105.有向图的完全可达性.md) 15. [图论:并查集理论基础](./problems/kamacoder/图论并查集理论基础.md) diff --git "a/problems/kamacoder/0110.\345\255\227\347\254\246\344\270\262\346\216\245\351\276\231.md" "b/problems/kamacoder/0110.\345\255\227\347\254\246\344\270\262\346\216\245\351\276\231.md" index f6d97866da..8bae6280bf 100644 --- "a/problems/kamacoder/0110.\345\255\227\347\254\246\344\270\262\346\216\245\351\276\231.md" +++ "b/problems/kamacoder/0110.\345\255\227\347\254\246\344\270\262\346\216\245\351\276\231.md" @@ -57,11 +57,7 @@ yhn 2 <= N <= 500

-<<<<<<< HEAD - -======= - ->>>>>>> d0bd2dc5 (更新图) +

From 91e7dab72c2053502928607738575d9b1002ad7f Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Mon, 17 Mar 2025 11:18:46 +0800 Subject: [PATCH 3017/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E8=A1=A8=E8=BE=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...7\264\350\264\247\347\211\251\350\277\220\350\276\223III.md" | 2 -- 1 file changed, 2 deletions(-) diff --git "a/problems/kamacoder/0096.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223III.md" "b/problems/kamacoder/0096.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223III.md" index 0e13846d60..eb80e048f6 100644 --- "a/problems/kamacoder/0096.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223III.md" +++ "b/problems/kamacoder/0096.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223III.md" @@ -387,8 +387,6 @@ int main() { * 本题可以有负权回路,说明只要多做松弛,结果是会变的。 * 本题要求最多经过k个节点,对松弛次数是有限制的。 -如果本题中 没有负权回路的测试用例, 那版本一的代码就可以过了,也就不用我费这么大口舌去讲解的这个坑了。 - ## 拓展三(SPFA) 本题也可以用 SPFA来做,关于 SPFA ,已经在这里 [0094.城市间货物运输I-SPFA](./0094.城市间货物运输I-SPFA.md) 有详细讲解。 From 86a0208485d7379a4e4f0e4dda4545eec34ac9da Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Mon, 17 Mar 2025 15:52:23 +0800 Subject: [PATCH 3018/3019] =?UTF-8?q?=E6=9B=BF=E6=8D=A2=E5=9B=BE=E7=89=87?= =?UTF-8?q?=E9=93=BE=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 8 ++-- ...44\346\225\260\344\271\213\345\222\214.md" | 4 +- ...36\346\226\207\345\255\220\344\270\262.md" | 4 +- ...27\346\257\215\347\273\204\345\220\210.md" | 4 +- ...4N\344\270\252\350\212\202\347\202\271.md" | 2 +- ...10\347\232\204\346\213\254\345\217\267.md" | 6 +-- ...22\345\205\245\344\275\215\347\275\256.md" | 10 ++-- ...7.\350\247\243\346\225\260\347\213\254.md" | 8 ++-- ...04\345\220\210\346\200\273\345\222\214.md" | 8 ++-- ...\345\220\210\346\200\273\345\222\214II.md" | 6 +-- ...2.\346\216\245\351\233\250\346\260\264.md" | 14 +++--- ...\350\267\203\346\270\270\346\210\217II.md" | 6 +-- ...6.\345\205\250\346\216\222\345\210\227.md" | 6 +-- ...\345\205\250\346\216\222\345\210\227II.md" | 6 +-- "problems/0051.N\347\232\207\345\220\216.md" | 6 +-- .../0052.N\347\232\207\345\220\216II.md" | 2 +- ...01\350\247\204\345\210\222\357\274\211.md" | 2 +- ...72\346\227\213\347\237\251\351\230\265.md" | 2 +- ...63\350\267\203\346\270\270\346\210\217.md" | 2 +- ...10\345\271\266\345\214\272\351\227\264.md" | 2 +- ...\346\227\213\347\237\251\351\230\265II.md" | 2 +- ...15\345\220\214\350\267\257\345\276\204.md" | 10 ++-- ...\345\220\214\350\267\257\345\276\204II.md" | 12 ++--- ...0.\347\210\254\346\245\274\346\242\257.md" | 2 +- ...26\350\276\221\350\267\235\347\246\273.md" | 4 +- "problems/0077.\347\273\204\345\220\210.md" | 10 ++-- ...04\345\220\210\344\274\230\345\214\226.md" | 2 +- ...47\347\232\204\347\237\251\345\275\242.md" | 10 ++-- "problems/0090.\345\255\220\351\233\206II.md" | 2 +- ...\345\216\237IP\345\234\260\345\235\200.md" | 4 +- ...11\346\220\234\347\264\242\346\240\221.md" | 10 ++-- ...11\346\220\234\347\264\242\346\240\221.md" | 4 +- ...70\345\220\214\347\232\204\346\240\221.md" | 4 +- ...60\344\272\214\345\217\211\346\240\221.md" | 4 +- ...02\345\272\217\351\201\215\345\216\206.md" | 18 +++---- ...00\345\244\247\346\267\261\345\272\246.md" | 6 +-- ...40\344\272\214\345\217\211\346\240\221.md" | 8 ++-- ...11\346\220\234\347\264\242\346\240\221.md" | 4 +- ...41\344\272\214\345\217\211\346\240\221.md" | 6 +-- ...00\345\260\217\346\267\261\345\272\246.md" | 2 +- ...57\345\276\204\346\200\273\345\222\214.md" | 8 ++-- ...04\345\255\220\345\272\217\345\210\227.md" | 4 +- ...02\347\202\271\346\214\207\351\222\210.md" | 2 +- ...00\344\275\263\346\227\266\346\234\272.md" | 2 +- ...\344\275\263\346\227\266\346\234\272II.md" | 2 +- ...344\275\263\346\227\266\346\234\272III.md" | 2 +- ...25\350\257\215\346\216\245\351\276\231.md" | 2 +- ...25\347\232\204\345\214\272\345\237\237.md" | 6 +-- ...\345\233\236\346\226\207\344\270\262II.md" | 2 +- ...4.\345\212\240\346\262\271\347\253\231.md" | 4 +- ...06\345\217\221\347\263\226\346\236\234.md" | 6 +-- ...25\350\257\215\346\213\206\345\210\206.md" | 4 +- ...57\345\275\242\351\223\276\350\241\250.md" | 2 +- ...\345\275\242\351\223\276\350\241\250II.md" | 12 ++--- ...15\346\216\222\351\223\276\350\241\250.md" | 2 +- ...\344\275\263\346\227\266\346\234\272IV.md" | 2 +- ...23\345\256\266\345\212\253\350\210\215.md" | 2 +- ...7.\345\271\277\346\220\234\347\211\210.md" | 6 +-- ...7.\346\267\261\346\220\234\347\211\210.md" | 4 +- ...76\350\241\250\345\205\203\347\264\240.md" | 12 ++--- ...73\350\275\254\351\223\276\350\241\250.md" | 2 +- ...04\345\255\220\346\225\260\347\273\204.md" | 2 +- ...\345\256\266\345\212\253\350\210\215II.md" | 6 +-- ...345\220\210\346\200\273\345\222\214III.md" | 6 +-- ...02\347\202\271\344\270\252\346\225\260.md" | 12 ++--- ...54\344\272\214\345\217\211\346\240\221.md" | 4 +- ...54\345\205\261\347\245\226\345\205\210.md" | 6 +-- ...54\345\205\261\347\245\226\345\205\210.md" | 12 ++--- ...00\346\234\211\350\267\257\345\276\204.md" | 6 +-- ...50\345\271\263\346\226\271\346\225\260.md" | 2 +- ...07\345\255\220\345\272\217\345\210\227.md" | 2 +- ...53\345\206\267\345\206\273\346\234\237.md" | 4 +- ...66\351\222\261\345\205\221\346\215\242.md" | 2 +- ...11\346\216\222\350\241\214\347\250\213.md" | 6 +-- ...345\256\266\345\212\253\350\210\215III.md" | 4 +- ...64\346\225\260\346\213\206\345\210\206.md" | 2 +- ...04\347\232\204\344\272\244\351\233\206.md" | 4 +- ...06\345\212\250\345\272\217\345\210\227.md" | 12 ++--- ...10\346\200\273\345\222\214\342\205\243.md" | 2 +- ...55\345\255\220\345\272\217\345\210\227.md" | 6 +-- ...66\345\255\220\344\271\213\345\222\214.md" | 6 +-- ...15\345\273\272\351\230\237\345\210\227.md" | 2 +- ...11\345\222\214\345\255\220\351\233\206.md" | 2 +- ...64\346\265\201\351\227\256\351\242\230.md" | 6 +-- ...15\345\217\240\345\214\272\351\227\264.md" | 2 +- ...55\347\232\204\350\212\202\347\202\271.md" | 2 +- ...25\347\210\206\346\260\224\347\220\203.md" | 2 +- ...06\345\217\221\351\245\274\345\271\262.md" | 4 +- ...20\345\255\227\347\254\246\344\270\262.md" | 30 ++++++------ ...77\347\232\204\345\221\250\351\225\277.md" | 2 +- ...4.\344\270\200\345\222\214\351\233\266.md" | 4 +- ...36\345\255\220\345\272\217\345\210\227.md" | 4 +- ...4.\347\233\256\346\240\207\345\222\214.md" | 30 ++++++------ ...55\347\232\204\344\274\227\346\225\260.md" | 4 +- ...13\350\247\222\347\232\204\345\200\274.md" | 4 +- ...07\345\255\220\345\272\217\345\210\227.md" | 8 ++-- ...\351\222\261\345\205\221\346\215\242II.md" | 4 +- ...17\347\273\235\345\257\271\345\267\256.md" | 4 +- ...72\347\264\257\345\212\240\346\240\221.md" | 4 +- ...40\351\231\244\346\223\215\344\275\234.md" | 2 +- ...66\344\272\214\345\217\211\346\240\221.md" | 2 +- ...36\346\226\207\345\255\220\344\270\262.md" | 6 +-- ...47\344\272\214\345\217\211\346\240\221.md" | 2 +- ...11\346\220\234\347\264\242\346\240\221.md" | 10 ++-- ...27\347\232\204\344\270\252\346\225\260.md" | 2 +- ...22\345\242\236\345\272\217\345\210\227.md" | 2 +- ...27\344\275\231\350\277\236\346\216\245.md" | 6 +-- ...\344\275\231\350\277\236\346\216\245II.md" | 4 +- ...00\345\244\247\351\235\242\347\247\257.md" | 4 +- ...55\347\232\204\346\220\234\347\264\242.md" | 4 +- ...22\345\205\245\346\223\215\344\275\234.md" | 2 +- ...14\345\210\206\346\237\245\346\211\276.md" | 4 +- ...76\350\256\241\351\223\276\350\241\250.md" | 6 +-- ...15\345\255\220\346\225\260\347\273\204.md" | 4 +- ...17\346\227\245\346\270\251\345\272\246.md" | 24 +++++----- ...66\350\277\237\346\227\266\351\227\264.md" | 46 +++++++++--------- ...71\347\210\254\346\245\274\346\242\257.md" | 4 +- ...27\346\257\215\345\214\272\351\227\264.md" | 2 +- ...34\347\232\204\350\210\252\347\217\255.md" | 6 +-- ...75\347\232\204\350\267\257\345\276\204.md" | 4 +- ...47\344\272\272\345\267\245\345\262\233.md" | 6 +-- ...31\345\222\214\346\210\277\351\227\264.md" | 4 +- ...61\350\204\211\346\225\260\347\273\204.md" | 2 +- ...47\344\272\214\345\217\211\346\240\221.md" | 10 ++-- ...60\347\232\204\346\225\260\351\207\217.md" | 8 ++-- ...70\344\272\244\347\232\204\347\272\277.md" | 4 +- ...\347\232\204\351\207\215\351\207\217II.md" | 2 +- ...61\345\255\220\345\272\217\345\210\227.md" | 4 +- ...77\347\232\204\346\225\260\347\233\256.md" | 4 +- ...21\345\217\230\345\271\263\350\241\241.md" | 2 +- ...55\345\277\203\350\212\202\347\202\271.md" | 2 +- ...30\345\234\250\350\267\257\345\276\204.md" | 2 +- ...57\345\244\232\345\244\247\357\274\237.md" | 10 ++-- ...17\202\344\274\232dijkstra\345\240\206.md" | 14 +++--- ...74\232dijkstra\346\234\264\347\264\240.md" | 40 ++++++++-------- .../0053.\345\257\273\345\256\235-Kruskal.md" | 20 ++++---- .../0053.\345\257\273\345\256\235-prim.md" | 22 ++++----- ...77\346\215\242\346\225\260\345\255\227.md" | 4 +- ...13\345\255\227\347\254\246\344\270\262.md" | 8 ++-- ...8.\345\214\272\351\227\264\345\222\214.md" | 4 +- ...\211\251\350\277\220\350\276\223I-SPFA.md" | 20 ++++---- ...7\347\211\251\350\277\220\350\276\223I.md" | 20 ++++---- ...\347\211\251\350\277\220\350\276\223II.md" | 4 +- ...347\211\251\350\277\220\350\276\223III.md" | 40 ++++++++-------- ...16\351\200\233\345\205\254\345\233\255.md" | 12 ++--- ...57\350\276\276\350\267\257\345\276\204.md" | 4 +- ...60\351\207\217\345\271\277\346\220\234.md" | 6 +-- ...60\351\207\217\346\267\261\346\220\234.md" | 4 +- ...00\345\244\247\351\235\242\347\247\257.md" | 4 +- ...04\346\200\273\351\235\242\347\247\257.md" | 6 +-- ...11\346\262\241\345\255\244\345\262\233.md" | 6 +-- ...64\346\265\201\351\227\256\351\242\230.md" | 6 +-- ...00\345\244\247\345\262\233\345\261\277.md" | 10 ++-- ...50\345\217\257\350\276\276\346\200\247.md" | 4 +- ...77\347\232\204\345\221\250\351\225\277.md" | 8 ++-- ...50\347\232\204\350\267\257\345\276\204.md" | 2 +- ...27\344\275\231\350\277\236\346\216\245.md" | 12 ++--- ...\344\275\231\350\277\236\346\216\245II.md" | 12 ++--- ...46\344\270\262\346\216\245\351\276\231.md" | 4 +- ...57\344\273\266\346\236\204\345\273\272.md" | 22 ++++----- ...7\232\204\346\224\273\345\207\273astar.md" | 8 ++-- ...06\350\256\272\345\237\272\347\241\200.md" | 24 +++++----- ...06\350\256\272\345\237\272\347\241\200.md" | 6 +-- ...06\350\256\272\345\237\272\347\241\200.md" | 14 +++--- ...06\350\256\272\345\237\272\347\241\200.md" | 30 ++++++------ ...30\346\200\273\347\273\223\347\257\207.md" | 2 +- problems/qita/acm.md | 20 ++++---- problems/qita/join.md | 48 +++++++++---------- problems/qita/server.md | 6 +-- problems/qita/shejimoshi.md | 14 +++--- problems/qita/tulunfabu.md | 34 ++++++------- ...21\346\200\273\347\273\223\347\257\207.md" | 2 +- ...06\350\256\272\345\237\272\347\241\200.md" | 16 +++---- ...55\344\273\243\351\201\215\345\216\206.md" | 2 +- .../ACM\346\250\241\345\274\217.md" | 18 +++---- ...72\344\272\214\345\217\211\346\240\221.md" | 16 +++---- "problems/\345\211\215\345\272\217/vim.md" | 2 +- ...43\347\240\201\351\243\216\346\240\274.md" | 2 +- ...05\345\255\230\346\266\210\350\200\227.md" | 8 ++-- ...64\345\244\215\346\235\202\345\272\246.md" | 6 +-- ...17\345\221\230\347\256\200\345\216\206.md" | 4 +- ...27\346\263\225\350\266\205\346\227\266.md" | 10 ++-- ...02\345\272\246\345\210\206\346\236\220.md" | 6 +-- ...64\345\244\215\346\235\202\345\272\246.md" | 4 +- ...77\346\215\242\347\251\272\346\240\274.md" | 4 +- ...54\345\255\227\347\254\246\344\270\262.md" | 8 ++-- ...50\346\234\253\346\200\273\347\273\223.md" | 2 +- ...50\346\234\253\346\200\273\347\273\223.md" | 10 ++-- ...50\346\234\253\346\200\273\347\273\223.md" | 12 ++--- ...50\346\234\253\346\200\273\347\273\223.md" | 10 ++-- ...50\346\234\253\346\200\273\347\273\223.md" | 2 +- ...50\346\234\253\346\200\273\347\273\223.md" | 4 +- ...50\346\234\253\346\200\273\347\273\223.md" | 8 ++-- ...50\346\234\253\346\200\273\347\273\223.md" | 12 ++--- ...50\346\234\253\346\200\273\347\273\223.md" | 6 +-- ...50\346\234\253\346\200\273\347\273\223.md" | 4 +- ...50\346\234\253\346\200\273\347\273\223.md" | 10 ++-- ...50\346\234\253\346\200\273\347\273\223.md" | 6 +-- ...06\350\256\272\345\237\272\347\241\200.md" | 12 ++--- ...36\346\272\257\346\200\273\347\273\223.md" | 42 ++++++++-------- ...00\347\247\215\345\206\231\346\263\225.md" | 4 +- ...06\350\256\272\345\237\272\347\241\200.md" | 4 +- ...04\346\200\273\347\273\223\347\257\207.md" | 2 +- ...06\350\256\272\345\237\272\347\241\200.md" | 6 +-- ...06\350\256\272\345\237\272\347\241\200.md" | 6 +-- ...06\350\256\262\350\247\243\357\274\211.md" | 8 ++-- ...05\346\200\273\347\273\223\347\257\207.md" | 4 +- ...47\241\20001\350\203\214\345\214\205-1.md" | 26 +++++----- ...47\241\20001\350\203\214\345\214\205-2.md" | 2 +- ...14\345\214\205\344\270\200\347\273\264.md" | 4 +- ...14\345\205\250\350\203\214\345\214\205.md" | 10 ++-- ...25\346\200\273\347\273\223\347\257\207.md" | 2 +- ...06\350\256\272\345\237\272\347\241\200.md" | 2 +- ...50\346\200\273\347\273\223\347\257\207.md" | 2 +- ...06\350\256\272\345\237\272\347\241\200.md" | 14 +++--- ...76\350\241\250\347\233\270\344\272\244.md" | 8 ++-- 216 files changed, 813 insertions(+), 813 deletions(-) diff --git a/README.md b/README.md index 2d40e2b99d..06de2f5d0e 100644 --- a/README.md +++ b/README.md @@ -181,7 +181,7 @@ 题目分类大纲如下: -二叉树大纲 +二叉树大纲 1. [关于二叉树,你该了解这些!](./problems/二叉树理论基础.md) 2. [二叉树:二叉树的递归遍历](./problems/二叉树的递归遍历.md) @@ -222,7 +222,7 @@ 题目分类大纲如下: -回溯算法大纲 +回溯算法大纲 1. [关于回溯算法,你该了解这些!](./problems/回溯算法理论基础.md) 2. [回溯算法:77.组合](./problems/0077.组合.md) @@ -252,7 +252,7 @@ 题目分类大纲如下: -贪心算法大纲 +贪心算法大纲 1. [关于贪心算法,你该了解这些!](./problems/贪心算法理论基础.md) 2. [贪心算法:455.分发饼干](./problems/0455.分发饼干.md) @@ -503,5 +503,5 @@ 添加微信记得备注,如果是已工作,备注:姓名-城市-岗位。如果学生,备注:姓名-学校-年级。**备注没有自我介绍不通过哦** -
+
diff --git "a/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" "b/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" index 6be92fa81b..f9bea8289e 100644 --- "a/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" @@ -83,10 +83,10 @@ map目的用来存放我们访问过的元素,因为遍历数组的时候, 过程如下: -![过程一](https://code-thinking-1253855093.file.myqcloud.com/pics/20220711202638.png) +![过程一](https://file.kamacoder.com/pics/20220711202638.png) -![过程二](https://code-thinking-1253855093.file.myqcloud.com/pics/20230220223536.png) +![过程二](https://file.kamacoder.com/pics/20230220223536.png) C++代码: diff --git "a/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" "b/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" index 4ce49810b3..1e0667e575 100644 --- "a/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" +++ "b/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" @@ -106,7 +106,7 @@ dp[i][j]可以初始化为true么? 当然不行,怎能刚开始就全都匹 dp[i + 1][j - 1] 在 dp[i][j]的左下角,如图: -![647.回文子串](https://code-thinking-1253855093.file.myqcloud.com/pics/20210121171032473.jpg) +![647.回文子串](https://file.kamacoder.com/pics/20210121171032473.jpg) 如果这矩阵是从上到下,从左到右遍历,那么会用到没有计算过的dp[i + 1][j - 1],也就是根据不确定是不是回文的区间[i+1,j-1],来判断了[i,j]是不是回文,那结果一定是不对的。 @@ -140,7 +140,7 @@ for (int i = s.size() - 1; i >= 0; i--) { // 注意遍历顺序 举例,输入:"aaa",dp[i][j]状态如下: -![647.回文子串1](https://code-thinking-1253855093.file.myqcloud.com/pics/20210121171059951.jpg) +![647.回文子串1](https://file.kamacoder.com/pics/20210121171059951.jpg) **注意因为dp[i][j]的定义,所以j一定是大于等于i的,那么在填充dp[i][j]的时候一定是只填充右上半部分**。 diff --git "a/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" "b/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" index 93f41e0f74..a35fd4e2bc 100644 --- "a/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" +++ "b/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" @@ -11,7 +11,7 @@ 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。 -![17.电话号码的字母组合](https://code-thinking-1253855093.file.myqcloud.com/pics/2020102916424043.png) +![17.电话号码的字母组合](https://file.kamacoder.com/pics/2020102916424043.png) 示例: * 输入:"23" @@ -64,7 +64,7 @@ const string letterMap[10] = { 例如:输入:"23",抽象为树形结构,如图所示: -![17. 电话号码的字母组合](https://code-thinking-1253855093.file.myqcloud.com/pics/20201123200304469.png) +![17. 电话号码的字母组合](https://file.kamacoder.com/pics/20201123200304469.png) 图中可以看出遍历的深度,就是输入"23"的长度,而叶子节点就是我们要收集的结果,输出["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"]。 diff --git "a/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" "b/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" index 53b59039e5..9b2ba88ef8 100644 --- "a/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" +++ "b/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" @@ -16,7 +16,7 @@ 示例 1: -![19.删除链表的倒数第N个节点](https://code-thinking-1253855093.file.myqcloud.com/pics/20210510085957392.png) +![19.删除链表的倒数第N个节点](https://file.kamacoder.com/pics/20210510085957392.png) 输入:head = [1,2,3,4,5], n = 2 输出:[1,2,3,5] diff --git "a/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" "b/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" index c642fb4ecd..7282471285 100644 --- "a/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" +++ "b/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" @@ -81,13 +81,13 @@ cd a/b/c/../../ 1. 第一种情况,字符串里左方向的括号多余了 ,所以不匹配。 -![括号匹配1](https://code-thinking-1253855093.file.myqcloud.com/pics/2020080915505387.png) +![括号匹配1](https://file.kamacoder.com/pics/2020080915505387.png) 2. 第二种情况,括号没有多余,但是 括号的类型没有匹配上。 -![括号匹配2](https://code-thinking-1253855093.file.myqcloud.com/pics/20200809155107397.png) +![括号匹配2](https://file.kamacoder.com/pics/20200809155107397.png) 3. 第三种情况,字符串里右方向的括号多余了,所以不匹配。 -![括号匹配3](https://code-thinking-1253855093.file.myqcloud.com/pics/20200809155115779.png) +![括号匹配3](https://file.kamacoder.com/pics/20200809155115779.png) diff --git "a/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" "b/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" index e0b065cd5a..c9826fa205 100644 --- "a/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" +++ "b/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" @@ -41,7 +41,7 @@ 这道题目,要在数组中插入目标值,无非是这四种情况。 -![35_搜索插入位置3](https://code-thinking-1253855093.file.myqcloud.com/pics/20201216232148471.png) +![35_搜索插入位置3](https://file.kamacoder.com/pics/20201216232148471.png) * 目标值在数组所有元素之前 * 目标值等于数组中某一个元素 @@ -82,14 +82,14 @@ public: 效率如下: -![35_搜索插入位置](https://code-thinking-1253855093.file.myqcloud.com/pics/20201216232127268.png) +![35_搜索插入位置](https://file.kamacoder.com/pics/20201216232127268.png) ### 二分法 既然暴力解法的时间复杂度是O(n),就要尝试一下使用二分查找法。 -![35_搜索插入位置4](https://code-thinking-1253855093.file.myqcloud.com/pics/202012162326354.png) +![35_搜索插入位置4](https://file.kamacoder.com/pics/202012162326354.png) 大家注意这道题目的前提是数组是有序数组,这也是使用二分查找的基础条件。 @@ -99,7 +99,7 @@ public: 大体讲解一下二分法的思路,这里来举一个例子,例如在这个数组中,使用二分法寻找元素为5的位置,并返回其下标。 -![35_搜索插入位置5](https://code-thinking-1253855093.file.myqcloud.com/pics/20201216232659199.png) +![35_搜索插入位置5](https://file.kamacoder.com/pics/20201216232659199.png) 二分查找涉及的很多的边界条件,逻辑比较简单,就是写不好。 @@ -150,7 +150,7 @@ public: * 空间复杂度:O(1) 效率如下: -![35_搜索插入位置2](https://code-thinking-1253855093.file.myqcloud.com/pics/2020121623272877.png) +![35_搜索插入位置2](https://file.kamacoder.com/pics/2020121623272877.png) ### 二分法第二种写法 diff --git "a/problems/0037.\350\247\243\346\225\260\347\213\254.md" "b/problems/0037.\350\247\243\346\225\260\347\213\254.md" index b26bf53308..5d2adb4d9d 100644 --- "a/problems/0037.\350\247\243\346\225\260\347\213\254.md" +++ "b/problems/0037.\350\247\243\346\225\260\347\213\254.md" @@ -18,11 +18,11 @@ 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。 空白格用 '.' 表示。 -![解数独](https://code-thinking-1253855093.file.myqcloud.com/pics/202011171912586.png) +![解数独](https://file.kamacoder.com/pics/202011171912586.png) 一个数独。 -![解数独](https://code-thinking-1253855093.file.myqcloud.com/pics/20201117191340669.png) +![解数独](https://file.kamacoder.com/pics/20201117191340669.png) 答案被标成红色。 @@ -52,7 +52,7 @@ 因为这个树形结构太大了,我抽取一部分,如图所示: -![37.解数独](https://code-thinking-1253855093.file.myqcloud.com/pics/2020111720451790-20230310131816104.png) +![37.解数独](https://file.kamacoder.com/pics/2020111720451790-20230310131816104.png) ### 回溯三部曲 @@ -83,7 +83,7 @@ bool backtracking(vector>& board) * 递归单层搜索逻辑 -![37.解数独](https://code-thinking-1253855093.file.myqcloud.com/pics/2020111720451790-20230310131822254.png) +![37.解数独](https://file.kamacoder.com/pics/2020111720451790-20230310131822254.png) 在树形图中可以看出我们需要的是一个二维的递归 (一行一列) diff --git "a/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" "b/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" index 455bd697cd..8467277115 100644 --- "a/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" +++ "b/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" @@ -50,7 +50,7 @@ candidates 中的数字可以无限制重复被选取。 本题搜索的过程抽象成树形结构如下: -![39.组合总和](https://code-thinking-1253855093.file.myqcloud.com/pics/20201223170730367.png) +![39.组合总和](https://file.kamacoder.com/pics/20201223170730367.png) 注意图中叶子节点的返回条件,因为本题没有组合数量要求,仅仅是总和的限制,所以递归没有层数的限制,只要选取的元素总和超过target,就返回! 而在[77.组合](https://programmercarl.com/0077.组合.html)和[216.组合总和III](https://programmercarl.com/0216.组合总和III.html) 中都可以知道要递归K层,因为要取k个元素的组合。 @@ -85,7 +85,7 @@ void backtracking(vector& candidates, int target, int sum, int startIndex) 在如下树形结构中: -![39.组合总和](https://code-thinking-1253855093.file.myqcloud.com/pics/20201223170730367-20230310135337214.png) +![39.组合总和](https://file.kamacoder.com/pics/20201223170730367-20230310135337214.png) 从叶子节点可以清晰看到,终止只有两种情况,sum大于target和sum等于target。 @@ -158,7 +158,7 @@ public: 在这个树形结构中: -![39.组合总和](https://code-thinking-1253855093.file.myqcloud.com/pics/20201223170730367-20230310135342472.png) +![39.组合总和](https://file.kamacoder.com/pics/20201223170730367-20230310135342472.png) 以及上面的版本一的代码大家可以看到,对于sum已经大于target的情况,其实是依然进入了下一层递归,只是下一层递归结束判断的时候,会判断sum > target的话就返回。 @@ -171,7 +171,7 @@ public: 如图: -![39.组合总和1](https://code-thinking-1253855093.file.myqcloud.com/pics/20201223170809182.png) +![39.组合总和1](https://file.kamacoder.com/pics/20201223170809182.png) for循环剪枝代码如下: diff --git "a/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" "b/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" index 4a9d59cc23..f0cbc2200f 100644 --- "a/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" +++ "b/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" @@ -76,7 +76,7 @@ candidates 中的每个数字在每个组合中只能使用一次。 选择过程树形结构如图所示: -![40.组合总和II](https://code-thinking-1253855093.file.myqcloud.com/pics/20230310000918.png) +![40.组合总和II](https://file.kamacoder.com/pics/20230310000918.png) 可以看到图中,每个节点相对于 [39.组合总和](https://mp.weixin.qq.com/s/FLg8G6EjVcxBjwCbzpACPw)我多加了used数组,这个used数组下面会重点介绍。 @@ -126,7 +126,7 @@ if (sum == target) { 这块比较抽象,如图: -![40.组合总和II1](https://code-thinking-1253855093.file.myqcloud.com/pics/20230310000954.png) +![40.组合总和II1](https://file.kamacoder.com/pics/20230310000954.png) 我在图中将used的变化用橘黄色标注上,可以看出在candidates[i] == candidates[i - 1]相同的情况下: @@ -137,7 +137,7 @@ if (sum == target) { 而 used[i - 1] == true,说明是进入下一层递归,去下一个数,所以是树枝上,如图所示: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20221021163812.png) +![](https://file.kamacoder.com/pics/20221021163812.png) **这块去重的逻辑很抽象,网上搜的题解基本没有能讲清楚的,如果大家之前思考过这个问题或者刷过这道题目,看到这里一定会感觉通透了很多!** diff --git "a/problems/0042.\346\216\245\351\233\250\346\260\264.md" "b/problems/0042.\346\216\245\351\233\250\346\260\264.md" index 8c43ae6051..1e6ec11bc5 100644 --- "a/problems/0042.\346\216\245\351\233\250\346\260\264.md" +++ "b/problems/0042.\346\216\245\351\233\250\346\260\264.md" @@ -47,10 +47,10 @@ 首先要明确,要按照行来计算,还是按照列来计算。 按照行来计算如图: -![42.接雨水2](https://code-thinking-1253855093.file.myqcloud.com/pics/20210402091118927.png) +![42.接雨水2](https://file.kamacoder.com/pics/20210402091118927.png) 按照列来计算如图: -![42.接雨水1](https://code-thinking-1253855093.file.myqcloud.com/pics/20210402091208445.png) +![42.接雨水1](https://file.kamacoder.com/pics/20210402091208445.png) 一些同学在实现的时候,很容易一会按照行来计算一会按照列来计算,这样就会越写越乱。 @@ -62,7 +62,7 @@ 这句话可以有点绕,来举一个理解,例如求列4的雨水高度,如图: -![42.接雨水3](https://code-thinking-1253855093.file.myqcloud.com/pics/20210223092732301.png) +![42.接雨水3](https://file.kamacoder.com/pics/20210223092732301.png) 列4 左侧最高的柱子是列3,高度为2(以下用lHeight表示)。 @@ -201,7 +201,7 @@ public: 1. 首先单调栈是按照行方向来计算雨水,如图: -![42.接雨水2](https://code-thinking-1253855093.file.myqcloud.com/pics/20210223092629946.png) +![42.接雨水2](https://file.kamacoder.com/pics/20210223092629946.png) 知道这一点,后面的就可以理解了。 @@ -215,7 +215,7 @@ public: 如图: -![42.接雨水4](https://code-thinking-1253855093.file.myqcloud.com/pics/2021022309321229.png) +![42.接雨水4](https://file.kamacoder.com/pics/2021022309321229.png) 关于单调栈的顺序给大家一个总结: [739. 每日温度](https://programmercarl.com/0739.每日温度.html) 中求一个元素右边第一个更大元素,单调栈就是递增的,[84.柱状图中最大的矩形](https://programmercarl.com/0084.柱状图中最大的矩形.html)求一个元素右边第一个更小元素,单调栈就是递减的。 @@ -229,7 +229,7 @@ public: 如图所示: -![42.接雨水5](https://code-thinking-1253855093.file.myqcloud.com/pics/20210223094619398.png) +![42.接雨水5](https://file.kamacoder.com/pics/20210223094619398.png) 4. 栈里要保存什么数值 @@ -284,7 +284,7 @@ if (height[i] == height[st.top()]) { // 例如 5 5 1 7 这种情况 如果当前遍历的元素(柱子)高度大于栈顶元素的高度,此时就出现凹槽了,如图所示: -![42.接雨水4](https://code-thinking-1253855093.file.myqcloud.com/pics/2021022309321229-20230310123027977.png) +![42.接雨水4](https://file.kamacoder.com/pics/2021022309321229-20230310123027977.png) 取栈顶元素,将栈顶元素弹出,这个就是凹槽的底部,也就是中间位置,下标记为mid,对应的高度为height[mid](就是图中的高度1)。 diff --git "a/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" "b/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" index a20eb2a6a9..dd51384d77 100644 --- "a/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" +++ "b/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" @@ -47,7 +47,7 @@ 如图: -![45.跳跃游戏II](https://code-thinking-1253855093.file.myqcloud.com/pics/20201201232309103.png) +![45.跳跃游戏II](https://file.kamacoder.com/pics/20201201232309103.png) **图中覆盖范围的意义在于,只要红色的区域,最多两步一定可以到!(不用管具体怎么跳,反正一定可以跳到)** @@ -99,11 +99,11 @@ public: 因为当移动下标指向 nums.size - 2 时: - 如果移动下标等于当前覆盖最大距离下标, 需要再走一步(即 ans++),因为最后一步一定是可以到的终点。(题目假设总是可以到达数组的最后一个位置),如图: - ![45.跳跃游戏II2](https://code-thinking-1253855093.file.myqcloud.com/pics/20201201232445286.png) + ![45.跳跃游戏II2](https://file.kamacoder.com/pics/20201201232445286.png) - 如果移动下标不等于当前覆盖最大距离下标,说明当前覆盖最远距离就可以直接达到终点了,不需要再走一步。如图: -![45.跳跃游戏II1](https://code-thinking-1253855093.file.myqcloud.com/pics/20201201232338693.png) +![45.跳跃游戏II1](https://file.kamacoder.com/pics/20201201232338693.png) 代码如下: diff --git "a/problems/0046.\345\205\250\346\216\222\345\210\227.md" "b/problems/0046.\345\205\250\346\216\222\345\210\227.md" index 611a4cb1e0..5a190242e3 100644 --- "a/problems/0046.\345\205\250\346\216\222\345\210\227.md" +++ "b/problems/0046.\345\205\250\346\216\222\345\210\227.md" @@ -41,7 +41,7 @@ 我以[1,2,3]为例,抽象成树形结构如下: -![全排列](https://code-thinking-1253855093.file.myqcloud.com/pics/20240803180318.png) +![全排列](https://file.kamacoder.com/pics/20240803180318.png) ### 回溯三部曲 @@ -53,7 +53,7 @@ 但排列问题需要一个used数组,标记已经选择的元素,如图橘黄色部分所示: -![全排列](https://code-thinking-1253855093.file.myqcloud.com/pics/20240803180318.png) +![全排列](https://file.kamacoder.com/pics/20240803180318.png) 代码如下: @@ -65,7 +65,7 @@ void backtracking (vector& nums, vector& used) * 递归终止条件 -![全排列](https://code-thinking-1253855093.file.myqcloud.com/pics/20240803180318.png) +![全排列](https://file.kamacoder.com/pics/20240803180318.png) 可以看出叶子节点,就是收割结果的地方。 diff --git "a/problems/0047.\345\205\250\346\216\222\345\210\227II.md" "b/problems/0047.\345\205\250\346\216\222\345\210\227II.md" index 1e51a7bcd7..6ed794aaaf 100644 --- "a/problems/0047.\345\205\250\346\216\222\345\210\227II.md" +++ "b/problems/0047.\345\205\250\346\216\222\345\210\227II.md" @@ -48,7 +48,7 @@ 我以示例中的 [1,1,2]为例 (为了方便举例,已经排序)抽象为一棵树,去重过程如图: -![47.全排列II1](https://code-thinking-1253855093.file.myqcloud.com/pics/20201124201331223.png) +![47.全排列II1](https://file.kamacoder.com/pics/20201124201331223.png) 图中我们对同一树层,前一位(也就是nums[i-1])如果使用过,那么就进行去重。 @@ -130,11 +130,11 @@ if (i > 0 && nums[i] == nums[i - 1] && used[i - 1] == true) { 树层上去重(used[i - 1] == false),的树形结构如下: -![47.全排列II2](https://code-thinking-1253855093.file.myqcloud.com/pics/20201124201406192.png) +![47.全排列II2](https://file.kamacoder.com/pics/20201124201406192.png) 树枝上去重(used[i - 1] == true)的树型结构如下: -![47.全排列II3](https://code-thinking-1253855093.file.myqcloud.com/pics/20201124201431571.png) +![47.全排列II3](https://file.kamacoder.com/pics/20201124201431571.png) 大家应该很清晰的看到,树层上对前一位去重非常彻底,效率很高,树枝上对前一位去重虽然最后可以得到答案,但是做了很多无用搜索。 diff --git "a/problems/0051.N\347\232\207\345\220\216.md" "b/problems/0051.N\347\232\207\345\220\216.md" index b201b55fe4..2a90a023e6 100644 --- "a/problems/0051.N\347\232\207\345\220\216.md" +++ "b/problems/0051.N\347\232\207\345\220\216.md" @@ -15,7 +15,7 @@ n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上, 示例 1: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211020232201.png) +![](https://file.kamacoder.com/pics/20211020232201.png) * 输入:n = 4 * 输出:[[".Q..","...Q","Q...","..Q."],["..Q.","Q...","...Q",".Q.."]] @@ -45,7 +45,7 @@ n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上, 下面我用一个 3 * 3 的棋盘,将搜索过程抽象为一棵树,如图: -![51.N皇后](https://code-thinking-1253855093.file.myqcloud.com/pics/20210130182532303.jpg) +![51.N皇后](https://file.kamacoder.com/pics/20210130182532303.jpg) 从图中,可以看出,二维矩阵中矩阵的高就是这棵树的高度,矩阵的宽就是树形结构中每一个节点的宽度。 @@ -85,7 +85,7 @@ void backtracking(int n, int row, vector& chessboard) { * 递归终止条件 在如下树形结构中: -![51.N皇后](https://code-thinking-1253855093.file.myqcloud.com/pics/20210130182532303-20230310122134167.jpg) +![51.N皇后](https://file.kamacoder.com/pics/20210130182532303-20230310122134167.jpg) 可以看出,当递归到棋盘最底层(也就是叶子节点)的时候,就可以收集结果并返回了。 diff --git "a/problems/0052.N\347\232\207\345\220\216II.md" "b/problems/0052.N\347\232\207\345\220\216II.md" index 11c257b073..489ab1f756 100644 --- "a/problems/0052.N\347\232\207\345\220\216II.md" +++ "b/problems/0052.N\347\232\207\345\220\216II.md" @@ -13,7 +13,7 @@ n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并 上图为 8 皇后问题的一种解法。 -![51n皇后](https://code-thinking-1253855093.file.myqcloud.com/pics/20200821152118456.png) +![51n皇后](https://file.kamacoder.com/pics/20200821152118456.png) 给定一个整数 n,返回 n 皇后不同的解决方案的数量。 diff --git "a/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" "b/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" index 568626dc6d..174f55e848 100644 --- "a/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" +++ "b/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" @@ -54,7 +54,7 @@ dp[0]应该是多少呢? 5. 举例推导dp数组 以示例一为例,输入:nums = [-2,1,-3,4,-1,2,1,-5,4],对应的dp状态如下: -![53.最大子序和(动态规划)](https://code-thinking-1253855093.file.myqcloud.com/pics/20210303104129101.png) +![53.最大子序和(动态规划)](https://file.kamacoder.com/pics/20210303104129101.png) **注意最后的结果可不是dp[nums.size() - 1]!** ,而是dp[6]。 diff --git "a/problems/0054.\350\236\272\346\227\213\347\237\251\351\230\265.md" "b/problems/0054.\350\236\272\346\227\213\347\237\251\351\230\265.md" index 7d7f460f01..a852b6740d 100644 --- "a/problems/0054.\350\236\272\346\227\213\347\237\251\351\230\265.md" +++ "b/problems/0054.\350\236\272\346\227\213\347\237\251\351\230\265.md" @@ -36,7 +36,7 @@ 由外向内一圈一圈这么画下去,如下所示: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20220922102236.png) +![](https://file.kamacoder.com/pics/20220922102236.png) 这里每一种颜色,代表一条边,我们遍历的长度,可以看出每一个拐角处的处理规则,拐角处让给新的一条边来继续画。 diff --git "a/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" "b/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" index 3ab004b2aa..0ebbcb595c 100644 --- "a/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" +++ "b/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" @@ -48,7 +48,7 @@ 如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20230203105634.png) +![](https://file.kamacoder.com/pics/20230203105634.png) i 每次移动只能在 cover 的范围内移动,每移动一个元素,cover 得到该元素数值(新的覆盖范围)的补充,让 i 继续移动下去。 diff --git "a/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" "b/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" index 76792dbae1..cb06fcab3d 100644 --- "a/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" +++ "b/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" @@ -38,7 +38,7 @@ 这么说有点抽象,看图:(**注意图中区间都是按照左边界排序之后了**) -![56.合并区间](https://code-thinking-1253855093.file.myqcloud.com/pics/20201223200632791.png) +![56.合并区间](https://file.kamacoder.com/pics/20201223200632791.png) 知道如何判断重复之后,剩下的就是合并了,如何去模拟合并区间呢? diff --git "a/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" "b/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" index 9961c0e70b..d7aea257a5 100644 --- "a/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" +++ "b/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" @@ -54,7 +54,7 @@ 那么我按照左闭右开的原则,来画一圈,大家看一下: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20220922102236.png) +![](https://file.kamacoder.com/pics/20220922102236.png) 这里每一种颜色,代表一条边,我们遍历的长度,可以看出每一个拐角处的处理规则,拐角处让给新的一条边来继续画。 diff --git "a/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" "b/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" index 23cd8060fa..20bd56ba9f 100644 --- "a/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" +++ "b/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" @@ -16,7 +16,7 @@ 示例 1: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210110174033215.png) +![](https://file.kamacoder.com/pics/20210110174033215.png) * 输入:m = 3, n = 7 * 输出:28 @@ -62,7 +62,7 @@ 如图举例: -![62.不同路径](https://code-thinking-1253855093.file.myqcloud.com/pics/20201209113602700.png) +![62.不同路径](https://file.kamacoder.com/pics/20201209113602700.png) 此时问题就可以转化为求二叉树叶子节点的个数,代码如下: @@ -131,7 +131,7 @@ for (int j = 0; j < n; j++) dp[0][j] = 1; 如图所示: -![62.不同路径1](https://code-thinking-1253855093.file.myqcloud.com/pics/20201209113631392.png) +![62.不同路径1](https://file.kamacoder.com/pics/20201209113631392.png) 以上动规五部曲分析完毕,C++代码如下: @@ -180,7 +180,7 @@ public: 在这个图中,可以看出一共m,n的话,无论怎么走,走到终点都需要 m + n - 2 步。 -![62.不同路径](https://code-thinking-1253855093.file.myqcloud.com/pics/20201209113602700-20230310120944078.png) +![62.不同路径](https://file.kamacoder.com/pics/20201209113602700-20230310120944078.png) 在这m + n - 2 步中,一定有 m - 1 步是要向下走的,不用管什么时候向下走。 @@ -190,7 +190,7 @@ public: 那么答案,如图所示: -![62.不同路径2](https://code-thinking-1253855093.file.myqcloud.com/pics/20201209113725324.png) +![62.不同路径2](https://file.kamacoder.com/pics/20201209113725324.png) **求组合的时候,要防止两个int相乘溢出!** 所以不能把算式的分子都算出来,分母都算出来再做除法。 diff --git "a/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" "b/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" index 61d9329d4b..d39036ba3a 100644 --- "a/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" +++ "b/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" @@ -14,13 +14,13 @@ 现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径? -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210111204901338.png) +![](https://file.kamacoder.com/pics/20210111204901338.png) 网格中的障碍物和空位置分别用 1 和 0 来表示。 示例 1: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210111204939971.png) +![](https://file.kamacoder.com/pics/20210111204939971.png) * 输入:obstacleGrid = [[0,0,0],[0,1,0],[0,0,0]] * 输出:2 @@ -32,7 +32,7 @@ 示例 2: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210111205857918.png) +![](https://file.kamacoder.com/pics/20210111205857918.png) * 输入:obstacleGrid = [[0,1],[0,0]] * 输出:1 @@ -93,7 +93,7 @@ for (int j = 0; j < n; j++) dp[0][j] = 1; 如图: -![63.不同路径II](https://code-thinking-1253855093.file.myqcloud.com/pics/20210104114513928.png) +![63.不同路径II](https://file.kamacoder.com/pics/20210104114513928.png) 下标(0, j)的初始化情况同理。 @@ -127,11 +127,11 @@ for (int i = 1; i < m; i++) { 拿示例1来举例如题: -![63.不同路径II1](https://code-thinking-1253855093.file.myqcloud.com/pics/20210104114548983.png) +![63.不同路径II1](https://file.kamacoder.com/pics/20210104114548983.png) 对应的dp table 如图: -![63.不同路径II2](https://code-thinking-1253855093.file.myqcloud.com/pics/20210104114610256.png) +![63.不同路径II2](https://file.kamacoder.com/pics/20210104114610256.png) 如果这个图看不懂,建议再理解一下递归公式,然后照着文章中说的遍历顺序,自己推导一下! diff --git "a/problems/0070.\347\210\254\346\245\274\346\242\257.md" "b/problems/0070.\347\210\254\346\245\274\346\242\257.md" index 92c3858698..17bf3ee760 100644 --- "a/problems/0070.\347\210\254\346\245\274\346\242\257.md" +++ "b/problems/0070.\347\210\254\346\245\274\346\242\257.md" @@ -101,7 +101,7 @@ dp[i]: 爬到第i层楼梯,有dp[i]种方法 举例当n为5的时候,dp table(dp数组)应该是这样的 -![70.爬楼梯](https://code-thinking-1253855093.file.myqcloud.com/pics/20210105202546299.png) +![70.爬楼梯](https://file.kamacoder.com/pics/20210105202546299.png) 如果代码出问题了,就把dp table 打印出来,看看究竟是不是和自己推导的一样。 diff --git "a/problems/0072.\347\274\226\350\276\221\350\267\235\347\246\273.md" "b/problems/0072.\347\274\226\350\276\221\350\267\235\347\246\273.md" index 408999d873..192ea47002 100644 --- "a/problems/0072.\347\274\226\350\276\221\350\267\235\347\246\273.md" +++ "b/problems/0072.\347\274\226\350\276\221\350\267\235\347\246\273.md" @@ -170,7 +170,7 @@ for (int j = 0; j <= word2.size(); j++) dp[0][j] = j; 可以看出dp[i][j]是依赖左方,上方和左上方元素的,如图: -![72.编辑距离](https://code-thinking-1253855093.file.myqcloud.com/pics/20210114162113131.jpg) +![72.编辑距离](https://file.kamacoder.com/pics/20210114162113131.jpg) 所以在dp矩阵中一定是从左到右从上到下去遍历。 @@ -194,7 +194,7 @@ for (int i = 1; i <= word1.size(); i++) { 以示例1为例,输入:`word1 = "horse", word2 = "ros"`为例,dp矩阵状态图如下: -![72.编辑距离1](https://code-thinking-1253855093.file.myqcloud.com/pics/20210114162132300.jpg) +![72.编辑距离1](https://file.kamacoder.com/pics/20210114162132300.jpg) 以上动规五部分析完毕,C++代码如下: diff --git "a/problems/0077.\347\273\204\345\220\210.md" "b/problems/0077.\347\273\204\345\220\210.md" index 60900d76a6..c523c01c17 100644 --- "a/problems/0077.\347\273\204\345\220\210.md" +++ "b/problems/0077.\347\273\204\345\220\210.md" @@ -82,7 +82,7 @@ for (int i = 1; i <= n; i++) { 那么我把组合问题抽象为如下树形结构: -![77.组合](https://code-thinking-1253855093.file.myqcloud.com/pics/20201123195223940.png) +![77.组合](https://file.kamacoder.com/pics/20201123195223940.png) 可以看出这棵树,一开始集合是 1,2,3,4, 从左向右取数,取过的数,不再重复取。 @@ -126,7 +126,7 @@ vector path; // 用来存放符合条件结果 从下图中红线部分可以看出,在集合[1,2,3,4]取1之后,下一层递归,就要在[2,3,4]中取数了,那么下一层递归如何知道从[2,3,4]中取数呢,靠的就是startIndex。 -![77.组合2](https://code-thinking-1253855093.file.myqcloud.com/pics/20201123195328976.png) +![77.组合2](https://file.kamacoder.com/pics/20201123195328976.png) 所以需要startIndex来记录下一层递归,搜索的起始位置。 @@ -146,7 +146,7 @@ path这个数组的大小如果达到k,说明我们找到了一个子集大小 如图红色部分: -![77.组合3](https://code-thinking-1253855093.file.myqcloud.com/pics/20201123195407907.png) +![77.组合3](https://file.kamacoder.com/pics/20201123195407907.png) 此时用result二维数组,把path保存起来,并终止本层递归。 @@ -163,7 +163,7 @@ if (path.size() == k) { 回溯法的搜索过程就是一个树型结构的遍历过程,在如下图中,可以看出for循环用来横向遍历,递归的过程是纵向遍历。 -![77.组合1](https://code-thinking-1253855093.file.myqcloud.com/pics/20201123195242899.png) +![77.组合1](https://file.kamacoder.com/pics/20201123195242899.png) 如此我们才遍历完图中的这棵树。 @@ -267,7 +267,7 @@ for (int i = startIndex; i <= n; i++) { 这么说有点抽象,如图所示: -![77.组合4](https://code-thinking-1253855093.file.myqcloud.com/pics/20210130194335207-20230310134409532.png) +![77.组合4](https://file.kamacoder.com/pics/20210130194335207-20230310134409532.png) 图中每一个节点(图中为矩形),就代表本层的一个for循环,那么每一层的for循环从第二个数开始遍历的话,都没有意义,都是无效遍历。 diff --git "a/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" "b/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" index e2ca3d7d0a..c5e26e7706 100644 --- "a/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" +++ "b/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" @@ -67,7 +67,7 @@ for (int i = startIndex; i <= n; i++) { 这么说有点抽象,如图所示: -![77.组合4](https://code-thinking-1253855093.file.myqcloud.com/pics/20210130194335207.png) +![77.组合4](https://file.kamacoder.com/pics/20210130194335207.png) 图中每一个节点(图中为矩形),就代表本层的一个for循环,那么每一层的for循环从第二个数开始遍历的话,都没有意义,都是无效遍历。 diff --git "a/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" "b/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" index 6577cf542d..e1a6671e73 100644 --- "a/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" +++ "b/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" @@ -11,9 +11,9 @@ 求在该柱状图中,能够勾勒出来的矩形的最大面积。 -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210803220437.png) +![](https://file.kamacoder.com/pics/20210803220437.png) -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210803220506.png) +![](https://file.kamacoder.com/pics/20210803220506.png) * 1 <= heights.length <=10^5 * 0 <= heights[i] <= 10^4 @@ -114,7 +114,7 @@ public: 我来举一个例子,如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20230221165730.png) +![](https://file.kamacoder.com/pics/20230221165730.png) 只有栈里从大到小的顺序,才能保证栈顶元素找到左右两边第一个小于栈顶元素的柱子。 @@ -179,7 +179,7 @@ public: 如果数组本身就是升序的,例如[2,4,6,8],那么入栈之后 都是单调递减,一直都没有走 情况三 计算结果的哪一步,所以最后输出的就是0了。 如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20230221163936.png) +![](https://file.kamacoder.com/pics/20230221163936.png) 那么结尾加一个0,就会让栈里的所有元素,走到情况三的逻辑。 @@ -194,7 +194,7 @@ public: 之后又将6 加入栈(此时8已经弹出了),然后 就是 4 与 栈口元素 6 进行比较,周而复始,那么计算的最后结果result就是0。 如图所示: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20230221164533.png) +![](https://file.kamacoder.com/pics/20230221164533.png) 所以我们需要在 height数组前后各加一个元素0。 diff --git "a/problems/0090.\345\255\220\351\233\206II.md" "b/problems/0090.\345\255\220\351\233\206II.md" index 3bda02bc9e..2f26e6068f 100644 --- "a/problems/0090.\345\255\220\351\233\206II.md" +++ "b/problems/0090.\345\255\220\351\233\206II.md" @@ -39,7 +39,7 @@ 用示例中的[1, 2, 2] 来举例,如图所示: (**注意去重需要先对集合排序**) -![90.子集II](https://code-thinking-1253855093.file.myqcloud.com/pics/20201124195411977.png) +![90.子集II](https://file.kamacoder.com/pics/20201124195411977.png) 从图中可以看出,同一树层上重复取2 就要过滤掉,同一树枝上就可以重复取2,因为同一树枝上元素的集合才是唯一子集! diff --git "a/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" "b/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" index 1a89827897..5ef2162898 100644 --- "a/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" +++ "b/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" @@ -54,7 +54,7 @@ 切割问题可以抽象为树型结构,如图: -![93.复原IP地址](https://code-thinking-1253855093.file.myqcloud.com/pics/20201123203735933.png) +![93.复原IP地址](https://file.kamacoder.com/pics/20201123203735933.png) ### 回溯三部曲 @@ -106,7 +106,7 @@ if (pointNum == 3) { // 逗点数量为3时,分隔结束 如果不合法就结束本层循环,如图中剪掉的分支: -![93.复原IP地址](https://code-thinking-1253855093.file.myqcloud.com/pics/20201123203735933-20230310132314109.png) +![93.复原IP地址](https://file.kamacoder.com/pics/20201123203735933-20230310132314109.png) 然后就是递归和回溯的过程: diff --git "a/problems/0096.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0096.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" index f4e0e456b7..ca99a46695 100644 --- "a/problems/0096.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" +++ "b/problems/0096.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" @@ -12,7 +12,7 @@ 示例: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210113161941835.png) +![](https://file.kamacoder.com/pics/20210113161941835.png) ## 算法公开课 @@ -27,11 +27,11 @@ 了解了二叉搜索树之后,我们应该先举几个例子,画画图,看看有没有什么规律,如图: -![96.不同的二叉搜索树](https://code-thinking-1253855093.file.myqcloud.com/pics/20210107093106367.png) +![96.不同的二叉搜索树](https://file.kamacoder.com/pics/20210107093106367.png) n为1的时候有一棵树,n为2有两棵树,这个是很直观的。 -![96.不同的二叉搜索树1](https://code-thinking-1253855093.file.myqcloud.com/pics/20210107093129889.png) +![96.不同的二叉搜索树1](https://file.kamacoder.com/pics/20210107093129889.png) 来看看n为3的时候,有哪几种情况。 @@ -65,7 +65,7 @@ dp[3],就是 元素1为头结点搜索树的数量 + 元素2为头结点搜索 如图所示: -![96.不同的二叉搜索树2](https://code-thinking-1253855093.file.myqcloud.com/pics/20210107093226241.png) +![96.不同的二叉搜索树2](https://file.kamacoder.com/pics/20210107093226241.png) 此时我们已经找到递推关系了,那么可以用动规五部曲再系统分析一遍。 @@ -118,7 +118,7 @@ for (int i = 1; i <= n; i++) { n为5时候的dp数组状态如图: -![96.不同的二叉搜索树3](https://code-thinking-1253855093.file.myqcloud.com/pics/20210107093253987.png) +![96.不同的二叉搜索树3](https://file.kamacoder.com/pics/20210107093253987.png) 当然如果自己画图举例的话,基本举例到n为3就可以了,n为4的时候,画图已经比较麻烦了。 diff --git "a/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" index 22a47f9632..9569cbddf1 100644 --- "a/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" +++ "b/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" @@ -16,7 +16,7 @@ * 节点的右子树只包含大于当前节点的数。 * 所有左子树和右子树自身必须也是二叉搜索树。 -![98.验证二叉搜索树](https://code-thinking-1253855093.file.myqcloud.com/pics/20230310000750.png) +![98.验证二叉搜索树](https://file.kamacoder.com/pics/20230310000750.png) ## 算法公开课 @@ -102,7 +102,7 @@ if (root->val > root->left->val && root->val < root->right->val) { 例如: [10,5,15,null,null,6,20] 这个case: -![二叉搜索树](https://code-thinking-1253855093.file.myqcloud.com/pics/20230310000824.png) +![二叉搜索树](https://file.kamacoder.com/pics/20230310000824.png) 节点10大于左节点5,小于右节点15,但右子树里出现了一个6 这就不符合了! diff --git "a/problems/0100.\347\233\270\345\220\214\347\232\204\346\240\221.md" "b/problems/0100.\347\233\270\345\220\214\347\232\204\346\240\221.md" index 52c9fcf2e7..e5f610009e 100644 --- "a/problems/0100.\347\233\270\345\220\214\347\232\204\346\240\221.md" +++ "b/problems/0100.\347\233\270\345\220\214\347\232\204\346\240\221.md" @@ -12,9 +12,9 @@ 如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。 -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210726172932.png) +![](https://file.kamacoder.com/pics/20210726172932.png) -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210726173011.png) +![](https://file.kamacoder.com/pics/20210726173011.png) ## 思路 diff --git "a/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" "b/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" index f066408408..205597b068 100644 --- "a/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" @@ -9,7 +9,7 @@ 给定一个二叉树,检查它是否是镜像对称的。 -![101. 对称二叉树](https://code-thinking-1253855093.file.myqcloud.com/pics/20210203144607387.png) +![101. 对称二叉树](https://file.kamacoder.com/pics/20210203144607387.png) ## 算法公开课 @@ -25,7 +25,7 @@ 比较的是两个子树的里侧和外侧的元素是否相等。如图所示: -![101. 对称二叉树1](https://code-thinking-1253855093.file.myqcloud.com/pics/20210203144624414.png) +![101. 对称二叉树1](https://file.kamacoder.com/pics/20210203144624414.png) 那么遍历的顺序应该是什么样的呢? diff --git "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" index da2d85c99d..6725d72cc2 100644 --- "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" +++ "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" @@ -37,7 +37,7 @@ 给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。 -![102.二叉树的层序遍历](https://code-thinking-1253855093.file.myqcloud.com/pics/20210203144842988.png) +![102.二叉树的层序遍历](https://file.kamacoder.com/pics/20210203144842988.png) ### 思路 @@ -532,7 +532,7 @@ public IList> LevelOrder(TreeNode root) 给定一个二叉树,返回其节点值自底向上的层次遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历) -![107.二叉树的层次遍历II](https://code-thinking-1253855093.file.myqcloud.com/pics/20210203151058308.png) +![107.二叉树的层次遍历II](https://file.kamacoder.com/pics/20210203151058308.png) ### 思路 @@ -926,7 +926,7 @@ public IList> LevelOrderBottom(TreeNode root) 给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。 -![199.二叉树的右视图](https://code-thinking-1253855093.file.myqcloud.com/pics/20210203151307377.png) +![199.二叉树的右视图](https://file.kamacoder.com/pics/20210203151307377.png) ### 思路 @@ -1276,7 +1276,7 @@ public class Solution 给定一个非空二叉树, 返回一个由每层节点平均值组成的数组。 -![637.二叉树的层平均值](https://code-thinking-1253855093.file.myqcloud.com/pics/20210203151350500.png) +![637.二叉树的层平均值](https://file.kamacoder.com/pics/20210203151350500.png) ### 思路 @@ -1634,7 +1634,7 @@ public class Solution { 例如,给定一个 3叉树 : -![429. N叉树的层序遍历](https://code-thinking-1253855093.file.myqcloud.com/pics/20210203151439168.png) +![429. N叉树的层序遍历](https://file.kamacoder.com/pics/20210203151439168.png) 返回其层序遍历: @@ -2006,7 +2006,7 @@ impl Solution { 您需要在二叉树的每一行中找到最大的值。 -![515.在每个树行中找最大值](https://code-thinking-1253855093.file.myqcloud.com/pics/20210203151532153.png) +![515.在每个树行中找最大值](https://file.kamacoder.com/pics/20210203151532153.png) ### 思路 @@ -2337,7 +2337,7 @@ struct Node { 初始状态下,所有 next 指针都被设置为 NULL。 -![116.填充每个节点的下一个右侧节点指针](https://code-thinking-1253855093.file.myqcloud.com/pics/20210203152044855.jpg) +![116.填充每个节点的下一个右侧节点指针](https://file.kamacoder.com/pics/20210203152044855.jpg) ### 思路 @@ -2971,7 +2971,7 @@ object Solution { 给定二叉树 [3,9,20,null,null,15,7], -![104. 二叉树的最大深度](https://code-thinking-1253855093.file.myqcloud.com/pics/20210203153031914-20230310134849764.png) +![104. 二叉树的最大深度](https://file.kamacoder.com/pics/20210203153031914-20230310134849764.png) 返回它的最大深度 3 。 @@ -2981,7 +2981,7 @@ object Solution { 在二叉树中,一层一层的来遍历二叉树,记录一下遍历的层数就是二叉树的深度,如图所示: -![层序遍历](https://code-thinking-1253855093.file.myqcloud.com/pics/20200810193056585-20230310134854803.png) +![层序遍历](https://file.kamacoder.com/pics/20200810193056585-20230310134854803.png) 所以这道题的迭代法就是一道模板题,可以使用二叉树层序遍历的模板来解决的。 diff --git "a/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" "b/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" index 6b9994ed93..2eb22ae5a3 100644 --- "a/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" +++ "b/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" @@ -18,7 +18,7 @@ 给定二叉树 [3,9,20,null,null,15,7], -![104. 二叉树的最大深度](https://code-thinking-1253855093.file.myqcloud.com/pics/20210203153031914-20230310121809902.png) +![104. 二叉树的最大深度](https://file.kamacoder.com/pics/20210203153031914-20230310121809902.png) 返回它的最大深度 3 。 @@ -172,7 +172,7 @@ public: 在二叉树中,一层一层的来遍历二叉树,记录一下遍历的层数就是二叉树的深度,如图所示: -![层序遍历](https://code-thinking-1253855093.file.myqcloud.com/pics/20200810193056585.png) +![层序遍历](https://file.kamacoder.com/pics/20200810193056585.png) 所以这道题的迭代法就是一道模板题,可以使用二叉树层序遍历的模板来解决的。 @@ -217,7 +217,7 @@ public: 例如,给定一个 3叉树 : -![559.n叉树的最大深度](https://code-thinking-1253855093.file.myqcloud.com/pics/2021020315313214.png) +![559.n叉树的最大深度](https://file.kamacoder.com/pics/2021020315313214.png) 我们应返回其最大深度,3。 diff --git "a/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" "b/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" index d0af8fef27..2f8e5eefb6 100644 --- "a/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" @@ -25,7 +25,7 @@ * 后序遍历 postorder = [9,15,7,20,3] 返回如下的二叉树: -![106. 从中序与后序遍历序列构造二叉树1](https://code-thinking-1253855093.file.myqcloud.com/pics/20210203154316774.png) +![106. 从中序与后序遍历序列构造二叉树1](https://file.kamacoder.com/pics/20210203154316774.png) ## 算法公开课 @@ -40,7 +40,7 @@ 流程如图: -![106.从中序与后序遍历序列构造二叉树](https://code-thinking-1253855093.file.myqcloud.com/pics/20210203154249860.png) +![106.从中序与后序遍历序列构造二叉树](https://file.kamacoder.com/pics/20210203154249860.png) 那么代码应该怎么写呢? @@ -411,7 +411,7 @@ public: 中序遍历 inorder = [9,3,15,20,7] 返回如下的二叉树: -![105. 从前序与中序遍历序列构造二叉树](https://code-thinking-1253855093.file.myqcloud.com/pics/20210203154626672.png) +![105. 从前序与中序遍历序列构造二叉树](https://file.kamacoder.com/pics/20210203154626672.png) ### 思路 @@ -554,7 +554,7 @@ public: 举一个例子: -![106.从中序与后序遍历序列构造二叉树2](https://code-thinking-1253855093.file.myqcloud.com/pics/20210203154720326.png) +![106.从中序与后序遍历序列构造二叉树2](https://file.kamacoder.com/pics/20210203154720326.png) tree1 的前序遍历是[1 2 3], 后序遍历是[3 2 1]。 diff --git "a/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" index adb2a06082..5829e2d220 100644 --- "a/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" +++ "b/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" @@ -16,7 +16,7 @@ 示例: -![108.将有序数组转换为二叉搜索树](https://code-thinking-1253855093.file.myqcloud.com/pics/20201022164420763.png) +![108.将有序数组转换为二叉搜索树](https://file.kamacoder.com/pics/20201022164420763.png) ## 算法公开课 @@ -40,7 +40,7 @@ 例如 有序数组[-10,-3,0,5,9] 就可以构造成这样的二叉搜索树,如图。 -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20220930173553.png) +![](https://file.kamacoder.com/pics/20220930173553.png) 上图中,是符合二叉搜索树的特性吧,如果要这么做的话,是不是本题意义就不大了,所以才强调是平衡二叉搜索树。 diff --git "a/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" "b/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" index c3da728077..ff84ad8471 100644 --- "a/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" @@ -19,7 +19,7 @@ 给定二叉树 [3,9,20,null,null,15,7] -![110.平衡二叉树](https://code-thinking-1253855093.file.myqcloud.com/pics/2021020315542230.png) +![110.平衡二叉树](https://file.kamacoder.com/pics/2021020315542230.png) 返回 true 。 @@ -27,7 +27,7 @@ 给定二叉树 [1,2,2,3,3,null,null,4,4] -![110.平衡二叉树1](https://code-thinking-1253855093.file.myqcloud.com/pics/20210203155447919.png) +![110.平衡二叉树1](https://file.kamacoder.com/pics/20210203155447919.png) 返回 false 。 @@ -46,7 +46,7 @@ 但leetcode中强调的深度和高度很明显是按照节点来计算的,如图: -![110.平衡二叉树2](https://code-thinking-1253855093.file.myqcloud.com/pics/20210203155515650.png) +![110.平衡二叉树2](https://file.kamacoder.com/pics/20210203155515650.png) 关于根节点的深度究竟是1 还是 0,不同的地方有不一样的标准,leetcode的题目中都是以节点为一度,即根节点深度是1。但维基百科上定义用边为一度,即根节点的深度是0,我们暂时以leetcode为准(毕竟要在这上面刷题)。 diff --git "a/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" "b/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" index a77594b28f..bd4ea29d6c 100644 --- "a/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" +++ "b/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" @@ -20,7 +20,7 @@ 给定二叉树 [3,9,20,null,null,15,7], -![111.二叉树的最小深度1](https://code-thinking-1253855093.file.myqcloud.com/pics/2021020315582586.png) +![111.二叉树的最小深度1](https://file.kamacoder.com/pics/2021020315582586.png) 返回它的最小深度 2. diff --git "a/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" "b/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" index 22ed777fba..24891acee9 100644 --- "a/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" +++ "b/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" @@ -15,7 +15,7 @@ 示例: 给定如下二叉树,以及目标和 sum = 22, -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20230407210247.png) +![](https://file.kamacoder.com/pics/20230407210247.png) 返回 true, 因为存在目标和为 22 的根节点到叶子节点的路径 5->4->11->2。 @@ -53,7 +53,7 @@ 如图所示: -![112.路径总和](https://code-thinking-1253855093.file.myqcloud.com/pics/2021020316051216.png) +![112.路径总和](https://file.kamacoder.com/pics/2021020316051216.png) 图中可以看出,遍历的路线,并不要遍历整棵树,所以递归函数需要返回值,可以用bool类型表示。 @@ -230,7 +230,7 @@ public: 给定如下二叉树,以及目标和 sum = 22, -![113.路径总和ii1.png](https://code-thinking-1253855093.file.myqcloud.com/pics/20210203160854654.png) +![113.路径总和ii1.png](https://file.kamacoder.com/pics/20210203160854654.png) ### 思路 @@ -239,7 +239,7 @@ public: 如图: -![113.路径总和ii](https://code-thinking-1253855093.file.myqcloud.com/pics/20210203160922745.png) +![113.路径总和ii](https://file.kamacoder.com/pics/20210203160922745.png) 为了尽可能的把细节体现出来,我写出如下代码(**这份代码并不简洁,但是逻辑非常清晰**) diff --git "a/problems/0115.\344\270\215\345\220\214\347\232\204\345\255\220\345\272\217\345\210\227.md" "b/problems/0115.\344\270\215\345\220\214\347\232\204\345\255\220\345\272\217\345\210\227.md" index 832b64d183..1df3d899a8 100644 --- "a/problems/0115.\344\270\215\345\220\214\347\232\204\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0115.\344\270\215\345\220\214\347\232\204\345\255\220\345\272\217\345\210\227.md" @@ -70,7 +70,7 @@ dp[i][j]:以i-1为结尾的s子序列中出现以j-1为结尾的t的个数为d 从递推公式dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j]; 和 dp[i][j] = dp[i - 1][j]; 中可以看出dp[i][j] 是从上方和左上方推导而来,如图:,那么 dp[i][0] 和dp[0][j]是一定要初始化的。 -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20221222165412.png) +![](https://file.kamacoder.com/pics/20221222165412.png) 每次当初始化的时候,都要回顾一下dp[i][j]的定义,不要凭感觉初始化。 @@ -101,7 +101,7 @@ for (int j = 1; j <= t.size(); j++) dp[0][j] = 0; // 其实这行代码可以和 从递推公式dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j]; 和 dp[i][j] = dp[i - 1][j]; 中可以看出dp[i][j]都是根据左上方和正上方推出来的。 -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20221222165412.png) +![](https://file.kamacoder.com/pics/20221222165412.png) 所以遍历的时候一定是从上到下,从左到右,这样保证dp[i][j]可以根据之前计算出来的数值进行计算。 diff --git "a/problems/0116.\345\241\253\345\205\205\346\257\217\344\270\252\350\212\202\347\202\271\347\232\204\344\270\213\344\270\200\344\270\252\345\217\263\344\276\247\350\212\202\347\202\271\346\214\207\351\222\210.md" "b/problems/0116.\345\241\253\345\205\205\346\257\217\344\270\252\350\212\202\347\202\271\347\232\204\344\270\213\344\270\200\344\270\252\345\217\263\344\276\247\350\212\202\347\202\271\346\214\207\351\222\210.md" index 234929f3d1..9de1de1ee5 100644 --- "a/problems/0116.\345\241\253\345\205\205\346\257\217\344\270\252\350\212\202\347\202\271\347\232\204\344\270\213\344\270\200\344\270\252\345\217\263\344\276\247\350\212\202\347\202\271\346\214\207\351\222\210.md" +++ "b/problems/0116.\345\241\253\345\205\205\346\257\217\344\270\252\350\212\202\347\202\271\347\232\204\344\270\213\344\270\200\344\270\252\345\217\263\344\276\247\350\212\202\347\202\271\346\214\207\351\222\210.md" @@ -26,7 +26,7 @@ struct Node { * 你只能使用常量级额外空间。 * 使用递归解题也符合要求,本题中递归程序占用的栈空间不算做额外的空间复杂度。 -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210727143202.png) +![](https://file.kamacoder.com/pics/20210727143202.png) ## 思路 diff --git "a/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" "b/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" index b9df47a491..f82ed962fa 100644 --- "a/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" +++ "b/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" @@ -129,7 +129,7 @@ dp[0][1]表示第0天不持有股票,不持有股票那么现金就是0,所 以示例1,输入:[7,1,5,3,6,4]为例,dp数组状态如下: -![121.买卖股票的最佳时机](https://code-thinking-1253855093.file.myqcloud.com/pics/20210224225642465.png) +![121.买卖股票的最佳时机](https://file.kamacoder.com/pics/20210224225642465.png) dp[5][1]就是最终结果。 diff --git "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" index b268040771..4ccb17bbfd 100644 --- "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" +++ "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" @@ -66,7 +66,7 @@ 如图: -![122.买卖股票的最佳时机II](https://code-thinking-1253855093.file.myqcloud.com/pics/2020112917480858-20230310134659477.png) +![122.买卖股票的最佳时机II](https://file.kamacoder.com/pics/2020112917480858-20230310134659477.png) 一些同学陷入:第一天怎么就没有利润呢,第一天到底算不算的困惑中。 diff --git "a/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" "b/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" index 75f7cb3f20..c4ff89a0c5 100644 --- "a/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" +++ "b/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" @@ -120,7 +120,7 @@ dp[i][4] = max(dp[i - 1][4], dp[i - 1][3] + prices[i]); 以输入[1,2,3,4,5]为例 -![123.买卖股票的最佳时机III](https://code-thinking-1253855093.file.myqcloud.com/pics/20201228181724295-20230310134201291.png) +![123.买卖股票的最佳时机III](https://file.kamacoder.com/pics/20201228181724295-20230310134201291.png) 大家可以看到红色框为最后两次卖出的状态。 diff --git "a/problems/0127.\345\215\225\350\257\215\346\216\245\351\276\231.md" "b/problems/0127.\345\215\225\350\257\215\346\216\245\351\276\231.md" index 556613e587..1ce0bc11a7 100644 --- "a/problems/0127.\345\215\225\350\257\215\346\216\245\351\276\231.md" +++ "b/problems/0127.\345\215\225\350\257\215\346\216\245\351\276\231.md" @@ -31,7 +31,7 @@ 以示例1为例,从这个图中可以看出 hit 到 cog的路线,不止一条,有三条,一条是最短的长度为5,两条长度为6。 -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210827175432.png) +![](https://file.kamacoder.com/pics/20210827175432.png) 本题只需要求出最短路径的长度就可以了,不用找出路径。 diff --git "a/problems/0130.\350\242\253\345\233\264\347\273\225\347\232\204\345\214\272\345\237\237.md" "b/problems/0130.\350\242\253\345\233\264\347\273\225\347\232\204\345\214\272\345\237\237.md" index 4eeb57143e..278c12eccc 100644 --- "a/problems/0130.\350\242\253\345\233\264\347\273\225\347\232\204\345\214\272\345\237\237.md" +++ "b/problems/0130.\350\242\253\345\233\264\347\273\225\347\232\204\345\214\272\345\237\237.md" @@ -8,7 +8,7 @@ 给你一个 m x n 的矩阵 board ,由若干字符 'X' 和 'O' ,找到所有被 'X' 围绕的区域,并将这些区域里所有的 'O' 用 'X' 填充。 -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20220901104745.png) +![](https://file.kamacoder.com/pics/20220901104745.png) * 输入:board = [["X","X","X","X"],["X","O","O","X"],["X","X","O","X"],["X","O","X","X"]] * 输出:[["X","X","X","X"],["X","X","X","X"],["X","X","X","X"],["X","O","X","X"]] @@ -28,11 +28,11 @@ 步骤一:深搜或者广搜将地图周边的'O'全部改成'A',如图所示: -![图一](https://code-thinking-1253855093.file.myqcloud.com/pics/20220902102337.png) +![图一](https://file.kamacoder.com/pics/20220902102337.png) 步骤二:在遍历地图,将'O'全部改成'X'(地图中间的'O'改成了'X'),将'A'改回'O'(保留的地图周边的'O'),如图所示: -![图二](https://code-thinking-1253855093.file.myqcloud.com/pics/20220902102831.png) +![图二](https://file.kamacoder.com/pics/20220902102831.png) 整体C++代码如下,以下使用dfs实现,其实遍历方式dfs,bfs都是可以的。 diff --git "a/problems/0132.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262II.md" "b/problems/0132.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262II.md" index 2117a44801..089dd52c78 100644 --- "a/problems/0132.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262II.md" +++ "b/problems/0132.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262II.md" @@ -161,7 +161,7 @@ for (int i = s.size() - 1; i >= 0; i--) { 以输入:"aabc" 为例: -![132.分割回文串II](https://code-thinking-1253855093.file.myqcloud.com/pics/20210124182218844.jpg) +![132.分割回文串II](https://file.kamacoder.com/pics/20210124182218844.jpg) 以上分析完毕,代码如下: diff --git "a/problems/0134.\345\212\240\346\262\271\347\253\231.md" "b/problems/0134.\345\212\240\346\262\271\347\253\231.md" index fdf3e0d3db..354f642448 100644 --- "a/problems/0134.\345\212\240\346\262\271\347\253\231.md" +++ "b/problems/0134.\345\212\240\346\262\271\347\253\231.md" @@ -144,7 +144,7 @@ i从0开始累加rest[i],和记为curSum,一旦curSum小于零,说明[0, i 如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20230117165628.png) +![](https://file.kamacoder.com/pics/20230117165628.png) 那么为什么一旦[0,i] 区间和为负数,起始位置就可以是i+1呢,i+1后面就不会出现更大的负数? @@ -152,7 +152,7 @@ i从0开始累加rest[i],和记为curSum,一旦curSum小于零,说明[0, i 那有没有可能 [0,i] 区间 选某一个作为起点,累加到 i这里 curSum是不会小于零呢? 如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20230117170703.png) +![](https://file.kamacoder.com/pics/20230117170703.png) 如果 curSum<0 说明 区间和1 + 区间和2 < 0, 那么 假设从上图中的位置开始计数curSum不会小于0的话,就是 区间和2>0。 diff --git "a/problems/0135.\345\210\206\345\217\221\347\263\226\346\236\234.md" "b/problems/0135.\345\210\206\345\217\221\347\263\226\346\236\234.md" index 75cce157c6..30df21495e 100644 --- "a/problems/0135.\345\210\206\345\217\221\347\263\226\346\236\234.md" +++ "b/problems/0135.\345\210\206\345\217\221\347\263\226\346\236\234.md" @@ -56,7 +56,7 @@ for (int i = 1; i < ratings.size(); i++) { 如图: -![135.分发糖果](https://code-thinking-1253855093.file.myqcloud.com/pics/20201117114916878.png) +![135.分发糖果](https://file.kamacoder.com/pics/20201117114916878.png) 再确定左孩子大于右孩子的情况(从后向前遍历) @@ -66,7 +66,7 @@ for (int i = 1; i < ratings.size(); i++) { 如果从前向后遍历,rating[5]与rating[4]的比较 就不能用上 rating[5]与rating[6]的比较结果了 。如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20230202102044.png) +![](https://file.kamacoder.com/pics/20230202102044.png) **所以确定左孩子大于右孩子的情况一定要从后向前遍历!** @@ -82,7 +82,7 @@ for (int i = 1; i < ratings.size(); i++) { 如图: -![135.分发糖果1](https://code-thinking-1253855093.file.myqcloud.com/pics/20201117115658791.png) +![135.分发糖果1](https://file.kamacoder.com/pics/20201117115658791.png) 所以该过程代码如下: diff --git "a/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" "b/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" index b74d2cdfa0..513d327ba1 100644 --- "a/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" +++ "b/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" @@ -180,7 +180,7 @@ dp[0]表示如果字符串为空的话,说明出现在字典里。 以输入: s = "leetcode", wordDict = ["leet", "code"]为例,dp状态如图: -![139.单词拆分](https://code-thinking-1253855093.file.myqcloud.com/pics/20210202162652727.jpg) +![139.单词拆分](https://file.kamacoder.com/pics/20210202162652727.jpg) dp[s.size()]就是最终结果。 @@ -241,7 +241,7 @@ public: 使用用例:s = "applepenapple", wordDict = ["apple", "pen"],对应的dp数组状态如下: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240809155103.png) +![](https://file.kamacoder.com/pics/20240809155103.png) 最后dp[s.size()] = 0 即 dp[13] = 0 ,而不是1,因为先用 "apple" 去遍历的时候,dp[8]并没有被赋值为1 (还没用"pen"),所以 dp[13]也不能变成1。 diff --git "a/problems/0141.\347\216\257\345\275\242\351\223\276\350\241\250.md" "b/problems/0141.\347\216\257\345\275\242\351\223\276\350\241\250.md" index 4957e9fbd5..685a92d529 100644 --- "a/problems/0141.\347\216\257\345\275\242\351\223\276\350\241\250.md" +++ "b/problems/0141.\347\216\257\345\275\242\351\223\276\350\241\250.md" @@ -13,7 +13,7 @@ 如果链表中存在环,则返回 true 。 否则,返回 false 。 -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210727173600.png) +![](https://file.kamacoder.com/pics/20210727173600.png) ## 思路 diff --git "a/problems/0142.\347\216\257\345\275\242\351\223\276\350\241\250II.md" "b/problems/0142.\347\216\257\345\275\242\351\223\276\350\241\250II.md" index fb8b875f7d..6cfabc60f6 100644 --- "a/problems/0142.\347\216\257\345\275\242\351\223\276\350\241\250II.md" +++ "b/problems/0142.\347\216\257\345\275\242\351\223\276\350\241\250II.md" @@ -20,7 +20,7 @@ **说明**:不允许修改给定的链表。 -![循环链表](https://code-thinking-1253855093.file.myqcloud.com/pics/20200816110112704.png) +![循环链表](https://file.kamacoder.com/pics/20200816110112704.png) ## 算法公开课 @@ -50,7 +50,7 @@ 会发现最终都是这种情况, 如下图: -![142环形链表1](https://code-thinking-1253855093.file.myqcloud.com/pics/20210318162236720.png) +![142环形链表1](https://file.kamacoder.com/pics/20210318162236720.png) fast和slow各自再走一步, fast和slow就相遇了 @@ -70,7 +70,7 @@ fast和slow各自再走一步, fast和slow就相遇了 环形入口节点到 fast指针与slow指针相遇节点 节点数为y。 从相遇节点 再到环形入口节点节点数为 z。 如图所示: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20220925103433.png) +![](https://file.kamacoder.com/pics/20220925103433.png) 那么相遇时: slow指针走过的节点数为: `x + y`, @@ -154,20 +154,20 @@ public: 即文章[链表:环找到了,那入口呢?](https://programmercarl.com/0142.环形链表II.html)中如下的地方: -![142环形链表5](https://code-thinking-1253855093.file.myqcloud.com/pics/20210318165123581.png) +![142环形链表5](https://file.kamacoder.com/pics/20210318165123581.png) 首先slow进环的时候,fast一定是先进环来了。 如果slow进环入口,fast也在环入口,那么把这个环展开成直线,就是如下图的样子: -![142环形链表3](https://code-thinking-1253855093.file.myqcloud.com/pics/2021031816503266.png) +![142环形链表3](https://file.kamacoder.com/pics/2021031816503266.png) 可以看出如果slow 和 fast同时在环入口开始走,一定会在环入口3相遇,slow走了一圈,fast走了两圈。 重点来了,slow进环的时候,fast一定是在环的任意一个位置,如图: -![142环形链表4](https://code-thinking-1253855093.file.myqcloud.com/pics/2021031816515727.png) +![142环形链表4](https://file.kamacoder.com/pics/2021031816515727.png) 那么fast指针走到环入口3的时候,已经走了k + n 个节点,slow相应的应该走了(k + n) / 2 个节点。 diff --git "a/problems/0143.\351\207\215\346\216\222\351\223\276\350\241\250.md" "b/problems/0143.\351\207\215\346\216\222\351\223\276\350\241\250.md" index c61eb4b403..98488bc11d 100644 --- "a/problems/0143.\351\207\215\346\216\222\351\223\276\350\241\250.md" +++ "b/problems/0143.\351\207\215\346\216\222\351\223\276\350\241\250.md" @@ -6,7 +6,7 @@ [力扣题目链接](https://leetcode.cn/problems/reorder-list/submissions/) -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210726160122.png) +![](https://file.kamacoder.com/pics/20210726160122.png) ## 思路 diff --git "a/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" "b/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" index b182d4d03d..a3fc7ef126 100644 --- "a/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" +++ "b/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" @@ -132,7 +132,7 @@ for (int j = 1; j < 2 * k; j += 2) { 以输入[1,2,3,4,5],k=2为例。 -![188.买卖股票的最佳时机IV](https://code-thinking-1253855093.file.myqcloud.com/pics/20201229100358221.png) +![188.买卖股票的最佳时机IV](https://file.kamacoder.com/pics/20201229100358221.png) 最后一次卖出,一定是利润最大的,dp[prices.size() - 1][2 * k]即红色部分就是最后求解。 diff --git "a/problems/0198.\346\211\223\345\256\266\345\212\253\350\210\215.md" "b/problems/0198.\346\211\223\345\256\266\345\212\253\350\210\215.md" index 3d06c95241..0bee40f7cd 100644 --- "a/problems/0198.\346\211\223\345\256\266\345\212\253\350\210\215.md" +++ "b/problems/0198.\346\211\223\345\256\266\345\212\253\350\210\215.md" @@ -87,7 +87,7 @@ for (int i = 2; i < nums.size(); i++) { 以示例二,输入[2,7,9,3,1]为例。 -![198.打家劫舍](https://code-thinking-1253855093.file.myqcloud.com/pics/20210221170954115.jpg) +![198.打家劫舍](https://file.kamacoder.com/pics/20210221170954115.jpg) 红框dp[nums.size() - 1]为结果。 diff --git "a/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\345\271\277\346\220\234\347\211\210.md" "b/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\345\271\277\346\220\234\347\211\210.md" index 4901934bfe..9ea47329bb 100644 --- "a/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\345\271\277\346\220\234\347\211\210.md" +++ "b/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\345\271\277\346\220\234\347\211\210.md" @@ -13,7 +13,7 @@ 此外,你可以假设该网格的四条边均被水包围。 -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20220726093256.png) +![](https://file.kamacoder.com/pics/20220726093256.png) 提示: @@ -28,7 +28,7 @@ 也就是说斜角度链接是不算了, 例如示例二,是三个岛屿,如图: -![图一](https://code-thinking-1253855093.file.myqcloud.com/pics/20220726094200.png) +![图一](https://file.kamacoder.com/pics/20220726094200.png) 这道题题目是 DFS,BFS,并查集,基础题目。 @@ -48,7 +48,7 @@ 如果从队列拿出节点,再去标记这个节点走过,就会发生下图所示的结果,会导致很多节点重复加入队列。 -![图二](https://code-thinking-1253855093.file.myqcloud.com/pics/20220727100846.png) +![图二](https://file.kamacoder.com/pics/20220727100846.png) 超时写法 (从队列中取出节点再标记) diff --git "a/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\346\267\261\346\220\234\347\211\210.md" "b/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\346\267\261\346\220\234\347\211\210.md" index a3f6f48c76..a015399859 100644 --- "a/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\346\267\261\346\220\234\347\211\210.md" +++ "b/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\346\267\261\346\220\234\347\211\210.md" @@ -12,7 +12,7 @@ 此外,你可以假设该网格的四条边均被水包围。 -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20220726093256.png) +![](https://file.kamacoder.com/pics/20220726093256.png) 提示: @@ -27,7 +27,7 @@ 也就是说斜角度链接是不算了, 例如示例二,是三个岛屿,如图: -![图一](https://code-thinking-1253855093.file.myqcloud.com/pics/20220726094200.png) +![图一](https://file.kamacoder.com/pics/20220726094200.png) 这道题题目是 DFS,BFS,并查集,基础题目。 diff --git "a/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" "b/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" index 9a38aaa152..5ecf89bf19 100644 --- "a/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" +++ "b/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" @@ -34,11 +34,11 @@ 这里以链表 1 4 2 4 来举例,移除元素4。 -![203_链表删除元素1](https://code-thinking-1253855093.file.myqcloud.com/pics/20210316095351161.png) +![203_链表删除元素1](https://file.kamacoder.com/pics/20210316095351161.png) 如果使用C,C++编程语言的话,不要忘了还要从内存中删除这两个移除的节点, 清理节点内存之后如图: -![203_链表删除元素2](https://code-thinking-1253855093.file.myqcloud.com/pics/20210316095418280.png) +![203_链表删除元素2](https://file.kamacoder.com/pics/20210316095418280.png) **当然如果使用java ,python的话就不用手动管理内存了。** @@ -56,16 +56,16 @@ 来看第一种操作:直接使用原来的链表来进行移除。 -![203_链表删除元素3](https://code-thinking-1253855093.file.myqcloud.com/pics/2021031609544922.png) +![203_链表删除元素3](https://file.kamacoder.com/pics/2021031609544922.png) 移除头结点和移除其他节点的操作是不一样的,因为链表的其他节点都是通过前一个节点来移除当前节点,而头结点没有前一个节点。 所以头结点如何移除呢,其实只要将头结点向后移动一位就可以,这样就从链表中移除了一个头结点。 -![203_链表删除元素4](https://code-thinking-1253855093.file.myqcloud.com/pics/20210316095512470.png) +![203_链表删除元素4](https://file.kamacoder.com/pics/20210316095512470.png) 依然别忘将原头结点从内存中删掉。 -![203_链表删除元素5](https://code-thinking-1253855093.file.myqcloud.com/pics/20210316095543775.png) +![203_链表删除元素5](https://file.kamacoder.com/pics/20210316095543775.png) 这样移除了一个头结点,是不是发现,在单链表中移除头结点 和 移除其他节点的操作方式是不一样,其实在写代码的时候也会发现,需要单独写一段逻辑来处理移除头结点的情况。 @@ -76,7 +76,7 @@ 来看看如何设置一个虚拟头。依然还是在这个链表中,移除元素1。 -![203_链表删除元素6](https://code-thinking-1253855093.file.myqcloud.com/pics/20210316095619221.png) +![203_链表删除元素6](https://file.kamacoder.com/pics/20210316095619221.png) 这里来给链表添加一个虚拟头结点为新的头结点,此时要移除这个旧头结点元素1。 diff --git "a/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md" "b/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md" index 7509882f08..4e33342a67 100644 --- "a/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md" +++ "b/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md" @@ -27,7 +27,7 @@ 其实只需要改变链表的next指针的指向,直接将链表反转 ,而不用重新定义一个新的链表,如图所示: -![206_反转链表](https://code-thinking-1253855093.file.myqcloud.com/pics/20210218090901207.png) +![206_反转链表](https://file.kamacoder.com/pics/20210218090901207.png) 之前链表的头节点是元素1, 反转之后头结点就是元素5 ,这里并没有添加或者删除节点,仅仅是改变next指针的方向。 diff --git "a/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" "b/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" index 43a3cb6a2b..ca24bc4234 100644 --- "a/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" +++ "b/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" @@ -104,7 +104,7 @@ public: 解题的关键在于 窗口的起始位置如何移动,如图所示: -![leetcode_209](https://code-thinking-1253855093.file.myqcloud.com/pics/20210312160441942.png) +![leetcode_209](https://file.kamacoder.com/pics/20210312160441942.png) 可以发现**滑动窗口的精妙之处在于根据当前子序列和大小的情况,不断调节子序列的起始位置。从而将O(n^2)暴力解法降为O(n)。** diff --git "a/problems/0213.\346\211\223\345\256\266\345\212\253\350\210\215II.md" "b/problems/0213.\346\211\223\345\256\266\345\212\253\350\210\215II.md" index 536e1e89b8..8fceb0a91e 100644 --- "a/problems/0213.\346\211\223\345\256\266\345\212\253\350\210\215II.md" +++ "b/problems/0213.\346\211\223\345\256\266\345\212\253\350\210\215II.md" @@ -42,15 +42,15 @@ * 情况一:考虑不包含首尾元素 -![213.打家劫舍II](https://code-thinking-1253855093.file.myqcloud.com/pics/20210129160748643-20230310134000692.jpg) +![213.打家劫舍II](https://file.kamacoder.com/pics/20210129160748643-20230310134000692.jpg) * 情况二:考虑包含首元素,不包含尾元素 -![213.打家劫舍II1](https://code-thinking-1253855093.file.myqcloud.com/pics/20210129160821374-20230310134003961.jpg) +![213.打家劫舍II1](https://file.kamacoder.com/pics/20210129160821374-20230310134003961.jpg) * 情况三:考虑包含尾元素,不包含首元素 -![213.打家劫舍II2](https://code-thinking-1253855093.file.myqcloud.com/pics/20210129160842491-20230310134008133.jpg) +![213.打家劫舍II2](https://file.kamacoder.com/pics/20210129160842491-20230310134008133.jpg) **注意我这里用的是"考虑"**,例如情况三,虽然是考虑包含尾元素,但不一定要选尾部元素! 对于情况三,取nums[1] 和 nums[3]就是最大的。 diff --git "a/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" "b/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" index 3dbd676a8d..e23be78d5e 100644 --- "a/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" +++ "b/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" @@ -45,7 +45,7 @@ 选取过程如图: -![216.组合总和III](https://code-thinking-1253855093.file.myqcloud.com/pics/20201123195717975.png) +![216.组合总和III](https://file.kamacoder.com/pics/20201123195717975.png) 图中,可以看出,只有最后取到集合(1,3)和为4 符合条件。 @@ -108,7 +108,7 @@ if (path.size() == k) { 本题和[77. 组合](https://programmercarl.com/0077.组合.html)区别之一就是集合固定的就是9个数[1,...,9],所以for循环固定i<=9 如图: -![216.组合总和III](https://code-thinking-1253855093.file.myqcloud.com/pics/20201123195717975-20230310113546003.png) +![216.组合总和III](https://file.kamacoder.com/pics/20201123195717975-20230310113546003.png) 处理过程就是 path收集每次选取的元素,相当于树型结构里的边,sum来统计path里元素的总和。 @@ -166,7 +166,7 @@ public: 这道题目,剪枝操作其实是很容易想到了,想必大家看上面的树形图的时候已经想到了。 如图: -![216.组合总和III1](https://code-thinking-1253855093.file.myqcloud.com/pics/2020112319580476.png) +![216.组合总和III1](https://file.kamacoder.com/pics/2020112319580476.png) 已选元素总和如果已经大于n(图中数值为4)了,那么往后遍历就没有意义了,直接剪掉。 diff --git "a/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" "b/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" index 9b649d7be8..37ae7819aa 100644 --- "a/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" +++ "b/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" @@ -153,7 +153,7 @@ public: 我来举一个典型的例子如题: - + 完全二叉树只有两种情况,情况一:就是满二叉树,情况二:最后一层叶子节点没有满。 @@ -162,10 +162,10 @@ public: 对于情况二,分别递归左孩子,和右孩子,递归到某一深度一定会有左孩子或者右孩子为满二叉树,然后依然可以按照情况1来计算。 完全二叉树(一)如图: -![222.完全二叉树的节点个数](https://code-thinking-1253855093.file.myqcloud.com/pics/20201124092543662.png) +![222.完全二叉树的节点个数](https://file.kamacoder.com/pics/20201124092543662.png) 完全二叉树(二)如图: -![222.完全二叉树的节点个数1](https://code-thinking-1253855093.file.myqcloud.com/pics/20201124092634138.png) +![222.完全二叉树的节点个数1](https://file.kamacoder.com/pics/20201124092634138.png) 可以看出如果整个树不是满二叉树,就递归其左右孩子,直到遇到满二叉树为止,用公式计算这个子树(满二叉树)的节点数量。 @@ -173,15 +173,15 @@ public: 在完全二叉树中,如果递归向左遍历的深度等于递归向右遍历的深度,那说明就是满二叉树。如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20220829163554.png) +![](https://file.kamacoder.com/pics/20220829163554.png) 在完全二叉树中,如果递归向左遍历的深度不等于递归向右遍历的深度,则说明不是满二叉树,如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20220829163709.png) +![](https://file.kamacoder.com/pics/20220829163709.png) 那有录友说了,这种情况,递归向左遍历的深度等于递归向右遍历的深度,但也不是满二叉树,如题: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20220829163811.png) +![](https://file.kamacoder.com/pics/20220829163811.png) 如果这么想,大家就是对 完全二叉树理解有误区了,**以上这棵二叉树,它根本就不是一个完全二叉树**! diff --git "a/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" "b/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" index 0980e6004c..248a28a4d5 100644 --- "a/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" @@ -10,7 +10,7 @@ 翻转一棵二叉树。 -![226.翻转二叉树](https://code-thinking-1253855093.file.myqcloud.com/pics/20210203192644329.png) +![226.翻转二叉树](https://file.kamacoder.com/pics/20210203192644329.png) 这道题目背后有一个让程序员心酸的故事,听说 Homebrew的作者Max Howell,就是因为没在白板上写出翻转二叉树,最后被Google拒绝了。(真假不做判断,全当一个乐子哈) @@ -35,7 +35,7 @@ 如果要从整个树来看,翻转还真的挺复杂,整个树以中间分割线进行翻转,如图: -![226.翻转二叉树1](https://code-thinking-1253855093.file.myqcloud.com/pics/20210203192724351.png) +![226.翻转二叉树1](https://file.kamacoder.com/pics/20210203192724351.png) 可以发现想要翻转它,其实就把每一个节点的左右孩子交换一下就可以了。 diff --git "a/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" "b/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" index c5eb603a0d..98cc5b7da8 100644 --- "a/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" +++ "b/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" @@ -14,7 +14,7 @@ 例如,给定如下二叉搜索树:  root = [6,2,8,0,4,7,9,null,null,3,5] -![235. 二叉搜索树的最近公共祖先](https://code-thinking-1253855093.file.myqcloud.com/pics/20201018172243602.png) +![235. 二叉搜索树的最近公共祖先](https://file.kamacoder.com/pics/20201018172243602.png) 示例 1: @@ -52,7 +52,7 @@ 如图,我们从根节点搜索,第一次遇到 cur节点是数值在[q, p]区间中,即 节点5,此时可以说明 q 和 p 一定分别存在于 节点 5的左子树,和右子树中。 -![235.二叉搜索树的最近公共祖先](https://code-thinking-1253855093.file.myqcloud.com/pics/20220926164214.png) +![235.二叉搜索树的最近公共祖先](https://file.kamacoder.com/pics/20220926164214.png) 此时节点5是不是最近公共祖先? 如果 从节点5继续向左遍历,那么将错过成为p的祖先, 如果从节点5继续向右遍历则错过成为q的祖先。 @@ -64,7 +64,7 @@ 如图所示:p为节点6,q为节点9 -![235.二叉搜索树的最近公共祖先2](https://code-thinking-1253855093.file.myqcloud.com/pics/20220926165141.png) +![235.二叉搜索树的最近公共祖先2](https://file.kamacoder.com/pics/20220926165141.png) 可以看出直接按照指定的方向,就可以找到节点8,为最近公共祖先,而且不需要遍历整棵树,找到结果直接返回! diff --git "a/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" "b/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" index f15d1cff60..537d624084 100644 --- "a/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" +++ "b/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" @@ -16,7 +16,7 @@ 例如,给定如下二叉树:  root = [3,5,1,6,2,0,8,null,null,7,4] -![236. 二叉树的最近公共祖先](https://code-thinking-1253855093.file.myqcloud.com/pics/20201016173414722.png) +![236. 二叉树的最近公共祖先](https://file.kamacoder.com/pics/20201016173414722.png) 示例 1: 输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1 @@ -51,7 +51,7 @@ **首先最容易想到的一个情况:如果找到一个节点,发现左子树出现结点p,右子树出现节点q,或者 左子树出现结点q,右子树出现节点p,那么该节点就是节点p和q的最近公共祖先。** 即情况一: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20220922173502.png) +![](https://file.kamacoder.com/pics/20220922173502.png) 判断逻辑是 如果递归遍历遇到q,就将q返回,遇到p 就将p返回,那么如果 左右子树的返回值都不为空,说明此时的中节点,一定是q 和p 的最近祖先。 @@ -61,7 +61,7 @@ **但是很多人容易忽略一个情况,就是节点本身p(q),它拥有一个子孙节点q(p)。** 情况二: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20220922173530.png) +![](https://file.kamacoder.com/pics/20220922173530.png) 其实情况一 和 情况二 代码实现过程都是一样的,也可以说,实现情况一的逻辑,顺便包含了情况二。 @@ -129,7 +129,7 @@ left与right的逻辑处理; // 中 如图: -![236.二叉树的最近公共祖先](https://code-thinking-1253855093.file.myqcloud.com/pics/2021020415105872.png) +![236.二叉树的最近公共祖先](https://file.kamacoder.com/pics/2021020415105872.png) 就像图中一样直接返回7。 @@ -162,7 +162,7 @@ TreeNode* right = lowestCommonAncestor(root->right, p, q); 如图: -![236.二叉树的最近公共祖先1](https://code-thinking-1253855093.file.myqcloud.com/pics/20210204151125844.png) +![236.二叉树的最近公共祖先1](https://file.kamacoder.com/pics/20210204151125844.png) 图中节点10的左子树返回null,右子树返回目标值7,那么此时节点10的处理逻辑就是把右子树的返回值(最近公共祖先7)返回上去! @@ -183,7 +183,7 @@ else { // (left == NULL && right == NULL) 那么寻找最小公共祖先,完整流程图如下: -![236.二叉树的最近公共祖先2](https://code-thinking-1253855093.file.myqcloud.com/pics/202102041512582.png) +![236.二叉树的最近公共祖先2](https://file.kamacoder.com/pics/202102041512582.png) **从图中,大家可以看到,我们是如何回溯遍历整棵二叉树,将结果返回给头结点的!** diff --git "a/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" "b/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" index 287db20937..5d71351172 100644 --- "a/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" +++ "b/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" @@ -14,7 +14,7 @@ 说明: 叶子节点是指没有子节点的节点。 示例: -![257.二叉树的所有路径1](https://code-thinking-1253855093.file.myqcloud.com/pics/2021020415161576.png) +![257.二叉树的所有路径1](https://file.kamacoder.com/pics/2021020415161576.png) ## 算法公开课 @@ -28,7 +28,7 @@ 前序遍历以及回溯的过程如图: -![257.二叉树的所有路径](https://code-thinking-1253855093.file.myqcloud.com/pics/20210204151702443.png) +![257.二叉树的所有路径](https://file.kamacoder.com/pics/20210204151702443.png) 我们先使用递归的方式,来做前序遍历。**要知道递归和回溯就是一家的,本题也需要回溯。** @@ -315,7 +315,7 @@ public: 其实关键还在于 参数,使用的是 `string path`,这里并没有加上引用`&` ,即本层递归中,path + 该节点数值,但该层递归结束,上一层path的数值并不会受到任何影响。 如图所示: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20220831173322.png) +![](https://file.kamacoder.com/pics/20220831173322.png) 节点4 的path,在遍历到节点3,path+3,遍历节点3的递归结束之后,返回节点4(回溯的过程),path并不会把3加上。 diff --git "a/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" "b/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" index c1077bd43d..8171a409a0 100644 --- "a/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" +++ "b/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" @@ -93,7 +93,7 @@ for (int i = 0; i <= n; i++) { // 遍历背包 已输入n为5例,dp状态图如下: -![279.完全平方数](https://code-thinking-1253855093.file.myqcloud.com/pics/20210202112617341.jpg) +![279.完全平方数](https://file.kamacoder.com/pics/20210202112617341.jpg) dp[0] = 0 dp[1] = min(dp[0] + 1) = 1 diff --git "a/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" "b/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" index 7d2e488623..de37ed5cc8 100644 --- "a/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" @@ -85,7 +85,7 @@ for (int i = 1; i < nums.size(); i++) { 输入:[0,1,0,3,2],dp数组的变化如下: -![300.最长上升子序列](https://code-thinking-1253855093.file.myqcloud.com/pics/20210110170945618.jpg) +![300.最长上升子序列](https://file.kamacoder.com/pics/20210110170945618.jpg) 如果代码写出来,但一直AC不了,那么就把dp数组打印出来,看看对不对! diff --git "a/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" "b/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" index 6a81933505..599a1f42e1 100644 --- "a/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" +++ "b/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" @@ -47,7 +47,7 @@ dp[i][j],第i天状态为j,所剩的最多现金为dp[i][j]。 * 状态三:今天卖出股票 * 状态四:今天为冷冻期状态,但冷冻期状态不可持续,只有一天! -![](https://code-thinking-1253855093.file.myqcloud.com/pics/518d5baaf33f4b2698064f8efb42edbf.png) +![](https://file.kamacoder.com/pics/518d5baaf33f4b2698064f8efb42edbf.png) j的状态为: @@ -136,7 +136,7 @@ dp[i][3] = dp[i - 1][2]; 以 [1,2,3,0,2] 为例,dp数组如下: -![309.最佳买卖股票时机含冷冻期](https://code-thinking-1253855093.file.myqcloud.com/pics/2021032317451040.png) +![309.最佳买卖股票时机含冷冻期](https://file.kamacoder.com/pics/2021032317451040.png) 最后结果是取 状态二,状态三,和状态四的最大值,不少同学会把状态四忘了,状态四是冷冻期,最后一天如果是冷冻期也可能是最大值。 diff --git "a/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" "b/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" index dea77a3d10..7f3bc1e4b1 100644 --- "a/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" +++ "b/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" @@ -104,7 +104,7 @@ dp[0] = 0; 以输入:coins = [1, 2, 5], amount = 5为例 -![322.零钱兑换](https://code-thinking-1253855093.file.myqcloud.com/pics/20210201111833906.jpg) +![322.零钱兑换](https://file.kamacoder.com/pics/20210201111833906.jpg) dp[amount]为最终结果。 diff --git "a/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" "b/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" index f1df25229d..fcdb6a33ed 100644 --- "a/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" +++ "b/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" @@ -57,7 +57,7 @@ 对于死循环,我来举一个有重复机场的例子: -![332.重新安排行程](https://code-thinking-1253855093.file.myqcloud.com/pics/20201115180537865.png) +![332.重新安排行程](https://file.kamacoder.com/pics/20201115180537865.png) 为什么要举这个例子呢,就是告诉大家,出发机场和到达机场也会重复的,**如果在解题的过程中没有对集合元素处理好,就会死循环。** @@ -111,7 +111,7 @@ void backtracking(参数) { 本题以输入:[["JFK", "KUL"], ["JFK", "NRT"], ["NRT", "JFK"]为例,抽象为树形结构如下: -![332.重新安排行程1](https://code-thinking-1253855093.file.myqcloud.com/pics/2020111518065555-20230310121223600.png) +![332.重新安排行程1](https://file.kamacoder.com/pics/2020111518065555-20230310121223600.png) 开始回溯三部曲讲解: @@ -137,7 +137,7 @@ bool backtracking(int ticketNum, vector& result) { 因为我们只需要找到一个行程,就是在树形结构中唯一的一条通向叶子节点的路线,如图: -![332.重新安排行程1](https://code-thinking-1253855093.file.myqcloud.com/pics/2020111518065555-20230310121240991.png) +![332.重新安排行程1](https://file.kamacoder.com/pics/2020111518065555-20230310121240991.png) 所以找到了这个叶子节点了直接返回,这个递归函数的返回值问题我们在讲解二叉树的系列的时候,在这篇[二叉树:递归函数究竟什么时候需要返回值,什么时候不要返回值?](https://programmercarl.com/0112.路径总和.html)详细介绍过。 diff --git "a/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" "b/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" index 08728e4faf..4916af4c26 100644 --- "a/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" +++ "b/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" @@ -12,7 +12,7 @@ 计算在不触动警报的情况下,小偷一晚能够盗取的最高金额。 -![337.打家劫舍III](https://code-thinking-1253855093.file.myqcloud.com/pics/20210223173849619.png) +![337.打家劫舍III](https://file.kamacoder.com/pics/20210223173849619.png) ## 算法公开课 @@ -177,7 +177,7 @@ return {val2, val1}; 以示例1为例,dp数组状态如下:(**注意用后序遍历的方式推导**) -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20230203110031.png) +![](https://file.kamacoder.com/pics/20230203110031.png) **最后头结点就是 取下标0 和 下标1的最大值就是偷得的最大金钱**。 diff --git "a/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" "b/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" index 06549185a3..203c422879 100644 --- "a/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" +++ "b/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" @@ -127,7 +127,7 @@ for (int i = 3; i <= n ; i++) { 举例当n为10 的时候,dp数组里的数值,如下: -![343.整数拆分](https://code-thinking-1253855093.file.myqcloud.com/pics/20210104173021581.png) +![343.整数拆分](https://file.kamacoder.com/pics/20210104173021581.png) 以上动规五部曲分析完毕,C++代码如下: diff --git "a/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" "b/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" index 5066bff1b9..65d22a809c 100644 --- "a/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" +++ "b/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" @@ -14,7 +14,7 @@ 题意:给定两个数组,编写一个函数来计算它们的交集。 -![349. 两个数组的交集](https://code-thinking-1253855093.file.myqcloud.com/pics/20200818193523911.png) +![349. 两个数组的交集](https://file.kamacoder.com/pics/20200818193523911.png) **说明:** 输出结果中的每个元素一定是唯一的。 @@ -51,7 +51,7 @@ std::set和std::multiset底层实现都是红黑树,std::unordered_set的底 思路如图所示: -![set哈希法](https://code-thinking-1253855093.file.myqcloud.com/pics/20220707173513.png) +![set哈希法](https://file.kamacoder.com/pics/20220707173513.png) C++代码如下: diff --git "a/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" "b/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" index 886d86aefe..50934981a6 100644 --- "a/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" +++ "b/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" @@ -46,7 +46,7 @@ 用示例二来举例,如图所示: -![376.摆动序列](https://code-thinking-1253855093.file.myqcloud.com/pics/20201124174327597.png) +![376.摆动序列](https://file.kamacoder.com/pics/20201124174327597.png) **局部最优:删除单调坡度上的节点(不包括单调坡度两端的节点),那么这个坡度就可以有两个局部峰值**。 @@ -72,13 +72,13 @@ 例如 [1,2,2,2,2,1]这样的数组,如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20230106170449.png) +![](https://file.kamacoder.com/pics/20230106170449.png) 它的摇摆序列长度是多少呢? **其实是长度是 3**,也就是我们在删除的时候 要不删除左面的三个 2,要不就删除右边的三个 2。 如图,可以统一规则,删除左边的三个 2: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20230106172613.png) +![](https://file.kamacoder.com/pics/20230106172613.png) 在图中,当 i 指向第一个 2 的时候,`prediff > 0 && curdiff = 0` ,当 i 指向最后一个 2 的时候 `prediff = 0 && curdiff < 0`。 @@ -106,7 +106,7 @@ 那么为了规则统一,针对序列[2,5],可以假设为[2,2,5],这样它就有坡度了即 preDiff = 0,如图: -![376.摆动序列1](https://code-thinking-1253855093.file.myqcloud.com/pics/20201124174357612.png) +![376.摆动序列1](https://file.kamacoder.com/pics/20201124174357612.png) 针对以上情形,result 初始为 1(默认最右面有一个峰值),此时 curDiff > 0 && preDiff <= 0,那么 result++(计算了左面的峰值),最后得到的 result 就是 2(峰值个数为 2 即摆动序列长度为 2) @@ -145,7 +145,7 @@ public: 在版本一中,我们忽略了一种情况,即 如果在一个单调坡度上有平坡,例如[1,2,2,2,3,4],如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20230108171505.png) +![](https://file.kamacoder.com/pics/20230108171505.png) 图中,我们可以看出,版本一的代码在三个地方记录峰值,但其实结果因为是 2,因为 单调中的平坡 不能算峰值(即摆动)。 @@ -184,7 +184,7 @@ public: **本题异常情况的本质,就是要考虑平坡**, 平坡分两种,一个是 上下中间有平坡,一个是单调有平坡,如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20230108174452.png) +![](https://file.kamacoder.com/pics/20230108174452.png) ### 思路 2(动态规划) diff --git "a/problems/0377.\347\273\204\345\220\210\346\200\273\345\222\214\342\205\243.md" "b/problems/0377.\347\273\204\345\220\210\346\200\273\345\222\214\342\205\243.md" index d2feb0c5d6..20a94331c4 100644 --- "a/problems/0377.\347\273\204\345\220\210\346\200\273\345\222\214\342\205\243.md" +++ "b/problems/0377.\347\273\204\345\220\210\346\200\273\345\222\214\342\205\243.md" @@ -103,7 +103,7 @@ dp[i](考虑nums[j])可以由 dp[i - nums[j]](不考虑nums[j]) 推导 我们再来用示例中的例子推导一下: -![377.组合总和Ⅳ](https://code-thinking-1253855093.file.myqcloud.com/pics/20230310000625.png) +![377.组合总和Ⅳ](https://file.kamacoder.com/pics/20230310000625.png) 如果代码运行处的结果不是想要的结果,就把dp[i]都打出来,看看和我们推导的一不一样。 diff --git "a/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" "b/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" index 2a5be51c59..d59b7bc121 100644 --- "a/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" @@ -80,7 +80,7 @@ if (s[i - 1] != t[j - 1]),此时相当于t要删除元素,t如果把当前 因为这样的定义在dp二维矩阵中可以留出初始化的区间,如图: -![392.判断子序列](https://code-thinking-1253855093.file.myqcloud.com/pics/20210303173115966.png) +![392.判断子序列](https://file.kamacoder.com/pics/20210303173115966.png) 如果要是定义的dp[i][j]是以下标i为结尾的字符串s和以下标j为结尾的字符串t,初始化就比较麻烦了。 @@ -98,14 +98,14 @@ vector> dp(s.size() + 1, vector(t.size() + 1, 0)); 如图所示: -![392.判断子序列1](https://code-thinking-1253855093.file.myqcloud.com/pics/20210303172354155.jpg) +![392.判断子序列1](https://file.kamacoder.com/pics/20210303172354155.jpg) 5. 举例推导dp数组 以示例一为例,输入:s = "abc", t = "ahbgdc",dp状态转移图如下: -![392.判断子序列2](https://code-thinking-1253855093.file.myqcloud.com/pics/2021030317364166.jpg) +![392.判断子序列2](https://file.kamacoder.com/pics/2021030317364166.jpg) dp[i][j]表示以下标i-1为结尾的字符串s和以下标j-1为结尾的字符串t 相同子序列的长度,所以如果dp[s.size()][t.size()] 与 字符串s的长度相同说明:s与t的最长相同子序列就是s,那么s 就是 t 的子序列。 diff --git "a/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" "b/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" index 0efdb6f663..69723815a1 100644 --- "a/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" +++ "b/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" @@ -12,7 +12,7 @@ 示例: -![404.左叶子之和1](https://code-thinking-1253855093.file.myqcloud.com/pics/20210204151927654.png) +![404.左叶子之和1](https://file.kamacoder.com/pics/20210204151927654.png) ## 算法公开课 @@ -26,12 +26,12 @@ 大家思考一下如下图中二叉树,左叶子之和究竟是多少? -![404.左叶子之和](https://code-thinking-1253855093.file.myqcloud.com/pics/20210204151949672.png) +![404.左叶子之和](https://file.kamacoder.com/pics/20210204151949672.png) **其实是0,因为这棵树根本没有左叶子!** 但看这个图的左叶子之和是多少? -![图二](https://code-thinking-1253855093.file.myqcloud.com/pics/20220902165805.png) +![图二](https://file.kamacoder.com/pics/20220902165805.png) 相信通过这两个图,大家对最左叶子的定义有明确理解了。 diff --git "a/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" "b/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" index 11853e1170..0d060ee837 100644 --- "a/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" +++ "b/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" @@ -61,7 +61,7 @@ 以图中{5,2} 为例: -![406.根据身高重建队列](https://code-thinking-1253855093.file.myqcloud.com/pics/20201216201851982.png) +![406.根据身高重建队列](https://file.kamacoder.com/pics/20201216201851982.png) 按照身高排序之后,优先按身高高的people的k来插入,后序插入节点也不会影响前面已经插入的节点,最终按照k的规则完成了队列。 diff --git "a/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" "b/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" index 9cc6db0e4b..79b4d4f75a 100644 --- "a/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" +++ "b/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" @@ -155,7 +155,7 @@ dp[j]的数值一定是小于等于j的。 用例1,输入[1,5,11,5] 为例,如图: -![416.分割等和子集2](https://code-thinking-1253855093.file.myqcloud.com/pics/20210110104240545.png) +![416.分割等和子集2](https://file.kamacoder.com/pics/20210110104240545.png) 最后dp[11] == 11,说明可以将这个数组分割成两个子集,使得两个子集的元素和相等。 diff --git "a/problems/0417.\345\244\252\345\271\263\346\264\213\345\244\247\350\245\277\346\264\213\346\260\264\346\265\201\351\227\256\351\242\230.md" "b/problems/0417.\345\244\252\345\271\263\346\264\213\345\244\247\350\245\277\346\264\213\346\260\264\346\265\201\351\227\256\351\242\230.md" index ec87eb9595..116cd08e09 100644 --- "a/problems/0417.\345\244\252\345\271\263\346\264\213\345\244\247\350\245\277\346\264\213\346\260\264\346\265\201\351\227\256\351\242\230.md" +++ "b/problems/0417.\345\244\252\345\271\263\346\264\213\345\244\247\350\245\277\346\264\213\346\260\264\346\265\201\351\227\256\351\242\230.md" @@ -18,7 +18,7 @@ 示例 1: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20230129103212.png) +![](https://file.kamacoder.com/pics/20230129103212.png) * 输入: heights = [[1,2,2,3,5],[3,2,3,4,4],[2,4,5,3,1],[6,7,1,4,5],[5,1,1,2,4]] * 输出: [[0,4],[1,3],[1,4],[2,2],[3,0],[3,1],[4,0]] @@ -130,11 +130,11 @@ public: 从太平洋边上节点出发,如图: -![图一](https://code-thinking-1253855093.file.myqcloud.com/pics/20220722103029.png) +![图一](https://file.kamacoder.com/pics/20220722103029.png) 从大西洋边上节点出发,如图: -![图二](https://code-thinking-1253855093.file.myqcloud.com/pics/20220722103330.png) +![图二](https://file.kamacoder.com/pics/20220722103330.png) 按照这样的逻辑,就可以写出如下遍历代码:(详细注释) diff --git "a/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" "b/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" index a37d1cadac..04845ea7c3 100644 --- "a/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" +++ "b/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" @@ -44,7 +44,7 @@ 这里记录非交叉区间的个数还是有技巧的,如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20230201164134.png) +![](https://file.kamacoder.com/pics/20230201164134.png) 区间,1,2,3,4,5,6都按照右边界排好序。 diff --git "a/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" "b/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" index 7280918460..406116a388 100644 --- "a/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" +++ "b/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" @@ -20,7 +20,7 @@ 示例: -![450.删除二叉搜索树中的节点](https://code-thinking-1253855093.file.myqcloud.com/pics/20201020171048265.png) +![450.删除二叉搜索树中的节点](https://file.kamacoder.com/pics/20201020171048265.png) ## 算法公开课 diff --git "a/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" "b/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" index 854498829b..17d21cd1c4 100644 --- "a/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" +++ "b/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" @@ -76,7 +76,7 @@ 以题目示例: [[10,16],[2,8],[1,6],[7,12]]为例,如图:(方便起见,已经排序) -![452.用最少数量的箭引爆气球](https://code-thinking-1253855093.file.myqcloud.com/pics/20201123101929791.png) +![452.用最少数量的箭引爆气球](https://file.kamacoder.com/pics/20201123101929791.png) 可以看出首先第一组重叠气球,一定是需要一个箭,气球3,的左边界大于了 第一组重叠气球的最小右边界,所以再需要一支箭来射气球3了。 diff --git "a/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" "b/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" index a2a1b1f339..2a6ade1b64 100644 --- "a/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" +++ "b/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" @@ -46,7 +46,7 @@ 如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20230405225628.png) +![](https://file.kamacoder.com/pics/20230405225628.png) 这个例子可以看出饼干 9 只有喂给胃口为 7 的小孩,这样才是整体最优解,并想不出反例,那么就可以撸代码了。 @@ -89,7 +89,7 @@ public: 如果 for 控制的是饼干, if 控制胃口,就是出现如下情况 : -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20230112102848.png) +![](https://file.kamacoder.com/pics/20230112102848.png) if 里的 index 指向 胃口 10, for 里的 i 指向饼干 9,因为 饼干 9 满足不了 胃口 10,所以 i 持续向前移动,而 index 走不到` s[index] >= g[i]` 的逻辑,所以 index 不会移动,那么当 i 持续向前移动,最后所有的饼干都匹配不上。 diff --git "a/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" "b/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" index 78aad3e786..627a27a48e 100644 --- "a/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" @@ -46,13 +46,13 @@ 当一个字符串s:abcabc,内部由重复的子串组成,那么这个字符串的结构一定是这样的: -![图一](https://code-thinking-1253855093.file.myqcloud.com/pics/20220728104518.png) +![图一](https://file.kamacoder.com/pics/20220728104518.png) 也就是由前后相同的子串组成。 那么既然前面有相同的子串,后面有相同的子串,用 s + s,这样组成的字符串中,后面的子串做前串,前面的子串做后串,就一定还能组成一个s,如图: -![图二](https://code-thinking-1253855093.file.myqcloud.com/pics/20220728104931.png) +![图二](https://file.kamacoder.com/pics/20220728104931.png) 当然,我们在判断 s + s 拼接的字符串里是否出现一个s的的时候,**要刨除 s + s 的首字符和尾字符**,这样避免在s+s中搜索出原来的s,我们要搜索的是中间拼接出来的s。 @@ -64,11 +64,11 @@ 如图,字符串s,图中数字为数组下标,在 s + s 拼接后, 不算首尾字符,中间凑成s字符串。 (图中数字为数组下标) -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240910115555.png) +![](https://file.kamacoder.com/pics/20240910115555.png) 图中,因为中间拼接成了s,根据红色框 可以知道 s[4] = s[0], s[5] = s[1], s[0] = s[2], s[1] = s[3] s[2] = s[4] ,s[3] = s[5] -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240910115819.png) +![](https://file.kamacoder.com/pics/20240910115819.png) 以上相等关系我们串联一下: @@ -83,7 +83,7 @@ s[5] = s[1] = s[3] 这里可以有录友想,凭什么就是这样组成的s呢,我换一个方式组成s 行不行,如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240910120751.png) +![](https://file.kamacoder.com/pics/20240910120751.png) s[3] = s[0],s[4] = s[1] ,s[5] = s[2],s[0] = s[3],s[1] = s[4],s[2] = s[5] @@ -101,7 +101,7 @@ s[0] s[1] s[2] = s[3] s[4] s[5] 如果是这样的呢,如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240910121236.png) +![](https://file.kamacoder.com/pics/20240910121236.png) s[1] = s[0],s[2] = s[1] ,s[3] = s[2],s[4] = s[3],s[5] = s[4],s[0] = s[5] @@ -165,23 +165,23 @@ KMP算法中next数组为什么遇到字符不匹配的时候可以找到上一 那么相同前后缀可以是这样: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240913110257.png) +![](https://file.kamacoder.com/pics/20240913110257.png) 也可以是这样: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240913110316.png) +![](https://file.kamacoder.com/pics/20240913110316.png) 最长的相等前后缀,也就是这样: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240913110841.png) +![](https://file.kamacoder.com/pics/20240913110841.png) 这里有录友就想:如果字符串s 是由最小重复子串p组成,最长相等前后缀就不能更长一些? 例如这样: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240913114348.png) +![](https://file.kamacoder.com/pics/20240913114348.png) 如果这样的话,因为前后缀要相同,所以 p2 = p1,p3 = p2,如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240913114818.png) +![](https://file.kamacoder.com/pics/20240913114818.png) p2 = p1,p3 = p2 即: p1 = p2 = p3 @@ -203,7 +203,7 @@ p2 = p1,p3 = p2 即: p1 = p2 = p3 情况一, 最长相等前后缀不包含的子串的长度 比 字符串s的一半的长度还大,那一定不是字符串s的重复子串,如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240911110236.png) +![](https://file.kamacoder.com/pics/20240911110236.png) 图中:前后缀不包含的子串的长度 大于 字符串s的长度的 二分之一 @@ -211,7 +211,7 @@ p2 = p1,p3 = p2 即: p1 = p2 = p3 情况二,最长相等前后缀不包含的子串的长度 可以被 字符串s的长度整除,如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240910174249.png) +![](https://file.kamacoder.com/pics/20240910174249.png) 步骤一:因为 这是相等的前缀和后缀,t[0] 与 k[0]相同, t[1] 与 k[1]相同,所以 s[0] 一定和 s[2]相同,s[1] 一定和 s[3]相同,即:,s[0]s[1]与s[2]s[3]相同 。 @@ -234,7 +234,7 @@ p2 = p1,p3 = p2 即: p1 = p2 = p3 那么它的最长相同前后缀,就不是上图中的前后缀,而是这样的的前后缀: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240910175053.png) +![](https://file.kamacoder.com/pics/20240910175053.png) 录友可能再问,由一个字符组成的字符串,最长相等前后缀凭什么就是这样的。 @@ -250,7 +250,7 @@ p2 = p1,p3 = p2 即: p1 = p2 = p3 **情况三,最长相等前后缀不包含的子串的长度 不被 字符串s的长度整除得情况**,如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240913115854.png) +![](https://file.kamacoder.com/pics/20240913115854.png) 步骤一:因为 这是相等的前缀和后缀,t[0] 与 k[0]相同, t[1] 与 k[1]相同,t[2] 与 k[2]相同。 diff --git "a/problems/0463.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" "b/problems/0463.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" index bff619ccde..40ddc57d63 100644 --- "a/problems/0463.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" +++ "b/problems/0463.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" @@ -15,7 +15,7 @@ 岛屿中没有“湖”(“湖” 指水域在岛屿内部且不和岛屿周围的水相连)。格子是边长为 1 的正方形。网格为长方形,且宽度和高度均不超过 100 。计算这个岛屿的周长。 -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20230829180848.png) +![](https://file.kamacoder.com/pics/20230829180848.png) * 输入:grid = [[0,1,0,0],[1,1,1,0],[0,1,0,0],[1,1,0,0]] * 输出:16 diff --git "a/problems/0474.\344\270\200\345\222\214\351\233\266.md" "b/problems/0474.\344\270\200\345\222\214\351\233\266.md" index ca525ab2e3..8166b39aad 100644 --- "a/problems/0474.\344\270\200\345\222\214\351\233\266.md" +++ "b/problems/0474.\344\270\200\345\222\214\351\233\266.md" @@ -51,7 +51,7 @@ 其实本题并不是多重背包,再来看一下这个图,捋清几种背包的关系 -![416.分割等和子集1](https://code-thinking-1253855093.file.myqcloud.com/pics/20210117171307407-20230310132423205.png) +![416.分割等和子集1](https://file.kamacoder.com/pics/20210117171307407-20230310132423205.png) 多重背包是每个物品,数量不同的情况。 @@ -127,7 +127,7 @@ for (string str : strs) { // 遍历物品 最后dp数组的状态如下所示: -![474.一和零](https://code-thinking-1253855093.file.myqcloud.com/pics/20210120111201512.jpg) +![474.一和零](https://file.kamacoder.com/pics/20210120111201512.jpg) 以上动规五部曲分析完毕,C++代码如下: diff --git "a/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" "b/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" index 1b927dd3d2..b3171c8a12 100644 --- "a/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" @@ -45,7 +45,7 @@ 为了有鲜明的对比,我用[4, 7, 6, 7]这个数组来举例,抽象为树形结构如图: -![491. 递增子序列1](https://code-thinking-1253855093.file.myqcloud.com/pics/20201124200229824.png) +![491. 递增子序列1](https://file.kamacoder.com/pics/20201124200229824.png) @@ -79,7 +79,7 @@ if (path.size() > 1) { * 单层搜索逻辑 -![491. 递增子序列1](https://code-thinking-1253855093.file.myqcloud.com/pics/20201124200229824-20230310131640070.png) +![491. 递增子序列1](https://file.kamacoder.com/pics/20201124200229824-20230310131640070.png) 在图中可以看出,**同一父节点下的同层上使用过的元素就不能再使用了** 那么单层搜索代码如下: diff --git "a/problems/0494.\347\233\256\346\240\207\345\222\214.md" "b/problems/0494.\347\233\256\346\240\207\345\222\214.md" index bde843ead3..a23e1743cb 100644 --- "a/problems/0494.\347\233\256\346\240\207\345\222\214.md" +++ "b/problems/0494.\347\233\256\346\240\207\345\222\214.md" @@ -163,7 +163,7 @@ if (abs(target) > sum) return 0; // 此时没有方案 先只考虑物品0,如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240808161747.png) +![](https://file.kamacoder.com/pics/20240808161747.png) (这里的所有物品,都是题目中的数字1)。 @@ -177,7 +177,7 @@ if (abs(target) > sum) return 0; // 此时没有方案 接下来 考虑 物品0 和 物品1,如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240808162052.png) +![](https://file.kamacoder.com/pics/20240808162052.png) 装满背包容量为0 的方法个数是1,即 放0件物品。 @@ -191,7 +191,7 @@ if (abs(target) > sum) return 0; // 此时没有方案 接下来 考虑 物品0 、物品1 和 物品2 ,如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240808162533.png) +![](https://file.kamacoder.com/pics/20240808162533.png) 装满背包容量为0 的方法个数是1,即 放0件物品。 @@ -207,17 +207,17 @@ if (abs(target) > sum) return 0; // 此时没有方案 如图红色部分: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240808163312.png) +![](https://file.kamacoder.com/pics/20240808163312.png) dp[2][2] = 3,即 放物品0 和 放物品1、放物品0 和 物品 2、放物品1 和 物品2, 如图所示,三种方法: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240826111946.png) +![](https://file.kamacoder.com/pics/20240826111946.png) **容量为2 的背包,如果不放 物品2 有几种方法呢**? 有 dp[1][2] 种方法,即 背包容量为2,只考虑物品0 和 物品1 ,有 dp[1][2] 种方法,如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240826112805.png) +![](https://file.kamacoder.com/pics/20240826112805.png) **容量为2 的背包, 如果放 物品2 有几种方法呢**? @@ -229,7 +229,7 @@ dp[2][2] = 3,即 放物品0 和 放物品1、放物品0 和 物品 2、放物 如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240826113043.png) +![](https://file.kamacoder.com/pics/20240826113043.png) 有录友可能疑惑,这里计算的是放满 容量为2的背包 有几种方法,那物品2去哪了? @@ -239,7 +239,7 @@ dp[2][2] = 容量为2的背包不放物品2有几种方法 + 容量为2的背包 所以 dp[2][2] = dp[1][2] + dp[1][1] ,如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240826113258.png) +![](https://file.kamacoder.com/pics/20240826113258.png) 以上过程,抽象化如下: @@ -266,11 +266,11 @@ else dp[i][j] = dp[i - 1][j] + dp[i - 1][j - nums[i]]; 先明确递推的方向,如图,求解 dp[2][2] 是由 上方和左上方推出。 -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240826115800.png) +![](https://file.kamacoder.com/pics/20240826115800.png) 那么二维数组的最上行 和 最左列一定要初始化,这是递推公式推导的基础,如图红色部分: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240827103507.png) +![](https://file.kamacoder.com/pics/20240827103507.png) 关于dp[0][0]的值,在上面的递推公式讲解中已经讲过,装满背包容量为0 的方法数量是1,即 放0件物品。 @@ -323,7 +323,7 @@ for (int i = 0; i < nums.size(); i++) { 例如下图,如果上方没数值,左上方没数值,就无法推出 dp[2][2]。 -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240827105427.png) +![](https://file.kamacoder.com/pics/20240827105427.png) 那么是先 从上到下 ,再从左到右遍历,例如这样: @@ -349,11 +349,11 @@ for (int j = 0; j <= bagSize; j++) { // 列,遍历背包 这里我再画图讲一下,以求dp[2][2]为例,当先从上到下,再从左到右遍历,矩阵是这样: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240827110933.png) +![](https://file.kamacoder.com/pics/20240827110933.png) 当先从左到右,再从上到下遍历,矩阵是这样: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240827111013.png) +![](https://file.kamacoder.com/pics/20240827111013.png) 这里大家可以看出,无论是以上哪种遍历,都不影响 dp[2][2]的求值,用来 推导 dp[2][2] 的数值都在。 @@ -366,7 +366,7 @@ bagSize = (target + sum) / 2 = (3 + 5) / 2 = 4 dp数组状态变化如下: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240827111612.png) +![](https://file.kamacoder.com/pics/20240827111612.png) 这么大的矩阵,我们是可以自己手动模拟出来的。 @@ -445,7 +445,7 @@ bagSize = (target + sum) / 2 = (3 + 5) / 2 = 4 dp数组状态变化如下: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210125120743274.jpg) +![](https://file.kamacoder.com/pics/20210125120743274.jpg) 大家可以和 二维dp数组的打印结果做一下对比。 diff --git "a/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" "b/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" index 32a89e859a..8cca8e65c8 100644 --- "a/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" +++ "b/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" @@ -23,7 +23,7 @@ 给定 BST [1,null,2,2], -![501. 二叉搜索树中的众数](https://code-thinking-1253855093.file.myqcloud.com/pics/20201014221532206.png) +![501. 二叉搜索树中的众数](https://file.kamacoder.com/pics/20201014221532206.png) 返回[2]. @@ -144,7 +144,7 @@ public: 如图: -![501.二叉搜索树中的众数1](https://code-thinking-1253855093.file.myqcloud.com/pics/20210204152758889.png) +![501.二叉搜索树中的众数1](https://file.kamacoder.com/pics/20210204152758889.png) 中序遍历代码如下: diff --git "a/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" "b/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" index da37360374..4098cb7bfb 100644 --- "a/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" +++ "b/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" @@ -12,11 +12,11 @@ 示例 1: -![513.找树左下角的值](https://code-thinking-1253855093.file.myqcloud.com/pics/20210204152956836.png) +![513.找树左下角的值](https://file.kamacoder.com/pics/20210204152956836.png) 示例 2: -![513.找树左下角的值1](https://code-thinking-1253855093.file.myqcloud.com/pics/20210204153017586.png) +![513.找树左下角的值1](https://file.kamacoder.com/pics/20210204153017586.png) ## 算法公开课 diff --git "a/problems/0516.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\345\272\217\345\210\227.md" "b/problems/0516.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\345\272\217\345\210\227.md" index f0ef2f53d0..5e456ac975 100644 --- "a/problems/0516.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0516.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\345\272\217\345\210\227.md" @@ -56,7 +56,7 @@ 如果s[i]与s[j]相同,那么dp[i][j] = dp[i + 1][j - 1] + 2; 如图: -![516.最长回文子序列](https://code-thinking-1253855093.file.myqcloud.com/pics/20210127151350563.jpg) +![516.最长回文子序列](https://file.kamacoder.com/pics/20210127151350563.jpg) (如果这里看不懂,回忆一下dp[i][j]的定义) @@ -68,7 +68,7 @@ 那么dp[i][j]一定是取最大的,即:dp[i][j] = max(dp[i + 1][j], dp[i][j - 1]); -![516.最长回文子序列1](https://code-thinking-1253855093.file.myqcloud.com/pics/20210127151420476.jpg) +![516.最长回文子序列1](https://file.kamacoder.com/pics/20210127151420476.jpg) 代码如下: @@ -97,7 +97,7 @@ for (int i = 0; i < s.size(); i++) dp[i][i] = 1; 从递归公式中,可以看出,dp[i][j] 依赖于 dp[i + 1][j - 1] ,dp[i + 1][j] 和 dp[i][j - 1],如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20230102172155.png) +![](https://file.kamacoder.com/pics/20230102172155.png) **所以遍历i的时候一定要从下到上遍历,这样才能保证下一行的数据是经过计算的**。 @@ -121,7 +121,7 @@ for (int i = s.size() - 1; i >= 0; i--) { 输入s:"cbbd" 为例,dp数组状态如图: -![516.最长回文子序列3](https://code-thinking-1253855093.file.myqcloud.com/pics/20210127151521432.jpg) +![516.最长回文子序列3](https://file.kamacoder.com/pics/20210127151521432.jpg) 红色框即:dp[0][s.size() - 1]; 为最终结果。 diff --git "a/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" "b/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" index 1698db9887..95122a7c95 100644 --- "a/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" +++ "b/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" @@ -136,7 +136,7 @@ 那么二维数组的最上行 和 最左列一定要初始化,这是递推公式推导的基础,如图红色部分: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240827103507.png) +![](https://file.kamacoder.com/pics/20240827103507.png) 这里首先要关注的就是 dp[0][0] 应该是多少? @@ -296,7 +296,7 @@ for (int j = 0; j <= amount; j++) { // 遍历背包容量 输入: amount = 5, coins = [1, 2, 5] ,dp状态图如下: -![518.零钱兑换II](https://code-thinking-1253855093.file.myqcloud.com/pics/20210120181331461.jpg) +![518.零钱兑换II](https://file.kamacoder.com/pics/20210120181331461.jpg) 最后红色框dp[amount]为最终结果。 diff --git "a/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" "b/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" index d7b0e056db..466bd74479 100644 --- "a/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" +++ "b/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" @@ -13,7 +13,7 @@ 示例: -![530二叉搜索树的最小绝对差](https://code-thinking-1253855093.file.myqcloud.com/pics/20201014223400123.png) +![530二叉搜索树的最小绝对差](https://file.kamacoder.com/pics/20201014223400123.png) 提示:树中至少有 2 个节点。 @@ -70,7 +70,7 @@ public: 如图: -![530.二叉搜索树的最小绝对差](https://code-thinking-1253855093.file.myqcloud.com/pics/20210204153247458.png) +![530.二叉搜索树的最小绝对差](https://file.kamacoder.com/pics/20210204153247458.png) 一些同学不知道在递归中如何记录前一个节点的指针,其实实现起来是很简单的,大家只要看过一次,写过一次,就掌握了。 diff --git "a/problems/0538.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md" "b/problems/0538.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md" index 1bbbdac76d..45bf1f96ed 100644 --- "a/problems/0538.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md" +++ "b/problems/0538.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md" @@ -18,7 +18,7 @@ 示例 1: -![538.把二叉搜索树转换为累加树](https://code-thinking-1253855093.file.myqcloud.com/pics/20201023160751832.png) +![538.把二叉搜索树转换为累加树](https://file.kamacoder.com/pics/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] @@ -67,7 +67,7 @@ 遍历顺序如图所示: -![538.把二叉搜索树转换为累加树](https://code-thinking-1253855093.file.myqcloud.com/pics/20210204153440666.png) +![538.把二叉搜索树转换为累加树](https://file.kamacoder.com/pics/20210204153440666.png) 本题依然需要一个pre指针记录当前遍历节点cur的前一个节点,这样才方便做累加。 diff --git "a/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" "b/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" index a86dfad195..7f7d30f6a1 100644 --- "a/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" +++ "b/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" @@ -81,7 +81,7 @@ for (int j = 0; j <= word2.size(); j++) dp[0][j] = j; 以word1:"sea",word2:"eat"为例,推导dp数组状态图如下: -![583.两个字符串的删除操作1](https://code-thinking-1253855093.file.myqcloud.com/pics/20210714101750205.png) +![583.两个字符串的删除操作1](https://file.kamacoder.com/pics/20210714101750205.png) 以上分析完毕,代码如下: diff --git "a/problems/0617.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md" "b/problems/0617.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md" index f180c4f3b9..755200fe82 100644 --- "a/problems/0617.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0617.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md" @@ -13,7 +13,7 @@ 示例 1: -![617.合并二叉树](https://code-thinking-1253855093.file.myqcloud.com/pics/20230310000854.png) +![617.合并二叉树](https://file.kamacoder.com/pics/20230310000854.png) 注意: 合并必须从两个树的根节点开始。 diff --git "a/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" "b/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" index e2783027aa..7282953570 100644 --- "a/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" +++ "b/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" @@ -48,7 +48,7 @@ dp[i] 和 dp[i-1] ,dp[i + 1] 看上去都没啥关系。 所以我们要看回文串的性质。 如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20230102170752.png) +![](https://file.kamacoder.com/pics/20230102170752.png) 我们在判断字符串S是否是回文,那么如果我们知道 s[1],s[2],s[3] 这个子串是回文的,那么只需要比较 s[0]和s[4]这两个元素是否相同,如果相同的话,这个字符串s 就是回文串。 @@ -106,7 +106,7 @@ dp[i][j]可以初始化为true么? 当然不行,怎能刚开始就全都匹 dp[i + 1][j - 1] 在 dp[i][j]的左下角,如图: -![647.回文子串](https://code-thinking-1253855093.file.myqcloud.com/pics/20210121171032473-20230310132134822.jpg) +![647.回文子串](https://file.kamacoder.com/pics/20210121171032473-20230310132134822.jpg) 如果这矩阵是从上到下,从左到右遍历,那么会用到没有计算过的dp[i + 1][j - 1],也就是根据不确定是不是回文的区间[i+1,j-1],来判断了[i,j]是不是回文,那结果一定是不对的。 @@ -136,7 +136,7 @@ for (int i = s.size() - 1; i >= 0; i--) { // 注意遍历顺序 举例,输入:"aaa",dp[i][j]状态如下: -![647.回文子串1](https://code-thinking-1253855093.file.myqcloud.com/pics/20210121171059951-20230310132153163.jpg) +![647.回文子串1](https://file.kamacoder.com/pics/20210121171059951-20230310132153163.jpg) 图中有6个true,所以就是有6个回文子串。 diff --git "a/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" "b/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" index 9f897a7502..b8841a8bea 100644 --- "a/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" @@ -17,7 +17,7 @@ 示例 : -![654.最大二叉树](https://code-thinking-1253855093.file.myqcloud.com/pics/20210204154534796.png) +![654.最大二叉树](https://file.kamacoder.com/pics/20210204154534796.png) 提示: diff --git "a/problems/0669.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0669.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" index 0a05360bf1..f4ded2c4fb 100644 --- "a/problems/0669.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" +++ "b/problems/0669.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" @@ -14,9 +14,9 @@ 给定一个二叉搜索树,同时给定最小边界L 和最大边界 R。通过修剪二叉搜索树,使得所有节点的值在[L, R]中 (R>=L) 。你可能需要改变树的根节点,所以结果应当返回修剪好的二叉搜索树的新的根节点。 -![669.修剪二叉搜索树](https://code-thinking-1253855093.file.myqcloud.com/pics/20201014173115788.png) +![669.修剪二叉搜索树](https://file.kamacoder.com/pics/20201014173115788.png) -![669.修剪二叉搜索树1](https://code-thinking-1253855093.file.myqcloud.com/pics/20201014173219142.png) +![669.修剪二叉搜索树1](https://file.kamacoder.com/pics/20201014173219142.png) ## 算法公开课 @@ -50,7 +50,7 @@ public: 我们在重新关注一下第二个示例,如图: -![669.修剪二叉搜索树](https://code-thinking-1253855093.file.myqcloud.com/pics/20210204155302751.png) +![669.修剪二叉搜索树](https://file.kamacoder.com/pics/20210204155302751.png) **所以以上的代码是不可行的!** @@ -60,7 +60,7 @@ public: 在上图中我们发现节点0并不符合区间要求,那么将节点0的右孩子 节点2 直接赋给 节点3的左孩子就可以了(就是把节点0从二叉树中移除),如图: -![669.修剪二叉搜索树1](https://code-thinking-1253855093.file.myqcloud.com/pics/20210204155327203.png) +![669.修剪二叉搜索树1](https://file.kamacoder.com/pics/20210204155327203.png) 理解了最关键部分了我们再递归三部曲: @@ -127,7 +127,7 @@ return root; 在回顾一下上面的代码,针对下图中二叉树的情况: -![669.修剪二叉搜索树1](https://code-thinking-1253855093.file.myqcloud.com/pics/20210204155327203-20230310120126738.png) +![669.修剪二叉搜索树1](https://file.kamacoder.com/pics/20210204155327203-20230310120126738.png) 如下代码相当于把节点0的右孩子(节点2)返回给上一层, diff --git "a/problems/0673.\346\234\200\351\225\277\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227\347\232\204\344\270\252\346\225\260.md" "b/problems/0673.\346\234\200\351\225\277\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227\347\232\204\344\270\252\346\225\260.md" index 9bfa91cc94..92009f5b76 100644 --- "a/problems/0673.\346\234\200\351\225\277\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227\347\232\204\344\270\252\346\225\260.md" +++ "b/problems/0673.\346\234\200\351\225\277\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227\347\232\204\344\270\252\346\225\260.md" @@ -178,7 +178,7 @@ for (int i = 0; i < nums.size(); i++) { 输入:[1,3,5,4,7] -![673.最长递增子序列的个数](https://code-thinking-1253855093.file.myqcloud.com/pics/20230310000656.png) +![673.最长递增子序列的个数](https://file.kamacoder.com/pics/20230310000656.png) **如果代码写出来了,怎么改都通过不了,那么把dp和count打印出来看看对不对!** diff --git "a/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" "b/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" index 2c490c0c5b..16bb2f1887 100644 --- "a/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" +++ "b/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" @@ -85,7 +85,7 @@ for (int i = 1; i < nums.size(); i++) { 已输入nums = [1,3,5,4,7]为例,dp数组状态如下: -![674.最长连续递增序列](https://code-thinking-1253855093.file.myqcloud.com/pics/20210204103529742.jpg) +![674.最长连续递增序列](https://file.kamacoder.com/pics/20210204103529742.jpg) **注意这里要取dp[i]里的最大值,所以dp[2]才是结果!** diff --git "a/problems/0684.\345\206\227\344\275\231\350\277\236\346\216\245.md" "b/problems/0684.\345\206\227\344\275\231\350\277\236\346\216\245.md" index e6d2d8e502..8a7234df52 100644 --- "a/problems/0684.\345\206\227\344\275\231\350\277\236\346\216\245.md" +++ "b/problems/0684.\345\206\227\344\275\231\350\277\236\346\216\245.md" @@ -12,7 +12,7 @@ 请找出一条可以删去的边,删除后可使得剩余部分是一个有着 n 个节点的树。如果有多个答案,则返回数组 edges 中最后出现的边。 -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210727150215.png) +![](https://file.kamacoder.com/pics/20210727150215.png) 提示: * n == edges.length @@ -85,7 +85,7 @@ void join(int u, int v) { 如图所示: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20230604104720.png) +![](https://file.kamacoder.com/pics/20230604104720.png) 节点A 和节点 B 不在同一个集合,那么就可以将两个 节点连在一起。 @@ -95,7 +95,7 @@ void join(int u, int v) { 如图所示: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20230604104330.png) +![](https://file.kamacoder.com/pics/20230604104330.png) 已经判断 节点A 和 节点B 在在同一个集合(同一个根),如果将 节点A 和 节点B 连在一起就一定会出现环。 diff --git "a/problems/0685.\345\206\227\344\275\231\350\277\236\346\216\245II.md" "b/problems/0685.\345\206\227\344\275\231\350\277\236\346\216\245II.md" index 7b0e320c6f..66f7bfe1bc 100644 --- "a/problems/0685.\345\206\227\344\275\231\350\277\236\346\216\245II.md" +++ "b/problems/0685.\345\206\227\344\275\231\350\277\236\346\216\245II.md" @@ -16,9 +16,9 @@ 返回一条能删除的边,使得剩下的图是有 n 个节点的有根树。若有多个答案,返回最后出现在给定二维数组的答案。 -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210727151057.png) +![](https://file.kamacoder.com/pics/20210727151057.png) -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210727151118.png) +![](https://file.kamacoder.com/pics/20210727151118.png) 提示: diff --git "a/problems/0695.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" "b/problems/0695.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" index 0b84e651c1..972a999591 100644 --- "a/problems/0695.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" +++ "b/problems/0695.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" @@ -14,7 +14,7 @@ 计算并返回 grid 中最大的岛屿面积。如果没有岛屿,则返回面积为 0 。 -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20220729111528.png) +![](https://file.kamacoder.com/pics/20220729111528.png) * 输入:grid = [[0,0,1,0,0,0,0,1,0,0,0,0,0],[0,0,0,0,0,0,0,1,1,1,0,0,0],[0,1,1,0,1,0,0,0,0,0,0,0,0],[0,1,0,0,1,1,0,0,1,0,1,0,0],[0,1,0,0,1,1,0,0,1,1,1,0,0],[0,0,0,0,0,0,0,0,0,0,1,0,0],[0,0,0,0,0,0,0,1,1,1,0,0,0],[0,0,0,0,0,0,0,1,1,0,0,0,0]] * 输出:6 @@ -27,7 +27,7 @@ 也就是说斜角度链接是不算了, 例如示例二,是三个岛屿,如图: -![图一](https://code-thinking-1253855093.file.myqcloud.com/pics/20220726094200.png) +![图一](https://file.kamacoder.com/pics/20220726094200.png) 这道题目也是 dfs bfs基础类题目,就是搜索每个岛屿上“1”的数量,然后取一个最大的。 diff --git "a/problems/0700.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\220\234\347\264\242.md" "b/problems/0700.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\220\234\347\264\242.md" index 4225b3fe25..0c373f615b 100644 --- "a/problems/0700.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\220\234\347\264\242.md" +++ "b/problems/0700.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\220\234\347\264\242.md" @@ -12,7 +12,7 @@ 例如, -![700.二叉搜索树中的搜索](https://code-thinking-1253855093.file.myqcloud.com/pics/20210204155522476.png) +![700.二叉搜索树中的搜索](https://file.kamacoder.com/pics/20210204155522476.png) 在上述示例中,如果要找的值是 5,但因为没有节点值为 5,我们应该返回 NULL。 @@ -124,7 +124,7 @@ public: 中间节点如果大于3就向左走,如果小于3就向右走,如图: -![二叉搜索树](https://code-thinking-1253855093.file.myqcloud.com/pics/20200812190213280.png) +![二叉搜索树](https://file.kamacoder.com/pics/20200812190213280.png) 所以迭代法代码如下: diff --git "a/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" "b/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" index ef383faa86..6ce9ef3371 100644 --- "a/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" +++ "b/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" @@ -12,7 +12,7 @@ 注意,可能存在多种有效的插入方式,只要树在插入后仍保持为二叉搜索树即可。 你可以返回任意有效的结果。 -![701.二叉搜索树中的插入操作](https://code-thinking-1253855093.file.myqcloud.com/pics/20201019173259554.png) +![701.二叉搜索树中的插入操作](https://file.kamacoder.com/pics/20201019173259554.png) 提示: diff --git "a/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" "b/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" index 405018745e..0ce2f3b8a6 100644 --- "a/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" +++ "b/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" @@ -59,7 +59,7 @@ 例如在数组:1,2,3,4,7,9,10中查找元素2,如图所示: -![704.二分查找](https://code-thinking-1253855093.file.myqcloud.com/pics/20210311153055723.jpg) +![704.二分查找](https://file.kamacoder.com/pics/20210311153055723.jpg) 代码如下:(详细注释) @@ -102,7 +102,7 @@ public: 在数组:1,2,3,4,7,9,10中查找元素2,如图所示:(**注意和方法一的区别**) -![704.二分查找1](https://code-thinking-1253855093.file.myqcloud.com/pics/20210311153123632.jpg) +![704.二分查找1](https://file.kamacoder.com/pics/20210311153123632.jpg) 代码如下:(详细注释) diff --git "a/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" "b/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" index 7023bd902a..a2b2803b11 100644 --- "a/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" +++ "b/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" @@ -20,7 +20,7 @@ * deleteAtIndex(index):如果索引 index 有效,则删除链表中的第 index 个节点。 -![707示例](https://code-thinking-1253855093.file.myqcloud.com/pics/20200814200558953.png) +![707示例](https://file.kamacoder.com/pics/20200814200558953.png) ## 算法公开课 @@ -35,10 +35,10 @@ 如果对链表的虚拟头结点不清楚,可以看这篇文章:[链表:听说用虚拟头节点会方便很多?](https://programmercarl.com/0203.移除链表元素.html) 删除链表节点: -![链表-删除节点](https://code-thinking-1253855093.file.myqcloud.com/pics/20200806195114541.png) +![链表-删除节点](https://file.kamacoder.com/pics/20200806195114541.png) 添加链表节点: -![链表-添加节点](https://code-thinking-1253855093.file.myqcloud.com/pics/20200806195134331.png) +![链表-添加节点](https://file.kamacoder.com/pics/20200806195134331.png) 这道题目设计链表的五个接口: * 获取链表第index个节点的数值 diff --git "a/problems/0718.\346\234\200\351\225\277\351\207\215\345\244\215\345\255\220\346\225\260\347\273\204.md" "b/problems/0718.\346\234\200\351\225\277\351\207\215\345\244\215\345\255\220\346\225\260\347\273\204.md" index 0e4b346d82..b371bd857b 100644 --- "a/problems/0718.\346\234\200\351\225\277\351\207\215\345\244\215\345\255\220\346\225\260\347\273\204.md" +++ "b/problems/0718.\346\234\200\351\225\277\351\207\215\345\244\215\345\255\220\346\225\260\347\273\204.md" @@ -95,7 +95,7 @@ for (int i = 1; i <= nums1.size(); i++) { 拿示例1中,A: [1,2,3,2,1],B: [3,2,1,4,7]为例,画一个dp数组的状态变化,如下: -![718.最长重复子数组](https://code-thinking-1253855093.file.myqcloud.com/pics/2021011215282060.jpg) +![718.最长重复子数组](https://file.kamacoder.com/pics/2021011215282060.jpg) 以上五部曲分析完毕,C++代码如下: @@ -127,7 +127,7 @@ public: 在如下图中: -![718.最长重复子数组](https://code-thinking-1253855093.file.myqcloud.com/pics/2021011215282060-20230310134554486.jpg) +![718.最长重复子数组](https://file.kamacoder.com/pics/2021011215282060-20230310134554486.jpg) 我们可以看出dp[i][j]都是由dp[i - 1][j - 1]推出。那么压缩为一维数组,也就是dp[j]都是由dp[j - 1]推出。 diff --git "a/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" "b/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" index 542aad29b8..ed43cf141f 100644 --- "a/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" +++ "b/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" @@ -69,7 +69,7 @@ 首先先将第一个遍历元素加入单调栈 -![739.每日温度1](https://code-thinking-1253855093.file.myqcloud.com/pics/20210219124434172.jpg) +![739.每日温度1](https://file.kamacoder.com/pics/20210219124434172.jpg) --------- @@ -77,65 +77,65 @@ 我们要保持一个递增单调栈(从栈头到栈底),所以将T[0]弹出,T[1]加入,此时result数组可以记录了,result[0] = 1,即T[0]右面第一个比T[0]大的元素是T[1]。 -![739.每日温度2](https://code-thinking-1253855093.file.myqcloud.com/pics/20210219124504299.jpg) +![739.每日温度2](https://file.kamacoder.com/pics/20210219124504299.jpg) ----------- 加入T[2],同理,T[1]弹出 -![739.每日温度3](https://code-thinking-1253855093.file.myqcloud.com/pics/20210219124527361.jpg) +![739.每日温度3](https://file.kamacoder.com/pics/20210219124527361.jpg) ------- 加入T[3],T[3] < T[2] (当前遍历的元素T[i]小于栈顶元素T[st.top()]的情况),加T[3]加入单调栈。 -![739.每日温度4](https://code-thinking-1253855093.file.myqcloud.com/pics/20210219124610761.jpg) +![739.每日温度4](https://file.kamacoder.com/pics/20210219124610761.jpg) --------- 加入T[4],T[4] == T[3] (当前遍历的元素T[i]等于栈顶元素T[st.top()]的情况),此时依然要加入栈,不用计算距离,因为我们要求的是右面第一个大于本元素的位置,而不是大于等于! -![739.每日温度5](https://code-thinking-1253855093.file.myqcloud.com/pics/20210219124633444.jpg) +![739.每日温度5](https://file.kamacoder.com/pics/20210219124633444.jpg) --------- 加入T[5],T[5] > T[4] (当前遍历的元素T[i]大于栈顶元素T[st.top()]的情况),将T[4]弹出,同时计算距离,更新result -![739.每日温度6](https://code-thinking-1253855093.file.myqcloud.com/pics/20210219124700567.jpg) +![739.每日温度6](https://file.kamacoder.com/pics/20210219124700567.jpg) ---------- T[4]弹出之后, T[5] > T[3] (当前遍历的元素T[i]大于栈顶元素T[st.top()]的情况),将T[3]继续弹出,同时计算距离,更新result -![739.每日温度7](https://code-thinking-1253855093.file.myqcloud.com/pics/20210219124726613.jpg) +![739.每日温度7](https://file.kamacoder.com/pics/20210219124726613.jpg) ------- 直到发现T[5]小于T[st.top()],终止弹出,将T[5]加入单调栈 -![739.每日温度8](https://code-thinking-1253855093.file.myqcloud.com/pics/20210219124807715.jpg) +![739.每日温度8](https://file.kamacoder.com/pics/20210219124807715.jpg) ------- 加入T[6],同理,需要将栈里的T[5],T[2]弹出 -![739.每日温度9](https://code-thinking-1253855093.file.myqcloud.com/pics/2021021912483374.jpg) +![739.每日温度9](https://file.kamacoder.com/pics/2021021912483374.jpg) ------- 同理,继续弹出 -![739.每日温度10](https://code-thinking-1253855093.file.myqcloud.com/pics/2021021912490098.jpg) +![739.每日温度10](https://file.kamacoder.com/pics/2021021912490098.jpg) ------ 此时栈里只剩下了T[6] -![739.每日温度11](https://code-thinking-1253855093.file.myqcloud.com/pics/20210219124930156.jpg) +![739.每日温度11](https://file.kamacoder.com/pics/20210219124930156.jpg) ------------ 加入T[7], T[7] < T[6] 直接入栈,这就是最后的情况,result数组也更新完了。 -![739.每日温度12](https://code-thinking-1253855093.file.myqcloud.com/pics/20210219124957216.jpg) +![739.每日温度12](https://file.kamacoder.com/pics/20210219124957216.jpg) 此时有同学可能就疑惑了,那result[6] , result[7]怎么没更新啊,元素也一直在栈里。 diff --git "a/problems/0743.\347\275\221\347\273\234\345\273\266\350\277\237\346\227\266\351\227\264.md" "b/problems/0743.\347\275\221\347\273\234\345\273\266\350\277\237\346\227\266\351\227\264.md" index 6533a240bf..c8a8736151 100644 --- "a/problems/0743.\347\275\221\347\273\234\345\273\266\350\277\237\346\227\266\351\227\264.md" +++ "b/problems/0743.\347\275\221\347\273\234\345\273\266\350\277\237\346\227\266\351\227\264.md" @@ -13,7 +13,7 @@ https://leetcode.cn/problems/network-delay-time/description/ 现在,从某个节点 K 发出一个信号。需要多久才能使所有节点都收到信号?如果不能使所有节点收到信号,返回 -1 。 -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240229104105.png) +![](https://file.kamacoder.com/pics/20240229104105.png) 提示: @@ -42,7 +42,7 @@ dijkstra算法:在有权图(权值非负数)中求从起点到其他节点 如本题示例中的图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240125162647.png) +![](https://file.kamacoder.com/pics/20240125162647.png) 起点(节点1)到终点(节点7) 的最短路径是 图中 标记绿线的部分。 @@ -88,7 +88,7 @@ minDist数组数值初始化为int最大值。 这里在强点一下 **minDist数组的含义:记录所有节点到源点的最短路径**,那么初始化的时候就应该初始为最大值,这样才能在后续出现最短路径的时候及时更新。 -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240130115306.png) +![](https://file.kamacoder.com/pics/20240130115306.png) (图中,max 表示默认值,节点0 不做处理,统一从下标1 开始计算,这样下标和节点数值统一, 方便大家理解,避免搞混) @@ -110,7 +110,7 @@ minDist数组数值初始化为int最大值。 3、更新非访问节点到源点的距离(即更新minDist数组) ,如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240130115421.png) +![](https://file.kamacoder.com/pics/20240130115421.png) 更新 minDist数组,即:源点(节点1) 到 节点2 和 节点3的距离。 @@ -136,7 +136,7 @@ minDist数组数值初始化为int最大值。 3、更新非访问节点到源点的距离(即更新minDist数组) ,如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240130121240.png) +![](https://file.kamacoder.com/pics/20240130121240.png) 更新 minDist数组,即:源点(节点1) 到 节点6 、 节点3 和 节点4的距离。 @@ -170,7 +170,7 @@ minDist数组数值初始化为int最大值。 3、更新非访问节点到源点的距离(即更新minDist数组) ,如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240130120434.png) +![](https://file.kamacoder.com/pics/20240130120434.png) 由于节点3的加入,那么源点可以有新的路径链接到节点4 所以更新minDist数组: @@ -190,7 +190,7 @@ minDist数组数值初始化为int最大值。 3、更新非访问节点到源点的距离(即更新minDist数组) ,如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240201105335.png) +![](https://file.kamacoder.com/pics/20240201105335.png) 由于节点4的加入,那么源点可以链接到节点5 所以更新minDist数组: @@ -210,7 +210,7 @@ minDist数组数值初始化为int最大值。 3、更新非访问节点到源点的距离(即更新minDist数组) ,如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240201110250.png) +![](https://file.kamacoder.com/pics/20240201110250.png) 由于节点6的加入,那么源点可以链接到节点7 所以 更新minDist数组: @@ -230,7 +230,7 @@ minDist数组数值初始化为int最大值。 3、更新非访问节点到源点的距离(即更新minDist数组) ,如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240201110651.png) +![](https://file.kamacoder.com/pics/20240201110651.png) 由于节点5的加入,那么源点有新的路径可以链接到节点7 所以 更新minDist数组: @@ -248,7 +248,7 @@ minDist数组数值初始化为int最大值。 3、更新非访问节点到源点的距离(即更新minDist数组) ,如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240201110920.png) +![](https://file.kamacoder.com/pics/20240201110920.png) 节点7加入,但节点7到节点7的距离为0,所以 不用更新minDist数组 @@ -262,7 +262,7 @@ minDist数组数值初始化为int最大值。 路径如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240201111352.png) +![](https://file.kamacoder.com/pics/20240201111352.png) 在上面的讲解中,每一步 我都是按照 dijkstra 三部曲来讲解的,理解了这三部曲,代码也就好懂的。 @@ -431,7 +431,7 @@ select:4 看一下这个图: (有负权值) -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240227104334.png) +![](https://file.kamacoder.com/pics/20240227104334.png) 节点1 到 节点5 的最短路径 应该是 节点1 -> 节点2 -> 节点3 -> 节点4 -> 节点5 @@ -441,7 +441,7 @@ select:4 初始化: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240227104801.png) +![](https://file.kamacoder.com/pics/20240227104801.png) --------------- @@ -455,7 +455,7 @@ select:4 3、更新非访问节点到源点的距离(即更新minDist数组) ,如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240227110217.png) +![](https://file.kamacoder.com/pics/20240227110217.png) 更新 minDist数组,即:源点(节点1) 到 节点2 和 节点3的距离。 @@ -474,7 +474,7 @@ select:4 3、更新非访问节点到源点的距离(即更新minDist数组) ,如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240227110330.png) +![](https://file.kamacoder.com/pics/20240227110330.png) 由于节点3的加入,那么源点可以有新的路径链接到节点4 所以更新minDist数组: @@ -492,7 +492,7 @@ select:4 3、更新非访问节点到源点的距离(即更新minDist数组) ,如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240227110346.png) +![](https://file.kamacoder.com/pics/20240227110346.png) 由于节点4的加入,那么源点可以有新的路径链接到节点5 所以更新minDist数组: @@ -510,7 +510,7 @@ select:4 3、更新非访问节点到源点的距离(即更新minDist数组) ,如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240227110405.png) +![](https://file.kamacoder.com/pics/20240227110405.png) 节点5的加入,而节点5 没有链接其他节点, 所以不用更新minDist数组,仅标记节点5被访问过了 @@ -526,7 +526,7 @@ select:4 3、更新非访问节点到源点的距离(即更新minDist数组) ,如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240227110711.png) +![](https://file.kamacoder.com/pics/20240227110711.png) -------------- @@ -654,7 +654,7 @@ for (int v = 1; v <= n; v++) { 如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240222110025.png) +![](https://file.kamacoder.com/pics/20240222110025.png) 在一个 n (节点数)为8 的图中,就需要申请 8 * 8 这么大的空间,有一条双向边,即:grid[2][5] = 6,grid[5][2] = 6 @@ -678,7 +678,7 @@ for (int v = 1; v <= n; v++) { 邻接表的构造如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240223103713.png) +![](https://file.kamacoder.com/pics/20240223103713.png) 这里表达的图是: @@ -763,7 +763,7 @@ vector> grid(n + 1); 不少录友,不知道 如何定义的数据结构,怎么表示邻接表的,我来给大家画一个图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240223103713.png) +![](https://file.kamacoder.com/pics/20240223103713.png) 图中邻接表表示: @@ -784,7 +784,7 @@ vector>> grid(n + 1); 举例来给大家展示 该代码表达的数据 如下: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240223103904.png) +![](https://file.kamacoder.com/pics/20240223103904.png) * 节点1 指向 节点3 权值为 1 * 节点1 指向 节点5 权值为 2 @@ -907,7 +907,7 @@ for (int v = 1; v <= n; v++) { 再回顾一下邻接表的构造(数组 + 链表): -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240223103713.png) +![](https://file.kamacoder.com/pics/20240223103713.png) 假如 加入的cur 是节点 2, 那么 grid[2] 表示的就是图中第二行链表。 (grid数组的构造我们在 上面 「图的存储」中讲过) diff --git "a/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" "b/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" index 9145c7ed1d..147c7bfba7 100644 --- "a/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" +++ "b/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" @@ -52,7 +52,7 @@ 请你计算并返回达到楼梯顶部的最低花费。 -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20221031170131.png) +![](https://file.kamacoder.com/pics/20221031170131.png) ## 思路 @@ -112,7 +112,7 @@ dp[i - 2] 跳到 dp[i] 需要花费 dp[i - 2] + cost[i - 2]。 拿示例2:cost = [1, 100, 1, 1, 1, 100, 1, 1, 100, 1] ,来模拟一下dp数组的状态变化,如下: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20221026175104.png) +![](https://file.kamacoder.com/pics/20221026175104.png) 如果大家代码写出来有问题,就把dp数组打印出来,看看和如上推导的是不是一样的。 diff --git "a/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" "b/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" index 70ebfe4ff7..daf52bea55 100644 --- "a/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" +++ "b/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" @@ -44,7 +44,7 @@ 如图: -![763.划分字母区间](https://code-thinking-1253855093.file.myqcloud.com/pics/20201222191924417.png) +![763.划分字母区间](https://file.kamacoder.com/pics/20201222191924417.png) 明白原理之后,代码并不复杂,如下: diff --git "a/problems/0787.K\347\253\231\344\270\255\350\275\254\345\206\205\346\234\200\344\276\277\345\256\234\347\232\204\350\210\252\347\217\255.md" "b/problems/0787.K\347\253\231\344\270\255\350\275\254\345\206\205\346\234\200\344\276\277\345\256\234\347\232\204\350\210\252\347\217\255.md" index 68d8421502..6133ac7733 100644 --- "a/problems/0787.K\347\253\231\344\270\255\350\275\254\345\206\205\346\234\200\344\276\277\345\256\234\347\232\204\350\210\252\347\217\255.md" +++ "b/problems/0787.K\347\253\231\344\270\255\350\275\254\345\206\205\346\234\200\344\276\277\345\256\234\347\232\204\350\210\252\347\217\255.md" @@ -9,11 +9,11 @@ 现在给定所有的城市和航班,以及出发城市 src 和目的地 dst,你的任务是找到出一条最多经过 k 站中转的路线,使得从 src 到 dst 的 价格最便宜 ,并返回该价格。 如果不存在这样的路线,则输出 -1。 -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240319103900.png) +![](https://file.kamacoder.com/pics/20240319103900.png) -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240319103919.png) +![](https://file.kamacoder.com/pics/20240319103919.png) -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240319104026.png) +![](https://file.kamacoder.com/pics/20240319104026.png) ## 思路 diff --git "a/problems/0797.\346\211\200\346\234\211\345\217\257\350\203\275\347\232\204\350\267\257\345\276\204.md" "b/problems/0797.\346\211\200\346\234\211\345\217\257\350\203\275\347\232\204\350\267\257\345\276\204.md" index a37e5c3f8c..639b6b2b3b 100644 --- "a/problems/0797.\346\211\200\346\234\211\345\217\257\350\203\275\347\232\204\350\267\257\345\276\204.md" +++ "b/problems/0797.\346\211\200\346\234\211\345\217\257\350\203\275\347\232\204\350\267\257\345\276\204.md" @@ -11,7 +11,7 @@ graph[i] 是一个从节点 i 可以访问的所有节点的列表(即从节点 i 到节点 graph[i][j]存在一条有向边)。 -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20221203135439.png) +![](https://file.kamacoder.com/pics/20221203135439.png) 提示: @@ -96,7 +96,7 @@ path.push_back(graph[x][i]); // 遍历到的节点加入到路径中来 一些录友可以疑惑这里如果找到x 链接的节点的,例如如果x目前是节点0,那么目前的过程就是这样的: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20221204111937.png) +![](https://file.kamacoder.com/pics/20221204111937.png) 二维数组中,graph[x][i] 都是x链接的节点,当前遍历的节点就是 `graph[x][i]` 。 diff --git "a/problems/0827.\346\234\200\345\244\247\344\272\272\345\267\245\345\262\233.md" "b/problems/0827.\346\234\200\345\244\247\344\272\272\345\267\245\345\262\233.md" index 0ebda2524a..e6aa4601dd 100644 --- "a/problems/0827.\346\234\200\345\244\247\344\272\272\345\267\245\345\262\233.md" +++ "b/problems/0827.\346\234\200\345\244\247\344\272\272\345\267\245\345\262\233.md" @@ -51,11 +51,11 @@ 拿如下地图的岛屿情况来举例: (1为陆地) -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20220829104834.png) +![](https://file.kamacoder.com/pics/20220829104834.png) 第一步,则遍历题目,并将岛屿到编号和面积上的统计,过程如图所示: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20220829105644.png) +![](https://file.kamacoder.com/pics/20220829105644.png) 本过程代码如下: @@ -102,7 +102,7 @@ int largestIsland(vector>& grid) { 第二步过程如图所示: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20220829105249.png) +![](https://file.kamacoder.com/pics/20220829105249.png) 也就是遍历每一个0的方格,并统计其相邻岛屿面积,最后取一个最大值。 diff --git "a/problems/0841.\351\222\245\345\214\231\345\222\214\346\210\277\351\227\264.md" "b/problems/0841.\351\222\245\345\214\231\345\222\214\346\210\277\351\227\264.md" index 4076fce513..60180d2736 100644 --- "a/problems/0841.\351\222\245\345\214\231\345\222\214\346\210\277\351\227\264.md" +++ "b/problems/0841.\351\222\245\345\214\231\345\222\214\346\210\277\351\227\264.md" @@ -35,7 +35,7 @@ 图中给我的两个示例: `[[1],[2],[3],[]]` `[[1,3],[3,0,1],[2],[0]]`,画成对应的图如下: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20220714101414.png) +![](https://file.kamacoder.com/pics/20220714101414.png) 我们可以看出图1的所有节点都是链接的,而图二中,节点2 是孤立的。 @@ -48,7 +48,7 @@ 图3:[[5], [], [1, 3], [5]] ,如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20220714102201.png) +![](https://file.kamacoder.com/pics/20220714102201.png) 在图3中,大家可以发现,节点0只能到节点5,然后就哪也去不了了。 diff --git "a/problems/0941.\346\234\211\346\225\210\347\232\204\345\261\261\350\204\211\346\225\260\347\273\204.md" "b/problems/0941.\346\234\211\346\225\210\347\232\204\345\261\261\350\204\211\346\225\260\347\273\204.md" index 383f6aa5b1..d4165f3672 100644 --- "a/problems/0941.\346\234\211\346\225\210\347\232\204\345\261\261\350\204\211\346\225\260\347\273\204.md" +++ "b/problems/0941.\346\234\211\346\225\210\347\232\204\345\261\261\350\204\211\346\225\260\347\273\204.md" @@ -16,7 +16,7 @@ * arr[0] < arr[1] < ... arr[i-1] < arr[i] * arr[i] > arr[i+1] > ... > arr[arr.length - 1] -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210729103604.png) +![](https://file.kamacoder.com/pics/20210729103604.png) 示例 1: * 输入:arr = [2,1] diff --git "a/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" "b/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" index 0df2cc5b60..d8c31ca998 100644 --- "a/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" @@ -17,7 +17,7 @@ 示例 1: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20201229175736596.png) +![](https://file.kamacoder.com/pics/20201229175736596.png) * 输入:[0,0,null,0,0] * 输出:1 @@ -25,7 +25,7 @@ 示例 2: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/2020122917584449.png) +![](https://file.kamacoder.com/pics/2020122917584449.png) * 输入:[0,0,null,0,null,0,null,null,0] * 输出:2 @@ -143,7 +143,7 @@ if (cur == NULL) return 2; 如图: -![968.监控二叉树2](https://code-thinking-1253855093.file.myqcloud.com/pics/20201229203710729.png) +![968.监控二叉树2](https://file.kamacoder.com/pics/20201229203710729.png) 代码如下: @@ -191,7 +191,7 @@ if (left == 1 || right == 1) return 2; **从这个代码中,可以看出,如果left == 1, right == 0 怎么办?其实这种条件在情况2中已经判断过了**,如图: -![968.监控二叉树1](https://code-thinking-1253855093.file.myqcloud.com/pics/2020122920362355.png) +![968.监控二叉树1](https://file.kamacoder.com/pics/2020122920362355.png) 这种情况也是大多数同学容易迷惑的情况。 @@ -199,7 +199,7 @@ if (left == 1 || right == 1) return 2; 以上都处理完了,递归结束之后,可能头结点 还有一个无覆盖的情况,如图: -![968.监控二叉树3](https://code-thinking-1253855093.file.myqcloud.com/pics/20201229203742446.png) +![968.监控二叉树3](https://file.kamacoder.com/pics/20201229203742446.png) 所以递归结束之后,还要判断根节点,如果没有覆盖,result++,代码如下: diff --git "a/problems/1020.\351\243\236\345\234\260\347\232\204\346\225\260\351\207\217.md" "b/problems/1020.\351\243\236\345\234\260\347\232\204\346\225\260\351\207\217.md" index 030d56a024..ae6b3895fa 100644 --- "a/problems/1020.\351\243\236\345\234\260\347\232\204\346\225\260\351\207\217.md" +++ "b/problems/1020.\351\243\236\345\234\260\347\232\204\346\225\260\351\207\217.md" @@ -12,13 +12,13 @@ 返回网格中 无法 在任意次数的移动中离开网格边界的陆地单元格的数量。 -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20220830100710.png) +![](https://file.kamacoder.com/pics/20220830100710.png) * 输入:grid = [[0,0,0,0],[1,0,1,0],[0,1,1,0],[0,0,0,0]] * 输出:3 * 解释:有三个 1 被 0 包围。一个 1 没有被包围,因为它在边界上。 -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20220830100742.png) +![](https://file.kamacoder.com/pics/20220830100742.png) * 输入:grid = [[0,1,1,0],[0,0,1,0],[0,0,1,0],[0,0,0,0]] * 输出:0 @@ -32,11 +32,11 @@ 如图,在遍历地图周围四个边,靠地图四边的陆地,都为绿色, -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20220830104632.png) +![](https://file.kamacoder.com/pics/20220830104632.png) 在遇到地图周边陆地的时候,将1都变为0,此时地图为这样: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20220830104651.png) +![](https://file.kamacoder.com/pics/20220830104651.png) 然后我们再去遍历这个地图,遇到有陆地的地方,去采用深搜或者广搜,边统计所有陆地。 diff --git "a/problems/1035.\344\270\215\347\233\270\344\272\244\347\232\204\347\272\277.md" "b/problems/1035.\344\270\215\347\233\270\344\272\244\347\232\204\347\272\277.md" index 53e0f370e7..0119df82ea 100644 --- "a/problems/1035.\344\270\215\347\233\270\344\272\244\347\232\204\347\272\277.md" +++ "b/problems/1035.\344\270\215\347\233\270\344\272\244\347\232\204\347\272\277.md" @@ -18,7 +18,7 @@ 以这种方法绘制线条,并返回可以绘制的最大连线数。 -![1035.不相交的线](https://code-thinking-1253855093.file.myqcloud.com/pics/2021032116363533.png) +![1035.不相交的线](https://file.kamacoder.com/pics/2021032116363533.png) ## 算法公开课 @@ -36,7 +36,7 @@ 拿示例一nums1 = [1,4,2], nums2 = [1,2,4]为例,相交情况如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210914145158.png) +![](https://file.kamacoder.com/pics/20210914145158.png) 其实也就是说nums1和nums2的最长公共子序列是[1,4],长度为2。 这个公共子序列指的是相对顺序不变(即数字4在字符串nums1中数字1的后面,那么数字4也应该在字符串nums2数字1的后面) diff --git "a/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" "b/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" index 62e7d9c590..6dfba4ed44 100644 --- "a/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" +++ "b/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" @@ -114,7 +114,7 @@ for (int i = 0; i < stones.size(); i++) { // 遍历物品 举例,输入:[2,4,1,1],此时target = (2 + 4 + 1 + 1)/2 = 4 ,dp数组状态图如下: -![1049.最后一块石头的重量II](https://code-thinking-1253855093.file.myqcloud.com/pics/20210121115805904.jpg) +![1049.最后一块石头的重量II](https://file.kamacoder.com/pics/20210121115805904.jpg) 最后dp[target]里是容量为target的背包所能背的最大重量。 diff --git "a/problems/1143.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" "b/problems/1143.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" index 821f3c42a1..91c29b8313 100644 --- "a/problems/1143.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/1143.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" @@ -94,7 +94,7 @@ vector> dp(text1.size() + 1, vector(text2.size() + 1, 0)); 从递推公式,可以看出,有三个方向可以推出dp[i][j],如图: -![1143.最长公共子序列](https://code-thinking-1253855093.file.myqcloud.com/pics/20210204115139616.jpg) +![1143.最长公共子序列](https://file.kamacoder.com/pics/20210204115139616.jpg) 那么为了在递推的过程中,这三个方向都是经过计算的数值,所以要从前向后,从上到下来遍历这个矩阵。 @@ -103,7 +103,7 @@ vector> dp(text1.size() + 1, vector(text2.size() + 1, 0)); 以输入:text1 = "abcde", text2 = "ace" 为例,dp状态如图: -![1143.最长公共子序列1](https://code-thinking-1253855093.file.myqcloud.com/pics/20210210150215918.jpg) +![1143.最长公共子序列1](https://file.kamacoder.com/pics/20210210150215918.jpg) 最后红框dp[text1.size()][text2.size()]为最终结果 diff --git "a/problems/1254.\347\273\237\350\256\241\345\260\201\351\227\255\345\262\233\345\261\277\347\232\204\346\225\260\347\233\256.md" "b/problems/1254.\347\273\237\350\256\241\345\260\201\351\227\255\345\262\233\345\261\277\347\232\204\346\225\260\347\233\256.md" index 5d99670950..ebea30e34f 100644 --- "a/problems/1254.\347\273\237\350\256\241\345\260\201\351\227\255\345\262\233\345\261\277\347\232\204\346\225\260\347\233\256.md" +++ "b/problems/1254.\347\273\237\350\256\241\345\260\201\351\227\255\345\262\233\345\261\277\347\232\204\346\225\260\347\233\256.md" @@ -10,13 +10,13 @@ 请返回 封闭岛屿 的数目。 -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20220830111533.png) +![](https://file.kamacoder.com/pics/20220830111533.png) * 输入:grid = [[1,1,1,1,1,1,1,0],[1,0,0,0,0,1,1,0],[1,0,1,0,1,1,1,0],[1,0,0,0,0,1,0,1],[1,1,1,1,1,1,1,0]] * 输出:2 * 解释:灰色区域的岛屿是封闭岛屿,因为这座岛屿完全被水域包围(即被 1 区域包围)。 -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20220830111601.png) +![](https://file.kamacoder.com/pics/20220830111601.png) * 输入:grid = [[0,0,1,0,0],[0,1,0,1,0],[0,1,1,1,0]] * 输出:1 diff --git "a/problems/1382.\345\260\206\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\345\217\230\345\271\263\350\241\241.md" "b/problems/1382.\345\260\206\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\345\217\230\345\271\263\350\241\241.md" index 7a1a7f3cb9..7b0d32048a 100644 --- "a/problems/1382.\345\260\206\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\345\217\230\345\271\263\350\241\241.md" +++ "b/problems/1382.\345\260\206\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\345\217\230\345\271\263\350\241\241.md" @@ -15,7 +15,7 @@ 示例: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210726154512.png) +![](https://file.kamacoder.com/pics/20210726154512.png) * 输入:root = [1,null,2,null,3,null,4,null,null] * 输出:[2,1,3,null,null,null,4] diff --git "a/problems/1791.\346\211\276\345\207\272\346\230\237\345\236\213\345\233\276\347\232\204\344\270\255\345\277\203\350\212\202\347\202\271.md" "b/problems/1791.\346\211\276\345\207\272\346\230\237\345\236\213\345\233\276\347\232\204\344\270\255\345\277\203\350\212\202\347\202\271.md" index e9ea5f4463..5dd56c65d9 100644 --- "a/problems/1791.\346\211\276\345\207\272\346\230\237\345\236\213\345\233\276\347\232\204\344\270\255\345\277\203\350\212\202\347\202\271.md" +++ "b/problems/1791.\346\211\276\345\207\272\346\230\237\345\236\213\345\233\276\347\232\204\344\270\255\345\277\203\350\212\202\347\202\271.md" @@ -10,7 +10,7 @@ 什么是度,可以理解为,链接节点的边的数量。 题目中度如图所示: -![1791.找出星型图的中心节点](https://code-thinking-1253855093.file.myqcloud.com/pics/20220704113207.png) +![1791.找出星型图的中心节点](https://file.kamacoder.com/pics/20220704113207.png) 至于出度和入度,那就是在有向图里的概念了,本题是无向图。 diff --git "a/problems/1971.\345\257\273\346\211\276\345\233\276\344\270\255\346\230\257\345\220\246\345\255\230\345\234\250\350\267\257\345\276\204.md" "b/problems/1971.\345\257\273\346\211\276\345\233\276\344\270\255\346\230\257\345\220\246\345\255\230\345\234\250\350\267\257\345\276\204.md" index acb544155a..33b48698b5 100644 --- "a/problems/1971.\345\257\273\346\211\276\345\233\276\344\270\255\346\230\257\345\220\246\345\255\230\345\234\250\350\267\257\345\276\204.md" +++ "b/problems/1971.\345\257\273\346\211\276\345\233\276\344\270\255\346\230\257\345\220\246\345\255\230\345\234\250\350\267\257\345\276\204.md" @@ -12,7 +12,7 @@ 给你数组 edges 和整数 n、start 和 end,如果从 start 到 end 存在 有效路径 ,则返回 true,否则返回 false 。 -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20220705101442.png) +![](https://file.kamacoder.com/pics/20220705101442.png) diff --git "a/problems/O(n)\347\232\204\347\256\227\346\263\225\345\261\205\347\204\266\350\266\205\346\227\266\344\272\206\357\274\214\346\255\244\346\227\266\347\232\204n\347\251\266\347\253\237\346\230\257\345\244\232\345\244\247\357\274\237.md" "b/problems/O(n)\347\232\204\347\256\227\346\263\225\345\261\205\347\204\266\350\266\205\346\227\266\344\272\206\357\274\214\346\255\244\346\227\266\347\232\204n\347\251\266\347\253\237\346\230\257\345\244\232\345\244\247\357\274\237.md" index 7276af53b3..830bba7e2a 100644 --- "a/problems/O(n)\347\232\204\347\256\227\346\263\225\345\261\205\347\204\266\350\266\205\346\227\266\344\272\206\357\274\214\346\255\244\346\227\266\347\232\204n\347\251\266\347\253\237\346\230\257\345\244\232\345\244\247\357\274\237.md" +++ "b/problems/O(n)\347\232\204\347\256\227\346\263\225\345\261\205\347\204\266\350\266\205\346\227\266\344\272\206\357\274\214\346\255\244\346\227\266\347\232\204n\347\251\266\347\253\237\346\230\257\345\244\232\345\244\247\357\274\237.md" @@ -13,7 +13,7 @@ ## 超时是怎么回事 -![程序超时](https://code-thinking-1253855093.file.myqcloud.com/pics/20200729112716117.png) +![程序超时](https://file.kamacoder.com/pics/20200729112716117.png) 大家在leetcode上练习算法的时候应该都遇到过一种错误是“超时”。 @@ -129,11 +129,11 @@ int main() { 来看一下运行的效果,如下图: -![程序超时2](https://code-thinking-1253855093.file.myqcloud.com/pics/20200729200018460.png) +![程序超时2](https://file.kamacoder.com/pics/20200729200018460.png) O(n)的算法,1s内大概计算机可以运行 5 * (10^8)次计算,可以推测一下O(n^2) 的算法应该1s可以处理的数量级的规模是 5 * (10^8)开根号,实验数据如下。 -![程序超时3](https://code-thinking-1253855093.file.myqcloud.com/pics/2020072919590970.png) +![程序超时3](https://file.kamacoder.com/pics/2020072919590970.png) O(n^2)的算法,1s内大概计算机可以运行 22500次计算,验证了刚刚的推测。 @@ -141,7 +141,7 @@ O(n^2)的算法,1s内大概计算机可以运行 22500次计算,验证了刚 理论上应该是比 O(n)少一个数量级,因为logn的复杂度 其实是很快,看一下实验数据。 -![程序超时4](https://code-thinking-1253855093.file.myqcloud.com/pics/20200729195729407.png) +![程序超时4](https://file.kamacoder.com/pics/20200729195729407.png) O(nlogn)的算法,1s内大概计算机可以运行 2 * (10^7)次计算,符合预期。 @@ -149,7 +149,7 @@ O(nlogn)的算法,1s内大概计算机可以运行 2 * (10^7)次计算,符 **整体测试数据整理如下:** -![程序超时1](https://code-thinking-1253855093.file.myqcloud.com/pics/20201208231559175.png) +![程序超时1](https://file.kamacoder.com/pics/20201208231559175.png) 至于O(log n)和O(n^3) 等等这些时间复杂度在1s内可以处理的多大的数据规模,大家可以自己写一写代码去测一下了。 diff --git "a/problems/kamacoder/0047.\345\217\202\344\274\232dijkstra\345\240\206.md" "b/problems/kamacoder/0047.\345\217\202\344\274\232dijkstra\345\240\206.md" index 75c12f8a96..e361e8e0d9 100644 --- "a/problems/kamacoder/0047.\345\217\202\344\274\232dijkstra\345\240\206.md" +++ "b/problems/kamacoder/0047.\345\217\202\344\274\232dijkstra\345\240\206.md" @@ -46,13 +46,13 @@ 如下图所示,起始车站为 1 号车站,终点车站为 7 号车站,绿色路线为最短的路线,路线总长度为 12,则输出 12。 -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240227101345.png) +![](https://file.kamacoder.com/pics/20240227101345.png) 不能到达的情况: 如下图所示,当从起始车站不能到达终点车站时,则输出 -1。 -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240227101401.png) +![](https://file.kamacoder.com/pics/20240227101401.png) 数据范围: @@ -101,7 +101,7 @@ 如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240222110025.png) +![](https://file.kamacoder.com/pics/20240222110025.png) 在一个 n (节点数)为8 的图中,就需要申请 8 * 8 这么大的空间,有一条双向边,即:grid[2][5] = 6,grid[5][2] = 6 @@ -125,7 +125,7 @@ 邻接表的构造如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240223103713.png) +![](https://file.kamacoder.com/pics/20240223103713.png) 这里表达的图是: @@ -210,7 +210,7 @@ vector> grid(n + 1); 不少录友,不知道 如何定义的数据结构,怎么表示邻接表的,我来给大家画一个图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240223103713.png) +![](https://file.kamacoder.com/pics/20240223103713.png) 图中邻接表表示: @@ -231,7 +231,7 @@ vector>> grid(n + 1); 举例来给大家展示 该代码表达的数据 如下: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240223103904.png) +![](https://file.kamacoder.com/pics/20240223103904.png) * 节点1 指向 节点3 权值为 1 * 节点1 指向 节点5 权值为 2 @@ -354,7 +354,7 @@ for (int v = 1; v <= n; v++) { 再回顾一下邻接表的构造(数组 + 链表): -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240223103713.png) +![](https://file.kamacoder.com/pics/20240223103713.png) 假如 加入的cur 是节点 2, 那么 grid[2] 表示的就是图中第二行链表。 (grid数组的构造我们在 上面 「图的存储」中讲过) diff --git "a/problems/kamacoder/0047.\345\217\202\344\274\232dijkstra\346\234\264\347\264\240.md" "b/problems/kamacoder/0047.\345\217\202\344\274\232dijkstra\346\234\264\347\264\240.md" index e71e9d5374..1ff9f1a874 100644 --- "a/problems/kamacoder/0047.\345\217\202\344\274\232dijkstra\346\234\264\347\264\240.md" +++ "b/problems/kamacoder/0047.\345\217\202\344\274\232dijkstra\346\234\264\347\264\240.md" @@ -46,13 +46,13 @@ 如下图所示,起始车站为 1 号车站,终点车站为 7 号车站,绿色路线为最短的路线,路线总长度为 12,则输出 12。 -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240227101345.png) +![](https://file.kamacoder.com/pics/20240227101345.png) 不能到达的情况: 如下图所示,当从起始车站不能到达终点车站时,则输出 -1。 -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240227101401.png) +![](https://file.kamacoder.com/pics/20240227101401.png) 数据范围: @@ -76,7 +76,7 @@ dijkstra算法:在有权图(权值非负数)中求从起点到其他节点 如本题示例中的图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240125162647.png) +![](https://file.kamacoder.com/pics/20240125162647.png) 起点(节点1)到终点(节点7) 的最短路径是 图中 标记绿线的部分。 @@ -122,7 +122,7 @@ minDist数组数值初始化为int最大值。 这里在强点一下 **minDist数组的含义:记录所有节点到源点的最短路径**,那么初始化的时候就应该初始为最大值,这样才能在后续出现最短路径的时候及时更新。 -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240130115306.png) +![](https://file.kamacoder.com/pics/20240130115306.png) (图中,max 表示默认值,节点0 不做处理,统一从下标1 开始计算,这样下标和节点数值统一, 方便大家理解,避免搞混) @@ -144,7 +144,7 @@ minDist数组数值初始化为int最大值。 3、更新非访问节点到源点的距离(即更新minDist数组) ,如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240130115421.png) +![](https://file.kamacoder.com/pics/20240130115421.png) 更新 minDist数组,即:源点(节点1) 到 节点2 和 节点3的距离。 @@ -170,7 +170,7 @@ minDist数组数值初始化为int最大值。 3、更新非访问节点到源点的距离(即更新minDist数组) ,如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240130121240.png) +![](https://file.kamacoder.com/pics/20240130121240.png) 更新 minDist数组,即:源点(节点1) 到 节点6 、 节点3 和 节点4的距离。 @@ -204,7 +204,7 @@ minDist数组数值初始化为int最大值。 3、更新非访问节点到源点的距离(即更新minDist数组) ,如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240130120434.png) +![](https://file.kamacoder.com/pics/20240130120434.png) 由于节点3的加入,那么源点可以有新的路径链接到节点4 所以更新minDist数组: @@ -224,7 +224,7 @@ minDist数组数值初始化为int最大值。 3、更新非访问节点到源点的距离(即更新minDist数组) ,如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240201105335.png) +![](https://file.kamacoder.com/pics/20240201105335.png) 由于节点4的加入,那么源点可以链接到节点5 所以更新minDist数组: @@ -244,7 +244,7 @@ minDist数组数值初始化为int最大值。 3、更新非访问节点到源点的距离(即更新minDist数组) ,如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240201110250.png) +![](https://file.kamacoder.com/pics/20240201110250.png) 由于节点6的加入,那么源点可以链接到节点7 所以 更新minDist数组: @@ -264,7 +264,7 @@ minDist数组数值初始化为int最大值。 3、更新非访问节点到源点的距离(即更新minDist数组) ,如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240201110651.png) +![](https://file.kamacoder.com/pics/20240201110651.png) 由于节点5的加入,那么源点有新的路径可以链接到节点7 所以 更新minDist数组: @@ -282,7 +282,7 @@ minDist数组数值初始化为int最大值。 3、更新非访问节点到源点的距离(即更新minDist数组) ,如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240201110920.png) +![](https://file.kamacoder.com/pics/20240201110920.png) 节点7加入,但节点7到节点7的距离为0,所以 不用更新minDist数组 @@ -296,7 +296,7 @@ minDist数组数值初始化为int最大值。 路径如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240201111352.png) +![](https://file.kamacoder.com/pics/20240201111352.png) 在上面的讲解中,每一步 我都是按照 dijkstra 三部曲来讲解的,理解了这三部曲,代码也就好懂的。 @@ -541,7 +541,7 @@ int main() { 对应如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240201111352.png) +![](https://file.kamacoder.com/pics/20240201111352.png) ### 出现负数 @@ -549,7 +549,7 @@ int main() { 看一下这个图: (有负权值) -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240227104334.png) +![](https://file.kamacoder.com/pics/20240227104334.png) 节点1 到 节点5 的最短路径 应该是 节点1 -> 节点2 -> 节点3 -> 节点4 -> 节点5 @@ -559,7 +559,7 @@ int main() { 初始化: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240227104801.png) +![](https://file.kamacoder.com/pics/20240227104801.png) --------------- @@ -573,7 +573,7 @@ int main() { 3、更新非访问节点到源点的距离(即更新minDist数组) ,如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240227110217.png) +![](https://file.kamacoder.com/pics/20240227110217.png) 更新 minDist数组,即:源点(节点1) 到 节点2 和 节点3的距离。 @@ -592,7 +592,7 @@ int main() { 3、更新非访问节点到源点的距离(即更新minDist数组) ,如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240227110330.png) +![](https://file.kamacoder.com/pics/20240227110330.png) 由于节点3的加入,那么源点可以有新的路径链接到节点4 所以更新minDist数组: @@ -610,7 +610,7 @@ int main() { 3、更新非访问节点到源点的距离(即更新minDist数组) ,如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240227110346.png) +![](https://file.kamacoder.com/pics/20240227110346.png) 由于节点4的加入,那么源点可以有新的路径链接到节点5 所以更新minDist数组: @@ -628,7 +628,7 @@ int main() { 3、更新非访问节点到源点的距离(即更新minDist数组) ,如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240227110405.png) +![](https://file.kamacoder.com/pics/20240227110405.png) 节点5的加入,而节点5 没有链接其他节点, 所以不用更新minDist数组,仅标记节点5被访问过了 @@ -644,7 +644,7 @@ int main() { 3、更新非访问节点到源点的距离(即更新minDist数组) ,如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240227110711.png) +![](https://file.kamacoder.com/pics/20240227110711.png) -------------- diff --git "a/problems/kamacoder/0053.\345\257\273\345\256\235-Kruskal.md" "b/problems/kamacoder/0053.\345\257\273\345\256\235-Kruskal.md" index 861efe6806..585fa4767e 100644 --- "a/problems/kamacoder/0053.\345\257\273\345\256\235-Kruskal.md" +++ "b/problems/kamacoder/0053.\345\257\273\345\256\235-Kruskal.md" @@ -63,7 +63,7 @@ kruscal的思路: 依然以示例中,如下这个图来举例。 -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240111113514.png) +![](https://file.kamacoder.com/pics/20240111113514.png) 将图中的边按照权值有小到大排序,这样从贪心的角度来说,优先选 权值小的边加入到 最小生成树中。 @@ -77,13 +77,13 @@ kruscal的思路: 选边(1,2),节点1 和 节点2 不在同一个集合,所以生成树可以添加边(1,2),并将 节点1,节点2 放在同一个集合。 -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240111114204.png) +![](https://file.kamacoder.com/pics/20240111114204.png) -------- 选边(4,5),节点4 和 节点 5 不在同一个集合,生成树可以添加边(4,5) ,并将节点4,节点5 放到同一个集合。 -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240111120458.png) +![](https://file.kamacoder.com/pics/20240111120458.png) **大家判断两个节点是否在同一个集合,就看图中两个节点是否有绿色的粗线连着就行** @@ -93,25 +93,25 @@ kruscal的思路: 选边(1,3),节点1 和 节点3 不在同一个集合,生成树添加边(1,3),并将节点1,节点3 放到同一个集合。 -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240112105834.png) +![](https://file.kamacoder.com/pics/20240112105834.png) --------- 选边(2,6),节点2 和 节点6 不在同一个集合,生成树添加边(2,6),并将节点2,节点6 放到同一个集合。 -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240112110214.png) +![](https://file.kamacoder.com/pics/20240112110214.png) -------- 选边(3,4),节点3 和 节点4 不在同一个集合,生成树添加边(3,4),并将节点3,节点4 放到同一个集合。 -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240112110450.png) +![](https://file.kamacoder.com/pics/20240112110450.png) ---------- 选边(6,7),节点6 和 节点7 不在同一个集合,生成树添加边(6,7),并将 节点6,节点7 放到同一个集合。 -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240112110637.png) +![](https://file.kamacoder.com/pics/20240112110637.png) ----------- @@ -126,7 +126,7 @@ kruscal的思路: 此时 我们就已经生成了一个最小生成树,即: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240112110637.png) +![](https://file.kamacoder.com/pics/20240112110637.png) 在上面的讲解中,看图的话 大家知道如何判断 两个节点 是否在同一个集合(是否有绿色的线连在一起),以及如何把两个节点加入集合(就在图中把两个节点连上) @@ -346,7 +346,7 @@ int main() { 大家可能发现 怎么和我们 模拟画的图不一样,差别在于 代码生成的最小生成树中 节点5 和 节点7相连的。 -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240116163014.png) +![](https://file.kamacoder.com/pics/20240116163014.png) 其实造成这个差别 是对边排序的时候 权值相同的边先后顺序的问题导致的,无论相同权值边的顺序是什么样的,最后都能得出最小生成树。 @@ -366,7 +366,7 @@ Kruskal 与 prim 的关键区别在于,prim维护的是节点的集合,而 K 节点未必一定要连着边那, 例如 这个图,大家能明显感受到边没有那么多对吧,但节点数量 和 上述我们讲的例子是一样的。 -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240116152211.png) +![](https://file.kamacoder.com/pics/20240116152211.png) 为什么边少的话,使用 Kruskal 更优呢? diff --git "a/problems/kamacoder/0053.\345\257\273\345\256\235-prim.md" "b/problems/kamacoder/0053.\345\257\273\345\256\235-prim.md" index 8e26bea4bd..a7d3584178 100644 --- "a/problems/kamacoder/0053.\345\257\273\345\256\235-prim.md" +++ "b/problems/kamacoder/0053.\345\257\273\345\256\235-prim.md" @@ -61,7 +61,7 @@ 例如本题示例中的无向有权图为: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20231206164306.png) +![](https://file.kamacoder.com/pics/20231206164306.png) 那么在这个图中,如何选取n-1条边使得图中所有节点连接到一起,并且边的权值和最小呢? @@ -100,7 +100,7 @@ minDist数组里的数值初始化为最大数,因为本题节点距离不会 如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20231215105603.png) +![](https://file.kamacoder.com/pics/20231215105603.png) 开始构造最小生成树 @@ -118,7 +118,7 @@ minDist数组里的数值初始化为最大数,因为本题节点距离不会 接下来,我们要更新所有节点距离最小生成树的距离,如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20231222102048.png) +![](https://file.kamacoder.com/pics/20231222102048.png) 注意下标0,我们就不管它了,下标1与节点1对应,这样可以避免大家把节点搞混。 @@ -148,7 +148,7 @@ minDist数组里的数值初始化为最大数,因为本题节点距离不会 接下来,我们要更新节点距离最小生成树的距离,如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20231222102431.png) +![](https://file.kamacoder.com/pics/20231222102431.png) 此时所有非生成树的节点距离最小生成树(节点1、节点2)的距离都已经跟新了。 @@ -172,7 +172,7 @@ minDist数组里的数值初始化为最大数,因为本题节点距离不会 接下来更新节点距离最小生成树的距离,如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20231222102457.png) +![](https://file.kamacoder.com/pics/20231222102457.png) 所有非生成树的节点距离最小生成树(节点1、节点2、节点3)的距离都已经跟新了。 @@ -188,7 +188,7 @@ minDist数组里的数值初始化为最大数,因为本题节点距离不会 继续选择一个距离最小生成树(节点1、节点2、节点3)最近的非生成树里的节点,为了巩固大家对minDist数组的理解,这里我再啰嗦一遍: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20231217213516.png) +![](https://file.kamacoder.com/pics/20231217213516.png) **minDist数组是记录了所有非生成树节点距离生成树的最小距离**,所以从数组里我们能看出来,非生成树节点4和节点6距离生成树最近。 @@ -209,7 +209,7 @@ minDist数组里的数值初始化为最大数,因为本题节点距离不会 接下来更新节点距离最小生成树的距离,如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20231222102618.png) +![](https://file.kamacoder.com/pics/20231222102618.png) minDist数组已经更新了所有非生成树的节点距离最小生成树(节点1、节点2、节点3、节点4)的距离。 @@ -232,7 +232,7 @@ minDist数组已经更新了所有非生成树的节点距离最小生成树( 接下来更新节点距离最小生成树的距离,如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20231222102646.png) +![](https://file.kamacoder.com/pics/20231222102646.png) minDist数组已经更新了所有非生成树的节点距离最小生成树(节点1、节点2、节点3、节点4、节点5)的距离。 @@ -253,11 +253,11 @@ minDist数组已经更新了所有非生成树的节点距离最小生成树( 节点1、节点2、节点3、节点4、节点5、节点6算是最小生成树的节点,接下来更新节点距离最小生成树的距离,如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20231222102732.png) +![](https://file.kamacoder.com/pics/20231222102732.png) 这里就不在重复描述了,大家类推,最后,节点7加入生成树,如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20231222102820.png) +![](https://file.kamacoder.com/pics/20231222102820.png) ### 最后 @@ -478,7 +478,7 @@ int main() { 大家可以和我们本题最后生成的最小生成树的图去对比一下边的链接情况: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20231229115714.png) +![](https://file.kamacoder.com/pics/20231229115714.png) 绿色的边是最小生成树,和我们的输出完全一致。 diff --git "a/problems/kamacoder/0054.\346\233\277\346\215\242\346\225\260\345\255\227.md" "b/problems/kamacoder/0054.\346\233\277\346\215\242\346\225\260\345\255\227.md" index f788d65ba7..665e8ecbae 100644 --- "a/problems/kamacoder/0054.\346\233\277\346\215\242\346\225\260\345\255\227.md" +++ "b/problems/kamacoder/0054.\346\233\277\346\215\242\346\225\260\345\255\227.md" @@ -29,11 +29,11 @@ 如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20231030165201.png) +![](https://file.kamacoder.com/pics/20231030165201.png) 然后从后向前替换数字字符,也就是双指针法,过程如下:i指向新长度的末尾,j指向旧长度的末尾。 -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20231030173058.png) +![](https://file.kamacoder.com/pics/20231030173058.png) 有同学问了,为什么要从后向前填充,从前向后填充不行么? diff --git "a/problems/kamacoder/0055.\345\217\263\346\227\213\345\255\227\347\254\246\344\270\262.md" "b/problems/kamacoder/0055.\345\217\263\346\227\213\345\255\227\347\254\246\344\270\262.md" index 2b32cb44d2..48150222a7 100644 --- "a/problems/kamacoder/0055.\345\217\263\346\227\213\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/kamacoder/0055.\345\217\263\346\227\213\345\255\227\347\254\246\344\270\262.md" @@ -40,16 +40,16 @@ fgabcde 本题中,我们需要将字符串右移n位,字符串相当于分成了两个部分,如果n为2,符串相当于分成了两个部分,如图: (length为字符串长度) -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20231106170143.png) +![](https://file.kamacoder.com/pics/20231106170143.png) 右移n位, 就是将第二段放在前面,第一段放在后面,先不考虑里面字符的顺序,是不是整体倒叙不就行了。如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20231106171557.png) +![](https://file.kamacoder.com/pics/20231106171557.png) 此时第一段和第二段的顺序是我们想要的,但里面的字符位置被我们倒叙,那么此时我们在把 第一段和第二段里面的字符再倒叙一把,这样字符顺序不就正确了。 如果: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20231106172058.png) +![](https://file.kamacoder.com/pics/20231106172058.png) 其实,思路就是 通过 整体倒叙,把两段子串顺序颠倒,两个段子串里的的字符在倒叙一把,**负负得正**,这样就不影响子串里面字符的顺序了。 @@ -80,7 +80,7 @@ int main() { 可以的,不过,要记得 控制好 局部反转的长度,如果先局部反转,那么先反转的子串长度就是 len - n,如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20231106172534.png) +![](https://file.kamacoder.com/pics/20231106172534.png) 代码如下: diff --git "a/problems/kamacoder/0058.\345\214\272\351\227\264\345\222\214.md" "b/problems/kamacoder/0058.\345\214\272\351\227\264\345\222\214.md" index 23e7189a15..a6342ef8c0 100644 --- "a/problems/kamacoder/0058.\345\214\272\351\227\264\345\222\214.md" +++ "b/problems/kamacoder/0058.\345\214\272\351\227\264\345\222\214.md" @@ -93,7 +93,7 @@ int main() { 如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240627110604.png) +![](https://file.kamacoder.com/pics/20240627110604.png) 如果,我们想统计,在vec数组上 下标 2 到下标 5 之间的累加和,那是不是就用 p[5] - p[1] 就可以了。 @@ -109,7 +109,7 @@ int main() { 如图所示: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240627111319.png) +![](https://file.kamacoder.com/pics/20240627111319.png) `p[5] - p[1]` 就是 红色部分的区间和。 diff --git "a/problems/kamacoder/0094.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I-SPFA.md" "b/problems/kamacoder/0094.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I-SPFA.md" index 99986aaa2d..b592029276 100644 --- "a/problems/kamacoder/0094.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I-SPFA.md" +++ "b/problems/kamacoder/0094.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I-SPFA.md" @@ -62,7 +62,7 @@ 给大家举一个例子: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240328104119.png) +![](https://file.kamacoder.com/pics/20240328104119.png) 本图中,对所有边进行松弛,真正有效的松弛,只有松弛 边(节点1->节点2) 和 边(节点1->节点3) 。 @@ -97,7 +97,7 @@ 初始化,起点为节点1, 起点到起点的最短距离为0,所以minDist[1] 为 0。 将节点1 加入队列 (下次松弛从节点1开始) -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240411115555.png) +![](https://file.kamacoder.com/pics/20240411115555.png) ------------ @@ -109,7 +109,7 @@ 将节点2、节点3 加入队列,如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240411115544.png) +![](https://file.kamacoder.com/pics/20240411115544.png) ----------------- @@ -124,7 +124,7 @@ 将节点4,节点5 加入队列,如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240412110348.png) +![](https://file.kamacoder.com/pics/20240412110348.png) -------------------- @@ -134,7 +134,7 @@ 因为没有从节点3作为出发点的边,所以这里就从队列里取出节点3就好,不用做其他操作,如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240412110420.png) +![](https://file.kamacoder.com/pics/20240412110420.png) ------------ @@ -147,7 +147,7 @@ 如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240412110445.png) +![](https://file.kamacoder.com/pics/20240412110445.png) --------------- @@ -160,7 +160,7 @@ 如图,将节点3加入队列,因为节点6已经在队列里,所以不用重复添加 -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240729161116.png) +![](https://file.kamacoder.com/pics/20240729161116.png) 所以我们在加入队列的过程可以有一个优化,**用visited数组记录已经在队列里的元素,已经在队列的元素不用重复加入** @@ -174,7 +174,7 @@ 所以直接从队列中取出,如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240411115424.png) +![](https://file.kamacoder.com/pics/20240411115424.png) ---------- @@ -264,7 +264,7 @@ int main() { 至于为什么 双向图且每一个节点和所有其他节点都相连的话,每个节点 都有 n-1 条指向该节点的边, 我再来举个例子,如图: -[](https://code-thinking-1253855093.file.myqcloud.com/pics/20240416104138.png) +[](https://file.kamacoder.com/pics/20240416104138.png) 图中 每个节点都与其他所有节点相连,节点数n 为 4,每个节点都有3条指向该节点的边,即入度为3。 @@ -329,7 +329,7 @@ SPFA(队列优化版Bellman_ford) 在理论上 时间复杂度更胜一筹 如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240412111849.png) +![](https://file.kamacoder.com/pics/20240412111849.png) 正权回路 就是有环,但环的总权值为正数。 diff --git "a/problems/kamacoder/0094.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I.md" "b/problems/kamacoder/0094.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I.md" index 2afc014b7e..9edde8ace3 100644 --- "a/problems/kamacoder/0094.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I.md" +++ "b/problems/kamacoder/0094.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I.md" @@ -46,7 +46,7 @@ 1 3 5 ``` -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240509200224.png) +![](https://file.kamacoder.com/pics/20240509200224.png) ## 思路 @@ -78,7 +78,7 @@ 这里我给大家举一个例子,每条边有起点、终点和边的权值。例如一条边,节点A 到 节点B 权值为value,如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240327102620.png) +![](https://file.kamacoder.com/pics/20240327102620.png) minDist[B] 表示 到达B节点 最小权值,minDist[B] 有哪些状态可以推出来? @@ -127,7 +127,7 @@ if (minDist[B] > minDist[A] + value) minDist[B] = minDist[A] + value 如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240328104119.png) +![](https://file.kamacoder.com/pics/20240328104119.png) 其他节点对应的minDist初始化为max,因为我们要求最小距离,那么还没有计算过的节点 默认是一个最大数,这样才能更新最小距离。 @@ -150,36 +150,36 @@ if (minDist[B] > minDist[A] + value) minDist[B] = minDist[A] + value 边:节点5 -> 节点6,权值为-2 ,minDist[5] 还是默认数值max,所以不能基于 节点5 去更新节点6,如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240329113537.png) +![](https://file.kamacoder.com/pics/20240329113537.png) (在复习一下,minDist[5] 表示起点到节点5的最短距离) 边:节点1 -> 节点2,权值为1 ,minDist[2] > minDist[1] + 1 ,更新 minDist[2] = minDist[1] + 1 = 0 + 1 = 1 ,如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240329113703.png) +![](https://file.kamacoder.com/pics/20240329113703.png) 边:节点5 -> 节点3,权值为1 ,minDist[5] 还是默认数值max,所以不能基于节点5去更新节点3 如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240329113827.png) +![](https://file.kamacoder.com/pics/20240329113827.png) 边:节点2 -> 节点5,权值为2 ,minDist[5] > minDist[2] + 2 (经过上面的计算minDist[2]已经不是默认值,而是 1),更新 minDist[5] = minDist[2] + 2 = 1 + 2 = 3 ,如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240329113927.png) +![](https://file.kamacoder.com/pics/20240329113927.png) 边:节点2 -> 节点4,权值为-3 ,minDist[4] > minDist[2] + (-3),更新 minDist[4] = minDist[2] + (-3) = 1 + (-3) = -2 ,如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240329114036.png) +![](https://file.kamacoder.com/pics/20240329114036.png) 边:节点4 -> 节点6,权值为4 ,minDist[6] > minDist[4] + 4,更新 minDist[6] = minDist[4] + 4 = -2 + 4 = 2 -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240329114120.png) +![](https://file.kamacoder.com/pics/20240329114120.png) 边:节点1 -> 节点3,权值为5 ,minDist[3] > minDist[1] + 5,更新 minDist[3] = minDist[1] + 5 = 0 + 5 = 5 ,如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240329114324.png) +![](https://file.kamacoder.com/pics/20240329114324.png) -------- diff --git "a/problems/kamacoder/0095.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223II.md" "b/problems/kamacoder/0095.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223II.md" index a3896b8896..5dddf45013 100644 --- "a/problems/kamacoder/0095.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223II.md" +++ "b/problems/kamacoder/0095.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223II.md" @@ -78,7 +78,7 @@ circle 我们拿题目中示例来画一个图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240705161426.png) +![](https://file.kamacoder.com/pics/20240705161426.png) 图中 节点1 到 节点4 的最短路径是多少(题目中的最低运输成本) (注意边可以为负数的) @@ -86,7 +86,7 @@ circle 而图中有负权回路: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240402103712.png) +![](https://file.kamacoder.com/pics/20240402103712.png) 那么我们在负权回路中多绕一圈,我们的最短路径 是不是就更小了 (也就是更低的运输成本) diff --git "a/problems/kamacoder/0096.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223III.md" "b/problems/kamacoder/0096.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223III.md" index eb80e048f6..37cfaee0e3 100644 --- "a/problems/kamacoder/0096.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223III.md" +++ "b/problems/kamacoder/0096.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223III.md" @@ -63,7 +63,7 @@ 本题是最多经过 k 个城市, 那么是 k + 1条边相连的节点。 这里可能有录友想不懂为什么是k + 1,来看这个图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240402115614.png) +![](https://file.kamacoder.com/pics/20240402115614.png) 图中,节点1 最多已经经过2个节点 到达节点4,那么中间是有多少条边呢,是 3 条边对吧。 @@ -195,7 +195,7 @@ int main() { 起点为节点1, 起点到起点的距离为0,所以 minDist[1] 初始化为0 ,如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240409111940.png) +![](https://file.kamacoder.com/pics/20240409111940.png) 其他节点对应的minDist初始化为max,因为我们要求最小距离,那么还没有计算过的节点 默认是一个最大数,这样才能更新最小距离。 @@ -203,21 +203,21 @@ int main() { 边:节点1 -> 节点2,权值为-1 ,minDist[2] > minDist[1] + (-1),更新 minDist[2] = minDist[1] + (-1) = 0 - 1 = -1 ,如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240409111914.png) +![](https://file.kamacoder.com/pics/20240409111914.png) 边:节点2 -> 节点3,权值为1 ,minDist[3] > minDist[2] + 1 ,更新 minDist[3] = minDist[2] + 1 = -1 + 1 = 0 ,如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240409111903.png) +![](https://file.kamacoder.com/pics/20240409111903.png) 边:节点3 -> 节点1,权值为-1 ,minDist[1] > minDist[3] + (-1),更新 minDist[1] = 0 + (-1) = -1 ,如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240409111849.png) +![](https://file.kamacoder.com/pics/20240409111849.png) 边:节点3 -> 节点4,权值为1 ,minDist[4] > minDist[3] + 1,更新 minDist[4] = 0 + 1 = 1 ,如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20241018192042.png) +![](https://file.kamacoder.com/pics/20241018192042.png) 以上是对所有边进行的第一次松弛,最后 minDist数组为 :-1 -1 0 1 ,(从下标1算起) @@ -244,7 +244,7 @@ int main() { 在上面画图距离中,对所有边进行第一次松弛,在计算 边(节点2 -> 节点3) 的时候,更新了 节点3。 -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240409111903.png) +![](https://file.kamacoder.com/pics/20240409111903.png) 理论上来说节点3 应该在对所有边第二次松弛的时候才更新。 这因为当时是基于已经计算好的 节点2(minDist[2])来做计算了。 @@ -331,11 +331,11 @@ int main() { 所构成是图是一样的,都是如下的这个图,但给出的边的顺序是不一样的。 -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240410154340.png) +![](https://file.kamacoder.com/pics/20240410154340.png) 再用版本一的代码是运行一下,发现结果输出是 1, 是对的。 -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240410154940.png) +![](https://file.kamacoder.com/pics/20240410154940.png) 分明刚刚输出的结果是 -2,是错误的,怎么 一样的图,这次输出的结果就对了呢? @@ -345,7 +345,7 @@ int main() { 初始化: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240410155545.png) +![](https://file.kamacoder.com/pics/20240410155545.png) 边:节点3 -> 节点1,权值为-1 ,节点3还没有被计算过,节点1 不更新。 @@ -355,7 +355,7 @@ int main() { 边:节点1 -> 节点2,权值为 -1 ,minDist[2] > minDist[1] + (-1),更新 minDist[2] = 0 + (-1) = -1 ,如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240410160046.png) +![](https://file.kamacoder.com/pics/20240410160046.png) 以上是对所有边 松弛一次的状态。 @@ -472,7 +472,7 @@ int main() { 但大家会发现,以上代码大家提交后,怎么耗时这么多? -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240418113308.png) +![](https://file.kamacoder.com/pics/20240418113308.png) 理论上,SPFA的时间复杂度不是要比 bellman_ford 更优吗? @@ -554,7 +554,7 @@ int main() { 以上代码提交后,耗时情况: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240418113952.png) +![](https://file.kamacoder.com/pics/20240418113952.png) 大家发现 依然远比 bellman_ford 的代码版本 耗时高。 @@ -579,11 +579,11 @@ dijkstra 是贪心的思路 每一次搜索都只会找距离源点最近的非 在以下这个图中,求节点1 到 节点7 最多经过2个节点 的最短路是多少呢? -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240508112249.png) +![](https://file.kamacoder.com/pics/20240508112249.png) 最短路显然是: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240508112416.png) +![](https://file.kamacoder.com/pics/20240508112416.png) 最多经过2个节点,也就是3条边相连的路线:节点1 -> 节点2 -> 节点6-> 节点7 @@ -591,24 +591,24 @@ dijkstra 是贪心的思路 每一次搜索都只会找距离源点最近的非 初始化如图所示: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240130115306.png) +![](https://file.kamacoder.com/pics/20240130115306.png) 找距离源点最近且没有被访问过的节点,先找节点1 -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240130115421.png) +![](https://file.kamacoder.com/pics/20240130115421.png) 距离源点最近且没有被访问过的节点,找节点2: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240130121240.png) +![](https://file.kamacoder.com/pics/20240130121240.png) 距离源点最近且没有被访问过的节点,找到节点3: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240130120434.png) +![](https://file.kamacoder.com/pics/20240130120434.png) 距离源点最近且没有被访问过的节点,找到节点4: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240201105335.png) +![](https://file.kamacoder.com/pics/20240201105335.png) 此时最多经过2个节点的搜索就完毕了,但结果中minDist[7] (即节点7的结果)并没有被更。 diff --git "a/problems/kamacoder/0097.\345\260\217\346\230\216\351\200\233\345\205\254\345\233\255.md" "b/problems/kamacoder/0097.\345\260\217\346\230\216\351\200\233\345\205\254\345\233\255.md" index dfbd6aa9a8..97765ebc7b 100644 --- "a/problems/kamacoder/0097.\345\260\217\346\230\216\351\200\233\345\205\254\345\233\255.md" +++ "b/problems/kamacoder/0097.\345\260\217\346\230\216\351\200\233\345\205\254\345\233\255.md" @@ -155,7 +155,7 @@ grid[i][j][k] = m,表示 节点i 到 节点j 以[1...k] 集合为中间节点 grid数组是一个三维数组,那么我们初始化的数据在 i 与 j 构成的平层,如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240425104247.png) +![](https://file.kamacoder.com/pics/20240425104247.png) 红色的 底部一层是我们初始化好的数据,注意:从三维角度去看初始化的数据很重要,下面我们在聊遍历顺序的时候还会再讲。 @@ -202,7 +202,7 @@ vector>> grid(n + 1, vector>(n + 1, vector(n 所以遍历k 的for循环一定是在最外面,这样才能一层一层去遍历。如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240424120109.png) +![](https://file.kamacoder.com/pics/20240424120109.png) 至于遍历 i 和 j 的话,for 循环的先后顺序无所谓。 @@ -234,7 +234,7 @@ for (int i = 1; i <= n; i++) { 此时就遍历了 j 与 k 形成一个平面,i 则是纵面,那遍历 就是这样的: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240424115827.png) +![](https://file.kamacoder.com/pics/20240424115827.png) 而我们初始化的数据 是 k 为0, i 和 j 形成的平面做初始化,如果以 k 和 j 形成的平面去一层一层遍历,就造成了 递推公式 用不上上一轮计算的结果,从而导致结果不对(初始化的部分是 i 与j 形成的平面,在初始部分有讲过)。 @@ -253,7 +253,7 @@ for (int i = 1; i <= n; i++) { 就是图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240424120942.png) +![](https://file.kamacoder.com/pics/20240424120942.png) 求节点1 到 节点 2 的最短距离,运行结果是 10 ,但正确的结果很明显是3。 @@ -267,7 +267,7 @@ for (int i = 1; i <= n; i++) { 而遍历k 的for循环如果放在中间呢,同样是 j 与k 行程一个平面,i 是纵面,遍历的也是这样: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240424115827.png) +![](https://file.kamacoder.com/pics/20240424115827.png) 同样不能完全用上初始化 和 上一层计算的结果。 @@ -283,7 +283,7 @@ for (int i = 1; i <= n; i++) { 图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240425112636.png) +![](https://file.kamacoder.com/pics/20240425112636.png) 求 节点1 到节点3 的最短距离,如果k循环放中间,程序的运行结果是 -1,也就是不能到达节点3。 diff --git "a/problems/kamacoder/0098.\346\211\200\346\234\211\345\217\257\350\276\276\350\267\257\345\276\204.md" "b/problems/kamacoder/0098.\346\211\200\346\234\211\345\217\257\350\276\276\350\267\257\345\276\204.md" index 4df53b448f..2f0dcdcc87 100644 --- "a/problems/kamacoder/0098.\346\211\200\346\234\211\345\217\257\350\276\276\350\267\257\345\276\204.md" +++ "b/problems/kamacoder/0098.\346\211\200\346\234\211\345\217\257\350\276\276\350\267\257\345\276\204.md" @@ -43,7 +43,7 @@ 提示信息 -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240514103953.png) +![](https://file.kamacoder.com/pics/20240514103953.png) 用例解释: @@ -141,7 +141,7 @@ while (m--) { 我在 [图论理论基础篇](./图论理论基础.md) 举了一个例子: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240223103713.png) +![](https://file.kamacoder.com/pics/20240223103713.png) 这里表达的图是: diff --git "a/problems/kamacoder/0099.\345\262\233\345\261\277\347\232\204\346\225\260\351\207\217\345\271\277\346\220\234.md" "b/problems/kamacoder/0099.\345\262\233\345\261\277\347\232\204\346\225\260\351\207\217\345\271\277\346\220\234.md" index f8c36a00a8..0da2f315a1 100644 --- "a/problems/kamacoder/0099.\345\262\233\345\261\277\347\232\204\346\225\260\351\207\217\345\271\277\346\220\234.md" +++ "b/problems/kamacoder/0099.\345\262\233\345\261\277\347\232\204\346\225\260\351\207\217\345\271\277\346\220\234.md" @@ -35,7 +35,7 @@ 提示信息 -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240516111613.png) +![](https://file.kamacoder.com/pics/20240516111613.png) 根据测试案例中所展示,岛屿数量共有 3 个,所以输出 3。 @@ -50,7 +50,7 @@ 也就是说斜角度链接是不算了, 例如示例二,是三个岛屿,如图: -![图一](https://code-thinking-1253855093.file.myqcloud.com/pics/20220726094200.png) +![图一](https://file.kamacoder.com/pics/20220726094200.png) 这道题题目是 DFS,BFS,并查集,基础题目。 @@ -72,7 +72,7 @@ 如果从队列拿出节点,再去标记这个节点走过,就会发生下图所示的结果,会导致很多节点重复加入队列。 -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20250124094043.png) +![](https://file.kamacoder.com/pics/20250124094043.png) 超时写法 (从队列中取出节点再标记,注意代码注释的地方) diff --git "a/problems/kamacoder/0099.\345\262\233\345\261\277\347\232\204\346\225\260\351\207\217\346\267\261\346\220\234.md" "b/problems/kamacoder/0099.\345\262\233\345\261\277\347\232\204\346\225\260\351\207\217\346\267\261\346\220\234.md" index 5a21f387fc..06be926874 100644 --- "a/problems/kamacoder/0099.\345\262\233\345\261\277\347\232\204\346\225\260\351\207\217\346\267\261\346\220\234.md" +++ "b/problems/kamacoder/0099.\345\262\233\345\261\277\347\232\204\346\225\260\351\207\217\346\267\261\346\220\234.md" @@ -36,7 +36,7 @@ 提示信息 -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240516111613.png) +![](https://file.kamacoder.com/pics/20240516111613.png) 根据测试案例中所展示,岛屿数量共有 3 个,所以输出 3。 @@ -50,7 +50,7 @@ 也就是说斜角度链接是不算了, 例如示例二,是三个岛屿,如图: -![图一](https://code-thinking-1253855093.file.myqcloud.com/pics/20220726094200.png) +![图一](https://file.kamacoder.com/pics/20220726094200.png) 这道题题目是 DFS,BFS,并查集,基础题目。 diff --git "a/problems/kamacoder/0100.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" "b/problems/kamacoder/0100.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" index 170c0917aa..f2b9b901d1 100644 --- "a/problems/kamacoder/0100.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" +++ "b/problems/kamacoder/0100.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" @@ -33,7 +33,7 @@ 提示信息 -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240517103410.png) +![](https://file.kamacoder.com/pics/20240517103410.png) 样例输入中,岛屿的最大面积为 4。 @@ -48,7 +48,7 @@ 也就是说斜角度链接是不算了, 例如示例二,是三个岛屿,如图: -![图一](https://code-thinking-1253855093.file.myqcloud.com/pics/20220726094200.png) +![图一](https://file.kamacoder.com/pics/20220726094200.png) 这道题目也是 dfs bfs基础类题目,就是搜索每个岛屿上“1”的数量,然后取一个最大的。 diff --git "a/problems/kamacoder/0101.\345\255\244\345\262\233\347\232\204\346\200\273\351\235\242\347\247\257.md" "b/problems/kamacoder/0101.\345\255\244\345\262\233\347\232\204\346\200\273\351\235\242\347\247\257.md" index 43ac8ec96d..c8fe372cd9 100644 --- "a/problems/kamacoder/0101.\345\255\244\345\262\233\347\232\204\346\200\273\351\235\242\347\247\257.md" +++ "b/problems/kamacoder/0101.\345\255\244\345\262\233\347\232\204\346\200\273\351\235\242\347\247\257.md" @@ -37,7 +37,7 @@ 提示信息: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240517105557.png) +![](https://file.kamacoder.com/pics/20240517105557.png) 在矩阵中心部分的岛屿,因为没有任何一个单元格接触到矩阵边缘,所以该岛屿属于孤岛,总面积为 1。 @@ -54,11 +54,11 @@ 如图,在遍历地图周围四个边,靠地图四边的陆地,都为绿色, -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20220830104632.png) +![](https://file.kamacoder.com/pics/20220830104632.png) 在遇到地图周边陆地的时候,将1都变为0,此时地图为这样: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20220830104651.png) +![](https://file.kamacoder.com/pics/20220830104651.png) 然后我们再去遍历这个地图,遇到有陆地的地方,去采用深搜或者广搜,边统计所有陆地。 diff --git "a/problems/kamacoder/0102.\346\262\211\346\262\241\345\255\244\345\262\233.md" "b/problems/kamacoder/0102.\346\262\211\346\262\241\345\255\244\345\262\233.md" index 5e211cd09c..265ec31f73 100644 --- "a/problems/kamacoder/0102.\346\262\211\346\262\241\345\255\244\345\262\233.md" +++ "b/problems/kamacoder/0102.\346\262\211\346\262\241\345\255\244\345\262\233.md" @@ -43,11 +43,11 @@ 提示信息: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240517110932.png) +![](https://file.kamacoder.com/pics/20240517110932.png) 将孤岛沉没: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240517110953.png) +![](https://file.kamacoder.com/pics/20240517110953.png) 数据范围: @@ -73,7 +73,7 @@ 如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240517113813.png) +![](https://file.kamacoder.com/pics/20240517113813.png) 整体C++代码如下,以下使用dfs实现,其实遍历方式dfs,bfs都是可以的。 diff --git "a/problems/kamacoder/0103.\346\260\264\346\265\201\351\227\256\351\242\230.md" "b/problems/kamacoder/0103.\346\260\264\346\265\201\351\227\256\351\242\230.md" index 1c646b1c03..5924cb18a9 100644 --- "a/problems/kamacoder/0103.\346\260\264\346\265\201\351\227\256\351\242\230.md" +++ "b/problems/kamacoder/0103.\346\260\264\346\265\201\351\227\256\351\242\230.md" @@ -48,7 +48,7 @@ 提示信息: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240517115816.png) +![](https://file.kamacoder.com/pics/20240517115816.png) 图中的蓝色方块上的雨水既能流向第一组边界,也能流向第二组边界。所以最终答案为所有蓝色方块的坐标。 @@ -166,11 +166,11 @@ int main() { 从第一组边界边上节点出发,如图: (图中并没有把所有遍历的方向都画出来,只画关键部分) -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20250304174747.png) +![](https://file.kamacoder.com/pics/20250304174747.png) 从第二组边界上节点出发,如图: (图中并没有把所有遍历的方向都画出来,只画关键部分) -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20250304174801.png) +![](https://file.kamacoder.com/pics/20250304174801.png) 最后,我们得到两个方向交界的这些节点,就是我们最后要求的节点。 diff --git "a/problems/kamacoder/0104.\345\273\272\351\200\240\346\234\200\345\244\247\345\262\233\345\261\277.md" "b/problems/kamacoder/0104.\345\273\272\351\200\240\346\234\200\345\244\247\345\262\233\345\261\277.md" index 5f091779d1..483d777275 100644 --- "a/problems/kamacoder/0104.\345\273\272\351\200\240\346\234\200\345\244\247\345\262\233\345\261\277.md" +++ "b/problems/kamacoder/0104.\345\273\272\351\200\240\346\234\200\345\244\247\345\262\233\345\261\277.md" @@ -35,12 +35,12 @@ 提示信息 -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240522154055.png) +![](https://file.kamacoder.com/pics/20240522154055.png) 对于上面的案例,有两个位置可将 0 变成 1,使得岛屿的面积最大,即 6。 -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240522154110.png) +![](https://file.kamacoder.com/pics/20240522154110.png) 数据范围: @@ -70,11 +70,11 @@ 拿如下地图的岛屿情况来举例: (1为陆地) -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20220829104834.png) +![](https://file.kamacoder.com/pics/20220829104834.png) 第一步,则遍历地图,并将岛屿的编号和面积都统计好,过程如图所示: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20220829105644.png) +![](https://file.kamacoder.com/pics/20220829105644.png) 本过程代码如下: @@ -121,7 +121,7 @@ int largestIsland(vector>& grid) { 第二步过程如图所示: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20220829105249.png) +![](https://file.kamacoder.com/pics/20220829105249.png) 也就是遍历每一个0的方格,并统计其相邻岛屿面积,最后取一个最大值。 diff --git "a/problems/kamacoder/0105.\346\234\211\345\220\221\345\233\276\347\232\204\345\256\214\345\205\250\345\217\257\350\276\276\346\200\247.md" "b/problems/kamacoder/0105.\346\234\211\345\220\221\345\233\276\347\232\204\345\256\214\345\205\250\345\217\257\350\276\276\346\200\247.md" index 6901c655e4..cfe77c0d38 100644 --- "a/problems/kamacoder/0105.\346\234\211\345\220\221\345\233\276\347\232\204\345\256\214\345\205\250\345\217\257\350\276\276\346\200\247.md" +++ "b/problems/kamacoder/0105.\346\234\211\345\220\221\345\233\276\347\232\204\345\256\214\345\205\250\345\217\257\350\276\276\346\200\247.md" @@ -33,7 +33,7 @@ 【提示信息】 -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240522174707.png) +![](https://file.kamacoder.com/pics/20240522174707.png) 从 1 号节点可以到达任意节点,输出 1。 @@ -48,7 +48,7 @@ 接下来我们再画一个图,从图里可以直观看出来,节点6 是 不能到达节点1 的 -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240522175451.png) +![](https://file.kamacoder.com/pics/20240522175451.png) 这就很容易让我们想起岛屿问题,只要发现独立的岛,就是不可到达的。 diff --git "a/problems/kamacoder/0106.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" "b/problems/kamacoder/0106.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" index 91a1a438c6..a1ef2a76eb 100644 --- "a/problems/kamacoder/0106.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" +++ "b/problems/kamacoder/0106.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" @@ -37,7 +37,7 @@ 提示信息 -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240524115244.png) +![](https://file.kamacoder.com/pics/20240524115244.png) 岛屿的周长为 14。 @@ -57,14 +57,14 @@ 如果该陆地上下左右的空格是有水域,则说明是一条边,如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240524115933.png) +![](https://file.kamacoder.com/pics/20240524115933.png) 陆地的右边空格是水域,则说明找到一条边。 如果该陆地上下左右的空格出界了,则说明是一条边,如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240524120105.png) +![](https://file.kamacoder.com/pics/20240524120105.png) 该陆地的下边空格出界了,则说明找到一条边。 @@ -114,7 +114,7 @@ int main() { 因为有一对相邻两个陆地,边的总数就要减2,如图红线部分,有两个陆地相邻,总边数就要减2 -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240524120855.png) +![](https://file.kamacoder.com/pics/20240524120855.png) 那么只需要在计算出相邻岛屿的数量就可以了,相邻岛屿数量为cover。 diff --git "a/problems/kamacoder/0107.\345\257\273\346\211\276\345\255\230\345\234\250\347\232\204\350\267\257\345\276\204.md" "b/problems/kamacoder/0107.\345\257\273\346\211\276\345\255\230\345\234\250\347\232\204\350\267\257\345\276\204.md" index 779907c8fd..363a188465 100644 --- "a/problems/kamacoder/0107.\345\257\273\346\211\276\345\255\230\345\234\250\347\232\204\350\267\257\345\276\204.md" +++ "b/problems/kamacoder/0107.\345\257\273\346\211\276\345\255\230\345\234\250\347\232\204\350\267\257\345\276\204.md" @@ -40,7 +40,7 @@ 提示信息 -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240527104432.png) +![](https://file.kamacoder.com/pics/20240527104432.png) 数据范围: diff --git "a/problems/kamacoder/0108.\345\206\227\344\275\231\350\277\236\346\216\245.md" "b/problems/kamacoder/0108.\345\206\227\344\275\231\350\277\236\346\216\245.md" index ae247ac025..fe641f53c9 100644 --- "a/problems/kamacoder/0108.\345\206\227\344\275\231\350\277\236\346\216\245.md" +++ "b/problems/kamacoder/0108.\345\206\227\344\275\231\350\277\236\346\216\245.md" @@ -9,11 +9,11 @@ 有一个图,它是一棵树,他是拥有 n 个节点(节点编号1到n)和 n - 1 条边的连通无环无向图(其实就是一个线形图),如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240905163122.png) +![](https://file.kamacoder.com/pics/20240905163122.png) 现在在这棵树上的基础上,添加一条边(依然是n个节点,但有n条边),使这个图变成了有环图,如图 -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240905164721.png) +![](https://file.kamacoder.com/pics/20240905164721.png) 先请你找出冗余边,删除后,使该图可以重新变成一棵树。 @@ -42,7 +42,7 @@ 提示信息 -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240527110320.png) +![](https://file.kamacoder.com/pics/20240527110320.png) 图中的 1 2,2 3,1 3 等三条边在删除后都能使原图变为一棵合法的树。但是 1 3 由于是标准输入里最后出现的那条边,所以输出结果为 1 3 @@ -69,13 +69,13 @@ 如图所示,节点A 和节点 B 不在同一个集合,那么就可以将两个 节点连在一起。 -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20230604104720.png) +![](https://file.kamacoder.com/pics/20230604104720.png) 如果边的两个节点已经出现在同一个集合里,说明着边的两个节点已经连在一起了,再加入这条边一定就出现环了。 如图所示: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20230604104330.png) +![](https://file.kamacoder.com/pics/20230604104330.png) 已经判断 节点A 和 节点B 在在同一个集合(同一个根),如果将 节点A 和 节点B 连在一起就一定会出现环。 @@ -157,7 +157,7 @@ int main() { 图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240527110320.png) +![](https://file.kamacoder.com/pics/20240527110320.png) 输出示例 diff --git "a/problems/kamacoder/0109.\345\206\227\344\275\231\350\277\236\346\216\245II.md" "b/problems/kamacoder/0109.\345\206\227\344\275\231\350\277\236\346\216\245II.md" index 070bc68500..78132a3256 100644 --- "a/problems/kamacoder/0109.\345\206\227\344\275\231\350\277\236\346\216\245II.md" +++ "b/problems/kamacoder/0109.\345\206\227\344\275\231\350\277\236\346\216\245II.md" @@ -9,11 +9,11 @@ 有一种有向树,该树只有一个根节点,所有其他节点都是该根节点的后继。该树除了根节点之外的每一个节点都有且只有一个父节点,而根节点没有父节点。有向树拥有 n 个节点和 n - 1 条边。如图:  - + 现在有一个有向图,有向图是在有向树中的两个没有直接链接的节点中间添加一条有向边。如图: - + 输入一个有向图,该图由一个有着 n 个节点(节点编号 从 1 到 n),n 条边,请返回一条可以删除的边,使得删除该条边之后该有向图可以被当作一颗有向树。 @@ -42,7 +42,7 @@ 提示信息 - + 在删除 2 3 后有向图可以变为一棵合法的有向树,所以输出 2 3 @@ -64,13 +64,13 @@ 如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240527115807.png) +![](https://file.kamacoder.com/pics/20240527115807.png) 找到了节点3 的入度为2,删 1 -> 3 或者 2 -> 3 。选择删顺序靠后便可。 但 入度为2 还有一种情况,情况二,只能删特定的一条边,如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240527151456.png) +![](https://file.kamacoder.com/pics/20240527151456.png) 节点3 的入度为 2,但在删除边的时候,只能删 这条边(节点1 -> 节点3),如果删这条边(节点4 -> 节点3),那么删后本图也不是有向树了(因为找不到根节点)。 @@ -81,7 +81,7 @@ 如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240527120531.png) +![](https://file.kamacoder.com/pics/20240527120531.png) 对于情况三,删掉构成环的边就可以了。 diff --git "a/problems/kamacoder/0110.\345\255\227\347\254\246\344\270\262\346\216\245\351\276\231.md" "b/problems/kamacoder/0110.\345\255\227\347\254\246\344\270\262\346\216\245\351\276\231.md" index 8bae6280bf..af3436901c 100644 --- "a/problems/kamacoder/0110.\345\255\227\347\254\246\344\270\262\346\216\245\351\276\231.md" +++ "b/problems/kamacoder/0110.\345\255\227\347\254\246\344\270\262\346\216\245\351\276\231.md" @@ -57,7 +57,7 @@ yhn 2 <= N <= 500

- +

@@ -65,7 +65,7 @@ yhn 以示例1为例,从这个图中可以看出 abc 到 def的路线 不止一条,但最短的一条路径上是4个节点。 -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20250317105155.png) +![](https://file.kamacoder.com/pics/20250317105155.png) 本题只需要求出最短路径的长度就可以了,不用找出具体路径。 diff --git "a/problems/kamacoder/0117.\350\275\257\344\273\266\346\236\204\345\273\272.md" "b/problems/kamacoder/0117.\350\275\257\344\273\266\346\236\204\345\273\272.md" index 58c1776304..18802765a9 100644 --- "a/problems/kamacoder/0117.\350\275\257\344\273\266\346\236\204\345\273\272.md" +++ "b/problems/kamacoder/0117.\350\275\257\344\273\266\346\236\204\345\273\272.md" @@ -39,7 +39,7 @@ 文件依赖关系如下: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240510192157.png) +![](https://file.kamacoder.com/pics/20240510192157.png) 所以,文件处理的顺序除了示例中的顺序,还存在 @@ -104,7 +104,7 @@ 以题目中示例为例如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240510110836.png) +![](https://file.kamacoder.com/pics/20240510110836.png) 做拓扑排序的话,如果肉眼去找开头的节点,一定能找到 节点0 吧,都知道要从节点0 开始。 @@ -135,17 +135,17 @@ 1、找到入度为0 的节点,加入结果集 -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240510113110.png) +![](https://file.kamacoder.com/pics/20240510113110.png) 2、将该节点从图中移除 -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240510113142.png) +![](https://file.kamacoder.com/pics/20240510113142.png) ---------------- 1、找到入度为0 的节点,加入结果集 -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240510113345.png) +![](https://file.kamacoder.com/pics/20240510113345.png) 这里大家会发现,节点1 和 节点2 入度都为0, 选哪个呢? @@ -153,19 +153,19 @@ 2、将该节点从图中移除 -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240510113640.png) +![](https://file.kamacoder.com/pics/20240510113640.png) --------------- 1、找到入度为0 的节点,加入结果集 -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240510113853.png) +![](https://file.kamacoder.com/pics/20240510113853.png) 节点2 和 节点3 入度都为0,选哪个都行,这里选节点2 2、将该节点从图中移除 -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240510114004.png) +![](https://file.kamacoder.com/pics/20240510114004.png) -------------- @@ -177,7 +177,7 @@ 如果有 有向环怎么办呢?例如这个图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240510115115.png) +![](https://file.kamacoder.com/pics/20240510115115.png) 这个图,我们只能将入度为0 的节点0 接入结果集。 @@ -252,13 +252,13 @@ while (que.size()) { 如果这里不理解,看上面的模拟过程第一步: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240510113110.png) +![](https://file.kamacoder.com/pics/20240510113110.png) 这事节点1 和 节点2 的入度为 1。 将节点0删除后,图为这样: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240510113142.png) +![](https://file.kamacoder.com/pics/20240510113142.png) 那么 节点0 作为出发点 所连接的节点的入度 就都做了 减一 的操作。 diff --git "a/problems/kamacoder/0126.\351\252\221\345\243\253\347\232\204\346\224\273\345\207\273astar.md" "b/problems/kamacoder/0126.\351\252\221\345\243\253\347\232\204\346\224\273\345\207\273astar.md" index 8ad3264433..7d0096d52d 100644 --- "a/problems/kamacoder/0126.\351\252\221\345\243\253\347\232\204\346\224\273\345\207\273astar.md" +++ "b/problems/kamacoder/0126.\351\252\221\345\243\253\347\232\204\346\224\273\345\207\273astar.md" @@ -9,7 +9,7 @@ 骑士移动规则如图,红色是起始位置,黄色是骑士可以走的地方。 -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240626104833.png) +![](https://file.kamacoder.com/pics/20240626104833.png) 棋盘大小 1000 x 1000(棋盘的 x 和 y 坐标均在 [1, 1000] 区间内,包含边界) @@ -108,7 +108,7 @@ int main() 我们来看一下广搜的搜索过程,如图,红色是起点,绿色是终点,黄色是要遍历的点,最后从 起点 找到 达到终点的最短路径是棕色。 -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240611143712.png) +![](https://file.kamacoder.com/pics/20240611143712.png) 可以看出 广搜中,做了很多无用的遍历, 黄色的格子是广搜遍历到的点。 @@ -131,11 +131,11 @@ Astar 是一种 广搜的改良版。 有的是 Astar是 dijkstra 的改良版 在BFS中,我们想搜索,从起点到终点的最短路径,要一层一层去遍历。 -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240611143712.png) +![](https://file.kamacoder.com/pics/20240611143712.png) 如果 使用A * 的话,其搜索过程是这样的,如图,图中着色的都是我们要遍历的点。 -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240611195223.png) +![](https://file.kamacoder.com/pics/20240611195223.png) (上面两图中 最短路长度都是8,只是走的方式不同而已) diff --git "a/problems/kamacoder/\345\233\276\350\256\272\345\271\266\346\237\245\351\233\206\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/kamacoder/\345\233\276\350\256\272\345\271\266\346\237\245\351\233\206\347\220\206\350\256\272\345\237\272\347\241\200.md" index e463b95600..5eb5127a93 100644 --- "a/problems/kamacoder/\345\233\276\350\256\272\345\271\266\346\237\245\351\233\206\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/kamacoder/\345\233\276\350\256\272\345\271\266\346\237\245\351\233\206\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -105,13 +105,13 @@ bool isSame(int u, int v) { 搜索过程像是一个多叉树中从叶子到根节点的过程,如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20230602102619.png) +![](https://file.kamacoder.com/pics/20230602102619.png) 如果这棵多叉树高度很深的话,每次find函数 去寻找根的过程就要递归很多次。 我们的目的只需要知道这些节点在同一个根下就可以,所以对这棵多叉树的构造只需要这样就可以了,如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20230602103040.png) +![](https://file.kamacoder.com/pics/20230602103040.png) 除了根节点其他所有节点都挂载根节点下,这样我们在寻根的时候就很快,只需要一步, @@ -226,7 +226,7 @@ join(3, 2); 此时构成的图是这样的: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20230525111307.png) +![](https://file.kamacoder.com/pics/20230525111307.png) 此时问 1,3是否在同一个集合,我们调用 `join(1, 2); join(3, 2);` 很明显本意要表示 1,3是在同一个集合。 @@ -256,7 +256,7 @@ join(3, 2); 构成的图是这样的: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20230525112101.png) +![](https://file.kamacoder.com/pics/20230525112101.png) 因为在join函数里,我们有find函数进行寻根的过程,这样就保证元素 1,2,3在这个有向图里是强连通的。 @@ -275,12 +275,12 @@ join(3, 2); 1、`join(1, 8);` -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20231122112727.png) +![](https://file.kamacoder.com/pics/20231122112727.png) 2、`join(3, 8);` -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20231122113857.png) +![](https://file.kamacoder.com/pics/20231122113857.png) 有录友可能想,`join(3, 8)` 在图中为什么 将 元素1 连向元素 3 而不是将 元素 8 连向 元素 3 呢? @@ -288,12 +288,12 @@ join(3, 2); 3、`join(1, 7);` -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20231122114108.png) +![](https://file.kamacoder.com/pics/20231122114108.png) 4、`join(8, 5);` -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20231122114847.png) +![](https://file.kamacoder.com/pics/20231122114847.png) 这里8的根是3,那么 5 应该指向 8 的根 3,这里的原因,我们在上面「常见误区」已经讲过了。 但 为什么 图中 8 又直接指向了 3 了呢? @@ -310,11 +310,11 @@ int find(int u) { 5、`join(2, 9);` -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20231122115000.png) +![](https://file.kamacoder.com/pics/20231122115000.png) 6、`join(6, 9);` -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20231122115404.png) +![](https://file.kamacoder.com/pics/20231122115404.png) 这里为什么是 2 指向了 6,因为 9的根为 2,所以用2指向6。 @@ -347,13 +347,13 @@ rank表示树的高度,即树中结点层次的最大值。 例如两个集合(多叉树)需要合并,如图所示: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20230602172250.png) +![](https://file.kamacoder.com/pics/20230602172250.png) 树1 rank 为2,树2 rank 为 3。那么合并两个集合,是 树1 合入 树2,还是 树2 合入 树1呢? 我们来看两个不同方式合入的效果。 -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20230602172933.png) +![](https://file.kamacoder.com/pics/20230602172933.png) 这里可以看出,树2 合入 树1 会导致整棵树的高度变的更高,而 树1 合入 树2 整棵树的高度 和 树2 保持一致。 diff --git "a/problems/kamacoder/\345\233\276\350\256\272\345\271\277\346\220\234\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/kamacoder/\345\233\276\350\256\272\345\271\277\346\220\234\347\220\206\350\256\272\345\237\272\347\241\200.md" index d791d2c0ff..96e313fc42 100644 --- "a/problems/kamacoder/\345\233\276\350\256\272\345\271\277\346\220\234\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/kamacoder/\345\233\276\350\256\272\345\271\277\346\220\234\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -18,11 +18,11 @@ 我们用一个方格地图,假如每次搜索的方向为 上下左右(不包含斜上方),那么给出一个start起始位置,那么BFS就是从四个方向走出第一步。 -![图一](https://code-thinking-1253855093.file.myqcloud.com/pics/20220825104505.png) +![图一](https://file.kamacoder.com/pics/20220825104505.png) 如果加上一个end终止位置,那么使用BFS的搜索过程如图所示: -![图二](https://code-thinking-1253855093.file.myqcloud.com/pics/20220825102653.png) +![图二](https://file.kamacoder.com/pics/20220825102653.png) 我们从图中可以看出,从start起点开始,是一圈一圈,向外搜索,方格编号1为第一步遍历的节点,方格编号2为第二步遍历的节点,第四步的时候我们找到终止点end。 @@ -30,7 +30,7 @@ 而且地图还可以有障碍,如图所示: -![图三](https://code-thinking-1253855093.file.myqcloud.com/pics/20220825103900.png) +![图三](https://file.kamacoder.com/pics/20220825103900.png) 在第五步,第六步 我只把关键的节点染色了,其他方向周边没有去染色,大家只要关注关键地方染色的逻辑就可以。 diff --git "a/problems/kamacoder/\345\233\276\350\256\272\346\267\261\346\220\234\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/kamacoder/\345\233\276\350\256\272\346\267\261\346\220\234\347\220\206\350\256\272\345\237\272\347\241\200.md" index ce3dbbdbe7..1611e00aa0 100644 --- "a/problems/kamacoder/\345\233\276\350\256\272\346\267\261\346\220\234\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/kamacoder/\345\233\276\350\256\272\346\267\261\346\220\234\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -28,29 +28,29 @@ 如图一,是一个无向图,我们要搜索从节点1到节点6的所有路径。 -![图一](https://code-thinking-1253855093.file.myqcloud.com/pics/20220707093643.png) +![图一](https://file.kamacoder.com/pics/20220707093643.png) 那么dfs搜索的第一条路径是这样的: (假设第一次延默认方向,就找到了节点6),图二 -![图二](https://code-thinking-1253855093.file.myqcloud.com/pics/20220707093807.png) +![图二](https://file.kamacoder.com/pics/20220707093807.png) 此时我们找到了节点6,(遇到黄河了,是不是应该回头了),那么应该再去搜索其他方向了。 如图三: -![图三](https://code-thinking-1253855093.file.myqcloud.com/pics/20220707094011.png) +![图三](https://file.kamacoder.com/pics/20220707094011.png) 路径2撤销了,改变了方向,走路径3(红色线), 接着也找到终点6。 那么撤销路径2,改为路径3,在dfs中其实就是回溯的过程(这一点很重要,很多录友不理解dfs代码中回溯是用来干什么的) 又找到了一条从节点1到节点6的路径,又到黄河了,此时再回头,下图图四中,路径4撤销(回溯的过程),改为路径5。 -![图四](https://code-thinking-1253855093.file.myqcloud.com/pics/20220707094322.png) +![图四](https://file.kamacoder.com/pics/20220707094322.png) 又找到了一条从节点1到节点6的路径,又到黄河了,此时再回头,下图图五,路径6撤销(回溯的过程),改为路径7,路径8 和 路径7,路径9, 结果发现死路一条,都走到了自己走过的节点。 -![图五](https://code-thinking-1253855093.file.myqcloud.com/pics/20220707094813.png) +![图五](https://file.kamacoder.com/pics/20220707094813.png) 那么节点2所连接路径和节点3所链接的路径 都走过了,撤销路径只能向上回退,去选择撤销当初节点4的选择,也就是撤销路径5,改为路径10 。 如图图六: -![图六](https://code-thinking-1253855093.file.myqcloud.com/pics/20220707095232.png) +![图六](https://file.kamacoder.com/pics/20220707095232.png) 上图演示中,其实我并没有把 所有的 从节点1 到节点6的dfs(深度优先搜索)的过程都画出来,那样太冗余了,但 已经把dfs 关键的地方都涉及到了,关键就两点: @@ -180,7 +180,7 @@ for (选择:本节点所连接的其他节点) { 如图七所示, 路径2 已经走到了 目的地节点6,那么 路径2 是如何撤销,然后改为 路径3呢? 其实这就是 回溯的过程,撤销路径2,走换下一个方向。 -![图七](https://code-thinking-1253855093.file.myqcloud.com/pics/20220708093544.png) +![图七](https://file.kamacoder.com/pics/20220708093544.png) ## 总结 diff --git "a/problems/kamacoder/\345\233\276\350\256\272\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/kamacoder/\345\233\276\350\256\272\347\220\206\350\256\272\345\237\272\347\241\200.md" index 84f693a00b..9bec322765 100644 --- "a/problems/kamacoder/\345\233\276\350\256\272\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/kamacoder/\345\233\276\350\256\272\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -17,15 +17,15 @@ 有向图是指 图中边是有方向的: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240510195737.png) +![](https://file.kamacoder.com/pics/20240510195737.png) 无向图是指 图中边没有方向: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240510195451.png) +![](https://file.kamacoder.com/pics/20240510195451.png) 加权有向图,就是图中边是有权值的,例如: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240510195821.png) +![](https://file.kamacoder.com/pics/20240510195821.png) 加权无向图也是同理。 @@ -35,7 +35,7 @@ 例如,该无向图中,节点4的度为5,节点6的度为3。 -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240511115029.png) +![](https://file.kamacoder.com/pics/20240511115029.png) 在有向图中,每个节点有出度和入度。 @@ -45,7 +45,7 @@ 例如,该有向图中,节点3的入度为2,出度为1,节点1的入度为0,出度为2。 -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240511115235.png) +![](https://file.kamacoder.com/pics/20240511115235.png) ## 连通性 @@ -56,11 +56,11 @@ 在无向图中,任何两个节点都是可以到达的,我们称之为连通图 ,如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240511102351.png) +![](https://file.kamacoder.com/pics/20240511102351.png) 如果有节点不能到达其他节点,则为非连通图,如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240511102449.png) +![](https://file.kamacoder.com/pics/20240511102449.png) 节点1 不能到达节点4。 @@ -72,7 +72,7 @@ 我们来看这个有向图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240511104531.png) +![](https://file.kamacoder.com/pics/20240511104531.png) 这个图是强连通图吗? @@ -82,7 +82,7 @@ 下面这个有向图才是强连通图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240511113101.png) +![](https://file.kamacoder.com/pics/20240511113101.png) ### 连通分量 @@ -91,7 +91,7 @@ 只看概念大家可能不理解,我来画个图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240511111559.png) +![](https://file.kamacoder.com/pics/20240511111559.png) 该无向图中 节点1、节点2、节点5 构成的子图就是 该无向图中的一个连通分量,该子图所有节点都是相互可达到的。 @@ -111,7 +111,7 @@ 如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240511112951.png) +![](https://file.kamacoder.com/pics/20240511112951.png) 节点1、节点2、节点3、节点4、节点5 构成的子图是强连通分量,因为这是强连通图,也是极大图。 @@ -132,11 +132,11 @@ 例如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240511112951.png) +![](https://file.kamacoder.com/pics/20240511112951.png) 图中有8条边,我们就定义 8 * 2的数组,即有n条边就申请n * 2,这么大的数组: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20250110114348.png) +![](https://file.kamacoder.com/pics/20250110114348.png) 数组第一行:6 7,就表示节点6 指向 节点7,以此类推。 @@ -162,7 +162,7 @@ 如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240222110025.png) +![](https://file.kamacoder.com/pics/20240222110025.png) 在一个 n (节点数)为8 的图中,就需要申请 8 * 8 这么大的空间。 @@ -188,7 +188,7 @@ 邻接表的构造如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240223103713.png) +![](https://file.kamacoder.com/pics/20240223103713.png) 这里表达的图是: diff --git "a/problems/kamacoder/\346\234\200\347\237\255\350\267\257\351\227\256\351\242\230\346\200\273\347\273\223\347\257\207.md" "b/problems/kamacoder/\346\234\200\347\237\255\350\267\257\351\227\256\351\242\230\346\200\273\347\273\223\347\257\207.md" index 54f9153900..e83880dab1 100644 --- "a/problems/kamacoder/\346\234\200\347\237\255\350\267\257\351\227\256\351\242\230\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/kamacoder/\346\234\200\347\237\255\350\267\257\351\227\256\351\242\230\346\200\273\347\273\223\347\257\207.md" @@ -17,7 +17,7 @@ 最短路算法比较复杂,而且各自有各自的应用场景,我来用一张表把讲过的最短路算法的使用场景都展现出来: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240508121355.png) +![](https://file.kamacoder.com/pics/20240508121355.png) (因为A * 属于启发式搜索,和上面最短路算法并不是一类,不适合一起对比,所以没有放在一起) diff --git a/problems/qita/acm.md b/problems/qita/acm.md index 999283564a..33dcd8a652 100644 --- a/problems/qita/acm.md +++ b/problems/qita/acm.md @@ -11,15 +11,15 @@ [知识星球](https://programmercarl.com/other/kstar.html)里很多录友的日常打卡中,都表示被 ACM模式折磨过: -
+
-
+
-
+
-
+
-
+
所以我正式推出:**卡码网**([https://kamacoder.com](https://kamacoder.com)),**专门帮助大家练习ACM模式**。 @@ -43,17 +43,17 @@ 来看看这极简的界面,没有烂七八糟的功能,只有刷题! -
+
在「状态」这里可以看到 大家提交的代码和判题记录,目前卡码网([https://kamacoder.com](https://kamacoder.com))几乎无时无刻都有卡友在提交代码。 看看大家周六晚上都在做什么,刷哪些题目。 -
+
提交代码的界面是这样的,**目前支持所有主流刷题语言**。 -
+
## 题解 @@ -63,7 +63,7 @@ [https://github.com/youngyangyang04/kamacoder-solutions](https://github.com/youngyangyang04/kamacoder-solutions) -
+
**欢迎去Github上star,欢迎fork,也欢迎来Github仓库贡献其他语言版本,成为contributor**。 @@ -71,7 +71,7 @@ 目前已经有两位录友贡献C和Java版本了。 -
+
期待在Github(https://github.com/youngyangyang04/kamacoder-solutions) 的contributors上也出现你的头像。 diff --git a/problems/qita/join.md b/problems/qita/join.md index c7e17588bf..027b81726a 100644 --- a/problems/qita/join.md +++ b/problems/qita/join.md @@ -28,10 +28,10 @@ 点击这里Fetch upstream。 -
+
点击之后,这里就会显示最新的信息了 -
+
注意这时是你的远端仓库为最新版本,本地还不是最新的,本地要git pull一下。 @@ -39,18 +39,18 @@ 如何提交代码呢,首先把自己的代码提交到自己的fork的远端仓库中,然后open pull request,如图: -
+
点击 open pull request之后,就是如下画面,一个pull request有多个commit。 -
+
然后就是给pull request 添加备注,pull request是对本次commit的一个总结。如果一个pull request就一个commit,那么就和commit的备注保持一次。 然后点击 create pull request 就可以了 -
+
此时你就提交成功了,我会在项目中的pull requests 处理列表里看到你的请求。 -
+
然后如果你发现自己的代码没有合入多半是有问题,如果有问题都有会在pull request里给出留言的, @@ -78,27 +78,27 @@ C++代码 \`\`\` 例如这个commit,在添加java代码的时候,就直接添加代码 -
+
正确的格式应该是这样: -
+
一般发现问题,我也会在代码中给出评论: -
+
这样大家也可以学习一些 提交代码的规范方面的知识 有的录友 是添加的代码块语法,但没有标记是哪种语言,这样的话 代码就不会针对某种语言高亮显示了,也比较影响阅读,例如: -
+
提交python代码的话,要注释好,是python2还是python3 例如这样: -
+
当然python2的话,只这么写就行 @@ -113,7 +113,7 @@ python代码 有的录友是一个pull request 里只有一个commit。 -
+
其实如果大家是平时一天写了两三道题目的话,那么分三个commit,一个pull request提交上来就行。 @@ -127,13 +127,13 @@ python代码 例如这位录友,在提交Java代码的时候,按照题解的意思对Java版本的代码进行的注释,这就很棒👍 -
+
-
+
当然如果大家感觉 已有的代码 不符合以上要求的话,例如 代码思路不够清晰不够规范,注释不够友好,依然欢迎提交优化代码,要记得详细注释哦。 -
+
### 说明具体是哪种方法 @@ -141,10 +141,10 @@ python代码 下面这位录友做的就很好 -
+
-
+
有的题解,是一起给出了多道题目的讲解,例如项目中0102.二叉树的层序遍历.md 中有八道题目,那么大家添加代码的时候 应该在代码注释上,或者 直接写上 是哪个题目的代码。 @@ -162,7 +162,7 @@ python代码 有一位录友在提交代码的时候会把之前的代码 做一下规范性的调整,这就很棒。 -
+
**代码规范从你我做起!** @@ -183,10 +183,10 @@ python代码 在合入的过程中还要处理冲突的代码, 理解大家代码的思路,解决冲突,然后在力扣提交一下,确保是没问题。 例如同一道题目, 一位录友提交了, 我还没处理如何,另一位录友也对这道题也提交了代码,这样就会发生冲突 -
+
大家提交代码的热情太高了,我有时候根本处理不过来,但我必须当天处理完,否则第二天代码冲突会越来越多。 -
+
一天晚上分别有两位录友提交了 30多道 java代码,全部冲突,解决冲突处理的我脖子疼[哭] @@ -201,11 +201,11 @@ python代码 确保这种额外文件不要提交。 -
+
还有添加不同方法的时候,直接用正文格式写,哪种方法就可以了,不要添加目录 ,例如这样,这样整篇文章目录结构就有影响了。 -
+
前面不要加 `## 前序遍历(迭代法)`,直接写`前序遍历(迭代法)`就可以了。 @@ -233,11 +233,11 @@ Go语言代码 甚至发现哪里有语病,也欢迎提交PR来修改,例如下面:就是把【下表】 纠正为【下标】 -
+
不用非要写出牛逼的代码才能提交PR,只要发现 文章中有任何问题,或者错别字,都欢迎提交PR,成为contributor。 -
+
## 特别注意 diff --git a/problems/qita/server.md b/problems/qita/server.md index 7e214d7993..72476f5754 100644 --- a/problems/qita/server.md +++ b/problems/qita/server.md @@ -51,7 +51,7 @@ 操作方式这样,我把命令包 包装成一个shell命令,想传那个文件,直接 uploadtomyserver,然后就返回可以下载的链接,这个文件也同时传到了我的服务器上。 -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211126165643.png) +![](https://file.kamacoder.com/pics/20211126165643.png) 我也把我的项目代码放在了github上: @@ -93,11 +93,11 @@ https://github.com/youngyangyang04/fileHttpServer 就是这样一个非常普通的查询页面。 -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211126160200.png) +![](https://file.kamacoder.com/pics/20211126160200.png) 查询通过之后,就会展现返现群二维码。 -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211127160558.png) +![](https://file.kamacoder.com/pics/20211127160558.png) 但要部署在服务器上,因为没有公网IP,别人用不了你的服务。 diff --git a/problems/qita/shejimoshi.md b/problems/qita/shejimoshi.md index d5342c6132..07d5540a25 100644 --- a/problems/qita/shejimoshi.md +++ b/problems/qita/shejimoshi.md @@ -7,11 +7,11 @@ 所以卡码网 针对 23种设计,**推出了 23道编程题目,来帮助大家练习设计模式**。 -
+
这里的23到编程题目对应了 23种这几模式。 例如第一题,小明的购物车,就是单例模式: -
+
区别于网上其他教程,本教程的特点是: @@ -40,18 +40,18 @@ 同时还给全部整理到PDF上,这份PDF,我们写的很用心了,来个大家截个图: -
+
-
+
-
+
-
+
关于设计模式的题目,大家现在就可以去 卡码网(kamacoder)去做了。 关于这23道题目对应 设计模式精讲 PDF,也免费分享给录友们,大家可以加我的企业微信获取: -
+
已经有我企业微信的录友,直接发:设计模式,这四个字就好,我会直接发你。 diff --git a/problems/qita/tulunfabu.md b/problems/qita/tulunfabu.md index 28ee463850..b45b790d81 100644 --- a/problems/qita/tulunfabu.md +++ b/problems/qita/tulunfabu.md @@ -8,7 +8,7 @@ 我知道录友们在等图论等太久了,其实我比大家都着急。 -![大家一直都在催](https://code-thinking-1253855093.file.myqcloud.com/pics/20240613105618.png) +![大家一直都在催](https://file.kamacoder.com/pics/20240613105618.png) 图论完整版目前已经开放在代码随想录网站:programmercarl.com @@ -20,7 +20,7 @@ * 拓扑排序 * 最短路算法 -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240613104436.png) +![](https://file.kamacoder.com/pics/20240613104436.png) **耗时一年之久,代码随想录图论 终于面世了**! @@ -32,21 +32,21 @@ 随便截一些图,大家感受一下: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240613104703.png) +![](https://file.kamacoder.com/pics/20240613104703.png) -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240613104824.png) +![](https://file.kamacoder.com/pics/20240613104824.png) -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240613104852.png) +![](https://file.kamacoder.com/pics/20240613104852.png) -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240613104926.png) +![](https://file.kamacoder.com/pics/20240613104926.png) -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240613105007.png) +![](https://file.kamacoder.com/pics/20240613105007.png) -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240613105030.png) +![](https://file.kamacoder.com/pics/20240613105030.png) -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240613105106.png) +![](https://file.kamacoder.com/pics/20240613105106.png) -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240613105143.png) +![](https://file.kamacoder.com/pics/20240613105143.png) 具体内容,大家可以去代码随想录网站(programmercarl.com)去看看,非常精彩! @@ -203,19 +203,19 @@ cout << result[result.size() - 1]; 当大家通过 代码随想录 提升了编程与算法能力,考上研或者找到好工作的时候,于我来说已经是很幸福的事情: -![对笔试帮助大](https://code-thinking-1253855093.file.myqcloud.com/pics/20230914172536.png) +![对笔试帮助大](https://file.kamacoder.com/pics/20230914172536.png) -![华为od将近满分](https://code-thinking-1253855093.file.myqcloud.com/pics/20230914172607.png) +![华为od将近满分](https://file.kamacoder.com/pics/20230914172607.png) -![研究生复试](https://code-thinking-1253855093.file.myqcloud.com/pics/20240621103130.png) +![研究生复试](https://file.kamacoder.com/pics/20240621103130.png) -![红包感谢代码随想录366](https://code-thinking-1253855093.file.myqcloud.com/pics/20231123151310.png) +![红包感谢代码随想录366](https://file.kamacoder.com/pics/20231123151310.png) -![上岸亚马逊](https://code-thinking-1253855093.file.myqcloud.com/pics/20240206174151.png) +![上岸亚马逊](https://file.kamacoder.com/pics/20240206174151.png) -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20220718094112.png) +![](https://file.kamacoder.com/pics/20220718094112.png) -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20220718094332.png) +![](https://file.kamacoder.com/pics/20220718094332.png) 至此**图论内容 已完全免费开放在代码随想录网站(programmercarl.com),造福广大学习编程的录友们**! diff --git "a/problems/\344\272\214\345\217\211\346\240\221\346\200\273\347\273\223\347\257\207.md" "b/problems/\344\272\214\345\217\211\346\240\221\346\200\273\347\273\223\347\257\207.md" index f4d093d638..a67cf5db9d 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\346\200\273\347\273\223\347\257\207.md" @@ -147,7 +147,7 @@ 二叉树专题汇聚为一张图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211030125421.png) +![](https://file.kamacoder.com/pics/20211030125421.png) 这个图是 [代码随想录知识星球](https://programmercarl.com/other/kstar.html) 成员:[青](https://wx.zsxq.com/dweb2/index/footprint/185251215558842),所画,总结的非常好,分享给大家。 diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" index 9a63b66cfd..1fbbc9d934 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -15,7 +15,7 @@ 题目分类大纲如下: -二叉树大纲 +二叉树大纲 说到二叉树,大家对于二叉树其实都很熟悉了,本文呢我也不想教科书式的把二叉树的基础内容再啰嗦一遍,所以以下我讲的都是一些比较重点的内容。 @@ -31,7 +31,7 @@ 如图所示: - + 这棵二叉树为满二叉树,也可以说深度为k,有2^k-1个节点的二叉树。 @@ -46,7 +46,7 @@ 我来举一个典型的例子如题: - + 相信不少同学最后一个二叉树是不是完全二叉树都中招了。 @@ -63,7 +63,7 @@ 下面这两棵树都是搜索树 - + ### 平衡二叉搜索树 @@ -72,7 +72,7 @@ 如图: - + 最后一棵 不是平衡二叉树,因为它的左右两个子树的高度差的绝对值超过了1。 @@ -91,13 +91,13 @@ 链式存储如图: - + 链式存储是大家很熟悉的一种方式,那么我们来看看如何顺序存储呢? 其实就是用数组来存储二叉树,顺序存储的方式如图: - + 用数组来存储二叉树如何遍历的呢? @@ -144,7 +144,7 @@ 大家可以对着如下图,看看自己理解的前后中序有没有问题。 - + 最后再说一说二叉树中深度优先和广度优先遍历实现方式,我们做二叉树相关题目,经常会使用递归的方式来实现深度优先遍历,也就是实现前中后序遍历,使用递归是比较方便的。 diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" index 289c651b60..e011612ca6 100644 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" @@ -117,7 +117,7 @@ public: 再来看后序遍历,先序遍历是中左右,后序遍历是左右中,那么我们只需要调整一下先序遍历的代码顺序,就变成中右左的遍历顺序,然后在反转result数组,输出的结果顺序就是左右中了,如下图: -![前序到后序](https://code-thinking-1253855093.file.myqcloud.com/pics/20200808200338924.png) +![前序到后序](https://file.kamacoder.com/pics/20200808200338924.png) **所以后序遍历只需要前序遍历的代码稍作修改就可以了,代码如下:** diff --git "a/problems/\345\211\215\345\272\217/ACM\346\250\241\345\274\217.md" "b/problems/\345\211\215\345\272\217/ACM\346\250\241\345\274\217.md" index 313264fba2..f1ff3a5ffc 100644 --- "a/problems/\345\211\215\345\272\217/ACM\346\250\241\345\274\217.md" +++ "b/problems/\345\211\215\345\272\217/ACM\346\250\241\345\274\217.md" @@ -5,15 +5,15 @@ 平时大家在力扣上刷题,就是 核心代码模式,即给你一个函数,直接写函数实现,例如这样: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20231109193631.png) +![](https://file.kamacoder.com/pics/20231109193631.png) 而ACM模式,是程序头文件,main函数,数据的输入输出都要自己处理,例如这样: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20231109193743.png) +![](https://file.kamacoder.com/pics/20231109193743.png) 大家可以发现 右边代码框什么都没有,程序从头到尾都需要自己实现,本题如果写完代码是这样的: (细心的录友可以发现和力扣上刷题是不一样的) -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20231109193931.png) +![](https://file.kamacoder.com/pics/20231109193931.png) **如果大家从一开始学习算法就一直在力扣上的话,突然切到ACM模式会非常不适应**。 @@ -21,15 +21,15 @@ 知识星球里也有很多录友,因为不熟悉ACM模式在面试的过程中吃了不少亏。 -
+
-
+
-
+
-
+
-
+
## 面试究竟怎么考? @@ -53,7 +53,7 @@ 你只要能把卡码网首页的25道题目 都刷了 ,就把所有的ACM输入输出方式都练习到位了,不会有任何盲区。 -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20231109195056.png) +![](https://file.kamacoder.com/pics/20231109195056.png) 而且你不用担心,题目难度太大,直接给自己劝退,**卡码网的前25道题目都是我精心制作的,难度也是循序渐进的**,大家去刷一下就知道了。 diff --git "a/problems/\345\211\215\345\272\217/ACM\346\250\241\345\274\217\345\246\202\344\275\225\346\236\204\345\273\272\344\272\214\345\217\211\346\240\221.md" "b/problems/\345\211\215\345\272\217/ACM\346\250\241\345\274\217\345\246\202\344\275\225\346\236\204\345\273\272\344\272\214\345\217\211\346\240\221.md" index 48781eda88..086e6e0ea0 100644 --- "a/problems/\345\211\215\345\272\217/ACM\346\250\241\345\274\217\345\246\202\344\275\225\346\236\204\345\273\272\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/\345\211\215\345\272\217/ACM\346\250\241\345\274\217\345\246\202\344\275\225\346\236\204\345\273\272\344\272\214\345\217\211\346\240\221.md" @@ -15,7 +15,7 @@ 其输入用例,就是用一个数组来表述 二叉树,如下: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210914222335.png) +![](https://file.kamacoder.com/pics/20210914222335.png) 一直跟着公众号学算法的录友 应该知道,我在[二叉树:构造二叉树登场!](https://mp.weixin.qq.com/s/Dza-fqjTyGrsRw4PWNKdxA),已经讲过,**只有 中序与后序 和 中序和前序 可以确定一棵唯一的二叉树。 前序和后序是不能确定唯一的二叉树的**。 @@ -24,7 +24,7 @@ 很明显,是后台直接明确了构造规则。 再看一下 这个 输入序列 和 对应的二叉树。 -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210914222335.png) +![](https://file.kamacoder.com/pics/20210914222335.png) 从二叉树 推导到 序列,大家可以发现这就是层序遍历。 @@ -36,7 +36,7 @@ 顺序存储,就是用一个数组来存二叉树,其方式如图所示: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210914223147.png) +![](https://file.kamacoder.com/pics/20210914223147.png) 那么此时大家是不是应该知道了,数组如何转化成 二叉树了。**如果父节点的数组下标是i,那么它的左孩子下标就是i * 2 + 1,右孩子下标就是 i * 2 + 2**。 @@ -80,7 +80,7 @@ TreeNode* construct_binary_tree(const vector& vec) { 这个函数最后返回的 指针就是 根节点的指针, 这就是 传入二叉树的格式了,也就是 力扣上的用例输入格式,如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210914224422.png) +![](https://file.kamacoder.com/pics/20210914224422.png) 也有不少同学在做ACM模式的题目,就经常疑惑: @@ -176,7 +176,7 @@ int main() { 和 [538.把二叉搜索树转换为累加树](https://mp.weixin.qq.com/s/rlJUFGCnXsIMX0Lg-fRpIw) 中的输入是一样的 -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210914222335.png) +![](https://file.kamacoder.com/pics/20210914222335.png) 这里可能又有同学疑惑,你这不一样啊,题目是null,你为啥用-1。 @@ -184,11 +184,11 @@ int main() { 在来看,测试代码输出的效果: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210914230045.png) +![](https://file.kamacoder.com/pics/20210914230045.png) 可以看出和 题目中输入用例 这个图 是一样一样的。 只不过题目中图没有把 空节点 画出来而已。 -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210914230118.png) +![](https://file.kamacoder.com/pics/20210914230118.png) 大家可以拿我的代码去测试一下,跑一跑。 @@ -205,7 +205,7 @@ int main() { **[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)**里有的录友已经开始三刷: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210727234031.png) +![](https://file.kamacoder.com/pics/20210727234031.png) 只做过一遍,真的就是懂了一点皮毛, 第二遍刷才有真的对各个题目有较为深入的理解,也会明白 我为什么要这样安排刷题的顺序了。 diff --git "a/problems/\345\211\215\345\272\217/vim.md" "b/problems/\345\211\215\345\272\217/vim.md" index 581019995a..13935b91c6 100644 --- "a/problems/\345\211\215\345\272\217/vim.md" +++ "b/problems/\345\211\215\345\272\217/vim.md" @@ -93,7 +93,7 @@ sh install.sh 当然 还有很多,我还详细写了PowerVim的快捷键,使用方法,插件,配置,等等,都在Github主页的README上。当时我的Github上写的都是英文README,这次为了方便大家阅读,我又翻译成中文README。 -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211013102249.png) +![](https://file.kamacoder.com/pics/20211013102249.png) Github地址:[https://github.com/youngyangyang04/PowerVim](https://github.com/youngyangyang04/PowerVim) diff --git "a/problems/\345\211\215\345\272\217/\344\273\243\347\240\201\351\243\216\346\240\274.md" "b/problems/\345\211\215\345\272\217/\344\273\243\347\240\201\351\243\216\346\240\274.md" index 95f4f129da..33891632b8 100644 --- "a/problems/\345\211\215\345\272\217/\344\273\243\347\240\201\351\243\216\346\240\274.md" +++ "b/problems/\345\211\215\345\272\217/\344\273\243\347\240\201\351\243\216\346\240\274.md" @@ -57,7 +57,7 @@ 我做了一下总结如图: -![编程风格](https://code-thinking-1253855093.file.myqcloud.com/pics/20201119173039835.png) +![编程风格](https://file.kamacoder.com/pics/20201119173039835.png) ### 水平留白(代码空格) diff --git "a/problems/\345\211\215\345\272\217/\345\206\205\345\255\230\346\266\210\350\200\227.md" "b/problems/\345\211\215\345\272\217/\345\206\205\345\255\230\346\266\210\350\200\227.md" index f70564e4a2..88fb129ee2 100644 --- "a/problems/\345\211\215\345\272\217/\345\206\205\345\255\230\346\266\210\350\200\227.md" +++ "b/problems/\345\211\215\345\272\217/\345\206\205\345\255\230\346\266\210\350\200\227.md" @@ -19,7 +19,7 @@ 如果我们写C++的程序,就要知道栈和堆的概念,程序运行时所需的内存空间分为 固定部分,和可变部分,如下: -![C++内存空间](https://code-thinking-1253855093.file.myqcloud.com/pics/20210309165950660.png) +![C++内存空间](https://file.kamacoder.com/pics/20210309165950660.png) 固定部分的内存消耗 是不会随着代码运行产生变化的, 可变部分则是会产生变化的 @@ -41,7 +41,7 @@ 想要算出自己程序会占用多少内存就一定要了解自己定义的数据类型的大小,如下: -![C++数据类型的大小](https://code-thinking-1253855093.file.myqcloud.com/pics/20200804193045440.png) +![C++数据类型的大小](https://file.kamacoder.com/pics/20200804193045440.png) 注意图中有两个不一样的地方,为什么64位的指针就占用了8个字节,而32位的指针占用4个字节呢? @@ -109,7 +109,7 @@ CPU读取内存不是一次读取单个字节,而是一块一块的来读取 第一种就是内存对齐的情况,如图: -![内存对齐](https://code-thinking-1253855093.file.myqcloud.com/pics/20200804193307347.png) +![内存对齐](https://file.kamacoder.com/pics/20200804193307347.png) 一字节的char占用了四个字节,空了三个字节的内存地址,int数据从地址4开始。 @@ -117,7 +117,7 @@ CPU读取内存不是一次读取单个字节,而是一块一块的来读取 第二种是没有内存对齐的情况如图: -![非内存对齐](https://code-thinking-1253855093.file.myqcloud.com/pics/20200804193353926.png) +![非内存对齐](https://file.kamacoder.com/pics/20200804193353926.png) char型的数据和int型的数据挨在一起,该int数据从地址1开始,那么CPU想要读这个数据的话来看看需要几步操作: diff --git "a/problems/\345\211\215\345\272\217/\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246.md" "b/problems/\345\211\215\345\272\217/\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246.md" index 61f0a7ef6a..045646ff7e 100644 --- "a/problems/\345\211\215\345\272\217/\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246.md" +++ "b/problems/\345\211\215\345\272\217/\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246.md" @@ -38,7 +38,7 @@ 同样的同理再看一下快速排序,都知道快速排序是O(nlogn),但是当数据已经有序情况下,快速排序的时间复杂度是O(n^2) 的,**所以严格从大O的定义来讲,快速排序的时间复杂度应该是O(n^2)**。 **但是我们依然说快速排序是O(nlogn)的时间复杂度,这个就是业内的一个默认规定,这里说的O代表的就是一般情况,而不是严格的上界**。如图所示: -![时间复杂度4,一般情况下的时间复杂度](https://code-thinking-1253855093.file.myqcloud.com/pics/20200728185745611-20230310123844306.png) +![时间复杂度4,一般情况下的时间复杂度](https://file.kamacoder.com/pics/20200728185745611-20230310123844306.png) 我们主要关心的还是一般情况下的数据形式。 @@ -49,7 +49,7 @@ 如下图中可以看出不同算法的时间复杂度在不同数据输入规模下的差异。 -![时间复杂度,不同数据规模的差异](https://code-thinking-1253855093.file.myqcloud.com/pics/20200728191447384-20230310124015324.png) +![时间复杂度,不同数据规模的差异](https://file.kamacoder.com/pics/20200728191447384-20230310124015324.png) 在决定使用哪些算法的时候,不是时间复杂越低的越好(因为简化后的时间复杂度忽略了常数项等等),要考虑数据规模,如果数据规模很小甚至可以用O(n^2)的算法比O(n)的更合适(在有常数项的时候)。 @@ -115,7 +115,7 @@ O(2 × n^2 + 10 × n + 1000) < O(3 × n^2),所以说最后省略掉常数项 为什么可以这么做呢?如下图所示: -![时间复杂度1.png](https://code-thinking-1253855093.file.myqcloud.com/pics/20200728191447349-20230310124032001.png) +![时间复杂度1.png](https://file.kamacoder.com/pics/20200728191447349-20230310124032001.png) 假如有两个算法的时间复杂度,分别是log以2为底n的对数和log以10为底n的对数,那么这里如果还记得高中数学的话,应该不难理解`以2为底n的对数 = 以2为底10的对数 * 以10为底n的对数`。 diff --git "a/problems/\345\211\215\345\272\217/\347\250\213\345\272\217\345\221\230\347\256\200\345\216\206.md" "b/problems/\345\211\215\345\272\217/\347\250\213\345\272\217\345\221\230\347\256\200\345\216\206.md" index 7fbfa1fd2b..1bdcccd586 100644 --- "a/problems/\345\211\215\345\272\217/\347\250\213\345\272\217\345\221\230\347\256\200\345\216\206.md" +++ "b/problems/\345\211\215\345\272\217/\347\250\213\345\272\217\345\221\230\347\256\200\345\216\206.md" @@ -103,13 +103,13 @@ Carl校招社招都拿过大厂的offer,同时也看过很多应聘者的简 最后福利,把我的简历模板贡献出来!如下图所示。 -![简历模板](https://code-thinking-1253855093.file.myqcloud.com/pics/20200803175538158.png) +![简历模板](https://file.kamacoder.com/pics/20200803175538158.png) 这里是简历模板中Markdown的代码:[https://github.com/youngyangyang04/Markdown-Resume-Template](https://github.com/youngyangyang04/Markdown-Resume-Template) ,可以fork到自己Github仓库上,按照这个模板来修改自己的简历。 **Word版本的简历,添加如下企业微信,通过之后就会发你word版本**。 -
+
如果已经有我的企业微信,直接回复:简历模板,就可以了。 diff --git "a/problems/\345\211\215\345\272\217/\347\256\227\346\263\225\350\266\205\346\227\266.md" "b/problems/\345\211\215\345\272\217/\347\256\227\346\263\225\350\266\205\346\227\266.md" index 34ebe6deb1..ca1a422c0b 100644 --- "a/problems/\345\211\215\345\272\217/\347\256\227\346\263\225\350\266\205\346\227\266.md" +++ "b/problems/\345\211\215\345\272\217/\347\256\227\346\263\225\350\266\205\346\227\266.md" @@ -8,7 +8,7 @@ ## 超时是怎么回事 -![程序超时](https://code-thinking-1253855093.file.myqcloud.com/pics/20200729112716117-20230310124308704.png) +![程序超时](https://file.kamacoder.com/pics/20200729112716117-20230310124308704.png) 大家在leetcode上练习算法的时候应该都遇到过一种错误是“超时”。 @@ -124,11 +124,11 @@ int main() { 来看一下运行的效果,如下图: -![程序超时2](https://code-thinking-1253855093.file.myqcloud.com/pics/20200729200018460-20230310124315093.png) +![程序超时2](https://file.kamacoder.com/pics/20200729200018460-20230310124315093.png) O(n)的算法,1s内大概计算机可以运行 5 * (10^8)次计算,可以推测一下 $O(n^2)$ 的算法应该1s可以处理的数量级的规模是 5 * (10^8)开根号,实验数据如下。 -![程序超时3](https://code-thinking-1253855093.file.myqcloud.com/pics/2020072919590970-20230310124318532.png) +![程序超时3](https://file.kamacoder.com/pics/2020072919590970-20230310124318532.png) O(n^2)的算法,1s内大概计算机可以运行 22500次计算,验证了刚刚的推测。 @@ -136,7 +136,7 @@ O(n^2)的算法,1s内大概计算机可以运行 22500次计算,验证了刚 理论上应该是比 $O(n)$ 少一个数量级,因为 $\log n$ 的复杂度 其实是很快,看一下实验数据。 -![程序超时4](https://code-thinking-1253855093.file.myqcloud.com/pics/20200729195729407-20230310124322232.png) +![程序超时4](https://file.kamacoder.com/pics/20200729195729407-20230310124322232.png) $O(n\log n)$ 的算法,1s内大概计算机可以运行 2 * (10^7)次计算,符合预期。 @@ -144,7 +144,7 @@ $O(n\log n)$ 的算法,1s内大概计算机可以运行 2 * (10^7)次计算, **整体测试数据整理如下:** -![程序超时1](https://code-thinking-1253855093.file.myqcloud.com/pics/20201208231559175-20230310124325152.png) +![程序超时1](https://file.kamacoder.com/pics/20201208231559175-20230310124325152.png) 至于 $O(\log n)$ 和 $O(n^3)$ 等等这些时间复杂度在1s内可以处理的多大的数据规模,大家可以自己写一写代码去测一下了。 diff --git "a/problems/\345\211\215\345\272\217/\351\200\222\345\275\222\347\256\227\346\263\225\347\232\204\346\227\266\351\227\264\344\270\216\347\251\272\351\227\264\345\244\215\346\235\202\345\272\246\345\210\206\346\236\220.md" "b/problems/\345\211\215\345\272\217/\351\200\222\345\275\222\347\256\227\346\263\225\347\232\204\346\227\266\351\227\264\344\270\216\347\251\272\351\227\264\345\244\215\346\235\202\345\272\246\345\210\206\346\236\220.md" index 39513a9155..035399ce0f 100644 --- "a/problems/\345\211\215\345\272\217/\351\200\222\345\275\222\347\256\227\346\263\225\347\232\204\346\227\266\351\227\264\344\270\216\347\251\272\351\227\264\345\244\215\346\235\202\345\272\246\345\210\206\346\236\220.md" +++ "b/problems/\345\211\215\345\272\217/\351\200\222\345\275\222\347\256\227\346\263\225\347\232\204\346\227\266\351\227\264\344\270\216\347\251\272\351\227\264\345\244\215\346\235\202\345\272\246\345\210\206\346\236\220.md" @@ -29,7 +29,7 @@ int fibonacci(int i) { 可以看出上面的代码每次递归都是O(1)的操作。再来看递归了多少次,这里将i为5作为输入的递归过程 抽象成一棵递归树,如图: -![递归空间复杂度分析](https://code-thinking-1253855093.file.myqcloud.com/pics/20210305093200104.png) +![递归空间复杂度分析](https://file.kamacoder.com/pics/20210305093200104.png) 从图中,可以看出f(5)是由f(4)和f(3)相加而来,那么f(4)是由f(3)和f(2)相加而来 以此类推。 @@ -196,7 +196,7 @@ int main() 在看递归的深度是多少呢?如图所示: -![递归空间复杂度分析](https://code-thinking-1253855093.file.myqcloud.com/pics/20210305094749554.png) +![递归空间复杂度分析](https://file.kamacoder.com/pics/20210305094749554.png) 递归第n个斐波那契数的话,递归调用栈的深度就是n。 @@ -214,7 +214,7 @@ int fibonacci(int i) { 最后对各种求斐波那契数列方法的性能做一下分析,如题: -![递归的空间复杂度分析](https://code-thinking-1253855093.file.myqcloud.com/pics/20210305095227356.png) +![递归的空间复杂度分析](https://file.kamacoder.com/pics/20210305095227356.png) 可以看出,求斐波那契数的时候,使用递归算法并不一定是在性能上是最优的,但递归确实简化的代码层面的复杂度。 diff --git "a/problems/\345\211\215\345\272\217/\351\200\222\345\275\222\347\256\227\346\263\225\347\232\204\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246.md" "b/problems/\345\211\215\345\272\217/\351\200\222\345\275\222\347\256\227\346\263\225\347\232\204\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246.md" index 1ea1e65be8..befe549874 100644 --- "a/problems/\345\211\215\345\272\217/\351\200\222\345\275\222\347\256\227\346\263\225\347\232\204\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246.md" +++ "b/problems/\345\211\215\345\272\217/\351\200\222\345\275\222\347\256\227\346\263\225\347\232\204\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246.md" @@ -69,7 +69,7 @@ int function3(int x, int n) { 我们来分析一下,首先看递归了多少次呢,可以把递归抽象出一棵满二叉树。刚刚同学写的这个算法,可以用一棵满二叉树来表示(为了方便表示,选择n为偶数16),如图: -![递归算法的时间复杂度](https://code-thinking-1253855093.file.myqcloud.com/pics/20201209193909426.png) +![递归算法的时间复杂度](https://file.kamacoder.com/pics/20201209193909426.png) 当前这棵二叉树就是求x的n次方,n为16的情况,n为16的时候,进行了多少次乘法运算呢? @@ -79,7 +79,7 @@ int function3(int x, int n) { 这么如果是求x的n次方,这个递归树有多少个节点呢,如下图所示:(m为深度,从0开始) -![递归求时间复杂度](https://code-thinking-1253855093.file.myqcloud.com/pics/20200728195531892.png) +![递归求时间复杂度](https://file.kamacoder.com/pics/20200728195531892.png) **时间复杂度忽略掉常数项`-1`之后,这个递归算法的时间复杂度依然是O(n)**。对,你没看错,依然是O(n)的时间复杂度! diff --git "a/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" "b/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" index fd2d16f47a..a88919d4ca 100644 --- "a/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" +++ "b/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" @@ -35,11 +35,11 @@ 如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20231030165201.png) +![](https://file.kamacoder.com/pics/20231030165201.png) 然后从后向前替换数字字符,也就是双指针法,过程如下:i指向新长度的末尾,j指向旧长度的末尾。 -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20231030173058.png) +![](https://file.kamacoder.com/pics/20231030173058.png) 有同学问了,为什么要从后向前填充,从前向后填充不行么? diff --git "a/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" "b/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" index 6fe12e3d51..4c62312c8b 100644 --- "a/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" @@ -44,16 +44,16 @@ fgabcde 本题中,我们需要将字符串右移n位,字符串相当于分成了两个部分,如果n为2,符串相当于分成了两个部分,如图: (length为字符串长度) -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20231106170143.png) +![](https://file.kamacoder.com/pics/20231106170143.png) 右移n位, 就是将第二段放在前面,第一段放在后面,先不考虑里面字符的顺序,是不是整体倒叙不就行了。如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20231106171557.png) +![](https://file.kamacoder.com/pics/20231106171557.png) 此时第一段和第二段的顺序是我们想要的,但里面的字符位置被我们倒叙,那么此时我们在把 第一段和第二段里面的字符再倒叙一把,这样字符顺序不就正确了。 如果: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20231106172058.png) +![](https://file.kamacoder.com/pics/20231106172058.png) 其实,思路就是 通过 整体倒叙,把两段子串顺序颠倒,两个段子串里的的字符在倒叙一把,**负负得正**,这样就不影响子串里面字符的顺序了。 @@ -84,7 +84,7 @@ int main() { 可以的,不过,要记得 控制好 局部反转的长度,如果先局部反转,那么先反转的子串长度就是 len - n,如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20231106172534.png) +![](https://file.kamacoder.com/pics/20231106172534.png) 代码如下: diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20201003\344\272\214\345\217\211\346\240\221\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20201003\344\272\214\345\217\211\346\240\221\345\221\250\346\234\253\346\200\273\347\273\223.md" index ea5082244c..3212ca5603 100644 --- "a/problems/\345\221\250\346\200\273\347\273\223/20201003\344\272\214\345\217\211\346\240\221\345\221\250\346\234\253\346\200\273\347\273\223.md" +++ "b/problems/\345\221\250\346\200\273\347\273\223/20201003\344\272\214\345\217\211\346\240\221\345\221\250\346\234\253\346\200\273\347\273\223.md" @@ -254,5 +254,5 @@ traversal(cur->left, tmp, result); * Github:[leetcode-master](https://github.com/youngyangyang04/leetcode-master) * 知乎:[代码随想录](https://www.zhihu.com/people/sun-xiu-yang-64) -![](https://code-thinking-1253855093.file.myqcloud.com/pics/2021013018121150.png) +![](https://file.kamacoder.com/pics/2021013018121150.png)
diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20201107\345\233\236\346\272\257\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20201107\345\233\236\346\272\257\345\221\250\346\234\253\346\200\273\347\273\223.md" index 7e333c7672..d910ce2509 100644 --- "a/problems/\345\221\250\346\200\273\347\273\223/20201107\345\233\236\346\272\257\345\221\250\346\234\253\346\200\273\347\273\223.md" +++ "b/problems/\345\221\250\346\200\273\347\273\223/20201107\345\233\236\346\272\257\345\221\250\346\234\253\346\200\273\347\273\223.md" @@ -31,7 +31,7 @@ for (int i = startIndex; i < candidates.size() && sum + candidates[i] <= target; 在[回溯算法:求组合总和(二)](https://programmercarl.com/0039.组合总和.html)第一个树形结构没有画出startIndex的作用,**这里这里纠正一下,准确的树形结构如图所示:** -![39.组合总和](https://code-thinking-1253855093.file.myqcloud.com/pics/20201223170730367.png) +![39.组合总和](https://file.kamacoder.com/pics/20201223170730367.png) ## 周二 @@ -45,7 +45,7 @@ for (int i = startIndex; i < candidates.size() && sum + candidates[i] <= target; 都知道组合问题可以抽象为树形结构,那么“使用过”在这个树形结构上是有两个维度的,一个维度是同一树枝上“使用过”,一个维度是同一树层上“使用过”。**没有理解这两个层面上的“使用过” 是造成大家没有彻底理解去重的根本原因**。 -![40.组合总和II1](https://code-thinking-1253855093.file.myqcloud.com/pics/20201123202817973.png) +![40.组合总和II1](https://file.kamacoder.com/pics/20201123202817973.png) 我在图中将used的变化用橘黄色标注上,可以看出在candidates[i] == candidates[i - 1]相同的情况下: @@ -79,7 +79,7 @@ for (int i = startIndex; i < candidates.size() && sum + candidates[i] <= target; **本题的树形结构中,和代码的逻辑有一个小出入,已经判断不是回文的子串就不会进入递归了,纠正如下:** -![131.分割回文串](https://code-thinking-1253855093.file.myqcloud.com/pics/20201123203228309.png) +![131.分割回文串](https://file.kamacoder.com/pics/20201123203228309.png) ## 周四 @@ -90,7 +90,7 @@ for (int i = startIndex; i < candidates.size() && sum + candidates[i] <= target; 树形图如下: -![93.复原IP地址](https://code-thinking-1253855093.file.myqcloud.com/pics/20201123203735933-20230310133532452.png) +![93.复原IP地址](https://file.kamacoder.com/pics/20201123203735933-20230310133532452.png) 在本文的树形结构图中,我已经把详细的分析思路都画了出来,相信大家看了之后一定会思路清晰不少! @@ -112,7 +112,7 @@ if (s.size() > 12) return result; // 剪枝 如图: -![78.子集](https://code-thinking-1253855093.file.myqcloud.com/pics/202011232041348.png) +![78.子集](https://file.kamacoder.com/pics/202011232041348.png) 认清这个本质之后,今天的题目就是一道模板题了。 diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20201112\345\233\236\346\272\257\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20201112\345\233\236\346\272\257\345\221\250\346\234\253\346\200\273\347\273\223.md" index ec36d1213d..c2e122844d 100644 --- "a/problems/\345\221\250\346\200\273\347\273\223/20201112\345\233\236\346\272\257\345\221\250\346\234\253\346\200\273\347\273\223.md" +++ "b/problems/\345\221\250\346\200\273\347\273\223/20201112\345\233\236\346\272\257\345\221\250\346\234\253\346\200\273\347\273\223.md" @@ -11,14 +11,14 @@ 树形结构如下: -![90.子集II](https://code-thinking-1253855093.file.myqcloud.com/pics/2020111217110449-20230310133150714.png) +![90.子集II](https://file.kamacoder.com/pics/2020111217110449-20230310133150714.png) ## 周二 在[回溯算法:递增子序列](https://programmercarl.com/0491.递增子序列.html)中,处处都能看到子集的身影,但处处是陷阱,值得好好琢磨琢磨! 树形结构如下: -![491. 递增子序列1](https://code-thinking-1253855093.file.myqcloud.com/pics/20201112170832333-20230310133155209.png) +![491. 递增子序列1](https://file.kamacoder.com/pics/20201112170832333-20230310133155209.png) [回溯算法:递增子序列](https://programmercarl.com/0491.递增子序列.html)留言区大家有很多疑问,主要还是和[回溯算法:求子集问题(二)](https://programmercarl.com/0090.子集II.html)混合在了一起。 @@ -33,7 +33,7 @@ 可以看出元素1在[1,2]中已经使用过了,但是在[2,1]中还要在使用一次1,所以处理排列问题就不用使用startIndex了。 如图: -![46.全排列](https://code-thinking-1253855093.file.myqcloud.com/pics/20201112170304979-20230310133201250.png) +![46.全排列](https://file.kamacoder.com/pics/20201112170304979-20230310133201250.png) **大家此时可以感受出排列问题的不同:** @@ -46,7 +46,7 @@ 树形结构如下: -![47.全排列II1](https://code-thinking-1253855093.file.myqcloud.com/pics/20201112171930470-20230310133206398.png) +![47.全排列II1](https://file.kamacoder.com/pics/20201112171930470-20230310133206398.png) **这道题目神奇的地方就是used[i - 1] == false也可以,used[i - 1] == true也可以!** @@ -54,11 +54,11 @@ 树层上去重(used[i - 1] == false),的树形结构如下: -![47.全排列II2.png](https://code-thinking-1253855093.file.myqcloud.com/pics/20201112172230434-20230310133211392.png) +![47.全排列II2.png](https://file.kamacoder.com/pics/20201112172230434-20230310133211392.png) 树枝上去重(used[i - 1] == true)的树型结构如下: -![47.全排列II3](https://code-thinking-1253855093.file.myqcloud.com/pics/20201112172327967-20230310133216389.png) +![47.全排列II3](https://file.kamacoder.com/pics/20201112172327967-20230310133216389.png) **可以清晰的看到使用(used[i - 1] == false),即树层去重,效率更高!** diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20201203\350\264\252\345\277\203\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20201203\350\264\252\345\277\203\345\221\250\346\234\253\346\200\273\347\273\223.md" index 9209efda71..4ab1cddbff 100644 --- "a/problems/\345\221\250\346\200\273\347\273\223/20201203\350\264\252\345\277\203\345\221\250\346\234\253\346\200\273\347\273\223.md" +++ "b/problems/\345\221\250\346\200\273\347\273\223/20201203\350\264\252\345\277\203\345\221\250\346\234\253\346\200\273\347\273\223.md" @@ -15,7 +15,7 @@ 如图: -![122.买卖股票的最佳时机II](https://code-thinking-1253855093.file.myqcloud.com/pics/2020112917480858.png) +![122.买卖股票的最佳时机II](https://file.kamacoder.com/pics/2020112917480858.png) ## 周二 @@ -31,7 +31,7 @@ 如图: -![55.跳跃游戏](https://code-thinking-1253855093.file.myqcloud.com/pics/20201124154758229.png) +![55.跳跃游戏](https://file.kamacoder.com/pics/20201124154758229.png) ## 周三 @@ -44,7 +44,7 @@ 如图: -![45.跳跃游戏II](https://code-thinking-1253855093.file.myqcloud.com/pics/20201201232309103-20230310133110942.png) +![45.跳跃游戏II](https://file.kamacoder.com/pics/20201201232309103-20230310133110942.png) 注意:**图中的移动下标是到当前这步覆盖的最远距离(下标2的位置),此时没有到终点,只能增加第二步来扩大覆盖范围**。 @@ -55,10 +55,10 @@ 而版本二就比较统一的,超过范围,步数就加一,但在移动下标的范围了做了文章。 即如果覆盖最远距离下标是倒数第二点:直接加一就行,默认一定可以到终点。如图: -![45.跳跃游戏II2](https://code-thinking-1253855093.file.myqcloud.com/pics/20201201232445286-20230310133115650.png) +![45.跳跃游戏II2](https://file.kamacoder.com/pics/20201201232445286-20230310133115650.png) 如果覆盖最远距离下标不是倒数第二点,说明本次覆盖已经到终点了。如图: -![45.跳跃游戏II1](https://code-thinking-1253855093.file.myqcloud.com/pics/20201201232338693-20230310133120115.png) +![45.跳跃游戏II1](https://file.kamacoder.com/pics/20201201232338693-20230310133120115.png) 有的录友认为版本一好理解,有的录友认为版本二好理解,其实掌握一种就可以了,也不用非要比拼一下代码的简洁性,简洁程度都差不多了。 diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20201210\345\244\215\346\235\202\345\272\246\345\210\206\346\236\220\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20201210\345\244\215\346\235\202\345\272\246\345\210\206\346\236\220\345\221\250\346\234\253\346\200\273\347\273\223.md" index 461219f2da..f449995b01 100644 --- "a/problems/\345\221\250\346\200\273\347\273\223/20201210\345\244\215\346\235\202\345\272\246\345\210\206\346\236\220\345\221\250\346\234\253\346\200\273\347\273\223.md" +++ "b/problems/\345\221\250\346\200\273\347\273\223/20201210\345\244\215\346\235\202\345\272\246\345\210\206\346\236\220\345\221\250\346\234\253\346\200\273\347\273\223.md" @@ -77,7 +77,7 @@ 文中从计算机硬件出发,分析计算机的计算性能,然后亲自做实验,整理出数据如下: -![程序超时1](https://code-thinking-1253855093.file.myqcloud.com/pics/20201208231559175-20230310133304038.png) +![程序超时1](https://file.kamacoder.com/pics/20201208231559175-20230310133304038.png) **大家有一个数量级上的概念就可以了!** diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20201217\350\264\252\345\277\203\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20201217\350\264\252\345\277\203\345\221\250\346\234\253\346\200\273\347\273\223.md" index 91f9656f48..19a95615a3 100644 --- "a/problems/\345\221\250\346\200\273\347\273\223/20201217\350\264\252\345\277\203\345\221\250\346\234\253\346\200\273\347\273\223.md" +++ "b/problems/\345\221\250\346\200\273\347\273\223/20201217\350\264\252\345\277\203\345\221\250\346\234\253\346\200\273\347\273\223.md" @@ -38,7 +38,7 @@ 如图: -![135.分发糖果](https://code-thinking-1253855093.file.myqcloud.com/pics/20201117114916878-20230310133332759.png) +![135.分发糖果](https://file.kamacoder.com/pics/20201117114916878-20230310133332759.png) 接着在贪心另一边,左孩子大于右孩子,左孩子的糖果就要比右孩子多。 @@ -50,7 +50,7 @@ 局部最优可以推出全局最优。 如图: -![135.分发糖果1](https://code-thinking-1253855093.file.myqcloud.com/pics/20201117115658791-20230310133346127.png) +![135.分发糖果1](https://file.kamacoder.com/pics/20201117115658791-20230310133346127.png) ## 周三 diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20201224\350\264\252\345\277\203\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20201224\350\264\252\345\277\203\345\221\250\346\234\253\346\200\273\347\273\223.md" index b37bba80dc..a8ba7454eb 100644 --- "a/problems/\345\221\250\346\200\273\347\273\223/20201224\350\264\252\345\277\203\345\221\250\346\234\253\346\200\273\347\273\223.md" +++ "b/problems/\345\221\250\346\200\273\347\273\223/20201224\350\264\252\345\277\203\345\221\250\346\234\253\346\200\273\347\273\223.md" @@ -9,7 +9,7 @@ 如图: -![452.用最少数量的箭引爆气球](https://code-thinking-1253855093.file.myqcloud.com/pics/20201123101929791-20230310133845522.png) +![452.用最少数量的箭引爆气球](https://file.kamacoder.com/pics/20201123101929791-20230310133845522.png) 模拟射气球的过程,很多同学真的要去模拟了,实时把气球从数组中移走,这么写的话就复杂了,从前向后遍历重复的只要跳过就可以的。 @@ -21,7 +21,7 @@ 如图: -![435.无重叠区间](https://code-thinking-1253855093.file.myqcloud.com/pics/20201221201553618.png) +![435.无重叠区间](https://file.kamacoder.com/pics/20201221201553618.png) 细心的同学就发现了,此题和 [贪心算法:用最少数量的箭引爆气球](https://programmercarl.com/0452.用最少数量的箭引爆气球.html)非常像。 @@ -71,7 +71,7 @@ public: 如图: -![763.划分字母区间](https://code-thinking-1253855093.file.myqcloud.com/pics/20201222191924417-20230310133855435.png) +![763.划分字母区间](https://file.kamacoder.com/pics/20201222191924417-20230310133855435.png) ## 周四 @@ -86,7 +86,7 @@ public: 如图: -![56.合并区间](https://code-thinking-1253855093.file.myqcloud.com/pics/20201223200632791-20230310133859587.png) +![56.合并区间](https://file.kamacoder.com/pics/20201223200632791-20230310133859587.png) ## 总结 diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20210114\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20210114\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" index ebc720caa0..1b6bd84bcc 100644 --- "a/problems/\345\221\250\346\200\273\347\273\223/20210114\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" +++ "b/problems/\345\221\250\346\200\273\347\273\223/20210114\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" @@ -31,7 +31,7 @@ for (int i = 1; i < m; i++) { } ``` -![62.不同路径1](https://code-thinking-1253855093.file.myqcloud.com/pics/20201209113631392-20230310133703294.png) +![62.不同路径1](https://file.kamacoder.com/pics/20201209113631392-20230310133703294.png) ## 周二 @@ -45,7 +45,7 @@ dp[i][j]定义依然是:表示从(0 ,0)出发,到(i, j) 有dp[i][j]条 如图: -![63.不同路径II](https://code-thinking-1253855093.file.myqcloud.com/pics/20210104114513928-20230310133707783.png) +![63.不同路径II](https://file.kamacoder.com/pics/20210104114513928-20230310133707783.png) 这里难住了不少同学,代码如下: @@ -70,11 +70,11 @@ for (int i = 1; i < m; i++) { 拿示例1来举例如题: -![63.不同路径II1](https://code-thinking-1253855093.file.myqcloud.com/pics/20210104114548983-20230310133711888.png) +![63.不同路径II1](https://file.kamacoder.com/pics/20210104114548983-20230310133711888.png) 对应的dp table 如图: -![63.不同路径II2](https://code-thinking-1253855093.file.myqcloud.com/pics/20210104114610256-20230310133715981.png) +![63.不同路径II2](https://file.kamacoder.com/pics/20210104114610256-20230310133715981.png) ## 周三 @@ -111,7 +111,7 @@ for (int i = 3; i <= n ; i++) { 举例当n为10 的时候,dp数组里的数值,如下: -![343.整数拆分](https://code-thinking-1253855093.file.myqcloud.com/pics/20210104173021581-20230310133720552.png) +![343.整数拆分](https://file.kamacoder.com/pics/20210104173021581-20230310133720552.png) @@ -143,7 +143,7 @@ dp数组如何初始化:只需要初始化dp[0]就可以了,推导的基础 n为5时候的dp数组状态如图: -![96.不同的二叉搜索树3](https://code-thinking-1253855093.file.myqcloud.com/pics/20210107093253987-20230310133724531.png) +![96.不同的二叉搜索树3](https://file.kamacoder.com/pics/20210107093253987-20230310133724531.png) ## 总结 diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20210121\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20210121\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" index 7bae5ca9ee..dc32891da8 100644 --- "a/problems/\345\221\250\346\200\273\347\273\223/20210121\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" +++ "b/problems/\345\221\250\346\200\273\347\273\223/20210121\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" @@ -17,7 +17,7 @@ 关于其他几种常用的背包,大家看这张图就了然于胸了: -![416.分割等和子集1](https://code-thinking-1253855093.file.myqcloud.com/pics/20210117171307407-20230310133624872.png) +![416.分割等和子集1](https://file.kamacoder.com/pics/20210117171307407-20230310133624872.png) 本文用动规五部曲详细讲解了01背包的二维dp数组的实现方法,大家其实可以发现最简单的是推导公式了,推导公式估计看一遍就记下来了,但难就难在确定初始化和遍历顺序上。 @@ -70,7 +70,7 @@ for(int i = 1; i < weight.size(); i++) { // 遍历物品 来看一下对应的dp数组的数值,如图: -![动态规划-背包问题4](https://code-thinking-1253855093.file.myqcloud.com/pics/20210118163425129-20230310133630224.jpg) +![动态规划-背包问题4](https://file.kamacoder.com/pics/20210118163425129-20230310133630224.jpg) 最终结果就是dp[2][4]。 @@ -122,7 +122,7 @@ for(int i = 0; i < weight.size(); i++) { // 遍历物品 一维dp,分别用物品0,物品1,物品2 来遍历背包,最终得到结果如下: -![动态规划-背包问题9](https://code-thinking-1253855093.file.myqcloud.com/pics/20210110103614769-20230310133634873.png) +![动态规划-背包问题9](https://file.kamacoder.com/pics/20210110103614769-20230310133634873.png) ## 周三 diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20210128\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20210128\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" index e785af1228..8598ec69f0 100644 --- "a/problems/\345\221\250\346\200\273\347\273\223/20210128\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" +++ "b/problems/\345\221\250\346\200\273\347\273\223/20210128\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" @@ -35,7 +35,7 @@ bagSize = (S + sum) / 2 = (3 + 5) / 2 = 4 dp数组状态变化如下: -![494.目标和](https://code-thinking-1253855093.file.myqcloud.com/pics/20210125120743274-20230310132918821.jpg) +![494.目标和](https://file.kamacoder.com/pics/20210125120743274-20230310132918821.jpg) ## 周二 @@ -73,7 +73,7 @@ dp[i][j] = max(dp[i][j], dp[i - zeroNum][j - oneNum] + 1); 最后dp数组的状态如下所示: -![474.一和零](https://code-thinking-1253855093.file.myqcloud.com/pics/20210120111201512-20230310132936011.jpg) +![474.一和零](https://file.kamacoder.com/pics/20210120111201512-20230310132936011.jpg) ## 周三 diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20210225\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20210225\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" index 26d805bb3a..309f277f6a 100644 --- "a/problems/\345\221\250\346\200\273\347\273\223/20210225\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" +++ "b/problems/\345\221\250\346\200\273\347\273\223/20210225\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" @@ -30,7 +30,7 @@ dp[1] = max(nums[0], nums[1]); 以示例二,输入[2,7,9,3,1]为例。 -![198.打家劫舍](https://code-thinking-1253855093.file.myqcloud.com/pics/20210221170954115-20230310133425353.jpg) +![198.打家劫舍](https://file.kamacoder.com/pics/20210221170954115-20230310133425353.jpg) 红框dp[nums.size() - 1]为结果。 @@ -42,15 +42,15 @@ dp[1] = max(nums[0], nums[1]); * 情况一:考虑不包含首尾元素 -![213.打家劫舍II](https://code-thinking-1253855093.file.myqcloud.com/pics/20210129160748643.jpg) +![213.打家劫舍II](https://file.kamacoder.com/pics/20210129160748643.jpg) * 情况二:考虑包含首元素,不包含尾元素 -![213.打家劫舍II1](https://code-thinking-1253855093.file.myqcloud.com/pics/20210129160821374.jpg) +![213.打家劫舍II1](https://file.kamacoder.com/pics/20210129160821374.jpg) * 情况三:考虑包含尾元素,不包含首元素 -![213.打家劫舍II2](https://code-thinking-1253855093.file.myqcloud.com/pics/20210129160842491.jpg) +![213.打家劫舍II2](https://file.kamacoder.com/pics/20210129160842491.jpg) 需要注意的是,**“考虑” 不等于 “偷”**,例如情况三,虽然是考虑包含尾元素,但不一定要选尾部元素!对于情况三,取nums[1] 和 nums[3]就是最大的。 @@ -178,7 +178,7 @@ return {val2, val1}; 以示例1为例,dp数组状态如下:(**注意用后序遍历的方式推导**) -![337.打家劫舍III](https://code-thinking-1253855093.file.myqcloud.com/pics/20210129181331613.jpg) +![337.打家劫舍III](https://file.kamacoder.com/pics/20210129181331613.jpg) **最后头结点就是 取下标0 和 下标1的最大值就是偷得的最大金钱**。 diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20210304\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20210304\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" index ec442a3979..5d84fb1915 100644 --- "a/problems/\345\221\250\346\200\273\347\273\223/20210304\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" +++ "b/problems/\345\221\250\346\200\273\347\273\223/20210304\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" @@ -77,7 +77,7 @@ dp[0][4] = 0; 以输入[1,2,3,4,5]为例 -![123.买卖股票的最佳时机III](https://code-thinking-1253855093.file.myqcloud.com/pics/20201228181724295.png) +![123.买卖股票的最佳时机III](https://file.kamacoder.com/pics/20201228181724295.png) 可以看到红色框为最后两次卖出的状态。 @@ -144,7 +144,7 @@ for (int j = 1; j < 2 * k; j += 2) { 以输入[1,2,3,4,5],k=2为例。 -![188.买卖股票的最佳时机IV](https://code-thinking-1253855093.file.myqcloud.com/pics/20201229100358221-20230310133805763.png) +![188.买卖股票的最佳时机IV](https://file.kamacoder.com/pics/20201229100358221-20230310133805763.png) 最后一次卖出,一定是利润最大的,dp[prices.size() - 1][2 * k]即红色部分就是最后求解。 @@ -197,7 +197,7 @@ vector> dp(n, vector(3, 0)); 以 [1,2,3,0,2] 为例,dp数组如下: -![309.最佳买卖股票时机含冷冻期](https://code-thinking-1253855093.file.myqcloud.com/pics/20201229163725348.png) +![309.最佳买卖股票时机含冷冻期](https://file.kamacoder.com/pics/20201229163725348.png) 最后两个状态 不持有股票(能购买) 和 不持有股票(冷冻期)都有可能最后结果,取最大的。 diff --git "a/problems/\345\223\210\345\270\214\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\345\223\210\345\270\214\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" index b7d10671e1..92b590bc89 100644 --- "a/problems/\345\223\210\345\270\214\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\345\223\210\345\270\214\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -18,7 +18,7 @@ 哈希表中关键码就是数组的索引下标,然后通过下标直接访问数组中的元素,如下图所示: -![哈希表1](https://code-thinking-1253855093.file.myqcloud.com/pics/20210104234805168.png) +![哈希表1](https://file.kamacoder.com/pics/20210104234805168.png) 那么哈希表能解决什么问题呢,**一般哈希表都是用来快速判断一个元素是否出现集合里。** @@ -36,7 +36,7 @@ 哈希函数如下图所示,通过hashCode把名字转化为数值,一般hashcode是通过特定编码方式,可以将其他数据格式转化为不同的数值,这样就把学生名字映射为哈希表上的索引数字了。 -![哈希表2](https://code-thinking-1253855093.file.myqcloud.com/pics/2021010423484818.png) +![哈希表2](https://file.kamacoder.com/pics/2021010423484818.png) 如果hashCode得到的数值大于 哈希表的大小了,也就是大于tableSize了,怎么办呢? @@ -52,7 +52,7 @@ 如图所示,小李和小王都映射到了索引下标 1 的位置,**这一现象叫做哈希碰撞**。 -![哈希表3](https://code-thinking-1253855093.file.myqcloud.com/pics/2021010423494884.png) +![哈希表3](https://file.kamacoder.com/pics/2021010423494884.png) 一般哈希碰撞有两种解决方法, 拉链法和线性探测法。 @@ -60,7 +60,7 @@ 刚刚小李和小王在索引1的位置发生了冲突,发生冲突的元素都被存储在链表中。 这样我们就可以通过索引找到小李和小王了 -![哈希表4](https://code-thinking-1253855093.file.myqcloud.com/pics/20210104235015226.png) +![哈希表4](https://file.kamacoder.com/pics/20210104235015226.png) (数据规模是dataSize, 哈希表的大小为tableSize) @@ -72,7 +72,7 @@ 例如冲突的位置,放了小李,那么就向下找一个空位放置小王的信息。所以要求tableSize一定要大于dataSize ,要不然哈希表上就没有空置的位置来存放 冲突的数据了。如图所示: -![哈希表5](https://code-thinking-1253855093.file.myqcloud.com/pics/20210104235109950.png) +![哈希表5](https://file.kamacoder.com/pics/20210104235109950.png) 其实关于哈希碰撞还有非常多的细节,感兴趣的同学可以再好好研究一下,这里我就不再赘述了。 @@ -117,7 +117,7 @@ std::unordered_map 底层实现为哈希表,std::map 和std::multimap 的底 实际上功能都是一样一样的, 但是unordered_set在C++11的时候被引入标准库了,而hash_set并没有,所以建议还是使用unordered_set比较好,这就好比一个是官方认证的,hash_set,hash_map 是C++11标准之前民间高手自发造的轮子。 -![哈希表6](https://code-thinking-1253855093.file.myqcloud.com/pics/20210104235134572.png) +![哈希表6](https://file.kamacoder.com/pics/20210104235134572.png) ## 总结 diff --git "a/problems/\345\233\236\346\272\257\346\200\273\347\273\223.md" "b/problems/\345\233\236\346\272\257\346\200\273\347\273\223.md" index b8d96193ee..8fd69d518e 100644 --- "a/problems/\345\233\236\346\272\257\346\200\273\347\273\223.md" +++ "b/problems/\345\233\236\346\272\257\346\200\273\347\273\223.md" @@ -63,7 +63,7 @@ void backtracking(参数) { 本题我把回溯问题抽象为树形结构,如题: -![77.组合1](https://code-thinking-1253855093.file.myqcloud.com/pics/20201118152928844.png) +![77.组合1](https://file.kamacoder.com/pics/20201118152928844.png) 可以直观的看出其搜索的过程:**for循环横向遍历,递归纵向遍历,回溯不断调整结果集**,这个理念贯穿整个回溯法系列,也是我做了很多回溯的题目,不断摸索其规律才总结出来的。 @@ -73,7 +73,7 @@ void backtracking(参数) { 优化回溯算法只有剪枝一种方法,在[回溯算法:组合问题再剪剪枝](https://programmercarl.com/0077.组合优化.html)中把回溯法代码做了剪枝优化,树形结构如图: -![77.组合4](https://code-thinking-1253855093.file.myqcloud.com/pics/20201118153133458.png) +![77.组合4](https://file.kamacoder.com/pics/20201118153133458.png) 大家可以一目了然剪的究竟是哪里。 @@ -89,11 +89,11 @@ void backtracking(参数) { 在[回溯算法:求组合总和!](https://programmercarl.com/0216.组合总和III.html)中,相当于 [回溯算法:求组合问题!](https://programmercarl.com/0077.组合.html)加了一个元素总和的限制。 树形结构如图: -![216.组合总和III](https://code-thinking-1253855093.file.myqcloud.com/pics/20201118201921245.png) +![216.组合总和III](https://file.kamacoder.com/pics/20201118201921245.png) 整体思路还是一样的,本题的剪枝会好想一些,即:**已选元素总和如果已经大于n(题中要求的和)了,那么往后遍历就没有意义了,直接剪掉**,如图: -![216.组合总和III1](https://code-thinking-1253855093.file.myqcloud.com/pics/20201118202038240.png) +![216.组合总和III1](https://file.kamacoder.com/pics/20201118202038240.png) 在本题中,依然还可以有一个剪枝,就是[回溯算法:组合问题再剪剪枝](https://programmercarl.com/0077.组合优化.html)中提到的,对for循环选择的起始范围的剪枝。 @@ -114,7 +114,7 @@ void backtracking(参数) { **注意以上我只是说求组合的情况,如果是排列问题,又是另一套分析的套路**。 树形结构如下: -![39.组合总和](https://code-thinking-1253855093.file.myqcloud.com/pics/20201223170730367.png) +![39.组合总和](https://file.kamacoder.com/pics/20201223170730367.png) 最后还给出了本题的剪枝优化,如下: @@ -125,7 +125,7 @@ for (int i = startIndex; i < candidates.size() && sum + candidates[i] <= target; 优化后树形结构如下: -![39.组合总和1](https://code-thinking-1253855093.file.myqcloud.com/pics/20201118202115929.png) +![39.组合总和1](https://file.kamacoder.com/pics/20201118202115929.png) #### 组合总和(三) @@ -140,7 +140,7 @@ for (int i = startIndex; i < candidates.size() && sum + candidates[i] <= target; 都知道组合问题可以抽象为树形结构,那么“使用过”在这个树形结构上是有两个维度的,一个维度是同一树枝上“使用过”,一个维度是同一树层上“使用过”。**没有理解这两个层面上的“使用过” 是造成大家没有彻底理解去重的根本原因**。 -![40.组合总和II1](https://code-thinking-1253855093.file.myqcloud.com/pics/2020111820220675.png) +![40.组合总和II1](https://file.kamacoder.com/pics/2020111820220675.png) 我在图中将used的变化用橘黄色标注上,**可以看出在candidates[i] == candidates[i - 1]相同的情况下:** @@ -161,7 +161,7 @@ for (int i = startIndex; i < candidates.size() && sum + candidates[i] <= target; 树形结构如下: -![17. 电话号码的字母组合](https://code-thinking-1253855093.file.myqcloud.com/pics/20201118202335724.png) +![17. 电话号码的字母组合](https://file.kamacoder.com/pics/20201118202335724.png) 如果大家在现场面试的时候,一定要注意各种输入异常的情况,例如本题输入1 * #按键。 @@ -189,7 +189,7 @@ for (int i = startIndex; i < candidates.size() && sum + candidates[i] <= target; 树形结构如下: -![131.分割回文串](https://code-thinking-1253855093.file.myqcloud.com/pics/20201118202448642.png) +![131.分割回文串](https://file.kamacoder.com/pics/20201118202448642.png) ## 子集问题 @@ -200,7 +200,7 @@ for (int i = startIndex; i < candidates.size() && sum + candidates[i] <= target; 如图: -![78.子集](https://code-thinking-1253855093.file.myqcloud.com/pics/20201118202544339.png) +![78.子集](https://file.kamacoder.com/pics/20201118202544339.png) 认清这个本质之后,今天的题目就是一道模板题了。 @@ -227,14 +227,14 @@ if (startIndex >= nums.size()) { // 终止条件可以不加 树形结构如下: -![90.子集II](https://code-thinking-1253855093.file.myqcloud.com/pics/2020111217110449.png) +![90.子集II](https://file.kamacoder.com/pics/2020111217110449.png) ### 递增子序列 在[回溯算法:递增子序列](https://programmercarl.com/0491.递增子序列.html)中,处处都能看到子集的身影,但处处是陷阱,值得好好琢磨琢磨! 树形结构如下: -![491. 递增子序列1](https://code-thinking-1253855093.file.myqcloud.com/pics/20201112170832333.png) +![491. 递增子序列1](https://file.kamacoder.com/pics/20201112170832333.png) 很多同学都会把这道题目和[回溯算法:求子集问题(二)](https://programmercarl.com/0090.子集II.html)混在一起。 @@ -243,7 +243,7 @@ if (startIndex >= nums.size()) { // 终止条件可以不加 我用没有排序的集合{2,1,2,2}来举个例子画一个图,如下: -![90.子集II2](https://code-thinking-1253855093.file.myqcloud.com/pics/2020111316440479.png) +![90.子集II2](https://file.kamacoder.com/pics/2020111316440479.png) **相信这个图胜过千言万语的解释了**。 @@ -259,7 +259,7 @@ if (startIndex >= nums.size()) { // 终止条件可以不加 如图: -![46.全排列](https://code-thinking-1253855093.file.myqcloud.com/pics/20201112170304979.png) +![46.全排列](https://file.kamacoder.com/pics/20201112170304979.png) **大家此时可以感受出排列问题的不同:** @@ -272,7 +272,7 @@ if (startIndex >= nums.size()) { // 终止条件可以不加 树形结构如下: -![47.全排列II1](https://code-thinking-1253855093.file.myqcloud.com/pics/20201112171930470.png) +![47.全排列II1](https://file.kamacoder.com/pics/20201112171930470.png) **这道题目神奇的地方就是used[i - 1] == false也可以,used[i - 1] == true也可以!** @@ -280,11 +280,11 @@ if (startIndex >= nums.size()) { // 终止条件可以不加 树层上去重(used[i - 1] == false),的树形结构如下: -![47.全排列II2.png](https://code-thinking-1253855093.file.myqcloud.com/pics/20201112172230434.png) +![47.全排列II2.png](https://file.kamacoder.com/pics/20201112172230434.png) 树枝上去重(used[i - 1] == true)的树型结构如下: -![47.全排列II3](https://code-thinking-1253855093.file.myqcloud.com/pics/20201112172327967.png) +![47.全排列II3](https://file.kamacoder.com/pics/20201112172327967.png) **可以清晰的看到使用(used[i - 1] == false),即树层去重,效率更高!** @@ -318,7 +318,7 @@ used数组可是全局变量,每层与每层之间公用一个used数组,所 以输入:[["JFK", "KUL"], ["JFK", "NRT"], ["NRT", "JFK"]为例,抽象为树形结构如下: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/2020111518065555.png) +![](https://file.kamacoder.com/pics/2020111518065555.png) 本题可以算是一道hard的题目了,关于本题的难点我在文中已经详细列出。 @@ -335,7 +335,7 @@ used数组可是全局变量,每层与每层之间公用一个used数组,所 下面我用一个3 * 3 的棋盘,将搜索过程抽象为一棵树,如图: -![51.N皇后](https://code-thinking-1253855093.file.myqcloud.com/pics/20201118225433127.png) +![51.N皇后](https://file.kamacoder.com/pics/20201118225433127.png) 从图中,可以看出,二维矩阵中矩阵的高就是这棵树的高度,矩阵的宽就是树形结构中每一个节点的宽度。 @@ -363,7 +363,7 @@ used数组可是全局变量,每层与每层之间公用一个used数组,所 因为这个树形结构太大了,我抽取一部分,如图所示: -![37.解数独](https://code-thinking-1253855093.file.myqcloud.com/pics/2020111720451790.png) +![37.解数独](https://file.kamacoder.com/pics/2020111720451790.png) 解数独可以说是非常难的题目了,如果还一直停留在一维递归的逻辑中,这道题目可以让大家瞬间崩溃。 @@ -438,7 +438,7 @@ N皇后问题分析: 回溯专题汇聚为一张图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211030124742.png) +![](https://file.kamacoder.com/pics/20211030124742.png) 这个图是 [代码随想录知识星球](https://programmercarl.com/other/kstar.html) 成员:[莫非毛](https://wx.zsxq.com/dweb2/index/footprint/828844212542),所画,总结的非常好,分享给大家。 diff --git "a/problems/\345\233\236\346\272\257\347\256\227\346\263\225\345\216\273\351\207\215\351\227\256\351\242\230\347\232\204\345\217\246\344\270\200\347\247\215\345\206\231\346\263\225.md" "b/problems/\345\233\236\346\272\257\347\256\227\346\263\225\345\216\273\351\207\215\351\227\256\351\242\230\347\232\204\345\217\246\344\270\200\347\247\215\345\206\231\346\263\225.md" index f1e1570a61..5c20f562b6 100644 --- "a/problems/\345\233\236\346\272\257\347\256\227\346\263\225\345\216\273\351\207\215\351\227\256\351\242\230\347\232\204\345\217\246\344\270\200\347\247\215\345\206\231\346\263\225.md" +++ "b/problems/\345\233\236\346\272\257\347\256\227\346\263\225\345\216\273\351\207\215\351\227\256\351\242\230\347\232\204\345\217\246\344\270\200\347\247\215\345\206\231\346\263\225.md" @@ -15,7 +15,7 @@ 我用没有排序的集合{2,1,2,2}来举例子画一个图,如图: -![90.子集II2](https://code-thinking-1253855093.file.myqcloud.com/pics/2020111316440479-20230310121930316.png) +![90.子集II2](https://file.kamacoder.com/pics/2020111316440479-20230310121930316.png) 图中,大家就很明显的看到,子集重复了。 @@ -95,7 +95,7 @@ private: 如图: -![90.子集II1](https://code-thinking-1253855093.file.myqcloud.com/pics/202011131625054.png) +![90.子集II1](https://file.kamacoder.com/pics/202011131625054.png) 可以看出一旦把unordered_set uset放在类成员位置,它控制的就是整棵树,包括树枝。 diff --git "a/problems/\345\233\236\346\272\257\347\256\227\346\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\345\233\236\346\272\257\347\256\227\346\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md" index 474fb8f749..d31e9651b8 100644 --- "a/problems/\345\233\236\346\272\257\347\256\227\346\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\345\233\236\346\272\257\347\256\227\346\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -6,7 +6,7 @@ ## 题目分类 -回溯算法大纲 +回溯算法大纲 ## 算法公开课 @@ -114,7 +114,7 @@ if (终止条件) { 如图: -![回溯算法理论基础](https://code-thinking-1253855093.file.myqcloud.com/pics/20210130173631174.png) +![回溯算法理论基础](https://file.kamacoder.com/pics/20210130173631174.png) 注意图中,我特意举例集合大小和孩子的数量是相等的! diff --git "a/problems/\346\225\260\347\273\204\346\200\273\347\273\223\347\257\207.md" "b/problems/\346\225\260\347\273\204\346\200\273\347\273\223\347\257\207.md" index e45165a625..e29a7bd379 100644 --- "a/problems/\346\225\260\347\273\204\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/\346\225\260\347\273\204\346\200\273\347\273\223\347\257\207.md" @@ -125,7 +125,7 @@ ## 总结 -![](https://code-thinking-1253855093.file.myqcloud.com/pics/数组总结.png) +![](https://file.kamacoder.com/pics/数组总结.png) 这个图是 [代码随想录知识星球](https://programmercarl.com/other/kstar.html) 成员:[海螺人](https://wx.zsxq.com/dweb2/index/footprint/844412858822412),所画,总结的非常好,分享给大家。 diff --git "a/problems/\346\225\260\347\273\204\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\346\225\260\347\273\204\347\220\206\350\256\272\345\237\272\347\241\200.md" index c1ac287d0f..4000208a9b 100644 --- "a/problems/\346\225\260\347\273\204\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\346\225\260\347\273\204\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -40,7 +40,7 @@ 那么二维数组直接上图,大家应该就知道怎么回事了 -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240606105522.png) +![](https://file.kamacoder.com/pics/20240606105522.png) **那么二维数组在内存的空间地址是连续的么?** @@ -80,7 +80,7 @@ int main() { 如图: -![数组内存](https://code-thinking-1253855093.file.myqcloud.com/pics/20210310150641186.png) +![数组内存](https://file.kamacoder.com/pics/20210310150641186.png) **所以可以看出在C++中二维数组在地址空间上是连续的**。 @@ -111,7 +111,7 @@ public static void test_arr() { 所以Java的二维数组可能是如下排列的方式: -![算法通关数组3](https://code-thinking-1253855093.file.myqcloud.com/pics/20201214111631844.png) +![算法通关数组3](https://file.kamacoder.com/pics/20201214111631844.png) 这里面试中数组相关的理论知识就介绍完了。 diff --git "a/problems/\346\240\210\344\270\216\351\230\237\345\210\227\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\346\240\210\344\270\216\351\230\237\345\210\227\347\220\206\350\256\272\345\237\272\347\241\200.md" index bff0ec634b..912bfe1d70 100644 --- "a/problems/\346\240\210\344\270\216\351\230\237\345\210\227\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\346\240\210\344\270\216\351\230\237\345\210\227\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -11,7 +11,7 @@ 如图所示: -![栈与队列理论1](https://code-thinking-1253855093.file.myqcloud.com/pics/20210104235346563.png) +![栈与队列理论1](https://file.kamacoder.com/pics/20210104235346563.png) 那么我这里再列出四个关于栈的问题,大家可以思考一下。以下是以C++为例,使用其他编程语言的同学也对应思考一下,自己使用的编程语言里栈和队列是什么样的。 @@ -46,7 +46,7 @@ C++标准库是有多个版本的,要知道我们使用的STL是哪个版本 来说一说栈,栈先进后出,如图所示: -![栈与队列理论2](https://code-thinking-1253855093.file.myqcloud.com/pics/20210104235434905.png) +![栈与队列理论2](https://file.kamacoder.com/pics/20210104235434905.png) 栈提供push 和 pop 等等接口,所有元素必须符合先进后出规则,所以栈不提供走访功能,也不提供迭代器(iterator)。 不像是set 或者map 提供迭代器iterator来遍历所有元素。 @@ -59,7 +59,7 @@ C++标准库是有多个版本的,要知道我们使用的STL是哪个版本 从下图中可以看出,栈的内部结构,栈的底层实现可以是vector,deque,list 都是可以的, 主要就是数组和链表的底层实现。 -![栈与队列理论3](https://code-thinking-1253855093.file.myqcloud.com/pics/20210104235459376.png) +![栈与队列理论3](https://file.kamacoder.com/pics/20210104235459376.png) **我们常用的SGI STL,如果没有指定底层实现的话,默认是以deque为缺省情况下栈的底层结构。** diff --git "a/problems/\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227\357\274\210vector\345\216\237\347\220\206\350\256\262\350\247\243\357\274\211.md" "b/problems/\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227\357\274\210vector\345\216\237\347\220\206\350\256\262\350\247\243\357\274\211.md" index a2350835d6..162ee273e3 100644 --- "a/problems/\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227\357\274\210vector\345\216\237\347\220\206\350\256\262\350\247\243\357\274\211.md" +++ "b/problems/\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227\357\274\210vector\345\216\237\347\220\206\350\256\262\350\247\243\357\274\211.md" @@ -35,7 +35,7 @@ public: ``` 耗时如下: -![vectorinsert](https://code-thinking-1253855093.file.myqcloud.com/pics/20201218203611181.png) +![vectorinsert](https://file.kamacoder.com/pics/20201218203611181.png) 其直观上来看数组的insert操作是O(n)的,整体代码的时间复杂度是O(n^2)。 @@ -68,7 +68,7 @@ public: 耗时如下: -![使用链表](https://code-thinking-1253855093.file.myqcloud.com/pics/20201218200756257.png) +![使用链表](https://file.kamacoder.com/pics/20201218200756257.png) 大家都知道对于普通数组,一旦定义了大小就不能改变,例如int a[10];,这个数组a至多只能放10个元素,改不了的。 @@ -95,7 +95,7 @@ for (int i = 0; i < vec.size(); i++) { 就是重新申请一个二倍于原数组大小的数组,然后把数据都拷贝过去,并释放原数组内存。(对,就是这么原始粗暴的方法!) 举一个例子,如图: -![vector原理](https://code-thinking-1253855093.file.myqcloud.com/pics/20201218185902217.png) +![vector原理](https://file.kamacoder.com/pics/20201218185902217.png) 原vector中的size和capicity相同都是3,初始化为1 2 3,此时要push_back一个元素4。 @@ -138,7 +138,7 @@ public: 耗时如下: -![vector手动模拟insert](https://code-thinking-1253855093.file.myqcloud.com/pics/20201218200626718.png) +![vector手动模拟insert](https://file.kamacoder.com/pics/20201218200626718.png) 这份代码就是不让vector动态扩容,全程我们自己模拟insert的操作,大家也可以直观的看出是一个O(n^2)的方法了。 diff --git "a/problems/\350\203\214\345\214\205\346\200\273\347\273\223\347\257\207.md" "b/problems/\350\203\214\345\214\205\346\200\273\347\273\223\347\257\207.md" index 3c587b6d2e..9ce3fdda98 100644 --- "a/problems/\350\203\214\345\214\205\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/\350\203\214\345\214\205\346\200\273\347\273\223\347\257\207.md" @@ -11,7 +11,7 @@ 关于这几种常见的背包,其关系如下: -![416.分割等和子集1](https://code-thinking-1253855093.file.myqcloud.com/pics/20230310000726.png) +![416.分割等和子集1](https://file.kamacoder.com/pics/20230310000726.png) 通过这个图,可以很清晰分清这几种常见背包之间的关系。 @@ -93,7 +93,7 @@ 背包问题总结: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/背包问题1.jpeg) +![](https://file.kamacoder.com/pics/背包问题1.jpeg) 这个图是 [代码随想录知识星球](https://programmercarl.com/other/kstar.html) 成员:[海螺人](https://wx.zsxq.com/dweb2/index/footprint/844412858822412),所画结的非常好,分享给大家。 diff --git "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" index c2598ec99a..79751c89e9 100644 --- "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" +++ "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" @@ -21,7 +21,7 @@ 如果这几种背包,分不清,我这里画了一个图,如下: -![416.分割等和子集1](https://code-thinking-1253855093.file.myqcloud.com/pics/20210117171307407.png) +![416.分割等和子集1](https://file.kamacoder.com/pics/20210117171307407.png) 除此以外其他类型的背包,面试几乎不会问,都是竞赛级别的了,leetcode上连多重背包的题目都没有,所以题库也告诉我们,01背包和完全背包就够用了。 @@ -77,7 +77,7 @@ leetcode上没有纯01背包的问题,都是01背包应用方面的题目, 如图,二维数组为 dp[i][j]。 -![动态规划-背包问题1](https://code-thinking-1253855093.file.myqcloud.com/pics/20210110103003361.png) +![动态规划-背包问题1](https://file.kamacoder.com/pics/20210110103003361.png) 那么这里 i 、j、dp[i][j] 分别表示什么呢? @@ -91,7 +91,7 @@ i 来表示物品、j表示背包容量。 我们先看把物品0 放入背包的情况: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240730113455.png) +![](https://file.kamacoder.com/pics/20240730113455.png) 背包容量为0,放不下物品0,此时背包里的价值为0。 @@ -103,7 +103,7 @@ i 来表示物品、j表示背包容量。 再看把物品1 放入背包: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240730114228.png) +![](https://file.kamacoder.com/pics/20240730114228.png) 背包容量为 0,放不下物品0 或者物品1,此时背包里的价值为0。 @@ -150,7 +150,7 @@ i 来表示物品、j表示背包容量。 推导方向如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240730174246.png) +![](https://file.kamacoder.com/pics/20240730174246.png) 如果放物品1, **那么背包要先留出物品1的容量**,目前容量是4,物品1 的容量(就是物品1的重量)为3,此时背包剩下容量为1。 @@ -158,7 +158,7 @@ i 来表示物品、j表示背包容量。 所以 放物品1 的情况 = dp[0][1] + 物品1 的价值,推导方向如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240730174436.png) +![](https://file.kamacoder.com/pics/20240730174436.png) 两种情况,分别是放物品1 和 不放物品1,我们要取最大值(毕竟求的是最大价值) @@ -178,7 +178,7 @@ i 来表示物品、j表示背包容量。 首先从dp[i][j]的定义出发,如果背包容量j为0的话,即dp[i][0],无论是选取哪些物品,背包价值总和一定为0。如图: -![动态规划-背包问题2](https://code-thinking-1253855093.file.myqcloud.com/pics/2021011010304192.png) +![动态规划-背包问题2](https://file.kamacoder.com/pics/2021011010304192.png) 在看其他情况。 @@ -205,7 +205,7 @@ for (int j = weight[0]; j <= bagweight; j++) { 此时dp数组初始化情况如图所示: -![动态规划-背包问题7](https://code-thinking-1253855093.file.myqcloud.com/pics/20210110103109140.png) +![动态规划-背包问题7](https://file.kamacoder.com/pics/20210110103109140.png) dp[0][j] 和 dp[i][0] 都已经初始化了,那么其他下标应该初始化多少呢? @@ -217,7 +217,7 @@ dp[0][j] 和 dp[i][0] 都已经初始化了,那么其他下标应该初始化 如图: -![动态规划-背包问题10](https://code-thinking-1253855093.file.myqcloud.com/pics/%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92-%E8%83%8C%E5%8C%85%E9%97%AE%E9%A2%9810.jpg) +![动态规划-背包问题10](https://file.kamacoder.com/pics/%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92-%E8%83%8C%E5%8C%85%E9%97%AE%E9%A2%9810.jpg) 最后初始化代码如下: @@ -236,7 +236,7 @@ for (int j = weight[0]; j <= bagweight; j++) { 在如下图中,可以看出,有两个遍历的维度:物品与背包重量 -![动态规划-背包问题3](https://code-thinking-1253855093.file.myqcloud.com/pics/2021011010314055.png) +![动态规划-背包问题3](https://file.kamacoder.com/pics/2021011010314055.png) 那么问题来了,**先遍历 物品还是先遍历背包重量呢?** @@ -277,11 +277,11 @@ for(int j = 0; j <= bagweight; j++) { // 遍历背包容量 dp[i-1][j]和dp[i - 1][j - weight[i]] 都在dp[i][j]的左上角方向(包括正上方向),那么先遍历物品,再遍历背包的过程如图所示: -![动态规划-背包问题5](https://code-thinking-1253855093.file.myqcloud.com/pics/202101101032124.png) +![动态规划-背包问题5](https://file.kamacoder.com/pics/202101101032124.png) 再来看看先遍历背包,再遍历物品呢,如图: -![动态规划-背包问题6](https://code-thinking-1253855093.file.myqcloud.com/pics/20210110103244701.png) +![动态规划-背包问题6](https://file.kamacoder.com/pics/20210110103244701.png) **大家可以看出,虽然两个for循环遍历的次序不同,但是dp[i][j]所需要的数据就是左上角,根本不影响dp[i][j]公式的推导!** @@ -293,7 +293,7 @@ dp[i-1][j]和dp[i - 1][j - weight[i]] 都在dp[i][j]的左上角方向(包括 来看一下对应的dp数组的数值,如图: -![动态规划-背包问题4](https://code-thinking-1253855093.file.myqcloud.com/pics/20210118163425129.jpg) +![动态规划-背包问题4](https://file.kamacoder.com/pics/20210118163425129.jpg) 最终结果就是dp[2][4]。 diff --git "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" index 6caa4f6327..b6a68960a9 100644 --- "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" +++ "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" @@ -163,7 +163,7 @@ dp[1] = dp[1 - weight[0]] + value[0] = 15 一维dp,分别用物品0,物品1,物品2 来遍历背包,最终得到结果如下: -![动态规划-背包问题9](https://code-thinking-1253855093.file.myqcloud.com/pics/20210110103614769.png) +![动态规划-背包问题9](https://file.kamacoder.com/pics/20210110103614769.png) 本题力扣上没有原题,大家可以去[卡码网第46题](https://kamacoder.com/problempage.php?pid=1046)去练习,题意是一样的,代码如下: diff --git "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\345\256\214\345\205\250\350\203\214\345\214\205\344\270\200\347\273\264.md" "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\345\256\214\345\205\250\350\203\214\345\214\205\344\270\200\347\273\264.md" index 5a23b67c73..be7a5d54f9 100644 --- "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\345\256\214\345\205\250\350\203\214\345\214\205\344\270\200\347\273\264.md" +++ "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\345\256\214\345\205\250\350\203\214\345\214\205\344\270\200\347\273\264.md" @@ -54,11 +54,11 @@ for (int i = 1; i < n; i++) { // 遍历物品 遍历物品在外层循环,遍历背包容量在内层循环,状态如图: -![动态规划-完全背包1](https://code-thinking-1253855093.file.myqcloud.com/pics/20210126104529605.jpg) +![动态规划-完全背包1](https://file.kamacoder.com/pics/20210126104529605.jpg) 遍历背包容量在外层循环,遍历物品在内层循环,状态如图: -![动态规划-完全背包2](https://code-thinking-1253855093.file.myqcloud.com/pics/20210729234011.png) +![动态规划-完全背包2](https://file.kamacoder.com/pics/20210729234011.png) 看了这两个图,大家就会理解,完全背包中,两个for循环的先后循序,都不影响计算dp[j]所需要的值(这个值就是下标j之前所对应的dp[j])。 diff --git "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" index d76ff196b1..cb8db1e0e3 100644 --- "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" +++ "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" @@ -66,7 +66,7 @@ 推导方向如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20241126112952.png) +![](https://file.kamacoder.com/pics/20241126112952.png) 如果放物品1, **那么背包要先留出物品1的容量**,目前容量是4,物品1 的容量(就是物品1的重量)为3,此时背包剩下容量为1。 @@ -78,7 +78,7 @@ 所以 放物品1 的情况 = dp[1][1] + 物品1 的价值,推导方向如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20241126113104.png) +![](https://file.kamacoder.com/pics/20241126113104.png) (**注意上图和 [01背包理论基础(二维数组)](https://programmercarl.com/背包理论基础01背包-1.html) 中的区别**,对于理解完全背包很重要) @@ -103,7 +103,7 @@ 首先从dp[i][j]的定义出发,如果背包容量j为0的话,即dp[i][0],无论是选取哪些物品,背包价值总和一定为0。如图: -![动态规划-背包问题2](https://code-thinking-1253855093.file.myqcloud.com/pics/2021011010304192.png) +![动态规划-背包问题2](https://file.kamacoder.com/pics/2021011010304192.png) 在看其他情况。 @@ -132,7 +132,7 @@ for (int j = weight[0]; j <= bagWeight; j++) 此时dp数组初始化情况如图所示: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20241114161608.png) +![](https://file.kamacoder.com/pics/20241114161608.png) dp[0][j] 和 dp[i][0] 都已经初始化了,那么其他下标应该初始化多少呢? @@ -185,7 +185,7 @@ for(int j = 0; j <= bagWeight; j++) { // 遍历背包容量 以本篇举例数据为例,填满了dp二维数组如图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20241126113752.png) +![](https://file.kamacoder.com/pics/20241126113752.png) 因为 物品0 的性价比是最高的,而且 在完全背包中,每一类物品都有无限个,所以有无限个物品0,既然物品0 性价比最高,当然是优先放物品0。 diff --git "a/problems/\350\264\252\345\277\203\347\256\227\346\263\225\346\200\273\347\273\223\347\257\207.md" "b/problems/\350\264\252\345\277\203\347\256\227\346\263\225\346\200\273\347\273\223\347\257\207.md" index 7d4c57e877..4c67fb401a 100644 --- "a/problems/\350\264\252\345\277\203\347\256\227\346\263\225\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/\350\264\252\345\277\203\347\256\227\346\263\225\346\200\273\347\273\223\347\257\207.md" @@ -128,7 +128,7 @@ Carl个人认为:如果找出局部最优并可以推出全局最优,就是 贪心专题汇聚为一张图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/贪心总结water.png) +![](https://file.kamacoder.com/pics/贪心总结water.png) 这个图是 [代码随想录知识星球](https://programmercarl.com/other/kstar.html) 成员:[海螺人](https://wx.zsxq.com/dweb2/index/footprint/844412858822412)所画,总结的非常好,分享给大家。 diff --git "a/problems/\350\264\252\345\277\203\347\256\227\346\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\350\264\252\345\277\203\347\256\227\346\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md" index 14f397296f..2d0af8791a 100644 --- "a/problems/\350\264\252\345\277\203\347\256\227\346\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\350\264\252\345\277\203\347\256\227\346\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -7,7 +7,7 @@ 题目分类大纲如下: -贪心算法大纲 +贪心算法大纲 ## 算法公开课 diff --git "a/problems/\351\223\276\350\241\250\346\200\273\347\273\223\347\257\207.md" "b/problems/\351\223\276\350\241\250\346\200\273\347\273\223\347\257\207.md" index e29ba268a3..99bb2abcd0 100644 --- "a/problems/\351\223\276\350\241\250\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/\351\223\276\350\241\250\346\200\273\347\273\223\347\257\207.md" @@ -75,7 +75,7 @@ ## 总结 -![](https://code-thinking-1253855093.file.myqcloud.com/pics/链表总结.png) +![](https://file.kamacoder.com/pics/链表总结.png) 这个图是 [代码随想录知识星球](https://programmercarl.com/other/kstar.html) 成员:[海螺人](https://wx.zsxq.com/dweb2/index/footprint/844412858822412),所画,总结的非常好,分享给大家。 diff --git "a/problems/\351\223\276\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\351\223\276\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" index 3637d05f5a..5305c9a9dc 100644 --- "a/problems/\351\223\276\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\351\223\276\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -12,7 +12,7 @@ 链表的入口节点称为链表的头结点也就是head。 如图所示: -![链表1](https://code-thinking-1253855093.file.myqcloud.com/pics/20200806194529815.png) +![链表1](https://file.kamacoder.com/pics/20200806194529815.png) ## 链表的类型 @@ -31,7 +31,7 @@ 双链表 既可以向前查询也可以向后查询。 如图所示: -![链表2](https://code-thinking-1253855093.file.myqcloud.com/pics/20200806194559317.png) +![链表2](https://file.kamacoder.com/pics/20200806194559317.png) ### 循环链表 @@ -39,7 +39,7 @@ 循环链表可以用来解决约瑟夫环问题。 -![链表4](https://code-thinking-1253855093.file.myqcloud.com/pics/20200806194629603.png) +![链表4](https://file.kamacoder.com/pics/20200806194629603.png) ## 链表的存储方式 @@ -54,7 +54,7 @@ 如图所示: -![链表3](https://code-thinking-1253855093.file.myqcloud.com/pics/20200806194613920.png) +![链表3](https://file.kamacoder.com/pics/20200806194613920.png) 这个链表起始节点为2, 终止节点为7, 各个节点分布在内存的不同地址空间上,通过指针串联在一起。 @@ -104,7 +104,7 @@ head->val = 5; 删除D节点,如图所示: -![链表-删除节点](https://code-thinking-1253855093.file.myqcloud.com/pics/20200806195114541-20230310121459257.png) +![链表-删除节点](https://file.kamacoder.com/pics/20200806195114541-20230310121459257.png) 只要将C节点的next指针 指向E节点就可以了。 @@ -118,7 +118,7 @@ head->val = 5; 如图所示: -![链表-添加节点](https://code-thinking-1253855093.file.myqcloud.com/pics/20200806195134331-20230310121503147.png) +![链表-添加节点](https://file.kamacoder.com/pics/20200806195134331-20230310121503147.png) 可以看出链表的增添和删除都是O(1)操作,也不会影响到其他节点。 @@ -128,7 +128,7 @@ head->val = 5; 再把链表的特性和数组的特性进行一个对比,如图所示: -![链表-链表与数据性能对比](https://code-thinking-1253855093.file.myqcloud.com/pics/20200806195200276.png) +![链表-链表与数据性能对比](https://file.kamacoder.com/pics/20200806195200276.png) 数组在定义的时候,长度就是固定的,如果想改动数组的长度,就需要重新定义一个新的数组。 diff --git "a/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" "b/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" index f8d9039a48..0207b71eac 100644 --- "a/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" +++ "b/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" @@ -13,7 +13,7 @@ 图示两个链表在节点 c1 开始相交: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211219221657.png) +![](https://file.kamacoder.com/pics/20211219221657.png) 题目数据 保证 整个链式结构中不存在环。 @@ -21,15 +21,15 @@ 示例 1: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211219221723.png) +![](https://file.kamacoder.com/pics/20211219221723.png) 示例 2: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211219221749.png) +![](https://file.kamacoder.com/pics/20211219221749.png) 示例 3: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211219221812.png)![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211219221812.png) +![](https://file.kamacoder.com/pics/20211219221812.png) From ce6e658d14c5644c907fab6dfac58d88353a2ec3 Mon Sep 17 00:00:00 2001 From: kama Date: Mon, 19 May 2025 17:11:04 +0800 Subject: [PATCH 3019/3019] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=9B=BE=E7=89=87?= =?UTF-8?q?=E9=93=BE=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 16 +- ...44\346\225\260\344\271\213\345\222\214.md" | 4 +- ...36\346\226\207\345\255\220\344\270\262.md" | 4 +- ...11\346\225\260\344\271\213\345\222\214.md" | 2 +- ...27\346\257\215\347\273\204\345\220\210.md" | 4 +- ...33\346\225\260\344\271\213\345\222\214.md" | 0 ...4N\344\270\252\350\212\202\347\202\271.md" | 10 +- ...10\347\232\204\346\213\254\345\217\267.md" | 8 +- ...55\347\232\204\350\212\202\347\202\271.md" | 10 +- ...73\351\231\244\345\205\203\347\264\240.md" | 4 +- .../0028.\345\256\236\347\216\260strStr.md" | 20 +- ...00\344\270\252\346\216\222\345\210\227.md" | 2 +- ...00\344\270\252\344\275\215\347\275\256.md" | 0 ...22\345\205\245\344\275\215\347\275\256.md" | 10 +- ...7.\350\247\243\346\225\260\347\213\254.md" | 8 +- ...04\345\220\210\346\200\273\345\222\214.md" | 8 +- ...\345\220\210\346\200\273\345\222\214II.md" | 6 +- ...2.\346\216\245\351\233\250\346\260\264.md" | 14 +- ...\350\267\203\346\270\270\346\210\217II.md" | 6 +- ...6.\345\205\250\346\216\222\345\210\227.md" | 6 +- ...\345\205\250\346\216\222\345\210\227II.md" | 6 +- "problems/0051.N\347\232\207\345\220\216.md" | 6 +- .../0052.N\347\232\207\345\220\216II.md" | 2 +- ...47\345\255\220\345\272\217\345\222\214.md" | 2 +- ...01\350\247\204\345\210\222\357\274\211.md" | 2 +- ...72\346\227\213\347\237\251\351\230\265.md" | 2 +- ...63\350\267\203\346\270\270\346\210\217.md" | 2 +- ...10\345\271\266\345\214\272\351\227\264.md" | 2 +- ...\346\227\213\347\237\251\351\230\265II.md" | 2 +- ...15\345\220\214\350\267\257\345\276\204.md" | 10 +- ...\345\220\214\350\267\257\345\276\204II.md" | 12 +- ...0.\347\210\254\346\245\274\346\242\257.md" | 2 +- ...14\345\214\205\347\211\210\346\234\254.md" | 0 ...26\350\276\221\350\267\235\347\246\273.md" | 4 +- "problems/0077.\347\273\204\345\220\210.md" | 10 +- ...04\345\220\210\344\274\230\345\214\226.md" | 2 +- "problems/0078.\345\255\220\351\233\206.md" | 4 +- ...47\347\232\204\347\237\251\345\275\242.md" | 10 +- "problems/0090.\345\255\220\351\233\206II.md" | 2 +- ...\345\216\237IP\345\234\260\345\235\200.md" | 4 +- ...11\346\220\234\347\264\242\346\240\221.md" | 10 +- ...11\346\220\234\347\264\242\346\240\221.md" | 4 +- ...70\345\220\214\347\232\204\346\240\221.md" | 4 +- ...60\344\272\214\345\217\211\346\240\221.md" | 6 +- ...02\345\272\217\351\201\215\345\216\206.md" | 22 +- ...00\345\244\247\346\267\261\345\272\246.md" | 6 +- ...40\344\272\214\345\217\211\346\240\221.md" | 8 +- ...11\346\220\234\347\264\242\346\240\221.md" | 6 +- ...41\344\272\214\345\217\211\346\240\221.md" | 6 +- ...00\345\260\217\346\267\261\345\272\246.md" | 6 +- ...57\345\276\204\346\200\273\345\222\214.md" | 8 +- ...04\345\255\220\345\272\217\345\210\227.md" | 8 +- ...02\347\202\271\346\214\207\351\222\210.md" | 4 +- ...00\344\275\263\346\227\266\346\234\272.md" | 2 +- ...\344\275\263\346\227\266\346\234\272II.md" | 2 +- ...01\350\247\204\345\210\222\357\274\211.md" | 0 ...344\275\263\346\227\266\346\234\272III.md" | 2 +- ...25\350\257\215\346\216\245\351\276\231.md" | 2 +- ...60\345\255\227\344\271\213\345\222\214.md" | 2 +- ...25\347\232\204\345\214\272\345\237\237.md" | 6 +- ...62\345\233\236\346\226\207\344\270\262.md" | 4 +- ...\345\233\236\346\226\207\344\270\262II.md" | 2 +- ...4.\345\212\240\346\262\271\347\253\231.md" | 4 +- ...06\345\217\221\347\263\226\346\236\234.md" | 6 +- ...25\350\257\215\346\213\206\345\210\206.md" | 4 +- ...57\345\275\242\351\223\276\350\241\250.md" | 6 +- ...\345\275\242\351\223\276\350\241\250II.md" | 16 +- ...15\346\216\222\351\223\276\350\241\250.md" | 4 +- ...76\345\274\217\346\261\202\345\200\274.md" | 2 +- ...14\347\232\204\345\215\225\350\257\215.md" | 0 ...70\344\272\244\351\223\276\350\241\250.md" | 0 ...\344\275\263\346\227\266\346\234\272IV.md" | 2 +- ...13\350\275\254\346\225\260\347\273\204.md" | 0 ...23\345\256\266\345\212\253\350\210\215.md" | 2 +- ...7.\345\271\277\346\220\234\347\211\210.md" | 6 +- ...7.\346\267\261\346\220\234\347\211\210.md" | 4 +- ...2.\345\277\253\344\271\220\346\225\260.md" | 0 ...76\350\241\250\345\205\203\347\264\240.md" | 12 +- ...04\345\255\227\347\254\246\344\270\262.md" | 0 ...73\350\275\254\351\223\276\350\241\250.md" | 4 +- ...04\345\255\220\346\225\260\347\273\204.md" | 4 +- ...\345\256\266\345\212\253\350\210\215II.md" | 6 +- ...345\220\210\346\200\273\345\222\214III.md" | 6 +- ...02\347\202\271\344\270\252\346\225\260.md" | 12 +- ...27\345\256\236\347\216\260\346\240\210.md" | 2 +- ...54\344\272\214\345\217\211\346\240\221.md" | 6 +- ...36\347\216\260\351\230\237\345\210\227.md" | 2 +- ...36\346\226\207\351\223\276\350\241\250.md" | 2 +- ...54\345\205\261\347\245\226\345\205\210.md" | 6 +- ...54\345\205\261\347\245\226\345\205\210.md" | 12 +- ...43\346\234\200\345\244\247\345\200\274.md" | 6 +- ...15\345\274\202\344\275\215\350\257\215.md" | 2 +- ...00\346\234\211\350\267\257\345\276\204.md" | 6 +- ...50\345\271\263\346\226\271\346\225\260.md" | 2 +- ...3.\347\247\273\345\212\250\351\233\266.md" | 2 +- ...07\345\255\220\345\272\217\345\210\227.md" | 2 +- ...53\345\206\267\345\206\273\346\234\237.md" | 4 +- ...66\351\222\261\345\205\221\346\215\242.md" | 2 +- ...11\346\216\222\350\241\214\347\250\213.md" | 6 +- ...345\256\266\345\212\253\350\210\215III.md" | 4 +- ...64\346\225\260\346\213\206\345\210\206.md" | 2 +- ...54\345\255\227\347\254\246\344\270\262.md" | 2 +- ...30\351\242\221\345\205\203\347\264\240.md" | 2 +- ...04\347\232\204\344\272\244\351\233\206.md" | 4 +- ...06\345\212\250\345\272\217\345\210\227.md" | 12 +- ...10\346\200\273\345\222\214\342\205\243.md" | 2 +- ...3.\350\265\216\351\207\221\344\277\241.md" | 0 ...55\345\255\220\345\272\217\345\210\227.md" | 6 +- ...66\345\255\220\344\271\213\345\222\214.md" | 6 +- ...15\345\273\272\351\230\237\345\210\227.md" | 2 +- ...11\345\222\214\345\255\220\351\233\206.md" | 2 +- ...64\346\265\201\351\227\256\351\242\230.md" | 6 +- ...15\345\217\240\345\214\272\351\227\264.md" | 2 +- ...55\347\232\204\350\212\202\347\202\271.md" | 4 +- ...25\347\210\206\346\260\224\347\220\203.md" | 2 +- ...\346\225\260\347\233\270\345\212\240II.md" | 0 ...06\345\217\221\351\245\274\345\271\262.md" | 4 +- ...20\345\255\227\347\254\246\344\270\262.md" | 32 +- ...77\347\232\204\345\221\250\351\225\277.md" | 6 +- ...4.\344\270\200\345\222\214\351\233\266.md" | 4 +- ...36\345\255\220\345\272\217\345\210\227.md" | 4 +- ...4.\347\233\256\346\240\207\345\222\214.md" | 30 +- ...4\345\244\247\345\205\203\347\264\240I.md" | 0 ...55\347\232\204\344\274\227\346\225\260.md" | 4 +- ...\345\244\247\345\205\203\347\264\240II.md" | 0 ...42\351\202\243\345\245\221\346\225\260.md" | 0 ...13\350\247\222\347\232\204\345\200\274.md" | 4 +- ...07\345\255\220\345\272\217\345\210\227.md" | 8 +- ...\351\222\261\345\205\221\346\215\242II.md" | 4 +- ...17\347\273\235\345\257\271\345\267\256.md" | 4 +- ...72\347\264\257\345\212\240\346\240\221.md" | 4 +- ...\345\255\227\347\254\246\344\270\262II.md" | 2 +- ...40\351\231\244\346\223\215\344\275\234.md" | 2 +- ...66\344\272\214\345\217\211\346\240\221.md" | 4 +- ...36\346\226\207\345\255\220\344\270\262.md" | 6 +- ...a2\345\217\202\350\256\256\351\231\242.md" | 0 ...47\344\272\214\345\217\211\346\240\221.md" | 4 +- ...24\345\233\236\345\216\237\347\202\271.md" | 2 +- ...11\346\220\234\347\264\242\346\240\221.md" | 10 +- ...27\347\232\204\344\270\252\346\225\260.md" | 2 +- ...22\345\242\236\345\272\217\345\210\227.md" | 2 +- ...27\344\275\231\350\277\236\346\216\245.md" | 6 +- ...\344\275\231\350\277\236\346\216\245II.md" | 8 +- ...00\345\244\247\351\235\242\347\247\257.md" | 4 +- ...55\347\232\204\346\220\234\347\264\242.md" | 4 +- ...22\345\205\245\346\223\215\344\275\234.md" | 4 +- ...14\345\210\206\346\237\245\346\211\276.md" | 4 +- ...76\350\256\241\351\223\276\350\241\250.md" | 6 +- ...53\346\211\213\347\273\255\350\264\271.md" | 0 ...01\350\247\204\345\210\222\357\274\211.md" | 0 ...15\345\255\220\346\225\260\347\273\204.md" | 4 +- ...55\345\277\203\347\264\242\345\274\225.md" | 0 ...36\347\232\204\346\225\260\345\255\227.md" | 0 ...17\346\227\245\346\270\251\345\272\246.md" | 24 +- ...66\350\277\237\346\227\266\351\227\264.md" | 46 +-- ...71\347\210\254\346\245\274\346\242\257.md" | 4 +- ...27\346\257\215\345\214\272\351\227\264.md" | 2 +- ...34\347\232\204\350\210\252\347\217\255.md" | 6 +- ...75\347\232\204\350\267\257\345\276\204.md" | 4 +- ...47\344\272\272\345\267\245\345\262\233.md" | 6 +- ...31\345\222\214\346\210\277\351\227\264.md" | 4 +- ...04\345\255\227\347\254\246\344\270\262.md" | 2 +- ...54\346\260\264\346\211\276\351\233\266.md" | 0 ...\345\272\217\346\225\260\347\273\204II.md" | 0 ...77\346\214\211\351\224\256\345\205\245.md" | 2 +- ...61\350\204\211\346\225\260\347\273\204.md" | 4 +- ...47\344\272\214\345\217\211\346\240\221.md" | 10 +- ...04\347\232\204\345\271\263\346\226\271.md" | 2 +- ...70\347\224\250\345\255\227\347\254\246.md" | 2 +- ...04\346\225\260\347\273\204\345\222\214.md" | 0 ...60\347\232\204\346\225\260\351\207\217.md" | 8 +- ...70\344\272\244\347\232\204\347\272\277.md" | 4 +- ...73\351\207\215\345\244\215\351\241\271.md" | 2 +- ...\347\232\204\351\207\215\351\207\217II.md" | 2 +- ...61\345\255\220\345\272\217\345\210\227.md" | 4 +- ...72\347\216\260\346\254\241\346\225\260.md" | 2 +- ...41\345\255\227\347\254\246\344\270\262.md" | 0 ...77\347\232\204\346\225\260\347\233\256.md" | 4 +- ...60\347\233\256\346\216\222\345\272\217.md" | 2 +- ...27\347\232\204\346\225\260\345\255\227.md" | 2 +- ...21\345\217\230\345\271\263\350\241\241.md" | 2 +- ...55\345\277\203\350\212\202\347\202\271.md" | 2 +- ...30\345\234\250\350\267\257\345\276\204.md" | 2 +- ...57\345\244\232\345\244\247\357\274\237.md" | 10 +- ...55\344\271\260\345\234\237\345\234\260.md" | 1 + ...17\202\344\274\232dijkstra\345\240\206.md" | 15 +- ...74\232dijkstra\346\234\264\347\264\240.md" | 41 +-- .../0053.\345\257\273\345\256\235-Kruskal.md" | 21 +- .../0053.\345\257\273\345\256\235-prim.md" | 23 +- ...77\346\215\242\346\225\260\345\255\227.md" | 5 +- ...13\345\255\227\347\254\246\344\270\262.md" | 9 +- ...8.\345\214\272\351\227\264\345\222\214.md" | 5 +- ...\211\251\350\277\220\350\276\223I-SPFA.md" | 21 +- ...7\347\211\251\350\277\220\350\276\223I.md" | 21 +- ...\347\211\251\350\277\220\350\276\223II.md" | 5 +- ...347\211\251\350\277\220\350\276\223III.md" | 41 +-- ...16\351\200\233\345\205\254\345\233\255.md" | 13 +- ...57\350\276\276\350\267\257\345\276\204.md" | 5 +- ...60\351\207\217\345\271\277\346\220\234.md" | 7 +- ...60\351\207\217\346\267\261\346\220\234.md" | 5 +- ...00\345\244\247\351\235\242\347\247\257.md" | 5 +- ...04\346\200\273\351\235\242\347\247\257.md" | 7 +- ...11\346\262\241\345\255\244\345\262\233.md" | 7 +- ...64\346\265\201\351\227\256\351\242\230.md" | 7 +- ...00\345\244\247\345\262\233\345\261\277.md" | 11 +- ...50\345\217\257\350\276\276\346\200\247.md" | 5 +- ...77\347\232\204\345\221\250\351\225\277.md" | 9 +- ...50\347\232\204\350\267\257\345\276\204.md" | 3 +- ...27\344\275\231\350\277\236\346\216\245.md" | 13 +- ...\344\275\231\350\277\236\346\216\245II.md" | 13 +- ...46\344\270\262\346\216\245\351\276\231.md" | 5 +- ...57\344\273\266\346\236\204\345\273\272.md" | 23 +- ...7\232\204\346\224\273\345\207\273astar.md" | 9 +- ...347\224\250ACM\346\250\241\345\274\217.md" | 1 + ...06\350\256\272\345\237\272\347\241\200.md" | 25 +- ...06\350\256\272\345\237\272\347\241\200.md" | 7 +- ...72\346\200\273\347\273\223\347\257\207.md" | 1 + ...06\350\256\272\345\237\272\347\241\200.md" | 15 +- ...06\350\256\272\345\237\272\347\241\200.md" | 31 +- ...30\346\200\273\347\273\223\347\257\207.md" | 3 +- problems/qita/acm.md | 20 +- problems/qita/acm_backup.md | 89 +++++ problems/qita/algo_pdf.md | 70 ++++ problems/qita/ewaishuoming.md | 16 + problems/qita/gongkaike.md | 162 +++++++++ problems/qita/join.md | 48 +-- problems/qita/language.md | 22 ++ problems/qita/publish.md | 200 +++++++++++ problems/qita/say_feel.md | 14 + problems/qita/server.md | 6 +- problems/qita/shejimoshi.md | 14 +- problems/qita/tulunfabu.md | 34 +- problems/qita/tulunshuoming.md | 44 +++ problems/qita/update.md | 56 ++++ ...11\346\255\245\351\223\272\345\236\253.md" | 0 ...46\347\235\200\345\233\236\346\272\257.md" | 0 ...21\346\200\273\347\273\223\347\257\207.md" | 2 +- ...06\350\256\272\345\237\272\347\241\200.md" | 16 +- ...00\350\277\255\344\273\243\346\263\225.md" | 2 +- ...55\344\273\243\351\201\215\345\216\206.md" | 6 +- ...22\345\275\222\351\201\215\345\216\206.md" | 0 .../ACM\346\250\241\345\274\217.md" | 18 +- ...72\344\272\214\345\217\211\346\240\221.md" | 18 +- ...50\350\277\231\351\207\214\344\272\206.md" | 2 +- .../\345\211\215\345\272\217/gitserver.md" | 312 ++++++++++++++++++ .../\345\211\215\345\272\217/kvstore.md" | 124 +++++++ "problems/\345\211\215\345\272\217/server.md" | 129 ++++++++ "problems/\345\211\215\345\272\217/vim.md" | 4 +- ...54\345\217\270\346\200\273\347\273\223.md" | 125 ------- ...24\345\217\221\346\265\201\347\250\213.md" | 240 -------------- ...43\347\240\201\351\243\216\346\240\274.md" | 4 +- ...05\345\255\230\346\266\210\350\200\227.md" | 10 +- ...26\350\257\221\350\277\220\350\241\214.md" | 2 +- ...54\345\217\270\346\200\273\347\273\223.md" | 109 ------ ...54\345\217\270\346\200\273\347\273\223.md" | 77 ----- ...54\345\217\270\346\200\273\347\273\223.md" | 72 ---- ...64\345\244\215\346\235\202\345\272\246.md" | 8 +- ...54\345\217\270\346\200\273\347\273\223.md" | 83 ----- ...54\345\217\270\346\200\273\347\273\223.md" | 79 ----- ...07\346\241\243\345\267\245\345\205\267.md" | 2 +- ...17\345\221\230\347\256\200\345\216\206.md" | 6 +- ...64\345\244\215\346\235\202\345\272\246.md" | 2 +- ...27\346\263\225\350\266\205\346\227\266.md" | 12 +- ...02\345\272\246\345\210\206\346\236\220.md" | 8 +- ...64\345\244\215\346\235\202\345\272\246.md" | 6 +- ...77\346\215\242\347\251\272\346\240\274.md" | 4 +- ...54\345\255\227\347\254\246\344\270\262.md" | 8 +- ...30\346\200\273\347\273\223\347\257\207.md" | 2 +- ...22\346\200\273\347\273\223\347\257\207.md" | 6 +- ...06\350\256\272\345\237\272\347\241\200.md" | 2 +- ...07\351\222\210\346\200\273\347\273\223.md" | 0 ...50\346\234\253\346\200\273\347\273\223.md" | 2 +- ...50\346\234\253\346\200\273\347\273\223.md" | 4 +- ...50\346\234\253\346\200\273\347\273\223.md" | 2 +- ...50\346\234\253\346\200\273\347\273\223.md" | 2 +- ...50\346\234\253\346\200\273\347\273\223.md" | 2 +- ...50\346\234\253\346\200\273\347\273\223.md" | 12 +- ...50\346\234\253\346\200\273\347\273\223.md" | 14 +- ...50\346\234\253\346\200\273\347\273\223.md" | 2 +- ...50\346\234\253\346\200\273\347\273\223.md" | 12 +- ...50\346\234\253\346\200\273\347\273\223.md" | 4 +- ...50\346\234\253\346\200\273\347\273\223.md" | 6 +- ...50\346\234\253\346\200\273\347\273\223.md" | 10 +- ...50\346\234\253\346\200\273\347\273\223.md" | 2 +- ...50\346\234\253\346\200\273\347\273\223.md" | 14 +- ...50\346\234\253\346\200\273\347\273\223.md" | 8 +- ...50\346\234\253\346\200\273\347\273\223.md" | 6 +- ...50\346\234\253\346\200\273\347\273\223.md" | 2 +- ...50\346\234\253\346\200\273\347\273\223.md" | 12 +- ...50\346\234\253\346\200\273\347\273\223.md" | 8 +- ...23\347\263\273\345\210\227\344\270\200.md" | 2 +- ...14\350\241\250\346\200\273\347\273\223.md" | 0 ...06\350\256\272\345\237\272\347\241\200.md" | 12 +- ...36\346\272\257\346\200\273\347\273\223.md" | 42 +-- ...00\347\247\215\345\206\231\346\263\225.md" | 4 +- ...06\350\256\272\345\237\272\347\241\200.md" | 4 +- ...46\344\270\262\346\200\273\347\273\223.md" | 0 ...04\346\200\273\347\273\223\347\257\207.md" | 10 +- ...06\350\256\272\345\237\272\347\241\200.md" | 10 +- ...37\345\210\227\346\200\273\347\273\223.md" | 0 ...06\350\256\272\345\237\272\347\241\200.md" | 6 +- ...06\350\256\262\350\247\243\357\274\211.md" | 8 +- ...27\346\263\225\346\250\241\346\235\277.md" | 0 ...05\346\200\273\347\273\223\347\257\207.md" | 4 +- ...47\241\20001\350\203\214\345\214\205-1.md" | 26 +- ...47\241\20001\350\203\214\345\214\205-2.md" | 2 +- ...14\345\214\205\344\270\200\347\273\264.md" | 4 +- ...32\351\207\215\350\203\214\345\214\205.md" | 0 ...14\345\205\250\350\203\214\345\214\205.md" | 10 +- ...25\346\200\273\347\273\223\347\257\207.md" | 2 +- ...06\350\256\272\345\237\272\347\241\200.md" | 2 +- ...02\345\272\246\345\210\206\346\236\220.md" | 281 ++++++++++++++++ ...50\346\200\273\347\273\223\347\257\207.md" | 2 +- ...06\350\256\272\345\237\272\347\241\200.md" | 14 +- ...76\350\241\250\347\233\270\344\272\244.md" | 12 +- 315 files changed, 2499 insertions(+), 1729 deletions(-) mode change 100644 => 100755 "problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" mode change 100644 => 100755 "problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" mode change 100644 => 100755 "problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" mode change 100644 => 100755 "problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" mode change 100644 => 100755 "problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" mode change 100644 => 100755 "problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" mode change 100644 => 100755 "problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" mode change 100644 => 100755 "problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" mode change 100644 => 100755 "problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" mode change 100644 => 100755 "problems/0028.\345\256\236\347\216\260strStr.md" mode change 100644 => 100755 "problems/0031.\344\270\213\344\270\200\344\270\252\346\216\222\345\210\227.md" mode change 100644 => 100755 "problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" mode change 100644 => 100755 "problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" mode change 100644 => 100755 "problems/0037.\350\247\243\346\225\260\347\213\254.md" mode change 100644 => 100755 "problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" mode change 100644 => 100755 "problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" mode change 100644 => 100755 "problems/0042.\346\216\245\351\233\250\346\260\264.md" mode change 100644 => 100755 "problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" mode change 100644 => 100755 "problems/0046.\345\205\250\346\216\222\345\210\227.md" mode change 100644 => 100755 "problems/0047.\345\205\250\346\216\222\345\210\227II.md" mode change 100644 => 100755 "problems/0051.N\347\232\207\345\220\216.md" mode change 100644 => 100755 "problems/0052.N\347\232\207\345\220\216II.md" mode change 100644 => 100755 "problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" mode change 100644 => 100755 "problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" mode change 100644 => 100755 "problems/0054.\350\236\272\346\227\213\347\237\251\351\230\265.md" mode change 100644 => 100755 "problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" mode change 100644 => 100755 "problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" mode change 100644 => 100755 "problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" mode change 100644 => 100755 "problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" mode change 100644 => 100755 "problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" mode change 100644 => 100755 "problems/0070.\347\210\254\346\245\274\346\242\257.md" mode change 100644 => 100755 "problems/0070.\347\210\254\346\245\274\346\242\257\345\256\214\345\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md" mode change 100644 => 100755 "problems/0072.\347\274\226\350\276\221\350\267\235\347\246\273.md" mode change 100644 => 100755 "problems/0077.\347\273\204\345\220\210.md" mode change 100644 => 100755 "problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" mode change 100644 => 100755 "problems/0078.\345\255\220\351\233\206.md" mode change 100644 => 100755 "problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" mode change 100644 => 100755 "problems/0090.\345\255\220\351\233\206II.md" mode change 100644 => 100755 "problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" mode change 100644 => 100755 "problems/0096.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" mode change 100644 => 100755 "problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" mode change 100644 => 100755 "problems/0100.\347\233\270\345\220\214\347\232\204\346\240\221.md" mode change 100644 => 100755 "problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" mode change 100644 => 100755 "problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" mode change 100644 => 100755 "problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" mode change 100644 => 100755 "problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" mode change 100644 => 100755 "problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" mode change 100644 => 100755 "problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" mode change 100644 => 100755 "problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" mode change 100644 => 100755 "problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" mode change 100644 => 100755 "problems/0115.\344\270\215\345\220\214\347\232\204\345\255\220\345\272\217\345\210\227.md" mode change 100644 => 100755 "problems/0116.\345\241\253\345\205\205\346\257\217\344\270\252\350\212\202\347\202\271\347\232\204\344\270\213\344\270\200\344\270\252\345\217\263\344\276\247\350\212\202\347\202\271\346\214\207\351\222\210.md" mode change 100644 => 100755 "problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" mode change 100644 => 100755 "problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" mode change 100644 => 100755 "problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" mode change 100644 => 100755 "problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" mode change 100644 => 100755 "problems/0127.\345\215\225\350\257\215\346\216\245\351\276\231.md" mode change 100644 => 100755 "problems/0129.\346\261\202\346\240\271\345\210\260\345\217\266\345\255\220\350\212\202\347\202\271\346\225\260\345\255\227\344\271\213\345\222\214.md" mode change 100644 => 100755 "problems/0130.\350\242\253\345\233\264\347\273\225\347\232\204\345\214\272\345\237\237.md" mode change 100644 => 100755 "problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" mode change 100644 => 100755 "problems/0132.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262II.md" mode change 100644 => 100755 "problems/0134.\345\212\240\346\262\271\347\253\231.md" mode change 100644 => 100755 "problems/0135.\345\210\206\345\217\221\347\263\226\346\236\234.md" mode change 100644 => 100755 "problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" mode change 100644 => 100755 "problems/0141.\347\216\257\345\275\242\351\223\276\350\241\250.md" mode change 100644 => 100755 "problems/0142.\347\216\257\345\275\242\351\223\276\350\241\250II.md" mode change 100644 => 100755 "problems/0143.\351\207\215\346\216\222\351\223\276\350\241\250.md" mode change 100644 => 100755 "problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" mode change 100644 => 100755 "problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" mode change 100644 => 100755 "problems/0160.\347\233\270\344\272\244\351\223\276\350\241\250.md" mode change 100644 => 100755 "problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" mode change 100644 => 100755 "problems/0189.\346\227\213\350\275\254\346\225\260\347\273\204.md" mode change 100644 => 100755 "problems/0198.\346\211\223\345\256\266\345\212\253\350\210\215.md" mode change 100644 => 100755 "problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\345\271\277\346\220\234\347\211\210.md" mode change 100644 => 100755 "problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\346\267\261\346\220\234\347\211\210.md" mode change 100644 => 100755 "problems/0202.\345\277\253\344\271\220\346\225\260.md" mode change 100644 => 100755 "problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" mode change 100644 => 100755 "problems/0205.\345\220\214\346\236\204\345\255\227\347\254\246\344\270\262.md" mode change 100644 => 100755 "problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md" mode change 100644 => 100755 "problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" mode change 100644 => 100755 "problems/0213.\346\211\223\345\256\266\345\212\253\350\210\215II.md" mode change 100644 => 100755 "problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" mode change 100644 => 100755 "problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" mode change 100644 => 100755 "problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" mode change 100644 => 100755 "problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" mode change 100644 => 100755 "problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" mode change 100644 => 100755 "problems/0234.\345\233\236\346\226\207\351\223\276\350\241\250.md" mode change 100644 => 100755 "problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" mode change 100644 => 100755 "problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" mode change 100644 => 100755 "problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" mode change 100644 => 100755 "problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" mode change 100644 => 100755 "problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" mode change 100644 => 100755 "problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" mode change 100644 => 100755 "problems/0283.\347\247\273\345\212\250\351\233\266.md" mode change 100644 => 100755 "problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" mode change 100644 => 100755 "problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" mode change 100644 => 100755 "problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" mode change 100644 => 100755 "problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" mode change 100644 => 100755 "problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" mode change 100644 => 100755 "problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" mode change 100644 => 100755 "problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" mode change 100644 => 100755 "problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" mode change 100644 => 100755 "problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" mode change 100644 => 100755 "problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" mode change 100644 => 100755 "problems/0377.\347\273\204\345\220\210\346\200\273\345\222\214\342\205\243.md" mode change 100644 => 100755 "problems/0383.\350\265\216\351\207\221\344\277\241.md" mode change 100644 => 100755 "problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" mode change 100644 => 100755 "problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" mode change 100644 => 100755 "problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" mode change 100644 => 100755 "problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" mode change 100644 => 100755 "problems/0417.\345\244\252\345\271\263\346\264\213\345\244\247\350\245\277\346\264\213\346\260\264\346\265\201\351\227\256\351\242\230.md" mode change 100644 => 100755 "problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" mode change 100644 => 100755 "problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" mode change 100644 => 100755 "problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" mode change 100644 => 100755 "problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" mode change 100644 => 100755 "problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" mode change 100644 => 100755 "problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" mode change 100644 => 100755 "problems/0463.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" mode change 100644 => 100755 "problems/0474.\344\270\200\345\222\214\351\233\266.md" mode change 100644 => 100755 "problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" mode change 100644 => 100755 "problems/0494.\347\233\256\346\240\207\345\222\214.md" mode change 100644 => 100755 "problems/0496.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240I.md" mode change 100644 => 100755 "problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" mode change 100644 => 100755 "problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" mode change 100644 => 100755 "problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" mode change 100644 => 100755 "problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" mode change 100644 => 100755 "problems/0516.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\345\272\217\345\210\227.md" mode change 100644 => 100755 "problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" mode change 100644 => 100755 "problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" mode change 100644 => 100755 "problems/0538.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md" mode change 100644 => 100755 "problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" mode change 100644 => 100755 "problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" mode change 100644 => 100755 "problems/0617.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md" mode change 100644 => 100755 "problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" mode change 100644 => 100755 "problems/0649.Dota2\345\217\202\350\256\256\351\231\242.md" mode change 100644 => 100755 "problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" mode change 100644 => 100755 "problems/0657.\346\234\272\345\231\250\344\272\272\350\203\275\345\220\246\350\277\224\345\233\236\345\216\237\347\202\271.md" mode change 100644 => 100755 "problems/0669.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" mode change 100644 => 100755 "problems/0673.\346\234\200\351\225\277\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227\347\232\204\344\270\252\346\225\260.md" mode change 100644 => 100755 "problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" mode change 100644 => 100755 "problems/0684.\345\206\227\344\275\231\350\277\236\346\216\245.md" mode change 100644 => 100755 "problems/0685.\345\206\227\344\275\231\350\277\236\346\216\245II.md" mode change 100644 => 100755 "problems/0695.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" mode change 100644 => 100755 "problems/0700.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\220\234\347\264\242.md" mode change 100644 => 100755 "problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" mode change 100644 => 100755 "problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" mode change 100644 => 100755 "problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" mode change 100644 => 100755 "problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271.md" mode change 100644 => 100755 "problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" mode change 100644 => 100755 "problems/0718.\346\234\200\351\225\277\351\207\215\345\244\215\345\255\220\346\225\260\347\273\204.md" mode change 100644 => 100755 "problems/0724.\345\257\273\346\211\276\346\225\260\347\273\204\347\232\204\344\270\255\345\277\203\347\264\242\345\274\225.md" mode change 100644 => 100755 "problems/0738.\345\215\225\350\260\203\351\200\222\345\242\236\347\232\204\346\225\260\345\255\227.md" mode change 100644 => 100755 "problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" mode change 100644 => 100755 "problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" mode change 100644 => 100755 "problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" mode change 100644 => 100755 "problems/0797.\346\211\200\346\234\211\345\217\257\350\203\275\347\232\204\350\267\257\345\276\204.md" mode change 100644 => 100755 "problems/0827.\346\234\200\345\244\247\344\272\272\345\267\245\345\262\233.md" mode change 100644 => 100755 "problems/0841.\351\222\245\345\214\231\345\222\214\346\210\277\351\227\264.md" mode change 100644 => 100755 "problems/0844.\346\257\224\350\276\203\345\220\253\351\200\200\346\240\274\347\232\204\345\255\227\347\254\246\344\270\262.md" mode change 100644 => 100755 "problems/0860.\346\237\240\346\252\254\346\260\264\346\211\276\351\233\266.md" mode change 100644 => 100755 "problems/0922.\346\214\211\345\245\207\345\201\266\346\216\222\345\272\217\346\225\260\347\273\204II.md" mode change 100644 => 100755 "problems/0925.\351\225\277\346\214\211\351\224\256\345\205\245.md" mode change 100644 => 100755 "problems/0941.\346\234\211\346\225\210\347\232\204\345\261\261\350\204\211\346\225\260\347\273\204.md" mode change 100644 => 100755 "problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" mode change 100644 => 100755 "problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" mode change 100644 => 100755 "problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md" mode change 100644 => 100755 "problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" mode change 100644 => 100755 "problems/1020.\351\243\236\345\234\260\347\232\204\346\225\260\351\207\217.md" mode change 100644 => 100755 "problems/1035.\344\270\215\347\233\270\344\272\244\347\232\204\347\272\277.md" mode change 100644 => 100755 "problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" mode change 100644 => 100755 "problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" mode change 100644 => 100755 "problems/1143.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" mode change 100644 => 100755 "problems/1207.\347\213\254\344\270\200\346\227\240\344\272\214\347\232\204\345\207\272\347\216\260\346\254\241\346\225\260.md" mode change 100644 => 100755 "problems/1221.\345\210\206\345\211\262\345\271\263\350\241\241\345\255\227\347\254\246\344\270\262.md" mode change 100644 => 100755 "problems/1254.\347\273\237\350\256\241\345\260\201\351\227\255\345\262\233\345\261\277\347\232\204\346\225\260\347\233\256.md" mode change 100644 => 100755 "problems/1356.\346\240\271\346\215\256\346\225\260\345\255\227\344\272\214\350\277\233\345\210\266\344\270\2131\347\232\204\346\225\260\347\233\256\346\216\222\345\272\217.md" mode change 100644 => 100755 "problems/1365.\346\234\211\345\244\232\345\260\221\345\260\217\344\272\216\345\275\223\345\211\215\346\225\260\345\255\227\347\232\204\346\225\260\345\255\227.md" mode change 100644 => 100755 "problems/1382.\345\260\206\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\345\217\230\345\271\263\350\241\241.md" mode change 100644 => 100755 "problems/1791.\346\211\276\345\207\272\346\230\237\345\236\213\345\233\276\347\232\204\344\270\255\345\277\203\350\212\202\347\202\271.md" mode change 100644 => 100755 "problems/1971.\345\257\273\346\211\276\345\233\276\344\270\255\346\230\257\345\220\246\345\255\230\345\234\250\350\267\257\345\276\204.md" create mode 100755 problems/qita/acm_backup.md create mode 100755 problems/qita/algo_pdf.md create mode 100755 problems/qita/ewaishuoming.md create mode 100755 problems/qita/gongkaike.md create mode 100755 problems/qita/language.md create mode 100755 problems/qita/publish.md create mode 100755 problems/qita/say_feel.md create mode 100755 problems/qita/tulunshuoming.md create mode 100755 problems/qita/update.md mode change 100644 => 100755 "problems/\344\270\272\344\272\206\347\273\235\346\235\200\347\274\226\350\276\221\350\267\235\347\246\273\357\274\214\345\215\241\345\260\224\345\201\232\344\272\206\344\270\211\346\255\245\351\223\272\345\236\253.md" mode change 100644 => 100755 "problems/\344\272\214\345\217\211\346\240\221\344\270\255\351\200\222\345\275\222\345\270\246\347\235\200\345\233\236\346\272\257.md" mode change 100644 => 100755 "problems/\344\272\214\345\217\211\346\240\221\346\200\273\347\273\223\347\257\207.md" mode change 100644 => 100755 "problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" mode change 100644 => 100755 "problems/\344\272\214\345\217\211\346\240\221\347\232\204\347\273\237\344\270\200\350\277\255\344\273\243\346\263\225.md" mode change 100644 => 100755 "problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" mode change 100644 => 100755 "problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" create mode 100755 "problems/\345\211\215\345\272\217/gitserver.md" create mode 100755 "problems/\345\211\215\345\272\217/kvstore.md" create mode 100755 "problems/\345\211\215\345\272\217/server.md" delete mode 100644 "problems/\345\211\215\345\272\217/\344\270\212\346\265\267\344\272\222\350\201\224\347\275\221\345\205\254\345\217\270\346\200\273\347\273\223.md" delete mode 100644 "problems/\345\211\215\345\272\217/\344\272\222\350\201\224\347\275\221\345\244\247\345\216\202\347\240\224\345\217\221\346\265\201\347\250\213.md" delete mode 100644 "problems/\345\211\215\345\272\217/\345\214\227\344\272\254\344\272\222\350\201\224\347\275\221\345\205\254\345\217\270\346\200\273\347\273\223.md" delete mode 100644 "problems/\345\211\215\345\272\217/\345\271\277\345\267\236\344\272\222\350\201\224\347\275\221\345\205\254\345\217\270\346\200\273\347\273\223.md" delete mode 100644 "problems/\345\211\215\345\272\217/\346\210\220\351\203\275\344\272\222\350\201\224\347\275\221\345\205\254\345\217\270\346\200\273\347\273\223.md" delete mode 100644 "problems/\345\211\215\345\272\217/\346\235\255\345\267\236\344\272\222\350\201\224\347\275\221\345\205\254\345\217\270\346\200\273\347\273\223.md" delete mode 100644 "problems/\345\211\215\345\272\217/\346\267\261\345\234\263\344\272\222\350\201\224\347\275\221\345\205\254\345\217\270\346\200\273\347\273\223.md" mode change 100644 => 100755 "problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" mode change 100644 => 100755 "problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" mode change 100644 => 100755 "problems/\345\212\250\346\200\201\350\247\204\345\210\222-\350\202\241\347\245\250\351\227\256\351\242\230\346\200\273\347\273\223\347\257\207.md" mode change 100644 => 100755 "problems/\345\212\250\346\200\201\350\247\204\345\210\222\346\200\273\347\273\223\347\257\207.md" mode change 100644 => 100755 "problems/\345\212\250\346\200\201\350\247\204\345\210\222\347\220\206\350\256\272\345\237\272\347\241\200.md" mode change 100644 => 100755 "problems/\345\217\214\346\214\207\351\222\210\346\200\273\347\273\223.md" mode change 100644 => 100755 "problems/\345\223\210\345\270\214\350\241\250\346\200\273\347\273\223.md" mode change 100644 => 100755 "problems/\345\223\210\345\270\214\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" mode change 100644 => 100755 "problems/\345\233\236\346\272\257\346\200\273\347\273\223.md" mode change 100644 => 100755 "problems/\345\233\236\346\272\257\347\256\227\346\263\225\345\216\273\351\207\215\351\227\256\351\242\230\347\232\204\345\217\246\344\270\200\347\247\215\345\206\231\346\263\225.md" mode change 100644 => 100755 "problems/\345\233\236\346\272\257\347\256\227\346\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md" mode change 100644 => 100755 "problems/\345\255\227\347\254\246\344\270\262\346\200\273\347\273\223.md" mode change 100644 => 100755 "problems/\346\225\260\347\273\204\346\200\273\347\273\223\347\257\207.md" mode change 100644 => 100755 "problems/\346\225\260\347\273\204\347\220\206\350\256\272\345\237\272\347\241\200.md" mode change 100644 => 100755 "problems/\346\240\210\344\270\216\351\230\237\345\210\227\346\200\273\347\273\223.md" mode change 100644 => 100755 "problems/\346\240\210\344\270\216\351\230\237\345\210\227\347\220\206\350\256\272\345\237\272\347\241\200.md" mode change 100644 => 100755 "problems/\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227\357\274\210vector\345\216\237\347\220\206\350\256\262\350\247\243\357\274\211.md" mode change 100644 => 100755 "problems/\347\256\227\346\263\225\346\250\241\346\235\277.md" mode change 100644 => 100755 "problems/\350\203\214\345\214\205\346\200\273\347\273\223\347\257\207.md" mode change 100644 => 100755 "problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" mode change 100644 => 100755 "problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" mode change 100644 => 100755 "problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\244\232\351\207\215\350\203\214\345\214\205.md" mode change 100644 => 100755 "problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" mode change 100644 => 100755 "problems/\350\264\252\345\277\203\347\256\227\346\263\225\346\200\273\347\273\223\347\257\207.md" mode change 100644 => 100755 "problems/\350\264\252\345\277\203\347\256\227\346\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md" create mode 100755 "problems/\351\200\222\345\275\222\347\256\227\346\263\225\347\232\204\346\227\266\351\227\264\344\270\216\347\251\272\351\227\264\345\244\215\346\235\202\345\272\246\345\210\206\346\236\220.md" mode change 100644 => 100755 "problems/\351\223\276\350\241\250\346\200\273\347\273\223\347\257\207.md" mode change 100644 => 100755 "problems/\351\223\276\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" mode change 100644 => 100755 "problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" diff --git a/README.md b/README.md index 06de2f5d0e..993d7c6df8 100644 --- a/README.md +++ b/README.md @@ -181,7 +181,7 @@ 题目分类大纲如下: -二叉树大纲 +二叉树大纲 1. [关于二叉树,你该了解这些!](./problems/二叉树理论基础.md) 2. [二叉树:二叉树的递归遍历](./problems/二叉树的递归遍历.md) @@ -222,7 +222,7 @@ 题目分类大纲如下: -回溯算法大纲 +回溯算法大纲 1. [关于回溯算法,你该了解这些!](./problems/回溯算法理论基础.md) 2. [回溯算法:77.组合](./problems/0077.组合.md) @@ -252,7 +252,7 @@ 题目分类大纲如下: -贪心算法大纲 +贪心算法大纲 1. [关于贪心算法,你该了解这些!](./problems/贪心算法理论基础.md) 2. [贪心算法:455.分发饼干](./problems/0455.分发饼干.md) @@ -283,7 +283,7 @@ 动态规划专题已经开始啦,来不及解释了,小伙伴们上车别掉队! - + 1. [关于动态规划,你该了解这些!](./problems/动态规划理论基础.md) 2. [动态规划:509.斐波那契数](./problems/0509.斐波那契数.md) 3. [动态规划:70.爬楼梯](./problems/0070.爬楼梯.md) @@ -297,7 +297,7 @@ 背包问题系列: -背包问题大纲 +背包问题大纲 11. [动态规划:01背包理论基础(二维dp数组)](./problems/背包理论基础01背包-1.md) @@ -328,7 +328,7 @@ 股票系列: -股票问题总结 +股票问题总结 32. [动态规划:121.买卖股票的最佳时机](./problems/0121.买卖股票的最佳时机.md) @@ -343,7 +343,7 @@ 子序列系列: - + 41. [动态规划:300.最长递增子序列](./problems/0300.最长上升子序列.md) @@ -503,5 +503,5 @@ 添加微信记得备注,如果是已工作,备注:姓名-城市-岗位。如果学生,备注:姓名-学校-年级。**备注没有自我介绍不通过哦** -
+
diff --git "a/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" "b/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" old mode 100644 new mode 100755 index f9bea8289e..a11527961d --- "a/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" @@ -83,10 +83,10 @@ map目的用来存放我们访问过的元素,因为遍历数组的时候, 过程如下: -![过程一](https://file.kamacoder.com/pics/20220711202638.png) +![过程一](https://file1.kamacoder.com/i/algo/20220711202638.png) -![过程二](https://file.kamacoder.com/pics/20230220223536.png) +![过程二](https://file1.kamacoder.com/i/algo/20230220223536.png) C++代码: diff --git "a/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" "b/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" old mode 100644 new mode 100755 index 1e0667e575..05dd610a72 --- "a/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" +++ "b/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" @@ -106,7 +106,7 @@ dp[i][j]可以初始化为true么? 当然不行,怎能刚开始就全都匹 dp[i + 1][j - 1] 在 dp[i][j]的左下角,如图: -![647.回文子串](https://file.kamacoder.com/pics/20210121171032473.jpg) +![647.回文子串](https://file1.kamacoder.com/i/algo/20210121171032473.jpg) 如果这矩阵是从上到下,从左到右遍历,那么会用到没有计算过的dp[i + 1][j - 1],也就是根据不确定是不是回文的区间[i+1,j-1],来判断了[i,j]是不是回文,那结果一定是不对的。 @@ -140,7 +140,7 @@ for (int i = s.size() - 1; i >= 0; i--) { // 注意遍历顺序 举例,输入:"aaa",dp[i][j]状态如下: -![647.回文子串1](https://file.kamacoder.com/pics/20210121171059951.jpg) +![647.回文子串1](https://file1.kamacoder.com/i/algo/20210121171059951.jpg) **注意因为dp[i][j]的定义,所以j一定是大于等于i的,那么在填充dp[i][j]的时候一定是只填充右上半部分**。 diff --git "a/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" "b/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" old mode 100644 new mode 100755 index 52dbdab7b5..e2cb3f4612 --- "a/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" +++ "b/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" @@ -100,7 +100,7 @@ public: 动画效果如下: -![15.三数之和](https://code-thinking.cdn.bcebos.com/gifs/15.%E4%B8%89%E6%95%B0%E4%B9%8B%E5%92%8C.gif) +![15.三数之和](https://file1.kamacoder.com/i/algo/15.%E4%B8%89%E6%95%B0%E4%B9%8B%E5%92%8C.gif) 拿这个nums数组来举例,首先将数组排序,然后有一层for循环,i从下标0的地方开始,同时定一个下标left 定义在i+1的位置上,定义下标right 在数组结尾的位置上。 diff --git "a/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" "b/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" old mode 100644 new mode 100755 index a35fd4e2bc..6dcf9ee690 --- "a/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" +++ "b/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" @@ -11,7 +11,7 @@ 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。 -![17.电话号码的字母组合](https://file.kamacoder.com/pics/2020102916424043.png) +![17.电话号码的字母组合](https://file1.kamacoder.com/i/algo/2020102916424043.png) 示例: * 输入:"23" @@ -64,7 +64,7 @@ const string letterMap[10] = { 例如:输入:"23",抽象为树形结构,如图所示: -![17. 电话号码的字母组合](https://file.kamacoder.com/pics/20201123200304469.png) +![17. 电话号码的字母组合](https://file1.kamacoder.com/i/algo/20201123200304469.png) 图中可以看出遍历的深度,就是输入"23"的长度,而叶子节点就是我们要收集的结果,输出["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"]。 diff --git "a/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" "b/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" old mode 100644 new mode 100755 diff --git "a/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" "b/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" old mode 100644 new mode 100755 index 9b2ba88ef8..08f602c1c1 --- "a/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" +++ "b/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" @@ -16,7 +16,7 @@ 示例 1: -![19.删除链表的倒数第N个节点](https://file.kamacoder.com/pics/20210510085957392.png) +![19.删除链表的倒数第N个节点](https://file1.kamacoder.com/i/algo/20210510085957392.png) 输入:head = [1,2,3,4,5], n = 2 输出:[1,2,3,5] @@ -49,16 +49,16 @@ * 定义fast指针和slow指针,初始值为虚拟头结点,如图: - + * fast首先走n + 1步 ,为什么是n+1呢,因为只有这样同时移动的时候slow才能指向删除节点的上一个节点(方便做删除操作),如图: - + * fast和slow同时移动,直到fast指向末尾,如题: - + //图片中有错别词:应该将“只到”改为“直到” * 删除slow指向的下一个节点,如图: - + 此时不难写出如下C++代码: diff --git "a/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" "b/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" old mode 100644 new mode 100755 index 7282471285..09cf997839 --- "a/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" +++ "b/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" @@ -81,13 +81,13 @@ cd a/b/c/../../ 1. 第一种情况,字符串里左方向的括号多余了 ,所以不匹配。 -![括号匹配1](https://file.kamacoder.com/pics/2020080915505387.png) +![括号匹配1](https://file1.kamacoder.com/i/algo/2020080915505387.png) 2. 第二种情况,括号没有多余,但是 括号的类型没有匹配上。 -![括号匹配2](https://file.kamacoder.com/pics/20200809155107397.png) +![括号匹配2](https://file1.kamacoder.com/i/algo/20200809155107397.png) 3. 第三种情况,字符串里右方向的括号多余了,所以不匹配。 -![括号匹配3](https://file.kamacoder.com/pics/20200809155115779.png) +![括号匹配3](https://file1.kamacoder.com/i/algo/20200809155115779.png) @@ -95,7 +95,7 @@ cd a/b/c/../../ 动画如下: -![20.有效括号](https://code-thinking.cdn.bcebos.com/gifs/20.有效括号.gif) +![20.有效括号](https://file1.kamacoder.com/i/algo/20.有效括号.gif) 第一种情况:已经遍历完了字符串,但是栈不为空,说明有相应的左括号没有右括号来匹配,所以return false diff --git "a/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" "b/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" old mode 100644 new mode 100755 index b9494297e4..14d2538f45 --- "a/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" +++ "b/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" @@ -12,7 +12,7 @@ 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。 -24.两两交换链表中的节点-题意 +24.两两交换链表中的节点-题意 ## 算法公开课 @@ -31,16 +31,16 @@ 初始时,cur指向虚拟头结点,然后进行如下三步: -![24.两两交换链表中的节点1](https://code-thinking.cdn.bcebos.com/pics/24.%E4%B8%A4%E4%B8%A4%E4%BA%A4%E6%8D%A2%E9%93%BE%E8%A1%A8%E4%B8%AD%E7%9A%84%E8%8A%82%E7%82%B91.png) +![24.两两交换链表中的节点1](https://file1.kamacoder.com/i/algo/24.%E4%B8%A4%E4%B8%A4%E4%BA%A4%E6%8D%A2%E9%93%BE%E8%A1%A8%E4%B8%AD%E7%9A%84%E8%8A%82%E7%82%B91.png) 操作之后,链表如下: -![24.两两交换链表中的节点2](https://code-thinking.cdn.bcebos.com/pics/24.%E4%B8%A4%E4%B8%A4%E4%BA%A4%E6%8D%A2%E9%93%BE%E8%A1%A8%E4%B8%AD%E7%9A%84%E8%8A%82%E7%82%B92.png) +![24.两两交换链表中的节点2](https://file1.kamacoder.com/i/algo/24.%E4%B8%A4%E4%B8%A4%E4%BA%A4%E6%8D%A2%E9%93%BE%E8%A1%A8%E4%B8%AD%E7%9A%84%E8%8A%82%E7%82%B92.png) 看这个可能就更直观一些了: -![24.两两交换链表中的节点3](https://code-thinking.cdn.bcebos.com/pics/24.%E4%B8%A4%E4%B8%A4%E4%BA%A4%E6%8D%A2%E9%93%BE%E8%A1%A8%E4%B8%AD%E7%9A%84%E8%8A%82%E7%82%B93.png) +![24.两两交换链表中的节点3](https://file1.kamacoder.com/i/algo/24.%E4%B8%A4%E4%B8%A4%E4%BA%A4%E6%8D%A2%E9%93%BE%E8%A1%A8%E4%B8%AD%E7%9A%84%E8%8A%82%E7%82%B93.png) 对应的C++代码实现如下: (注释中详细和如上图中的三步做对应) @@ -81,7 +81,7 @@ public: 心想应该没有更好的方法了吧,也就 $O(n)$ 的时间复杂度,重复提交几次,这样了: -![24.两两交换链表中的节点](https://code-thinking.cdn.bcebos.com/pics/24.%E4%B8%A4%E4%B8%A4%E4%BA%A4%E6%8D%A2%E9%93%BE%E8%A1%A8%E4%B8%AD%E7%9A%84%E8%8A%82%E7%82%B9.png) +![24.两两交换链表中的节点](https://file1.kamacoder.com/i/algo/24.%E4%B8%A4%E4%B8%A4%E4%BA%A4%E6%8D%A2%E9%93%BE%E8%A1%A8%E4%B8%AD%E7%9A%84%E8%8A%82%E7%82%B9.png) 力扣上的统计如果两份代码是 100ms 和 300ms的耗时,其实是需要注意的。 diff --git "a/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" "b/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" old mode 100644 new mode 100755 index d01765ff66..47e05eec6a --- "a/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" +++ "b/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" @@ -43,7 +43,7 @@ 删除过程如下: -![27.移除元素-暴力解法](https://code-thinking.cdn.bcebos.com/gifs/27.%E7%A7%BB%E9%99%A4%E5%85%83%E7%B4%A0-%E6%9A%B4%E5%8A%9B%E8%A7%A3%E6%B3%95.gif) +![27.移除元素-暴力解法](https://file1.kamacoder.com/i/algo/27.%E7%A7%BB%E9%99%A4%E5%85%83%E7%B4%A0-%E6%9A%B4%E5%8A%9B%E8%A7%A3%E6%B3%95.gif) 很明显暴力解法的时间复杂度是O(n^2),这道题目暴力解法在leetcode上是可以过的。 @@ -87,7 +87,7 @@ public: 删除过程如下: -![27.移除元素-双指针法](https://code-thinking.cdn.bcebos.com/gifs/27.%E7%A7%BB%E9%99%A4%E5%85%83%E7%B4%A0-%E5%8F%8C%E6%8C%87%E9%92%88%E6%B3%95.gif) +![27.移除元素-双指针法](https://file1.kamacoder.com/i/algo/27.%E7%A7%BB%E9%99%A4%E5%85%83%E7%B4%A0-%E5%8F%8C%E6%8C%87%E9%92%88%E6%B3%95.gif) 很多同学不了解 diff --git "a/problems/0028.\345\256\236\347\216\260strStr.md" "b/problems/0028.\345\256\236\347\216\260strStr.md" old mode 100644 new mode 100755 index b25cb301f9..ef8a6c58e6 --- "a/problems/0028.\345\256\236\347\216\260strStr.md" +++ "b/problems/0028.\345\256\236\347\216\260strStr.md" @@ -106,7 +106,7 @@ next数组就是一个前缀表(prefix table)。 如动画所示: -![KMP详解1](https://code-thinking.cdn.bcebos.com/gifs/KMP%E7%B2%BE%E8%AE%B21.gif) +![KMP详解1](https://file1.kamacoder.com/i/algo/KMP%E7%B2%BE%E8%AE%B21.gif) 动画里,我特意把 子串`aa` 标记上了,这是有原因的,大家先注意一下,后面还会说到。 @@ -147,11 +147,11 @@ next数组就是一个前缀表(prefix table)。 这就是前缀表,那为啥就能告诉我们 上次匹配的位置,并跳过去呢? 回顾一下,刚刚匹配的过程在下标5的地方遇到不匹配,模式串是指向f,如图: -KMP精讲1 +KMP精讲1 然后就找到了下标2,指向b,继续匹配:如图: -KMP精讲2 +KMP精讲2 以下这句话,对于理解为什么使用前缀表可以告诉我们匹配失败之后跳到哪里重新匹配 非常重要! @@ -167,15 +167,15 @@ next数组就是一个前缀表(prefix table)。 如图: -KMP精讲5 +KMP精讲5 长度为前1个字符的子串`a`,最长相同前后缀的长度为0。(注意字符串的**前缀是指不包含最后一个字符的所有以第一个字符开头的连续子串**;**后缀是指不包含第一个字符的所有以最后一个字符结尾的连续子串**。) -KMP精讲6 +KMP精讲6 长度为前2个字符的子串`aa`,最长相同前后缀的长度为1。 -KMP精讲7 +KMP精讲7 长度为前3个字符的子串`aab`,最长相同前后缀的长度为0。 @@ -185,13 +185,13 @@ next数组就是一个前缀表(prefix table)。 长度为前6个字符的子串`aabaaf`,最长相同前后缀的长度为0。 那么把求得的最长相同前后缀的长度就是对应前缀表的元素,如图: -KMP精讲8 +KMP精讲8 可以看出模式串与前缀表对应位置的数字表示的就是:**下标i之前(包括i)的字符串中,有多大长度的相同前缀后缀。** 再来看一下如何利用 前缀表找到 当字符不匹配的时候应该指针应该移动的位置。如动画所示: -![KMP精讲2](https://code-thinking.cdn.bcebos.com/gifs/KMP%E7%B2%BE%E8%AE%B22.gif) +![KMP精讲2](https://file1.kamacoder.com/i/algo/KMP%E7%B2%BE%E8%AE%B22.gif) 找到的不匹配的位置, 那么此时我们要看它的前一个字符的前缀表的数值是多少。 @@ -225,7 +225,7 @@ next数组就可以是前缀表,但是很多实现都是把前缀表统一减 匹配过程动画如下: -![KMP精讲4](https://code-thinking.cdn.bcebos.com/gifs/KMP%E7%B2%BE%E8%AE%B24.gif) +![KMP精讲4](https://file1.kamacoder.com/i/algo/KMP%E7%B2%BE%E8%AE%B24.gif) ### 时间复杂度分析 @@ -332,7 +332,7 @@ void getNext(int* next, const string& s){ 代码构造next数组的逻辑流程动画如下: -![KMP精讲3](https://code-thinking.cdn.bcebos.com/gifs/KMP%E7%B2%BE%E8%AE%B23.gif) +![KMP精讲3](https://file1.kamacoder.com/i/algo/KMP%E7%B2%BE%E8%AE%B23.gif) 得到了next数组之后,就要用这个来做匹配了。 diff --git "a/problems/0031.\344\270\213\344\270\200\344\270\252\346\216\222\345\210\227.md" "b/problems/0031.\344\270\213\344\270\200\344\270\252\346\216\222\345\210\227.md" old mode 100644 new mode 100755 index 95bb1d899e..4bbf20fbb8 --- "a/problems/0031.\344\270\213\344\270\200\344\270\252\346\216\222\345\210\227.md" +++ "b/problems/0031.\344\270\213\344\270\200\344\270\252\346\216\222\345\210\227.md" @@ -67,7 +67,7 @@ 以求1243为例,流程如图: - + 对应的C++代码如下: diff --git "a/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" "b/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" old mode 100644 new mode 100755 diff --git "a/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" "b/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" old mode 100644 new mode 100755 index c9826fa205..b48910eef7 --- "a/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" +++ "b/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" @@ -41,7 +41,7 @@ 这道题目,要在数组中插入目标值,无非是这四种情况。 -![35_搜索插入位置3](https://file.kamacoder.com/pics/20201216232148471.png) +![35_搜索插入位置3](https://file1.kamacoder.com/i/algo/20201216232148471.png) * 目标值在数组所有元素之前 * 目标值等于数组中某一个元素 @@ -82,14 +82,14 @@ public: 效率如下: -![35_搜索插入位置](https://file.kamacoder.com/pics/20201216232127268.png) +![35_搜索插入位置](https://file1.kamacoder.com/i/algo/20201216232127268.png) ### 二分法 既然暴力解法的时间复杂度是O(n),就要尝试一下使用二分查找法。 -![35_搜索插入位置4](https://file.kamacoder.com/pics/202012162326354.png) +![35_搜索插入位置4](https://file1.kamacoder.com/i/algo/202012162326354.png) 大家注意这道题目的前提是数组是有序数组,这也是使用二分查找的基础条件。 @@ -99,7 +99,7 @@ public: 大体讲解一下二分法的思路,这里来举一个例子,例如在这个数组中,使用二分法寻找元素为5的位置,并返回其下标。 -![35_搜索插入位置5](https://file.kamacoder.com/pics/20201216232659199.png) +![35_搜索插入位置5](https://file1.kamacoder.com/i/algo/20201216232659199.png) 二分查找涉及的很多的边界条件,逻辑比较简单,就是写不好。 @@ -150,7 +150,7 @@ public: * 空间复杂度:O(1) 效率如下: -![35_搜索插入位置2](https://file.kamacoder.com/pics/2020121623272877.png) +![35_搜索插入位置2](https://file1.kamacoder.com/i/algo/2020121623272877.png) ### 二分法第二种写法 diff --git "a/problems/0037.\350\247\243\346\225\260\347\213\254.md" "b/problems/0037.\350\247\243\346\225\260\347\213\254.md" old mode 100644 new mode 100755 index 5d2adb4d9d..204f0cc092 --- "a/problems/0037.\350\247\243\346\225\260\347\213\254.md" +++ "b/problems/0037.\350\247\243\346\225\260\347\213\254.md" @@ -18,11 +18,11 @@ 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。 空白格用 '.' 表示。 -![解数独](https://file.kamacoder.com/pics/202011171912586.png) +![解数独](https://file1.kamacoder.com/i/algo/202011171912586.png) 一个数独。 -![解数独](https://file.kamacoder.com/pics/20201117191340669.png) +![解数独](https://file1.kamacoder.com/i/algo/20201117191340669.png) 答案被标成红色。 @@ -52,7 +52,7 @@ 因为这个树形结构太大了,我抽取一部分,如图所示: -![37.解数独](https://file.kamacoder.com/pics/2020111720451790-20230310131816104.png) +![37.解数独](https://file1.kamacoder.com/i/algo/2020111720451790-20230310131816104.png) ### 回溯三部曲 @@ -83,7 +83,7 @@ bool backtracking(vector>& board) * 递归单层搜索逻辑 -![37.解数独](https://file.kamacoder.com/pics/2020111720451790-20230310131822254.png) +![37.解数独](https://file1.kamacoder.com/i/algo/2020111720451790-20230310131822254.png) 在树形图中可以看出我们需要的是一个二维的递归 (一行一列) diff --git "a/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" "b/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" old mode 100644 new mode 100755 index 8467277115..d8dac0b45b --- "a/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" +++ "b/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" @@ -50,7 +50,7 @@ candidates 中的数字可以无限制重复被选取。 本题搜索的过程抽象成树形结构如下: -![39.组合总和](https://file.kamacoder.com/pics/20201223170730367.png) +![39.组合总和](https://file1.kamacoder.com/i/algo/20201223170730367.png) 注意图中叶子节点的返回条件,因为本题没有组合数量要求,仅仅是总和的限制,所以递归没有层数的限制,只要选取的元素总和超过target,就返回! 而在[77.组合](https://programmercarl.com/0077.组合.html)和[216.组合总和III](https://programmercarl.com/0216.组合总和III.html) 中都可以知道要递归K层,因为要取k个元素的组合。 @@ -85,7 +85,7 @@ void backtracking(vector& candidates, int target, int sum, int startIndex) 在如下树形结构中: -![39.组合总和](https://file.kamacoder.com/pics/20201223170730367-20230310135337214.png) +![39.组合总和](https://file1.kamacoder.com/i/algo/20201223170730367-20230310135337214.png) 从叶子节点可以清晰看到,终止只有两种情况,sum大于target和sum等于target。 @@ -158,7 +158,7 @@ public: 在这个树形结构中: -![39.组合总和](https://file.kamacoder.com/pics/20201223170730367-20230310135342472.png) +![39.组合总和](https://file1.kamacoder.com/i/algo/20201223170730367-20230310135342472.png) 以及上面的版本一的代码大家可以看到,对于sum已经大于target的情况,其实是依然进入了下一层递归,只是下一层递归结束判断的时候,会判断sum > target的话就返回。 @@ -171,7 +171,7 @@ public: 如图: -![39.组合总和1](https://file.kamacoder.com/pics/20201223170809182.png) +![39.组合总和1](https://file1.kamacoder.com/i/algo/20201223170809182.png) for循环剪枝代码如下: diff --git "a/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" "b/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" old mode 100644 new mode 100755 index f0cbc2200f..0d3972662f --- "a/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" +++ "b/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" @@ -76,7 +76,7 @@ candidates 中的每个数字在每个组合中只能使用一次。 选择过程树形结构如图所示: -![40.组合总和II](https://file.kamacoder.com/pics/20230310000918.png) +![40.组合总和II](https://file1.kamacoder.com/i/algo/20230310000918.png) 可以看到图中,每个节点相对于 [39.组合总和](https://mp.weixin.qq.com/s/FLg8G6EjVcxBjwCbzpACPw)我多加了used数组,这个used数组下面会重点介绍。 @@ -126,7 +126,7 @@ if (sum == target) { 这块比较抽象,如图: -![40.组合总和II1](https://file.kamacoder.com/pics/20230310000954.png) +![40.组合总和II1](https://file1.kamacoder.com/i/algo/20230310000954.png) 我在图中将used的变化用橘黄色标注上,可以看出在candidates[i] == candidates[i - 1]相同的情况下: @@ -137,7 +137,7 @@ if (sum == target) { 而 used[i - 1] == true,说明是进入下一层递归,去下一个数,所以是树枝上,如图所示: -![](https://file.kamacoder.com/pics/20221021163812.png) +![](https://file1.kamacoder.com/i/algo/20221021163812.png) **这块去重的逻辑很抽象,网上搜的题解基本没有能讲清楚的,如果大家之前思考过这个问题或者刷过这道题目,看到这里一定会感觉通透了很多!** diff --git "a/problems/0042.\346\216\245\351\233\250\346\260\264.md" "b/problems/0042.\346\216\245\351\233\250\346\260\264.md" old mode 100644 new mode 100755 index 1e6ec11bc5..c208637b2f --- "a/problems/0042.\346\216\245\351\233\250\346\260\264.md" +++ "b/problems/0042.\346\216\245\351\233\250\346\260\264.md" @@ -47,10 +47,10 @@ 首先要明确,要按照行来计算,还是按照列来计算。 按照行来计算如图: -![42.接雨水2](https://file.kamacoder.com/pics/20210402091118927.png) +![42.接雨水2](https://file1.kamacoder.com/i/algo/20210402091118927.png) 按照列来计算如图: -![42.接雨水1](https://file.kamacoder.com/pics/20210402091208445.png) +![42.接雨水1](https://file1.kamacoder.com/i/algo/20210402091208445.png) 一些同学在实现的时候,很容易一会按照行来计算一会按照列来计算,这样就会越写越乱。 @@ -62,7 +62,7 @@ 这句话可以有点绕,来举一个理解,例如求列4的雨水高度,如图: -![42.接雨水3](https://file.kamacoder.com/pics/20210223092732301.png) +![42.接雨水3](https://file1.kamacoder.com/i/algo/20210223092732301.png) 列4 左侧最高的柱子是列3,高度为2(以下用lHeight表示)。 @@ -201,7 +201,7 @@ public: 1. 首先单调栈是按照行方向来计算雨水,如图: -![42.接雨水2](https://file.kamacoder.com/pics/20210223092629946.png) +![42.接雨水2](https://file1.kamacoder.com/i/algo/20210223092629946.png) 知道这一点,后面的就可以理解了。 @@ -215,7 +215,7 @@ public: 如图: -![42.接雨水4](https://file.kamacoder.com/pics/2021022309321229.png) +![42.接雨水4](https://file1.kamacoder.com/i/algo/2021022309321229.png) 关于单调栈的顺序给大家一个总结: [739. 每日温度](https://programmercarl.com/0739.每日温度.html) 中求一个元素右边第一个更大元素,单调栈就是递增的,[84.柱状图中最大的矩形](https://programmercarl.com/0084.柱状图中最大的矩形.html)求一个元素右边第一个更小元素,单调栈就是递减的。 @@ -229,7 +229,7 @@ public: 如图所示: -![42.接雨水5](https://file.kamacoder.com/pics/20210223094619398.png) +![42.接雨水5](https://file1.kamacoder.com/i/algo/20210223094619398.png) 4. 栈里要保存什么数值 @@ -284,7 +284,7 @@ if (height[i] == height[st.top()]) { // 例如 5 5 1 7 这种情况 如果当前遍历的元素(柱子)高度大于栈顶元素的高度,此时就出现凹槽了,如图所示: -![42.接雨水4](https://file.kamacoder.com/pics/2021022309321229-20230310123027977.png) +![42.接雨水4](https://file1.kamacoder.com/i/algo/2021022309321229-20230310123027977.png) 取栈顶元素,将栈顶元素弹出,这个就是凹槽的底部,也就是中间位置,下标记为mid,对应的高度为height[mid](就是图中的高度1)。 diff --git "a/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" "b/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" old mode 100644 new mode 100755 index dd51384d77..c20cdc65e6 --- "a/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" +++ "b/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" @@ -47,7 +47,7 @@ 如图: -![45.跳跃游戏II](https://file.kamacoder.com/pics/20201201232309103.png) +![45.跳跃游戏II](https://file1.kamacoder.com/i/algo/20201201232309103.png) **图中覆盖范围的意义在于,只要红色的区域,最多两步一定可以到!(不用管具体怎么跳,反正一定可以跳到)** @@ -99,11 +99,11 @@ public: 因为当移动下标指向 nums.size - 2 时: - 如果移动下标等于当前覆盖最大距离下标, 需要再走一步(即 ans++),因为最后一步一定是可以到的终点。(题目假设总是可以到达数组的最后一个位置),如图: - ![45.跳跃游戏II2](https://file.kamacoder.com/pics/20201201232445286.png) + ![45.跳跃游戏II2](https://file1.kamacoder.com/i/algo/20201201232445286.png) - 如果移动下标不等于当前覆盖最大距离下标,说明当前覆盖最远距离就可以直接达到终点了,不需要再走一步。如图: -![45.跳跃游戏II1](https://file.kamacoder.com/pics/20201201232338693.png) +![45.跳跃游戏II1](https://file1.kamacoder.com/i/algo/20201201232338693.png) 代码如下: diff --git "a/problems/0046.\345\205\250\346\216\222\345\210\227.md" "b/problems/0046.\345\205\250\346\216\222\345\210\227.md" old mode 100644 new mode 100755 index 5a190242e3..356f51b5a8 --- "a/problems/0046.\345\205\250\346\216\222\345\210\227.md" +++ "b/problems/0046.\345\205\250\346\216\222\345\210\227.md" @@ -41,7 +41,7 @@ 我以[1,2,3]为例,抽象成树形结构如下: -![全排列](https://file.kamacoder.com/pics/20240803180318.png) +![全排列](https://file1.kamacoder.com/i/algo/20240803180318.png) ### 回溯三部曲 @@ -53,7 +53,7 @@ 但排列问题需要一个used数组,标记已经选择的元素,如图橘黄色部分所示: -![全排列](https://file.kamacoder.com/pics/20240803180318.png) +![全排列](https://file1.kamacoder.com/i/algo/20240803180318.png) 代码如下: @@ -65,7 +65,7 @@ void backtracking (vector& nums, vector& used) * 递归终止条件 -![全排列](https://file.kamacoder.com/pics/20240803180318.png) +![全排列](https://file1.kamacoder.com/i/algo/20240803180318.png) 可以看出叶子节点,就是收割结果的地方。 diff --git "a/problems/0047.\345\205\250\346\216\222\345\210\227II.md" "b/problems/0047.\345\205\250\346\216\222\345\210\227II.md" old mode 100644 new mode 100755 index 6ed794aaaf..5330997a66 --- "a/problems/0047.\345\205\250\346\216\222\345\210\227II.md" +++ "b/problems/0047.\345\205\250\346\216\222\345\210\227II.md" @@ -48,7 +48,7 @@ 我以示例中的 [1,1,2]为例 (为了方便举例,已经排序)抽象为一棵树,去重过程如图: -![47.全排列II1](https://file.kamacoder.com/pics/20201124201331223.png) +![47.全排列II1](https://file1.kamacoder.com/i/algo/20201124201331223.png) 图中我们对同一树层,前一位(也就是nums[i-1])如果使用过,那么就进行去重。 @@ -130,11 +130,11 @@ if (i > 0 && nums[i] == nums[i - 1] && used[i - 1] == true) { 树层上去重(used[i - 1] == false),的树形结构如下: -![47.全排列II2](https://file.kamacoder.com/pics/20201124201406192.png) +![47.全排列II2](https://file1.kamacoder.com/i/algo/20201124201406192.png) 树枝上去重(used[i - 1] == true)的树型结构如下: -![47.全排列II3](https://file.kamacoder.com/pics/20201124201431571.png) +![47.全排列II3](https://file1.kamacoder.com/i/algo/20201124201431571.png) 大家应该很清晰的看到,树层上对前一位去重非常彻底,效率很高,树枝上对前一位去重虽然最后可以得到答案,但是做了很多无用搜索。 diff --git "a/problems/0051.N\347\232\207\345\220\216.md" "b/problems/0051.N\347\232\207\345\220\216.md" old mode 100644 new mode 100755 index 2a90a023e6..d06d7798e8 --- "a/problems/0051.N\347\232\207\345\220\216.md" +++ "b/problems/0051.N\347\232\207\345\220\216.md" @@ -15,7 +15,7 @@ n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上, 示例 1: -![](https://file.kamacoder.com/pics/20211020232201.png) +![](https://file1.kamacoder.com/i/algo/20211020232201.png) * 输入:n = 4 * 输出:[[".Q..","...Q","Q...","..Q."],["..Q.","Q...","...Q",".Q.."]] @@ -45,7 +45,7 @@ n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上, 下面我用一个 3 * 3 的棋盘,将搜索过程抽象为一棵树,如图: -![51.N皇后](https://file.kamacoder.com/pics/20210130182532303.jpg) +![51.N皇后](https://file1.kamacoder.com/i/algo/20210130182532303.jpg) 从图中,可以看出,二维矩阵中矩阵的高就是这棵树的高度,矩阵的宽就是树形结构中每一个节点的宽度。 @@ -85,7 +85,7 @@ void backtracking(int n, int row, vector& chessboard) { * 递归终止条件 在如下树形结构中: -![51.N皇后](https://file.kamacoder.com/pics/20210130182532303-20230310122134167.jpg) +![51.N皇后](https://file1.kamacoder.com/i/algo/20210130182532303-20230310122134167.jpg) 可以看出,当递归到棋盘最底层(也就是叶子节点)的时候,就可以收集结果并返回了。 diff --git "a/problems/0052.N\347\232\207\345\220\216II.md" "b/problems/0052.N\347\232\207\345\220\216II.md" old mode 100644 new mode 100755 index 489ab1f756..6c6650ad00 --- "a/problems/0052.N\347\232\207\345\220\216II.md" +++ "b/problems/0052.N\347\232\207\345\220\216II.md" @@ -13,7 +13,7 @@ n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并 上图为 8 皇后问题的一种解法。 -![51n皇后](https://file.kamacoder.com/pics/20200821152118456.png) +![51n皇后](https://file1.kamacoder.com/i/algo/20200821152118456.png) 给定一个整数 n,返回 n 皇后不同的解决方案的数量。 diff --git "a/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" "b/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" old mode 100644 new mode 100755 index 6f8c2a6e7e..84bb5f6663 --- "a/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" +++ "b/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" @@ -76,7 +76,7 @@ if (count > result) result = count; 如动画所示: -![53.最大子序和](https://code-thinking.cdn.bcebos.com/gifs/53.%E6%9C%80%E5%A4%A7%E5%AD%90%E5%BA%8F%E5%92%8C.gif) +![53.最大子序和](https://file1.kamacoder.com/i/algo/53.%E6%9C%80%E5%A4%A7%E5%AD%90%E5%BA%8F%E5%92%8C.gif) 红色的起始位置就是贪心每次取 count 为正数的时候,开始一个区间的统计。 diff --git "a/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" "b/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" old mode 100644 new mode 100755 index 174f55e848..ba44a36104 --- "a/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" +++ "b/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" @@ -54,7 +54,7 @@ dp[0]应该是多少呢? 5. 举例推导dp数组 以示例一为例,输入:nums = [-2,1,-3,4,-1,2,1,-5,4],对应的dp状态如下: -![53.最大子序和(动态规划)](https://file.kamacoder.com/pics/20210303104129101.png) +![53.最大子序和(动态规划)](https://file1.kamacoder.com/i/algo/20210303104129101.png) **注意最后的结果可不是dp[nums.size() - 1]!** ,而是dp[6]。 diff --git "a/problems/0054.\350\236\272\346\227\213\347\237\251\351\230\265.md" "b/problems/0054.\350\236\272\346\227\213\347\237\251\351\230\265.md" old mode 100644 new mode 100755 index a852b6740d..8b700c1fe8 --- "a/problems/0054.\350\236\272\346\227\213\347\237\251\351\230\265.md" +++ "b/problems/0054.\350\236\272\346\227\213\347\237\251\351\230\265.md" @@ -36,7 +36,7 @@ 由外向内一圈一圈这么画下去,如下所示: -![](https://file.kamacoder.com/pics/20220922102236.png) +![](https://file1.kamacoder.com/i/algo/20220922102236.png) 这里每一种颜色,代表一条边,我们遍历的长度,可以看出每一个拐角处的处理规则,拐角处让给新的一条边来继续画。 diff --git "a/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" "b/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" old mode 100644 new mode 100755 index 0ebbcb595c..513fc2e340 --- "a/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" +++ "b/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" @@ -48,7 +48,7 @@ 如图: -![](https://file.kamacoder.com/pics/20230203105634.png) +![](https://file1.kamacoder.com/i/algo/20230203105634.png) i 每次移动只能在 cover 的范围内移动,每移动一个元素,cover 得到该元素数值(新的覆盖范围)的补充,让 i 继续移动下去。 diff --git "a/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" "b/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" old mode 100644 new mode 100755 index cb06fcab3d..24a97f6c5a --- "a/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" +++ "b/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" @@ -38,7 +38,7 @@ 这么说有点抽象,看图:(**注意图中区间都是按照左边界排序之后了**) -![56.合并区间](https://file.kamacoder.com/pics/20201223200632791.png) +![56.合并区间](https://file1.kamacoder.com/i/algo/20201223200632791.png) 知道如何判断重复之后,剩下的就是合并了,如何去模拟合并区间呢? diff --git "a/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" "b/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" old mode 100644 new mode 100755 index d7aea257a5..927df1c6c1 --- "a/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" +++ "b/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" @@ -54,7 +54,7 @@ 那么我按照左闭右开的原则,来画一圈,大家看一下: -![](https://file.kamacoder.com/pics/20220922102236.png) +![](https://file1.kamacoder.com/i/algo/20220922102236.png) 这里每一种颜色,代表一条边,我们遍历的长度,可以看出每一个拐角处的处理规则,拐角处让给新的一条边来继续画。 diff --git "a/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" "b/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" old mode 100644 new mode 100755 index 20bd56ba9f..ac60767dce --- "a/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" +++ "b/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" @@ -16,7 +16,7 @@ 示例 1: -![](https://file.kamacoder.com/pics/20210110174033215.png) +![](https://file1.kamacoder.com/i/algo/20210110174033215.png) * 输入:m = 3, n = 7 * 输出:28 @@ -62,7 +62,7 @@ 如图举例: -![62.不同路径](https://file.kamacoder.com/pics/20201209113602700.png) +![62.不同路径](https://file1.kamacoder.com/i/algo/20201209113602700.png) 此时问题就可以转化为求二叉树叶子节点的个数,代码如下: @@ -131,7 +131,7 @@ for (int j = 0; j < n; j++) dp[0][j] = 1; 如图所示: -![62.不同路径1](https://file.kamacoder.com/pics/20201209113631392.png) +![62.不同路径1](https://file1.kamacoder.com/i/algo/20201209113631392.png) 以上动规五部曲分析完毕,C++代码如下: @@ -180,7 +180,7 @@ public: 在这个图中,可以看出一共m,n的话,无论怎么走,走到终点都需要 m + n - 2 步。 -![62.不同路径](https://file.kamacoder.com/pics/20201209113602700-20230310120944078.png) +![62.不同路径](https://file1.kamacoder.com/i/algo/20201209113602700-20230310120944078.png) 在这m + n - 2 步中,一定有 m - 1 步是要向下走的,不用管什么时候向下走。 @@ -190,7 +190,7 @@ public: 那么答案,如图所示: -![62.不同路径2](https://file.kamacoder.com/pics/20201209113725324.png) +![62.不同路径2](https://file1.kamacoder.com/i/algo/20201209113725324.png) **求组合的时候,要防止两个int相乘溢出!** 所以不能把算式的分子都算出来,分母都算出来再做除法。 diff --git "a/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" "b/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" old mode 100644 new mode 100755 index d39036ba3a..f39afe8455 --- "a/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" +++ "b/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" @@ -14,13 +14,13 @@ 现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径? -![](https://file.kamacoder.com/pics/20210111204901338.png) +![](https://file1.kamacoder.com/i/algo/20210111204901338.png) 网格中的障碍物和空位置分别用 1 和 0 来表示。 示例 1: -![](https://file.kamacoder.com/pics/20210111204939971.png) +![](https://file1.kamacoder.com/i/algo/20210111204939971.png) * 输入:obstacleGrid = [[0,0,0],[0,1,0],[0,0,0]] * 输出:2 @@ -32,7 +32,7 @@ 示例 2: -![](https://file.kamacoder.com/pics/20210111205857918.png) +![](https://file1.kamacoder.com/i/algo/20210111205857918.png) * 输入:obstacleGrid = [[0,1],[0,0]] * 输出:1 @@ -93,7 +93,7 @@ for (int j = 0; j < n; j++) dp[0][j] = 1; 如图: -![63.不同路径II](https://file.kamacoder.com/pics/20210104114513928.png) +![63.不同路径II](https://file1.kamacoder.com/i/algo/20210104114513928.png) 下标(0, j)的初始化情况同理。 @@ -127,11 +127,11 @@ for (int i = 1; i < m; i++) { 拿示例1来举例如题: -![63.不同路径II1](https://file.kamacoder.com/pics/20210104114548983.png) +![63.不同路径II1](https://file1.kamacoder.com/i/algo/20210104114548983.png) 对应的dp table 如图: -![63.不同路径II2](https://file.kamacoder.com/pics/20210104114610256.png) +![63.不同路径II2](https://file1.kamacoder.com/i/algo/20210104114610256.png) 如果这个图看不懂,建议再理解一下递归公式,然后照着文章中说的遍历顺序,自己推导一下! diff --git "a/problems/0070.\347\210\254\346\245\274\346\242\257.md" "b/problems/0070.\347\210\254\346\245\274\346\242\257.md" old mode 100644 new mode 100755 index 17bf3ee760..316fbd4f39 --- "a/problems/0070.\347\210\254\346\245\274\346\242\257.md" +++ "b/problems/0070.\347\210\254\346\245\274\346\242\257.md" @@ -101,7 +101,7 @@ dp[i]: 爬到第i层楼梯,有dp[i]种方法 举例当n为5的时候,dp table(dp数组)应该是这样的 -![70.爬楼梯](https://file.kamacoder.com/pics/20210105202546299.png) +![70.爬楼梯](https://file1.kamacoder.com/i/algo/20210105202546299.png) 如果代码出问题了,就把dp table 打印出来,看看究竟是不是和自己推导的一样。 diff --git "a/problems/0070.\347\210\254\346\245\274\346\242\257\345\256\214\345\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md" "b/problems/0070.\347\210\254\346\245\274\346\242\257\345\256\214\345\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md" old mode 100644 new mode 100755 diff --git "a/problems/0072.\347\274\226\350\276\221\350\267\235\347\246\273.md" "b/problems/0072.\347\274\226\350\276\221\350\267\235\347\246\273.md" old mode 100644 new mode 100755 index 192ea47002..c4bcbb4338 --- "a/problems/0072.\347\274\226\350\276\221\350\267\235\347\246\273.md" +++ "b/problems/0072.\347\274\226\350\276\221\350\267\235\347\246\273.md" @@ -170,7 +170,7 @@ for (int j = 0; j <= word2.size(); j++) dp[0][j] = j; 可以看出dp[i][j]是依赖左方,上方和左上方元素的,如图: -![72.编辑距离](https://file.kamacoder.com/pics/20210114162113131.jpg) +![72.编辑距离](https://file1.kamacoder.com/i/algo/20210114162113131.jpg) 所以在dp矩阵中一定是从左到右从上到下去遍历。 @@ -194,7 +194,7 @@ for (int i = 1; i <= word1.size(); i++) { 以示例1为例,输入:`word1 = "horse", word2 = "ros"`为例,dp矩阵状态图如下: -![72.编辑距离1](https://file.kamacoder.com/pics/20210114162132300.jpg) +![72.编辑距离1](https://file1.kamacoder.com/i/algo/20210114162132300.jpg) 以上动规五部分析完毕,C++代码如下: diff --git "a/problems/0077.\347\273\204\345\220\210.md" "b/problems/0077.\347\273\204\345\220\210.md" old mode 100644 new mode 100755 index c523c01c17..4c9e97fd47 --- "a/problems/0077.\347\273\204\345\220\210.md" +++ "b/problems/0077.\347\273\204\345\220\210.md" @@ -82,7 +82,7 @@ for (int i = 1; i <= n; i++) { 那么我把组合问题抽象为如下树形结构: -![77.组合](https://file.kamacoder.com/pics/20201123195223940.png) +![77.组合](https://file1.kamacoder.com/i/algo/20201123195223940.png) 可以看出这棵树,一开始集合是 1,2,3,4, 从左向右取数,取过的数,不再重复取。 @@ -126,7 +126,7 @@ vector path; // 用来存放符合条件结果 从下图中红线部分可以看出,在集合[1,2,3,4]取1之后,下一层递归,就要在[2,3,4]中取数了,那么下一层递归如何知道从[2,3,4]中取数呢,靠的就是startIndex。 -![77.组合2](https://file.kamacoder.com/pics/20201123195328976.png) +![77.组合2](https://file1.kamacoder.com/i/algo/20201123195328976.png) 所以需要startIndex来记录下一层递归,搜索的起始位置。 @@ -146,7 +146,7 @@ path这个数组的大小如果达到k,说明我们找到了一个子集大小 如图红色部分: -![77.组合3](https://file.kamacoder.com/pics/20201123195407907.png) +![77.组合3](https://file1.kamacoder.com/i/algo/20201123195407907.png) 此时用result二维数组,把path保存起来,并终止本层递归。 @@ -163,7 +163,7 @@ if (path.size() == k) { 回溯法的搜索过程就是一个树型结构的遍历过程,在如下图中,可以看出for循环用来横向遍历,递归的过程是纵向遍历。 -![77.组合1](https://file.kamacoder.com/pics/20201123195242899.png) +![77.组合1](https://file1.kamacoder.com/i/algo/20201123195242899.png) 如此我们才遍历完图中的这棵树。 @@ -267,7 +267,7 @@ for (int i = startIndex; i <= n; i++) { 这么说有点抽象,如图所示: -![77.组合4](https://file.kamacoder.com/pics/20210130194335207-20230310134409532.png) +![77.组合4](https://file1.kamacoder.com/i/algo/20210130194335207-20230310134409532.png) 图中每一个节点(图中为矩形),就代表本层的一个for循环,那么每一层的for循环从第二个数开始遍历的话,都没有意义,都是无效遍历。 diff --git "a/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" "b/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" old mode 100644 new mode 100755 index c5e26e7706..8ddc4058cc --- "a/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" +++ "b/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" @@ -67,7 +67,7 @@ for (int i = startIndex; i <= n; i++) { 这么说有点抽象,如图所示: -![77.组合4](https://file.kamacoder.com/pics/20210130194335207.png) +![77.组合4](https://file1.kamacoder.com/i/algo/20210130194335207.png) 图中每一个节点(图中为矩形),就代表本层的一个for循环,那么每一层的for循环从第二个数开始遍历的话,都没有意义,都是无效遍历。 diff --git "a/problems/0078.\345\255\220\351\233\206.md" "b/problems/0078.\345\255\220\351\233\206.md" old mode 100644 new mode 100755 index 73eb385bc1..844b8dc2ca --- "a/problems/0078.\345\255\220\351\233\206.md" +++ "b/problems/0078.\345\255\220\351\233\206.md" @@ -46,7 +46,7 @@ 以示例中nums = [1,2,3]为例把求子集抽象为树型结构,如下: -![78.子集](https://code-thinking.cdn.bcebos.com/pics/78.%E5%AD%90%E9%9B%86.png) +![78.子集](https://file1.kamacoder.com/i/algo/78.%E5%AD%90%E9%9B%86.png) 从图中红线部分,可以看出**遍历这个树的时候,把所有节点都记录下来,就是要求的子集集合**。 @@ -70,7 +70,7 @@ void backtracking(vector& nums, int startIndex) { 从图中可以看出: -![78.子集](https://code-thinking.cdn.bcebos.com/pics/78.%E5%AD%90%E9%9B%86.png) +![78.子集](https://file1.kamacoder.com/i/algo/78.%E5%AD%90%E9%9B%86.png) 剩余集合为空的时候,就是叶子节点。 diff --git "a/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" "b/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" old mode 100644 new mode 100755 index e1a6671e73..99fb1678e6 --- "a/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" +++ "b/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" @@ -11,9 +11,9 @@ 求在该柱状图中,能够勾勒出来的矩形的最大面积。 -![](https://file.kamacoder.com/pics/20210803220437.png) +![](https://file1.kamacoder.com/i/algo/20210803220437.png) -![](https://file.kamacoder.com/pics/20210803220506.png) +![](https://file1.kamacoder.com/i/algo/20210803220506.png) * 1 <= heights.length <=10^5 * 0 <= heights[i] <= 10^4 @@ -114,7 +114,7 @@ public: 我来举一个例子,如图: -![](https://file.kamacoder.com/pics/20230221165730.png) +![](https://file1.kamacoder.com/i/algo/20230221165730.png) 只有栈里从大到小的顺序,才能保证栈顶元素找到左右两边第一个小于栈顶元素的柱子。 @@ -179,7 +179,7 @@ public: 如果数组本身就是升序的,例如[2,4,6,8],那么入栈之后 都是单调递减,一直都没有走 情况三 计算结果的哪一步,所以最后输出的就是0了。 如图: -![](https://file.kamacoder.com/pics/20230221163936.png) +![](https://file1.kamacoder.com/i/algo/20230221163936.png) 那么结尾加一个0,就会让栈里的所有元素,走到情况三的逻辑。 @@ -194,7 +194,7 @@ public: 之后又将6 加入栈(此时8已经弹出了),然后 就是 4 与 栈口元素 6 进行比较,周而复始,那么计算的最后结果result就是0。 如图所示: -![](https://file.kamacoder.com/pics/20230221164533.png) +![](https://file1.kamacoder.com/i/algo/20230221164533.png) 所以我们需要在 height数组前后各加一个元素0。 diff --git "a/problems/0090.\345\255\220\351\233\206II.md" "b/problems/0090.\345\255\220\351\233\206II.md" old mode 100644 new mode 100755 index 2f26e6068f..2e8945c90f --- "a/problems/0090.\345\255\220\351\233\206II.md" +++ "b/problems/0090.\345\255\220\351\233\206II.md" @@ -39,7 +39,7 @@ 用示例中的[1, 2, 2] 来举例,如图所示: (**注意去重需要先对集合排序**) -![90.子集II](https://file.kamacoder.com/pics/20201124195411977.png) +![90.子集II](https://file1.kamacoder.com/i/algo/20201124195411977.png) 从图中可以看出,同一树层上重复取2 就要过滤掉,同一树枝上就可以重复取2,因为同一树枝上元素的集合才是唯一子集! diff --git "a/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" "b/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" old mode 100644 new mode 100755 index 5ef2162898..6fa732d0c1 --- "a/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" +++ "b/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" @@ -54,7 +54,7 @@ 切割问题可以抽象为树型结构,如图: -![93.复原IP地址](https://file.kamacoder.com/pics/20201123203735933.png) +![93.复原IP地址](https://file1.kamacoder.com/i/algo/20201123203735933.png) ### 回溯三部曲 @@ -106,7 +106,7 @@ if (pointNum == 3) { // 逗点数量为3时,分隔结束 如果不合法就结束本层循环,如图中剪掉的分支: -![93.复原IP地址](https://file.kamacoder.com/pics/20201123203735933-20230310132314109.png) +![93.复原IP地址](https://file1.kamacoder.com/i/algo/20201123203735933-20230310132314109.png) 然后就是递归和回溯的过程: diff --git "a/problems/0096.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0096.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" old mode 100644 new mode 100755 index ca99a46695..e5bc2b6b65 --- "a/problems/0096.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" +++ "b/problems/0096.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" @@ -12,7 +12,7 @@ 示例: -![](https://file.kamacoder.com/pics/20210113161941835.png) +![](https://file1.kamacoder.com/i/algo/20210113161941835.png) ## 算法公开课 @@ -27,11 +27,11 @@ 了解了二叉搜索树之后,我们应该先举几个例子,画画图,看看有没有什么规律,如图: -![96.不同的二叉搜索树](https://file.kamacoder.com/pics/20210107093106367.png) +![96.不同的二叉搜索树](https://file1.kamacoder.com/i/algo/20210107093106367.png) n为1的时候有一棵树,n为2有两棵树,这个是很直观的。 -![96.不同的二叉搜索树1](https://file.kamacoder.com/pics/20210107093129889.png) +![96.不同的二叉搜索树1](https://file1.kamacoder.com/i/algo/20210107093129889.png) 来看看n为3的时候,有哪几种情况。 @@ -65,7 +65,7 @@ dp[3],就是 元素1为头结点搜索树的数量 + 元素2为头结点搜索 如图所示: -![96.不同的二叉搜索树2](https://file.kamacoder.com/pics/20210107093226241.png) +![96.不同的二叉搜索树2](https://file1.kamacoder.com/i/algo/20210107093226241.png) 此时我们已经找到递推关系了,那么可以用动规五部曲再系统分析一遍。 @@ -118,7 +118,7 @@ for (int i = 1; i <= n; i++) { n为5时候的dp数组状态如图: -![96.不同的二叉搜索树3](https://file.kamacoder.com/pics/20210107093253987.png) +![96.不同的二叉搜索树3](https://file1.kamacoder.com/i/algo/20210107093253987.png) 当然如果自己画图举例的话,基本举例到n为3就可以了,n为4的时候,画图已经比较麻烦了。 diff --git "a/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" old mode 100644 new mode 100755 index 9569cbddf1..990d3c8413 --- "a/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" +++ "b/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" @@ -16,7 +16,7 @@ * 节点的右子树只包含大于当前节点的数。 * 所有左子树和右子树自身必须也是二叉搜索树。 -![98.验证二叉搜索树](https://file.kamacoder.com/pics/20230310000750.png) +![98.验证二叉搜索树](https://file1.kamacoder.com/i/algo/20230310000750.png) ## 算法公开课 @@ -102,7 +102,7 @@ if (root->val > root->left->val && root->val < root->right->val) { 例如: [10,5,15,null,null,6,20] 这个case: -![二叉搜索树](https://file.kamacoder.com/pics/20230310000824.png) +![二叉搜索树](https://file1.kamacoder.com/i/algo/20230310000824.png) 节点10大于左节点5,小于右节点15,但右子树里出现了一个6 这就不符合了! diff --git "a/problems/0100.\347\233\270\345\220\214\347\232\204\346\240\221.md" "b/problems/0100.\347\233\270\345\220\214\347\232\204\346\240\221.md" old mode 100644 new mode 100755 index e5f610009e..df1b55a462 --- "a/problems/0100.\347\233\270\345\220\214\347\232\204\346\240\221.md" +++ "b/problems/0100.\347\233\270\345\220\214\347\232\204\346\240\221.md" @@ -12,9 +12,9 @@ 如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。 -![](https://file.kamacoder.com/pics/20210726172932.png) +![](https://file1.kamacoder.com/i/algo/20210726172932.png) -![](https://file.kamacoder.com/pics/20210726173011.png) +![](https://file1.kamacoder.com/i/algo/20210726173011.png) ## 思路 diff --git "a/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" "b/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" old mode 100644 new mode 100755 index 205597b068..24e9e2684e --- "a/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" @@ -9,7 +9,7 @@ 给定一个二叉树,检查它是否是镜像对称的。 -![101. 对称二叉树](https://file.kamacoder.com/pics/20210203144607387.png) +![101. 对称二叉树](https://file1.kamacoder.com/i/algo/20210203144607387.png) ## 算法公开课 @@ -25,7 +25,7 @@ 比较的是两个子树的里侧和外侧的元素是否相等。如图所示: -![101. 对称二叉树1](https://file.kamacoder.com/pics/20210203144624414.png) +![101. 对称二叉树1](https://file1.kamacoder.com/i/algo/20210203144624414.png) 那么遍历的顺序应该是什么样的呢? @@ -169,7 +169,7 @@ public: 通过队列来判断根节点的左子树和右子树的内侧和外侧是否相等,如动画所示: -![101.对称二叉树](https://code-thinking.cdn.bcebos.com/gifs/101.%E5%AF%B9%E7%A7%B0%E4%BA%8C%E5%8F%89%E6%A0%91.gif) +![101.对称二叉树](https://file1.kamacoder.com/i/algo/101.%E5%AF%B9%E7%A7%B0%E4%BA%8C%E5%8F%89%E6%A0%91.gif) diff --git "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" old mode 100644 new mode 100755 index 6725d72cc2..819153be97 --- "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" +++ "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" @@ -26,7 +26,7 @@ -![我要打十个](https://code-thinking.cdn.bcebos.com/gifs/%E6%88%91%E8%A6%81%E6%89%93%E5%8D%81%E4%B8%AA.gif) +![我要打十个](https://file1.kamacoder.com/i/algo/%E6%88%91%E8%A6%81%E6%89%93%E5%8D%81%E4%B8%AA.gif) @@ -37,7 +37,7 @@ 给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。 -![102.二叉树的层序遍历](https://file.kamacoder.com/pics/20210203144842988.png) +![102.二叉树的层序遍历](https://file1.kamacoder.com/i/algo/20210203144842988.png) ### 思路 @@ -57,7 +57,7 @@ 使用队列实现二叉树广度优先遍历,动画如下: -![102二叉树的层序遍历](https://code-thinking.cdn.bcebos.com/gifs/102%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E5%B1%82%E5%BA%8F%E9%81%8D%E5%8E%86.gif) +![102二叉树的层序遍历](https://file1.kamacoder.com/i/algo/102%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E5%B1%82%E5%BA%8F%E9%81%8D%E5%8E%86.gif) 这样就实现了层序从左到右遍历二叉树。 @@ -532,7 +532,7 @@ public IList> LevelOrder(TreeNode root) 给定一个二叉树,返回其节点值自底向上的层次遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历) -![107.二叉树的层次遍历II](https://file.kamacoder.com/pics/20210203151058308.png) +![107.二叉树的层次遍历II](https://file1.kamacoder.com/i/algo/20210203151058308.png) ### 思路 @@ -926,7 +926,7 @@ public IList> LevelOrderBottom(TreeNode root) 给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。 -![199.二叉树的右视图](https://file.kamacoder.com/pics/20210203151307377.png) +![199.二叉树的右视图](https://file1.kamacoder.com/i/algo/20210203151307377.png) ### 思路 @@ -1276,7 +1276,7 @@ public class Solution 给定一个非空二叉树, 返回一个由每层节点平均值组成的数组。 -![637.二叉树的层平均值](https://file.kamacoder.com/pics/20210203151350500.png) +![637.二叉树的层平均值](https://file1.kamacoder.com/i/algo/20210203151350500.png) ### 思路 @@ -1634,7 +1634,7 @@ public class Solution { 例如,给定一个 3叉树 : -![429. N叉树的层序遍历](https://file.kamacoder.com/pics/20210203151439168.png) +![429. N叉树的层序遍历](https://file1.kamacoder.com/i/algo/20210203151439168.png) 返回其层序遍历: @@ -2006,7 +2006,7 @@ impl Solution { 您需要在二叉树的每一行中找到最大的值。 -![515.在每个树行中找最大值](https://file.kamacoder.com/pics/20210203151532153.png) +![515.在每个树行中找最大值](https://file1.kamacoder.com/i/algo/20210203151532153.png) ### 思路 @@ -2337,7 +2337,7 @@ struct Node { 初始状态下,所有 next 指针都被设置为 NULL。 -![116.填充每个节点的下一个右侧节点指针](https://file.kamacoder.com/pics/20210203152044855.jpg) +![116.填充每个节点的下一个右侧节点指针](https://file1.kamacoder.com/i/algo/20210203152044855.jpg) ### 思路 @@ -2971,7 +2971,7 @@ object Solution { 给定二叉树 [3,9,20,null,null,15,7], -![104. 二叉树的最大深度](https://file.kamacoder.com/pics/20210203153031914-20230310134849764.png) +![104. 二叉树的最大深度](https://file1.kamacoder.com/i/algo/20210203153031914-20230310134849764.png) 返回它的最大深度 3 。 @@ -2981,7 +2981,7 @@ object Solution { 在二叉树中,一层一层的来遍历二叉树,记录一下遍历的层数就是二叉树的深度,如图所示: -![层序遍历](https://file.kamacoder.com/pics/20200810193056585-20230310134854803.png) +![层序遍历](https://file1.kamacoder.com/i/algo/20200810193056585-20230310134854803.png) 所以这道题的迭代法就是一道模板题,可以使用二叉树层序遍历的模板来解决的。 diff --git "a/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" "b/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" old mode 100644 new mode 100755 index 2eb22ae5a3..52d6d0e5fd --- "a/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" +++ "b/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" @@ -18,7 +18,7 @@ 给定二叉树 [3,9,20,null,null,15,7], -![104. 二叉树的最大深度](https://file.kamacoder.com/pics/20210203153031914-20230310121809902.png) +![104. 二叉树的最大深度](https://file1.kamacoder.com/i/algo/20210203153031914-20230310121809902.png) 返回它的最大深度 3 。 @@ -172,7 +172,7 @@ public: 在二叉树中,一层一层的来遍历二叉树,记录一下遍历的层数就是二叉树的深度,如图所示: -![层序遍历](https://file.kamacoder.com/pics/20200810193056585.png) +![层序遍历](https://file1.kamacoder.com/i/algo/20200810193056585.png) 所以这道题的迭代法就是一道模板题,可以使用二叉树层序遍历的模板来解决的。 @@ -217,7 +217,7 @@ public: 例如,给定一个 3叉树 : -![559.n叉树的最大深度](https://file.kamacoder.com/pics/2021020315313214.png) +![559.n叉树的最大深度](https://file1.kamacoder.com/i/algo/2021020315313214.png) 我们应返回其最大深度,3。 diff --git "a/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" "b/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" old mode 100644 new mode 100755 index 2f8e5eefb6..5253325835 --- "a/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.md" @@ -25,7 +25,7 @@ * 后序遍历 postorder = [9,15,7,20,3] 返回如下的二叉树: -![106. 从中序与后序遍历序列构造二叉树1](https://file.kamacoder.com/pics/20210203154316774.png) +![106. 从中序与后序遍历序列构造二叉树1](https://file1.kamacoder.com/i/algo/20210203154316774.png) ## 算法公开课 @@ -40,7 +40,7 @@ 流程如图: -![106.从中序与后序遍历序列构造二叉树](https://file.kamacoder.com/pics/20210203154249860.png) +![106.从中序与后序遍历序列构造二叉树](https://file1.kamacoder.com/i/algo/20210203154249860.png) 那么代码应该怎么写呢? @@ -411,7 +411,7 @@ public: 中序遍历 inorder = [9,3,15,20,7] 返回如下的二叉树: -![105. 从前序与中序遍历序列构造二叉树](https://file.kamacoder.com/pics/20210203154626672.png) +![105. 从前序与中序遍历序列构造二叉树](https://file1.kamacoder.com/i/algo/20210203154626672.png) ### 思路 @@ -554,7 +554,7 @@ public: 举一个例子: -![106.从中序与后序遍历序列构造二叉树2](https://file.kamacoder.com/pics/20210203154720326.png) +![106.从中序与后序遍历序列构造二叉树2](https://file1.kamacoder.com/i/algo/20210203154720326.png) tree1 的前序遍历是[1 2 3], 后序遍历是[3 2 1]。 diff --git "a/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" old mode 100644 new mode 100755 index 5829e2d220..2df1c2615b --- "a/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" +++ "b/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" @@ -16,7 +16,7 @@ 示例: -![108.将有序数组转换为二叉搜索树](https://file.kamacoder.com/pics/20201022164420763.png) +![108.将有序数组转换为二叉搜索树](https://file1.kamacoder.com/i/algo/20201022164420763.png) ## 算法公开课 @@ -40,7 +40,7 @@ 例如 有序数组[-10,-3,0,5,9] 就可以构造成这样的二叉搜索树,如图。 -![](https://file.kamacoder.com/pics/20220930173553.png) +![](https://file1.kamacoder.com/i/algo/20220930173553.png) 上图中,是符合二叉搜索树的特性吧,如果要这么做的话,是不是本题意义就不大了,所以才强调是平衡二叉搜索树。 @@ -63,7 +63,7 @@ 如下两棵树,都是这个数组的平衡二叉搜索树: -![108.将有序数组转换为二叉搜索树](https://code-thinking.cdn.bcebos.com/pics/108.将有序数组转换为二叉搜索树.png) +![108.将有序数组转换为二叉搜索树](https://file1.kamacoder.com/i/algo/108.将有序数组转换为二叉搜索树.png) 如果要分割的数组长度为偶数的时候,中间元素为两个,是取左边元素 就是树1,取右边元素就是树2。 diff --git "a/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" "b/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" old mode 100644 new mode 100755 index ff84ad8471..d5b100ae80 --- "a/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" @@ -19,7 +19,7 @@ 给定二叉树 [3,9,20,null,null,15,7] -![110.平衡二叉树](https://file.kamacoder.com/pics/2021020315542230.png) +![110.平衡二叉树](https://file1.kamacoder.com/i/algo/2021020315542230.png) 返回 true 。 @@ -27,7 +27,7 @@ 给定二叉树 [1,2,2,3,3,null,null,4,4] -![110.平衡二叉树1](https://file.kamacoder.com/pics/20210203155447919.png) +![110.平衡二叉树1](https://file1.kamacoder.com/i/algo/20210203155447919.png) 返回 false 。 @@ -46,7 +46,7 @@ 但leetcode中强调的深度和高度很明显是按照节点来计算的,如图: -![110.平衡二叉树2](https://file.kamacoder.com/pics/20210203155515650.png) +![110.平衡二叉树2](https://file1.kamacoder.com/i/algo/20210203155515650.png) 关于根节点的深度究竟是1 还是 0,不同的地方有不一样的标准,leetcode的题目中都是以节点为一度,即根节点深度是1。但维基百科上定义用边为一度,即根节点的深度是0,我们暂时以leetcode为准(毕竟要在这上面刷题)。 diff --git "a/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" "b/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" old mode 100644 new mode 100755 index bd4ea29d6c..e1ee42657c --- "a/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" +++ "b/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" @@ -20,7 +20,7 @@ 给定二叉树 [3,9,20,null,null,15,7], -![111.二叉树的最小深度1](https://file.kamacoder.com/pics/2021020315582586.png) +![111.二叉树的最小深度1](https://file1.kamacoder.com/i/algo/2021020315582586.png) 返回它的最小深度 2. @@ -46,7 +46,7 @@ 本题还有一个误区,在处理节点的过程中,最大深度很容易理解,最小深度就不那么好理解,如图: -![111.二叉树的最小深度](https://code-thinking.cdn.bcebos.com/pics/111.%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E6%9C%80%E5%B0%8F%E6%B7%B1%E5%BA%A6.png) +![111.二叉树的最小深度](https://file1.kamacoder.com/i/algo/111.%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E6%9C%80%E5%B0%8F%E6%B7%B1%E5%BA%A6.png) 这就重新审题了,题目中说的是:**最小深度是从根节点到最近叶子节点的最短路径上的节点数量。**注意是**叶子节点**。 @@ -88,7 +88,7 @@ return result; 这个代码就犯了此图中的误区: -![111.二叉树的最小深度](https://code-thinking.cdn.bcebos.com/pics/111.%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E6%9C%80%E5%B0%8F%E6%B7%B1%E5%BA%A6.png) +![111.二叉树的最小深度](https://file1.kamacoder.com/i/algo/111.%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E6%9C%80%E5%B0%8F%E6%B7%B1%E5%BA%A6.png) 如果这么求的话,没有左孩子的分支会算为最短深度。 diff --git "a/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" "b/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" old mode 100644 new mode 100755 index 24891acee9..73795bcfc9 --- "a/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" +++ "b/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" @@ -15,7 +15,7 @@ 示例: 给定如下二叉树,以及目标和 sum = 22, -![](https://file.kamacoder.com/pics/20230407210247.png) +![](https://file1.kamacoder.com/i/algo/20230407210247.png) 返回 true, 因为存在目标和为 22 的根节点到叶子节点的路径 5->4->11->2。 @@ -53,7 +53,7 @@ 如图所示: -![112.路径总和](https://file.kamacoder.com/pics/2021020316051216.png) +![112.路径总和](https://file1.kamacoder.com/i/algo/2021020316051216.png) 图中可以看出,遍历的路线,并不要遍历整棵树,所以递归函数需要返回值,可以用bool类型表示。 @@ -230,7 +230,7 @@ public: 给定如下二叉树,以及目标和 sum = 22, -![113.路径总和ii1.png](https://file.kamacoder.com/pics/20210203160854654.png) +![113.路径总和ii1.png](https://file1.kamacoder.com/i/algo/20210203160854654.png) ### 思路 @@ -239,7 +239,7 @@ public: 如图: -![113.路径总和ii](https://file.kamacoder.com/pics/20210203160922745.png) +![113.路径总和ii](https://file1.kamacoder.com/i/algo/20210203160922745.png) 为了尽可能的把细节体现出来,我写出如下代码(**这份代码并不简洁,但是逻辑非常清晰**) diff --git "a/problems/0115.\344\270\215\345\220\214\347\232\204\345\255\220\345\272\217\345\210\227.md" "b/problems/0115.\344\270\215\345\220\214\347\232\204\345\255\220\345\272\217\345\210\227.md" old mode 100644 new mode 100755 index 1df3d899a8..499bf100e2 --- "a/problems/0115.\344\270\215\345\220\214\347\232\204\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0115.\344\270\215\345\220\214\347\232\204\345\255\220\345\272\217\345\210\227.md" @@ -12,7 +12,7 @@ 题目数据保证答案符合 32 位带符号整数范围。 -![115.不同的子序列示例](https://code-thinking.cdn.bcebos.com/pics/115.不同的子序列示例.jpg) +![115.不同的子序列示例](https://file1.kamacoder.com/i/algo/115.不同的子序列示例.jpg) 提示: @@ -70,7 +70,7 @@ dp[i][j]:以i-1为结尾的s子序列中出现以j-1为结尾的t的个数为d 从递推公式dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j]; 和 dp[i][j] = dp[i - 1][j]; 中可以看出dp[i][j] 是从上方和左上方推导而来,如图:,那么 dp[i][0] 和dp[0][j]是一定要初始化的。 -![](https://file.kamacoder.com/pics/20221222165412.png) +![](https://file1.kamacoder.com/i/algo/20221222165412.png) 每次当初始化的时候,都要回顾一下dp[i][j]的定义,不要凭感觉初始化。 @@ -101,7 +101,7 @@ for (int j = 1; j <= t.size(); j++) dp[0][j] = 0; // 其实这行代码可以和 从递推公式dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j]; 和 dp[i][j] = dp[i - 1][j]; 中可以看出dp[i][j]都是根据左上方和正上方推出来的。 -![](https://file.kamacoder.com/pics/20221222165412.png) +![](https://file1.kamacoder.com/i/algo/20221222165412.png) 所以遍历的时候一定是从上到下,从左到右,这样保证dp[i][j]可以根据之前计算出来的数值进行计算。 @@ -123,7 +123,7 @@ for (int i = 1; i <= s.size(); i++) { 以s:"baegg",t:"bag"为例,推导dp数组状态如下: -![115.不同的子序列](https://code-thinking.cdn.bcebos.com/pics/115.%E4%B8%8D%E5%90%8C%E7%9A%84%E5%AD%90%E5%BA%8F%E5%88%97.jpg) +![115.不同的子序列](https://file1.kamacoder.com/i/algo/115.%E4%B8%8D%E5%90%8C%E7%9A%84%E5%AD%90%E5%BA%8F%E5%88%97.jpg) 如果写出来的代码怎么改都通过不了,不妨把dp数组打印出来,看一看,是不是这样的。 diff --git "a/problems/0116.\345\241\253\345\205\205\346\257\217\344\270\252\350\212\202\347\202\271\347\232\204\344\270\213\344\270\200\344\270\252\345\217\263\344\276\247\350\212\202\347\202\271\346\214\207\351\222\210.md" "b/problems/0116.\345\241\253\345\205\205\346\257\217\344\270\252\350\212\202\347\202\271\347\232\204\344\270\213\344\270\200\344\270\252\345\217\263\344\276\247\350\212\202\347\202\271\346\214\207\351\222\210.md" old mode 100644 new mode 100755 index 9de1de1ee5..88d3abc93e --- "a/problems/0116.\345\241\253\345\205\205\346\257\217\344\270\252\350\212\202\347\202\271\347\232\204\344\270\213\344\270\200\344\270\252\345\217\263\344\276\247\350\212\202\347\202\271\346\214\207\351\222\210.md" +++ "b/problems/0116.\345\241\253\345\205\205\346\257\217\344\270\252\350\212\202\347\202\271\347\232\204\344\270\213\344\270\200\344\270\252\345\217\263\344\276\247\350\212\202\347\202\271\346\214\207\351\222\210.md" @@ -26,7 +26,7 @@ struct Node { * 你只能使用常量级额外空间。 * 使用递归解题也符合要求,本题中递归程序占用的栈空间不算做额外的空间复杂度。 -![](https://file.kamacoder.com/pics/20210727143202.png) +![](https://file1.kamacoder.com/i/algo/20210727143202.png) ## 思路 @@ -42,7 +42,7 @@ struct Node { 如图,假如当前操作的节点是cur: - + 最关键的点是可以通过上一层递归 搭出来的线,进行本次搭线。 diff --git "a/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" "b/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" old mode 100644 new mode 100755 index f82ed962fa..d12cbf2fe2 --- "a/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" +++ "b/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" @@ -129,7 +129,7 @@ dp[0][1]表示第0天不持有股票,不持有股票那么现金就是0,所 以示例1,输入:[7,1,5,3,6,4]为例,dp数组状态如下: -![121.买卖股票的最佳时机](https://file.kamacoder.com/pics/20210224225642465.png) +![121.买卖股票的最佳时机](https://file1.kamacoder.com/i/algo/20210224225642465.png) dp[5][1]就是最终结果。 diff --git "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" old mode 100644 new mode 100755 index 4ccb17bbfd..0da4241931 --- "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" +++ "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" @@ -66,7 +66,7 @@ 如图: -![122.买卖股票的最佳时机II](https://file.kamacoder.com/pics/2020112917480858-20230310134659477.png) +![122.买卖股票的最佳时机II](https://file1.kamacoder.com/i/algo/2020112917480858-20230310134659477.png) 一些同学陷入:第一天怎么就没有利润呢,第一天到底算不算的困惑中。 diff --git "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" old mode 100644 new mode 100755 diff --git "a/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" "b/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" old mode 100644 new mode 100755 index c4ff89a0c5..063477cb5a --- "a/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" +++ "b/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" @@ -120,7 +120,7 @@ dp[i][4] = max(dp[i - 1][4], dp[i - 1][3] + prices[i]); 以输入[1,2,3,4,5]为例 -![123.买卖股票的最佳时机III](https://file.kamacoder.com/pics/20201228181724295-20230310134201291.png) +![123.买卖股票的最佳时机III](https://file1.kamacoder.com/i/algo/20201228181724295-20230310134201291.png) 大家可以看到红色框为最后两次卖出的状态。 diff --git "a/problems/0127.\345\215\225\350\257\215\346\216\245\351\276\231.md" "b/problems/0127.\345\215\225\350\257\215\346\216\245\351\276\231.md" old mode 100644 new mode 100755 index 1ce0bc11a7..0204606056 --- "a/problems/0127.\345\215\225\350\257\215\346\216\245\351\276\231.md" +++ "b/problems/0127.\345\215\225\350\257\215\346\216\245\351\276\231.md" @@ -31,7 +31,7 @@ 以示例1为例,从这个图中可以看出 hit 到 cog的路线,不止一条,有三条,一条是最短的长度为5,两条长度为6。 -![](https://file.kamacoder.com/pics/20210827175432.png) +![](https://file1.kamacoder.com/i/algo/20210827175432.png) 本题只需要求出最短路径的长度就可以了,不用找出路径。 diff --git "a/problems/0129.\346\261\202\346\240\271\345\210\260\345\217\266\345\255\220\350\212\202\347\202\271\346\225\260\345\255\227\344\271\213\345\222\214.md" "b/problems/0129.\346\261\202\346\240\271\345\210\260\345\217\266\345\255\220\350\212\202\347\202\271\346\225\260\345\255\227\344\271\213\345\222\214.md" old mode 100644 new mode 100755 index 923bc63807..1568a49469 --- "a/problems/0129.\346\261\202\346\240\271\345\210\260\345\217\266\345\255\220\350\212\202\347\202\271\346\225\260\345\255\227\344\271\213\345\222\214.md" +++ "b/problems/0129.\346\261\202\346\240\271\345\210\260\345\217\266\345\255\220\350\212\202\347\202\271\346\225\260\345\255\227\344\271\213\345\222\214.md" @@ -81,7 +81,7 @@ int vectorToInt(const vector& vec) { 如图: - + 代码如下: diff --git "a/problems/0130.\350\242\253\345\233\264\347\273\225\347\232\204\345\214\272\345\237\237.md" "b/problems/0130.\350\242\253\345\233\264\347\273\225\347\232\204\345\214\272\345\237\237.md" old mode 100644 new mode 100755 index 278c12eccc..10d6585c4c --- "a/problems/0130.\350\242\253\345\233\264\347\273\225\347\232\204\345\214\272\345\237\237.md" +++ "b/problems/0130.\350\242\253\345\233\264\347\273\225\347\232\204\345\214\272\345\237\237.md" @@ -8,7 +8,7 @@ 给你一个 m x n 的矩阵 board ,由若干字符 'X' 和 'O' ,找到所有被 'X' 围绕的区域,并将这些区域里所有的 'O' 用 'X' 填充。 -![](https://file.kamacoder.com/pics/20220901104745.png) +![](https://file1.kamacoder.com/i/algo/20220901104745.png) * 输入:board = [["X","X","X","X"],["X","O","O","X"],["X","X","O","X"],["X","O","X","X"]] * 输出:[["X","X","X","X"],["X","X","X","X"],["X","X","X","X"],["X","O","X","X"]] @@ -28,11 +28,11 @@ 步骤一:深搜或者广搜将地图周边的'O'全部改成'A',如图所示: -![图一](https://file.kamacoder.com/pics/20220902102337.png) +![图一](https://file1.kamacoder.com/i/algo/20220902102337.png) 步骤二:在遍历地图,将'O'全部改成'X'(地图中间的'O'改成了'X'),将'A'改回'O'(保留的地图周边的'O'),如图所示: -![图二](https://file.kamacoder.com/pics/20220902102831.png) +![图二](https://file1.kamacoder.com/i/algo/20220902102831.png) 整体C++代码如下,以下使用dfs实现,其实遍历方式dfs,bfs都是可以的。 diff --git "a/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" "b/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" old mode 100644 new mode 100755 index f9b5d244c5..c76f1ce2f1 --- "a/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" +++ "b/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" @@ -50,7 +50,7 @@ 所以切割问题,也可以抽象为一棵树形结构,如图: -![131.分割回文串](https://code-thinking.cdn.bcebos.com/pics/131.%E5%88%86%E5%89%B2%E5%9B%9E%E6%96%87%E4%B8%B2.jpg) +![131.分割回文串](https://file1.kamacoder.com/i/algo/131.%E5%88%86%E5%89%B2%E5%9B%9E%E6%96%87%E4%B8%B2.jpg) 递归用来纵向遍历,for循环用来横向遍历,切割线(就是图中的红线)切割到字符串的结尾位置,说明找到了一个切割方法。 @@ -76,7 +76,7 @@ void backtracking (const string& s, int startIndex) { * 递归函数终止条件 -![131.分割回文串](https://code-thinking.cdn.bcebos.com/pics/131.%E5%88%86%E5%89%B2%E5%9B%9E%E6%96%87%E4%B8%B2.jpg) +![131.分割回文串](https://file1.kamacoder.com/i/algo/131.%E5%88%86%E5%89%B2%E5%9B%9E%E6%96%87%E4%B8%B2.jpg) 从树形结构的图中可以看出:切割线切到了字符串最后面,说明找到了一种切割方法,此时就是本层递归的终止条件。 diff --git "a/problems/0132.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262II.md" "b/problems/0132.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262II.md" old mode 100644 new mode 100755 index 089dd52c78..8bbfa4ee10 --- "a/problems/0132.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262II.md" +++ "b/problems/0132.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262II.md" @@ -161,7 +161,7 @@ for (int i = s.size() - 1; i >= 0; i--) { 以输入:"aabc" 为例: -![132.分割回文串II](https://file.kamacoder.com/pics/20210124182218844.jpg) +![132.分割回文串II](https://file1.kamacoder.com/i/algo/20210124182218844.jpg) 以上分析完毕,代码如下: diff --git "a/problems/0134.\345\212\240\346\262\271\347\253\231.md" "b/problems/0134.\345\212\240\346\262\271\347\253\231.md" old mode 100644 new mode 100755 index 354f642448..5c8b0c3cc8 --- "a/problems/0134.\345\212\240\346\262\271\347\253\231.md" +++ "b/problems/0134.\345\212\240\346\262\271\347\253\231.md" @@ -144,7 +144,7 @@ i从0开始累加rest[i],和记为curSum,一旦curSum小于零,说明[0, i 如图: -![](https://file.kamacoder.com/pics/20230117165628.png) +![](https://file1.kamacoder.com/i/algo/20230117165628.png) 那么为什么一旦[0,i] 区间和为负数,起始位置就可以是i+1呢,i+1后面就不会出现更大的负数? @@ -152,7 +152,7 @@ i从0开始累加rest[i],和记为curSum,一旦curSum小于零,说明[0, i 那有没有可能 [0,i] 区间 选某一个作为起点,累加到 i这里 curSum是不会小于零呢? 如图: -![](https://file.kamacoder.com/pics/20230117170703.png) +![](https://file1.kamacoder.com/i/algo/20230117170703.png) 如果 curSum<0 说明 区间和1 + 区间和2 < 0, 那么 假设从上图中的位置开始计数curSum不会小于0的话,就是 区间和2>0。 diff --git "a/problems/0135.\345\210\206\345\217\221\347\263\226\346\236\234.md" "b/problems/0135.\345\210\206\345\217\221\347\263\226\346\236\234.md" old mode 100644 new mode 100755 index 30df21495e..9701f0f0c1 --- "a/problems/0135.\345\210\206\345\217\221\347\263\226\346\236\234.md" +++ "b/problems/0135.\345\210\206\345\217\221\347\263\226\346\236\234.md" @@ -56,7 +56,7 @@ for (int i = 1; i < ratings.size(); i++) { 如图: -![135.分发糖果](https://file.kamacoder.com/pics/20201117114916878.png) +![135.分发糖果](https://file1.kamacoder.com/i/algo/20201117114916878.png) 再确定左孩子大于右孩子的情况(从后向前遍历) @@ -66,7 +66,7 @@ for (int i = 1; i < ratings.size(); i++) { 如果从前向后遍历,rating[5]与rating[4]的比较 就不能用上 rating[5]与rating[6]的比较结果了 。如图: -![](https://file.kamacoder.com/pics/20230202102044.png) +![](https://file1.kamacoder.com/i/algo/20230202102044.png) **所以确定左孩子大于右孩子的情况一定要从后向前遍历!** @@ -82,7 +82,7 @@ for (int i = 1; i < ratings.size(); i++) { 如图: -![135.分发糖果1](https://file.kamacoder.com/pics/20201117115658791.png) +![135.分发糖果1](https://file1.kamacoder.com/i/algo/20201117115658791.png) 所以该过程代码如下: diff --git "a/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" "b/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" old mode 100644 new mode 100755 index 513d327ba1..2015cb90c1 --- "a/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" +++ "b/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" @@ -180,7 +180,7 @@ dp[0]表示如果字符串为空的话,说明出现在字典里。 以输入: s = "leetcode", wordDict = ["leet", "code"]为例,dp状态如图: -![139.单词拆分](https://file.kamacoder.com/pics/20210202162652727.jpg) +![139.单词拆分](https://file1.kamacoder.com/i/algo/20210202162652727.jpg) dp[s.size()]就是最终结果。 @@ -241,7 +241,7 @@ public: 使用用例:s = "applepenapple", wordDict = ["apple", "pen"],对应的dp数组状态如下: -![](https://file.kamacoder.com/pics/20240809155103.png) +![](https://file1.kamacoder.com/i/algo/20240809155103.png) 最后dp[s.size()] = 0 即 dp[13] = 0 ,而不是1,因为先用 "apple" 去遍历的时候,dp[8]并没有被赋值为1 (还没用"pen"),所以 dp[13]也不能变成1。 diff --git "a/problems/0141.\347\216\257\345\275\242\351\223\276\350\241\250.md" "b/problems/0141.\347\216\257\345\275\242\351\223\276\350\241\250.md" old mode 100644 new mode 100755 index 685a92d529..d3583ba866 --- "a/problems/0141.\347\216\257\345\275\242\351\223\276\350\241\250.md" +++ "b/problems/0141.\347\216\257\345\275\242\351\223\276\350\241\250.md" @@ -13,7 +13,7 @@ 如果链表中存在环,则返回 true 。 否则,返回 false 。 -![](https://file.kamacoder.com/pics/20210727173600.png) +![](https://file1.kamacoder.com/i/algo/20210727173600.png) ## 思路 @@ -29,7 +29,7 @@ 会发现最终都是这种情况, 如下图: - + fast和slow各自再走一步, fast和slow就相遇了 @@ -38,7 +38,7 @@ fast和slow各自再走一步, fast和slow就相遇了 动画如下: -![141.环形链表](https://code-thinking.cdn.bcebos.com/gifs/141.%E7%8E%AF%E5%BD%A2%E9%93%BE%E8%A1%A8.gif) +![141.环形链表](https://file1.kamacoder.com/i/algo/141.%E7%8E%AF%E5%BD%A2%E9%93%BE%E8%A1%A8.gif) C++代码如下 diff --git "a/problems/0142.\347\216\257\345\275\242\351\223\276\350\241\250II.md" "b/problems/0142.\347\216\257\345\275\242\351\223\276\350\241\250II.md" old mode 100644 new mode 100755 index 6cfabc60f6..4fd81ef0f5 --- "a/problems/0142.\347\216\257\345\275\242\351\223\276\350\241\250II.md" +++ "b/problems/0142.\347\216\257\345\275\242\351\223\276\350\241\250II.md" @@ -20,7 +20,7 @@ **说明**:不允许修改给定的链表。 -![循环链表](https://file.kamacoder.com/pics/20200816110112704.png) +![循环链表](https://file1.kamacoder.com/i/algo/20200816110112704.png) ## 算法公开课 @@ -50,7 +50,7 @@ 会发现最终都是这种情况, 如下图: -![142环形链表1](https://file.kamacoder.com/pics/20210318162236720.png) +![142环形链表1](https://file1.kamacoder.com/i/algo/20210318162236720.png) fast和slow各自再走一步, fast和slow就相遇了 @@ -59,7 +59,7 @@ fast和slow各自再走一步, fast和slow就相遇了 动画如下: -![141.环形链表](https://code-thinking.cdn.bcebos.com/gifs/141.%E7%8E%AF%E5%BD%A2%E9%93%BE%E8%A1%A8.gif) +![141.环形链表](https://file1.kamacoder.com/i/algo/141.%E7%8E%AF%E5%BD%A2%E9%93%BE%E8%A1%A8.gif) ### 如果有环,如何找到这个环的入口 @@ -70,7 +70,7 @@ fast和slow各自再走一步, fast和slow就相遇了 环形入口节点到 fast指针与slow指针相遇节点 节点数为y。 从相遇节点 再到环形入口节点节点数为 z。 如图所示: -![](https://file.kamacoder.com/pics/20220925103433.png) +![](https://file1.kamacoder.com/i/algo/20220925103433.png) 那么相遇时: slow指针走过的节点数为: `x + y`, @@ -103,7 +103,7 @@ fast指针走过的节点数:` x + y + n (y + z)`,n为fast指针在环内走 动画如下: -![142.环形链表II(求入口)](https://code-thinking.cdn.bcebos.com/gifs/142.%E7%8E%AF%E5%BD%A2%E9%93%BE%E8%A1%A8II%EF%BC%88%E6%B1%82%E5%85%A5%E5%8F%A3%EF%BC%89.gif) +![142.环形链表II(求入口)](https://file1.kamacoder.com/i/algo/142.%E7%8E%AF%E5%BD%A2%E9%93%BE%E8%A1%A8II%EF%BC%88%E6%B1%82%E5%85%A5%E5%8F%A3%EF%BC%89.gif) 那么 n如果大于1是什么情况呢,就是fast指针在环形转n圈之后才遇到 slow指针。 @@ -154,20 +154,20 @@ public: 即文章[链表:环找到了,那入口呢?](https://programmercarl.com/0142.环形链表II.html)中如下的地方: -![142环形链表5](https://file.kamacoder.com/pics/20210318165123581.png) +![142环形链表5](https://file1.kamacoder.com/i/algo/20210318165123581.png) 首先slow进环的时候,fast一定是先进环来了。 如果slow进环入口,fast也在环入口,那么把这个环展开成直线,就是如下图的样子: -![142环形链表3](https://file.kamacoder.com/pics/2021031816503266.png) +![142环形链表3](https://file1.kamacoder.com/i/algo/2021031816503266.png) 可以看出如果slow 和 fast同时在环入口开始走,一定会在环入口3相遇,slow走了一圈,fast走了两圈。 重点来了,slow进环的时候,fast一定是在环的任意一个位置,如图: -![142环形链表4](https://file.kamacoder.com/pics/2021031816515727.png) +![142环形链表4](https://file1.kamacoder.com/i/algo/2021031816515727.png) 那么fast指针走到环入口3的时候,已经走了k + n 个节点,slow相应的应该走了(k + n) / 2 个节点。 diff --git "a/problems/0143.\351\207\215\346\216\222\351\223\276\350\241\250.md" "b/problems/0143.\351\207\215\346\216\222\351\223\276\350\241\250.md" old mode 100644 new mode 100755 index 98488bc11d..e7056913ee --- "a/problems/0143.\351\207\215\346\216\222\351\223\276\350\241\250.md" +++ "b/problems/0143.\351\207\215\346\216\222\351\223\276\350\241\250.md" @@ -6,7 +6,7 @@ [力扣题目链接](https://leetcode.cn/problems/reorder-list/submissions/) -![](https://file.kamacoder.com/pics/20210726160122.png) +![](https://file1.kamacoder.com/i/algo/20210726160122.png) ## 思路 @@ -96,7 +96,7 @@ public: 如图: - + 这种方法,比较难,平均切割链表,看上去很简单,真正代码写的时候有很多细节,同时两个链表最后拼装整一个新的链表也有一些细节需要注意! diff --git "a/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" "b/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" old mode 100644 new mode 100755 index 6d21452d1d..de56c51ff7 --- "a/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" +++ "b/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" @@ -78,7 +78,7 @@ 在进一步看,本题中每一个子表达式要得出一个结果,然后拿这个结果再进行运算,那么**这岂不就是一个相邻字符串消除的过程,和[1047.删除字符串中的所有相邻重复项](https://programmercarl.com/1047.删除字符串中的所有相邻重复项.html)中的对对碰游戏是不是就非常像了。** 如动画所示: -![150.逆波兰表达式求值](https://code-thinking.cdn.bcebos.com/gifs/150.逆波兰表达式求值.gif) +![150.逆波兰表达式求值](https://file1.kamacoder.com/i/algo/150.逆波兰表达式求值.gif) 相信看完动画大家应该知道,这和[1047. 删除字符串中的所有相邻重复项](https://programmercarl.com/1047.删除字符串中的所有相邻重复项.html)是差不多的,只不过本题不要相邻元素做消除了,而是做运算! diff --git "a/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" "b/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" old mode 100644 new mode 100755 diff --git "a/problems/0160.\347\233\270\344\272\244\351\223\276\350\241\250.md" "b/problems/0160.\347\233\270\344\272\244\351\223\276\350\241\250.md" old mode 100644 new mode 100755 diff --git "a/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" "b/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" old mode 100644 new mode 100755 index a3fc7ef126..350533d8c8 --- "a/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" +++ "b/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" @@ -132,7 +132,7 @@ for (int j = 1; j < 2 * k; j += 2) { 以输入[1,2,3,4,5],k=2为例。 -![188.买卖股票的最佳时机IV](https://file.kamacoder.com/pics/20201229100358221.png) +![188.买卖股票的最佳时机IV](https://file1.kamacoder.com/i/algo/20201229100358221.png) 最后一次卖出,一定是利润最大的,dp[prices.size() - 1][2 * k]即红色部分就是最后求解。 diff --git "a/problems/0189.\346\227\213\350\275\254\346\225\260\347\273\204.md" "b/problems/0189.\346\227\213\350\275\254\346\225\260\347\273\204.md" old mode 100644 new mode 100755 diff --git "a/problems/0198.\346\211\223\345\256\266\345\212\253\350\210\215.md" "b/problems/0198.\346\211\223\345\256\266\345\212\253\350\210\215.md" old mode 100644 new mode 100755 index 0bee40f7cd..7c0aab8ec0 --- "a/problems/0198.\346\211\223\345\256\266\345\212\253\350\210\215.md" +++ "b/problems/0198.\346\211\223\345\256\266\345\212\253\350\210\215.md" @@ -87,7 +87,7 @@ for (int i = 2; i < nums.size(); i++) { 以示例二,输入[2,7,9,3,1]为例。 -![198.打家劫舍](https://file.kamacoder.com/pics/20210221170954115.jpg) +![198.打家劫舍](https://file1.kamacoder.com/i/algo/20210221170954115.jpg) 红框dp[nums.size() - 1]为结果。 diff --git "a/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\345\271\277\346\220\234\347\211\210.md" "b/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\345\271\277\346\220\234\347\211\210.md" old mode 100644 new mode 100755 index 9ea47329bb..7ae44b5222 --- "a/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\345\271\277\346\220\234\347\211\210.md" +++ "b/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\345\271\277\346\220\234\347\211\210.md" @@ -13,7 +13,7 @@ 此外,你可以假设该网格的四条边均被水包围。 -![](https://file.kamacoder.com/pics/20220726093256.png) +![](https://file1.kamacoder.com/i/algo/20220726093256.png) 提示: @@ -28,7 +28,7 @@ 也就是说斜角度链接是不算了, 例如示例二,是三个岛屿,如图: -![图一](https://file.kamacoder.com/pics/20220726094200.png) +![图一](https://file1.kamacoder.com/i/algo/20220726094200.png) 这道题题目是 DFS,BFS,并查集,基础题目。 @@ -48,7 +48,7 @@ 如果从队列拿出节点,再去标记这个节点走过,就会发生下图所示的结果,会导致很多节点重复加入队列。 -![图二](https://file.kamacoder.com/pics/20220727100846.png) +![图二](https://file1.kamacoder.com/i/algo/20220727100846.png) 超时写法 (从队列中取出节点再标记) diff --git "a/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\346\267\261\346\220\234\347\211\210.md" "b/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\346\267\261\346\220\234\347\211\210.md" old mode 100644 new mode 100755 index a015399859..128007bb62 --- "a/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\346\267\261\346\220\234\347\211\210.md" +++ "b/problems/0200.\345\262\233\345\261\277\346\225\260\351\207\217.\346\267\261\346\220\234\347\211\210.md" @@ -12,7 +12,7 @@ 此外,你可以假设该网格的四条边均被水包围。 -![](https://file.kamacoder.com/pics/20220726093256.png) +![](https://file1.kamacoder.com/i/algo/20220726093256.png) 提示: @@ -27,7 +27,7 @@ 也就是说斜角度链接是不算了, 例如示例二,是三个岛屿,如图: -![图一](https://file.kamacoder.com/pics/20220726094200.png) +![图一](https://file1.kamacoder.com/i/algo/20220726094200.png) 这道题题目是 DFS,BFS,并查集,基础题目。 diff --git "a/problems/0202.\345\277\253\344\271\220\346\225\260.md" "b/problems/0202.\345\277\253\344\271\220\346\225\260.md" old mode 100644 new mode 100755 diff --git "a/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" "b/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" old mode 100644 new mode 100755 index 5ecf89bf19..ffe04a5b07 --- "a/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" +++ "b/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" @@ -34,11 +34,11 @@ 这里以链表 1 4 2 4 来举例,移除元素4。 -![203_链表删除元素1](https://file.kamacoder.com/pics/20210316095351161.png) +![203_链表删除元素1](https://file1.kamacoder.com/i/algo/20210316095351161.png) 如果使用C,C++编程语言的话,不要忘了还要从内存中删除这两个移除的节点, 清理节点内存之后如图: -![203_链表删除元素2](https://file.kamacoder.com/pics/20210316095418280.png) +![203_链表删除元素2](https://file1.kamacoder.com/i/algo/20210316095418280.png) **当然如果使用java ,python的话就不用手动管理内存了。** @@ -56,16 +56,16 @@ 来看第一种操作:直接使用原来的链表来进行移除。 -![203_链表删除元素3](https://file.kamacoder.com/pics/2021031609544922.png) +![203_链表删除元素3](https://file1.kamacoder.com/i/algo/2021031609544922.png) 移除头结点和移除其他节点的操作是不一样的,因为链表的其他节点都是通过前一个节点来移除当前节点,而头结点没有前一个节点。 所以头结点如何移除呢,其实只要将头结点向后移动一位就可以,这样就从链表中移除了一个头结点。 -![203_链表删除元素4](https://file.kamacoder.com/pics/20210316095512470.png) +![203_链表删除元素4](https://file1.kamacoder.com/i/algo/20210316095512470.png) 依然别忘将原头结点从内存中删掉。 -![203_链表删除元素5](https://file.kamacoder.com/pics/20210316095543775.png) +![203_链表删除元素5](https://file1.kamacoder.com/i/algo/20210316095543775.png) 这样移除了一个头结点,是不是发现,在单链表中移除头结点 和 移除其他节点的操作方式是不一样,其实在写代码的时候也会发现,需要单独写一段逻辑来处理移除头结点的情况。 @@ -76,7 +76,7 @@ 来看看如何设置一个虚拟头。依然还是在这个链表中,移除元素1。 -![203_链表删除元素6](https://file.kamacoder.com/pics/20210316095619221.png) +![203_链表删除元素6](https://file1.kamacoder.com/i/algo/20210316095619221.png) 这里来给链表添加一个虚拟头结点为新的头结点,此时要移除这个旧头结点元素1。 diff --git "a/problems/0205.\345\220\214\346\236\204\345\255\227\347\254\246\344\270\262.md" "b/problems/0205.\345\220\214\346\236\204\345\255\227\347\254\246\344\270\262.md" old mode 100644 new mode 100755 diff --git "a/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md" "b/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md" old mode 100644 new mode 100755 index 4e33342a67..e49037dd2b --- "a/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md" +++ "b/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md" @@ -27,7 +27,7 @@ 其实只需要改变链表的next指针的指向,直接将链表反转 ,而不用重新定义一个新的链表,如图所示: -![206_反转链表](https://file.kamacoder.com/pics/20210218090901207.png) +![206_反转链表](https://file1.kamacoder.com/i/algo/20210218090901207.png) 之前链表的头节点是元素1, 反转之后头结点就是元素5 ,这里并没有添加或者删除节点,仅仅是改变next指针的方向。 @@ -35,7 +35,7 @@ 我们拿有示例中的链表来举例,如动画所示:(纠正:动画应该是先移动pre,在移动cur) -![](https://code-thinking.cdn.bcebos.com/gifs/206.%E7%BF%BB%E8%BD%AC%E9%93%BE%E8%A1%A8.gif) +![](https://file1.kamacoder.com/i/algo/206.%E7%BF%BB%E8%BD%AC%E9%93%BE%E8%A1%A8.gif) 首先定义一个cur指针,指向头结点,再定义一个pre指针,初始化为null。 diff --git "a/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" "b/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" old mode 100644 new mode 100755 index ca24bc4234..40917f9b8e --- "a/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" +++ "b/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" @@ -84,7 +84,7 @@ public: 这里还是以题目中的示例来举例,s=7, 数组是 2,3,1,2,4,3,来看一下查找的过程: -![209.长度最小的子数组](https://code-thinking.cdn.bcebos.com/gifs/209.%E9%95%BF%E5%BA%A6%E6%9C%80%E5%B0%8F%E7%9A%84%E5%AD%90%E6%95%B0%E7%BB%84.gif) +![209.长度最小的子数组](https://file1.kamacoder.com/i/algo/209.%E9%95%BF%E5%BA%A6%E6%9C%80%E5%B0%8F%E7%9A%84%E5%AD%90%E6%95%B0%E7%BB%84.gif) 最后找到 4,3 是最短距离。 @@ -104,7 +104,7 @@ public: 解题的关键在于 窗口的起始位置如何移动,如图所示: -![leetcode_209](https://file.kamacoder.com/pics/20210312160441942.png) +![leetcode_209](https://file1.kamacoder.com/i/algo/20210312160441942.png) 可以发现**滑动窗口的精妙之处在于根据当前子序列和大小的情况,不断调节子序列的起始位置。从而将O(n^2)暴力解法降为O(n)。** diff --git "a/problems/0213.\346\211\223\345\256\266\345\212\253\350\210\215II.md" "b/problems/0213.\346\211\223\345\256\266\345\212\253\350\210\215II.md" old mode 100644 new mode 100755 index 8fceb0a91e..6f2fdd0610 --- "a/problems/0213.\346\211\223\345\256\266\345\212\253\350\210\215II.md" +++ "b/problems/0213.\346\211\223\345\256\266\345\212\253\350\210\215II.md" @@ -42,15 +42,15 @@ * 情况一:考虑不包含首尾元素 -![213.打家劫舍II](https://file.kamacoder.com/pics/20210129160748643-20230310134000692.jpg) +![213.打家劫舍II](https://file1.kamacoder.com/i/algo/20210129160748643-20230310134000692.jpg) * 情况二:考虑包含首元素,不包含尾元素 -![213.打家劫舍II1](https://file.kamacoder.com/pics/20210129160821374-20230310134003961.jpg) +![213.打家劫舍II1](https://file1.kamacoder.com/i/algo/20210129160821374-20230310134003961.jpg) * 情况三:考虑包含尾元素,不包含首元素 -![213.打家劫舍II2](https://file.kamacoder.com/pics/20210129160842491-20230310134008133.jpg) +![213.打家劫舍II2](https://file1.kamacoder.com/i/algo/20210129160842491-20230310134008133.jpg) **注意我这里用的是"考虑"**,例如情况三,虽然是考虑包含尾元素,但不一定要选尾部元素! 对于情况三,取nums[1] 和 nums[3]就是最大的。 diff --git "a/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" "b/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" old mode 100644 new mode 100755 index e23be78d5e..2da0372b1a --- "a/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" +++ "b/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" @@ -45,7 +45,7 @@ 选取过程如图: -![216.组合总和III](https://file.kamacoder.com/pics/20201123195717975.png) +![216.组合总和III](https://file1.kamacoder.com/i/algo/20201123195717975.png) 图中,可以看出,只有最后取到集合(1,3)和为4 符合条件。 @@ -108,7 +108,7 @@ if (path.size() == k) { 本题和[77. 组合](https://programmercarl.com/0077.组合.html)区别之一就是集合固定的就是9个数[1,...,9],所以for循环固定i<=9 如图: -![216.组合总和III](https://file.kamacoder.com/pics/20201123195717975-20230310113546003.png) +![216.组合总和III](https://file1.kamacoder.com/i/algo/20201123195717975-20230310113546003.png) 处理过程就是 path收集每次选取的元素,相当于树型结构里的边,sum来统计path里元素的总和。 @@ -166,7 +166,7 @@ public: 这道题目,剪枝操作其实是很容易想到了,想必大家看上面的树形图的时候已经想到了。 如图: -![216.组合总和III1](https://file.kamacoder.com/pics/2020112319580476.png) +![216.组合总和III1](https://file1.kamacoder.com/i/algo/2020112319580476.png) 已选元素总和如果已经大于n(图中数值为4)了,那么往后遍历就没有意义了,直接剪掉。 diff --git "a/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" "b/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" old mode 100644 new mode 100755 index 37ae7819aa..eaf4eab2c9 --- "a/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" +++ "b/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" @@ -153,7 +153,7 @@ public: 我来举一个典型的例子如题: - + 完全二叉树只有两种情况,情况一:就是满二叉树,情况二:最后一层叶子节点没有满。 @@ -162,10 +162,10 @@ public: 对于情况二,分别递归左孩子,和右孩子,递归到某一深度一定会有左孩子或者右孩子为满二叉树,然后依然可以按照情况1来计算。 完全二叉树(一)如图: -![222.完全二叉树的节点个数](https://file.kamacoder.com/pics/20201124092543662.png) +![222.完全二叉树的节点个数](https://file1.kamacoder.com/i/algo/20201124092543662.png) 完全二叉树(二)如图: -![222.完全二叉树的节点个数1](https://file.kamacoder.com/pics/20201124092634138.png) +![222.完全二叉树的节点个数1](https://file1.kamacoder.com/i/algo/20201124092634138.png) 可以看出如果整个树不是满二叉树,就递归其左右孩子,直到遇到满二叉树为止,用公式计算这个子树(满二叉树)的节点数量。 @@ -173,15 +173,15 @@ public: 在完全二叉树中,如果递归向左遍历的深度等于递归向右遍历的深度,那说明就是满二叉树。如图: -![](https://file.kamacoder.com/pics/20220829163554.png) +![](https://file1.kamacoder.com/i/algo/20220829163554.png) 在完全二叉树中,如果递归向左遍历的深度不等于递归向右遍历的深度,则说明不是满二叉树,如图: -![](https://file.kamacoder.com/pics/20220829163709.png) +![](https://file1.kamacoder.com/i/algo/20220829163709.png) 那有录友说了,这种情况,递归向左遍历的深度等于递归向右遍历的深度,但也不是满二叉树,如题: -![](https://file.kamacoder.com/pics/20220829163811.png) +![](https://file1.kamacoder.com/i/algo/20220829163811.png) 如果这么想,大家就是对 完全二叉树理解有误区了,**以上这棵二叉树,它根本就不是一个完全二叉树**! diff --git "a/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" "b/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" old mode 100644 new mode 100755 index 2396858056..72dfd2aacf --- "a/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" +++ "b/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" @@ -60,7 +60,7 @@ queue.pop(); queue.empty(); ``` -![225.用队列实现栈](https://code-thinking.cdn.bcebos.com/gifs/225.用队列实现栈.gif) +![225.用队列实现栈](https://file1.kamacoder.com/i/algo/225.用队列实现栈.gif) 详细如代码注释所示: diff --git "a/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" "b/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" old mode 100644 new mode 100755 index 248a28a4d5..67a1a59338 --- "a/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" @@ -10,7 +10,7 @@ 翻转一棵二叉树。 -![226.翻转二叉树](https://file.kamacoder.com/pics/20210203192644329.png) +![226.翻转二叉树](https://file1.kamacoder.com/i/algo/20210203192644329.png) 这道题目背后有一个让程序员心酸的故事,听说 Homebrew的作者Max Howell,就是因为没在白板上写出翻转二叉树,最后被Google拒绝了。(真假不做判断,全当一个乐子哈) @@ -35,7 +35,7 @@ 如果要从整个树来看,翻转还真的挺复杂,整个树以中间分割线进行翻转,如图: -![226.翻转二叉树1](https://file.kamacoder.com/pics/20210203192724351.png) +![226.翻转二叉树1](https://file1.kamacoder.com/i/algo/20210203192724351.png) 可以发现想要翻转它,其实就把每一个节点的左右孩子交换一下就可以了。 @@ -55,7 +55,7 @@ 我们下文以前序遍历为例,通过动画来看一下翻转的过程: -![翻转二叉树](https://code-thinking.cdn.bcebos.com/gifs/%E7%BF%BB%E8%BD%AC%E4%BA%8C%E5%8F%89%E6%A0%91.gif) +![翻转二叉树](https://file1.kamacoder.com/i/algo/%E7%BF%BB%E8%BD%AC%E4%BA%8C%E5%8F%89%E6%A0%91.gif) 我们来看一下递归三部曲: diff --git "a/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" "b/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" old mode 100644 new mode 100755 index 6775a37265..56698e023f --- "a/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" +++ "b/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" @@ -57,7 +57,7 @@ queue.pop();**注意此时的输出栈的操作** queue.pop(); queue.empty(); -![232.用栈实现队列版本2](https://code-thinking.cdn.bcebos.com/gifs/232.用栈实现队列版本2.gif) +![232.用栈实现队列版本2](https://file1.kamacoder.com/i/algo/232.用栈实现队列版本2.gif) 在push数据的时候,只要数据放进输入栈就好,**但在pop的时候,操作就复杂一些,输出栈如果为空,就把进栈数据全部导入进来(注意是全部导入)**,再从出栈弹出数据,如果输出栈不为空,则直接从出栈弹出数据就可以了。 diff --git "a/problems/0234.\345\233\236\346\226\207\351\223\276\350\241\250.md" "b/problems/0234.\345\233\236\346\226\207\351\223\276\350\241\250.md" old mode 100644 new mode 100755 index f493383967..6248861d94 --- "a/problems/0234.\345\233\236\346\226\207\351\223\276\350\241\250.md" +++ "b/problems/0234.\345\233\236\346\226\207\351\223\276\350\241\250.md" @@ -87,7 +87,7 @@ public: 如图所示: - + 代码如下: diff --git "a/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" "b/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" old mode 100644 new mode 100755 index 98cc5b7da8..a1fe78d169 --- "a/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" +++ "b/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" @@ -14,7 +14,7 @@ 例如,给定如下二叉搜索树:  root = [6,2,8,0,4,7,9,null,null,3,5] -![235. 二叉搜索树的最近公共祖先](https://file.kamacoder.com/pics/20201018172243602.png) +![235. 二叉搜索树的最近公共祖先](https://file1.kamacoder.com/i/algo/20201018172243602.png) 示例 1: @@ -52,7 +52,7 @@ 如图,我们从根节点搜索,第一次遇到 cur节点是数值在[q, p]区间中,即 节点5,此时可以说明 q 和 p 一定分别存在于 节点 5的左子树,和右子树中。 -![235.二叉搜索树的最近公共祖先](https://file.kamacoder.com/pics/20220926164214.png) +![235.二叉搜索树的最近公共祖先](https://file1.kamacoder.com/i/algo/20220926164214.png) 此时节点5是不是最近公共祖先? 如果 从节点5继续向左遍历,那么将错过成为p的祖先, 如果从节点5继续向右遍历则错过成为q的祖先。 @@ -64,7 +64,7 @@ 如图所示:p为节点6,q为节点9 -![235.二叉搜索树的最近公共祖先2](https://file.kamacoder.com/pics/20220926165141.png) +![235.二叉搜索树的最近公共祖先2](https://file1.kamacoder.com/i/algo/20220926165141.png) 可以看出直接按照指定的方向,就可以找到节点8,为最近公共祖先,而且不需要遍历整棵树,找到结果直接返回! diff --git "a/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" "b/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" old mode 100644 new mode 100755 index 537d624084..5044e3ba00 --- "a/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" +++ "b/problems/0236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" @@ -16,7 +16,7 @@ 例如,给定如下二叉树:  root = [3,5,1,6,2,0,8,null,null,7,4] -![236. 二叉树的最近公共祖先](https://file.kamacoder.com/pics/20201016173414722.png) +![236. 二叉树的最近公共祖先](https://file1.kamacoder.com/i/algo/20201016173414722.png) 示例 1: 输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1 @@ -51,7 +51,7 @@ **首先最容易想到的一个情况:如果找到一个节点,发现左子树出现结点p,右子树出现节点q,或者 左子树出现结点q,右子树出现节点p,那么该节点就是节点p和q的最近公共祖先。** 即情况一: -![](https://file.kamacoder.com/pics/20220922173502.png) +![](https://file1.kamacoder.com/i/algo/20220922173502.png) 判断逻辑是 如果递归遍历遇到q,就将q返回,遇到p 就将p返回,那么如果 左右子树的返回值都不为空,说明此时的中节点,一定是q 和p 的最近祖先。 @@ -61,7 +61,7 @@ **但是很多人容易忽略一个情况,就是节点本身p(q),它拥有一个子孙节点q(p)。** 情况二: -![](https://file.kamacoder.com/pics/20220922173530.png) +![](https://file1.kamacoder.com/i/algo/20220922173530.png) 其实情况一 和 情况二 代码实现过程都是一样的,也可以说,实现情况一的逻辑,顺便包含了情况二。 @@ -129,7 +129,7 @@ left与right的逻辑处理; // 中 如图: -![236.二叉树的最近公共祖先](https://file.kamacoder.com/pics/2021020415105872.png) +![236.二叉树的最近公共祖先](https://file1.kamacoder.com/i/algo/2021020415105872.png) 就像图中一样直接返回7。 @@ -162,7 +162,7 @@ TreeNode* right = lowestCommonAncestor(root->right, p, q); 如图: -![236.二叉树的最近公共祖先1](https://file.kamacoder.com/pics/20210204151125844.png) +![236.二叉树的最近公共祖先1](https://file1.kamacoder.com/i/algo/20210204151125844.png) 图中节点10的左子树返回null,右子树返回目标值7,那么此时节点10的处理逻辑就是把右子树的返回值(最近公共祖先7)返回上去! @@ -183,7 +183,7 @@ else { // (left == NULL && right == NULL) 那么寻找最小公共祖先,完整流程图如下: -![236.二叉树的最近公共祖先2](https://file.kamacoder.com/pics/202102041512582.png) +![236.二叉树的最近公共祖先2](https://file1.kamacoder.com/i/algo/202102041512582.png) **从图中,大家可以看到,我们是如何回溯遍历整棵二叉树,将结果返回给头结点的!** diff --git "a/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" "b/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" old mode 100644 new mode 100755 index 875f1bd193..5ea810104d --- "a/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" +++ "b/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" @@ -18,7 +18,7 @@ 你能在线性时间复杂度内解决此题吗? - + 提示: @@ -82,7 +82,7 @@ public: 动画如下: -![239.滑动窗口最大值](https://code-thinking.cdn.bcebos.com/gifs/239.滑动窗口最大值.gif) +![239.滑动窗口最大值](https://file1.kamacoder.com/i/algo/239.滑动窗口最大值.gif) 对于窗口里的元素{2, 3, 5, 1 ,4},单调队列里只维护{5, 4} 就够了,保持单调队列里单调递减,此时队列出口元素就是窗口里最大元素。 @@ -98,7 +98,7 @@ public: 为了更直观的感受到单调队列的工作过程,以题目示例为例,输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3,动画如下: -![239.滑动窗口最大值-2](https://code-thinking.cdn.bcebos.com/gifs/239.滑动窗口最大值-2.gif) +![239.滑动窗口最大值-2](https://file1.kamacoder.com/i/algo/239.滑动窗口最大值-2.gif) 那么我们用什么数据结构来实现这个单调队列呢? diff --git "a/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" "b/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" old mode 100644 new mode 100755 index 9a783e5b11..0a37ea26cc --- "a/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" +++ "b/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" @@ -42,7 +42,7 @@ 操作动画如下: -![242.有效的字母异位词](https://code-thinking.cdn.bcebos.com/gifs/242.%E6%9C%89%E6%95%88%E7%9A%84%E5%AD%97%E6%AF%8D%E5%BC%82%E4%BD%8D%E8%AF%8D.gif) +![242.有效的字母异位词](https://file1.kamacoder.com/i/algo/242.%E6%9C%89%E6%95%88%E7%9A%84%E5%AD%97%E6%AF%8D%E5%BC%82%E4%BD%8D%E8%AF%8D.gif) 定义一个数组叫做record用来上记录字符串s里字符出现的次数。 diff --git "a/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" "b/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" old mode 100644 new mode 100755 index 5d71351172..4a66c816bc --- "a/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" +++ "b/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" @@ -14,7 +14,7 @@ 说明: 叶子节点是指没有子节点的节点。 示例: -![257.二叉树的所有路径1](https://file.kamacoder.com/pics/2021020415161576.png) +![257.二叉树的所有路径1](https://file1.kamacoder.com/i/algo/2021020415161576.png) ## 算法公开课 @@ -28,7 +28,7 @@ 前序遍历以及回溯的过程如图: -![257.二叉树的所有路径](https://file.kamacoder.com/pics/20210204151702443.png) +![257.二叉树的所有路径](https://file1.kamacoder.com/i/algo/20210204151702443.png) 我们先使用递归的方式,来做前序遍历。**要知道递归和回溯就是一家的,本题也需要回溯。** @@ -315,7 +315,7 @@ public: 其实关键还在于 参数,使用的是 `string path`,这里并没有加上引用`&` ,即本层递归中,path + 该节点数值,但该层递归结束,上一层path的数值并不会受到任何影响。 如图所示: -![](https://file.kamacoder.com/pics/20220831173322.png) +![](https://file1.kamacoder.com/i/algo/20220831173322.png) 节点4 的path,在遍历到节点3,path+3,遍历节点3的递归结束之后,返回节点4(回溯的过程),path并不会把3加上。 diff --git "a/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" "b/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" old mode 100644 new mode 100755 index 8171a409a0..7c5d7c9c9f --- "a/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" +++ "b/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" @@ -93,7 +93,7 @@ for (int i = 0; i <= n; i++) { // 遍历背包 已输入n为5例,dp状态图如下: -![279.完全平方数](https://file.kamacoder.com/pics/20210202112617341.jpg) +![279.完全平方数](https://file1.kamacoder.com/i/algo/20210202112617341.jpg) dp[0] = 0 dp[1] = min(dp[0] + 1) = 1 diff --git "a/problems/0283.\347\247\273\345\212\250\351\233\266.md" "b/problems/0283.\347\247\273\345\212\250\351\233\266.md" old mode 100644 new mode 100755 index d7911054e4..e25525684e --- "a/problems/0283.\347\247\273\345\212\250\351\233\266.md" +++ "b/problems/0283.\347\247\273\345\212\250\351\233\266.md" @@ -32,7 +32,7 @@ 如动画所示: -![移动零](https://code-thinking.cdn.bcebos.com/gifs/283.%E7%A7%BB%E5%8A%A8%E9%9B%B6.gif) +![移动零](https://file1.kamacoder.com/i/algo/283.%E7%A7%BB%E5%8A%A8%E9%9B%B6.gif) C++代码如下: diff --git "a/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" "b/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" old mode 100644 new mode 100755 index de37ed5cc8..06adfd950d --- "a/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" @@ -85,7 +85,7 @@ for (int i = 1; i < nums.size(); i++) { 输入:[0,1,0,3,2],dp数组的变化如下: -![300.最长上升子序列](https://file.kamacoder.com/pics/20210110170945618.jpg) +![300.最长上升子序列](https://file1.kamacoder.com/i/algo/20210110170945618.jpg) 如果代码写出来,但一直AC不了,那么就把dp数组打印出来,看看对不对! diff --git "a/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" "b/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" old mode 100644 new mode 100755 index 599a1f42e1..d396e521b3 --- "a/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" +++ "b/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" @@ -47,7 +47,7 @@ dp[i][j],第i天状态为j,所剩的最多现金为dp[i][j]。 * 状态三:今天卖出股票 * 状态四:今天为冷冻期状态,但冷冻期状态不可持续,只有一天! -![](https://file.kamacoder.com/pics/518d5baaf33f4b2698064f8efb42edbf.png) +![](https://file1.kamacoder.com/i/algo/518d5baaf33f4b2698064f8efb42edbf.png) j的状态为: @@ -136,7 +136,7 @@ dp[i][3] = dp[i - 1][2]; 以 [1,2,3,0,2] 为例,dp数组如下: -![309.最佳买卖股票时机含冷冻期](https://file.kamacoder.com/pics/2021032317451040.png) +![309.最佳买卖股票时机含冷冻期](https://file1.kamacoder.com/i/algo/2021032317451040.png) 最后结果是取 状态二,状态三,和状态四的最大值,不少同学会把状态四忘了,状态四是冷冻期,最后一天如果是冷冻期也可能是最大值。 diff --git "a/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" "b/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" old mode 100644 new mode 100755 index 7f3bc1e4b1..f3a0a07dd9 --- "a/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" +++ "b/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" @@ -104,7 +104,7 @@ dp[0] = 0; 以输入:coins = [1, 2, 5], amount = 5为例 -![322.零钱兑换](https://file.kamacoder.com/pics/20210201111833906.jpg) +![322.零钱兑换](https://file1.kamacoder.com/i/algo/20210201111833906.jpg) dp[amount]为最终结果。 diff --git "a/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" "b/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" old mode 100644 new mode 100755 index fcdb6a33ed..1168277a8d --- "a/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" +++ "b/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" @@ -57,7 +57,7 @@ 对于死循环,我来举一个有重复机场的例子: -![332.重新安排行程](https://file.kamacoder.com/pics/20201115180537865.png) +![332.重新安排行程](https://file1.kamacoder.com/i/algo/20201115180537865.png) 为什么要举这个例子呢,就是告诉大家,出发机场和到达机场也会重复的,**如果在解题的过程中没有对集合元素处理好,就会死循环。** @@ -111,7 +111,7 @@ void backtracking(参数) { 本题以输入:[["JFK", "KUL"], ["JFK", "NRT"], ["NRT", "JFK"]为例,抽象为树形结构如下: -![332.重新安排行程1](https://file.kamacoder.com/pics/2020111518065555-20230310121223600.png) +![332.重新安排行程1](https://file1.kamacoder.com/i/algo/2020111518065555-20230310121223600.png) 开始回溯三部曲讲解: @@ -137,7 +137,7 @@ bool backtracking(int ticketNum, vector& result) { 因为我们只需要找到一个行程,就是在树形结构中唯一的一条通向叶子节点的路线,如图: -![332.重新安排行程1](https://file.kamacoder.com/pics/2020111518065555-20230310121240991.png) +![332.重新安排行程1](https://file1.kamacoder.com/i/algo/2020111518065555-20230310121240991.png) 所以找到了这个叶子节点了直接返回,这个递归函数的返回值问题我们在讲解二叉树的系列的时候,在这篇[二叉树:递归函数究竟什么时候需要返回值,什么时候不要返回值?](https://programmercarl.com/0112.路径总和.html)详细介绍过。 diff --git "a/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" "b/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" old mode 100644 new mode 100755 index 4916af4c26..44af86bb4c --- "a/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" +++ "b/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" @@ -12,7 +12,7 @@ 计算在不触动警报的情况下,小偷一晚能够盗取的最高金额。 -![337.打家劫舍III](https://file.kamacoder.com/pics/20210223173849619.png) +![337.打家劫舍III](https://file1.kamacoder.com/i/algo/20210223173849619.png) ## 算法公开课 @@ -177,7 +177,7 @@ return {val2, val1}; 以示例1为例,dp数组状态如下:(**注意用后序遍历的方式推导**) -![](https://file.kamacoder.com/pics/20230203110031.png) +![](https://file1.kamacoder.com/i/algo/20230203110031.png) **最后头结点就是 取下标0 和 下标1的最大值就是偷得的最大金钱**。 diff --git "a/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" "b/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" old mode 100644 new mode 100755 index 203c422879..c9467e361f --- "a/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" +++ "b/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" @@ -127,7 +127,7 @@ for (int i = 3; i <= n ; i++) { 举例当n为10 的时候,dp数组里的数值,如下: -![343.整数拆分](https://file.kamacoder.com/pics/20210104173021581.png) +![343.整数拆分](https://file1.kamacoder.com/i/algo/20210104173021581.png) 以上动规五部曲分析完毕,C++代码如下: diff --git "a/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" "b/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" old mode 100644 new mode 100755 index c88d008c82..cadb31c97b --- "a/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" @@ -69,7 +69,7 @@ 以字符串`hello`为例,过程如下: -![344.反转字符串](https://code-thinking.cdn.bcebos.com/gifs/344.%E5%8F%8D%E8%BD%AC%E5%AD%97%E7%AC%A6%E4%B8%B2.gif) +![344.反转字符串](https://file1.kamacoder.com/i/algo/344.%E5%8F%8D%E8%BD%AC%E5%AD%97%E7%AC%A6%E4%B8%B2.gif) 不难写出如下C++代码: diff --git "a/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" "b/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" old mode 100644 new mode 100755 index b6575c5fd4..fa7d6155a5 --- "a/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" +++ "b/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" @@ -70,7 +70,7 @@ 寻找前k个最大元素流程如图所示:(图中的频率只有三个,所以正好构成一个大小为3的小顶堆,如果频率更多一些,则用这个小顶堆进行扫描) -![347.前K个高频元素](https://code-thinking.cdn.bcebos.com/pics/347.前K个高频元素.jpg) +![347.前K个高频元素](https://file1.kamacoder.com/i/algo/347.前K个高频元素.jpg) 我们来看一下C++代码: diff --git "a/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" "b/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" old mode 100644 new mode 100755 index 65d22a809c..77e895da61 --- "a/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" +++ "b/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" @@ -14,7 +14,7 @@ 题意:给定两个数组,编写一个函数来计算它们的交集。 -![349. 两个数组的交集](https://file.kamacoder.com/pics/20200818193523911.png) +![349. 两个数组的交集](https://file1.kamacoder.com/i/algo/20200818193523911.png) **说明:** 输出结果中的每个元素一定是唯一的。 @@ -51,7 +51,7 @@ std::set和std::multiset底层实现都是红黑树,std::unordered_set的底 思路如图所示: -![set哈希法](https://file.kamacoder.com/pics/20220707173513.png) +![set哈希法](https://file1.kamacoder.com/i/algo/20220707173513.png) C++代码如下: diff --git "a/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" "b/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" old mode 100644 new mode 100755 index 50934981a6..1be9cb4178 --- "a/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" +++ "b/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" @@ -46,7 +46,7 @@ 用示例二来举例,如图所示: -![376.摆动序列](https://file.kamacoder.com/pics/20201124174327597.png) +![376.摆动序列](https://file1.kamacoder.com/i/algo/20201124174327597.png) **局部最优:删除单调坡度上的节点(不包括单调坡度两端的节点),那么这个坡度就可以有两个局部峰值**。 @@ -72,13 +72,13 @@ 例如 [1,2,2,2,2,1]这样的数组,如图: -![](https://file.kamacoder.com/pics/20230106170449.png) +![](https://file1.kamacoder.com/i/algo/20230106170449.png) 它的摇摆序列长度是多少呢? **其实是长度是 3**,也就是我们在删除的时候 要不删除左面的三个 2,要不就删除右边的三个 2。 如图,可以统一规则,删除左边的三个 2: -![](https://file.kamacoder.com/pics/20230106172613.png) +![](https://file1.kamacoder.com/i/algo/20230106172613.png) 在图中,当 i 指向第一个 2 的时候,`prediff > 0 && curdiff = 0` ,当 i 指向最后一个 2 的时候 `prediff = 0 && curdiff < 0`。 @@ -106,7 +106,7 @@ 那么为了规则统一,针对序列[2,5],可以假设为[2,2,5],这样它就有坡度了即 preDiff = 0,如图: -![376.摆动序列1](https://file.kamacoder.com/pics/20201124174357612.png) +![376.摆动序列1](https://file1.kamacoder.com/i/algo/20201124174357612.png) 针对以上情形,result 初始为 1(默认最右面有一个峰值),此时 curDiff > 0 && preDiff <= 0,那么 result++(计算了左面的峰值),最后得到的 result 就是 2(峰值个数为 2 即摆动序列长度为 2) @@ -145,7 +145,7 @@ public: 在版本一中,我们忽略了一种情况,即 如果在一个单调坡度上有平坡,例如[1,2,2,2,3,4],如图: -![](https://file.kamacoder.com/pics/20230108171505.png) +![](https://file1.kamacoder.com/i/algo/20230108171505.png) 图中,我们可以看出,版本一的代码在三个地方记录峰值,但其实结果因为是 2,因为 单调中的平坡 不能算峰值(即摆动)。 @@ -184,7 +184,7 @@ public: **本题异常情况的本质,就是要考虑平坡**, 平坡分两种,一个是 上下中间有平坡,一个是单调有平坡,如图: -![](https://file.kamacoder.com/pics/20230108174452.png) +![](https://file1.kamacoder.com/i/algo/20230108174452.png) ### 思路 2(动态规划) diff --git "a/problems/0377.\347\273\204\345\220\210\346\200\273\345\222\214\342\205\243.md" "b/problems/0377.\347\273\204\345\220\210\346\200\273\345\222\214\342\205\243.md" old mode 100644 new mode 100755 index 20a94331c4..ab92f24aef --- "a/problems/0377.\347\273\204\345\220\210\346\200\273\345\222\214\342\205\243.md" +++ "b/problems/0377.\347\273\204\345\220\210\346\200\273\345\222\214\342\205\243.md" @@ -103,7 +103,7 @@ dp[i](考虑nums[j])可以由 dp[i - nums[j]](不考虑nums[j]) 推导 我们再来用示例中的例子推导一下: -![377.组合总和Ⅳ](https://file.kamacoder.com/pics/20230310000625.png) +![377.组合总和Ⅳ](https://file1.kamacoder.com/i/algo/20230310000625.png) 如果代码运行处的结果不是想要的结果,就把dp[i]都打出来,看看和我们推导的一不一样。 diff --git "a/problems/0383.\350\265\216\351\207\221\344\277\241.md" "b/problems/0383.\350\265\216\351\207\221\344\277\241.md" old mode 100644 new mode 100755 diff --git "a/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" "b/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" old mode 100644 new mode 100755 index d59b7bc121..bf2d959682 --- "a/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" @@ -80,7 +80,7 @@ if (s[i - 1] != t[j - 1]),此时相当于t要删除元素,t如果把当前 因为这样的定义在dp二维矩阵中可以留出初始化的区间,如图: -![392.判断子序列](https://file.kamacoder.com/pics/20210303173115966.png) +![392.判断子序列](https://file1.kamacoder.com/i/algo/20210303173115966.png) 如果要是定义的dp[i][j]是以下标i为结尾的字符串s和以下标j为结尾的字符串t,初始化就比较麻烦了。 @@ -98,14 +98,14 @@ vector> dp(s.size() + 1, vector(t.size() + 1, 0)); 如图所示: -![392.判断子序列1](https://file.kamacoder.com/pics/20210303172354155.jpg) +![392.判断子序列1](https://file1.kamacoder.com/i/algo/20210303172354155.jpg) 5. 举例推导dp数组 以示例一为例,输入:s = "abc", t = "ahbgdc",dp状态转移图如下: -![392.判断子序列2](https://file.kamacoder.com/pics/2021030317364166.jpg) +![392.判断子序列2](https://file1.kamacoder.com/i/algo/2021030317364166.jpg) dp[i][j]表示以下标i-1为结尾的字符串s和以下标j-1为结尾的字符串t 相同子序列的长度,所以如果dp[s.size()][t.size()] 与 字符串s的长度相同说明:s与t的最长相同子序列就是s,那么s 就是 t 的子序列。 diff --git "a/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" "b/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" old mode 100644 new mode 100755 index 69723815a1..10b159b181 --- "a/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" +++ "b/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" @@ -12,7 +12,7 @@ 示例: -![404.左叶子之和1](https://file.kamacoder.com/pics/20210204151927654.png) +![404.左叶子之和1](https://file1.kamacoder.com/i/algo/20210204151927654.png) ## 算法公开课 @@ -26,12 +26,12 @@ 大家思考一下如下图中二叉树,左叶子之和究竟是多少? -![404.左叶子之和](https://file.kamacoder.com/pics/20210204151949672.png) +![404.左叶子之和](https://file1.kamacoder.com/i/algo/20210204151949672.png) **其实是0,因为这棵树根本没有左叶子!** 但看这个图的左叶子之和是多少? -![图二](https://file.kamacoder.com/pics/20220902165805.png) +![图二](https://file1.kamacoder.com/i/algo/20220902165805.png) 相信通过这两个图,大家对最左叶子的定义有明确理解了。 diff --git "a/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" "b/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" old mode 100644 new mode 100755 index 0d060ee837..ce9d3bfb4e --- "a/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" +++ "b/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" @@ -61,7 +61,7 @@ 以图中{5,2} 为例: -![406.根据身高重建队列](https://file.kamacoder.com/pics/20201216201851982.png) +![406.根据身高重建队列](https://file1.kamacoder.com/i/algo/20201216201851982.png) 按照身高排序之后,优先按身高高的people的k来插入,后序插入节点也不会影响前面已经插入的节点,最终按照k的规则完成了队列。 diff --git "a/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" "b/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" old mode 100644 new mode 100755 index 79b4d4f75a..75bc5d0e10 --- "a/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" +++ "b/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" @@ -155,7 +155,7 @@ dp[j]的数值一定是小于等于j的。 用例1,输入[1,5,11,5] 为例,如图: -![416.分割等和子集2](https://file.kamacoder.com/pics/20210110104240545.png) +![416.分割等和子集2](https://file1.kamacoder.com/i/algo/20210110104240545.png) 最后dp[11] == 11,说明可以将这个数组分割成两个子集,使得两个子集的元素和相等。 diff --git "a/problems/0417.\345\244\252\345\271\263\346\264\213\345\244\247\350\245\277\346\264\213\346\260\264\346\265\201\351\227\256\351\242\230.md" "b/problems/0417.\345\244\252\345\271\263\346\264\213\345\244\247\350\245\277\346\264\213\346\260\264\346\265\201\351\227\256\351\242\230.md" old mode 100644 new mode 100755 index 116cd08e09..c9494313a1 --- "a/problems/0417.\345\244\252\345\271\263\346\264\213\345\244\247\350\245\277\346\264\213\346\260\264\346\265\201\351\227\256\351\242\230.md" +++ "b/problems/0417.\345\244\252\345\271\263\346\264\213\345\244\247\350\245\277\346\264\213\346\260\264\346\265\201\351\227\256\351\242\230.md" @@ -18,7 +18,7 @@ 示例 1: -![](https://file.kamacoder.com/pics/20230129103212.png) +![](https://file1.kamacoder.com/i/algo/20230129103212.png) * 输入: heights = [[1,2,2,3,5],[3,2,3,4,4],[2,4,5,3,1],[6,7,1,4,5],[5,1,1,2,4]] * 输出: [[0,4],[1,3],[1,4],[2,2],[3,0],[3,1],[4,0]] @@ -130,11 +130,11 @@ public: 从太平洋边上节点出发,如图: -![图一](https://file.kamacoder.com/pics/20220722103029.png) +![图一](https://file1.kamacoder.com/i/algo/20220722103029.png) 从大西洋边上节点出发,如图: -![图二](https://file.kamacoder.com/pics/20220722103330.png) +![图二](https://file1.kamacoder.com/i/algo/20220722103330.png) 按照这样的逻辑,就可以写出如下遍历代码:(详细注释) diff --git "a/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" "b/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" old mode 100644 new mode 100755 index 04845ea7c3..4231a8ee90 --- "a/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" +++ "b/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" @@ -44,7 +44,7 @@ 这里记录非交叉区间的个数还是有技巧的,如图: -![](https://file.kamacoder.com/pics/20230201164134.png) +![](https://file1.kamacoder.com/i/algo/20230201164134.png) 区间,1,2,3,4,5,6都按照右边界排好序。 diff --git "a/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" "b/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" old mode 100644 new mode 100755 index 406116a388..44575b8aff --- "a/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" +++ "b/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" @@ -20,7 +20,7 @@ 示例: -![450.删除二叉搜索树中的节点](https://file.kamacoder.com/pics/20201020171048265.png) +![450.删除二叉搜索树中的节点](https://file1.kamacoder.com/i/algo/20201020171048265.png) ## 算法公开课 @@ -67,7 +67,7 @@ if (root == nullptr) return root; 第五种情况有点难以理解,看下面动画: -![450.删除二叉搜索树中的节点](https://code-thinking.cdn.bcebos.com/gifs/450.%E5%88%A0%E9%99%A4%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91%E4%B8%AD%E7%9A%84%E8%8A%82%E7%82%B9.gif) +![450.删除二叉搜索树中的节点](https://file1.kamacoder.com/i/algo/450.%E5%88%A0%E9%99%A4%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91%E4%B8%AD%E7%9A%84%E8%8A%82%E7%82%B9.gif) 动画中的二叉搜索树中,删除元素7, 那么删除节点(元素7)的左孩子就是5,删除节点(元素7)的右子树的最左面节点是元素8。 diff --git "a/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" "b/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" old mode 100644 new mode 100755 index 17d21cd1c4..76de3f93a2 --- "a/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" +++ "b/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" @@ -76,7 +76,7 @@ 以题目示例: [[10,16],[2,8],[1,6],[7,12]]为例,如图:(方便起见,已经排序) -![452.用最少数量的箭引爆气球](https://file.kamacoder.com/pics/20201123101929791.png) +![452.用最少数量的箭引爆气球](https://file1.kamacoder.com/i/algo/20201123101929791.png) 可以看出首先第一组重叠气球,一定是需要一个箭,气球3,的左边界大于了 第一组重叠气球的最小右边界,所以再需要一支箭来射气球3了。 diff --git "a/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" "b/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" old mode 100644 new mode 100755 diff --git "a/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" "b/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" old mode 100644 new mode 100755 index 2a6ade1b64..2c38ab9ec1 --- "a/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" +++ "b/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" @@ -46,7 +46,7 @@ 如图: -![](https://file.kamacoder.com/pics/20230405225628.png) +![](https://file1.kamacoder.com/i/algo/20230405225628.png) 这个例子可以看出饼干 9 只有喂给胃口为 7 的小孩,这样才是整体最优解,并想不出反例,那么就可以撸代码了。 @@ -89,7 +89,7 @@ public: 如果 for 控制的是饼干, if 控制胃口,就是出现如下情况 : -![](https://file.kamacoder.com/pics/20230112102848.png) +![](https://file1.kamacoder.com/i/algo/20230112102848.png) if 里的 index 指向 胃口 10, for 里的 i 指向饼干 9,因为 饼干 9 满足不了 胃口 10,所以 i 持续向前移动,而 index 走不到` s[index] >= g[i]` 的逻辑,所以 index 不会移动,那么当 i 持续向前移动,最后所有的饼干都匹配不上。 diff --git "a/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" "b/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" old mode 100644 new mode 100755 index 627a27a48e..d164277731 --- "a/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" @@ -46,13 +46,13 @@ 当一个字符串s:abcabc,内部由重复的子串组成,那么这个字符串的结构一定是这样的: -![图一](https://file.kamacoder.com/pics/20220728104518.png) +![图一](https://file1.kamacoder.com/i/algo/20220728104518.png) 也就是由前后相同的子串组成。 那么既然前面有相同的子串,后面有相同的子串,用 s + s,这样组成的字符串中,后面的子串做前串,前面的子串做后串,就一定还能组成一个s,如图: -![图二](https://file.kamacoder.com/pics/20220728104931.png) +![图二](https://file1.kamacoder.com/i/algo/20220728104931.png) 当然,我们在判断 s + s 拼接的字符串里是否出现一个s的的时候,**要刨除 s + s 的首字符和尾字符**,这样避免在s+s中搜索出原来的s,我们要搜索的是中间拼接出来的s。 @@ -64,11 +64,11 @@ 如图,字符串s,图中数字为数组下标,在 s + s 拼接后, 不算首尾字符,中间凑成s字符串。 (图中数字为数组下标) -![](https://file.kamacoder.com/pics/20240910115555.png) +![](https://file1.kamacoder.com/i/algo/20240910115555.png) 图中,因为中间拼接成了s,根据红色框 可以知道 s[4] = s[0], s[5] = s[1], s[0] = s[2], s[1] = s[3] s[2] = s[4] ,s[3] = s[5] -![](https://file.kamacoder.com/pics/20240910115819.png) +![](https://file1.kamacoder.com/i/algo/20240910115819.png) 以上相等关系我们串联一下: @@ -83,7 +83,7 @@ s[5] = s[1] = s[3] 这里可以有录友想,凭什么就是这样组成的s呢,我换一个方式组成s 行不行,如图: -![](https://file.kamacoder.com/pics/20240910120751.png) +![](https://file1.kamacoder.com/i/algo/20240910120751.png) s[3] = s[0],s[4] = s[1] ,s[5] = s[2],s[0] = s[3],s[1] = s[4],s[2] = s[5] @@ -101,7 +101,7 @@ s[0] s[1] s[2] = s[3] s[4] s[5] 如果是这样的呢,如图: -![](https://file.kamacoder.com/pics/20240910121236.png) +![](https://file1.kamacoder.com/i/algo/20240910121236.png) s[1] = s[0],s[2] = s[1] ,s[3] = s[2],s[4] = s[3],s[5] = s[4],s[0] = s[5] @@ -165,23 +165,23 @@ KMP算法中next数组为什么遇到字符不匹配的时候可以找到上一 那么相同前后缀可以是这样: -![](https://file.kamacoder.com/pics/20240913110257.png) +![](https://file1.kamacoder.com/i/algo/20240913110257.png) 也可以是这样: -![](https://file.kamacoder.com/pics/20240913110316.png) +![](https://file1.kamacoder.com/i/algo/20240913110316.png) 最长的相等前后缀,也就是这样: -![](https://file.kamacoder.com/pics/20240913110841.png) +![](https://file1.kamacoder.com/i/algo/20240913110841.png) 这里有录友就想:如果字符串s 是由最小重复子串p组成,最长相等前后缀就不能更长一些? 例如这样: -![](https://file.kamacoder.com/pics/20240913114348.png) +![](https://file1.kamacoder.com/i/algo/20240913114348.png) 如果这样的话,因为前后缀要相同,所以 p2 = p1,p3 = p2,如图: -![](https://file.kamacoder.com/pics/20240913114818.png) +![](https://file1.kamacoder.com/i/algo/20240913114818.png) p2 = p1,p3 = p2 即: p1 = p2 = p3 @@ -203,7 +203,7 @@ p2 = p1,p3 = p2 即: p1 = p2 = p3 情况一, 最长相等前后缀不包含的子串的长度 比 字符串s的一半的长度还大,那一定不是字符串s的重复子串,如图: -![](https://file.kamacoder.com/pics/20240911110236.png) +![](https://file1.kamacoder.com/i/algo/20240911110236.png) 图中:前后缀不包含的子串的长度 大于 字符串s的长度的 二分之一 @@ -211,7 +211,7 @@ p2 = p1,p3 = p2 即: p1 = p2 = p3 情况二,最长相等前后缀不包含的子串的长度 可以被 字符串s的长度整除,如图: -![](https://file.kamacoder.com/pics/20240910174249.png) +![](https://file1.kamacoder.com/i/algo/20240910174249.png) 步骤一:因为 这是相等的前缀和后缀,t[0] 与 k[0]相同, t[1] 与 k[1]相同,所以 s[0] 一定和 s[2]相同,s[1] 一定和 s[3]相同,即:,s[0]s[1]与s[2]s[3]相同 。 @@ -234,7 +234,7 @@ p2 = p1,p3 = p2 即: p1 = p2 = p3 那么它的最长相同前后缀,就不是上图中的前后缀,而是这样的的前后缀: -![](https://file.kamacoder.com/pics/20240910175053.png) +![](https://file1.kamacoder.com/i/algo/20240910175053.png) 录友可能再问,由一个字符组成的字符串,最长相等前后缀凭什么就是这样的。 @@ -250,7 +250,7 @@ p2 = p1,p3 = p2 即: p1 = p2 = p3 **情况三,最长相等前后缀不包含的子串的长度 不被 字符串s的长度整除得情况**,如图: -![](https://file.kamacoder.com/pics/20240913115854.png) +![](https://file1.kamacoder.com/i/algo/20240913115854.png) 步骤一:因为 这是相等的前缀和后缀,t[0] 与 k[0]相同, t[1] 与 k[1]相同,t[2] 与 k[2]相同。 @@ -301,7 +301,7 @@ next 数组记录的就是最长相同前后缀( [字符串:KMP算法精讲] 如图: -![459.重复的子字符串_1](https://code-thinking.cdn.bcebos.com/pics/459.重复的子字符串_1.png) +![459.重复的子字符串_1](https://file1.kamacoder.com/i/algo/459.重复的子字符串_1.png) `next[len - 1] = 7`,`next[len - 1] + 1 = 8`,8就是此时字符串asdfasdfasdf的最长相同前后缀的长度。 diff --git "a/problems/0463.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" "b/problems/0463.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" old mode 100644 new mode 100755 index 40ddc57d63..ba60bc4564 --- "a/problems/0463.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" +++ "b/problems/0463.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" @@ -15,7 +15,7 @@ 岛屿中没有“湖”(“湖” 指水域在岛屿内部且不和岛屿周围的水相连)。格子是边长为 1 的正方形。网格为长方形,且宽度和高度均不超过 100 。计算这个岛屿的周长。 -![](https://file.kamacoder.com/pics/20230829180848.png) +![](https://file1.kamacoder.com/i/algo/20230829180848.png) * 输入:grid = [[0,1,0,0],[1,1,1,0],[0,1,0,0],[1,1,0,0]] * 输出:16 @@ -49,7 +49,7 @@ 如图: - + C++代码如下:(详细注释) @@ -89,7 +89,7 @@ result = 岛屿数量 * 4 - cover * 2; 如图: - + C++代码如下:(详细注释) diff --git "a/problems/0474.\344\270\200\345\222\214\351\233\266.md" "b/problems/0474.\344\270\200\345\222\214\351\233\266.md" old mode 100644 new mode 100755 index 8166b39aad..750917de3e --- "a/problems/0474.\344\270\200\345\222\214\351\233\266.md" +++ "b/problems/0474.\344\270\200\345\222\214\351\233\266.md" @@ -51,7 +51,7 @@ 其实本题并不是多重背包,再来看一下这个图,捋清几种背包的关系 -![416.分割等和子集1](https://file.kamacoder.com/pics/20210117171307407-20230310132423205.png) +![416.分割等和子集1](https://file1.kamacoder.com/i/algo/20210117171307407-20230310132423205.png) 多重背包是每个物品,数量不同的情况。 @@ -127,7 +127,7 @@ for (string str : strs) { // 遍历物品 最后dp数组的状态如下所示: -![474.一和零](https://file.kamacoder.com/pics/20210120111201512.jpg) +![474.一和零](https://file1.kamacoder.com/i/algo/20210120111201512.jpg) 以上动规五部曲分析完毕,C++代码如下: diff --git "a/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" "b/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" old mode 100644 new mode 100755 index b3171c8a12..5d37737169 --- "a/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" @@ -45,7 +45,7 @@ 为了有鲜明的对比,我用[4, 7, 6, 7]这个数组来举例,抽象为树形结构如图: -![491. 递增子序列1](https://file.kamacoder.com/pics/20201124200229824.png) +![491. 递增子序列1](https://file1.kamacoder.com/i/algo/20201124200229824.png) @@ -79,7 +79,7 @@ if (path.size() > 1) { * 单层搜索逻辑 -![491. 递增子序列1](https://file.kamacoder.com/pics/20201124200229824-20230310131640070.png) +![491. 递增子序列1](https://file1.kamacoder.com/i/algo/20201124200229824-20230310131640070.png) 在图中可以看出,**同一父节点下的同层上使用过的元素就不能再使用了** 那么单层搜索代码如下: diff --git "a/problems/0494.\347\233\256\346\240\207\345\222\214.md" "b/problems/0494.\347\233\256\346\240\207\345\222\214.md" old mode 100644 new mode 100755 index a23e1743cb..b161bc57a8 --- "a/problems/0494.\347\233\256\346\240\207\345\222\214.md" +++ "b/problems/0494.\347\233\256\346\240\207\345\222\214.md" @@ -163,7 +163,7 @@ if (abs(target) > sum) return 0; // 此时没有方案 先只考虑物品0,如图: -![](https://file.kamacoder.com/pics/20240808161747.png) +![](https://file1.kamacoder.com/i/algo/20240808161747.png) (这里的所有物品,都是题目中的数字1)。 @@ -177,7 +177,7 @@ if (abs(target) > sum) return 0; // 此时没有方案 接下来 考虑 物品0 和 物品1,如图: -![](https://file.kamacoder.com/pics/20240808162052.png) +![](https://file1.kamacoder.com/i/algo/20240808162052.png) 装满背包容量为0 的方法个数是1,即 放0件物品。 @@ -191,7 +191,7 @@ if (abs(target) > sum) return 0; // 此时没有方案 接下来 考虑 物品0 、物品1 和 物品2 ,如图: -![](https://file.kamacoder.com/pics/20240808162533.png) +![](https://file1.kamacoder.com/i/algo/20240808162533.png) 装满背包容量为0 的方法个数是1,即 放0件物品。 @@ -207,17 +207,17 @@ if (abs(target) > sum) return 0; // 此时没有方案 如图红色部分: -![](https://file.kamacoder.com/pics/20240808163312.png) +![](https://file1.kamacoder.com/i/algo/20240808163312.png) dp[2][2] = 3,即 放物品0 和 放物品1、放物品0 和 物品 2、放物品1 和 物品2, 如图所示,三种方法: -![](https://file.kamacoder.com/pics/20240826111946.png) +![](https://file1.kamacoder.com/i/algo/20240826111946.png) **容量为2 的背包,如果不放 物品2 有几种方法呢**? 有 dp[1][2] 种方法,即 背包容量为2,只考虑物品0 和 物品1 ,有 dp[1][2] 种方法,如图: -![](https://file.kamacoder.com/pics/20240826112805.png) +![](https://file1.kamacoder.com/i/algo/20240826112805.png) **容量为2 的背包, 如果放 物品2 有几种方法呢**? @@ -229,7 +229,7 @@ dp[2][2] = 3,即 放物品0 和 放物品1、放物品0 和 物品 2、放物 如图: -![](https://file.kamacoder.com/pics/20240826113043.png) +![](https://file1.kamacoder.com/i/algo/20240826113043.png) 有录友可能疑惑,这里计算的是放满 容量为2的背包 有几种方法,那物品2去哪了? @@ -239,7 +239,7 @@ dp[2][2] = 容量为2的背包不放物品2有几种方法 + 容量为2的背包 所以 dp[2][2] = dp[1][2] + dp[1][1] ,如图: -![](https://file.kamacoder.com/pics/20240826113258.png) +![](https://file1.kamacoder.com/i/algo/20240826113258.png) 以上过程,抽象化如下: @@ -266,11 +266,11 @@ else dp[i][j] = dp[i - 1][j] + dp[i - 1][j - nums[i]]; 先明确递推的方向,如图,求解 dp[2][2] 是由 上方和左上方推出。 -![](https://file.kamacoder.com/pics/20240826115800.png) +![](https://file1.kamacoder.com/i/algo/20240826115800.png) 那么二维数组的最上行 和 最左列一定要初始化,这是递推公式推导的基础,如图红色部分: -![](https://file.kamacoder.com/pics/20240827103507.png) +![](https://file1.kamacoder.com/i/algo/20240827103507.png) 关于dp[0][0]的值,在上面的递推公式讲解中已经讲过,装满背包容量为0 的方法数量是1,即 放0件物品。 @@ -323,7 +323,7 @@ for (int i = 0; i < nums.size(); i++) { 例如下图,如果上方没数值,左上方没数值,就无法推出 dp[2][2]。 -![](https://file.kamacoder.com/pics/20240827105427.png) +![](https://file1.kamacoder.com/i/algo/20240827105427.png) 那么是先 从上到下 ,再从左到右遍历,例如这样: @@ -349,11 +349,11 @@ for (int j = 0; j <= bagSize; j++) { // 列,遍历背包 这里我再画图讲一下,以求dp[2][2]为例,当先从上到下,再从左到右遍历,矩阵是这样: -![](https://file.kamacoder.com/pics/20240827110933.png) +![](https://file1.kamacoder.com/i/algo/20240827110933.png) 当先从左到右,再从上到下遍历,矩阵是这样: -![](https://file.kamacoder.com/pics/20240827111013.png) +![](https://file1.kamacoder.com/i/algo/20240827111013.png) 这里大家可以看出,无论是以上哪种遍历,都不影响 dp[2][2]的求值,用来 推导 dp[2][2] 的数值都在。 @@ -366,7 +366,7 @@ bagSize = (target + sum) / 2 = (3 + 5) / 2 = 4 dp数组状态变化如下: -![](https://file.kamacoder.com/pics/20240827111612.png) +![](https://file1.kamacoder.com/i/algo/20240827111612.png) 这么大的矩阵,我们是可以自己手动模拟出来的。 @@ -445,7 +445,7 @@ bagSize = (target + sum) / 2 = (3 + 5) / 2 = 4 dp数组状态变化如下: -![](https://file.kamacoder.com/pics/20210125120743274.jpg) +![](https://file1.kamacoder.com/i/algo/20210125120743274.jpg) 大家可以和 二维dp数组的打印结果做一下对比。 diff --git "a/problems/0496.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240I.md" "b/problems/0496.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240I.md" old mode 100644 new mode 100755 diff --git "a/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" "b/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" old mode 100644 new mode 100755 index 8cca8e65c8..457fd61d24 --- "a/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" +++ "b/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" @@ -23,7 +23,7 @@ 给定 BST [1,null,2,2], -![501. 二叉搜索树中的众数](https://file.kamacoder.com/pics/20201014221532206.png) +![501. 二叉搜索树中的众数](https://file1.kamacoder.com/i/algo/20201014221532206.png) 返回[2]. @@ -144,7 +144,7 @@ public: 如图: -![501.二叉搜索树中的众数1](https://file.kamacoder.com/pics/20210204152758889.png) +![501.二叉搜索树中的众数1](https://file1.kamacoder.com/i/algo/20210204152758889.png) 中序遍历代码如下: diff --git "a/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" "b/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" old mode 100644 new mode 100755 diff --git "a/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" "b/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" old mode 100644 new mode 100755 diff --git "a/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" "b/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" old mode 100644 new mode 100755 index 4098cb7bfb..03f076a2c9 --- "a/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" +++ "b/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" @@ -12,11 +12,11 @@ 示例 1: -![513.找树左下角的值](https://file.kamacoder.com/pics/20210204152956836.png) +![513.找树左下角的值](https://file1.kamacoder.com/i/algo/20210204152956836.png) 示例 2: -![513.找树左下角的值1](https://file.kamacoder.com/pics/20210204153017586.png) +![513.找树左下角的值1](https://file1.kamacoder.com/i/algo/20210204153017586.png) ## 算法公开课 diff --git "a/problems/0516.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\345\272\217\345\210\227.md" "b/problems/0516.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\345\272\217\345\210\227.md" old mode 100644 new mode 100755 index 5e456ac975..882c36bb05 --- "a/problems/0516.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0516.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\345\272\217\345\210\227.md" @@ -56,7 +56,7 @@ 如果s[i]与s[j]相同,那么dp[i][j] = dp[i + 1][j - 1] + 2; 如图: -![516.最长回文子序列](https://file.kamacoder.com/pics/20210127151350563.jpg) +![516.最长回文子序列](https://file1.kamacoder.com/i/algo/20210127151350563.jpg) (如果这里看不懂,回忆一下dp[i][j]的定义) @@ -68,7 +68,7 @@ 那么dp[i][j]一定是取最大的,即:dp[i][j] = max(dp[i + 1][j], dp[i][j - 1]); -![516.最长回文子序列1](https://file.kamacoder.com/pics/20210127151420476.jpg) +![516.最长回文子序列1](https://file1.kamacoder.com/i/algo/20210127151420476.jpg) 代码如下: @@ -97,7 +97,7 @@ for (int i = 0; i < s.size(); i++) dp[i][i] = 1; 从递归公式中,可以看出,dp[i][j] 依赖于 dp[i + 1][j - 1] ,dp[i + 1][j] 和 dp[i][j - 1],如图: -![](https://file.kamacoder.com/pics/20230102172155.png) +![](https://file1.kamacoder.com/i/algo/20230102172155.png) **所以遍历i的时候一定要从下到上遍历,这样才能保证下一行的数据是经过计算的**。 @@ -121,7 +121,7 @@ for (int i = s.size() - 1; i >= 0; i--) { 输入s:"cbbd" 为例,dp数组状态如图: -![516.最长回文子序列3](https://file.kamacoder.com/pics/20210127151521432.jpg) +![516.最长回文子序列3](https://file1.kamacoder.com/i/algo/20210127151521432.jpg) 红色框即:dp[0][s.size() - 1]; 为最终结果。 diff --git "a/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" "b/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" old mode 100644 new mode 100755 index 95122a7c95..7e4bbb9a81 --- "a/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" +++ "b/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" @@ -136,7 +136,7 @@ 那么二维数组的最上行 和 最左列一定要初始化,这是递推公式推导的基础,如图红色部分: -![](https://file.kamacoder.com/pics/20240827103507.png) +![](https://file1.kamacoder.com/i/algo/20240827103507.png) 这里首先要关注的就是 dp[0][0] 应该是多少? @@ -296,7 +296,7 @@ for (int j = 0; j <= amount; j++) { // 遍历背包容量 输入: amount = 5, coins = [1, 2, 5] ,dp状态图如下: -![518.零钱兑换II](https://file.kamacoder.com/pics/20210120181331461.jpg) +![518.零钱兑换II](https://file1.kamacoder.com/i/algo/20210120181331461.jpg) 最后红色框dp[amount]为最终结果。 diff --git "a/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" "b/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" old mode 100644 new mode 100755 index 466bd74479..a8eca862ef --- "a/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" +++ "b/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" @@ -13,7 +13,7 @@ 示例: -![530二叉搜索树的最小绝对差](https://file.kamacoder.com/pics/20201014223400123.png) +![530二叉搜索树的最小绝对差](https://file1.kamacoder.com/i/algo/20201014223400123.png) 提示:树中至少有 2 个节点。 @@ -70,7 +70,7 @@ public: 如图: -![530.二叉搜索树的最小绝对差](https://file.kamacoder.com/pics/20210204153247458.png) +![530.二叉搜索树的最小绝对差](https://file1.kamacoder.com/i/algo/20210204153247458.png) 一些同学不知道在递归中如何记录前一个节点的指针,其实实现起来是很简单的,大家只要看过一次,写过一次,就掌握了。 diff --git "a/problems/0538.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md" "b/problems/0538.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md" old mode 100644 new mode 100755 index 45bf1f96ed..c4bfeae4b8 --- "a/problems/0538.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md" +++ "b/problems/0538.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md" @@ -18,7 +18,7 @@ 示例 1: -![538.把二叉搜索树转换为累加树](https://file.kamacoder.com/pics/20201023160751832.png) +![538.把二叉搜索树转换为累加树](https://file1.kamacoder.com/i/algo/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] @@ -67,7 +67,7 @@ 遍历顺序如图所示: -![538.把二叉搜索树转换为累加树](https://file.kamacoder.com/pics/20210204153440666.png) +![538.把二叉搜索树转换为累加树](https://file1.kamacoder.com/i/algo/20210204153440666.png) 本题依然需要一个pre指针记录当前遍历节点cur的前一个节点,这样才方便做累加。 diff --git "a/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" "b/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" old mode 100644 new mode 100755 index 2bbe6cffae..d5ad95c112 --- "a/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" +++ "b/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" @@ -38,7 +38,7 @@ **所以当需要固定规律一段一段去处理字符串的时候,要想想在for循环的表达式上做做文章。** 性能如下: - + 那么这里具体反转的逻辑我们要不要使用库函数呢,其实用不用都可以,使用reverse来实现反转也没毛病,毕竟不是解题关键部分。 diff --git "a/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" "b/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" old mode 100644 new mode 100755 index 7f7d30f6a1..8208d9a1eb --- "a/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" +++ "b/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" @@ -81,7 +81,7 @@ for (int j = 0; j <= word2.size(); j++) dp[0][j] = j; 以word1:"sea",word2:"eat"为例,推导dp数组状态图如下: -![583.两个字符串的删除操作1](https://file.kamacoder.com/pics/20210714101750205.png) +![583.两个字符串的删除操作1](https://file1.kamacoder.com/i/algo/20210714101750205.png) 以上分析完毕,代码如下: diff --git "a/problems/0617.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md" "b/problems/0617.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md" old mode 100644 new mode 100755 index 755200fe82..3ca5feb9da --- "a/problems/0617.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0617.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md" @@ -13,7 +13,7 @@ 示例 1: -![617.合并二叉树](https://file.kamacoder.com/pics/20230310000854.png) +![617.合并二叉树](https://file1.kamacoder.com/i/algo/20230310000854.png) 注意: 合并必须从两个树的根节点开始。 @@ -38,7 +38,7 @@ 动画如下: -![617.合并二叉树](https://code-thinking.cdn.bcebos.com/gifs/617.%E5%90%88%E5%B9%B6%E4%BA%8C%E5%8F%89%E6%A0%91.gif) +![617.合并二叉树](https://file1.kamacoder.com/i/algo/617.%E5%90%88%E5%B9%B6%E4%BA%8C%E5%8F%89%E6%A0%91.gif) 那么我们来按照递归三部曲来解决: diff --git "a/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" "b/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" old mode 100644 new mode 100755 index 7282953570..fd2ae43886 --- "a/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" +++ "b/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" @@ -48,7 +48,7 @@ dp[i] 和 dp[i-1] ,dp[i + 1] 看上去都没啥关系。 所以我们要看回文串的性质。 如图: -![](https://file.kamacoder.com/pics/20230102170752.png) +![](https://file1.kamacoder.com/i/algo/20230102170752.png) 我们在判断字符串S是否是回文,那么如果我们知道 s[1],s[2],s[3] 这个子串是回文的,那么只需要比较 s[0]和s[4]这两个元素是否相同,如果相同的话,这个字符串s 就是回文串。 @@ -106,7 +106,7 @@ dp[i][j]可以初始化为true么? 当然不行,怎能刚开始就全都匹 dp[i + 1][j - 1] 在 dp[i][j]的左下角,如图: -![647.回文子串](https://file.kamacoder.com/pics/20210121171032473-20230310132134822.jpg) +![647.回文子串](https://file1.kamacoder.com/i/algo/20210121171032473-20230310132134822.jpg) 如果这矩阵是从上到下,从左到右遍历,那么会用到没有计算过的dp[i + 1][j - 1],也就是根据不确定是不是回文的区间[i+1,j-1],来判断了[i,j]是不是回文,那结果一定是不对的。 @@ -136,7 +136,7 @@ for (int i = s.size() - 1; i >= 0; i--) { // 注意遍历顺序 举例,输入:"aaa",dp[i][j]状态如下: -![647.回文子串1](https://file.kamacoder.com/pics/20210121171059951-20230310132153163.jpg) +![647.回文子串1](https://file1.kamacoder.com/i/algo/20210121171059951-20230310132153163.jpg) 图中有6个true,所以就是有6个回文子串。 diff --git "a/problems/0649.Dota2\345\217\202\350\256\256\351\231\242.md" "b/problems/0649.Dota2\345\217\202\350\256\256\351\231\242.md" old mode 100644 new mode 100755 diff --git "a/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" "b/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" old mode 100644 new mode 100755 index b8841a8bea..49ccc9cdea --- "a/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" @@ -17,7 +17,7 @@ 示例 : -![654.最大二叉树](https://file.kamacoder.com/pics/20210204154534796.png) +![654.最大二叉树](https://file1.kamacoder.com/i/algo/20210204154534796.png) 提示: @@ -32,7 +32,7 @@ 最大二叉树的构建过程如下: -![654.最大二叉树](https://code-thinking.cdn.bcebos.com/gifs/654.%E6%9C%80%E5%A4%A7%E4%BA%8C%E5%8F%89%E6%A0%91.gif) +![654.最大二叉树](https://file1.kamacoder.com/i/algo/654.%E6%9C%80%E5%A4%A7%E4%BA%8C%E5%8F%89%E6%A0%91.gif) 构造树一般采用的是前序遍历,因为先构造中间节点,然后递归构造左子树和右子树。 diff --git "a/problems/0657.\346\234\272\345\231\250\344\272\272\350\203\275\345\220\246\350\277\224\345\233\236\345\216\237\347\202\271.md" "b/problems/0657.\346\234\272\345\231\250\344\272\272\350\203\275\345\220\246\350\277\224\345\233\236\345\216\237\347\202\271.md" old mode 100644 new mode 100755 index 89993b6ff6..c1706df4fa --- "a/problems/0657.\346\234\272\345\231\250\344\272\272\350\203\275\345\220\246\350\277\224\345\233\236\345\216\237\347\202\271.md" +++ "b/problems/0657.\346\234\272\345\231\250\344\272\272\350\203\275\345\220\246\350\277\224\345\233\236\345\216\237\347\202\271.md" @@ -40,7 +40,7 @@ 最后判断一下x,y是否回到了(0, 0)位置就可以了。 如图所示: - + C++代码如下: diff --git "a/problems/0669.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0669.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" old mode 100644 new mode 100755 index f4ded2c4fb..dbcc6ed63d --- "a/problems/0669.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" +++ "b/problems/0669.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" @@ -14,9 +14,9 @@ 给定一个二叉搜索树,同时给定最小边界L 和最大边界 R。通过修剪二叉搜索树,使得所有节点的值在[L, R]中 (R>=L) 。你可能需要改变树的根节点,所以结果应当返回修剪好的二叉搜索树的新的根节点。 -![669.修剪二叉搜索树](https://file.kamacoder.com/pics/20201014173115788.png) +![669.修剪二叉搜索树](https://file1.kamacoder.com/i/algo/20201014173115788.png) -![669.修剪二叉搜索树1](https://file.kamacoder.com/pics/20201014173219142.png) +![669.修剪二叉搜索树1](https://file1.kamacoder.com/i/algo/20201014173219142.png) ## 算法公开课 @@ -50,7 +50,7 @@ public: 我们在重新关注一下第二个示例,如图: -![669.修剪二叉搜索树](https://file.kamacoder.com/pics/20210204155302751.png) +![669.修剪二叉搜索树](https://file1.kamacoder.com/i/algo/20210204155302751.png) **所以以上的代码是不可行的!** @@ -60,7 +60,7 @@ public: 在上图中我们发现节点0并不符合区间要求,那么将节点0的右孩子 节点2 直接赋给 节点3的左孩子就可以了(就是把节点0从二叉树中移除),如图: -![669.修剪二叉搜索树1](https://file.kamacoder.com/pics/20210204155327203.png) +![669.修剪二叉搜索树1](https://file1.kamacoder.com/i/algo/20210204155327203.png) 理解了最关键部分了我们再递归三部曲: @@ -127,7 +127,7 @@ return root; 在回顾一下上面的代码,针对下图中二叉树的情况: -![669.修剪二叉搜索树1](https://file.kamacoder.com/pics/20210204155327203-20230310120126738.png) +![669.修剪二叉搜索树1](https://file1.kamacoder.com/i/algo/20210204155327203-20230310120126738.png) 如下代码相当于把节点0的右孩子(节点2)返回给上一层, diff --git "a/problems/0673.\346\234\200\351\225\277\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227\347\232\204\344\270\252\346\225\260.md" "b/problems/0673.\346\234\200\351\225\277\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227\347\232\204\344\270\252\346\225\260.md" old mode 100644 new mode 100755 index 92009f5b76..9e61229abb --- "a/problems/0673.\346\234\200\351\225\277\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227\347\232\204\344\270\252\346\225\260.md" +++ "b/problems/0673.\346\234\200\351\225\277\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227\347\232\204\344\270\252\346\225\260.md" @@ -178,7 +178,7 @@ for (int i = 0; i < nums.size(); i++) { 输入:[1,3,5,4,7] -![673.最长递增子序列的个数](https://file.kamacoder.com/pics/20230310000656.png) +![673.最长递增子序列的个数](https://file1.kamacoder.com/i/algo/20230310000656.png) **如果代码写出来了,怎么改都通过不了,那么把dp和count打印出来看看对不对!** diff --git "a/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" "b/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" old mode 100644 new mode 100755 index 16bb2f1887..dae64a11ac --- "a/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" +++ "b/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" @@ -85,7 +85,7 @@ for (int i = 1; i < nums.size(); i++) { 已输入nums = [1,3,5,4,7]为例,dp数组状态如下: -![674.最长连续递增序列](https://file.kamacoder.com/pics/20210204103529742.jpg) +![674.最长连续递增序列](https://file1.kamacoder.com/i/algo/20210204103529742.jpg) **注意这里要取dp[i]里的最大值,所以dp[2]才是结果!** diff --git "a/problems/0684.\345\206\227\344\275\231\350\277\236\346\216\245.md" "b/problems/0684.\345\206\227\344\275\231\350\277\236\346\216\245.md" old mode 100644 new mode 100755 index 8a7234df52..2f939d0827 --- "a/problems/0684.\345\206\227\344\275\231\350\277\236\346\216\245.md" +++ "b/problems/0684.\345\206\227\344\275\231\350\277\236\346\216\245.md" @@ -12,7 +12,7 @@ 请找出一条可以删去的边,删除后可使得剩余部分是一个有着 n 个节点的树。如果有多个答案,则返回数组 edges 中最后出现的边。 -![](https://file.kamacoder.com/pics/20210727150215.png) +![](https://file1.kamacoder.com/i/algo/20210727150215.png) 提示: * n == edges.length @@ -85,7 +85,7 @@ void join(int u, int v) { 如图所示: -![](https://file.kamacoder.com/pics/20230604104720.png) +![](https://file1.kamacoder.com/i/algo/20230604104720.png) 节点A 和节点 B 不在同一个集合,那么就可以将两个 节点连在一起。 @@ -95,7 +95,7 @@ void join(int u, int v) { 如图所示: -![](https://file.kamacoder.com/pics/20230604104330.png) +![](https://file1.kamacoder.com/i/algo/20230604104330.png) 已经判断 节点A 和 节点B 在在同一个集合(同一个根),如果将 节点A 和 节点B 连在一起就一定会出现环。 diff --git "a/problems/0685.\345\206\227\344\275\231\350\277\236\346\216\245II.md" "b/problems/0685.\345\206\227\344\275\231\350\277\236\346\216\245II.md" old mode 100644 new mode 100755 index 66f7bfe1bc..27161d174c --- "a/problems/0685.\345\206\227\344\275\231\350\277\236\346\216\245II.md" +++ "b/problems/0685.\345\206\227\344\275\231\350\277\236\346\216\245II.md" @@ -16,9 +16,9 @@ 返回一条能删除的边,使得剩下的图是有 n 个节点的有根树。若有多个答案,返回最后出现在给定二维数组的答案。 -![](https://file.kamacoder.com/pics/20210727151057.png) +![](https://file1.kamacoder.com/i/algo/20210727151057.png) -![](https://file.kamacoder.com/pics/20210727151118.png) +![](https://file1.kamacoder.com/i/algo/20210727151118.png) 提示: @@ -38,7 +38,7 @@ 那么有如下三种情况,前两种情况是出现入度为2的点,如图: - + 且只有一个节点入度为2,为什么不看出度呢,出度没有意义,一棵树中随便一个父节点就有多个出度。 @@ -46,7 +46,7 @@ 如图: - + 首先先计算节点的入度,这里不少录友在计算入度的时候就搞蒙了,分不清 edges[i][j] 表示的都是什么。 diff --git "a/problems/0695.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" "b/problems/0695.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" old mode 100644 new mode 100755 index 972a999591..a63d2b0e06 --- "a/problems/0695.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" +++ "b/problems/0695.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" @@ -14,7 +14,7 @@ 计算并返回 grid 中最大的岛屿面积。如果没有岛屿,则返回面积为 0 。 -![](https://file.kamacoder.com/pics/20220729111528.png) +![](https://file1.kamacoder.com/i/algo/20220729111528.png) * 输入:grid = [[0,0,1,0,0,0,0,1,0,0,0,0,0],[0,0,0,0,0,0,0,1,1,1,0,0,0],[0,1,1,0,1,0,0,0,0,0,0,0,0],[0,1,0,0,1,1,0,0,1,0,1,0,0],[0,1,0,0,1,1,0,0,1,1,1,0,0],[0,0,0,0,0,0,0,0,0,0,1,0,0],[0,0,0,0,0,0,0,1,1,1,0,0,0],[0,0,0,0,0,0,0,1,1,0,0,0,0]] * 输出:6 @@ -27,7 +27,7 @@ 也就是说斜角度链接是不算了, 例如示例二,是三个岛屿,如图: -![图一](https://file.kamacoder.com/pics/20220726094200.png) +![图一](https://file1.kamacoder.com/i/algo/20220726094200.png) 这道题目也是 dfs bfs基础类题目,就是搜索每个岛屿上“1”的数量,然后取一个最大的。 diff --git "a/problems/0700.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\220\234\347\264\242.md" "b/problems/0700.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\220\234\347\264\242.md" old mode 100644 new mode 100755 index 0c373f615b..40777a67a2 --- "a/problems/0700.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\220\234\347\264\242.md" +++ "b/problems/0700.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\220\234\347\264\242.md" @@ -12,7 +12,7 @@ 例如, -![700.二叉搜索树中的搜索](https://file.kamacoder.com/pics/20210204155522476.png) +![700.二叉搜索树中的搜索](https://file1.kamacoder.com/i/algo/20210204155522476.png) 在上述示例中,如果要找的值是 5,但因为没有节点值为 5,我们应该返回 NULL。 @@ -124,7 +124,7 @@ public: 中间节点如果大于3就向左走,如果小于3就向右走,如图: -![二叉搜索树](https://file.kamacoder.com/pics/20200812190213280.png) +![二叉搜索树](https://file1.kamacoder.com/i/algo/20200812190213280.png) 所以迭代法代码如下: diff --git "a/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" "b/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" old mode 100644 new mode 100755 index 6ce9ef3371..fec287449c --- "a/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" +++ "b/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" @@ -12,7 +12,7 @@ 注意,可能存在多种有效的插入方式,只要树在插入后仍保持为二叉搜索树即可。 你可以返回任意有效的结果。 -![701.二叉搜索树中的插入操作](https://file.kamacoder.com/pics/20201019173259554.png) +![701.二叉搜索树中的插入操作](https://file1.kamacoder.com/i/algo/20201019173259554.png) 提示: @@ -33,7 +33,7 @@ 如下演示视频中可以看出:只要按照二叉搜索树的规则去遍历,遇到空节点就插入节点就可以了。 -![701.二叉搜索树中的插入操作](https://code-thinking.cdn.bcebos.com/gifs/701.%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91%E4%B8%AD%E7%9A%84%E6%8F%92%E5%85%A5%E6%93%8D%E4%BD%9C.gif) +![701.二叉搜索树中的插入操作](https://file1.kamacoder.com/i/algo/701.%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91%E4%B8%AD%E7%9A%84%E6%8F%92%E5%85%A5%E6%93%8D%E4%BD%9C.gif) 例如插入元素10 ,需要找到末尾节点插入便可,一样的道理来插入元素15,插入元素0,插入元素6,**需要调整二叉树的结构么? 并不需要。**。 diff --git "a/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" "b/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" old mode 100644 new mode 100755 index 0ce2f3b8a6..e529629492 --- "a/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" +++ "b/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" @@ -59,7 +59,7 @@ 例如在数组:1,2,3,4,7,9,10中查找元素2,如图所示: -![704.二分查找](https://file.kamacoder.com/pics/20210311153055723.jpg) +![704.二分查找](https://file1.kamacoder.com/i/algo/20210311153055723.jpg) 代码如下:(详细注释) @@ -102,7 +102,7 @@ public: 在数组:1,2,3,4,7,9,10中查找元素2,如图所示:(**注意和方法一的区别**) -![704.二分查找1](https://file.kamacoder.com/pics/20210311153123632.jpg) +![704.二分查找1](https://file1.kamacoder.com/i/algo/20210311153123632.jpg) 代码如下:(详细注释) diff --git "a/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" "b/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" old mode 100644 new mode 100755 index a2b2803b11..72e35f430f --- "a/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" +++ "b/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" @@ -20,7 +20,7 @@ * deleteAtIndex(index):如果索引 index 有效,则删除链表中的第 index 个节点。 -![707示例](https://file.kamacoder.com/pics/20200814200558953.png) +![707示例](https://file1.kamacoder.com/i/algo/20200814200558953.png) ## 算法公开课 @@ -35,10 +35,10 @@ 如果对链表的虚拟头结点不清楚,可以看这篇文章:[链表:听说用虚拟头节点会方便很多?](https://programmercarl.com/0203.移除链表元素.html) 删除链表节点: -![链表-删除节点](https://file.kamacoder.com/pics/20200806195114541.png) +![链表-删除节点](https://file1.kamacoder.com/i/algo/20200806195114541.png) 添加链表节点: -![链表-添加节点](https://file.kamacoder.com/pics/20200806195134331.png) +![链表-添加节点](https://file1.kamacoder.com/i/algo/20200806195134331.png) 这道题目设计链表的五个接口: * 获取链表第index个节点的数值 diff --git "a/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271.md" "b/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271.md" old mode 100644 new mode 100755 diff --git "a/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" "b/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" old mode 100644 new mode 100755 diff --git "a/problems/0718.\346\234\200\351\225\277\351\207\215\345\244\215\345\255\220\346\225\260\347\273\204.md" "b/problems/0718.\346\234\200\351\225\277\351\207\215\345\244\215\345\255\220\346\225\260\347\273\204.md" old mode 100644 new mode 100755 index b371bd857b..12384a57a7 --- "a/problems/0718.\346\234\200\351\225\277\351\207\215\345\244\215\345\255\220\346\225\260\347\273\204.md" +++ "b/problems/0718.\346\234\200\351\225\277\351\207\215\345\244\215\345\255\220\346\225\260\347\273\204.md" @@ -95,7 +95,7 @@ for (int i = 1; i <= nums1.size(); i++) { 拿示例1中,A: [1,2,3,2,1],B: [3,2,1,4,7]为例,画一个dp数组的状态变化,如下: -![718.最长重复子数组](https://file.kamacoder.com/pics/2021011215282060.jpg) +![718.最长重复子数组](https://file1.kamacoder.com/i/algo/2021011215282060.jpg) 以上五部曲分析完毕,C++代码如下: @@ -127,7 +127,7 @@ public: 在如下图中: -![718.最长重复子数组](https://file.kamacoder.com/pics/2021011215282060-20230310134554486.jpg) +![718.最长重复子数组](https://file1.kamacoder.com/i/algo/2021011215282060-20230310134554486.jpg) 我们可以看出dp[i][j]都是由dp[i - 1][j - 1]推出。那么压缩为一维数组,也就是dp[j]都是由dp[j - 1]推出。 diff --git "a/problems/0724.\345\257\273\346\211\276\346\225\260\347\273\204\347\232\204\344\270\255\345\277\203\347\264\242\345\274\225.md" "b/problems/0724.\345\257\273\346\211\276\346\225\260\347\273\204\347\232\204\344\270\255\345\277\203\347\264\242\345\274\225.md" old mode 100644 new mode 100755 diff --git "a/problems/0738.\345\215\225\350\260\203\351\200\222\345\242\236\347\232\204\346\225\260\345\255\227.md" "b/problems/0738.\345\215\225\350\260\203\351\200\222\345\242\236\347\232\204\346\225\260\345\255\227.md" old mode 100644 new mode 100755 diff --git "a/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" "b/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" old mode 100644 new mode 100755 index ed43cf141f..2ad7e6b79b --- "a/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" +++ "b/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" @@ -69,7 +69,7 @@ 首先先将第一个遍历元素加入单调栈 -![739.每日温度1](https://file.kamacoder.com/pics/20210219124434172.jpg) +![739.每日温度1](https://file1.kamacoder.com/i/algo/20210219124434172.jpg) --------- @@ -77,65 +77,65 @@ 我们要保持一个递增单调栈(从栈头到栈底),所以将T[0]弹出,T[1]加入,此时result数组可以记录了,result[0] = 1,即T[0]右面第一个比T[0]大的元素是T[1]。 -![739.每日温度2](https://file.kamacoder.com/pics/20210219124504299.jpg) +![739.每日温度2](https://file1.kamacoder.com/i/algo/20210219124504299.jpg) ----------- 加入T[2],同理,T[1]弹出 -![739.每日温度3](https://file.kamacoder.com/pics/20210219124527361.jpg) +![739.每日温度3](https://file1.kamacoder.com/i/algo/20210219124527361.jpg) ------- 加入T[3],T[3] < T[2] (当前遍历的元素T[i]小于栈顶元素T[st.top()]的情况),加T[3]加入单调栈。 -![739.每日温度4](https://file.kamacoder.com/pics/20210219124610761.jpg) +![739.每日温度4](https://file1.kamacoder.com/i/algo/20210219124610761.jpg) --------- 加入T[4],T[4] == T[3] (当前遍历的元素T[i]等于栈顶元素T[st.top()]的情况),此时依然要加入栈,不用计算距离,因为我们要求的是右面第一个大于本元素的位置,而不是大于等于! -![739.每日温度5](https://file.kamacoder.com/pics/20210219124633444.jpg) +![739.每日温度5](https://file1.kamacoder.com/i/algo/20210219124633444.jpg) --------- 加入T[5],T[5] > T[4] (当前遍历的元素T[i]大于栈顶元素T[st.top()]的情况),将T[4]弹出,同时计算距离,更新result -![739.每日温度6](https://file.kamacoder.com/pics/20210219124700567.jpg) +![739.每日温度6](https://file1.kamacoder.com/i/algo/20210219124700567.jpg) ---------- T[4]弹出之后, T[5] > T[3] (当前遍历的元素T[i]大于栈顶元素T[st.top()]的情况),将T[3]继续弹出,同时计算距离,更新result -![739.每日温度7](https://file.kamacoder.com/pics/20210219124726613.jpg) +![739.每日温度7](https://file1.kamacoder.com/i/algo/20210219124726613.jpg) ------- 直到发现T[5]小于T[st.top()],终止弹出,将T[5]加入单调栈 -![739.每日温度8](https://file.kamacoder.com/pics/20210219124807715.jpg) +![739.每日温度8](https://file1.kamacoder.com/i/algo/20210219124807715.jpg) ------- 加入T[6],同理,需要将栈里的T[5],T[2]弹出 -![739.每日温度9](https://file.kamacoder.com/pics/2021021912483374.jpg) +![739.每日温度9](https://file1.kamacoder.com/i/algo/2021021912483374.jpg) ------- 同理,继续弹出 -![739.每日温度10](https://file.kamacoder.com/pics/2021021912490098.jpg) +![739.每日温度10](https://file1.kamacoder.com/i/algo/2021021912490098.jpg) ------ 此时栈里只剩下了T[6] -![739.每日温度11](https://file.kamacoder.com/pics/20210219124930156.jpg) +![739.每日温度11](https://file1.kamacoder.com/i/algo/20210219124930156.jpg) ------------ 加入T[7], T[7] < T[6] 直接入栈,这就是最后的情况,result数组也更新完了。 -![739.每日温度12](https://file.kamacoder.com/pics/20210219124957216.jpg) +![739.每日温度12](https://file1.kamacoder.com/i/algo/20210219124957216.jpg) 此时有同学可能就疑惑了,那result[6] , result[7]怎么没更新啊,元素也一直在栈里。 diff --git "a/problems/0743.\347\275\221\347\273\234\345\273\266\350\277\237\346\227\266\351\227\264.md" "b/problems/0743.\347\275\221\347\273\234\345\273\266\350\277\237\346\227\266\351\227\264.md" index c8a8736151..40b699c18f 100644 --- "a/problems/0743.\347\275\221\347\273\234\345\273\266\350\277\237\346\227\266\351\227\264.md" +++ "b/problems/0743.\347\275\221\347\273\234\345\273\266\350\277\237\346\227\266\351\227\264.md" @@ -13,7 +13,7 @@ https://leetcode.cn/problems/network-delay-time/description/ 现在,从某个节点 K 发出一个信号。需要多久才能使所有节点都收到信号?如果不能使所有节点收到信号,返回 -1 。 -![](https://file.kamacoder.com/pics/20240229104105.png) +![](https://file1.kamacoder.com/i/algo/20240229104105.png) 提示: @@ -42,7 +42,7 @@ dijkstra算法:在有权图(权值非负数)中求从起点到其他节点 如本题示例中的图: -![](https://file.kamacoder.com/pics/20240125162647.png) +![](https://file1.kamacoder.com/i/algo/20240125162647.png) 起点(节点1)到终点(节点7) 的最短路径是 图中 标记绿线的部分。 @@ -88,7 +88,7 @@ minDist数组数值初始化为int最大值。 这里在强点一下 **minDist数组的含义:记录所有节点到源点的最短路径**,那么初始化的时候就应该初始为最大值,这样才能在后续出现最短路径的时候及时更新。 -![](https://file.kamacoder.com/pics/20240130115306.png) +![](https://file1.kamacoder.com/i/algo/20240130115306.png) (图中,max 表示默认值,节点0 不做处理,统一从下标1 开始计算,这样下标和节点数值统一, 方便大家理解,避免搞混) @@ -110,7 +110,7 @@ minDist数组数值初始化为int最大值。 3、更新非访问节点到源点的距离(即更新minDist数组) ,如图: -![](https://file.kamacoder.com/pics/20240130115421.png) +![](https://file1.kamacoder.com/i/algo/20240130115421.png) 更新 minDist数组,即:源点(节点1) 到 节点2 和 节点3的距离。 @@ -136,7 +136,7 @@ minDist数组数值初始化为int最大值。 3、更新非访问节点到源点的距离(即更新minDist数组) ,如图: -![](https://file.kamacoder.com/pics/20240130121240.png) +![](https://file1.kamacoder.com/i/algo/20240130121240.png) 更新 minDist数组,即:源点(节点1) 到 节点6 、 节点3 和 节点4的距离。 @@ -170,7 +170,7 @@ minDist数组数值初始化为int最大值。 3、更新非访问节点到源点的距离(即更新minDist数组) ,如图: -![](https://file.kamacoder.com/pics/20240130120434.png) +![](https://file1.kamacoder.com/i/algo/20240130120434.png) 由于节点3的加入,那么源点可以有新的路径链接到节点4 所以更新minDist数组: @@ -190,7 +190,7 @@ minDist数组数值初始化为int最大值。 3、更新非访问节点到源点的距离(即更新minDist数组) ,如图: -![](https://file.kamacoder.com/pics/20240201105335.png) +![](https://file1.kamacoder.com/i/algo/20240201105335.png) 由于节点4的加入,那么源点可以链接到节点5 所以更新minDist数组: @@ -210,7 +210,7 @@ minDist数组数值初始化为int最大值。 3、更新非访问节点到源点的距离(即更新minDist数组) ,如图: -![](https://file.kamacoder.com/pics/20240201110250.png) +![](https://file1.kamacoder.com/i/algo/20240201110250.png) 由于节点6的加入,那么源点可以链接到节点7 所以 更新minDist数组: @@ -230,7 +230,7 @@ minDist数组数值初始化为int最大值。 3、更新非访问节点到源点的距离(即更新minDist数组) ,如图: -![](https://file.kamacoder.com/pics/20240201110651.png) +![](https://file1.kamacoder.com/i/algo/20240201110651.png) 由于节点5的加入,那么源点有新的路径可以链接到节点7 所以 更新minDist数组: @@ -248,7 +248,7 @@ minDist数组数值初始化为int最大值。 3、更新非访问节点到源点的距离(即更新minDist数组) ,如图: -![](https://file.kamacoder.com/pics/20240201110920.png) +![](https://file1.kamacoder.com/i/algo/20240201110920.png) 节点7加入,但节点7到节点7的距离为0,所以 不用更新minDist数组 @@ -262,7 +262,7 @@ minDist数组数值初始化为int最大值。 路径如图: -![](https://file.kamacoder.com/pics/20240201111352.png) +![](https://file1.kamacoder.com/i/algo/20240201111352.png) 在上面的讲解中,每一步 我都是按照 dijkstra 三部曲来讲解的,理解了这三部曲,代码也就好懂的。 @@ -431,7 +431,7 @@ select:4 看一下这个图: (有负权值) -![](https://file.kamacoder.com/pics/20240227104334.png) +![](https://file1.kamacoder.com/i/algo/20240227104334.png) 节点1 到 节点5 的最短路径 应该是 节点1 -> 节点2 -> 节点3 -> 节点4 -> 节点5 @@ -441,7 +441,7 @@ select:4 初始化: -![](https://file.kamacoder.com/pics/20240227104801.png) +![](https://file1.kamacoder.com/i/algo/20240227104801.png) --------------- @@ -455,7 +455,7 @@ select:4 3、更新非访问节点到源点的距离(即更新minDist数组) ,如图: -![](https://file.kamacoder.com/pics/20240227110217.png) +![](https://file1.kamacoder.com/i/algo/20240227110217.png) 更新 minDist数组,即:源点(节点1) 到 节点2 和 节点3的距离。 @@ -474,7 +474,7 @@ select:4 3、更新非访问节点到源点的距离(即更新minDist数组) ,如图: -![](https://file.kamacoder.com/pics/20240227110330.png) +![](https://file1.kamacoder.com/i/algo/20240227110330.png) 由于节点3的加入,那么源点可以有新的路径链接到节点4 所以更新minDist数组: @@ -492,7 +492,7 @@ select:4 3、更新非访问节点到源点的距离(即更新minDist数组) ,如图: -![](https://file.kamacoder.com/pics/20240227110346.png) +![](https://file1.kamacoder.com/i/algo/20240227110346.png) 由于节点4的加入,那么源点可以有新的路径链接到节点5 所以更新minDist数组: @@ -510,7 +510,7 @@ select:4 3、更新非访问节点到源点的距离(即更新minDist数组) ,如图: -![](https://file.kamacoder.com/pics/20240227110405.png) +![](https://file1.kamacoder.com/i/algo/20240227110405.png) 节点5的加入,而节点5 没有链接其他节点, 所以不用更新minDist数组,仅标记节点5被访问过了 @@ -526,7 +526,7 @@ select:4 3、更新非访问节点到源点的距离(即更新minDist数组) ,如图: -![](https://file.kamacoder.com/pics/20240227110711.png) +![](https://file1.kamacoder.com/i/algo/20240227110711.png) -------------- @@ -654,7 +654,7 @@ for (int v = 1; v <= n; v++) { 如图: -![](https://file.kamacoder.com/pics/20240222110025.png) +![](https://file1.kamacoder.com/i/algo/20240222110025.png) 在一个 n (节点数)为8 的图中,就需要申请 8 * 8 这么大的空间,有一条双向边,即:grid[2][5] = 6,grid[5][2] = 6 @@ -678,7 +678,7 @@ for (int v = 1; v <= n; v++) { 邻接表的构造如图: -![](https://file.kamacoder.com/pics/20240223103713.png) +![](https://file1.kamacoder.com/i/algo/20240223103713.png) 这里表达的图是: @@ -763,7 +763,7 @@ vector> grid(n + 1); 不少录友,不知道 如何定义的数据结构,怎么表示邻接表的,我来给大家画一个图: -![](https://file.kamacoder.com/pics/20240223103713.png) +![](https://file1.kamacoder.com/i/algo/20240223103713.png) 图中邻接表表示: @@ -784,7 +784,7 @@ vector>> grid(n + 1); 举例来给大家展示 该代码表达的数据 如下: -![](https://file.kamacoder.com/pics/20240223103904.png) +![](https://file1.kamacoder.com/i/algo/20240223103904.png) * 节点1 指向 节点3 权值为 1 * 节点1 指向 节点5 权值为 2 @@ -907,7 +907,7 @@ for (int v = 1; v <= n; v++) { 再回顾一下邻接表的构造(数组 + 链表): -![](https://file.kamacoder.com/pics/20240223103713.png) +![](https://file1.kamacoder.com/i/algo/20240223103713.png) 假如 加入的cur 是节点 2, 那么 grid[2] 表示的就是图中第二行链表。 (grid数组的构造我们在 上面 「图的存储」中讲过) diff --git "a/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" "b/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" old mode 100644 new mode 100755 index 147c7bfba7..952d4d2ab7 --- "a/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" +++ "b/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" @@ -52,7 +52,7 @@ 请你计算并返回达到楼梯顶部的最低花费。 -![](https://file.kamacoder.com/pics/20221031170131.png) +![](https://file1.kamacoder.com/i/algo/20221031170131.png) ## 思路 @@ -112,7 +112,7 @@ dp[i - 2] 跳到 dp[i] 需要花费 dp[i - 2] + cost[i - 2]。 拿示例2:cost = [1, 100, 1, 1, 1, 100, 1, 1, 100, 1] ,来模拟一下dp数组的状态变化,如下: -![](https://file.kamacoder.com/pics/20221026175104.png) +![](https://file1.kamacoder.com/i/algo/20221026175104.png) 如果大家代码写出来有问题,就把dp数组打印出来,看看和如上推导的是不是一样的。 diff --git "a/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" "b/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" old mode 100644 new mode 100755 index daf52bea55..d17878381f --- "a/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" +++ "b/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" @@ -44,7 +44,7 @@ 如图: -![763.划分字母区间](https://file.kamacoder.com/pics/20201222191924417.png) +![763.划分字母区间](https://file1.kamacoder.com/i/algo/20201222191924417.png) 明白原理之后,代码并不复杂,如下: diff --git "a/problems/0787.K\347\253\231\344\270\255\350\275\254\345\206\205\346\234\200\344\276\277\345\256\234\347\232\204\350\210\252\347\217\255.md" "b/problems/0787.K\347\253\231\344\270\255\350\275\254\345\206\205\346\234\200\344\276\277\345\256\234\347\232\204\350\210\252\347\217\255.md" index 6133ac7733..fb58c14816 100644 --- "a/problems/0787.K\347\253\231\344\270\255\350\275\254\345\206\205\346\234\200\344\276\277\345\256\234\347\232\204\350\210\252\347\217\255.md" +++ "b/problems/0787.K\347\253\231\344\270\255\350\275\254\345\206\205\346\234\200\344\276\277\345\256\234\347\232\204\350\210\252\347\217\255.md" @@ -9,11 +9,11 @@ 现在给定所有的城市和航班,以及出发城市 src 和目的地 dst,你的任务是找到出一条最多经过 k 站中转的路线,使得从 src 到 dst 的 价格最便宜 ,并返回该价格。 如果不存在这样的路线,则输出 -1。 -![](https://file.kamacoder.com/pics/20240319103900.png) +![](https://file1.kamacoder.com/i/algo/20240319103900.png) -![](https://file.kamacoder.com/pics/20240319103919.png) +![](https://file1.kamacoder.com/i/algo/20240319103919.png) -![](https://file.kamacoder.com/pics/20240319104026.png) +![](https://file1.kamacoder.com/i/algo/20240319104026.png) ## 思路 diff --git "a/problems/0797.\346\211\200\346\234\211\345\217\257\350\203\275\347\232\204\350\267\257\345\276\204.md" "b/problems/0797.\346\211\200\346\234\211\345\217\257\350\203\275\347\232\204\350\267\257\345\276\204.md" old mode 100644 new mode 100755 index 639b6b2b3b..db4d249a15 --- "a/problems/0797.\346\211\200\346\234\211\345\217\257\350\203\275\347\232\204\350\267\257\345\276\204.md" +++ "b/problems/0797.\346\211\200\346\234\211\345\217\257\350\203\275\347\232\204\350\267\257\345\276\204.md" @@ -11,7 +11,7 @@ graph[i] 是一个从节点 i 可以访问的所有节点的列表(即从节点 i 到节点 graph[i][j]存在一条有向边)。 -![](https://file.kamacoder.com/pics/20221203135439.png) +![](https://file1.kamacoder.com/i/algo/20221203135439.png) 提示: @@ -96,7 +96,7 @@ path.push_back(graph[x][i]); // 遍历到的节点加入到路径中来 一些录友可以疑惑这里如果找到x 链接的节点的,例如如果x目前是节点0,那么目前的过程就是这样的: -![](https://file.kamacoder.com/pics/20221204111937.png) +![](https://file1.kamacoder.com/i/algo/20221204111937.png) 二维数组中,graph[x][i] 都是x链接的节点,当前遍历的节点就是 `graph[x][i]` 。 diff --git "a/problems/0827.\346\234\200\345\244\247\344\272\272\345\267\245\345\262\233.md" "b/problems/0827.\346\234\200\345\244\247\344\272\272\345\267\245\345\262\233.md" old mode 100644 new mode 100755 index e6aa4601dd..118735e943 --- "a/problems/0827.\346\234\200\345\244\247\344\272\272\345\267\245\345\262\233.md" +++ "b/problems/0827.\346\234\200\345\244\247\344\272\272\345\267\245\345\262\233.md" @@ -51,11 +51,11 @@ 拿如下地图的岛屿情况来举例: (1为陆地) -![](https://file.kamacoder.com/pics/20220829104834.png) +![](https://file1.kamacoder.com/i/algo/20220829104834.png) 第一步,则遍历题目,并将岛屿到编号和面积上的统计,过程如图所示: -![](https://file.kamacoder.com/pics/20220829105644.png) +![](https://file1.kamacoder.com/i/algo/20220829105644.png) 本过程代码如下: @@ -102,7 +102,7 @@ int largestIsland(vector>& grid) { 第二步过程如图所示: -![](https://file.kamacoder.com/pics/20220829105249.png) +![](https://file1.kamacoder.com/i/algo/20220829105249.png) 也就是遍历每一个0的方格,并统计其相邻岛屿面积,最后取一个最大值。 diff --git "a/problems/0841.\351\222\245\345\214\231\345\222\214\346\210\277\351\227\264.md" "b/problems/0841.\351\222\245\345\214\231\345\222\214\346\210\277\351\227\264.md" old mode 100644 new mode 100755 index 60180d2736..ffcf2fb919 --- "a/problems/0841.\351\222\245\345\214\231\345\222\214\346\210\277\351\227\264.md" +++ "b/problems/0841.\351\222\245\345\214\231\345\222\214\346\210\277\351\227\264.md" @@ -35,7 +35,7 @@ 图中给我的两个示例: `[[1],[2],[3],[]]` `[[1,3],[3,0,1],[2],[0]]`,画成对应的图如下: -![](https://file.kamacoder.com/pics/20220714101414.png) +![](https://file1.kamacoder.com/i/algo/20220714101414.png) 我们可以看出图1的所有节点都是链接的,而图二中,节点2 是孤立的。 @@ -48,7 +48,7 @@ 图3:[[5], [], [1, 3], [5]] ,如图: -![](https://file.kamacoder.com/pics/20220714102201.png) +![](https://file1.kamacoder.com/i/algo/20220714102201.png) 在图3中,大家可以发现,节点0只能到节点5,然后就哪也去不了了。 diff --git "a/problems/0844.\346\257\224\350\276\203\345\220\253\351\200\200\346\240\274\347\232\204\345\255\227\347\254\246\344\270\262.md" "b/problems/0844.\346\257\224\350\276\203\345\220\253\351\200\200\346\240\274\347\232\204\345\255\227\347\254\246\344\270\262.md" old mode 100644 new mode 100755 index f229447384..6d0cd68578 --- "a/problems/0844.\346\257\224\350\276\203\345\220\253\351\200\200\346\240\274\347\232\204\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/0844.\346\257\224\350\276\203\345\220\253\351\200\200\346\240\274\347\232\204\345\255\227\347\254\246\344\270\262.md" @@ -106,7 +106,7 @@ public: 动画如下: - + 如果S[i]和S[j]不相同返回false,如果有一个指针(i或者j)先走到的字符串头部位置,也返回false。 diff --git "a/problems/0860.\346\237\240\346\252\254\346\260\264\346\211\276\351\233\266.md" "b/problems/0860.\346\237\240\346\252\254\346\260\264\346\211\276\351\233\266.md" old mode 100644 new mode 100755 diff --git "a/problems/0922.\346\214\211\345\245\207\345\201\266\346\216\222\345\272\217\346\225\260\347\273\204II.md" "b/problems/0922.\346\214\211\345\245\207\345\201\266\346\216\222\345\272\217\346\225\260\347\273\204II.md" old mode 100644 new mode 100755 diff --git "a/problems/0925.\351\225\277\346\214\211\351\224\256\345\205\245.md" "b/problems/0925.\351\225\277\346\214\211\351\224\256\345\205\245.md" old mode 100644 new mode 100755 index 47465199a8..f653caef52 --- "a/problems/0925.\351\225\277\346\214\211\351\224\256\345\205\245.md" +++ "b/problems/0925.\351\225\277\346\214\211\351\224\256\345\205\245.md" @@ -52,7 +52,7 @@ 动画如下: - + 上面的逻辑想清楚了,不难写出如下C++代码: diff --git "a/problems/0941.\346\234\211\346\225\210\347\232\204\345\261\261\350\204\211\346\225\260\347\273\204.md" "b/problems/0941.\346\234\211\346\225\210\347\232\204\345\261\261\350\204\211\346\225\260\347\273\204.md" old mode 100644 new mode 100755 index d4165f3672..9f000e2bb5 --- "a/problems/0941.\346\234\211\346\225\210\347\232\204\345\261\261\350\204\211\346\225\260\347\273\204.md" +++ "b/problems/0941.\346\234\211\346\225\210\347\232\204\345\261\261\350\204\211\346\225\260\347\273\204.md" @@ -16,7 +16,7 @@ * arr[0] < arr[1] < ... arr[i-1] < arr[i] * arr[i] > arr[i+1] > ... > arr[arr.length - 1] -![](https://file.kamacoder.com/pics/20210729103604.png) +![](https://file1.kamacoder.com/i/algo/20210729103604.png) 示例 1: * 输入:arr = [2,1] @@ -37,7 +37,7 @@ 这样可以使用两个指针,left和right,让其按照如下规则移动,如图: - + **注意这里还是有一些细节,例如如下两点:** diff --git "a/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" "b/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" old mode 100644 new mode 100755 index d8c31ca998..989993acf5 --- "a/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" @@ -17,7 +17,7 @@ 示例 1: -![](https://file.kamacoder.com/pics/20201229175736596.png) +![](https://file1.kamacoder.com/i/algo/20201229175736596.png) * 输入:[0,0,null,0,0] * 输出:1 @@ -25,7 +25,7 @@ 示例 2: -![](https://file.kamacoder.com/pics/2020122917584449.png) +![](https://file1.kamacoder.com/i/algo/2020122917584449.png) * 输入:[0,0,null,0,null,0,null,null,0] * 输出:2 @@ -143,7 +143,7 @@ if (cur == NULL) return 2; 如图: -![968.监控二叉树2](https://file.kamacoder.com/pics/20201229203710729.png) +![968.监控二叉树2](https://file1.kamacoder.com/i/algo/20201229203710729.png) 代码如下: @@ -191,7 +191,7 @@ if (left == 1 || right == 1) return 2; **从这个代码中,可以看出,如果left == 1, right == 0 怎么办?其实这种条件在情况2中已经判断过了**,如图: -![968.监控二叉树1](https://file.kamacoder.com/pics/2020122920362355.png) +![968.监控二叉树1](https://file1.kamacoder.com/i/algo/2020122920362355.png) 这种情况也是大多数同学容易迷惑的情况。 @@ -199,7 +199,7 @@ if (left == 1 || right == 1) return 2; 以上都处理完了,递归结束之后,可能头结点 还有一个无覆盖的情况,如图: -![968.监控二叉树3](https://file.kamacoder.com/pics/20201229203742446.png) +![968.监控二叉树3](https://file1.kamacoder.com/i/algo/20201229203742446.png) 所以递归结束之后,还要判断根节点,如果没有覆盖,result++,代码如下: diff --git "a/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" "b/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" old mode 100644 new mode 100755 index 6e58be1af6..1f58fd5198 --- "a/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" +++ "b/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" @@ -61,7 +61,7 @@ public: 如动画所示: -![](https://code-thinking.cdn.bcebos.com/gifs/977.有序数组的平方.gif) +![](https://file1.kamacoder.com/i/algo/977.有序数组的平方.gif) 不难写出如下代码: diff --git "a/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md" "b/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md" old mode 100644 new mode 100755 index 3d7d8e0770..cbf5ecdb78 --- "a/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md" +++ "b/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md" @@ -53,7 +53,7 @@ words[i] 由小写英文字母组成 如图: -![1002.查找常用字符](https://code-thinking.cdn.bcebos.com/pics/1002.查找常用字符.png) +![1002.查找常用字符](https://file1.kamacoder.com/i/algo/1002.查找常用字符.png) 先统计第一个字符串所有字符出现的次数,代码如下: diff --git "a/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" "b/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" old mode 100644 new mode 100755 diff --git "a/problems/1020.\351\243\236\345\234\260\347\232\204\346\225\260\351\207\217.md" "b/problems/1020.\351\243\236\345\234\260\347\232\204\346\225\260\351\207\217.md" old mode 100644 new mode 100755 index ae6b3895fa..396e6c566b --- "a/problems/1020.\351\243\236\345\234\260\347\232\204\346\225\260\351\207\217.md" +++ "b/problems/1020.\351\243\236\345\234\260\347\232\204\346\225\260\351\207\217.md" @@ -12,13 +12,13 @@ 返回网格中 无法 在任意次数的移动中离开网格边界的陆地单元格的数量。 -![](https://file.kamacoder.com/pics/20220830100710.png) +![](https://file1.kamacoder.com/i/algo/20220830100710.png) * 输入:grid = [[0,0,0,0],[1,0,1,0],[0,1,1,0],[0,0,0,0]] * 输出:3 * 解释:有三个 1 被 0 包围。一个 1 没有被包围,因为它在边界上。 -![](https://file.kamacoder.com/pics/20220830100742.png) +![](https://file1.kamacoder.com/i/algo/20220830100742.png) * 输入:grid = [[0,1,1,0],[0,0,1,0],[0,0,1,0],[0,0,0,0]] * 输出:0 @@ -32,11 +32,11 @@ 如图,在遍历地图周围四个边,靠地图四边的陆地,都为绿色, -![](https://file.kamacoder.com/pics/20220830104632.png) +![](https://file1.kamacoder.com/i/algo/20220830104632.png) 在遇到地图周边陆地的时候,将1都变为0,此时地图为这样: -![](https://file.kamacoder.com/pics/20220830104651.png) +![](https://file1.kamacoder.com/i/algo/20220830104651.png) 然后我们再去遍历这个地图,遇到有陆地的地方,去采用深搜或者广搜,边统计所有陆地。 diff --git "a/problems/1035.\344\270\215\347\233\270\344\272\244\347\232\204\347\272\277.md" "b/problems/1035.\344\270\215\347\233\270\344\272\244\347\232\204\347\272\277.md" old mode 100644 new mode 100755 index 0119df82ea..16bf869ea6 --- "a/problems/1035.\344\270\215\347\233\270\344\272\244\347\232\204\347\272\277.md" +++ "b/problems/1035.\344\270\215\347\233\270\344\272\244\347\232\204\347\272\277.md" @@ -18,7 +18,7 @@ 以这种方法绘制线条,并返回可以绘制的最大连线数。 -![1035.不相交的线](https://file.kamacoder.com/pics/2021032116363533.png) +![1035.不相交的线](https://file1.kamacoder.com/i/algo/2021032116363533.png) ## 算法公开课 @@ -36,7 +36,7 @@ 拿示例一nums1 = [1,4,2], nums2 = [1,2,4]为例,相交情况如图: -![](https://file.kamacoder.com/pics/20210914145158.png) +![](https://file1.kamacoder.com/i/algo/20210914145158.png) 其实也就是说nums1和nums2的最长公共子序列是[1,4],长度为2。 这个公共子序列指的是相对顺序不变(即数字4在字符串nums1中数字1的后面,那么数字4也应该在字符串nums2数字1的后面) diff --git "a/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" "b/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" old mode 100644 new mode 100755 index 01d33fbff7..36702194be --- "a/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" +++ "b/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" @@ -46,7 +46,7 @@ 然后再去做对应的消除操作。 如动画所示: -![1047.删除字符串中的所有相邻重复项](https://code-thinking.cdn.bcebos.com/gifs/1047.删除字符串中的所有相邻重复项.gif) +![1047.删除字符串中的所有相邻重复项](https://file1.kamacoder.com/i/algo/1047.删除字符串中的所有相邻重复项.gif) 从栈中弹出剩余元素,此时是字符串ac,因为从栈里弹出的元素是倒序的,所以再对字符串进行反转一下,就得到了最终的结果。 diff --git "a/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" "b/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" old mode 100644 new mode 100755 index 6dfba4ed44..ddc9f313db --- "a/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" +++ "b/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" @@ -114,7 +114,7 @@ for (int i = 0; i < stones.size(); i++) { // 遍历物品 举例,输入:[2,4,1,1],此时target = (2 + 4 + 1 + 1)/2 = 4 ,dp数组状态图如下: -![1049.最后一块石头的重量II](https://file.kamacoder.com/pics/20210121115805904.jpg) +![1049.最后一块石头的重量II](https://file1.kamacoder.com/i/algo/20210121115805904.jpg) 最后dp[target]里是容量为target的背包所能背的最大重量。 diff --git "a/problems/1143.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" "b/problems/1143.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" old mode 100644 new mode 100755 index 91c29b8313..424f403938 --- "a/problems/1143.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/1143.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" @@ -94,7 +94,7 @@ vector> dp(text1.size() + 1, vector(text2.size() + 1, 0)); 从递推公式,可以看出,有三个方向可以推出dp[i][j],如图: -![1143.最长公共子序列](https://file.kamacoder.com/pics/20210204115139616.jpg) +![1143.最长公共子序列](https://file1.kamacoder.com/i/algo/20210204115139616.jpg) 那么为了在递推的过程中,这三个方向都是经过计算的数值,所以要从前向后,从上到下来遍历这个矩阵。 @@ -103,7 +103,7 @@ vector> dp(text1.size() + 1, vector(text2.size() + 1, 0)); 以输入:text1 = "abcde", text2 = "ace" 为例,dp状态如图: -![1143.最长公共子序列1](https://file.kamacoder.com/pics/20210210150215918.jpg) +![1143.最长公共子序列1](https://file1.kamacoder.com/i/algo/20210210150215918.jpg) 最后红框dp[text1.size()][text2.size()]为最终结果 diff --git "a/problems/1207.\347\213\254\344\270\200\346\227\240\344\272\214\347\232\204\345\207\272\347\216\260\346\254\241\346\225\260.md" "b/problems/1207.\347\213\254\344\270\200\346\227\240\344\272\214\347\232\204\345\207\272\347\216\260\346\254\241\346\225\260.md" old mode 100644 new mode 100755 index fbb19af773..72462f1119 --- "a/problems/1207.\347\213\254\344\270\200\346\227\240\344\272\214\347\232\204\345\207\272\347\216\260\346\254\241\346\225\260.md" +++ "b/problems/1207.\347\213\254\344\270\200\346\227\240\344\272\214\347\232\204\345\207\272\347\216\260\346\254\241\346\225\260.md" @@ -45,7 +45,7 @@ 如图所示: - + C++代码如下: diff --git "a/problems/1221.\345\210\206\345\211\262\345\271\263\350\241\241\345\255\227\347\254\246\344\270\262.md" "b/problems/1221.\345\210\206\345\211\262\345\271\263\350\241\241\345\255\227\347\254\246\344\270\262.md" old mode 100644 new mode 100755 diff --git "a/problems/1254.\347\273\237\350\256\241\345\260\201\351\227\255\345\262\233\345\261\277\347\232\204\346\225\260\347\233\256.md" "b/problems/1254.\347\273\237\350\256\241\345\260\201\351\227\255\345\262\233\345\261\277\347\232\204\346\225\260\347\233\256.md" old mode 100644 new mode 100755 index ebea30e34f..b440c32648 --- "a/problems/1254.\347\273\237\350\256\241\345\260\201\351\227\255\345\262\233\345\261\277\347\232\204\346\225\260\347\233\256.md" +++ "b/problems/1254.\347\273\237\350\256\241\345\260\201\351\227\255\345\262\233\345\261\277\347\232\204\346\225\260\347\233\256.md" @@ -10,13 +10,13 @@ 请返回 封闭岛屿 的数目。 -![](https://file.kamacoder.com/pics/20220830111533.png) +![](https://file1.kamacoder.com/i/algo/20220830111533.png) * 输入:grid = [[1,1,1,1,1,1,1,0],[1,0,0,0,0,1,1,0],[1,0,1,0,1,1,1,0],[1,0,0,0,0,1,0,1],[1,1,1,1,1,1,1,0]] * 输出:2 * 解释:灰色区域的岛屿是封闭岛屿,因为这座岛屿完全被水域包围(即被 1 区域包围)。 -![](https://file.kamacoder.com/pics/20220830111601.png) +![](https://file1.kamacoder.com/i/algo/20220830111601.png) * 输入:grid = [[0,0,1,0,0],[0,1,0,1,0],[0,1,1,1,0]] * 输出:1 diff --git "a/problems/1356.\346\240\271\346\215\256\346\225\260\345\255\227\344\272\214\350\277\233\345\210\266\344\270\2131\347\232\204\346\225\260\347\233\256\346\216\222\345\272\217.md" "b/problems/1356.\346\240\271\346\215\256\346\225\260\345\255\227\344\272\214\350\277\233\345\210\266\344\270\2131\347\232\204\346\225\260\347\233\256\346\216\222\345\272\217.md" old mode 100644 new mode 100755 index 0ae1603494..11f947a184 --- "a/problems/1356.\346\240\271\346\215\256\346\225\260\345\255\227\344\272\214\350\277\233\345\210\266\344\270\2131\347\232\204\346\225\260\347\233\256\346\216\222\345\272\217.md" +++ "b/problems/1356.\346\240\271\346\215\256\346\225\260\345\255\227\344\272\214\350\277\233\345\210\266\344\270\2131\347\232\204\346\225\260\347\233\256\346\216\222\345\272\217.md" @@ -81,7 +81,7 @@ int bitCount(int n) { ``` 以计算12的二进制1的数量为例,如图所示: - + 下面我就使用方法二,来做这道题目: diff --git "a/problems/1365.\346\234\211\345\244\232\345\260\221\345\260\217\344\272\216\345\275\223\345\211\215\346\225\260\345\255\227\347\232\204\346\225\260\345\255\227.md" "b/problems/1365.\346\234\211\345\244\232\345\260\221\345\260\217\344\272\216\345\275\223\345\211\215\346\225\260\345\255\227\347\232\204\346\225\260\345\255\227.md" old mode 100644 new mode 100755 index 2cb73f728a..61b548abf8 --- "a/problems/1365.\346\234\211\345\244\232\345\260\221\345\260\217\344\272\216\345\275\223\345\211\215\346\225\260\345\255\227\347\232\204\346\225\260\345\255\227.md" +++ "b/problems/1365.\346\234\211\345\244\232\345\260\221\345\260\217\344\272\216\345\275\223\345\211\215\346\225\260\345\255\227\347\232\204\346\225\260\345\255\227.md" @@ -85,7 +85,7 @@ for (int i = 0; i < nums.size(); i++) { 流程如图: - + 关键地方讲完了,整体C++代码如下: diff --git "a/problems/1382.\345\260\206\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\345\217\230\345\271\263\350\241\241.md" "b/problems/1382.\345\260\206\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\345\217\230\345\271\263\350\241\241.md" old mode 100644 new mode 100755 index 7b0d32048a..551766ff0d --- "a/problems/1382.\345\260\206\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\345\217\230\345\271\263\350\241\241.md" +++ "b/problems/1382.\345\260\206\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\345\217\230\345\271\263\350\241\241.md" @@ -15,7 +15,7 @@ 示例: -![](https://file.kamacoder.com/pics/20210726154512.png) +![](https://file1.kamacoder.com/i/algo/20210726154512.png) * 输入:root = [1,null,2,null,3,null,4,null,null] * 输出:[2,1,3,null,null,null,4] diff --git "a/problems/1791.\346\211\276\345\207\272\346\230\237\345\236\213\345\233\276\347\232\204\344\270\255\345\277\203\350\212\202\347\202\271.md" "b/problems/1791.\346\211\276\345\207\272\346\230\237\345\236\213\345\233\276\347\232\204\344\270\255\345\277\203\350\212\202\347\202\271.md" old mode 100644 new mode 100755 index 5dd56c65d9..9991249f5a --- "a/problems/1791.\346\211\276\345\207\272\346\230\237\345\236\213\345\233\276\347\232\204\344\270\255\345\277\203\350\212\202\347\202\271.md" +++ "b/problems/1791.\346\211\276\345\207\272\346\230\237\345\236\213\345\233\276\347\232\204\344\270\255\345\277\203\350\212\202\347\202\271.md" @@ -10,7 +10,7 @@ 什么是度,可以理解为,链接节点的边的数量。 题目中度如图所示: -![1791.找出星型图的中心节点](https://file.kamacoder.com/pics/20220704113207.png) +![1791.找出星型图的中心节点](https://file1.kamacoder.com/i/algo/20220704113207.png) 至于出度和入度,那就是在有向图里的概念了,本题是无向图。 diff --git "a/problems/1971.\345\257\273\346\211\276\345\233\276\344\270\255\346\230\257\345\220\246\345\255\230\345\234\250\350\267\257\345\276\204.md" "b/problems/1971.\345\257\273\346\211\276\345\233\276\344\270\255\346\230\257\345\220\246\345\255\230\345\234\250\350\267\257\345\276\204.md" old mode 100644 new mode 100755 index 33b48698b5..9048b0f6af --- "a/problems/1971.\345\257\273\346\211\276\345\233\276\344\270\255\346\230\257\345\220\246\345\255\230\345\234\250\350\267\257\345\276\204.md" +++ "b/problems/1971.\345\257\273\346\211\276\345\233\276\344\270\255\346\230\257\345\220\246\345\255\230\345\234\250\350\267\257\345\276\204.md" @@ -12,7 +12,7 @@ 给你数组 edges 和整数 n、start 和 end,如果从 start 到 end 存在 有效路径 ,则返回 true,否则返回 false 。 -![](https://file.kamacoder.com/pics/20220705101442.png) +![](https://file1.kamacoder.com/i/algo/20220705101442.png) diff --git "a/problems/O(n)\347\232\204\347\256\227\346\263\225\345\261\205\347\204\266\350\266\205\346\227\266\344\272\206\357\274\214\346\255\244\346\227\266\347\232\204n\347\251\266\347\253\237\346\230\257\345\244\232\345\244\247\357\274\237.md" "b/problems/O(n)\347\232\204\347\256\227\346\263\225\345\261\205\347\204\266\350\266\205\346\227\266\344\272\206\357\274\214\346\255\244\346\227\266\347\232\204n\347\251\266\347\253\237\346\230\257\345\244\232\345\244\247\357\274\237.md" index 830bba7e2a..d74f1a01aa 100644 --- "a/problems/O(n)\347\232\204\347\256\227\346\263\225\345\261\205\347\204\266\350\266\205\346\227\266\344\272\206\357\274\214\346\255\244\346\227\266\347\232\204n\347\251\266\347\253\237\346\230\257\345\244\232\345\244\247\357\274\237.md" +++ "b/problems/O(n)\347\232\204\347\256\227\346\263\225\345\261\205\347\204\266\350\266\205\346\227\266\344\272\206\357\274\214\346\255\244\346\227\266\347\232\204n\347\251\266\347\253\237\346\230\257\345\244\232\345\244\247\357\274\237.md" @@ -13,7 +13,7 @@ ## 超时是怎么回事 -![程序超时](https://file.kamacoder.com/pics/20200729112716117.png) +![程序超时](https://file1.kamacoder.com/i/algo/20200729112716117.png) 大家在leetcode上练习算法的时候应该都遇到过一种错误是“超时”。 @@ -129,11 +129,11 @@ int main() { 来看一下运行的效果,如下图: -![程序超时2](https://file.kamacoder.com/pics/20200729200018460.png) +![程序超时2](https://file1.kamacoder.com/i/algo/20200729200018460.png) O(n)的算法,1s内大概计算机可以运行 5 * (10^8)次计算,可以推测一下O(n^2) 的算法应该1s可以处理的数量级的规模是 5 * (10^8)开根号,实验数据如下。 -![程序超时3](https://file.kamacoder.com/pics/2020072919590970.png) +![程序超时3](https://file1.kamacoder.com/i/algo/2020072919590970.png) O(n^2)的算法,1s内大概计算机可以运行 22500次计算,验证了刚刚的推测。 @@ -141,7 +141,7 @@ O(n^2)的算法,1s内大概计算机可以运行 22500次计算,验证了刚 理论上应该是比 O(n)少一个数量级,因为logn的复杂度 其实是很快,看一下实验数据。 -![程序超时4](https://file.kamacoder.com/pics/20200729195729407.png) +![程序超时4](https://file1.kamacoder.com/i/algo/20200729195729407.png) O(nlogn)的算法,1s内大概计算机可以运行 2 * (10^7)次计算,符合预期。 @@ -149,7 +149,7 @@ O(nlogn)的算法,1s内大概计算机可以运行 2 * (10^7)次计算,符 **整体测试数据整理如下:** -![程序超时1](https://file.kamacoder.com/pics/20201208231559175.png) +![程序超时1](https://file1.kamacoder.com/i/algo/20201208231559175.png) 至于O(log n)和O(n^3) 等等这些时间复杂度在1s内可以处理的多大的数据规模,大家可以自己写一写代码去测一下了。 diff --git "a/problems/kamacoder/0044.\345\274\200\345\217\221\345\225\206\350\264\255\344\271\260\345\234\237\345\234\260.md" "b/problems/kamacoder/0044.\345\274\200\345\217\221\345\225\206\350\264\255\344\271\260\345\234\237\345\234\260.md" index 64804842f2..cb5fbb7468 100644 --- "a/problems/kamacoder/0044.\345\274\200\345\217\221\345\225\206\350\264\255\344\271\260\345\234\237\345\234\260.md" +++ "b/problems/kamacoder/0044.\345\274\200\345\217\221\345\225\206\350\264\255\344\271\260\345\234\237\345\234\260.md" @@ -613,3 +613,4 @@ func main() { } ``` +
diff --git "a/problems/kamacoder/0047.\345\217\202\344\274\232dijkstra\345\240\206.md" "b/problems/kamacoder/0047.\345\217\202\344\274\232dijkstra\345\240\206.md" index e361e8e0d9..80d7851eaf 100644 --- "a/problems/kamacoder/0047.\345\217\202\344\274\232dijkstra\345\240\206.md" +++ "b/problems/kamacoder/0047.\345\217\202\344\274\232dijkstra\345\240\206.md" @@ -46,13 +46,13 @@ 如下图所示,起始车站为 1 号车站,终点车站为 7 号车站,绿色路线为最短的路线,路线总长度为 12,则输出 12。 -![](https://file.kamacoder.com/pics/20240227101345.png) +![](https://file1.kamacoder.com/i/algo/20240227101345.png) 不能到达的情况: 如下图所示,当从起始车站不能到达终点车站时,则输出 -1。 -![](https://file.kamacoder.com/pics/20240227101401.png) +![](https://file1.kamacoder.com/i/algo/20240227101401.png) 数据范围: @@ -101,7 +101,7 @@ 如图: -![](https://file.kamacoder.com/pics/20240222110025.png) +![](https://file1.kamacoder.com/i/algo/20240222110025.png) 在一个 n (节点数)为8 的图中,就需要申请 8 * 8 这么大的空间,有一条双向边,即:grid[2][5] = 6,grid[5][2] = 6 @@ -125,7 +125,7 @@ 邻接表的构造如图: -![](https://file.kamacoder.com/pics/20240223103713.png) +![](https://file1.kamacoder.com/i/algo/20240223103713.png) 这里表达的图是: @@ -210,7 +210,7 @@ vector> grid(n + 1); 不少录友,不知道 如何定义的数据结构,怎么表示邻接表的,我来给大家画一个图: -![](https://file.kamacoder.com/pics/20240223103713.png) +![](https://file1.kamacoder.com/i/algo/20240223103713.png) 图中邻接表表示: @@ -231,7 +231,7 @@ vector>> grid(n + 1); 举例来给大家展示 该代码表达的数据 如下: -![](https://file.kamacoder.com/pics/20240223103904.png) +![](https://file1.kamacoder.com/i/algo/20240223103904.png) * 节点1 指向 节点3 权值为 1 * 节点1 指向 节点5 权值为 2 @@ -354,7 +354,7 @@ for (int v = 1; v <= n; v++) { 再回顾一下邻接表的构造(数组 + 链表): -![](https://file.kamacoder.com/pics/20240223103713.png) +![](https://file1.kamacoder.com/i/algo/20240223103713.png) 假如 加入的cur 是节点 2, 那么 grid[2] 表示的就是图中第二行链表。 (grid数组的构造我们在 上面 「图的存储」中讲过) @@ -927,3 +927,4 @@ func main() { ### C +
diff --git "a/problems/kamacoder/0047.\345\217\202\344\274\232dijkstra\346\234\264\347\264\240.md" "b/problems/kamacoder/0047.\345\217\202\344\274\232dijkstra\346\234\264\347\264\240.md" index 1ff9f1a874..42099df92a 100644 --- "a/problems/kamacoder/0047.\345\217\202\344\274\232dijkstra\346\234\264\347\264\240.md" +++ "b/problems/kamacoder/0047.\345\217\202\344\274\232dijkstra\346\234\264\347\264\240.md" @@ -46,13 +46,13 @@ 如下图所示,起始车站为 1 号车站,终点车站为 7 号车站,绿色路线为最短的路线,路线总长度为 12,则输出 12。 -![](https://file.kamacoder.com/pics/20240227101345.png) +![](https://file1.kamacoder.com/i/algo/20240227101345.png) 不能到达的情况: 如下图所示,当从起始车站不能到达终点车站时,则输出 -1。 -![](https://file.kamacoder.com/pics/20240227101401.png) +![](https://file1.kamacoder.com/i/algo/20240227101401.png) 数据范围: @@ -76,7 +76,7 @@ dijkstra算法:在有权图(权值非负数)中求从起点到其他节点 如本题示例中的图: -![](https://file.kamacoder.com/pics/20240125162647.png) +![](https://file1.kamacoder.com/i/algo/20240125162647.png) 起点(节点1)到终点(节点7) 的最短路径是 图中 标记绿线的部分。 @@ -122,7 +122,7 @@ minDist数组数值初始化为int最大值。 这里在强点一下 **minDist数组的含义:记录所有节点到源点的最短路径**,那么初始化的时候就应该初始为最大值,这样才能在后续出现最短路径的时候及时更新。 -![](https://file.kamacoder.com/pics/20240130115306.png) +![](https://file1.kamacoder.com/i/algo/20240130115306.png) (图中,max 表示默认值,节点0 不做处理,统一从下标1 开始计算,这样下标和节点数值统一, 方便大家理解,避免搞混) @@ -144,7 +144,7 @@ minDist数组数值初始化为int最大值。 3、更新非访问节点到源点的距离(即更新minDist数组) ,如图: -![](https://file.kamacoder.com/pics/20240130115421.png) +![](https://file1.kamacoder.com/i/algo/20240130115421.png) 更新 minDist数组,即:源点(节点1) 到 节点2 和 节点3的距离。 @@ -170,7 +170,7 @@ minDist数组数值初始化为int最大值。 3、更新非访问节点到源点的距离(即更新minDist数组) ,如图: -![](https://file.kamacoder.com/pics/20240130121240.png) +![](https://file1.kamacoder.com/i/algo/20240130121240.png) 更新 minDist数组,即:源点(节点1) 到 节点6 、 节点3 和 节点4的距离。 @@ -204,7 +204,7 @@ minDist数组数值初始化为int最大值。 3、更新非访问节点到源点的距离(即更新minDist数组) ,如图: -![](https://file.kamacoder.com/pics/20240130120434.png) +![](https://file1.kamacoder.com/i/algo/20240130120434.png) 由于节点3的加入,那么源点可以有新的路径链接到节点4 所以更新minDist数组: @@ -224,7 +224,7 @@ minDist数组数值初始化为int最大值。 3、更新非访问节点到源点的距离(即更新minDist数组) ,如图: -![](https://file.kamacoder.com/pics/20240201105335.png) +![](https://file1.kamacoder.com/i/algo/20240201105335.png) 由于节点4的加入,那么源点可以链接到节点5 所以更新minDist数组: @@ -244,7 +244,7 @@ minDist数组数值初始化为int最大值。 3、更新非访问节点到源点的距离(即更新minDist数组) ,如图: -![](https://file.kamacoder.com/pics/20240201110250.png) +![](https://file1.kamacoder.com/i/algo/20240201110250.png) 由于节点6的加入,那么源点可以链接到节点7 所以 更新minDist数组: @@ -264,7 +264,7 @@ minDist数组数值初始化为int最大值。 3、更新非访问节点到源点的距离(即更新minDist数组) ,如图: -![](https://file.kamacoder.com/pics/20240201110651.png) +![](https://file1.kamacoder.com/i/algo/20240201110651.png) 由于节点5的加入,那么源点有新的路径可以链接到节点7 所以 更新minDist数组: @@ -282,7 +282,7 @@ minDist数组数值初始化为int最大值。 3、更新非访问节点到源点的距离(即更新minDist数组) ,如图: -![](https://file.kamacoder.com/pics/20240201110920.png) +![](https://file1.kamacoder.com/i/algo/20240201110920.png) 节点7加入,但节点7到节点7的距离为0,所以 不用更新minDist数组 @@ -296,7 +296,7 @@ minDist数组数值初始化为int最大值。 路径如图: -![](https://file.kamacoder.com/pics/20240201111352.png) +![](https://file1.kamacoder.com/i/algo/20240201111352.png) 在上面的讲解中,每一步 我都是按照 dijkstra 三部曲来讲解的,理解了这三部曲,代码也就好懂的。 @@ -541,7 +541,7 @@ int main() { 对应如图: -![](https://file.kamacoder.com/pics/20240201111352.png) +![](https://file1.kamacoder.com/i/algo/20240201111352.png) ### 出现负数 @@ -549,7 +549,7 @@ int main() { 看一下这个图: (有负权值) -![](https://file.kamacoder.com/pics/20240227104334.png) +![](https://file1.kamacoder.com/i/algo/20240227104334.png) 节点1 到 节点5 的最短路径 应该是 节点1 -> 节点2 -> 节点3 -> 节点4 -> 节点5 @@ -559,7 +559,7 @@ int main() { 初始化: -![](https://file.kamacoder.com/pics/20240227104801.png) +![](https://file1.kamacoder.com/i/algo/20240227104801.png) --------------- @@ -573,7 +573,7 @@ int main() { 3、更新非访问节点到源点的距离(即更新minDist数组) ,如图: -![](https://file.kamacoder.com/pics/20240227110217.png) +![](https://file1.kamacoder.com/i/algo/20240227110217.png) 更新 minDist数组,即:源点(节点1) 到 节点2 和 节点3的距离。 @@ -592,7 +592,7 @@ int main() { 3、更新非访问节点到源点的距离(即更新minDist数组) ,如图: -![](https://file.kamacoder.com/pics/20240227110330.png) +![](https://file1.kamacoder.com/i/algo/20240227110330.png) 由于节点3的加入,那么源点可以有新的路径链接到节点4 所以更新minDist数组: @@ -610,7 +610,7 @@ int main() { 3、更新非访问节点到源点的距离(即更新minDist数组) ,如图: -![](https://file.kamacoder.com/pics/20240227110346.png) +![](https://file1.kamacoder.com/i/algo/20240227110346.png) 由于节点4的加入,那么源点可以有新的路径链接到节点5 所以更新minDist数组: @@ -628,7 +628,7 @@ int main() { 3、更新非访问节点到源点的距离(即更新minDist数组) ,如图: -![](https://file.kamacoder.com/pics/20240227110405.png) +![](https://file1.kamacoder.com/i/algo/20240227110405.png) 节点5的加入,而节点5 没有链接其他节点, 所以不用更新minDist数组,仅标记节点5被访问过了 @@ -644,7 +644,7 @@ int main() { 3、更新非访问节点到源点的距离(即更新minDist数组) ,如图: -![](https://file.kamacoder.com/pics/20240227110711.png) +![](https://file1.kamacoder.com/i/algo/20240227110711.png) -------------- @@ -942,3 +942,4 @@ main() ### C +
diff --git "a/problems/kamacoder/0053.\345\257\273\345\256\235-Kruskal.md" "b/problems/kamacoder/0053.\345\257\273\345\256\235-Kruskal.md" index 585fa4767e..53da7af9ee 100644 --- "a/problems/kamacoder/0053.\345\257\273\345\256\235-Kruskal.md" +++ "b/problems/kamacoder/0053.\345\257\273\345\256\235-Kruskal.md" @@ -63,7 +63,7 @@ kruscal的思路: 依然以示例中,如下这个图来举例。 -![](https://file.kamacoder.com/pics/20240111113514.png) +![](https://file1.kamacoder.com/i/algo/20240111113514.png) 将图中的边按照权值有小到大排序,这样从贪心的角度来说,优先选 权值小的边加入到 最小生成树中。 @@ -77,13 +77,13 @@ kruscal的思路: 选边(1,2),节点1 和 节点2 不在同一个集合,所以生成树可以添加边(1,2),并将 节点1,节点2 放在同一个集合。 -![](https://file.kamacoder.com/pics/20240111114204.png) +![](https://file1.kamacoder.com/i/algo/20240111114204.png) -------- 选边(4,5),节点4 和 节点 5 不在同一个集合,生成树可以添加边(4,5) ,并将节点4,节点5 放到同一个集合。 -![](https://file.kamacoder.com/pics/20240111120458.png) +![](https://file1.kamacoder.com/i/algo/20240111120458.png) **大家判断两个节点是否在同一个集合,就看图中两个节点是否有绿色的粗线连着就行** @@ -93,25 +93,25 @@ kruscal的思路: 选边(1,3),节点1 和 节点3 不在同一个集合,生成树添加边(1,3),并将节点1,节点3 放到同一个集合。 -![](https://file.kamacoder.com/pics/20240112105834.png) +![](https://file1.kamacoder.com/i/algo/20240112105834.png) --------- 选边(2,6),节点2 和 节点6 不在同一个集合,生成树添加边(2,6),并将节点2,节点6 放到同一个集合。 -![](https://file.kamacoder.com/pics/20240112110214.png) +![](https://file1.kamacoder.com/i/algo/20240112110214.png) -------- 选边(3,4),节点3 和 节点4 不在同一个集合,生成树添加边(3,4),并将节点3,节点4 放到同一个集合。 -![](https://file.kamacoder.com/pics/20240112110450.png) +![](https://file1.kamacoder.com/i/algo/20240112110450.png) ---------- 选边(6,7),节点6 和 节点7 不在同一个集合,生成树添加边(6,7),并将 节点6,节点7 放到同一个集合。 -![](https://file.kamacoder.com/pics/20240112110637.png) +![](https://file1.kamacoder.com/i/algo/20240112110637.png) ----------- @@ -126,7 +126,7 @@ kruscal的思路: 此时 我们就已经生成了一个最小生成树,即: -![](https://file.kamacoder.com/pics/20240112110637.png) +![](https://file1.kamacoder.com/i/algo/20240112110637.png) 在上面的讲解中,看图的话 大家知道如何判断 两个节点 是否在同一个集合(是否有绿色的线连在一起),以及如何把两个节点加入集合(就在图中把两个节点连上) @@ -346,7 +346,7 @@ int main() { 大家可能发现 怎么和我们 模拟画的图不一样,差别在于 代码生成的最小生成树中 节点5 和 节点7相连的。 -![](https://file.kamacoder.com/pics/20240116163014.png) +![](https://file1.kamacoder.com/i/algo/20240116163014.png) 其实造成这个差别 是对边排序的时候 权值相同的边先后顺序的问题导致的,无论相同权值边的顺序是什么样的,最后都能得出最小生成树。 @@ -366,7 +366,7 @@ Kruskal 与 prim 的关键区别在于,prim维护的是节点的集合,而 K 节点未必一定要连着边那, 例如 这个图,大家能明显感受到边没有那么多对吧,但节点数量 和 上述我们讲的例子是一样的。 -![](https://file.kamacoder.com/pics/20240116152211.png) +![](https://file1.kamacoder.com/i/algo/20240116152211.png) 为什么边少的话,使用 Kruskal 更优呢? @@ -760,3 +760,4 @@ int main() } ``` +
diff --git "a/problems/kamacoder/0053.\345\257\273\345\256\235-prim.md" "b/problems/kamacoder/0053.\345\257\273\345\256\235-prim.md" index a7d3584178..df0129ee2a 100644 --- "a/problems/kamacoder/0053.\345\257\273\345\256\235-prim.md" +++ "b/problems/kamacoder/0053.\345\257\273\345\256\235-prim.md" @@ -61,7 +61,7 @@ 例如本题示例中的无向有权图为: -![](https://file.kamacoder.com/pics/20231206164306.png) +![](https://file1.kamacoder.com/i/algo/20231206164306.png) 那么在这个图中,如何选取n-1条边使得图中所有节点连接到一起,并且边的权值和最小呢? @@ -100,7 +100,7 @@ minDist数组里的数值初始化为最大数,因为本题节点距离不会 如图: -![](https://file.kamacoder.com/pics/20231215105603.png) +![](https://file1.kamacoder.com/i/algo/20231215105603.png) 开始构造最小生成树 @@ -118,7 +118,7 @@ minDist数组里的数值初始化为最大数,因为本题节点距离不会 接下来,我们要更新所有节点距离最小生成树的距离,如图: -![](https://file.kamacoder.com/pics/20231222102048.png) +![](https://file1.kamacoder.com/i/algo/20231222102048.png) 注意下标0,我们就不管它了,下标1与节点1对应,这样可以避免大家把节点搞混。 @@ -148,7 +148,7 @@ minDist数组里的数值初始化为最大数,因为本题节点距离不会 接下来,我们要更新节点距离最小生成树的距离,如图: -![](https://file.kamacoder.com/pics/20231222102431.png) +![](https://file1.kamacoder.com/i/algo/20231222102431.png) 此时所有非生成树的节点距离最小生成树(节点1、节点2)的距离都已经跟新了。 @@ -172,7 +172,7 @@ minDist数组里的数值初始化为最大数,因为本题节点距离不会 接下来更新节点距离最小生成树的距离,如图: -![](https://file.kamacoder.com/pics/20231222102457.png) +![](https://file1.kamacoder.com/i/algo/20231222102457.png) 所有非生成树的节点距离最小生成树(节点1、节点2、节点3)的距离都已经跟新了。 @@ -188,7 +188,7 @@ minDist数组里的数值初始化为最大数,因为本题节点距离不会 继续选择一个距离最小生成树(节点1、节点2、节点3)最近的非生成树里的节点,为了巩固大家对minDist数组的理解,这里我再啰嗦一遍: -![](https://file.kamacoder.com/pics/20231217213516.png) +![](https://file1.kamacoder.com/i/algo/20231217213516.png) **minDist数组是记录了所有非生成树节点距离生成树的最小距离**,所以从数组里我们能看出来,非生成树节点4和节点6距离生成树最近。 @@ -209,7 +209,7 @@ minDist数组里的数值初始化为最大数,因为本题节点距离不会 接下来更新节点距离最小生成树的距离,如图: -![](https://file.kamacoder.com/pics/20231222102618.png) +![](https://file1.kamacoder.com/i/algo/20231222102618.png) minDist数组已经更新了所有非生成树的节点距离最小生成树(节点1、节点2、节点3、节点4)的距离。 @@ -232,7 +232,7 @@ minDist数组已经更新了所有非生成树的节点距离最小生成树( 接下来更新节点距离最小生成树的距离,如图: -![](https://file.kamacoder.com/pics/20231222102646.png) +![](https://file1.kamacoder.com/i/algo/20231222102646.png) minDist数组已经更新了所有非生成树的节点距离最小生成树(节点1、节点2、节点3、节点4、节点5)的距离。 @@ -253,11 +253,11 @@ minDist数组已经更新了所有非生成树的节点距离最小生成树( 节点1、节点2、节点3、节点4、节点5、节点6算是最小生成树的节点,接下来更新节点距离最小生成树的距离,如图: -![](https://file.kamacoder.com/pics/20231222102732.png) +![](https://file1.kamacoder.com/i/algo/20231222102732.png) 这里就不在重复描述了,大家类推,最后,节点7加入生成树,如图: -![](https://file.kamacoder.com/pics/20231222102820.png) +![](https://file1.kamacoder.com/i/algo/20231222102820.png) ### 最后 @@ -478,7 +478,7 @@ int main() { 大家可以和我们本题最后生成的最小生成树的图去对比一下边的链接情况: -![](https://file.kamacoder.com/pics/20231229115714.png) +![](https://file1.kamacoder.com/i/algo/20231229115714.png) 绿色的边是最小生成树,和我们的输出完全一致。 @@ -757,3 +757,4 @@ main() ### C +
diff --git "a/problems/kamacoder/0054.\346\233\277\346\215\242\346\225\260\345\255\227.md" "b/problems/kamacoder/0054.\346\233\277\346\215\242\346\225\260\345\255\227.md" index 665e8ecbae..67d31a5564 100644 --- "a/problems/kamacoder/0054.\346\233\277\346\215\242\346\225\260\345\255\227.md" +++ "b/problems/kamacoder/0054.\346\233\277\346\215\242\346\225\260\345\255\227.md" @@ -29,11 +29,11 @@ 如图: -![](https://file.kamacoder.com/pics/20231030165201.png) +![](https://file1.kamacoder.com/i/algo/20231030165201.png) 然后从后向前替换数字字符,也就是双指针法,过程如下:i指向新长度的末尾,j指向旧长度的末尾。 -![](https://file.kamacoder.com/pics/20231030173058.png) +![](https://file1.kamacoder.com/i/algo/20231030173058.png) 有同学问了,为什么要从后向前填充,从前向后填充不行么? @@ -432,3 +432,4 @@ echo $s; ### Rust: +
diff --git "a/problems/kamacoder/0055.\345\217\263\346\227\213\345\255\227\347\254\246\344\270\262.md" "b/problems/kamacoder/0055.\345\217\263\346\227\213\345\255\227\347\254\246\344\270\262.md" index 48150222a7..be998390c5 100644 --- "a/problems/kamacoder/0055.\345\217\263\346\227\213\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/kamacoder/0055.\345\217\263\346\227\213\345\255\227\347\254\246\344\270\262.md" @@ -40,16 +40,16 @@ fgabcde 本题中,我们需要将字符串右移n位,字符串相当于分成了两个部分,如果n为2,符串相当于分成了两个部分,如图: (length为字符串长度) -![](https://file.kamacoder.com/pics/20231106170143.png) +![](https://file1.kamacoder.com/i/algo/20231106170143.png) 右移n位, 就是将第二段放在前面,第一段放在后面,先不考虑里面字符的顺序,是不是整体倒叙不就行了。如图: -![](https://file.kamacoder.com/pics/20231106171557.png) +![](https://file1.kamacoder.com/i/algo/20231106171557.png) 此时第一段和第二段的顺序是我们想要的,但里面的字符位置被我们倒叙,那么此时我们在把 第一段和第二段里面的字符再倒叙一把,这样字符顺序不就正确了。 如果: -![](https://file.kamacoder.com/pics/20231106172058.png) +![](https://file1.kamacoder.com/i/algo/20231106172058.png) 其实,思路就是 通过 整体倒叙,把两段子串顺序颠倒,两个段子串里的的字符在倒叙一把,**负负得正**,这样就不影响子串里面字符的顺序了。 @@ -80,7 +80,7 @@ int main() { 可以的,不过,要记得 控制好 局部反转的长度,如果先局部反转,那么先反转的子串长度就是 len - n,如图: -![](https://file.kamacoder.com/pics/20231106172534.png) +![](https://file1.kamacoder.com/i/algo/20231106172534.png) 代码如下: @@ -409,3 +409,4 @@ echo $s; ### Rust: +
diff --git "a/problems/kamacoder/0058.\345\214\272\351\227\264\345\222\214.md" "b/problems/kamacoder/0058.\345\214\272\351\227\264\345\222\214.md" index 8eaad9f0de..894e0383d5 100644 --- "a/problems/kamacoder/0058.\345\214\272\351\227\264\345\222\214.md" +++ "b/problems/kamacoder/0058.\345\214\272\351\227\264\345\222\214.md" @@ -93,7 +93,7 @@ int main() { 如图: -![](https://file.kamacoder.com/pics/20240627110604.png) +![](https://file1.kamacoder.com/i/algo/20240627110604.png) 如果,我们想统计,在vec数组上 下标 2 到下标 5 之间的累加和,那是不是就用 p[5] - p[1] 就可以了。 @@ -109,7 +109,7 @@ int main() { 如图所示: -![](https://file.kamacoder.com/pics/20240627111319.png) +![](https://file1.kamacoder.com/i/algo/20240627111319.png) `p[5] - p[1]` 就是 红色部分的区间和。 @@ -408,3 +408,4 @@ func main() { } ``` +
diff --git "a/problems/kamacoder/0094.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I-SPFA.md" "b/problems/kamacoder/0094.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I-SPFA.md" index b592029276..9d3fbe839e 100644 --- "a/problems/kamacoder/0094.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I-SPFA.md" +++ "b/problems/kamacoder/0094.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I-SPFA.md" @@ -62,7 +62,7 @@ 给大家举一个例子: -![](https://file.kamacoder.com/pics/20240328104119.png) +![](https://file1.kamacoder.com/i/algo/20240328104119.png) 本图中,对所有边进行松弛,真正有效的松弛,只有松弛 边(节点1->节点2) 和 边(节点1->节点3) 。 @@ -97,7 +97,7 @@ 初始化,起点为节点1, 起点到起点的最短距离为0,所以minDist[1] 为 0。 将节点1 加入队列 (下次松弛从节点1开始) -![](https://file.kamacoder.com/pics/20240411115555.png) +![](https://file1.kamacoder.com/i/algo/20240411115555.png) ------------ @@ -109,7 +109,7 @@ 将节点2、节点3 加入队列,如图: -![](https://file.kamacoder.com/pics/20240411115544.png) +![](https://file1.kamacoder.com/i/algo/20240411115544.png) ----------------- @@ -124,7 +124,7 @@ 将节点4,节点5 加入队列,如图: -![](https://file.kamacoder.com/pics/20240412110348.png) +![](https://file1.kamacoder.com/i/algo/20240412110348.png) -------------------- @@ -134,7 +134,7 @@ 因为没有从节点3作为出发点的边,所以这里就从队列里取出节点3就好,不用做其他操作,如图: -![](https://file.kamacoder.com/pics/20240412110420.png) +![](https://file1.kamacoder.com/i/algo/20240412110420.png) ------------ @@ -147,7 +147,7 @@ 如图: -![](https://file.kamacoder.com/pics/20240412110445.png) +![](https://file1.kamacoder.com/i/algo/20240412110445.png) --------------- @@ -160,7 +160,7 @@ 如图,将节点3加入队列,因为节点6已经在队列里,所以不用重复添加 -![](https://file.kamacoder.com/pics/20240729161116.png) +![](https://file1.kamacoder.com/i/algo/20240729161116.png) 所以我们在加入队列的过程可以有一个优化,**用visited数组记录已经在队列里的元素,已经在队列的元素不用重复加入** @@ -174,7 +174,7 @@ 所以直接从队列中取出,如图: -![](https://file.kamacoder.com/pics/20240411115424.png) +![](https://file1.kamacoder.com/i/algo/20240411115424.png) ---------- @@ -264,7 +264,7 @@ int main() { 至于为什么 双向图且每一个节点和所有其他节点都相连的话,每个节点 都有 n-1 条指向该节点的边, 我再来举个例子,如图: -[](https://file.kamacoder.com/pics/20240416104138.png) +![](https://file1.kamacoder.com/i/algo/20240416104138.png) 图中 每个节点都与其他所有节点相连,节点数n 为 4,每个节点都有3条指向该节点的边,即入度为3。 @@ -329,7 +329,7 @@ SPFA(队列优化版Bellman_ford) 在理论上 时间复杂度更胜一筹 如图: -![](https://file.kamacoder.com/pics/20240412111849.png) +![](https://file1.kamacoder.com/i/algo/20240412111849.png) 正权回路 就是有环,但环的总权值为正数。 @@ -536,3 +536,4 @@ main() +
diff --git "a/problems/kamacoder/0094.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I.md" "b/problems/kamacoder/0094.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I.md" index 9edde8ace3..63d1be2a30 100644 --- "a/problems/kamacoder/0094.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I.md" +++ "b/problems/kamacoder/0094.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223I.md" @@ -46,7 +46,7 @@ 1 3 5 ``` -![](https://file.kamacoder.com/pics/20240509200224.png) +![](https://file1.kamacoder.com/i/algo/20240509200224.png) ## 思路 @@ -78,7 +78,7 @@ 这里我给大家举一个例子,每条边有起点、终点和边的权值。例如一条边,节点A 到 节点B 权值为value,如图: -![](https://file.kamacoder.com/pics/20240327102620.png) +![](https://file1.kamacoder.com/i/algo/20240327102620.png) minDist[B] 表示 到达B节点 最小权值,minDist[B] 有哪些状态可以推出来? @@ -127,7 +127,7 @@ if (minDist[B] > minDist[A] + value) minDist[B] = minDist[A] + value 如图: -![](https://file.kamacoder.com/pics/20240328104119.png) +![](https://file1.kamacoder.com/i/algo/20240328104119.png) 其他节点对应的minDist初始化为max,因为我们要求最小距离,那么还没有计算过的节点 默认是一个最大数,这样才能更新最小距离。 @@ -150,36 +150,36 @@ if (minDist[B] > minDist[A] + value) minDist[B] = minDist[A] + value 边:节点5 -> 节点6,权值为-2 ,minDist[5] 还是默认数值max,所以不能基于 节点5 去更新节点6,如图: -![](https://file.kamacoder.com/pics/20240329113537.png) +![](https://file1.kamacoder.com/i/algo/20240329113537.png) (在复习一下,minDist[5] 表示起点到节点5的最短距离) 边:节点1 -> 节点2,权值为1 ,minDist[2] > minDist[1] + 1 ,更新 minDist[2] = minDist[1] + 1 = 0 + 1 = 1 ,如图: -![](https://file.kamacoder.com/pics/20240329113703.png) +![](https://file1.kamacoder.com/i/algo/20240329113703.png) 边:节点5 -> 节点3,权值为1 ,minDist[5] 还是默认数值max,所以不能基于节点5去更新节点3 如图: -![](https://file.kamacoder.com/pics/20240329113827.png) +![](https://file1.kamacoder.com/i/algo/20240329113827.png) 边:节点2 -> 节点5,权值为2 ,minDist[5] > minDist[2] + 2 (经过上面的计算minDist[2]已经不是默认值,而是 1),更新 minDist[5] = minDist[2] + 2 = 1 + 2 = 3 ,如图: -![](https://file.kamacoder.com/pics/20240329113927.png) +![](https://file1.kamacoder.com/i/algo/20240329113927.png) 边:节点2 -> 节点4,权值为-3 ,minDist[4] > minDist[2] + (-3),更新 minDist[4] = minDist[2] + (-3) = 1 + (-3) = -2 ,如图: -![](https://file.kamacoder.com/pics/20240329114036.png) +![](https://file1.kamacoder.com/i/algo/20240329114036.png) 边:节点4 -> 节点6,权值为4 ,minDist[6] > minDist[4] + 4,更新 minDist[6] = minDist[4] + 4 = -2 + 4 = 2 -![](https://file.kamacoder.com/pics/20240329114120.png) +![](https://file1.kamacoder.com/i/algo/20240329114120.png) 边:节点1 -> 节点3,权值为5 ,minDist[3] > minDist[1] + 5,更新 minDist[3] = minDist[1] + 5 = 0 + 5 = 5 ,如图: -![](https://file.kamacoder.com/pics/20240329114324.png) +![](https://file1.kamacoder.com/i/algo/20240329114324.png) -------- @@ -538,3 +538,4 @@ main() ### C +
diff --git "a/problems/kamacoder/0095.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223II.md" "b/problems/kamacoder/0095.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223II.md" index 5dddf45013..957b8a80bc 100644 --- "a/problems/kamacoder/0095.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223II.md" +++ "b/problems/kamacoder/0095.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223II.md" @@ -78,7 +78,7 @@ circle 我们拿题目中示例来画一个图: -![](https://file.kamacoder.com/pics/20240705161426.png) +![](https://file1.kamacoder.com/i/algo/20240705161426.png) 图中 节点1 到 节点4 的最短路径是多少(题目中的最低运输成本) (注意边可以为负数的) @@ -86,7 +86,7 @@ circle 而图中有负权回路: -![](https://file.kamacoder.com/pics/20240402103712.png) +![](https://file1.kamacoder.com/i/algo/20240402103712.png) 那么我们在负权回路中多绕一圈,我们的最短路径 是不是就更小了 (也就是更低的运输成本) @@ -456,3 +456,4 @@ if __name__ == "__main__": ### C +
diff --git "a/problems/kamacoder/0096.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223III.md" "b/problems/kamacoder/0096.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223III.md" index 37cfaee0e3..0c00ccb668 100644 --- "a/problems/kamacoder/0096.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223III.md" +++ "b/problems/kamacoder/0096.\345\237\216\345\270\202\351\227\264\350\264\247\347\211\251\350\277\220\350\276\223III.md" @@ -63,7 +63,7 @@ 本题是最多经过 k 个城市, 那么是 k + 1条边相连的节点。 这里可能有录友想不懂为什么是k + 1,来看这个图: -![](https://file.kamacoder.com/pics/20240402115614.png) +![](https://file1.kamacoder.com/i/algo/20240402115614.png) 图中,节点1 最多已经经过2个节点 到达节点4,那么中间是有多少条边呢,是 3 条边对吧。 @@ -195,7 +195,7 @@ int main() { 起点为节点1, 起点到起点的距离为0,所以 minDist[1] 初始化为0 ,如图: -![](https://file.kamacoder.com/pics/20240409111940.png) +![](https://file1.kamacoder.com/i/algo/20240409111940.png) 其他节点对应的minDist初始化为max,因为我们要求最小距离,那么还没有计算过的节点 默认是一个最大数,这样才能更新最小距离。 @@ -203,21 +203,21 @@ int main() { 边:节点1 -> 节点2,权值为-1 ,minDist[2] > minDist[1] + (-1),更新 minDist[2] = minDist[1] + (-1) = 0 - 1 = -1 ,如图: -![](https://file.kamacoder.com/pics/20240409111914.png) +![](https://file1.kamacoder.com/i/algo/20240409111914.png) 边:节点2 -> 节点3,权值为1 ,minDist[3] > minDist[2] + 1 ,更新 minDist[3] = minDist[2] + 1 = -1 + 1 = 0 ,如图: -![](https://file.kamacoder.com/pics/20240409111903.png) +![](https://file1.kamacoder.com/i/algo/20240409111903.png) 边:节点3 -> 节点1,权值为-1 ,minDist[1] > minDist[3] + (-1),更新 minDist[1] = 0 + (-1) = -1 ,如图: -![](https://file.kamacoder.com/pics/20240409111849.png) +![](https://file1.kamacoder.com/i/algo/20240409111849.png) 边:节点3 -> 节点4,权值为1 ,minDist[4] > minDist[3] + 1,更新 minDist[4] = 0 + 1 = 1 ,如图: -![](https://file.kamacoder.com/pics/20241018192042.png) +![](https://file1.kamacoder.com/i/algo/20241018192042.png) 以上是对所有边进行的第一次松弛,最后 minDist数组为 :-1 -1 0 1 ,(从下标1算起) @@ -244,7 +244,7 @@ int main() { 在上面画图距离中,对所有边进行第一次松弛,在计算 边(节点2 -> 节点3) 的时候,更新了 节点3。 -![](https://file.kamacoder.com/pics/20240409111903.png) +![](https://file1.kamacoder.com/i/algo/20240409111903.png) 理论上来说节点3 应该在对所有边第二次松弛的时候才更新。 这因为当时是基于已经计算好的 节点2(minDist[2])来做计算了。 @@ -331,11 +331,11 @@ int main() { 所构成是图是一样的,都是如下的这个图,但给出的边的顺序是不一样的。 -![](https://file.kamacoder.com/pics/20240410154340.png) +![](https://file1.kamacoder.com/i/algo/20240410154340.png) 再用版本一的代码是运行一下,发现结果输出是 1, 是对的。 -![](https://file.kamacoder.com/pics/20240410154940.png) +![](https://file1.kamacoder.com/i/algo/20240410154940.png) 分明刚刚输出的结果是 -2,是错误的,怎么 一样的图,这次输出的结果就对了呢? @@ -345,7 +345,7 @@ int main() { 初始化: -![](https://file.kamacoder.com/pics/20240410155545.png) +![](https://file1.kamacoder.com/i/algo/20240410155545.png) 边:节点3 -> 节点1,权值为-1 ,节点3还没有被计算过,节点1 不更新。 @@ -355,7 +355,7 @@ int main() { 边:节点1 -> 节点2,权值为 -1 ,minDist[2] > minDist[1] + (-1),更新 minDist[2] = 0 + (-1) = -1 ,如图: -![](https://file.kamacoder.com/pics/20240410160046.png) +![](https://file1.kamacoder.com/i/algo/20240410160046.png) 以上是对所有边 松弛一次的状态。 @@ -472,7 +472,7 @@ int main() { 但大家会发现,以上代码大家提交后,怎么耗时这么多? -![](https://file.kamacoder.com/pics/20240418113308.png) +![](https://file1.kamacoder.com/i/algo/20240418113308.png) 理论上,SPFA的时间复杂度不是要比 bellman_ford 更优吗? @@ -554,7 +554,7 @@ int main() { 以上代码提交后,耗时情况: -![](https://file.kamacoder.com/pics/20240418113952.png) +![](https://file1.kamacoder.com/i/algo/20240418113952.png) 大家发现 依然远比 bellman_ford 的代码版本 耗时高。 @@ -579,11 +579,11 @@ dijkstra 是贪心的思路 每一次搜索都只会找距离源点最近的非 在以下这个图中,求节点1 到 节点7 最多经过2个节点 的最短路是多少呢? -![](https://file.kamacoder.com/pics/20240508112249.png) +![](https://file1.kamacoder.com/i/algo/20240508112249.png) 最短路显然是: -![](https://file.kamacoder.com/pics/20240508112416.png) +![](https://file1.kamacoder.com/i/algo/20240508112416.png) 最多经过2个节点,也就是3条边相连的路线:节点1 -> 节点2 -> 节点6-> 节点7 @@ -591,24 +591,24 @@ dijkstra 是贪心的思路 每一次搜索都只会找距离源点最近的非 初始化如图所示: -![](https://file.kamacoder.com/pics/20240130115306.png) +![](https://file1.kamacoder.com/i/algo/20240130115306.png) 找距离源点最近且没有被访问过的节点,先找节点1 -![](https://file.kamacoder.com/pics/20240130115421.png) +![](https://file1.kamacoder.com/i/algo/20240130115421.png) 距离源点最近且没有被访问过的节点,找节点2: -![](https://file.kamacoder.com/pics/20240130121240.png) +![](https://file1.kamacoder.com/i/algo/20240130121240.png) 距离源点最近且没有被访问过的节点,找到节点3: -![](https://file.kamacoder.com/pics/20240130120434.png) +![](https://file1.kamacoder.com/i/algo/20240130120434.png) 距离源点最近且没有被访问过的节点,找到节点4: -![](https://file.kamacoder.com/pics/20240201105335.png) +![](https://file1.kamacoder.com/i/algo/20240201105335.png) 此时最多经过2个节点的搜索就完毕了,但结果中minDist[7] (即节点7的结果)并没有被更。 @@ -922,3 +922,4 @@ if __name__ == "__main__": ### C +
diff --git "a/problems/kamacoder/0097.\345\260\217\346\230\216\351\200\233\345\205\254\345\233\255.md" "b/problems/kamacoder/0097.\345\260\217\346\230\216\351\200\233\345\205\254\345\233\255.md" index 97765ebc7b..53e66ee46f 100644 --- "a/problems/kamacoder/0097.\345\260\217\346\230\216\351\200\233\345\205\254\345\233\255.md" +++ "b/problems/kamacoder/0097.\345\260\217\346\230\216\351\200\233\345\205\254\345\233\255.md" @@ -155,7 +155,7 @@ grid[i][j][k] = m,表示 节点i 到 节点j 以[1...k] 集合为中间节点 grid数组是一个三维数组,那么我们初始化的数据在 i 与 j 构成的平层,如图: -![](https://file.kamacoder.com/pics/20240425104247.png) +![](https://file1.kamacoder.com/i/algo/20240425104247.png) 红色的 底部一层是我们初始化好的数据,注意:从三维角度去看初始化的数据很重要,下面我们在聊遍历顺序的时候还会再讲。 @@ -202,7 +202,7 @@ vector>> grid(n + 1, vector>(n + 1, vector(n 所以遍历k 的for循环一定是在最外面,这样才能一层一层去遍历。如图: -![](https://file.kamacoder.com/pics/20240424120109.png) +![](https://file1.kamacoder.com/i/algo/20240424120109.png) 至于遍历 i 和 j 的话,for 循环的先后顺序无所谓。 @@ -234,7 +234,7 @@ for (int i = 1; i <= n; i++) { 此时就遍历了 j 与 k 形成一个平面,i 则是纵面,那遍历 就是这样的: -![](https://file.kamacoder.com/pics/20240424115827.png) +![](https://file1.kamacoder.com/i/algo/20240424115827.png) 而我们初始化的数据 是 k 为0, i 和 j 形成的平面做初始化,如果以 k 和 j 形成的平面去一层一层遍历,就造成了 递推公式 用不上上一轮计算的结果,从而导致结果不对(初始化的部分是 i 与j 形成的平面,在初始部分有讲过)。 @@ -253,7 +253,7 @@ for (int i = 1; i <= n; i++) { 就是图: -![](https://file.kamacoder.com/pics/20240424120942.png) +![](https://file1.kamacoder.com/i/algo/20240424120942.png) 求节点1 到 节点 2 的最短距离,运行结果是 10 ,但正确的结果很明显是3。 @@ -267,7 +267,7 @@ for (int i = 1; i <= n; i++) { 而遍历k 的for循环如果放在中间呢,同样是 j 与k 行程一个平面,i 是纵面,遍历的也是这样: -![](https://file.kamacoder.com/pics/20240424115827.png) +![](https://file1.kamacoder.com/i/algo/20240424115827.png) 同样不能完全用上初始化 和 上一层计算的结果。 @@ -283,7 +283,7 @@ for (int i = 1; i <= n; i++) { 图: -![](https://file.kamacoder.com/pics/20240425112636.png) +![](https://file1.kamacoder.com/i/algo/20240425112636.png) 求 节点1 到节点3 的最短距离,如果k循环放中间,程序的运行结果是 -1,也就是不能到达节点3。 @@ -574,3 +574,4 @@ if __name__ == '__main__': ### C +
diff --git "a/problems/kamacoder/0098.\346\211\200\346\234\211\345\217\257\350\276\276\350\267\257\345\276\204.md" "b/problems/kamacoder/0098.\346\211\200\346\234\211\345\217\257\350\276\276\350\267\257\345\276\204.md" index 2f0dcdcc87..c71981996b 100644 --- "a/problems/kamacoder/0098.\346\211\200\346\234\211\345\217\257\350\276\276\350\267\257\345\276\204.md" +++ "b/problems/kamacoder/0098.\346\211\200\346\234\211\345\217\257\350\276\276\350\267\257\345\276\204.md" @@ -43,7 +43,7 @@ 提示信息 -![](https://file.kamacoder.com/pics/20240514103953.png) +![](https://file1.kamacoder.com/i/algo/20240514103953.png) 用例解释: @@ -141,7 +141,7 @@ while (m--) { 我在 [图论理论基础篇](./图论理论基础.md) 举了一个例子: -![](https://file.kamacoder.com/pics/20240223103713.png) +![](https://file1.kamacoder.com/i/algo/20240223103713.png) 这里表达的图是: @@ -887,3 +887,4 @@ async function dfs(graph, x, n) { +
diff --git "a/problems/kamacoder/0099.\345\262\233\345\261\277\347\232\204\346\225\260\351\207\217\345\271\277\346\220\234.md" "b/problems/kamacoder/0099.\345\262\233\345\261\277\347\232\204\346\225\260\351\207\217\345\271\277\346\220\234.md" index 0da2f315a1..93c1fe41fa 100644 --- "a/problems/kamacoder/0099.\345\262\233\345\261\277\347\232\204\346\225\260\351\207\217\345\271\277\346\220\234.md" +++ "b/problems/kamacoder/0099.\345\262\233\345\261\277\347\232\204\346\225\260\351\207\217\345\271\277\346\220\234.md" @@ -35,7 +35,7 @@ 提示信息 -![](https://file.kamacoder.com/pics/20240516111613.png) +![](https://file1.kamacoder.com/i/algo/20240516111613.png) 根据测试案例中所展示,岛屿数量共有 3 个,所以输出 3。 @@ -50,7 +50,7 @@ 也就是说斜角度链接是不算了, 例如示例二,是三个岛屿,如图: -![图一](https://file.kamacoder.com/pics/20220726094200.png) +![图一](https://file1.kamacoder.com/i/algo/20220726094200.png) 这道题题目是 DFS,BFS,并查集,基础题目。 @@ -72,7 +72,7 @@ 如果从队列拿出节点,再去标记这个节点走过,就会发生下图所示的结果,会导致很多节点重复加入队列。 -![](https://file.kamacoder.com/pics/20250124094043.png) +![](https://file1.kamacoder.com/i/algo/20250124094043.png) 超时写法 (从队列中取出节点再标记,注意代码注释的地方) @@ -557,3 +557,4 @@ object Solution { ### C +
diff --git "a/problems/kamacoder/0099.\345\262\233\345\261\277\347\232\204\346\225\260\351\207\217\346\267\261\346\220\234.md" "b/problems/kamacoder/0099.\345\262\233\345\261\277\347\232\204\346\225\260\351\207\217\346\267\261\346\220\234.md" index 06be926874..3c54278af0 100644 --- "a/problems/kamacoder/0099.\345\262\233\345\261\277\347\232\204\346\225\260\351\207\217\346\267\261\346\220\234.md" +++ "b/problems/kamacoder/0099.\345\262\233\345\261\277\347\232\204\346\225\260\351\207\217\346\267\261\346\220\234.md" @@ -36,7 +36,7 @@ 提示信息 -![](https://file.kamacoder.com/pics/20240516111613.png) +![](https://file1.kamacoder.com/i/algo/20240516111613.png) 根据测试案例中所展示,岛屿数量共有 3 个,所以输出 3。 @@ -50,7 +50,7 @@ 也就是说斜角度链接是不算了, 例如示例二,是三个岛屿,如图: -![图一](https://file.kamacoder.com/pics/20220726094200.png) +![图一](https://file1.kamacoder.com/i/algo/20220726094200.png) 这道题题目是 DFS,BFS,并查集,基础题目。 @@ -459,3 +459,4 @@ object Solution { ### C +
diff --git "a/problems/kamacoder/0100.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" "b/problems/kamacoder/0100.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" index f2b9b901d1..2ae1f452e0 100644 --- "a/problems/kamacoder/0100.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" +++ "b/problems/kamacoder/0100.\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.md" @@ -33,7 +33,7 @@ 提示信息 -![](https://file.kamacoder.com/pics/20240517103410.png) +![](https://file1.kamacoder.com/i/algo/20240517103410.png) 样例输入中,岛屿的最大面积为 4。 @@ -48,7 +48,7 @@ 也就是说斜角度链接是不算了, 例如示例二,是三个岛屿,如图: -![图一](https://file.kamacoder.com/pics/20220726094200.png) +![图一](https://file1.kamacoder.com/i/algo/20220726094200.png) 这道题目也是 dfs bfs基础类题目,就是搜索每个岛屿上“1”的数量,然后取一个最大的。 @@ -890,3 +890,4 @@ main(); ### C +
diff --git "a/problems/kamacoder/0101.\345\255\244\345\262\233\347\232\204\346\200\273\351\235\242\347\247\257.md" "b/problems/kamacoder/0101.\345\255\244\345\262\233\347\232\204\346\200\273\351\235\242\347\247\257.md" index c8fe372cd9..c883100724 100644 --- "a/problems/kamacoder/0101.\345\255\244\345\262\233\347\232\204\346\200\273\351\235\242\347\247\257.md" +++ "b/problems/kamacoder/0101.\345\255\244\345\262\233\347\232\204\346\200\273\351\235\242\347\247\257.md" @@ -37,7 +37,7 @@ 提示信息: -![](https://file.kamacoder.com/pics/20240517105557.png) +![](https://file1.kamacoder.com/i/algo/20240517105557.png) 在矩阵中心部分的岛屿,因为没有任何一个单元格接触到矩阵边缘,所以该岛屿属于孤岛,总面积为 1。 @@ -54,11 +54,11 @@ 如图,在遍历地图周围四个边,靠地图四边的陆地,都为绿色, -![](https://file.kamacoder.com/pics/20220830104632.png) +![](https://file1.kamacoder.com/i/algo/20220830104632.png) 在遇到地图周边陆地的时候,将1都变为0,此时地图为这样: -![](https://file.kamacoder.com/pics/20220830104651.png) +![](https://file1.kamacoder.com/i/algo/20220830104651.png) 然后我们再去遍历这个地图,遇到有陆地的地方,去采用深搜或者广搜,边统计所有陆地。 @@ -700,3 +700,4 @@ const bfs = (graph, x, y) => { ### C +
diff --git "a/problems/kamacoder/0102.\346\262\211\346\262\241\345\255\244\345\262\233.md" "b/problems/kamacoder/0102.\346\262\211\346\262\241\345\255\244\345\262\233.md" index 265ec31f73..1b31676277 100644 --- "a/problems/kamacoder/0102.\346\262\211\346\262\241\345\255\244\345\262\233.md" +++ "b/problems/kamacoder/0102.\346\262\211\346\262\241\345\255\244\345\262\233.md" @@ -43,11 +43,11 @@ 提示信息: -![](https://file.kamacoder.com/pics/20240517110932.png) +![](https://file1.kamacoder.com/i/algo/20240517110932.png) 将孤岛沉没: -![](https://file.kamacoder.com/pics/20240517110953.png) +![](https://file1.kamacoder.com/i/algo/20240517110953.png) 数据范围: @@ -73,7 +73,7 @@ 如图: -![](https://file.kamacoder.com/pics/20240517113813.png) +![](https://file1.kamacoder.com/i/algo/20240517113813.png) 整体C++代码如下,以下使用dfs实现,其实遍历方式dfs,bfs都是可以的。 @@ -503,3 +503,4 @@ const bfs = (graph, x, y) => { ### C +
diff --git "a/problems/kamacoder/0103.\346\260\264\346\265\201\351\227\256\351\242\230.md" "b/problems/kamacoder/0103.\346\260\264\346\265\201\351\227\256\351\242\230.md" index 5924cb18a9..bf6cd40f43 100644 --- "a/problems/kamacoder/0103.\346\260\264\346\265\201\351\227\256\351\242\230.md" +++ "b/problems/kamacoder/0103.\346\260\264\346\265\201\351\227\256\351\242\230.md" @@ -48,7 +48,7 @@ 提示信息: -![](https://file.kamacoder.com/pics/20240517115816.png) +![](https://file1.kamacoder.com/i/algo/20240517115816.png) 图中的蓝色方块上的雨水既能流向第一组边界,也能流向第二组边界。所以最终答案为所有蓝色方块的坐标。 @@ -166,11 +166,11 @@ int main() { 从第一组边界边上节点出发,如图: (图中并没有把所有遍历的方向都画出来,只画关键部分) -![](https://file.kamacoder.com/pics/20250304174747.png) +![](https://file1.kamacoder.com/i/algo/20250304174747.png) 从第二组边界上节点出发,如图: (图中并没有把所有遍历的方向都画出来,只画关键部分) -![](https://file.kamacoder.com/pics/20250304174801.png) +![](https://file1.kamacoder.com/i/algo/20250304174801.png) 最后,我们得到两个方向交界的这些节点,就是我们最后要求的节点。 @@ -854,3 +854,4 @@ const isResult = (x, y) => { +
diff --git "a/problems/kamacoder/0104.\345\273\272\351\200\240\346\234\200\345\244\247\345\262\233\345\261\277.md" "b/problems/kamacoder/0104.\345\273\272\351\200\240\346\234\200\345\244\247\345\262\233\345\261\277.md" index 483d777275..8c4964a9e4 100644 --- "a/problems/kamacoder/0104.\345\273\272\351\200\240\346\234\200\345\244\247\345\262\233\345\261\277.md" +++ "b/problems/kamacoder/0104.\345\273\272\351\200\240\346\234\200\345\244\247\345\262\233\345\261\277.md" @@ -35,12 +35,12 @@ 提示信息 -![](https://file.kamacoder.com/pics/20240522154055.png) +![](https://file1.kamacoder.com/i/algo/20240522154055.png) 对于上面的案例,有两个位置可将 0 变成 1,使得岛屿的面积最大,即 6。 -![](https://file.kamacoder.com/pics/20240522154110.png) +![](https://file1.kamacoder.com/i/algo/20240522154110.png) 数据范围: @@ -70,11 +70,11 @@ 拿如下地图的岛屿情况来举例: (1为陆地) -![](https://file.kamacoder.com/pics/20220829104834.png) +![](https://file1.kamacoder.com/i/algo/20220829104834.png) 第一步,则遍历地图,并将岛屿的编号和面积都统计好,过程如图所示: -![](https://file.kamacoder.com/pics/20220829105644.png) +![](https://file1.kamacoder.com/i/algo/20220829105644.png) 本过程代码如下: @@ -121,7 +121,7 @@ int largestIsland(vector>& grid) { 第二步过程如图所示: -![](https://file.kamacoder.com/pics/20220829105249.png) +![](https://file1.kamacoder.com/i/algo/20220829105249.png) 也就是遍历每一个0的方格,并统计其相邻岛屿面积,最后取一个最大值。 @@ -663,3 +663,4 @@ const dfs = (graph, visited, x, y, mark) => { ### C +
diff --git "a/problems/kamacoder/0105.\346\234\211\345\220\221\345\233\276\347\232\204\345\256\214\345\205\250\345\217\257\350\276\276\346\200\247.md" "b/problems/kamacoder/0105.\346\234\211\345\220\221\345\233\276\347\232\204\345\256\214\345\205\250\345\217\257\350\276\276\346\200\247.md" index cfe77c0d38..1358f673d5 100644 --- "a/problems/kamacoder/0105.\346\234\211\345\220\221\345\233\276\347\232\204\345\256\214\345\205\250\345\217\257\350\276\276\346\200\247.md" +++ "b/problems/kamacoder/0105.\346\234\211\345\220\221\345\233\276\347\232\204\345\256\214\345\205\250\345\217\257\350\276\276\346\200\247.md" @@ -33,7 +33,7 @@ 【提示信息】 -![](https://file.kamacoder.com/pics/20240522174707.png) +![](https://file1.kamacoder.com/i/algo/20240522174707.png) 从 1 号节点可以到达任意节点,输出 1。 @@ -48,7 +48,7 @@ 接下来我们再画一个图,从图里可以直观看出来,节点6 是 不能到达节点1 的 -![](https://file.kamacoder.com/pics/20240522175451.png) +![](https://file1.kamacoder.com/i/algo/20240522175451.png) 这就很容易让我们想起岛屿问题,只要发现独立的岛,就是不可到达的。 @@ -553,3 +553,4 @@ rl.on('close',()=>{ ### C +
diff --git "a/problems/kamacoder/0106.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" "b/problems/kamacoder/0106.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" index a1ef2a76eb..4492d5cd6d 100644 --- "a/problems/kamacoder/0106.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" +++ "b/problems/kamacoder/0106.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" @@ -37,7 +37,7 @@ 提示信息 -![](https://file.kamacoder.com/pics/20240524115244.png) +![](https://file1.kamacoder.com/i/algo/20240524115244.png) 岛屿的周长为 14。 @@ -57,14 +57,14 @@ 如果该陆地上下左右的空格是有水域,则说明是一条边,如图: -![](https://file.kamacoder.com/pics/20240524115933.png) +![](https://file1.kamacoder.com/i/algo/20240524115933.png) 陆地的右边空格是水域,则说明找到一条边。 如果该陆地上下左右的空格出界了,则说明是一条边,如图: -![](https://file.kamacoder.com/pics/20240524120105.png) +![](https://file1.kamacoder.com/i/algo/20240524120105.png) 该陆地的下边空格出界了,则说明找到一条边。 @@ -114,7 +114,7 @@ int main() { 因为有一对相邻两个陆地,边的总数就要减2,如图红线部分,有两个陆地相邻,总边数就要减2 -![](https://file.kamacoder.com/pics/20240524120855.png) +![](https://file1.kamacoder.com/i/algo/20240524120855.png) 那么只需要在计算出相邻岛屿的数量就可以了,相邻岛屿数量为cover。 @@ -359,3 +359,4 @@ func parseLine(line string, count int) []int { ### C +
diff --git "a/problems/kamacoder/0107.\345\257\273\346\211\276\345\255\230\345\234\250\347\232\204\350\267\257\345\276\204.md" "b/problems/kamacoder/0107.\345\257\273\346\211\276\345\255\230\345\234\250\347\232\204\350\267\257\345\276\204.md" index 363a188465..9ab3388f17 100644 --- "a/problems/kamacoder/0107.\345\257\273\346\211\276\345\255\230\345\234\250\347\232\204\350\267\257\345\276\204.md" +++ "b/problems/kamacoder/0107.\345\257\273\346\211\276\345\255\230\345\234\250\347\232\204\350\267\257\345\276\204.md" @@ -40,7 +40,7 @@ 提示信息 -![](https://file.kamacoder.com/pics/20240527104432.png) +![](https://file1.kamacoder.com/i/algo/20240527104432.png) 数据范围: @@ -422,3 +422,4 @@ const isSame = (u, v) => { ### C +
diff --git "a/problems/kamacoder/0108.\345\206\227\344\275\231\350\277\236\346\216\245.md" "b/problems/kamacoder/0108.\345\206\227\344\275\231\350\277\236\346\216\245.md" index fe641f53c9..de2435073c 100644 --- "a/problems/kamacoder/0108.\345\206\227\344\275\231\350\277\236\346\216\245.md" +++ "b/problems/kamacoder/0108.\345\206\227\344\275\231\350\277\236\346\216\245.md" @@ -9,11 +9,11 @@ 有一个图,它是一棵树,他是拥有 n 个节点(节点编号1到n)和 n - 1 条边的连通无环无向图(其实就是一个线形图),如图: -![](https://file.kamacoder.com/pics/20240905163122.png) +![](https://file1.kamacoder.com/i/algo/20240905163122.png) 现在在这棵树上的基础上,添加一条边(依然是n个节点,但有n条边),使这个图变成了有环图,如图 -![](https://file.kamacoder.com/pics/20240905164721.png) +![](https://file1.kamacoder.com/i/algo/20240905164721.png) 先请你找出冗余边,删除后,使该图可以重新变成一棵树。 @@ -42,7 +42,7 @@ 提示信息 -![](https://file.kamacoder.com/pics/20240527110320.png) +![](https://file1.kamacoder.com/i/algo/20240527110320.png) 图中的 1 2,2 3,1 3 等三条边在删除后都能使原图变为一棵合法的树。但是 1 3 由于是标准输入里最后出现的那条边,所以输出结果为 1 3 @@ -69,13 +69,13 @@ 如图所示,节点A 和节点 B 不在同一个集合,那么就可以将两个 节点连在一起。 -![](https://file.kamacoder.com/pics/20230604104720.png) +![](https://file1.kamacoder.com/i/algo/20230604104720.png) 如果边的两个节点已经出现在同一个集合里,说明着边的两个节点已经连在一起了,再加入这条边一定就出现环了。 如图所示: -![](https://file.kamacoder.com/pics/20230604104330.png) +![](https://file1.kamacoder.com/i/algo/20230604104330.png) 已经判断 节点A 和 节点B 在在同一个集合(同一个根),如果将 节点A 和 节点B 连在一起就一定会出现环。 @@ -157,7 +157,7 @@ int main() { 图: -![](https://file.kamacoder.com/pics/20240527110320.png) +![](https://file1.kamacoder.com/i/algo/20240527110320.png) 输出示例 @@ -376,3 +376,4 @@ const isSame = (u, v) => { ### C +
diff --git "a/problems/kamacoder/0109.\345\206\227\344\275\231\350\277\236\346\216\245II.md" "b/problems/kamacoder/0109.\345\206\227\344\275\231\350\277\236\346\216\245II.md" index 78132a3256..6ad59c4188 100644 --- "a/problems/kamacoder/0109.\345\206\227\344\275\231\350\277\236\346\216\245II.md" +++ "b/problems/kamacoder/0109.\345\206\227\344\275\231\350\277\236\346\216\245II.md" @@ -9,11 +9,11 @@ 有一种有向树,该树只有一个根节点,所有其他节点都是该根节点的后继。该树除了根节点之外的每一个节点都有且只有一个父节点,而根节点没有父节点。有向树拥有 n 个节点和 n - 1 条边。如图:  - + 现在有一个有向图,有向图是在有向树中的两个没有直接链接的节点中间添加一条有向边。如图: - + 输入一个有向图,该图由一个有着 n 个节点(节点编号 从 1 到 n),n 条边,请返回一条可以删除的边,使得删除该条边之后该有向图可以被当作一颗有向树。 @@ -42,7 +42,7 @@ 提示信息 - + 在删除 2 3 后有向图可以变为一棵合法的有向树,所以输出 2 3 @@ -64,13 +64,13 @@ 如图: -![](https://file.kamacoder.com/pics/20240527115807.png) +![](https://file1.kamacoder.com/i/algo/20240527115807.png) 找到了节点3 的入度为2,删 1 -> 3 或者 2 -> 3 。选择删顺序靠后便可。 但 入度为2 还有一种情况,情况二,只能删特定的一条边,如图: -![](https://file.kamacoder.com/pics/20240527151456.png) +![](https://file1.kamacoder.com/i/algo/20240527151456.png) 节点3 的入度为 2,但在删除边的时候,只能删 这条边(节点1 -> 节点3),如果删这条边(节点4 -> 节点3),那么删后本图也不是有向树了(因为找不到根节点)。 @@ -81,7 +81,7 @@ 如图: -![](https://file.kamacoder.com/pics/20240527120531.png) +![](https://file1.kamacoder.com/i/algo/20240527120531.png) 对于情况三,删掉构成环的边就可以了。 @@ -596,3 +596,4 @@ const getRemoveEdge = (edges) => { ### C +
diff --git "a/problems/kamacoder/0110.\345\255\227\347\254\246\344\270\262\346\216\245\351\276\231.md" "b/problems/kamacoder/0110.\345\255\227\347\254\246\344\270\262\346\216\245\351\276\231.md" index af3436901c..6cb5886d20 100644 --- "a/problems/kamacoder/0110.\345\255\227\347\254\246\344\270\262\346\216\245\351\276\231.md" +++ "b/problems/kamacoder/0110.\345\255\227\347\254\246\344\270\262\346\216\245\351\276\231.md" @@ -57,7 +57,7 @@ yhn 2 <= N <= 500

- +

@@ -65,7 +65,7 @@ yhn 以示例1为例,从这个图中可以看出 abc 到 def的路线 不止一条,但最短的一条路径上是4个节点。 -![](https://file.kamacoder.com/pics/20250317105155.png) +![](https://file1.kamacoder.com/i/algo/20250317105155.png) 本题只需要求出最短路径的长度就可以了,不用找出具体路径。 @@ -360,3 +360,4 @@ const init = async () => { ### C +
diff --git "a/problems/kamacoder/0117.\350\275\257\344\273\266\346\236\204\345\273\272.md" "b/problems/kamacoder/0117.\350\275\257\344\273\266\346\236\204\345\273\272.md" index 18802765a9..c5650d9708 100644 --- "a/problems/kamacoder/0117.\350\275\257\344\273\266\346\236\204\345\273\272.md" +++ "b/problems/kamacoder/0117.\350\275\257\344\273\266\346\236\204\345\273\272.md" @@ -39,7 +39,7 @@ 文件依赖关系如下: -![](https://file.kamacoder.com/pics/20240510192157.png) +![](https://file1.kamacoder.com/i/algo/20240510192157.png) 所以,文件处理的顺序除了示例中的顺序,还存在 @@ -104,7 +104,7 @@ 以题目中示例为例如图: -![](https://file.kamacoder.com/pics/20240510110836.png) +![](https://file1.kamacoder.com/i/algo/20240510110836.png) 做拓扑排序的话,如果肉眼去找开头的节点,一定能找到 节点0 吧,都知道要从节点0 开始。 @@ -135,17 +135,17 @@ 1、找到入度为0 的节点,加入结果集 -![](https://file.kamacoder.com/pics/20240510113110.png) +![](https://file1.kamacoder.com/i/algo/20240510113110.png) 2、将该节点从图中移除 -![](https://file.kamacoder.com/pics/20240510113142.png) +![](https://file1.kamacoder.com/i/algo/20240510113142.png) ---------------- 1、找到入度为0 的节点,加入结果集 -![](https://file.kamacoder.com/pics/20240510113345.png) +![](https://file1.kamacoder.com/i/algo/20240510113345.png) 这里大家会发现,节点1 和 节点2 入度都为0, 选哪个呢? @@ -153,19 +153,19 @@ 2、将该节点从图中移除 -![](https://file.kamacoder.com/pics/20240510113640.png) +![](https://file1.kamacoder.com/i/algo/20240510113640.png) --------------- 1、找到入度为0 的节点,加入结果集 -![](https://file.kamacoder.com/pics/20240510113853.png) +![](https://file1.kamacoder.com/i/algo/20240510113853.png) 节点2 和 节点3 入度都为0,选哪个都行,这里选节点2 2、将该节点从图中移除 -![](https://file.kamacoder.com/pics/20240510114004.png) +![](https://file1.kamacoder.com/i/algo/20240510114004.png) -------------- @@ -177,7 +177,7 @@ 如果有 有向环怎么办呢?例如这个图: -![](https://file.kamacoder.com/pics/20240510115115.png) +![](https://file1.kamacoder.com/i/algo/20240510115115.png) 这个图,我们只能将入度为0 的节点0 接入结果集。 @@ -252,13 +252,13 @@ while (que.size()) { 如果这里不理解,看上面的模拟过程第一步: -![](https://file.kamacoder.com/pics/20240510113110.png) +![](https://file1.kamacoder.com/i/algo/20240510113110.png) 这事节点1 和 节点2 的入度为 1。 将节点0删除后,图为这样: -![](https://file.kamacoder.com/pics/20240510113142.png) +![](https://file1.kamacoder.com/i/algo/20240510113142.png) 那么 节点0 作为出发点 所连接的节点的入度 就都做了 减一 的操作。 @@ -539,3 +539,4 @@ const init = async () => { ### C +
diff --git "a/problems/kamacoder/0126.\351\252\221\345\243\253\347\232\204\346\224\273\345\207\273astar.md" "b/problems/kamacoder/0126.\351\252\221\345\243\253\347\232\204\346\224\273\345\207\273astar.md" index 7d0096d52d..6669ce7ba1 100644 --- "a/problems/kamacoder/0126.\351\252\221\345\243\253\347\232\204\346\224\273\345\207\273astar.md" +++ "b/problems/kamacoder/0126.\351\252\221\345\243\253\347\232\204\346\224\273\345\207\273astar.md" @@ -9,7 +9,7 @@ 骑士移动规则如图,红色是起始位置,黄色是骑士可以走的地方。 -![](https://file.kamacoder.com/pics/20240626104833.png) +![](https://file1.kamacoder.com/i/algo/20240626104833.png) 棋盘大小 1000 x 1000(棋盘的 x 和 y 坐标均在 [1, 1000] 区间内,包含边界) @@ -108,7 +108,7 @@ int main() 我们来看一下广搜的搜索过程,如图,红色是起点,绿色是终点,黄色是要遍历的点,最后从 起点 找到 达到终点的最短路径是棕色。 -![](https://file.kamacoder.com/pics/20240611143712.png) +![](https://file1.kamacoder.com/i/algo/20240611143712.png) 可以看出 广搜中,做了很多无用的遍历, 黄色的格子是广搜遍历到的点。 @@ -131,11 +131,11 @@ Astar 是一种 广搜的改良版。 有的是 Astar是 dijkstra 的改良版 在BFS中,我们想搜索,从起点到终点的最短路径,要一层一层去遍历。 -![](https://file.kamacoder.com/pics/20240611143712.png) +![](https://file1.kamacoder.com/i/algo/20240611143712.png) 如果 使用A * 的话,其搜索过程是这样的,如图,图中着色的都是我们要遍历的点。 -![](https://file.kamacoder.com/pics/20240611195223.png) +![](https://file1.kamacoder.com/i/algo/20240611195223.png) (上面两图中 最短路长度都是8,只是走的方式不同而已) @@ -684,3 +684,4 @@ int main() { +
diff --git "a/problems/kamacoder/\345\233\276\350\256\272\344\270\272\344\273\200\344\271\210\347\224\250ACM\346\250\241\345\274\217.md" "b/problems/kamacoder/\345\233\276\350\256\272\344\270\272\344\273\200\344\271\210\347\224\250ACM\346\250\241\345\274\217.md" index 362ea9714a..c5122b1760 100644 --- "a/problems/kamacoder/\345\233\276\350\256\272\344\270\272\344\273\200\344\271\210\347\224\250ACM\346\250\241\345\274\217.md" +++ "b/problems/kamacoder/\345\233\276\350\256\272\344\270\272\344\273\200\344\271\210\347\224\250ACM\346\250\241\345\274\217.md" @@ -91,3 +91,4 @@ cout << result[result.size() - 1]; 等大家将图论刷完,就会感受到我的良苦用心。加油 +
diff --git "a/problems/kamacoder/\345\233\276\350\256\272\345\271\266\346\237\245\351\233\206\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/kamacoder/\345\233\276\350\256\272\345\271\266\346\237\245\351\233\206\347\220\206\350\256\272\345\237\272\347\241\200.md" index 5eb5127a93..61d49b5297 100644 --- "a/problems/kamacoder/\345\233\276\350\256\272\345\271\266\346\237\245\351\233\206\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/kamacoder/\345\233\276\350\256\272\345\271\266\346\237\245\351\233\206\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -105,13 +105,13 @@ bool isSame(int u, int v) { 搜索过程像是一个多叉树中从叶子到根节点的过程,如图: -![](https://file.kamacoder.com/pics/20230602102619.png) +![](https://file1.kamacoder.com/i/algo/20230602102619.png) 如果这棵多叉树高度很深的话,每次find函数 去寻找根的过程就要递归很多次。 我们的目的只需要知道这些节点在同一个根下就可以,所以对这棵多叉树的构造只需要这样就可以了,如图: -![](https://file.kamacoder.com/pics/20230602103040.png) +![](https://file1.kamacoder.com/i/algo/20230602103040.png) 除了根节点其他所有节点都挂载根节点下,这样我们在寻根的时候就很快,只需要一步, @@ -226,7 +226,7 @@ join(3, 2); 此时构成的图是这样的: -![](https://file.kamacoder.com/pics/20230525111307.png) +![](https://file1.kamacoder.com/i/algo/20230525111307.png) 此时问 1,3是否在同一个集合,我们调用 `join(1, 2); join(3, 2);` 很明显本意要表示 1,3是在同一个集合。 @@ -256,7 +256,7 @@ join(3, 2); 构成的图是这样的: -![](https://file.kamacoder.com/pics/20230525112101.png) +![](https://file1.kamacoder.com/i/algo/20230525112101.png) 因为在join函数里,我们有find函数进行寻根的过程,这样就保证元素 1,2,3在这个有向图里是强连通的。 @@ -275,12 +275,12 @@ join(3, 2); 1、`join(1, 8);` -![](https://file.kamacoder.com/pics/20231122112727.png) +![](https://file1.kamacoder.com/i/algo/20231122112727.png) 2、`join(3, 8);` -![](https://file.kamacoder.com/pics/20231122113857.png) +![](https://file1.kamacoder.com/i/algo/20231122113857.png) 有录友可能想,`join(3, 8)` 在图中为什么 将 元素1 连向元素 3 而不是将 元素 8 连向 元素 3 呢? @@ -288,12 +288,12 @@ join(3, 2); 3、`join(1, 7);` -![](https://file.kamacoder.com/pics/20231122114108.png) +![](https://file1.kamacoder.com/i/algo/20231122114108.png) 4、`join(8, 5);` -![](https://file.kamacoder.com/pics/20231122114847.png) +![](https://file1.kamacoder.com/i/algo/20231122114847.png) 这里8的根是3,那么 5 应该指向 8 的根 3,这里的原因,我们在上面「常见误区」已经讲过了。 但 为什么 图中 8 又直接指向了 3 了呢? @@ -310,11 +310,11 @@ int find(int u) { 5、`join(2, 9);` -![](https://file.kamacoder.com/pics/20231122115000.png) +![](https://file1.kamacoder.com/i/algo/20231122115000.png) 6、`join(6, 9);` -![](https://file.kamacoder.com/pics/20231122115404.png) +![](https://file1.kamacoder.com/i/algo/20231122115404.png) 这里为什么是 2 指向了 6,因为 9的根为 2,所以用2指向6。 @@ -347,13 +347,13 @@ rank表示树的高度,即树中结点层次的最大值。 例如两个集合(多叉树)需要合并,如图所示: -![](https://file.kamacoder.com/pics/20230602172250.png) +![](https://file1.kamacoder.com/i/algo/20230602172250.png) 树1 rank 为2,树2 rank 为 3。那么合并两个集合,是 树1 合入 树2,还是 树2 合入 树1呢? 我们来看两个不同方式合入的效果。 -![](https://file.kamacoder.com/pics/20230602172933.png) +![](https://file1.kamacoder.com/i/algo/20230602172933.png) 这里可以看出,树2 合入 树1 会导致整棵树的高度变的更高,而 树1 合入 树2 整棵树的高度 和 树2 保持一致。 @@ -454,3 +454,4 @@ void join(int u, int v) { 敬请期待 并查集题目精讲系列。 +
diff --git "a/problems/kamacoder/\345\233\276\350\256\272\345\271\277\346\220\234\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/kamacoder/\345\233\276\350\256\272\345\271\277\346\220\234\347\220\206\350\256\272\345\237\272\347\241\200.md" index 96e313fc42..718f5484a1 100644 --- "a/problems/kamacoder/\345\233\276\350\256\272\345\271\277\346\220\234\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/kamacoder/\345\233\276\350\256\272\345\271\277\346\220\234\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -18,11 +18,11 @@ 我们用一个方格地图,假如每次搜索的方向为 上下左右(不包含斜上方),那么给出一个start起始位置,那么BFS就是从四个方向走出第一步。 -![图一](https://file.kamacoder.com/pics/20220825104505.png) +![图一](https://file1.kamacoder.com/i/algo/20220825104505.png) 如果加上一个end终止位置,那么使用BFS的搜索过程如图所示: -![图二](https://file.kamacoder.com/pics/20220825102653.png) +![图二](https://file1.kamacoder.com/i/algo/20220825102653.png) 我们从图中可以看出,从start起点开始,是一圈一圈,向外搜索,方格编号1为第一步遍历的节点,方格编号2为第二步遍历的节点,第四步的时候我们找到终止点end。 @@ -30,7 +30,7 @@ 而且地图还可以有障碍,如图所示: -![图三](https://file.kamacoder.com/pics/20220825103900.png) +![图三](https://file1.kamacoder.com/i/algo/20220825103900.png) 在第五步,第六步 我只把关键的节点染色了,其他方向周边没有去染色,大家只要关注关键地方染色的逻辑就可以。 @@ -102,3 +102,4 @@ void bfs(vector>& grid, vector>& visited, int x, int y 相信看完本篇,大家会对广搜有一个基础性的认识,后面再来做对应的题目就会得心应手一些。 +
diff --git "a/problems/kamacoder/\345\233\276\350\256\272\346\200\273\347\273\223\347\257\207.md" "b/problems/kamacoder/\345\233\276\350\256\272\346\200\273\347\273\223\347\257\207.md" index d89d6411e9..d7b8da94cb 100644 --- "a/problems/kamacoder/\345\233\276\350\256\272\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/kamacoder/\345\233\276\350\256\272\346\200\273\347\273\223\347\257\207.md" @@ -143,3 +143,4 @@ kruscal的主要思路: 图论也是我 《代码随想录》所有章节里 所费精力最大的一个章节。 只为了不负录友们的期待。 大家加油💪🏻 +
diff --git "a/problems/kamacoder/\345\233\276\350\256\272\346\267\261\346\220\234\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/kamacoder/\345\233\276\350\256\272\346\267\261\346\220\234\347\220\206\350\256\272\345\237\272\347\241\200.md" index 1611e00aa0..50df8aa6df 100644 --- "a/problems/kamacoder/\345\233\276\350\256\272\346\267\261\346\220\234\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/kamacoder/\345\233\276\350\256\272\346\267\261\346\220\234\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -28,29 +28,29 @@ 如图一,是一个无向图,我们要搜索从节点1到节点6的所有路径。 -![图一](https://file.kamacoder.com/pics/20220707093643.png) +![图一](https://file1.kamacoder.com/i/algo/20220707093643.png) 那么dfs搜索的第一条路径是这样的: (假设第一次延默认方向,就找到了节点6),图二 -![图二](https://file.kamacoder.com/pics/20220707093807.png) +![图二](https://file1.kamacoder.com/i/algo/20220707093807.png) 此时我们找到了节点6,(遇到黄河了,是不是应该回头了),那么应该再去搜索其他方向了。 如图三: -![图三](https://file.kamacoder.com/pics/20220707094011.png) +![图三](https://file1.kamacoder.com/i/algo/20220707094011.png) 路径2撤销了,改变了方向,走路径3(红色线), 接着也找到终点6。 那么撤销路径2,改为路径3,在dfs中其实就是回溯的过程(这一点很重要,很多录友不理解dfs代码中回溯是用来干什么的) 又找到了一条从节点1到节点6的路径,又到黄河了,此时再回头,下图图四中,路径4撤销(回溯的过程),改为路径5。 -![图四](https://file.kamacoder.com/pics/20220707094322.png) +![图四](https://file1.kamacoder.com/i/algo/20220707094322.png) 又找到了一条从节点1到节点6的路径,又到黄河了,此时再回头,下图图五,路径6撤销(回溯的过程),改为路径7,路径8 和 路径7,路径9, 结果发现死路一条,都走到了自己走过的节点。 -![图五](https://file.kamacoder.com/pics/20220707094813.png) +![图五](https://file1.kamacoder.com/i/algo/20220707094813.png) 那么节点2所连接路径和节点3所链接的路径 都走过了,撤销路径只能向上回退,去选择撤销当初节点4的选择,也就是撤销路径5,改为路径10 。 如图图六: -![图六](https://file.kamacoder.com/pics/20220707095232.png) +![图六](https://file1.kamacoder.com/i/algo/20220707095232.png) 上图演示中,其实我并没有把 所有的 从节点1 到节点6的dfs(深度优先搜索)的过程都画出来,那样太冗余了,但 已经把dfs 关键的地方都涉及到了,关键就两点: @@ -180,7 +180,7 @@ for (选择:本节点所连接的其他节点) { 如图七所示, 路径2 已经走到了 目的地节点6,那么 路径2 是如何撤销,然后改为 路径3呢? 其实这就是 回溯的过程,撤销路径2,走换下一个方向。 -![图七](https://file.kamacoder.com/pics/20220708093544.png) +![图七](https://file1.kamacoder.com/i/algo/20220708093544.png) ## 总结 @@ -194,3 +194,4 @@ for (选择:本节点所连接的其他节点) { 后面我也会给大家安排具体练习的题目,依旧是代码随想录的风格,循序渐进由浅入深! +
diff --git "a/problems/kamacoder/\345\233\276\350\256\272\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/kamacoder/\345\233\276\350\256\272\347\220\206\350\256\272\345\237\272\347\241\200.md" index 9bec322765..fb52c83921 100644 --- "a/problems/kamacoder/\345\233\276\350\256\272\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/kamacoder/\345\233\276\350\256\272\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -17,15 +17,15 @@ 有向图是指 图中边是有方向的: -![](https://file.kamacoder.com/pics/20240510195737.png) +![](https://file1.kamacoder.com/i/algo/20240510195737.png) 无向图是指 图中边没有方向: -![](https://file.kamacoder.com/pics/20240510195451.png) +![](https://file1.kamacoder.com/i/algo/20240510195451.png) 加权有向图,就是图中边是有权值的,例如: -![](https://file.kamacoder.com/pics/20240510195821.png) +![](https://file1.kamacoder.com/i/algo/20240510195821.png) 加权无向图也是同理。 @@ -35,7 +35,7 @@ 例如,该无向图中,节点4的度为5,节点6的度为3。 -![](https://file.kamacoder.com/pics/20240511115029.png) +![](https://file1.kamacoder.com/i/algo/20240511115029.png) 在有向图中,每个节点有出度和入度。 @@ -45,7 +45,7 @@ 例如,该有向图中,节点3的入度为2,出度为1,节点1的入度为0,出度为2。 -![](https://file.kamacoder.com/pics/20240511115235.png) +![](https://file1.kamacoder.com/i/algo/20240511115235.png) ## 连通性 @@ -56,11 +56,11 @@ 在无向图中,任何两个节点都是可以到达的,我们称之为连通图 ,如图: -![](https://file.kamacoder.com/pics/20240511102351.png) +![](https://file1.kamacoder.com/i/algo/20240511102351.png) 如果有节点不能到达其他节点,则为非连通图,如图: -![](https://file.kamacoder.com/pics/20240511102449.png) +![](https://file1.kamacoder.com/i/algo/20240511102449.png) 节点1 不能到达节点4。 @@ -72,7 +72,7 @@ 我们来看这个有向图: -![](https://file.kamacoder.com/pics/20240511104531.png) +![](https://file1.kamacoder.com/i/algo/20240511104531.png) 这个图是强连通图吗? @@ -82,7 +82,7 @@ 下面这个有向图才是强连通图: -![](https://file.kamacoder.com/pics/20240511113101.png) +![](https://file1.kamacoder.com/i/algo/20240511113101.png) ### 连通分量 @@ -91,7 +91,7 @@ 只看概念大家可能不理解,我来画个图: -![](https://file.kamacoder.com/pics/20240511111559.png) +![](https://file1.kamacoder.com/i/algo/20240511111559.png) 该无向图中 节点1、节点2、节点5 构成的子图就是 该无向图中的一个连通分量,该子图所有节点都是相互可达到的。 @@ -111,7 +111,7 @@ 如图: -![](https://file.kamacoder.com/pics/20240511112951.png) +![](https://file1.kamacoder.com/i/algo/20240511112951.png) 节点1、节点2、节点3、节点4、节点5 构成的子图是强连通分量,因为这是强连通图,也是极大图。 @@ -132,11 +132,11 @@ 例如图: -![](https://file.kamacoder.com/pics/20240511112951.png) +![](https://file1.kamacoder.com/i/algo/20240511112951.png) 图中有8条边,我们就定义 8 * 2的数组,即有n条边就申请n * 2,这么大的数组: -![](https://file.kamacoder.com/pics/20250110114348.png) +![](https://file1.kamacoder.com/i/algo/20250110114348.png) 数组第一行:6 7,就表示节点6 指向 节点7,以此类推。 @@ -162,7 +162,7 @@ 如图: -![](https://file.kamacoder.com/pics/20240222110025.png) +![](https://file1.kamacoder.com/i/algo/20240222110025.png) 在一个 n (节点数)为8 的图中,就需要申请 8 * 8 这么大的空间。 @@ -188,7 +188,7 @@ 邻接表的构造如图: -![](https://file.kamacoder.com/pics/20240223103713.png) +![](https://file1.kamacoder.com/i/algo/20240223103713.png) 这里表达的图是: @@ -246,3 +246,4 @@ dfs 和 bfs 一种搜索算法,可以在不同的数据结构上进行搜索 敬请期待! +
diff --git "a/problems/kamacoder/\346\234\200\347\237\255\350\267\257\351\227\256\351\242\230\346\200\273\347\273\223\347\257\207.md" "b/problems/kamacoder/\346\234\200\347\237\255\350\267\257\351\227\256\351\242\230\346\200\273\347\273\223\347\257\207.md" index e83880dab1..194f1f5ee2 100644 --- "a/problems/kamacoder/\346\234\200\347\237\255\350\267\257\351\227\256\351\242\230\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/kamacoder/\346\234\200\347\237\255\350\267\257\351\227\256\351\242\230\346\200\273\347\273\223\347\257\207.md" @@ -17,7 +17,7 @@ 最短路算法比较复杂,而且各自有各自的应用场景,我来用一张表把讲过的最短路算法的使用场景都展现出来: -![](https://file.kamacoder.com/pics/20240508121355.png) +![](https://file1.kamacoder.com/i/algo/20240508121355.png) (因为A * 属于启发式搜索,和上面最短路算法并不是一类,不适合一起对比,所以没有放在一起) @@ -51,3 +51,4 @@ +
diff --git a/problems/qita/acm.md b/problems/qita/acm.md index 33dcd8a652..d4d942daca 100644 --- a/problems/qita/acm.md +++ b/problems/qita/acm.md @@ -11,15 +11,15 @@ [知识星球](https://programmercarl.com/other/kstar.html)里很多录友的日常打卡中,都表示被 ACM模式折磨过: -
+
-
+
-
+
-
+
-
+
所以我正式推出:**卡码网**([https://kamacoder.com](https://kamacoder.com)),**专门帮助大家练习ACM模式**。 @@ -43,17 +43,17 @@ 来看看这极简的界面,没有烂七八糟的功能,只有刷题! -
+
在「状态」这里可以看到 大家提交的代码和判题记录,目前卡码网([https://kamacoder.com](https://kamacoder.com))几乎无时无刻都有卡友在提交代码。 看看大家周六晚上都在做什么,刷哪些题目。 -
+
提交代码的界面是这样的,**目前支持所有主流刷题语言**。 -
+
## 题解 @@ -63,7 +63,7 @@ [https://github.com/youngyangyang04/kamacoder-solutions](https://github.com/youngyangyang04/kamacoder-solutions) -
+
**欢迎去Github上star,欢迎fork,也欢迎来Github仓库贡献其他语言版本,成为contributor**。 @@ -71,7 +71,7 @@ 目前已经有两位录友贡献C和Java版本了。 -
+
期待在Github(https://github.com/youngyangyang04/kamacoder-solutions) 的contributors上也出现你的头像。 diff --git a/problems/qita/acm_backup.md b/problems/qita/acm_backup.md new file mode 100755 index 0000000000..d4d942daca --- /dev/null +++ b/problems/qita/acm_backup.md @@ -0,0 +1,89 @@ + +# 如何练习ACM模式输入输出模式 | 如何准备笔试 | 卡码网 + +卡码网地址:[https://kamacoder.com](https://kamacoder.com) + +## 为什么卡码网 + +录友们在求职的时候会发现,很多公司的笔试题和面试题都是ACM模式, 而大家习惯去力扣刷题,力扣是核心代码模式。 + +当大家在做ACM模式的算法题的时候,需要自己处理数据的输入输出,**如果没有接触过的话,还是挺难的**。 + +[知识星球](https://programmercarl.com/other/kstar.html)里很多录友的日常打卡中,都表示被 ACM模式折磨过: + +
+ +
+ +
+ +
+ +
+ +所以我正式推出:**卡码网**([https://kamacoder.com](https://kamacoder.com)),**专门帮助大家练习ACM模式**。 + +那么之前大家去哪里练习ACM模式呢? + +去牛客做笔试真题,结果发现 ACM模式没练出来,题目倒是巨难,一点思路都没有,代码更没有写,ACM模式无从练起。 + +去洛谷,POJ上练习? 结果发现 题目超多,不知道从哪里开始刷,也没有一个循序渐进的刷题顺序。 + +**而卡码网上有我精选+制作的25道题目**!我还把25题的后台测试数据制作了一遍,保证大家练习的效果。 + +为什么题目不多,只有25道? + +因为大家练习ACM模式不需要那么多题目,有一个循序渐进的练习过程就好了。 + +这25道题目包含了数组、链表、哈希表、字符串、二叉树、动态规划以及图的的题目,常见的输入输出方式都覆盖了。 + +**这是最精华的25道题目**!。 + +## 卡码网长什么样 + +来看看这极简的界面,没有烂七八糟的功能,只有刷题! + +
+ +在「状态」这里可以看到 大家提交的代码和判题记录,目前卡码网([https://kamacoder.com](https://kamacoder.com))几乎无时无刻都有卡友在提交代码。 +看看大家周六晚上都在做什么,刷哪些题目。 + +
+ + +提交代码的界面是这样的,**目前支持所有主流刷题语言**。 + +
+ +## 题解 + +基本大家来卡码网([https://kamacoder.com](https://kamacoder.com))练习ACM模式,都是对输入输出不够了解的,所以想看现成的题解,看看究竟是怎么处理的。 + +所以我用C++把卡码网上25道题目的题解都写了,并发布到Github上: + +[https://github.com/youngyangyang04/kamacoder-solutions](https://github.com/youngyangyang04/kamacoder-solutions) + +
+ +**欢迎去Github上star,欢迎fork,也欢迎来Github仓库贡献其他语言版本,成为contributor**。 + +如果不懂如何和开源项目提交代码,[可以看这里](https://www.programmercarl.com/qita/join.html) + +目前已经有两位录友贡献C和Java版本了。 + +
+ +期待在Github(https://github.com/youngyangyang04/kamacoder-solutions) 的contributors上也出现你的头像。 + +目前题解只有C++代码吗? + +当然不是,大多数题目已经有了 Java、python、C版本。 **其他语言版本,就给录友们成为contributor的机会了**。 + +## 最后 + +卡码网地址:[https://kamacoder.com](https://kamacoder.com) + +快去体验吧,笔试之前最好 把卡码网25道题目都刷完。 + +期待录友们成为最早一批把卡码网刷爆的coder! + diff --git a/problems/qita/algo_pdf.md b/problems/qita/algo_pdf.md new file mode 100755 index 0000000000..76e2d16af1 --- /dev/null +++ b/problems/qita/algo_pdf.md @@ -0,0 +1,70 @@ +# 代码随想录完整版PDF下载 | 合集下载 | 百度云 | + +代码随想录已经是很多学习算法的小伙伴刷题必备的资料,也得到非常多的好评,这是Carl继续创作的动力。 + +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +估计绝大多数录友之前也都下载过代码随想录PDF,但是那是我两年前整理的了。 + +![](https://file1.kamacoder.com/i/algo/20230815200530.png) + +如今,很多题目的讲解都改了上十遍,很多图都重画过。 + +之前的PDF一直都没有全集,而且章节也不全,主要是重点章节:二叉树、回溯算法、贪心、动态规划的整理。 + +也有太多录友和我反馈过:由于XXX原因,自己不能上网,看不了网站,pdf有完整版吗? + +其实录友们的需求我都记下来了,就是工作太多,我只能慢慢一项一项去处理。 + +**虽然慢,但我一直在做**! + +现在代码随想录网站最新的内容以及全集整理完毕。 + +
+ +这份PDF整理的非常精细,并把我的[算法公开课](./gongkaike.md)视频,对应题目的链接都放上去了: + +
+ +这份《代码随想录》PDF 和 《代码随想录》纸质版 和 代码随想录网站基本一致,大家选一个合适自己的阅读方式就好。 + +不过这里我依然建议大家尽量看代码随想录网站(programmercarl.com),因为网站一直都是最新的,也是经常更新的。 + +PDF可以作为辅助,例如不能上网的时候。 + +昨天我在[知识星球](./kstar.md)里第一时间公布这份全版代码随想录PDF下载的消息 + +
+ +同时有我企业微信的录友,都接到了这份PDF的推送: + +
+ +
+ +
+ +
+ +
+ +现在我把它免费分享给录友们,大家可以加我的企业微信,备注:简单自我介绍+pdf ,例如:XX大学研二-pdf 或者 XX城市后端开发-pdf ,通过之后,会直接发给大家的。 + +
+ + + diff --git a/problems/qita/ewaishuoming.md b/problems/qita/ewaishuoming.md new file mode 100755 index 0000000000..7c3f690368 --- /dev/null +++ b/problems/qita/ewaishuoming.md @@ -0,0 +1,16 @@ + + +# 本模块说明 + +本模块题目,暂时没有纳入「代码随想录」算法教程体系之中。 + +* 本模块部分题解还不够完善。 +* 本模块部分题目和「代码随想录」中是相似的。 +* 本模块题解并没有体系化 + +很多录友反馈,除了「代码随想录」还有没有其他题目可以练手,最好也有题解,所以我才把这些题解放出来。本模块题目可以作为大家刷题的一个补充。 + +加油💪 + + + diff --git a/problems/qita/gongkaike.md b/problems/qita/gongkaike.md new file mode 100755 index 0000000000..26c874b0c8 --- /dev/null +++ b/problems/qita/gongkaike.md @@ -0,0 +1,162 @@ + +# 代码随想录算法公开课 | 最强算法公开课 + +和录友们汇报一下,**代码随想录算法公开课**已经更新完毕了。 + +由我亲自录制了140期算法视频,覆盖了 [《代码随想录》纸质版](./publish.md)上全部题目的讲解。 + +视频全部免费开放在[B站:代码随想录](https://www.bilibili.com/video/BV1fA4y1o715) + +目录就在视频播放的右边,完全按照代码随想录的顺序讲解,配合 《代码随想录》或者代码随想录网站一起学习,味道更佳! + +
+ +从在22年的5月份开始决定把《代码随想录》上的算法题都由我亲自讲解一波。 + +当时录了第一期算法视频 「二分查找」: + +
+ +别看现在这期视频有10w的播放量,因为都是后序录友们自己找到我的视频来看的,一年后才到10w播放。 + +当时这个视频发出去,播放量就几百。 + +毕竟这种算法视频和普通娱乐或者范技术类视频没法比,平台也不会推荐的。 + +我的视频播放量虽然低,但只要看过视频的录友,评论都很高。随便找了几个最新的评论: + +![](https://file1.kamacoder.com/i/algo/20221121094718.png) + +![](https://file1.kamacoder.com/i/algo/20230222100337.png) + +![](https://file1.kamacoder.com/i/algo/20230222113111.png) + +![](https://file1.kamacoder.com/i/algo/20230222163023.png) + +![](https://file1.kamacoder.com/i/algo/20230223235500.png) + +![](https://file1.kamacoder.com/i/algo/20230323211739.png) + +![](https://file1.kamacoder.com/i/algo/20230324150536.png) + +![](https://file1.kamacoder.com/i/algo/20230325215454.png) + +![](https://file1.kamacoder.com/i/algo/20230327100147.png) + +![](https://file1.kamacoder.com/i/algo/20230329101702.png) + +![](https://file1.kamacoder.com/i/algo/20230404202808.png) + +当初也是看到大家的评论,我才下决心继续更下去,从 去年5月份,每周坚持更新四期算法视频,雷打不动,一直坚持到现在。 + +![](https://file1.kamacoder.com/i/algo/20230303170120.png) + +一晃 ,大半年过去了,足足更新了 140期算法视频,已经覆盖了 [《代码随想录》纸质版](./publish.md)上全部题目的讲解。 + +**我应该为数不多(至少目前我还没看到)的技术书籍作者能亲自把书中全部内容以视频的方式讲解出来并免费分享给大家的** + +大家可以想一想这些年买过哪些技术书籍,有作者亲自给大家把每章每一节都做视频讲解并免费开放的。 + +**那么看 [《代码随想录》](./publish.md)的录友们就有这个待遇**! + +讲课录视频,其实是很费精力的,大家看视频,可能看我讲的行云流水,其实我都是做了十足的功课。 + +**我平时养成了只要有空的时候就模拟一遍某算法运行过程的习惯,板书更是擦了写写了再擦**,反复尝试那种方式能给大家讲清楚的,然后再开拍视频。 + +可能大家会想,都出书了照着书讲不就好了吗? 应该不难吧? + +如果这么简单的话,可能市面上 很多技术书籍作者们就都亲自讲解一波了。 + +写出来和讲出来还不是一个维度。 + +讲出来需要很综合的能力包括表达力,而且大家看我的算法视频会发现:我是脱稿的,我没有提示词,摄像头开了就开讲 一镜到底。 + +**我是做了非常多练习才达到这个程度**。 + +很多人看到摄像头,就会紧张,没有提示词就不知道自己下句该说什么了,瞬间就会:我是谁,我在哪,我在干什么? + +## 算法公开课质量如何 + +目前国内算法视频的讲解风格,一般是 录屏力扣写代码 或者 ppt演示。 这样其实录制视频难度低了很多。 + +但大家上油管的话,会发现 海外经典算法视频的up ,都是一个小白板直接开讲。 + +
+
+
+ +这种讲课方式 容易走两个极端,**一种就是非常好,成为经典系列,一种就是被喷讲的像垃圾一样**。 + +如果是 录屏或者ppt演示,这样至少有稿件照着读,或者提示词,就算差也不会差到哪去。 + +所以呢,我选择这种白板模拟思路直接手撕代码的讲课方式,也是给自己一个挑战,目前的口碑来看,还有走向了好的那个极端。 + + +关于质量究竟如何,学习效果如何,大家可以去B站上去看(B站同名:[代码随想录](https://www.bilibili.com/video/BV1fA4y1o715)),有口皆碑! + + +## 辛苦录视频为了啥 + +再说说这个辛苦录视频,一忙就忙大半年,投入这么多时间和精力,最后为什么还免费开放。 + +书 + 付费视频讲解 或者 免费网站内容 + 付费视频讲解 或者 免费网站内容 + 部分视频免费 + 部分视频付费,**这些都是非常好的盈利模式**,而且还可持续变现的。 + +以代码随想录目前的影响力来说,我这套140集视频教程,不用很贵,定价99元,每年卖出上万份问题不大。 + +这可是一笔非常可观的收入!(真的很香!)而且还是持续收入,后期还不用什么去维护,不像 [知识星球](./kstar.md) 或者 [算法训练营](./xunlianying.md) 我需要花大量时间给录友们答疑。 + +那我为什么不这么做呢? + +**“代码随想录” 这五个字,我是会用一生去经营的**,凡事要看的长远,不是什么赚钱就立刻要去干什么。 + +这套算法公开课视频,不仅造福录友们,也放大了代码随想录的品牌影响,这是双赢的。 + +**免费硬核的算法内容是 代码随想录的立身之本**,也是 大家为什么学算法学编程首选代码随想录的根本所在。 + +如果有点影响力了,就暗插各种付费,这样不持久! **也会伤了很多录友的心**。 + +所以目前 代码随想录网站(programmercarl.com),代码随想录Github(https://github.com/youngyangyang04/leetcode-master),代码随想录算法公开课(B站:代码随想录),**都是完全免费**,也足够大家学习算法所用。 + +**我的免费算法视频内容,要比绝大多数视频上大家付费的 算法视频课、算法训练营质量要高得多**,视频课程基于《代码随想录》的刷题顺序来录制,会让视频内容非常系统,而不是东一块,西一块的。 + +至于《代码随想录》纸质版的内容其实和代码随想录网站是一样的,很的录友买纸质版是因为习惯看纸质版,有的是仅仅是为了留念和收藏。 + +而且以上开源内容,我还会持续优化迭代的,不会做完了就放着不管,如果一年前刷完代码随想录的录友现在在重看一遍 代码随想录网站,**你会发现很多题解了又多了很多图,又优化了很多讲解内容**。 + +这是我的github提交记录:(https://github.com/youngyangyang04) + +
+ +每天或多或少多要优化一点点。 **每天的量可能不多,但每天都在优化**! + +如果感觉代码随想录网站 和 代码随想录算法公开课对大家确实有帮助,不用买书,欢迎去[豆瓣](https://book.douban.com/subject/35680544/)给一个好评就好,感谢录友们的支持。 + + +## 公开课 + +再回头说说目前算法公开课, 其实直到现在 我新发的视频播放也就两三千的播放量。 + +
+ +(大家现在去B站上去看,可能已经上万播放量,但新发的时候 播放量一直都很惨淡) + +但为什么发视频就两三千播放量,就可以在B站聚集10w录友。 + +
+ +对于B站十万粉的号主来说,好像都得有几个百万播放的爆款视频。 + +**但我的视频从来没有爆款过,也没有被平台推荐过,都是非常稳定的几千播放**。 + +很多录友都是主动搜索找过来的就关注了,或者身边的人推荐来的。 + +只要是真正能给大家带来价值的,真正能让大家学明白算法,就会得到认可。 + +所以,**酒香不怕巷子深,真正有价值的内容,不需要蹭热点,想学习的人一定会找到你**。 + +目前《代码随想录》上的算法讲解视频终于更新完了,后面有就有足够的精力去更图论、排序、高级数据结构了。 + +算法公开课全部发布在B站上,链接直达:[《代码随想录》算法公开课](https://www.bilibili.com/video/BV1fA4y1o715) + +最后,**认准代码随想录,学习算法不迷路**。加油💪🏻 + diff --git a/problems/qita/join.md b/problems/qita/join.md index 027b81726a..232d84ca2f 100644 --- a/problems/qita/join.md +++ b/problems/qita/join.md @@ -28,10 +28,10 @@ 点击这里Fetch upstream。 -
+
点击之后,这里就会显示最新的信息了 -
+
注意这时是你的远端仓库为最新版本,本地还不是最新的,本地要git pull一下。 @@ -39,18 +39,18 @@ 如何提交代码呢,首先把自己的代码提交到自己的fork的远端仓库中,然后open pull request,如图: -
+
点击 open pull request之后,就是如下画面,一个pull request有多个commit。 -
+
然后就是给pull request 添加备注,pull request是对本次commit的一个总结。如果一个pull request就一个commit,那么就和commit的备注保持一次。 然后点击 create pull request 就可以了 -
+
此时你就提交成功了,我会在项目中的pull requests 处理列表里看到你的请求。 -
+
然后如果你发现自己的代码没有合入多半是有问题,如果有问题都有会在pull request里给出留言的, @@ -78,27 +78,27 @@ C++代码 \`\`\` 例如这个commit,在添加java代码的时候,就直接添加代码 -
+
正确的格式应该是这样: -
+
一般发现问题,我也会在代码中给出评论: -
+
这样大家也可以学习一些 提交代码的规范方面的知识 有的录友 是添加的代码块语法,但没有标记是哪种语言,这样的话 代码就不会针对某种语言高亮显示了,也比较影响阅读,例如: -
+
提交python代码的话,要注释好,是python2还是python3 例如这样: -
+
当然python2的话,只这么写就行 @@ -113,7 +113,7 @@ python代码 有的录友是一个pull request 里只有一个commit。 -
+
其实如果大家是平时一天写了两三道题目的话,那么分三个commit,一个pull request提交上来就行。 @@ -127,13 +127,13 @@ python代码 例如这位录友,在提交Java代码的时候,按照题解的意思对Java版本的代码进行的注释,这就很棒👍 -
+
-
+
当然如果大家感觉 已有的代码 不符合以上要求的话,例如 代码思路不够清晰不够规范,注释不够友好,依然欢迎提交优化代码,要记得详细注释哦。 -
+
### 说明具体是哪种方法 @@ -141,10 +141,10 @@ python代码 下面这位录友做的就很好 -
+
-
+
有的题解,是一起给出了多道题目的讲解,例如项目中0102.二叉树的层序遍历.md 中有八道题目,那么大家添加代码的时候 应该在代码注释上,或者 直接写上 是哪个题目的代码。 @@ -162,7 +162,7 @@ python代码 有一位录友在提交代码的时候会把之前的代码 做一下规范性的调整,这就很棒。 -
+
**代码规范从你我做起!** @@ -183,10 +183,10 @@ python代码 在合入的过程中还要处理冲突的代码, 理解大家代码的思路,解决冲突,然后在力扣提交一下,确保是没问题。 例如同一道题目, 一位录友提交了, 我还没处理如何,另一位录友也对这道题也提交了代码,这样就会发生冲突 -
+
大家提交代码的热情太高了,我有时候根本处理不过来,但我必须当天处理完,否则第二天代码冲突会越来越多。 -
+
一天晚上分别有两位录友提交了 30多道 java代码,全部冲突,解决冲突处理的我脖子疼[哭] @@ -201,11 +201,11 @@ python代码 确保这种额外文件不要提交。 -
+
还有添加不同方法的时候,直接用正文格式写,哪种方法就可以了,不要添加目录 ,例如这样,这样整篇文章目录结构就有影响了。 -
+
前面不要加 `## 前序遍历(迭代法)`,直接写`前序遍历(迭代法)`就可以了。 @@ -233,11 +233,11 @@ Go语言代码 甚至发现哪里有语病,也欢迎提交PR来修改,例如下面:就是把【下表】 纠正为【下标】 -
+
不用非要写出牛逼的代码才能提交PR,只要发现 文章中有任何问题,或者错别字,都欢迎提交PR,成为contributor。 -
+
## 特别注意 diff --git a/problems/qita/language.md b/problems/qita/language.md new file mode 100755 index 0000000000..625154e0a5 --- /dev/null +++ b/problems/qita/language.md @@ -0,0 +1,22 @@ + +# 编程语言基础课 + +「代码随想录」的内容是完全免费的。 + +**不过不少录友是编程零基础**,而刷「代码随想录」至少默认你是会一定的编程语言知识的。 + +如果你是编程零基础,又想快速达到刷算法题(或者说刷代码随想录)所需编程语言的水平,推荐 + +* [C++基础课](../ke/cplus.md) +* [Java基础课](../ke/java.md) +* [Python基础课](../ke/python.md) +* [Go基础课](../ke/go.md) +* [Javascript基础课](../ke/js.md) + +如果你有一定数据结构算法知识,想用数据结构做一个小项目的话,推荐: + +* [手写STL(C++)](../ke/stl.md) +* [kv存储-CPP](../ke/kvcplus.md) +* [kv存储-JAVA](../ke/java.md) + + diff --git a/problems/qita/publish.md b/problems/qita/publish.md new file mode 100755 index 0000000000..5a57ec4e4b --- /dev/null +++ b/problems/qita/publish.md @@ -0,0 +1,200 @@ +# 十年所学,终成《代码随想录》 + +**《代码随想录》终于终于正式出版上市了!** (文末附购买链接,直接五折!) + +[B站介绍](https://www.bilibili.com/video/BV13L4y1E7s4/) + +最近这一年不少录友都问我,代码随想录什么时候出版啊? + +**其实我比大家还期待这一刻的到来!** + +先奉上几张书照片:(封面最终选定为梵高的画作,阿姆斯特丹,圣马迪拉莫,1888,海景) + +
+ +
+ +其实在去年,也就是2020年我就已经将这本书的内容写好了,本以为可以很快出版,但我还是严重低估了写书的工作量。 + +因为自己对质量的追求,一直在不断打磨,所以又是一年快过去了。 + +**《代码随想录》总共将近500页,70w字,200多个插图,真的处处都是心血**。 + +出书是一件浩大工程,比写文章难太多了,**真的字字斟酌,大家看书里可能平平淡淡的一句话、一个词语、一个概念,我可能就查阅很多资料,反复推敲:表达是否准确,用词是否到位,生怕辜负了大家的期待**。 + +这是我自己平时书桌的场景: + +
+ +这两年可以说我没有什么娱乐活动,业余生活极其枯燥,都花费在这本书上了,其中艰辛只有自己知道。 + +而此时当大家都能看到《代码随想录》这部作品的时候,其满足感对我来说已经足以。 + +写这本书用了两年,**而真正消化、理解、研究这些算法知识,我用了整整十年**,十年前我就开始写算法文章,妄图闯进算法的大门,这一写就是十年。 + +
+ +**真的是十年所学,两年打磨,终成《代码随想录》!** + +所以当坚持一件事情的时候,一年、两年,甚至三年、五年,不足以看出其效果,但也许坚持十年的时候,才等到真正收获的时刻。 + +## 代码随想录的故事 + +《代码随想录》不是两年憋大招来个横空出世。 + +而是一点一点打磨出来的,其刷题顺序、题解内容、思考深度 都是经过了上10w录友的共同见证。 + +也正是这些内容,把大家汇聚在一起,一起攻克算法的一座又一座高山。 + +与此同时,也几乎每天都会有录友来专门私信我来表达自己的感激: + +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +这些都是大家与“代码随想录”之间的故事,也欢迎大家在文章留言,说一说自己和 “代码随想录”之间的故事。 + +## 《代码随想录》有何不同? + +大家在学习编程、算法,刷题的时候,**真正的苦恼在于没有一套行之有效的刷题顺序**。 + +从何学起,先学什么,再学什么。力扣(Leetcode)上两千道题目,怎么刷,很多人刷题的效率低,主要体现在如下三点: + +* 找题 +* 找到了不合适现阶段做的题 +* 没有全套的优质题解可以参考 + +而市面上基本找不到真正能解决以上痛点的算法书籍。 + +一些书籍是每个知识点蜻蜓点水,然后就叫大家举一反三。 + +一些书籍是一堆题解堆在一起,让大家学起来感受不到知识的连贯性和系统性。 + +断片式的学习,效率怎么能高呢? + +当初我在学习算法的时候,就深感其中的艰难,当我的题量达到一定数量时候,随着反复的琢磨和深入的思考,我再去回顾这些算法题目,**发现如果要是按照合理的顺序来刷题,那效果一定是 事半功倍!** + +所以我将每一个专题中的**题目按照由易到难的顺序进行编排,每一道题目所涉及的知识,前面都会有相应的题目做知识铺垫,做到环环相扣**。 + +**建议大家按照章节顺序阅读本书**,在阅读的过程中会发现我在题目编排上的良苦用心! + +本书不仅在题目编排上精心设计,而且在针对读者最头痛的算法问题上做了详细且深入的讲解。 + +* 关于动态规划,都知道递推公式的重要性,但dp数组的含义、dp数组的初始化、遍历顺序以及如何打印dp数组来排查Bug,这些都很重要。例如,解决背包问题的时候,遍历顺序才是最关键的,也是最难理解的。 + +* 关于回溯算法,题目要求集合之间不可重复,那么就需要去重,各种资料都说要去重,但没有说清楚是“树层去重”还是“树枝去重”——这是我为了说明去重的过程而创造的两个词汇。 + +* 关于KMP算法,都知道使用前缀表进行回退,可什么是前缀表,为什么一定要用前缀表,根据前缀表回退有几种方式,这些却没有说清楚,导致最后大家看的一头雾水。 + +* 关于二叉树,不同的遍历顺序其递归函数究竟如何安排,递归函数什么时候需要返回值,什么时候不用返回值,什么情况下分别使用前、中、后序遍历,迭代法又要如何实现,这些都决定了对二叉树的理解是否到位。 + +同时我针对每一个专题的特点,整理出其通用的解法套路。 + +例如: + +* 在二叉树专题中,总结了递归“三部曲”来帮助读者掌握二叉树中各种遍历方式的写法。 +* 回溯算法中的回溯“三部曲”可以帮助读者理解回溯算法晦涩难懂的过程。 +* 动态规划中的动规“五部曲”可以帮助读者在一套思考框架下去解决动态规划题目。 + +再来说一说动态规划,在程序员面试中,动态规划是公认的最难掌握的算法,也是出现频率最高的算法。 + +**如果仅仅讲解几道题目,即使再举一反三也远远达不到真正理解动态规划的程度**。 + +**如果把动态规划的题目单纯地堆砌在一起,也只会让人越学越懵,陷入“一看就会,一写就废”的怪圈**。 + +讲清楚一道题容易,讲清楚两道题也容易,但把整个动态规划的各个分支讲清楚,把每道题目讲透彻,并用一套方法论把整个动态规划的题目贯彻始终就有难度了。 + +**而帮助大家解决这个问题,这也是这本书的使命所在**。 + +购买方式,可以扫下方二维码,也可以直接[点击这里,京东直达](https://union-click.jd.com/jdc?e=&p=JF8BAMQJK1olXg8EUVhVCkkWAV8IGV8WVAICU24ZVxNJXF9RXh5UHw0cSgYYXBcIWDoXSQVJQwYAUF1UDEsQHDZNRwYlGFh6NVkPcRdyHWwMZRlLHlQDUj02eEcbM244GFIXWQYAUV5VOHsXBF9edVsUXAcDVVtdDUgnAl8IHFkdXw4BU1lfCkoRM2gIEmtIFVpKAxVtOHsUM184G2sWbURsUVpcCEMVAjgIHAxBWFYAAVdfXE8QBGkBGQsdCQEFVgttCkoWB2Y4) + +
+ + +## 目录 + +
+ +
+ +这里不少录友会问,书的内容和Github:https://github.com/youngyangyang04/leetcode-master,和网站:programmercarl.com 有什么区别呢? + +其实写文章相对来说是随意一些的,但书一定要非常严谨。 + +正如我本篇开头所说,书的内容其实一年前就写好的,但排版、纠错、打磨、重新画图,又花费了一年,所以书一定是更精细的,更严谨的。 + +**《代码随想录》的排版看起来非常舒服,会让你发现 原来学算法 会上瘾!** + +
+ +《代码随想录》的推荐语,我都是颇为用心,不是随随便便找个人写一写推荐语来凑数的。 + +
+ +哈工大计算机王院长,百度杰出架构师猛哥,腾讯专家工程师强哥,王道论坛创始人风华哥,**他们是在我学习工作的不同阶段里对我影响非常大的顶级巨佬**。 + +他们的学习方法,做事风格,都是值得每一位技术人学习。同时他们也是每一位技术人的榜样。 + +特别感谢巨佬们能在百忙之中阅读了本书的书稿,并给本书写了评语。 + +## 最后 + +我希望这本书,不仅仅是可以帮助大家学习编程,循序渐进的去学习算法,高效刷题,进大公司。 + +**同时 当你把这本书放在自己的书桌前,床头前的时候,它也会给你一种乘风破浪的勇气!** + +正如封面(梵高,阿姆斯特丹,圣马迪拉莫,1888,海景),一只帆船在波涛汹涌的大海里扬帆远航! + +《代码随想录》这就要和大家见面了,其实很多录友已经迫不及待: + +
+ +
+ +
+ +
+ +这本书原价还挺贵的(毕竟比较厚),但这里申请到了京东五折优惠,大家可以速度下手了。 + +点击下方链接直接五折购买,全网最低价格了。海外的录友们可以在等几天,广州有货之后,就可以配送的海外了。 + +《代码随想录》使用的语言是C++,使用其他语言的录友可以看本书的讲解思路,刷题顺序,然后配合看网站:programmercarl.com,网站上都对应的Java,Python,Go,Js,C,Swift版本 基本可以满足大家的学习需求。 + +购买方式,可以扫下方二维码,也可以直接[点击这里,京东直达](https://union-click.jd.com/jdc?e=&p=JF8BAMQJK1olXg8EUVhVCkkWAV8IGV8WVAICU24ZVxNJXF9RXh5UHw0cSgYYXBcIWDoXSQVJQwYAUF1UDEsQHDZNRwYlGFh6NVkPcRdyHWwMZRlLHlQDUj02eEcbM244GFIXWQYAUV5VOHsXBF9edVsUXAcDVVtdDUgnAl8IHFkdXw4BU1lfCkoRM2gIEmtIFVpKAxVtOHsUM184G2sWbURsUVpcCEMVAjgIHAxBWFYAAVdfXE8QBGkBGQsdCQEFVgttCkoWB2Y4) + +
+ +最后也感谢录友们的陪伴,真心希望大家都有一个好的前程! + +正如《代码随想录》正式出版一样,**你所期盼,终将到来! 加油💪** + + diff --git a/problems/qita/say_feel.md b/problems/qita/say_feel.md new file mode 100755 index 0000000000..00df8c0bf2 --- /dev/null +++ b/problems/qita/say_feel.md @@ -0,0 +1,14 @@ +恭喜你,已经把代码随想录通关了,欢迎在[卡码笔记](https://notes.kamacoder.com/question/102144)记录一下自己的收获,写一篇小作文。 + +不过一刷代码随想录,理解的一定是不到位的,建议二刷之后,对各个经典类型的题目就有自己的想法了。 + +大家可以在自己的博客写一篇 代码随想录一刷总结,记录这阶段性进步的一刻。 + +如果感觉代码随想录对你确实有帮助,不用买书,欢迎去[豆瓣](https://book.douban.com/subject/35680544/)给一个好评就好,代码随想录在豆瓣上被人恶意抹黑,希望录友们可以去说一说自己刷代码随想录的真实感受,感谢录友们的支持。 + +希望大家都能梦想成真,有好的前程,加油💪 + + + + + diff --git a/problems/qita/server.md b/problems/qita/server.md index 72476f5754..890cf8bcd5 100644 --- a/problems/qita/server.md +++ b/problems/qita/server.md @@ -51,7 +51,7 @@ 操作方式这样,我把命令包 包装成一个shell命令,想传那个文件,直接 uploadtomyserver,然后就返回可以下载的链接,这个文件也同时传到了我的服务器上。 -![](https://file.kamacoder.com/pics/20211126165643.png) +![](https://file1.kamacoder.com/i/algo/20211126165643.png) 我也把我的项目代码放在了github上: @@ -93,11 +93,11 @@ https://github.com/youngyangyang04/fileHttpServer 就是这样一个非常普通的查询页面。 -![](https://file.kamacoder.com/pics/20211126160200.png) +![](https://file1.kamacoder.com/i/algo/20211126160200.png) 查询通过之后,就会展现返现群二维码。 -![](https://file.kamacoder.com/pics/20211127160558.png) +![](https://file1.kamacoder.com/i/algo/20211127160558.png) 但要部署在服务器上,因为没有公网IP,别人用不了你的服务。 diff --git a/problems/qita/shejimoshi.md b/problems/qita/shejimoshi.md index 07d5540a25..959a3fa90a 100644 --- a/problems/qita/shejimoshi.md +++ b/problems/qita/shejimoshi.md @@ -7,11 +7,11 @@ 所以卡码网 针对 23种设计,**推出了 23道编程题目,来帮助大家练习设计模式**。 -
+
这里的23到编程题目对应了 23种这几模式。 例如第一题,小明的购物车,就是单例模式: -
+
区别于网上其他教程,本教程的特点是: @@ -40,18 +40,18 @@ 同时还给全部整理到PDF上,这份PDF,我们写的很用心了,来个大家截个图: -
+
-
+
-
+
-
+
关于设计模式的题目,大家现在就可以去 卡码网(kamacoder)去做了。 关于这23道题目对应 设计模式精讲 PDF,也免费分享给录友们,大家可以加我的企业微信获取: -
+
已经有我企业微信的录友,直接发:设计模式,这四个字就好,我会直接发你。 diff --git a/problems/qita/tulunfabu.md b/problems/qita/tulunfabu.md index b45b790d81..8987709564 100644 --- a/problems/qita/tulunfabu.md +++ b/problems/qita/tulunfabu.md @@ -8,7 +8,7 @@ 我知道录友们在等图论等太久了,其实我比大家都着急。 -![大家一直都在催](https://file.kamacoder.com/pics/20240613105618.png) +![大家一直都在催](https://file1.kamacoder.com/i/algo/20240613105618.png) 图论完整版目前已经开放在代码随想录网站:programmercarl.com @@ -20,7 +20,7 @@ * 拓扑排序 * 最短路算法 -![](https://file.kamacoder.com/pics/20240613104436.png) +![](https://file1.kamacoder.com/i/algo/20240613104436.png) **耗时一年之久,代码随想录图论 终于面世了**! @@ -32,21 +32,21 @@ 随便截一些图,大家感受一下: -![](https://file.kamacoder.com/pics/20240613104703.png) +![](https://file1.kamacoder.com/i/algo/20240613104703.png) -![](https://file.kamacoder.com/pics/20240613104824.png) +![](https://file1.kamacoder.com/i/algo/20240613104824.png) -![](https://file.kamacoder.com/pics/20240613104852.png) +![](https://file1.kamacoder.com/i/algo/20240613104852.png) -![](https://file.kamacoder.com/pics/20240613104926.png) +![](https://file1.kamacoder.com/i/algo/20240613104926.png) -![](https://file.kamacoder.com/pics/20240613105007.png) +![](https://file1.kamacoder.com/i/algo/20240613105007.png) -![](https://file.kamacoder.com/pics/20240613105030.png) +![](https://file1.kamacoder.com/i/algo/20240613105030.png) -![](https://file.kamacoder.com/pics/20240613105106.png) +![](https://file1.kamacoder.com/i/algo/20240613105106.png) -![](https://file.kamacoder.com/pics/20240613105143.png) +![](https://file1.kamacoder.com/i/algo/20240613105143.png) 具体内容,大家可以去代码随想录网站(programmercarl.com)去看看,非常精彩! @@ -203,19 +203,19 @@ cout << result[result.size() - 1]; 当大家通过 代码随想录 提升了编程与算法能力,考上研或者找到好工作的时候,于我来说已经是很幸福的事情: -![对笔试帮助大](https://file.kamacoder.com/pics/20230914172536.png) +![对笔试帮助大](https://file1.kamacoder.com/i/algo/20230914172536.png) -![华为od将近满分](https://file.kamacoder.com/pics/20230914172607.png) +![华为od将近满分](https://file1.kamacoder.com/i/algo/20230914172607.png) -![研究生复试](https://file.kamacoder.com/pics/20240621103130.png) +![研究生复试](https://file1.kamacoder.com/i/algo/20240621103130.png) -![红包感谢代码随想录366](https://file.kamacoder.com/pics/20231123151310.png) +![红包感谢代码随想录366](https://file1.kamacoder.com/i/algo/20231123151310.png) -![上岸亚马逊](https://file.kamacoder.com/pics/20240206174151.png) +![上岸亚马逊](https://file1.kamacoder.com/i/algo/20240206174151.png) -![](https://file.kamacoder.com/pics/20220718094112.png) +![](https://file1.kamacoder.com/i/algo/20220718094112.png) -![](https://file.kamacoder.com/pics/20220718094332.png) +![](https://file1.kamacoder.com/i/algo/20220718094332.png) 至此**图论内容 已完全免费开放在代码随想录网站(programmercarl.com),造福广大学习编程的录友们**! diff --git a/problems/qita/tulunshuoming.md b/problems/qita/tulunshuoming.md new file mode 100755 index 0000000000..9d6e761ca8 --- /dev/null +++ b/problems/qita/tulunshuoming.md @@ -0,0 +1,44 @@ + +# 图论模块说明 + + +非常多录友在催更图论,同时大家也反馈面试中深搜广搜也最近常考的类型。 + +其实在代码随想录中的二叉树和回溯算法章节中已经讲过深搜和广搜,二叉树的遍历就是深搜和广搜在二叉树结构上的应用, 而回溯算法本身就是深搜,只不过利用其回溯的过程。 + +那么在图论中,深搜和广搜就是在图上的遍历,图的存储方式一般是 邻接表和邻接矩阵。 + +我已经在更新图论ing,不过还没有跟更新完,**之前计划是把更新完的部分先分享给[训练营](./xunlianying.html)和 [知识星球](./kstar.md) 录友,等全部更新完之后在完整的分享到网站上**。 + +不过其他录友们也很着急,我也算更新了不少了,就先分享出来给大家吧。 + +**我一直坚持给大家打造最硬核的算法教程而且是免费的!这一点一直都不会变!**。 + +(**注意图论章节还没有更新完,还有更精彩的内容在路上**) + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/problems/qita/update.md b/problems/qita/update.md new file mode 100755 index 0000000000..c562fd4b3c --- /dev/null +++ b/problems/qita/update.md @@ -0,0 +1,56 @@ + +## 2021年 8月11日 + +[代码随想录网站正式上线](https://mp.weixin.qq.com/s/-6rd_g7LrVD1fuKBYk2tXQ) + +## 2021年 10月19日 + +更新Java,Python,JS,Go版本题解 + +## 2022年 1月17日 + +添加评论功能和阅读量统计。 + +为了方便大家阅读,使用无需登录的评论插件 valine。 + +但由于本站访问量太大,leancloud的api调用超过3w次,就只能用付费版本了,本站使用2个小时之后就超过了3w次条用,而付费版本一年要上万块。 + +免费的网站实在承担不起,所以仅在部分页面添加的评论区。 + +例如各个专题中的理论基础和本章总结,都添加的评论区。 + +## 2022年 2月22日 + +升级内存和带宽以应对更大的访问量 + +## 2022年 5月12日 + +更新[星球生活](https://programmercarl.com/other/)专栏,题解支持C、TypeScript 语言版本 + +## 2022年 5月19日 + +补充[额外题目](https://programmercarl.com/other/ewaishuoming.html) + +## 2022年 6月10日 + +添加边框,可以方便调节黑暗模式,开始加入Scala 和 C# 语言版本。 + +## 2023年 5月8日 + +题解都配上了《代码随想录》算法公开课视频讲解 + +## 2023年 9月11日 + +更新部分图论内容,深搜广搜和并查集 + +## 2024年 4月7日 + +由于访问量过大,网站访问速度慢一直被很多录友诟病,特别是海外录友访问更卡。 + +这次网站全部上CDN,全球加速,方便全球录友学习。 + +同时添加github评论区,录友可以在每篇文章下打卡了! + +## 更多精彩,敬请期待 + + diff --git "a/problems/\344\270\272\344\272\206\347\273\235\346\235\200\347\274\226\350\276\221\350\267\235\347\246\273\357\274\214\345\215\241\345\260\224\345\201\232\344\272\206\344\270\211\346\255\245\351\223\272\345\236\253.md" "b/problems/\344\270\272\344\272\206\347\273\235\346\235\200\347\274\226\350\276\221\350\267\235\347\246\273\357\274\214\345\215\241\345\260\224\345\201\232\344\272\206\344\270\211\346\255\245\351\223\272\345\236\253.md" old mode 100644 new mode 100755 diff --git "a/problems/\344\272\214\345\217\211\346\240\221\344\270\255\351\200\222\345\275\222\345\270\246\347\235\200\345\233\236\346\272\257.md" "b/problems/\344\272\214\345\217\211\346\240\221\344\270\255\351\200\222\345\275\222\345\270\246\347\235\200\345\233\236\346\272\257.md" old mode 100644 new mode 100755 diff --git "a/problems/\344\272\214\345\217\211\346\240\221\346\200\273\347\273\223\347\257\207.md" "b/problems/\344\272\214\345\217\211\346\240\221\346\200\273\347\273\223\347\257\207.md" old mode 100644 new mode 100755 index a67cf5db9d..7d25d81876 --- "a/problems/\344\272\214\345\217\211\346\240\221\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\346\200\273\347\273\223\347\257\207.md" @@ -147,7 +147,7 @@ 二叉树专题汇聚为一张图: -![](https://file.kamacoder.com/pics/20211030125421.png) +![](https://file1.kamacoder.com/i/algo/20211030125421.png) 这个图是 [代码随想录知识星球](https://programmercarl.com/other/kstar.html) 成员:[青](https://wx.zsxq.com/dweb2/index/footprint/185251215558842),所画,总结的非常好,分享给大家。 diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" old mode 100644 new mode 100755 index 1fbbc9d934..a68f93a901 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -15,7 +15,7 @@ 题目分类大纲如下: -二叉树大纲 +二叉树大纲 说到二叉树,大家对于二叉树其实都很熟悉了,本文呢我也不想教科书式的把二叉树的基础内容再啰嗦一遍,所以以下我讲的都是一些比较重点的内容。 @@ -31,7 +31,7 @@ 如图所示: - + 这棵二叉树为满二叉树,也可以说深度为k,有2^k-1个节点的二叉树。 @@ -46,7 +46,7 @@ 我来举一个典型的例子如题: - + 相信不少同学最后一个二叉树是不是完全二叉树都中招了。 @@ -63,7 +63,7 @@ 下面这两棵树都是搜索树 - + ### 平衡二叉搜索树 @@ -72,7 +72,7 @@ 如图: - + 最后一棵 不是平衡二叉树,因为它的左右两个子树的高度差的绝对值超过了1。 @@ -91,13 +91,13 @@ 链式存储如图: - + 链式存储是大家很熟悉的一种方式,那么我们来看看如何顺序存储呢? 其实就是用数组来存储二叉树,顺序存储的方式如图: - + 用数组来存储二叉树如何遍历的呢? @@ -144,7 +144,7 @@ 大家可以对着如下图,看看自己理解的前后中序有没有问题。 - + 最后再说一说二叉树中深度优先和广度优先遍历实现方式,我们做二叉树相关题目,经常会使用递归的方式来实现深度优先遍历,也就是实现前中后序遍历,使用递归是比较方便的。 diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\347\273\237\344\270\200\350\277\255\344\273\243\346\263\225.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\347\273\237\344\270\200\350\277\255\344\273\243\346\263\225.md" old mode 100644 new mode 100755 index d001e0f7a7..803b25ae80 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\347\273\237\344\270\200\350\277\255\344\273\243\346\263\225.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\347\273\237\344\270\200\350\277\255\344\273\243\346\263\225.md" @@ -67,7 +67,7 @@ public: 看代码有点抽象我们来看一下动画(中序遍历): -![中序遍历迭代(统一写法)](https://code-thinking.cdn.bcebos.com/gifs/%E4%B8%AD%E5%BA%8F%E9%81%8D%E5%8E%86%E8%BF%AD%E4%BB%A3%EF%BC%88%E7%BB%9F%E4%B8%80%E5%86%99%E6%B3%95%EF%BC%89.gif) +![中序遍历迭代(统一写法)](https://file1.kamacoder.com/i/algo/%E4%B8%AD%E5%BA%8F%E9%81%8D%E5%8E%86%E8%BF%AD%E4%BB%A3%EF%BC%88%E7%BB%9F%E4%B8%80%E5%86%99%E6%B3%95%EF%BC%89.gif) 动画中,result数组就是最终结果集。 diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" old mode 100644 new mode 100755 index e011612ca6..efa07d97d9 --- "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" +++ "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" @@ -38,7 +38,7 @@ 动画如下: -![二叉树前序遍历(迭代法)](https://code-thinking.cdn.bcebos.com/gifs/%E4%BA%8C%E5%8F%89%E6%A0%91%E5%89%8D%E5%BA%8F%E9%81%8D%E5%8E%86%EF%BC%88%E8%BF%AD%E4%BB%A3%E6%B3%95%EF%BC%89.gif) +![二叉树前序遍历(迭代法)](https://file1.kamacoder.com/i/algo/%E4%BA%8C%E5%8F%89%E6%A0%91%E5%89%8D%E5%BA%8F%E9%81%8D%E5%8E%86%EF%BC%88%E8%BF%AD%E4%BB%A3%E6%B3%95%EF%BC%89.gif) 不难写出如下代码: (**注意代码中空节点不入栈**) @@ -85,7 +85,7 @@ public: 动画如下: -![二叉树中序遍历(迭代法)](https://code-thinking.cdn.bcebos.com/gifs/%E4%BA%8C%E5%8F%89%E6%A0%91%E4%B8%AD%E5%BA%8F%E9%81%8D%E5%8E%86%EF%BC%88%E8%BF%AD%E4%BB%A3%E6%B3%95%EF%BC%89.gif) +![二叉树中序遍历(迭代法)](https://file1.kamacoder.com/i/algo/%E4%BA%8C%E5%8F%89%E6%A0%91%E4%B8%AD%E5%BA%8F%E9%81%8D%E5%8E%86%EF%BC%88%E8%BF%AD%E4%BB%A3%E6%B3%95%EF%BC%89.gif) **中序遍历,可以写出如下代码:** @@ -117,7 +117,7 @@ public: 再来看后序遍历,先序遍历是中左右,后序遍历是左右中,那么我们只需要调整一下先序遍历的代码顺序,就变成中右左的遍历顺序,然后在反转result数组,输出的结果顺序就是左右中了,如下图: -![前序到后序](https://file.kamacoder.com/pics/20200808200338924.png) +![前序到后序](https://file1.kamacoder.com/i/algo/20200808200338924.png) **所以后序遍历只需要前序遍历的代码稍作修改就可以了,代码如下:** diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" old mode 100644 new mode 100755 diff --git "a/problems/\345\211\215\345\272\217/ACM\346\250\241\345\274\217.md" "b/problems/\345\211\215\345\272\217/ACM\346\250\241\345\274\217.md" index f1ff3a5ffc..70643b7e49 100644 --- "a/problems/\345\211\215\345\272\217/ACM\346\250\241\345\274\217.md" +++ "b/problems/\345\211\215\345\272\217/ACM\346\250\241\345\274\217.md" @@ -5,15 +5,15 @@ 平时大家在力扣上刷题,就是 核心代码模式,即给你一个函数,直接写函数实现,例如这样: -![](https://file.kamacoder.com/pics/20231109193631.png) +![](https://file1.kamacoder.com/i/algo/20231109193631.png) 而ACM模式,是程序头文件,main函数,数据的输入输出都要自己处理,例如这样: -![](https://file.kamacoder.com/pics/20231109193743.png) +![](https://file1.kamacoder.com/i/algo/20231109193743.png) 大家可以发现 右边代码框什么都没有,程序从头到尾都需要自己实现,本题如果写完代码是这样的: (细心的录友可以发现和力扣上刷题是不一样的) -![](https://file.kamacoder.com/pics/20231109193931.png) +![](https://file1.kamacoder.com/i/algo/20231109193931.png) **如果大家从一开始学习算法就一直在力扣上的话,突然切到ACM模式会非常不适应**。 @@ -21,15 +21,15 @@ 知识星球里也有很多录友,因为不熟悉ACM模式在面试的过程中吃了不少亏。 -
+
-
+
-
+
-
+
-
+
## 面试究竟怎么考? @@ -53,7 +53,7 @@ 你只要能把卡码网首页的25道题目 都刷了 ,就把所有的ACM输入输出方式都练习到位了,不会有任何盲区。 -![](https://file.kamacoder.com/pics/20231109195056.png) +![](https://file1.kamacoder.com/i/algo/20231109195056.png) 而且你不用担心,题目难度太大,直接给自己劝退,**卡码网的前25道题目都是我精心制作的,难度也是循序渐进的**,大家去刷一下就知道了。 diff --git "a/problems/\345\211\215\345\272\217/ACM\346\250\241\345\274\217\345\246\202\344\275\225\346\236\204\345\273\272\344\272\214\345\217\211\346\240\221.md" "b/problems/\345\211\215\345\272\217/ACM\346\250\241\345\274\217\345\246\202\344\275\225\346\236\204\345\273\272\344\272\214\345\217\211\346\240\221.md" index 086e6e0ea0..2eeb7431bf 100644 --- "a/problems/\345\211\215\345\272\217/ACM\346\250\241\345\274\217\345\246\202\344\275\225\346\236\204\345\273\272\344\272\214\345\217\211\346\240\221.md" +++ "b/problems/\345\211\215\345\272\217/ACM\346\250\241\345\274\217\345\246\202\344\275\225\346\236\204\345\273\272\344\272\214\345\217\211\346\240\221.md" @@ -15,7 +15,7 @@ 其输入用例,就是用一个数组来表述 二叉树,如下: -![](https://file.kamacoder.com/pics/20210914222335.png) +![](https://file1.kamacoder.com/i/algo/20210914222335.png) 一直跟着公众号学算法的录友 应该知道,我在[二叉树:构造二叉树登场!](https://mp.weixin.qq.com/s/Dza-fqjTyGrsRw4PWNKdxA),已经讲过,**只有 中序与后序 和 中序和前序 可以确定一棵唯一的二叉树。 前序和后序是不能确定唯一的二叉树的**。 @@ -24,7 +24,7 @@ 很明显,是后台直接明确了构造规则。 再看一下 这个 输入序列 和 对应的二叉树。 -![](https://file.kamacoder.com/pics/20210914222335.png) +![](https://file1.kamacoder.com/i/algo/20210914222335.png) 从二叉树 推导到 序列,大家可以发现这就是层序遍历。 @@ -36,7 +36,7 @@ 顺序存储,就是用一个数组来存二叉树,其方式如图所示: -![](https://file.kamacoder.com/pics/20210914223147.png) +![](https://file1.kamacoder.com/i/algo/20210914223147.png) 那么此时大家是不是应该知道了,数组如何转化成 二叉树了。**如果父节点的数组下标是i,那么它的左孩子下标就是i * 2 + 1,右孩子下标就是 i * 2 + 2**。 @@ -80,7 +80,7 @@ TreeNode* construct_binary_tree(const vector& vec) { 这个函数最后返回的 指针就是 根节点的指针, 这就是 传入二叉树的格式了,也就是 力扣上的用例输入格式,如图: -![](https://file.kamacoder.com/pics/20210914224422.png) +![](https://file1.kamacoder.com/i/algo/20210914224422.png) 也有不少同学在做ACM模式的题目,就经常疑惑: @@ -176,7 +176,7 @@ int main() { 和 [538.把二叉搜索树转换为累加树](https://mp.weixin.qq.com/s/rlJUFGCnXsIMX0Lg-fRpIw) 中的输入是一样的 -![](https://file.kamacoder.com/pics/20210914222335.png) +![](https://file1.kamacoder.com/i/algo/20210914222335.png) 这里可能又有同学疑惑,你这不一样啊,题目是null,你为啥用-1。 @@ -184,11 +184,11 @@ int main() { 在来看,测试代码输出的效果: -![](https://file.kamacoder.com/pics/20210914230045.png) +![](https://file1.kamacoder.com/i/algo/20210914230045.png) 可以看出和 题目中输入用例 这个图 是一样一样的。 只不过题目中图没有把 空节点 画出来而已。 -![](https://file.kamacoder.com/pics/20210914230118.png) +![](https://file1.kamacoder.com/i/algo/20210914230118.png) 大家可以拿我的代码去测试一下,跑一跑。 @@ -205,7 +205,7 @@ int main() { **[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)**里有的录友已经开始三刷: -![](https://file.kamacoder.com/pics/20210727234031.png) +![](https://file1.kamacoder.com/i/algo/20210727234031.png) 只做过一遍,真的就是懂了一点皮毛, 第二遍刷才有真的对各个题目有较为深入的理解,也会明白 我为什么要这样安排刷题的顺序了。 @@ -419,4 +419,4 @@ func main() { ``` ----------------------- -
+
diff --git "a/problems/\345\211\215\345\272\217/BAT\347\272\247\345\210\253\346\212\200\346\234\257\351\235\242\350\257\225\346\265\201\347\250\213\345\222\214\346\263\250\346\204\217\344\272\213\351\241\271\351\203\275\345\234\250\350\277\231\351\207\214\344\272\206.md" "b/problems/\345\211\215\345\272\217/BAT\347\272\247\345\210\253\346\212\200\346\234\257\351\235\242\350\257\225\346\265\201\347\250\213\345\222\214\346\263\250\346\204\217\344\272\213\351\241\271\351\203\275\345\234\250\350\277\231\351\207\214\344\272\206.md" index 27940f1bd5..7d112a19c8 100644 --- "a/problems/\345\211\215\345\272\217/BAT\347\272\247\345\210\253\346\212\200\346\234\257\351\235\242\350\257\225\346\265\201\347\250\213\345\222\214\346\263\250\346\204\217\344\272\213\351\241\271\351\203\275\345\234\250\350\277\231\351\207\214\344\272\206.md" +++ "b/problems/\345\211\215\345\272\217/BAT\347\272\247\345\210\253\346\212\200\346\234\257\351\235\242\350\257\225\346\265\201\347\250\213\345\222\214\346\263\250\346\204\217\344\272\213\351\241\271\351\203\275\345\234\250\350\277\231\351\207\214\344\272\206.md" @@ -211,4 +211,4 @@ leetcode是专门针对算法练习的题库,leetcode现在也推出了中文 ----------------------- -
+
diff --git "a/problems/\345\211\215\345\272\217/gitserver.md" "b/problems/\345\211\215\345\272\217/gitserver.md" new file mode 100755 index 0000000000..caf93ec6ec --- /dev/null +++ "b/problems/\345\211\215\345\272\217/gitserver.md" @@ -0,0 +1,312 @@ + +# 一文手把手教你搭建Git私服 + +## 为什么要搭建Git私服 + +很多同学都问文章,文档,资料怎么备份啊,自己电脑和公司电脑怎么随时同步资料啊等等,这里呢我写一个搭建自己的git私服的详细教程 + +为什么要搭建一个Git私服呢,而不是用Github免费的私有仓库,有以下几点: +* Github 私有仓库真的慢,文件一旦多了,或者有图片文件,git pull 的时候半天拉不下来 +* 自己的文档难免有自己个人信息,放在github心里也是担心的 +* 想建几个库就建几个,想几个人合作开发都可以,不香么? + +**网上可以搜到很多git搭建,但是说的模棱两可**,而且有的直接是在本地搭建git服务,既然是备份,搭建在本地哪有备份的意义,一定要有一个远端服务器, 而且自己的电脑和公司的电脑还是同步自己的文章,文档和资料等等。 + + +适合人群: 想通过git私服来备份自己的文章,Markdown,并做版本管理的同学 +最后,写好每篇 Chat 是对我的责任,也是对你的尊重。谢谢大家~ + +正文如下: + +----------------------------- + +## 如何找到可以外网访问服务器 + +有的同学问了,自己的电脑就不能作为服务器么? + +这里要说一下,安装家庭带宽,运营商默认是不会给我们独立分配公网IP的 + +一般情况下是一片区域公用一个公网IP池,所以外网是不能访问到在家里我们使用的电脑的 + +除非我们自己去做映射,这其实非常麻烦而且公网IP池 是不断变化的 + +辛辛苦苦做了映射,运营商给IP一换,我们的努力就白扯了 + +那我们如何才能找到一个外网可以访问的服务器呢,此时云计算拯救了我们。 + +推荐大家选一家云厂商(阿里云,腾讯云,百度云都可以)在上面上买一台云服务器 + +* [阿里云活动期间服务器购买](https://www.aliyun.com/minisite/goods?taskCode=shareNew2205&recordId=3641992&userCode=roof0wob) +* [腾讯云活动期间服务器购买](https://curl.qcloud.com/EiaMXllu) + +云厂商经常做活动,如果从来没有买过云服务器的账号更便宜,低配一年一百块左右的样子,强烈推荐一起买个三年。 + +买云服务器的时候推荐直接安装centos系统。 + +这里要说一下,有了自己的云服务器之后 不仅仅可以用来做git私服 + +**同时还可以做网站,做程序后台,跑程序,做测试**(这样我们自己的电脑就不会因为自己各种搭建环境下载各种包而搞的的烂糟糟),等等等。 + +有自己云服务器和一个公网IP真的是一件非常非常幸福的事情,能体验到自己的服务随时可以部署上去提供给所有人使用的喜悦。 + +外网可以访问的服务器解决了,接下来就要部署git服务了 + +本文将采用centos系统来部署git私服 + +## 服务器端安装Git + +切换至root账户 + +``` +su root +``` + +看一下服务器有没有安装git,如果出现下面信息就说明是有git的 +``` +[root@instance-5fcyjde7 ~]# git +usage: git [--version] [--help] [-c name=value] + [--exec-path[=]] [--html-path] [--man-path] [--info-path] + [-p|--paginate|--no-pager] [--no-replace-objects] [--bare] + [--git-dir=] [--work-tree=] [--namespace=] + [] + +The most commonly used git commands are: + add Add file contents to the index + bisect Find by binary search the change that introduced a bug + branch List, create, or delete branches + checkout Checkout a branch or paths to the working tree + clone Clone a repository into a new directory + commit Record changes to the repository + diff Show changes between commits, commit and working tree, etc + fetch Download objects and refs from another repository + grep Print lines matching a pattern + init Create an empty Git repository or reinitialize an existing one + log Show commit logs + merge Join two or more development histories together + mv Move or rename a file, a directory, or a symlink + pull Fetch from and merge with another repository or a local branch + push Update remote refs along with associated objects + rebase Forward-port local commits to the updated upstream head + reset Reset current HEAD to the specified state + rm Remove files from the working tree and from the index + show Show various types of objects + status Show the working tree status + tag Create, list, delete or verify a tag object signed with GPG + +'git help -a' and 'git help -g' lists available subcommands and some +concept guides. See 'git help ' or 'git help ' +to read about a specific subcommand or concept. +``` + +如果没有git,就安装一下,yum安装的版本默认是 `1.8.3.1` + +``` +yum install git +``` + +安装成功之后,看一下自己安装的版本 + +``` +git --version +``` + +## 服务器端设置Git账户 + +创建一个git的linux账户,这个账户只做git私服的操作,也是为了安全起见 + +如果不新创建一个linux账户,在自己的常用的linux账户下创建的话,哪天手抖 来一个`rm -rf *` 操作 数据可全没了 + +**这里linux git账户的密码设置的尽量复杂一些,我这里为了演示,就设置成为'gitpassword'** +``` +adduser git +passwd gitpassword +``` + +然后就要切换成git账户,进行后面的操作了 +``` +[root@instance-5fcyjde7 ~]# su - git +``` + +看一下自己所在的目录,是不是在git目录下面 + +``` +[git@instance-5fcyjde7 ~]$ pwd +/home/git +``` + +## 服务器端密钥管理 + +创建`.ssh` 目录,如果`.ssh` 已经存在了,可以忽略这一项 + +为啥用配置ssh公钥呢,同学们记不记得我使用github上传代码的时候也要把自己的公钥配置上传到github上 + +这也是方面每次操作git仓库的时候不用再去输入密码 + +``` +cd ~/ +mkdir .ssh +``` + +进入.ssh 文件下,创建一个 `authorized_keys` 文件,这个文件就是后面就是要放我们客户端的公钥 + +``` +cd ~/.ssh +touch authorized_keys +``` + +别忘了`authorized_keys`给设置权限,很多同学发现自己不能免密登陆,都是因为忘记了给`authorized_keys` 设置权限 + +``` +chmod 700 /home/git/.ssh +chmod 600 /home/git/.ssh/authorized_keys +``` + +接下来我们要把客户端的公钥放在git服务器上,我们在回到客户端,创建一个公钥 + +在我们自己的电脑上,有公钥和私钥 两个文件分别是:`id_rsa` 和 `id_rsa.pub` + +如果是`windows`系统公钥私钥的目录在`C:\Users\用户名\.ssh` 下 + +如果是mac 或者 linux, 公钥和私钥的目录这里 `cd ~/.ssh/`, 如果发现自己的电脑上没有公钥私钥,那就自己创建一个 + +创建密钥的命令 + +``` +ssh-keygen -t rsa +``` + +创建密钥的过程中,一路点击回车就可以了。不需要填任何东西 + +把公钥拷贝到git服务器上,将我们刚刚生成的`id_rsa.pub`,拷贝到git服务器的`/home/git/.ssh/`目录 + +在git服务器上,将公钥添加到`authorized_keys` 文件中 + +``` +cd /home/git/.ssh/ +cat id_rsa.pub >> authorized_keys +``` + +如何看我们配置的密钥是否成功呢, 在客户端直接登录git服务器,看看是否是免密登陆 +``` +ssh git@git服务器ip +``` + +例如: + +``` +ssh git@127.0.0.1 +``` + +如果可以免密登录,那就说明服务器端密钥配置成功了 + +## 服务器端部署Git 仓库 + +我们在登陆到git 服务器端,切换为成 git账户 + +如果是root账户切换成git账户 +``` +su - git +``` + +如果是其他账户切换为git账户 +``` +sudo su - git +``` + +进入git目录下 +``` +cd ~/git +``` + +创建我们的第一个Git私服的仓库,我们叫它为world仓库 + +那么首先创建一个文件夹名为: world.git ,然后进入这个目录 + +有同学问,为什么文件夹名字后面要放`.git`, 其实不这样命名也是可以的 + +但是细心的同学可能注意到,我们平时在github上 `git clone` 其他人的仓库的时候,仓库名字后面,都是加上`.git`的 + +例如下面这个例子,其实就是github对仓库名称的一个命名规则,所以我们也遵守github的命名规则。 + +``` +git clone https://github.com/youngyangyang04/NoSQLAttack.git +``` + +所以我们的操作是 +``` +[git@localhost git]# mkdir world.git +[git@localhost git]# cd world.git +``` + +初始化我们的`world`仓库 + +``` +git init --bare + +``` + +**如果我们想创建多个仓库,就在这里创建多个文件夹并初始化就可以了,和world仓库的操作过程是一样一样的** + +现在我们服务端的git仓库就部署完了,接下来就看看客户端,如何使用这个仓库呢 + +## 客户端连接远程仓库 + +我们在自己的电脑上创建一个文件夹 也叫做`world`吧 + +其实这里命名是随意的,但是我们为了和git服务端的仓库名称保持同步。 这样更直观我们操作的是哪一个仓库。 + +``` +mkdir world +cd world +``` + +进入world文件,并初始化操作 + +``` +cd world +git init +``` + +在world目录上创建一个测试文件,并且将其添加到git版本管理中 + +``` +touch test +git add test +git commit -m "add test file" +``` + +将次仓库和远端仓库同步 + +``` +git remote add origin git@git服务器端的ip:world.git +git push -u origin master +``` + +此时这个test测试文件就已经提交到我们的git远端私服上了 + +## Git私服安全问题 + +这里有两点安全问题 + +### linux git的密码不要泄露出去 + +否则,别人可以通过 ssh git@git服务器IP 来登陆到你的git私服服务器上 + +当然了,这里同学们如果买的是云厂商的云服务器的话 + +如果有人恶意想通过 尝试不同密码链接的方式来链接你的服务器,重试三次以上 + +这个客户端的IP就会被封掉,同时邮件通知我们可以IP来自哪里 + +所以大可放心 密码只要我们不泄露出去,基本上不会有人同时不断尝试密码的方式来登上我们的git私服服务器 + +### 私钥文件`id_rsa` 不要给别人 + +如果有人得到了这个私钥,就可以免密码登陆我们的git私服上了,我相信大家也不至于把自己的私钥主动给别人吧 + +## 总结 + +这里就是整个git私服搭建的全过程,安全问题我也给大家列举了出来,接下来好好享受自己的Git私服吧 + +**enjoy!** + diff --git "a/problems/\345\211\215\345\272\217/kvstore.md" "b/problems/\345\211\215\345\272\217/kvstore.md" new file mode 100755 index 0000000000..268fc018c7 --- /dev/null +++ "b/problems/\345\211\215\345\272\217/kvstore.md" @@ -0,0 +1,124 @@ + +# 手把手带你实现存储引擎 + + +之前在 [刷题攻略登上榜首](https://mp.weixin.qq.com/s/wZRTrA9Rbvgq1yEkSw4vfQ)这篇文章中说过,Carl不仅写了刷题攻略,还写了很多优秀的开源项目。 + +在星球里也有很多小伙伴问我关于一些,项目的选择,**相信如果是C++后台开发路线的话,基本都会去做WebServer 服务器**。 + +我在[知识星球](https://programmercarl.com/other/kstar.html)给小伙伴答疑,包括看了这么多简历,**发现WebServer这个项目是真的多,有点烂大街了**。 + +所以今天我把自己曾经开发的 KV存储引擎 给大家介绍一波,大家可以拿去当做自己的项目经验。 + +**相信只要是搞后端的同学应该都要熟悉非关系型数据库redis吧,那么应该知道redis的存储引擎是跳表实现的**。 + +现在很多云厂商提供的云数据库,其底层都是用了Facebook开源的rocksdb,而rocksdb的底层是Google开源的Levedb,**而Levedb的核心实现也是跳表**。 + +所以大家应该知道跳表的应用有多么的广泛了。 + +那么为什么这个项目非常合适大家用来做自己的项目经验呢? + +如果你是后端开发的话,你在简历上一定会写熟悉或者了解redis吧,那么可以进一步介绍一下自己的项目用跳表实现了redis核心引擎。 + +面试官一定会非常感兴趣的,然后你就可以和面试官侃侃而谈你是如何用跳表实现的这个KV存储引擎的。 + +**瞬间逼格就高了,有木有!** + +我在18年的时候,用跳表实现了一个轻量级KV存储引擎,代码也写的非常规范,熟悉我的录友应该知道,我的代码严格按照Google C++ style来的。 + +因为当时我是想把这个项目国际化的,注释和readme都是英文的,但最近我把这个项目又汉化回来了,方便大家理解。 + +给大家先随意看一段代码,我在注释中其实就已经在讲解跳表的运行原理了。代码使用了C++模板编程,这样接口支持任意类型的数据(包括自己自定义的类) + +![](https://file1.kamacoder.com/i/algo/20221104121454.png) + +项目地址:**https://github.com/youngyangyang04/Skiplist-CPP** + +这个项目中的代码质量是非常高的,如果无论是C++特性的运用,还是代码风格都是绝对拿得出手的! + +好了,牛逼吹完,然后给大家正式介绍一下这个项目 + +## KV存储引擎 + +本项目就是基于跳表实现的轻量级键值型存储引擎,使用C++实现。插入数据、删除数据、查询数据、数据展示、数据落盘、文件加载数据,以及数据库大小显示。 + +在随机写读情况下,该项目每秒可处理啊请求数(QPS): 24.39w,每秒可处理读请求数(QPS): 18.41w + +## 项目展示 + +![](https://file1.kamacoder.com/i/algo/20221104121509.png) + +文件功能: + +* main.cpp 包含skiplist.h使用跳表进行数据操作 +* skiplist.h 跳表核心实现 +* README.md 中文介绍 +* README-en.md 英文介绍 +* bin 生成可执行文件目录 +* makefile 编译脚本 +* store 数据落盘的文件存放在这个文件夹 +* stress_test_start.sh 压力测试脚本 +* LICENSE 使用协议 + + +## 提供接口 + +* insertElement(插入数据) +* deleteElement(删除数据) +* searchElement(查询数据) +* displayList(展示已存数据) +* dumpFile(数据落盘) +* loadFile(文件加载数据) +* size(返回数据规模) + +## 存储引擎数据表现 + +### 插入操作 + +跳表树高:18 + +采用随机插入数据测试: + + +|插入数据规模(万条) |耗时(秒) | +|---|---| +|10 |0.316763 | +|50 |1.86778 | +|100 |4.10648 | + + +每秒可处理写请求数(QPS): 24.39w + +### 取数据操作 + +|取数据规模(万条) |耗时(秒) | +|---|---| +|10|0.47148 |10| +|50|2.56373 |50| +|100|5.43204 |100| + +每秒可处理读请求数(QPS): 18.41w + +## 项目运行方式 + +``` +make // complie demo main.cpp +./bin/main // run +``` + +运行截图:(其中展示了插入数据,删除数据,展示数据等等功能) + +![](https://file1.kamacoder.com/i/algo/20221104121525.png) + +如果想自己写程序使用这个kv存储引擎,只需要在你的CPP文件中include skiplist.h 就可以了。 + +可以运行如下脚本测试kv存储引擎的性能(当然你可以根据自己的需求进行修改) + +``` +sh stress_test_start.sh +``` + +项目地址:**https://github.com/youngyangyang04/Skiplist-CPP** + +**大家白嫖的同时,别忘了给个star,fork,支持一波!** 录友如果最后拿到offer了,也别忘了和我道个喜哦。 + diff --git "a/problems/\345\211\215\345\272\217/server.md" "b/problems/\345\211\215\345\272\217/server.md" new file mode 100755 index 0000000000..890cf8bcd5 --- /dev/null +++ "b/problems/\345\211\215\345\272\217/server.md" @@ -0,0 +1,129 @@ + +# 一台服务器有什么用! + +* [阿里云活动期间服务器购买](https://www.aliyun.com/minisite/goods?taskCode=shareNew2205&recordId=3641992&userCode=roof0wob) +* [腾讯云活动期间服务器购买](https://curl.qcloud.com/EiaMXllu) + +但在组织这场活动的时候,了解到大家都有一个共同的问题: **这个服务器究竟有啥用??** + +这真是一个好问题,而且我一句两句还说不清楚,所以就专门发文来讲一讲。 + +同时我还录制的一期视频,我的视频号,大家可以关注一波。 + + +一说到服务器,可能很多人都说搞分布式,做计算,搞爬虫,做程序后台服务,多人合作等等。 + +其实这些普通人都用不上,我来说一说大家能用上的吧。 + +## 搭建git私服 + +大家平时工作的时候一定有一个自己的工作文件夹,学生的话就是自己的课件,考试,准备面试的资料等等。 + +已经工作的录友,会有一个文件夹放着自己重要的文档,Markdown,图片,简历等等。 + +这么重要的文件夹,而且我们每天都要更新,也担心哪天电脑丢了,或者坏了,突然这些都不见了。 + +所以我们想备份嘛。 + +还有就是我们经常个人电脑和工作电脑要同步一些私人资料,而不是用微信传来传去。 + +这些都是git私服的使用场景,而且很好用。 + +大家也知道 github,gitee也可以搞私人仓库 用来备份,同步文件,但自己的文档可能放着很多重要的信息,包括自己的各种密码,密钥之类的,放到上面未必安全。你就不怕哪些重大bug把你的信息都泄漏了么[机智] + +更关键的是,github 和 gitee都限速的。毕竟人家的功能定位并不是网盘。 + +项目里有大文件(几百M以上),例如pdf,ppt等等 其上传和下载速度会让你窒息。 + +**后面我会发文专门来讲一讲,如何大家git私服!** + +## 搞一个文件存储 + +这个可以用来生成文件的下载链接,也可以把本地文件传到服务器上。 + +相当于自己做一个对象存储,其实云厂商也有对象存储的产品。 + +不过我们自己也可以做一个,不够很多很同学应该都不知道对象存储怎么用吧,其实我们用服务器可以自己做一个类似的公司。 + +我现在就用自己用go写的一个工具,部署在服务器上。 用来和服务器传文件,或者生成一些文件的临时下载链接。 + +这些都是直接命令行操作的, + +操作方式这样,我把命令包 包装成一个shell命令,想传那个文件,直接 uploadtomyserver,然后就返回可以下载的链接,这个文件也同时传到了我的服务器上。 + +![](https://file1.kamacoder.com/i/algo/20211126165643.png) + +我也把我的项目代码放在了github上: + +https://github.com/youngyangyang04/fileHttpServer + +感兴趣的录友可以去学习一波,顺便给个star。 + + +## 网站 + +做网站,例如 大家知道用html 写几行代码,就可以生成一个网页,但怎么给别人展示呢? + +大家如果用自己的电脑做服务器,只能同一个路由器下的设备可以访问你的网站,可能这个设备出了这个屋子 都访问不了你的网站了。 + +因为你的IP不是公网IP。 + +如果有了一台云服务器,都是配公网IP,你的网站就可以让任何人访问了。 + +或者说 你提供的一个服务就可以让任何人使用。 + +例如第二个例子中,我们可以自己开发一个文件存储,这个服务,我只把把命令行给其他人,其他人都可以使用我的服务来生成链接,当然他们的文件也都传到了我的服务器上。 + +再说一个使用场景。 + +我之前在组织免费里服务器的活动的时候,阿里云给我一个excel,让面就是从我这里买服务器录友的名单,我直接把这个名单甩到群里,让大家自己检查,出现在名单里就可以找我返现,这样做是不是也可以。 + +这么做有几个很大的问题: +* 大家都要去下载excel,做对比,会有人改excel的内容然后就说是从你这里买的,我不可能挨个去比较excel有没有改动 +* excel有其他人的个人信息,这是不能暴漏的。 +* 如果每个人自己用excel查询,私信我返现,一个将近两千人找我返现,我微信根本处理不过来,这就变成体力活了。 + +那应该怎么做呢, + +我就简单写一个查询的页面,后端逻辑就是读一个execel表格,大家在查询页面输入自己的阿里云ID,如果在excel里,页面就会返回返现群的二维码,大家就可以自主扫码加群了。 + +这样,我最后就直接在返现群里 发等额红包就好了,是不是极大降低人力成本了 + +当然我是把 17个返现群的二维码都生成好了,按照一定的规则,展现给查询通过的录友。 + +就是这样一个非常普通的查询页面。 + +![](https://file1.kamacoder.com/i/algo/20211126160200.png) + +查询通过之后,就会展现返现群二维码。 + +![](https://file1.kamacoder.com/i/algo/20211127160558.png) + +但要部署在服务器上,因为没有公网IP,别人用不了你的服务。 + + +## 学习linux + +学习linux其实在自己的电脑上搞一台虚拟机,或者安装双系统也可以学习,不过这很考验你的电脑性能如何了。 + +如果你有一个服务器,那就是独立的一台电脑,你怎么霍霍就怎么霍霍,而且一年都不用关机的,可以一直跑你的任务,和你本地电脑也完全隔离。 + +更方便的是,你目前系统假如是CentOS,想做一个实验需要在Ubuntu上,如果是云服务器,更换系统就是在 后台点一下,一键重装,云厂商基本都是支持所有系统一件安装的。 + +我们平时自己玩linux经常是配各种环境,然后这个linux就被自己玩坏了(一般都是毫无节制使用root权限导致的),总之就是环境配不起来了,基本就要重装了。 + +那云服务器重装系统可太方便了。 + +还有就是加入你好不容易配好的环境,如果以后把这个环境玩坏了,你先回退这之前配好的环境而不是重装系统在重新配一遍吧。 + +那么可以用云服务器的镜像保存功能,就是你配好环境的那一刻就可以打一个镜像包,以后如果环境坏了,直接回退到上次镜像包的状态,这是不是就很香了。 + + +## 总结 + +其实云服务器还有很多其他用处,不过我就说一说大家普遍能用的上的。 + + +* [阿里云活动期间服务器购买](https://www.aliyun.com/minisite/goods?taskCode=shareNew2205&recordId=3641992&userCode=roof0wob) +* [腾讯云活动期间服务器购买](https://curl.qcloud.com/EiaMXllu) + diff --git "a/problems/\345\211\215\345\272\217/vim.md" "b/problems/\345\211\215\345\272\217/vim.md" index 13935b91c6..3f1daa53aa 100644 --- "a/problems/\345\211\215\345\272\217/vim.md" +++ "b/problems/\345\211\215\345\272\217/vim.md" @@ -62,7 +62,7 @@ IDE那么很吃内存,打开个IDE卡半天,用VIM就很轻便了,秒开 来感受一下PowerVim的使用体验,看起来很酷吧!注意这些操作都不用鼠标的,一波键盘控制流!所以我平时写代码是不碰鼠标的! -![](https://code-thinking.cdn.bcebos.com/gifs/vim_overview.gif) +![](https://file1.kamacoder.com/i/algo/vim_overview.gif) ## 安装 @@ -93,7 +93,7 @@ sh install.sh 当然 还有很多,我还详细写了PowerVim的快捷键,使用方法,插件,配置,等等,都在Github主页的README上。当时我的Github上写的都是英文README,这次为了方便大家阅读,我又翻译成中文README。 -![](https://file.kamacoder.com/pics/20211013102249.png) +![](https://file1.kamacoder.com/i/algo/20211013102249.png) Github地址:[https://github.com/youngyangyang04/PowerVim](https://github.com/youngyangyang04/PowerVim) diff --git "a/problems/\345\211\215\345\272\217/\344\270\212\346\265\267\344\272\222\350\201\224\347\275\221\345\205\254\345\217\270\346\200\273\347\273\223.md" "b/problems/\345\211\215\345\272\217/\344\270\212\346\265\267\344\272\222\350\201\224\347\275\221\345\205\254\345\217\270\346\200\273\347\273\223.md" deleted file mode 100644 index 6309ef583e..0000000000 --- "a/problems/\345\211\215\345\272\217/\344\270\212\346\265\267\344\272\222\350\201\224\347\275\221\345\205\254\345\217\270\346\200\273\347\273\223.md" +++ /dev/null @@ -1,125 +0,0 @@ - -# 上海互联网公司总结 - -**个人总结难免有所疏忽,欢迎大家补充,公司好坏没有排名哈!** - -## 一线互联网 - -* 百度(上海) -* 阿里(上海) -* 腾讯(上海) -* 字节跳动(上海) -* 蚂蚁金服(上海) - -## 外企IT/互联网/硬件 - -* 互联网 - * Google(上海) - * 微软(上海) - * LeetCode/力扣(上海) - * unity(上海)游戏引擎 - * SAP(上海)主要产品是ERP - * PayPal(上海)在线支付鼻祖 - * eBay(上海)电子商务公司 -* 偏硬件 - * IBM(上海) - * Tesla(上海)特斯拉 - * Cisco(上海)思科 - * Intel(上海) - * AMD(上海)半导体产品领域 - * EMC(上海)易安信是美国信息存储资讯科技公司 - * NVIDIA(上海)英伟达是GPU(图形处理器)的发明者,人工智能计算的引领者 - -## 二线互联网 - -* 拼多多(总部) -* 饿了么(总部)阿里旗下。 -* 哈啰出行(总部)阿里旗下 -* 盒马(总部)阿里旗下 -* 哔哩哔哩(总部) -* 阅文集团(总部)腾讯旗下 -* 爱奇艺(上海)百度旗下 -* 携程(总部) -* 京东(上海) -* 网易(上海) -* 美团点评(上海) -* 唯品会(上海) - -## 硬件巨头 (有软件/互联网业务) - -华为(上海) - -## 三线互联网 - -* PPTV(总部) -* 微盟(总部)企业云端商业及营销解决方案提供商 -* 喜马拉雅(总部) -* 陆金所(总部)全球领先的线上财富管理平台 -* 口碑(上海)阿里旗下。 -* 三七互娱(上海) -* 趣头条(总部) -* 巨人网络(总部)游戏公司 -* 盛大网络(总部)游戏公司 -* UCloud(总部)云服务提供商 -* 达达集团(总部)本地即时零售与配送平台 -* 众安保险(总部)在线财产保险 -* 触宝(总部)触宝输入法等多款APP -* 平安系列 - -## 明星创业公司 - -* 小红书(总部) -* 叮咚买菜(总部) -* 蔚来汽车(总部) -* 七牛云(总部) -* 得物App(总部)品潮流尖货装备交易、球鞋潮品鉴别查验、互动潮流社区 -* 收钱吧(总部)开创了中国移动支付市场“一站式收款” -* 蜻蜓FM(总部)音频内容聚合平台 -* 流利说(总部)在线教育 -* Soul(总部)社交软件 -* 美味不用等(总部)智慧餐饮服务商 -* 微鲸科技(总部)专注于智能家居领域 -* 途虎养车(总部) -* 米哈游(总部)游戏公司 -* 莉莉丝游戏(总部)游戏公司 -* 樊登读书(总部)在线教育 - -## AI独角兽公司 - -* 依图科技(总部)和旷视,商汤对标,都是做安防视觉 -* 深兰科技(总部)致力于人工智能基础研究和应用开发 - -## 其他行业,涉及互联网 -* 花旗、摩根大通等一些列金融巨头 -* 百姓网 -* 找钢网 -* 安居客 -* 前程无忧 -* 东方财富 -* 三大电信运营商:中国移动、中国电信、中国联通 -* 沪江英语 -* 各大银行 - -通知:很多同学感觉自己基础还比较薄弱,想循序渐进的从头学一遍数据结构与算法,那你来对地方了。在公众号左下角「算法汇总」里已经按照各个系列难易程度排好顺序了,大家跟着文章顺序打卡学习就可以了,留言区有很多录友都在从头打卡!「算法汇总」会持续更新,大家快去看看吧! - -## 总结 - -大家如果看了[北京有这些互联网公司,你都知道么?](https://programmercarl.com/前序/北京互联网公司总结.html)和[深圳原来有这么多互联网公司,你都知道么?](https://programmercarl.com/前序/深圳互联网公司总结.html)就可以看出中国互联网氛围最浓的当然是北京,其次就是上海! - -很多人说深圳才是第二,上海没有产生BAT之类的企业。 - -**那么来看看上海在垂直领域上是如何独领风骚的,视频领域B站,电商领域拼多多小红书,生活周边有饿了么,大众点评(现与美团合并),互联网金融有蚂蚁金服和陆金所,出行领域有行业老大携程,而且BAT在上海都有部门还是很大的团队,再加上上海众多的外企,以及金融公司(有互联网业务)**。 - -此时就能感受出来,上海的互联网氛围要比深圳强很多! - -好了,希望这份list可以帮助到想在上海发展的录友们。 - -相对于北京和上海,深圳互联网公司断层很明显,腾讯一家独大,二线三线垂直行业的公司很少,所以说深圳腾讯的员工流动性相对是较低的,因为基本没得选。 - - - - - - ------------------------ -
diff --git "a/problems/\345\211\215\345\272\217/\344\272\222\350\201\224\347\275\221\345\244\247\345\216\202\347\240\224\345\217\221\346\265\201\347\250\213.md" "b/problems/\345\211\215\345\272\217/\344\272\222\350\201\224\347\275\221\345\244\247\345\216\202\347\240\224\345\217\221\346\265\201\347\250\213.md" deleted file mode 100644 index ed526897e5..0000000000 --- "a/problems/\345\211\215\345\272\217/\344\272\222\350\201\224\347\275\221\345\244\247\345\216\202\347\240\224\345\217\221\346\265\201\347\250\213.md" +++ /dev/null @@ -1,240 +0,0 @@ -# 揭秘互联网大厂研发流程 - -[B站:揭秘互联网大厂研发流程](https://www.bilibili.com/video/BV1KR4y1H7ST) - -很多录友会很好奇这么个事: - -* 大厂的研发流程应该是什么样的呢 -* 为什么会有那么多繁琐的流程呢 -* 每一步都有什么作用呢 - -这次给大家介绍一波大厂的研发流程,让大家明明白白。 - -其实对于几十人或者上百人一起开发一个项目的话,一个规范的研发流程是很重要的。 - -有的同学可能想,哪有这么多流程啊,就是写完代码,跑一下,没问题,然后就上线了。 - -其实在大厂里研发流程是很重要的。 - -**一个项目从开发到上线到后面的维护,从流程上就保证大家少出错,也方便后面人继续维护**。 - -那么接下来给大家介绍一下详细的流程。 - -## 1.需求文档 - -看需求文档,我们要根据需求文档来确定我们究竟要做什么。 - -一些同学可能感觉 为什么还要用一个需求文档呢,你就告诉我做啥我就做啥不就完事了? - -需求文档一方面是**倒逼产品经理去系统性的思考这个需求究竟有哪些功能**,用来满足哪些用户的需求。 - -另一方面是**保证我们在研发的时候,研发出来的功能是满足需求文档里所描述的**。 - -如果是口头对接的话,很有可能就是你做出来的东西,产品经理看完感觉:这和我说的需求不一样啊!!这和我想的不一样啊!! - -这样就是两个人相互“甩锅”,那这究竟是谁的锅呢。都没有一个证据,对吧。 - -所以说,有一个需求文档很重要。 - -而且每个阶段的需求文档相当于是把这个项目的整个迭代过程都记录下来了。 - -这样也方便后面的人,了解这个项目是如何迭代的。 - -## 2.这个需求包含了哪些功能 - -产品经理在需求文档里描述一个功能,那么我们在实现的时候,可能要改很多模块,或者说我们要增加一些模块。 - -就是我们从代码的角度上来讲,可能要增添很多功能才能满足 用户看起来好像微不足道的小功能。 - -例如点击登录,点击下单,后台都有很多模块协同运行的。 - -我们要把产品经理角度上的这个功能,拆解为我们代码角度上的具体应该开发的那些功能。 - -## 3.确定有哪些难点 - -这里可能有同学疑惑了,我确定这东西干嘛呢。 - -给大家举一个例子,给你一个需求文档。 - -你说你一周的时间就能把它开发完,那为什么是一周呢,为什么不是两天,为什么不是两周呢。 - -其实 和上面的领导汇报你的工作的时候 **都要把自己的工作进行量化**。 - -那么这个功能有哪些难点,我们要克服这个难点,所需要花费的时间,都要有一个大体的量化。 - -这样才能量化我们自己的工作,**领导其实不知道你的工作是简单 还是困难, 领导只在意最终结果**,所以你需要展现给领导你的工作是有难度的是有挑战的。 - -而且**这些也是我们年底用来晋升或者评职称的素材**。 - -如果这些东西你自己都不在乎的话,谁还会帮你在乎呢。 - -而且**确定了自己的工作难点,把这些难点都记录下来,对以后跳槽也很有帮助**。 - -面试官最喜欢问的问题,就是:**你做的项目中有哪些难点?以及你是如何克服的**。 - -所以这一步对自己个人成长来说也是很有重要的。 对于项目组来说也是记录下来,每一个迭代版本有哪些难点,这些难点团队是如何克服的。 - -这也是项目组往上一级去邀功的资料。 - - -## 4.画架构图 - -一般来说,大厂项目的架构都是比较复杂的,特别是后端架构。 - -如果添加一个模块连个文档都没有,连个图也没有,上来就添加的话,后面的人是很难维护的。 - -而且每个模块和每一个模块之间的依赖关系,如果没有画出一个架构图的话,直接看代码很容易直接就看懵了。 - -为什么你可以快速开发一个新的模块,也是因为之前团队有人把这个架构图画清楚了,你只需要看一眼这个架构图,就知道你的模块应该添加在哪里。 - -那么你去添加模块的时候,也应该把这个架构图相应的位置 完善一下。 - -同时呢,在画架构图的过程中,也增添了自己对整个系统架构的掌握程度。 - -这个图也会让你确定,你的模块在整个项目中扮演一个什么样的角色。 - -## 5.定协议 - -后台模块之间进行通讯需要协议,后台和前端通讯也需要协议。 - -所以只要有交互,就要确定协议的数据格式。 - -**定协议要考虑到兼容,要考虑易于维护**。 - -## 6.设计数据结构和算法 - -其实设计数据结构更多一些,因为我们要选择使用什么容器,什么格式来处理我们的数据。 - -至于算法的话,就很少我们亲自设计了。 - -什么快排,二叉树,动态规划,最短路啥的,在实际开发中,都不需要我们自己去写,**直接调包!** - -面试造火箭,工作拧螺丝 就体现在这里。 - -为什么会这样呢? 一个很简单的例子,互联网研发讲究其实就是要快,例如一个功能2天就要开发完,如果算法都要自己去写的话,等都写完了,花都谢了。 - -最关键的是,**你实现的算法 极大概率没有现成的算法接口安全性高**。 - -**开发中要学会才在巨人的肩膀上**。 - -## 7.预估一下容量 - -特别是后端开发,要估计出 我们自己模块大体需要多大磁盘,多大内存,多大带宽,多少核CPU。 - -这也是没有做过研发工作的同学经常忽略的,**因为大家好像默认 磁盘、内存、带宽、cpu是无穷的**。 - -其实我们在设计一个模块的时候,这些都要评估的,不能模块一上线,把机器直接打爆了。 - -例如 直接把带宽打满了,不仅影响自己的模块功能,还影响了机器上其他模块的运行。 - - -## 8.考虑部署 - -要考虑如果一台机器挂了(可能是硬件原因),那么我们的模块还能不能正常提供服务。 - -这就是考虑模块的容灾性,一般都是采用分布式,服务部署在三台机器上,一台如果挂了,还有其他两台提供服务。 - -还有就是要弹性可伸缩,即我们的模块可不可以直接 部署多台机器来提高承载能力。 - -如果用户量突然上来了,或者流量突然上来了,可以通过快速部署多台机器来抗住流量。 - -而不是模块只能在单机上跑,多部署几台就发生各种问题。 - -**这才能说明是有足够强的风险意识的**。 - -## 9.设计评审 - -前八的阶段其实都是设计阶段,那么你的设计需要让组里的同学一起来评审一下,看看有没有什么问题。 - -大家主要也是看看你的模块 会不会给其他模块或者整个系统带来什么问题 以及 设计的是否合理。 - - -## 10.写代码 - -终于到写代码的阶段了,其实到这时候,是最容易的。 - -**写代码就是体力活了,不是脑力活了**。 - -## 11.自测 - -写完代码,我们需要自测,自己的功能会不会有什么问题。 - -这里可能需要自己造一造数据,跑一跑 看看和预想的是不是一样的。 - -## 12.联调 - -自己的模块可能会涉及到其他模块之间的一个交互,或者和前端的一个交互。 - -所以需要其他同学配合一起来测试。 - -这里就有很多沟通工作了,因为其他同学可能手头有自己的活,那么就要协调一个时间来一起测试。 - -这一步也是很费时间的,**其费时关键是要等,要等其他同学有空和你联调或者是别人等你**,而且往往不是联调一次就能解决问题的。 - -所以 在评估开发时间的时候 也要考虑到联调的时间。 - -这也是大厂研发效率低的地方,但上百人开发的项目,**这种沟通上消耗也是在所难免的**。 - -## 13.交给测试 - -自己的代码,自己测 一般都测不出什么问题,需要交给测试同学来给你测一测。 - -这里如果测试同学测出问题,你就要判断确实有问题还是 测试方式不对,如果有问题就要修改,再提给测试,反反复复这么几轮,直到测试同学测试没问题了。 - -**这个过程也是累心的**。 - -## 14.code review - -代码合入主干之前,需要 项目组的同学一起来评审一下你的代码。 - -之前是评审设计,看设计上有没有什么缺失,这次是大家来看看你代码写的怎么样。 - -例如合入主干会不会有什么问题,代码兼容性做的好不好,接口设计的好不好,甚至字段,函数,变量名,命名合不合理。 - -都要经过大家的评审,如果有问题就还是要改。 - -如果没有问题一般 大家会给+2(就是通过的意思),这样就可以合入主干了。 - -## 15.合入主干 - -合入主干为什么会单独列出来呢。 - -其实合入主干是很重要的,经常是自己的代码没问题,但合入主干之后就有问题了。 - -一般就是合入主干的时候有冲突,例如你从主干拉出一个分支,另一个同学从主干拉出一个分支,而且两个分支修改了同一个模块,如果另一个同学提前合入主干,你再合入主干的时候就会有代码冲突。 - -在解决代码冲突的时候 就会修改别人的代码,这个过程很容易产生新的bug。 - - -**一般合入主干之后,测试同学还要重新跑一个全量测试,才能放心发布**。 - -如果跑全量测试没有问题的话,才会松一口气(懂的人都懂)。 - -## 16.发布 - -最后一步就是发布了。 - -发布其实就是把主干的代码更新到线上的服务器上。 - -一些还没有工作的同学,可能不太理解究竟什么是发布。 - -用大白话来讲,就是把 本地的代码或者某台机器的代码,编译成可执行文件,然后更新到 线上的服务器(一个独立的集群,专门处理线上的流量)并运行起来。 - -上线是最重要的一步了,也很容易出问题,因为一个大型项目,其上线的过程都非常复杂(要更新上百台机器的集群),而且**要考虑线上新版和旧版本的兼容问题**。 - -这也是为什么大厂项目都选择深夜上线,**因为深夜在线用户最少,如果出问题,影响的用户会比较少,可以快速修复**。 - -所以大家经常看到 某大厂程序员深夜上线发布版本之类的。 - -## 总结 - -好了,整整讲了十六个步骤!把大厂研发流程中 具体都有哪一步,为什么要这么做,都分析的很清楚了。 - -不过在大厂也不是所有部门都按照这个流程来的,每个部门都有自己玩法,各个部门也不太统一。 - -我这里是介绍的是已经比较规范的流程,**但流程越正规,研发效率就越低,想要提高效率,就是简化流程,简化流程,就会提高项目出错的概率**。 - -**所以这也是一个相互权衡的过程,每一个部门可能根据自己的业务特点,适当简化流程**。 - -好了,讲了这么多,希望对录友们有所启发。 - diff --git "a/problems/\345\211\215\345\272\217/\344\273\243\347\240\201\351\243\216\346\240\274.md" "b/problems/\345\211\215\345\272\217/\344\273\243\347\240\201\351\243\216\346\240\274.md" index 33891632b8..db54fcb3e7 100644 --- "a/problems/\345\211\215\345\272\217/\344\273\243\347\240\201\351\243\216\346\240\274.md" +++ "b/problems/\345\211\215\345\272\217/\344\273\243\347\240\201\351\243\216\346\240\274.md" @@ -57,7 +57,7 @@ 我做了一下总结如图: -![编程风格](https://file.kamacoder.com/pics/20201119173039835.png) +![编程风格](https://file1.kamacoder.com/i/algo/20201119173039835.png) ### 水平留白(代码空格) @@ -134,4 +134,4 @@ Google规范是 大括号和 控制语句保持同一行的,我个人也很认 ----------------------- -
+
diff --git "a/problems/\345\211\215\345\272\217/\345\206\205\345\255\230\346\266\210\350\200\227.md" "b/problems/\345\211\215\345\272\217/\345\206\205\345\255\230\346\266\210\350\200\227.md" index 88fb129ee2..2be0bea5c1 100644 --- "a/problems/\345\211\215\345\272\217/\345\206\205\345\255\230\346\266\210\350\200\227.md" +++ "b/problems/\345\211\215\345\272\217/\345\206\205\345\255\230\346\266\210\350\200\227.md" @@ -19,7 +19,7 @@ 如果我们写C++的程序,就要知道栈和堆的概念,程序运行时所需的内存空间分为 固定部分,和可变部分,如下: -![C++内存空间](https://file.kamacoder.com/pics/20210309165950660.png) +![C++内存空间](https://file1.kamacoder.com/i/algo/20210309165950660.png) 固定部分的内存消耗 是不会随着代码运行产生变化的, 可变部分则是会产生变化的 @@ -41,7 +41,7 @@ 想要算出自己程序会占用多少内存就一定要了解自己定义的数据类型的大小,如下: -![C++数据类型的大小](https://file.kamacoder.com/pics/20200804193045440.png) +![C++数据类型的大小](https://file1.kamacoder.com/i/algo/20200804193045440.png) 注意图中有两个不一样的地方,为什么64位的指针就占用了8个字节,而32位的指针占用4个字节呢? @@ -109,7 +109,7 @@ CPU读取内存不是一次读取单个字节,而是一块一块的来读取 第一种就是内存对齐的情况,如图: -![内存对齐](https://file.kamacoder.com/pics/20200804193307347.png) +![内存对齐](https://file1.kamacoder.com/i/algo/20200804193307347.png) 一字节的char占用了四个字节,空了三个字节的内存地址,int数据从地址4开始。 @@ -117,7 +117,7 @@ CPU读取内存不是一次读取单个字节,而是一块一块的来读取 第二种是没有内存对齐的情况如图: -![非内存对齐](https://file.kamacoder.com/pics/20200804193353926.png) +![非内存对齐](https://file1.kamacoder.com/i/algo/20200804193353926.png) char型的数据和int型的数据挨在一起,该int数据从地址1开始,那么CPU想要读这个数据的话来看看需要几步操作: @@ -145,4 +145,4 @@ char型的数据和int型的数据挨在一起,该int数据从地址1开始, ----------------------- -
+
diff --git "a/problems/\345\211\215\345\272\217/\345\212\233\346\211\243\344\270\212\347\232\204\344\273\243\347\240\201\345\234\250\346\234\254\345\234\260\347\274\226\350\257\221\350\277\220\350\241\214.md" "b/problems/\345\211\215\345\272\217/\345\212\233\346\211\243\344\270\212\347\232\204\344\273\243\347\240\201\345\234\250\346\234\254\345\234\260\347\274\226\350\257\221\350\277\220\350\241\214.md" index 5b57d214db..5e91198948 100644 --- "a/problems/\345\211\215\345\272\217/\345\212\233\346\211\243\344\270\212\347\232\204\344\273\243\347\240\201\345\234\250\346\234\254\345\234\260\347\274\226\350\257\221\350\277\220\350\241\214.md" +++ "b/problems/\345\211\215\345\272\217/\345\212\233\346\211\243\344\270\212\347\232\204\344\273\243\347\240\201\345\234\250\346\234\254\345\234\260\347\274\226\350\257\221\350\277\220\350\241\214.md" @@ -61,4 +61,4 @@ int main() { ----------------------- -
+
diff --git "a/problems/\345\211\215\345\272\217/\345\214\227\344\272\254\344\272\222\350\201\224\347\275\221\345\205\254\345\217\270\346\200\273\347\273\223.md" "b/problems/\345\211\215\345\272\217/\345\214\227\344\272\254\344\272\222\350\201\224\347\275\221\345\205\254\345\217\270\346\200\273\347\273\223.md" deleted file mode 100644 index 7b42868e8f..0000000000 --- "a/problems/\345\211\215\345\272\217/\345\214\227\344\272\254\344\272\222\350\201\224\347\275\221\345\205\254\345\217\270\346\200\273\347\273\223.md" +++ /dev/null @@ -1,109 +0,0 @@ -# 北京互联网公司总结 - -

欢迎大家参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

- - -**个人总结难免有所疏忽,欢迎大家补充,公司好坏没有排名哈!** - -如果要在北京找工作,这份list可以作为一个大纲,寻找自己合适的公司。 - -## 一线互联网 - -* 百度(总部) -* 阿里(北京) -* 腾讯(北京) -* 字节跳动(总部) - -## 外企 - -* 微软(北京)微软中国主要就是北京和苏州 -* Hulu(北京)美国的视频网站,听说福利待遇超级棒 -* Airbnb(北京)房屋租赁平台 -* Grab(北京)东南亚第一大出行 App -* 印象笔记(北京)evernote在中国的独立品牌 -* FreeWheel(北京)美国最大的视频广告管理和投放平台 -* amazon(北京)全球最大的电商平台 - -## 二线互联网 - -* 美团点评(总部) -* 京东(总部) -* 网易(北京) -* 滴滴出行(总部) -* 新浪(总部) -* 快手(总部) -* 搜狐(总部) -* 搜狗(总部) -* 360(总部) - -## 硬件巨头 (有软件/互联网业务) - -* 华为(北京) -* 联想(总部) -* 小米(总部)后序要搬到武汉,互联网业务也是小米重头 - -## 三线互联网 - -* 爱奇艺(总部) -* 去哪儿网(总部) -* 知乎(总部) -* 豆瓣(总部) -* 当当网(总部) -* 完美世界(总部)游戏公司 -* 昆仑万维(总部)游戏公司 -* 58同城(总部) -* 陌陌(总部) -* 金山软件(北京)包括金山办公软件 -* 用友网络科技(总部)企业服务ERP提供商 -* 映客直播(总部) -* 猎豹移动(总部) -* 一点资讯(总部) -* 国双(总部)企业级大数据和人工智能解决方案提供商 - -## 明星创业公司 - -可以发现北京一堆在线教育的公司,可能教育要紧盯了政策变化,所以都要在北京吧 - -* 好未来(总部)在线教育 -* 猿辅导(总部)在线教育 -* 跟谁学(总部)在线教育 -* 作业帮(总部)在线教育 -* VIPKID(总部)在线教育 -* 雪球(总部)股市资讯 -* 唱吧(总部) -* 每日优鲜(总部)让每个人随时随地享受食物的美好 -* 微店(总部) -* 罗辑思维(总部)得到APP -* 值得买科技(总部)让每一次消费产生幸福感 -* 拉勾网(总部)互联网招聘 - -## AI独角兽公司 - -* 商汤科技(总部)专注于计算机视觉和深度学习 -* 旷视科技(总部)人工智能产品和解决方案公司 -* 第四范式(总部)人工智能技术与服务提供商 -* 地平线机器人(总部)边缘人工智能芯片的全球领导者 -* 寒武纪(总部)全球智能芯片领域的先行者 - -## 互联网媒体 - -* 央视网 -* 搜房网 -* 易车网 -* 链家网 -* 自如网 -* 汽车之家 - - -北京的互联网氛围绝对是最好的(暂不讨论户口和房价问题),大家如果看了[深圳原来有这么多互联网公司,你都知道么?](https://programmercarl.com/前序/深圳互联网公司总结.html)这篇之后,**会发现北京互联网外企和二线互联网公司数量多的优势,在深圳的互联网公司断档比较严重,如果去不了为数不多的一线公司,可选择的余地就非常少了,而北京选择的余地就很多!** - -相对来说,深圳的硬件企业更多一些,因为珠三角制造业配套比较完善。而大多数互联网公司其实就是媒体公司,当然要靠近政治文化中心,这也是有原因的。 - -就酱,我也会陆续整理其他城市的互联网公司,希望对大家有所帮助。 - - - - - ------------------------ -
diff --git "a/problems/\345\211\215\345\272\217/\345\271\277\345\267\236\344\272\222\350\201\224\347\275\221\345\205\254\345\217\270\346\200\273\347\273\223.md" "b/problems/\345\211\215\345\272\217/\345\271\277\345\267\236\344\272\222\350\201\224\347\275\221\345\205\254\345\217\270\346\200\273\347\273\223.md" deleted file mode 100644 index b8b1641b63..0000000000 --- "a/problems/\345\211\215\345\272\217/\345\271\277\345\267\236\344\272\222\350\201\224\347\275\221\345\205\254\345\217\270\346\200\273\347\273\223.md" +++ /dev/null @@ -1,77 +0,0 @@ -# 广州互联网公司总结 - -

欢迎大家参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

- - -**个人总结难免有所疏忽,欢迎大家补充,公司好坏没有排名哈!** - -## 一线互联网 - -* 微信(总部) 有点难进! -* 字节跳动(广州) - -## 二线 -* 网易(总部)主要是游戏 - -## 三线 - -* 唯品会(总部) -* 欢聚时代(总部)旗下YY,虎牙,YY最近被浑水做空,不知百度还要不要收购了 -* 酷狗音乐(总部) -* UC浏览器(总部)现在隶属阿里创始人何小鹏现在搞小鹏汽车 -* 荔枝FM(总部)用户可以在手机上开设自己的电台和录制节目 -* 映客直播(总部)股票已经跌成渣了 -* 爱范儿(总部) -* 三七互娱(总部)游戏公司 -* 君海游戏(总部)游戏公司 -* 4399游戏(总部)游戏公司 -* 多益网络(总部)游戏公司 - -## 硬件巨头 (有软件/互联网业务) -* 小鹏汽车(总部)新能源汽车小霸王 - -## 创业公司 - -* 妈妈网(总部)母婴行业互联网公司 -* 云徙科技(总部)数字商业云服务提供商 -* Fordeal(总部)中东领先跨境电商平台 -* Mobvista(总部)移动数字营销 -* 久邦GOMO(总部)游戏 -* 深海游戏(总部)游戏 - -## 国企 - -* 中国电信广州研发(听说没有996) - - -## 总结 - -同在广东省,难免不了要和深圳对比,大家如果看了这篇:[深圳原来有这么多互联网公司,你都知道么?](https://programmercarl.com/前序/深圳互联网公司总结.html)就能感受到鲜明的对比了。 - -广州大厂高端岗位其实比较少,本土只有微信和网易,微信呢毕竟还是腾讯的分部,而网易被很多人认为是杭州企业,其实网易总部在广州。 - -广州是唯一一个一线城市没有自己本土互联网巨头的城市,所以网易选择在广州扎根还是很正确的,毕竟杭州是阿里的天下,广州也应该扶持一把本土的互联网公司。 - -虽然对于互联网从业人员来说,广州的岗位要比深圳少很多,**但是!!广州的房价整体要比深圳低30%左右,而且广州的教育,医疗,公共资源完全碾压深圳**。 - -教育方面:大学广州有两个985,四个211,深圳这方面就不用说了,大家懂得。 - -基础教育方面深圳的小学初中高中学校数量远远不够用,小孩上学竞争很激烈,我也是经常听同事们说,耳濡目染了。 - -而医疗上基本深圳看不了的病都要往广州跑,深圳的医院数量也不够用。 - -在生活节奏上,广州更慢一些,更有生活的气息,而深圳生存下去的气息更浓烈一些。 - -所以很多在深圳打拼多年的IT从业者选择去广州安家也是有原因的。 - -但也有很多从广州跑到深圳的,深圳发展的机会更多,而广州教育医疗更丰富,房价不高(相对深圳)。 - - - - - - - - ------------------------ -
diff --git "a/problems/\345\211\215\345\272\217/\346\210\220\351\203\275\344\272\222\350\201\224\347\275\221\345\205\254\345\217\270\346\200\273\347\273\223.md" "b/problems/\345\211\215\345\272\217/\346\210\220\351\203\275\344\272\222\350\201\224\347\275\221\345\205\254\345\217\270\346\200\273\347\273\223.md" deleted file mode 100644 index f6a575f64d..0000000000 --- "a/problems/\345\211\215\345\272\217/\346\210\220\351\203\275\344\272\222\350\201\224\347\275\221\345\205\254\345\217\270\346\200\273\347\273\223.md" +++ /dev/null @@ -1,72 +0,0 @@ - -# 成都互联网公司总结 -

欢迎大家参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

- - -**排名不分先后,个人总结难免有所疏漏,欢迎补充!** - -## 一线互联网 -* 腾讯(成都) 游戏,王者荣耀就在成都! -* 阿里(成都) -* 蚂蚁金服(成都) -* 字节跳动(成都) - -## 硬件巨头 (有软件/互联网业务) - -* 华为(成都) -* OPPO(成都) - -## 二线互联网 - -* 京东(成都) -* 美团(成都) -* 滴滴(成都) - -## 三线互联网 - -* 完美世界 (成都)游戏 -* 聚美优品 (成都) -* 陌陌 (成都) -* 爱奇艺(成都) - -## 外企互联网 - -* NAVER China (成都)搜索引擎公司,主要针对韩国市场 - -## 创业公司 - -* tap4fun(总部)游戏 -* 趣乐多(总部)游戏 -* 天上友嘉(总部)游戏 -* 三七互娱(成都)游戏 -* 咕咚(总部)智能运动 -* 百词斩(总部)在线教育 -* 晓多科技(总部)AI方向 -* 萌想科技(总部)实习僧 -* Camera360(总部)移动影像社区 -* 医联 (总部)医疗解决方案提供商 -* 小明太极 (总部)原创漫画文娱内容网站以及相关APP -* 小鸡叫叫(总部)致力于儿童教育的智慧解决方案 - - -## AI独角兽公司 - -* 科大讯飞(成都) -* 商汤(成都) - -## 总结 - -可以看出成都相对一线城市的互联网氛围确实差了很多。**但是!成都已经是在内陆城市中甚至二线城市中的佼佼者了!** - -从公司的情况上也可以看出:**成都互联网行业目前的名片是“游戏”**,腾讯、完美世界等大厂,还有无数小厂都在成都搞游戏,可能成都的天然属性就是娱乐,这里是游戏的沃土吧。 - -相信大家如果在一些招聘平台上去搜,其实很多公司都在成都,但都是把客服之类的工作安排在成都,而我在列举的时候尽量把研发相关在成都的公司列出来,这样对大家更有帮助。 - - - - - - - ------------------------ -
diff --git "a/problems/\345\211\215\345\272\217/\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246.md" "b/problems/\345\211\215\345\272\217/\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246.md" index 045646ff7e..4252fc8779 100644 --- "a/problems/\345\211\215\345\272\217/\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246.md" +++ "b/problems/\345\211\215\345\272\217/\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246.md" @@ -38,7 +38,7 @@ 同样的同理再看一下快速排序,都知道快速排序是O(nlogn),但是当数据已经有序情况下,快速排序的时间复杂度是O(n^2) 的,**所以严格从大O的定义来讲,快速排序的时间复杂度应该是O(n^2)**。 **但是我们依然说快速排序是O(nlogn)的时间复杂度,这个就是业内的一个默认规定,这里说的O代表的就是一般情况,而不是严格的上界**。如图所示: -![时间复杂度4,一般情况下的时间复杂度](https://file.kamacoder.com/pics/20200728185745611-20230310123844306.png) +![时间复杂度4,一般情况下的时间复杂度](https://file1.kamacoder.com/i/algo/20200728185745611-20230310123844306.png) 我们主要关心的还是一般情况下的数据形式。 @@ -49,7 +49,7 @@ 如下图中可以看出不同算法的时间复杂度在不同数据输入规模下的差异。 -![时间复杂度,不同数据规模的差异](https://file.kamacoder.com/pics/20200728191447384-20230310124015324.png) +![时间复杂度,不同数据规模的差异](https://file1.kamacoder.com/i/algo/20200728191447384-20230310124015324.png) 在决定使用哪些算法的时候,不是时间复杂越低的越好(因为简化后的时间复杂度忽略了常数项等等),要考虑数据规模,如果数据规模很小甚至可以用O(n^2)的算法比O(n)的更合适(在有常数项的时候)。 @@ -115,7 +115,7 @@ O(2 × n^2 + 10 × n + 1000) < O(3 × n^2),所以说最后省略掉常数项 为什么可以这么做呢?如下图所示: -![时间复杂度1.png](https://file.kamacoder.com/pics/20200728191447349-20230310124032001.png) +![时间复杂度1.png](https://file1.kamacoder.com/i/algo/20200728191447349-20230310124032001.png) 假如有两个算法的时间复杂度,分别是log以2为底n的对数和log以10为底n的对数,那么这里如果还记得高中数学的话,应该不难理解`以2为底n的对数 = 以2为底10的对数 * 以10为底n的对数`。 @@ -164,4 +164,4 @@ O(2 × n^2 + 10 × n + 1000) < O(3 × n^2),所以说最后省略掉常数项 ----------------------- -
+
diff --git "a/problems/\345\211\215\345\272\217/\346\235\255\345\267\236\344\272\222\350\201\224\347\275\221\345\205\254\345\217\270\346\200\273\347\273\223.md" "b/problems/\345\211\215\345\272\217/\346\235\255\345\267\236\344\272\222\350\201\224\347\275\221\345\205\254\345\217\270\346\200\273\347\273\223.md" deleted file mode 100644 index 6154cfe50f..0000000000 --- "a/problems/\345\211\215\345\272\217/\346\235\255\345\267\236\344\272\222\350\201\224\347\275\221\345\205\254\345\217\270\346\200\273\347\273\223.md" +++ /dev/null @@ -1,83 +0,0 @@ -# 杭州互联网公司总结 - -

欢迎大家参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

- - -**个人总结难免有所疏忽,欢迎大家补充,公司好坏没有排名哈!** - -## 一线互联网 - -* 阿里巴巴(总部) -* 蚂蚁金服(总部)阿里旗下 -* 阿里云(总部)阿里旗下 -* 网易(杭州) 网易云音乐 -* 字节跳动(杭州)抖音分部 - -## 外企 - -* ZOOM (杭州研发中心)全球知名云视频会议服务提供商 -* infosys(杭州)印度公司,据说工资相对不高 -* 思科(杭州) - -## 二线互联网 - -* 滴滴(杭州) -* 快手(杭州) - -## 硬件巨头 (有软件/互联网业务) - -* 海康威视(总部)安防三巨头 -* 浙江大华(总部)安防三巨头 -* 杭州宇视(总部) 安防三巨头 -* 萤石 -* 华为(杭州) -* vivo(杭州) -* oppo(杭州) -* 魅族(杭州) - -## 三线互联网 - -* 蘑菇街(总部)女性消费者的电子商务网站 -* 有赞(总部)帮助商家进行网上开店、社交营销 -* 菜鸟网络(杭州) -* 花瓣网(总部)图片素材领导者 -* 兑吧(总部)用户运营服务平台 -* 同花顺(总部)网上股票证券交易分析软件 -* 51信用卡(总部)信用卡管理 -* 虾米(总部)已被阿里收购 -* 曹操出行(总部) -* 口碑网 (总部) - -## AI独角兽公司 - -* 旷视科技(杭州) -* 商汤(杭州) - -## 创业公司 - -* e签宝(总部)做电子签名 -* 婚礼纪(总部)好多结婚的朋友都用 -* 大搜车(总部)中国领先的汽车交易服务供应商 -* 二更(总部)自媒体 -* 丁香园(总部) - -## 总结 - -杭州距离上海非常近,难免不了和上海做对比,上海是金融之都,如果看了[上海有这些互联网公司,你都知道么?](https://programmercarl.com/前序/上海互联网公司总结.html)就会发现上海互联网也是仅次于北京的。 - -而杭州是阿里的大本营,到处都有阿里的影子,虽然有网易在,但是也基本是盖过去了,很多中小公司也都是阿里某某高管出来创业的。 - -杭州的阿里带动了杭州的电子商务领域热度非常高,如果你想做电商想做直播带货想做互联网营销,杭州都是圣地! - -如果要是写代码的话,每年各种节日促销,加班996应该是常态,电商公司基本都是这样,当然如果赶上一个好领导的话,回报也是很丰厚的。 - -「代码随想录」一直都是干活满满,值得介绍给每一位学习算法的同学! - - - - - - - ------------------------ -
diff --git "a/problems/\345\211\215\345\272\217/\346\267\261\345\234\263\344\272\222\350\201\224\347\275\221\345\205\254\345\217\270\346\200\273\347\273\223.md" "b/problems/\345\211\215\345\272\217/\346\267\261\345\234\263\344\272\222\350\201\224\347\275\221\345\205\254\345\217\270\346\200\273\347\273\223.md" deleted file mode 100644 index 52a8448b51..0000000000 --- "a/problems/\345\211\215\345\272\217/\346\267\261\345\234\263\344\272\222\350\201\224\347\275\221\345\205\254\345\217\270\346\200\273\347\273\223.md" +++ /dev/null @@ -1,79 +0,0 @@ - -# 深圳互联网公司总结 - -

欢迎大家参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

- -**个人总结难免有所疏忽,欢迎大家补充,公司好坏没有排名哈!** - -## 一线互联网 - -* 腾讯(总部深圳) -* 百度(深圳) -* 阿里(深圳) -* 字节跳动(深圳) - -## 硬件巨头 (有软件/互联网业务) - -* 华为(总部深圳) -* 中兴(总部深圳) -* 海能达(总部深圳) -* oppo(总部深圳) -* vivo(总部深圳) -* 深信服(总部深圳) -* 大疆(总部深圳,无人机巨头) -* 一加手机(总部深圳) -* 柔宇科技(最近口碑急转直下) - -## 二线大厂 - -* 快手(深圳) -* 京东(深圳) -* 顺丰(总部深圳) - -## 三线大厂 - -* 富途证券(2020年成功赴美上市,主要经营港股美股) -* 微众银行(总部深圳) -* 招银科技(总部深圳) -* 平安系列(平安科技、平安寿险、平安产险、平安金融、平安好医生等) -* Shopee(21年有裁员风波) -* 有赞(深圳) -* 迅雷(总部深圳) -* 金蝶(总部深圳) -* 随手记(总部深圳) - -## AI独角兽公司 - -* 商汤科技(人工智能领域的独角兽) -* 追一科技(一家企业级智能服务AI公司) -* 超多维科技 (计算机视觉、裸眼3D) -* 优必选科技 (智能机器人、人脸识别) - -## 明星创业公司 - -* 丰巢科技(让生活更简单) -* 人人都是产品经理(全球领先的产品经理和运营人 学习、交流、分享平台) -* 大丰收(综合农业互联网服务平台) -* 小鹅通(专注新教育的技术服务商) -* 货拉拉(拉货就找货拉拉) -* 编程猫(少儿编程教育头部企业) -* HelloTalk(全球最大的语言学习社交社区) -* 大宇无限( 拥有SnapTube, Lark Player 等多款广受海外新兴市场用户欢迎的产品) -* 知识星球(深圳大成天下公司出品) -* XMind(隶属深圳市爱思软件技术有限公司,思维导图软件) -* 小赢科技(以技术重塑人类的金融体验) - -## 其他行业(有软件/互联网业务) - -* 三大电信运营商:中国移动、中国电信、中国联通 -* 房产企业:恒大(暴雷)、万科 -* 中信深圳 -* 广发证券,深交所 -* 珍爱网(珍爱网是国内知名的婚恋服务网站之一) - - - - - ------------------------ -
diff --git "a/problems/\345\211\215\345\272\217/\347\250\213\345\272\217\345\221\230\345\206\231\346\226\207\346\241\243\345\267\245\345\205\267.md" "b/problems/\345\211\215\345\272\217/\347\250\213\345\272\217\345\221\230\345\206\231\346\226\207\346\241\243\345\267\245\345\205\267.md" index a2f6ee3b5f..c991be1542 100644 --- "a/problems/\345\211\215\345\272\217/\347\250\213\345\272\217\345\221\230\345\206\231\346\226\207\346\241\243\345\267\245\345\205\267.md" +++ "b/problems/\345\211\215\345\272\217/\347\250\213\345\272\217\345\221\230\345\206\231\346\226\207\346\241\243\345\267\245\345\205\267.md" @@ -130,4 +130,4 @@ Markdown支持部分html,例如这样 ----------------------- -
+
diff --git "a/problems/\345\211\215\345\272\217/\347\250\213\345\272\217\345\221\230\347\256\200\345\216\206.md" "b/problems/\345\211\215\345\272\217/\347\250\213\345\272\217\345\221\230\347\256\200\345\216\206.md" index 1bdcccd586..762b55f400 100644 --- "a/problems/\345\211\215\345\272\217/\347\250\213\345\272\217\345\221\230\347\256\200\345\216\206.md" +++ "b/problems/\345\211\215\345\272\217/\347\250\213\345\272\217\345\221\230\347\256\200\345\216\206.md" @@ -103,13 +103,13 @@ Carl校招社招都拿过大厂的offer,同时也看过很多应聘者的简 最后福利,把我的简历模板贡献出来!如下图所示。 -![简历模板](https://file.kamacoder.com/pics/20200803175538158.png) +![简历模板](https://file1.kamacoder.com/i/algo/20200803175538158.png) 这里是简历模板中Markdown的代码:[https://github.com/youngyangyang04/Markdown-Resume-Template](https://github.com/youngyangyang04/Markdown-Resume-Template) ,可以fork到自己Github仓库上,按照这个模板来修改自己的简历。 **Word版本的简历,添加如下企业微信,通过之后就会发你word版本**。 -
+
如果已经有我的企业微信,直接回复:简历模板,就可以了。 @@ -119,4 +119,4 @@ Carl校招社招都拿过大厂的offer,同时也看过很多应聘者的简 ----------------------- -
+
diff --git "a/problems/\345\211\215\345\272\217/\347\251\272\351\227\264\345\244\215\346\235\202\345\272\246.md" "b/problems/\345\211\215\345\272\217/\347\251\272\351\227\264\345\244\215\346\235\202\345\272\246.md" index b669049293..da2caa24b6 100644 --- "a/problems/\345\211\215\345\272\217/\347\251\272\351\227\264\345\244\215\346\235\202\345\272\246.md" +++ "b/problems/\345\211\215\345\272\217/\347\251\272\351\227\264\345\244\215\346\235\202\345\272\246.md" @@ -65,4 +65,4 @@ for (int i = 0; i < n; i++) { ----------------------- -
+
diff --git "a/problems/\345\211\215\345\272\217/\347\256\227\346\263\225\350\266\205\346\227\266.md" "b/problems/\345\211\215\345\272\217/\347\256\227\346\263\225\350\266\205\346\227\266.md" index ca1a422c0b..5603412717 100644 --- "a/problems/\345\211\215\345\272\217/\347\256\227\346\263\225\350\266\205\346\227\266.md" +++ "b/problems/\345\211\215\345\272\217/\347\256\227\346\263\225\350\266\205\346\227\266.md" @@ -8,7 +8,7 @@ ## 超时是怎么回事 -![程序超时](https://file.kamacoder.com/pics/20200729112716117-20230310124308704.png) +![程序超时](https://file1.kamacoder.com/i/algo/20200729112716117-20230310124308704.png) 大家在leetcode上练习算法的时候应该都遇到过一种错误是“超时”。 @@ -124,11 +124,11 @@ int main() { 来看一下运行的效果,如下图: -![程序超时2](https://file.kamacoder.com/pics/20200729200018460-20230310124315093.png) +![程序超时2](https://file1.kamacoder.com/i/algo/20200729200018460-20230310124315093.png) O(n)的算法,1s内大概计算机可以运行 5 * (10^8)次计算,可以推测一下 $O(n^2)$ 的算法应该1s可以处理的数量级的规模是 5 * (10^8)开根号,实验数据如下。 -![程序超时3](https://file.kamacoder.com/pics/2020072919590970-20230310124318532.png) +![程序超时3](https://file1.kamacoder.com/i/algo/2020072919590970-20230310124318532.png) O(n^2)的算法,1s内大概计算机可以运行 22500次计算,验证了刚刚的推测。 @@ -136,7 +136,7 @@ O(n^2)的算法,1s内大概计算机可以运行 22500次计算,验证了刚 理论上应该是比 $O(n)$ 少一个数量级,因为 $\log n$ 的复杂度 其实是很快,看一下实验数据。 -![程序超时4](https://file.kamacoder.com/pics/20200729195729407-20230310124322232.png) +![程序超时4](https://file1.kamacoder.com/i/algo/20200729195729407-20230310124322232.png) $O(n\log n)$ 的算法,1s内大概计算机可以运行 2 * (10^7)次计算,符合预期。 @@ -144,7 +144,7 @@ $O(n\log n)$ 的算法,1s内大概计算机可以运行 2 * (10^7)次计算, **整体测试数据整理如下:** -![程序超时1](https://file.kamacoder.com/pics/20201208231559175-20230310124325152.png) +![程序超时1](https://file1.kamacoder.com/i/algo/20201208231559175-20230310124325152.png) 至于 $O(\log n)$ 和 $O(n^3)$ 等等这些时间复杂度在1s内可以处理的多大的数据规模,大家可以自己写一写代码去测一下了。 @@ -278,4 +278,4 @@ public class TimeComplexity { ----------------------- -
+
diff --git "a/problems/\345\211\215\345\272\217/\351\200\222\345\275\222\347\256\227\346\263\225\347\232\204\346\227\266\351\227\264\344\270\216\347\251\272\351\227\264\345\244\215\346\235\202\345\272\246\345\210\206\346\236\220.md" "b/problems/\345\211\215\345\272\217/\351\200\222\345\275\222\347\256\227\346\263\225\347\232\204\346\227\266\351\227\264\344\270\216\347\251\272\351\227\264\345\244\215\346\235\202\345\272\246\345\210\206\346\236\220.md" index 035399ce0f..01c07a5c00 100644 --- "a/problems/\345\211\215\345\272\217/\351\200\222\345\275\222\347\256\227\346\263\225\347\232\204\346\227\266\351\227\264\344\270\216\347\251\272\351\227\264\345\244\215\346\235\202\345\272\246\345\210\206\346\236\220.md" +++ "b/problems/\345\211\215\345\272\217/\351\200\222\345\275\222\347\256\227\346\263\225\347\232\204\346\227\266\351\227\264\344\270\216\347\251\272\351\227\264\345\244\215\346\235\202\345\272\246\345\210\206\346\236\220.md" @@ -29,7 +29,7 @@ int fibonacci(int i) { 可以看出上面的代码每次递归都是O(1)的操作。再来看递归了多少次,这里将i为5作为输入的递归过程 抽象成一棵递归树,如图: -![递归空间复杂度分析](https://file.kamacoder.com/pics/20210305093200104.png) +![递归空间复杂度分析](https://file1.kamacoder.com/i/algo/20210305093200104.png) 从图中,可以看出f(5)是由f(4)和f(3)相加而来,那么f(4)是由f(3)和f(2)相加而来 以此类推。 @@ -196,7 +196,7 @@ int main() 在看递归的深度是多少呢?如图所示: -![递归空间复杂度分析](https://file.kamacoder.com/pics/20210305094749554.png) +![递归空间复杂度分析](https://file1.kamacoder.com/i/algo/20210305094749554.png) 递归第n个斐波那契数的话,递归调用栈的深度就是n。 @@ -214,7 +214,7 @@ int fibonacci(int i) { 最后对各种求斐波那契数列方法的性能做一下分析,如题: -![递归的空间复杂度分析](https://file.kamacoder.com/pics/20210305095227356.png) +![递归的空间复杂度分析](https://file1.kamacoder.com/i/algo/20210305095227356.png) 可以看出,求斐波那契数的时候,使用递归算法并不一定是在性能上是最优的,但递归确实简化的代码层面的复杂度。 @@ -264,4 +264,4 @@ int binary_search( int arr[], int l, int r, int x) { ----------------------- -
+
diff --git "a/problems/\345\211\215\345\272\217/\351\200\222\345\275\222\347\256\227\346\263\225\347\232\204\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246.md" "b/problems/\345\211\215\345\272\217/\351\200\222\345\275\222\347\256\227\346\263\225\347\232\204\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246.md" index befe549874..a02c37f2c9 100644 --- "a/problems/\345\211\215\345\272\217/\351\200\222\345\275\222\347\256\227\346\263\225\347\232\204\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246.md" +++ "b/problems/\345\211\215\345\272\217/\351\200\222\345\275\222\347\256\227\346\263\225\347\232\204\346\227\266\351\227\264\345\244\215\346\235\202\345\272\246.md" @@ -69,7 +69,7 @@ int function3(int x, int n) { 我们来分析一下,首先看递归了多少次呢,可以把递归抽象出一棵满二叉树。刚刚同学写的这个算法,可以用一棵满二叉树来表示(为了方便表示,选择n为偶数16),如图: -![递归算法的时间复杂度](https://file.kamacoder.com/pics/20201209193909426.png) +![递归算法的时间复杂度](https://file1.kamacoder.com/i/algo/20201209193909426.png) 当前这棵二叉树就是求x的n次方,n为16的情况,n为16的时候,进行了多少次乘法运算呢? @@ -79,7 +79,7 @@ int function3(int x, int n) { 这么如果是求x的n次方,这个递归树有多少个节点呢,如下图所示:(m为深度,从0开始) -![递归求时间复杂度](https://file.kamacoder.com/pics/20200728195531892.png) +![递归求时间复杂度](https://file1.kamacoder.com/i/algo/20200728195531892.png) **时间复杂度忽略掉常数项`-1`之后,这个递归算法的时间复杂度依然是O(n)**。对,你没看错,依然是O(n)的时间复杂度! @@ -140,4 +140,4 @@ int function3(int x, int n) { ----------------------- -
+
diff --git "a/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" "b/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" old mode 100644 new mode 100755 index a88919d4ca..547cae8a30 --- "a/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" +++ "b/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" @@ -35,11 +35,11 @@ 如图: -![](https://file.kamacoder.com/pics/20231030165201.png) +![](https://file1.kamacoder.com/i/algo/20231030165201.png) 然后从后向前替换数字字符,也就是双指针法,过程如下:i指向新长度的末尾,j指向旧长度的末尾。 -![](https://file.kamacoder.com/pics/20231030173058.png) +![](https://file1.kamacoder.com/i/algo/20231030173058.png) 有同学问了,为什么要从后向前填充,从前向后填充不行么? diff --git "a/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" "b/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" old mode 100644 new mode 100755 index 4c62312c8b..025073220a --- "a/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" +++ "b/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" @@ -44,16 +44,16 @@ fgabcde 本题中,我们需要将字符串右移n位,字符串相当于分成了两个部分,如果n为2,符串相当于分成了两个部分,如图: (length为字符串长度) -![](https://file.kamacoder.com/pics/20231106170143.png) +![](https://file1.kamacoder.com/i/algo/20231106170143.png) 右移n位, 就是将第二段放在前面,第一段放在后面,先不考虑里面字符的顺序,是不是整体倒叙不就行了。如图: -![](https://file.kamacoder.com/pics/20231106171557.png) +![](https://file1.kamacoder.com/i/algo/20231106171557.png) 此时第一段和第二段的顺序是我们想要的,但里面的字符位置被我们倒叙,那么此时我们在把 第一段和第二段里面的字符再倒叙一把,这样字符顺序不就正确了。 如果: -![](https://file.kamacoder.com/pics/20231106172058.png) +![](https://file1.kamacoder.com/i/algo/20231106172058.png) 其实,思路就是 通过 整体倒叙,把两段子串顺序颠倒,两个段子串里的的字符在倒叙一把,**负负得正**,这样就不影响子串里面字符的顺序了。 @@ -84,7 +84,7 @@ int main() { 可以的,不过,要记得 控制好 局部反转的长度,如果先局部反转,那么先反转的子串长度就是 len - n,如图: -![](https://file.kamacoder.com/pics/20231106172534.png) +![](https://file1.kamacoder.com/i/algo/20231106172534.png) 代码如下: diff --git "a/problems/\345\212\250\346\200\201\350\247\204\345\210\222-\350\202\241\347\245\250\351\227\256\351\242\230\346\200\273\347\273\223\347\257\207.md" "b/problems/\345\212\250\346\200\201\350\247\204\345\210\222-\350\202\241\347\245\250\351\227\256\351\242\230\346\200\273\347\273\223\347\257\207.md" old mode 100644 new mode 100755 index 314fb471b1..ff73cd9606 --- "a/problems/\345\212\250\346\200\201\350\247\204\345\210\222-\350\202\241\347\245\250\351\227\256\351\242\230\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/\345\212\250\346\200\201\350\247\204\345\210\222-\350\202\241\347\245\250\351\227\256\351\242\230\346\200\273\347\273\223\347\257\207.md" @@ -6,7 +6,7 @@ 之前我们已经把力扣上股票系列的题目都讲过的,但没有来一篇股票总结,来帮大家高屋建瓴,所以总结篇这就来了! -![股票问题总结](https://code-thinking.cdn.bcebos.com/pics/%E8%82%A1%E7%A5%A8%E9%97%AE%E9%A2%98%E6%80%BB%E7%BB%93.jpg) +![股票问题总结](https://file1.kamacoder.com/i/algo/%E8%82%A1%E7%A5%A8%E9%97%AE%E9%A2%98%E6%80%BB%E7%BB%93.jpg) * [动态规划:121.买卖股票的最佳时机](https://programmercarl.com/0121.买卖股票的最佳时机.html) * [动态规划:122.买卖股票的最佳时机II](https://programmercarl.com/0122.买卖股票的最佳时机II(动态规划).html) diff --git "a/problems/\345\212\250\346\200\201\350\247\204\345\210\222\346\200\273\347\273\223\347\257\207.md" "b/problems/\345\212\250\346\200\201\350\247\204\345\210\222\346\200\273\347\273\223\347\257\207.md" old mode 100644 new mode 100755 index faca5ecb55..32df8af41c --- "a/problems/\345\212\250\346\200\201\350\247\204\345\210\222\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/\345\212\250\346\200\201\350\247\204\345\210\222\346\200\273\347\273\223\347\257\207.md" @@ -51,7 +51,7 @@ ## 背包问题系列 -背包问题大纲 +背包问题大纲 * [动态规划:关于01背包问题,你该了解这些!](https://programmercarl.com/背包理论基础01背包-1.html) * [动态规划:关于01背包问题,你该了解这些!(滚动数组)](https://programmercarl.com/背包理论基础01背包-2.html) @@ -77,7 +77,7 @@ ## 股票系列 -股票问题总结 +股票问题总结 * [动态规划:买卖股票的最佳时机](https://programmercarl.com/0121.买卖股票的最佳时机.html) * [动态规划:本周我们都讲了这些(系列六)](https://programmercarl.com/周总结/20210225动规周末总结.html) @@ -91,7 +91,7 @@ ## 子序列系列 - + * [动态规划:最长递增子序列](https://programmercarl.com/0300.最长上升子序列.html) * [动态规划:最长连续递增序列](https://programmercarl.com/0674.最长连续递增序列.html) diff --git "a/problems/\345\212\250\346\200\201\350\247\204\345\210\222\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\345\212\250\346\200\201\350\247\204\345\210\222\347\220\206\350\256\272\345\237\272\347\241\200.md" old mode 100644 new mode 100755 index 634f710f9a..63f059798e --- "a/problems/\345\212\250\346\200\201\350\247\204\345\210\222\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\345\212\250\346\200\201\350\247\204\345\210\222\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -6,7 +6,7 @@ 动态规划刷题大纲 - + ## 算法公开课 diff --git "a/problems/\345\217\214\346\214\207\351\222\210\346\200\273\347\273\223.md" "b/problems/\345\217\214\346\214\207\351\222\210\346\200\273\347\273\223.md" old mode 100644 new mode 100755 diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20200927\344\272\214\345\217\211\346\240\221\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20200927\344\272\214\345\217\211\346\240\221\345\221\250\346\234\253\346\200\273\347\273\223.md" index 594656ca23..11dd298292 100644 --- "a/problems/\345\221\250\346\200\273\347\273\223/20200927\344\272\214\345\217\211\346\240\221\345\221\250\346\234\253\346\200\273\347\273\223.md" +++ "b/problems/\345\221\250\346\200\273\347\273\223/20200927\344\272\214\345\217\211\346\240\221\345\221\250\346\234\253\346\200\273\347\273\223.md" @@ -203,4 +203,4 @@ public: **本周我们都是讲解了二叉树,从理论基础到遍历方式,从递归到迭代,从深度遍历到广度遍历,最后再用了一个翻转二叉树的题目把我们之前讲过的遍历方式都串了起来。** -
+
diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20201003\344\272\214\345\217\211\346\240\221\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20201003\344\272\214\345\217\211\346\240\221\345\221\250\346\234\253\346\200\273\347\273\223.md" index 3212ca5603..5b25e9c076 100644 --- "a/problems/\345\221\250\346\200\273\347\273\223/20201003\344\272\214\345\217\211\346\240\221\345\221\250\346\234\253\346\200\273\347\273\223.md" +++ "b/problems/\345\221\250\346\200\273\347\273\223/20201003\344\272\214\345\217\211\346\240\221\345\221\250\346\234\253\346\200\273\347\273\223.md" @@ -254,5 +254,5 @@ traversal(cur->left, tmp, result); * Github:[leetcode-master](https://github.com/youngyangyang04/leetcode-master) * 知乎:[代码随想录](https://www.zhihu.com/people/sun-xiu-yang-64) -![](https://file.kamacoder.com/pics/2021013018121150.png) -
+![](https://file1.kamacoder.com/i/algo/2021013018121150.png) +
diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20201010\344\272\214\345\217\211\346\240\221\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20201010\344\272\214\345\217\211\346\240\221\345\221\250\346\234\253\346\200\273\347\273\223.md" index 5f5f688a13..94d95efd38 100644 --- "a/problems/\345\221\250\346\200\273\347\273\223/20201010\344\272\214\345\217\211\346\240\221\345\221\250\346\234\253\346\200\273\347\273\223.md" +++ "b/problems/\345\221\250\346\200\273\347\273\223/20201010\344\272\214\345\217\211\346\240\221\345\221\250\346\234\253\346\200\273\347\273\223.md" @@ -87,4 +87,4 @@ **如果大家一路跟下来,一定收获满满,如果周末不做这个总结,大家可能都不知道自己收获满满,啊哈!** -
+
diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20201017\344\272\214\345\217\211\346\240\221\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20201017\344\272\214\345\217\211\346\240\221\345\221\250\346\234\253\346\200\273\347\273\223.md" index 03148b1575..5276cdde6b 100644 --- "a/problems/\345\221\250\346\200\273\347\273\223/20201017\344\272\214\345\217\211\346\240\221\345\221\250\346\234\253\346\200\273\347\273\223.md" +++ "b/problems/\345\221\250\346\200\273\347\273\223/20201017\344\272\214\345\217\211\346\240\221\345\221\250\346\234\253\346\200\273\347\273\223.md" @@ -116,4 +116,4 @@ 大家如果每天坚持跟下来,会发现又是充实的一周![机智] -
+
diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20201030\345\233\236\346\272\257\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20201030\345\233\236\346\272\257\345\221\250\346\234\253\346\200\273\347\273\223.md" index 77db9708c0..e8e2948791 100644 --- "a/problems/\345\221\250\346\200\273\347\273\223/20201030\345\233\236\346\272\257\345\221\250\346\234\253\346\200\273\347\273\223.md" +++ "b/problems/\345\221\250\346\200\273\347\273\223/20201030\345\233\236\346\272\257\345\221\250\346\234\253\346\200\273\347\273\223.md" @@ -114,4 +114,4 @@ * B站:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20201107\345\233\236\346\272\257\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20201107\345\233\236\346\272\257\345\221\250\346\234\253\346\200\273\347\273\223.md" index d910ce2509..9da360c2c6 100644 --- "a/problems/\345\221\250\346\200\273\347\273\223/20201107\345\233\236\346\272\257\345\221\250\346\234\253\346\200\273\347\273\223.md" +++ "b/problems/\345\221\250\346\200\273\347\273\223/20201107\345\233\236\346\272\257\345\221\250\346\234\253\346\200\273\347\273\223.md" @@ -31,7 +31,7 @@ for (int i = startIndex; i < candidates.size() && sum + candidates[i] <= target; 在[回溯算法:求组合总和(二)](https://programmercarl.com/0039.组合总和.html)第一个树形结构没有画出startIndex的作用,**这里这里纠正一下,准确的树形结构如图所示:** -![39.组合总和](https://file.kamacoder.com/pics/20201223170730367.png) +![39.组合总和](https://file1.kamacoder.com/i/algo/20201223170730367.png) ## 周二 @@ -45,7 +45,7 @@ for (int i = startIndex; i < candidates.size() && sum + candidates[i] <= target; 都知道组合问题可以抽象为树形结构,那么“使用过”在这个树形结构上是有两个维度的,一个维度是同一树枝上“使用过”,一个维度是同一树层上“使用过”。**没有理解这两个层面上的“使用过” 是造成大家没有彻底理解去重的根本原因**。 -![40.组合总和II1](https://file.kamacoder.com/pics/20201123202817973.png) +![40.组合总和II1](https://file1.kamacoder.com/i/algo/20201123202817973.png) 我在图中将used的变化用橘黄色标注上,可以看出在candidates[i] == candidates[i - 1]相同的情况下: @@ -79,7 +79,7 @@ for (int i = startIndex; i < candidates.size() && sum + candidates[i] <= target; **本题的树形结构中,和代码的逻辑有一个小出入,已经判断不是回文的子串就不会进入递归了,纠正如下:** -![131.分割回文串](https://file.kamacoder.com/pics/20201123203228309.png) +![131.分割回文串](https://file1.kamacoder.com/i/algo/20201123203228309.png) ## 周四 @@ -90,7 +90,7 @@ for (int i = startIndex; i < candidates.size() && sum + candidates[i] <= target; 树形图如下: -![93.复原IP地址](https://file.kamacoder.com/pics/20201123203735933-20230310133532452.png) +![93.复原IP地址](https://file1.kamacoder.com/i/algo/20201123203735933-20230310133532452.png) 在本文的树形结构图中,我已经把详细的分析思路都画了出来,相信大家看了之后一定会思路清晰不少! @@ -112,7 +112,7 @@ if (s.size() > 12) return result; // 剪枝 如图: -![78.子集](https://file.kamacoder.com/pics/202011232041348.png) +![78.子集](https://file1.kamacoder.com/i/algo/202011232041348.png) 认清这个本质之后,今天的题目就是一道模板题了。 @@ -166,4 +166,4 @@ leetcode上的计时应该是以4ms为单位,有的多提交几次,多个4ms -
+
diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20201112\345\233\236\346\272\257\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20201112\345\233\236\346\272\257\345\221\250\346\234\253\346\200\273\347\273\223.md" index c2e122844d..031ddc0250 100644 --- "a/problems/\345\221\250\346\200\273\347\273\223/20201112\345\233\236\346\272\257\345\221\250\346\234\253\346\200\273\347\273\223.md" +++ "b/problems/\345\221\250\346\200\273\347\273\223/20201112\345\233\236\346\272\257\345\221\250\346\234\253\346\200\273\347\273\223.md" @@ -11,14 +11,14 @@ 树形结构如下: -![90.子集II](https://file.kamacoder.com/pics/2020111217110449-20230310133150714.png) +![90.子集II](https://file1.kamacoder.com/i/algo/2020111217110449-20230310133150714.png) ## 周二 在[回溯算法:递增子序列](https://programmercarl.com/0491.递增子序列.html)中,处处都能看到子集的身影,但处处是陷阱,值得好好琢磨琢磨! 树形结构如下: -![491. 递增子序列1](https://file.kamacoder.com/pics/20201112170832333-20230310133155209.png) +![491. 递增子序列1](https://file1.kamacoder.com/i/algo/20201112170832333-20230310133155209.png) [回溯算法:递增子序列](https://programmercarl.com/0491.递增子序列.html)留言区大家有很多疑问,主要还是和[回溯算法:求子集问题(二)](https://programmercarl.com/0090.子集II.html)混合在了一起。 @@ -33,7 +33,7 @@ 可以看出元素1在[1,2]中已经使用过了,但是在[2,1]中还要在使用一次1,所以处理排列问题就不用使用startIndex了。 如图: -![46.全排列](https://file.kamacoder.com/pics/20201112170304979-20230310133201250.png) +![46.全排列](https://file1.kamacoder.com/i/algo/20201112170304979-20230310133201250.png) **大家此时可以感受出排列问题的不同:** @@ -46,7 +46,7 @@ 树形结构如下: -![47.全排列II1](https://file.kamacoder.com/pics/20201112171930470-20230310133206398.png) +![47.全排列II1](https://file1.kamacoder.com/i/algo/20201112171930470-20230310133206398.png) **这道题目神奇的地方就是used[i - 1] == false也可以,used[i - 1] == true也可以!** @@ -54,11 +54,11 @@ 树层上去重(used[i - 1] == false),的树形结构如下: -![47.全排列II2.png](https://file.kamacoder.com/pics/20201112172230434-20230310133211392.png) +![47.全排列II2.png](https://file1.kamacoder.com/i/algo/20201112172230434-20230310133211392.png) 树枝上去重(used[i - 1] == true)的树型结构如下: -![47.全排列II3](https://file.kamacoder.com/pics/20201112172327967-20230310133216389.png) +![47.全排列II3](https://file1.kamacoder.com/i/algo/20201112172327967-20230310133216389.png) **可以清晰的看到使用(used[i - 1] == false),即树层去重,效率更高!** @@ -97,4 +97,4 @@ -
+
diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20201126\350\264\252\345\277\203\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20201126\350\264\252\345\277\203\345\221\250\346\234\253\346\200\273\347\273\223.md" index 3494a32074..d934270a27 100644 --- "a/problems/\345\221\250\346\200\273\347\273\223/20201126\350\264\252\345\277\203\345\221\250\346\234\253\346\200\273\347\273\223.md" +++ "b/problems/\345\221\250\346\200\273\347\273\223/20201126\350\264\252\345\277\203\345\221\250\346\234\253\346\200\273\347\273\223.md" @@ -112,4 +112,4 @@ public: -
+
diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20201203\350\264\252\345\277\203\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20201203\350\264\252\345\277\203\345\221\250\346\234\253\346\200\273\347\273\223.md" index 4ab1cddbff..70081e82e2 100644 --- "a/problems/\345\221\250\346\200\273\347\273\223/20201203\350\264\252\345\277\203\345\221\250\346\234\253\346\200\273\347\273\223.md" +++ "b/problems/\345\221\250\346\200\273\347\273\223/20201203\350\264\252\345\277\203\345\221\250\346\234\253\346\200\273\347\273\223.md" @@ -15,7 +15,7 @@ 如图: -![122.买卖股票的最佳时机II](https://file.kamacoder.com/pics/2020112917480858.png) +![122.买卖股票的最佳时机II](https://file1.kamacoder.com/i/algo/2020112917480858.png) ## 周二 @@ -31,7 +31,7 @@ 如图: -![55.跳跃游戏](https://file.kamacoder.com/pics/20201124154758229.png) +![55.跳跃游戏](https://file1.kamacoder.com/i/algo/20201124154758229.png) ## 周三 @@ -44,7 +44,7 @@ 如图: -![45.跳跃游戏II](https://file.kamacoder.com/pics/20201201232309103-20230310133110942.png) +![45.跳跃游戏II](https://file1.kamacoder.com/i/algo/20201201232309103-20230310133110942.png) 注意:**图中的移动下标是到当前这步覆盖的最远距离(下标2的位置),此时没有到终点,只能增加第二步来扩大覆盖范围**。 @@ -55,10 +55,10 @@ 而版本二就比较统一的,超过范围,步数就加一,但在移动下标的范围了做了文章。 即如果覆盖最远距离下标是倒数第二点:直接加一就行,默认一定可以到终点。如图: -![45.跳跃游戏II2](https://file.kamacoder.com/pics/20201201232445286-20230310133115650.png) +![45.跳跃游戏II2](https://file1.kamacoder.com/i/algo/20201201232445286-20230310133115650.png) 如果覆盖最远距离下标不是倒数第二点,说明本次覆盖已经到终点了。如图: -![45.跳跃游戏II1](https://file.kamacoder.com/pics/20201201232338693-20230310133120115.png) +![45.跳跃游戏II1](https://file1.kamacoder.com/i/algo/20201201232338693-20230310133120115.png) 有的录友认为版本一好理解,有的录友认为版本二好理解,其实掌握一种就可以了,也不用非要比拼一下代码的简洁性,简洁程度都差不多了。 @@ -92,4 +92,4 @@ -
+
diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20201210\345\244\215\346\235\202\345\272\246\345\210\206\346\236\220\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20201210\345\244\215\346\235\202\345\272\246\345\210\206\346\236\220\345\221\250\346\234\253\346\200\273\347\273\223.md" index f449995b01..dec7511c21 100644 --- "a/problems/\345\221\250\346\200\273\347\273\223/20201210\345\244\215\346\235\202\345\272\246\345\210\206\346\236\220\345\221\250\346\234\253\346\200\273\347\273\223.md" +++ "b/problems/\345\221\250\346\200\273\347\273\223/20201210\345\244\215\346\235\202\345\272\246\345\210\206\346\236\220\345\221\250\346\234\253\346\200\273\347\273\223.md" @@ -77,7 +77,7 @@ 文中从计算机硬件出发,分析计算机的计算性能,然后亲自做实验,整理出数据如下: -![程序超时1](https://file.kamacoder.com/pics/20201208231559175-20230310133304038.png) +![程序超时1](https://file1.kamacoder.com/i/algo/20201208231559175-20230310133304038.png) **大家有一个数量级上的概念就可以了!** @@ -120,4 +120,4 @@ 就酱,「代码随想录」是技术公众号里的一抹清流,值得推荐给身边的朋友同学们! -
+
diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20201217\350\264\252\345\277\203\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20201217\350\264\252\345\277\203\345\221\250\346\234\253\346\200\273\347\273\223.md" index 19a95615a3..cface1c9d3 100644 --- "a/problems/\345\221\250\346\200\273\347\273\223/20201217\350\264\252\345\277\203\345\221\250\346\234\253\346\200\273\347\273\223.md" +++ "b/problems/\345\221\250\346\200\273\347\273\223/20201217\350\264\252\345\277\203\345\221\250\346\234\253\346\200\273\347\273\223.md" @@ -38,7 +38,7 @@ 如图: -![135.分发糖果](https://file.kamacoder.com/pics/20201117114916878-20230310133332759.png) +![135.分发糖果](https://file1.kamacoder.com/i/algo/20201117114916878-20230310133332759.png) 接着在贪心另一边,左孩子大于右孩子,左孩子的糖果就要比右孩子多。 @@ -50,7 +50,7 @@ 局部最优可以推出全局最优。 如图: -![135.分发糖果1](https://file.kamacoder.com/pics/20201117115658791-20230310133346127.png) +![135.分发糖果1](https://file1.kamacoder.com/i/algo/20201117115658791-20230310133346127.png) ## 周三 @@ -98,4 +98,4 @@ 而且大家也会发现,贪心并没有想象中的那么简单,贪心往往妙的出其不意,触不及防! -
+
diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20201224\350\264\252\345\277\203\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20201224\350\264\252\345\277\203\345\221\250\346\234\253\346\200\273\347\273\223.md" index a8ba7454eb..71abb155c6 100644 --- "a/problems/\345\221\250\346\200\273\347\273\223/20201224\350\264\252\345\277\203\345\221\250\346\234\253\346\200\273\347\273\223.md" +++ "b/problems/\345\221\250\346\200\273\347\273\223/20201224\350\264\252\345\277\203\345\221\250\346\234\253\346\200\273\347\273\223.md" @@ -9,7 +9,7 @@ 如图: -![452.用最少数量的箭引爆气球](https://file.kamacoder.com/pics/20201123101929791-20230310133845522.png) +![452.用最少数量的箭引爆气球](https://file1.kamacoder.com/i/algo/20201123101929791-20230310133845522.png) 模拟射气球的过程,很多同学真的要去模拟了,实时把气球从数组中移走,这么写的话就复杂了,从前向后遍历重复的只要跳过就可以的。 @@ -21,7 +21,7 @@ 如图: -![435.无重叠区间](https://file.kamacoder.com/pics/20201221201553618.png) +![435.无重叠区间](https://file1.kamacoder.com/i/algo/20201221201553618.png) 细心的同学就发现了,此题和 [贪心算法:用最少数量的箭引爆气球](https://programmercarl.com/0452.用最少数量的箭引爆气球.html)非常像。 @@ -71,7 +71,7 @@ public: 如图: -![763.划分字母区间](https://file.kamacoder.com/pics/20201222191924417-20230310133855435.png) +![763.划分字母区间](https://file1.kamacoder.com/i/algo/20201222191924417-20230310133855435.png) ## 周四 @@ -86,7 +86,7 @@ public: 如图: -![56.合并区间](https://file.kamacoder.com/pics/20201223200632791-20230310133859587.png) +![56.合并区间](https://file1.kamacoder.com/i/algo/20201223200632791-20230310133859587.png) ## 总结 @@ -102,4 +102,4 @@ public: **「代码随想录」里总结的都是经典题目,大家跟着练就节省了不少选择题目的时间了**。 -
+
diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20210107\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20210107\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" index da2ebd3051..e74907013c 100644 --- "a/problems/\345\221\250\346\200\273\347\273\223/20210107\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" +++ "b/problems/\345\221\250\346\200\273\347\273\223/20210107\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" @@ -150,4 +150,4 @@ public: -
+
diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20210114\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20210114\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" index 1b6bd84bcc..7cedf63919 100644 --- "a/problems/\345\221\250\346\200\273\347\273\223/20210114\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" +++ "b/problems/\345\221\250\346\200\273\347\273\223/20210114\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" @@ -31,7 +31,7 @@ for (int i = 1; i < m; i++) { } ``` -![62.不同路径1](https://file.kamacoder.com/pics/20201209113631392-20230310133703294.png) +![62.不同路径1](https://file1.kamacoder.com/i/algo/20201209113631392-20230310133703294.png) ## 周二 @@ -45,7 +45,7 @@ dp[i][j]定义依然是:表示从(0 ,0)出发,到(i, j) 有dp[i][j]条 如图: -![63.不同路径II](https://file.kamacoder.com/pics/20210104114513928-20230310133707783.png) +![63.不同路径II](https://file1.kamacoder.com/i/algo/20210104114513928-20230310133707783.png) 这里难住了不少同学,代码如下: @@ -70,11 +70,11 @@ for (int i = 1; i < m; i++) { 拿示例1来举例如题: -![63.不同路径II1](https://file.kamacoder.com/pics/20210104114548983-20230310133711888.png) +![63.不同路径II1](https://file1.kamacoder.com/i/algo/20210104114548983-20230310133711888.png) 对应的dp table 如图: -![63.不同路径II2](https://file.kamacoder.com/pics/20210104114610256-20230310133715981.png) +![63.不同路径II2](https://file1.kamacoder.com/i/algo/20210104114610256-20230310133715981.png) ## 周三 @@ -111,7 +111,7 @@ for (int i = 3; i <= n ; i++) { 举例当n为10 的时候,dp数组里的数值,如下: -![343.整数拆分](https://file.kamacoder.com/pics/20210104173021581-20230310133720552.png) +![343.整数拆分](https://file1.kamacoder.com/i/algo/20210104173021581-20230310133720552.png) @@ -143,7 +143,7 @@ dp数组如何初始化:只需要初始化dp[0]就可以了,推导的基础 n为5时候的dp数组状态如图: -![96.不同的二叉搜索树3](https://file.kamacoder.com/pics/20210107093253987-20230310133724531.png) +![96.不同的二叉搜索树3](https://file1.kamacoder.com/i/algo/20210107093253987-20230310133724531.png) ## 总结 @@ -153,4 +153,4 @@ n为5时候的dp数组状态如图: **但我还会坚持规划好的路线,难度循序渐进,并以面试经典题目为准,该简单的时候就是简单,同时也不会因为阅读量低就放弃有难度的题目!**。 -
+
diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20210121\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20210121\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" index dc32891da8..8ae7882e61 100644 --- "a/problems/\345\221\250\346\200\273\347\273\223/20210121\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" +++ "b/problems/\345\221\250\346\200\273\347\273\223/20210121\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" @@ -17,7 +17,7 @@ 关于其他几种常用的背包,大家看这张图就了然于胸了: -![416.分割等和子集1](https://file.kamacoder.com/pics/20210117171307407-20230310133624872.png) +![416.分割等和子集1](https://file1.kamacoder.com/i/algo/20210117171307407-20230310133624872.png) 本文用动规五部曲详细讲解了01背包的二维dp数组的实现方法,大家其实可以发现最简单的是推导公式了,推导公式估计看一遍就记下来了,但难就难在确定初始化和遍历顺序上。 @@ -70,7 +70,7 @@ for(int i = 1; i < weight.size(); i++) { // 遍历物品 来看一下对应的dp数组的数值,如图: -![动态规划-背包问题4](https://file.kamacoder.com/pics/20210118163425129-20230310133630224.jpg) +![动态规划-背包问题4](https://file1.kamacoder.com/i/algo/20210118163425129-20230310133630224.jpg) 最终结果就是dp[2][4]。 @@ -122,7 +122,7 @@ for(int i = 0; i < weight.size(); i++) { // 遍历物品 一维dp,分别用物品0,物品1,物品2 来遍历背包,最终得到结果如下: -![动态规划-背包问题9](https://file.kamacoder.com/pics/20210110103614769-20230310133634873.png) +![动态规划-背包问题9](https://file1.kamacoder.com/i/algo/20210110103614769-20230310133634873.png) ## 周三 @@ -160,4 +160,4 @@ for(int i = 0; i < weight.size(); i++) { // 遍历物品 就像是我们讲解01背包的时候,花了那么大力气才把每一个细节都讲清楚,这里其实是基础,后面的背包问题怎么变,基础比较牢固自然会有自己的一套思考过程。 -
+
diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20210128\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20210128\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" index 8598ec69f0..ff3b771aa8 100644 --- "a/problems/\345\221\250\346\200\273\347\273\223/20210128\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" +++ "b/problems/\345\221\250\346\200\273\347\273\223/20210128\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" @@ -35,7 +35,7 @@ bagSize = (S + sum) / 2 = (3 + 5) / 2 = 4 dp数组状态变化如下: -![494.目标和](https://file.kamacoder.com/pics/20210125120743274-20230310132918821.jpg) +![494.目标和](https://file1.kamacoder.com/i/algo/20210125120743274-20230310132918821.jpg) ## 周二 @@ -73,7 +73,7 @@ dp[i][j] = max(dp[i][j], dp[i - zeroNum][j - oneNum] + 1); 最后dp数组的状态如下所示: -![474.一和零](https://file.kamacoder.com/pics/20210120111201512-20230310132936011.jpg) +![474.一和零](https://file1.kamacoder.com/i/algo/20210120111201512-20230310132936011.jpg) ## 周三 @@ -140,4 +140,4 @@ for(int i = 0; i < weight.size(); i++) { // 遍历物品 此时相信大家对动规五部曲也有更深的理解了,同样也验证了Carl之前讲过的:**简单题是用来学习方法论的,而遇到难题才体现出方法论的重要性!** -
+
diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20210204\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20210204\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" index fb570bd402..e1e6baf503 100644 --- "a/problems/\345\221\250\346\200\273\347\273\223/20210204\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" +++ "b/problems/\345\221\250\346\200\273\347\273\223/20210204\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" @@ -200,4 +200,4 @@ public: 此时我们就已经把完全背包的遍历顺序研究的透透的了! -
+
diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20210225\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20210225\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" index 309f277f6a..b17a682972 100644 --- "a/problems/\345\221\250\346\200\273\347\273\223/20210225\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" +++ "b/problems/\345\221\250\346\200\273\347\273\223/20210225\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" @@ -30,7 +30,7 @@ dp[1] = max(nums[0], nums[1]); 以示例二,输入[2,7,9,3,1]为例。 -![198.打家劫舍](https://file.kamacoder.com/pics/20210221170954115-20230310133425353.jpg) +![198.打家劫舍](https://file1.kamacoder.com/i/algo/20210221170954115-20230310133425353.jpg) 红框dp[nums.size() - 1]为结果。 @@ -42,15 +42,15 @@ dp[1] = max(nums[0], nums[1]); * 情况一:考虑不包含首尾元素 -![213.打家劫舍II](https://file.kamacoder.com/pics/20210129160748643.jpg) +![213.打家劫舍II](https://file1.kamacoder.com/i/algo/20210129160748643.jpg) * 情况二:考虑包含首元素,不包含尾元素 -![213.打家劫舍II1](https://file.kamacoder.com/pics/20210129160821374.jpg) +![213.打家劫舍II1](https://file1.kamacoder.com/i/algo/20210129160821374.jpg) * 情况三:考虑包含尾元素,不包含首元素 -![213.打家劫舍II2](https://file.kamacoder.com/pics/20210129160842491.jpg) +![213.打家劫舍II2](https://file1.kamacoder.com/i/algo/20210129160842491.jpg) 需要注意的是,**“考虑” 不等于 “偷”**,例如情况三,虽然是考虑包含尾元素,但不一定要选尾部元素!对于情况三,取nums[1] 和 nums[3]就是最大的。 @@ -178,7 +178,7 @@ return {val2, val1}; 以示例1为例,dp数组状态如下:(**注意用后序遍历的方式推导**) -![337.打家劫舍III](https://file.kamacoder.com/pics/20210129181331613.jpg) +![337.打家劫舍III](https://file1.kamacoder.com/i/algo/20210129181331613.jpg) **最后头结点就是 取下标0 和 下标1的最大值就是偷得的最大金钱**。 @@ -306,4 +306,4 @@ public: **代码随想录温馨提醒:投资有风险,入市需谨慎!** -
+
diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20210304\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20210304\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" index 5d84fb1915..0749becbba 100644 --- "a/problems/\345\221\250\346\200\273\347\273\223/20210304\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" +++ "b/problems/\345\221\250\346\200\273\347\273\223/20210304\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" @@ -77,7 +77,7 @@ dp[0][4] = 0; 以输入[1,2,3,4,5]为例 -![123.买卖股票的最佳时机III](https://file.kamacoder.com/pics/20201228181724295.png) +![123.买卖股票的最佳时机III](https://file1.kamacoder.com/i/algo/20201228181724295.png) 可以看到红色框为最后两次卖出的状态。 @@ -144,7 +144,7 @@ for (int j = 1; j < 2 * k; j += 2) { 以输入[1,2,3,4,5],k=2为例。 -![188.买卖股票的最佳时机IV](https://file.kamacoder.com/pics/20201229100358221-20230310133805763.png) +![188.买卖股票的最佳时机IV](https://file1.kamacoder.com/i/algo/20201229100358221-20230310133805763.png) 最后一次卖出,一定是利润最大的,dp[prices.size() - 1][2 * k]即红色部分就是最后求解。 @@ -197,7 +197,7 @@ vector> dp(n, vector(3, 0)); 以 [1,2,3,0,2] 为例,dp数组如下: -![309.最佳买卖股票时机含冷冻期](https://file.kamacoder.com/pics/20201229163725348.png) +![309.最佳买卖股票时机含冷冻期](https://file1.kamacoder.com/i/algo/20201229163725348.png) 最后两个状态 不持有股票(能购买) 和 不持有股票(冷冻期)都有可能最后结果,取最大的。 @@ -206,4 +206,4 @@ vector> dp(n, vector(3, 0)); 下周还会有一篇股票系列的文章,**股票系列后面我也会单独写一篇总结,来高度概括一下,这样大家会对股票问题就有一个整体性的理解了**。 -
+
diff --git "a/problems/\345\221\250\346\200\273\347\273\223/\344\272\214\345\217\211\346\240\221\351\230\266\346\256\265\346\200\273\347\273\223\347\263\273\345\210\227\344\270\200.md" "b/problems/\345\221\250\346\200\273\347\273\223/\344\272\214\345\217\211\346\240\221\351\230\266\346\256\265\346\200\273\347\273\223\347\263\273\345\210\227\344\270\200.md" index 52e2fec11f..6cbf6e2a77 100644 --- "a/problems/\345\221\250\346\200\273\347\273\223/\344\272\214\345\217\211\346\240\221\351\230\266\346\256\265\346\200\273\347\273\223\347\263\273\345\210\227\344\270\200.md" +++ "b/problems/\345\221\250\346\200\273\347\273\223/\344\272\214\345\217\211\346\240\221\351\230\266\346\256\265\346\200\273\347\273\223\347\263\273\345\210\227\344\270\200.md" @@ -206,4 +206,4 @@ public: **本周我们都是讲解了二叉树,从理论基础到遍历方式,从递归到迭代,从深度遍历到广度遍历,最后再用了一个翻转二叉树的题目把我们之前讲过的遍历方式都串了起来。** -
+
diff --git "a/problems/\345\223\210\345\270\214\350\241\250\346\200\273\347\273\223.md" "b/problems/\345\223\210\345\270\214\350\241\250\346\200\273\347\273\223.md" old mode 100644 new mode 100755 diff --git "a/problems/\345\223\210\345\270\214\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\345\223\210\345\270\214\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" old mode 100644 new mode 100755 index 92b590bc89..e3400ad7f0 --- "a/problems/\345\223\210\345\270\214\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\345\223\210\345\270\214\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -18,7 +18,7 @@ 哈希表中关键码就是数组的索引下标,然后通过下标直接访问数组中的元素,如下图所示: -![哈希表1](https://file.kamacoder.com/pics/20210104234805168.png) +![哈希表1](https://file1.kamacoder.com/i/algo/20210104234805168.png) 那么哈希表能解决什么问题呢,**一般哈希表都是用来快速判断一个元素是否出现集合里。** @@ -36,7 +36,7 @@ 哈希函数如下图所示,通过hashCode把名字转化为数值,一般hashcode是通过特定编码方式,可以将其他数据格式转化为不同的数值,这样就把学生名字映射为哈希表上的索引数字了。 -![哈希表2](https://file.kamacoder.com/pics/2021010423484818.png) +![哈希表2](https://file1.kamacoder.com/i/algo/2021010423484818.png) 如果hashCode得到的数值大于 哈希表的大小了,也就是大于tableSize了,怎么办呢? @@ -52,7 +52,7 @@ 如图所示,小李和小王都映射到了索引下标 1 的位置,**这一现象叫做哈希碰撞**。 -![哈希表3](https://file.kamacoder.com/pics/2021010423494884.png) +![哈希表3](https://file1.kamacoder.com/i/algo/2021010423494884.png) 一般哈希碰撞有两种解决方法, 拉链法和线性探测法。 @@ -60,7 +60,7 @@ 刚刚小李和小王在索引1的位置发生了冲突,发生冲突的元素都被存储在链表中。 这样我们就可以通过索引找到小李和小王了 -![哈希表4](https://file.kamacoder.com/pics/20210104235015226.png) +![哈希表4](https://file1.kamacoder.com/i/algo/20210104235015226.png) (数据规模是dataSize, 哈希表的大小为tableSize) @@ -72,7 +72,7 @@ 例如冲突的位置,放了小李,那么就向下找一个空位放置小王的信息。所以要求tableSize一定要大于dataSize ,要不然哈希表上就没有空置的位置来存放 冲突的数据了。如图所示: -![哈希表5](https://file.kamacoder.com/pics/20210104235109950.png) +![哈希表5](https://file1.kamacoder.com/i/algo/20210104235109950.png) 其实关于哈希碰撞还有非常多的细节,感兴趣的同学可以再好好研究一下,这里我就不再赘述了。 @@ -117,7 +117,7 @@ std::unordered_map 底层实现为哈希表,std::map 和std::multimap 的底 实际上功能都是一样一样的, 但是unordered_set在C++11的时候被引入标准库了,而hash_set并没有,所以建议还是使用unordered_set比较好,这就好比一个是官方认证的,hash_set,hash_map 是C++11标准之前民间高手自发造的轮子。 -![哈希表6](https://file.kamacoder.com/pics/20210104235134572.png) +![哈希表6](https://file1.kamacoder.com/i/algo/20210104235134572.png) ## 总结 diff --git "a/problems/\345\233\236\346\272\257\346\200\273\347\273\223.md" "b/problems/\345\233\236\346\272\257\346\200\273\347\273\223.md" old mode 100644 new mode 100755 index 8fd69d518e..7a7929f41a --- "a/problems/\345\233\236\346\272\257\346\200\273\347\273\223.md" +++ "b/problems/\345\233\236\346\272\257\346\200\273\347\273\223.md" @@ -63,7 +63,7 @@ void backtracking(参数) { 本题我把回溯问题抽象为树形结构,如题: -![77.组合1](https://file.kamacoder.com/pics/20201118152928844.png) +![77.组合1](https://file1.kamacoder.com/i/algo/20201118152928844.png) 可以直观的看出其搜索的过程:**for循环横向遍历,递归纵向遍历,回溯不断调整结果集**,这个理念贯穿整个回溯法系列,也是我做了很多回溯的题目,不断摸索其规律才总结出来的。 @@ -73,7 +73,7 @@ void backtracking(参数) { 优化回溯算法只有剪枝一种方法,在[回溯算法:组合问题再剪剪枝](https://programmercarl.com/0077.组合优化.html)中把回溯法代码做了剪枝优化,树形结构如图: -![77.组合4](https://file.kamacoder.com/pics/20201118153133458.png) +![77.组合4](https://file1.kamacoder.com/i/algo/20201118153133458.png) 大家可以一目了然剪的究竟是哪里。 @@ -89,11 +89,11 @@ void backtracking(参数) { 在[回溯算法:求组合总和!](https://programmercarl.com/0216.组合总和III.html)中,相当于 [回溯算法:求组合问题!](https://programmercarl.com/0077.组合.html)加了一个元素总和的限制。 树形结构如图: -![216.组合总和III](https://file.kamacoder.com/pics/20201118201921245.png) +![216.组合总和III](https://file1.kamacoder.com/i/algo/20201118201921245.png) 整体思路还是一样的,本题的剪枝会好想一些,即:**已选元素总和如果已经大于n(题中要求的和)了,那么往后遍历就没有意义了,直接剪掉**,如图: -![216.组合总和III1](https://file.kamacoder.com/pics/20201118202038240.png) +![216.组合总和III1](https://file1.kamacoder.com/i/algo/20201118202038240.png) 在本题中,依然还可以有一个剪枝,就是[回溯算法:组合问题再剪剪枝](https://programmercarl.com/0077.组合优化.html)中提到的,对for循环选择的起始范围的剪枝。 @@ -114,7 +114,7 @@ void backtracking(参数) { **注意以上我只是说求组合的情况,如果是排列问题,又是另一套分析的套路**。 树形结构如下: -![39.组合总和](https://file.kamacoder.com/pics/20201223170730367.png) +![39.组合总和](https://file1.kamacoder.com/i/algo/20201223170730367.png) 最后还给出了本题的剪枝优化,如下: @@ -125,7 +125,7 @@ for (int i = startIndex; i < candidates.size() && sum + candidates[i] <= target; 优化后树形结构如下: -![39.组合总和1](https://file.kamacoder.com/pics/20201118202115929.png) +![39.组合总和1](https://file1.kamacoder.com/i/algo/20201118202115929.png) #### 组合总和(三) @@ -140,7 +140,7 @@ for (int i = startIndex; i < candidates.size() && sum + candidates[i] <= target; 都知道组合问题可以抽象为树形结构,那么“使用过”在这个树形结构上是有两个维度的,一个维度是同一树枝上“使用过”,一个维度是同一树层上“使用过”。**没有理解这两个层面上的“使用过” 是造成大家没有彻底理解去重的根本原因**。 -![40.组合总和II1](https://file.kamacoder.com/pics/2020111820220675.png) +![40.组合总和II1](https://file1.kamacoder.com/i/algo/2020111820220675.png) 我在图中将used的变化用橘黄色标注上,**可以看出在candidates[i] == candidates[i - 1]相同的情况下:** @@ -161,7 +161,7 @@ for (int i = startIndex; i < candidates.size() && sum + candidates[i] <= target; 树形结构如下: -![17. 电话号码的字母组合](https://file.kamacoder.com/pics/20201118202335724.png) +![17. 电话号码的字母组合](https://file1.kamacoder.com/i/algo/20201118202335724.png) 如果大家在现场面试的时候,一定要注意各种输入异常的情况,例如本题输入1 * #按键。 @@ -189,7 +189,7 @@ for (int i = startIndex; i < candidates.size() && sum + candidates[i] <= target; 树形结构如下: -![131.分割回文串](https://file.kamacoder.com/pics/20201118202448642.png) +![131.分割回文串](https://file1.kamacoder.com/i/algo/20201118202448642.png) ## 子集问题 @@ -200,7 +200,7 @@ for (int i = startIndex; i < candidates.size() && sum + candidates[i] <= target; 如图: -![78.子集](https://file.kamacoder.com/pics/20201118202544339.png) +![78.子集](https://file1.kamacoder.com/i/algo/20201118202544339.png) 认清这个本质之后,今天的题目就是一道模板题了。 @@ -227,14 +227,14 @@ if (startIndex >= nums.size()) { // 终止条件可以不加 树形结构如下: -![90.子集II](https://file.kamacoder.com/pics/2020111217110449.png) +![90.子集II](https://file1.kamacoder.com/i/algo/2020111217110449.png) ### 递增子序列 在[回溯算法:递增子序列](https://programmercarl.com/0491.递增子序列.html)中,处处都能看到子集的身影,但处处是陷阱,值得好好琢磨琢磨! 树形结构如下: -![491. 递增子序列1](https://file.kamacoder.com/pics/20201112170832333.png) +![491. 递增子序列1](https://file1.kamacoder.com/i/algo/20201112170832333.png) 很多同学都会把这道题目和[回溯算法:求子集问题(二)](https://programmercarl.com/0090.子集II.html)混在一起。 @@ -243,7 +243,7 @@ if (startIndex >= nums.size()) { // 终止条件可以不加 我用没有排序的集合{2,1,2,2}来举个例子画一个图,如下: -![90.子集II2](https://file.kamacoder.com/pics/2020111316440479.png) +![90.子集II2](https://file1.kamacoder.com/i/algo/2020111316440479.png) **相信这个图胜过千言万语的解释了**。 @@ -259,7 +259,7 @@ if (startIndex >= nums.size()) { // 终止条件可以不加 如图: -![46.全排列](https://file.kamacoder.com/pics/20201112170304979.png) +![46.全排列](https://file1.kamacoder.com/i/algo/20201112170304979.png) **大家此时可以感受出排列问题的不同:** @@ -272,7 +272,7 @@ if (startIndex >= nums.size()) { // 终止条件可以不加 树形结构如下: -![47.全排列II1](https://file.kamacoder.com/pics/20201112171930470.png) +![47.全排列II1](https://file1.kamacoder.com/i/algo/20201112171930470.png) **这道题目神奇的地方就是used[i - 1] == false也可以,used[i - 1] == true也可以!** @@ -280,11 +280,11 @@ if (startIndex >= nums.size()) { // 终止条件可以不加 树层上去重(used[i - 1] == false),的树形结构如下: -![47.全排列II2.png](https://file.kamacoder.com/pics/20201112172230434.png) +![47.全排列II2.png](https://file1.kamacoder.com/i/algo/20201112172230434.png) 树枝上去重(used[i - 1] == true)的树型结构如下: -![47.全排列II3](https://file.kamacoder.com/pics/20201112172327967.png) +![47.全排列II3](https://file1.kamacoder.com/i/algo/20201112172327967.png) **可以清晰的看到使用(used[i - 1] == false),即树层去重,效率更高!** @@ -318,7 +318,7 @@ used数组可是全局变量,每层与每层之间公用一个used数组,所 以输入:[["JFK", "KUL"], ["JFK", "NRT"], ["NRT", "JFK"]为例,抽象为树形结构如下: -![](https://file.kamacoder.com/pics/2020111518065555.png) +![](https://file1.kamacoder.com/i/algo/2020111518065555.png) 本题可以算是一道hard的题目了,关于本题的难点我在文中已经详细列出。 @@ -335,7 +335,7 @@ used数组可是全局变量,每层与每层之间公用一个used数组,所 下面我用一个3 * 3 的棋盘,将搜索过程抽象为一棵树,如图: -![51.N皇后](https://file.kamacoder.com/pics/20201118225433127.png) +![51.N皇后](https://file1.kamacoder.com/i/algo/20201118225433127.png) 从图中,可以看出,二维矩阵中矩阵的高就是这棵树的高度,矩阵的宽就是树形结构中每一个节点的宽度。 @@ -363,7 +363,7 @@ used数组可是全局变量,每层与每层之间公用一个used数组,所 因为这个树形结构太大了,我抽取一部分,如图所示: -![37.解数独](https://file.kamacoder.com/pics/2020111720451790.png) +![37.解数独](https://file1.kamacoder.com/i/algo/2020111720451790.png) 解数独可以说是非常难的题目了,如果还一直停留在一维递归的逻辑中,这道题目可以让大家瞬间崩溃。 @@ -438,7 +438,7 @@ N皇后问题分析: 回溯专题汇聚为一张图: -![](https://file.kamacoder.com/pics/20211030124742.png) +![](https://file1.kamacoder.com/i/algo/20211030124742.png) 这个图是 [代码随想录知识星球](https://programmercarl.com/other/kstar.html) 成员:[莫非毛](https://wx.zsxq.com/dweb2/index/footprint/828844212542),所画,总结的非常好,分享给大家。 diff --git "a/problems/\345\233\236\346\272\257\347\256\227\346\263\225\345\216\273\351\207\215\351\227\256\351\242\230\347\232\204\345\217\246\344\270\200\347\247\215\345\206\231\346\263\225.md" "b/problems/\345\233\236\346\272\257\347\256\227\346\263\225\345\216\273\351\207\215\351\227\256\351\242\230\347\232\204\345\217\246\344\270\200\347\247\215\345\206\231\346\263\225.md" old mode 100644 new mode 100755 index 5c20f562b6..5e2c9345c4 --- "a/problems/\345\233\236\346\272\257\347\256\227\346\263\225\345\216\273\351\207\215\351\227\256\351\242\230\347\232\204\345\217\246\344\270\200\347\247\215\345\206\231\346\263\225.md" +++ "b/problems/\345\233\236\346\272\257\347\256\227\346\263\225\345\216\273\351\207\215\351\227\256\351\242\230\347\232\204\345\217\246\344\270\200\347\247\215\345\206\231\346\263\225.md" @@ -15,7 +15,7 @@ 我用没有排序的集合{2,1,2,2}来举例子画一个图,如图: -![90.子集II2](https://file.kamacoder.com/pics/2020111316440479-20230310121930316.png) +![90.子集II2](https://file1.kamacoder.com/i/algo/2020111316440479-20230310121930316.png) 图中,大家就很明显的看到,子集重复了。 @@ -95,7 +95,7 @@ private: 如图: -![90.子集II1](https://file.kamacoder.com/pics/202011131625054.png) +![90.子集II1](https://file1.kamacoder.com/i/algo/202011131625054.png) 可以看出一旦把unordered_set uset放在类成员位置,它控制的就是整棵树,包括树枝。 diff --git "a/problems/\345\233\236\346\272\257\347\256\227\346\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\345\233\236\346\272\257\347\256\227\346\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md" old mode 100644 new mode 100755 index d31e9651b8..c17e0be3f6 --- "a/problems/\345\233\236\346\272\257\347\256\227\346\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\345\233\236\346\272\257\347\256\227\346\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -6,7 +6,7 @@ ## 题目分类 -回溯算法大纲 +回溯算法大纲 ## 算法公开课 @@ -114,7 +114,7 @@ if (终止条件) { 如图: -![回溯算法理论基础](https://file.kamacoder.com/pics/20210130173631174.png) +![回溯算法理论基础](https://file1.kamacoder.com/i/algo/20210130173631174.png) 注意图中,我特意举例集合大小和孩子的数量是相等的! diff --git "a/problems/\345\255\227\347\254\246\344\270\262\346\200\273\347\273\223.md" "b/problems/\345\255\227\347\254\246\344\270\262\346\200\273\347\273\223.md" old mode 100644 new mode 100755 diff --git "a/problems/\346\225\260\347\273\204\346\200\273\347\273\223\347\257\207.md" "b/problems/\346\225\260\347\273\204\346\200\273\347\273\223\347\257\207.md" old mode 100644 new mode 100755 index e29a7bd379..98ba371fdc --- "a/problems/\346\225\260\347\273\204\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/\346\225\260\347\273\204\346\200\273\347\273\223\347\257\207.md" @@ -18,7 +18,7 @@ 举一个字符数组的例子,如图所示: - + 需要两点注意的是 @@ -29,7 +29,7 @@ 例如删除下标为3的元素,需要对下标为3的元素后面的所有元素都要做移动操作,如图所示: - + 而且大家如果使用C++的话,要注意vector 和 array的区别,vector的底层实现是array,严格来讲vector是容器,不是数组。 @@ -37,7 +37,7 @@ 那么二维数组直接上图,大家应该就知道怎么回事了 - + **那么二维数组在内存的空间地址是连续的么?** @@ -45,7 +45,7 @@ 看了下图,就应该明白了: - + 所以**Java的二维数组在内存中不是 `3*4` 的连续地址空间,而是四条连续的地址空间组成!** @@ -125,7 +125,7 @@ ## 总结 -![](https://file.kamacoder.com/pics/数组总结.png) +![](https://file1.kamacoder.com/i/algo/数组总结.png) 这个图是 [代码随想录知识星球](https://programmercarl.com/other/kstar.html) 成员:[海螺人](https://wx.zsxq.com/dweb2/index/footprint/844412858822412),所画,总结的非常好,分享给大家。 diff --git "a/problems/\346\225\260\347\273\204\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\346\225\260\347\273\204\347\220\206\350\256\272\345\237\272\347\241\200.md" old mode 100644 new mode 100755 index 4000208a9b..49c41f5abb --- "a/problems/\346\225\260\347\273\204\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\346\225\260\347\273\204\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -18,7 +18,7 @@ 举一个字符数组的例子,如图所示: -![算法通关数组](https://code-thinking.cdn.bcebos.com/pics/%E7%AE%97%E6%B3%95%E9%80%9A%E5%85%B3%E6%95%B0%E7%BB%84.png) +![算法通关数组](https://file1.kamacoder.com/i/algo/%E7%AE%97%E6%B3%95%E9%80%9A%E5%85%B3%E6%95%B0%E7%BB%84.png) @@ -31,7 +31,7 @@ 例如删除下标为3的元素,需要对下标为3的元素后面的所有元素都要做移动操作,如图所示: -![算法通关数组1](https://code-thinking.cdn.bcebos.com/pics/%E7%AE%97%E6%B3%95%E9%80%9A%E5%85%B3%E6%95%B0%E7%BB%841.png) +![算法通关数组1](https://file1.kamacoder.com/i/algo/%E7%AE%97%E6%B3%95%E9%80%9A%E5%85%B3%E6%95%B0%E7%BB%841.png) 而且大家如果使用C++的话,要注意vector 和 array的区别,vector的底层实现是array,严格来讲vector是容器,不是数组。 @@ -40,7 +40,7 @@ 那么二维数组直接上图,大家应该就知道怎么回事了 -![](https://file.kamacoder.com/pics/20240606105522.png) +![](https://file1.kamacoder.com/i/algo/20240606105522.png) **那么二维数组在内存的空间地址是连续的么?** @@ -80,7 +80,7 @@ int main() { 如图: -![数组内存](https://file.kamacoder.com/pics/20210310150641186.png) +![数组内存](https://file1.kamacoder.com/i/algo/20210310150641186.png) **所以可以看出在C++中二维数组在地址空间上是连续的**。 @@ -111,7 +111,7 @@ public static void test_arr() { 所以Java的二维数组可能是如下排列的方式: -![算法通关数组3](https://file.kamacoder.com/pics/20201214111631844.png) +![算法通关数组3](https://file1.kamacoder.com/i/algo/20201214111631844.png) 这里面试中数组相关的理论知识就介绍完了。 diff --git "a/problems/\346\240\210\344\270\216\351\230\237\345\210\227\346\200\273\347\273\223.md" "b/problems/\346\240\210\344\270\216\351\230\237\345\210\227\346\200\273\347\273\223.md" old mode 100644 new mode 100755 diff --git "a/problems/\346\240\210\344\270\216\351\230\237\345\210\227\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\346\240\210\344\270\216\351\230\237\345\210\227\347\220\206\350\256\272\345\237\272\347\241\200.md" old mode 100644 new mode 100755 index 912bfe1d70..0d3cc3a0c7 --- "a/problems/\346\240\210\344\270\216\351\230\237\345\210\227\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\346\240\210\344\270\216\351\230\237\345\210\227\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -11,7 +11,7 @@ 如图所示: -![栈与队列理论1](https://file.kamacoder.com/pics/20210104235346563.png) +![栈与队列理论1](https://file1.kamacoder.com/i/algo/20210104235346563.png) 那么我这里再列出四个关于栈的问题,大家可以思考一下。以下是以C++为例,使用其他编程语言的同学也对应思考一下,自己使用的编程语言里栈和队列是什么样的。 @@ -46,7 +46,7 @@ C++标准库是有多个版本的,要知道我们使用的STL是哪个版本 来说一说栈,栈先进后出,如图所示: -![栈与队列理论2](https://file.kamacoder.com/pics/20210104235434905.png) +![栈与队列理论2](https://file1.kamacoder.com/i/algo/20210104235434905.png) 栈提供push 和 pop 等等接口,所有元素必须符合先进后出规则,所以栈不提供走访功能,也不提供迭代器(iterator)。 不像是set 或者map 提供迭代器iterator来遍历所有元素。 @@ -59,7 +59,7 @@ C++标准库是有多个版本的,要知道我们使用的STL是哪个版本 从下图中可以看出,栈的内部结构,栈的底层实现可以是vector,deque,list 都是可以的, 主要就是数组和链表的底层实现。 -![栈与队列理论3](https://file.kamacoder.com/pics/20210104235459376.png) +![栈与队列理论3](https://file1.kamacoder.com/i/algo/20210104235459376.png) **我们常用的SGI STL,如果没有指定底层实现的话,默认是以deque为缺省情况下栈的底层结构。** diff --git "a/problems/\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227\357\274\210vector\345\216\237\347\220\206\350\256\262\350\247\243\357\274\211.md" "b/problems/\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227\357\274\210vector\345\216\237\347\220\206\350\256\262\350\247\243\357\274\211.md" old mode 100644 new mode 100755 index 162ee273e3..a3566268a1 --- "a/problems/\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227\357\274\210vector\345\216\237\347\220\206\350\256\262\350\247\243\357\274\211.md" +++ "b/problems/\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227\357\274\210vector\345\216\237\347\220\206\350\256\262\350\247\243\357\274\211.md" @@ -35,7 +35,7 @@ public: ``` 耗时如下: -![vectorinsert](https://file.kamacoder.com/pics/20201218203611181.png) +![vectorinsert](https://file1.kamacoder.com/i/algo/20201218203611181.png) 其直观上来看数组的insert操作是O(n)的,整体代码的时间复杂度是O(n^2)。 @@ -68,7 +68,7 @@ public: 耗时如下: -![使用链表](https://file.kamacoder.com/pics/20201218200756257.png) +![使用链表](https://file1.kamacoder.com/i/algo/20201218200756257.png) 大家都知道对于普通数组,一旦定义了大小就不能改变,例如int a[10];,这个数组a至多只能放10个元素,改不了的。 @@ -95,7 +95,7 @@ for (int i = 0; i < vec.size(); i++) { 就是重新申请一个二倍于原数组大小的数组,然后把数据都拷贝过去,并释放原数组内存。(对,就是这么原始粗暴的方法!) 举一个例子,如图: -![vector原理](https://file.kamacoder.com/pics/20201218185902217.png) +![vector原理](https://file1.kamacoder.com/i/algo/20201218185902217.png) 原vector中的size和capicity相同都是3,初始化为1 2 3,此时要push_back一个元素4。 @@ -138,7 +138,7 @@ public: 耗时如下: -![vector手动模拟insert](https://file.kamacoder.com/pics/20201218200626718.png) +![vector手动模拟insert](https://file1.kamacoder.com/i/algo/20201218200626718.png) 这份代码就是不让vector动态扩容,全程我们自己模拟insert的操作,大家也可以直观的看出是一个O(n^2)的方法了。 diff --git "a/problems/\347\256\227\346\263\225\346\250\241\346\235\277.md" "b/problems/\347\256\227\346\263\225\346\250\241\346\235\277.md" old mode 100644 new mode 100755 diff --git "a/problems/\350\203\214\345\214\205\346\200\273\347\273\223\347\257\207.md" "b/problems/\350\203\214\345\214\205\346\200\273\347\273\223\347\257\207.md" old mode 100644 new mode 100755 index 9ce3fdda98..3f3841e1a2 --- "a/problems/\350\203\214\345\214\205\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/\350\203\214\345\214\205\346\200\273\347\273\223\347\257\207.md" @@ -11,7 +11,7 @@ 关于这几种常见的背包,其关系如下: -![416.分割等和子集1](https://file.kamacoder.com/pics/20230310000726.png) +![416.分割等和子集1](https://file1.kamacoder.com/i/algo/20230310000726.png) 通过这个图,可以很清晰分清这几种常见背包之间的关系。 @@ -93,7 +93,7 @@ 背包问题总结: -![](https://file.kamacoder.com/pics/背包问题1.jpeg) +![](https://file1.kamacoder.com/i/algo/背包问题1.jpeg) 这个图是 [代码随想录知识星球](https://programmercarl.com/other/kstar.html) 成员:[海螺人](https://wx.zsxq.com/dweb2/index/footprint/844412858822412),所画结的非常好,分享给大家。 diff --git "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" old mode 100644 new mode 100755 index 79751c89e9..d3258c425e --- "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" +++ "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" @@ -21,7 +21,7 @@ 如果这几种背包,分不清,我这里画了一个图,如下: -![416.分割等和子集1](https://file.kamacoder.com/pics/20210117171307407.png) +![416.分割等和子集1](https://file1.kamacoder.com/i/algo/20210117171307407.png) 除此以外其他类型的背包,面试几乎不会问,都是竞赛级别的了,leetcode上连多重背包的题目都没有,所以题库也告诉我们,01背包和完全背包就够用了。 @@ -77,7 +77,7 @@ leetcode上没有纯01背包的问题,都是01背包应用方面的题目, 如图,二维数组为 dp[i][j]。 -![动态规划-背包问题1](https://file.kamacoder.com/pics/20210110103003361.png) +![动态规划-背包问题1](https://file1.kamacoder.com/i/algo/20210110103003361.png) 那么这里 i 、j、dp[i][j] 分别表示什么呢? @@ -91,7 +91,7 @@ i 来表示物品、j表示背包容量。 我们先看把物品0 放入背包的情况: -![](https://file.kamacoder.com/pics/20240730113455.png) +![](https://file1.kamacoder.com/i/algo/20240730113455.png) 背包容量为0,放不下物品0,此时背包里的价值为0。 @@ -103,7 +103,7 @@ i 来表示物品、j表示背包容量。 再看把物品1 放入背包: -![](https://file.kamacoder.com/pics/20240730114228.png) +![](https://file1.kamacoder.com/i/algo/20240730114228.png) 背包容量为 0,放不下物品0 或者物品1,此时背包里的价值为0。 @@ -150,7 +150,7 @@ i 来表示物品、j表示背包容量。 推导方向如图: -![](https://file.kamacoder.com/pics/20240730174246.png) +![](https://file1.kamacoder.com/i/algo/20240730174246.png) 如果放物品1, **那么背包要先留出物品1的容量**,目前容量是4,物品1 的容量(就是物品1的重量)为3,此时背包剩下容量为1。 @@ -158,7 +158,7 @@ i 来表示物品、j表示背包容量。 所以 放物品1 的情况 = dp[0][1] + 物品1 的价值,推导方向如图: -![](https://file.kamacoder.com/pics/20240730174436.png) +![](https://file1.kamacoder.com/i/algo/20240730174436.png) 两种情况,分别是放物品1 和 不放物品1,我们要取最大值(毕竟求的是最大价值) @@ -178,7 +178,7 @@ i 来表示物品、j表示背包容量。 首先从dp[i][j]的定义出发,如果背包容量j为0的话,即dp[i][0],无论是选取哪些物品,背包价值总和一定为0。如图: -![动态规划-背包问题2](https://file.kamacoder.com/pics/2021011010304192.png) +![动态规划-背包问题2](https://file1.kamacoder.com/i/algo/2021011010304192.png) 在看其他情况。 @@ -205,7 +205,7 @@ for (int j = weight[0]; j <= bagweight; j++) { 此时dp数组初始化情况如图所示: -![动态规划-背包问题7](https://file.kamacoder.com/pics/20210110103109140.png) +![动态规划-背包问题7](https://file1.kamacoder.com/i/algo/20210110103109140.png) dp[0][j] 和 dp[i][0] 都已经初始化了,那么其他下标应该初始化多少呢? @@ -217,7 +217,7 @@ dp[0][j] 和 dp[i][0] 都已经初始化了,那么其他下标应该初始化 如图: -![动态规划-背包问题10](https://file.kamacoder.com/pics/%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92-%E8%83%8C%E5%8C%85%E9%97%AE%E9%A2%9810.jpg) +![动态规划-背包问题10](https://file1.kamacoder.com/i/algo/%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92-%E8%83%8C%E5%8C%85%E9%97%AE%E9%A2%9810.jpg) 最后初始化代码如下: @@ -236,7 +236,7 @@ for (int j = weight[0]; j <= bagweight; j++) { 在如下图中,可以看出,有两个遍历的维度:物品与背包重量 -![动态规划-背包问题3](https://file.kamacoder.com/pics/2021011010314055.png) +![动态规划-背包问题3](https://file1.kamacoder.com/i/algo/2021011010314055.png) 那么问题来了,**先遍历 物品还是先遍历背包重量呢?** @@ -277,11 +277,11 @@ for(int j = 0; j <= bagweight; j++) { // 遍历背包容量 dp[i-1][j]和dp[i - 1][j - weight[i]] 都在dp[i][j]的左上角方向(包括正上方向),那么先遍历物品,再遍历背包的过程如图所示: -![动态规划-背包问题5](https://file.kamacoder.com/pics/202101101032124.png) +![动态规划-背包问题5](https://file1.kamacoder.com/i/algo/202101101032124.png) 再来看看先遍历背包,再遍历物品呢,如图: -![动态规划-背包问题6](https://file.kamacoder.com/pics/20210110103244701.png) +![动态规划-背包问题6](https://file1.kamacoder.com/i/algo/20210110103244701.png) **大家可以看出,虽然两个for循环遍历的次序不同,但是dp[i][j]所需要的数据就是左上角,根本不影响dp[i][j]公式的推导!** @@ -293,7 +293,7 @@ dp[i-1][j]和dp[i - 1][j - weight[i]] 都在dp[i][j]的左上角方向(包括 来看一下对应的dp数组的数值,如图: -![动态规划-背包问题4](https://file.kamacoder.com/pics/20210118163425129.jpg) +![动态规划-背包问题4](https://file1.kamacoder.com/i/algo/20210118163425129.jpg) 最终结果就是dp[2][4]。 diff --git "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" old mode 100644 new mode 100755 index b6a68960a9..00dc593417 --- "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" +++ "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" @@ -163,7 +163,7 @@ dp[1] = dp[1 - weight[0]] + value[0] = 15 一维dp,分别用物品0,物品1,物品2 来遍历背包,最终得到结果如下: -![动态规划-背包问题9](https://file.kamacoder.com/pics/20210110103614769.png) +![动态规划-背包问题9](https://file1.kamacoder.com/i/algo/20210110103614769.png) 本题力扣上没有原题,大家可以去[卡码网第46题](https://kamacoder.com/problempage.php?pid=1046)去练习,题意是一样的,代码如下: diff --git "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\345\256\214\345\205\250\350\203\214\345\214\205\344\270\200\347\273\264.md" "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\345\256\214\345\205\250\350\203\214\345\214\205\344\270\200\347\273\264.md" index be7a5d54f9..7dd78302ee 100644 --- "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\345\256\214\345\205\250\350\203\214\345\214\205\344\270\200\347\273\264.md" +++ "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\345\256\214\345\205\250\350\203\214\345\214\205\344\270\200\347\273\264.md" @@ -54,11 +54,11 @@ for (int i = 1; i < n; i++) { // 遍历物品 遍历物品在外层循环,遍历背包容量在内层循环,状态如图: -![动态规划-完全背包1](https://file.kamacoder.com/pics/20210126104529605.jpg) +![动态规划-完全背包1](https://file1.kamacoder.com/i/algo/20210126104529605.jpg) 遍历背包容量在外层循环,遍历物品在内层循环,状态如图: -![动态规划-完全背包2](https://file.kamacoder.com/pics/20210729234011.png) +![动态规划-完全背包2](https://file1.kamacoder.com/i/algo/20210729234011.png) 看了这两个图,大家就会理解,完全背包中,两个for循环的先后循序,都不影响计算dp[j]所需要的值(这个值就是下标j之前所对应的dp[j])。 diff --git "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\244\232\351\207\215\350\203\214\345\214\205.md" "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\244\232\351\207\215\350\203\214\345\214\205.md" old mode 100644 new mode 100755 diff --git "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" old mode 100644 new mode 100755 index cb8db1e0e3..02b3cdc32d --- "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" +++ "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" @@ -66,7 +66,7 @@ 推导方向如图: -![](https://file.kamacoder.com/pics/20241126112952.png) +![](https://file1.kamacoder.com/i/algo/20241126112952.png) 如果放物品1, **那么背包要先留出物品1的容量**,目前容量是4,物品1 的容量(就是物品1的重量)为3,此时背包剩下容量为1。 @@ -78,7 +78,7 @@ 所以 放物品1 的情况 = dp[1][1] + 物品1 的价值,推导方向如图: -![](https://file.kamacoder.com/pics/20241126113104.png) +![](https://file1.kamacoder.com/i/algo/20241126113104.png) (**注意上图和 [01背包理论基础(二维数组)](https://programmercarl.com/背包理论基础01背包-1.html) 中的区别**,对于理解完全背包很重要) @@ -103,7 +103,7 @@ 首先从dp[i][j]的定义出发,如果背包容量j为0的话,即dp[i][0],无论是选取哪些物品,背包价值总和一定为0。如图: -![动态规划-背包问题2](https://file.kamacoder.com/pics/2021011010304192.png) +![动态规划-背包问题2](https://file1.kamacoder.com/i/algo/2021011010304192.png) 在看其他情况。 @@ -132,7 +132,7 @@ for (int j = weight[0]; j <= bagWeight; j++) 此时dp数组初始化情况如图所示: -![](https://file.kamacoder.com/pics/20241114161608.png) +![](https://file1.kamacoder.com/i/algo/20241114161608.png) dp[0][j] 和 dp[i][0] 都已经初始化了,那么其他下标应该初始化多少呢? @@ -185,7 +185,7 @@ for(int j = 0; j <= bagWeight; j++) { // 遍历背包容量 以本篇举例数据为例,填满了dp二维数组如图: -![](https://file.kamacoder.com/pics/20241126113752.png) +![](https://file1.kamacoder.com/i/algo/20241126113752.png) 因为 物品0 的性价比是最高的,而且 在完全背包中,每一类物品都有无限个,所以有无限个物品0,既然物品0 性价比最高,当然是优先放物品0。 diff --git "a/problems/\350\264\252\345\277\203\347\256\227\346\263\225\346\200\273\347\273\223\347\257\207.md" "b/problems/\350\264\252\345\277\203\347\256\227\346\263\225\346\200\273\347\273\223\347\257\207.md" old mode 100644 new mode 100755 index 4c67fb401a..7aff85764e --- "a/problems/\350\264\252\345\277\203\347\256\227\346\263\225\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/\350\264\252\345\277\203\347\256\227\346\263\225\346\200\273\347\273\223\347\257\207.md" @@ -128,7 +128,7 @@ Carl个人认为:如果找出局部最优并可以推出全局最优,就是 贪心专题汇聚为一张图: -![](https://file.kamacoder.com/pics/贪心总结water.png) +![](https://file1.kamacoder.com/i/algo/贪心总结water.png) 这个图是 [代码随想录知识星球](https://programmercarl.com/other/kstar.html) 成员:[海螺人](https://wx.zsxq.com/dweb2/index/footprint/844412858822412)所画,总结的非常好,分享给大家。 diff --git "a/problems/\350\264\252\345\277\203\347\256\227\346\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\350\264\252\345\277\203\347\256\227\346\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md" old mode 100644 new mode 100755 index 2d0af8791a..3bcf307525 --- "a/problems/\350\264\252\345\277\203\347\256\227\346\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\350\264\252\345\277\203\347\256\227\346\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -7,7 +7,7 @@ 题目分类大纲如下: -贪心算法大纲 +贪心算法大纲 ## 算法公开课 diff --git "a/problems/\351\200\222\345\275\222\347\256\227\346\263\225\347\232\204\346\227\266\351\227\264\344\270\216\347\251\272\351\227\264\345\244\215\346\235\202\345\272\246\345\210\206\346\236\220.md" "b/problems/\351\200\222\345\275\222\347\256\227\346\263\225\347\232\204\346\227\266\351\227\264\344\270\216\347\251\272\351\227\264\345\244\215\346\235\202\345\272\246\345\210\206\346\236\220.md" new file mode 100755 index 0000000000..98aa47a865 --- /dev/null +++ "b/problems/\351\200\222\345\275\222\347\256\227\346\263\225\347\232\204\346\227\266\351\227\264\344\270\216\347\251\272\351\227\264\345\244\215\346\235\202\345\272\246\345\210\206\346\236\220.md" @@ -0,0 +1,281 @@ +* [做项目(多个C++、Java、Go、测开、前端项目)](./other/kstar.md) +* [刷算法(两个月高强度学算法)](./xunlian/xunlianying.md) +* [背八股(40天挑战高频面试题)](./xunlian/bagu.md) + + + + + + + + + + + + + + +# 递归算法的时间与空间复杂度分析! + +之前在[通过一道面试题目,讲一讲递归算法的时间复杂度!](https://programmercarl.com/前序/通过一道面试题目,讲一讲递归算法的时间复杂度!.html)中详细讲解了递归算法的时间复杂度,但没有讲空间复杂度。 + +本篇讲通过求斐波那契数列和二分法再来深入分析一波递归算法的时间和空间复杂度,细心看完,会刷新对递归的认知! + + +## 递归求斐波那契数列的性能分析 + +先来看一下求斐波那契数的递归写法。 + +```CPP +int fibonacci(int i) { + if(i <= 0) return 0; + if(i == 1) return 1; + return fibonacci(i-1) + fibonacci(i-2); +} +``` + +对于递归算法来说,代码一般都比较简短,从算法逻辑上看,所用的存储空间也非常少,但运行时需要内存可不见得会少。 + +### 时间复杂度分析 + +来看看这个求斐波那契的递归算法的时间复杂度是多少呢? + +在讲解递归时间复杂度的时候,我们提到了递归算法的时间复杂度本质上是要看: **递归的次数 * 每次递归的时间复杂度**。 + +可以看出上面的代码每次递归都是O(1)的操作。再来看递归了多少次,这里将i为5作为输入的递归过程 抽象成一棵递归树,如图: + + +![递归空间复杂度分析](https://file1.kamacoder.com/i/algo/20210305093200104.png) + +从图中,可以看出f(5)是由f(4)和f(3)相加而来,那么f(4)是由f(3)和f(2)相加而来 以此类推。 + +在这棵二叉树中每一个节点都是一次递归,那么这棵树有多少个节点呢? + +我们之前也有说到,一棵深度(按根节点深度为1)为k的二叉树最多可以有 2^k - 1 个节点。 + +所以该递归算法的时间复杂度为O(2^n),这个复杂度是非常大的,随着n的增大,耗时是指数上升的。 + +来做一个实验,大家可以有一个直观的感受。 + +以下为C++代码,来测一下,让我们输入n的时候,这段递归求斐波那契代码的耗时。 + +```CPP +#include +#include +#include +using namespace std; +using namespace chrono; +int fibonacci(int i) { + if(i <= 0) return 0; + if(i == 1) return 1; + return fibonacci(i - 1) + fibonacci(i - 2); +} +void time_consumption() { + int n; + while (cin >> n) { + milliseconds start_time = duration_cast( + system_clock::now().time_since_epoch() + ); + + fibonacci(n); + + milliseconds end_time = duration_cast( + system_clock::now().time_since_epoch() + ); + cout << milliseconds(end_time).count() - milliseconds(start_time).count() + <<" ms"<< endl; + } +} +int main() +{ + time_consumption(); + return 0; +} +``` + +根据以上代码,给出几组实验数据: + +测试电脑以2015版MacPro为例,CPU配置:`2.7 GHz Dual-Core Intel Core i5` + +测试数据如下: + +* n = 40,耗时:837 ms +* n = 50,耗时:110306 ms + +可以看出,O(2^n)这种指数级别的复杂度是非常大的。 + +所以这种求斐波那契数的算法看似简洁,其实时间复杂度非常高,一般不推荐这样来实现斐波那契。 + +其实罪魁祸首就是这里的两次递归,导致了时间复杂度以指数上升。 + +```CPP +return fibonacci(i-1) + fibonacci(i-2); +``` + +可不可以优化一下这个递归算法呢。 主要是减少递归的调用次数。 + +来看一下如下代码: + +```CPP +// 版本二 +int fibonacci(int first, int second, int n) { + if (n <= 0) { + return 0; + } + if (n < 3) { + return 1; + } + else if (n == 3) { + return first + second; + } + else { + return fibonacci(second, first + second, n - 1); + } +} +``` + +这里相当于用first和second来记录当前相加的两个数值,此时就不用两次递归了。 + +因为每次递归的时候n减1,即只是递归了n次,所以时间复杂度是 O(n)。 + +同理递归的深度依然是n,每次递归所需的空间也是常数,所以空间复杂度依然是O(n)。 + +代码(版本二)的复杂度如下: + +* 时间复杂度:O(n) +* 空间复杂度:O(n) + +此时再来测一下耗时情况验证一下: + +```CPP +#include +#include +#include +using namespace std; +using namespace chrono; +int fibonacci_3(int first, int second, int n) { + if (n <= 0) { + return 0; + } + if (n < 3) { + return 1; + } + else if (n == 3) { + return first + second; + } + else { + return fibonacci_3(second, first + second, n - 1); + } +} + +void time_consumption() { + int n; + while (cin >> n) { + milliseconds start_time = duration_cast( + system_clock::now().time_since_epoch() + ); + + fibonacci_3(1, 1, n); + + milliseconds end_time = duration_cast( + system_clock::now().time_since_epoch() + ); + cout << milliseconds(end_time).count() - milliseconds(start_time).count() + <<" ms"<< endl; + } +} +int main() +{ + time_consumption(); + return 0; +} + +``` + +测试数据如下: + +* n = 40,耗时:0 ms +* n = 50,耗时:0 ms + +大家此时应该可以看出差距了!! + +### 空间复杂度分析 + +说完了这段递归代码的时间复杂度,再看看如何求其空间复杂度呢,这里给大家提供一个公式:**递归算法的空间复杂度 = 每次递归的空间复杂度 * 递归深度** + +为什么要求递归的深度呢? + +因为每次递归所需的空间都被压到调用栈里(这是内存管理里面的数据结构,和算法里的栈原理是一样的),一次递归结束,这个栈就是就是把本次递归的数据弹出去。所以这个栈最大的长度就是递归的深度。 + +此时可以分析这段递归的空间复杂度,从代码中可以看出每次递归所需要的空间大小都是一样的,所以每次递归中需要的空间是一个常量,并不会随着n的变化而变化,每次递归的空间复杂度就是$O(1)$。 + +在看递归的深度是多少呢?如图所示: + + +![递归空间复杂度分析](https://file1.kamacoder.com/i/algo/20210305094749554.png) + +递归第n个斐波那契数的话,递归调用栈的深度就是n。 + +那么每次递归的空间复杂度是O(1), 调用栈深度为n,所以这段递归代码的空间复杂度就是O(n)。 + +```CPP +int fibonacci(int i) { + if(i <= 0) return 0; + if(i == 1) return 1; + return fibonacci(i-1) + fibonacci(i-2); +} +``` + + +最后对各种求斐波那契数列方法的性能做一下分析,如题: + + +![递归的空间复杂度分析](https://file1.kamacoder.com/i/algo/20210305095227356.png) + +可以看出,求斐波那契数的时候,使用递归算法并不一定是在性能上是最优的,但递归确实简化的代码层面的复杂度。 + +### 二分法(递归实现)的性能分析 + +带大家再分析一段二分查找的递归实现。 + +```CPP +int binary_search( int arr[], int l, int r, int x) { + if (r >= l) { + int mid = l + (r - l) / 2; + if (arr[mid] == x) + return mid; + if (arr[mid] > x) + return binary_search(arr, l, mid - 1, x); + return binary_search(arr, mid + 1, r, x); + } + return -1; +} +``` + +都知道二分查找的时间复杂度是O(logn),那么递归二分查找的空间复杂度是多少呢? + +我们依然看 **每次递归的空间复杂度和递归的深度** + +每次递归的空间复杂度可以看出主要就是参数里传入的这个arr数组,但需要注意的是在C/C++中函数传递数组参数,不是整个数组拷贝一份传入函数而是传入的数组首元素地址。 + +**也就是说每一层递归都是公用一块数组地址空间的**,所以 每次递归的空间复杂度是常数即:O(1)。 + +再来看递归的深度,二分查找的递归深度是logn ,递归深度就是调用栈的长度,那么这段代码的空间复杂度为 1 * logn = O(logn)。 + +大家要注意自己所用的语言在传递函数参数的时,是拷贝整个数值还是拷贝地址,如果是拷贝整个数值那么该二分法的空间复杂度就是O(nlogn)。 + + +## 总结 + +本章我们详细分析了递归实现的求斐波那契和二分法的空间复杂度,同时也对时间复杂度做了分析。 + +特别是两种递归实现的求斐波那契数列,其时间复杂度截然不容,我们还做了实验,验证了时间复杂度为O(2^n)是非常耗时的。 + +通过本篇大家应该对递归算法的时间复杂度和空间复杂度有更加深刻的理解了。 + + + + + + + diff --git "a/problems/\351\223\276\350\241\250\346\200\273\347\273\223\347\257\207.md" "b/problems/\351\223\276\350\241\250\346\200\273\347\273\223\347\257\207.md" old mode 100644 new mode 100755 index 99bb2abcd0..df1747e26a --- "a/problems/\351\223\276\350\241\250\346\200\273\347\273\223\347\257\207.md" +++ "b/problems/\351\223\276\350\241\250\346\200\273\347\273\223\347\257\207.md" @@ -75,7 +75,7 @@ ## 总结 -![](https://file.kamacoder.com/pics/链表总结.png) +![](https://file1.kamacoder.com/i/algo/链表总结.png) 这个图是 [代码随想录知识星球](https://programmercarl.com/other/kstar.html) 成员:[海螺人](https://wx.zsxq.com/dweb2/index/footprint/844412858822412),所画,总结的非常好,分享给大家。 diff --git "a/problems/\351\223\276\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\351\223\276\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" old mode 100644 new mode 100755 index 5305c9a9dc..c465818739 --- "a/problems/\351\223\276\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" +++ "b/problems/\351\223\276\350\241\250\347\220\206\350\256\272\345\237\272\347\241\200.md" @@ -12,7 +12,7 @@ 链表的入口节点称为链表的头结点也就是head。 如图所示: -![链表1](https://file.kamacoder.com/pics/20200806194529815.png) +![链表1](https://file1.kamacoder.com/i/algo/20200806194529815.png) ## 链表的类型 @@ -31,7 +31,7 @@ 双链表 既可以向前查询也可以向后查询。 如图所示: -![链表2](https://file.kamacoder.com/pics/20200806194559317.png) +![链表2](https://file1.kamacoder.com/i/algo/20200806194559317.png) ### 循环链表 @@ -39,7 +39,7 @@ 循环链表可以用来解决约瑟夫环问题。 -![链表4](https://file.kamacoder.com/pics/20200806194629603.png) +![链表4](https://file1.kamacoder.com/i/algo/20200806194629603.png) ## 链表的存储方式 @@ -54,7 +54,7 @@ 如图所示: -![链表3](https://file.kamacoder.com/pics/20200806194613920.png) +![链表3](https://file1.kamacoder.com/i/algo/20200806194613920.png) 这个链表起始节点为2, 终止节点为7, 各个节点分布在内存的不同地址空间上,通过指针串联在一起。 @@ -104,7 +104,7 @@ head->val = 5; 删除D节点,如图所示: -![链表-删除节点](https://file.kamacoder.com/pics/20200806195114541-20230310121459257.png) +![链表-删除节点](https://file1.kamacoder.com/i/algo/20200806195114541-20230310121459257.png) 只要将C节点的next指针 指向E节点就可以了。 @@ -118,7 +118,7 @@ head->val = 5; 如图所示: -![链表-添加节点](https://file.kamacoder.com/pics/20200806195134331-20230310121503147.png) +![链表-添加节点](https://file1.kamacoder.com/i/algo/20200806195134331-20230310121503147.png) 可以看出链表的增添和删除都是O(1)操作,也不会影响到其他节点。 @@ -128,7 +128,7 @@ head->val = 5; 再把链表的特性和数组的特性进行一个对比,如图所示: -![链表-链表与数据性能对比](https://file.kamacoder.com/pics/20200806195200276.png) +![链表-链表与数据性能对比](https://file1.kamacoder.com/i/algo/20200806195200276.png) 数组在定义的时候,长度就是固定的,如果想改动数组的长度,就需要重新定义一个新的数组。 diff --git "a/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" "b/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" old mode 100644 new mode 100755 index 0207b71eac..7e23172093 --- "a/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" +++ "b/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" @@ -13,7 +13,7 @@ 图示两个链表在节点 c1 开始相交: -![](https://file.kamacoder.com/pics/20211219221657.png) +![](https://file1.kamacoder.com/i/algo/20211219221657.png) 题目数据 保证 整个链式结构中不存在环。 @@ -21,15 +21,15 @@ 示例 1: -![](https://file.kamacoder.com/pics/20211219221723.png) +![](https://file1.kamacoder.com/i/algo/20211219221723.png) 示例 2: -![](https://file.kamacoder.com/pics/20211219221749.png) +![](https://file1.kamacoder.com/i/algo/20211219221749.png) 示例 3: -![](https://file.kamacoder.com/pics/20211219221812.png) +![](https://file1.kamacoder.com/i/algo/20211219221812.png) @@ -42,11 +42,11 @@ 看如下两个链表,目前curA指向链表A的头结点,curB指向链表B的头结点: -![面试题02.07.链表相交_1](https://code-thinking.cdn.bcebos.com/pics/面试题02.07.链表相交_1.png) +![面试题02.07.链表相交_1](https://file1.kamacoder.com/i/algo/面试题02.07.链表相交_1.png) 我们求出两个链表的长度,并求出两个链表长度的差值,然后让curA移动到,和curB 末尾对齐的位置,如图: -![面试题02.07.链表相交_2](https://code-thinking.cdn.bcebos.com/pics/面试题02.07.链表相交_2.png) +![面试题02.07.链表相交_2](https://file1.kamacoder.com/i/algo/面试题02.07.链表相交_2.png) 此时我们就可以比较curA和curB是否相同,如果不相同,同时向后移动curA和curB,如果遇到curA == curB,则找到交点。

- +

G+kvFc%dCuNz7NZ_x7Hh6zI~Vb4pDrLg;R#G- zN)GsQY~|#M#~6n8b#^d;PW7~n-D7!t9X>y5etemwMuM5wKKpkO4U5jP)DjzxEyuTW zVbJ=M)kXN*^y9HWV>j`vTZn5XHP?te)lk1%3cDtnCxY%Gm z@DwgQXb>e3a!dz;zW9bKLEX7ri10Q4A`C6d=Ih@OfR-fQyrOUNB*CL6^i|K-xj}bm zyKCS@ea3=za*0%Qi#&Yaykg4>TB`Xqn;yor`xWZ$#;ogsuNVV={SDhT)c za*s&&mY8XcS89&U+O$JIFA#d+O+ui6tADT4l=+6X zn{OJ(3$E@1{e+_HSCMbC+c*)wyvK2qVz4w7N!3A-dZ);Hdjk9)Gmn zyuHxPLw)Hh(iBrZ>Z>e1De24Re65@oXk%UaTSCP=0O{4_5JirHznJ!Vj!QZG+<^`8%Ld!iLW5h94U6l73b&em& zM%@mm&POVbEHh?V!3P-{Gs(`+PAy|W*Kwx{b_GGuBcr5YIyb*jC_zAS3tenwv*^=# zgg+Nrh0$~TAuwSt3i6My_E>5M)rV^qhd@Aau}un*nws>Nj%nCWNgp&0%iqTMEE$xe z`i(iVPd`;KarA_H1T(%!BH3&v8-zYIuj2Vry=(yo!)kj^?>MZOP*-IrM0?86xav}g zaECZD0g|#BoANo#iXp1pGxA0p=h;3$&g(e?9~|M-RdUiWZ;M~xA7l75!ULK#`BAU- z=m1tOWig3rNX$nW=dSMElQ^{Unq#xz4}$ldFl(`wtc@s zp|G~;6SA($RHUc2ZEIqpiaOWHyrGwea|B!lPiNb;8~j+aNzqAi>*XBPoCm#RfS05l zd!Q;XI1&zsBFS>v$4`h#)4$ z01nIEnUf~2youK?&|WupP&AZ#&k zU_43|i;btlBM%+>w|&zST^A-o?ThY~&S~fo%@Er?KAE7sL<_v}PXSB~o)dEwl_P=p zBH-rY<#^2M*>I|9?*66nrQ>VTQ!h~I$n1*u9EIOPT|me0$}xItBj0EJ+*KGTO|%}v z#!eRjE=0<0>yCcH?=-mT$XtNoy0aORWJBy8EJl%n$$q%+L{qMj4LEpfyG>i@+q`uy zG#zK8sKNAozTF*M80iR1il%(P*o$nj9mC!Hmri#jO9+2@;?km4*`Z@~bU3+qE3I?dbkB9~%iq$tg+KVD6Rq_DV|^@>TuZpr1g_XYANBIYY0^4+FwO>X zwT*gq1IIzvpl>*vnE2ExUQl$yZ+LFCZMn9`Hf=lTn`P`kcD*u;4{kBvU49qOcVqtlqt#e9 zwf@t>RCNB_`Cg zsvi)|q2EnL3}5{iQrf_s7jH6yfU)%zub671M;lX36=Q}B^otj2^^=7C9Z|)eC%N`b zT5Y6*B;E^c0<3ea8(VI=IYnq6NjPuK+#zjZSv=}|I_9aoyBcV6}~q_GdHMAHUDK6br)CCX;b$-!IRh@UWhbwch;OI&bmmyqy+f zqZJ|T<0HQfz=VO0^58#+D9^e7S|?cN!uYQ-MftKH^au!L9f|-F6t5WsA7h;11#gud zj*MycdFb)cp2a^IW68P{AtPVgy%6ZwC*S7Lfl5yO77z7~C}rtT?xqY0_>rFLY-sIs zXB}XXoN777xJBxBvm$Ro*&|^-c24Vey}_Am=Fnb&bUw^_g(mEb}NgFp5=Q z@Vtop#ThrMtbLO9#OZ6s98 z0&&3#x6``jVq6|6yeV00{P>xKZ(jW6-J@Uqo4aR!^mkc){J+S9WuN~UFu%t*`l(UX z5b3LSxqy@`n>=b|M17`g^#zzX1_@()IEQPO`E5e&13lnfkBGiyxwn@u0ey+C?XBtn zlGWPSGi&WfP4amiPDcneKV`=;zs-ev*E`DLaOeY2Ik+!n}4 z9N-==Mc4DiP0S}BaT=#TVO{u((UXYj?Ak~uDMVx)0jwTDbm%K2bD7ehDzH-HG|_aK zwiwsZVA}xj?Xt-dT1W^*HCpxH3%W>AO^&(}1U0D+h&WJo$dYg+RF+mF>Z-ar*rr^j zE#m-;REaXJiM8kt$j$d|gP=6kMfo*oxXLsZSPZZ5)9qAKrWGDNJCim4N@Y%w}c zCEo`x<77Em_?onsX;U$;+~=}&lT^XB<09=4S*@x!cmp@EN8|UDxzK(;!ELkiLNE#W zx>)Z0bUqZ~2(u6}*2L)B2rOYPI@v##|8`t2TDS4=Hj)q3?{2Vt>!Rqfi4&n=~4*uI1YC zG_|upp0RKdJNZ^!D*ELrB`Ntnk(`Or7EMw zk{RRW=c26z=>vF|sw6%_c}aTsLfU#pt-X`lzE^U=kXy-AGCYhb2+e@-pX}X~8 z6#^p|Ae;U`TWSHVlgGWtwPMtO5Fg@_uXmjI429e8#S?pmp)fnC=S|w=nx{^%LOQ>x zS9dun0qrB=)Hm-(4`>P9BY&Cwj{)!@~M<9JajFWg(8u$q{(l*T`|j z>usQ`e$NA9#(u+7F(*=rLZ8RvE-r=HK2!Ga^dk#LFA|yNTVGY2I`uiq3xe_+SG~0P z*NH1})uQ#}&n@Go_A&Zx9FOAN(mJ=F+cLlMhBLTJ+fcR)XPUciTVTdWiAR~Zc=7@4ZPA=Y?nUf_zbNr} z$Kw~*-%^&ou*uN;M@exxSl5x_B+K$6C7VZCdv;@<0yKI>k2IpQ{6~KG#k2pzyZ0pr z5zu#?2;T$w0V>`v*J6rjSuI0Q$5AcQbe$+RhiD6Zgww{aA11VNEaO2Hx~pI3uSH^6 zXn6Adq3MHl{7{1bj=~lDN8jTDy0PeBQ%vF$`dz8IvA=GcZUG!V=>kjs$D3V+v3>e3 zZmkdJI{ToAq&DCrBrW=MS%ODe71#-Bj3l=9`D}=l#jzxw8wX~QV+BhxC>Ju#&2rFi zEVY|8F0om~`1*3|CjN+0{H7JOT1q@|TWj@uashVyVZLT9xCKH7^vy=d<4rbglsPsr zF1wy{{uRV}$D_w<&UCZN5zH>7S*mtjR-L;gj$f*C@rfE~!?9;W?cFnI>xV!CSTNLV zSmz`yG_2u?K;!3;{WXI6I>erwNY0_r-SOZ)V)3wl4gicpX4!Q%1M|ie;zXZ#tyeht zJ3qCFthVI0?^Mo>DaRyn3@bxAML^uPQP%dgAn0pJTW6r}-d~80Hj$a}IVxqOr_j&t ziXn`K5}PB*np?au(r*EJ}_FN z1`Wc$dSz4fp+&o>(C}0BI!2@a*Bd;BU>7Umh5R8J*7{onYy*5Z&Ph`o zjJSJ-{@O{}`pY(DJH}%1C_5jS(`WwnUVedg`!Dk6BZ$7yPqvR|6k|BLn%sK zen^ARov%=5N>X@emew!U$;YpS*E~qOv`gr$Zv>ff0a+j?m*M7NY_;RcCjA@@!6@`< zZ?Z0Hgj3E#$4DL8t+^ipz;)3`c;y~7va4$ZWtER~%xkM?^0jGG?SDxfHj(NoqZcwM zk>9}#__FybNS(NkCva{VsKbF^8Ap7=+p}Ig`|R$^Kl``9ytsS%`A_ejeEQS7m*4!F zH_ZKe0Ii>Efb7T%&qb@Xrcxk;qG_wvHx!ghp2n1^{w@q3VFmDM?!mNT|N_Ah8X!%1HJbp4`lmB$88O&wQbw^>+l@L=($4xKj?JOK0`0pc(Z zN{kqYf{4IO{nR*?qaSyuz3@V0i#*!#Gg@3H1JZ`z z>&j@+5z?S|g_g6Bq)CsP5*~~jVfD;RPSP6C`Hq^pl`@P5q%;G-)W^J9<+&vDqp)6K2c3kKbLwv6VI+ zADzo@r7rs=Lh#Bei5s!TM{lL_o`!2;k32aC9Wd@!5EJnZU`Z#58pZ@!cyVqa+8whwRcP+y;){nJB-*K!t`qj6U^P>Aq zw#MTg%6|IrCb-Yl#l01FamV*gZ0oOJyh9&{{PESuY{`$( zdZOcnz`5`SotwZI41m6eWNfLH5$xp2(_HApXVhzl@H*}sg>!mq^-TO|mgzhS+8DKP2=5;~^Vw+TB5?ZC&X@K%d^m z&4%@uEtY>bT=c;U7nsYj8L_f_oVS#30MupDO_;9Q%R!MIN>_U6mjz@T)_t>&?8dI% z1?C-%E*6CmVaxCked{*Ox3#~s{^W#oq+Glpk9<1`GJa|F6%_VklVgHj-7&G}(epTG zJe>8v#GwSn81iVXz|j+lA1a;YcrOoydXLpNy~`2*<*)JG!6RCW+O};TW0dUC4(~J- zm)I)?jPHeX5c#$l>0EzY&G{TpeFQ$bAx|Q_5vUK^EGzD)VG2RA8v*Xick!)=6OqQS zPk3e+&YHWMkh7ABb+$8!^+&z#&x;eltu^BtUiUKFGT^xWbQehZJoA<`?7NsicGkky zjZDVt#FPC;TV6gXA+Eu@;CILgrw+k0*=dU-t&S*d|BjQv1K@rJ?oD=2ZhUxihZpGmtIeQL_mfG^;&0zy`oh>8BQLO_<+o|pEo=qoi)E*nFX(}J z3$q2Yd7V)HHv2XUV9FvIznY3)`-S#rPBpIc4Kc8~MRBh8@|>{&jDv&iUYIi$>PD+8 z^}1cjv!HU_IUDZu0k!|EkB z2)=qw`2}MOaBgNGPd8GmU^UhoPSuwWLrfP_{6!geh|(LLKXihdhFfe@B#p7DV;ZYb zg?6(>h>U}57Sa`a0oJP`fv8z@brQrn7qWfG^Vidbv>i!Uf!A@FGkir6Ud#+=BUBYh zqk9o=a*7j?d?5I5*v)!HyX*QcdI^di$^=zaqh7kqEgZDC8^HWbycpeq-_ud(_u}Qq zogc-8L^6?46xSfR)f0#vK-A9^1H5b~#~B=tCXb%KG`5pJPz5&8=ItiJB`ShCM<}nq z>GYUgrwD4JfL6>cTs5#-D^EOORob+ycIyJq;%W?g(OH3d6`eF(dx;;7 zIRw5(|>?}|5fG{Q;-&Cxplz(A-PNXPg#;NVxcwei>q(F`DV!RZ6zhgc`Mb?Ibzn{)RAx5 zPAm)3I0+42@XdHSyd{zRs|*tV*a3KxGReiVCY1YP*ZkqK#`e}3JD&z34^A-`5LNlX z!r-M1GOgz7ZP6VnmWpH#8zDHY=x8Mj!bC2|8WLyl9f#nY$&4JrLZt&VMug>K>T!~P z0_-uM_yWtPh#fC#=ez3%$;TJ}a`Z_yZxGkN@(@DSd;tJwEbM$QHCaockK@@hh@;PUSi71P+j6Yt0%x z%NF=#R`>=gS@z4UfvZ>mMk6|c(k3uZU$DsK1-%Ljpd z(y9do5oR!TakCM4V?KOL4@qnxkZGP0lB~m^%lMH=*wJ5FV~13rdDm}g?Re3S9y%W7 zp*1u&^jS9RgqgN{LGgWy$}@%UntvCs(Np;@G8ziw*L^fTzN-}KJT!)r-^2(Z)txn! zE;3ZS_a%YDvH8QAC~edsdk^!&Dn`IMG}%`?mi_1nzZ&uECwEUi|ND2ZpZ<~yfnRb# z@E7p>92?QkmQt}D^jOtD7t@KGiv-z{0lQ5ieh1|4$=|(u@-s%QNBorbHv9$rcOb`D zlkScWJ8ef?jB<&!4Rd?E_;y2#m~rlpZp&Ci&0_GUz-+&l%=61^bE@mwGfC38g1|(901y)iJ!7^*gVS@ zG6J5GR==)UjaJ4J8O)~;bVV>(MjFTTeYa63)>gaW0+Ji;p<3i)0SXli4PPbVg`R_^ zFh_E61&aEFXhCX|#*W5Z6r<~6RK9Dy5@4|e-en$=%!SUTw~scdPXcpL$2sHJ5bro< zsB^mnhL?+(@d0xxB$aVC`QuQ`#}15pWX>eXyV!dx%wp-7=K4c8CD2YDbxpRT!9QQ! z?AWi4y($8H<7coq+$3p~-VU-M?j7qV;b9AX5-%fJ%Zx9Lr@dL)dLc*5=9o`g81MFT zt=UP+5j@a4akSlZ@SKu}=;t_z_88Ls@MZ3r$s9>SB%#y{3O z+-RoN^lDF~xTeac+C|^1D#X2+rKiGp9U2>`y&6WII-TRZGRmmX5QCMGZ0y6~E$LR) zD==j7DFUDBbQ53dGq&lMMH`(nKQXvNPBV<>uBcrVF?0&0YnrogH`i zO}|+ms~2$EXRj9(f%N#1^F0MXUayN5%EFAY*73td{N(pS z4`*0WUZo#fcfrB6@EV||zrqvL#!u(n%{XrNzm(AR^lVmQm!;c%$nU@AeX^-(cJJ!0 zdaAy$%6Q}JVa9z4)`dWQ)D2kJNAumJGr#iKrnvX65--fe&mN_Hu?zm#CyW=10sc0RwMkEWm8M6=o7Zfx*pqZ6?x~+Tct2;$2|wp6%<3qX+ZYUujb05D zxO0Mi)V^+fyMrK%eZ5@uy1qE`X}=agL(_g3V=ul93#3`&hWrf?HYD6=aootoeR)34 zRt>VgehJUU7vs!VkwQpa>Y(5k>ZRmX4GF|)iA5J{3E zyYh5=U%b65Zlx{f5tIXbTMwd}FWU6CYhH6<%fHrc+FfHgC#XMyx)C)uUOEy|B{|yM z;FDk*;?kq+n%#7fnetQ(y+zY1t?wR*_DQY|jNY!9{e!%{I29;toaemu)88BvrZEx_ zTN_r8{V~32=>SY{@a&ur0?PF@M}Ol^%e)|bI#*C0;C<3cT-TyKcv`#-Z>nLm_<|fy ztE#hHbD75wm7YB2i7Mn%fpY@SX{Px_?P37^?5cf;3ojlat96gvdjh84$$^f(g#>U@ zub~{@`gsH3)zS537g=H6+Q21%NZ~_Fq2y;(dL%^ch>w5VNFEyrbUdNHWfad)8T9bp z_qFxAg>(J0Q)9(J)Qm}wPg*Lh(ziRPx?_>yte-rpt2~So=L;LW5y&{Rj~oI3^I%fc zi@1S12FUB2Zi?ro;$|Tx7wk!3hy)>NWkbsuV)qqe(=;QB7l}>!k#HVdj{{^bl0K#3 z3R3IZeY>zBU1P`EMJI$4?sUF$V-O$prOzdqy|L5w#U?Vk?$X1@4bz!0;wbN~OTi^` z^^2EWJx5hTV_g3i(ypEDbL&rtQpnnQ^i|HX%AcLY7mFl+GD0@DE&eu{9SVaV-|AHsT^{{e$|>b<>v%E?j-^oXHFF;_H5w2wUb)zy3e& zo_+S$cYk&FkD>JG_(2%x#E!iE!}&snUSQdAtHq?}`au{!`o6k_onL`dWvgs6>yugD zXkg(fe)QbCIf3KMwbHWLIeTzapmBw=?wR%#Fu+-MN%Rk zypc*h)Vn#JW8=OO44HU~-^xYW3UMU&5zv5YW63#uUhO?PIxne({G6+v!hic|NGKaV z5`PqsP;!sGVW%Ei2__Shqv{qz*_No}a@{wah`b& zf}hC0`pTb_>8W^xgqp_Qf3VNEaxt)4O^PblWsD`h04%O-P~)|TgY#^1YkWFT)?0MI z=f8`891t2_)L0iWV9om-o(%M`$66-81H#T_YCwq=hO@&iiYk{=qa$Bslh)!>Fb(b9 zd89WmWLB{4&L*DdcFI!0giH>A{2h4HdhdJlkj8N#03PABx>3JL1FLL>_Q0Ry87SK? z@_M2;AQK1!b7?=9<0Nl8@{cradujJe8Xr{FzxrBb&L9`y56%^4LN8kK)|MBazMVlW zd^srYg^{F;OXJt}@ymA*G$PPhf_u<880#9Xq^yHT;41NwzZQ`Hl!Y^Ac8a45y ztU_qKfmhC{sn*!|?C;fnsi+r`Itiu#1Thj3LP2*bRXz}tk5O1bWKj{26H z`W8X)s0H|tu4sNtK{bm>XnW%AMJ@Y5%NhAB@=lnJZtqIPBXCc7Jzm2-2+oU__nu>8 z$31v;2OspCD22&@@;1NhPhR!1r@qgJ_a)GVf(m<;RBol3?)d}$OQ{W-eOc{vvkku3 z_1h4}g&Q>bNv5xur@H7f5^Q!uH{(sr<$B0Fb_D+fLSRUuX_bN=lk3n&Y?F@wJvf&=?=8MGJ0_k~?EbL1bG!F2)fi zk3fB6lT?sp6=R=qn-$-0(l^5j{$$*Inax7W>iKXwe7c%1WybTROTS$}``A)F7AJQ{ z7iCX?`3>&MJjX&Uze~l!*hMluFu#ov$41L2B0QM3-yUqV5+{3tV$!$U_hWQxXXWbp z(i7)~0|v=9EFB*TBn2LOi7|Qgw!Sla;MJA+$C$~8De1r>LTb3SFBZfbplKpDvei1; zG^g)#HsVu3Z3t3t7?t9&ET5PYPm5q1L*@hP+Z=qvU$`A3Xoa7)0)Qcp9`+Bbrw?#E z$xO?GY3%S}un!XW!79~{)S91TN*Vjrb|HdF+DG?P1$LWzpibYrLHmdX9tY4@+-p~P za7Nh^oy|4ImA+mBOBmuaKZ$!H|F_w1Z-I*)^#T5P%$5hfXnbPlwUGDAft&zng9;zG zmhq&%r;T*T1c8%qJ=bo_8Fzk?haR_2*jnEJuHWsfdrQEP#|w8HO3Kqeb>dOB$~^p= zZ^Z?+3&w4XFn$Q5EPjm7Vu&N+R|Z2`Kl$Vp=i*Q9z5&IJbYI`+@THueF-#d{R9le^ zhNk0}7c}=MDZuxc6n^M=LA~+Xn??`}OVfZ$t$Z8f5yg)H?+qC6 z*Riq6(fNKT4Gw54Eyk2IUDP&VY%}!77BcJ{!nhy~oR3_(C&=1)6<)hqDSx|nX@~=_ zUd|}evY!huzM1$Kd0d}6do;C3AQ$T;6KgbY)HVxU$PEQ>=DbO|Zu$Wa4>$4nsaSBx zK%lrG>r${y^~RluBv^FeKJ#rv!;{_42qR~8G`E-QnT9Z#i?VZ`vDXaEPs$_;fJ>Y% zs6K~{YwfM?XV9Hj*g+lGxxortkVihF0zK;&kwYKP8&H8**^%l+ls$gS_PZoQ@HWj{ zw*8{4w-Dd0tgW&s8C28Mqd$B$FXQc5{evfdb=MPa6nbxxvY(+}roxeXFmtG<-6g*RpgmhwK=p8ezL>*BVDvTz$qWlY&G55*02GtAJ&e3#zDdut@x+*@-i z!!YsZIP41j_L$?rqUS}>C(IFr(sG7ljj;;&ga~ElmcuXd=d&+XT=o!?thS8g(^=2| z^zQZNzXX~D{nmIuBsW#ku<#21H8xSyKH5eu`-WD1_>4OdUkJ~js=fBv(`R@8`tHeJ z{j0mXpZr5&|I_Rvy0+C`_9OA-sosv6;nJ+1Z7(zgCut}78z1Hs$aZN|v`lrrBa^67 zOeW}uDGB40K|GQGLy&Gc7rXv~2& zZ6r@*v|YQ}IBc*Zv8z8+pmhydjix@vr+(6R!9-Y}x>k_`$uuPa!S^fq|I;0t+xm z2r{OzOvhkT(jfH_>kZPd=Wm5z0S!LFK?isT+zC$UsNOhG(somM0g>V4Q)iFP;(Edt zQpJu`+m!ttjG-rtpcjYWSc8Nxnz+R}i`yzz6WimYV2RE3zM$?}%nqpTgMCKv#+eS|3ApoWPrJhwdCMu&$Mhx1`%y_Mk%VP1P|7}ec!kG{9i zKhCmNn8-qbZKCf()Dtajb4lkIxYU}MjwL4!l+i&I$PD0Mr6HWoJpQhwE%TxI^k!{n-(BiB zHk?lYrh4P(-?X2F4;W8-G(L@`j`kQ@d(K$*mVSploQvL;GS`p`L>FxEZa$%H zemIznZ6=Pz!Xi6zIOdK_Z7>Lk*{MJ9TDq~|MFx!6}0a6Y>*^7*eX%{s8=72<4*knU>U9cRoofeX=BKxFUCtm=& z`DJ*z81(W+WE>PPMz}E|U!ZUoVLq6nnZVX1+3hIHsO}~m5TPMGD)Bs0PZfSw* z7l4xUV^W9WXje@2TfPVXEsZ~D^*Pqhj4-Q4Q4yVvE{-}>v_qnw0mvTY->0K7q96EZ zGgI@DPWCA*{(5Dr{Pa8aY#bc{h7EYi+KDM3#^2jyr};;hek`(%UEgLNyoxV<@*tnu zw+sXd^)39-7)V(!KJFA9Pw0QY@E;Jt>YvA6ZK2*fjUhzea|{LZ4fXbClKr^BhOxva z^NJ7Y6<<=bXI4QRKvi^`K~JXXfRm36(DqlykX4R?lc`c8ll1)il-;+_ynC7d=2N+X zwQi_}m?qxNz=qz*mNj8JXJO8{)wN8uZ*QS)e;=$u>?z%5u?)3HoE3djLl!`vw2 z+Rux&f6e)Vav&&NkcDP1P^)K83T3a=CLQ1`X%BP$CmsrEPa>##eOtegj>>+^)P)Ub zWw#p|s5%K5cJ>D3gNyZReSJ=gZYt7bv-Z(A9lH!b%Vb3$(k)?=aWl!L&5mA zO*y-8yvl*dgC_C4nD7-&exZM$Sxg6;q*C}!Ni!)=PZ+^VzE_m53fHW}eJH7ecG_dd zh7msfsPGs*$64!9mOqtUkV2BqJ1Hj5PH;-KySZnpY(8F`rTestJ z^j99JQE$H$#j-ZvYS!MkO+A%K!&hrjk5-VBxN#*KN`Q@XUM-j50%yA1_qBL-VD*xS z<4fHcdXk)v_VAq13eFXk(LDGKiz-3IV~paT$@5#sxL|2lcm7Xfx$~jCCbrbOo0+9M z2ABhH;d=G?pF~#;gpZK&pqF!~zEC#qm)@w1*%BfV3r}66b8Kz^HgRc^=bWdqXY=eo zxclTMKZD*U1DibRKf1b7m9?U21J4Q*W!GUe?Pe_79uIk0lTZ4{PJaj+U{t`zYJy%@x#3KVjFwdCeGcPeAzkA8i|M-clr= zp|40|JB1pk&Zlh8AP4p42=NwJvdC6j$$;A^w8ZcyKNqF+jl|H2FK_XRi*g#7+N&CU zq3pD>u9LN7{nEy+{|8L^Q>Tw#aAE1qU;i005$Bxniet=3#=O8UpZxyagyCmc{H3y!J1oLp~nKD6Lr+EwZ&MvoW~iZ*T;ic$Tgg{4_!Gs|@_TNyrN0 zL|IeH8rt}`;s9@aSZx}k3tu3~xBWn1B`0ZNBPSemqGE+MwT1u4lX=}BLCldvy$AWc75e2hV4Y3}0K+rV&T zewH!+Td4X;#!w(dPH-G_7!T)glaAF43U9vl2v5%iP~g#Df9ZWK2&Q2KB3a%BZt$eO zyKb~H2Ix`A9D<{qkTs7Zfn#n39n0AooW|F?Hkhx>s#M|8|)9UY@wQ<>nZZt_wwz{j(uM z86=c^9Ff^qY-zMMB&^p4Gt&pFM|*upSFD`-u*VgD;5YwBY7aP==PzEvg8YtEc_5by z73L^yJ3d$#6v`=|#Keq75lw08YS>>eoMBO(8$x;IN@AXp50_$CK*AHcT~xJ=l)Ui( z9;7z6o4AJ7$cLN@&?fJoO7`IZAnnJF)J1M{EmX0scq-dTOxP7;BAoQQ_^dLnf3(5s zipd4eoY0Mo(ygox{6V3Ge@}Q)^unJeL^9e)7NBiEpIBXWwgtkMFc!(~RX`p=B%A00 zrKiS;5YeO(UphBVLOukShiR`lE<8n>c+$7Z?!w-7*H=GOl5!I9#mcBY?(5h-CheGf zH;%e%F!_x>&y6csxz4mZanl@|J+|UAbbrR90gmX}Q`sizfe%aD)(3Qk-E=(8XZ(V@ z0#qjZf@2smBjY@Au<^iJ?&z?-8e8bU&08u}oN+`SPu{W-u*rlS=IsHN(bjU@)ouEs z(}zn*$!|X1a9~Vn52Yzy$aM}txeExi2@l)DViX@t+Z@F*5Ykr<={Ochr;{O$UVQF} zCMpec+crK~QZT%o2M0zM?j! z!Shl^0gUDNjXy*z7Ho$Hf73^7sPT|P%(;=tCVBxEaGXCT;)VU&^nF;MK8RzEb)|8x zd3{p^v6;<#I?#SUb7LbS7vY;TTo>S}Ry+8%)9fc+b^>>gm%i4Cj_WyQ<5sN#7*c%s zbX_iWJg~f@Y5*rjHq!f#@{sJ1lvcSAyD7`@D*zPa-#|51)AbG8Big_Q(7ZtH$l=8W z^?WEDdOp-h-TUQ-xneeej7%?;kxJO33#)tQc8SW-VS2)uD)2VIn- zgpM4_Zhy<4#5K} zJ;j4aem9SedwYj$0kGY#F1}R9mvxIK2qs^c2{|eY& zvjL_|ZdVz*L1Q~FRDbGb9u>l?ODWmNB@a02yYkK_zP2rvfM^+$`Yi0qZ~Kx(-Bw_5 z9LKZ8+Yo-hdU-FklHGh8;V7pKecC{~I2Zf0WH%c*S1+OQ?v-?QFO!Gu_fb=un|pt< zukSvf(_#hMmu#RS3i7fpveF??fz?5SQm33sWQ>2V4%Bs#nL6v0z|T&015xt{dD|p? z7=^6KzTi`kzd?Xm4?+#6&H73_<6pUj?#s-*wDsCY8TE==AXP=ww`1QUcT{MXGv1Cd z>$HXAhcV__w>Tv)KW*uGi@vtr-Y+Hfs$YSteH@{)3$5oQed(N&8 zUAamyh=vUMXTu)f?J-~6Stny*X@O+BN6&wJ7{)Qge6RwMjJV*@jeqWqLD$Aj^6BS5 z227M70+6vTkw_diiCj=pj+SrKV258BrU4x!A$qb?50U&FhaiQ92mW9n>OwZi%DhA_ zuQ9ZU8ba!5d+Z%2-7E%fFvHron+vu2&-e!uf^|jl`M5pO@7SWZH*zeCN1x`>3uOoJ z(erPB`HV4c`1dMDi9~Q&%M;& z;`JB|ZDf_+w9dCR2G%||wQpuW^&;Pm7%+E?@McKmn43=Y5ipdst4W=uZjw)@IMN45 zTDzatKdA5Z-ts|_xyY%tfvZmckLRR+jAOJrPaYSHDU0iMgPk<3!`Z$eMyU){iMOw? zI(QeclX;{T-iur3)D55zl;%X}(ol9UzfP_<&-ke*XsX{uilJhSaijrU8-)fRxr~2- zu$%*_BQH$xOeUHDkFN(`%Gx8F^5u1^llnFvNq;G^yi6Ya$j5r=LoB}96=3(CMRGuEigiev|WLI7q!nZKve&aKyx#WrcdM$MpQ zd1_jR%D|5H^^0Wth6{k+^lfro>u(u*10FB-y?gZKSKQM=rD{01_SzAM+5u#dK^B7y zPMr!TAXo*6g#9dsBpQbDL`2HR36B;QMt(=I4i5;@M)%-?+@?P#LCQs&vIw$TM;*&H z?l$29HgmKDivbN(JK)@XNV^yR_*3qVVUW+*n?j@xYP+!AyPo5DUy$^OzJZ^d%s!H(IggyZ6VO;QUpncSoYs!kA6!7t0yZbf|lY@e1m<}MonCZuMwt~>>s z(`A7TVG9o=$8Qkz)tc%a09sWLmB(^#6Zl*(yNny#elAL!ubh z=D$l)-%FD3vMX8Hj`uDQACkMKxiN1lkx6MFq5 zZ#seGHtb&K4E{CxqF1LHsu#W9$Axy~jNmoZ55WA+AP>jo5(gt4V(C!ioO2^;Z7VJn zVQc$<{NfM;wwQAxv5C_&Xwl9nmgQrm|C_9U4R|!(I}Z`T!1!^ex7qn`QtG2`J;YQ$ zVCH>3oNwy@8lL#BKLR8S{oqZz?zON1#;cfcoEx{#c!D<|vFvAqEg(t%&3X4#50b3$ zAWZ@7-`p6}nzFtTvIO3n&UO|{{?Q|o{x0m?X|%DtFcw(FHW3T2+^&-yyZG>1Gxbqw zeaeR!9iZD}vLw^iQ4_xEW#=Tm93A@>~d*(MGMel!Rw(LuT5&`P3DVa`<*OKcmsORgU9)klCf^H&u#;v^wf`?4xG(U8X!&I8EQheCoBRTYi-1oX)!S+hMi?>(hJsvbdve+XPaRgb|doW7#7%#M>`e zdIS`#JSReJ5`OmwVU&xZV_6V6t;`t1NO)!NQxjj=sPd|urgT##Gtm{cHouLv8E5o? zN!@o+zcrkq>&6mbY!**}l@-L@_lC&ykIoF%JRK%vcE498smfbiFCaN)+P>$P(cKFg zV>979cLrWa<)271PaOcpbn;}w#LFLm-tC()mBn>J7c*@jsgG)AFBzSaG*9JhIf7I> zaW!uW%7)o%#t{J|7mke*a`Kd+c3ZZ!N#5Cmy1*8$c`G{dJ@njz8yjqKH_pI`G`x4P zHogEXuW6Id&~tU4NSg~V!Z{Yo*%;MF`ef6ug?8)a0+du2&XR4v@k!YHMZJ0TmbbC3 zZA`Q0W^Vb?tU?Tu98kus+e?FOCF|q2$SPA8LjmcWbir+m zc{+1sQ_r0e3mt|Z@UL(asm z!XT*YC)YXrcaz9*bC7Ejd1wLnwGJ1Ey4G^OA;Upw8=3~1vX?x%#}D3(TL^l7Lr6ft zOoEPzI59@RJnP18=p5PnDRN^*lYfRWd{+m+GW4kefR+#=fPgO2IRZ0J8tfn=2%K<% z7dES?q5=$2aE4Lk_|T*$wBUlX=%!{%@LpUhAT&70TmJ+~Z3&v5IPD+`Hh$KFBRXmD z23Bp=ZzNOZh-Zkdqyz60keiRX?xcKPef4P4aPgMd!S}*=o}d_e2{9LBF7(1Wie!wM zBvV&pONgz@lrQqcG-wAY1A?=ag|l^z178O zOMaadsng)Z;^y^TkBh~yhS;OmzhWcr*LROT|KkRf;ZBE_{7_# zy-*T*1=EZfme)`@X!DH_jX!SkZGmjrK?_f{aWUaK#<8}ZzJ=ttL1#j7Jl~DdnbMX; z(jSwu2fUxZobj{^kuv<~q)g!XpUmSUb~4Fjd#E-a zQ|}^#c4_zfCDDOYhFG#IjCD#Q{dD1UU;77Y!Ja$780_m%q zwo6c@nCg0dC{bfh;H9VTe z=B6#_LVYy@vGTiOAEWxX*LNw4_Vblgu4P zYf11)F}}=a;t9ZMP~HHb3DLkq8d~G`$$y(~ZE>cd&T`p3*c15?^8M7a>jFE|ykJf& zjn%BxKj^iLu-|;q1zzP+4%)hdlb~$FTCCP-`ooWra-AOL{T`T{IQ|k}wdY0wEv^Yh z*6uDhMwKf$hHlZ(+@$5kdTB7|6DR5^ZP$sja}jcOBgi_LSl)ijkA&-a=da%4A+AE1 zv<0^DNyM?8WT88)fI*A$VFz)K)`4B1*9XNr(RlTOo(-)T4^|uqBW;TI^?e=^ntV3} zWp#YxPgpx}a#^E1o6)rdKWJ&&Wi!cU$&5IBc?pM^tZ5(_NS#PTp$x5=} z=y#vmlcr~%-cs%pWsAov?kt@rNsR%Tj2B4lvGuT(ov;%?=}k0g=NM_%lOz;=bm`X4 zzfA%4%Ue@T(@*w=-ZxxjdGm;i?*^?g%lNW?_pjJ~^sGMjh&7)$zHMgwG8+@Z9B~zm zYOY0)Z*vqg#VfCZjEv&7F3QK(C=ZqH*}1rb))J|w?N#GB@x~(=J^kl3NBFfaMt+|z zknbzvbZ#6)h{tXS);4sXm-MGO4W@;@*#!cjvFq*y9hZ+C zjvXso6TI%SNMlcX6boj{d(U>e;dB({obnG9z7@g^K1n(@IxqR;gZcV(a;O*f#TQ60I=T4?zm3X=#LQ`4lKMN?z;CDzqyf^TCHVZO1p8Z-)wU; zZ)V5gCyB0WD-DR=fj(?xar2;kl6OEOqm~VApbE!^KBL z2msa-LgO!~*gkE0{a@GV!T=a!wAcm3SDVt{h~}AmF+stLfWo_(*47eOqOUG7x=@$+ z5;G0@4*E4kI|zI&`<>vrlH0-QEz0jx;K<80ri1$n-)rVtwpWF z5KSZGwYM?0z(sj5We4c$Q*q>RoPUGtg}yJK!YL-NZr94T^My>#Yvt(}>~+>>W-KM% zXsACYz>x8`Dd)5z`Xens^j%1FWzAGZv(MTrk-(OB?vj zGjhY2I0b`ti|Ixqq$p^IVOrmjM)m5mY(#nXJZ#V&vq#XFj&FNHPBis_)abpaTBg3= zGKIE0{F8=U70BG2ikO2CG10yNiY6mqie?4*o&1ic5#j#?SeCvdWLIyFmYw6JpH4N?ZoLYW(8x6k z`5k*!8zatN#)WAvMv(_xKieXW#yXJovGH3XpG{?SO6jGZ&=%HKW3zb_($dvS@jl@x zf%BNW)Xens4Nq&n_!V;fv4IJp1wx#!WzvBw9$UaGD5XU0DBgHYTSrF@`^ydyy*RR|tQD@tg(M8Qg>C(j0e zL9|6zYIPY)FAsn@oT%49mXo1uxaYF4*)c%*s+T$pm7zBEH7a{)AK|`zv09GyF2D}| zYkOY-{tXw@>-F8g_}~8fyRZK5|M~7e`Y-fh0?`l5Y?NuZPWL;tfvyOO~Z z^=ETVKT}{V(dLa?YydEnQ#(`HP=Lek_*CQ{`{|YGHvNG;+ycCj**G(dvwpm!xlVd= zVo2~^LEAwPd2)2qr8~BSTgl1)SZvmJfJUF{fjP^)ao%^Fp2UU&bAYepR5p9q`DCKd zr)eMGO>^Q+SWS_b>a&n8i!;YpYE#zsdKyp*(u4SZ?GOgOO;_xw-8Rid`kjYGZo$9{ zTki3=t|%Mri##oi7WM5HWoThg#fjBP+;p?QDzCEE#<&g5*RR;3!dE35pp%^sdgvpZ zIDG9`Wv06O#)@_R71s zK&gH=evsg#-KVC%Xe?(-*D^zM)+m&*kBdON0wEVI928uK6bI6bE3c@rs*QUvV=Ozm53GXKW6$W$14oN=|NrZ0>{8yL5RQk%#=hWp|v`uAZbJI5CJ& zX5DRXz##9MoVw0ka>kx-(7SjcPK+b*pfk3&Y+f?ZN>|F!cEcPR+*T^vMKV0?I6BVe zz_-yCDSj*IAv?cKkZ-Hk$MAR?Z|iqI*Rj&{X+QJ!A;%rOxBM|w9&vu%2BBjWxx&ON zxn#V{I`>MaI2xSWZ@`AG$i^KP9fJpN_}yYG-ZwOFZE(blbhZqz=thOj3mVR3t)IOG zTM-)bm4SknPF8Hnb$D3+Jtl+Sy$57+9)?L5B7IH0n>1Cm%An2HC3W#qd)xMeHSMce zKPXl*+j-VHL6w@n$dFv$-TK1vt?h1M!bPr~cKh_(2)7>5w&PF6J!8mkSSQvRl-(1{ zugKz4e2(sbW^dOF794l9`zNlEY_Ap*sTxJWe9e{4>s9_V^ja}N70M%PeV6;6I!qzJ zvDqvLA9d)rh~y)V7k{HaW6a(kkzetXJ|Ldbu0K_ktzI4A9;vsX(ler^b|xjMiTVF zNq^;~JyzuHDuHpZi%bK@zoDc|E_93;Q$O?LT#8S%sSC_RM9?-dmw<<@!5P1T8=y9) z4*O{P{7d{azR@0Dto+IfvMmW~+VL-J@YFFxN)#ipwuhd6V|%o>Ie3u{Zjs}qXI<2m zj;VDlcJ{)6rr$}a+HEZm9UZKwX_t|kM)iFl7 z>n{mpu&EZ;G<@W>${dW1t^d?M{4Gv!e9d}MIAm90c*)M>K{KwQqPD@aRgC=wq`rsn zzPPsK667`wd9l~pP*j0Hat1IT-$?R>(LAqHJlEj1yIxJ+Rrci0`LD)dfQ~%b`SSmv zpMcMA)#;~E?xbU|Ba41hrq1;RC2ryYSuY~^giSXQ05h_>n=>T0?L8`k=79ZNT%wX0 zjA|;hIfrY-)SHHC{CPej4ZO+DeDhP*{^dl+6RnpcrQ^yv)=yf&AX=YD|zcU zG$-Qd`l~{ax_N=I%yXW6r0mwm#0>uwEZU;Z!9lZYIl--Y4hOXFk&GbfcZrpjKQoGB z5j?41#UOM;b{T})l-s3|bToxLGYRr9)^YQunx1&3QL8?F^VQwsum3ft3qR$ipTExq zBd!3^He)D6R>~IStx>=3GnXQa-LEn|e(k#kh_6SV1gBnd(GHuQ{&jAXUeuK{tf6aV zeF#N-5qrAlO>r3p9?1!;a8FR=@zbZ%CzT(0#~aEH0Q6em z88mK$0pCyCy>LMWFJ8&;7#Umxwe7LjLJ|l6$v^og|LuRL=&9frbX{Q1AY^gcG=Lbw zdNP`kYaN)bI#M}z!zqaHeCY(eLF!%7HApqlhp$xi%E{O@fGgy2K_x1DZQ3haP)%hJ z8F|5kPn%8=F}dN>-$4gH8YGxVtU>@eaMya=o#5b0)b7Pf!hxpMtg9Zn#hJ(nvg&~{ zjV$KPd06!wrK7zEr^VRTMc9=#f632=^w8Mtm!tL4v}W>iJV7k}mzv*ZZuI!%Gkz}h z)faa^|HFTL_sM5Je?Xvtd!XUEYT53vv8|bb29C=E*Ep1Rr@pn-20Z-pknO4)%1QYU z%qH{^$L;e=;BvC}$9KVgA8n)8+kAB9Fq-o{1H-b75YsZS=ErZFau9p4z0Qq1yy05}5L# zy-}LHV^@r7|G+QsJQ!Y{8W&>mJ#fcwZ9pen3N9zKJG+#*F z!erwtf+zlBda**Z5ozZ0(btO%0&6Q{QR;dTz2a4qBr=JRrIqm@x<^mAdU|dF6#LP1 z9kds*`a*dolJ$X`1lF|xT()w7+Wr>!o&<3y8M`jn+bE|-nQPxtgRe)V?#Wzwa5N6Q z>ry&>fE)VCJ{TjfaWHMlpj`43UwdpjKBiJSCgXliOrRux4Z<;e7s>7^m*`7w68eOOlAqH<2WgnlnM;op~L{Wws9 z&*f2hVjJ{)?xGsoxsfv$V`eN9;}e|X=7**bX6#sI<+bnoWqlZCbdM?|Bx9_NMn+XF zC;u_R05tZ(YjgG%)PSN4jXkXkm22B98RO##5nQZ7zxuX?)h`!UNUe(m1fMc($t>h9 zE8*Ap6g_Bo4A!p$12CE0Pv`mr!bwDNjP7DWTMXUHjZBi)7GmvVIUM;F7dXD;$qev0 z_jvP?cjcky8y^u_bfo_=>DrbbgZUO%)Jb;7){{($)h;A>*}xi3UhUXc5PITu1AtZa zRYoE0zU>jHUnB>WMPHwZJ4fsh!0p%6HclT+4?`Z!zeAbt;>U@#?@?J}cbV1=4cAXo zHr~f;@ziGyKET)yL|d&3VMAO0a2gzaFKzy;Ff=$=HhY^s)K&-FCbDQcM@75xP;VXZ z+5vTLCTMHGjf)WwAobgXZYBCQWtgjE9}ngk7wl7fw*lQ17u)EGHf1A@+MK*y%Xvc7 ziGh(Xs(z6szY0@zd>{5XYTli>f`_C$^_zXt898qBYiP5kLQ{u{@|F*zo+5#{&`pw?<`f__@Mp+Qbr`%Spxs+F)2@EhEr zbP;0$l8-3551FUT1`~c(mg6mQJp?|E;*8vU2rZc7Q z|68^t8KJ~%?k^G5C0Xpnw5g!~9497RFAc0TmI|pic6;-$NrsPt>KL9Zda>JTlIlPyM3xR+4A-1f?scWszch(_Q2{ z6z`j^F>_!H=J2Gx{nI z+`V}ACyORf5Vvpmah&Ob8Zvl36R!0`e#WllpNVgzq)q#40VPp#i+=V+OsbR3qZ#4c z=hv_4Dt+o4BSo~mtVffL3nqBWemnrLJN#rZjxH5yix6dC7PtuHR|Az4mq3e_Mf+N9 z>qwpU36{KXT2gOeob!tj@|L~my5mt0#~bH9SxzjGU9cV`8YzjB8SiO33e;_$g6^cw zjwZosL;pZuY!)7^3px70*i)Z;&P|R8|MKxqf%B#+_6C7Vmd)UFv`u`uI6%lFy5_;P zCj9shm4Oc_*r+SZYIp?^ZQxkh5@FDK8Z@j^+r;_MYVT~a*>d!vVh1SMNU4wfNYlrF zr06&|eRAwqrTPi$k-x&5W8*k=Qn7AdUkOLLZMH1d>LcW^Nw+;_DMJZ@veAI~Z;fm1 z4bzaG0#L6!juEeWe>7zlFONSJaeS&Q#UBHLV{hvcDwYUD=}Iel)EE1fvH<*mO0Y_db$mU28m`Ab-oC0jHfg0 zv{kw=%s|#s$%b`{(%LnR%JCs`#(38FL1bjf*;WM4k+h3)o&^(i_SVwKct%jYT~>yf zh{UnJFAkf*D%(Wrjt-7em!D9AZs_o_)#|dg_CL@RP1;fj7#dp+_JUOnr8BMpBHVDW zZE}MnfFDf(`G~V${Lz1P_sc)}FR`D` zwwktO%zuauz-M?cIr$vRZrq}xjn~WK%{J5U*@Mo-Zqs`CRt90uY3g=p8KNr`&OqNw zzP`ht|H<$FBlP>vS#Wq^Xvvcb$U>ac9Zm>S=l31ia&w4+B=OLn}x`TcKOM?@4Cd=pCHsq5j-u1}v+vM|>B*;}#q4`%ZOy+3fa*6p5TK@K7 zlRUQUjz(a-2epRDYuv~t>v44-^W_Jz!;G#uS@v$5fUa@S`#%12$YKM*n#vJF zq>leWiBCqAA)% zyl(Pfu&KgB|J0W!gf&TyKIdFBmpxj?ZQEgs#i*xnUO(ps zs4o$SC#4bi33tN2e(?>TuaW=r?iSwr{Ws#gvv^O|2cXsegVQocHWLZdLwD6(bv+eE zshO3|qW6eQ0C=+TF|URc(Rd&k=Ei7eT8+690zahR8v2oc{t;YYz3cW^grpSAxN_xPTA>kfFv4rv+#_17ExZ)2;WKI4dTKBDjX$|FZxUs3Cr`iA+YjXTxzHt5TAN4yl936vSQm0+(lIv*5#F>mf_U`;P)3G=E!rcI6e9gQE zEN~99vmdeih2oCgifzoTE+c%X{&BpZ+)P}tmPX#V@Y&%>HLa9Hl{8b zz$vf8m~g`gSP7V_o9sKk<Ga7vFY!L}>Y;6C#|F zexhg~>kRtG#J@nsp|;cF7PU7=KA~7;rYq>`HSNL#KPUrC{@W(S+I*$qdT!q^_au8F zw*7=QW8E}1HHS=8xvtu2%eKqcN5|czA2@2>IRSYiKw9$o0(*T$Kb)Qcd`R!693Mcs z2*z>xyf_!UCH}QY50%0%Y@4@Rzvhdvm44eUeF(j}C39$rp^n5Ojh)NWCwAU0wxwL| z&L_L)Wp9L^c$kle^rJ~VtdqX7*B8NU51hW(PPXz;=LP2HoSPgv z0xwz5Ri0vm_6@1fYK|rTF1MqNBAJAhPb#dkJ}HUE$G%rg0YsL%Whe524*2-xVq5fi z^2c{ye)*?&ufF(W?179DBelLmU}ck%^Ir1Pt{l?y)t~mEmq^;!Z$0haFxx+jUNJ{U zQQD68{I{>HqVsPBA76uP7I zWY?{rsTs#7`kYlA9i+FgXlU@|XP@w2LVDAuj*Vw^&}hkQ^Gc0D&i)AE`BpZ?z+G_w zSD$M4*4=DgK60Ju8dxXraSbDlUR&*jLHVr!Nersu0eBHj`y+h++Mf_mP-yt7Pk-I7 z1uN%_>iLYA^2R3zfmyd1OYr~e-|&`rnMNH2HRQ@?RTYIvnyN6Qdu;|s2MzA= z4@x7$mgR#`z7^2LPBT`F+;;N4c)Zmxo7%S>QPpSlIqg{F6dd3mkJ2o`B7|NJ*2@pt zWP)kgu((j`DNA0t2A+j$yjWIBi_f~RqJk4aHnt=ibm*jrNiSLTw_}a%jVbc*BeDDG zeeoEG` z0@4M`^y*AAXkbdpAN5Jre#fj8|rGpt?5 zaUv-Ynud=0U%66YR!R%_M7z3;LmhH-eN5Z(pFGgCe|b_R74g(Bii##LKV(}d1*=YP zxUf2Q?m`3#8v|aP<1K$A?)(Kteu`%tcyTGe09Sv|Lh#s6+igB#pOY}Q70WcJ|C}6J zuT8NNA3|QXwfi*}u7sr?9RBa69bWN3P@g^%u2*Q;$7#?e*$bM*_!cCh)X6^?J)PhW zLv#TK!;HT{Up_KcqX*pWrm?W5IWD1-Mw$4N1_DpZ|Hs|C_1czXiCOF1^4e8h-B4}X z*tD_QJQxWffo#Ep#RC$L`~aT#mmmZW7CiU?86?11#&X;4#`L|rvN9|4T=~9lM9ek! zI(wfynORxg)v@g6jC5t7};!FVIc()&#D zc7AMo8!lwqeQpVRdI?>$Q5=6iYVn}%AwS&0 zkMeTjF6(0ZqGM*w!9w0JsK4gw19kImuDxj$QLr!J`e- z_~w81qKeIy_fS0*9n}B2#%nQs_z^F^tcWxfQet}Zqm7(9@O=Q<}YjUFH--r zA8n>vSJwn}R%)2D-Y~B@zc7=5%=xju(N~ZU+_~#9cdfV#ZF0CEM!2**5Py)i?-JZtPV`sX)F)#RGa ze!N1zS#HJ}=JF+L&2BaWQGIQGhqsT~;TdYXyuUHyIzt0%19FP?6;+;{HM8J^ zxi~y{JG^qsjw`D4lj|JE>bc2nV7ka8U7NW2iE>c~tn&`a)mgEUdZahyhwR_Dx5wDf zCT?tv?lO6skH1UV8c99)d}Tv|_>_gjx~y+#_+u@T{S|DchQI z8_G5oO7DFX%`$0XeW{ZEga=73)UWd`8h19LmxT24+}F!w@bHu1#l8FhW~?-3 z#IrqYH)VKXjmW}C-O#?Aamb(l>JbNz(kvq#L!P|(f{w$&oSUFb)E{^Fh(>IVtv2gIaux<3}4QtAmY!qS>pSl)YKAdOB@uZur*^z%NGPp?>pG z2W2KpU96Ws^(K!!#NjdJz_I_-IfvGZN!mJnkDj^)U)a!oSpcKK)dHUgmzVhRaxVh0 zr{sD1*ezfCu4iRlQg}>%T54dQvfSUmHt9hMpDf~PLuGXV0)5Bx6CdI^t|?c)@1&g4 z*4KIvJde*O9J5p3Q^$8Pw_`zC_2WO?v|dz`zD@T{yWmsH_u{8b;u-tLx~PT#E)8|I zm+jB^2rZIm-V*G#DVql?&doxN46~}?$C2<=wYvB z70U>frE!}b1=qCIG9$-jCwTczL{c$|P-E75lizamLbj`>d6=qoP5!UsNau8)R( z^G|c@2b^wQzyvRLOO`&>aq`nvUm3dluNTf-L&(C5V(r}s!#Ubk8>8e)_d4b0c;tkN zP2F&V9s02g-2!o1eNK-l&+#Yb_A_l8zo}qj54r=q;e`K>A`7eCe7(98S zhIpt%BEgtkl-v}W6xm8YXn~#L3 z4%m|tSE`-M-v)yzM#F6Y+sG*`gbE{ODVBm8XB|UW`7Qg*`Ud^4P7$BesV0K%_xrwp zS_jqe!_7N`qx4n96YPrk_3o0MPccJVJkWQZQaLJ_221cPRq*RLrbKEB#I zn?TkLU%wl`Il4J*as+ey^Bmt+bez^*E+UL^Vcmhl@tl@rg+@xAE5A)%{ToA=j8XLY z3Mti5q4c_kudW!Jdnz9QZBg3bG?K^oYMxD+?xYrdtaC*Ega?Jgizjdj%AGz3Zf$ba z#6^K=HC6fJYs(BE?ZS&(-owYk7uNAF^w|?&#J+=lz5nDAO1MTz{SElwN28=)^&z$B0o7$OuR|AXO?&7K2}L1_epz zSKXqG!MFHQ_R;3jTi$~l0^G3C(Vn>9!Fxc~LpTq^r$w_=oA8rs(-#aTwyQB_nsqMs z(XjxW4OJS%MRtqHP>!$d&jYYBXZSg9<5)I!)w7c?X~=WhRjaC)s?=gm+7)bLA$%zN zbY{!yD$&fx8Q^Pr*#0=a6UWNo657JO2MEXufTp?Ok32rSm3`NCRlLhxjU2o8#l&nF z6XPxRXw7#Se1|AcXznV?7~okGum61W@@JiB^;AAj13r54F@wj)kS|}x`RDs}YxjNJ z@5RY1+J1GwdvUg*_1EPQgV&1z4T8od?r>7{Vv+G+)Y1%ytt^Z`*a}v%Qn}K z4ImuXdGf47B!u+bz}!4gC|KnN2Op$C2EY(XSY&s;9`fNsaEW(a)@Gj}h%(uO?8bU7 zJ8^?xYcMw(Qg$h9e73NY;N9u2uM@E3!>fT&nEVy7=9AX$_6_zi+>cPTWq&xz7grkp z$hgIC8>y-{i|l=oTkSTVcfrp%59QDF;-E^&^^In6y|||Ue@2(?xA~}DmbTgJI*ZnA zrfL?EhBn9hixcxKQ^nxaQmsK;$A}_UGW83Y?PtS9&aRakhAdI9Ukor0;zzcRL7{Q_ z6ipNvozfDsXz$it(O@_d0$Ea)CjmVXsUpo!fF0v!~!biL(`K6V??r#DD7K0Aik zTSmKF3@Ki2@M9j5k19y(NUR=RI02TqBRraw1({93;!s{G*SVB@d+WAw3<WuN`CWHvQ4nZIIlE zW*$0K4`srQEg7%A1+jWMs!8)y2dxfaf12@ji%`O$krHax*slKT8)cHcF;R9dUT)}C z%QI+^mj39ZTD}eD5f>AmTzG9fy1abj6I3JDK6v<5ISVe#3lm)^ho83a)gBGGrLs^h za)=UVQuSoju5p5+c(&1jG^o``ss9zd+aO*r8hY*0mqPtG%5#Lkdga)6HP*87!>!Y= zG6M*u6E-Y|1k(YJJ3_O+X7}A(3FJL}FnCykWTSmL>PuevwXl)mG z*-VbBEpf=tLmN=Y!}>!uH0Y~2jbG8hm$G)-#@m#o>F5lTxsWolKut&S`5&B>QC>b< z{N%IOTB7vfYxA()@n^5ATJlh-J>sgA`s%A_1qml@9uptq&!YllFYvxH#sO|$IJP;b znMSU;#Zh=2n1ghH4-i$h!ElqtG-Yw*dDu>kd4JE>HpAs3L71XB>N^fy@SA&(wmhYn zhy`eETkVs-{m9=3j8Fmmd%@3(hWuxb3eWi^_{)~LEG7mxF!LAWw4-@U<-yzWES9WC z2dc^;@ex(ua`pPGQO|~sfawONZ{%)VzI6mkbZ!UIC zJ8eo8S22C~AV*O2w7vbpl!Sobb&ct*4PJDAgMkf`!xktRbo9n94O0_xeH>-$L+J%n zU(_+wohH#Fe|D>ljOUEWQU=3k-;HWQ*$RrV$oe z8bpg?s<%7vQY{~t-;0R^S>|J~jQ7G&T2MHeD1!e68&W1 z-r{wLIWpljn?Y6II;y^NX84V66NPp>^;U7%FL}OthciKJahp|p=--kRi*sSz{y9lP zeMUJRetmt?&evc35tH(tU!Hx)Fgo~@%i0cpfNBGfC z#}L1p{tll4!8P6RV4tNAO6My+A9+Ir_;9YiF=%;S%er$*KK_Ha$Fqh$C?~dPFL3_j7*hp#1NW5SML!dDmrSV$KP$nEEcvZ)kTD=qmFr zWS%ntYKu3|_!ND2BH{%7=$C!f@msx2f@e+}&71J+BUW1bjzsmrXNRkTvR43_fS{kB zar_zMyNk=(Pqv`CAnF1bG3JDBJ9V+^q@(twC`WB8*_Fj{p#lJ|sXI@2NdR9~A;p|^ z`9R&4&M+N6EEr`M2)2`do}5YR+`c4^t?2-d4OGyG3xAXlND>Ji%Oz6}I9EZ_`lE3~ zV?w3&W<&-qzMEW%vHkqBt$kg(+tCPj^P9Z7FUa?Zj^gP#W_njPu$>8@#}*6;FMf zdzQ8NcKf+_Pyk5U+Bl|6KP))KQ^k~7n%LGmRkc>H_6K#=akbk*$~M6|v;^N1j|Kcj zhuQE}7)fF1ke%wi^#r`zPqcG7!_T_h!q4SR?@cnnwL!mfQ-Ei_002M$Nkl)WKQ)3>4hMbZ34>3E-S+lVkg>FdpUwuSxJG4&M}^?diTy@i;z&D7ls zxV;XPV4v~c8(_e(xA_}-o*PrqJl>i@rqiE83zK@Gj(Hrdw@bx^bAZ=&ByxW!kZ?v5?5UBDo_H7~PycWFEB%FozML&rK)YOYbshtqvJEXyX=;m52> zm*D97RN2`~UywgLMyxIvXB^wt`Uyw)#J%(TtPjC)&j4J<*29bTFaE%OOTq1jbHy39 z^Vz)`>YSHukBP>ma>q@_fOYwT-vdE~*WV zV+pO2zncHa7a!E=BG{kWn(#?dYj~K(6neIDdi@T1-K#5XpQ=F02JD ze$XMvl-{+xYx=qruz9LsBz9i5c-e;IERLJs(qW$Rar4vov)ULNk%!wTe=kWLR1M~} zf!!6DE>%q{jl*J9yGuqRwdv}i=!{2g5kJ4ML&hWze&Q+M+or`&^6|~+=GdWn@=q3- zC&0e5JOz=wc|sp3Bb#E3Y~XDQ(*eIi@N8Y;5#!c$W3+ygUhp|(3jpi3&K~dJ?TSTM z-9p;94YxAmU!UwT9#7nCA^YGk?34HL(daDZ>m&jTR(i8^D6 zKR390RdL)<6+;@I9Ai#0niCyFlv53P0@FC{DK(0Yef292yI+UQ*H9^U`jf0=uaBNS z|EHHHfB4^BKK|j4FJJuWzq~y8;orYJ|KWeeSoKkqE-&50Z+^@kxjA1zZyg3HuW?s@ zSfO4kN<<;kZa(VOVZvivyc96Id{sYf(Lpt^2FllEzS}#bM<$%Wp?;CV@W5X6RKNI&3z9I!DpO+hbKKNVwmG#`Oimfl&;Yx}wtDV3 zP^`fRY}Lxy9#?8AGY?_%5opBvZ+kqW@ogWaNv~e~SM~y^>S?FCsl#YxJ+c>FFo-mH z&#lIb{KSz*?%-&W|6EwMG;yTgtZ<+2nXzXb z(HlRjgAm}3Ehg&~-5t%D!Onm0R8b zCzCo7+)0+NFllP=paUQI5}|WHIIfM>shn_*I)l89nn7}N1-NlURWCl%S+-twa{QzN zsSQ0`a|5d=UF9hala;^sF!XXTz0G&mO#R#6SBi688am=>@J*uW{>mns#{qZRL^Ewi zhY^1@?ZaAb$4>1Gu7gQ*xr#6TYv!Xhj8l27=)A|L)*k7gKOje(Um@Q z7^Wl#^_*7}I04w)od9uhzy7()`exHg%BR@Kf0W-hefVSS`xN(l0R5+F@vaa{2Yk4X zBgT<;{QJIQzYSiCTQzjhQ?k?GXOdU<=R0y_&s{V@|Ll& zMHQpA)4(D|fH6i4O_HxR>d)@NhRFv^JRh+E@{)(x?a^H*(HG>K zY^gs-Q27<#<3rm4j`WYi=U=Pb7-*MTtVSLR`kwQrwB^S%sB>pq`{?Y2ou{rImtKYq zE>q!P$5#PB1^Dt7rKk*-`M3}=mh`iFgxYtpr|m9=kZ*0=6=ohl7ne9roJ}05h;?_` zRoU`dGGcK0N|pldq)~XE@QTv~vV*sRhd_;7{7%Zaj4hUczoJqb{b+5AZTP9NmPzVI zNf_Cq&EwXrcbECw5lSom?62tKQ-Cg{<}$z3 z*JN|w>%$xQZX5}klbafNDWLTv+W-ZJOs2s61YXd<%QH1Je9&vJt)y;&ouQP#w|!pi z3k8(h3S1ZR6&wHhHG0?{1dZ)8X?U!{ao90*0L~footE3c%}f7UgU<9BFG%mWyXE)3 z@LRlHJ|yFSqRVw5e{K-jq!>wCl2-@(_?V|uUK0dqS{sV4MloR3w$HU~umymUxa zP-6}@J5JcCg^SPb;UnL1qTkg~k_jX-lRANq2`ws(@qtb=pD#WOciSDW@TTHiKIa$N zdmW_fv*NJ3Ii1&lKXf5d#@2U~4m;JpjbWRgzwrloDju)LF{Nk|2<+Fy=!@sIR(!64-(1 zjR+R_6`0GH*u?Ds`Ls=?BVKeWwu9%z&yzZ}r@D`4_S%a%5v1AQk%$it(09%`j_<;p zpN>r?^l@}`x^fBP4GHckkxfRw14*57Ce1NFZqTkl#`eVm>EKdxhVep)>*;NZ8eC_a z4jMBBo|$DgggwFFJWI0LK9+CDAF3P~vF=OIqlfnPGz`Uk{-M<_yIVN`$K_n-AK&R~ zJ*hzbnR+-9iX~*Vh5i?AgOj#8Q(CA$r^DvmTw%K+*S6C(zl=xELuzaERwdj1a60+? z*AaT>EOA6JLz7DibZepUI-xsrOSM13jAG!M0 zsE;)sg}D7F8@KrUq0{iC8u~r{(;EwSoEn|+ENVw_SK6>$?kJv_VYBFiRBd0fw0Q=+ z`AV$?v#p|$AWe;P$4e3T;@@*gVfJ}(^}Am1Lb`FUeVJnrX}mge@O(-PZ`@^6h0*vz z3b&gliO&ZH&JXMCg(_f_Y}@8S2)wDb*p#s9(cR)s=|bfmSM9H+r!Ri@@`KAiy!?!d zbpPrf|D(%q{=NVB^6`^@cKPY^A78%u=Wv9 z*iIJQ)br$ve{}iPPd>kV_Vm}eVfk0k0H38Jx)eZTri5+C>kiwxc+@Mc>HFd^(WPFE1sK$FvwRBHvWNQJ3DUmBqa5U)z`(pWwqf;QS$5D zeaW&CuV;%cGFCcI(>TgKbqIg=6y(eQO&W;%fW<5Gl=GAO1dnN`moGo#_hUbS#uqqF z%6pKhlTL1qB-3~e$Udsv`V`jAST*=FLvKFVgWdHnK-xFGtj;uxmPiL+Lp>9utz3Uz{W2*4Ze1i?Bo&N{G`8V4E375 z6mg)U+#4^1UiC}kToFOMkWO7m=&ZHsT&dHoW6f=8|Fw@+QyfaJ(z`;*UCos)k2C^wTX!W+(~p>TvQD>^Lf7u>1N6I|HQ# zK69RobXT49l)c-d4Om$tIGMFu1|NlG9v$WBoCzo>K>gYj|F^JK5DlwjqttYU zaFdvB1s=hYu3~~WI_qML7M5>TcI!LFf-6o~d<#4$LqgjJu6>Os=P&*VOgF9u(Lmq!OC<8;z zcv)c-MLr)H0J5EoA_2EIwM z&)9dHql{?;+ml^bJ!4_?A*(#cR)6p91)IfApe}aw2g7+Dv>o#kaOt=I@@P2I4;!Pc zz9;P%ffdaMN19~!m&S6sm8@NK^55du3npIpljX2I&5Z_|$%6zPU=lrcP$78JPAuZT z!Vl=8(Vjh#t3d5u41fYocFPlz7Ih29nu*b63k>tKdaT$^C-TaYPmAAlQmfHzsZm)W zJ=s)y!EL&VQ)#+*hu%)=BbVs6FDM^FBQ>_XHf+RRo4yL2e2yBMB{hp_kg2S_?O#?yG3c6Y$H`zw0o=1brNZAfufKq>`8s#D2=$_% zo1mhH55tuP<8OF;bMhc0Ya?$O zj*gcIOSU*B<4!B0{R<{Z> ze$fwPltD{(HoJv67Mf;!W>6t+-G6S}b#Sq5sBf(o1773AkAgmBX+v*HxqXp!c{G0C z^y@yqy^F^g|C~S52;aUj??u#|ghzK8AM@K9Og5eP=Iy_QuD^GvU$9%i(B!7o{A>*O=;PICG1QIPKF-7nN+z zfp-pSy>Q#P_=d@7iGo%3SemLGx* zS7g>#F}b^DggQ4Zjaj=n1C~&+Cwr$fpu?CG@WHH{*7)O(13M-$q00TGcS6&j8sn9? z&Y7ocP)0WYbRDqu6AR787C^S!co(0A6{grnYHqef)g3>c`Y;vYw`M=Z;@O{@HkskG zNlJ4Ehxbctazk!$s=Iqbx%)J)mY*Flze?`fq(|zkztvmHvBJ5?nPm2Kw9O4dt21Jb z@q`9kspGKgDV>`~FV)r@ZC}Ufq=8fp;Fkq4+eJgb=`=V#k5&9;lJ zNS5s?(6-k?e^0tDLrI@(e|rtseK*nXO?N6*Jjfh6MKfj5BOS-d@7-S*)r9G3!SIrR zeEOQPFIq+3*rToe%_7%su2I?;q)NYu&Ec&zC7^Ge= z0X|~_nUum80L+%qxeI?Gi-O<#ke7brE%fhvK#qMn-Y^?`rmUX2-cb2@q-}pP4)cwp zG0go@e;>*{P+$FqHd`U|10D?U^38Ud)JyUFvuzQ4PTEtFEtw@@cZ1l5!k2wWjB9yF z&)?O7=5h10akm_)M^$XZk%qM)A- zU3(QUguBlU)n+DJHM6V^*HmAQ=?NAYKu+9y5)l$dy$@df8}<%pCpzxm{0IN_E+pv{?E(v$A5o(KxJC<)iF+v9SRUQzF(!r0Qv2*G<&W#<{NXU)MR~l##8fszUaB- zNSuRwOiurGb7>_eY2z_I+HQ^e-W*A?T>aQ7jZI~1I0nz!#&ZGU0i{~kgQN_{S{0-w zqKX(NU)wYNsn-^n%2SsZSG#`4MO>J)x`9?%;wT@QZhVDa{yudUV+wOFJng0|lWx~m z=Rc3>30%8ek8>z*9D+f4bXli{)fw}$oA@U~(kJo~Ufa-dx``M-ocI#%d_xnYI}FlY zKMl^vY+nF{9=-aUH%$E*Hy*#@tyjMWl@dmVnCh%Rwa)+PIv1(jGntfE%PQYF^O*mZ zQ;hYg8;0_ovBaag2>@pa94u_H#(L)u5N+4OT4^GYTmv{(>Wj|r;L(1agrsShf5z@gu>s00If-BVFt!oc_~31`I8?G zzhxLg9ytg-!#MEe;05s-i;IB1-ELls3_Uc(9W=f={ps?1&V`Fs zAXJ7Zg_p-RiR@%5DRZDY$_4?J${Z!H69UgGG*GWKkPA|~iyV3fIr$ZQV9sVbkP&9J z=4<17rbT$dP8KrdqFyC3WkFY_g%+!xh)~`^UIleS2cGz6J~D&1i?lkciXTFf)R+9~ zT=-#pO5?1}k>FRH`pZ(tdaru+q`Cl%7{G0#LcC0eBV=Rv`;i5P(Tzp5&2=De_&Ts0(so*W_2den|+&xF|e) zC&hF))r)g~lE)T)KgNB~iCKMMt>X}rxmUh8^AYBvsk@JFiQiM4zR_McGTa37;-A06 z<=s8|$EQE!_Q4OD$c^&Hom6mRPi-&{(CkI4?dkutSt`KX@_2S^*fJmV286Q-$1xvs zw0-Lz%5_#$mfyogS+$dTp}X^hcaPfS>Csos7VJDGY#cc#r<0)Y#}4ZU&ivEjW;St( zV%1nOq*pChA?c@X+7Ch(Re{QOR7MW^?fTKu%Bjvr=4}^acmf~}`cp=(OSC`zT!6?N zLKhv0=4;a}l5oX?LrF5#F!eioRwz74UZ}#7RTk$+o52Erw)z!ZlW$IgqU+ zZD%ppI(b^MO;upeb&@K(I}U}%1OR+ryI3S3UwgYLX*SM?q24Pou<)gdudK1JtAP4} z7*Hrly-nejd+5uU;dD%$JaKao&!6_cbS{GDNFHCFxvVG+bi~g>IF}#FZ=WochY!L! zk+7rd*^||8g`fm!``o>Ite6AL4=su?D$wquB1!F^Z zVJ^RHp8F{E&NsfpW|!?4&Y_%k3=eR%WxF^$D)o%+*>R`jgNFjf%iW=@j6IfA^&P*? zzWq8@XWVms({0#33P0y9YrEsE>wN9?FY^pWGJ0%&@Sdxkj0?WveOiXdpnvyA$jbK! z-S~?2%a?Bb^N1ZGuf*e!A$%FqcP+uHF|!l7#mMpo84#*^<{CLZ=2$6$ETfx7tRxNF`% zR7{OcXFu)yK8kV9-4ixORKxMvN!`#Hs?t+?>JP_O5(s-#aeCfUhmu`IfD+ zk0VH=U4I-k8ZnhU`nUW}(F(s0m~~s0aPxaD)fxhH%WgEGYV>m<0{xKn0e6ji5yG&O z|BE$$&l3)k*e?12My=PxO0f>HOlS0HU>+UPdFj@Mxbkab{Dxm=uLGFiq#yx3)L9et zcXkZQ9UB*@!`b!?M@&gRFP%Hl-8HAPXKNDmy-AVqi_kn4Wbw8;Ow_OM#YMW5;6pD81MC_ux65!~wH+iBQ(y?n)3XZuri zM~~5aER|1{Wd=q!Y7Cmv+usMOvgPfu4m<9(C{yK5ZjSeUgPeXCmtKpfI!SKv1e*Sa zEZ40GwvzF~uGd8q`w)3~7DsTgjT(tjbh)a2GwrqcL%_d2)`zC-;<)Vy2rv7*@g|xd zNJ@K*tP3uf5#hYoG_$a4x3B*E^5viW-sR)J`J>CrpZvk)*M9SFTz>zvpIk0K_ziH~ zU{H>_*se(N=mADOQA4@Do!T>(s8Rdm_~7NQ{wJ3|`~0t69)0=g<;^D$YMaWgq`$`R z12?Z7z8OTn$g%UcbQWjq6-Qepk%3SC=I8}6#}0k{bT&hFSbz>fGRJ=!qaT&k#TZx_ zcNmKf_Nkc%wO`4~OlO?i>j|B!f%%k_?GJhgJ{{P;IzG=1kmR8M{sE-OS#~AF&CB`u>yEwjZ9>wuVm(8Y5vpQYLmW{CRECzX`4?js!|#+ z9I!`Ca73E(<)y>YUp!FMU^ZXj=B6K3)73U5SiSY+rWGM_>;?% zmw$YD^VLsj@L$CSDEVJ1#80^jwe7M`I?DRSwyfIMzSOH{`~U(< zp4YD`a4_q|-h4x$wg8%3!0Io3Z4Lw143BYm7XhjBjRy9kJd=*lv^7UNZ^PA=)BU(&xF25__imA*E- zZUdojgJvA5;+?#!hb}-$iZ$e*rA%?WR%<)kv*e*y8|%^vXK~^|F(qMH%F))NhjN9> z<2L1>d*Fi~SNLkt*a5?IE@(WFYLuJiQ$YL>vM850-~dLq@x)+Ebqz~4KPd~u76n^r zg2Ah>W7^^zv&kYj2^qz=tPcF@>sz^R(|tb>#xPso5tnhorq_R_t=snP z)kos!H?bP2^Fgngjh*qd+){2PLpOQk=_h%TGh)tyOZy?7#*4~6s|-I*kaBe(pOI8` z$7frw*!=>&l;;WYb3=%PyVt|oQww_TRJ=^=wKpZv23=@f0bu(k8-D)7qV|5t35_R( zt5w9(s1U?4sqa&NjI}BRu$fbP>I71{g5!8ANV0vj{@rO4*^PZ%k zeVq;u)qhjC!rsR>58}}89cPnULrj~{IpSOB_(elLe!?XQ27Cczc~6MCJ1f<_g z2ayds8TA>IU{G*BWVhW5+ODy9IVN?~P5Dsn^TzEHRlUvcvV3;^0b3K@QC3>P5u*ct z)18myQN#VCUhOHbQJi%oRuOVvvgp<$syx0Mx9xe{-5FCMs!N!hdd*?}nz7?4zSDpFLyTLC{v69BXmMBHx6;5#D~>U{%GP4qE}7^Sj>ThU@!GM2;KX#=qwT zwMl-njcuDVHPOVpYdhJt&bQXPS@()}_M=(OdBmDT{q>bX+NV07u$)*bVz28ZXfxDU z$gUA?-ZtkA9zt+v5xEZe?J160Iy>;V=FBge%9^tD?h(Y~8qh&00-edNP507tgZ; ze=1P@Idl<$ob6{>czJNMBjFN!^R(kN7r@+Uv30?gwOCrOYPPGA_A&j0<+RcFw8UG~ zZy!8AlTZ7LFt^_ob0}opPBwMxI*#@gS2!;?&dt@((B@0@CaHWB-XoLy7M^iDBNcAm z{#|t&@1)*?+{HcP)jz=A@cf6FUL<$pT;Dccc(kn-?(I2@B_YkBd@38&!lO z+vK4!K%JJ()`()VUf;<$lI5#d2oK01Y>6gk@d;zW69kRF8u7N+uSn9FWI8o2y0U3^EGw)G= zpW+;soI5m@e^txH%JOYejayUzt}Y+JTU;3wOJ)~NeuJmy^!m!UQ0MFe&$2$|A12hv zN#+*CwG3RF7ciQql%;jbQt#s9)lV3=S=U^64X8lldL`q&xr4I0Dc|a7IT{bfnfC4^ z_a_YGk9k$(t5>Ww`Pn9;K%HuS5g~By_I$}V7S-l9gnYD93UyZ?rP-U5aO6ABc)suN zbc*fRsV;LdjXD)l*eTf->B~{Mu4KKQZ76Nb0|z=`N;i2SP`^1oNORNz*Z%qi7_SJh zmrmp+T9fSjhDu49!GW|85JC=Rb0S#{GSEvNxD4!_-37ng{MTcAy6YSi(Y^DW zLxC7MPBzJ}K^7gXH&sLZ3|<3!*SETvhJJG~99DkmJv;{2KF;Z|kuzwSSp^qJ1bU&(V2fOt9Xs+jJ1|tzS4EVxdoL>s1TfAj<_o z|8jqgZR)t}x>XlHg=6oj4F}KoFz07HIsPfXe7hm@L=3nE>8*hGEng)`kxnCc@!j>+7&22G_ffk3FZ!_YQwZ_8LXRCVZoiWg9+Qo@^IQeaI zBgnsr(W#r7U)=Zfv&-dYth$_dS}-BrHG=MRY*jPoByGEs05mDCy5bT9Vcxm?fs?2`^KfFUAKicwFpxtAmhvMW~B8WQ%ZLvVji2zKsx-GDt2m&DuiA7AV5fVK(eW zRu|d8G<0ke7ZrPIPnZc}To>rL0)CtT0JN zPoU=?>0Pu>WTnZ%m#?$SkH~a_NN8oUcZX(06Q8` zVObD=ok)%H(eJOby|?*Y_SgqLy%G#QJ&gg}G3Avzf*jR*UY(OA$(L^T?JaX3w+;D0 zT}d0Z^SgY;*>(GP#u4^S(za1Ma#r3WyG+=&%k!Gwai?cJZE`&UJtj^1#v0<05%ec+$C$8STzw>6myFcX7XIIs-U7+dM=!+5Q_D+V;m*zgmrEH-@e z^QeF7ec_T*F8SkTANuW>sf`hgkERs;fX4?7jQDOQ&^3l=iTq*om><}A)kS};wBL^3 zTvwR$+YK2o^9v54PdU~&c1*oAFWqdR=r|$tNQ;H#v%UA_g>Cp-`6LdH1IM<>PilG1 zYukn&dXy195a-A?HWz}Mk^Wq&H|Av-dDmn9KA*AKy4*#;mItgkUw*>)HxARAg1ldP zo`U_xu}R;!8D>u2Uf^qkkfU!-a1NUr!a2IRCR5VcmizLFR}Q%CfdMct+<&hUZ%x-f>S4Kyr|K#41F61EJ<-=wgLXeda?jbSWJ;c_ z@SVJSS_YtR!2>2pliMzF;J2KsKY$1v?@GMx%Jsl z9*ivpsS;#bIL72q>{|7mqLQC}G`2b)`y>adWuy7RVX@qNDV9w?^0E$K#kWX% z%ynFQ1v4-5s#j)c2bq0CzIGJXCpp?A&Q7%*c+sCLHp1!HIn@o0_V0AgYv#83b7>45 z4lPN^)K-fyoi>vPj{0qj-bd-=soa$2cq%%qC zXFP9SjR(2{nC`F-?9`H2I_l)D&e=!4Hm4l6_JZRkzuk9p@ECuBFk0mR?4shZ9b6G# zetvoJul}dY$3OeWtSP^^{OE7}*5$>E-?)7K!~cQ{T)*Bp=6EH&=trWTHI6O)mBVzR z%Gn(*1!t6C=A6@Ekj=|p=_Xk-h2b$a3pEL|T8vGi|Mj_Co7>4NV8_tGd&!!M!XlB> z4TQ!Yh`n&0a(Z0bVvM8&PgSzv@7TMAG*=$BtoB8*$bk2{)kWhC3$oRKhFh{MiArPB z@+lB?-M*W105CL+e|gWGbRCEMIT(2~Cy0jZz0}dP5h zgMa16ciC8<6R?Ga2VctCE8K(jNB`z4UW5Aw{0h_;tWm$bJpJ^CtQCI1eD))5km2rm z((dQ7G$l$VB;{o{%<8L4us0;x-<}{;`)vz9u1}=zyt@VfXTc;LUQ0)Ow=cic%t5*#qrkey7l2@B9?~@@a_TlA*fxk+qFVYVQ(YngMHh&v}GNOJ4c* z4jNWAQg|NjSoqA}4L8d41O38%1upl?7=4T$u;(9JSg$>1le$+y!D$atqXfh%pJ!!) zmPu169H6sP4@hF2$s&-^qXxEuG(S9V1_ZEuB2g2(sydEXh=P$1*u+T?wlv}p%-G#QvpwROJg`aV3r9;aA2 zF`an4#!r3M*949AeXHB<2lnsR-1hf~v!ezY{n02j7Tm8vo$UUqcS7&-yw&}kq(8Sx zbs%Pr=5p|N%)uw)JnF67x=!8^;~<$1K0XBRz@YEB7;qAIan(%`a$4+M5EO;Q;Lz0$ zi*pjgAuMSF>spAVk()bA2Jqjp1o#)8H0489Prjzp->WSV4tWvXiXmn(H~e*H3(`G* zxLD`U4TJ8&F%Rv>J{85E)4eCd%2-atdDh5C7#I7H?TZhmp+d4xyeqH)mwo+)M@=@_6*qUKUyRaA$ z&L;{gl;DL=@3yk-EsNqt(A@nTYuUe*;tNH0EOC^lOBfeV+wX4?{el4M@?Pnkh*zWa ziOFMj(^lH(-ClNmVU7u{IV97U0EX@=#5mb$=l4kdS%%sq}?Yx@_ylK|A4E*bB=PIr?(Ku;#k`HKC;Vfq3byQJJ}{v(iwi6KbLQD z&*j^^<$IGlQjxAAphG?yU?kNo|JY8J=jMp2Cr@0x;kC22Wv@vU$8o3D8~#1zJscZ1 zmF(|fdENrk_;iy&;~#L`Vcfr{El2K1yng48rQ5{9weB`oTVPjewF9b=chmOo8G458 z{630jewWYrGmr4-5Bbgcf}pguUp0?v==f;U=;KNH<*x15x+~2Ywt2kIaqIm)xZfAf zeLB1^Or7q-eMr~$@zchUZ+V-7zHi7pavbot_Uz=ab_uF?==^`Dd z?qqwD1UWAxdZ)Q;-E7jQ#;Z@R^~zOt@4ZvsLD+qxXL#Q=VQb3dE_kZ|Iyxj8(y+^R<(dlf$u3HP;N)9)foI-%;#c^ode1FB`^s%H`U9w` zx_lzP2a|&0voP`pI;u7w*p?y8Cz0v*gwz>dx-PI67o!ll7R(h{4u7)xP2N6bf(KS?j%?Sf#o%&`?Xs!2e8-B` zwH%GbHfDF_`KTRZ1$fx^>I(oL(S|uAOqwTU?2ElUgkqbs(AwVh5fxVVLG9a;HtcpI z`&QD|re(?;BLcXN^4xrl3zKD&UwPrKE@dgby)0lnHJ-vWev~&)@oEc^ z4AONl)=lEix!n}J;ji}4m#Y!QbWNup_E;fb^D}eEY1NgX7Fo&&ADA(q?p`!k6?qn? z#xfaKQg5Doa{0mE`1dZKy!?a9^GARC@)@5OpZ=J5{|NetDPJU^BAPP%VR+=x2gbIV zV@gv8b&ZQcAySY1#GU%c&ZIkxpV`L+7sm{2ko1Ypl79UwC4A)>Lr)YakscocYE1G& z-*sNOAdMSN_u8(jTTSYp8bIDqR)M|$<{w_3{on_eH=q7p+UrB7?drXOah@`>eI%G> z_O-ZP@bM9?wAMDtwueX#AKlnW*wEIgOdnf~zmt9wHB( z|K`yx{mFZA(KUx>TGI~0F5Sp>qXNg>w#H;kYD6n6B1h)%vrhfnXW?kO%vd`Yu|)Gm z1P&rYM?y)@E7iqziVfeoNv86)C5(Z_*v5U})aM(p#Py=2B#|wj&l?Vs($kpS^VFE- zT&!@%GEtj<)tf(4amG;@v|T& zZ~VUS;Raq&TH7v1)_<+%I4=Nt?tv4gz0mPU@T~2O9xvK~Lz1(a zjf3q#)>YX71|aHVU-?!>8u_LKN1X&xfg@9IHPS;d(JYOl6f59XRj<<)8V7mGXHHOb z0wui!jtwFYku-j%am2u5V4b=_WFVBK@Sdq)U3zJ! zUA?3NS9R~4SAO^B&N}875uV)FB151%%4LY|rcwReGh8aZw{P z<4>SITObMMBklu9AI5N5>+1|5S|zhe0_RB7?L`Ot^JV_juN!IULov!3Aa-R(RhyFt z#u8+>MZ~r~a%FOk)rv7HezkS2D?9;kL0!9nW*m5eqfLrDl1iM*N5x;hOwE6z>sH?r zQ|FvcDpZ{ct$jsBaS*H)C3nNbI#T2MJ;&T6J$J3y?t#rN*A+M>?n7qt=lf!-lo3ETkfPwm_bgBukzi$ANqvFc_&XS^c+j9 zFOsFz78cggu_hc@oLI(F|A`L;Wz%Elxm^|q4&!6$u_=fMoN@Td4*5Avdc)n|X*Y#a z+VmC{S*wq>iZ%jcu{`^smS z^tX5$wt4U4oRo|Yg=v?c%`c0BvF)eBoSQhhX5P5c9eDXbi0I(&BYJDD@%Y%CPun6M zjwFK@KcH5<;IS535EOkxeeJC6@*p;-{qWJtHWiw0;-;5p4IF!5riR4HzT;bps~&jclGu}CG{n;-Y|GwjWcz0nFo4(z)^ECT~?_}iYxc2C=ul8gNpwGOijhW}% zTwvTYjvXhwDW;2JuYXqGa^$PuG-*;|k+jG5cHR-$=7ZyD7Ze@a$P?tQv*N2UFX*p= zJD>LTPj|=5?GumZyrj3VUBBx*-j|M7kz;c`S{3Q5T{v=F2*~TF{2f}-_T}xdIyiWN z(|OBtUxyMeMl?9+c6Qv-3;ti?(w|{_uLq>=SDw9UZRuFxeuA4a{brH2I+o$P#%O5d z(+z3xann)%os%-uZ~NfB;~8fDp^tpus)+S(0!nqd6xCfO3P)H zz-i#(jApas~uGIec6OScrX zseE-N=Fl#Dsh8D@kGbY50OG_eate#7!-Jd5Qfim$Cq3o_kdC3xuQPdIqo^2y5a=aXR8Ml9o`=MSzk z*2*A#^{09(JFUoTmF{#&M$>6p$@mlIU}7v;cVB9J1y}sb^FO3hd~td6(Qh(V@UmCs zL9``$vDY?=Eq?I)^fevBvPnPKM6$A9cw7vuzLTh~ejl}4-$x^+w5PO-@jt<(-)ZMZ zt^%mJsjrVL0`aZZ&;IKp*RRGyW9Nch`<&SLs>3=mPCE^XV_YawrjFqz_o74}Nw$^i zIpJ_3ub(89u6+Xvbq{#~bo`k4jKbnMp$Oe9ozi#W;LYWWfBnB*KKb##V1W8}F3&&w z>(GGb2gf44OJcMxqVb-1 z?nC*2Q>pLf)y))8-7!&rIG0RcK{BwpI7WtlZxHcmbo-n(O4AJ%u<$~>W4w~wkIE5g zpYm{wF`2ezy@IA3Cy81>~ z0W3WWwsEQs98CV&bDqXeG-+^K!6d%%&vNp@!(ZuOELoeMI4ZnxKx9&I)>$8L$Nr-i zA6!22H!olOF?i_u@~4+aA5Xj47n1yTGu)lT&wFl;0kx`vip*2H~X<=$E@l(&c$K$ zqP^lreR^_^uU@O$6@$LQ`vo>APx?BidF_g~w({qOjwxboHjllm=WToY+6UkpAFsIc z>M5^WO?T%Awc`zDk9_P8O2_u*H3)s(>r2;P`2w!|`^sNw<%=TusQw4wk^3URYD@I= zI^7e_siVxe(f|NJ07*naR6~`VjQ;f)?5CeUPght4dGzKpd6MVqe;|w#n}W_+E{j-W z9STI>Ol-cX1n2++GjTA18ln_O#FsDO_KAH0GJ{2Kh7LYrhHMr(c=_kagnf9KV5Zan zobnW<^GlsQEc`n-c+rKDbypnwo>Cxk1aWeMQ;h{IHh}lwzNBdN!Vw}rh05ESl>kx0 zCoX4T`KrZ0*fzsKPgaxAYgcToD94enSv-q*#v9`FJ@_pBqEr?(E|spbmdL-hPi^o5;I_rMa^c~S>VVcJnB$HrOG3uGi$CP9l`(nsPw4`L8SitS$$a?57FI93 zLlxQ158g0iT+2H=>KhxBNz#`c`MR&AruK#gSuSM1=beSNBp925jNxS=%sI23$f5w-`J(kRmLLx zi#(uTem&`+s@kWXTWxV%^qSV8x;Z)V4l!a>x9O2aC+iz<5qX26R(?M#B+hW@sI#2wkT_qE=PUPj%RHrZyb72w-ZzH zom8*2MJ@)1z7Rt%6(-A7?^`Csjcbu^QSe8bkjX+~O7)M8C7xD6n&Z4pc zGaeOpQ3C->lcL(Y2bL9QU6o&x$A`tZl2uMR`y)kyy(dnD$Lh*63zPxc)|2eL`EA>- zKbIkx^))8t2QBS?e6ndgmaKzj^Z{a?f^%W{t*TXg+Sq3vYwhXDPIgG5?)aY#e~%My z#-6<0P+li_#$4!QyW?icC7^ z6?~J<)mCK>Ky|t=-D#T>^E>cGyI~&h%S&FnD@bvERDgKZNu%!Qv13ovo!>FJkGFN_ z^5(W_t$Uxe^?o1RufpVsWnf}>6`ZoEqAJ6$VP}+E#^-1H2YhM%n)tfCwY3*>#v`iH$Z=db}XF!<0 zBM@qqAGTlH0THZWvqt;L3tw+07jQiS_o;zj^=^09hQLJcf|qD30c!t58e2$dPJhBp zl?9qe8IosUcUneUdhkLkUX^yaUZjJ;oRCF(UdVQWS8t?$-a0K&#?j&lR- zaB2fmzYAaS)bBp&M^UiNm3tmmgtzRlwaiygISJrAS%Y*C(V?!_)s z&4%LYuIj2|LX-| zvC=IA6rtWVrRIkKDvT=IFrXOAJ`ifn9{nWIdH zM*W_=`lHJykN)N5i`QHLeEjcDzo9-7sOrOz$n#m}_5i)R0i(QLqEf951JO^H&W=sS z*EOM+2BAc8$Cvy4J+TFn8f|pzEl)l1gFp1IeQf)EOz^x;I6A0{`Isn+wCBdnnYtrJ zbSO4-S_ihv4*k*7PA@*ceDKr%5mldFo`3S6Umkt%BlyNqt|e{hCTRHBR>pHT?5ZHB z^G2Vt<3qrn_j#dIbyQOo%&3#?=0$w|izjab@*e_KWB5W|{PGQSGO>?% zV}wtHO`N&UNq(J>D@PtFvJUP&=s#`c&_{nL(b$5dq;B%mCH3u~A}l=M@-lWb*AdV@ zkR8Ct22(=)M$*lLqkE9*VSW0LQ(u|P8zQP)IPzW8I+EnKAj8xr1NE!1Dlf;q;t36& zz53nD^FQZe?+?A!^8xI+)W{ndzPkM2^6Kf2)%uXJZEf6yzjkR**62qQK)xmay*Yd^!P2(0QxuISXz7_D~V@b*+>m$s)@Sd-s3IHk9akVkla zog@n+MGsgV+N)G!^na02$`@|?4!#tY9VhyoV|a9(Dhz#Yd_yNs`4fjqm5*=pc*WX& z+I{rz_YzUo`7HP9D{r`I!|2p5$gF+g_5rWP(G=siw;p-NgZKJ9bq)fad~{T1!B6hb zzj*%Usfq^#`>Wr9AuHsM{{6I-p~m^=)pbIAI7y>|G_UnWn9iCLd>4g)!13aqli<#~ z;bihhWE)&nYC9c#ov@v{;o?iLoI4lPtXOI4b!b?8IXI%<(g6n1ZagcGeAbN~(yL(( z%l0K;9d@8?9R+KL{+lM9ynH52&cXG3altw_*Am82tMdn3v|{9|^XBC7s!;9_v-*LL zJsW@5fpn8b7q~%o<$r_pOH*0~B>&k+FbM-dy>wJ4~LkvAS8V1$ei8-m+uvcZpL~`zA?Q z6Bk334(i6oN%OfYF>qGzYhkD9E?UL)6^PHAFu=&)PEOF84!)~A{k5v&tEP#+9M;%v zXzDZJ>2jc-n=<^7bgeH3P+q5IhYt``^KSAl=)Xn3yww+39{~7>>9IbOzS=Dl+LQJz z((e(rZ9LixouiSr48~FUYUAE$d+4c-k%O@2_~OBNcly~FH6n(;uPSiCtg5Dg$$z?eV0letZ}$nk?P98v5q zJ?}f5<9FxhsNwSQh(G2)|0RR7EN-B6+Th)wwt)S^C!|}GQ8a!^9fk7eiJxadtil&J z87}zX8~1kVDCDgWOH`ZP{+0L6=hyHC_I7#s9-JBX$N$RSo3Bb~o>+X&{LP!Tug>`m z%OaGtyg$2}?6Pyh&dXy?0x=99ZCkYa;IHr89q{gA_<9lI5&7Z;Bx&l7#*;B5jFU$q z$;x2brOmE4G;MrC`~%xhb{LxokV|yYx_0N|iIhBcI_P`Hw2gwSOt2lN%s1?a(HtNQ z9y|?5CN{ouP*s%z2JI4k-F4dpRC4D~`rZDv!SY z#^D4IJ%pVuG2-#&S+83D3GYp8eyGO2L_MD$vAyw>d7z#J-{XllD^Ko9#VUZ_sRnE5qHyzsTw!Dh9m ziciFNquOjzdJf_Zgl=r}(4;$fS`nUcr3R9l)V7UH%02rPeorBlHp!De z*Yc`3ItND9AURC6$ahcBv5Dd#2H8FZGq2grjXn9`%%!;WUC5Pv^FjKP%Hr27(#mT@myefl+lyl%XLjLiChD}~McBay_>2Kw zj9E`OSkOdvi1yO_l7^T`u^ePXYRJ{Z3H)j_mqXbAi>=fGW{5NKYfdivFxB`xjG=miLu+PhFx=EW!gvH4T6pg^+!1@ z-o&4}Tb~{+gG*!~3-$x5%?uBavRt!p^qYumt;t`EJ)X`A)-E2^qTpE>6m z8;lYCv|qt43v2WkEMdhLzG#lK3{PD%Z3`ZP_S2|Vo9sW1|1Sv?UtK#-Ai_~X>;3R$ zY&Vy_`V%e!{(sH$KEeF_&;IE0?9+ey^5T=^u>u zl5*vbZ2MT=1S1}BZ%%El^A(-&^T|K)U*Z23DDoP92`o0A+H_+=E$(23vc zH%5UaN9Z)t4sIcn7UC|Y|E`0#tt|?j&nm_33ET=7y~6r3;tYya^e9a%@v&&)&7@&B zF$o=eXHz1qYHq(AWQsZPqgsHW82egGj|vCh_){{-wmf-{FNRuwzwH~bc0$L+VME?^ ztZf`sq4|2=@8a}5)YXt^hM(qYy3>ro-fbPzCb9blXY?X46! zJ8=**?J;l^TazM44xV$u725ie`u)H@+=XKn<+T@~O7o+it!bQl+cM+g4TUll!2Lt zR@^IVUa=>=6Y}b(PEh%2>j!*`IH?fms{Vmv+nH`@245Z3Y%CX7J+5|79RPHQ3w+39 z!&fXUdfNgOEyy&6dBgtnu{s}qShBSNNwPVsf0Z>pSISOz>dr(P;pTYQs!b>SY(nsy z#GEQN{XqyIf1oR{Hj7%}j9=s#b-nZpItiICxu3ab;A3sHZs5CcxYgF!&A7S zSl73mDoh_3dD9TvHy+QQ##Io{uuZpVET8jJ|M2(d`f&Yw)u<-z?wm^7(ka&}U3qryO5> zJ$N%enHP7&4PLnT!}u79Ri}?Pr+E`q7Z=8LhwmJ5_hL$aDpI%BKKU0qba8%oiIMUi z*_829>tCVjBr*9t=Zwyy>&`o`_DXH=KH?(jQyw2W*7MNEA}O(?Ja)?4*Rp!shOO=F zG)pCQLI(4`ZSV>lcaqR7Ud?mb3~21LjkC>Qp*$*4 z&N(Wy+I3#X7GK5!bzXRnUpTR^?Pkq7LgWt@E#&i1g27l80%nfAINAJL389XkwVRdb z5)D~<(V0Z^E1!XqK%iFIVe;FL?GOj>@5J4ze~CkOYy;{dhp*=S3T2{%iF|y(!XPo< z7dZLR@+mFx2gH2}HI9y)^~D;;_An02@vAa755jHwn7Ux!Hd(kh^#S~*uRb8C_lVPG zxmHWhN7YT94<}nV4D1KCREe^(Q0_!9q)f31p%I-raE zZRZrQN(5pGoMMoYDH{OKxsnji-NgnGxs7RpNzL=j7cJK*8=<~V(&Vc631h|FSfChm zS8d>fah+b48Tm_E^%=8A$Emk}SROxUhPtY!eXO$w^6Hts#S5~8Y5&q|^D-=?m!flY z`zkmrCE{tjQI$<`%?C=i!jW-a+vynLxMQ2EoqhH3vGam&zXxEVAAVTYaJsUezeWtni~X^uI;w5czV186ehm;S0jBFQ2wqp zvAZ!EaI1e61F8L+l$a%ef5!HCa19%9 zs!OT%QRAd`>H{tR$+D!poJE1OFlv)0#FFcSuaM)7(2qC=HIB!sLAL#D@Alg}$)RkE zz<1^l_THax7aCW-J^y{g`KaTJH-#woG3%tp6kzr}2(yi*B^I6I?MK9gd%gcZd+!!w zS$5v{?XK#ouAZ5m8;3KbMnh60b%`xeibV;wY$32?*;1%H39#WnL4Y7I0t9}_OCIu) zw;)e>OJL0*7)OL6j_tlqiat8Qy1x;Tu>L|ZXUs4t$4COM{&~jl04#qwW$-dhc_@J6@3*+nO~YFi z%60=Pkyh|b1f*&+#$pxMK*HzC#70m;VU@QO6+U=XBjK>C1&0!eW2Y^ex%0BDUKoQ` zu`C$Bi)P^!*ZLlPJM}X1aOK<(B1K2cYA>XLpAD%@rEl>}(foy7agJJ?5AL=qxY1qg zDxNX!l#rL9?Qkb}%{5T&1p2PmpK_P>;q`A%`v?2e?%q?=1J|Cwp!Nz|!!X(znX%Bc zf8(|3fX^dO{7_XF2=M3GdIj>%QrguP?FP{=kwX8BJSCIg_dBFbyP@PIPaBOgc{_MU zF8!v(J5Pwrifqu^Te3Qngt+CY=b_xL%*(FR!{>PC%1aC=KQL|WeHePs8sgjz_b;Sw zmP4Zq!$e=Q+HT?atNyYypagCggk8btoy&ajbVJ*K4?DsyT59A?Htgn~@DFtFUR^N1-9<+hKZMHfDrQ?IVG4WZdV`=vc7 zO53DLg7O=$@B??nSYp-B!v}bE*UxkK2NPr07#^${me^JD{qyYtHv($9=(471^eC%p zpIU&4+6+)^1%YGhXC|qHhAzhj^(II z%0?AVT%r9k=vSk_NFDSU6V4e87(bE*6-G%Jqig&PB1g~?McBYVFi)nEiT=4#Mjw2v zgXJCKG)X&v<+?RyV%<9lPgHa6_QT+4flai`N64ulmwpS=MPu7tAVNmd&h3 zqIK9TU*_)yW`?(|J>*)pK^j2i%ddQNAT(!Fm?)i=yuO=sj5!N+QKEQm*0%jDU#6FE zDIdPOq|)%|J5*F%joXexhS!)cp z-Ns*WT%|HzC>VS+i8k=#+>x8VPP~0XTj(3kJ;N#kPDd& zl?X4I-p0ia-Sz7^1AJwCWXGpVS$AdVg3jOt${f0lEGS9rwZMX3;FJ!VHPV_LwEd{> zIM?f=%(Uedhg9X6=;X9TTQ^MOuf;MAtsx-dxRc{ec7_^nM;g0GQ|m=|?bJd0l8$Xn zI6s)zY$lTP#w_e5KTBF}a*=81((qD(Ipl}gn|>y z^`K9MWG!C1#o)UR0E;>gQY7k_DgX0Ax37?DVB8Opha<`wi?2`Q>7D^6MQtIQz=VMk zu#ZK#%M$C4So;W*r%M8BIo?XzHA$^0h;dU~JsX4~c)+7SWiA_fw;H-F|7#)gSTZN7 z+ED@~V+{iq^|rbP7pAmVA5>&dPMIVgQ z&@FoKrA;LheaX9lUq+=&dQct`P>`bVO6I~ZnFKj@FR($kajH6FOm3Rxf-UPJh_Sj0V^fGxHmi}$!+HT`zOfBJfi%8-Xv-;1 zjY|W*bwa*g*D9v)35m4)IYD_Xrn1^iALi{ge1yCV%0m%p8!;;an6_ z^Ot>7n(3A(E|_De_EhG)jZgZNM@+wxA)2X}DBUDKxF+QsQ)8Cv_Vqfk5M``&u z)%EA5h#~s_TueJ6ercUmB^x<0kCK4heJUwK0+sn%g zgF}Dt6&Spn50IvK4tn#bjx5?XXAz8P$__a+Q%@;KL)6NvU;DOjrllpUeq9*j5SE-i zpdD=kgWvj!LD{rL*;<~$Rk?hm-@)?2B2K1gnlyM5iFOE|0jTVu?6|Hxv6~3e3<8>-9?(Wd)7H)d#H^p7BmKw|lBFd@*wgQ-6W;@Rb&_=n zP_ij=4y>uM3CSjoEklCw5B%U!*S=TODIi$a`A*O9fdB^nSqEZoPNcH061mk)WS4_1 zjM9h6ha<3|ZiHY_iLcNGPaVtGMjS##&jWvb^9aY}*RvS|B(T!2w6#e1m4_%!>_ps8 z4xf1w_1Ph96W@Mw*DTx~sX#O*$~dP16O{d5epkxgVLEiO#98R)hh*q~6h zfaffLs&8=s=z5Oi4SoYqG0P-0sAyDFK^Y?p1_|(Qy*dlzq9*-Q0jSUBk|qv;YH&BY z;=sVPG%hyF`Je^fs_~15QZ@mdY2V-|{moX|BprlX~R^TZH7l7hhV7)|kHY)jye@ z`+xtZ>FD5v>6>4Car!&|$$vII`~!b)x_a$>Is$^mS=;rHS^bpXq~CwhVb~wGB}2td zhwmh)%VslVa2V~IyA;v6bSA z$>Hz~7Ex?Y@&sU32{Ugg%i((;GB$LdAok9h_`YKne`SOEZfS4nvt6-_HRc!>+Ln3c z8RlGVY77Jh&!t7enU!%~Z6OWX$%!R=MNwYb-e{I(=pZk{X8+cQ(kMpnN|3WMVY6a3 zbJ;92pD|E~QZIANJXSf$-6qU%3z&?5wit$5^7j%JIL$8qj=3YWDng` z0z)}%nAnuqcacBfA`1ZmA0G)|fNIP{B@moH*7R;V3z_dV8NHDye~P9LEQpl2Fgh=Y z41l#Yw-r$4P^gp#T1UCgwg~22WZSIiFWA9!?nrj`!Mfb+<7iEVwiRH6d2VeYi8sr_Nj(RqQ6~J$|GK zjxuzt2Ikex>k8LvcM9G9Yw^M-EML}{)@J@`SLYzCn~V9tS_l8&FeZ8!Ms;AU@ZwS2 z0wU5L%1oTGhFv*Cr!C!-6tC=DwuaWoCo$4h*X>a@ux$CMLm6Rc19mcfUA`_37+?Nt z#~3Z78@Ksf6h~(SEq#e;7w;leNBe!LV7WKyX)}7ThNB`I%ltU%l7?w{JLYA*nsu=F zNMOSnOhO!y|nMh&tpocqmG9tv;{J6;|;SOqT3Z~ z6MwXM2>L}u<`3#gR={s_;XN13wz0nTU&f~M8TE6X@}<8n%RAjP&2I*EbC1Eg(wAP9 zwE?B{$5ZY^ce7Fb?U#<1`a{_yMoAiENDm8!4|EuF!qbx#Yk7C05RQ9}MK{?<@lY(o z4*4rca+UXEo#I!{-I2+$C}QU;bc)uBw|D)=%;8bPqB6P>T(nDm>D8xbcRu!0D(c&o z#uU)5j75y!ZaU>qjE2rQ?R*rFbv$JYoe^slNBTnr88*a{v0**=ujr0sK*qjOAjvo= zo!r0^RnfsehdKeMGaw!9WtK6?vdFp8BeGcMJVRaUCw!-O+0@!$@dL!510Tm?=zADz z5Vt?-q)StPT}saQgn;NlY1Yz5@e|sEOIbiwZ!M&6QkG(2#pWyPG}jDW0 zV}JA2;>u!~wjq&ni_B`nZ7!yLiqONH(uImLH3YoYE}Zx_PRZzwT@+To^BNp*vobX% zpG{=5{giG8z%x=~>pYHB|sjgW%{po=W9(v%Q*>Tb8oA*N~S z!b{)?VU&yoMRxEjnU$mJmvZ{5wp=e*X9Ynw&_)ekrQ^F_L!&{Cg#Ald zS1sW+PS)TEDJ`FbvafciwTk>AlABAZH!qa8r?GV&{reEg8cA4hoVHgE85lH(?M0>Z zJ0!KiU(k$OR4QleI~#P!3@!VrHpqb&`M^QnaVcr&v`n_O<3rk5x-AxI`;oslri`Ym zO39#(Am+;&)vlGdTDuWbt55n{)n-f0VN=MIy2Yr*!77xpHy}II8{*0k+ykiQC@XBc z5=`!n-99z#nBtPlM)LKaf=DmFM^@mW7rUdAGG%^4Q0>r%dnT^5&!w`}JQb%i_!?kPSep7!#93-r)3q29uIy8oC zM8>p1y@L)hbqbyO3XD7qM!ucI;LRQO)f$~m>#MdERH=(R$PgrLPod?8M1!Vz%Qb@) zKB2#Z@C90UrNIg&PkJMV!Gkv2EAm?Q|BahSM+c?vNRNlFSxYV5vR6!^*V&cvLJNRPPQjB z_4nLV1&nJe-=w1&&eyg7CO>?IJDhylKDxu`l6P=0*PsP$<7iBP|E25W2|$qqSBF%P zPnz#I0>w3%c|vUS7raJu;LQLXPnUqg7`c$wK)cX{Wjij$6sh^iTbwX9HRs7h3hLw| z*BIFH+XU$M-A;0VP!O*f2%MZ-d#DHK~_u zU{byKg2KQ}y)z8?mU2_qmZdl}8E^>NEKc0T#OAxaa7VjXw~(n}M2%C8LDl?vD9wUv z#ko4IW4voQbUQkDWBS_f{nP1R|MvgRW6V3#Lwnqf^6+ERLr?we^fSNoPuSq`u5EPI zu9_B{(z|S?Y)dK>svwq$=bE-}R(28`_sTpR$=g_5Svh%8yPLY0@4+ z5A*PqUkd|}7x~_4?F<;N0LK-HS-inKqKS=Pf4TunlzNg4h1Vj7O2=mSTC$3ZkNs?GJPALBcJg% zwCGPRhK9{8%DMr3Hz^K=f7&b*C5)&t%kL0IUiBDhBlWczoWka2qhiT(N#>oVl}kTx zeDqK+Q|1sh_9yKHo@1pKME;<=mepr+p*djHQ@ITmjb!ru75%ImfTb_(G3Unxl!ts! zIKj7@PXF$oPw@2tft#kLg)`nv-;%do2b}YkX?a&XvJE=DjN2{R z_pIxWWU>LFz3e?O@;4-0UG^)%-0TrPa4zJ5CC7MZ8EpZM-dc3DHXBV5PN`f6;x#LeLcQG*_VT3cP`JX!CfbmLgSxq(WXjwI zdoS=#Pi{hQpF3Iky}m83Il=+jkz3tLPAXC-6H1_`4dn&zF?R-JfKelm#PcQe1#VOh5< zU#5lWyzZuNM|||oxKDljk-~(1pxd8s8gF`q}INF5Jq9 zni)D7)hMsfx-a8pdg-5*_op_WR{1VJFK%8PE2n>@4zZg<+QY}NY+nHLgtYZgtT#+feUgx>*hKj=_7o3+efqv{SZaCJE!2DlLq&m@b9vw> zcB9qRd97=Z*}V+Plx5Q%OMB|eollIEiIHiGyTHrFtQWR+nA7SejWzg1dnly`OWMIT z)J;s8A%Zy8Rv5yp1^KkYB2In7VRwYjycAu)bfd`O5DsikjWwP*^|wxWMr_`((^xuH z&)n;}kg&%h=`!zK^)H8;O4+a(f19rDN}aU%Qv=7qZ1xUiFjqE@jopaT3K=KB>o!s9 z4xTkbF6|S)lPU$;BRokrOon$da2`7^T9 zMs-;bAQ`(4m-TM#n^BL6cEE9?H_jGeLEi|G*E;>(zGCBykUF!_SAN%^iZFhaH#e&x zN_=0L`H$a}FFPJH>rzg|O;7ha*>HvW;1%H&JYsSIi+tP^i?0Tro)iw4|i3e^_SQ zF8Stlaxv1_L=|`hKtmv7&dlF6jg-oSX`jR8;&`@jkIIJ7Sr)QvLn{XKaPY4v4qhCqr4 zVW0LbB+|-t5##WJgkt*gzPF zb)S=#<;pbFO?y;5gstwt)q8wFA+41l(suK`V;A}y{w43UvK-)?3ves$ZY_hx zz!g6?4gp`yNbh4WKO~s&vKC=snzu?~lRWvS9TgmHy^cNMcdGqaJ@q@mXxdF5>^Vn$ zwSC414OG-)G;J8)@)t4u(MRI6eV{mXV<7Z5G_z)=+CxBJwSNqgymg8}__A9@HX%!_ zkj{o&EFv=ljz&!u3bDA{Am%F}k|K>oXi^lak~msSBB4lt6h*WRUk}r2cQi!aIDmd;t@=u9Qd=jb(r7vOAD` zm#SxlpYP{M>42r3MYnQaAu zsndc^o3t-zRRKd%IIpXxhD!aOf zY`!&SI-xk$Wg?knD5)YqCvS-XUJK@>U3TiK=GNNH0t%-eYnLiS{%BpO%XAYvCtfon z^_>r2L~?vf-{)$mCA7}IprjVsH{#=ID2XT&5!D{{xBxlEK;k$%I(vB-VLx`0J-$xe zP$TqK>FV?HzMmm_%9D-N_Bt0^m@{%z|I@~!oolrevD8~s;T?(87qC*;Je9&E*bXc# zPP2hq7eV@Q(Pw@XkKlqu+hkQ1Y}?jl@1PSX7CXb<7JHLY#3Jp}b&}G?=Y^DyI%Si; z`&ynTpwtThIZ~Db0DRwg^WbkY-!Q(W(sVxaVIedrD|=U3$z9AUVtvlj zWLAkbEt?tNOFH8M?W#@1%PT~r<>n*~yS2qKns}QF>r=||M%I8St42$_lzS!=D+OVznwv&~c?_S4TW z3Wm3}eZtLgvtAv7#gJd$chl7;u2ju_sV#JvTv$-Ht>VD>v~CX5A{e&PzERcX~SIcCKcON zUsE0HPrM_NCyII;3alM5fta*#<#$q}4ErSo=~^?*&~hXA-86)`HQi;^CRN|*j%!mK z%ctGs>%Vzo1g^1}4E9L-=(7u65e0YDCWfWmO}DK#%Qx$mxSd|crkCLs8J3mjq?hpW zPEco(@q7DlUgJ8DQMuZbxb=<6MF5!pWoY`}ZM>v;QF@kt17KPHPSTBYUc4;J9o+El zvRuLI-02tiGJl#(yJ~7n%7(=F%DfQ@jkcGnnC^V1m+_{rcE01lF6bA(mQJ-;G62rD_E93Lij=$DP%cqqJZj0Bvx;F2;JQ~04 ztSoNsMJaTyS5TtY&{=)$a8QoTHf`Ve+nhi~r!Z{(vur4D zI`p!^R%_?5A9f>(TobRnvb|32`^+<5i`XV0lc-2r#vaO)x{|-OUD0z%i-txD;C zuEqL*1S^J?8~5Jm<}4Pwl2#hmX>Qc*WsQ<AA5U*BEkG z+8gVwqt{vLlGpVCue^@W>S9_0N!3H6u(F;Kaan#=5_n zs^VBS4Cva|!VRjOKnf4OqL*~xD}4!SZ*8K{wX=Wu2fp!A28bxq&pDN8_2Hv2Y>&{P zTw2;R2t;jn^)@3)>d6Wddq|wQy=+wWDBG1>>Mo9U?fxA)I9_N`S3V0oJho16PG>h? zpx)zA#9#c^dPH>Z70{WRf4R@yTd1bP2Vqig->zeXw%tGD6|?x`_S+rbR(l& zRC$221HA2A>v!-e7cUUNX$#ZUkCfFifq;}Tutw4}SY;|$R#+fCX~9T2x*l)MpSbQX zy3TiuAOepzpxm)0W{@w%VX56n#Q*gxS!jR$e3hlPa=b~OqSBgr>FA&ZdgMv$mwA~6 zIKHRf@K5j?9#mz18ztd^V8?x3NPX?i7sh4V0y$3Dl!*K~6aVf}q;EmTaYO3*WPFF% zGJ{r9*IMVmAHd*h69E8gTMH-ef;SUO2o>0VePn*4uhijs9$v}^VcR~Ja@55R#L_Cu zh7}~s1|F`Q?_lYqBckdubeVWmW9TPCA}; zvF~aRlA>pBEDGvUd8(@337CQ0gIe{mJL@;9!2G)VidoEG9zr+ zC2p?%4MoDVV^w|zi(LAUP7#V?IK$9x=yhVbXIdI3^~F#AIb3G1B>ql;z8e@{{Z3)8 zC8`uMB(kowz#vTxLj~f@MeZNhSUGSQ8;x3?5GdM_quBNd*lN(Z(VN#6Xs!~Df z5anAu2hVKCQZRbqvoZlWwNQez>Q-#WPbBsf>X zYcQ`!oI!7`{DO>)65cV6k`rRMlCdTdT)!HDobn+<$`@bW4WlQt+(HXnd0aQ6v+`Drwew>8F6~mZ#2+0~A_rk%1dxStwC2HO@HbuI+*!e`Occg3wHzmmTOlSWGq%s`$&!*BrG} zR@nq48LS$28J8V|(f5^aPylG)F2V069RXH!MTwmq#EQY)Q2E}#&~BMH9jujmHi5Ex zSwpEW;I`a$^|YvMSG55V+Y4apT?l6SF>mO&avG=Tut+^Q_$I%ladUd$$&XAoUw>hG z<*T2ab{>3udhC54$K|i&ZkQ7%pFt=rNITY46YCdnM{v7PE@H=+=LC{>M?1qZfnDd^ezQ+AVpdLm$G+bU&SKwgTe(GxhK43o+1=tjkbj}XD(eJH(SAvXl zRbT!YA%IbxtTMm-)FOnmFv9Ye3*!uM z0=b50O5_Q)fxV`2E@N9)3>2h(uq}GSH>@a$3oI8K)D3aNLzi~!&s~XQ{LW^oa0~Lq zs*g{*w+Vs7pB>G4a^#>hcc^=^zAqKEjwlGzadXa*D{tK z%lWC(#+&KQyi`&KY%atXvE}+gUQv~mF0TUdii0xmEWON?HXwB%Xd)f5%G^M-$TgLB zOPcl$+YZD0BU?I{neDC3$7gx?vX;h%`eOFe^-}-c6KIRPX3TM$OB8=!TgUV;&;vbf=Ccxcsw6s>9k+Y}P*`+0J_3*Y z*%4NW4}$`p?ON-8Q}FbgtG3FCitLslfBT1Z6sJF=K7K$vMW-?8PLR)2lFy|v35CVA|l-d&eDYqVG9IS)^yVVP?) zV?Jm{_h5XUGo{B|v4K=2qBN>%E#p#G3C6D8vyj3rrnvE@|gqqM~k4_%Ft5?upTS?pL<^LLk3 zdub@FI zkclxvGb&B(xuiCBv#|7Vd{}RT7!=T1PwKrEG2})zcPWw01Epg={wcd}kn!m~*E`DR z%_BM7=r+z84kGEdnwSGhXkDg#&N%6EtIW1^9?&}>k-VJE)6}tta;b0WAX1tuzs;mV08QEUK@#8Jl+)e3Y3Zu185z6*-CBk5^W0tXtNTITQ$=FA9lc15%Cv*|MfMH#tKf zx}u0a965*#+FjuhBRnljj~?}sH#BXB)z}CD>FKnq?WMd(q8QevB+1yy{p!>aXE(|* z0>C_(BSP@;8~fNX>#plxpLX}Qr^Czdh1WyDk$%en!kvRYAVTzl2MVfJq#{yASylV-&})4cy*AeT;(Xeh?W+!YVNy& z5R^HuCvEKS#zkEa+!GpHbUI|3{ZTOS6KMOB{ z_Ve7Y4TSi73CIbe~Gp6pc5NZ zDfTVf1theRDq6~$Mobo3w1w4h2q*QUF&+1+#8P03ad;|S6bf$X7=Hl4xsu}eO36ru zV7lpv?39}!m>TPBD{Wy$3YO|`2J_n2zTizIs;wO}R|BtX+R|WaYaMkoZE^Wu)dq+! zSs98uumCz{XCH;Mc-ldsLfIsL)!wF7IH0ZQNjQoGi>?B`^yGx#y`Ga-)-Zv0&4ArO zalY1Hb^{MBeMp6&k+D7X$|@~D2adhgOvvF3XNt{fdDrV4TM0v{$gyfs?hMS9R z7(__O)AuSUdEwKF)y`T*d`HWoS~BIj)G}m0^=$}rifk40QxqBNl+VTwk80C~5V<&Up184O&B-JTx#(bDKX8@%q`O^ld7oFIw#b!HCn)Sl~1dG6B_Q zx`vq2vta;|aR$hm_$*SkP!p2BGP)&lOb0b%d1#j$;uU~2ltJABm~^Fzw-r^l)N6*I zPQ=kRfUIZ@f(?34apTU)-4pix0G9LBN1mP@{qWCD-}>|4oUR|h!mM z=^sp&FF&AFfr`?YpgO+1S1oZn`K`n5w6%U+c5A(*^4*6FV9J*bOL#cD=(u+il!-o7 z?Ms>ghwdHS%4Zn>+WDe72;%6s@S8nxjA%ZF9BT|&&J`iPg!M8`2yvIPo=a>U-vQZn z`L0P`$m?z^Zl{xVNLdlGnqU-&owcZj){3!YMZ;!h?8^p6otXx?)kK`?wXfL48Ia&B z&ThQ+(sb$QZHDTv;qNzj_dDYQ|c#e*|nqCc735%RwQp7Hc)j#k4dKIyW&$G z(^xzQFAUu{@wZ(3HR4?VhyYYf;A%9nzn7@-?3guQ*LRaMby# zK`&@UsbIrt*Me0a!!m9iJC6N<>)7&6dx+%*iuusBO{mWwY0GZeoRwjRI6pG^uU$k@ z|NP-^$nC|32T9V(hHNf$9NYP+axVsGmy848Ycu`t(xDVQ@FS+|*xw)+b&!b-X=XzC zYt|c-r++GgH33k5?dV}=>1Mg>Te9(=(%rV9e9bnM*N;-3!%=9Y38d+^9{jZ#KG`;N zQTR1icBTUTwfv`^RL44HtoDE$YJb5Ii)vxXy8>s;|hn)PiB;KWgw zFUF)S2!v<+$hc{m;`rl`Erdf;#0smiW#nT(@G!fZd0Sh&35hZ{bF?eeqi<{gO6Df| zz|w}M`{Vf4>5SJS@1bWO{<(Hq;x~>GDUS8>c9cKzJ${rbw_4~QNVIPEF~%<208rq| zj!Ek~5Y^hoCNhgaG*6MEudfD;>_a~3na}*Yu&L`wmp|F$VnODsy0*My$|v-t>co|x zobpq0bx?lg09V=rj%?pls1Y2KmoqS^UiN@yaM;lyt%0)s&H< zX}R&cT9*RF;Q@3}&P#STM}_y#^^f~vc0II(9HjvHJCtD~EKIXrqKKo@xT$TGtuRfZ zlc{r&rJzC`qLfUk>1MGa%SYbo={neJk@OE~=?4l7jE7JrUH{srddi>|28O8CZe+ocUM`goF4tc&PKeirzil616gK#B zMp9t|j+_dYJh0=n(!yp_*aHRpcYD4tv8HrYuGpoDLSHhHGqg0RARpUP3YYW^+uS!s zIDUH%RoTaOueJ{jh_qVbiLLS(>yRneTN;C)o_kk!rqj2+Jzcu`;B@JM2h%pGjZ8x# zeFI8sVd$T-W*AA~3An>xc!zy5kw)RNg%VK#l96B z3Ftfg<#!$tT$cA_(TU~EVWyi-Z>*{7In4qe>Z1!)s7P8!1RH)sHlg+jtP`%FszxL{8)QrErz@$;$J9^a>5EX1 zMz6y{QO3xot_HKph63gy)MW}83WBS=Ng$?6l3FXs6@K=u5K%XHkxBoctmLpgM|*%@ zwhW8mi~1Agu(gjI3yZ$F;bVxDzUr9I$$f5Akzt7$-pX%5VsJ(-B3q>$dhSSdAt<1g zz!5v41AM}v*ft$9*OTBmhD1=>Uw`vYjJUMA(iYAE`m~=A;ae!l8hXAqo5MelP5X*$ z=iB(+3LKHF2SR!RlDEJ4mLKgGV>t;Zlhw#2PK9BdkqZ%l3UWmHdsYbeD6OcUqJ!(J zGuAPeVdf1Te1m1%QBR|~9?Be~Jt?;@_}yij*%qa2(o)A~OVpXm?;YeMJrJLLh@i$8T|`->b+)H&Q~L2)yL&^JfQ? zdH2Qnp&LynGE_&GM>S&V6+1kYzTwoULUl5mLqI?yU>RP%b&-`S2%w+xV!+5`3_NW> zIryYqnAXPEz=5tLBSXUrJ3>(!yhmB!#an?@jl2ep6p)XM;XM;10iw7Oa+J@}ifGBL z@0R1NYG&ZSR0-Q~ckjXJuYcknPtShl$?5vb&rOH>hto43`y12yKk|1N>~(a5_8Hm| z#fGufromEEDE%!O#kNuVUsv6aSWlEeXxqMIExBV*)FD%Rm~7g&3Wux$Nv-;6_e(+6 z!dU5?*$=Z!*`s<>3Vlz%Q9wV{x7O(Vn~+(UC4EyeP&J;R*yU}9liPTboJV!JpH$qNhx=iFr3m#WBev9-!X2~ zsNNhc77`eETPh|qY{oOEhI*AHqbT@ySPOcfJar*p$dL2R>~6brAh|kZoUMU zt@g}CBC!`?xr@=3fMFKBAqF%&^;>Upaxck+RW@57{u0bVz|u{pp}xzEZvYGx8QS?=48-8vm`3AX;x1|zz-f3|(AL~2L@3d-{*cU5VpMx^ZMxIWSc(k#&w*+KTtR6qJ zK1W|)H)3B^_LLECdp99%Pcj!Czw9ail4YWxSa_Plg~|@U?_*+O9UVcs6Nm zu!OWgXNY6;L@CU~3y#;9`s4^p`kh|JcaxS>!!_Ntc!(DHmuY}nr-Oro>DgzW<);RA zrw@Pl!|5;5=z7~B0sLAcRv%Fl*U}BQjPE90G$HEPu1#Yn*Glx`;>b7tO#joQ9n`mV z?({{mzS{nJyYzYZOMa%+Y4cOQTK4c}lfD5!IEF`50|)zQx8a^e!!c7$jj3q2aQEVj zSH5L&(0y9n{a_UBBK*=G6eXmbRL2%B(<0McF=rXL39fu7c14)BnfXq~e)Q?K@+tkwHnj<-+}g0pvQ`-BE;H7S znx_L`rt3Gycb`(X zEsH;e%+s0DF|;~q$A|^JtOeZ=6pT-Md*oio9s$Oe_^ySdZ!og&nK#{C#0^>JV(xXP zjxiY+O`AEFI?LoIFC}sfm&;)L9_h#c!N@L5qfEs+)i_ImZFpc5_(=g zc&O*^iD!dUI>5j{g5fiA;ir7kaFmhXHVHTAA&ubqHYpOd?$=H$NUAr2gq*c1l*C0tTKaW_!HBu;pimv+TS2h^Jp|TP z#`!cwyovstK1kIi)?_EU@0+H_AE&LZ22@%GeW*m0zy&h59fGkgN0!9&)5g@Ny(X7h zUjrorglZ|Q(eBXSbovnqR7sue?4SCZI}WyCZqgE%AZ`0X4!Zz!DzvKByk3i;6S!s9 zl4aISWt9^ZB`F8f~At24Vn4hTc#_(N(fAPfxT1Pq$CrETPR zqO2{ahxxeE7*Dcds>20&K&Sjt#vr4&eP0=@Gv&XBGtx^PaNWagGsS88wu^0$Yi{JS z?d_W#tatRxlTOsRzwZOH@=|tV$D}GSNy)&kJ~{LPK%N>Q)FYFiC3omZi;#L`N?Q_3 z&iO)}EDN*X4`TF(hE45E%z7;&O3|}QdWw=hNt?%>g7Qf{U)n8m1SNI&XCA!J4#f-^ zMI5|A)9N}rAG8Xzl%i4}k)O2W;bp4EuYD26#o}QP7j_#X+uyXgIJ#xYUV6z7u-MV^ z^Wu|+aoM@rOUN`Abqb%$X#kvCl+ku8>e4E{&8x;EffnTg zV{1njF{P6=k2k6Yv0!U|(KLUfL&Ua`gEIKm8YftDT6sFeryL-ptZ~9YTVg%nY**vV zuh5ML+9uS?rhkvuz7T!`-b%UHF3O)Zs(BCNU{`x>l=By!iaG zT_sL6DipO-oJx6YAn2sWRh{h1@w%auNlM~bCh!QPXC5S~jYf%R(PxGTlAR!J2xg_1 zP|a)5FATodX)J5M@6xDn^`R%GpZMGVDZa?0PdjYyJb(%@a&%eQ*Ny^0t7ja$4XvDM zX!pR-wsD(LFOB;i(!T9=w6%Zd@QFMyuR7!tMqi>VW8LsqeI>r8%zlP`^osbjlePZ6 z3a!&9gRZX+=+eL~jNk~sC2A%UF-r0kwSRL`W!&6ordF*M)=E~S zRYn^DufOV>7lqMzcdtG=on3o!I(hxs>GD$_n@(Q+8n3v!!r1x5w6%K;vU)|4O=6Jj zHdTg9EX0mYX+y^-%K_SEQp(-EA~o-coJx{Odb@%lDTU zmCk|`zZX{*&7vNf%~SH0NBluEu=W~Aga!I_ zy%lAhz+Xge$Y2}Kaz^=)BZ}O>siq#OLEDyVB5K0{A6V0vvM%Z*P|8#MjzZcKWDoLO zT)G*PjTiE6h)CCAE>CGurmxDgE^J*3rxjN#0_waNb(6{QG8aoWy|h5i!W63I|L740 zQU9*whh&0i($uZI0pH(;%)ktfNTl1xpU9zD`kc4}zciDtL{?#$H{JP8ciu)RUo9A^ z9B22`wNM?p$is~`5A}py9{kM*eBhYwr~Xbj39G07Jor22^0Pr(0F9u1IxN#& z)-h5;#CCQJFjuw`TRT*s&OvTPve9RlhTXK?X8xA8ux;>H|NOnmOS%3k-qi5tbwcSI z9xYN!hTO{Tr|q{)w_Uq#Gj3dC!$t96m#B4JmfbGBgpZFfP^w#PCZUjamj7&TsI{IH zr;RA84V{k`g+A_ImNf7pLF)t>2nH{pn9nAN=44 zr~mj@e|7p0al<;#goGs~BsKa`+1v5~!MG4l9C;D4@j@(&GSM9%Ae{MHqnLmD`rADH zQs&zo;Y4 z{w)2q$CAx5VV7l%ivXcxybS8mpV=QB5BPKb%~R5jlbvVYajXF?pT42RMrt~-r?>(U z&e#{ATT$=zc#Z8XgE;4fWqH!Vq1&=tJmpGxh;)6~%%ax6ZPNBx+HaZmEfby3VH)kR zeh|3&O+cRrZrJcqyD^5in9+Vd>8=mCASpeVW5!^e{)b+cx9v@rj+PDEs5`+Z8*-S? zIo8cx5AB>+!;+}62#MP4k{sJK&L9q@`$x>d$afid$9L%|qlalt zS8Vxf@AOF96WBb3Vkvp)MbhY3V|Vmc5C0*M!xi(I1bGeiA=iwxaXS2lI(Sv&L0G zDqQy(q^AyBK4L{iPj-3`Zy5v=HJi)C(kkDljD&qaHZ|m^!6Lw0S+bXaJ+l8!K{QTm zS?TKU_V&i25Vn==J-3a76yy$JDSx2ho6U6jNyCOw${0f1zyUycTAiDZ&?~!svh>X$ z{3%Hctz0&+{a%BaWS`M}P>a1Zwn!J%wDM{DYbV=^Xb!9Wzfg=ER?4qdk=m%PNf@>W ze5G+s6C{S7G25{W_2Ky12RgbU3)&Fs;{BwCh1okZRAwOqLI}p zf@Pbh+`P4AW5FtCYT&_V7vnK-VX{JIxacas^2#k(O zu$P&tQQ!4DX?TPuF>lQc34PgdNCj-O&>yr;Pj}e!dt$ormEWFTeRF?$@&k`ghu`_u zboR)5rppgLJl%w#ug4D|8_Z@R%4s?Np(T|o>k``$*z_gJl}lmHUi|EIbmNQD@rT|s zU3$+C20#93A7lJ;ZEGJnf^ZJ@L38YgD??Hq=7VT7^d^xxE-UP?0@8YDise&Gj3#OK z5*o3^=0NQdbv{+Bt=z=-6M4f)-a`*~L`(IM$0(OK|4Nl0$9|&Nm1lm-j95PmOuj}r zLMo@SSbt0hOOp;jiqNa1@c_Cb9@d4$cAYGi_^ocw75hxfdtMM0%Qoi;5z z=|jMA!giel@-DLWed(%%hcI(rr>ysPj9s((|>XR zOSywnaJ(sqtoF`+ns!AGuN7@GsU{e~!!M)E`^wYxmZg@j5h5Guo)_fPWO{6nmXF}L z!n4h)UYWv-npNoeIqgcl^5uF_DKNONvfM#W4@o7a?&*IREBoFUAlhme`y>KM!!ci5 z0ObE1n%`VNqT08lv}M$To^4Ii5mK7cjcCOGp4CEO9yS8NZK^rt_%NQVmC4 zhr%nIRUP`w^coTz|JC2v1_h>gTjgq79#lF~(JNQ9DVybz-pI=%@>sSCO?RfP}!!nwgo>Z?+wE3!UZmQnpTA7w|xCK^Qm7T3O zI2|lQnqpb7OnXa_@TY9}yz^@AJC38&M}?!(jW<9~%Q)K^`cFVB)p(%|JzALOXZ z8DvAW;17RbE2U(oKRBk}ZK!dzY$Hy;W>Pz-x0}4PeTE%`tML!{`OAW3F0*b$PuLbm zn<|+&W!co`t87WRxc2G6t7sLycrfMJjIdup?8FIlLtSZgn>B~E{?~=Xt=ppLdz#cP zt=ZcPX$dA?U~F0F0GE(uV4&ZV_ux=>B4MneKd-8TTiP=rM2P;u_l4xhdxX zAG;;-X%AW4VDr_99_aPq-+b_AIUB7h=YZw4*Iu9g#lQH!rdM8hIkcpg3+}|wfoC=l zBWu;cc*t$M(xK&6j}A{f@x=63{_2lUdwaFcYriqhpYg^=+}<3tZkg`GKgR(V!CvUQ zSz0uFqC$FDJ@pXM_}=6)4$o?%jBz-dPr?=aQV;pJE^YsgV~e4GrwEjLsftjFa$Kx(`3X*-+mbZoBO9V`g?V15H|#*=PcJLOO}Dk5irM+f!T{CLRo zna_M?dh^XUZ>f{d629}shPKOQI+c7W>yQ5Ek4{fN{q(GR*BPtdg~2-ScFn-NYMU}} zum@`C1hKSDY>;*We?foAtJB8IPpFQv+oq}P%{FZyPmBRqXM}M$(b5gSx^d&i^x4mT zcKY>S|Mlsux854H6ZZL$=~sT`SElzp^;Bf(IZbWwSm**8zpr(i=FsnvAo0zcH>bnH z!yJ+yafts0?dZ5H%xkZ`I=%h&^|aF)Z@e-6!5{qo%y%>Kv7h*f>6d=-7pDgvI zI6OFtyjOebuqiyh;6xgu0tv#z_lgu%1XtZlGD}{NUR8n0Pr?o}(y^1b>>*?C{C5nOt?9urAA zzHZ)atqe(&0g`pEajj{gBshE>4Sdr?-85Fc*`Ls`7kk~{ftc6C51~(Xox;W*@6AYz zDNK_4Fx>}1Y7YCBxjCu5d%X=B4RvXHkX=)Cw8@l*D8Zr0V0%Swm62EYfg^2-y;DUrksI|AaR8sEJAqPIx``eA$ zFt#GEF3MsYa8U@7l6K0{NMr!aVKmu$&$UVu8UW2Kz~_8fAH};4 zUZDChIIrjnX$ys(1L?6yXge#Tzd5&^&0wkl(T)0A*lXQ>(p9$d&~|&AntIUcEGW{F zi|mGkqa0gOqD_av=X&7`!6%c0hX{Ziqq1ogWE~iU9^4Ok2d!?=POogGt@TsgBTu23i(`XfCy z!pj%1t(-*LoA}w4{pY6Zr#~`nU43sUBsuV+8_8TtSTyYAZ8Z#c2~`GUI!%>1&Sb1B zvEswZqRmrhAGCcbw5=_3RB>HmxqC;)w4aA>j;9K$Zz!+&<*8?2T0XhE zSYXL|W?=RsDr}a1=d0L|S%^olVPv%rnT!3&PW0bxI(fGNKpop+`P8LmVlkZNO0sZ$vp1 zp1eEFnL&ydG6mKy5C_wkibs4lJ&5v8@cSdL zL5DjRw|Ek8_q|ZLQrg}2TN$OLz^h={=`oLd-}uI~{lHVOdYDS#RIB1-_{wHxbghO_ zB6ZMMwu|8PT2Ju`M!o&30Y%e|MhU$bZ^muDD}JVgk&jU*&2rfo3A30ui83h6;J>Lu zA^2S|tNePZ2BWZCtLV+hW#QZ*9Hgv}^k0fV8|jxy?d*3>(ER|peXwT}w0*&@5YDsL z?TOt@EsS7c+twsB{4j%U=}~-(Ry?#EBkPD-Em`nv?r31Ow3vG>-s>GFI2+H~#cEym)@+zs{+<=$&k?w$_7#uS zR<;bB;cxeG5lj}Cb^nLd$`^)mdb$_3>gZkE9v(_x7jW-Eny#m$cTo_wt0ij)jyjOu zhtO4rV}PVBtaAI8iz4zJmcDXcy32wujqy?7PW$A9LHng~XdvIr0K0huxexx9@$%r$ z13?c6Z``~w{n6+CX!@Ps`M+Dl`x^iCzwvXtD(@pRP5V~&uTEbWW69b8Eu1|fv@f<&=5p0P{Gh2#7s4_MLfvch zy^IeI_NT9Z{cF=FKl#rkdEdj2|M*{>euRUXy(?GIq3os2wzx3rP1VZR=Iat>)9x52 zHnALcGfRQC8Dpk~iXZZO-uPTL5z${;yz%B+)9?P??@cei{0jLhv%KI}zT0-YC5Bbt zm$B<)g&6BJQZtO{Wq{MUp=qvH3LWk2GNeeWn(0+lm9HblSGq_$8QPAU>5#Hb_{=cN z^uTp~{K02_aQdmA`l;#4?v5tI>|TQ@lT=FYwpshvSHJpI4yFFt+M!f{@57f*xOo8R zD=(Kp89cPwEMLNu$SrrRH_EzYtA8oHi%n;{TEDV!a&z6nrj0k^^V>z*ThqhW zIMm`ISi5GO<2soCr7Y?wSI5q;f8!g|Z~f+PPJi-+FUWo^{MnyfEHwYc!$grmpHo-eOWR$fr0?S3$VSVp3V{yz*2wpL~Fwg2Atz zoMdra%#5@xvGUa0Fkqx|GE`oP%t2dQEP!b;39bpc4XCF$`+vZwcUcK}Kr?H-VPI6| z4&T8QUtEP%F#h91>N8rT#(i>%2%PY$;AbAs!@2e#=e-T!vp=EEgO4PNPExc9a~AY$ z2d^Enw+T$zQ4t72y2Ixq3#JuK8^n&_WxYd9_CJGT3koT2#fc(2H7afxu!%=eRVX6` z$da7dQ~0o1d;A@7m6D2EJzur7yt#HK3@+X5n8`+uO3JJ)RRm3s6|dZ5|J82f~sY#|&w z^lf$0-d<}-$B*F>Z$P?!`Ddr?eM$~~Z@TfN=Xw3-Q`3zre{(v$%swzUIdt-nDklcy z`=A+GImC|+ZlDupS>P`(@Nb^6r@Z@A=^;-(t*2=V+;|t?w)XlfLmfcUi0l*y8=p%` z|EZ@OCE?KK3re)d7D}@61By1qq2qf4C!Pi^MqZG-;k4R4)wU(Ym$(+(I(j{_Pgfp= zXu;TA`kC@n2c}?@dHJYLIVc4_FsWu-hyq8`+0Cy_C$D`G6y~LeKQJBdeU!s{_MhU5 z=sa|kyk%Lve(J!FUtDa-7OE?NjkcmoS9aTFx?kBK{Ih$nTMv-W+!9BIMi z(c^?!#g}*O4N2e9!WG^_zm;7yt1^p}|G@f{xm5%M4AY|OBA`XKJ;Fs#^8SXM?Ib%7 z@&v0_r7FF8qXT*dKzw1zdU$B;fey<8=oK%Tce*V7z#=C=j$`JX|E1#`Eu5vs;z~?< zqd0&iBQVkyE*O59FP-X8a&RN6u|!!0E#eL-15fB``|>Ag8=S}GrA!u?PmJ70>6hrB z-%{w|n@`&dqi+b8b~X`x!JWmz$DphFX`TIH18u5YCpl>kx%#qB{vo1$q+IZ^qvi3d zNLX#IMF2~`QdZz?_fecNO*S4T#>WKk+9rz+Vx_a5amuTo5YTuL65(B#1(rHbB7KTO z1BVfb3^HUcyYj$jWdM`Vke5Wkurp*sCM7HyA?h8&r(2Kn&gDmdV2e2yxpWl}Ycc>e zRE#eQasdjYI2C*}!0~i*I=T6+X_vbd^)&0L0jAu@e2Rh{3Q3g-%fO%!Y5+{<62}JO z&w-&DNLbT42RdpmjW7q(T{g;T*j}6mm*S#ZdXxc>M4H-(`jSPW2$h1F!AJ~yclC%@ zP*H}g8g|;+lCA7h&~ti-D{onTzlN5tVs%s4rH+))CTa6K>H(Z>Je&jT#A2;`^^MNm zpSU=bycxJ6KN?U}n`YHf({{rr;XJ_rp5jS>7!&#bOfti7al4!uTr*J5Ox!@bC$O$_%UbJ?Ssrfi{~gobe%YmjX6 zX478Qr}g58HqSgp#A%t_hIySBygG4TrhZXngUMvr|7lpacmGZMKq^;j3b^`%lD|&_#(d-^1T zWid)=+j6$`Y==%rL45Dx zyHXZ5e7P8}JNNLl0qAB*1Tf;`+M+}Ia>tf;+Bj)qQT0*zFUzx`$D%BUf%YpDw7uMX zw9dGn`b*5AVd5P8)!|^M?$SlB8BV=A`wH68ecbFgKrc5u8}*}XPVYYeM2 z`eExz+ZL5x7LI*nLKxTi~SRJ*^@}n&;%2%EGt2rNV(U`P30=BixzJ`V= z*FL!mKK_Qy0NqCh4@v%?fB7#9@85pklLdbHKm6tC$A0X`W}L0u2vPlB`?gQ@7~oTB zU;N@1-<88Zg?ReuADpi6G?<5d%b*-zpq)K<{L2c2S&AW zf0)vX4ujiQjXk6@emBA~bIktDeV+XAntv58;^&i>`tiFJ9Pb^EeVW&KDP!-5mxp~m zEtmY}K_Id@Z#wQS$8G1i%zp^(CXaWR`!opd7TfB{Zf@(yeS=2E4e41%tWB&F#@6U{ zoizH;LZ0=SyA}VYqfU8ZB6O-fJs5OPGaH_+*z8kY+$e80by@GBkNUM2fK& znFo;Nst2L+;Lig94;xVvT;w7xj@FWPUPG!4;JFhZ#0E5QG4Nt)xbI z`KSN$^x(tfpZQ1A*^W;wjss-y)KzRlY^`yJPCdQ}P}fMv%Jt&u>z|pf9DIH{ zeDzuS+Wz$NAHF@k?-%}ay@q>M$#WC5Jvxjdi8h7z{^8f^>d7OyvaDB zKYG?3?=9Cr17@cBJDb8)k2rlMzCZew zby8H&=n6pui0w!kTE}D*0=VoO*bkHo{39I0exe<} zwsTI3Eb!0oC|id!Yub6OMW)tJMH7e$;N)CM4$!gvS_f8ep%H=f0g!T2g@z}fA$ zyBvKe%iA$+8%tS#(Fi^<%7L=#wxG?vC}j~yG7Bh;BvAy(pcPIoA~gag%7kJe!qC8W z@ESl&!y^~5DlvF%`P2$8`jQoeE`qery@Z;?;Eil&JVCg7?IS#T$+R@+D3cAVhQ+3g zuM7fZuyn8jKZlpZ;$~1tvG6v(;5u7TiVl_oDCN|LgMiCW{A$2ZNAU?D=mfN|tf8YU zCPukX@L%Pt4wC{;dV`lV61uTNe3T`UneJ;)?nbDR<+rF-&oq~n-$&_|uj5UdC~5|Y zJIEY;fw2>-cyQVX1NRnl-ht+_I=+7kf%Y2P-Tp$GIQY=u)igGAnm_H34xcs$4~28L zrA-+570Quw4&7Yf|UP8Qr6;uAy8**}IInuac9|A%t?(8tV+!L9V}Pe~dD zQuaar)Jt_rhRC(S$lmB3U+em6*M=T#oDL?kcDJ)_272qThfG)WRq3J8ysRkM^*!%SiPI=zB>iBvu zK|SWlRhtcoA{X-6g4$ahGq>nZngKg#YVm~-KD3yq95JDR=9<8HS*eBb z_g`EC`c$HM1(ruG;z$R!X!V7-Wx~wLl1!Q9i;wW;`C2PyR}EZW^T})>42OGe0DAb> zAD{AbL(;=OH{pzrjw+u6K+8A!{0}^}H$C=h2WAA-_qwDzC`#V?R7k>V|JhA5h z^v=S+`u*3YS6;7!8Tq*Zzt5(2zecX@r7iTo#KTsdZaZzpvAbevSNe>mRu|X%acX1z z5ZzqI>y}>V`Gik?vnTNX_Um3P;6bjhZq(v#Zfp09x3q)S@A07h?Uh$v;Q;VYXEq;v z`s(ztf5*3=+Sh5WA-#ipt)_*^zb?HN%%-Y&#`^+vH z=k|+EUYYdO=bwLm`qXd#_Vm(AFRiKbGaq|&`d|NtpPrt4;>z?7{)<1De&bW$O8vk7 z!#~V8^K-n0^1%n$gd}7`37U^T_W1PCkA8G|mL~!4C3wjA0owHG_w7wjGakSH$-VG> z>OH&DzxyAbo&J|kz8JD!`O25`dxTeZcc-s>D#XyOy7C!aC-4u`_oI`Ihelw0#7Nwcr$5V5qCGiCjfnYXpcV`hX-Qj zD$?=U5$iKuE|^cM{MY~Fho`H1Zh78YxXHT}|C|5*OEZ%5muljV_bdEK>!|PU``OptdPrmO5GBf!4JJ)Qy zpahv1!<-y=L?*ARGS3c`zb)r_&xs@QB1g|Z&c|T@fB9tpgbr(;Rbk3cPDH=00$0--_7_n!diyCxP@;&|?SFxxxg`*Xv#9QL$5YqU9^i@vLxUkbFKM zdkLk!*SQbi0U!HA*Bpe>1g-(ypg(|%hn#)Wkrqdz(0u^>2iS>|cQ$+BjhV3zn~3g~ z3W@yMA-{zNO=ktov^_S>axLdTR{v>V*D9e0UYX4PWt+>rY^Kdk*PNn_OEQWmLgmhLeAQrYHfslYMpn{F6hBl_8ILIKg^ae1 zZ4ets8~yD4+C5LE4Owzv1Kqfn^eyM3kD0J-;yY#u^7RT-6FWv7v9=aBV;6P`-k=TG zT8Q|eQN`+$Hn6O5l5RwFPFt2>fe}?ag|aOn64@=cA`w!?5wRu4oOxIskU<|9JP2YI zmfwr+n^ipY)&%Ld)&f>-4(=>Cco0{VBgU5aWswRWNKF0$ZTW54eph*bvCjTC8WkvI zA@Ef;Mh5eK@j13%=8sw!I(%3@)C9-tPl_y00PfPxbaLg%>C%;_a&V#?J;zl03aFEW zv*hM_H}p4cr(BWBIvCY!79DFnq@z&&vA2Gp-7P~h?P)Rsl)s!X*4VTbdB1g^OU9U# z8&XHTdwcq!#bs0IQF#RdmP#k~Q~`pv$l)gCE%PPz)*t4r4Lkc^V3YsN>F|UDK>bx8 zg31x&ll(k1sF{yEv@9#y!f`{TQc!m3ghSQWe|I`N{PXGX=JvGr-5gVdofJT0cNgtb5CNiYODV@$P; z9Oq+4>xVAV&<`^Ah3Egr-n#&MmfZDyXXZZUwX+XtSNlTR)h=SSVr_&J2*wbLM`5Tq z@uOlpL1p6t6)rz21(8cJNla`+5<3tI7dV&{Re&EP4lc*C^KcQQC^7|FAz>p&NUPVr zwbDwfm9(?-xcAPz`Fy^=?(;wY|GjtS&fJ;Vnf3I&|8u&3{p;VWf8D1~_vv%WF#x5i zZBw#R_xWId3YOrMo8>BlL3?K*5|Ubfi8KG{Q><=%P~FtCK3xJ(Va$^N2Pr9o*B-O{ z6v8I-S5Ve|Dmtk+xLzyl`>aPrvwo}(-Xy6o*f<^uPx9d1z+q%xCtN%a(ycx=0Liz| z)94dS4{AplqWW*#b$RuqG^fny%gke+dudLDlHLt!b*~ycMA#JG=>QbJbjL4^WdaS$t zw6z!#bzan(AcYLc2wv4s)r0=&f_<{3gOJv#e+Ovu+DRE*%=eYnOX!#fSje-!oJZJV zvM9c+f(WfGye7+7UssR3#?|uLi=Vp){myWF8d=p@J?osJ^v^tkVOeM`DFmI4e0-~x zG8~|fbvHcyzbK&rnWN}W6z>D1(@gS=uqs8FGz zSw8qw5pe)02Dsq?tQxDSS+L@pe*mmJ=}XsR#rW>Q60aB)Difg5s29X|HBb_P zTn%khIJl8lBZoYPPCwDY4ZjArY{_73d+73MOKUP0aP@$%9b;rrOu}d(;E@Bo3K1sJ zs1!|G*1~C8uI$yyayon9MeNNbev?b~0#8M{W7a8VAdj zEV@0umvhVjv1S~_vV|CWR)lK&_CoUFal$eFI{Ivg3HMj+Uwhe#(vEwjBDJBn1>1fD za5B$UC#=VbhEBti8n(TlK+*JX(&0ZWl_wGDLX(p+_5L-xg}iXsci zC18oRb>=y&aFVCR?u@OyI2*S6@Apf8U0E8%>EsFqkn}Ory0+9m@G}MeI1;qZan)(M%9gH z##q?heslUWzo(rDc7l2u-o=D`$uWiQJ^lml_}$?j{?n&ZKt88WvjFJA29NhiH7 z`^0mfNX{7}^t8Tge0nynopM7=M0=1V&8=g`&Rze~Q6bc~Uh!8`3&L)^VR`ry-+hPC z>tP2Atg*}FSKd{1XtwP*i&H*mfj!gD=wS9y9IfZ_JK8_~FR;g*|MhMSMCuyD9E967W!tgiAJ<6Hnk;+%(f zzWsr50r0b*{oL>ruPb!{@bM>}7|Z?mUwI&lha=!T5zV1LoLSo(UOc%meB}h+iT(2W z@Z&%8iQ(6O;|pWyuX)|;@{PMS7XIU_V@^f7ulBPGfcj1kF8=+uS8-ho%xekPqC5a-dlQd=*gBVrWf#r}fIQM(JbTC$2izJTI#1|*o8vcc zihV6&=8iz~l9Xq7$O~F)&$$l)Jur)hKILdz8UHsL($1tfgR>WTPAA_AWbO;hOqP1} zt9hkPtYq^jZNHbd#f%`$H~7lqn{y7c5b8o5-Flw7@Axh#`pxJS@Eph56ZznblkX}> zH-tRc2D}aIscjrX1{;RFJge-4o>{z72=Z-NNXkJwmfgTiUPB=zNBu;4gwQp&LSn+= zPh`u#XL44S>N8DDGJ13;Sj!7-6w}_;W99+T+1o+>BeRM+;cUJ(w4Ta$0B98CCZ-Th zgJ7#5iX30lcGB}@idrh zS<>&si)QhYS9pfM`qms}CzH9<$l4*`*k(v(LRhvY3>vEk;lu?wPSsYKsf|8ll93wh zWdW7$+Q!9);xRKu5tf$XIPok^Zds@|iNS-v@nP#mPubR-{U><8=)IhaLxn9ZeiCeU zo?b7^Dd#2DZ0qH(Mx8}LLwJ8S;z29+6%K9dw~wc%w4H3XJt|rJDiO>Q7_`G&+TdYG z^|D`y-zk@YGVW~DQVts=k-kTzrGu{3UO0yyi&@$!jZ8Vg(a!p$sOCXKxJB(Vg#<>P zuaJyfw zCs}}97UOAq5`><%U)nfD>cp^m=hqEK?pSAhx;7lXfn9&kKQk=7f=_Q*UST*NfRSqo z@lh1Z=N34-xUX!6gWMB~ZyWJVQ(0Uk?E?}TBla*KJ?)R3CyGzQKvgqe5L*$)aN--P z{!JGn>BrU}L=Mu?4_v?FT0tJz89w9vT@2C<16>f^(Wg$6Sc|iYHb2m zz6g6T&IuQ*=Pp5K**c1-sL{PI=v5XuEelIYB2v??N-3;Ey z_W~wzIve8E5toxHK?-w>KE=`kq?Im(Ni}B4nI5{78cgEkmB5WG6$uq3HiTLyDfO;b zgzO4=772Ck1H>Cz#dCkC5> zFHyY96N_2j&^^VUuhDfSUf)Q&XbzhCvk{9);qrfEv|ta4EaAnl6KoM@mvs6k<$<*q za~@@guh?mHPPxEN9c&j``v*rsEieDo<0{Qa?3)^cwsyk zhsmt%MWk!`pl<5uLY#i4A5;~zBR&u}M9bu)U%^kTGcv3O?VWh)Q6FM(tuN&_Tl_10 zajXCH^{i{`HpznRWwN66?T(f;UV+ya_HrW-UFqRCPvJ>(*WF=SVT_CGQ-=N#x6jK% z8=-|C3M0fGdZMn$pEA@0zusBF#i+mg-~RrdynbG=fIc$60EmySoh~2M-k4gP*qC_l z6FmF+&qp44WTbeTK;n3xts02Z+*{5 zUO)Gthl8{i`{eTH1MG4*Xg=~f%kld4>%a0% z!`FTH`-VrKtTMmJB9yzi9(?fi*%4U%#@6u4SH2=UDxc-sdRbr>ha?5PDJ_J#~a-7^ljgK>jhC&rb8@3`g0Ng&R13ObtfZRxbemt2fq=i ze!XAqdHrmj!LvTQxC3xMJD@v{m-9K-Eqv9w%&vF*jei!0sb3V2?{FQ;H;u8ei()=l z>UGKfxZD47*+~Arrg)j(LBWkCNSot&>v%uc+6Y(I z(Oj3IS@#6`4Hp-%vT#UQ`RP)Q-{j?_y$@M={mG{)CODEUI{IMwq37@n4{0Hr^EC+S z`0oTOk~JadxKz$g%GnQ7z|aJ6?C3yRYGRpo!RZCc90#6-h?Hlsj!fsnHjy=C7*smR z8@W9fiRy}=lY4Bb0#^oKS1*H1io(%+Uooa19Kf#bW;6~KlZeujAbHxwu?aew9|UM= zEpo{h%Rre13liC>2hT;S&?ZMIMD+=5uhGbjVzDc__@1PdqT_)cRDFjt&vpTCU)Ngp0#oGjt1z%!MwK^yFz6 zZ6qvq6e>lTi`1bY=o``md{%!Tnj*9v-eE~)`&~7m`k&=yQd&;_QdTF^#>J3L&M8YN z617mJ&q*sJIaH{(4V9mo?-+IrM0Jf`M1Qi|_tl>YtaLJV0YM=`yRt?SE{JcCafDy+ z@J#=m%s#7N(CTfvd=MrB3>&l~z1VTaReRSsj$i zh&#j#p8QT%Om6!n&E=Ca@?oKkv*Vb&9v1%Pr{ob|+q`Kwd&_r1joyGVW`+$3%cvXw zp(#(aio9SU>n1ee2jeV?EFVUeL&H}d`S5VV?O!#VIdO70xqRDj{E&S-e40!Ui9K!0 z>HDl-nZS636}0|F0eOTjXE|3tBd%hxXbgUK-i02xxXLO9Jskw~z+P1uP>_7_P)A}# zwd;#)9ba5SZ@=o@=Z>_Ic=i|GTU%H9AFRVlM&1o+G<`MK3>!dTQVq2v)lWGRh-dGyQjAXhu=a(iWB5hrxzAT1QZ6xJyGU~Wkl zwE*V_Mq~=yT>iCtv=K>!0vAh?`XJ%}uT0a1h8iB~nRcVyOehEE^2^fAGFch}o_ZlI zNpYlQdD}zeRu(8LSI>*A!dqLgUop?Q53vurLauQMDGA}+#Y)qKu=qdY1`2sCU2bhH z;}CHyhisa=w@Z!X8riyZ!7m-dAh-&XF^aS-=ax+;O=pO<-2hk0Boq=nt-b&UO;i;;eDa_cK}^virV zfQu_cXMWajfY~n0^A!!*I&1}|2dKQuQ3JNo_y%I6Bc@}uJ&a8~ZA__VvXHn8q0>)m zgudF+am85cxbU;QQioTKt+JaV&vKOA6eK94L_I}m+qcPt>QTBqJ9Pd$BG1~=JVM$= zY}VSHQjESwant$98l3cX!pPI6a?rxYd9k-gf3=?!xml{} zvkB}#xK~HdHw*A+D--E<%mBIC5C|67hb`hKjf6FqF~N>x_sK}PrvV=E1sb0p)b{#p zoja(*^=cpvzN&SbjO}?!XNS0Us;j#LOSHmvc>)=_4pi;K)6W~nmd0oOei3xC&(QP6 zbKuAd6R#h>(#yrCO!krI1eUM$bV08#{PpwV&cE5hA3HH9W7?k+v-)}uy?OQYwSLx? z?yOo{cX6e9-)h(8V-AS5XX;+%t$5Dfyv0wjm1kk8x74xq0giP*mgi0Df;uW#osDM) zAPbO}D-;jD0m!RHy~%eBn(t_GwtWf9&41F230qoU>~YUMowFT;|JcSMZ>*MAz&XAJ zU{HVK{&V&fmdbKHT$}~cZn=S5KftS9wLif&pX*cN`d|6mGtWFTJo@OTgX7_^|L_B2 z{9+qTFwP@PpY=+3`I4 z8svZS^Z(B9#y9N#TGdsy@qFN)earCRx4(Dz0i|LO09#Ny)R5B